コード例 #1
0
/**
 * Return a CT file for download
 */
function churchcore__filedownload()
{
    global $files_dir;
    include_once CHURCHCORE . "/churchcore_db.php";
    $mime_types = getMimeTypes();
    $file = db_query("SELECT * FROM {cc_file} f\n                    WHERE f.id=:id AND filename=:filename", array(":id" => getVar("id"), ":filename" => getVar("filename")))->fetch();
    if (preg_match('/^[0-9a-f]{64}$/i', $file->filename)) {
        $filename = "{$files_dir}/blobs/{$file->filename}";
    } else {
        $filename = "{$files_dir}/files/{$file->domain_type}/{$file->domain_id}/{$file->filename}";
    }
    //open file for binary read
    $handle = fopen($filename, "rb");
    if ($handle === false) {
        echo "Die Datei konnte nicht gelesen werden!";
    } else {
        if (isset($mime_types[substr(strrchr($file->bezeichnung, '.'), 1)])) {
            drupal_add_http_header('Content-Type', $mime_types[substr(strrchr($filename, '.'), 1)], false);
        } else {
            drupal_add_http_header('Content-Type', 'application/unknown', false);
        }
        if (getVar("type") == "download") {
            drupal_add_http_header('Content-Disposition', 'attachment;filename="' . $file->bezeichnung . '"', false);
        } else {
            drupal_add_http_header('Content-Disposition', 'inline;filename="' . $file->bezeichnung . '"', false);
        }
        drupal_add_http_header('Cache-Control', 'private', true);
        //disable output buffer and delete contents
        ob_end_clean();
        //steam all data to apache output buffer
        fpassthru($handle);
        //close file handle
        fclose($handle);
    }
}
コード例 #2
0
ファイル: confutils.php プロジェクト: pyfun/dokuwiki
/**
 * Returns the (known) extension and mimetype of a given filename
 *
 * If $knownonly is true (the default), then only known extensions
 * are returned.
 *
 * @author Andreas Gohr <*****@*****.**>
 */
function mimetype($file, $knownonly = true)
{
    $ret = array(false, false, false);
    // return array
    $mtypes = getMimeTypes();
    // known mimetypes
    $exts = join('|', array_keys($mtypes));
    // known extensions (regexp)
    if (!$knownonly) {
        $exts = $exts . '|[_\\-A-Za-z0-9]+';
        // any extension
    }
    if (preg_match('#\\.(' . $exts . ')$#i', $file, $matches)) {
        $ext = strtolower($matches[1]);
    }
    if ($ext) {
        if (isset($mtypes[$ext])) {
            if ($mtypes[$ext][0] == '!') {
                $ret = array($ext, substr($mtypes[$ext], 1), true);
            } else {
                $ret = array($ext, $mtypes[$ext], false);
            }
        } elseif (!$knownonly) {
            $ret = array($ext, 'application/octet-stream', true);
        }
    }
    return $ret;
}
コード例 #3
0
/**
 * Return an CT file for download
 */
function churchcore__filedownload()
{
    global $files_dir;
    include_once CHURCHCORE . "/churchcore_db.php";
    $mime_types = getMimeTypes();
    $file = db_query("select * from {cc_file} f where f.id=:id and filename=:filename", array(":id" => $_GET["id"], ":filename" => $_GET["filename"]))->fetch();
    $filename = "{$files_dir}/files/{$file->domain_type}/{$file->domain_id}/{$file->filename}";
    $handle = fopen($filename, "rb");
    if ($handle == false) {
        echo "Die Datei konnte nicht gefunden werden!";
    } else {
        $contents = fread($handle, filesize($filename));
        fclose($handle);
        if (isset($mime_types[substr(strrchr($filename, '.'), 1)])) {
            drupal_add_http_header('Content-Type', $mime_types[substr(strrchr($filename, '.'), 1)], false);
        } else {
            drupal_add_http_header('Content-Type', 'application/unknown', false);
        }
        if (isset($_GET["type"]) && $_GET["type"] == "download") {
            drupal_add_http_header('Content-Disposition', 'attachment;filename="' . $file->bezeichnung . '"', false);
        } else {
            drupal_add_http_header('Content-Disposition', 'inline;filename="' . $file->bezeichnung . '"', false);
        }
        drupal_add_http_header('Cache-Control', 'must-revalidate, post-check=0, pre-check=0', false);
        drupal_add_http_header('Cache-Control', 'private', true);
        $content = drupal_get_header();
        echo $contents;
    }
}
コード例 #4
0
ファイル: helper.php プロジェクト: violetfish/ckgedit
 function get_ckgedit_ImageAllowedExtensions()
 {
     $uploadImageTypes = array();
     foreach (getMimeTypes() as $ext => $mtype) {
         if (preg_match("/image/", $mtype)) {
             $uploadImageTypes[] = $ext;
         }
     }
     return '.(' . implode('|', $uploadImageTypes) . ')$';
 }
