aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrion Vibber <brion@users.mediawiki.org>2004-04-10 11:19:33 +0000
committerBrion Vibber <brion@users.mediawiki.org>2004-04-10 11:19:33 +0000
commitb5946f6ee9e1a8374312b91e0d3fd277bcf76156 (patch)
tree036a90e80e3738fa2e11f796d367e2e1fe51ca79
parentf3eaad894c30343ce247b6d0b6e2f0ef6ada52b1 (diff)
downloadmediawikicore-b5946f6ee9e1a8374312b91e0d3fd277bcf76156.tar.gz
mediawikicore-b5946f6ee9e1a8374312b91e0d3fd277bcf76156.zip
Cleanup on Metadata (indentation, escaping of output). Put title attributes
on the Creative Commons and Dublin Core links so they can be identified by humans in Mozilla's navigation bar. Add a <link rel='copyright'> as well if $wgRightsPage or $wgRightsUrl is set. Fix metadata links for MonoBook. Disable Smarty skins.
Notes
Notes: http://mediawiki.org/wiki/Special:Code/MediaWiki/3100
-rw-r--r--includes/Metadata.php365
-rw-r--r--includes/OutputPage.php28
-rw-r--r--includes/Skin.php55
-rw-r--r--includes/SkinPHPTal.php20
4 files changed, 247 insertions, 221 deletions
diff --git a/includes/Metadata.php b/includes/Metadata.php
index 2e396faefb26..ebc7164dc204 100644
--- a/includes/Metadata.php
+++ b/includes/Metadata.php
@@ -20,65 +20,67 @@
define("RDF_TYPE_PREFS", "application/rdf+xml,text/xml;q=0.7,application/xml;q=0.5,text/rdf;q=0.1");
function wfDublinCoreRdf($article) {
-
- $url = dcReallyFullUrl($article->mTitle);
-
- if (rdfSetup()) {
- dcPrologue($url);
- dcBasics($article);
- dcEpilogue();
- }
+
+ $url = dcReallyFullUrl($article->mTitle);
+
+ if (rdfSetup()) {
+ dcPrologue($url);
+ dcBasics($article);
+ dcEpilogue();
+ }
}
function wfCreativeCommonsRdf($article) {
-
- if (rdfSetup()) {
- global $wgRightsUrl;
-
- $url = dcReallyFullUrl($article->mTitle);
-
- ccPrologue();
- ccSubPrologue('Work', $url);
- dcBasics($article);
- if (isset($wgRightsUrl)) {
- print " <cc:license rdf:resource=\"$wgRightsUrl\" />\n";
- }
-
- ccSubEpilogue('Work');
-
- if (isset($wgRightsUrl)) {
- $terms = ccGetTerms($wgRightsUrl);
- if ($terms) {
- ccSubPrologue('License', $wgRightsUrl);
- ccLicense($terms);
- ccSubEpilogue('License');
- }
- }
- }
-
- ccEpilogue();
+
+ if (rdfSetup()) {
+ global $wgRightsUrl;
+
+ $url = dcReallyFullUrl($article->mTitle);
+
+ ccPrologue();
+ ccSubPrologue('Work', $url);
+ dcBasics($article);
+ if (isset($wgRightsUrl)) {
+ $url = htmlspecialchars( $wgRightsUrl );
+ print " <cc:license rdf:resource=\"$url\" />\n";
+ }
+
+ ccSubEpilogue('Work');
+
+ if (isset($wgRightsUrl)) {
+ $terms = ccGetTerms($wgRightsUrl);
+ if ($terms) {
+ ccSubPrologue('License', $wgRightsUrl);
+ ccLicense($terms);
+ ccSubEpilogue('License');
+ }
+ }
+ }
+
+ ccEpilogue();
}
/* private */ function rdfSetup() {
- global $wgOut, $wgRdfMimeType, $_SERVER;
-
- $rdftype = wfNegotiateType(wfAcceptToPrefs($_SERVER['HTTP_ACCEPT']), wfAcceptToPrefs(RDF_TYPE_PREFS));
-
- if (!$rdftype) {
- wfHttpError(406, "Not Acceptable", wfMsg("notacceptable"));
- return false;
- } else {
- $wgOut->disable();
- header( "Content-type: {$rdftype}" );
- $wgOut->sendCacheControl();
- return true;
- }
+ global $wgOut, $wgRdfMimeType, $_SERVER;
+
+ $rdftype = wfNegotiateType(wfAcceptToPrefs($_SERVER['HTTP_ACCEPT']), wfAcceptToPrefs(RDF_TYPE_PREFS));
+
+ if (!$rdftype) {
+ wfHttpError(406, "Not Acceptable", wfMsg("notacceptable"));
+ return false;
+ } else {
+ $wgOut->disable();
+ header( "Content-type: {$rdftype}" );
+ $wgOut->sendCacheControl();
+ return true;
+ }
}
/* private */ function dcPrologue($url) {
- global $wgOutputEncoding;
-
- print "<?xml version=\"1.0\" encoding=\"{$wgOutputEncoding}\" ?>
+ global $wgOutputEncoding;
+
+ $url = htmlspecialchars( $url );
+ print "<" . "?xml version=\"1.0\" encoding=\"{$wgOutputEncoding}\" ?" . ">
<!DOCTYPE rdf:RDF PUBLIC \"-//DUBLIN CORE//DCMES DTD 2002/07/31//EN\" \"http://dublincore.org/documents/2002/07/31/dcmes-xml/dcmes-xml-dtd.dtd\">
@@ -89,37 +91,37 @@ function wfCreativeCommonsRdf($article) {
}
/* private */ function dcEpilogue() {
- print "
+ print "
</rdf:Description>
</rdf:RDF>
";
}
/* private */ function dcBasics($article) {
- global $wgLanguageCode, $wgSitename;
-
- dcElement('title', $article->mTitle->getText());
- dcPageOrString('publisher', wfMsg('aboutpage'), $wgSitename);
- dcElement('language', $wgLanguageCode);
- dcElement('type', 'Text');
- dcElement('format', 'text/html');
- dcElement('identifier', dcReallyFullUrl($article->mTitle));
- dcElement('date', dcDate($article->getTimestamp()));
- dcPerson('creator', $article->getUser());
-
- $contributors = dcContributors($article->mTitle);
-
- foreach ($contributors as $cid) {
- dcPerson('contributor', $cid);
- }
-
- dcRights($article);
+ global $wgLanguageCode, $wgSitename;
+
+ dcElement('title', $article->mTitle->getText());
+ dcPageOrString('publisher', wfMsg('aboutpage'), $wgSitename);
+ dcElement('language', $wgLanguageCode);
+ dcElement('type', 'Text');
+ dcElement('format', 'text/html');
+ dcElement('identifier', dcReallyFullUrl($article->mTitle));
+ dcElement('date', dcDate($article->getTimestamp()));
+ dcPerson('creator', $article->getUser());
+
+ $contributors = dcContributors($article->mTitle);
+
+ foreach ($contributors as $cid) {
+ dcPerson('contributor', $cid);
+ }
+
+ dcRights($article);
}
/* private */ function ccPrologue() {
- global $wgOutputEncoding;
-
- echo "<?xml version='1.0' encoding='{$wgOutputEncoding}' ?>
+ global $wgOutputEncoding;
+
+ echo "<" . "?xml version='1.0' encoding='{$wgOutputEncoding}' ?" . ">
<rdf:RDF xmlns:cc=\"http://web.resource.org/cc/\"
xmlns:dc=\"http://purl.org/dc/elements/1.1/\"
@@ -128,162 +130,165 @@ function wfCreativeCommonsRdf($article) {
}
/* private */ function ccSubPrologue($type, $url) {
- echo " <cc:{$type} rdf:about=\"{$url}\">\n";
+ $url = htmlspecialchars( $url );
+ echo " <cc:{$type} rdf:about=\"{$url}\">\n";
}
/* private */ function ccSubEpilogue($type) {
- echo " </cc:{$type}>\n";
+ echo " </cc:{$type}>\n";
}
/* private */ function ccLicense($terms) {
-
- foreach ($terms as $term) {
- switch ($term) {
- case 're':
- ccTerm('permits', "Reproduction"); break;
- case 'di':
- ccTerm('permits', "Distribution"); break;
- case 'de':
- ccTerm('permits', "DerivativeWorks"); break;
- case 'nc':
- ccTerm('prohibits', "CommercialUse"); break;
- case 'no':
- ccTerm('requires', "Notice"); break;
- case 'by':
- ccTerm('requires', "Attribution"); break;
- case 'sa':
- ccTerm('requires', "ShareAlike"); break;
- case 'sc':
- ccTerm('requires', "SourceCode"); break;
- }
- }
+
+ foreach ($terms as $term) {
+ switch ($term) {
+ case 're':
+ ccTerm('permits', "Reproduction"); break;
+ case 'di':
+ ccTerm('permits', "Distribution"); break;
+ case 'de':
+ ccTerm('permits', "DerivativeWorks"); break;
+ case 'nc':
+ ccTerm('prohibits', "CommercialUse"); break;
+ case 'no':
+ ccTerm('requires', "Notice"); break;
+ case 'by':
+ ccTerm('requires', "Attribution"); break;
+ case 'sa':
+ ccTerm('requires', "ShareAlike"); break;
+ case 'sc':
+ ccTerm('requires', "SourceCode"); break;
+ }
+ }
}
/* private */ function ccTerm($term, $name) {
- print " <cc:{$term} rdf:resource=\"http://web.resource.org/cc/{$name}\" />\n";
+ print " <cc:{$term} rdf:resource=\"http://web.resource.org/cc/{$name}\" />\n";
}
/* private */ function ccEpilogue() {
- echo "</rdf:RDF>\n";
+ echo "</rdf:RDF>\n";
}
/* private */ function dcElement($name, $value) {
- print " <dc:{$name}>{$value}</dc:{$name}>\n";
+ $value = htmlspecialchars( $value );
+ print " <dc:{$name}>{$value}</dc:{$name}>\n";
}
/* private */ function dcDate($timestamp) {
- return substr($timestamp, 0, 4) . "-"
- . substr($timestamp, 4, 2) . "-"
- . substr($timestamp, 6, 2);
+ return substr($timestamp, 0, 4) . "-"
+ . substr($timestamp, 4, 2) . "-"
+ . substr($timestamp, 6, 2);
}
/* private */ function dcReallyFullUrl($title) {
- $title->getFullURL();
+ return $title->getFullURL();
}
/* private */ function dcPageOrString($name, $page, $str) {
- $nt = Title::newFromText($page);
-
- if (!$nt || $nt->getArticleID() == 0) {
- dcElement($name, $str);
- } else {
- dcPage($name, $nt);
- }
+ $nt = Title::newFromText($page);
+
+ if (!$nt || $nt->getArticleID() == 0) {
+ dcElement($name, $str);
+ } else {
+ dcPage($name, $nt);
+ }
}
/* private */ function dcPage($name, $title) {
- dcUrl($name, dcReallyFullUrl($title));
+ dcUrl($name, dcReallyFullUrl($title));
}
/* private */ function dcUrl($name, $url) {
- print " <dc:{$name} rdf:resource=\"{$url}\" />\n";
+ $url = htmlspecialchars( $url );
+ print " <dc:{$name} rdf:resource=\"{$url}\" />\n";
}
/* private */ function dcPerson($name, $id) {
- global $wgLang;
-
- if ($id == 0) {
- dcElement($name, wfMsg("anonymous"));
- } else {
- $user_name = User::whoIs($id);
- dcPageOrString($name, $wgLang->getNsText(NS_USER) . ":" . $user_name, $user_name);
- }
+ global $wgLang;
+
+ if ($id == 0) {
+ dcElement($name, wfMsg("anonymous"));
+ } else {
+ $user_name = User::whoIs($id);
+ dcPageOrString($name, $wgLang->getNsText(NS_USER) . ":" . $user_name, $user_name);
+ }
}
/* private */ function dcContributors($title) {
-
- $contribs = array();
-
- $res = wfQuery("SELECT DISTINCT old_user" .
- " FROM old " .
- " WHERE old_namespace = " . $title->getNamespace() .
- " AND old_title = '" . $title->getDBkey() . "'", DB_READ);
-
- while ( $line = wfFetchObject( $res ) ) {
- $contribs[] = $line->old_user;
- }
-
- return $contribs;
+
+ $contribs = array();
+
+ $res = wfQuery("SELECT DISTINCT old_user" .
+ " FROM old " .
+ " WHERE old_namespace = " . $title->getNamespace() .
+ " AND old_title = '" . $title->getDBkey() . "'", DB_READ);
+
+ while ( $line = wfFetchObject( $res ) ) {
+ $contribs[] = $line->old_user;
+ }
+
+ return $contribs;
}
/* Takes an arg, for future enhancement with different rights for
different pages. */
/* private */ function dcRights($article) {
-
- global $wgRightsPage, $wgRightsUrl, $wgRightsText;
-
- if (isset($wgRightsPage) &&
- ($nt = Title::newFromText($wgRightsPage))
- && ($nt->getArticleID() != 0)) {
- dcPage('rights', $nt);
- } else if (isset($wgRightsUrl)) {
- dcUrl('rights', $wgRightsUrl);
- } else if (isset($wgRightsText)) {
- dcElement('rights', $wgRightsText);
- }
+
+ global $wgRightsPage, $wgRightsUrl, $wgRightsText;
+
+ if (isset($wgRightsPage) &&
+ ($nt = Title::newFromText($wgRightsPage))
+ && ($nt->getArticleID() != 0)) {
+ dcPage('rights', $nt);
+ } else if (isset($wgRightsUrl)) {
+ dcUrl('rights', $wgRightsUrl);
+ } else if (isset($wgRightsText)) {
+ dcElement('rights', $wgRightsText);
+ }
}
/* private */ function ccGetTerms($url) {
- global $wgLicenseTerms;
-
- if (isset($wgLicenseTerms)) {
- return $wgLicenseTerms;
- } else {
- $known = getKnownLicenses();
- return $known[$url];
- }
+ global $wgLicenseTerms;
+
+ if (isset($wgLicenseTerms)) {
+ return $wgLicenseTerms;
+ } else {
+ $known = getKnownLicenses();
+ return $known[$url];
+ }
}
/* private */ function getKnownLicenses() {
-
- $ccLicenses = array('by', 'by-nd', 'by-nd-nc', 'by-nc',
- 'by-nc-sa', 'by-sa', 'nd', 'nd-nc',
- 'nc', 'nc-sa', 'sa');
-
- $knownLicenses = array();
-
- foreach ($ccLicenses as $license) {
- $lurl = "http://creativecommons.org/licenses/{$license}/1.0/";
- $knownLicenses[$lurl] = explode('-', $license);
- $knownLicenses[$lurl][] = 're';
- $knownLicenses[$lurl][] = 'di';
- $knownLicenses[$lurl][] = 'no';
- if (!in_array('nd', $knownLicenses[$lurl])) {
- $knownLicenses[$lurl][] = 'de';
- }
- }
-
- /* Handle the GPL and LGPL, too. */
-
- $knownLicenses["http://creativecommons.org/licenses/GPL/2.0/"] =
- array('de', 're', 'di', 'no', 'sa', 'sc');
- $knownLicenses["http://creativecommons.org/licenses/LGPL/2.1/"] =
- array('de', 're', 'di', 'no', 'sa', 'sc');
- $knownLicenses["http://www.gnu.org/copyleft/fdl.html"] =
- array('de', 're', 'di', 'no', 'sa', 'sc');
-
- return $knownLicenses;
+
+ $ccLicenses = array('by', 'by-nd', 'by-nd-nc', 'by-nc',
+ 'by-nc-sa', 'by-sa', 'nd', 'nd-nc',
+ 'nc', 'nc-sa', 'sa');
+
+ $knownLicenses = array();
+
+ foreach ($ccLicenses as $license) {
+ $lurl = "http://creativecommons.org/licenses/{$license}/1.0/";
+ $knownLicenses[$lurl] = explode('-', $license);
+ $knownLicenses[$lurl][] = 're';
+ $knownLicenses[$lurl][] = 'di';
+ $knownLicenses[$lurl][] = 'no';
+ if (!in_array('nd', $knownLicenses[$lurl])) {
+ $knownLicenses[$lurl][] = 'de';
+ }
+ }
+
+ /* Handle the GPL and LGPL, too. */
+
+ $knownLicenses["http://creativecommons.org/licenses/GPL/2.0/"] =
+ array('de', 're', 'di', 'no', 'sa', 'sc');
+ $knownLicenses["http://creativecommons.org/licenses/LGPL/2.1/"] =
+ array('de', 're', 'di', 'no', 'sa', 'sc');
+ $knownLicenses["http://www.gnu.org/copyleft/fdl.html"] =
+ array('de', 're', 'di', 'no', 'sa', 'sc');
+
+ return $knownLicenses;
}
?>
diff --git a/includes/OutputPage.php b/includes/OutputPage.php
index 89ac0a9ab51a..a1a96aad1840 100644
--- a/includes/OutputPage.php
+++ b/includes/OutputPage.php
@@ -44,11 +44,17 @@ class OutputPage {
# To add an http-equiv meta tag, precede the name with "http:"
function addMeta( $name, $val ) { array_push( $this->mMetatags, array( $name, $val ) ); }
function addKeyword( $text ) { array_push( $this->mKeywords, $text ); }
- function addLink( $rel, $rev, $target, $type="", $media="" ) { array_push( $this->mLinktags, array( $rel, $rev, $target, $type, $media ) ); }
+
+ function addLink( $linkarr ) {
+ # $linkarr should be an associative array of attributes. We'll escape on output.
+ array_push( $this->mLinktags, $linkarr );
+ }
- function addMetadataLink( $type, $target ) {
+ function addMetadataLink( $linkarr ) {
+ # note: buggy CC software only reads first "meta" link
static $haveMeta = false;
- $this->addLink( ($haveMeta) ? "alternate meta" : "meta", "", $target, $type );
+ $linkarr["rel"] = ($haveMeta) ? "alternate meta" : "meta";
+ $this->addLink( $linkarr );
$haveMeta = true;
}
@@ -621,7 +627,7 @@ class OutputPage {
}
function getHeadLinks() {
- global $wgRequest;
+ global $wgRequest, $wgStyleSheetPath;
$ret = "";
foreach ( $this->mMetatags as $tag ) {
if ( 0 == strcasecmp( "http:", substr( $tag[0], 0, 5 ) ) ) {
@@ -641,17 +647,19 @@ class OutputPage {
implode( ",", $this->mKeywords ) . "\" />\n";
}
foreach ( $this->mLinktags as $tag ) {
- $ret .= "<link ";
- if ( "" != $tag[0] ) { $ret .= "rel=\"{$tag[0]}\" "; }
- if ( "" != $tag[1] ) { $ret .= "rev=\"{$tag[1]}\" "; }
- if ( !empty( $tag[3] ) ) { $ret .= "type=\"{$tag[3]}\" "; }
- if ( !empty( $tag[4] ) ) { $ret .= "media=\"{$tag[4]}\" "; }
- $ret .= "href=\"{$tag[2]}\" />\n";
+ $ret .= "<link";
+ foreach( $tag as $attr => $val ) {
+ $ret .= " $attr=\"" . htmlspecialchars( $val ) . "\"";
+ }
+ $ret .= " />\n";
}
if( $this->isSyndicated() ) {
$link = $wgRequest->escapeAppendQuery( "feed=rss" );
$ret .= "<link rel='alternate' type='application/rss+xml' title='RSS' href='$link' />\n";
}
+ # FIXME: get these working
+ # $fix = htmlspecialchars( $wgStyleSheetPath . "/ie-png-fix.js" );
+ # $ret .= "<!--[if gte IE 5.5000]><script type='text/javascript' src='$fix'></script><![endif]-->";
return $ret;
}
}
diff --git a/includes/Skin.php b/includes/Skin.php
index 20b98b7f6231..7c5b78eea95d 100644
--- a/includes/Skin.php
+++ b/includes/Skin.php
@@ -13,10 +13,6 @@ include_once( "Feed.php" );
'nostalgia' => "Nostalgia",
'cologneblue' => "CologneBlue"
);
-if( $wgUseSmarty ) {
- $wgValidSkinNames['smarty'] = "Smarty";
- $wgValidSkinNames['montparnasse'] = "Montparnasse";
-}
if( $wgUsePHPTal ) {
#$wgValidSkinNames[] = "PHPTal";
#$wgValidSkinNames['davinci'] = "DaVinci";
@@ -97,25 +93,47 @@ class Skin {
$fname = "Skin::initPage";
wfProfileIn( $fname );
- $out->addLink( "shortcut icon", "", "/favicon.ico" );
-
- $this->addMetadataLinks($out);
+ $out->addLink( array( "rel" => "shortcut icon", "href" => "/favicon.ico" ) );
+
+ $this->addMetadataLinks($out);
wfProfileOut( $fname );
}
- function addMetadataLinks( &$out ) {
- global $wgTitle, $wgEnableDublinCoreRdf, $wgEnableCreativeCommonsRdf, $wgRdfMimeType, $action;
-
- if ($action == 'view') {
- # note: buggy CC software only reads first "meta" link
- if ($wgEnableCreativeCommonsRdf) {
- $out->addMetadataLink('application/rdf+xml', wfLocalUrl($wgTitle->getPrefixedURL(), "action=creativecommons"));
+ function addMetadataLinks( &$out ) {
+ global $wgTitle, $wgEnableDublinCoreRdf, $wgEnableCreativeCommonsRdf, $wgRdfMimeType, $action;
+ global $wgRightsPage, $wgRightsUrl;
+
+ if( $out->isArticleRelated() ) {
+ # note: buggy CC software only reads first "meta" link
+ if( $wgEnableCreativeCommonsRdf ) {
+ $out->addMetadataLink( array(
+ 'title' => 'Creative Commons',
+ 'type' => 'application/rdf+xml',
+ 'href' => $wgTitle->getLocalURL( "action=creativecommons") ) );
+ }
+ if( $wgEnableDublinCoreRdf ) {
+ $out->addMetadataLink( array(
+ 'title' => 'Dublin Core',
+ 'type' => 'application/rdf+xml',
+ 'href' => $wgTitle->getLocalURL( "action=dublincore" ) ) );
+ }
+ }
+ $copyright = "";
+ if( $wgRightsPage ) {
+ $copy = Title::newFromText( $wgRightsPage );
+ if( $copy ) {
+ $copyright = $copy->getLocalURL();
+ }
}
- if ($wgEnableDublinCoreRdf) {
- $out->addMetadataLink('application/rdf+xml', wfLocalUrl($wgTitle->getPrefixedURL(), "action=dublincore"));
+ if( !$copyright && $wgRightsUrl ) {
+ $copyright = $wgRightsUrl;
+ }
+ if( $copyright ) {
+ $out->addLink( array(
+ "rel" => "copyright",
+ "href" => $copyright ) );
}
- }
}
function outputPage( &$out ) {
@@ -2501,9 +2519,6 @@ include_once( "SkinStandard.php" );
include_once( "SkinNostalgia.php" );
include_once( "SkinCologneBlue.php" );
-if( $wgUseSmarty ) {
- include_once( "SkinSmarty.php" );
-}
if( $wgUsePHPTal ) {
include_once( "SkinPHPTal.php" );
}
diff --git a/includes/SkinPHPTal.php b/includes/SkinPHPTal.php
index 4bc016125b14..c85ee325e8d2 100644
--- a/includes/SkinPHPTal.php
+++ b/includes/SkinPHPTal.php
@@ -54,7 +54,8 @@
class SkinPHPTal extends Skin {
var $template;
- function initPage() {
+ function initPage( &$out ) {
+ parent::initPage( $out );
$this->skinname = "davinci";
$this->template = "xhtml_slim";
}
@@ -71,7 +72,7 @@
$this->titletxt = $wgTitle->getPrefixedText();
- $this->initPage();
+ $this->initPage( $out );
$tpl = new PHPTAL($this->template . '.pt', 'templates');
#if ( $wgUseDatabaseMessages ) { // uncomment this to fall back to GetText
@@ -403,26 +404,23 @@
}
class SkinDaVinci extends SkinPHPTal {
- function initPage() {
- SkinPHPTal::initPage();
+ function initPage( &$out ) {
+ SkinPHPTal::initPage( $out );
$this->skinname = "davinci";
- $this->template = "xhtml_slim";
}
}
class SkinMono extends SkinPHPTal {
- function initPage() {
- SkinPHPTal::initPage();
+ function initPage( &$out ) {
+ SkinPHPTal::initPage( $out );
$this->skinname = "mono";
- $this->template = "xhtml_slim";
}
}
class SkinMonoBook extends SkinPHPTal {
- function initPage() {
- SkinPHPTal::initPage();
+ function initPage( &$out ) {
+ SkinPHPTal::initPage( $out );
$this->skinname = "monobook";
- $this->template = "xhtml_slim";
}
}