[/b/] [/d/] [/tu/] [/a/] [/ph/] [/wa/] [/cg/] [/t/] [/p/]

[Burichan] [Foliant] [Futaba] [Greenhell] [Gurochan] [Photon] - [Home] [Manage] [Archive]

[Return]
Posting mode: Reply
Leave these fields empty (spam trap):
Name
Link
Subject
Comment
File
Verification
Password (for post and file deletion)
  • Supported file types are: GIF, JPG, PDF, PNG
  • Maximum file size allowed is 30720 KB.
  • Images greater than 200x200 pixels will be thumbnailed.

File: 1692807278561.jpg -(714780 B, 1200x1200) Thumbnail displayed, click image for full size.
714780 No.217061  

Скрипты/софт облегчающий жизнь.

Прошлый тред >>174285

>> No.217063  

>>217058
POSIX это не про легкие пути.

>> No.217387  

Для тех, кто любит попытаться выжать невыжимаемое из прыщей при помощи fireдолбоеба.
https://github.com/netblue30/firejail/issues/2874
Пиздец. Пол часа дрочил strace, еще пол часа гуглил.

>> No.217428  

Говноскрипт на питухоне для интеграции крысы в и3. Употреблядь вместе с xfce4-genmon-plugin при помощи cat $lockFile.

#!/bin/python3
import i3ipc
import os
import sys

# Just so you know my idea to use lock file has lead to a fuck up because it
# didn't always get removed, so I figured I'd use PID instead, so the lock file
# is actually the file, which holds the message.

home = os.environ.get('HOME')
lockDir = '%s/.cache' % home
pidDir = '%s/.run' % home
f = 0 # nevermind

def perror(msg, err):
print('%s: %s' % (msg, err))

def trymkdir(path):
try:
os.mkdir(path)
except FileExistsError:
pass
except Exception as e:
perror(path, e)
sys.exit(1)

trymkdir(lockDir)
trymkdir(pidDir)

lock = '%s/i3ipc-mode.lock' % lockDir
pidFile = '%s/i3ipc-mode.pid' % pidDir

pid = os.getpid()
oldpid = 0
try:
f = open(pidFile, "r")
except FileNotFoundError:
pass
except Exception as e:
perror(pidFile, e)
os.exit(1)
else:
oldpid = f.read().strip()
if oldpid.isdigit():
oldpid = int(oldpid)
f.close()
else:
perror(oldpid, 'Not PID of a process!')
sys.exit(1)
if os.path.exists('%s/%d' % ('/proc', oldpid)):
print('Already running.')
sys.exit(0)

def trywrite(path, msg):
try:
f = open(path, 'w')
f.write(msg)
f.close()
except Exception as e:
perror(path, e)
sys.exit(1)

trywrite(pidFile, '%d' % pid)
trywrite(lock, 'default')

def ISR_mode(con, event):
mode = event.change
# output designed for genmon xfce4-plugin
if mode != 'default':
mode = '<span fgcolor=\'Red\'>%s</span>' % mode
mode = '<txt>%s</txt>' % mode
trywrite(lock, mode)
os.system('xfce4-panel --plugin-event=genmon:refresh:bool:true')

i3ipc_conn = i3ipc.Connection()
i3ipc_conn.on('mode', ISR_mode)
i3ipc_conn.main()

def tryremove(path):
try:
os.remove(path)
except Exception as e:
perror(path, e)
sys.exit(1)

tryremove(lock)
tryremove(pidFile)
>> No.217811  

>>194560
Можно использовать gnome-boxes, вроде приемлимо выглядит по нынешним времнам и вместе с гномьей щелью ставится.
https://help.gnome.org/users/gnome-boxes/stable/

>> No.217814  

Автозапуск иксов после логина в tty1. Последней строчкой в ~/.profile:

[ -z $DISPLAY ] && [ $XDG_VTNR -eq 1 ] && exec startx

После Ctrl+Alt+Backspace они сразу перезапускаются. Для выходы из графики придётся логиниться во второй tty, например.

>> No.217816  

>>217814

if [ "${XDG_SESSION_TYPE}${XDG_VTNR}" = "tty1" ]; then
startx
fi
>> No.217817  

>>217814
ничоси!

>> No.217825  

https://scoop.sh

- Eliminates permission popup windows
- Hides GUI wizard-style installers
- Prevents PATH pollution from installing lots of programs
- Avoids unexpected side-effects from installing and uninstalling programs
- Finds and installs dependencies automatically
- Performs all the extra setup steps itself to get a working program

>> No.218240  
sxiv -o *jpg | xargs -I + mv + new/path/

Посмотреть пикчи, отметить нужные клавишей m, вывести их названия в stdout, где их подхватит xargs.

>> No.218302  
File: 1698713576858.png -(303891 B, 451x450) Thumbnail displayed, click image for full size.
303891

Заменить черный цвет на прозрачность в папке и подпапках, преобразовать jpg в png с прозрачностью, разброс распознания черного 10%

find /home/pic -type f -iname "*.png" -o -iname "*.jpg" -o -iname "*.jpeg" | while read file; do convert "$file" -fuzz 10% -transparent black "${file%.png}_transparent.png"
Где:
/путь/к/каталогу - это путь к корневой папке, в которой находятся ваши изображения.

-type f - это опция find, которая ищет только файлы, а не директории.
-iname "*.png" -o -iname "*.jpg" -o -iname "*.jpeg" - это фильтры для поиска файлов с расширениями PNG, JPEG и JPG.
convert "$file" -fuzz XX% -transparent black "${file%.png}_transparent.png" - это команда для каждого найденного файла. Она выполняет замену черного цвета на прозрачность с использованием ImageMagick и сохраняет измененное изображение с суффиксом "_transparent.png" в той же директории.

Принимаю заказы на написание регулярок нейросеткой, эта хуйня отлично справляется.

>> No.218304  
File: 1698739169861.jpg -(56488 B, 1280x714) Thumbnail displayed, click image for full size.
56488

>>218302
A guro po vashemu kankolle esche ne sdelali? Gde zapisat'sya, chtoby sdelali?

>> No.218306  
File: 1698745779349.png -(13615 B, 56x111) Thumbnail displayed, click image for full size.
13615

>>218302

>> No.218316  

>>218302

> -iname "*.jpg"
> "${file%.png}_transparent.png"

лол, ты бы хотябы проверяй перед тем как постить

>> No.218320  

>>218316
УМВР.

>> No.218323  

Проверка по кд и переподключение L2TP соединения в случае отвала. По хорошему нужно еще замутить киллсвич но я сырна.

#!/bin/bash
while [ "true" ]
do
VPNCON=$(nmcli con status)
if [[ $VPNCON != 'CONNECTION NAME' ]]; then
echo "Disconnected, trying to reconnect..."
(sleep 1s && nmcli con up uuid CONNECTION UUID)
else
echo "Already connected !"
fi
sleep 30
done
>> No.218338  

>>218323
Opensnitch.
c:chi

>> No.218408  

test

>> No.218412  

Уцух, я честно пытался, но у тебя какая-то Critical SQL Error. Это tar архив тремя сообщениями, щас я объясню.