コード例 #5
0
function getMimeTypeOfFile($file)
{
    static $types;
    if (!isset($types)) {
        $types = getMimeTypes();
    }
    $ext = pathinfo($file, PATHINFO_EXTENSION);
    if (!$ext) {
        $ext = $file;
    }
    $ext = strtolower($ext);
    return isset($types[$ext]) ? $types[$ext] : null;
}
コード例 #6
0
 public function handle_ajax_call_unknown(Doku_Event &$event, $param)
 {
     if ($event->data != 'plugin_imgpaste') {
         return;
     }
     global $lang;
     // get data
     global $INPUT;
     $data = $INPUT->post->str('data');
     list($type, $data) = explode(';', $data);
     if (!$data) {
         $this->fail(400, $this->getLang('e_nodata'));
     }
     // process data encoding
     $type = strtolower(substr($type, 5));
     // strip 'data:' prefix
     $data = substr($data, 7);
     // strip 'base64,' prefix
     $data = base64_decode($data);
     // check for supported mime type
     $mimetypes = array_flip(getMimeTypes());
     if (!isset($mimetypes[$type])) {
         $this->fail(415, $lang['uploadwrong']);
     }
     // prepare file names
     $tempname = $this->storetemp($data);
     $filename = $this->getConf('filename');
     $filename = str_replace(array('@NS@', '@ID@', '@USER@'), array(getNS($INPUT->post->str('id')), $INPUT->post->str('id'), $_SERVER['REMOTE_USER']), $filename);
     $filename = strftime($filename);
     $filename .= '.' . $mimetypes[$type];
     $filename = cleanID($filename);
     // check ACLs
     $auth = auth_quickaclcheck($filename);
     if ($auth < AUTH_UPLOAD) {
         $this->fail(403, $lang['uploadfail']);
     }
     // do the actual saving
     $result = media_save(array('name' => $tempname, 'mime' => $type, 'ext' => $mimetypes[$type]), $filename, false, $auth, 'copy');
     if (is_array($result)) {
         $this->fail(500, $result[0]);
     }
     //Still here? We had a successful upload
     $this->clean();
     header('Content-Type: application/json');
     $json = new JSON();
     echo $json->encode(array('message' => $lang['uploadsucc'], 'id' => $result));
     $event->preventDefault();
     $event->stopPropagation();
 }
コード例 #7
0
/**
 * Returns the (known) extension and mimetype of a given filename
 *
 * @author Andreas Gohr <*****@*****.**>
 */
function mimetype($file)
{
    $ret = array(false, false);
    // return array
    $mtypes = getMimeTypes();
    // known mimetypes
    $exts = join('|', array_keys($mtypes));
    // known extensions (regexp)
    if (preg_match('#\\.(' . $exts . ')$#i', $file, $matches)) {
        $ext = strtolower($matches[1]);
    }
    if ($ext && $mtypes[$ext]) {
        $ret = array($ext, $mtypes[$ext]);
    }
    return $ret;
}
コード例 #8
0
ファイル: confutils.php プロジェクト: ngharaibeh/Methodikos
/**
 * Returns the (known) extension and mimetype of a given filename
 *
 * If $knownonly is true (the default), then only known extensions
 * are returned.
 *
 * @author Andreas Gohr <*****@*****.**>
 */
