Dir sync plugin

Craig Shelley <[email protected]> Thu, 29 Jun 2006 12:35:00 +0100
Newsgroups gmane.comp.gnome.apps.multisync.devel
Message-ID <[email protected]>
--===============1808300096==
Content-Type: multipart/signed; micalg=pgp-sha1;
	protocol="application/pgp-signature";
	boundary="=-+y+5w2DDVgOjwYJyH4AX"


--=-+y+5w2DDVgOjwYJyH4AX
Content-Type: multipart/mixed; boundary="=-zNWKKbKHMsmxcdRjzVQV"


--=-zNWKKbKHMsmxcdRjzVQV
Content-Type: text/plain
Content-Transfer-Encoding: quoted-printable

Hi all,

I have probably reinvented the wheel here, however I thought it may be
useful if I share the modifications I have made to the multisync backup
plugin.

My intention was to synchronise calenders/contacts/tasks on several
computers running evolution, laptop <-> desktop etc...
This modified version of the backup plugin stores the entries in exactly
the same way as before, however it can detect when new files are added
to the directory and when files are removed/modified (based upon the
modification time stamp).

This enables several computers to sync to the same directory either by
NFS or using software such as Unison to keep a local copy of the backup
directory in sync with remote copies.

I have been testing this for a day or two, and it appears to be working
flawlessly for contacts and calendars. The handling of task data seems
to be a little broken, however I believe this not to be a fault of this
plugin.

Since the backup directory no-longer contains the backup_entries file,
synchronising multiple backups is much simplified, and it enables many
people to share calendars/contacts/tasks using the file-system, or
whatever directory level synchronisation method is preferred.

All comments welcome!

Regards,

--=20
Craig Shelley
EMail: [email protected]
Jabber: shell-M/[email protected]

--=-zNWKKbKHMsmxcdRjzVQV
Content-Disposition: attachment; filename=backup_plugin.c
Content-Type: text/x-csrc; name=backup_plugin.c; charset=ISO-8859-1
Content-Transfer-Encoding: base64