bm90aWZ5LmgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDA2NDQAMDAwMTc1
MQAwMDAxNzUxADAwMDAwMDAwMTQ1ADE0NTIxMjM1NzAxADAxMjcyNwAgMAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhciAgAG5pa2l0aWNoAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAbmlraXRpY2gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAj
aWZuZGVmIE5PVElGWV9ICiNkZWZpbmUgTk9USUZZX0gKdm9pZCBub3RpZnlfdm9sdW1lIChpbnQs
IGludCk7CnZvaWQgbm90aWZ5X211dGUgKGludCwgaW50KTsKI2VuZGlmCgAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHBh
dmN0bC5oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAwNjQ0ADAwMDE3NTEA
MDAwMTc1MQAwMDAwMDAwMDQyMwAxNDUyMTIzNTcwMQAwMTI3MDcAIDAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0YXIgIABuaWtpdGljaAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAG5pa2l0aWNoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI2lm
bmRlZiBQQVZDVExfSAojZGVmaW5lIFBBVkNUTF9ICgojaWZkZWYgRVhURVJOQUwKZXh0ZXJuIGNo
YXIgREVCVUdfTEVWRUw7CmV4dGVybiBjaGFyIE5PX05PVElGWTsKI2Vsc2UKY2hhciBERUJVR19M
RVZFTCA9IDE7CmNoYXIgTk9fTk9USUZZID0gMDsKI2VuZGlmCgojZGVmaW5lIERCRyhMRVYsIC4u
LikgeyBcCiAgICBpZiAoKERFQlVHX0xFVkVMKSA+PSAoTEVWKSkgeyBcCiAgICAgICAgZnByaW50
ZiAoc3RkZXJyLCBfX1ZBX0FSR1NfXyk7IFwKICAgIH0gXAp9CiNlbmRpZgoAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABub3Rp
ZnkuYwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwMDY0NAAwMDAxNzUxADAw
MDE3NTEAMDAwMDAwMDM2NjEAMTQ1MjEyMzU3MDEAMDEyNzMwACAwAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyICAAbmlraXRpY2gAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAABuaWtpdGljaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACNkZWZp
bmUgRVhURVJOQUwKI2luY2x1ZGUgPGxpYm5vdGlmeS9ub3RpZnkuaD4KI2luY2x1ZGUgPHN0ZGxp
Yi5oPgojaW5jbHVkZSAicGF2Y3RsLmgiCiNpbmNsdWRlICJub3RpZnkuaCIKCmludCBpbml0ZWQg
PSAwOwoKI2RlZmluZSBpbml0KCkgXAp7IFwKICAgIGlmIChOT19OT1RJRlkpIHJldHVybjsgXAog
ICAgaWYgKCFpbml0ZWQpIHsgXAogICAgICAgIGlmIChub3RpZnlfaW5pdCAoInBhdmN0bCIpID09
IEZBTFNFKSB7IFwKICAgICAgICAgICAgREJHKCAyLCBcCiAgICAgICAgICAgICAgICAgICAgIiVz
OiAlcywgJXNcbiIsIFwKICAgICAgICAgICAgICAgICAgICAibm90aWZ5X2luaXQiLCBcCiAgICAg
ICAgICAgICAgICAgICAgImZhaWxlZCB0byBpbml0aWFsaXplIGxpYm5vdGlmeSIsIFwKICAgICAg
ICAgICAgICAgICAgICAibm90IHNlbmRpbmcgYW55IG5vdGlmaWNhdGlvbnMiIFwKICAgICAgICAg
ICAgICAgKTsgXAogICAgICAgICAgICByZXR1cm47IFwKICAgICAgICB9IFwKICAgICAgICBpbml0
ZWQgPSAxOyBcCiAgICB9IFwKfQoKdm9pZApub3RpZnlfdm9sdW1lCigKIGludCB0YXJnZXQsCiBp
bnQgdm9sCikKewogICAgaW5pdCgpOwogICAgY2hhciBzdHJbNjRdOwogICAgY2hhciBzeW0xW10g
PSAi8J+UiSI7CiAgICBjaGFyIHN5bTJbXSA9ICLwn46kIjsKICAgIGNoYXIgKnN5bTsKICAgIHN3
aXRjaCAodGFyZ2V0KSB7CiAgICAgICAgY2FzZSAwOgogICAgICAgICAgICBzeW0gPSBzeW0xOwog
ICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgIHN5bSA9IHN5bTI7
CiAgICAgICAgICAgIGJyZWFrOwogICAgfQogICAgc25wcmludGYgKHN0ciwgc2l6ZW9mIChzdHIp
LCAiJXM6ICVkIiwgc3ltLCB2b2wpOwogICAgTm90aWZ5Tm90aWZpY2F0aW9uICpuID0gbm90aWZ5
X25vdGlmaWNhdGlvbl9uZXcgKHN0ciwgTlVMTCwgTlVMTCk7CiAgICBub3RpZnlfbm90aWZpY2F0
aW9uX3NldF9oaW50X3N0cmluZyAobiwKICAgICAgICAgICAgIngtY2Fub25pY2FsLXByaXZhdGUt
c3luY2hyb25vdXMiLAogICAgICAgICAgICAicGF2Y3RsLXZvbHVtZSIKICAgICAgICAgICAgKTsK
ICAgIG5vdGlmeV9ub3RpZmljYXRpb25fc2hvdyAobiwgTlVMTCk7CiAgICBnX29iamVjdF91bnJl
ZiAoR19PQkpFQ1QobikpOwogICAgcmV0dXJuOwp9Cgp2b2lkCm5vdGlmeV9tdXRlCigKIGludCB0
YXJnZXQsCiBpbnQgbXV0ZQopCnsKICAgIGluaXQoKTsKICAgIGNoYXIgc3RyWzY0XTsKICAgIGNo
YXIgd2hvMVtdID0gIlNvdW5kIjsKICAgIGNoYXIgd2hvMltdID0gIk1pY3JvcGhvbmUiOwogICAg
Y2hhciB1bltdID0gInVuIjsKICAgIGNoYXIgZW1wW10gPSAiIjsKICAgIGNoYXIgc3ltW10gPSAi
8J+UhyI7CiAgICBjaGFyICp1OwogICAgY2hhciAqd2hvOwogICAgc3dpdGNoICh0YXJnZXQpIHsK
ICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgIHdobyA9IHdobzE7CiAgICAgICAgICAgIGJyZWFr
OwogICAgICAgIGNhc2UgMToKICAgICAgICAgICAgd2hvID0gd2hvMjsKICAgICAgICAgICAgYnJl
YWs7CiAgICB9CiAgICBpZiAobXV0ZSkKICAgICAgICB1ID0gZW1wOwogICAgZWxzZQogICAgICAg
IHUgPSB1bjsKICAgIHNucHJpbnRmIChzdHIsIHNpemVvZiAoc3RyKSwgIiVzOiAlcyBpcyAlc211
dGVkIiwgc3ltLCB3aG8sIHUpOwogICAgTm90aWZ5Tm90aWZpY2F0aW9uICpuID0gbm90aWZ5X25v
dGlmaWNhdGlvbl9uZXcgKHN0ciwgTlVMTCwgTlVMTCk7CiAgICBub3RpZnlfbm90aWZpY2F0aW9u
X3NldF9oaW50X3N0cmluZyAobiwKICAgICAgICAgICAgIngtY2Fub25pY2FsLXByaXZhdGUtc3lu
Y2hyb25vdXMiLAogICAgICAgICAgICAicGF2Y3RsLW11dGUiCiAgICAgICAgICAgICk7CiAgICBu
b3RpZnlfbm90aWZpY2F0aW9uX3Nob3cgKG4sIE5VTEwpOwogICAgZ19vYmplY3RfdW5yZWYgKEdf
T0JKRUNUKG4pKTsKICAgIHJldHVybjsKfQoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcGF2Y3RsLmMA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDA2NDQAMDAwMTc1MQAwMDAxNzUx
ADAwMDAwMDU2NDU0ADE0NTIxMjM1NzAxADAxMjcyMQAgMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhciAgAG5pa2l0aWNoAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAbmlraXRpY2gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjZGVmaW5lIF9Q
T1NJWF9DX1NPVVJDRSAyMDA4MDlMCiNkZWZpbmUgX0RFRkFVTFRfU09VUkNFCiNpbmNsdWRlIDxl
cnJuby5oPgojaW5jbHVkZSA8cHVsc2UvcHVsc2VhdWRpby5oPgojaW5jbHVkZSA8c3RkaW8uaD4K
I2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxzdHJpbmcu
aD4KI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiNpbmNsdWRlIDxtYXRoLmg+CiNpbmNsdWRlIDx1bmlz
dGQuaD4KI2luY2x1ZGUgPGZjbnRsLmg+CiNpbmNsdWRlICJwYXZjdGwuaCIKI2luY2x1ZGUgIm5v
dGlmeS5oIgoKI2RlZmluZSBDS0ZBSUxDKExFViwgRk5BTUUsIFdITywgTVNHLCBDT05ELCBSRVRW
QUwpIHsgXAogICAgaWYgKENPTkQpIHsgXAogICAgICAgIERCRyggTEVWLCBcCiAgICAgICAgICAg
ICAiJXM6ICVzOiAlcyAlc1xuIiwgXAogICAgICAgICAgICAgRk5BTUUsIFwKICAgICAgICAgICAg
IFdITywgXAogICAgICAgICAgICAgImZhaWxlZCB0byIsIFwKICAgICAgICAgICAgIE1TRyBcCiAg
ICAgICAgICAgKTsgXAogICAgICAgIHJldHVybiBSRVRWQUw7IFwKICAgIH0gXAp9CgojZGVmaW5l
IFBBX0ZVQ0tPRkYoY3R4LCBtbCkgeyBcCiAgICBwYV9jb250ZXh0X2Rpc2Nvbm5lY3QgKGN0eCk7
IFwKICAgIHBhX2NvbnRleHRfdW5yZWYgKGN0eCk7IFwKICAgIHBhX21haW5sb29wX2ZyZWUgKG1s
KTsgXAp9CgojZGVmaW5lIFBBX0NPTlRFWFRfRkFJTEVEX0VSUiAxCiNkZWZpbmUgUEFfQ09OVEVY
VF9URVJNSU5BVEVEX0VSUiAyCiNkZWZpbmUgUEFfU0VUX1NJTktfVk9MVU1FX0VSUiAzCiNkZWZp
bmUgUEFfU0VUX1NPVVJDRV9WT0xVTUVfRVJSIDQKI2RlZmluZSBQQV9PUEVSQVRJT05fQ0FOQ0VM
TEVEX0VSUiA1Ci8vIG5leHQgdHdvIG1heSBiZSBkdWUgdG8gc29tZSBzaW5rIG5hbWluZyBmdWNr
dXBzLCBzaG91bGRuJ3QKLy8gbm9ybWFsbHkgaGFwcGVuLCBubyBpZGVhIGhvdyB0byBkZWJ1ZyBp
ZiBub3QgbmFtaW5nIGZ1Y2t1cAojZGVmaW5lIFBBX0dFVF9TSU5LX1NUQVRFX0VSUiA2CiNkZWZp
bmUgUEFfR0VUX1NPVVJDRV9TVEFURV9FUlIgNwojZGVmaW5lIENPTlZFUlNJT05fVE9fVk9MVU1F
X0ZBSUxFRF9FUlIgOAojZGVmaW5lIFZPTFVNRV9PVVRfT0ZfQk9VTkRBUklFU19FUlIgOQojZGVm
aW5lIE9QVElPTl9OT19BUkdfRVJSIDEwCiNkZWZpbmUgUEFfR0VUX1NJTktfTkFNRV9FUlIgMTEK
I2RlZmluZSBQQV9HRVRfU09VUkNFX05BTUVfRVJSIDEyCiNkZWZpbmUgUEFfU0VUX1NJTktfTVVU
RV9FUlIgMTMKI2RlZmluZSBQQV9TRVRfU09VUkNFX01VVEVfRVJSIDEzCiNkZWZpbmUgTk9fSE9N
RV9FUlIgMTQKI2RlZmluZSBTWVNDQUxMX0VSUiAxNQojZGVmaW5lIEFMUkVBRFlfUlVOTklOR19F
UlIgMTYKI2RlZmluZSBVTktOT1dOX0VSUiAxMjcKCiNkZWZpbmUgTUlOVk9MVU1FIDAKI2RlZmlu
ZSBNQVhWT0xVTUUgMTUwCgplbnVtIHsKICAgIEhFTFAgPSAwLAogICAgU0VULAogICAgR0VULAog
ICAgSU5DLAogICAgREVDLAogICAgTUlDLAogICAgU0lOSywKICAgIE1VVEUsCiAgICBOT05PVElG
WSwKICAgIFlFU05PVElGWQp9OwoKZW51bSB7CiAgICBHRVRfU0VSVl9JTkZPLAogICAgR0VUX1NJ
TktfU1QsCiAgICBHRVRfU09VUkNFX1NULAogICAgU0VUX1NJTktfVk9MLAogICAgU0VUX1NJTktf
TVVURSwKICAgIFNFVF9TT1VSQ0VfVk9MLAogICAgU0VUX1NPVVJDRV9NVVRFCn07CgpzdHJ1Y3Qg
dm9sdW1lX211dGUgewogICAgcGFfY3ZvbHVtZSAqdm9sOwogICAgaW50IG11dGU7Cn07CgppbnQg
cGFfcmVhZHkgPSAwOwoKdm9pZApwYV9nZXRfZGVmYXVsdF9zZXJ2ZXJfaW5mb19jYgooCiBwYV9j
b250ZXh0ICpjLAogY29uc3QgcGFfc2VydmVyX2luZm8gKmksCiB2b2lkICpkYXRhCikKewogICAg
Y2hhciAqKnVzZXJkYXRhOwogICAgdXNlcmRhdGEgPSBkYXRhOwogICAgdXNlcmRhdGFbMF0gPSBz
dHJkdXAgKGktPmRlZmF1bHRfc2lua19uYW1lKTsKICAgIHVzZXJkYXRhWzFdID0gc3RyZHVwIChp
LT5kZWZhdWx0X3NvdXJjZV9uYW1lKTsKICAgIHJldHVybjsKfQoKdm9pZApwYV9nZXRfc2lua19j
dm9sdW1lX2NiCigKIHBhX2NvbnRleHQgKmMsCiBjb25zdCBwYV9zaW5rX2luZm8gKmksCiBpbnQg
ZW9sLAogdm9pZCAqZGF0YQopCnsKICAgIGlmIChlb2wpCiAgICAgICAgcmV0dXJuOwoKICAgIHN0
cnVjdCB2b2x1bWVfbXV0ZSAqdm07CiAgICB2bSA9IGRhdGE7CiAgICAqKHZtLT52b2wpID0gaS0+
dm9sdW1lOwogICAgdm0tPm11dGUgPSBpLT5tdXRlOwogICAgcmV0dXJuOwp9Cgp2b2lkCnBhX2dl
dF9zb3VyY2VfY3ZvbHVtZV9jYgooCiBwYV9jb250ZXh0ICpjLAogY29uc3QgcGFfc291cmNlX2lu
Zm8gKmksCiBpbnQgZW9sLAogdm9pZCAqZGF0YQopCnsKICAgIGlmIChlb2wpCiAgICAgICAgcmV0
dXJuOwoKICAgIHN0cnVjdCB2b2x1bWVfbXV0ZSAqdm07CiAgICB2bSA9IGRhdGE7CiAgICAqKHZt
LT52b2wpID0gaS0+dm9sdW1lOwogICAgdm0tPm11dGUgPSBpLT5tdXRlOwogICAgcmV0dXJuOwp9
Cgp2b2lkCnBhX3N1Y2Nlc3NfY2IKKAogcGFfY29udGV4dCAqYywKIGludCBzdWNjZXNzLAogdm9p
ZCAqZGF0YQopCnsKICAgIGludCAqaSA9IGRhdGE7CiAgICAqaSA9IHN1Y2Nlc3M7Cn0KCnZvaWQK
cGFfaGFuZGxlX3N0YXRlX2NiCigKIHBhX2NvbnRleHQgKmMsCiB2b2lkICpkYXRhCikKewogICAg
cGFfbWFpbmxvb3AgKnBhX21sOwogICAgcGFfbWwgPSBkYXRhOwoKICAgIERCRygyLCAicGFfaGFu
ZGxlX3N0YXRlOiBlbnRlcmVkIGZ1bmN0aW9uIGJvZHkuXG4iKTsKICAgIHN3aXRjaCAocGFfY29u
dGV4dF9nZXRfc3RhdGUoYykpIHsKICAgICAgICBjYXNlIFBBX0NPTlRFWFRfUkVBRFk6CiAgICAg
ICAgICAgIERCRyggMiwKICAgICAgICAgICAgICAgICAiJXM6ICVzXG4iLAogICAgICAgICAgICAg
ICAgICJwYV9oYW5kbGVfc3RhdGUiLAogICAgICAgICAgICAgICAgICJDb25uZWN0aW9uIHJlYWR5
LiIKICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgcGFfcmVhZHkgPSAxOwogICAgICAgICAg
ICByZXR1cm47CiAgICAgICAgY2FzZSBQQV9DT05URVhUX0ZBSUxFRDoKICAgICAgICAgICAgREJH
KCAyLAogICAgICAgICAgICAgICAgICIlczogJXNcbiIsCiAgICAgICAgICAgICAgICAgInBhX2hh
bmRsZV9zdGF0ZSIsCiAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBjb25uZWN0IHRvIHB1bHNl
YWRpbyBkYWVtb24uIgogICAgICAgICAgICAgICApOwogICAgICAgICAgICBQQV9GVUNLT0ZGKGMs
IHBhX21sKTsKICAgICAgICAgICAgZXhpdChQQV9DT05URVhUX0ZBSUxFRF9FUlIpOwogICAgICAg
IGNhc2UgUEFfQ09OVEVYVF9URVJNSU5BVEVEOgogICAgICAgICAgICBEQkcoIDIsCiAgICAgICAg
ICAgICAgICAgIiVzOiAlc1xuIiwKICAgICAgICAgICAgICAgICAicGFfaGFuZGxlX3N0YXRlIiwK
ICAgICAgICAgICAgICAgICAiUHVsc2VhZGlvIGNvbm5lY3Rpb24gdGVybWluYXRlZC4iCiAgICAg
ICAgICAgICAgICk7CiAgICAgICAgICAgIFBBX0ZVQ0tPRkYoYywgcGFfbWwpOwogICAgICAgICAg
ICBleGl0KFBBX0NPTlRFWFRfVEVSTUlOQVRFRF9FUlIpOwogICAgICAgIGRlZmF1bHQ6CiAgICAg
ICAgICAgIERCRyggMiwKICAgICAgICAgICAgICAgICAiJXM6ICVzXG4iLAogICAgICAgICAgICAg
ICAgICJwYV9oYW5kbGVfc3RhdGUiLAogICAgICAgICAgICAgICAgICJDb25uZWN0aW9uIHN0YXRl
IG5vdCBoYW5kbGVkIChpZ25vcmVkKS4iCiAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIHBh
X3JlYWR5ID0gMDsKICAgICAgICAgICAgYnJlYWs7CiAgICB9Cn0KCmludApwYV9wZXJmb3JtX2Fj
dGlvbgooCiBwYV9jb250ZXh0ICpjLAogcGFfbWFpbmxvb3AgKm1sLAogY2hhciAqKnNpc29uLAog
c3RydWN0IHZvbHVtZV9tdXRlICp2bXMsIC8vIGl0J3MgYXJyYXkhISEKIGludCBhY3Rpb24sCiBp
bnQgKnNldGVycgopCnsKICAgIGNoYXIgZm5hbWVbXSA9ICJwYV9wZXJmb3JtX2FjdGlvbiI7CiAg
ICBjaGFyIGZwYXRbXSA9ICIlczogJXNcbiI7CiAgICBpbnQgb3BlcmF0aW9uID0gMDsKICAgIHBh
X29wZXJhdGlvbiAqcGFfb3A7CiAgICBwYV9vcGVyYXRpb25fc3RhdGVfdCBwYV9zdGF0ZTsKCiAg
ICBEQkcoIDIsCiAgICAgICAgIGZwYXQsCiAgICAgICAgIGZuYW1lLAogICAgICAgICAiRW50ZXJp
bmcgbG9vcC4iCiAgICAgICApOwogICAgd2hpbGUgKDEpIHsKICAgICAgICBEQkcoIDIsCiAgICAg
ICAgICAgICBmcGF0LAogICAgICAgICAgICAgZm5hbWUsCiAgICAgICAgICAgICAiQ2hlY2tpbmcg
aWYgcHVsc2VhZGlvIGlzIHJlYWR5LiIKICAgICAgICAgICApOwogICAgICAgIGlmICghcGFfcmVh
ZHkpIHsKICAgICAgICAgICAgREJHKCAyLAogICAgICAgICAgICAgICAgIGZwYXQsCiAgICAgICAg
ICAgICAgICAgZm5hbWUsCiAgICAgICAgICAgICAgICAgIk5vdCByZWFkeS4gSXRlcmF0aW5nIG1h
aW5sb29wLiIKICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgcGFfbWFpbmxvb3BfaXRlcmF0
ZSAobWwsIDEsIE5VTEwpOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CgogICAgICAg
IERCRyggMiwKICAgICAgICAgICAgIGZwYXQsCiAgICAgICAgICAgICBmbmFtZSwKICAgICAgICAg
ICAgICJQdWxzZWFkaW8gcmVhZHkuIgogICAgICAgICAgICk7CiAgICAgICAgY2hhciBmcGF0Mltd
ID0gIiVzOiAlczogJXNcbiI7CiAgICAgICAgY2hhciBhY3Rpb25zdHJbMjU2XTsKICAgICAgICBp
ZiAoIW9wZXJhdGlvbikgewogICAgICAgICAgICBtZW1zZXQgKGFjdGlvbnN0ciwgMCwgc2l6ZW9m
IChjaGFyKSAqIDI1Nik7CiAgICAgICAgICAgIHN3aXRjaCAoYWN0aW9uKSB7CiAgICAgICAgICAg
ICAgICBjYXNlIEdFVF9TRVJWX0lORk86CiAgICAgICAgICAgICAgICAgICAgc3RyY3B5IChhY3Rp
b25zdHIsICJHRVRfU0VSVl9JTkZPIik7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAg
ICAgICAgICAgICBjYXNlIEdFVF9TSU5LX1NUOgogICAgICAgICAgICAgICAgICAgIHN0cmNweSAo
YWN0aW9uc3RyLCAiR0VUX1NJTktfU1QiKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAg
ICAgICAgICAgICAgIGNhc2UgR0VUX1NPVVJDRV9TVDoKICAgICAgICAgICAgICAgICAgICBzdHJj
cHkgKGFjdGlvbnN0ciwgIkdFVF9TT1VSQ0VfU1QiKTsKICAgICAgICAgICAgICAgICAgICBicmVh
azsKICAgICAgICAgICAgICAgIGNhc2UgU0VUX1NJTktfVk9MOgogICAgICAgICAgICAgICAgICAg
IHN0cmNweSAoYWN0aW9uc3RyLCAiU0VUX1NJTktfVk9MIik7CiAgICAgICAgICAgICAgICAgICAg
YnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIFNFVF9TSU5LX01VVEU6CiAgICAgICAgICAgICAg
ICAgICAgc3RyY3B5IChhY3Rpb25zdHIsICJTRVRfU0lOS19WT0wiKTsKICAgICAgICAgICAgICAg
ICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgU0VUX1NPVVJDRV9WT0w6CiAgICAgICAg
ICAgICAgICAgICAgc3RyY3B5IChhY3Rpb25zdHIsICJTRVRfU09VUkNFX1ZPTCIpOwogICAgICAg
ICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSBTRVRfU09VUkNFX01VVEU6
CiAgICAgICAgICAgICAgICAgICAgc3RyY3B5IChhY3Rpb25zdHIsICJTRVRfU09VUkNFX01VVEUi
KTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAg
ICAgICAgc3dpdGNoIChvcGVyYXRpb24pIHsKICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAg
ICAgICAgREJHKCAyLAogICAgICAgICAgICAgICAgICAgICBmcGF0MiwKICAgICAgICAgICAgICAg
ICAgICAgZm5hbWUsCiAgICAgICAgICAgICAgICAgICAgIGFjdGlvbnN0ciwKICAgICAgICAgICAg
ICAgICAgICAgInNlbmRpbmcgcmVxdWVzdCIKICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAg
ICAgICAgICBzd2l0Y2ggKGFjdGlvbikgewogICAgICAgICAgICAgICAgICAgIGNhc2UgR0VUX1NF
UlZfSU5GTzoKICAgICAgICAgICAgICAgICAgICAgICAgcGFfb3AgPSBwYV9jb250ZXh0X2dldF9z
ZXJ2ZXJfaW5mbyAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYywKICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBwYV9nZXRfZGVmYXVsdF9zZXJ2ZXJfaW5mb19jYiwKICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXNvbgogICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAg

>> No.218413  

ICAgICAgIGNhc2UgR0VUX1NJTktfU1Q6CiAgICAgICAgICAgICAgICAgICAgICAgIHBhX29wID0g
cGFfY29udGV4dF9nZXRfc2lua19pbmZvX2J5X25hbWUgKAogICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lzb25bMF0sCiAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFfZ2V0X3NpbmtfY3ZvbHVtZV9jYiwKICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdm1zWzBdCiAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAg
ICAgICAgICAgY2FzZSBHRVRfU09VUkNFX1NUOgogICAgICAgICAgICAgICAgICAgICAgICBwYV9v
cCA9IHBhX2NvbnRleHRfZ2V0X3NvdXJjZV9pbmZvX2J5X25hbWUgKAogICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lzb25b
MV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFfZ2V0X3NvdXJjZV9jdm9sdW1l
X2NiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2bXNbMV0KICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAg
ICAgICAgICAgICAgICAgICBjYXNlIFNFVF9TSU5LX1ZPTDoKICAgICAgICAgICAgICAgICAgICAg
ICAgcGFfb3AgPSBwYV9jb250ZXh0X3NldF9zaW5rX3ZvbHVtZV9ieV9uYW1lICgKICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IHNpc29uWzBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZtc1swXS52b2wsCiAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFfc3VjY2Vzc19jYiwKICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBzZXRlcnIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICApOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBj
YXNlIFNFVF9TSU5LX01VVEU6CiAgICAgICAgICAgICAgICAgICAgICAgIHBhX29wID0gcGFfY29u
dGV4dF9zZXRfc2lua19tdXRlX2J5X25hbWUgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lzb25bMF0sCiAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgdm1zWzBdLm11dGUsCiAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgcGFfc3VjY2Vzc19jYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBzZXRlcnIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAg
ICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIFNFVF9TT1VSQ0VfVk9M
OgogICAgICAgICAgICAgICAgICAgICAgICBwYV9vcCA9IHBhX2NvbnRleHRfc2V0X3NvdXJjZV92
b2x1bWVfYnlfbmFtZSAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYywKICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBzaXNvblsxXSwKICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICB2bXNbMV0udm9sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBh
X3N1Y2Nlc3NfY2IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0ZXJyCiAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJl
YWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSBTRVRfU09VUkNFX01VVEU6CiAgICAgICAgICAg
ICAgICAgICAgICAgIHBhX29wID0gcGFfY29udGV4dF9zZXRfc291cmNlX211dGVfYnlfbmFtZSAo
CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYywKICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBzaXNvblsxXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2bXNb
MV0ubXV0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYV9zdWNjZXNzX2NiLAog
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldGVycgogICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAg
b3BlcmF0aW9uKys7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAxOgog
ICAgICAgICAgICAgICAgREJHKCAyLAogICAgICAgICAgICAgICAgICAgICBmcGF0MiwKICAgICAg
ICAgICAgICAgICAgICAgZm5hbWUsCiAgICAgICAgICAgICAgICAgICAgIGFjdGlvbnN0ciwKICAg
ICAgICAgICAgICAgICAgICAgImhhbmRsaW5nIHJlcXVlc3QgcmVzdWx0IgogICAgICAgICAgICAg
ICAgICAgKTsKICAgICAgICAgICAgICAgIHBhX3N0YXRlID0gcGFfb3BlcmF0aW9uX2dldF9zdGF0
ZSAocGFfb3ApOwogICAgICAgICAgICAgICAgc3dpdGNoIChwYV9zdGF0ZSkgewogICAgICAgICAg
ICAgICAgICAgIGNhc2UgUEFfT1BFUkFUSU9OX0RPTkU6CiAgICAgICAgICAgICAgICAgICAgICAg
IERCRyggMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcGF0MiwKICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBmbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rp
b25zdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlcXVlc3QgY29tcGxldGUiCiAg
ICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8g
bG9vcGV4aXQ7CiAgICAgICAgICAgICAgICAgICAgY2FzZSBQQV9PUEVSQVRJT05fUlVOTklORzoK
ICAgICAgICAgICAgICAgICAgICAgICAgREJHKCAyLAogICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGZwYXQyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZuYW1lLAogICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGFjdGlvbnN0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAicmVxdWVzdCBpcyBiZWluZyBwcm9jZXNzZWQiCiAgICAgICAgICAgICAgICAgICAgICAgICAg
ICk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNh
c2UgUEFfT1BFUkFUSU9OX0NBTkNFTExFRDoKICAgICAgICAgICAgICAgICAgICAgICAgREJHKCAy
LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwYXQyLAogICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGZuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbnN0ciwK
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVxdWVzdCBjYW5jZWxsZWQiCiAgICAgICAg
ICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIHBhX29wZXJhdGlv
bl91bnJlZiAocGFfb3ApOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUEFfT1BFUkFU
SU9OX0NBTkNFTExFRF9FUlI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVh
azsKICAgICAgICB9CiAgICAgICAgcGFfbWFpbmxvb3BfaXRlcmF0ZSAobWwsIDEsIE5VTEwpOwog
ICAgfQpsb29wZXhpdDoKICAgIHBhX29wZXJhdGlvbl91bnJlZiAocGFfb3ApOwogICAgcmV0dXJu
IDA7Cn0KCmludAp2YWxwZXJjZW50CigKIGludCB2b2wKKQp7CiAgICBpZiAoTUlOVk9MVU1FID4g
dm9sIHx8IHZvbCA+IE1BWFZPTFVNRSkKICAgICAgICByZXR1cm4gVk9MVU1FX09VVF9PRl9CT1VO
REFSSUVTX0VSUjsKICAgIHJldHVybiAwOwp9CgppbnQKc3RyMnBlcmNlbnQKKAogY29uc3QgY2hh
ciAqc3RyLAogaW50ICpwZXJjZW50CikKewogICAgY2hhciAqZW5kcHRyWzFdOwogICAgZG91Ymxl
IHRtcDsKCiAgICB0bXAgPSBzdHJ0b2QgKHN0ciwgZW5kcHRyKTsKICAgIGlmICgqKmVuZHB0ciAh
PSAnXDAnKQogICAgICAgIHJldHVybiBDT05WRVJTSU9OX1RPX1ZPTFVNRV9GQUlMRURfRVJSOwoK
ICAgICpwZXJjZW50ID0gKGludCkgcm91bmQgKHRtcCk7CiAgICByZXR1cm4gMDsKfQoKaW50Cmlk
ZW50aWZ5X29wdAooCiBjb25zdCBjaGFyICpvcHQKKQp7CiAgICBpZiAoc3RybGVuIChvcHQpIDwg
MikgcmV0dXJuIC0xOwogICAgaWYgKCFzdHJuY21wICgiLWgiLCBvcHQsIDMpKSByZXR1cm4gSEVM
UDsKICAgIGlmICghc3RybmNtcCAoIi1zIiwgb3B0LCAzKSkgcmV0dXJuIFNFVDsKICAgIGlmICgh
c3RybmNtcCAoIi1nIiwgb3B0LCAzKSkgcmV0dXJuIEdFVDsKICAgIGlmICghc3RybmNtcCAoIi1p
Iiwgb3B0LCAzKSkgcmV0dXJuIElOQzsKICAgIGlmICghc3RybmNtcCAoIi1kIiwgb3B0LCAzKSkg
cmV0dXJuIERFQzsKICAgIGlmICghc3RybmNtcCAoIi1ubiIsIG9wdCwgNCkpIHJldHVybiBOT05P
VElGWTsKICAgIGlmICghc3RybmNtcCAoIi1ueSIsIG9wdCwgNCkpIHJldHVybiBZRVNOT1RJRlk7
CiAgICBpZiAoIXN0cm5jbXAgKCItbWljIiwgb3B0LCA1KSkgcmV0dXJuIE1JQzsKICAgIGlmICgh
c3RybmNtcCAoIi1zaW5rIiwgb3B0LCA2KSkgcmV0dXJuIFNJTks7CiAgICBpZiAoIXN0cm5jbXAg
KCItbXV0ZSIsIG9wdCwgNikpIHJldHVybiBNVVRFOwogICAgcmV0dXJuIC0xOwp9CgpjaGFyIGhl
bHBfbXNnW10gPSAiVXNhZ2U6IHBhdmN0bCA8b3B0aW9ucz5cblwKT3B0aW9uczpcblwKICAtaDog
aGVscC5cblwKICAtczogc2V0IHZvbHVtZS5cblwKICAtZzogZ2V0IHZvbHVtZS5cblwKICAtaTog
aW5jcmVhc2Ugdm9sdW1lLlxuXAogIC1kOiBkZWNyZWFzZSB2b2x1bWUuXG5cCiAgLW1pYzogd29y
ayB3aXRoIG1pY3JvcGhvbmUgaW5zdGVhZCBvZiBzcGVha2Vycy5cblwKICAtc2luazogZ28gYmFj
ayB0byBzcGVha2Vycy5cblwKICAtbXV0ZTogbXV0ZS5cblwKICAtbm46IG5vIG5vdGlmaWNhdGlv
bnMuXG5cCiAgLW55OiB5ZXMgbm90aWZpY2F0aW9uLlxuXApFeGFtcGxlIDE6IHBhdmN0bCAtcyA1
MCAtbWljIC1zIDgwIC1zaW5rIC1nXG5cCkV4YW1wbGUgMjogcGF2Y3RsIC1ubiAtcyA0MCAtbnkg
LXMgMzAiOwoKCnZvaWQKcHJpbnRfaGVscCAoKQp7CiAgICBwdXRzIChoZWxwX21zZyk7Cn0KCmlu
dAptYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCnsKICAgIGlmIChhcmdjID09IDEgfHwgc3Ry
Y21wKGFyZ3ZbMV0sICItaCIpID09IDApIHsKICAgICAgICBwcmludF9oZWxwICgpOwogICAgICAg
IHJldHVybiAwOwogICAgfQogICAgCiAgICBjaGFyIGZuYW1lW10gPSAibWFpbiI7CiAgICBpbnQg
cmVzOwoKICAgIGNoYXIgKmhvbWU7CiAgICBob21lID0gZ2V0ZW52ICgiSE9NRSIpOwogICAgaWYg
KCFob21lKSB7CiAgICAgICAgREJHKDEsICIlczogJXNcbiIsIGZuYW1lLCAiSE9NRSB2YXJpYWJs
ZSBpcyBub3QgZGVmaW5lZCIpOwogICAgICAgIHJldHVybiBOT19IT01FX0VSUjsKICAgIH0KICAg
IGNoYXIgc3VwW10gPSAiLy5jYWNoZS9wYXZjdGwubG9jayI7CgogICAgaW50IGhvbWVsZW4sIHN1
cGxlbjsKICAgIGhvbWVsZW4gPSBzdHJsZW4gKGhvbWUpOwogICAgc3VwbGVuID0gc3RybGVuIChz
dXApOwoKICAgIGNoYXIgbG9ja2ZpbGVbaG9tZWxlbiArIHN1cGxlbiArIDFdOwogICAgc3ByaW50
ZiAobG9ja2ZpbGUsIGhvbWUpOwogICAgc3ByaW50ZiAobG9ja2ZpbGUgKyBob21lbGVuLCBzdXAp
OwoKICAgIHJlcyA9IGFjY2VzcyAobG9ja2ZpbGUsIEZfT0spOwogICAgaWYgKHJlcyA9PSAwKSB7
CiAgICAgICAgaWYgKGNobW9kIChsb2NrZmlsZSwgIFNfSVJVU1IgfCBTX0lXVVNSKSA9PSAtMSkg
ewogICAgICAgICAgICBEQkcoMSwgIiVzOiAlczogJXM6ICVzXG4iLCBmbmFtZSwgImNobW9kIiwg
bG9ja2ZpbGUsCiAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IgKGVycm5vKSk7CiAgICAgICAg
ICAgIHJldHVybiBTWVNDQUxMX0VSUjsKICAgICAgICB9CiAgICB9IGVsc2UgaWYgKHJlcyA9PSAt
MSkgewogICAgICAgIERCRygxLCAiJXM6ICVzOiAlczogJXNcbiIsIGZuYW1lLCAiYWNjZXNzIiwg
bG9ja2ZpbGUsCiAgICAgICAgICAgICAgICBzdHJlcnJvciAoZXJybm8pKTsKICAgICAgICByZXR1
cm4gU1lTQ0FMTF9FUlI7CiAgICB9CgogICAgaW50IGZkOwogICAgZmQgPSBvcGVuIChsb2NrZmls
ZSwgT19SRFdSIHwgT19UUlVOQyB8IE9fQ1JFQVQpOwogICAgaWYgKGZkIDwgMCkgewogICAgICAg
IERCRygxLCAiJXM6ICVzOiAlczogJXNcbiIsIGZuYW1lLCAib3BlbiIsIGxvY2tmaWxlLCBzdHJl
cnJvciAoZXJybm8pKTsKICAgICAgICByZXR1cm4gU1lTQ0FMTF9FUlI7CiAgICB9CgogICAgaWYg
KGxvY2tmIChmZCwgRl9UTE9DSywgMCkpIHsKICAgICAgICBEQkcoMiwgIkFscmVhZHkgcnVubmlu
Zy5cbiIpOwogICAgICAgIHJldHVybiBBTFJFQURZX1JVTk5JTkdfRVJSOwogICAgfQogICAgZWxz
ZQogICAgICAgIGxvY2tmIChmZCwgRl9MT0NLLCAwKTsKCiAgICBwYV9tYWlubG9vcCAqcGFfbWw7
CiAgICBwYV9tYWlubG9vcF9hcGkgKnBhX2FwaTsKICAgIHBhX2NvbnRleHQgKnBhX2N0eDsKCiAg
ICBwYV9tbCA9IHBhX21haW5sb29wX25ldyAoKTsKICAgIHBhX2FwaSA9IHBhX21haW5sb29wX2dl
dF9hcGkgKHBhX21sKTsKICAgIHBhX2N0eCA9IHBhX2NvbnRleHRfbmV3IChwYV9hcGksICJ2b2x1
bWVjdGwiKTsKCiAgICBwYV9jb250ZXh0X3NldF9zdGF0ZV9jYWxsYmFjayAocGFfY3R4LCBwYV9o
YW5kbGVfc3RhdGVfY2IsIHBhX21sKTsKICAgIHBhX2NvbnRleHRfY29ubmVjdCAocGFfY3R4LCBO
VUxMLCAwLCBOVUxMKTsKCiAgICBjaGFyICpzaXNvblsyXTsKICAgIHNpc29uWzBdID0gTlVMTDsK
ICAgIHNpc29uWzFdID0gTlVMTDsKICAgIGNoYXIgZmFpbHNlZVtdID0gImNvbXBsZXRlIHJlcXVl
c3QsIHNlZSBleGl0IHN0YXR1cyI7CiAgICBzdHJ1Y3Qgdm9sdW1lX211dGUgdm1zWzJdOwogICAg
cGFfY3ZvbHVtZSB2c1syXTsKICAgIHZtc1swXS52b2wgPSAmdnNbMF07CiAgICB2bXNbMV0udm9s
ID0gJnZzWzFdOwoKICAgIHJlcyA9IHBhX3BlcmZvcm1fYWN0aW9uICgKICAgICAgICAgICAgcGFf
Y3R4LAogICAgICAgICAgICBwYV9tbCwKICAgICAgICAgICAgc2lzb24sCiAgICAgICAgICAgIHZt
cywKICAgICAgICAgICAgR0VUX1NFUlZfSU5GTywKICAgICAgICAgICAgTlVMTAogICAgICAgICAg
ICApOwogICAgQ0tGQUlMQygyLCBmbmFtZSwgIkdFVF9TRVJWX0lORk8iLCBmYWlsc2VlLCByZXMs
IHJlcyk7CiAgICBDS0ZBSUxDKDIsIGZuYW1lLCAiR0VUX1NFUlZfSU5GTyIsICJnZXQgc2luayBu
YW1lIiwgKCFzaXNvblswXSksCiAgICAgICAgICAgIFBBX0dFVF9TSU5LX05BTUVfRVJSKTsKICAg
IENLRkFJTEMoMiwgZm5hbWUsICJHRVRfU0VSVl9JTkZPIiwgImdldCBzb3VyY2UgbmFtZSIsICgh
c2lzb25bMV0pLAogICAgICAgICAgICBQQV9HRVRfU09VUkNFX05BTUVfRVJSKTsKCiAgICByZXMg
PSBwYV9wZXJmb3JtX2FjdGlvbiAoCiAgICAgICAgICAgIHBhX2N0eCwKICAgICAgICAgICAgcGFf
bWwsCiAgICAgICAgICAgIHNpc29uLAogICAgICAgICAgICB2bXMsCiAgICAgICAgICAgIEdFVF9T
SU5LX1NULAogICAgICAgICAgICBOVUxMCiAgICAgICAgICAgICk7CiAgICBDS0ZBSUxDKDIsIGZu
YW1lLCAiU0VUX1NJTktfU1QiLCBmYWlsc2VlLCByZXMsIHJlcyk7CiAgICBDS0ZBSUxDKDIsIGZu
YW1lLCAiU0VUX1NJTktfU1QiLCAiZ2V0IHNpbmsgc3RhdGUiLAogICAgICAgICAgICAodm1zWzBd
LnZvbC0+Y2hhbm5lbHMgPT0gMCksCiAgICAgICAgICAgIFBBX0dFVF9TSU5LX1NUQVRFX0VSUik7
CgogICAgcmVzID0gcGFfcGVyZm9ybV9hY3Rpb24gKAogICAgICAgICAgICBwYV9jdHgsCiAgICAg
ICAgICAgIHBhX21sLAogICAgICAgICAgICBzaXNvbiwKICAgICAgICAgICAgdm1zLAogICAgICAg
ICAgICBHRVRfU09VUkNFX1NULAogICAgICAgICAgICBOVUxMCiAgICAgICAgICAgICk7CiAgICBD
S0ZBSUxDKDIsIGZuYW1lLCAiU0VUX1NPVVJDRV9TVCIsIGZhaWxzZWUsIHJlcywgcmVzKTsKICAg
IENLRkFJTEMoMiwgZm5hbWUsICJTRVRfU09VUkNFX1NUIiwgImdldCBzb3VyY2Ugc3RhdGUiLAog
ICAgICAgICAgICAodm1zWzFdLnZvbC0+Y2hhbm5lbHMgPT0gMCksCiAgICAgICAgICAgIFBBX0dF
VF9TT1VSQ0VfU1RBVEVfRVJSKTsKCiAgICBkb3VibGUgZHZvbDsKICAgIGludCBvID0gSEVMUDsK
ICAgIGludCB2b2wgPSAwOwogICAgaW50IHBlciA9IDA7CiAgICBpbnQgdGFyZ2V0ID0gMDsKICAg
IGludCBzZXRlcnIgPSAwOwogICAgd2hpbGUgKGFyZ2MtLSA+IDEpIHsKICAgICAgICBvID0gaWRl
bnRpZnlfb3B0IChhcmd2WzFdKTsKCiAgICAgICAgc3dpdGNoIChvKSB7CiAgICAgICAgICAgIGNh
c2UgSEVMUDoKICAgICAgICAgICAgICAgIHByaW50X2hlbHAgKCk7CiAgICAgICAgICAgICAgICBy
ZXR1cm4gMDsKICAgICAgICAgICAgY2FzZSBTRVQ6CiAgICAgICAgICAgICAgICBpZiAoYXJnYyA9
PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgREJHKCAxLAogICAgICAgICAgICAgICAgICAgICAg
ICAgIiVzOiAlc1xuIiwKICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3ZbMV0sCiAgICAgICAg
ICAgICAgICAgICAgICAgICAiUmVxdWlyZXMgYW4gYXJndW1lbnQuIgogICAgICAgICAgICAgICAg
ICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QVElPTl9OT19BUkdfRVJSOwog
ICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmVzID0gc3RyMnBlcmNlbnQgKGFyZ3Zb
Ml0sICZwZXIpOwogICAgICAgICAgICAgICAgaWYgKHJlcykgewogICAgICAgICAgICAgICAgICAg
IERCRyggMSwKICAgICAgICAgICAgICAgICAgICAgICAgICIlczogJXM6ICVzICVzOiBDb252ZXJz
aW9uIGZhaWxlZFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgIGZuYW1lLCAiU0VUIiwgYXJn
dlsxXSwgYXJndlsyXSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICAg
ICAgICAgIH0KICAgICAgICAgICAgICAgIHJlcyA9IHZhbHBlcmNlbnQgKHBlcik7CiAgICAgICAg
ICAgICAgICBpZiAocmVzKSB7CiAgICAgICAgICAgICAgICAgICAgREJHKCAxLAogICAgICAgICAg
ICAgICAgICAgICAgICAgIiVzOiAlczogJXMgJXM6IFZvbHVtZSBub3QgaW4gcmFuZ2VcbiIsCiAg
ICAgICAgICAgICAgICAgICAgICAgICBmbmFtZSwgIlNFVCIsIGFyZ3ZbMV0sIGFyZ3ZbMl0pOwog
ICAgICAgICAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgICAgICAgICB9CgogICAgICAg
ICAgICAgICAgZHZvbCA9IHBlcjsKICAgICAgICAgICAgICAgIGR2b2wgKj0gUEFfVk9MVU1FX05P
Uk07CiAgICAgICAgICAgICAgICBkdm9sIC89IDEwMDsKICAgICAgICAgICAgICAgIGR2b2wgPSBy
b3VuZChkdm9sKTsKICAgICAgICAgICAgICAgIHZvbCA9IChpbnQpIGR2b2w7CiAgICAgICAgICAg
ICAgICAKICAgICAgICAgICAgICAgIC8vIGdvdG9zLCBzd2VldAogICAgICAgICAgICAgICAgLy8g
aGVoZQpzZXRfdm9sdW1lOgogICAgICAgICAgICAgICAgc3dpdGNoICh0YXJnZXQpIHsKICAgICAg
ICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICAgICAgICAgIHBhX2N2b2x1bWVf
c2V0ICgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2bXNbMF0udm9sLAogICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIHZtc1swXS52b2wtPmNoYW5uZWxzLAogICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIHZvbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9IHBhX3BlcmZvcm1fYWN0aW9uICgKICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYV9jdHgsCiAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgcGFfbWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lzb24s
CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm1zLAogICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIFNFVF9TSU5LX1ZPTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAmc2V0ZXJyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAg
ICAgICAgICAgICAgQ0tGQUlMQygyLCBmbmFtZSwgIlNFVF9TSU5LX1ZPTCIsICJzZXQgc2luayB2
b2x1bWUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcywgcmVzKTsKICAgICAg
ICAgICAgICAgICAgICAgICAgQ0tGQUlMQygyLCBmbmFtZSwgIlNFVF9TSU5LX1ZPTCIsICJzZXQg
c2luayB2b2x1bWUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZXRlcnIgPT0g
MCksIFBBX1NFVF9TSU5LX1ZPTFVNRV9FUlIpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVh
azsKICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICAgICAgICAgIHBh
X2N2b2x1bWVfc2V0ICgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2bXNbMV0udm9s
LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZtc1sxXS52b2wtPmNoYW5uZWxzLAog
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbAogICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9IHBhX3BlcmZvcm1fYWN0
aW9uICgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYV9jdHgsCiAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgcGFfbWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgc2lzb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm1zLAogICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIFNFVF9TT1VSQ0VfVk9MLAogICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICZzZXRlcnIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwog
ICAgICAgICAgICAgICAgICAgICAgICBDS0ZBSUxDKDIsIGZuYW1lLCAiU0VUX1NPVVJDRV9WT0wi
LCAic2V0IHNvdXJjZSB2b2x1bWUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJl
cywgcmVzKTsKICAgICAgICAgICAgICAgICAgICAgICAgQ0tGQUlMQygyLCBmbmFtZSwgIlNFVF9T
T1VSQ0VfVk9MIiwgInNldCBzb3VyY2Ugdm9sdW1lIiwKICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAoc2V0ZXJyID09IDApLCBQQV9TRVRfU09VUkNFX1ZPTFVNRV9FUlIpOwogICAgICAg
ICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAg

>> No.218414  

IG5vdGlmeV92b2x1bWUgKHRhcmdldCwgcGVyKTsKICAgICAgICAgICAgICAgIGFyZ2MtLTsKICAg
ICAgICAgICAgICAgIGFyZ3YgKz0gMjsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAg
ICBjYXNlIEdFVDoKICAgICAgICAgICAgICAgIHN3aXRjaCAodGFyZ2V0KSB7CiAgICAgICAgICAg
ICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgICAgICBkdm9sID0gdm1zWzBdLnZv
bC0+dmFsdWVzWzBdOwogICAgICAgICAgICAgICAgICAgICAgICBkdm9sICo9IDEwMDsKICAgICAg
ICAgICAgICAgICAgICAgICAgZHZvbCAvPSBQQV9WT0xVTUVfTk9STTsKICAgICAgICAgICAgICAg
ICAgICAgICAgZHZvbCA9IHJvdW5kIChkdm9sKTsKICAgICAgICAgICAgICAgICAgICAgICAgcHJp
bnRmICgiU2luayAiKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAg
ICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgICAgICAgICBkdm9sID0gdm1zWzFdLnZv
bC0+dmFsdWVzWzBdOwogICAgICAgICAgICAgICAgICAgICAgICBkdm9sICo9IDEwMDsKICAgICAg
ICAgICAgICAgICAgICAgICAgZHZvbCAvPSBQQV9WT0xVTUVfTk9STTsKICAgICAgICAgICAgICAg
ICAgICAgICAgZHZvbCA9IHJvdW5kIChkdm9sKTsKICAgICAgICAgICAgICAgICAgICAgICAgcHJp
bnRmICgiU291cmNlICIpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAg
ICAgICAgIH0KICAgICAgICAgICAgICAgIHZvbCA9IGR2b2w7CiAgICAgICAgICAgICAgICBwcmlu
dGYgKCJ2b2x1bWU6ICVkJSUuXG4iLCB2b2wpOwogICAgICAgICAgICAgICAgYXJndisrOwogICAg
ICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgSU5DOgogICAgICAgICAgICAgICAg
aWYgKGFyZ2MgPT0gMSkgewogICAgICAgICAgICAgICAgICAgIERCRyggMSwKICAgICAgICAgICAg
ICAgICAgICAgICAgICIlczogJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICBhcmd2WzFd
LAogICAgICAgICAgICAgICAgICAgICAgICAgIlJlcXVpcmVzIGFuIGFyZ3VtZW50LiIKICAgICAg
ICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBPUFRJT05fTk9f
QVJHX0VSUjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJlcyA9IHN0cjJwZXJj
ZW50IChhcmd2WzJdLCAmcGVyKTsKICAgICAgICAgICAgICAgIGlmIChyZXMpIHsKICAgICAgICAg
ICAgICAgICAgICBEQkcoIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6ICVzOiAlcyAl
czogQ29udmVyc2lvbiBmYWlsZWRcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICBmbmFtZSwg
IklOQyIsIGFyZ3ZbMV0sIGFyZ3ZbMl0pOwogICAgICAgICAgICAgICAgICAgIHJldHVybiByZXM7
CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBkdm9sID0gcGVyOwogICAgICAgICAg
ICAgICAgZHZvbCA9IGR2b2wgKiBQQV9WT0xVTUVfTk9STSAvIDEwMDsKCiAgICAgICAgICAgICAg
ICBzd2l0Y2ggKHRhcmdldCkgewogICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAg
ICAgICAgICAgICAgICAgZHZvbCArPSB2bXNbMF0udm9sLT52YWx1ZXNbMF07CiAgICAgICAgICAg
ICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAg
ICAgICAgICAgICAgICAgZHZvbCArPSB2bXNbMV0udm9sLT52YWx1ZXNbMF07CiAgICAgICAgICAg
ICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGR2
b2wgPSByb3VuZCAoZHZvbCk7CiAgICAgICAgICAgICAgICB2b2wgPSAoaW50KSBkdm9sOwogICAg
ICAgICAgICAgICAgcGVyID0gKGludCkgcm91bmQgKGR2b2wgKiAxMDAgLyBQQV9WT0xVTUVfTk9S
TSk7CiAgICAgICAgICAgICAgICByZXMgPSB2YWxwZXJjZW50IChwZXIpOwogICAgICAgICAgICAg
ICAgaWYgKHJlcykgewogICAgICAgICAgICAgICAgICAgIERCRyggMSwKICAgICAgICAgICAgICAg
ICAgICAgICAgICIlczogJXM6ICVzICVzOiBDYW5ub3QgaW5jcmVhc2UgdGhpcyBtdWNoXG4iLAog
ICAgICAgICAgICAgICAgICAgICAgICAgZm5hbWUsICJJTkMiLCBhcmd2WzFdLCBhcmd2WzJdKTsK
ICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICAgICAgICAgfQogICAgICAg
ICAgICAgICAgZ290byBzZXRfdm9sdW1lOwogICAgICAgICAgICBjYXNlIERFQzoKICAgICAgICAg
ICAgICAgIGlmIChhcmdjID09IDEpIHsKICAgICAgICAgICAgICAgICAgICBEQkcoIDEsCiAgICAg
ICAgICAgICAgICAgICAgICAgICAiJXM6ICVzXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAg
YXJndlsxXSwKICAgICAgICAgICAgICAgICAgICAgICAgICJSZXF1aXJlcyBhbiBhcmd1bWVudC4i
CiAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BU
SU9OX05PX0FSR19FUlI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXMgPSBz
dHIycGVyY2VudCAoYXJndlsyXSwgJnBlcik7CiAgICAgICAgICAgICAgICBpZiAocmVzKSB7CiAg
ICAgICAgICAgICAgICAgICAgREJHKCAxLAogICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiAl
czogJXMgJXM6IENvbnZlcnNpb24gZmFpbGVkXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAg
Zm5hbWUsICJJTkMiLCBhcmd2WzFdLCBhcmd2WzJdKTsKICAgICAgICAgICAgICAgICAgICByZXR1
cm4gcmVzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZHZvbCA9IHBlcjsKICAg
ICAgICAgICAgICAgIGR2b2wgPSBkdm9sICogUEFfVk9MVU1FX05PUk0gLyAxMDA7CiAgICAgICAg
ICAgICAgICBkdm9sID0gcm91bmQgKGR2b2wpOwogICAgICAgICAgICAgICAgdm9sID0gKGludCkg
ZHZvbDsKCiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRhcmdldCkgewogICAgICAgICAgICAgICAg
ICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICAgICAgdm9sID0gdm1zWzBdLnZvbC0+dmFs
dWVzWzBdIC0gdm9sOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAg
ICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICAgICAgICAgIHZvbCA9IHZtc1sxXS52b2wt
PnZhbHVlc1swXSAtIHZvbDsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAg
ICAgICAgICB9CgogICAgICAgICAgICAgICAgZHZvbCA9IHZvbDsKICAgICAgICAgICAgICAgIHBl
ciA9IChpbnQpIHJvdW5kIChkdm9sICogMTAwIC8gUEFfVk9MVU1FX05PUk0pOwogICAgICAgICAg
ICAgICAgcmVzID0gdmFscGVyY2VudCAocGVyKTsKICAgICAgICAgICAgICAgIGlmIChyZXMpIHsK
ICAgICAgICAgICAgICAgICAgICBEQkcoIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6
ICVzOiAlcyAlczogQ2Fubm90IGRlY3JlYXNlIHRoaXMgbXVjaFxuIiwKICAgICAgICAgICAgICAg
ICAgICAgICAgIGZuYW1lLCAiREVDIiwgYXJndlsxXSwgYXJndlsyXQogICAgICAgICAgICAgICAg
ICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICAgICAgICAg
IH0KICAgICAgICAgICAgICAgIGdvdG8gc2V0X3ZvbHVtZTsKICAgICAgICAgICAgY2FzZSBNSUM6
CiAgICAgICAgICAgICAgICB0YXJnZXQgPSAxOwogICAgICAgICAgICAgICAgYXJndisrOwogICAg
ICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgU0lOSzoKICAgICAgICAgICAgICAg
IHRhcmdldCA9IDA7CiAgICAgICAgICAgICAgICBhcmd2Kys7CiAgICAgICAgICAgICAgICBicmVh
azsKICAgICAgICAgICAgY2FzZSBNVVRFOgogICAgICAgICAgICAgICAgc3dpdGNoICh0YXJnZXQp
IHsKICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICAgICAgICAgIHZt
c1swXS5tdXRlID0gIXZtc1swXS5tdXRlOwogICAgICAgICAgICAgICAgICAgICAgICByZXMgPSBw
YV9wZXJmb3JtX2FjdGlvbiAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFfY3R4
LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhX21sLAogICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIHNpc29uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZt
cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRVRfU0lOS19NVVRFLAogICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICZzZXRlcnIKICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICBDS0ZBSUxDKDIsIGZuYW1lLCAiU0VU
X1NJTktfTVVURSIsICJtdXRlIHNpbmsiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IHJlcywgcmVzKTsKICAgICAgICAgICAgICAgICAgICAgICAgQ0tGQUlMQygyLCBmbmFtZSwgIlNF
VF9TSU5LX01VVEUiLCAibXV0ZSBzaW5rIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAoc2V0ZXJyID09IDApLCBQQV9TRVRfU0lOS19NVVRFX0VSUik7CiAgICAgICAgICAgICAgICAg
ICAgICAgIG5vdGlmeV9tdXRlICh0YXJnZXQsIHZtc1swXS5tdXRlKTsKICAgICAgICAgICAgICAg
ICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAg
ICAgICAgICAgICB2bXNbMV0ubXV0ZSA9ICF2bXNbMV0ubXV0ZTsKICAgICAgICAgICAgICAgICAg
ICAgICAgcmVzID0gcGFfcGVyZm9ybV9hY3Rpb24gKAogICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIHBhX2N0eCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYV9tbCwKICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXNvbiwKICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICB2bXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VUX1NPVVJD
RV9NVVRFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZXRlcnIKICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICBDS0ZBSUxD
KDIsIGZuYW1lLCAiU0VUX1NPVVJDRV9NVVRFIiwgIm11dGUgc291cmNlIiwKICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICByZXMsIHJlcyk7CiAgICAgICAgICAgICAgICAgICAgICAgIENL
RkFJTEMoMiwgZm5hbWUsICJTRVRfU09VUkNFX01VVEUiLCAibXV0ZSBzb3VyY2UiLAogICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIChzZXRlcnIgPT0gMCksIFBBX1NFVF9TT1VSQ0VfTVVU
RV9FUlIpOwogICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlfbXV0ZSAodGFyZ2V0LCB2bXNb
MV0ubXV0ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAg
fQogICAgICAgICAgICAgICAgYXJndisrOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAg
ICAgIGNhc2UgTk9OT1RJRlk6CiAgICAgICAgICAgICAgICBOT19OT1RJRlkgPSAxOwogICAgICAg
ICAgICAgICAgYXJndisrOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2Ug
WUVTTk9USUZZOgogICAgICAgICAgICAgICAgTk9fTk9USUZZID0gMDsKICAgICAgICAgICAgICAg
IGFyZ3YrKzsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBkZWZhdWx0OgogICAg
ICAgICAgICAgICAgREJHKCAxLCAKICAgICAgICAgICAgICAgICAgICAgIiVzOiAlczogJXMgJXNc
biIsCiAgICAgICAgICAgICAgICAgICAgIGZuYW1lLAogICAgICAgICAgICAgICAgICAgICBhcmd2
WzFdLAogICAgICAgICAgICAgICAgICAgICAiSSBkb24ndCBrbm93IHdoYXQgeW91IG1lYW4sIGJ1
dCB0aGlzIGlzIG5vdCBhIHZhbGlkIiwKICAgICAgICAgICAgICAgICAgICAgImlucHV0LlxuQ29u
c2lkZXIgZG9pbmcgJ3BhdmN0bCAtaCcgdG8gZ2V0IGhlbHAuIgogICAgICAgICAgICAgICAgICAg
KTsKICAgICAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUjsKICAgICAgICB9CiAgICB9CiAg
ICBQQV9GVUNLT0ZGKHBhX2N0eCwgcGFfbWwpOwogICAgbG9ja2YgKGZkLCBGX1VMT0NLLCAwKTsK
ICAgIHJldHVybiAwOwp9CgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