function mimetype($file, $knownonly = true)
{
    $mtypes = getMimeTypes();
    // known mimetypes
    $ext = strrpos($file, '.');
    if ($ext === false) {
        return array(false, false, false);
    }
    $ext = strtolower(substr($file, $ext + 1));
    if (!isset($mtypes[$ext])) {
        if ($knownonly) {
            return array(false, false, false);
        } else {
            return array($ext, 'application/octet-stream', true);
        }
    }
    if ($mtypes[$ext][0] == '!') {
        return array($ext, substr($mtypes[$ext], 1), true);
    } else {
        return array($ext, $mtypes[$ext], false);
    }
}
コード例 #9
0
ファイル: Files.lib.php プロジェクト: GitBeBest/sf-framwork
 function getFilePro($path, $showPre = false)
 {
     if (!file_exists($path)) {
         return $this->err->catchErr($this->getSysMsg(1001, $path));
     }
     $pre['name'] = basename($path);
     $pre['path'] = $path;
     $pre['isDir'] = is_dir($path) ? true : false;
     if ($showPre) {
         $pre['lastName'] = substr(strrchr($pre['name'], "."), 1);
         if ($pre['isDir']) {
             $pre['type'] = "文件夹";
         } else {
             include_once dirname(__FILE__) . '/mimetypes.inc.php';
             $mimeTypes = getMimeTypes();
             $pre['type'] = isset($mimeTypes[strtolower($pre['lastName'])]) ? $mimeTypes[strtolower($pre['lastName'])] : $pre['lastName'] . " 文件";
         }
         $fileSize = $pre['isDir'] ? "" : filesize($path);
         $permissions = $this->getFilePermissions(fileperms($path));
         $lastModified = date("Y-m-d H:i:s", filemtime($path));
         $pre['size'] = $fileSize;
         $pre['formatSize'] = $this->formatSize($fileSize);
         $pre['permissions'] = $permissions;
         $pre['lastModified'] = $lastModified;
     }
     return $pre;
 }
コード例 #10
0
/**
 * Handles media file uploads
 *
 * This generates an action event and delegates to _media_upload_action().
 * Action plugins are allowed to pre/postprocess the uploaded file.
 * (The triggered event is preventable.)
 *
 * Event data:
 * $data[0]     fn_tmp: the temporary file name (read from $_FILES)
 * $data[1]     fn: the file name of the uploaded file
 * $data[2]     id: the future directory id of the uploaded file
 * $data[3]     imime: the mimetype of the uploaded file
 *
 * @triggers MEDIA_UPLOAD_FINISH
 * @author Andreas Gohr <*****@*****.**>
 * @author Michael Klier <*****@*****.**>
 * @return mixed false on error, id of the new file on success
 */
function media_upload($ns, $auth)
{
    if ($auth < AUTH_UPLOAD) {
        return false;
    }
    if (!checkSecurityToken()) {
        return false;
    }
    require_once DOKU_INC . 'inc/confutils.php';
    global $lang;
    global $conf;
    // get file and id
    $id = $_POST['id'];
    $file = $_FILES['upload'];
    if (empty($id)) {
        $id = $file['name'];
    }
    // check extensions
    list($fext, $fmime) = mimetype($file['name']);
    list($iext, $imime) = mimetype($id);
    if ($fext && !$iext) {
        // no extension specified in id - read original one
        $id .= '.' . $fext;
        $imime = $fmime;
    } elseif ($fext && $fext != $iext) {
        // extension was changed, print warning
        msg(sprintf($lang['mediaextchange'], $fext, $iext));
    }
    // get filename
    $id = cleanID($ns . ':' . $id);
    $fn = mediaFN($id);
    // get filetype regexp
    $types = array_keys(getMimeTypes());
    $types = array_map(create_function('$q', 'return preg_quote($q,"/");'), $types);
    $regex = join('|', $types);
    // because a temp file was created already
    if (preg_match('/\\.(' . $regex . ')$/i', $fn)) {
        //check for overwrite
        if (@file_exists($fn) && (!$_POST['ow'] || $auth < AUTH_DELETE)) {
            msg($lang['uploadexist'], 0);
            return false;
        }
        // check for valid content
        $ok = media_contentcheck($file['tmp_name'], $imime);
        if ($ok == -1) {
            msg(sprintf($lang['uploadbadcontent'], ".{$iext}"), -1);
            return false;
        } elseif ($ok == -2) {
            msg($lang['uploadspam'], -1);
            return false;
        } elseif ($ok == -3) {
            msg($lang['uploadxss'], -1);
            return false;
        }
        // prepare event data
        $data[0] = $file['tmp_name'];
        $data[1] = $fn;
        $data[2] = $id;
        $data[3] = $imime;
        // trigger event
        return trigger_event('MEDIA_UPLOAD_FINISH', $data, '_media_upload_action', true);
    } else {
        msg($lang['uploadwrong'], -1);
    }
    return false;
}
コード例 #11
0
ファイル: fetch.php プロジェクト: rezlemic/dokuwiki-jQuery
<?php

