matrix_operations_cuda 0.1.2

A library to perform matrix operations using cuda
Documentation
//! Module for loading cuda modules
//!
//! # Usage
//!
//! ```
//! use cuda_driver_sys::*;
//! use matrix_operations_cuda::cuda_env::CudaEnv;
//! use matrix_operations_cuda::cuda_module::CudaModule;
//!
//! unsafe {
//!     let mut cuda_env = CudaEnv::new(0, 0).unwrap();
//!
//!     let module = CudaModule::default().unwrap();
//!     let function = module.load_function(b"add\0").unwrap();
//!
//!     module.free().unwrap();
//!     cuda_env.free().unwrap();
//! }
//! ```
use std::error::Error;
use std::ffi::c_void;
use cuda_driver_sys::{CUfunction, CUmodule, cuModuleGetFunction, cuModuleLoad, cuModuleLoadData, cuModuleUnload, CUresult};

/// Cuda module struct
pub struct CudaModule {
    module: CUmodule,
}

impl CudaModule {

    /// Create a new CudaModule from a ptx file
    ///
    /// # Example
    ///
    /// ```
    /// use cuda_driver_sys::*;
    /// use matrix_operations_cuda::cuda_env::CudaEnv;
    /// use matrix_operations_cuda::cuda_module::CudaModule;
    ///
    /// unsafe {
    ///     let cuda_env = CudaEnv::new(0, 0).unwrap();
    ///
    ///     let module = CudaModule::new(b"resources/kernel.ptx\0").unwrap();
    ///
    ///     module.free().unwrap();
    ///     cuda_env.free().unwrap();
    /// }
    /// ```
    ///
    pub unsafe fn new(path: &[u8]) -> Result<CudaModule, Box<dyn Error>> {
        let mut module: CUmodule = std::ptr::null_mut();
        let result = cuModuleLoad(&mut module, path.as_ptr() as *const _);
        if result != CUresult::CUDA_SUCCESS {
            return Err(format!("Error loading module : {:?}", result).into());
        }
        Ok(CudaModule {
            module,
        })
    }