>> No.218415  

base64, вы поняли. Это то, что должно было быть реализовано в pactl/pacmd. Никаких проверок на счет памяти не делал, работает и похуй. Что бы скомпилировать нужно pkg-config --cflags --libs libnotify, и еще флаги -lm -lpulse. Компилировай гондонским gcc, потому что лень clang устанавливать.

>> No.218417  

Теоретически, если весь notify.* выкинуть вообще, то будет еще быстрее работать, а то подргузка всех этой гейских гномотек на стартапе занимает больше времени, чем запуск ебучего sh.

>> No.218420  
> base64

Сделай ку ююк.

>> No.218422  

>>218420
Там бы gzip сделать, оно бы и в одно сообщение влезло бы.

>> No.218430  

>>218422
.tar.xz щаас посмотрим

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
xAwcoQ9BwOGaqdN/shmWk4B6/6flSaU=

>> No.218431  

>>218430
да, влезло. правда там больше lzma, чем xz.

>> No.218436  

zip.png удобнее.
Алсо, видел на форчане такой способ, ещё до того, как webm прикрутили.

#!/bin/env bash
# usage: script.sh <input> [<output>]
if [ ! "$1" ]; then echo Specify an input.; exit; fi
if [ ! -e "$1" ]; then echo \"$1\" doesn\'t exist.; exit; fi
if [ "$2" ]; then output="${2%.*}.png"; else output="${1%.*}.png"; fi
if [ -e "$output" ]; then echo Output exists, specify another name.; exit; fi
size=$(echo "sqrt($(stat -c%s "$1")/8)+0.5/1" | bc)
cat "$1" /dev/zero - | ffmpeg -f rawvideo -s ${size}:${size} -pix_fmt rgba64be -i - -vframes 1 "$output"
echo Playback with\:
echo ffmpeg -i \"$output\" -f rawvideo - \| mpv -

Мудрёно!

>> No.218439  

>>218436
так а че оно делает-то?

>> No.218476  

Кажется, я нашёл свой идеальный промпт.

	PS1='\[\033[0;34m\]\W\[\033[m\]: '
>> No.218497  

RSS для новеря, работает через cgi интерфейс вебсервера, вызывать как http://server/cgi-bin/script.cgi/b/res/217061.html
на сервере нужен собственно сам вебсервер с поддержкой cgi и питон с Flask.

#!/usr/bin/env python3

from flask import Flask, request, redirect, make_response
from wsgiref.handlers import CGIHandler
import os
import time

app = Flask(__name__)

if os.environ.get("PATH_INFO") is None:
os.environ["PATH_INFO"] = ""

def getpage(thread):
import requests
import bs4
page=''
html = requests.get('http://nowere.net/' + thread).content
html = bs4.BeautifulSoup(html, 'lxml')
page = page + '<?xml version="1.0"?><rss version="2.0">\n <channel>\n <title>\n'
page = page + thread + '\n'
page = page + ' </title>\n'
page = page + ' <link>http://nowere.net/' + thread + '</link>\n'
page = page + 'http://nowere.net/' + thread + ';'
posts = html.find_all('td', attrs={'class':'reply'})
for post in posts:
postTitle = str(post.a['name'])
postLink = 'http://nowere.net/' + thread + '#' + postTitle
page = page + ' <item>\n'
page = page + ' <title>' + postTitle + '</title>\n'
page = page + ' <description>\n'
page = page + ' <p><a href="' + postLink + '">' + postLink + '</a></p>\n'
page = page + str(post)
page = page + ' </description>\n'
page = page + ' <guid isPermaLink="true">' + postLink + '</guid>\n'
page = page + ' </item>\n'
page = page + ' </channel>\n</rss>'
return page

@app.route('/<path:thread>', methods=['GET'])
def mainpage(thread):
page = getpage(thread)
response = make_response(page, 200)
response.mimetype = "application/rss+xml"
return response


CGIHandler().run(app)
>> No.218500  

>>218497

def getpage(thread):
import requests
import bs4

Жесть

Хотя, всё равно спасибо, буду разбираться.

>> No.218501  

>>218500
Там изначально было кеширование и вот с таким вот хаком при попадании в кеш оно отрабатывало несколько быстрее.

>> No.218592  

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

#!/bin/sh
# show total bandwidth stats for network interfaces
scriptname="${0##*/}"
[ $# -eq 0 ] || [ "$1" = "-h" ] && {
echo "usage: $scriptname <iface> [iface] .." >&2
exit 1
}
# total bandwidth
total=0
# number of working interfaces
cnt=0
for i; do
[ -d /sys/class/net/$i ] && {
tx=$(cat /sys/class/net/$i/statistics/tx_bytes)
rx=$(cat /sys/class/net/$i/statistics/rx_bytes)
mibs=$(( (tx + rx) / 1024 / 1024 ))
total=$((total + mibs))
cnt=$((cnt + 1))
echo $i: ${mibs} MiB
} || {
echo "$scriptname: no such interface: $i" >&2
}
done
[ $cnt -gt 1 ] && echo total: $total MiB
>> No.218595  

https://libredirect.github.io/index.html

Перенаправления на альтернативные фронтенды, автоматически, браузерным аддоном.

>> No.218628  

>>218501

Я могу попробовать захостить у себя и получть бесплатный домен через freedns.afraid.org

Но не раньше чем у меня семестр кончится, то есть в Январе.

>> No.218629  

>>218628
Оно на локалхосте отлично живет без внешнего ip, главное чтобы у rss читалки доступ был. Но если хочешь захостить для всех, то я могу попробовать прикрутить кеширование обратно, чтобы меньше трафика гонять.

>> No.218773  

>>218629

>Но если хочешь захостить для всех

Хочешь.

>я могу попробовать прикрутить кеширование обратно

Попробуй.

Тебе будет удобно, если будет для этой штуки git репозиторий где-то ?
Я могу написать гайд как кидать патчи анонимно.

>> No.218777  

>>218773

> Попробуй.

Держи:

#!/usr/bin/env python3

from flask import Flask, request, redirect, make_response
from wsgiref.handlers import CGIHandler
import os
import time
from diskcache import Cache

# some settings
url_base = 'http://nowere.net/' # http fast, but insecure; https secure but slower
directcache_time = 600 # time in seconds when local cache returned without quering server
cache_directory = '/tmp/nowere' # where cache has been stored, safe to delete

app = Flask(__name__)

if os.environ.get("PATH_INFO") is None:
os.environ["PATH_INFO"] = ""

