| 
 
 
 
 Легенда:
  новое сообщение 
  закрытая нитка 
  новое сообщение 
  в закрытой нитке 
  старое сообщение   | 
Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
Новичкам также крайне полезно ознакомиться с данным документом.
|  |  |  |  |  |  |  |  | Дык че? Типа, я зря старался?  14.10.05 18:47  Число просмотров: 12806 Автор: Den <Денис Т.> Статус: The Elderman
 |  
|  |  | <sysadmin> |  
| О, великие гуру бат-файлов, а может быть даже vbs-скриптов! I need your help…  05.07.05 07:10   [Den] Автор: HandleX <Александр М.> Статус: The Elderman
 |  
| Постановка задачи простая... Как у теоремы Ферма ;-) 
 Нужно делать периодически резервные копии... При помощи популярного архиватора, к примеру RAR. И при помощи Планировщика Windows, конечно же... Конечная цель работы скрипта -- файл архива в формате ДД-ММ-ГГГГ.rar
 
 Внимание, вопрос: как вставить дату в имя создаваемого файла при помощи бат-файла или скрипта?
 Можно, конечно же, наваять консольную софтинку... Но всё-таки хотелось бы встроенными средствами Windows.
 Заранее всем огромное спасибо за примеры.
 |  
|  | ну если ты хочешь чисто шелловскими возможностями то тогда...  31.03.06 20:27 Автор: AL_M Статус: Незарегистрированный пользователь
 |  
| ну если ты хочешь чисто шелловскими возможностями  то тогда идея такая: 
 time > time_stamp < "ENTER"
 edlin time_stamp < "2,10dENTERe"
 for /f "delims=: tokens=2,3,4" %i in (time_stamp) do set time_stamp =%i_%j_%k
 ну а затем вызываешь rar напр. передавая ему в качестве имени архива %time_stamp% (я просто опций рар-а не помню)
 
 дерзай!  проверено для вин2000
 
 ** в первых двух командах в "" взято содержимое предопределенных файлов которые нужно создать ручками  причем маленькие буквы -- то что нужно вводить как есть  БОЛЬШИЕ -- назв. спец символа (сам догадаешься какого)
 
 
 > Постановка задачи простая... Как у теоремы Ферма ;-)
 >
 > Нужно делать периодически резервные копии... При помощи
 > популярного архиватора, к примеру RAR. И при помощи
 > Планировщика Windows, конечно же... Конечная цель работы
 > скрипта -- файл архива в формате ДД-ММ-ГГГГ.rar
 >
 > Внимание, вопрос: как вставить дату в имя создаваемого
 > файла при помощи бат-файла или скрипта?
 > Можно, конечно же, наваять консольную софтинку... Но
 > всё-таки хотелось бы встроенными средствами Windows.
 > Заранее всем огромное спасибо за примеры.
 |  
|  | [NT+ (cmd.exe)] Делай раз, делай два... [upd3]  02.10.05 13:30 Автор: Den <Денис Т.> Статус: The Elderman
 Отредактировано 05.10.05 17:59  Количество правок: 13
 |  
| > Постановка задачи простая... Как у теоремы Ферма ;-) >
 > Нужно делать периодически резервные копии... При помощи
 > популярного архиватора, к примеру RAR. И при помощи
 > Планировщика Windows, конечно же... Конечная цель работы
 > скрипта -- файл архива в формате ДД-ММ-ГГГГ.rar
 
 Можно так:
 rar a -agDD-MM-YYYY -- \_.rar ...
 
 > Внимание, вопрос: как вставить дату в имя создаваемого
 > файла при помощи бат-файла или скрипта?
 > Можно, конечно же, наваять консольную софтинку... Но
 > всё-таки хотелось бы встроенными средствами Windows.
 > Заранее всем огромное спасибо за примеры.
 
 Здесь так:
 
 for /F "tokens=2,3,4 delims=- " %%i in ("%date%") do rar a %%k%%j%%i.rar ...
или
for /F "tokens=2,3,4 delims=- " %%i in ('date /t') do rar a %%k%%j%%i.rar ...---
 (Создается архив с датой в имени формата YYYYMMDD.rar
 Такое именование позволяет легко сортировать архивы по именам в правильной последовательности дат.)
 Обратите внимание, что данный пример приведен для представления даты в ОС формата "dd DD-MM-YYYY", где "dd" - день недели. Поэтому в delims, кроме "-" есть еще и " " (пробел).
 
 Еще вариант:
 
 rar a %date:~9,4%%date:~6,2%%date:~3,2%.rar ...
