Çoklu Dil Sınıfı

Web Sitenize birden fazla dil seçeneği ekleyerek bu sınıfı kullanabilirsiniz.

PHP
63 lines
<?php
class cokluDil {
var $orjinal;
var $dil;
var $cevir;
var $sonid;
var $donustur;
var $dizi;
function baslat() {
$this->sonid = 0;
}
function AddDir($dizi, $dil) {
$this->dizi[$dil] = $dizi;
}
function Dir($dil) {
$dizi = $this->dizi[$dil];
return $dizi;
}
function donusturmeEkle($donustur,$dil) {
$this->donustur[$dil] = $donustur;
}
function donustur($dil) {
header("Content-Type: text/html; charset=" . $this->donustur[$dil] . "");
}
function ceviriEkle($orjinal,$dil,$cevir) {
if ($this->sonid >= 0) {
$id = ($this->sonid + 1);
}else{
$id = 0;
}
$this->orjinal[$id] = $orjinal;
$this->dil[$id] = $dil;
$this->cevir[$id] = $cevir;
$this->sonid = $id;
}
function cevir($orjinal,$dil) {
$sonid = $this->sonid;
$num = 1;
while($num <= $sonid) {
if ($this->dil[$num] == $dil && $this->orjinal[$num] == $orjinal) {
$result = $this->cevir[$num];
}
$num = $num + 1;
}
return $result;
}
}
$dil = new cokluDil;
$dil->baslat();
$dil->donusturmeEkle("iso-8859-9","tr");
$dil->donusturmeEkle("ISO-8859-1","en");
$dil->donustur("tr");
$dil->ceviriEkle("name","en","Name");
$dil->ceviriEkle("name","tr","İsim");
$dil->ceviriEkle("city","en","City");
$dil->ceviriEkle("city","tr","Şehir");
$dil->ceviriEkle("title","en","Title");
$dil->ceviriEkle("title","tr","Başlık");
print $dil->cevir("name","tr")."<br>";
print $dil->cevir("title","en")."<br>";
print $dil->cevir("city","tr")."<br>";
?>
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Çıktısı

Markdown
3 lines
İsim
Title
Şehir
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

 

Menü ve Alt Menü Oluşturma Sınıfları

