'05 '06 '07 '08 '09 '10 '11 '12 '13 '14 '15 '16 '17 '18 '19 '20 '21 '22 '23 '24 '25

bntr 2006


2006-11-22

crochet vs knitting


2006-11-15

Без заголовка

по инструкции via mi3ch









Current Films:
Les Amants du Pont-Neuf
Hotaru no haka
Der Himmel über Berlin
Palindromes
Jadesoturi
Takeshis'

2006-11-15

текст


<?php

$file = $_SERVER['QUERY_STRING'];
if( empty($file) )  die("Use: ?filename");
$fp = @fopen( $file, "r" ) or die("Can't open: $file");

print "<pre>";

// Spans

$spanKeyword = array( '<font color="#800080">', '</font>' );
$spanComment = array( '<font color="#FF8000">', '</font>' );

// Preg patterns

$keywords = 'and|or|xor|exception|as|break|case|class|const|continue|'.
            'declare|default|die|do|else|empty|for|foreach|function|'.
            'global|if|new|print|static|switch|use|var|while';
$comments = array('\/\/','\/\*','\*\/');    //  '//','/*','*/' quoted with slashes

$pattern[0] = "/(.*)(\b($keywords)\b|({$comments[0]})|({$comments[1]}))(.*)$/U";
$pattern[1] = "/((.*){$comments[2]})(.*)$/U";
$commentMode = 0;


function printHtml( $str )  {  print htmlspecialchars( $str ); }


while( !feof($fp) )
{
    $str = fgets( $fp, 0x400 );
    
    while( $str )
        if( !preg_match( $pattern[$commentMode], $str, $matches ) )  {
            printHtml( $str );
            break;  // Next Line
        }
        else  {
            if( $commentMode )  {           // "*/"
                $commentMode = 0;
                printHtml( $matches[1] );
                print $spanComment[1];
                $str = $matches[3];
            }
            else  {
                if( $matches[1] )  printHtml( $matches[1] );
                
                if( $matches[4] )  {        // "//"
                    print $spanComment[0].$matches[4];
                    if( $matches[6] )  printHtml( $matches[6] );
                    print $spanComment[1];
                    break;  // Next Line
                }
                else if( $matches[5] )  {   // "/*"
                    print $spanComment[0].$matches[5];
                    $commentMode = 1;
                    $str = $matches[6];
                }
                else  {                     // Keyword
                    print $spanKeyword[0].$matches[2].$spanKeyword[1];
                    $str = $matches[6];
                }
            }
        }   
}

if( $commentMode )  print $spanComment[1];
fclose( $fp );

print "</pre>";
?>


иногда прочитать текст – недостаточно, чтоб понять, что же за ним стоит:

помню, наш тогдашний декан доказывал:

не бывает универсального способа определять по виду программы,
зависнет ли она, если ей на вход подать её же текст..
потому что, если бы существовала умеющая это определять программа,
она зависала бы от своего собственного вида.

2006-11-15

c++


// Passgen.cpp
//


#include <stdio.h>


//--------------------------------------------------------------------

template <class T>
class ListItem
{
public:

    T           item;
    ListItem*   pNext;


    ListItem( T t )
    {
        item  = t;
        pNext = NULL;
    }

   ~ListItem()
    {
        if( pNext )  delete pNext;
    }

};


template <class T>
class List                          // List of ListItems
{
    ListItem<T>**   ppListNext;     // For Appending to Tail

public:

    ListItem<T>*    pList;


    List()
    {
        pList = NULL;
        ppListNext = &pList;
    }

   ~List()
    {
        if( pList )  delete pList;
    }


    void Append( T t )              // Appending to Tail
    {
        ListItem<T>* pNew = new ListItem<T>( t );

       *ppListNext =  pNew;
        ppListNext = &pNew->pNext;
    }

};


//--------------------------------------------------------------------

class Counter;

typedef ListItem<Counter*> CounterItem;


class Counter : public List<Counter*>
{
public:

   ~Counter()
    {
        for( CounterItem* p = pList; p; p = p->pNext )
            delete p->item;
    }

    // Virtuals

    virtual void Reset()
    {
        for( CounterItem* p = pList; p; p = p->pNext )
            p->item->Reset();
    }

    virtual bool Next()
    {
        for( CounterItem* p = pList; p; p = p->pNext )
        {
            if( p->item->Next() )
                return true;
        
            p->item->Reset();
        }

        return false;
    }

};