или
rar a %date:~-4%%date:~-7,2%%date:~-10,2%.rar ...
или
rar a %date:~-4,4%%date:~-7,-5%%date:~-10,-8%.rar ... ---
 Что равносильно.
 Также в формате YYYYMMDD - универсален для любых разделителей в представлении даты ОС.
 
 А это маленький оффтоп:
 (ответ Fly4life'у на http://bugtraq.ru/cgi-bin/forum.mcgi?type=sb&b=21&m=126845 (sorry, та ветка уже закрыта))
 
 for /F "eol=; tokens=1,2 delims= " %%i in (rules.txt) do move /Y %%i %%j ---
 Ко всему прочему, в файле rules.txt можно указывать несколько файлов, разделенных запятыми, для перемещения их в один каталог. Эта возможность поддерживается командой move.
 
 На десерт: Frequently Asked Questions Regarding The Windows 2000 Command Processor
 |  
|  |  | О, великий гуру, усложним задачу, сведя ее а очень...  03.10.05 11:33 Автор: DPP <Dmitry P. Pimenov> Статус: The Elderman
 Отредактировано 03.10.05 11:35  Количество правок: 1
 |  
| > А это маленький оффтоп: > (ответ Fly4life'у на
 > http://bugtraq.ru/cgi-bin/forum.mcgi?type=sb&b=21&m
 > =126845 (sorry, та ветка уже закрыта))
 > for /F "eol=; tokens=1,2 delims= " %%i in
 > (rules.txt) do move /Y %%i %%j
 
 О, великий гуру, усложним задачу, сведя ее к очень актуальной в нашей жизни. Для разгребания помойки полезно передвигать целые каталоги, если внутри нет свежих (менее полугода) файлов с рабочего на другой носитель/том/накопитель с сохранением структуры каталогов и прав доступа.
 |  
|  |  |  | Вот примеры VBScriptов для вашей задачи  06.10.05 09:34 Автор: svtvl Статус: Незарегистрированный пользователь
 |  
| > Для разгребания помойки полезно > передвигать целые каталоги, если внутри нет свежих (менее
 > полугода) файлов с рабочего на другой
 > носитель/том/накопитель с сохранением структуры каталогов и
 > прав доступа.
 
 Получение разницы дат (количество дней)
 Wscript.Echo "Days Differ between today and 1 september 2005 " & DateDiff("d","1/9/2005", Date )
 
 Получение даты файла
 Set objFSO = CreateObject("Scripting.FileSystemObject")
 Set objFile = objFSO.GetFile("c:\windows\system32\scrrun.dll")
 Wscript.Echo "Date last accessed: " & objFile.DateLastAccessed
 Wscript.Echo "Date last modified: " & objFile.DateLastModified
 
 Копирование каталога полностью, но права доступа меняются на права каталога приёмника
 список всех папок в папке
 strComputer = "." ' имя компютера
 Set objWMIService = GetObject("winmgmts:" _
 & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
 Set colFolders = objWMIService.ExecQuery( _
 "Select * from Win32_Directory where Name = 'd:\\test'")
 For Each objFolder in colFolders
 errResults  = objFolder.copy("c:\Archive")
 '     Wscript.Echo errResults, err.description
 '     Wscript.echo err.number
 Next
 
 получение списка файлов в папке
 Set objFSO = CreateObject("Scripting.FileSystemObject")
 Set objFolder = objFSO.GetFolder("d:\22")
 Set colFiles = objFolder.Files
 For Each objFile in colFiles
 Wscript.Echo objFile.Name, objFile.Size
 Next
 
 
 |  
|  |  |  | :) Только, пожалуйста, без приколов. Ok? Если хочешь, чтоб я помог, так и скажи. ;)  03.10.05 12:32 Автор: Den <Денис Т.> Статус: The Elderman
 |  
| А если у тебя уже есть решение, то лучше не тратить время в пустую. Задачка интересная. Можно попробовать.
 |  
