LINUX.ORG.RU

Сообщения hibiscusM

 

django.db.utils.OperationalError: (1091, «Can't DROP '

В models.py было добавлено поле. Но не сделана миграция.

А функция в views.py создала объект Order.objects.create(..).

После этого было предпринято

python manage.py migrate 
, но выдает ошибку

django.db.utils.OperationalError: (1091, "Can't DROP 'order_id'; check that column/key exists"). 

Какое есть решение?

 , ,

hibiscusM
()

vim. Сделать курсор _,поменять его цвет, остановить мигание(все по умолчанию)

Чтобы поменять цвет и сделать _ здесь предлагается добавить в vimrc

if &term =~ "xterm\\|rxvt"
  " use an orange cursor in insert mode
  let &t_SI = "\<Esc>]12;gray\x7"
  " use a red cursor otherwise
  let &t_EI = "\<Esc>]12;gray\x7"
  silent !echo -ne "\033]12;gray\007"
  " reset cursor when vim exits
  autocmd VimLeave * silent !echo -ne "\033]112\007"
  " use \003]12;gray\007 for gnome-terminal and rxvt up to version 9.21
endif


if &term =~ '^xterm\\|rxvt'
  " solid underscore
  let &t_SI .= "\<Esc>[4 q"
  " solid block
  let &t_EI .= "\<Esc>[2 q"
  " 1 or 0 -> blinking block
  " 3 -> blinking underscore
  " Recent versions of xterm (282 or above) also support
  " 5 -> blinking vertical bar
  " 6 -> solid vertical bar
endif

Добавляю. Никакого эффекта. vimrc находится /usr/share/vim

Здесь добавили в файл colorscheme (am.vim) и получилось

Я добавляю в default.vim , путь /usr/share/vim/vim80/colors

Не меняется ничего. И если в vim ввести :colo default то цвет курсора не меняется на gray в любом режиме visual, insert.

То же самое и с задачей прекратить мигание

" Disable all blinking:
:set guicursor+=a:blinkon0
" Remove previous setting:
:set guicursor-=a:blinkon0
" Restore default setting:
:set guicursor&  

 , ,

hibiscusM
()

Почему не добавляется в словарь

    with open('dineOUT/story.txt') as f:

        tracker=0

        for line in f:
            if '<a href=' in line:

                d['Dessert']=[]
                print('a href', re.sub('\s*<.*?>\s*', '',line))
                d['Dessert'].append(re.sub('\s*<.*?>\s*', '',line).upper())

            elif tracker==1:
                if line != '\n':
                    print('tracker', line.rstrip('\n'))
                    d['Dessert'].append(line.rstrip('\n'))
                    tracker=0
                else:
                    tracker=0

            elif '<p class="list-dish-desc-details">' in line:
                tracker=1

            elif '<sup' in line:

                print('digits',re.findall('[0-9\.]+', line))
                digits=re.findall('[0-9\.]+', line)
                d['Dessert'].append(float(digits[0]+digits[1]))
    

    print(json.dumps(d))

Результат выполнения

(pr_env) $ python dineOUT/formDict.py
a href Coconut Grande
tracker A coconut lover's dream. Warm coconut cake topped with coconut-pineapple ice cream, fresh pineapple and toasted coconut, served in a fresh coconut.
digits ['9.', '99']
a href Lime Pie
tracker Our original. Handmade with brown sugar crust and golden meringue.
digits ['6.', '99']
a href Chocolate Island
tracker Rich chocolate mousse on a fudge brownie island in chocolate sauce and vanilla bean anglaise.
digits ['7.', '79']
a href Rum Cake
tracker An Island favorite made with Bacardi Oakheart Rum, topped with a handmade raisin butterscotch sauce and vanilla ice cream.</br>*Contains alcohol. Must be 21 to order. Eat responsibly.
digits ['7.', '49']
a href Banana Nut Bread Supreme
tracker Sliced bananas, vanilla ice cream on warm banana nut bread with hot butterscotch brandy sauce.
digits ['7.', '29']
a href Warm Chocolate Pineapple Upside-Down Cake
tracker A warm, rich chocolate cake with a chocolate molten center topped with caramelized pineapple, served with raspberry sauce and fresh Island fruit.
digits ['7.', '29']
a href Mango Sorbet with Tropical Fruit
digits ['1.', '99']
a href Vanilla Ice Cream with Chocolate Sauce
digits ['1.', '99']


"PASSION FRUIT MOCKTAIL", 3.95, "STRAWBERRY SMOOTHIE", 3.95, "PASSION FRUIT SMOOTHIE", 3.95], "Dessert": ["VANILLA ICE CREAM WITH CHOCOLATE SAUCE", 1.99]}

Это та часть словаря, где должны быть десерты.
Добавляется только последняя строка и цена.

 ,

hibiscusM
()

Pipe, argparse, custom django-admin command. Где ошибка?

Использую данный шаблон для написания собственной команды в django.

Здесь см. рейтинг 44 пишут, что словарь можно передать в виде строки формата json (с двойными кавычками), а json.loads() обратно преобразует его в словарь.

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

parser.add_argument('-i', '--input', type=json.loads) 

У меня это выглядит так:

#populate.py
from django.core.management.base import BaseCommand, CommandError
from dineOUT.models import*
import json



class Command(BaseCommand):
    help = 'add objects to DB'


    def add_arguments(self, parser):
        parser.add_argument('dic', nargs='?', type=json.loads)
 


    def handle(self, *args, **options):
        dic=options['dic']

        for k, v in dic.items():

При запуске команды python create_dict.py | python manage.py populate, выдает ошибку

AttributeError: 'NoneType' object has no attribute 'items'   

Отдельно вот это работает

python create_dict.py 
в терминал печатается словарь. В create_dict.py словарь преобразуется
 print(json.dumps(d)) 

 , ,

hibiscusM
()

Убрать часть строки с помощью regex

Строка

<th class=«tableright»>& pound;1.95& nbsp;& nbsp;& nbsp;& nbsp;& nbsp;</th> <th class=«tableright»>& pound;2.95& nbsp;& nbsp;</th>

Как убрать все, кроме 1.95?

у меня

            
elif 'th' in line and line.islower():
     d[alpha].append(re.sub('\s*<.*?>\D*\s*','', line))

получается (см. после MANGO), то есть в аналогичных строках (например, <th class=«tableright»>& pound;5.95</th>) текст удаляется,а цифры остаются,как видно ниже.

'GREAT ESCAPE', '3.95', 'MELON REFRESHER', '3.95', 'MIXED', '5.95', 'MANGO', '1.95&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.95&nbsp;&nbsp;', 'LYCHEE', '1.95&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.95&nbsp;&nbsp;'

 ,

hibiscusM
()

SyntaxError: invalid syntax

При выполнении программы показывает ошибку


Traceback (most recent call last):
  File "      ", line 16, in <module>
    d[alpha].append(eval(line.strip('<th class=\"tableright\">&pound;</th>br')))
  File "<string>", line 1
    <th class="tableright">&pound;4.95</th>
    ^
SyntaxError: invalid syntax

Process finished with exit code 1

часть программы, где показывает ошибку

elif 'th' in line and not line.islower():
      d[alpha].append(line.strip('<th class=\"tableleft\"</th>*'))

elif 'th' in line and line.islower():
      d[alpha].append(eval(line.strip('<th class=\"tableright\">&pound;</th>br')))
 

Что не так? В интерактивном режиме все работает.

>>>from collections import defaultdict
>>>d=defaultdict(list)
>>>a='<th class=\"tableright\">4.95&pound;</th>br'
>>>d['k'].append(eval(a.strip('<th class=\"tableright\">&pound;</th>br')))
>>>d
defaultdict(<class 'list'>, {'k': [4.95]})

 ,

hibiscusM
()

Как реализовать модель Orders в django

Модели по типу еды (поля - название блюда и цена), например, в модели Salad (name , Price). модель User (поля - email, address, name, phone) . Mодель «Orders» у которой связь с User many to one relationship. Но как при такой задумке реализовать Orders в виде модели? Один заказ должен включать типы еды (типов несколько как правило в одном заказе), количество заказанного по наименованиям (например цезарь 3, салат крабовый 2, апельсиновый сок 2, чай Oolong 1 и.т.д), цена за 1 единицу еды, дата заказа.

 ,

hibiscusM
()

Насколько часто используются segment(interval) trees в программировании

Насколько часто segment trees/interval trees и запросы по ним используются в коммерческом программировании, в open source проектах и на каких языках программирования чаще всего?

На англоязычных форумах пишут, что segment trees/interval trees (рекурсивный или нерекурсивный подход) достаточно популярны в соревнованиях по программированию.

А как обстоят дела на практике, которая, возможно, имеет мало общего со спортивным программированием?

Перемещено maxcom из general

 ,

hibiscusM
()

Решение задачи посредством two pointer technique

последняя задача из списка.

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

Решение на с++. Не могу составить полную картину/сложить воедино то, что он делает.

#include <bits/stdc++.h>
using namespace std;
 
#define lli long long
#define MAX 1000006
 
lli A[MAX],C[MAX];
 
int main()
{
    int l = 1, r = 2, st,en,n;
    
    lli sum,ans;
 
    cin >> n >> k;
    
    for ( int i = 1; i <= n; i++ ) cin >> A[i];
 
    sort(A+1, A+n+1);
 
    cum[0] = 0;
    for ( int i = 1; i <= n; i++ ) cum[i] = cum[i-1] + A[i];
    
    while ( r <= k ) {
       sum += (A[r]*(r-l) - (cum[r-1] - cum[l-1]));
       r++;
    }
 
    st = 1, en = k, ans = sum;
 
    while ( r <= n ) {
       sum -= (cum[r-1] - cum[l] - A[l]*(r-l-1));
       l++;
       sum += (A[r]*(r-l) - (cum[r-1] - cum[l-1]));
        
       if ( ans > sum ) {
          ans = sum;
          st = l;
          en = r;
       }
       r++;
    }
    return 0;
}

1) Объявляет список C и не использует. Он для чего?
2) cum - некая последовательность чисел, в которой каждое последующее число - это сумма всех предыдущих + текущее значение, взятое из отсортированного списка A с индексом i. Дальше не ясно.

В цикле while каждый раз увеличивается увеличивается список sum на элемент, получаемый путем умножения элемента из А с индексом r на некую разницу индексов и вычитания элементов последовательности cum с прочими индексами. Как это все сопоставляется друг с другом? Общая цель понятна, а по отдельности нет.
3) как результат выводитсся? Где cout или прочее прохожее на stdout

 ,

hibiscusM
()

Задача с hackerrank

Дописать ф-ю, у которой параметры - это 4 списка.
p - количество людей в каждом городе (int >0)
x - расположение каждого города (int>0)
y - расположение каждого облака (int>0)
r - радиус каждого облака (int), соответственно начало и конец облака c индексом i (Yi-Ri, Yi+Ri).

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

В списке участников, прошедших все тесты, решения в основном на с++ и java (на каждые 20 участников c максимум баллов - 1 питонист).
Первый же питонист в топе списка, как оказалось, переписал полностью вот этот код ниже, который трогать не предполагается и соответственно его ф-я принимает другие параметры, переделанные списки и прочее.

if __name__ == '__main__':
    fptr = open(os.environ['OUTPUT_PATH'], 'w')

    n = int(input())

    p = list(map(int, input().rstrip().split()))

    x = list(map(int, input().rstrip().split()))

    m = int(input())

    y = list(map(int, input().rstrip().split()))

    r = list(map(int, input().rstrip().split()))

    result = maximumPeople(p, x, y, r)

    fptr.write(str(result) + '\n')

    fptr.close()

Мое решение ниже проходит всего 11 тестов из 28, когда начинаются списки из 200 000 элементов то Terminated due to timeout error.
В связи с чем у меня вопрос, эту задачу в принципе возможно решить на Python? И если да, то какой подход использовать?

def maxSun(p, x, y, r):
    # Return the maximum number of people that will be in sunny towns after removing exactly one cloud.
    from collections import defaultdict
    from itertools import chain

    lY,lX=range(len(y)),range(len(x))

    by_length=sorted(((y[i] - r[i], y[i] + r[i]) if (y[i] - r[i]) >= 0
                      else (0, y[i] + r[i])
                      for i in lY), key=lambda x: x[1]- x[0], reverse=True)


    if not by_length[1:]:  # remove first largest range
        return sum(p)


    d=defaultdict(list)

    for tupl in by_length[1:]:
        if not d:

            for i in lX:
                if x[i]<tupl[0] or x[i]>tupl[1]:
                    d[x[i]].append(p[i]) #X beyond second largest range; form a dict
            if not d:  #no X-elements beyond second largest range
                return 0
        else:

            for X in d.copy():  #exclude X within other ranges from a dict
                if X >=tupl[0] and X<=tupl[1]:
                    del d[X]
                    if not d:
                        return 0


    return sum(chain(*d.values()))

 ,

hibiscusM
()

Является ли такая реализация правильной?

Задача.

Имеются запросы в форме tuple of ints например

 
q=(1,5)  No1 query
q=(2,3)  No2 query
q=(3,1)  No3 query

q[0] может быть 1 или 2 или 3
q[1] - любое положительное число

Условия (по-англ. короче)
array=[ ]
if q[0]==1, insert q[1] to array
if q[0]==2, remove q[1] from array
if q[0]==3, check if there is integer whose frequency is q[1] in array

Количество запросов: 1<= queries <= 10**9

Является ли это правильным решением, если удалять запрошенные числа не по мере поступления запроса с q[0]=2, а сформировать сначала два независимых списка (один с числами для добавления, а другой с числами ждя удаления) и удалять, когда придет запрос с q[0]=3? И является ли решение с генераторами приемлемым или это странное решение?

def freqQuery(queries):
    from collections import Counter

    output=[]
    ad = Counter()
    de = Counter()
    for k,v in queries:
        if k==3:
            ad=ad-de
            if v in ad.values():
                output+=[1]
            else:
                output+=[0]
        elif k==2:
             de.update([v])
        else:
             ad.update([v])

    return output

def freqQuery(queries):
    from collections import Counter

    def helper(k, v, ad, de):

        if k==1:
            ad.update([v])   # add value as key & count its frequency only for No 1 queries
        elif k==2:
            de.update([v])   # add value as key & count its frequency only for No2 queries
        return ad-de         # remove all integers of No2 quaries from Counter related to No 1 queries


    a = Counter()
    d = Counter()

    #list of final arrays in the form of generator to analyze No 3 queries
    # such list includes Counters , tuples of Counter and int related to No 3 query
    gen=(helper(key, value, a, d) if key !=3 else (a, value) for key,value in queries)

    # list of tuples in the form of generator
    gen2=(item for item in gen if type(item) == tuple)

    #form final output
    gen3=(1 if item[1] in item[0].values() else 0 for item in gen2)

    return list(gen3)


 , , ,

hibiscusM
()

понятно ли написана функция(и)?

Эта функция принимает список и корневой узел и формирует binary search tree, каждый раз - разное.


def create_lists(dic, ls, node):   #creates left and right lists for a node & updates a dict
    ind=ls.index(node.data)
    ls1=(ls[:ind]) # can be empty, no index error
    ls2=ls[ind+1:]  # can be empty, no index error

    dic[node]=(ls1, ls2)
    return dic


def create_childs (dic, node):   #creates left and right childs for a parent & updates a dict
    import random

    if dic[node][0]:
        intL=random.choice(dic[node][0])
        node.left=Node(intL)
        dic=create_lists(dic, dic[node][0], node.left)



    if dic[node][1]:
        intR=random.choice(dic[node][1])
        node.right=Node(intR)
        dic=create_lists(dic, dic[node][1], node.right)


    del dic[node]

    return dic


def bin_srch_tr(ls, root):
    # ls must be sorted in increased order!
    print(root)

    import random

    dic=dict()
    dic=create_lists(dic, ls, root)
    dic = create_childs(dic, root)

    while dic:
        dic2=dic.copy()
        for node in dic:
            print('node' , node.data, dic) # current node & all node objects with left & right lists per node in a dic
            dic2 = create_childs(dic2, node)
        dic=dic2

    return root


ls=[1,2,3,4,5,6,7]
root=Node(4)  # root where data is int, left & right are None  

print(bin_srch_tr(ls, root))

 , , ,

hibiscusM
()

тесты с сайта hackerrank и собственный тест показывают разные результаты

Может ли быть, что отдельные тесты на сайте hackerrank составлены некорректно?

Задача с сайта. Проверить является ли дерево binary search tree. Если не является, то ответ False.

Все тесты с сайта, которые проверяют ответ False показывают, что у моя ф. дает ответ True.

Спецально была написана фнукция, которая формирует дерево в проивольном порядке, т.е. оно не binary search tree. После этого ф. которая проверяет такое дерево, проверялась моим собственым тестом и ответ постоянно False, т.е. такой какой и требуется.

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

    def __comp__(self):
        l = self.left
        r = self.right
        if l and r:
            if l.right:
                extra = l.right
                if extra and not extra.data.__lt__(self.data) and not extra.data.__lt__(r.data):
                    return False, 'NO'
            return l.data.__lt__(self.data) and r.data.__gt__(self.data), 'LR'
        elif l:
            return l.data.__lt__(self.data), 'L'
        elif r:
            return r.data.__gt__(self.data), 'R'
        elif not r and not l:
            return True, 'END'

 def check_binary_search_tree_(root):
    nodes = root.__comp__()
    if not nodes[0]: return False
    dic = dict()
    if 'L' in nodes[1]: dic[root.left] = 'lwing'
    if 'R' in nodes[1]: dic[root.right] = 'rwing'

    while dic:
        new_dic = dict()
        for node in dic:
            nodes = node.__comp__()
            if not nodes[0]: return False
            if 'R' in nodes[1]:
                new_dic[node.right] = dic[node]
                if new_dic[node.right] == 'lwing' and not node.right.__lt__(root):
                    return False
            if 'L' in nodes[1]:
                new_dic[node.left] = dic[node]
                if new_dic[node.left] == 'rwing' and not node.left.__gt__(root):
                    return False
        dic = new_dic
    return True


def Checker(tree, func):
    assert func(tree)==False
    return 'OK'


print(Checker(form_tree(ls),check_binary_search_tree_))

 

 , ,

hibiscusM
()

Странное поведение функции, которая формирует дерево

Пишу ф. form_tree, которая принимает параметр - список и формирует на его основе дерево в произвольной форме.

Пока функция в стадии доработки и отладки.
Это черновой вариант. Ф. linker - «helper function», тоже в стадии доработки.

class node:
    def __init__(self, data):
        self.data = data
        self.left = None
        self.right = None


    def insertL(self, data):
        self.left = node(data)
        return self.left

    def insertR(self, data):
        self.right = node(data)
        return self.right

linker

def linker(root, lst):
    import random


    seq = ['left', 'right', 'nither', 'either']
    res = random.choices(seq,(0.2, 0.2, 0.1, 0.5), k=1)
    if lst:
        l=random.choice(lst)

        if res == ['left']:
            root=root.insertL(l)
            lst.remove(l)
            return root, lst
        elif res == ['right']:
            root=root.insertR(l)
            lst.remove(l)
            return root,lst
        elif res == ['nither']:
            return root,lst
        elif res == ['either']:
            print('res', res)
            nodes = [root.insertL(l)]
            lst.remove(l)
            if lst:
                l2=random.choice(lst)
                nodes+=[root.insertR(l2)]
                lst.remove(l2)
                return nodes, lst
            else:
                return nodes[0],lst
    else:
        return root, lst

основная

def form_tree(ls):
    import random

    data = random.choice(ls)
    root=Root=node(data)
    ls.remove(data)
    nodes = None

    while ls:
        if type(nodes)!= list:
            result=linker(root, ls)
            if not result[1]:
                return Root
            else:
                ls=result[1]
            if type(result[0])!= list:
                root=result[0]
            else:
                nodes=result[0]
        else:
            new_nodes=[]
            print('nodes = ', nodes)
            for n in nodes:
                if ls:
                    result = linker(n, ls)
                    ls = result[1]
                    if type(result[0]) != list and result[0] != n:
                        new_nodes = new_nodes+[result[0]]
                    elif type(result[0]) == list:
                        new_nodes = new_nodes+result[0]
                else:
                    return Root
            nodes=new_nodes
    return Root

Согласно выставленным print в linker ('either' section) и form_tree (for-loop), при каждом запуске выводится