def update_page(thread, cache):
if (cache[thread + 'time'] > 0):
# return older version of feed to another clients if we have cached one
cache[thread + 'time'] = time.time()
import requests
ret = requests.get(url_base + thread, headers={'If-Modified-Since':cache[thread + 'Last-Modified']})
if (ret.status_code == 304):
# nothing changed
return True
if (ret.status_code > 399):
# something wrong
return ret
import bs4
html = ret.content
feed = ''
html = bs4.BeautifulSoup(html, 'lxml')
feed = feed + '<?xml version="1.0"?><rss version="2.0">\n <channel>\n <title>\n'
feed = feed + thread + '\n'
feed = feed + ' </title>\n'
feed = feed + ' <link>' + url_base + thread + '</link>\n'
posts = html.find_all('td', attrs={'class':'reply'})
for post in posts:
postTitle = str(post.a['name'])
postLink = url_base + thread + '#' + postTitle
feed = feed + ' <item>\n'
feed = feed + ' <title>' + postTitle + '</title>\n'
feed = feed + ' <description>\n'
feed = feed + ' <p><a href="' + postLink + '">' + postLink + '</a></p>\n'
feed = feed + str(post)
feed = feed + ' </description>\n'
feed = feed + ' <guid isPermaLink="true">' + postLink + '</guid>\n'
feed = feed + ' </item>\n'
feed = feed + ' </channel>\n</rss>'
cache[thread + 'feed'] = feed
cache[thread + 'Last-Modified'] = ret.headers['Last-Modified']
cache[thread + 'time'] = time.time()
return True

@app.route('/<path:thread>', methods=['GET'])
def mainpage(thread):
cache = Cache(directory=cache_directory)
try:
test = cache[thread+'time']
except KeyError:
cache[thread + 'time'] = 0
cache[thread + 'Last-Modified'] = 'Thu, 01 Jan 1970 00:00:00 GMT'
if ( (time.time() - cache[thread + 'time']) > directcache_time):
ret = update_page(thread, cache)
if ( ret != True ):
response = make_response(ret.content, ret.status_code)
return response
response = make_response(cache[thread + 'feed'], 200)
#response.mimetype = "text/plain"
response.mimetype = "application/rss+xml"
return response


CGIHandler().run(app)
> Тебе будет удобно, если будет для этой штуки git репозиторий где-то ?

Не уверен что в этом есть смысл, это ведь типичный одноразовый код, который часто проще выкинуть чем переписывать.

>> No.218866  
File: 1702119134782.webm -(301867 B, 600x480) Thumbnail displayed, click image for full size.
301867

Почему curl не загружает через HTTP POST файлы с такими именами —

test'file'name.jpg
test'file.txt
test&file.txt
test<file>.txt

Первые два отправляются успешно, вторые два — уже нет. С флагом verbosity ничего не говорит, как будто заливает пустые файлы. Делаю вот так,

curl \
-F "files=@\"test'file.txt\"" \
-F "files=@\"test'file'name.jpg\"" \
-F "files=@\"test&file.txt\"" \
-F "files=@\"test<file>.txt\""

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

>> No.218867  

>>218866
Это предположение, но вероятно & парсится шеллом как синтаксис для запуска в бэкгрунде, а < и > как перенаправления в файл

>> No.218870  

>>218867
И я думал так же, но в таких кавычках они не срабатывают. Файлы из-за '<' не появляются и ошибки выполнения из-за '&' тоже нет.
Проверить легко:

touch "test&file" "another<one>"
> С флагом verbosity ничего не говорит, как будто заливает пустые файлы.

Вот лог:

> User-Agent: curl/7.74.0^M
> Accept: */*^M
> Content-Length: 381^M
> Content-Type: multipart/form-data; boundary=------------------------f08df681e9ced2d9^M
> ^M
* We are completely uploaded and fine
* Mark bundle as not supporting multiuse
< HTTP/1.1 303 See Other^M
< Location: /^M
* no chunk, no close, no size. Assume close to signal end
< ^M
* Closing connection 0
>> No.218871  

>>218870
Файлы с обычными названиями дают такой же лог. Похоже, курл и шелл не виноваты, буду ковырять глубже.

>> No.218872  

Через веб-форму всё нормально. Ну и хуй с ним.

>> No.218891  
File: 1702189808393.png -(64605 B, 1920x1080) Thumbnail displayed, click image for full size.
64605

>>218872
Можно попробовать < вместо @ использовать. Об этом в мане написано. Как видишь, файл может "просто так" отправляться, а может попадать в поле формы. Не знаю, как именно браузеры отправляют формы с файлами, может там и то, и то надо заполнять. Посмотри в Copy as curl в DevTools Network panel.

>> No.218906  

Есть какой плагин для лисы для закачки видео с ютаба? Я знаю про ютубдлп и про то что такие плагины есть, но есть ли тот который не будет попутно пихать мне рекламу и слать хуйню на свои сервера?

>> No.218907  

>>218906
Что может быть проще вставки ссылки в yt-dlp? Сайты вроде ssyoutube?

>> No.218979  

>>218891

> Можно попробовать < вместо @ использовать.

Попробовал. Получается «Empty reply from server», то есть, даже хуже, чем с собакой — с ней было видно, что файл получен на той стороне, обработан, но содержимого нет.

> Как видишь, файл может "просто так" отправляться, а может попадать в поле формы.

«Просто так» — это «-T», PUT request, редкий зверь. В моём случае именно форма.

> Посмотри в Copy as curl в DevTools Network panel.

Посмотрел. Копируются только заголовки: Host, User-Agent, Accept, Accept-Language, Referer, Connection, Content-Type, DNT; в конце курловая опция --data-raw '' (sic). Нет -F, -X, -T.
Знал бы я способ как-то пошагово отладить всё это вместе, вроде как пройтись в GDB, было бы проще.

>> No.218980  

>>218979
А если вызывать курл из скрипта, файлы с амперсандом и <> в названии не загружаются вообще, будто их среди параметров и нет.

>> No.218981  

>>218979

> вроде как пройтись в GDB, было бы проще

Хм, в теории наверное можно ведь загнать curl в gdb.

>> No.218985  

>>218981
gdb -p и пид curl
Ну или можно сразу запускать из gdb
gdb curl argv

и в gdb
run

>> No.218995  
File: 1702776484747.jpg -(837451 B, 2021x2402) Thumbnail displayed, click image for full size.
837451

Сегодня узнал про замечательный бутпараметр consoleblank=300 что отключает питание дисплея после 5 минут в idle. Как отключить питание из терминала узнать не удалось, vbetool ругается на пермишон денид
бтв есть еше такая штукак как bash TMOUT, прописываем в .bashrc или куда там и теперь юзверя будет разлогинивать по таймауту.
Работает кстати, только в случае с idle, если запустить какую нибудь программу то вродь не выпинывает.

>> No.218996  

>>218979

>«Просто так» — это «-T», PUT request

Тащемта там post был.

>Посмотрел.

Ну так скопируй в свой терминал и попробуй повторить. Если сработает на этом и остановиться.

>Знал бы я способ как-то пошагово отладить

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

>>218980
Попробуй на httpbin позагружать. Так можно будет определиться — твой сервер глючный или нет.

>>218981 >>218985
Гвозди, микроскоп.

>> No.219037  

>>218995

> Как отключить питание [дисплея] из терминала узнать не удалось
xset dpms force off
>> No.219041  

>>219037

>xset

Имелось ввиду выключкние из tty.

>> No.219043  

>>217428

>для интеграции крысы в и3
>Скрипты/софт облегчающий жизнь.
>> No.219082  
File: 1703446757916.jpg -(607774 B, 2048x1464) Thumbnail displayed, click image for full size.
607774

>>219043

>Скрипты/софт облегчающий жизнь.

я тоже с этого оксюморона кекаю.

>> No.219083  

>>219082
В следующем перекате мы конечно назовём тред не иначе как
Скрипты и/или софт усложняющие жизнь.

>> No.219085  

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

>> No.219088  

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

>> No.219089  
File: 1703489314672.jpg -(11850 B, 269x187) Thumbnail displayed, click image for full size.
11850

>>219085

>"найди мне картинки где яблоки на всех дисках за последнюю неделю"

пикрелейтед. хотя как ты пони я сам таким же занимаюсь. путь меча.

>> No.219211  
File: 1703880194469.jpg -(135188 B, 406x307) Thumbnail displayed, click image for full size.
135188

Тотальное скрапирование картинок с тем:

curl "https://nowere.net/a/res/2464.html" | xmllint --html --xpath '//td[@class="reply"]//img/../@href' - | sed 's%^ href="%https://nowere.net%; s%"$%%' | xargs -n 1 curl -O
>> No.219212  
File: 1703882389999.jpg -(572080 B, 2170x1911) Thumbnail displayed, click image for full size.
572080

Не припомнит кто как называлась программа, которой можно было восстанавливать celостность рисунков, испорченных в аниме эффектом Кена Бернса? Результаты выглядели примерно как прилагаемый рисунок.

>> No.219213  

>>219212
Overmix.

>>219211
Чет мне проще в браузерной консоли спписок сформировать и copy() его (тем более что для разных сайтов разные селекторы, т.е итак придется смотреть это в браузере). А в терминале xclip.

>> No.219220  

>>219211
Можно одной командой.

wget https://nowere.net/b/res/218258.html --accept-regex='https://nowere.net/b/src/.*(jpg|png|gif|webm)' -nd -r
>> No.219221  

>>219220
Хе, подумал об этом способе сразу как увидел тот пост. В этом смысле вгет очень печалит тем, что этот pattern по которому он будет acccept/reject ссылки невозможно отдебажить в чем-то вроде режима --no-actual-download. Чтобы все ссылки которые он анализирует выводил. Вроде и можно включить в какой-то мере вербозный лог, а скачку перенаправить в /dev/null, но это кажется костыликами.
А вообще вгет же заменен полностью переписанным wget2 или что-то вроде того. Кто-то уже пользовал?

>> No.219223  

>>219221
Этот паттерн (как и любые регулярки) можно отдебажить "grep -o file.html" прямо по скачанной странице. А если у неё, как на Новере, код в одну строчку, остаётся только пробовать попытки.
Да, хороший тред — /a/res/2464.html :3

> wget2
> Depends: libwget0

Забавно.

>> No.220287  

https://github.com/Helium314/HeliBoard
Словари можно вручную добавлять.

>> No.220413  
File: 1710877034296.png -(1177745 B, 974x1080) Thumbnail displayed, click image for full size.
1177745

>>218476
А мне больше нравится PS1='/\033[1000000000;b'
Единственный терминал который я знаю что может отобразить его во всей красе это kitty.

>> No.220414  

Чем можно автоматизированно оценить видео на ебучешакальность и затасканность обработками?
Конвертация при помощи libsvtav1 и оценка по степени сжатия относительно исходника работает более-менее, но чудовищно медленно.

>> No.220415  
File: 1710896537841.jpg -(217539 B, 1240x1754) Thumbnail displayed, click image for full size.
217539

>>220414
сжать в джепег на 100% и 60%, взять с https://paperswithcode.com/method/laplacian-pyramid высокую частоту, эдждетект собеля на неё, сравнить попиксельно. хз какой будет результат.

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

>> No.220416  
File: 1710896674547.jpg -(26917 B, 599x631) Thumbnail displayed, click image for full size.
26917

>>220414

>Конвертация при помощи libsvtav1 и оценка по степени сжатия относительно исходника работает более-менее, но чудовищно медленно.

возьми просто 20 кадров вместо всего видео. это самое реалистичное.

>> No.220419  
File: 1710971535930.jpg -(1135074 B, 1066x1300) Thumbnail displayed, click image for full size.
1135074

>>220414
https://hitokageproduction.com/article/71

> One of the notable metrics for video compression evaluation was developed by Netflix and is called VMAF. This metric is also available in FFmpeg when included during the build process. The above-mentioned metrics analyze a pair of images and return a number which represents the similarity score. The higher the number is, the more similar the images are. There are also no-reference metrics which try to evaluate how much of artifacts is present in the image when the original image is not available for comparison. Examples of such metrics are LIQE or NIQSV+. These metrics often focus on specific kind of artifacts and are designed for a specific use cases such as compression or image synthesis quality evaluation.
>> No.220449  
File: 1711129947521.jpg -(738008 B, 2464x1632) Thumbnail displayed, click image for full size.
738008

>>220414
Быстромысль (вне предложенных вариантов) посчитать степень высокочастотного шума. У шакальной картинки она будет низкая (если конечно не брать варианты шакального видео пропущенного через аналоговые каналы передачи изображения). Хорошо должно работать на "живых" видео (не рисованных анимациях)
Но более универсально, да думаю вот это >>220415 более годных подход. Производить сжатие с потерями и оценивать разницу начального и конечного результата.
>>220416
Да по идее и одного должно быть достаточно. Возможно - трёх (купирование случаев попаданий на всякий а-ля равномерно чёрный фон или растр прочих цветов, но впрочем это можно отдельно оценивать перед опробированием)

>> No.220583  

https://www.home.unix-ag.org/simon/woof.html
реквестирую подобное
заебало шнур тыкать в этот телефон ебучий

>> No.220584  
File: 1712084078219.jpg -(329048 B, 800x920) Thumbnail displayed, click image for full size.
329048

>>220583
Если тебе просто перекидываться файлами между телефоном без шнура то просто ставишь на телефон sshd а дальше общаешься с ним или через любой sftp-клиент или вообще маунтишь его локально через sshfs.

>> No.220585  
File: 1712085657175.jpg -(73414 B, 1039x1015) Thumbnail displayed, click image for full size.
73414

>>220583
Pairdrop и друзья

>> No.220586  

Учитывая что смартфоны по шнурку работают ну очень отвратно.., у меня total commander for android + ftp plugin к нему. Ну и ФТПсервер на рабочей машине. Просто из серии приконнектится через вайфай к 192.168.1.1 и гонять данные.

>> No.220587  

>>220584
где демон и каковы конфиги?

>>220585
как сделать на локалхосте?

>>220586
каков демон, конфиг? были попытки в vsftpd, но конфиг там пиздец, помню какая-то постная хуйня всегда получалась

>> No.220588  
File: 1712089107073.jpg -(510885 B, 1681x2329) Thumbnail displayed, click image for full size.
510885

>>220587

> где демон и каковы конфиги?

Я использую того, что из репозиториев termux. Конфиг демона дефолтный, только в authorized_keys ключик добавлен.

>> No.220589  
File: 1712091841693.jpg -(505894 B, 1663x1027) Thumbnail displayed, click image for full size.
505894

>>220584
а можно сделать ссшд через вайфай репитер? у которого собственно нет никаких настроек. через что ставить ссхд - через ф-дроид? батарейку демон не съест?

>> No.220590  

>>220587
С серверной стороны - Slimftpd. Конфиг - можно сказать то что из коробки (тебе живой пример с вытертыми паролями привести?, в нём отличного - только точки монтирования к реальной ФС)

>> No.220591  
File: 1712093377220.png -(1988558 B, 1000x875) Thumbnail displayed, click image for full size.
1988558

>>220589

> а можно сделать ссшд через вайфай репитер?

Если у тебя есть прямой доступ к ip телефона то и sshd будет работать по нему без проблем.

> через что ставить ссхд - через ф-дроид?

Да.

> батарейку демон не съест?

Если ты с ним не взаимодействуешь то он вообще ничего не делает и соотвественно батарейку не ест.

>> No.220592  

>>220590
https://github.com/m417z/SlimFTPd
Ничо нипойму это для виндоус???

>> No.220593  

>>220592
Да, оно для семейств WinNT / Win9x

>> No.220594  

мне почему woof приглянулся – ничо не надо. на телефон только браузер (и так есть), а на компутер – питон, который во всех дистрибутивах пакетирован. простую командочку ввел, файлы скинул, готово. вот именно хотелось подобных по простоте решений!

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

может какой-то http(или даже s???) демончик на компутере, который одной командой запускается и готово, загружай-отгружай, сколько хочешь!

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

>> No.220595  

а еще ssh это ssh, зачем мне целый шелл, если мне нужно только файлы кинуть? как это работает?

>> No.220597  
File: 1712135794691.jpg -(50312 B, 1153x712) Thumbnail displayed, click image for full size.
50312

>>220587

> как сделать на локалхосте?

https://github.com/schlagmichdoch/PairDrop/blob/master/docs/host-your-own.md

>> No.220598  
File: 1712136429597.jpg -(108935 B, 1280x960) Thumbnail displayed, click image for full size.
108935

Btw, scp последовательное медленное говно. rsync копирует парраллельно из-за чего скорость передачи может быть буквально в 10 раз больше.

>> No.220599  

https://pypi.org/project/uploadserver/
Ебать нихуя себе

>> No.220601  
File: 1712172092181.jpg -(66773 B, 750x535) Thumbnail displayed, click image for full size.
66773

Где найти color picker для 16-битных жыпегов? Который будет отображать компоненты цвета в RGB/grayscale по клику на пиксель в диапазоне от 0 до 65535. Опять самому писать?

>> No.220602  
File: 1712173617658.jpg -(825865 B, 744x1054) Thumbnail displayed, click image for full size.
825865

>>220601

convert image.ext -crop 1x1+$x+$y txt:

где $x и $y - координаты нужного тебе пикселя

>> No.220603  
File: 1712173828125.jpg -(188293 B, 1280x1215) Thumbnail displayed, click image for full size.
188293

>>220602
Хачу мышкой, а точнее трекпоинтом

>> No.220604  
File: 1712174448690.jpg -(305829 B, 433x390) Thumbnail displayed, click image for full size.
305829

>>220603
Тут уже немного велосипедить придется. Вот например вариант, который берет цвет c экрана по текущим координатам мышки:

import -window root -crop 1x1+$(xdotool getmouselocation | sed 's/x://g; s/ y:/+/g; s/ .*//g;') txt:

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