/**
 * DokuWiki media passthrough file
 *
 * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
 * @author     Andreas Gohr <*****@*****.**>
 */
if (!defined('DOKU_INC')) {
    define('DOKU_INC', dirname(__FILE__) . '/../../');
}
define('DOKU_DISABLE_GZIP_OUTPUT', 1);
require_once DOKU_INC . 'inc/init.php';
//close session
session_write_close();
$mimetypes = getMimeTypes();
//get input
$MEDIA = stripctl(getID('media', false));
// no cleaning except control chars - maybe external
$CACHE = calc_cache($_REQUEST['cache']);
$WIDTH = (int) $_REQUEST['w'];
$HEIGHT = (int) $_REQUEST['h'];
list($EXT, $MIME, $DL) = mimetype($MEDIA, false);
if ($EXT === false) {
    $EXT = 'unknown';
    $MIME = 'application/octet-stream';
    $DL = true;
}
// check for permissions, preconditions and cache external files
list($STATUS, $STATUSMESSAGE) = checkFileStatus($MEDIA, $FILE);
// prepare data for plugin events
コード例 #12
0
ファイル: xmlrpc.php プロジェクト: ryankask/dokuwiki
 /**
  * Uploads a file to the wiki.
  *
  * Michael Klier <*****@*****.**>
  */
 function putAttachment($id, $file, $params)
 {
     $id = cleanID($id);
     global $conf;
     global $lang;
     $auth = auth_quickaclcheck(getNS($id) . ':*');
     if ($auth >= AUTH_UPLOAD) {
         if (!isset($id)) {
             return new IXR_ERROR(1, 'Filename not given.');
         }
         $ftmp = $conf['tmpdir'] . '/' . md5($id . clientIP());
         // save temporary file
         @unlink($ftmp);
         $buff = base64_decode($file);
         io_saveFile($ftmp, $buff);
         // get filename
         list($iext, $imime, $dl) = mimetype($id);
         $id = cleanID($id);
         $fn = mediaFN($id);
         // get filetype regexp
         $types = array_keys(getMimeTypes());
         $types = array_map(create_function('$q', 'return preg_quote($q,"/");'), $types);
         $regex = join('|', $types);
         // because a temp file was created already
         if (preg_match('/\\.(' . $regex . ')$/i', $fn)) {
             //check for overwrite
             $overwrite = @file_exists($fn);
             if ($overwrite && (!$params['ow'] || $auth < AUTH_DELETE)) {
                 return new IXR_ERROR(1, $lang['uploadexist'] . '1');
             }
             // check for valid content
             $ok = media_contentcheck($ftmp, $imime);
             if ($ok == -1) {
                 return new IXR_ERROR(1, sprintf($lang['uploadexist'] . '2', ".{$iext}"));
             } elseif ($ok == -2) {
                 return new IXR_ERROR(1, $lang['uploadspam']);
             } elseif ($ok == -3) {
                 return new IXR_ERROR(1, $lang['uploadxss']);
             }
             // prepare event data
             $data[0] = $ftmp;
             $data[1] = $fn;
             $data[2] = $id;
             $data[3] = $imime;
             $data[4] = $overwrite;
             // trigger event
             return trigger_event('MEDIA_UPLOAD_FINISH', $data, array($this, '_media_upload_action'), true);
         } else {
             return new IXR_ERROR(1, $lang['uploadwrong']);
         }
     } else {
         return new IXR_ERROR(1, "You don't have permissions to upload files.");
     }
 }
コード例 #13
0
ファイル: media.php プロジェクト: yjliugit/dokuwiki
/**
 * This generates an action event and delegates to _media_upload_action().
 * Action plugins are allowed to pre/postprocess the uploaded file.
 * (The triggered event is preventable.)
 *
 * Event data:
 * $data[0]     fn_tmp: the temporary file name (read from $_FILES)
 * $data[1]     fn: the file name of the uploaded file
 * $data[2]     id: the future directory id of the uploaded file
 * $data[3]     imime: the mimetype of the uploaded file
 * $data[4]     overwrite: if an existing file is going to be overwritten
 *
 * @triggers MEDIA_UPLOAD_FINISH
 */