//--------------------------------------------------------------------

int strlen( const char* c )  {  for( int i=0; *c ++; i++ );  return i; }


class Alphabet
{
public:

    const char* pChars;
    char        nLength;        // Length of Alphabet

    Alphabet( const char* c )
    {
        pChars  = c;
        nLength = strlen( c );
    }

};


//--------------------------------------------------------------------
// Letter of Alphabet

class Letter : public Counter
{
    Alphabet*   pAlphabet;
    char        nIndex;         // Index of Char in Alphabet

public:

    Letter( Alphabet* a )
    {
        pAlphabet = a;
    }

    // Override Virtuals for Letter

    void Reset()
    {
        nIndex = 0;
    }

    bool Next()
    {
        if( ++nIndex < pAlphabet->nLength )  // Next?
            return true;

        nIndex = 0; // Reset
        return false;
    }


    // For Catenation
    char Get()  {  return pAlphabet->pChars[nIndex]; }

};


//--------------------------------------------------------------------


class Word : public Counter
{
public:

    Word( int n, Alphabet* a )
    {
        for( ; n; n-- )
            Append( new Letter( a ) );
    }

};


//--------------------------------------------------------------------

typedef int COMB;


// Factorial
int fact( int n )  {  return  n<=1 ?  1 : n * fact(n-1); }

// Count of "1"-bits in Combination
char bitn( COMB n )  {  for( char b=0; n; n>>=1 ) if( n&1 ) b++;  return b; }




class Comb : public Counter
{
    COMB*   pCombs;     // Combinations
    int     nCount;
    int     nIndex;

public:

    Comb( int k, int l )
    {
        nCount = fact(k+l) / fact(k) / fact(l);
        pCombs = new COMB[nCount];

        COMB comb = 0;
        for( int i=0; i<nCount; comb++ )
            if( bitn(comb) == l )           // Is Combination Valid?
                pCombs[ i++ ] = comb;       // Save Combination
    }
   ~Comb()
    {
        delete[] pCombs;
    }

    // Override Virtuals for Combinations

    void Reset()
    {
        nIndex = 0;
    }

    bool Next()
    {
        if( ++nIndex < nCount ) // Next?
            return true;

        nIndex = 0; // Reset
        return false;
    }


    // For Catenation
    COMB    Get()  {  return pCombs[nIndex]; }

};


//--------------------------------------------------------------------
// Tree of Password Catenation

class TreeItem
{
public:
    virtual void ResetCat() {}
    virtual void Cat( char* ) {}
};


class CombTreeItem : public TreeItem
{
public:

    Comb*           pComb;

    TreeItem*       pChilds[2];  // Binary Tree

    char            nCombPos;    // Catenation position

    // Construction

    CombTreeItem( TreeItem* p0, TreeItem* p1, Comb* pC )
    {
        pChilds[0] = p0;
        pChilds[1] = p1;
        pComb      = pC;        // Link Comb for Catenation
    }
   ~CombTreeItem()
    {
        delete pChilds[0];
        delete pChilds[1];
    }

    // Virtuals

    void ResetCat()
    {
        nCombPos = 0;
        pChilds[0]->ResetCat();
        pChilds[1]->ResetCat();
    }

    void Cat( char* sz )
    {
        pChilds[ pComb->Get() >> nCombPos++ & 1 ]->Cat( sz );
    }

};

class WordTreeItem : public TreeItem
{
public:
    
    Word*       pWord;
    Alphabet*   pAlphabet;      // Keep It Here

    CounterItem*    pWordPos;   // Catenation position

    // Construction

    WordTreeItem( Alphabet* pA, Word* pW )
    {
        pAlphabet = pA;
        pWord     = pW;         // Link Word for Catenation
    }

   ~WordTreeItem()
    {
        delete pAlphabet;
    }

    // Virtuals

    void ResetCat()
    {
        pWordPos = pWord->pList;
    }

    void Cat( char* sz )
    {
       *sz = ((Letter*)pWordPos->item)->Get();
        pWordPos = pWordPos->pNext;
    }

};


class Tree : public Counter
{
public:

    TreeItem*   pRoot;
    int         nLength;    // Length of Full Password


    Tree()
    {
        pRoot   = NULL;
        nLength = 0;
    }