Если же у тебя экран не отображает нужные цвета то тут уже придется считать смещение координат оригинальной картинки по смещению окна просмотрщика и учитывать масштаб, если он не 100%.

>> No.220605  

>>220604

>Если же у тебя экран не отображает нужные цвета то тут уже придется считать смещение координат оригинальной картинки по смещению окна просмотрщика и учитывать масштаб, если он не 100%.

???
че за смещение

>> No.220606  
File: 1712178591073.jpg -(668977 B, 1124x695) Thumbnail displayed, click image for full size.
668977

>>220605
Смещение изображения, которое он рисует, относительно края экрана.

>> No.220607  

алсо первая строчка в утке
https://www.ubuntupit.com/best-color-picker-tools-for-linux/

$ apt search 'color picker'
color-picker/stable 1.0.3-2 amd64
Powerful screen color picker based on Qt

deepin-picker/stable 5.0.1-2+b1 amd64
Color picker tool for deepin

gedit-plugin-color-picker/stable,stable 44.1-2 amd64
Color Picker plugin for gedit

gpick/stable,stable 0.2.6-1 amd64
advanced GTK+ color picker

juffed-plugins/stable 0.10-89-g3690b60-7 amd64
Lightweight yet powerful Qt text editor - plugins

kephra/stable,stable 0.4.3.34+dfsg-4 all
gui text editor along Perl alike Paradigms

libjs-jquery-minicolors/stable,stable,stable 2.3.5+dfsg-4 all
tiny color picker built on jQuery

plasma-widgets-addons/stable,stable 4:5.27.5-2 amd64
additional widgets for Plasma 5

>> No.220608  

>>220606
типо искать оригинальную координату пикселя или че? причем там "если экран не отображает цвета"

>> No.220609  
File: 1712179469198.jpg -(2985210 B, 3507x2480) Thumbnail displayed, click image for full size.
2985210

>>220608
Вычислить координаты искомого пикселя в оригинальной картинке по позиции картинки на экране.

> причем там "если экран не отображает цвета"

Если нужная глубина цвета отображается на экране то пиксель можно просто взять с картинки на экране. Но у X11 потолок в 30bpp, что дает только 10 бит на канал, когда у 16 бит jpeg соответственно 16 бит на канал.

>> No.220654  

>>220601
Занятный вопрос. Хотел-бы написать про Adobe Fotoshop / Corel Draw, но, проверки ради, именно пикать они 48битные цветовые пространства не умеют, только с урезанием до 24бит.
Хотя если брат самые последние фотошопы...но они - лажа.

>> No.220799  
File: 1713296215331.jpg -(169234 B, 930x700) Thumbnail displayed, click image for full size.
169234

Так блджад, я не понял. Почему на *nix нет портативного способа поменять два файла местами в одну команду? Без этих ваших

touch -- -f -r && rm *
>> No.220801  

>>220799

> поменять два файла местами

Ору нах
mv fn1 tempname && mv fn1 fn2 && mv fn2 fn1

>> No.220802  
#!/bin/sh

set -u

n=$#
while [ $n -gt 1 ]; do
n="$(expr $n - 2)"
r=$?
if [ $r -gt 1 ]; then
echo "expr failed with $r" >&2
exit 1
fi
done

set -e

if [ $n -eq 1 ]; then
echo "Number of arguments must be even" >&2
exit 1
fi