|  |  |  |  | Ни каких приколов. Просто мне понравилась простота решения и...  03.10.05 16:26 Автор: DPP <Dmitry P. Pimenov> Статус: The Elderman
 |  
| > А если у тебя уже есть решение, то лучше не тратить время в > пустую.
 > Задачка интересная. Можно попробовать.
 
 Ни каких приколов. Просто мне понравилась простота решения и обрадовало что встречаются еще правильно мыслящие люди.
 Насчет помощи - глобально задача так пока не стоит, но очень полезно будет иметь ее решение. И я бы попользовался, и многим пригодилось бы.
 |  
|  |  |  |  |  | Тады вот такой батничик для начала: [upd4]  04.10.05 20:33 Автор: Den <Денис Т.> Статус: The Elderman
 Отредактировано 05.10.05 13:29  Количество правок: 9
 |  
| Скриптец позволяет расчитать дату по дельте дней от указанной даты и возвращает результат формата YYYYMMDD в стандартный вывод. Например, при стандарте РФ в представлении даты системы, для получения даты на 183 дня (примерно полгода) раньше текущей надо делать так (в bat файле):
 
 
for /F "tokens=* " %%i in ('calcdate.bat "dd DD.MM.YYYY" "%date%" -183') do set $date=%%i
set year=%$date:~0,4%
set month=%$date:~4,2%
set day=%$date:~-2%
rem Результат
echo YYYY=%year%; MM=%month%; DD=%day%
 ---
 Все параметры для calcdate.bat, кроме дельты,  обязательно указывать в двойных кавычках.
 С перемещением каталогов додумаю потом (я на работе все-таки), а пока вот вам новая "игрушка":
 
 
 
@echo off
rem ---------- calcdate.bat ----------
rem --- Written by Den[bugtraq.ru] ---
rem ----------------------------------
rem Enter: %1 - Формат передающейся даты в двойных кавычках: DD, MM, YYYY в любой последовательности с любыми разделителями. Пример: "dd DD-MM-YYYY", dd используются для пропускания дней недели.
rem %2 - Дата в двойных кавычках указанного в %1 формата
rem %3 - Дельта со знаком. Примеры: -180, +3
rem Exit: В стандартном выходе расчетная дата формата YYYYMMDD
setlocal
set $date=%~2
call :getpos YYYY "%~1"
if defined $pos (call set year=%%$date:~%$pos%,4%%) else goto :EOF
call :getpos MM "%~1"
if defined $pos (call set month=%%$date:~%$pos%,2%%) else goto :EOF
call :getpos DD "%~1"
if defined $pos (call set day=%%$date:~%$pos%,2%%) else goto :EOF
rem Отбрасываем признак восьмеричного числа.
for /F "tokens=* delims=0" %%i in ("%day%") do set /a daycount=%%i
for /F "tokens=* delims=0" %%i in ("%year%") do set /a year=%%i
for /F "tokens=* delims=0" %%i in ("%month%") do set /a month=%%i
rem Кол-во високосных
set /a i=(%year%-1)/4
rem Текущий после високосного, если j==4, то идет високосный
set /a j=%year%-%i%*4
rem Кол-во дней в полных годах до текущего
set /a daycount+=%i%*1461+(%j%-1)*365
set /a i=%month%
:loop
set /a i-=1
if %i%==0 goto :next
if %i%==1 set /a daycount+=31
if %i%==2 (if %j%==4 (set /a daycount+=29) else set /a daycount+=28)
if %i%==3 set /a daycount+=31
if %i%==4 set /a daycount+=30
if %i%==5 set /a daycount+=31
if %i%==6 set /a daycount+=30
if %i%==7 set /a daycount+=31
if %i%==8 set /a daycount+=31
if %i%==9 set /a daycount+=30
if %i%==10 set /a daycount+=31
if %i%==11 set /a daycount+=30
if %i%==12 set /a daycount+=31
goto :loop
:next
rem Days after christmas: %daycount%
set /a daycount+=%3
rem Result=%daycount%
set /a i=%daycount%/1461
set /a j=%daycount%-%i%*1461
if %j%==0 set /a i-=1
set /a daycount-=%i%*1461
set /a year=%i%*4
set /a i=%daycount%/365
if %j%==0 set /a i-=1
set /a j=%daycount%-%i%*365
if %j%==0 set /a i-=1
set /a daycount-=i*365
set /a i+=1
set /a year+=%i%
set /a j=%daycount%
set /a month=1
:loop_1
if %month%==1 set /a j-=31
if %month%==2 (if %i%==4 (set /a j-=29) else set /a j-=28)
if %month%==3 set /a j-=31
if %month%==4 set /a j-=30
if %month%==5 set /a j-=31
if %month%==6 set /a j-=30
if %month%==7 set /a j-=31
if %month%==8 set /a j-=31
if %month%==9 set /a j-=30
if %month%==10 set /a j-=31
if %month%==11 set /a j-=30
if %month%==12 set /a j-=31
if %j% LEQ 0 goto :next_1
set /a month+=1
set /a daycount=%j%
goto :loop_1
:next_1
set lz=0000
call :getlen "%year%"
set /a $len=4-%$len%
if not %$len%==0 call set year=%%lz:~-%$len%%%%year%
call :getlen "%month%"
set /a $len=2-%$len%
if not %$len%==0 call set month=%%lz:~-%$len%%%%month%
set /a days=%daycount%
call :getlen "%days%"
set /a $len=2-%$len%
if not %$len%==0 call call set days=%%lz:~-%$len%%%%days%
echo %year%%month%%days%
endlocal
goto :EOF
:getlen
rem Enter: %1 - Строка в двойных кавычках
rem Exit: $len - Длина строки без учета двойных кавычек
set par=%~1
set /a i=0
set $len=
:getlen_loop
call :getlen_1 "%%par:~%i%,1%%"
if defined $len goto :EOF
set /a i+=1
goto :getlen_loop
:getlen_1
if %1=="" set /a $len=%i%
goto :EOF
:getpos
rem Enter: %1 - Искомая строка в двойных кавычках
rem %2 - Строка-источник в двойных кавычках
rem Exit: $pos - Позиция искомой строки в строке-источнике без учета двойных кавычек.
call :getlen "%~1"
set /a $findlen=%$len%
call :getlen "%~2"
set /a $formatlen=%$len%-1
set par=%~2
set /a i=0
set $pos=
:getpos_loop
call :getpos_1 %i% "%~1" "%%par:~%i%,%$findlen%%%"
if defined $pos goto :EOF
if %i%==%$formatlen% goto :EOF
set /a i+=1
goto :getpos_loop
:getpos_1
if %2==%3 set /a $pos=%i%
goto :EOF
rem ---------- END calcdate.bat ----------
 ---
 |  