   ~Tree()
    {
        if( pRoot )  delete pRoot;
    }


    void Add( const char* c, int n )
    {
        if( !n )  return;
            
        Alphabet* pA = new Alphabet(c);

        Word* pWord = new Word( n, pA );
        Append( pWord );        // Add to Counter
        
        TreeItem* pNew = new WordTreeItem( pA, pWord );     // WordItem is needed always

        if( pRoot )                                         // If it was Tree
        {
            Comb* pComb = new Comb( n, nLength );
            Append( pComb );    // Add to Counter

            pNew = new CombTreeItem( pNew, pRoot, pComb );  // Add Combination too
        }

        nLength += n;

        pRoot = pNew;
    }


    void Cat( char* sz )
    {
        if( !pRoot )  return;

        pRoot->ResetCat();

        char* c = sz + nLength;

        while( c != sz )
            pRoot->Cat( --c );      // Fill the Password Backwards
    }

};


//--------------------------------------------------------------------

int toInt( char* s )  {  for( int n=0; *s; s++ )  n = n * 10 + (0xF & *s);  return n;  }


int main( int argc, char* argv[] )
{

    printf("bntr Passgen\n");
    printf("passgen.exe n c l limit outputfile\n");
    printf("n - count of numerals\n");
    printf("c - count of capital letters\n");
    printf("l - count of small letters\n");

    if( argc == 1 )
        return 0;


    // Build Tree

    char* cAlphabets[3] = { "0123456789",
                            "ABCDEFGHIJKLMNOPQRSTUVWXYZ",
                            "abcdefghijklmnopqrstuvwxyz" };
    Tree tree;

    for( int i=1; i<=3 && i<argc; i++ )
        tree.Add( cAlphabets[i-1], toInt( argv[i] ) );

    tree.Reset();


    // Output Passwords 

    int nLimit = argc > 4 ?  toInt( argv[4] ) : 0;

    FILE* fFile = argc > 5 ? fopen( argv[5], "a" ) : stdout;

    char szPass[0x100] = {0};


    do  {
        tree.Cat( szPass );
        fprintf( fFile, "%s\n", szPass );
    } 
    while( (!nLimit || --nLimit)  &&  tree.Next() );


    if( argc > 5 ) fclose( fFile );

    return 0;
}



___________

> passgen 2 1 4
aaaaA00
aaaaA01
aaaaA02
aaaaA03
aaaaA04
aaaaA05
aaaaA06
aaaaA07
aaaaA08
aaaaA09
aaaaA10
aaaaA11
aaaaA12
..
aaaaA99
aaaaB00
aaaaB01
aaaaB02
....
aaaaZ99
aaaa0A0
aaaa0A1
aaaa0A2
....
aaaa9Z9
aaaa00A
aaaa01A
aaaa02A
....
aaaa99Z
aaabA00
aaabA01
aaabA02
......
___________







2006-10-25

приснилось



2006-10-24

еще поиграться



Julia.exe (40kb)


"Множество Мандельброта изначально было построено как каталог множеств Жюлиа:
каждой точке на комплексной плоскости соответствует своё множество Жюлиа.
Точки, лежащие внутри множества Мандельброта, точно соответствуют
связным множествам Жюлиа, а точки снаружи — несвязным.

Отсюда понятно, что интересные варианты множества Жюлиа
соответствуют точкам, лежащим на границе множества Мандельброта.
Точки глубоко внутри образуют простые геометрические фигуры,
а внешние выглядят как пыль..

Если сильно увеличить множество Мандельбротта в граничной точке c
и тоже самое проделать с множеством Жюлиа для этого же значения c и в этой же точке,
то картины будут асимптотически стремиться друг к другу при все больших увеличениях."

https://ru.wikipedia.org/wiki/Множество_Мандельброта

2006-10-19

Без заголовка




Это множество точек, расположенных на равном расстоянии друг от друга,
воспринимается как непрерывно меняющиеся узоры из рядов и квадратов.
Рассматривая этот рисунок,
мы знакомимся с активным организующим началом в зрительной системе.
(Р.Л.Грегори, Глаз и мозг)


кажется, это "организующее начало" легко раздражить белым шумом -
выделяются некие рои точек, подобные полётам саранчи,
всякие пучки прямых (ага, кресты), какие-то каркасные тела..
интересно, что созерцая, их движением можно почти управлять,
надеюсь такая обратная связь не сродни диалогу с галлюцинациями.
БелыйШум.scr (56kb)