LyogDQogICBNdWx0aVN5bmMgQmFja3VwIFBsdWdpbiAtIEJhY2t1cCB5b3VyIFBJTSBkYXRhDQog
ICBDb3B5cmlnaHQgKEMpIDIwMDItMjAwMyBCbyBMaW5jb2xuIDxsaW5jb2xuQGx5c2F0b3IubGl1
LnNlPg0KDQogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3Ry
aWJ1dGUgaXQgYW5kL29yIG1vZGlmeQ0KICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUg
R2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMNCiAgIHB1Ymxpc2hlZCBieSB0aGUg
RnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOw0KDQogICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQg
IkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUw0KICAgT1IgSU1Q
TElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFksDQogICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9O
SU5GUklOR0VNRU5UIE9GIFRISVJEIFBBUlRZIFJJR0hUUy4NCiAgIElOIE5PIEVWRU5UIFNIQUxM
IFRIRSBDT1BZUklHSFQgSE9MREVSKFMpIEFORCBBVVRIT1IoUykgQkUgTElBQkxFIEZPUiBBTlkN
CiAgIENMQUlNLCBPUiBBTlkgU1BFQ0lBTCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFH
RVMsIE9SIEFOWSBEQU1BR0VTIA0KICAgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9G
IFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIA0KICAgQUNUSU9OIE9GIENPTlRS
QUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0Yg
DQogICBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElT
IFNPRlRXQVJFLg0KDQogICBBTEwgTElBQklMSVRZLCBJTkNMVURJTkcgTElBQklMSVRZIEZPUiBJ
TkZSSU5HRU1FTlQgT0YgQU5ZIFBBVEVOVFMsIA0KICAgQ09QWVJJR0hUUywgVFJBREVNQVJLUyBP
UiBPVEhFUiBSSUdIVFMsIFJFTEFUSU5HIFRPIFVTRSBPRiBUSElTIA0KICAgU09GVFdBUkUgSVMg
RElTQ0xBSU1FRC4NCiovDQoNCi8qDQogKiAgJElkOiBiYWNrdXBfcGx1Z2luLmMsdiAxLjkgMjAw
My8wOC8yNiAyMDowNTo0OSBsaW5jb2xuIEV4cCAkDQogKi8NCiNpbmNsdWRlIDxzdGRsaWIuaD4N
CiNpbmNsdWRlIDxnbGliLmg+DQojaW5jbHVkZSA8c3RyaW5nLmg+DQojaW5jbHVkZSA8c3lzL3R5
cGVzLmg+DQojaW5jbHVkZSA8ZGlyZW50Lmg+DQojaW5jbHVkZSA8c3lzL3N0YXQuaD4NCiNpbmNs
dWRlIDx0aW1lLmg+DQojaW5jbHVkZSA8dW5pc3RkLmg+DQojaW5jbHVkZSA8Z21vZHVsZS5oPg0K
I2luY2x1ZGUgPGd0ay9ndGttYWluLmg+DQojaW5jbHVkZSA8Z3RrL2d0a3NpZ25hbC5oPg0KI2lu
Y2x1ZGUgPG11bHRpc3luYy5oPg0KI2luY2x1ZGUgImJhY2t1cF9wbHVnaW4uaCINCiNpbmNsdWRl
ICJndWkuaCINCg0KI2RlZmluZSBCQUNLVVBGSUxFICJiYWNrdXAiDQoNCnZvaWQgYmFja3VwX2xv
YWRfc3RhdGUoYmFja3VwX2Nvbm5lY3Rpb24gKmNvbm4pIHsNCiAgY2hhciAqZmlsZW5hbWU7DQog
IEZJTEUgKmY7DQogIGNoYXIgbGluZVsyNTZdOw0KDQogIGZpbGVuYW1lID0gZ19zdHJkdXBfcHJp
bnRmKCIlcy8lcyVzIiwgc3luY19nZXRfZGF0YXBhdGgoY29ubi0+c3luY19wYWlyKSwgDQoJCQkg
ICAgIChjb25uLT5jb25udHlwZT09Q09OTkVDVElPTl9UWVBFX0xPQ0FMPyJsb2NhbCI6InJlbW90
ZSIpLCBCQUNLVVBGSUxFKTsNCiAgaWYgKChmID0gZm9wZW4oZmlsZW5hbWUsICJyIikpKSB7DQog
ICAgd2hpbGUgKGZnZXRzKGxpbmUsIDI1NiwgZikpIHsNCiAgICAgIGNoYXIgcHJvcFsxMjhdLCBk
YXRhWzI1Nl07DQogICAgICBpZiAoc3NjYW5mKGxpbmUsICIlMTI4cyA9ICUyNTZbXlxuXSIsIHBy
b3AsIGRhdGEpID09IDIpIHsNCglpZiAoIXN0cmNtcChwcm9wLCAiYmFja3VwZGlyIikpIHsNCgkg
IGNvbm4tPmJhY2t1cGRpciA9IGdfc3RyZHVwKGRhdGEpOw0KCX0NCglpZiAoIXN0cmNtcChwcm9w
LCAicmViYWNrdXBhbGwiKSkgew0KCSAgaWYgKCFzdHJjbXAoZGF0YSwgInllcyIpKQ0KCSAgICBj
b25uLT5yZWJhY2t1cGFsbCA9IFRSVUU7DQoJICBlbHNlDQoJICAgIGNvbm4tPnJlYmFja3VwYWxs
ID0gRkFMU0U7DQoJfQ0KCWlmICghc3RyY21wKHByb3AsICJoYXJkZGVsZXRlIikpIHsNCgkgIGlm
ICghc3RyY21wKGRhdGEsICJ5ZXMiKSkNCgkgICAgY29ubi0+aGFyZGRlbGV0ZSA9IFRSVUU7DQoJ
ICBlbHNlDQoJICAgIGNvbm4tPmhhcmRkZWxldGUgPSBGQUxTRTsNCgl9DQogICAgICB9DQogICAg
fQ0KICAgIGZjbG9zZShmKTsNCiAgfQ0KICBnX2ZyZWUoZmlsZW5hbWUpOw0KfQ0KDQp2b2lkIGJh
Y2t1cF9zYXZlX3N0YXRlKGJhY2t1cF9jb25uZWN0aW9uICpjb25uKSB7DQogIEZJTEUgKmY7DQog
IGNoYXIgKmZpbGVuYW1lOw0KICANCiAgZmlsZW5hbWUgPSBnX3N0cmR1cF9wcmludGYoIiVzLyVz
JXMiLCBzeW5jX2dldF9kYXRhcGF0aChjb25uLT5zeW5jX3BhaXIpLA0KCQkJICAgICAoY29ubi0+
Y29ubnR5cGU9PUNPTk5FQ1RJT05fVFlQRV9MT0NBTD8ibG9jYWwiOiJyZW1vdGUiKSwgQkFDS1VQ
RklMRSk7DQogIGlmICgoZiA9IGZvcGVuKGZpbGVuYW1lLCAidyIpKSkgew0KDQogICAgaWYgKGNv
bm4tPmJhY2t1cGRpcikNCiAgICAgIGZwcmludGYoZiwgImJhY2t1cGRpciA9ICVzXG4iLCBjb25u
LT5iYWNrdXBkaXIpOw0KICAgIGZwcmludGYoZiwgInJlYmFja3VwYWxsID0gJXNcbiIsIGNvbm4t
PnJlYmFja3VwYWxsPyJ5ZXMiOiJubyIpOw0KICAgIGZwcmludGYoZiwgImhhcmRkZWxldGUgPSAl
c1xuIiwgY29ubi0+aGFyZGRlbGV0ZT8ieWVzIjoibm8iKTsNCiAgICBmY2xvc2UoZik7DQogIH0N
CiAgZ19mcmVlKGZpbGVuYW1lKTsNCn0NCg0KLy9SZXR1cm4gYSBsaW5lIG9mIGRhdGEgZnJvbSBh
IHZDQVJELCB2Q0FMRU5EQVIgZXRjLiBGcmVlIHRoZSBzdHJpbmcgDQovLyB1c2luZyBnX2ZyZWUo
KS4NCmNoYXIqIGJhY2t1cF9nZXRfZW50cnlfZGF0YShjaGFyICpjYXJkLCBjaGFyICprZXkpIHsN
CiAgY2hhciAqcG9zID0gY2FyZDsNCiAgaW50IGwgPSBzdHJsZW4oa2V5KTsNCg0KICB3aGlsZSAo
cG9zKSB7DQogICAgaWYgKCFzdHJuY21wKHBvcywga2V5LCBsKSAmJiAocG9zW2xdID09ICc6JyB8
fCBwb3NbbF0gPT0gJzsnKSkgew0KICAgICAgY2hhciAqc3RhcnQsICplbmQ7DQogICAgICBzdGFy
dCA9IHN0cnN0cihwb3MrbCwgIjoiKTsNCiAgICAgIGlmIChzdGFydCkgew0KCXN0YXJ0Kys7DQoJ
ZW5kID0gc3Ryc3RyKHN0YXJ0LCAiXG4iKTsNCglpZiAoIWVuZCkNCgkgIGVuZCA9IGNhcmQrc3Ry
bGVuKGNhcmQpOw0KCWlmICgqKGVuZC0xKSA9PSAnXHInKQ0KCSAgZW5kLS07DQoJcmV0dXJuKGdf
c3RybmR1cChzdGFydCwgZW5kLXN0YXJ0KSk7DQogICAgICB9DQogICAgfQ0KICAgIHBvcyA9IHN0
cnN0cihwb3MsICJcbiIpOw0KICAgIGlmIChwb3MpDQogICAgICBwb3MgKz0gMTsNCiAgfQ0KICBy
ZXR1cm4oTlVMTCk7DQp9DQoNCiNkZWZpbmUgQkFDS1VQRU5UUllGSUxFICJiYWNrdXBfZW50cmll
cyINCg0Kdm9pZCBiYWNrdXBfbG9hZF9lbnRyaWVzKGJhY2t1cF9jb25uZWN0aW9uICpjb25uKSB7
DQogIGNoYXIgKmZpbGVuYW1lOw0KICBGSUxFICpmOw0KICBjaGFyIGxpbmVbNTEyXTsNCg0KDQog
IC8qIElmIHRoZSBiYWNrdXBkaXIgaGFzbid0IGJlZW4gY29uZmlndXJlZCwgc2tpcCB0aGlzIGZ1
bmN0aW9uICovDQogIGlmKGNvbm4tPmJhY2t1cGRpciA9PSBOVUxMKSByZXR1cm47DQoNCiAgZmls
ZW5hbWUgPSBnX3N0cmR1cF9wcmludGYgKCIlcy8lcyIsIHN5bmNfZ2V0X2RhdGFwYXRoKGNvbm4t
PnN5bmNfcGFpciksIA0KCQkJICAgICAgQkFDS1VQRU5UUllGSUxFKTsNCiAgaWYgKChmID0gZm9w
ZW4oZmlsZW5hbWUsICJyIikpKSB7DQogICAgd2hpbGUgKGZnZXRzKGxpbmUsIDUxMiwgZikpIHsN
CiAgICAgIGNoYXIgdWlkWzI1Nl07DQogICAgICBpbnQgb2JqdHlwZSwgbW9kX3RpbWU7DQogICAg
ICBpZiAoc3NjYW5mKGxpbmUsICIlZCAldSAlMjU2cyIsICZvYmp0eXBlLCAmbW9kX3RpbWUsIHVp
ZCkgPj0gMykgew0KCWJhY2t1cF9vYmplY3QgKmVudHJ5ID0gZ19tYWxsb2Moc2l6ZW9mKGJhY2t1
cF9vYmplY3QpKTsNCglnX2Fzc2VydChlbnRyeSk7DQoJZW50cnktPnVpZCA9IGdfc3RyZHVwKHVp
ZCk7DQoJZW50cnktPm9iamVjdF90eXBlID0gb2JqdHlwZTsNCgllbnRyeS0+bW9kX3RpbWUgPSBt
b2RfdGltZTsNCgljb25uLT5lbnRyaWVzID0gZ19saXN0X2FwcGVuZChjb25uLT5lbnRyaWVzLCBl
bnRyeSk7DQogICAgICB9DQogICAgfQ0KICAgIGZjbG9zZShmKTsNCiAgfQ0KICBnX2ZyZWUoZmls
ZW5hbWUpOw0KfQ0KDQp2b2lkIGJhY2t1cF9zYXZlX2VudHJpZXMoYmFja3VwX2Nvbm5lY3Rpb24g
KmNvbm4pIHsNCiAgY2hhciAqZmlsZW5hbWU7DQogIEZJTEUgKmY7DQoNCiAgZmlsZW5hbWUgPSBn
X3N0cmR1cF9wcmludGYgKCIlcy8lcyIsIHN5bmNfZ2V0X2RhdGFwYXRoKGNvbm4tPnN5bmNfcGFp
ciksIA0KCQkJICAgICAgQkFDS1VQRU5UUllGSUxFKTsNCiAgaWYgKChmID0gZm9wZW4oZmlsZW5h
bWUsICJ3IikpKSB7DQogICAgR0xpc3QgKmw7DQogICAgZm9yIChsPWNvbm4tPmVudHJpZXM7IGw7
IGwgPSBsLT5uZXh0KSB7DQogICAgICBpbnQgY2hhbmdldHlwZTsNCiAgICAgIGludCBvYmp0eXBl
Ow0KICAgICAgYmFja3VwX29iamVjdCAqZW50cnk7DQogICAgICBlbnRyeSA9IGwtPmRhdGE7DQog
ICAgICBvYmp0eXBlID0gZW50cnktPm9iamVjdF90eXBlOw0KICAgICAgY2hhbmdldHlwZSA9IGVu
dHJ5LT50eXBlOw0KICAgICAgZnByaW50ZihmLCAiJWQgJXUgJXNcbiIsIG9ianR5cGUsIGVudHJ5
LT5tb2RfdGltZSwgZW50cnktPnVpZCk7DQogICAgfQ0KICAgIGZjbG9zZShmKTsNCiAgfQ0KICBn
X2ZyZWUoZmlsZW5hbWUpOw0KfQ0KDQp2b2lkIGJhY2t1cF9mcmVlX2VudHJpZXMoYmFja3VwX2Nv
bm5lY3Rpb24gKmNvbm4pIHsNCiAgd2hpbGUgKGNvbm4tPmVudHJpZXMpIHsNCiAgICBHTGlzdCAq
ZW50cmllczsNCiAgICBiYWNrdXBfb2JqZWN0ICplbnRyeTsNCiAgICANCiAgICBlbnRyaWVzID0g
Z19saXN0X2ZpcnN0KGNvbm4tPmVudHJpZXMpOw0KICAgIGlmIChlbnRyaWVzLT5kYXRhKSB7DQog
ICAgICBlbnRyeSA9IGVudHJpZXMtPmRhdGE7DQogICAgICBpZiAoZW50cnktPnVpZCkgDQoJZ19m
cmVlKGVudHJ5LT51aWQpOw0KICAgICAgZ19mcmVlKGVudHJ5KTsNCiAgICB9DQogICAgY29ubi0+
ZW50cmllcyA9IGdfbGlzdF9yZW1vdmVfbGluayhjb25uLT5lbnRyaWVzLCBlbnRyaWVzKTsNCiAg
fQ0KfQ0KDQpnYm9vbGVhbiBiYWNrdXBfZG9fY29ubmVjdChncG9pbnRlciBkYXRhKSB7DQogIGJh
Y2t1cF9jb25uZWN0aW9uICpjb25uID0gZGF0YTsNCiAgc3RydWN0IHN0YXQgc3RhdGJ1ZjsNCg0K
ICBpZiAoIWNvbm4tPmJhY2t1cGRpcikgew0KICAgIGJhY2t1cF9zaG93X21zZygiQmFja3VwIHBs
dWdpbjogUGxlYXNlIHNldCB0aGUgYmFja3VwIGRpcmVjdG9yeVxuaW4gdGhlIGJhY2t1cCBvcHRp
b25zIGZpcnN0LiIpOw0KICAgIGdvdG8gZXJyOw0KICB9DQogIA0KICBpZiAoc3RhdChjb25uLT5i
YWNrdXBkaXIsICZzdGF0YnVmKSA9PSAtMSkgew0KICAgIGlmIChta2Rpcihjb25uLT5iYWNrdXBk
aXIsIDA3MDApKQ0KICAgICAgZ290byBlcnI7DQogIH0NCiAgYmFja3VwX2xvYWRfZW50cmllcyhj
b25uKTsNCiAgc3luY19zZXRfcmVxdWVzdGRvbmUoY29ubi0+c3luY19wYWlyKTsNCiAgcmV0dXJu
KEZBTFNFKTsNCiAgZXJyOg0KICBzeW5jX3NldF9yZXF1ZXN0ZmFpbGVkKGNvbm4tPnN5bmNfcGFp
cik7DQogIHJldHVybihGQUxTRSk7DQp9ICANCg0KYmFja3VwX2Nvbm5lY3Rpb24qIHN5bmNfY29u
bmVjdChzeW5jX3BhaXIqIGhhbmRsZSwgY29ubmVjdGlvbl90eXBlIHR5cGUsDQoJCQkJc3luY19v
YmplY3RfdHlwZSBvYmplY3RfdHlwZXMpIHsNCiAgYmFja3VwX2Nvbm5lY3Rpb24gKmNvbm47DQog
IGNvbm4gPSBnX21hbGxvYzAoc2l6ZW9mKGJhY2t1cF9jb25uZWN0aW9uKSk7DQogIGNvbm4tPnN5
bmNfcGFpciA9IGhhbmRsZTsNCiAgY29ubi0+Y29ubnR5cGUgPSB0eXBlOw0KICBiYWNrdXBfbG9h
ZF9zdGF0ZShjb25uKTsNCiAgDQogIGdfaWRsZV9hZGQoYmFja3VwX2RvX2Nvbm5lY3QsIGNvbm4p
Ow0KICByZXR1cm4oY29ubik7DQp9DQoNCnZvaWQgYmFja3VwX2ZyZWVfY29ubmVjdGlvbihiYWNr
dXBfY29ubmVjdGlvbiAqY29ubikgew0KICBpZiAoY29ubikgew0KICAgIGJhY2t1cF9mcmVlX2Vu
dHJpZXMoY29ubik7DQogICAgaWYgKGNvbm4tPmJhY2t1cGRpcikNCiAgICAgIGdfZnJlZShjb25u
LT5iYWNrdXBkaXIpOw0KICAgIGdfZnJlZShjb25uKTsNCiAgfQ0KfQ0KDQp2b2lkIHN5bmNfZGlz
Y29ubmVjdChiYWNrdXBfY29ubmVjdGlvbiAqY29ubikgew0KICBzeW5jX3BhaXIgKnN5bmNfcGFp
ciA9IGNvbm4tPnN5bmNfcGFpcjsNCiAgYmFja3VwX2ZyZWVfY29ubmVjdGlvbihjb25uKTsNCiAg
c3luY19zZXRfcmVxdWVzdGRvbmUoc3luY19wYWlyKTsNCn0NCg0KdHlwZWRlZiBzdHJ1Y3Qgew0K
ICBiYWNrdXBfY29ubmVjdGlvbiAqY29ubjsNCiAgc3luY19vYmplY3RfdHlwZSBuZXdkYnM7DQp9
IGJhY2t1cF9nZXRfY2hhbmdlc19hcmc7DQoNCg0KZ2Jvb2xlYW4gYmFja3VwX2RvX2dldF9jaGFu
Z2VzKGdwb2ludGVyIGRhdGEpIHsNCiAgYmFja3VwX2dldF9jaGFuZ2VzX2FyZyAqYXJnID0gZGF0
YTsNCiAgYmFja3VwX2Nvbm5lY3Rpb24gKmNvbm4gPSBhcmctPmNvbm47DQogIGludCB0Ow0KICBH
TGlzdCAqY2hhbmdlcyA9IE5VTEw7DQogIGNoYW5nZV9pbmZvICpjaGluZm87DQogIHN5bmNfb2Jq
ZWN0X3R5cGUgbmV3ZGJzID0gYXJnLT5uZXdkYnM7DQoNCiAgZ19mcmVlKGFyZyk7DQogIGlmIChu
ZXdkYnMpIHsNCiAgICBnYm9vbGVhbiBhc2sgPSBGQUxTRTsNCiAgICBmb3IgKHQgPSAwOyB0IDwg
Z19saXN0X2xlbmd0aChjb25uLT5lbnRyaWVzKTsgdCsrKSB7DQogICAgICBiYWNrdXBfb2JqZWN0
ICplbnRyeSA9IGdfbGlzdF9udGhfZGF0YShjb25uLT5lbnRyaWVzLCB0KTsNCiAgICAgIGlmIChu
ZXdkYnMgJiBlbnRyeS0+b2JqZWN0X3R5cGUpDQoJYXNrID0gVFJVRTsNCiAgICB9DQogICAgaWYg
KGFzaykgew0KICAgICAgaWYgKCFiYWNrdXBfc2hvd19xdWVzdGlvbigiT25lIG9yIG1vcmUgb2Yg
dGhlIG90aGVyIHNpZGUgZGF0YWJhc2VzXG5zZWVtIHRvIGhhdmUgYmVlbiByZXNldC5cbldvdWxk
IHlvdSBsaWtlIHRvIHJlc3RvcmUgdGhlIGRhdGEgZnJvbSBiYWNrdXA/IikpDQoJbmV3ZGJzID0g
MDsNCiAgICB9DQogIH0NCg0KICBESVIgKmQgPSBvcGVuZGlyKGNvbm4tPmJhY2t1cGRpcik7DQog
IGlmIChkKSB7DQogICAgc3RydWN0IGRpcmVudCAqZGlyZW50cnk7DQogICAgd2hpbGUgKGRpcmVu
dHJ5PXJlYWRkaXIoZCkpIHsNCiAgICAgIGNoYXIgKiBmbmFtZSA9IGdfc3RyZHVwX3ByaW50Zigi
JXMvJXMiLCBjb25uLT5iYWNrdXBkaXIsIGRpcmVudHJ5LT5kX25hbWUpOw0KICAgICAgc3RydWN0
IHN0YXQgc3RhdGJ1ZjsNCiAgICAgIGlmICghc3RhdChmbmFtZSwgJnN0YXRidWYpKSB7DQoJaWYg
KFNfSVNSRUcoc3RhdGJ1Zi5zdF9tb2RlKSkgew0KCSAgDQoJICAvKlRyeSB0byBmaW5kIHRoZSBl
bnRyeSBmb3IgdGhpcyBmaWxlKi8NCgkgIGJhY2t1cF9vYmplY3QgKmZvdW5kX2VudHJ5PU5VTEw7
DQoJICBmb3IgKHQgPSAwOyB0IDwgZ19saXN0X2xlbmd0aChjb25uLT5lbnRyaWVzKTsgdCsrKSB7
DQoJICAgIGJhY2t1cF9vYmplY3QgKmVudHJ5ID0gZ19saXN0X250aF9kYXRhKGNvbm4tPmVudHJp
ZXMsIHQpOw0KCSAgICBpZiAoc3RyY21wKGRpcmVudHJ5LT5kX25hbWUsIGVudHJ5LT51aWQpID09
IDApIHsNCgkgICAgICBmb3VuZF9lbnRyeSA9IGVudHJ5Ow0KCSAgICAgIGJyZWFrOw0KCSAgICB9
DQoJICB9DQoNCgkgIC8qIElmIG5vIGVudHJ5IHdhcyBmb3VuZCBmb3IgdGhpcyBmaWxlKi8NCgkg
IGlmICghZm91bmRfZW50cnkpIHsNCgkgICAgLyogTmV3IGZpbGUgZm91bmQgKi8NCgkgICAgcHJp
bnRmKCJCQUNLVVA6IE5ldyBmaWxlICVzXG4iLCBmbmFtZSk7DQoJICAgIGJhY2t1cF9vYmplY3Qg
KmVudHJ5ID0gZ19tYWxsb2Moc2l6ZW9mKGJhY2t1cF9vYmplY3QpKTsNCgkgICAgZ19hc3NlcnQo
ZW50cnkpOw0KCSAgICBlbnRyeS0+dWlkID0gZ19zdHJkdXAoZGlyZW50cnktPmRfbmFtZSk7DQoJ
ICAgIGVudHJ5LT5tb2RfdGltZSA9IChpbnQpIHN0YXRidWYuc3RfbXRpbWU7DQoJICAgIGNvbm4t
PmVudHJpZXMgPSBnX2xpc3RfYXBwZW5kKGNvbm4tPmVudHJpZXMsIGVudHJ5KTsNCg0KCSAgICAv
KiBMb2FkIHRoZSBjaGFuZ2VzICovDQoJICAgIGNoYW5nZWRfb2JqZWN0ICpjaGFuZ2UgPSBnX21h
bGxvYzAoc2l6ZW9mKGNoYW5nZWRfb2JqZWN0KSk7DQoJICAgIGNoYW5nZS0+Y29tcCA9IGdfbWFs
bG9jMChzdGF0YnVmLnN0X3NpemUrMSk7DQoJICAgIEZJTEUgKmY7DQoJICAgIGlmICgoZiA9IGZv
cGVuKGZuYW1lLCAiciIpKSkgew0KCSAgICAgIGZyZWFkKGNoYW5nZS0+Y29tcCwgMSwgc3RhdGJ1
Zi5zdF9zaXplLCBmKTsNCgkgICAgICBmY2xvc2UoZik7DQoJICAgIH0NCgkgICAgaWYgKHN0cm5j
bXAoY2hhbmdlLT5jb21wLCAiQkVHSU46VkNBTEVOREFSIiwgMTUpID09IDAgJiYgc3RybGVuKGNo
YW5nZS0+Y29tcCkgPiAzMCkNCgkgICAgew0KCSAgICAgIGludCBpOw0KCSAgICAgIGVudHJ5LT5v
YmplY3RfdHlwZSA9IFNZTkNfT0JKRUNUX1RZUEVfVU5LTk9XTjsNCgkgICAgICBmb3IgKGk9MTU7
IGk8MjAgJiYgY2hhbmdlLT5jb21wW2ldICE9ICdCJzsgaSsrKTsNCgkgICAgICBpZiAoc3RybmNt
cChjaGFuZ2UtPmNvbXAgKyBpLCAiQkVHSU46VkVWRU5UIiwgMTIpID09IDApDQoJCWVudHJ5LT5v
YmplY3RfdHlwZSA9IFNZTkNfT0JKRUNUX1RZUEVfQ0FMRU5EQVI7DQoJICAgICAgaWYgKHN0cm5j
bXAoY2hhbmdlLT5jb21wICsgaSwgIkJFR0lOOlZUT0RPIiwgMTEpID09IDApDQoJCWVudHJ5LT5v
YmplY3RfdHlwZSA9IFNZTkNfT0JKRUNUX1RZUEVfVE9ETzsNCgkgICAgfQ0KCSAgICBpZiAoc3Ry
bmNtcChjaGFuZ2UtPmNvbXAsICJCRUdJTjpWQ0FSRCIsIDExKSA9PSAwKQ0KCSAgICAgIGVudHJ5
LT5vYmplY3RfdHlwZSA9IFNZTkNfT0JKRUNUX1RZUEVfUEhPTkVCT09LOw0KDQoJICAgIHByaW50
ZigiQkFDS1VQOiB0eXBlID0gJWlcbiIsIGVudHJ5LT5vYmplY3RfdHlwZSk7DQoNCgkgICAgY2hh
bmdlLT51aWQgPSBnX3N0cmR1cChlbnRyeS0+dWlkKTsNCgkgICAgY2hhbmdlLT5jaGFuZ2VfdHlw
ZSA9IFNZTkNfT0JKX0FEREVEOw0KCSAgICBjaGFuZ2UtPm9iamVjdF90eXBlID0gZW50cnktPm9i
amVjdF90eXBlOw0KCSAgICBjaGFuZ2VzID0gZ19saXN0X2FwcGVuZChjaGFuZ2VzLCBjaGFuZ2Up
Ow0KDQoJICB9IGVsc2Ugew0KCSAgICAvKiBFeGlzdGluZyBlbnRyeSwgY2hlY2sgbW9kaWZpY2F0
aW9uIHRpbWUqLw0KCSAgICBpZiAoZm91bmRfZW50cnktPm1vZF90aW1lICE9IChpbnQpIHN0YXRi
dWYuc3RfbXRpbWUpIHsNCgkgICAgICBwcmludGYoIkJBQ0tVUDogRmlsZSBtb2RpZmllZCAlcyB0
eXBlID0gJWlcbiIsIGZuYW1lLCBmb3VuZF9lbnRyeS0+b2JqZWN0X3R5cGUpOw0KCSAgICAgIGZv
dW5kX2VudHJ5LT5tb2RfdGltZSA9IChpbnQpIHN0YXRidWYuc3RfbXRpbWU7DQoJICAgICAgLyog
TG9hZCB0aGUgY2hhbmdlcyAqLw0KCSAgICAgIGNoYW5nZWRfb2JqZWN0ICpjaGFuZ2UgPSBnX21h
bGxvYzAoc2l6ZW9mKGNoYW5nZWRfb2JqZWN0KSk7DQoJICAgICAgRklMRSAqZiA9IE5VTEw7DQoJ
ICAgICAgY2hhbmdlLT5jb21wID0gZ19tYWxsb2MwKHN0YXRidWYuc3Rfc2l6ZSsxKTsNCgkgICAg
ICBpZiAoKGYgPSBmb3BlbihmbmFtZSwgInIiKSkpIHsNCgkJZnJlYWQoY2hhbmdlLT5jb21wLCAx
LCBzdGF0YnVmLnN0X3NpemUsIGYpOw0KCQlmY2xvc2UoZik7DQoJICAgICAgfQ0KCSAgICAgIGNo
YW5nZS0+dWlkID0gZ19zdHJkdXAoZm91bmRfZW50cnktPnVpZCk7DQoJICAgICAgY2hhbmdlLT5j
aGFuZ2VfdHlwZSA9IFNZTkNfT0JKX01PRElGSUVEOw0KCSAgICAgIGNoYW5nZS0+b2JqZWN0X3R5
cGUgPSBmb3VuZF9lbnRyeS0+b2JqZWN0X3R5cGU7DQoJICAgICAgY2hhbmdlcyA9IGdfbGlzdF9h
cHBlbmQoY2hhbmdlcywgY2hhbmdlKTsNCgkgICAgfQ0KCSAgfQ0KDQoJfQ0KICAgICAgfQ0KICAg
ICAgZ19mcmVlKGZuYW1lKTsNCiAgICB9DQogICAgY2xvc2VkaXIoZCk7DQogIH0NCg0KICBHTGlz
dCAqZW50cmllcyA9IGdfbGlzdF9maXJzdChjb25uLT5lbnRyaWVzKTsNCiAgd2hpbGUoZW50cmll
cykgew0KICAgIGJhY2t1cF9vYmplY3QgKmVudHJ5ID0gZW50cmllcy0+ZGF0YTsNCiAgICBlbnRy
aWVzID0gZ19saXN0X25leHQoZW50cmllcyk7DQogICAgaWYgKGVudHJ5KSB7DQogICAgICBjaGFy
ICogZm5hbWUgPSBnX3N0cmR1cF9wcmludGYoIiVzLyVzIiwgY29ubi0+YmFja3VwZGlyLCBlbnRy
eS0+dWlkKTsNCiAgICAgIHN0cnVjdCBzdGF0IHN0YXRidWY7DQogICAgICBpZiAoc3RhdChmbmFt
ZSwgJnN0YXRidWYpKSB7DQoJcHJpbnRmKCJCQUNLVVA6IEZpbGUgZGVsZXRlZCAlcyB0eXBlID0g
JWlcbiIsIGZuYW1lLCBlbnRyeS0+b2JqZWN0X3R5cGUpOw0KCWNoYW5nZWRfb2JqZWN0ICpjaGFu
Z2UgPSBnX21hbGxvYzAoc2l6ZW9mKGNoYW5nZWRfb2JqZWN0KSk7DQoJY2hhbmdlLT51aWQgPSBn
X3N0cmR1cChlbnRyeS0+dWlkKTsNCgljaGFuZ2UtPmNoYW5nZV90eXBlID0gU1lOQ19PQkpfSEFS
RERFTEVURUQ7DQoJY2hhbmdlLT5vYmplY3RfdHlwZSA9IGVudHJ5LT5vYmplY3RfdHlwZTsNCglj
aGFuZ2VzID0gZ19saXN0X2FwcGVuZChjaGFuZ2VzLCBjaGFuZ2UpOw0KDQoJY29ubi0+ZW50cmll
cyA9IGdfbGlzdF9yZW1vdmUoY29ubi0+ZW50cmllcywgZW50cnkpOw0KCWlmIChlbnRyeS0+dWlk
KSB7DQoJICBnX2ZyZWUoZW50cnktPnVpZCk7DQoJICBnX2ZyZWUoZW50cnkpOw0KCX0NCglnX2Zy
ZWUoZm5hbWUpOw0KICAgICAgfQ0KICAgIH0NCiAgfQ0KICANCiAgcHJpbnRmKCJCQUNLVVA6IEZv
dW5kICVpIGNoYW5nZXMuXG4iLCBnX2xpc3RfbGVuZ3RoKGNoYW5nZXMpKTsNCiAgDQogIGNoaW5m
byA9IGdfbWFsbG9jMChzaXplb2YoY2hhbmdlX2luZm8pKTsNCiAgY2hpbmZvLT5jaGFuZ2VzID0g
Y2hhbmdlczsNCiAgY2hpbmZvLT5uZXdkYnMgPSAwOw0KICBzeW5jX3NldF9yZXF1ZXN0ZGF0YShj
aGluZm8sIGNvbm4tPnN5bmNfcGFpcik7DQogIHJldHVybihGQUxTRSk7DQp9DQoNCnZvaWQgZ2V0
X2NoYW5nZXMoYmFja3VwX2Nvbm5lY3Rpb24qIGNvbm4sIHN5bmNfb2JqZWN0X3R5cGUgbmV3ZGJz
KSB7IA0KICBiYWNrdXBfZ2V0X2NoYW5nZXNfYXJnICphcmc7DQoNCiAgaWYgKGNvbm4tPnJlYmFj
a3VwYWxsKSB7DQogICAgY2hhbmdlX2luZm8gKmNoaW5mbyA9IGdfbWFsbG9jMChzaXplb2YoY2hh
bmdlX2luZm8pKTsNCiAgICBjaGluZm8tPm5ld2RicyA9IFNZTkNfT0JKRUNUX1RZUEVfQU5ZOw0K
ICAgIHN5bmNfc2V0X3JlcXVlc3RkYXRhKGNoaW5mbywgY29ubi0+c3luY19wYWlyKTsNCiAgICBi
YWNrdXBfZnJlZV9lbnRyaWVzKGNvbm4pOw0KICAgIGJhY2t1cF9zYXZlX3N0YXRlKGNvbm4pOw0K
ICAgIHJldHVybjsNCiAgfQ0KICBhcmcgPSBnX21hbGxvYzAoc2l6ZW9mKGJhY2t1cF9nZXRfY2hh
bmdlc19hcmcpKTsNCiAgYXJnLT5jb25uID0gY29ubjsNCiAgYXJnLT5uZXdkYnMgPSBuZXdkYnM7
DQogLy8gZ19pZGxlX2FkZChiYWNrdXBfZG9fZ2V0X2NoYW5nZXMsIGFyZyk7DQogYmFja3VwX2Rv
X2dldF9jaGFuZ2VzKGFyZyk7DQp9DQoNCg0Kdm9pZCBzeW5jX2RvbmUoYmFja3VwX2Nvbm5lY3Rp
b24gKmNvbm4sIGdib29sZWFuIHN1Y2Nlc3MpIHsNCiAgaWYgKHN1Y2Nlc3MpIHsNCiAgICBpbnQg
dDsNCiAgICBmb3IgKHQgPSAwOyB0IDwgZ19saXN0X2xlbmd0aChjb25uLT5lbnRyaWVzKTsgdCsr
KSB7DQogICAgICBiYWNrdXBfb2JqZWN0ICplbnRyeSA9IGdfbGlzdF9udGhfZGF0YShjb25uLT5l
bnRyaWVzLCB0KTsNCiAgICAgIGlmIChlbnRyeSAmJiAoZW50cnktPnR5cGUgPT0gQkFDS1VQX1RZ
UEVfUkVTVE9SRSB8fA0KCQkgICAgZW50cnktPnR5cGUgPT0gQkFDS1VQX1RZUEVfUkVCQUNLVVAp
KQ0KCWVudHJ5LT50eXBlID0gQkFDS1VQX1RZUEVfU0FWRUQ7DQogICAgfQ0KICAgIGlmIChjb25u
LT5yZWJhY2t1cGFsbCkgew0KICAgICAgY29ubi0+cmViYWNrdXBhbGwgPSBGQUxTRTsNCiAgICAg
IGJhY2t1cF9zYXZlX3N0YXRlKGNvbm4pOw0KICAgIH0NCiAgICBiYWNrdXBfc2F2ZV9lbnRyaWVz
KGNvbm4pOw0KICB9DQogIHN5bmNfc2V0X3JlcXVlc3Rkb25lKGNvbm4tPnN5bmNfcGFpcik7DQp9
DQogDQoNCnZvaWQgYmFja3VwX2hhcmRfZGVsZXRlKGJhY2t1cF9jb25uZWN0aW9uICpjb25uLCBi
YWNrdXBfb2JqZWN0ICplbnRyeSkgew0KICBjaGFyICpmbmFtZTsNCiAgaWYgKGVudHJ5KSB7DQog
ICAgY29ubi0+ZW50cmllcyA9IGdfbGlzdF9yZW1vdmUoY29ubi0+ZW50cmllcywgZW50cnkpOw0K
ICAgIGZuYW1lID0gZ19zdHJkdXBfcHJpbnRmKCIlcy8lcyIsIGNvbm4tPmJhY2t1cGRpciwgZW50
cnktPnVpZCk7DQogICAgdW5saW5rKGZuYW1lKTsNCiAgICBnX2ZyZWUoZm5hbWUpOw0KICAgIGlm
IChlbnRyeS0+dWlkKQ0KICAgICAgZ19mcmVlKGVudHJ5LT51aWQpOw0KICAgIGdfZnJlZShlbnRy
eSk7DQogIH0NCn0NCg0Kdm9pZCBiYWNrdXBfbW9kaWZ5X29yX2RlbGV0ZShiYWNrdXBfY29ubmVj
dGlvbiAqY29ubiwgDQoJCQkgICAgIGNoYXIgKmNvbXAsIA0KCQkJICAgICBjaGFyICp1aWQsIHN5
bmNfb2JqZWN0X3R5cGUgb2JqdHlwZSwgDQoJCQkgICAgIGNoYXIgKnVpZHJldCwgaW50ICp1aWRy
ZXRsZW4sDQoJCQkgICAgIGdib29sZWFuIHNvZnRkZWxldGUpIHsNCiAgY2hhciAqbHVpZCA9IE5V
TEw7DQogIGJhY2t1cF9vYmplY3QgKmVudHJ5ID0gTlVMTDsNCiAgaW50IHQ7DQoNCiAgaWYgKCF1
aWQgJiYgIWNvbXApIHsNCiAgICBzeW5jX3NldF9yZXF1ZXN0ZmFpbGVkKGNvbm4tPnN5bmNfcGFp
cik7DQogICAgcmV0dXJuOw0KICB9DQogIGlmICh1aWQpDQogICAgbHVpZCA9IGdfc3RyZHVwKHVp
ZCk7DQogIGlmICghbHVpZCkgew0KICAgIC8vIEdlbmVyYXRlIGEgVUlEDQogICAgaW50IGNvdW50
ID0gMDsNCiAgICB3aGlsZSAoIWx1aWQpIHsNCiAgICAgIGNoYXIgKmZuYW1lOw0KICAgICAgc3Ry
dWN0IHN0YXQgc3RhdGJ1ZjsNCiAgICAgIGx1aWQgPSBnX3N0cmR1cF9wcmludGYoIm11bHRpc3lu
YyVkLSVkIiwgKGludCkgdGltZShOVUxMKSwgY291bnQpOw0KICAgICAgZm5hbWUgPSBnX3N0cmR1
cF9wcmludGYoIiVzLyVzIiwgY29ubi0+YmFja3VwZGlyLCBsdWlkKTsNCiAgICAgIGlmICghc3Rh
dChmbmFtZSwgJnN0YXRidWYpKSB7DQoJY291bnQrKzsNCglnX2ZyZWUobHVpZCk7DQoJbHVpZCA9
IE5VTEw7DQogICAgICB9DQogICAgICBnX2ZyZWUoZm5hbWUpOw0KICAgIH0NCiAgfQ0KICBmb3Ig
KHQgPSAwOyB0IDwgZ19saXN0X2xlbmd0aChjb25uLT5lbnRyaWVzKTsgdCsrKSB7DQogICAgYmFj
a3VwX29iamVjdCAqZTsNCiAgICBlID0gZ19saXN0X250aF9kYXRhKGNvbm4tPmVudHJpZXMsIHQp
Ow0KICAgIGlmIChlLT51aWQgJiYgIXN0cmNtcChlLT51aWQsIGx1aWQpKSB7DQogICAgICBlbnRy
eSA9IGU7DQogICAgfQ0KICB9DQogIGlmICghZW50cnkgJiYgdWlkKSB7DQogICAgLy8gTm9uLWV4
aXN0aW5nIFVJRCBnaXZlbg0KICAgIHN5bmNfc2V0X3JlcXVlc3RmYWlsZWQoY29ubi0+c3luY19w
YWlyKTsNCiAgICByZXR1cm47DQogIH0NCiAgaWYgKCFlbnRyeSkgew0KICAgIC8vIElmIG5vIGVu
dHJ5IGlzIGZvdW5kLCBhZGQgaXQNCiAgICBlbnRyeSA9IGdfbWFsbG9jMChzaXplb2YoYmFja3Vw
X29iamVjdCkpOw0KICAgIGVudHJ5LT51aWQgPSBnX3N0cmR1cChsdWlkKTsNCiAgICBjb25uLT5l
bnRyaWVzID0gZ19saXN0X2FwcGVuZChjb25uLT5lbnRyaWVzLCBlbnRyeSk7DQogIH0NCiAgZW50
cnktPm9iamVjdF90eXBlID0gb2JqdHlwZTsNCiAgDQogIGlmIChjb21wKQ0KICAgIGVudHJ5LT50
eXBlID0gQkFDS1VQX1RZUEVfU0FWRUQ7DQogIGVsc2Ugew0KICAgIGVudHJ5LT50eXBlID0gQkFD
S1VQX1RZUEVfREVMRVRFRDsNCiAgfQ0KICBpZiAoY29ubi0+aGFyZGRlbGV0ZSAmJiAhY29tcCkN
CiAgICBiYWNrdXBfaGFyZF9kZWxldGUoY29ubiwgZW50cnkpOw0KICBiYWNrdXBfc2F2ZV9lbnRy
aWVzKGNvbm4pOw0KDQogIGlmIChjb21wKSB7DQogICAgLy8gU2F2ZSB0aGUgZGF0YQ0KICAgIGNo
YXIgKmZuYW1lLCAqb2JqdHlwZXN0cjsNCiAgICBGSUxFICpmOw0KICAgIGZuYW1lID0gZ19zdHJk
dXBfcHJpbnRmKCIlcy8lcyIsIGNvbm4tPmJhY2t1cGRpciwgbHVpZCk7DQogICAgLy9vYmp0eXBl
c3RyID0gZ19zdHJkdXBfcHJpbnRmKCIldVxuIiwgZW50cnktPm9iamVjdF90eXBlKTsNCiAgICBp
ZiAoKGYgPSBmb3BlbihmbmFtZSwgInciKSkpIHsNCiAgICAvLyAgZnB1dHMob2JqdHlwZXN0ciwg
Zik7DQogICAgICBmcHV0cyhjb21wLCBmKTsNCiAgICAgIGZjbG9zZShmKTsNCiAgICB9DQogICAg
c3RydWN0IHN0YXQgc3RhdGJ1ZjsNCiAgICBpZiAoIXN0YXQoZm5hbWUsICZzdGF0YnVmKSkgew0K
ICAgICAgZW50cnktPm1vZF90aW1lID0gKGludCkgc3RhdGJ1Zi5zdF9tdGltZTsNCiAgICB9DQog
ICAgLy9nX2ZyZWUob2JqdHlwZXN0cik7DQogICAgZ19mcmVlKGZuYW1lKTsNCiAgfQ0KICBpZiAo
IXVpZCAmJiB1aWRyZXQpIHsNCiAgICAvLyBSZXR1cm4gb3VyIGdlbmVyYXRlZCBMVUlEDQogICAg
c3RybmNweSh1aWRyZXQsIGx1aWQsICp1aWRyZXRsZW4pOw0KICAgICp1aWRyZXRsZW4gPSBzdHJs
ZW4obHVpZCk7DQogIH0NCiAgZ19mcmVlKGx1aWQpOw0KICBzeW5jX3NldF9yZXF1ZXN0ZG9uZShj
b25uLT5zeW5jX3BhaXIpOw0KfQ0KDQp2b2lkIHN5bmNvYmpfbW9kaWZ5KGJhY2t1cF9jb25uZWN0
aW9uICpjb25uLCANCgkJICAgIGNoYXIgKmNvbXAsIA0KCQkgICAgY2hhciAqdWlkLCBzeW5jX29i
amVjdF90eXBlIG9ianR5cGUsIA0KCQkgICAgY2hhciAqdWlkcmV0LCBpbnQgKnVpZHJldGxlbikg
ew0KICBiYWNrdXBfbW9kaWZ5X29yX2RlbGV0ZShjb25uLCBjb21wLCB1aWQsIG9ianR5cGUsIHVp
ZHJldCwgdWlkcmV0bGVuLCBGQUxTRSk7DQp9DQoNCnZvaWQgc3luY29ial9kZWxldGUoYmFja3Vw
X2Nvbm5lY3Rpb24gKmNvbm4sIGNoYXIgKnVpZCwgDQoJCSAgICBzeW5jX29iamVjdF90eXBlIG9i
anR5cGUsIGludCBzb2Z0ZGVsZXRlKSB7DQogIGJhY2t1cF9tb2RpZnlfb3JfZGVsZXRlKGNvbm4s
IE5VTEwsIHVpZCwgb2JqdHlwZSwgTlVMTCwgTlVMTCwgc29mdGRlbGV0ZSk7DQp9DQoNCi8vIFJl
dHVybiBUUlVFIGlmIHRoaXMgY2xpZW50IGRvZXMgbm90IGhhdmUgdG8gYmUgcG9sbGVkIA0KLy8g
KGkuZS4gY2FuIGJlIGNvbnN0YW50bHkgY29ubmVjdGVkKQ0KZ2Jvb2xlYW4gYWx3YXlzX2Nvbm5l
Y3RlZCgpIHsNCiAgcmV0dXJuKFRSVUUpOw0KfQ0KDQpjaGFyKiBzaG9ydF9uYW1lKCkgew0KICBy
ZXR1cm4oImJhY2t1cC1wbHVnaW4iKTsNCn0NCg0KY2hhciogbG9uZ19uYW1lKCkgew0KICByZXR1
cm4oIkJhY2t1cCIpOw0KfQ0KDQovLyBSZXR1cm4gdGhlIHR5cGVzIG9mIG9iamVjdHMgdGhhdCB0
aGlzIGNsaWVudCBoYW5kbGUNCnN5bmNfb2JqZWN0X3R5cGUgb2JqZWN0X3R5cGVzKCkgew0KICBy
ZXR1cm4oU1lOQ19PQkpFQ1RfVFlQRV9BTlkpOw0KfQ0KDQoNCg0Kdm9pZCBwbHVnaW5faW5pdCh2
b2lkKSB7DQp9DQoNCmNoYXIqIHBsdWdpbl9pbmZvKHZvaWQpIHsNCiAgcmV0dXJuKCJUaGlzIHBs
dWdpbiBrZWVwcyBhIGJhY2t1cCBvZiB5b3VyIGRhdGEuIFlvdSBjYW4gbWFuYWdlIHRoZSBzdG9y
ZWQgZW50cmllcyBpcyB0aGUgcGx1Z2luIG9wdGlvbnMgKGFib3ZlKS4iKTsNCn0NCg0KaW50IHBs
dWdpbl9BUElfdmVyc2lvbih2b2lkKSB7DQogIHJldHVybigzKTsNCn0NCg==