    /// Load integrated kernel.ptx
    ///
    /// # Example
    ///
    /// ```
    /// use cuda_driver_sys::*;
    /// use matrix_operations_cuda::cuda_env::CudaEnv;
    /// use matrix_operations_cuda::cuda_module::CudaModule;
    ///
    /// unsafe {
    ///     let cuda_env = CudaEnv::new(0, 0).unwrap();
    ///
    ///     let module = CudaModule::default().unwrap();
    ///
    ///     module.free().unwrap();
    ///     cuda_env.free().unwrap();
    /// }
    /// ```
    pub unsafe fn default() -> Result<CudaModule, Box<dyn Error>> {
        let module_data: Vec<u8> = vec![47, 47, 13, 10, 47, 47, 32, 71, 101, 110, 101, 114, 97, 116, 101, 100, 32, 98, 121, 32, 78, 86, 73, 68, 73, 65, 32, 78, 86, 86, 77, 32, 67, 111, 109, 112, 105, 108, 101, 114, 13, 10, 47, 47, 13, 10, 47, 47, 32, 67, 111, 109, 112, 105, 108, 101, 114, 32, 66, 117, 105, 108, 100, 32, 73, 68, 58, 32, 67, 76, 45, 51, 50, 50, 54, 55, 51, 48, 50, 13, 10, 47, 47, 32, 67, 117, 100, 97, 32, 99, 111, 109, 112, 105, 108, 97, 116, 105, 111, 110, 32, 116, 111, 111, 108, 115, 44, 32, 114, 101, 108, 101, 97, 115, 101, 32, 49, 50, 46, 48, 44, 32, 86, 49, 50, 46, 48, 46, 49, 52, 48, 13, 10, 47, 47, 32, 66, 97, 115, 101, 100, 32, 111, 110, 32, 78, 86, 86, 77, 32, 55, 46, 48, 46, 49, 13, 10, 47, 47, 13, 10, 13, 10, 46, 118, 101, 114, 115, 105, 111, 110, 32, 56, 46, 48, 13, 10, 46, 116, 97, 114, 103, 101, 116, 32, 115, 109, 95, 53, 50, 13, 10, 46, 97, 100, 100, 114, 101, 115, 115, 95, 115, 105, 122, 101, 32, 54, 52, 13, 10, 13, 10, 9, 47, 47, 32, 46, 103, 108, 111, 98, 108, 9, 97, 100, 100, 13, 10, 13, 10, 46, 118, 105, 115, 105, 98, 108, 101, 32, 46, 101, 110, 116, 114, 121, 32, 97, 100, 100, 40, 13, 10, 9, 46, 112, 97, 114, 97, 109, 32, 46, 117, 54, 52, 32, 97, 100, 100, 95, 112, 97, 114, 97, 109, 95, 48, 44, 13, 10, 9, 46, 112, 97, 114, 97, 109, 32, 46, 117, 54, 52, 32, 97, 100, 100, 95, 112, 97, 114, 97, 109, 95, 49, 44, 13, 10, 9, 46, 112, 97, 114, 97, 109, 32, 46, 117, 54, 52, 32, 97, 100, 100, 95, 112, 97, 114, 97, 109, 95, 50, 13, 10, 41, 13, 10, 123, 13, 10, 9, 46, 114, 101, 103, 32, 46, 102, 51, 50, 32, 9, 37, 102, 60, 52, 62, 59, 13, 10, 9, 46, 114, 101, 103, 32, 46, 98, 51, 50, 32, 9, 37, 114, 60, 56, 62, 59, 13, 10, 9, 46, 114, 101, 103, 32, 46, 98, 54, 52, 32, 9, 37, 114, 100, 60, 49, 49, 62, 59, 13, 10, 13, 10, 13, 10, 9, 108, 100, 46, 112, 97, 114, 97, 109, 46, 117, 54, 52, 32, 9, 37, 114, 100, 49, 44, 32, 91, 97, 100, 100, 95, 112, 97, 114, 97, 109, 95, 48, 93, 59, 13, 10, 9, 108, 100, 46, 112, 97, 114, 97, 109, 46, 117, 54, 52, 32, 9, 37, 114, 100, 50, 44, 32, 91, 97, 100, 100, 95, 112, 97, 114, 97, 109, 95, 49, 93, 59, 13, 10, 9, 108, 100, 46, 112, 97, 114, 97, 109, 46, 117, 54, 52, 32, 9, 37, 114, 100, 51, 44, 32, 91, 97, 100, 100, 95, 112, 97, 114, 97, 109, 95, 50, 93, 59, 13, 10, 9, 99, 118, 116, 97, 46, 116, 111, 46, 103, 108, 111, 98, 97, 108, 46, 117, 54, 52, 32, 9, 37, 114, 100, 52, 44, 32, 37, 114, 100, 51, 59, 13, 10, 9, 99, 118, 116, 97, 46, 116, 111, 46, 103, 108, 111, 98, 97, 108, 46, 117, 54, 52, 32, 9, 37, 114, 100, 53, 44, 32, 37, 114, 100, 50, 59, 13, 10, 9, 99, 118, 116, 97, 46, 116, 111, 46, 103, 108, 111, 98, 97, 108, 46, 117, 54, 52, 32, 9, 37, 114, 100, 54, 44, 32, 37, 114, 100, 49, 59, 13, 10, 9, 109, 111, 118, 46, 117, 51, 50, 32, 9, 37, 114, 49, 44, 32, 37, 116, 105, 100, 46, 120, 59, 13, 10, 9, 109, 111, 118, 46, 117, 51, 50, 32, 9, 37, 114, 50, 44, 32, 37, 116, 105, 100, 46, 121, 59, 13, 10, 9, 109, 111, 118, 46, 117, 51, 50, 32, 9, 37, 114, 51, 44, 32, 37, 110, 116, 105, 100, 46, 120, 59, 13, 10, 9, 109, 111, 118, 46, 117, 51, 50, 32, 9, 37, 114, 52, 44, 32, 37, 99, 116, 97, 105, 100, 46, 120, 59, 13, 10, 9, 109, 111, 118, 46, 117, 51, 50, 32, 9, 37, 114, 53, 44, 32, 37, 110, 116, 105, 100, 46, 121, 59, 13, 10, 9, 109, 97, 100, 46, 108, 111, 46, 115, 51, 50, 32, 9, 37, 114, 54, 44, 32, 37, 114, 53, 44, 32, 37, 114, 52, 44, 32, 37, 114, 50, 59, 13, 10, 9, 109, 97, 100, 46, 108, 111, 46, 115, 51, 50, 32, 9, 37, 114, 55, 44, 32, 37, 114, 54, 44, 32, 37, 114, 51, 44, 32, 37, 114, 49, 59, 13, 10, 9, 109, 117, 108, 46, 119, 105, 100, 101, 46, 115, 51, 50, 32, 9, 37, 114, 100, 55, 44, 32, 37, 114, 55, 44, 32, 52, 59, 13, 10, 9, 97, 100, 100, 46, 115, 54, 52, 32, 9, 37, 114, 100, 56, 44, 32, 37, 114, 100, 54, 44, 32, 37, 114, 100, 55, 59, 13, 10, 9, 108, 100, 46, 103, 108, 111, 98, 97, 108, 46, 102, 51, 50, 32, 9, 37, 102, 49, 44, 32, 91, 37, 114, 100, 56, 93, 59, 13, 10, 9, 97, 100, 100, 46, 115, 54, 52, 32, 9, 37, 114, 100, 57, 44, 32, 37, 114, 100, 53, 44, 32, 37, 114, 100, 55, 59, 13, 10, 9, 108, 100, 46, 103, 108, 111, 98, 97, 108, 46, 102, 51, 50, 32, 9, 37, 102, 50, 44, 32, 91, 37, 114, 100, 57, 93, 59, 13, 10, 9, 97, 100, 100, 46, 102, 51, 50, 32, 9, 37, 102, 51, 44, 32, 37, 102, 49, 44, 32, 37, 102, 50, 59, 13, 10, 9, 97, 100, 100, 46, 115, 54, 52, 32, 9, 37, 114, 100, 49, 48, 44, 32, 37, 114, 100, 52, 44, 32, 37, 114, 100, 55, 59, 13, 10, 9, 115, 116, 46, 103, 108, 111, 98, 97, 108, 46, 102, 51, 50, 32, 9, 91, 37, 114, 100, 49, 48, 93, 44, 32, 37, 102, 51, 59, 13, 10, 9, 114, 101, 116, 59, 13, 10, 13, 10, 125, 13, 10, 9, 47, 47, 32, 46, 103, 108, 111, 98, 108, 9, 115, 117, 98, 13, 10, 46, 118, 105, 115, 105, 98, 108, 101, 32, 46, 101, 110, 116, 114, 121, 32, 115, 117, 98, 40, 13, 10, 9, 46, 112, 97, 114, 97, 109, 32, 46, 117, 54, 52, 32, 115, 117, 98, 95, 112, 97, 114, 97, 109, 95, 48, 44, 13, 10, 9, 46, 112, 97, 114, 97, 109, 32, 46, 117, 54, 52, 32, 115, 117, 98, 95, 112, 97, 114, 97, 109, 95, 49, 44, 13, 10, 9, 46, 112, 97, 114, 97, 109, 32, 46, 117, 54, 52, 32, 115, 117, 98, 95, 112, 97, 114, 97, 109, 95, 50, 13, 10, 41, 13, 10, 123, 13, 10, 9, 46, 114, 101, 103, 32, 46, 102, 51, 50, 32, 9, 37, 102, 60, 52, 62, 59, 13, 10, 9, 46, 114, 101, 103, 32, 46, 98, 51, 50, 32, 9, 37, 114, 60, 56, 62, 59, 13, 10, 9, 46, 114, 101, 103, 32, 46, 98, 54, 52, 32, 9, 37, 114, 100, 60, 49, 49, 62, 59, 13, 10, 13, 10, 13, 10, 9, 108, 100, 46, 112, 97, 114, 97, 109, 46, 117, 54, 52, 32, 9, 37, 114, 100, 49, 44, 32, 91, 115, 117, 98, 95, 112, 97, 114, 97, 109, 95, 48, 93, 59, 13, 10, 9, 108, 100, 46, 112, 97, 114, 97, 109, 46, 117, 54, 52, 32, 9, 37, 114, 100, 50, 44, 32, 91, 115, 117, 98, 95, 112, 97, 114, 97, 109, 95, 49, 93, 59, 13, 10, 9, 108, 100, 46, 112, 97, 114, 97, 109, 46, 117, 54, 52, 32, 9, 37, 114, 100, 51, 44, 32, 91, 115, 117, 98, 95, 112, 97, 114, 97, 109, 95, 50, 93, 59, 13, 10, 9, 99, 118, 116, 97, 46, 116, 111, 46, 103, 108, 111, 98, 97, 108, 46, 117, 54, 52, 32, 9, 37, 114, 100, 52, 44, 32, 37, 114, 100, 51, 59, 13, 10, 9, 99, 118, 116, 97, 46, 116, 111, 46, 103, 108, 111, 98, 97, 108, 46, 117, 54, 52, 32, 9, 37, 114, 100, 53, 44, 32, 37, 114, 100, 50, 59, 13, 10, 9, 99, 118, 116, 97, 46, 116, 111, 46, 103, 108, 111, 98, 97, 108, 46, 117, 54, 52, 32, 9, 37, 114, 100, 54, 44, 32, 37, 114, 100, 49, 59, 13, 10, 9, 109, 111, 118, 46, 117, 51, 50, 32, 9, 37, 114, 49, 44, 32, 37, 116, 105, 100, 46, 120, 59, 13, 10, 9, 109, 111, 118, 46, 117, 51, 50, 32, 9, 37, 114, 50, 44, 32, 37, 116, 105, 100, 46, 121, 59, 13, 10, 9, 109, 111, 118, 46, 117, 51, 50, 32, 9, 37, 114, 51, 44, 32, 37, 110, 116, 105, 100, 46, 120, 59, 13, 10, 9, 109, 111, 118, 46, 117, 51, 50, 32, 9, 37, 114, 52, 44, 32, 37, 99, 116, 97, 105, 100, 46, 120, 59, 13, 10, 9, 109, 111, 118, 46, 117, 51, 50, 32, 9, 37, 114, 53, 44, 32, 37, 110, 116, 105, 100, 46, 121, 59, 13, 10, 9, 109, 97, 100, 46, 108, 111, 46, 115, 51, 50, 32, 9, 37, 114, 54, 44, 32, 37, 114, 53, 44, 32, 37, 114, 52, 44, 32, 37, 114, 50, 59, 13, 10, 9, 109, 97, 100, 46, 108, 111, 46, 115, 51, 50, 32, 9, 37, 114, 55, 44, 32, 37, 114, 54, 44, 32, 37, 114, 51, 44, 32, 37, 114, 49, 59, 13, 10, 9, 109, 117, 108, 46, 119, 105, 100, 101, 46, 115, 51, 50, 32, 9, 37, 114, 100, 55, 44, 32, 37, 114, 55, 44, 32, 52, 59, 13, 10, 9, 97, 100, 100, 46, 115, 54, 52, 32, 9, 37, 114, 100, 56, 44, 32, 37, 114, 100, 54, 44, 32, 37, 114, 100, 55, 59, 13, 10, 9, 108, 100, 46, 103, 108, 111, 98, 97, 108, 46, 102, 51, 50, 32, 9, 37, 102, 49, 44, 32, 91, 37, 114, 100, 56, 93, 59, 13, 10, 9, 97, 100, 100, 46, 115, 54, 52, 32, 9, 37, 114, 100, 57, 44, 32, 37, 114, 100, 53, 44, 32, 37, 114, 100, 55, 59, 13, 10, 9, 108, 100, 46, 103, 108, 111, 98, 97, 108, 46, 102, 51, 50, 32, 9, 37, 102, 50, 44, 32, 91, 37, 114, 100, 57, 93, 59, 13, 10, 9, 115, 117, 98, 46, 102, 51, 50, 32, 9, 37, 102, 51, 44, 32, 37, 102, 49, 44, 32, 37, 102, 50, 59, 13, 10, 9, 97, 100, 100, 46, 115, 54, 52, 32, 9, 37, 114, 100, 49, 48, 44, 32, 37, 114, 100, 52, 44, 32, 37, 114, 100, 55, 59, 13, 10, 9, 115, 116, 46, 103, 108, 111, 98, 97, 108, 46, 102, 51, 50, 32, 9, 91, 37, 114, 100, 49, 48, 93, 44, 32, 37, 102, 51, 59, 13, 10, 9, 114, 101, 116, 59, 13, 10, 13, 10, 125, 13, 10, 9, 47, 47, 32, 46, 103, 108, 111, 98, 108, 9, 100, 111, 116, 13, 10, 46, 118, 105, 115, 105, 98, 108, 101, 32, 46, 101, 110, 116, 114, 121, 32, 100, 111, 116, 40, 13, 10, 9, 46, 112, 97, 114, 97, 109, 32, 46, 117, 54, 52, 32, 100, 111, 116, 95, 112, 97, 114, 97, 109, 95, 48, 44, 13, 10, 9, 46, 112, 97, 114, 97, 109, 32, 46, 117, 54, 52, 32, 100, 111, 116, 95, 112, 97, 114, 97, 109, 95, 49, 44, 13, 10, 9, 46, 112, 97, 114, 97, 109, 32, 46, 117, 54, 52, 32, 100, 111, 116, 95, 112, 97, 114, 97, 109, 95, 50, 44, 13, 10, 9, 46, 112, 97, 114, 97, 109, 32, 46, 117, 51, 50, 32, 100, 111, 116, 95, 112, 97, 114, 97, 109, 95, 51, 44, 13, 10, 9, 46, 112, 97, 114, 97, 109, 32, 46, 117, 51, 50, 32, 100, 111, 116, 95, 112, 97, 114, 97, 109, 95, 52, 44, 13, 10, 9, 46, 112, 97, 114, 97, 109, 32, 46, 117, 51, 50, 32, 100, 111, 116, 95, 112, 97, 114, 97, 109, 95, 53, 44, 13, 10, 9, 46, 112, 97, 114, 97, 109, 32, 46, 117, 51, 50, 32, 100, 111, 116, 95, 112, 97, 114, 97, 109, 95, 54, 13, 10, 41, 13, 10, 123, 13, 10, 9, 46, 114, 101, 103, 32, 46, 112, 114, 101, 100, 32, 9, 37, 112, 60, 54, 62, 59, 13, 10, 9, 46, 114, 101, 103, 32, 46, 102, 51, 50, 32, 9, 37, 102, 60, 51, 48, 62, 59, 13, 10, 9, 46, 114, 101, 103, 32, 46, 98, 51, 50, 32, 9, 37, 114, 60, 51, 51, 62, 59, 13, 10, 9, 46, 114, 101, 103, 32, 46, 98, 54, 52, 32, 9, 37, 114, 100, 60, 51, 53, 62, 59, 13, 10, 13, 10, 13, 10, 9, 108, 100, 46, 112, 97, 114, 97, 109, 46, 117, 54, 52, 32, 9, 37, 114, 100, 49, 56, 44, 32, 91, 100, 111, 116, 95, 112, 97, 114, 97, 109, 95, 48, 93, 59, 13, 10, 9, 108, 100, 46, 112, 97, 114, 97, 109, 46, 117, 54, 52, 32, 9, 37, 114, 100, 49, 57, 44, 32, 91, 100, 111, 116, 95, 112, 97, 114, 97, 109, 95, 49, 93, 59, 13, 10, 9, 108, 100, 46, 112, 97, 114, 97, 109, 46, 117, 54, 52, 32, 9, 37, 114, 100, 49, 55, 44, 32, 91, 100, 111, 116, 95, 112, 97, 114, 97, 109, 95, 50, 93, 59, 13, 10, 9, 108, 100, 46, 112, 97, 114, 97, 109, 46, 117, 51, 50, 32, 9, 37, 114, 49, 51, 44, 32, 91, 100, 111, 116, 95, 112, 97, 114, 97, 109, 95, 52, 93, 59, 13, 10, 9, 108, 100, 46, 112, 97, 114, 97, 109, 46, 117, 51, 50, 32, 9, 37, 114, 49, 52, 44, 32, 91, 100, 111, 116, 95, 112, 97, 114, 97, 109, 95, 53, 93, 59, 13, 10, 9, 108, 100, 46, 112, 97, 114, 97, 109, 46, 117, 51, 50, 32, 9, 37, 114, 49, 53, 44, 32, 91, 100, 111, 116, 95, 112, 97, 114, 97, 109, 95, 54, 93, 59, 13, 10, 9, 99, 118, 116, 97, 46, 116, 111, 46, 103, 108, 111, 98, 97, 108, 46, 117, 54, 52, 32, 9, 37, 114, 100, 49, 44, 32, 37, 114, 100, 49, 57, 59, 13, 10, 9, 99, 118, 116, 97, 46, 116, 111, 46, 103, 108, 111, 98, 97, 108, 46, 117, 54, 52, 32, 9, 37, 114, 100, 50, 44, 32, 37, 114, 100, 49, 56, 59, 13, 10, 9, 109, 111, 118, 46, 117, 51, 50, 32, 9, 37, 114, 49, 54, 44, 32, 37, 110, 116, 105, 100, 46, 121, 59, 13, 10, 9, 109, 111, 118, 46, 117, 51, 50, 32, 9, 37, 114, 49, 55, 44, 32, 37, 99, 116, 97, 105, 100, 46, 120, 59, 13, 10, 9, 109, 111, 118, 46, 117, 51, 50, 32, 9, 37, 114, 49, 56, 44, 32, 37, 116, 105, 100, 46, 121, 59, 13, 10, 9, 109, 97, 100, 46, 108, 111, 46, 115, 51, 50, 32, 9, 37, 114, 49, 57, 44, 32, 37, 114, 49, 54, 44, 32, 37, 114, 49, 55, 44, 32, 37, 114, 49, 56, 59, 13, 10, 9, 109, 111, 118, 46, 117, 51, 50, 32, 9, 37, 114, 50, 48, 44, 32, 37, 110, 116, 105, 100, 46, 120, 59, 13, 10, 9, 109, 111, 118, 46, 117, 51, 50, 32, 9, 37, 114, 50, 49, 44, 32, 37, 116, 105, 100, 46, 120, 59, 13, 10, 9, 109, 97, 100, 46, 108, 111, 46, 115, 51, 50, 32, 9, 37, 114, 49, 44, 32, 37, 114, 49, 57, 44, 32, 37, 114, 50, 48, 44, 32, 37, 114, 50, 49, 59, 13, 10, 9, 100, 105, 118, 46, 115, 51, 50, 32, 9, 37, 114, 51, 44, 32, 37, 114, 49, 44, 32, 37, 114, 49, 53, 59, 13, 10, 9, 109, 117, 108, 46, 108, 111, 46, 115, 51, 50, 32, 9, 37, 114, 50, 50, 44, 32, 37, 114, 51, 44, 32, 37, 114, 49, 53, 59, 13, 10, 9, 115, 117, 98, 46, 115, 51, 50, 32, 9, 37, 114, 50, 44, 32, 37, 114, 49, 44, 32, 37, 114, 50, 50, 59, 13, 10, 9, 115, 101, 116, 112, 46, 108, 116, 46, 115, 51, 50, 32, 9, 37, 112, 49, 44, 32, 37, 114, 49, 52, 44, 32, 49, 59, 13, 10, 9, 109, 111, 118, 46, 102, 51, 50, 32, 9, 37, 102, 50, 57, 44, 32, 48, 102, 48, 48, 48, 48, 48, 48, 48, 48, 59, 13, 10, 9, 64, 37, 112, 49, 32, 98, 114, 97, 32, 9, 36, 76, 95, 95, 66, 66, 50, 95, 55, 59, 13, 10, 13, 10, 9, 97, 100, 100, 46, 115, 51, 50, 32, 9, 37, 114, 50, 52, 44, 32, 37, 114, 49, 52, 44, 32, 45, 49, 59, 13, 10, 9, 97, 110, 100, 46, 98, 51, 50, 32, 32, 9, 37, 114, 51, 50, 44, 32, 37, 114, 49, 52, 44, 32, 51, 59, 13, 10, 9, 115, 101, 116, 112, 46, 108, 116, 46, 117, 51, 50, 32, 9, 37, 112, 50, 44, 32, 37, 114, 50, 52, 44, 32, 51, 59, 13, 10, 9, 109, 111, 118, 46, 102, 51, 50, 32, 9, 37, 102, 50, 57, 44, 32, 48, 102, 48, 48, 48, 48, 48, 48, 48, 48, 59, 13, 10, 9, 109, 111, 118, 46, 117, 51, 50, 32, 9, 37, 114, 51, 49, 44, 32, 48, 59, 13, 10, 9, 64, 37, 112, 50, 32, 98, 114, 97, 32, 9, 36, 76, 95, 95, 66, 66, 50, 95, 52, 59, 13, 10, 13, 10, 9, 115, 117, 98, 46, 115, 51, 50, 32, 9, 37, 114, 51, 48, 44, 32, 37, 114, 49, 52, 44, 32, 37, 114, 51, 50, 59, 13, 10, 9, 109, 117, 108, 46, 119, 105, 100, 101, 46, 115, 51, 50, 32, 9, 37, 114, 100, 50, 48, 44, 32, 37, 114, 50, 44, 32, 52, 59, 13, 10, 9, 97, 100, 100, 46, 115, 54, 52, 32, 9, 37, 114, 100, 51, 50, 44, 32, 37, 114, 100, 49, 44, 32, 37, 114, 100, 50, 48, 59, 13, 10, 9, 109, 117, 108, 46, 108, 111, 46, 115, 51, 50, 32, 9, 37, 114, 50, 54, 44, 32, 37, 114, 51, 44, 32, 37, 114, 49, 51, 59, 13, 10, 9, 109, 117, 108, 46, 119, 105, 100, 101, 46, 115, 51, 50, 32, 9, 37, 114, 100, 50, 49, 44, 32, 37, 114, 50, 54, 44, 32, 52, 59, 13, 10, 9, 97, 100, 100, 46, 115, 54, 52, 32, 9, 37, 114, 100, 50, 50, 44, 32, 37, 114, 100, 50, 44, 32, 37, 114, 100, 50, 49, 59, 13, 10, 9, 97, 100, 100, 46, 115, 54, 52, 32, 9, 37, 114, 100, 51, 49, 44, 32, 37, 114, 100, 50, 50, 44, 32, 56, 59, 13, 10, 9, 109, 117, 108, 46, 119, 105, 100, 101, 46, 115, 51, 50, 32, 9, 37, 114, 100, 53, 44, 32, 37, 114, 49, 53, 44, 32, 52, 59, 13, 10, 13, 10, 36, 76, 95, 95, 66, 66, 50, 95, 51, 58, 13, 10, 9, 108, 100, 46, 103, 108, 111, 98, 97, 108, 46, 102, 51, 50, 32, 9, 37, 102, 49, 50, 44, 32, 91, 37, 114, 100, 51, 50, 93, 59, 13, 10, 9, 108, 100, 46, 103, 108, 111, 98, 97, 108, 46, 102, 51, 50, 32, 9, 37, 102, 49, 51, 44, 32, 91, 37, 114, 100, 51, 49, 43, 45, 56, 93, 59, 13, 10, 9, 102, 109, 97, 46, 114, 110, 46, 102, 51, 50, 32, 9, 37, 102, 49, 52, 44, 32, 37, 102, 49, 51, 44, 32, 37, 102, 49, 50, 44, 32, 37, 102, 50, 57, 59, 13, 10, 9, 97, 100, 100, 46, 115, 54, 52, 32, 9, 37, 114, 100, 50, 51, 44, 32, 37, 114, 100, 51, 50, 44, 32, 37, 114, 100, 53, 59, 13, 10, 9, 108, 100, 46, 103, 108, 111, 98, 97, 108, 46, 102, 51, 50, 32, 9, 37, 102, 49, 53, 44, 32, 91, 37, 114, 100, 50, 51, 93, 59, 13, 10, 9, 108, 100, 46, 103, 108, 111, 98, 97, 108, 46, 102, 51, 50, 32, 9, 37, 102, 49, 54, 44, 32, 91, 37, 114, 100, 51, 49, 43, 45, 52, 93, 59, 13, 10, 9, 102, 109, 97, 46, 114, 110, 46, 102, 51, 50, 32, 9, 37, 102, 49, 55, 44, 32, 37, 102, 49, 54, 44, 32, 37, 102, 49, 53, 44, 32, 37, 102, 49, 52, 59, 13, 10, 9, 97, 100, 100, 46, 115, 54, 52, 32, 9, 37, 114, 100, 50, 52, 44, 32, 37, 114, 100, 50, 51, 44, 32, 37, 114, 100, 53, 59, 13, 10, 9, 108, 100, 46, 103, 108, 111, 98, 97, 108, 46, 102, 51, 50, 32, 9, 37, 102, 49, 56, 44, 32, 91, 37, 114, 100, 50, 52, 93, 59, 13, 10, 9, 108, 100, 46, 103, 108, 111, 98, 97, 108, 46, 102, 51, 50, 32, 9, 37, 102, 49, 57, 44, 32, 91, 37, 114, 100, 51, 49, 93, 59, 13, 10, 9, 102, 109, 97, 46, 114, 110, 46, 102, 51, 50, 32, 9, 37, 102, 50, 48, 44, 32, 37, 102, 49, 57, 44, 32, 37, 102, 49, 56, 44, 32, 37, 102, 49, 55, 59, 13, 10, 9, 97, 100, 100, 46, 115, 54, 52, 32, 9, 37, 114, 100, 50, 53, 44, 32, 37, 114, 100, 50, 52, 44, 32, 37, 114, 100, 53, 59, 13, 10, 9, 97, 100, 100, 46, 115, 54, 52, 32, 9, 37, 114, 100, 51, 50, 44, 32, 37, 114, 100, 50, 53, 44, 32, 37, 114, 100, 53, 59, 13, 10, 9, 108, 100, 46, 103, 108, 111, 98, 97, 108, 46, 102, 51, 50, 32, 9, 37, 102, 50, 49, 44, 32, 91, 37, 114, 100, 50, 53, 93, 59, 13, 10, 9, 108, 100, 46, 103, 108, 111, 98, 97, 108, 46, 102, 51, 50, 32, 9, 37, 102, 50, 50, 44, 32, 91, 37, 114, 100, 51, 49, 43, 52, 93, 59, 13, 10, 9, 102, 109, 97, 46, 114, 110, 46, 102, 51, 50, 32, 9, 37, 102, 50, 57, 44, 32, 37, 102, 50, 50, 44, 32, 37, 102, 50, 49, 44, 32, 37, 102, 50, 48, 59, 13, 10, 9, 97, 100, 100, 46, 115, 51, 50, 32, 9, 37, 114, 51, 49, 44, 32, 37, 114, 51, 49, 44, 32, 52, 59, 13, 10, 9, 97, 100, 100, 46, 115, 54, 52, 32, 9, 37, 114, 100, 51, 49, 44, 32, 37, 114, 100, 51, 49, 44, 32, 49, 54, 59, 13, 10, 9, 97, 100, 100, 46, 115, 51, 50, 32, 9, 37, 114, 51, 48, 44, 32, 37, 114, 51, 48, 44, 32, 45, 52, 59, 13, 10, 9, 115, 101, 116, 112, 46, 110, 101, 46, 115, 51, 50, 32, 9, 37, 112, 51, 44, 32, 37, 114, 51, 48, 44, 32, 48, 59, 13, 10, 9, 64, 37, 112, 51, 32, 98, 114, 97, 32, 9, 36, 76, 95, 95, 66, 66, 50, 95, 51, 59, 13, 10, 13, 10, 36, 76, 95, 95, 66, 66, 50, 95, 52, 58, 13, 10, 9, 115, 101, 116, 112, 46, 101, 113, 46, 115, 51, 50, 32, 9, 37, 112, 52, 44, 32, 37, 114, 51, 50, 44, 32, 48, 59, 13, 10, 9, 64, 37, 112, 52, 32, 98, 114, 97, 32, 9, 36, 76, 95, 95, 66, 66, 50, 95, 55, 59, 13, 10, 13, 10, 9, 109, 97, 100, 46, 108, 111, 46, 115, 51, 50, 32, 9, 37, 114, 50, 55, 44, 32, 37, 114, 51, 49, 44, 32, 37, 114, 49, 53, 44, 32, 37, 114, 50, 59, 13, 10, 9, 109, 117, 108, 46, 119, 105, 100, 101, 46, 115, 51, 50, 32, 9, 37, 114, 100, 50, 54, 44, 32, 37, 114, 50, 55, 44, 32, 52, 59, 13, 10, 9, 97, 100, 100, 46, 115, 54, 52, 32, 9, 37, 114, 100, 51, 52, 44, 32, 37, 114, 100, 49, 44, 32, 37, 114, 100, 50, 54, 59, 13, 10, 9, 109, 117, 108, 46, 119, 105, 100, 101, 46, 115, 51, 50, 32, 9, 37, 114, 100, 49, 49, 44, 32, 37, 114, 49, 53, 44, 32, 52, 59, 13, 10, 9, 109, 97, 100, 46, 108, 111, 46, 115, 51, 50, 32, 9, 37, 114, 50, 56, 44, 32, 37, 114, 51, 44, 32, 37, 114, 49, 51, 44, 32, 37, 114, 51, 49, 59, 13, 10, 9, 109, 117, 108, 46, 119, 105, 100, 101, 46, 115, 51, 50, 32, 9, 37, 114, 100, 50, 55, 44, 32, 37, 114, 50, 56, 44, 32, 52, 59, 13, 10, 9, 97, 100, 100, 46, 115, 54, 52, 32, 9, 37, 114, 100, 51, 51, 44, 32, 37, 114, 100, 50, 44, 32, 37, 114, 100, 50, 55, 59, 13, 10, 13, 10, 36, 76, 95, 95, 66, 66, 50, 95, 54, 58, 13, 10, 9, 46, 112, 114, 97, 103, 109, 97, 32, 34, 110, 111, 117, 110, 114, 111, 108, 108, 34, 59, 13, 10, 9, 108, 100, 46, 103, 108, 111, 98, 97, 108, 46, 102, 51, 50, 32, 9, 37, 102, 50, 51, 44, 32, 91, 37, 114, 100, 51, 52, 93, 59, 13, 10, 9, 108, 100, 46, 103, 108, 111, 98, 97, 108, 46, 102, 51, 50, 32, 9, 37, 102, 50, 52, 44, 32, 91, 37, 114, 100, 51, 51, 93, 59, 13, 10, 9, 102, 109, 97, 46, 114, 110, 46, 102, 51, 50, 32, 9, 37, 102, 50, 57, 44, 32, 37, 102, 50, 52, 44, 32, 37, 102, 50, 51, 44, 32, 37, 102, 50, 57, 59, 13, 10, 9, 97, 100, 100, 46, 115, 54, 52, 32, 9, 37, 114, 100, 51, 52, 44, 32, 37, 114, 100, 51, 52, 44, 32, 37, 114, 100, 49, 49, 59, 13, 10, 9, 97, 100, 100, 46, 115, 54, 52, 32, 9, 37, 114, 100, 51, 51, 44, 32, 37, 114, 100, 51, 51, 44, 32, 52, 59, 13, 10, 9, 97, 100, 100, 46, 115, 51, 50, 32, 9, 37, 114, 51, 50, 44, 32, 37, 114, 51, 50, 44, 32, 45, 49, 59, 13, 10, 9, 115, 101, 116, 112, 46, 110, 101, 46, 115, 51, 50, 32, 9, 37, 112, 53, 44, 32, 37, 114, 51, 50, 44, 32, 48, 59, 13, 10, 9, 64, 37, 112, 53, 32, 98, 114, 97, 32, 9, 36, 76, 95, 95, 66, 66, 50, 95, 54, 59, 13, 10, 13, 10, 36, 76, 95, 95, 66, 66, 50, 95, 55, 58, 13, 10, 9, 99, 118, 116, 97, 46, 116, 111, 46, 103, 108, 111, 98, 97, 108, 46, 117, 54, 52, 32, 9, 37, 114, 100, 50, 56, 44, 32, 37, 114, 100, 49, 55, 59, 13, 10, 9, 109, 117, 108, 46, 119, 105, 100, 101, 46, 115, 51, 50, 32, 9, 37, 114, 100, 50, 57, 44, 32, 37, 114, 49, 44, 32, 52, 59, 13, 10, 9, 97, 100, 100, 46, 115, 54, 52, 32, 9, 37, 114, 100, 51, 48, 44, 32, 37, 114, 100, 50, 56, 44, 32, 37, 114, 100, 50, 57, 59, 13, 10, 9, 115, 116, 46, 103, 108, 111, 98, 97, 108, 46, 102, 51, 50, 32, 9, 91, 37, 114, 100, 51, 48, 93, 44, 32, 37, 102, 50, 57, 59, 13, 10, 9, 114, 101, 116, 59, 13, 10, 13, 10, 125, 13, 10, 9, 47, 47, 32, 46, 103, 108, 111, 98, 108, 9, 97, 100, 100, 95, 115, 99, 97, 108, 97, 114, 13, 10, 46, 118, 105, 115, 105, 98, 108, 101, 32, 46, 101, 110, 116, 114, 121, 32, 97, 100, 100, 95, 115, 99, 97, 108, 97, 114, 40, 13, 10, 9, 46, 112, 97, 114, 97, 109, 32, 46, 117, 54, 52, 32, 97, 100, 100, 95, 115, 99, 97, 108, 97, 114, 95, 112, 97, 114, 97, 109, 95, 48, 44, 13, 10, 9, 46, 112, 97, 114, 97, 109, 32, 46, 117, 54, 52, 32, 97, 100, 100, 95, 115, 99, 97, 108, 97, 114, 95, 112, 97, 114, 97, 109, 95, 49, 44, 13, 10, 9, 46, 112, 97, 114, 97, 109, 32, 46, 102, 51, 50, 32, 97, 100, 100, 95, 115, 99, 97, 108, 97, 114, 95, 112, 97, 114, 97, 109, 95, 50, 13, 10, 41, 13, 10, 123, 13, 10, 9, 46, 114, 101, 103, 32, 46, 102, 51, 50, 32, 9, 37, 102, 60, 52, 62, 59, 13, 10, 9, 46, 114, 101, 103, 32, 46, 98, 51, 50, 32, 9, 37, 114, 60, 56, 62, 59, 13, 10, 9, 46, 114, 101, 103, 32, 46, 98, 54, 52, 32, 9, 37, 114, 100, 60, 56, 62, 59, 13, 10, 13, 10, 13, 10, 9, 108, 100, 46, 112, 97, 114, 97, 109, 46, 117, 54, 52, 32, 9, 37, 114, 100, 49, 44, 32, 91, 97, 100, 100, 95, 115, 99, 97, 108, 97, 114, 95, 112, 97, 114, 97, 109, 95, 48, 93, 59, 13, 10, 9, 108, 100, 46, 112, 97, 114, 97, 109, 46, 117, 54, 52, 32, 9, 37, 114, 100, 50, 44, 32, 91, 97, 100, 100, 95, 115, 99, 97, 108, 97, 114, 95, 112, 97, 114, 97, 109, 95, 49, 93, 59, 13, 10, 9, 108, 100, 46, 112, 97, 114, 97, 109, 46, 102, 51, 50, 32, 9, 37, 102, 49, 44, 32, 91, 97, 100, 100, 95, 115, 99, 97, 108, 97, 114, 95, 112, 97, 114, 97, 109, 95, 50, 93, 59, 13, 10, 9, 99, 118, 116, 97, 46, 116, 111, 46, 103, 108, 111, 98, 97, 108, 46, 117, 54, 52, 32, 9, 37, 114, 100, 51, 44, 32, 37, 114, 100, 50, 59, 13, 10, 9, 99, 118, 116, 97, 46, 116, 111, 46, 103, 108, 111, 98, 97, 108, 46, 117, 54, 52, 32, 9, 37, 114, 100, 52, 44, 32, 37, 114, 100, 49, 59, 13, 10, 9, 109, 111, 118, 46, 117, 51, 50, 32, 9, 37, 114, 49, 44, 32, 37, 116, 105, 100, 46, 120, 59, 13, 10, 9, 109, 111, 118, 46, 117, 51, 50, 32, 9, 37, 114, 50, 44, 32, 37, 116, 105, 100, 46, 121, 59, 13, 10, 9, 109, 111, 118, 46, 117, 51, 50, 32, 9, 37, 114, 51, 44, 32, 37, 110, 116, 105, 100, 46, 120, 59, 13, 10, 9, 109, 111, 118, 46, 117, 51, 50, 32, 9, 37, 114, 52, 44, 32, 37, 99, 116, 97, 105, 100, 46, 120, 59, 13, 10, 9, 109, 111, 118, 46, 117, 51, 50, 32, 9, 37, 114, 53, 44, 32, 37, 110, 116, 105, 100, 46, 121, 59, 13, 10, 9, 109, 97, 100, 46, 108, 111, 46, 115, 51, 50, 32, 9, 37, 114, 54, 44, 32, 37, 114, 53, 44, 32, 37, 114, 52, 44, 32, 37, 114, 50, 59, 13, 10, 9, 109, 97, 100, 46, 108, 111, 46, 115, 51, 50, 32, 9, 37, 114, 55, 44, 32, 37, 114, 54, 44, 32, 37, 114, 51, 44, 32, 37, 114, 49, 59, 13, 10, 9, 109, 117, 108, 46, 119, 105, 100, 101, 46, 115, 51, 50, 32, 9, 37, 114, 100, 53, 44, 32, 37, 114, 55, 44, 32, 52, 59, 13, 10, 9, 97, 100, 100, 46, 115, 54, 52, 32, 9, 37, 114, 100, 54, 44, 32, 37, 114, 100, 52, 44, 32, 37, 114, 100, 53, 59, 13, 10, 9, 108, 100, 46, 103, 108, 111, 98, 97, 108, 46, 102, 51, 50, 32, 9, 37, 102, 50, 44, 32, 91, 37, 114, 100, 54, 93, 59, 13, 10, 9, 97, 100, 100, 46, 102, 51, 50, 32, 9, 37, 102, 51, 44, 32, 37, 102, 50, 44, 32, 37, 102, 49, 59, 13, 10, 9, 97, 100, 100, 46, 115, 54, 52, 32, 9, 37, 114, 100, 55, 44, 32, 37, 114, 100, 51, 44, 32, 37, 114, 100, 53, 59, 13, 10, 9, 115, 116, 46, 103, 108, 111, 98, 97, 108, 46, 102, 51, 50, 32, 9, 91, 37, 114, 100, 55, 93, 44, 32, 37, 102, 51, 59, 13, 10, 9, 114, 101, 116, 59, 13, 10, 13, 10, 125, 13, 10, 9, 47, 47, 32, 46, 103, 108, 111, 98, 108, 9, 115, 117, 98, 95, 115, 99, 97, 108, 97, 114, 13, 10, 46, 118, 105, 115, 105, 98, 108, 101, 32, 46, 101, 110, 116, 114, 121, 32, 115, 117, 98, 95, 115, 99, 97, 108, 97, 114, 40, 13, 10, 9, 46, 112, 97, 114, 97, 109, 32, 46, 117, 54, 52, 32, 115, 117, 98, 95, 115, 99, 97, 108, 97, 114, 95, 112, 97, 114, 97, 109, 95, 48, 44, 13, 10, 9, 46, 112, 97, 114, 97, 109, 32, 46, 117, 54, 52, 32, 115, 117, 98, 95, 115, 99, 97, 108, 97, 114, 95, 112, 97, 114, 97, 109, 95, 49, 44, 13, 10, 9, 46, 112, 97, 114, 97, 109, 32, 46, 102, 51, 50, 32, 115, 117, 98, 95, 115, 99, 97, 108, 97, 114, 95, 112, 97, 114, 97, 109, 95, 50, 13, 10, 41, 13, 10, 123, 13, 10, 9, 46, 114, 101, 103, 32, 46, 102, 51, 50, 32, 9, 37, 102, 60, 52, 62, 59, 13, 10, 9, 46, 114, 101, 103, 32, 46, 98, 51, 50, 32, 9, 37, 114, 60, 56, 62, 59, 13, 10, 9, 46, 114, 101, 103, 32, 46, 98, 54, 52, 32, 9, 37, 114, 100, 60, 56, 62, 59, 13, 10, 13, 10, 13, 10, 9, 108, 100, 46, 112, 97, 114, 97, 109, 46, 117, 54, 52, 32, 9, 37, 114, 100, 49, 44, 32, 91, 115, 117, 98, 95, 115, 99, 97, 108, 97, 114, 95, 112, 97, 114, 97, 109, 95, 48, 93, 59, 13, 10, 9, 108, 100, 46, 112, 97, 114, 97, 109, 46, 117, 54, 52, 32, 9, 37, 114, 100, 50, 44, 32, 91, 115, 117, 98, 95, 115, 99, 97, 108, 97, 114, 95, 112, 97, 114, 97, 109, 95, 49, 93, 59, 13, 10, 9, 108, 100, 46, 112, 97, 114, 97, 109, 46, 102, 51, 50, 32, 9, 37, 102, 49, 44, 32, 91, 115, 117, 98, 95, 115, 99, 97, 108, 97, 114, 95, 112, 97, 114, 97, 109, 95, 50, 93, 59, 13, 10, 9, 99, 118, 116, 97, 46, 116, 111, 46, 103, 108, 111, 98, 97, 108, 46, 117, 54, 52, 32, 9, 37, 114, 100, 51, 44, 32, 37, 114, 100, 50, 59, 13, 10, 9, 99, 118, 116, 97, 46, 116, 111, 46, 103, 108, 111, 98, 97, 108, 46, 117, 54, 52, 32, 9, 37, 114, 100, 52, 44, 32, 37, 114, 100, 49, 59, 13, 10, 9, 109, 111, 118, 46, 117, 51, 50, 32, 9, 37, 114, 49, 44, 32, 37, 116, 105, 100, 46, 120, 59, 13, 10, 9, 109, 111, 118, 46, 117, 51, 50, 32, 9, 37, 114, 50, 44, 32, 37, 116, 105, 100, 46, 121, 59, 13, 10, 9, 109, 111, 118, 46, 117, 51, 50, 32, 9, 37, 114, 51, 44, 32, 37, 110, 116, 105, 100, 46, 120, 59, 13, 10, 9, 109, 111, 118, 46, 117, 51, 50, 32, 9, 37, 114, 52, 44, 32, 37, 99, 116, 97, 105, 100, 46, 120, 59, 13, 10, 9, 109, 111, 118, 46, 117, 51, 50, 32, 9, 37, 114, 53, 44, 32, 37, 110, 116, 105, 100, 46, 121, 59, 13, 10, 9, 109, 97, 100, 46, 108, 111, 46, 115, 51, 50, 32, 9, 37, 114, 54, 44, 32, 37, 114, 53, 44, 32, 37, 114, 52, 44, 32, 37, 114, 50, 59, 13, 10, 9, 109, 97, 100, 46, 108, 111, 46, 115, 51, 50, 32, 9, 37, 114, 55, 44, 32, 37, 114, 54, 44, 32, 37, 114, 51, 44, 32, 37, 114, 49, 59, 13, 10, 9, 109, 117, 108, 46, 119, 105, 100, 101, 46, 115, 51, 50, 32, 9, 37, 114, 100, 53, 44, 32, 37, 114, 55, 44, 32, 52, 59, 13, 10, 9, 97, 100, 100, 46, 115, 54, 52, 32, 9, 37, 114, 100, 54, 44, 32, 37, 114, 100, 52, 44, 32, 37, 114, 100, 53, 59, 13, 10, 9, 108, 100, 46, 103, 108, 111, 98, 97, 108, 46, 102, 51, 50, 32, 9, 37, 102, 50, 44, 32, 91, 37, 114, 100, 54, 93, 59, 13, 10, 9, 115, 117, 98, 46, 102, 51, 50, 32, 9, 37, 102, 51, 44, 32, 37, 102, 50, 44, 32, 37, 102, 49, 59, 13, 10, 9, 97, 100, 100, 46, 115, 54, 52, 32, 9, 37, 114, 100, 55, 44, 32, 37, 114, 100, 51, 44, 32, 37, 114, 100, 53, 59, 13, 10, 9, 115, 116, 46, 103, 108, 111, 98, 97, 108, 46, 102, 51, 50, 32, 9, 91, 37, 114, 100, 55, 93, 44, 32, 37, 102, 51, 59, 13, 10, 9, 114, 101, 116, 59, 13, 10, 13, 10, 125, 13, 10, 9, 47, 47, 32, 46, 103, 108, 111, 98, 108, 9, 109, 117, 108, 95, 115, 99, 97, 108, 97, 114, 13, 10, 46, 118, 105, 115, 105, 98, 108, 101, 32, 46, 101, 110, 116, 114, 121, 32, 109, 117, 108, 95, 115, 99, 97, 108, 97, 114, 40, 13, 10, 9, 46, 112, 97, 114, 97, 109, 32, 46, 117, 54, 52, 32, 109, 117, 108, 95, 115, 99, 97, 108, 97, 114, 95, 112, 97, 114, 97, 109, 95, 48, 44, 13, 10, 9, 46, 112, 97, 114, 97, 109, 32, 46, 117, 54, 52, 32, 109, 117, 108, 95, 115, 99, 97, 108, 97, 114, 95, 112, 97, 114, 97, 109, 95, 49, 44, 13, 10, 9, 46, 112, 97, 114, 97, 109, 32, 46, 102, 51, 50, 32, 109, 117, 108, 95, 115, 99, 97, 108, 97, 114, 95, 112, 97, 114, 97, 109, 95, 50, 13, 10, 41, 13, 10, 123, 13, 10, 9, 46, 114, 101, 103, 32, 46, 102, 51, 50, 32, 9, 37, 102, 60, 52, 62, 59, 13, 10, 9, 46, 114, 101, 103, 32, 46, 98, 51, 50, 32, 9, 37, 114, 60, 56, 62, 59, 13, 10, 9, 46, 114, 101, 103, 32, 46, 98, 54, 52, 32, 9, 37, 114, 100, 60, 56, 62, 59, 13, 10, 13, 10, 13, 10, 9, 108, 100, 46, 112, 97, 114, 97, 109, 46, 117, 54, 52, 32, 9, 37, 114, 100, 49, 44, 32, 91, 109, 117, 108, 95, 115, 99, 97, 108, 97, 114, 95, 112, 97, 114, 97, 109, 95, 48, 93, 59, 13, 10, 9, 108, 100, 46, 112, 97, 114, 97, 109, 46, 117, 54, 52, 32, 9, 37, 114, 100, 50, 44, 32, 91, 109, 117, 108, 95, 115, 99, 97, 108, 97, 114, 95, 112, 97, 114, 97, 109, 95, 49, 93, 59, 13, 10, 9, 108, 100, 46, 112, 97, 114, 97, 109, 46, 102, 51, 50, 32, 9, 37, 102, 49, 44, 32, 91, 109, 117, 108, 95, 115, 99, 97, 108, 97, 114, 95, 112, 97, 114, 97, 109, 95, 50, 93, 59, 13, 10, 9, 99, 118, 116, 97, 46, 116, 111, 46, 103, 108, 111, 98, 97, 108, 46, 117, 54, 52, 32, 9, 37, 114, 100, 51, 44, 32, 37, 114, 100, 50, 59, 13, 10, 9, 99, 118, 116, 97, 46, 116, 111, 46, 103, 108, 111, 98, 97, 108, 46, 117, 54, 52, 32, 9, 37, 114, 100, 52, 44, 32, 37, 114, 100, 49, 59, 13, 10, 9, 109, 111, 118, 46, 117, 51, 50, 32, 9, 37, 114, 49, 44, 32, 37, 116, 105, 100, 46, 120, 59, 13, 10, 9, 109, 111, 118, 46, 117, 51, 50, 32, 9, 37, 114, 50, 44, 32, 37, 116, 105, 100, 46, 121, 59, 13, 10, 9, 109, 111, 118, 46, 117, 51, 50, 32, 9, 37, 114, 51, 44, 32, 37, 110, 116, 105, 100, 46, 120, 59, 13, 10, 9, 109, 111, 118, 46, 117, 51, 50, 32, 9, 37, 114, 52, 44, 32, 37, 99, 116, 97, 105, 100, 46, 120, 59, 13, 10, 9, 109, 111, 118, 46, 117, 51, 50, 32, 9, 37, 114, 53, 44, 32, 37, 110, 116, 105, 100, 46, 121, 59, 13, 10, 9, 109, 97, 100, 46, 108, 111, 46, 115, 51, 50, 32, 9, 37, 114, 54, 44, 32, 37, 114, 53, 44, 32, 37, 114, 52, 44, 32, 37, 114, 50, 59, 13, 10, 9, 109, 97, 100, 46, 108, 111, 46, 115, 51, 50, 32, 9, 37, 114, 55, 44, 32, 37, 114, 54, 44, 32, 37, 114, 51, 44, 32, 37, 114, 49, 59, 13, 10, 9, 109, 117, 108, 46, 119, 105, 100, 101, 46, 115, 51, 50, 32, 9, 37, 114, 100, 53, 44, 32, 37, 114, 55, 44, 32, 52, 59, 13, 10, 9, 97, 100, 100, 46, 115, 54, 52, 32, 9, 37, 114, 100, 54, 44, 32, 37, 114, 100, 52, 44, 32, 37, 114, 100, 53, 59, 13, 10, 9, 108, 100, 46, 103, 108, 111, 98, 97, 108, 46, 102, 51, 50, 32, 9, 37, 102, 50, 44, 32, 91, 37, 114, 100, 54, 93, 59, 13, 10, 9, 109, 117, 108, 46, 102, 51, 50, 32, 9, 37, 102, 51, 44, 32, 37, 102, 50, 44, 32, 37, 102, 49, 59, 13, 10, 9, 97, 100, 100, 46, 115, 54, 52, 32, 9, 37, 114, 100, 55, 44, 32, 37, 114, 100, 51, 44, 32, 37, 114, 100, 53, 59, 13, 10, 9, 115, 116, 46, 103, 108, 111, 98, 97, 108, 46, 102, 51, 50, 32, 9, 91, 37, 114, 100, 55, 93, 44, 32, 37, 102, 51, 59, 13, 10, 9, 114, 101, 116, 59, 13, 10, 13, 10, 125, 13, 10, 9, 47, 47, 32, 46, 103, 108, 111, 98, 108, 9, 100, 105, 118, 95, 115, 99, 97, 108, 97, 114, 13, 10, 46, 118, 105, 115, 105, 98, 108, 101, 32, 46, 101, 110, 116, 114, 121, 32, 100, 105, 118, 95, 115, 99, 97, 108, 97, 114, 40, 13, 10, 9, 46, 112, 97, 114, 97, 109, 32, 46, 117, 54, 52, 32, 100, 105, 118, 95, 115, 99, 97, 108, 97, 114, 95, 112, 97, 114, 97, 109, 95, 48, 44, 13, 10, 9, 46, 112, 97, 114, 97, 109, 32, 46, 117, 54, 52, 32, 100, 105, 118, 95, 115, 99, 97, 108, 97, 114, 95, 112, 97, 114, 97, 109, 95, 49, 44, 13, 10, 9, 46, 112, 97, 114, 97, 109, 32, 46, 102, 51, 50, 32, 100, 105, 118, 95, 115, 99, 97, 108, 97, 114, 95, 112, 97, 114, 97, 109, 95, 50, 13, 10, 41, 13, 10, 123, 13, 10, 9, 46, 114, 101, 103, 32, 46, 102, 51, 50, 32, 9, 37, 102, 60, 52, 62, 59, 13, 10, 9, 46, 114, 101, 103, 32, 46, 98, 51, 50, 32, 9, 37, 114, 60, 56, 62, 59, 13, 10, 9, 46, 114, 101, 103, 32, 46, 98, 54, 52, 32, 9, 37, 114, 100, 60, 56, 62, 59, 13, 10, 13, 10, 13, 10, 9, 108, 100, 46, 112, 97, 114, 97, 109, 46, 117, 54, 52, 32, 9, 37, 114, 100, 49, 44, 32, 91, 100, 105, 118, 95, 115, 99, 97, 108, 97, 114, 95, 112, 97, 114, 97, 109, 95, 48, 93, 59, 13, 10, 9, 108, 100, 46, 112, 97, 114, 97, 109, 46, 117, 54, 52, 32, 9, 37, 114, 100, 50, 44, 32, 91, 100, 105, 118, 95, 115, 99, 97, 108, 97, 114, 95, 112, 97, 114, 97, 109, 95, 49, 93, 59, 13, 10, 9, 108, 100, 46, 112, 97, 114, 97, 109, 46, 102, 51, 50, 32, 9, 37, 102, 49, 44, 32, 91, 100, 105, 118, 95, 115, 99, 97, 108, 97, 114, 95, 112, 97, 114, 97, 109, 95, 50, 93, 59, 13, 10, 9, 99, 118, 116, 97, 46, 116, 111, 46, 103, 108, 111, 98, 97, 108, 46, 117, 54, 52, 32, 9, 37, 114, 100, 51, 44, 32, 37, 114, 100, 50, 59, 13, 10, 9, 99, 118, 116, 97, 46, 116, 111, 46, 103, 108, 111, 98, 97, 108, 46, 117, 54, 52, 32, 9, 37, 114, 100, 52, 44, 32, 37, 114, 100, 49, 59, 13, 10, 9, 109, 111, 118, 46, 117, 51, 50, 32, 9, 37, 114, 49, 44, 32, 37, 116, 105, 100, 46, 120, 59, 13, 10, 9, 109, 111, 118, 46, 117, 51, 50, 32, 9, 37, 114, 50, 44, 32, 37, 116, 105, 100, 46, 121, 59, 13, 10, 9, 109, 111, 118, 46, 117, 51, 50, 32, 9, 37, 114, 51, 44, 32, 37, 110, 116, 105, 100, 46, 120, 59, 13, 10, 9, 109, 111, 118, 46, 117, 51, 50, 32, 9, 37, 114, 52, 44, 32, 37, 99, 116, 97, 105, 100, 46, 120, 59, 13, 10, 9, 109, 111, 118, 46, 117, 51, 50, 32, 9, 37, 114, 53, 44, 32, 37, 110, 116, 105, 100, 46, 121, 59, 13, 10, 9, 109, 97, 100, 46, 108, 111, 46, 115, 51, 50, 32, 9, 37, 114, 54, 44, 32, 37, 114, 53, 44, 32, 37, 114, 52, 44, 32, 37, 114, 50, 59, 13, 10, 9, 109, 97, 100, 46, 108, 111, 46, 115, 51, 50, 32, 9, 37, 114, 55, 44, 32, 37, 114, 54, 44, 32, 37, 114, 51, 44, 32, 37, 114, 49, 59, 13, 10, 9, 109, 117, 108, 46, 119, 105, 100, 101, 46, 115, 51, 50, 32, 9, 37, 114, 100, 53, 44, 32, 37, 114, 55, 44, 32, 52, 59, 13, 10, 9, 97, 100, 100, 46, 115, 54, 52, 32, 9, 37, 114, 100, 54, 44, 32, 37, 114, 100, 52, 44, 32, 37, 114, 100, 53, 59, 13, 10, 9, 108, 100, 46, 103, 108, 111, 98, 97, 108, 46, 102, 51, 50, 32, 9, 37, 102, 50, 44, 32, 91, 37, 114, 100, 54, 93, 59, 13, 10, 9, 100, 105, 118, 46, 114, 110, 46, 102, 51, 50, 32, 9, 37, 102, 51, 44, 32, 37, 102, 50, 44, 32, 37, 102, 49, 59, 13, 10, 9, 97, 100, 100, 46, 115, 54, 52, 32, 9, 37, 114, 100, 55, 44, 32, 37, 114, 100, 51, 44, 32, 37, 114, 100, 53, 59, 13, 10, 9, 115, 116, 46, 103, 108, 111, 98, 97, 108, 46, 102, 51, 50, 32, 9, 91, 37, 114, 100, 55, 93, 44, 32, 37, 102, 51, 59, 13, 10, 9, 114, 101, 116, 59, 13, 10, 13, 10, 125, 13, 10, 9, 47, 47, 32, 46, 103, 108, 111, 98, 108, 9, 115, 99, 97, 108, 97, 114, 95, 115, 117, 98, 13, 10, 46, 118, 105, 115, 105, 98, 108, 101, 32, 46, 101, 110, 116, 114, 121, 32, 115, 99, 97, 108, 97, 114, 95, 115, 117, 98, 40, 13, 10, 9, 46, 112, 97, 114, 97, 109, 32, 46, 117, 54, 52, 32, 115, 99, 97, 108, 97, 114, 95, 115, 117, 98, 95, 112, 97, 114, 97, 109, 95, 48, 44, 13, 10, 9, 46, 112, 97, 114, 97, 109, 32, 46, 117, 54, 52, 32, 115, 99, 97, 108, 97, 114, 95, 115, 117, 98, 95, 112, 97, 114, 97, 109, 95, 49, 44, 13, 10, 9, 46, 112, 97, 114, 97, 109, 32, 46, 102, 51, 50, 32, 115, 99, 97, 108, 97, 114, 95, 115, 117, 98, 95, 112, 97, 114, 97, 109, 95, 50, 13, 10, 41, 13, 10, 123, 13, 10, 9, 46, 114, 101, 103, 32, 46, 102, 51, 50, 32, 9, 37, 102, 60, 52, 62, 59, 13, 10, 9, 46, 114, 101, 103, 32, 46, 98, 51, 50, 32, 9, 37, 114, 60, 56, 62, 59, 13, 10, 9, 46, 114, 101, 103, 32, 46, 98, 54, 52, 32, 9, 37, 114, 100, 60, 56, 62, 59, 13, 10, 13, 10, 13, 10, 9, 108, 100, 46, 112, 97, 114, 97, 109, 46, 117, 54, 52, 32, 9, 37, 114, 100, 49, 44, 32, 91, 115, 99, 97, 108, 97, 114, 95, 115, 117, 98, 95, 112, 97, 114, 97, 109, 95, 48, 93, 59, 13, 10, 9, 108, 100, 46, 112, 97, 114, 97, 109, 46, 117, 54, 52, 32, 9, 37, 114, 100, 50, 44, 32, 91, 115, 99, 97, 108, 97, 114, 95, 115, 117, 98, 95, 112, 97, 114, 97, 109, 95, 49, 93, 59, 13, 10, 9, 108, 100, 46, 112, 97, 114, 97, 109, 46, 102, 51, 50, 32, 9, 37, 102, 49, 44, 32, 91, 115, 99, 97, 108, 97, 114, 95, 115, 117, 98, 95, 112, 97, 114, 97, 109, 95, 50, 93, 59, 13, 10, 9, 99, 118, 116, 97, 46, 116, 111, 46, 103, 108, 111, 98, 97, 108, 46, 117, 54, 52, 32, 9, 37, 114, 100, 51, 44, 32, 37, 114, 100, 50, 59, 13, 10, 9, 99, 118, 116, 97, 46, 116, 111, 46, 103, 108, 111, 98, 97, 108, 46, 117, 54, 52, 32, 9, 37, 114, 100, 52, 44, 32, 37, 114, 100, 49, 59, 13, 10, 9, 109, 111, 118, 46, 117, 51, 50, 32, 9, 37, 114, 49, 44, 32, 37, 116, 105, 100, 46, 120, 59, 13, 10, 9, 109, 111, 118, 46, 117, 51, 50, 32, 9, 37, 114, 50, 44, 32, 37, 116, 105, 100, 46, 121, 59, 13, 10, 9, 109, 111, 118, 46, 117, 51, 50, 32, 9, 37, 114, 51, 44, 32, 37, 110, 116, 105, 100, 46, 120, 59, 13, 10, 9, 109, 111, 118, 46, 117, 51, 50, 32, 9, 37, 114, 52, 44, 32, 37, 99, 116, 97, 105, 100, 46, 120, 59, 13, 10, 9, 109, 111, 118, 46, 117, 51, 50, 32, 9, 37, 114, 53, 44, 32, 37, 110, 116, 105, 100, 46, 121, 59, 13, 10, 9, 109, 97, 100, 46, 108, 111, 46, 115, 51, 50, 32, 9, 37, 114, 54, 44, 32, 37, 114, 53, 44, 32, 37, 114, 52, 44, 32, 37, 114, 50, 59, 13, 10, 9, 109, 97, 100, 46, 108, 111, 46, 115, 51, 50, 32, 9, 37, 114, 55, 44, 32, 37, 114, 54, 44, 32, 37, 114, 51, 44, 32, 37, 114, 49, 59, 13, 10, 9, 109, 117, 108, 46, 119, 105, 100, 101, 46, 115, 51, 50, 32, 9, 37, 114, 100, 53, 44, 32, 37, 114, 55, 44, 32, 52, 59, 13, 10, 9, 97, 100, 100, 46, 115, 54, 52, 32, 9, 37, 114, 100, 54, 44, 32, 37, 114, 100, 52, 44, 32, 37, 114, 100, 53, 59, 13, 10, 9, 108, 100, 46, 103, 108, 111, 98, 97, 108, 46, 102, 51, 50, 32, 9, 37, 102, 50, 44, 32, 91, 37, 114, 100, 54, 93, 59, 13, 10, 9, 115, 117, 98, 46, 102, 51, 50, 32, 9, 37, 102, 51, 44, 32, 37, 102, 49, 44, 32, 37, 102, 50, 59, 13, 10, 9, 97, 100, 100, 46, 115, 54, 52, 32, 9, 37, 114, 100, 55, 44, 32, 37, 114, 100, 51, 44, 32, 37, 114, 100, 53, 59, 13, 10, 9, 115, 116, 46, 103, 108, 111, 98, 97, 108, 46, 102, 51, 50, 32, 9, 91, 37, 114, 100, 55, 93, 44, 32, 37, 102, 51, 59, 13, 10, 9, 114, 101, 116, 59, 13, 10, 13, 10, 125, 13, 10, 9, 47, 47, 32, 46, 103, 108, 111, 98, 108, 9, 115, 99, 97, 108, 97, 114, 95, 100, 105, 118, 13, 10, 46, 118, 105, 115, 105, 98, 108, 101, 32, 46, 101, 110, 116, 114, 121, 32, 115, 99, 97, 108, 97, 114, 95, 100, 105, 118, 40, 13, 10, 9, 46, 112, 97, 114, 97, 109, 32, 46, 117, 54, 52, 32, 115, 99, 97, 108, 97, 114, 95, 100, 105, 118, 95, 112, 97, 114, 97, 109, 95, 48, 44, 13, 10, 9, 46, 112, 97, 114, 97, 109, 32, 46, 117, 54, 52, 32, 115, 99, 97, 108, 97, 114, 95, 100, 105, 118, 95, 112, 97, 114, 97, 109, 95, 49, 44, 13, 10, 9, 46, 112, 97, 114, 97, 109, 32, 46, 102, 51, 50, 32, 115, 99, 97, 108, 97, 114, 95, 100, 105, 118, 95, 112, 97, 114, 97, 109, 95, 50, 13, 10, 41, 13, 10, 123, 13, 10, 9, 46, 114, 101, 103, 32, 46, 102, 51, 50, 32, 9, 37, 102, 60, 52, 62, 59, 13, 10, 9, 46, 114, 101, 103, 32, 46, 98, 51, 50, 32, 9, 37, 114, 60, 56, 62, 59, 13, 10, 9, 46, 114, 101, 103, 32, 46, 98, 54, 52, 32, 9, 37, 114, 100, 60, 56, 62, 59, 13, 10, 13, 10, 13, 10, 9, 108, 100, 46, 112, 97, 114, 97, 109, 46, 117, 54, 52, 32, 9, 37, 114, 100, 49, 44, 32, 91, 115, 99, 97, 108, 97, 114, 95, 100, 105, 118, 95, 112, 97, 114, 97, 109, 95, 48, 93, 59, 13, 10, 9, 108, 100, 46, 112, 97, 114, 97, 109, 46, 117, 54, 52, 32, 9, 37, 114, 100, 50, 44, 32, 91, 115, 99, 97, 108, 97, 114, 95, 100, 105, 118, 95, 112, 97, 114, 97, 109, 95, 49, 93, 59, 13, 10, 9, 108, 100, 46, 112, 97, 114, 97, 109, 46, 102, 51, 50, 32, 9, 37, 102, 49, 44, 32, 91, 115, 99, 97, 108, 97, 114, 95, 100, 105, 118, 95, 112, 97, 114, 97, 109, 95, 50, 93, 59, 13, 10, 9, 99, 118, 116, 97, 46, 116, 111, 46, 103, 108, 111, 98, 97, 108, 46, 117, 54, 52, 32, 9, 37, 114, 100, 51, 44, 32, 37, 114, 100, 50, 59, 13, 10, 9, 99, 118, 116, 97, 46, 116, 111, 46, 103, 108, 111, 98, 97, 108, 46, 117, 54, 52, 32, 9, 37, 114, 100, 52, 44, 32, 37, 114, 100, 49, 59, 13, 10, 9, 109, 111, 118, 46, 117, 51, 50, 32, 9, 37, 114, 49, 44, 32, 37, 116, 105, 100, 46, 120, 59, 13, 10, 9, 109, 111, 118, 46, 117, 51, 50, 32, 9, 37, 114, 50, 44, 32, 37, 116, 105, 100, 46, 121, 59, 13, 10, 9, 109, 111, 118, 46, 117, 51, 50, 32, 9, 37, 114, 51, 44, 32, 37, 110, 116, 105, 100, 46, 120, 59, 13, 10, 9, 109, 111, 118, 46, 117, 51, 50, 32, 9, 37, 114, 52, 44, 32, 37, 99, 116, 97, 105, 100, 46, 120, 59, 13, 10, 9, 109, 111, 118, 46, 117, 51, 50, 32, 9, 37, 114, 53, 44, 32, 37, 110, 116, 105, 100, 46, 121, 59, 13, 10, 9, 109, 97, 100, 46, 108, 111, 46, 115, 51, 50, 32, 9, 37, 114, 54, 44, 32, 37, 114, 53, 44, 32, 37, 114, 52, 44, 32, 37, 114, 50, 59, 13, 10, 9, 109, 97, 100, 46, 108, 111, 46, 115, 51, 50, 32, 9, 37, 114, 55, 44, 32, 37, 114, 54, 44, 32, 37, 114, 51, 44, 32, 37, 114, 49, 59, 13, 10, 9, 109, 117, 108, 46, 119, 105, 100, 101, 46, 115, 51, 50, 32, 9, 37, 114, 100, 53, 44, 32, 37, 114, 55, 44, 32, 52, 59, 13, 10, 9, 97, 100, 100, 46, 115, 54, 52, 32, 9, 37, 114, 100, 54, 44, 32, 37, 114, 100, 52, 44, 32, 37, 114, 100, 53, 59, 13, 10, 9, 108, 100, 46, 103, 108, 111, 98, 97, 108, 46, 102, 51, 50, 32, 9, 37, 102, 50, 44, 32, 91, 37, 114, 100, 54, 93, 59, 13, 10, 9, 100, 105, 118, 46, 114, 110, 46, 102, 51, 50, 32, 9, 37, 102, 51, 44, 32, 37, 102, 49, 44, 32, 37, 102, 50, 59, 13, 10, 9, 97, 100, 100, 46, 115, 54, 52, 32, 9, 37, 114, 100, 55, 44, 32, 37, 114, 100, 51, 44, 32, 37, 114, 100, 53, 59, 13, 10, 9, 115, 116, 46, 103, 108, 111, 98, 97, 108, 46, 102, 51, 50, 32, 9, 91, 37, 114, 100, 55, 93, 44, 32, 37, 102, 51, 59, 13, 10, 9, 114, 101, 116, 59, 13, 10, 13, 10, 125, 13, 10, 13, 10];
        CudaModule::from_vec(module_data)
    }