Current Films:
Where the Green Ants Dream
Sexo por compasión
Fargo

2006-10-18

когда я был помоложе, я тоже писал хардкор


ага, попытался давно - вышел loop такой на 7 секунд,
но его непросто без паузы зациклить, поэтому 16 раз повторил .

Current music: Всё любимое просто


ну и осени конечно
















2006-09-12

Без заголовка

вот так например легко определить нужный день


2006-08-31

квадратуры


благодаря dmitin , сквадратурил еще один круг


П²/6 = 1/1² + 1/2² + 1/3² + ..



П/4 = 1/1 - 1/3 + 1/5 - 1/7 + ..


схема та же


Upd: Poster (1.3mb) pdf


Current Films:
Stealing Beauty,
Picnic at Hanging Rock ( soundtrack )

2006-08-24

вроде довел до ума




Vectal4.exe
Vectal_Samples.zip

сурсы: Vectal4_060824.zip








бонус: Фрактальная геометрия природы - Бенуа Мандельброт.djvu

2006-08-14

структура 2


Отче наш!
для чего ж Ты придал структуру-то натуральному ряду!
как бы было всё замечательно:
Дао порождает Два, Два порождает Четыре, Четыре - Восемь,..
так нет же - дерево!



хотя какое это дерево.. там дальше ведь ветви срастаются
или что с ними происходит, я забыл.. они переходят в пластилин?

2006-08-08

Kurgjärve


Anne



помню, отдыхали нынче на Кургярве, много слушали эту песню


2006-08-01

календарь


вслед за бессмертным Омаром Хайямом
решил вот выдумать идеальный календарь

один уже давно был разработан
в приобщении к недостающим гармоникам вселенского ритма..



а теперь еще один - для себя - десятилетний
на шесть А3 напечатал - заместо мандалы повешу





также обнаружился интересный тред у soamo :
квадратен ваш год или кругл, снизу вы на него смотрите или сверху..

2006-06-29

сигареты в руках, чай на столе - эта схема проста


посмотрел Пыль
может кто нуждается в аватаре



забрал drew_fighter

2006-06-09

Без заголовка

есть 100 женщин и 100 мужчин, и известны некоторые их взаимные симпатии,
можно ли соответственно симпатиям разбить их на 100 пар..?
- наверное, компьютер решит это в минуту..

а вот если бы полов было 3, и требовалось разбить 300 человек на тройки
- на это компьютеру не хватило бы тысячелетий..
потому что, оказывается, это задача другого класса..

так что если озадачиться поиском алгоритма для чего-то подобного,
полезно уметь отличать решаемое от нерешаемого..
и умные дяди уже давно думают как этому научиться:
https://en.wikipedia.org/wiki/Computational_complexity_theory

когда меня ещё не было в планах, великий Кук догадался,
что решение одной задачи может полностью сводиться к решению другой..
и что тогда вторая задача "не проще" первой..
(Cook, S.A. [1971] "The complexity of theorem-proving procedures")

он рассматривал задачи двух типов: P (простые) и NP (непростые),
а потом взял и свёл все непростые задачи к одной:
"Честь быть первой "полной-NP" задачей выпала на долю задачи ВЫПОЛНИМОСТЬ.." (*)

"полная-NP" задача - это если к ней сводятся все задачи NP,
тогда - если сводить ВЫПОЛНИМОСТЬ к другим задачам, а те к третьим..
- все они будут "полными-NP"

(*) цитата из другой знаменитейшей книги
Garey, M.R. [1979] "Computers and Intractability"
(вернее из её переиздательства "МИР" 1982,
ксерокопии из которой раздавал нам даже профессор Мати Томбак,
на что многие студенты справедливо реагировали: "мис асья?!")

"В монографии приводится список известных к тому времени NP-полных задач, насчитывающий уже более 300 наименований.
К настоящему времени количество известных NP-полных задач выражается четырехзначным числом,
и постоянно появляются новые, возникающие как в самой математике и теории сложности,
так и в таких дисциплинах как биология, социология, военное дело, теория расписаний, теория игр и т.д." (**)


нынче доказать какую-нибудь NP-полноту уже настолько не модно,
что этому даже не уделяют статьи в математических журнальчиках, ага