PHP
113 lines
<?php
class altmenu {
var $adresler;
var $isim;
var $dizi;
var $id;
function olustur($id){
$this->dizi=0;
$this->id=$id;
}
function ekle($url, $desp){
$this->adresler[$this->dizi]=$url;
$this->isim[$this->dizi]=$desp;
$this->dizi++;
}
function acik(){
$i=0;
echo '<table width="15%" border="0" align="center">';
while($i<=$this->dizi-1) {
if ($i==0){
echo '<tr><th align="center" bgcolor="#34ABC0"><font color="White">';
echo $this->isim[0];
echo '</font></th></tr>';
}else{
echo '<tr><td align="center"><font size="-1">';
echo '<a href="'.$this->adresler[$i].'">'.$this->isim[$i].'</a>';
echo '</font></td></tr>';
}
$i++;
}
echo '</table>';
}
function kapat(){
echo '<table width="15%" border="0" align="center">';
echo '<tr><th align="center" bgcolor="#34ABC0"><font color="White">';
echo '<a href="?durum=acik&id='.$this->id.'">'.$this->isim[0].'</a>';
echo '</font></th></tr>';
echo '</table>';
}
}
class menu{
var $altmenuler;
var $dizi;
var $id;
function olustur(){
$this->dizi=0;
$this->id=2;
}
function ekle($altmenu){
$this->altmenuler[$this->dizi]=new altmenu;
$this->altmenuler[$this->dizi]=$altmenu;
$this->dizi++;
}
function goster(){
$i=0;
$gec = new altmenu;
while ($i<$this->dizi) {
$gec=$this->altmenuler[$i];
if ($gec->id==(string)$this->id) {
$gec->acik();
}else{
$gec->kapat();
}
$i++;
}
}
}
$mm_1=new altmenu;
$mm_1->olustur('1');
$mm_1->ekle('','Menü1');
$mm_1->ekle('#site=1','Alt Menü1');
$mm_1->ekle('#site=2','Alt Menü2');
$mm_1->ekle('#site=3','Alt Menü3');
$mm_1->ekle('#site=4','Alt Menü4');
$mm_2=new altmenu;
$mm_2->olustur('2');
$mm_2->ekle('','Menü2');
$mm_2->ekle('#site=5','Alt Menü1');
$mm_2->ekle('#site=6','Alt Menü2');
$mm_2->ekle('#site=7','Alt Menü3');
$mm_2->ekle('#site=8','Alt Menü4');
$mm_3=new altmenu;
$mm_3->olustur('3');
$mm_3->ekle('','Menü3');
$mm_3->ekle('#site=9','Alt Menü1');
$mm_3->ekle('#site=10','Alt Menü2');
$mm_3->ekle('#site=11','Alt Menü3');
$mm_3->ekle('#site=12','Alt Menü4');
$mm_4=new altmenu;
$mm_4->olustur('4');
$mm_4->ekle('','Menü4');
$mm_4->ekle('#site=13','Alt Menü1');
$mm_4->ekle('#site=14','Alt Menü2');
$mm_4->ekle('#site=15','Alt Menü3');
$mm_4->ekle('#site=16','Alt Menü4');
$m_1=new menu;
$m_1->olustur();
$m_1->ekle($mm_1);
$m_1->ekle($mm_2);
$m_1->ekle($mm_3);
$m_1->ekle($mm_4);
extract($_GET);
if(!isset($durum)){
$m_1->goster();
}else{
if ($durum=='acik') {
$m_1->id=$id;
$m_1->goster();
}else{
$m_1->goster();
}
}
?>
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Çıktısı

JavaScript
32 lines
<table width="15%" border="0" align="center">
<tr>
<th align="center" bgcolor="#34ABC0"><font color="White"><a href="?durum=acik&id=1">Menü1</a></font></th>
</tr>
</table>
<table width="15%" border="0" align="center">
<tr>
<th align="center" bgcolor="#34ABC0"><font color="White">Menü2</font></th>
</tr>
<tr>
<td align="center" ><font size="-1"><a href="#site=5">Alt Menü1</a></font></td>
</tr>
<tr>
<td align="center" ><font size="-1"><a href="#site=6">Alt Menü2</a></font></td>
</tr>
<tr>
<td align="center" ><font size="-1"><a href="#site=7">Alt Menü3</a></font></td>
</tr>
<tr>
<td align="center" ><font size="-1"><a href="#site=8">Alt Menü4</a></font></td>
</tr>
</table>
<table width="15%" border="0" align="center">
<tr>
<th align="center" bgcolor="#34ABC0"><font color="White"><a href="?durum=acik&id=3">Menü3</a></font></th>
</tr>
</table>
<table width="15%" border="0" align="center">
<tr>
<th align="center" bgcolor="#34ABC0"><font color="White"><a href="?durum=acik&id=4">Menü4</a></font></th>
</tr>
</table>
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

 

Rastgele Sonsuz Basamaklı Sayı Oluşturma

PHP
22 lines
<?php
class rastgeleUzunSayi{//sonsuz basamaklı rastgele sayı üretebilir
function olustur($basamaksayisi){
$sifirla=null;
$sayi=null;
$rastgelesayi = 0;
$basamak = 0;
while($basamak < $basamaksayisi){
$sayi .= rand(0,9);
$basamak++;
}
if(substr($sayi , -30,1) == 0){//0 ile başlamasın
return rand(1,9).substr($sayi,1,29);
}else{
return $sayi;
}
}
}
$g=new rastgeleUzunSayi;
echo "<b>";
echo $sayi = $g->olustur(30);//30 basamaklı sayı üret
?>
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Çıktısı

Markdown
1 lines
298580541031535769480338548338
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

 

Renkli Bloklar Oluşturma