function media_save($file, $id, $ow, $auth, $move)
{
    if ($auth < AUTH_UPLOAD) {
        return array("You don't have permissions to upload files.", -1);
    }
    if (!isset($file['mime']) || !isset($file['ext'])) {
        list($ext, $mime) = mimetype($id);
        if (!isset($file['mime'])) {
            $file['mime'] = $mime;
        }
        if (!isset($file['ext'])) {
            $file['ext'] = $ext;
        }
    }
    global $lang, $conf;
    // get filename
    $id = cleanID($id);
    $fn = mediaFN($id);
    // get filetype regexp
    $types = array_keys(getMimeTypes());
    $types = array_map(create_function('$q', 'return preg_quote($q,"/");'), $types);
    $regex = join('|', $types);
    // because a temp file was created already
    if (!preg_match('/\\.(' . $regex . ')$/i', $fn)) {
        return array($lang['uploadwrong'], -1);
    }
    //check for overwrite
    $overwrite = @file_exists($fn);
    $auth_ow = $conf['mediarevisions'] ? AUTH_UPLOAD : AUTH_DELETE;
    if ($overwrite && (!$ow || $auth < $auth_ow)) {
        return array($lang['uploadexist'], 0);
    }
    // check for valid content
    $ok = media_contentcheck($file['name'], $file['mime']);
    if ($ok == -1) {
        return array(sprintf($lang['uploadbadcontent'], '.' . $file['ext']), -1);
    } elseif ($ok == -2) {
        return array($lang['uploadspam'], -1);
    } elseif ($ok == -3) {
        return array($lang['uploadxss'], -1);
    }
    // prepare event data
    $data[0] = $file['name'];
    $data[1] = $fn;
    $data[2] = $id;
    $data[3] = $file['mime'];
    $data[4] = $overwrite;
    $data[5] = $move;
    // trigger event
    return trigger_event('MEDIA_UPLOAD_FINISH', $data, '_media_upload_action', true);
}
コード例 #14
0
ファイル: media.php プロジェクト: lorea/Hydra-dev
/**
 * Print the media upload form if permissions are correct
 *
 * @author Andreas Gohr <*****@*****.**>
 */
function media_uploadform($ns, $auth)
{
    global $lang;
    if ($auth < AUTH_UPLOAD) {
        return;
    }
    //fixme print info on missing permissions?
    // The default HTML upload form
    $form = new Doku_Form(array('id' => 'dw__upload', 'action' => DOKU_BASE . 'lib/exe/mediamanager.php', 'enctype' => 'multipart/form-data'));
    $form->addElement('<div class="upload">' . $lang['mediaupload'] . '</div>');
    $form->addElement(formSecurityToken());
    $form->addHidden('ns', hsc($ns));
    $form->addElement(form_makeOpenTag('p'));
    $form->addElement(form_makeFileField('upload', $lang['txt_upload'] . ':', 'upload__file'));
    $form->addElement(form_makeCloseTag('p'));
    $form->addElement(form_makeOpenTag('p'));
    $form->addElement(form_makeTextField('id', '', $lang['txt_filename'] . ':', 'upload__name'));
    $form->addElement(form_makeButton('submit', '', $lang['btn_upload']));
    $form->addElement(form_makeCloseTag('p'));
    if ($auth >= AUTH_DELETE) {
        $form->addElement(form_makeOpenTag('p'));
        $form->addElement(form_makeCheckboxField('ow', 1, $lang['txt_overwrt'], 'dw__ow', 'check'));
        $form->addElement(form_makeCloseTag('p'));
    }
    html_form('upload', $form);
    // prepare flashvars for multiupload
    $opt = array('L_gridname' => $lang['mu_gridname'], 'L_gridsize' => $lang['mu_gridsize'], 'L_gridstat' => $lang['mu_gridstat'], 'L_namespace' => $lang['mu_namespace'], 'L_overwrite' => $lang['txt_overwrt'], 'L_browse' => $lang['mu_browse'], 'L_upload' => $lang['btn_upload'], 'L_toobig' => $lang['mu_toobig'], 'L_ready' => $lang['mu_ready'], 'L_done' => $lang['mu_done'], 'L_fail' => $lang['mu_fail'], 'L_authfail' => $lang['mu_authfail'], 'L_progress' => $lang['mu_progress'], 'L_filetypes' => $lang['mu_filetypes'], 'L_info' => $lang['mu_info'], 'L_lasterr' => $lang['mu_lasterr'], 'O_ns' => ":{$ns}", 'O_backend' => 'mediamanager.php?' . session_name() . '=' . session_id(), 'O_maxsize' => php_to_byte(ini_get('upload_max_filesize')), 'O_extensions' => join('|', array_keys(getMimeTypes())), 'O_overwrite' => $auth >= AUTH_DELETE, 'O_sectok' => getSecurityToken(), 'O_authtok' => auth_createToken());
    $var = buildURLparams($opt);
    // output the flash uploader
    ?>
        <div id="dw__flashupload" style="display:none">
        <div class="upload"><?php 
    echo $lang['mu_intro'];
    ?>
</div>
        <?php 
    echo html_flashobject('multipleUpload.swf', '500', '190', null, $opt);
    ?>
        </div>
        <?php 
}
コード例 #15
0
/**
 * Prints classes for file download links
 *
 * @author Andreas Gohr <*****@*****.**>
 */