    /// Load a module from data as `Vec<u8>`.
    ///
    /// You can obtains a `Vec<u8>` from a `.ptx` file with the following code:
    /// ```
    /// use std::fs::File;
    /// use std::io::Read;
    ///
    /// let mut file = File::open("resources/kernel.ptx").unwrap();
    ///
    ///  let mut data: Vec<u8> = Vec::new();
    ///  file.read_to_end(&mut data).unwrap();
    ///
    ///  println!("{:?}", data);
    /// ```
    ///
    /// That allow you to embed the `.ptx` file in your binary.
    ///
    /// # Example
    ///
    /// ```
    /// use cuda_driver_sys::*;
    /// use matrix_operations_cuda::cuda_env::CudaEnv;
    /// use matrix_operations_cuda::cuda_module::CudaModule;
    ///
    /// unsafe {
    ///     let cuda_env = CudaEnv::new(0, 0).unwrap();
    ///
    ///     let data = vec![47, 47, 13, 10, 47, 47, 32, 71, 101, 110, 101, 114, 97, 116, 101, 100,
    ///     32, 98, 121, 32, 78, 86, 73, 68, 73, 65, 32, 78, 86, 86, 77, 32, 67, 111, 109, 112, 105,
    ///     108, 101, 114, 13, 10, 47, 47, 13, 10, 47, 47, 32, 67, 111, 109, 112, 105, 108, 101, 114,
    ///     32, 66, 117, 105, 108, 100, 32, 73, 68, 58, 32, 67, 76, 45, 51, 50, 50, 54, 55, 51, 48,
    ///     50, 13, 10, 47, 47, 32, 67, 117, 100, 97, 32, 99, 111, 109, 112, 105, 108, 97, 116, 105,
    ///     111, 110, 32, 116, 111, 111, 108, 115, 44, 32, 114, 101, 108, 101, 97, 115, 101, 32, 49,
    ///     50, 46, 48, 44, 32, 86, 49, 50, 46, 48, 46, 49, 52, 48, 13, 10, 47, 47, 32, 66, 97, 115,
    ///     101, 100, 32, 111, 110, 32, 78, 86, 86, 77, 32, 55, 46, 48, 46, 49, 13, 10, 47, 47, 13,
    ///     10, 13, 10, 46, 118, 101, 114, 115, 105, 111, 110, 32, 56, 46, 48, 13, 10, 46, 116, 97,
    ///     114, 103, 101, 116, 32, 115, 109, 95, 53, 50, 13, 10, 46, 97, 100, 100, 114, 101, 115,
    ///     115, 95, 115, 105, 122, 101, 32, 54, 52, 13, 10, 13, 10, 9, 47, 47, 32, 46, 103, 108, 111,
    ///     98, 108, 9, 116, 101, 115, 116, 13, 10, 13, 10, 46, 118, 105, 115, 105, 98, 108, 101, 32,
    ///     46, 101, 110, 116, 114, 121, 32, 116, 101, 115, 116, 40, 41, 13, 10, 123, 13, 10, 13, 10,
    ///     13, 10, 13, 10, 9, 114, 101, 116, 59, 13, 10, 13, 10, 125, 13, 10, 13, 10];
    ///
    ///     let module = CudaModule::from_vec(data).unwrap();
    ///
    ///     module.free().unwrap();
    ///     cuda_env.free().unwrap();
    /// }
    /// ```
    pub unsafe fn from_vec(module_data: Vec<u8>) -> Result<CudaModule, Box<dyn Error>> {
        let mut module: CUmodule = std::ptr::null_mut();

        let result = cuModuleLoadData(&mut module, module_data.as_ptr() as *const c_void);
        if result != CUresult::CUDA_SUCCESS {
            return Err(format!("Error loading module : {:?}", result).into());
        }

        Ok(CudaModule {
            module,
        })
    }

