From 9285ca38e05cae375c0a57c5cf2050091bc5b265 Mon Sep 17 00:00:00 2001 From: Will Fyson Date: Fri, 1 Mar 2019 13:10:14 +0000 Subject: [PATCH] Configurable export options, JSON export fix, remove counter from list of user fields, render subject names and virutal fields in CSV export, add select/deselect all button for export fields, add new/refine search links, allow export field list ordering to be defined, fix IE bug with showing reports. --- cfg/cfg.d/z_reports.pl | 9 +- lib/lang/en/phrases/reports.xml | 4 + lib/plugins/EPrints/Plugin/Export/Grid2.pm | 23 +- .../EPrints/Plugin/Export/Report/JSON.pm | 3 +- lib/plugins/EPrints/Plugin/Screen/Report.pm | 277 ++- lib/static/javascript/auto/reports.js | 9 +- lib/static/style/auto/reports.css | 15 + reports.epm | 2115 +++++++++-------- reports.epmi | 30 +- 9 files changed, 1454 insertions(+), 1031 deletions(-) diff --git a/cfg/cfg.d/z_reports.pl b/cfg/cfg.d/z_reports.pl index a421af4..a36485b 100644 --- a/cfg/cfg.d/z_reports.pl +++ b/cfg/cfg.d/z_reports.pl @@ -74,6 +74,9 @@ datestamp )]; +#set order of export plugins +$c->{eprint_report}->{export_plugins} = [ qw( Export::Report::CSV Export::Report::HTML Export::Report::JSON )]; + #set config for default user report $c->{datasets}->{user}->{search}->{user_report} = $c->{search}->{user}; #use the default user search form @@ -91,13 +94,11 @@ dept org address - counter usertype email )], }; - $c->{user_report}->{exportfield_defaults} = [ qw( name username @@ -105,13 +106,13 @@ dept org address - counter usertype email )]; +#set order of export plugins +$c->{user_report}->{export_plugins} = [ qw( Export::Report::CSV Export::Report::HTML Export::Report::JSON )]; push @{$c->{user_roles}->{admin}}, qw{ +report }; - diff --git a/lib/lang/en/phrases/reports.xml b/lib/lang/en/phrases/reports.xml index 2a9380d..2abf9e5 100644 --- a/lib/lang/en/phrases/reports.xml +++ b/lib/lang/en/phrases/reports.xml @@ -15,6 +15,10 @@ No Grouping +Select/Deselect All + +
+ Example Articles diff --git a/lib/plugins/EPrints/Plugin/Export/Grid2.pm b/lib/plugins/EPrints/Plugin/Export/Grid2.pm index a4ef808..d3cb84e 100644 --- a/lib/plugins/EPrints/Plugin/Export/Grid2.pm +++ b/lib/plugins/EPrints/Plugin/Export/Grid2.pm @@ -198,7 +198,7 @@ sub dataobj_to_rows { if( scalar @{$sub_dataobj_values} > 0 ) { - $_rows = $self->value_to_rows($field, $sub_dataobj_values); + $_rows = $self->value_to_rows($field, $sub_dataobj_values, $dataobj); } else #there's no results, but we still need to add an empty cell to the spreadsheet { @@ -224,7 +224,7 @@ sub dataobj_to_rows { $value = $field->get_value( $dataobj ); } - $_rows = $self->value_to_rows($field, $value); + $_rows = $self->value_to_rows($field, $value, $dataobj); } } @@ -262,14 +262,14 @@ sub dataobj_to_rows sub value_to_rows { - my ($self, $field, $value) = @_; + my ($self, $field, $value, $dataobj) = @_; my @rows; if (ref($value) eq "ARRAY") { $value = [$field->empty_value] if !@$value; - @rows = map { $self->value_to_rows($field, $_)->[0] } @$value; + @rows = map { $self->value_to_rows($field, $_, $dataobj)->[0] } @$value; } elsif ($field->isa("EPrints::MetaField::Multipart")) { @@ -296,6 +296,21 @@ sub value_to_rows } push @rows, \@sub_values; } + elsif( $field->isa("EPrints::MetaField::Subject")) + { + if( $value ne "" ) + { + push @rows, [$field->render_single_value( $field->repository, $value )]; + } + else + { + push @rows, [$value]; + } + } + elsif( !$field->isa("EPrints::MetaField::Subobject") && $field->is_virtual ) + { + push @rows, [$dataobj->render_value( $field->name )]; + } else { push @rows, [$value]; diff --git a/lib/plugins/EPrints/Plugin/Export/Report/JSON.pm b/lib/plugins/EPrints/Plugin/Export/Report/JSON.pm index f516332..198ff5a 100644 --- a/lib/plugins/EPrints/Plugin/Export/Report/JSON.pm +++ b/lib/plugins/EPrints/Plugin/Export/Report/JSON.pm @@ -181,7 +181,8 @@ sub _epdata_to_json next if !$field->get_property( "export_as_xml" ); next if defined $field->{sub_name}; my $value = $field->get_value( $epdata ); - if( exists $repo->config( $self->{report}->{export_conf}, "custom_export" )->{$field->get_name} ) + if( defined $repo->config( $self->{report}->{export_conf}, "custom_export" ) && + exists $repo->config( $self->{report}->{export_conf}, "custom_export" )->{$field->get_name} ) { $value = $repo->config( $self->{report}->{export_conf}, "custom_export" )->{$field->get_name}->( $epdata, $self->{report} ); } diff --git a/lib/plugins/EPrints/Plugin/Screen/Report.pm b/lib/plugins/EPrints/Plugin/Screen/Report.pm index 434c060..ce6ae05 100644 --- a/lib/plugins/EPrints/Plugin/Screen/Report.pm +++ b/lib/plugins/EPrints/Plugin/Screen/Report.pm @@ -14,7 +14,7 @@ sub new my $self = $class->SUPER::new(%params); - push @{$self->{actions}}, qw( export search ); + push @{$self->{actions}}, qw( export search newsearch update ); $self->{sconf} = "report"; @@ -133,6 +133,34 @@ sub _create_search } } +sub allow_newsearch { return 1; } + +sub allow_update { return 1; } + +sub action_newsearch +{ + my( $self ) = @_; + + my $session = $self->{session}; + + #$self->{processor}->{report} = $session->param( 'report' ); + #$self->{processor}->{screenid} = $self->{processor}->{report}; + #$self->{processor}->{action} = "newsearch"; + #$self->_create_search; +} + +sub action_update +{ + my( $self ) = @_; + + my $session = $self->{session}; + + #$self->{processor}->{report} = $session->param( 'report' ); + #$self->{processor}->{screenid} = $self->{processor}->{report}; + #$self->{processor}->{action} = "newsearch"; + #$self->_create_search; +} + sub action_search { my( $self ) = @_; @@ -216,9 +244,18 @@ sub properties_from my @exportfields; if( defined $repo->config( $self->{export_conf}, "exportfields" ) ) { - foreach my $fieldnames ( values %{$repo->config( $self->{export_conf}, "exportfields" )} ) + my @keys; + if( defined $repo->config( $self->{export_conf}, "exportfield_order" ) ) + { + @keys = @{$repo->config( $self->{export_conf}, "exportfield_order" )}; + } + else + { + @keys = keys %{$repo->config( $self->{export_conf}, "exportfields" )}; + } + foreach my $key ( @keys ) { - foreach my $fieldname ( @{$fieldnames} ) + foreach my $fieldname ( @{$repo->config( $self->{export_conf}, "exportfields" )->{$key}} ) { push @exportfields, $fieldname if defined $self->repository->param( $fieldname ); } @@ -534,6 +571,8 @@ sub render_splash_page my $custom = $repo->make_element( "div", id=>"custom_report" ); my $form = $repo->render_form( "get" ); + $form->appendChild( $self->render_controls( 1 ) ); + #add each report to the select component and generate search form if required my $report_select = $repo->make_element( "select", name=>"report", id=>"select_report" ); my %search_forms; @@ -549,11 +588,19 @@ sub render_splash_page #add to select component my $id = $report_plugin->{report}; my $option = $repo->make_element( "option", value => $report_plugin->get_subtype, form => $formid ); - $option->appendChild( $report_plugin->render_title ); + + #set default option for select component if required (i.e. we have come from a refine search or new search link) + my $refine_sconf = $self->{session}->param( "sconf" ); + if( ( $self->{processor}->{action} eq "update" || $self->{processor}->{action} eq "newsearch" ) && defined $refine_sconf && $refine_sconf eq $formid ) + { + $option->setAttribute( selected => "selected" ); + } + + #set option text and add to select + $option->appendChild( $report_plugin->render_title ); $report_select->appendChild( $option ); - #create search form - + #create search form #get report dataset and appropriate search config my $report_ds = $repo->dataset( $report_plugin->{searchdatasetid} ); my $sconf = $report_ds->search_config( $report_plugin->{sconf} ) ; @@ -578,7 +625,7 @@ sub render_splash_page $searchexp->from_form; #generate the form - my $frag = $self->render_search_fields( $searchexp ); + my $frag = $self->render_search_fields( $searchexp, $formid ); $search_forms{$formid} = $frag unless exists $search_forms{$formid}; } } @@ -610,7 +657,13 @@ sub render_splash_page push @panels, $preset; push @panels, $custom; - return $repo->xhtml->tabs(\@labels, \@panels ); + my %opts; + if( $self->{processor}->{action} eq "newsearch" || $self->{processor}->{action} eq "update" ) + { + $opts{current} = 1; + } + + return $repo->xhtml->tabs(\@labels, \@panels, %opts ); } elsif( $presets_added > 0 ) { @@ -624,7 +677,14 @@ sub render_splash_page sub render_search_fields { - my( $self, $search ) = @_; + my( $self, $search, $formid ) = @_; + + my $exp = $self->{session}->param( "exp" ); + my $sconf = $self->{session}->param( "sconf" ); + if( defined $exp && defined $sconf && $sconf eq $formid ) + { + $search->from_string( $exp ); + } my $frag = $self->{session}->make_doc_fragment; foreach my $sf ( $search->get_non_filter_searchfields ) @@ -645,17 +705,30 @@ sub render_search_fields sub render_controls { - my( $self ) = @_; + my( $self, $with_js ) = @_; my $div = $self->{session}->make_element( "div" , class => "ep_search_buttons" ); $div->appendChild( $self->{session}->render_action_buttons( - _order => [ "search", "newsearch" ], - newsearch => $self->{session}->phrase( "lib/searchexpression:action_reset" ), + _order => [ "search" ], + #newsearch => $self->{session}->phrase( "lib/searchexpression:action_reset" ), search => $self->{session}->phrase( "lib/searchexpression:action_search" ) ) ); + + my $xml = $self->{session}->xml; + + if( $with_js ) + { + my $clear_form = $div->appendChild( $self->render_clearform( $xml ) ); + } + my $clear_btn = $div->appendChild( $xml->create_element( "button", + type => "button", + onclick => "clearForm();", + class => "ep_form_action_button clear_button", + ) ); + $clear_btn->appendChild( $xml->create_text_node( $self->{session}->html_phrase( "lib/searchexpression:action_reset" ) ) ); return $div; } @@ -665,7 +738,7 @@ sub render # if users access Screen::Report directly we want to display some sort of menu # where users can select viewable reports - if( "EPrints::Plugin::".$self->get_id eq __PACKAGE__ && $self->{processor}->{action} ne "search" ) + if( ( "EPrints::Plugin::".$self->get_id eq __PACKAGE__ && $self->{processor}->{action} ne "search" ) || $self->{processor}->{action} eq "newsearch" ) { return $self->render_splash_page; } @@ -678,6 +751,11 @@ sub render $chunk->appendChild( $self->render_group_options ); $chunk->appendChild( $self->render_sort_options ); + if( $self->{processor}->{action} eq "search" ) + { + $chunk->appendChild( $self->render_refine_search ); + } + my $items = $self->items; if( !defined $items || $items->count == 0 ) { @@ -745,6 +823,12 @@ document.observe("dom:loaded", function() { EOJ $chunk->appendChild( $repo->make_element( 'div', class => 'ep_report_page', id => $container_id ) ); + #show search controls after the results too + if( $self->{processor}->{action} eq "search" ) + { + $chunk->appendChild( $self->render_refine_search ); + } + return $chunk; } @@ -798,15 +882,31 @@ sub render_export_bar labels => {map { $_->get_subtype => $_->get_name } @plugins}, ) ); - #create labels and panels for tabbed interfaced my $xml = $repo->xml; my $xhtml = $repo->xhtml; + my $select_all = $form->appendChild( $self->render_selectall( $xml ) ); + my $select_btn = $form->appendChild( $xml->create_element( "button", + type => "button", + onclick => "toggleCheckboxes();", + class => "ep_form_action_button select_button", + ) ); + $select_btn->appendChild( $xml->create_text_node( $repo->html_phrase( "report_select" ) ) ); + #allow user to choose which fields they want to export my $export_options = $repo->make_element( "div" ); - foreach my $key ( keys %{$repo->config( $self->{export_conf}, "exportfields" )} ) + my @keys; + if( defined $repo->config( $self->{export_conf}, "exportfield_order" ) ) + { + @keys = @{$repo->config( $self->{export_conf}, "exportfield_order" )}; + } + else + { + @keys = keys %{$repo->config( $self->{export_conf}, "exportfields" )}; + } + foreach my $key ( @keys ) { #create a new list my $ul = $repo->make_element( "ul", @@ -928,7 +1028,6 @@ sub render_sort_options return $chunk; } - sub render_group_options { my( $self ) = @_; @@ -1008,6 +1107,56 @@ sub render_group_options return $chunk; } +sub render_refine_search +{ + my( $self ) = @_; + + my $repo = $self->repository; + + my $chunk = $repo->make_doc_fragment; + + if( defined $repo->param( "search" ) || $self->{processor}->{action} eq "search" ) + { + my $escexp = $self->{processor}->{search}->serialise; + my $cacheid = $repo->param( "cache" ); + my $sconf = $self->{sconf}; + + #set up new search link + my $new_baseurl = URI->new( $self->{session}->get_uri ); + $new_baseurl->query_form( + screen => "Report", + sconf => $sconf, + ); + + my $search_links = $repo->make_doc_fragment; + my $new_link = $repo->render_link( "$new_baseurl&_action_newsearch=1" ); + $new_link->appendChild( $repo->html_phrase( "lib/searchexpression:new" ) ); + $search_links->appendChild( $new_link ); + + #add a separator... + $search_links->appendChild( $repo->html_phrase( "Update/Views:group_seperator" ) ); + + #set up refine search link + my $refine_baseurl = URI->new( $self->{session}->get_uri ); + $refine_baseurl->query_form( + cache => $cacheid, + exp => $escexp, + screen => "Report", + dataset => $self->{datasetid}, + order => $self->{processor}->{search}->{custom_order}, + sconf => $sconf, + ); + + my $refine_link = $repo->render_link( "$refine_baseurl&_action_update=1" ); + $refine_link->appendChild( $repo->html_phrase( "lib/searchexpression:refine" ) ); + $search_links->appendChild( $refine_link ); + + $chunk->appendChild( $repo->html_phrase( "Report:search_links", links=>$search_links ) ); + } + + return $chunk; +} + #adds a new checkbox to allow the user to choose which fields to export sub _export_field_checkbox @@ -1074,9 +1223,16 @@ sub export_plugins my( $self, $generic ) = @_; my @plugin_ids; - if( $generic ) + + my $repo = $self->repository; + + if( defined $repo->config( $self->{export_conf}, "export_plugins" ) ) { - @plugin_ids = $self->repository->plugin_list( + @plugin_ids = @{$repo->config( $self->{export_conf}, "export_plugins" )}; + } + elsif( $generic ) + { + @plugin_ids = $repo->plugin_list( type => "Export", can_accept => "report/generic", is_visible => "staff", @@ -1085,7 +1241,7 @@ sub export_plugins } else { - @plugin_ids = $self->repository->plugin_list( + @plugin_ids = $repo->plugin_list( type => "Export", can_accept => "report/".$self->get_report, is_visible => "staff", @@ -1095,7 +1251,7 @@ sub export_plugins my @plugins; foreach my $id ( @plugin_ids ) { - my $p = $self->repository->plugin( "$id" ) or next; + my $p = $repo->plugin( "$id" ) or next; push @plugins, $p; } @@ -1322,4 +1478,85 @@ sub _make_grouped_item return \%group; } +sub render_selectall +{ + my( $self, $xml ) = @_; + + my $toggle_function = ' + var isChecked = true; + function toggleCheckboxes() { + var export_options = document.getElementsByClassName("report_export_options"); + for( export_option of export_options ) + { + var checkboxes = export_option.getElementsByTagName( "input" ) + for( checkbox of checkboxes ) + { + if(isChecked) + { + checkbox.checked = ""; + } + else + { + checkbox.checked = "checked"; + } + } + } + isChecked = !isChecked; + }'; + + my $js_tag = $xml->create_element( "script" ); + $js_tag->appendChild( $xml->create_text_node( $toggle_function ) ); + return $js_tag; +} + +sub render_clearform +{ + my( $self, $xml ) = @_; + + my $clear_function = ' + function clearForm(){ + var report = document.getElementById( "custom_report" ); + var form = report.getElementsByClassName("selected_form")[0]; + var inputs = form.getElementsByTagName( "input" ); + for( input of inputs ) + { + field_type = input.type.toLowerCase(); + console.log(field_type); + switch (field_type) + { + case "text": + case "textarea": + input.value = ""; + break; + case "radio": + case "checkbox": + if (input.checked) + { + input.checked = false; + } + break; + case "select-one": + case "select-multi": + input.selectedIndex = -1; + break; + default: + break; + } + } + var selects = form.getElementsByTagName( "select" ); + for( select of selects ) + { + if( select.hasAttribute("multiple") ) + { + select.selectedIndex = -1; + } + } + + }'; + + my $js_tag = $xml->create_element( "script" ); + $js_tag->appendChild( $xml->create_text_node( $clear_function ) ); + return $js_tag; +} + 1; diff --git a/lib/static/javascript/auto/reports.js b/lib/static/javascript/auto/reports.js index bd01842..be9b2d3 100644 --- a/lib/static/javascript/auto/reports.js +++ b/lib/static/javascript/auto/reports.js @@ -35,7 +35,7 @@ var onFormSelect = function(){ { //hide the form $(elem).hide(); - + $(elem).removeClassName("selected_form"); $(elem).select('input').each(function (input) { $(input).setAttribute("disabled", "disabled"); @@ -44,6 +44,7 @@ var onFormSelect = function(){ //show the form we want $(formid).show(); + $(formid).addClassName("selected_form"); //enable this form's input elements $(formid).select('input').each(function (input) @@ -116,7 +117,7 @@ var EPrints_Screen_Report_Loader = Class.create({ var seen_ids = {}; this.no_items = this.ids.length; this.retrieved = []; - if( !Number.isInteger(this.ids[0]) ) //ids have been grouped + if( !isInteger(this.ids[0]) ) //ids have been grouped { grouped = true; this.grouped_ids = this.ids; @@ -395,3 +396,7 @@ function sort_report(sort) document.sort_report.sort.value = sort; document.sort_report.submit(); } + +function isInteger(num) { + return (num ^ 0) === num; +} diff --git a/lib/static/style/auto/reports.css b/lib/static/style/auto/reports.css index c19165d..bf92297 100644 --- a/lib/static/style/auto/reports.css +++ b/lib/static/style/auto/reports.css @@ -99,6 +99,21 @@ div#ep_report_export_content_inner .report_export_options ul padding: 0 10px 0 0; } +#ep_report_export_content_inner .select_button +{ + float: right; +} + +#custom_report .ep_search_buttons > div +{ + display: inline-block; +} + +#custom_report .ep_search_buttons .clear_button +{ + margin-left: 2px; +} + /* HTML Reports */ a.html_report_print{ text-decoration: none; diff --git a/reports.epm b/reports.epm index 25cb462..828c950 100644 --- a/reports.epm +++ b/reports.epm @@ -42,9 +42,9 @@ cGxlX2ZpZWxkcyB9Owo= epm/reports/cfg/cfg.d/z_reports.pl text/plain - 334237b831581075209dbbedf084d878 + 48c622ad150bea255ba6fbee7e37083b MD5 - 2609 + 2869 IwojIEVQcmludHMgU2VydmljZXMgLSBHZW5lcmljIFJlcG9ydGluZyBTeXN0ZW0KIwojIFZlcnNp b246IDMuMAojCgoKJGMtPntwbHVnaW5zfXsiU2NyZWVuOjpSZXBvcnQifXtwYXJhbXN9e2Rpc2Fi bGV9ID0gMDsKCiRjLT57cGx1Z2luc317IkV4cG9ydDo6UmVwb3J0In17cGFyYW1zfXtkaXNhYmxl @@ -79,18 +79,23 @@ ZmF1bHRzfSA9IFsgcXcoCgllcHJpbnRpZAoJdGl0bGUKICAgICAgICBjcmVhdG9yc19uYW1lCiAg ICAgICAgYWJzdHJhY3QKICAgICAgICBkYXRlCiAgICAgICAga2V5d29yZHMKICAgICAgICBkaXZp c2lvbnMKICAgICAgICBzdWJqZWN0cwogICAgICAgIHR5cGUKICAgICAgICBlZGl0b3JzX25hbWUK ICAgICAgICBpc3B1Ymxpc2hlZAogICAgICAgIHJlZmVyZWVkCiAgICAgICAgcHVibGljYXRpb24K -CWRvY3VtZW50cy5mb3JtYXQKCWRhdGVzdGFtcAopXTsKCiNzZXQgY29uZmlnIGZvciBkZWZhdWx0 -IHVzZXIgcmVwb3J0CiRjLT57ZGF0YXNldHN9LT57dXNlcn0tPntzZWFyY2h9LT57dXNlcl9yZXBv -cnR9ID0gJGMtPntzZWFyY2h9LT57dXNlcn07ICN1c2UgdGhlIGRlZmF1bHQgdXNlciBzZWFyY2gg -Zm9ybQoKI3NvcnQgb3B0aW9ucyBmb3Igc29ydGluZyB3aXRoaW4gZWFjaCBncm91cAokYy0+e3Vz -ZXJfcmVwb3J0fS0+e3NvcnRmaWVsZHN9ID0gewogICAgICAgICJieW5hbWUiID0+ICJuYW1lIiwK -fTsKCiNleHBvcnQgZmllbGQgb3B0aW9ucwokYy0+e3VzZXJfcmVwb3J0fS0+e2V4cG9ydGZpZWxk -c30gPSB7CiAgICAgICAgdXNlcl9yZXBvcnRfY29yZSA9PiBbIHF3KAogICAgICAgIAluYW1lCgkJ -dXNlcm5hbWUKCQl1c2VyaWQKCQlkZXB0CgkJb3JnCgkJYWRkcmVzcwoJCWNvdW50ZXIKCQl1c2Vy -dHlwZQoJCWVtYWlsCgkpXSwKfTsKCgokYy0+e3VzZXJfcmVwb3J0fS0+e2V4cG9ydGZpZWxkX2Rl -ZmF1bHRzfSA9IFsgcXcoCiAgICAgICAgbmFtZQoJdXNlcm5hbWUKCXVzZXJpZAoJZGVwdAoJb3Jn -CglhZGRyZXNzCgljb3VudGVyCgl1c2VydHlwZQoJZW1haWwKKV07CgoKcHVzaCBAeyRjLT57dXNl -cl9yb2xlc30tPnthZG1pbn19LCBxd3sKICAgICAgICArcmVwb3J0Cn07Cgo= +CWRvY3VtZW50cy5mb3JtYXQKCWRhdGVzdGFtcAopXTsKCiNzZXQgb3JkZXIgb2YgZXhwb3J0IHBs +dWdpbnMKJGMtPntlcHJpbnRfcmVwb3J0fS0+e2V4cG9ydF9wbHVnaW5zfSA9IFsgcXcoIEV4cG9y +dDo6UmVwb3J0OjpDU1YgRXhwb3J0OjpSZXBvcnQ6OkhUTUwgRXhwb3J0OjpSZXBvcnQ6OkpTT04g +KV07Cgojc2V0IGNvbmZpZyBmb3IgZGVmYXVsdCB1c2VyIHJlcG9ydAokYy0+e2RhdGFzZXRzfS0+ +e3VzZXJ9LT57c2VhcmNofS0+e3VzZXJfcmVwb3J0fSA9ICRjLT57c2VhcmNofS0+e3VzZXJ9OyAj +dXNlIHRoZSBkZWZhdWx0IHVzZXIgc2VhcmNoIGZvcm0KCiNzb3J0IG9wdGlvbnMgZm9yIHNvcnRp +bmcgd2l0aGluIGVhY2ggZ3JvdXAKJGMtPnt1c2VyX3JlcG9ydH0tPntzb3J0ZmllbGRzfSA9IHsK +ICAgICAgICAiYnluYW1lIiA9PiAibmFtZSIsCn07CgojZXhwb3J0IGZpZWxkIG9wdGlvbnMKJGMt +Pnt1c2VyX3JlcG9ydH0tPntleHBvcnRmaWVsZHN9ID0gewogICAgICAgIHVzZXJfcmVwb3J0X2Nv +cmUgPT4gWyBxdygKICAgICAgICAJbmFtZQoJCXVzZXJuYW1lCgkJdXNlcmlkCgkJZGVwdAoJCW9y +ZwoJCWFkZHJlc3MKCQl1c2VydHlwZQoJCWVtYWlsCgkpXSwKfTsKCiRjLT57dXNlcl9yZXBvcnR9 +LT57ZXhwb3J0ZmllbGRfZGVmYXVsdHN9ID0gWyBxdygKICAgICAgICBuYW1lCgl1c2VybmFtZQoJ +dXNlcmlkCglkZXB0CglvcmcKCWFkZHJlc3MKCXVzZXJ0eXBlCgllbWFpbAopXTsKCiNzZXQgb3Jk +ZXIgb2YgZXhwb3J0IHBsdWdpbnMKJGMtPnt1c2VyX3JlcG9ydH0tPntleHBvcnRfcGx1Z2luc30g +PSBbIHF3KCBFeHBvcnQ6OlJlcG9ydDo6Q1NWIEV4cG9ydDo6UmVwb3J0OjpIVE1MIEV4cG9ydDo6 +UmVwb3J0OjpKU09OICldOwoKcHVzaCBAeyRjLT57dXNlcl9yb2xlc30tPnthZG1pbn19LCBxd3sK +ICAgICAgICArcmVwb3J0Cn07Cg== @@ -129,9 +134,9 @@ ICAgIHNob3dfemVyb19yZXN1bHRzID0+IDEsCn07Cgo= lang/en/phrases/reports.xml application/xml - 2c63892db4ecf79ed204400c9acb3f76 + f344518160d45ccd1d1709a926d9e6d1 MD5 - 2386 + 2563 PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cjwh RE9DVFlQRSBwaHJhc2VzIFNZU1RFTSAiZW50aXRpZXMuZHRkIj4KPGVwcDpwaHJhc2VzIHhtbG5z PSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWxuczplcHA9Imh0dHA6Ly9lcHJpbnRz @@ -147,41 +152,44 @@ cm91cF9ieSI+U29ydCBieTogPGVwYzpwaW4gbmFtZT0ibGlua3MiIC8+PC9kaXY+PC9lcHA6cGhy YXNlPgo8ZXBwOnBocmFzZSBpZD0iUmVwb3J0Omdyb3VwX2xpbmtzIj48ZGl2IGNsYXNzPSJlcF92 aWV3X2dyb3VwX2J5Ij5Hcm91cCBieTogPGVwYzpwaW4gbmFtZT0ibGlua3MiIC8+PC9kaXY+PC9l cHA6cGhyYXNlPgoKPGVwcDpwaHJhc2UgaWQ9InJlcG9ydDpub19ncm91cGluZyI+Tm8gR3JvdXBp -bmc8L2VwcDpwaHJhc2U+Cgo8IS0tIHRoZSBFeGFtcGxlIHJlcG9ydHMgLS0+CjxlcHA6cGhyYXNl -IGlkPSJQbHVnaW4vU2NyZWVuL1JlcG9ydC9FeGFtcGxlOnRpdGxlIj5FeGFtcGxlPC9lcHA6cGhy -YXNlPgo8ZXBwOnBocmFzZSBpZD0iUGx1Z2luL1NjcmVlbi9SZXBvcnQvRXhhbXBsZS9BcnRpY2xl -czp0aXRsZSI+QXJ0aWNsZXM8L2VwcDpwaHJhc2U+CjxlcHA6cGhyYXNlIGlkPSJQbHVnaW4vU2Ny -ZWVuL1JlcG9ydC9FeGFtcGxlL0NvbmZlcmVuY2VJdGVtczp0aXRsZSI+Q29uZmVyZW5jZSBJdGVt -czwvZXBwOnBocmFzZT4KCjxlcHA6cGhyYXNlIGlkPSJleHBvcnRfdGl0bGUiPkV4cG9ydCBPcHRp -b25zPC9lcHA6cGhyYXNlPgoKPCEtLSBIVE1MIEV4cG9ydCAtLT4KPGVwcDpwaHJhc2UgaWQ9InJl -cG9ydF9odG1sX2V4cG9ydF90aXRsZSI+UmVwb3J0PC9lcHA6cGhyYXNlPgo8ZXBwOnBocmFzZSBp -ZD0icmVwb3J0X2h0bWxfcHJpbnRfYnRuIj48YSBocmVmPSJqYXZhc2NyaXB0OndpbmRvdy5wcmlu -dCgpIiBjbGFzcz0iZXBfZm9ybV9hY3Rpb25fYnV0dG9uIGh0bWxfcmVwb3J0X3ByaW50IGVwX25v -cHJpbnQiPlByaW50PC9hPjwvZXBwOnBocmFzZT4KCjwhLS0gRVByaW50IFJlcG9ydCAtLT4KPGVw -cDpwaHJhc2UgaWQ9IlBsdWdpbi9TY3JlZW4vUmVwb3J0L0VQcmludDp0aXRsZSI+RVByaW50czwv -ZXBwOnBocmFzZT4KPGVwcDpwaHJhc2UgaWQ9ImV4cG9ydGZpZWxkczplcHJpbnRfcmVwb3J0X2Nv -cmUiPkV4cG9ydCBGaWVsZHM8L2VwcDpwaHJhc2U+CjxlcHA6cGhyYXNlIGlkPSJlcHJpbnRfcmVw -b3J0OnNvcnQ6Ynl5ZWFyIj5ZZWFyPC9lcHA6cGhyYXNlPgo8ZXBwOnBocmFzZSBpZD0iZXByaW50 -X3JlcG9ydDpzb3J0OmJ5bmFtZSI+Q3JlYXRvcnM8L2VwcDpwaHJhc2U+CjxlcHA6cGhyYXNlIGlk -PSJlcHJpbnRfcmVwb3J0OnNvcnQ6Ynl0aXRsZSI+VGl0bGU8L2VwcDpwaHJhc2U+CjxlcHA6cGhy -YXNlIGlkPSJlcHJpbnRfcmVwb3J0OnNvcnQ6YnlkaXZpc2lvbiI+RGl2aXNpb248L2VwcDpwaHJh -c2U+Cgo8ZXBwOnBocmFzZSBpZD0iZXByaW50X3JlcG9ydDpncm91cDpkaXZpc2lvbnMiPkRpdmlz -aW9uPC9lcHA6cGhyYXNlPgo8ZXBwOnBocmFzZSBpZD0iZXByaW50X3JlcG9ydDpncm91cDpzdWJq -ZWN0cyI+U3ViamVjdDwvZXBwOnBocmFzZT4KPGVwcDpwaHJhc2UgaWQ9ImVwcmludF9yZXBvcnQ6 -Z3JvdXA6dHlwZSI+SXRlbSBUeXBlPC9lcHA6cGhyYXNlPgo8ZXBwOnBocmFzZSBpZD0iZXByaW50 -X3JlcG9ydDpncm91cDpkYXRlIj5EYXRlPC9lcHA6cGhyYXNlPgoKPCEtLSBVc2VyIFJlcG9ydCAt -LT4KPGVwcDpwaHJhc2UgaWQ9IlBsdWdpbi9TY3JlZW4vUmVwb3J0L1VzZXI6dGl0bGUiPlVzZXJz -PC9lcHA6cGhyYXNlPgo8ZXBwOnBocmFzZSBpZD0iZXhwb3J0ZmllbGRzOnVzZXJfcmVwb3J0X2Nv -cmUiPkV4cG9ydCBGaWVsZHM8L2VwcDpwaHJhc2U+CjxlcHA6cGhyYXNlIGlkPSJ1c2VyX3JlcG9y -dDpzb3J0OmJ5bmFtZSI+TmFtZTwvZXBwOnBocmFzZT4KCjwvZXBwOnBocmFzZXM+Cg== +bmc8L2VwcDpwaHJhc2U+Cgo8ZXBwOnBocmFzZSBpZD0icmVwb3J0X3NlbGVjdCI+U2VsZWN0L0Rl +c2VsZWN0IEFsbDwvZXBwOnBocmFzZT4KCjxlcHA6cGhyYXNlIGlkPSJSZXBvcnQ6c2VhcmNoX2xp +bmtzIj48ZGl2IGNsYXNzPSJlcF92aWV3X2dyb3VwX2J5Ij48ZXBjOnBpbiBuYW1lPSJsaW5rcyIg +Lz48L2Rpdj48L2VwcDpwaHJhc2U+Cgo8IS0tIHRoZSBFeGFtcGxlIHJlcG9ydHMgLS0+CjxlcHA6 +cGhyYXNlIGlkPSJQbHVnaW4vU2NyZWVuL1JlcG9ydC9FeGFtcGxlOnRpdGxlIj5FeGFtcGxlPC9l +cHA6cGhyYXNlPgo8ZXBwOnBocmFzZSBpZD0iUGx1Z2luL1NjcmVlbi9SZXBvcnQvRXhhbXBsZS9B +cnRpY2xlczp0aXRsZSI+QXJ0aWNsZXM8L2VwcDpwaHJhc2U+CjxlcHA6cGhyYXNlIGlkPSJQbHVn +aW4vU2NyZWVuL1JlcG9ydC9FeGFtcGxlL0NvbmZlcmVuY2VJdGVtczp0aXRsZSI+Q29uZmVyZW5j +ZSBJdGVtczwvZXBwOnBocmFzZT4KCjxlcHA6cGhyYXNlIGlkPSJleHBvcnRfdGl0bGUiPkV4cG9y +dCBPcHRpb25zPC9lcHA6cGhyYXNlPgoKPCEtLSBIVE1MIEV4cG9ydCAtLT4KPGVwcDpwaHJhc2Ug +aWQ9InJlcG9ydF9odG1sX2V4cG9ydF90aXRsZSI+UmVwb3J0PC9lcHA6cGhyYXNlPgo8ZXBwOnBo +cmFzZSBpZD0icmVwb3J0X2h0bWxfcHJpbnRfYnRuIj48YSBocmVmPSJqYXZhc2NyaXB0OndpbmRv +dy5wcmludCgpIiBjbGFzcz0iZXBfZm9ybV9hY3Rpb25fYnV0dG9uIGh0bWxfcmVwb3J0X3ByaW50 +IGVwX25vcHJpbnQiPlByaW50PC9hPjwvZXBwOnBocmFzZT4KCjwhLS0gRVByaW50IFJlcG9ydCAt +LT4KPGVwcDpwaHJhc2UgaWQ9IlBsdWdpbi9TY3JlZW4vUmVwb3J0L0VQcmludDp0aXRsZSI+RVBy +aW50czwvZXBwOnBocmFzZT4KPGVwcDpwaHJhc2UgaWQ9ImV4cG9ydGZpZWxkczplcHJpbnRfcmVw +b3J0X2NvcmUiPkV4cG9ydCBGaWVsZHM8L2VwcDpwaHJhc2U+CjxlcHA6cGhyYXNlIGlkPSJlcHJp +bnRfcmVwb3J0OnNvcnQ6Ynl5ZWFyIj5ZZWFyPC9lcHA6cGhyYXNlPgo8ZXBwOnBocmFzZSBpZD0i +ZXByaW50X3JlcG9ydDpzb3J0OmJ5bmFtZSI+Q3JlYXRvcnM8L2VwcDpwaHJhc2U+CjxlcHA6cGhy +YXNlIGlkPSJlcHJpbnRfcmVwb3J0OnNvcnQ6Ynl0aXRsZSI+VGl0bGU8L2VwcDpwaHJhc2U+Cjxl +cHA6cGhyYXNlIGlkPSJlcHJpbnRfcmVwb3J0OnNvcnQ6YnlkaXZpc2lvbiI+RGl2aXNpb248L2Vw +cDpwaHJhc2U+Cgo8ZXBwOnBocmFzZSBpZD0iZXByaW50X3JlcG9ydDpncm91cDpkaXZpc2lvbnMi +PkRpdmlzaW9uPC9lcHA6cGhyYXNlPgo8ZXBwOnBocmFzZSBpZD0iZXByaW50X3JlcG9ydDpncm91 +cDpzdWJqZWN0cyI+U3ViamVjdDwvZXBwOnBocmFzZT4KPGVwcDpwaHJhc2UgaWQ9ImVwcmludF9y +ZXBvcnQ6Z3JvdXA6dHlwZSI+SXRlbSBUeXBlPC9lcHA6cGhyYXNlPgo8ZXBwOnBocmFzZSBpZD0i +ZXByaW50X3JlcG9ydDpncm91cDpkYXRlIj5EYXRlPC9lcHA6cGhyYXNlPgoKPCEtLSBVc2VyIFJl +cG9ydCAtLT4KPGVwcDpwaHJhc2UgaWQ9IlBsdWdpbi9TY3JlZW4vUmVwb3J0L1VzZXI6dGl0bGUi +PlVzZXJzPC9lcHA6cGhyYXNlPgo8ZXBwOnBocmFzZSBpZD0iZXhwb3J0ZmllbGRzOnVzZXJfcmVw +b3J0X2NvcmUiPkV4cG9ydCBGaWVsZHM8L2VwcDpwaHJhc2U+CjxlcHA6cGhyYXNlIGlkPSJ1c2Vy +X3JlcG9ydDpzb3J0OmJ5bmFtZSI+TmFtZTwvZXBwOnBocmFzZT4KCjwvZXBwOnBocmFzZXM+Cg== plugins/EPrints/Plugin/Export/Grid2.pm text/plain - dd9b2c0a038b1f9f51b618a4b2e11c4b + 83d730999923d798d1acbb44c4a91667 MD5 - 9699 + 10222 PWhlYWQxIE5BTUUKCkVQcmludHM6OlBsdWdpbjo6RXhwb3J0OjpHcmlkMgoKPWN1dAoKcGFja2Fn ZSBFUHJpbnRzOjpQbHVnaW46OkV4cG9ydDo6R3JpZDI7Cgp1c2UgRGF0YTo6RHVtcGVyOwp1c2Ug RVByaW50czo6UGx1Z2luOjpFeHBvcnQ7CgpASVNBID0gKCAiRVByaW50czo6UGx1Z2luOjpFeHBv @@ -286,73 +294,82 @@ LCAkdmFsdWU7CQkJCQkJCgkJCQl9CgkJCX0KCQl9CgoJCW15ICRpID0gQHskcm93c1swXX07CgkJ bXkgJF9yb3dzOwoJCWlmKCBFUHJpbnRzOjpVdGlsczo6aXNfc2V0KCAkZmllbGQgKSApICN3ZSBh bHJlYWR5IGhhdmUgb3VyIHZhbHVlcwoJCXsKCQkJaWYoIHNjYWxhciBAeyRzdWJfZGF0YW9ial92 YWx1ZXN9ID4gMCApCgkJCXsKCQkJCSRfcm93cyA9ICRzZWxmLT52YWx1ZV90b19yb3dzKCRmaWVs -ZCwgJHN1Yl9kYXRhb2JqX3ZhbHVlcyk7CQkJCgkJCX0KCQkJZWxzZSAjdGhlcmUncyBubyByZXN1 -bHRzLCBidXQgd2Ugc3RpbGwgbmVlZCB0byBhZGQgYW4gZW1wdHkgY2VsbCB0byB0aGUgc3ByZWFk -c2hlZXQKCQkJewoJCQkJJF9yb3dzID0gJHNlbGYtPnZhbHVlX3RvX3Jvd3MoJGZpZWxkLCB1bmRl -Zik7CgkJCX0KCQl9CgkJZWxzZSAjd2UgbmVlZCB0byByZXRyaWV2ZSBvdXIgdmFsdWVzIGZvciB0 -aGlzIGZpZWxkIGZyb20gb3VyIGRhdGFvYmogKG9yIHN1Yl9kYXRhb2JqKQoJCXsKCQkJbXkgJHZh -bHVlOwoJCQlpZiggZGVmaW5lZCAkb3B0c3tjdXN0b21fZXhwb3J0fSAmJiBkZWZpbmVkICRvcHRz -e2N1c3RvbV9leHBvcnR9LT57JGZuYW1lfSApICN3ZSBoYXZlIGEgY3VzdG9tIGV4cG9ydGVyCgkJ -CXsKCQkJCSR2YWx1ZSA9ICRvcHRze2N1c3RvbV9leHBvcnR9LT57JGZuYW1lfS0+KCAkZGF0YW9i -aiwgJG9wdHN7cGx1Z2lufSApOwoJCQkJJF9yb3dzID0gJHNlbGYtPmN1c3RvbV92YWx1ZV90b19y -b3dzKCAkdmFsdWUgKTsKCQkJfQoJCQllbHNlICNqdXN0IGdldCB0aGUgZmllbGQncyB1c3VhbCB2 -YWx1ZQoJCQl7CgkJCQkkZmllbGQgPSBFUHJpbnRzOjpVdGlsczo6ZmllbGRfZnJvbV9jb25maWdf -c3RyaW5nKCAkZHMsICRmbmFtZSApOwoJCQkJaWYoICRmaWVsZC0+Z2V0X3Byb3BlcnR5KCAidmly -dHVhbCIgKSApICN2aXJ0dWFsIGZpZWxkcyBuZWVkIHJlbmRlcmluZwoJCQkJewoJCQkJCSR2YWx1 -ZSA9IEVQcmludHM6OlV0aWxzOjp0cmVlX3RvX3V0ZjgoICRkYXRhb2JqLT5yZW5kZXJfdmFsdWUo -ICRmbmFtZSApICk7CgkJCQl9CgkJCQllbHNlICNyZWd1bGFyIGZpZWxkIHZhbHVlcyBjYW4gc2lt -cGx5IGJlIHJldHJpZXZlZAoJCQkJewoJCQkJCSR2YWx1ZSA9ICRmaWVsZC0+Z2V0X3ZhbHVlKCAk -ZGF0YW9iaiApOwoJCQkJfQoJCQkJJF9yb3dzID0gJHNlbGYtPnZhbHVlX3RvX3Jvd3MoJGZpZWxk -LCAkdmFsdWUpOyAJCQoJCQl9CQkJCgkJfQoKCQlmb3JlYWNoIG15ICRqICgwLi4kIyRfcm93cykK -CQl7CgkJCWZvcmVhY2ggbXkgJF9pICgwLi4kI3skX3Jvd3MtPlskal19KQoJCQl7CgkJCQkkcm93 -c1skal1bJGkrJF9pXSA9ICRfcm93cy0+WyRqXVskX2ldOwoJCQl9CgkJfQoJfQoKCSMgZ2VuZXJh -dGUgY29tcGxldGUgcm93cwoJaWYoJG9wdHN7cGx1Z2lufS0+cGFyYW0oICJtdWx0aWxpbmVfcmVw -ZWF0IiApKSAjd2Ugd2FudCBlYWNoIGNvbHVtbiB0byByZXBlYXQgZm9yIGVhY2ggcm93Cgl7CgkJ -Zm9yZWFjaCBteSAkaSAoMC4uKHNjYWxhciBAcm93cyktMSkKCQl7CgkJCWZvcmVhY2ggbXkgJGog -KDAuLiQjeyRyb3dzWzBdfSkKCQkJewoJCQkJJHJvd3NbJGldWyRqXSB8fD0gJHJvd3NbMF1bJGpd -OwoJCQl9CQoJCX0KCX0KCWVsc2UgI3dlIGRvbid0IHdhbnQgcmVwZWF0aW5nIHZhbHVlcyBpbiB0 -aGUgY29sdW1ucwoJewkKCQlmb3IoQHJvd3MpIHsKCQkJJF8tPlswXSA9ICRyb3dzWzBdWzBdOyAj -Zmlyc3QgZWxlbWVudCBvZiB0aGlzIGFycmF5IGVxdWFscyB0aGUgZmlyc3QgZWxlbWVudCBvZiB0 -aGUgZmlyc3Qgcm93CgkJCSRfLT5bJCN7JHJvd3NbMF19XSB8fD0gdW5kZWY7CgkJfQoKCX0KCgly -ZXR1cm4gXEByb3dzOwp9CgpzdWIgdmFsdWVfdG9fcm93cwp7CglteSAoJHNlbGYsICRmaWVsZCwg -JHZhbHVlKSA9IEBfOwoKCW15IEByb3dzOwoKCWlmIChyZWYoJHZhbHVlKSBlcSAiQVJSQVkiKQoJ -ewoJCSR2YWx1ZSA9IFskZmllbGQtPmVtcHR5X3ZhbHVlXSBpZiAhQCR2YWx1ZTsKCQlAcm93cyA9 -IG1hcCB7ICRzZWxmLT52YWx1ZV90b19yb3dzKCRmaWVsZCwgJF8pLT5bMF0gfSBAJHZhbHVlOwoJ -fQoJZWxzaWYgKCRmaWVsZC0+aXNhKCJFUHJpbnRzOjpNZXRhRmllbGQ6Ok11bHRpcGFydCIpKQoJ -ewoJCWlmKCAkZmllbGQtPmlzYSggIkVQcmludHM6Ok1ldGFGaWVsZDo6TmFtZSIgKSkgI25lZWQg -dG8gZGVhbCB3aXRoIGxlZ2FjeSBwaHJhc2UgaWQncwogICAgICAgICAgICAgICAgewoJCQlteSBA -Yml0X3ZhbHVlczsKCQkJZm9yZWFjaCBteSAkYml0ICggJGZpZWxkLT5nZXRfaW5wdXRfYml0cygp -ICkKICAgICAgICAgICAgICAgICAgICAgICAgewoJCQkJcHVzaCBAYml0X3ZhbHVlcywgJHZhbHVl -LT57JGJpdH07CiAgICAgICAgCQl9CQoJCQlwdXNoIEByb3dzLCBcQGJpdF92YWx1ZXM7CgkgICAg -ICAgIH0KCQllbHNlCgkJewoJCQlwdXNoIEByb3dzLCBbbWFwIHsgJHZhbHVlLT57JF8tPntzdWJf -bmFtZX19IH0gQHskZmllbGQtPnByb3BlcnR5KCJmaWVsZHNfY2FjaGUiKX1dOwoJCX0KCX0KCWVs -c2lmICgkZmllbGQtPmlzYSgiRVByaW50czo6TWV0YUZpZWxkOjpDb21wb3VuZCIpKQoJewoJCW15 -IEBzdWJfdmFsdWVzOwoJCWZvcmVhY2ggbXkgJGtleSAoa2V5cyAleyR2YWx1ZX0pCgkJewoJCQlw -dXNoIEBzdWJfdmFsdWVzLCAkdmFsdWUtPnska2V5fTsKCQl9CgkJcHVzaCBAcm93cywgXEBzdWJf -dmFsdWVzOwoJfQoJZWxzZQoJewoJCXB1c2ggQHJvd3MsIFskdmFsdWVdOwoJfQoKCXJldHVybiBc -QHJvd3M7Cn0KCiN1c2VkIGZvciBjdXN0b20gZXhwb3J0cyB0aGF0IG1pZ2h0IHJldHVybiBhIGZp -ZWxkIG9yIGFuIGFycmF5IChidXQgYXJlbid0IG5lY2VzYXJpbHkgYXNzb2NpYXRlZCB3aXRoIGEg -ZmllbGQhKQpzdWIgY3VzdG9tX3ZhbHVlX3RvX3Jvd3MKewogICAgICAgIG15ICgkc2VsZiwgJHZh -bHVlKSA9IEBfOwoKICAgICAgICBteSBAcm93czsKCiAgICAgICAgaWYgKHJlZigkdmFsdWUpIGVx -ICJBUlJBWSIpCiAgICAgICAgewogICAgICAgICAgICAgICAgQHJvd3MgPSBtYXAgeyAkc2VsZi0+ -Y3VzdG9tX3ZhbHVlX3RvX3Jvd3MoJF8pLT5bMF0gfSBAJHZhbHVlOwogICAgICAgIH0KICAgICAg -ICBlbHNlCiAgICAgICAgewogICAgICAgICAgICAgICAgcHVzaCBAcm93cywgWyR2YWx1ZV07CiAg -ICAgICAgfQoKICAgICAgICByZXR1cm4gXEByb3dzOwp9CgoKMTsKCj1oZWFkMSBDT1BZUklHSFQK -Cj1mb3IgQ09QWVJJR0hUIEJFR0lOCgpDb3B5cmlnaHQgMjAwMC0yMDExIFVuaXZlcnNpdHkgb2Yg -U291dGhhbXB0b24uCgo9Zm9yIENPUFlSSUdIVCBFTkQKCj1mb3IgTElDRU5TRSBCRUdJTgoKVGhp -cyBmaWxlIGlzIHBhcnQgb2YgRVByaW50cyBMPGh0dHA6Ly93d3cuZXByaW50cy5vcmcvPi4KCkVQ -cmludHMgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1v -ZGlmeSBpdAp1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMg -TGljZW5zZSBhcyBwdWJsaXNoZWQKYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0 -aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0 -ZXIgdmVyc2lvbi4KCkVQcmludHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3 -aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhl -IGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCkZJVE5FU1MgRk9SIEEgUEFS -VElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCkxpY2Vu -c2UgZm9yIG1vcmUgZGV0YWlscy4KCllvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2Yg -dGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKTGljZW5zZSBhbG9uZyB3aXRoIEVQcmludHMu -ICBJZiBub3QsIHNlZSBMPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgoKPWZvciBMSUNF -TlNFIEVORAoK +ZCwgJHN1Yl9kYXRhb2JqX3ZhbHVlcywgJGRhdGFvYmopOwkJCQoJCQl9CgkJCWVsc2UgI3RoZXJl +J3Mgbm8gcmVzdWx0cywgYnV0IHdlIHN0aWxsIG5lZWQgdG8gYWRkIGFuIGVtcHR5IGNlbGwgdG8g +dGhlIHNwcmVhZHNoZWV0CgkJCXsKCQkJCSRfcm93cyA9ICRzZWxmLT52YWx1ZV90b19yb3dzKCRm +aWVsZCwgdW5kZWYpOwoJCQl9CgkJfQoJCWVsc2UgI3dlIG5lZWQgdG8gcmV0cmlldmUgb3VyIHZh +bHVlcyBmb3IgdGhpcyBmaWVsZCBmcm9tIG91ciBkYXRhb2JqIChvciBzdWJfZGF0YW9iaikKCQl7 +CgkJCW15ICR2YWx1ZTsKCQkJaWYoIGRlZmluZWQgJG9wdHN7Y3VzdG9tX2V4cG9ydH0gJiYgZGVm +aW5lZCAkb3B0c3tjdXN0b21fZXhwb3J0fS0+eyRmbmFtZX0gKSAjd2UgaGF2ZSBhIGN1c3RvbSBl +eHBvcnRlcgoJCQl7CgkJCQkkdmFsdWUgPSAkb3B0c3tjdXN0b21fZXhwb3J0fS0+eyRmbmFtZX0t +PiggJGRhdGFvYmosICRvcHRze3BsdWdpbn0gKTsKCQkJCSRfcm93cyA9ICRzZWxmLT5jdXN0b21f +dmFsdWVfdG9fcm93cyggJHZhbHVlICk7CgkJCX0KCQkJZWxzZSAjanVzdCBnZXQgdGhlIGZpZWxk +J3MgdXN1YWwgdmFsdWUKCQkJewoJCQkJJGZpZWxkID0gRVByaW50czo6VXRpbHM6OmZpZWxkX2Zy +b21fY29uZmlnX3N0cmluZyggJGRzLCAkZm5hbWUgKTsKCQkJCWlmKCAkZmllbGQtPmdldF9wcm9w +ZXJ0eSggInZpcnR1YWwiICkgKSAjdmlydHVhbCBmaWVsZHMgbmVlZCByZW5kZXJpbmcKCQkJCXsK +CQkJCQkkdmFsdWUgPSBFUHJpbnRzOjpVdGlsczo6dHJlZV90b191dGY4KCAkZGF0YW9iai0+cmVu +ZGVyX3ZhbHVlKCAkZm5hbWUgKSApOwoJCQkJfQoJCQkJZWxzZSAjcmVndWxhciBmaWVsZCB2YWx1 +ZXMgY2FuIHNpbXBseSBiZSByZXRyaWV2ZWQKCQkJCXsKCQkJCQkkdmFsdWUgPSAkZmllbGQtPmdl +dF92YWx1ZSggJGRhdGFvYmogKTsKCQkJCX0KCQkJCSRfcm93cyA9ICRzZWxmLT52YWx1ZV90b19y +b3dzKCRmaWVsZCwgJHZhbHVlLCAkZGF0YW9iaik7IAkJCgkJCX0JCQkKCQl9CgoJCWZvcmVhY2gg +bXkgJGogKDAuLiQjJF9yb3dzKQoJCXsKCQkJZm9yZWFjaCBteSAkX2kgKDAuLiQjeyRfcm93cy0+ +WyRqXX0pCgkJCXsKCQkJCSRyb3dzWyRqXVskaSskX2ldID0gJF9yb3dzLT5bJGpdWyRfaV07CgkJ +CX0KCQl9Cgl9CgoJIyBnZW5lcmF0ZSBjb21wbGV0ZSByb3dzCglpZigkb3B0c3twbHVnaW59LT5w +YXJhbSggIm11bHRpbGluZV9yZXBlYXQiICkpICN3ZSB3YW50IGVhY2ggY29sdW1uIHRvIHJlcGVh +dCBmb3IgZWFjaCByb3cKCXsKCQlmb3JlYWNoIG15ICRpICgwLi4oc2NhbGFyIEByb3dzKS0xKQoJ +CXsKCQkJZm9yZWFjaCBteSAkaiAoMC4uJCN7JHJvd3NbMF19KQoJCQl7CgkJCQkkcm93c1skaV1b +JGpdIHx8PSAkcm93c1swXVskal07CgkJCX0JCgkJfQoJfQoJZWxzZSAjd2UgZG9uJ3Qgd2FudCBy +ZXBlYXRpbmcgdmFsdWVzIGluIHRoZSBjb2x1bW5zCgl7CQoJCWZvcihAcm93cykgewoJCQkkXy0+ +WzBdID0gJHJvd3NbMF1bMF07ICNmaXJzdCBlbGVtZW50IG9mIHRoaXMgYXJyYXkgZXF1YWxzIHRo +ZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBmaXJzdCByb3cKCQkJJF8tPlskI3skcm93c1swXX1dIHx8 +PSB1bmRlZjsKCQl9CgoJfQoKCXJldHVybiBcQHJvd3M7Cn0KCnN1YiB2YWx1ZV90b19yb3dzCnsK +CW15ICgkc2VsZiwgJGZpZWxkLCAkdmFsdWUsICRkYXRhb2JqKSA9IEBfOwoKCW15IEByb3dzOwoK +CWlmIChyZWYoJHZhbHVlKSBlcSAiQVJSQVkiKQoJewoJCSR2YWx1ZSA9IFskZmllbGQtPmVtcHR5 +X3ZhbHVlXSBpZiAhQCR2YWx1ZTsKCQlAcm93cyA9IG1hcCB7ICRzZWxmLT52YWx1ZV90b19yb3dz +KCRmaWVsZCwgJF8sICRkYXRhb2JqKS0+WzBdIH0gQCR2YWx1ZTsKCX0KCWVsc2lmICgkZmllbGQt +PmlzYSgiRVByaW50czo6TWV0YUZpZWxkOjpNdWx0aXBhcnQiKSkKCXsKCQlpZiggJGZpZWxkLT5p +c2EoICJFUHJpbnRzOjpNZXRhRmllbGQ6Ok5hbWUiICkpICNuZWVkIHRvIGRlYWwgd2l0aCBsZWdh +Y3kgcGhyYXNlIGlkJ3MKICAgICAgICAgICAgICAgIHsKCQkJbXkgQGJpdF92YWx1ZXM7CgkJCWZv +cmVhY2ggbXkgJGJpdCAoICRmaWVsZC0+Z2V0X2lucHV0X2JpdHMoKSApCiAgICAgICAgICAgICAg +ICAgICAgICAgIHsKCQkJCXB1c2ggQGJpdF92YWx1ZXMsICR2YWx1ZS0+eyRiaXR9OwogICAgICAg +IAkJfQkKCQkJcHVzaCBAcm93cywgXEBiaXRfdmFsdWVzOwoJICAgICAgICB9CgkJZWxzZQoJCXsK +CQkJcHVzaCBAcm93cywgW21hcCB7ICR2YWx1ZS0+eyRfLT57c3ViX25hbWV9fSB9IEB7JGZpZWxk +LT5wcm9wZXJ0eSgiZmllbGRzX2NhY2hlIil9XTsKCQl9Cgl9CgllbHNpZiAoJGZpZWxkLT5pc2Eo +IkVQcmludHM6Ok1ldGFGaWVsZDo6Q29tcG91bmQiKSkKCXsKCQlteSBAc3ViX3ZhbHVlczsKCQlm +b3JlYWNoIG15ICRrZXkgKGtleXMgJXskdmFsdWV9KQoJCXsKCQkJcHVzaCBAc3ViX3ZhbHVlcywg +JHZhbHVlLT57JGtleX07CgkJfQoJCXB1c2ggQHJvd3MsIFxAc3ViX3ZhbHVlczsKCX0KCWVsc2lm +KCAkZmllbGQtPmlzYSgiRVByaW50czo6TWV0YUZpZWxkOjpTdWJqZWN0IikpCiAgICAgICAgewog +ICAgICAgICAgICAgICAgaWYoICR2YWx1ZSBuZSAiIiApCiAgICAgICAgICAgICAgICB7CiAgICAg +ICAgICAgICAgICAgICAgICAgIHB1c2ggQHJvd3MsIFskZmllbGQtPnJlbmRlcl9zaW5nbGVfdmFs +dWUoICRmaWVsZC0+cmVwb3NpdG9yeSwgJHZhbHVlICldOwogICAgICAgICAgICAgICAgfQogICAg +ICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAg +ICBwdXNoIEByb3dzLCBbJHZhbHVlXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICB9CgllbHNp +ZiggISRmaWVsZC0+aXNhKCJFUHJpbnRzOjpNZXRhRmllbGQ6OlN1Ym9iamVjdCIpICYmICRmaWVs +ZC0+aXNfdmlydHVhbCApCgl7CgkJcHVzaCBAcm93cywgWyRkYXRhb2JqLT5yZW5kZXJfdmFsdWUo +ICRmaWVsZC0+bmFtZSApXTsKCX0KCWVsc2UKCXsKCQlwdXNoIEByb3dzLCBbJHZhbHVlXTsKCX0K +CglyZXR1cm4gXEByb3dzOwp9CgojdXNlZCBmb3IgY3VzdG9tIGV4cG9ydHMgdGhhdCBtaWdodCBy +ZXR1cm4gYSBmaWVsZCBvciBhbiBhcnJheSAoYnV0IGFyZW4ndCBuZWNlc2FyaWx5IGFzc29jaWF0 +ZWQgd2l0aCBhIGZpZWxkISkKc3ViIGN1c3RvbV92YWx1ZV90b19yb3dzCnsKICAgICAgICBteSAo +JHNlbGYsICR2YWx1ZSkgPSBAXzsKCiAgICAgICAgbXkgQHJvd3M7CgogICAgICAgIGlmIChyZWYo +JHZhbHVlKSBlcSAiQVJSQVkiKQogICAgICAgIHsKICAgICAgICAgICAgICAgIEByb3dzID0gbWFw +IHsgJHNlbGYtPmN1c3RvbV92YWx1ZV90b19yb3dzKCRfKS0+WzBdIH0gQCR2YWx1ZTsKICAgICAg +ICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgICAgIHB1c2ggQHJvd3MsIFsk +dmFsdWVdOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIFxAcm93czsKfQoKCjE7Cgo9aGVhZDEg +Q09QWVJJR0hUCgo9Zm9yIENPUFlSSUdIVCBCRUdJTgoKQ29weXJpZ2h0IDIwMDAtMjAxMSBVbml2 +ZXJzaXR5IG9mIFNvdXRoYW1wdG9uLgoKPWZvciBDT1BZUklHSFQgRU5ECgo9Zm9yIExJQ0VOU0Ug +QkVHSU4KClRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVQcmludHMgTDxodHRwOi8vd3d3LmVwcmludHMu +b3JnLz4uCgpFUHJpbnRzIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0 +IGFuZC9vciBtb2RpZnkgaXQKdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVy +YWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCmJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5k +YXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCihhdCB5b3VyIG9wdGlv +bikgYW55IGxhdGVyIHZlcnNpb24uCgpFUHJpbnRzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3Bl +IHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCkFOWSBXQVJSQU5UWTsgd2l0aG91 +dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgpGSVRORVNT +IEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1 +YmxpYwpMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCgpZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQg +YSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCkxpY2Vuc2UgYWxvbmcgd2l0 +aCBFUHJpbnRzLiAgSWYgbm90LCBzZWUgTDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4K +Cj1mb3IgTElDRU5TRSBFTkQKCg== @@ -621,9 +638,9 @@ dGF0aW9uX2xpbmsgKTsKCiAgICAgICAgcmV0dXJuICRwOwp9CgoxOyAgICAgICAgCg== plugins/EPrints/Plugin/Export/Report/JSON.pm text/plain - 3ee98189aee3464f0992881814056a72 + 3786d272e437a488408e5825270e1609 MD5 - 6567 + 6648 cGFja2FnZSBFUHJpbnRzOjpQbHVnaW46OkV4cG9ydDo6UmVwb3J0OjpKU09OOwoKdXNlIEVQcmlu dHM6OlBsdWdpbjo6RXhwb3J0OjpSZXBvcnQ7CkBJU0EgPSAoICJFUHJpbnRzOjpQbHVnaW46OkV4 cG9ydDo6UmVwb3J0IiApOwoKdXNlIHN0cmljdDsKCnN1YiBuZXcKewoJbXkoICRjbGFzcywgJXBh @@ -717,688 +734,810 @@ ICAgfQoJCQl9CgkJCWVsc2UKCQkJewoJCQkJbXkgJGZpZWxkID0gJHNlbGYtPntkYXRhc2V0fS0+ Z2V0X2ZpZWxkKCAkZmllbGRuYW1lICk7CgkgICAgICAgICAgICAgICAgICAgICAgICBuZXh0IGlm ICEkZmllbGQtPmdldF9wcm9wZXJ0eSggImV4cG9ydF9hc194bWwiICk7CiAgICAgICAgCSAgICAg ICAgICAgICAgICBuZXh0IGlmIGRlZmluZWQgJGZpZWxkLT57c3ViX25hbWV9OwoJCQkJbXkgJHZh -bHVlID0gJGZpZWxkLT5nZXRfdmFsdWUoICRlcGRhdGEgKTsKCQkJCWlmKCBleGlzdHMgJHJlcG8t -PmNvbmZpZyggJHNlbGYtPntyZXBvcnR9LT57ZXhwb3J0X2NvbmZ9LCAiY3VzdG9tX2V4cG9ydCIg -KS0+eyRmaWVsZC0+Z2V0X25hbWV9ICkKICAgICAgICAJICAgICAgICAgICAgICAgIHsKCQkJCQkk -dmFsdWUgPSAkcmVwby0+Y29uZmlnKCAkc2VsZi0+e3JlcG9ydH0tPntleHBvcnRfY29uZn0sICJj -dXN0b21fZXhwb3J0IiApLT57JGZpZWxkLT5nZXRfbmFtZX0tPiggJGVwZGF0YSwgJHNlbGYtPnty -ZXBvcnR9ICk7CgkJCQl9CgkJCQlpZiggZGVmaW5lZCAkZmllbGQtPnt2aXJ0dWFsfSApCgkJCQl7 -CgkJCQkJJHZhbHVlID0gRVByaW50czo6VXRpbHM6OnRyZWVfdG9fdXRmOCggJGVwZGF0YS0+cmVu -ZGVyX3ZhbHVlKCAkZmllbGQtPmdldF9uYW1lICkgKTsKCQkJCX0KCQkgICAgICAgICAgICAgICAg -bmV4dCBpZiAhRVByaW50czo6VXRpbHM6OmlzX3NldCggJHZhbHVlICk7CiAgICAgICAgCSAgICAg -ICAgICAgICAgICAkc3ViZGF0YS0+eyRmaWVsZC0+Z2V0X25hbWV9ID0gJHZhbHVlOwoJCQl9CiAg -ICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkc3ViZGF0YS0+e3VyaX0gPSAkZXBkYXRh -LT51cmk7CgogICAgICAgICAgICAgICAgcmV0dXJuICRzZWxmLT5fZXBkYXRhX3RvX2pzb24oICRz -dWJkYXRhLCAkZGVwdGggKyAxLCAwLCAlb3B0cyApOwogICAgICAgIH0KfQoKCnN1YiBlc2NhcGVf -dmFsdWUKewoJbXkoICRwbHVnaW4sICR2YWx1ZSApID0gQF87CgoJcmV0dXJuICciIicgdW5sZXNz -KCBkZWZpbmVkIEVQcmludHM6OlV0aWxzOjppc19zZXQoICR2YWx1ZSApICk7CgoJIyBzdHJpcHMg -YW55IGtpbmQgb2YgZG91YmxlLXF1b3RlczoKCSR2YWx1ZSA9fiBzL1x4OTN8XHg5NHwiLycvZzsK -CSMgYW5kIGNvbnRyb2wtY2hhcmFjdGVycwoJJHZhbHVlID1+IHMvXG58XHJ8XHQvL2c7CgoJIyBp -ZiB2YWx1ZSBpcyBhIHB1cmUgbnVtYmVyLCB0aGVuIGFkZCA9IiR2YWx1ZSIgc28gdGhhdCBFeGNl -bCBzdG9wcyB0aGUgYXV0by1mb3JtYXR0aW5nIChpdCdkIHR1cm4gMTIzNDU2IGludG8gMS4yM2Ur -NikKCWlmKCAkdmFsdWUgPX4gL15bMC05XC1dKyQvICkKCXsKCQlyZXR1cm4gIj1cIiR2YWx1ZVwi -IjsKCX0KCgkjIG9ubHkgZXNjYXBlcyByb3cgd2l0aCBzcGFjZXMgYW5kIGNvbW1hcwoJaWYoICR2 -YWx1ZSA9fiAvLHwgLyApCgl7CgkJcmV0dXJuICJcIiR2YWx1ZVwiIjsKCX0KCglyZXR1cm4gJHZh -bHVlOwp9CgoKMTsK +bHVlID0gJGZpZWxkLT5nZXRfdmFsdWUoICRlcGRhdGEgKTsKCQkJCWlmKCBkZWZpbmVkICRyZXBv +LT5jb25maWcoICRzZWxmLT57cmVwb3J0fS0+e2V4cG9ydF9jb25mfSwgImN1c3RvbV9leHBvcnQi +ICkgJiYKCQkJCQlleGlzdHMgJHJlcG8tPmNvbmZpZyggJHNlbGYtPntyZXBvcnR9LT57ZXhwb3J0 +X2NvbmZ9LCAiY3VzdG9tX2V4cG9ydCIgKS0+eyRmaWVsZC0+Z2V0X25hbWV9ICkKICAgICAgICAJ +ICAgICAgICAgICAgICAgIHsKCQkJCQkkdmFsdWUgPSAkcmVwby0+Y29uZmlnKCAkc2VsZi0+e3Jl +cG9ydH0tPntleHBvcnRfY29uZn0sICJjdXN0b21fZXhwb3J0IiApLT57JGZpZWxkLT5nZXRfbmFt +ZX0tPiggJGVwZGF0YSwgJHNlbGYtPntyZXBvcnR9ICk7CgkJCQl9CgkJCQlpZiggZGVmaW5lZCAk +ZmllbGQtPnt2aXJ0dWFsfSApCgkJCQl7CgkJCQkJJHZhbHVlID0gRVByaW50czo6VXRpbHM6OnRy +ZWVfdG9fdXRmOCggJGVwZGF0YS0+cmVuZGVyX3ZhbHVlKCAkZmllbGQtPmdldF9uYW1lICkgKTsK +CQkJCX0KCQkgICAgICAgICAgICAgICAgbmV4dCBpZiAhRVByaW50czo6VXRpbHM6OmlzX3NldCgg +JHZhbHVlICk7CiAgICAgICAgCSAgICAgICAgICAgICAgICAkc3ViZGF0YS0+eyRmaWVsZC0+Z2V0 +X25hbWV9ID0gJHZhbHVlOwoJCQl9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAk +c3ViZGF0YS0+e3VyaX0gPSAkZXBkYXRhLT51cmk7CgogICAgICAgICAgICAgICAgcmV0dXJuICRz +ZWxmLT5fZXBkYXRhX3RvX2pzb24oICRzdWJkYXRhLCAkZGVwdGggKyAxLCAwLCAlb3B0cyApOwog +ICAgICAgIH0KfQoKCnN1YiBlc2NhcGVfdmFsdWUKewoJbXkoICRwbHVnaW4sICR2YWx1ZSApID0g +QF87CgoJcmV0dXJuICciIicgdW5sZXNzKCBkZWZpbmVkIEVQcmludHM6OlV0aWxzOjppc19zZXQo +ICR2YWx1ZSApICk7CgoJIyBzdHJpcHMgYW55IGtpbmQgb2YgZG91YmxlLXF1b3RlczoKCSR2YWx1 +ZSA9fiBzL1x4OTN8XHg5NHwiLycvZzsKCSMgYW5kIGNvbnRyb2wtY2hhcmFjdGVycwoJJHZhbHVl +ID1+IHMvXG58XHJ8XHQvL2c7CgoJIyBpZiB2YWx1ZSBpcyBhIHB1cmUgbnVtYmVyLCB0aGVuIGFk +ZCA9IiR2YWx1ZSIgc28gdGhhdCBFeGNlbCBzdG9wcyB0aGUgYXV0by1mb3JtYXR0aW5nIChpdCdk +IHR1cm4gMTIzNDU2IGludG8gMS4yM2UrNikKCWlmKCAkdmFsdWUgPX4gL15bMC05XC1dKyQvICkK +CXsKCQlyZXR1cm4gIj1cIiR2YWx1ZVwiIjsKCX0KCgkjIG9ubHkgZXNjYXBlcyByb3cgd2l0aCBz +cGFjZXMgYW5kIGNvbW1hcwoJaWYoICR2YWx1ZSA9fiAvLHwgLyApCgl7CgkJcmV0dXJuICJcIiR2 +YWx1ZVwiIjsKCX0KCglyZXR1cm4gJHZhbHVlOwp9CgoKMTsK plugins/EPrints/Plugin/Screen/Report.pm text/plain - 210449eac1f7ee02e7519beead2c640b + e88058df69ea1db3f145b316f6d1ada2 MD5 - 37100 + 43956 cGFja2FnZSBFUHJpbnRzOjpQbHVnaW46OlNjcmVlbjo6UmVwb3J0OwoKIyBBYnN0cmFjdCBjbGFz cyB0aGF0IGhhbmRsZXMgdGhlIFJlcG9ydCB0b29scwoKdXNlIEpTT04gcXcoZW5jb2RlX2pzb24p Owp1c2UgRVByaW50czo6UGx1Z2luOjpTY3JlZW47CkBJU0EgPSAoICdFUHJpbnRzOjpQbHVnaW46 OlNjcmVlbicgKTsKCnVzZSBzdHJpY3Q7CgpzdWIgbmV3CnsKCW15KCAkY2xhc3MsICVwYXJhbXMg KSA9IEBfOwoKCW15ICRzZWxmID0gJGNsYXNzLT5TVVBFUjo6bmV3KCVwYXJhbXMpOwoKCXB1c2gg -QHskc2VsZi0+e2FjdGlvbnN9fSwgcXcoIGV4cG9ydCBzZWFyY2ggKTsKCgkkc2VsZi0+e3Njb25m -fSA9ICJyZXBvcnQiOwoKICAgICAgICAkc2VsZi0+e2FwcGVhcnN9ID0gWwogICAgICAgICAgICAg -ICAgewogICAgICAgICAgICAgICAgICAgICAgICBwbGFjZSA9PiAia2V5X3Rvb2xzIiwKICAgICAg -ICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPT4gMTAwMCwKICAgICAgICAgICAgICAgIH0sCiAg -ICAgICAgXTsKCglyZXR1cm4gJHNlbGY7Cn0KCnN1YiBnZXRfcmVwb3J0IHsgc2hpZnQtPntyZXBv -cnR9IH0KCnN1YiBjYW5fYmVfdmlld2VkCnsKICAgICAgICBteSggJHNlbGYgKSA9IEBfOwoKCXJl -dHVybiAxIGlmKCAkc2VsZi0+e3B1YmxpY30gKTsgI2FsbG93IGEgcmVwb3J0IHRvIGJlIHB1Ymxp -Y2x5IGF2YWlsYWJsZQoKCXJldHVybiAwIGlmKCAhZGVmaW5lZCAkc2VsZi0+e3JlcG9zaXRvcnl9 -LT5jdXJyZW50X3VzZXIgKTsKCQoJcmV0dXJuICRzZWxmLT5hbGxvdyggJ3JlcG9ydCcgKTsKfQoK -c3ViIGFsbG93X2V4cG9ydCB7IHNoaWZ0LT5jYW5fYmVfdmlld2VkIH0Kc3ViIGFjdGlvbl9leHBv -cnQge30KCnN1YiB3aXNoZXNfdG9fZXhwb3J0IHsKCSRfWzBdLT5yZXBvc2l0b3J5LT5wYXJhbSgg -J2V4cG9ydCcgKSB8fAoJJF9bMF0tPnJlcG9zaXRvcnktPnBhcmFtKCAnYWpheCcgKTsKfQoKc3Vi -IGV4cG9ydF9taW1ldHlwZQp7CglteSggJHNlbGYgKSA9IEBfOwoKCW15ICRwbHVnaW4gPSAkc2Vs -Zi0+e3Byb2Nlc3Nvcn0tPntwbHVnaW59OwoJaWYoICFkZWZpbmVkICRwbHVnaW4gKQoJewoJCWlm -KCAkc2VsZi0+cmVwb3NpdG9yeS0+cGFyYW0oICJhamF4IiApICkKCQl7CgkJCXJldHVybiAiYXBw -bGljYXRpb24vanNvbjsgY2hhcnNldD11dGYtOCI7CgkJfQoJCgkJcmV0dXJuICJ0ZXh0L2h0bWw7 -IGNoYXJzZXQ9dXRmLTgiOwoJfQoKCXJldHVybiAkcGx1Z2luLT5wYXJhbSggIm1pbWV0eXBlIiAp -Owp9CgpzdWIgZXhwb3J0CnsKCW15KCAkc2VsZiApID0gQF87CgoJbXkgJHBhcnQgPSAkc2VsZi0+ -cmVwb3NpdG9yeS0+cGFyYW0oICJhamF4IiApOwoJbXkgJGYgPSAiYWpheF8kcGFydCI7CgoJaWYo -ICRzZWxmLT5jYW4oICRmICkgKQoJewoJCWJpbm1vZGUoU1RET1VULCAiOnV0ZjgiKTsKCQlyZXR1 -cm4gJHNlbGYtPiRmOwoJfQoKCW15ICRwbHVnaW4gPSAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntwbHVn -aW59OwoJcmV0dXJuICRzZWxmLT5TVVBFUjo6ZXhwb3J0IGlmICFkZWZpbmVkICRwbHVnaW47CgoJ -bXkgJGl0ZW1zID0gJHNlbGYtPml0ZW1zOwoJaWYoICRwbHVnaW4tPntncm91cGVkfSAmJiBkZWZp -bmVkICRzZWxmLT57cHJvY2Vzc29yfS0+e2dyb3VwfSApICNzb21lIGV4cG9ydCBwbHVnaW5zIGNh -biBhY2NlcHQgZ3JvdXBpbmdzCgl7CgkJJGl0ZW1zID0gJHNlbGYtPmdldF9ncm91cGVkX2l0ZW1z -KCAkaXRlbXMsIDAgKTsKCX0KCgkkcGx1Z2luLT5pbml0aWFsaXNlX2ZoKCBcKlNURE9VVCApOwoJ -JHBsdWdpbi0+b3V0cHV0X2xpc3QoCgkJbGlzdCA9PiAkaXRlbXMsCgkJZmggPT4gXCpTVERPVVQs -CgkJZXhwb3J0ZmllbGRzID0+ICRzZWxmLT57cHJvY2Vzc29yfS0+e2V4cG9ydGZpZWxkc30sCgkJ -ZGF0YXNldCA9PiAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntkYXRhc2V0fSwKCQlwbHVnaW4gPT4gJHNl -bGYsCgkpOwp9CgpzdWIgYWxsb3dfc2VhcmNoIHsgcmV0dXJuIDE7IH0KCiNnZW5lcmF0ZXMgc2Vh -cmNoIGNvbmZpZwpzdWIgX2NyZWF0ZV9zZWFyY2gKewoJbXkoICRzZWxmICkgPSBAXzsKCglteSAk -c2Vzc2lvbiA9ICRzZWxmLT57c2Vzc2lvbn07CiAgICAgICAgbXkgJHJlcG9ydF9wbHVnaW4gPSAk -c2VsZi0+e3Byb2Nlc3Nvcn0tPnNjcmVlbjsKCgkjIERvIG5vdCBjcmVhdGUgYSBzZWFyY2ggY29u -ZmlnIGlmIHRoaXMgaXMgbm90IGNvbmZpZ3VyZWQgaW4gdGhlIHJlcG9ydAogIAlyZXR1cm4gaWYg -ISBkZWZpbmVkICRyZXBvcnRfcGx1Z2luLT57c2VhcmNoZGF0YXNldGlkfTsKCSRzZWxmLT57cHJv -Y2Vzc29yfS0+e3JlcG9ydF9wbHVnaW59ID0gJHJlcG9ydF9wbHVnaW47CgogICAgICAgIG15ICRy -ZXBvcnRfZHMgPSAkc2Vzc2lvbi0+ZGF0YXNldCggJHJlcG9ydF9wbHVnaW4tPntzZWFyY2hkYXRh -c2V0aWR9ICk7CiAgICAgICAgaWYoIGRlZmluZWQgJHJlcG9ydF9kcyApCiAgICAgICAgewogICAg -ICAgICAgICAgICAgJHNlbGYtPntwcm9jZXNzb3J9LT57ZGF0YXNldGlkfSA9ICRyZXBvcnRfZHMt -PmJhc2VfaWQ7CiAgICAgICAgICAgICAgICBteSAkc2NvbmYgPSAkcmVwb3J0X2RzLT5zZWFyY2hf -Y29uZmlnKCAkcmVwb3J0X3BsdWdpbi0+e3Njb25mfSApOwoJCiAgICAgICAgICAgICAgICBteSAk -Zm9ybWF0ID0gInJlcG9ydC8iIC4gJHJlcG9ydF9kcy0+YmFzZV9pZDsKICAgICAgICAgICAgICAg -ICRzZWxmLT57cHJvY2Vzc29yfS0+e3NlYXJjaH0gPSAkc2Vzc2lvbi0+cGx1Z2luKCAiU2VhcmNo -IiApLT5wbHVnaW5zKAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAga2VlcF9jYWNoZSA9PiAxLAogICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgIHNlc3Npb24gPT4gJHNlbGYtPntzZXNzaW9ufSwKICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICBkYXRhc2V0ID0+ICRyZXBvcnRfZHMsCiAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgJXskc2NvbmZ9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAg -ICAgICAgICAgICAgIHR5cGUgPT4gIlNlYXJjaCIsCiAgICAgICAgICAgICAgICAgICAgICAgIGNh -bl9zZWFyY2ggPT4gJGZvcm1hdCwKICAgICAgICAgICAgICAgICk7Cgl9Cn0KCnN1YiBhY3Rpb25f -c2VhcmNoCnsKCW15KCAkc2VsZiApID0gQF87CgoJJHNlbGYtPntwcm9jZXNzb3J9LT57YWN0aW9u -fSA9ICJzZWFyY2giOwoKCSNyZWFkIHBhcmFtZXRlcnMKCW15ICRzZXNzaW9uID0gJHNlbGYtPntz -ZXNzaW9ufTsKCgkkc2VsZi0+e3Byb2Nlc3Nvcn0tPntyZXBvcnR9ID0gJHNlc3Npb24tPnBhcmFt -KCAncmVwb3J0JyApOwoKCSRzZWxmLT57cHJvY2Vzc29yfS0+e3NjcmVlbmlkfSA9ICRzZWxmLT57 -cHJvY2Vzc29yfS0+e3JlcG9ydH07Cgkkc2VsZi0+X2NyZWF0ZV9zZWFyY2g7CgoJbXkgJGxvYWRl -ZCA9IDA7CiAgICAgICAgbXkgJGlkID0gJHNlc3Npb24tPnBhcmFtKCAiY2FjaGUiICk7CiAgICAg -ICAgaWYoIGRlZmluZWQgJGlkICkKICAgICAgICB7CgkJJGxvYWRlZCA9ICRzZWxmLT57cHJvY2Vz -c29yfS0+e3NlYXJjaH0tPmZyb21fY2FjaGUoICRpZCApOwogICAgICAgIH0KCiAgICAgICAgaWYo -ICEkbG9hZGVkICkKICAgICAgICB7CiAgICAgICAgICAgICAgICBteSAkZXhwID0gJHNlc3Npb24t -PnBhcmFtKCAiZXhwIiApOwogICAgICAgICAgICAgICAgaWYoIGRlZmluZWQgJGV4cCApCiAgICAg -ICAgICAgICAgICB7CgkJCSRzZWxmLT57cHJvY2Vzc29yfS0+e3NlYXJjaH0tPmZyb21fc3RyaW5n -KCAkZXhwICk7CiAgICAgICAgICAgICAgICAgICAgICAgICMgY2FjaGUgZXhwaXJlZC4uLgogICAg -ICAgICAgICAgICAgICAgICAgICAkbG9hZGVkID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAg -ICB9CgogICAgICAgIG15IEBwcm9ibGVtczsKICAgICAgICBpZiggISRsb2FkZWQgKQogICAgICAg -IHsKCQlmb3IoICRzZWxmLT57cHJvY2Vzc29yfS0+e3NlYXJjaH0tPmZyb21fZm9ybSApCiAgICAg -ICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2Vs -Zi0+e3Byb2Nlc3Nvcn0tPmFkZF9tZXNzYWdlKCAid2FybmluZyIsICRfICk7CiAgICAgICAgICAg -ICAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgICAKCgkjZGlzcGxheSB0aGUgcmVzdWx0 -cwoJJHNlbGYtPnJlbmRlcjsKfQoKc3ViIHByb3BlcnRpZXNfZnJvbQp7CglteSggJHNlbGYgKSA9 -IEBfOwoKCW15ICRyZXBvID0gJHNlbGYtPnJlcG9zaXRvcnk7Cgkkc2VsZi0+U1VQRVI6OnByb3Bl -cnRpZXNfZnJvbTsKCglpZiggZGVmaW5lZCAoIG15ICRkc2lkID0gJHNlbGYtPnBhcmFtKCAiZGF0 -YXNldGlkIiApICkgKQoJewoJCSRzZWxmLT57cHJvY2Vzc29yfS0+e2RhdGFzZXR9ID0gJHNlbGYt -PnJlcG9zaXRvcnktPmRhdGFzZXQoICRkc2lkICk7Cgl9CgoJIyBzZjIgLSBUT0RPIC0gYmFyayBp -ZiBkYXRhc2V0IGlzIG5vdCBzZXQ/IHBlcmhhcHMgdGhlcmUgYXJlIG90aGVyIHdheXMgdG8gZ2V0 -IHRoZSBvYmplY3RzIGZyb20uLi4KCW15ICRyZXBvcnQgPSAkc2VsZi0+Z2V0X3JlcG9ydCgpOwoK -CSNnZXQgYSBzZWFyY2ggb2JqZWN0IGlmIHdlIGhhdmUgb25lIGZyb20gYSBwcmV2aW91cyBzZWFy -Y2ggYWN0aW9uLCBzbyB0aGF0IHdlIG1pZ2h0IGxhdGVyIHVzZSBpdCB0byBkbyBhbiBleHBvcnQg -b3Igc2VhcmNoIGFjdGlvbgoJJHNlbGYtPl9jcmVhdGVfc2VhcmNoOwkKCWlmKCBkZWZpbmVkICRz -ZWxmLT5yZXBvc2l0b3J5LT5wYXJhbSggInNlYXJjaCIgKSApCgl7CgkJJHNlbGYtPntwcm9jZXNz -b3J9LT57c2VhcmNofS0+ZnJvbV9zdHJpbmcoICRzZWxmLT5yZXBvc2l0b3J5LT5wYXJhbSggInNl -YXJjaCIgKSApIGlmIGRlZmluZWQgJHNlbGYtPntwcm9jZXNzb3J9LT57c2VhcmNofTsKCQkkc2Vs -Zi0+e3Byb2Nlc3Nvcn0tPntleHBvcnRfc2VhcmNofSA9IDE7Cgl9CgkKCW15ICRmb3JtYXQgPSAk -c2VsZi0+cmVwb3NpdG9yeS0+cGFyYW0oICJleHBvcnQiICk7CglpZiggJGZvcm1hdCAmJiAkcmVw -b3J0ICkKCXsKCQlteSAkcGx1Z2luID0gJHNlbGYtPnJlcG9zaXRvcnktPnBsdWdpbiggIkV4cG9y -dDo6JGZvcm1hdCIsIHJlcG9ydCA9PiAkcmVwb3J0ICk7CgkJaWYoIGRlZmluZWQgJHBsdWdpbiAm -JiAoICRwbHVnaW4tPmNhbl9hY2NlcHQoICJyZXBvcnQvJHJlcG9ydCIgKSB8fCAoJHBsdWdpbi0+ -Y2FuX2FjY2VwdCggInJlcG9ydC9nZW5lcmljIiApICkgKSApCgkJewoJCQkkc2VsZi0+e3Byb2Nl -c3Nvcn0tPntwbHVnaW59ID0gJHBsdWdpbjsKCQl9Cgl9CgoJI2xpc3Qgb2YgZXhwb3J0IGZpZWxk -cyByZXRyaWV2ZWQgZnJvbSBub24tYWJzdHJhY3QgaW5zdGFuY2VzIG9mIHJlcG9ydHMKCW15IEBl -eHBvcnRmaWVsZHM7CglpZiggZGVmaW5lZCAkcmVwby0+Y29uZmlnKCAkc2VsZi0+e2V4cG9ydF9j -b25mfSwgImV4cG9ydGZpZWxkcyIgKSApCgl7CgkJZm9yZWFjaCBteSAkZmllbGRuYW1lcyAoIHZh -bHVlcyAleyRyZXBvLT5jb25maWcoICRzZWxmLT57ZXhwb3J0X2NvbmZ9LCAiZXhwb3J0ZmllbGRz -IiApfSApCgkJewoJCQlmb3JlYWNoCW15ICRmaWVsZG5hbWUgKCBAeyRmaWVsZG5hbWVzfSApCgkJ -CXsKCQkJCXB1c2ggQGV4cG9ydGZpZWxkcywgJGZpZWxkbmFtZSBpZiBkZWZpbmVkICRzZWxmLT5y -ZXBvc2l0b3J5LT5wYXJhbSggJGZpZWxkbmFtZSApOyAKCQkJfQoJCX0KCX0KCglteSAkc29ydCA9 -ICRzZWxmLT5yZXBvc2l0b3J5LT5wYXJhbSggInNvcnQiICk7CglpZiggZGVmaW5lZCAkc29ydCAp -Cgl7CgkJJHNlbGYtPntwcm9jZXNzb3J9LT57c29ydH0gPSAkc29ydDsKCX0KCglteSAkZ3JvdXAg -PSAkc2VsZi0+cmVwb3NpdG9yeS0+cGFyYW0oICJncm91cCIgKTsKCSRzZWxmLT57cHJvY2Vzc29y -fS0+e2dyb3VwX2V4cH0gPSAkZ3JvdXA7ICNzdG9yZSB0aGUgZ3JvdXAgZXhwcmVzc2lvbiBmb3Ig -bGF0ZXIgdXNlCgkKCSNkZWNvZGUgdGhlIGdyb3VwIGV4cHJlc3Npb24KCW15ICVncm91cF9vcHRz -OwoJaWYoIGRlZmluZWQgJGdyb3VwICkKCXsKCQkjZ2V0IGZpZWxkIGFuZCBhc3NvY2lhdGVkIGNv -bmZpZ3VyYXRpb24gYWJvdXQgdGhlIGdyb3VwLCBlLmcuIHJlcywgdHJ1bmNhdGUsIHJldmVyc2Vf -b3JkZXIgZXRjLgoJCW15IEBncm91cCA9IHNwbGl0KC87LywgJGdyb3VwICk7CgkJbXkgJGZpcnN0 -ID0gMTsKCQlmb3JlYWNoIG15ICRnIChAZ3JvdXApCgkJewoJCQlpZiggJGZpcnN0ICkKCQkJewoJ -CQkJJGdyb3VwID0gJGc7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlteSBAb3B0cyA9IHNwbGl0KC89 -LywgJGcgKTsKCQkJCSRncm91cF9vcHRzeyRvcHRzWzBdfSA9ICRvcHRzWzFdOwkJCgkJCX0KCQkJ -JGZpcnN0ID0gMDsKCQl9CgkJJHNlbGYtPntwcm9jZXNzb3J9LT57Z3JvdXB9ID0gJGdyb3VwOwoJ -CSRzZWxmLT57cHJvY2Vzc29yfS0+e2dyb3VwX29wdHN9ID0gXCVncm91cF9vcHRzOwoJfQoKCSRz -ZWxmLT57cHJvY2Vzc29yfS0+e2V4cG9ydGZpZWxkc30gPSBcQGV4cG9ydGZpZWxkczsKfQoJCQoj -IFxAKHttZXRhX2ZpZWxkcz0+WyAiZmllbGQxIiwgImZpZWxkMiIgImRvY3VtZW50LmZpZWxkMyIg -XSwgbWVyZ2U9PiJBTlkiLCBtYXRjaD0+IkVYIiwgdmFsdWU9PiJiZWVzIn0sIHttZXRhX2ZpZWxk -cz0+WyAiZmllbGQ0IiBdLCB2YWx1ZT0+ImhvbmV5In0pOwojIGUuZy4KIyByZXR1cm4gWyB7IG1l -dGFfZmllbGRzID0+IFsgJ3R5cGUnIF0sIHZhbHVlID0+ICdhcnRpY2xlJyB9IF0Kc3ViIGZpbHRl -cnMKewoJcmV0dXJuIFtdOwp9CgojIGhvdyB0byBzZWxlY3QgaXRlbXMgaS5lLiB0aGUgc2xpY2Ug -b2YgZGF0YSB3ZSB3YW50IHRvIHZhbGlkYXRlL2V4cG9ydD8KIyAKc3ViIGl0ZW1zCnsKCW15KCAk -c2VsZiApID0gQF87CglpZiggJHNlbGYtPntwcm9jZXNzb3J9LT57YWN0aW9ufSBlcSAic2VhcmNo -IiB8fCAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntleHBvcnRfc2VhcmNofSApCiAgICAgICAJewoJCW15 -ICRyZXBvcnQgPSAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntyZXBvcnRfcGx1Z2lufTsJCgkJJHJlcG9y -dC0+YXBwbHlfZmlsdGVycyBpZiAkcmVwb3J0LT5jYW4oICdhcHBseV9maWx0ZXJzJyApOwoKCQlt -eSAkaXRlbXMgPSAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntzZWFyY2h9LT5wZXJmb3JtX3NlYXJjaDsK -CgkJaWYoIGRlZmluZWQgJHNlbGYtPntwcm9jZXNzb3J9LT57c29ydH0gKQoJCXsJCgkJCSRpdGVt -cyA9ICRpdGVtcy0+cmVvcmRlciggJHNlbGYtPntwcm9jZXNzb3J9LT57c29ydH0gKTsKCQl9CgkJ -cmV0dXJuICRpdGVtczsKCX0KCWVsc2lmKCBkZWZpbmVkICRzZWxmLT57cHJvY2Vzc29yfS0+e2Rh -dGFzZXR9ICkgCgl7CgkJbXkgJXNlYXJjaF9vcHRzID0gKCBmaWx0ZXJzID0+ICRzZWxmLT5maWx0 -ZXJzLCBzYXRpc2Z5X2FsbCA9PiAxICk7CgkJaWYoIGRlZmluZWQgJHNlbGYtPnBhcmFtKCAnY3Vz -dG9tX29yZGVyJyApICkKCQl7CgkJCSRzZWFyY2hfb3B0c3tjdXN0b21fb3JkZXJ9ID0gJHNlbGYt -PnBhcmFtKCAnY3VzdG9tX29yZGVyJyApOwoJCX0KCgkJaWYoIGRlZmluZWQgJHNlbGYtPntwcm9j -ZXNzb3J9LT57c29ydH0gKSAjYW4gb3JkZXJpbmcgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyIHNob3Vs -ZCB0cnVtcCB0aGUgcmVwb3J0cyBjdXN0b20gb3JkZXIKCQl7CgkJCSRzZWFyY2hfb3B0c3tjdXN0 -b21fb3JkZXJ9ID0gJHNlbGYtPntwcm9jZXNzb3J9LT57c29ydH07CgkJfQkKCQlyZXR1cm4gJHNl -bGYtPntwcm9jZXNzb3J9LT57ZGF0YXNldH0tPnNlYXJjaCggJXNlYXJjaF9vcHRzICk7Cgl9Cgkj -IHdlIGNhbid0IHJldHVybiBhbiBFUHJpbnRzOjpMaXN0IGlmIHtkYXRhc2V0fSBpcyBub3QgZGVm -aW5lZAoJcmV0dXJuIHVuZGVmOwp9CgojIGZyb20gUmVwb3J0cy9ST1MvSm91cm5hbHMucG0KIyBU -T0RPIE5vdGUgcXVpdGUgYSBsb3Qgb2YgcmVwbGljYXRpb24gYmV0d2VlbiB0aGlzIGFuZCBFeHBv -cnQ6OlJlcG9ydDo6Q1NWOjpvdXRwdXRfZGF0YW9iagpzdWIgdmFsaWRhdGVfZGF0YW9iagp7Cglt -eSggJHBsdWdpbiwgJGRhdGFvYmogKSA9IEBfOwoKCW15ICRyZXBvID0gJHBsdWdpbi0+cmVwb3Np -dG9yeTsKCglteSAkcmVwb3J0X2ZpZWxkcyA9ICRwbHVnaW4tPnJlcG9ydF9maWVsZHMoICRkYXRh -b2JqICk7CglteSAkdmFsX2ZpZWxkcyA9ICRwbHVnaW4tPnZhbGlkYXRlX2ZpZWxkcyggJGRhdGFv -YmogKTsKCgkjIHJlbGF0ZWQgb2JqZWN0cyBhbmQgdGhlaXIgZGF0YXNldHMKCW15ICRvYmplY3Rz -ID0gJHBsdWdpbi0+Z2V0X3JlbGF0ZWRfb2JqZWN0cyggJGRhdGFvYmogKTsKCW15ICR2YWxpZF9k -cyA9IHt9OwoJZm9yZWFjaCBteSAkZHNpZCAoIGtleXMgJSRvYmplY3RzICkKCXsKCQkkdmFsaWRf -ZHMtPnskZHNpZH0gPSAkcmVwby0+ZGF0YXNldCggJGRzaWQgKTsKCX0KCglteSBAcHJvYmxlbXM7 -CgoJZm9yZWFjaCBteSAkZmllbGQgKCBAeyAkcGx1Z2luLT5yZXBvcnRfZmllbGRzX29yZGVyKCAk -ZGF0YW9iaiApIHx8IFtdIH0gKQoJewoJCSMgdmFsaWRhdGlvbiBhY3Rpb24KCQlteSAkdl9maWVs -ZCA9ICR2YWxfZmllbGRzLT57JGZpZWxkfTsKCQluZXh0IHVubGVzcyBkZWZpbmVkICR2X2ZpZWxk -OyAjIG5vIHZhbGlkYXRpb24gcmVxdWlyZWQKCgkJIyBzaW1wbGUgY2FzZSAtIGNvZGUgaGFuZGxl -cyB2YWxpZGF0aW9uCgkJaWYoIHJlZiggJHZfZmllbGQgKSBlcSAnQ09ERScgKQoJCXsKCQkJIyBh -IHN1Ynt9IHdlIG5lZWQgdG8gcnVuCgkJCWV2YWwgewoJCQkJJiR2X2ZpZWxkKCAkcGx1Z2luLCAk -b2JqZWN0cywgXEBwcm9ibGVtcyApOwoJCQl9OwoJCQlpZiggJEAgKQoJCQl7CgkJCQkkcmVwby0+ -bG9nKCAiVmFsaWRhdGlvbiBSdW50aW1lIGVycm9yOiAkQCIgKTsKCQkJfQoJCQluZXh0OwoJCX0K -CQllbHNpZiggbGMgJHZfZmllbGQgbmUgInJlcXVpcmVkIiApCgkJewoJCQkkcmVwby0+bG9nKCAi -VmFsaWRhdGlvbiBSdW50aW1lIGVycm9yOiAkdl9maWVsZCBtdXN0IGJlIGNvZGUgcmVmIG9yICdy -ZXF1aXJlZCciICk7CgkJCW5leHQ7CgkJfQoKCQkjIGNoZWNrIHJlcXVpcmVkIHZhbHVlcwoKCQlt -eSAkdmFsdWU7ICMgdGhlIHZhbHVlIHRvIHZhbGlkYXRlCgkJbXkgJGVwX2ZpZWxkID0gJHJlcG9y -dF9maWVsZHMtPnskZmllbGR9OwoJCWlmKCByZWYoICRlcF9maWVsZCApIGVxICdDT0RFJyApCgkJ -ewoJCQkjIGEgc3Vie30gd2UgbmVlZCB0byBydW4KCQkJZXZhbCB7CgkJCQkkdmFsdWUgPSAmJGVw -X2ZpZWxkKCAkcGx1Z2luLCAkb2JqZWN0cyApOwoJCQl9OwoJCQlpZiggJEAgKQoJCQl7CgkJCQkk -cmVwby0+bG9nKCAiVmFsaWRhdGlvbiBSdW50aW1lIGVycm9yOiAkQCIgKTsKCQkJfQoJCX0KCQll -bHNpZiggJGVwX2ZpZWxkID1+IC9eKFthLXpfXSspXC4oWzAtOWEtel9dKykkLyApCgkJewoJCQkj -IGEgc3RyYWlnaHQgbWFwcGluZyB3aXRoIGFuIEVQcmludHMgZmllbGQKCQkJbXkoICRkc19pZCwg -JGVwX2ZpZWxkbmFtZSApID0gKCAkMSwgJDIgKTsKCQkJbXkgJGRzID0gJHZhbGlkX2RzLT57JGRz -X2lkfTsKCgkJCWlmKCBkZWZpbmVkICRkcyAmJiAkZHMtPmhhc19maWVsZCggJGVwX2ZpZWxkbmFt -ZSApICkKCQkJewoJCQkJJHZhbHVlID0gJG9iamVjdHMtPnskZHNfaWR9LT52YWx1ZSggJGVwX2Zp -ZWxkbmFtZSApOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJIyBkYXRhc2V0IG9yIGZpZWxkIGRvZXNu -J3QgZXhpc3QKCQkJCSRyZXBvLT5sb2coICJWYWxpZGF0aW9uIFJ1bnRpbWUgZXJyb3I6IGRhdGFz -ZXQgJGRzX2lkIG9yIGZpZWxkICRlcF9maWVsZG5hbWUgZG9lc24ndCBleGlzdCIgKTsKCQkJfQoJ -CX0KCgkJIyBpcyBmaWVsZCBzZXQ/CgkJaWYoICFFUHJpbnRzOjpVdGlsczo6aXNfc2V0KCAkdmFs -dWUgKSApCgkJewoJCQlwdXNoIEBwcm9ibGVtcywgIk1pc3NpbmcgcmVxdWlyZWQgZmllbGQgJGZp -ZWxkIjsKCQl9Cgl9CgoJcmV0dXJuIEBwcm9ibGVtczsKfQoKIyBUT0RPIE5vdGUgY29weSBvZiBF -eHBvcnQ6OlJlcG9ydDo6Z2V0X3JlbGF0ZWRfb2JqZWN0cwpzdWIgZ2V0X3JlbGF0ZWRfb2JqZWN0 -cwp7CglteSggJHBsdWdpbiwgJGRhdGFvYmogKSA9IEBfOwoKCW15ICRjbWQgPSBbICdyZXBvcnRz -JywgJHBsdWdpbi0+Z2V0X3JlcG9ydCwgJ2dldF9yZWxhdGVkX29iamVjdHMnIF07CiAgICAgICAg -aWYoICRwbHVnaW4tPnJlcG9zaXRvcnktPmNhbl9jYWxsKCBAJGNtZCApICkKICAgICAgICB7CgkJ -cmV0dXJuICRwbHVnaW4tPnJlcG9zaXRvcnktPmNhbGwoICRjbWQsICRwbHVnaW4tPnJlcG9zaXRv -cnksICRkYXRhb2JqICkgfHwge307CiAgICAgICAgfQoKCSMganVzdCBwYXNzIHRoZSBkYXRhb2Jq -IGl0c2VsZgoJcmV0dXJuIHsKCQkkZGF0YW9iai0+ZGF0YXNldC0+Y29uZmlkID0+ICRkYXRhb2Jq -LAoJfTsKfQoKIyBUT0RPIE5vdGUgY29weSBvZiBFeHBvcnQ6OlJlcG9ydDo6cmVwb3J0X2ZpZWxk -c19vcmRlcgpzdWIgcmVwb3J0X2ZpZWxkc19vcmRlcgp7CglteSggJHBsdWdpbiApID0gQF87CgoJ -cmV0dXJuICRwbHVnaW4tPntyZXBvcnRfZmllbGRzX29yZGVyfSBpZiggZGVmaW5lZCAkcGx1Z2lu -LT57cmVwb3J0X2ZpZWxkc19vcmRlcn0gKTsKCglteSAkcmVwb3J0ID0gJHBsdWdpbi0+Z2V0X3Jl -cG9ydCgpOwoJcmV0dXJuIFtdIHVubGVzcyggZGVmaW5lZCAkcmVwb3J0ICk7CgoJJHBsdWdpbi0+ -e3JlcG9ydF9maWVsZHNfb3JkZXJ9ID0gJHBsdWdpbi0+cmVwb3NpdG9yeS0+Y29uZmlnKCAncmVw -b3J0cycsICRyZXBvcnQsICdmaWVsZHMnICk7CgoJcmV0dXJuICRwbHVnaW4tPntyZXBvcnRfZmll -bGRzX29yZGVyfTsKfQoKIyBUT0RPIE5vdGUgY29weSBvZiBFeHBvcnQ6OlJlcG9ydDo6cmVwb3J0 -X2ZpZWxkcwpzdWIgcmVwb3J0X2ZpZWxkcwp7CglteSggJHBsdWdpbiApID0gQF87CgoJcmV0dXJu -ICRwbHVnaW4tPntyZXBvcnRfZmllbGRzfSBpZiggZGVmaW5lZCAkcGx1Z2luLT57cmVwb3J0X2Zp -ZWxkc30gKTsKCglteSAkcmVwb3J0ID0gJHBsdWdpbi0+Z2V0X3JlcG9ydCgpOwoJcmV0dXJuIFtd -IHVubGVzcyggZGVmaW5lZCAkcmVwb3J0ICk7CgoJJHBsdWdpbi0+e3JlcG9ydF9maWVsZHN9ID0g -JHBsdWdpbi0+cmVwb3NpdG9yeS0+Y29uZmlnKCAncmVwb3J0cycsICRyZXBvcnQsICdtYXBwaW5n -cycgKTsKCglyZXR1cm4gJHBsdWdpbi0+e3JlcG9ydF9maWVsZHN9Owp9CgpzdWIgdmFsaWRhdGVf -ZmllbGRzCnsKCW15KCAkcGx1Z2luICkgPSBAXzsKCglyZXR1cm4gJHBsdWdpbi0+e3ZhbGlkYXRl -X2ZpZWxkc30gaWYoIGRlZmluZWQgJHBsdWdpbi0+e3ZhbGlkYXRlX2ZpZWxkc30gKTsKCglteSAk -cmVwb3J0ID0gJHBsdWdpbi0+Z2V0X3JlcG9ydCgpOwoJcmV0dXJuIFtdIHVubGVzcyggZGVmaW5l -ZCAkcmVwb3J0ICk7CgoJJHBsdWdpbi0+e3ZhbGlkYXRlX2ZpZWxkc30gPSAkcGx1Z2luLT5yZXBv -c2l0b3J5LT5jb25maWcoICdyZXBvcnRzJywgJHJlcG9ydCwgJ3ZhbGlkYXRlJyApOwoKCXJldHVy -biAkcGx1Z2luLT57dmFsaWRhdGVfZmllbGRzfTsKfQoKIyMgcmVuZGVyaW5nCgojIFRoZSAic3Bs -YXNoIHBhZ2UiCnN1YiByZW5kZXJfc3BsYXNoX3BhZ2UKewoJbXkoICRzZWxmICkgPSBAXzsKCglt -eSAkcmVwbyA9ICRzZWxmLT5yZXBvc2l0b3J5OwoJbXkgQHBsdWdpbnMgPSAkc2VsZi0+cmVwb3J0 -X3BsdWdpbnM7CgoJaWYoICFzY2FsYXIoIEBwbHVnaW5zICkgKQoJewoJCXJldHVybiAkc2VsZi0+ -aHRtbF9waHJhc2UoICJub19yZXBvcnRzIiApOwoJfQoKCW15IEBsYWJlbHM7CglteSBAcGFuZWxz -OwoKCSNwcmVzZXQgcmVwb3J0cwoJcHVzaCBAbGFiZWxzLCAkcmVwby0+aHRtbF9waHJhc2UoICJy -ZXBvcnRzX3ByZXNldCIgKTsKCW15ICRwcmVzZXQgPSAkcmVwby0+bWFrZV9lbGVtZW50KCAiZGl2 -IiApOwoJbXkgJHByZXNldHNfYWRkZWQgPSAwOwoKCSMgdG9wIGNhdGVnb3J5OiBieSBjbGFzc25h -bWUgPiBSZXBvcnQ6OlJPUzo6U29tZVJlcG9ydDEsIFJlcG9ydDo6Uk9TOjpTb21lUmVwb3J0MgoK -CW15ICR1bCA9ICRzZWxmLT5yZXBvc2l0b3J5LT5tYWtlX2VsZW1lbnQoICd1bCcsIGNsYXNzID0+ -ICdlcF9yZXBvcnRfY2F0ZWdvcnknICk7CgoJIyBjYXQgfiBjYXRlZ29yeSAtICFtZWVvdwoJbXkg -JGNhdCA9ICIiOwoJbXkgJGNhdF9saSA9IHVuZGVmOyAKCW15ICRjYXRfdWwgPSB1bmRlZjsKCQoJ -I3ByZXBhcmUgaGFzaCBvZiByZXBvcnRpbmcgcGx1Z2lucwoJbXkgJXJlcG9ydF9oYXNoOwoJZm9y -ZWFjaCBteSAkcmVwb3J0X3BsdWdpbiAoIHNvcnQgeyAkYS0+Z2V0X3N1YnR5cGUgY21wICRiLT5n -ZXRfc3VidHlwZSB9IEBwbHVnaW5zICkKCXsKCQlteSAkcGx1Z2luX2NhdCA9ICRyZXBvcnRfcGx1 -Z2luLT5nZXRfc3VidHlwZTsKCQkkcGx1Z2luX2NhdCA9fiBzL15SZXBvcnQ6OihbXjpdKyk6Pzo/ -KC4qKSQvJDEvZzsJCgoJCWlmKCAkY2F0IG5lICRwbHVnaW5fY2F0ICkgI3dlIGhhdmUgYSB0b3At -Y2F0ZWdvcnkKCQl7CgkJCSRjYXQgPSAkcGx1Z2luX2NhdDsKCQkJJHJlcG9ydF9oYXNoeyRjYXR9 -ID0gW107CgkJfQoKCQlpZiggRVByaW50czo6VXRpbHM6OmlzX3NldCggJDIgKSApCgkJewoJCQlw -dXNoIEB7JHJlcG9ydF9oYXNoeyRjYXR9fSwgJHJlcG9ydF9wbHVnaW47CgkJfQoJfQoJCglmb3Ig -bXkgJHRvcF9jYXQoIHNvcnQga2V5cyAlcmVwb3J0X2hhc2ggKQoJewoJCW15IEByZXBvcnRfcGx1 -Z2lucyA9IEB7JHJlcG9ydF9oYXNoeyR0b3BfY2F0fX07CgkJaWYoIHNjYWxhciggQHJlcG9ydF9w -bHVnaW5zICkgPiAwICkKCQl7CgkJCSNyZW5kZXIgdG9wLWNhdGVnb3J5CgkJCSRjYXRfbGkgPSAk -dWwtPmFwcGVuZENoaWxkKCAkc2VsZi0+cmVwb3NpdG9yeS0+bWFrZV9lbGVtZW50KCAnbGknICkg -KTsKCQkJJGNhdF9saS0+YXBwZW5kQ2hpbGQoICRzZWxmLT5yZXBvc2l0b3J5LT5odG1sX3BocmFz -ZSggIlBsdWdpbi9TY3JlZW4vUmVwb3J0LyR0b3BfY2F0OnRpdGxlIiApICk7CgoJCQkkY2F0X3Vs -ID0gJGNhdF9saS0+YXBwZW5kQ2hpbGQoICRzZWxmLT5yZXBvc2l0b3J5LT5tYWtlX2VsZW1lbnQo -ICd1bCcsIGNsYXNzID0+ICdlcF9yZXBvcnRfaXRlbXMnICkgKTsKCgkJCWZvcmVhY2ggbXkgJHIg -KCBAcmVwb3J0X3BsdWdpbnMgKQoJCQl7CgkJCQlteSAkc3ViX2xpID0gJGNhdF91bC0+YXBwZW5k -Q2hpbGQoICRzZWxmLT5yZXBvc2l0b3J5LT5tYWtlX2VsZW1lbnQoICdsaScgKSApOwoJCQkJJHN1 -Yl9saS0+YXBwZW5kQ2hpbGQoICRyLT5yZW5kZXJfYWN0aW9uX2xpbmsgKTsKCQkJCSRwcmVzZXRz -X2FkZGVkKys7CgkJCX0KCQl9Cgl9CgoJJHByZXNldC0+YXBwZW5kQ2hpbGQoICR1bCApOwoJcHVz -aCBAcGFuZWxzLCAkcHJlc2V0OwoKCSNjdXN0b20gcmVwb3J0cwoJcHVzaCBAbGFiZWxzLCAkcmVw -by0+aHRtbF9waHJhc2UoICJyZXBvcnRzX2N1c3RvbSIgKTsKCglteSAkY3VzdG9tID0gJHJlcG8t -Pm1ha2VfZWxlbWVudCggImRpdiIsIGlkPT4iY3VzdG9tX3JlcG9ydCIgKTsKCW15ICRmb3JtID0g -JHJlcG8tPnJlbmRlcl9mb3JtKCAiZ2V0IiApOwoKCSNhZGQgZWFjaCByZXBvcnQgdG8gdGhlIHNl -bGVjdCBjb21wb25lbnQgYW5kIGdlbmVyYXRlIHNlYXJjaCBmb3JtIGlmIHJlcXVpcmVkCglteSAk -cmVwb3J0X3NlbGVjdCA9ICRyZXBvLT5tYWtlX2VsZW1lbnQoICJzZWxlY3QiLCBuYW1lPT4icmVw -b3J0IiwgaWQ9PiJzZWxlY3RfcmVwb3J0IiApOwoJbXkgJXNlYXJjaF9mb3JtczsKCW15ICRjdXN0 -b21fcmVwb3J0cyA9IDA7CgkjZm9yZWFjaCBteSAkcmVwb3J0X3BsdWdpbiAoIEBwbHVnaW5zICkK -CWZvcmVhY2ggbXkgJHJlcG9ydF9wbHVnaW4gKCBzb3J0IHsgJGEtPmdldF9zdWJ0eXBlIGNtcCAk -Yi0+Z2V0X3N1YnR5cGUgfSBAcGx1Z2lucyApCgl7CgkJaWYoICRyZXBvcnRfcGx1Z2luLT5wYXJh -bSggImN1c3RvbSIgKSApCgkJewkKCQkJJGN1c3RvbV9yZXBvcnRzKys7CgkJCW15ICRmb3JtaWQg -PSAkcmVwb3J0X3BsdWdpbi0+e3Njb25mfTsKCgkJCSNhZGQgdG8gc2VsZWN0IGNvbXBvbmVudAoJ -CQlteSAkaWQgPSAkcmVwb3J0X3BsdWdpbi0+e3JlcG9ydH07CgkJCW15ICRvcHRpb24gPSAkcmVw -by0+bWFrZV9lbGVtZW50KCAib3B0aW9uIiwgdmFsdWUgPT4gJHJlcG9ydF9wbHVnaW4tPmdldF9z -dWJ0eXBlLCBmb3JtID0+ICRmb3JtaWQgKTsKCQkJJG9wdGlvbi0+YXBwZW5kQ2hpbGQoICRyZXBv -cnRfcGx1Z2luLT5yZW5kZXJfdGl0bGUgKTsKCQkJJHJlcG9ydF9zZWxlY3QtPmFwcGVuZENoaWxk -KCAkb3B0aW9uICk7CgoJCQkjY3JlYXRlIHNlYXJjaCBmb3JtCgkJCQoJCQkjZ2V0IHJlcG9ydCBk -YXRhc2V0IGFuZCBhcHByb3ByaWF0ZSBzZWFyY2ggY29uZmlnCgkJCW15ICRyZXBvcnRfZHMgPSAk -cmVwby0+ZGF0YXNldCggJHJlcG9ydF9wbHVnaW4tPntzZWFyY2hkYXRhc2V0aWR9ICk7CgkJCW15 -ICRzY29uZiA9ICRyZXBvcnRfZHMtPnNlYXJjaF9jb25maWcoICRyZXBvcnRfcGx1Z2luLT57c2Nv -bmZ9ICkgOwoJCQkjbXkgJHNlYXJjaCA9IEVQcmludHM6OlNlYXJjaC0+bmV3KAoJCSAgICAgICAg -IyAgICAgICAga2VlcF9jYWNoZSA9PiAxLAoJICAgICAgICAgICAgICAgICMJc2Vzc2lvbiA9PiAk -cmVwbywKCQkgICAgICAgICMgICAgICAgIGRhdGFzZXQgPT4gJHJlcG9ydF9kcywKCQkgICAgICAg -ICMgICAgICAgICV7JHNjb25mfQoJCQkjKTsKCgkJCW15ICRmb3JtYXQgPSAicmVwb3J0LyIgLiAk -cmVwb3J0X2RzLT5iYXNlX2lkOwoJICAgICAgICAgICAgICAgIG15ICRzZWFyY2hleHAgPSAkcmVw -by0+cGx1Z2luKCAiU2VhcmNoIiApLT5wbHVnaW5zKAogICAgICAgICAgICAgICAgICAgICAgICAJ -ewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAlrZWVwX2NhY2hlID0+IDEsCgkgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24gPT4gJHNlbGYtPntzZXNzaW9ufSwK -ICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgICAgZGF0YXNldCA9PiAkcmVwb3J0X2RzLAog -ICAgICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAleyRzY29uZn0KICAgICAgICAgICAgICAg -ICAgICAgICAgCX0sCiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPT4gIlNlYXJjaCIsCiAg -ICAgICAgICAgICAgICAgICAgICAgIGNhbl9zZWFyY2ggPT4gJGZvcm1hdCwKICAgICAgICAgICAg -ICAgIAkpOwkKCQkJJHNlYXJjaGV4cC0+ZnJvbV9mb3JtOwoKCQkJI2dlbmVyYXRlIHRoZSBmb3Jt -CgkJCW15ICRmcmFnID0gJHNlbGYtPnJlbmRlcl9zZWFyY2hfZmllbGRzKCAkc2VhcmNoZXhwICk7 -CgkJCSRzZWFyY2hfZm9ybXN7JGZvcm1pZH0gPSAkZnJhZyB1bmxlc3MgZXhpc3RzICRzZWFyY2hf -Zm9ybXN7JGZvcm1pZH07CgkJfQkKCX0KCSRmb3JtLT5hcHBlbmRDaGlsZCggJHJlcG9ydF9zZWxl -Y3QgKTsKCSRmb3JtLT5hcHBlbmRDaGlsZCggJHJlcG8tPnJlbmRlcl9oaWRkZW5fZmllbGQoICJz -Y3JlZW4iLCAkc2VsZi0+e3NjcmVlbmlkfSApICk7CgoJI3JlbmRlciBwb3NzaWJsZSBzZWFyY2gg -Zm9ybXMKCWZvcmVhY2ggbXkgJGZvcm1pZCAoa2V5cyAlc2VhcmNoX2Zvcm1zKQoJewoJCW15ICR0 -YWJsZSA9ICRyZXBvLT5tYWtlX2VsZW1lbnQoICJ0YWJsZSIsIGNsYXNzPT4iZXBfc2VhcmNoX2Zp -ZWxkcyIsIGlkPT4kZm9ybWlkLCBzdHlsZT0+ImRpc3BsYXk6IG5vbmUiICk7CgkgICAgICAgICRm -b3JtLT5hcHBlbmRDaGlsZCggJHRhYmxlICk7CgkgICAgICAgICR0YWJsZS0+YXBwZW5kQ2hpbGQo -ICRzZWFyY2hfZm9ybXN7JGZvcm1pZH0gKTsKCX0KCgkkZm9ybS0+YXBwZW5kQ2hpbGQoICRzZWxm -LT5yZW5kZXJfY29udHJvbHMgKTsKCSRjdXN0b20tPmFwcGVuZENoaWxkKCAkZm9ybSApOwoKCSNq -YXZhc2NyaXB0IGZvciBjaGFuZ2luZyBmb3JtcyBiYXNlZCBvbiByZXBvcnQgc2VsZWN0aW9uCgkk -Y3VzdG9tLT5hcHBlbmRDaGlsZCggJHJlcG8tPm1ha2VfamF2YXNjcmlwdCggJ2luaXRSZXBvcnRG -b3JtKCk7JyApICk7CgoJaWYoICRjdXN0b21fcmVwb3J0cyAmJiAkcHJlc2V0c19hZGRlZCA+IDAg -KSAjc2V0IHVwIHRhYiBpbnRlcmZhY2UKCXsKCQlteSBAbGFiZWxzOwoJICAgICAgICBteSBAcGFu -ZWxzOwoKCQlwdXNoIEBsYWJlbHMsICRyZXBvLT5odG1sX3BocmFzZSggInJlcG9ydHNfcHJlc2V0 -IiApOwoJCXB1c2ggQGxhYmVscywgJHJlcG8tPmh0bWxfcGhyYXNlKCAicmVwb3J0c19jdXN0b20i -ICk7CgoJCXB1c2ggQHBhbmVscywgJHByZXNldDsKCQlwdXNoIEBwYW5lbHMsICRjdXN0b207CgoJ -CXJldHVybiAkcmVwby0+eGh0bWwtPnRhYnMoXEBsYWJlbHMsIFxAcGFuZWxzICk7Cgl9CgllbHNp -ZiggJHByZXNldHNfYWRkZWQgPiAwICkKCXsJCgkJcmV0dXJuICRwcmVzZXQ7Cgl9CgllbHNlCgl7 -CgkJcmV0dXJuICRjdXN0b207Cgl9Cn0KCnN1YiByZW5kZXJfc2VhcmNoX2ZpZWxkcwp7CiAgICAg -ICAgbXkoICRzZWxmLCAkc2VhcmNoICkgPSBAXzsKCiAgICAgICAgbXkgJGZyYWcgPSAkc2VsZi0+ -e3Nlc3Npb259LT5tYWtlX2RvY19mcmFnbWVudDsKICAgICAgICBmb3JlYWNoIG15ICRzZiAoICRz -ZWFyY2gtPmdldF9ub25fZmlsdGVyX3NlYXJjaGZpZWxkcyApCiAgICAgICAgewoJICAgICAgICAg -JGZyYWctPmFwcGVuZENoaWxkKAogICAgICAgICAgICAgICAgICAgICAgICAkc2VsZi0+e3Nlc3Np -b259LT5yZW5kZXJfcm93X3dpdGhfaGVscCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICBoZWxwX3ByZWZpeCA9PiAkc2YtPmdldF9mb3JtX3ByZWZpeC4iX2hlbHAiLAogICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgIGhlbHAgPT4gJHNmLT5yZW5kZXJfaGVscCwKICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9PiAkc2YtPnJlbmRlcl9uYW1lLAogICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkID0+ICRzZi0+cmVuZGVyLAogICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgIG5vX3RvZ2dsZSA9PiAoICRzZi0+e3Nob3dfaGVscH0gZXEg -ImFsd2F5cyIgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub19oZWxwID0+ICgg -JHNmLT57c2hvd19oZWxwfSBlcSAibmV2ZXIiICksCiAgICAgICAgCSkgKTsKICAgICAgICB9Cgog -ICAgICAgIHJldHVybiAkZnJhZzsKfQoKc3ViIHJlbmRlcl9jb250cm9scwp7CglteSggJHNlbGYg -KSA9IEBfOwoKCW15ICRkaXYgPSAkc2VsZi0+e3Nlc3Npb259LT5tYWtlX2VsZW1lbnQoCiAgICAg -ICAgICAgICAgICAiZGl2IiAsCiAgICAgICAgICAgICAgICBjbGFzcyA9PiAiZXBfc2VhcmNoX2J1 -dHRvbnMiICk7CiAgICAgICAgJGRpdi0+YXBwZW5kQ2hpbGQoICRzZWxmLT57c2Vzc2lvbn0tPnJl -bmRlcl9hY3Rpb25fYnV0dG9ucygKICAgICAgICAgICAgICAgIF9vcmRlciA9PiBbICJzZWFyY2gi -LCAibmV3c2VhcmNoIiBdLAogICAgICAgICAgICAgICAgbmV3c2VhcmNoID0+ICRzZWxmLT57c2Vz -c2lvbn0tPnBocmFzZSggImxpYi9zZWFyY2hleHByZXNzaW9uOmFjdGlvbl9yZXNldCIgKSwKICAg -ICAgICAgICAgICAgIHNlYXJjaCA9PiAkc2VsZi0+e3Nlc3Npb259LT5waHJhc2UoICJsaWIvc2Vh -cmNoZXhwcmVzc2lvbjphY3Rpb25fc2VhcmNoIiApICkKICAgICAgICApOwoKCXJldHVybiAkZGl2 -Owp9CgpzdWIgcmVuZGVyCnsKCW15KCAkc2VsZiApID0gQF87CgoJIyBpZiB1c2VycyBhY2Nlc3Mg -U2NyZWVuOjpSZXBvcnQgZGlyZWN0bHkgd2Ugd2FudCB0byBkaXNwbGF5IHNvbWUgc29ydCBvZiBt -ZW51CgkjIHdoZXJlIHVzZXJzIGNhbiBzZWxlY3Qgdmlld2FibGUgcmVwb3J0cwoJaWYoICJFUHJp -bnRzOjpQbHVnaW46OiIuJHNlbGYtPmdldF9pZCBlcSBfX1BBQ0tBR0VfXyAmJiAkc2VsZi0+e3By -b2Nlc3Nvcn0tPnthY3Rpb259IG5lICJzZWFyY2giICkKCXsJCgkJcmV0dXJuICRzZWxmLT5yZW5k -ZXJfc3BsYXNoX3BhZ2U7Cgl9CgoJbXkgJHJlcG8gPSAkc2VsZi0+cmVwb3NpdG9yeTsKCglteSAk -Y2h1bmsgPSAkcmVwby0+bWFrZV9kb2NfZnJhZ21lbnQ7CgoJJGNodW5rLT5hcHBlbmRDaGlsZCgg -JHNlbGYtPnJlbmRlcl9leHBvcnRfYmFyICk7CgkkY2h1bmstPmFwcGVuZENoaWxkKCAkc2VsZi0+ -cmVuZGVyX2dyb3VwX29wdGlvbnMgKTsKCSRjaHVuay0+YXBwZW5kQ2hpbGQoICRzZWxmLT5yZW5k -ZXJfc29ydF9vcHRpb25zICk7CgoJbXkgJGl0ZW1zID0gJHNlbGYtPml0ZW1zOwoJaWYoICFkZWZp -bmVkICRpdGVtcyB8fCAkaXRlbXMtPmNvdW50ID09IDAgKQoJewoJCSMgTm8gaXRlbXMgbWVzc2Fn -ZQoJfQoKCW15ICRqc29uOwoKCWlmKCBkZWZpbmVkICRzZWxmLT57cHJvY2Vzc29yfS0+e2dyb3Vw -fSAmJiAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntncm91cH0gbmUgIiIgKQoJewoJCW15ICRncm91cGVk -ID0gJHNlbGYtPmdldF9ncm91cGVkX2l0ZW1zKCAkaXRlbXMsIDEgKTsKCQkkanNvbiA9IGVuY29k -ZV9qc29uICRncm91cGVkOwoJfQoJZWxzZQoJewoJCW15ICRpdGVtX2lkcyA9IGRlZmluZWQgJGl0 -ZW1zID8gJGl0ZW1zLT5pZHMgOiBbXTsKCQkkanNvbiA9ICJbIi5qb2luKCcsJyxAJGl0ZW1faWRz -KS4iXSI7Cgl9CgogICAgICAgIG15ICR1cmwgPSAkcmVwby0+Y3VycmVudF91cmwoIGhvc3QgPT4g -MSApOwogICAgICAgIG15ICRwYXJhbWV0ZXJzID0gVVJJLT5uZXc7CiAgICAgICAgJHBhcmFtZXRl -cnMtPnF1ZXJ5X2Zvcm0oCiAgICAgICAgICAgICAgICAkc2VsZi0+aGlkZGVuX2JpdHMsCiAgICAg -ICAgKTsKICAgICAgICAkcGFyYW1ldGVycyA9ICRwYXJhbWV0ZXJzLT5xdWVyeTsKCQkKCW15ICRk -cyA9ICRyZXBvLT5kYXRhc2V0KCAkc2VsZi0+cGFyYW0oICdkYXRhc2V0aWQnICkgKSBpZiBkZWZp -bmVkICRzZWxmLT5wYXJhbSggJ2RhdGFzZXRpZCcgKTsKCW15ICRwcmVmaXggPSAkZHMtPmJhc2Vf -aWQgaWYgZGVmaW5lZCAkZHM7CgoJIyB0aGUgbWFpbiA8ZGl2PgoJbXkgJGNvbnRhaW5lcl9pZCA9 -IHNwcmludGYoICJlcF9yZXBvcnRfJXNcX2NvbnRhaW5lciIsICRzZWxmLT5nZXRfcmVwb3J0ICk7 -CgoJI3VwZGF0ZSBqYXZhc2NyaXB0IHBhcmFtZXRlcnMgaWYgY29taW5nIGZyb20gYSBzZWFyY2gg -cmVxdWVzdAoJaWYoICRzZWxmLT57cHJvY2Vzc29yfS0+e2FjdGlvbn0gZXEgInNlYXJjaCIgKQoJ -ewoJCW15ICRwbHVnaW4gPSAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntyZXBvcnR9OwoJCSRwbHVnaW4g -PX4gcy86LyUzQS9nOwoJCSRwYXJhbWV0ZXJzID0gInNjcmVlbj0kcGx1Z2luIjsKCQkkcHJlZml4 -ID0gJHNlbGYtPntwcm9jZXNzb3J9LT57ZGF0YXNldGlkfTsKCQkkY29udGFpbmVyX2lkID0gc3By -aW50ZiggImVwX3JlcG9ydF8lc1xfY29udGFpbmVyIiwgJHNlbGYtPntwcm9jZXNzb3J9LT57cmVw -b3J0X3BsdWdpbn0tPntyZXBvcnR9ICk7Cgl9CgkKCSNzaG93L2hpZGUgY29tcGxpYW5jZQoJbXkg -JHNob3dfY29tcGxpYW5jZSA9IDE7Cgkkc2hvd19jb21wbGlhbmNlID0gJHNlbGYtPntzaG93X2Nv -bXBsaWFuY2V9IGlmIGRlZmluZWQgJHNlbGYtPntzaG93X2NvbXBsaWFuY2V9OwoKCSNjdXN0b20g -bGFiZWxzCglteSAkbGFiZWxzID0gMDsKCSRsYWJlbHMgPSBlbmNvZGVfanNvbiAkc2VsZi0+e2xh -YmVsc30gaWYgZGVmaW5lZCAkc2VsZi0+e2xhYmVsc307CgoJJGNodW5rLT5hcHBlbmRDaGlsZCgg -JHJlcG8tPm1ha2VfamF2YXNjcmlwdCggPDwiRU9KIiApICk7CmRvY3VtZW50Lm9ic2VydmUoImRv -bTpsb2FkZWQiLCBmdW5jdGlvbigpIHsKCW5ldyBFUHJpbnRzX1NjcmVlbl9SZXBvcnRfTG9hZGVy -KCB7CgkJaWRzOiAkanNvbiwKCQlzdGVwOiAyMCwKCQlwcmVmaXg6ICckcHJlZml4JywKCQl1cmw6 -ICckdXJsJywKCQlwYXJhbWV0ZXJzOiAnJHBhcmFtZXRlcnMnLAkJCgkJY29udGFpbmVyX2lkOiAn -JGNvbnRhaW5lcl9pZCcsCgkJc2hvd19jb21wbGlhbmNlOiAkc2hvd19jb21wbGlhbmNlLAoJCWxh -YmVsczogJGxhYmVscwoJfSApLmV4ZWN1dGUoKTsKCn0pOwpFT0oKCSRjaHVuay0+YXBwZW5kQ2hp -bGQoICRyZXBvLT5tYWtlX2VsZW1lbnQoICdkaXYnLCBjbGFzcyA9PiAnZXBfcmVwb3J0X3BhZ2Un -LCBpZCA9PiAkY29udGFpbmVyX2lkICkgKTsKCglyZXR1cm4gJGNodW5rOwp9CgoKc3ViIHJlbmRl -cl9leHBvcnRfYmFyCnsKCW15KCAkc2VsZiApID0gQF87CgoJbXkgJHJlcG8gPSAkc2VsZi0+cmVw -b3NpdG9yeTsKCglteSAkY2h1bmsgPSAkcmVwby0+bWFrZV9kb2NfZnJhZ21lbnQ7CgoJbXkgQHBs -dWdpbnMgPSAkc2VsZi0+ZXhwb3J0X3BsdWdpbnM7CglyZXR1cm4gJGNodW5rIHVubGVzcyggc2Nh -bGFyKCBAcGx1Z2lucyApIHx8IGRlZmluZWQoICRyZXBvLT5jb25maWcoICRzZWxmLT57ZXhwb3J0 -X2NvbmZ9LCAiZXhwb3J0ZmllbGRzIiApICkgKTsKCglteSAkcmVwb3J0X2RzID0gJHJlcG8tPmRh -dGFzZXQoICRzZWxmLT57ZGF0YXNldGlkfSApOwoJbXkgJGZvcm0gPSAkc2VsZi0+cmVuZGVyX2Zv -cm07CgkkZm9ybS0+c2V0QXR0cmlidXRlKCBtZXRob2QgPT4gImdldCIgKTsKCglpZiggZGVmaW5l -ZCAkc2VsZi0+cmVwb3NpdG9yeS0+cGFyYW0oICJzZWFyY2giICkgfHwgJHNlbGYtPntwcm9jZXNz -b3J9LT57YWN0aW9ufSBlcSAic2VhcmNoIiApCgl7CgkJJGZvcm0tPmFwcGVuZENoaWxkKCAkcmVw -by0+cmVuZGVyX2hpZGRlbl9maWVsZCggInNlYXJjaCIsICAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntz -ZWFyY2h9LT5zZXJpYWxpc2UpICk7Cgl9CgkJCglpZiggZGVmaW5lZCAkc2VsZi0+e3Byb2Nlc3Nv -cn0tPntzb3J0fSApCgl7CgkJJGZvcm0tPmFwcGVuZENoaWxkKCAkcmVwby0+cmVuZGVyX2hpZGRl -bl9maWVsZCggInNvcnQiLCAgJHNlbGYtPntwcm9jZXNzb3J9LT57c29ydH0gKSApOwoJfQkKCglp -ZiggZGVmaW5lZCAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntncm91cF9leHB9ICkKCXsKCQkkZm9ybS0+ -YXBwZW5kQ2hpbGQoICRyZXBvLT5yZW5kZXJfaGlkZGVuX2ZpZWxkKCAiZ3JvdXAiLCAgJHNlbGYt -Pntwcm9jZXNzb3J9LT57Z3JvdXBfZXhwfSApICk7Cgl9CQoKCWlmKCAhZGVmaW5lZCggJHJlcG8t -PmNvbmZpZyggJHNlbGYtPntleHBvcnRfY29uZn0sICJleHBvcnRmaWVsZHMiICkgKSApCgl7CgkJ -I25vIGN1c3RvbSBleHBvcnQgZmllbGRzIGRlZmluZWQsIHVzZSBleHBvcnQgcGx1Z2lucyBkZXNp -Z25lZCBmb3IgdGhpcyByZXBvcnQKCQlteSAkc2VsZWN0ID0gJGZvcm0tPmFwcGVuZENoaWxkKCAk -cmVwby0+cmVuZGVyX29wdGlvbl9saXN0KAoJCQluYW1lID0+ICdleHBvcnQnLAoJCQl2YWx1ZXMg -PT4gW21hcCB7ICRfLT5nZXRfc3VidHlwZSB9IEBwbHVnaW5zXSwKCQkJbGFiZWxzID0+IHttYXAg -eyAkXy0+Z2V0X3N1YnR5cGUgPT4gJF8tPmdldF9uYW1lIH0gQHBsdWdpbnN9LAoJCSkgKTsKCX0K -CWVsc2UKCXsKCQkjcHJvdmlkZSBsaXN0IG9mIGRlZmF1bHQgZXhwb3J0IHBsdWdpbnMgZm9yIHJl -cG9ydHMKCQlAcGx1Z2lucyA9ICRzZWxmLT5leHBvcnRfcGx1Z2lucyggImdlbmVyaWMiICk7CgkJ -bXkgJHNlbGVjdCA9ICRmb3JtLT5hcHBlbmRDaGlsZCggJHJlcG8tPnJlbmRlcl9vcHRpb25fbGlz -dCgKCQkJbmFtZSA9PiAnZXhwb3J0JywKCQkJdmFsdWVzID0+IFttYXAgeyAkXy0+Z2V0X3N1YnR5 -cGUgfSBAcGx1Z2luc10sCgkJCWxhYmVscyA9PiB7bWFwIHsgJF8tPmdldF9zdWJ0eXBlID0+ICRf -LT5nZXRfbmFtZSB9IEBwbHVnaW5zfSwKCQkpICk7CgoKCQkjY3JlYXRlIGxhYmVscyBhbmQgcGFu -ZWxzIGZvciB0YWJiZWQgaW50ZXJmYWNlZAoJCW15ICR4bWwgPSAkcmVwby0+eG1sOwoJCW15ICR4 -aHRtbCA9ICRyZXBvLT54aHRtbDsKCgkJI2FsbG93IHVzZXIgdG8gY2hvb3NlIHdoaWNoIGZpZWxk -cyB0aGV5IHdhbnQgdG8gZXhwb3J0CgkJbXkgJGV4cG9ydF9vcHRpb25zID0gJHJlcG8tPm1ha2Vf -ZWxlbWVudCggImRpdiIgKTsKCgkJZm9yZWFjaCBteSAka2V5ICgga2V5cyAleyRyZXBvLT5jb25m -aWcoICRzZWxmLT57ZXhwb3J0X2NvbmZ9LCAiZXhwb3J0ZmllbGRzIiApfSApCgkJewoJCQkjY3Jl -YXRlIGEgbmV3IGxpc3QJCQkKCQkJbXkgJHVsID0gJHJlcG8tPm1ha2VfZWxlbWVudCggInVsIiwK -CSAgICAgICAgICAgICAgICAJc3R5bGUgPT4gImxpc3Qtc3R5bGUtdHlwZTogbm9uZSIKCSAgICAg -ICAgCSk7CgkJCQoJCQlteSAkY291bnQgPSAwOyAjY291bnQgaG93IG1hbnkgZmllbGRzIHdlIGFk -ZAoJCQlmb3JlYWNoIG15ICRmaWVsZG5hbWUoIEB7JHJlcG8tPmNvbmZpZyggJHNlbGYtPntleHBv -cnRfY29uZn0sICJleHBvcnRmaWVsZHMiICktPnska2V5fX0gKQoJCQl7CgkJCQlpZiggZGVmaW5l -ZCAkcmVwby0+Y29uZmlnKCAkc2VsZi0+e2V4cG9ydF9jb25mfSwgImN1c3RvbV9leHBvcnQiICkg -JiYgZXhpc3RzICR7JHJlcG8tPmNvbmZpZyggJHNlbGYtPntleHBvcnRfY29uZn0sICJjdXN0b21f -ZXhwb3J0IiApfXskZmllbGRuYW1lfSApICN3ZSBoYXZlIGEgY3VzdG9tIGV4cG9ydCBmdW5jdGlv -biBpbnN0ZWFkIAoJCQkJewoJCQkJCSRjb3VudCsrOwoJCQkJCSRzZWxmLT5fZXhwb3J0X2ZpZWxk -X2NoZWNrYm94KCAkcmVwbywgJGZpZWxkbmFtZSwgJHVsLCAkcmVwby0+aHRtbF9waHJhc2UoICJl -eHBvcnRmaWVsZG9wdGlvbnM6JGZpZWxkbmFtZSIgKSApOyAKCQkJCX0KCQkJCWVsc2lmKCBkZWZp -bmVkIEVQcmludHM6OlV0aWxzOjpmaWVsZF9mcm9tX2NvbmZpZ19zdHJpbmcoICRyZXBvcnRfZHMs -ICRmaWVsZG5hbWUgKSApCgkJCQl7CgkJCQkJbXkgJGZpZWxkID0gRVByaW50czo6VXRpbHM6OmZp -ZWxkX2Zyb21fY29uZmlnX3N0cmluZyggJHJlcG9ydF9kcywgJGZpZWxkbmFtZSApOwoJCQkJCSRj -b3VudCsrOwogICAgICAgCQkJICAgICAgICAJJHNlbGYtPl9leHBvcnRfZmllbGRfY2hlY2tib3go -ICRyZXBvLCAkZmllbGRuYW1lLCAkdWwsICRmaWVsZC0+cmVuZGVyX25hbWUgKTsKCgkJCQl9CgkJ -CX0KCQkJaWYoICRjb3VudCApICNvbmx5IGFkZCBvcHRpb25zIGlmIHdlIGhhdmUgYW55IGZpZWxk -cyB0byBzaG93CgkJCXsKCQkJCW15ICRkaXYgPSAkcmVwby0+bWFrZV9lbGVtZW50KCAiZGl2Iiwg -Y2xhc3M9PiJyZXBvcnRfZXhwb3J0X29wdGlvbnMiICk7CgkJCQkkZGl2LT5hcHBlbmRDaGlsZCgg -bXkgJGggPSAkcmVwby0+bWFrZV9lbGVtZW50KCAiaDQiICkgKTsKCQkJCSRoLT5hcHBlbmRDaGls -ZCggJHJlcG8tPmh0bWxfcGhyYXNlKCAiZXhwb3J0ZmllbGRzOiRrZXkiICkgKTsJCgkJCQkkZGl2 -LT5hcHBlbmRDaGlsZCggJHVsICk7CgkJCQkkZXhwb3J0X29wdGlvbnMtPmFwcGVuZENoaWxkKCAk -ZGl2ICk7CgkJCX0KICAgICAgIAkJfQoJCSRmb3JtLT5hcHBlbmRDaGlsZCggJGV4cG9ydF9vcHRp -b25zICk7Cgl9CgoJJGZvcm0tPmFwcGVuZENoaWxkKCAKCQkkcmVwby0+cmVuZGVyX2J1dHRvbigK -CQkJbmFtZSA9PiAiX2FjdGlvbl9leHBvcnQiLAoJCQljbGFzcyA9PiAiZXBfZm9ybV9hY3Rpb25f -YnV0dG9uIiwKCQkJdmFsdWUgPT4gJHJlcG8tPnBocmFzZSggJ2NnaS91c2Vycy9lZGl0X2Vwcmlu -dDpleHBvcnQnICkKCSkgKTsKCgkjY3JlYXRlIGEgY29sbGFwc2libGUgYm94CglteSAkaW1hZ2Vz -dXJsID0gJHJlcG8tPmN1cnJlbnRfdXJsKCBwYXRoID0+ICJzdGF0aWMiLCAic3R5bGUvaW1hZ2Vz -IiApOwoJbXkgJW9wdGlvbnM7Cgkkb3B0aW9uc3tzZXNzaW9ufSA9ICRyZXBvOwogICAgICAgICRv -cHRpb25ze2lkfSA9ICJlcF9yZXBvcnRfZXhwb3J0IjsKICAgICAgICAkb3B0aW9uc3t0aXRsZX0g -PSAkcmVwby0+aHRtbF9waHJhc2UoICJleHBvcnRfdGl0bGUiICk7CiAgICAgICAgJG9wdGlvbnN7 -Y29sbGFwc2VkfSA9IDE7Cgkkb3B0aW9uc3tjb250ZW50fSA9ICRmb3JtOwogICAgICAgICRvcHRp -b25ze3Nob3dfaWNvbl91cmx9ID0gIiRpbWFnZXN1cmwvbXVsdGlfZG93bi5wbmciOwoJJG9wdGlv -bnN7aGlkZV9pY29uX3VybH0gPSAiJGltYWdlc3VybC9tdWx0aV91cC5wbmciOwoKCW15ICRib3gg -PSAkcmVwby0+bWFrZV9lbGVtZW50KCAiZGl2Iiwgc3R5bGU9PiJ0ZXh0LWFsaWduOiBsZWZ0IiAp -OwoJJGJveC0+YXBwZW5kQ2hpbGQoIEVQcmludHM6OkJveDo6cmVuZGVyKCAlb3B0aW9ucyApICk7 -CgkkY2h1bmstPmFwcGVuZENoaWxkKCAkYm94ICk7CgoJcmV0dXJuICRjaHVuazsKfQoKc3ViIHJl -bmRlcl9zb3J0X29wdGlvbnMKewoJbXkoICRzZWxmICkgPSBAXzsKCglteSAkcmVwbyA9ICRzZWxm -LT5yZXBvc2l0b3J5OwoKCW15ICRjaHVuayA9ICRyZXBvLT5tYWtlX2RvY19mcmFnbWVudDsKCgly -ZXR1cm4gJGNodW5rIHVubGVzcyggZGVmaW5lZCggJHJlcG8tPmNvbmZpZyggJHNlbGYtPntzb3J0 -X2NvbmZ9LCAic29ydGZpZWxkcyIgKSApICk7CgoJbXkgJHNvcnRfY29uZiA9ICRyZXBvLT5jb25m -aWcoICRzZWxmLT57c29ydF9jb25mfSwgInNvcnRmaWVsZHMiICk7CgoJI2J1aWxkIHRoZSBmb3Jt -CglteSAkZm9ybSA9ICRzZWxmLT5yZW5kZXJfZm9ybTsKCSRmb3JtLT5zZXRBdHRyaWJ1dGUoIG5h -bWUgPT4gInNvcnRfcmVwb3J0IiApOwogICAgICAgICRmb3JtLT5zZXRBdHRyaWJ1dGUoIG1ldGhv -ZCA9PiAiZ2V0IiApOwoJJGNodW5rLT5hcHBlbmRDaGlsZCggJGZvcm0gKTsKCQoJaWYoIGRlZmlu -ZWQgJHJlcG8tPnBhcmFtKCAic2VhcmNoIiApIHx8ICRzZWxmLT57cHJvY2Vzc29yfS0+e2FjdGlv -bn0gZXEgInNlYXJjaCIgKQoJewoJCSRmb3JtLT5hcHBlbmRDaGlsZCggJHJlcG8tPnJlbmRlcl9o -aWRkZW5fZmllbGQoICJzZWFyY2giLCAgJHNlbGYtPntwcm9jZXNzb3J9LT57c2VhcmNofS0+c2Vy -aWFsaXNlKSApOwoJfQoKCWlmKCBkZWZpbmVkICRzZWxmLT57cHJvY2Vzc29yfS0+e2dyb3VwX2V4 -cH0gKQoJewoJCSRmb3JtLT5hcHBlbmRDaGlsZCggJHJlcG8tPnJlbmRlcl9oaWRkZW5fZmllbGQo -ICJncm91cCIsICAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntncm91cF9leHB9ICkgKTsKCX0KCgkjZGlz -cGxheSB0aGUgbGlua3MgdGhhdCB3aWxsIHRyaWdnZXIgdGhlIGZvcm0KCW15ICRmaXJzdCA9IDE7 -CglteSAkc29ydF9saW5rcyA9ICRyZXBvLT5tYWtlX2RvY19mcmFnbWVudDsKCWZvcmVhY2ggbXkg -JHNvcnRfbmFtZSAoIGtleXMgJXskc29ydF9jb25mfSApCiAgICAgICAgewoJCW15ICRzb3J0X3Zh -bHVlID0gJHNvcnRfY29uZi0+eyRzb3J0X25hbWV9OwoJCWlmKCAkZmlyc3QgKQoJCXsKCQkJJGZv -cm0tPmFwcGVuZENoaWxkKCAkcmVwby0+cmVuZGVyX2hpZGRlbl9maWVsZCggInNvcnQiLCAkc29y -dF92YWx1ZSkgKTsKCQl9CgoJCWlmKCAhJGZpcnN0ICkKICAgICAgICAgICAgICAgIHsKICAgICAg -ICAgICAgICAgIAkkc29ydF9saW5rcy0+YXBwZW5kQ2hpbGQoICRyZXBvLT5odG1sX3BocmFzZSgg +QHskc2VsZi0+e2FjdGlvbnN9fSwgcXcoIGV4cG9ydCBzZWFyY2ggbmV3c2VhcmNoIHVwZGF0ZSAp +OwoKCSRzZWxmLT57c2NvbmZ9ID0gInJlcG9ydCI7CgogICAgICAgICRzZWxmLT57YXBwZWFyc30g +PSBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlID0+ICJr +ZXlfdG9vbHMiLAogICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9PiAxMDAwLAogICAg +ICAgICAgICAgICAgfSwKICAgICAgICBdOwoKCXJldHVybiAkc2VsZjsKfQoKc3ViIGdldF9yZXBv +cnQgeyBzaGlmdC0+e3JlcG9ydH0gfQoKc3ViIGNhbl9iZV92aWV3ZWQKewogICAgICAgIG15KCAk +c2VsZiApID0gQF87CgoJcmV0dXJuIDEgaWYoICRzZWxmLT57cHVibGljfSApOyAjYWxsb3cgYSBy +ZXBvcnQgdG8gYmUgcHVibGljbHkgYXZhaWxhYmxlCgoJcmV0dXJuIDAgaWYoICFkZWZpbmVkICRz +ZWxmLT57cmVwb3NpdG9yeX0tPmN1cnJlbnRfdXNlciApOwoJCglyZXR1cm4gJHNlbGYtPmFsbG93 +KCAncmVwb3J0JyApOwp9CgpzdWIgYWxsb3dfZXhwb3J0IHsgc2hpZnQtPmNhbl9iZV92aWV3ZWQg +fQpzdWIgYWN0aW9uX2V4cG9ydCB7fQoKc3ViIHdpc2hlc190b19leHBvcnQgewoJJF9bMF0tPnJl +cG9zaXRvcnktPnBhcmFtKCAnZXhwb3J0JyApIHx8CgkkX1swXS0+cmVwb3NpdG9yeS0+cGFyYW0o +ICdhamF4JyApOwp9CgpzdWIgZXhwb3J0X21pbWV0eXBlCnsKCW15KCAkc2VsZiApID0gQF87CgoJ +bXkgJHBsdWdpbiA9ICRzZWxmLT57cHJvY2Vzc29yfS0+e3BsdWdpbn07CglpZiggIWRlZmluZWQg +JHBsdWdpbiApCgl7CgkJaWYoICRzZWxmLT5yZXBvc2l0b3J5LT5wYXJhbSggImFqYXgiICkgKQoJ +CXsKCQkJcmV0dXJuICJhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04IjsKCQl9CgkKCQly +ZXR1cm4gInRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI7Cgl9CgoJcmV0dXJuICRwbHVnaW4tPnBh +cmFtKCAibWltZXR5cGUiICk7Cn0KCnN1YiBleHBvcnQKewoJbXkoICRzZWxmICkgPSBAXzsKCglt +eSAkcGFydCA9ICRzZWxmLT5yZXBvc2l0b3J5LT5wYXJhbSggImFqYXgiICk7CglteSAkZiA9ICJh +amF4XyRwYXJ0IjsKCglpZiggJHNlbGYtPmNhbiggJGYgKSApCgl7CgkJYmlubW9kZShTVERPVVQs +ICI6dXRmOCIpOwoJCXJldHVybiAkc2VsZi0+JGY7Cgl9CgoJbXkgJHBsdWdpbiA9ICRzZWxmLT57 +cHJvY2Vzc29yfS0+e3BsdWdpbn07CglyZXR1cm4gJHNlbGYtPlNVUEVSOjpleHBvcnQgaWYgIWRl +ZmluZWQgJHBsdWdpbjsKCglteSAkaXRlbXMgPSAkc2VsZi0+aXRlbXM7CglpZiggJHBsdWdpbi0+ +e2dyb3VwZWR9ICYmIGRlZmluZWQgJHNlbGYtPntwcm9jZXNzb3J9LT57Z3JvdXB9ICkgI3NvbWUg +ZXhwb3J0IHBsdWdpbnMgY2FuIGFjY2VwdCBncm91cGluZ3MKCXsKCQkkaXRlbXMgPSAkc2VsZi0+ +Z2V0X2dyb3VwZWRfaXRlbXMoICRpdGVtcywgMCApOwoJfQoKCSRwbHVnaW4tPmluaXRpYWxpc2Vf +ZmgoIFwqU1RET1VUICk7CgkkcGx1Z2luLT5vdXRwdXRfbGlzdCgKCQlsaXN0ID0+ICRpdGVtcywK +CQlmaCA9PiBcKlNURE9VVCwKCQlleHBvcnRmaWVsZHMgPT4gJHNlbGYtPntwcm9jZXNzb3J9LT57 +ZXhwb3J0ZmllbGRzfSwKCQlkYXRhc2V0ID0+ICRzZWxmLT57cHJvY2Vzc29yfS0+e2RhdGFzZXR9 +LAoJCXBsdWdpbiA9PiAkc2VsZiwKCSk7Cn0KCnN1YiBhbGxvd19zZWFyY2ggeyByZXR1cm4gMTsg +fQoKI2dlbmVyYXRlcyBzZWFyY2ggY29uZmlnCnN1YiBfY3JlYXRlX3NlYXJjaAp7CglteSggJHNl +bGYgKSA9IEBfOwoKCW15ICRzZXNzaW9uID0gJHNlbGYtPntzZXNzaW9ufTsKICAgICAgICBteSAk +cmVwb3J0X3BsdWdpbiA9ICRzZWxmLT57cHJvY2Vzc29yfS0+c2NyZWVuOwoKCSMgRG8gbm90IGNy +ZWF0ZSBhIHNlYXJjaCBjb25maWcgaWYgdGhpcyBpcyBub3QgY29uZmlndXJlZCBpbiB0aGUgcmVw +b3J0CiAgCXJldHVybiBpZiAhIGRlZmluZWQgJHJlcG9ydF9wbHVnaW4tPntzZWFyY2hkYXRhc2V0 +aWR9OwoJJHNlbGYtPntwcm9jZXNzb3J9LT57cmVwb3J0X3BsdWdpbn0gPSAkcmVwb3J0X3BsdWdp +bjsKCiAgICAgICAgbXkgJHJlcG9ydF9kcyA9ICRzZXNzaW9uLT5kYXRhc2V0KCAkcmVwb3J0X3Bs +dWdpbi0+e3NlYXJjaGRhdGFzZXRpZH0gKTsKICAgICAgICBpZiggZGVmaW5lZCAkcmVwb3J0X2Rz +ICkKICAgICAgICB7CiAgICAgICAgICAgICAgICAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntkYXRhc2V0 +aWR9ID0gJHJlcG9ydF9kcy0+YmFzZV9pZDsKICAgICAgICAgICAgICAgIG15ICRzY29uZiA9ICRy +ZXBvcnRfZHMtPnNlYXJjaF9jb25maWcoICRyZXBvcnRfcGx1Z2luLT57c2NvbmZ9ICk7CgkKICAg +ICAgICAgICAgICAgIG15ICRmb3JtYXQgPSAicmVwb3J0LyIgLiAkcmVwb3J0X2RzLT5iYXNlX2lk +OwogICAgICAgICAgICAgICAgJHNlbGYtPntwcm9jZXNzb3J9LT57c2VhcmNofSA9ICRzZXNzaW9u +LT5wbHVnaW4oICJTZWFyY2giICktPnBsdWdpbnMoCiAgICAgICAgICAgICAgICAgICAgICAgIHsK +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZWVwX2NhY2hlID0+IDEsCiAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbiA9PiAkc2VsZi0+e3Nlc3Npb259LAogICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFzZXQgPT4gJHJlcG9ydF9kcywKICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAleyRzY29uZn0KICAgICAgICAgICAgICAgICAgICAg +ICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9PiAiU2VhcmNoIiwKICAgICAgICAg +ICAgICAgICAgICAgICAgY2FuX3NlYXJjaCA9PiAkZm9ybWF0LAogICAgICAgICAgICAgICAgKTsK +CX0KfQoKc3ViIGFsbG93X25ld3NlYXJjaCB7IHJldHVybiAxOyB9CgpzdWIgYWxsb3dfdXBkYXRl +IHsgcmV0dXJuIDE7IH0KCnN1YiBhY3Rpb25fbmV3c2VhcmNoCnsKICAgICAgICBteSggJHNlbGYg +KSA9IEBfOwoKICAgICAgICBteSAkc2Vzc2lvbiA9ICRzZWxmLT57c2Vzc2lvbn07CgogICAgICAg +ICMkc2VsZi0+e3Byb2Nlc3Nvcn0tPntyZXBvcnR9ID0gJHNlc3Npb24tPnBhcmFtKCAncmVwb3J0 +JyApOwogICAgICAgICMkc2VsZi0+e3Byb2Nlc3Nvcn0tPntzY3JlZW5pZH0gPSAkc2VsZi0+e3By +b2Nlc3Nvcn0tPntyZXBvcnR9OwogICAgICAgICMkc2VsZi0+e3Byb2Nlc3Nvcn0tPnthY3Rpb259 +ID0gIm5ld3NlYXJjaCI7CiAgICAgICAgIyRzZWxmLT5fY3JlYXRlX3NlYXJjaDsKfQoKc3ViIGFj +dGlvbl91cGRhdGUKewogICAgICAgIG15KCAkc2VsZiApID0gQF87CgogICAgICAgIG15ICRzZXNz +aW9uID0gJHNlbGYtPntzZXNzaW9ufTsKCiAgICAgICAgIyRzZWxmLT57cHJvY2Vzc29yfS0+e3Jl +cG9ydH0gPSAkc2Vzc2lvbi0+cGFyYW0oICdyZXBvcnQnICk7CiAgICAgICAgIyRzZWxmLT57cHJv +Y2Vzc29yfS0+e3NjcmVlbmlkfSA9ICRzZWxmLT57cHJvY2Vzc29yfS0+e3JlcG9ydH07CiAgICAg +ICAgIyRzZWxmLT57cHJvY2Vzc29yfS0+e2FjdGlvbn0gPSAibmV3c2VhcmNoIjsKICAgICAgICAj +JHNlbGYtPl9jcmVhdGVfc2VhcmNoOwp9CgpzdWIgYWN0aW9uX3NlYXJjaAp7CglteSggJHNlbGYg +KSA9IEBfOwoKCSRzZWxmLT57cHJvY2Vzc29yfS0+e2FjdGlvbn0gPSAic2VhcmNoIjsKCgkjcmVh +ZCBwYXJhbWV0ZXJzCglteSAkc2Vzc2lvbiA9ICRzZWxmLT57c2Vzc2lvbn07CgoJJHNlbGYtPntw +cm9jZXNzb3J9LT57cmVwb3J0fSA9ICRzZXNzaW9uLT5wYXJhbSggJ3JlcG9ydCcgKTsKCgkkc2Vs +Zi0+e3Byb2Nlc3Nvcn0tPntzY3JlZW5pZH0gPSAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntyZXBvcnR9 +OwoJJHNlbGYtPl9jcmVhdGVfc2VhcmNoOwoKCW15ICRsb2FkZWQgPSAwOwogICAgICAgIG15ICRp +ZCA9ICRzZXNzaW9uLT5wYXJhbSggImNhY2hlIiApOwogICAgICAgIGlmKCBkZWZpbmVkICRpZCAp +CiAgICAgICAgewoJCSRsb2FkZWQgPSAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntzZWFyY2h9LT5mcm9t +X2NhY2hlKCAkaWQgKTsKICAgICAgICB9CgogICAgICAgIGlmKCAhJGxvYWRlZCApCiAgICAgICAg +ewogICAgICAgICAgICAgICAgbXkgJGV4cCA9ICRzZXNzaW9uLT5wYXJhbSggImV4cCIgKTsKICAg +ICAgICAgICAgICAgIGlmKCBkZWZpbmVkICRleHAgKQogICAgICAgICAgICAgICAgewoJCQkkc2Vs +Zi0+e3Byb2Nlc3Nvcn0tPntzZWFyY2h9LT5mcm9tX3N0cmluZyggJGV4cCApOwogICAgICAgICAg +ICAgICAgICAgICAgICAjIGNhY2hlIGV4cGlyZWQuLi4KICAgICAgICAgICAgICAgICAgICAgICAg +JGxvYWRlZCA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBteSBAcHJv +YmxlbXM7CiAgICAgICAgaWYoICEkbG9hZGVkICkKICAgICAgICB7CgkJZm9yKCAkc2VsZi0+e3By +b2Nlc3Nvcn0tPntzZWFyY2h9LT5mcm9tX2Zvcm0gKQogICAgICAgICAgICAgICAgICAgICAgICB7 +CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNlbGYtPntwcm9jZXNzb3J9LT5hZGRf +bWVzc2FnZSggIndhcm5pbmciLCAkXyApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAg +ICAgfQogICAgICAgICAgCgoJI2Rpc3BsYXkgdGhlIHJlc3VsdHMKCSRzZWxmLT5yZW5kZXI7Cn0K +CnN1YiBwcm9wZXJ0aWVzX2Zyb20KewoJbXkoICRzZWxmICkgPSBAXzsKCglteSAkcmVwbyA9ICRz +ZWxmLT5yZXBvc2l0b3J5OwoJJHNlbGYtPlNVUEVSOjpwcm9wZXJ0aWVzX2Zyb207CgoJaWYoIGRl +ZmluZWQgKCBteSAkZHNpZCA9ICRzZWxmLT5wYXJhbSggImRhdGFzZXRpZCIgKSApICkKCXsKCQkk +c2VsZi0+e3Byb2Nlc3Nvcn0tPntkYXRhc2V0fSA9ICRzZWxmLT5yZXBvc2l0b3J5LT5kYXRhc2V0 +KCAkZHNpZCApOwoJfQoKCSMgc2YyIC0gVE9ETyAtIGJhcmsgaWYgZGF0YXNldCBpcyBub3Qgc2V0 +PyBwZXJoYXBzIHRoZXJlIGFyZSBvdGhlciB3YXlzIHRvIGdldCB0aGUgb2JqZWN0cyBmcm9tLi4u +CglteSAkcmVwb3J0ID0gJHNlbGYtPmdldF9yZXBvcnQoKTsKCgkjZ2V0IGEgc2VhcmNoIG9iamVj +dCBpZiB3ZSBoYXZlIG9uZSBmcm9tIGEgcHJldmlvdXMgc2VhcmNoIGFjdGlvbiwgc28gdGhhdCB3 +ZSBtaWdodCBsYXRlciB1c2UgaXQgdG8gZG8gYW4gZXhwb3J0IG9yIHNlYXJjaCBhY3Rpb24KCSRz +ZWxmLT5fY3JlYXRlX3NlYXJjaDsJCglpZiggZGVmaW5lZCAkc2VsZi0+cmVwb3NpdG9yeS0+cGFy +YW0oICJzZWFyY2giICkgKQoJewoJCSRzZWxmLT57cHJvY2Vzc29yfS0+e3NlYXJjaH0tPmZyb21f +c3RyaW5nKCAkc2VsZi0+cmVwb3NpdG9yeS0+cGFyYW0oICJzZWFyY2giICkgKSBpZiBkZWZpbmVk +ICRzZWxmLT57cHJvY2Vzc29yfS0+e3NlYXJjaH07CgkJJHNlbGYtPntwcm9jZXNzb3J9LT57ZXhw +b3J0X3NlYXJjaH0gPSAxOwoJfQoJCglteSAkZm9ybWF0ID0gJHNlbGYtPnJlcG9zaXRvcnktPnBh +cmFtKCAiZXhwb3J0IiApOwoJaWYoICRmb3JtYXQgJiYgJHJlcG9ydCApCgl7CgkJbXkgJHBsdWdp +biA9ICRzZWxmLT5yZXBvc2l0b3J5LT5wbHVnaW4oICJFeHBvcnQ6OiRmb3JtYXQiLCByZXBvcnQg +PT4gJHJlcG9ydCApOwoJCWlmKCBkZWZpbmVkICRwbHVnaW4gJiYgKCAkcGx1Z2luLT5jYW5fYWNj +ZXB0KCAicmVwb3J0LyRyZXBvcnQiICkgfHwgKCRwbHVnaW4tPmNhbl9hY2NlcHQoICJyZXBvcnQv +Z2VuZXJpYyIgKSApICkgKQoJCXsKCQkJJHNlbGYtPntwcm9jZXNzb3J9LT57cGx1Z2lufSA9ICRw +bHVnaW47CgkJfQoJfQoKCSNsaXN0IG9mIGV4cG9ydCBmaWVsZHMgcmV0cmlldmVkIGZyb20gbm9u +LWFic3RyYWN0IGluc3RhbmNlcyBvZiByZXBvcnRzCglteSBAZXhwb3J0ZmllbGRzOwoJaWYoIGRl +ZmluZWQgJHJlcG8tPmNvbmZpZyggJHNlbGYtPntleHBvcnRfY29uZn0sICJleHBvcnRmaWVsZHMi +ICkgKQoJewoJCW15IEBrZXlzOwoJCWlmKCBkZWZpbmVkICRyZXBvLT5jb25maWcoICRzZWxmLT57 +ZXhwb3J0X2NvbmZ9LCAiZXhwb3J0ZmllbGRfb3JkZXIiICkgKQoJCXsKCQkJQGtleXMgPSBAeyRy +ZXBvLT5jb25maWcoICRzZWxmLT57ZXhwb3J0X2NvbmZ9LCAiZXhwb3J0ZmllbGRfb3JkZXIiICl9 +OwoJCX0KCQllbHNlCgkJewoJCQlAa2V5cyA9IGtleXMgJXskcmVwby0+Y29uZmlnKCAkc2VsZi0+ +e2V4cG9ydF9jb25mfSwgImV4cG9ydGZpZWxkcyIgKX07IAoJCX0KCQlmb3JlYWNoIG15ICRrZXkg +KCBAa2V5cyApCgkJewoJCQlmb3JlYWNoIG15ICRmaWVsZG5hbWUgKCBAeyRyZXBvLT5jb25maWco +ICRzZWxmLT57ZXhwb3J0X2NvbmZ9LCAiZXhwb3J0ZmllbGRzIiApLT57JGtleX19ICkKCQkJewoJ +CQkJcHVzaCBAZXhwb3J0ZmllbGRzLCAkZmllbGRuYW1lIGlmIGRlZmluZWQgJHNlbGYtPnJlcG9z +aXRvcnktPnBhcmFtKCAkZmllbGRuYW1lICk7IAoJCQl9CgkJfQoJfQoKCW15ICRzb3J0ID0gJHNl +bGYtPnJlcG9zaXRvcnktPnBhcmFtKCAic29ydCIgKTsKCWlmKCBkZWZpbmVkICRzb3J0ICkKCXsK +CQkkc2VsZi0+e3Byb2Nlc3Nvcn0tPntzb3J0fSA9ICRzb3J0OwoJfQoKCW15ICRncm91cCA9ICRz +ZWxmLT5yZXBvc2l0b3J5LT5wYXJhbSggImdyb3VwIiApOwoJJHNlbGYtPntwcm9jZXNzb3J9LT57 +Z3JvdXBfZXhwfSA9ICRncm91cDsgI3N0b3JlIHRoZSBncm91cCBleHByZXNzaW9uIGZvciBsYXRl +ciB1c2UKCQoJI2RlY29kZSB0aGUgZ3JvdXAgZXhwcmVzc2lvbgoJbXkgJWdyb3VwX29wdHM7Cglp +ZiggZGVmaW5lZCAkZ3JvdXAgKQoJewoJCSNnZXQgZmllbGQgYW5kIGFzc29jaWF0ZWQgY29uZmln +dXJhdGlvbiBhYm91dCB0aGUgZ3JvdXAsIGUuZy4gcmVzLCB0cnVuY2F0ZSwgcmV2ZXJzZV9vcmRl +ciBldGMuCgkJbXkgQGdyb3VwID0gc3BsaXQoLzsvLCAkZ3JvdXAgKTsKCQlteSAkZmlyc3QgPSAx +OwoJCWZvcmVhY2ggbXkgJGcgKEBncm91cCkKCQl7CgkJCWlmKCAkZmlyc3QgKQoJCQl7CgkJCQkk +Z3JvdXAgPSAkZzsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCW15IEBvcHRzID0gc3BsaXQoLz0vLCAk +ZyApOwoJCQkJJGdyb3VwX29wdHN7JG9wdHNbMF19ID0gJG9wdHNbMV07CQkKCQkJfQoJCQkkZmly +c3QgPSAwOwoJCX0KCQkkc2VsZi0+e3Byb2Nlc3Nvcn0tPntncm91cH0gPSAkZ3JvdXA7CgkJJHNl +bGYtPntwcm9jZXNzb3J9LT57Z3JvdXBfb3B0c30gPSBcJWdyb3VwX29wdHM7Cgl9CgoJJHNlbGYt +Pntwcm9jZXNzb3J9LT57ZXhwb3J0ZmllbGRzfSA9IFxAZXhwb3J0ZmllbGRzOwp9CgkJCiMgXEAo +e21ldGFfZmllbGRzPT5bICJmaWVsZDEiLCAiZmllbGQyIiAiZG9jdW1lbnQuZmllbGQzIiBdLCBt +ZXJnZT0+IkFOWSIsIG1hdGNoPT4iRVgiLCB2YWx1ZT0+ImJlZXMifSwge21ldGFfZmllbGRzPT5b +ICJmaWVsZDQiIF0sIHZhbHVlPT4iaG9uZXkifSk7CiMgZS5nLgojIHJldHVybiBbIHsgbWV0YV9m +aWVsZHMgPT4gWyAndHlwZScgXSwgdmFsdWUgPT4gJ2FydGljbGUnIH0gXQpzdWIgZmlsdGVycwp7 +CglyZXR1cm4gW107Cn0KCiMgaG93IHRvIHNlbGVjdCBpdGVtcyBpLmUuIHRoZSBzbGljZSBvZiBk +YXRhIHdlIHdhbnQgdG8gdmFsaWRhdGUvZXhwb3J0PwojIApzdWIgaXRlbXMKewoJbXkoICRzZWxm +ICkgPSBAXzsKCWlmKCAkc2VsZi0+e3Byb2Nlc3Nvcn0tPnthY3Rpb259IGVxICJzZWFyY2giIHx8 +ICRzZWxmLT57cHJvY2Vzc29yfS0+e2V4cG9ydF9zZWFyY2h9ICkKICAgICAgIAl7CgkJbXkgJHJl +cG9ydCA9ICRzZWxmLT57cHJvY2Vzc29yfS0+e3JlcG9ydF9wbHVnaW59OwkKCQkkcmVwb3J0LT5h +cHBseV9maWx0ZXJzIGlmICRyZXBvcnQtPmNhbiggJ2FwcGx5X2ZpbHRlcnMnICk7CgoJCW15ICRp +dGVtcyA9ICRzZWxmLT57cHJvY2Vzc29yfS0+e3NlYXJjaH0tPnBlcmZvcm1fc2VhcmNoOwoKCQlp +ZiggZGVmaW5lZCAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntzb3J0fSApCgkJewkKCQkJJGl0ZW1zID0g +JGl0ZW1zLT5yZW9yZGVyKCAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntzb3J0fSApOwoJCX0KCQlyZXR1 +cm4gJGl0ZW1zOwoJfQoJZWxzaWYoIGRlZmluZWQgJHNlbGYtPntwcm9jZXNzb3J9LT57ZGF0YXNl +dH0gKSAKCXsKCQlteSAlc2VhcmNoX29wdHMgPSAoIGZpbHRlcnMgPT4gJHNlbGYtPmZpbHRlcnMs +IHNhdGlzZnlfYWxsID0+IDEgKTsKCQlpZiggZGVmaW5lZCAkc2VsZi0+cGFyYW0oICdjdXN0b21f +b3JkZXInICkgKQoJCXsKCQkJJHNlYXJjaF9vcHRze2N1c3RvbV9vcmRlcn0gPSAkc2VsZi0+cGFy +YW0oICdjdXN0b21fb3JkZXInICk7CgkJfQoKCQlpZiggZGVmaW5lZCAkc2VsZi0+e3Byb2Nlc3Nv +cn0tPntzb3J0fSApICNhbiBvcmRlcmluZyBzcGVjaWZpZWQgYnkgdGhlIHVzZXIgc2hvdWxkIHRy +dW1wIHRoZSByZXBvcnRzIGN1c3RvbSBvcmRlcgoJCXsKCQkJJHNlYXJjaF9vcHRze2N1c3RvbV9v +cmRlcn0gPSAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntzb3J0fTsKCQl9CQoJCXJldHVybiAkc2VsZi0+ +e3Byb2Nlc3Nvcn0tPntkYXRhc2V0fS0+c2VhcmNoKCAlc2VhcmNoX29wdHMgKTsKCX0KCSMgd2Ug +Y2FuJ3QgcmV0dXJuIGFuIEVQcmludHM6Okxpc3QgaWYge2RhdGFzZXR9IGlzIG5vdCBkZWZpbmVk +CglyZXR1cm4gdW5kZWY7Cn0KCiMgZnJvbSBSZXBvcnRzL1JPUy9Kb3VybmFscy5wbQojIFRPRE8g +Tm90ZSBxdWl0ZSBhIGxvdCBvZiByZXBsaWNhdGlvbiBiZXR3ZWVuIHRoaXMgYW5kIEV4cG9ydDo6 +UmVwb3J0OjpDU1Y6Om91dHB1dF9kYXRhb2JqCnN1YiB2YWxpZGF0ZV9kYXRhb2JqCnsKCW15KCAk +cGx1Z2luLCAkZGF0YW9iaiApID0gQF87CgoJbXkgJHJlcG8gPSAkcGx1Z2luLT5yZXBvc2l0b3J5 +OwoKCW15ICRyZXBvcnRfZmllbGRzID0gJHBsdWdpbi0+cmVwb3J0X2ZpZWxkcyggJGRhdGFvYmog +KTsKCW15ICR2YWxfZmllbGRzID0gJHBsdWdpbi0+dmFsaWRhdGVfZmllbGRzKCAkZGF0YW9iaiAp +OwoKCSMgcmVsYXRlZCBvYmplY3RzIGFuZCB0aGVpciBkYXRhc2V0cwoJbXkgJG9iamVjdHMgPSAk +cGx1Z2luLT5nZXRfcmVsYXRlZF9vYmplY3RzKCAkZGF0YW9iaiApOwoJbXkgJHZhbGlkX2RzID0g +e307Cglmb3JlYWNoIG15ICRkc2lkICgga2V5cyAlJG9iamVjdHMgKQoJewoJCSR2YWxpZF9kcy0+ +eyRkc2lkfSA9ICRyZXBvLT5kYXRhc2V0KCAkZHNpZCApOwoJfQoKCW15IEBwcm9ibGVtczsKCglm +b3JlYWNoIG15ICRmaWVsZCAoIEB7ICRwbHVnaW4tPnJlcG9ydF9maWVsZHNfb3JkZXIoICRkYXRh +b2JqICkgfHwgW10gfSApCgl7CgkJIyB2YWxpZGF0aW9uIGFjdGlvbgoJCW15ICR2X2ZpZWxkID0g +JHZhbF9maWVsZHMtPnskZmllbGR9OwoJCW5leHQgdW5sZXNzIGRlZmluZWQgJHZfZmllbGQ7ICMg +bm8gdmFsaWRhdGlvbiByZXF1aXJlZAoKCQkjIHNpbXBsZSBjYXNlIC0gY29kZSBoYW5kbGVzIHZh +bGlkYXRpb24KCQlpZiggcmVmKCAkdl9maWVsZCApIGVxICdDT0RFJyApCgkJewoJCQkjIGEgc3Vi +e30gd2UgbmVlZCB0byBydW4KCQkJZXZhbCB7CgkJCQkmJHZfZmllbGQoICRwbHVnaW4sICRvYmpl +Y3RzLCBcQHByb2JsZW1zICk7CgkJCX07CgkJCWlmKCAkQCApCgkJCXsKCQkJCSRyZXBvLT5sb2co +ICJWYWxpZGF0aW9uIFJ1bnRpbWUgZXJyb3I6ICRAIiApOwoJCQl9CgkJCW5leHQ7CgkJfQoJCWVs +c2lmKCBsYyAkdl9maWVsZCBuZSAicmVxdWlyZWQiICkKCQl7CgkJCSRyZXBvLT5sb2coICJWYWxp +ZGF0aW9uIFJ1bnRpbWUgZXJyb3I6ICR2X2ZpZWxkIG11c3QgYmUgY29kZSByZWYgb3IgJ3JlcXVp +cmVkJyIgKTsKCQkJbmV4dDsKCQl9CgoJCSMgY2hlY2sgcmVxdWlyZWQgdmFsdWVzCgoJCW15ICR2 +YWx1ZTsgIyB0aGUgdmFsdWUgdG8gdmFsaWRhdGUKCQlteSAkZXBfZmllbGQgPSAkcmVwb3J0X2Zp +ZWxkcy0+eyRmaWVsZH07CgkJaWYoIHJlZiggJGVwX2ZpZWxkICkgZXEgJ0NPREUnICkKCQl7CgkJ +CSMgYSBzdWJ7fSB3ZSBuZWVkIHRvIHJ1bgoJCQlldmFsIHsKCQkJCSR2YWx1ZSA9ICYkZXBfZmll +bGQoICRwbHVnaW4sICRvYmplY3RzICk7CgkJCX07CgkJCWlmKCAkQCApCgkJCXsKCQkJCSRyZXBv +LT5sb2coICJWYWxpZGF0aW9uIFJ1bnRpbWUgZXJyb3I6ICRAIiApOwoJCQl9CgkJfQoJCWVsc2lm +KCAkZXBfZmllbGQgPX4gL14oW2Etel9dKylcLihbMC05YS16X10rKSQvICkKCQl7CgkJCSMgYSBz +dHJhaWdodCBtYXBwaW5nIHdpdGggYW4gRVByaW50cyBmaWVsZAoJCQlteSggJGRzX2lkLCAkZXBf +ZmllbGRuYW1lICkgPSAoICQxLCAkMiApOwoJCQlteSAkZHMgPSAkdmFsaWRfZHMtPnskZHNfaWR9 +OwoKCQkJaWYoIGRlZmluZWQgJGRzICYmICRkcy0+aGFzX2ZpZWxkKCAkZXBfZmllbGRuYW1lICkg +KQoJCQl7CgkJCQkkdmFsdWUgPSAkb2JqZWN0cy0+eyRkc19pZH0tPnZhbHVlKCAkZXBfZmllbGRu +YW1lICk7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQkjIGRhdGFzZXQgb3IgZmllbGQgZG9lc24ndCBl +eGlzdAoJCQkJJHJlcG8tPmxvZyggIlZhbGlkYXRpb24gUnVudGltZSBlcnJvcjogZGF0YXNldCAk +ZHNfaWQgb3IgZmllbGQgJGVwX2ZpZWxkbmFtZSBkb2Vzbid0IGV4aXN0IiApOwoJCQl9CgkJfQoK +CQkjIGlzIGZpZWxkIHNldD8KCQlpZiggIUVQcmludHM6OlV0aWxzOjppc19zZXQoICR2YWx1ZSAp +ICkKCQl7CgkJCXB1c2ggQHByb2JsZW1zLCAiTWlzc2luZyByZXF1aXJlZCBmaWVsZCAkZmllbGQi +OwoJCX0KCX0KCglyZXR1cm4gQHByb2JsZW1zOwp9CgojIFRPRE8gTm90ZSBjb3B5IG9mIEV4cG9y +dDo6UmVwb3J0OjpnZXRfcmVsYXRlZF9vYmplY3RzCnN1YiBnZXRfcmVsYXRlZF9vYmplY3RzCnsK +CW15KCAkcGx1Z2luLCAkZGF0YW9iaiApID0gQF87CgoJbXkgJGNtZCA9IFsgJ3JlcG9ydHMnLCAk +cGx1Z2luLT5nZXRfcmVwb3J0LCAnZ2V0X3JlbGF0ZWRfb2JqZWN0cycgXTsKICAgICAgICBpZigg +JHBsdWdpbi0+cmVwb3NpdG9yeS0+Y2FuX2NhbGwoIEAkY21kICkgKQogICAgICAgIHsKCQlyZXR1 +cm4gJHBsdWdpbi0+cmVwb3NpdG9yeS0+Y2FsbCggJGNtZCwgJHBsdWdpbi0+cmVwb3NpdG9yeSwg +JGRhdGFvYmogKSB8fCB7fTsKICAgICAgICB9CgoJIyBqdXN0IHBhc3MgdGhlIGRhdGFvYmogaXRz +ZWxmCglyZXR1cm4gewoJCSRkYXRhb2JqLT5kYXRhc2V0LT5jb25maWQgPT4gJGRhdGFvYmosCgl9 +Owp9CgojIFRPRE8gTm90ZSBjb3B5IG9mIEV4cG9ydDo6UmVwb3J0OjpyZXBvcnRfZmllbGRzX29y +ZGVyCnN1YiByZXBvcnRfZmllbGRzX29yZGVyCnsKCW15KCAkcGx1Z2luICkgPSBAXzsKCglyZXR1 +cm4gJHBsdWdpbi0+e3JlcG9ydF9maWVsZHNfb3JkZXJ9IGlmKCBkZWZpbmVkICRwbHVnaW4tPnty +ZXBvcnRfZmllbGRzX29yZGVyfSApOwoKCW15ICRyZXBvcnQgPSAkcGx1Z2luLT5nZXRfcmVwb3J0 +KCk7CglyZXR1cm4gW10gdW5sZXNzKCBkZWZpbmVkICRyZXBvcnQgKTsKCgkkcGx1Z2luLT57cmVw +b3J0X2ZpZWxkc19vcmRlcn0gPSAkcGx1Z2luLT5yZXBvc2l0b3J5LT5jb25maWcoICdyZXBvcnRz +JywgJHJlcG9ydCwgJ2ZpZWxkcycgKTsKCglyZXR1cm4gJHBsdWdpbi0+e3JlcG9ydF9maWVsZHNf +b3JkZXJ9Owp9CgojIFRPRE8gTm90ZSBjb3B5IG9mIEV4cG9ydDo6UmVwb3J0OjpyZXBvcnRfZmll +bGRzCnN1YiByZXBvcnRfZmllbGRzCnsKCW15KCAkcGx1Z2luICkgPSBAXzsKCglyZXR1cm4gJHBs +dWdpbi0+e3JlcG9ydF9maWVsZHN9IGlmKCBkZWZpbmVkICRwbHVnaW4tPntyZXBvcnRfZmllbGRz +fSApOwoKCW15ICRyZXBvcnQgPSAkcGx1Z2luLT5nZXRfcmVwb3J0KCk7CglyZXR1cm4gW10gdW5s +ZXNzKCBkZWZpbmVkICRyZXBvcnQgKTsKCgkkcGx1Z2luLT57cmVwb3J0X2ZpZWxkc30gPSAkcGx1 +Z2luLT5yZXBvc2l0b3J5LT5jb25maWcoICdyZXBvcnRzJywgJHJlcG9ydCwgJ21hcHBpbmdzJyAp +OwoKCXJldHVybiAkcGx1Z2luLT57cmVwb3J0X2ZpZWxkc307Cn0KCnN1YiB2YWxpZGF0ZV9maWVs +ZHMKewoJbXkoICRwbHVnaW4gKSA9IEBfOwoKCXJldHVybiAkcGx1Z2luLT57dmFsaWRhdGVfZmll +bGRzfSBpZiggZGVmaW5lZCAkcGx1Z2luLT57dmFsaWRhdGVfZmllbGRzfSApOwoKCW15ICRyZXBv +cnQgPSAkcGx1Z2luLT5nZXRfcmVwb3J0KCk7CglyZXR1cm4gW10gdW5sZXNzKCBkZWZpbmVkICRy +ZXBvcnQgKTsKCgkkcGx1Z2luLT57dmFsaWRhdGVfZmllbGRzfSA9ICRwbHVnaW4tPnJlcG9zaXRv +cnktPmNvbmZpZyggJ3JlcG9ydHMnLCAkcmVwb3J0LCAndmFsaWRhdGUnICk7CgoJcmV0dXJuICRw +bHVnaW4tPnt2YWxpZGF0ZV9maWVsZHN9Owp9CgojIyByZW5kZXJpbmcKCiMgVGhlICJzcGxhc2gg +cGFnZSIKc3ViIHJlbmRlcl9zcGxhc2hfcGFnZQp7CglteSggJHNlbGYgKSA9IEBfOwoKCW15ICRy +ZXBvID0gJHNlbGYtPnJlcG9zaXRvcnk7CglteSBAcGx1Z2lucyA9ICRzZWxmLT5yZXBvcnRfcGx1 +Z2luczsKCglpZiggIXNjYWxhciggQHBsdWdpbnMgKSApCgl7CgkJcmV0dXJuICRzZWxmLT5odG1s +X3BocmFzZSggIm5vX3JlcG9ydHMiICk7Cgl9CgoJbXkgQGxhYmVsczsKCW15IEBwYW5lbHM7CgoJ +I3ByZXNldCByZXBvcnRzCglwdXNoIEBsYWJlbHMsICRyZXBvLT5odG1sX3BocmFzZSggInJlcG9y +dHNfcHJlc2V0IiApOwoJbXkgJHByZXNldCA9ICRyZXBvLT5tYWtlX2VsZW1lbnQoICJkaXYiICk7 +CglteSAkcHJlc2V0c19hZGRlZCA9IDA7CgoJIyB0b3AgY2F0ZWdvcnk6IGJ5IGNsYXNzbmFtZSA+ +IFJlcG9ydDo6Uk9TOjpTb21lUmVwb3J0MSwgUmVwb3J0OjpST1M6OlNvbWVSZXBvcnQyCgoJbXkg +JHVsID0gJHNlbGYtPnJlcG9zaXRvcnktPm1ha2VfZWxlbWVudCggJ3VsJywgY2xhc3MgPT4gJ2Vw +X3JlcG9ydF9jYXRlZ29yeScgKTsKCgkjIGNhdCB+IGNhdGVnb3J5IC0gIW1lZW93CglteSAkY2F0 +ID0gIiI7CglteSAkY2F0X2xpID0gdW5kZWY7IAoJbXkgJGNhdF91bCA9IHVuZGVmOwoJCgkjcHJl +cGFyZSBoYXNoIG9mIHJlcG9ydGluZyBwbHVnaW5zCglteSAlcmVwb3J0X2hhc2g7Cglmb3JlYWNo +IG15ICRyZXBvcnRfcGx1Z2luICggc29ydCB7ICRhLT5nZXRfc3VidHlwZSBjbXAgJGItPmdldF9z +dWJ0eXBlIH0gQHBsdWdpbnMgKQoJewoJCW15ICRwbHVnaW5fY2F0ID0gJHJlcG9ydF9wbHVnaW4t +PmdldF9zdWJ0eXBlOwoJCSRwbHVnaW5fY2F0ID1+IHMvXlJlcG9ydDo6KFteOl0rKTo/Oj8oLiop +JC8kMS9nOwkKCgkJaWYoICRjYXQgbmUgJHBsdWdpbl9jYXQgKSAjd2UgaGF2ZSBhIHRvcC1jYXRl +Z29yeQoJCXsKCQkJJGNhdCA9ICRwbHVnaW5fY2F0OwoJCQkkcmVwb3J0X2hhc2h7JGNhdH0gPSBb +XTsKCQl9CgoJCWlmKCBFUHJpbnRzOjpVdGlsczo6aXNfc2V0KCAkMiApICkKCQl7CgkJCXB1c2gg +QHskcmVwb3J0X2hhc2h7JGNhdH19LCAkcmVwb3J0X3BsdWdpbjsKCQl9Cgl9CgkKCWZvciBteSAk +dG9wX2NhdCggc29ydCBrZXlzICVyZXBvcnRfaGFzaCApCgl7CgkJbXkgQHJlcG9ydF9wbHVnaW5z +ID0gQHskcmVwb3J0X2hhc2h7JHRvcF9jYXR9fTsKCQlpZiggc2NhbGFyKCBAcmVwb3J0X3BsdWdp +bnMgKSA+IDAgKQoJCXsKCQkJI3JlbmRlciB0b3AtY2F0ZWdvcnkKCQkJJGNhdF9saSA9ICR1bC0+ +YXBwZW5kQ2hpbGQoICRzZWxmLT5yZXBvc2l0b3J5LT5tYWtlX2VsZW1lbnQoICdsaScgKSApOwoJ +CQkkY2F0X2xpLT5hcHBlbmRDaGlsZCggJHNlbGYtPnJlcG9zaXRvcnktPmh0bWxfcGhyYXNlKCAi +UGx1Z2luL1NjcmVlbi9SZXBvcnQvJHRvcF9jYXQ6dGl0bGUiICkgKTsKCgkJCSRjYXRfdWwgPSAk +Y2F0X2xpLT5hcHBlbmRDaGlsZCggJHNlbGYtPnJlcG9zaXRvcnktPm1ha2VfZWxlbWVudCggJ3Vs +JywgY2xhc3MgPT4gJ2VwX3JlcG9ydF9pdGVtcycgKSApOwoKCQkJZm9yZWFjaCBteSAkciAoIEBy +ZXBvcnRfcGx1Z2lucyApCgkJCXsKCQkJCW15ICRzdWJfbGkgPSAkY2F0X3VsLT5hcHBlbmRDaGls +ZCggJHNlbGYtPnJlcG9zaXRvcnktPm1ha2VfZWxlbWVudCggJ2xpJyApICk7CgkJCQkkc3ViX2xp +LT5hcHBlbmRDaGlsZCggJHItPnJlbmRlcl9hY3Rpb25fbGluayApOwoJCQkJJHByZXNldHNfYWRk +ZWQrKzsKCQkJfQoJCX0KCX0KCgkkcHJlc2V0LT5hcHBlbmRDaGlsZCggJHVsICk7CglwdXNoIEBw +YW5lbHMsICRwcmVzZXQ7CgoJI2N1c3RvbSByZXBvcnRzCglwdXNoIEBsYWJlbHMsICRyZXBvLT5o +dG1sX3BocmFzZSggInJlcG9ydHNfY3VzdG9tIiApOwoKCW15ICRjdXN0b20gPSAkcmVwby0+bWFr +ZV9lbGVtZW50KCAiZGl2IiwgaWQ9PiJjdXN0b21fcmVwb3J0IiApOwoJbXkgJGZvcm0gPSAkcmVw +by0+cmVuZGVyX2Zvcm0oICJnZXQiICk7CgoJJGZvcm0tPmFwcGVuZENoaWxkKCAkc2VsZi0+cmVu +ZGVyX2NvbnRyb2xzKCAxICkgKTsKCgkjYWRkIGVhY2ggcmVwb3J0IHRvIHRoZSBzZWxlY3QgY29t +cG9uZW50IGFuZCBnZW5lcmF0ZSBzZWFyY2ggZm9ybSBpZiByZXF1aXJlZAoJbXkgJHJlcG9ydF9z +ZWxlY3QgPSAkcmVwby0+bWFrZV9lbGVtZW50KCAic2VsZWN0IiwgbmFtZT0+InJlcG9ydCIsIGlk +PT4ic2VsZWN0X3JlcG9ydCIgKTsKCW15ICVzZWFyY2hfZm9ybXM7CglteSAkY3VzdG9tX3JlcG9y +dHMgPSAwOwoJI2ZvcmVhY2ggbXkgJHJlcG9ydF9wbHVnaW4gKCBAcGx1Z2lucyApCglmb3JlYWNo +IG15ICRyZXBvcnRfcGx1Z2luICggc29ydCB7ICRhLT5nZXRfc3VidHlwZSBjbXAgJGItPmdldF9z +dWJ0eXBlIH0gQHBsdWdpbnMgKQoJewoJCWlmKCAkcmVwb3J0X3BsdWdpbi0+cGFyYW0oICJjdXN0 +b20iICkgKQoJCXsJCgkJCSRjdXN0b21fcmVwb3J0cysrOwoJCQlteSAkZm9ybWlkID0gJHJlcG9y +dF9wbHVnaW4tPntzY29uZn07CgoJCQkjYWRkIHRvIHNlbGVjdCBjb21wb25lbnQKCQkJbXkgJGlk +ID0gJHJlcG9ydF9wbHVnaW4tPntyZXBvcnR9OwoJCQlteSAkb3B0aW9uID0gJHJlcG8tPm1ha2Vf +ZWxlbWVudCggIm9wdGlvbiIsIHZhbHVlID0+ICRyZXBvcnRfcGx1Z2luLT5nZXRfc3VidHlwZSwg +Zm9ybSA9PiAkZm9ybWlkICk7CgoJCQkjc2V0IGRlZmF1bHQgb3B0aW9uIGZvciBzZWxlY3QgY29t +cG9uZW50IGlmIHJlcXVpcmVkIChpLmUuIHdlIGhhdmUgY29tZSBmcm9tIGEgcmVmaW5lIHNlYXJj +aCBvciBuZXcgc2VhcmNoIGxpbmspCgkJCW15ICRyZWZpbmVfc2NvbmYgPSAkc2VsZi0+e3Nlc3Np +b259LT5wYXJhbSggInNjb25mIiApOwoJCQlpZiggKCAkc2VsZi0+e3Byb2Nlc3Nvcn0tPnthY3Rp +b259IGVxICJ1cGRhdGUiIHx8ICRzZWxmLT57cHJvY2Vzc29yfS0+e2FjdGlvbn0gZXEgIm5ld3Nl +YXJjaCIgKSAmJiBkZWZpbmVkICRyZWZpbmVfc2NvbmYgJiYgJHJlZmluZV9zY29uZiBlcSAkZm9y +bWlkICkKCQkJewoJCQkJJG9wdGlvbi0+c2V0QXR0cmlidXRlKCBzZWxlY3RlZCA9PiAic2VsZWN0 +ZWQiICk7CgkJCX0KCgkJCSNzZXQgb3B0aW9uIHRleHQgYW5kIGFkZCB0byBzZWxlY3QKICAJCQkk +b3B0aW9uLT5hcHBlbmRDaGlsZCggJHJlcG9ydF9wbHVnaW4tPnJlbmRlcl90aXRsZSApOwoJCQkk +cmVwb3J0X3NlbGVjdC0+YXBwZW5kQ2hpbGQoICRvcHRpb24gKTsKCgkJCSNjcmVhdGUgc2VhcmNo +IGZvcm0JCQkKCQkJI2dldCByZXBvcnQgZGF0YXNldCBhbmQgYXBwcm9wcmlhdGUgc2VhcmNoIGNv +bmZpZwoJCQlteSAkcmVwb3J0X2RzID0gJHJlcG8tPmRhdGFzZXQoICRyZXBvcnRfcGx1Z2luLT57 +c2VhcmNoZGF0YXNldGlkfSApOwoJCQlteSAkc2NvbmYgPSAkcmVwb3J0X2RzLT5zZWFyY2hfY29u +ZmlnKCAkcmVwb3J0X3BsdWdpbi0+e3Njb25mfSApIDsKCQkJI215ICRzZWFyY2ggPSBFUHJpbnRz +OjpTZWFyY2gtPm5ldygKCQkgICAgICAgICMgICAgICAgIGtlZXBfY2FjaGUgPT4gMSwKCSAgICAg +ICAgICAgICAgICAjCXNlc3Npb24gPT4gJHJlcG8sCgkJICAgICAgICAjICAgICAgICBkYXRhc2V0 +ID0+ICRyZXBvcnRfZHMsCgkJICAgICAgICAjICAgICAgICAleyRzY29uZn0KCQkJIyk7CgoJCQlt +eSAkZm9ybWF0ID0gInJlcG9ydC8iIC4gJHJlcG9ydF9kcy0+YmFzZV9pZDsKCSAgICAgICAgICAg +ICAgICBteSAkc2VhcmNoZXhwID0gJHJlcG8tPnBsdWdpbiggIlNlYXJjaCIgKS0+cGx1Z2lucygK +ICAgICAgICAgICAgICAgICAgICAgICAgCXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAJa2VlcF9jYWNoZSA9PiAxLAoJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNz +aW9uID0+ICRzZWxmLT57c2Vzc2lvbn0sCiAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgICAg +IGRhdGFzZXQgPT4gJHJlcG9ydF9kcywKICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAgICAg +JXskc2NvbmZ9CiAgICAgICAgICAgICAgICAgICAgICAgIAl9LAogICAgICAgICAgICAgICAgICAg +ICAgICB0eXBlID0+ICJTZWFyY2giLAogICAgICAgICAgICAgICAgICAgICAgICBjYW5fc2VhcmNo +ID0+ICRmb3JtYXQsCiAgICAgICAgICAgICAgICAJKTsJCgkJCSRzZWFyY2hleHAtPmZyb21fZm9y +bTsKCgkJCSNnZW5lcmF0ZSB0aGUgZm9ybQoJCQlteSAkZnJhZyA9ICRzZWxmLT5yZW5kZXJfc2Vh +cmNoX2ZpZWxkcyggJHNlYXJjaGV4cCwgJGZvcm1pZCApOwoJCQkkc2VhcmNoX2Zvcm1zeyRmb3Jt +aWR9ID0gJGZyYWcgdW5sZXNzIGV4aXN0cyAkc2VhcmNoX2Zvcm1zeyRmb3JtaWR9OwoJCX0JCgl9 +CgkkZm9ybS0+YXBwZW5kQ2hpbGQoICRyZXBvcnRfc2VsZWN0ICk7CgkkZm9ybS0+YXBwZW5kQ2hp +bGQoICRyZXBvLT5yZW5kZXJfaGlkZGVuX2ZpZWxkKCAic2NyZWVuIiwgJHNlbGYtPntzY3JlZW5p +ZH0gKSApOwoKCSNyZW5kZXIgcG9zc2libGUgc2VhcmNoIGZvcm1zCglmb3JlYWNoIG15ICRmb3Jt +aWQgKGtleXMgJXNlYXJjaF9mb3JtcykKCXsKCQlteSAkdGFibGUgPSAkcmVwby0+bWFrZV9lbGVt +ZW50KCAidGFibGUiLCBjbGFzcz0+ImVwX3NlYXJjaF9maWVsZHMiLCBpZD0+JGZvcm1pZCwgc3R5 +bGU9PiJkaXNwbGF5OiBub25lIiApOwoJICAgICAgICAkZm9ybS0+YXBwZW5kQ2hpbGQoICR0YWJs +ZSApOwoJICAgICAgICAkdGFibGUtPmFwcGVuZENoaWxkKCAkc2VhcmNoX2Zvcm1zeyRmb3JtaWR9 +ICk7Cgl9CgoJJGZvcm0tPmFwcGVuZENoaWxkKCAkc2VsZi0+cmVuZGVyX2NvbnRyb2xzICk7Cgkk +Y3VzdG9tLT5hcHBlbmRDaGlsZCggJGZvcm0gKTsKCgkjamF2YXNjcmlwdCBmb3IgY2hhbmdpbmcg +Zm9ybXMgYmFzZWQgb24gcmVwb3J0IHNlbGVjdGlvbgoJJGN1c3RvbS0+YXBwZW5kQ2hpbGQoICRy +ZXBvLT5tYWtlX2phdmFzY3JpcHQoICdpbml0UmVwb3J0Rm9ybSgpOycgKSApOwoKCWlmKCAkY3Vz +dG9tX3JlcG9ydHMgJiYgJHByZXNldHNfYWRkZWQgPiAwICkgI3NldCB1cCB0YWIgaW50ZXJmYWNl +Cgl7CgkJbXkgQGxhYmVsczsKCSAgICAgICAgbXkgQHBhbmVsczsKCgkJcHVzaCBAbGFiZWxzLCAk +cmVwby0+aHRtbF9waHJhc2UoICJyZXBvcnRzX3ByZXNldCIgKTsKCQlwdXNoIEBsYWJlbHMsICRy +ZXBvLT5odG1sX3BocmFzZSggInJlcG9ydHNfY3VzdG9tIiApOwoKCQlwdXNoIEBwYW5lbHMsICRw +cmVzZXQ7CgkJcHVzaCBAcGFuZWxzLCAkY3VzdG9tOwoKCQlteSAlb3B0czsKCQlpZiggJHNlbGYt +Pntwcm9jZXNzb3J9LT57YWN0aW9ufSBlcSAibmV3c2VhcmNoIiB8fCAkc2VsZi0+e3Byb2Nlc3Nv +cn0tPnthY3Rpb259IGVxICJ1cGRhdGUiICApCgkJewoJCQkkb3B0c3tjdXJyZW50fSA9IDE7CgkJ +fQoKCQlyZXR1cm4gJHJlcG8tPnhodG1sLT50YWJzKFxAbGFiZWxzLCBcQHBhbmVscywgJW9wdHMg +KTsKCX0KCWVsc2lmKCAkcHJlc2V0c19hZGRlZCA+IDAgKQoJewkKCQlyZXR1cm4gJHByZXNldDsK +CX0KCWVsc2UKCXsKCQlyZXR1cm4gJGN1c3RvbTsKCX0KfQoKc3ViIHJlbmRlcl9zZWFyY2hfZmll +bGRzCnsKICAgICAgICBteSggJHNlbGYsICRzZWFyY2gsICRmb3JtaWQgKSA9IEBfOwoKCW15ICRl +eHAgPSAkc2VsZi0+e3Nlc3Npb259LT5wYXJhbSggImV4cCIgKTsKCW15ICRzY29uZiA9ICRzZWxm +LT57c2Vzc2lvbn0tPnBhcmFtKCAic2NvbmYiICk7CiAgICAgICAgaWYoIGRlZmluZWQgJGV4cCAm +JiBkZWZpbmVkICRzY29uZiAmJiAkc2NvbmYgZXEgJGZvcm1pZCApCgl7CiAgICAgICAgICAgICAg +ICAkc2VhcmNoLT5mcm9tX3N0cmluZyggJGV4cCApOwogIAl9CgogICAgICAgIG15ICRmcmFnID0g +JHNlbGYtPntzZXNzaW9ufS0+bWFrZV9kb2NfZnJhZ21lbnQ7CiAgICAgICAgZm9yZWFjaCBteSAk +c2YgKCAkc2VhcmNoLT5nZXRfbm9uX2ZpbHRlcl9zZWFyY2hmaWVsZHMgKQogICAgICAgIHsKCSAg +ICAgICAgICRmcmFnLT5hcHBlbmRDaGlsZCgKICAgICAgICAgICAgICAgICAgICAgICAgJHNlbGYt +PntzZXNzaW9ufS0+cmVuZGVyX3Jvd193aXRoX2hlbHAoCiAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgaGVscF9wcmVmaXggPT4gJHNmLT5nZXRfZm9ybV9wcmVmaXguIl9oZWxwIiwKICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwID0+ICRzZi0+cmVuZGVyX2hlbHAsCiAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPT4gJHNmLT5yZW5kZXJfbmFtZSwK +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCA9PiAkc2YtPnJlbmRlciwKICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub190b2dnbGUgPT4gKCAkc2YtPntzaG93X2hl +bHB9IGVxICJhbHdheXMiICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9faGVs +cCA9PiAoICRzZi0+e3Nob3dfaGVscH0gZXEgIm5ldmVyIiApLAogICAgICAgIAkpICk7CiAgICAg +ICAgfQoKICAgICAgICByZXR1cm4gJGZyYWc7Cn0KCnN1YiByZW5kZXJfY29udHJvbHMKewoJbXko +ICRzZWxmLCAkd2l0aF9qcyApID0gQF87CgoJbXkgJGRpdiA9ICRzZWxmLT57c2Vzc2lvbn0tPm1h +a2VfZWxlbWVudCgKICAgICAgICAgICAgICAgICJkaXYiICwKICAgICAgICAgICAgICAgIGNsYXNz +ID0+ICJlcF9zZWFyY2hfYnV0dG9ucyIgKTsKICAgICAgICAkZGl2LT5hcHBlbmRDaGlsZCggJHNl +bGYtPntzZXNzaW9ufS0+cmVuZGVyX2FjdGlvbl9idXR0b25zKAogICAgICAgICAgICAgICAgX29y +ZGVyID0+IFsgInNlYXJjaCIgXSwKICAgICAgICAgICAgICAgICNuZXdzZWFyY2ggPT4gJHNlbGYt +PntzZXNzaW9ufS0+cGhyYXNlKCAibGliL3NlYXJjaGV4cHJlc3Npb246YWN0aW9uX3Jlc2V0IiAp +LAogICAgICAgICAgICAgICAgc2VhcmNoID0+ICRzZWxmLT57c2Vzc2lvbn0tPnBocmFzZSggImxp +Yi9zZWFyY2hleHByZXNzaW9uOmFjdGlvbl9zZWFyY2giICkgKQogICAgICAgICk7CgkKCW15ICR4 +bWwgPSAkc2VsZi0+e3Nlc3Npb259LT54bWw7CgoJaWYoICR3aXRoX2pzICkKCXsKCQlteSAkY2xl +YXJfZm9ybSA9ICRkaXYtPmFwcGVuZENoaWxkKCAkc2VsZi0+cmVuZGVyX2NsZWFyZm9ybSggJHht +bCApICk7Cgl9CgogICAgICAgIG15ICRjbGVhcl9idG4gPSAkZGl2LT5hcHBlbmRDaGlsZCggJHht +bC0+Y3JlYXRlX2VsZW1lbnQoICJidXR0b24iLAogICAgICAgIAl0eXBlID0+ICJidXR0b24iLAog +ICAgICAgICAgICAgICAgb25jbGljayA9PiAiY2xlYXJGb3JtKCk7IiwKICAgICAgICAgICAgICAg +IGNsYXNzID0+ICJlcF9mb3JtX2FjdGlvbl9idXR0b24gY2xlYXJfYnV0dG9uIiwKICAgICAgICAg +ICAgICAgICkgKTsKICAgICAgICAkY2xlYXJfYnRuLT5hcHBlbmRDaGlsZCggJHhtbC0+Y3JlYXRl +X3RleHRfbm9kZSggJHNlbGYtPntzZXNzaW9ufS0+aHRtbF9waHJhc2UoICJsaWIvc2VhcmNoZXhw +cmVzc2lvbjphY3Rpb25fcmVzZXQiICkgKSApOwoJcmV0dXJuICRkaXY7Cn0KCnN1YiByZW5kZXIK +ewoJbXkoICRzZWxmICkgPSBAXzsKCgkjIGlmIHVzZXJzIGFjY2VzcyBTY3JlZW46OlJlcG9ydCBk +aXJlY3RseSB3ZSB3YW50IHRvIGRpc3BsYXkgc29tZSBzb3J0IG9mIG1lbnUKCSMgd2hlcmUgdXNl +cnMgY2FuIHNlbGVjdCB2aWV3YWJsZSByZXBvcnRzCglpZiggKCAiRVByaW50czo6UGx1Z2luOjoi +LiRzZWxmLT5nZXRfaWQgZXEgX19QQUNLQUdFX18gJiYgJHNlbGYtPntwcm9jZXNzb3J9LT57YWN0 +aW9ufSBuZSAic2VhcmNoIiApIHx8ICRzZWxmLT57cHJvY2Vzc29yfS0+e2FjdGlvbn0gZXEgIm5l +d3NlYXJjaCIgKQoJewkKCQlyZXR1cm4gJHNlbGYtPnJlbmRlcl9zcGxhc2hfcGFnZTsKCX0KCglt +eSAkcmVwbyA9ICRzZWxmLT5yZXBvc2l0b3J5OwoKCW15ICRjaHVuayA9ICRyZXBvLT5tYWtlX2Rv +Y19mcmFnbWVudDsKCgkkY2h1bmstPmFwcGVuZENoaWxkKCAkc2VsZi0+cmVuZGVyX2V4cG9ydF9i +YXIgKTsKCSRjaHVuay0+YXBwZW5kQ2hpbGQoICRzZWxmLT5yZW5kZXJfZ3JvdXBfb3B0aW9ucyAp +OwoJJGNodW5rLT5hcHBlbmRDaGlsZCggJHNlbGYtPnJlbmRlcl9zb3J0X29wdGlvbnMgKTsKCglp +ZiggJHNlbGYtPntwcm9jZXNzb3J9LT57YWN0aW9ufSBlcSAic2VhcmNoIiApCgl7CgkJJGNodW5r +LT5hcHBlbmRDaGlsZCggJHNlbGYtPnJlbmRlcl9yZWZpbmVfc2VhcmNoICk7Cgl9CgoJbXkgJGl0 +ZW1zID0gJHNlbGYtPml0ZW1zOwoJaWYoICFkZWZpbmVkICRpdGVtcyB8fCAkaXRlbXMtPmNvdW50 +ID09IDAgKQoJewoJCSMgTm8gaXRlbXMgbWVzc2FnZQoJfQoKCW15ICRqc29uOwoKCWlmKCBkZWZp +bmVkICRzZWxmLT57cHJvY2Vzc29yfS0+e2dyb3VwfSAmJiAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntn +cm91cH0gbmUgIiIgKQoJewoJCW15ICRncm91cGVkID0gJHNlbGYtPmdldF9ncm91cGVkX2l0ZW1z +KCAkaXRlbXMsIDEgKTsKCQkkanNvbiA9IGVuY29kZV9qc29uICRncm91cGVkOwoJfQoJZWxzZQoJ +ewoJCW15ICRpdGVtX2lkcyA9IGRlZmluZWQgJGl0ZW1zID8gJGl0ZW1zLT5pZHMgOiBbXTsKCQkk +anNvbiA9ICJbIi5qb2luKCcsJyxAJGl0ZW1faWRzKS4iXSI7Cgl9CgogICAgICAgIG15ICR1cmwg +PSAkcmVwby0+Y3VycmVudF91cmwoIGhvc3QgPT4gMSApOwogICAgICAgIG15ICRwYXJhbWV0ZXJz +ID0gVVJJLT5uZXc7CiAgICAgICAgJHBhcmFtZXRlcnMtPnF1ZXJ5X2Zvcm0oCiAgICAgICAgICAg +ICAgICAkc2VsZi0+aGlkZGVuX2JpdHMsCiAgICAgICAgKTsKICAgICAgICAkcGFyYW1ldGVycyA9 +ICRwYXJhbWV0ZXJzLT5xdWVyeTsKCQkKCW15ICRkcyA9ICRyZXBvLT5kYXRhc2V0KCAkc2VsZi0+ +cGFyYW0oICdkYXRhc2V0aWQnICkgKSBpZiBkZWZpbmVkICRzZWxmLT5wYXJhbSggJ2RhdGFzZXRp +ZCcgKTsKCW15ICRwcmVmaXggPSAkZHMtPmJhc2VfaWQgaWYgZGVmaW5lZCAkZHM7CgoJIyB0aGUg +bWFpbiA8ZGl2PgoJbXkgJGNvbnRhaW5lcl9pZCA9IHNwcmludGYoICJlcF9yZXBvcnRfJXNcX2Nv +bnRhaW5lciIsICRzZWxmLT5nZXRfcmVwb3J0ICk7CgoJI3VwZGF0ZSBqYXZhc2NyaXB0IHBhcmFt +ZXRlcnMgaWYgY29taW5nIGZyb20gYSBzZWFyY2ggcmVxdWVzdAoJaWYoICRzZWxmLT57cHJvY2Vz +c29yfS0+e2FjdGlvbn0gZXEgInNlYXJjaCIgKQoJewoJCW15ICRwbHVnaW4gPSAkc2VsZi0+e3By +b2Nlc3Nvcn0tPntyZXBvcnR9OwoJCSRwbHVnaW4gPX4gcy86LyUzQS9nOwoJCSRwYXJhbWV0ZXJz +ID0gInNjcmVlbj0kcGx1Z2luIjsKCQkkcHJlZml4ID0gJHNlbGYtPntwcm9jZXNzb3J9LT57ZGF0 +YXNldGlkfTsKCQkkY29udGFpbmVyX2lkID0gc3ByaW50ZiggImVwX3JlcG9ydF8lc1xfY29udGFp +bmVyIiwgJHNlbGYtPntwcm9jZXNzb3J9LT57cmVwb3J0X3BsdWdpbn0tPntyZXBvcnR9ICk7Cgl9 +CgkKCSNzaG93L2hpZGUgY29tcGxpYW5jZQoJbXkgJHNob3dfY29tcGxpYW5jZSA9IDE7Cgkkc2hv +d19jb21wbGlhbmNlID0gJHNlbGYtPntzaG93X2NvbXBsaWFuY2V9IGlmIGRlZmluZWQgJHNlbGYt +PntzaG93X2NvbXBsaWFuY2V9OwoKCSNjdXN0b20gbGFiZWxzCglteSAkbGFiZWxzID0gMDsKCSRs +YWJlbHMgPSBlbmNvZGVfanNvbiAkc2VsZi0+e2xhYmVsc30gaWYgZGVmaW5lZCAkc2VsZi0+e2xh +YmVsc307CgoJJGNodW5rLT5hcHBlbmRDaGlsZCggJHJlcG8tPm1ha2VfamF2YXNjcmlwdCggPDwi +RU9KIiApICk7CmRvY3VtZW50Lm9ic2VydmUoImRvbTpsb2FkZWQiLCBmdW5jdGlvbigpIHsKCW5l +dyBFUHJpbnRzX1NjcmVlbl9SZXBvcnRfTG9hZGVyKCB7CgkJaWRzOiAkanNvbiwKCQlzdGVwOiAy +MCwKCQlwcmVmaXg6ICckcHJlZml4JywKCQl1cmw6ICckdXJsJywKCQlwYXJhbWV0ZXJzOiAnJHBh +cmFtZXRlcnMnLAkJCgkJY29udGFpbmVyX2lkOiAnJGNvbnRhaW5lcl9pZCcsCgkJc2hvd19jb21w +bGlhbmNlOiAkc2hvd19jb21wbGlhbmNlLAoJCWxhYmVsczogJGxhYmVscwoJfSApLmV4ZWN1dGUo +KTsKCn0pOwpFT0oKCSRjaHVuay0+YXBwZW5kQ2hpbGQoICRyZXBvLT5tYWtlX2VsZW1lbnQoICdk +aXYnLCBjbGFzcyA9PiAnZXBfcmVwb3J0X3BhZ2UnLCBpZCA9PiAkY29udGFpbmVyX2lkICkgKTsK +Cgkjc2hvdyBzZWFyY2ggY29udHJvbHMgYWZ0ZXIgdGhlIHJlc3VsdHMgdG9vCglpZiggJHNlbGYt +Pntwcm9jZXNzb3J9LT57YWN0aW9ufSBlcSAic2VhcmNoIiApCiAgICAgICAgewogICAgICAgICAg +ICAgICAgJGNodW5rLT5hcHBlbmRDaGlsZCggJHNlbGYtPnJlbmRlcl9yZWZpbmVfc2VhcmNoICk7 +CiAgICAgICAgfQoKCXJldHVybiAkY2h1bms7Cn0KCgpzdWIgcmVuZGVyX2V4cG9ydF9iYXIKewoJ +bXkoICRzZWxmICkgPSBAXzsKCglteSAkcmVwbyA9ICRzZWxmLT5yZXBvc2l0b3J5OwoKCW15ICRj +aHVuayA9ICRyZXBvLT5tYWtlX2RvY19mcmFnbWVudDsKCglteSBAcGx1Z2lucyA9ICRzZWxmLT5l +eHBvcnRfcGx1Z2luczsKCXJldHVybiAkY2h1bmsgdW5sZXNzKCBzY2FsYXIoIEBwbHVnaW5zICkg +fHwgZGVmaW5lZCggJHJlcG8tPmNvbmZpZyggJHNlbGYtPntleHBvcnRfY29uZn0sICJleHBvcnRm +aWVsZHMiICkgKSApOwoKCW15ICRyZXBvcnRfZHMgPSAkcmVwby0+ZGF0YXNldCggJHNlbGYtPntk +YXRhc2V0aWR9ICk7CglteSAkZm9ybSA9ICRzZWxmLT5yZW5kZXJfZm9ybTsKCSRmb3JtLT5zZXRB +dHRyaWJ1dGUoIG1ldGhvZCA9PiAiZ2V0IiApOwoKCWlmKCBkZWZpbmVkICRzZWxmLT5yZXBvc2l0 +b3J5LT5wYXJhbSggInNlYXJjaCIgKSB8fCAkc2VsZi0+e3Byb2Nlc3Nvcn0tPnthY3Rpb259IGVx +ICJzZWFyY2giICkKCXsKCQkkZm9ybS0+YXBwZW5kQ2hpbGQoICRyZXBvLT5yZW5kZXJfaGlkZGVu +X2ZpZWxkKCAic2VhcmNoIiwgICRzZWxmLT57cHJvY2Vzc29yfS0+e3NlYXJjaH0tPnNlcmlhbGlz +ZSkgKTsKCX0KCQkKCWlmKCBkZWZpbmVkICRzZWxmLT57cHJvY2Vzc29yfS0+e3NvcnR9ICkKCXsK +CQkkZm9ybS0+YXBwZW5kQ2hpbGQoICRyZXBvLT5yZW5kZXJfaGlkZGVuX2ZpZWxkKCAic29ydCIs +ICAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntzb3J0fSApICk7Cgl9CQoKCWlmKCBkZWZpbmVkICRzZWxm +LT57cHJvY2Vzc29yfS0+e2dyb3VwX2V4cH0gKQoJewoJCSRmb3JtLT5hcHBlbmRDaGlsZCggJHJl +cG8tPnJlbmRlcl9oaWRkZW5fZmllbGQoICJncm91cCIsICAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntn +cm91cF9leHB9ICkgKTsKCX0JCgoJaWYoICFkZWZpbmVkKCAkcmVwby0+Y29uZmlnKCAkc2VsZi0+ +e2V4cG9ydF9jb25mfSwgImV4cG9ydGZpZWxkcyIgKSApICkKCXsKCQkjbm8gY3VzdG9tIGV4cG9y +dCBmaWVsZHMgZGVmaW5lZCwgdXNlIGV4cG9ydCBwbHVnaW5zIGRlc2lnbmVkIGZvciB0aGlzIHJl +cG9ydAoJCW15ICRzZWxlY3QgPSAkZm9ybS0+YXBwZW5kQ2hpbGQoICRyZXBvLT5yZW5kZXJfb3B0 +aW9uX2xpc3QoCgkJCW5hbWUgPT4gJ2V4cG9ydCcsCgkJCXZhbHVlcyA9PiBbbWFwIHsgJF8tPmdl +dF9zdWJ0eXBlIH0gQHBsdWdpbnNdLAoJCQlsYWJlbHMgPT4ge21hcCB7ICRfLT5nZXRfc3VidHlw +ZSA9PiAkXy0+Z2V0X25hbWUgfSBAcGx1Z2luc30sCgkJKSApOwoJfQoJZWxzZQoJewoJCSNwcm92 +aWRlIGxpc3Qgb2YgZGVmYXVsdCBleHBvcnQgcGx1Z2lucyBmb3IgcmVwb3J0cwoJCUBwbHVnaW5z +ID0gJHNlbGYtPmV4cG9ydF9wbHVnaW5zKCAiZ2VuZXJpYyIgKTsKCQlteSAkc2VsZWN0ID0gJGZv +cm0tPmFwcGVuZENoaWxkKCAkcmVwby0+cmVuZGVyX29wdGlvbl9saXN0KAoJCQluYW1lID0+ICdl +eHBvcnQnLAoJCQl2YWx1ZXMgPT4gW21hcCB7ICRfLT5nZXRfc3VidHlwZSB9IEBwbHVnaW5zXSwK +CQkJbGFiZWxzID0+IHttYXAgeyAkXy0+Z2V0X3N1YnR5cGUgPT4gJF8tPmdldF9uYW1lIH0gQHBs +dWdpbnN9LAoJCSkgKTsKCgkJI2NyZWF0ZSBsYWJlbHMgYW5kIHBhbmVscyBmb3IgdGFiYmVkIGlu +dGVyZmFjZWQKCQlteSAkeG1sID0gJHJlcG8tPnhtbDsKCQlteSAkeGh0bWwgPSAkcmVwby0+eGh0 +bWw7CgoJCW15ICRzZWxlY3RfYWxsID0gJGZvcm0tPmFwcGVuZENoaWxkKCAkc2VsZi0+cmVuZGVy +X3NlbGVjdGFsbCggJHhtbCApICk7CgkJbXkgJHNlbGVjdF9idG4gPSAkZm9ybS0+YXBwZW5kQ2hp +bGQoICR4bWwtPmNyZWF0ZV9lbGVtZW50KCAiYnV0dG9uIiwKCSAgICAgICAgICAgICAgICAgICAg +dHlwZSA9PiAiYnV0dG9uIiwKCSAgICAgICAgICAgICAgICAgICAgb25jbGljayA9PiAidG9nZ2xl +Q2hlY2tib3hlcygpOyIsCgkgICAgICAgICAgICAgICAgICAgIGNsYXNzID0+ICJlcF9mb3JtX2Fj +dGlvbl9idXR0b24gc2VsZWN0X2J1dHRvbiIsCgkJKSApOwoJICAgIAkkc2VsZWN0X2J0bi0+YXBw +ZW5kQ2hpbGQoICR4bWwtPmNyZWF0ZV90ZXh0X25vZGUoICRyZXBvLT5odG1sX3BocmFzZSggInJl +cG9ydF9zZWxlY3QiICkgKSApOwoKCQkjYWxsb3cgdXNlciB0byBjaG9vc2Ugd2hpY2ggZmllbGRz +IHRoZXkgd2FudCB0byBleHBvcnQKCQlteSAkZXhwb3J0X29wdGlvbnMgPSAkcmVwby0+bWFrZV9l +bGVtZW50KCAiZGl2IiApOwoKCQlteSBAa2V5czsKCQlpZiggZGVmaW5lZCAkcmVwby0+Y29uZmln +KCAkc2VsZi0+e2V4cG9ydF9jb25mfSwgImV4cG9ydGZpZWxkX29yZGVyIiApICkKCQl7CgkJCUBr +ZXlzID0gQHskcmVwby0+Y29uZmlnKCAkc2VsZi0+e2V4cG9ydF9jb25mfSwgImV4cG9ydGZpZWxk +X29yZGVyIiApfTsKCQl9CgkJZWxzZQoJCXsKCQkJQGtleXMgPSBrZXlzICV7JHJlcG8tPmNvbmZp +ZyggJHNlbGYtPntleHBvcnRfY29uZn0sICJleHBvcnRmaWVsZHMiICl9OyAKCQl9CgkJZm9yZWFj +aCBteSAka2V5ICggQGtleXMgKQoJCXsKCQkJI2NyZWF0ZSBhIG5ldyBsaXN0CQkJCgkJCW15ICR1 +bCA9ICRyZXBvLT5tYWtlX2VsZW1lbnQoICJ1bCIsCgkgICAgICAgICAgICAgICAgCXN0eWxlID0+ +ICJsaXN0LXN0eWxlLXR5cGU6IG5vbmUiCgkgICAgICAgIAkpOwoJCQkKCQkJbXkgJGNvdW50ID0g +MDsgI2NvdW50IGhvdyBtYW55IGZpZWxkcyB3ZSBhZGQKCQkJZm9yZWFjaCBteSAkZmllbGRuYW1l +KCBAeyRyZXBvLT5jb25maWcoICRzZWxmLT57ZXhwb3J0X2NvbmZ9LCAiZXhwb3J0ZmllbGRzIiAp +LT57JGtleX19ICkKCQkJewoJCQkJaWYoIGRlZmluZWQgJHJlcG8tPmNvbmZpZyggJHNlbGYtPntl +eHBvcnRfY29uZn0sICJjdXN0b21fZXhwb3J0IiApICYmIGV4aXN0cyAkeyRyZXBvLT5jb25maWco +ICRzZWxmLT57ZXhwb3J0X2NvbmZ9LCAiY3VzdG9tX2V4cG9ydCIgKX17JGZpZWxkbmFtZX0gKSAj +d2UgaGF2ZSBhIGN1c3RvbSBleHBvcnQgZnVuY3Rpb24gaW5zdGVhZCAKCQkJCXsKCQkJCQkkY291 +bnQrKzsKCQkJCQkkc2VsZi0+X2V4cG9ydF9maWVsZF9jaGVja2JveCggJHJlcG8sICRmaWVsZG5h +bWUsICR1bCwgJHJlcG8tPmh0bWxfcGhyYXNlKCAiZXhwb3J0ZmllbGRvcHRpb25zOiRmaWVsZG5h +bWUiICkgKTsgCgkJCQl9CgkJCQllbHNpZiggZGVmaW5lZCBFUHJpbnRzOjpVdGlsczo6ZmllbGRf +ZnJvbV9jb25maWdfc3RyaW5nKCAkcmVwb3J0X2RzLCAkZmllbGRuYW1lICkgKQoJCQkJewoJCQkJ +CW15ICRmaWVsZCA9IEVQcmludHM6OlV0aWxzOjpmaWVsZF9mcm9tX2NvbmZpZ19zdHJpbmcoICRy +ZXBvcnRfZHMsICRmaWVsZG5hbWUgKTsKCQkJCQkkY291bnQrKzsKICAgICAgIAkJCSAgICAgICAg +CSRzZWxmLT5fZXhwb3J0X2ZpZWxkX2NoZWNrYm94KCAkcmVwbywgJGZpZWxkbmFtZSwgJHVsLCAk +ZmllbGQtPnJlbmRlcl9uYW1lICk7CgoJCQkJfQoJCQl9CgkJCWlmKCAkY291bnQgKSAjb25seSBh +ZGQgb3B0aW9ucyBpZiB3ZSBoYXZlIGFueSBmaWVsZHMgdG8gc2hvdwoJCQl7CgkJCQlteSAkZGl2 +ID0gJHJlcG8tPm1ha2VfZWxlbWVudCggImRpdiIsIGNsYXNzPT4icmVwb3J0X2V4cG9ydF9vcHRp +b25zIiApOwoJCQkJJGRpdi0+YXBwZW5kQ2hpbGQoIG15ICRoID0gJHJlcG8tPm1ha2VfZWxlbWVu +dCggImg0IiApICk7CgkJCQkkaC0+YXBwZW5kQ2hpbGQoICRyZXBvLT5odG1sX3BocmFzZSggImV4 +cG9ydGZpZWxkczoka2V5IiApICk7CQoJCQkJJGRpdi0+YXBwZW5kQ2hpbGQoICR1bCApOwoJCQkJ +JGV4cG9ydF9vcHRpb25zLT5hcHBlbmRDaGlsZCggJGRpdiApOwoJCQl9CiAgICAgICAJCX0KCQkk +Zm9ybS0+YXBwZW5kQ2hpbGQoICRleHBvcnRfb3B0aW9ucyApOwoJfQoKCSRmb3JtLT5hcHBlbmRD +aGlsZCggCgkJJHJlcG8tPnJlbmRlcl9idXR0b24oCgkJCW5hbWUgPT4gIl9hY3Rpb25fZXhwb3J0 +IiwKCQkJY2xhc3MgPT4gImVwX2Zvcm1fYWN0aW9uX2J1dHRvbiIsCgkJCXZhbHVlID0+ICRyZXBv +LT5waHJhc2UoICdjZ2kvdXNlcnMvZWRpdF9lcHJpbnQ6ZXhwb3J0JyApCgkpICk7CgoJI2NyZWF0 +ZSBhIGNvbGxhcHNpYmxlIGJveAoJbXkgJGltYWdlc3VybCA9ICRyZXBvLT5jdXJyZW50X3VybCgg +cGF0aCA9PiAic3RhdGljIiwgInN0eWxlL2ltYWdlcyIgKTsKCW15ICVvcHRpb25zOwoJJG9wdGlv +bnN7c2Vzc2lvbn0gPSAkcmVwbzsKICAgICAgICAkb3B0aW9uc3tpZH0gPSAiZXBfcmVwb3J0X2V4 +cG9ydCI7CiAgICAgICAgJG9wdGlvbnN7dGl0bGV9ID0gJHJlcG8tPmh0bWxfcGhyYXNlKCAiZXhw +b3J0X3RpdGxlIiApOwogICAgICAgICRvcHRpb25ze2NvbGxhcHNlZH0gPSAxOwoJJG9wdGlvbnN7 +Y29udGVudH0gPSAkZm9ybTsKICAgICAgICAkb3B0aW9uc3tzaG93X2ljb25fdXJsfSA9ICIkaW1h +Z2VzdXJsL211bHRpX2Rvd24ucG5nIjsKCSRvcHRpb25ze2hpZGVfaWNvbl91cmx9ID0gIiRpbWFn +ZXN1cmwvbXVsdGlfdXAucG5nIjsKCglteSAkYm94ID0gJHJlcG8tPm1ha2VfZWxlbWVudCggImRp +diIsIHN0eWxlPT4idGV4dC1hbGlnbjogbGVmdCIgKTsKCSRib3gtPmFwcGVuZENoaWxkKCBFUHJp +bnRzOjpCb3g6OnJlbmRlciggJW9wdGlvbnMgKSApOwoJJGNodW5rLT5hcHBlbmRDaGlsZCggJGJv +eCApOwoKCXJldHVybiAkY2h1bms7Cn0KCnN1YiByZW5kZXJfc29ydF9vcHRpb25zCnsKCW15KCAk +c2VsZiApID0gQF87CgoJbXkgJHJlcG8gPSAkc2VsZi0+cmVwb3NpdG9yeTsKCglteSAkY2h1bmsg +PSAkcmVwby0+bWFrZV9kb2NfZnJhZ21lbnQ7CgoJcmV0dXJuICRjaHVuayB1bmxlc3MoIGRlZmlu +ZWQoICRyZXBvLT5jb25maWcoICRzZWxmLT57c29ydF9jb25mfSwgInNvcnRmaWVsZHMiICkgKSAp +OwoKCW15ICRzb3J0X2NvbmYgPSAkcmVwby0+Y29uZmlnKCAkc2VsZi0+e3NvcnRfY29uZn0sICJz +b3J0ZmllbGRzIiApOwoKCSNidWlsZCB0aGUgZm9ybQoJbXkgJGZvcm0gPSAkc2VsZi0+cmVuZGVy +X2Zvcm07CgkkZm9ybS0+c2V0QXR0cmlidXRlKCBuYW1lID0+ICJzb3J0X3JlcG9ydCIgKTsKICAg +ICAgICAkZm9ybS0+c2V0QXR0cmlidXRlKCBtZXRob2QgPT4gImdldCIgKTsKCSRjaHVuay0+YXBw +ZW5kQ2hpbGQoICRmb3JtICk7CgkKCWlmKCBkZWZpbmVkICRyZXBvLT5wYXJhbSggInNlYXJjaCIg +KSB8fCAkc2VsZi0+e3Byb2Nlc3Nvcn0tPnthY3Rpb259IGVxICJzZWFyY2giICkKCXsKCQkkZm9y +bS0+YXBwZW5kQ2hpbGQoICRyZXBvLT5yZW5kZXJfaGlkZGVuX2ZpZWxkKCAic2VhcmNoIiwgICRz +ZWxmLT57cHJvY2Vzc29yfS0+e3NlYXJjaH0tPnNlcmlhbGlzZSkgKTsKCX0KCglpZiggZGVmaW5l +ZCAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntncm91cF9leHB9ICkKCXsKCQkkZm9ybS0+YXBwZW5kQ2hp +bGQoICRyZXBvLT5yZW5kZXJfaGlkZGVuX2ZpZWxkKCAiZ3JvdXAiLCAgJHNlbGYtPntwcm9jZXNz +b3J9LT57Z3JvdXBfZXhwfSApICk7Cgl9CgoJI2Rpc3BsYXkgdGhlIGxpbmtzIHRoYXQgd2lsbCB0 +cmlnZ2VyIHRoZSBmb3JtCglteSAkZmlyc3QgPSAxOwoJbXkgJHNvcnRfbGlua3MgPSAkcmVwby0+ +bWFrZV9kb2NfZnJhZ21lbnQ7Cglmb3JlYWNoIG15ICRzb3J0X25hbWUgKCBrZXlzICV7JHNvcnRf +Y29uZn0gKQogICAgICAgIHsKCQlteSAkc29ydF92YWx1ZSA9ICRzb3J0X2NvbmYtPnskc29ydF9u +YW1lfTsKCQlpZiggJGZpcnN0ICkKCQl7CgkJCSRmb3JtLT5hcHBlbmRDaGlsZCggJHJlcG8tPnJl +bmRlcl9oaWRkZW5fZmllbGQoICJzb3J0IiwgJHNvcnRfdmFsdWUpICk7CgkJfQoKCQlpZiggISRm +aXJzdCApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAJJHNvcnRfbGlua3MtPmFw +cGVuZENoaWxkKCAkcmVwby0+aHRtbF9waHJhc2UoICJVcGRhdGUvVmlld3M6Z3JvdXBfc2VwZXJh +dG9yIiApICk7CiAgICAgICAgICAgICAgICB9CgkJCgkJaWYoIGRlZmluZWQgJHNlbGYtPntwcm9j +ZXNzb3J9LT57c29ydH0gJiYgJHNlbGYtPntwcm9jZXNzb3J9LT57c29ydH0gZXEgJHNvcnRfdmFs +dWUgKQoJCXsKCQkJbXkgJHN0cm9uZyA9ICRyZXBvLT5tYWtlX2VsZW1lbnQoICJzdHJvbmciICk7 +CgkJCSRzdHJvbmctPmFwcGVuZENoaWxkKCAkcmVwby0+aHRtbF9waHJhc2UoICRzZWxmLT57c29y +dF9jb25mfSAuICI6c29ydDoiIC4gJHNvcnRfbmFtZSApICk7CgkJCSRzb3J0X2xpbmtzLT5hcHBl +bmRDaGlsZCggJHN0cm9uZyApOwoJCX0KCQllbHNlCgkJewoJCQlteSAkbGluayA9ICRyZXBvLT5y +ZW5kZXJfbGluayggJ2phdmFzY3JpcHQ6c29ydF9yZXBvcnQoIicuJHNvcnRfdmFsdWUuJyIpJyAp +OwkKCQkJJGxpbmstPmFwcGVuZENoaWxkKCAkcmVwby0+aHRtbF9waHJhc2UoICRzZWxmLT57c29y +dF9jb25mfSAuICI6c29ydDoiIC4gJHNvcnRfbmFtZSApICk7CgkJCSRzb3J0X2xpbmtzLT5hcHBl +bmRDaGlsZCggJGxpbmsgKTsKCQl9CgkJJGZpcnN0ID0gMDsKICAgICAgICB9ICAgICAgICAgICAK +CSRjaHVuay0+YXBwZW5kQ2hpbGQoICRyZXBvLT5odG1sX3BocmFzZSggIlJlcG9ydDpzb3J0X2xp +bmtzIiwgbGlua3M9PiRzb3J0X2xpbmtzICkgKTsKCXJldHVybiAkY2h1bms7Cn0KCnN1YiByZW5k +ZXJfZ3JvdXBfb3B0aW9ucwp7CglteSggJHNlbGYgKSA9IEBfOwoKCW15ICRyZXBvID0gJHNlbGYt +PnJlcG9zaXRvcnk7CgoJbXkgJGNodW5rID0gJHJlcG8tPm1ha2VfZG9jX2ZyYWdtZW50OwoKCXJl +dHVybiAkY2h1bmsgdW5sZXNzKCBkZWZpbmVkKCAkcmVwby0+Y29uZmlnKCAkc2VsZi0+e2dyb3Vw +X2NvbmZ9LCAiZ3JvdXBmaWVsZHMiICkgKSApOwoKCW15ICRncm91cF9jb25mID0gJHJlcG8tPmNv +bmZpZyggJHNlbGYtPntncm91cF9jb25mfSwgImdyb3VwZmllbGRzIiApOwoKCSNidWlsZCB0aGUg +Zm9ybQoJbXkgJGZvcm0gPSAkc2VsZi0+cmVuZGVyX2Zvcm07CgkkZm9ybS0+c2V0QXR0cmlidXRl +KCBuYW1lID0+ICJncm91cF9yZXBvcnQiICk7CiAgICAgICAgJGZvcm0tPnNldEF0dHJpYnV0ZSgg +bWV0aG9kID0+ICJnZXQiICk7CgkkY2h1bmstPmFwcGVuZENoaWxkKCAkZm9ybSApOwoJCglpZigg +ZGVmaW5lZCAkcmVwby0+cGFyYW0oICJzZWFyY2giICkgfHwgJHNlbGYtPntwcm9jZXNzb3J9LT57 +YWN0aW9ufSBlcSAic2VhcmNoIiApCgl7CgkJJGZvcm0tPmFwcGVuZENoaWxkKCAkcmVwby0+cmVu +ZGVyX2hpZGRlbl9maWVsZCggInNlYXJjaCIsICAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntzZWFyY2h9 +LT5zZXJpYWxpc2UpICk7Cgl9CgoJaWYoIGRlZmluZWQgJHNlbGYtPntwcm9jZXNzb3J9LT57c29y +dH0gKQoJewoJCSRmb3JtLT5hcHBlbmRDaGlsZCggJHJlcG8tPnJlbmRlcl9oaWRkZW5fZmllbGQo +ICJzb3J0IiwgICRzZWxmLT57cHJvY2Vzc29yfS0+e3NvcnR9ICkgKTsKCX0KCgkjZGlzcGxheSB0 +aGUgbGlua3MgdGhhdCB3aWxsIHRyaWdnZXIgdGhlIGZvcm0KCW15ICRmaXJzdCA9IDE7CglteSAk +Z3JvdXBfbGlua3MgPSAkcmVwby0+bWFrZV9kb2NfZnJhZ21lbnQ7Cglmb3JlYWNoIG15ICRncm91 +cF92YWx1ZSAoIEB7JGdyb3VwX2NvbmZ9ICkKICAgICAgICB7CgkJbXkgKCRncm91cF9maWVsZCkg +PSBzcGxpdCgvOy8sICRncm91cF92YWx1ZSApOwoJCWlmKCAkZmlyc3QgKQoJCXsKCQkJJGZvcm0t +PmFwcGVuZENoaWxkKCAkcmVwby0+cmVuZGVyX2hpZGRlbl9maWVsZCggImdyb3VwIiwgJGdyb3Vw +X3ZhbHVlKSApOwoJCX0KCgkJaWYoICEkZmlyc3QgKQogICAgICAgICAgICAgICAgewogICAgICAg +ICAgICAgICAgCSRncm91cF9saW5rcy0+YXBwZW5kQ2hpbGQoICRyZXBvLT5odG1sX3BocmFzZSgg IlVwZGF0ZS9WaWV3czpncm91cF9zZXBlcmF0b3IiICkgKTsKICAgICAgICAgICAgICAgIH0KCQkK -CQlpZiggZGVmaW5lZCAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntzb3J0fSAmJiAkc2VsZi0+e3Byb2Nl -c3Nvcn0tPntzb3J0fSBlcSAkc29ydF92YWx1ZSApCgkJewoJCQlteSAkc3Ryb25nID0gJHJlcG8t -Pm1ha2VfZWxlbWVudCggInN0cm9uZyIgKTsKCQkJJHN0cm9uZy0+YXBwZW5kQ2hpbGQoICRyZXBv -LT5odG1sX3BocmFzZSggJHNlbGYtPntzb3J0X2NvbmZ9IC4gIjpzb3J0OiIgLiAkc29ydF9uYW1l -ICkgKTsKCQkJJHNvcnRfbGlua3MtPmFwcGVuZENoaWxkKCAkc3Ryb25nICk7CgkJfQoJCWVsc2UK -CQl7CgkJCW15ICRsaW5rID0gJHJlcG8tPnJlbmRlcl9saW5rKCAnamF2YXNjcmlwdDpzb3J0X3Jl -cG9ydCgiJy4kc29ydF92YWx1ZS4nIiknICk7CQoJCQkkbGluay0+YXBwZW5kQ2hpbGQoICRyZXBv -LT5odG1sX3BocmFzZSggJHNlbGYtPntzb3J0X2NvbmZ9IC4gIjpzb3J0OiIgLiAkc29ydF9uYW1l -ICkgKTsKCQkJJHNvcnRfbGlua3MtPmFwcGVuZENoaWxkKCAkbGluayApOwoJCX0KCQkkZmlyc3Qg -PSAwOwogICAgICAgIH0gICAgICAgICAgIAoJJGNodW5rLT5hcHBlbmRDaGlsZCggJHJlcG8tPmh0 -bWxfcGhyYXNlKCAiUmVwb3J0OnNvcnRfbGlua3MiLCBsaW5rcz0+JHNvcnRfbGlua3MgKSApOwoJ -cmV0dXJuICRjaHVuazsKfQoKCnN1YiByZW5kZXJfZ3JvdXBfb3B0aW9ucwp7CglteSggJHNlbGYg -KSA9IEBfOwoKCW15ICRyZXBvID0gJHNlbGYtPnJlcG9zaXRvcnk7CgoJbXkgJGNodW5rID0gJHJl -cG8tPm1ha2VfZG9jX2ZyYWdtZW50OwoKCXJldHVybiAkY2h1bmsgdW5sZXNzKCBkZWZpbmVkKCAk -cmVwby0+Y29uZmlnKCAkc2VsZi0+e2dyb3VwX2NvbmZ9LCAiZ3JvdXBmaWVsZHMiICkgKSApOwoK -CW15ICRncm91cF9jb25mID0gJHJlcG8tPmNvbmZpZyggJHNlbGYtPntncm91cF9jb25mfSwgImdy -b3VwZmllbGRzIiApOwoKCSNidWlsZCB0aGUgZm9ybQoJbXkgJGZvcm0gPSAkc2VsZi0+cmVuZGVy -X2Zvcm07CgkkZm9ybS0+c2V0QXR0cmlidXRlKCBuYW1lID0+ICJncm91cF9yZXBvcnQiICk7CiAg -ICAgICAgJGZvcm0tPnNldEF0dHJpYnV0ZSggbWV0aG9kID0+ICJnZXQiICk7CgkkY2h1bmstPmFw -cGVuZENoaWxkKCAkZm9ybSApOwoJCglpZiggZGVmaW5lZCAkcmVwby0+cGFyYW0oICJzZWFyY2gi -ICkgfHwgJHNlbGYtPntwcm9jZXNzb3J9LT57YWN0aW9ufSBlcSAic2VhcmNoIiApCgl7CgkJJGZv -cm0tPmFwcGVuZENoaWxkKCAkcmVwby0+cmVuZGVyX2hpZGRlbl9maWVsZCggInNlYXJjaCIsICAk -c2VsZi0+e3Byb2Nlc3Nvcn0tPntzZWFyY2h9LT5zZXJpYWxpc2UpICk7Cgl9CgoJaWYoIGRlZmlu -ZWQgJHNlbGYtPntwcm9jZXNzb3J9LT57c29ydH0gKQoJewoJCSRmb3JtLT5hcHBlbmRDaGlsZCgg -JHJlcG8tPnJlbmRlcl9oaWRkZW5fZmllbGQoICJzb3J0IiwgICRzZWxmLT57cHJvY2Vzc29yfS0+ -e3NvcnR9ICkgKTsKCX0KCgkjZGlzcGxheSB0aGUgbGlua3MgdGhhdCB3aWxsIHRyaWdnZXIgdGhl -IGZvcm0KCW15ICRmaXJzdCA9IDE7CglteSAkZ3JvdXBfbGlua3MgPSAkcmVwby0+bWFrZV9kb2Nf -ZnJhZ21lbnQ7Cglmb3JlYWNoIG15ICRncm91cF92YWx1ZSAoIEB7JGdyb3VwX2NvbmZ9ICkKICAg -ICAgICB7CgkJbXkgKCRncm91cF9maWVsZCkgPSBzcGxpdCgvOy8sICRncm91cF92YWx1ZSApOwoJ -CWlmKCAkZmlyc3QgKQoJCXsKCQkJJGZvcm0tPmFwcGVuZENoaWxkKCAkcmVwby0+cmVuZGVyX2hp -ZGRlbl9maWVsZCggImdyb3VwIiwgJGdyb3VwX3ZhbHVlKSApOwoJCX0KCgkJaWYoICEkZmlyc3Qg -KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgCSRncm91cF9saW5rcy0+YXBwZW5k -Q2hpbGQoICRyZXBvLT5odG1sX3BocmFzZSggIlVwZGF0ZS9WaWV3czpncm91cF9zZXBlcmF0b3Ii -ICkgKTsKICAgICAgICAgICAgICAgIH0KCQkKCQlpZiggZGVmaW5lZCAkc2VsZi0+e3Byb2Nlc3Nv -cn0tPntncm91cH0gJiYgJHNlbGYtPntwcm9jZXNzb3J9LT57Z3JvdXB9IGVxICRncm91cF9maWVs -ZCApCgkJewoJCQlteSAkc3Ryb25nID0gJHJlcG8tPm1ha2VfZWxlbWVudCggInN0cm9uZyIgKTsK -CQkJJHN0cm9uZy0+YXBwZW5kQ2hpbGQoICRyZXBvLT5odG1sX3BocmFzZSggJHNlbGYtPntncm91 -cF9jb25mfSAuICI6Z3JvdXA6IiAuICRncm91cF9maWVsZCApICk7CgkJCSRncm91cF9saW5rcy0+ -YXBwZW5kQ2hpbGQoICRzdHJvbmcgKTsKCQl9CgkJZWxzZQoJCXsKCQkJbXkgJGxpbmsgPSAkcmVw -by0+cmVuZGVyX2xpbmsoICdqYXZhc2NyaXB0Omdyb3VwX3JlcG9ydCgiJy4kZ3JvdXBfdmFsdWUu -JyIpJyApOwkKCQkJJGxpbmstPmFwcGVuZENoaWxkKCAkcmVwby0+aHRtbF9waHJhc2UoICRzZWxm -LT57Z3JvdXBfY29uZn0gLiAiOmdyb3VwOiIgLiAkZ3JvdXBfZmllbGQgKSApOwoJCQkkZ3JvdXBf -bGlua3MtPmFwcGVuZENoaWxkKCAkbGluayApOwoJCX0KCQkkZmlyc3QgPSAwOwogICAgICAgIH0g -ICAgICAgICAgIAoJCgkjbm8gZ3JvdXBpbmcgbGluayBhdCB0aGUgZW5kCgkkZ3JvdXBfbGlua3Mt -PmFwcGVuZENoaWxkKCAkcmVwby0+aHRtbF9waHJhc2UoICJVcGRhdGUvVmlld3M6Z3JvdXBfc2Vw -ZXJhdG9yIiApICk7CglpZiggZGVmaW5lZCAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntncm91cH0gJiYg -JHNlbGYtPntwcm9jZXNzb3J9LT57Z3JvdXB9IG5lICIiICkKCXsKCQlteSAkbGluayA9ICRyZXBv -LT5yZW5kZXJfbGluayggJ2phdmFzY3JpcHQ6Z3JvdXBfcmVwb3J0KCIiKScgKTsJCgkJJGxpbmst -PmFwcGVuZENoaWxkKCAkcmVwby0+aHRtbF9waHJhc2UoICJyZXBvcnQ6bm9fZ3JvdXBpbmciICkg -KTsKCQkkZ3JvdXBfbGlua3MtPmFwcGVuZENoaWxkKCAkbGluayApOwoJfQoJZWxzZQoJewoJCW15 -ICRzdHJvbmcgPSAkcmVwby0+bWFrZV9lbGVtZW50KCAic3Ryb25nIiApOwogCQkkc3Ryb25nLT5h -cHBlbmRDaGlsZCggJHJlcG8tPmh0bWxfcGhyYXNlKCAicmVwb3J0Om5vX2dyb3VwaW5nIiApICk7 -CgkJJGdyb3VwX2xpbmtzLT5hcHBlbmRDaGlsZCggJHN0cm9uZyApOwoJfQoJCgkkY2h1bmstPmFw -cGVuZENoaWxkKCAkcmVwby0+aHRtbF9waHJhc2UoICJSZXBvcnQ6Z3JvdXBfbGlua3MiLCBsaW5r -cz0+JGdyb3VwX2xpbmtzICkgKTsKCglyZXR1cm4gJGNodW5rOwp9CgoKI2FkZHMgYSBuZXcgY2hl -Y2tib3ggdG8gYWxsb3cgdGhlIHVzZXIgdG8gY2hvb3NlIHdoaWNoIGZpZWxkcyB0byBleHBvcnQK -c3ViIF9leHBvcnRfZmllbGRfY2hlY2tib3gKewoJbXkoICRzZWxmLCAkcmVwbywgJGZpZWxkbmFt -ZSwgJHVsLCAkZmllbGRsYWJlbCApID0gQF87CgoJbXkgJGxpID0gJHJlcG8tPm1ha2VfZWxlbWVu -dCggImxpIiApOwoJJHVsLT5hcHBlbmRDaGlsZCggJGxpICk7CgogICAgICAgIG15ICRjaGVja2Jv -eCA9ICRyZXBvLT5tYWtlX2VsZW1lbnQoICJpbnB1dCIsIHR5cGUgPT4gImNoZWNrYm94IiwgaWQg -PT4gJGZpZWxkbmFtZSwgbmFtZSA9PiAkZmllbGRuYW1lLCB2YWx1ZSA9PiAkZmllbGRuYW1lICk7 -CglpZiggZGVmaW5lZCAkcmVwby0+Y29uZmlnKCAkc2VsZi0+e2V4cG9ydF9jb25mfSwgImV4cG9y -dGZpZWxkX2RlZmF1bHRzIiApICkKCXsKCQlpZiggKCBncmVwIHsgJGZpZWxkbmFtZSBlcSAkXyB9 -IEB7JHJlcG8tPmNvbmZpZyggJHNlbGYtPntleHBvcnRfY29uZn0sICJleHBvcnRmaWVsZF9kZWZh -dWx0cyIgKX0gKSB8fCAoIHNjYWxhciggQHskcmVwby0+Y29uZmlnKCAkc2VsZi0+e2V4cG9ydF9j -b25mfSwgImV4cG9ydGZpZWxkX2RlZmF1bHRzIiApfSApID09IDAgKSApCgkJewoJCQkjb25seSBj -aGVjayBkZWZhdWx0cyBvciBjaGVjayBldmVyeXRoaW5nIGlmIGRlZmF1bHRzIG5vdCBkZWZpbmVk -CgkJCSRjaGVja2JveC0+c2V0QXR0cmlidXRlKCAiY2hlY2tlZCIsICJ5ZXMiICk7CgkJfQoJfQoJ -bXkgJGxhYmVsID0gJHJlcG8tPm1ha2VfZWxlbWVudCggImxhYmVsIiwgZm9yID0+ICRmaWVsZG5h -bWUgKTsKCSRsYWJlbC0+YXBwZW5kQ2hpbGQoICRmaWVsZGxhYmVsICk7CgoJJGxpLT5hcHBlbmRD -aGlsZCggJGNoZWNrYm94ICk7CgkkbGktPmFwcGVuZENoaWxkKCAkbGFiZWwgKTsKfQoKIyMjIHV0 -aWxpdHkgbWV0aG9kcwoKIyBUT0RPIHNob3VsZCB1c2UgIkpTT04iIHBhY2thZ2UKc3ViIHRvX2pz -b24KewogICAgICAgIG15KCAkc2VsZiwgJG9iamVjdCApID0gQF87CgoJcmV0dXJuICIiIGlmKCAh -ZGVmaW5lZCAkb2JqZWN0ICk7CgojIFVURi04IGlzc3VlczoKIwlyZXR1cm4gSlNPTi0+bmV3LT51 -dGY4KDEpLT5lbmNvZGUoICRvYmplY3QgKTsKCiAgICAgICAgaWYoIHJlZiggJG9iamVjdCApIGVx -ICdIQVNIJyApCiAgICAgICAgewogICAgICAgICAgICAgICAgbXkgQHN0dWZmOwogICAgICAgICAg -ICAgICAgd2hpbGUoIG15KCAkaywgJHYgKSA9IGVhY2goICUkb2JqZWN0ICkgKQogICAgICAgICAg -ICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBuZXh0IGlmKCAhRVByaW50czo6VXRpbHM6 -OmlzX3NldCggJHYgKSApOyAgICAgICAjIG9yICdudWxsJyA/CiAgICAgICAgICAgICAgICAgICAg -ICAgIHB1c2ggQHN0dWZmLCBFUHJpbnRzOjpVdGlsczo6anNfc3RyaW5nKCAkayApLic6Jy4kc2Vs -Zi0+dG9fanNvbiggJHYgKQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJu -ICd7JyAuIGpvaW4oICIsIiwgQHN0dWZmICkgLiAnfSc7CiAgICAgICAgfQogICAgICAgIGVsc2lm -KCByZWYoICRvYmplY3QgKSBlcSAnQVJSQVknICkKICAgICAgICB7CiAgICAgICAgICAgICAgICBt -eSBAc3R1ZmY7CiAgICAgICAgICAgICAgICBmb3JlYWNoKCBAJG9iamVjdCApCiAgICAgICAgICAg -ICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgaWYoICFFUHJpbnRzOjpVdGlsczo6 -aXNfc2V0KCAkXyApICk7CiAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQHN0dWZmLCAkc2Vs -Zi0+dG9fanNvbiggJF8gKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVy -biAnWycgLiBqb2luKCAiLCIsIEBzdHVmZiApIC4gJ10nOwogICAgICAgIH0KCiAgICAgICAgcmV0 -dXJuIEVQcmludHM6OlV0aWxzOjpqc19zdHJpbmcoICRvYmplY3QgKTsKfQoKc3ViIGV4cG9ydF9w -bHVnaW5zCnsKICAgICAgICBteSggJHNlbGYsICRnZW5lcmljICkgPSBAXzsKCglteSBAcGx1Z2lu -X2lkczsKCWlmKCAkZ2VuZXJpYyApCgl7CiAJCUBwbHVnaW5faWRzID0gJHNlbGYtPnJlcG9zaXRv -cnktPnBsdWdpbl9saXN0KAogICAgICAgICAgICAgICAgCXR5cGUgPT4gIkV4cG9ydCIsCgkgICAg -ICAgICAgICAgICAgY2FuX2FjY2VwdCA9PiAicmVwb3J0L2dlbmVyaWMiLAogICAgICAgIAkgICAg -ICAgIGlzX3Zpc2libGUgPT4gInN0YWZmIiwKCQkJaXNfYWR2ZXJ0aXNlZCA9PiAxLAoJICAgICAg -ICApOwoJfQoJZWxzZQoJewogICAgICAgIAlAcGx1Z2luX2lkcyA9ICRzZWxmLT5yZXBvc2l0b3J5 +CQlpZiggZGVmaW5lZCAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntncm91cH0gJiYgJHNlbGYtPntwcm9j +ZXNzb3J9LT57Z3JvdXB9IGVxICRncm91cF9maWVsZCApCgkJewoJCQlteSAkc3Ryb25nID0gJHJl +cG8tPm1ha2VfZWxlbWVudCggInN0cm9uZyIgKTsKCQkJJHN0cm9uZy0+YXBwZW5kQ2hpbGQoICRy +ZXBvLT5odG1sX3BocmFzZSggJHNlbGYtPntncm91cF9jb25mfSAuICI6Z3JvdXA6IiAuICRncm91 +cF9maWVsZCApICk7CgkJCSRncm91cF9saW5rcy0+YXBwZW5kQ2hpbGQoICRzdHJvbmcgKTsKCQl9 +CgkJZWxzZQoJCXsKCQkJbXkgJGxpbmsgPSAkcmVwby0+cmVuZGVyX2xpbmsoICdqYXZhc2NyaXB0 +Omdyb3VwX3JlcG9ydCgiJy4kZ3JvdXBfdmFsdWUuJyIpJyApOwkKCQkJJGxpbmstPmFwcGVuZENo +aWxkKCAkcmVwby0+aHRtbF9waHJhc2UoICRzZWxmLT57Z3JvdXBfY29uZn0gLiAiOmdyb3VwOiIg +LiAkZ3JvdXBfZmllbGQgKSApOwoJCQkkZ3JvdXBfbGlua3MtPmFwcGVuZENoaWxkKCAkbGluayAp +OwoJCX0KCQkkZmlyc3QgPSAwOwogICAgICAgIH0gICAgICAgICAgIAoJCgkjbm8gZ3JvdXBpbmcg +bGluayBhdCB0aGUgZW5kCgkkZ3JvdXBfbGlua3MtPmFwcGVuZENoaWxkKCAkcmVwby0+aHRtbF9w +aHJhc2UoICJVcGRhdGUvVmlld3M6Z3JvdXBfc2VwZXJhdG9yIiApICk7CglpZiggZGVmaW5lZCAk +c2VsZi0+e3Byb2Nlc3Nvcn0tPntncm91cH0gJiYgJHNlbGYtPntwcm9jZXNzb3J9LT57Z3JvdXB9 +IG5lICIiICkKCXsKCQlteSAkbGluayA9ICRyZXBvLT5yZW5kZXJfbGluayggJ2phdmFzY3JpcHQ6 +Z3JvdXBfcmVwb3J0KCIiKScgKTsJCgkJJGxpbmstPmFwcGVuZENoaWxkKCAkcmVwby0+aHRtbF9w +aHJhc2UoICJyZXBvcnQ6bm9fZ3JvdXBpbmciICkgKTsKCQkkZ3JvdXBfbGlua3MtPmFwcGVuZENo +aWxkKCAkbGluayApOwoJfQoJZWxzZQoJewoJCW15ICRzdHJvbmcgPSAkcmVwby0+bWFrZV9lbGVt +ZW50KCAic3Ryb25nIiApOwogCQkkc3Ryb25nLT5hcHBlbmRDaGlsZCggJHJlcG8tPmh0bWxfcGhy +YXNlKCAicmVwb3J0Om5vX2dyb3VwaW5nIiApICk7CgkJJGdyb3VwX2xpbmtzLT5hcHBlbmRDaGls +ZCggJHN0cm9uZyApOwoJfQoJCgkkY2h1bmstPmFwcGVuZENoaWxkKCAkcmVwby0+aHRtbF9waHJh +c2UoICJSZXBvcnQ6Z3JvdXBfbGlua3MiLCBsaW5rcz0+JGdyb3VwX2xpbmtzICkgKTsKCglyZXR1 +cm4gJGNodW5rOwp9CgpzdWIgcmVuZGVyX3JlZmluZV9zZWFyY2gKewoJbXkoICRzZWxmICkgPSBA +XzsKCglteSAkcmVwbyA9ICRzZWxmLT5yZXBvc2l0b3J5OwoKCW15ICRjaHVuayA9ICRyZXBvLT5t +YWtlX2RvY19mcmFnbWVudDsKCQoJaWYoIGRlZmluZWQgJHJlcG8tPnBhcmFtKCAic2VhcmNoIiAp +IHx8ICRzZWxmLT57cHJvY2Vzc29yfS0+e2FjdGlvbn0gZXEgInNlYXJjaCIgKQoJewoJCW15ICRl +c2NleHAgPSAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntzZWFyY2h9LT5zZXJpYWxpc2U7CgkJbXkgJGNh +Y2hlaWQgPSAkcmVwby0+cGFyYW0oICJjYWNoZSIgKTsKCQlteSAkc2NvbmYgPSAkc2VsZi0+e3Nj +b25mfTsJCgoJCSNzZXQgdXAgbmV3IHNlYXJjaCBsaW5rCgkJbXkgJG5ld19iYXNldXJsID0gVVJJ +LT5uZXcoICRzZWxmLT57c2Vzc2lvbn0tPmdldF91cmkgKTsKICAgICAgICAJJG5ld19iYXNldXJs +LT5xdWVyeV9mb3JtKAoJICAgICAgICAgICAgICAgIHNjcmVlbiA9PiAiUmVwb3J0IiwKCQkJc2Nv +bmYgPT4gJHNjb25mLAogICAgICAgIAkpOwoKCQlteSAkc2VhcmNoX2xpbmtzID0gJHJlcG8tPm1h +a2VfZG9jX2ZyYWdtZW50OwoJCW15ICRuZXdfbGluayA9ICRyZXBvLT5yZW5kZXJfbGluayggIiRu +ZXdfYmFzZXVybCZfYWN0aW9uX25ld3NlYXJjaD0xIiApOwoJICAgCSRuZXdfbGluay0+YXBwZW5k +Q2hpbGQoICRyZXBvLT5odG1sX3BocmFzZSggImxpYi9zZWFyY2hleHByZXNzaW9uOm5ldyIgKSAp +OwoJCSRzZWFyY2hfbGlua3MtPmFwcGVuZENoaWxkKCAkbmV3X2xpbmsgKTsKCgkJI2FkZCBhIHNl +cGFyYXRvci4uLgoJCSRzZWFyY2hfbGlua3MtPmFwcGVuZENoaWxkKCAkcmVwby0+aHRtbF9waHJh +c2UoICJVcGRhdGUvVmlld3M6Z3JvdXBfc2VwZXJhdG9yIiApICk7CgoJCSNzZXQgdXAgcmVmaW5l +IHNlYXJjaCBsaW5rCgkJbXkgJHJlZmluZV9iYXNldXJsID0gVVJJLT5uZXcoICRzZWxmLT57c2Vz +c2lvbn0tPmdldF91cmkgKTsKICAgICAgICAJJHJlZmluZV9iYXNldXJsLT5xdWVyeV9mb3JtKAoJ +ICAgICAgICAJY2FjaGUgPT4gJGNhY2hlaWQsCgkgICAgICAgICAgICAgICAgZXhwID0+ICRlc2Nl +eHAsCiAgICAgICAgCSAgICAgICAgc2NyZWVuID0+ICJSZXBvcnQiLAogICAgICAgICAgICAgICAg +CWRhdGFzZXQgPT4gJHNlbGYtPntkYXRhc2V0aWR9LAogICAgICAgICAgICAgICAgCW9yZGVyID0+ +ICRzZWxmLT57cHJvY2Vzc29yfS0+e3NlYXJjaH0tPntjdXN0b21fb3JkZXJ9LAoJCQlzY29uZiA9 +PiAkc2NvbmYsCiAgICAgICAgCSk7CgoJCW15ICRyZWZpbmVfbGluayA9ICRyZXBvLT5yZW5kZXJf +bGluayggIiRyZWZpbmVfYmFzZXVybCZfYWN0aW9uX3VwZGF0ZT0xIiApOwogICAgICAJCSRyZWZp +bmVfbGluay0+YXBwZW5kQ2hpbGQoICRyZXBvLT5odG1sX3BocmFzZSggImxpYi9zZWFyY2hleHBy +ZXNzaW9uOnJlZmluZSIgKSApOyAgIAkgICAgICAgICAKCSAgICAgICAgJHNlYXJjaF9saW5rcy0+ +YXBwZW5kQ2hpbGQoICRyZWZpbmVfbGluayApOwoKCQkkY2h1bmstPmFwcGVuZENoaWxkKCAkcmVw +by0+aHRtbF9waHJhc2UoICJSZXBvcnQ6c2VhcmNoX2xpbmtzIiwgbGlua3M9PiRzZWFyY2hfbGlu +a3MgKSApOwoJfQoKCXJldHVybiAkY2h1bms7Cn0KCgojYWRkcyBhIG5ldyBjaGVja2JveCB0byBh +bGxvdyB0aGUgdXNlciB0byBjaG9vc2Ugd2hpY2ggZmllbGRzIHRvIGV4cG9ydApzdWIgX2V4cG9y +dF9maWVsZF9jaGVja2JveAp7CglteSggJHNlbGYsICRyZXBvLCAkZmllbGRuYW1lLCAkdWwsICRm +aWVsZGxhYmVsICkgPSBAXzsKCglteSAkbGkgPSAkcmVwby0+bWFrZV9lbGVtZW50KCAibGkiICk7 +CgkkdWwtPmFwcGVuZENoaWxkKCAkbGkgKTsKCiAgICAgICAgbXkgJGNoZWNrYm94ID0gJHJlcG8t +Pm1ha2VfZWxlbWVudCggImlucHV0IiwgdHlwZSA9PiAiY2hlY2tib3giLCBpZCA9PiAkZmllbGRu +YW1lLCBuYW1lID0+ICRmaWVsZG5hbWUsIHZhbHVlID0+ICRmaWVsZG5hbWUgKTsKCWlmKCBkZWZp +bmVkICRyZXBvLT5jb25maWcoICRzZWxmLT57ZXhwb3J0X2NvbmZ9LCAiZXhwb3J0ZmllbGRfZGVm +YXVsdHMiICkgKQoJewoJCWlmKCAoIGdyZXAgeyAkZmllbGRuYW1lIGVxICRfIH0gQHskcmVwby0+ +Y29uZmlnKCAkc2VsZi0+e2V4cG9ydF9jb25mfSwgImV4cG9ydGZpZWxkX2RlZmF1bHRzIiApfSAp +IHx8ICggc2NhbGFyKCBAeyRyZXBvLT5jb25maWcoICRzZWxmLT57ZXhwb3J0X2NvbmZ9LCAiZXhw +b3J0ZmllbGRfZGVmYXVsdHMiICl9ICkgPT0gMCApICkKCQl7CgkJCSNvbmx5IGNoZWNrIGRlZmF1 +bHRzIG9yIGNoZWNrIGV2ZXJ5dGhpbmcgaWYgZGVmYXVsdHMgbm90IGRlZmluZWQKCQkJJGNoZWNr +Ym94LT5zZXRBdHRyaWJ1dGUoICJjaGVja2VkIiwgInllcyIgKTsKCQl9Cgl9CglteSAkbGFiZWwg +PSAkcmVwby0+bWFrZV9lbGVtZW50KCAibGFiZWwiLCBmb3IgPT4gJGZpZWxkbmFtZSApOwoJJGxh +YmVsLT5hcHBlbmRDaGlsZCggJGZpZWxkbGFiZWwgKTsKCgkkbGktPmFwcGVuZENoaWxkKCAkY2hl +Y2tib3ggKTsKCSRsaS0+YXBwZW5kQ2hpbGQoICRsYWJlbCApOwp9CgojIyMgdXRpbGl0eSBtZXRo +b2RzCgojIFRPRE8gc2hvdWxkIHVzZSAiSlNPTiIgcGFja2FnZQpzdWIgdG9fanNvbgp7CiAgICAg +ICAgbXkoICRzZWxmLCAkb2JqZWN0ICkgPSBAXzsKCglyZXR1cm4gIiIgaWYoICFkZWZpbmVkICRv +YmplY3QgKTsKCiMgVVRGLTggaXNzdWVzOgojCXJldHVybiBKU09OLT5uZXctPnV0ZjgoMSktPmVu +Y29kZSggJG9iamVjdCApOwoKICAgICAgICBpZiggcmVmKCAkb2JqZWN0ICkgZXEgJ0hBU0gnICkK +ICAgICAgICB7CiAgICAgICAgICAgICAgICBteSBAc3R1ZmY7CiAgICAgICAgICAgICAgICB3aGls +ZSggbXkoICRrLCAkdiApID0gZWFjaCggJSRvYmplY3QgKSApCiAgICAgICAgICAgICAgICB7CiAg +ICAgICAgICAgICAgICAgICAgICAgIG5leHQgaWYoICFFUHJpbnRzOjpVdGlsczo6aXNfc2V0KCAk +diApICk7ICAgICAgICMgb3IgJ251bGwnID8KICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCBA +c3R1ZmYsIEVQcmludHM6OlV0aWxzOjpqc19zdHJpbmcoICRrICkuJzonLiRzZWxmLT50b19qc29u +KCAkdiApCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gJ3snIC4gam9p +biggIiwiLCBAc3R1ZmYgKSAuICd9JzsKICAgICAgICB9CiAgICAgICAgZWxzaWYoIHJlZiggJG9i +amVjdCApIGVxICdBUlJBWScgKQogICAgICAgIHsKICAgICAgICAgICAgICAgIG15IEBzdHVmZjsK +ICAgICAgICAgICAgICAgIGZvcmVhY2goIEAkb2JqZWN0ICkKICAgICAgICAgICAgICAgIHsKICAg +ICAgICAgICAgICAgICAgICAgICAgbmV4dCBpZiggIUVQcmludHM6OlV0aWxzOjppc19zZXQoICRf +ICkgKTsKICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCBAc3R1ZmYsICRzZWxmLT50b19qc29u +KCAkXyApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuICdbJyAuIGpv +aW4oICIsIiwgQHN0dWZmICkgLiAnXSc7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gRVByaW50 +czo6VXRpbHM6OmpzX3N0cmluZyggJG9iamVjdCApOwp9CgpzdWIgZXhwb3J0X3BsdWdpbnMKewog +ICAgICAgIG15KCAkc2VsZiwgJGdlbmVyaWMgKSA9IEBfOwoKCW15IEBwbHVnaW5faWRzOwoJCglt +eSAkcmVwbyA9ICRzZWxmLT5yZXBvc2l0b3J5OwoKCWlmKCBkZWZpbmVkICRyZXBvLT5jb25maWco +ICRzZWxmLT57ZXhwb3J0X2NvbmZ9LCAiZXhwb3J0X3BsdWdpbnMiICkgKQoJewoJCUBwbHVnaW5f +aWRzID0gQHskcmVwby0+Y29uZmlnKCAkc2VsZi0+e2V4cG9ydF9jb25mfSwgImV4cG9ydF9wbHVn +aW5zIiApfTsKCX0JCgllbHNpZiggJGdlbmVyaWMgKQoJewogCQlAcGx1Z2luX2lkcyA9ICRyZXBv LT5wbHVnaW5fbGlzdCgKICAgICAgICAgICAgICAgIAl0eXBlID0+ICJFeHBvcnQiLAoJICAgICAg -ICAgICAgICAgIGNhbl9hY2NlcHQgPT4gInJlcG9ydC8iLiRzZWxmLT5nZXRfcmVwb3J0LAogICAg -ICAgIAkgICAgICAgIGlzX3Zpc2libGUgPT4gInN0YWZmIiwKCQkJaXNfYWR2ZXJ0aXNlZCA9PiAx -LAoJICAgICAgICApOwogICAgICAgIH0KCW15IEBwbHVnaW5zOwoJZm9yZWFjaCBteSAkaWQgKCBA -cGx1Z2luX2lkcyApCiAgICAgICAgewogICAgICAgICAgICAgICAgbXkgJHAgPSAkc2VsZi0+cmVw -b3NpdG9yeS0+cGx1Z2luKCAiJGlkIiApIG9yIG5leHQ7CiAgICAgICAgICAgICAgICBwdXNoIEBw -bHVnaW5zLCAkcDsKICAgICAgICB9CgogICAgICAgIHJldHVybiBAcGx1Z2luczsKfQoKc3ViIHJl -cG9ydF9wbHVnaW5zCnsKCW15KCAkc2VsZiApID0gQF87CgoJIyBzZjIgLSBjYW4ndCBsaXN0IHZp -YSB0eXBlID0+ICJTZWFyY2g6OlJlcG9ydCIgPyAKICAgICAgICBteSBAcGx1Z2luX2lkcyA9ICRz -ZWxmLT5yZXBvc2l0b3J5LT5wbHVnaW5fbGlzdCgKICAgICAgICAgICAgICAgIHR5cGUgPT4gIlNj -cmVlbiIsCiAgICAgICAgKTsKCiAgICAgICAgbXkgQHBsdWdpbnM7Cglmb3JlYWNoIG15ICRpZCAo -IEBwbHVnaW5faWRzICkKICAgICAgICB7CgkJbmV4dCBpZiggJGlkICF+IC9eU2NyZWVuOjpSZXBv -cnQ6Oi8gKTsJIyBub3RlIHRoaXMgYWxzbyBmaWx0ZXJzIG91dCAkc2VsZiAoYWthIFNjcmVlbjo6 -UmVwb3J0KQoKICAgICAgICAgICAgICAgIG15ICRwID0gJHNlbGYtPnJlcG9zaXRvcnktPnBsdWdp -biggIiRpZCIgKTsKCQluZXh0IGlmKCAhZGVmaW5lZCAkcCB8fCAhJHAtPmNhbl9iZV92aWV3ZWQg -KTsKCiAgICAgICAgICAgICAgICBwdXNoIEBwbHVnaW5zLCAkcDsKICAgICAgICB9CgogICAgICAg -IHJldHVybiBAcGx1Z2luczsKfQoKI3JldHVybnMgYSBoYXNoIG9mIHZhbHVlcyBtYXBwZWQgdG8g -YSBsYWJlbCBhbmQgYSBsaXN0CiNpZiBpZHNfb25seSBpcyBzZXQgdGhlIGxpc3Qgb2YgaXRlbXMg -YXJlIGp1c3QgcmVwcmVzZW50ZWQgYnkgdGhlaXIgaWQgKHVzZWQgYnkgcmVwb3J0IEpTKQpzdWIg -Z2V0X2dyb3VwZWRfaXRlbXMKewoJbXkoICRzZWxmLCAkaXRlbXMsICRpZHNfb25seSApID0gQF87 -CglteSAkc2Vzc2lvbiA9ICRzZWxmLT57c2Vzc2lvbn07CglteSAlZ3JvdXBlZDsKCglteSAkZ3Jv -dXBpbmcgPSAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntncm91cH07CgoJbXkgJG1ldGFmaWVsZCA9ICRp -dGVtcy0+Z2V0X2RhdGFzZXQtPmZpZWxkKCAkZ3JvdXBpbmcgKTsKCgkjc2V0IGdyb3VwX29wdHMg -aWYgYXBwcm9wcmlhdGUKCWlmKCBkZWZpbmVkICRzZWxmLT57cHJvY2Vzc29yfS0+e2dyb3VwX29w -dHN9ICkKCXsKCQlpZiggJG1ldGFmaWVsZC0+dHlwZSBlcSAiZGF0ZSIgKQoJCXsKCQkJJG1ldGFm -aWVsZC0+e3JlbmRlcl9yZXN9ID0gJHNlbGYtPntwcm9jZXNzb3J9LT57Z3JvdXBfb3B0c30tPnty -ZXN9IGlmIGV4aXN0cyAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntncm91cF9vcHRzfS0+e3Jlc307CgkJ -fQoJfQoKCSNjcmVhdGUgYSBoYXNoIG9mIGZpZWxkIHZhbHVlcyB0byBpdGVtcyAob3IgaXRlbSBp -ZHMpCgkkaXRlbXMtPm1hcCggc3ViIHsKCSAgICAgICAJbXkoICRzZXNzaW9uLCAkZGF0YXNldCwg -JGl0ZW0gKSA9IEBfOwoJCQoJCW15ICRtdWx0aXBsZSA9ICRtZXRhZmllbGQtPmdldF9wcm9wZXJ0 -eSggIm11bHRpcGxlIiApOwoJCW15IEBncm91cF92YWx1ZXM7CgkJaWYoICRtdWx0aXBsZSApCiAg -ICAgICAgICAgICAgICB7CgkJCUBncm91cF92YWx1ZXMgPSBAeyRpdGVtLT52YWx1ZSggJGdyb3Vw -aW5nICl9OwoJCX0KCQllbHNlCgkJewkJCQoJCQlAZ3JvdXBfdmFsdWVzID0gKCRpdGVtLT52YWx1 -ZSggJGdyb3VwaW5nICkpOwoJCX0KCQoJCWlmKCBzY2FsYXIgQGdyb3VwX3ZhbHVlcyA+IDAgKQoJ -CXsKCQkJZm9yZWFjaCBteSAkZ3JvdXBfdmFsdWUgKCBAZ3JvdXBfdmFsdWVzICkKCQkJewoJCQkJ -bXkgJGdyb3VwX2lkID0gJG1ldGFmaWVsZC0+Z2V0X2lkX2Zyb21fdmFsdWUoICRzZXNzaW9uLCAk -Z3JvdXBfdmFsdWUgKTsKCQkJCSN0cnVuY2F0ZSBncm91cCBpZiBhcHByb3ByaWF0ZQoJCQkJaWYo -IGRlZmluZWQgJHNlbGYtPntwcm9jZXNzb3J9LT57Z3JvdXBfb3B0c30gKQoJCQkJewoJCQkJCSRn -cm91cF9pZCA9ICBzdWJzdHIoICJcdSRncm91cF9pZCIsIDAsICRzZWxmLT57cHJvY2Vzc29yfS0+ -e2dyb3VwX29wdHN9LT57dHJ1bmNhdGV9ICkgaWYgZXhpc3RzICRzZWxmLT57cHJvY2Vzc29yfS0+ -e2dyb3VwX29wdHN9LT57dHJ1bmNhdGV9OwoJCQkJfQoKCQkgICAgICAgIAlpZiggZXhpc3RzICRn -cm91cGVkeyRncm91cF9pZH0gKSAjd2UndmUgYWxyZWFkeSBzZXQgdGhpcyBsaXN0IHVwLCBwdXNo -IGEgbmV3IGl0ZW0gb24gdG8gdGhlIGxpc3QKCQkgICAgICAgICAgICAgICAJewoJCQkJCWlmKCAk -aWRzX29ubHkgKSAjc29tZXRpbWVzIHdlIG9ubHkgd2FudCBpZHMgcmF0aGVyIHRoYW4gdGhlIHdo -b2xlIGl0ZW0KCQkJCQl7CgkJCQkJCXB1c2ggQHskZ3JvdXBlZHskZ3JvdXBfaWR9fSwgJGl0ZW0t -PmlkOwoJCQkJCX0KCQkJCQllbHNlCgkJCQkJewoJCQkJCQlwdXNoIEB7JGdyb3VwZWR7JGdyb3Vw -X2lkfX0sICRpdGVtOwoJCQkJCX0KCSAgICAgICAJCSAgICAgICAgfQogICAgICAgIAkgICAgICAJ -CWVsc2UgI3NldCB1cCBhIGxpc3QgZm9yIHRoaXMgZ3JvdXAKCSAgICAgICAgCSAgICAgICAJewoJ -CQkJCW15IEBncm91cGVkX2l0ZW1zOwoJCQkJCWlmKCAkaWRzX29ubHkgKSAjc29tZXRpbWVzIHdl -IG9ubHkgd2FudCBpZHMgcmF0aGVyIHRoYW4gdGhlIHdob2xlIGl0ZW0KCQkgICAgICAgICAgICAg -ICAgICAgICAgICB7CQogICAgICAgIAkJICAgICAgICAgICAgICAgICAgICAgICAgQGdyb3VwZWRf -aXRlbXMgPSAoJGl0ZW0tPmlkKTsKICAgICAgICAgICAgICAgIAkJICAgICAgICB9CgkgICAgICAg -ICAgICAgICAgCSAgICAgICAgZWxzZQogICAgICAgIAkgICAgICAgICAgICAgICAgCXsKCSAgICAg -ICAgICAgICAgICAJICAgICAgICAgICAgICAgIEBncm91cGVkX2l0ZW1zID0gKCRpdGVtKTsKICAg -ICAgICAJCSAgICAgICAgICAgICAgIAl9CgkgICAgICAgICAgICAgICAgCSAgICAgICAgJGdyb3Vw -ZWR7JGdyb3VwX2lkfSA9IFtAZ3JvdXBlZF9pdGVtc107CgkJCQl9CiAgICAgICAgICAgICAgIAkJ -fQoJCX0KCQllbHNlCgkJewoJCQlteSAkZ3JvdXBfaWQgPSAiVW5zcGVjaWZpZWQgIiAuICRtZXRh -ZmllbGQtPm5hbWU7CiAgCSAgICAJCWlmKCBleGlzdHMgJGdyb3VwZWR7JGdyb3VwX2lkfSApICN3 -ZSd2ZSBhbHJlYWR5IHNldCB0aGlzIGxpc3QgdXAsIHB1c2ggYSBuZXcgaXRlbSBvbiB0byB0aGUg -bGlzdAoJCSAgCXsKCQkJCWlmKCAkaWRzX29ubHkgKSAjc29tZXRpbWVzIHdlIG9ubHkgd2FudCBp -ZHMgcmF0aGVyIHRoYW4gdGhlIHdob2xlIGl0ZW0KCQkJCXsKCQkJCQlwdXNoIEB7JGdyb3VwZWR7 -JGdyb3VwX2lkfX0sICRpdGVtLT5pZDsKCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQlwdXNoIEB7 -JGdyb3VwZWR7JGdyb3VwX2lkfX0sICRpdGVtOwoJCQkJfQoJICAgICAgIAkJfQogICAgICAgIAkg -ICAgICAJZWxzZSAjc2V0IHVwIGEgbGlzdCBmb3IgdGhpcyBncm91cAoJICAgICAgICAJewoJCQkJ -bXkgQGdyb3VwZWRfaXRlbXM7CgkJCQlpZiggJGlkc19vbmx5ICkgI3NvbWV0aW1lcyB3ZSBvbmx5 -IHdhbnQgaWRzIHJhdGhlciB0aGFuIHRoZSB3aG9sZSBpdGVtCgkJICAgICAgICAgICAgICAgIHsJ -CiAgICAgICAgCQkJCUBncm91cGVkX2l0ZW1zID0gKCRpdGVtLT5pZCk7CiAgICAgICAgICAgICAg -ICAJCX0KCSAgICAgICAgICAgICAgICAJZWxzZQogICAgICAgIAkgICAgICAgICAgICAgICAgewoJ -ICAgICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBAZ3JvdXBlZF9pdGVtcyA9ICgkaXRlbSk7 -CiAgICAgICAgCSAgICAgICAgICAgICAgIAl9CgkgICAgICAgICAgICAgIAkgICAgICAgICRncm91 -cGVkeyRncm91cF9pZH0gPSBbQGdyb3VwZWRfaXRlbXNdOwoJCQl9CgkJfQogICAgICAgCX0gKTsK -Cgkjbm93IHNvcnQgdGhlIGdyb3VwcyBhbmQgYWRkIGh1bWFuIHJlYWRhYmxlIGxhYmVscwoJbXkg -QHNvcnRlZF9ncm91cHM7CgkKCW15ICRyZXZlcnNlID0gMDsKCSRyZXZlcnNlID0gJHNlbGYtPntw -cm9jZXNzb3J9LT57Z3JvdXBfb3B0c30tPntyZXZlcnNlX29yZGVyfSBpZiBleGlzdHMgJHNlbGYt -Pntwcm9jZXNzb3J9LT57Z3JvdXBfb3B0c30tPntyZXZlcnNlX29yZGVyfTsKCWlmKCAkbWV0YWZp -ZWxkLT50eXBlIGVxICJuYW1lZHNldCIgKQoJewoJCW15KCAkdGFncywgJGxhYmVscyApID0gJG1l -dGFmaWVsZC0+dGFnc19hbmRfbGFiZWxzKCAkc2Vzc2lvbiApOwoJCSNjb252ZXJ0IHRhZ3MgdG8g -YSBoYXNoIG9mIHZhbHVlcyBhbmQgYSBwcmlvcml0eSAoZm9yIG9yZGVyaW5nKQoJCW15ICVwcmlv -cml0eTsKCQlteSAkaW5kZXggPSAxOwoJCWZvcmVhY2ggbXkgJHRhZyAoQHskdGFnc30gKQoJCXsK -CQkJJHByaW9yaXR5eyR0YWd9ID0gJGluZGV4OwoJCQkkaW5kZXgrKzsKCQl9CgkJZm9yZWFjaCBt -eSAka2V5IChzb3J0IHskcHJpb3JpdHl7JGF9IDw9PiAkcHJpb3JpdHl7JGJ9fSBrZXlzICVncm91 -cGVkKQogICAgICAgIAl7CgkJCXB1c2ggQHNvcnRlZF9ncm91cHMsICRzZWxmLT5fbWFrZV9ncm91 -cGVkX2l0ZW0oICRncm91cGVkeyRrZXl9LCAkbGFiZWxzLT57JGtleX0gKTsKCQl9Cgl9CgllbHNp -ZiggJG1ldGFmaWVsZC0+dHlwZSBlcSAic3ViamVjdCIgKQoJewkJCgkJbXkgJGRzID0gJHNlc3Np -b24tPmRhdGFzZXQoICJzdWJqZWN0IiApOwoJCW15IEB2YWx1ZXMgPSBrZXlzICVncm91cGVkOwoJ -CW15ICRzb3J0ZWQgPSAkbWV0YWZpZWxkLT5zb3J0X3ZhbHVlcyggJHNlc3Npb24sIFxAdmFsdWVz -ICk7CgkJbXkgJXByaW9yaXR5OwoJCW15ICRpbmRleCA9IDE7CiAgICAgICAgICAgICAgICBmb3Jl -YWNoIG15ICR2YWx1ZSAoQHskc29ydGVkfSApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAg -ICAgICAgICAgICAgICRwcmlvcml0eXskdmFsdWV9ID0gJGluZGV4OwogICAgICAgICAgICAgICAg -ICAgICAgICAkaW5kZXgrKzsKICAgICAgICAgICAgICAgIH0KCQlmb3JlYWNoIG15ICRrZXkgKHNv -cnQgeyRwcmlvcml0eXskYX0gPD0+ICRwcmlvcml0eXskYn19IGtleXMgJWdyb3VwZWQpCiAgICAg -ICAgICAgICAgICB7CgkJCW15ICRzdWJqID0gJGRzLT5kYXRhb2JqKCAka2V5ICk7CiAgICAgICAg -ICAgICAgICAgICAgICAgIHB1c2ggQHNvcnRlZF9ncm91cHMsICRzZWxmLT5fbWFrZV9ncm91cGVk -X2l0ZW0oICRncm91cGVkeyRrZXl9LCBFUHJpbnRzOjpVdGlsczo6dHJlZV90b191dGY4KCAkc3Vi -ai0+cmVuZGVyX2Rlc2NyaXB0aW9uICkgKSBpZiBkZWZpbmVkICRzdWJqOwogICAgICAgICAgICAg -ICAgfQoJfQoJZWxzaWYoICRtZXRhZmllbGQtPnR5cGUgZXEgImRhdGUiICkKCXsKCQlpZiggJHJl -dmVyc2UgKQoJCXsKCQkJZm9yZWFjaCBteSAka2V5ICggc29ydCB7JGIgPD0+ICRhfSBrZXlzICVn -cm91cGVkICkKCQkJewoJCQkJcHVzaCBAc29ydGVkX2dyb3VwcywgJHNlbGYtPl9tYWtlX2dyb3Vw -ZWRfaXRlbSggJGdyb3VwZWR7JGtleX0sICRrZXkgKTsKCQkJfQoJCX0KCQllbHNlCgkJewoJCQlm -b3JlYWNoIG15ICRrZXkgKCBzb3J0IHskYSA8PT4gJGJ9IGtleXMgJWdyb3VwZWQgKQoJCQl7CgkJ -CQlwdXNoIEBzb3J0ZWRfZ3JvdXBzLCAkc2VsZi0+X21ha2VfZ3JvdXBlZF9pdGVtKCAkZ3JvdXBl -ZHska2V5fSwgJGtleSApOwoJCQl9CgkJfQoJfQoJZWxzZQoJewkKCQlpZiggJHJldmVyc2UgKQoJ -CXsKCQkJZm9yZWFjaCBteSAka2V5ICggc29ydCB7JGIgY21wICRhfSBrZXlzICVncm91cGVkICkK -CQkJewoJCQkJcHVzaCBAc29ydGVkX2dyb3VwcywgJHNlbGYtPl9tYWtlX2dyb3VwZWRfaXRlbSgg -JGdyb3VwZWR7JGtleX0sICRrZXkgKTsKCQkJfQoJCX0KCQllbHNlCgkJewoJCQlmb3JlYWNoIG15 -ICRrZXkgKCBzb3J0IGtleXMgJWdyb3VwZWQgKQoJCQl7CgkJCQlwdXNoIEBzb3J0ZWRfZ3JvdXBz -LCAkc2VsZi0+X21ha2VfZ3JvdXBlZF9pdGVtKCAkZ3JvdXBlZHska2V5fSwgJGtleSApOwoJCQl9 -CgkJfQoJfQoKCSNjaGVjayBmb3IgYW55IHVuc3BlY2lmaWVkIGdyb3VwcwoJbXkgJGdyb3VwX2lk -ID0gIlVuc3BlY2lmaWVkICIgLiAkbWV0YWZpZWxkLT5uYW1lOwoJaWYoIGV4aXN0cyAkZ3JvdXBl -ZHskZ3JvdXBfaWR9ICkKCXsKCQlwdXNoIEBzb3J0ZWRfZ3JvdXBzLCAkc2VsZi0+X21ha2VfZ3Jv -dXBlZF9pdGVtKCAkZ3JvdXBlZHskZ3JvdXBfaWR9LCAkZ3JvdXBfaWQgKTsKCX0KCglyZXR1cm4g -XEBzb3J0ZWRfZ3JvdXBzOwp9CQoKCnN1YiBfbWFrZV9ncm91cGVkX2l0ZW0KewoJbXkoICRzZWxm -LCAkbGlzdCwgJGxhYmVsICkgPSBAXzsKCW15ICVncm91cDsKCSRncm91cHtsaXN0fSA9ICRsaXN0 -OwoJJGdyb3Vwe2xhYmVsfSA9ICRsYWJlbDsKCXJldHVybiBcJWdyb3VwOwp9CgoxOwo= +ICAgICAgICAgIGNhbl9hY2NlcHQgPT4gInJlcG9ydC9nZW5lcmljIiwKICAgICAgICAJICAgICAg +ICBpc192aXNpYmxlID0+ICJzdGFmZiIsCgkJCWlzX2FkdmVydGlzZWQgPT4gMSwKCSAgICAgICAg +KTsKCX0KCWVsc2UKCXsKICAgICAgICAJQHBsdWdpbl9pZHMgPSAkcmVwby0+cGx1Z2luX2xpc3Qo +CiAgICAgICAgICAgICAgICAJdHlwZSA9PiAiRXhwb3J0IiwKCSAgICAgICAgICAgICAgICBjYW5f +YWNjZXB0ID0+ICJyZXBvcnQvIi4kc2VsZi0+Z2V0X3JlcG9ydCwKICAgICAgICAJICAgICAgICBp +c192aXNpYmxlID0+ICJzdGFmZiIsCgkJCWlzX2FkdmVydGlzZWQgPT4gMSwKCSAgICAgICAgKTsK +ICAgICAgICB9CglteSBAcGx1Z2luczsKCWZvcmVhY2ggbXkgJGlkICggQHBsdWdpbl9pZHMgKQog +ICAgICAgIHsKICAgICAgICAgICAgICAgIG15ICRwID0gJHJlcG8tPnBsdWdpbiggIiRpZCIgKSBv +ciBuZXh0OwogICAgICAgICAgICAgICAgcHVzaCBAcGx1Z2lucywgJHA7CiAgICAgICAgfQoKICAg +ICAgICByZXR1cm4gQHBsdWdpbnM7Cn0KCnN1YiByZXBvcnRfcGx1Z2lucwp7CglteSggJHNlbGYg +KSA9IEBfOwoKCSMgc2YyIC0gY2FuJ3QgbGlzdCB2aWEgdHlwZSA9PiAiU2VhcmNoOjpSZXBvcnQi +ID8gCiAgICAgICAgbXkgQHBsdWdpbl9pZHMgPSAkc2VsZi0+cmVwb3NpdG9yeS0+cGx1Z2luX2xp +c3QoCiAgICAgICAgICAgICAgICB0eXBlID0+ICJTY3JlZW4iLAogICAgICAgICk7CgogICAgICAg +IG15IEBwbHVnaW5zOwoJZm9yZWFjaCBteSAkaWQgKCBAcGx1Z2luX2lkcyApCiAgICAgICAgewoJ +CW5leHQgaWYoICRpZCAhfiAvXlNjcmVlbjo6UmVwb3J0OjovICk7CSMgbm90ZSB0aGlzIGFsc28g +ZmlsdGVycyBvdXQgJHNlbGYgKGFrYSBTY3JlZW46OlJlcG9ydCkKCiAgICAgICAgICAgICAgICBt +eSAkcCA9ICRzZWxmLT5yZXBvc2l0b3J5LT5wbHVnaW4oICIkaWQiICk7CgkJbmV4dCBpZiggIWRl +ZmluZWQgJHAgfHwgISRwLT5jYW5fYmVfdmlld2VkICk7CgogICAgICAgICAgICAgICAgcHVzaCBA +cGx1Z2lucywgJHA7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gQHBsdWdpbnM7Cn0KCiNyZXR1 +cm5zIGEgaGFzaCBvZiB2YWx1ZXMgbWFwcGVkIHRvIGEgbGFiZWwgYW5kIGEgbGlzdAojaWYgaWRz +X29ubHkgaXMgc2V0IHRoZSBsaXN0IG9mIGl0ZW1zIGFyZSBqdXN0IHJlcHJlc2VudGVkIGJ5IHRo +ZWlyIGlkICh1c2VkIGJ5IHJlcG9ydCBKUykKc3ViIGdldF9ncm91cGVkX2l0ZW1zCnsKCW15KCAk +c2VsZiwgJGl0ZW1zLCAkaWRzX29ubHkgKSA9IEBfOwoJbXkgJHNlc3Npb24gPSAkc2VsZi0+e3Nl +c3Npb259OwoJbXkgJWdyb3VwZWQ7CgoJbXkgJGdyb3VwaW5nID0gJHNlbGYtPntwcm9jZXNzb3J9 +LT57Z3JvdXB9OwoKCW15ICRtZXRhZmllbGQgPSAkaXRlbXMtPmdldF9kYXRhc2V0LT5maWVsZCgg +JGdyb3VwaW5nICk7CgoJI3NldCBncm91cF9vcHRzIGlmIGFwcHJvcHJpYXRlCglpZiggZGVmaW5l +ZCAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntncm91cF9vcHRzfSApCgl7CgkJaWYoICRtZXRhZmllbGQt +PnR5cGUgZXEgImRhdGUiICkKCQl7CgkJCSRtZXRhZmllbGQtPntyZW5kZXJfcmVzfSA9ICRzZWxm +LT57cHJvY2Vzc29yfS0+e2dyb3VwX29wdHN9LT57cmVzfSBpZiBleGlzdHMgJHNlbGYtPntwcm9j +ZXNzb3J9LT57Z3JvdXBfb3B0c30tPntyZXN9OwoJCX0KCX0KCgkjY3JlYXRlIGEgaGFzaCBvZiBm +aWVsZCB2YWx1ZXMgdG8gaXRlbXMgKG9yIGl0ZW0gaWRzKQoJJGl0ZW1zLT5tYXAoIHN1YiB7Cgkg +ICAgICAgCW15KCAkc2Vzc2lvbiwgJGRhdGFzZXQsICRpdGVtICkgPSBAXzsKCQkKCQlteSAkbXVs +dGlwbGUgPSAkbWV0YWZpZWxkLT5nZXRfcHJvcGVydHkoICJtdWx0aXBsZSIgKTsKCQlteSBAZ3Jv +dXBfdmFsdWVzOwoJCWlmKCAkbXVsdGlwbGUgKQogICAgICAgICAgICAgICAgewoJCQlAZ3JvdXBf +dmFsdWVzID0gQHskaXRlbS0+dmFsdWUoICRncm91cGluZyApfTsKCQl9CgkJZWxzZQoJCXsJCQkK +CQkJQGdyb3VwX3ZhbHVlcyA9ICgkaXRlbS0+dmFsdWUoICRncm91cGluZyApKTsKCQl9CgkKCQlp +Ziggc2NhbGFyIEBncm91cF92YWx1ZXMgPiAwICkKCQl7CgkJCWZvcmVhY2ggbXkgJGdyb3VwX3Zh +bHVlICggQGdyb3VwX3ZhbHVlcyApCgkJCXsKCQkJCW15ICRncm91cF9pZCA9ICRtZXRhZmllbGQt +PmdldF9pZF9mcm9tX3ZhbHVlKCAkc2Vzc2lvbiwgJGdyb3VwX3ZhbHVlICk7CgkJCQkjdHJ1bmNh +dGUgZ3JvdXAgaWYgYXBwcm9wcmlhdGUKCQkJCWlmKCBkZWZpbmVkICRzZWxmLT57cHJvY2Vzc29y +fS0+e2dyb3VwX29wdHN9ICkKCQkJCXsKCQkJCQkkZ3JvdXBfaWQgPSAgc3Vic3RyKCAiXHUkZ3Jv +dXBfaWQiLCAwLCAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntncm91cF9vcHRzfS0+e3RydW5jYXRlfSAp +IGlmIGV4aXN0cyAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntncm91cF9vcHRzfS0+e3RydW5jYXRlfTsK +CQkJCX0KCgkJICAgICAgICAJaWYoIGV4aXN0cyAkZ3JvdXBlZHskZ3JvdXBfaWR9ICkgI3dlJ3Zl +IGFscmVhZHkgc2V0IHRoaXMgbGlzdCB1cCwgcHVzaCBhIG5ldyBpdGVtIG9uIHRvIHRoZSBsaXN0 +CgkJICAgICAgICAgICAgICAgCXsKCQkJCQlpZiggJGlkc19vbmx5ICkgI3NvbWV0aW1lcyB3ZSBv +bmx5IHdhbnQgaWRzIHJhdGhlciB0aGFuIHRoZSB3aG9sZSBpdGVtCgkJCQkJewoJCQkJCQlwdXNo +IEB7JGdyb3VwZWR7JGdyb3VwX2lkfX0sICRpdGVtLT5pZDsKCQkJCQl9CgkJCQkJZWxzZQoJCQkJ +CXsKCQkJCQkJcHVzaCBAeyRncm91cGVkeyRncm91cF9pZH19LCAkaXRlbTsKCQkJCQl9CgkgICAg +ICAgCQkgICAgICAgIH0KICAgICAgICAJICAgICAgCQllbHNlICNzZXQgdXAgYSBsaXN0IGZvciB0 +aGlzIGdyb3VwCgkgICAgICAgIAkgICAgICAgCXsKCQkJCQlteSBAZ3JvdXBlZF9pdGVtczsKCQkJ +CQlpZiggJGlkc19vbmx5ICkgI3NvbWV0aW1lcyB3ZSBvbmx5IHdhbnQgaWRzIHJhdGhlciB0aGFu +IHRoZSB3aG9sZSBpdGVtCgkJICAgICAgICAgICAgICAgICAgICAgICAgewkKICAgICAgICAJCSAg +ICAgICAgICAgICAgICAgICAgICAgIEBncm91cGVkX2l0ZW1zID0gKCRpdGVtLT5pZCk7CiAgICAg +ICAgICAgICAgICAJCSAgICAgICAgfQoJICAgICAgICAgICAgICAgIAkgICAgICAgIGVsc2UKICAg +ICAgICAJICAgICAgICAgICAgICAgIAl7CgkgICAgICAgICAgICAgICAgCSAgICAgICAgICAgICAg +ICBAZ3JvdXBlZF9pdGVtcyA9ICgkaXRlbSk7CiAgICAgICAgCQkgICAgICAgICAgICAgICAJfQoJ +ICAgICAgICAgICAgICAgIAkgICAgICAgICRncm91cGVkeyRncm91cF9pZH0gPSBbQGdyb3VwZWRf +aXRlbXNdOwoJCQkJfQogICAgICAgICAgICAgICAJCX0KCQl9CgkJZWxzZQoJCXsKCQkJbXkgJGdy +b3VwX2lkID0gIlVuc3BlY2lmaWVkICIgLiAkbWV0YWZpZWxkLT5uYW1lOwogIAkgICAgCQlpZigg +ZXhpc3RzICRncm91cGVkeyRncm91cF9pZH0gKSAjd2UndmUgYWxyZWFkeSBzZXQgdGhpcyBsaXN0 +IHVwLCBwdXNoIGEgbmV3IGl0ZW0gb24gdG8gdGhlIGxpc3QKCQkgIAl7CgkJCQlpZiggJGlkc19v +bmx5ICkgI3NvbWV0aW1lcyB3ZSBvbmx5IHdhbnQgaWRzIHJhdGhlciB0aGFuIHRoZSB3aG9sZSBp +dGVtCgkJCQl7CgkJCQkJcHVzaCBAeyRncm91cGVkeyRncm91cF9pZH19LCAkaXRlbS0+aWQ7CgkJ +CQl9CgkJCQllbHNlCgkJCQl7CgkJCQkJcHVzaCBAeyRncm91cGVkeyRncm91cF9pZH19LCAkaXRl +bTsKCQkJCX0KCSAgICAgICAJCX0KICAgICAgICAJICAgICAgCWVsc2UgI3NldCB1cCBhIGxpc3Qg +Zm9yIHRoaXMgZ3JvdXAKCSAgICAgICAgCXsKCQkJCW15IEBncm91cGVkX2l0ZW1zOwoJCQkJaWYo +ICRpZHNfb25seSApICNzb21ldGltZXMgd2Ugb25seSB3YW50IGlkcyByYXRoZXIgdGhhbiB0aGUg +d2hvbGUgaXRlbQoJCSAgICAgICAgICAgICAgICB7CQogICAgICAgIAkJCQlAZ3JvdXBlZF9pdGVt +cyA9ICgkaXRlbS0+aWQpOwogICAgICAgICAgICAgICAgCQl9CgkgICAgICAgICAgICAgICAgCWVs +c2UKICAgICAgICAJICAgICAgICAgICAgICAgIHsKCSAgICAgICAgICAgICAgIAkgICAgICAgICAg +ICAgICAgQGdyb3VwZWRfaXRlbXMgPSAoJGl0ZW0pOwogICAgICAgIAkgICAgICAgICAgICAgICAJ +fQoJICAgICAgICAgICAgICAJICAgICAgICAkZ3JvdXBlZHskZ3JvdXBfaWR9ID0gW0Bncm91cGVk +X2l0ZW1zXTsKCQkJfQoJCX0KICAgICAgIAl9ICk7CgoJI25vdyBzb3J0IHRoZSBncm91cHMgYW5k +IGFkZCBodW1hbiByZWFkYWJsZSBsYWJlbHMKCW15IEBzb3J0ZWRfZ3JvdXBzOwoJCglteSAkcmV2 +ZXJzZSA9IDA7CgkkcmV2ZXJzZSA9ICRzZWxmLT57cHJvY2Vzc29yfS0+e2dyb3VwX29wdHN9LT57 +cmV2ZXJzZV9vcmRlcn0gaWYgZXhpc3RzICRzZWxmLT57cHJvY2Vzc29yfS0+e2dyb3VwX29wdHN9 +LT57cmV2ZXJzZV9vcmRlcn07CglpZiggJG1ldGFmaWVsZC0+dHlwZSBlcSAibmFtZWRzZXQiICkK +CXsKCQlteSggJHRhZ3MsICRsYWJlbHMgKSA9ICRtZXRhZmllbGQtPnRhZ3NfYW5kX2xhYmVscygg +JHNlc3Npb24gKTsKCQkjY29udmVydCB0YWdzIHRvIGEgaGFzaCBvZiB2YWx1ZXMgYW5kIGEgcHJp +b3JpdHkgKGZvciBvcmRlcmluZykKCQlteSAlcHJpb3JpdHk7CgkJbXkgJGluZGV4ID0gMTsKCQlm +b3JlYWNoIG15ICR0YWcgKEB7JHRhZ3N9ICkKCQl7CgkJCSRwcmlvcml0eXskdGFnfSA9ICRpbmRl +eDsKCQkJJGluZGV4Kys7CgkJfQoJCWZvcmVhY2ggbXkgJGtleSAoc29ydCB7JHByaW9yaXR5eyRh +fSA8PT4gJHByaW9yaXR5eyRifX0ga2V5cyAlZ3JvdXBlZCkKICAgICAgICAJewoJCQlwdXNoIEBz +b3J0ZWRfZ3JvdXBzLCAkc2VsZi0+X21ha2VfZ3JvdXBlZF9pdGVtKCAkZ3JvdXBlZHska2V5fSwg +JGxhYmVscy0+eyRrZXl9ICk7CgkJfQoJfQoJZWxzaWYoICRtZXRhZmllbGQtPnR5cGUgZXEgInN1 +YmplY3QiICkKCXsJCQoJCW15ICRkcyA9ICRzZXNzaW9uLT5kYXRhc2V0KCAic3ViamVjdCIgKTsK +CQlteSBAdmFsdWVzID0ga2V5cyAlZ3JvdXBlZDsKCQlteSAkc29ydGVkID0gJG1ldGFmaWVsZC0+ +c29ydF92YWx1ZXMoICRzZXNzaW9uLCBcQHZhbHVlcyApOwoJCW15ICVwcmlvcml0eTsKCQlteSAk +aW5kZXggPSAxOwogICAgICAgICAgICAgICAgZm9yZWFjaCBteSAkdmFsdWUgKEB7JHNvcnRlZH0g +KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkcHJpb3JpdHl7JHZh +bHVlfSA9ICRpbmRleDsKICAgICAgICAgICAgICAgICAgICAgICAgJGluZGV4Kys7CiAgICAgICAg +ICAgICAgICB9CgkJZm9yZWFjaCBteSAka2V5IChzb3J0IHskcHJpb3JpdHl7JGF9IDw9PiAkcHJp +b3JpdHl7JGJ9fSBrZXlzICVncm91cGVkKQogICAgICAgICAgICAgICAgewoJCQlteSAkc3ViaiA9 +ICRkcy0+ZGF0YW9iaiggJGtleSApOwogICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEBzb3J0 +ZWRfZ3JvdXBzLCAkc2VsZi0+X21ha2VfZ3JvdXBlZF9pdGVtKCAkZ3JvdXBlZHska2V5fSwgRVBy +aW50czo6VXRpbHM6OnRyZWVfdG9fdXRmOCggJHN1YmotPnJlbmRlcl9kZXNjcmlwdGlvbiApICkg +aWYgZGVmaW5lZCAkc3ViajsKICAgICAgICAgICAgICAgIH0KCX0KCWVsc2lmKCAkbWV0YWZpZWxk +LT50eXBlIGVxICJkYXRlIiApCgl7CgkJaWYoICRyZXZlcnNlICkKCQl7CgkJCWZvcmVhY2ggbXkg +JGtleSAoIHNvcnQgeyRiIDw9PiAkYX0ga2V5cyAlZ3JvdXBlZCApCgkJCXsKCQkJCXB1c2ggQHNv +cnRlZF9ncm91cHMsICRzZWxmLT5fbWFrZV9ncm91cGVkX2l0ZW0oICRncm91cGVkeyRrZXl9LCAk +a2V5ICk7CgkJCX0KCQl9CgkJZWxzZQoJCXsKCQkJZm9yZWFjaCBteSAka2V5ICggc29ydCB7JGEg +PD0+ICRifSBrZXlzICVncm91cGVkICkKCQkJewoJCQkJcHVzaCBAc29ydGVkX2dyb3VwcywgJHNl +bGYtPl9tYWtlX2dyb3VwZWRfaXRlbSggJGdyb3VwZWR7JGtleX0sICRrZXkgKTsKCQkJfQoJCX0K +CX0KCWVsc2UKCXsJCgkJaWYoICRyZXZlcnNlICkKCQl7CgkJCWZvcmVhY2ggbXkgJGtleSAoIHNv +cnQgeyRiIGNtcCAkYX0ga2V5cyAlZ3JvdXBlZCApCgkJCXsKCQkJCXB1c2ggQHNvcnRlZF9ncm91 +cHMsICRzZWxmLT5fbWFrZV9ncm91cGVkX2l0ZW0oICRncm91cGVkeyRrZXl9LCAka2V5ICk7CgkJ +CX0KCQl9CgkJZWxzZQoJCXsKCQkJZm9yZWFjaCBteSAka2V5ICggc29ydCBrZXlzICVncm91cGVk +ICkKCQkJewoJCQkJcHVzaCBAc29ydGVkX2dyb3VwcywgJHNlbGYtPl9tYWtlX2dyb3VwZWRfaXRl +bSggJGdyb3VwZWR7JGtleX0sICRrZXkgKTsKCQkJfQoJCX0KCX0KCgkjY2hlY2sgZm9yIGFueSB1 +bnNwZWNpZmllZCBncm91cHMKCW15ICRncm91cF9pZCA9ICJVbnNwZWNpZmllZCAiIC4gJG1ldGFm +aWVsZC0+bmFtZTsKCWlmKCBleGlzdHMgJGdyb3VwZWR7JGdyb3VwX2lkfSApCgl7CgkJcHVzaCBA +c29ydGVkX2dyb3VwcywgJHNlbGYtPl9tYWtlX2dyb3VwZWRfaXRlbSggJGdyb3VwZWR7JGdyb3Vw +X2lkfSwgJGdyb3VwX2lkICk7Cgl9CgoJcmV0dXJuIFxAc29ydGVkX2dyb3VwczsKfQkKCgpzdWIg +X21ha2VfZ3JvdXBlZF9pdGVtCnsKCW15KCAkc2VsZiwgJGxpc3QsICRsYWJlbCApID0gQF87Cglt +eSAlZ3JvdXA7CgkkZ3JvdXB7bGlzdH0gPSAkbGlzdDsKCSRncm91cHtsYWJlbH0gPSAkbGFiZWw7 +CglyZXR1cm4gXCVncm91cDsKfQoKc3ViIHJlbmRlcl9zZWxlY3RhbGwKewoJbXkoICRzZWxmLCAk +eG1sICkgPSBAXzsKCglteSAkdG9nZ2xlX2Z1bmN0aW9uID0gJwoJCXZhciBpc0NoZWNrZWQgPSB0 +cnVlOwoJCWZ1bmN0aW9uIHRvZ2dsZUNoZWNrYm94ZXMoKSB7CgkgICAgICAgIAl2YXIgZXhwb3J0 +X29wdGlvbnMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJyZXBvcnRfZXhwb3J0 +X29wdGlvbnMiKTsKCQkJZm9yKCBleHBvcnRfb3B0aW9uIG9mIGV4cG9ydF9vcHRpb25zICkKCQkJ +ewoJCQkJdmFyIGNoZWNrYm94ZXMgPSBleHBvcnRfb3B0aW9uLmdldEVsZW1lbnRzQnlUYWdOYW1l +KCAiaW5wdXQiICkKCQkJCWZvciggY2hlY2tib3ggb2YgY2hlY2tib3hlcyApCgkJCQl7CgkJCQkJ +aWYoaXNDaGVja2VkKQoJCQkJCXsKCSAgICAgICAgICAgICAgICAJCQljaGVja2JveC5jaGVja2Vk +ID0gIiI7CgkJICAJICAgICAgICAJfQoJCQkJCWVsc2UKCQkJCQl7CgkJCQkgICAgICAgICAgICAg +ICAgY2hlY2tib3guY2hlY2tlZCA9ICJjaGVja2VkIjsKCQkJCQl9CgkgICAgICAgICAJCX0KCQkJ +fQoJCQlpc0NoZWNrZWQgPSAhaXNDaGVja2VkOwoJCX0nOwoJCglteSAkanNfdGFnID0gJHhtbC0+ +Y3JlYXRlX2VsZW1lbnQoICJzY3JpcHQiICk7CgkkanNfdGFnLT5hcHBlbmRDaGlsZCggJHhtbC0+ +Y3JlYXRlX3RleHRfbm9kZSggJHRvZ2dsZV9mdW5jdGlvbiApICk7CglyZXR1cm4gJGpzX3RhZzsK +fQoKc3ViIHJlbmRlcl9jbGVhcmZvcm0KewoJbXkoICRzZWxmLCAkeG1sICkgPSBAXzsKCglteSAk +Y2xlYXJfZnVuY3Rpb24gPSAnCgkJZnVuY3Rpb24gY2xlYXJGb3JtKCl7CgkJCXZhciByZXBvcnQg +PSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCggImN1c3RvbV9yZXBvcnQiICk7CgkJCXZhciBmb3Jt +ID0gcmVwb3J0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInNlbGVjdGVkX2Zvcm0iKVswXTsKCQkJ +dmFyIGlucHV0cyA9IGZvcm0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoICJpbnB1dCIgKTsKCQkJZm9y +KCBpbnB1dCBvZiBpbnB1dHMgKQoJCQl7CgkJCQlmaWVsZF90eXBlID0gaW5wdXQudHlwZS50b0xv +d2VyQ2FzZSgpOwkKCQkJCWNvbnNvbGUubG9nKGZpZWxkX3R5cGUpOwoJCQkJc3dpdGNoIChmaWVs +ZF90eXBlKQoJCQkJewoJCQkJY2FzZSAidGV4dCI6CgkJCQljYXNlICJ0ZXh0YXJlYSI6CgkJCQkJ +aW5wdXQudmFsdWUgPSAiIjsKCQkJCQlicmVhazsKCQkJCWNhc2UgInJhZGlvIjoKCQkJCWNhc2Ug +ImNoZWNrYm94IjoKCQkJCQlpZiAoaW5wdXQuY2hlY2tlZCkKCQkJCQl7CiAgICAgICAgCQkJCQlp +bnB1dC5jaGVja2VkID0gZmFsc2U7CgkJCQkJfQoJCQkJCWJyZWFrOwoJCQkJY2FzZSAic2VsZWN0 +LW9uZSI6CgkJCQljYXNlICJzZWxlY3QtbXVsdGkiOgoJCQkJCWlucHV0LnNlbGVjdGVkSW5kZXgg +PSAtMTsKCQkJCQlicmVhazsKCQkJCWRlZmF1bHQ6CgkJCQkJYnJlYWs7CgkJCQl9CgkJCX0JCgkJ +ICAgICAgICB2YXIgc2VsZWN0cyA9IGZvcm0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoICJzZWxlY3Qi +ICk7CgkJCWZvciggc2VsZWN0IG9mIHNlbGVjdHMgKQoJCQl7CQoJCQkJaWYoIHNlbGVjdC5oYXNB +dHRyaWJ1dGUoIm11bHRpcGxlIikgKQoJCQkJewoJCQkJCXNlbGVjdC5zZWxlY3RlZEluZGV4ID0g +LTE7CgkJCQl9CgkJCX0JCQoKCQl9JzsJCQoKCW15ICRqc190YWcgPSAkeG1sLT5jcmVhdGVfZWxl +bWVudCggInNjcmlwdCIgKTsKICAgICAgICAkanNfdGFnLT5hcHBlbmRDaGlsZCggJHhtbC0+Y3Jl +YXRlX3RleHRfbm9kZSggJGNsZWFyX2Z1bmN0aW9uICkgKTsKICAgICAgICByZXR1cm4gJGpzX3Rh +ZzsKfQoKMTsK @@ -2003,9 +2142,9 @@ mCeqVAAAAABJRU5ErkJggg== static/javascript/auto/reports.js text/plain - 433f2b10185e875b322d0566e4d787c8 + d02c8742a8d57f71e94e1c62635b94de MD5 - 12566 + 12701 dmFyIGluaXRSZXBvcnRGb3JtID0gZnVuY3Rpb24oKXsKCiAgICAgICAgLy9wb2x5ZmlsbCBmb3Ig SUUKICAgICAgICAoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgaWYgKCB0eXBlb2Ygd2lu ZG93LkN1c3RvbUV2ZW50ID09PSAiZnVuY3Rpb24iICkgcmV0dXJuIGZhbHNlOyAvL0lmIG5vdCBJ @@ -2027,214 +2166,216 @@ ICAgIH0pOwp9OwoKCnZhciBvbkZvcm1TZWxlY3QgPSBmdW5jdGlvbigpewoJLy9nZXQgZm9ybSBp ZAoJdmFyIGZvcm1pZCA9IHRoaXMub3B0aW9uc1t0aGlzLnNlbGVjdGVkSW5kZXhdLmdldEF0dHJp YnV0ZSgnZm9ybScpOwoJCgkvL2hpZGUgb3RoZXIgZm9ybXMKCSQkKCd0YWJsZS5lcF9zZWFyY2hf ZmllbGRzJykuZWFjaChmdW5jdGlvbiAoZWxlbSkgCgl7CQoJCS8vaGlkZSB0aGUgZm9ybQoJCSQo -ZWxlbSkuaGlkZSgpOwoKCQkkKGVsZW0pLnNlbGVjdCgnaW5wdXQnKS5lYWNoKGZ1bmN0aW9uIChp -bnB1dCkKCQl7CgkJCSQoaW5wdXQpLnNldEF0dHJpYnV0ZSgiZGlzYWJsZWQiLCAiZGlzYWJsZWQi -KTsKCQl9KTsKCX0pOwoJCQoJLy9zaG93IHRoZSBmb3JtIHdlIHdhbnQKCSQoZm9ybWlkKS5zaG93 -KCk7CgoJLy9lbmFibGUgdGhpcyBmb3JtJ3MgaW5wdXQgZWxlbWVudHMKCSQoZm9ybWlkKS5zZWxl -Y3QoJ2lucHV0JykuZWFjaChmdW5jdGlvbiAoaW5wdXQpCgl7CgkJJChpbnB1dCkucmVtb3ZlQXR0 -cmlidXRlKCJkaXNhYmxlZCIpOwoJfSk7Cgp9OwoKLy8gVXNlZCBieSB0aGUgU2NyZWVuOjpSZXBv -cnQ6OnJlbmRlciBtZXRob2QKCnZhciBFUHJpbnRzX1NjcmVlbl9SZXBvcnRfTG9hZGVyID0gQ2xh -c3MuY3JlYXRlKHsKCWhhc19wcm9ibGVtczogMCwKCWNvdW50OiAwLAoJcnVuczogMCwKCXByb2dy -ZXNzOiBudWxsLAoJaWRzOiBBcnJheSgpLAoJc3RlcDogMjAsCglwcmVmaXg6ICcnLAoJb25Qcm9i -bGVtczogZnVuY3Rpb24oKSB7fSwKCW9uRmluaXNoOiBmdW5jdGlvbigpIHt9LAoJdXJsOiAiIiwK -CXBhcmFtZXRlcnM6ICIiLAoJY29udGFpbmVyOiBudWxsLAoJc2hvd19jb21wbGlhbmNlOiAxLAkK -CgkvLyB0byBzaG93IGEgcHJldHR5IHByb2dyZXNzIGJhciAoJSBjb21wbGlhbmNlKToKCXRvdGFs -X2RhdGFvYmpzOiAwLAoJdG90YWxfbm9uY29tcGxpYW50OiAwLAoKCglpbml0aWFsaXplOiBmdW5j -dGlvbihvcHRzKSB7CgkJaWYoIG9wdHMuaWRzICkKCQkJdGhpcy5pZHMgPSBvcHRzLmlkczsKCQlp -Ziggb3B0cy5zdGVwICkKCQkJdGhpcy5zdGVwID0gb3B0cy5zdGVwOwoJCWlmKCBvcHRzLnByZWZp -eCApCgkJCXRoaXMucHJlZml4ID0gb3B0cy5wcmVmaXg7CgkJaWYoIG9wdHMub25GaW5pc2ggKQoJ -CQl0aGlzLm9uRmluaXNoID0gb3B0cy5vbkZpbmlzaDsKCQlpZiggb3B0cy5vblByb2JsZW1zICkK -CQkJdGhpcy5vblByb2JsZW1zID0gb3B0cy5vblByb2JsZW1zOwoJCWlmKCBvcHRzLnVybCApCgkJ -ewoJCQl0aGlzLnVybCA9IG9wdHMudXJsOwoJCX0KCQlpZiggb3B0cy5wYXJhbWV0ZXJzICkKCQkJ -dGhpcy5wYXJhbWV0ZXJzID0gb3B0cy5wYXJhbWV0ZXJzOwoJCWlmKCBvcHRzLmNvbnRhaW5lcl9p -ZCApCgkJCXRoaXMuY29udGFpbmVyID0gJCggb3B0cy5jb250YWluZXJfaWQgKTsJLy8gc2hvdWxk -IGZhaWwgaWYgY29udGFpbmVyIGRvZXNuJ3QgZXhpc3QuLi4KCQlpZiggb3B0cy5oYXNPd25Qcm9w -ZXJ0eSgnc2hvd19jb21wbGlhbmNlJykgKQoJCXsKCQkJdGhpcy5zaG93X2NvbXBsaWFuY2UgPSBv -cHRzLnNob3dfY29tcGxpYW5jZTsKCQl9CgkJaWYoIG9wdHMubGFiZWxzICkKCQl7CgkJCXRoaXMu -bGFiZWxzID0gb3B0cy5sYWJlbHM7CgkJfQoJfSwKCglleGVjdXRlOiBmdW5jdGlvbigpIHsKCQkv -LyBwcm9ncmVzcy1iYXIKCgkJdGhpcy5jb250YWluZXIuaW5zZXJ0KCBuZXcgRWxlbWVudCggJ2Rp -dicsIHsgJ2NsYXNzJzogJ2VwX3JlcG9ydF9wcm9ncmVzc19iYXInLCAnaWQnOiB0aGlzLnByZWZp -eCArICJfcHJvZ3Jlc3NfYmFyIiB9ICkgKTsJCgoJCXZhciBjdXJyZW50X2dyb3VwaW5nID0gbnVs -bDsJLy8gbWlnaHQgbm90IGJlIHNldCBpbiB0aGUgcmV0dXJuZWQgdmFsdWUgYnV0IHRoYXQncyBh -bGxvd2VkL09LCgoJCXZhciBkYXRhb2JqcyA9IHt9OwoJCXZhciBncm91cGVkID0gZmFsc2U7CgkJ -dmFyIHNlZW5faWRzID0ge307CgkJdGhpcy5ub19pdGVtcyA9IHRoaXMuaWRzLmxlbmd0aDsKCQl0 -aGlzLnJldHJpZXZlZCA9IFtdOwoJCWlmKCAhTnVtYmVyLmlzSW50ZWdlcih0aGlzLmlkc1swXSkg -KSAvL2lkcyBoYXZlIGJlZW4gZ3JvdXBlZAoJCXsJCgkJCWdyb3VwZWQgPSB0cnVlOwoJCQl0aGlz -Lmdyb3VwZWRfaWRzID0gdGhpcy5pZHM7CgkJCXRoaXMuaWRzID0gW107CgkJCWZvciggdmFyIGkg -PSAwOyBpIDwgdGhpcy5ncm91cGVkX2lkcy5sZW5ndGg7IGkrKyApCgkJCXsKCQkJCXRoaXMuaWRz -ID0gdGhpcy5pZHMuY29uY2F0KHRoaXMuZ3JvdXBlZF9pZHNbaV0ubGlzdCk7CgkJCX0KCQkJLy90 -aGUgZ3JvdXBpbmcgbWF5IGhhdmUgY3JlYXRlZCBkdXBsaWNhdGUgcmVjb3JkcyAoaS5lLiBhIHJl -Y29yZCBjYW4gYXBwZWFyIGluIG1vcmUgdGhhbiBvbmUgZ3JvdXApIC0gaXQncyBoYW5keSB0byBo -YXZlIGFuIGFycmF5IG9mIGFsbCB0aGUgdW5pcXVlIHJlY29yZHMKCQkJdGhpcy51bmlxdWUgPSB0 -aGlzLmlkcy5maWx0ZXIoZnVuY3Rpb24oaXRlbSwgaSwgYXIpeyByZXR1cm4gYXIuaW5kZXhPZihp -dGVtKSA9PT0gaTsgfSk7CgkJCXRoaXMubm9faXRlbXMgPSB0aGlzLnVuaXF1ZS5sZW5ndGg7CgkJ -fQoJCWZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLmlkcy5sZW5ndGg7IGkrPXRoaXMuc3RlcCkKCQl7 -CgkJCS8vIGFyZ3VtZW50cyBmb3IgQWpheCBxdWVyeSBBTkQgY3JlYXRlcyB0aGUgSFRNTCBwbGFj -ZWhvbGRlcnMgPGRpdj4ncyAodGhhdCB3aWxsIHJlY2VpdmUgdGhlIGNvbnRlbnQgb2YgdGhlIEFq -YXggcXVlcnkuLi4pCQkJCQoJCQl2YXIgYXJncyA9ICcmYWpheD0nK3RoaXMucHJlZml4OwoJCQlm -b3IodmFyIGogPSAwOyBqIDwgdGhpcy5zdGVwICYmIGkraiA8IHRoaXMuaWRzLmxlbmd0aDsgaisr -KQoJCQl7CgkJCQlhcmdzICs9ICcmJyArIHRoaXMucHJlZml4ICsgJz0nICsgdGhpcy5pZHNbaStq -XTsKCQkJCXZhciBpZCA9IHRoaXMucHJlZml4ICsgJ18nICsgdGhpcy5pZHNbaStqXTsKCQkJCXZh -ciB0YXJnZXRfZWwgPSAkKCBpZCApOwoJCQkJaWYoIHRhcmdldF9lbCAhPSBudWxsICkKCQkJCXsK -CQkJCQkvL3N0b3JlIGEgcmVjb3JkIG9mIHRoaXMgaW4gc2Vlbl9pZHMgdG8gZW5zdXJlIGVhY2gg -cGxhY2Vob2xkZXIgaGFzIGEgdW5pcXVlIGlkCgkJCQkJaWYoICEoaWQgaW4gc2Vlbl9pZHMpICkK -CQkJCQl7CgkJCQkJCXNlZW5faWRzW2lkXSA9IDE7CgkJCQkJfQoJCQkJCWVsc2UKCQkJCQl7CgkJ -CQkJCXNlZW5faWRzW2lkXSA9IHNlZW5faWRzW2lkXSArIDE7CgkJCQkJfQoJCQkJCWlkID0gaWQg -KyAiXyIgKyBzZWVuX2lkc1tpZF07CgkJCQl9CgkJCQkJCgkJCQl0aGlzLmNvbnRhaW5lci5pbnNl -cnQoIG5ldyBFbGVtZW50KCAnZGl2JywgeyAnY2xhc3MnOiAnZXBfcmVwb3J0X3JvdycsICdpZCc6 -IGlkLCAncG9zaXRpb24nOiBpK2ogfSApLCB7ICdwb3NpdGlvbic6ICdhZnRlcicgfSApOwoJCQl9 -CgkJCW5ldyBBamF4LlJlcXVlc3QoIHRoaXMudXJsLCB7CgkJCQltZXRob2Q6ICdnZXQnLAoJCQkJ -cGFyYW1ldGVyczogdGhpcy5wYXJhbWV0ZXJzICsgYXJncywKCQkJCW9uU3VjY2VzczogKGZ1bmN0 -aW9uKHRyYW5zcG9ydCkgewoKCQkJCQl2YXIganNvbiA9IHRyYW5zcG9ydC5yZXNwb25zZVRleHQu -ZXZhbEpTT04oKTsKCQkJCQl2YXIgZGF0YSA9IGpzb24uZGF0YTsKCQoJCQkJCWlmKCBkYXRhID09 -IG51bGwgKQoJCQkJCQlkYXRhID0gbmV3IEFycmF5KCk7CgkJCQkJZm9yKCB2YXIgaT0wOyBpPGRh -dGEubGVuZ3RoOyBpKysgKQoJCQkJCXsKCQkJCQkJdmFyIGVudHJ5ID0gZGF0YVtpXTsKCQkJCQoJ -CQkJCQkvLyBlbnRyeS5kYXRhb2JqaWQKCQkJCQkJLy8gZW50cnkuc3VtbWFyeQoJCQkJCQkvLyBl -bnRyeS5ncm91cGluZwoJCQkJCQkvLyBlbnRyeS5wcm9ibGVtcwoKCQkJCQkJaWYoIGVudHJ5ID09 -IG51bGwgKQoJCQkJCQkJY29udGludWU7CgkJCQkJCQoJCQkJCQl2YXIgZGF0YW9iamlkID0gZW50 -cnkuZGF0YW9iamlkOwoJCQkJCQlpZiggZGF0YW9iamlkID09IG51bGwgKQoJCQkJCQkJY29udGlu -dWU7CgkJCQkJCWlmKCAhKGRhdGFvYmppZCBpbiBkYXRhb2JqcykgKQoJCQkJCQl7CgkJCQkJCQl0 -aGlzLmNvdW50Kys7CgkJCQkJCQlkYXRhb2Jqc1tkYXRhb2JqaWRdID0gZW50cnk7CgkJCQkJCX0K -CQkJCQl9CgkJCQoJCQkJCS8vIHdlJ3ZlIHJldHJpZXZlZCBhbGwgdGhlIHJlY29yZHMJCQkJCgkJ -CQkJaWYoIHRoaXMuY291bnQgPT0gdGhpcy5ub19pdGVtcyApCgkJCQkJewoJCQkJCQkkKCB0aGlz -LnByZWZpeCArICdfcHJvZ3Jlc3NfYmFyJyApLnJlbW92ZSgpOwoJCQkJCQlpZiggdGhpcy5oYXNf -cHJvYmxlbXMgKQoJCQkJCQkJdGhpcy5vblByb2JsZW1zKHRoaXMpOwoJCQkJCQl0aGlzLm9uRmlu -aXNoKHRoaXMpOwoJCQkJCQkJCgkJCQkJCS8vYWRkIHRoZSBncm91cCBoZWFkaW5ncwoJCQkJCQlp -Zihncm91cGVkKQoJCQkJCQl7CgkJCQkJCQl2YXIgcG9zaXRpb24gPSAwOwoJCQkJCQkJZm9yKCB2 -YXIgaSA9IDA7IGkgPCB0aGlzLmdyb3VwZWRfaWRzLmxlbmd0aDsgaSsrICkKCQkJCSAgICAgICAg -ICAgICAgICAgICAgICAgIHsJCgkJCQkJCQkJdmFyIHRhcmdldF9lbCA9IGRvY3VtZW50LnF1ZXJ5 -U2VsZWN0b3JBbGwoJ1twb3NpdGlvbj0iJyArIHBvc2l0aW9uICsgJyJdJylbMF07CgkJCQkJCQkJ -cG9zaXRpb24gPSBwb3NpdGlvbiArIHRoaXMuZ3JvdXBlZF9pZHNbaV0ubGlzdC5sZW5ndGg7CQkJ -CgkJCQkJCQkJdmFyIGdyb3VwaW5nX2NvbnRhaW5lciA9IG5ldyBFbGVtZW50KCAnZGl2JywgeyAn -Y2xhc3MnOiAnZXBfcmVwb3J0X2dyb3VwaW5nJyB9ICk7CiAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfZWwuaW5zZXJ0 -KCB7ICdiZWZvcmUnIDogZ3JvdXBpbmdfY29udGFpbmVyIH0gKTsKICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwaW5nX2Nv -bnRhaW5lci51cGRhdGUoIHRoaXMuZ3JvdXBlZF9pZHNbaV0ubGFiZWwgKTsKCQkJCSAgICAgICAg -ICAgICAgICAgICAgICAgIH0KCQkJCQkJfQoKCQkJCQkJLy9hZGQgdGhlIGVwcmludCBzdW1tYXJp -ZXMKCQkJCQkJdmFyIGFkZGVkX2lkcyA9IHt9OwoJCQkJCQlmb3IoIHZhciBjID0gMDsgYyA8IHRo -aXMuaWRzLmxlbmd0aDsgYysrICkKCQkJCQkJewoJCQkJCQkJdmFyIGRhdGFvYmppZCA9IHRoaXMu -aWRzW2NdOwoJCQkJCQkJdmFyIGVudHJ5ID0gZGF0YW9ianNbZGF0YW9iamlkXTsKCgkJCQkJCQkv -L3N0b3JlIHRoYXQgd2UgaGF2ZSBhZGRlZCB0aGlzIG9iamVjdGlkCgkJCQkJCQlpZiggIShkYXRh -b2JqaWQgaW4gYWRkZWRfaWRzKSApCgkJCQkJCQl7CgkJCQkJCQkJYWRkZWRfaWRzW2RhdGFvYmpp -ZF0gPSAwOwoJCQkJCQkJfQoJCQkJCQkJZWxzZQoJCQkJCQkJewoJCQkJCQkJCWFkZGVkX2lkc1tk -YXRhb2JqaWRdID0gYWRkZWRfaWRzW2RhdGFvYmppZF0gKyAxOwoJCQkJCQkJfQoJCQkJCQkJdGhp -cy50b3RhbF9kYXRhb2JqcysrOwoKCQkJCQkJCXZhciBzdW1tYXJ5ID0gZW50cnkuc3VtbWFyeTsK -CgkJCQkJCQl2YXIgdGFyZ2V0X2lkID0gdGhpcy5wcmVmaXggKyAnXycgKyBkYXRhb2JqaWQ7CgkJ -CQkJCQlpZiggYWRkZWRfaWRzW2RhdGFvYmppZF0gPiAwICkKCQkJCQkJCXsKCQkJCQkJCQl0YXJn -ZXRfaWQgPSB0YXJnZXRfaWQgKyAnXycgKyBhZGRlZF9pZHNbZGF0YW9iamlkXTsKCQkJCQkJCX0K -CQkJCQkJCXZhciB0YXJnZXRfZWwgPSAkKCB0YXJnZXRfaWQgKTsKCgkJCQkJCQlpZiggdGFyZ2V0 -X2VsICE9IG51bGwgJiYgc3VtbWFyeSAhPSBudWxsICkKCQkJCQkJCXsKCQkJCQkJCQl2YXIgc3Vt -bWFyeV9lbCA9IHRhcmdldF9lbC5hcHBlbmRDaGlsZCggbmV3IEVsZW1lbnQoICdkaXYnLCB7ICdj -bGFzcyc6ICdlcF9yZXBvcnRfcm93X3N1bW1hcnknIH0gKSApOwoJCQkJCQkJCXN1bW1hcnlfZWwu -dXBkYXRlKCBzdW1tYXJ5ICk7CgoJCQkJCQkJCS8vdG90YWwgdXAgbm9uIGNvbXBsaWFudCByZWNv -cmRzCgkJCQkJCQkJaWYoIGVudHJ5LmlzX2NvbXBsaWFudCA9PSBudWxsICYmIGVudHJ5LnByb2Js -ZW1zICYmIGVudHJ5LnByb2JsZW1zLmxlbmd0aCApCgkJCQkJCQkJewoJCQkJCQkJCQl0aGlzLnRv -dGFsX25vbmNvbXBsaWFudCsrOwoJCQkJCQkJCX0KCQkJCQkJCQkKCQkJCQkJCQlpZiggZW50cnku -cHJvYmxlbXMgJiYgZW50cnkucHJvYmxlbXMubGVuZ3RoICkKCQkJCQkJCQl7CgkJCQkJCQkJCXZh -ciBwcm9ibGVtc19lbCA9IHRhcmdldF9lbC5hcHBlbmRDaGlsZCggbmV3IEVsZW1lbnQoICd1bCcs -IHsgJ2NsYXNzJzogJ2VwX3JlcG9ydF9yb3dfcHJvYmxlbXMnIH0gKSApOwoKCQkJCQkJCQkJZm9y -KCB2YXIgcD0wOyBwPCBlbnRyeS5wcm9ibGVtcy5sZW5ndGg7IHArKyApCgkJCQkJCQkJCXsKCQkJ -CQkJCQkJCXZhciBsaSA9IHByb2JsZW1zX2VsLmFwcGVuZENoaWxkKCBuZXcgRWxlbWVudCggJ2xp -JyApKTsKCQkJCQkJCQkJCWxpLnVwZGF0ZSggZW50cnkucHJvYmxlbXNbcF0gKTsKCQkJCQkJCQkJ -fQkJCQkJCQkJCgkJCQkJCQkJfQoJCQkJCQkJCWVsc2UKCQkJCQkJCQl7CgkJCQkJCQkJCS8vYWRk -IHN1cHBvcnQgZm9yIGNvbXBsaWFudCBpdGVtcyB0byBpbmNsdWRlIGJ1bGxldCBwb2ludHMgdG9v -CgkJCQkJCQkJCWlmKCBlbnRyeS5idWxsZXRzICYmIGVudHJ5LmJ1bGxldHMubGVuZ3RoICkKICAg +ZWxlbSkuaGlkZSgpOwoJCSQoZWxlbSkucmVtb3ZlQ2xhc3NOYW1lKCJzZWxlY3RlZF9mb3JtIik7 +CgkJJChlbGVtKS5zZWxlY3QoJ2lucHV0JykuZWFjaChmdW5jdGlvbiAoaW5wdXQpCgkJewoJCQkk +KGlucHV0KS5zZXRBdHRyaWJ1dGUoImRpc2FibGVkIiwgImRpc2FibGVkIik7CgkJfSk7Cgl9KTsK +CQkKCS8vc2hvdyB0aGUgZm9ybSB3ZSB3YW50CgkkKGZvcm1pZCkuc2hvdygpOwoJJChmb3JtaWQp +LmFkZENsYXNzTmFtZSgic2VsZWN0ZWRfZm9ybSIpOwoKCS8vZW5hYmxlIHRoaXMgZm9ybSdzIGlu +cHV0IGVsZW1lbnRzCgkkKGZvcm1pZCkuc2VsZWN0KCdpbnB1dCcpLmVhY2goZnVuY3Rpb24gKGlu +cHV0KQoJewoJCSQoaW5wdXQpLnJlbW92ZUF0dHJpYnV0ZSgiZGlzYWJsZWQiKTsKCX0pOwoKfTsK +Ci8vIFVzZWQgYnkgdGhlIFNjcmVlbjo6UmVwb3J0OjpyZW5kZXIgbWV0aG9kCgp2YXIgRVByaW50 +c19TY3JlZW5fUmVwb3J0X0xvYWRlciA9IENsYXNzLmNyZWF0ZSh7CgloYXNfcHJvYmxlbXM6IDAs +Cgljb3VudDogMCwKCXJ1bnM6IDAsCglwcm9ncmVzczogbnVsbCwKCWlkczogQXJyYXkoKSwKCXN0 +ZXA6IDIwLAoJcHJlZml4OiAnJywKCW9uUHJvYmxlbXM6IGZ1bmN0aW9uKCkge30sCglvbkZpbmlz +aDogZnVuY3Rpb24oKSB7fSwKCXVybDogIiIsCglwYXJhbWV0ZXJzOiAiIiwKCWNvbnRhaW5lcjog +bnVsbCwKCXNob3dfY29tcGxpYW5jZTogMSwJCgoJLy8gdG8gc2hvdyBhIHByZXR0eSBwcm9ncmVz +cyBiYXIgKCUgY29tcGxpYW5jZSk6Cgl0b3RhbF9kYXRhb2JqczogMCwKCXRvdGFsX25vbmNvbXBs +aWFudDogMCwKCgoJaW5pdGlhbGl6ZTogZnVuY3Rpb24ob3B0cykgewoJCWlmKCBvcHRzLmlkcyAp +CgkJCXRoaXMuaWRzID0gb3B0cy5pZHM7CgkJaWYoIG9wdHMuc3RlcCApCgkJCXRoaXMuc3RlcCA9 +IG9wdHMuc3RlcDsKCQlpZiggb3B0cy5wcmVmaXggKQoJCQl0aGlzLnByZWZpeCA9IG9wdHMucHJl +Zml4OwoJCWlmKCBvcHRzLm9uRmluaXNoICkKCQkJdGhpcy5vbkZpbmlzaCA9IG9wdHMub25GaW5p +c2g7CgkJaWYoIG9wdHMub25Qcm9ibGVtcyApCgkJCXRoaXMub25Qcm9ibGVtcyA9IG9wdHMub25Q +cm9ibGVtczsKCQlpZiggb3B0cy51cmwgKQoJCXsKCQkJdGhpcy51cmwgPSBvcHRzLnVybDsKCQl9 +CgkJaWYoIG9wdHMucGFyYW1ldGVycyApCgkJCXRoaXMucGFyYW1ldGVycyA9IG9wdHMucGFyYW1l +dGVyczsKCQlpZiggb3B0cy5jb250YWluZXJfaWQgKQoJCQl0aGlzLmNvbnRhaW5lciA9ICQoIG9w +dHMuY29udGFpbmVyX2lkICk7CS8vIHNob3VsZCBmYWlsIGlmIGNvbnRhaW5lciBkb2Vzbid0IGV4 +aXN0Li4uCgkJaWYoIG9wdHMuaGFzT3duUHJvcGVydHkoJ3Nob3dfY29tcGxpYW5jZScpICkKCQl7 +CgkJCXRoaXMuc2hvd19jb21wbGlhbmNlID0gb3B0cy5zaG93X2NvbXBsaWFuY2U7CgkJfQoJCWlm +KCBvcHRzLmxhYmVscyApCgkJewoJCQl0aGlzLmxhYmVscyA9IG9wdHMubGFiZWxzOwoJCX0KCX0s +CgoJZXhlY3V0ZTogZnVuY3Rpb24oKSB7CgkJLy8gcHJvZ3Jlc3MtYmFyCgoJCXRoaXMuY29udGFp +bmVyLmluc2VydCggbmV3IEVsZW1lbnQoICdkaXYnLCB7ICdjbGFzcyc6ICdlcF9yZXBvcnRfcHJv +Z3Jlc3NfYmFyJywgJ2lkJzogdGhpcy5wcmVmaXggKyAiX3Byb2dyZXNzX2JhciIgfSApICk7CQoK +CQl2YXIgY3VycmVudF9ncm91cGluZyA9IG51bGw7CS8vIG1pZ2h0IG5vdCBiZSBzZXQgaW4gdGhl +IHJldHVybmVkIHZhbHVlIGJ1dCB0aGF0J3MgYWxsb3dlZC9PSwoKCQl2YXIgZGF0YW9ianMgPSB7 +fTsKCQl2YXIgZ3JvdXBlZCA9IGZhbHNlOwoJCXZhciBzZWVuX2lkcyA9IHt9OwoJCXRoaXMubm9f +aXRlbXMgPSB0aGlzLmlkcy5sZW5ndGg7CgkJdGhpcy5yZXRyaWV2ZWQgPSBbXTsKCQlpZiggIWlz +SW50ZWdlcih0aGlzLmlkc1swXSkgKSAvL2lkcyBoYXZlIGJlZW4gZ3JvdXBlZAoJCXsJCgkJCWdy +b3VwZWQgPSB0cnVlOwoJCQl0aGlzLmdyb3VwZWRfaWRzID0gdGhpcy5pZHM7CgkJCXRoaXMuaWRz +ID0gW107CgkJCWZvciggdmFyIGkgPSAwOyBpIDwgdGhpcy5ncm91cGVkX2lkcy5sZW5ndGg7IGkr +KyApCgkJCXsKCQkJCXRoaXMuaWRzID0gdGhpcy5pZHMuY29uY2F0KHRoaXMuZ3JvdXBlZF9pZHNb +aV0ubGlzdCk7CgkJCX0KCQkJLy90aGUgZ3JvdXBpbmcgbWF5IGhhdmUgY3JlYXRlZCBkdXBsaWNh +dGUgcmVjb3JkcyAoaS5lLiBhIHJlY29yZCBjYW4gYXBwZWFyIGluIG1vcmUgdGhhbiBvbmUgZ3Jv +dXApIC0gaXQncyBoYW5keSB0byBoYXZlIGFuIGFycmF5IG9mIGFsbCB0aGUgdW5pcXVlIHJlY29y +ZHMKCQkJdGhpcy51bmlxdWUgPSB0aGlzLmlkcy5maWx0ZXIoZnVuY3Rpb24oaXRlbSwgaSwgYXIp +eyByZXR1cm4gYXIuaW5kZXhPZihpdGVtKSA9PT0gaTsgfSk7CgkJCXRoaXMubm9faXRlbXMgPSB0 +aGlzLnVuaXF1ZS5sZW5ndGg7CgkJfQoJCWZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLmlkcy5sZW5n +dGg7IGkrPXRoaXMuc3RlcCkKCQl7CgkJCS8vIGFyZ3VtZW50cyBmb3IgQWpheCBxdWVyeSBBTkQg +Y3JlYXRlcyB0aGUgSFRNTCBwbGFjZWhvbGRlcnMgPGRpdj4ncyAodGhhdCB3aWxsIHJlY2VpdmUg +dGhlIGNvbnRlbnQgb2YgdGhlIEFqYXggcXVlcnkuLi4pCQkJCQoJCQl2YXIgYXJncyA9ICcmYWph +eD0nK3RoaXMucHJlZml4OwoJCQlmb3IodmFyIGogPSAwOyBqIDwgdGhpcy5zdGVwICYmIGkraiA8 +IHRoaXMuaWRzLmxlbmd0aDsgaisrKQoJCQl7CgkJCQlhcmdzICs9ICcmJyArIHRoaXMucHJlZml4 +ICsgJz0nICsgdGhpcy5pZHNbaStqXTsKCQkJCXZhciBpZCA9IHRoaXMucHJlZml4ICsgJ18nICsg +dGhpcy5pZHNbaStqXTsKCQkJCXZhciB0YXJnZXRfZWwgPSAkKCBpZCApOwoJCQkJaWYoIHRhcmdl +dF9lbCAhPSBudWxsICkKCQkJCXsKCQkJCQkvL3N0b3JlIGEgcmVjb3JkIG9mIHRoaXMgaW4gc2Vl +bl9pZHMgdG8gZW5zdXJlIGVhY2ggcGxhY2Vob2xkZXIgaGFzIGEgdW5pcXVlIGlkCgkJCQkJaWYo +ICEoaWQgaW4gc2Vlbl9pZHMpICkKCQkJCQl7CgkJCQkJCXNlZW5faWRzW2lkXSA9IDE7CgkJCQkJ +fQoJCQkJCWVsc2UKCQkJCQl7CgkJCQkJCXNlZW5faWRzW2lkXSA9IHNlZW5faWRzW2lkXSArIDE7 +CgkJCQkJfQoJCQkJCWlkID0gaWQgKyAiXyIgKyBzZWVuX2lkc1tpZF07CgkJCQl9CgkJCQkJCgkJ +CQl0aGlzLmNvbnRhaW5lci5pbnNlcnQoIG5ldyBFbGVtZW50KCAnZGl2JywgeyAnY2xhc3MnOiAn +ZXBfcmVwb3J0X3JvdycsICdpZCc6IGlkLCAncG9zaXRpb24nOiBpK2ogfSApLCB7ICdwb3NpdGlv +bic6ICdhZnRlcicgfSApOwoJCQl9CgkJCW5ldyBBamF4LlJlcXVlc3QoIHRoaXMudXJsLCB7CgkJ +CQltZXRob2Q6ICdnZXQnLAoJCQkJcGFyYW1ldGVyczogdGhpcy5wYXJhbWV0ZXJzICsgYXJncywK +CQkJCW9uU3VjY2VzczogKGZ1bmN0aW9uKHRyYW5zcG9ydCkgewoKCQkJCQl2YXIganNvbiA9IHRy +YW5zcG9ydC5yZXNwb25zZVRleHQuZXZhbEpTT04oKTsKCQkJCQl2YXIgZGF0YSA9IGpzb24uZGF0 +YTsKCQoJCQkJCWlmKCBkYXRhID09IG51bGwgKQoJCQkJCQlkYXRhID0gbmV3IEFycmF5KCk7CgkJ +CQkJZm9yKCB2YXIgaT0wOyBpPGRhdGEubGVuZ3RoOyBpKysgKQoJCQkJCXsKCQkJCQkJdmFyIGVu +dHJ5ID0gZGF0YVtpXTsKCQkJCQoJCQkJCQkvLyBlbnRyeS5kYXRhb2JqaWQKCQkJCQkJLy8gZW50 +cnkuc3VtbWFyeQoJCQkJCQkvLyBlbnRyeS5ncm91cGluZwoJCQkJCQkvLyBlbnRyeS5wcm9ibGVt +cwoKCQkJCQkJaWYoIGVudHJ5ID09IG51bGwgKQoJCQkJCQkJY29udGludWU7CgkJCQkJCQoJCQkJ +CQl2YXIgZGF0YW9iamlkID0gZW50cnkuZGF0YW9iamlkOwoJCQkJCQlpZiggZGF0YW9iamlkID09 +IG51bGwgKQoJCQkJCQkJY29udGludWU7CgkJCQkJCWlmKCAhKGRhdGFvYmppZCBpbiBkYXRhb2Jq +cykgKQoJCQkJCQl7CgkJCQkJCQl0aGlzLmNvdW50Kys7CgkJCQkJCQlkYXRhb2Jqc1tkYXRhb2Jq +aWRdID0gZW50cnk7CgkJCQkJCX0KCQkJCQl9CgkJCQoJCQkJCS8vIHdlJ3ZlIHJldHJpZXZlZCBh +bGwgdGhlIHJlY29yZHMJCQkJCgkJCQkJaWYoIHRoaXMuY291bnQgPT0gdGhpcy5ub19pdGVtcyAp +CgkJCQkJewoJCQkJCQkkKCB0aGlzLnByZWZpeCArICdfcHJvZ3Jlc3NfYmFyJyApLnJlbW92ZSgp +OwoJCQkJCQlpZiggdGhpcy5oYXNfcHJvYmxlbXMgKQoJCQkJCQkJdGhpcy5vblByb2JsZW1zKHRo +aXMpOwoJCQkJCQl0aGlzLm9uRmluaXNoKHRoaXMpOwoJCQkJCQkJCgkJCQkJCS8vYWRkIHRoZSBn +cm91cCBoZWFkaW5ncwoJCQkJCQlpZihncm91cGVkKQoJCQkJCQl7CgkJCQkJCQl2YXIgcG9zaXRp +b24gPSAwOwoJCQkJCQkJZm9yKCB2YXIgaSA9IDA7IGkgPCB0aGlzLmdyb3VwZWRfaWRzLmxlbmd0 +aDsgaSsrICkKCQkJCSAgICAgICAgICAgICAgICAgICAgICAgIHsJCgkJCQkJCQkJdmFyIHRhcmdl +dF9lbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1twb3NpdGlvbj0iJyArIHBvc2l0aW9u +ICsgJyJdJylbMF07CgkJCQkJCQkJcG9zaXRpb24gPSBwb3NpdGlvbiArIHRoaXMuZ3JvdXBlZF9p +ZHNbaV0ubGlzdC5sZW5ndGg7CQkJCgkJCQkJCQkJdmFyIGdyb3VwaW5nX2NvbnRhaW5lciA9IG5l +dyBFbGVtZW50KCAnZGl2JywgeyAnY2xhc3MnOiAnZXBfcmVwb3J0X2dyb3VwaW5nJyB9ICk7CiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBidWxsZXRzX2VsID0gdGFy -Z2V0X2VsLmFwcGVuZENoaWxkKCBuZXcgRWxlbWVudCggJ3VsJywgeyAnY2xhc3MnOiAnZXBfcmVw -b3J0X3Jvd19idWxsZXRzJyB9ICkgKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKCB2YXIg -Yj0wOyBiPCBlbnRyeS5idWxsZXRzLmxlbmd0aDsgYisrICkKICAgICAgICAgICAgICAgICAgICAg +ICAgICB0YXJnZXRfZWwuaW5zZXJ0KCB7ICdiZWZvcmUnIDogZ3JvdXBpbmdfY29udGFpbmVyIH0g +KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgIGdyb3VwaW5nX2NvbnRhaW5lci51cGRhdGUoIHRoaXMuZ3JvdXBlZF9pZHNbaV0u +bGFiZWwgKTsKCQkJCSAgICAgICAgICAgICAgICAgICAgICAgIH0KCQkJCQkJfQoKCQkJCQkJLy9h +ZGQgdGhlIGVwcmludCBzdW1tYXJpZXMKCQkJCQkJdmFyIGFkZGVkX2lkcyA9IHt9OwoJCQkJCQlm +b3IoIHZhciBjID0gMDsgYyA8IHRoaXMuaWRzLmxlbmd0aDsgYysrICkKCQkJCQkJewoJCQkJCQkJ +dmFyIGRhdGFvYmppZCA9IHRoaXMuaWRzW2NdOwoJCQkJCQkJdmFyIGVudHJ5ID0gZGF0YW9ianNb +ZGF0YW9iamlkXTsKCgkJCQkJCQkvL3N0b3JlIHRoYXQgd2UgaGF2ZSBhZGRlZCB0aGlzIG9iamVj +dGlkCgkJCQkJCQlpZiggIShkYXRhb2JqaWQgaW4gYWRkZWRfaWRzKSApCgkJCQkJCQl7CgkJCQkJ +CQkJYWRkZWRfaWRzW2RhdGFvYmppZF0gPSAwOwoJCQkJCQkJfQoJCQkJCQkJZWxzZQoJCQkJCQkJ +ewoJCQkJCQkJCWFkZGVkX2lkc1tkYXRhb2JqaWRdID0gYWRkZWRfaWRzW2RhdGFvYmppZF0gKyAx +OwoJCQkJCQkJfQoJCQkJCQkJdGhpcy50b3RhbF9kYXRhb2JqcysrOwoKCQkJCQkJCXZhciBzdW1t +YXJ5ID0gZW50cnkuc3VtbWFyeTsKCgkJCQkJCQl2YXIgdGFyZ2V0X2lkID0gdGhpcy5wcmVmaXgg +KyAnXycgKyBkYXRhb2JqaWQ7CgkJCQkJCQlpZiggYWRkZWRfaWRzW2RhdGFvYmppZF0gPiAwICkK +CQkJCQkJCXsKCQkJCQkJCQl0YXJnZXRfaWQgPSB0YXJnZXRfaWQgKyAnXycgKyBhZGRlZF9pZHNb +ZGF0YW9iamlkXTsKCQkJCQkJCX0KCQkJCQkJCXZhciB0YXJnZXRfZWwgPSAkKCB0YXJnZXRfaWQg +KTsKCgkJCQkJCQlpZiggdGFyZ2V0X2VsICE9IG51bGwgJiYgc3VtbWFyeSAhPSBudWxsICkKCQkJ +CQkJCXsKCQkJCQkJCQl2YXIgc3VtbWFyeV9lbCA9IHRhcmdldF9lbC5hcHBlbmRDaGlsZCggbmV3 +IEVsZW1lbnQoICdkaXYnLCB7ICdjbGFzcyc6ICdlcF9yZXBvcnRfcm93X3N1bW1hcnknIH0gKSAp +OwoJCQkJCQkJCXN1bW1hcnlfZWwudXBkYXRlKCBzdW1tYXJ5ICk7CgoJCQkJCQkJCS8vdG90YWwg +dXAgbm9uIGNvbXBsaWFudCByZWNvcmRzCgkJCQkJCQkJaWYoIGVudHJ5LmlzX2NvbXBsaWFudCA9 +PSBudWxsICYmIGVudHJ5LnByb2JsZW1zICYmIGVudHJ5LnByb2JsZW1zLmxlbmd0aCApCgkJCQkJ +CQkJewoJCQkJCQkJCQl0aGlzLnRvdGFsX25vbmNvbXBsaWFudCsrOwoJCQkJCQkJCX0KCQkJCQkJ +CQkKCQkJCQkJCQlpZiggZW50cnkucHJvYmxlbXMgJiYgZW50cnkucHJvYmxlbXMubGVuZ3RoICkK +CQkJCQkJCQl7CgkJCQkJCQkJCXZhciBwcm9ibGVtc19lbCA9IHRhcmdldF9lbC5hcHBlbmRDaGls +ZCggbmV3IEVsZW1lbnQoICd1bCcsIHsgJ2NsYXNzJzogJ2VwX3JlcG9ydF9yb3dfcHJvYmxlbXMn +IH0gKSApOwoKCQkJCQkJCQkJZm9yKCB2YXIgcD0wOyBwPCBlbnRyeS5wcm9ibGVtcy5sZW5ndGg7 +IHArKyApCgkJCQkJCQkJCXsKCQkJCQkJCQkJCXZhciBsaSA9IHByb2JsZW1zX2VsLmFwcGVuZENo +aWxkKCBuZXcgRWxlbWVudCggJ2xpJyApKTsKCQkJCQkJCQkJCWxpLnVwZGF0ZSggZW50cnkucHJv +YmxlbXNbcF0gKTsKCQkJCQkJCQkJfQkJCQkJCQkJCgkJCQkJCQkJfQoJCQkJCQkJCWVsc2UKCQkJ +CQkJCQl7CgkJCQkJCQkJCS8vYWRkIHN1cHBvcnQgZm9yIGNvbXBsaWFudCBpdGVtcyB0byBpbmNs +dWRlIGJ1bGxldCBwb2ludHMgdG9vCgkJCQkJCQkJCWlmKCBlbnRyeS5idWxsZXRzICYmIGVudHJ5 +LmJ1bGxldHMubGVuZ3RoICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbGkgPSBidWxsZXRzX2VsLmFw -cGVuZENoaWxkKCBuZXcgRWxlbWVudCggJ2xpJyApKTsKICAgICAgICAgICAgICAgICAgICAgICAg +IHZhciBidWxsZXRzX2VsID0gdGFyZ2V0X2VsLmFwcGVuZENoaWxkKCBuZXcgRWxlbWVudCggJ3Vs +JywgeyAnY2xhc3MnOiAnZXBfcmVwb3J0X3Jvd19idWxsZXRzJyB9ICkgKTsKCiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgIGxpLnVwZGF0ZSggZW50cnkuYnVsbGV0c1tiXSApOwogICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgZm9yKCB2YXIgYj0wOyBiPCBlbnRyeS5idWxsZXRzLmxlbmd0aDsgYisrICkK ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgfQoJCQkJCQkJCX0KCgkJCQkJCQkJLy9kaXNwbGF5IHN0YXRl -CgkJCQkJCQkJdmFyIHJlID0gbmV3IFJlZ0V4cCgiXiMoPzpbMC05YS1mQS1GXXszfSl7MSwyfSQi -KTsKCQkJCQkJCQlpZiggZW50cnkuc3RhdGUgJiYgcmUudGVzdChlbnRyeS5zdGF0ZSkgKQoJCQkJ -CQkJCXsKCQkJCQkJCQkJdGFyZ2V0X2VsLnN0eWxlLmJvcmRlckxlZnRXaWR0aCA9ICc3cHgnOwog +ICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2 +YXIgbGkgPSBidWxsZXRzX2VsLmFwcGVuZENoaWxkKCBuZXcgRWxlbWVudCggJ2xpJyApKTsKICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICB0YXJnZXRfZWwuc3R5bGUuYm9yZGVyTGVmdFN0eWxlID0gJ3NvbGlkJzsK -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgdGFyZ2V0X2VsLnN0eWxlLmJvcmRlckxlZnRDb2xvciA9IGVudHJ5LnN0 -YXRlOwoJCQkJCQkJCX0KCQkJCQkJCQllbHNlIC8vbm8gc3RhdGUgcHJvdmlkZWQsIHNvIGRlcml2 -ZSBvbmUgZnJvbSBleGlzdGVuY2Ugb2YgcHJvYmxlbXMKCQkJCQkJCQl7CgkJCQkJCQkJCWlmKCBl -bnRyeS5wcm9ibGVtcyAmJiBlbnRyeS5wcm9ibGVtcy5sZW5ndGggKQoJCQkJCQkJCQl7CgkJCQkJ -CQkJCQl0YXJnZXRfZWwuYWRkQ2xhc3NOYW1lKCAnZXBfcmVwb3J0X3Jvd19wcm9ibGVtcycgKTsK -CQkJCQkJCQkJfQoJCQkJCQkJCQllbHNlCgkJCQkJCQkJCXsKCQkJCQkJCQkJCXRhcmdldF9lbC5h -ZGRDbGFzc05hbWUoICdlcF9yZXBvcnRfcm93X29rJyApOwoJCQkJCQkJCQl9CgoJCQkJCQkJCQlp -ZiggIXRoaXMuc2hvd19jb21wbGlhbmNlICkKCQkJCQkJCQkJewoJCQkJCQkJCQkJdGFyZ2V0X2Vs -LmFkZENsYXNzTmFtZSggJ2VwX3JlcG9ydF9yb3dfbm9fY29tcGxpYW5jZScgKTsKCQkJCQkJCQkJ -fQoJCQkJCQkJCX0JCQkJCQkJCQoJCQkJCQkJCXRhcmdldF9lbC5zaG93KCk7CgoJCQkJCQkJCXZh -ciBncm91cGluZyA9IGVudHJ5Lmdyb3VwaW5nOwoJCQkJCQkJCWlmKCBncm91cGluZyAhPSBudWxs -ICkKCQkJCQkJCQl7CgkJCQkJCQkJCWlmKCBjdXJyZW50X2dyb3VwaW5nID09IG51bGwgfHwgY3Vy -cmVudF9ncm91cGluZyAhPSBncm91cGluZykKCQkJCQkJCQkJewoJCQkJCQkJCQkJY3VycmVudF9n -cm91cGluZyA9IGdyb3VwaW5nOwoJCQkJCQkJCQkJdmFyIGdyb3VwaW5nX2NvbnRhaW5lciA9IG5l -dyBFbGVtZW50KCAnZGl2JywgeyAnY2xhc3MnOiAnZXBfcmVwb3J0X2dyb3VwaW5nJyB9ICk7CgkJ -CQkJCQkJCQl0YXJnZXRfZWwuaW5zZXJ0KCB7ICdiZWZvcmUnIDogZ3JvdXBpbmdfY29udGFpbmVy -IH0gKTsKCQkJCQkJCQkJCWdyb3VwaW5nX2NvbnRhaW5lci51cGRhdGUoIGN1cnJlbnRfZ3JvdXBp -bmcgKTsKCQkJCQkJCQkJfQoJCQkJCQkJCX0KCQkJCQkJCX0KCQkJCQkJfQoKCgkJCQkJCWlmKCB0 -aGlzLnRvdGFsX2RhdGFvYmpzICkKCQkJCQkJewoJCQkJCQkJCgkJCQkJCQl0aGlzLmNvbnRhaW5l -ci5pbnNlcnRCZWZvcmUoIG5ldyBFbGVtZW50KCAnZGl2JywgeyAnY2xhc3MnOiAnZXBfcmVwb3J0 -X2NvbXBsaWFuY2VfY29udGFpbmVyJywgJ2lkJzogdGhpcy5wcmVmaXggKyAiX2NvbXBsaWFuY2Vf -Y29udGFpbmVyIiB9ICksIHRoaXMuY29udGFpbmVyLmZpcnN0Q2hpbGQgKTsKCQkJCQkJCS8vc2V0 -IHVwIHRleHQgY29udGFpbmVyCgkJCQkJCQkkKCB0aGlzLnByZWZpeCArICJfY29tcGxpYW5jZV9j +ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpLnVwZGF0ZSggZW50cnkuYnVsbGV0c1tiXSAp +OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoJCQkJCQkJCX0KCgkJ +CQkJCQkJLy9kaXNwbGF5IHN0YXRlCgkJCQkJCQkJdmFyIHJlID0gbmV3IFJlZ0V4cCgiXiMoPzpb +MC05YS1mQS1GXXszfSl7MSwyfSQiKTsKCQkJCQkJCQlpZiggZW50cnkuc3RhdGUgJiYgcmUudGVz +dChlbnRyeS5zdGF0ZSkgKQoJCQkJCQkJCXsKCQkJCQkJCQkJdGFyZ2V0X2VsLnN0eWxlLmJvcmRl +ckxlZnRXaWR0aCA9ICc3cHgnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfZWwuc3R5bGUuYm9yZGVy +TGVmdFN0eWxlID0gJ3NvbGlkJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X2VsLnN0eWxlLmJvcmRl +ckxlZnRDb2xvciA9IGVudHJ5LnN0YXRlOwoJCQkJCQkJCX0KCQkJCQkJCQllbHNlIC8vbm8gc3Rh +dGUgcHJvdmlkZWQsIHNvIGRlcml2ZSBvbmUgZnJvbSBleGlzdGVuY2Ugb2YgcHJvYmxlbXMKCQkJ +CQkJCQl7CgkJCQkJCQkJCWlmKCBlbnRyeS5wcm9ibGVtcyAmJiBlbnRyeS5wcm9ibGVtcy5sZW5n +dGggKQoJCQkJCQkJCQl7CgkJCQkJCQkJCQl0YXJnZXRfZWwuYWRkQ2xhc3NOYW1lKCAnZXBfcmVw +b3J0X3Jvd19wcm9ibGVtcycgKTsKCQkJCQkJCQkJfQoJCQkJCQkJCQllbHNlCgkJCQkJCQkJCXsK +CQkJCQkJCQkJCXRhcmdldF9lbC5hZGRDbGFzc05hbWUoICdlcF9yZXBvcnRfcm93X29rJyApOwoJ +CQkJCQkJCQl9CgoJCQkJCQkJCQlpZiggIXRoaXMuc2hvd19jb21wbGlhbmNlICkKCQkJCQkJCQkJ +ewoJCQkJCQkJCQkJdGFyZ2V0X2VsLmFkZENsYXNzTmFtZSggJ2VwX3JlcG9ydF9yb3dfbm9fY29t +cGxpYW5jZScgKTsKCQkJCQkJCQkJfQoJCQkJCQkJCX0JCQkJCQkJCQoJCQkJCQkJCXRhcmdldF9l +bC5zaG93KCk7CgoJCQkJCQkJCXZhciBncm91cGluZyA9IGVudHJ5Lmdyb3VwaW5nOwoJCQkJCQkJ +CWlmKCBncm91cGluZyAhPSBudWxsICkKCQkJCQkJCQl7CgkJCQkJCQkJCWlmKCBjdXJyZW50X2dy +b3VwaW5nID09IG51bGwgfHwgY3VycmVudF9ncm91cGluZyAhPSBncm91cGluZykKCQkJCQkJCQkJ +ewoJCQkJCQkJCQkJY3VycmVudF9ncm91cGluZyA9IGdyb3VwaW5nOwoJCQkJCQkJCQkJdmFyIGdy +b3VwaW5nX2NvbnRhaW5lciA9IG5ldyBFbGVtZW50KCAnZGl2JywgeyAnY2xhc3MnOiAnZXBfcmVw +b3J0X2dyb3VwaW5nJyB9ICk7CgkJCQkJCQkJCQl0YXJnZXRfZWwuaW5zZXJ0KCB7ICdiZWZvcmUn +IDogZ3JvdXBpbmdfY29udGFpbmVyIH0gKTsKCQkJCQkJCQkJCWdyb3VwaW5nX2NvbnRhaW5lci51 +cGRhdGUoIGN1cnJlbnRfZ3JvdXBpbmcgKTsKCQkJCQkJCQkJfQoJCQkJCQkJCX0KCQkJCQkJCX0K +CQkJCQkJfQoKCgkJCQkJCWlmKCB0aGlzLnRvdGFsX2RhdGFvYmpzICkKCQkJCQkJewoJCQkJCQkJ +CgkJCQkJCQl0aGlzLmNvbnRhaW5lci5pbnNlcnRCZWZvcmUoIG5ldyBFbGVtZW50KCAnZGl2Jywg +eyAnY2xhc3MnOiAnZXBfcmVwb3J0X2NvbXBsaWFuY2VfY29udGFpbmVyJywgJ2lkJzogdGhpcy5w +cmVmaXggKyAiX2NvbXBsaWFuY2VfY29udGFpbmVyIiB9ICksIHRoaXMuY29udGFpbmVyLmZpcnN0 +Q2hpbGQgKTsKCQkJCQkJCS8vc2V0IHVwIHRleHQgY29udGFpbmVyCgkJCQkJCQkkKCB0aGlzLnBy +ZWZpeCArICJfY29tcGxpYW5jZV9jb250YWluZXIiICkuYXBwZW5kQ2hpbGQoIG5ldyBFbGVtZW50 +KCAnZGl2JywgeyAnY2xhc3MnOiAnZXBfcmVwb3J0X2NvbXBsaWFuY2VfdGV4dCcsICdpZCc6IHRo +aXMucHJlZml4ICsgIl9jb21wbGlhbmNlX3RleHQiLCAgfSApKTsKCgkJCQkJCQkvL3NldCB1cCBv +dXRwdXRzIGxhYmVsCgkJCQkJCQl2YXIgb3V0cHV0czsKCQkJCQkJCWlmKCB0aGlzLmxhYmVscyAp +CgkJCQkJCQl7CgkJCQkJCQkJb3V0cHV0cyA9IHRoaXMubGFiZWxzLm91dHB1dHM7CgkJCQkJCQl9 +CgkJCQkJCQllbHNlCgkJCQkJCQl7CgkJCQkJCQkJb3V0cHV0cyA9ICJvdXRwdXQiOwoJCQkJCQkJ +CWlmKCB0aGlzLnRvdGFsX2RhdGFvYmpzID4gMSApCgkJCQkJCQkJCW91dHB1dHMgPSBvdXRwdXRz +ICsgInMiOwoJCQkJCQkJfQoKCQkJCQkJCWlmKCB0aGlzLnNob3dfY29tcGxpYW5jZSApCgkJCQkJ +CQl7CgkJCQkJCQkJdmFyIHJlZl93aWR0aCA9IDIwMDsKCQkJCQkJCQl2YXIgY29tcGxpYW5jZSA9 +ICggdGhpcy50b3RhbF9kYXRhb2JqcyAtIHRoaXMudG90YWxfbm9uY29tcGxpYW50ICkgLyB0aGlz +LnRvdGFsX2RhdGFvYmpzOwoKCQkJCQkJCQkkKCB0aGlzLnByZWZpeCArICJfY29tcGxpYW5jZV9j b250YWluZXIiICkuYXBwZW5kQ2hpbGQoIG5ldyBFbGVtZW50KCAnZGl2JywgeyAnY2xhc3MnOiAn -ZXBfcmVwb3J0X2NvbXBsaWFuY2VfdGV4dCcsICdpZCc6IHRoaXMucHJlZml4ICsgIl9jb21wbGlh -bmNlX3RleHQiLCAgfSApKTsKCgkJCQkJCQkvL3NldCB1cCBvdXRwdXRzIGxhYmVsCgkJCQkJCQl2 -YXIgb3V0cHV0czsKCQkJCQkJCWlmKCB0aGlzLmxhYmVscyApCgkJCQkJCQl7CgkJCQkJCQkJb3V0 -cHV0cyA9IHRoaXMubGFiZWxzLm91dHB1dHM7CgkJCQkJCQl9CgkJCQkJCQllbHNlCgkJCQkJCQl7 -CgkJCQkJCQkJb3V0cHV0cyA9ICJvdXRwdXQiOwoJCQkJCQkJCWlmKCB0aGlzLnRvdGFsX2RhdGFv -YmpzID4gMSApCgkJCQkJCQkJCW91dHB1dHMgPSBvdXRwdXRzICsgInMiOwoJCQkJCQkJfQoKCQkJ -CQkJCWlmKCB0aGlzLnNob3dfY29tcGxpYW5jZSApCgkJCQkJCQl7CgkJCQkJCQkJdmFyIHJlZl93 -aWR0aCA9IDIwMDsKCQkJCQkJCQl2YXIgY29tcGxpYW5jZSA9ICggdGhpcy50b3RhbF9kYXRhb2Jq -cyAtIHRoaXMudG90YWxfbm9uY29tcGxpYW50ICkgLyB0aGlzLnRvdGFsX2RhdGFvYmpzOwoKCQkJ -CQkJCQkkKCB0aGlzLnByZWZpeCArICJfY29tcGxpYW5jZV9jb250YWluZXIiICkuYXBwZW5kQ2hp -bGQoIG5ldyBFbGVtZW50KCAnZGl2JywgeyAnY2xhc3MnOiAnZXBfcmVwb3J0X2NvbXBsaWFuY2Vf -d3JhcHBlcicsICdpZCc6IHRoaXMucHJlZml4ICsgIl9jb21wbGlhbmNlIiwgJ3N0eWxlJzogJ3dp -ZHRoOiAnK3JlZl93aWR0aCArICdweCcgfSApICk7CgoJCQkJCQkJCXZhciBjb21wbGlhbmNlX3dp -ZHRoID0gTWF0aC5mbG9vciggMjAwICogY29tcGxpYW5jZSApOwoJCgkJCQkJCQkJJCggdGhpcy5w -cmVmaXggKyAiX2NvbXBsaWFuY2UiICkuYXBwZW5kQ2hpbGQoIG5ldyBFbGVtZW50KCAnZGl2Jywg -eyAnY2xhc3MnOiAnZXBfcmVwb3J0X2NvbXBsaWFuY2UnLCAnc3R5bGUnOiAnd2lkdGg6Jytjb21w -bGlhbmNlX3dpZHRoICsgJ3B4JyB9ICkgKTsKCQoJCQkJCQkJCSQoIHRoaXMucHJlZml4ICsgIl9j -b21wbGlhbmNlX3RleHQiICkudXBkYXRlKCB0aGlzLnRvdGFsX2RhdGFvYmpzICsgIiAiICsgb3V0 -cHV0cyArICIgLSAiICsgTWF0aC5mbG9vciggY29tcGxpYW5jZSAqIDEwMCApICsgIiUgY29tcGxp -YW5jZSIpOwoJCQkJCQkJfQoJCQkJCQkJZWxzZQoJCQkJCQkJewoJCQkJCQkJCSQoIHRoaXMucHJl -Zml4ICsgIl9jb21wbGlhbmNlX3RleHQiICkudXBkYXRlKCB0aGlzLnRvdGFsX2RhdGFvYmpzICsg -IiAiICsgb3V0cHV0cyApOwoJCQkJCQkJfQoJCQkJCQl9CQoKCQkJCQl9CgkJCQkJZWxzZQoJCQkJ -CXsKCQkJCQkJdmFyIHdpZHRoID0gMjAwOwoJCQkJCQkkKCB0aGlzLnByZWZpeCArICdfcHJvZ3Jl -c3NfYmFyJyApLnN0eWxlLmJhY2tncm91bmRQb3NpdGlvbiA9IE1hdGgucm91bmQoLXdpZHRoICsg -d2lkdGggKiB0aGlzLmNvdW50IC8gdGhpcy5pZHMubGVuZ3RoKSArICJweCAwcHgiOwoJCQkJCX0K -CgkJCQkJaWYoIHRoaXMucnVucyA9PSAwICYmIHRoaXMuY291bnQgPT0gMCApCgkJCQkJewoJCQkJ -CQl2YXIgcE5vZGUgPSAkKCB0aGlzLnByZWZpeCArICdfcHJvZ3Jlc3NfYmFyJyApLnBhcmVudE5v -ZGU7CgkJCQkJCSQodGhpcy5wcmVmaXggKyAnX3Byb2dyZXNzX2JhcicpLnJlbW92ZSgpOwoJCQkJ -CQl2YXIgc3BhbiA9IG5ldyBFbGVtZW50KCAnc3BhbicsIHsgJ2NsYXNzJzogJ2VwX3JlZl9yZXBv -cnRfZW1wdHknIH0gKTsKCQkJCQkJc3Bhbi51cGRhdGUoICdSZXBvcnQgZW1wdHknICk7CgkJCQkJ -CXBOb2RlLmluc2VydCggc3BhbiApOwoJCQkJCX0KCQkJCQl0aGlzLnJ1bnMrKzsKCgkJCQl9KS5i -aW5kKHRoaXMpCgkJCX0pOwoJCX0KCQlpZiggdGhpcy5pZHMgPT0gbnVsbCB8fCB0aGlzLmlkcy5s -ZW5ndGggPT0gMCApCgkJewoJCQl2YXIgcE5vZGUgPSAkKHRoaXMucHJlZml4ICsgJ19wcm9ncmVz -c19iYXInKS5wYXJlbnROb2RlOwoJCQkkKHRoaXMucHJlZml4ICsgJ19wcm9ncmVzc19iYXInKS5o -aWRlKCk7CgkJCXZhciBzcGFuID0gbmV3IEVsZW1lbnQoICdzcGFuJywgeyAnY2xhc3MnOiAnZXBf -cmVmX3JlcG9ydF9lbXB0eScgfSApOwoJCQlzcGFuLnVwZGF0ZSggJ1JlcG9ydCBlbXB0eScgKTsK -CQkJcE5vZGUuaW5zZXJ0KCBzcGFuICk7CgkJfQoJfQoKCn0pOwoKZnVuY3Rpb24gZ3JvdXBfcmVw -b3J0KGdyb3VwKQp7Cglkb2N1bWVudC5ncm91cF9yZXBvcnQuZ3JvdXAudmFsdWUgPSBncm91cDsK -CWRvY3VtZW50Lmdyb3VwX3JlcG9ydC5zdWJtaXQoKTsKfQoKZnVuY3Rpb24gc29ydF9yZXBvcnQo -c29ydCkKewoJZG9jdW1lbnQuc29ydF9yZXBvcnQuc29ydC52YWx1ZSA9IHNvcnQ7Cglkb2N1bWVu -dC5zb3J0X3JlcG9ydC5zdWJtaXQoKTsKfQo= +ZXBfcmVwb3J0X2NvbXBsaWFuY2Vfd3JhcHBlcicsICdpZCc6IHRoaXMucHJlZml4ICsgIl9jb21w +bGlhbmNlIiwgJ3N0eWxlJzogJ3dpZHRoOiAnK3JlZl93aWR0aCArICdweCcgfSApICk7CgoJCQkJ +CQkJCXZhciBjb21wbGlhbmNlX3dpZHRoID0gTWF0aC5mbG9vciggMjAwICogY29tcGxpYW5jZSAp +OwoJCgkJCQkJCQkJJCggdGhpcy5wcmVmaXggKyAiX2NvbXBsaWFuY2UiICkuYXBwZW5kQ2hpbGQo +IG5ldyBFbGVtZW50KCAnZGl2JywgeyAnY2xhc3MnOiAnZXBfcmVwb3J0X2NvbXBsaWFuY2UnLCAn +c3R5bGUnOiAnd2lkdGg6Jytjb21wbGlhbmNlX3dpZHRoICsgJ3B4JyB9ICkgKTsKCQoJCQkJCQkJ +CSQoIHRoaXMucHJlZml4ICsgIl9jb21wbGlhbmNlX3RleHQiICkudXBkYXRlKCB0aGlzLnRvdGFs +X2RhdGFvYmpzICsgIiAiICsgb3V0cHV0cyArICIgLSAiICsgTWF0aC5mbG9vciggY29tcGxpYW5j +ZSAqIDEwMCApICsgIiUgY29tcGxpYW5jZSIpOwoJCQkJCQkJfQoJCQkJCQkJZWxzZQoJCQkJCQkJ +ewoJCQkJCQkJCSQoIHRoaXMucHJlZml4ICsgIl9jb21wbGlhbmNlX3RleHQiICkudXBkYXRlKCB0 +aGlzLnRvdGFsX2RhdGFvYmpzICsgIiAiICsgb3V0cHV0cyApOwoJCQkJCQkJfQoJCQkJCQl9CQoK +CQkJCQl9CgkJCQkJZWxzZQoJCQkJCXsKCQkJCQkJdmFyIHdpZHRoID0gMjAwOwoJCQkJCQkkKCB0 +aGlzLnByZWZpeCArICdfcHJvZ3Jlc3NfYmFyJyApLnN0eWxlLmJhY2tncm91bmRQb3NpdGlvbiA9 +IE1hdGgucm91bmQoLXdpZHRoICsgd2lkdGggKiB0aGlzLmNvdW50IC8gdGhpcy5pZHMubGVuZ3Ro +KSArICJweCAwcHgiOwoJCQkJCX0KCgkJCQkJaWYoIHRoaXMucnVucyA9PSAwICYmIHRoaXMuY291 +bnQgPT0gMCApCgkJCQkJewoJCQkJCQl2YXIgcE5vZGUgPSAkKCB0aGlzLnByZWZpeCArICdfcHJv +Z3Jlc3NfYmFyJyApLnBhcmVudE5vZGU7CgkJCQkJCSQodGhpcy5wcmVmaXggKyAnX3Byb2dyZXNz +X2JhcicpLnJlbW92ZSgpOwoJCQkJCQl2YXIgc3BhbiA9IG5ldyBFbGVtZW50KCAnc3BhbicsIHsg +J2NsYXNzJzogJ2VwX3JlZl9yZXBvcnRfZW1wdHknIH0gKTsKCQkJCQkJc3Bhbi51cGRhdGUoICdS +ZXBvcnQgZW1wdHknICk7CgkJCQkJCXBOb2RlLmluc2VydCggc3BhbiApOwoJCQkJCX0KCQkJCQl0 +aGlzLnJ1bnMrKzsKCgkJCQl9KS5iaW5kKHRoaXMpCgkJCX0pOwoJCX0KCQlpZiggdGhpcy5pZHMg +PT0gbnVsbCB8fCB0aGlzLmlkcy5sZW5ndGggPT0gMCApCgkJewoJCQl2YXIgcE5vZGUgPSAkKHRo +aXMucHJlZml4ICsgJ19wcm9ncmVzc19iYXInKS5wYXJlbnROb2RlOwoJCQkkKHRoaXMucHJlZml4 +ICsgJ19wcm9ncmVzc19iYXInKS5oaWRlKCk7CgkJCXZhciBzcGFuID0gbmV3IEVsZW1lbnQoICdz +cGFuJywgeyAnY2xhc3MnOiAnZXBfcmVmX3JlcG9ydF9lbXB0eScgfSApOwoJCQlzcGFuLnVwZGF0 +ZSggJ1JlcG9ydCBlbXB0eScgKTsKCQkJcE5vZGUuaW5zZXJ0KCBzcGFuICk7CgkJfQoJfQoKCn0p +OwoKZnVuY3Rpb24gZ3JvdXBfcmVwb3J0KGdyb3VwKQp7Cglkb2N1bWVudC5ncm91cF9yZXBvcnQu +Z3JvdXAudmFsdWUgPSBncm91cDsKCWRvY3VtZW50Lmdyb3VwX3JlcG9ydC5zdWJtaXQoKTsKfQoK +ZnVuY3Rpb24gc29ydF9yZXBvcnQoc29ydCkKewoJZG9jdW1lbnQuc29ydF9yZXBvcnQuc29ydC52 +YWx1ZSA9IHNvcnQ7Cglkb2N1bWVudC5zb3J0X3JlcG9ydC5zdWJtaXQoKTsKfQoKZnVuY3Rpb24g +aXNJbnRlZ2VyKG51bSkgewogIHJldHVybiAobnVtIF4gMCkgPT09IG51bTsKfQo= static/style/auto/reports.css text/x-asm - b6c44764b4d4d9bd07dafde0bd9cfaaf + 04cbc93d0515c56f56929cd6a16f5a44 MD5 - 1922 + 2151 ZGl2LmVwX3JlcG9ydF9yb3cgewoJcGFkZGluZzogNXB4IDVweDsKCW1hcmdpbi1ib3R0b206IDVw eDsKfQoKZGl2LmVwX3JlcG9ydF9yb3dfcHJvYmxlbXMgewoJYm9yZGVyLWxlZnQ6IHNvbGlkIDdw eCAjQzQxRjFGOwp9CgpkaXYuZXBfcmVwb3J0X3Jvd19vayB7CiAgICAgICAgYm9yZGVyLWxlZnQ6 @@ -2266,9 +2407,13 @@ YmxvY2s7Cgl2ZXJ0aWNhbC1hbGlnbjogdG9wOwoJbWluLXdpZHRoOiAxNTBweDsKfQoKZGl2I2Vw X3JlcG9ydF9leHBvcnRfY29udGVudF9pbm5lciAucmVwb3J0X2V4cG9ydF9vcHRpb25zIGg0CnsK CWRpc3BsYXk6IGlubGluZS1ibG9jazsKCXZlcnRpY2FsLWFsaWduOiB0b3A7CgltYXJnaW4tYm90 dG9tOiAwOwp9CgpkaXYjZXBfcmVwb3J0X2V4cG9ydF9jb250ZW50X2lubmVyIC5yZXBvcnRfZXhw -b3J0X29wdGlvbnMgdWwKewoJcGFkZGluZzogMCAxMHB4IDAgMDsKfQoKLyogSFRNTCBSZXBvcnRz -ICovCmEuaHRtbF9yZXBvcnRfcHJpbnR7Cgl0ZXh0LWRlY29yYXRpb246IG5vbmU7CQp9CgphLmh0 -bWxfcmVwb3J0X3ByaW50OmhvdmVyewoJY29sb3I6IHdoaXRlOwkKfQo= +b3J0X29wdGlvbnMgdWwKewoJcGFkZGluZzogMCAxMHB4IDAgMDsKfQoKI2VwX3JlcG9ydF9leHBv +cnRfY29udGVudF9pbm5lciAuc2VsZWN0X2J1dHRvbgp7CiAgICAgICAgZmxvYXQ6IHJpZ2h0Owp9 +CgojY3VzdG9tX3JlcG9ydCAuZXBfc2VhcmNoX2J1dHRvbnMgPiBkaXYKewogICAgICAgIGRpc3Bs +YXk6IGlubGluZS1ibG9jazsKfQoKI2N1c3RvbV9yZXBvcnQgLmVwX3NlYXJjaF9idXR0b25zIC5j +bGVhcl9idXR0b24KewogICAgICAgIG1hcmdpbi1sZWZ0OiAycHg7Cn0KCi8qIEhUTUwgUmVwb3J0 +cyAqLwphLmh0bWxfcmVwb3J0X3ByaW50ewoJdGV4dC1kZWNvcmF0aW9uOiBub25lOwkKfQoKYS5o +dG1sX3JlcG9ydF9wcmludDpob3ZlcnsKCWNvbG9yOiB3aGl0ZTsJCn0K @@ -2723,7 +2868,7 @@ mCeqVAAAAABJRU5ErkJggg== coverimage - 3.0 + 3.1 diff --git a/reports.epmi b/reports.epmi index 88b9fab..a89b2d5 100644 --- a/reports.epmi +++ b/reports.epmi @@ -15,9 +15,9 @@ epm/reports/cfg/cfg.d/z_reports.pl text/plain - 334237b831581075209dbbedf084d878 + 48c622ad150bea255ba6fbee7e37083b MD5 - 2609 + 2869 epm/reports/cfg/cfg.d/z_search_reports.pl @@ -29,16 +29,16 @@ lang/en/phrases/reports.xml application/xml - 2c63892db4ecf79ed204400c9acb3f76 + f344518160d45ccd1d1709a926d9e6d1 MD5 - 2386 + 2563 plugins/EPrints/Plugin/Export/Grid2.pm text/plain - dd9b2c0a038b1f9f51b618a4b2e11c4b + 83d730999923d798d1acbb44c4a91667 MD5 - 9699 + 10222 plugins/EPrints/Plugin/Export/MultilineCSV2.pm @@ -78,16 +78,16 @@ plugins/EPrints/Plugin/Export/Report/JSON.pm text/plain - 3ee98189aee3464f0992881814056a72 + 3786d272e437a488408e5825270e1609 MD5 - 6567 + 6648 plugins/EPrints/Plugin/Screen/Report.pm text/plain - 210449eac1f7ee02e7519beead2c640b + e88058df69ea1db3f145b316f6d1ada2 MD5 - 37100 + 43956 plugins/EPrints/Plugin/Screen/Report/EPrint.pm @@ -134,16 +134,16 @@ static/javascript/auto/reports.js text/plain - 433f2b10185e875b322d0566e4d787c8 + d02c8742a8d57f71e94e1c62635b94de MD5 - 12566 + 12701 static/style/auto/reports.css text/x-asm - b6c44764b4d4d9bd07dafde0bd9cfaaf + 04cbc93d0515c56f56929cd6a16f5a44 MD5 - 1922 + 2151 text/x-asm @@ -166,7 +166,7 @@ coverimage - 3.0 + 3.1