|  |  |  |  |  |  | Зря я это затеял...  05.10.05 11:44 Автор: DPP <Dmitry P. Pimenov> Статус: The Elderman
 Отредактировано 05.10.05 11:45  Количество правок: 1
 |  
| Можно то оно скорее всего можно, но не следует этого делать на командных интерпретаторах. Если уж работа с датами такая, то обходить каталоги, просматривая файлы на предмет даты их последнего изменения, вообще будет убийство. |  
|  |  |  |  |  |  |  | Не надо так думать! ;) Есть решение! [upd3]  07.10.05 17:19 Автор: Den <Денис Т.> Статус: The Elderman
 Отредактировано 16.07.07 16:43  Количество правок: 5
 |  
| Это у меня дата расчитывается по кол-ву дней, а ведь можно и упростить, сделать расчет по месяцам почти без изменения дня месяца. Получится немного быстрее, но просядет гибкость. 
 > Можно то оно скорее всего можно, но не следует этого делать
 > на командных интерпретаторах.
 
 Почему же?
 Все равно все это будет делаться ночью, запускаясь из шедулера. Не думаю, что у тебя уровень вложенности каталогов на столько велик, что скрипт не отработает за час.
 Мы же не будем даты каталогов конвертить через calcdate.bat.
 
 > Если уж работа с датами
 > такая, то обходить каталоги, просматривая файлы на предмет
 > даты их последнего изменения, вообще будет убийство.
 
 Это, как раз менее серьезная и менее времязатратная проблема.
 
 Решение задачи:
 (выполняется очень быстро за счет оптимизации парсинга подкаталогов)
 
 @echo off