    /// Load a function from the module
    ///
    /// # Example
    ///
    /// ```
    /// use cuda_driver_sys::*;
    /// use matrix_operations_cuda::cuda_env::CudaEnv;
    /// use matrix_operations_cuda::cuda_module::CudaModule;
    ///
    /// unsafe {
    ///     let cuda_env = CudaEnv::new(0, 0).unwrap();
    ///
    ///     let module = CudaModule::new(b"resources/kernel.ptx\0").unwrap();
    ///     let function = module.load_function(b"add\0").unwrap();
    ///
    ///     module.free().unwrap();
    ///     cuda_env.free().unwrap();
    /// }
    /// ```
    pub unsafe fn load_function(&self, name: &[u8]) -> Result<CUfunction, Box<dyn Error>> {
        let mut function: CUfunction = std::ptr::null_mut();
        let result = cuModuleGetFunction(&mut function, self.module, name.as_ptr() as *const _);
        if result != CUresult::CUDA_SUCCESS {
            return Err(format!("Error loading function: {:?}", result).into());
        }
        Ok(function)
    }

    /// Free the module
    ///
    /// # Example
    ///
    /// ```
    /// use cuda_driver_sys::*;
    /// use matrix_operations_cuda::cuda_env::CudaEnv;
    /// use matrix_operations_cuda::cuda_module::CudaModule;
    ///
    /// unsafe {
    ///     let cuda_env = CudaEnv::new(0, 0);
    ///     let module = CudaModule::new(b"resources/kernel.ptx\0").unwrap();
    ///     module.free().unwrap();
    /// }
    /// ```
    pub unsafe fn free(&self) -> Result<(), Box<dyn Error>> {
        let result = cuModuleUnload(self.module);
        if result != CUresult::CUDA_SUCCESS {
            return Err(format!("Error unloading module : {:?}", result).into());
        }
        Ok(())
    }
}