GLFW-OGL (empty) → 0.0
raw patch · 48 files changed
+17089/−0 lines, 48 filesdep +OGLdep +basedep +mtlsetup-changed
Dependencies added: OGL, base, mtl
Files
- GLFW-OGL.cabal +104/−0
- Graphics/UI/OGL/GLFW.hs +1037/−0
- LICENSE +21/−0
- README.txt +120/−0
- Setup.hs +6/−0
- glfw/include/GL/glfw.h +486/−0
- glfw/lib/enable.c +295/−0
- glfw/lib/fullscreen.c +95/−0
- glfw/lib/glext.c +201/−0
- glfw/lib/image.c +629/−0
- glfw/lib/init.c +108/−0
- glfw/lib/input.c +280/−0
- glfw/lib/internal.h +210/−0
- glfw/lib/joystick.c +101/−0
- glfw/lib/macosx/macosx_enable.c +42/−0
- glfw/lib/macosx/macosx_fullscreen.c +126/−0
- glfw/lib/macosx/macosx_glext.c +52/−0
- glfw/lib/macosx/macosx_init.c +194/−0
- glfw/lib/macosx/macosx_joystick.c +50/−0
- glfw/lib/macosx/macosx_thread.c +414/−0
- glfw/lib/macosx/macosx_time.c +112/−0
- glfw/lib/macosx/macosx_window.c +1281/−0
- glfw/lib/macosx/platform.h +349/−0
- glfw/lib/stream.c +194/−0
- glfw/lib/tga.c +405/−0
- glfw/lib/thread.c +340/−0
- glfw/lib/time.c +83/−0
- glfw/lib/win32/platform.h +474/−0
- glfw/lib/win32/win32_enable.c +155/−0
- glfw/lib/win32/win32_fullscreen.c +317/−0
- glfw/lib/win32/win32_glext.c +85/−0
- glfw/lib/win32/win32_init.c +356/−0
- glfw/lib/win32/win32_joystick.c +234/−0
- glfw/lib/win32/win32_thread.c +511/−0
- glfw/lib/win32/win32_time.c +146/−0
- glfw/lib/win32/win32_window.c +1714/−0
- glfw/lib/window.c +727/−0
- glfw/lib/x11/platform.h +415/−0
- glfw/lib/x11/x11_enable.c +51/−0
- glfw/lib/x11/x11_fullscreen.c +524/−0
- glfw/lib/x11/x11_glext.c +69/−0
- glfw/lib/x11/x11_init.c +275/−0
- glfw/lib/x11/x11_joystick.c +371/−0
- glfw/lib/x11/x11_keysym2unicode.c +902/−0
- glfw/lib/x11/x11_thread.c +507/−0
- glfw/lib/x11/x11_time.c +154/−0
- glfw/lib/x11/x11_window.c +1746/−0
- glfw/license.txt +21/−0
+ GLFW-OGL.cabal view
@@ -0,0 +1,104 @@+name: GLFW-OGL+version: 0.0+Cabal-Version: >= 1.2+license: BSD3+license-file: LICENSE+maintainer: none+stability: provisional+homepage: http://haskell.org/haskellwiki/GLFW-OGL+category: Graphics+synopsis: A binding for GLFW (OGL)+build-type: Simple++description:+ Provisional port of the GLFW-0.3 package to 'OGL'++data-files:+ README.txt+ glfw/license.txt+ glfw/include/GL/glfw.h+ glfw/lib/internal.h+ glfw/lib/x11/platform.h+ glfw/lib/win32/platform.h+ glfw/lib/macosx/platform.h++Library+ exposed-modules: Graphics.UI.OGL.GLFW+ build-depends: base, mtl, OGL+ extensions: CPP, ForeignFunctionInterface+ if os(linux)+ include-dirs: glfw/include glfw/lib glfw/lib/x11+ c-sources: + glfw/lib/enable.c+ glfw/lib/input.c+ glfw/lib/time.c+ glfw/lib/fullscreen.c+ glfw/lib/joystick.c+ glfw/lib/window.c+ glfw/lib/glext.c+ glfw/lib/stream.c+ glfw/lib/image.c+ glfw/lib/tga.c+ glfw/lib/init.c+ glfw/lib/thread.c+ glfw/lib/x11/x11_init.c+ glfw/lib/x11/x11_window.c+ glfw/lib/x11/x11_joystick.c+ glfw/lib/x11/x11_enable.c+ glfw/lib/x11/x11_keysym2unicode.c+ glfw/lib/x11/x11_fullscreen.c+ glfw/lib/x11/x11_thread.c+ glfw/lib/x11/x11_glext.c+ glfw/lib/x11/x11_time.c+ extra-libraries: Xrandr X11+ else+ if os(darwin)+ include-dirs: glfw/include glfw/lib glfw/lib/macosx+ c-sources: + glfw/lib/enable.c+ glfw/lib/fullscreen.c+ glfw/lib/glext.c+ glfw/lib/image.c+ glfw/lib/init.c+ glfw/lib/input.c+ glfw/lib/stream.c+ glfw/lib/joystick.c+ glfw/lib/tga.c+ glfw/lib/thread.c+ glfw/lib/time.c+ glfw/lib/window.c+ glfw/lib/macosx/macosx_init.c+ glfw/lib/macosx/macosx_joystick.c+ glfw/lib/macosx/macosx_thread.c+ glfw/lib/macosx/macosx_time.c+ glfw/lib/macosx/macosx_window.c+ glfw/lib/macosx/macosx_enable.c+ glfw/lib/macosx/macosx_fullscreen.c+ glfw/lib/macosx/macosx_glext.c+ frameworks: AGL Carbon OpenGL+ else+ if os(mingw32)+ include-dirs: glfw/include glfw/lib glfw/lib/win32+ c-sources: + glfw/lib/enable.c+ glfw/lib/fullscreen.c+ glfw/lib/glext.c+ glfw/lib/image.c+ glfw/lib/init.c+ glfw/lib/input.c+ glfw/lib/stream.c+ glfw/lib/joystick.c+ glfw/lib/tga.c+ glfw/lib/thread.c+ glfw/lib/time.c+ glfw/lib/window.c+ glfw/lib/win32/win32_window.c+ glfw/lib/win32/win32_time.c+ glfw/lib/win32/win32_thread.c+ glfw/lib/win32/win32_init.c+ glfw/lib/win32/win32_fullscreen.c+ glfw/lib/win32/win32_enable.c+ glfw/lib/win32/win32_glext.c+ glfw/lib/win32/win32_joystick.c+ extra-libraries: opengl32+
+ Graphics/UI/OGL/GLFW.hs view
@@ -0,0 +1,1037 @@+{- |+ Interface to GLFW - An OpenGL Framework. ++ It provides an alternative to GLUT for OpenGL based Haskell programs,+ and currently supports GLFW API version 2.6 <http://glfw.sourceforge.net>.+-}++module Graphics.UI.OGL.GLFW (+ -- * Data Types+ Version,+ DisplayBits(..),+ WindowMode(..),+ WindowHint(..),+ WindowParam(..),+ VideoMode(..),+ KeyButtonState(..),+ Key(..),+ SpecialKey(..),+ MouseButton(..),+ Joystick (..),+ JoystickParam (..), + SpecialFeature(..),+ TextureFlag(..),+ BitmapFont(..),+ WindowCloseCallback,+ WindowSizeCallback,+ WindowRefreshCallback,+ KeyCallback,+ CharCallback,+ MouseButtonCallback,+ MousePosCallback,+ MouseWheelCallback,+ -- * Initialization and Window functions+ initialize,+ terminate,+ videoModes,+ desktopMode,+ version,+ openWindow,+ openWindowHint,+ closeWindow,+ windowTitle,+ windowSize,+ iconifyWindow,+ restoreWindow,+ swapBuffers,+ swapInterval,+ windowParam,+ joystickParam,+ -- * Event Handling functions+ pollEvents,+ waitEvents,+ getKey,+ getMouseButton,+ mousePos,+ mouseWheel,+ joystickPos,+ joystickButtons,+ -- * Callbacks+ -- ** Window Callbacks+ windowSizeCallback,+ windowCloseCallback,+ windowRefreshCallback,+ -- ** Event Callbacks+ keyCallback,+ charCallback,+ mouseButtonCallback,+ mousePosCallback,+ mouseWheelCallback,+ -- * Other functions+ time,+ sleep,+ extensionSupported,+ enableSpecial,+ disableSpecial,+ -- * Texture Loading functions+ loadTexture2D,+ loadMemoryTexture2D,+ -- * Text Rendering function (not in GLFW C library)+ renderString+ -- * GLFW Thread Support functions are omitted purposely+) where++{-# OPTIONS_GHC -fglasgow-exts #-}++import qualified Graphics.Rendering.OGL as GL+import Graphics.Rendering.OGL (($=))+import Foreign+import Foreign.C+import Foreign.Marshal+import Data.IORef+import System.IO.Unsafe+import Control.Monad.Trans (liftIO)+-- | Version is represented by (major, minor, revision), used+-- in gettable variable 'version'.+type Version = (Int, Int, Int)++-- | Bit depth of GL display buffers, used in 'openWindow'.+data DisplayBits+ = DisplayRGBBits !Int !Int !Int+ | DisplayAlphaBits !Int+ | DisplayDepthBits !Int+ | DisplayStencilBits !Int+ deriving (Eq, Show)++-- | Window or Fullscreen mode, used in 'openWindow'.+data WindowMode+ = Window+ | FullScreen + deriving (Eq, Show)++instance Enum WindowMode where+ fromEnum Window = 0x00010001+ fromEnum FullScreen = 0x00010002+ toEnum 0x00010001 = Window+ toEnum 0x00010002 = FullScreen+ toEnum _ = error "toEnum out of bound"++-- | Window hints, used in settable variable 'openWindowHint'.+data WindowHint+ = RefreshRate+ | AccumRedBits+ | AccumGreenBits+ | AccumBlueBits+ | AccumAlphaButs+ | AuxBuffers+ | Stereo+ | NoResize+ | FSAASamples+ deriving (Eq, Show)++instance Enum WindowHint where+ fromEnum RefreshRate = 0x0002000B+ fromEnum AccumRedBits = 0x0002000C+ fromEnum AccumGreenBits = 0x0002000D+ fromEnum AccumBlueBits = 0x0002000E+ fromEnum AccumAlphaButs = 0x0002000F+ fromEnum AuxBuffers = 0x00020010+ fromEnum Stereo = 0x00020011+ fromEnum NoResize = 0x00020012+ fromEnum FSAASamples = 0x00020013+ toEnum 0x0002000B = RefreshRate+ toEnum 0x0002000C = AccumRedBits+ toEnum 0x0002000D = AccumGreenBits+ toEnum 0x0002000E = AccumBlueBits+ toEnum 0x0002000F = AccumAlphaButs+ toEnum 0x00020010 = AuxBuffers+ toEnum 0x00020011 = Stereo+ toEnum 0x00020012 = NoResize+ toEnum 0x00020013 = FSAASamples+ toEnum _ = error "toEnum out of bound"++-- | Window parameters used in gettable variable 'windowParam'.+data WindowParam+ = Opened+ | Active+ | Iconified+ | Accelerated+ | RedBits+ | GreenBits+ | BlueBits+ | AlphaBits+ | DepthBits+ | StencilBits+ deriving (Eq, Show)++instance Enum WindowParam where+ fromEnum Opened = 0x00020001+ fromEnum Active = 0x00020002+ fromEnum Iconified = 0x00020003+ fromEnum Accelerated = 0x00020004+ fromEnum RedBits = 0x00020005+ fromEnum GreenBits = 0x00020006+ fromEnum BlueBits = 0x00020007+ fromEnum AlphaBits = 0x00020008+ fromEnum DepthBits = 0x00020009+ fromEnum StencilBits = 0x0002000A+ toEnum 0x00020001 = Opened+ toEnum 0x00020002 = Active+ toEnum 0x00020003 = Iconified+ toEnum 0x00020004 = Accelerated+ toEnum 0x00020005 = RedBits+ toEnum 0x00020006 = GreenBits+ toEnum 0x00020007 = BlueBits+ toEnum 0x00020008 = AlphaBits+ toEnum 0x00020009 = DepthBits+ toEnum 0x0002000A = StencilBits+ toEnum _ = error "toEnum out of bound"+ +-- | Video modes used in gettable variables 'videoModes' and 'desktopMode'.+data VideoMode = VideoMode+ { videoWidth :: !Int+ , videoHeight :: !Int+ , videoRedBits :: !Int+ , videoBlueBits :: !Int+ , videoGreenBits :: !Int+ } deriving (Eq, Show)++-- | Key or button state.+data KeyButtonState+ = Release+ | Press+ deriving (Eq, Show, Enum)++-- | Key is represented by either a character key or a special key.+data Key+ = CharKey Char+ | SpecialKey SpecialKey+ deriving (Eq, Show)++instance Enum Key where+ fromEnum (CharKey c) = fromEnum c+ fromEnum (SpecialKey c) = fromEnum c+ toEnum c | c < 256 = CharKey (toEnum c)+ toEnum c = SpecialKey (toEnum c)++-- | Special key is a key not represented in the 32 - 127 printable ASCII range.+data SpecialKey+ = UNKNOWN+ | ESC+ | F1+ | F2+ | F3+ | F4+ | F5+ | F6+ | F7+ | F8+ | F9+ | F10+ | F11+ | F12+ | F13+ | F14+ | F15+ | F16+ | F17+ | F18+ | F19+ | F20+ | F21+ | F22+ | F23+ | F24+ | F25+ | UP+ | DOWN+ | LEFT+ | RIGHT+ | LSHIFT+ | RSHIFT+ | LCTRL+ | RCTRL+ | LALT+ | RALT+ | TAB+ | ENTER+ | BACKSPACE+ | INSERT+ | DEL+ | PAGEUP+ | PAGEDOWN+ | HOME+ | END+ | KP_0+ | KP_1+ | KP_2+ | KP_3+ | KP_4+ | KP_5+ | KP_6+ | KP_7+ | KP_8+ | KP_9+ | KP_DIVIDE+ | KP_MULTIPLY+ | KP_SUBTRACT+ | KP_ADD+ | KP_DECIMAL+ | KP_EQUAL+ | KP_ENTER+ deriving (Eq, Show)++instance Enum SpecialKey where+ fromEnum UNKNOWN = -1+ fromEnum ESC = 257+ fromEnum F1 = 258+ fromEnum F2 = 259+ fromEnum F3 = 260+ fromEnum F4 = 261+ fromEnum F5 = 262+ fromEnum F6 = 263+ fromEnum F7 = 264+ fromEnum F8 = 265+ fromEnum F9 = 266+ fromEnum F10 = 267+ fromEnum F11 = 268+ fromEnum F12 = 269+ fromEnum F13 = 270+ fromEnum F14 = 271+ fromEnum F15 = 272+ fromEnum F16 = 273+ fromEnum F17 = 274+ fromEnum F18 = 275+ fromEnum F19 = 276+ fromEnum F20 = 277+ fromEnum F21 = 278+ fromEnum F22 = 279+ fromEnum F23 = 280+ fromEnum F24 = 281+ fromEnum F25 = 282+ fromEnum UP = 283+ fromEnum DOWN = 284+ fromEnum LEFT = 285+ fromEnum RIGHT = 286+ fromEnum LSHIFT = 287+ fromEnum RSHIFT = 288+ fromEnum LCTRL = 289+ fromEnum RCTRL = 290+ fromEnum LALT = 291+ fromEnum RALT = 292+ fromEnum TAB = 293+ fromEnum ENTER = 294+ fromEnum BACKSPACE = 295+ fromEnum INSERT = 296+ fromEnum DEL = 297+ fromEnum PAGEUP = 298+ fromEnum PAGEDOWN = 299+ fromEnum HOME = 300+ fromEnum END = 301+ fromEnum KP_0 = 302+ fromEnum KP_1 = 303+ fromEnum KP_2 = 304+ fromEnum KP_3 = 305+ fromEnum KP_4 = 306+ fromEnum KP_5 = 307+ fromEnum KP_6 = 308+ fromEnum KP_7 = 309+ fromEnum KP_8 = 310+ fromEnum KP_9 = 311+ fromEnum KP_DIVIDE = 312+ fromEnum KP_MULTIPLY = 313+ fromEnum KP_SUBTRACT = 314+ fromEnum KP_ADD = 315+ fromEnum KP_DECIMAL = 316+ fromEnum KP_EQUAL = 317+ fromEnum KP_ENTER = 318+ toEnum 257 = ESC+ toEnum 258 = F1+ toEnum 259 = F2+ toEnum 260 = F3+ toEnum 261 = F4+ toEnum 262 = F5+ toEnum 263 = F6+ toEnum 264 = F7+ toEnum 265 = F8+ toEnum 266 = F9+ toEnum 267 = F10+ toEnum 268 = F11+ toEnum 269 = F12+ toEnum 270 = F13+ toEnum 271 = F14+ toEnum 272 = F15+ toEnum 273 = F16+ toEnum 274 = F17+ toEnum 275 = F18+ toEnum 276 = F19+ toEnum 277 = F20+ toEnum 278 = F21+ toEnum 279 = F22+ toEnum 280 = F23+ toEnum 281 = F24+ toEnum 282 = F25+ toEnum 283 = UP+ toEnum 284 = DOWN+ toEnum 285 = LEFT+ toEnum 286 = RIGHT+ toEnum 287 = LSHIFT+ toEnum 288 = RSHIFT+ toEnum 289 = LCTRL+ toEnum 290 = RCTRL+ toEnum 291 = LALT+ toEnum 292 = RALT+ toEnum 293 = TAB+ toEnum 294 = ENTER+ toEnum 295 = BACKSPACE+ toEnum 296 = INSERT+ toEnum 297 = DEL+ toEnum 298 = PAGEUP+ toEnum 299 = PAGEDOWN+ toEnum 300 = HOME+ toEnum 301 = END+ toEnum 302 = KP_0+ toEnum 303 = KP_1+ toEnum 304 = KP_2+ toEnum 305 = KP_3+ toEnum 306 = KP_4+ toEnum 307 = KP_5+ toEnum 308 = KP_6+ toEnum 309 = KP_7+ toEnum 310 = KP_8+ toEnum 311 = KP_9+ toEnum 312 = KP_DIVIDE+ toEnum 313 = KP_MULTIPLY+ toEnum 314 = KP_SUBTRACT+ toEnum 315 = KP_ADD+ toEnum 316 = KP_DECIMAL+ toEnum 317 = KP_EQUAL+ toEnum 318 = KP_ENTER+ toEnum _ = UNKNOWN++-- | Mouse button is represented by left, right, middle or a number+-- from 0 to 7 (note the difference from the GLFW C library).+data MouseButton+ = ButtonLeft+ | ButtonRight+ | ButtonMiddle+ | ButtonNo Int+ deriving (Eq, Show)++instance Enum MouseButton where+ fromEnum ButtonLeft = 0+ fromEnum ButtonRight = 1+ fromEnum ButtonMiddle = 2+ fromEnum (ButtonNo i) | i < 0 = 0+ fromEnum (ButtonNo i) | i < _GLFW_MOUSE_BUTTON_LAST = i+ fromEnum _ = _GLFW_MOUSE_BUTTON_LAST+ toEnum 0 = ButtonLeft+ toEnum 1 = ButtonRight+ toEnum 2 = ButtonMiddle+ toEnum i = ButtonNo i++-- | Joystick is represent a number from 0 to 15 (note the difference from the+-- GLFW C library).+newtype Joystick + = Joystick Int+ deriving (Eq, Show)++instance Enum Joystick where+ fromEnum (Joystick i) | i < 0 = 0+ fromEnum (Joystick i) | i < _GLFW_JOYSTICK_LAST = i+ fromEnum _ = _GLFW_JOYSTICK_LAST+ toEnum i | i < _GLFW_JOYSTICK_LAST = Joystick i+ toEnum _ = Joystick _GLFW_JOYSTICK_LAST++-- | Joystick parameters+data JoystickParam + = Present + | Axes+ | Buttons+ deriving (Eq, Show)++instance Enum JoystickParam where+ fromEnum Present = 0x00050001+ fromEnum Axes = 0x00050002 + fromEnum Buttons = 0x00050003+ toEnum 0x00050001 = Present+ toEnum 0x00050002 = Axes+ toEnum 0x00050003 = Buttons++-- | Special features used in 'enableSpecial' and 'disableSpecial'.+data SpecialFeature+ = MouseCursor+ | StickyKey+ | StickyMouseButton+ | SystemKey+ | KeyRepeat+ | AutoPollEvent + deriving (Eq, Show)++instance Enum SpecialFeature where+ fromEnum MouseCursor = 0x00030001+ fromEnum StickyKey = 0x00030002+ fromEnum StickyMouseButton = 0x00030003+ fromEnum SystemKey = 0x00030004+ fromEnum KeyRepeat = 0x00030005+ fromEnum AutoPollEvent = 0x00030006+ toEnum 0x00030001 = MouseCursor+ toEnum 0x00030002 = StickyKey+ toEnum 0x00030003 = StickyMouseButton+ toEnum 0x00030004 = SystemKey+ toEnum 0x00030005 = KeyRepeat+ toEnum 0x00030006 = AutoPollEvent+ toEnum _ = error "toEnum out of bound"++-- | Texture flag used in 'loadTexture2D' and 'loadMemoryTexture2D'.+data TextureFlag+ = NoRescale+ | OriginUL+ | BuildMipMaps+ | AlphaMap+ deriving (Eq, Show)++instance Enum TextureFlag where+ fromEnum NoRescale = 0x00000001+ fromEnum OriginUL = 0x00000002+ fromEnum BuildMipMaps = 0x00000004+ fromEnum AlphaMap = 0x00000008+ toEnum 0x00000001 = NoRescale+ toEnum 0x00000002 = OriginUL+ toEnum 0x00000004 = BuildMipMaps+ toEnum 0x00000008 = AlphaMap+ toEnum _ = error "toEnum out of bound"++-- | Build-in bitmap font used in 'renderString'.+data BitmapFont+ = Fixed8x16 -- ^ 8x16 fixed width font.+ deriving (Eq, Enum, Show)++-- Mouse button definitions+_GLFW_MOUSE_BUTTON_LAST = 7 :: Int++-- Joystick identifiers+_GLFW_JOYSTICK_LAST = 15 :: Int++-- Time spans longer than this (seconds) are considered to be infinity+_GLFW_INFINITY = 100000.0 :: Double++-- Callback function type+type GLFWwindowsizefun = Int32 -> Int32 -> IO ()+type GLFWwindowclosefun = IO ()+type GLFWwindowrefreshfun = IO ()+type GLFWmousebuttonfun = Int -> Int -> IO ()+type GLFWmouseposfun = Int32 -> Int32 -> IO ()+type GLFWmousewheelfun = Int -> IO ()+type GLFWkeyfun = Int -> Int -> IO ()+type GLFWcharfun = Int -> Int -> IO ()++-- Initialization+foreign import ccall "GL/glfw.h glfwInit" glfwInit :: IO Int+-- | Initialize GLFW library before use, returns True if successful+-- or False otherwise.+--+-- Before any GLFW functions can be used, GLFW must be initialized+-- to ensure proper functionality.+initialize :: IO Bool+initialize = glfwInit >>= return . toEnum++foreign import ccall "GL/glfw.h glfwTerminate" glfwTerminate :: IO ()+-- | Terminate GLFW library after use.+--+-- Before a program terminates, GLFW has to be terminated in order+-- to free up resources etc.+terminate = glfwTerminate >> glfwCleanup++foreign import ccall "GL/glfw.h glfwGetVersion" glfwGetVersion :: Ptr Int -> Ptr Int -> Ptr Int -> IO ()+-- | Returns the supported GLFW C library version numbers.+version :: GL.GettableStateVar Version+version = GL.makeGettableStateVar getter+ where+ getter = do+ with 0 (\major -> with 0 (\minor -> with 0 (\rev -> do + glfwGetVersion major minor rev+ a <- peek major+ b <- peek minor+ c <- peek rev+ return (a, b, c))))++-- Windows handling+foreign import ccall "GL/glfw.h glfwOpenWindow" glfwOpenWindow :: Int32 -> Int32 -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> IO Int+-- | Open the Window of the given size and other parameters, returns True if+-- successful or False otherwise. +--+-- GLFW applications can only open one Window, which is assumed to be the+-- default place where renderings take place.+openWindow :: GL.Size -> [DisplayBits] -> WindowMode -> IO Bool+openWindow (GL.Size w h) bits mode = do+ let (r, g, b) = maybe (0, 0, 0) id $ filterBits (\x -> + case x of + DisplayRGBBits r g b -> Just (r, g, b)+ _ -> Nothing) bits+ a = maybe 0 id $ filterBits (\x -> + case x of + DisplayAlphaBits a -> Just a+ _ -> Nothing) bits+ d = maybe 0 id $ filterBits (\x -> + case x of + DisplayDepthBits d -> Just d+ _ -> Nothing) bits+ s = maybe 0 id $ filterBits (\x -> + case x of + DisplayStencilBits a -> Just a+ _ -> Nothing) bits+ e <- glfwOpenWindow w h r g b a d s (fromEnum mode)+ -- clear font texture+ writeIORef fontTextures []+ return $ toEnum e+ where+ filterBits f [] = Nothing+ filterBits f (x:xs) = maybe (filterBits f xs) Just (f x)+ +foreign import ccall "GL/glfw.h glfwOpenWindowHint" glfwOpenWindowHint :: Int -> Int -> IO ()+-- | Set the Window hints, i.e., additional Window properties, before openWindow.+openWindowHint :: GL.SettableStateVar (WindowHint, Int)+openWindowHint = GL.makeSettableStateVar setter+ where setter (hint, val) = glfwOpenWindowHint (fromEnum hint) val++-- | Close the open Window and destroys the associated OpenGL context.+foreign import ccall "GL/glfw.h glfwCloseWindow" closeWindow :: IO ()++foreign import ccall "GL/glfw.h glfwSetWindowTitle" glfwSetWindowTitle :: CString -> IO ()+-- | Set the title of the opened Window.+windowTitle :: GL.SettableStateVar String+windowTitle = GL.makeSettableStateVar setter + where setter = flip withCString glfwSetWindowTitle++foreign import ccall "GL/glfw.h glfwGetWindowSize" glfwGetWindowSize :: Ptr Int32 -> Ptr Int32 -> IO ()+foreign import ccall "GL/glfw.h glfwSetWindowSize" glfwSetWindowSize :: Int32 -> Int32 -> IO ()+-- | Get or set the size of the opened Window.+windowSize :: GL.StateVar GL.Size +windowSize = GL.makeStateVar getter setter+ where+ getter = with 0 (\w -> with 0 (\h -> do+ glfwGetWindowSize w h+ w' <- peek w+ h' <- peek h + return $ GL.Size w' h'))+ setter (GL.Size w h) = glfwSetWindowSize w h++-- | Iconify the Window which can later by retored.+foreign import ccall "GL/glfw.h glfwIconifyWindow" iconifyWindow :: IO ()+-- | Restore the Window after iconification.+foreign import ccall "GL/glfw.h glfwRestoreWindow" restoreWindow :: IO ()+-- | Swap the back and front color buffers of the Window. If 'AutoPollEvent'+-- is enabled by 'enableSpecial' (which is the default), it also polls for+-- new events before the swapping.+foreign import ccall "GL/glfw.h glfwSwapBuffers" swapBuffers :: GL.GL ()+foreign import ccall "GL/glfw.h glfwSwapInterval" glfwSwapInterval :: Int -> IO ()+-- | Set the minimum number of monitor retraces between each each buffer swap+-- performed by 'swapBuffers'. If set to zero, buffer swaps will not be+-- synchronized to the vertical refresh of the monitor.+swapInterval :: GL.SettableStateVar Int+swapInterval = GL.makeSettableStateVar glfwSwapInterval++foreign import ccall "GL/glfw.h glfwGetWindowParam" glfwGetWindowParam :: Int -> IO Int+-- | Get the value of Window parameters.+windowParam :: WindowParam -> GL.GettableStateVar Int+windowParam p = GL.makeGettableStateVar (glfwGetWindowParam (fromEnum p))++foreign import ccall "GL/glfw.h glfwSetWindowSizeCallback" glfwSetWindowSizeCallback :: FunPtr GLFWwindowsizefun -> IO ()+-- | Callback type for 'windowSizeCallback'.+type WindowSizeCallback = GL.Size -> IO ()+-- | Set the callback function that will be called every time the Window size changes.+windowSizeCallback :: GL.SettableStateVar WindowSizeCallback+windowSizeCallback = GL.makeSettableStateVar (\f -> do+ let g w h = f (GL.Size w h)+ ptr <- glfwWrapFun2' g+ glfwSetCallbackIORef glfwWindowsizefun ptr+ glfwSetWindowSizeCallback ptr)++foreign import ccall "GL/glfw.h glfwSetWindowCloseCallback" glfwSetWindowCloseCallback :: FunPtr GLFWwindowclosefun -> IO ()+-- | Callback type for 'windowCloseCallback'.+type WindowCloseCallback = IO ()+-- | Set the callback function that will be called when the Window is closed. +windowCloseCallback :: GL.SettableStateVar WindowCloseCallback+windowCloseCallback = GL.makeSettableStateVar (\f -> do+ ptr <- glfwWrapFun0 f+ glfwSetCallbackIORef glfwWindowclosefun ptr+ glfwSetWindowCloseCallback ptr)++foreign import ccall "GL/glfw.h glfwSetWindowRefreshCallback" glfwSetWindowRefreshCallback :: FunPtr GLFWwindowrefreshfun -> IO ()+-- | Callback type for 'windowRefreshCallback'.+type WindowRefreshCallback = IO ()+-- | Set the callback function that will be called when the Window client area+-- needs to be refreshed, which occurs when any part of the window client+-- area is damaged and needs to be repainted (for instance, if a part +-- of the window that was previously occluded by another window has become+-- visible).+windowRefreshCallback :: GL.SettableStateVar WindowRefreshCallback+windowRefreshCallback = GL.makeSettableStateVar setter+ where + setter f = do+ ptr <- glfwWrapFun0 f+ glfwSetCallbackIORef glfwWindowrefreshfun ptr+ glfwSetWindowRefreshCallback ptr++-- Video mode functions+foreign import ccall "GL/glfw.h glfwGetVideoModes" glfwGetVideoModes :: Ptr Int -> Int -> IO ()+-- | Get a list of deteced 'VideoMode's, the max number of which is limited+-- to 256 for now.+videoModes :: GL.GettableStateVar [VideoMode]+videoModes = GL.makeGettableStateVar getter+ where+ getter = withArray (take (sizeOfVideoMode * maxCount) (repeat 0)) (\arr -> do+ glfwGetVideoModes arr maxCount+ filterMode arr maxCount)+ filterMode arr count | count > 0 = do+ [w, h, r, b, g] <- peekArray 5 arr + if w == 0+ then return []+ else do+ let arr' = advancePtr arr sizeOfVideoMode+ rest <- filterMode arr' (count - 1)+ return $ VideoMode w h r b g : rest++sizeOfVideoMode = 5+maxCount = 256++foreign import ccall "GL/glfw.h glfwGetDesktopMode" glfwGetDesktopMode :: Ptr Int -> IO ()+-- | Get the 'VideoMode' of current desktop.+desktopMode :: GL.GettableStateVar VideoMode+desktopMode = GL.makeGettableStateVar getter+ where+ getter = withArray (take sizeOfVideoMode (repeat 0)) (\arr -> do+ glfwGetDesktopMode arr+ [w, h, r, b, g] <- peekArray 5 arr + return $ VideoMode w h r b g)++-- Input Handling+-- | Poll events, such as user input and window events. Upon calling this+-- function, all window states, keyboard states and mouse states are updated.+-- If any related callback functions are registered, these are called during the+-- call of 'pollEvents'.+foreign import ccall "GL/glfw.h glfwPollEvents" pollEvents :: IO ()+-- | Wait for events, such as user input and window events. The calling thread+-- will be put to sleep until any event appears in the event queue.+-- When events are ready, the events will be processed just as they are +-- processed by 'pollEvents'.+foreign import ccall "GL/glfw.h glfwWaitEvents" waitEvents :: IO ()+foreign import ccall "GL/glfw.h glfwGetKey" glfwGetKey :: Int -> IO Int+-- | Return a 'KeyButtonState', either 'Release' or 'Press', of the indicated key.+getKey :: Enum a => a -> IO KeyButtonState+getKey key = glfwGetKey (fromEnum key) >>= return . toEnum++foreign import ccall "GL/glfw.h glfwGetMouseButton" glfwGetMouseButton :: Int -> IO Int +-- | Return a 'KeyButtonState', either 'Release' or 'Press', of the indicated mouse+-- button.+getMouseButton :: MouseButton -> IO KeyButtonState+getMouseButton button = glfwGetMouseButton (fromEnum button) >>= return . toEnum++foreign import ccall "GL/glfw.h glfwGetMousePos" glfwGetMousePos :: Ptr Int32 -> Ptr Int32 -> IO ()+foreign import ccall "GL/glfw.h glfwSetMousePos" glfwSetMousePos :: Int32 -> Int32 -> IO ()+-- | Set or get the mouse position.+mousePos :: GL.StateVar GL.Position+mousePos = GL.makeStateVar getter setter+ where+ getter = with 0 (\x -> with 0 (\y -> do+ glfwGetMousePos x y+ mx <- peek x+ my <- peek y+ return $ GL.Position mx my))+ setter (GL.Position x y) = glfwSetMousePos x y++foreign import ccall "GL/glfw.h glfwGetMouseWheel" glfwGetMouseWheel :: IO Int+foreign import ccall "GL/glfw.h glfwSetMouseWheel" glfwSetMouseWheel :: Int -> IO ()+-- | Set or get the mouse wheel position.+mouseWheel :: GL.StateVar Int+mouseWheel = GL.makeStateVar glfwGetMouseWheel glfwSetMouseWheel++foreign import ccall "GL/glfw.h glfwGetJoystickParam" glfwGetJoystickParam :: Int -> Int -> IO Int+-- | Get joystick parameters.+joystickParam :: Joystick -> JoystickParam -> GL.GettableStateVar Int+joystickParam joy param = GL.makeGettableStateVar + (glfwGetJoystickParam (fromEnum joy) (fromEnum param))+foreign import ccall "GL/glfw.h glfwGetJoystickPos" glfwGetJoystickPos :: Int -> Ptr Int -> Int -> IO Int+-- | Get joystick positions. The returned list contains the positions+-- for all available axes for the given joystick.+joystickPos :: Joystick -> GL.GettableStateVar [Int] +joystickPos joy = GL.makeGettableStateVar getter+ where+ getter = do+ n <- glfwGetJoystickParam (fromEnum joy) (fromEnum Axes)+ withArray (take n (repeat 0)) (\arr -> do+ m <- glfwGetJoystickPos (fromEnum joy) arr n+ peekArray m arr)+foreign import ccall "GL/glfw.h glfwGetJoystickButtons" glfwGetJoystickButtons :: Int -> Ptr Int8 -> Int -> IO Int+-- | Get joystick button states. The returned list contains the states+-- for all available buttons for the given joystick.+joystickButtons :: Joystick -> GL.GettableStateVar [KeyButtonState]+joystickButtons joy = GL.makeGettableStateVar getter+ where+ getter = do+ n <- glfwGetJoystickParam (fromEnum joy) (fromEnum Buttons)+ withArray (take n (repeat 0)) (\arr -> do+ m <- glfwGetJoystickButtons (fromEnum joy) arr n+ a <- peekArray m arr+ return $ map (toEnum . fromEnum) a)++foreign import ccall "GL/glfw.h glfwSetKeyCallback" glfwSetKeyCallback :: FunPtr GLFWkeyfun -> IO ()+-- | Callback type for 'keyCallback'.+type KeyCallback = Key -> KeyButtonState -> IO ()+-- | Set the callback function that will be called when there is a key event,+-- i.e., everytime the state of a single key is changed. The reported keys+-- are unaffected by any modifiers (such as SHIFT or ALT).+keyCallback :: GL.SettableStateVar KeyCallback+keyCallback = GL.makeSettableStateVar setter+ where + setter f = do+ let g k s = f (if k < 256 then CharKey (toEnum k)+ else SpecialKey (toEnum k)) (toEnum s)+ ptr <- glfwWrapFun2 g+ glfwSetCallbackIORef glfwKeyfun ptr+ glfwSetKeyCallback ptr++foreign import ccall "GL/glfw.h glfwSetCharCallback" glfwSetCharCallback :: FunPtr GLFWcharfun -> IO ()+-- | Callback type for 'charCallback'.+type CharCallback = Char -> KeyButtonState -> IO ()+-- | Set the callback function that will be called when there is a character event,+-- i.e., everytime a key that results in a printable Unicode character is+-- pressed or released. Characters are affected by modifiers (such as SHIFT+-- or ALT).+charCallback :: GL.SettableStateVar CharCallback+charCallback = GL.makeSettableStateVar setter+ where+ setter f = do+ let g k s = f (toEnum k) (toEnum s)+ ptr <- glfwWrapFun2 g+ glfwSetCallbackIORef glfwCharfun ptr+ glfwSetCharCallback ptr++foreign import ccall "GL/glfw.h glfwSetMouseButtonCallback" glfwSetMouseButtonCallback :: FunPtr GLFWmousebuttonfun -> IO ()+-- | Callback type for 'mouseButtonCallback'.+type MouseButtonCallback = MouseButton -> KeyButtonState -> IO ()+-- | Set the callback function that will be called when there is a mouse button event,+-- i.e., everytime a mouse button is pressed or released.+mouseButtonCallback :: GL.SettableStateVar MouseButtonCallback+mouseButtonCallback = GL.makeSettableStateVar setter+ where+ setter f = do+ let g b s = f (toEnum b) (toEnum s)+ ptr <- glfwWrapFun2 g+ glfwSetCallbackIORef glfwMousebuttonfun ptr+ glfwSetMouseButtonCallback ptr++foreign import ccall "GL/glfw.h glfwSetMousePosCallback" glfwSetMousePosCallback :: FunPtr GLFWmouseposfun -> IO ()+-- | Callback type for 'mousePosCallback'.+type MousePosCallback = GL.Position -> IO ()+-- | Set the callback function that will be called when there is a mouse motion+-- event, i.e., everytime they mouse is moved.+mousePosCallback :: GL.SettableStateVar MousePosCallback+mousePosCallback = GL.makeSettableStateVar setter+ where + setter f = do+ let g x y = f $ GL.Position x y+ ptr <- glfwWrapFun2' g+ glfwSetCallbackIORef glfwMouseposfun ptr+ glfwSetMousePosCallback ptr++foreign import ccall "GL/glfw.h glfwSetMouseWheelCallback" glfwSetMouseWheelCallback :: FunPtr GLFWmousewheelfun -> IO ()+-- | Callback type for 'mouseWheelCallback'.+type MouseWheelCallback = Int -> IO ()+-- | Set the callback function that will be called when there is a mouse wheel+-- event, i.e., everytime the mouse wheel is turned.+mouseWheelCallback :: GL.SettableStateVar MouseWheelCallback+mouseWheelCallback = GL.makeSettableStateVar setter+ where+ setter f = do+ ptr <- glfwWrapFun1 f+ glfwSetCallbackIORef glfwMousewheelfun ptr+ glfwSetMouseWheelCallback ptr++-- Time function+foreign import ccall "GL/glfw.h glfwGetTime" glfwGetTime :: IO Double+foreign import ccall "GL/glfw.h glfwSetTime" glfwSetTime :: Double -> IO ()+-- | Get or set the value of the high precision timer. The time is measured+-- in seconds as a double precision floasting point number. +--+-- Unless the timer has been set by the programmer, the time is measured+-- as the number of seconds that have passed since 'initialize' was called.+time :: GL.StateVar Double+time = GL.makeStateVar glfwGetTime glfwSetTime+-- | Put the calling thread to sleep for the requested period of time in seconds.+--+-- The time is generally in the range 1ms to 20ms, depending on thread scheduling+-- time slot intervals etc. +foreign import ccall "GL/glfw.h glfwSleep" sleep :: Double -> IO ()++-- Extension support+foreign import ccall "GL/glfw.h glfwExtensionSupported" glfwExtensionSupported :: CString -> IO Int+-- | Return True if the extension is supported, otherwise False.+extensionSupported :: String -> IO Bool+extensionSupported e = flip withCString glfwExtensionSupported e >>= return . toEnum+-- TODO:+-- foreign import ccall "GL/glfw.h glfwGetProcAddress" glfwGetProcAddress :: Ptr CChar -> FunPtr ?+-- foreign import ccall "GL/glfw.h glfwGetGLVersion" glfwGetGLVersion :: Ptr Int -> Ptr Int -> Ptr Int -> IO ()++-- Enable/disable function+foreign import ccall "GL/glfw.h glfwEnable" glfwEnable :: Int -> IO ()+foreign import ccall "GL/glfw.h glfwDisable" glfwDisable :: Int -> IO ()+-- | Enable a 'SpecialFeature'.+enableSpecial :: SpecialFeature -> IO ()+enableSpecial f = glfwEnable (fromEnum f)+-- | Disable a 'SpecialFeature'.+disableSpecial :: SpecialFeature -> IO ()+disableSpecial f = glfwEnable (fromEnum f)++-- Image/texture I/O+--foreign import ccall "GL/glfw.h glfwReadImage" glfwReadImage :: Ptr CChar -> Ptr GLFWimage -> Int -> IO ()+--foreign import ccall "GL/glfw.h glfwFreeImage" glfwFreeImage :: Ptr GLFWimage -> IO ()+foreign import ccall "GL/glfw.h glfwLoadTexture2D" glfwLoadTexture2D :: CString -> Int -> IO Int+-- | Read an image from a file specified by the given string and+-- upload the image to OpenGL texture memory.+--+-- If BuildMipMaps flag is given, all mipmap levels for the loaded+-- texture are generated and uploaded to texture memory.+--+-- Unless the OriginUL flag is given, the origin of the texture is+-- the lower left corner of the loaded image. If OriginUL is given,+-- however, the first pixel is the upper left corner.+--+-- For single component images (i.e. gray scale), the texture is uploaded+-- as an alpha mask if the flag AlphaMap is set, otherwise it's uploaded+-- as a luminance texture.+--+-- It only supports the Truevision Targa verson 1 file (.tga). Supported +-- pixel formats are: 8-bit gray scale, 8-bit paletted (24/32-bit color), +-- 24-bit true color and 32-bit true color + alpha.+--+-- Paletted images are translated into true color or tru color + alpha+-- pixel formats.+--+-- The read texture is always rescaled to the nearest larger 2^m x 2^n+-- resolution using bilinear interpolation if necessary.+loadTexture2D :: String -> [TextureFlag] -> GL.GL Bool+loadTexture2D fname flag = liftIO $ do+ r <- flip withCString (flip glfwLoadTexture2D (readFlag flag)) fname+ return $ toEnum r+ +readFlag (x:xs) = fromEnum x .|. readFlag xs+readFlag [] = 0 ++foreign import ccall "GL/glfw.h glfwLoadMemoryTexture2D" glfwLoadMemoryTexture2D :: Ptr CChar -> Int -> Int -> IO Int+-- | Read an image from the memory buffer (the given byte string) and+-- upload the image to OpenGL texture memory. The rest is similar+-- to 'loadTexture2D'.+loadMemoryTexture2D :: String -> [TextureFlag] -> GL.GL Bool+loadMemoryTexture2D arr flag = liftIO $ withCAStringLen arr (\(ptr, len) -> do+ r <- glfwLoadMemoryTexture2D ptr len (readFlag flag)+ return $ toEnum r)++-- Internal functions that handles callback function pointers+type Compare = Int -> Int -> Bool++glfwWindowsizefun = unsafePerformIO (newIORef Nothing) :: IORef (Maybe (FunPtr GLFWwindowsizefun))+glfwWindowclosefun = unsafePerformIO (newIORef Nothing) :: IORef (Maybe (FunPtr GLFWwindowclosefun))+glfwWindowrefreshfun =unsafePerformIO (newIORef Nothing) :: IORef (Maybe (FunPtr GLFWwindowrefreshfun))+glfwMousebuttonfun =unsafePerformIO (newIORef Nothing) :: IORef (Maybe (FunPtr GLFWmousebuttonfun))+glfwMouseposfun =unsafePerformIO (newIORef Nothing) :: IORef (Maybe (FunPtr GLFWmouseposfun))+glfwMousewheelfun =unsafePerformIO (newIORef Nothing) :: IORef (Maybe (FunPtr GLFWmousewheelfun))+glfwKeyfun =unsafePerformIO (newIORef Nothing) :: IORef (Maybe (FunPtr GLFWkeyfun))+glfwCharfun =unsafePerformIO (newIORef Nothing) :: IORef (Maybe (FunPtr GLFWcharfun))++foreign import ccall "wrapper" glfwWrapFun2 :: (Int -> Int -> IO ()) -> IO (FunPtr (Int -> Int -> IO ()))+foreign import ccall "wrapper" glfwWrapFun2' :: (Int32 -> Int32 -> IO ()) -> IO (FunPtr (Int32 -> Int32 -> IO ()))+foreign import ccall "wrapper" glfwWrapFun1 :: (Int -> IO ()) -> IO (FunPtr (Int -> IO ()))+foreign import ccall "wrapper" glfwWrapFun0 :: IO () -> IO (FunPtr (IO ()))++glfwSetCallbackIORef ref f = do+ g <- atomicModifyIORef ref (\g -> (Just f, g))+ case g of+ Just g' -> freeHaskellFunPtr g'+ Nothing -> return ()++glfwCleanup = do+ cleanup glfwWindowsizefun+ cleanup glfwWindowsizefun+ cleanup glfwWindowclosefun+ cleanup glfwWindowrefreshfun+ cleanup glfwMousebuttonfun+ cleanup glfwMouseposfun+ cleanup glfwMousewheelfun+ cleanup glfwKeyfun+ cleanup glfwCharfun+ where+ cleanup ref = do+ g <- atomicModifyIORef ref (\g -> (Nothing, g))+ case g of + Just g' -> freeHaskellFunPtr g'+ Nothing -> return ()++-- text rendering++fontTextures :: IORef ([(BitmapFont, GL.TextureObject)])+fontTextures = unsafePerformIO (newIORef [])++loadFont :: BitmapFont -> GL.GL GL.TextureObject+loadFont name = do+ l <- liftIO $ readIORef fontTextures+ case lookup name l of+ Just font -> do+ (r, _) <- GL.areTexturesResident [font]+ if length r == 1+ then return font+ else loadIt $ filter ((/=name) . fst) l+ Nothing -> loadIt l + + where+ bitmap = case name of+ Fixed8x16 -> bitmap8x16+ loadIt l = do+ objs <- GL.genObjectNames 1+ case objs of+ [font] -> do+ GL.textureBinding GL.Texture2D $= Just font+ -- this next line is important, otherwise it won't render the texture!+ GL.textureFilter GL.Texture2D $= ((GL.Linear', Nothing), GL.Linear')+ loadMemoryTexture2D bitmap [OriginUL, NoRescale]+ liftIO $ writeIORef fontTextures ((name, font):l)+ return font+ [] -> error "Unable to load texture"+ +renderChar :: a -> Char -> GL.GL ()+renderChar font c = do+ let y = fromIntegral ((fromEnum c) `rem` 16 * 16) / 256+ x = fromIntegral ((fromEnum c) `quot` 16 * 8) / 128+ dx = 8 / 128+ dy = 16 / 256+ h = 16+ w = 8+ GL.preservingMatrix $ GL.renderPrimitive GL.Quads (do+ GL.texCoord (texCoord2 x y)+ GL.vertex (vertex3 0 h 0)+ GL.texCoord (texCoord2 (x + dx) y)+ GL.vertex (vertex3 w h 0)+ GL.texCoord (texCoord2 (x + dx) (y + dy))+ GL.vertex (vertex3 w 0 0)+ GL.texCoord (texCoord2 x (y + dy))+ GL.vertex (vertex3 0 0 0))+ GL.translate (vector3 w 0 0)++-- | Render a text string using the given 'BitmapFont'.+-- +-- Text is rendered through texture, and is only possible with alpha enabled. +renderString :: BitmapFont -> String -> GL.GL ()+renderString name s = do+ font <- loadFont name+ GL.texture GL.Texture2D $= GL.Enabled+ GL.textureBinding GL.Texture2D $= Just font+ GL.preservingMatrix $ mapM_ (renderChar font) s+ GL.texture GL.Texture2D $= GL.Disabled++vector3 = GL.Vector3 :: Float -> Float -> Float -> GL.Vector3 Float+vertex3 = GL.Vertex3 :: Float -> Float -> Float -> GL.Vertex3 Float+texCoord2 = GL.TexCoord2 :: Float -> Float -> GL.TexCoord2 Float++bitmap8x16 = "\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x01\x20\x08\xff\xff\xff\xff\x00\xa7\xff\xff\xff\x00\x86\xff\xff\xff\xf3\x00\xff\xff\xff\x34\xcf\xff\xff\xff\x00\x01\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x04\xff\xff\xff\xf0\xff\xff\xff\xef\xff\xff\xff\x00\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x01\xff\xff\xff\xf0\xff\xff\xff\xef\xa8\xff\xff\xff\x00\x01\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x04\xff\xff\xff\xf0\xff\xff\xff\xef\xff\xff\xff\x00\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x04\xff\xff\xff\xf0\xff\xff\xff\xef\xff\xff\xff\x00\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x01\xff\xff\xff\xf0\xff\xff\xff\xef\xb0\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x2c\xff\xff\xff\xe8\xff\xff\xff\x07\xa4\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\xb0\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\xb6\xff\xff\xff\x68\x86\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x84\xff\xff\xff\x00\x04\xff\xff\xff\x0d\xff\xff\xff\xa8\xff\xff\xff\xf1\xff\xff\xff\xea\xff\xff\xff\x88\x8a\xff\xff\xff\x00\x04\xff\xff\xff\x28\xff\xff\xff\xcc\xff\xff\xff\xf3\xff\xff\xff\xb8\xff\xff\xff\x12\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x89\xff\xff\xff\x00\x04\xff\xff\xff\x5f\xff\xff\xff\xe6\xff\xff\xff\xf3\xff\xff\xff\xc5\xff\xff\xff\x32\x82\xff\xff\xff\x00\x02\xff\xff\xff\xf3\xff\xff\xff\xf4\xff\xff\xff\xff\x81\xff\xff\xff\xf3\x81\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xd7\xff\xff\xff\x01\xff\xff\xff\xe0\xff\xff\xff\xf0\xff\xff\xff\x5e\x81\xff\xff\xff\x00\x03\xff\xff\xff\x47\xff\xff\xff\xf3\xff\xff\xff\xf4\xff\xff\xff\xff\x81\xff\xff\xff\xf3\x00\xff\xff\xff\x1d\x88\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x02\xff\xff\xff\x40\xff\xff\xff\xdb\xff\xff\xff\x01\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x84\xff\xff\xff\x00\x05\xff\xff\xff\x99\xff\xff\xff\xaa\xff\xff\xff\x08\xff\xff\xff\x12\xff\xff\xff\xcb\xff\xff\xff\x65\x89\xff\xff\xff\x00\x04\xff\xff\xff\xc7\xff\xff\xff\x75\xff\xff\xff\x02\xff\xff\xff\x9f\xff\xff\xff\x99\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x88\xff\xff\xff\x00\x05\xff\xff\xff\x0e\xff\xff\xff\xf9\xff\xff\xff\x49\xff\xff\xff\x00\xff\xff\xff\x3f\xff\xff\xff\x4a\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xd7\xff\xff\xff\x00\xff\xff\xff\x17\xff\xff\xff\x51\xff\xff\xff\xdf\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x8b\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\xc9\xff\xff\xff\x54\x85\xff\xff\xff\x00\x01\xff\xff\xff\x01\xff\xff\xff\x0e\x84\xff\xff\xff\x00\x01\xff\xff\xff\xf0\xff\xff\xff\x2e\x81\xff\xff\xff\x00\x01\xff\xff\xff\x5b\xff\xff\xff\xbf\x88\xff\xff\xff\x00\x05\xff\xff\xff\x11\xff\xff\xff\xff\xff\xff\xff\x10\xff\xff\xff\x00\xff\xff\xff\x3d\xff\xff\xff\xe1\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x88\xff\xff\xff\x00\x02\xff\xff\xff\x1a\xff\xff\xff\xff\xff\xff\xff\x0d\x86\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xd7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x2f\xff\xff\xff\xf6\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x8b\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x54\xff\xff\xff\xca\x85\xff\xff\xff\x00\x01\xff\xff\xff\x26\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x02\xff\xff\xff\x19\xff\xff\xff\xff\xff\xff\xff\x06\x81\xff\xff\xff\x00\x01\xff\xff\xff\x33\xff\xff\xff\xe7\x88\xff\xff\xff\x00\x01\xff\xff\xff\x24\xff\xff\xff\xfd\x81\xff\xff\xff\x00\x01\xff\xff\xff\x2a\xff\xff\xff\xf3\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x89\xff\xff\xff\x00\x02\xff\xff\xff\xac\xff\xff\xff\xa8\xff\xff\xff\x01\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xd7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x7f\xff\xff\xff\xdd\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x8b\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x02\xff\xff\xff\x01\xff\xff\xff\xdb\xff\xff\xff\x40\x84\xff\xff\xff\x00\x02\xff\xff\xff\x0c\xff\xff\xff\xf3\xff\xff\xff\x32\x82\xff\xff\xff\x00\x01\xff\xff\xff\x24\xff\xff\xff\xfc\x82\xff\xff\xff\x00\x01\xff\xff\xff\x29\xff\xff\xff\xf3\x88\xff\xff\xff\x00\x05\xff\xff\xff\x12\xff\xff\xff\xff\xff\xff\xff\x10\xff\xff\xff\x00\xff\xff\xff\x3d\xff\xff\xff\xe1\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x89\xff\xff\xff\x00\x02\xff\xff\xff\x0b\xff\xff\xff\xca\xff\xff\xff\x81\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xd7\xff\xff\xff\x00\xff\xff\xff\x4d\xff\xff\xff\xd1\xff\xff\xff\x19\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x8b\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x68\xff\xff\xff\xb6\x85\xff\xff\xff\x00\x02\xff\xff\xff\x47\xff\xff\xff\xe0\xff\xff\xff\x2e\x81\xff\xff\xff\x00\x02\xff\xff\xff\x1a\xff\xff\xff\xff\xff\xff\xff\x06\x81\xff\xff\xff\x00\x01\xff\xff\xff\x33\xff\xff\xff\xe9\x89\xff\xff\xff\x00\x04\xff\xff\xff\xcc\xff\xff\xff\x76\xff\xff\xff\x02\xff\xff\xff\xa0\xff\xff\xff\x99\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x8a\xff\xff\xff\x00\x01\xff\xff\xff\x36\xff\xff\xff\xe8\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xd7\xff\xff\xff\x00\xff\xff\xff\x93\xff\xff\xff\x44\x84\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x8b\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x02\xff\xff\xff\x07\xff\xff\xff\xe8\xff\xff\xff\x2c\x85\xff\xff\xff\x00\x01\xff\xff\xff\x58\xff\xff\xff\xd3\x81\xff\xff\xff\x00\x02\xff\xff\xff\x01\xff\xff\xff\xf3\xff\xff\xff\x2f\x81\xff\xff\xff\x00\x01\xff\xff\xff\x5c\xff\xff\xff\xc5\x89\xff\xff\xff\x00\x04\xff\xff\xff\x2c\xff\xff\xff\xcf\xff\xff\xff\xf3\xff\xff\xff\xb9\xff\xff\xff\x12\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x8a\xff\xff\xff\x00\x01\xff\xff\xff\x1f\xff\xff\xff\xf6\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xd7\xff\xff\xff\x00\xff\xff\xff\x63\xff\xff\xff\x81\x83\xff\xff\xff\x00\x02\xff\xff\xff\xcc\xff\xff\xff\xf4\xff\xff\xff\xfb\x8b\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x84\xff\xff\xff\x00\x01\xff\xff\xff\x7c\xff\xff\xff\xa2\x82\xff\xff\xff\x00\x04\xff\xff\xff\x4f\xff\xff\xff\x25\xff\xff\xff\x00\xff\xff\xff\x69\xff\xff\xff\xe3\x82\xff\xff\xff\x00\x05\xff\xff\xff\xa2\xff\xff\xff\xac\xff\xff\xff\x09\xff\xff\xff\x14\xff\xff\xff\xcd\xff\xff\xff\x72\x90\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x8b\xff\xff\xff\x00\x00\xff\xff\xff\x0a\x84\xff\xff\xff\x00\x02\xff\xff\xff\x07\xff\xff\xff\x2d\xff\xff\xff\xf7\x81\xff\xff\xff\x07\x81\xff\xff\xff\x00\x01\xff\xff\xff\x23\xff\xff\xff\xdd\x81\xff\xff\xff\x00\x01\xff\xff\xff\x86\xff\xff\xff\xcf\x91\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x04\xff\xff\xff\xf4\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x01\xff\xff\xff\xf4\xff\xff\xff\xf7\x84\xff\xff\xff\x00\x02\xff\xff\xff\x11\xff\xff\xff\xee\xff\xff\xff\x1d\x81\xff\xff\xff\x00\x04\xff\xff\xff\x4d\xff\xff\xff\xd0\xff\xff\xff\xf5\xff\xff\xff\xdc\xff\xff\xff\x49\x82\xff\xff\xff\x00\x05\xff\xff\xff\x13\xff\xff\xff\xaf\xff\xff\xff\xf1\xff\xff\xff\xec\xff\xff\xff\x96\xff\xff\xff\x03\x90\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x04\xff\xff\xff\xf4\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x04\xff\xff\xff\xf4\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x01\xff\xff\xff\xf4\xff\xff\xff\xf7\x8a\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x84\xff\xff\xff\x00\x84\xff\xff\xff\xff\x81\xff\xff\xff\x00\x05\xff\xff\xff\x06\xff\xff\xff\xef\xff\xff\xff\x39\xff\xff\xff\x00\xff\xff\xff\x7b\xff\xff\xff\xc1\x91\xff\xff\xff\x00\xd0\xff\xff\xff\x00\x00\xff\xff\xff\x21\x82\xff\xff\xff\xf3\x00\xff\xff\xff\x56\x92\xff\xff\xff\x00\x04\xff\xff\xff\x51\xff\xff\xff\xdc\xff\xff\xff\xf5\xff\xff\xff\xce\xff\xff\xff\x2b\x82\xff\xff\xff\x00\x04\xff\xff\xff\x4f\xff\xff\xff\xcc\xff\xff\xff\x02\xff\xff\xff\xf3\xff\xff\xff\x30\x89\xff\xff\xff\x00\xe0\xff\xff\xff\x00\x04\xff\xff\xff\x4f\xff\xff\xff\xd7\xff\xff\xff\x07\xff\xff\xff\xff\xff\xff\xff\x3b\x99\xff\xff\xff\x00\xff\xff\xff\xff\x00\xff\xff\xff\xff\x00\xf7\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x01\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x04\xff\xff\xff\xf0\xff\xff\xff\xef\xff\xff\xff\x00\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x01\xff\xff\xff\xf0\xff\xff\xff\xef\xb0\xff\xff\xff\x00\x01\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x04\xff\xff\xff\xf0\xff\xff\xff\xef\xff\xff\xff\x00\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x01\xff\xff\xff\xf0\xff\xff\xff\xef\x8d\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x98\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\xb0\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x8a\xff\xff\xff\x00\x05\xff\xff\xff\x25\xff\xff\xff\xf7\xff\xff\xff\xef\xff\xff\xff\xf1\xff\xff\xff\xff\xff\xff\xff\x9c\x97\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x84\xff\xff\xff\x00\x00\xff\xff\xff\x04\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\xa3\xff\xff\xff\xf7\x89\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x89\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x04\xff\xff\xff\x13\xff\xff\xff\xa8\xff\xff\xff\xe9\xff\xff\xff\xa4\xff\xff\xff\x1b\x83\xff\xff\xff\x00\x04\xff\xff\xff\x03\xff\xff\xff\xae\xff\xff\xff\x6a\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x84\xff\xff\xff\xff\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x03\xff\xff\xff\x41\xff\xff\xff\xdf\xff\xff\xff\xe4\xff\xff\xff\xff\x81\xff\xff\xff\xdf\x07\xff\xff\xff\x1b\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x8e\xff\xff\xff\xf1\xff\xff\xff\xc4\xff\xff\xff\x16\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x21\xff\xff\xff\xd7\x84\xff\xff\xff\x00\x02\xff\xff\xff\xe6\xff\xff\xff\x80\xff\xff\xff\x18\x83\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x00\xff\xff\xff\x08\xff\xff\xff\xeb\xff\xff\xff\xf7\x89\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x89\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x09\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x01\xff\xff\xff\x9a\xff\xff\xff\x39\xff\xff\xff\x04\xff\xff\xff\x67\xff\xff\xff\xe0\xff\xff\xff\x19\x83\xff\xff\xff\x00\x03\xff\xff\xff\x05\xff\xff\xff\xb1\xff\xff\xff\x62\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x02\xff\xff\xff\x07\xff\xff\xff\x2d\xff\xff\xff\xf7\x81\xff\xff\xff\x07\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x87\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xff\xff\xff\xff\x76\xff\xff\xff\x01\xff\xff\xff\x9e\xff\xff\xff\x9b\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x89\xff\xff\xff\x00\x04\xff\xff\xff\x2d\xff\xff\xff\x93\xff\xff\xff\xe9\xff\xff\xff\xa6\xff\xff\xff\x3a\x81\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x00\xff\xff\xff\x54\xff\xff\xff\xaf\xff\xff\xff\xf7\x89\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x89\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x11\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x76\xff\xff\xff\x67\xff\xff\xff\xd8\xff\xff\xff\x00\xff\xff\xff\xb0\xff\xff\xff\x91\xff\xff\xff\x9c\xff\xff\xff\x00\xff\xff\xff\x2a\xff\xff\xff\x2d\xff\xff\xff\x06\xff\xff\xff\x00\xff\xff\xff\x08\xff\xff\xff\xb4\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xff\xff\xff\xff\xef\xff\xff\xff\xf1\xff\xff\xff\xca\xff\xff\xff\x35\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xff\xff\xff\xff\x10\xff\xff\xff\x00\xff\xff\xff\x3d\xff\xff\xff\xe1\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x8b\xff\xff\xff\x00\x0a\xff\xff\xff\x09\xff\xff\xff\x5f\xff\xff\xff\xca\xff\xff\xff\xcd\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x00\xff\xff\xff\xac\xff\xff\xff\x57\xff\xff\xff\xf7\x89\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x08\xff\xff\xff\x7a\xff\xff\xff\x04\xff\xff\xff\x33\xff\xff\xff\xb6\xff\xff\xff\xeb\xff\xff\xff\x7a\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x12\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x0d\xff\xff\xff\xf6\xff\xff\xff\x32\xff\xff\xff\xf7\xff\xff\xff\x48\xff\xff\xff\x5a\xff\xff\xff\x35\xff\xff\xff\xe5\xff\xff\xff\x00\xff\xff\xff\x2a\xff\xff\xff\x6b\xff\xff\xff\x98\xff\xff\xff\xa7\xff\xff\xff\xa9\xff\xff\xff\x86\xff\xff\xff\x5d\xff\xff\xff\x2a\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x00\xff\xff\xff\x04\xff\xff\xff\x87\xff\xff\xff\xce\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfd\x81\xff\xff\xff\x00\x01\xff\xff\xff\x2a\xff\xff\xff\xf3\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x8b\xff\xff\xff\x00\x0a\xff\xff\xff\x26\xff\xff\xff\x8e\xff\xff\xff\xe5\xff\xff\xff\xa1\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x0c\xff\xff\xff\xce\xff\xff\xff\x27\xff\xff\xff\xf7\x89\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xff\xff\xff\xff\x0e\xff\xff\xff\x00\xff\xff\xff\x2e\xff\xff\xff\xf3\x82\xff\xff\xff\x00\x08\xff\xff\xff\x81\xff\xff\xff\xe9\xff\xff\xff\xcb\xff\xff\xff\x50\xff\xff\xff\x13\xff\xff\xff\x83\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x12\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x1f\xff\xff\xff\xfd\xff\xff\xff\x27\xff\xff\xff\xff\xff\xff\xff\xed\xff\xff\xff\x63\xff\xff\xff\x33\xff\xff\xff\xeb\xff\xff\xff\x00\xff\xff\xff\x26\xff\xff\xff\xd6\xff\xff\xff\xf0\xff\xff\xff\xd1\xff\xff\xff\x4d\xff\xff\xff\x2e\xff\xff\xff\x5f\xff\xff\xff\x5d\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x31\xff\xff\xff\xf2\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xff\xff\xff\xff\x10\xff\xff\xff\x00\xff\xff\xff\x3d\xff\xff\xff\xe0\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x89\xff\xff\xff\x00\x04\xff\xff\xff\x57\xff\xff\xff\xbf\xff\xff\xff\xe3\xff\xff\xff\x7b\xff\xff\xff\x15\x81\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x5c\xff\xff\xff\x7f\xff\xff\xff\x27\xff\xff\xff\xf7\x89\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xff\xff\xff\xff\x78\xff\xff\xff\x01\xff\xff\xff\x7c\xff\xff\xff\xce\x89\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x0f\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x01\xff\xff\xff\xe9\xff\xff\xff\x3a\xff\xff\xff\xf7\xff\xff\xff\x38\xff\xff\xff\xe9\xff\xff\xff\x79\xff\xff\xff\xa8\xff\xff\xff\x00\xff\xff\xff\x10\xff\xff\xff\x17\xff\xff\xff\x00\xff\xff\xff\x6a\xff\xff\xff\xe6\x84\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x00\xff\xff\xff\x04\xff\xff\xff\x89\xff\xff\xff\xce\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xff\xff\xff\xff\x78\xff\xff\xff\x02\xff\xff\xff\x9f\xff\xff\xff\x98\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x89\xff\xff\xff\x00\x02\xff\xff\xff\xc4\xff\xff\xff\x56\xff\xff\xff\x04\x83\xff\xff\xff\x00\x02\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\xb3\x81\xff\xff\xff\x27\x00\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x0d\xff\xff\xff\x2e\xff\xff\xff\xcd\xff\xff\xff\x1b\xff\xff\xff\x00\xff\xff\xff\x07\xff\xff\xff\xb4\xff\xff\xff\x5a\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x6e\xff\xff\xff\xe8\xff\xff\xff\xe7\xff\xff\xff\x47\x89\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x09\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x65\xff\xff\xff\xa0\xff\xff\xff\xff\xff\xff\xff\xe6\xff\xff\xff\xa2\xff\xff\xff\xda\xff\xff\xff\x1f\x82\xff\xff\xff\x00\x02\xff\xff\xff\x01\xff\xff\xff\x6c\xff\xff\xff\xd4\x84\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xff\xff\xff\xff\xef\xff\xff\xff\xf0\xff\xff\xff\xc9\xff\xff\xff\x34\x82\xff\xff\xff\x00\x02\xff\xff\xff\xbc\xff\xff\xff\xe4\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x8d\xff\xff\xff\xf1\xff\xff\xff\xc3\xff\xff\xff\x14\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x90\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xfd\xff\xff\xff\xc9\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x04\xff\xff\xff\x42\xff\xff\xff\xd5\xff\xff\xff\x25\xff\xff\xff\xb8\xff\xff\xff\x75\x91\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x04\xff\xff\xff\x61\xff\xff\xff\xd3\xff\xff\xff\xe7\xff\xff\xff\x99\xff\xff\xff\x15\x82\xff\xff\xff\x00\x03\xff\xff\xff\x42\xff\xff\xff\xf7\xff\xff\xff\xe5\xff\xff\xff\x37\x83\xff\xff\xff\x00\x02\xff\xff\xff\x03\xff\xff\xff\x2a\xff\xff\xff\xf7\x81\xff\xff\xff\x03\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x8d\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x04\xff\xff\xff\xf4\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x01\xff\xff\xff\xf4\xff\xff\xff\xf7\x90\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xff\xff\xff\xff\x77\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x02\xff\xff\xff\x5a\xff\xff\xff\xf9\xff\xff\xff\x90\x92\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x04\xff\xff\xff\xf4\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x01\xff\xff\xff\xf4\xff\xff\xff\xf7\x88\xff\xff\xff\x00\x04\xff\xff\xff\x01\xff\xff\xff\x11\xff\xff\xff\x00\xff\xff\xff\x60\xff\xff\xff\xe4\x83\xff\xff\xff\x00\x84\xff\xff\xff\xff\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x86\xff\xff\xff\x00\x04\xff\xff\xff\x40\xff\xff\xff\x9e\xff\xff\xff\x1e\xff\xff\xff\xb7\xff\xff\xff\x06\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\xd7\xff\xff\xff\x00\x04\xff\xff\xff\x09\xff\xff\xff\xce\xff\xff\xff\xed\xff\xff\xff\xde\xff\xff\xff\x72\x83\xff\xff\xff\x00\x04\xff\xff\xff\x03\xff\xff\xff\x04\xff\xff\xff\x00\xff\xff\xff\x06\xff\xff\xff\x02\x8b\xff\xff\xff\x00\x02\xff\xff\xff\x84\xff\xff\xff\xe0\xff\xff\xff\x26\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\xe0\xff\xff\xff\x00\x04\xff\xff\xff\x16\xff\xff\xff\xbf\xff\xff\xff\x1c\xff\xff\xff\xc9\xff\xff\xff\x0c\x99\xff\xff\xff\x00\xe1\xff\xff\xff\x00\x02\xff\xff\xff\x69\xff\xff\xff\xea\xff\xff\xff\x44\x9a\xff\xff\xff\x00\xff\xff\xff\xff\x00\xf8\xff\xff\xff\x00\x02\xff\xff\xff\xdd\xff\xff\xff\xe3\xff\xff\xff\x39\x83\xff\xff\xff\x00\x01\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x04\xff\xff\xff\xf0\xff\xff\xff\xef\xff\xff\xff\x00\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x01\xff\xff\xff\xf0\xff\xff\xff\xef\xa9\xff\xff\xff\x00\x02\xff\xff\xff\xd4\xff\xff\xff\xde\xff\xff\xff\x5f\x83\xff\xff\xff\x00\x01\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x04\xff\xff\xff\xf0\xff\xff\xff\xef\xff\xff\xff\x00\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x01\xff\xff\xff\xf0\xff\xff\xff\xef\x8b\xff\xff\xff\x00\x01\xff\xff\xff\x95\xff\xff\xff\xf4\x81\xff\xff\xff\xf3\x9a\xff\xff\xff\x00\x01\xff\xff\xff\x69\xff\xff\xff\xc9\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x9a\xff\xff\xff\x00\x02\xff\xff\xff\x86\xff\xff\xff\xf0\xff\xff\xff\xf3\x8c\xff\xff\xff\x00\x01\xff\xff\xff\x5d\xff\xff\xff\xe1\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x8b\xff\xff\xff\x00\x02\xff\xff\xff\x1e\xff\xff\xff\xa3\xff\xff\xff\x24\x9b\xff\xff\xff\x00\x02\xff\xff\xff\x06\xff\xff\xff\xf2\xff\xff\xff\x26\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x90\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x28\xff\xff\xff\xf9\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x8c\xff\xff\xff\x00\x02\xff\xff\xff\x09\xff\xff\xff\xa2\xff\xff\xff\x3b\x81\xff\xff\xff\x00\x02\xff\xff\xff\xf3\xff\xff\xff\xf4\xff\xff\xff\xff\x81\xff\xff\xff\xf3\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x03\xff\xff\xff\x41\xff\xff\xff\xdf\xff\xff\xff\xe4\xff\xff\xff\xff\x81\xff\xff\xff\xdf\x00\xff\xff\xff\x1b\x82\xff\xff\xff\x00\x02\xff\xff\xff\x1a\xff\xff\xff\xfc\xff\xff\xff\x7d\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x90\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x8b\xff\xff\xff\x00\x03\xff\xff\xff\x1c\xff\xff\xff\x03\xff\xff\xff\x4b\xff\xff\xff\xe2\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x02\xff\xff\xff\x72\xff\xff\xff\xd4\xff\xff\xff\xd5\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x89\xff\xff\xff\x00\x85\xff\xff\xff\xf3\x02\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x02\xff\xff\xff\x24\xff\xff\xff\xfd\xff\xff\xff\x01\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x88\xff\xff\xff\x00\x06\xff\xff\xff\x6d\xff\xff\xff\x4c\xff\xff\xff\x05\xff\xff\xff\x5b\xff\xff\xff\xe1\xff\xff\xff\xe6\xff\xff\xff\x79\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x03\xff\xff\xff\xcd\xff\xff\xff\x4a\xff\xff\xff\xe2\xff\xff\xff\x2e\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x82\xff\xff\xff\xf3\x8a\xff\xff\xff\x00\x06\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x00\xff\xff\xff\x7f\xff\xff\xff\x5c\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x27\xff\xff\xff\xf6\x83\xff\xff\xff\x00\x02\xff\xff\xff\x08\xff\xff\xff\xf2\xff\xff\xff\x4c\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x82\xff\xff\xff\xf3\x82\xff\xff\xff\x00\x05\xff\xff\xff\x4a\xff\xff\xff\xa9\xff\xff\xff\xe2\xff\xff\xff\x9b\xff\xff\xff\x43\xff\xff\xff\x02\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x84\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xec\xff\xff\xff\x04\xff\xff\xff\x8f\xff\xff\xff\x87\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x90\xff\xff\xff\x00\x06\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x01\xff\xff\xff\xd0\xff\xff\xff\xbb\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xfc\xff\xff\xff\x29\xff\xff\xff\xf8\xff\xff\xff\x29\xff\xff\xff\xf2\x84\xff\xff\xff\x00\x02\xff\xff\xff\x70\xff\xff\xff\xff\xff\xff\xff\xc5\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x8a\xff\xff\xff\x00\x05\xff\xff\xff\x09\xff\xff\xff\x52\xff\xff\xff\xa6\xff\xff\xff\xdb\xff\xff\xff\x93\xff\xff\xff\x08\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x85\xff\xff\xff\x00\x02\xff\xff\xff\x6a\xff\xff\xff\xff\xff\xff\xff\x3f\x84\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x84\xff\xff\xff\x00\x04\xff\xff\xff\x81\xff\xff\xff\x9a\xff\xff\xff\x00\xff\xff\xff\x39\xff\xff\xff\xdf\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x89\xff\xff\xff\x00\x85\xff\xff\xff\xef\x07\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x3c\xff\xff\xff\x8f\xff\xff\xff\xbb\xff\xff\xff\x3b\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xff\xff\xff\xff\x50\xff\xff\xff\xff\xff\xff\xff\x4d\xff\xff\xff\xe1\x83\xff\xff\xff\x00\x02\xff\xff\xff\x0e\xff\xff\xff\xf9\xff\xff\xff\x3e\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x88\xff\xff\xff\x00\x07\xff\xff\xff\x3b\xff\xff\xff\xad\xff\xff\xff\xd2\xff\xff\xff\xa7\xff\xff\xff\x1e\xff\xff\xff\x07\xff\xff\xff\x4e\xff\xff\xff\x01\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x84\xff\xff\xff\x00\x04\xff\xff\xff\x0f\xff\xff\xff\xe8\xff\xff\xff\x82\xff\xff\xff\xcd\xff\xff\xff\x01\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x84\xff\xff\xff\x00\x01\xff\xff\xff\xdb\xff\xff\xff\x42\x81\xff\xff\xff\x00\x02\xff\xff\xff\xe2\xff\xff\xff\x39\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x90\xff\xff\xff\x00\x06\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x8d\xff\xff\xff\x3d\xff\xff\xff\x6d\xff\xff\xff\x88\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xfc\xff\xff\xff\xcf\xff\xff\xff\xa1\xff\xff\xff\xdc\xff\xff\xff\x8f\x83\xff\xff\xff\x00\x01\xff\xff\xff\x26\xff\xff\xff\xfc\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x89\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x86\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x84\xff\xff\xff\x00\x04\xff\xff\xff\x8b\xff\xff\xff\xa3\xff\xff\xff\x00\xff\xff\xff\xcc\xff\xff\xff\x60\x82\xff\xff\xff\x00\x02\xff\xff\xff\xbc\xff\xff\xff\xe4\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x02\xff\xff\xff\x36\xff\xff\xff\xe7\xff\xff\xff\x02\x81\xff\xff\xff\x00\x02\xff\xff\xff\x8e\xff\xff\xff\x92\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x90\xff\xff\xff\x00\x06\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\xc8\xff\xff\xff\x01\xff\xff\xff\x1b\xff\xff\xff\xd8\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x8c\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfa\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x89\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x02\xff\xff\xff\x07\xff\xff\xff\x2d\xff\xff\xff\xf7\x81\xff\xff\xff\x07\x81\xff\xff\xff\x00\x06\xff\xff\xff\x21\xff\xff\xff\xf2\xff\xff\xff\x20\xff\xff\xff\x00\xff\xff\xff\x46\xff\xff\xff\xe5\xff\xff\xff\x0b\x8a\xff\xff\xff\x00\x02\xff\xff\xff\x0a\xff\xff\xff\xd1\xff\xff\xff\x13\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x04\xff\xff\xff\xf4\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x01\xff\xff\xff\xf4\xff\xff\xff\xf7\x90\xff\xff\xff\x00\x02\xff\xff\xff\x27\xff\xff\xff\xff\xff\xff\xff\x9b\x81\xff\xff\xff\x00\x01\xff\xff\xff\xc8\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x8c\xff\xff\xff\x00\x01\xff\xff\xff\x51\xff\xff\xff\xec\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x04\xff\xff\xff\xf4\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x01\xff\xff\xff\xf4\xff\xff\xff\xf7\x89\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x84\xff\xff\xff\xff\x81\xff\xff\xff\x00\x01\xff\xff\xff\xab\xff\xff\xff\x93\x82\xff\xff\xff\x00\x01\xff\xff\xff\xbe\xff\xff\xff\x82\x82\xff\xff\xff\x00\x02\xff\xff\xff\x2d\xff\xff\xff\xbe\xff\xff\xff\x0e\x85\xff\xff\xff\x00\x01\xff\xff\xff\x63\xff\xff\xff\xa2\x82\xff\xff\xff\x00\xa9\xff\xff\xff\x00\x02\xff\xff\xff\x88\xff\xff\xff\xf4\xff\xff\xff\xfb\x8b\xff\xff\xff\x00\x02\xff\xff\xff\xd8\xff\xff\xff\xe9\xff\xff\xff\x72\x9b\xff\xff\xff\x00\x02\xff\xff\xff\x50\xff\xff\xff\xb5\xff\xff\xff\xfb\x86\xff\xff\xff\x00\x01\xff\xff\xff\x03\xff\xff\xff\x05\x8e\xff\xff\xff\x00\x02\xff\xff\xff\x48\xff\xff\xff\xc2\xff\xff\xff\x0b\x84\xff\xff\xff\x00\x02\xff\xff\xff\x02\xff\xff\xff\xd2\xff\xff\xff\x45\x81\xff\xff\xff\x00\xd9\xff\xff\xff\x00\x00\xff\xff\xff\x06\x86\xff\xff\xff\x00\x02\xff\xff\xff\x1e\xff\xff\xff\xcc\xff\xff\xff\x06\x84\xff\xff\xff\x00\x02\xff\xff\xff\x20\xff\xff\xff\xb8\xff\xff\xff\x01\x92\xff\xff\xff\x00\xe2\xff\xff\xff\x00\x01\xff\xff\xff\x8c\xff\xff\xff\x8b\x85\xff\xff\xff\x00\x01\xff\xff\xff\x8d\xff\xff\xff\x77\x92\xff\xff\xff\x00\xff\xff\xff\xff\x00\xb9\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\xc3\xff\xff\xff\x00\x01\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x04\xff\xff\xff\xf0\xff\xff\xff\xef\xff\xff\xff\x00\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x01\xff\xff\xff\xf0\xff\xff\xff\xef\x82\xff\xff\xff\x00\x01\xff\xff\xff\x9e\xff\xff\xff\x42\xa5\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x01\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x04\xff\xff\xff\xf0\xff\xff\xff\xef\xff\xff\xff\x00\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x01\xff\xff\xff\xf0\xff\xff\xff\xef\x8c\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\xa1\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x65\xff\xff\xff\x9a\x97\xff\xff\xff\x00\x02\xff\xff\xff\x11\xff\xff\xff\xee\xff\xff\xff\x1c\x8a\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x8a\xff\xff\xff\x00\x04\xff\xff\xff\x02\xff\xff\xff\xf3\xff\xff\xff\xf1\xff\xff\xff\xff\xff\xff\xff\x9c\xa0\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x31\xff\xff\xff\xeb\x89\xff\xff\xff\x00\x02\xff\xff\xff\x04\xff\xff\xff\x00\xff\xff\xff\x27\x84\xff\xff\xff\xff\x00\xff\xff\xff\x33\x84\xff\xff\xff\x00\x01\xff\xff\xff\x7c\xff\xff\xff\xa2\x84\xff\xff\xff\x00\x03\xff\xff\xff\x68\xff\xff\xff\xef\xff\xff\xff\xf3\xff\xff\xff\x47\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x8b\xff\xff\xff\x00\x02\xff\xff\xff\x8d\xff\xff\xff\x29\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x02\xff\xff\xff\xf3\xff\xff\xff\xf4\xff\xff\xff\xff\x81\xff\xff\xff\xf3\x82\xff\xff\xff\x00\x04\xff\xff\xff\x46\xff\xff\xff\xdd\xff\xff\xff\xf4\xff\xff\xff\xc6\xff\xff\xff\x25\x81\xff\xff\xff\x00\x03\xff\xff\xff\x47\xff\xff\xff\xf3\xff\xff\xff\xf4\xff\xff\xff\xff\x81\xff\xff\xff\xf3\x00\xff\xff\xff\x1d\x81\xff\xff\xff\x00\x04\xff\xff\xff\x6d\xff\xff\xff\xf1\xff\xff\xff\xde\xff\xff\xff\x74\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x87\xff\xff\xff\x00\x05\xff\xff\xff\x18\xff\xff\xff\x80\xff\xff\xff\xe6\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x07\x84\xff\xff\xff\x00\x02\xff\xff\xff\x07\xff\xff\xff\xe8\xff\xff\xff\x2c\x83\xff\xff\xff\x00\x02\xff\xff\xff\x08\xff\xff\xff\xf6\xff\xff\xff\x3c\x84\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x8b\xff\xff\xff\x00\x02\xff\xff\xff\x29\xff\xff\xff\x86\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x05\xff\xff\xff\x02\xff\xff\xff\xe9\xff\xff\xff\x47\xff\xff\xff\x00\xff\xff\xff\x76\xff\xff\xff\xbe\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x05\xff\xff\xff\x07\xff\xff\xff\xf6\xff\xff\xff\x50\xff\xff\xff\x04\xff\xff\xff\xa0\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x8a\xff\xff\xff\x00\x07\xff\xff\xff\x3a\xff\xff\xff\xa7\xff\xff\xff\xea\xff\xff\xff\x93\xff\xff\xff\x2d\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x88\xff\xff\xff\x00\x01\xff\xff\xff\x68\xff\xff\xff\xb6\x84\xff\xff\xff\x00\x01\xff\xff\xff\x24\xff\xff\xff\xfc\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x85\xff\xff\xff\x00\x04\xff\xff\xff\x25\xff\xff\xff\xf3\xff\xff\xff\x00\xff\xff\xff\x2a\xff\xff\xff\x06\x81\xff\xff\xff\x00\x01\xff\xff\xff\x88\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x1d\xff\xff\xff\xfd\x81\xff\xff\xff\x00\x01\xff\xff\xff\x2a\xff\xff\xff\xed\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x05\xff\xff\xff\x23\xff\xff\xff\xfd\xff\xff\xff\x03\xff\xff\xff\x00\xff\xff\xff\x3a\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x89\xff\xff\xff\x00\x03\xff\xff\xff\xcd\xff\xff\xff\xca\xff\xff\xff\x5f\xff\xff\xff\x09\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x87\xff\xff\xff\x00\x02\xff\xff\xff\x01\xff\xff\xff\xdb\xff\xff\xff\x40\x84\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x85\xff\xff\xff\x00\x07\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x00\xff\xff\xff\x67\xff\xff\xff\xc1\xff\xff\xff\xa8\xff\xff\xff\x57\xff\xff\xff\x0d\x84\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x26\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf6\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x89\xff\xff\xff\x00\x03\xff\xff\xff\xa1\xff\xff\xff\xe5\xff\xff\xff\x8e\xff\xff\xff\x26\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x87\xff\xff\xff\x00\x01\xff\xff\xff\x54\xff\xff\xff\xc9\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x03\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x56\x83\xff\xff\xff\xf3\x01\xff\xff\xff\xf4\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x04\xff\xff\xff\x22\xff\xff\xff\x74\xff\xff\xff\xc0\xff\xff\xff\xb5\xff\xff\xff\x53\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x8a\xff\xff\xff\x00\x07\xff\xff\xff\x15\xff\xff\xff\x7c\xff\xff\xff\xe3\xff\xff\xff\xbf\xff\xff\xff\x57\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x87\xff\xff\xff\x00\x01\xff\xff\xff\xca\xff\xff\xff\x54\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x88\xff\xff\xff\x00\x06\xff\xff\xff\x3b\xff\xff\xff\xad\xff\xff\xff\xd2\xff\xff\xff\xa1\xff\xff\xff\x00\xff\xff\xff\x1b\xff\xff\xff\x3f\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x8c\xff\xff\xff\x00\x05\xff\xff\xff\x04\xff\xff\xff\x56\xff\xff\xff\xc4\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x86\xff\xff\xff\x00\x02\xff\xff\xff\x40\xff\xff\xff\xdb\xff\xff\xff\x01\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x89\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x86\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x02\xff\xff\xff\xbc\xff\xff\xff\xe4\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x90\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x86\xff\xff\xff\x00\x01\xff\xff\xff\xb6\xff\xff\xff\x68\x86\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x89\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x02\xff\xff\xff\x07\xff\xff\xff\x2d\xff\xff\xff\xf7\x81\xff\xff\xff\x07\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x91\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x04\xff\xff\xff\xf4\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x01\xff\xff\xff\xf4\xff\xff\xff\xf7\x90\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x02\xff\xff\xff\x2c\xff\xff\xff\xe8\xff\xff\xff\x07\x86\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x04\xff\xff\xff\xf4\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x01\xff\xff\xff\xf4\xff\xff\xff\xf7\x89\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x84\xff\xff\xff\xff\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x02\xff\xff\xff\x48\xff\xff\xff\xaf\xff\xff\xff\x02\x8a\xff\xff\xff\x00\xb0\xff\xff\xff\x00\x02\xff\xff\xff\xd8\xff\xff\xff\xf4\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x9b\xff\xff\xff\x00\x02\xff\xff\xff\x4f\xff\xff\xff\xb4\xff\xff\xff\xfb\x87\xff\xff\xff\x00\x01\xff\xff\xff\x07\xff\xff\xff\x01\x8b\xff\xff\xff\x00\x02\xff\xff\xff\x41\xff\xff\xff\xc9\xff\xff\xff\x0c\x84\xff\xff\xff\x00\x04\xff\xff\xff\x5e\xff\xff\xff\xcc\xff\xff\xff\x06\xff\xff\xff\xf3\xff\xff\xff\x1d\x81\xff\xff\xff\x00\xe1\xff\xff\xff\x00\x02\xff\xff\xff\x14\xff\xff\xff\xd0\xff\xff\xff\x08\x83\xff\xff\xff\x00\x04\xff\xff\xff\x2c\xff\xff\xff\xc9\xff\xff\xff\x06\xff\xff\xff\xef\xff\xff\xff\x02\x91\xff\xff\xff\x00\xe1\xff\xff\xff\x00\x01\xff\xff\xff\xa5\xff\xff\xff\x61\x9b\xff\xff\xff\x00\xff\xff\xff\xff\x00\xff\xff\xff\xff\x00\x01\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x04\xff\xff\xff\xf0\xff\xff\xff\xef\xff\xff\xff\x00\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x01\xff\xff\xff\xf0\xff\xff\xff\xef\xab\xff\xff\xff\x00\x02\xff\xff\xff\x81\xff\xff\xff\xe5\xff\xff\xff\xab\x81\xff\xff\xff\x00\x01\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x04\xff\xff\xff\xf0\xff\xff\xff\xef\xff\xff\xff\x00\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x01\xff\xff\xff\xf0\xff\xff\xff\xef\xb0\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x8a\xff\xff\xff\x00\x01\xff\xff\xff\x99\xff\xff\xff\x4b\x8d\xff\xff\xff\x00\x03\xff\xff\xff\x25\xff\xff\xff\xf6\xff\xff\xff\xef\xff\xff\xff\x5c\x8b\xff\xff\xff\x00\x02\xff\xff\xff\x0f\xff\xff\xff\xfd\xff\xff\xff\x2c\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\xb0\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x8a\xff\xff\xff\x00\x01\xff\xff\xff\x56\xff\xff\xff\xb3\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x02\xff\xff\xff\x94\xff\xff\xff\xcd\xff\xff\xff\x03\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x84\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x02\xff\xff\xff\x28\xff\xff\xff\xf2\xff\xff\xff\x33\x81\xff\xff\xff\x00\x01\xff\xff\xff\x25\xff\xff\xff\xfc\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x02\xff\xff\xff\x02\xff\xff\xff\x00\xff\xff\xff\x01\x82\xff\xff\xff\x00\x00\xff\xff\xff\x01\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x83\xff\xff\xff\xf3\x00\xff\xff\xff\x25\x81\xff\xff\xff\x00\x04\xff\xff\xff\x41\xff\xff\xff\xd9\xff\xff\xff\xf9\xff\xff\xff\xc3\xff\xff\xff\x21\x82\xff\xff\xff\x00\x05\xff\xff\xff\x0b\xff\xff\xff\x96\xff\xff\xff\xe8\xff\xff\xff\xf3\xff\xff\xff\xd9\xff\xff\xff\x6e\x81\xff\xff\xff\x00\x04\xff\xff\xff\x6d\xff\xff\xff\xe7\xff\xff\xff\xc0\xff\xff\xff\x84\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x84\xff\xff\xff\x00\x01\xff\xff\xff\x28\xff\xff\xff\xf9\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x02\xff\xff\xff\x39\xff\xff\xff\xf8\xff\xff\xff\x2e\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x84\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x00\xff\xff\xff\x02\xff\xff\xff\xc9\xff\xff\xff\x7f\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x03\xff\xff\xff\x0b\xff\xff\xff\xb3\xff\xff\xff\x00\xff\xff\xff\x80\x82\xff\xff\xff\x00\x03\xff\xff\xff\xb2\xff\xff\xff\x0b\xff\xff\xff\x00\xff\xff\xff\x7f\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x05\xff\xff\xff\x02\xff\xff\xff\xe8\xff\xff\xff\x56\xff\xff\xff\x06\xff\xff\xff\x82\xff\xff\xff\xba\x82\xff\xff\xff\x00\x0c\xff\xff\xff\xa5\xff\xff\xff\x9b\xff\xff\xff\x0e\xff\xff\xff\x00\xff\xff\xff\x1f\xff\xff\xff\x4b\xff\xff\xff\x00\xff\xff\xff\x07\xff\xff\xff\xf6\xff\xff\xff\x38\xff\xff\xff\x00\xff\xff\xff\x8a\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x84\xff\xff\xff\x00\x01\xff\xff\xff\x0e\xff\xff\xff\x5d\x83\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x00\xff\xff\xff\x04\xff\xff\xff\xd3\xff\xff\xff\x82\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x84\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x02\xff\xff\xff\x79\xff\xff\xff\xcb\xff\xff\xff\x03\x82\xff\xff\xff\x00\x01\xff\xff\xff\x2b\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x04\xff\xff\xff\x1c\xff\xff\xff\xcd\xff\xff\xff\x72\xff\xff\xff\x4b\xff\xff\xff\x9a\x82\xff\xff\xff\x00\x04\xff\xff\xff\x70\xff\xff\xff\xcc\xff\xff\xff\x1c\xff\xff\xff\x9e\xff\xff\xff\x4a\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x01\xff\xff\xff\x1d\xff\xff\xff\xfd\x81\xff\xff\xff\x00\x01\xff\xff\xff\x2a\xff\xff\xff\xec\x81\xff\xff\xff\x00\x02\xff\xff\xff\x0c\xff\xff\xff\xfb\xff\xff\xff\x0c\x84\xff\xff\xff\x00\x05\xff\xff\xff\x23\xff\xff\xff\xfd\xff\xff\xff\x01\xff\xff\xff\x00\xff\xff\xff\x35\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x8a\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xfc\xff\xff\xff\x17\xff\xff\xff\x7b\xff\xff\xff\xd3\xff\xff\xff\x05\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x84\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xff\xff\xff\xff\xb6\xff\xff\xff\xef\xff\xff\xff\x29\x83\xff\xff\xff\x00\x01\xff\xff\xff\x77\xff\xff\xff\xcd\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x04\xff\xff\xff\xe4\xff\xff\xff\x65\xff\xff\xff\x00\xff\xff\xff\xcb\xff\xff\xff\x05\x83\xff\xff\xff\x00\x03\xff\xff\xff\x58\xff\xff\xff\xe4\xff\xff\xff\x08\xff\xff\xff\xd3\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x01\xff\xff\xff\x26\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf6\x81\xff\xff\xff\x00\x01\xff\xff\xff\x22\xff\xff\xff\xff\x82\xff\xff\xff\xef\x04\xff\xff\xff\xf0\xff\xff\xff\xed\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x81\xff\xff\xff\xef\x01\xff\xff\xff\xf1\xff\xff\xff\xff\x81\xff\xff\xff\xef\x88\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xff\xff\xff\xff\xd3\xff\xff\xff\xf3\xff\xff\xff\x35\x84\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x84\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x9c\xff\xff\xff\xc5\xff\xff\xff\x02\x82\xff\xff\xff\x00\x02\xff\xff\xff\xed\xff\xff\xff\xf9\xff\xff\xff\x4c\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x04\xff\xff\xff\x55\xff\xff\xff\xd9\xff\xff\xff\x2d\xff\xff\xff\x88\xff\xff\xff\x59\x82\xff\xff\xff\x00\x04\xff\xff\xff\x2b\xff\xff\xff\xd4\xff\xff\xff\x55\xff\xff\xff\x60\xff\xff\xff\x87\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xef\x00\xff\xff\xff\xd1\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x02\xff\xff\xff\x0b\xff\xff\xff\xfb\xff\xff\xff\x25\x81\xff\xff\xff\x00\x04\xff\xff\xff\x3a\xff\xff\xff\xde\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x84\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x8c\xff\xff\xff\xda\xff\xff\xff\x09\x84\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x84\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x01\xff\xff\xff\xa2\xff\xff\xff\xa5\xff\xff\xff\x01\x82\xff\xff\xff\x00\x01\xff\xff\xff\x69\xff\xff\xff\xde\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x03\xff\xff\xff\x37\xff\xff\xff\xdb\xff\xff\xff\x02\xff\xff\xff\xb3\x82\xff\xff\xff\x00\x04\xff\xff\xff\xdb\xff\xff\xff\x37\xff\xff\xff\x00\xff\xff\xff\xb3\xff\xff\xff\x02\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x08\xff\xff\xff\xa2\xff\xff\xff\xb4\xff\xff\xff\x0e\xff\xff\xff\x09\xff\xff\xff\xab\xff\xff\xff\x8b\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x84\xff\xff\xff\x00\x01\xff\xff\xff\x20\xff\xff\xff\xd3\x83\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x00\xff\xff\xff\x9f\xff\xff\xff\xb7\xff\xff\xff\x05\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x84\xff\xff\xff\x00\x06\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x00\xff\xff\xff\x02\xff\xff\xff\xa8\xff\xff\xff\xa0\xff\xff\xff\x01\x81\xff\xff\xff\x00\x01\xff\xff\xff\x28\xff\xff\xff\xfa\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x02\xff\xff\xff\x20\xff\xff\xff\x00\xff\xff\xff\x15\x82\xff\xff\xff\x00\x00\xff\xff\xff\x1f\x81\xff\xff\xff\x00\x00\xff\xff\xff\x14\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x08\xff\xff\xff\x0a\xff\xff\xff\x98\xff\xff\xff\xea\xff\xff\xff\xef\xff\xff\xff\x9f\xff\xff\xff\x08\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x90\xff\xff\xff\x00\x06\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x00\xff\xff\xff\x03\xff\xff\xff\xb0\xff\xff\xff\xa8\xff\xff\xff\x01\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x84\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x86\xff\xff\xff\x00\x01\xff\xff\xff\x26\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x90\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x07\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x8a\xff\xff\xff\x00\x04\xff\xff\xff\x05\xff\xff\xff\x02\xff\xff\xff\x00\xff\xff\xff\x05\xff\xff\xff\x01\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x04\xff\xff\xff\xf4\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x01\xff\xff\xff\xf4\xff\xff\xff\xf7\x90\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x02\xff\xff\xff\x07\xff\xff\xff\xc0\xff\xff\xff\x97\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x84\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x86\xff\xff\xff\x00\x02\xff\xff\xff\x18\xff\xff\xff\xff\xff\xff\xff\x22\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x04\xff\xff\xff\xf4\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x01\xff\xff\xff\xf4\xff\xff\xff\xf7\x90\xff\xff\xff\x00\x00\xff\xff\xff\x27\x84\xff\xff\xff\xff\x03\xff\xff\xff\x0b\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x8a\xff\xff\xff\x00\x04\xff\xff\xff\x2b\xff\xff\xff\xb2\xff\xff\xff\x1c\xff\xff\xff\xbb\xff\xff\xff\x08\x81\xff\xff\xff\x00\xa9\xff\xff\xff\x00\x03\xff\xff\xff\x27\xff\xff\xff\xff\xff\xff\xff\xf3\xff\xff\xff\x5e\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x87\xff\xff\xff\x00\x02\xff\xff\xff\x97\xff\xff\xff\xee\xff\xff\xff\xae\xaa\xff\xff\xff\x00\x03\xff\xff\xff\x01\xff\xff\xff\x05\xff\xff\xff\x00\xff\xff\xff\x07\x84\xff\xff\xff\x00\x03\xff\xff\xff\xc1\xff\xff\xff\x06\xff\xff\xff\xf3\xff\xff\xff\xcc\x83\xff\xff\xff\x00\x02\xff\xff\xff\x68\xff\xff\xff\xe8\xff\xff\xff\x2f\x82\xff\xff\xff\x00\xe0\xff\xff\xff\x00\x04\xff\xff\xff\x5b\xff\xff\xff\xd7\xff\xff\xff\x07\xff\xff\xff\xff\xff\xff\xff\x27\x82\xff\xff\xff\x00\x03\xff\xff\xff\x09\xff\xff\xff\xbc\xff\xff\xff\x23\xff\xff\xff\xb2\x92\xff\xff\xff\x00\xe9\xff\xff\xff\x00\x02\xff\xff\xff\x5e\xff\xff\xff\xeb\xff\xff\xff\x33\x92\xff\xff\xff\x00\xff\xff\xff\xff\x00\xb0\xff\xff\xff\x00\x03\xff\xff\xff\x8c\xff\xff\xff\xf4\xff\xff\xff\xe6\xff\xff\xff\x46\xca\xff\xff\xff\x00\x01\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x04\xff\xff\xff\xf0\xff\xff\xff\xef\xff\xff\xff\x00\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x01\xff\xff\xff\xf0\xff\xff\xff\xef\xa3\xff\xff\xff\x00\x01\xff\xff\xff\x6a\xff\xff\xff\xd2\x8a\xff\xff\xff\x00\x01\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x04\xff\xff\xff\xf0\xff\xff\xff\xef\xff\xff\xff\x00\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x01\xff\xff\xff\xf0\xff\xff\xff\xef\xb0\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\xa3\xff\xff\xff\x00\x01\xff\xff\xff\x2b\xff\xff\xff\xf8\x8a\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\xb0\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x8a\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x05\xff\xff\xff\x13\xff\xff\xff\xb6\xff\xff\xff\xef\xff\xff\xff\xf3\xff\xff\xff\xc9\xff\xff\xff\x2d\x82\xff\xff\xff\x00\x01\xff\xff\xff\xfd\xff\xff\xff\xf6\x83\xff\xff\xff\xf3\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x01\xff\xff\xff\xff\xff\xff\xff\xf5\x82\xff\xff\xff\xf3\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x90\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x83\xff\xff\xff\xf3\x00\xff\xff\xff\x15\x81\xff\xff\xff\x00\x04\xff\xff\xff\x41\xff\xff\xff\xd9\xff\xff\xff\xf9\xff\xff\xff\xc3\xff\xff\xff\x21\x82\xff\xff\xff\x00\x05\xff\xff\xff\x0b\xff\xff\xff\x96\xff\xff\xff\xe8\xff\xff\xff\xf3\xff\xff\xff\xd9\xff\xff\xff\x6e\x81\xff\xff\xff\x00\x04\xff\xff\xff\x6d\xff\xff\xff\xe7\xff\xff\xff\xc0\xff\xff\xff\x84\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x8a\xff\xff\xff\x00\x01\xff\xff\xff\x21\xff\xff\xff\xd7\x83\xff\xff\xff\x00\x05\xff\xff\xff\x21\xff\xff\xff\x77\xff\xff\xff\x0e\xff\xff\xff\x00\xff\xff\xff\x84\xff\xff\xff\xc0\x82\xff\xff\xff\x00\x01\xff\xff\xff\x96\xff\xff\xff\xa2\x87\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x01\xff\xff\xff\xab\xff\xff\xff\x93\x84\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x90\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x05\xff\xff\xff\x02\xff\xff\xff\xe8\xff\xff\xff\x56\xff\xff\xff\x06\xff\xff\xff\x82\xff\xff\xff\xba\x82\xff\xff\xff\x00\x0c\xff\xff\xff\xa5\xff\xff\xff\x9b\xff\xff\xff\x0e\xff\xff\xff\x00\xff\xff\xff\x1f\xff\xff\xff\x4b\xff\xff\xff\x00\xff\xff\xff\x07\xff\xff\xff\xf6\xff\xff\xff\x38\xff\xff\xff\x00\xff\xff\xff\x8a\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x94\xff\xff\xff\x00\x01\xff\xff\xff\x30\xff\xff\xff\xf1\x82\xff\xff\xff\x00\x02\xff\xff\xff\x0d\xff\xff\xff\xe3\xff\xff\xff\x4a\x86\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x02\xff\xff\xff\x0c\xff\xff\xff\xd7\xff\xff\xff\x59\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x00\xff\xff\xff\xb9\x82\xff\xff\xff\xbf\x83\xff\xff\xff\x00\x00\xff\xff\xff\xdf\x81\xff\xff\xff\xf3\x00\xff\xff\xff\xaa\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x01\xff\xff\xff\x1d\xff\xff\xff\xfd\x81\xff\xff\xff\x00\x01\xff\xff\xff\x2a\xff\xff\xff\xec\x81\xff\xff\xff\x00\x02\xff\xff\xff\x0c\xff\xff\xff\xfb\xff\xff\xff\x0c\x84\xff\xff\xff\x00\x05\xff\xff\xff\x23\xff\xff\xff\xfd\xff\xff\xff\x01\xff\xff\xff\x00\xff\xff\xff\x35\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x8f\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfa\x83\xff\xff\xff\x00\x02\xff\xff\xff\x4f\xff\xff\xff\xe3\xff\xff\xff\x0e\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x84\xff\xff\xff\x00\x02\xff\xff\xff\x2a\xff\xff\xff\xe8\xff\xff\xff\x2a\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x03\xff\xff\xff\x1b\xff\xff\xff\x52\xff\xff\xff\x20\xff\xff\xff\x58\x83\xff\xff\xff\x00\x03\xff\xff\xff\x06\xff\xff\xff\x08\xff\xff\xff\x07\xff\xff\xff\x04\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x01\xff\xff\xff\x26\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf6\x81\xff\xff\xff\x00\x01\xff\xff\xff\x22\xff\xff\xff\xff\x82\xff\xff\xff\xef\x04\xff\xff\xff\xf0\xff\xff\xff\xed\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x09\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x3d\xff\xff\xff\x76\xff\xff\xff\x2a\xff\xff\xff\xfb\xff\xff\xff\x0b\xff\xff\xff\x90\xff\xff\xff\x18\x8c\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x84\xff\xff\xff\x00\x01\xff\xff\xff\xac\xff\xff\xff\x9b\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x02\xff\xff\xff\x59\xff\xff\xff\xd7\xff\xff\xff\x0c\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x04\xff\xff\xff\x08\xff\xff\xff\xea\xff\xff\xff\x64\xff\xff\xff\xa4\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x03\xff\xff\xff\x52\xff\xff\xff\xc0\xff\xff\xff\xc2\xff\xff\xff\x31\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xef\x00\xff\xff\xff\xc2\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x02\xff\xff\xff\x0b\xff\xff\xff\xfb\xff\xff\xff\x28\x81\xff\xff\xff\x00\x04\xff\xff\xff\x3a\xff\xff\xff\xde\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x04\xff\xff\xff\x51\xff\xff\xff\xbd\xff\xff\xff\xfd\xff\xff\xff\xab\xff\xff\xff\x37\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x87\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x84\xff\xff\xff\x00\x02\xff\xff\xff\x18\xff\xff\xff\xed\xff\xff\xff\x43\x84\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x86\xff\xff\xff\x00\x01\xff\xff\xff\x94\xff\xff\xff\xaa\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x04\xff\xff\xff\x1c\xff\xff\xff\xff\xff\xff\xff\x24\xff\xff\xff\x34\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x04\xff\xff\xff\x07\xff\xff\xff\xf1\xff\xff\xff\x18\xff\xff\xff\x48\xff\xff\xff\xc9\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x08\xff\xff\xff\xa2\xff\xff\xff\xb6\xff\xff\xff\x0f\xff\xff\xff\x08\xff\xff\xff\xab\xff\xff\xff\x8b\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x04\xff\xff\xff\x52\xff\xff\xff\xbd\xff\xff\xff\xfd\xff\xff\xff\xab\xff\xff\xff\x37\x83\xff\xff\xff\x00\x01\xff\xff\xff\x20\xff\xff\xff\xd3\x87\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x02\xff\xff\xff\x64\xff\xff\xff\xde\xff\xff\xff\x0b\x81\xff\xff\xff\x00\x03\xff\xff\xff\x02\xff\xff\xff\xdf\xff\xff\xff\xe4\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x00\xff\xff\xff\xd0\x81\xff\xff\xff\xf3\x01\xff\xff\xff\xf5\xff\xff\xff\xff\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x03\xff\xff\xff\x8b\xff\xff\xff\xea\xff\xff\xff\xf2\xff\xff\xff\xf5\x82\xff\xff\xff\x00\x04\xff\xff\xff\x23\xff\xff\xff\xff\xff\xff\xff\x01\xff\xff\xff\x2d\xff\xff\xff\xf2\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x08\xff\xff\xff\x0a\xff\xff\xff\x98\xff\xff\xff\xea\xff\xff\xff\xef\xff\xff\xff\x9f\xff\xff\xff\x08\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x09\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x3d\xff\xff\xff\x75\xff\xff\xff\x2a\xff\xff\xff\xfb\xff\xff\xff\x0a\xff\xff\xff\x90\xff\xff\xff\x18\x8c\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x86\xff\xff\xff\x00\x01\xff\xff\xff\xbf\xff\xff\xff\x93\x90\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x03\xff\xff\xff\x20\xff\xff\xff\x00\xff\xff\xff\x59\xff\xff\xff\xdc\x82\xff\xff\xff\x00\x04\xff\xff\xff\x08\xff\xff\xff\xf4\xff\xff\xff\x3c\xff\xff\xff\x6a\xff\xff\xff\xcd\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x07\x00\xff\xff\xff\x06\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x91\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x04\xff\xff\xff\xf4\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x01\xff\xff\xff\xf4\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x8d\xff\xff\xff\x00\x03\xff\xff\xff\x7c\xff\xff\xff\xf3\xff\xff\xff\xf4\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x83\xff\xff\xff\xf3\x01\xff\xff\xff\xf8\xff\xff\xff\xfd\x83\xff\xff\xff\x00\x01\xff\xff\xff\x17\xff\xff\xff\x98\x8a\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x04\xff\xff\xff\xf4\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x01\xff\xff\xff\xf4\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x03\xff\xff\xff\x76\xff\xff\xff\xec\xff\xff\xff\xe8\xff\xff\xff\x54\x83\xff\xff\xff\x00\x03\xff\xff\xff\x5f\xff\xff\xff\xec\xff\xff\xff\xe1\xff\xff\xff\x3b\x81\xff\xff\xff\x00\x00\xff\xff\xff\x27\x83\xff\xff\xff\xff\x00\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x03\xff\xff\xff\xa2\xff\xff\xff\x49\xff\xff\xff\x54\xff\xff\xff\x95\x83\xff\xff\xff\x00\x02\xff\xff\xff\x1e\xff\xff\xff\xc1\xff\xff\xff\x15\x82\xff\xff\xff\x00\xb2\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\xbc\xff\xff\xff\x00\x03\xff\xff\xff\x0a\xff\xff\xff\xc7\xff\xff\xff\xc2\xff\xff\xff\x06\x84\xff\xff\xff\x00\x02\xff\xff\xff\x3b\xff\xff\xff\xca\xff\xff\xff\x11\x81\xff\xff\xff\x00\xe0\xff\xff\xff\x00\x04\xff\xff\xff\x21\xff\xff\xff\xb4\xff\xff\xff\x1c\xff\xff\xff\xbe\xff\xff\xff\x04\x83\xff\xff\xff\x00\x01\xff\xff\xff\x1b\xff\xff\xff\xbe\x93\xff\xff\xff\x00\xe1\xff\xff\xff\x00\x02\xff\xff\xff\x7d\xff\xff\xff\xe7\xff\xff\xff\x38\x85\xff\xff\xff\x00\x01\xff\xff\xff\x8b\xff\xff\xff\x65\x92\xff\xff\xff\x00\xff\xff\xff\xff\x00\xb8\xff\xff\xff\x00\x02\xff\xff\xff\xdd\xff\xff\xff\xe3\xff\xff\xff\x39\xc3\xff\xff\xff\x00\x01\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x04\xff\xff\xff\xf0\xff\xff\xff\xef\xff\xff\xff\x00\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x01\xff\xff\xff\xf0\xff\xff\xff\xef\xaa\xff\xff\xff\x00\x01\xff\xff\xff\x69\xff\xff\xff\xc9\x83\xff\xff\xff\x00\x01\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x04\xff\xff\xff\xf0\xff\xff\xff\xef\xff\xff\xff\x00\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x01\xff\xff\xff\xf0\xff\xff\xff\xef\xb0\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x75\xff\xff\xff\x80\xa5\xff\xff\xff\x00\x02\xff\xff\xff\x06\xff\xff\xff\xf2\xff\xff\xff\x26\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\xb0\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x02\xff\xff\xff\x0b\xff\xff\xff\xe7\xff\xff\xff\x10\x83\xff\xff\xff\x00\x03\xff\xff\xff\x67\xff\xff\xff\xef\xff\xff\xff\xec\xff\xff\xff\x84\x83\xff\xff\xff\x00\x02\xff\xff\xff\xf3\xff\xff\xff\xf4\xff\xff\xff\xff\x81\xff\xff\xff\xf3\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x03\xff\xff\xff\x47\xff\xff\xff\xf3\xff\xff\xff\xf4\xff\xff\xff\xff\x81\xff\xff\xff\xf3\x00\xff\xff\xff\x1d\x82\xff\xff\xff\x00\x02\xff\xff\xff\x1a\xff\xff\xff\xfc\xff\xff\xff\x7d\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x04\xff\xff\xff\x46\xff\xff\xff\xd1\xff\xff\xff\xe9\xff\xff\xff\xa7\xff\xff\xff\x1e\x89\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x83\xff\xff\xff\xf3\x00\xff\xff\xff\x15\x81\xff\xff\xff\x00\x04\xff\xff\xff\x41\xff\xff\xff\xd9\xff\xff\xff\xf9\xff\xff\xff\xc3\xff\xff\xff\x21\x82\xff\xff\xff\x00\x05\xff\xff\xff\x0b\xff\xff\xff\x96\xff\xff\xff\xe8\xff\xff\xff\xf3\xff\xff\xff\xd9\xff\xff\xff\x6e\x81\xff\xff\xff\x00\x04\xff\xff\xff\x6d\xff\xff\xff\xe7\xff\xff\xff\xc0\xff\xff\xff\x84\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\xa4\xff\xff\xff\x6d\x83\xff\xff\xff\x00\x04\xff\xff\xff\x21\xff\xff\xff\x05\xff\xff\xff\x18\xff\xff\xff\xd5\xff\xff\xff\x5e\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x02\xff\xff\xff\x72\xff\xff\xff\xd4\xff\xff\xff\xd5\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x09\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x08\xff\xff\xff\x9a\xff\xff\xff\x19\xff\xff\xff\x05\xff\xff\xff\x67\xff\xff\xff\xe2\xff\xff\xff\x1b\x88\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x05\xff\xff\xff\x02\xff\xff\xff\xe8\xff\xff\xff\x56\xff\xff\xff\x06\xff\xff\xff\x82\xff\xff\xff\xba\x82\xff\xff\xff\x00\x0c\xff\xff\xff\xa5\xff\xff\xff\x9e\xff\xff\xff\x0f\xff\xff\xff\x00\xff\xff\xff\x20\xff\xff\xff\x4d\xff\xff\xff\x00\xff\xff\xff\x07\xff\xff\xff\xf6\xff\xff\xff\x38\xff\xff\xff\x00\xff\xff\xff\x8a\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x63\xff\xff\xff\xb6\x86\xff\xff\xff\x00\x01\xff\xff\xff\x5f\xff\xff\xff\xbc\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x03\xff\xff\xff\xcd\xff\xff\xff\x4a\xff\xff\xff\xe2\xff\xff\xff\x2e\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x09\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x61\xff\xff\xff\x43\xff\xff\xff\xda\xff\xff\xff\xe7\xff\xff\xff\x4d\xff\xff\xff\x89\xff\xff\xff\x9d\x88\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x01\xff\xff\xff\x1d\xff\xff\xff\xfd\x81\xff\xff\xff\x00\x01\xff\xff\xff\x2a\xff\xff\xff\xec\x81\xff\xff\xff\x00\x02\xff\xff\xff\x0c\xff\xff\xff\xfb\xff\xff\xff\x0e\x84\xff\xff\xff\x00\x05\xff\xff\xff\x23\xff\xff\xff\xfd\xff\xff\xff\x01\xff\xff\xff\x00\xff\xff\xff\x35\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x3a\xff\xff\xff\xe5\x83\xff\xff\xff\x00\x04\xff\xff\xff\x40\xff\xff\xff\xd9\xff\xff\xff\xe3\xff\xff\xff\x84\xff\xff\xff\xe7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x84\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xec\xff\xff\xff\x04\xff\xff\xff\x8f\xff\xff\xff\x87\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x09\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x06\xff\xff\xff\xe6\xff\xff\xff\xd9\xff\xff\xff\x52\xff\xff\xff\x01\xff\xff\xff\x10\xff\xff\xff\x35\xff\xff\xff\xe5\x88\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x01\xff\xff\xff\x26\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf6\x81\xff\xff\xff\x00\x01\xff\xff\xff\x22\xff\xff\xff\xff\x82\xff\xff\xff\xd7\x04\xff\xff\xff\xda\xff\xff\xff\xe2\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x2c\xff\xff\xff\xf5\x83\xff\xff\xff\x00\x04\xff\xff\xff\xe3\xff\xff\xff\x65\xff\xff\xff\x02\xff\xff\xff\x98\xff\xff\xff\xf3\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x85\xff\xff\xff\x00\x02\xff\xff\xff\x6a\xff\xff\xff\xff\xff\xff\xff\x3f\x84\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x84\xff\xff\xff\x00\x04\xff\xff\xff\x81\xff\xff\xff\x9a\xff\xff\xff\x00\xff\xff\xff\x39\xff\xff\xff\xdf\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x21\xff\xff\xff\xfd\xff\xff\xff\xfc\xff\xff\xff\x01\x81\xff\xff\xff\x00\x01\xff\xff\xff\x35\xff\xff\xff\xea\x81\xff\xff\xff\x00\x04\xff\xff\xff\x3b\xff\xff\xff\xad\xff\xff\xff\xd2\xff\xff\xff\xa7\xff\xff\xff\x1b\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xef\x00\xff\xff\xff\xc2\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x02\xff\xff\xff\x0b\xff\xff\xff\xfb\xff\xff\xff\x2b\x81\xff\xff\xff\x00\x04\xff\xff\xff\x37\xff\xff\xff\xe0\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x39\xff\xff\xff\xe5\x82\xff\xff\xff\x00\x05\xff\xff\xff\x1e\xff\xff\xff\xff\xff\xff\xff\x05\xff\xff\xff\x00\xff\xff\xff\x37\xff\xff\xff\xea\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x84\xff\xff\xff\x00\x04\xff\xff\xff\x0f\xff\xff\xff\xe8\xff\xff\xff\x82\xff\xff\xff\xcd\xff\xff\xff\x01\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x84\xff\xff\xff\x00\x01\xff\xff\xff\xdb\xff\xff\xff\x42\x81\xff\xff\xff\x00\x04\xff\xff\xff\xe2\xff\xff\xff\x39\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x09\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x04\xff\xff\xff\xef\xff\xff\xff\xec\xff\xff\xff\x4f\xff\xff\xff\x01\xff\xff\xff\x12\xff\xff\xff\x86\xff\xff\xff\xa1\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x08\xff\xff\xff\xa2\xff\xff\xff\xbb\xff\xff\xff\x15\xff\xff\xff\x0d\xff\xff\xff\xad\xff\xff\xff\x8e\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x62\xff\xff\xff\xb6\x82\xff\xff\xff\x00\x05\xff\xff\xff\x1d\xff\xff\xff\xff\xff\xff\xff\x05\xff\xff\xff\x00\xff\xff\xff\x36\xff\xff\xff\xca\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x84\xff\xff\xff\x00\x04\xff\xff\xff\x8b\xff\xff\xff\xa3\xff\xff\xff\x00\xff\xff\xff\xcc\xff\xff\xff\x60\x82\xff\xff\xff\x00\x02\xff\xff\xff\xbc\xff\xff\xff\xe4\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x02\xff\xff\xff\x36\xff\xff\xff\xe7\xff\xff\xff\x02\x81\xff\xff\xff\x00\x04\xff\xff\xff\x8e\xff\xff\xff\x92\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x09\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x77\xff\xff\xff\xa8\xff\xff\xff\xe0\xff\xff\xff\xf3\xff\xff\xff\xb5\xff\xff\xff\xd5\xff\xff\xff\x17\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x08\xff\xff\xff\x0a\xff\xff\xff\x98\xff\xff\xff\xec\xff\xff\xff\xf2\xff\xff\xff\xa1\xff\xff\xff\x09\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\xa2\xff\xff\xff\x6b\x83\xff\xff\xff\x00\x04\xff\xff\xff\xe2\xff\xff\xff\x63\xff\xff\xff\x01\xff\xff\xff\x9b\xff\xff\xff\x7f\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x06\xff\xff\xff\x21\xff\xff\xff\xf2\xff\xff\xff\x20\xff\xff\xff\x00\xff\xff\xff\x46\xff\xff\xff\xe5\xff\xff\xff\x0b\x90\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x04\xff\xff\xff\x71\xff\xff\xff\xd8\xff\xff\xff\xe3\xff\xff\xff\x7b\xff\xff\xff\x0a\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x07\x00\xff\xff\xff\x06\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x84\xff\xff\xff\x00\x00\xff\xff\xff\x09\x8b\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x04\xff\xff\xff\xf4\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x01\xff\xff\xff\xf4\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x02\xff\xff\xff\x0b\xff\xff\xff\xe6\xff\xff\xff\x10\x83\xff\xff\xff\x00\x04\xff\xff\xff\x3f\xff\xff\xff\xda\xff\xff\xff\xf2\xff\xff\xff\xad\xff\xff\xff\x09\x82\xff\xff\xff\x00\x02\xff\xff\xff\xf3\xff\xff\xff\xf4\xff\xff\xff\xff\x81\xff\xff\xff\xf3\x81\xff\xff\xff\x00\x01\xff\xff\xff\xab\xff\xff\xff\x93\x82\xff\xff\xff\x00\x01\xff\xff\xff\xbe\xff\xff\xff\x82\x82\xff\xff\xff\x00\x01\xff\xff\xff\x17\xff\xff\xff\x98\x8b\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x04\xff\xff\xff\xf4\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x01\xff\xff\xff\xf4\xff\xff\xff\xf7\x89\xff\xff\xff\x00\x02\xff\xff\xff\x4f\xff\xff\xff\xb4\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x00\xff\xff\xff\x27\x83\xff\xff\xff\xff\x00\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x84\xff\xff\xff\x00\x01\xff\xff\xff\x71\xff\xff\xff\x98\x84\xff\xff\xff\x00\x02\xff\xff\xff\x39\xff\xff\xff\xb6\xff\xff\xff\x05\x82\xff\xff\xff\x00\x91\xff\xff\xff\x00\x01\xff\xff\xff\x74\xff\xff\xff\x80\x9d\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\xbf\xff\xff\xff\x00\x01\xff\xff\xff\x92\xff\xff\xff\x96\x82\xff\xff\xff\x00\x02\xff\xff\xff\x34\xff\xff\xff\xd2\xff\xff\xff\x15\x83\xff\xff\xff\x00\xe1\xff\xff\xff\x00\x02\xff\xff\xff\x2f\xff\xff\xff\xc0\xff\xff\xff\x01\x84\xff\xff\xff\x00\x02\xff\xff\xff\x0d\xff\xff\xff\xc6\xff\xff\xff\x06\x92\xff\xff\xff\x00\xe2\xff\xff\xff\x00\x01\xff\xff\xff\x99\xff\xff\xff\x71\x84\xff\xff\xff\x00\x01\xff\xff\xff\x91\xff\xff\xff\x5f\x93\xff\xff\xff\x00\xff\xff\xff\xff\x00\xd9\xff\xff\xff\x00\x02\xff\xff\xff\x4e\xff\xff\xff\xc0\xff\xff\xff\xc1\xa2\xff\xff\xff\x00\x01\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x04\xff\xff\xff\xf0\xff\xff\xff\xef\xff\xff\xff\x00\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x01\xff\xff\xff\xf0\xff\xff\xff\xef\xb0\xff\xff\xff\x00\x01\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x04\xff\xff\xff\xf0\xff\xff\xff\xef\xff\xff\xff\x00\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x01\xff\xff\xff\xf0\xff\xff\xff\xef\x8b\xff\xff\xff\x00\x01\xff\xff\xff\x0e\xff\xff\xff\xac\xa2\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x84\xff\xff\xff\x00\x01\xff\xff\xff\xae\xff\xff\xff\x47\xa9\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x98\xff\xff\xff\x00\x00\xff\xff\xff\x0f\x8e\xff\xff\xff\x00\x01\xff\xff\xff\x24\xff\xff\xff\x05\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x34\xff\xff\xff\xce\x83\xff\xff\xff\x00\x04\xff\xff\xff\x52\xff\xff\xff\xdd\xff\xff\xff\xf7\xff\xff\xff\xcd\xff\xff\xff\x31\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x95\xff\xff\xff\xaf\x82\xff\xff\xff\x00\x04\xff\xff\xff\x6e\xff\xff\xff\xcc\xff\xff\xff\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x09\xff\xff\xff\x35\xff\xff\xff\xe8\xff\xff\xff\x18\xff\xff\xff\x00\xff\xff\xff\x03\xff\xff\xff\xca\xff\xff\xff\x6c\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x90\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x83\xff\xff\xff\xf3\x07\xff\xff\xff\x15\xff\xff\xff\x00\xff\xff\xff\x88\xff\xff\xff\x69\xff\xff\xff\xbd\xff\xff\xff\xf4\xff\xff\xff\xe7\xff\xff\xff\x82\x82\xff\xff\xff\x00\x0c\xff\xff\xff\x0b\xff\xff\xff\x96\xff\xff\xff\xe8\xff\xff\xff\xf3\xff\xff\xff\xd9\xff\xff\xff\x6e\xff\xff\xff\x00\xff\xff\xff\x4e\xff\xff\xff\xa5\xff\xff\xff\xc2\xff\xff\xff\xf4\xff\xff\xff\xc1\xff\xff\xff\x18\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x9d\xff\xff\xff\x72\x82\xff\xff\xff\x00\x05\xff\xff\xff\x0a\xff\xff\xff\xf4\xff\xff\xff\x57\xff\xff\xff\x01\xff\xff\xff\x7f\xff\xff\xff\xce\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x09\xff\xff\xff\x0f\xff\xff\xff\xe7\xff\xff\xff\x47\xff\xff\xff\x00\xff\xff\xff\x0e\xff\xff\xff\xea\xff\xff\xff\x39\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x04\xff\xff\xff\x7c\xff\xff\xff\xb4\xff\xff\xff\x00\xff\xff\xff\x7d\xff\xff\xff\xb6\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x90\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x06\xff\xff\xff\x08\xff\xff\xff\xe7\xff\xff\xff\x9b\xff\xff\xff\x08\xff\xff\xff\x12\xff\xff\xff\xcb\xff\xff\xff\x62\x81\xff\xff\xff\x00\x05\xff\xff\xff\xa5\xff\xff\xff\x9e\xff\xff\xff\x0f\xff\xff\xff\x00\xff\xff\xff\x20\xff\xff\xff\x4d\x81\xff\xff\xff\x00\x02\xff\xff\xff\xd0\xff\xff\xff\x9e\xff\xff\xff\x02\x81\xff\xff\xff\x9f\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\xe5\xff\xff\xff\x33\x82\xff\xff\xff\x00\x05\xff\xff\xff\x1f\xff\xff\xff\xff\xff\xff\xff\x04\xff\xff\xff\x00\xff\xff\xff\x30\xff\xff\xff\xee\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x04\xff\xff\xff\x5b\xff\xff\xff\xd9\xff\xff\xff\x05\xff\xff\xff\x89\xff\xff\xff\xa3\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x04\xff\xff\xff\x02\xff\xff\xff\xc4\xff\xff\xff\x90\xff\xff\xff\xe5\xff\xff\xff\x17\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x90\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x0a\xff\xff\xff\x05\xff\xff\xff\xf9\xff\xff\xff\xb7\xff\xff\xff\x02\xff\xff\xff\x00\xff\xff\xff\x5b\xff\xff\xff\xbe\xff\xff\xff\x00\xff\xff\xff\x0c\xff\xff\xff\xfb\xff\xff\xff\x0e\x84\xff\xff\xff\x00\x05\xff\xff\xff\x0f\xff\xff\xff\xff\xff\xff\xff\xae\xff\xff\xff\x25\xff\xff\xff\x3c\xff\xff\xff\xe2\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x02\xff\xff\xff\x13\xff\xff\xff\xff\xff\xff\xff\x0c\x82\xff\xff\xff\x00\x05\xff\xff\xff\x02\xff\xff\xff\xd7\xff\xff\xff\x58\xff\xff\xff\x03\xff\xff\xff\x84\xff\xff\xff\xaa\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x03\xff\xff\xff\xbd\xff\xff\xff\x96\xff\xff\xff\xea\xff\xff\xff\x19\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x02\xff\xff\xff\x29\xff\xff\xff\xff\xff\xff\xff\x64\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x90\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x09\xff\xff\xff\x1d\xff\xff\xff\xfb\xff\xff\xff\x7b\xff\xff\xff\x8c\xff\xff\xff\x00\xff\xff\xff\x33\xff\xff\xff\xe8\xff\xff\xff\x00\xff\xff\xff\x22\xff\xff\xff\xff\x82\xff\xff\xff\xd7\x08\xff\xff\xff\xda\xff\xff\xff\xe2\xff\xff\xff\x00\xff\xff\xff\x24\xff\xff\xff\xfd\xff\xff\xff\x12\xff\xff\xff\xaf\xff\xff\xff\x2d\xff\xff\xff\xf3\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x22\xff\xff\xff\xff\x84\xff\xff\xff\x00\x04\xff\xff\xff\x23\xff\xff\xff\xe2\xff\xff\xff\xfc\xff\xff\xff\xcd\xff\xff\xff\x0e\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x81\xff\xff\xff\xef\x01\xff\xff\xff\xf1\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x02\xff\xff\xff\x29\xff\xff\xff\xff\xff\xff\xff\x7f\x82\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xff\xff\xff\xff\x0e\xff\xff\xff\x00\xff\xff\xff\x2e\xff\xff\xff\xf3\x83\xff\xff\xff\x00\x03\xff\xff\xff\x90\xff\xff\xff\xcd\xff\xff\xff\xc6\xff\xff\xff\x02\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x90\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xef\x00\xff\xff\xff\xc2\x81\xff\xff\xff\x00\x0a\xff\xff\xff\x25\xff\xff\xff\xfd\xff\xff\xff\x00\xff\xff\xff\xa7\xff\xff\xff\x5d\xff\xff\xff\x28\xff\xff\xff\xf4\xff\xff\xff\x00\xff\xff\xff\x0b\xff\xff\xff\xfb\xff\xff\xff\x2b\x81\xff\xff\xff\x00\x08\xff\xff\xff\x37\xff\xff\xff\xe0\xff\xff\xff\x00\xff\xff\xff\x13\xff\xff\xff\xff\xff\xff\xff\x0f\xff\xff\xff\x46\xff\xff\xff\xb8\xff\xff\xff\xe0\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x02\xff\xff\xff\x12\xff\xff\xff\xff\xff\xff\xff\x0c\x83\xff\xff\xff\x00\x04\xff\xff\xff\xc6\xff\xff\xff\x5e\xff\xff\xff\x03\xff\xff\xff\x87\xff\xff\xff\x9e\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x02\xff\xff\xff\x67\xff\xff\xff\xe8\xff\xff\xff\xc1\x82\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xff\xff\xff\xff\x78\xff\xff\xff\x01\xff\xff\xff\x7c\xff\xff\xff\xce\x82\xff\xff\xff\x00\x04\xff\xff\xff\x45\xff\xff\xff\xd9\xff\xff\xff\x0a\xff\xff\xff\xae\xff\xff\xff\x7d\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x90\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x06\xff\xff\xff\x18\xff\xff\xff\xff\xff\xff\xff\x0a\xff\xff\xff\x09\xff\xff\xff\xc5\xff\xff\xff\x60\xff\xff\xff\xeb\x81\xff\xff\xff\x00\x05\xff\xff\xff\xa2\xff\xff\xff\xbb\xff\xff\xff\x15\xff\xff\xff\x0d\xff\xff\xff\xad\xff\xff\xff\x8e\x81\xff\xff\xff\x00\x04\xff\xff\xff\xce\xff\xff\xff\x78\xff\xff\xff\x02\xff\xff\xff\xc6\xff\xff\xff\x9e\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\xe5\xff\xff\xff\x33\x82\xff\xff\xff\x00\x05\xff\xff\xff\x1d\xff\xff\xff\xff\xff\xff\xff\x04\xff\xff\xff\x00\xff\xff\xff\x30\xff\xff\xff\xed\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x04\xff\xff\xff\x12\xff\xff\xff\xeb\xff\xff\xff\x34\xff\xff\xff\xc6\xff\xff\xff\x60\x81\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x6e\xff\xff\xff\xe8\xff\xff\xff\xe7\xff\xff\xff\x47\x81\xff\xff\xff\x00\x09\xff\xff\xff\x12\xff\xff\xff\xe2\xff\xff\xff\x39\xff\xff\xff\x00\xff\xff\xff\x15\xff\xff\xff\xe4\xff\xff\xff\x35\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x90\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x86\xff\xff\xff\x00\x05\xff\xff\xff\xed\xff\xff\xff\x31\xff\xff\xff\x00\xff\xff\xff\x1c\xff\xff\xff\xe2\xff\xff\xff\xc9\x81\xff\xff\xff\x00\x05\xff\xff\xff\x0a\xff\xff\xff\x98\xff\xff\xff\xec\xff\xff\xff\xf2\xff\xff\xff\xa1\xff\xff\xff\x09\x81\xff\xff\xff\x00\x06\xff\xff\xff\x2f\xff\xff\xff\xd2\xff\xff\xff\xf3\xff\xff\xff\xaf\xff\xff\xff\xbb\xff\xff\xff\x22\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x9c\xff\xff\xff\x72\x82\xff\xff\xff\x00\x05\xff\xff\xff\x07\xff\xff\xff\xee\xff\xff\xff\x55\xff\xff\xff\x01\xff\xff\xff\x81\xff\xff\xff\xc8\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x08\xff\xff\xff\x99\xff\xff\xff\xa0\xff\xff\xff\x00\xff\xff\xff\x35\xff\xff\xff\xe9\xff\xff\xff\x12\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x8d\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x90\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x07\x00\xff\xff\xff\x06\x82\xff\xff\xff\x00\x05\xff\xff\xff\x91\xff\xff\xff\xaa\xff\xff\xff\x09\xff\xff\xff\x12\xff\xff\xff\xcc\xff\xff\xff\xac\x84\xff\xff\xff\x00\x00\xff\xff\xff\x09\x87\xff\xff\xff\x00\x02\xff\xff\xff\x1a\xff\xff\xff\x0b\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x04\xff\xff\xff\xf4\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x01\xff\xff\xff\xf4\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x34\xff\xff\xff\xce\x83\xff\xff\xff\x00\x04\xff\xff\xff\x40\xff\xff\xff\xd4\xff\xff\xff\xf5\xff\xff\xff\xc2\xff\xff\xff\x24\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x02\xff\xff\xff\x34\xff\xff\xff\xf2\xff\xff\xff\x1a\x81\xff\xff\xff\x00\x04\xff\xff\xff\xa1\xff\xff\xff\x9c\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x8d\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x04\xff\xff\xff\xf4\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x01\xff\xff\xff\xf4\xff\xff\xff\xf7\x90\xff\xff\xff\x00\x00\xff\xff\xff\x27\x83\xff\xff\xff\xff\x00\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x06\xff\xff\xff\x08\xff\xff\xff\x9d\xff\xff\xff\xec\xff\xff\xff\xef\xff\xff\xff\x9a\xff\xff\xff\x95\xff\xff\xff\x37\x81\xff\xff\xff\x00\x02\xff\xff\xff\x01\xff\xff\xff\xa3\xff\xff\xff\x64\x8a\xff\xff\xff\x00\x93\xff\xff\xff\x00\x01\xff\xff\xff\xae\xff\xff\xff\x47\x99\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x9e\xff\xff\xff\x00\x04\xff\xff\xff\x52\xff\xff\xff\xcc\xff\xff\xff\x02\xff\xff\xff\xf3\xff\xff\xff\x25\x97\xff\xff\xff\x00\x05\xff\xff\xff\x08\xff\xff\xff\x02\xff\xff\xff\x00\xff\xff\xff\x01\xff\xff\xff\xa1\xff\xff\xff\x86\x8b\xff\xff\xff\x00\xe1\xff\xff\xff\x00\x02\xff\xff\xff\x1a\xff\xff\xff\xcd\xff\xff\xff\x06\x9a\xff\xff\xff\x00\xe1\xff\xff\xff\x00\x01\xff\xff\xff\xb3\xff\xff\xff\x51\x9b\xff\xff\xff\x00\xff\xff\xff\xff\x00\xb0\xff\xff\xff\x00\x04\xff\xff\xff\x4c\xff\xff\xff\xe5\xff\xff\xff\xf2\xff\xff\xff\xb4\xff\xff\xff\x11\xab\xff\xff\xff\x00\x03\xff\xff\xff\x02\xff\xff\xff\xea\xff\xff\xff\xf1\xff\xff\xff\x76\x8b\xff\xff\xff\x00\x02\xff\xff\xff\x5e\xff\xff\xff\xf3\xff\xff\xff\x87\x8a\xff\xff\xff\x00\x01\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x04\xff\xff\xff\xf0\xff\xff\xff\xef\xff\xff\xff\x00\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x01\xff\xff\xff\xf0\xff\xff\xff\xef\xa1\xff\xff\xff\x00\x04\xff\xff\xff\x32\xff\xff\xff\x23\xff\xff\xff\x02\xff\xff\xff\x96\xff\xff\xff\x9a\x89\xff\xff\xff\x00\x01\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x04\xff\xff\xff\xf0\xff\xff\xff\xef\xff\xff\xff\x00\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x01\xff\xff\xff\xf0\xff\xff\xff\xef\x81\xff\xff\xff\x00\x03\xff\xff\xff\xbc\xff\xff\xff\xed\xff\xff\xff\xdd\xff\xff\xff\x4d\x8d\xff\xff\xff\x00\x02\xff\xff\xff\x08\xff\xff\xff\x47\xff\xff\xff\xcb\x8b\xff\xff\xff\x00\x02\xff\xff\xff\x07\xff\xff\xff\x05\xff\xff\xff\xbb\x8a\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\xa4\xff\xff\xff\x00\x01\xff\xff\xff\x36\xff\xff\xff\xe2\x89\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x03\xff\xff\xff\x3b\xff\xff\xff\x01\xff\xff\xff\x5e\xff\xff\xff\xe1\x8e\xff\xff\xff\x00\x01\xff\xff\xff\x79\xff\xff\xff\x6d\x8c\xff\xff\xff\x00\x01\xff\xff\xff\x25\xff\xff\xff\x83\x8a\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x8a\xff\xff\xff\x00\x01\xff\xff\xff\x8a\xff\xff\xff\xca\x85\xff\xff\xff\x00\x04\xff\xff\xff\x68\xff\xff\xff\xdb\xff\xff\xff\xf2\xff\xff\xff\xdc\xff\xff\xff\x6c\x81\xff\xff\xff\x00\x05\xff\xff\xff\xc2\xff\xff\xff\x85\xff\xff\xff\x00\xff\xff\xff\x4e\xff\xff\xff\xf9\xff\xff\xff\x02\x81\xff\xff\xff\x00\x04\xff\xff\xff\x2c\xff\xff\xff\xd8\xff\xff\xff\xeb\xff\xff\xff\x86\xff\xff\xff\xf5\x82\xff\xff\xff\x00\x04\xff\xff\xff\x93\xff\xff\xff\xb2\xff\xff\xff\x00\xff\xff\xff\x7a\xff\xff\xff\xcb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x63\xff\xff\xff\xe8\x8b\xff\xff\xff\x00\x04\xff\xff\xff\x02\xff\xff\xff\x8b\xff\xff\xff\xd9\xff\xff\xff\xdc\xff\xff\xff\xad\x8a\xff\xff\xff\x00\x04\xff\xff\xff\x16\xff\xff\xff\xac\xff\xff\xff\xd1\xff\xff\xff\xcd\xff\xff\xff\xa9\x89\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x8a\xff\xff\xff\x00\x02\xff\xff\xff\x23\xff\xff\xff\xfd\xff\xff\xff\x30\x83\xff\xff\xff\x00\x05\xff\xff\xff\x63\xff\xff\xff\xd2\xff\xff\xff\x25\xff\xff\xff\x00\xff\xff\xff\x46\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x05\xff\xff\xff\xe6\xff\xff\xff\xb9\xff\xff\xff\x00\xff\xff\xff\x83\xff\xff\xff\xfd\xff\xff\xff\x21\x81\xff\xff\xff\x00\x04\xff\xff\xff\xc7\xff\xff\xff\x7b\xff\xff\xff\x02\xff\xff\xff\x9f\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x08\xff\xff\xff\xcb\xff\xff\xff\xd9\xff\xff\xff\x04\xff\xff\xff\xb4\xff\xff\xff\xec\xff\xff\xff\x08\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x04\xff\xff\xff\x01\xff\xff\xff\x7f\xff\xff\xff\xf8\xff\xff\xff\xd1\xff\xff\xff\x0f\x8a\xff\xff\xff\x00\x04\xff\xff\xff\x7d\xff\xff\xff\xaf\xff\xff\xff\x04\xff\xff\xff\x00\xff\xff\xff\x37\x81\xff\xff\xff\x00\x06\xff\xff\xff\x03\xff\xff\xff\xaa\xff\xff\xff\x1c\xff\xff\xff\x00\xff\xff\xff\x06\xff\xff\xff\xa5\xff\xff\xff\x1a\x81\xff\xff\xff\x00\x01\xff\xff\xff\xba\xff\xff\xff\x8b\x81\xff\xff\xff\x00\x00\xff\xff\xff\x2a\x84\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x8b\xff\xff\xff\x00\x01\xff\xff\xff\xb8\xff\xff\xff\x96\x83\xff\xff\xff\x00\x01\xff\xff\xff\xdb\xff\xff\xff\x45\x81\xff\xff\xff\x00\x10\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x0c\xff\xff\xff\xe9\xff\xff\xff\xcd\xff\xff\xff\x00\xff\xff\xff\xb8\xff\xff\xff\xc5\xff\xff\xff\x46\xff\xff\xff\x00\xff\xff\xff\x10\xff\xff\xff\xff\xff\xff\xff\x12\xff\xff\xff\x00\xff\xff\xff\x3e\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x09\xff\xff\xff\x08\xff\xff\xff\xee\xff\xff\xff\x81\xff\xff\xff\x4b\xff\xff\xff\xaf\xff\xff\xff\xc0\xff\xff\xff\x3b\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x04\xff\xff\xff\x9f\xff\xff\xff\xd4\xff\xff\xff\x1f\xff\xff\xff\x8a\xff\xff\xff\xbc\x8a\xff\xff\xff\x00\x01\xff\xff\xff\xe5\xff\xff\xff\x34\x85\xff\xff\xff\x00\x04\xff\xff\xff\x6d\xff\xff\xff\xd8\xff\xff\xff\x1b\xff\xff\xff\xb2\xff\xff\xff\xa0\x81\xff\xff\xff\x00\x02\xff\xff\xff\x10\xff\xff\xff\xff\xff\xff\xff\x15\x87\xff\xff\xff\x00\x01\xff\xff\xff\x1c\xff\xff\xff\xb5\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x8b\xff\xff\xff\x00\x02\xff\xff\xff\x4e\xff\xff\xff\xf1\xff\xff\xff\x0a\x81\xff\xff\xff\x00\x02\xff\xff\xff\x13\xff\xff\xff\xff\xff\xff\xff\x0b\x81\xff\xff\xff\x00\x0c\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x32\xff\xff\xff\xcc\xff\xff\xff\xad\xff\xff\xff\x25\xff\xff\xff\xd2\xff\xff\xff\x90\xff\xff\xff\x6b\xff\xff\xff\x00\xff\xff\xff\x24\xff\xff\xff\xfd\x81\xff\xff\xff\x00\x01\xff\xff\xff\x2a\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x09\xff\xff\xff\x3b\xff\xff\xff\xc3\xff\xff\xff\x3c\xff\xff\xff\xcf\xff\xff\xff\x71\xff\xff\xff\x8c\xff\xff\xff\x73\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x08\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x17\xff\xff\xff\xff\xff\xff\xff\x24\xff\xff\xff\x00\xff\xff\xff\x52\xff\xff\xff\xe6\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x02\xff\xff\xff\x16\xff\xff\xff\xff\xff\xff\xff\x07\x86\xff\xff\xff\x00\x03\xff\xff\xff\x76\xff\xff\xff\xf4\xff\xff\xff\xac\xff\xff\xff\x02\x81\xff\xff\xff\x00\x01\xff\xff\xff\x23\xff\xff\xff\xfd\x86\xff\xff\xff\x00\x85\xff\xff\xff\x1b\x00\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x8b\xff\xff\xff\x00\x02\xff\xff\xff\x02\xff\xff\xff\xe1\xff\xff\xff\x63\x81\xff\xff\xff\x00\x01\xff\xff\xff\x23\xff\xff\xff\xfd\x81\xff\xff\xff\x00\x05\xff\xff\xff\x86\xff\xff\xff\xf0\xff\xff\xff\xef\xff\xff\xff\x00\xff\xff\xff\x57\xff\xff\xff\xae\x81\xff\xff\xff\x7d\x09\xff\xff\xff\xb3\xff\xff\xff\x72\xff\xff\xff\x90\xff\xff\xff\x00\xff\xff\xff\x10\xff\xff\xff\xff\xff\xff\xff\x12\xff\xff\xff\x00\xff\xff\xff\x3d\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x09\xff\xff\xff\x73\xff\xff\xff\x8f\xff\xff\xff\x04\xff\xff\xff\xe9\xff\xff\xff\x2c\xff\xff\xff\x58\xff\xff\xff\xab\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x08\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x0d\xff\xff\xff\xf3\xff\xff\xff\x07\xff\xff\xff\x77\xff\xff\xff\xe4\xff\xff\xff\x49\x83\xff\xff\xff\x00\x01\xff\xff\xff\x22\xff\xff\xff\xdb\x83\xff\xff\xff\x00\x01\xff\xff\xff\x24\xff\xff\xff\xfd\x87\xff\xff\xff\x00\x03\xff\xff\xff\xa0\xff\xff\xff\xdc\xff\xff\xff\xcc\xff\xff\xff\x0e\x81\xff\xff\xff\x00\x02\xff\xff\xff\x0b\xff\xff\xff\xfb\xff\xff\xff\x20\x85\xff\xff\xff\x00\x85\xff\xff\xff\xeb\x00\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x8c\xff\xff\xff\x00\x01\xff\xff\xff\x7c\xff\xff\xff\xca\x81\xff\xff\xff\x00\x02\xff\xff\xff\x13\xff\xff\xff\xff\xff\xff\xff\x0d\x84\xff\xff\xff\x00\x06\xff\xff\xff\x7c\xff\xff\xff\x90\xff\xff\xff\x4c\xff\xff\xff\xe2\xff\xff\xff\x81\xff\xff\xff\x54\xff\xff\xff\xb5\x81\xff\xff\xff\x00\x04\xff\xff\xff\xc7\xff\xff\xff\x7c\xff\xff\xff\x02\xff\xff\xff\xa0\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\xab\xff\xff\xff\x5c\x82\xff\xff\xff\x00\x04\xff\xff\xff\x25\xff\xff\xff\xe3\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x03\xff\xff\xff\x62\xff\xff\xff\xe7\xff\xff\xff\x8d\xff\xff\xff\x13\x8a\xff\xff\xff\x00\x02\xff\xff\xff\x16\xff\xff\xff\xff\xff\xff\xff\x0b\x85\xff\xff\xff\x00\x05\xff\xff\xff\x97\xff\xff\xff\xbb\xff\xff\xff\x07\xff\xff\xff\x8b\xff\xff\xff\xc4\xff\xff\xff\x0a\x81\xff\xff\xff\x00\x04\xff\xff\xff\xa8\xff\xff\xff\xab\xff\xff\xff\x0d\xff\xff\xff\x06\xff\xff\xff\x51\x84\xff\xff\xff\x00\x01\xff\xff\xff\x09\xff\xff\xff\x3d\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x87\xff\xff\xff\x00\x02\xff\xff\xff\x17\xff\xff\xff\xf9\xff\xff\xff\x30\x81\xff\xff\xff\x00\x01\xff\xff\xff\xda\xff\xff\xff\x4b\x84\xff\xff\xff\x00\x06\xff\xff\xff\xa2\xff\xff\xff\x72\xff\xff\xff\x1b\xff\xff\xff\xff\xff\xff\xff\x4f\xff\xff\xff\x36\xff\xff\xff\xda\x81\xff\xff\xff\x00\x04\xff\xff\xff\x2c\xff\xff\xff\xd7\xff\xff\xff\xec\xff\xff\xff\x8c\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\xe3\xff\xff\xff\x28\x83\xff\xff\xff\x00\x03\xff\xff\xff\xef\xff\xff\xff\x1b\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x07\xff\xff\xff\xd9\xff\xff\xff\x48\x8d\xff\xff\xff\x00\x01\xff\xff\xff\xe3\xff\xff\xff\x3e\x84\xff\xff\xff\x00\x02\xff\xff\xff\x02\xff\xff\xff\x7e\xff\xff\xff\x0a\x81\xff\xff\xff\x00\x01\xff\xff\xff\x78\xff\xff\xff\x13\x81\xff\xff\xff\x00\x04\xff\xff\xff\x0e\xff\xff\xff\xa1\xff\xff\xff\xed\xff\xff\xff\xee\xff\xff\xff\x91\x84\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x88\xff\xff\xff\x00\x01\xff\xff\xff\xa9\xff\xff\xff\x96\x81\xff\xff\xff\x00\x08\xff\xff\xff\x60\xff\xff\xff\xd8\xff\xff\xff\x29\xff\xff\xff\x00\xff\xff\xff\x21\xff\xff\xff\x57\xff\xff\xff\x00\xff\xff\xff\xc7\xff\xff\xff\x54\x82\xff\xff\xff\x00\x02\xff\xff\xff\x18\xff\xff\xff\xfa\xff\xff\xff\x03\x8f\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x07\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x18\xff\xff\xff\xfd\xff\xff\xff\x2f\xff\xff\xff\x00\xff\xff\xff\x30\x8b\xff\xff\xff\x00\x04\xff\xff\xff\x77\xff\xff\xff\xc4\xff\xff\xff\x13\xff\xff\xff\x07\xff\xff\xff\x52\x99\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x04\xff\xff\xff\xf4\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x01\xff\xff\xff\xf4\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x84\xff\xff\xff\x00\x83\xff\xff\xff\xf3\x01\xff\xff\xff\xf8\xff\xff\xff\xf1\x82\xff\xff\xff\x00\x07\xff\xff\xff\x64\xff\xff\xff\xd8\xff\xff\xff\xf3\xff\xff\xff\xdc\xff\xff\xff\x5e\xff\xff\xff\x00\xff\xff\xff\xec\xff\xff\xff\x36\x83\xff\xff\xff\x00\x01\xff\xff\xff\xf8\xff\xff\xff\x24\x8f\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x04\xff\xff\xff\xf4\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x01\xff\xff\xff\xf4\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x03\xff\xff\xff\x76\xff\xff\xff\xec\xff\xff\xff\xf0\xff\xff\xff\xb3\x8b\xff\xff\xff\x00\x04\xff\xff\xff\x01\xff\xff\xff\x87\xff\xff\xff\xe9\xff\xff\xff\xf0\xff\xff\xff\x98\x99\xff\xff\xff\x00\xff\xff\xff\xff\x00\xff\xff\xff\xff\x00\xff\xff\xff\xff\x00\xff\xff\xff\xff\x00\xd1\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\xab\xff\xff\xff\x00\x01\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x04\xff\xff\xff\xf0\xff\xff\xff\xef\xff\xff\xff\x00\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x01\xff\xff\xff\xf0\xff\xff\xff\xef\xb0\xff\xff\xff\x00\x01\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x04\xff\xff\xff\xf0\xff\xff\xff\xef\xff\xff\xff\x00\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x01\xff\xff\xff\xf0\xff\xff\xff\xef\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x86\xff\xff\xff\x00\x03\xff\xff\xff\x25\xff\xff\xff\xef\xff\xff\xff\x25\xff\xff\xff\xeb\xa0\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\xb0\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x86\xff\xff\xff\x00\x03\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x27\xff\xff\xff\xf7\xa0\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x0d\xff\xff\xff\x18\xff\xff\xff\xaf\xff\xff\xff\xf2\xff\xff\xff\xe9\xff\xff\xff\x97\xff\xff\xff\xa9\xff\xff\xff\xb9\xff\xff\xff\x00\xff\xff\xff\x0d\xff\xff\xff\xa4\xff\xff\xff\xed\xff\xff\xff\xf0\xff\xff\xff\xab\xff\xff\xff\x11\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x86\xff\xff\xff\x00\x02\xff\xff\xff\x3f\xff\xff\xff\xff\xff\xff\xff\x77\x84\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x02\xff\xff\xff\x3e\xff\xff\xff\xff\xff\xff\xff\x79\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x86\xff\xff\xff\x00\x0b\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\xc1\xff\xff\xff\x54\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xff\xff\xff\xff\xf3\xff\xff\xff\xeb\x81\xff\xff\xff\x00\x04\xff\xff\xff\x0d\xff\xff\xff\xa8\xff\xff\xff\xf1\xff\xff\xff\xea\xff\xff\xff\x88\x82\xff\xff\xff\x00\x0c\xff\xff\xff\x8f\xff\xff\xff\xf3\xff\xff\xff\xd6\xff\xff\xff\x5d\xff\xff\xff\xdf\xff\xff\xff\xf1\xff\xff\xff\x93\xff\xff\xff\x00\xff\xff\xff\x28\xff\xff\xff\xcd\xff\xff\xff\xf3\xff\xff\xff\xb8\xff\xff\xff\x12\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x0d\xff\xff\xff\xc7\xff\xff\xff\x96\xff\xff\xff\x0b\xff\xff\xff\x09\xff\xff\xff\xa6\xff\xff\xff\xfd\xff\xff\xff\x20\xff\xff\xff\x00\xff\xff\xff\x9a\xff\xff\xff\x8c\xff\xff\xff\x05\xff\xff\xff\x0a\xff\xff\xff\xa8\xff\xff\xff\xa5\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x86\xff\xff\xff\x00\x02\xff\xff\xff\x88\xff\xff\xff\xc1\xff\xff\xff\xbf\x84\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x02\xff\xff\xff\x93\xff\xff\xff\xbf\xff\xff\xff\xce\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x86\xff\xff\xff\x00\x09\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x7d\xff\xff\xff\x9e\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x14\xff\xff\xff\x99\xff\xff\xff\xaa\xff\xff\xff\x08\xff\xff\xff\x12\xff\xff\xff\xcb\xff\xff\xff\x65\xff\xff\xff\x00\xff\xff\xff\x19\xff\xff\xff\xff\xff\xff\xff\x1f\xff\xff\xff\x56\xff\xff\xff\xff\xff\xff\xff\x3f\xff\xff\xff\x01\xff\xff\xff\x32\xff\xff\xff\x00\xff\xff\xff\xc7\xff\xff\xff\x6e\xff\xff\xff\x01\xff\xff\xff\x98\xff\xff\xff\x99\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x0d\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x1b\xff\xff\xff\xef\xff\xff\xff\x04\xff\xff\xff\x00\xff\xff\xff\x1a\xff\xff\xff\xe9\xff\xff\xff\xbe\xff\xff\xff\x7d\xff\xff\xff\x00\xff\xff\xff\xf0\xff\xff\xff\x0b\x81\xff\xff\xff\x00\x01\xff\xff\xff\x35\xff\xff\xff\xeb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x86\xff\xff\xff\x00\x03\xff\xff\xff\xd1\xff\xff\xff\x43\xff\xff\xff\xf3\xff\xff\xff\x0d\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x84\xff\xff\xff\x00\x04\xff\xff\xff\x01\xff\xff\xff\xe6\xff\xff\xff\x2d\xff\xff\xff\xec\xff\xff\xff\x23\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x8b\xff\xff\xff\x00\x09\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x38\xff\xff\xff\xfd\xff\xff\xff\xef\xff\xff\xff\xf1\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x01\xff\xff\xff\xf0\xff\xff\xff\x2e\x81\xff\xff\xff\x00\x07\xff\xff\xff\x5a\xff\xff\xff\xbf\xff\xff\xff\x00\xff\xff\xff\x14\xff\xff\xff\xfd\xff\xff\xff\x31\xff\xff\xff\x29\xff\xff\xff\xfa\x82\xff\xff\xff\x00\x05\xff\xff\xff\x11\xff\xff\xff\xff\xff\xff\xff\x0f\xff\xff\xff\x00\xff\xff\xff\x3b\xff\xff\xff\xe1\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x0d\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x11\xff\xff\xff\xe2\xff\xff\xff\x00\xff\xff\xff\x01\xff\xff\xff\xbe\xff\xff\xff\x81\xff\xff\xff\x37\xff\xff\xff\xd2\xff\xff\xff\x19\xff\xff\xff\xff\xff\xff\xff\x0b\x81\xff\xff\xff\x00\x01\xff\xff\xff\x39\xff\xff\xff\xea\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x04\xff\xff\xff\x1b\xff\xff\xff\xf2\xff\xff\xff\x04\xff\xff\xff\xc0\xff\xff\xff\x51\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x84\xff\xff\xff\x00\x04\xff\xff\xff\x3d\xff\xff\xff\xd5\xff\xff\xff\x00\xff\xff\xff\x9e\xff\xff\xff\x78\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x0e\xff\xff\xff\x5d\x85\xff\xff\xff\x00\x0a\xff\xff\xff\x43\xff\xff\xff\x8c\xff\xff\xff\xfb\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x02\xff\xff\xff\xf0\xff\xff\xff\x26\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x02\xff\xff\xff\x19\xff\xff\xff\xff\xff\xff\xff\x06\x81\xff\xff\xff\x00\x01\xff\xff\xff\x33\xff\xff\xff\xe7\x81\xff\xff\xff\x00\x08\xff\xff\xff\x72\xff\xff\xff\xe4\xff\xff\xff\xf2\xff\xff\xff\xff\xff\xff\xff\xef\xff\xff\xff\xf0\xff\xff\xff\xee\xff\xff\xff\x24\xff\xff\xff\xfd\x81\xff\xff\xff\x00\x01\xff\xff\xff\x2a\xff\xff\xff\xf3\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x0d\xff\xff\xff\xad\xff\xff\xff\x4b\xff\xff\xff\x7a\xff\xff\xff\xba\xff\xff\xff\x01\xff\xff\xff\x27\xff\xff\xff\xf1\xff\xff\xff\x24\xff\xff\xff\xff\xff\xff\xff\x8d\xff\xff\xff\x08\xff\xff\xff\x0d\xff\xff\xff\xae\xff\xff\xff\xa2\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xef\x00\xff\xff\xff\x86\x81\xff\xff\xff\x00\x04\xff\xff\xff\x63\xff\xff\xff\xb6\xff\xff\xff\x00\xff\xff\xff\x7e\xff\xff\xff\x9a\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x84\xff\xff\xff\x00\x04\xff\xff\xff\x92\xff\xff\xff\x82\xff\xff\xff\x00\xff\xff\xff\x4b\xff\xff\xff\xcd\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x84\xff\xff\xff\x00\x00\xff\xff\xff\x90\x81\xff\xff\xff\xff\x02\xff\xff\xff\xfb\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x08\xff\xff\xff\xaf\xff\xff\xff\x62\xff\xff\xff\x27\xff\xff\xff\xff\xff\xff\xff\xef\xff\xff\xff\xa0\xff\xff\xff\x00\xff\xff\xff\x24\xff\xff\xff\xfc\x82\xff\xff\xff\x00\x01\xff\xff\xff\x2a\xff\xff\xff\xf3\x83\xff\xff\xff\x00\x0a\xff\xff\xff\x2a\xff\xff\xff\xf9\xff\xff\xff\x00\xff\xff\xff\x2a\xff\xff\xff\xec\xff\xff\xff\x12\xff\xff\xff\xff\xff\xff\xff\x10\xff\xff\xff\x00\xff\xff\xff\x3d\xff\xff\xff\xe1\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x03\xff\xff\xff\x10\xff\xff\xff\xc8\xff\xff\xff\xde\xff\xff\xff\x14\x82\xff\xff\xff\x00\x06\xff\xff\xff\x15\xff\xff\xff\xff\xff\xff\xff\x66\xff\xff\xff\xdd\xff\xff\xff\xeb\xff\xff\xff\xa6\xff\xff\xff\x10\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x04\xff\xff\xff\xac\xff\xff\xff\x75\xff\xff\xff\x00\xff\xff\xff\x3b\xff\xff\xff\xe3\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x09\xff\xff\xff\x01\xff\xff\xff\xe5\xff\xff\xff\x2f\xff\xff\xff\x00\xff\xff\xff\x06\xff\xff\xff\xf0\xff\xff\xff\x22\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x01\xff\xff\xff\x10\xff\xff\xff\xfc\x81\xff\xff\xff\xff\x02\xff\xff\xff\xfb\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x03\xff\xff\xff\x6b\xff\xff\xff\x9e\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x02\xff\xff\xff\x1b\xff\xff\xff\xff\xff\xff\xff\x02\x81\xff\xff\xff\x00\x01\xff\xff\xff\x3a\xff\xff\xff\xe8\x81\xff\xff\xff\x00\x0c\xff\xff\xff\x2e\xff\xff\xff\x03\xff\xff\xff\x6d\xff\xff\xff\xff\xff\xff\xff\x2d\xff\xff\xff\x60\xff\xff\xff\xc6\xff\xff\xff\x00\xff\xff\xff\xcc\xff\xff\xff\x76\xff\xff\xff\x02\xff\xff\xff\xa0\xff\xff\xff\x99\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x02\xff\xff\xff\x08\xff\xff\xff\xec\xff\xff\xff\x38\x84\xff\xff\xff\x00\x01\xff\xff\xff\xe1\xff\xff\xff\x42\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x84\xff\xff\xff\x00\x06\xff\xff\xff\x04\xff\xff\xff\xf0\xff\xff\xff\x33\xff\xff\xff\x00\xff\xff\xff\x04\xff\xff\xff\xf3\xff\xff\xff\x2c\x81\xff\xff\xff\x00\x02\xff\xff\xff\xdc\xff\xff\xff\xf4\xff\xff\xff\xff\x81\xff\xff\xff\xf3\x03\xff\xff\xff\x3c\xff\xff\xff\x00\xff\xff\xff\x3c\xff\xff\xff\xdc\x82\xff\xff\xff\x00\x04\xff\xff\xff\xa5\xff\xff\xff\x78\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x00\xff\xff\xff\x1e\x82\xff\xff\xff\xff\x02\xff\xff\xff\xfb\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x03\xff\xff\xff\x26\xff\xff\xff\xda\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x02\xff\xff\xff\x02\xff\xff\xff\xf5\xff\xff\xff\x1e\x81\xff\xff\xff\x00\x01\xff\xff\xff\x76\xff\xff\xff\xc1\x81\xff\xff\xff\x00\x0c\xff\xff\xff\x80\xff\xff\xff\xee\xff\xff\xff\xdf\xff\xff\xff\x7e\xff\xff\xff\xe8\xff\xff\xff\xe9\xff\xff\xff\x49\xff\xff\xff\x00\xff\xff\xff\x2c\xff\xff\xff\xcf\xff\xff\xff\xf3\xff\xff\xff\xb9\xff\xff\xff\x12\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x04\xff\xff\xff\x1b\xff\xff\xff\xfd\xff\xff\xff\x26\xff\xff\xff\x00\xff\xff\xff\x21\x82\xff\xff\xff\x00\x05\xff\xff\xff\x6f\xff\xff\xff\xd4\xff\xff\xff\x2a\xff\xff\xff\x00\xff\xff\xff\x12\xff\xff\xff\x1a\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x84\xff\xff\xff\x00\x02\xff\xff\xff\x3e\xff\xff\xff\xee\xff\xff\xff\x01\x81\xff\xff\xff\x00\x01\xff\xff\xff\xb7\xff\xff\xff\x75\x82\xff\xff\xff\x00\x01\xff\xff\xff\x25\xff\xff\xff\xfb\x8b\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x84\xff\xff\xff\x00\x00\xff\xff\xff\xd3\x81\xff\xff\xff\xff\x02\xff\xff\xff\xfb\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x02\xff\xff\xff\xe1\xff\xff\xff\x3e\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x05\xff\xff\xff\xac\xff\xff\xff\x81\xff\xff\xff\x06\xff\xff\xff\x48\xff\xff\xff\xee\xff\xff\xff\x69\x90\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x04\xff\xff\xff\xf4\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x01\xff\xff\xff\xf4\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x03\xff\xff\xff\x7d\xff\xff\xff\xe8\xff\xff\xff\xf0\xff\xff\xff\xa9\x83\xff\xff\xff\x00\x04\xff\xff\xff\x73\xff\xff\xff\xdd\xff\xff\xff\xf3\xff\xff\xff\xe0\xff\xff\xff\x40\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x03\xff\xff\xff\xe3\xff\xff\xff\x00\xff\xff\xff\x87\xff\xff\xff\xaf\x82\xff\xff\xff\x00\x01\xff\xff\xff\x74\xff\xff\xff\xbe\x82\xff\xff\xff\x00\x02\xff\xff\xff\x0d\xff\xff\xff\xfb\xff\xff\xff\x26\x8a\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x04\xff\xff\xff\xf4\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x01\xff\xff\xff\xf4\xff\xff\xff\xf7\x89\xff\xff\xff\x00\x05\xff\xff\xff\x1f\xff\xff\xff\xb2\xff\xff\xff\xf3\xff\xff\xff\xff\xff\xff\xff\xf4\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x04\xff\xff\xff\x9d\xff\xff\xff\xf7\xff\xff\xff\xff\xff\xff\xff\xf3\xff\xff\xff\xcc\x81\xff\xff\xff\x00\x04\xff\xff\xff\x1c\xff\xff\xff\xc6\xff\xff\xff\xf8\xff\xff\xff\xe0\xff\xff\xff\x81\x91\xff\xff\xff\x00\xb2\xff\xff\xff\x00\x03\xff\xff\xff\x79\xff\xff\xff\xf0\xff\xff\xff\xf3\xff\xff\xff\x3c\xc1\xff\xff\xff\x00\x03\xff\xff\xff\x15\xff\xff\xff\xcc\xff\xff\xff\x06\xff\xff\xff\xdc\x82\xff\xff\xff\x00\xe8\xff\xff\xff\x00\x04\xff\xff\xff\x0f\xff\xff\xff\xd7\xff\xff\xff\x07\xff\xff\xff\xff\xff\xff\xff\xe3\x91\xff\xff\xff\x00\xe8\xff\xff\xff\x00\x04\xff\xff\xff\x0f\xff\xff\xff\xd7\xff\xff\xff\x07\xff\xff\xff\xff\xff\xff\xff\xe3\x91\xff\xff\xff\x00\xff\xff\xff\xff\x00\xd7\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\xa5\xff\xff\xff\x00\x01\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x04\xff\xff\xff\xf0\xff\xff\xff\xef\xff\xff\xff\x00\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x01\xff\xff\xff\xf0\xff\xff\xff\xef\xb0\xff\xff\xff\x00\x01\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x04\xff\xff\xff\xf0\xff\xff\xff\xef\xff\xff\xff\x00\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x01\xff\xff\xff\xf0\xff\xff\xff\xef\x88\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\xa5\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\xb0\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x88\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\xa5\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x84\xff\xff\xff\x00\x09\xff\xff\xff\x7a\xff\xff\xff\xf1\xff\xff\xff\xd6\xff\xff\xff\x35\xff\xff\xff\x19\xff\xff\xff\xd6\xff\xff\xff\xf4\xff\xff\xff\xf0\xff\xff\xff\xa7\xff\xff\xff\x0f\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x83\xff\xff\xff\xf3\x00\xff\xff\xff\x15\x81\xff\xff\xff\x00\x04\xff\xff\xff\x41\xff\xff\xff\xd9\xff\xff\xff\xf4\xff\xff\xff\xc4\xff\xff\xff\x25\x82\xff\xff\xff\x00\x05\xff\xff\xff\x0b\xff\xff\xff\x96\xff\xff\xff\xe8\xff\xff\xff\xf3\xff\xff\xff\xd9\xff\xff\xff\x6e\x81\xff\xff\xff\x00\x04\xff\xff\xff\x6d\xff\xff\xff\xe7\xff\xff\xff\xc0\xff\xff\xff\x84\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x09\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\xa3\xff\xff\xff\xf3\xff\xff\xff\x9b\xff\xff\xff\xc8\xff\xff\xff\xa5\xff\xff\xff\x00\xff\xff\xff\xc3\xff\xff\xff\x71\x82\xff\xff\xff\x00\x01\xff\xff\xff\xa2\xff\xff\xff\x97\x81\xff\xff\xff\x00\x04\xff\xff\xff\x0d\xff\xff\xff\xa8\xff\xff\xff\xf1\xff\xff\xff\xea\xff\xff\xff\x88\x82\xff\xff\xff\x00\x05\xff\xff\xff\x7f\xff\xff\xff\xf1\xff\xff\xff\xe5\xff\xff\xff\x6d\xff\xff\xff\xff\xff\xff\xff\x1b\x81\xff\xff\xff\x00\x04\xff\xff\xff\x28\xff\xff\xff\xcc\xff\xff\xff\xf3\xff\xff\xff\xb8\xff\xff\xff\x12\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x0a\xff\xff\xff\x15\xff\xff\xff\xfc\xff\xff\xff\x25\xff\xff\xff\x57\xff\xff\xff\xd9\xff\xff\xff\x13\xff\xff\xff\x3c\xff\xff\xff\x01\xff\xff\xff\x0c\xff\xff\xff\xad\xff\xff\xff\xa1\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x05\xff\xff\xff\x02\xff\xff\xff\xe8\xff\xff\xff\x4c\xff\xff\xff\x00\xff\xff\xff\x79\xff\xff\xff\xbe\x82\xff\xff\xff\x00\x0c\xff\xff\xff\xa5\xff\xff\xff\x9b\xff\xff\xff\x0e\xff\xff\xff\x00\xff\xff\xff\x1f\xff\xff\xff\x4b\xff\xff\xff\x00\xff\xff\xff\x07\xff\xff\xff\xf6\xff\xff\xff\x38\xff\xff\xff\x00\xff\xff\xff\x8a\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x09\xff\xff\xff\x27\xff\xff\xff\xff\xff\xff\xff\x5b\xff\xff\xff\x02\xff\xff\xff\x98\xff\xff\xff\xfa\xff\xff\xff\x09\xff\xff\xff\x00\xff\xff\xff\x6b\xff\xff\xff\xc5\x81\xff\xff\xff\x00\x02\xff\xff\xff\x07\xff\xff\xff\xf1\xff\xff\xff\x3f\x81\xff\xff\xff\x00\x0d\xff\xff\xff\x99\xff\xff\xff\xaa\xff\xff\xff\x08\xff\xff\xff\x12\xff\xff\xff\xcb\xff\xff\xff\x65\xff\xff\xff\x00\xff\xff\xff\x17\xff\xff\xff\xef\xff\xff\xff\x1b\xff\xff\xff\x04\xff\xff\xff\x8b\xff\xff\xff\xff\xff\xff\xff\x1b\x81\xff\xff\xff\x00\x04\xff\xff\xff\xc7\xff\xff\xff\x75\xff\xff\xff\x02\xff\xff\xff\x9f\xff\xff\xff\x99\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x06\xff\xff\xff\x0a\xff\xff\xff\x00\xff\xff\xff\x13\xff\xff\xff\xfb\xff\xff\xff\x2a\xff\xff\xff\x5b\xff\xff\xff\xd1\x83\xff\xff\xff\x00\x01\xff\xff\xff\x36\xff\xff\xff\xea\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x01\xff\xff\xff\x1d\xff\xff\xff\xfd\x81\xff\xff\xff\x00\x01\xff\xff\xff\x2a\xff\xff\xff\xed\x81\xff\xff\xff\x00\x02\xff\xff\xff\x0c\xff\xff\xff\xfb\xff\xff\xff\x0c\x84\xff\xff\xff\x00\x05\xff\xff\xff\x23\xff\xff\xff\xfd\xff\xff\xff\x01\xff\xff\xff\x00\xff\xff\xff\x35\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xfd\xff\xff\xff\x04\xff\xff\xff\x00\xff\xff\xff\x35\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x06\xff\xff\xff\x16\xff\xff\xff\xfb\xff\xff\xff\xf2\xff\xff\xff\xef\xff\xff\xff\xf5\xff\xff\xff\xe4\xff\xff\xff\x01\x81\xff\xff\xff\x00\x01\xff\xff\xff\xf0\xff\xff\xff\x2e\x81\xff\xff\xff\x00\x10\xff\xff\xff\x5a\xff\xff\xff\xbf\xff\xff\xff\x00\xff\xff\xff\x11\xff\xff\xff\xef\xff\xff\xff\x30\xff\xff\xff\x00\xff\xff\xff\x15\xff\xff\xff\xff\xff\xff\xff\x1b\xff\xff\xff\x00\xff\xff\xff\x11\xff\xff\xff\xff\xff\xff\xff\x10\xff\xff\xff\x00\xff\xff\xff\x3d\xff\xff\xff\xe1\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x06\xff\xff\xff\x5d\xff\xff\xff\xb1\xff\xff\xff\x4c\xff\xff\xff\x71\xff\xff\xff\xea\xff\xff\xff\xbf\xff\xff\xff\x1f\x83\xff\xff\xff\x00\x01\xff\xff\xff\x39\xff\xff\xff\xe9\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x01\xff\xff\xff\x26\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf6\x81\xff\xff\xff\x00\x01\xff\xff\xff\x22\xff\xff\xff\xff\x82\xff\xff\xff\xef\x04\xff\xff\xff\xf0\xff\xff\xff\xed\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x06\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x77\xff\xff\xff\xef\xff\xff\xff\xf1\xff\xff\xff\xff\x81\xff\xff\xff\xef\x03\xff\xff\xff\x4d\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x04\xff\xff\xff\xbb\xff\xff\xff\x82\xff\xff\xff\x00\xff\xff\xff\xb3\xff\xff\xff\x8f\x81\xff\xff\xff\x00\x02\xff\xff\xff\x19\xff\xff\xff\xff\xff\xff\xff\x06\x81\xff\xff\xff\x00\x01\xff\xff\xff\x33\xff\xff\xff\xe7\x81\xff\xff\xff\x00\x08\xff\xff\xff\x5c\xff\xff\xff\xd5\xff\xff\xff\xf0\xff\xff\xff\xef\xff\xff\xff\xff\xff\xff\xff\x1a\xff\xff\xff\x00\xff\xff\xff\x24\xff\xff\xff\xfd\x81\xff\xff\xff\x00\x01\xff\xff\xff\x2a\xff\xff\xff\xf3\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x0b\xff\xff\xff\x0b\xff\xff\xff\x71\xff\xff\xff\xb7\xff\xff\xff\x5f\xff\xff\xff\x04\xff\xff\xff\x00\xff\xff\xff\x0e\xff\xff\xff\x28\xff\xff\xff\x00\xff\xff\xff\x19\xff\xff\xff\xbc\xff\xff\xff\x9b\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xef\x00\xff\xff\xff\xc2\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x02\xff\xff\xff\x0b\xff\xff\xff\xfb\xff\xff\xff\x28\x81\xff\xff\xff\x00\x04\xff\xff\xff\x3a\xff\xff\xff\xde\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x02\xff\xff\xff\x54\xff\xff\xff\xff\xff\xff\xff\x26\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x04\xff\xff\xff\x63\xff\xff\xff\xb5\xff\xff\xff\x00\xff\xff\xff\xe6\xff\xff\xff\x37\x81\xff\xff\xff\x00\x01\xff\xff\xff\x24\xff\xff\xff\xfc\x82\xff\xff\xff\x00\x01\xff\xff\xff\x29\xff\xff\xff\xf3\x84\xff\xff\xff\x00\x09\xff\xff\xff\x0e\xff\xff\xff\xff\xff\xff\xff\x15\xff\xff\xff\x00\xff\xff\xff\x12\xff\xff\xff\xff\xff\xff\xff\x10\xff\xff\xff\x00\xff\xff\xff\x3d\xff\xff\xff\xe1\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x0c\xff\xff\xff\x69\xff\xff\xff\xe7\xff\xff\xff\xdd\xff\xff\xff\x4c\xff\xff\xff\x5f\xff\xff\xff\xb8\xff\xff\xff\x54\xff\xff\xff\x27\xff\xff\xff\xff\xff\xff\xff\xe4\xff\xff\xff\xe9\xff\xff\xff\x9b\xff\xff\xff\x0b\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x08\xff\xff\xff\xa2\xff\xff\xff\xb6\xff\xff\xff\x0f\xff\xff\xff\x08\xff\xff\xff\xab\xff\xff\xff\x8b\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x0c\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x53\xff\xff\xff\xac\xff\xff\xff\xef\xff\xff\xff\xae\xff\xff\xff\xe2\xff\xff\xff\xa7\xff\xff\xff\x36\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x03\xff\xff\xff\x10\xff\xff\xff\xe3\xff\xff\xff\x1a\xff\xff\xff\xde\x82\xff\xff\xff\x00\x02\xff\xff\xff\x1a\xff\xff\xff\xff\xff\xff\xff\x07\x81\xff\xff\xff\x00\x01\xff\xff\xff\x34\xff\xff\xff\xe9\x81\xff\xff\xff\x00\x05\xff\xff\xff\x6a\xff\xff\xff\x3a\xff\xff\xff\x1b\xff\xff\xff\x82\xff\xff\xff\xe9\xff\xff\xff\x01\x81\xff\xff\xff\x00\x04\xff\xff\xff\xcc\xff\xff\xff\x76\xff\xff\xff\x02\xff\xff\xff\xa0\xff\xff\xff\x99\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x07\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x13\xff\xff\xff\xfb\xff\xff\xff\x2b\xff\xff\xff\x57\xff\xff\xff\xe2\x81\xff\xff\xff\x00\x02\xff\xff\xff\x13\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x08\xff\xff\xff\x0a\xff\xff\xff\x98\xff\xff\xff\xea\xff\xff\xff\xef\xff\xff\xff\x9f\xff\xff\xff\x08\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x04\xff\xff\xff\x79\xff\xff\xff\xb7\xff\xff\xff\x04\xff\xff\xff\xda\xff\xff\xff\x43\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x02\xff\xff\xff\xb3\xff\xff\xff\x6c\xff\xff\xff\x87\x82\xff\xff\xff\x00\x02\xff\xff\xff\x01\xff\xff\xff\xf3\xff\xff\xff\x31\x81\xff\xff\xff\x00\x01\xff\xff\xff\x5e\xff\xff\xff\xc5\x81\xff\xff\xff\x00\x04\xff\xff\xff\x6b\xff\xff\xff\xdd\xff\xff\xff\xf9\xff\xff\xff\xd3\xff\xff\xff\x3f\x82\xff\xff\xff\x00\x04\xff\xff\xff\x2c\xff\xff\xff\xcf\xff\xff\xff\xf3\xff\xff\xff\xb9\xff\xff\xff\x12\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x07\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x14\xff\xff\xff\xfc\xff\xff\xff\x2b\xff\xff\xff\x57\xff\xff\xff\xb8\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x91\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x09\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x1b\xff\xff\xff\xf0\xff\xff\xff\x2a\xff\xff\xff\x00\xff\xff\xff\x51\xff\xff\xff\xd9\xff\xff\xff\x06\x8a\xff\xff\xff\x00\x02\xff\xff\xff\x5b\xff\xff\xff\xd3\xff\xff\xff\x2f\x83\xff\xff\xff\x00\x05\xff\xff\xff\xa2\xff\xff\xff\xb2\xff\xff\xff\x11\xff\xff\xff\x1e\xff\xff\xff\xd1\xff\xff\xff\x72\x83\xff\xff\xff\x00\x00\xff\xff\xff\x01\x8b\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x04\xff\xff\xff\xf4\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x01\xff\xff\xff\xf4\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x03\xff\xff\xff\x74\xff\xff\xff\xeb\xff\xff\xff\xaf\xff\xff\xff\x0c\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x00\xff\xff\xff\x5a\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x00\xff\xff\xff\xef\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x91\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x04\xff\xff\xff\xf4\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x04\xff\xff\xff\xf4\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\xa7\xff\xff\xff\x97\x82\xff\xff\xff\x00\x01\xff\xff\xff\xc1\xff\xff\xff\x7c\x8a\xff\xff\xff\x00\x02\xff\xff\xff\x41\xff\xff\xff\xf4\xff\xff\xff\x1f\x83\xff\xff\xff\x00\x05\xff\xff\xff\x13\xff\xff\xff\xaf\xff\xff\xff\xf4\xff\xff\xff\xee\xff\xff\xff\x96\xff\xff\xff\x03\x81\xff\xff\xff\x00\x03\xff\xff\xff\x02\xff\xff\xff\xa5\xff\xff\xff\xb2\xff\xff\xff\x6d\x83\xff\xff\xff\x00\x03\xff\xff\xff\x3b\xff\xff\xff\x72\xff\xff\xff\xa3\xff\xff\xff\xbc\x82\xff\xff\xff\x00\xe0\xff\xff\xff\x00\x03\xff\xff\xff\x0d\xff\xff\xff\xf2\xff\xff\xff\x56\xff\xff\xff\xd2\x8b\xff\xff\xff\x00\x03\xff\xff\xff\x17\xff\xff\xff\xfa\xff\xff\xff\x43\xff\xff\xff\xeb\x83\xff\xff\xff\x00\x04\xff\xff\xff\x0a\xff\xff\xff\xe1\xff\xff\xff\x6a\xff\xff\xff\xa0\xff\xff\xff\x0c\x81\xff\xff\xff\x00\xe0\xff\xff\xff\x00\x03\xff\xff\xff\x14\xff\xff\xff\xfb\xff\xff\xff\x50\xff\xff\xff\xdc\x83\xff\xff\xff\x00\x04\xff\xff\xff\x26\xff\xff\xff\x81\xff\xff\xff\x36\xff\xff\xff\xba\xff\xff\xff\x72\x83\xff\xff\xff\x00\x02\xff\xff\xff\x6a\xff\xff\xff\xe2\xff\xff\xff\x5c\x8a\xff\xff\xff\x00\xe1\xff\xff\xff\x00\x02\xff\xff\xff\x66\xff\xff\xff\xde\xff\xff\xff\x3d\x83\xff\xff\xff\x00\x05\xff\xff\xff\x03\xff\xff\xff\xc3\xff\xff\xff\xd3\xff\xff\xff\x41\xff\xff\xff\xc2\xff\xff\xff\x02\x90\xff\xff\xff\x00\xff\xff\xff\xff\x00\xff\xff\xff\xff\x00\x01\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x04\xff\xff\xff\xf0\xff\xff\xff\xef\xff\xff\xff\x00\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x01\xff\xff\xff\xf0\xff\xff\xff\xef\xb0\xff\xff\xff\x00\x01\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x04\xff\xff\xff\xf0\xff\xff\xff\xef\xff\xff\xff\x00\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x01\xff\xff\xff\xf0\xff\xff\xff\xef\xb0\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\xab\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\xb0\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x08\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x10\xff\xff\xff\xaa\xff\xff\xff\xf1\xff\xff\xff\xff\xff\xff\xff\xd9\xff\xff\xff\x2b\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xff\xff\xff\xff\xf3\xff\xff\xff\xf0\xff\xff\xff\xbe\xff\xff\xff\x43\x84\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x04\xff\xff\xff\x2e\xff\xff\xff\xd7\xff\xff\xff\xec\xff\xff\xff\x8e\xff\xff\xff\xf7\x84\xff\xff\xff\x00\x06\xff\xff\xff\x88\xff\xff\xff\xec\xff\xff\xff\xe3\xff\xff\xff\x62\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x90\xff\xff\xff\x00\x01\xff\xff\xff\xd9\xff\xff\xff\x5f\x82\xff\xff\xff\x00\x01\xff\xff\xff\x8f\xff\xff\xff\xac\x81\xff\xff\xff\x00\x04\xff\xff\xff\x0d\xff\xff\xff\xa8\xff\xff\xff\xf1\xff\xff\xff\xea\xff\xff\xff\x88\x82\xff\xff\xff\x00\x04\xff\xff\xff\x83\xff\xff\xff\xf3\xff\xff\xff\xe0\xff\xff\xff\x78\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x04\xff\xff\xff\x28\xff\xff\xff\xcc\xff\xff\xff\xf3\xff\xff\xff\xb8\xff\xff\xff\x12\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x08\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x1d\xff\xff\xff\x69\xff\xff\xff\x2f\xff\xff\xff\xf7\xff\xff\xff\x60\xff\xff\xff\xc4\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x06\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x00\xff\xff\xff\x06\xff\xff\xff\x4d\xff\xff\xff\xe9\xff\xff\xff\x3c\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x04\xff\xff\xff\xc9\xff\xff\xff\x75\xff\xff\xff\x02\xff\xff\xff\xa2\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x02\xff\xff\xff\x13\xff\xff\xff\xff\xff\xff\xff\x29\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x4f\xff\xff\xff\x1a\x81\xff\xff\xff\x00\x01\xff\xff\xff\x32\xff\xff\xff\x36\x88\xff\xff\xff\x00\x01\xff\xff\xff\x8d\xff\xff\xff\xaf\x82\xff\xff\xff\x00\x01\xff\xff\xff\xdf\xff\xff\xff\x60\x81\xff\xff\xff\x00\x0c\xff\xff\xff\x99\xff\xff\xff\xaa\xff\xff\xff\x08\xff\xff\xff\x12\xff\xff\xff\xcb\xff\xff\xff\x65\xff\xff\xff\x00\xff\xff\xff\x18\xff\xff\xff\xff\xff\xff\xff\x2c\xff\xff\xff\x05\xff\xff\xff\xa0\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x04\xff\xff\xff\xc7\xff\xff\xff\x75\xff\xff\xff\x02\xff\xff\xff\x9f\xff\xff\xff\x99\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x03\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x2d\xff\xff\xff\xf1\x81\xff\xff\xff\x00\x00\xff\xff\xff\x27\x85\xff\xff\xff\xff\x81\xff\xff\xff\x27\x00\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x71\xff\xff\xff\xb0\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x05\xff\xff\xff\x11\xff\xff\xff\xff\xff\xff\xff\x10\xff\xff\xff\x00\xff\xff\xff\x3e\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x26\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x05\xff\xff\xff\x40\xff\xff\xff\xdc\xff\xff\xff\xcd\xff\xff\xff\xbe\xff\xff\xff\xda\xff\xff\xff\x26\x88\xff\xff\xff\x00\x06\xff\xff\xff\x41\xff\xff\xff\xfd\xff\xff\xff\xf0\xff\xff\xff\xef\xff\xff\xff\xf2\xff\xff\xff\xfc\xff\xff\xff\x15\x81\xff\xff\xff\x00\x01\xff\xff\xff\xf0\xff\xff\xff\x2e\x81\xff\xff\xff\x00\x08\xff\xff\xff\x5a\xff\xff\xff\xbf\xff\xff\xff\x00\xff\xff\xff\x11\xff\xff\xff\xfb\xff\xff\xff\x41\xff\xff\xff\x00\xff\xff\xff\x34\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x05\xff\xff\xff\x11\xff\xff\xff\xff\xff\xff\xff\x10\xff\xff\xff\x00\xff\xff\xff\x3d\xff\xff\xff\xe1\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x03\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x83\xff\xff\xff\xc9\x81\xff\xff\xff\x00\x05\xff\xff\xff\x0a\xff\xff\xff\xde\xff\xff\xff\x30\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x38\xff\xff\xff\xe4\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x24\xff\xff\xff\xfd\x81\xff\xff\xff\x00\x01\xff\xff\xff\x2a\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x04\xff\xff\xff\x0b\xff\xff\xff\xe3\xff\xff\xff\x2f\xff\xff\xff\x5b\xff\xff\xff\xbe\x89\xff\xff\xff\x00\x05\xff\xff\xff\x04\xff\xff\xff\xef\xff\xff\xff\x46\xff\xff\xff\x00\xff\xff\xff\x77\xff\xff\xff\xc7\x81\xff\xff\xff\x00\x02\xff\xff\xff\x19\xff\xff\xff\xff\xff\xff\xff\x06\x81\xff\xff\xff\x00\x01\xff\xff\xff\x33\xff\xff\xff\xe7\x81\xff\xff\xff\x00\x04\xff\xff\xff\x5f\xff\xff\xff\xd8\xff\xff\xff\xf0\xff\xff\xff\xf1\xff\xff\xff\xf6\x81\xff\xff\xff\x00\x01\xff\xff\xff\x24\xff\xff\xff\xfd\x81\xff\xff\xff\x00\x01\xff\xff\xff\x2a\xff\xff\xff\xf3\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x04\xff\xff\xff\x42\xff\xff\xff\xd6\xff\xff\xff\xff\xff\xff\xff\xdc\xff\xff\xff\x30\x82\xff\xff\xff\x00\x04\xff\xff\xff\x49\xff\xff\xff\xc7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x2a\xff\xff\xff\xf3\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x05\xff\xff\xff\x12\xff\xff\xff\xff\xff\xff\xff\x10\xff\xff\xff\x00\xff\xff\xff\x3e\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x04\xff\xff\xff\x0c\xff\xff\xff\xe3\xff\xff\xff\x2b\xff\xff\xff\x56\xff\xff\xff\xc2\x8a\xff\xff\xff\x00\x04\xff\xff\xff\xa9\xff\xff\xff\x88\xff\xff\xff\x00\xff\xff\xff\xb9\xff\xff\xff\x7a\x81\xff\xff\xff\x00\x01\xff\xff\xff\x24\xff\xff\xff\xfc\x82\xff\xff\xff\x00\x01\xff\xff\xff\x29\xff\xff\xff\xf3\x84\xff\xff\xff\x00\x01\xff\xff\xff\x2d\xff\xff\xff\xf1\x81\xff\xff\xff\x00\x05\xff\xff\xff\x12\xff\xff\xff\xff\xff\xff\xff\x10\xff\xff\xff\x00\xff\xff\xff\x3d\xff\xff\xff\xe1\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x06\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x05\xff\xff\xff\xed\xff\xff\xff\x94\xff\xff\xff\xf7\x85\xff\xff\xff\x00\x03\xff\xff\xff\xa3\xff\xff\xff\x65\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x39\xff\xff\xff\xe5\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x04\xff\xff\xff\xcc\xff\xff\xff\x76\xff\xff\xff\x02\xff\xff\xff\xa4\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x05\xff\xff\xff\x41\xff\xff\xff\xd9\xff\xff\xff\xcc\xff\xff\xff\xbf\xff\xff\xff\xd9\xff\xff\xff\x24\x89\xff\xff\xff\x00\x04\xff\xff\xff\x5d\xff\xff\xff\xca\xff\xff\xff\x05\xff\xff\xff\xf4\xff\xff\xff\x2e\x81\xff\xff\xff\x00\x02\xff\xff\xff\x1a\xff\xff\xff\xff\xff\xff\xff\x07\x81\xff\xff\xff\x00\x01\xff\xff\xff\x34\xff\xff\xff\xe9\x81\xff\xff\xff\x00\x04\xff\xff\xff\x54\xff\xff\xff\x1e\xff\xff\xff\x01\xff\xff\xff\x86\xff\xff\xff\xc9\x82\xff\xff\xff\x00\x04\xff\xff\xff\xcc\xff\xff\xff\x76\xff\xff\xff\x02\xff\xff\xff\xa0\xff\xff\xff\x99\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x06\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x22\xff\xff\xff\xff\xff\xff\xff\x2a\xff\xff\xff\xf7\x85\xff\xff\xff\x00\x03\xff\xff\xff\x12\xff\xff\xff\xd6\xff\xff\xff\x3c\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x72\xff\xff\xff\xb5\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x04\xff\xff\xff\x2f\xff\xff\xff\xd7\xff\xff\xff\xec\xff\xff\xff\x8e\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x02\xff\xff\xff\xdc\xff\xff\xff\xf4\xff\xff\xff\xff\x81\xff\xff\xff\xf3\x03\xff\xff\xff\x69\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x4d\xff\xff\xff\x1a\x81\xff\xff\xff\x00\x01\xff\xff\xff\x30\xff\xff\xff\x39\x89\xff\xff\xff\x00\x03\xff\xff\xff\x13\xff\xff\xff\xf9\xff\xff\xff\x4e\xff\xff\xff\xe0\x82\xff\xff\xff\x00\x02\xff\xff\xff\x01\xff\xff\xff\xf3\xff\xff\xff\x31\x81\xff\xff\xff\x00\x01\xff\xff\xff\x5e\xff\xff\xff\xc5\x81\xff\xff\xff\x00\x04\xff\xff\xff\x68\xff\xff\xff\xe0\xff\xff\xff\xf5\xff\xff\xff\xcb\xff\xff\xff\x2e\x82\xff\xff\xff\x00\x04\xff\xff\xff\x2c\xff\xff\xff\xcf\xff\xff\xff\xf3\xff\xff\xff\xb9\xff\xff\xff\x12\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x08\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x0b\xff\xff\xff\xf7\xff\xff\xff\x5a\xff\xff\xff\xf7\xff\xff\xff\x21\xff\xff\xff\x30\x84\xff\xff\xff\x00\x02\xff\xff\xff\x55\xff\xff\xff\xc4\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x06\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x00\xff\xff\xff\x06\xff\xff\xff\x4d\xff\xff\xff\xeb\xff\xff\xff\x47\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x86\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x92\xff\xff\xff\x00\x02\xff\xff\xff\xc5\xff\xff\xff\xce\xff\xff\xff\x95\x83\xff\xff\xff\x00\x05\xff\xff\xff\xa2\xff\xff\xff\xb2\xff\xff\xff\x11\xff\xff\xff\x1e\xff\xff\xff\xd1\xff\xff\xff\x72\x90\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x04\xff\xff\xff\xf4\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x01\xff\xff\xff\xf4\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x04\xff\xff\xff\x68\xff\xff\xff\xea\xff\xff\xff\xff\xff\xff\xff\xdc\xff\xff\xff\x40\x85\xff\xff\xff\x00\x01\xff\xff\xff\xae\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xff\xff\xff\xff\xf3\xff\xff\xff\xf1\xff\xff\xff\xc5\xff\xff\xff\x50\x82\xff\xff\xff\x00\x81\xff\xff\xff\xf3\x01\xff\xff\xff\xf4\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x04\xff\xff\xff\xf4\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x01\xff\xff\xff\xf4\xff\xff\xff\xf7\x8a\xff\xff\xff\x00\x02\xff\xff\xff\x06\xff\xff\xff\xb8\xff\xff\xff\x36\x84\xff\xff\xff\x00\x02\xff\xff\xff\x79\xff\xff\xff\xff\xff\xff\xff\x49\x83\xff\xff\xff\x00\x05\xff\xff\xff\x13\xff\xff\xff\xaf\xff\xff\xff\xf4\xff\xff\xff\xee\xff\xff\xff\x96\xff\xff\xff\x03\x89\xff\xff\xff\x00\x03\xff\xff\xff\x08\xff\xff\xff\xae\xff\xff\xff\x20\xff\xff\xff\xa5\x82\xff\xff\xff\x00\x91\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x9f\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\xa4\xff\xff\xff\x00\x02\xff\xff\xff\x16\xff\xff\xff\xd0\xff\xff\xff\x2e\x93\xff\xff\xff\x00\x03\xff\xff\xff\xcc\xff\xff\xff\x06\xff\xff\xff\xf3\xff\xff\xff\x12\x83\xff\xff\xff\x00\x02\xff\xff\xff\x44\xff\xff\xff\xe4\xff\xff\xff\x21\x82\xff\xff\xff\x00\xe0\xff\xff\xff\x00\x04\xff\xff\xff\x51\xff\xff\xff\xc9\xff\xff\xff\x02\xff\xff\xff\xef\xff\xff\xff\x24\x82\xff\xff\xff\x00\x04\xff\xff\xff\x01\xff\xff\xff\xba\xff\xff\xff\x3c\xff\xff\xff\x65\xff\xff\xff\x95\x91\xff\xff\xff\x00\xe9\xff\xff\xff\x00\x03\xff\xff\xff\x1e\xff\xff\xff\xdd\xff\xff\xff\xd3\xff\xff\xff\x09\x91\xff\xff\xff\x00\xff\xff\xff\xff\x00\xff\xff\xff\xff\x00\x01\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x04\xff\xff\xff\xf0\xff\xff\xff\xef\xff\xff\xff\x00\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x01\xff\xff\xff\xf0\xff\xff\xff\xef\xb0\xff\xff\xff\x00\x01\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x04\xff\xff\xff\xf0\xff\xff\xff\xef\xff\xff\xff\x00\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x01\xff\xff\xff\xf0\xff\xff\xff\xef\xb0\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\xb0\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\xb0\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x07\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x02\xff\xff\xff\xe6\xff\xff\xff\x00\xff\xff\xff\x9d\xff\xff\xff\x50\x82\xff\xff\xff\x00\x05\xff\xff\xff\x72\xff\xff\xff\xdc\xff\xff\xff\xf3\xff\xff\xff\xee\xff\xff\xff\xa2\xff\xff\xff\x0f\x82\xff\xff\xff\x00\x04\xff\xff\xff\x02\xff\xff\xff\x8b\xff\xff\xff\xea\xff\xff\xff\xf1\xff\xff\xff\x9b\x81\xff\xff\xff\x00\x05\xff\xff\xff\x04\xff\xff\xff\xb0\xff\xff\xff\xed\xff\xff\xff\xf5\xff\xff\xff\xc6\xff\xff\xff\x2b\x82\xff\xff\xff\x00\x01\xff\xff\xff\x0f\xff\xff\xff\xa4\x81\xff\xff\xff\xee\x00\xff\xff\xff\x92\x81\xff\xff\xff\x00\x05\xff\xff\xff\x18\xff\xff\xff\xc2\xff\xff\xff\xf1\xff\xff\xff\xf4\xff\xff\xff\xc9\xff\xff\xff\x37\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x02\xff\xff\xff\xf3\xff\xff\xff\xf4\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x88\xff\xff\xff\x00\x01\xff\xff\xff\xa1\xff\xff\xff\x97\x82\xff\xff\xff\x00\x01\xff\xff\xff\x5f\xff\xff\xff\xdc\x81\xff\xff\xff\x00\x04\xff\xff\xff\x0d\xff\xff\xff\xa8\xff\xff\xff\xf1\xff\xff\xff\xea\xff\xff\xff\x88\x82\xff\xff\xff\x00\x04\xff\xff\xff\x83\xff\xff\xff\xf3\xff\xff\xff\xe0\xff\xff\xff\x78\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x04\xff\xff\xff\x28\xff\xff\xff\xcc\xff\xff\xff\xf3\xff\xff\xff\xb8\xff\xff\xff\x12\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x03\xff\xff\xff\xc6\xff\xff\xff\x25\xff\xff\xff\x68\xff\xff\xff\x83\x82\xff\xff\xff\x00\x05\xff\xff\xff\x58\xff\xff\xff\x28\xff\xff\xff\x00\xff\xff\xff\x12\xff\xff\xff\xb5\xff\xff\xff\xa5\x82\xff\xff\xff\x00\x04\xff\xff\xff\x7d\xff\xff\xff\xc0\xff\xff\xff\x12\xff\xff\xff\x05\xff\xff\xff\x4f\x81\xff\xff\xff\x00\x05\xff\xff\xff\x08\xff\xff\xff\x6e\xff\xff\xff\x0b\xff\xff\xff\x04\xff\xff\xff\x8a\xff\xff\xff\xc7\x82\xff\xff\xff\x00\x04\xff\xff\xff\xac\xff\xff\xff\xa6\xff\xff\xff\x0c\xff\xff\xff\x05\xff\xff\xff\x4d\x81\xff\xff\xff\x00\x05\xff\xff\xff\x16\xff\xff\xff\x4d\xff\xff\xff\x09\xff\xff\xff\x01\xff\xff\xff\x72\xff\xff\xff\xd9\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x8b\xff\xff\xff\x00\x01\xff\xff\xff\x55\xff\xff\xff\xe5\x82\xff\xff\xff\x00\x01\xff\xff\xff\xb0\xff\xff\xff\x90\x81\xff\xff\xff\x00\x0c\xff\xff\xff\x99\xff\xff\xff\xaa\xff\xff\xff\x08\xff\xff\xff\x12\xff\xff\xff\xcb\xff\xff\xff\x65\xff\xff\xff\x00\xff\xff\xff\x18\xff\xff\xff\xff\xff\xff\xff\x2c\xff\xff\xff\x05\xff\xff\xff\xa0\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x04\xff\xff\xff\xc7\xff\xff\xff\x75\xff\xff\xff\x02\xff\xff\xff\x9f\xff\xff\xff\x99\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x03\xff\xff\xff\x93\xff\xff\xff\x5a\xff\xff\xff\x33\xff\xff\xff\xb7\x86\xff\xff\xff\x00\x01\xff\xff\xff\x38\xff\xff\xff\xef\x82\xff\xff\xff\x00\x01\xff\xff\xff\xe5\xff\xff\xff\x3c\x88\xff\xff\xff\x00\x01\xff\xff\xff\x30\xff\xff\xff\xf1\x81\xff\xff\xff\x00\x02\xff\xff\xff\x0d\xff\xff\xff\xfc\xff\xff\xff\x1c\x87\xff\xff\xff\x00\x02\xff\xff\xff\x03\xff\xff\xff\x75\xff\xff\xff\xe2\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x8b\xff\xff\xff\x00\x06\xff\xff\xff\x0e\xff\xff\xff\xf9\xff\xff\xff\xf2\xff\xff\xff\xef\xff\xff\xff\xf0\xff\xff\xff\xfd\xff\xff\xff\x43\x81\xff\xff\xff\x00\x01\xff\xff\xff\xf0\xff\xff\xff\x2e\x81\xff\xff\xff\x00\x08\xff\xff\xff\x5b\xff\xff\xff\xbf\xff\xff\xff\x00\xff\xff\xff\x11\xff\xff\xff\xfb\xff\xff\xff\x41\xff\xff\xff\x00\xff\xff\xff\x34\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x05\xff\xff\xff\x10\xff\xff\xff\xff\xff\xff\xff\x10\xff\xff\xff\x00\xff\xff\xff\x3d\xff\xff\xff\xe1\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x09\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\xeb\xff\xff\xff\xf4\xff\xff\xff\xf8\xff\xff\xff\xef\xff\xff\xff\xfc\xff\xff\xff\xef\xff\xff\xff\x7e\x84\xff\xff\xff\x00\x01\xff\xff\xff\x39\xff\xff\xff\xe8\x81\xff\xff\xff\x00\x02\xff\xff\xff\x16\xff\xff\xff\xff\xff\xff\xff\x09\x87\xff\xff\xff\x00\x02\xff\xff\xff\x0b\xff\xff\xff\x95\xff\xff\xff\xc9\x81\xff\xff\xff\x00\x01\xff\xff\xff\x23\xff\xff\xff\xfd\x86\xff\xff\xff\x00\x04\xff\xff\xff\x4c\xff\xff\xff\xba\xff\xff\xff\xf1\xff\xff\xff\xd4\xff\xff\xff\x45\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x85\xff\xff\xff\x00\x03\xff\xff\xff\x96\xff\xff\xff\xee\xff\xff\xff\xdb\xff\xff\xff\x50\x82\xff\xff\xff\x00\x09\xff\xff\xff\xbd\xff\xff\xff\x7d\xff\xff\xff\x00\xff\xff\xff\x46\xff\xff\xff\xf1\xff\xff\xff\x04\xff\xff\xff\x00\xff\xff\xff\x19\xff\xff\xff\xff\xff\xff\xff\x06\x81\xff\xff\xff\x00\x01\xff\xff\xff\x33\xff\xff\xff\xe7\x81\xff\xff\xff\x00\x04\xff\xff\xff\x5f\xff\xff\xff\xd8\xff\xff\xff\xf0\xff\xff\xff\xf1\xff\xff\xff\xf6\x81\xff\xff\xff\x00\x01\xff\xff\xff\x23\xff\xff\xff\xfd\x81\xff\xff\xff\x00\x01\xff\xff\xff\x29\xff\xff\xff\xf3\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x04\xff\xff\xff\x0e\xff\xff\xff\xd7\xff\xff\xff\x07\xff\xff\xff\x9f\xff\xff\xff\x4e\x84\xff\xff\xff\x00\x02\xff\xff\xff\x16\xff\xff\xff\xbc\xff\xff\xff\x88\x81\xff\xff\xff\x00\x01\xff\xff\xff\x24\xff\xff\xff\xfd\x86\xff\xff\xff\x00\x04\xff\xff\xff\x30\xff\xff\xff\xb5\xff\xff\xff\xf7\xff\xff\xff\xcc\xff\xff\xff\x28\x81\xff\xff\xff\x00\x02\xff\xff\xff\x0d\xff\xff\xff\xfc\xff\xff\xff\x1c\x84\xff\xff\xff\x00\x03\xff\xff\xff\x10\xff\xff\xff\xf9\xff\xff\xff\x5c\xff\xff\xff\x0d\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x02\xff\xff\xff\xa7\xff\xff\xff\xf1\xff\xff\xff\xff\x81\xff\xff\xff\xef\x00\xff\xff\xff\x20\x82\xff\xff\xff\x00\x03\xff\xff\xff\x24\xff\xff\xff\x01\xff\xff\xff\x63\xff\xff\xff\xe8\x82\xff\xff\xff\x00\x04\xff\xff\xff\x71\xff\xff\xff\xbe\xff\xff\xff\x00\xff\xff\xff\x87\xff\xff\xff\xaa\x81\xff\xff\xff\x00\x01\xff\xff\xff\x24\xff\xff\xff\xfc\x82\xff\xff\xff\x00\x01\xff\xff\xff\x29\xff\xff\xff\xf3\x84\xff\xff\xff\x00\x01\xff\xff\xff\x2d\xff\xff\xff\xf1\x81\xff\xff\xff\x00\x05\xff\xff\xff\x13\xff\xff\xff\xff\xff\xff\xff\x0f\xff\xff\xff\x00\xff\xff\xff\x3c\xff\xff\xff\xe1\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x4a\xff\xff\xff\xef\xff\xff\xff\xf9\x81\xff\xff\xff\xf3\x08\xff\xff\xff\xf9\xff\xff\xff\xef\xff\xff\xff\x2f\xff\xff\xff\x00\xff\xff\xff\x24\xff\xff\xff\xef\xff\xff\xff\xfd\xff\xff\xff\xc4\xff\xff\xff\x0f\x81\xff\xff\xff\x00\x02\xff\xff\xff\x16\xff\xff\xff\xff\xff\xff\xff\x0a\x84\xff\xff\xff\x00\x03\xff\xff\xff\x07\xff\xff\xff\xeb\xff\xff\xff\x9a\xff\xff\xff\x2b\x84\xff\xff\xff\x00\x04\xff\xff\xff\xac\xff\xff\xff\xa7\xff\xff\xff\x0c\xff\xff\xff\x06\xff\xff\xff\x4e\x81\xff\xff\xff\x00\x05\xff\xff\xff\x14\xff\xff\xff\xfc\xff\xff\xff\x35\xff\xff\xff\x00\xff\xff\xff\x13\xff\xff\xff\x36\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x87\xff\xff\xff\x00\x01\xff\xff\xff\x5c\xff\xff\xff\xd5\x82\xff\xff\xff\x00\x04\xff\xff\xff\x25\xff\xff\xff\xf7\xff\xff\xff\x07\xff\xff\xff\xc9\xff\xff\xff\x5e\x81\xff\xff\xff\x00\x02\xff\xff\xff\x1a\xff\xff\xff\xff\xff\xff\xff\x06\x81\xff\xff\xff\x00\x01\xff\xff\xff\x33\xff\xff\xff\xe9\x81\xff\xff\xff\x00\x04\xff\xff\xff\x54\xff\xff\xff\x1e\xff\xff\xff\x01\xff\xff\xff\x86\xff\xff\xff\xc9\x82\xff\xff\xff\x00\x04\xff\xff\xff\xce\xff\xff\xff\x71\xff\xff\xff\x00\xff\xff\xff\x9c\xff\xff\xff\x99\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x03\xff\xff\xff\x6c\xff\xff\xff\x82\xff\xff\xff\x10\xff\xff\xff\xdd\x84\xff\xff\xff\x00\x02\xff\xff\xff\x07\xff\xff\xff\x74\xff\xff\xff\xc8\x82\xff\xff\xff\x00\x01\xff\xff\xff\xe3\xff\xff\xff\x3c\x84\xff\xff\xff\x00\x02\xff\xff\xff\x22\xff\xff\xff\xff\xff\xff\xff\x05\x85\xff\xff\xff\x00\x01\xff\xff\xff\x0f\xff\xff\xff\xa3\x81\xff\xff\xff\xee\x00\xff\xff\xff\x91\x82\xff\xff\xff\x00\x04\xff\xff\xff\x67\xff\xff\xff\xe0\xff\xff\xff\xf4\xff\xff\xff\xe4\xff\xff\xff\x6f\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x02\xff\xff\xff\x22\xff\xff\xff\xfb\xff\xff\xff\x01\x85\xff\xff\xff\x00\x02\xff\xff\xff\xcc\xff\xff\xff\xf0\xff\xff\xff\x40\x83\xff\xff\xff\x00\x03\xff\xff\xff\xd9\xff\xff\xff\x50\xff\xff\xff\xf9\xff\xff\xff\x14\x81\xff\xff\xff\x00\x02\xff\xff\xff\x01\xff\xff\xff\xf3\xff\xff\xff\x2f\x81\xff\xff\xff\x00\x01\xff\xff\xff\x5c\xff\xff\xff\xc5\x81\xff\xff\xff\x00\x04\xff\xff\xff\x68\xff\xff\xff\xe0\xff\xff\xff\xf5\xff\xff\xff\xcb\xff\xff\xff\x2e\x82\xff\xff\xff\x00\x04\xff\xff\xff\x2e\xff\xff\xff\xd0\xff\xff\xff\xed\xff\xff\xff\xb9\xff\xff\xff\x12\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x0b\xff\xff\xff\x38\xff\xff\xff\xb5\xff\xff\xff\x00\xff\xff\xff\xda\xff\xff\xff\x13\xff\xff\xff\x00\xff\xff\xff\x1a\xff\xff\xff\x1c\xff\xff\xff\x00\xff\xff\xff\x02\xff\xff\xff\x72\xff\xff\xff\xe2\x82\xff\xff\xff\x00\x04\xff\xff\xff\x77\xff\xff\xff\xc2\xff\xff\xff\x13\xff\xff\xff\x07\xff\xff\xff\x50\x81\xff\xff\xff\x00\x05\xff\xff\xff\x05\xff\xff\xff\xeb\xff\xff\xff\x5a\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\x3b\x91\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x04\xff\xff\xff\x04\xff\xff\xff\xef\xff\xff\xff\x5d\xff\xff\xff\x00\xff\xff\xff\x2c\x82\xff\xff\xff\x00\x03\xff\xff\xff\x0d\xff\xff\xff\x00\xff\xff\xff\x59\xff\xff\xff\xe6\x83\xff\xff\xff\x00\x02\xff\xff\xff\x8d\xff\xff\xff\xce\xff\xff\xff\xc5\x83\xff\xff\xff\x00\x05\xff\xff\xff\xa2\xff\xff\xff\xac\xff\xff\xff\x09\xff\xff\xff\x14\xff\xff\xff\xcd\xff\xff\xff\x72\x8a\xff\xff\xff\x00\x01\xff\xff\xff\x02\xff\xff\xff\x05\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x04\xff\xff\xff\xf4\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x01\xff\xff\xff\xf4\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x0b\xff\xff\xff\x08\xff\xff\xff\xe5\xff\xff\xff\x00\xff\xff\xff\xa5\xff\xff\xff\x48\xff\xff\xff\x00\xff\xff\xff\x45\xff\xff\xff\xd1\xff\xff\xff\xf1\xff\xff\xff\xf2\xff\xff\xff\xc2\xff\xff\xff\x36\x82\xff\xff\xff\x00\x04\xff\xff\xff\x01\xff\xff\xff\x87\xff\xff\xff\xe9\xff\xff\xff\xf0\xff\xff\xff\x98\x82\xff\xff\xff\x00\x04\xff\xff\xff\x3f\xff\xff\xff\xd4\xff\xff\xff\xf5\xff\xff\xff\xda\xff\xff\xff\x4a\x91\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x04\xff\xff\xff\xf4\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x01\xff\xff\xff\xf4\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x03\xff\xff\xff\x4f\xff\xff\xff\xde\xff\xff\xff\xf4\xff\xff\xff\xcd\x82\xff\xff\xff\x00\x03\xff\xff\xff\x78\xff\xff\xff\xed\xff\xff\xff\xec\xff\xff\xff\x82\x83\xff\xff\xff\x00\x02\xff\xff\xff\x41\xff\xff\xff\xff\xff\xff\xff\x79\x83\xff\xff\xff\x00\x05\xff\xff\xff\x13\xff\xff\xff\xaf\xff\xff\xff\xf1\xff\xff\xff\xec\xff\xff\xff\x96\xff\xff\xff\x03\x82\xff\xff\xff\x00\x03\xff\xff\xff\x80\xff\xff\xff\x82\xff\xff\xff\xd6\xff\xff\xff\x09\x83\xff\xff\xff\x00\x02\xff\xff\xff\x0c\xff\xff\xff\xb9\xff\xff\xff\x10\x82\xff\xff\xff\x00\xea\xff\xff\xff\x00\x00\xff\xff\xff\x0b\x85\xff\xff\xff\x00\x03\xff\xff\xff\xb5\xff\xff\xff\x87\xff\xff\xff\x7c\xff\xff\xff\x3b\x84\xff\xff\xff\x00\x02\xff\xff\xff\x3d\xff\xff\xff\xb8\xff\xff\xff\x02\x81\xff\xff\xff\x00\xe0\xff\xff\xff\x00\x04\xff\xff\xff\x31\xff\xff\xff\x80\xff\xff\xff\x7b\xff\xff\xff\xb1\xff\xff\xff\x2d\x84\xff\xff\xff\x00\x01\xff\xff\xff\xad\xff\xff\xff\x67\x92\xff\xff\xff\x00\xe0\xff\xff\xff\x00\x04\xff\xff\xff\x01\xff\xff\xff\x6e\xff\xff\xff\x52\xff\xff\xff\x1e\xff\xff\xff\x43\x84\xff\xff\xff\x00\x02\xff\xff\xff\x19\xff\xff\xff\xe7\xff\xff\xff\x2f\x91\xff\xff\xff\x00\xff\xff\xff\xff\x00\xff\xff\xff\xff\x00\x01\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x04\xff\xff\xff\xf0\xff\xff\xff\xef\xff\xff\xff\x00\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x01\xff\xff\xff\xf0\xff\xff\xff\xef\xb0\xff\xff\xff\x00\x01\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x04\xff\xff\xff\xf0\xff\xff\xff\xef\xff\xff\xff\x00\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x01\xff\xff\xff\xf0\xff\xff\xff\xef\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\xaa\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\xb0\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\xaa\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x89\xff\xff\xff\x00\x01\xff\xff\xff\xff\xff\xff\xff\xf6\x81\xff\xff\xff\xf3\x00\xff\xff\xff\xeb\x81\xff\xff\xff\x00\x09\xff\xff\xff\x27\xff\xff\xff\xff\xff\xff\xff\xf3\xff\xff\xff\xf2\xff\xff\xff\xed\xff\xff\xff\xb5\xff\xff\xff\x26\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x08\xff\xff\xff\x80\xff\xff\xff\xb5\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x8b\xff\xff\xff\xf1\xff\xff\xff\xc4\xff\xff\xff\x16\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x84\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x05\xff\xff\xff\x09\xff\xff\xff\x95\xff\xff\xff\xed\xff\xff\xff\xff\xff\xff\xff\xe7\xff\xff\xff\x56\x88\xff\xff\xff\x00\x01\xff\xff\xff\xa1\xff\xff\xff\x97\x82\xff\xff\xff\x00\x01\xff\xff\xff\x60\xff\xff\xff\xdc\x81\xff\xff\xff\x00\x04\xff\xff\xff\x0d\xff\xff\xff\xa8\xff\xff\xff\xf1\xff\xff\xff\xea\xff\xff\xff\x88\x82\xff\xff\xff\x00\x04\xff\xff\xff\x83\xff\xff\xff\xf3\xff\xff\xff\xe0\xff\xff\xff\x78\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x04\xff\xff\xff\x28\xff\xff\xff\xcc\xff\xff\xff\xf3\xff\xff\xff\xb8\xff\xff\xff\x12\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x89\xff\xff\xff\x00\x02\xff\xff\xff\x86\xff\xff\xff\xb2\xff\xff\xff\x02\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x05\xff\xff\xff\x08\xff\xff\xff\x88\xff\xff\xff\xcb\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x09\xff\xff\xff\x04\xff\xff\xff\xe5\xff\xff\xff\x42\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xff\xff\xff\xff\x76\xff\xff\xff\x02\xff\xff\xff\x9f\xff\xff\xff\x9b\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x84\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x05\xff\xff\xff\xa2\xff\xff\xff\xb3\xff\xff\xff\x38\xff\xff\xff\xf7\xff\xff\xff\x0e\xff\xff\xff\x29\x88\xff\xff\xff\x00\x02\xff\xff\xff\x55\xff\xff\xff\xe6\xff\xff\xff\x01\x81\xff\xff\xff\x00\x01\xff\xff\xff\xb1\xff\xff\xff\x90\x81\xff\xff\xff\x00\x0c\xff\xff\xff\x99\xff\xff\xff\xaa\xff\xff\xff\x08\xff\xff\xff\x12\xff\xff\xff\xcb\xff\xff\xff\x65\xff\xff\xff\x00\xff\xff\xff\x18\xff\xff\xff\xff\xff\xff\xff\x2c\xff\xff\xff\x05\xff\xff\xff\xa0\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x04\xff\xff\xff\xc7\xff\xff\xff\x75\xff\xff\xff\x02\xff\xff\xff\x9f\xff\xff\xff\x99\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x8a\xff\xff\xff\x00\x01\xff\xff\xff\xa6\xff\xff\xff\x95\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x2e\xff\xff\xff\xef\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x56\xff\xff\xff\xcf\x81\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xff\xff\xff\xff\x10\xff\xff\xff\x00\xff\xff\xff\x3d\xff\xff\xff\xe1\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x84\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x07\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x0b\xff\xff\xff\xfb\xff\xff\xff\x22\xff\xff\xff\x27\xff\xff\xff\xf7\x8a\xff\xff\xff\x00\x02\xff\xff\xff\x0e\xff\xff\xff\xf9\xff\xff\xff\xf8\x81\xff\xff\xff\xf7\x01\xff\xff\xff\xff\xff\xff\xff\x43\x81\xff\xff\xff\x00\x01\xff\xff\xff\xf0\xff\xff\xff\x2e\x81\xff\xff\xff\x00\x08\xff\xff\xff\x5b\xff\xff\xff\xbf\xff\xff\xff\x00\xff\xff\xff\x11\xff\xff\xff\xfb\xff\xff\xff\x41\xff\xff\xff\x00\xff\xff\xff\x34\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x05\xff\xff\xff\x10\xff\xff\xff\xff\xff\xff\xff\x10\xff\xff\xff\x00\xff\xff\xff\x3d\xff\xff\xff\xe1\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x8a\xff\xff\xff\x00\x02\xff\xff\xff\x06\xff\xff\xff\xc4\xff\xff\xff\x6e\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x09\xff\xff\xff\x0f\xff\xff\xff\x9a\xff\xff\xff\x99\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x00\xff\xff\xff\x16\xff\xff\xff\xd7\xff\xff\xff\x59\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfd\x81\xff\xff\xff\x00\x01\xff\xff\xff\x2a\xff\xff\xff\xf3\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfc\x84\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x07\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x23\xff\xff\xff\xfd\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x25\xff\xff\xff\xf4\x81\xff\xff\xff\xef\x00\xff\xff\xff\x02\x82\xff\xff\xff\x00\x09\xff\xff\xff\xbd\xff\xff\xff\x7c\xff\xff\xff\x00\xff\xff\xff\x45\xff\xff\xff\xf1\xff\xff\xff\x04\xff\xff\xff\x00\xff\xff\xff\x19\xff\xff\xff\xff\xff\xff\xff\x06\x81\xff\xff\xff\x00\x01\xff\xff\xff\x33\xff\xff\xff\xe7\x81\xff\xff\xff\x00\x04\xff\xff\xff\x5f\xff\xff\xff\xd8\xff\xff\xff\xf0\xff\xff\xff\xf1\xff\xff\xff\xf6\x81\xff\xff\xff\x00\x01\xff\xff\xff\x23\xff\xff\xff\xfd\x81\xff\xff\xff\x00\x01\xff\xff\xff\x29\xff\xff\xff\xf3\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x8b\xff\xff\xff\x00\x02\xff\xff\xff\x16\xff\xff\xff\xe3\xff\xff\xff\x38\x81\xff\xff\xff\x00\x0d\xff\xff\xff\x27\xff\xff\xff\xff\xff\xff\xff\xef\xff\xff\xff\xf4\xff\xff\xff\xef\xff\xff\xff\x62\xff\xff\xff\x01\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xff\xff\xff\xff\xef\xff\xff\xff\xfb\xff\xff\xff\xcc\xff\xff\xff\x0e\x81\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xff\xff\xff\xff\x10\xff\xff\xff\x00\xff\xff\xff\x3d\xff\xff\xff\xe2\x82\xff\xff\xff\x00\x02\xff\xff\xff\x27\xff\xff\xff\xff\xff\xff\xff\x1e\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x07\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x0b\xff\xff\xff\xfb\xff\xff\xff\x21\xff\xff\xff\x27\xff\xff\xff\xf7\x84\xff\xff\xff\x00\x01\xff\xff\xff\xa5\xff\xff\xff\x27\x84\xff\xff\xff\x00\x04\xff\xff\xff\x71\xff\xff\xff\xbe\xff\xff\xff\x00\xff\xff\xff\x87\xff\xff\xff\xaa\x81\xff\xff\xff\x00\x01\xff\xff\xff\x24\xff\xff\xff\xfc\x82\xff\xff\xff\x00\x01\xff\xff\xff\x29\xff\xff\xff\xf3\x84\xff\xff\xff\x00\x01\xff\xff\xff\x2d\xff\xff\xff\xf1\x81\xff\xff\xff\x00\x05\xff\xff\xff\x13\xff\xff\xff\xff\xff\xff\xff\x0f\xff\xff\xff\x00\xff\xff\xff\x3c\xff\xff\xff\xe1\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x8c\xff\xff\xff\x00\x01\xff\xff\xff\x63\xff\xff\xff\xbf\x81\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x00\xff\xff\xff\x02\xff\xff\xff\x7e\xff\xff\xff\xbb\x81\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x00\xff\xff\xff\x03\xff\xff\xff\x86\xff\xff\xff\xb5\x81\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xff\xff\xff\xff\x79\xff\xff\xff\x02\xff\xff\xff\x9f\xff\xff\xff\x9d\x82\xff\xff\xff\x00\x08\xff\xff\xff\x27\xff\xff\xff\xfd\xff\xff\xff\x9e\xff\xff\xff\x0c\xff\xff\xff\x08\xff\xff\xff\x2b\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x05\xff\xff\xff\xa1\xff\xff\xff\xb1\xff\xff\xff\x36\xff\xff\xff\xf7\xff\xff\xff\x0d\xff\xff\xff\x28\x82\xff\xff\xff\x00\x02\xff\xff\xff\x12\xff\xff\xff\xc2\xff\xff\xff\x14\x83\xff\xff\xff\x00\x04\xff\xff\xff\x25\xff\xff\xff\xf7\xff\xff\xff\x07\xff\xff\xff\xc8\xff\xff\xff\x5e\x81\xff\xff\xff\x00\x02\xff\xff\xff\x1a\xff\xff\xff\xff\xff\xff\xff\x06\x81\xff\xff\xff\x00\x01\xff\xff\xff\x33\xff\xff\xff\xe9\x81\xff\xff\xff\x00\x04\xff\xff\xff\x54\xff\xff\xff\x1e\xff\xff\xff\x01\xff\xff\xff\x86\xff\xff\xff\xc9\x82\xff\xff\xff\x00\x04\xff\xff\xff\xce\xff\xff\xff\x71\xff\xff\xff\x00\xff\xff\xff\x9c\xff\xff\xff\x99\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x03\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x27\xff\xff\xff\xf7\x86\xff\xff\xff\x00\x01\xff\xff\xff\x2f\xff\xff\xff\xf0\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x2d\xff\xff\xff\xf0\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x31\xff\xff\xff\xef\x81\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x8d\xff\xff\xff\xf1\xff\xff\xff\xc5\xff\xff\xff\x17\x82\xff\xff\xff\x00\x08\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x56\xff\xff\xff\xe0\xff\xff\xff\xf2\xff\xff\xff\x71\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x05\xff\xff\xff\x09\xff\xff\xff\x99\xff\xff\xff\xf0\xff\xff\xff\xff\xff\xff\xff\xe8\xff\xff\xff\x57\x83\xff\xff\xff\x00\x01\xff\xff\xff\x58\xff\xff\xff\xb1\x84\xff\xff\xff\x00\x03\xff\xff\xff\xd9\xff\xff\xff\x4f\xff\xff\xff\xf8\xff\xff\xff\x14\x81\xff\xff\xff\x00\x02\xff\xff\xff\x01\xff\xff\xff\xf3\xff\xff\xff\x2f\x81\xff\xff\xff\x00\x01\xff\xff\xff\x5c\xff\xff\xff\xc5\x81\xff\xff\xff\x00\x04\xff\xff\xff\x68\xff\xff\xff\xe0\xff\xff\xff\xf5\xff\xff\xff\xcb\xff\xff\xff\x2e\x82\xff\xff\xff\x00\x04\xff\xff\xff\x2e\xff\xff\xff\xd0\xff\xff\xff\xed\xff\xff\xff\xb9\xff\xff\xff\x12\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x03\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x04\xff\xff\xff\x73\xff\xff\xff\x16\xff\xff\xff\x02\xff\xff\xff\x8b\xff\xff\xff\xc0\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x75\xff\xff\xff\xca\x81\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x00\xff\xff\xff\x03\xff\xff\xff\x89\xff\xff\xff\xc7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x8d\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x03\xff\xff\xff\x0b\xff\xff\xff\x18\xff\xff\xff\x4a\xff\xff\xff\xef\x84\xff\xff\xff\x00\x02\xff\xff\xff\x8d\xff\xff\xff\xce\xff\xff\xff\xc5\x83\xff\xff\xff\x00\x05\xff\xff\xff\xa2\xff\xff\xff\xac\xff\xff\xff\x09\xff\xff\xff\x14\xff\xff\xff\xcd\xff\xff\xff\x72\x8b\xff\xff\xff\x00\x00\xff\xff\xff\x07\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x04\xff\xff\xff\xf4\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x01\xff\xff\xff\xf4\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x03\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x04\xff\xff\xff\x97\xff\xff\xff\xe8\xff\xff\xff\xf4\xff\xff\xff\xbd\xff\xff\xff\x20\x81\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xff\xff\xff\xff\xf3\xff\xff\xff\xf4\xff\xff\xff\xc9\xff\xff\xff\x2e\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x81\xff\xff\xff\xf3\x01\xff\xff\xff\xc1\xff\xff\xff\x28\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x8d\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x04\xff\xff\xff\xf4\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x01\xff\xff\xff\xf4\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x03\xff\xff\xff\x10\xff\xff\xff\xd0\xff\xff\xff\xf1\xff\xff\xff\x72\x84\xff\xff\xff\x00\x02\xff\xff\xff\x41\xff\xff\xff\xff\xff\xff\xff\x79\x83\xff\xff\xff\x00\x05\xff\xff\xff\x13\xff\xff\xff\xaf\xff\xff\xff\xf1\xff\xff\xff\xec\xff\xff\xff\x96\xff\xff\xff\x03\x81\xff\xff\xff\x00\x04\xff\xff\xff\x02\xff\xff\xff\xaf\xff\xff\xff\x1c\xff\xff\xff\xb5\xff\xff\xff\x08\x83\xff\xff\xff\x00\x01\xff\xff\xff\x28\xff\xff\xff\xad\x83\xff\xff\xff\x00\xaf\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\xb8\xff\xff\xff\x00\x01\xff\xff\xff\x01\xff\xff\xff\x09\x84\xff\xff\xff\x00\x02\xff\xff\xff\x30\xff\xff\xff\xe9\xff\xff\xff\x3c\x83\xff\xff\xff\x00\x02\xff\xff\xff\x0f\xff\xff\xff\xca\xff\xff\xff\x1d\x83\xff\xff\xff\x00\xe0\xff\xff\xff\x00\x04\xff\xff\xff\x05\xff\xff\xff\xbe\xff\xff\xff\x19\xff\xff\xff\xba\xff\xff\xff\x21\x84\xff\xff\xff\x00\x01\xff\xff\xff\x93\xff\xff\xff\x81\x92\xff\xff\xff\x00\xe1\xff\xff\xff\x00\x02\xff\xff\xff\x3e\xff\xff\xff\xe8\xff\xff\xff\x7a\x84\xff\xff\xff\x00\x02\xff\xff\xff\x51\xff\xff\xff\xd5\xff\xff\xff\x05\x92\xff\xff\xff\x00\xff\xff\xff\xff\x00\xbb\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\xc1\xff\xff\xff\x00\x01\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x04\xff\xff\xff\xf0\xff\xff\xff\xef\xff\xff\xff\x00\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x01\xff\xff\xff\xf0\xff\xff\xff\xef\x9d\xff\xff\xff\x00\x01\xff\xff\xff\x36\xff\xff\xff\x0b\x8c\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x04\xff\xff\xff\xf0\xff\xff\xff\xef\xff\xff\xff\x00\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x01\xff\xff\xff\xf0\xff\xff\xff\xef\xb0\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x9c\xff\xff\xff\x00\x02\xff\xff\xff\x51\xff\xff\xff\xec\xff\xff\xff\x37\x8c\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\xb0\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x84\xff\xff\xff\xff\x02\xff\xff\xff\x00\xff\xff\xff\xa1\xff\xff\xff\x97\x82\xff\xff\xff\x00\x01\xff\xff\xff\x60\xff\xff\xff\xdc\x81\xff\xff\xff\x00\x05\xff\xff\xff\x0b\xff\xff\xff\xa5\xff\xff\xff\xf0\xff\xff\xff\xfd\xff\xff\xff\xbd\xff\xff\xff\x05\x81\xff\xff\xff\x00\x04\xff\xff\xff\x83\xff\xff\xff\xf3\xff\xff\xff\xe0\xff\xff\xff\x78\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x04\xff\xff\xff\x2f\xff\xff\xff\xd8\xff\xff\xff\xec\xff\xff\xff\x8d\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x84\xff\xff\xff\x00\x85\xff\xff\xff\xf3\x02\xff\xff\xff\x00\xff\xff\xff\xa1\xff\xff\xff\x97\x82\xff\xff\xff\x00\x04\xff\xff\xff\x60\xff\xff\xff\xdc\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\xa3\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x04\xff\xff\xff\x83\xff\xff\xff\xf3\xff\xff\xff\xe0\xff\xff\xff\x77\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x02\xff\xff\xff\x07\xff\xff\xff\x2d\xff\xff\xff\xf7\x81\xff\xff\xff\x07\x03\xff\xff\xff\x00\xff\xff\xff\x55\xff\xff\xff\xe6\xff\xff\xff\x01\x81\xff\xff\xff\x00\x01\xff\xff\xff\xb1\xff\xff\xff\x90\x81\xff\xff\xff\x00\x0c\xff\xff\xff\x95\xff\xff\xff\xaa\xff\xff\xff\x08\xff\xff\xff\x12\xff\xff\xff\xcb\xff\xff\xff\x73\xff\xff\xff\x00\xff\xff\xff\x18\xff\xff\xff\xff\xff\xff\xff\x2c\xff\xff\xff\x05\xff\xff\xff\xa0\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x04\xff\xff\xff\xcc\xff\xff\xff\x75\xff\xff\xff\x02\xff\xff\xff\x9f\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x8b\xff\xff\xff\x00\x02\xff\xff\xff\x55\xff\xff\xff\xe6\xff\xff\xff\x01\x81\xff\xff\xff\x00\x08\xff\xff\xff\xb1\xff\xff\xff\x90\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x00\xff\xff\xff\x08\xff\xff\xff\xeb\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x05\xff\xff\xff\x18\xff\xff\xff\xff\xff\xff\xff\x2d\xff\xff\xff\x05\xff\xff\xff\xa0\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x01\xff\xff\xff\x0e\x86\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x02\xff\xff\xff\x0e\xff\xff\xff\xf9\xff\xff\xff\xf8\x81\xff\xff\xff\xf7\x01\xff\xff\xff\xff\xff\xff\xff\x43\x81\xff\xff\xff\x00\x01\xff\xff\xff\xee\xff\xff\xff\x2e\x81\xff\xff\xff\x00\x08\xff\xff\xff\x5b\xff\xff\xff\xc6\xff\xff\xff\x00\xff\xff\xff\x11\xff\xff\xff\xfb\xff\xff\xff\x41\xff\xff\xff\x00\xff\xff\xff\x34\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x05\xff\xff\xff\x12\xff\xff\xff\xff\xff\xff\xff\x10\xff\xff\xff\x00\xff\xff\xff\x3d\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x86\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x02\xff\xff\xff\x0e\xff\xff\xff\xf9\xff\xff\xff\xf8\x81\xff\xff\xff\xf7\x08\xff\xff\xff\xff\xff\xff\xff\x43\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x00\xff\xff\xff\x54\xff\xff\xff\xaf\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x05\xff\xff\xff\x10\xff\xff\xff\xfa\xff\xff\xff\x3c\xff\xff\xff\x00\xff\xff\xff\x34\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x86\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x09\xff\xff\xff\xbd\xff\xff\xff\x7c\xff\xff\xff\x00\xff\xff\xff\x45\xff\xff\xff\xf1\xff\xff\xff\x04\xff\xff\xff\x00\xff\xff\xff\x19\xff\xff\xff\xff\xff\xff\xff\x06\x81\xff\xff\xff\x00\x01\xff\xff\xff\x33\xff\xff\xff\xea\x81\xff\xff\xff\x00\x04\xff\xff\xff\x5f\xff\xff\xff\xd8\xff\xff\xff\xf0\xff\xff\xff\xf1\xff\xff\xff\xf6\x81\xff\xff\xff\x00\x01\xff\xff\xff\x24\xff\xff\xff\xfd\x81\xff\xff\xff\x00\x01\xff\xff\xff\x2a\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x86\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x0c\xff\xff\xff\xbd\xff\xff\xff\x7c\xff\xff\xff\x00\xff\xff\xff\x45\xff\xff\xff\xf1\xff\xff\xff\x04\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x00\xff\xff\xff\xac\xff\xff\xff\x57\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x04\xff\xff\xff\x58\xff\xff\xff\xd0\xff\xff\xff\xe2\xff\xff\xff\xe4\xff\xff\xff\xf6\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x86\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x04\xff\xff\xff\x71\xff\xff\xff\xbe\xff\xff\xff\x00\xff\xff\xff\x87\xff\xff\xff\xaa\x81\xff\xff\xff\x00\x01\xff\xff\xff\x24\xff\xff\xff\xfc\x82\xff\xff\xff\x00\x01\xff\xff\xff\x29\xff\xff\xff\xf4\x84\xff\xff\xff\x00\x01\xff\xff\xff\x2d\xff\xff\xff\xf1\x81\xff\xff\xff\x00\x05\xff\xff\xff\x11\xff\xff\xff\xff\xff\xff\xff\x10\xff\xff\xff\x00\xff\xff\xff\x3d\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x84\xff\xff\xff\x00\x81\xff\xff\xff\xef\x01\xff\xff\xff\xf1\xff\xff\xff\xff\x81\xff\xff\xff\xef\x81\xff\xff\xff\x00\x04\xff\xff\xff\x71\xff\xff\xff\xbe\xff\xff\xff\x00\xff\xff\xff\x87\xff\xff\xff\xaa\x81\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x0c\xff\xff\xff\xce\xff\xff\xff\x27\xff\xff\xff\xf7\x85\xff\xff\xff\x00\x01\xff\xff\xff\x2f\xff\xff\xff\xf1\x81\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xff\xff\xff\xff\x06\xff\xff\xff\x00\xff\xff\xff\x2a\xff\xff\xff\xf3\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x86\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x04\xff\xff\xff\x25\xff\xff\xff\xf7\xff\xff\xff\x07\xff\xff\xff\xc8\xff\xff\xff\x5e\x81\xff\xff\xff\x00\x02\xff\xff\xff\x1a\xff\xff\xff\xff\xff\xff\xff\x06\x81\xff\xff\xff\x00\x01\xff\xff\xff\x33\xff\xff\xff\xe9\x81\xff\xff\xff\x00\x04\xff\xff\xff\x54\xff\xff\xff\x1e\xff\xff\xff\x01\xff\xff\xff\x86\xff\xff\xff\xc9\x82\xff\xff\xff\x00\x04\xff\xff\xff\xcb\xff\xff\xff\x77\xff\xff\xff\x02\xff\xff\xff\xa1\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x86\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x04\xff\xff\xff\x25\xff\xff\xff\xf7\xff\xff\xff\x07\xff\xff\xff\xc8\xff\xff\xff\x5e\x81\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x5c\xff\xff\xff\x7f\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x04\xff\xff\xff\x65\xff\xff\xff\x3f\xff\xff\xff\x20\xff\xff\xff\x9c\xff\xff\xff\xc9\x81\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xff\xff\xff\xff\x5d\xff\xff\xff\x00\xff\xff\xff\x63\xff\xff\xff\xce\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x86\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x84\xff\xff\xff\x00\x03\xff\xff\xff\xd9\xff\xff\xff\x4f\xff\xff\xff\xf8\xff\xff\xff\x14\x81\xff\xff\xff\x00\x02\xff\xff\xff\x01\xff\xff\xff\xf3\xff\xff\xff\x2f\x81\xff\xff\xff\x00\x01\xff\xff\xff\x5c\xff\xff\xff\xc4\x81\xff\xff\xff\x00\x04\xff\xff\xff\x68\xff\xff\xff\xe0\xff\xff\xff\xf5\xff\xff\xff\xcb\xff\xff\xff\x2e\x82\xff\xff\xff\x00\x04\xff\xff\xff\x30\xff\xff\xff\xd7\xff\xff\xff\xec\xff\xff\xff\x8f\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x01\xff\xff\xff\x0e\x86\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x84\xff\xff\xff\x00\x03\xff\xff\xff\xd9\xff\xff\xff\x4f\xff\xff\xff\xf8\xff\xff\xff\x14\x81\xff\xff\xff\x00\x02\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\xb3\x81\xff\xff\xff\x27\x00\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x04\xff\xff\xff\x60\xff\xff\xff\xdc\xff\xff\xff\xf9\xff\xff\xff\xcb\xff\xff\xff\x2e\x81\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x7b\xff\xff\xff\xc9\xff\xff\xff\xe3\xff\xff\xff\x47\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x84\xff\xff\xff\x00\x03\xff\xff\xff\x12\xff\xff\xff\x66\xff\xff\xff\x50\xff\xff\xff\xf7\x84\xff\xff\xff\x00\x02\xff\xff\xff\x8d\xff\xff\xff\xce\xff\xff\xff\xc5\x83\xff\xff\xff\x00\x05\xff\xff\xff\xa2\xff\xff\xff\xac\xff\xff\xff\x09\xff\xff\xff\x14\xff\xff\xff\xcd\xff\xff\xff\x72\x90\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x8d\xff\xff\xff\x00\x02\xff\xff\xff\x8d\xff\xff\xff\xce\xff\xff\xff\xc5\x82\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xfd\xff\xff\xff\xc9\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x01\xff\xff\xff\x06\x84\xff\xff\xff\x00\x03\xff\xff\xff\x05\xff\xff\xff\x01\xff\xff\xff\x00\xff\xff\xff\x02\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x04\xff\xff\xff\xf4\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x01\xff\xff\xff\xf4\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x84\xff\xff\xff\x00\x03\xff\xff\xff\x13\xff\xff\xff\xb0\xff\xff\xff\xea\xff\xff\xff\xf7\x84\xff\xff\xff\x00\x02\xff\xff\xff\x41\xff\xff\xff\xff\xff\xff\xff\x79\x83\xff\xff\xff\x00\x05\xff\xff\xff\x13\xff\xff\xff\xaf\xff\xff\xff\xf1\xff\xff\xff\xec\xff\xff\xff\x96\xff\xff\xff\x03\x90\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x04\xff\xff\xff\xf4\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x01\xff\xff\xff\xf4\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x8d\xff\xff\xff\x00\x02\xff\xff\xff\x41\xff\xff\xff\xff\xff\xff\xff\x79\x82\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xff\xff\xff\xff\x77\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x02\xff\xff\xff\x04\xff\xff\xff\xb7\xff\xff\xff\x22\x83\xff\xff\xff\x00\x04\xff\xff\xff\x86\xff\xff\xff\x49\xff\xff\xff\xb6\xff\xff\xff\xe6\xff\xff\xff\x0c\x81\xff\xff\xff\x00\xe1\xff\xff\xff\x00\x01\xff\xff\xff\x01\xff\xff\xff\x07\x84\xff\xff\xff\x00\x03\xff\xff\xff\x02\xff\xff\xff\x03\xff\xff\xff\x00\xff\xff\xff\x02\x85\xff\xff\xff\x00\x02\xff\xff\xff\x26\xff\xff\xff\xcc\xff\xff\xff\x0f\x82\xff\xff\xff\x00\x04\xff\xff\xff\x37\xff\xff\xff\xf0\xff\xff\xff\x64\xff\xff\xff\x7f\xff\xff\xff\x43\x81\xff\xff\xff\x00\xe1\xff\xff\xff\x00\x02\xff\xff\xff\x07\xff\xff\xff\xd0\xff\xff\xff\x19\x83\xff\xff\xff\x00\x03\xff\xff\xff\x3e\xff\xff\xff\x71\xff\xff\xff\xa4\xff\xff\xff\xc6\x92\xff\xff\xff\x00\xe2\xff\xff\xff\x00\x01\xff\xff\xff\x57\xff\xff\xff\xb2\x83\xff\xff\xff\x00\x04\xff\xff\xff\x09\xff\xff\xff\xda\xff\xff\xff\x8c\xff\xff\xff\x9d\xff\xff\xff\x0e\x91\xff\xff\xff\x00\xff\xff\xff\xff\x00\xb7\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\xc5\xff\xff\xff\x00\x01\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x04\xff\xff\xff\xf0\xff\xff\xff\xef\xff\xff\xff\x00\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x01\xff\xff\xff\xf0\xff\xff\xff\xef\x92\xff\xff\xff\x00\x04\xff\xff\xff\x0e\xff\xff\xff\x8a\xff\xff\xff\xdc\xff\xff\xff\xf0\xff\xff\xff\xa8\x90\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x8d\xff\xff\xff\x00\x01\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x01\xff\xff\xff\xf0\xff\xff\xff\xef\xb0\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x91\xff\xff\xff\x00\x05\xff\xff\xff\x0a\xff\xff\xff\xd0\xff\xff\xff\xa4\xff\xff\xff\x1f\xff\xff\xff\x01\xff\xff\xff\x18\x90\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x02\xff\xff\xff\x1f\xff\xff\xff\x4c\xff\xff\xff\x10\x81\xff\xff\xff\x00\x04\xff\xff\xff\x19\xff\xff\xff\x46\xff\xff\xff\x0e\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\xb0\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x89\xff\xff\xff\x00\x04\xff\xff\xff\x15\xff\xff\xff\xc1\xff\xff\xff\xf4\xff\xff\xff\x9f\xff\xff\xff\x01\x82\xff\xff\xff\x00\x01\xff\xff\xff\x85\xff\xff\xff\xbb\x84\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x8d\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x8e\xff\xff\xff\xf1\xff\xff\xff\xc4\xff\xff\xff\x16\x81\xff\xff\xff\x00\x09\xff\xff\xff\x57\xff\xff\xff\xee\xff\xff\xff\x52\xff\xff\xff\x00\xff\xff\xff\x07\xff\xff\xff\x9a\xff\xff\xff\xee\xff\xff\xff\x44\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x90\xff\xff\xff\x00\x01\xff\xff\xff\xa1\xff\xff\xff\x97\x82\xff\xff\xff\x00\x08\xff\xff\xff\x60\xff\xff\xff\xdc\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xff\xff\xff\xff\xf3\xff\xff\xff\xef\xff\xff\xff\xbd\xff\xff\xff\x42\x82\xff\xff\xff\x00\x04\xff\xff\xff\x83\xff\xff\xff\xdd\xff\xff\xff\xbc\xff\xff\xff\x8a\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x04\xff\xff\xff\x25\xff\xff\xff\xcb\xff\xff\xff\xf3\xff\xff\xff\xb4\xff\xff\xff\x0f\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x89\xff\xff\xff\x00\x04\xff\xff\xff\x9d\xff\xff\xff\xa9\xff\xff\xff\x0d\xff\xff\xff\xcf\xff\xff\xff\x56\x82\xff\xff\xff\x00\x08\xff\xff\xff\xe3\xff\xff\xff\x47\xff\xff\xff\x3e\xff\xff\xff\xd6\xff\xff\xff\xea\xff\xff\xff\xa1\xff\xff\xff\xef\xff\xff\xff\x27\xff\xff\xff\xfb\x8d\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xff\xff\xff\xff\x76\xff\xff\xff\x01\xff\xff\xff\x9e\xff\xff\xff\x9b\x81\xff\xff\xff\x00\x09\xff\xff\xff\x10\xff\xff\xff\xc8\xff\xff\xff\xae\xff\xff\xff\x0f\xff\xff\xff\x42\xff\xff\xff\xe8\xff\xff\xff\x7f\xff\xff\xff\x10\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x90\xff\xff\xff\x00\x02\xff\xff\xff\x55\xff\xff\xff\xe6\xff\xff\xff\x01\x81\xff\xff\xff\x00\x10\xff\xff\xff\xb1\xff\xff\xff\x90\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x00\xff\xff\xff\x05\xff\xff\xff\x45\xff\xff\xff\xe3\xff\xff\xff\x3c\xff\xff\xff\x00\xff\xff\xff\x18\xff\xff\xff\xff\xff\xff\xff\x16\xff\xff\xff\x00\xff\xff\xff\x88\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x04\xff\xff\xff\xc4\xff\xff\xff\x7b\xff\xff\xff\x02\xff\xff\xff\xa5\xff\xff\xff\x93\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x89\xff\xff\xff\x00\x04\xff\xff\xff\xed\xff\xff\xff\x24\xff\xff\xff\x00\xff\xff\xff\x55\xff\xff\xff\xa1\x81\xff\xff\xff\x00\x09\xff\xff\xff\x14\xff\xff\xff\xff\xff\xff\xff\x14\xff\xff\xff\xe9\xff\xff\xff\x5a\xff\xff\xff\x03\xff\xff\xff\x88\xff\xff\xff\xf7\xff\xff\xff\x27\xff\xff\xff\xfb\x8d\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xff\xff\xff\xff\x10\xff\xff\xff\x00\xff\xff\xff\x3d\xff\xff\xff\xe1\x81\xff\xff\xff\x00\x09\xff\xff\xff\x03\xff\xff\xff\x6b\xff\xff\xff\xe8\xff\xff\xff\x90\xff\xff\xff\xd4\xff\xff\xff\xc2\xff\xff\xff\x0e\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x90\xff\xff\xff\x00\x02\xff\xff\xff\x0e\xff\xff\xff\xf9\xff\xff\xff\xf8\x81\xff\xff\xff\xf7\x04\xff\xff\xff\xff\xff\xff\xff\x43\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x08\xff\xff\xff\x6a\xff\xff\xff\xb0\xff\xff\xff\x00\xff\xff\xff\x11\xff\xff\xff\xfb\xff\xff\xff\x49\xff\xff\xff\x00\xff\xff\xff\x32\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x05\xff\xff\xff\x10\xff\xff\xff\xff\xff\xff\xff\x12\xff\xff\xff\x00\xff\xff\xff\x3e\xff\xff\xff\xdf\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x88\xff\xff\xff\x00\x01\xff\xff\xff\x15\xff\xff\xff\xed\x81\xff\xff\xff\x00\x01\xff\xff\xff\x1d\xff\xff\xff\xc5\x81\xff\xff\xff\x00\x09\xff\xff\xff\x23\xff\xff\xff\xfd\xff\xff\xff\x22\xff\xff\xff\xfd\xff\xff\xff\x02\xff\xff\xff\x00\xff\xff\xff\x31\xff\xff\xff\xf7\xff\xff\xff\x27\xff\xff\xff\xfb\x8d\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfd\x81\xff\xff\xff\x00\x01\xff\xff\xff\x2a\xff\xff\xff\xf3\x82\xff\xff\xff\x00\x01\xff\xff\xff\x0a\xff\xff\xff\x78\x81\xff\xff\xff\xf0\x00\xff\xff\xff\x3c\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x91\xff\xff\xff\x00\x08\xff\xff\xff\xbd\xff\xff\xff\x7c\xff\xff\xff\x00\xff\xff\xff\x45\xff\xff\xff\xf1\xff\xff\xff\x04\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x36\xff\xff\xff\xe4\x81\xff\xff\xff\x00\x04\xff\xff\xff\x5f\xff\xff\xff\xd8\xff\xff\xff\xf0\xff\xff\xff\xf1\xff\xff\xff\xf6\x81\xff\xff\xff\x00\x01\xff\xff\xff\x24\xff\xff\xff\xfd\x81\xff\xff\xff\x00\x01\xff\xff\xff\x2a\xff\xff\xff\xf3\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x88\xff\xff\xff\x00\x05\xff\xff\xff\x23\xff\xff\xff\xda\xff\xff\xff\x00\xff\xff\xff\xae\xff\xff\xff\x0b\xff\xff\xff\xd3\x81\xff\xff\xff\x00\x09\xff\xff\xff\x16\xff\xff\xff\xff\xff\xff\xff\x11\xff\xff\xff\xe8\xff\xff\xff\x5c\xff\xff\xff\x04\xff\xff\xff\x8a\xff\xff\xff\xf7\xff\xff\xff\x27\xff\xff\xff\xff\x81\xff\xff\xff\xef\x01\xff\xff\xff\xc2\xff\xff\xff\x2b\x89\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xff\xff\xff\xff\x10\xff\xff\xff\x00\xff\xff\xff\x3d\xff\xff\xff\xe0\x83\xff\xff\xff\x00\x03\xff\xff\xff\x08\xff\xff\xff\xbe\xff\xff\xff\xc6\xff\xff\xff\x0b\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x91\xff\xff\xff\x00\x04\xff\xff\xff\x71\xff\xff\xff\xbe\xff\xff\xff\x00\xff\xff\xff\x87\xff\xff\xff\xaa\x81\xff\xff\xff\x00\x06\xff\xff\xff\xd7\xff\xff\xff\xff\xff\xff\xff\xef\xff\xff\xff\xc5\xff\xff\xff\x00\xff\xff\xff\x2a\xff\xff\xff\xf2\x84\xff\xff\xff\x00\x01\xff\xff\xff\x2e\xff\xff\xff\xf1\x81\xff\xff\xff\x00\x05\xff\xff\xff\x11\xff\xff\xff\xff\xff\xff\xff\x12\xff\xff\xff\x00\xff\xff\xff\x41\xff\xff\xff\xdd\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x88\xff\xff\xff\x00\x05\xff\xff\xff\x20\xff\xff\xff\xdc\xff\xff\xff\x00\xff\xff\xff\x88\xff\xff\xff\x0d\xff\xff\xff\xcf\x82\xff\xff\xff\x00\x00\xff\xff\xff\xe9\x81\xff\xff\xff\x3b\x09\xff\xff\xff\xd3\xff\xff\xff\xe9\xff\xff\xff\x9b\xff\xff\xff\xf6\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x00\xff\xff\xff\x05\xff\xff\xff\x8e\xff\xff\xff\xc8\x89\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xff\xff\xff\xff\x78\xff\xff\xff\x02\xff\xff\xff\x9f\xff\xff\xff\x98\x83\xff\xff\xff\x00\x03\xff\xff\xff\x11\xff\xff\xff\xc9\xff\xff\xff\x79\xff\xff\xff\x02\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x8a\xff\xff\xff\x00\x03\xff\xff\xff\x4c\xff\xff\xff\xdb\xff\xff\xff\xe3\xff\xff\xff\x4e\x82\xff\xff\xff\x00\x04\xff\xff\xff\x25\xff\xff\xff\xf7\xff\xff\xff\x07\xff\xff\xff\xc8\xff\xff\xff\x5e\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x3a\xff\xff\xff\xe3\x81\xff\xff\xff\x00\x04\xff\xff\xff\x62\xff\xff\xff\x3b\xff\xff\xff\x1c\xff\xff\xff\x99\xff\xff\xff\xc9\x82\xff\xff\xff\x00\x04\xff\xff\xff\xc7\xff\xff\xff\x7e\xff\xff\xff\x00\xff\xff\xff\x8d\xff\xff\xff\x98\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x88\xff\xff\xff\x00\x05\xff\xff\xff\x08\xff\xff\xff\xf2\xff\xff\xff\x02\xff\xff\xff\x00\xff\xff\xff\x29\xff\xff\xff\xb3\x82\xff\xff\xff\x00\x01\xff\xff\xff\x92\xff\xff\xff\xa1\x82\xff\xff\xff\x00\x03\xff\xff\xff\x48\xff\xff\xff\xe6\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x31\xff\xff\xff\xf1\x89\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x8d\xff\xff\xff\xf1\xff\xff\xff\xc3\xff\xff\xff\x14\x82\xff\xff\xff\x00\x03\xff\xff\xff\x0a\xff\xff\xff\x74\xff\xff\xff\xe8\xff\xff\xff\x54\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x89\xff\xff\xff\x00\x04\xff\xff\xff\x0e\xff\xff\xff\xf5\xff\xff\xff\x2b\xff\xff\xff\x5a\xff\xff\xff\xe3\x83\xff\xff\xff\x00\x03\xff\xff\xff\xd9\xff\xff\xff\x4f\xff\xff\xff\xf8\xff\xff\xff\x14\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x74\xff\xff\xff\xaf\x81\xff\xff\xff\x00\x04\xff\xff\xff\x60\xff\xff\xff\xdc\xff\xff\xff\xf9\xff\xff\xff\xcb\xff\xff\xff\x2e\x82\xff\xff\xff\x00\x04\xff\xff\xff\x29\xff\xff\xff\xcf\xff\xff\xff\xf7\xff\xff\xff\xfb\xff\xff\xff\x27\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x89\xff\xff\xff\x00\x04\xff\xff\xff\xbd\xff\xff\xff\x66\xff\xff\xff\x01\xff\xff\xff\x94\xff\xff\xff\x6a\x82\xff\xff\xff\x00\x0c\xff\xff\xff\x13\xff\xff\xff\xdf\xff\xff\xff\x7c\xff\xff\xff\x0b\xff\xff\xff\x13\xff\xff\xff\xc7\xff\xff\xff\x96\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x00\xff\xff\xff\x03\xff\xff\xff\x8b\xff\xff\xff\xca\x92\xff\xff\xff\x00\x03\xff\xff\xff\x27\xff\xff\xff\xd5\xff\xff\xff\xba\xff\xff\xff\x19\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x89\xff\xff\xff\x00\x04\xff\xff\xff\x16\xff\xff\xff\xfd\xff\xff\xff\x2a\xff\xff\xff\x58\xff\xff\xff\xcd\x83\xff\xff\xff\x00\x02\xff\xff\xff\x8d\xff\xff\xff\xce\xff\xff\xff\xc5\x82\xff\xff\xff\x00\x06\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x00\xff\xff\xff\x06\xff\xff\xff\x4e\xff\xff\xff\xeb\xff\xff\xff\x3d\x83\xff\xff\xff\x00\x01\xff\xff\xff\x05\xff\xff\xff\x01\x83\xff\xff\xff\x00\x03\xff\xff\xff\x29\xff\xff\xff\x1c\xff\xff\xff\x80\xff\xff\xff\x94\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x04\xff\xff\xff\xf4\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x01\xff\xff\xff\xf4\xff\xff\xff\xf7\x89\xff\xff\xff\x00\x04\xff\xff\xff\x28\xff\xff\xff\xd0\xff\xff\xff\xf2\xff\xff\xff\xa5\xff\xff\xff\x04\x83\xff\xff\xff\x00\x0b\xff\xff\xff\x19\xff\xff\xff\x9e\xff\xff\xff\xe4\xff\xff\xff\xea\xff\xff\xff\x9d\xff\xff\xff\x0a\xff\xff\xff\x27\xff\xff\xff\xff\xff\xff\xff\xf3\xff\xff\xff\xf4\xff\xff\xff\xc7\xff\xff\xff\x2e\x83\xff\xff\xff\x00\x02\xff\xff\xff\x15\xff\xff\xff\xc0\xff\xff\xff\x1c\x8b\xff\xff\xff\x00\x02\xff\xff\xff\x07\xff\xff\xff\x2a\xff\xff\xff\x12\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x01\xff\xff\xff\xf4\xff\xff\xff\xf7\x8a\xff\xff\xff\x00\x03\xff\xff\xff\x7b\xff\xff\xff\xf2\xff\xff\xff\xbf\xff\xff\xff\x1a\x83\xff\xff\xff\x00\x02\xff\xff\xff\x41\xff\xff\xff\xff\xff\xff\xff\x79\x82\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xff\xff\xff\xff\xf3\xff\xff\xff\xf1\xff\xff\xff\xc2\xff\xff\xff\x48\x83\xff\xff\xff\x00\x02\xff\xff\xff\x19\xff\xff\xff\xb9\xff\xff\xff\x07\x83\xff\xff\xff\x00\x03\xff\xff\xff\x24\xff\xff\xff\xaf\xff\xff\xff\xf8\xff\xff\xff\x4d\x82\xff\xff\xff\x00\xb0\xff\xff\xff\x00\x02\xff\xff\xff\x10\xff\xff\xff\xc9\xff\xff\xff\x3a\xae\xff\xff\xff\x00\x81\xff\xff\xff\x04\x8b\xff\xff\xff\x00\x02\xff\xff\xff\x08\xff\xff\xff\xc4\xff\xff\xff\x2e\x84\xff\xff\xff\x00\x04\xff\xff\xff\x06\xff\xff\xff\xce\xff\xff\xff\x54\xff\xff\xff\x72\xff\xff\xff\x14\x81\xff\xff\xff\x00\xe1\xff\xff\xff\x00\x02\xff\xff\xff\x02\xff\xff\xff\xc5\xff\xff\xff\x24\x9a\xff\xff\xff\x00\xe1\xff\xff\xff\x00\x01\xff\xff\xff\x77\xff\xff\xff\x8f\x9b\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x54\x52\x55\x45\x56\x49\x53\x49\x4f\x4e\x2d\x58\x46\x49\x4c\x45\x2e\x00"+
+ LICENSE view
@@ -0,0 +1,21 @@+Copyright (c) 2007 Paul H. Liu <paul@thev.net>++This software is provided 'as-is', without any express or implied+warranty. In no event will the authors be held liable for any damages+arising from the use of this software.++Permission is granted to anyone to use this software for any purpose,+including commercial applications, and to alter it and redistribute it+freely, subject to the following restrictions:++1. The origin of this software must not be misrepresented; you must not+ claim that you wrote the original software. If you use this software+ in a product, an acknowledgment in the product documentation would+ be appreciated but is not required.++2. Altered source versions must be plainly marked as such, and must not+ be misrepresented as being the original software.++3. This notice may not be removed or altered from any source+ distribution.+
+ README.txt view
@@ -0,0 +1,120 @@+This is a Haskell module for GLFW OpenGL framework +(http://glfw.sourceforge.net). It provides an alternative +to GLUT for OpenGL based Haskell programs. + +SOE (http://www.haskell.org/soe) now depends on this package. + +The website for this Haskell module is at Haskell Wiki site: +http://haskell.org/haskellwiki/GLFW + +========= +ChangeLog +========= + +- Tue Jan 15 EST 2008 + + Version 0.3 adds Haddock documentation and the missing Joystick + APIs. + +- Thu Dec 20 EST 2007 + + Version 0.2 is repackaged to work with Cabal 1.2 or later. + Now it builds and installs out-of-box on most platforms. + + +============ +Installation +============ + +The package comes together with a (partial) source distribution +of GLFW v2.6, which is compiled and installed together with +the Haskell package. + +It follows the standard Cabal package installation steps: + +1. To configure the module, type + + runhaskell Setup.hs configure + or + + runhaskell Setup.hs configure --user --prefix=DIR + + if you want to install the package to your user's directory + instead of the system one (replace DIR with your own directory + choice). + +2. To build the module, type + + runhaskell Setup.hs build + +3. To install, type + + runhaskell Setup.hs install + +In the process it builds all GLFW C library source code. You may +use "runhaskell Setup.hs build --verbose" to see the actual +compilation steps. + +4. Optionally to build its Haddock documentation, type + + runhaskell Setup.hs haddock + +==== +NOTE +==== + +For Windows users, you'll have to include GHC's gcc-lib directory +in your PATH environment, e.g., c:\ghc\ghc-6.6.1\gcc-lib, before +configuring the GLFW module, otherwise it'll complain about missing +program for ld. + +GHC 6.8.x is already equipped with Cabal 1.2, so everything should +work as expected. But for GHC 6.6.x users, you'll have to first +install the newest version of Cabal 1.2 before installing GLFW. +Cabal 1.2 also requires the module FilePath, which doesn't come +with GHC 6.6.x. + + +============= +Package Usage +============= + +The package is tested with GHC 6.6.1 (with Cabal 1.2.2) on all +three platforms (Linux, Win32/MinGW, and Mac OS X). Though it may +work with older versions of GHC or even Hugs, they are not tested. + +It installs a new Haskell package called "GLFW" and the actual +module to import is "Graphics.UI.GLFW". You'll need to pass +"-package GLFW" to GHC if you want to compile it. + +GLFW itself is well documented (see GLFW website), and the +Haskell module API is documented via Haddock. + +Not all functions are fully tested, and there are still a +few GLFW C functions missing from the Haskell module, namely +the image loading functions. They are excluded because image +handling is a separate issue, and low level buffer manipulation +would obscure their use further. Texture loading from TGA +format is supported both from file and from memory (via a +string buffer). + +The Haskell module also provides basic text rendering while +GLFW doesn't. It comes from a free 8x16 font which is made +into a TGA texture, stored as a Haskell string in the file +GLFW.hs (also the reason for its big size). Text rendering +is only possible with Alpha enabled. Again, see SOE.hs from +the SOE package for sample usage. + +GLFW doesn't work well with GHC threads, forkIO or threadDelay. +So avoid them if you can. + + +=================== +Contact Information +=================== + +You may send your bug report and feature request to the package +maintainer: Paul H. Liu <paul@thev.net>. + +-- +Last Updated: Tue Jan 15 EST 2008
+ Setup.hs view
@@ -0,0 +1,6 @@+module Main (main) where++import Distribution.Simple++main :: IO ()+main = defaultMainWithHooks simpleUserHooks
+ glfw/include/GL/glfw.h view
@@ -0,0 +1,486 @@+//========================================================================+// GLFW - An OpenGL framework+// File: glfw.h+// API version: 2.6+// WWW: http://glfw.sourceforge.net+//------------------------------------------------------------------------+// Copyright (c) 2002-2006 Camilla Berglund+//+// This software is provided 'as-is', without any express or implied+// warranty. In no event will the authors be held liable for any damages+// arising from the use of this software.+//+// Permission is granted to anyone to use this software for any purpose,+// including commercial applications, and to alter it and redistribute it+// freely, subject to the following restrictions:+//+// 1. The origin of this software must not be misrepresented; you must not+// claim that you wrote the original software. If you use this software+// in a product, an acknowledgment in the product documentation would+// be appreciated but is not required.+//+// 2. Altered source versions must be plainly marked as such, and must not+// be misrepresented as being the original software.+//+// 3. This notice may not be removed or altered from any source+// distribution.+//+//========================================================================++#ifndef __glfw_h_+#define __glfw_h_++#ifdef __cplusplus+extern "C" {+#endif+++//========================================================================+// Global definitions+//========================================================================++// We need a NULL pointer from time to time+#ifndef NULL+ #ifdef __cplusplus+ #define NULL 0+ #else+ #define NULL ((void *)0)+ #endif+#endif // NULL+++// ------------------- BEGIN SYSTEM/COMPILER SPECIFIC --------------------++// Please report any probles that you find with your compiler, which may+// be solved in this section! There are several compilers that I have not+// been able to test this file with yet.++// First: If we are we on Windows, we want a single define for it (_WIN32)+// (Note: For Cygwin the compiler flag -mwin32 should be used, but to+// make sure that things run smoothly for Cygwin users, we add __CYGWIN__+// to the list of "valid Win32 identifiers", which removes the need for+// -mwin32)+#if !defined(_WIN32) && (defined(__WIN32__) || defined(WIN32) || defined(__CYGWIN__))+ #define _WIN32+#endif // _WIN32++// In order for extension support to be portable, we need to define an+// OpenGL function call method. We use the keyword APIENTRY, which is+// defined for Win32. (Note: Windows also needs this for <GL/gl.h>)+#ifndef APIENTRY+ #ifdef _WIN32+ #define APIENTRY __stdcall+ #else+ #define APIENTRY+ #endif+ #define GL_APIENTRY_DEFINED+#endif // APIENTRY+++// The following three defines are here solely to make some Windows-based+// <GL/gl.h> files happy. Theoretically we could include <windows.h>, but+// it has the major drawback of severely polluting our namespace.++// Under Windows, we need WINGDIAPI defined+#if !defined(WINGDIAPI) && defined(_WIN32)+ #if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__POCC__)+ // Microsoft Visual C++, Borland C++ Builder and Pelles C+ #define WINGDIAPI __declspec(dllimport)+ #elif defined(__LCC__)+ // LCC-Win32+ #define WINGDIAPI __stdcall+ #else+ // Others (e.g. MinGW, Cygwin)+ #define WINGDIAPI extern+ #endif+ #define GL_WINGDIAPI_DEFINED+#endif // WINGDIAPI++// Some <GL/glu.h> files also need CALLBACK defined+#if !defined(CALLBACK) && defined(_WIN32)+ #if defined(_MSC_VER)+ // Microsoft Visual C+++ #if (defined(_M_MRX000) || defined(_M_IX86) || defined(_M_ALPHA) || defined(_M_PPC)) && !defined(MIDL_PASS)+ #define CALLBACK __stdcall+ #else+ #define CALLBACK+ #endif+ #else+ // Other Windows compilers+ #define CALLBACK __stdcall+ #endif+ #define GLU_CALLBACK_DEFINED+#endif // CALLBACK++// Microsoft Visual C++, Borland C++ and Pelles C <GL/glu.h> needs wchar_t+#if defined(_WIN32) && (defined(_MSC_VER) || defined(__BORLANDC__) || defined(__POCC__)) && !defined(_WCHAR_T_DEFINED)+ typedef unsigned short wchar_t;+ #define _WCHAR_T_DEFINED+#endif // _WCHAR_T_DEFINED+++// ---------------- GLFW related system specific defines -----------------++#if defined(_WIN32) && defined(GLFW_BUILD_DLL)++ // We are building a Win32 DLL+ #define GLFWAPI __declspec(dllexport)+ #define GLFWAPIENTRY __stdcall+ #define GLFWCALL __stdcall++#elif defined(_WIN32) && defined(GLFW_DLL)++ // We are calling a Win32 DLL+ #if defined(__LCC__)+ #define GLFWAPI extern+ #else+ #define GLFWAPI __declspec(dllimport)+ #endif+ #define GLFWAPIENTRY __stdcall+ #define GLFWCALL __stdcall++#else++ // We are either building/calling a static lib or we are non-win32+ #define GLFWAPIENTRY+ #define GLFWAPI+ #define GLFWCALL++#endif++// -------------------- END SYSTEM/COMPILER SPECIFIC ---------------------++// Include standard OpenGL headers: GLFW uses GL_FALSE/GL_TRUE, and it is+// convenient for the user to only have to include <GL/glfw.h>. This also+// solves the problem with Windows <GL/gl.h> and <GL/glu.h> needing some+// special defines which normally requires the user to include <windows.h>+// (which is not a nice solution for portable programs).+#if defined(__APPLE_CC__)+ #include <OpenGL/gl.h>+ #include <OpenGL/glu.h>+#else+ #include <GL/gl.h>+ #include <GL/glu.h>+#endif+++//========================================================================+// GLFW version+//========================================================================++#define GLFW_VERSION_MAJOR 2+#define GLFW_VERSION_MINOR 6+#define GLFW_VERSION_REVISION 0+++//========================================================================+// Input handling definitions+//========================================================================++// Key and button state/action definitions+#define GLFW_RELEASE 0+#define GLFW_PRESS 1++// Keyboard key definitions: 8-bit ISO-8859-1 (Latin 1) encoding is used+// for printable keys (such as A-Z, 0-9 etc), and values above 256+// represent special (non-printable) keys (e.g. F1, Page Up etc).+#define GLFW_KEY_UNKNOWN -1+#define GLFW_KEY_SPACE 32+#define GLFW_KEY_SPECIAL 256+#define GLFW_KEY_ESC (GLFW_KEY_SPECIAL+1)+#define GLFW_KEY_F1 (GLFW_KEY_SPECIAL+2)+#define GLFW_KEY_F2 (GLFW_KEY_SPECIAL+3)+#define GLFW_KEY_F3 (GLFW_KEY_SPECIAL+4)+#define GLFW_KEY_F4 (GLFW_KEY_SPECIAL+5)+#define GLFW_KEY_F5 (GLFW_KEY_SPECIAL+6)+#define GLFW_KEY_F6 (GLFW_KEY_SPECIAL+7)+#define GLFW_KEY_F7 (GLFW_KEY_SPECIAL+8)+#define GLFW_KEY_F8 (GLFW_KEY_SPECIAL+9)+#define GLFW_KEY_F9 (GLFW_KEY_SPECIAL+10)+#define GLFW_KEY_F10 (GLFW_KEY_SPECIAL+11)+#define GLFW_KEY_F11 (GLFW_KEY_SPECIAL+12)+#define GLFW_KEY_F12 (GLFW_KEY_SPECIAL+13)+#define GLFW_KEY_F13 (GLFW_KEY_SPECIAL+14)+#define GLFW_KEY_F14 (GLFW_KEY_SPECIAL+15)+#define GLFW_KEY_F15 (GLFW_KEY_SPECIAL+16)+#define GLFW_KEY_F16 (GLFW_KEY_SPECIAL+17)+#define GLFW_KEY_F17 (GLFW_KEY_SPECIAL+18)+#define GLFW_KEY_F18 (GLFW_KEY_SPECIAL+19)+#define GLFW_KEY_F19 (GLFW_KEY_SPECIAL+20)+#define GLFW_KEY_F20 (GLFW_KEY_SPECIAL+21)+#define GLFW_KEY_F21 (GLFW_KEY_SPECIAL+22)+#define GLFW_KEY_F22 (GLFW_KEY_SPECIAL+23)+#define GLFW_KEY_F23 (GLFW_KEY_SPECIAL+24)+#define GLFW_KEY_F24 (GLFW_KEY_SPECIAL+25)+#define GLFW_KEY_F25 (GLFW_KEY_SPECIAL+26)+#define GLFW_KEY_UP (GLFW_KEY_SPECIAL+27)+#define GLFW_KEY_DOWN (GLFW_KEY_SPECIAL+28)+#define GLFW_KEY_LEFT (GLFW_KEY_SPECIAL+29)+#define GLFW_KEY_RIGHT (GLFW_KEY_SPECIAL+30)+#define GLFW_KEY_LSHIFT (GLFW_KEY_SPECIAL+31)+#define GLFW_KEY_RSHIFT (GLFW_KEY_SPECIAL+32)+#define GLFW_KEY_LCTRL (GLFW_KEY_SPECIAL+33)+#define GLFW_KEY_RCTRL (GLFW_KEY_SPECIAL+34)+#define GLFW_KEY_LALT (GLFW_KEY_SPECIAL+35)+#define GLFW_KEY_RALT (GLFW_KEY_SPECIAL+36)+#define GLFW_KEY_TAB (GLFW_KEY_SPECIAL+37)+#define GLFW_KEY_ENTER (GLFW_KEY_SPECIAL+38)+#define GLFW_KEY_BACKSPACE (GLFW_KEY_SPECIAL+39)+#define GLFW_KEY_INSERT (GLFW_KEY_SPECIAL+40)+#define GLFW_KEY_DEL (GLFW_KEY_SPECIAL+41)+#define GLFW_KEY_PAGEUP (GLFW_KEY_SPECIAL+42)+#define GLFW_KEY_PAGEDOWN (GLFW_KEY_SPECIAL+43)+#define GLFW_KEY_HOME (GLFW_KEY_SPECIAL+44)+#define GLFW_KEY_END (GLFW_KEY_SPECIAL+45)+#define GLFW_KEY_KP_0 (GLFW_KEY_SPECIAL+46)+#define GLFW_KEY_KP_1 (GLFW_KEY_SPECIAL+47)+#define GLFW_KEY_KP_2 (GLFW_KEY_SPECIAL+48)+#define GLFW_KEY_KP_3 (GLFW_KEY_SPECIAL+49)+#define GLFW_KEY_KP_4 (GLFW_KEY_SPECIAL+50)+#define GLFW_KEY_KP_5 (GLFW_KEY_SPECIAL+51)+#define GLFW_KEY_KP_6 (GLFW_KEY_SPECIAL+52)+#define GLFW_KEY_KP_7 (GLFW_KEY_SPECIAL+53)+#define GLFW_KEY_KP_8 (GLFW_KEY_SPECIAL+54)+#define GLFW_KEY_KP_9 (GLFW_KEY_SPECIAL+55)+#define GLFW_KEY_KP_DIVIDE (GLFW_KEY_SPECIAL+56)+#define GLFW_KEY_KP_MULTIPLY (GLFW_KEY_SPECIAL+57)+#define GLFW_KEY_KP_SUBTRACT (GLFW_KEY_SPECIAL+58)+#define GLFW_KEY_KP_ADD (GLFW_KEY_SPECIAL+59)+#define GLFW_KEY_KP_DECIMAL (GLFW_KEY_SPECIAL+60)+#define GLFW_KEY_KP_EQUAL (GLFW_KEY_SPECIAL+61)+#define GLFW_KEY_KP_ENTER (GLFW_KEY_SPECIAL+62)+#define GLFW_KEY_LAST GLFW_KEY_KP_ENTER++// Mouse button definitions+#define GLFW_MOUSE_BUTTON_1 0+#define GLFW_MOUSE_BUTTON_2 1+#define GLFW_MOUSE_BUTTON_3 2+#define GLFW_MOUSE_BUTTON_4 3+#define GLFW_MOUSE_BUTTON_5 4+#define GLFW_MOUSE_BUTTON_6 5+#define GLFW_MOUSE_BUTTON_7 6+#define GLFW_MOUSE_BUTTON_8 7+#define GLFW_MOUSE_BUTTON_LAST GLFW_MOUSE_BUTTON_8++// Mouse button aliases+#define GLFW_MOUSE_BUTTON_LEFT GLFW_MOUSE_BUTTON_1+#define GLFW_MOUSE_BUTTON_RIGHT GLFW_MOUSE_BUTTON_2+#define GLFW_MOUSE_BUTTON_MIDDLE GLFW_MOUSE_BUTTON_3+++// Joystick identifiers+#define GLFW_JOYSTICK_1 0+#define GLFW_JOYSTICK_2 1+#define GLFW_JOYSTICK_3 2+#define GLFW_JOYSTICK_4 3+#define GLFW_JOYSTICK_5 4+#define GLFW_JOYSTICK_6 5+#define GLFW_JOYSTICK_7 6+#define GLFW_JOYSTICK_8 7+#define GLFW_JOYSTICK_9 8+#define GLFW_JOYSTICK_10 9+#define GLFW_JOYSTICK_11 10+#define GLFW_JOYSTICK_12 11+#define GLFW_JOYSTICK_13 12+#define GLFW_JOYSTICK_14 13+#define GLFW_JOYSTICK_15 14+#define GLFW_JOYSTICK_16 15+#define GLFW_JOYSTICK_LAST GLFW_JOYSTICK_16+++//========================================================================+// Other definitions+//========================================================================++// glfwOpenWindow modes+#define GLFW_WINDOW 0x00010001+#define GLFW_FULLSCREEN 0x00010002++// glfwGetWindowParam tokens+#define GLFW_OPENED 0x00020001+#define GLFW_ACTIVE 0x00020002+#define GLFW_ICONIFIED 0x00020003+#define GLFW_ACCELERATED 0x00020004+#define GLFW_RED_BITS 0x00020005+#define GLFW_GREEN_BITS 0x00020006+#define GLFW_BLUE_BITS 0x00020007+#define GLFW_ALPHA_BITS 0x00020008+#define GLFW_DEPTH_BITS 0x00020009+#define GLFW_STENCIL_BITS 0x0002000A++// The following constants are used for both glfwGetWindowParam+// and glfwOpenWindowHint+#define GLFW_REFRESH_RATE 0x0002000B+#define GLFW_ACCUM_RED_BITS 0x0002000C+#define GLFW_ACCUM_GREEN_BITS 0x0002000D+#define GLFW_ACCUM_BLUE_BITS 0x0002000E+#define GLFW_ACCUM_ALPHA_BITS 0x0002000F+#define GLFW_AUX_BUFFERS 0x00020010+#define GLFW_STEREO 0x00020011+#define GLFW_WINDOW_NO_RESIZE 0x00020012+#define GLFW_FSAA_SAMPLES 0x00020013++// glfwEnable/glfwDisable tokens+#define GLFW_MOUSE_CURSOR 0x00030001+#define GLFW_STICKY_KEYS 0x00030002+#define GLFW_STICKY_MOUSE_BUTTONS 0x00030003+#define GLFW_SYSTEM_KEYS 0x00030004+#define GLFW_KEY_REPEAT 0x00030005+#define GLFW_AUTO_POLL_EVENTS 0x00030006++// glfwWaitThread wait modes+#define GLFW_WAIT 0x00040001+#define GLFW_NOWAIT 0x00040002++// glfwGetJoystickParam tokens+#define GLFW_PRESENT 0x00050001+#define GLFW_AXES 0x00050002+#define GLFW_BUTTONS 0x00050003++// glfwReadImage/glfwLoadTexture2D flags+#define GLFW_NO_RESCALE_BIT 0x00000001 // Only for glfwReadImage+#define GLFW_ORIGIN_UL_BIT 0x00000002+#define GLFW_BUILD_MIPMAPS_BIT 0x00000004 // Only for glfwLoadTexture2D+#define GLFW_ALPHA_MAP_BIT 0x00000008++// Time spans longer than this (seconds) are considered to be infinity+#define GLFW_INFINITY 100000.0+++//========================================================================+// Typedefs+//========================================================================++// The video mode structure used by glfwGetVideoModes()+typedef struct {+ int Width, Height;+ int RedBits, BlueBits, GreenBits;+} GLFWvidmode;++// Image/texture information+typedef struct {+ int Width, Height;+ int Format;+ int BytesPerPixel;+ unsigned char *Data;+} GLFWimage;++// Thread ID+typedef int GLFWthread;++// Mutex object+typedef void * GLFWmutex;++// Condition variable object+typedef void * GLFWcond;++// Function pointer types+typedef void (GLFWCALL * GLFWwindowsizefun)(int,int);+typedef int (GLFWCALL * GLFWwindowclosefun)(void);+typedef void (GLFWCALL * GLFWwindowrefreshfun)(void);+typedef void (GLFWCALL * GLFWmousebuttonfun)(int,int);+typedef void (GLFWCALL * GLFWmouseposfun)(int,int);+typedef void (GLFWCALL * GLFWmousewheelfun)(int);+typedef void (GLFWCALL * GLFWkeyfun)(int,int);+typedef void (GLFWCALL * GLFWcharfun)(int,int);+typedef void (GLFWCALL * GLFWthreadfun)(void *);+++//========================================================================+// Prototypes+//========================================================================++/*! @file glfw.h+ */+// GLFW initialization, termination and version querying+/*! @fn glfwInit+ */+GLFWAPI int GLFWAPIENTRY glfwInit( void );+GLFWAPI void GLFWAPIENTRY glfwTerminate( void );+GLFWAPI void GLFWAPIENTRY glfwGetVersion( int *major, int *minor, int *rev );++// Window handling+GLFWAPI int GLFWAPIENTRY glfwOpenWindow( int width, int height, int redbits, int greenbits, int bluebits, int alphabits, int depthbits, int stencilbits, int mode );+GLFWAPI void GLFWAPIENTRY glfwOpenWindowHint( int target, int hint );+GLFWAPI void GLFWAPIENTRY glfwCloseWindow( void );+GLFWAPI void GLFWAPIENTRY glfwSetWindowTitle( const char *title );+GLFWAPI void GLFWAPIENTRY glfwGetWindowSize( int *width, int *height );+GLFWAPI void GLFWAPIENTRY glfwSetWindowSize( int width, int height );+GLFWAPI void GLFWAPIENTRY glfwSetWindowPos( int x, int y );+GLFWAPI void GLFWAPIENTRY glfwIconifyWindow( void );+GLFWAPI void GLFWAPIENTRY glfwRestoreWindow( void );+GLFWAPI void GLFWAPIENTRY glfwSwapBuffers( void );+GLFWAPI void GLFWAPIENTRY glfwSwapInterval( int interval );+GLFWAPI int GLFWAPIENTRY glfwGetWindowParam( int param );+GLFWAPI void GLFWAPIENTRY glfwSetWindowSizeCallback( GLFWwindowsizefun cbfun );+GLFWAPI void GLFWAPIENTRY glfwSetWindowCloseCallback( GLFWwindowclosefun cbfun );+GLFWAPI void GLFWAPIENTRY glfwSetWindowRefreshCallback( GLFWwindowrefreshfun cbfun );++// Video mode functions+GLFWAPI int GLFWAPIENTRY glfwGetVideoModes( GLFWvidmode *list, int maxcount );+GLFWAPI void GLFWAPIENTRY glfwGetDesktopMode( GLFWvidmode *mode );++// Input handling+GLFWAPI void GLFWAPIENTRY glfwPollEvents( void );+GLFWAPI void GLFWAPIENTRY glfwWaitEvents( void );+GLFWAPI int GLFWAPIENTRY glfwGetKey( int key );+GLFWAPI int GLFWAPIENTRY glfwGetMouseButton( int button );+GLFWAPI void GLFWAPIENTRY glfwGetMousePos( int *xpos, int *ypos );+GLFWAPI void GLFWAPIENTRY glfwSetMousePos( int xpos, int ypos );+GLFWAPI int GLFWAPIENTRY glfwGetMouseWheel( void );+GLFWAPI void GLFWAPIENTRY glfwSetMouseWheel( int pos );+GLFWAPI void GLFWAPIENTRY glfwSetKeyCallback( GLFWkeyfun cbfun );+GLFWAPI void GLFWAPIENTRY glfwSetCharCallback( GLFWcharfun cbfun );+GLFWAPI void GLFWAPIENTRY glfwSetMouseButtonCallback( GLFWmousebuttonfun cbfun );+GLFWAPI void GLFWAPIENTRY glfwSetMousePosCallback( GLFWmouseposfun cbfun );+GLFWAPI void GLFWAPIENTRY glfwSetMouseWheelCallback( GLFWmousewheelfun cbfun );++// Joystick input+GLFWAPI int GLFWAPIENTRY glfwGetJoystickParam( int joy, int param );+GLFWAPI int GLFWAPIENTRY glfwGetJoystickPos( int joy, float *pos, int numaxes );+GLFWAPI int GLFWAPIENTRY glfwGetJoystickButtons( int joy, unsigned char *buttons, int numbuttons );++// Time+GLFWAPI double GLFWAPIENTRY glfwGetTime( void );+GLFWAPI void GLFWAPIENTRY glfwSetTime( double time );+GLFWAPI void GLFWAPIENTRY glfwSleep( double time );++// Extension support+GLFWAPI int GLFWAPIENTRY glfwExtensionSupported( const char *extension );+GLFWAPI void* GLFWAPIENTRY glfwGetProcAddress( const char *procname );+GLFWAPI void GLFWAPIENTRY glfwGetGLVersion( int *major, int *minor, int *rev );++// Threading support+GLFWAPI GLFWthread GLFWAPIENTRY glfwCreateThread( GLFWthreadfun fun, void *arg );+GLFWAPI void GLFWAPIENTRY glfwDestroyThread( GLFWthread ID );+GLFWAPI int GLFWAPIENTRY glfwWaitThread( GLFWthread ID, int waitmode );+GLFWAPI GLFWthread GLFWAPIENTRY glfwGetThreadID( void );+GLFWAPI GLFWmutex GLFWAPIENTRY glfwCreateMutex( void );+GLFWAPI void GLFWAPIENTRY glfwDestroyMutex( GLFWmutex mutex );+GLFWAPI void GLFWAPIENTRY glfwLockMutex( GLFWmutex mutex );+GLFWAPI void GLFWAPIENTRY glfwUnlockMutex( GLFWmutex mutex );+GLFWAPI GLFWcond GLFWAPIENTRY glfwCreateCond( void );+GLFWAPI void GLFWAPIENTRY glfwDestroyCond( GLFWcond cond );+GLFWAPI void GLFWAPIENTRY glfwWaitCond( GLFWcond cond, GLFWmutex mutex, double timeout );+GLFWAPI void GLFWAPIENTRY glfwSignalCond( GLFWcond cond );+GLFWAPI void GLFWAPIENTRY glfwBroadcastCond( GLFWcond cond );+GLFWAPI int GLFWAPIENTRY glfwGetNumberOfProcessors( void );++// Enable/disable functions+GLFWAPI void GLFWAPIENTRY glfwEnable( int token );+GLFWAPI void GLFWAPIENTRY glfwDisable( int token );++// Image/texture I/O support+GLFWAPI int GLFWAPIENTRY glfwReadImage( const char *name, GLFWimage *img, int flags );+GLFWAPI int GLFWAPIENTRY glfwReadMemoryImage( const void *data, long size, GLFWimage *img, int flags );+GLFWAPI void GLFWAPIENTRY glfwFreeImage( GLFWimage *img );+GLFWAPI int GLFWAPIENTRY glfwLoadTexture2D( const char *name, int flags );+GLFWAPI int GLFWAPIENTRY glfwLoadMemoryTexture2D( const void *data, long size, int flags );+GLFWAPI int GLFWAPIENTRY glfwLoadTextureImage2D( GLFWimage *img, int flags );+++#ifdef __cplusplus+}+#endif++#endif // __glfw_h_
+ glfw/lib/enable.c view
@@ -0,0 +1,295 @@+//========================================================================+// GLFW - An OpenGL framework+// File: enable.c+// Platform: Any+// API version: 2.6+// WWW: http://glfw.sourceforge.net+//------------------------------------------------------------------------+// Copyright (c) 2002-2006 Camilla Berglund+//+// This software is provided 'as-is', without any express or implied+// warranty. In no event will the authors be held liable for any damages+// arising from the use of this software.+//+// Permission is granted to anyone to use this software for any purpose,+// including commercial applications, and to alter it and redistribute it+// freely, subject to the following restrictions:+//+// 1. The origin of this software must not be misrepresented; you must not+// claim that you wrote the original software. If you use this software+// in a product, an acknowledgment in the product documentation would+// be appreciated but is not required.+//+// 2. Altered source versions must be plainly marked as such, and must not+// be misrepresented as being the original software.+//+// 3. This notice may not be removed or altered from any source+// distribution.+//+//========================================================================++#include "internal.h"+++//************************************************************************+//**** GLFW internal functions ****+//************************************************************************++//========================================================================+// Enable (show) mouse cursor+//========================================================================++static void _glfwEnableMouseCursor( void )+{+ int CenterPosX, CenterPosY;++ if( !_glfwWin.Opened || !_glfwWin.MouseLock )+ {+ return;+ }++ // Show mouse cursor+ _glfwPlatformShowMouseCursor();++ CenterPosX = _glfwWin.Width / 2;+ CenterPosY = _glfwWin.Height / 2;++ if( CenterPosX != _glfwInput.MousePosX || CenterPosY != _glfwInput.MousePosY )+ {+ _glfwPlatformSetMouseCursorPos( CenterPosX, CenterPosY );++ _glfwInput.MousePosX = CenterPosX;+ _glfwInput.MousePosY = CenterPosY;++ if( _glfwWin.MousePosCallback )+ {+ _glfwWin.MousePosCallback( _glfwInput.MousePosX, + _glfwInput.MousePosY );+ }+ }++ // From now on the mouse is unlocked+ _glfwWin.MouseLock = GL_FALSE;+}++//========================================================================+// Disable (hide) mouse cursor+//========================================================================++static void _glfwDisableMouseCursor( void )+{+ if( !_glfwWin.Opened || _glfwWin.MouseLock )+ {+ return;+ }++ // Hide mouse cursor+ _glfwPlatformHideMouseCursor();++ // Move cursor to the middle of the window+ _glfwPlatformSetMouseCursorPos( _glfwWin.Width>>1,+ _glfwWin.Height>>1 );++ // From now on the mouse is locked+ _glfwWin.MouseLock = GL_TRUE;+}+++//========================================================================+// _glfwEnableStickyKeys() - Enable sticky keys+// _glfwDisableStickyKeys() - Disable sticky keys+//========================================================================++static void _glfwEnableStickyKeys( void )+{+ _glfwInput.StickyKeys = 1;+}++static void _glfwDisableStickyKeys( void )+{+ int i;++ _glfwInput.StickyKeys = 0;++ // Release all sticky keys+ for( i = 0; i <= GLFW_KEY_LAST; i ++ )+ {+ if( _glfwInput.Key[ i ] == 2 )+ {+ _glfwInput.Key[ i ] = 0;+ }+ }+}+++//========================================================================+// _glfwEnableStickyMouseButtons() - Enable sticky mouse buttons+// _glfwDisableStickyMouseButtons() - Disable sticky mouse buttons+//========================================================================++static void _glfwEnableStickyMouseButtons( void )+{+ _glfwInput.StickyMouseButtons = 1;+}++static void _glfwDisableStickyMouseButtons( void )+{+ int i;++ _glfwInput.StickyMouseButtons = 0;++ // Release all sticky mouse buttons+ for( i = 0; i <= GLFW_MOUSE_BUTTON_LAST; i ++ )+ {+ if( _glfwInput.MouseButton[ i ] == 2 )+ {+ _glfwInput.MouseButton[ i ] = 0;+ }+ }+}+++//========================================================================+// _glfwEnableSystemKeys() - Enable system keys+// _glfwDisableSystemKeys() - Disable system keys+//========================================================================++static void _glfwEnableSystemKeys( void )+{+ if( !_glfwWin.SysKeysDisabled )+ {+ return;+ }++ _glfwPlatformEnableSystemKeys();++ // Indicate that system keys are no longer disabled+ _glfwWin.SysKeysDisabled = GL_FALSE;+}++static void _glfwDisableSystemKeys( void )+{+ if( _glfwWin.SysKeysDisabled )+ {+ return;+ }++ _glfwPlatformDisableSystemKeys();++ // Indicate that system keys are now disabled+ _glfwWin.SysKeysDisabled = GL_TRUE;+}+++//========================================================================+// _glfwEnableKeyRepeat() - Enable key repeat+// _glfwDisableKeyRepeat() - Disable key repeat+//========================================================================++static void _glfwEnableKeyRepeat( void )+{+ _glfwInput.KeyRepeat = 1;+}++static void _glfwDisableKeyRepeat( void )+{+ _glfwInput.KeyRepeat = 0;+}+++//========================================================================+// _glfwEnableAutoPollEvents() - Enable automatic event polling+// _glfwDisableAutoPollEvents() - Disable automatic event polling+//========================================================================++static void _glfwEnableAutoPollEvents( void )+{+ _glfwWin.AutoPollEvents = 1;+}++static void _glfwDisableAutoPollEvents( void )+{+ _glfwWin.AutoPollEvents = 0;+}++++//************************************************************************+//**** GLFW user functions ****+//************************************************************************++//========================================================================+// glfwEnable() - Enable certain GLFW/window/system functions.+//========================================================================++GLFWAPI void GLFWAPIENTRY glfwEnable( int token )+{+ // Is GLFW initialized?+ if( !_glfwInitialized )+ {+ return;+ }++ switch( token )+ {+ case GLFW_MOUSE_CURSOR:+ _glfwEnableMouseCursor();+ break;+ case GLFW_STICKY_KEYS:+ _glfwEnableStickyKeys();+ break;+ case GLFW_STICKY_MOUSE_BUTTONS:+ _glfwEnableStickyMouseButtons();+ break;+ case GLFW_SYSTEM_KEYS:+ _glfwEnableSystemKeys();+ break;+ case GLFW_KEY_REPEAT:+ _glfwEnableKeyRepeat();+ break;+ case GLFW_AUTO_POLL_EVENTS:+ _glfwEnableAutoPollEvents();+ break;+ default:+ break;+ }+}+++//========================================================================+// glfwDisable() - Disable certain GLFW/window/system functions.+//========================================================================++GLFWAPI void GLFWAPIENTRY glfwDisable( int token )+{+ // Is GLFW initialized?+ if( !_glfwInitialized )+ {+ return;+ }++ switch( token )+ {+ case GLFW_MOUSE_CURSOR:+ _glfwDisableMouseCursor();+ break;+ case GLFW_STICKY_KEYS:+ _glfwDisableStickyKeys();+ break;+ case GLFW_STICKY_MOUSE_BUTTONS:+ _glfwDisableStickyMouseButtons();+ break;+ case GLFW_SYSTEM_KEYS:+ _glfwDisableSystemKeys();+ break;+ case GLFW_KEY_REPEAT:+ _glfwDisableKeyRepeat();+ break;+ case GLFW_AUTO_POLL_EVENTS:+ _glfwDisableAutoPollEvents();+ break;+ default:+ break;+ }+}+
+ glfw/lib/fullscreen.c view
@@ -0,0 +1,95 @@+//========================================================================+// GLFW - An OpenGL framework+// File: fullscreen.c+// Platform: Any+// API version: 2.6+// WWW: http://glfw.sourceforge.net+//------------------------------------------------------------------------+// Copyright (c) 2002-2006 Camilla Berglund+//+// This software is provided 'as-is', without any express or implied+// warranty. In no event will the authors be held liable for any damages+// arising from the use of this software.+//+// Permission is granted to anyone to use this software for any purpose,+// including commercial applications, and to alter it and redistribute it+// freely, subject to the following restrictions:+//+// 1. The origin of this software must not be misrepresented; you must not+// claim that you wrote the original software. If you use this software+// in a product, an acknowledgment in the product documentation would+// be appreciated but is not required.+//+// 2. Altered source versions must be plainly marked as such, and must not+// be misrepresented as being the original software.+//+// 3. This notice may not be removed or altered from any source+// distribution.+//+//========================================================================++#include "internal.h"+++//************************************************************************+//**** GLFW user functions ****+//************************************************************************++//========================================================================+// glfwGetVideoModes() - Get a list of available video modes+//========================================================================++GLFWAPI int GLFWAPIENTRY glfwGetVideoModes( GLFWvidmode *list,+ int maxcount )+{+ int count, i, swap, res1, res2, depth1, depth2;+ GLFWvidmode vm;++ if( !_glfwInitialized || maxcount <= 0 || list == (GLFWvidmode*) 0 )+ {+ return 0;+ }++ // Get list of video modes+ count = _glfwPlatformGetVideoModes( list, maxcount );++ // Sort list (bubble sort)+ do+ {+ swap = 0;+ for( i = 0; i < count-1; ++ i )+ {+ res1 = list[i].Width*list[i].Height;+ depth1 = list[i].RedBits+list[i].GreenBits+list[i].BlueBits;+ res2 = list[i+1].Width*list[i+1].Height;+ depth2 = list[i+1].RedBits+list[i+1].GreenBits++ list[i+1].BlueBits;+ if( (depth2<depth1) || ((depth2==depth1) && (res2<res1)) )+ {+ vm = list[i];+ list[i] = list[i+1];+ list[i+1] = vm;+ swap = 1;+ }+ }+ }+ while( swap );++ return count;+}+++//========================================================================+// glfwGetDesktopMode() - Get the desktop video mode+//========================================================================++GLFWAPI void GLFWAPIENTRY glfwGetDesktopMode( GLFWvidmode *mode )+{+ if( !_glfwInitialized || mode == (GLFWvidmode*) 0 )+ {+ return;+ }++ _glfwPlatformGetDesktopMode( mode );+}+
+ glfw/lib/glext.c view
@@ -0,0 +1,201 @@+//========================================================================+// GLFW - An OpenGL framework+// File: glext.c+// Platform: Any+// API version: 2.6+// WWW: http://glfw.sourceforge.net+//------------------------------------------------------------------------+// Copyright (c) 2002-2006 Camilla Berglund+//+// This software is provided 'as-is', without any express or implied+// warranty. In no event will the authors be held liable for any damages+// arising from the use of this software.+//+// Permission is granted to anyone to use this software for any purpose,+// including commercial applications, and to alter it and redistribute it+// freely, subject to the following restrictions:+//+// 1. The origin of this software must not be misrepresented; you must not+// claim that you wrote the original software. If you use this software+// in a product, an acknowledgment in the product documentation would+// be appreciated but is not required.+//+// 2. Altered source versions must be plainly marked as such, and must not+// be misrepresented as being the original software.+//+// 3. This notice may not be removed or altered from any source+// distribution.+//+//========================================================================++#include "internal.h"+++//************************************************************************+//**** GLFW internal functions ****+//************************************************************************++//========================================================================+// _glfwStringInExtensionString() - Check if a string can be found in an+// OpenGL extension string+//========================================================================++int _glfwStringInExtensionString( const char *string,+ const GLubyte *extensions )+{+ const GLubyte *start;+ GLubyte *where, *terminator;++ // It takes a bit of care to be fool-proof about parsing the+ // OpenGL extensions string. Don't be fooled by sub-strings,+ // etc.+ start = extensions;+ while( 1 )+ {+ where = (GLubyte *) strstr( (const char *) start, string );+ if( !where )+ {+ return GL_FALSE;+ }+ terminator = where + strlen( string );+ if( where == start || *(where - 1) == ' ' )+ {+ if( *terminator == ' ' || *terminator == '\0' )+ {+ break;+ }+ }+ start = terminator;+ }++ return GL_TRUE;+}++++//************************************************************************+//**** GLFW user functions ****+//************************************************************************++//========================================================================+// glfwExtensionSupported() - Check if an OpenGL extension is available+// at runtime+//========================================================================++GLFWAPI int GLFWAPIENTRY glfwExtensionSupported( const char *extension )+{+ const GLubyte *extensions;+ GLubyte *where;++ // Is GLFW initialized?+ if( !_glfwInitialized || !_glfwWin.Opened )+ {+ return GL_FALSE;+ }++ // Extension names should not have spaces+ where = (GLubyte *) strchr( extension, ' ' );+ if( where || *extension == '\0' )+ {+ return GL_FALSE;+ }++ // Check if extension is in the standard OpenGL extensions string+ extensions = (GLubyte *) glGetString( GL_EXTENSIONS );+ if( extensions != NULL )+ {+ if( _glfwStringInExtensionString( extension, extensions ) )+ {+ return GL_TRUE;+ }+ }++ // Additional platform specific extension checking (e.g. WGL)+ if( _glfwPlatformExtensionSupported( extension ) )+ {+ return GL_TRUE;+ }++ return GL_FALSE;+}+++//========================================================================+// glfwGetProcAddress() - Get the function pointer to an OpenGL function.+// This function can be used to get access to extended OpenGL functions.+//========================================================================++GLFWAPI void * GLFWAPIENTRY glfwGetProcAddress( const char *procname )+{+ // Is GLFW initialized?+ if( !_glfwInitialized || !_glfwWin.Opened )+ {+ return NULL;+ }++ return _glfwPlatformGetProcAddress( procname );+}+++//========================================================================+// glfwGetGLVersion() - Get OpenGL version+//========================================================================++GLFWAPI void GLFWAPIENTRY glfwGetGLVersion( int *major, int *minor,+ int *rev )+{+ GLuint _major, _minor = 0, _rev = 0;+ const GLubyte *version;+ GLubyte *ptr;++ // Is GLFW initialized?+ if( !_glfwInitialized || !_glfwWin.Opened )+ {+ return;+ }++ // Get OpenGL version string+ version = glGetString( GL_VERSION );+ if( !version )+ {+ return;+ }++ // Parse string+ ptr = (GLubyte*) version;+ for( _major = 0; *ptr >= '0' && *ptr <= '9'; ptr ++ )+ {+ _major = 10*_major + (*ptr - '0');+ }+ if( *ptr == '.' )+ {+ ptr ++;+ for( _minor = 0; *ptr >= '0' && *ptr <= '9'; ptr ++ )+ {+ _minor = 10*_minor + (*ptr - '0');+ }+ if( *ptr == '.' )+ {+ ptr ++;+ for( _rev = 0; *ptr >= '0' && *ptr <= '9'; ptr ++ )+ {+ _rev = 10*_rev + (*ptr - '0');+ }+ }+ }++ // Return parsed values+ if( major != NULL )+ {+ *major = _major;+ }+ if( minor != NULL )+ {+ *minor = _minor;+ }+ if( rev != NULL )+ {+ *rev = _rev;+ }+}+
+ glfw/lib/image.c view
@@ -0,0 +1,629 @@+//========================================================================+// GLFW - An OpenGL framework+// File: image.c+// Platform: Any+// API version: 2.6+// WWW: http://glfw.sourceforge.net+//------------------------------------------------------------------------+// Copyright (c) 2002-2006 Camilla Berglund+//+// This software is provided 'as-is', without any express or implied+// warranty. In no event will the authors be held liable for any damages+// arising from the use of this software.+//+// Permission is granted to anyone to use this software for any purpose,+// including commercial applications, and to alter it and redistribute it+// freely, subject to the following restrictions:+//+// 1. The origin of this software must not be misrepresented; you must not+// claim that you wrote the original software. If you use this software+// in a product, an acknowledgment in the product documentation would+// be appreciated but is not required.+//+// 2. Altered source versions must be plainly marked as such, and must not+// be misrepresented as being the original software.+//+// 3. This notice may not be removed or altered from any source+// distribution.+//+//========================================================================++//========================================================================+// Description:+//+// This module acts as an interface for different image file formats (the+// image file format is detected automatically).+//+// By default the loaded image is rescaled (using bilinear interpolation)+// to the next higher 2^N x 2^M resolution, unless it has a valid+// 2^N x 2^M resolution. The interpolation is quite slow, even if the+// routine has been optimized for speed (a 200x200 RGB image is scaled to+// 256x256 in ~30 ms on a P3-500).+//+// Paletted images are converted to RGB/RGBA images.+//+// A convenience function is also included (glfwLoadTexture2D), which+// loads a texture image from a file directly to OpenGL texture memory,+// with an option to generate all mipmap levels. GL_SGIS_generate_mipmap+// is used whenever available, which should give an optimal mipmap+// generation speed (possibly performed in hardware). A software fallback+// method is included when GL_SGIS_generate_mipmap is not supported (it+// generates all mipmaps of a 256x256 RGB texture in ~3 ms on a P3-500).+//+//========================================================================+++#include "internal.h"+++// We want to support automatic mipmap generation+#ifndef GL_SGIS_generate_mipmap+ #define GL_GENERATE_MIPMAP_SGIS 0x8191+ #define GL_GENERATE_MIPMAP_HINT_SGIS 0x8192+ #define GL_SGIS_generate_mipmap 1+#endif // GL_SGIS_generate_mipmap+++//************************************************************************+//**** GLFW internal functions ****+//************************************************************************++//========================================================================+// _glfwUpsampleImage() - Upsample image, from size w1 x h1 to w2 x h2+//========================================================================++static void _glfwUpsampleImage( unsigned char *src, unsigned char *dst,+ int w1, int h1, int w2, int h2, int bpp )+{+ int m, n, k, x, y, col8;+ float dx, dy, xstep, ystep, col, col1, col2;+ unsigned char *src1, *src2, *src3, *src4;++ // Calculate scaling factor+ xstep = (float)(w1-1) / (float)(w2-1);+ ystep = (float)(h1-1) / (float)(h2-1);++ // Copy source data to destination data with bilinear interpolation+ // Note: The rather strange look of this routine is a direct result of+ // my attempts at optimizing it. Improvements are welcome!+ dy = 0.0f;+ y = 0;+ for( n = 0; n < h2; n ++ )+ {+ dx = 0.0f;+ src1 = &src[ y*w1*bpp ];+ src3 = y < (h1-1) ? src1 + w1*bpp : src1;+ src2 = src1 + bpp;+ src4 = src3 + bpp;+ x = 0;+ for( m = 0; m < w2; m ++ )+ {+ for( k = 0; k < bpp; k ++ )+ {+ col1 = *src1 ++;+ col2 = *src2 ++;+ col = col1 + (col2 - col1) * dx;+ col1 = *src3 ++;+ col2 = *src4 ++;+ col2 = col1 + (col2 - col1) * dx;+ col += (col2 - col) * dy;+ col8 = (int) (col + 0.5);+ if( col8 >= 256 ) col8 = 255;+ *dst++ = (unsigned char) col8;+ }+ dx += xstep;+ if( dx >= 1.0f )+ {+ x ++;+ dx -= 1.0f;+ if( x >= (w1-1) )+ {+ src2 = src1;+ src4 = src3;+ }+ }+ else+ {+ src1 -= bpp;+ src2 -= bpp;+ src3 -= bpp;+ src4 -= bpp;+ }+ }+ dy += ystep;+ if( dy >= 1.0f )+ {+ y ++;+ dy -= 1.0f;+ }+ }+}+++//========================================================================+// _glfwHalveImage() - Build the next mip-map level+//========================================================================++static int _glfwHalveImage( GLubyte *src, int *width, int *height,+ int components )+{+ int halfwidth, halfheight, m, n, k, idx1, idx2;+ GLubyte *dst;++ // Last level?+ if( *width <= 1 && *height <= 1 )+ {+ return GL_FALSE;+ }++ // Calculate new width and height (handle 1D case)+ halfwidth = *width > 1 ? *width / 2 : 1;+ halfheight = *height > 1 ? *height / 2 : 1;++ // Downsample image with a simple box-filter+ dst = src;+ if( *width == 1 || *height == 1 )+ {+ // 1D case+ for( m = 0; m < halfwidth+halfheight-1; m ++ )+ {+ for( k = 0; k < components; k ++ )+ {+ *dst ++ = (GLubyte) (((int)*src ++ (int)src[components] + 1) >> 1);+ src ++;+ }+ src += components;+ }+ }+ else+ {+ // 2D case+ idx1 = *width*components;+ idx2 = (*width+1)*components;+ for( m = 0; m < halfheight; m ++ )+ {+ for( n = 0; n < halfwidth; n ++ )+ {+ for( k = 0; k < components; k ++ )+ {+ *dst ++ = (GLubyte) (((int)*src ++ (int)src[components] ++ (int)src[idx1] ++ (int)src[idx2] + 2) >> 2);+ src ++;+ }+ src += components;+ }+ src += components * (*width);+ }+ }++ // Return new width and height+ *width = halfwidth;+ *height = halfheight;++ return GL_TRUE;+}+++//========================================================================+// _glfwRescaleImage() - Rescales an image into power-of-two dimensions+//========================================================================++static int _glfwRescaleImage( GLFWimage* image )+{+ int width, height, log2, newsize;+ unsigned char *data;++ // Calculate next larger 2^N width+ for( log2 = 0, width = image->Width; width > 1; width >>= 1, log2 ++ )+ ;+ width = (int) 1 << log2;+ if( width < image->Width )+ {+ width <<= 1;+ }++ // Calculate next larger 2^M height+ for( log2 = 0, height = image->Height; height > 1; height >>= 1, log2 ++ )+ ;+ height = (int) 1 << log2;+ if( height < image->Height )+ {+ height <<= 1;+ }++ // Do we really need to rescale?+ if( width != image->Width || height != image->Height )+ {+ // Allocate memory for new (upsampled) image data+ newsize = width * height * image->BytesPerPixel;+ data = (unsigned char *) malloc( newsize );+ if( data == NULL )+ {+ free( image->Data );+ return GL_FALSE;+ }++ // Copy old image data to new image data with interpolation+ _glfwUpsampleImage( image->Data, data, image->Width, image->Height,+ width, height, image->BytesPerPixel );++ // Free memory for old image data (not needed anymore)+ free( image->Data );++ // Set pointer to new image data, and set new image dimensions+ image->Data = data;+ image->Width = width;+ image->Height = height;+ }++ return GL_TRUE;+}+++//************************************************************************+//**** GLFW user functions ****+//************************************************************************++//========================================================================+// glfwReadImage() - Read an image from a named file+//========================================================================++GLFWAPI int GLFWAPIENTRY glfwReadImage( const char *name, GLFWimage *img,+ int flags )+{+ _GLFWstream stream;++ // Is GLFW initialized?+ if( !_glfwInitialized )+ {+ return GL_FALSE;+ }++ // Start with an empty image descriptor+ img->Width = 0;+ img->Height = 0;+ img->BytesPerPixel = 0;+ img->Data = NULL;++ // Open file+ if( !_glfwOpenFileStream( &stream, name, "rb" ) )+ {+ return GL_FALSE;+ }++ // We only support TGA files at the moment+ if( !_glfwReadTGA( &stream, img, flags ) )+ {+ _glfwCloseStream( &stream );+ return GL_FALSE;+ }++ // Close stream+ _glfwCloseStream( &stream );++ // Should we rescale the image to closest 2^N x 2^M resolution?+ if( !(flags & GLFW_NO_RESCALE_BIT) )+ {+ if( !_glfwRescaleImage( img ) )+ {+ return GL_FALSE;+ }+ }++ // Interpret BytesPerPixel as an OpenGL format+ switch( img->BytesPerPixel )+ {+ default:+ case 1:+ if( flags & GLFW_ALPHA_MAP_BIT )+ {+ img->Format = GL_ALPHA;+ }+ else+ {+ img->Format = GL_LUMINANCE;+ }+ break;+ case 3:+ img->Format = GL_RGB;+ break;+ case 4:+ img->Format = GL_RGBA;+ break;+ }++ return GL_TRUE;+}+++//========================================================================+// glfwReadMemoryImage() - Read an image file from a memory buffer+//========================================================================++GLFWAPI int GLFWAPIENTRY glfwReadMemoryImage( const void *data, long size, GLFWimage *img, int flags )+{+ _GLFWstream stream;++ // Is GLFW initialized?+ if( !_glfwInitialized )+ {+ return GL_FALSE;+ }++ // Start with an empty image descriptor+ img->Width = 0;+ img->Height = 0;+ img->BytesPerPixel = 0;+ img->Data = NULL;++ // Open buffer+ if( !_glfwOpenBufferStream( &stream, (void*) data, size ) )+ {+ return GL_FALSE;+ }++ // We only support TGA files at the moment+ if( !_glfwReadTGA( &stream, img, flags ) )+ {+ _glfwCloseStream( &stream );+ return GL_FALSE;+ }++ // Close stream+ _glfwCloseStream( &stream );++ // Should we rescale the image to closest 2^N x 2^M resolution?+ if( !(flags & GLFW_NO_RESCALE_BIT) )+ {+ if( !_glfwRescaleImage( img ) )+ {+ return GL_FALSE;+ }+ }++ // Interpret BytesPerPixel as an OpenGL format+ switch( img->BytesPerPixel )+ {+ default:+ case 1:+ if( flags & GLFW_ALPHA_MAP_BIT )+ {+ img->Format = GL_ALPHA;+ }+ else+ {+ img->Format = GL_LUMINANCE;+ }+ break;+ case 3:+ img->Format = GL_RGB;+ break;+ case 4:+ img->Format = GL_RGBA;+ break;+ }++ return GL_TRUE;+}+++//========================================================================+// glfwFreeImage() - Free allocated memory for an image+//========================================================================++GLFWAPI void GLFWAPIENTRY glfwFreeImage( GLFWimage *img )+{+ // Is GLFW initialized?+ if( !_glfwInitialized )+ {+ return;+ }++ // Free memory+ if( img->Data != NULL )+ {+ free( img->Data );+ img->Data = NULL;+ }++ // Clear all fields+ img->Width = 0;+ img->Height = 0;+ img->Format = 0;+ img->BytesPerPixel = 0;+}+++//========================================================================+// glfwLoadTexture2D() - Read an image from a file, and upload it to+// texture memory+//========================================================================++GLFWAPI int GLFWAPIENTRY glfwLoadTexture2D( const char *name, int flags )+{+ GLFWimage img;++ // Is GLFW initialized?+ if( !_glfwInitialized || !_glfwWin.Opened )+ {+ return GL_FALSE;+ }++ // Force rescaling if necessary+ if( !_glfwWin.Has_GL_ARB_texture_non_power_of_two )+ {+ flags &= (~GLFW_NO_RESCALE_BIT);+ }++ // Read image from file+ if( !glfwReadImage( name, &img, flags ) )+ {+ return GL_FALSE;+ }++ if( !glfwLoadTextureImage2D( &img, flags ) )+ {+ return GL_FALSE;+ }++ // Data buffer is not needed anymore+ glfwFreeImage( &img );++ return GL_TRUE;+}+++//========================================================================+// glfwLoadMemoryTexture2D() - Read an image from a buffer, and upload it to+// texture memory+//========================================================================++GLFWAPI int GLFWAPIENTRY glfwLoadMemoryTexture2D( const void *data, long size, int flags )+{+ GLFWimage img;++ // Is GLFW initialized?+ if( !_glfwInitialized || !_glfwWin.Opened )+ {+ return GL_FALSE;+ }++ // Force rescaling if necessary+ if( !_glfwWin.Has_GL_ARB_texture_non_power_of_two )+ {+ flags &= (~GLFW_NO_RESCALE_BIT);+ }++ // Read image from file+ if( !glfwReadMemoryImage( data, size, &img, flags ) )+ {+ return GL_FALSE;+ }++ if( !glfwLoadTextureImage2D( &img, flags ) )+ {+ return GL_FALSE;+ }++ // Data buffer is not needed anymore+ glfwFreeImage( &img );++ return GL_TRUE;+}+++//========================================================================+// glfwLoadTextureImage2D() - Upload an image object to texture memory+//========================================================================++GLFWAPI int GLFWAPIENTRY glfwLoadTextureImage2D( GLFWimage *img, int flags )+{+ GLint UnpackAlignment, GenMipMap;+ int level, format, AutoGen, newsize, n;+ unsigned char *data, *dataptr;++ // Is GLFW initialized?+ if( !_glfwInitialized || !_glfwWin.Opened )+ {+ return GL_FALSE;+ }++ // TODO: Use GL_MAX_TEXTURE_SIZE or GL_PROXY_TEXTURE_2D to determine+ // whether the image size is valid.+ // NOTE: May require box filter downsampling routine.++ // Do we need to convert the alpha map to RGBA format (OpenGL 1.0)?+ if( (_glfwWin.GLVerMajor == 1) && (_glfwWin.GLVerMinor == 0) &&+ (img->Format == GL_ALPHA) )+ {+ // We go to RGBA representation instead+ img->BytesPerPixel = 4;++ // Allocate memory for new RGBA image data+ newsize = img->Width * img->Height * img->BytesPerPixel;+ data = (unsigned char *) malloc( newsize );+ if( data == NULL )+ {+ free( img->Data );+ return GL_FALSE;+ }++ // Convert Alpha map to RGBA+ dataptr = data;+ for( n = 0; n < (img->Width*img->Height); ++ n )+ {+ *dataptr ++ = 255;+ *dataptr ++ = 255;+ *dataptr ++ = 255;+ *dataptr ++ = img->Data[n];+ }++ // Free memory for old image data (not needed anymore)+ free( img->Data );++ // Set pointer to new image data+ img->Data = data;+ }++ // Set unpack alignment to one byte+ glGetIntegerv( GL_UNPACK_ALIGNMENT, &UnpackAlignment );+ glPixelStorei( GL_UNPACK_ALIGNMENT, 1 );++ // Should we use automatic mipmap generation?+ AutoGen = ( flags & GLFW_BUILD_MIPMAPS_BIT ) &&+ _glfwWin.Has_GL_SGIS_generate_mipmap;++ // Enable automatic mipmap generation+ if( AutoGen )+ {+ glGetTexParameteriv( GL_TEXTURE_2D, GL_GENERATE_MIPMAP_SGIS,+ &GenMipMap );+ glTexParameteri( GL_TEXTURE_2D, GL_GENERATE_MIPMAP_SGIS,+ GL_TRUE );+ }++ // Format specification is different for OpenGL 1.0+ if( _glfwWin.GLVerMajor == 1 && _glfwWin.GLVerMinor == 0 )+ {+ format = img->BytesPerPixel;+ }+ else+ {+ format = img->Format;+ }++ // Upload to texture memeory+ level = 0;+ do+ {+ // Upload this mipmap level+ glTexImage2D( GL_TEXTURE_2D, level, format,+ img->Width, img->Height, 0, format,+ GL_UNSIGNED_BYTE, (void*) img->Data );++ // Build next mipmap level manually, if required+ if( ( flags & GLFW_BUILD_MIPMAPS_BIT ) && !AutoGen )+ {+ level = _glfwHalveImage( img->Data, &img->Width,+ &img->Height, img->BytesPerPixel ) ?+ level + 1 : 0;+ }+ }+ while( level != 0 );++ // Restore old automatic mipmap generation state+ if( AutoGen )+ {+ glTexParameteri( GL_TEXTURE_2D, GL_GENERATE_MIPMAP_SGIS,+ GenMipMap );+ }++ // Restore old unpack alignment+ glPixelStorei( GL_UNPACK_ALIGNMENT, UnpackAlignment );++ return GL_TRUE;+}+
+ glfw/lib/init.c view
@@ -0,0 +1,108 @@+//========================================================================+// GLFW - An OpenGL framework+// File: init.c+// Platform: Any+// API version: 2.6+// WWW: http://glfw.sourceforge.net+//------------------------------------------------------------------------+// Copyright (c) 2002-2006 Camilla Berglund+//+// This software is provided 'as-is', without any express or implied+// warranty. In no event will the authors be held liable for any damages+// arising from the use of this software.+//+// Permission is granted to anyone to use this software for any purpose,+// including commercial applications, and to alter it and redistribute it+// freely, subject to the following restrictions:+//+// 1. The origin of this software must not be misrepresented; you must not+// claim that you wrote the original software. If you use this software+// in a product, an acknowledgment in the product documentation would+// be appreciated but is not required.+//+// 2. Altered source versions must be plainly marked as such, and must not+// be misrepresented as being the original software.+//+// 3. This notice may not be removed or altered from any source+// distribution.+//+//========================================================================++#define _init_c_+#include "internal.h"+++//************************************************************************+//**** GLFW user functions ****+//************************************************************************++//========================================================================+// glfwInit() - Initialize various GLFW state+//========================================================================++GLFWAPI int GLFWAPIENTRY glfwInit( void )+{+ // Is GLFW already initialized?+ if( _glfwInitialized )+ {+ return GL_TRUE;+ }++ // Window is not yet opened+ _glfwWin.Opened = GL_FALSE;++ // Default enable/disable settings+ _glfwWin.SysKeysDisabled = GL_FALSE;++ // Clear window hints+ _glfwClearWindowHints();++ // Platform specific initialization+ if( !_glfwPlatformInit() )+ {+ return GL_FALSE;+ }++ // Form now on, GLFW state is valid+ _glfwInitialized = GL_TRUE;++ return GL_TRUE;+}++++//========================================================================+// glfwTerminate() - Close window and kill all threads.+//========================================================================++GLFWAPI void GLFWAPIENTRY glfwTerminate( void )+{+ // Is GLFW initialized?+ if( !_glfwInitialized )+ {+ return;+ }++ // Platform specific termination+ if( !_glfwPlatformTerminate() )+ {+ return;+ }++ // GLFW is no longer initialized+ _glfwInitialized = GL_FALSE;+}+++//========================================================================+// glfwGetVersion() - Get GLFW version+//========================================================================++GLFWAPI void GLFWAPIENTRY glfwGetVersion( int *major, int *minor,+ int *rev )+{+ if( major != NULL ) *major = GLFW_VERSION_MAJOR;+ if( minor != NULL ) *minor = GLFW_VERSION_MINOR;+ if( rev != NULL ) *rev = GLFW_VERSION_REVISION;+}+
+ glfw/lib/input.c view
@@ -0,0 +1,280 @@+//========================================================================+// GLFW - An OpenGL framework+// File: input.c+// Platform: Any+// API version: 2.6+// WWW: http://glfw.sourceforge.net+//------------------------------------------------------------------------+// Copyright (c) 2002-2006 Camilla Berglund+//+// This software is provided 'as-is', without any express or implied+// warranty. In no event will the authors be held liable for any damages+// arising from the use of this software.+//+// Permission is granted to anyone to use this software for any purpose,+// including commercial applications, and to alter it and redistribute it+// freely, subject to the following restrictions:+//+// 1. The origin of this software must not be misrepresented; you must not+// claim that you wrote the original software. If you use this software+// in a product, an acknowledgment in the product documentation would+// be appreciated but is not required.+//+// 2. Altered source versions must be plainly marked as such, and must not+// be misrepresented as being the original software.+//+// 3. This notice may not be removed or altered from any source+// distribution.+//+//========================================================================++#include "internal.h"+++//========================================================================+// glfwGetKey()+//========================================================================++GLFWAPI int GLFWAPIENTRY glfwGetKey( int key )+{+ // Is GLFW initialized?+ if( !_glfwInitialized || !_glfwWin.Opened )+ {+ return GLFW_RELEASE;+ }++ // Is it a valid key?+ if( key < 0 || key > GLFW_KEY_LAST )+ {+ return GLFW_RELEASE;+ }++ if( _glfwInput.Key[ key ] == GLFW_STICK )+ {+ // Sticky mode: release key now+ _glfwInput.Key[ key ] = GLFW_RELEASE;+ return GLFW_PRESS;+ }++ return (int) _glfwInput.Key[ key ];+}+++//========================================================================+// glfwGetMouseButton()+//========================================================================++GLFWAPI int GLFWAPIENTRY glfwGetMouseButton( int button )+{+ // Is GLFW initialized?+ if( !_glfwInitialized || !_glfwWin.Opened )+ {+ return GLFW_RELEASE;+ }++ // Is it a valid mouse button?+ if( button < 0 || button > GLFW_MOUSE_BUTTON_LAST )+ {+ return GLFW_RELEASE;+ }++ if( _glfwInput.MouseButton[ button ] == GLFW_STICK )+ {+ // Sticky mode: release mouse button now+ _glfwInput.MouseButton[ button ] = GLFW_RELEASE;+ return GLFW_PRESS;+ }++ return (int) _glfwInput.MouseButton[ button ];+}+++//========================================================================+// glfwGetMousePos()+//========================================================================++GLFWAPI void GLFWAPIENTRY glfwGetMousePos( int *xpos, int *ypos )+{+ // Is GLFW initialized?+ if( !_glfwInitialized || !_glfwWin.Opened )+ {+ return;+ }++ // Return mouse position+ if( xpos != NULL )+ {+ *xpos = _glfwInput.MousePosX;+ }+ if( ypos != NULL )+ {+ *ypos = _glfwInput.MousePosY;+ }+}+++//========================================================================+// glfwSetMousePos()+//========================================================================++GLFWAPI void GLFWAPIENTRY glfwSetMousePos( int xpos, int ypos )+{+ // Is GLFW initialized?+ if( !_glfwInitialized || !_glfwWin.Opened )+ {+ return;+ }++ // Don't do anything if the mouse position did not change+ if( xpos == _glfwInput.MousePosX && ypos == _glfwInput.MousePosY )+ {+ return;+ }++ // Set GLFW mouse position+ _glfwInput.MousePosX = xpos;+ _glfwInput.MousePosY = ypos;++ // If we have a locked mouse, do not change cursor position+ if( _glfwWin.MouseLock )+ {+ return;+ }++ // Update physical cursor position+ _glfwPlatformSetMouseCursorPos( xpos, ypos );+}+++//========================================================================+// glfwGetMouseWheel()+//========================================================================++GLFWAPI int GLFWAPIENTRY glfwGetMouseWheel( void )+{+ // Is GLFW initialized?+ if( !_glfwInitialized || !_glfwWin.Opened )+ {+ return 0;+ }++ // Return mouse wheel position+ return _glfwInput.WheelPos;+}+++//========================================================================+// glfwSetMouseWheel()+//========================================================================++GLFWAPI void GLFWAPIENTRY glfwSetMouseWheel( int pos )+{+ // Is GLFW initialized?+ if( !_glfwInitialized || !_glfwWin.Opened )+ {+ return;+ }++ // Set mouse wheel position+ _glfwInput.WheelPos = pos;+}+++//========================================================================+// glfwSetKeyCallback() - Set callback function for keyboard input+//========================================================================++GLFWAPI void GLFWAPIENTRY glfwSetKeyCallback( GLFWkeyfun cbfun )+{+ // Is GLFW initialized?+ if( !_glfwInitialized || !_glfwWin.Opened )+ {+ return;+ }++ // Set callback function+ _glfwWin.KeyCallback = cbfun;+}+++//========================================================================+// glfwSetCharCallback() - Set callback function for character input+//========================================================================++GLFWAPI void GLFWAPIENTRY glfwSetCharCallback( GLFWcharfun cbfun )+{+ // Is GLFW initialized?+ if( !_glfwInitialized || !_glfwWin.Opened )+ {+ return;+ }++ // Set callback function+ _glfwWin.CharCallback = cbfun;+}+++//========================================================================+// glfwSetMouseButtonCallback() - Set callback function for mouse clicks+//========================================================================++GLFWAPI void GLFWAPIENTRY glfwSetMouseButtonCallback( GLFWmousebuttonfun cbfun )+{+ // Is GLFW initialized?+ if( !_glfwInitialized || !_glfwWin.Opened )+ {+ return;+ }++ // Set callback function+ _glfwWin.MouseButtonCallback = cbfun;+}+++//========================================================================+// glfwSetMousePosCallback() - Set callback function for mouse moves+//========================================================================++GLFWAPI void GLFWAPIENTRY glfwSetMousePosCallback( GLFWmouseposfun cbfun )+{+ // Is GLFW initialized?+ if( !_glfwInitialized || !_glfwWin.Opened )+ {+ return;+ }++ // Set callback function+ _glfwWin.MousePosCallback = cbfun;++ // Call the callback function to let the application know the current+ // mouse position+ if( cbfun )+ {+ cbfun( _glfwInput.MousePosX, _glfwInput.MousePosY );+ }+}+++//========================================================================+// glfwSetMouseWheelCallback() - Set callback function for mouse wheel+//========================================================================++GLFWAPI void GLFWAPIENTRY glfwSetMouseWheelCallback( GLFWmousewheelfun cbfun )+{+ // Is GLFW initialized?+ if( !_glfwInitialized || !_glfwWin.Opened )+ {+ return;+ }++ // Set callback function+ _glfwWin.MouseWheelCallback = cbfun;++ // Call the callback function to let the application know the current+ // mouse wheel position+ if( cbfun )+ {+ cbfun( _glfwInput.WheelPos );+ }+}+
+ glfw/lib/internal.h view
@@ -0,0 +1,210 @@+//========================================================================+// GLFW - An OpenGL framework+// File: internal.h+// Platform: Any+// API version: 2.6+// WWW: http://glfw.sourceforge.net+//------------------------------------------------------------------------+// Copyright (c) 2002-2006 Camilla Berglund+//+// This software is provided 'as-is', without any express or implied+// warranty. In no event will the authors be held liable for any damages+// arising from the use of this software.+//+// Permission is granted to anyone to use this software for any purpose,+// including commercial applications, and to alter it and redistribute it+// freely, subject to the following restrictions:+//+// 1. The origin of this software must not be misrepresented; you must not+// claim that you wrote the original software. If you use this software+// in a product, an acknowledgment in the product documentation would+// be appreciated but is not required.+//+// 2. Altered source versions must be plainly marked as such, and must not+// be misrepresented as being the original software.+//+// 3. This notice may not be removed or altered from any source+// distribution.+//+//========================================================================++#ifndef _internal_h_+#define _internal_h_++//========================================================================+// GLFWGLOBAL is a macro that places all global variables in the init.c+// module (all other modules reference global variables as 'extern')+//========================================================================++#if defined( _init_c_ )+#define GLFWGLOBAL+#else+#define GLFWGLOBAL extern+#endif+++//========================================================================+// Input handling definitions+//========================================================================++// Internal key and button state/action definitions+#define GLFW_STICK 2+++//========================================================================+// System independent include files+//========================================================================++#include <stdlib.h>+#include <string.h>+#include <stdio.h>+++//------------------------------------------------------------------------+// Platform specific definitions goes in platform.h (which also includes+// glfw.h)+//------------------------------------------------------------------------++#include "platform.h"+++//========================================================================+// System independent global variables (GLFW internals)+//========================================================================++// Flag indicating if GLFW has been initialized+#if defined( _init_c_ )+int _glfwInitialized = 0;+#else+GLFWGLOBAL int _glfwInitialized;+#endif+++//------------------------------------------------------------------------+// Window hints (set by glfwOpenWindowHint - will go into _GLFWthread)+//------------------------------------------------------------------------+typedef struct {+ int RefreshRate;+ int AccumRedBits;+ int AccumGreenBits;+ int AccumBlueBits;+ int AccumAlphaBits;+ int AuxBuffers;+ int Stereo;+ int WindowNoResize;+ int Samples;+} _GLFWhints;++GLFWGLOBAL _GLFWhints _glfwWinHints;+++//------------------------------------------------------------------------+// Abstracted data stream (for image I/O)+//------------------------------------------------------------------------+typedef struct {+ FILE* File;+ void* Data;+ long Position;+ long Size;+} _GLFWstream;+++//========================================================================+// Prototypes for platform specific implementation functions+//========================================================================++// Init/terminate+int _glfwPlatformInit( void );+int _glfwPlatformTerminate( void );++// Enable/Disable+void _glfwPlatformEnableSystemKeys( void );+void _glfwPlatformDisableSystemKeys( void );++// Fullscreen+int _glfwPlatformGetVideoModes( GLFWvidmode *list, int maxcount );+void _glfwPlatformGetDesktopMode( GLFWvidmode *mode );++// OpenGL extensions+int _glfwPlatformExtensionSupported( const char *extension );+void * _glfwPlatformGetProcAddress( const char *procname );++// Joystick+int _glfwPlatformGetJoystickParam( int joy, int param );+int _glfwPlatformGetJoystickPos( int joy, float *pos, int numaxes );+int _glfwPlatformGetJoystickButtons( int joy, unsigned char *buttons, int numbuttons );++// Threads+GLFWthread _glfwPlatformCreateThread( GLFWthreadfun fun, void *arg );+void _glfwPlatformDestroyThread( GLFWthread ID );+int _glfwPlatformWaitThread( GLFWthread ID, int waitmode );+GLFWthread _glfwPlatformGetThreadID( void );+GLFWmutex _glfwPlatformCreateMutex( void );+void _glfwPlatformDestroyMutex( GLFWmutex mutex );+void _glfwPlatformLockMutex( GLFWmutex mutex );+void _glfwPlatformUnlockMutex( GLFWmutex mutex );+GLFWcond _glfwPlatformCreateCond( void );+void _glfwPlatformDestroyCond( GLFWcond cond );+void _glfwPlatformWaitCond( GLFWcond cond, GLFWmutex mutex, double timeout );+void _glfwPlatformSignalCond( GLFWcond cond );+void _glfwPlatformBroadcastCond( GLFWcond cond );+int _glfwPlatformGetNumberOfProcessors( void );++// Time+double _glfwPlatformGetTime( void );+void _glfwPlatformSetTime( double time );+void _glfwPlatformSleep( double time );++// Window management+int _glfwPlatformOpenWindow( int width, int height, int redbits, int greenbits, int bluebits, int alphabits, int depthbits, int stencilbits, int mode, _GLFWhints* hints );+void _glfwPlatformCloseWindow( void );+void _glfwPlatformSetWindowTitle( const char *title );+void _glfwPlatformSetWindowSize( int width, int height );+void _glfwPlatformSetWindowPos( int x, int y );+void _glfwPlatformIconifyWindow( void );+void _glfwPlatformRestoreWindow( void );+void _glfwPlatformSwapBuffers( void );+void _glfwPlatformSwapInterval( int interval );+void _glfwPlatformRefreshWindowParams( void );+void _glfwPlatformPollEvents( void );+void _glfwPlatformWaitEvents( void );+void _glfwPlatformHideMouseCursor( void );+void _glfwPlatformShowMouseCursor( void );+void _glfwPlatformSetMouseCursorPos( int x, int y );+++//========================================================================+// Prototypes for platform independent internal functions+//========================================================================++// Window management (window.c)+void _glfwClearWindowHints( void );++// Input handling (window.c)+void _glfwClearInput( void );+void _glfwInputDeactivation( void );+void _glfwInputKey( int key, int action );+void _glfwInputChar( int character, int action );+void _glfwInputMouseClick( int button, int action );++// Threads (thread.c)+_GLFWthread * _glfwGetThreadPointer( int ID );+void _glfwAppendThread( _GLFWthread * t );+void _glfwRemoveThread( _GLFWthread * t );++// OpenGL extensions (glext.c)+int _glfwStringInExtensionString( const char *string, const GLubyte *extensions );++// Abstracted data streams (stream.c)+int _glfwOpenFileStream( _GLFWstream *stream, const char *name, const char *mode );+int _glfwOpenBufferStream( _GLFWstream *stream, void *data, long size );+long _glfwReadStream( _GLFWstream *stream, void *data, long size );+long _glfwTellStream( _GLFWstream *stream );+int _glfwSeekStream( _GLFWstream *stream, long offset, int whence );+void _glfwCloseStream( _GLFWstream *stream );++// Targa image I/O (tga.c)+int _glfwReadTGA( _GLFWstream *s, GLFWimage *img, int flags );+++#endif // _internal_h_
+ glfw/lib/joystick.c view
@@ -0,0 +1,101 @@+//========================================================================+// GLFW - An OpenGL framework+// File: joystick.c+// Platform: Any+// API version: 2.6+// WWW: http://glfw.sourceforge.net+//------------------------------------------------------------------------+// Copyright (c) 2002-2006 Camilla Berglund+//+// This software is provided 'as-is', without any express or implied+// warranty. In no event will the authors be held liable for any damages+// arising from the use of this software.+//+// Permission is granted to anyone to use this software for any purpose,+// including commercial applications, and to alter it and redistribute it+// freely, subject to the following restrictions:+//+// 1. The origin of this software must not be misrepresented; you must not+// claim that you wrote the original software. If you use this software+// in a product, an acknowledgment in the product documentation would+// be appreciated but is not required.+//+// 2. Altered source versions must be plainly marked as such, and must not+// be misrepresented as being the original software.+//+// 3. This notice may not be removed or altered from any source+// distribution.+//+//========================================================================++#include "internal.h"+++//************************************************************************+//**** GLFW user functions ****+//************************************************************************++//========================================================================+// glfwGetJoystickParam() - Determine joystick capabilities+//========================================================================++GLFWAPI int GLFWAPIENTRY glfwGetJoystickParam( int joy, int param )+{+ // Is GLFW initialized?+ if( !_glfwInitialized )+ {+ return 0;+ }++ return _glfwPlatformGetJoystickParam( joy, param );+}+++//========================================================================+// glfwGetJoystickPos() - Get joystick axis positions+//========================================================================++GLFWAPI int GLFWAPIENTRY glfwGetJoystickPos( int joy, float *pos,+ int numaxes )+{+ int i;++ // Is GLFW initialized?+ if( !_glfwInitialized )+ {+ return 0;+ }++ // Clear positions+ for( i = 0; i < numaxes; i++ )+ {+ pos[ i ] = 0.0f;+ }++ return _glfwPlatformGetJoystickPos( joy, pos, numaxes );+}+++//========================================================================+// glfwGetJoystickButtons() - Get joystick button states+//========================================================================++GLFWAPI int GLFWAPIENTRY glfwGetJoystickButtons( int joy,+ unsigned char *buttons, int numbuttons )+{+ int i;++ // Is GLFW initialized?+ if( !_glfwInitialized )+ {+ return 0;+ }++ // Clear button states+ for( i = 0; i < numbuttons; i++ )+ {+ buttons[ i ] = GLFW_RELEASE;+ }++ return _glfwPlatformGetJoystickButtons( joy, buttons, numbuttons );+}
+ glfw/lib/macosx/macosx_enable.c view
@@ -0,0 +1,42 @@+//========================================================================+// GLFW - An OpenGL framework+// File: macosx_enable.c+// Platform: Mac OS X+// API Version: 2.6+// WWW: http://glfw.sourceforge.net+//------------------------------------------------------------------------+// Copyright (c) 2002-2006 Camilla Berglund+//+// This software is provided 'as-is', without any express or implied+// warranty. In no event will the authors be held liable for any damages+// arising from the use of this software.+//+// Permission is granted to anyone to use this software for any purpose,+// including commercial applications, and to alter it and redistribute it+// freely, subject to the following restrictions:+//+// 1. The origin of this software must not be misrepresented; you must not+// claim that you wrote the original software. If you use this software+// in a product, an acknowledgment in the product documentation would+// be appreciated but is not required.+//+// 2. Altered source versions must be plainly marked as such, and must not+// be misrepresented as being the original software.+//+// 3. This notice may not be removed or altered from any source+// distribution.+//+//========================================================================++void _glfwPlatformEnableSystemKeys( void )+{+ // Nothing to do; event handling code checks the status of+ // _glfwWin.SysKeysDisabled to ensure this behavior.+}++void _glfwPlatformDisableSystemKeys( void )+{+ // Nothing to do; event handling code checks the status of+ // _glfwWin.SysKeysDisabled to ensure this behavior.+}+
+ glfw/lib/macosx/macosx_fullscreen.c view
@@ -0,0 +1,126 @@+//========================================================================+// GLFW - An OpenGL framework+// File: macosx_fullscreen.c+// Platform: Mac OS X+// API Version: 2.6+// WWW: http://glfw.sourceforge.net+//------------------------------------------------------------------------+// Copyright (c) 2002-2006 Camilla Berglund+//+// This software is provided 'as-is', without any express or implied+// warranty. In no event will the authors be held liable for any damages+// arising from the use of this software.+//+// Permission is granted to anyone to use this software for any purpose,+// including commercial applications, and to alter it and redistribute it+// freely, subject to the following restrictions:+//+// 1. The origin of this software must not be misrepresented; you must not+// claim that you wrote the original software. If you use this software+// in a product, an acknowledgment in the product documentation would+// be appreciated but is not required.+//+// 2. Altered source versions must be plainly marked as such, and must not+// be misrepresented as being the original software.+//+// 3. This notice may not be removed or altered from any source+// distribution.+//+//========================================================================++#include "internal.h"++//========================================================================+// _glfwVideoModesEqual() - Compares two video modes+//========================================================================++static int _glfwVideoModesEqual( GLFWvidmode* first,+ GLFWvidmode* second )+{+ if( first->Width != second->Width )+ return 0;+ + if( first->Height != second->Height )+ return 0;+ + if( first->RedBits + first->GreenBits + first->BlueBits !=+ second->RedBits + second->GreenBits + second->BlueBits )+ return 0;+ + return 1;+}+ +//========================================================================+// _glfwCGToGLFWVideoMode() - Converts a CG mode to a GLFW mode+//========================================================================++static void _glfwCGToGLFWVideoMode( CFDictionaryRef cgMode,+ GLFWvidmode* glfwMode )+{+ int bitsPerSample;++ CFNumberGetValue( CFDictionaryGetValue( cgMode, kCGDisplayWidth ),+ kCFNumberIntType,+ &(glfwMode->Width) );+ CFNumberGetValue( CFDictionaryGetValue( cgMode, kCGDisplayHeight ),+ kCFNumberIntType,+ &(glfwMode->Height) );++ CFNumberGetValue( CFDictionaryGetValue( cgMode, kCGDisplayBitsPerSample ),+ kCFNumberIntType,+ &bitsPerSample );++ glfwMode->RedBits = bitsPerSample;+ glfwMode->GreenBits = bitsPerSample;+ glfwMode->BlueBits = bitsPerSample;+}++//========================================================================+// _glfwPlatformGetVideoModes() - Get a list of available video modes+//========================================================================++int _glfwPlatformGetVideoModes( GLFWvidmode *list, int maxcount )+{+ int i, j, maxModes, numModes;+ GLFWvidmode mode;+ CFArrayRef availableModes = CGDisplayAvailableModes( kCGDirectMainDisplay );+ CFIndex numberOfAvailableModes = CFArrayGetCount( availableModes );++ numModes = 0;+ maxModes = ( numberOfAvailableModes < maxcount ?+ numberOfAvailableModes :+ maxcount );++ for( i = 0; i < maxModes; ++i )+ {+ _glfwCGToGLFWVideoMode( CFArrayGetValueAtIndex( availableModes, i ),+ &mode );++ // Is it a valid mode? (only list depths >= 15 bpp)+ if( mode.RedBits + mode.GreenBits + mode.BlueBits < 15 )+ continue;+ + // Check for duplicate of current mode in target list+ for( j = 0; j < numModes; ++j )+ {+ if( _glfwVideoModesEqual( &mode, &(list[j]) ) )+ break;+ }+ + // If empty list or no match found+ if( numModes == 0 || j == numModes )+ list[numModes++] = mode;+ }++ return numModes;+}++//========================================================================+// glfwGetDesktopMode() - Get the desktop video mode+//========================================================================++void _glfwPlatformGetDesktopMode( GLFWvidmode *mode )+{+ _glfwCGToGLFWVideoMode( _glfwDesktopVideoMode, mode );+}+
+ glfw/lib/macosx/macosx_glext.c view
@@ -0,0 +1,52 @@+//========================================================================+// GLFW - An OpenGL framework+// File: macosx_glext.c+// Platform: Mac OS X+// API Version: 2.6+// WWW: http://glfw.sourceforge.net+//------------------------------------------------------------------------+// Copyright (c) 2002-2006 Camilla Berglund+//+// This software is provided 'as-is', without any express or implied+// warranty. In no event will the authors be held liable for any damages+// arising from the use of this software.+//+// Permission is granted to anyone to use this software for any purpose,+// including commercial applications, and to alter it and redistribute it+// freely, subject to the following restrictions:+//+// 1. The origin of this software must not be misrepresented; you must not+// claim that you wrote the original software. If you use this software+// in a product, an acknowledgment in the product documentation would+// be appreciated but is not required.+//+// 2. Altered source versions must be plainly marked as such, and must not+// be misrepresented as being the original software.+//+// 3. This notice may not be removed or altered from any source+// distribution.+//+//========================================================================++#include "internal.h"++int _glfwPlatformExtensionSupported( const char *extension )+{+ // There are no AGL, CGL or NSGL extensions.+ return GL_FALSE;+}++void * _glfwPlatformGetProcAddress( const char *procname )+{+ CFStringRef symbolName = CFStringCreateWithCString( kCFAllocatorDefault,+ procname,+ kCFStringEncodingASCII );++ void *symbol = CFBundleGetFunctionPointerForName( _glfwLibrary.Libs.OpenGLFramework,+ symbolName );++ CFRelease( symbolName );++ return symbol;+}+
+ glfw/lib/macosx/macosx_init.c view
@@ -0,0 +1,194 @@+//========================================================================+// GLFW - An OpenGL framework+// File: macosx_init.c+// Platform: Mac OS X+// API Version: 2.6+// WWW: http://glfw.sourceforge.net+//------------------------------------------------------------------------+// Copyright (c) 2002-2006 Camilla Berglund+//+// This software is provided 'as-is', without any express or implied+// warranty. In no event will the authors be held liable for any damages+// arising from the use of this software.+//+// Permission is granted to anyone to use this software for any purpose,+// including commercial applications, and to alter it and redistribute it+// freely, subject to the following restrictions:+//+// 1. The origin of this software must not be misrepresented; you must not+// claim that you wrote the original software. If you use this software+// in a product, an acknowledgment in the product documentation would+// be appreciated but is not required.+//+// 2. Altered source versions must be plainly marked as such, and must not+// be misrepresented as being the original software.+//+// 3. This notice may not be removed or altered from any source+// distribution.+//+//========================================================================++#include "internal.h"++#include <unistd.h>++//========================================================================+// Global variables+//========================================================================++// KCHR resource pointer for keycode translation+void *KCHRPtr;+++//========================================================================+// _glfwInitThreads() - Initialize GLFW thread package+//========================================================================++static void _glfwInitThreads( void )+{+ // Initialize critical section handle+ (void) pthread_mutex_init( &_glfwThrd.CriticalSection, NULL );++ // The first thread (the main thread) has ID 0+ _glfwThrd.NextID = 0;++ // Fill out information about the main thread (this thread)+ _glfwThrd.First.ID = _glfwThrd.NextID ++;+ _glfwThrd.First.Function = NULL;+ _glfwThrd.First.PosixID = pthread_self();+ _glfwThrd.First.Previous = NULL;+ _glfwThrd.First.Next = NULL;+}++#define NO_BUNDLE_MESSAGE \+ "Working in unbundled mode. " \+ "You should build a .app wrapper for your Mac OS X applications.\n"++#define UNBUNDLED \+ fprintf(stderr, NO_BUNDLE_MESSAGE); \+ _glfwLibrary.Unbundled = 1; \+ return++void _glfwChangeToResourcesDirectory( void )+{+ CFBundleRef mainBundle = CFBundleGetMainBundle();+ CFURLRef resourcesURL = CFBundleCopyResourcesDirectoryURL( mainBundle );+ char resourcesPath[ _GLFW_MAX_PATH_LENGTH ];+ + CFStringRef lastComponent = CFURLCopyLastPathComponent( resourcesURL );+ if ( kCFCompareEqualTo != CFStringCompare(+ CFSTR( "Resources" ),+ lastComponent,+ 0 ) )+ {+ UNBUNDLED;+ }+ + CFRelease( lastComponent );++ if( !CFURLGetFileSystemRepresentation( resourcesURL,+ TRUE,+ (UInt8*)resourcesPath,+ _GLFW_MAX_PATH_LENGTH ) )+ {+ CFRelease( resourcesURL );+ UNBUNDLED;+ }++ CFRelease( resourcesURL );++ if( chdir( resourcesPath ) != 0 )+ {+ UNBUNDLED;+ }+}++int _glfwPlatformInit( void )+{+ struct timeval tv;+ UInt32 nullDummy = 0;++ _glfwWin.MacWindow = NULL;+ _glfwWin.AGLContext = NULL;+ _glfwWin.CGLContext = NULL;+ _glfwWin.WindowFunctions = NULL;+ _glfwWin.MouseUPP = NULL;+ _glfwWin.CommandUPP = NULL;+ _glfwWin.KeyboardUPP = NULL;+ _glfwWin.WindowUPP = NULL;+ + _glfwInput.Modifiers = 0;+ + _glfwLibrary.Unbundled = 0;+ + _glfwLibrary.Libs.OpenGLFramework+ = CFBundleGetBundleWithIdentifier( CFSTR( "com.apple.opengl" ) );+ if( _glfwLibrary.Libs.OpenGLFramework == NULL )+ {+ fprintf(+ stderr,+ "glfwInit failing because you aren't linked to OpenGL\n" );+ return GL_FALSE;+ }++ _glfwDesktopVideoMode = CGDisplayCurrentMode( kCGDirectMainDisplay );+ if( _glfwDesktopVideoMode == NULL )+ {+ fprintf(+ stderr,+ "glfwInit failing because it kind find the desktop display mode\n" );+ return GL_FALSE;+ }++ _glfwInitThreads();++ _glfwChangeToResourcesDirectory();++ if( !_glfwInstallEventHandlers() )+ {+ fprintf(+ stderr,+ "glfwInit failing because it can't install event handlers\n" );+ _glfwPlatformTerminate();+ return GL_FALSE;+ }++ // Ugly hack to reduce the nasty jump that occurs at the first non-+ // sys keypress, caused by OS X loading certain meta scripts used+ // for lexical- and raw keycode translation - instead of letting+ // this happen while our application is running, we do some blunt+ // function calls in advance just to get the script caching out of+ // the way BEFORE our window/screen is opened. These calls might+ // generate err return codes, but we don't care in this case.+ // NOTE: KCHRPtr is declared globally, because we need it later on.+ KCHRPtr = (void *)GetScriptVariable( smCurrentScript, smKCHRCache );+ KeyTranslate( KCHRPtr, 0, &nullDummy );+ UppercaseText( (char *)&nullDummy, 0, smSystemScript );++ gettimeofday( &tv, NULL );+ _glfwLibrary.Timer.t0 = tv.tv_sec + (double) tv.tv_usec / 1000000.0;++ return GL_TRUE;+}++int _glfwPlatformTerminate( void )+{+ if( _glfwWin.MouseUPP != NULL )+ {+ DisposeEventHandlerUPP( _glfwWin.MouseUPP );+ _glfwWin.MouseUPP = NULL;+ }+ if( _glfwWin.CommandUPP != NULL )+ {+ DisposeEventHandlerUPP( _glfwWin.CommandUPP );+ _glfwWin.CommandUPP = NULL;+ }+ if( _glfwWin.KeyboardUPP != NULL )+ {+ DisposeEventHandlerUPP( _glfwWin.KeyboardUPP );+ _glfwWin.KeyboardUPP = NULL;+ }+ + return GL_TRUE;+}+
+ glfw/lib/macosx/macosx_joystick.c view
@@ -0,0 +1,50 @@+//========================================================================+// GLFW - An OpenGL framework+// File: macosx_joystick.c+// Platform: Mac OS X+// API Version: 2.6+// WWW: http://glfw.sourceforge.net+//------------------------------------------------------------------------+// Copyright (c) 2002-2006 Camilla Berglund+//+// This software is provided 'as-is', without any express or implied+// warranty. In no event will the authors be held liable for any damages+// arising from the use of this software.+//+// Permission is granted to anyone to use this software for any purpose,+// including commercial applications, and to alter it and redistribute it+// freely, subject to the following restrictions:+//+// 1. The origin of this software must not be misrepresented; you must not+// claim that you wrote the original software. If you use this software+// in a product, an acknowledgment in the product documentation would+// be appreciated but is not required.+//+// 2. Altered source versions must be plainly marked as such, and must not+// be misrepresented as being the original software.+//+// 3. This notice may not be removed or altered from any source+// distribution.+//+//========================================================================++#include "internal.h"++// TO DO: use HID manager to implement joystick support.++int _glfwPlatformGetJoystickParam( int joy, int param )+{+ // GL_FALSE == 0+ return 0;+}++int _glfwPlatformGetJoystickPos( int joy, float *pos, int numaxes )+{+ return 0;+}++int _glfwPlatformGetJoystickButtons( int joy, unsigned char *buttons, int numbuttons )+{+ return 0;+}+
+ glfw/lib/macosx/macosx_thread.c view
@@ -0,0 +1,414 @@+//========================================================================+// GLFW - An OpenGL framework+// File: macosx_thread.c+// Platform: Mac OS X+// API Version: 2.6+// WWW: http://glfw.sourceforge.net+//------------------------------------------------------------------------+// Copyright (c) 2002-2006 Camilla Berglund+//+// This software is provided 'as-is', without any express or implied+// warranty. In no event will the authors be held liable for any damages+// arising from the use of this software.+//+// Permission is granted to anyone to use this software for any purpose,+// including commercial applications, and to alter it and redistribute it+// freely, subject to the following restrictions:+//+// 1. The origin of this software must not be misrepresented; you must not+// claim that you wrote the original software. If you use this software+// in a product, an acknowledgment in the product documentation would+// be appreciated but is not required.+//+// 2. Altered source versions must be plainly marked as such, and must not+// be misrepresented as being the original software.+//+// 3. This notice may not be removed or altered from any source+// distribution.+//+//========================================================================++#include "internal.h"++++//************************************************************************+//**** GLFW internal functions ****+//************************************************************************++//========================================================================+// _glfwNewThread() - This is simply a "wrapper" for calling the user+// thread function.+//========================================================================++void * _glfwNewThread( void * arg )+{+ GLFWthreadfun threadfun;+ _GLFWthread *t;++ // Get pointer to thread information for current thread+ t = _glfwGetThreadPointer( glfwGetThreadID() );+ if( t == NULL )+ {+ return 0;+ }++ // Get user thread function pointer+ threadfun = t->Function;++ // Call the user thread function+ threadfun( arg );++ // Remove thread from thread list+ ENTER_THREAD_CRITICAL_SECTION+ _glfwRemoveThread( t );+ LEAVE_THREAD_CRITICAL_SECTION++ // When the thread function returns, the thread will die...+ return NULL;+}++++//************************************************************************+//**** Platform implementation functions ****+//************************************************************************++//========================================================================+// _glfwPlatformCreateThread() - Create a new thread+//========================================================================++GLFWthread _glfwPlatformCreateThread( GLFWthreadfun fun, void *arg )+{+ GLFWthread ID;+ _GLFWthread *t;+ int result;++ // Enter critical section+ ENTER_THREAD_CRITICAL_SECTION++ // Create a new thread information memory area+ t = (_GLFWthread *) malloc( sizeof(_GLFWthread) );+ if( t == NULL )+ {+ // Leave critical section+ LEAVE_THREAD_CRITICAL_SECTION+ return -1;+ }++ // Get a new unique thread id+ ID = _glfwThrd.NextID ++;++ // Store thread information in the thread list+ t->Function = fun;+ t->ID = ID;++ // Create thread+ result = pthread_create(+ &t->PosixID, // Thread handle+ NULL, // Default thread attributes+ _glfwNewThread, // Thread function (a wrapper function)+ (void *)arg // Argument to thread is user argument+ );++ // Did the thread creation fail?+ if( result != 0 )+ {+ free( (void *) t );+ LEAVE_THREAD_CRITICAL_SECTION+ return -1;+ }++ // Append thread to thread list+ _glfwAppendThread( t );++ // Leave critical section+ LEAVE_THREAD_CRITICAL_SECTION++ // Return the GLFW thread ID+ return ID;+}+++//========================================================================+// _glfwPlatformDestroyThread() - Kill a thread. NOTE: THIS IS A VERY+// DANGEROUS OPERATION, AND SHOULD NOT BE USED EXCEPT IN EXTREME+// SITUATIONS!+//========================================================================++void _glfwPlatformDestroyThread( GLFWthread ID )+{+ _GLFWthread *t;++ // Enter critical section+ ENTER_THREAD_CRITICAL_SECTION++ // Get thread information pointer+ t = _glfwGetThreadPointer( ID );+ if( t == NULL )+ {+ LEAVE_THREAD_CRITICAL_SECTION+ return;+ }++ // Simply murder the process, no mercy!+ pthread_kill( t->PosixID, SIGKILL );++ // Remove thread from thread list+ _glfwRemoveThread( t );++ // Leave critical section+ LEAVE_THREAD_CRITICAL_SECTION+}+++//========================================================================+// _glfwPlatformWaitThread() - Wait for a thread to die+//========================================================================++int _glfwPlatformWaitThread( GLFWthread ID, int waitmode )+{+ pthread_t thread;+ _GLFWthread *t;++ // Enter critical section+ ENTER_THREAD_CRITICAL_SECTION++ // Get thread information pointer+ t = _glfwGetThreadPointer( ID );++ // Is the thread already dead?+ if( t == NULL )+ {+ LEAVE_THREAD_CRITICAL_SECTION+ return GL_TRUE;+ }++ // If got this far, the thread is alive => polling returns FALSE+ if( waitmode == GLFW_NOWAIT )+ {+ LEAVE_THREAD_CRITICAL_SECTION+ return GL_FALSE;+ }++ // Get thread handle+ thread = t->PosixID;++ // Leave critical section+ LEAVE_THREAD_CRITICAL_SECTION++ // Wait for thread to die+ (void) pthread_join( thread, NULL );++ return GL_TRUE;+}+++//========================================================================+// _glfwPlatformGetThreadID() - Return the thread ID for the current+// thread+//========================================================================++GLFWthread _glfwPlatformGetThreadID( void )+{+ _GLFWthread *t;+ GLFWthread ID = -1;+ pthread_t posixID;++ // Get current thread ID+ posixID = pthread_self();++ // Enter critical section+ ENTER_THREAD_CRITICAL_SECTION++ // Loop through entire list of threads to find the matching POSIX+ // thread ID+ for( t = &_glfwThrd.First; t != NULL; t = t->Next )+ {+ if( t->PosixID == posixID )+ {+ ID = t->ID;+ break;+ }+ }++ // Leave critical section+ LEAVE_THREAD_CRITICAL_SECTION++ // Return the found GLFW thread identifier+ return ID;+}+++//========================================================================+// _glfwPlatformCreateMutex() - Create a mutual exclusion object+//========================================================================++GLFWmutex _glfwPlatformCreateMutex( void )+{+ pthread_mutex_t *mutex;++ // Allocate memory for mutex+ mutex = (pthread_mutex_t *) malloc( sizeof( pthread_mutex_t ) );+ if( !mutex )+ {+ return NULL;+ }++ // Initialise a mutex object+ (void) pthread_mutex_init( mutex, NULL );++ // Cast to GLFWmutex and return+ return (GLFWmutex) mutex;+}+++//========================================================================+// _glfwPlatformDestroyMutex() - Destroy a mutual exclusion object+//========================================================================++void _glfwPlatformDestroyMutex( GLFWmutex mutex )+{+ // Destroy the mutex object+ pthread_mutex_destroy( (pthread_mutex_t *) mutex );++ // Free memory for mutex object+ free( (void *) mutex );+}+++//========================================================================+// _glfwPlatformLockMutex() - Request access to a mutex+//========================================================================++void _glfwPlatformLockMutex( GLFWmutex mutex )+{+ // Wait for mutex to be released+ (void) pthread_mutex_lock( (pthread_mutex_t *) mutex );+}+++//========================================================================+// _glfwPlatformUnlockMutex() - Release a mutex+//========================================================================++void _glfwPlatformUnlockMutex( GLFWmutex mutex )+{+ // Release mutex+ pthread_mutex_unlock( (pthread_mutex_t *) mutex );+}+++//========================================================================+// _glfwPlatformCreateCond() - Create a new condition variable object+//========================================================================++GLFWcond _glfwPlatformCreateCond( void )+{+ pthread_cond_t *cond;++ // Allocate memory for condition variable+ cond = (pthread_cond_t *) malloc( sizeof(pthread_cond_t) );+ if( !cond )+ {+ return NULL;+ }++ // Initialise condition variable+ (void) pthread_cond_init( cond, NULL );++ // Cast to GLFWcond and return+ return (GLFWcond) cond;+}+++//========================================================================+// _glfwPlatformDestroyCond() - Destroy a condition variable object+//========================================================================++void _glfwPlatformDestroyCond( GLFWcond cond )+{+ // Destroy the condition variable object+ (void) pthread_cond_destroy( (pthread_cond_t *) cond );++ // Free memory for condition variable object+ free( (void *) cond );+}+++//========================================================================+// _glfwPlatformWaitCond() - Wait for a condition to be raised+//========================================================================++void _glfwPlatformWaitCond( GLFWcond cond, GLFWmutex mutex,+ double timeout )+{+ struct timeval currenttime;+ struct timespec wait;+ long dt_sec, dt_usec;++ // Select infinite or timed wait+ if( timeout >= GLFW_INFINITY )+ {+ // Wait for condition (infinite wait)+ (void) pthread_cond_wait( (pthread_cond_t *) cond,+ (pthread_mutex_t *) mutex );+ }+ else+ {+ // Set timeout time, relatvie to current time+ gettimeofday( ¤ttime, NULL );+ dt_sec = (long) timeout;+ dt_usec = (long) ((timeout - (double)dt_sec) * 1000000.0);+ wait.tv_nsec = (currenttime.tv_usec + dt_usec) * 1000L;+ if( wait.tv_nsec > 1000000000L )+ {+ wait.tv_nsec -= 1000000000L;+ dt_sec ++;+ }+ wait.tv_sec = currenttime.tv_sec + dt_sec;++ // Wait for condition (timed wait)+ (void) pthread_cond_timedwait( (pthread_cond_t *) cond,+ (pthread_mutex_t *) mutex, &wait );+ }+}+++//========================================================================+// _glfwPlatformSignalCond() - Signal a condition to one waiting thread+//========================================================================++void _glfwPlatformSignalCond( GLFWcond cond )+{+ // Signal condition+ (void) pthread_cond_signal( (pthread_cond_t *) cond );+}+++//========================================================================+// _glfwPlatformBroadcastCond() - Broadcast a condition to all waiting+// threads+//========================================================================++void _glfwPlatformBroadcastCond( GLFWcond cond )+{+ // Broadcast condition+ (void) pthread_cond_broadcast( (pthread_cond_t *) cond );+}+++//========================================================================+// _glfwPlatformGetNumberOfProcessors() - Return the number of processors+// in the system.+//========================================================================++int _glfwPlatformGetNumberOfProcessors( void )+{+ int n;++ // Get number of processors online+ _glfw_numprocessors( n );+ return n;+}+
+ glfw/lib/macosx/macosx_time.c view
@@ -0,0 +1,112 @@+//========================================================================+// GLFW - An OpenGL framework+// File: macosx_time.c+// Platform: Mac OS X+// API Version: 2.6+// WWW: http://glfw.sourceforge.net+//------------------------------------------------------------------------+// Copyright (c) 2002-2006 Camilla Berglund+//+// This software is provided 'as-is', without any express or implied+// warranty. In no event will the authors be held liable for any damages+// arising from the use of this software.+//+// Permission is granted to anyone to use this software for any purpose,+// including commercial applications, and to alter it and redistribute it+// freely, subject to the following restrictions:+//+// 1. The origin of this software must not be misrepresented; you must not+// claim that you wrote the original software. If you use this software+// in a product, an acknowledgment in the product documentation would+// be appreciated but is not required.+//+// 2. Altered source versions must be plainly marked as such, and must not+// be misrepresented as being the original software.+//+// 3. This notice may not be removed or altered from any source+// distribution.+//+//========================================================================++#include "internal.h"++//************************************************************************+//**** Platform implementation functions ****+//************************************************************************++//========================================================================+// Return timer value in seconds+//========================================================================++double _glfwPlatformGetTime( void )+{+ struct timeval tv;++ gettimeofday( &tv, NULL );+ return tv.tv_sec + (double) tv.tv_usec / 1000000.0 - _glfwLibrary.Timer.t0;+}+++//========================================================================+// Set timer value in seconds+//========================================================================++void _glfwPlatformSetTime( double time )+{+ struct timeval tv;++ gettimeofday( &tv, NULL );+ _glfwLibrary.Timer.t0 = tv.tv_sec + (double) tv.tv_usec / 1000000.0 - time;+}+++//========================================================================+// Put a thread to sleep for a specified amount of time+//========================================================================++void _glfwPlatformSleep( double time )+{+ if( time == 0.0 )+ {+ sched_yield();+ return;+ }++ struct timeval currenttime;+ struct timespec wait;+ pthread_mutex_t mutex;+ pthread_cond_t cond;+ long dt_sec, dt_usec;++ // Not all pthread implementations have a pthread_sleep() function. We+ // do it the portable way, using a timed wait for a condition that we+ // will never signal. NOTE: The unistd functions sleep/usleep suspends+ // the entire PROCESS, not a signle thread, which is why we can not+ // use them to implement glfwSleep.++ // Set timeout time, relatvie to current time+ gettimeofday( ¤ttime, NULL );+ dt_sec = (long) time;+ dt_usec = (long) ((time - (double)dt_sec) * 1000000.0);+ wait.tv_nsec = (currenttime.tv_usec + dt_usec) * 1000L;+ if( wait.tv_nsec > 1000000000L )+ {+ wait.tv_nsec -= 1000000000L;+ dt_sec ++;+ }+ wait.tv_sec = currenttime.tv_sec + dt_sec;++ // Initialize condition and mutex objects+ pthread_mutex_init( &mutex, NULL );+ pthread_cond_init( &cond, NULL );++ // Do a timed wait+ pthread_mutex_lock( &mutex );+ pthread_cond_timedwait( &cond, &mutex, &wait );+ pthread_mutex_unlock( &mutex );++ // Destroy condition and mutex objects+ pthread_mutex_destroy( &mutex );+ pthread_cond_destroy( &cond );+}+
+ glfw/lib/macosx/macosx_window.c view
@@ -0,0 +1,1281 @@+//========================================================================+// GLFW - An OpenGL framework+// File: macosx_window.c+// Platform: Mac OS X+// API Version: 2.6+// WWW: http://glfw.sourceforge.net+//------------------------------------------------------------------------+// Copyright (c) 2002-2006 Camilla Berglund+//+// This software is provided 'as-is', without any express or implied+// warranty. In no event will the authors be held liable for any damages+// arising from the use of this software.+//+// Permission is granted to anyone to use this software for any purpose,+// including commercial applications, and to alter it and redistribute it+// freely, subject to the following restrictions:+//+// 1. The origin of this software must not be misrepresented; you must not+// claim that you wrote the original software. If you use this software+// in a product, an acknowledgment in the product documentation would+// be appreciated but is not required.+//+// 2. Altered source versions must be plainly marked as such, and must not+// be misrepresented as being the original software.+//+// 3. This notice may not be removed or altered from any source+// distribution.+//+//========================================================================++#include "internal.h"++static _GLFWmacwindowfunctions _glfwMacFSWindowFunctions =+{+ _glfwMacFSOpenWindow,+ _glfwMacFSCloseWindow,+ _glfwMacFSSetWindowTitle,+ _glfwMacFSSetWindowSize,+ _glfwMacFSSetWindowPos,+ _glfwMacFSIconifyWindow,+ _glfwMacFSRestoreWindow,+ _glfwMacFSRefreshWindowParams,+ _glfwMacFSSetMouseCursorPos+};++static _GLFWmacwindowfunctions _glfwMacDWWindowFunctions =+{+ _glfwMacDWOpenWindow,+ _glfwMacDWCloseWindow,+ _glfwMacDWSetWindowTitle,+ _glfwMacDWSetWindowSize,+ _glfwMacDWSetWindowPos,+ _glfwMacDWIconifyWindow,+ _glfwMacDWRestoreWindow,+ _glfwMacDWRefreshWindowParams,+ _glfwMacDWSetMouseCursorPos+};++#define _glfwTestModifier( modifierMask, glfwKey ) \+if ( changed & modifierMask ) \+{ \+ _glfwInputKey( glfwKey, (modifiers & modifierMask ? GLFW_PRESS : GLFW_RELEASE) ); \+}++void _glfwHandleMacModifierChange( UInt32 modifiers )+{+ UInt32 changed = modifiers ^ _glfwInput.Modifiers;++ _glfwTestModifier( shiftKey, GLFW_KEY_LSHIFT );+ _glfwTestModifier( rightShiftKey, GLFW_KEY_RSHIFT );+ _glfwTestModifier( controlKey, GLFW_KEY_LCTRL );+ _glfwTestModifier( rightControlKey, GLFW_KEY_RCTRL );+ _glfwTestModifier( optionKey, GLFW_KEY_LALT );+ _glfwTestModifier( rightOptionKey, GLFW_KEY_RALT );++ _glfwInput.Modifiers = modifiers;+}++void _glfwHandleMacKeyChange( UInt32 keyCode, int action )+{+ switch ( keyCode )+ {+ case MAC_KEY_ENTER: _glfwInputKey( GLFW_KEY_ENTER, action); break;+ case MAC_KEY_RETURN: _glfwInputKey( GLFW_KEY_KP_ENTER, action); break;+ case MAC_KEY_ESC: _glfwInputKey( GLFW_KEY_ESC, action); break;+ case MAC_KEY_F1: _glfwInputKey( GLFW_KEY_F1, action); break;+ case MAC_KEY_F2: _glfwInputKey( GLFW_KEY_F2, action); break;+ case MAC_KEY_F3: _glfwInputKey( GLFW_KEY_F3, action); break;+ case MAC_KEY_F4: _glfwInputKey( GLFW_KEY_F4, action); break;+ case MAC_KEY_F5: _glfwInputKey( GLFW_KEY_F5, action); break;+ case MAC_KEY_F6: _glfwInputKey( GLFW_KEY_F6, action); break;+ case MAC_KEY_F7: _glfwInputKey( GLFW_KEY_F7, action); break;+ case MAC_KEY_F8: _glfwInputKey( GLFW_KEY_F8, action); break;+ case MAC_KEY_F9: _glfwInputKey( GLFW_KEY_F9, action); break;+ case MAC_KEY_F10: _glfwInputKey( GLFW_KEY_F10, action); break;+ case MAC_KEY_F11: _glfwInputKey( GLFW_KEY_F11, action); break;+ case MAC_KEY_F12: _glfwInputKey( GLFW_KEY_F12, action); break;+ case MAC_KEY_F13: _glfwInputKey( GLFW_KEY_F13, action); break;+ case MAC_KEY_F14: _glfwInputKey( GLFW_KEY_F14, action); break;+ case MAC_KEY_F15: _glfwInputKey( GLFW_KEY_F15, action); break;+ case MAC_KEY_UP: _glfwInputKey( GLFW_KEY_UP, action); break;+ case MAC_KEY_DOWN: _glfwInputKey( GLFW_KEY_DOWN, action); break;+ case MAC_KEY_LEFT: _glfwInputKey( GLFW_KEY_LEFT, action); break;+ case MAC_KEY_RIGHT: _glfwInputKey( GLFW_KEY_RIGHT, action); break;+ case MAC_KEY_TAB: _glfwInputKey( GLFW_KEY_TAB, action); break;+ case MAC_KEY_BACKSPACE: _glfwInputKey( GLFW_KEY_BACKSPACE, action); break;+ case MAC_KEY_HELP: _glfwInputKey( GLFW_KEY_INSERT, action); break;+ case MAC_KEY_DEL: _glfwInputKey( GLFW_KEY_DEL, action); break;+ case MAC_KEY_PAGEUP: _glfwInputKey( GLFW_KEY_PAGEUP, action); break;+ case MAC_KEY_PAGEDOWN: _glfwInputKey( GLFW_KEY_PAGEDOWN, action); break;+ case MAC_KEY_HOME: _glfwInputKey( GLFW_KEY_HOME, action); break;+ case MAC_KEY_END: _glfwInputKey( GLFW_KEY_END, action); break;+ case MAC_KEY_KP_0: _glfwInputKey( GLFW_KEY_KP_0, action); break;+ case MAC_KEY_KP_1: _glfwInputKey( GLFW_KEY_KP_1, action); break;+ case MAC_KEY_KP_2: _glfwInputKey( GLFW_KEY_KP_2, action); break;+ case MAC_KEY_KP_3: _glfwInputKey( GLFW_KEY_KP_3, action); break;+ case MAC_KEY_KP_4: _glfwInputKey( GLFW_KEY_KP_4, action); break;+ case MAC_KEY_KP_5: _glfwInputKey( GLFW_KEY_KP_5, action); break;+ case MAC_KEY_KP_6: _glfwInputKey( GLFW_KEY_KP_6, action); break;+ case MAC_KEY_KP_7: _glfwInputKey( GLFW_KEY_KP_7, action); break;+ case MAC_KEY_KP_8: _glfwInputKey( GLFW_KEY_KP_8, action); break;+ case MAC_KEY_KP_9: _glfwInputKey( GLFW_KEY_KP_9, action); break;+ case MAC_KEY_KP_DIVIDE: _glfwInputKey( GLFW_KEY_KP_DIVIDE, action); break;+ case MAC_KEY_KP_MULTIPLY: _glfwInputKey( GLFW_KEY_KP_MULTIPLY, action); break;+ case MAC_KEY_KP_SUBTRACT: _glfwInputKey( GLFW_KEY_KP_SUBTRACT, action); break;+ case MAC_KEY_KP_ADD: _glfwInputKey( GLFW_KEY_KP_ADD, action); break;+ case MAC_KEY_KP_DECIMAL: _glfwInputKey( GLFW_KEY_KP_DECIMAL, action); break;+ case MAC_KEY_KP_EQUAL: _glfwInputKey( GLFW_KEY_KP_EQUAL, action); break;+ case MAC_KEY_KP_ENTER: _glfwInputKey( GLFW_KEY_KP_ENTER, action); break;+ default:+ {+ extern void *KCHRPtr;+ UInt32 state = 0;+ char charCode = (char)KeyTranslate( KCHRPtr, keyCode, &state );+ UppercaseText( &charCode, 1, smSystemScript );+ _glfwInputKey( (unsigned char)charCode, action );+ }+ break;+ }+}++EventTypeSpec GLFW_KEY_EVENT_TYPES[] =+{+ { kEventClassKeyboard, kEventRawKeyDown },+ { kEventClassKeyboard, kEventRawKeyUp },+ { kEventClassKeyboard, kEventRawKeyModifiersChanged }+};++OSStatus _glfwKeyEventHandler( EventHandlerCallRef handlerCallRef,+ EventRef event,+ void *userData )+{+ UInt32 keyCode;+ short int keyChar;+ UInt32 modifiers;++ switch( GetEventKind( event ) )+ {+ case kEventRawKeyDown:+ {+ if( GetEventParameter( event,+ kEventParamKeyCode,+ typeUInt32,+ NULL,+ sizeof( UInt32 ),+ NULL,+ &keyCode ) == noErr )+ {+ _glfwHandleMacKeyChange( keyCode, GLFW_PRESS );+ }+ if( GetEventParameter( event,+ kEventParamKeyUnicodes,+ typeUnicodeText,+ NULL,+ sizeof(keyChar),+ NULL,+ &keyChar) == noErr )+ {+ _glfwInputChar( keyChar, GLFW_PRESS );+ }+ return noErr;+ }++ case kEventRawKeyUp:+ {+ if( GetEventParameter( event,+ kEventParamKeyCode,+ typeUInt32,+ NULL,+ sizeof( UInt32 ),+ NULL,+ &keyCode ) == noErr )+ {+ _glfwHandleMacKeyChange( keyCode, GLFW_RELEASE );+ }+ if( GetEventParameter( event,+ kEventParamKeyUnicodes,+ typeUnicodeText,+ NULL,+ sizeof(keyChar),+ NULL,+ &keyChar) == noErr )+ {+ _glfwInputChar( keyChar, GLFW_RELEASE );+ }+ return noErr;+ }++ case kEventRawKeyModifiersChanged:+ {+ if( GetEventParameter( event,+ kEventParamKeyModifiers,+ typeUInt32,+ NULL,+ sizeof( UInt32 ),+ NULL,+ &modifiers ) == noErr )+ {+ _glfwHandleMacModifierChange( modifiers );+ return noErr;+ }+ }+ break;+ }++ return eventNotHandledErr;+}++EventTypeSpec GLFW_MOUSE_EVENT_TYPES[] =+{+ { kEventClassMouse, kEventMouseDown },+ { kEventClassMouse, kEventMouseUp },+ { kEventClassMouse, kEventMouseMoved },+ { kEventClassMouse, kEventMouseDragged },+ { kEventClassMouse, kEventMouseWheelMoved },+};++OSStatus _glfwMouseEventHandler( EventHandlerCallRef handlerCallRef,+ EventRef event,+ void *userData )+{+ switch( GetEventKind( event ) )+ {+ case kEventMouseDown:+ {+ WindowRef window;+ EventRecord oldStyleMacEvent;+ ConvertEventRefToEventRecord( event, &oldStyleMacEvent );+ if( FindWindow ( oldStyleMacEvent.where, &window ) == inMenuBar )+ {+ MenuSelect( oldStyleMacEvent.where );+ HiliteMenu(0);+ return noErr;+ }+ else+ {+ EventMouseButton button;+ if( GetEventParameter( event,+ kEventParamMouseButton,+ typeMouseButton,+ NULL,+ sizeof( EventMouseButton ),+ NULL,+ &button ) == noErr )+ {+ button -= kEventMouseButtonPrimary;+ if( button <= GLFW_MOUSE_BUTTON_LAST )+ {+ _glfwInputMouseClick( button+ + GLFW_MOUSE_BUTTON_LEFT,+ GLFW_PRESS );+ }+ return noErr;+ }+ }+ break;+ }++ case kEventMouseUp:+ {+ EventMouseButton button;+ if( GetEventParameter( event,+ kEventParamMouseButton,+ typeMouseButton,+ NULL,+ sizeof( EventMouseButton ),+ NULL,+ &button ) == noErr )+ {+ button -= kEventMouseButtonPrimary;+ if( button <= GLFW_MOUSE_BUTTON_LAST )+ {+ _glfwInputMouseClick( button+ + GLFW_MOUSE_BUTTON_LEFT,+ GLFW_RELEASE );+ }+ return noErr;+ }+ break;+ }++ case kEventMouseMoved:+ case kEventMouseDragged:+ {+ HIPoint mouseLocation;+ if( _glfwWin.MouseLock )+ {+ if( GetEventParameter( event,+ kEventParamMouseDelta,+ typeHIPoint,+ NULL,+ sizeof( HIPoint ),+ NULL,+ &mouseLocation ) != noErr )+ {+ break;+ }++ _glfwInput.MousePosX += mouseLocation.x;+ _glfwInput.MousePosY += mouseLocation.y;+ }+ else+ {+ if( GetEventParameter( event,+ kEventParamMouseLocation,+ typeHIPoint,+ NULL,+ sizeof( HIPoint ),+ NULL,+ &mouseLocation ) != noErr )+ {+ break;+ }++ _glfwInput.MousePosX = mouseLocation.x;+ _glfwInput.MousePosY = mouseLocation.y;++ if( !_glfwWin.Fullscreen )+ {+ Rect content;+ GetWindowBounds( _glfwWin.MacWindow,+ kWindowContentRgn,+ &content );++ _glfwInput.MousePosX -= content.left;+ _glfwInput.MousePosY -= content.top;+ }+ }++ if( _glfwWin.MousePosCallback )+ {+ _glfwWin.MousePosCallback( _glfwInput.MousePosX,+ _glfwInput.MousePosY );+ }++ break;+ }++ case kEventMouseWheelMoved:+ {+ EventMouseWheelAxis axis;+ if( GetEventParameter( event,+ kEventParamMouseWheelAxis,+ typeMouseWheelAxis,+ NULL,+ sizeof( EventMouseWheelAxis ),+ NULL,+ &axis) == noErr )+ {+ long wheelDelta;+ if( axis == kEventMouseWheelAxisY &&+ GetEventParameter( event,+ kEventParamMouseWheelDelta,+ typeLongInteger,+ NULL,+ sizeof( long ),+ NULL,+ &wheelDelta ) == noErr )+ {+ _glfwInput.WheelPos += wheelDelta;+ if( _glfwWin.MouseWheelCallback )+ {+ _glfwWin.MouseWheelCallback( _glfwInput.WheelPos );+ }+ return noErr;+ }+ }+ break;+ }+ }++ return eventNotHandledErr;+}++EventTypeSpec GLFW_COMMAND_EVENT_TYPES[] =+{+ { kEventClassCommand, kEventCommandProcess }+};++OSStatus _glfwCommandHandler( EventHandlerCallRef handlerCallRef,+ EventRef event,+ void *userData )+{+ if( _glfwWin.SysKeysDisabled )+ {+ // TO DO: give adequate UI feedback that this is the case+ return eventNotHandledErr;+ }++ HICommand command;+ if( GetEventParameter( event,+ kEventParamDirectObject,+ typeHICommand,+ NULL,+ sizeof( HICommand ),+ NULL,+ &command ) == noErr )+ {+ switch( command.commandID )+ {+ case kHICommandClose:+ case kHICommandQuit:+ {+ // Check if the program wants us to close the window+ if( _glfwWin.WindowCloseCallback )+ {+ if( _glfwWin.WindowCloseCallback() )+ {+ glfwCloseWindow();+ }+ }+ else+ {+ glfwCloseWindow();+ }+ return noErr;+ }+ }+ }++ return eventNotHandledErr;+}++EventTypeSpec GLFW_WINDOW_EVENT_TYPES[] =+{+ { kEventClassWindow, kEventWindowBoundsChanged },+ { kEventClassWindow, kEventWindowClose },+ { kEventClassWindow, kEventWindowDrawContent },+ { kEventClassWindow, kEventWindowActivated },+ { kEventClassWindow, kEventWindowDeactivated },+};++OSStatus _glfwWindowEventHandler( EventHandlerCallRef handlerCallRef,+ EventRef event,+ void *userData )+{+ switch( GetEventKind(event) )+ {+ case kEventWindowBoundsChanged:+ {+ WindowRef window;+ GetEventParameter( event, kEventParamDirectObject, typeWindowRef, NULL,+ sizeof(WindowRef), NULL, &window );++ Rect rect;+ GetWindowPortBounds( window, &rect );++ if( _glfwWin.Width != rect.right ||+ _glfwWin.Height != rect.bottom )+ {+ aglUpdateContext(_glfwWin.AGLContext);++ _glfwWin.Width = rect.right;+ _glfwWin.Height = rect.bottom;+ if( _glfwWin.WindowSizeCallback )+ {+ _glfwWin.WindowSizeCallback( _glfwWin.Width,+ _glfwWin.Height );+ }+ // Emulate (force) content invalidation+ if( _glfwWin.WindowRefreshCallback )+ {+ _glfwWin.WindowRefreshCallback();+ }+ }+ break;+ }++ case kEventWindowClose:+ {+ // Check if the program wants us to close the window+ if( _glfwWin.WindowCloseCallback )+ {+ if( _glfwWin.WindowCloseCallback() )+ {+ glfwCloseWindow();+ }+ }+ else+ {+ glfwCloseWindow();+ }+ return noErr;+ }++ case kEventWindowDrawContent:+ {+ // Call user callback function+ if( _glfwWin.WindowRefreshCallback )+ {+ _glfwWin.WindowRefreshCallback();+ }+ break;+ }++ case kEventWindowActivated:+ {+ _glfwWin.Active = GL_TRUE;+ break;+ }++ case kEventWindowDeactivated:+ {+ _glfwWin.Active = GL_FALSE;+ _glfwInputDeactivation();+ break;+ }+ }++ return eventNotHandledErr;+}++int _glfwInstallEventHandlers( void )+{+ OSStatus error;++ _glfwWin.MouseUPP = NewEventHandlerUPP( _glfwMouseEventHandler );++ error = InstallEventHandler( GetApplicationEventTarget(),+ _glfwWin.MouseUPP,+ GetEventTypeCount( GLFW_MOUSE_EVENT_TYPES ),+ GLFW_MOUSE_EVENT_TYPES,+ NULL,+ NULL );+ if( error != noErr )+ {+ fprintf( stderr, "glfwOpenWindow failing because it can't install mouse event handler\n" );+ return GL_FALSE;+ }++ _glfwWin.CommandUPP = NewEventHandlerUPP( _glfwCommandHandler );++ error = InstallEventHandler( GetApplicationEventTarget(),+ _glfwWin.CommandUPP,+ GetEventTypeCount( GLFW_COMMAND_EVENT_TYPES ),+ GLFW_COMMAND_EVENT_TYPES,+ NULL,+ NULL );+ if( error != noErr )+ {+ fprintf( stderr, "glfwOpenWindow failing because it can't install command event handler\n" );+ return GL_FALSE;+ }++ _glfwWin.KeyboardUPP = NewEventHandlerUPP( _glfwKeyEventHandler );++ error = InstallEventHandler( GetApplicationEventTarget(),+ _glfwWin.KeyboardUPP,+ GetEventTypeCount( GLFW_KEY_EVENT_TYPES ),+ GLFW_KEY_EVENT_TYPES,+ NULL,+ NULL );+ if( error != noErr )+ {+ fprintf( stderr, "glfwOpenWindow failing because it can't install key event handler\n" );+ return GL_FALSE;+ }++ return GL_TRUE;+}++#define _setAGLAttribute( aglAttributeName, AGLparameter ) \+if ( AGLparameter != 0 ) \+{ \+ AGLpixelFormatAttributes[numAGLAttrs++] = aglAttributeName; \+ AGLpixelFormatAttributes[numAGLAttrs++] = AGLparameter; \+}++#define _getAGLAttribute( aglAttributeName, variableName ) \+{ \+ GLint aglValue; \+ (void)aglDescribePixelFormat( pixelFormat, aglAttributeName, &aglValue ); \+ variableName = aglValue; \+}++#define _setCGLAttribute( cglAttributeName, CGLparameter ) \+if ( CGLparameter != 0 ) \+{ \+ CGLpixelFormatAttributes[ numCGLAttrs++ ] = cglAttributeName; \+ CGLpixelFormatAttributes[ numCGLAttrs++ ] = CGLparameter; \+}++#define _getCGLAttribute( cglAttributeName, variableName ) \+{ \+ long cglValue; \+ (void)CGLDescribePixelFormat( CGLpfObj, 0, cglAttributeName, &cglValue ); \+ variableName = cglValue; \+}++int _glfwPlatformOpenWindow( int width,+ int height,+ int redbits,+ int greenbits,+ int bluebits,+ int alphabits,+ int depthbits,+ int stencilbits,+ int mode,+ _GLFWhints* hints )+{+ OSStatus error;+ ProcessSerialNumber psn;++ unsigned int windowAttributes;++ // TO DO: Refactor this function!+ _glfwWin.WindowFunctions = ( _glfwWin.Fullscreen ?+ &_glfwMacFSWindowFunctions :+ &_glfwMacDWWindowFunctions );++ // Windowed or fullscreen; AGL or CGL? Quite the mess...+ // AGL appears to be the only choice for attaching OpenGL contexts to+ // Carbon windows, but it leaves the user no control over fullscreen+ // mode stretching. Solution: AGL for windowed, CGL for fullscreen.+ if( !_glfwWin.Fullscreen )+ {+ // create AGL pixel format attribute list+ GLint AGLpixelFormatAttributes[256];+ int numAGLAttrs = 0;++ AGLpixelFormatAttributes[numAGLAttrs++] = AGL_RGBA;+ AGLpixelFormatAttributes[numAGLAttrs++] = AGL_DOUBLEBUFFER;++ if( hints->Stereo )+ {+ AGLpixelFormatAttributes[numAGLAttrs++] = AGL_STEREO;+ }++ _setAGLAttribute( AGL_AUX_BUFFERS, hints->AuxBuffers);+ _setAGLAttribute( AGL_RED_SIZE, redbits );+ _setAGLAttribute( AGL_GREEN_SIZE, greenbits );+ _setAGLAttribute( AGL_BLUE_SIZE, bluebits );+ _setAGLAttribute( AGL_ALPHA_SIZE, alphabits );+ _setAGLAttribute( AGL_DEPTH_SIZE, depthbits );+ _setAGLAttribute( AGL_STENCIL_SIZE, stencilbits );+ _setAGLAttribute( AGL_ACCUM_RED_SIZE, hints->AccumRedBits );+ _setAGLAttribute( AGL_ACCUM_GREEN_SIZE, hints->AccumGreenBits );+ _setAGLAttribute( AGL_ACCUM_BLUE_SIZE, hints->AccumBlueBits );+ _setAGLAttribute( AGL_ACCUM_ALPHA_SIZE, hints->AccumAlphaBits );++ if( hints->Samples > 1 )+ {+ _setAGLAttribute( AGL_SAMPLE_BUFFERS_ARB, 1 );+ _setAGLAttribute( AGL_SAMPLES_ARB, hints->Samples );+ AGLpixelFormatAttributes[numAGLAttrs++] = AGL_NO_RECOVERY;+ }++ AGLpixelFormatAttributes[numAGLAttrs++] = AGL_NONE;++ // create pixel format descriptor+ AGLDevice mainMonitor = GetMainDevice();+ AGLPixelFormat pixelFormat = aglChoosePixelFormat( &mainMonitor,+ 1,+ AGLpixelFormatAttributes );+ if( pixelFormat == NULL )+ {+ fprintf( stderr, "glfwOpenWindow failing because it can't create a pixel format\n" );+ return GL_FALSE;+ }++ // store pixel format's values for _glfwPlatformGetWindowParam's use+ _getAGLAttribute( AGL_ACCELERATED, _glfwWin.Accelerated );+ _getAGLAttribute( AGL_RED_SIZE, _glfwWin.RedBits );+ _getAGLAttribute( AGL_GREEN_SIZE, _glfwWin.GreenBits );+ _getAGLAttribute( AGL_BLUE_SIZE, _glfwWin.BlueBits );+ _getAGLAttribute( AGL_ALPHA_SIZE, _glfwWin.AlphaBits );+ _getAGLAttribute( AGL_DEPTH_SIZE, _glfwWin.DepthBits );+ _getAGLAttribute( AGL_STENCIL_SIZE, _glfwWin.StencilBits );+ _getAGLAttribute( AGL_ACCUM_RED_SIZE, _glfwWin.AccumRedBits );+ _getAGLAttribute( AGL_ACCUM_GREEN_SIZE, _glfwWin.AccumGreenBits );+ _getAGLAttribute( AGL_ACCUM_BLUE_SIZE, _glfwWin.AccumBlueBits );+ _getAGLAttribute( AGL_ACCUM_ALPHA_SIZE, _glfwWin.AccumAlphaBits );+ _getAGLAttribute( AGL_AUX_BUFFERS, _glfwWin.AuxBuffers );+ _getAGLAttribute( AGL_STEREO, _glfwWin.Stereo );+ _getAGLAttribute( AGL_SAMPLES_ARB, _glfwWin.Samples );+ _glfwWin.RefreshRate = hints->RefreshRate;++ // create AGL context+ _glfwWin.AGLContext = aglCreateContext( pixelFormat, NULL );++ aglDestroyPixelFormat( pixelFormat );++ if( _glfwWin.AGLContext == NULL )+ {+ fprintf( stderr, "glfwOpenWindow failing because it can't create an OpenGL context\n" );+ _glfwPlatformCloseWindow();+ return GL_FALSE;+ }++ if (_glfwLibrary.Unbundled)+ {+ if( GetCurrentProcess( &psn ) != noErr )+ {+ fprintf( stderr, "glfwOpenWindow failing because it can't get its PSN\n" );+ _glfwPlatformCloseWindow();+ return GL_FALSE;+ }++ /* Paul Liu 2007-12-20 - This causes problem in GHCi + if( TransformProcessType( &psn, kProcessTransformToForegroundApplication ) != noErr )+ {+ fprintf( stderr, "glfwOpenWindow failing because it can't become a foreground application\n" );+ _glfwPlatformCloseWindow();+ return GL_FALSE;+ }+ */+ + /* Keith Bauer 2007-07-12 - I don't believe this is desirable+ if( SetFrontProcess( &psn ) != noErr )+ {+ fprintf( stderr, "glfwOpenWindow failing because it can't become the front process\n" );+ _glfwPlatformCloseWindow();+ return GL_FALSE;+ }+ */+ }+ + // create window+ Rect windowContentBounds;+ windowContentBounds.left = 0;+ windowContentBounds.top = 0;+ windowContentBounds.right = width;+ windowContentBounds.bottom = height;++ windowAttributes = ( kWindowCloseBoxAttribute \+ | kWindowCollapseBoxAttribute \+ | kWindowStandardHandlerAttribute );++ if( hints->WindowNoResize )+ {+ windowAttributes |= kWindowLiveResizeAttribute;+ }+ else+ {+ windowAttributes |= ( kWindowFullZoomAttribute | kWindowResizableAttribute );+ }++ error = CreateNewWindow( kDocumentWindowClass,+ windowAttributes,+ &windowContentBounds,+ &( _glfwWin.MacWindow ) );+ if( ( error != noErr ) || ( _glfwWin.MacWindow == NULL ) )+ {+ fprintf( stderr, "glfwOpenWindow failing because it can't create a window\n" );+ _glfwPlatformCloseWindow();+ return GL_FALSE;+ }++ _glfwWin.WindowUPP = NewEventHandlerUPP( _glfwWindowEventHandler );++ error = InstallWindowEventHandler( _glfwWin.MacWindow,+ _glfwWin.WindowUPP,+ GetEventTypeCount( GLFW_WINDOW_EVENT_TYPES ),+ GLFW_WINDOW_EVENT_TYPES,+ NULL,+ NULL );+ if( error != noErr )+ {+ fprintf( stderr, "glfwOpenWindow failing because it can't install window event handlers\n" );+ _glfwPlatformCloseWindow();+ return GL_FALSE;+ }++ // Don't care if we fail here+ (void)SetWindowTitleWithCFString( _glfwWin.MacWindow, CFSTR( "GLFW Window" ) );+ (void)RepositionWindow( _glfwWin.MacWindow,+ NULL,+ kWindowCenterOnMainScreen );++ if( !aglSetDrawable( _glfwWin.AGLContext,+ GetWindowPort( _glfwWin.MacWindow ) ) )+ {+ fprintf( stderr, "glfwOpenWindow failing because it can't draw to the window\n" );+ _glfwPlatformCloseWindow();+ return GL_FALSE;+ }++ // Make OpenGL context current+ if( !aglSetCurrentContext( _glfwWin.AGLContext ) )+ {+ fprintf( stderr, "glfwOpenWindow failing because it can't make the OpenGL context current\n" );+ _glfwPlatformCloseWindow();+ return GL_FALSE;+ }++ // show window+ ShowWindow( _glfwWin.MacWindow );++ return GL_TRUE;+ }+ else+ {+ CGDisplayErr cgErr;+ CGLError cglErr;++ CFDictionaryRef optimalMode;++ CGLPixelFormatObj CGLpfObj;+ long numCGLvs = 0;++ CGLPixelFormatAttribute CGLpixelFormatAttributes[64];+ int numCGLAttrs = 0;++ // variables for enumerating color depths+ long rgbColorDepth;+ long rgbaAccumDepth = 0;+ int rgbChannelDepth = 0;++ // CGL pixel format attributes+ _setCGLAttribute( kCGLPFADisplayMask,+ CGDisplayIDToOpenGLDisplayMask( kCGDirectMainDisplay ) );++ if( hints->Stereo )+ {+ CGLpixelFormatAttributes[ numCGLAttrs++ ] = kCGLPFAStereo;+ }++ if( hints->Samples > 1 )+ {+ _setCGLAttribute( kCGLPFASamples, (CGLPixelFormatAttribute)hints->Samples );+ _setCGLAttribute( kCGLPFASampleBuffers, (CGLPixelFormatAttribute)1 );+ CGLpixelFormatAttributes[ numCGLAttrs++ ] = kCGLPFANoRecovery;+ }++ CGLpixelFormatAttributes[ numCGLAttrs++ ] = kCGLPFAFullScreen;+ CGLpixelFormatAttributes[ numCGLAttrs++ ] = kCGLPFADoubleBuffer;+ CGLpixelFormatAttributes[ numCGLAttrs++ ] = kCGLPFAAccelerated;+ CGLpixelFormatAttributes[ numCGLAttrs++ ] = kCGLPFANoRecovery;+ CGLpixelFormatAttributes[ numCGLAttrs++ ] = kCGLPFAMinimumPolicy;++ _setCGLAttribute( kCGLPFAAccumSize,+ (CGLPixelFormatAttribute)( hints->AccumRedBits \+ + hints->AccumGreenBits \+ + hints->AccumBlueBits \+ + hints->AccumAlphaBits ) );++ _setCGLAttribute( kCGLPFAAlphaSize, (CGLPixelFormatAttribute)alphabits );+ _setCGLAttribute( kCGLPFADepthSize, (CGLPixelFormatAttribute)depthbits );+ _setCGLAttribute( kCGLPFAStencilSize, (CGLPixelFormatAttribute)stencilbits );+ _setCGLAttribute( kCGLPFAAuxBuffers, (CGLPixelFormatAttribute)hints->AuxBuffers );++ CGLpixelFormatAttributes[ numCGLAttrs++ ] = (CGLPixelFormatAttribute)NULL;++ // create a suitable pixel format with above attributes..+ cglErr = CGLChoosePixelFormat( CGLpixelFormatAttributes,+ &CGLpfObj,+ &numCGLvs );+ if( cglErr != kCGLNoError )+ {+ return GL_FALSE;+ }++ // ..and create a rendering context using that pixel format+ cglErr = CGLCreateContext( CGLpfObj, NULL, &_glfwWin.CGLContext );+ if( cglErr != kCGLNoError )+ {+ return GL_FALSE;+ }++ // enumerate depth of RGB channels - unlike AGL, CGL works with+ // a single parameter reflecting the full depth of the frame buffer+ (void)CGLDescribePixelFormat( CGLpfObj, 0, kCGLPFAColorSize, &rgbColorDepth );+ if( rgbColorDepth == 24 || rgbColorDepth == 32 )+ {+ rgbChannelDepth = 8;+ }+ if( rgbColorDepth == 16 )+ {+ rgbChannelDepth = 5;+ }++ // get pixel depth of accumulator - I haven't got the slightest idea+ // how this number conforms to any other channel depth than 8 bits,+ // so this might end up giving completely knackered results...+ (void)CGLDescribePixelFormat( CGLpfObj, 0, kCGLPFAAccumSize, &rgbaAccumDepth );+ if( rgbaAccumDepth == 32 )+ {+ rgbaAccumDepth = 8;+ }++ // store values of pixel format for _glfwPlatformGetWindowParam's use+ _getCGLAttribute( kCGLPFAAccelerated, _glfwWin.Accelerated );+ _getCGLAttribute( rgbChannelDepth, _glfwWin.RedBits );+ _getCGLAttribute( rgbChannelDepth, _glfwWin.GreenBits );+ _getCGLAttribute( rgbChannelDepth, _glfwWin.BlueBits );+ _getCGLAttribute( kCGLPFAAlphaSize, _glfwWin.AlphaBits );+ _getCGLAttribute( kCGLPFADepthSize, _glfwWin.DepthBits );+ _getCGLAttribute( kCGLPFAStencilSize, _glfwWin.StencilBits );+ _getCGLAttribute( rgbaAccumDepth, _glfwWin.AccumRedBits );+ _getCGLAttribute( rgbaAccumDepth, _glfwWin.AccumGreenBits );+ _getCGLAttribute( rgbaAccumDepth, _glfwWin.AccumBlueBits );+ _getCGLAttribute( rgbaAccumDepth, _glfwWin.AccumAlphaBits );+ _getCGLAttribute( kCGLPFAAuxBuffers, _glfwWin.AuxBuffers );+ _getCGLAttribute( kCGLPFAStereo, _glfwWin.Stereo );+ _glfwWin.RefreshRate = hints->RefreshRate;++ // destroy our pixel format+ (void)CGLDestroyPixelFormat( CGLpfObj );++ // capture the display for our application+ cgErr = CGCaptureAllDisplays();+ if( cgErr != kCGErrorSuccess )+ {+ return GL_FALSE;+ }++ // find closest matching NON-STRETCHED display mode..+ optimalMode = CGDisplayBestModeForParametersAndRefreshRateWithProperty( kCGDirectMainDisplay,+ rgbColorDepth,+ width,+ /* Check further to the right -> */ height,+ hints->RefreshRate,+ NULL,+ NULL );+ if( optimalMode == NULL )+ {+ return GL_FALSE;+ }++ // ..and switch to that mode+ cgErr = CGDisplaySwitchToMode( kCGDirectMainDisplay, optimalMode );+ if( cgErr != kCGErrorSuccess )+ {+ return GL_FALSE;+ }++ // switch to our OpenGL context, and bring it up fullscreen+ cglErr = CGLSetCurrentContext( _glfwWin.CGLContext );+ if( cglErr != kCGLNoError )+ {+ return GL_FALSE;+ }++ cglErr = CGLSetFullScreen( _glfwWin.CGLContext );+ if( cglErr != kCGLNoError )+ {+ return GL_FALSE;+ }++ return GL_TRUE;+ }+}++void _glfwPlatformCloseWindow( void )+{+ if( _glfwWin.WindowFunctions != NULL )+ {+ if( _glfwWin.WindowUPP != NULL )+ {+ DisposeEventHandlerUPP( _glfwWin.WindowUPP );+ _glfwWin.WindowUPP = NULL;+ }++ _glfwWin.WindowFunctions->CloseWindow();++ if( !_glfwWin.Fullscreen && _glfwWin.AGLContext != NULL )+ {+ aglSetCurrentContext( NULL );+ aglSetDrawable( _glfwWin.AGLContext, NULL );+ aglDestroyContext( _glfwWin.AGLContext );+ _glfwWin.AGLContext = NULL;+ }++ if( _glfwWin.Fullscreen && _glfwWin.CGLContext != NULL )+ {+ CGLSetCurrentContext( NULL );+ CGLClearDrawable( _glfwWin.CGLContext );+ CGLDestroyContext( _glfwWin.CGLContext );+ CGReleaseAllDisplays();+ _glfwWin.CGLContext = NULL;+ }++ if( _glfwWin.MacWindow != NULL )+ {+ ReleaseWindow( _glfwWin.MacWindow );+ _glfwWin.MacWindow = NULL;+ }++ _glfwWin.WindowFunctions = NULL;+ }+}++void _glfwPlatformSetWindowTitle( const char *title )+{+ _glfwWin.WindowFunctions->SetWindowTitle( title );+}++void _glfwPlatformSetWindowSize( int width, int height )+{+ _glfwWin.WindowFunctions->SetWindowSize( width, height );+}++void _glfwPlatformSetWindowPos( int x, int y )+{+ _glfwWin.WindowFunctions->SetWindowPos( x, y );+}++void _glfwPlatformIconifyWindow( void )+{+ _glfwWin.WindowFunctions->IconifyWindow();+}++void _glfwPlatformRestoreWindow( void )+{+ _glfwWin.WindowFunctions->RestoreWindow();+}++void _glfwPlatformSwapBuffers( void )+{+ if( !_glfwWin.Fullscreen )+ {+ aglSwapBuffers( _glfwWin.AGLContext );+ }+ else+ {+ CGLFlushDrawable( _glfwWin.CGLContext );+ }+}++void _glfwPlatformSwapInterval( int interval )+{+ GLint AGLparameter = interval;++ // CGL doesn't seem to like intervals other than 0 (vsync off) or 1 (vsync on)+ long CGLparameter = ( interval == 0 ? 0 : 1 );++ if( !_glfwWin.Fullscreen )+ {+ // Don't care if we fail here..+ (void)aglSetInteger( _glfwWin.AGLContext,+ AGL_SWAP_INTERVAL,+ &AGLparameter );+ }+ else+ {+ // ..or here+ (void)CGLSetParameter( _glfwWin.CGLContext,+ kCGLCPSwapInterval,+ &CGLparameter );+ }+}++void _glfwPlatformRefreshWindowParams( void )+{+ _glfwWin.WindowFunctions->RefreshWindowParams();+}++int _glfwPlatformGetWindowParam( int param )+{+ switch ( param )+ {+ case GLFW_ACCELERATED: return _glfwWin.Accelerated; break;+ case GLFW_RED_BITS: return _glfwWin.RedBits; break;+ case GLFW_GREEN_BITS: return _glfwWin.GreenBits; break;+ case GLFW_BLUE_BITS: return _glfwWin.BlueBits; break;+ case GLFW_ALPHA_BITS: return _glfwWin.AlphaBits; break;+ case GLFW_DEPTH_BITS: return _glfwWin.DepthBits; break;+ case GLFW_STENCIL_BITS: return _glfwWin.StencilBits; break;+ case GLFW_ACCUM_RED_BITS: return _glfwWin.AccumRedBits; break;+ case GLFW_ACCUM_GREEN_BITS: return _glfwWin.AccumGreenBits; break;+ case GLFW_ACCUM_BLUE_BITS: return _glfwWin.AccumBlueBits; break;+ case GLFW_ACCUM_ALPHA_BITS: return _glfwWin.AccumAlphaBits; break;+ case GLFW_AUX_BUFFERS: return _glfwWin.AuxBuffers; break;+ case GLFW_STEREO: return _glfwWin.Stereo; break;+ case GLFW_REFRESH_RATE: return _glfwWin.RefreshRate; break;+ default: return GL_FALSE;+ }+}++void _glfwPlatformPollEvents( void )+{+ EventRef event;+ EventTargetRef eventDispatcher = GetEventDispatcherTarget();++ while ( ReceiveNextEvent( 0, NULL, 0.0, TRUE, &event ) == noErr )+ {+ SendEventToEventTarget( event, eventDispatcher );+ ReleaseEvent( event );+ }+}++void _glfwPlatformWaitEvents( void )+{+ EventRef event;++ // Wait for new events+ ReceiveNextEvent( 0, NULL, kEventDurationForever, FALSE, &event );++ // Poll new events+ _glfwPlatformPollEvents();+}++void _glfwPlatformHideMouseCursor( void )+{+ // TO DO: What if we fail here?+ CGDisplayHideCursor( kCGDirectMainDisplay );+ CGAssociateMouseAndMouseCursorPosition( false );+}++void _glfwPlatformShowMouseCursor( void )+{+ // TO DO: What if we fail here?+ CGDisplayShowCursor( kCGDirectMainDisplay );+ CGAssociateMouseAndMouseCursorPosition( true );+}++void _glfwPlatformSetMouseCursorPos( int x, int y )+{+ _glfwWin.WindowFunctions->SetMouseCursorPos( x, y );+}++int _glfwMacFSOpenWindow( int width,+ int height,+ int redbits,+ int greenbits,+ int bluebits,+ int alphabits,+ int depthbits,+ int stencilbits,+ int accumredbits,+ int accumgreenbits,+ int accumbluebits,+ int accumalphabits,+ int auxbuffers,+ int stereo,+ int refreshrate )+{+ return GL_FALSE;+}++void _glfwMacFSCloseWindow( void )+{+ // TO DO: un-capture displays, &c.+}++void _glfwMacFSSetWindowTitle( const char *title )+{+ // no-op really, change "fake" mini-window title+ _glfwMacDWSetWindowTitle( title );+}++void _glfwMacFSSetWindowSize( int width, int height )+{+ // TO DO: something funky for full-screen+ _glfwMacDWSetWindowSize( width, height );+}++void _glfwMacFSSetWindowPos( int x, int y )+{+ // no-op really, change "fake" mini-window position+ _glfwMacDWSetWindowPos( x, y );+}++void _glfwMacFSIconifyWindow( void )+{+ // TO DO: Something funky for full-screen+ _glfwMacDWIconifyWindow();+}++void _glfwMacFSRestoreWindow( void )+{+ _glfwMacDWRestoreWindow();+ // TO DO: Something funky for full-screen+}++void _glfwMacFSRefreshWindowParams( void )+{+ // TO DO: implement this!+}++void _glfwMacFSSetMouseCursorPos( int x, int y )+{+ // TO DO: what if we fail here?+ CGDisplayMoveCursorToPoint( kCGDirectMainDisplay,+ CGPointMake( x, y ) );+}++int _glfwMacDWOpenWindow( int width,+ int height,+ int redbits,+ int greenbits,+ int bluebits,+ int alphabits,+ int depthbits,+ int stencilbits,+ int accumredbits,+ int accumgreenbits,+ int accumbluebits,+ int accumalphabits,+ int auxbuffers,+ int stereo,+ int refreshrate )+{+ return GL_FALSE;+}++void _glfwMacDWCloseWindow( void )+{+}++void _glfwMacDWSetWindowTitle( const char *title )+{+ CFStringRef windowTitle = CFStringCreateWithCString( kCFAllocatorDefault,+ title,+ kCFStringEncodingISOLatin1 );++ // Don't care if we fail+ (void)SetWindowTitleWithCFString( _glfwWin.MacWindow, windowTitle );++ CFRelease( windowTitle );+}++void _glfwMacDWSetWindowSize( int width, int height )+{+ SizeWindow( _glfwWin.MacWindow,+ width,+ height,+ TRUE );+}++void _glfwMacDWSetWindowPos( int x, int y )+{+ // TO DO: take main monitor bounds into account+ MoveWindow( _glfwWin.MacWindow,+ x,+ y,+ FALSE );+}++void _glfwMacDWIconifyWindow( void )+{+ // TO DO: What if we fail here?+ (void)CollapseWindow( _glfwWin.MacWindow,+ TRUE );+}++void _glfwMacDWRestoreWindow( void )+{+ // TO DO: What if we fail here?+ (void)CollapseWindow( _glfwWin.MacWindow,+ FALSE );+}++void _glfwMacDWRefreshWindowParams( void )+{+ // TO DO: implement this!+}++void _glfwMacDWSetMouseCursorPos( int x, int y )+{+ Rect content;+ GetWindowBounds(_glfwWin.MacWindow, kWindowContentRgn, &content);++ _glfwInput.MousePosX = x + content.left;+ _glfwInput.MousePosY = y + content.top;++ CGDisplayMoveCursorToPoint( kCGDirectMainDisplay,+ CGPointMake( _glfwInput.MousePosX,+ _glfwInput.MousePosY ) );+}+
+ glfw/lib/macosx/platform.h view
@@ -0,0 +1,349 @@+//========================================================================+// GLFW - An OpenGL framework+// File: platform.h+// Platform: Mac OS X+// API Version: 2.6+// WWW: http://glfw.sourceforge.net+//------------------------------------------------------------------------+// Copyright (c) 2002-2006 Camilla Berglund+//+// This software is provided 'as-is', without any express or implied+// warranty. In no event will the authors be held liable for any damages+// arising from the use of this software.+//+// Permission is granted to anyone to use this software for any purpose,+// including commercial applications, and to alter it and redistribute it+// freely, subject to the following restrictions:+//+// 1. The origin of this software must not be misrepresented; you must not+// claim that you wrote the original software. If you use this software+// in a product, an acknowledgment in the product documentation would+// be appreciated but is not required.+//+// 2. Altered source versions must be plainly marked as such, and must not+// be misrepresented as being the original software.+//+// 3. This notice may not be removed or altered from any source+// distribution.+//+//========================================================================++#ifndef _platform_h_+#define _platform_h_+++// This is the Mac OS X version of GLFW+#define _GLFW_MAC_OS_X+++// Include files+#include <Carbon/Carbon.h>+#include <OpenGL/OpenGL.h>+#include <AGL/agl.h>+#include <sched.h>+#include <pthread.h>+#include <sys/sysctl.h>+#include "../../include/GL/glfw.h"+++//========================================================================+// Defines+//========================================================================++#define _GLFW_MAX_PATH_LENGTH (8192)++#define MAC_KEY_ENTER 0x24+#define MAC_KEY_RETURN 0x34+#define MAC_KEY_ESC 0x35+#define MAC_KEY_F1 0x7A+#define MAC_KEY_F2 0x78+#define MAC_KEY_F3 0x63+#define MAC_KEY_F4 0x76+#define MAC_KEY_F5 0x60+#define MAC_KEY_F6 0x61+#define MAC_KEY_F7 0x62+#define MAC_KEY_F8 0x64+#define MAC_KEY_F9 0x65+#define MAC_KEY_F10 0x6D+#define MAC_KEY_F11 0x67+#define MAC_KEY_F12 0x6F+#define MAC_KEY_F13 0x69+#define MAC_KEY_F14 0x6B+#define MAC_KEY_F15 0x71+#define MAC_KEY_UP 0x7E+#define MAC_KEY_DOWN 0x7D+#define MAC_KEY_LEFT 0x7B+#define MAC_KEY_RIGHT 0x7C+#define MAC_KEY_TAB 0x30+#define MAC_KEY_BACKSPACE 0x33+#define MAC_KEY_HELP 0x72+#define MAC_KEY_DEL 0x75+#define MAC_KEY_PAGEUP 0x74+#define MAC_KEY_PAGEDOWN 0x79+#define MAC_KEY_HOME 0x73+#define MAC_KEY_END 0x77+#define MAC_KEY_KP_0 0x52+#define MAC_KEY_KP_1 0x53+#define MAC_KEY_KP_2 0x54+#define MAC_KEY_KP_3 0x55+#define MAC_KEY_KP_4 0x56+#define MAC_KEY_KP_5 0x57+#define MAC_KEY_KP_6 0x58+#define MAC_KEY_KP_7 0x59+#define MAC_KEY_KP_8 0x5B+#define MAC_KEY_KP_9 0x5C+#define MAC_KEY_KP_DIVIDE 0x4B+#define MAC_KEY_KP_MULTIPLY 0x43+#define MAC_KEY_KP_SUBTRACT 0x4E+#define MAC_KEY_KP_ADD 0x45+#define MAC_KEY_KP_DECIMAL 0x41+#define MAC_KEY_KP_EQUAL 0x51+#define MAC_KEY_KP_ENTER 0x4C++//========================================================================+// full-screen/desktop-window "virtual" function table+//========================================================================++typedef int ( * GLFWmacopenwindowfun )( int, int, int, int, int, int, int, int, int, int, int, int, int, int, int );+typedef void ( * GLFWmacclosewindowfun )( void );+typedef void ( * GLFWmacsetwindowtitlefun )( const char * );+typedef void ( * GLFWmacsetwindowsizefun )( int, int );+typedef void ( * GLFWmacsetwindowposfun )( int, int );+typedef void ( * GLFWmaciconifywindowfun )( void );+typedef void ( * GLFWmacrestorewindowfun )( void );+typedef void ( * GLFWmacrefreshwindowparamsfun )( void );+typedef void ( * GLFWmacsetmousecursorposfun )( int, int );++typedef struct+{+ GLFWmacopenwindowfun OpenWindow;+ GLFWmacclosewindowfun CloseWindow;+ GLFWmacsetwindowtitlefun SetWindowTitle;+ GLFWmacsetwindowsizefun SetWindowSize;+ GLFWmacsetwindowposfun SetWindowPos;+ GLFWmaciconifywindowfun IconifyWindow;+ GLFWmacrestorewindowfun RestoreWindow;+ GLFWmacrefreshwindowparamsfun RefreshWindowParams;+ GLFWmacsetmousecursorposfun SetMouseCursorPos;+}+_GLFWmacwindowfunctions;+++//========================================================================+// Global variables (GLFW internals)+//========================================================================++GLFWGLOBAL CFDictionaryRef _glfwDesktopVideoMode;++//------------------------------------------------------------------------+// Window structure+//------------------------------------------------------------------------+typedef struct _GLFWwin_struct _GLFWwin;++struct _GLFWwin_struct {++ // ========= PLATFORM INDEPENDENT MANDATORY PART =========================++ // Window states+ int Opened; // Flag telling if window is opened or not+ int Active; // Application active flag+ int Iconified; // Window iconified flag++ // User callback functions+ GLFWwindowsizefun WindowSizeCallback;+ GLFWwindowclosefun WindowCloseCallback;+ GLFWwindowrefreshfun WindowRefreshCallback;+ GLFWmousebuttonfun MouseButtonCallback;+ GLFWmouseposfun MousePosCallback;+ GLFWmousewheelfun MouseWheelCallback;+ GLFWkeyfun KeyCallback;+ GLFWcharfun CharCallback;++ // User selected window settings+ int Fullscreen; // Fullscreen flag+ int MouseLock; // Mouse-lock flag+ int AutoPollEvents; // Auto polling flag+ int SysKeysDisabled; // System keys disabled flag+ int RefreshRate; // Refresh rate (for fullscreen mode)+ int WindowNoResize; // Resize- and maximize gadgets disabled flag+ int Samples;++ // Window status+ int Width, Height; // Window width and heigth++ // Extensions & OpenGL version+ int Has_GL_SGIS_generate_mipmap;+ int Has_GL_ARB_texture_non_power_of_two;+ int GLVerMajor,GLVerMinor;+++ // ========= PLATFORM SPECIFIC PART ======================================++ WindowRef MacWindow;+ AGLContext AGLContext;+ CGLContextObj CGLContext;++ EventHandlerUPP MouseUPP;+ EventHandlerUPP CommandUPP;+ EventHandlerUPP KeyboardUPP;+ EventHandlerUPP WindowUPP;++ _GLFWmacwindowfunctions* WindowFunctions;++ // for easy access by _glfwPlatformGetWindowParam+ int Accelerated;+ int RedBits, GreenBits, BlueBits, AlphaBits;+ int DepthBits;+ int StencilBits;+ int AccumRedBits, AccumGreenBits, AccumBlueBits, AccumAlphaBits;+ int AuxBuffers;+ int Stereo;+};++GLFWGLOBAL _GLFWwin _glfwWin;+++//------------------------------------------------------------------------+// User input status (some of this should go in _GLFWwin)+//------------------------------------------------------------------------+GLFWGLOBAL struct {++ // ========= PLATFORM INDEPENDENT MANDATORY PART =========================++ // Mouse status+ int MousePosX, MousePosY;+ int WheelPos;+ char MouseButton[ GLFW_MOUSE_BUTTON_LAST+1 ];++ // Keyboard status+ char Key[ GLFW_KEY_LAST+1 ];+ int LastChar;++ // User selected settings+ int StickyKeys;+ int StickyMouseButtons;+ int KeyRepeat;+++ // ========= PLATFORM SPECIFIC PART ======================================++ UInt32 Modifiers;++} _glfwInput;+++++//------------------------------------------------------------------------+// Thread information+//------------------------------------------------------------------------+typedef struct _GLFWthread_struct _GLFWthread;++// Thread record (one for each thread)+struct _GLFWthread_struct {+ // Pointer to previous and next threads in linked list+ _GLFWthread *Previous, *Next;++ // GLFW user side thread information+ GLFWthread ID;+ GLFWthreadfun Function;++ // System side thread information+ pthread_t PosixID;+};++// General thread information+GLFWGLOBAL struct {+ // Critical section lock+ pthread_mutex_t CriticalSection;++ // Next thread ID to use (increments for every created thread)+ GLFWthread NextID;++ // First thread in linked list (always the main thread)+ _GLFWthread First;+} _glfwThrd;+++//------------------------------------------------------------------------+// Library global data+//------------------------------------------------------------------------+GLFWGLOBAL struct {++ // Timer data+ struct {+ double t0;+ } Timer;++ struct {+ // Bundle for dynamically-loading extension function pointers+ CFBundleRef OpenGLFramework;+ } Libs;+ + int Unbundled;+ +} _glfwLibrary;++++//========================================================================+// Macros for encapsulating critical code sections (i.e. making parts+// of GLFW thread safe)+//========================================================================++// Define so we can use the same thread code as X11+#define _glfw_numprocessors(n) { \+ int mib[2], ncpu; \+ size_t len = 1; \+ mib[0] = CTL_HW; \+ mib[1] = HW_NCPU; \+ n = 1; \+ if( sysctl( mib, 2, &ncpu, &len, NULL, 0 ) != -1 ) \+ { \+ if( len > 0 ) \+ { \+ n = ncpu; \+ } \+ } \+}++// Thread list management+#define ENTER_THREAD_CRITICAL_SECTION \+pthread_mutex_lock( &_glfwThrd.CriticalSection );+#define LEAVE_THREAD_CRITICAL_SECTION \+pthread_mutex_unlock( &_glfwThrd.CriticalSection );+++//========================================================================+// Prototypes for platform specific internal functions+//========================================================================++void _glfwChangeToResourcesDirectory( void );++int _glfwInstallEventHandlers( void );++//========================================================================+// Prototypes for full-screen/desktop-window "virtual" functions+//========================================================================++int _glfwMacFSOpenWindow( int width, int height, int redbits, int greenbits, int bluebits, int alphabits, int depthbits, int stencilbits, int accumredbits, int accumgreenbits, int accumbluebits, int accumalphabits, int auxbuffers, int stereo, int refreshrate );+void _glfwMacFSCloseWindow( void );+void _glfwMacFSSetWindowTitle( const char *title );+void _glfwMacFSSetWindowSize( int width, int height );+void _glfwMacFSSetWindowPos( int x, int y );+void _glfwMacFSIconifyWindow( void );+void _glfwMacFSRestoreWindow( void );+void _glfwMacFSRefreshWindowParams( void );+void _glfwMacFSSetMouseCursorPos( int x, int y );++int _glfwMacDWOpenWindow( int width, int height, int redbits, int greenbits, int bluebits, int alphabits, int depthbits, int stencilbits, int accumredbits, int accumgreenbits, int accumbluebits, int accumalphabits, int auxbuffers, int stereo, int refreshrate );+void _glfwMacDWCloseWindow( void );+void _glfwMacDWSetWindowTitle( const char *title );+void _glfwMacDWSetWindowSize( int width, int height );+void _glfwMacDWSetWindowPos( int x, int y );+void _glfwMacDWIconifyWindow( void );+void _glfwMacDWRestoreWindow( void );+void _glfwMacDWRefreshWindowParams( void );+void _glfwMacDWSetMouseCursorPos( int x, int y );++#endif // _platform_h_
+ glfw/lib/stream.c view
@@ -0,0 +1,194 @@+//========================================================================+// GLFW - An OpenGL framework+// File: stream.c+// Platform: Any+// API version: 2.6+// WWW: http://glfw.sourceforge.net+//------------------------------------------------------------------------+// Copyright (c) 2002-2006 Camilla Berglund+//+// This software is provided 'as-is', without any express or implied+// warranty. In no event will the authors be held liable for any damages+// arising from the use of this software.+//+// Permission is granted to anyone to use this software for any purpose,+// including commercial applications, and to alter it and redistribute it+// freely, subject to the following restrictions:+//+// 1. The origin of this software must not be misrepresented; you must not+// claim that you wrote the original software. If you use this software+// in a product, an acknowledgment in the product documentation would+// be appreciated but is not required.+//+// 2. Altered source versions must be plainly marked as such, and must not+// be misrepresented as being the original software.+//+// 3. This notice may not be removed or altered from any source+// distribution.+//+//========================================================================+++#include "internal.h"+++//========================================================================+// Opens a GLFW stream with a file+//========================================================================++int _glfwOpenFileStream( _GLFWstream *stream, const char* name, const char* mode )+{+ memset( stream, 0, sizeof(_GLFWstream) );++ stream->File = fopen( name, mode );+ if( stream->File == NULL )+ {+ return GL_FALSE;+ }++ return GL_TRUE;+}+++//========================================================================+// Opens a GLFW stream with a memory block+//========================================================================++int _glfwOpenBufferStream( _GLFWstream *stream, void *data, long size )+{+ memset( stream, 0, sizeof(_GLFWstream) );++ stream->Data = data;+ stream->Size = size;+ return GL_TRUE;+}+++//========================================================================+// Reads data from a GLFW stream+//========================================================================++long _glfwReadStream( _GLFWstream *stream, void *data, long size )+{+ if( stream->File != NULL )+ {+ return fread( data, 1, size, stream->File );+ }++ if( stream->Data != NULL )+ {+ // Check for EOF+ if( stream->Position == stream->Size )+ {+ return 0;+ }++ // Clamp read size to available data+ if( stream->Position + size > stream->Size )+ {+ size = stream->Size - stream->Position;+ }+ + // Perform data read+ memcpy( data, (unsigned char*) stream->Data + stream->Position, size );+ stream->Position += size;+ return size;+ }++ return 0;+}+++//========================================================================+// Returns the current position of a GLFW stream+//========================================================================++long _glfwTellStream( _GLFWstream *stream )+{+ if( stream->File != NULL )+ {+ return ftell( stream->File );+ }++ if( stream->Data != NULL )+ {+ return stream->Position;+ }++ return 0;+}+++//========================================================================+// Sets the current position of a GLFW stream+//========================================================================++int _glfwSeekStream( _GLFWstream *stream, long offset, int whence )+{+ long position;++ if( stream->File != NULL )+ {+ if( fseek( stream->File, offset, whence ) != 0 )+ {+ return GL_FALSE;+ }++ return GL_TRUE;+ }++ if( stream->Data != NULL )+ {+ position = offset;++ // Handle whence parameter+ if( whence == SEEK_CUR )+ {+ position += stream->Position;+ }+ else if( whence == SEEK_END )+ {+ position += stream->Size;+ }+ else if( whence != SEEK_SET )+ {+ return GL_FALSE;+ }++ // Clamp offset to buffer bounds and apply it+ if( position > stream->Size )+ {+ stream->Position = stream->Size;+ }+ else if( position < 0 )+ {+ stream->Position = 0;+ }+ else+ {+ stream->Position = position;+ }+ + return GL_TRUE;+ }++ return GL_FALSE;+}+++//========================================================================+// Closes a GLFW stream+//========================================================================++void _glfwCloseStream( _GLFWstream *stream )+{+ if( stream->File != NULL )+ {+ fclose( stream->File );+ }++ // Nothing to be done about (user allocated) memory blocks++ memset( stream, 0, sizeof(_GLFWstream) );+}+
+ glfw/lib/tga.c view
@@ -0,0 +1,405 @@+//========================================================================+// GLFW - An OpenGL framework+// File: tga.c+// Platform: Any+// API version: 2.6+// WWW: http://glfw.sourceforge.net+//------------------------------------------------------------------------+// Copyright (c) 2002-2006 Camilla Berglund+//+// This software is provided 'as-is', without any express or implied+// warranty. In no event will the authors be held liable for any damages+// arising from the use of this software.+//+// Permission is granted to anyone to use this software for any purpose,+// including commercial applications, and to alter it and redistribute it+// freely, subject to the following restrictions:+//+// 1. The origin of this software must not be misrepresented; you must not+// claim that you wrote the original software. If you use this software+// in a product, an acknowledgment in the product documentation would+// be appreciated but is not required.+//+// 2. Altered source versions must be plainly marked as such, and must not+// be misrepresented as being the original software.+//+// 3. This notice may not be removed or altered from any source+// distribution.+//+//========================================================================++//========================================================================+// Description:+//+// TGA format image file loader. This module supports version 1 Targa+// images, with these restrictions:+// - Pixel format may only be 8, 24 or 32 bits+// - Colormaps must be no longer than 256 entries+//+//========================================================================+++#include "internal.h"+++//************************************************************************+//**** GLFW internal functions & declarations ****+//************************************************************************++//========================================================================+// TGA file header information+//========================================================================++typedef struct {+ int idlen; // 1 byte+ int cmaptype; // 1 byte+ int imagetype; // 1 byte+ int cmapfirstidx; // 2 bytes+ int cmaplen; // 2 bytes+ int cmapentrysize; // 1 byte+ int xorigin; // 2 bytes+ int yorigin; // 2 bytes+ int width; // 2 bytes+ int height; // 2 bytes+ int bitsperpixel; // 1 byte+ int imageinfo; // 1 byte+ int _alphabits; // (derived from imageinfo)+ int _origin; // (derived from imageinfo)+} _tga_header_t;++#define _TGA_CMAPTYPE_NONE 0+#define _TGA_CMAPTYPE_PRESENT 1++#define _TGA_IMAGETYPE_NONE 0+#define _TGA_IMAGETYPE_CMAP 1+#define _TGA_IMAGETYPE_TC 2+#define _TGA_IMAGETYPE_GRAY 3+#define _TGA_IMAGETYPE_CMAP_RLE 9+#define _TGA_IMAGETYPE_TC_RLE 10+#define _TGA_IMAGETYPE_GRAY_RLE 11++#define _TGA_IMAGEINFO_ALPHA_MASK 0x0f+#define _TGA_IMAGEINFO_ALPHA_SHIFT 0+#define _TGA_IMAGEINFO_ORIGIN_MASK 0x30+#define _TGA_IMAGEINFO_ORIGIN_SHIFT 4++#define _TGA_ORIGIN_BL 0+#define _TGA_ORIGIN_BR 1+#define _TGA_ORIGIN_UL 2+#define _TGA_ORIGIN_UR 3+++//========================================================================+// _glfwReadTGAHeader() - Read TGA file header (and check that it is+// valid)+//========================================================================++static int _glfwReadTGAHeader( _GLFWstream *s, _tga_header_t *h )+{+ unsigned char buf[ 18 ];+ int pos;++ // Read TGA file header from file+ pos = _glfwTellStream( s );+ _glfwReadStream( s, buf, 18 );++ // Interpret header (endian independent parsing)+ h->idlen = (int) buf[0];+ h->cmaptype = (int) buf[1];+ h->imagetype = (int) buf[2];+ h->cmapfirstidx = (int) buf[3] | (((int) buf[4]) << 8);+ h->cmaplen = (int) buf[5] | (((int) buf[6]) << 8);+ h->cmapentrysize = (int) buf[7];+ h->xorigin = (int) buf[8] | (((int) buf[9]) << 8);+ h->yorigin = (int) buf[10] | (((int) buf[11]) << 8);+ h->width = (int) buf[12] | (((int) buf[13]) << 8);+ h->height = (int) buf[14] | (((int) buf[15]) << 8);+ h->bitsperpixel = (int) buf[16];+ h->imageinfo = (int) buf[17];++ // Extract alphabits and origin information+ h->_alphabits = (int) (h->imageinfo & _TGA_IMAGEINFO_ALPHA_MASK) >>+ _TGA_IMAGEINFO_ALPHA_SHIFT;+ h->_origin = (int) (h->imageinfo & _TGA_IMAGEINFO_ORIGIN_MASK) >>+ _TGA_IMAGEINFO_ORIGIN_SHIFT;++ // Validate TGA header (is this a TGA file?)+ if( (h->cmaptype == 0 || h->cmaptype == 1) &&+ ((h->imagetype >= 1 && h->imagetype <= 3) ||+ (h->imagetype >= 9 && h->imagetype <= 11)) &&+ (h->bitsperpixel == 8 || h->bitsperpixel == 24 ||+ h->bitsperpixel == 32) )+ {+ // Skip the ID field+ _glfwSeekStream( s, h->idlen, SEEK_CUR );++ // Indicate that the TGA header was valid+ return GL_TRUE;+ }+ else+ {+ // Restore file position+ _glfwSeekStream( s, pos, SEEK_SET );++ // Indicate that the TGA header was invalid+ return GL_FALSE;+ }+}++//========================================================================+// _glfwReadTGA_RLE() - Read Run-Length Encoded data+//========================================================================++static void _glfwReadTGA_RLE( unsigned char *buf, int size, int bpp,+ _GLFWstream *s )+{+ int repcount, bytes, k, n;+ unsigned char pixel[ 4 ];+ char c;++ // Dummy check+ if( bpp > 4 )+ {+ return;+ }++ while( size > 0 )+ {+ // Get repetition count+ _glfwReadStream( s, &c, 1 );+ repcount = (unsigned int) c;+ bytes = ((repcount & 127) + 1) * bpp;+ if( size < bytes )+ {+ bytes = size;+ }++ // Run-Length packet?+ if( repcount & 128 )+ {+ _glfwReadStream( s, pixel, bpp );+ for( n = 0; n < (repcount & 127) + 1; n ++ )+ {+ for( k = 0; k < bpp; k ++ )+ {+ *buf ++ = pixel[ k ];+ }+ }+ }+ else+ {+ // It's a Raw packet+ _glfwReadStream( s, buf, bytes );+ buf += bytes;+ }++ size -= bytes;+ }+}+++//========================================================================+// _glfwReadTGA() - Read a TGA image from a file+//========================================================================++int _glfwReadTGA( _GLFWstream *s, GLFWimage *img, int flags )+{+ _tga_header_t h;+ unsigned char *cmap, *pix, tmp, *src, *dst;+ int cmapsize, pixsize, pixsize2;+ int bpp, bpp2, k, m, n, swapx, swapy;++ // Read TGA header+ if( !_glfwReadTGAHeader( s, &h ) )+ {+ return 0;+ }++ // Is there a colormap?+ cmapsize = (h.cmaptype == _TGA_CMAPTYPE_PRESENT ? 1 : 0) * h.cmaplen *+ ((h.cmapentrysize+7) / 8);+ if( cmapsize > 0 )+ {+ // Is it a colormap that we can handle?+ if( (h.cmapentrysize != 24 && h.cmapentrysize != 32) ||+ h.cmaplen == 0 || h.cmaplen > 256 )+ {+ return 0;+ }++ // Allocate memory for colormap+ cmap = (unsigned char *) malloc( cmapsize );+ if( cmap == NULL )+ {+ return 0;+ }++ // Read colormap from file+ _glfwReadStream( s, cmap, cmapsize );+ }+ else+ {+ cmap = NULL;+ }++ // Size of pixel data+ pixsize = h.width * h.height * ((h.bitsperpixel + 7) / 8);++ // Bytes per pixel (pixel data - unexpanded)+ bpp = (h.bitsperpixel + 7) / 8;++ // Bytes per pixel (expanded pixels - not colormap indeces)+ if( cmap )+ {+ bpp2 = (h.cmapentrysize + 7) / 8;+ }+ else+ {+ bpp2 = bpp;+ }++ // For colormaped images, the RGB/RGBA image data may use more memory+ // than the stored pixel data+ pixsize2 = h.width * h.height * bpp2;++ // Allocate memory for pixel data+ pix = (unsigned char *) malloc( pixsize2 );+ if( pix == NULL )+ {+ if( cmap )+ {+ free( cmap );+ }+ return 0;+ }++ // Read pixel data from file+ if( h.imagetype >= _TGA_IMAGETYPE_CMAP_RLE )+ {+ _glfwReadTGA_RLE( pix, pixsize, bpp, s );+ }+ else+ {+ _glfwReadStream( s, pix, pixsize );+ }++ // If the image origin is not what we want, re-arrange the pixels+ switch( h._origin )+ {+ default:+ case _TGA_ORIGIN_UL:+ swapx = 0;+ swapy = 1;+ break;++ case _TGA_ORIGIN_BL:+ swapx = 0;+ swapy = 0;+ break;++ case _TGA_ORIGIN_UR:+ swapx = 1;+ swapy = 1;+ break;++ case _TGA_ORIGIN_BR:+ swapx = 1;+ swapy = 0;+ break;+ }+ if( (swapy && !(flags & GLFW_ORIGIN_UL_BIT)) ||+ (!swapy && (flags & GLFW_ORIGIN_UL_BIT)) )+ {+ src = pix;+ dst = &pix[ (h.height-1)*h.width*bpp ];+ for( n = 0; n < h.height/2; n ++ )+ {+ for( m = 0; m < h.width ; m ++ )+ {+ for( k = 0; k < bpp; k ++ )+ {+ tmp = *src;+ *src ++ = *dst;+ *dst ++ = tmp;+ }+ }+ dst -= 2*h.width*bpp;+ }+ }+ if( swapx )+ {+ src = pix;+ dst = &pix[ (h.width-1)*bpp ];+ for( n = 0; n < h.height; n ++ )+ {+ for( m = 0; m < h.width/2 ; m ++ )+ {+ for( k = 0; k < bpp; k ++ )+ {+ tmp = *src;+ *src ++ = *dst;+ *dst ++ = tmp;+ }+ dst -= 2*bpp;+ }+ src += ((h.width+1)/2)*bpp;+ dst += ((3*h.width+1)/2)*bpp;+ }+ }++ // Convert BGR/BGRA to RGB/RGBA, and optionally colormap indeces to+ // RGB/RGBA values+ if( cmap )+ {+ // Convert colormap pixel format (BGR -> RGB or BGRA -> RGBA)+ if( bpp2 == 3 || bpp2 == 4 )+ {+ for( n = 0; n < h.cmaplen; n ++ )+ {+ tmp = cmap[ n*bpp2 ];+ cmap[ n*bpp2 ] = cmap[ n*bpp2 + 2 ];+ cmap[ n*bpp2 + 2 ] = tmp;+ }+ }++ // Convert pixel data to RGB/RGBA data+ for( m = h.width * h.height - 1; m >= 0; m -- )+ {+ n = pix[ m ];+ for( k = 0; k < bpp2; k ++ )+ {+ pix[ m*bpp2 + k ] = cmap[ n*bpp2 + k ];+ }+ }++ // Free memory for colormap (it's not needed anymore)+ free( cmap );+ }+ else+ {+ // Convert image pixel format (BGR -> RGB or BGRA -> RGBA)+ if( bpp2 == 3 || bpp2 == 4 )+ {+ src = pix;+ dst = &pix[ 2 ];+ for( n = 0; n < h.height * h.width; n ++ )+ {+ tmp = *src;+ *src = *dst;+ *dst = tmp;+ src += bpp2;+ dst += bpp2;+ }+ }+ }++ // Fill out GLFWimage struct (the Format field will be set by+ // glfwReadImage)+ img->Width = h.width;+ img->Height = h.height;+ img->BytesPerPixel = bpp2;+ img->Data = pix;++ return 1;+}+
+ glfw/lib/thread.c view
@@ -0,0 +1,340 @@+//========================================================================+// GLFW - An OpenGL framework+// File: thread.c+// Platform: Any+// API version: 2.6+// WWW: http://glfw.sourceforge.net+//------------------------------------------------------------------------+// Copyright (c) 2002-2006 Camilla Berglund+//+// This software is provided 'as-is', without any express or implied+// warranty. In no event will the authors be held liable for any damages+// arising from the use of this software.+//+// Permission is granted to anyone to use this software for any purpose,+// including commercial applications, and to alter it and redistribute it+// freely, subject to the following restrictions:+//+// 1. The origin of this software must not be misrepresented; you must not+// claim that you wrote the original software. If you use this software+// in a product, an acknowledgment in the product documentation would+// be appreciated but is not required.+//+// 2. Altered source versions must be plainly marked as such, and must not+// be misrepresented as being the original software.+//+// 3. This notice may not be removed or altered from any source+// distribution.+//+//========================================================================++#include "internal.h"++++//************************************************************************+//**** GLFW internal functions ****+//************************************************************************++//========================================================================+// _glfwGetThreadPointer() - Find pointer to thread with a matching ID+//========================================================================++_GLFWthread * _glfwGetThreadPointer( int ID )+{+ _GLFWthread *t;++ for( t = &_glfwThrd.First; t != NULL; t = t->Next )+ {+ if( t->ID == ID )+ {+ break;+ }+ }++ return t;+}+++//========================================================================+// _glfwAppendThread() - Append thread to thread list+//========================================================================++void _glfwAppendThread( _GLFWthread * t )+{+ _GLFWthread *t_tmp;++ t_tmp = &_glfwThrd.First;+ while( t_tmp->Next != NULL )+ {+ t_tmp = t_tmp->Next;+ }+ t_tmp->Next = t;+ t->Previous = t_tmp;+ t->Next = NULL;+}+++//========================================================================+// _glfwRemoveThread() - Remove thread from thread list+//========================================================================++void _glfwRemoveThread( _GLFWthread * t )+{+ if( t->Previous != NULL )+ {+ t->Previous->Next = t->Next;+ }+ if( t->Next != NULL )+ {+ t->Next->Previous = t->Previous;+ }+ free( (void *) t );+}++++//************************************************************************+//**** GLFW user functions ****+//************************************************************************++//========================================================================+// glfwCreateThread() - Create a new thread+//========================================================================++GLFWAPI GLFWthread GLFWAPIENTRY glfwCreateThread( GLFWthreadfun fun,+ void *arg )+{+ // Is GLFW initialized?+ if( !_glfwInitialized )+ {+ return -1;+ }++ // Return the GLFW thread ID+ return _glfwPlatformCreateThread( fun, arg );+}+++//========================================================================+// glfwDestroyThread() - Kill a thread. NOTE: THIS IS A VERY DANGEROUS+// OPERATION, AND SHOULD NOT BE USED EXCEPT IN EXTREME SITUATIONS!+//========================================================================++GLFWAPI void GLFWAPIENTRY glfwDestroyThread( GLFWthread ID )+{+ // Is GLFW initialized?+ if( !_glfwInitialized )+ {+ return;+ }++ // Is it a valid thread? (killing the main thread is not allowed)+ if( ID < 1 )+ {+ return;+ }++ _glfwPlatformDestroyThread( ID );+}+++//========================================================================+// glfwWaitThread() - Wait for a thread to die+//========================================================================++GLFWAPI int GLFWAPIENTRY glfwWaitThread( GLFWthread ID, int waitmode )+{+ // Is GLFW initialized?+ if( !_glfwInitialized )+ {+ return GL_TRUE;+ }++ // Is it a valid thread? (waiting for the main thread is not allowed)+ if( ID < 1 )+ {+ return GL_TRUE;+ }++ return _glfwPlatformWaitThread( ID, waitmode );+}+++//========================================================================+// glfwGetThreadID() - Return the thread ID for the current thread+//========================================================================++GLFWAPI GLFWthread GLFWAPIENTRY glfwGetThreadID( void )+{+ // Is GLFW initialized?+ if( !_glfwInitialized )+ {+ return 0;+ }++ return _glfwPlatformGetThreadID();+}+++//========================================================================+// glfwCreateMutex() - Create a mutual exclusion object+//========================================================================++GLFWAPI GLFWmutex GLFWAPIENTRY glfwCreateMutex( void )+{+ // Is GLFW initialized?+ if( !_glfwInitialized )+ {+ return (GLFWmutex) 0;+ }++ return _glfwPlatformCreateMutex();+}+++//========================================================================+// glfwDestroyMutex() - Destroy a mutual exclusion object+//========================================================================++GLFWAPI void GLFWAPIENTRY glfwDestroyMutex( GLFWmutex mutex )+{+ // Initialized & valid mutex (no real way of assuring this)?+ if( !_glfwInitialized || !mutex )+ {+ return;+ }++ _glfwPlatformDestroyMutex( mutex );+}+++//========================================================================+// glfwLockMutex() - Request access to a mutex+//========================================================================++GLFWAPI void GLFWAPIENTRY glfwLockMutex( GLFWmutex mutex )+{+ // Initialized & valid mutex (no real way of assuring this)?+ if( !_glfwInitialized && !mutex )+ {+ return;+ }++ _glfwPlatformLockMutex( mutex );+}+++//========================================================================+// glfwUnlockMutex() - Release a mutex+//========================================================================++GLFWAPI void GLFWAPIENTRY glfwUnlockMutex( GLFWmutex mutex )+{+ // Initialized & valid mutex (no real way of assuring this)?+ if( !_glfwInitialized && !mutex )+ {+ return;+ }++ _glfwPlatformUnlockMutex( mutex );+}+++//========================================================================+// glfwCreateCond() - Create a new condition variable object+//========================================================================++GLFWAPI GLFWcond GLFWAPIENTRY glfwCreateCond( void )+{+ // Is GLFW initialized?+ if( !_glfwInitialized )+ {+ return (GLFWcond) 0;+ }++ return _glfwPlatformCreateCond();+}+++//========================================================================+// glfwDestroyCond() - Destroy a condition variable object+//========================================================================++GLFWAPI void GLFWAPIENTRY glfwDestroyCond( GLFWcond cond )+{+ // Initialized & valid condition variable?+ if( !_glfwInitialized || !cond )+ {+ return;+ }++ _glfwPlatformDestroyCond( cond );+}+++//========================================================================+// glfwWaitCond() - Wait for a condition to be raised+//========================================================================++GLFWAPI void GLFWAPIENTRY glfwWaitCond( GLFWcond cond, GLFWmutex mutex,+ double timeout )+{+ // Initialized & valid condition variable and mutex?+ if( !_glfwInitialized || !cond || !mutex )+ {+ return;+ }++ _glfwPlatformWaitCond( cond, mutex, timeout );+}+++//========================================================================+// glfwSignalCond() - Signal a condition to one waiting thread+//========================================================================++GLFWAPI void GLFWAPIENTRY glfwSignalCond( GLFWcond cond )+{+ // Initialized & valid condition variable?+ if( !_glfwInitialized || !cond )+ {+ return;+ }++ _glfwPlatformSignalCond( cond );+}+++//========================================================================+// glfwBroadcastCond() - Broadcast a condition to all waiting threads+//========================================================================++GLFWAPI void GLFWAPIENTRY glfwBroadcastCond( GLFWcond cond )+{+ // Initialized & valid condition variable?+ if( !_glfwInitialized || !cond )+ {+ return;+ }++ _glfwPlatformBroadcastCond( cond );+}+++//========================================================================+// glfwGetNumberOfProcessors() - Return the number of processors in the+// system. This information can be useful for determining the optimal+// number of threads to use for performing a certain task.+//========================================================================++GLFWAPI int GLFWAPIENTRY glfwGetNumberOfProcessors( void )+{+ // Is GLFW initialized?+ if( !_glfwInitialized )+ {+ return 0;+ }++ return _glfwPlatformGetNumberOfProcessors();+}
+ glfw/lib/time.c view
@@ -0,0 +1,83 @@+//========================================================================+// GLFW - An OpenGL framework+// File: time.c+// Platform: Any+// API version: 2.6+// WWW: http://glfw.sourceforge.net+//------------------------------------------------------------------------+// Copyright (c) 2002-2006 Camilla Berglund+//+// This software is provided 'as-is', without any express or implied+// warranty. In no event will the authors be held liable for any damages+// arising from the use of this software.+//+// Permission is granted to anyone to use this software for any purpose,+// including commercial applications, and to alter it and redistribute it+// freely, subject to the following restrictions:+//+// 1. The origin of this software must not be misrepresented; you must not+// claim that you wrote the original software. If you use this software+// in a product, an acknowledgment in the product documentation would+// be appreciated but is not required.+//+// 2. Altered source versions must be plainly marked as such, and must not+// be misrepresented as being the original software.+//+// 3. This notice may not be removed or altered from any source+// distribution.+//+//========================================================================++#include "internal.h"+++//************************************************************************+//**** GLFW user functions ****+//************************************************************************++//========================================================================+// glfwGetTime() - Return timer value in seconds+//========================================================================++GLFWAPI double GLFWAPIENTRY glfwGetTime( void )+{+ // Is GLFW initialized?+ if( !_glfwInitialized )+ {+ return 0.0;+ }++ return _glfwPlatformGetTime();+}+++//========================================================================+// glfwSetTime() - Set timer value in seconds+//========================================================================++GLFWAPI void GLFWAPIENTRY glfwSetTime( double time )+{+ // Is GLFW initialized?+ if( !_glfwInitialized )+ {+ return;+ }++ _glfwPlatformSetTime( time );+}+++//========================================================================+// glfwSleep() - Put a thread to sleep for a specified amount of time+//========================================================================++GLFWAPI void GLFWAPIENTRY glfwSleep( double time )+{+ // Is GLFW initialized?+ if( !_glfwInitialized )+ {+ return;+ }++ _glfwPlatformSleep( time );+}
+ glfw/lib/win32/platform.h view
@@ -0,0 +1,474 @@+//========================================================================+// GLFW - An OpenGL framework+// File: platform.h+// Platform: Windows+// API version: 2.6+// WWW: http://glfw.sourceforge.net+//------------------------------------------------------------------------+// Copyright (c) 2002-2006 Camilla Berglund+//+// This software is provided 'as-is', without any express or implied+// warranty. In no event will the authors be held liable for any damages+// arising from the use of this software.+//+// Permission is granted to anyone to use this software for any purpose,+// including commercial applications, and to alter it and redistribute it+// freely, subject to the following restrictions:+//+// 1. The origin of this software must not be misrepresented; you must not+// claim that you wrote the original software. If you use this software+// in a product, an acknowledgment in the product documentation would+// be appreciated but is not required.+//+// 2. Altered source versions must be plainly marked as such, and must not+// be misrepresented as being the original software.+//+// 3. This notice may not be removed or altered from any source+// distribution.+//+//========================================================================++#ifndef _platform_h_+#define _platform_h_+++// This is the Windows version of GLFW+#define _GLFW_WIN32+++// Include files+#include <windows.h>+#include <mmsystem.h>+#include "../../include/GL/glfw.h"+++//========================================================================+// Hack: Define things that some <windows.h>'s do not define+//========================================================================++// Some old versions of w32api (used by MinGW and Cygwin) define+// WH_KEYBOARD_LL without typedef:ing KBDLLHOOKSTRUCT (!)+#if defined(__MINGW32__) || defined(__CYGWIN__)+#include <w32api.h>+#if defined(WH_KEYBOARD_LL) && (__W32API_MAJOR_VERSION == 1) && (__W32API_MINOR_VERSION <= 2)+#undef WH_KEYBOARD_LL+#endif+#endif++//------------------------------------------------------------------------+// ** NOTE ** If this gives you compiler errors and you are using MinGW+// (or Dev-C++), update to w32api version 1.3 or later:+// http://sourceforge.net/project/showfiles.php?group_id=2435+//------------------------------------------------------------------------+#ifndef WH_KEYBOARD_LL+#define WH_KEYBOARD_LL 13+typedef struct tagKBDLLHOOKSTRUCT {+ DWORD vkCode;+ DWORD scanCode;+ DWORD flags;+ DWORD time;+ DWORD dwExtraInfo;+} KBDLLHOOKSTRUCT, FAR *LPKBDLLHOOKSTRUCT, *PKBDLLHOOKSTRUCT;+#endif // WH_KEYBOARD_LL++#ifndef LLKHF_ALTDOWN+#define LLKHF_ALTDOWN 0x00000020+#endif++#ifndef SPI_SETSCREENSAVERRUNNING+#define SPI_SETSCREENSAVERRUNNING 97+#endif+#ifndef SPI_GETANIMATION+#define SPI_GETANIMATION 72+#endif+#ifndef SPI_SETANIMATION+#define SPI_SETANIMATION 73+#endif+#ifndef SPI_GETFOREGROUNDLOCKTIMEOUT+#define SPI_GETFOREGROUNDLOCKTIMEOUT 0x2000+#endif+#ifndef SPI_SETFOREGROUNDLOCKTIMEOUT+#define SPI_SETFOREGROUNDLOCKTIMEOUT 0x2001+#endif++#ifndef CDS_FULLSCREEN+#define CDS_FULLSCREEN 4+#endif++#ifndef PFD_GENERIC_ACCELERATED+#define PFD_GENERIC_ACCELERATED 0x00001000+#endif+#ifndef PFD_DEPTH_DONTCARE+#define PFD_DEPTH_DONTCARE 0x20000000+#endif++#ifndef ENUM_CURRENT_SETTINGS+#define ENUM_CURRENT_SETTINGS -1+#endif+#ifndef ENUM_REGISTRY_SETTINGS+#define ENUM_REGISTRY_SETTINGS -2+#endif++#ifndef WM_MOUSEWHEEL+#define WM_MOUSEWHEEL 0x020A+#endif+#ifndef WHEEL_DELTA+#define WHEEL_DELTA 120+#endif++#ifndef WM_XBUTTONDOWN+#define WM_XBUTTONDOWN 0x020B+#endif+#ifndef WM_XBUTTONUP+#define WM_XBUTTONUP 0x020C+#endif+#ifndef XBUTTON1+#define XBUTTON1 1+#endif+#ifndef XBUTTON2+#define XBUTTON2 2+#endif++// wglSwapIntervalEXT typedef (Win32 buffer-swap interval control)+typedef int (APIENTRY * WGLSWAPINTERVALEXT_T) (int);+// wglChoosePixelFormatARB typedef+typedef BOOL (WINAPI * WGLCHOOSEPIXELFORMATARB_T) (HDC, const int *, const FLOAT *, UINT, int *, UINT *);+// wglGetPixelFormatAttribivARB typedef+typedef BOOL (WINAPI * WGLGETPIXELFORMATATTRIBIVARB_T) (HDC, int, int, UINT, const int *, int *);+// wglGetExtensionStringEXT typedef+typedef const char *(APIENTRY * WGLGETEXTENSIONSSTRINGEXT_T)( void );+// wglGetExtensionStringARB typedef+typedef const char *(APIENTRY * WGLGETEXTENSIONSSTRINGARB_T)( HDC );++#define WGL_DRAW_TO_WINDOW_ARB 0x2001+#define WGL_SUPPORT_OPENGL_ARB 0x2010+#define WGL_ACCELERATION_ARB 0x2003+#define WGL_FULL_ACCELERATION_ARB 0x2027+#define WGL_DOUBLE_BUFFER_ARB 0x2011+#define WGL_STEREO_ARB 0x2012+#define WGL_COLOR_BITS_ARB 0x2014+#define WGL_RED_BITS_ARB 0x2015+#define WGL_GREEN_BITS_ARB 0x2017+#define WGL_BLUE_BITS_ARB 0x2019+#define WGL_ALPHA_BITS_ARB 0x201B+#define WGL_ACCUM_BITS_ARB 0x201D +#define WGL_ACCUM_RED_BITS_ARB 0x201E +#define WGL_ACCUM_GREEN_BITS_ARB 0x201F +#define WGL_ACCUM_BLUE_BITS_ARB 0x2020 +#define WGL_ACCUM_ALPHA_BITS_ARB 0x2021 +#define WGL_DEPTH_BITS_ARB 0x2022+#define WGL_STENCIL_BITS_ARB 0x2023+#define WGL_AUX_BUFFERS_ARB 0x2024 +#define WGL_SAMPLE_BUFFERS_ARB 0x2041+#define WGL_SAMPLES_ARB 0x2042+++//========================================================================+// DLLs that are loaded at glfwInit()+//========================================================================++// gdi32.dll function pointer typedefs+#ifndef _GLFW_NO_DLOAD_GDI32+typedef int (WINAPI * CHOOSEPIXELFORMAT_T) (HDC,CONST PIXELFORMATDESCRIPTOR*);+typedef int (WINAPI * DESCRIBEPIXELFORMAT_T) (HDC,int,UINT,LPPIXELFORMATDESCRIPTOR);+typedef int (WINAPI * GETPIXELFORMAT_T) (HDC);+typedef BOOL (WINAPI * SETPIXELFORMAT_T) (HDC,int,const PIXELFORMATDESCRIPTOR*);+typedef BOOL (WINAPI * SWAPBUFFERS_T) (HDC);+#endif // _GLFW_NO_DLOAD_GDI32++// winmm.dll function pointer typedefs+#ifndef _GLFW_NO_DLOAD_WINMM+typedef MMRESULT (WINAPI * JOYGETDEVCAPSA_T) (UINT,LPJOYCAPSA,UINT);+typedef MMRESULT (WINAPI * JOYGETPOS_T) (UINT,LPJOYINFO);+typedef MMRESULT (WINAPI * JOYGETPOSEX_T) (UINT,LPJOYINFOEX);+typedef DWORD (WINAPI * TIMEGETTIME_T) (void);+#endif // _GLFW_NO_DLOAD_WINMM+++// gdi32.dll shortcuts+#ifndef _GLFW_NO_DLOAD_GDI32+#define _glfw_ChoosePixelFormat _glfwLibrary.Libs.ChoosePixelFormat+#define _glfw_DescribePixelFormat _glfwLibrary.Libs.DescribePixelFormat+#define _glfw_GetPixelFormat _glfwLibrary.Libs.GetPixelFormat+#define _glfw_SetPixelFormat _glfwLibrary.Libs.SetPixelFormat+#define _glfw_SwapBuffers _glfwLibrary.Libs.SwapBuffers+#else+#define _glfw_ChoosePixelFormat ChoosePixelFormat+#define _glfw_DescribePixelFormat DescribePixelFormat+#define _glfw_GetPixelFormat GetPixelFormat+#define _glfw_SetPixelFormat SetPixelFormat+#define _glfw_SwapBuffers SwapBuffers+#endif // _GLFW_NO_DLOAD_GDI32++// winmm.dll shortcuts+#ifndef _GLFW_NO_DLOAD_WINMM+#define _glfw_joyGetDevCaps _glfwLibrary.Libs.joyGetDevCapsA+#define _glfw_joyGetPos _glfwLibrary.Libs.joyGetPos+#define _glfw_joyGetPosEx _glfwLibrary.Libs.joyGetPosEx+#define _glfw_timeGetTime _glfwLibrary.Libs.timeGetTime+#else+#define _glfw_joyGetDevCaps joyGetDevCapsA+#define _glfw_joyGetPos joyGetPos+#define _glfw_joyGetPosEx joyGetPosEx+#define _glfw_timeGetTime timeGetTime+#endif // _GLFW_NO_DLOAD_WINMM+++//========================================================================+// Global variables (GLFW internals)+//========================================================================++//------------------------------------------------------------------------+// Window structure+//------------------------------------------------------------------------+typedef struct _GLFWwin_struct _GLFWwin;++struct _GLFWwin_struct {++// ========= PLATFORM INDEPENDENT MANDATORY PART =========================++ // User callback functions+ GLFWwindowsizefun WindowSizeCallback;+ GLFWwindowclosefun WindowCloseCallback;+ GLFWwindowrefreshfun WindowRefreshCallback;+ GLFWmousebuttonfun MouseButtonCallback;+ GLFWmouseposfun MousePosCallback;+ GLFWmousewheelfun MouseWheelCallback;+ GLFWkeyfun KeyCallback;+ GLFWcharfun CharCallback;++ // User selected window settings+ int Fullscreen; // Fullscreen flag+ int MouseLock; // Mouse-lock flag+ int AutoPollEvents; // Auto polling flag+ int SysKeysDisabled; // System keys disabled flag+ int WindowNoResize; // Resize- and maximize gadgets disabled flag++ // Window status & parameters+ int Opened; // Flag telling if window is opened or not+ int Active; // Application active flag+ int Iconified; // Window iconified flag+ int Width, Height; // Window width and heigth+ int Accelerated; // GL_TRUE if window is HW accelerated+ int RedBits;+ int GreenBits;+ int BlueBits;+ int AlphaBits;+ int DepthBits;+ int StencilBits;+ int AccumRedBits;+ int AccumGreenBits;+ int AccumBlueBits;+ int AccumAlphaBits;+ int AuxBuffers;+ int Stereo;+ int RefreshRate; // Vertical monitor refresh rate+ int Samples;++ // Extensions & OpenGL version+ int Has_GL_SGIS_generate_mipmap;+ int Has_GL_ARB_texture_non_power_of_two;+ int GLVerMajor,GLVerMinor;+++// ========= PLATFORM SPECIFIC PART ======================================++ // Platform specific window resources+ HDC DC; // Private GDI device context+ HGLRC RC; // Permanent rendering context+ HWND Wnd; // Window handle+ ATOM ClassAtom; // Window class atom+ int ModeID; // Mode ID for fullscreen mode+ HHOOK KeyboardHook; // Keyboard hook handle+ DWORD dwStyle; // Window styles used for window creation+ DWORD dwExStyle; // --"--++ // Platform specific extensions (context specific)+ WGLSWAPINTERVALEXT_T SwapInterval;+ WGLCHOOSEPIXELFORMATARB_T ChoosePixelFormat;+ WGLGETPIXELFORMATATTRIBIVARB_T GetPixelFormatAttribiv;+ WGLGETEXTENSIONSSTRINGEXT_T GetExtensionsStringEXT;+ WGLGETEXTENSIONSSTRINGARB_T GetExtensionsStringARB;++ // Various platform specific internal variables+ int OldMouseLock; // Old mouse-lock flag (used for remembering+ // mouse-lock state when iconifying)+ int OldMouseLockValid;+ int DesiredRefreshRate; // Desired vertical monitor refresh rate++};++GLFWGLOBAL _GLFWwin _glfwWin;+++//------------------------------------------------------------------------+// User input status (most of this should go in _GLFWwin)+//------------------------------------------------------------------------+GLFWGLOBAL struct {++// ========= PLATFORM INDEPENDENT MANDATORY PART =========================++ // Mouse status+ int MousePosX, MousePosY;+ int WheelPos;+ char MouseButton[ GLFW_MOUSE_BUTTON_LAST+1 ];++ // Keyboard status+ char Key[ GLFW_KEY_LAST+1 ];+ int LastChar;++ // User selected settings+ int StickyKeys;+ int StickyMouseButtons;+ int KeyRepeat;+++// ========= PLATFORM SPECIFIC PART ======================================++ // Platform specific internal variables+ int MouseMoved, OldMouseX, OldMouseY;++} _glfwInput;+++//------------------------------------------------------------------------+// Library global data+//------------------------------------------------------------------------+GLFWGLOBAL struct {++// ========= PLATFORM SPECIFIC PART ======================================++ HINSTANCE Instance; // Instance of the application++ // Timer data+ struct {+ int HasPerformanceCounter;+ double Resolution;+ unsigned int t0_32;+ __int64 t0_64;+ } Timer;++ // System information+ struct {+ int WinVer;+ int HasUnicode;+ DWORD ForegroundLockTimeout;+ } Sys;++#if !defined(_GLFW_NO_DLOAD_WINMM) || !defined(_GLFW_NO_DLOAD_GDI32)+ // Library handles and function pointers+ struct {+#ifndef _GLFW_NO_DLOAD_GDI32+ // gdi32.dll+ HINSTANCE gdi32;+ CHOOSEPIXELFORMAT_T ChoosePixelFormat;+ DESCRIBEPIXELFORMAT_T DescribePixelFormat;+ GETPIXELFORMAT_T GetPixelFormat;+ SETPIXELFORMAT_T SetPixelFormat;+ SWAPBUFFERS_T SwapBuffers;+#endif // _GLFW_NO_DLOAD_GDI32++ // winmm.dll+#ifndef _GLFW_NO_DLOAD_WINMM+ HINSTANCE winmm;+ JOYGETDEVCAPSA_T joyGetDevCapsA;+ JOYGETPOS_T joyGetPos;+ JOYGETPOSEX_T joyGetPosEx;+ TIMEGETTIME_T timeGetTime;+#endif // _GLFW_NO_DLOAD_WINMM+ } Libs;+#endif++} _glfwLibrary;+++//------------------------------------------------------------------------+// Thread record (one for each thread)+//------------------------------------------------------------------------+typedef struct _GLFWthread_struct _GLFWthread;++struct _GLFWthread_struct {++// ========= PLATFORM INDEPENDENT MANDATORY PART =========================++ // Pointer to previous and next threads in linked list+ _GLFWthread *Previous, *Next;++ // GLFW user side thread information+ GLFWthread ID;+ GLFWthreadfun Function;++// ========= PLATFORM SPECIFIC PART ======================================++ // System side thread information+ HANDLE Handle;+ DWORD WinID;++};+++//------------------------------------------------------------------------+// General thread information+//------------------------------------------------------------------------+GLFWGLOBAL struct {++// ========= PLATFORM INDEPENDENT MANDATORY PART =========================++ // Next thread ID to use (increments for every created thread)+ GLFWthread NextID;++ // First thread in linked list (always the main thread)+ _GLFWthread First;++// ========= PLATFORM SPECIFIC PART ======================================++ // Critical section lock+ CRITICAL_SECTION CriticalSection;++} _glfwThrd;++++//========================================================================+// Macros for encapsulating critical code sections (i.e. making parts+// of GLFW thread safe)+//========================================================================++// Thread list management+#define ENTER_THREAD_CRITICAL_SECTION \+ EnterCriticalSection( &_glfwThrd.CriticalSection );+#define LEAVE_THREAD_CRITICAL_SECTION \+ LeaveCriticalSection( &_glfwThrd.CriticalSection );+++//========================================================================+// Various Windows version constants+//========================================================================++#define _GLFW_WIN_UNKNOWN 0x0000 // Earlier than 95 or NT4+#define _GLFW_WIN_95 0x0001+#define _GLFW_WIN_98 0x0002+#define _GLFW_WIN_ME 0x0003+#define _GLFW_WIN_UNKNOWN_9x 0x0004 // Later than ME+#define _GLFW_WIN_NT4 0x0101+#define _GLFW_WIN_2K 0x0102+#define _GLFW_WIN_XP 0x0103+#define _GLFW_WIN_NET_SERVER 0x0104+#define _GLFW_WIN_UNKNOWN_NT 0x0105 // Later than .NET Server+++//========================================================================+// Prototypes for platform specific internal functions+//========================================================================++// Time+void _glfwInitTimer( void );++// Fullscreen support+int _glfwGetClosestVideoModeBPP( int *w, int *h, int *bpp, int *refresh );+int _glfwGetClosestVideoMode( int *w, int *h, int *r, int *g, int *b, int *refresh );+void _glfwSetVideoModeMODE( int mode );+void _glfwSetVideoMode( int *w, int *h, int r, int g, int b, int refresh );+++#endif // _platform_h_
+ glfw/lib/win32/win32_enable.c view
@@ -0,0 +1,155 @@+//========================================================================+// GLFW - An OpenGL framework+// File: win32_enable.c+// Platform: Windows+// API version: 2.6+// WWW: http://glfw.sourceforge.net+//------------------------------------------------------------------------+// Copyright (c) 2002-2006 Camilla Berglund+//+// This software is provided 'as-is', without any express or implied+// warranty. In no event will the authors be held liable for any damages+// arising from the use of this software.+//+// Permission is granted to anyone to use this software for any purpose,+// including commercial applications, and to alter it and redistribute it+// freely, subject to the following restrictions:+//+// 1. The origin of this software must not be misrepresented; you must not+// claim that you wrote the original software. If you use this software+// in a product, an acknowledgment in the product documentation would+// be appreciated but is not required.+//+// 2. Altered source versions must be plainly marked as such, and must not+// be misrepresented as being the original software.+//+// 3. This notice may not be removed or altered from any source+// distribution.+//+//========================================================================++#include "internal.h"+++//************************************************************************+//**** GLFW internal functions ****+//************************************************************************++//========================================================================+// _glfwLLKeyboardProc() - Low level keyboard callback function (used to+// disable system keys under Windows NT).+//========================================================================++LRESULT CALLBACK _glfwLLKeyboardProc( int nCode, WPARAM wParam,+ LPARAM lParam )+{+ BOOL syskeys = 0;+ PKBDLLHOOKSTRUCT p;++ // We are only looking for keyboard events - interpret lParam as a+ // pointer to a KBDLLHOOKSTRUCT+ p = (PKBDLLHOOKSTRUCT) lParam;++ // If nCode == HC_ACTION, then we have a keyboard event+ if( nCode == HC_ACTION )+ {+ switch( wParam )+ {+ case WM_KEYDOWN:+ case WM_SYSKEYDOWN:+ case WM_KEYUP:+ case WM_SYSKEYUP:+ // Detect: ALT+TAB, ALT+ESC, ALT+F4, CTRL+ESC,+ // LWIN, RWIN, APPS (mysterious menu key)+ syskeys = ( p->vkCode == VK_TAB &&+ p->flags & LLKHF_ALTDOWN ) ||+ ( p->vkCode == VK_ESCAPE &&+ p->flags & LLKHF_ALTDOWN ) ||+ ( p->vkCode == VK_F4 &&+ p->flags & LLKHF_ALTDOWN ) ||+ ( p->vkCode == VK_ESCAPE &&+ (GetKeyState(VK_CONTROL) & 0x8000)) ||+ p->vkCode == VK_LWIN ||+ p->vkCode == VK_RWIN ||+ p->vkCode == VK_APPS;+ break;++ default:+ break;+ }+ }++ // Was it a system key combination (e.g. ALT+TAB)?+ if( syskeys )+ {+ // Pass the key event to our window message loop+ if( _glfwWin.Opened )+ {+ PostMessage( _glfwWin.Wnd, (UINT) wParam, p->vkCode, 0 );+ }++ // We've taken care of it - don't let the system know about this+ // key event+ return 1;+ }+ else+ {+ // It's a harmless key press, let the system deal with it+ return CallNextHookEx( _glfwWin.KeyboardHook, nCode, wParam,+ lParam );+ }+}++++//************************************************************************+//**** Platform implementation functions ****+//************************************************************************++//========================================================================+// _glfwPlatformEnableSystemKeys() - Enable system keys+// _glfwPlatformDisableSystemKeys() - Disable system keys+//========================================================================++void _glfwPlatformEnableSystemKeys( void )+{+ BOOL bOld;++ // Use different methods depending on operating system version+ if( _glfwLibrary.Sys.WinVer >= _GLFW_WIN_NT4 )+ {+ if( _glfwWin.KeyboardHook != NULL )+ {+ UnhookWindowsHookEx( _glfwWin.KeyboardHook );+ _glfwWin.KeyboardHook = NULL;+ }+ }+ else+ {+ (void) SystemParametersInfo( SPI_SETSCREENSAVERRUNNING, FALSE,+ &bOld, 0 );+ }+}++void _glfwPlatformDisableSystemKeys( void )+{+ BOOL bOld;++ // Use different methods depending on operating system version+ if( _glfwLibrary.Sys.WinVer >= _GLFW_WIN_NT4 )+ {+ // Under Windows NT, install a low level keyboard hook+ _glfwWin.KeyboardHook = SetWindowsHookEx( WH_KEYBOARD_LL,+ _glfwLLKeyboardProc,+ _glfwLibrary.Instance,+ 0 );+ }+ else+ {+ // Under Windows 95/98/ME, fool Windows that a screensaver+ // is running => prevents ALT+TAB, CTRL+ESC and CTRL+ALT+DEL+ (void) SystemParametersInfo( SPI_SETSCREENSAVERRUNNING, TRUE,+ &bOld, 0 );+ }+}+
+ glfw/lib/win32/win32_fullscreen.c view
@@ -0,0 +1,317 @@+//========================================================================+// GLFW - An OpenGL framework+// File: win32_fullscreen.c+// Platform: Windows+// API version: 2.6+// WWW: http://glfw.sourceforge.net+//------------------------------------------------------------------------+// Copyright (c) 2002-2006 Camilla Berglund+//+// This software is provided 'as-is', without any express or implied+// warranty. In no event will the authors be held liable for any damages+// arising from the use of this software.+//+// Permission is granted to anyone to use this software for any purpose,+// including commercial applications, and to alter it and redistribute it+// freely, subject to the following restrictions:+//+// 1. The origin of this software must not be misrepresented; you must not+// claim that you wrote the original software. If you use this software+// in a product, an acknowledgment in the product documentation would+// be appreciated but is not required.+//+// 2. Altered source versions must be plainly marked as such, and must not+// be misrepresented as being the original software.+//+// 3. This notice may not be removed or altered from any source+// distribution.+//+//========================================================================++#include "internal.h"+++//************************************************************************+//**** GLFW internal functions ****+//************************************************************************++//========================================================================+// _glfwBPP2RGB() - Convert BPP to RGB bits (based on "best guess")+//========================================================================++static void _glfwBPP2RGB( int bpp, int *r, int *g, int *b )+{+ int delta;++ // Special case: BPP = 32+ if( bpp == 32 ) bpp = 24;++ // Convert "bits per pixel" to red, green & blue sizes+ *r = *g = *b = bpp / 3;+ delta = bpp - (*r * 3);+ if( delta >= 1 )+ {+ *g = *g + 1;+ }+ if( delta == 2 )+ {+ *r = *r + 1;+ }+}+++//========================================================================+// _glfwGetClosestVideoModeBPP()+//========================================================================++int _glfwGetClosestVideoModeBPP( int *w, int *h, int *bpp, int *refresh )+{+ int mode, bestmode, match, bestmatch, rr, bestrr, success;+ DEVMODE dm;++ // Find best match+ bestmatch = 0x7fffffff;+ bestrr = 0x7fffffff;+ mode = bestmode = 0;+ do+ {+ dm.dmSize = sizeof( DEVMODE );+ success = EnumDisplaySettings( NULL, mode, &dm );+ if( success )+ {+ match = dm.dmBitsPerPel - *bpp;+ if( match < 0 ) match = -match;+ match = ( match << 25 ) |+ ( (dm.dmPelsWidth - *w) *+ (dm.dmPelsWidth - *w) ++ (dm.dmPelsHeight - *h) *+ (dm.dmPelsHeight - *h) );+ if( match < bestmatch )+ {+ bestmatch = match;+ bestmode = mode;+ bestrr = (dm.dmDisplayFrequency - *refresh) *+ (dm.dmDisplayFrequency - *refresh);+ }+ else if( match == bestmatch && *refresh > 0 )+ {+ rr = (dm.dmDisplayFrequency - *refresh) *+ (dm.dmDisplayFrequency - *refresh);+ if( rr < bestrr )+ {+ bestmatch = match;+ bestmode = mode;+ bestrr = rr;+ }+ }+ }+ mode ++;+ }+ while( success );++ // Get the parameters for the best matching display mode+ dm.dmSize = sizeof( DEVMODE );+ (void) EnumDisplaySettings( NULL, bestmode, &dm );++ // Fill out actual width and height+ *w = dm.dmPelsWidth;+ *h = dm.dmPelsHeight;++ // Return bits per pixel+ *bpp = dm.dmBitsPerPel;++ // Return vertical refresh rate+ *refresh = dm.dmDisplayFrequency;++ return bestmode;+}+++//========================================================================+// _glfwGetClosestVideoMode()+//========================================================================++int _glfwGetClosestVideoMode( int *w, int *h, int *r, int *g, int *b,+ int *refresh )+{+ int bpp, bestmode;++ // Colorbits = sum of red/green/blue bits+ bpp = *r + *g + *b;++ // If colorbits < 15 (e.g. 0) or >= 24, default to 32 bpp+ if( bpp < 15 || bpp >= 24 )+ {+ bpp = 32;+ }++ // Find best match+ bestmode = _glfwGetClosestVideoModeBPP( w, h, &bpp, refresh );++ // Convert "bits per pixel" to red, green & blue sizes+ _glfwBPP2RGB( bpp, r, g, b );++ return bestmode;+}+++//========================================================================+// Change the current video mode+//========================================================================++void _glfwSetVideoModeMODE( int mode )+{+ DEVMODE dm;+ int success;++ // Get the parameters for the best matching display mode+ dm.dmSize = sizeof( DEVMODE );+ (void) EnumDisplaySettings( NULL, mode, &dm );++ // Set which fields we want to specify+ dm.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT | DM_BITSPERPEL;++ // Do we have a prefered refresh rate?+ if( _glfwWin.DesiredRefreshRate > 0 )+ {+ dm.dmFields = dm.dmFields | DM_DISPLAYFREQUENCY;+ dm.dmDisplayFrequency = _glfwWin.DesiredRefreshRate;+ }++ // Change display setting+ dm.dmSize = sizeof( DEVMODE );+ success = ChangeDisplaySettings( &dm, CDS_FULLSCREEN );++ // If the mode change was not possible, query the current display+ // settings (we'll use the desktop resolution for fullscreen mode)+ if( success == DISP_CHANGE_SUCCESSFUL )+ {+ _glfwWin.ModeID = mode;+ }+ else+ {+ _glfwWin.ModeID = ENUM_REGISTRY_SETTINGS;+ EnumDisplaySettings( NULL, ENUM_REGISTRY_SETTINGS, &dm );+ }++ // Set the window size to that of the display mode+ _glfwWin.Width = dm.dmPelsWidth;+ _glfwWin.Height = dm.dmPelsHeight;+}+++//========================================================================+// _glfwSetVideoMode() - Change the current video mode+//========================================================================++void _glfwSetVideoMode( int *w, int *h, int r, int g, int b, int refresh )+{+ int bestmode;++ // Find a best match mode+ bestmode = _glfwGetClosestVideoMode( w, h, &r, &g, &b, &refresh );++ // Change mode+ _glfwSetVideoModeMODE( bestmode );+}+++//************************************************************************+//**** GLFW user functions ****+//************************************************************************++//========================================================================+// _glfwPlatformGetVideoModes() - Get a list of available video modes+//========================================================================++int _glfwPlatformGetVideoModes( GLFWvidmode *list, int maxcount )+{+ int count, success, mode, i, j;+ int m1, m2, bpp, r, g, b;+ DEVMODE dm;++ // Loop through all video modes and extract all the UNIQUE modes+ count = 0;+ mode = 0;+ do+ {+ // Get video mode properties+ dm.dmSize = sizeof( DEVMODE );+ success = EnumDisplaySettings( NULL, mode, &dm );++ // Is it a valid mode? (only list depths >= 15 bpp)+ if( success && dm.dmBitsPerPel >= 15 )+ {+ // Convert to RGB, and back to bpp ("mask out" alpha bits etc)+ _glfwBPP2RGB( dm.dmBitsPerPel, &r, &g, &b );+ bpp = r + g + b;++ // Mode "code" for this mode+ m1 = (bpp << 25) | (dm.dmPelsWidth * dm.dmPelsHeight);++ // Insert mode in list (sorted), and avoid duplicates+ for( i = 0; i < count; i ++ )+ {+ // Mode "code" for already listed mode+ bpp = list[i].RedBits + list[i].GreenBits ++ list[i].BlueBits;+ m2 = (bpp << 25) | (list[i].Width * list[i].Height);+ if( m1 <= m2 )+ {+ break;+ }+ }++ // New entry at the end of the list?+ if( i >= count )+ {+ list[count].Width = dm.dmPelsWidth;+ list[count].Height = dm.dmPelsHeight;+ list[count].RedBits = r;+ list[count].GreenBits = g;+ list[count].BlueBits = b;+ count ++;+ }+ // Insert new entry in the list?+ else if( m1 < m2 )+ {+ for( j = count; j > i; j -- )+ {+ list[j] = list[j-1];+ }+ list[i].Width = dm.dmPelsWidth;+ list[i].Height = dm.dmPelsHeight;+ list[i].RedBits = r;+ list[i].GreenBits = g;+ list[i].BlueBits = b;+ count ++;+ }+ }+ mode ++;+ }+ while( success && (count < maxcount) );++ return count;+}+++//========================================================================+// _glfwPlatformGetDesktopMode() - Get the desktop video mode+//========================================================================++void _glfwPlatformGetDesktopMode( GLFWvidmode *mode )+{+ DEVMODE dm;++ // Get desktop display mode+ dm.dmSize = sizeof( DEVMODE );+ (void) EnumDisplaySettings( NULL, ENUM_REGISTRY_SETTINGS, &dm );++ // Return desktop mode parameters+ mode->Width = dm.dmPelsWidth;+ mode->Height = dm.dmPelsHeight;+ _glfwBPP2RGB( dm.dmBitsPerPel, &mode->RedBits, &mode->GreenBits,+ &mode->BlueBits );+}++
+ glfw/lib/win32/win32_glext.c view
@@ -0,0 +1,85 @@+//========================================================================+// GLFW - An OpenGL framework+// File: win32_glext.c+// Platform: Windows+// API version: 2.6+// WWW: http://glfw.sourceforge.net+//------------------------------------------------------------------------+// Copyright (c) 2002-2006 Camilla Berglund+//+// This software is provided 'as-is', without any express or implied+// warranty. In no event will the authors be held liable for any damages+// arising from the use of this software.+//+// Permission is granted to anyone to use this software for any purpose,+// including commercial applications, and to alter it and redistribute it+// freely, subject to the following restrictions:+//+// 1. The origin of this software must not be misrepresented; you must not+// claim that you wrote the original software. If you use this software+// in a product, an acknowledgment in the product documentation would+// be appreciated but is not required.+//+// 2. Altered source versions must be plainly marked as such, and must not+// be misrepresented as being the original software.+//+// 3. This notice may not be removed or altered from any source+// distribution.+//+//========================================================================++#include "internal.h"+++//************************************************************************+//**** Platform implementation functions ****+//************************************************************************++//========================================================================+// Check if an OpenGL extension is available at runtime (Windows version checks+// for WGL extensions)+//========================================================================++int _glfwPlatformExtensionSupported( const char *extension )+{+ const GLubyte *extensions;++ // Try wglGetExtensionsStringEXT+ if( _glfwWin.GetExtensionsStringEXT != NULL )+ {+ extensions = (GLubyte *) _glfwWin.GetExtensionsStringEXT();+ if( extensions != NULL )+ {+ if( _glfwStringInExtensionString( extension, extensions ) )+ {+ return GL_TRUE;+ }+ }+ }++ // Try wglGetExtensionsStringARB+ if( _glfwWin.GetExtensionsStringARB != NULL )+ {+ extensions = (GLubyte *) _glfwWin.GetExtensionsStringARB( _glfwWin.DC );+ if( extensions != NULL )+ {+ if( _glfwStringInExtensionString( extension, extensions ) )+ {+ return GL_TRUE;+ }+ }+ }++ return GL_FALSE;+}+++//========================================================================+// Get the function pointer to an OpenGL function+//========================================================================++void * _glfwPlatformGetProcAddress( const char *procname )+{+ return (void *) wglGetProcAddress( procname );+}+
+ glfw/lib/win32/win32_init.c view
@@ -0,0 +1,356 @@+//========================================================================+// GLFW - An OpenGL framework+// File: win32_init.c+// Platform: Windows+// API version: 2.6+// WWW: http://glfw.sourceforge.net+//------------------------------------------------------------------------+// Copyright (c) 2002-2006 Camilla Berglund+//+// This software is provided 'as-is', without any express or implied+// warranty. In no event will the authors be held liable for any damages+// arising from the use of this software.+//+// Permission is granted to anyone to use this software for any purpose,+// including commercial applications, and to alter it and redistribute it+// freely, subject to the following restrictions:+//+// 1. The origin of this software must not be misrepresented; you must not+// claim that you wrote the original software. If you use this software+// in a product, an acknowledgment in the product documentation would+// be appreciated but is not required.+//+// 2. Altered source versions must be plainly marked as such, and must not+// be misrepresented as being the original software.+//+// 3. This notice may not be removed or altered from any source+// distribution.+//+//========================================================================++#include "internal.h"++// With the Borland C++ compiler, we want to disable FPU exceptions+#ifdef __BORLANDC__+#include <float.h>+#endif // __BORLANDC__++++//************************************************************************+//**** GLFW internal functions ****+//************************************************************************++//========================================================================+// _glfwInitLibraries() - Load necessary libraries (DLLs)+//========================================================================++static int _glfwInitLibraries( void )+{+ // gdi32.dll (OpenGL pixel format functions & SwapBuffers)+#ifndef _GLFW_NO_DLOAD_GDI32+ _glfwLibrary.Libs.gdi32 = LoadLibrary( "gdi32.dll" );+ if( _glfwLibrary.Libs.gdi32 != NULL )+ {+ _glfwLibrary.Libs.ChoosePixelFormat = (CHOOSEPIXELFORMAT_T)+ GetProcAddress( _glfwLibrary.Libs.gdi32, "ChoosePixelFormat" );+ _glfwLibrary.Libs.DescribePixelFormat = (DESCRIBEPIXELFORMAT_T)+ GetProcAddress( _glfwLibrary.Libs.gdi32, "DescribePixelFormat" );+ _glfwLibrary.Libs.GetPixelFormat = (GETPIXELFORMAT_T)+ GetProcAddress( _glfwLibrary.Libs.gdi32, "GetPixelFormat" );+ _glfwLibrary.Libs.SetPixelFormat = (SETPIXELFORMAT_T)+ GetProcAddress( _glfwLibrary.Libs.gdi32, "SetPixelFormat" );+ _glfwLibrary.Libs.SwapBuffers = (SWAPBUFFERS_T)+ GetProcAddress( _glfwLibrary.Libs.gdi32, "SwapBuffers" );+ if( _glfwLibrary.Libs.ChoosePixelFormat == NULL ||+ _glfwLibrary.Libs.DescribePixelFormat == NULL ||+ _glfwLibrary.Libs.GetPixelFormat == NULL ||+ _glfwLibrary.Libs.SetPixelFormat == NULL ||+ _glfwLibrary.Libs.SwapBuffers == NULL )+ {+ FreeLibrary( _glfwLibrary.Libs.gdi32 );+ _glfwLibrary.Libs.gdi32 = NULL;+ return GL_FALSE;+ }+ }+ else+ {+ return GL_FALSE;+ }+#endif // _GLFW_NO_DLOAD_GDI32++ // winmm.dll (for joystick and timer support)+#ifndef _GLFW_NO_DLOAD_WINMM+ _glfwLibrary.Libs.winmm = LoadLibrary( "winmm.dll" );+ if( _glfwLibrary.Libs.winmm != NULL )+ {+ _glfwLibrary.Libs.joyGetDevCapsA = (JOYGETDEVCAPSA_T)+ GetProcAddress( _glfwLibrary.Libs.winmm, "joyGetDevCapsA" );+ _glfwLibrary.Libs.joyGetPos = (JOYGETPOS_T)+ GetProcAddress( _glfwLibrary.Libs.winmm, "joyGetPos" );+ _glfwLibrary.Libs.joyGetPosEx = (JOYGETPOSEX_T)+ GetProcAddress( _glfwLibrary.Libs.winmm, "joyGetPosEx" );+ _glfwLibrary.Libs.timeGetTime = (TIMEGETTIME_T)+ GetProcAddress( _glfwLibrary.Libs.winmm, "timeGetTime" );+ if( _glfwLibrary.Libs.joyGetDevCapsA == NULL ||+ _glfwLibrary.Libs.joyGetPos == NULL ||+ _glfwLibrary.Libs.joyGetPosEx == NULL ||+ _glfwLibrary.Libs.timeGetTime == NULL )+ {+ FreeLibrary( _glfwLibrary.Libs.winmm );+ _glfwLibrary.Libs.winmm = NULL;+ return GL_FALSE;+ }+ }+ else+ {+ return GL_FALSE;+ }+#endif // _GLFW_NO_DLOAD_WINMM++ return GL_TRUE;+}+++//========================================================================+// _glfwFreeLibraries() - Unload used libraries (DLLs)+//========================================================================++static void _glfwFreeLibraries( void )+{+ // gdi32.dll+#ifndef _GLFW_NO_DLOAD_GDI32+ if( _glfwLibrary.Libs.gdi32 != NULL )+ {+ FreeLibrary( _glfwLibrary.Libs.gdi32 );+ _glfwLibrary.Libs.gdi32 = NULL;+ }+#endif // _GLFW_NO_DLOAD_GDI32++ // winmm.dll+#ifndef _GLFW_NO_DLOAD_WINMM+ if( _glfwLibrary.Libs.winmm != NULL )+ {+ FreeLibrary( _glfwLibrary.Libs.winmm );+ _glfwLibrary.Libs.winmm = NULL;+ }+#endif // _GLFW_NO_DLOAD_WINMM+}+++//========================================================================+// _glfwInitThreads() - Initialize GLFW thread package+//========================================================================++static void _glfwInitThreads( void )+{+ // Initialize critical section handle+ InitializeCriticalSection( &_glfwThrd.CriticalSection );++ // The first thread (the main thread) has ID 0+ _glfwThrd.NextID = 0;++ // Fill out information about the main thread (this thread)+ _glfwThrd.First.ID = _glfwThrd.NextID ++;+ _glfwThrd.First.Function = NULL;+ _glfwThrd.First.Handle = GetCurrentThread();+ _glfwThrd.First.WinID = GetCurrentThreadId();+ _glfwThrd.First.Previous = NULL;+ _glfwThrd.First.Next = NULL;+}+++//========================================================================+// _glfwTerminateThreads() - Terminate GLFW thread package+//========================================================================++static void _glfwTerminateThreads( void )+{+ _GLFWthread *t, *t_next;++ // Enter critical section+ ENTER_THREAD_CRITICAL_SECTION++ // Kill all threads (NOTE: THE USER SHOULD WAIT FOR ALL THREADS TO+ // DIE, _BEFORE_ CALLING glfwTerminate()!!!)+ t = _glfwThrd.First.Next;+ while( t != NULL )+ {+ // Get pointer to next thread+ t_next = t->Next;++ // Simply murder the process, no mercy!+ if( TerminateThread( t->Handle, 0 ) )+ {+ // Close thread handle+ CloseHandle( t->Handle );++ // Free memory allocated for this thread+ free( (void *) t );+ }++ // Select next thread in list+ t = t_next;+ }++ // Leave critical section+ LEAVE_THREAD_CRITICAL_SECTION++ // Delete critical section handle+ DeleteCriticalSection( &_glfwThrd.CriticalSection );+}+++//========================================================================+// _glfwTerminate_atexit() - Terminate GLFW when exiting application+//========================================================================++void _glfwTerminate_atexit( void )+{+ glfwTerminate();+}++++//************************************************************************+//**** Platform implementation functions ****+//************************************************************************++//========================================================================+// _glfwPlatformInit() - Initialize various GLFW state+//========================================================================++int _glfwPlatformInit( void )+{+ OSVERSIONINFO osi;++ // To make SetForegroundWindow() work as we want, we need to fiddle+ // with the FOREGROUNDLOCKTIMEOUT system setting (we do this as early+ // as possible in the hope of still being the foreground process)+ SystemParametersInfo( SPI_GETFOREGROUNDLOCKTIMEOUT, 0,+ &_glfwLibrary.Sys.ForegroundLockTimeout, 0 );+ SystemParametersInfo( SPI_SETFOREGROUNDLOCKTIMEOUT, 0, (LPVOID)0,+ SPIF_SENDCHANGE );++ // Check which OS version we are running+ osi.dwOSVersionInfoSize = sizeof( OSVERSIONINFO );+ GetVersionEx( &osi );+ _glfwLibrary.Sys.WinVer = _GLFW_WIN_UNKNOWN;+ if( osi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS )+ {+ if( osi.dwMajorVersion == 4 && osi.dwMinorVersion < 10 )+ {+ _glfwLibrary.Sys.WinVer = _GLFW_WIN_95;+ }+ else if( osi.dwMajorVersion == 4 && osi.dwMinorVersion < 90 )+ {+ _glfwLibrary.Sys.WinVer = _GLFW_WIN_98;+ }+ else if( osi.dwMajorVersion == 4 && osi.dwMinorVersion == 90 )+ {+ _glfwLibrary.Sys.WinVer = _GLFW_WIN_ME;+ }+ else if( osi.dwMajorVersion >= 4 )+ {+ _glfwLibrary.Sys.WinVer = _GLFW_WIN_UNKNOWN_9x;+ }+ }+ else if( osi.dwPlatformId == VER_PLATFORM_WIN32_NT )+ {+ if( osi.dwMajorVersion == 4 && osi.dwMinorVersion == 0 )+ {+ _glfwLibrary.Sys.WinVer = _GLFW_WIN_NT4;+ }+ else if( osi.dwMajorVersion == 5 && osi.dwMinorVersion == 0 )+ {+ _glfwLibrary.Sys.WinVer = _GLFW_WIN_2K;+ }+ else if( osi.dwMajorVersion == 5 && osi.dwMinorVersion == 1 )+ {+ _glfwLibrary.Sys.WinVer = _GLFW_WIN_XP;+ }+ else if( osi.dwMajorVersion == 5 && osi.dwMinorVersion == 2 )+ {+ _glfwLibrary.Sys.WinVer = _GLFW_WIN_NET_SERVER;+ }+ else if( osi.dwMajorVersion >= 5 )+ {+ _glfwLibrary.Sys.WinVer = _GLFW_WIN_UNKNOWN_NT;+ }+ }++ // Do we have Unicode support?+ if( _glfwLibrary.Sys.WinVer >= _GLFW_WIN_NT4 )+ {+ // Windows NT/2000/XP/.NET has Unicode support+ _glfwLibrary.Sys.HasUnicode = GL_TRUE;+ }+ else+ {+ // Windows 9x/ME does not have Unicode support+ _glfwLibrary.Sys.HasUnicode = GL_FALSE;+ }++ // Load libraries (DLLs)+ if( !_glfwInitLibraries() )+ {+ return GL_FALSE;+ }++ // With the Borland C++ compiler, we want to disable FPU exceptions+ // (this is recommended for OpenGL applications under Windows)+#ifdef __BORLANDC__+ _control87( MCW_EM, MCW_EM );+#endif++ // Retrieve GLFW instance handle+ _glfwLibrary.Instance = GetModuleHandle( NULL );++ // System keys are not disabled+ _glfwWin.KeyboardHook = NULL;++ // Initialise thread package+ _glfwInitThreads();++ // Install atexit() routine+ atexit( _glfwTerminate_atexit );++ // Start the timer+ _glfwInitTimer();++ return GL_TRUE;+}+++//========================================================================+// _glfwPlatformTerminate() - Close window and kill all threads+//========================================================================++int _glfwPlatformTerminate( void )+{+ // Only the main thread is allowed to do this...+ if( GetCurrentThreadId() != _glfwThrd.First.WinID )+ {+ return GL_FALSE;+ }++ // Close OpenGL window+ glfwCloseWindow();++ // Kill thread package+ _glfwTerminateThreads();++ // Enable system keys again (if they were disabled)+ glfwEnable( GLFW_SYSTEM_KEYS );++ // Unload libraries (DLLs)+ _glfwFreeLibraries();++ // Restore FOREGROUNDLOCKTIMEOUT system setting+ SystemParametersInfo( SPI_SETFOREGROUNDLOCKTIMEOUT, 0,+ (LPVOID)_glfwLibrary.Sys.ForegroundLockTimeout,+ SPIF_SENDCHANGE );++ return GL_TRUE;+}+
+ glfw/lib/win32/win32_joystick.c view
@@ -0,0 +1,234 @@+//========================================================================+// GLFW - An OpenGL framework+// File: win32_joystick.c+// Platform: Windows+// API version: 2.6+// WWW: http://glfw.sourceforge.net+//------------------------------------------------------------------------+// Copyright (c) 2002-2006 Camilla Berglund+//+// This software is provided 'as-is', without any express or implied+// warranty. In no event will the authors be held liable for any damages+// arising from the use of this software.+//+// Permission is granted to anyone to use this software for any purpose,+// including commercial applications, and to alter it and redistribute it+// freely, subject to the following restrictions:+//+// 1. The origin of this software must not be misrepresented; you must not+// claim that you wrote the original software. If you use this software+// in a product, an acknowledgment in the product documentation would+// be appreciated but is not required.+//+// 2. Altered source versions must be plainly marked as such, and must not+// be misrepresented as being the original software.+//+// 3. This notice may not be removed or altered from any source+// distribution.+//+//========================================================================++#include "internal.h"+++//************************************************************************+//**** GLFW internal functions ****+//************************************************************************++//========================================================================+// _glfwJoystickPresent() - Return GL_TRUE if joystick is present,+// else return GL_FALSE.+//========================================================================++static int _glfwJoystickPresent( int joy )+{+ JOYINFO ji;++ // Windows NT 4.0 MMSYSTEM only supports 2 sticks (other Windows+ // versions support 16 sticks)+ if( _glfwLibrary.Sys.WinVer == _GLFW_WIN_NT4 && joy > GLFW_JOYSTICK_2 )+ {+ return GL_FALSE;+ }++ // Is it a valid stick ID (Windows don't support more than 16 sticks)?+ if( joy < GLFW_JOYSTICK_1 || joy > GLFW_JOYSTICK_16 )+ {+ return GL_FALSE;+ }++ // Is the joystick present?+ if( _glfw_joyGetPos( joy - GLFW_JOYSTICK_1, &ji ) != JOYERR_NOERROR )+ {+ return GL_FALSE;+ }++ return GL_TRUE;+}+++//========================================================================+// _glfwCalcJoystickPos() - Calculate joystick position+//========================================================================++static float _glfwCalcJoystickPos( DWORD pos, DWORD min, DWORD max )+{+ float fpos = (float) pos;+ float fmin = (float) min;+ float fmax = (float) max;+ return (2.0f*(fpos - fmin) / (fmax - fmin)) - 1.0f;+}++++//************************************************************************+//**** Platform implementation functions ****+//************************************************************************++//========================================================================+// _glfwPlatformGetJoystickParam() - Determine joystick capabilities+//========================================================================++int _glfwPlatformGetJoystickParam( int joy, int param )+{+ JOYCAPS jc;++// return 0;++ // Is joystick present?+ if( !_glfwJoystickPresent( joy ) )+ {+ return 0;+ }++ // We got this far, the joystick is present+ if( param == GLFW_PRESENT )+ {+ return GL_TRUE;+ }++ // Get joystick capabilities+ _glfw_joyGetDevCaps( joy - GLFW_JOYSTICK_1, &jc, sizeof(JOYCAPS) );++ switch( param )+ {+ case GLFW_AXES:+ // Return number of joystick axes+ return jc.wNumAxes;++ case GLFW_BUTTONS:+ // Return number of joystick axes+ return jc.wNumButtons;++ default:+ break;+ }++ return 0;+}+++//========================================================================+// _glfwPlatformGetJoystickPos() - Get joystick axis positions+//========================================================================++int _glfwPlatformGetJoystickPos( int joy, float *pos, int numaxes )+{+ JOYCAPS jc;+ JOYINFOEX ji;+ int axis;++// return 0;++ // Is joystick present?+ if( !_glfwJoystickPresent( joy ) )+ {+ return 0;+ }++ // Get joystick capabilities+ _glfw_joyGetDevCaps( joy - GLFW_JOYSTICK_1, &jc, sizeof(JOYCAPS) );++ // Get joystick state+ ji.dwSize = sizeof( JOYINFOEX );+ ji.dwFlags = JOY_RETURNX | JOY_RETURNY | JOY_RETURNZ |+ JOY_RETURNR | JOY_RETURNU | JOY_RETURNV;+ _glfw_joyGetPosEx( joy - GLFW_JOYSTICK_1, &ji );++ // Get position values for all axes+ axis = 0;+ if( axis < numaxes )+ {+ pos[ axis++ ] = _glfwCalcJoystickPos( ji.dwXpos, jc.wXmin,+ jc.wXmax );+ }+ if( axis < numaxes )+ {+ pos[ axis++ ] = -_glfwCalcJoystickPos( ji.dwYpos, jc.wYmin,+ jc.wYmax );+ }+ if( axis < numaxes && jc.wCaps & JOYCAPS_HASZ )+ {+ pos[ axis++ ] = _glfwCalcJoystickPos( ji.dwZpos, jc.wZmin,+ jc.wZmax );+ }+ if( axis < numaxes && jc.wCaps & JOYCAPS_HASR )+ {+ pos[ axis++ ] = _glfwCalcJoystickPos( ji.dwRpos, jc.wRmin,+ jc.wRmax );+ }+ if( axis < numaxes && jc.wCaps & JOYCAPS_HASU )+ {+ pos[ axis++ ] = _glfwCalcJoystickPos( ji.dwUpos, jc.wUmin,+ jc.wUmax );+ }+ if( axis < numaxes && jc.wCaps & JOYCAPS_HASV )+ {+ pos[ axis++ ] = -_glfwCalcJoystickPos( ji.dwVpos, jc.wVmin,+ jc.wVmax );+ }++ // Return number of returned axes+ return axis;+}+++//========================================================================+// _glfwPlatformGetJoystickButtons() - Get joystick button states+//========================================================================++int _glfwPlatformGetJoystickButtons( int joy, unsigned char *buttons,+ int numbuttons )+{+ JOYCAPS jc;+ JOYINFOEX ji;+ int button;++// return 0;++ // Is joystick present?+ if( !_glfwJoystickPresent( joy ) )+ {+ return 0;+ }++ // Get joystick capabilities+ _glfw_joyGetDevCaps( joy - GLFW_JOYSTICK_1, &jc, sizeof(JOYCAPS) );++ // Get joystick state+ ji.dwSize = sizeof( JOYINFOEX );+ ji.dwFlags = JOY_RETURNBUTTONS;+ _glfw_joyGetPosEx( joy - GLFW_JOYSTICK_1, &ji );++ // Get states of all requested buttons+ button = 0;+ while( button < numbuttons && button < (int) jc.wNumButtons )+ {+ buttons[ button ] = (unsigned char)+ (ji.dwButtons & (1UL << button) ? GLFW_PRESS : GLFW_RELEASE);+ button ++;+ }++ return button;+}+
+ glfw/lib/win32/win32_thread.c view
@@ -0,0 +1,511 @@+//========================================================================+// GLFW - An OpenGL framework+// File: win32_thread.c+// Platform: Windows+// API version: 2.6+// WWW: http://glfw.sourceforge.net+//------------------------------------------------------------------------+// Copyright (c) 2002-2006 Camilla Berglund+//+// This software is provided 'as-is', without any express or implied+// warranty. In no event will the authors be held liable for any damages+// arising from the use of this software.+//+// Permission is granted to anyone to use this software for any purpose,+// including commercial applications, and to alter it and redistribute it+// freely, subject to the following restrictions:+//+// 1. The origin of this software must not be misrepresented; you must not+// claim that you wrote the original software. If you use this software+// in a product, an acknowledgment in the product documentation would+// be appreciated but is not required.+//+// 2. Altered source versions must be plainly marked as such, and must not+// be misrepresented as being the original software.+//+// 3. This notice may not be removed or altered from any source+// distribution.+//+//========================================================================++#include "internal.h"+++//************************************************************************+// This is an implementation of POSIX "compatible" condition variables for+// Win32, as described by Douglas C. Schmidt and Irfan Pyarali:+// http://www.cs.wustl.edu/~schmidt/win32-cv-1.html+//************************************************************************++enum {+ _GLFW_COND_SIGNAL = 0,+ _GLFW_COND_BROADCAST = 1+};++typedef struct {+ // Signal and broadcast event HANDLEs+ HANDLE events[ 2 ];++ // Count of the number of waiters+ unsigned int waiters_count;++ // Serialize access to <waiters_count>+ CRITICAL_SECTION waiters_count_lock;+} _GLFWcond;++++//************************************************************************+//**** GLFW internal functions ****+//************************************************************************++//========================================================================+// _glfwNewThread() - This is simply a "wrapper" for calling the user+// thread function.+//========================================================================++DWORD WINAPI _glfwNewThread( LPVOID lpParam )+{+ GLFWthreadfun threadfun;+ _GLFWthread *t;++ // Get pointer to thread information for current thread+ t = _glfwGetThreadPointer( _glfwPlatformGetThreadID() );+ if( t == NULL )+ {+ return 0;+ }++ // Get user thread function pointer+ threadfun = t->Function;++ // Call the user thread function+ threadfun( (void *) lpParam );++ // Remove thread from thread list+ ENTER_THREAD_CRITICAL_SECTION+ _glfwRemoveThread( t );+ LEAVE_THREAD_CRITICAL_SECTION++ // When the thread function returns, the thread will die...+ return 0;+}++++//************************************************************************+//**** GLFW user functions ****+//************************************************************************++//========================================================================+// _glfwPlatformCreateThread() - Create a new thread+//========================================================================++GLFWthread _glfwPlatformCreateThread( GLFWthreadfun fun, void *arg )+{+ GLFWthread ID;+ _GLFWthread *t, *t_tmp;+ HANDLE hThread;+ DWORD dwThreadId;++ // Enter critical section+ ENTER_THREAD_CRITICAL_SECTION++ // Create a new thread information memory area+ t = (_GLFWthread *) malloc( sizeof(_GLFWthread) );+ if( t == NULL )+ {+ // Leave critical section+ LEAVE_THREAD_CRITICAL_SECTION+ return -1;+ }++ // Get a new unique thread id+ ID = _glfwThrd.NextID ++;++ // Store thread information in the thread list+ t->Function = fun;+ t->ID = ID;++ // Create thread+ hThread = CreateThread(+ NULL, // Default security attributes+ 0, // Default stack size (1 MB)+ _glfwNewThread, // Thread function (a wrapper function)+ (LPVOID)arg, // Argument to thread is the user argument+ 0, // Default creation flags+ &dwThreadId // Returned thread identifier+ );++ // Did the thread creation fail?+ if( hThread == NULL )+ {+ free( (void *) t );+ LEAVE_THREAD_CRITICAL_SECTION+ return -1;+ }++ // Store more thread information in the thread list+ t->Handle = hThread;+ t->WinID = dwThreadId;++ // Append thread to thread list+ t_tmp = &_glfwThrd.First;+ while( t_tmp->Next != NULL )+ {+ t_tmp = t_tmp->Next;+ }+ t_tmp->Next = t;+ t->Previous = t_tmp;+ t->Next = NULL;++ // Leave critical section+ LEAVE_THREAD_CRITICAL_SECTION++ // Return the GLFW thread ID+ return ID;+}+++//========================================================================+// _glfwPlatformDestroyThread() - Kill a thread. NOTE: THIS IS A VERY+// DANGEROUS OPERATION, AND SHOULD NOT BE USED EXCEPT IN EXTREME+// SITUATIONS!+//========================================================================++void _glfwPlatformDestroyThread( GLFWthread ID )+{+ _GLFWthread *t;++ // Enter critical section+ ENTER_THREAD_CRITICAL_SECTION++ // Get thread information pointer+ t = _glfwGetThreadPointer( ID );+ if( t == NULL )+ {+ LEAVE_THREAD_CRITICAL_SECTION+ return;+ }++ // Simply murder the process, no mercy!+ if( TerminateThread( t->Handle, 0 ) )+ {+ // Close thread handle+ CloseHandle( t->Handle );++ // Remove thread from thread list+ _glfwRemoveThread( t );+ }++ // Leave critical section+ LEAVE_THREAD_CRITICAL_SECTION+}+++//========================================================================+// _glfwPlatformWaitThread() - Wait for a thread to die+//========================================================================++int _glfwPlatformWaitThread( GLFWthread ID, int waitmode )+{+ DWORD result;+ HANDLE hThread;+ _GLFWthread *t;++ // Enter critical section+ ENTER_THREAD_CRITICAL_SECTION++ // Get thread information pointer+ t = _glfwGetThreadPointer( ID );++ // Is the thread already dead?+ if( t == NULL )+ {+ LEAVE_THREAD_CRITICAL_SECTION+ return GL_TRUE;+ }++ // Get thread handle+ hThread = t->Handle;++ // Leave critical section+ LEAVE_THREAD_CRITICAL_SECTION++ // Wait for thread to die+ if( waitmode == GLFW_WAIT )+ {+ result = WaitForSingleObject( hThread, INFINITE );+ }+ else if( waitmode == GLFW_NOWAIT )+ {+ result = WaitForSingleObject( hThread, 0 );+ }+ else+ {+ return GL_FALSE;+ }++ // Did we have a time-out?+ if( result == WAIT_TIMEOUT )+ {+ return GL_FALSE;+ }+ return GL_TRUE;+}+++//========================================================================+// _glfwPlatformGetThreadID() - Return the thread ID for the current+// thread+//========================================================================++GLFWthread _glfwPlatformGetThreadID( void )+{+ _GLFWthread *t;+ GLFWthread ID = -1;+ DWORD WinID;++ // Get Windows thread ID+ WinID = GetCurrentThreadId();++ // Enter critical section (to avoid an inconsistent thread list)+ ENTER_THREAD_CRITICAL_SECTION++ // Loop through entire list of threads to find the matching Windows+ // thread ID+ for( t = &_glfwThrd.First; t != NULL; t = t->Next )+ {+ if( t->WinID == WinID )+ {+ ID = t->ID;+ break;+ }+ }++ // Leave critical section+ LEAVE_THREAD_CRITICAL_SECTION++ // Return the found GLFW thread identifier+ return ID;+}+++//========================================================================+// _glfwPlatformCreateMutex() - Create a mutual exclusion object+//========================================================================++GLFWmutex _glfwPlatformCreateMutex( void )+{+ CRITICAL_SECTION *mutex;++ // Allocate memory for mutex+ mutex = (CRITICAL_SECTION *) malloc( sizeof(CRITICAL_SECTION) );+ if( !mutex )+ {+ return NULL;+ }++ // Initialize mutex+ InitializeCriticalSection( mutex );++ // Cast to GLFWmutex and return+ return (GLFWmutex) mutex;+}+++//========================================================================+// glfwDestroyMutex() - Destroy a mutual exclusion object+//========================================================================++void _glfwPlatformDestroyMutex( GLFWmutex mutex )+{+ // Destroy mutex+ DeleteCriticalSection( (CRITICAL_SECTION *) mutex );+ free( mutex );+}+++//========================================================================+// _glfwPlatformLockMutex() - Request access to a mutex+//========================================================================++void _glfwPlatformLockMutex( GLFWmutex mutex )+{+ // Wait for mutex to be released+ EnterCriticalSection( (CRITICAL_SECTION *) mutex );+}+++//========================================================================+// _glfwPlatformUnlockMutex() - Release a mutex+//========================================================================++void _glfwPlatformUnlockMutex( GLFWmutex mutex )+{+ // Release mutex+ LeaveCriticalSection( (CRITICAL_SECTION *) mutex );+}+++//========================================================================+// _glfwPlatformCreateCond() - Create a new condition variable object+//========================================================================++GLFWcond _glfwPlatformCreateCond( void )+{+ _GLFWcond *cond;++ // Allocate memory for condition variable+ cond = (_GLFWcond *) malloc( sizeof(_GLFWcond) );+ if( !cond )+ {+ return NULL;+ }++ // Initialize condition variable+ cond->waiters_count = 0;+ cond->events[ _GLFW_COND_SIGNAL ] = CreateEvent( NULL, FALSE,+ FALSE, NULL );+ cond->events[ _GLFW_COND_BROADCAST ] = CreateEvent( NULL, TRUE,+ FALSE, NULL );+ InitializeCriticalSection( &cond->waiters_count_lock );++ // Cast to GLFWcond and return+ return (GLFWcond) cond;+}+++//========================================================================+// _glfwPlatformDestroyCond() - Destroy a condition variable object+//========================================================================++void _glfwPlatformDestroyCond( GLFWcond cond )+{+ // Close the condition variable handles+ CloseHandle( ((_GLFWcond *)cond)->events[ _GLFW_COND_SIGNAL ] );+ CloseHandle( ((_GLFWcond *)cond)->events[ _GLFW_COND_BROADCAST ] );++ // Delete critical section+ DeleteCriticalSection( &((_GLFWcond *)cond)->waiters_count_lock );++ // Free memory for condition variable+ free( (void *) cond );+}+++//========================================================================+// _glfwPlatformWaitCond() - Wait for a condition to be raised+//========================================================================++void _glfwPlatformWaitCond( GLFWcond cond, GLFWmutex mutex,+ double timeout )+{+ _GLFWcond *cv = (_GLFWcond *) cond;+ int result, last_waiter;+ DWORD timeout_ms;++ // Avoid race conditions+ EnterCriticalSection( &cv->waiters_count_lock );+ cv->waiters_count ++;+ LeaveCriticalSection( &cv->waiters_count_lock );++ // It's ok to release the mutex here since Win32 manual-reset events+ // maintain state when used with SetEvent()+ LeaveCriticalSection( (CRITICAL_SECTION *) mutex );++ // Translate timeout into milliseconds+ if( timeout >= GLFW_INFINITY )+ {+ timeout_ms = INFINITE;+ }+ else+ {+ timeout_ms = (DWORD) (1000.0 * timeout + 0.5);+ if( timeout_ms <= 0 )+ {+ timeout_ms = 1;+ }+ }++ // Wait for either event to become signaled due to glfwSignalCond or+ // glfwBroadcastCond being called+ result = WaitForMultipleObjects( 2, cv->events, FALSE, timeout_ms );++ // Check if we are the last waiter+ EnterCriticalSection( &cv->waiters_count_lock );+ cv->waiters_count --;+ last_waiter = (result == WAIT_OBJECT_0 + _GLFW_COND_BROADCAST) &&+ (cv->waiters_count == 0);+ LeaveCriticalSection( &cv->waiters_count_lock );++ // Some thread called glfwBroadcastCond+ if( last_waiter )+ {+ // We're the last waiter to be notified or to stop waiting, so+ // reset the manual event+ ResetEvent( cv->events[ _GLFW_COND_BROADCAST ] );+ }++ // Reacquire the mutex+ EnterCriticalSection( (CRITICAL_SECTION *) mutex );+}+++//========================================================================+// _glfwPlatformSignalCond() - Signal a condition to one waiting thread+//========================================================================++void _glfwPlatformSignalCond( GLFWcond cond )+{+ _GLFWcond *cv = (_GLFWcond *) cond;+ int have_waiters;++ // Avoid race conditions+ EnterCriticalSection( &cv->waiters_count_lock );+ have_waiters = cv->waiters_count > 0;+ LeaveCriticalSection( &cv->waiters_count_lock );++ if( have_waiters )+ {+ SetEvent( cv->events[ _GLFW_COND_SIGNAL ] );+ }+}+++//========================================================================+// _glfwPlatformBroadcastCond() - Broadcast a condition to all waiting+// threads+//========================================================================++void _glfwPlatformBroadcastCond( GLFWcond cond )+{+ _GLFWcond *cv = (_GLFWcond *) cond;+ int have_waiters;++ // Avoid race conditions+ EnterCriticalSection( &cv->waiters_count_lock );+ have_waiters = cv->waiters_count > 0;+ LeaveCriticalSection( &cv->waiters_count_lock );++ if( have_waiters )+ {+ SetEvent( cv->events[ _GLFW_COND_BROADCAST ] );+ }+}+++//========================================================================+// _glfwPlatformGetNumberOfProcessors() - Return the number of processors+// in the system.+//========================================================================++int _glfwPlatformGetNumberOfProcessors( void )+{+ SYSTEM_INFO si;++ // Get hardware system information+ GetSystemInfo( &si );++ return (int) si.dwNumberOfProcessors;+}
+ glfw/lib/win32/win32_time.c view
@@ -0,0 +1,146 @@+//========================================================================+// GLFW - An OpenGL framework+// File: win32_time.c+// Platform: Windows+// API version: 2.6+// WWW: http://glfw.sourceforge.net+//------------------------------------------------------------------------+// Copyright (c) 2002-2006 Camilla Berglund+//+// This software is provided 'as-is', without any express or implied+// warranty. In no event will the authors be held liable for any damages+// arising from the use of this software.+//+// Permission is granted to anyone to use this software for any purpose,+// including commercial applications, and to alter it and redistribute it+// freely, subject to the following restrictions:+//+// 1. The origin of this software must not be misrepresented; you must not+// claim that you wrote the original software. If you use this software+// in a product, an acknowledgment in the product documentation would+// be appreciated but is not required.+//+// 2. Altered source versions must be plainly marked as such, and must not+// be misrepresented as being the original software.+//+// 3. This notice may not be removed or altered from any source+// distribution.+//+//========================================================================++#include "internal.h"+++//************************************************************************+//**** GLFW internal functions ****+//************************************************************************++//========================================================================+// _glfwInitTimer() - Initialise timer+//========================================================================++void _glfwInitTimer( void )+{+ __int64 freq;++ // Check if we have a performance counter+ if( QueryPerformanceFrequency( (LARGE_INTEGER *)&freq ) )+ {+ // Performance counter is available => use it!+ _glfwLibrary.Timer.HasPerformanceCounter = GL_TRUE;++ // Counter resolution is 1 / counter frequency+ _glfwLibrary.Timer.Resolution = 1.0 / (double)freq;++ // Set start time for timer+ QueryPerformanceCounter( (LARGE_INTEGER *)&_glfwLibrary.Timer.t0_64 );+ }+ else+ {+ // No performace counter available => use the tick counter+ _glfwLibrary.Timer.HasPerformanceCounter = GL_FALSE;++ // Counter resolution is 1 ms+ _glfwLibrary.Timer.Resolution = 0.001;++ // Set start time for timer+ _glfwLibrary.Timer.t0_32 = _glfw_timeGetTime();+ }+}+++//************************************************************************+//**** Platform implementation functions ****+//************************************************************************++//========================================================================+// Return timer value in seconds+//========================================================================++double _glfwPlatformGetTime( void )+{+ double t;+ __int64 t_64;++ if( _glfwLibrary.Timer.HasPerformanceCounter )+ {+ QueryPerformanceCounter( (LARGE_INTEGER *)&t_64 );+ t = (double)(t_64 - _glfwLibrary.Timer.t0_64);+ }+ else+ {+ t = (double)(_glfw_timeGetTime() - _glfwLibrary.Timer.t0_32);+ }++ // Calculate the current time in seconds+ return t * _glfwLibrary.Timer.Resolution;+}+++//========================================================================+// Set timer value in seconds+//========================================================================++void _glfwPlatformSetTime( double t )+{+ __int64 t_64;++ if( _glfwLibrary.Timer.HasPerformanceCounter )+ {+ QueryPerformanceCounter( (LARGE_INTEGER *)&t_64 );+ _glfwLibrary.Timer.t0_64 = t_64 - (__int64)(t/_glfwLibrary.Timer.Resolution);+ }+ else+ {+ _glfwLibrary.Timer.t0_32 = _glfw_timeGetTime() - (int)(t*1000.0);+ }+}+++//========================================================================+// Put a thread to sleep for a specified amount of time+//========================================================================++void _glfwPlatformSleep( double time )+{+ DWORD t;++ if( time == 0.0 )+ {+ t = 0;+ }+ else if( time < 0.001 )+ {+ t = 1;+ }+ else if( time > 2147483647.0 )+ {+ t = 2147483647;+ }+ else+ {+ t = (DWORD)(time*1000.0 + 0.5);+ }+ Sleep( t );+}+
+ glfw/lib/win32/win32_window.c view
@@ -0,0 +1,1714 @@+//========================================================================+// GLFW - An OpenGL framework+// File: win32_window.c+// Platform: Windows+// API version: 2.6+// WWW: http://glfw.sourceforge.net+//------------------------------------------------------------------------+// Copyright (c) 2002-2006 Camilla Berglund+//+// This software is provided 'as-is', without any express or implied+// warranty. In no event will the authors be held liable for any damages+// arising from the use of this software.+//+// Permission is granted to anyone to use this software for any purpose,+// including commercial applications, and to alter it and redistribute it+// freely, subject to the following restrictions:+//+// 1. The origin of this software must not be misrepresented; you must not+// claim that you wrote the original software. If you use this software+// in a product, an acknowledgment in the product documentation would+// be appreciated but is not required.+//+// 2. Altered source versions must be plainly marked as such, and must not+// be misrepresented as being the original software.+//+// 3. This notice may not be removed or altered from any source+// distribution.+//+//========================================================================++#include "internal.h"++++//************************************************************************+//**** GLFW internal functions ****+//************************************************************************++#define _GLFW_WNDCLASSNAME "GLFW26"+++//========================================================================+// Enable/disable minimize/restore animations+//========================================================================++static int _glfwMinMaxAnimations( int enable )+{+ ANIMATIONINFO AI;+ int old_enable;++ // Get old animation setting+ AI.cbSize = sizeof( ANIMATIONINFO );+ SystemParametersInfo( SPI_GETANIMATION, AI.cbSize, &AI, 0 );+ old_enable = AI.iMinAnimate;++ // If requested, change setting+ if( old_enable != enable )+ {+ AI.iMinAnimate = enable;+ SystemParametersInfo( SPI_SETANIMATION, AI.cbSize, &AI,+ SPIF_SENDCHANGE );+ }++ return old_enable;+}+++//========================================================================+// Function for bringing a window into focus and placing it on top of the+// window z stack. Due to some nastiness with how Win98/ME/2k/XP handles+// SetForegroundWindow, we have to go through some really bizarre measures to+// achieve this (thanks again, MS, for making life so much easier)!+//========================================================================++static void _glfwSetForegroundWindow( HWND hWnd )+{+ int try_count = 0;+ int old_animate;++ // Try the standard approach first...+ BringWindowToTop( hWnd );+ SetForegroundWindow( hWnd );++ // If it worked, return now+ if( hWnd == GetForegroundWindow() )+ {+ // Try to modify the system settings (since this is the foreground+ // process, we are allowed to do this)+ SystemParametersInfo( SPI_SETFOREGROUNDLOCKTIMEOUT, 0, (LPVOID)0,+ SPIF_SENDCHANGE );+ return;+ }++ // For other Windows versions than 95 & NT4.0, the standard approach+ // may not work, so if we failed we have to "trick" Windows into+ // making our window the foureground window: Iconify and restore+ // again. It is ugly, but it seems to work (we turn off those annoying+ // zoom animations to make it look a bit better at least).++ // Turn off minimize/restore animations+ old_animate = _glfwMinMaxAnimations( 0 );++ // We try this a few times, just to be on the safe side of things...+ do+ {+ // Iconify & restore+ ShowWindow( hWnd, SW_HIDE );+ ShowWindow( hWnd, SW_SHOWMINIMIZED );+ ShowWindow( hWnd, SW_SHOWNORMAL );++ // Try to get focus+ BringWindowToTop( hWnd );+ SetForegroundWindow( hWnd );++ // We do not want to keep going on forever, so we keep track of+ // how many times we tried+ try_count ++;+ }+ while( hWnd != GetForegroundWindow() && try_count <= 3 );++ // Restore the system minimize/restore animation setting+ (void) _glfwMinMaxAnimations( old_animate );++ // Try to modify the system settings (since this is now hopefully the+ // foreground process, we are probably allowed to do this)+ SystemParametersInfo( SPI_SETFOREGROUNDLOCKTIMEOUT, 0, (LPVOID)0,+ SPIF_SENDCHANGE );+}+++//========================================================================+// Sets the device context pixel format using a PFD+//========================================================================++static int _glfwSetPixelFormatPFD( int redbits, int greenbits, int bluebits,+ int alphabits, int depthbits, int stencilbits,+ int mode, _GLFWhints* hints )+{+ int PixelFormat;+ PIXELFORMATDESCRIPTOR pfd;++ // Set required pixel format+ pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR);+ pfd.nVersion = 1;+ pfd.dwFlags = PFD_DRAW_TO_WINDOW | // Draw to window+ PFD_SUPPORT_OPENGL | // Support OpenGL+ PFD_DOUBLEBUFFER; // Double buffered window+ pfd.iPixelType = PFD_TYPE_RGBA; // Request an RGBA format+ pfd.cColorBits = (BYTE) (redbits ++ greenbits ++ bluebits); // Color bits (ex. alpha)+ pfd.cRedBits = (BYTE) redbits; // Red bits+ pfd.cRedShift = 0; // Red shift ignored+ pfd.cGreenBits = (BYTE) greenbits; // Green bits+ pfd.cGreenShift = 0; // Green shift ignored+ pfd.cBlueBits = (BYTE) bluebits; // Blue bits+ pfd.cBlueShift = 0; // Blue shift ignored+ pfd.cAlphaBits = (BYTE) alphabits; // Alpha bits+ pfd.cAlphaShift = 0; // Alpha shift ignored+ pfd.cAccumBits = (BYTE) (hints->AccumRedBits ++ hints->AccumGreenBits ++ hints->AccumBlueBits ++ hints->AccumAlphaBits); // Accum. bits+ pfd.cAccumRedBits = (BYTE) hints->AccumRedBits; // Accum. red bits+ pfd.cAccumGreenBits = (BYTE) hints->AccumGreenBits; // Accum. green bits+ pfd.cAccumBlueBits = (BYTE) hints->AccumBlueBits; // Accum. blue bits+ pfd.cAccumAlphaBits = (BYTE) hints->AccumAlphaBits; // Accum. alpha bits+ pfd.cDepthBits = (BYTE) depthbits; // Depth buffer bits+ pfd.cStencilBits = (BYTE) stencilbits; // Stencil buffer bits+ pfd.cAuxBuffers = (BYTE) hints->AuxBuffers; // No. of aux buffers+ pfd.iLayerType = PFD_MAIN_PLANE; // Drawing layer: main+ pfd.bReserved = 0; // (reserved)+ pfd.dwLayerMask = 0; // Ignored+ pfd.dwVisibleMask = 0; // "+ pfd.dwDamageMask = 0; // "++ if( depthbits <= 0 )+ {+ // We do not need a depth buffer+ pfd.dwFlags |= PFD_DEPTH_DONTCARE;+ }++ if( hints->Stereo )+ {+ // Request a stereo mode+ pfd.dwFlags |= PFD_STEREO;+ }++ // Find a matching pixel format+ PixelFormat = _glfw_ChoosePixelFormat( _glfwWin.DC, &pfd );+ if( !PixelFormat )+ {+ return GL_FALSE;+ }++ // Get actual pixel format description+ if( !_glfw_DescribePixelFormat( _glfwWin.DC, PixelFormat, sizeof(pfd), &pfd ) )+ {+ return GL_FALSE;+ }++ // "stereo" is a strict requirement+ if( hints->Stereo && !(pfd.dwFlags & PFD_STEREO) )+ {+ return GL_FALSE;+ }++ // Set the pixel-format+ if( !_glfw_SetPixelFormat( _glfwWin.DC, PixelFormat, &pfd ) )+ {+ return GL_FALSE;+ }++ return GL_TRUE;+}+++//========================================================================+// Sets the device context pixel format using attributes+//========================================================================++#define _glfwSetWGLAttribute( _glfwName, _glfwValue ) \+ attribs[ count++ ] = _glfwName; \+ attribs[ count++ ] = _glfwValue;++static int _glfwSetPixelFormatAttrib( int redbits, int greenbits, int bluebits,+ int alphabits, int depthbits, int stencilbits,+ int mode, _GLFWhints* hints )+{+ int PixelFormat, dummy, count = 0;+ int attribs[128];+ PIXELFORMATDESCRIPTOR pfd;+ + int accumredbits = hints->AccumRedBits;+ int accumgreenbits = hints->AccumGreenBits;+ int accumbluebits = hints->AccumBlueBits;+ int accumalphabits = hints->AccumAlphaBits;++ _glfwSetWGLAttribute( WGL_DRAW_TO_WINDOW_ARB, GL_TRUE );+ _glfwSetWGLAttribute( WGL_ACCELERATION_ARB, WGL_FULL_ACCELERATION_ARB );+ _glfwSetWGLAttribute( WGL_SUPPORT_OPENGL_ARB, GL_TRUE );+ _glfwSetWGLAttribute( WGL_DOUBLE_BUFFER_ARB, GL_TRUE );+ _glfwSetWGLAttribute( WGL_COLOR_BITS_ARB, redbits + greenbits + bluebits );+ _glfwSetWGLAttribute( WGL_RED_BITS_ARB, redbits );+ _glfwSetWGLAttribute( WGL_GREEN_BITS_ARB, greenbits );+ _glfwSetWGLAttribute( WGL_BLUE_BITS_ARB, bluebits );+ _glfwSetWGLAttribute( WGL_ALPHA_BITS_ARB, alphabits );+ _glfwSetWGLAttribute( WGL_DEPTH_BITS_ARB, depthbits );+ _glfwSetWGLAttribute( WGL_STENCIL_BITS_ARB, stencilbits );+ _glfwSetWGLAttribute( WGL_AUX_BUFFERS_ARB, hints->AuxBuffers );+ + if( accumredbits || accumgreenbits || accumbluebits || accumalphabits )+ {+ _glfwSetWGLAttribute( WGL_ACCUM_BITS_ARB, accumredbits ++ accumgreenbits ++ accumbluebits ++ accumalphabits );++ _glfwSetWGLAttribute( WGL_ACCUM_RED_BITS_ARB, accumredbits );+ _glfwSetWGLAttribute( WGL_ACCUM_GREEN_BITS_ARB, accumgreenbits );+ _glfwSetWGLAttribute( WGL_ACCUM_BLUE_BITS_ARB, accumbluebits );+ _glfwSetWGLAttribute( WGL_ACCUM_ALPHA_BITS_ARB, accumalphabits );+ }++ if( hints->Stereo )+ {+ _glfwSetWGLAttribute( WGL_STEREO_ARB, GL_TRUE );+ }++ if( hints->Samples > 0 )+ {+ _glfwSetWGLAttribute( WGL_SAMPLE_BUFFERS_ARB, 1 );+ _glfwSetWGLAttribute( WGL_SAMPLES_ARB, hints->Samples );+ }++ _glfwSetWGLAttribute( 0, 0 );++ if( !_glfwWin.ChoosePixelFormat( _glfwWin.DC, attribs, NULL, 1, &PixelFormat, &dummy ) )+ {+ return GL_FALSE;+ }++ if( !_glfw_DescribePixelFormat( _glfwWin.DC, PixelFormat, sizeof(pfd), &pfd ) )+ {+ return GL_FALSE;+ }++ // Set the pixel-format+ if( !_glfw_SetPixelFormat( _glfwWin.DC, PixelFormat, &pfd ) )+ {+ return GL_FALSE;+ }++ return GL_TRUE; +}++#undef _glfwSetWGLAttribute+++//========================================================================+// Translates a Windows key to the corresponding GLFW key+//========================================================================++static int _glfwTranslateKey( WPARAM wParam, LPARAM lParam )+{+ MSG next_msg;+ DWORD msg_time;+ DWORD scan_code;++ // Check which key was pressed or released+ switch( wParam )+ {+ // The SHIFT keys require special handling+ case VK_SHIFT:+ // Compare scan code for this key with that of VK_RSHIFT in+ // order to determine which shift key was pressed (left or+ // right)+ scan_code = MapVirtualKey( VK_RSHIFT, 0 );+ if( ((lParam & 0x01ff0000) >> 16) == scan_code )+ {+ return GLFW_KEY_RSHIFT;+ }+ return GLFW_KEY_LSHIFT;++ // The CTRL keys require special handling+ case VK_CONTROL:+ // Is this an extended key (i.e. right key)?+ if( lParam & 0x01000000 )+ {+ return GLFW_KEY_RCTRL;+ }+ // Here is a trick: "Alt Gr" sends LCTRL, then RALT. We only+ // want the RALT message, so we try to see if the next message+ // is a RALT message. In that case, this is a false LCTRL!+ msg_time = GetMessageTime();+ if( PeekMessage( &next_msg, NULL, 0, 0, PM_NOREMOVE ) )+ {+ if( next_msg.message == WM_KEYDOWN ||+ next_msg.message == WM_SYSKEYDOWN )+ {+ if( next_msg.wParam == VK_MENU &&+ (next_msg.lParam & 0x01000000) &&+ next_msg.time == msg_time )+ {+ // Next message is a RALT down message, which+ // means that this is NOT a proper LCTRL message!+ return GLFW_KEY_UNKNOWN;+ }+ }+ }+ return GLFW_KEY_LCTRL;++ // The ALT keys require special handling+ case VK_MENU:+ // Is this an extended key (i.e. right key)?+ if( lParam & 0x01000000 )+ {+ return GLFW_KEY_RALT;+ }+ return GLFW_KEY_LALT;++ // The ENTER keys require special handling+ case VK_RETURN:+ // Is this an extended key (i.e. right key)?+ if( lParam & 0x01000000 )+ {+ return GLFW_KEY_KP_ENTER;+ }+ return GLFW_KEY_ENTER;++ // Special keys (non character keys)+ case VK_ESCAPE: return GLFW_KEY_ESC;+ case VK_TAB: return GLFW_KEY_TAB;+ case VK_BACK: return GLFW_KEY_BACKSPACE;+ case VK_HOME: return GLFW_KEY_HOME;+ case VK_END: return GLFW_KEY_END;+ case VK_PRIOR: return GLFW_KEY_PAGEUP;+ case VK_NEXT: return GLFW_KEY_PAGEDOWN;+ case VK_INSERT: return GLFW_KEY_INSERT;+ case VK_DELETE: return GLFW_KEY_DEL;+ case VK_LEFT: return GLFW_KEY_LEFT;+ case VK_UP: return GLFW_KEY_UP;+ case VK_RIGHT: return GLFW_KEY_RIGHT;+ case VK_DOWN: return GLFW_KEY_DOWN;+ case VK_F1: return GLFW_KEY_F1;+ case VK_F2: return GLFW_KEY_F2;+ case VK_F3: return GLFW_KEY_F3;+ case VK_F4: return GLFW_KEY_F4;+ case VK_F5: return GLFW_KEY_F5;+ case VK_F6: return GLFW_KEY_F6;+ case VK_F7: return GLFW_KEY_F7;+ case VK_F8: return GLFW_KEY_F8;+ case VK_F9: return GLFW_KEY_F9;+ case VK_F10: return GLFW_KEY_F10;+ case VK_F11: return GLFW_KEY_F11;+ case VK_F12: return GLFW_KEY_F12;+ case VK_F13: return GLFW_KEY_F13;+ case VK_F14: return GLFW_KEY_F14;+ case VK_F15: return GLFW_KEY_F15;+ case VK_F16: return GLFW_KEY_F16;+ case VK_F17: return GLFW_KEY_F17;+ case VK_F18: return GLFW_KEY_F18;+ case VK_F19: return GLFW_KEY_F19;+ case VK_F20: return GLFW_KEY_F20;+ case VK_F21: return GLFW_KEY_F21;+ case VK_F22: return GLFW_KEY_F22;+ case VK_F23: return GLFW_KEY_F23;+ case VK_F24: return GLFW_KEY_F24;+ case VK_SPACE: return GLFW_KEY_SPACE;++ // Numeric keypad+ case VK_NUMPAD0: return GLFW_KEY_KP_0;+ case VK_NUMPAD1: return GLFW_KEY_KP_1;+ case VK_NUMPAD2: return GLFW_KEY_KP_2;+ case VK_NUMPAD3: return GLFW_KEY_KP_3;+ case VK_NUMPAD4: return GLFW_KEY_KP_4;+ case VK_NUMPAD5: return GLFW_KEY_KP_5;+ case VK_NUMPAD6: return GLFW_KEY_KP_6;+ case VK_NUMPAD7: return GLFW_KEY_KP_7;+ case VK_NUMPAD8: return GLFW_KEY_KP_8;+ case VK_NUMPAD9: return GLFW_KEY_KP_9;+ case VK_DIVIDE: return GLFW_KEY_KP_DIVIDE;+ case VK_MULTIPLY: return GLFW_KEY_KP_MULTIPLY;+ case VK_SUBTRACT: return GLFW_KEY_KP_SUBTRACT;+ case VK_ADD: return GLFW_KEY_KP_ADD;+ case VK_DECIMAL: return GLFW_KEY_KP_DECIMAL;++ // The rest (should be printable keys)+ default:+ // Convert to printable character (ISO-8859-1 or Unicode)+ wParam = MapVirtualKey( (UINT) wParam, 2 ) & 0x0000FFFF;++ // Make sure that the character is uppercase+ if( _glfwLibrary.Sys.HasUnicode )+ {+ wParam = (WPARAM) CharUpperW( (LPWSTR) wParam );+ }+ else+ {+ wParam = (WPARAM) CharUpperA( (LPSTR) wParam );+ }++ // Valid ISO-8859-1 character?+ if( (wParam >= 32 && wParam <= 126) ||+ (wParam >= 160 && wParam <= 255) )+ {+ return (int) wParam;+ }+ return GLFW_KEY_UNKNOWN;+ }+}+++//========================================================================+// Translates a windows key to Unicode+//========================================================================++static void _glfwTranslateChar( DWORD wParam, DWORD lParam, int action )+{+ BYTE keyboard_state[ 256 ];+ UCHAR char_buf[ 10 ];+ WCHAR unicode_buf[ 10 ];+ UINT scan_code;+ int i, num_chars, unicode;++ // Get keyboard state+ GetKeyboardState( keyboard_state );++ // Derive scan code from lParam and action+ scan_code = (lParam & 0x01ff0000) >> 16;+ if( action == GLFW_RELEASE )+ {+ scan_code |= 0x8000000;+ }++ // Do we have Unicode support?+ if( _glfwLibrary.Sys.HasUnicode )+ {+ // Convert to Unicode+ num_chars = ToUnicode(+ wParam, // virtual-key code+ scan_code, // scan code+ keyboard_state, // key-state array+ unicode_buf, // buffer for translated key+ 10, // size of translated key buffer+ 0 // active-menu flag+ );+ unicode = 1;+ }+ else+ {+ // Convert to ISO-8859-1+ num_chars = ToAscii(+ wParam, // virtual-key code+ scan_code, // scan code+ keyboard_state, // key-state array+ (LPWORD) char_buf, // buffer for translated key+ 0 // active-menu flag+ );+ unicode = 0;+ }++ // Report characters+ for( i = 0; i < num_chars; i++ )+ {+ // Get next character from buffer+ if( unicode )+ {+ _glfwInputChar( (int) unicode_buf[ i ], action );+ }+ else+ {+ _glfwInputChar( (int) char_buf[ i ], action );+ }+ }+}+++//========================================================================+// Window callback function (handles window events)+//========================================================================++static LRESULT CALLBACK _glfwWindowCallback( HWND hWnd, UINT uMsg,+ WPARAM wParam, LPARAM lParam )+{+ int WheelDelta, Iconified;++ // Handle certain window messages+ switch( uMsg )+ {+ // Window activate message? (iconification?)+ case WM_ACTIVATE:+ {+ _glfwWin.Active = LOWORD(wParam) != WA_INACTIVE ? GL_TRUE : GL_FALSE;++ Iconified = HIWORD(wParam) ? GL_TRUE : GL_FALSE;++ // Were we deactivated/iconified?+ if( (!_glfwWin.Active || Iconified) && !_glfwWin.Iconified )+ {+ _glfwInputDeactivation();++ // If we are in fullscreen mode we need to iconify+ if( _glfwWin.Opened && _glfwWin.Fullscreen )+ {+ // Do we need to manually iconify?+ if( !Iconified )+ {+ // Minimize window+ CloseWindow( _glfwWin.Wnd );++ // The window is now iconified+ Iconified = GL_TRUE;+ }++ // Change display settings to the desktop resolution+ ChangeDisplaySettings( NULL, CDS_FULLSCREEN );+ }++ // Unlock mouse+ if( !_glfwWin.OldMouseLockValid )+ {+ _glfwWin.OldMouseLock = _glfwWin.MouseLock;+ _glfwWin.OldMouseLockValid = GL_TRUE;+ glfwEnable( GLFW_MOUSE_CURSOR );+ }+ }+ else if( _glfwWin.Active || !Iconified )+ {+ // If we are in fullscreen mode we need to maximize+ if( _glfwWin.Opened && _glfwWin.Fullscreen && _glfwWin.Iconified )+ {+ // Change display settings to the user selected mode+ _glfwSetVideoModeMODE( _glfwWin.ModeID );++ // Do we need to manually restore window?+ if( Iconified )+ {+ // Restore window+ OpenIcon( _glfwWin.Wnd );++ // The window is no longer iconified+ Iconified = GL_FALSE;++ // Activate window+ ShowWindow( hWnd, SW_SHOW );+ _glfwSetForegroundWindow( _glfwWin.Wnd );+ SetFocus( _glfwWin.Wnd );+ }+ }++ // Lock mouse, if necessary+ if( _glfwWin.OldMouseLockValid && _glfwWin.OldMouseLock )+ {+ glfwDisable( GLFW_MOUSE_CURSOR );+ }+ _glfwWin.OldMouseLockValid = GL_FALSE;+ }++ _glfwWin.Iconified = Iconified;+ return 0;+ }++ // Intercept system commands (forbid certain actions/events)+ case WM_SYSCOMMAND:+ {+ switch( wParam )+ {+ // Screensaver trying to start or monitor trying to enter+ // powersave?+ case SC_SCREENSAVE:+ case SC_MONITORPOWER:+ if( _glfwWin.Fullscreen )+ {+ return 0;+ }+ else+ {+ break;+ }++ // User trying to access application menu using ALT?+ case SC_KEYMENU:+ return 0;+ }+ break;+ }++ // Did we receive a close message?+ case WM_CLOSE:+ PostQuitMessage( 0 );+ return 0;++ // Is a key being pressed?+ case WM_KEYDOWN:+ case WM_SYSKEYDOWN:+ {+ // Translate and report key press+ _glfwInputKey( _glfwTranslateKey( wParam, lParam ),+ GLFW_PRESS );++ // Translate and report character input+ if( _glfwWin.CharCallback )+ {+ _glfwTranslateChar( (DWORD) wParam, (DWORD) lParam, GLFW_PRESS );+ }+ return 0;+ } ++ // Is a key being released?+ case WM_KEYUP:+ case WM_SYSKEYUP:+ {+ // Special trick: release both shift keys on SHIFT up event+ if( wParam == VK_SHIFT )+ {+ _glfwInputKey( GLFW_KEY_LSHIFT, GLFW_RELEASE );+ _glfwInputKey( GLFW_KEY_RSHIFT, GLFW_RELEASE );+ }+ else+ {+ // Translate and report key release+ _glfwInputKey( _glfwTranslateKey( wParam, lParam ),+ GLFW_RELEASE );+ }++ // Translate and report character input+ if( _glfwWin.CharCallback )+ {+ _glfwTranslateChar( (DWORD) wParam, (DWORD) lParam, GLFW_RELEASE );+ }++ return 0;+ }++ // Were any of the mouse-buttons pressed?+ case WM_LBUTTONDOWN:+ SetCapture(hWnd);+ _glfwInputMouseClick( GLFW_MOUSE_BUTTON_LEFT, GLFW_PRESS );+ return 0;+ case WM_RBUTTONDOWN:+ SetCapture(hWnd);+ _glfwInputMouseClick( GLFW_MOUSE_BUTTON_RIGHT, GLFW_PRESS );+ return 0;+ case WM_MBUTTONDOWN:+ SetCapture(hWnd);+ _glfwInputMouseClick( GLFW_MOUSE_BUTTON_MIDDLE, GLFW_PRESS );+ return 0;+ case WM_XBUTTONDOWN:+ {+ if( HIWORD(wParam) == XBUTTON1 )+ {+ SetCapture(hWnd);+ _glfwInputMouseClick( GLFW_MOUSE_BUTTON_4, GLFW_PRESS );+ }+ else if( HIWORD(wParam) == XBUTTON2 )+ {+ SetCapture(hWnd);+ _glfwInputMouseClick( GLFW_MOUSE_BUTTON_5, GLFW_PRESS );+ }+ return 1;+ }++ // Were any of the mouse-buttons released?+ case WM_LBUTTONUP:+ ReleaseCapture();+ _glfwInputMouseClick( GLFW_MOUSE_BUTTON_LEFT, GLFW_RELEASE );+ return 0;+ case WM_RBUTTONUP:+ ReleaseCapture();+ _glfwInputMouseClick( GLFW_MOUSE_BUTTON_RIGHT, GLFW_RELEASE );+ return 0;+ case WM_MBUTTONUP:+ ReleaseCapture();+ _glfwInputMouseClick( GLFW_MOUSE_BUTTON_MIDDLE, GLFW_RELEASE );+ return 0;+ case WM_XBUTTONUP:+ {+ if( HIWORD(wParam) == XBUTTON1 )+ {+ ReleaseCapture();+ _glfwInputMouseClick( GLFW_MOUSE_BUTTON_4, GLFW_RELEASE );+ }+ else if( HIWORD(wParam) == XBUTTON2 )+ {+ ReleaseCapture();+ _glfwInputMouseClick( GLFW_MOUSE_BUTTON_5, GLFW_RELEASE );+ }+ return 1;+ }++ // Did the mouse move?+ case WM_MOUSEMOVE:+ {+ {+ int NewMouseX, NewMouseY;++ // Get signed (!) mouse position+ NewMouseX = (int)((short)LOWORD(lParam));+ NewMouseY = (int)((short)HIWORD(lParam));++ if( NewMouseX != _glfwInput.OldMouseX ||+ NewMouseY != _glfwInput.OldMouseY )+ {+ if( _glfwWin.MouseLock )+ {+ _glfwInput.MousePosX += NewMouseX -+ _glfwInput.OldMouseX;+ _glfwInput.MousePosY += NewMouseY -+ _glfwInput.OldMouseY;+ }+ else+ {+ _glfwInput.MousePosX = NewMouseX;+ _glfwInput.MousePosY = NewMouseY;+ }+ _glfwInput.OldMouseX = NewMouseX;+ _glfwInput.OldMouseY = NewMouseY;+ _glfwInput.MouseMoved = GL_TRUE;+ + // Call user callback function+ if( _glfwWin.MousePosCallback )+ {+ _glfwWin.MousePosCallback( _glfwInput.MousePosX,+ _glfwInput.MousePosY );+ }+ }+ }+ return 0;+ }++ // Mouse wheel action?+ case WM_MOUSEWHEEL:+ {+ // WM_MOUSEWHEEL is not supported under Windows 95+ if( _glfwLibrary.Sys.WinVer != _GLFW_WIN_95 )+ {+ WheelDelta = (((int)wParam) >> 16) / WHEEL_DELTA;+ _glfwInput.WheelPos += WheelDelta;+ if( _glfwWin.MouseWheelCallback )+ {+ _glfwWin.MouseWheelCallback( _glfwInput.WheelPos );+ }+ return 0;+ }+ break;+ }++ // Resize the window?+ case WM_SIZE:+ {+ // get the new size+ _glfwWin.Width = LOWORD(lParam);+ _glfwWin.Height = HIWORD(lParam);++ // If the mouse is locked, update the clipping rect+ if( _glfwWin.MouseLock )+ {+ RECT ClipWindowRect;+ if( GetWindowRect( _glfwWin.Wnd, &ClipWindowRect ) )+ {+ ClipCursor( &ClipWindowRect );+ }+ }++ // Call the user-supplied callback, if it exists+ if( _glfwWin.WindowSizeCallback )+ {+ _glfwWin.WindowSizeCallback( LOWORD(lParam),+ HIWORD(lParam) );+ }+ return 0;+ }++ // Move the window?+ case WM_MOVE:+ {+ // If the mouse is locked, update the clipping rect+ if( _glfwWin.MouseLock )+ {+ RECT ClipWindowRect;+ if( GetWindowRect( _glfwWin.Wnd, &ClipWindowRect ) )+ {+ ClipCursor( &ClipWindowRect );+ }+ }+ return 0;+ }++ // Was the window contents damaged?+ case WM_PAINT:+ {+ // Call user callback function+ if( _glfwWin.WindowRefreshCallback )+ {+ _glfwWin.WindowRefreshCallback();+ }+ break;+ }++ case WM_DISPLAYCHANGE:+ {+ // TODO: Do stuff here.++ break;+ }+ }++ // Pass all unhandled messages to DefWindowProc+ return DefWindowProc( hWnd, uMsg, wParam, lParam );+}+++//========================================================================+// Translate client window size to full window size (including window borders)+//========================================================================++static void _glfwGetFullWindowSize( int w, int h, int *w2, int *h2 )+{+ RECT rect;++ // Create a window rectangle+ rect.left = (long)0;+ rect.right = (long)w-1;+ rect.top = (long)0;+ rect.bottom = (long)h-1;++ // Adjust according to window styles+ AdjustWindowRectEx( &rect, _glfwWin.dwStyle, FALSE,+ _glfwWin.dwExStyle );++ // Calculate width and height of full window+ *w2 = rect.right-rect.left+1;+ *h2 = rect.bottom-rect.top+1;+}+++//========================================================================+// Initialize WGL-specific extensions+//========================================================================++static void _glfwInitWGLExtensions( void )+{+ GLubyte *extensions;+ int has_swap_control, has_pixel_format;++ _glfwWin.GetExtensionsStringEXT = (WGLGETEXTENSIONSSTRINGEXT_T)+ wglGetProcAddress( "wglGetExtensionsStringEXT" );+ if( !_glfwWin.GetExtensionsStringEXT )+ {+ // Try wglGetExtensionsStringARB+ _glfwWin.GetExtensionsStringARB = (WGLGETEXTENSIONSSTRINGARB_T)+ wglGetProcAddress( "wglGetExtensionsStringARB" );+ if( !_glfwWin.GetExtensionsStringARB )+ {+ return;+ }+ }++ // Initialize OpenGL extension: WGL_EXT_swap_control+ has_swap_control = GL_FALSE;+ has_pixel_format = GL_FALSE;+ extensions = (GLubyte *) glGetString( GL_EXTENSIONS );++ if( extensions != NULL )+ {+ has_swap_control = _glfwStringInExtensionString(+ "WGL_EXT_swap_control",+ extensions+ );+ has_pixel_format = _glfwStringInExtensionString(+ "WGL_ARB_pixel_format",+ extensions+ );+ }++ if( !has_swap_control )+ {+ has_swap_control = _glfwPlatformExtensionSupported(+ "WGL_EXT_swap_control"+ );+ }++ if( !has_pixel_format )+ {+ has_pixel_format = _glfwPlatformExtensionSupported(+ "WGL_ARB_pixel_format"+ );+ }++ if( has_swap_control )+ {+ _glfwWin.SwapInterval = (WGLSWAPINTERVALEXT_T)+ wglGetProcAddress( "wglSwapIntervalEXT" );+ }+ else+ {+ _glfwWin.SwapInterval = NULL;+ }+ + if( has_pixel_format )+ {+ _glfwWin.ChoosePixelFormat = (WGLCHOOSEPIXELFORMATARB_T)+ wglGetProcAddress( "wglChoosePixelFormatARB" );+ _glfwWin.GetPixelFormatAttribiv = (WGLGETPIXELFORMATATTRIBIVARB_T)+ wglGetProcAddress( "wglGetPixelFormatAttribivARB" );+ }+ else+ {+ _glfwWin.ChoosePixelFormat = NULL;+ _glfwWin.GetPixelFormatAttribiv = NULL;+ } +}+++//========================================================================+// Creates the GLFW window and rendering context+//========================================================================++static int _glfwCreateWindow( int redbits, int greenbits, int bluebits,+ int alphabits, int depthbits, int stencilbits,+ int mode, _GLFWhints* hints )+{+ int full_width, full_height;+ RECT wa;+ POINT pos;++ _glfwWin.DC = NULL;+ _glfwWin.RC = NULL;+ _glfwWin.Wnd = NULL;++ // Set window size to true requested size (adjust for window borders)+ _glfwGetFullWindowSize( _glfwWin.Width, _glfwWin.Height, &full_width,+ &full_height );++ // Adjust window position to working area (e.g. if the task bar is at+ // the top of the display). Fullscreen windows are always opened in+ // the upper left corner regardless of the desktop working area. + if( _glfwWin.Fullscreen )+ {+ wa.left = wa.top = 0;+ }+ else+ {+ SystemParametersInfo( SPI_GETWORKAREA, 0, &wa, 0 );+ }++ // Create window+ _glfwWin.Wnd = CreateWindowEx(+ _glfwWin.dwExStyle, // Extended style+ _GLFW_WNDCLASSNAME, // Class name+ "GLFW Window", // Window title+ _glfwWin.dwStyle, // Defined window style+ wa.left, wa.top, // Window position+ full_width, // Decorated window width+ full_height, // Decorated window height+ NULL, // No parent window+ NULL, // No menu+ _glfwLibrary.Instance, // Instance+ NULL ); // Nothing to WM_CREATE++ if( !_glfwWin.Wnd )+ {+ return GL_FALSE;+ }++ // Get a device context+ _glfwWin.DC = GetDC( _glfwWin.Wnd );+ if( !_glfwWin.DC )+ {+ return GL_FALSE;+ }++ if( _glfwWin.ChoosePixelFormat )+ {+ if( !_glfwSetPixelFormatAttrib( redbits, greenbits, bluebits, alphabits,+ depthbits, stencilbits, mode, hints ) )+ {+ return GL_FALSE;+ }+ }+ else+ {+ if( !_glfwSetPixelFormatPFD( redbits, greenbits, bluebits, alphabits,+ depthbits, stencilbits, mode, hints ) )+ {+ return GL_FALSE;+ }+ }++ // Get a rendering context+ _glfwWin.RC = wglCreateContext( _glfwWin.DC );+ if( !_glfwWin.RC )+ {+ return GL_FALSE;+ }++ // Activate the OpenGL rendering context+ if( !wglMakeCurrent( _glfwWin.DC, _glfwWin.RC ) )+ {+ return GL_FALSE;+ }++ // Initialize WGL-specific OpenGL extensions+ _glfwInitWGLExtensions();++ // Initialize mouse position+ GetCursorPos( &pos );+ ScreenToClient( _glfwWin.Wnd, &pos );+ _glfwInput.OldMouseX = _glfwInput.MousePosX = pos.x;+ _glfwInput.OldMouseY = _glfwInput.MousePosY = pos.y;++ return GL_TRUE;+}+++//========================================================================+// Destroys the GLFW window and rendering context+//========================================================================++static void _glfwDestroyWindow( void )+{+ // Do we have a rendering context?+ if( _glfwWin.RC )+ {+ // Release the DC and RC contexts+ wglMakeCurrent( NULL, NULL );++ // Delete the rendering context+ wglDeleteContext( _glfwWin.RC );+ _glfwWin.RC = NULL;+ }++ // Do we have a device context?+ if( _glfwWin.DC )+ {+ // Release the device context+ ReleaseDC( _glfwWin.Wnd, _glfwWin.DC );+ _glfwWin.DC = NULL;+ }++ // Do we have a window?+ if( _glfwWin.Wnd )+ {+ // Destroy the window+ if( _glfwLibrary.Sys.WinVer <= _GLFW_WIN_NT4 )+ {+ // Note: Hiding the window first fixes an annoying W98/NT4+ // remaining icon bug for fullscreen displays+ ShowWindow( _glfwWin.Wnd, SW_HIDE );+ }++ DestroyWindow( _glfwWin.Wnd );+ _glfwWin.Wnd = NULL;+ }+}++++//************************************************************************+//**** Platform implementation functions ****+//************************************************************************++//========================================================================+// Here is where the window is created, and the OpenGL rendering context is+// created+//========================================================================++int _glfwPlatformOpenWindow( int width, int height,+ int redbits, int greenbits, int bluebits,+ int alphabits, int depthbits, int stencilbits,+ int mode, _GLFWhints* hints )+{+ WNDCLASS wc;+ DWORD dwStyle, dwExStyle;++ // Clear platform specific GLFW window state+ _glfwWin.ClassAtom = 0;+ _glfwWin.OldMouseLockValid = GL_FALSE;+ _glfwWin.ChoosePixelFormat = NULL;+ _glfwWin.GetPixelFormatAttribiv = NULL;++ // Remember desired refresh rate for this window (used only in+ // fullscreen mode)+ _glfwWin.DesiredRefreshRate = hints->RefreshRate;++ // Set window class parameters+ wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; // Redraw on...+ wc.lpfnWndProc = (WNDPROC)_glfwWindowCallback; // Message handler+ wc.cbClsExtra = 0; // No extra class data+ wc.cbWndExtra = 0; // No extra window data+ wc.hInstance = _glfwLibrary.Instance; // Set instance+ wc.hCursor = LoadCursor( NULL, IDC_ARROW ); // Load arrow pointer+ wc.hbrBackground = NULL; // No background+ wc.lpszMenuName = NULL; // No menu+ wc.lpszClassName = _GLFW_WNDCLASSNAME; // Set class name++ // Load user-provided icon if available+ wc.hIcon = LoadIcon( _glfwLibrary.Instance, "GLFW_ICON" );+ if( !wc.hIcon )+ {+ // Load default icon+ wc.hIcon = LoadIcon( NULL, IDI_WINLOGO ); + }++ // Register the window class+ _glfwWin.ClassAtom = RegisterClass( &wc );+ if( !_glfwWin.ClassAtom )+ {+ _glfwPlatformCloseWindow();+ return GL_FALSE;+ }++ // Do we want full-screen mode?+ if( _glfwWin.Fullscreen )+ {+ _glfwSetVideoMode( &_glfwWin.Width, &_glfwWin.Height,+ redbits, greenbits, bluebits,+ hints->RefreshRate );+ }++ // Set common window styles+ dwStyle = WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_VISIBLE;+ dwExStyle = WS_EX_APPWINDOW;++ // Set window style, depending on fullscreen mode+ if( _glfwWin.Fullscreen )+ {+ dwStyle |= WS_POPUP;++ // Here's a trick for helping us getting window focus+ // (SetForegroundWindow doesn't work properly under+ // Win98/ME/2K/.NET/+)+ /*+ if( _glfwLibrary.Sys.WinVer != _GLFW_WIN_95 &&+ _glfwLibrary.Sys.WinVer != _GLFW_WIN_NT4 && + _glfwLibrary.Sys.WinVer != _GLFW_WIN_XP )+ {+ dwStyle |= WS_MINIMIZE;+ }+ */+ }+ else+ {+ dwStyle |= WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX;++ if( !hints->WindowNoResize )+ {+ dwStyle |= ( WS_MAXIMIZEBOX | WS_SIZEBOX );+ dwExStyle |= WS_EX_WINDOWEDGE;+ }+ }++ // Remember window styles (used by _glfwGetFullWindowSize)+ _glfwWin.dwStyle = dwStyle;+ _glfwWin.dwExStyle = dwExStyle;++ if( !_glfwCreateWindow( redbits, greenbits, bluebits, alphabits,+ depthbits, stencilbits, mode, hints ) )+ {+ _glfwPlatformCloseWindow();+ return GL_FALSE;+ }++ if( _glfwWin.ChoosePixelFormat && hints->Samples > 0 )+ {+ // Iteratively try to create a context with a decreasing number of+ // FSAA samples (requires window recreation).++ for (;;)+ {+ _glfwDestroyWindow();++ if( _glfwCreateWindow( redbits, greenbits, bluebits, alphabits,+ depthbits, stencilbits, mode, hints ) )+ {+ break;+ }++ if( hints->Samples > 0 )+ {+ hints->Samples--;+ }+ else+ {+ _glfwPlatformCloseWindow();+ return GL_FALSE;+ }+ }+ }++ // Make sure that our window ends up on top of things+ if( _glfwWin.Fullscreen )+ {+ // Place the window above all topmost windows+ SetWindowPos( _glfwWin.Wnd, HWND_TOPMOST, 0,0,0,0,+ SWP_NOMOVE | SWP_NOSIZE );+ }+ _glfwSetForegroundWindow( _glfwWin.Wnd );+ SetFocus( _glfwWin.Wnd );++ // Start by clearing the front buffer to black (avoid ugly desktop+ // remains in our OpenGL window)+ glClear( GL_COLOR_BUFFER_BIT );+ _glfw_SwapBuffers( _glfwWin.DC );++ return GL_TRUE;+}+++//========================================================================+// Properly kill the window / video display+//========================================================================++void _glfwPlatformCloseWindow( void )+{+ _glfwDestroyWindow();++ // Do we have an instance?+ if( _glfwWin.ClassAtom )+ {+ // Unregister class+ UnregisterClass( _GLFW_WNDCLASSNAME, _glfwLibrary.Instance );+ _glfwWin.ClassAtom = 0;+ }++ // Are we in fullscreen mode?+ if( _glfwWin.Fullscreen )+ {+ // Switch back to desktop resolution+ ChangeDisplaySettings( NULL, CDS_FULLSCREEN );+ }+}+++//========================================================================+// Set the window title+//========================================================================++void _glfwPlatformSetWindowTitle( const char *title )+{+ // Set window title+ (void) SetWindowText( _glfwWin.Wnd, title );+}+++//========================================================================+// Set the window size.+//========================================================================++void _glfwPlatformSetWindowSize( int width, int height )+{+ int bpp, mode = 0, refresh;+ int sizechanged = GL_FALSE;+ GLint drawbuffer;+ GLfloat clearcolor[4];++ // If we are in fullscreen mode, get some info about the current mode+ if( _glfwWin.Fullscreen )+ {+ DEVMODE dm;++ // Get current BPP settings+ dm.dmSize = sizeof( DEVMODE );+ if( EnumDisplaySettings( NULL, _glfwWin.ModeID, &dm ) )+ {+ // Get bpp+ bpp = dm.dmBitsPerPel;++ // Get closest match for target video mode+ refresh = _glfwWin.DesiredRefreshRate;+ mode = _glfwGetClosestVideoModeBPP( &width, &height, &bpp,+ &refresh );+ }+ else+ {+ mode = _glfwWin.ModeID;+ }+ }+ else+ {+ // If we are in windowed mode, adjust the window size to+ // compensate for window decorations+ _glfwGetFullWindowSize( width, height, &width, &height );+ }++ // Change window size before changing fullscreen mode?+ if( _glfwWin.Fullscreen && (width > _glfwWin.Width) )+ {+ SetWindowPos( _glfwWin.Wnd, HWND_TOP, 0, 0, width, height,+ SWP_NOOWNERZORDER | SWP_NOMOVE | SWP_NOZORDER );+ sizechanged = GL_TRUE;+ }++ // Change fullscreen video mode?+ if( _glfwWin.Fullscreen && mode != _glfwWin.ModeID )+ {+ // Change video mode+ _glfwSetVideoModeMODE( mode );++ // Clear the front buffer to black (avoid ugly desktop remains in+ // our OpenGL window)+ glGetIntegerv( GL_DRAW_BUFFER, &drawbuffer );+ glGetFloatv( GL_COLOR_CLEAR_VALUE, clearcolor );+ glClearColor( 0.0f, 0.0f, 0.0f, 0.0f );+ glClear( GL_COLOR_BUFFER_BIT );+ if( drawbuffer == GL_BACK )+ {+ _glfw_SwapBuffers( _glfwWin.DC );+ }+ glClearColor( clearcolor[0], clearcolor[1], clearcolor[2],+ clearcolor[3] );+ }++ // Set window size (if not already changed)+ if( !sizechanged )+ {+ SetWindowPos( _glfwWin.Wnd, HWND_TOP, 0, 0, width, height,+ SWP_NOOWNERZORDER | SWP_NOMOVE | SWP_NOZORDER );+ }+}+++//========================================================================+// Set the window position+//========================================================================++void _glfwPlatformSetWindowPos( int x, int y )+{+ // Set window position+ (void) SetWindowPos( _glfwWin.Wnd, HWND_TOP, x, y, 0, 0,+ SWP_NOOWNERZORDER | SWP_NOSIZE | SWP_NOZORDER );+}+++//========================================================================+// Window iconification+//========================================================================++void _glfwPlatformIconifyWindow( void )+{+ // Iconify window+ CloseWindow( _glfwWin.Wnd );++ // Window is now iconified+ _glfwWin.Iconified = GL_TRUE;++ // If we are in fullscreen mode we need to change video modes+ if( _glfwWin.Fullscreen )+ {+ // Change display settings to the desktop resolution+ ChangeDisplaySettings( NULL, CDS_FULLSCREEN );+ }++ // Unlock mouse+ if( !_glfwWin.OldMouseLockValid )+ {+ _glfwWin.OldMouseLock = _glfwWin.MouseLock;+ _glfwWin.OldMouseLockValid = GL_TRUE;+ glfwEnable( GLFW_MOUSE_CURSOR );+ }+}+++//========================================================================+// Window un-iconification+//========================================================================++void _glfwPlatformRestoreWindow( void )+{+ // If we are in fullscreen mode we need to change video modes+ if( _glfwWin.Fullscreen )+ {+ // Change display settings to the user selected mode+ _glfwSetVideoModeMODE( _glfwWin.ModeID );+ }++ // Un-iconify window+ OpenIcon( _glfwWin.Wnd );++ // Make sure that our window ends up on top of things+ ShowWindow( _glfwWin.Wnd, SW_SHOW );+ _glfwSetForegroundWindow( _glfwWin.Wnd );+ SetFocus( _glfwWin.Wnd );++ // Window is no longer iconified+ _glfwWin.Iconified = GL_FALSE;++ // Lock mouse, if necessary+ if( _glfwWin.OldMouseLockValid && _glfwWin.OldMouseLock )+ {+ glfwDisable( GLFW_MOUSE_CURSOR );+ }+ _glfwWin.OldMouseLockValid = GL_FALSE;+}+++//========================================================================+// Swap buffers (double-buffering)+//========================================================================++void _glfwPlatformSwapBuffers( void )+{+ _glfw_SwapBuffers( _glfwWin.DC );+}+++//========================================================================+// Set double buffering swap interval+//========================================================================++void _glfwPlatformSwapInterval( int interval )+{+ if( _glfwWin.SwapInterval )+ {+ _glfwWin.SwapInterval( interval );+ }+}+++//========================================================================+// Write back window parameters into GLFW window structure+//========================================================================++void _glfwPlatformRefreshWindowParams( void )+{+ PIXELFORMATDESCRIPTOR pfd;+ DEVMODE dm;+ int PixelFormat, mode;++ // Obtain a detailed description of current pixel format+ PixelFormat = _glfw_GetPixelFormat( _glfwWin.DC );++ if( !_glfwWin.GetPixelFormatAttribiv )+ {+ _glfw_DescribePixelFormat( _glfwWin.DC, PixelFormat,+ sizeof(PIXELFORMATDESCRIPTOR), &pfd );++ // Is current OpenGL context accelerated?+ _glfwWin.Accelerated = (pfd.dwFlags & PFD_GENERIC_ACCELERATED) ||+ !(pfd.dwFlags & PFD_GENERIC_FORMAT) ? 1 : 0;++ // "Standard" window parameters+ _glfwWin.RedBits = pfd.cRedBits;+ _glfwWin.GreenBits = pfd.cGreenBits;+ _glfwWin.BlueBits = pfd.cBlueBits;+ _glfwWin.AlphaBits = pfd.cAlphaBits;+ _glfwWin.DepthBits = pfd.cDepthBits;+ _glfwWin.StencilBits = pfd.cStencilBits;+ _glfwWin.AccumRedBits = pfd.cAccumRedBits;+ _glfwWin.AccumGreenBits = pfd.cAccumGreenBits;+ _glfwWin.AccumBlueBits = pfd.cAccumBlueBits;+ _glfwWin.AccumAlphaBits = pfd.cAccumAlphaBits;+ _glfwWin.AuxBuffers = pfd.cAuxBuffers;+ _glfwWin.Stereo = pfd.dwFlags & PFD_STEREO ? 1 : 0;+ _glfwWin.Samples = 0;+ }+ else+ {+ const int attribs[] = {+ WGL_ACCELERATION_ARB,+ WGL_RED_BITS_ARB,+ WGL_GREEN_BITS_ARB,+ WGL_BLUE_BITS_ARB,+ WGL_ALPHA_BITS_ARB,+ WGL_DEPTH_BITS_ARB,+ WGL_STENCIL_BITS_ARB,+ WGL_ACCUM_RED_BITS_ARB,+ WGL_ACCUM_GREEN_BITS_ARB,+ WGL_ACCUM_BLUE_BITS_ARB,+ WGL_ACCUM_ALPHA_BITS_ARB,+ WGL_AUX_BUFFERS_ARB,+ WGL_STEREO_ARB,+ WGL_SAMPLES_ARB+ };++ int values[sizeof(attribs) / sizeof(attribs[0])];++ _glfwWin.GetPixelFormatAttribiv( _glfwWin.DC, PixelFormat, 0, + sizeof(attribs) / sizeof(attribs[0]), + attribs, values);++ // Is current OpenGL context accelerated?+ _glfwWin.Accelerated = (values[0] == WGL_FULL_ACCELERATION_ARB);++ // "Standard" window parameters+ _glfwWin.RedBits = values[1];+ _glfwWin.GreenBits = values[2];+ _glfwWin.BlueBits = values[3];+ _glfwWin.AlphaBits = values[4];+ _glfwWin.DepthBits = values[5];+ _glfwWin.StencilBits = values[6];+ _glfwWin.AccumRedBits = values[7];+ _glfwWin.AccumGreenBits = values[8]; + _glfwWin.AccumBlueBits = values[9];+ _glfwWin.AccumAlphaBits = values[10];+ _glfwWin.AuxBuffers = values[11];+ _glfwWin.Stereo = values[12];+ _glfwWin.Samples = values[13];+ }++ // Get refresh rate+ mode = _glfwWin.Fullscreen ? _glfwWin.ModeID : ENUM_CURRENT_SETTINGS;+ dm.dmSize = sizeof( DEVMODE );++ if( EnumDisplaySettings( NULL, mode, &dm ) )+ {+ _glfwWin.RefreshRate = dm.dmDisplayFrequency;+ if( _glfwWin.RefreshRate <= 1 )+ {+ _glfwWin.RefreshRate = 0;+ }+ }+ else+ {+ _glfwWin.RefreshRate = 0;+ }+}+++//========================================================================+// Poll for new window and input events+//========================================================================++void _glfwPlatformPollEvents( void )+{+ MSG msg;+ int winclosed = GL_FALSE;++ // Flag: mouse was not moved (will be changed by _glfwGetNextEvent if+ // there was a mouse move event)+ _glfwInput.MouseMoved = GL_FALSE;+ if( _glfwWin.MouseLock )+ {+ _glfwInput.OldMouseX = _glfwWin.Width/2;+ _glfwInput.OldMouseY = _glfwWin.Height/2;+ }+ else+ {+ _glfwInput.OldMouseX = _glfwInput.MousePosX;+ _glfwInput.OldMouseY = _glfwInput.MousePosY;+ }++ // Check for new window messages+ while( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) )+ {+ switch( msg.message )+ {+ // QUIT-message (from close window)?+ case WM_QUIT:+ winclosed = GL_TRUE;+ break;++ // Ok, send it to the window message handler+ default:+ DispatchMessage( &msg );+ break;+ }+ }++ // LSHIFT/RSHIFT fixup (keys tend to "stick" without this fix)+ // This is the only async event handling in GLFW, but it solves some+ // nasty problems.+ // Caveat: Does not work under Win 9x/ME.+ if( _glfwLibrary.Sys.WinVer >= _GLFW_WIN_NT4 )+ {+ int lshift_down, rshift_down;++ // Get current state of left and right shift keys+ lshift_down = (GetAsyncKeyState( VK_LSHIFT ) >> 15) & 1;+ rshift_down = (GetAsyncKeyState( VK_RSHIFT ) >> 15) & 1;++ // See if this differs from our belief of what has happened+ // (we only have to check for lost key up events)+ if( !lshift_down && _glfwInput.Key[ GLFW_KEY_LSHIFT ] == 1 )+ {+ _glfwInputKey( GLFW_KEY_LSHIFT, GLFW_RELEASE );+ }+ if( !rshift_down && _glfwInput.Key[ GLFW_KEY_RSHIFT ] == 1 )+ {+ _glfwInputKey( GLFW_KEY_RSHIFT, GLFW_RELEASE );+ }+ }++ // Did we have mouse movement in locked cursor mode?+ if( _glfwInput.MouseMoved && _glfwWin.MouseLock )+ {+ _glfwPlatformSetMouseCursorPos( _glfwWin.Width / 2,+ _glfwWin.Height / 2 );+ }++ // Was there a window close request?+ if( winclosed && _glfwWin.WindowCloseCallback )+ {+ // Check if the program wants us to close the window+ winclosed = _glfwWin.WindowCloseCallback();+ }+ if( winclosed )+ {+ glfwCloseWindow();+ }+}+++//========================================================================+// _glfwPlatformWaitEvents() - Wait for new window and input events+//========================================================================++void _glfwPlatformWaitEvents( void )+{+ // Wait for new events+ WaitMessage();++ // Poll new events+ _glfwPlatformPollEvents();+}+++//========================================================================+// Hide mouse cursor (lock it)+//========================================================================++void _glfwPlatformHideMouseCursor( void )+{+ RECT ClipWindowRect;++ // Hide cursor+ ShowCursor( FALSE );++ // Clip cursor to the window+ if( GetWindowRect( _glfwWin.Wnd, &ClipWindowRect ) )+ {+ ClipCursor( &ClipWindowRect );+ }++ // Capture cursor to user window+ SetCapture( _glfwWin.Wnd );+}+++//========================================================================+// Show mouse cursor (unlock it)+//========================================================================++void _glfwPlatformShowMouseCursor( void )+{+ // Un-capture cursor+ ReleaseCapture();++ // Disable cursor clipping+ ClipCursor( NULL );++ // Show cursor+ ShowCursor( TRUE );+}+++//========================================================================+// Set physical mouse cursor position+//========================================================================++void _glfwPlatformSetMouseCursorPos( int x, int y )+{+ POINT pos;++ // Convert client coordinates to screen coordinates+ pos.x = x;+ pos.y = y;+ ClientToScreen( _glfwWin.Wnd, &pos );++ // Change cursor position+ SetCursorPos( pos.x, pos.y );+}+
+ glfw/lib/window.c view
@@ -0,0 +1,727 @@+//========================================================================+// GLFW - An OpenGL framework+// File: window.c+// Platform: Any+// API version: 2.6+// WWW: http://glfw.sourceforge.net+//------------------------------------------------------------------------+// Copyright (c) 2002-2006 Camilla Berglund+//+// This software is provided 'as-is', without any express or implied+// warranty. In no event will the authors be held liable for any damages+// arising from the use of this software.+//+// Permission is granted to anyone to use this software for any purpose,+// including commercial applications, and to alter it and redistribute it+// freely, subject to the following restrictions:+//+// 1. The origin of this software must not be misrepresented; you must not+// claim that you wrote the original software. If you use this software+// in a product, an acknowledgment in the product documentation would+// be appreciated but is not required.+//+// 2. Altered source versions must be plainly marked as such, and must not+// be misrepresented as being the original software.+//+// 3. This notice may not be removed or altered from any source+// distribution.+//+//========================================================================++#include "internal.h"++++//************************************************************************+//**** GLFW internal functions ****+//************************************************************************++//========================================================================+// Clear all open window hints+//========================================================================++void _glfwClearWindowHints( void )+{+ _glfwWinHints.RefreshRate = 0;+ _glfwWinHints.AccumRedBits = 0;+ _glfwWinHints.AccumGreenBits = 0;+ _glfwWinHints.AccumBlueBits = 0;+ _glfwWinHints.AccumAlphaBits = 0;+ _glfwWinHints.AuxBuffers = 0;+ _glfwWinHints.Stereo = 0;+ _glfwWinHints.WindowNoResize = 0;+ _glfwWinHints.Samples = 0;+}+++//========================================================================+// Handle the input tracking part of window deactivation+//========================================================================++void _glfwInputDeactivation( void )+{+ int i;++ // Release all keyboard keys+ for( i = 0; i <= GLFW_KEY_LAST; i ++ )+ {+ if( _glfwInput.Key[ i ] == GLFW_PRESS )+ {+ _glfwInputKey( i, GLFW_RELEASE );+ }+ }++ // Release all mouse buttons+ for( i = 0; i <= GLFW_MOUSE_BUTTON_LAST; i ++ )+ {+ if( _glfwInput.MouseButton[ i ] == GLFW_PRESS )+ {+ _glfwInputMouseClick( i, GLFW_RELEASE );+ }+ }+}+++//========================================================================+// _glfwClearInput() - Clear all input state+//========================================================================++void _glfwClearInput( void )+{+ int i;++ // Release all keyboard keys+ for( i = 0; i <= GLFW_KEY_LAST; i ++ )+ {+ _glfwInput.Key[ i ] = GLFW_RELEASE;+ }++ // Clear last character+ _glfwInput.LastChar = 0;++ // Release all mouse buttons+ for( i = 0; i <= GLFW_MOUSE_BUTTON_LAST; i ++ )+ {+ _glfwInput.MouseButton[ i ] = GLFW_RELEASE;+ }++ // Set mouse position to (0,0)+ _glfwInput.MousePosX = 0;+ _glfwInput.MousePosY = 0;++ // Set mouse wheel position to 0+ _glfwInput.WheelPos = 0;++ // The default is to use non sticky keys and mouse buttons+ _glfwInput.StickyKeys = GL_FALSE;+ _glfwInput.StickyMouseButtons = GL_FALSE;++ // The default is to disable key repeat+ _glfwInput.KeyRepeat = GL_FALSE;+}+++//========================================================================+// _glfwInputKey() - Register keyboard activity+//========================================================================++void _glfwInputKey( int key, int action )+{+ int keyrepeat = 0;++ if( key < 0 || key > GLFW_KEY_LAST )+ {+ return;+ }++ // Are we trying to release an already released key?+ if( action == GLFW_RELEASE && _glfwInput.Key[ key ] != GLFW_PRESS )+ {+ return;+ }++ // Register key action+ if( action == GLFW_RELEASE && _glfwInput.StickyKeys )+ {+ _glfwInput.Key[ key ] = GLFW_STICK;+ }+ else+ {+ keyrepeat = (_glfwInput.Key[ key ] == GLFW_PRESS) &&+ (action == GLFW_PRESS);+ _glfwInput.Key[ key ] = (char) action;+ }++ // Call user callback function+ if( _glfwWin.KeyCallback && (_glfwInput.KeyRepeat || !keyrepeat) )+ {+ _glfwWin.KeyCallback( key, action );+ }+}+++//========================================================================+// _glfwInputChar() - Register (keyboard) character activity+//========================================================================++void _glfwInputChar( int character, int action )+{+ int keyrepeat = 0;++ // Valid Unicode (ISO 10646) character?+ if( !( (character >= 32 && character <= 126) || character >= 160 ) )+ {+ return;+ }++ // Is this a key repeat?+ if( action == GLFW_PRESS && _glfwInput.LastChar == character )+ {+ keyrepeat = 1;+ }++ // Store this character as last character (or clear it, if released)+ if( action == GLFW_PRESS )+ {+ _glfwInput.LastChar = character;+ }+ else+ {+ _glfwInput.LastChar = 0;+ }++ // Call user callback function+ if( _glfwWin.CharCallback && (_glfwInput.KeyRepeat || !keyrepeat) )+ {+ _glfwWin.CharCallback( character, action );+ }+}+++//========================================================================+// _glfwInputMouseClick() - Register mouse button clicks+//========================================================================++void _glfwInputMouseClick( int button, int action )+{+ if( button >= 0 && button <= GLFW_MOUSE_BUTTON_LAST )+ {+ // Register mouse button action+ if( action == GLFW_RELEASE && _glfwInput.StickyMouseButtons )+ {+ _glfwInput.MouseButton[ button ] = GLFW_STICK;+ }+ else+ {+ _glfwInput.MouseButton[ button ] = (char) action;+ }++ // Call user callback function+ if( _glfwWin.MouseButtonCallback )+ {+ _glfwWin.MouseButtonCallback( button, action );+ }+ }+}++++//************************************************************************+//**** GLFW user functions ****+//************************************************************************++//========================================================================+// glfwOpenWindow() - Here is where the window is created, and the OpenGL+// rendering context is created+//========================================================================++GLFWAPI int GLFWAPIENTRY glfwOpenWindow( int width, int height,+ int redbits, int greenbits, int bluebits, int alphabits,+ int depthbits, int stencilbits, int mode )+{+ int x;+ _GLFWhints hints;++ // Is GLFW initialized?+ if( !_glfwInitialized || _glfwWin.Opened )+ {+ return GL_FALSE;+ }++ // Copy and clear window hints+ hints = _glfwWinHints;+ _glfwClearWindowHints();++ // Check input arguments+ if( mode != GLFW_WINDOW && mode != GLFW_FULLSCREEN )+ {+ return GL_FALSE;+ }++ // Clear GLFW window state+ _glfwWin.Active = GL_TRUE;+ _glfwWin.Iconified = GL_FALSE;+ _glfwWin.MouseLock = GL_FALSE;+ _glfwWin.AutoPollEvents = GL_TRUE;+ _glfwClearInput();++ // Unregister all callback functions+ _glfwWin.WindowSizeCallback = NULL;+ _glfwWin.WindowCloseCallback = NULL;+ _glfwWin.WindowRefreshCallback = NULL;+ _glfwWin.KeyCallback = NULL;+ _glfwWin.CharCallback = NULL;+ _glfwWin.MousePosCallback = NULL;+ _glfwWin.MouseButtonCallback = NULL;+ _glfwWin.MouseWheelCallback = NULL;++ // Check width & height+ if( width > 0 && height <= 0 )+ {+ // Set the window aspect ratio to 4:3+ height = (width * 3) / 4;+ }+ else if( width <= 0 && height > 0 )+ {+ // Set the window aspect ratio to 4:3+ width = (height * 4) / 3;+ }+ else if( width <= 0 && height <= 0 )+ {+ // Default window size+ width = 640;+ height = 480;+ }++ // Remember window settings+ _glfwWin.Width = width;+ _glfwWin.Height = height;+ _glfwWin.Fullscreen = (mode == GLFW_FULLSCREEN ? 1 : 0);++ // Platform specific window opening routine+ if( !_glfwPlatformOpenWindow( width, height, redbits, greenbits,+ bluebits, alphabits, depthbits, stencilbits, mode, &hints ) )+ {+ return GL_FALSE;+ }++ // Flag that window is now opened+ _glfwWin.Opened = GL_TRUE;++ // Get window parameters (such as color buffer bits etc)+ _glfwPlatformRefreshWindowParams();++ // Get OpenGL version+ glfwGetGLVersion( &_glfwWin.GLVerMajor, &_glfwWin.GLVerMinor, &x );++ // Do we have non-power-of-two textures?+ _glfwWin.Has_GL_ARB_texture_non_power_of_two =+ glfwExtensionSupported( "GL_ARB_texture_non_power_of_two" );++ // Do we have automatic mipmap generation?+ _glfwWin.Has_GL_SGIS_generate_mipmap =+ (_glfwWin.GLVerMajor >= 2) || (_glfwWin.GLVerMinor >= 4) ||+ glfwExtensionSupported( "GL_SGIS_generate_mipmap" );++ // If full-screen mode was requested, disable mouse cursor+ if( mode == GLFW_FULLSCREEN )+ {+ glfwDisable( GLFW_MOUSE_CURSOR );+ }++ return GL_TRUE;+}+++//========================================================================+// glfwOpenWindowHint() - Set hints for opening the window+//========================================================================++GLFWAPI void GLFWAPIENTRY glfwOpenWindowHint( int target, int hint )+{+ // Is GLFW initialized?+ if( !_glfwInitialized )+ {+ return;+ }++ switch( target )+ {+ case GLFW_REFRESH_RATE:+ _glfwWinHints.RefreshRate = hint;+ break;+ case GLFW_ACCUM_RED_BITS:+ _glfwWinHints.AccumRedBits = hint;+ break;+ case GLFW_ACCUM_GREEN_BITS:+ _glfwWinHints.AccumGreenBits = hint;+ break;+ case GLFW_ACCUM_BLUE_BITS:+ _glfwWinHints.AccumBlueBits = hint;+ break;+ case GLFW_ACCUM_ALPHA_BITS:+ _glfwWinHints.AccumAlphaBits = hint;+ break;+ case GLFW_AUX_BUFFERS:+ _glfwWinHints.AuxBuffers = hint;+ break;+ case GLFW_STEREO:+ _glfwWinHints.Stereo = hint;+ break;+ case GLFW_WINDOW_NO_RESIZE:+ _glfwWinHints.WindowNoResize = hint;+ break;+ case GLFW_FSAA_SAMPLES:+ _glfwWinHints.Samples = hint;+ break;+ default:+ break;+ }+}+++//========================================================================+// glfwCloseWindow() - Properly kill the window / video display+//========================================================================++GLFWAPI void GLFWAPIENTRY glfwCloseWindow( void )+{+ // Is GLFW initialized?+ if( !_glfwInitialized )+ {+ return;+ }++ // Show mouse pointer again (if hidden)+ glfwEnable( GLFW_MOUSE_CURSOR );++ // Close window+ _glfwPlatformCloseWindow();++ // Window is no longer opened+ _glfwWin.Opened = GL_FALSE;+}+++//========================================================================+// glfwSetWindowTitle() - Set the window title+//========================================================================++GLFWAPI void GLFWAPIENTRY glfwSetWindowTitle( const char *title )+{+ // Is GLFW initialized?+ if( !_glfwInitialized || !_glfwWin.Opened )+ {+ return;+ }++ // Set window title+ _glfwPlatformSetWindowTitle( title );+}+++//========================================================================+// glfwGetWindowSize() - Get the window size+//========================================================================++GLFWAPI void GLFWAPIENTRY glfwGetWindowSize( int *width, int *height )+{+ if( width != NULL )+ {+ *width = _glfwWin.Width;+ }+ if( height != NULL )+ {+ *height = _glfwWin.Height;+ }+}+++//========================================================================+// glfwSetWindowSize() - Set the window size+//========================================================================++GLFWAPI void GLFWAPIENTRY glfwSetWindowSize( int width, int height )+{+ // Is GLFW initialized?+ if( !_glfwInitialized || !_glfwWin.Opened || _glfwWin.Iconified )+ {+ return;+ }++ // Don't do anything if the window size did not change+ if( width == _glfwWin.Width && height == _glfwWin.Height )+ {+ return;+ }++ // Change window size+ _glfwPlatformSetWindowSize( width, height );++ // Refresh window parameters (may have changed due to changed video+ // modes)+ _glfwPlatformRefreshWindowParams();+}+++//========================================================================+// glfwSetWindowPos() - Set the window position+//========================================================================++GLFWAPI void GLFWAPIENTRY glfwSetWindowPos( int x, int y )+{+ // Is GLFW initialized?+ if( !_glfwInitialized || !_glfwWin.Opened || _glfwWin.Fullscreen ||+ _glfwWin.Iconified )+ {+ return;+ }++ // Set window position+ _glfwPlatformSetWindowPos( x, y );+}+++//========================================================================+// glfwIconfyWindow() - Window iconification+//========================================================================++GLFWAPI void GLFWAPIENTRY glfwIconifyWindow( void )+{+ // Is GLFW initialized?+ if( !_glfwInitialized || !_glfwWin.Opened || _glfwWin.Iconified )+ {+ return;+ }++ // Iconify window+ _glfwPlatformIconifyWindow();+}+++//========================================================================+// glfwRestoreWindow() - Window un-iconification+//========================================================================++GLFWAPI void GLFWAPIENTRY glfwRestoreWindow( void )+{+ // Is GLFW initialized?+ if( !_glfwInitialized || !_glfwWin.Opened || !_glfwWin.Iconified )+ {+ return;+ }++ // Restore iconified window+ _glfwPlatformRestoreWindow();++ // Refresh window parameters+ _glfwPlatformRefreshWindowParams();+}+++//========================================================================+// glfwSwapBuffers() - Swap buffers (double-buffering) and poll any new+// events+//========================================================================++GLFWAPI void GLFWAPIENTRY glfwSwapBuffers( void )+{+ // Is GLFW initialized?+ if( !_glfwInitialized || !_glfwWin.Opened )+ {+ return;+ }++ // Check for window messages+ if( _glfwWin.AutoPollEvents )+ {+ glfwPollEvents();+ }++ // Update display-buffer+ if( _glfwWin.Opened )+ {+ _glfwPlatformSwapBuffers();+ }+}+++//========================================================================+// glfwSwapInterval() - Set double buffering swap interval (0 = vsync off)+//========================================================================++GLFWAPI void GLFWAPIENTRY glfwSwapInterval( int interval )+{+ // Is GLFW initialized?+ if( !_glfwInitialized || !_glfwWin.Opened )+ {+ return;+ }++ // Set double buffering swap interval+ _glfwPlatformSwapInterval( interval );+}+++//========================================================================+// glfwGetWindowParam() - Get window parameter+//========================================================================++GLFWAPI int GLFWAPIENTRY glfwGetWindowParam( int param )+{+ // Is GLFW initialized?+ if( !_glfwInitialized )+ {+ return 0;+ }++ // Is the window opened?+ if( !_glfwWin.Opened )+ {+ if( param == GLFW_OPENED )+ {+ return GL_FALSE;+ }+ return 0;+ }++ // Window parameters+ switch( param )+ {+ case GLFW_OPENED:+ return GL_TRUE;+ case GLFW_ACTIVE:+ return _glfwWin.Active;+ case GLFW_ICONIFIED:+ return _glfwWin.Iconified;+ case GLFW_ACCELERATED:+ return _glfwWin.Accelerated;+ case GLFW_RED_BITS:+ return _glfwWin.RedBits;+ case GLFW_GREEN_BITS:+ return _glfwWin.GreenBits;+ case GLFW_BLUE_BITS:+ return _glfwWin.BlueBits;+ case GLFW_ALPHA_BITS:+ return _glfwWin.AlphaBits;+ case GLFW_DEPTH_BITS:+ return _glfwWin.DepthBits;+ case GLFW_STENCIL_BITS:+ return _glfwWin.StencilBits;+ case GLFW_ACCUM_RED_BITS:+ return _glfwWin.AccumRedBits;+ case GLFW_ACCUM_GREEN_BITS:+ return _glfwWin.AccumGreenBits;+ case GLFW_ACCUM_BLUE_BITS:+ return _glfwWin.AccumBlueBits;+ case GLFW_ACCUM_ALPHA_BITS:+ return _glfwWin.AccumAlphaBits;+ case GLFW_AUX_BUFFERS:+ return _glfwWin.AuxBuffers;+ case GLFW_STEREO:+ return _glfwWin.Stereo;+ case GLFW_REFRESH_RATE:+ return _glfwWin.RefreshRate;+ case GLFW_WINDOW_NO_RESIZE:+ return _glfwWin.WindowNoResize;+ case GLFW_FSAA_SAMPLES:+ return _glfwWin.Samples;+ default:+ return 0;+ }+}+++//========================================================================+// glfwSetWindowSizeCallback() - Set callback function for window size+// changes+//========================================================================++GLFWAPI void GLFWAPIENTRY glfwSetWindowSizeCallback( GLFWwindowsizefun cbfun )+{+ // Is GLFW initialized?+ if( !_glfwInitialized || !_glfwWin.Opened )+ {+ return;+ }++ // Set callback function+ _glfwWin.WindowSizeCallback = cbfun;++ // Call the callback function to let the application know the current+ // window size+ if( cbfun )+ {+ cbfun( _glfwWin.Width, _glfwWin.Height );+ }+}++//========================================================================+// glfwSetWindowCloseCallback() - Set callback function for window close+// events+//========================================================================++GLFWAPI void GLFWAPIENTRY glfwSetWindowCloseCallback( GLFWwindowclosefun cbfun )+{+ // Is GLFW initialized?+ if( !_glfwInitialized || !_glfwWin.Opened )+ {+ return;+ }++ // Set callback function+ _glfwWin.WindowCloseCallback = cbfun;+}+++//========================================================================+// glfwSetWindowRefreshCallback() - Set callback function for window+// refresh events+//========================================================================++GLFWAPI void GLFWAPIENTRY glfwSetWindowRefreshCallback( GLFWwindowrefreshfun cbfun )+{+ // Is GLFW initialized?+ if( !_glfwInitialized || !_glfwWin.Opened )+ {+ return;+ }++ // Set callback function+ _glfwWin.WindowRefreshCallback = cbfun;+}+++//========================================================================+// glfwPollEvents() - Poll for new window and input events+//========================================================================++GLFWAPI void GLFWAPIENTRY glfwPollEvents( void )+{+ // Is GLFW initialized?+ if( !_glfwInitialized || !_glfwWin.Opened )+ {+ return;+ }++ // Poll for new events+ _glfwPlatformPollEvents();+}+++//========================================================================+// glfwWaitEvents() - Wait for new window and input events+//========================================================================++GLFWAPI void GLFWAPIENTRY glfwWaitEvents( void )+{+ // Is GLFW initialized?+ if( !_glfwInitialized || !_glfwWin.Opened )+ {+ return;+ }++ // Poll for new events+ _glfwPlatformWaitEvents();+}+
+ glfw/lib/x11/platform.h view
@@ -0,0 +1,415 @@+//========================================================================+// GLFW - An OpenGL framework+// File: platform.h+// Platform: X11 (Unix)+// API version: 2.6+// WWW: http://glfw.sourceforge.net+//------------------------------------------------------------------------+// Copyright (c) 2002-2006 Camilla Berglund+//+// This software is provided 'as-is', without any express or implied+// warranty. In no event will the authors be held liable for any damages+// arising from the use of this software.+//+// Permission is granted to anyone to use this software for any purpose,+// including commercial applications, and to alter it and redistribute it+// freely, subject to the following restrictions:+//+// 1. The origin of this software must not be misrepresented; you must not+// claim that you wrote the original software. If you use this software+// in a product, an acknowledgment in the product documentation would+// be appreciated but is not required.+//+// 2. Altered source versions must be plainly marked as such, and must not+// be misrepresented as being the original software.+//+// 3. This notice may not be removed or altered from any source+// distribution.+//+//========================================================================++#ifndef _platform_h_+#define _platform_h_+++// This is the X11 version of GLFW+#define _GLFW_X11+++// Include files+#include <sys/time.h>+#include <unistd.h>+#include <signal.h>+#include <X11/Xlib.h>+#include <X11/keysym.h>+#include <X11/Xatom.h>+#include <GL/glx.h>+#include "../../include/GL/glfw.h"++// Do we have pthread support?+#ifdef _GLFW_HAS_PTHREAD+ #include <pthread.h>+ #include <sched.h>+#endif++// With XFree86, we can use the XF86VidMode extension+#if defined( _GLFW_HAS_XF86VIDMODE )+ #include <X11/extensions/xf86vmode.h>+#endif++#if defined( _GLFW_HAS_XRANDR )+ #include <X11/extensions/Xrandr.h>+#endif++// Do we have support for dlopen/dlsym?+#if defined( _GLFW_HAS_DLOPEN )+ #include <dlfcn.h>+#endif++// We support two different ways for getting the number of processors in+// the system: sysconf (POSIX) and sysctl (BSD?)+#if defined( _GLFW_HAS_SYSCONF )++ // Use a single constant for querying number of online processors using+ // the sysconf function (e.g. SGI defines _SC_NPROC_ONLN instead of+ // _SC_NPROCESSORS_ONLN)+ #ifndef _SC_NPROCESSORS_ONLN+ #ifdef _SC_NPROC_ONLN+ #define _SC_NPROCESSORS_ONLN _SC_NPROC_ONLN+ #else+ #error POSIX constant _SC_NPROCESSORS_ONLN not defined!+ #endif+ #endif++ // Macro for querying the number of processors+ #define _glfw_numprocessors(n) n=(int)sysconf(_SC_NPROCESSORS_ONLN)++#elif defined( _GLFW_HAS_SYSCTL )++ #include <sys/types.h>+ #include <sys/sysctl.h>++ // Macro for querying the number of processors+ #define _glfw_numprocessors(n) { \+ int mib[2], ncpu; \+ size_t len = 1; \+ mib[0] = CTL_HW; \+ mib[1] = HW_NCPU; \+ n = 1; \+ if( sysctl( mib, 2, &ncpu, &len, NULL, 0 ) != -1 ) \+ { \+ if( len > 0 ) \+ { \+ n = ncpu; \+ } \+ } \+ }++#else++ // If neither sysconf nor sysctl is supported, assume single processor+ // system+ #define _glfw_numprocessors(n) n=1++#endif++void (*glXGetProcAddress(const GLubyte *procName))();+void (*glXGetProcAddressARB(const GLubyte *procName))();+void (*glXGetProcAddressEXT(const GLubyte *procName))();++// We support four different ways for getting addresses for GL/GLX+// extension functions: glXGetProcAddress, glXGetProcAddressARB,+// glXGetProcAddressEXT, and dlsym+#if defined( _GLFW_HAS_GLXGETPROCADDRESSARB )+ #define _glfw_glXGetProcAddress(x) glXGetProcAddressARB(x)+#elif defined( _GLFW_HAS_GLXGETPROCADDRESS )+ #define _glfw_glXGetProcAddress(x) glXGetProcAddress(x)+#elif defined( _GLFW_HAS_GLXGETPROCADDRESSEXT )+ #define _glfw_glXGetProcAddress(x) glXGetProcAddressEXT(x)+#elif defined( _GLFW_HAS_DLOPEN )+ #define _glfw_glXGetProcAddress(x) dlsym(_glfwLibs.libGL,x)+ #define _GLFW_DLOPEN_LIBGL+#else+#define _glfw_glXGetProcAddress(x) NULL+#endif++// glXSwapIntervalSGI typedef (X11 buffer-swap interval control)+typedef int ( * GLXSWAPINTERVALSGI_T) (int interval);+++//========================================================================+// Global variables (GLFW internals)+//========================================================================++//------------------------------------------------------------------------+// Window structure+//------------------------------------------------------------------------+typedef struct _GLFWwin_struct _GLFWwin;++struct _GLFWwin_struct {++// ========= PLATFORM INDEPENDENT MANDATORY PART =========================++ // User callback functions+ GLFWwindowsizefun WindowSizeCallback;+ GLFWwindowclosefun WindowCloseCallback;+ GLFWwindowrefreshfun WindowRefreshCallback;+ GLFWmousebuttonfun MouseButtonCallback;+ GLFWmouseposfun MousePosCallback;+ GLFWmousewheelfun MouseWheelCallback;+ GLFWkeyfun KeyCallback;+ GLFWcharfun CharCallback;++ // User selected window settings+ int Fullscreen; // Fullscreen flag+ int MouseLock; // Mouse-lock flag+ int AutoPollEvents; // Auto polling flag+ int SysKeysDisabled; // System keys disabled flag+ int WindowNoResize; // Resize- and maximize gadgets disabled flag++ // Window status & parameters+ int Opened; // Flag telling if window is opened or not+ int Active; // Application active flag+ int Iconified; // Window iconified flag+ int Width, Height; // Window width and heigth+ int Accelerated; // GL_TRUE if window is HW accelerated+ int RedBits;+ int GreenBits;+ int BlueBits;+ int AlphaBits;+ int DepthBits;+ int StencilBits;+ int AccumRedBits;+ int AccumGreenBits;+ int AccumBlueBits;+ int AccumAlphaBits;+ int AuxBuffers;+ int Stereo;+ int RefreshRate; // Vertical monitor refresh rate+ int Samples;++ // Extensions & OpenGL version+ int Has_GL_SGIS_generate_mipmap;+ int Has_GL_ARB_texture_non_power_of_two;+ int GLVerMajor,GLVerMinor;+++// ========= PLATFORM SPECIFIC PART ======================================++ // Platform specific window resources+ Window Win; // Window+ int Scrn; // Screen ID+ XVisualInfo *VI; // Visual+ GLXContext CX; // OpenGL rendering context+ Atom WMDeleteWindow; // For WM close detection+ Atom WMPing; // For WM ping response+ XSizeHints *Hints; // WM size hints++ // Platform specific extensions+ GLXSWAPINTERVALSGI_T SwapInterval;++ // Various platform specific internal variables+ int OverrideRedirect; // True if window is OverrideRedirect+ int KeyboardGrabbed; // True if keyboard is currently grabbed+ int PointerGrabbed; // True if pointer is currently grabbed+ int PointerHidden; // True if pointer is currently hidden+ int MapNotifyCount; // Used for during processing+ int FocusInCount; // Used for during processing++ // Screensaver data+ struct {+ int Changed;+ int Timeout;+ int Interval;+ int Blanking;+ int Exposure;+ } Saver;++ // Fullscreen data+ struct {+ int ModeChanged;+#if defined( _GLFW_HAS_XF86VIDMODE )+ XF86VidModeModeInfo OldMode;+#endif+#if defined( _GLFW_HAS_XRANDR )+ SizeID OldSizeID;+ int OldWidth;+ int OldHeight;+ Rotation OldRotation;+#endif+ } FS;+};++GLFWGLOBAL _GLFWwin _glfwWin;+++//------------------------------------------------------------------------+// User input status (most of this should go in _GLFWwin)+//------------------------------------------------------------------------+GLFWGLOBAL struct {++// ========= PLATFORM INDEPENDENT MANDATORY PART =========================++ // Mouse status+ int MousePosX, MousePosY;+ int WheelPos;+ char MouseButton[ GLFW_MOUSE_BUTTON_LAST+1 ];++ // Keyboard status+ char Key[ GLFW_KEY_LAST+1 ];+ int LastChar;++ // User selected settings+ int StickyKeys;+ int StickyMouseButtons;+ int KeyRepeat;+++// ========= PLATFORM SPECIFIC PART ======================================++ // Platform specific internal variables+ int MouseMoved, CursorPosX, CursorPosY;++} _glfwInput;+++//------------------------------------------------------------------------+// Library global data+//------------------------------------------------------------------------+GLFWGLOBAL struct {++// ========= PLATFORM SPECIFIC PART ======================================++ Display *Dpy;+ int NumScreens;+ int DefaultScreen;++ struct {+ int Available;+ int EventBase;+ int ErrorBase;+ } XF86VidMode;++ struct {+ int Available;+ int EventBase;+ int ErrorBase;+ } XRandR;++ // Timer data+ struct {+ double Resolution;+ long long t0;+ } Timer;++#if defined(_GLFW_DLOPEN_LIBGL)+ struct {+ void *libGL; // dlopen handle for libGL.so+ } Libs;+#endif+} _glfwLibrary;+++//------------------------------------------------------------------------+// Thread record (one for each thread)+//------------------------------------------------------------------------+typedef struct _GLFWthread_struct _GLFWthread;++struct _GLFWthread_struct {++// ========= PLATFORM INDEPENDENT MANDATORY PART =========================++ // Pointer to previous and next threads in linked list+ _GLFWthread *Previous, *Next;++ // GLFW user side thread information+ GLFWthread ID;+ GLFWthreadfun Function;++// ========= PLATFORM SPECIFIC PART ======================================++ // System side thread information+#ifdef _GLFW_HAS_PTHREAD+ pthread_t PosixID;+#endif++};+++//------------------------------------------------------------------------+// General thread information+//------------------------------------------------------------------------+GLFWGLOBAL struct {++// ========= PLATFORM INDEPENDENT MANDATORY PART =========================++ // Next thread ID to use (increments for every created thread)+ GLFWthread NextID;++ // First thread in linked list (always the main thread)+ _GLFWthread First;++// ========= PLATFORM SPECIFIC PART ======================================++ // Critical section lock+#ifdef _GLFW_HAS_PTHREAD+ pthread_mutex_t CriticalSection;+#endif++} _glfwThrd;+++//------------------------------------------------------------------------+// Joystick information & state+//------------------------------------------------------------------------+GLFWGLOBAL struct {+ int Present;+ int fd;+ int NumAxes;+ int NumButtons;+ float *Axis;+ unsigned char *Button;+} _glfwJoy[ GLFW_JOYSTICK_LAST + 1 ];+++//========================================================================+// Macros for encapsulating critical code sections (i.e. making parts+// of GLFW thread safe)+//========================================================================++// Thread list management+#ifdef _GLFW_HAS_PTHREAD+ #define ENTER_THREAD_CRITICAL_SECTION \+ pthread_mutex_lock( &_glfwThrd.CriticalSection );+ #define LEAVE_THREAD_CRITICAL_SECTION \+ pthread_mutex_unlock( &_glfwThrd.CriticalSection );+#else+ #define ENTER_THREAD_CRITICAL_SECTION+ #define LEAVE_THREAD_CRITICAL_SECTION+#endif+++//========================================================================+// Prototypes for platform specific internal functions+//========================================================================++// Time+void _glfwInitTimer( void );++// Fullscreen support+int _glfwGetClosestVideoMode( int screen, int *width, int *height, int *rate );+void _glfwSetVideoModeMODE( int screen, int mode, int rate );+void _glfwSetVideoMode( int screen, int *width, int *height, int *rate );++// Cursor handling+Cursor _glfwCreateNULLCursor( Display *display, Window root );++// Joystick input+void _glfwInitJoysticks( void );+void _glfwTerminateJoysticks( void );++// Unicode support+long _glfwKeySym2Unicode( KeySym keysym );+++#endif // _platform_h_
+ glfw/lib/x11/x11_enable.c view
@@ -0,0 +1,51 @@+//========================================================================+// GLFW - An OpenGL framework+// File: x11_enable.c+// Platform: X11 (Unix)+// API version: 2.6+// WWW: http://glfw.sourceforge.net+//------------------------------------------------------------------------+// Copyright (c) 2002-2006 Camilla Berglund+//+// This software is provided 'as-is', without any express or implied+// warranty. In no event will the authors be held liable for any damages+// arising from the use of this software.+//+// Permission is granted to anyone to use this software for any purpose,+// including commercial applications, and to alter it and redistribute it+// freely, subject to the following restrictions:+//+// 1. The origin of this software must not be misrepresented; you must not+// claim that you wrote the original software. If you use this software+// in a product, an acknowledgment in the product documentation would+// be appreciated but is not required.+//+// 2. Altered source versions must be plainly marked as such, and must not+// be misrepresented as being the original software.+//+// 3. This notice may not be removed or altered from any source+// distribution.+//+//========================================================================++#include "internal.h"+++//************************************************************************+//**** Platform implementation functions ****+//************************************************************************++//========================================================================+// _glfwPlatformEnableSystemKeys() - Enable system keys+// _glfwPlatformDisableSystemKeys() - Disable system keys+//========================================================================++void _glfwPlatformEnableSystemKeys( void )+{+ // Not supported under X11 (yet)+}++void _glfwPlatformDisableSystemKeys( void )+{+ // Not supported under X11 (yet)+}
+ glfw/lib/x11/x11_fullscreen.c view
@@ -0,0 +1,524 @@+//========================================================================+// GLFW - An OpenGL framework+// File: x11_fullscreen.c+// Platform: X11 (Unix)+// API version: 2.6+// WWW: http://glfw.sourceforge.net+//------------------------------------------------------------------------+// Copyright (c) 2002-2006 Camilla Berglund+//+// This software is provided 'as-is', without any express or implied+// warranty. In no event will the authors be held liable for any damages+// arising from the use of this software.+//+// Permission is granted to anyone to use this software for any purpose,+// including commercial applications, and to alter it and redistribute it+// freely, subject to the following restrictions:+//+// 1. The origin of this software must not be misrepresented; you must not+// claim that you wrote the original software. If you use this software+// in a product, an acknowledgment in the product documentation would+// be appreciated but is not required.+//+// 2. Altered source versions must be plainly marked as such, and must not+// be misrepresented as being the original software.+//+// 3. This notice may not be removed or altered from any source+// distribution.+//+//========================================================================++#include "internal.h"+++//************************************************************************+//**** GLFW internal functions ****+//************************************************************************++//========================================================================+// _glfwBPP2RGB() - Convert BPP to RGB bits (based on "best guess")+//========================================================================++static void _glfwBPP2RGB( int bpp, int *r, int *g, int *b )+{+ int delta;++ // Special case: BPP = 32 (I don't think this is necessary for X11??)+ if( bpp == 32 )+ bpp = 24;++ // Convert "bits per pixel" to red, green & blue sizes+ *r = *g = *b = bpp / 3;+ delta = bpp - (*r * 3);+ if( delta >= 1 )+ {+ *g = *g + 1;+ }+ if( delta == 2 )+ {+ *r = *r + 1;+ }+}+++//========================================================================+// Finds the video mode closest in size to the specified desired size+//========================================================================++int _glfwGetClosestVideoMode( int screen, int *width, int *height, int *rate )+{+#if defined( _GLFW_HAS_XRANDR )+ int i, match, bestmatch;+ int sizecount, bestsize;+ int ratecount, bestrate;+ short *ratelist;+ XRRScreenConfiguration *sc;+ XRRScreenSize *sizelist;++ if( _glfwLibrary.XRandR.Available )+ {+ sc = XRRGetScreenInfo( _glfwLibrary.Dpy,+ RootWindow( _glfwLibrary.Dpy, screen ) );++ sizelist = XRRConfigSizes( sc, &sizecount );++ // Find the best matching mode+ bestsize = -1;+ bestmatch = 999999;+ for( i = 0; i < sizecount; i++ )+ {+ match = (*width - sizelist[i].width) *+ (*width - sizelist[i].width) ++ (*height - sizelist[i].height) *+ (*height - sizelist[i].height);+ if( match < bestmatch )+ {+ bestmatch = match;+ bestsize = i;+ }+ }++ if( bestsize != -1 )+ {+ // Report width & height of best matching mode+ *width = sizelist[bestsize].width;+ *height = sizelist[bestsize].height;++ if( *rate > 0 )+ {+ ratelist = XRRConfigRates( sc, bestsize, &ratecount );++ bestrate = -1;+ bestmatch = 999999;+ for( i = 0; i < ratecount; i++ )+ {+ match = abs( ratelist[i] - *rate );+ if( match < bestmatch )+ {+ bestmatch = match;+ bestrate = ratelist[i];+ }+ }+ + if( bestrate != -1 )+ {+ *rate = bestrate;+ }+ }+ }++ // Free modelist+ XRRFreeScreenConfigInfo( sc );++ if( bestsize != -1 )+ {+ return bestsize;+ }+ }+#elif defined( _GLFW_HAS_XF86VIDMODE )+ XF86VidModeModeInfo **modelist;+ int modecount, i, bestmode, bestmatch, match;++ // Use the XF86VidMode extension to control video resolution+ if( _glfwLibrary.XF86VidMode.Available )+ {+ // Get a list of all available display modes+ XF86VidModeGetAllModeLines( _glfwLibrary.Dpy, screen,+ &modecount, &modelist );++ // Find the best matching mode+ bestmode = -1;+ bestmatch = 999999;+ for( i = 0; i < modecount; i++ )+ {+ match = (*width - modelist[i]->hdisplay) *+ (*width - modelist[i]->hdisplay) ++ (*height - modelist[i]->vdisplay) *+ (*height - modelist[i]->vdisplay);+ if( match < bestmatch )+ {+ bestmatch = match;+ bestmode = i;+ }+ }++ if( bestmode != -1 )+ {+ // Report width & height of best matching mode+ *width = modelist[ bestmode ]->hdisplay;+ *h = modelist[ bestmode ]->vdisplay;+ }++ // Free modelist+ XFree( modelist );++ if( bestmode != -1 )+ {+ return bestmode;+ }+ }+#endif++ // Default: Simply use the screen resolution+ *width = DisplayWidth( _glfwLibrary.Dpy, screen );+ *height = DisplayHeight( _glfwLibrary.Dpy, screen );++ return 0;+}+++//========================================================================+// Change the current video mode+//========================================================================++void _glfwSetVideoModeMODE( int screen, int mode, int rate )+{+#if defined( _GLFW_HAS_XRANDR )+ XRRScreenConfiguration *sc;+ Window root;++ if( _glfwLibrary.XRandR.Available )+ {+ root = RootWindow( _glfwLibrary.Dpy, screen );+ sc = XRRGetScreenInfo( _glfwLibrary.Dpy, root );++ // Remember old size and flag that we have changed the mode+ if( !_glfwWin.FS.ModeChanged )+ {+ _glfwWin.FS.OldSizeID = XRRConfigCurrentConfiguration( sc, &_glfwWin.FS.OldRotation );+ _glfwWin.FS.OldWidth = DisplayWidth( _glfwLibrary.Dpy, screen );+ _glfwWin.FS.OldHeight = DisplayHeight( _glfwLibrary.Dpy, screen );++ _glfwWin.FS.ModeChanged = GL_TRUE;+ }++ if( rate > 0 )+ {+ // Set desired configuration+ XRRSetScreenConfigAndRate( _glfwLibrary.Dpy,+ sc,+ root,+ mode,+ RR_Rotate_0,+ (short) rate,+ CurrentTime );+ }+ else+ {+ // Set desired configuration+ XRRSetScreenConfig( _glfwLibrary.Dpy,+ sc,+ root,+ mode,+ RR_Rotate_0,+ CurrentTime );+ }++ XRRFreeScreenConfigInfo( sc );+ }+#elif defined( _GLFW_HAS_XF86VIDMODE )+ XF86VidModeModeInfo **modelist;+ int modecount;++ // Use the XF86VidMode extension to control video resolution+ if( _glfwLibrary.XF86VidMode.Available )+ {+ // Get a list of all available display modes+ XF86VidModeGetAllModeLines( _glfwLibrary.Dpy, screen,+ &modecount, &modelist );++ // Unlock mode switch if necessary+ if( _glfwWin.FS.ModeChanged )+ {+ XF86VidModeLockModeSwitch( _glfwLibrary.Dpy, screen, 0 );+ }++ // Change the video mode to the desired mode+ XF86VidModeSwitchToMode( _glfwLibrary.Dpy, screen,+ modelist[ mode ] );++ // Set viewport to upper left corner (where our window will be)+ XF86VidModeSetViewPort( _glfwLibrary.Dpy, screen, 0, 0 );++ // Lock mode switch+ XF86VidModeLockModeSwitch( _glfwLibrary.Dpy, screen, 1 );++ // Remember old mode and flag that we have changed the mode+ if( !_glfwWin.FS.ModeChanged )+ {+ _glfwWin.FS.OldMode = *modelist[ 0 ];+ _glfwWin.FS.ModeChanged = GL_TRUE;+ }++ // Free mode list+ XFree( modelist );+ }+#endif+}+++//========================================================================+// Change the current video mode+//========================================================================++void _glfwSetVideoMode( int screen, int *width, int *height, int *rate )+{+ int bestmode;++ // Find a best match mode+ bestmode = _glfwGetClosestVideoMode( screen, width, height, rate );++ // Change mode+ _glfwSetVideoModeMODE( screen, bestmode, *rate );+}++++//************************************************************************+//**** Platform implementation functions ****+//************************************************************************++struct _glfwResolution {+ int width;+ int height;+};++//========================================================================+// List available video modes+//========================================================================++int _glfwPlatformGetVideoModes( GLFWvidmode *list, int maxcount )+{+ int count, k, l, r, g, b, rgba, gl;+ int depth, screen;+ Display *dpy;+ XVisualInfo *vislist, dummy;+ int viscount, rgbcount, rescount;+ int *rgbarray;+ struct _glfwResolution *resarray;+#if defined( _GLFW_HAS_XRANDR )+ XRRScreenConfiguration *sc;+ XRRScreenSize *sizelist;+ int sizecount;+#elif defined( _GLFW_HAS_XF86VIDMODE )+ XF86VidModeModeInfo **modelist;+ int modecount, width, height;+#endif++ // Get display and screen+ dpy = _glfwLibrary.Dpy;+ screen = DefaultScreen( dpy );++ // Get list of visuals+ vislist = XGetVisualInfo( dpy, 0, &dummy, &viscount );+ if( vislist == NULL )+ {+ return 0;+ }++ rgbarray = (int*) malloc( sizeof(int) * viscount );+ rgbcount = 0;++ // Build RGB array+ for( k = 0; k < viscount; k++ )+ {+ // Does the visual support OpenGL & true color?+ glXGetConfig( dpy, &vislist[k], GLX_USE_GL, &gl );+ glXGetConfig( dpy, &vislist[k], GLX_RGBA, &rgba );+ if( gl && rgba )+ {+ // Get color depth for this visual+ depth = vislist[k].depth;++ // Convert to RGB+ _glfwBPP2RGB( depth, &r, &g, &b );+ depth = (r<<16) | (g<<8) | b;++ // Is this mode unique?+ for( l = 0; l < rgbcount; l++ )+ {+ if( depth == rgbarray[ l ] )+ {+ break;+ }+ }+ if( l >= rgbcount )+ {+ rgbarray[ rgbcount ] = depth;+ rgbcount++;+ }+ }+ }++ rescount = 0;+ resarray = NULL;++ // Build resolution array+#if defined( _GLFW_HAS_XRANDR )+ if( _glfwLibrary.XRandR.Available )+ {+ sc = XRRGetScreenInfo( dpy, RootWindow( dpy, screen ) );+ sizelist = XRRConfigSizes( sc, &sizecount );++ resarray = (struct _glfwResolution*) malloc( sizeof(struct _glfwResolution) * sizecount );++ for( k = 0; k < sizecount; k++ )+ {+ resarray[ rescount ].width = sizelist[ k ].width;+ resarray[ rescount ].height = sizelist[ k ].height;+ rescount++;+ }++ XRRFreeScreenConfigInfo( sc );+ }+#elif defined( _GLFW_HAS_XF86VIDMODE )+ if( _glfwLibrary.XF86VidMode.Available )+ {+ XF86VidModeGetAllModeLines( dpy, screen, &modecount, &modelist );++ resarray = (struct _glfwResolution*) malloc( sizeof(struct _glfwResolution) * modecount );++ for( k = 0; k < modecount; k++ )+ {+ width = modelist[ k ]->hdisplay;+ height = modelist[ k ]->vdisplay;++ // Is this mode unique?+ for( l = 0; l < rescount; l++ )+ {+ if( width == resarray[ l ].width && height == resarray[ l ].height )+ {+ break;+ }+ }+ if( l >= rescount )+ {+ resarray[ rescount ].width = width;+ resarray[ rescount ].height = height;+ rescount++;+ }+ }++ XFree( modelist );+ }+#endif++ if( !resarray )+ {+ rescount = 1;+ resarray = (struct _glfwResolution*) malloc( sizeof(struct _glfwResolution) * rescount );++ resarray[ 0 ].width = DisplayWidth( dpy, screen );+ resarray[ 0 ].height = DisplayHeight( dpy, screen );+ }++ // Build permutations of colors and resolutions+ count = 0;+ for( k = 0; k < rgbcount && count < maxcount; k++ )+ {+ for( l = 0; l < rescount && count < maxcount; l++ )+ {+ list[count].Width = resarray[ l ].width;+ list[count].Height = resarray[ l ].height;+ list[count].RedBits = (rgbarray[ k ] >> 16) & 255;+ list[count].GreenBits = (rgbarray[ k ] >> 8) & 255;+ list[count].BlueBits = rgbarray[ k ] & 255;+ count++;+ }+ }++ // Free visuals list+ XFree( vislist );++ free( resarray );+ free( rgbarray );++ return count;+}+++//========================================================================+// Get the desktop video mode+//========================================================================++void _glfwPlatformGetDesktopMode( GLFWvidmode *mode )+{+ Display *dpy;+ int bpp, screen;+#if defined( _GLFW_HAS_XF86VIDMODE )+ XF86VidModeModeInfo **modelist;+ int modecount;+#endif++ // Get display and screen+ dpy = _glfwLibrary.Dpy;+ screen = DefaultScreen( dpy );++ // Get display depth+ bpp = DefaultDepth( dpy, screen );++ // Convert BPP to RGB bits+ _glfwBPP2RGB( bpp, &mode->RedBits, &mode->GreenBits, &mode->BlueBits );++#if defined( _GLFW_HAS_XRANDR )+ if( _glfwLibrary.XRandR.Available )+ {+ if( _glfwWin.FS.ModeChanged )+ {+ mode->Width = _glfwWin.FS.OldWidth;+ mode->Height = _glfwWin.FS.OldHeight;+ return;+ }+ }+#elif defined( _GLFW_HAS_XF86VIDMODE )+ if( _glfwLibrary.XF86VidMode.Available )+ {+ if( _glfwWin.FS.ModeChanged )+ {+ // The old (desktop) mode is stored in _glfwWin.FS.OldMode+ mode->Width = _glfwWin.FS.OldMode.hdisplay;+ mode->Height = _glfwWin.FS.OldMode.vdisplay;+ }+ else+ {+ // Use the XF86VidMode extension to get list of video modes+ XF86VidModeGetAllModeLines( dpy, screen, &modecount,+ &modelist );++ // The first mode in the list is the current (desktio) mode+ mode->Width = modelist[ 0 ]->hdisplay;+ mode->Height = modelist[ 0 ]->vdisplay;++ // Free list+ XFree( modelist );+ }++ return;+ }+#endif++ // Get current display width and height+ mode->Width = DisplayWidth( dpy, screen );+ mode->Height = DisplayHeight( dpy, screen );+}+
+ glfw/lib/x11/x11_glext.c view
@@ -0,0 +1,69 @@+//========================================================================+// GLFW - An OpenGL framework+// File: x11_glext.c+// Platform: X11 (Unix)+// API version: 2.6+// WWW: http://glfw.sourceforge.net+//------------------------------------------------------------------------+// Copyright (c) 2002-2006 Camilla Berglund+//+// This software is provided 'as-is', without any express or implied+// warranty. In no event will the authors be held liable for any damages+// arising from the use of this software.+//+// Permission is granted to anyone to use this software for any purpose,+// including commercial applications, and to alter it and redistribute it+// freely, subject to the following restrictions:+//+// 1. The origin of this software must not be misrepresented; you must not+// claim that you wrote the original software. If you use this software+// in a product, an acknowledgment in the product documentation would+// be appreciated but is not required.+//+// 2. Altered source versions must be plainly marked as such, and must not+// be misrepresented as being the original software.+//+// 3. This notice may not be removed or altered from any source+// distribution.+//+//========================================================================++#include "internal.h"+++//************************************************************************+//**** Platform implementation functions ****+//************************************************************************++//========================================================================+// Check if an OpenGL extension is available at runtime+//========================================================================++int _glfwPlatformExtensionSupported( const char *extension )+{+ const GLubyte *extensions;++ // Get list of GLX extensions+ extensions = (const GLubyte*) glXQueryExtensionsString( _glfwLibrary.Dpy,+ _glfwWin.Scrn );+ if( extensions != NULL )+ {+ if( _glfwStringInExtensionString( extension, extensions ) )+ {+ return GL_TRUE;+ }+ }++ return GL_FALSE;+}+++//========================================================================+// Get the function pointer to an OpenGL function+//========================================================================++void * _glfwPlatformGetProcAddress( const char *procname )+{+ return (void *) _glfw_glXGetProcAddress( (const GLubyte *) procname );+}+
+ glfw/lib/x11/x11_init.c view
@@ -0,0 +1,275 @@+//========================================================================+// GLFW - An OpenGL framework+// File: x11_init.c+// Platform: X11 (Unix)+// API version: 2.6+// WWW: http://glfw.sourceforge.net+//------------------------------------------------------------------------+// Copyright (c) 2002-2006 Camilla Berglund+//+// This software is provided 'as-is', without any express or implied+// warranty. In no event will the authors be held liable for any damages+// arising from the use of this software.+//+// Permission is granted to anyone to use this software for any purpose,+// including commercial applications, and to alter it and redistribute it+// freely, subject to the following restrictions:+//+// 1. The origin of this software must not be misrepresented; you must not+// claim that you wrote the original software. If you use this software+// in a product, an acknowledgment in the product documentation would+// be appreciated but is not required.+//+// 2. Altered source versions must be plainly marked as such, and must not+// be misrepresented as being the original software.+//+// 3. This notice may not be removed or altered from any source+// distribution.+//+//========================================================================++#include "internal.h"++++//************************************************************************+//**** GLFW internal functions ****+//************************************************************************++//========================================================================+// Initialize GLFW thread package+//========================================================================++static void _glfwInitThreads( void )+{+ // Initialize critical section handle+#ifdef _GLFW_HAS_PTHREAD+ (void) pthread_mutex_init( &_glfwThrd.CriticalSection, NULL );+#endif++ // The first thread (the main thread) has ID 0+ _glfwThrd.NextID = 0;++ // Fill out information about the main thread (this thread)+ _glfwThrd.First.ID = _glfwThrd.NextID++;+ _glfwThrd.First.Function = NULL;+ _glfwThrd.First.Previous = NULL;+ _glfwThrd.First.Next = NULL;+#ifdef _GLFW_HAS_PTHREAD+ _glfwThrd.First.PosixID = pthread_self();+#endif+}+++//========================================================================+// Terminate GLFW thread package+//========================================================================++static void _glfwTerminateThreads( void )+{+#ifdef _GLFW_HAS_PTHREAD++ _GLFWthread *t, *t_next;++ // Enter critical section+ ENTER_THREAD_CRITICAL_SECTION++ // Kill all threads (NOTE: THE USER SHOULD WAIT FOR ALL THREADS TO+ // DIE, _BEFORE_ CALLING glfwTerminate()!!!)+ t = _glfwThrd.First.Next;+ while( t != NULL )+ {+ // Get pointer to next thread+ t_next = t->Next;++ // Simply murder the process, no mercy!+ pthread_kill( t->PosixID, SIGKILL );++ // Free memory allocated for this thread+ free( (void *) t );++ // Select next thread in list+ t = t_next;+ }++ // Leave critical section+ LEAVE_THREAD_CRITICAL_SECTION++ // Delete critical section handle+ pthread_mutex_destroy( &_glfwThrd.CriticalSection );++#endif // _GLFW_HAS_PTHREAD+}+++//========================================================================+// Dynamically load libraries+//========================================================================++#ifdef _GLFW_DLOPEN_LIBGL+static char * _glfw_libGL_name[ ] =+{+ "libGL.so",+ "libGL.so.1",+ "/usr/lib/libGL.so",+ "/usr/lib/libGL.so.1",+ NULL+};+#endif++static void _glfwInitLibraries( void )+{+#ifdef _GLFW_DLOPEN_LIBGL+ int i;++ _glfwLibrary.Libs.libGL = NULL;+ for( i = 0; !_glfw_libGL_name[ i ] != NULL; i ++ )+ {+ _glfwLibrary.Libs.libGL = dlopen( _glfw_libGL_name[ i ],+ RTLD_LAZY | RTLD_GLOBAL );+ if( _glfwLibrary.Libs.libGL )+ break;+ }+#endif+}+++//========================================================================+// Terminate GLFW when exiting application+//========================================================================++void _glfwTerminate_atexit(int c, void* p)+{+ glfwTerminate();+}+++//========================================================================+// Initialize X11 display+//========================================================================++static int _glfwInitDisplay( void )+{+ // Open display+ _glfwLibrary.Dpy = XOpenDisplay( 0 );+ if( !_glfwLibrary.Dpy )+ {+ return GL_FALSE;+ }++ // Check screens+ _glfwLibrary.NumScreens = ScreenCount( _glfwLibrary.Dpy );+ _glfwLibrary.DefaultScreen = DefaultScreen( _glfwLibrary.Dpy );++ // Check for XF86VidMode extension+#ifdef _GLFW_HAS_XF86VIDMODE+ _glfwLibrary.XF86VidMode.Available =+ XF86VidModeQueryExtension( _glfwLibrary.Dpy,+ &_glfwLibrary.XF86VidMode.EventBase,+ &_glfwLibrary.XF86VidMode.ErrorBase);+#else+ _glfwLibrary.XF86VidMode.Available = 0;+#endif++ // Check for XRandR extension+#ifdef _GLFW_HAS_XRANDR+ _glfwLibrary.XRandR.Available =+ XRRQueryExtension( _glfwLibrary.Dpy,+ &_glfwLibrary.XRandR.EventBase,+ &_glfwLibrary.XRandR.ErrorBase );+#else+ _glfwLibrary.XRandR.Available = 0;+#endif++ return GL_TRUE;+}+++//========================================================================+// Terminate X11 display+//========================================================================++static void _glfwTerminateDisplay( void )+{+ // Open display+ if( _glfwLibrary.Dpy )+ {+ XCloseDisplay( _glfwLibrary.Dpy );+ _glfwLibrary.Dpy = NULL;+ }+}+++//************************************************************************+//**** Platform implementation functions ****+//************************************************************************++//========================================================================+// Initialize various GLFW state+//========================================================================++int _glfwPlatformInit( void )+{+ // Initialize display+ if( !_glfwInitDisplay() )+ {+ return GL_FALSE;+ }++ // Initialize thread package+ _glfwInitThreads();++ // Try to load libGL.so if necessary+ _glfwInitLibraries();++ // Install atexit() routine+ on_exit( _glfwTerminate_atexit, NULL );++ // Initialize joysticks+ _glfwInitJoysticks();++ // Start the timer+ _glfwInitTimer();++ return GL_TRUE;+}+++//========================================================================+// Close window and kill all threads+//========================================================================++int _glfwPlatformTerminate( void )+{+#ifdef _GLFW_HAS_PTHREAD+ // Only the main thread is allowed to do this...+ if( pthread_self() != _glfwThrd.First.PosixID )+ {+ return GL_FALSE;+ }+#endif // _GLFW_HAS_PTHREAD++ // Close OpenGL window+ glfwCloseWindow();++ // Kill thread package+ _glfwTerminateThreads();++ // Terminate display+ _glfwTerminateDisplay();++ // Terminate joysticks+ _glfwTerminateJoysticks();++ // Unload libGL.so if necessary+#ifdef _GLFW_DLOPEN_LIBGL+ if( _glfwLibrary.Libs.libGL != NULL )+ {+ dlclose( _glfwLibrary.Libs.libGL );+ _glfwLibrary.Libs.libGL = NULL;+ }+#endif++ return GL_TRUE;+}+
+ glfw/lib/x11/x11_joystick.c view
@@ -0,0 +1,371 @@+//========================================================================+// GLFW - An OpenGL framework+// File: x11_joystick.c+// Platform: X11 (Unix)+// API version: 2.6+// WWW: http://glfw.sourceforge.net+//------------------------------------------------------------------------+// Copyright (c) 2002-2006 Camilla Berglund+//+// This software is provided 'as-is', without any express or implied+// warranty. In no event will the authors be held liable for any damages+// arising from the use of this software.+//+// Permission is granted to anyone to use this software for any purpose,+// including commercial applications, and to alter it and redistribute it+// freely, subject to the following restrictions:+//+// 1. The origin of this software must not be misrepresented; you must not+// claim that you wrote the original software. If you use this software+// in a product, an acknowledgment in the product documentation would+// be appreciated but is not required.+//+// 2. Altered source versions must be plainly marked as such, and must not+// be misrepresented as being the original software.+//+// 3. This notice may not be removed or altered from any source+// distribution.+//+//========================================================================++#include "internal.h"+++//========================================================================+// Note: Only Linux joystick input is supported at the moment. Other+// systems will behave as if there are no joysticks connected.+//========================================================================++#ifdef linux+#define _GLFW_USE_LINUX_JOYSTICKS+#endif // linux++++//************************************************************************+//**** GLFW internal functions ****+//************************************************************************++#ifdef _GLFW_USE_LINUX_JOYSTICKS++//------------------------------------------------------------------------+// Here are the Linux joystick driver v1.x interface definitions that we+// use (we do not want to rely on <linux/joystick.h>):+//------------------------------------------------------------------------++#include <sys/ioctl.h>+#include <fcntl.h>+#include <errno.h>++// Joystick event types+#define JS_EVENT_BUTTON 0x01 /* button pressed/released */+#define JS_EVENT_AXIS 0x02 /* joystick moved */+#define JS_EVENT_INIT 0x80 /* initial state of device */++// Joystick event structure+struct js_event {+ unsigned int time; /* (u32) event timestamp in milliseconds */+ signed short value; /* (s16) value */+ unsigned char type; /* (u8) event type */+ unsigned char number; /* (u8) axis/button number */+};++// Joystick IOCTL commands+#define JSIOCGVERSION _IOR('j', 0x01, int) /* get driver version (u32) */+#define JSIOCGAXES _IOR('j', 0x11, char) /* get number of axes (u8) */+#define JSIOCGBUTTONS _IOR('j', 0x12, char) /* get number of buttons (u8) */++#endif // _GLFW_USE_LINUX_JOYSTICKS+++//========================================================================+// _glfwInitJoysticks() - Initialize joystick interface+//========================================================================++void _glfwInitJoysticks( void )+{+#ifdef _GLFW_USE_LINUX_JOYSTICKS+ int k, n, fd, joy_count;+ char *joy_base_name, joy_dev_name[ 20 ];+ int driver_version = 0x000800;+ char ret_data;+#endif // _GLFW_USE_LINUX_JOYSTICKS+ int i;++ // Start by saying that there are no sticks+ for( i = 0; i <= GLFW_JOYSTICK_LAST; ++ i )+ {+ _glfwJoy[ i ].Present = GL_FALSE;+ }++#ifdef _GLFW_USE_LINUX_JOYSTICKS++ // Try to open joysticks (nonblocking)+ joy_count = 0;+ for( k = 0; k <= 1 && joy_count <= GLFW_JOYSTICK_LAST; ++ k )+ {+ // Pick joystick base name+ switch( k )+ {+ case 0:+ joy_base_name = "/dev/input/js"; // USB sticks+ break;+ case 1:+ joy_base_name = "/dev/js"; // "Legacy" sticks+ break;+ default:+ continue; // (should never happen)+ }++ // Try to open a few of these sticks+ for( i = 0; i <= 50 && joy_count <= GLFW_JOYSTICK_LAST; ++ i )+ {+ sprintf( joy_dev_name, "%s%d", joy_base_name, i );+ fd = open( joy_dev_name, O_NONBLOCK );+ if( fd != -1 )+ {+ // Remember fd+ _glfwJoy[ joy_count ].fd = fd;+ + // Check that the joystick driver version is 1.0++ ioctl( fd, JSIOCGVERSION, &driver_version );+ if( driver_version < 0x010000 )+ {+ // It's an old 0.x interface (we don't support it)+ close( fd );+ continue;+ }+ + // Get number of joystick axes+ ioctl( fd, JSIOCGAXES, &ret_data );+ _glfwJoy[ joy_count ].NumAxes = (int) ret_data;+ + // Get number of joystick buttons+ ioctl( fd, JSIOCGBUTTONS, &ret_data );+ _glfwJoy[ joy_count ].NumButtons = (int) ret_data;+ + // Allocate memory for joystick state+ _glfwJoy[ joy_count ].Axis =+ (float *) malloc( sizeof(float) *+ _glfwJoy[ joy_count ].NumAxes );+ if( _glfwJoy[ joy_count ].Axis == NULL )+ {+ close( fd );+ continue;+ }+ _glfwJoy[ joy_count ].Button =+ (char *) malloc( sizeof(char) *+ _glfwJoy[ joy_count ].NumButtons );+ if( _glfwJoy[ joy_count ].Button == NULL )+ {+ free( _glfwJoy[ joy_count ].Axis );+ close( fd );+ continue;+ }++ // Clear joystick state+ for( n = 0; n < _glfwJoy[ joy_count ].NumAxes; ++ n )+ {+ _glfwJoy[ joy_count ].Axis[ n ] = 0.0f;+ }+ for( n = 0; n < _glfwJoy[ joy_count ].NumButtons; ++ n )+ {+ _glfwJoy[ joy_count ].Button[ n ] = GLFW_RELEASE;+ }+ + // The joystick is supported and connected+ _glfwJoy[ joy_count ].Present = GL_TRUE;+ joy_count ++;+ }+ }+ }++#endif // _GLFW_USE_LINUX_JOYSTICKS++}+++//========================================================================+// _glfwTerminateJoysticks() - Close all opened joystick handles+//========================================================================++void _glfwTerminateJoysticks( void )+{++#ifdef _GLFW_USE_LINUX_JOYSTICKS++ int i;++ // Close any opened joysticks+ for( i = 0; i <= GLFW_JOYSTICK_LAST; ++ i )+ {+ if( _glfwJoy[ i ].Present )+ {+ close( _glfwJoy[ i ].fd );+ free( _glfwJoy[ i ].Axis );+ free( _glfwJoy[ i ].Button );+ _glfwJoy[ i ].Present = GL_FALSE;+ }+ }++#endif // _GLFW_USE_LINUX_JOYSTICKS++}+++//========================================================================+// _glfwPollJoystickEvents() - Empty joystick event queue+//========================================================================++static void _glfwPollJoystickEvents( void )+{++#ifdef _GLFW_USE_LINUX_JOYSTICKS++ struct js_event e;+ int i;++ // Get joystick events for all GLFW joysticks+ for( i = 0; i <= GLFW_JOYSTICK_LAST; ++ i )+ {+ // Is the stick present?+ if( _glfwJoy[ i ].Present )+ {+ // Read all queued events (non-blocking)+ while( read(_glfwJoy[i].fd, &e, sizeof(struct js_event)) > 0 )+ {+ // We don't care if it's an init event or not+ e.type &= ~JS_EVENT_INIT;++ // Check event type+ switch( e.type )+ {+ case JS_EVENT_AXIS:+ _glfwJoy[ i ].Axis[ e.number ] = (float) e.value /+ 32767.0f;+ // We need to change the sign for the Y axes, so that+ // positive = up/forward, according to the GLFW spec.+ if( e.number & 1 )+ {+ _glfwJoy[ i ].Axis[ e.number ] =+ -_glfwJoy[ i ].Axis[ e.number ];+ }+ break;++ case JS_EVENT_BUTTON:+ _glfwJoy[ i ].Button[ e.number ] =+ e.value ? GLFW_PRESS : GLFW_RELEASE;+ break;++ default:+ break;+ }+ }+ }+ }++#endif // _GLFW_USE_LINUX_JOYSTICKS++}+++//************************************************************************+//**** Platform implementation functions ****+//************************************************************************++//========================================================================+// _glfwPlatformGetJoystickParam() - Determine joystick capabilities+//========================================================================++int _glfwPlatformGetJoystickParam( int joy, int param )+{+ // Is joystick present?+ if( !_glfwJoy[ joy ].Present )+ {+ return 0;+ }++ switch( param )+ {+ case GLFW_PRESENT:+ return GL_TRUE;++ case GLFW_AXES:+ return _glfwJoy[ joy ].NumAxes;++ case GLFW_BUTTONS:+ return _glfwJoy[ joy ].NumButtons;++ default:+ break;+ }++ return 0;+}+++//========================================================================+// _glfwPlatformGetJoystickPos() - Get joystick axis positions+//========================================================================++int _glfwPlatformGetJoystickPos( int joy, float *pos, int numaxes )+{+ int i;++ // Is joystick present?+ if( !_glfwJoy[ joy ].Present )+ {+ return 0;+ }++ // Update joystick state+ _glfwPollJoystickEvents();++ // Does the joystick support less axes than requested?+ if( _glfwJoy[ joy ].NumAxes < numaxes )+ {+ numaxes = _glfwJoy[ joy ].NumAxes;+ }++ // Copy axis positions from internal state+ for( i = 0; i < numaxes; ++ i )+ {+ pos[ i ] = _glfwJoy[ joy ].Axis[ i ];+ }++ return numaxes;+}+++//========================================================================+// _glfwPlatformGetJoystickButtons() - Get joystick button states+//========================================================================++int _glfwPlatformGetJoystickButtons( int joy, unsigned char *buttons,+ int numbuttons )+{+ int i;++ // Is joystick present?+ if( !_glfwJoy[ joy ].Present )+ {+ return 0;+ }++ // Update joystick state+ _glfwPollJoystickEvents();++ // Does the joystick support less buttons than requested?+ if( _glfwJoy[ joy ].NumButtons < numbuttons )+ {+ numbuttons = _glfwJoy[ joy ].NumButtons;+ }++ // Copy button states from internal state+ for( i = 0; i < numbuttons; ++ i )+ {+ buttons[ i ] = _glfwJoy[ joy ].Button[ i ];+ }++ return numbuttons;+}
+ glfw/lib/x11/x11_keysym2unicode.c view
@@ -0,0 +1,902 @@+//========================================================================+// GLFW - An OpenGL framework+// File: x11_keysym2unicode.c+// Platform: X11 (Unix)+// API version: 2.6+// WWW: http://glfw.sourceforge.net+//------------------------------------------------------------------------+// Copyright (c) 2002-2006 Camilla Berglund+//+// This software is provided 'as-is', without any express or implied+// warranty. In no event will the authors be held liable for any damages+// arising from the use of this software.+//+// Permission is granted to anyone to use this software for any purpose,+// including commercial applications, and to alter it and redistribute it+// freely, subject to the following restrictions:+//+// 1. The origin of this software must not be misrepresented; you must not+// claim that you wrote the original software. If you use this software+// in a product, an acknowledgment in the product documentation would+// be appreciated but is not required.+//+// 2. Altered source versions must be plainly marked as such, and must not+// be misrepresented as being the original software.+//+// 3. This notice may not be removed or altered from any source+// distribution.+//+//========================================================================++#include "internal.h"+++/*+ * Marcus: This code was originally written by Markus G. Kuhn.+ * I have made some slight changes (trimmed it down a bit from >60 KB to+ * 20 KB), but the functionality is the same.+ */++/*+ * This module converts keysym values into the corresponding ISO 10646+ * (UCS, Unicode) values.+ *+ * The array keysymtab[] contains pairs of X11 keysym values for graphical+ * characters and the corresponding Unicode value. The function+ * _glfwKeySym2Unicode() maps a keysym onto a Unicode value using a binary+ * search, therefore keysymtab[] must remain SORTED by keysym value.+ *+ * We allow to represent any UCS character in the range U-00000000 to+ * U-00FFFFFF by a keysym value in the range 0x01000000 to 0x01ffffff.+ * This admittedly does not cover the entire 31-bit space of UCS, but+ * it does cover all of the characters up to U-10FFFF, which can be+ * represented by UTF-16, and more, and it is very unlikely that higher+ * UCS codes will ever be assigned by ISO. So to get Unicode character+ * U+ABCD you can directly use keysym 0x0100abcd.+ *+ * Original author: Markus G. Kuhn <mkuhn@acm.org>, University of+ * Cambridge, April 2001+ *+ * Special thanks to Richard Verhoeven <river@win.tue.nl> for preparing+ * an initial draft of the mapping table.+ *+ */+++//************************************************************************+//**** KeySym to Unicode mapping table ****+//************************************************************************++static struct codepair {+ unsigned short keysym;+ unsigned short ucs;+} keysymtab[] = {+ { 0x01a1, 0x0104 },+ { 0x01a2, 0x02d8 },+ { 0x01a3, 0x0141 },+ { 0x01a5, 0x013d },+ { 0x01a6, 0x015a },+ { 0x01a9, 0x0160 },+ { 0x01aa, 0x015e },+ { 0x01ab, 0x0164 },+ { 0x01ac, 0x0179 },+ { 0x01ae, 0x017d },+ { 0x01af, 0x017b },+ { 0x01b1, 0x0105 },+ { 0x01b2, 0x02db },+ { 0x01b3, 0x0142 },+ { 0x01b5, 0x013e },+ { 0x01b6, 0x015b },+ { 0x01b7, 0x02c7 },+ { 0x01b9, 0x0161 },+ { 0x01ba, 0x015f },+ { 0x01bb, 0x0165 },+ { 0x01bc, 0x017a },+ { 0x01bd, 0x02dd },+ { 0x01be, 0x017e },+ { 0x01bf, 0x017c },+ { 0x01c0, 0x0154 },+ { 0x01c3, 0x0102 },+ { 0x01c5, 0x0139 },+ { 0x01c6, 0x0106 },+ { 0x01c8, 0x010c },+ { 0x01ca, 0x0118 },+ { 0x01cc, 0x011a },+ { 0x01cf, 0x010e },+ { 0x01d0, 0x0110 },+ { 0x01d1, 0x0143 },+ { 0x01d2, 0x0147 },+ { 0x01d5, 0x0150 },+ { 0x01d8, 0x0158 },+ { 0x01d9, 0x016e },+ { 0x01db, 0x0170 },+ { 0x01de, 0x0162 },+ { 0x01e0, 0x0155 },+ { 0x01e3, 0x0103 },+ { 0x01e5, 0x013a },+ { 0x01e6, 0x0107 },+ { 0x01e8, 0x010d },+ { 0x01ea, 0x0119 },+ { 0x01ec, 0x011b },+ { 0x01ef, 0x010f },+ { 0x01f0, 0x0111 },+ { 0x01f1, 0x0144 },+ { 0x01f2, 0x0148 },+ { 0x01f5, 0x0151 },+ { 0x01f8, 0x0159 },+ { 0x01f9, 0x016f },+ { 0x01fb, 0x0171 },+ { 0x01fe, 0x0163 },+ { 0x01ff, 0x02d9 },+ { 0x02a1, 0x0126 },+ { 0x02a6, 0x0124 },+ { 0x02a9, 0x0130 },+ { 0x02ab, 0x011e },+ { 0x02ac, 0x0134 },+ { 0x02b1, 0x0127 },+ { 0x02b6, 0x0125 },+ { 0x02b9, 0x0131 },+ { 0x02bb, 0x011f },+ { 0x02bc, 0x0135 },+ { 0x02c5, 0x010a },+ { 0x02c6, 0x0108 },+ { 0x02d5, 0x0120 },+ { 0x02d8, 0x011c },+ { 0x02dd, 0x016c },+ { 0x02de, 0x015c },+ { 0x02e5, 0x010b },+ { 0x02e6, 0x0109 },+ { 0x02f5, 0x0121 },+ { 0x02f8, 0x011d },+ { 0x02fd, 0x016d },+ { 0x02fe, 0x015d },+ { 0x03a2, 0x0138 },+ { 0x03a3, 0x0156 },+ { 0x03a5, 0x0128 },+ { 0x03a6, 0x013b },+ { 0x03aa, 0x0112 },+ { 0x03ab, 0x0122 },+ { 0x03ac, 0x0166 },+ { 0x03b3, 0x0157 },+ { 0x03b5, 0x0129 },+ { 0x03b6, 0x013c },+ { 0x03ba, 0x0113 },+ { 0x03bb, 0x0123 },+ { 0x03bc, 0x0167 },+ { 0x03bd, 0x014a },+ { 0x03bf, 0x014b },+ { 0x03c0, 0x0100 },+ { 0x03c7, 0x012e },+ { 0x03cc, 0x0116 },+ { 0x03cf, 0x012a },+ { 0x03d1, 0x0145 },+ { 0x03d2, 0x014c },+ { 0x03d3, 0x0136 },+ { 0x03d9, 0x0172 },+ { 0x03dd, 0x0168 },+ { 0x03de, 0x016a },+ { 0x03e0, 0x0101 },+ { 0x03e7, 0x012f },+ { 0x03ec, 0x0117 },+ { 0x03ef, 0x012b },+ { 0x03f1, 0x0146 },+ { 0x03f2, 0x014d },+ { 0x03f3, 0x0137 },+ { 0x03f9, 0x0173 },+ { 0x03fd, 0x0169 },+ { 0x03fe, 0x016b },+ { 0x047e, 0x203e },+ { 0x04a1, 0x3002 },+ { 0x04a2, 0x300c },+ { 0x04a3, 0x300d },+ { 0x04a4, 0x3001 },+ { 0x04a5, 0x30fb },+ { 0x04a6, 0x30f2 },+ { 0x04a7, 0x30a1 },+ { 0x04a8, 0x30a3 },+ { 0x04a9, 0x30a5 },+ { 0x04aa, 0x30a7 },+ { 0x04ab, 0x30a9 },+ { 0x04ac, 0x30e3 },+ { 0x04ad, 0x30e5 },+ { 0x04ae, 0x30e7 },+ { 0x04af, 0x30c3 },+ { 0x04b0, 0x30fc },+ { 0x04b1, 0x30a2 },+ { 0x04b2, 0x30a4 },+ { 0x04b3, 0x30a6 },+ { 0x04b4, 0x30a8 },+ { 0x04b5, 0x30aa },+ { 0x04b6, 0x30ab },+ { 0x04b7, 0x30ad },+ { 0x04b8, 0x30af },+ { 0x04b9, 0x30b1 },+ { 0x04ba, 0x30b3 },+ { 0x04bb, 0x30b5 },+ { 0x04bc, 0x30b7 },+ { 0x04bd, 0x30b9 },+ { 0x04be, 0x30bb },+ { 0x04bf, 0x30bd },+ { 0x04c0, 0x30bf },+ { 0x04c1, 0x30c1 },+ { 0x04c2, 0x30c4 },+ { 0x04c3, 0x30c6 },+ { 0x04c4, 0x30c8 },+ { 0x04c5, 0x30ca },+ { 0x04c6, 0x30cb },+ { 0x04c7, 0x30cc },+ { 0x04c8, 0x30cd },+ { 0x04c9, 0x30ce },+ { 0x04ca, 0x30cf },+ { 0x04cb, 0x30d2 },+ { 0x04cc, 0x30d5 },+ { 0x04cd, 0x30d8 },+ { 0x04ce, 0x30db },+ { 0x04cf, 0x30de },+ { 0x04d0, 0x30df },+ { 0x04d1, 0x30e0 },+ { 0x04d2, 0x30e1 },+ { 0x04d3, 0x30e2 },+ { 0x04d4, 0x30e4 },+ { 0x04d5, 0x30e6 },+ { 0x04d6, 0x30e8 },+ { 0x04d7, 0x30e9 },+ { 0x04d8, 0x30ea },+ { 0x04d9, 0x30eb },+ { 0x04da, 0x30ec },+ { 0x04db, 0x30ed },+ { 0x04dc, 0x30ef },+ { 0x04dd, 0x30f3 },+ { 0x04de, 0x309b },+ { 0x04df, 0x309c },+ { 0x05ac, 0x060c },+ { 0x05bb, 0x061b },+ { 0x05bf, 0x061f },+ { 0x05c1, 0x0621 },+ { 0x05c2, 0x0622 },+ { 0x05c3, 0x0623 },+ { 0x05c4, 0x0624 },+ { 0x05c5, 0x0625 },+ { 0x05c6, 0x0626 },+ { 0x05c7, 0x0627 },+ { 0x05c8, 0x0628 },+ { 0x05c9, 0x0629 },+ { 0x05ca, 0x062a },+ { 0x05cb, 0x062b },+ { 0x05cc, 0x062c },+ { 0x05cd, 0x062d },+ { 0x05ce, 0x062e },+ { 0x05cf, 0x062f },+ { 0x05d0, 0x0630 },+ { 0x05d1, 0x0631 },+ { 0x05d2, 0x0632 },+ { 0x05d3, 0x0633 },+ { 0x05d4, 0x0634 },+ { 0x05d5, 0x0635 },+ { 0x05d6, 0x0636 },+ { 0x05d7, 0x0637 },+ { 0x05d8, 0x0638 },+ { 0x05d9, 0x0639 },+ { 0x05da, 0x063a },+ { 0x05e0, 0x0640 },+ { 0x05e1, 0x0641 },+ { 0x05e2, 0x0642 },+ { 0x05e3, 0x0643 },+ { 0x05e4, 0x0644 },+ { 0x05e5, 0x0645 },+ { 0x05e6, 0x0646 },+ { 0x05e7, 0x0647 },+ { 0x05e8, 0x0648 },+ { 0x05e9, 0x0649 },+ { 0x05ea, 0x064a },+ { 0x05eb, 0x064b },+ { 0x05ec, 0x064c },+ { 0x05ed, 0x064d },+ { 0x05ee, 0x064e },+ { 0x05ef, 0x064f },+ { 0x05f0, 0x0650 },+ { 0x05f1, 0x0651 },+ { 0x05f2, 0x0652 },+ { 0x06a1, 0x0452 },+ { 0x06a2, 0x0453 },+ { 0x06a3, 0x0451 },+ { 0x06a4, 0x0454 },+ { 0x06a5, 0x0455 },+ { 0x06a6, 0x0456 },+ { 0x06a7, 0x0457 },+ { 0x06a8, 0x0458 },+ { 0x06a9, 0x0459 },+ { 0x06aa, 0x045a },+ { 0x06ab, 0x045b },+ { 0x06ac, 0x045c },+ { 0x06ae, 0x045e },+ { 0x06af, 0x045f },+ { 0x06b0, 0x2116 },+ { 0x06b1, 0x0402 },+ { 0x06b2, 0x0403 },+ { 0x06b3, 0x0401 },+ { 0x06b4, 0x0404 },+ { 0x06b5, 0x0405 },+ { 0x06b6, 0x0406 },+ { 0x06b7, 0x0407 },+ { 0x06b8, 0x0408 },+ { 0x06b9, 0x0409 },+ { 0x06ba, 0x040a },+ { 0x06bb, 0x040b },+ { 0x06bc, 0x040c },+ { 0x06be, 0x040e },+ { 0x06bf, 0x040f },+ { 0x06c0, 0x044e },+ { 0x06c1, 0x0430 },+ { 0x06c2, 0x0431 },+ { 0x06c3, 0x0446 },+ { 0x06c4, 0x0434 },+ { 0x06c5, 0x0435 },+ { 0x06c6, 0x0444 },+ { 0x06c7, 0x0433 },+ { 0x06c8, 0x0445 },+ { 0x06c9, 0x0438 },+ { 0x06ca, 0x0439 },+ { 0x06cb, 0x043a },+ { 0x06cc, 0x043b },+ { 0x06cd, 0x043c },+ { 0x06ce, 0x043d },+ { 0x06cf, 0x043e },+ { 0x06d0, 0x043f },+ { 0x06d1, 0x044f },+ { 0x06d2, 0x0440 },+ { 0x06d3, 0x0441 },+ { 0x06d4, 0x0442 },+ { 0x06d5, 0x0443 },+ { 0x06d6, 0x0436 },+ { 0x06d7, 0x0432 },+ { 0x06d8, 0x044c },+ { 0x06d9, 0x044b },+ { 0x06da, 0x0437 },+ { 0x06db, 0x0448 },+ { 0x06dc, 0x044d },+ { 0x06dd, 0x0449 },+ { 0x06de, 0x0447 },+ { 0x06df, 0x044a },+ { 0x06e0, 0x042e },+ { 0x06e1, 0x0410 },+ { 0x06e2, 0x0411 },+ { 0x06e3, 0x0426 },+ { 0x06e4, 0x0414 },+ { 0x06e5, 0x0415 },+ { 0x06e6, 0x0424 },+ { 0x06e7, 0x0413 },+ { 0x06e8, 0x0425 },+ { 0x06e9, 0x0418 },+ { 0x06ea, 0x0419 },+ { 0x06eb, 0x041a },+ { 0x06ec, 0x041b },+ { 0x06ed, 0x041c },+ { 0x06ee, 0x041d },+ { 0x06ef, 0x041e },+ { 0x06f0, 0x041f },+ { 0x06f1, 0x042f },+ { 0x06f2, 0x0420 },+ { 0x06f3, 0x0421 },+ { 0x06f4, 0x0422 },+ { 0x06f5, 0x0423 },+ { 0x06f6, 0x0416 },+ { 0x06f7, 0x0412 },+ { 0x06f8, 0x042c },+ { 0x06f9, 0x042b },+ { 0x06fa, 0x0417 },+ { 0x06fb, 0x0428 },+ { 0x06fc, 0x042d },+ { 0x06fd, 0x0429 },+ { 0x06fe, 0x0427 },+ { 0x06ff, 0x042a },+ { 0x07a1, 0x0386 },+ { 0x07a2, 0x0388 },+ { 0x07a3, 0x0389 },+ { 0x07a4, 0x038a },+ { 0x07a5, 0x03aa },+ { 0x07a7, 0x038c },+ { 0x07a8, 0x038e },+ { 0x07a9, 0x03ab },+ { 0x07ab, 0x038f },+ { 0x07ae, 0x0385 },+ { 0x07af, 0x2015 },+ { 0x07b1, 0x03ac },+ { 0x07b2, 0x03ad },+ { 0x07b3, 0x03ae },+ { 0x07b4, 0x03af },+ { 0x07b5, 0x03ca },+ { 0x07b6, 0x0390 },+ { 0x07b7, 0x03cc },+ { 0x07b8, 0x03cd },+ { 0x07b9, 0x03cb },+ { 0x07ba, 0x03b0 },+ { 0x07bb, 0x03ce },+ { 0x07c1, 0x0391 },+ { 0x07c2, 0x0392 },+ { 0x07c3, 0x0393 },+ { 0x07c4, 0x0394 },+ { 0x07c5, 0x0395 },+ { 0x07c6, 0x0396 },+ { 0x07c7, 0x0397 },+ { 0x07c8, 0x0398 },+ { 0x07c9, 0x0399 },+ { 0x07ca, 0x039a },+ { 0x07cb, 0x039b },+ { 0x07cc, 0x039c },+ { 0x07cd, 0x039d },+ { 0x07ce, 0x039e },+ { 0x07cf, 0x039f },+ { 0x07d0, 0x03a0 },+ { 0x07d1, 0x03a1 },+ { 0x07d2, 0x03a3 },+ { 0x07d4, 0x03a4 },+ { 0x07d5, 0x03a5 },+ { 0x07d6, 0x03a6 },+ { 0x07d7, 0x03a7 },+ { 0x07d8, 0x03a8 },+ { 0x07d9, 0x03a9 },+ { 0x07e1, 0x03b1 },+ { 0x07e2, 0x03b2 },+ { 0x07e3, 0x03b3 },+ { 0x07e4, 0x03b4 },+ { 0x07e5, 0x03b5 },+ { 0x07e6, 0x03b6 },+ { 0x07e7, 0x03b7 },+ { 0x07e8, 0x03b8 },+ { 0x07e9, 0x03b9 },+ { 0x07ea, 0x03ba },+ { 0x07eb, 0x03bb },+ { 0x07ec, 0x03bc },+ { 0x07ed, 0x03bd },+ { 0x07ee, 0x03be },+ { 0x07ef, 0x03bf },+ { 0x07f0, 0x03c0 },+ { 0x07f1, 0x03c1 },+ { 0x07f2, 0x03c3 },+ { 0x07f3, 0x03c2 },+ { 0x07f4, 0x03c4 },+ { 0x07f5, 0x03c5 },+ { 0x07f6, 0x03c6 },+ { 0x07f7, 0x03c7 },+ { 0x07f8, 0x03c8 },+ { 0x07f9, 0x03c9 },+ { 0x08a1, 0x23b7 },+ { 0x08a2, 0x250c },+ { 0x08a3, 0x2500 },+ { 0x08a4, 0x2320 },+ { 0x08a5, 0x2321 },+ { 0x08a6, 0x2502 },+ { 0x08a7, 0x23a1 },+ { 0x08a8, 0x23a3 },+ { 0x08a9, 0x23a4 },+ { 0x08aa, 0x23a6 },+ { 0x08ab, 0x239b },+ { 0x08ac, 0x239d },+ { 0x08ad, 0x239e },+ { 0x08ae, 0x23a0 },+ { 0x08af, 0x23a8 },+ { 0x08b0, 0x23ac },+ { 0x08bc, 0x2264 },+ { 0x08bd, 0x2260 },+ { 0x08be, 0x2265 },+ { 0x08bf, 0x222b },+ { 0x08c0, 0x2234 },+ { 0x08c1, 0x221d },+ { 0x08c2, 0x221e },+ { 0x08c5, 0x2207 },+ { 0x08c8, 0x223c },+ { 0x08c9, 0x2243 },+ { 0x08cd, 0x21d4 },+ { 0x08ce, 0x21d2 },+ { 0x08cf, 0x2261 },+ { 0x08d6, 0x221a },+ { 0x08da, 0x2282 },+ { 0x08db, 0x2283 },+ { 0x08dc, 0x2229 },+ { 0x08dd, 0x222a },+ { 0x08de, 0x2227 },+ { 0x08df, 0x2228 },+ { 0x08ef, 0x2202 },+ { 0x08f6, 0x0192 },+ { 0x08fb, 0x2190 },+ { 0x08fc, 0x2191 },+ { 0x08fd, 0x2192 },+ { 0x08fe, 0x2193 },+ { 0x09e0, 0x25c6 },+ { 0x09e1, 0x2592 },+ { 0x09e2, 0x2409 },+ { 0x09e3, 0x240c },+ { 0x09e4, 0x240d },+ { 0x09e5, 0x240a },+ { 0x09e8, 0x2424 },+ { 0x09e9, 0x240b },+ { 0x09ea, 0x2518 },+ { 0x09eb, 0x2510 },+ { 0x09ec, 0x250c },+ { 0x09ed, 0x2514 },+ { 0x09ee, 0x253c },+ { 0x09ef, 0x23ba },+ { 0x09f0, 0x23bb },+ { 0x09f1, 0x2500 },+ { 0x09f2, 0x23bc },+ { 0x09f3, 0x23bd },+ { 0x09f4, 0x251c },+ { 0x09f5, 0x2524 },+ { 0x09f6, 0x2534 },+ { 0x09f7, 0x252c },+ { 0x09f8, 0x2502 },+ { 0x0aa1, 0x2003 },+ { 0x0aa2, 0x2002 },+ { 0x0aa3, 0x2004 },+ { 0x0aa4, 0x2005 },+ { 0x0aa5, 0x2007 },+ { 0x0aa6, 0x2008 },+ { 0x0aa7, 0x2009 },+ { 0x0aa8, 0x200a },+ { 0x0aa9, 0x2014 },+ { 0x0aaa, 0x2013 },+ { 0x0aae, 0x2026 },+ { 0x0aaf, 0x2025 },+ { 0x0ab0, 0x2153 },+ { 0x0ab1, 0x2154 },+ { 0x0ab2, 0x2155 },+ { 0x0ab3, 0x2156 },+ { 0x0ab4, 0x2157 },+ { 0x0ab5, 0x2158 },+ { 0x0ab6, 0x2159 },+ { 0x0ab7, 0x215a },+ { 0x0ab8, 0x2105 },+ { 0x0abb, 0x2012 },+ { 0x0abc, 0x2329 },+ { 0x0abe, 0x232a },+ { 0x0ac3, 0x215b },+ { 0x0ac4, 0x215c },+ { 0x0ac5, 0x215d },+ { 0x0ac6, 0x215e },+ { 0x0ac9, 0x2122 },+ { 0x0aca, 0x2613 },+ { 0x0acc, 0x25c1 },+ { 0x0acd, 0x25b7 },+ { 0x0ace, 0x25cb },+ { 0x0acf, 0x25af },+ { 0x0ad0, 0x2018 },+ { 0x0ad1, 0x2019 },+ { 0x0ad2, 0x201c },+ { 0x0ad3, 0x201d },+ { 0x0ad4, 0x211e },+ { 0x0ad6, 0x2032 },+ { 0x0ad7, 0x2033 },+ { 0x0ad9, 0x271d },+ { 0x0adb, 0x25ac },+ { 0x0adc, 0x25c0 },+ { 0x0add, 0x25b6 },+ { 0x0ade, 0x25cf },+ { 0x0adf, 0x25ae },+ { 0x0ae0, 0x25e6 },+ { 0x0ae1, 0x25ab },+ { 0x0ae2, 0x25ad },+ { 0x0ae3, 0x25b3 },+ { 0x0ae4, 0x25bd },+ { 0x0ae5, 0x2606 },+ { 0x0ae6, 0x2022 },+ { 0x0ae7, 0x25aa },+ { 0x0ae8, 0x25b2 },+ { 0x0ae9, 0x25bc },+ { 0x0aea, 0x261c },+ { 0x0aeb, 0x261e },+ { 0x0aec, 0x2663 },+ { 0x0aed, 0x2666 },+ { 0x0aee, 0x2665 },+ { 0x0af0, 0x2720 },+ { 0x0af1, 0x2020 },+ { 0x0af2, 0x2021 },+ { 0x0af3, 0x2713 },+ { 0x0af4, 0x2717 },+ { 0x0af5, 0x266f },+ { 0x0af6, 0x266d },+ { 0x0af7, 0x2642 },+ { 0x0af8, 0x2640 },+ { 0x0af9, 0x260e },+ { 0x0afa, 0x2315 },+ { 0x0afb, 0x2117 },+ { 0x0afc, 0x2038 },+ { 0x0afd, 0x201a },+ { 0x0afe, 0x201e },+ { 0x0ba3, 0x003c },+ { 0x0ba6, 0x003e },+ { 0x0ba8, 0x2228 },+ { 0x0ba9, 0x2227 },+ { 0x0bc0, 0x00af },+ { 0x0bc2, 0x22a5 },+ { 0x0bc3, 0x2229 },+ { 0x0bc4, 0x230a },+ { 0x0bc6, 0x005f },+ { 0x0bca, 0x2218 },+ { 0x0bcc, 0x2395 },+ { 0x0bce, 0x22a4 },+ { 0x0bcf, 0x25cb },+ { 0x0bd3, 0x2308 },+ { 0x0bd6, 0x222a },+ { 0x0bd8, 0x2283 },+ { 0x0bda, 0x2282 },+ { 0x0bdc, 0x22a2 },+ { 0x0bfc, 0x22a3 },+ { 0x0cdf, 0x2017 },+ { 0x0ce0, 0x05d0 },+ { 0x0ce1, 0x05d1 },+ { 0x0ce2, 0x05d2 },+ { 0x0ce3, 0x05d3 },+ { 0x0ce4, 0x05d4 },+ { 0x0ce5, 0x05d5 },+ { 0x0ce6, 0x05d6 },+ { 0x0ce7, 0x05d7 },+ { 0x0ce8, 0x05d8 },+ { 0x0ce9, 0x05d9 },+ { 0x0cea, 0x05da },+ { 0x0ceb, 0x05db },+ { 0x0cec, 0x05dc },+ { 0x0ced, 0x05dd },+ { 0x0cee, 0x05de },+ { 0x0cef, 0x05df },+ { 0x0cf0, 0x05e0 },+ { 0x0cf1, 0x05e1 },+ { 0x0cf2, 0x05e2 },+ { 0x0cf3, 0x05e3 },+ { 0x0cf4, 0x05e4 },+ { 0x0cf5, 0x05e5 },+ { 0x0cf6, 0x05e6 },+ { 0x0cf7, 0x05e7 },+ { 0x0cf8, 0x05e8 },+ { 0x0cf9, 0x05e9 },+ { 0x0cfa, 0x05ea },+ { 0x0da1, 0x0e01 },+ { 0x0da2, 0x0e02 },+ { 0x0da3, 0x0e03 },+ { 0x0da4, 0x0e04 },+ { 0x0da5, 0x0e05 },+ { 0x0da6, 0x0e06 },+ { 0x0da7, 0x0e07 },+ { 0x0da8, 0x0e08 },+ { 0x0da9, 0x0e09 },+ { 0x0daa, 0x0e0a },+ { 0x0dab, 0x0e0b },+ { 0x0dac, 0x0e0c },+ { 0x0dad, 0x0e0d },+ { 0x0dae, 0x0e0e },+ { 0x0daf, 0x0e0f },+ { 0x0db0, 0x0e10 },+ { 0x0db1, 0x0e11 },+ { 0x0db2, 0x0e12 },+ { 0x0db3, 0x0e13 },+ { 0x0db4, 0x0e14 },+ { 0x0db5, 0x0e15 },+ { 0x0db6, 0x0e16 },+ { 0x0db7, 0x0e17 },+ { 0x0db8, 0x0e18 },+ { 0x0db9, 0x0e19 },+ { 0x0dba, 0x0e1a },+ { 0x0dbb, 0x0e1b },+ { 0x0dbc, 0x0e1c },+ { 0x0dbd, 0x0e1d },+ { 0x0dbe, 0x0e1e },+ { 0x0dbf, 0x0e1f },+ { 0x0dc0, 0x0e20 },+ { 0x0dc1, 0x0e21 },+ { 0x0dc2, 0x0e22 },+ { 0x0dc3, 0x0e23 },+ { 0x0dc4, 0x0e24 },+ { 0x0dc5, 0x0e25 },+ { 0x0dc6, 0x0e26 },+ { 0x0dc7, 0x0e27 },+ { 0x0dc8, 0x0e28 },+ { 0x0dc9, 0x0e29 },+ { 0x0dca, 0x0e2a },+ { 0x0dcb, 0x0e2b },+ { 0x0dcc, 0x0e2c },+ { 0x0dcd, 0x0e2d },+ { 0x0dce, 0x0e2e },+ { 0x0dcf, 0x0e2f },+ { 0x0dd0, 0x0e30 },+ { 0x0dd1, 0x0e31 },+ { 0x0dd2, 0x0e32 },+ { 0x0dd3, 0x0e33 },+ { 0x0dd4, 0x0e34 },+ { 0x0dd5, 0x0e35 },+ { 0x0dd6, 0x0e36 },+ { 0x0dd7, 0x0e37 },+ { 0x0dd8, 0x0e38 },+ { 0x0dd9, 0x0e39 },+ { 0x0dda, 0x0e3a },+ { 0x0ddf, 0x0e3f },+ { 0x0de0, 0x0e40 },+ { 0x0de1, 0x0e41 },+ { 0x0de2, 0x0e42 },+ { 0x0de3, 0x0e43 },+ { 0x0de4, 0x0e44 },+ { 0x0de5, 0x0e45 },+ { 0x0de6, 0x0e46 },+ { 0x0de7, 0x0e47 },+ { 0x0de8, 0x0e48 },+ { 0x0de9, 0x0e49 },+ { 0x0dea, 0x0e4a },+ { 0x0deb, 0x0e4b },+ { 0x0dec, 0x0e4c },+ { 0x0ded, 0x0e4d },+ { 0x0df0, 0x0e50 },+ { 0x0df1, 0x0e51 },+ { 0x0df2, 0x0e52 },+ { 0x0df3, 0x0e53 },+ { 0x0df4, 0x0e54 },+ { 0x0df5, 0x0e55 },+ { 0x0df6, 0x0e56 },+ { 0x0df7, 0x0e57 },+ { 0x0df8, 0x0e58 },+ { 0x0df9, 0x0e59 },+ { 0x0ea1, 0x3131 },+ { 0x0ea2, 0x3132 },+ { 0x0ea3, 0x3133 },+ { 0x0ea4, 0x3134 },+ { 0x0ea5, 0x3135 },+ { 0x0ea6, 0x3136 },+ { 0x0ea7, 0x3137 },+ { 0x0ea8, 0x3138 },+ { 0x0ea9, 0x3139 },+ { 0x0eaa, 0x313a },+ { 0x0eab, 0x313b },+ { 0x0eac, 0x313c },+ { 0x0ead, 0x313d },+ { 0x0eae, 0x313e },+ { 0x0eaf, 0x313f },+ { 0x0eb0, 0x3140 },+ { 0x0eb1, 0x3141 },+ { 0x0eb2, 0x3142 },+ { 0x0eb3, 0x3143 },+ { 0x0eb4, 0x3144 },+ { 0x0eb5, 0x3145 },+ { 0x0eb6, 0x3146 },+ { 0x0eb7, 0x3147 },+ { 0x0eb8, 0x3148 },+ { 0x0eb9, 0x3149 },+ { 0x0eba, 0x314a },+ { 0x0ebb, 0x314b },+ { 0x0ebc, 0x314c },+ { 0x0ebd, 0x314d },+ { 0x0ebe, 0x314e },+ { 0x0ebf, 0x314f },+ { 0x0ec0, 0x3150 },+ { 0x0ec1, 0x3151 },+ { 0x0ec2, 0x3152 },+ { 0x0ec3, 0x3153 },+ { 0x0ec4, 0x3154 },+ { 0x0ec5, 0x3155 },+ { 0x0ec6, 0x3156 },+ { 0x0ec7, 0x3157 },+ { 0x0ec8, 0x3158 },+ { 0x0ec9, 0x3159 },+ { 0x0eca, 0x315a },+ { 0x0ecb, 0x315b },+ { 0x0ecc, 0x315c },+ { 0x0ecd, 0x315d },+ { 0x0ece, 0x315e },+ { 0x0ecf, 0x315f },+ { 0x0ed0, 0x3160 },+ { 0x0ed1, 0x3161 },+ { 0x0ed2, 0x3162 },+ { 0x0ed3, 0x3163 },+ { 0x0ed4, 0x11a8 },+ { 0x0ed5, 0x11a9 },+ { 0x0ed6, 0x11aa },+ { 0x0ed7, 0x11ab },+ { 0x0ed8, 0x11ac },+ { 0x0ed9, 0x11ad },+ { 0x0eda, 0x11ae },+ { 0x0edb, 0x11af },+ { 0x0edc, 0x11b0 },+ { 0x0edd, 0x11b1 },+ { 0x0ede, 0x11b2 },+ { 0x0edf, 0x11b3 },+ { 0x0ee0, 0x11b4 },+ { 0x0ee1, 0x11b5 },+ { 0x0ee2, 0x11b6 },+ { 0x0ee3, 0x11b7 },+ { 0x0ee4, 0x11b8 },+ { 0x0ee5, 0x11b9 },+ { 0x0ee6, 0x11ba },+ { 0x0ee7, 0x11bb },+ { 0x0ee8, 0x11bc },+ { 0x0ee9, 0x11bd },+ { 0x0eea, 0x11be },+ { 0x0eeb, 0x11bf },+ { 0x0eec, 0x11c0 },+ { 0x0eed, 0x11c1 },+ { 0x0eee, 0x11c2 },+ { 0x0eef, 0x316d },+ { 0x0ef0, 0x3171 },+ { 0x0ef1, 0x3178 },+ { 0x0ef2, 0x317f },+ { 0x0ef3, 0x3181 },+ { 0x0ef4, 0x3184 },+ { 0x0ef5, 0x3186 },+ { 0x0ef6, 0x318d },+ { 0x0ef7, 0x318e },+ { 0x0ef8, 0x11eb },+ { 0x0ef9, 0x11f0 },+ { 0x0efa, 0x11f9 },+ { 0x0eff, 0x20a9 },+ { 0x13a4, 0x20ac },+ { 0x13bc, 0x0152 },+ { 0x13bd, 0x0153 },+ { 0x13be, 0x0178 },+ { 0x20ac, 0x20ac }, + // Numeric keypad with numlock on + { XK_KP_Space, ' ' },+ { XK_KP_Equal, '=' },+ { XK_KP_Multiply, '*' },+ { XK_KP_Add, '+' },+ { XK_KP_Separator, ',' },+ { XK_KP_Subtract, '-' },+ { XK_KP_Decimal, '.' },+ { XK_KP_Divide, '/' },+ { XK_KP_0, 0x0030 }, + { XK_KP_1, 0x0031 }, + { XK_KP_2, 0x0032 }, + { XK_KP_3, 0x0033 }, + { XK_KP_4, 0x0034 }, + { XK_KP_5, 0x0035 }, + { XK_KP_6, 0x0036 }, + { XK_KP_7, 0x0037 }, + { XK_KP_8, 0x0038 }, + { XK_KP_9, 0x0039 } +};+++//************************************************************************+//**** GLFW internal functions ****+//************************************************************************++//========================================================================+// _glfwKeySym2Unicode() - Convert X11 KeySym to Unicode+//========================================================================++long _glfwKeySym2Unicode( KeySym keysym )+{+ int min = 0;+ int max = sizeof(keysymtab) / sizeof(struct codepair) - 1;+ int mid;++ /* First check for Latin-1 characters (1:1 mapping) */+ if( (keysym >= 0x0020 && keysym <= 0x007e) ||+ (keysym >= 0x00a0 && keysym <= 0x00ff) )+ {+ return keysym;+ }++ /* Also check for directly encoded 24-bit UCS characters */+ if( (keysym & 0xff000000) == 0x01000000 )+ {+ return keysym & 0x00ffffff;+ }++ /* Binary search in table */+ while( max >= min )+ {+ mid = (min + max) / 2;+ if( keysymtab[mid].keysym < keysym )+ {+ min = mid + 1;+ }+ else if( keysymtab[mid].keysym > keysym )+ {+ max = mid - 1;+ }+ else+ {+ /* Found it! */+ return keysymtab[mid].ucs;+ }+ }++ /* No matching Unicode value found */+ return -1;+}
+ glfw/lib/x11/x11_thread.c view
@@ -0,0 +1,507 @@+//========================================================================+// GLFW - An OpenGL framework+// File: x11_thread.c+// Platform: X11 (Unix)+// API version: 2.6+// WWW: http://glfw.sourceforge.net+//------------------------------------------------------------------------+// Copyright (c) 2002-2006 Camilla Berglund+//+// This software is provided 'as-is', without any express or implied+// warranty. In no event will the authors be held liable for any damages+// arising from the use of this software.+//+// Permission is granted to anyone to use this software for any purpose,+// including commercial applications, and to alter it and redistribute it+// freely, subject to the following restrictions:+//+// 1. The origin of this software must not be misrepresented; you must not+// claim that you wrote the original software. If you use this software+// in a product, an acknowledgment in the product documentation would+// be appreciated but is not required.+//+// 2. Altered source versions must be plainly marked as such, and must not+// be misrepresented as being the original software.+//+// 3. This notice may not be removed or altered from any source+// distribution.+//+//========================================================================++#include "internal.h"++++//************************************************************************+//**** GLFW internal functions ****+//************************************************************************++#ifdef _GLFW_HAS_PTHREAD++//========================================================================+// _glfwNewThread() - This is simply a "wrapper" for calling the user+// thread function.+//========================================================================++void * _glfwNewThread( void * arg )+{+ GLFWthreadfun threadfun;+ _GLFWthread *t;+ pthread_t posixID;++ // Get current thread ID+ posixID = pthread_self();++ // Enter critical section+ ENTER_THREAD_CRITICAL_SECTION++ // Loop through entire list of threads to find the matching POSIX+ // thread ID+ for( t = &_glfwThrd.First; t != NULL; t = t->Next )+ {+ if( t->PosixID == posixID )+ {+ break;+ }+ }+ if( t == NULL )+ {+ LEAVE_THREAD_CRITICAL_SECTION+ return NULL;+ }++ // Get user thread function pointer+ threadfun = t->Function;++ // Leave critical section+ LEAVE_THREAD_CRITICAL_SECTION++ // Call the user thread function+ threadfun( arg );++ // Remove thread from thread list+ ENTER_THREAD_CRITICAL_SECTION+ _glfwRemoveThread( t );+ LEAVE_THREAD_CRITICAL_SECTION++ // When the thread function returns, the thread will die...+ return NULL;+}++#endif // _GLFW_HAS_PTHREAD++++//************************************************************************+//**** Platform implementation functions ****+//************************************************************************++//========================================================================+// _glfwPlatformCreateThread() - Create a new thread+//========================================================================++GLFWthread _glfwPlatformCreateThread( GLFWthreadfun fun, void *arg )+{+#ifdef _GLFW_HAS_PTHREAD++ GLFWthread ID;+ _GLFWthread *t;+ int result;++ // Enter critical section+ ENTER_THREAD_CRITICAL_SECTION++ // Create a new thread information memory area+ t = (_GLFWthread *) malloc( sizeof(_GLFWthread) );+ if( t == NULL )+ {+ // Leave critical section+ LEAVE_THREAD_CRITICAL_SECTION+ return -1;+ }++ // Get a new unique thread id+ ID = _glfwThrd.NextID ++;++ // Store thread information in the thread list+ t->Function = fun;+ t->ID = ID;++ // Create thread+ result = pthread_create(+ &t->PosixID, // Thread handle+ NULL, // Default thread attributes+ _glfwNewThread, // Thread function (a wrapper function)+ (void *)arg // Argument to thread is user argument+ );++ // Did the thread creation fail?+ if( result != 0 )+ {+ free( (void *) t );+ LEAVE_THREAD_CRITICAL_SECTION+ return -1;+ }++ // Append thread to thread list+ _glfwAppendThread( t );++ // Leave critical section+ LEAVE_THREAD_CRITICAL_SECTION++ // Return the GLFW thread ID+ return ID;++#else++ return -1;++#endif // _GLFW_HAS_PTHREAD+}+++//========================================================================+// _glfwPlatformDestroyThread() - Kill a thread. NOTE: THIS IS A VERY+// DANGEROUS OPERATION, AND SHOULD NOT BE USED EXCEPT IN EXTREME+// SITUATIONS!+//========================================================================++void _glfwPlatformDestroyThread( GLFWthread ID )+{+#ifdef _GLFW_HAS_PTHREAD++ _GLFWthread *t;++ // Enter critical section+ ENTER_THREAD_CRITICAL_SECTION++ // Get thread information pointer+ t = _glfwGetThreadPointer( ID );+ if( t == NULL )+ {+ LEAVE_THREAD_CRITICAL_SECTION+ return;+ }++ // Simply murder the process, no mercy!+ pthread_kill( t->PosixID, SIGKILL );++ // Remove thread from thread list+ _glfwRemoveThread( t );++ // Leave critical section+ LEAVE_THREAD_CRITICAL_SECTION++#endif // _GLFW_HAS_PTHREAD+}+++//========================================================================+// _glfwPlatformWaitThread() - Wait for a thread to die+//========================================================================++int _glfwPlatformWaitThread( GLFWthread ID, int waitmode )+{+#ifdef _GLFW_HAS_PTHREAD++ pthread_t thread;+ _GLFWthread *t;++ // Enter critical section+ ENTER_THREAD_CRITICAL_SECTION++ // Get thread information pointer+ t = _glfwGetThreadPointer( ID );++ // Is the thread already dead?+ if( t == NULL )+ {+ LEAVE_THREAD_CRITICAL_SECTION+ return GL_TRUE;+ }++ // If got this far, the thread is alive => polling returns FALSE+ if( waitmode == GLFW_NOWAIT )+ {+ LEAVE_THREAD_CRITICAL_SECTION+ return GL_FALSE;+ }++ // Get thread handle+ thread = t->PosixID;++ // Leave critical section+ LEAVE_THREAD_CRITICAL_SECTION++ // Wait for thread to die+ (void) pthread_join( thread, NULL );++ return GL_TRUE;++#else++ return GL_TRUE;++#endif // _GLFW_HAS_PTHREAD+}+++//========================================================================+// _glfwPlatformGetThreadID() - Return the thread ID for the current+// thread+//========================================================================++GLFWthread _glfwPlatformGetThreadID( void )+{+#ifdef _GLFW_HAS_PTHREAD++ _GLFWthread *t;+ GLFWthread ID = -1;+ pthread_t posixID;++ // Get current thread ID+ posixID = pthread_self();++ // Enter critical section+ ENTER_THREAD_CRITICAL_SECTION++ // Loop through entire list of threads to find the matching POSIX+ // thread ID+ for( t = &_glfwThrd.First; t != NULL; t = t->Next )+ {+ if( t->PosixID == posixID )+ {+ ID = t->ID;+ break;+ }+ }++ // Leave critical section+ LEAVE_THREAD_CRITICAL_SECTION++ // Return the found GLFW thread identifier+ return ID;++#else++ return 0;++#endif // _GLFW_HAS_PTHREAD+}+++//========================================================================+// _glfwPlatformCreateMutex() - Create a mutual exclusion object+//========================================================================++GLFWmutex _glfwPlatformCreateMutex( void )+{+#ifdef _GLFW_HAS_PTHREAD++ pthread_mutex_t *mutex;++ // Allocate memory for mutex+ mutex = (pthread_mutex_t *) malloc( sizeof( pthread_mutex_t ) );+ if( !mutex )+ {+ return NULL;+ }++ // Initialise a mutex object+ (void) pthread_mutex_init( mutex, NULL );++ // Cast to GLFWmutex and return+ return (GLFWmutex) mutex;++#else++ return (GLFWmutex) 0;++#endif // _GLFW_HAS_PTHREAD+}+++//========================================================================+// _glfwPlatformDestroyMutex() - Destroy a mutual exclusion object+//========================================================================++void _glfwPlatformDestroyMutex( GLFWmutex mutex )+{+#ifdef _GLFW_HAS_PTHREAD++ // Destroy the mutex object+ pthread_mutex_destroy( (pthread_mutex_t *) mutex );++ // Free memory for mutex object+ free( (void *) mutex );++#endif // _GLFW_HAS_PTHREAD+}+++//========================================================================+// _glfwPlatformLockMutex() - Request access to a mutex+//========================================================================++void _glfwPlatformLockMutex( GLFWmutex mutex )+{+#ifdef _GLFW_HAS_PTHREAD++ // Wait for mutex to be released+ (void) pthread_mutex_lock( (pthread_mutex_t *) mutex );++#endif // _GLFW_HAS_PTHREAD+}+++//========================================================================+// _glfwPlatformUnlockMutex() - Release a mutex+//========================================================================++void _glfwPlatformUnlockMutex( GLFWmutex mutex )+{+#ifdef _GLFW_HAS_PTHREAD++ // Release mutex+ pthread_mutex_unlock( (pthread_mutex_t *) mutex );++#endif // _GLFW_HAS_PTHREAD+}+++//========================================================================+// _glfwPlatformCreateCond() - Create a new condition variable object+//========================================================================++GLFWcond _glfwPlatformCreateCond( void )+{+#ifdef _GLFW_HAS_PTHREAD++ pthread_cond_t *cond;++ // Allocate memory for condition variable+ cond = (pthread_cond_t *) malloc( sizeof(pthread_cond_t) );+ if( !cond )+ {+ return NULL;+ }++ // Initialise condition variable+ (void) pthread_cond_init( cond, NULL );++ // Cast to GLFWcond and return+ return (GLFWcond) cond;++#else++ return (GLFWcond) 0;++#endif // _GLFW_HAS_PTHREAD+}+++//========================================================================+// _glfwPlatformDestroyCond() - Destroy a condition variable object+//========================================================================++void _glfwPlatformDestroyCond( GLFWcond cond )+{+#ifdef _GLFW_HAS_PTHREAD++ // Destroy the condition variable object+ (void) pthread_cond_destroy( (pthread_cond_t *) cond );++ // Free memory for condition variable object+ free( (void *) cond );++#endif // _GLFW_HAS_PTHREAD+}+++//========================================================================+// _glfwPlatformWaitCond() - Wait for a condition to be raised+//========================================================================++void _glfwPlatformWaitCond( GLFWcond cond, GLFWmutex mutex,+ double timeout )+{+#ifdef _GLFW_HAS_PTHREAD++ struct timeval currenttime;+ struct timespec wait;+ long dt_sec, dt_usec;++ // Select infinite or timed wait+ if( timeout >= GLFW_INFINITY )+ {+ // Wait for condition (infinite wait)+ (void) pthread_cond_wait( (pthread_cond_t *) cond,+ (pthread_mutex_t *) mutex );+ }+ else+ {+ // Set timeout time, relatvie to current time+ gettimeofday( ¤ttime, NULL );+ dt_sec = (long) timeout;+ dt_usec = (long) ((timeout - (double)dt_sec) * 1000000.0);+ wait.tv_nsec = (currenttime.tv_usec + dt_usec) * 1000L;+ if( wait.tv_nsec > 1000000000L )+ {+ wait.tv_nsec -= 1000000000L;+ dt_sec ++;+ }+ wait.tv_sec = currenttime.tv_sec + dt_sec;++ // Wait for condition (timed wait)+ (void) pthread_cond_timedwait( (pthread_cond_t *) cond,+ (pthread_mutex_t *) mutex, &wait );+ }++#endif // _GLFW_HAS_PTHREAD+}+++//========================================================================+// _glfwPlatformSignalCond() - Signal a condition to one waiting thread+//========================================================================++void _glfwPlatformSignalCond( GLFWcond cond )+{+#ifdef _GLFW_HAS_PTHREAD++ // Signal condition+ (void) pthread_cond_signal( (pthread_cond_t *) cond );++#endif // _GLFW_HAS_PTHREAD+}+++//========================================================================+// _glfwPlatformBroadcastCond() - Broadcast a condition to all waiting+// threads+//========================================================================++void _glfwPlatformBroadcastCond( GLFWcond cond )+{+#ifdef _GLFW_HAS_PTHREAD++ // Broadcast condition+ (void) pthread_cond_broadcast( (pthread_cond_t *) cond );++#endif // _GLFW_HAS_PTHREAD+}+++//========================================================================+// _glfwPlatformGetNumberOfProcessors() - Return the number of processors+// in the system.+//========================================================================++int _glfwPlatformGetNumberOfProcessors( void )+{+ int n;++ // Get number of processors online+ _glfw_numprocessors( n );+ return n;+}
+ glfw/lib/x11/x11_time.c view
@@ -0,0 +1,154 @@+//========================================================================+// GLFW - An OpenGL framework+// File: x11_time.c+// Platform: X11 (Unix)+// API version: 2.6+// WWW: http://glfw.sourceforge.net+//------------------------------------------------------------------------+// Copyright (c) 2002-2006 Camilla Berglund+//+// This software is provided 'as-is', without any express or implied+// warranty. In no event will the authors be held liable for any damages+// arising from the use of this software.+//+// Permission is granted to anyone to use this software for any purpose,+// including commercial applications, and to alter it and redistribute it+// freely, subject to the following restrictions:+//+// 1. The origin of this software must not be misrepresented; you must not+// claim that you wrote the original software. If you use this software+// in a product, an acknowledgment in the product documentation would+// be appreciated but is not required.+//+// 2. Altered source versions must be plainly marked as such, and must not+// be misrepresented as being the original software.+//+// 3. This notice may not be removed or altered from any source+// distribution.+//+//========================================================================++#include "internal.h"+++//========================================================================+// Initialise timer+//========================================================================++void _glfwInitTimer( void )+{+ struct timeval tv;++ // "Resolution" is 1 us+ _glfwLibrary.Timer.Resolution = 1e-6;++ // Set start-time for timer+ gettimeofday( &tv, NULL );+ _glfwLibrary.Timer.t0 = (long long) tv.tv_sec * (long long) 1000000 ++ (long long) tv.tv_usec;+}+++//************************************************************************+//**** Platform implementation functions ****+//************************************************************************++//========================================================================+// Return timer value in seconds+//========================================================================++double _glfwPlatformGetTime( void )+{+ long long t;+ struct timeval tv;++ gettimeofday( &tv, NULL );+ t = (long long) tv.tv_sec * (long long) 1000000 ++ (long long) tv.tv_usec;++ return (double)(t - _glfwLibrary.Timer.t0) * _glfwLibrary.Timer.Resolution;+}+++//========================================================================+// Set timer value in seconds+//========================================================================++void _glfwPlatformSetTime( double t )+{+ long long t0;+ struct timeval tv;++ gettimeofday( &tv, NULL );+ t0 = (long long) tv.tv_sec * (long long) 1000000 ++ (long long) tv.tv_usec;++ // Calulate new starting time+ _glfwLibrary.Timer.t0 = t0 - (long long)(t/_glfwLibrary.Timer.Resolution);+}+++//========================================================================+// Put a thread to sleep for a specified amount of time+//========================================================================++void _glfwPlatformSleep( double time )+{+#ifdef _GLFW_HAS_PTHREAD++ if( time == 0.0 )+ {+#ifdef _GLFW_HAS_SCHED_YIELD+ sched_yield();+#endif+ return;+ }++ struct timeval currenttime;+ struct timespec wait;+ pthread_mutex_t mutex;+ pthread_cond_t cond;+ long dt_sec, dt_usec;++ // Not all pthread implementations have a pthread_sleep() function. We+ // do it the portable way, using a timed wait for a condition that we+ // will never signal. NOTE: The unistd functions sleep/usleep suspends+ // the entire PROCESS, not a signle thread, which is why we can not+ // use them to implement glfwSleep.++ // Set timeout time, relatvie to current time+ gettimeofday( ¤ttime, NULL );+ dt_sec = (long) time;+ dt_usec = (long) ((time - (double)dt_sec) * 1000000.0);+ wait.tv_nsec = (currenttime.tv_usec + dt_usec) * 1000L;+ if( wait.tv_nsec > 1000000000L )+ {+ wait.tv_nsec -= 1000000000L;+ dt_sec++;+ }+ wait.tv_sec = currenttime.tv_sec + dt_sec;++ // Initialize condition and mutex objects+ pthread_mutex_init( &mutex, NULL );+ pthread_cond_init( &cond, NULL );++ // Do a timed wait+ pthread_mutex_lock( &mutex );+ pthread_cond_timedwait( &cond, &mutex, &wait );+ pthread_mutex_unlock( &mutex );++ // Destroy condition and mutex objects+ pthread_mutex_destroy( &mutex );+ pthread_cond_destroy( &cond );++#else++ // For systems without PTHREAD, use unistd usleep+ if( time > 0 )+ {+ usleep( (unsigned int) (time*1000000) );+ }++#endif // _GLFW_HAS_PTHREAD+}+
+ glfw/lib/x11/x11_window.c view
@@ -0,0 +1,1746 @@+//========================================================================+// GLFW - An OpenGL framework+// File: x11_window.c+// Platform: X11 (Unix)+// API version: 2.6+// WWW: http://glfw.sourceforge.net+//------------------------------------------------------------------------+// Copyright (c) 2002-2006 Camilla Berglund+//+// This software is provided 'as-is', without any express or implied+// warranty. In no event will the authors be held liable for any damages+// arising from the use of this software.+//+// Permission is granted to anyone to use this software for any purpose,+// including commercial applications, and to alter it and redistribute it+// freely, subject to the following restrictions:+//+// 1. The origin of this software must not be misrepresented; you must not+// claim that you wrote the original software. If you use this software+// in a product, an acknowledgment in the product documentation would+// be appreciated but is not required.+//+// 2. Altered source versions must be plainly marked as such, and must not+// be misrepresented as being the original software.+//+// 3. This notice may not be removed or altered from any source+// distribution.+//+//========================================================================++#include "internal.h"+++/* Defines some GLX FSAA tokens if not yet defined */+#ifndef GLX_SAMPLE_BUFFERS+# define GLX_SAMPLE_BUFFERS 100000+#endif +#ifndef GLX_SAMPLES +# define GLX_SAMPLES 100001+#endif +++/* KDE decoration values */+enum {+ KDE_noDecoration = 0,+ KDE_normalDecoration = 1,+ KDE_tinyDecoration = 2,+ KDE_noFocus = 256,+ KDE_standaloneMenuBar = 512,+ KDE_desktopIcon = 1024 ,+ KDE_staysOnTop = 2048+};+++//************************************************************************+//**** GLFW internal functions ****+//************************************************************************++//========================================================================+// _glfwWaitForMapNotify()+//========================================================================++Bool _glfwWaitForMapNotify( Display *d, XEvent *e, char *arg )+{+ return (e->type == MapNotify) && (e->xmap.window == (Window)arg);+}+++//========================================================================+// _glfwWaitForUnmapNotify()+//========================================================================++Bool _glfwWaitForUnmapNotify( Display *d, XEvent *e, char *arg )+{+ return (e->type == UnmapNotify) && (e->xmap.window == (Window)arg);+}+++//========================================================================+// _glfwDisableDecorations() - Turn off window decorations+// Based on xawdecode: src/wmhooks.c+//========================================================================++#define MWM_HINTS_DECORATIONS (1L << 1)++static void _glfwDisableDecorations( void )+{+ int RemovedDecorations;+ Atom HintAtom;+ XSetWindowAttributes attributes;++ RemovedDecorations = 0;++ // First try to set MWM hints+ HintAtom = XInternAtom( _glfwLibrary.Dpy, "_MOTIF_WM_HINTS", True );+ if ( HintAtom != None )+ {+ struct {+ unsigned long flags;+ unsigned long functions;+ unsigned long decorations;+ long input_mode;+ unsigned long status;+ } MWMHints = { MWM_HINTS_DECORATIONS, 0, 0, 0, 0 };++ XChangeProperty( _glfwLibrary.Dpy, _glfwWin.Win, HintAtom, HintAtom,+ 32, PropModeReplace, (unsigned char *)&MWMHints,+ sizeof(MWMHints)/4 );+ RemovedDecorations = 1;+ }++ // Now try to set KWM hints+ HintAtom = XInternAtom( _glfwLibrary.Dpy, "KWM_WIN_DECORATION", True );+ if ( HintAtom != None )+ {+ long KWMHints = KDE_tinyDecoration;++ XChangeProperty( _glfwLibrary.Dpy, _glfwWin.Win, HintAtom, HintAtom,+ 32, PropModeReplace, (unsigned char *)&KWMHints,+ sizeof(KWMHints)/4 );+ RemovedDecorations = 1;+ }++ // Now try to set GNOME hints+ HintAtom = XInternAtom(_glfwLibrary.Dpy, "_WIN_HINTS", True );+ if ( HintAtom != None )+ {+ long GNOMEHints = 0;++ XChangeProperty( _glfwLibrary.Dpy, _glfwWin.Win, HintAtom, HintAtom,+ 32, PropModeReplace, (unsigned char *)&GNOMEHints,+ sizeof(GNOMEHints)/4 );+ RemovedDecorations = 1;+ }++ // Now try to set KDE NET_WM hints+ HintAtom = XInternAtom( _glfwLibrary.Dpy, "_NET_WM_WINDOW_TYPE", True );+ if ( HintAtom != None )+ {+ Atom NET_WMHints[2];++ NET_WMHints[0] = XInternAtom( _glfwLibrary.Dpy, "_KDE_NET_WM_WINDOW_TYPE_OVERRIDE", True );+ /* define a fallback... */+ NET_WMHints[1] = XInternAtom( _glfwLibrary.Dpy, "_NET_WM_WINDOW_TYPE_NORMAL", True );++ XChangeProperty( _glfwLibrary.Dpy, _glfwWin.Win, HintAtom, XA_ATOM,+ 32, PropModeReplace, (unsigned char *)&NET_WMHints,+ 2 );+ RemovedDecorations = 1;+ }++ // Set ICCCM fullscreen WM hint+ HintAtom = XInternAtom( _glfwLibrary.Dpy, "_NET_WM_STATE", True );+ if ( HintAtom != None )+ {+ Atom NET_WMHints[1];++ NET_WMHints[0] = XInternAtom( _glfwLibrary.Dpy, "_NET_WM_STATE_FULLSCREEN", True );++ XChangeProperty( _glfwLibrary.Dpy, _glfwWin.Win, HintAtom, XA_ATOM,+ 32, PropModeReplace, (unsigned char *)&NET_WMHints, 1 );+ }+++ // Did we sucessfully remove the window decorations?+ if( RemovedDecorations )+ {+ // Finally set the transient hints+ XSetTransientForHint( _glfwLibrary.Dpy, _glfwWin.Win, RootWindow(_glfwLibrary.Dpy, _glfwWin.Scrn) );+ XUnmapWindow( _glfwLibrary.Dpy, _glfwWin.Win );+ XMapWindow( _glfwLibrary.Dpy, _glfwWin.Win );+ }+ else+ {+ // The Butcher way of removing window decorations+ attributes.override_redirect = True;+ XChangeWindowAttributes( _glfwLibrary.Dpy, _glfwWin.Win,+ CWOverrideRedirect, &attributes );+ _glfwWin.OverrideRedirect = GL_TRUE;+ }+}+++//========================================================================+// _glfwEnableDecorations() - Turn on window decorations+//========================================================================++static void _glfwEnableDecorations( void )+{+ int ActivatedDecorations;+ Atom HintAtom;++ // If this is an override redirect window, skip it...+ if( _glfwWin.OverrideRedirect )+ {+ return;+ }++ ActivatedDecorations = 0;++ // First try to unset MWM hints+ HintAtom = XInternAtom( _glfwLibrary.Dpy, "_MOTIF_WM_HINTS", True );+ if ( HintAtom != None )+ {+ XDeleteProperty( _glfwLibrary.Dpy, _glfwWin.Win, HintAtom );+ ActivatedDecorations = 1;+ }++ // Now try to unset KWM hints+ HintAtom = XInternAtom( _glfwLibrary.Dpy, "KWM_WIN_DECORATION", True );+ if ( HintAtom != None )+ {+ XDeleteProperty( _glfwLibrary.Dpy, _glfwWin.Win, HintAtom );+ ActivatedDecorations = 1;+ }++ // Now try to unset GNOME hints+ HintAtom = XInternAtom( _glfwLibrary.Dpy, "_WIN_HINTS", True );+ if ( HintAtom != None )+ {+ XDeleteProperty( _glfwLibrary.Dpy, _glfwWin.Win, HintAtom );+ ActivatedDecorations = 1;+ }++ // Now try to unset NET_WM hints+ HintAtom = XInternAtom( _glfwLibrary.Dpy, "_NET_WM_WINDOW_TYPE", True );+ if ( HintAtom != None )+ {+ Atom NET_WMHints = XInternAtom( _glfwLibrary.Dpy, "_NET_WM_WINDOW_TYPE_NORMAL", True);+ if( NET_WMHints != None )+ {+ XChangeProperty( _glfwLibrary.Dpy, _glfwWin.Win,+ HintAtom, XA_ATOM, 32, PropModeReplace,+ (unsigned char *)&NET_WMHints, 1 );+ ActivatedDecorations = 1;+ }+ }++ // Finally unset the transient hints if necessary+ if( ActivatedDecorations )+ {+ // NOTE: Does this work?+ XSetTransientForHint( _glfwLibrary.Dpy, _glfwWin.Win, None);+ XUnmapWindow( _glfwLibrary.Dpy, _glfwWin.Win );+ XMapWindow( _glfwLibrary.Dpy, _glfwWin.Win );+ }+}+++//========================================================================+// _glfwChooseVisual() - We do our own function here, since+// glXChooseVisual does not behave as we want it to (not according to the+// GLFW specs)+//========================================================================++XVisualInfo * _glfwChooseVisual( Display *Dpy, int Screen, int r, int g,+ int b, int a, int d, int s, int ar, int ag, int ab, int aa, int aux,+ int fsaa, int stereo)+{+ XVisualInfo *VI, *VI_list, VI_tmp;+ int nitems_return, i;+ int vi_gl, vi_rgba, vi_double, vi_stereo;+ int vi_r, vi_g, vi_b, vi_a, vi_d, vi_s, vi_ar, vi_ag, vi_ab, vi_aa;+ int vi_aux;+ int color, accum, vi_accum;+ int missing, color_diff, extra_diff;+ int best_vis, best_missing, best_color_diff, best_extra_diff;+ int samples, samplebuffers, vi_samples, vi_samplebuffers;++ // Get list of visuals for this screen & display+ VI_tmp.screen = Screen;+ VI_list = XGetVisualInfo( Dpy, VisualScreenMask, &VI_tmp,+ &nitems_return );+ if( VI_list == NULL )+ {+ return NULL;+ }++ // Pick some prefered color depth if the user did not request a+ // specific depth (note: if the user did not request a specific color+ // depth, this will not be a driving demand, it's only here to avoid+ // selection randomness)+ color = (r > 0 || g > 0 || b > 0);+ if( !color )+ {+ r = g = b = 8;+ }++ // Make sure that stereo is 1 or 0+ stereo = stereo ? 1 : 0;++ // Convenience pre-calculation+ accum = (ar > 0 || ag > 0 || ab > 0 || aa > 0);+ + samples = fsaa;+ samplebuffers = (fsaa > 0) ? 1 : 0;+ + ++ // Loop through list of visuals to find best match+ best_vis = -1;+ best_missing = 0x7fffffff;+ best_color_diff = 0x7fffffff;+ best_extra_diff = 0x7fffffff;+ for( i = 0; i < nitems_return; i ++ )+ {+ // We want GL, RGBA & DOUBLEBUFFER, and NOT STEREO / STEREO+ glXGetConfig( Dpy, &VI_list[i], GLX_USE_GL, &vi_gl );+ glXGetConfig( Dpy, &VI_list[i], GLX_RGBA, &vi_rgba );+ glXGetConfig( Dpy, &VI_list[i], GLX_DOUBLEBUFFER, &vi_double );+ glXGetConfig( Dpy, &VI_list[i], GLX_STEREO, &vi_stereo );+ vi_stereo = vi_stereo ? 1 : 0;+ if( vi_gl && vi_rgba && vi_double && (vi_stereo == stereo) )+ {+ // Get visual color parameters+ glXGetConfig( Dpy, &VI_list[i], GLX_RED_SIZE, &vi_r );+ glXGetConfig( Dpy, &VI_list[i], GLX_GREEN_SIZE, &vi_g );+ glXGetConfig( Dpy, &VI_list[i], GLX_BLUE_SIZE, &vi_b );++ // Get visual "extra" parameters+ glXGetConfig( Dpy, &VI_list[i], GLX_ALPHA_SIZE, &vi_a );+ glXGetConfig( Dpy, &VI_list[i], GLX_DEPTH_SIZE, &vi_d );+ glXGetConfig( Dpy, &VI_list[i], GLX_STENCIL_SIZE, &vi_s );+ glXGetConfig( Dpy, &VI_list[i], GLX_ACCUM_RED_SIZE, &vi_ar );+ glXGetConfig( Dpy, &VI_list[i], GLX_ACCUM_GREEN_SIZE, &vi_ag );+ glXGetConfig( Dpy, &VI_list[i], GLX_ACCUM_BLUE_SIZE, &vi_ab );+ glXGetConfig( Dpy, &VI_list[i], GLX_ACCUM_ALPHA_SIZE, &vi_aa );+ glXGetConfig( Dpy, &VI_list[i], GLX_AUX_BUFFERS, &vi_aux );+ glXGetConfig( Dpy, &VI_list[i], GLX_SAMPLE_BUFFERS, &vi_samplebuffers );+ glXGetConfig( Dpy, &VI_list[i], GLX_SAMPLES, &vi_samples );+ + vi_accum = (vi_ar > 0 || vi_ag > 0 || vi_ab > 0 || vi_aa > 0);++ // Check how many buffers are missing+ missing = 0;+ if( a > 0 && vi_a == 0 ) missing ++;+ if( d > 0 && vi_d == 0 ) missing ++;+ if( s > 0 && vi_s == 0 ) missing ++;+ if( accum && !vi_accum ) missing ++;+ if( aux > 0 && vi_aux == 0 ) missing ++;+ if( samplebuffers > 0 && vi_samplebuffers == 0 ) missing ++;+ ++ // Calculate color diff+ color_diff = (r - vi_r) * (r - vi_r) ++ (g - vi_g) * (g - vi_g) ++ (b - vi_b) * (b - vi_b);++ // Calculate "extra" diff+ extra_diff = 0;+ if( a > 0 )+ {+ extra_diff += (a - vi_a) * (a - vi_a);+ }+ if( d > 0 )+ {+ extra_diff += (d - vi_d) * (d - vi_d);+ }+ if( s > 0 )+ {+ extra_diff += (s - vi_s) * (s - vi_s);+ }+ if( accum )+ {+ extra_diff += (ar - vi_ar) * (ar - vi_ar) ++ (ag - vi_ag) * (ag - vi_ag) ++ (ab - vi_ab) * (ab - vi_ab) ++ (aa - vi_aa) * (aa - vi_aa);+ }+ if( aux > 0 )+ {+ extra_diff += (aux - vi_aux) * (aux - vi_aux);+ }+ if( samples > 0 )+ {+ extra_diff += (samples - vi_samples) * (samples - vi_samples);+ + }+ // Check if this is a better match. We implement some+ // complicated rules, by prioritizing in this order:+ // 1) Visuals with the least number of missing buffers always+ // have priority+ // 2a) If (r,g,b)!=(0,0,0), color depth has priority over+ // other buffers+ // 2b) If (r,g,b)==(0,0,0), other buffers have priority over+ // color depth+ if( missing < best_missing )+ {+ best_vis = i;+ }+ else if( missing == best_missing )+ {+ if( color )+ {+ if( (color_diff < best_color_diff) ||+ (color_diff == best_color_diff &&+ extra_diff < best_extra_diff) )+ {+ best_vis = i;+ }+ }+ else+ {+ if( (extra_diff < best_extra_diff) ||+ (extra_diff == best_extra_diff &&+ color_diff < best_color_diff) )+ {+ best_vis = i;+ }+ }+ }+ if( best_vis == i )+ {+ best_missing = missing;+ best_color_diff = color_diff;+ best_extra_diff = extra_diff;+ }+ }+ }++ // Copy best visual to a visual to return+ if( best_vis >= 0 )+ {+ VI = XGetVisualInfo( Dpy, VisualIDMask, &VI_list[ best_vis ],+ &nitems_return );+ }+ else+ {+ VI = NULL;+ }++ // Free visuals list+ XFree( VI_list );++ return VI;+}+++//========================================================================+// _glfwTranslateKey() - Translates an X Window key to internal coding+//========================================================================++static int _glfwTranslateKey( int keycode )+{+ KeySym key, key_lc, key_uc;++ // Try secondary keysym, for numeric keypad keys+ // Note: This way we always force "NumLock = ON", which at least+ // enables GLFW users to detect numeric keypad keys+ key = XKeycodeToKeysym( _glfwLibrary.Dpy, keycode, 1 );+ switch( key )+ {+ // Numeric keypad+ case XK_KP_0: return GLFW_KEY_KP_0;+ case XK_KP_1: return GLFW_KEY_KP_1;+ case XK_KP_2: return GLFW_KEY_KP_2;+ case XK_KP_3: return GLFW_KEY_KP_3;+ case XK_KP_4: return GLFW_KEY_KP_4;+ case XK_KP_5: return GLFW_KEY_KP_5;+ case XK_KP_6: return GLFW_KEY_KP_6;+ case XK_KP_7: return GLFW_KEY_KP_7;+ case XK_KP_8: return GLFW_KEY_KP_8;+ case XK_KP_9: return GLFW_KEY_KP_9;+ case XK_KP_Separator:+ case XK_KP_Decimal: return GLFW_KEY_KP_DECIMAL;+ case XK_KP_Equal: return GLFW_KEY_KP_EQUAL;+ case XK_KP_Enter: return GLFW_KEY_KP_ENTER;+ default: break;+ }++ // Now try pimary keysym+ key = XKeycodeToKeysym( _glfwLibrary.Dpy, keycode, 0 );+ switch( key )+ {+ // Special keys (non character keys)+ case XK_Escape: return GLFW_KEY_ESC;+ case XK_Tab: return GLFW_KEY_TAB;+ case XK_Shift_L: return GLFW_KEY_LSHIFT;+ case XK_Shift_R: return GLFW_KEY_RSHIFT;+ case XK_Control_L: return GLFW_KEY_LCTRL;+ case XK_Control_R: return GLFW_KEY_RCTRL;+ case XK_Meta_L:+ case XK_Alt_L: return GLFW_KEY_LALT;+ case XK_Mode_switch: // Mapped to Alt_R on many keyboards+ case XK_Meta_R:+ case XK_Alt_R: return GLFW_KEY_RALT;+ case XK_KP_Delete:+ case XK_Delete: return GLFW_KEY_DEL;+ case XK_BackSpace: return GLFW_KEY_BACKSPACE;+ case XK_Return: return GLFW_KEY_ENTER;+ case XK_KP_Home:+ case XK_Home: return GLFW_KEY_HOME;+ case XK_KP_End:+ case XK_End: return GLFW_KEY_END;+ case XK_KP_Page_Up:+ case XK_Page_Up: return GLFW_KEY_PAGEUP;+ case XK_KP_Page_Down:+ case XK_Page_Down: return GLFW_KEY_PAGEDOWN;+ case XK_KP_Insert:+ case XK_Insert: return GLFW_KEY_INSERT;+ case XK_KP_Left:+ case XK_Left: return GLFW_KEY_LEFT;+ case XK_KP_Right:+ case XK_Right: return GLFW_KEY_RIGHT;+ case XK_KP_Down:+ case XK_Down: return GLFW_KEY_DOWN;+ case XK_KP_Up:+ case XK_Up: return GLFW_KEY_UP;+ case XK_F1: return GLFW_KEY_F1;+ case XK_F2: return GLFW_KEY_F2;+ case XK_F3: return GLFW_KEY_F3;+ case XK_F4: return GLFW_KEY_F4;+ case XK_F5: return GLFW_KEY_F5;+ case XK_F6: return GLFW_KEY_F6;+ case XK_F7: return GLFW_KEY_F7;+ case XK_F8: return GLFW_KEY_F8;+ case XK_F9: return GLFW_KEY_F9;+ case XK_F10: return GLFW_KEY_F10;+ case XK_F11: return GLFW_KEY_F11;+ case XK_F12: return GLFW_KEY_F12;+ case XK_F13: return GLFW_KEY_F13;+ case XK_F14: return GLFW_KEY_F14;+ case XK_F15: return GLFW_KEY_F15;+ case XK_F16: return GLFW_KEY_F16;+ case XK_F17: return GLFW_KEY_F17;+ case XK_F18: return GLFW_KEY_F18;+ case XK_F19: return GLFW_KEY_F19;+ case XK_F20: return GLFW_KEY_F20;+ case XK_F21: return GLFW_KEY_F21;+ case XK_F22: return GLFW_KEY_F22;+ case XK_F23: return GLFW_KEY_F23;+ case XK_F24: return GLFW_KEY_F24;+ case XK_F25: return GLFW_KEY_F25;++ // Numeric keypad (should have been detected in secondary keysym!)+ case XK_KP_Divide: return GLFW_KEY_KP_DIVIDE;+ case XK_KP_Multiply: return GLFW_KEY_KP_MULTIPLY;+ case XK_KP_Subtract: return GLFW_KEY_KP_SUBTRACT;+ case XK_KP_Add: return GLFW_KEY_KP_ADD;+ case XK_KP_Equal: return GLFW_KEY_KP_EQUAL;+ case XK_KP_Enter: return GLFW_KEY_KP_ENTER;++ // The rest (should be printable keys)+ default:+ // Make uppercase+ XConvertCase( key, &key_lc, &key_uc );+ key = key_uc;++ // Valid ISO 8859-1 character?+ if( (key >= 32 && key <= 126) ||+ (key >= 160 && key <= 255) )+ {+ return (int) key;+ }+ return GLFW_KEY_UNKNOWN;+ }+}+++//========================================================================+// _glfwTranslateChar() - Translates an X Window event to Unicode+//========================================================================++static int _glfwTranslateChar( XKeyEvent *event )+{+ KeySym keysym;++ // Get X11 keysym+ XLookupString( event, NULL, 0, &keysym, NULL );++ // Convert to Unicode (see x11_keysym2unicode.c)+ return (int) _glfwKeySym2Unicode( keysym );+}++++//========================================================================+// Get next X event (called by glfwPollEvents)+//========================================================================++static int _glfwGetNextEvent( void )+{+ XEvent event, next_event;++ // Pull next event from event queue+ XNextEvent( _glfwLibrary.Dpy, &event );++ // Handle certain window messages+ switch( event.type )+ {+ // Is a key being pressed?+ case KeyPress:+ {+ // Translate and report key press+ _glfwInputKey( _glfwTranslateKey( event.xkey.keycode ), GLFW_PRESS );++ // Translate and report character input+ if( _glfwWin.CharCallback )+ {+ _glfwInputChar( _glfwTranslateChar( &event.xkey ), GLFW_PRESS );+ }+ break;+ }++ // Is a key being released?+ case KeyRelease:+ {+ // Do not report key releases for key repeats. For key repeats+ // we will get KeyRelease/KeyPress pairs with identical time+ // stamps. User selected key repeat filtering is handled in+ // _glfwInputKey()/_glfwInputChar().+ if( XEventsQueued( _glfwLibrary.Dpy, QueuedAfterReading ) )+ {+ XPeekEvent( _glfwLibrary.Dpy, &next_event );+ if( next_event.type == KeyPress &&+ next_event.xkey.window == event.xkey.window &&+ next_event.xkey.keycode == event.xkey.keycode &&+ next_event.xkey.time == event.xkey.time )+ {+ // Do not report anything for this event+ break;+ }+ }++ // Translate and report key release+ _glfwInputKey( _glfwTranslateKey( event.xkey.keycode ), GLFW_RELEASE );++ // Translate and report character input+ if( _glfwWin.CharCallback )+ {+ _glfwInputChar( _glfwTranslateChar( &event.xkey ), GLFW_RELEASE );+ }+ break;+ }++ // Were any of the mouse-buttons pressed?+ case ButtonPress:+ {+ if( event.xbutton.button == Button1 )+ {+ _glfwInputMouseClick( GLFW_MOUSE_BUTTON_LEFT, GLFW_PRESS );+ }+ else if( event.xbutton.button == Button2 )+ {+ _glfwInputMouseClick( GLFW_MOUSE_BUTTON_MIDDLE, GLFW_PRESS );+ }+ else if( event.xbutton.button == Button3 )+ {+ _glfwInputMouseClick( GLFW_MOUSE_BUTTON_RIGHT, GLFW_PRESS );+ }++ // XFree86 3.3.2 and later translates mouse wheel up/down into+ // mouse button 4 & 5 presses+ else if( event.xbutton.button == Button4 )+ {+ _glfwInput.WheelPos++; // To verify: is this up or down?+ if( _glfwWin.MouseWheelCallback )+ {+ _glfwWin.MouseWheelCallback( _glfwInput.WheelPos );+ }+ }+ else if( event.xbutton.button == Button5 )+ {+ _glfwInput.WheelPos--;+ if( _glfwWin.MouseWheelCallback )+ {+ _glfwWin.MouseWheelCallback( _glfwInput.WheelPos );+ }+ }+ break;+ }++ // Were any of the mouse-buttons released?+ case ButtonRelease:+ {+ if( event.xbutton.button == Button1 )+ {+ _glfwInputMouseClick( GLFW_MOUSE_BUTTON_LEFT,+ GLFW_RELEASE );+ }+ else if( event.xbutton.button == Button2 )+ {+ _glfwInputMouseClick( GLFW_MOUSE_BUTTON_MIDDLE,+ GLFW_RELEASE );+ }+ else if( event.xbutton.button == Button3 )+ {+ _glfwInputMouseClick( GLFW_MOUSE_BUTTON_RIGHT,+ GLFW_RELEASE );+ }+ break;+ }++ // Was the mouse moved?+ case MotionNotify:+ {+ if( event.xmotion.x != _glfwInput.CursorPosX ||+ event.xmotion.y != _glfwInput.CursorPosY )+ {+ if( _glfwWin.MouseLock )+ {+ _glfwInput.MousePosX += event.xmotion.x -+ _glfwInput.CursorPosX;+ _glfwInput.MousePosY += event.xmotion.y -+ _glfwInput.CursorPosY;+ }+ else+ {+ _glfwInput.MousePosX = event.xmotion.x;+ _glfwInput.MousePosY = event.xmotion.y;+ }+ _glfwInput.CursorPosX = event.xmotion.x;+ _glfwInput.CursorPosY = event.xmotion.y;+ _glfwInput.MouseMoved = GL_TRUE;++ // Call user callback function+ if( _glfwWin.MousePosCallback )+ {+ _glfwWin.MousePosCallback( _glfwInput.MousePosX,+ _glfwInput.MousePosY );+ }+ }+ break;+ }++ // Was the window resized?+ case ConfigureNotify:+ {+ if( event.xconfigure.width != _glfwWin.Width ||+ event.xconfigure.height != _glfwWin.Height )+ {+ _glfwWin.Width = event.xconfigure.width;+ _glfwWin.Height = event.xconfigure.height;+ if( _glfwWin.WindowSizeCallback )+ {+ _glfwWin.WindowSizeCallback( _glfwWin.Width,+ _glfwWin.Height );+ }+ }+ break;+ }++ // Was the window closed by the window manager?+ case ClientMessage:+ {+ if( (Atom) event.xclient.data.l[ 0 ] == _glfwWin.WMDeleteWindow )+ {+ return GL_TRUE;+ }++ if( (Atom) event.xclient.data.l[ 0 ] == _glfwWin.WMPing )+ {+ XSendEvent( _glfwLibrary.Dpy,+ RootWindow( _glfwLibrary.Dpy, _glfwWin.VI->screen ),+ False, SubstructureNotifyMask | SubstructureRedirectMask, &event );+ }+ break;+ }++ // Was the window mapped (un-iconified)?+ case MapNotify:+ _glfwWin.MapNotifyCount++;+ break;++ // Was the window unmapped (iconified)?+ case UnmapNotify:+ _glfwWin.MapNotifyCount--;+ break;++ // Was the window activated?+ case FocusIn:+ _glfwWin.FocusInCount++;+ break;++ // Was the window de-activated?+ case FocusOut:+ _glfwWin.FocusInCount--;+ break;++ // Was the window contents damaged?+ case Expose:+ {+ // Call user callback function+ if( _glfwWin.WindowRefreshCallback )+ {+ _glfwWin.WindowRefreshCallback();+ }+ break;+ }++ // Was the window destroyed?+ case DestroyNotify:+ return GL_TRUE;++ default:+ {+#if defined( _GLFW_HAS_XRANDR )+ switch( event.type - _glfwLibrary.XRandR.EventBase )+ {+ case RRScreenChangeNotify:+ {+ // Show XRandR that we really care+ XRRUpdateConfiguration( &event );+ break;+ }+ }+#endif+ break;+ }+ }++ // The window was not destroyed+ return GL_FALSE;+}+++//========================================================================+// _glfwCreateNULLCursor() - Create a blank cursor (for locked mouse mode)+//========================================================================++Cursor _glfwCreateNULLCursor( Display *display, Window root )+{+ Pixmap cursormask;+ XGCValues xgc;+ GC gc;+ XColor col;+ Cursor cursor;++ cursormask = XCreatePixmap( display, root, 1, 1, 1 );+ xgc.function = GXclear;+ gc = XCreateGC( display, cursormask, GCFunction, &xgc );+ XFillRectangle( display, cursormask, gc, 0, 0, 1, 1 );+ col.pixel = 0;+ col.red = 0;+ col.flags = 4;+ cursor = XCreatePixmapCursor( display, cursormask, cursormask,+ &col,&col, 0,0 );+ XFreePixmap( display, cursormask );+ XFreeGC( display, gc );++ return cursor;+}+++//========================================================================+// _glfwInitGLXExtensions() - Initialize GLX-specific extensions+//========================================================================++static void _glfwInitGLXExtensions( void )+{+ int has_swap_control;++ // Initialize OpenGL extension: GLX_SGI_swap_control+ has_swap_control = _glfwPlatformExtensionSupported(+ "GLX_SGI_swap_control"+ );++ if( has_swap_control )+ {+ _glfwWin.SwapInterval = (GLXSWAPINTERVALSGI_T)+ _glfw_glXGetProcAddress( (GLubyte*) "glXSwapIntervalSGI" );+ }+ else+ {+ _glfwWin.SwapInterval = NULL;+ }+}++++//************************************************************************+//**** Platform implementation functions ****+//************************************************************************++//========================================================================+// _glfwPlatformOpenWindow() - Here is where the window is created, and+// the OpenGL rendering context is created+//========================================================================++int _glfwPlatformOpenWindow( int width, int height, int redbits,+ int greenbits, int bluebits, int alphabits, int depthbits,+ int stencilbits, int mode, _GLFWhints* hints )+{+ Colormap cmap;+ XSetWindowAttributes wa;+ XEvent event;+ Atom protocols[2];++ // Clear platform specific GLFW window state+ _glfwWin.VI = NULL;+ _glfwWin.CX = (GLXContext)0;+ _glfwWin.Win = (Window)0;+ _glfwWin.Hints = NULL;+ _glfwWin.PointerGrabbed = GL_FALSE;+ _glfwWin.KeyboardGrabbed = GL_FALSE;+ _glfwWin.OverrideRedirect = GL_FALSE;+ _glfwWin.FS.ModeChanged = GL_FALSE;+ _glfwWin.Saver.Changed = GL_FALSE;+ _glfwWin.RefreshRate = hints->RefreshRate;++ // Fullscreen & screen saver settings+ // Check if GLX is supported on this display+ if( !glXQueryExtension( _glfwLibrary.Dpy, NULL, NULL ) )+ {+ _glfwPlatformCloseWindow();+ return GL_FALSE;+ }++ // Get screen ID for this window+ _glfwWin.Scrn = _glfwLibrary.DefaultScreen;++ // Get an appropriate visual+ _glfwWin.VI = _glfwChooseVisual( _glfwLibrary.Dpy,+ _glfwWin.Scrn,+ redbits, greenbits, bluebits,+ alphabits, depthbits, stencilbits,+ hints->AccumRedBits, hints->AccumGreenBits,+ hints->AccumBlueBits, hints->AccumAlphaBits,+ hints->AuxBuffers, hints->Samples, hints->Stereo );+ if( _glfwWin.VI == NULL )+ {+ _glfwPlatformCloseWindow();+ return GL_FALSE;+ }++ // Create a GLX context+ _glfwWin.CX = glXCreateContext( _glfwLibrary.Dpy, _glfwWin.VI, 0, GL_TRUE );+ if( _glfwWin.CX == NULL )+ {+ _glfwPlatformCloseWindow();+ return GL_FALSE;+ }++ // Create a colormap+ cmap = XCreateColormap( _glfwLibrary.Dpy, RootWindow( _glfwLibrary.Dpy,+ _glfwWin.VI->screen), _glfwWin.VI->visual, AllocNone );++ // Do we want fullscreen?+ if( mode == GLFW_FULLSCREEN )+ {+ // Change video mode+ _glfwSetVideoMode( _glfwWin.Scrn, &_glfwWin.Width,+ &_glfwWin.Height, &_glfwWin.RefreshRate );++ // Remember old screen saver settings+ XGetScreenSaver( _glfwLibrary.Dpy, &_glfwWin.Saver.Timeout,+ &_glfwWin.Saver.Interval, &_glfwWin.Saver.Blanking,+ &_glfwWin.Saver.Exposure );++ // Disable screen saver+ XSetScreenSaver( _glfwLibrary.Dpy, 0, 0, DontPreferBlanking,+ DefaultExposures );+ }++ // Attributes for window+ wa.colormap = cmap;+ wa.border_pixel = 0;+ wa.event_mask = StructureNotifyMask | KeyPressMask | KeyReleaseMask |+ PointerMotionMask | ButtonPressMask | ButtonReleaseMask |+ ExposureMask | FocusChangeMask | VisibilityChangeMask;++ // Create a window+ _glfwWin.Win = XCreateWindow(+ _glfwLibrary.Dpy,+ RootWindow( _glfwLibrary.Dpy, _glfwWin.VI->screen ),+ 0, 0, // Upper left corner+ _glfwWin.Width, _glfwWin.Height, // Width, height+ 0, // Borderwidth+ _glfwWin.VI->depth, // Depth+ InputOutput,+ _glfwWin.VI->visual,+ CWBorderPixel | CWColormap | CWEventMask,+ &wa+ );+ if( !_glfwWin.Win )+ {+ _glfwPlatformCloseWindow();+ return GL_FALSE;+ }++ // Get the delete window WM protocol atom+ _glfwWin.WMDeleteWindow = XInternAtom( _glfwLibrary.Dpy,+ "WM_DELETE_WINDOW",+ False );++ // Get the ping WM protocol atom+ _glfwWin.WMPing = XInternAtom( _glfwLibrary.Dpy, "_NET_WM_PING", False );++ protocols[0] = _glfwWin.WMDeleteWindow;+ protocols[1] = _glfwWin.WMPing;++ // Allow us to trap the Window Close protocol+ XSetWMProtocols( _glfwLibrary.Dpy, _glfwWin.Win, protocols,+ sizeof(protocols) / sizeof(Atom) );++ // Remove window decorations for fullscreen windows+ if( mode == GLFW_FULLSCREEN )+ {+ _glfwDisableDecorations();+ }++ _glfwWin.Hints = XAllocSizeHints();++ if( hints->WindowNoResize )+ {+ _glfwWin.Hints->flags |= (PMinSize | PMaxSize);+ _glfwWin.Hints->min_width = _glfwWin.Hints->max_width = _glfwWin.Width;+ _glfwWin.Hints->min_height = _glfwWin.Hints->max_height = _glfwWin.Height;+ }++ if( mode == GLFW_FULLSCREEN )+ {+ _glfwWin.Hints->flags |= PPosition;+ _glfwWin.Hints->x = 0;+ _glfwWin.Hints->y = 0;+ }++ XSetWMNormalHints( _glfwLibrary.Dpy, _glfwWin.Win, _glfwWin.Hints );++ // Map window+ XMapWindow( _glfwLibrary.Dpy, _glfwWin.Win );++ // Wait for map notification+ XIfEvent( _glfwLibrary.Dpy, &event, _glfwWaitForMapNotify,+ (char*)_glfwWin.Win );++ // Make sure that our window ends up on top of things+ XRaiseWindow( _glfwLibrary.Dpy, _glfwWin.Win );++ // Fullscreen mode "post processing"+ if( mode == GLFW_FULLSCREEN )+ {+#if defined( _GLFW_HAS_XRANDR )+ // Request screen change notifications+ if( _glfwLibrary.XRandR.Available )+ {+ XRRSelectInput( _glfwLibrary.Dpy,+ _glfwWin.Win,+ RRScreenChangeNotifyMask );+ }+#endif++ // Force window position/size (some WMs do their own window+ // geometry, which we want to override)+ XMoveWindow( _glfwLibrary.Dpy, _glfwWin.Win, 0, 0 );+ XResizeWindow( _glfwLibrary.Dpy, _glfwWin.Win, _glfwWin.Width,+ _glfwWin.Height );++ // Grab keyboard+ if( XGrabKeyboard( _glfwLibrary.Dpy, _glfwWin.Win, True,+ GrabModeAsync, GrabModeAsync, CurrentTime ) ==+ GrabSuccess )+ {+ _glfwWin.KeyboardGrabbed = GL_TRUE;+ }++ // Grab mouse cursor+ if( XGrabPointer( _glfwLibrary.Dpy, _glfwWin.Win, True,+ ButtonPressMask | ButtonReleaseMask |+ PointerMotionMask, GrabModeAsync, GrabModeAsync,+ _glfwWin.Win, None, CurrentTime ) ==+ GrabSuccess )+ {+ _glfwWin.PointerGrabbed = GL_TRUE;+ }++ // Try to get window inside viewport (for virtual displays) by+ // moving the mouse cursor to the upper left corner (and then to+ // the center) - this works for XFree86+ XWarpPointer( _glfwLibrary.Dpy, None, _glfwWin.Win, 0,0,0,0, 0,0 );+ XWarpPointer( _glfwLibrary.Dpy, None, _glfwWin.Win, 0,0,0,0,+ _glfwWin.Width/2, _glfwWin.Height/2 );+ }++ // Set window & icon name+ _glfwPlatformSetWindowTitle( "GLFW Window" );++ // Connect the context to the window+ glXMakeCurrent( _glfwLibrary.Dpy, _glfwWin.Win, _glfwWin.CX );++ // Start by clearing the front buffer to black (avoid ugly desktop+ // remains in our OpenGL window)+ glClear( GL_COLOR_BUFFER_BIT );+ glXSwapBuffers( _glfwLibrary.Dpy, _glfwWin.Win );++ // Initialize GLX-specific OpenGL extensions+ _glfwInitGLXExtensions();++ return GL_TRUE;+}+++//========================================================================+// Properly kill the window/video display+//========================================================================++void _glfwPlatformCloseWindow( void )+{+#if defined( _GLFW_HAS_XRANDR )+ XRRScreenConfiguration *sc;+ Window root;+#endif++ // Free WM size hints+ if( _glfwWin.Hints )+ {+ XFree( _glfwWin.Hints );+ _glfwWin.Hints = NULL;+ }++ // Do we have a rendering context?+ if( _glfwWin.CX )+ {+ // Release the context+ glXMakeCurrent( _glfwLibrary.Dpy, None, NULL );++ // Delete the context+ glXDestroyContext( _glfwLibrary.Dpy, _glfwWin.CX );+ _glfwWin.CX = NULL;+ }++ // Ungrab pointer and/or keyboard?+ if( _glfwWin.KeyboardGrabbed )+ {+ XUngrabKeyboard( _glfwLibrary.Dpy, CurrentTime );+ _glfwWin.KeyboardGrabbed = GL_FALSE;+ }+ if( _glfwWin.PointerGrabbed )+ {+ XUngrabPointer( _glfwLibrary.Dpy, CurrentTime );+ _glfwWin.PointerGrabbed = GL_FALSE;+ }++ // Do we have a window?+ if( _glfwWin.Win )+ {+ // Unmap the window+ XUnmapWindow( _glfwLibrary.Dpy, _glfwWin.Win );++ // Destroy the window+ XDestroyWindow( _glfwLibrary.Dpy, _glfwWin.Win );+ _glfwWin.Win = (Window) 0;+ }++ // Did we change the fullscreen resolution?+ if( _glfwWin.FS.ModeChanged )+ {+#if defined( _GLFW_HAS_XRANDR )+ if( _glfwLibrary.XRandR.Available )+ {+ root = RootWindow( _glfwLibrary.Dpy, _glfwWin.Scrn );+ sc = XRRGetScreenInfo( _glfwLibrary.Dpy, root );++ XRRSetScreenConfig( _glfwLibrary.Dpy,+ sc,+ root,+ _glfwWin.FS.OldSizeID,+ _glfwWin.FS.OldRotation,+ CurrentTime );++ XRRFreeScreenConfigInfo( sc );+ }+#elif defined( _GLFW_HAS_XF86VIDMODE )+ if( _glfwLibrary.XF86VidMode.Available )+ {+ // Unlock mode switch+ XF86VidModeLockModeSwitch( _glfwLibrary.Dpy,+ _glfwWin.Scrn,+ 0 );++ // Change the video mode back to the old mode+ XF86VidModeSwitchToMode( _glfwLibrary.Dpy,+ _glfwWin.Scrn, &_glfwWin.FS.OldMode );+ }+#endif+ _glfwWin.FS.ModeChanged = GL_FALSE;+ }++ // Did we change the screen saver setting?+ if( _glfwWin.Saver.Changed )+ {+ // Restore old screen saver settings+ XSetScreenSaver( _glfwLibrary.Dpy, _glfwWin.Saver.Timeout,+ _glfwWin.Saver.Interval, _glfwWin.Saver.Blanking,+ _glfwWin.Saver.Exposure );+ _glfwWin.Saver.Changed = GL_FALSE;+ }++ XSync( _glfwLibrary.Dpy, True );+}+++//========================================================================+// _glfwPlatformSetWindowTitle() - Set the window title.+//========================================================================++void _glfwPlatformSetWindowTitle( const char *title )+{+ // Set window & icon title+ XStoreName( _glfwLibrary.Dpy, _glfwWin.Win, title );+ XSetIconName( _glfwLibrary.Dpy, _glfwWin.Win, title );+}+++//========================================================================+// _glfwPlatformSetWindowSize() - Set the window size.+//========================================================================++void _glfwPlatformSetWindowSize( int width, int height )+{+ int mode = 0, rate, sizechanged = GL_FALSE;+ GLint drawbuffer;+ GLfloat clearcolor[4];++ rate = _glfwWin.RefreshRate;++ // If we are in fullscreen mode, get some info about the current mode+ if( _glfwWin.Fullscreen )+ {+ // Get closest match for target video mode+ mode = _glfwGetClosestVideoMode( _glfwWin.Scrn, &width, &height, &rate );+ }++ if( _glfwWin.WindowNoResize )+ {+ _glfwWin.Hints->min_width = _glfwWin.Hints->max_width = width;+ _glfwWin.Hints->min_height = _glfwWin.Hints->max_height = height;+ }++ XSetWMNormalHints( _glfwLibrary.Dpy, _glfwWin.Win, _glfwWin.Hints );++ // Change window size before changing fullscreen mode?+ if( _glfwWin.Fullscreen && (width > _glfwWin.Width) )+ {+ XResizeWindow( _glfwLibrary.Dpy, _glfwWin.Win, width, height );+ sizechanged = GL_TRUE;+ }++ // Change fullscreen video mode?+ if( _glfwWin.Fullscreen )+ {+ // Change video mode (keeping current rate)+ _glfwSetVideoModeMODE( _glfwWin.Scrn, mode, _glfwWin.RefreshRate );++ // Clear the front buffer to black (avoid ugly desktop remains in+ // our OpenGL window)+ glGetIntegerv( GL_DRAW_BUFFER, &drawbuffer );+ glGetFloatv( GL_COLOR_CLEAR_VALUE, clearcolor );+ glClearColor( 0.0f, 0.0f, 0.0f, 0.0f );+ glClear( GL_COLOR_BUFFER_BIT );+ if( drawbuffer == GL_BACK )+ {+ glXSwapBuffers( _glfwLibrary.Dpy, _glfwWin.Win );+ }+ glClearColor( clearcolor[0], clearcolor[1], clearcolor[2],+ clearcolor[3] );+ }++ // Set window size (if not already changed)+ if( !sizechanged )+ {+ XResizeWindow( _glfwLibrary.Dpy, _glfwWin.Win, width, height );+ }+}+++//========================================================================+// _glfwPlatformSetWindowPos() - Set the window position.+//========================================================================++void _glfwPlatformSetWindowPos( int x, int y )+{+ // Set window position+ XMoveWindow( _glfwLibrary.Dpy, _glfwWin.Win, x, y );+}+++//========================================================================+// _glfwPlatformIconfyWindow() - Window iconification+//========================================================================++void _glfwPlatformIconifyWindow( void )+{+ // We can't do this for override redirect windows+ if( _glfwWin.OverrideRedirect )+ {+ return;+ }++ // In fullscreen mode, we need to restore the desktop video mode+ if( _glfwWin.Fullscreen )+ {+#if defined( _GLFW_HAS_XF86VIDMODE )+ if( _glfwLibrary.XF86VidMode.Available )+ {+ // Unlock mode switch+ XF86VidModeLockModeSwitch( _glfwLibrary.Dpy,+ _glfwWin.Scrn,+ 0 );++ // Change the video mode back to the old mode+ XF86VidModeSwitchToMode( _glfwLibrary.Dpy,+ _glfwWin.Scrn, &_glfwWin.FS.OldMode );+ }+#endif+ _glfwWin.FS.ModeChanged = GL_FALSE;+ }++ // Show mouse pointer+ if( _glfwWin.PointerHidden )+ {+ XUndefineCursor( _glfwLibrary.Dpy, _glfwWin.Win );+ _glfwWin.PointerHidden = GL_FALSE;+ }++ // Un-grab mouse pointer+ if( _glfwWin.PointerGrabbed )+ {+ XUngrabPointer( _glfwLibrary.Dpy, CurrentTime );+ _glfwWin.PointerGrabbed = GL_FALSE;+ }++ // Iconify window+ XIconifyWindow( _glfwLibrary.Dpy, _glfwWin.Win,+ _glfwWin.Scrn );++ // Window is now iconified+ _glfwWin.Iconified = GL_TRUE;+}+++//========================================================================+// Window un-iconification+//========================================================================++void _glfwPlatformRestoreWindow( void )+{+ // We can't do this for override redirect windows+ if( _glfwWin.OverrideRedirect )+ {+ return;+ }++ // In fullscreen mode, change back video mode to user selected mode+ if( _glfwWin.Fullscreen )+ {+ _glfwSetVideoMode( _glfwWin.Scrn,+ &_glfwWin.Width, &_glfwWin.Height, &_glfwWin.RefreshRate );+ }++ // Un-iconify window+ XMapWindow( _glfwLibrary.Dpy, _glfwWin.Win );++ // In fullscreen mode...+ if( _glfwWin.Fullscreen )+ {+ // Make sure window is in upper left corner+ XMoveWindow( _glfwLibrary.Dpy, _glfwWin.Win, 0, 0 );++ // Get input focus+ XSetInputFocus( _glfwLibrary.Dpy, _glfwWin.Win, RevertToParent,+ CurrentTime );+ }++ // Lock mouse, if necessary+ if( _glfwWin.MouseLock )+ {+ // Hide cursor+ if( !_glfwWin.PointerHidden )+ {+ XDefineCursor( _glfwLibrary.Dpy, _glfwWin.Win,+ _glfwCreateNULLCursor( _glfwLibrary.Dpy,+ _glfwWin.Win ) );+ _glfwWin.PointerHidden = GL_TRUE;+ }++ // Grab cursor+ if( !_glfwWin.PointerGrabbed )+ {+ if( XGrabPointer( _glfwLibrary.Dpy, _glfwWin.Win, True,+ ButtonPressMask | ButtonReleaseMask |+ PointerMotionMask, GrabModeAsync,+ GrabModeAsync, _glfwWin.Win, None,+ CurrentTime ) == GrabSuccess )+ {+ _glfwWin.PointerGrabbed = GL_TRUE;+ }+ }+ }++ // Window is no longer iconified+ _glfwWin.Iconified = GL_FALSE;+}+++//========================================================================+// _glfwPlatformSwapBuffers() - Swap buffers (double-buffering) and poll+// any new events.+//========================================================================++void _glfwPlatformSwapBuffers( void )+{+ // Update display-buffer+ glXSwapBuffers( _glfwLibrary.Dpy, _glfwWin.Win );+}+++//========================================================================+// _glfwPlatformSwapInterval() - Set double buffering swap interval+//========================================================================++void _glfwPlatformSwapInterval( int interval )+{+ if( _glfwWin.SwapInterval )+ {+ _glfwWin.SwapInterval( interval );+ }+}+++//========================================================================+// _glfwPlatformRefreshWindowParams()+//========================================================================++void _glfwPlatformRefreshWindowParams( void )+{+#if defined( _GLFW_HAS_XRANDR )+ XRRScreenConfiguration *sc;+#elif defined( _GLFW_HAS_XF86VIDMODE )+ XF86VidModeModeLine modeline;+ int dotclock;+ float pixels_per_second, pixels_per_frame;+#endif+ int sample_buffers;++ // AFAIK, there is no easy/sure way of knowing if OpenGL is hardware+ // accelerated+ _glfwWin.Accelerated = GL_TRUE;++ // "Standard" window parameters+ glXGetConfig( _glfwLibrary.Dpy, _glfwWin.VI, GLX_RED_SIZE,+ &_glfwWin.RedBits );+ glXGetConfig( _glfwLibrary.Dpy, _glfwWin.VI, GLX_GREEN_SIZE,+ &_glfwWin.GreenBits );+ glXGetConfig( _glfwLibrary.Dpy, _glfwWin.VI, GLX_BLUE_SIZE,+ &_glfwWin.BlueBits );+ glXGetConfig( _glfwLibrary.Dpy, _glfwWin.VI, GLX_ALPHA_SIZE,+ &_glfwWin.AlphaBits );+ glXGetConfig( _glfwLibrary.Dpy, _glfwWin.VI, GLX_DEPTH_SIZE,+ &_glfwWin.DepthBits );+ glXGetConfig( _glfwLibrary.Dpy, _glfwWin.VI, GLX_STENCIL_SIZE,+ &_glfwWin.StencilBits );+ glXGetConfig( _glfwLibrary.Dpy, _glfwWin.VI, GLX_ACCUM_RED_SIZE,+ &_glfwWin.AccumRedBits );+ glXGetConfig( _glfwLibrary.Dpy, _glfwWin.VI, GLX_ACCUM_GREEN_SIZE,+ &_glfwWin.AccumGreenBits );+ glXGetConfig( _glfwLibrary.Dpy, _glfwWin.VI, GLX_ACCUM_BLUE_SIZE,+ &_glfwWin.AccumBlueBits );+ glXGetConfig( _glfwLibrary.Dpy, _glfwWin.VI, GLX_ACCUM_ALPHA_SIZE,+ &_glfwWin.AccumAlphaBits );+ glXGetConfig( _glfwLibrary.Dpy, _glfwWin.VI, GLX_AUX_BUFFERS,+ &_glfwWin.AuxBuffers );++ // Get stereo rendering setting+ glXGetConfig( _glfwLibrary.Dpy, _glfwWin.VI, GLX_STEREO,+ &_glfwWin.Stereo );+ _glfwWin.Stereo = _glfwWin.Stereo ? 1 : 0;++ // Get multisample buffer samples+ glXGetConfig( _glfwLibrary.Dpy, _glfwWin.VI, GLX_SAMPLES,+ &_glfwWin.Samples );+ glXGetConfig( _glfwLibrary.Dpy, _glfwWin.VI, GLX_SAMPLE_BUFFERS, + &sample_buffers );+ if( sample_buffers == 0 )+ _glfwWin.Samples = 0;+ + // Default to refresh rate unknown (=0 according to GLFW spec)+ _glfwWin.RefreshRate = 0;+ + // Retrieve refresh rate, if possible+#if defined( _GLFW_HAS_XRANDR )+ if( _glfwLibrary.XRandR.Available )+ {+ sc = XRRGetScreenInfo( _glfwLibrary.Dpy,+ RootWindow( _glfwLibrary.Dpy, _glfwWin.Scrn ) );+ _glfwWin.RefreshRate = XRRConfigCurrentRate( sc );+ XRRFreeScreenConfigInfo( sc );+ }+#elif defined( _GLFW_HAS_XF86VIDMODE )+ if( _glfwLibrary.XF86VidMode.Available )+ {+ // Use the XF86VidMode extension to get current video mode+ XF86VidModeGetModeLine( _glfwLibrary.Dpy, _glfwWin.Scrn,+ &dotclock, &modeline );+ pixels_per_second = 1000.0f * (float) dotclock;+ pixels_per_frame = (float) modeline.htotal * modeline.vtotal;+ _glfwWin.RefreshRate = (int)(pixels_per_second/pixels_per_frame+0.5);+ }+#endif+}+++//========================================================================+// _glfwPlatformPollEvents() - Poll for new window and input events+//========================================================================++void _glfwPlatformPollEvents( void )+{+ int winclosed = GL_FALSE;++ // Flag that the cursor has not moved+ _glfwInput.MouseMoved = GL_FALSE;++ // Clear MapNotify and FocusIn counts+ _glfwWin.MapNotifyCount = 0;+ _glfwWin.FocusInCount = 0;++ // Use XSync to synchronise events to the X display.+ // I don't know if this can have a serious performance impact. My+ // benchmarks with a GeForce card under Linux shows no difference with+ // or without XSync, but when the GL window is rendered over a slow+ // network I have noticed bad event syncronisation problems when XSync+ // is not used, so I decided to use it.+ XSync( _glfwLibrary.Dpy, False );++ // Empty the window event queue+ while( XPending( _glfwLibrary.Dpy ) )+ {+ if( _glfwGetNextEvent() )+ {+ winclosed = GL_TRUE;+ }+ }++ // Did we get mouse movement in locked cursor mode?+ if( _glfwInput.MouseMoved && _glfwWin.MouseLock )+ {+ int maxx, minx, maxy, miny;++ // Calculate movement threshold+ minx = _glfwWin.Width / 4;+ maxx = (_glfwWin.Width * 3) / 4;+ miny = _glfwWin.Height / 4;+ maxy = (_glfwWin.Height * 3) / 4;++ // Did the mouse cursor move beyond our movement threshold+ if(_glfwInput.CursorPosX < minx || _glfwInput.CursorPosX > maxx ||+ _glfwInput.CursorPosY < miny || _glfwInput.CursorPosY > maxy)+ {+ // Move the mouse pointer back to the window center so that it+ // does not wander off...+ _glfwPlatformSetMouseCursorPos( _glfwWin.Width/2,+ _glfwWin.Height/2 );+ XSync( _glfwLibrary.Dpy, False );+ }+ }++ // Was the window (un)iconified?+ if( _glfwWin.MapNotifyCount < 0 && !_glfwWin.Iconified )+ {+ // Show mouse pointer+ if( _glfwWin.PointerHidden )+ {+ XUndefineCursor( _glfwLibrary.Dpy, _glfwWin.Win );+ _glfwWin.PointerHidden = GL_FALSE;+ }++ // Un-grab mouse pointer+ if( _glfwWin.PointerGrabbed )+ {+ XUngrabPointer( _glfwLibrary.Dpy, CurrentTime );+ _glfwWin.PointerGrabbed = GL_FALSE;+ }++ _glfwWin.Iconified = GL_TRUE;+ }+ else if( _glfwWin.MapNotifyCount > 0 && _glfwWin.Iconified )+ {+ // Restore fullscreen mode properties+ if( _glfwWin.Fullscreen )+ {+ // Change back video mode to user selected mode+ _glfwSetVideoMode( _glfwWin.Scrn, &_glfwWin.Width,+ &_glfwWin.Height, &_glfwWin.RefreshRate );++ // Disable window manager decorations+ _glfwEnableDecorations();++ // Make sure window is in upper left corner+ XMoveWindow( _glfwLibrary.Dpy, _glfwWin.Win, 0, 0 );++ // Get input focus+ XSetInputFocus( _glfwLibrary.Dpy, _glfwWin.Win,+ RevertToParent, CurrentTime );+ }++ // Hide cursor if necessary+ if( _glfwWin.MouseLock && !_glfwWin.PointerHidden )+ {+ if( !_glfwWin.PointerHidden )+ {+ XDefineCursor( _glfwLibrary.Dpy, _glfwWin.Win,+ _glfwCreateNULLCursor( _glfwLibrary.Dpy,+ _glfwWin.Win ) );+ _glfwWin.PointerHidden = GL_TRUE;+ }+ }++ // Grab cursor if necessary+ if( (_glfwWin.MouseLock || _glfwWin.Fullscreen) &&+ !_glfwWin.PointerGrabbed )+ {+ if( XGrabPointer( _glfwLibrary.Dpy, _glfwWin.Win, True,+ ButtonPressMask | ButtonReleaseMask |+ PointerMotionMask, GrabModeAsync,+ GrabModeAsync, _glfwWin.Win, None,+ CurrentTime ) == GrabSuccess )+ {+ _glfwWin.PointerGrabbed = GL_TRUE;+ }+ }++ _glfwWin.Iconified = GL_FALSE;+ }++ // Did the window get/lose focus+ if( _glfwWin.FocusInCount > 0 && !_glfwWin.Active )+ {+ // If we are in fullscreen mode, restore window+ if( _glfwWin.Fullscreen && _glfwWin.Iconified )+ {+ _glfwPlatformRestoreWindow();+ }++ // Window is now active+ _glfwWin.Active = GL_TRUE;+ }+ else if( _glfwWin.FocusInCount < 0 && _glfwWin.Active )+ {+ // If we are in fullscreen mode, iconfify window+ if( _glfwWin.Fullscreen )+ {+ _glfwPlatformIconifyWindow();+ }++ // Window is not active+ _glfwWin.Active = GL_FALSE;+ _glfwInputDeactivation();+ }++ // Was there a window close request?+ if( winclosed && _glfwWin.WindowCloseCallback )+ {+ // Check if the program wants us to close the window+ winclosed = _glfwWin.WindowCloseCallback();+ }+ if( winclosed )+ {+ glfwCloseWindow();+ }+}+++//========================================================================+// _glfwPlatformWaitEvents() - Wait for new window and input events+//========================================================================++void _glfwPlatformWaitEvents( void )+{+ XEvent event;++ // Wait for new events (blocking)+ XNextEvent( _glfwLibrary.Dpy, &event );+ XPutBackEvent( _glfwLibrary.Dpy, &event );++ // Poll events from queue+ _glfwPlatformPollEvents();+}+++//========================================================================+// _glfwPlatformHideMouseCursor() - Hide mouse cursor (lock it)+//========================================================================++void _glfwPlatformHideMouseCursor( void )+{+ // Hide cursor+ if( !_glfwWin.PointerHidden )+ {+ XDefineCursor( _glfwLibrary.Dpy, _glfwWin.Win,+ _glfwCreateNULLCursor( _glfwLibrary.Dpy,+ _glfwWin.Win ) );+ _glfwWin.PointerHidden = GL_TRUE;+ }++ // Grab cursor to user window+ if( !_glfwWin.PointerGrabbed )+ {+ if( XGrabPointer( _glfwLibrary.Dpy, _glfwWin.Win, True,+ ButtonPressMask | ButtonReleaseMask |+ PointerMotionMask, GrabModeAsync, GrabModeAsync,+ _glfwWin.Win, None, CurrentTime ) ==+ GrabSuccess )+ {+ _glfwWin.PointerGrabbed = GL_TRUE;+ }+ }+}+++//========================================================================+// _glfwPlatformShowMouseCursor() - Show mouse cursor (unlock it)+//========================================================================++void _glfwPlatformShowMouseCursor( void )+{+ // Un-grab cursor (only in windowed mode: in fullscreen mode we still+ // want the mouse grabbed in order to confine the cursor to the window+ // area)+ if( _glfwWin.PointerGrabbed && !_glfwWin.Fullscreen )+ {+ XUngrabPointer( _glfwLibrary.Dpy, CurrentTime );+ _glfwWin.PointerGrabbed = GL_FALSE;+ }++ // Show cursor+ if( _glfwWin.PointerHidden )+ {+ XUndefineCursor( _glfwLibrary.Dpy, _glfwWin.Win );+ _glfwWin.PointerHidden = GL_FALSE;+ }+}+++//========================================================================+// _glfwPlatformSetMouseCursorPos() - Set physical mouse cursor position+//========================================================================++void _glfwPlatformSetMouseCursorPos( int x, int y )+{+ // Change cursor position+ _glfwInput.CursorPosX = x;+ _glfwInput.CursorPosY = y;+ XWarpPointer( _glfwLibrary.Dpy, None, _glfwWin.Win, 0,0,0,0, x, y );+}+
+ glfw/license.txt view
@@ -0,0 +1,21 @@+Copyright (c) 2002-2007 Camilla Berglund <elmindreda@users.sourceforge.net>++This software is provided 'as-is', without any express or implied+warranty. In no event will the authors be held liable for any damages+arising from the use of this software.++Permission is granted to anyone to use this software for any purpose,+including commercial applications, and to alter it and redistribute it+freely, subject to the following restrictions:++1. The origin of this software must not be misrepresented; you must not+ claim that you wrote the original software. If you use this software+ in a product, an acknowledgment in the product documentation would+ be appreciated but is not required.++2. Altered source versions must be plainly marked as such, and must not+ be misrepresented as being the original software.++3. This notice may not be removed or altered from any source+ distribution.+