rem ---------- deltabkp.cmd ----------
rem --- Written by Den[bugtraq.ru] ---
rem ----------------------------------
rem Enter: %1 - Source directory
rem   %2 - Date delta
setlocal
if "%~2"=="" (
  echo !Error! Date delta not defined.
  goto :eof
)
set /a datedelta=%~2
if "%~1"=="" (
  echo !Error! File directory not defined.
  goto :eof
)
set srcdir=%~f1
if "%srcdir:~-1,1%"=="\" set srcdir=%srcdir:~0,-1%
rem --- Получаем разделитель и формат даты
:loopreg
set regfile=%random%.reg
if exist %regfile% goto :loopreg
regedit /e %regfile% "HKEY_CURRENT_USER\Control Panel\International"
if not exist %regfile% (
  echo !Error! REG file not found.
  goto :eof
)
for /F "skip=2 tokens=1,* delims== eol=[" %%i in ('type %regfile%') do if "sDate"=="%%~i" (
  set datedelim=%%~j
) else if "sShortDate"=="%%~i" set dateform= %%~j
del /Q %regfile%
if not defined datedelim (
  echo !Error! Date delimiter not defined.
  goto :eof
) else if not defined dateform (
  echo !Error! Date format not defined.
  goto :eof
)
set dateform=%dateform:d=D%
set dateform=%dateform:m=M%
for /F "delims=yY tokens=1,*" %%k in ("%dateform%") do set dateform=%%kYYYY%%l
set dateform=%dateform:~1%
rem --- Получаем позиции DD,MM,YYYY
for /F "delims=%datedelim% tokens=1,2,3" %%i in ("%dateform%") do (
  if "%%i"=="DD" (
    if "%%j"=="MM" (set $dateorder=%%z%%y%%%x
    ) else (set $dateorder=%%y%%z%%%x
  )) else if "%%i"=="MM" (
    if "%%j"=="DD" (set $dateorder=%%z%%x%%%y
    ) else (set $dateorder=%%y%%x%%%z
  )) else (
    if "%%j"=="DD" (set $dateorder=%%x%%z%%%y
    ) else (set $dateorder=%%x%%y%%%z
  ))
)
rem --- Получаем дату по дельте от текущей
for /F %%i in ('calcdate.cmd "dd %dateform%" "%date%" %datedelta%') do set $date=%%i
:looptmpfile
set tmpfile=%temp%\dbp%random%.tmp
if exist %tmpfile% goto :looptmpfile
set lvl=0
set baklvl=0
set $dir=
rem "File Not Found" error message from "dir "%~1\*" /a-d/4" command to NUL
call :nextlvl "%srcdir%" 2>nul
if exist %tmpfile% del /Q %tmpfile%
endlocal
goto :eof
:do
rem ----- START BACKUP -----
rem Examples
rem call backup.cmd "%~1"
rem rar m -cfg- -ep2 -idp -m5 -os -ow -s -t -- old_%$date%.rar "%~1"
echo dir=%1
rem ------ END BACKUP ------
goto :eof
:nextlvl
set /a lvl+=1
set /a baklvl+=1
for /F %%d in ('dir /b /ad "%~1\*"') do (
  call :nextlvl "%~1\%%d"
)
if %baklvl% LSS %lvl% (
rem --- New files in subdirectories
  set /a updlvl=%lvl%-1
  set /a lvl-=1
  goto :eof
)
set updated=0
dir "%~1\*" /a-d/4 >nul
if errorlevel 0 (
  for /F "skip=5 tokens=1 eol=  " %%f in ('dir "%~1\*" /a-d/4') do (
    for /F "tokens=1,2,3 delims=%datedelim%" %%x in ("%%f") do (
      if not "%%y"=="" (
        if %$dateorder% GTR %$date% set updated=-1
      )))
)
if %updated%==-1 (
rem --- New files found in directory
  if %baklvl% GTR %lvl% (
  rem --- Old files in subdirectories, back it up!
    for /F "tokens=*" %%f in (%tmpfile%) do call :do %%f
    del /Q %tmpfile%
  )
  set /a lvl-=1
  goto :eof
) else (
rem --- New Files not found in directory
  set baklvl-=1
  echo "%~1" >>%tmpfile%
)
:ret
set /a lvl-=1
goto :eof---
 |  
|  |  |  |  |  |  |  |  | Дык че? Типа, я зря старался?  14.10.05 18:47 Автор: Den <Денис Т.> Статус: The Elderman
 |  
