Re: xindice_rebuild - file size vastly multiplied

Natalia Shilenkova <[email protected]> Fri, 17 Apr 2009 11:09:13 -0400
Newsgroups gmane.text.xml.xindice.user
Message-ID <[email protected]>
--0016e64ea81e276ba10467c192b9
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable

On Thu, Apr 16, 2009 at 3:32 PM, OKO <[email protected]> wrote:
[snip]
>
> The "1.1" vs "1.0" expansion factor is much larger for the case of
> collections with few and small files (factor 350) , than for many and sma=
ll
> files (factor 25).
>
> But nevertheless, I wonder for what kind of databases 1.1 would beat 1.0
> from a *size* point of view. Maybe comparing processing speed of "1.1" vs
> "1.0" would give a different picture, but at the moment I have no numbers=
 to
> offer in that respect.

Here is the deal: database format between 1.0 and 1.1 hasn't changed,
except some bugs in index files were fixed and the collection files
are now created properly, which in your case, unfortunately, means
they take a lot more space than before. The reason is that default
size is intended for bigger collections with many documents.

The database you tried to rebuild is the corner case however, with
several collections that only have a single document each, so default
size settings are way too large. But this is only the default setting
and it can be change to more suitable number. This way, 1.1 database
should take about the same amount of space as the existing database.

> By the way, I do not have any very large documents in the database, so I
> have no idea how "1.1" compares to "1.0" for such beasts.
>
> And the 64,000 $ question is, of course, what means are available to
> decrease disk space footprint of the "1.1" =A0database?

The following steps can help to reduce database size:
1. Meta collections can be turned off. The setting is in the
config/system.xml file (In Xindice 1.1 directory). In the following
line:

    <root-collection dbroot=3D"./db/" name=3D"db" use-metadata=3D"on">

change use-metadata=3D"off". This will make all Meta collections go away.

2. Initial collection size can be adjusted (here I assume that all the
collections use default BTreeFiler to store data, HashFiler is
somewhat different beast). When creating a collection it can be given
a configuration to specify pagecount setting that directly affect
initial collection size:

<collection compressed=3D"true" inline-metadata=3D"true" name=3D"test">
  <filer class=3D"org.apache.xindice.core.filer.BTreeFiler" pagecount=3D"16=
" />
</collection>

When creating collection from command-line tool, this setting can be
specified with --pagecount parameter:

bin\xindice ac -c /db -n test --pagecount 16

The "perfect" value for pagecount depends on size and amount of
documents in a collection. For collections that have documents added
and modified often it should be picked based on how much data is
expected to be stored in the collection, but in any case it only sets
initial size, so collection file will grow when it is too small to
hold new data.

In your case, when a collection has only one small document and this
situation is not expected to change, pagecount may very well be set to
1.

Now back to data migration... I made some changes to xindice_rebuild
to add optional pagecount parameter that will overwrite original
collection setting.

If you have source version of Xindice download, please save attached
file to <xindice
directory>\java\src\org\apache\xindice\tools\DatabaseRebuild.java and
run build.bat or build.sh depending on your OS. After that, you can
try to rebuild database again using optional parameter:

bin\xindice_rebuild.bat rebuild db -p 1

If you have binary version of Xindice download instead, please let me
know, I'll see what can be done for that. Alternatively, collections
can be rebuilt manually, by exporting documents, creating new
collections using command-line tool with the option "--pagecount 1"
and importing documents into new collections.

Let me know if something doesn't work for you.

Natalia

--0016e64ea81e276ba10467c192b9
Content-Type: application/octet-stream; name="DatabaseRebuild.java"
Content-Disposition: attachment; filename="DatabaseRebuild.java"
Content-Transfer-Encoding: base64
X-Attachment-Id: f_ftn09hca0

LyoKICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVu
ZGVyIG9uZSBvciBtb3JlCiAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0
aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAogKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9u
YWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCiAqIFRoZSBBU0Yg
bGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNp
b24gMi4wCiAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNl
cHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBj
b3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGlj
ZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3
IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0
aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VU
IFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3Ig
aW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292
ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4K
ICoKICogJElkOiBEYXRhYmFzZVJlYnVpbGQuamF2YSA1MzMyNTMgMjAwNy0wNC0yNyAyMzoxMjox
MlogdmdyaXRzZW5rbyAkCiAqLwoKcGFja2FnZSBvcmcuYXBhY2hlLnhpbmRpY2UudG9vbHM7Cgpp
bXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwppbXBvcnQgb3JnLmFwYWNoZS5j
b21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKaW1wb3J0IG9yZy5hcGFjaGUueGluZGljZS5jb3Jl
LkNvbGxlY3Rpb247CmltcG9ydCBvcmcuYXBhY2hlLnhpbmRpY2UuY29yZS5EQkV4Y2VwdGlvbjsK
aW1wb3J0IG9yZy5hcGFjaGUueGluZGljZS5jb3JlLkRhdGFiYXNlOwppbXBvcnQgb3JnLmFwYWNo
ZS54aW5kaWNlLmNvcmUuZGF0YS5LZXk7CmltcG9ydCBvcmcuYXBhY2hlLnhpbmRpY2UuY29yZS5k
YXRhLlZhbHVlOwppbXBvcnQgb3JnLmFwYWNoZS54aW5kaWNlLmNvcmUuZmlsZXIuQlRyZWVDYWxs
YmFjazsKaW1wb3J0IG9yZy5hcGFjaGUueGluZGljZS5jb3JlLmZpbGVyLkJUcmVlRXhjZXB0aW9u
OwppbXBvcnQgb3JnLmFwYWNoZS54aW5kaWNlLmNvcmUuZmlsZXIuQlRyZWVGaWxlcjsKaW1wb3J0
IG9yZy5hcGFjaGUueGluZGljZS5jb3JlLmZpbGVyLkZpbGVyOwppbXBvcnQgb3JnLmFwYWNoZS54
aW5kaWNlLmNvcmUuZmlsZXIuSGFzaEZpbGVyOwppbXBvcnQgb3JnLmFwYWNoZS54aW5kaWNlLmNv
cmUuaW5kZXhlci5JbmRleGVyOwppbXBvcnQgb3JnLmFwYWNoZS54aW5kaWNlLnV0aWwuQ29uZmln
dXJhdGlvbjsKaW1wb3J0IG9yZy5hcGFjaGUueGluZGljZS51dGlsLlhpbmRpY2VFeGNlcHRpb247
CmltcG9ydCBvcmcuYXBhY2hlLnhpbmRpY2UudXRpbC5SZWFkT25seUV4Y2VwdGlvbjsKaW1wb3J0
IG9yZy5hcGFjaGUueGluZGljZS54bWwuZG9tLkRPTVBhcnNlcjsKaW1wb3J0IG9yZy5hcGFjaGUu
eGluZGljZS5zZXJ2ZXIuWGluZGljZTsKCmltcG9ydCBqYXZhLmlvLkZpbGU7CmltcG9ydCBqYXZh
LmlvLklPRXhjZXB0aW9uOwoKLyoqCiAqIENvbW1hbmQgbGluZSB1dGlsaXR5IHRvIHJlLWJ1aWxk
IGFsbCBidHJlZSBhbmQgaGFzaCBmaWxlciBiYXNlZCBjb2xsZWN0aW9ucwogKiBvZiB0aGUgZGF0
YWJhc2UsIGFuZCByZS1pbmRleC4KICoKICogQHZlcnNpb24gJFJldmlzaW9uOiA1MzMyNTMgJCwg
JERhdGU6IDIwMDctMDQtMjcgMTk6MTI6MTIgLTA0MDAgKEZyaSwgMjcgQXByIDIwMDcpICQKICov
CnB1YmxpYyBjbGFzcyBEYXRhYmFzZVJlYnVpbGQgewoKICAgIHByaXZhdGUgc3RhdGljIGZpbmFs
IExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhEYXRhYmFzZVJlYnVpbGQuY2xhc3MpOwoKICAg
IHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfQUxMICAgPSAwOwogICAgcHJpdmF0ZSBzdGF0
aWMgZmluYWwgaW50IENNRF9DT1BZICA9IDE7CiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQg
Q01EX0lOREVYID0gMjsKCiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIE5PVF9SQU4gPSAn
Xyc7CiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIFNVQ0NFU1MgPSAnKic7CiAgICBwcml2
YXRlIHN0YXRpYyBmaW5hbCBjaGFyIEVSUk9SICAgPSAnISc7CgogICAgcHJpdmF0ZSBzdGF0aWMg
aW50IHBhZ2VDb3VudCA9IC0xOwoKICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1td
IGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgIGlmIChhcmdzLmxlbmd0aCA8IDIgfHwg
YXJnc1sxXSA9PSBudWxsIHx8IGFyZ3NbMV0ubGVuZ3RoKCkgPT0gMCB8fAogICAgICAgICAgICAh
KCJjb3B5Ii5lcXVhbHMoYXJnc1swXSkgfHwgImluZGV4Ii5lcXVhbHMoYXJnc1swXSkgfHwgInJl
YnVpbGQiLmVxdWFscyhhcmdzWzBdKSkpIHsKICAgICAgICAgICAgdXNhZ2UoKTsKICAgICAgICAg
ICAgU3lzdGVtLmV4aXQoMSk7CiAgICAgICAgfQoKICAgICAgICBpbnQgY29tbWFuZDsKICAgICAg
ICBpZiAoImNvcHkiLmVxdWFscyhhcmdzWzBdKSkgewogICAgICAgICAgICBjb21tYW5kID0gQ01E
X0NPUFk7CiAgICAgICAgfSBlbHNlIGlmICgiaW5kZXgiLmVxdWFscyhhcmdzWzBdKSkgewogICAg
ICAgICAgICBjb21tYW5kID0gQ01EX0lOREVYOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAg
IGNvbW1hbmQgPSBDTURfQUxMOwogICAgICAgIH0KCiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID4g
MikgewogICAgICAgICAgICBpZiAoISgiLXAiLmVxdWFscyhhcmdzWzJdKSkgfHwgYXJncy5sZW5n
dGggPCA0KSB7CiAgICAgICAgICAgICAgICB1c2FnZSgpOwogICAgICAgICAgICAgICAgU3lzdGVt
LmV4aXQoMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAg
IHBhZ2VDb3VudCA9IEludGVnZXIucGFyc2VJbnQoYXJnc1szXSk7CiAgICAgICAgICAgIH0gY2F0
Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICB1c2FnZSgpOwog
ICAgICAgICAgICAgICAgU3lzdGVtLmV4aXQoMSk7CiAgICAgICAgICAgIH0KICAgICAgICB9Cgog
ICAgICAgIEZpbGUgbG9jYXRpb24gPSBuZXcgRmlsZShhcmdzWzFdKTsKICAgICAgICBTdHJpbmcg
cGF0aCA9IGxvY2F0aW9uLmdldEFic29sdXRlUGF0aCgpOwogICAgICAgIFN0cmluZyBuYW1lID0g
bG9jYXRpb24uZ2V0TmFtZSgpOwoKICAgICAgICBpZiAoIiIuZXF1YWxzKG5hbWUpIHx8ICFsb2Nh
dGlvbi5leGlzdHMoKSB8fCAhbG9jYXRpb24uaXNEaXJlY3RvcnkoKSkgewogICAgICAgICAgICBT
eXN0ZW0ub3V0LnByaW50bG4oIkRhdGFiYXNlIHBhdGggbXVzdCBwb2ludCB0byBleGlzdGluZyBk
YXRhYmFzZSBkaXJlY3RvcnkiKTsKICAgICAgICAgICAgU3lzdGVtLmV4aXQoMSk7CiAgICAgICAg
fQoKICAgICAgICAvLyBjcmVhdGUgbWluaW1hbCBkYXRhYmFzZSBjb25maWd1cmF0aW9uIGluc3Rl
YWQgb2YgdHJ5aW5nIHRvIGxvY2F0ZSBzeXN0ZW0ueG1sCiAgICAgICAgU3RyaW5nIGNvbmZpZyA9
ICI8cm9vdC1jb2xsZWN0aW9uIGRicm9vdD0nIiArIHBhdGggKyAiLycgbmFtZT0nIiArIG5hbWUg
KyAiJy8+IjsKICAgICAgICBEYXRhYmFzZSBkYiA9IG5ldyBEYXRhYmFzZSgpOwoKICAgICAgICBi
b29sZWFuIHN1Y2Nlc3MgPSB0cnVlOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIFN5c3RlbS5v
dXQucHJpbnRsbigiUHJvY2Vzc2luZyBkYXRhYmFzZSAiICsgcGF0aCk7CiAgICAgICAgICAgIFN5
c3RlbS5vdXQucHJpbnRsbigpOwogICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkRJXHRD
b2xsZWN0aW9uIG5hbWUiKTsKCiAgICAgICAgICAgIGRiLnNldENvbmZpZyhuZXcgQ29uZmlndXJh
dGlvbihET01QYXJzZXIudG9Eb2N1bWVudChjb25maWcpKSk7CgogICAgICAgICAgICBpZiAobG9n
LmlzSW5mb0VuYWJsZWQoKSkgewogICAgICAgICAgICAgICAgbG9nLmluZm8oIlJlYnVpbGRpbmcg
Y29sbGVjdGlvbnMuLi4iKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzdWNjZXNzID0gcHJv
Y2Vzc0NvbGxlY3Rpb24oZGIsIGNvbW1hbmQpOwogICAgICAgIH0gZmluYWxseSB7CiAgICAgICAg
ICAgIGRiLmNsb3NlKCk7CgogICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oKTsKICAgICAg
ICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJMZWdlbmQ6Iik7CiAgICAgICAgICAgIFN5c3RlbS5v
dXQucHJpbnRsbigiICAgIEQgRGF0YSBmaWxlIik7CiAgICAgICAgICAgIFN5c3RlbS5vdXQucHJp
bnRsbigiICAgIEkgSW5kZXggZmlsZXMiKTsKICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxu
KCIgICAgXyBGaWxlIHdhcyBza2lwcGVkIik7CiAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRs
bigiICAgICogRmlsZSB3YXMgcHJvY2Vzc2VkIHN1Y2Nlc3NmdWx5Iik7CiAgICAgICAgICAgIFN5
c3RlbS5vdXQucHJpbnRsbigiICAgICEgRmlsZSBwcm9jZXNzaW5nIGZhaWxlZCIpOwoKICAgICAg
ICAgICAgU3lzdGVtLm91dC5wcmludGxuKCk7CiAgICAgICAgICAgIGlmIChzdWNjZXNzKSB7CiAg
ICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlJlYnVpbGRpbmcgZGF0YWJhc2Ugd2Fz
IHN1Y2Nlc3NmdWxsLiIpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgU3lz
dGVtLm91dC5wcmludGxuKCJSZWJ1aWxkaW5nIGRhdGFiYXNlIGZhaWxlZC4gUGxlYXNlIGNoZWNr
IGxvZ3MgZm9yIG1vcmUgZGV0YWlsLiIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBTeXN0
ZW0uZXhpdChzdWNjZXNzID8gMCA6IDIpOwogICAgICAgIH0KCiAgICB9CgogICAgcHJpdmF0ZSBz
dGF0aWMgdm9pZCB1c2FnZSgpIHsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlhpbmRpY2Ug
IiArIFhpbmRpY2UuVmVyc2lvbiArICIgRGF0YWJhc2UgUmVidWlsZCBVdGlsaXR5Iik7CiAgICAg
ICAgU3lzdGVtLm91dC5wcmludGxuKCJVc2FnZToiKTsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50
bG4oIiAgICB4aW5kaWNlX3JlYnVpbGQgY29weSAgICA8ZGIgbG9jYXRpb24+IFstcCA8cGFnZWNv
dW50Pl0iKTsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgICB4aW5kaWNlX3JlYnVpbGQg
aW5kZXggICA8ZGIgbG9jYXRpb24+Iik7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgICAg
eGluZGljZV9yZWJ1aWxkIHJlYnVpbGQgPGRiIGxvY2F0aW9uPiBbLXAgPHBhZ2Vjb3VudD5dIik7
CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCk7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxu
KCJEQiBMb2NhdGlvbiBzaG91bGQgcG9pbnQgdG8gdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIFhp
bmRpY2UgZGF0YWJhc2UgZmlsZXMuIik7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCk7CiAg
ICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJJbXBvcnRhbnQ6IFNodXRkb3duIGFuZCBiYWNrdXAg
ZGF0YWJhc2UgYmVmb3JlIHByb2NlZWRpbmchIik7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxu
KCk7CiAgICB9CgogICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBwcm9jZXNzQ29sbGVjdGlvbihD
b2xsZWN0aW9uIGNvbCwgaW50IGNvbW1hbmQpIHsKICAgICAgICBTdHJpbmcgbmFtZSA9IGNvbC5n
ZXRDYW5vbmljYWxOYW1lKCk7CiAgICAgICAgYm9vbGVhbiBzdGF0dXM7CgogICAgICAgIHRyeSB7
CiAgICAgICAgICAgIGlmIChsb2cuaXNJbmZvRW5hYmxlZCgpKSB7CiAgICAgICAgICAgICAgICBs
b2cuaW5mbygiUHJvY2Vzc2luZyBjb2xsZWN0aW9uICIgKyBuYW1lKTsKICAgICAgICAgICAgfQoK
ICAgICAgICAgICAgY2hhciBjb3B5ID0gTk9UX1JBTjsKICAgICAgICAgICAgY2hhciBpbmRleCA9
IE5PVF9SQU47CiAgICAgICAgICAgIHN3aXRjaCAoY29tbWFuZCkgewogICAgICAgICAgICAgICAg
Y2FzZSBDTURfQ09QWToKICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSByZWJ1aWxkQ29sbGVj
dGlvbihjb2wpOwogICAgICAgICAgICAgICAgICAgIGNvcHkgPSBzdGF0dXMgPyBTVUNDRVNTIDog
RVJST1I7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgY2FzZSBD
TURfSU5ERVg6CiAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gcmVidWlsZEluZGV4KGNvbCk7
CiAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBzdGF0dXMgPyBTVUNDRVNTIDogRVJST1I7CiAg
ICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAg
ICAgICAgICAgICAgIHN0YXR1cyA9IHJlYnVpbGRDb2xsZWN0aW9uKGNvbCk7CiAgICAgICAgICAg
ICAgICAgICAgY29weSA9IHN0YXR1cyA/IFNVQ0NFU1MgOiBFUlJPUjsKICAgICAgICAgICAgICAg
ICAgICBpZiAoc3RhdHVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHJlYnVp
bGRJbmRleChjb2wpOwogICAgICAgICAgICAgICAgICAgICAgICBpbmRleCA9IHN0YXR1cyA/IFNV
Q0NFU1MgOiBFUlJPUjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAg
YnJlYWs7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihTdHJp
bmcudmFsdWVPZihjb3B5KSArIFN0cmluZy52YWx1ZU9mKGluZGV4KSArICJcdCIgKyBuYW1lKTsK
CiAgICAgICAgICAgIFN0cmluZ1tdIGNvbE5hbWVzID0gY29sLmxpc3RDb2xsZWN0aW9ucygpOwog
ICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbE5hbWVzLmxlbmd0aDsgaSsrKSB7CiAg
ICAgICAgICAgICAgICBib29sZWFuIHJlc3VsdCA9IHByb2Nlc3NDb2xsZWN0aW9uKGNvbC5nZXRD
b2xsZWN0aW9uKGNvbE5hbWVzW2ldKSwgY29tbWFuZCk7CiAgICAgICAgICAgICAgICBzdGF0dXMg
PSBzdGF0dXMgJiYgcmVzdWx0OwogICAgICAgICAgICB9CiAgICAgICAgfSBjYXRjaCAoREJFeGNl
cHRpb24gZSkgewogICAgICAgICAgICBsb2cuZXJyb3IoIkdvdCBhbiBleGNlcHRpb24gd2hlbiBw
cm9jZXNzaW5nIGNvbGxlY3Rpb24gIiArIG5hbWUsIGUpOwoKICAgICAgICAgICAgcmV0dXJuIGZh
bHNlOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgIH0KCiAgICBwcml2YXRl
IHN0YXRpYyBib29sZWFuIHJlYnVpbGRDb2xsZWN0aW9uKENvbGxlY3Rpb24gY29sKSB7CiAgICAg
ICAgU3RyaW5nIGNhbm9uaWNhbE5hbWUgPSBjb2wuZ2V0Q2Fub25pY2FsTmFtZSgpOwoKICAgICAg
ICAvLyBjbG9zZSBjb2xsZWN0aW9uJ3MgZmlsZXIKICAgICAgICB0cnkgewogICAgICAgICAgICBp
ZiAoY29sLmdldEZpbGVyKCkgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgY29sLmdldEZpbGVy
KCkuY2xvc2UoKTsKICAgICAgICAgICAgfQogICAgICAgIH0gY2F0Y2ggKERCRXhjZXB0aW9uIGUp
IHsKICAgICAgICAgICAgbG9nLmVycm9yKCJDb3VsZCBub3QgY2xvc2UgZmlsZXIgZm9yIGNvbGxl
Y3Rpb24gIiArIGNhbm9uaWNhbE5hbWUsIGUpOwogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAg
ICAgICAgfQoKICAgICAgICAvLyBwcmVwYXJlCiAgICAgICAgRmlsZXIgaXRzRmlsZXIgPSBjb2wu
Z2V0RmlsZXIoKTsKICAgICAgICBGaWxlckNvcHkgb2xkRmlsZXI7CiAgICAgICAgRmlsZXJDb3B5
IG5ld0ZpbGVyOwogICAgICAgIGlmIChpdHNGaWxlciA9PSBudWxsKSB7CiAgICAgICAgICAgIGlm
IChsb2cuaXNJbmZvRW5hYmxlZCgpKSB7CiAgICAgICAgICAgICAgICBsb2cuaW5mbygiQ29sbGVj
dGlvbiAiICsgY29sLmdldENhbm9uaWNhbE5hbWUoKSArICIgaGFzIG5vIGZpbGVyLiBTa2lwcGlu
Zy4uLiIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9
IGlmIChpdHNGaWxlciBpbnN0YW5jZW9mIEJUcmVlRmlsZXIpIHsKICAgICAgICAgICAgb2xkRmls
ZXIgPSBuZXcgQlRyZWVDb3B5KCk7CiAgICAgICAgICAgIG5ld0ZpbGVyID0gbmV3IEJUcmVlQ29w
eSgpOwogICAgICAgIH0gZWxzZSBpZiAoaXRzRmlsZXIgaW5zdGFuY2VvZiBIYXNoRmlsZXIpIHsK
ICAgICAgICAgICAgb2xkRmlsZXIgPSBuZXcgSGFzaENvcHkoKTsKICAgICAgICAgICAgbmV3Rmls
ZXIgPSBuZXcgSGFzaENvcHkoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAobG9n
LmlzSW5mb0VuYWJsZWQoKSkgewogICAgICAgICAgICAgICAgbG9nLmluZm8oIkNvbGxlY3Rpb24g
IiArIGNvbC5nZXRDYW5vbmljYWxOYW1lKCkgKyAiIGhhcyB1bnJlY29nbml6ZWQgZmlsZXIgJyIg
KyBpdHNGaWxlci5nZXRDbGFzcygpLmdldE5hbWUoKSArICInLiBTa2lwcGluZy4uLiIpOwogICAg
ICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIFN0
cmluZyBvbGRGaWxlTmFtZTsKICAgICAgICBTdHJpbmcgbmV3RmlsZU5hbWU7CiAgICAgICAgdHJ5
IHsKICAgICAgICAgICAgb2xkRmlsZXIuc2V0TG9jYXRpb24oY29sLmdldENvbGxlY3Rpb25Sb290
KCksIGNvbC5nZXROYW1lKCkpOwogICAgICAgICAgICBvbGRGaWxlci5zZXRDb25maWcoY29sLmdl
dEZpbGVyKCkuZ2V0Q29uZmlnKCkpOwogICAgICAgICAgICBvbGRGaWxlTmFtZSA9IG9sZEZpbGVy
LmdldEZpbGVyRmlsZSgpLmdldEFic29sdXRlUGF0aCgpOwogICAgICAgICAgICBpZiAoIW9sZEZp
bGVyLmV4aXN0cygpKSB7CiAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIkZpbGVyIGZvciAiICsg
b2xkRmlsZU5hbWUgKyAiIGRvZXMgbm90IGV4aXN0cyIpOwogICAgICAgICAgICAgICAgcmV0dXJu
IGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBuZXdGaWxlci5zZXRMb2NhdGlvbihj
b2wuZ2V0Q29sbGVjdGlvblJvb3QoKSwgY29sLmdldE5hbWUoKSArICIucmVidWlsZCIpOwogICAg
ICAgICAgICBuZXdGaWxlci5zZXRDb25maWcoY29sLmdldEZpbGVyKCkuZ2V0Q29uZmlnKCksIHBh
Z2VDb3VudCk7CiAgICAgICAgICAgIG5ld0ZpbGVOYW1lID0gbmV3RmlsZXIuZ2V0RmlsZXJGaWxl
KCkuZ2V0QWJzb2x1dGVQYXRoKCk7CiAgICAgICAgICAgIGlmIChuZXdGaWxlci5leGlzdHMoKSkg
ewogICAgICAgICAgICAgICAgbG9nLmVycm9yKCJGaWxlciBmb3IgIiArIG5ld0ZpbGVOYW1lICsg
IiBhbHJlYWR5IGV4aXN0cyIpOwogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAg
ICAgICB9CiAgICAgICAgfSBjYXRjaCAoWGluZGljZUV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAg
IGxvZy5lcnJvcigiR290IGFuIGV4Y2VwdGlvbiB3aGVuIHByZXBhcmluZyB0byByZWJ1aWxkICIg
KyBjYW5vbmljYWxOYW1lLCBlKTsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0K
CiAgICAgICAgLy8gY29weQogICAgICAgIGlmICghY29weShvbGRGaWxlciwgbmV3RmlsZXIsIGNh
bm9uaWNhbE5hbWUpKSB7CiAgICAgICAgICAgIG5ld0ZpbGVyLmRlbGV0ZUZpbGUoKTsKICAgICAg
ICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgb2xkRmlsZXIuZGVsZXRlRmls
ZSgpOwogICAgICAgIGlmICghbmV3RmlsZXIuZ2V0RmlsZXJGaWxlKCkucmVuYW1lVG8ob2xkRmls
ZXIuZ2V0RmlsZXJGaWxlKCkpKSB7CiAgICAgICAgICAgIGxvZy5lcnJvcigiQ291bGQgbm90IHJl
bmFtZSBzdWNjZXNzZnVsbHkgcmVidWlsdCBmaWxlICIgKyBuZXdGaWxlTmFtZSArICIgdG8gIiAr
IG9sZEZpbGVOYW1lKTsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAg
ICAgdHJ5IHsKICAgICAgICAgICAgY29sLmdldEZpbGVyKCkub3BlbigpOwogICAgICAgIH0gY2F0
Y2ggKERCRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgbG9nLmVycm9yKCJDb3VsZCBub3Qgb3Bl
biBuZXcgZmlsZSAiICsgb2xkRmlsZU5hbWUsIGUpOwogICAgICAgICAgICByZXR1cm4gZmFsc2U7
CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICBwcml2YXRlIHN0YXRp
YyBib29sZWFuIGNvcHkoRmlsZXJDb3B5IG9sZEZpbGVyLCBGaWxlckNvcHkgbmV3RmlsZXIsIFN0
cmluZyBjYW5vbmljYWxOYW1lKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgbmV3RmlsZXIu
Y3JlYXRlKCk7CiAgICAgICAgICAgIG9sZEZpbGVyLm9wZW4oKTsKICAgICAgICAgICAgbmV3Rmls
ZXIub3BlbigpOwogICAgICAgICAgICBvbGRGaWxlci5jb3B5KG5ld0ZpbGVyKTsKICAgICAgICB9
IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICAgICBsb2cuZXJyb3IoIkVycm9yIGNvcHlp
bmcgY29sbGVjdGlvbiAiICsgY2Fub25pY2FsTmFtZSwgZSk7CiAgICAgICAgICAgIHJldHVybiBm
YWxzZTsKICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAg
ICAgb2xkRmlsZXIuY2xvc2UoKTsKICAgICAgICAgICAgfSBjYXRjaCAoREJFeGNlcHRpb24gZSkg
ewogICAgICAgICAgICAgICAgaWYgKGxvZy5pc1dhcm5FbmFibGVkKCkpIGxvZy53YXJuKGUpOwog
ICAgICAgICAgICB9CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBuZXdGaWxlci5j
bG9zZSgpOwogICAgICAgICAgICB9IGNhdGNoIChEQkV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAg
ICAgICBpZiAobG9nLmlzV2FybkVuYWJsZWQoKSkgbG9nLndhcm4oZSk7CiAgICAgICAgICAgIH0K
ICAgICAgICB9CgogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIHByaXZhdGUgc3RhdGlj
IGJvb2xlYW4gcmVidWlsZEluZGV4KENvbGxlY3Rpb24gY29sKSB7CiAgICAgICAgaWYgKGNvbC5n
ZXRGaWxlcigpID09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQoK
ICAgICAgICB0cnkgewogICAgICAgICAgICBTdHJpbmdbXSBsaXN0ID0gY29sLmxpc3RJbmRleGVy
cygpOwogICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsK
ICAgICAgICAgICAgICAgIEluZGV4ZXIgaWR4ID0gY29sLmdldEluZGV4ZXIobGlzdFtpXSk7CiAg
ICAgICAgICAgICAgICBDb25maWd1cmF0aW9uIGlkeENvbmYgPSBpZHguZ2V0Q29uZmlnKCk7CiAg
ICAgICAgICAgICAgICBpZiAobG9nLmlzSW5mb0VuYWJsZWQoKSkgewogICAgICAgICAgICAgICAg
ICAgIGxvZy5pbmZvKCJSZWJ1aWxkaW5nIGluZGV4ICIgKyBsaXN0W2ldICsgIiBmb3IgY29sbGVj
dGlvbiAiICsgY29sLmdldENhbm9uaWNhbE5hbWUoKSk7CiAgICAgICAgICAgICAgICB9CiAgICAg
ICAgICAgICAgICBjb2wuZHJvcEluZGV4ZXIoaWR4KTsKICAgICAgICAgICAgICAgIGNvbC5jcmVh
dGVJbmRleGVyKGlkeENvbmYpOwogICAgICAgICAgICB9CiAgICAgICAgfSBjYXRjaCAoREJFeGNl
cHRpb24gZSkgewogICAgICAgICAgICBsb2cuZXJyb3IoIkNvdWxkIG5vdCByZWJ1aWxkIGluZGV4
IGZvciBjb2xsZWN0aW9uICIgKyBjb2wuZ2V0Q2Fub25pY2FsTmFtZSgpLCBlKTsKICAgICAgICAg
ICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9Cgog
ICAgcHJpdmF0ZSBpbnRlcmZhY2UgRmlsZXJDb3B5IGV4dGVuZHMgRmlsZXIgewogICAgICAgIHB1
YmxpYyBWYWx1ZSBnZXRWYWx1ZShsb25nIHBvaW50ZXIpIHRocm93cyBJT0V4Y2VwdGlvbjsKCiAg
ICAgICAgcHVibGljIHZvaWQgY29weShGaWxlciBuZXdGaWxlcikgdGhyb3dzIElPRXhjZXB0aW9u
LCBEQkV4Y2VwdGlvbjsKCiAgICAgICAgcHVibGljIGJvb2xlYW4gZGVsZXRlRmlsZSgpOwoKICAg
ICAgICBwdWJsaWMgRmlsZSBnZXRGaWxlckZpbGUoKTsKCiAgICAgICAgcHVibGljIHZvaWQgc2V0
Q29uZmlnKENvbmZpZ3VyYXRpb24gY29uZmlnLCBpbnQgcGFnZUNvdW50KTsKICAgIH0KCiAgICBw
cml2YXRlIHN0YXRpYyBjbGFzcyBCVHJlZUNvcHkgZXh0ZW5kcyBCVHJlZUZpbGVyIGltcGxlbWVu
dHMgRmlsZXJDb3B5IHsKICAgICAgICBwdWJsaWMgVmFsdWUgZ2V0VmFsdWUobG9uZyBwb2ludGVy
KSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICAgICByZXR1cm4gc3VwZXIucmVhZFZhbHVl
KHBvaW50ZXIpOwogICAgICAgIH0KCiAgICAgICAgcHVibGljIHZvaWQgY29weShGaWxlciBuZXdG
aWxlcikgdGhyb3dzIElPRXhjZXB0aW9uLCBCVHJlZUV4Y2VwdGlvbiB7CiAgICAgICAgICAgIHF1
ZXJ5KG51bGwsIG5ldyBDb3B5Q2FsbGJhY2sodGhpcywgbmV3RmlsZXIpKTsKICAgICAgICB9Cgog
ICAgICAgIHB1YmxpYyBib29sZWFuIGRlbGV0ZUZpbGUoKSB7CiAgICAgICAgICAgIHJldHVybiBn
ZXRGaWxlKCkuZGVsZXRlKCk7CiAgICAgICAgfQoKICAgICAgICBwdWJsaWMgRmlsZSBnZXRGaWxl
ckZpbGUoKSB7CiAgICAgICAgICAgIHJldHVybiBnZXRGaWxlKCk7CiAgICAgICAgfQoKICAgICAg
ICBwdWJsaWMgdm9pZCBzZXRDb25maWcoQ29uZmlndXJhdGlvbiBjb25maWcsIGludCBwYWdlQ291
bnQpIHsKICAgICAgICAgICAgaWYgKHBhZ2VDb3VudCA+IDApIHsKICAgICAgICAgICAgICAgIHRy
eSB7CiAgICAgICAgICAgICAgICAgICAgY29uZmlnLnNldEF0dHJpYnV0ZSgicGFnZWNvdW50Iiwg
cGFnZUNvdW50KTsKICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlYWRPbmx5RXhjZXB0aW9uIGUp
IHsKICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIkZhaWxlZCB0byBzZXQgY29uZmlndXJh
dGlvbiBwYXJhbWV0ZXIgJ3BhZ2Vjb3VudCciKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAg
ICAgfQoKICAgICAgICAgICAgc3VwZXIuc2V0Q29uZmlnKGNvbmZpZyk7CiAgICAgICAgfQogICAg
fQoKICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEhhc2hDb3B5IGV4dGVuZHMgSGFzaEZpbGVyIGlt
cGxlbWVudHMgRmlsZXJDb3B5IHsKICAgICAgICBwdWJsaWMgVmFsdWUgZ2V0VmFsdWUobG9uZyBw
b2ludGVyKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICAgICByZXR1cm4gc3VwZXIucmVh
ZFZhbHVlKHBvaW50ZXIpOwogICAgICAgIH0KCiAgICAgICAgcHVibGljIHZvaWQgY29weShGaWxl
ciBuZXdGaWxlcikgdGhyb3dzIElPRXhjZXB0aW9uLCBEQkV4Y2VwdGlvbiB7CiAgICAgICAgICAg
IGxvbmcgaGFzaFNpemUgPSBnZXRGaWxlSGVhZGVyKCkuZ2V0UGFnZUNvdW50KCk7CgogICAgICAg
ICAgICBmb3IgKGxvbmcgaSA9IDA7IGkgPCBoYXNoU2l6ZTsgaSsrKSB7CiAgICAgICAgICAgICAg
ICBQYWdlIHBhZ2UgPSBnZXRQYWdlKGkpOwoKICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7
CiAgICAgICAgICAgICAgICAgICAgSGFzaFBhZ2VIZWFkZXIgcGggPSAoSGFzaFBhZ2VIZWFkZXIp
IHBhZ2UuZ2V0UGFnZUhlYWRlcigpOwoKICAgICAgICAgICAgICAgICAgICBpZiAocGguZ2V0U3Rh
dHVzKCkgPT0gUkVDT1JEKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlIHZhbHVlID0g
cmVhZFZhbHVlKHBhZ2UpOwogICAgICAgICAgICAgICAgICAgICAgICBuZXdGaWxlci53cml0ZVJl
Y29yZChwYWdlLmdldEtleSgpLCB2YWx1ZSk7CgogICAgICAgICAgICAgICAgICAgICAgICBsb25n
IG5leHQgPSBwaC5nZXROZXh0Q29sbGlzaW9uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlm
IChuZXh0ICE9IE5PX1BBR0UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UgPSBn
ZXRQYWdlKHBoLmdldE5leHRDb2xsaXNpb24oKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0g
ZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAg
ICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAg
ICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAg
ICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcHVibGljIGJvb2xlYW4gZGVsZXRlRmlsZSgp
IHsKICAgICAgICAgICAgcmV0dXJuIGdldEZpbGUoKS5kZWxldGUoKTsKICAgICAgICB9CgogICAg
ICAgIHB1YmxpYyBGaWxlIGdldEZpbGVyRmlsZSgpIHsKICAgICAgICAgICAgcmV0dXJuIGdldEZp
bGUoKTsKICAgICAgICB9CgogICAgICAgIHB1YmxpYyB2b2lkIHNldENvbmZpZyhDb25maWd1cmF0
aW9uIGNvbmZpZywgaW50IHBhZ2VDb3VudCkgewogICAgICAgICAgICBzdXBlci5zZXRDb25maWco
Y29uZmlnKTsKICAgICAgICB9CiAgICB9CgogICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ29weUNh
bGxiYWNrIGltcGxlbWVudHMgQlRyZWVDYWxsYmFjayB7CiAgICAgICAgcHJpdmF0ZSBCVHJlZUNv
cHkgZmlsZXI7CiAgICAgICAgcHJpdmF0ZSBGaWxlciBuZXdGaWxlcjsKCiAgICAgICAgcHVibGlj
IENvcHlDYWxsYmFjayhCVHJlZUNvcHkgZmlsZXIsIEZpbGVyIG5ld0ZpbGVyKSB7CiAgICAgICAg
ICAgIHRoaXMuZmlsZXIgPSBmaWxlcjsKICAgICAgICAgICAgdGhpcy5uZXdGaWxlciA9IG5ld0Zp
bGVyOwogICAgICAgIH0KCiAgICAgICAgcHVibGljIGJvb2xlYW4gaW5kZXhJbmZvKFZhbHVlIHZh
bHVlLCBsb25nIHBvaW50ZXIpIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIFZh
bHVlIHYgPSBmaWxlci5nZXRWYWx1ZShwb2ludGVyKTsKICAgICAgICAgICAgICAgIG5ld0ZpbGVy
LndyaXRlUmVjb3JkKG5ldyBLZXkodmFsdWUpLCB2KTsKICAgICAgICAgICAgfSBjYXRjaCAoRXhj
ZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgIGxvZy5lcnJvcihlKTsKICAgICAgICAgICAgfQoK
ICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgfQp9Cg==
--0016e64ea81e276ba10467c192b9--