function css_filetypes()
{
    // default style
    echo 'a.mediafile {';
    echo ' background: transparent url(' . DOKU_BASE . 'lib/images/fileicons/file.png) 0px 1px no-repeat;';
    echo ' padding-left: 18px;';
    echo ' padding-bottom: 1px;';
    echo '}';
    // additional styles when icon available
    $mimes = getMimeTypes();
    foreach (array_keys($mimes) as $mime) {
        $class = preg_replace('/[^_\\-a-z0-9]+/i', '_', $mime);
        if (@file_exists(DOKU_INC . 'lib/images/fileicons/' . $mime . '.png')) {
            echo "a.mf_{$class} {";
            echo '  background-image: url(' . DOKU_BASE . 'lib/images/fileicons/' . $mime . '.png)';
            echo '}';
        } elseif (@file_exists(DOKU_INC . 'lib/images/fileicons/' . $mime . '.gif')) {
            echo "a.mf_{$class} {";
            echo '  background-image: url(' . DOKU_BASE . 'lib/images/fileicons/' . $mime . '.gif)';
            echo '}';
        }
    }
}
コード例 #16
0
function uploaldValiddate($filename, $type, array $extensiones)
{
    $filename = (string) $filename;
    $mimetypes = getMimeTypes($extensiones);
    $extension = pathinfo($filename, PATHINFO_EXTENSION);
    $return = false;
    if (array_key_exists($extension, $mimetypes) && array_search($type, $mimetypes[$extension]) !== false) {
        $return = true;
    }
    return $return;
}
コード例 #17
0
/**
 * Determines the mime type of a file
 * @param $filename the system filename
 * @return string
 */
function getMimeType($filename)
{
    if (function_exists('mime_content_type')) {
        $mime = mime_content_type($filename);
    }
    if (!$mime && function_exists('finfo_file')) {
        $finfo = finfo_open(FILEINFO_MIME_TYPE);
        $type = finfo_file($finfo, $filename);
        finfo_close($finfo);
        $mime = $type;
    }
    if (!$mime && strtoupper(substr(PHP_OS, 0, 3)) !== 'WIN') {
        // linux
        $type = exec('file -b -i ' . escapeshellarg($filename), $foo, $returnCode);
        if ($returnCode === 0 && $type) {
            $type = explode(';', $type);
            $mime = $type[0];
        }
    }
    if (!$mime || preg_match('/^text\\//', $mime)) {
        $ext = strtolower(array_pop(explode('.', $filename)));
        $mime_types = getMimeTypes();
        if (array_key_exists($ext, $mime_types)) {
            $mime = $mime_types[$ext];
        }
    }
    return $mime;
}
コード例 #18
0
ファイル: UploadHandler.php プロジェクト: hshoghi/cms
 /**
  * @param  string  $mime
  * @return string
  */
 public function getExtByMime($mime)
 {
     return array_search($mime, getMimeTypes());
 }