"Доказательства NP-полноты являются скорее искусством,
и мы от всей души желаем нашим читателям больше полиномиальных (P) алгоритмов,
хороших и разных, для интересующих их задач
с тем, чтобы обращаться к этому специфическому искусству им пришлось как можно реже." (**)


(**) а это цитаты из курса лекций Кузюрина и Фомина, рассматривать который можно здесь:
https://sites.google.com/site/isprascourses/algorithms-complexity

а теперь наконец - во что мы упираемся:
до сих пор неизвестно, являются ли задачи NP на самом деле труднорешаемыми:
различны ли классы P и NP:

"Безуспешным попыткам построения полиномиальных алгоритмов для NP-полных задач
были посвящены усилия огромного числа выдающихся специалистов в данной области.
Ввиду этого можно считать, что NP-полные задачи являются труднорешаемыми со всех практических точек зрения,
хотя, повторяем, строгое доказательство этого составляет одну из центральных открытых проблем современной математики." (**)


рассуждения о списках публикаций, посвящённых (не)разрешимости проблемы P =? NP,
можно полистать в таких-то и таких-то трудах..

кроме P и NP умными дядями обнаружены и другие классы сложности:
P, NP, Co-NP, NP-C, Co-NP-C, NP-hard, UP, #P , #P -C, L, NL, NC, P-C, PSPACE, PSPACE-C..
остальные здесь https://en.wikipedia.org/wiki/List_of_complexity_classes
полный зоопарк классов здесь https://qwiki.caltech.edu/wiki/Complexity_Zoo

при обнаружении, что P = NP, все классы видимо сжимаются в один класс P,
а умные дяди при этом смеются..


вобщем, в этом семестре пришлось бродить где-то по краю математического языка..
где ввиду общепринятости посылок выводы ещё пока имеют смысл..
но уже попахивают абсурдом из-за искусственности последних и кривости первых

2006-05-24

до сих пор не знаю чего хочу


обратная перспектива

UPD: Как это было: https://bntr.livejournal.com/67927.html

2006-05-05

Без заголовка





2006-04-14

Без заголовка



бывает обмениваешься с кем-то информацией:
и сюда повернёшь разговор, и такую идейку подкинешь;
а человек - устал чтоли - ну так вяло реагирует:
такое чувство, будто просто свой день описывает..

а не по себе становится оттого,
что с его-то стороны всё, возможно, наоборот

2006-03-31

лужи


..и вдруг уже откуда-то знаю, какой ногой переступлю воон через ту лужу,
и не то чтобы для этого нужны были какие-то рассуждения или вычисления..
результат всплывает как-то мгновенно

видимо, в глаза имплантирован автономный искусственный интеллектик..
да, и воспоминания мои искусственны



2006-03-31

опус 0331 (upd: 1026)


оказалось, VBScript не понимает про Clipboard



настроил ярлыки на




#include "windows.h"
#include "tchar.h"


void catClipBoard( TCHAR* sz )
{
    if( !OpenClipboard(NULL) ) 
        return;

    if( HGLOBAL hCB = GetClipboardData( CF_TEXT ) )

        if( TCHAR* szCB = (TCHAR*)GlobalLock( hCB ) )
        {
            _tcscat( sz, szCB );

            GlobalUnlock( hCB ); 
        }


    CloseClipboard();

}

void replaceQuotes( TCHAR* p )
{
    for( ; *p; p++ )
        if( *p == '`' )
            *p = '"';
}

int main( int argc, char* argv[] )
{
    if( argc < 2 )  return 1;


    TCHAR  szCommandLine[0x200] = {0};

    _tcscat(      szCommandLine, argv[1] );

    if( 2 < argc )
         _tcscat( szCommandLine, argv[2] );

    catClipBoard( szCommandLine );

    if( 3 < argc )
         _tcscat( szCommandLine, argv[3] );


    replaceQuotes( szCommandLine );


    STARTUPINFO ci = {0};
    PROCESS_INFORMATION pi;

    CreateProcess( NULL, szCommandLine,
                   0,0,0,0,0,0, &ci,π );

    return 0;
}
программу



например

C:\VC\CopyShell.exe "`C:\Program Files\Internet Explorer\iexplore.exe`" " ` http://slovari.yandex.ru/search.xml?text= " `

запускает IE с поиском скопированного в буфер слова



а

C:\VC\CopyShell.exe " `C:\Program Files\Mozilla Firefox\firefox.exe` " " ` http://lingvo.yandex.ru/en?st_translate=1&text= " `