PHP
60 lines
<?php
class Bloklar{
var $renk;
var $tarih;
var $yazi;
function renksec($renk){
$this->renk = $renk;
}
function tarihsec($tarih){
$this->tarih = $tarih;
}
function yazisec($yazi){
$this->yazi = $yazi;
}
function renkgetir(){
return $this->renk;
}
function tarihgetir(){
return $this->tarih;
}
function yazigetir(){
return $this->yazi;
}
function Bloklar(){
$Bloklar = "<table class='$this->renk' width='200' cellspacing='0'>
<tr><td class='tarih'>$this->tarih</td></tr>
<tr><td>$this->yazi</td></tr></table>";
return $Bloklar;
}
}
?>
<STYLE type="text/css">
.sari{border: 1px dotted #C0C0C0;background-color: #FFFFCC;font-size:9pt;}
.sari01{border: 1px dotted #C0C0C0;background-color: #FFEEAB;font-size:9pt;}
.mavi{border:1px dotted #C0C0C0;background-color: #E7F2FF;font-size:9pt;}
.mavi01{border:1px;solid #0cf;background-color: #E7F2FF;font-size:9pt;}
.tarih{border: 1px dotted #C0C0C0;background-color: #FFFFFF;font-size:9pt;}
</STYLE>
<?php
$bloklarim = new Bloklar;
$bloklarim->renksec("mavi");
$bloklarim->tarihsec("09.06.2018 05:47:57");
$bloklarim->yazisec("test");
echo $bloklarim->Bloklar();
$bloklarim = new Bloklar;
$bloklarim->renksec("sari");
$bloklarim->tarihsec("09.06.2018 05:47:57");
$bloklarim->yazisec("test");
echo $bloklarim->Bloklar();
$bloklarim = new Bloklar;
$bloklarim->renksec("mavi01");
$bloklarim->tarihsec("09.06.2018 05:47:57");
$bloklarim->yazisec("test");
echo $bloklarim->Bloklar();
$bloklarim = new Bloklar;
$bloklarim->renksec("sari01");
$bloklarim->tarihsec("09.06.2018 05:47:57");
$bloklarim->yazisec("test");
echo $bloklarim->Bloklar();
?>
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Çıktısı

HTML
16 lines
<STYLE type="text/css">
.sari{border: 1px dotted #C0C0C0;background-color: #FFFFCC;font-size:9pt;}
.sari01{border: 1px dotted #C0C0C0;background-color: #FFEEAB;font-size:9pt;}
.mavi{border:1px dotted #C0C0C0;background-color: #E7F2FF;font-size:9pt;}
.mavi01{border:1px;solid #0cf;background-color: #E7F2FF;font-size:9pt;}
.tarih{border: 1px dotted #C0C0C0;background-color: #FFFFFF;font-size:9pt;}
</STYLE>
<table class='mavi' width='200' cellspacing='0'>
<tr><td class='tarih'>09.06.2018 05:47:57</td></tr>
<tr><td>test</td></tr></table><table class='sari' width='200' cellspacing='0'>
<tr><td class='tarih'>09.06.2018 05:47:57</td></tr>
<tr><td>test</td></tr></table><table class='mavi01' width='200' cellspacing='0'>
<tr><td class='tarih'>09.06.2018 05:47:57</td></tr>
<tr><td>test</td></tr></table><table class='sari01' width='200' cellspacing='0'>
<tr><td class='tarih'>09.06.2018 05:47:57</td></tr>
<tr><td>test</td></tr></table>
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

 

Gelişmiş Sayfa Çalışma Süresi Hesaplama Sınıfı

PHP
51 lines
<?php
class sayfaSuresi{
var $alinanSure ;
var $baslangicSuresi ;
var $bitisSuresi;
function alinanSureyiGetir(){
return $this->alinanSure ;
}
function alinanSureAyarla($deger){
$this->alinanSure = $deger;
}
function baslangicSuresiniGetir(){
return $this->baslangicSuresi ;
}
function baslangicSuresiAyarla($deger){
$this->baslangicSuresi = $deger;
}
function bitisSuresiniGetir(){
return $this->bitisSuresi;
}
function bitisSuresiAyarla($deger){
$this->bitisSuresi = $deger;
}
function baslangicSuresi(){
$msure = microtime();
$msure = explode(" ",$msure);
$msure = $msure[1] + $msure[0];
$this->baslangicSuresiAyarla($msure);
}
function bitisSuresi(){
$msure = microtime();
$msure = explode(" ",$msure);
$msure = $msure[1] + $msure[0];
$this->bitisSuresiAyarla($msure);
}
function alinanSureyiBul(){
$alinanSure = $this->bitisSuresiniGetir() - $this->baslangicSuresiniGetir();
$this->alinanSureAyarla($alinanSure);
}
function alinanSureyiGoster(){
$this->alinanSureyiBul();
echo "Sayfa Çalışma Süresi : ".$this->alinanSureyiGetir()." Saniye";
}
}
$s = new sayfaSuresi();
$s->baslangicSuresi();
for($x=0;$x<10000;$x++);
$s->bitisSuresi();
$s->alinanSureyiGoster();
?>
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Çıktısı

PHP
1 lines
Sayfa Çalışma Süresi : 0.0023720264434814 Saniye
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

 

Basit Resim Yükleme Sınıfı

PHP
68 lines
<?php
class resimYukle {
var $yol;
var $yeniresim;
var $uzanti;
var $resim;
var $hata;
var $yuklenen;
function tipKontrol(){
if((strcmp($this->resim['type'],'image/jpeg')==0)||(strcmp($this->resim['type'],'image/gif')==0)|| (strcmp($this->resim['type'],'image/pjpeg')==0)||(strcmp($this->resim['type'],'image/jpg')==0)||(strcmp($this->resim['type'],'image/x-png')==0)){
switch($this->resim['type']){
case 'image/jpg':
$this->uzanti = '.jpg';
break;
case 'image/jpeg':
$this->uzanti = '.jpg';
break;
case 'image/pjpeg':
$this->uzanti = '.jpg';
break;
case 'image/gif':
$this->uzanti = '.gif';
break;
case 'image/x-png':
$this->uzanti = '.png';
break;
}
return true;
}else{
$this->hata .= '<br>Bilinmeyen Resim Tipi '.$this->resim['type'];
return false;
}
}
function yukle($yeniyol,$resim,$yeniresim=''){
$this->yol = $yeniyol;
$this->resim = $resim;
$this->yuklenen = '';
if($yeniresim != ''){
$this->yeniresim = $yeniresim;
}else{
$this->yeniresim = $this->resim_adi;
}
$this->tipKontrol();
if($this->uzanti){
$resimFinal = $this->yol.$this->yeniresim.$this->uzanti;
if(copy($this->resim['tmp_adi'], $resimFinal)){
$this->yuklenen = $this->yeniresim.$this->uzanti;
return $resimFinal;
}else{
$this->hata .= '<br>'.$resimFinal.' kopyalanamadı.'.$this->yol.' yazma izinlerini kontrol edin';
return false;
}
}else{
$this->hata .= '<br>Uzantı alınamadı '.$this->uzanti;
return false;
}
}
}
if($_FILES){
$y = new resimYukle();
$y->yukle(getcwd().'/',$_FILES["file"],'yeni');
echo $y->hata;
}
?>
<form action="" method="post" enctype="multipart/form-data">
<input type="file" adi="file">
<input type="submit" value="Yükle">
</form>
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

 

Günlük Log Eklemek, Görüntülemek ve Kayıtlarını Tutmak

PHP
30 lines
<?php
class log{
var $dosyaadi;
function log() {
$this->dosyaadi = dirname(__FILE__)."/".date("Y.m.d").".log.html";
if(!file_exists($this->dosyaadi)){
fopen($this->dosyaadi, "w");
fclose($this->dosyaadi);
}
}
function ekle($metin, $tip) {
$dosya = @fopen($this->dosyaadi, "a+");
if($tip=="error"){ $tip='style="color:red"';}
if($tip=="success"){ $tip='style="color:green"';}
if ($dosya) {
$icerik="<span $tip>".date("d.m.Y H:i:s")." - ".$_SERVER["REMOTE_ADDR"]." - ";
$icerik.="$metin</span><br>\n";
fputs($dosya, $icerik);
fclose($dosya);
}
}
function goster() {
echo file_get_contents($this->dosyaadi);
}
}
$l=new log;
$l->ekle("Bu bir hata mesajıdır.","error");
$l->ekle("Bu bir başarı mesajıdır.","success");
$l->goster();
?>
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Çıktısı

HTML
4 lines
<span style="color:red">08.06.2018 03:54:09 - 127.0.0.1 - Bu bir hata mesajıdır.</span><br>
<span style="color:green">08.06.2018 03:54:09 - 127.0.0.1 - Bu bir başarı mesajıdır.</span><br>
<span style="color:red">08.06.2018 03:54:10 - 127.0.0.1 - Bu bir hata mesajıdır.</span><br>
<span style="color:green">08.06.2018 03:54:10 - 127.0.0.1 - Bu bir başarı mesajıdır.</span><br>
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

 

Basit MySQLi Bağlantı Sınıfı

PHP
24 lines
<?php
class mSQLi {
protected $MySQLiHost = "localhost";
protected $MySQLiPort = "3306";
protected $MySQLiUser = "root";
protected $MySQLiPasswd = "";
protected $MySQLiName = "php";
protected $MySQLiBaglanti;
public function __construct(){
return $this->MySQLiBaglanti();
}
public function MySQLiBaglanti(){
$this->MySQLiBaglanti = mysqli_connect($this->MySQLiHost.":".$this->MySQLiPort, $this->MySQLiUser, $this->MySQLiPasswd,$this->MySQLiName) or die("Veritabanı Bağlantı Hatası: ".mysqli_errno($this->MySQLiBaglanti)." : ".mysqli_error($this->MySQLiBaglanti));
return true;
}
public function MySQLiSonlandir(){
mysqli_close($this->MySQLiBaglanti);
return true;
}
}
$db = new mSQLi;
$db->MySQLiBaglanti();
$db->MySQLiSonlandir();
?>
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

 

Gelişmiş Dosya Yükleme Sınıfı

PHP
101 lines
<?php
Class Yukle{
var $maxBoyut;
var $gonderilenDosya;
var $hatalar;
function Yukle($gonderilenDosya){
$this->gonderilenDosya = $gonderilenDosya;
$this->gonderim = false;
$this->maxBoyut=min($this->boyutGetir(ini_get('post_max_size')), $this->boyutGetir(ini_get('upload_max_filesize')));
}
function kaydet($dizin, $alan, $ustuneyaz,$izin=0777){
$this->gonderim = true;
if($this->gonderilenDosya[$alan]['size'] < $this->maxBoyut && $this->gonderilenDosya[$alan]['size'] >0){
$hatayok = true;
$this->gonderim = true;
$gecici = $this->gonderilenDosya[$alan]['tmp_name'];
$dosya = $this->gonderilenDosya[$alan]['name'];
$tumu = $dizin.$dosya;
if(file_exists($tumu)){
if($ustuneyaz){
@unlink($tumu) || $hatayok=false; $this->hatalar = "Yukleme sinifi kaydetme hatasi: uzerine yazilamiyor ".$tumu."<BR>";
@copy($gecici,$tumu) || $hatayok=false; $this->hatalar .= "Yukleme sinifi kaydetme hatasi: kopyalanamiyor ".$tumu."<BR>";
@chmod($tumu,$izin) || $erhatayokrors=false; $this->hatalar .= "Yukleme sinifi kaydetme hatasi: izinleri degistirilemiyor: ".$tumu."<BR>";
}
}else{
@copy($gecici,$tumu) || $hatayok=false;$this->hatalar = "Yukleme sinifi kaydetme hatasi: kopyalanamiyor ".$tumu."<BR>";
@chmod($tumu,$izin) || $hatayok=false;$this->hatalar .= "Yukleme sinifi kaydetme hatasi: izinleri degistirilemiyor: ".$tumu."<BR>";
}
return $hatayok;
}elseif($this->gonderilenDosya[$alan]['size'] > $this->maxBoyut){
$this->hatalar = "Dosya boyutu maksimum dosya boyutu ".$this->maxBoyut." baytı aşıyor";
return false;
}elseif ($this->gonderilenDosya[$alan]['size'] == 0){
$this->hatalar = "Dosya boyutu 0 bayt";
return false;
}
}
function farkliKaydet($dosyaAdi, $dizin, $alan, $ustuneyaz,$izin=0777){
$this->gonderim = true;
if ($this->gonderilenDosya[$alan]['size'] < $this->maxBoyut && $this->gonderilenDosya[$alan]['size'] >0){
$hatayok = true;
$gecici = $this->gonderilenDosya[$alan]['tmp_name'];
$tumu = $dizin.$dosyaAdi;
if (file_exists($tumu)){
if ($ustuneyaz){
@unlink($tumu) || $hatayok=false; $this->hatalar = "Yukleme sinifi farkli kaydetme hatasi: uzerine yazilamiyor ".$tumu."<BR>";
@copy($gecici,$tumu) || $hatayok=false; $this->hatalar .= "Yukleme sinifi farkli kaydetme hatasi: kopyalanamiyor ".$tumu."<BR>";
@chmod($tumu,$izin) || $hatayok=false; $this->hatalar .= "Yukleme sinifi farkli kaydetme hatasi: kopyalanamiyor".$tumu."<BR>";
}
}else{
@copy($gecici,$tumu) || $hatayok=false; $this->hatalar = "Yukleme sinifi farkli kaydetme hatasi: kopyalanamiyor ".$tumu."<BR>";
@chmod($tumu,$izin) || $hatayok=false; $this->hatalar .= "Yukleme sinifi farkli kaydetme hatasi: izinleri degistirilemiyor: ".$tumu."<BR>";
}
return $hatayok;
}elseif($this->gonderilenDosya[$alan]['size'] > $this->maxBoyut){
$this->hatalar = "File size exceeds maximum file size of ".$this->maxBoyut." bytes";
return false;
}elseif($this->gonderilenDosya[$alan]['size'] == 0){
$this->hatalar = "File size is 0 bytes";
return false;
}
}
function boyutGetir($boyut){
$ek = strtoupper(substr($boyut, -1));
if(!in_array($ek,array('P','T','G','M','K'))){
return (int)$boyut;
}
$deger = substr($boyut, 0, -1);
switch ($ek) {
case 'P': $deger *= 1024;
case 'T': $deger *= 1024;
case 'G': $deger *= 1024;
case 'M': $deger *= 1024;
case 'K': $deger *= 1024;
break;
}
return (int)$deger;
}
function dosyaAdi($alan){
return $this->gonderilenDosya[$alan]['name'];
}
function dosyaTipi($alan){
return $this->gonderilenDosya[$alan]['type'];
}
function dosyaBoyutu($alan){
return $this->gonderilenDosya[$alan]['size'];
}
}
if($_FILES){
$u=new Yukle($_FILES);
$u->kaydet("C:/tmp/", "file", $ustuneyaz=true,$izin=0777);
$u->farkliKaydet("test2.pdf","C:/tmp/", "file", $ustuneyaz=true,$izin=0777);
echo $u->dosyaAdi("file")."<br>";
echo $u->dosyaTipi("file")."<br>";
echo $u->dosyaBoyutu("file")." bayt";
}
?>
<form action="" method="post" enctype="multipart/form-data">
<input type="file" name="file">
<input type="submit" value="Yükle">
</form>
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Çıktısı

Markdown
3 lines
Kitap.pdf
application/pdf
3890313 bayt
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX