1. Уважаемые гости и пользователи форума.
    Администрация настоятельно рекомендует не регистрировать несколько аккаунтов для одного пользователя. При выявлении наличия мультиаккаунтов будут заблокированы все учетные записи данного пользователя.
    Аккаунты, зарегистрированные на временную почту будут также заблокированы.

[Recomp]Сжатия файлов.

Тема в разделе "Досуг", создана пользователем Rodney Hawk, 11 янв 2017.

  1. Новичок

    Регистрация:
    11 янв 2017
    Сообщения:
    12
    Симпатии:
    0
    Народ подскажите.
    Начинаю сжатие в .bin, по началу все нормально. Но через какое-то время вылазит окно с "Завершением программы". Использую FreeArc [Precomp+Srep+FreeArc.bat]. Сжимаю папку с видео, видео в формате .mpg. В папке 169 элементов. Как быть?
     
  2. Ветеран Проверенный

    Регистрация:
    18 июн 2011
    Сообщения:
    881
    Симпатии:
    649
    Rodney Hawk, видео нельзя расжать
     
    Nemko нравится это.
  3. Ветеран

    Регистрация:
    18 сен 2014
    Сообщения:
    347
    Симпатии:
    41
    Пол:
    Мужской
    Rodney Hawk,
    В видео, используемом играми, применяется lossy-сжатие (то есть с потерями) и естественно, что архиваторами такое видео уже сжиматься не будет.
    Исключение составляет экскллюзивный пакер от релиз-группы Revenants для видео формата bik..
     
    ExPlayer нравится это.
  4. Ветеран

    Регистрация:
    5 мар 2014
    Сообщения:
    375
    Симпатии:
    69
    Которым они, к сожалению, никогда не поделятся :(
     
    Косой и Nemko нравится это.
  5. Ветеран

    Регистрация:
    26 дек 2014
    Сообщения:
    317
    Симпатии:
    189
    Пол:
    Мужской
    Блин, надо пост написать, о том, какие типы файлов и чем можно обрабатывать... А то люди, от безысходности, видео precomp'ом начинают разжимать :facepalm:
     
    ExPlayer, dixen18, Nemko и ещё 1-му нравится это.
  6. Новичок

    Регистрация:
    11 янв 2017
    Сообщения:
    12
    Симпатии:
    0
    Поддерживаю. Так как я новичок в этом. С Inno Setup я разобрался, научился писать скрипты и подключать в него модули. А вот с архиваторами проблема у меня)
     
  7. Новичок

    Регистрация:
    11 янв 2017
    Сообщения:
    12
    Симпатии:
    0
    Кстати говоря о архиваторах. Я не знаю какой архиватор использует Smart Installer Maker. Архивирует все без проблем в любой выводимый формат хоть он даже личным будет. Например даже взять R.G. Catalyst у него же архивы в .catalyst.
     
  8. Ветеран Модератор

    Регистрация:
    11 июн 2012
    Сообщения:
    433
    Симпатии:
    161
    Пол:
    Мужской
    у НИХ, это группа. это переименованные .arc архивы
     
  9. Ветеран

    Регистрация:
    26 дек 2014
    Сообщения:
    317
    Симпатии:
    189
    Пол:
    Мужской
    Rodney Hawk, просто измени расширение архива, при переименовании файла и будет тебе счастье)
     
  10. Ветеран

    Регистрация:
    18 сен 2014
    Сообщения:
    347
    Симпатии:
    41
    Пол:
    Мужской
    И еще не забудь то же расширение изменить в модуле ISDone
     
  11. Новичок

    Регистрация:
    11 янв 2017
    Сообщения:
    12
    Симпатии:
    0
    Господи люди можно мануал, пожалуйста.:flagoftruce:

    Я как бы вообще хочу знать как правильно архивировать объекты. И что каким архиваторам сжимать. И что бы при разархивировании инсталлером проблем не наблюдалось:greeting:
     
  12. Новичок

    Регистрация:
    11 янв 2017
    Сообщения:
    12
    Симпатии:
    0
    Я знаю, что это группа. Просто выразился как о личности.
     
  13. Old Men Проверенный

    Регистрация:
    17 июн 2011
    Сообщения:
    450
    Симпатии:
    415
    Пол:
    Мужской
    И не только. Мы ещё используем .cst
     
    Timick нравится это.
  14. Новичок

    Регистрация:
    11 янв 2017
    Сообщения:
    12
    Симпатии:
    0
    Ребят по поводу личных архивов. Все ли я правильно делаю? в модуле ISDone.
    Добавил екстракты такого вида:
    #ifdef Data1
    if not ISArcExtract ( 0, 0, ExpandConstant('{src}\data1.rh'), ExpandConstant('{app}\'), '', false, '{#Password}', '', ExpandConstant('{tmp}\'), ExpandConstant('{app}\'), notPCFonFLY{PCFonFLY}) then break;
    #endif
    И при компиляции выдает ошибку[​IMG], и не могу понять в чем дело. Я знаю что проблема {#NeedMem} но что именно с ним не так.
    Безымянный.jpg
     
    Последнее редактирование: 13 янв 2017
  15. Ветеран

    Регистрация:
    26 дек 2014
    Сообщения:
    317
    Симпатии:
    189
    Пол:
    Мужской
    Rodney Hawk, вместо "{#NeedMem}" поставь 0

    и замени эту строчку:
    Код (Inno):
    if not SrepInit('',512,0) then break;
    на эту:
    Код (Inno):
    if not SrepInit(ExpandConstant('{app}\'), 512, 0) then Break;
    А то у тебя временные файлы Srep'a создаются в Temp'e
     
  16. Новичок

    Регистрация:
    11 янв 2017
    Сообщения:
    12
    Симпатии:
    0
    Сделал все как ты сказал, теперь не компилится из-за этой ошибки. Безымянный.jpg
     
  17. Ветеран

    Регистрация:
    26 дек 2014
    Сообщения:
    317
    Симпатии:
    189
    Пол:
    Мужской
    Кинь скрипт сюды, исправлю =)
     
  18. Новичок

    Регистрация:
    11 янв 2017
    Сообщения:
    12
    Симпатии:
    0
    Код (Text):

    [UninstallDelete]
    Type: filesandordirs; Name: {app}

    [Code]
    const
      PCFonFLY=true;
      notPCFonFLY=false;

    var

      PBOldProc, PBBkgImg, PBImg: Longint;
      ISDoneProgressBar1: TNewProgressBar;
      LabelPct1,LabelCurrFileName,LabelTime1,LabelTime2,LabelTime3: TLabel;
      ISDoneCancel:integer;
      ISDoneError:boolean;
      PCFVer:double;

    type
      TCallback = function (OveralPct,CurrentPct: integer;CurrentFile,TimeStr1,TimeStr2,TimeStr3:PAnsiChar): longword;
      TCallbackProc = function(h:hWnd;Msg,wParam,lParam:Longint):Longint;

    function WrapCallback(callback:TCallback; paramcount:integer):longword;external 'wrapcallback@files:ISDone.dll stdcall delayload';

    function ISArcExtract(CurComponent:Cardinal; PctOfTotal:double; InName, OutPath, ExtractedPath: AnsiString; DeleteInFile:boolean; Password, CfgFile, WorkPath: AnsiString; ExtractPCF: boolean ):boolean; external 'ISArcExtract@files:ISDone.dll stdcall delayload';
    function IS7ZipExtract(CurComponent:Cardinal; PctOfTotal:double; InName, OutPath: AnsiString; DeleteInFile:boolean; Password: AnsiString):boolean; external 'IS7zipExtract@files:ISDone.dll stdcall delayload';
    function ISRarExtract(CurComponent:Cardinal; PctOfTotal:double; InName, OutPath: AnsiString; DeleteInFile:boolean; Password: AnsiString):boolean; external 'ISRarExtract@files:ISDone.dll stdcall delayload';
    function ISPrecompExtract(CurComponent:Cardinal; PctOfTotal:double; InName, OutFile: AnsiString; DeleteInFile:boolean):boolean; external 'ISPrecompExtract@files:ISDone.dll stdcall delayload';
    function ISSRepExtract(CurComponent:Cardinal; PctOfTotal:double; InName, OutFile: AnsiString; DeleteInFile:boolean):boolean; external 'ISSrepExtract@files:ISDone.dll stdcall delayload';
    function ISxDeltaExtract(CurComponent:Cardinal; PctOfTotal:double; minRAM,maxRAM:integer; InName, DiffFile, OutFile: AnsiString; DeleteInFile:boolean):boolean; external 'ISxDeltaExtract@files:ISDone.dll stdcall delayload';
    function ISPackZIP(CurComponent:Cardinal; PctOfTotal:double; InName, OutFile: AnsiString;ComprLvl:integer; DeleteInFile:boolean):boolean; external 'ISPackZIP@files:ISDone.dll stdcall delayload';
    function ShowChangeDiskWindow(Text, DefaultPath, SearchFile:AnsiString):boolean; external 'ShowChangeDiskWindow@files:ISDone.dll stdcall delayload';

    function Exec2 (FileName, Param: PAnsiChar;Show:boolean):boolean; external 'Exec2@files:ISDone.dll stdcall delayload';
    function ISFindFiles(CurComponent:Cardinal; FileMask:AnsiString; var ColFiles:integer):integer; external 'ISFindFiles@files:ISDone.dll stdcall delayload';
    function ISPickFilename(FindHandle:integer; OutPath:AnsiString; var CurIndex:integer; DeleteInFile:boolean):boolean; external 'ISPickFilename@files:ISDone.dll stdcall delayload';
    function ISGetName(TypeStr:integer):PAnsichar; external 'ISGetName@files:ISDone.dll stdcall delayload';
    function ISFindFree(FindHandle:integer):boolean; external 'ISFindFree@files:ISDone.dll stdcall delayload';
    function ISExec(CurComponent:Cardinal; PctOfTotal,SpecifiedProcessTime:double; ExeName,Parameters,TargetDir,OutputStr:AnsiString;Show:boolean):boolean; external 'ISExec@files:ISDone.dll stdcall delayload';

    function SrepInit(TmpPath:PAnsiChar;VirtMem,MaxSave:Cardinal):boolean; external 'SrepInit@files:ISDone.dll stdcall delayload';
    function PrecompInit(TmpPath:PAnsiChar;VirtMem:cardinal;PrecompVers:single):boolean; external 'PrecompInit@files:ISDone.dll stdcall delayload';
    function FileSearchInit(RecursiveSubDir:boolean):boolean; external 'FileSearchInit@files:ISDone.dll stdcall delayload';
    function ISDoneInit(RecordFileName:AnsiString; TimeType,Comp1,Comp2,Comp3:Cardinal; WinHandle, NeededMem:longint; callback:TCallback):boolean; external 'ISDoneInit@files:ISDone.dll stdcall';
    function ISDoneStop:boolean; external 'ISDoneStop@files:ISDone.dll stdcall';
    function ChangeLanguage(Language:AnsiString):boolean; external 'ChangeLanguage@files:ISDone.dll stdcall delayload';
    function SuspendProc:boolean; external 'SuspendProc@files:ISDone.dll stdcall';
    function ResumeProc:boolean; external 'ResumeProc@files:ISDone.dll stdcall';

    function WndProcCallBack(P:TCallbackProc;ParamCount:integer):LongWord; external 'wrapcallback@files:ISDone.dll stdcall delayload';
    function CallWindowProc(lpPrevWndFunc: Longint; hWnd: HWND; Msg: UINT; wParam, lParam: Longint): Longint; external 'CallWindowProcA@user32.dll stdcall';
    function SetWindowLong(Wnd: HWnd; Index: Integer; NewLong: Longint): Longint; external 'SetWindowLongA@user32.dll stdcall';

    function PBProc(h:hWnd;Msg,wParam,lParam:Longint):Longint;
    var
      pr,i1,i2 : Extended;
      w : integer;
    begin
      Result:=CallWindowProc(PBOldProc,h,Msg,wParam,lParam);
      if (Msg=$402) and (ISDoneProgressBar1.Position>ISDoneProgressBar1.Min) then begin
        i1:=ISDoneProgressBar1.Position-ISDoneProgressBar1.Min;
        i2:=ISDoneProgressBar1.Max-ISDoneProgressBar1.Min;
    //Вычисление видимой части изображения
        pr:=i1*100/i2;
       // w:=Round(459*pr/100);  //459-размер картинки по горизонтали
        //ImgSetPosition(PBImg,380,180,w,23);    //Расположение
         w:=Round(490*pr/100);
        ImgSetPosition(PBImg,338,219,w,28);
        ImgSetVisiblePart(PBImg,0,0,w,28);    //Расположение
        ImgApplyChanges(WizardForm.Handle);
      end;
    end;

    function ProgressCallback(OveralPct,CurrentPct: integer;CurrentFile,TimeStr1,TimeStr2,TimeStr3:PAnsiChar): longword;
    begin
      if OveralPct<=1000 then ISDoneProgressBar1.Position := OveralPct;
      LabelPct1.Caption := IntToStr(OveralPct div 10)+'.'+chr(48 + OveralPct mod 10)+'%';
      LabelCurrFileName.Caption:=ExpandConstant('{cm:ExtractedFile} ')+MinimizePathName(CurrentFile, LabelCurrFileName.Font, LabelCurrFileName.Width-ScaleX(100));
      LabelTime1.Caption:=ExpandConstant('{cm:ElapsedTime} ')+TimeStr2;
      LabelTime2.Caption:=ExpandConstant('{cm:RemainingTime} ')+TimeStr1;
      LabelTime3.Caption:=ExpandConstant('{cm:AllElapsedTime}')+TimeStr3;
      Result := ISDoneCancel;
    end;

    procedure CancelButtonOnClick(Sender: TObject);
    begin
      SuspendProc;
      if MsgBox(SetupMessage(msgExitSetupMessage), mbConfirmation, MB_YESNO) = IDYES then ISDoneCancel:=1;
      ResumeProc;
    end;

    procedure HideControls;
    begin
      WizardForm.FileNamelabel.Hide;
      LabelPct1.Hide;
      LabelCurrFileName.Hide;
      LabelTime1.Hide;
      LabelTime2.Hide;
      ImgSetVisibility(PBBkgImg,False);
      ImgSetVisibility(PBImg,False);
    end;

    procedure CreateControls;
    var
     PBTop:integer;
    begin
      PBTop:=ScaleY(50);
      PBOldProc:=0;
      PBBkgImg:=ImgLoad(WizardForm.Handle,ExpandConstant('{tmp}\pbbkg.png'),338,219,458,28,True,True);     //Расположение
      PBImg:=ImgLoad(WizardForm.Handle,ExpandConstant('{tmp}\pb.png'),338,219,0,32,True,True);           //Расположение
      ImgApplyChanges(WizardForm.Handle);

      ISDoneProgressBar1:= TNewProgressBar.Create(WizardForm);
      ISDoneProgressBar1.Parent:= WizardForm.InstallingPage;
      ISDoneProgressBar1.Width:= 0;
      ISDoneProgressBar1.Max:= 1000;

      LabelPct1 := TLabel.Create(WizardForm);
      with LabelPct1 do begin
        AutoSize:= false;
        WordWrap:= true;
        Font.Name:= 'Arial';
        Font.Size:= 10
        Font.Style := [fsBold];
        Transparent:= true;
        Font.Color:= $e1cc70;
        Parent:= WizardForm;
        AutoSize:= false;
        Left:= ScaleX(540);
        Top:= ScaleY(225);
        Width:= ScaleX(180);
        Transparent:= true;
        BringToFront;
      end;
      LabelCurrFileName := TLabel.Create(WizardForm);
      with LabelCurrFileName do begin
        Parent   := WizardForm.InstallingPage;
        AutoSize := False;
        Width    := ISDoneProgressBar1.Width+ScaleX(30);
        Left     := ScaleX(380);
        Top      := ScaleY(150);
      end;
      LabelTime1 := TLabel.Create(WizardForm);
      with LabelTime1 do begin
        Parent   := WizardForm.InstallingPage;
        AutoSize := False;
        Width    := ISDoneProgressBar1.Width div 2;
        Left     := ScaleX(0);
        Top      := PBTop + ScaleY(35);
      end;
      LabelTime2 := TLabel.Create(WizardForm);
      with LabelTime2 do begin
        Parent   := WizardForm.InstallingPage;
        AutoSize := False;
        Width    := LabelTime1.Width+ScaleX(40);
        Left     := ISDoneProgressBar1.Width div 2;
        Top      := LabelTime1.Top;
      end;
      LabelTime3 := TLabel.Create(WizardForm);
      with LabelTime3 do begin
        Parent   := WizardForm.FinishedPage;
        AutoSize := False;
        Width    := 300;
        Left     := 180;
        Top      := 200;
      end;
      PBOldProc:=SetWindowLong(ISDoneProgressBar1.Handle,-4,WndProcCallBack(@PBProc,4));
    end;

    function CheckError:boolean;
    begin
      result:= not ISDoneError;
    end;

    procedure CurStepChanged(CurStep: TSetupStep);
    var Comps1,Comps2,Comps3, TmpValue:cardinal;
        FindHandle1,ColFiles1,CurIndex1,tmp:integer;
        ExecError:boolean;
        InFilePath,OutFilePath,OutFileName:PAnsiChar;
    begin
      if CurStep = ssInstall then begin  //ssPostInstall
        WizardForm.ProgressGauge.Hide;
        WizardForm.CancelButton.Hide;
        CreateControls;
        WizardForm.CancelButton.OnClick := @CancelButtonOnClick;
        WizardForm.StatusLabel.Caption:=ExpandConstant('{cm:Extracted}');
        ISDoneCancel:=0;

    // Распаковка всех необходимых файлов в папку {tmp}.

    ExtractTemporaryFile('unarc.dll');

    #ifdef PrecompInside
    ExtractTemporaryFile('CLS-precomp.dll');
    ExtractTemporaryFile('packjpg_dll.dll');
    ExtractTemporaryFile('packjpg_dll1.dll');
    ExtractTemporaryFile('precomp.exe');
    ExtractTemporaryFile('zlib1.dll');
    #endif
    #ifdef SrepInside
    ExtractTemporaryFile('CLS-srep.dll');
    #endif
    #ifdef MSCInside
    ExtractTemporaryFile('CLS-MSC.dll');
    #endif
    #ifdef facompress
        ExtractTemporaryFile('facompress.dll'); //ускоряет распаковку .arc архивов.
    #endif
    #ifdef records
        ExtractTemporaryFile('records.inf');
    #endif
    #ifdef precomp
      #if precomp == "0.38"
        ExtractTemporaryFile('precomp038.exe');
      #else
        #if precomp == "0.4"
          ExtractTemporaryFile('precomp040.exe');
        #else
          #if precomp == "0.41"
            ExtractTemporaryFile('precomp041.exe');
          #else
            #if precomp == "0.42"
              ExtractTemporaryFile('precomp042.exe');
            #else
              ExtractTemporaryFile('precomp038.exe');
              ExtractTemporaryFile('precomp040.exe');
              ExtractTemporaryFile('precomp041.exe');
              ExtractTemporaryFile('precomp042.exe');
            #endif
          #endif
        #endif
      #endif
    #endif
    #ifdef unrar
        ExtractTemporaryFile('Unrar.dll');
    #endif
    #ifdef XDelta
        ExtractTemporaryFile('XDelta3.dll');
    #endif
    #ifdef PackZIP
        ExtractTemporaryFile('7z.dll');
        ExtractTemporaryFile('PackZIP.exe');
    #endif

        ExtractTemporaryFile('English.ini');

    // максимум 96 компонентов.
        Comps1:=0; Comps2:=0; Comps3:=0;
    #ifdef Components
        TmpValue:=1;
        if BtnGetChecked(LanguagetextButton[1]) then Comps1:=Comps1+TmpValue;     //компонент 1
        TmpValue:=TmpValue*2;
        if BtnGetChecked(LanguagetextButton[2]) then Comps1:=Comps1+TmpValue;     //компонент 2
        TmpValue:=TmpValue*2;
        if BtnGetChecked(LanguagevoiceButton[1]) then Comps1:=Comps1+TmpValue;    //компонент 3
        TmpValue:=TmpValue*2;
        if BtnGetChecked(LanguagevoiceButton[2]) then Comps1:=Comps1+TmpValue;    //компонент 4
    #endif

    #ifdef precomp
      PCFVer:={#precomp};
    #else
      PCFVer:=0;
    #endif
        ISDoneError:=true;
        if ISDoneInit(ExpandConstant('{src}\records.inf'), $F777, Comps1,Comps2,Comps3, MainForm.Handle, 0, @ProgressCallback) then begin
          repeat
    //        ChangeLanguage('English');
            if not SrepInit(ExpandConstant('{app}\'), 512, 0) then Break;
            if not PrecompInit('',128,PCFVer) then break;
            if not FileSearchInit(true) then break;
            #ifdef Data1
            if not ISArcExtract ( 0, 0, ExpandConstant('{src}\data1.rh'), ExpandConstant('{app}\'), '', false, '{#Password}', '', ExpandConstant('{tmp}\'), ExpandConstant('{app}\'), notPCFonFLY{PCFonFLY}) then break;
            #endif
            #ifdef Data2
            if not ISArcExtract ( 0, 0, ExpandConstant('{src}\data2.rh'), ExpandConstant('{app}\'), '', false, '{#Password}', '', ExpandConstant('{tmp}\'), ExpandConstant('{app}\'), notPCFonFLY{PCFonFLY}) then break;
            #endif
            #ifdef Data3
            if not ISArcExtract ( 0, 0, ExpandConstant('{src}\data3.rh'), ExpandConstant('{app}\'), '', false, '{#Password}', '', ExpandConstant('{tmp}\'), ExpandConstant('{app}\'), notPCFonFLY{PCFonFLY}) then break;
            #endif

    (*
            if not ISArcExtract    ( 0, 0, ExpandConstant('{src}\arc.arc'), ExpandConstant('{app}\'), '', false, '', ExpandConstant('{tmp}\arc.ini'), ExpandConstant('{app}\'), notPCFonFLY{PCFonFLY}) then break;
            if not IS7ZipExtract   ( 0, 0, ExpandConstant('{src}\CODMW2.7z'), ExpandConstant('{app}\data1'), false, '') then break;
            if not ISRarExtract    ( 0, 0, ExpandConstant('{src}\data_*.rar'), ExpandConstant('{app}'), false, '') then break;
            if not ISSRepExtract   ( 0, 0, ExpandConstant('{app}\data1024_1024.srep'),ExpandConstant('{app}\data1024.arc'), true) then break;
            if not ISPrecompExtract( 0, 0, ExpandConstant('{app}\data.pcf'),    ExpandConstant('{app}\data.7z'), true) then break;
            if not ISxDeltaExtract ( 0, 0, 0, 640, ExpandConstant('{app}\in.pcf'), ExpandConstant('{app}\*.diff'),   ExpandConstant('{app}\out.dat'), false) then break;
            if not ISPackZIP       ( 0, 0, ExpandConstant('{app}\1a1\*'), ExpandConstant('{app}\1a1.pak'), 2, false ) then break;
            if not ISExec          ( 0, 0, 0, ExpandConstant('{tmp}\Arc.exe'), ExpandConstant('x -o+ "{src}\001.arc" "{app}\"'), ExpandConstant('{tmp}'), '...',false) then break;
            if not ShowChangeDiskWindow ('Пожалуйста, вставьте второй диск и дождитесь его инициализации.', ExpandConstant('{src}'),'CODMW_2.arc') then break;

    //    распаковка группы файлов посредством внешнего приложения

            FindHandle1:=ISFindFiles(0,ExpandConstant('{app}\*.ogg'),ColFiles1);
            ExecError:=false;
            while not ExecError and ISPickFilename(FindHandle1,ExpandConstant('{app}\'),CurIndex1,true) do begin
              InFilePath:=ISGetName(0);
              OutFilePath:=ISGetName(1);
              OutFileName:=ISGetName(2);
              ExecError:=not ISExec(0, 0, 0, ExpandConstant('{tmp}\oggdec.exe'), '"'+InFilePath+'" -w "'+OutFilePath+'"',ExpandConstant('{tmp}'),OutFileName,false);
            end;
            ISFindFree(FindHandle1);
            if ExecError then break;
    *)

            ISDoneError:=false;
          until true;
          ISDoneStop;
        end;
        HideControls;
        WizardForm.CancelButton.Visible:=true;
        WizardForm.CancelButton.Enabled:=false;
      end;
      if (CurStep=ssPostInstall) and ISDoneError then begin
        Exec2(ExpandConstant('{uninstallexe}'), '/VERYSILENT', false);
      end;
    end;
     
  19. Ветеран

    Регистрация:
    26 дек 2014
    Сообщения:
    317
    Симпатии:
    189
    Пол:
    Мужской
    А ты компилировал модуль ISDone.iss?
    Компилировать нужно всегда основной модуль.
     
  20. Новичок

    Регистрация:
    11 янв 2017
    Сообщения:
    12
    Симпатии:
    0
    В смысле? Ну хорошо... Вот.
    Безымянный.jpg
     

Поделиться этой страницей