res ['either']
nodes =  [<__main__.node object at 0x7ffb5f0cf1d0>, <__main__.node object at 0x7ffb5f0cf940>]
nodes =  [<__main__.node object at 0x7ffb5f0cf7b8>]
res ['either']
nodes =  [<__main__.node object at 0x7ffb5f0cf8d0>, 

И выдается ответ.

Но иногда ф. form-tree (на 5 или 8 запуск)начинает бесконечно выводить:

 []
nodes =  []
nodes =  []
nodes =  []
nodes =  []
nodes =  []
nodes =  []
nodes =  []

Как бы выяснить, почему?

Используемый список

ls=[1,2,3,4,5,6,7,8,9,10,11,13,12,14,15]

print(form_tree(ls)) 

 , ,

hibiscusM
()

задачка о binary search tree / часть тестов провалено

Given the root node of a binary tree, can you determine if it's also a binary search tree?
You are not responsible for reading any input from stdin.
Hidden code stubs will assemble a binary tree and pass its root node to your function as an argument.Constraints: 0<=data<=10000

Моя функция проходит лишь 8 тестов из 14. Где здесь изъян?

def check_binary_search_tree_(root):
    if root.left or root.right: lst=[root]
    else: return 1

    while lst:
        new_list=[]
        for node in lst:
            if node.left:
                if node.data>node.left.data: new_list.append(node.left)
                else: return 0
            if node.right:
                if node.data<node.right.data: new_list.append(node.right)
                else: return 0
        lst=new_list
    return 1

 , ,

hibiscusM
()

Перезагружается ПК с ИБП APC Smart 420

Моему ИБП около 3 лет.

В новом жилище, видимо, частые скачки напряжения. ПК перезагружается вместе с ИБП.

Самотестирование показало, что ИБП исправен, аккум заряжен. По инструкции оставляю ИБП включенным в сеть при выключенном остальном оборудовании для автоматической подзарядки батареи.

Что бы вы посоветовали? Проблема все-таки в истекающем сроке службы аккума, он не подзаряжается нормально?

 ,

hibiscusM
()

Error: Unable to find the CD-ROM. (Playonlinux)

sudo mount -o loop /home/mmm/iso/office2007.iso /media/mmm/cdrom

mount: /media/mmm/cdrom: WARNING: device write-protected, mounted read-only.

В Playonlinux в пункте 'where is your CD-ROM mounted?' при выборе пути /media/mmm/cdrom выдается ошибка Error: Unable to find the CD-ROM.

Как решить проблему?

 , ,

hibiscusM
()

Установка MS Office / PlayOnLinux

Был апгрейд ubuntu c 14.04 до 18.04.01. После чего перестали открываться файлы MS Word/Excel. До этого в 14.04 открывались отлично.

PlayOnLinux уже было установлено в ubuntu 18.04, можно выбрать MS office 2010 и установить.

Неясно, эти компоненты MS office, которые устанавливаются через PlayOnLinux, где хранятся, откуда берутся? Как это выяснить?

 , ,

hibiscusM
()

Удаление темы самостоятельно

Здравствуйте, мне нужно удалить созданную тему в разделе Hardware.

www.linux.org.ru/forum/linux-hardware/14454080?lastmod=1536146317555

Как это сделать самостоятельно? Либо это по запросу удаляется, если уже кто-то ответил в теме?

 

hibiscusM
()

Что думаете об этой ф-и (Python)

Function Description

It should return the smallest lexicographically higher
string possible from the given string or no answer.

biggerIsGreater has the following parameter(s):w (a string)

Вроде бы работает корректно.

def biggerIsGreater(w):

    def basic(w):
        combi=list(permutations(sorted(w)))
        index=combi.index(tuple(w))
        return "".join(combi[index+1]) if combi[-1] != tuple(w) else 'no answer'


    def res_calc(w):
        new_w=w[l-9:l]
        result=basic(new_w)
        if result=='no answer':
            result=new_w
        r=w[:l - 9] + result
        if r>w:
            return r
        else:
            return biggerIsGreater(w[:l - 9])

    l = len(w)

    if l < 10:
        return basic(w)
    else:
        return res_calc(w)

На hackerrank не награждают баллами, т.к. она слишком долгая по времени.

 ,

hibiscusM
()

RSS подписка на новые темы