while [ $# -gt 0 ]; do
tmp="$(mktemp -p.)"
file1="$1"
file2="$2"
shift 2

mv "$file1" "$tmp"
mv "$file2" "$file1"
mv "$tmp" "$file2"
done
>> No.220804  
File: 1713303106495.jpg -(125541 B, 905x1280) Thumbnail displayed, click image for full size.
125541

>>220801

> mv fn1 tempname && mv fn1 fn2 && mv fn2 fn1

Вот поэтому я и хочу в одну команду. Ты даже в примере ошибся. Попробобуй так в стрессовой ситуации поменять несколько пар файлов подряд с путями вроде foo/bar.baz foo/baz.bar, ебанешся.
>>220802
Сркриптов разной степени паршивости полон интернет, этот вроде не самый полохой, схоронил. Проблема в том что его придется деплоить на каждый сервер куда логинюсь, в каждый контейнер, каждый телефон, каждого робота, каждый вибратор на базе железа ip камеры или куда меня там еще занесет. И не фак что система смонтирована в rw. Точно нету какого-нибудь хака с использованием стандартной программы, пускай даже неэффективного? Или хотябы которая есть мейнстримовых репах.

>> No.220806  

>>220804

> Вот поэтому я и хочу в одну команду.

Зачем?

> Ты даже в примере ошибся.

И что?

> Попробобуй так в стрессовой ситуации поменять несколько пар файлов подряд с путями вроде foo/bar.baz foo/baz.bar, ебанешся.

Напиши программу для массового переименовывания, или возьми код из файловых менеджеров крупных de и переделай.

>> No.220807  
File: 1713305096125.jpg -(114070 B, 1280x915) Thumbnail displayed, click image for full size.
114070

>>220806

> Зачем?

Для того чтобы не задумываясь выполнять элементарную операцию.

> И что?

Наглядный пример того как легко допустить ошибку при применении продемонстрированного подхода.

> Напиши программу для массового переименовывания, или возьми код из файловых менеджеров крупных de и переделай.

Мне не нужно массовое переименование, я хочу знать как раз в иногда, когда возникает такая необходимость, поменять файлы и продолжить делать что делал. Общее знание вроде cd -, radiff2 или unbuffer -- не то чтобы я ими каждый день пользовался, но в ситуациях когда они нужны, они таки нужны.

>> No.220808  
File: 1713306963480.jpg -(2388094 B, 2209x1868) Thumbnail displayed, click image for full size.
2388094

>>220804

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

У этой проблемы есть несколько решений разной степени костыльности и инвазивности целевых систем:
- Добавить это счастье в скрипты, раскатывающие стандартную конфигурацию. Все равно ведь есть куча софта, которая типично доустанавливается на чистую ос, еще один файл не будет слишком большой проблемы.
- Оформить это в виде алиаса или функции своего профиля на целевых системах.
- При логине кормить ssh свой файл алиасов по примеру вроде https://www.cyberciti.biz/faq/use-bash-aliases-ssh-based-session/ . Это будет работать даже если фс на целевой системе r/o.
- Вместо стандартного ssh использовать expect скрипт, который вызовет ssh на удаленную систему и настроит там все нужное окружение вроде алиасов после чего перейдет в интерактивный режим. Опять же сработает даже если удаленное устройство в r/o.
>>220807

> раз в иногда, когда возникает такая необходимость

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

>> No.220809  

>>220594

Можешь еще в сторону syncthing посмотреть, очень удобно синкать фоточки. Ну или kdeconnect.

>> No.220810  
File: 1713310282279.jpg -(410743 B, 567x800) Thumbnail displayed, click image for full size.
410743

>>220801

> mv fn1 tempname && mv fn1 fn2 && mv fn2 fn1

поорал.

>> No.220842  

>>220807

> Для того чтобы не задумываясь выполнять элементарную операцию.
> Наглядный пример того как легко допустить ошибку при применении продемонстрированного подхода.

echo "alias kal='mv fn1 tempname && mv fn2 fn1 && mv tempname fn2'" | tee -a $HOME/.yourshrc

>> No.220868  
File: 1713532989671.jpg -(140387 B, 850x1159) Thumbnail displayed, click image for full size.
140387
startx -- no-cursor
>> No.220870  

>>220868

startx -- -no-cursor

fix

>> No.220871  
File: 1713534962839.png -(680290 B, 1008x859) Thumbnail displayed, click image for full size.
680290

>>220868
>>220870
как достать прыщесоседа?

>> No.220872  

>>220870
option not recognized

>> No.220873  

>>220872

startx -- -nocursor

Гоменнасай.

>> No.220874  

>>220413

> PS1='/\033[1000000000;b'

И как же он выглядит?

>> No.220889  

>>220874
Зачастую примерно как

Out of memory: Killed process 2772042
>> No.221410  
File: 1716001793859.jpg -(958251 B, 868x1228) Thumbnail displayed, click image for full size.
958251

https://github.com/HigherOrderCO/Bend
ничосе!

>> No.221411  

>>221410
В расте нету параллельных вычислений?

>> No.221413  
File: 1716031552964.png -(3314332 B, 1989x1166) Thumbnail displayed, click image for full size.
3314332

>>221411
раст на куду не конпелируется.

>> No.222796  
File: 1722316026461.png -(242297 B, 2000x1600) Thumbnail displayed, click image for full size.
242297

какой у нас стейт оф зе арт прокинуть тор из нетспейса? сделал через сокат, но он сока пинги лагает.

>> No.223187  
package main
import (
"context"
"errors"
"fmt"
"github.com/fsnotify/fsnotify"
"github.com/jochenvg/go-udev"
"io/ioutil"
"os"
"os/exec"
"os/signal"
"regexp"
"strings"
"syscall"
"time"
)

type Logger interface {
Log(...interface{})
LogErr(...interface{})
}

type FuncLogger struct {
funcName string
}

func (l FuncLogger) Log(args ...interface{}) {
fmt.Printf("%s: ", l.funcName)
fmt.Println(args...)
}

func (l FuncLogger) LogErr(args ...interface{}) {
fmt.Fprintf(os.Stderr, "%s: ", l.funcName)
fmt.Fprintln(os.Stderr, args...)
}

type ConfigLine struct {
fst int
last int
line string
}

type MyPathError struct {
id string
file string
fun string
}

func (e *MyPathError) Error() string {
switch e.id {
case "NOTREGULAR":
return fmt.Sprintf("%s: %s: not a regular file", e.fun, e.file)
}
panic("Error using MyPathError, go check your code dummy")
}

// finding exact line with error is a bit too hard for me if I want
// to implement line splitting using \, so I'll just repost first and
// last line
type MyParseError struct {
fst int
last int
info string
file string
}

func (e *MyParseError) Error() string {
str := fmt.Sprintf("Synax error in file: %s", e.file)
if (e.fst == e.last) {
str = fmt.Sprintf("%s: line %d", str, e.fst)
} else {
str = fmt.Sprintf("%s: lines %d-%d", str, e.fst, e.last)
}
str = fmt.Sprintf("%s: %s", str, e.info)
return str
}

// Full udev rule spec isn't supported, just ACTION, SUBSYSTEM,
// ATTR(at least somewhat) and RUN
// Everything else I don't need so suck it up
type Rule struct {
action string
subsystem string
attr map[string]string
run []string
}

var rules []Rule

func main() {
var exitCode int = 0
defer func() {
os.Exit(exitCode)
}()

log := FuncLogger{funcName: "main"}

if (os.Getuid() == 0) {
log.LogErr("refusing to run as root")
exitCode = 1
return
}

var configDir string
if val,ok := os.LookupEnv("XDG_CONFIG_HOME"); ok {
configDir = fmt.Sprintf("%s/udev-worker", val)
} else if val,ok := os.LookupEnv("HOME"); ok {
configDir = fmt.Sprintf("%s/.config/udev-worker", val)
} else {
log.LogErr("HOME environmental variable is not set")
exitCode = 1
return
}
err := os.MkdirAll(configDir, 0777) // umask is not my responsibility
if (err != nil) {
log.LogErr(err)
exitCode = 1
return
}

lock,logger,err := acquireLock(fmt.Sprintf("%s/lock", configDir))
if err == syscall.EWOULDBLOCK {
log.Log("Already running")
return
} else if err != nil {
logger.LogErr(err)
exitCode = 1
return
}
defer releaseLock(lock)

logger,err = compileConfigDir(configDir)
if err != nil {
logger.LogErr(err)
exitCode = 1
return
}

watch := make(chan int, 10)
watchErr := make(chan error, 10)
watchLog := make(chan Logger, 10)

go fsWatch(configDir, watch, watchErr, watchLog)

udevCtx := udev.Udev{}
mon := udevCtx.NewMonitorFromNetlink("udev")
ctx,cancel := context.WithCancel(context.Background())
defer cancel()
devchan,errchan,err := mon.DeviceChan(ctx)

signalChan := make(chan os.Signal, 10)
signal.Notify(signalChan, syscall.SIGINT)
signal.Notify(signalChan, syscall.SIGTERM)
signal.Notify(signalChan, syscall.SIGHUP)

log.Log("entering mainloop")
for {
select {
case dev := <-devchan:
logger,err := handleDevice(dev, rules)
if err != nil {
logger.LogErr(err)
}
case deverr := <-errchan:
log.LogErr("a udev error, lmao", deverr)
exitCode = 1
return
case sig := <-signalChan:
log.Log("exiting due to signal", sig)
return
case werr := <-watchErr:
logger := <-watchLog
logger.LogErr(werr)
exitCode = 1
return
case i := <-watch:
switch i {
case 0:
log.Log("Reconfiguring")
logger,err = compileConfigDir(configDir)
if err != nil {
logger.LogErr(err)
exitCode = 1
return
}
case 1:
log.Log("Config dir has been removed, good bye idiot")
return
}
}
}
}

func readFile (path string) ([]string, Logger, error) {
log := FuncLogger{funcName: "readFile"}
sb,err := os.Stat(path)
if err != nil {
return []string{}, log, err
} else if !sb.Mode().IsRegular() {
return []string{}, log, &MyPathError{id: "NOTREGULAR", file: path, fun: "os.Stat"}
}
file,err := os.Open(path)
if err != nil {
return []string{},log,err
}
defer file.Close()
bytes,err := ioutil.ReadAll(file)
if err != nil {
return []string{},log,err
}
str := string(bytes)
strs := strings.Split(strings.TrimSpace(str), "\n")
for i,val := range strs {
strs[i] = strings.TrimSpace(val)
}
return strs,log,nil
}

// lines must already be space trimmed
func preParseConfigFile(lines []string) []ConfigLine {
// many passes because i'm dumb
var i int
var cfg []ConfigLine = make([]ConfigLine, len(lines), len(lines))
for i,_ = range lines {
cfg[i] = ConfigLine{fst: i+1, last: i+1, line: lines[i]}
}
isComment := func (str string) bool {
return str[0] == '#'
}
isEmpty := func (str string) bool {
return len(str) == 0
}
var l int = len(cfg)
for i = 0; i < l; i++ {
if isEmpty(cfg[i].line) || isComment(cfg[i].line) {
cfg = append(cfg[:i], cfg[i+1:]...)
i--
l--
}
}
glue := func (str string) (string, bool) {
length := len(str)
if str[length-1] == '\\' {
return str[:length-1],true
}
return str,false
}
l = len(cfg)
var val string
var ok bool
for i = 0; i < l - 1; i++ {
if val,ok = glue(cfg[i].line); ok {
pre := cfg[:i]
now := cfg[i]
now.last = cfg[i+1].last
now.line = string(append([]byte(val), []byte(cfg[i+1].line)...))
post := cfg[i+2:]
cfg = append(pre, now)
cfg = append(cfg, post...)
l--
i--
}
}
l = len(cfg)
if val,ok = glue(cfg[l-1].line); ok {
cfg[l-1].line = val
}
return cfg
}

func contains(s string, ss []string) bool {
for _,val := range ss {
if val == s {
return true
}
}
return false
}

// one rule per line
func parseRule(cfgline ConfigLine, file string) (Rule,Logger,error) {
log := FuncLogger{funcName: "parseRule"}
var e *MyParseError = &MyParseError{file: file, fst: cfgline.fst, last: cfgline.last}
rule := Rule{attr: make(map[string]string), run: make([]string, 0, 0)}
const (
subsystem = "SUBSYSTEM"
action = "ACTION"
attribute = "ATTR"
run = "RUN"
equal = "=="
assign = "="
add = "+="
)
var keyword string
var attrKey string
var operation string
var inquotes string
var unquotedOK bool
var iter int
var sth int
line := cfgline.line
for {
if strings.HasPrefix(line, subsystem) {
keyword = subsystem
line = line[len(subsystem):]
} else if strings.HasPrefix(line, action) {
keyword = action
line = line[len(action):]
} else if strings.HasPrefix(line, run) {
keyword = run
line = line[len(run):]
} else if strings.HasPrefix(line, attribute) {
keyword = attribute
line = line[len(attribute):]
if line[0] != '{' {
e.info = "attribute key required"
return rule,log,e
}
line = line[1:]
var found bool = false
for iter = 0; iter < len(line); iter++ {
if line[iter] == '}' {
found = true
attrKey = line[:iter]
line = line[iter+1:]
break
}
}
if !found {
e.info = "unterminated bracket in ATTR"
return rule,log,e
}
} else {
e.info = fmt.Sprintf("unknown keyword, first 10 characters are \"%s\"",
line[:10])
return rule,log,e
}

if len(line) == 0 {
e.info = "premature end of line"
return rule,log,e
}

if strings.HasPrefix(line, equal) {
operation = equal
line = line[len(equal):]
} else if strings.HasPrefix(line, assign) {
operation = assign
line = line[len(assign):]
} else if strings.HasPrefix(line, add) {
operation = add
line = line[len(add):]
} else {
e.info = fmt.Sprintf("unknown operation, first 10 characters are \"%s\"",
line[:10])
return rule,log,e
}

if len(line) == 0 {
e.info = "premature end of line"
return rule,log,e
}

unquotedOK = false
if line[0] != '\'' && line[0] != '"' {
e.info = "unquoted string"
return rule,log,e
}
quote := line[0]
sth = len(line)
for iter = 1; iter < sth; iter++ {
if line[iter] == '\\' && iter == sth - 1 {
e.info = "premature end of line, unterminated quote"
return rule,log,e
} else if line[iter] == '\\' && line[iter + 1] == '\\' {
line = string(append([]byte(line[:iter]), []byte(line[iter+1:])...))
sth--
} else if line[iter] == '\\' && line[iter + 1] == quote {
line = string(append([]byte(line[:iter]), []byte(line[iter+1:])...))
sth--
} else if line[iter] == '\\' {
e.info = "unknown escape sequence"
return rule,log,e
} else if line[iter] == quote {
inquotes = line[1:iter]
line = line[iter+1:]
unquotedOK = true
break
}
}

if !unquotedOK {
e.info = "improperly quoted string"
return rule,log,e
} else if len(line) > 0 && line[0] != ',' {
e.info = "unrecognized token after quoted string, expected a comma"
return rule,log,e
} else if line == "," {
e.info = "premature end of line"
return rule,log,e
} else if len(line) > 0 {
line = line[1:]
}

if (keyword == subsystem ||
keyword == action ||
keyword == attribute) &&
operation != equal {
e.info = fmt.Sprintf("%s does not support %s", keyword, operation)
return rule,log,e
}

if keyword == run && operation == equal {
e.info = fmt.Sprintf("%s does not suport %s", keyword, operation)
return rule,log,e
}

switch keyword {
case subsystem:
if !contains(inquotes, []string{"usb","block"}) {
e.info = fmt.Sprintf("subsystem %s is not supported", inquotes)
return rule,log,e
}
rule.subsystem = inquotes
case action:
if !contains(inquotes, []string{"add", "unbind", "remove", "change", "bind"}) {
e.info = fmt.Sprintf("action %s is not supported", inquotes)
return rule,log,e
}
rule.action = inquotes
case attribute:
rule.attr[attrKey] = inquotes
case run:
switch operation {
case add:
rule.run = append(rule.run, inquotes)
case assign:
rule.run = make([]string, 0, 0)
rule.run = append(rule.run, inquotes)
}
}

if len(line) == 0 {
break
}
}
return rule,log,nil
}

func compileConfigDir (configDir string) (Logger, error) {
log := FuncLogger{funcName: "compileConfigDir"}

dir,err := os.Open(configDir)
if err != nil {
return log,err
}
defer dir.Close()
entries,err := dir.ReadDir(-1)
if err != nil {
return log,err
}

var l int = len(entries)
var i int
pattern := "^[a-zA-Z0-9_]+.rules$"
reg := regexp.MustCompile(pattern)
for i = 0; i < l; i++ {
if !entries[i].Type().IsRegular() {
entries = append(entries[:i], entries[i+1:]...)
i--
l--
}
if !reg.MatchString(entries[i].Name()) {
entries = append(entries[:i], entries[i+1:]...)
i--
l--
}
}
rules = make([]Rule, 0, 0)
var rule Rule
var rulefile string
for _,val := range entries {
rulefile = fmt.Sprintf("%s/%s", configDir, val.Name())
lines,logger,err := readFile(rulefile)
if err != nil {
return logger,err
}
preParsed := preParseConfigFile(lines)
for _,pre := range preParsed {
rule,logger,err = parseRule(pre, rulefile)
if err != nil {
return log,err
}
rules = append(rules,rule)
}
}
return log,nil
}

func handleDevice (dev *udev.Device, rules []Rule) (Logger,error) {
log := FuncLogger{funcName: "handleDevice"}
var breakOuter bool = false
var attrpath string
var devpath string
var attrval []byte
var cmd *exec.Cmd
for _,rule := range rules {
if rule.subsystem != "" && rule.subsystem != dev.Subsystem() {
continue
}
if rule.action != "" && rule.action != dev.Action() {
continue
}
breakOuter = false
devpath = fmt.Sprintf("/sys/%s", dev.Devpath())
for key,val := range rule.attr {
attrpath = fmt.Sprintf("%s/%s", devpath, key)
f,err := os.Open(attrpath)
if err != nil {
return log,err
}

sb,err := f.Stat()
if err != nil {
f.Close()
return log,err
}

if !sb.Mode().IsRegular() {
log.LogErr(fmt.Sprintf("%s: is not a regular file", attrpath))
f.Close()
continue
}

attrval,err = ioutil.ReadAll(f)
if errors.Is(err, os.ErrPermission) {
f.Close()
return log,err
}
attrval = []byte(strings.TrimSpace(string(attrval)))

if string(attrval) != val {
f.Close()
breakOuter = true
break
}
}
if breakOuter {
continue
}
for _,val := range rule.run {
cmd = exec.Command("/bin/sh")
cmd.Args = append(cmd.Args, "-c", fmt.Sprintf("exec %s", val))
log.Log(fmt.Sprintf("executing '%s' in /bin/sh", val))
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
err := cmd.Start()
if err != nil {
return log,err
}
go cmd.Wait()
//var eerr *exec.ExitError
//err := cmd.Run()
//if errors.As(err, &eerr) {
// continue
//} else if err != nil {
// return log,err
//}
}
}
return log,nil
}

func acquireLock(lockfile string) (*os.File, Logger, error) {
log := FuncLogger{funcName: "acquireLock"}
file, err := os.OpenFile(lockfile, os.O_RDONLY|os.O_CREATE, 0666)
if err != nil {
return nil,log,err
}

err = syscall.Flock(int(file.Fd()), syscall.LOCK_EX|syscall.LOCK_NB)
if err != nil {
file.Close()
return nil,log,err
}

return file,log,nil
}

func releaseLock(file *os.File) {
syscall.Flock(int(file.Fd()), syscall.LOCK_UN)
file.Close()
}

func fsWatch(file string, ch chan int, errch chan error, logch chan Logger) {
log := FuncLogger{funcName: "fsWatch"}

watcher, err := fsnotify.NewWatcher()
if err != nil {
errch <- err
logch <- log
return
}
defer watcher.Close()

err = watcher.Add(file)
if err != nil {
errch <- err
logch <- log
return
}
var timerPresent bool = false
delay := time.Second * 10
timer := time.NewTimer(delay)
timer.Stop()
defer func () {
if timerPresent {
timer.Stop()
}
}()
for {
select {
case <-timer.C:
ch <- 0
timer.Stop()
case fsevent,ok := <-watcher.Events:
if !ok {
//wtf
continue
}
if fsevent.Has(fsnotify.Write) {
log.Log(fmt.Sprintf("Detected write to %s", file))
if timerPresent {
timer.Reset(delay)
} else {
timer = time.NewTimer(delay)
timerPresent = true
}
} else if fsevent.Has(fsnotify.Remove) && fsevent.Name == file {
ch <- 1
return
}
case fserror,ok := <-watcher.Errors:
if !ok {// wtf
continue
}
log.LogErr(fserror)
// ignoring because wtf
}
}
}
>> No.223188  
File: 1723743492867.jpg -(441106 B, 1920x1080) Thumbnail displayed, click image for full size.
441106

>>223187
~/.config/udev-worker/usb_keyboard.rules:

SUBSYSTEM=="usb",ACTION=="bind",\
ATTR{idProduct}=="xxxx",\
ATTR{idVendor}=="xxxx",\
RUN+="x-kbd-setup.sh"

Работают только SUBSYSTEM (только block и usb, потому что я не ебу какие еще есть), ACTION (вроде все запилил) и ARRT{}, причем ATTR{} вообще тупой, тупо в /sys/devices/path/to/device смотрит файл с названием, которое в {} и пытается его прочитать. Ну и RUN понятно тоже. Больше ничего не запилено. Вообще это такая себе подтирачка, но для моих целей более, чем достаточно. RUN тупо в /bin/sh все закидывает и похуй, так что аккуратно.

>> No.223189  

>>223187
А что оно вообще делает?

>> No.223190  
File: 1723744265699.jpg -(459983 B, 1920x1080) Thumbnail displayed, click image for full size.
459983

>>223189
>>223188
По сути udev rules для обычных пользователей, такова была задумка. Ну и нет этой маняхуйни, как то, что udev не умеет пускать демонов и всех их убивает после обработки правил.

>> No.225550  
File: 1728903678690.jpg -(46316 B, 585x523) Thumbnail displayed, click image for full size.
46316
git commit -m "minor: $(curl -Ls whatthecommit.com/index.txt)"
>> No.225554  
File: 1728905601270.jpg -(126433 B, 1280x932) Thumbnail displayed, click image for full size.
126433

https://github.com/gjedeer/tuntox Существует ли более простой способ пробивать любой нат? Мне очень понравилась эта софтина, но нет под винду или openwrt, что печально.
Какие вы знаете простые способы пробивать нат без регистрации и смс?
NAT P2P DHT

>> No.225556  

>>225554
https://github.com/samyk/pwnat
STUN/TURN/UPnP/ICE

>> No.225557  

>>225554
zerotier
Оно хоть и коммерческое но бесплатный вариант вполне юзабелен.

>> No.225560  

>>225557
Луну захости. Со своим контроллером.

>> No.225610  
File: 1729002586572.jpg -(244278 B, 1077x1066) Thumbnail displayed, click image for full size.
244278

>>225554

>Какие вы знаете простые способы пробивать нат без регистрации и смс?

Недавно ходил в местный хакерсейс по SSH over i2p.
Настроил по этой статьей:
https://dataswamp.org/~solene/2021-06-20-i2p-intro.html

Говорят, что также можно yggdrasil настроить.

>> No.225770  
File: 1729284719415.jpg -(44818 B, 500x500) Thumbnail displayed, click image for full size.
44818

Хочу вести заметки, но не просто а сложно. В идеале некое бесконечно расширяемое белое пространство с возможностью вставлять картинки, видео, хтмл файлы, эдакий файл жпг но с интерактивом и адекватным редактированием. Есть что на примете?
Если у кого есть доступ к нормальной нейросетке то спросите у нее. Спасибо.

>> No.225771  

>>225770
https://github.com/excalidraw/excalidraw
https://github.com/spacedeck/spacedeck-open
https://github.com/OpenBoard-org/OpenBoard
https://github.com/lovasoa/whitebophir
https://github.com/tldraw/tldraw

>> No.226709  

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

cgcreate -s 666 -g cpu:lowprio
echo 1 > /sys/fs/cgroup/cpu/lowprio/cpu.shares

Я себе только что такой скрипт запилил

#!/bin/sh

cg=/sys/fs/cgroup/cpu/lowprio

if ! [ -d "$cg" ]; then
echo "Lowprio CPU cgroup not available" >&2
exit 1
fi

if ! [ -w "$cg/tasks" ]; then
echo "$cg/tasks must be writeable" >&2
exit 1
fi

while read -r line; do
case "$line" in
Pid:*) break;;
*);;
esac
done < /proc/self/status

read -r _junk pid <<EOF
$line
EOF

echo "$pid" > "$cg/tasks"
exec "$@"


Delete Post []
Password

[/b/] [/d/] [/tu/] [/a/] [/ph/] [/wa/] [/cg/] [/t/] [/p/]