|  |  
|  |  |  |  |  |  |  |  |  | Как это зря... Очень нужно. Сейчас загружен, есть только полчаса в день чтоб к компу подойти. Дай еще пару дней.  18.10.05 15:11 Автор: DPP <Dmitry P. Pimenov> Статус: The Elderman
 |  
|  |  
|  |  |  |  |  |  |  |  |  |  | Таки ты попробовал?  22.03.06 13:37 Автор: Den <Денис Т.> Статус: The Elderman
 |  
|  |  
|  |  |  |  |  |  |  |  |  |  |  | Ну да, забыл сразу отписать. Глючит. Пару каталогов с...  22.03.06 16:38 Автор: DPP <Dmitry P. Pimenov> Статус: The Elderman
 |  
| Ну да, забыл сразу отписать. Глючит. Пару каталогов с файлами порядка 2002-2004 года один выдает, другой нет. С чем связано, пока не разобрался. Склепаю dir и то что она выдает и кину. |  
|  |  |  |  |  |  |  |  |  |  |  |  | А может и не должен? [upd]  28.03.06 17:03 Автор: Den <Денис Т.> Статус: The Elderman
 Отредактировано 17.09.13 20:09  Количество правок: 2
 |  
| Алгоритм работы следующий: 
 1. Если в каталоге со "старыми" файлами существует подкаталог с "новыми" файлами, то ничего не бэкапится.
 
 2. Если в каталоге с "новыми" файлами существуют подкаталоги со "старыми" файлами, то бэкапятся подкаталоги.
 
 3. Если в каталоге и подкаталогах только "старые" файлы, то бэкапится верхний каталог вместе с подкаталогами.
 
 [upd]
 Действительно глючило. Нашел одну серьезную ошибку. Поправил.
 Добавил доп.функционал, теперь скрипт сам определяет формат даты системы.
 |  
|  |  |  |  |  |  |  |  |  |  |  |  |  | Где новая версия?  19.09.13 00:33 Автор: DPP <Dmitry P. Pimenov> Статус: The Elderman
 |  
|  |  
|  |  |  |  |  |  |  |  |  |  |  |  |  |  | думаю, не актуально  21.09.13 05:50 Автор: Den <Денис Т.> Статус: The Elderman
 |  
|  |  
|  | Этим занимается One-click BackUp for WinRAR...  31.08.05 09:22 Автор: Игорь Статус: Незарегистрированный пользователь
 |  
| > Постановка задачи простая... Как у теоремы Ферма ;-) >
 > Нужно делать периодически резервные копии... При помощи
 > популярного архиватора, к примеру RAR. И при помощи
 > Планировщика Windows, конечно же... Конечная цель работы
 > скрипта -- файл архива в формате ДД-ММ-ГГГГ.rar
 
 Этим занимается One-click BackUp for WinRAR (http://acritum.com). Есть встроенный планировщик и поддержка коммандной строки для внешнего планировщика. Программа шарварная, но в xUSSR продают за любую цену, начиная от 150 рублей :) Я купил себе через Webmoney за 200 рублей - совсем не жалею, программа реально очень удобная и стоит того, чтобы за нее заплатить. Есть русский интерфейс. Была еще совсем бесплатная версия 1.x без многих функций, добавленных в версии 2.x (очень примитивный планировщик, нет поддержки CDRW, FTP, SMTP, LAN, нет удаленного контроля через интернет и LAN, но на жесткий диск бэкапит без проблем).
 |  
|  | Nncron и без рара бы справился  22.07.05 10:59 Автор: Annihitor Статус: Незарегистрированный пользователь
 |  
| > Можно, конечно же, наваять консольную софтинку... Но > всё-таки хотелось бы встроенными средствами Windows.
 > Заранее всем огромное спасибо за примеры.
 
 Ненадо ничего ваять. Если бы рар не умел делать такие файлы то есть NNCRON
 http://www.nncron.ru/
 позволяет назначать любые задания и алгоритмы для управления ПК, дефргагментацию, архивацию, синхронизацию времени, выключение, обновление, получение почты, отработка горячих клавих, окошек и т.п. практически полностью может заменить своими макросами простые действия пользователя.
 Программа просто незаменима, в некоторых случаях.
 |  
 
 
 |  |