--=-zNWKKbKHMsmxcdRjzVQV
Content-Disposition: attachment; filename=backup_plugin.h
Content-Type: text/x-chdr; name=backup_plugin.h; charset=ISO-8859-1
Content-Transfer-Encoding: base64

I2lmbmRlZiBCQUNLVVBfUExVR0lOX0gNCiNkZWZpbmUgQkFDS1VQX1BMVUdJTl9IDQoNCiNpbmNs
dWRlIDxtdWx0aXN5bmMuaD4NCg0KdHlwZWRlZiBlbnVtIHsNCiAgQkFDS1VQX1RZUEVfU0FWRUQg
PSAxLA0KICBCQUNLVVBfVFlQRV9ERUxFVEVEID0gMiwNCiAgQkFDS1VQX1RZUEVfUkVTVE9SRSA9
IDMsDQogIEJBQ0tVUF9UWVBFX1JFQkFDS1VQID0gNA0KfSBiYWNrdXBfdHlwZTsNCg0KdHlwZWRl
ZiBzdHJ1Y3Qgew0KICBjaGFyICp1aWQ7DQogIGJhY2t1cF90eXBlIHR5cGU7DQogIHN5bmNfb2Jq
ZWN0X3R5cGUgb2JqZWN0X3R5cGU7DQogIGludCBtb2RfdGltZTsNCn0gYmFja3VwX29iamVjdDsN
Cg0KdHlwZWRlZiBzdHJ1Y3Qgew0KICBjbGllbnRfY29ubmVjdGlvbiBjb21tb25kYXRhOw0KICBz
eW5jX3BhaXIgKnN5bmNfcGFpcjsNCiAgY29ubmVjdGlvbl90eXBlIGNvbm50eXBlOw0KICBjaGFy
ICpiYWNrdXBkaXI7DQogIEdMaXN0ICplbnRyaWVzOyAvLyBUaGUgYmFja3VwIGVudHJpZXMgd2Ug
aGF2ZQ0KICBnYm9vbGVhbiByZWJhY2t1cGFsbDsNCiAgZ2Jvb2xlYW4gaGFyZGRlbGV0ZTsNCn0g
YmFja3VwX2Nvbm5lY3Rpb247DQoNCnZvaWQgYmFja3VwX2xvYWRfc3RhdGUoYmFja3VwX2Nvbm5l
Y3Rpb24gKmNvbm4pOw0Kdm9pZCBiYWNrdXBfc2F2ZV9zdGF0ZShiYWNrdXBfY29ubmVjdGlvbiAq
Y29ubik7DQp2b2lkIGJhY2t1cF9sb2FkX2VudHJpZXMoYmFja3VwX2Nvbm5lY3Rpb24gKmNvbm4p
Ow0KY2hhciogYmFja3VwX2dldF9lbnRyeV9kYXRhKGNoYXIgKmNhcmQsIGNoYXIgKmtleSk7DQp2
b2lkIGJhY2t1cF9zYXZlX2VudHJpZXMoYmFja3VwX2Nvbm5lY3Rpb24gKmNvbm4pOw0Kdm9pZCBi
YWNrdXBfZnJlZV9lbnRyaWVzKGJhY2t1cF9jb25uZWN0aW9uICpjb25uKTsNCnZvaWQgYmFja3Vw
X2hhcmRfZGVsZXRlKGJhY2t1cF9jb25uZWN0aW9uICpjb25uLCBiYWNrdXBfb2JqZWN0ICplbnRy
eSk7DQp2b2lkIGJhY2t1cF9tb2RpZnlfb3JfZGVsZXRlKGJhY2t1cF9jb25uZWN0aW9uICpjb25u
LCANCgkJCSAgICAgY2hhciAqY29tcCwgDQoJCQkgICAgIGNoYXIgKnVpZCwgc3luY19vYmplY3Rf
dHlwZSBvYmp0eXBlLCANCgkJCSAgICAgY2hhciAqdWlkcmV0LCBpbnQgKnVpZHJldGxlbiwNCgkJ
CSAgICAgZ2Jvb2xlYW4gc29mdGRlbGV0ZSk7DQp2b2lkIGJhY2t1cF9mcmVlX2Nvbm5lY3Rpb24o
YmFja3VwX2Nvbm5lY3Rpb24gKmNvbm4pOw0KZ2Jvb2xlYW4gYmFja3VwX2RvX2Nvbm5lY3QoZ3Bv
aW50ZXIgZGF0YSk7DQoNCmJhY2t1cF9jb25uZWN0aW9uKiBzeW5jX2Nvbm5lY3Qoc3luY19wYWly
KiBoYW5kbGUsIGNvbm5lY3Rpb25fdHlwZSB0eXBlLA0KCQkJCXN5bmNfb2JqZWN0X3R5cGUgb2Jq
ZWN0X3R5cGVzKTsNCnZvaWQgc3luY19kaXNjb25uZWN0KGJhY2t1cF9jb25uZWN0aW9uICpjb25u
KTsNCnZvaWQgc3luY19kb25lKGJhY2t1cF9jb25uZWN0aW9uICpjb25uLCBnYm9vbGVhbiBzdWNj
ZXNzKTsNCnZvaWQgc3luY29ial9tb2RpZnkoYmFja3VwX2Nvbm5lY3Rpb24gKmNvbm4sIA0KCQkg
ICAgY2hhciAqY29tcCwgDQoJCSAgICBjaGFyICp1aWQsIHN5bmNfb2JqZWN0X3R5cGUgb2JqdHlw
ZSwgDQoJCSAgICBjaGFyICp1aWRyZXQsIGludCAqdWlkcmV0bGVuKTsNCnZvaWQgc3luY29ial9k
ZWxldGUoYmFja3VwX2Nvbm5lY3Rpb24gKmNvbm4sIGNoYXIgKnVpZCwgDQoJCSAgICBzeW5jX29i
amVjdF90eXBlIG9ianR5cGUsIGludCBzb2Z0ZGVsZXRlKTsNCmdib29sZWFuIGJhY2t1cF9kb19n
ZXRfY2hhbmdlcyhncG9pbnRlciBkYXRhKTsNCnZvaWQgZ2V0X2NoYW5nZXMoYmFja3VwX2Nvbm5l
Y3Rpb24qIGNvbm4sIHN5bmNfb2JqZWN0X3R5cGUgbmV3ZGJzKTsNCmdib29sZWFuIGFsd2F5c19j
b25uZWN0ZWQodm9pZCk7DQpjaGFyKiBzaG9ydF9uYW1lKHZvaWQpOw0KY2hhciogbG9uZ19uYW1l
KHZvaWQpOw0Kc3luY19vYmplY3RfdHlwZSBvYmplY3RfdHlwZXModm9pZCk7DQp2b2lkIHBsdWdp
bl9pbml0KHZvaWQpOw0KY2hhciogcGx1Z2luX2luZm8odm9pZCk7DQoNCg0KDQoNCiNlbmRpZg0K



--=-zNWKKbKHMsmxcdRjzVQV--

--=-+y+5w2DDVgOjwYJyH4AX
Content-Type: application/pgp-signature; name=signature.asc
Content-Description: This is a digitally signed message part

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.1 (GNU/Linux)

iD8DBQBEo7rk5OI9vmOoVqERAnvwAJ9sbcjGCtBnmKAUsLMNFhM4VStCtACdGboE
JHn4inSlidGyacgvGJU6zGM=
=uwNj
-----END PGP SIGNATURE-----

--=-+y+5w2DDVgOjwYJyH4AX--



--===============1808300096==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642

--===============1808300096==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Multisync-devel mailing list
Multisync-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org
https://lists.sourceforge.net/lists/listinfo/multisync-devel

--===============1808300096==--