ищет перевод

(подчеркнуты аргументы)

2006-03-20

логика





          ~(~A|B) | A
      ~(~(~(~A|B))) | A
      ~(~(~(~A|B)|F)) | A
      ~(~(~(~A|B)|~(~B|B))) | A
      ~(~(~(~A  )|~(~B  ))|B) | A
      ~(~( ~~A   | ~~B   )|B) | A
      ~(~(   A   |   B   )|B) | A
  ~(~( ~(~(   A  |  B   )|B) | A ))
   ~(~( ~(~(  A  |  B  )|B) | A )|F)
    ~(~( ~(~(  A | B  )|B) | A )|~(~A|A))
     ~(~( ~(~( A | B ) |B)     )|~(~A  )) | A
      ~( ~~(~(  A|B  ) |B)      | ~~A   ) | A
      ~(    ~(  A|B  ) |B       |  A   ) | A
        ~(   ~( A|B ) | ( B|A )       ) | A
                    F                  | A
                                        A


https://en.wikipedia.org/wiki/Absorption_law
https://en.wikipedia.org/wiki/Laws_of_Form

2006-03-18

тексты


..
Конечно, это лишь один из токов в общем движении текстов с Запада в Россию.
В промежутке между Пушкиным и Чеховым русская культура становится транслирующей
(вершина — творчество Толстого и Достоевского),
и поток текстов поворачивает в обратном направлении.

Конечно, нарисованная нами картина предельно схематична.
В реальности циркуляция текстов непрерывно идет в разных направлениях,
большие и малые потоки скрещиваются, складывая свои воздействия.
Одновременно тексты транслируются не одним, а многими центрами семиосферы,
да и сама семиосфера подвижна в своих границах.
Наконец, те же самые процессы протекают и на других уровнях:
периоды агрессии поэзии в прозу сменяются агрессией прозы в поэзию,
взаимное напряжение драмы и романа, письменной и устной культуры,
культуры элитарной и массовой  создают многонаправленные токи текстов.
В разных аспектах одни и те же центры семиосферы могут быть
одновременно и активно действующими, и «принимающими»,
одни и те же пространства семиосферы могут
в одних отношениях быть центрами, в других — периферией,
влечения провоцируют отталкивания, заимствования — самобытность.
Пространство культуры — семиосфера —
не есть нечто действующее по предначертанным и элементарно вычислимым путям.
Оно кипит как Солнце и, как на Солнце, в нем очаги возбуждения меняются местами,
активность вспыхивает то в неведомых глубинах, то на поверхности
и иррадиирует энергию в относительно спокойные сферы.
И результатом этого непрерывного кипения является выделение колоссальной энергии.
Но энергия, выделяемая семиосферой,— это энергия информации, энергия Мысли.

Юрий Михайлович Лотман . Семиосфера: Внутри мыслящих миров: Механизмы диалога.


к новости про памятник

2006-03-17

знаки

днём пытался читать


2006-02-27

какава




Current Mood: ..отомстить Алладину; написать генератор;

2006-02-16

наследование




2006-02-14

Без заголовка

чудным воскресным утром вышел на прогулку к берегу моря








а на обратном пути :Е укусила собака

хуторская какая-то.. злая выбежала на дорогу.. до крови ага за ногу..
и как это понимать?

баловень цивилизации теперь привит от столбняка и дифтерии на 5 лет ..в плечо

2006-02-02

руки



2006-02-02

солнце и мороз сегодня




на юге от города стоят 3 древних золоотвала:
один крупный такой посередине, с него море видно..
а один маленький совсем, лесом порос




2006-02-01

учу английский



2006-01-31

Rithmomachia - The Philosophers' Game




ну не знаю.. я пожалуй воздержусь =)

2006-01-30

сдал. нынче единственную дидактику


как сказал лектор Тыниссон, камеры куда-то уехали
и видеосъёмки зачётных презентаций не будет..
а может нас просто было мало, короче велели всем зарисовывать






2006-01-02

нас с 2006



'05 '06 '07 '08 '09 '10 '11 '12 '13 '14 '15 '16 '17 '18 '19 '20 '21 '22 '23 '24 '25