From 9104a7f2aef5046145b6a480aaf0a5d8d5491d62 Mon Sep 17 00:00:00 2001 From: Mark Janes Date: Fri, 12 Sep 2014 16:16:39 -0700 Subject: [PATCH] Add egl definitions and related buildsupport. For each supported API, glaze-gl.c requires a definition file which formats interposable function names in a series of macro invocations. * Add egl.xml, downloaded from http://www.opengl.org/registry/ as specified in the specs README. * Append support for egl.def code generation to the specs makefile. * Add egl.def as a prerequisite for libGL.so.1 --- Makefile | 2 +- specs/Makefile | 5 +- specs/egl.def | 105 +++ specs/egl.xml | 2186 ++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 2296 insertions(+), 2 deletions(-) create mode 100644 specs/egl.def create mode 100644 specs/egl.xml diff --git a/Makefile b/Makefile index 0ce4486..6bdd6d4 100644 --- a/Makefile +++ b/Makefile @@ -30,7 +30,7 @@ LIBGLAZE_32_LIBNAME = $(LIBGLAZE_32_SONAME).$(MINOR).$(RELEASE) TARGETS = glaze $(LIBGLAZE_LINKER_NAME) -SPECS = specs/gl.def specs/glx.def +SPECS = specs/gl.def specs/glx.def specs/egl.def ifeq ($(COMPILER_SUPPORTS_32),Yes) TARGETS += $(LIBGLAZE_32_LIBNAME) diff --git a/specs/Makefile b/specs/Makefile index ea316f1..af5b019 100644 --- a/specs/Makefile +++ b/specs/Makefile @@ -1,4 +1,4 @@ -TARGETS=gl.def glx.def +TARGETS=gl.def glx.def egl.def all: $(TARGETS) @@ -8,5 +8,8 @@ all: $(TARGETS) glx.def: glx.xml ./xml2def $? | grep -v GetProcAddress > $@ +egl.def: egl.xml + ./xml2def $? | grep -v eglGetProcAddress > $@ + clean: rm *.def diff --git a/specs/egl.def b/specs/egl.def new file mode 100644 index 0000000..a6f4211 --- /dev/null +++ b/specs/egl.def @@ -0,0 +1,105 @@ +GLAZE_API(eglBindAPI) +GLAZE_API(eglBindTexImage) +GLAZE_API(eglChooseConfig) +GLAZE_API(eglClientWaitSync) +GLAZE_API(eglClientWaitSyncKHR) +GLAZE_API(eglClientWaitSyncNV) +GLAZE_API(eglCopyBuffers) +GLAZE_API(eglCreateContext) +GLAZE_API(eglCreateDRMImageMESA) +GLAZE_API(eglCreateFenceSyncNV) +GLAZE_API(eglCreateImage) +GLAZE_API(eglCreateImageKHR) +GLAZE_API(eglCreatePbufferFromClientBuffer) +GLAZE_API(eglCreatePbufferSurface) +GLAZE_API(eglCreatePixmapSurface) +GLAZE_API(eglCreatePixmapSurfaceHI) +GLAZE_API(eglCreatePlatformPixmapSurface) +GLAZE_API(eglCreatePlatformPixmapSurfaceEXT) +GLAZE_API(eglCreatePlatformWindowSurface) +GLAZE_API(eglCreatePlatformWindowSurfaceEXT) +GLAZE_API(eglCreateStreamFromFileDescriptorKHR) +GLAZE_API(eglCreateStreamKHR) +GLAZE_API(eglCreateStreamProducerSurfaceKHR) +GLAZE_API(eglCreateStreamSyncNV) +GLAZE_API(eglCreateSync) +GLAZE_API(eglCreateSync64KHR) +GLAZE_API(eglCreateSyncKHR) +GLAZE_API(eglCreateWindowSurface) +GLAZE_API(eglDestroyContext) +GLAZE_API(eglDestroyImage) +GLAZE_API(eglDestroyImageKHR) +GLAZE_API(eglDestroyStreamKHR) +GLAZE_API(eglDestroySurface) +GLAZE_API(eglDestroySync) +GLAZE_API(eglDestroySyncKHR) +GLAZE_API(eglDestroySyncNV) +GLAZE_API(eglDupNativeFenceFDANDROID) +GLAZE_API(eglExportDRMImageMESA) +GLAZE_API(eglFenceNV) +GLAZE_API(eglGetConfigAttrib) +GLAZE_API(eglGetConfigs) +GLAZE_API(eglGetCurrentContext) +GLAZE_API(eglGetCurrentDisplay) +GLAZE_API(eglGetCurrentSurface) +GLAZE_API(eglGetDisplay) +GLAZE_API(eglGetError) +GLAZE_API(eglGetOutputLayersEXT) +GLAZE_API(eglGetOutputPortsEXT) +GLAZE_API(eglGetPlatformDisplay) +GLAZE_API(eglGetPlatformDisplayEXT) +GLAZE_API(eglGetStreamFileDescriptorKHR) +GLAZE_API(eglGetSyncAttrib) +GLAZE_API(eglGetSyncAttribKHR) +GLAZE_API(eglGetSyncAttribNV) +GLAZE_API(eglGetSystemTimeFrequencyNV) +GLAZE_API(eglGetSystemTimeNV) +GLAZE_API(eglInitialize) +GLAZE_API(eglLockSurfaceKHR) +GLAZE_API(eglMakeCurrent) +GLAZE_API(eglOutputLayerAttribEXT) +GLAZE_API(eglOutputPortAttribEXT) +GLAZE_API(eglPostSubBufferNV) +GLAZE_API(eglQueryAPI) +GLAZE_API(eglQueryContext) +GLAZE_API(eglQueryDeviceAttribEXT) +GLAZE_API(eglQueryDevicesEXT) +GLAZE_API(eglQueryDeviceStringEXT) +GLAZE_API(eglQueryDisplayAttribEXT) +GLAZE_API(eglQueryNativeDisplayNV) +GLAZE_API(eglQueryNativePixmapNV) +GLAZE_API(eglQueryNativeWindowNV) +GLAZE_API(eglQueryOutputLayerAttribEXT) +GLAZE_API(eglQueryOutputLayerStringEXT) +GLAZE_API(eglQueryOutputPortAttribEXT) +GLAZE_API(eglQueryOutputPortStringEXT) +GLAZE_API(eglQueryStreamKHR) +GLAZE_API(eglQueryStreamTimeKHR) +GLAZE_API(eglQueryStreamu64KHR) +GLAZE_API(eglQueryString) +GLAZE_API(eglQuerySurface) +GLAZE_API(eglQuerySurface64KHR) +GLAZE_API(eglQuerySurfacePointerANGLE) +GLAZE_API(eglReleaseTexImage) +GLAZE_API(eglReleaseThread) +GLAZE_API(eglSetBlobCacheFuncsANDROID) +GLAZE_API(eglSignalSyncKHR) +GLAZE_API(eglSignalSyncNV) +GLAZE_API(eglStreamAttribKHR) +GLAZE_API(eglStreamConsumerAcquireKHR) +GLAZE_API(eglStreamConsumerGLTextureExternalKHR) +GLAZE_API(eglStreamConsumerOutputEXT) +GLAZE_API(eglStreamConsumerReleaseKHR) +GLAZE_API(eglSurfaceAttrib) +GLAZE_API(eglSwapBuffers) +GLAZE_API(eglSwapBuffersRegion2NOK) +GLAZE_API(eglSwapBuffersRegionNOK) +GLAZE_API(eglSwapBuffersWithDamageEXT) +GLAZE_API(eglSwapInterval) +GLAZE_API(eglTerminate) +GLAZE_API(eglUnlockSurfaceKHR) +GLAZE_API(eglWaitClient) +GLAZE_API(eglWaitGL) +GLAZE_API(eglWaitNative) +GLAZE_API(eglWaitSync) +GLAZE_API(eglWaitSyncKHR) diff --git a/specs/egl.xml b/specs/egl.xml new file mode 100644 index 0000000..f77dd95 --- /dev/null +++ b/specs/egl.xml @@ -0,0 +1,2186 @@ + + + + + + + + + #include <KHR/khrplatform.h> + #include <EGL/eglplatform.h> + + + + + + + + + + + + + + typedef unsigned int EGLBoolean; + typedef unsigned int EGLenum; + typedef intptr_t EGLAttribKHR; + typedef intptr_t EGLAttrib; + typedef void *EGLClientBuffer; + typedef void *EGLConfig; + typedef void *EGLContext; + typedef void *EGLDeviceEXT; + typedef void *EGLDisplay; + typedef void *EGLImage; + typedef void *EGLImageKHR; + typedef void *EGLOutputLayerEXT; + typedef void *EGLOutputPortEXT; + typedef void *EGLStreamKHR; + typedef void *EGLSurface; + typedef void *EGLSync; + typedef void *EGLSyncKHR; + typedef void *EGLSyncNV; + typedef void (*__eglMustCastToProperFunctionPointerType)(void); + typedef khronos_utime_nanoseconds_t EGLTimeKHR; + typedef khronos_utime_nanoseconds_t EGLTime; + typedef khronos_utime_nanoseconds_t EGLTimeNV; + typedef khronos_utime_nanoseconds_t EGLuint64NV; + typedef khronos_uint64_t EGLuint64KHR; + typedef int EGLNativeFileDescriptorKHR; + typedef khronos_ssize_t EGLsizeiANDROID; + typedef void (*EGLSetBlobFuncANDROID) (const void *key, EGLsizeiANDROID keySize, const void *value, EGLsizeiANDROID valueSize); + typedef EGLsizeiANDROID (*EGLGetBlobFuncANDROID) (const void *key, EGLsizeiANDROID keySize, void *value, EGLsizeiANDROID valueSize); + struct EGLClientPixmapHI { + void *pData; + EGLint iWidth; + EGLint iHeight; + EGLint iStride; +}; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + EGLBoolean eglBindAPI + EGLenum api + + + EGLBoolean eglBindTexImage + EGLDisplay dpy + EGLSurface surface + EGLint buffer + + + EGLBoolean eglChooseConfig + EGLDisplay dpy + const EGLint *attrib_list + EGLConfig *configs + EGLint config_size + EGLint *num_config + + + EGLint eglClientWaitSync + EGLDisplay dpy + EGLSync sync + EGLint flags + EGLTime timeout + + + EGLint eglClientWaitSyncKHR + EGLDisplay dpy + EGLSyncKHR sync + EGLint flags + EGLTimeKHR timeout + + + + EGLint eglClientWaitSyncNV + EGLSyncNV sync + EGLint flags + EGLTimeNV timeout + + + EGLBoolean eglCopyBuffers + EGLDisplay dpy + EGLSurface surface + EGLNativePixmapType target + + + EGLContext eglCreateContext + EGLDisplay dpy + EGLConfig config + EGLContext share_context + const EGLint *attrib_list + + + EGLImageKHR eglCreateDRMImageMESA + EGLDisplay dpy + const EGLint *attrib_list + + + EGLSyncNV eglCreateFenceSyncNV + EGLDisplay dpy + EGLenum condition + const EGLint *attrib_list + + + EGLImage eglCreateImage + EGLDisplay dpy + EGLContext ctx + EGLenum target + EGLClientBuffer buffer + const EGLint *attrib_list + + + EGLImageKHR eglCreateImageKHR + EGLDisplay dpy + EGLContext ctx + EGLenum target + EGLClientBuffer buffer + const EGLint *attrib_list + + + + EGLSurface eglCreatePbufferFromClientBuffer + EGLDisplay dpy + EGLenum buftype + EGLClientBuffer buffer + EGLConfig config + const EGLint *attrib_list + + + EGLSurface eglCreatePbufferSurface + EGLDisplay dpy + EGLConfig config + const EGLint *attrib_list + + + EGLSurface eglCreatePixmapSurface + EGLDisplay dpy + EGLConfig config + EGLNativePixmapType pixmap + const EGLint *attrib_list + + + EGLSurface eglCreatePixmapSurfaceHI + EGLDisplay dpy + EGLConfig config + struct EGLClientPixmapHI *pixmap + + + EGLSurface eglCreatePlatformPixmapSurface + EGLDisplay dpy + EGLConfig config + void *native_pixmap + const EGLAttrib *attrib_list + + + EGLSurface eglCreatePlatformPixmapSurfaceEXT + EGLDisplay dpy + EGLConfig config + void *native_pixmap + const EGLint *attrib_list + + + EGLSurface eglCreatePlatformWindowSurface + EGLDisplay dpy + EGLConfig config + void *native_window + const EGLAttrib *attrib_list + + + EGLSurface eglCreatePlatformWindowSurfaceEXT + EGLDisplay dpy + EGLConfig config + void *native_window + const EGLint *attrib_list + + + EGLStreamKHR eglCreateStreamFromFileDescriptorKHR + EGLDisplay dpy + EGLNativeFileDescriptorKHR file_descriptor + + + EGLStreamKHR eglCreateStreamKHR + EGLDisplay dpy + const EGLint *attrib_list + + + EGLSurface eglCreateStreamProducerSurfaceKHR + EGLDisplay dpy + EGLConfig config + EGLStreamKHR stream + const EGLint *attrib_list + + + EGLSyncKHR eglCreateStreamSyncNV + EGLDisplay dpy + EGLStreamKHR stream + EGLenum type + const EGLint *attrib_list + + + EGLSync eglCreateSync + EGLDisplay dpy + EGLenum type + const EGLAttrib *attrib_list + + + EGLSyncKHR eglCreateSyncKHR + EGLDisplay dpy + EGLenum type + const EGLint *attrib_list + + + EGLSyncKHR eglCreateSync64KHR + EGLDisplay dpy + EGLenum type + const EGLAttribKHR *attrib_list + + + + EGLSurface eglCreateWindowSurface + EGLDisplay dpy + EGLConfig config + EGLNativeWindowType win + const EGLint *attrib_list + + + EGLBoolean eglDestroyContext + EGLDisplay dpy + EGLContext ctx + + + EGLBoolean eglDestroyImage + EGLDisplay dpy + EGLImage image + + + EGLBoolean eglDestroyImageKHR + EGLDisplay dpy + EGLImageKHR image + + + + EGLBoolean eglDestroyStreamKHR + EGLDisplay dpy + EGLStreamKHR stream + + + EGLBoolean eglDestroySurface + EGLDisplay dpy + EGLSurface surface + + + EGLBoolean eglDestroySync + EGLDisplay dpy + EGLSync sync + + + EGLBoolean eglDestroySyncKHR + EGLDisplay dpy + EGLSyncKHR sync + + + + EGLBoolean eglDestroySyncNV + EGLSyncNV sync + + + EGLint eglDupNativeFenceFDANDROID + EGLDisplay dpy + EGLSyncKHR sync + + + EGLBoolean eglExportDRMImageMESA + EGLDisplay dpy + EGLImageKHR image + EGLint *name + EGLint *handle + EGLint *stride + + + EGLBoolean eglFenceNV + EGLSyncNV sync + + + EGLBoolean eglGetConfigAttrib + EGLDisplay dpy + EGLConfig config + EGLint attribute + EGLint *value + + + EGLBoolean eglGetConfigs + EGLDisplay dpy + EGLConfig *configs + EGLint config_size + EGLint *num_config + + + EGLContext eglGetCurrentContext + + + EGLDisplay eglGetCurrentDisplay + + + EGLSurface eglGetCurrentSurface + EGLint readdraw + + + EGLDisplay eglGetDisplay + EGLNativeDisplayType display_id + + + EGLint eglGetError + + + EGLBoolean eglGetOutputLayersEXT + EGLDisplay dpy + const EGLAttrib *attrib_list + EGLOutputLayerEXT *layers + EGLint max_layers + EGLint *num_layers + + + EGLBoolean eglGetOutputPortsEXT + EGLDisplay dpy + const EGLAttrib *attrib_list + EGLOutputPortEXT *ports + EGLint max_ports + EGLint *num_ports + + + EGLDisplay eglGetPlatformDisplay + EGLenum platform + void *native_display + const EGLAttrib *attrib_list + + + EGLDisplay eglGetPlatformDisplayEXT + EGLenum platform + void *native_display + const EGLint *attrib_list + + + __eglMustCastToProperFunctionPointerType eglGetProcAddress + const char *procname + + + EGLNativeFileDescriptorKHR eglGetStreamFileDescriptorKHR + EGLDisplay dpy + EGLStreamKHR stream + + + EGLBoolean eglGetSyncAttrib + EGLDisplay dpy + EGLSync sync + EGLint attribute + EGLAttrib *value + + + EGLBoolean eglGetSyncAttribKHR + EGLDisplay dpy + EGLSyncKHR sync + EGLint attribute + EGLint *value + + + EGLBoolean eglGetSyncAttribNV + EGLSyncNV sync + EGLint attribute + EGLint *value + + + EGLuint64NV eglGetSystemTimeFrequencyNV + + + EGLuint64NV eglGetSystemTimeNV + + + EGLBoolean eglInitialize + EGLDisplay dpy + EGLint *major + EGLint *minor + + + EGLBoolean eglLockSurfaceKHR + EGLDisplay dpy + EGLSurface surface + const EGLint *attrib_list + + + EGLBoolean eglMakeCurrent + EGLDisplay dpy + EGLSurface draw + EGLSurface read + EGLContext ctx + + + EGLBoolean eglOutputLayerAttribEXT + EGLDisplay dpy + EGLOutputLayerEXT layer + EGLint attribute + EGLAttrib value + + + EGLBoolean eglOutputPortAttribEXT + EGLDisplay dpy + EGLOutputPortEXT port + EGLint attribute + EGLAttrib value + + + EGLBoolean eglPostSubBufferNV + EGLDisplay dpy + EGLSurface surface + EGLint x + EGLint y + EGLint width + EGLint height + + + EGLenum eglQueryAPI + + + EGLBoolean eglQueryContext + EGLDisplay dpy + EGLContext ctx + EGLint attribute + EGLint *value + + + EGLBoolean eglQueryDeviceAttribEXT + EGLDeviceEXT device + EGLint attribute + EGLAttrib *value + + + const char *eglQueryDeviceStringEXT + EGLDeviceEXT device + EGLint name + + + EGLBoolean eglQueryDevicesEXT + EGLint max_devices + EGLDeviceEXT *devices + EGLint *num_devices + + + EGLBoolean eglQueryDisplayAttribEXT + EGLDisplay dpy + EGLint attribute + EGLAttrib *value + + + EGLBoolean eglQueryNativeDisplayNV + EGLDisplay dpy + EGLNativeDisplayType *display_id + + + EGLBoolean eglQueryNativePixmapNV + EGLDisplay dpy + EGLSurface surf + EGLNativePixmapType *pixmap + + + EGLBoolean eglQueryNativeWindowNV + EGLDisplay dpy + EGLSurface surf + EGLNativeWindowType *window + + + EGLBoolean eglQueryOutputLayerAttribEXT + EGLDisplay dpy + EGLOutputLayerEXT layer + EGLint attribute + EGLAttrib *value + + + const char *eglQueryOutputLayerStringEXT + EGLDisplay dpy + EGLOutputLayerEXT layer + EGLint name + + + EGLBoolean eglQueryOutputPortAttribEXT + EGLDisplay dpy + EGLOutputPortEXT port + EGLint attribute + EGLAttrib *value + + + const char *eglQueryOutputPortStringEXT + EGLDisplay dpy + EGLOutputPortEXT port + EGLint name + + + EGLBoolean eglQueryStreamKHR + EGLDisplay dpy + EGLStreamKHR stream + EGLenum attribute + EGLint *value + + + EGLBoolean eglQueryStreamTimeKHR + EGLDisplay dpy + EGLStreamKHR stream + EGLenum attribute + EGLTimeKHR *value + + + EGLBoolean eglQueryStreamu64KHR + EGLDisplay dpy + EGLStreamKHR stream + EGLenum attribute + EGLuint64KHR *value + + + const char *eglQueryString + EGLDisplay dpy + EGLint name + + + EGLBoolean eglQuerySurface + EGLDisplay dpy + EGLSurface surface + EGLint attribute + EGLint *value + + + EGLBoolean eglQuerySurface64KHR + EGLDisplay dpy + EGLSurface surface + EGLint attribute + EGLAttribKHR *value + + + EGLBoolean eglQuerySurfacePointerANGLE + EGLDisplay dpy + EGLSurface surface + EGLint attribute + void **value + + + EGLBoolean eglReleaseTexImage + EGLDisplay dpy + EGLSurface surface + EGLint buffer + + + EGLBoolean eglReleaseThread + + + void eglSetBlobCacheFuncsANDROID + EGLDisplay dpy + EGLSetBlobFuncANDROID set + EGLGetBlobFuncANDROID get + + + EGLBoolean eglSignalSyncKHR + EGLDisplay dpy + EGLSyncKHR sync + EGLenum mode + + + EGLBoolean eglSignalSyncNV + EGLSyncNV sync + EGLenum mode + + + EGLBoolean eglStreamAttribKHR + EGLDisplay dpy + EGLStreamKHR stream + EGLenum attribute + EGLint value + + + EGLBoolean eglStreamConsumerAcquireKHR + EGLDisplay dpy + EGLStreamKHR stream + + + EGLBoolean eglStreamConsumerGLTextureExternalKHR + EGLDisplay dpy + EGLStreamKHR stream + + + EGLBoolean eglStreamConsumerOutputEXT + EGLDisplay dpy + EGLStreamKHR stream + EGLOutputLayerEXT layer + + + EGLBoolean eglStreamConsumerReleaseKHR + EGLDisplay dpy + EGLStreamKHR stream + + + EGLBoolean eglSurfaceAttrib + EGLDisplay dpy + EGLSurface surface + EGLint attribute + EGLint value + + + EGLBoolean eglSwapBuffers + EGLDisplay dpy + EGLSurface surface + + + EGLBoolean eglSwapBuffersWithDamageEXT + EGLDisplay dpy + EGLSurface surface + EGLint *rects + EGLint n_rects + + + EGLBoolean eglSwapBuffersRegionNOK + EGLDisplay dpy + EGLSurface surface + EGLint numRects + const EGLint *rects + + + EGLBoolean eglSwapBuffersRegion2NOK + EGLDisplay dpy + EGLSurface surface + EGLint numRects + const EGLint *rects + + + EGLBoolean eglSwapInterval + EGLDisplay dpy + EGLint interval + + + EGLBoolean eglTerminate + EGLDisplay dpy + + + EGLBoolean eglUnlockSurfaceKHR + EGLDisplay dpy + EGLSurface surface + + + EGLBoolean eglWaitClient + + + EGLBoolean eglWaitGL + + + EGLBoolean eglWaitNative + EGLint engine + + + EGLBoolean eglWaitSync + EGLDisplay dpy + EGLSync sync + EGLint flags + + + EGLint eglWaitSyncKHR + EGLDisplay dpy + EGLSyncKHR sync + EGLint flags + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -- 2.43.0