galaxy-commits
Threads by month
- ----- 2026 -----
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- 15302 discussions
27 Apr '15
Branch: refs/heads/master
Home: https://github.com/galaxyproject/usegalaxy-playbook
Commit: 46a31dcb0479351687157613b68576d288968aad
https://github.com/galaxyproject/usegalaxy-playbook/commit/46a31dcb04793516…
Author: Nate Coraor <nate(a)bx.psu.edu>
Date: 2015-04-27 (Mon, 27 Apr 2015)
Changed paths:
M common/host_vars/radegast.galaxyproject.org.yml
M common/inventory
M common_infrastructure.yml
M toolshed_infrastructure.yml
Log Message:
-----------
PostgreSQL backups on radegast.
1
0
[galaxyproject/usegalaxy-playbook] d66672: Decrease retry limits on Main Pulsar
by GitHub 27 Apr '15
by GitHub 27 Apr '15
27 Apr '15
Branch: refs/heads/master
Home: https://github.com/galaxyproject/usegalaxy-playbook
Commit: d666720c00fe31f08255015f032840d3519eb6bb
https://github.com/galaxyproject/usegalaxy-playbook/commit/d666720c00fe31f0…
Author: Nate Coraor <nate(a)bx.psu.edu>
Date: 2015-04-27 (Mon, 27 Apr 2015)
Changed paths:
M production/host_vars/login5.stampede.tacc.utexas.edu.yml
Log Message:
-----------
Decrease retry limits on Main Pulsar
Commit: 1da8ba669239f7c107f1aaad318979abae35eb92
https://github.com/galaxyproject/usegalaxy-playbook/commit/1da8ba669239f7c1…
Author: Nate Coraor <nate(a)bx.psu.edu>
Date: 2015-04-27 (Mon, 27 Apr 2015)
Changed paths:
M templates/galaxy/test.galaxyproject.org/config/job_conf.xml.j2
M templates/galaxy/usegalaxy.org/config/job_conf.xml.j2
Log Message:
-----------
Do not attempt to contact Rodeo slurm controller. Also decrease concurrency limits to hopefully make a workshop tomorrow more responsive.
Commit: e7e1bb705716d5f9fce238413a3186cade07ed70
https://github.com/galaxyproject/usegalaxy-playbook/commit/e7e1bb705716d5f9…
Author: Nate Coraor <nate(a)bx.psu.edu>
Date: 2015-04-27 (Mon, 27 Apr 2015)
Changed paths:
M files/galaxy/test.galaxyproject.org/var/integrated_tool_panel.xml
M files/galaxy/test.galaxyproject.org/var/shed_data_manager_conf.xml
M files/galaxy/test.galaxyproject.org/var/shed_tool_conf.xml
M files/galaxy/test.galaxyproject.org/var/shed_tool_data_table_conf.xml
Log Message:
-----------
Updated mutable configs from Test.
Compare: https://github.com/galaxyproject/usegalaxy-playbook/compare/49ce0d190edb...…
1
0
[galaxyproject/usegalaxy-playbook] 49ce0d: A couple minor additions for the tool shed.
by GitHub 23 Apr '15
by GitHub 23 Apr '15
23 Apr '15
Branch: refs/heads/master
Home: https://github.com/galaxyproject/usegalaxy-playbook
Commit: 49ce0d190edb1f899adaec76b7df42a7d4a80fa5
https://github.com/galaxyproject/usegalaxy-playbook/commit/49ce0d190edb1f89…
Author: Nate Coraor <nate(a)bx.psu.edu>
Date: 2015-04-22 (Wed, 22 Apr 2015)
Changed paths:
M common/host_vars/radegast.galaxyproject.org.yml
M production/group_vars/toolshedservers.yml
Log Message:
-----------
A couple minor additions for the tool shed.
1
0
[galaxyproject/usegalaxy-playbook] bdcd1c: Infrastructure and hopefully proper Tool Shed conf...
by GitHub 22 Apr '15
by GitHub 22 Apr '15
22 Apr '15
Branch: refs/heads/master
Home: https://github.com/galaxyproject/usegalaxy-playbook
Commit: bdcd1cbfbdbf73bbe8ffd78bfbbbb17891c6441c
https://github.com/galaxyproject/usegalaxy-playbook/commit/bdcd1cbfbdbf73bb…
Author: Nate Coraor <nate(a)bx.psu.edu>
Date: 2015-04-22 (Wed, 22 Apr 2015)
Changed paths:
A common/group_vars/webservers.yml
M common/host_vars/radegast.galaxyproject.org.yml
M common/inventory
A common/secret_vars/ssl.yml
M common_infrastructure.yml
A files/toolshed/toolshed.g2.bx.psu.edu/error
A production/group_vars/toolsheddbservers.yml
A production/group_vars/toolshedservers.yml
A production/host_vars/radegast.galaxyproject.org.yml
M production/inventory
A production/secret_vars/toolshedservers.yml
M stage/group_vars/toolshedservers.yml
M stage/host_vars/radegast.galaxyproject.org.yml
R stage/secret_vars/ssl.yml
M templates/nginx/testtoolshed.j2
A templates/nginx/toolshed.j2
A templates/supervisor/testtoolshed.conf.j2
M toolshed_infrastructure.yml
Log Message:
-----------
Infrastructure and hopefully proper Tool Shed config for the Main Tool
Shed on Radegast. Just waiting for the DB dump/restore to finish.
1
0
Branch: refs/heads/master
Home: https://github.com/galaxyproject/usegalaxy-playbook
Commit: cfde673acc26555e9a07be808cdb7ab2eec061e5
https://github.com/galaxyproject/usegalaxy-playbook/commit/cfde673acc26555e…
Author: Nate Coraor <nate(a)bx.psu.edu>
Date: 2015-04-22 (Wed, 22 Apr 2015)
Changed paths:
M stage/group_vars/toolshedservers.yml
Log Message:
-----------
Update Test Tool Shed
1
0
22 Apr '15
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/0aa4dd8af7cf/
Changeset: 0aa4dd8af7cf
User: natefoo
Date: 2015-04-22 19:35:19+00:00
Summary: Merge stable to default
Affected #: 61 files
diff -r 6395e70351435911f7ab75863c1b48b54e20a919 -r 0aa4dd8af7cf8303ef9dd9af95c2e2676854ecca .hgtags
--- a/.hgtags
+++ b/.hgtags
@@ -25,4 +25,5 @@
5cdf5dc395f16f47e88a5567775dcd21b4906f08 latest_2015.01.13
738f4ad0eb62d5e4bcf0d22a2722ee6c570382b9 v15.03
9f40ff3e3fe1f7fed7e055d4269fe83199cf5ed2 v15.03.1
-9f40ff3e3fe1f7fed7e055d4269fe83199cf5ed2 latest_15.03
+bfd4635011e39aa210b2b1498dd65831dd2a365e v15.03.2
+bfd4635011e39aa210b2b1498dd65831dd2a365e latest_15.03
diff -r 6395e70351435911f7ab75863c1b48b54e20a919 -r 0aa4dd8af7cf8303ef9dd9af95c2e2676854ecca client/galaxy/scripts/mvc/history/history-model.js
--- a/client/galaxy/scripts/mvc/history/history-model.js
+++ b/client/galaxy/scripts/mvc/history/history-model.js
@@ -257,7 +257,7 @@
setAsCurrent : function(){
var history = this,
- xhr = jQuery.getJSON( '/history/set_as_current?id=' + this.id );
+ xhr = jQuery.getJSON( galaxy_config.root + 'history/set_as_current?id=' + this.id );
xhr.done( function(){
history.trigger( 'set-as-current', history );
@@ -361,7 +361,7 @@
var HistoryCollection = Backbone.Collection.extend( BASE_MVC.LoggableMixin ).extend(
/** @lends HistoryCollection.prototype */{
model : History,
-
+
/** logger used to record this.log messages, commonly set to console */
//logger : console,
diff -r 6395e70351435911f7ab75863c1b48b54e20a919 -r 0aa4dd8af7cf8303ef9dd9af95c2e2676854ecca client/galaxy/scripts/mvc/library/library-dataset-view.js
--- a/client/galaxy/scripts/mvc/library/library-dataset-view.js
+++ b/client/galaxy/scripts/mvc/library/library-dataset-view.js
@@ -116,7 +116,7 @@
},
downloadDataset: function(){
- var url = '/api/libraries/datasets/download/uncompressed';
+ var url = ( window.galaxy_config ? galaxy_config.root : '/' ) + 'api/libraries/datasets/download/uncompressed';
var data = {'ld_ids' : this.id};
this.processDownload(url, data);
},
@@ -232,7 +232,7 @@
var self = this;
if (this.options.fetched_permissions === undefined){
- $.get( "/api/libraries/datasets/" + self.id + "/permissions?scope=current").done(function(fetched_permissions) {
+ $.get( ( window.galaxy_config ? galaxy_config.root : '/' ) + "api/libraries/datasets/" + self.id + "/permissions?scope=current").done(function(fetched_permissions) {
self.prepareSelectBoxes({fetched_permissions:fetched_permissions, is_admin:is_admin});
}).fail(function(){
mod_toastr.error('An error occurred while attempting to fetch dataset permissions.');
@@ -273,7 +273,7 @@
placeholder: 'Click to select a role',
container: self.$el.find('#access_perm'),
ajax: {
- url: "/api/libraries/datasets/" + self.id + "/permissions?scope=available",
+ url: ( window.galaxy_config ? galaxy_config.root : '/' ) + "api/libraries/datasets/" + self.id + "/permissions?scope=available",
dataType: 'json',
quietMillis: 100,
data: function (term, page) { // page is the one-based page number tracked by Select2
@@ -320,7 +320,7 @@
placeholder: 'Click to select a role',
container: self.$el.find('#modify_perm'),
ajax: {
- url: "/api/libraries/datasets/" + self.id + "/permissions?scope=available",
+ url: ( window.galaxy_config ? galaxy_config.root : '/' ) + "api/libraries/datasets/" + self.id + "/permissions?scope=available",
dataType: 'json',
quietMillis: 100,
data: function (term, page) { // page is the one-based page number tracked by Select2
@@ -367,7 +367,7 @@
placeholder: 'Click to select a role',
container: self.$el.find('#manage_perm'),
ajax: {
- url: "/api/libraries/datasets/" + self.id + "/permissions?scope=available",
+ url: ( window.galaxy_config ? galaxy_config.root : '/' ) + "api/libraries/datasets/" + self.id + "/permissions?scope=available",
dataType: 'json',
quietMillis: 100,
data: function (term, page) { // page is the one-based page number tracked by Select2
@@ -413,7 +413,7 @@
self.manageSelectObject = new mod_select.View(manage_select_options);
} else { // Non-admins have select with pre-loaded options
var template = self.templateAccessSelect();
- $.get( "/api/libraries/datasets/" + self.id + "/permissions?scope=available", function( data ) {
+ $.get( ( window.galaxy_config ? galaxy_config.root : '/' ) + "api/libraries/datasets/" + self.id + "/permissions?scope=available", function( data ) {
$('.access_perm').html(template({options:data.roles}));
self.accessSelectObject = $('#access_select').select2();
}).fail(function() {
@@ -436,7 +436,7 @@
makeDatasetPrivate: function(){
var self = this;
- $.post("/api/libraries/datasets/" + self.id + "/permissions?action=make_private").done(function(fetched_permissions) {
+ $.post( ( window.galaxy_config ? galaxy_config.root : '/' ) + "api/libraries/datasets/" + self.id + "/permissions?action=make_private").done(function(fetched_permissions) {
self.model.set({is_unrestricted:false});
self.showPermissions({fetched_permissions:fetched_permissions})
mod_toastr.success('The dataset is now private to you.');
@@ -447,7 +447,7 @@
removeDatasetRestrictions: function(){
var self = this;
- $.post("/api/libraries/datasets/" + self.id + "/permissions?action=remove_restrictions")
+ $.post( ( window.galaxy_config ? galaxy_config.root : '/' ) + "api/libraries/datasets/" + self.id + "/permissions?action=remove_restrictions")
.done(function(fetched_permissions) {
self.model.set({is_unrestricted:true});
self.showPermissions({fetched_permissions:fetched_permissions})
@@ -478,7 +478,7 @@
modify_ids.push(modify_roles[i].id);
};
- $.post("/api/libraries/datasets/" + self.id + "/permissions?action=set_permissions", { 'access_ids[]': access_ids, 'manage_ids[]': manage_ids, 'modify_ids[]': modify_ids, } )
+ $.post( ( window.galaxy_config ? galaxy_config.root : '/' ) + "api/libraries/datasets/" + self.id + "/permissions?action=set_permissions", { 'access_ids[]': access_ids, 'manage_ids[]': manage_ids, 'modify_ids[]': modify_ids, } )
.done(function(fetched_permissions){
//fetch dataset again
self.showPermissions({fetched_permissions:fetched_permissions})
diff -r 6395e70351435911f7ab75863c1b48b54e20a919 -r 0aa4dd8af7cf8303ef9dd9af95c2e2676854ecca client/galaxy/scripts/mvc/library/library-folder-view.js
--- a/client/galaxy/scripts/mvc/library/library-folder-view.js
+++ b/client/galaxy/scripts/mvc/library/library-folder-view.js
@@ -81,7 +81,7 @@
var self = this;
if (this.options.fetched_permissions === undefined){
- $.get( "/api/folders/" + self.id + "/permissions?scope=current").done(function(fetched_permissions) {
+ $.get( ( window.galaxy_config ? galaxy_config.root : '/' ) + "api/folders/" + self.id + "/permissions?scope=current").done(function(fetched_permissions) {
self.prepareSelectBoxes({fetched_permissions:fetched_permissions});
}).fail(function(){
mod_toastr.error('An error occurred while attempting to fetch folder permissions.');
@@ -125,7 +125,7 @@
placeholder: 'Click to select a role',
container: self.$el.find('#' + id),
ajax: {
- url: "/api/folders/" + self.id + "/permissions?scope=available",
+ url: ( window.galaxy_config ? galaxy_config.root : '/' ) + "api/folders/" + self.id + "/permissions?scope=available",
dataType: 'json',
quietMillis: 100,
data: function (term, page) { // page is the one-based page number tracked by Select2
@@ -195,7 +195,7 @@
var manage_ids = this._extractIds(this.manageSelectObject.$el.select2('data'));
var modify_ids = this._extractIds(this.modifySelectObject.$el.select2('data'));
- $.post("/api/folders/" + self.id + "/permissions?action=set_permissions", { 'add_ids[]': add_ids, 'manage_ids[]': manage_ids, 'modify_ids[]': modify_ids, } )
+ $.post( ( window.galaxy_config ? galaxy_config.root : '/' ) + "api/folders/" + self.id + "/permissions?action=set_permissions", { 'add_ids[]': add_ids, 'manage_ids[]': manage_ids, 'modify_ids[]': modify_ids, } )
.done(function(fetched_permissions){
//fetch dataset again
self.showPermissions({fetched_permissions:fetched_permissions})
diff -r 6395e70351435911f7ab75863c1b48b54e20a919 -r 0aa4dd8af7cf8303ef9dd9af95c2e2676854ecca client/galaxy/scripts/mvc/library/library-foldertoolbar-view.js
--- a/client/galaxy/scripts/mvc/library/library-foldertoolbar-view.js
+++ b/client/galaxy/scripts/mvc/library/library-foldertoolbar-view.js
@@ -294,7 +294,7 @@
dataset_ids.push( this.parentElement.parentElement.id );
}
} );
- var url = '/api/libraries/datasets/download/' + format;
+ var url = ( window.galaxy_config ? galaxy_config.root : '/' ) + 'api/libraries/datasets/download/' + format;
var data = { 'ld_ids' : dataset_ids };
this.processDownload( url, data, 'get' );
},
@@ -386,7 +386,7 @@
fetchExtAndGenomes: function(){
var that = this;
mod_utils.get({
- url : galaxy_config.root + "api/datatypes?extension_only=False",
+ url : ( window.galaxy_config ? galaxy_config.root : '/' ) + "api/datatypes?extension_only=False",
success : function( datatypes ) {
for (key in datatypes) {
that.list_extensions.push({
@@ -403,7 +403,7 @@
}
});
mod_utils.get({
- url: galaxy_config.root + "api/genomes",
+ url: ( window.galaxy_config ? galaxy_config.root : '/' ) + "api/genomes",
success: function( genomes ) {
for ( key in genomes ) {
that.list_genomes.push({
@@ -689,7 +689,7 @@
for ( var i = history_dataset_ids.length - 1; i >= 0; i-- ) {
history_dataset_id = history_dataset_ids[i];
var folder_item = new mod_library_model.Item();
- folder_item.url = '/api/folders/' + this.options.id + '/contents';
+ folder_item.url = ( window.galaxy_config ? galaxy_config.root : '/' ) + 'api/folders/' + this.options.id + '/contents';
folder_item.set( { 'from_hda_id':history_dataset_id } );
hdas_to_add.push( folder_item );
}
@@ -749,7 +749,7 @@
}
return true;
}
- var promise = $.when( $.post( '/api/libraries/datasets?encoded_folder_id=' + that.id +
+ var promise = $.when( $.post( ( window.galaxy_config ? galaxy_config.root : '/' ) + 'api/libraries/datasets?encoded_folder_id=' + that.id +
'&source=' + options.source +
'&path=' + popped_item +
'&file_type=' + options.file_type +
@@ -788,7 +788,7 @@
}
return true;
}
- var promise = $.when( $.post( '/api/libraries/datasets?encoded_folder_id=' + that.id +
+ var promise = $.when( $.post( ( window.galaxy_config ? galaxy_config.root : '/' ) + 'api/libraries/datasets?encoded_folder_id=' + that.id +
'&source=' + options.source +
'&path=' + popped_item +
'&preserve_dirs=' + options.preserve_dirs +
diff -r 6395e70351435911f7ab75863c1b48b54e20a919 -r 0aa4dd8af7cf8303ef9dd9af95c2e2676854ecca client/galaxy/scripts/mvc/library/library-library-view.js
--- a/client/galaxy/scripts/mvc/library/library-library-view.js
+++ b/client/galaxy/scripts/mvc/library/library-library-view.js
@@ -87,7 +87,7 @@
var self = this;
if (this.options.fetched_permissions === undefined){
- $.get( "/api/libraries/" + self.id + "/permissions?scope=current").done(function(fetched_permissions) {
+ $.get( ( window.galaxy_config ? galaxy_config.root : '/' ) + "api/libraries/" + self.id + "/permissions?scope=current").done(function(fetched_permissions) {
self.prepareSelectBoxes({fetched_permissions:fetched_permissions});
}).fail(function(){
mod_toastr.error('An error occurred while attempting to fetch library permissions.');
@@ -134,7 +134,7 @@
placeholder: 'Click to select a role',
container: self.$el.find('#' + id),
ajax: {
- url: "/api/libraries/" + self.id + "/permissions?scope=available&is_library_access=" + is_library_access,
+ url: ( window.galaxy_config ? galaxy_config.root : '/' ) + "api/libraries/" + self.id + "/permissions?scope=available&is_library_access=" + is_library_access,
dataType: 'json',
quietMillis: 100,
data: function (term, page) { // page is the one-based page number tracked by Select2
@@ -193,7 +193,7 @@
makeDatasetPrivate: function(){
var self = this;
- $.post("/api/libraries/datasets/" + self.id + "/permissions?action=make_private").done(function(fetched_permissions) {
+ $.post( ( window.galaxy_config ? galaxy_config.root : '/' ) + "api/libraries/datasets/" + self.id + "/permissions?action=make_private").done(function(fetched_permissions) {
self.model.set({is_unrestricted:false});
self.showPermissions({fetched_permissions:fetched_permissions})
mod_toastr.success('The dataset is now private to you.');
@@ -204,7 +204,7 @@
removeDatasetRestrictions: function(){
var self = this;
- $.post("/api/libraries/datasets/" + self.id + "/permissions?action=remove_restrictions")
+ $.post( ( window.galaxy_config ? galaxy_config.root : '/' ) + "api/libraries/datasets/" + self.id + "/permissions?action=remove_restrictions")
.done(function(fetched_permissions) {
self.model.set({is_unrestricted:true});
self.showPermissions({fetched_permissions:fetched_permissions})
@@ -230,7 +230,7 @@
var manage_ids = this._extractIds(this.manageSelectObject.$el.select2('data'));
var modify_ids = this._extractIds(this.modifySelectObject.$el.select2('data'));
- $.post("/api/libraries/" + self.id + "/permissions?action=set_permissions", { 'access_ids[]': access_ids, 'add_ids[]': add_ids, 'manage_ids[]': manage_ids, 'modify_ids[]': modify_ids, } )
+ $.post( ( window.galaxy_config ? galaxy_config.root : '/' ) + "api/libraries/" + self.id + "/permissions?action=set_permissions", { 'access_ids[]': access_ids, 'add_ids[]': add_ids, 'manage_ids[]': manage_ids, 'modify_ids[]': modify_ids, } )
.done(function(fetched_permissions){
//fetch dataset again
self.showPermissions({fetched_permissions:fetched_permissions})
diff -r 6395e70351435911f7ab75863c1b48b54e20a919 -r 0aa4dd8af7cf8303ef9dd9af95c2e2676854ecca client/galaxy/scripts/mvc/library/library-model.js
--- a/client/galaxy/scripts/mvc/library/library-model.js
+++ b/client/galaxy/scripts/mvc/library/library-model.js
@@ -4,7 +4,7 @@
// LIBRARY RELATED MODELS
var Library = Backbone.Model.extend({
- urlRoot: '/api/libraries/',
+ urlRoot: ( window.galaxy_config ? galaxy_config.root : '/' ) + 'api/libraries/',
/** based on show_deleted would this lib show in the list of lib's?
* @param {Boolean} show_deleted are we including deleted libraries?
@@ -19,7 +19,7 @@
});
var Libraries = Backbone.Collection.extend({
- url: '/api/libraries',
+ url: ( window.galaxy_config ? galaxy_config.root : '/' ) + 'api/libraries',
model: Library,
@@ -84,15 +84,15 @@
// FOLDER RELATED MODELS
var Item = Backbone.Model.extend({
- urlRoot : '/api/libraries/datasets/'
+ urlRoot : ( window.galaxy_config ? galaxy_config.root : '/' ) + 'api/libraries/datasets/'
});
var Ldda = Backbone.Model.extend({
- urlRoot : '/api/libraries/datasets/'
+ urlRoot : ( window.galaxy_config ? galaxy_config.root : '/' ) + 'api/libraries/datasets/'
});
var FolderAsModel = Backbone.Model.extend({
- urlRoot: '/api/folders'
+ urlRoot: ( window.galaxy_config ? galaxy_config.root : '/' ) + 'api/folders'
});
var Folder = Backbone.Collection.extend({
@@ -152,7 +152,7 @@
var FolderContainer = Backbone.Model.extend({
defaults : {
folder : new Folder(),
- urlRoot : "/api/folders/",
+ urlRoot : ( window.galaxy_config ? galaxy_config.root : '/' ) + 'api/folders/',
id : "unknown"
},
parse : function(obj) {
@@ -169,11 +169,11 @@
// TODO UNITE
var HistoryItem = Backbone.Model.extend({
- urlRoot : '/api/histories/'
+ urlRoot : ( window.galaxy_config ? galaxy_config.root : '/' ) + 'api/histories/'
});
var HistoryContents = Backbone.Collection.extend({
- urlRoot : '/api/histories/',
+ urlRoot : ( window.galaxy_config ? galaxy_config.root : '/' ) + 'api/histories/',
initialize: function(options){
this.id = options.id;
},
@@ -184,11 +184,11 @@
});
var GalaxyHistory = Backbone.Model.extend({
- urlRoot : '/api/histories/'
+ urlRoot : ( window.galaxy_config ? galaxy_config.root : '/' ) + 'api/histories/'
});
var GalaxyHistories = Backbone.Collection.extend({
- url : '/api/histories',
+ url : ( window.galaxy_config ? galaxy_config.root : '/' ) + 'api/histories',
model : GalaxyHistory
});
@@ -199,7 +199,7 @@
*/
var Jstree = Backbone.Model.extend({
- urlRoot: '/api/remote_files'
+ urlRoot: ( window.galaxy_config ? galaxy_config.root : '/' ) + 'api/remote_files'
});
return {
diff -r 6395e70351435911f7ab75863c1b48b54e20a919 -r 0aa4dd8af7cf8303ef9dd9af95c2e2676854ecca client/galaxy/scripts/mvc/tools/tools-parameters.js
--- a/client/galaxy/scripts/mvc/tools/tools-parameters.js
+++ b/client/galaxy/scripts/mvc/tools/tools-parameters.js
@@ -145,6 +145,7 @@
data : options,
error_text : input_def.error_text || 'No options available',
multiple : input_def.multiple,
+ optional : input_def.optional,
searchable : input_def.searchable,
onchange : function() {
self.app.trigger('refresh');
diff -r 6395e70351435911f7ab75863c1b48b54e20a919 -r 0aa4dd8af7cf8303ef9dd9af95c2e2676854ecca client/galaxy/scripts/viz/circster.js
--- a/client/galaxy/scripts/viz/circster.js
+++ b/client/galaxy/scripts/viz/circster.js
@@ -1,16 +1,20 @@
// load required libraries
-require(
-[
+require([
'utils/utils',
- 'mvc/ui/icon-button',
- 'libs/farbtastic',
-], function(mod_utils, mod_icon_btn)
+], function(mod_utils)
{
// load css
mod_utils.cssLoadFile("static/style/circster.css");
});
-define(["libs/underscore", "libs/d3", "viz/visualization", "utils/config"], function(_, d3, visualization, config) {
+define([
+ "libs/underscore",
+ "libs/d3",
+ "viz/visualization",
+ "utils/config",
+ 'mvc/ui/icon-button',
+ 'libs/farbtastic'
+], function(_, d3, visualization, config, mod_icon_btn) {
/**
* Utility class for working with SVG.
@@ -71,7 +75,7 @@
else {
tick_coords = [1, 0, 4, 0];
text_coords = [0, 4, ".35em", ""];
-
+
}
ticks.append("line")
@@ -80,7 +84,7 @@
.attr("x2", tick_coords[2])
.attr("y1", tick_coords[3])
.style("stroke", "#000");
-
+
return ticks.append("text")
.attr("x", text_coords[0])
.attr("y", text_coords[1])
@@ -98,11 +102,11 @@
// Use default of 2 sig. digits.
if (sigDigits === undefined)
sigDigits = 2;
-
+
// Verify input number
if (num === null)
return null;
-
+
// Calculate return value
var rval = null;
if (Math.abs(num) < 1) {
@@ -141,7 +145,7 @@
*/
var CircsterView = Backbone.View.extend({
className: 'circster',
-
+
initialize: function(options) {
this.genome = options.genome;
this.label_arc_height = 50;
@@ -188,7 +192,7 @@
track_gap = this.model.get('config').get_value('track_gap'),
// Subtract 20 to make sure chrom labels are on screen.
min_dimension = Math.min(this.$el.width(), this.$el.height()) - 20,
- // Compute radius start based on model, will be centered
+ // Compute radius start based on model, will be centered
// and fit entirely inside element by default.
radius_start = min_dimension / 2 -
circular_tracks.length * (dataset_arc_height + track_gap) +
@@ -198,14 +202,14 @@
// Compute range of track starting radii.
tracks_start_radii = d3.range(radius_start, min_dimension / 2, dataset_arc_height + track_gap);
-
+
// Map from track start to bounds.
var self = this;
return _.map(tracks_start_radii, function(radius) {
return [radius, radius + dataset_arc_height];
});
},
-
+
/**
* Renders circular tracks, chord tracks, and label tracks.
*/
@@ -254,7 +258,7 @@
}))
.attr("transform", "translate(" + width / 2 + "," + height / 2 + ")")
.append('svg:g').attr('class', 'tracks');
-
+
// -- Render circular tracks. --
// Create a view for each track in the visualization and render.
@@ -266,12 +270,12 @@
genome: self.genome,
total_gap: total_gap
});
-
+
view.render();
-
+
return view;
});
-
+
// -- Render chords tracks. --
this.chords_views = chords_tracks.map(function(track) {
@@ -289,10 +293,10 @@
});
// -- Render label track. --
-
+
// Track bounds are:
// (a) outer radius of last circular track;
- // (b)
+ // (b)
var outermost_radius = this.circular_views[this.circular_views.length-1].radius_bounds[1],
track_bounds = [
outermost_radius,
@@ -305,7 +309,7 @@
genome: self.genome,
total_gap: total_gap
});
-
+
this.label_track_view.render();
},
@@ -356,7 +360,7 @@
// Update label track.
/*
- FIXME: should never have to update label track because vis always expands to fit area
+ FIXME: should never have to update label track because vis always expands to fit area
within label track.
var track_bounds = new_track_bounds[ new_track_bounds.length-1 ];
track_bounds[1] = track_bounds[0];
@@ -373,7 +377,7 @@
var track_view = this.circular_views[options.index];
this.circular_views.splice(options.index, 1);
track_view.$el.remove();
-
+
// Recompute and update track bounds.
var new_track_bounds = this.get_tracks_bounds();
_.each(this.circular_views, function(track_view, i) {
@@ -392,7 +396,7 @@
_.each(this.chords_views, function(track_view) {
track_view.update_radius_bounds(new_track_bounds[0]);
});
-
+
}
});
@@ -455,7 +459,7 @@
// Append titles to paths.
chroms_paths.append("title").text(function(d) { return d.data.chrom; });
-
+
// -- Render track data and, when track data is rendered, apply preferences and update chrom_elts fill. --
var self = this,
@@ -490,7 +494,7 @@
var new_d = d3.svg.arc()
.innerRadius(this.radius_bounds[0])
.outerRadius(this.radius_bounds[1]);
-
+
this.parent_elt.selectAll('g>path.chrom-background').transition().duration(1000).attr('d', new_d);
this._transition_chrom_data();
@@ -511,7 +515,7 @@
}
// -- Scale increased, so render visible data with more detail. --
-
+
var self = this,
utils = new SVGUtils();
@@ -539,7 +543,7 @@
$.when(data_deferred).then(function(data) {
// Remove current data path.
path_elt.remove();
-
+
// Update data bounds with new data.
self._update_data_bounds();
@@ -598,12 +602,12 @@
_transition_labels: function() {},
/**
- * Update data bounds. If there are new_bounds, use them; otherwise use
+ * Update data bounds. If there are new_bounds, use them; otherwise use
* default data bounds.
*/
_update_data_bounds: function(new_bounds) {
var old_bounds = this.data_bounds;
- this.data_bounds = new_bounds ||
+ this.data_bounds = new_bounds ||
this.get_data_bounds(this.track.get('data_manager').get_genome_wide_data(this.genome));
this._transition_chrom_data();
},
@@ -624,7 +628,7 @@
// Set min, max value in config so that they can be adjusted. Make this silent
// because these attributes are watched for changes and the viz is updated
- // accordingly (set up in initialize). Because we are setting up, we don't want
+ // accordingly (set up in initialize). Because we are setting up, we don't want
// the watch to trigger events here.
track.get('config').set_value('min_value', self.data_bounds[0], {silent: true});
track.get('config').set_value('max_value', self.data_bounds[1], {silent: true});
@@ -660,7 +664,7 @@
_get_path_function: function(chrom_arc, chrom_data) {},
/**
- * Returns arc layouts for genome's chromosomes/contigs. Arcs are arranged in a circle
+ * Returns arc layouts for genome's chromosomes/contigs. Arcs are arranged in a circle
* separated by gaps.
*/
_chroms_layout: function() {
@@ -700,14 +704,14 @@
* Render labels.
*/
_render_data: function(svg) {
- // -- Add chromosome label where it will fit; an alternative labeling mechanism
+ // -- Add chromosome label where it will fit; an alternative labeling mechanism
// would be nice for small chromosomes. --
var self = this,
chrom_arcs = svg.selectAll('g');
chrom_arcs.selectAll('path')
.attr('id', function(d) { return 'label-' + d.data.chrom; });
-
+
chrom_arcs.append("svg:text")
.filter(function(d) {
return d.endAngle - d.startAngle > self.min_arc_len;
@@ -857,12 +861,12 @@
return "rotate(90)";
};
- // FIXME:
+ // FIXME:
// (1) using min_max class below is needed for _update_min_max, which could be improved.
// (2) showing config on tick click should be replaced by proper track config icon.
// Draw min, max on first chrom only.
- var ticks = this.drawTicks(this.parent_elt, [ this.chroms_layout[0] ],
+ var ticks = this.drawTicks(this.parent_elt, [ this.chroms_layout[0] ],
this._data_bounds_ticks_fn(), textTransform, true)
.classed('min_max', true);
@@ -872,7 +876,7 @@
var view = new config.ConfigSettingCollectionView({
collection: self.track.get('config')
});
- view.render_in_modal('Configure Track');
+ view.render_in_modal('Configure Track');
});
});
@@ -951,7 +955,7 @@
var CircsterBigWigTrackView = CircsterQuantitativeTrackView.extend({
get_data_bounds: function(data) {
- // Set max across dataset by extracting all values, flattening them into a
+ // Set max across dataset by extracting all values, flattening them into a
// single array, and getting third quartile.
var values = _.flatten( _.map(data, function(d) {
if (d) {
@@ -965,8 +969,8 @@
return 0;
}
}) );
-
- // For max, use 98% quantile in attempt to avoid very large values. However, this max may be 0
+
+ // For max, use 98% quantile in attempt to avoid very large values. However, this max may be 0
// for sparsely populated data, so use max in that case.
return [ _.min(values), this._quantile(values, 0.98) || _.max(values) ];
}
@@ -1068,13 +1072,13 @@
genome : genome,
model : vis
});
-
+
// Render vizualization
viz_view.render();
-
+
// setup title
$('#center .unified-panel-header-inner').append(galaxy_config.app.viz_config.title + " " + galaxy_config.app.viz_config.dbkey);
-
+
// setup menu
var menu = mod_icon_btn.create_icon_buttons_menu([
{
@@ -1100,7 +1104,7 @@
{
// show saving dialog box
Galaxy.modal.show({title: "Saving...", body: "progress" });
-
+
// send to server
$.ajax({
url: galaxy_config.root + "visualization/save",
@@ -1132,11 +1136,11 @@
window.location = galaxy_config.root + "visualization/list";
}
}], { tooltip_config: { placement: 'bottom' } });
-
+
// add menu
menu.$el.attr("style", "float: right");
$("#center .unified-panel-header-inner").append(menu.$el);
-
+
// manual tooltip config because default gravity is S and cannot be changed
$(".menu-button").tooltip( { placement: 'bottom' } );
}
diff -r 6395e70351435911f7ab75863c1b48b54e20a919 -r 0aa4dd8af7cf8303ef9dd9af95c2e2676854ecca config/galaxy.ini.sample
--- a/config/galaxy.ini.sample
+++ b/config/galaxy.ini.sample
@@ -580,6 +580,13 @@
# requests.
#nginx_upload_path = False
+# Galaxy can also use nginx_upload_module to receive files staged out upon job
+# completion by remote job runners (i.e. Pulsar) that initiate staging
+# operations on the remote end. See the Galaxy nginx documentation for the
+# corresponding nginx configuration.
+#nginx_upload_job_files_store = False
+#nginx_upload_job_files_path = False
+
# Have Galaxy manage dynamic proxy component for routing requests to other
# services based on Galaxy's session cookie. It will attempt to do this by
# default though you do need to install node+npm and do an npm install from
@@ -960,6 +967,17 @@
# always, onsuccess, never
#cleanup_job = always
+# For sites where all users in Galaxy match users on the system on which Galaxy
+# runs, the DRMAA job runner can be configured to submit jobs to the DRM as the
+# actual user instead of as the user running the Galaxy server process. For
+# details on these options, see the documentation at:
+#
+# http://galaxyproject.org/wiki/Admin/Config/Performance/Cluster
+#
+#drmaa_external_runjob_script = scripts/drmaa_external_runner.py
+#drmaa_external_killjob_script = scripts/drmaa_external_killer.py
+#external_chown_script = scripts/external_chown_script.py
+
# File to source to set up the environment when running jobs. By default, the
# environment in which the Galaxy server starts is used when running jobs
# locally, and the environment set up per the DRM's submission method and
diff -r 6395e70351435911f7ab75863c1b48b54e20a919 -r 0aa4dd8af7cf8303ef9dd9af95c2e2676854ecca config/job_conf.xml.sample_advanced
--- a/config/job_conf.xml.sample_advanced
+++ b/config/job_conf.xml.sample_advanced
@@ -252,10 +252,7 @@
--></destination><destination id="real_user_cluster" runner="drmaa">
- <!-- TODO: The real user options should maybe not be considered runner params. -->
- <param id="galaxy_external_runjob_script">scripts/drmaa_external_runner.py</param>
- <param id="galaxy_external_killjob_script">scripts/drmaa_external_killer.py</param>
- <param id="galaxy_external_chown_script">scripts/external_chown_script.py</param>
+ <!-- Make sure to setup 3 real user parameters in galaxy.ini. --></destination><destination id="dynamic" runner="dynamic"><!-- A destination that represents a method in the dynamic runner. -->
diff -r 6395e70351435911f7ab75863c1b48b54e20a919 -r 0aa4dd8af7cf8303ef9dd9af95c2e2676854ecca lib/galaxy/config.py
--- a/lib/galaxy/config.py
+++ b/lib/galaxy/config.py
@@ -293,6 +293,8 @@
self.nginx_x_archive_files_base = kwargs.get( 'nginx_x_archive_files_base', False )
self.nginx_upload_store = kwargs.get( 'nginx_upload_store', False )
self.nginx_upload_path = kwargs.get( 'nginx_upload_path', False )
+ self.nginx_upload_job_files_store = kwargs.get( 'nginx_upload_job_files_store', False )
+ self.nginx_upload_job_files_path = kwargs.get( 'nginx_upload_job_files_path', False )
if self.nginx_upload_store:
self.nginx_upload_store = os.path.abspath( self.nginx_upload_store )
self.object_store = kwargs.get( 'object_store', 'disk' )
@@ -466,7 +468,7 @@
datatypes_config_file=[ 'config/datatypes_conf.xml', 'datatypes_conf.xml', 'config/datatypes_conf.xml.sample' ],
external_service_type_config_file=[ 'config/external_service_types_conf.xml', 'external_service_types_conf.xml', 'config/external_service_types_conf.xml.sample' ],
job_config_file=[ 'config/job_conf.xml', 'job_conf.xml' ],
- job_metrics_config_file=[ 'config/job_metrics_conf.xml', 'job_metrics_conf.xml' ],
+ job_metrics_config_file=[ 'config/job_metrics_conf.xml', 'job_metrics_conf.xml','config/job_metrics_conf.xml.sample' ],
dependency_resolvers_config_file=[ 'config/dependency_resolvers_conf.xml', 'dependency_resolvers_conf.xml' ],
job_resource_params_file=[ 'config/job_resource_params_conf.xml', 'job_resource_params_conf.xml' ],
migrated_tools_config=[ 'migrated_tools_conf.xml', 'config/migrated_tools_conf.xml' ],
diff -r 6395e70351435911f7ab75863c1b48b54e20a919 -r 0aa4dd8af7cf8303ef9dd9af95c2e2676854ecca lib/galaxy/jobs/__init__.py
--- a/lib/galaxy/jobs/__init__.py
+++ b/lib/galaxy/jobs/__init__.py
@@ -962,12 +962,11 @@
job.set_state( job.states.PAUSED )
self.sa_session.add( job )
- def mark_as_resubmitted( self ):
+ def mark_as_resubmitted( self, info=None ):
job = self.get_job()
self.sa_session.refresh( job )
- for dataset in [ dataset_assoc.dataset for dataset_assoc in job.output_datasets + job.output_library_datasets ]:
- dataset._state = model.Dataset.states.RESUBMITTED
- self.sa_session.add( dataset )
+ if info is not None:
+ job.info = info
job.set_state( model.Job.states.RESUBMITTED )
self.sa_session.add( job )
self.sa_session.flush()
@@ -1251,6 +1250,16 @@
if job.user:
job.user.total_disk_usage += bytes
+ # Emperically, we need to update job.user and
+ # job.workflow_invocation_step.workflow_invocation in separate
+ # transactions. Best guess as to why is that the workflow_invocation
+ # may or may not exist when the job is first loaded by the handler -
+ # and depending on whether it is or not sqlalchemy orders the updates
+ # differently and deadlocks can occur (one thread updates user and
+ # waits on invocation and the other updates invocation and waits on
+ # user).
+ self.sa_session.flush()
+
# fix permissions
for path in [ dp.real_path for dp in self.get_mutable_output_fnames() ]:
util.umask_fix_perms( path, self.app.config.umask, 0666, self.app.config.gid )
diff -r 6395e70351435911f7ab75863c1b48b54e20a919 -r 0aa4dd8af7cf8303ef9dd9af95c2e2676854ecca lib/galaxy/jobs/runners/__init__.py
--- a/lib/galaxy/jobs/runners/__init__.py
+++ b/lib/galaxy/jobs/runners/__init__.py
@@ -341,8 +341,8 @@
except:
log.exception('Caught exception in runner state handler:')
- def mark_as_resubmitted( self, job_state ):
- job_state.job_wrapper.mark_as_resubmitted()
+ def mark_as_resubmitted( self, job_state, info=None ):
+ job_state.job_wrapper.mark_as_resubmitted( info=info )
if not self.app.config.track_jobs_in_database:
job_state.job_wrapper.change_state( model.Job.states.QUEUED )
self.app.job_manager.job_handler.dispatcher.put( job_state.job_wrapper )
diff -r 6395e70351435911f7ab75863c1b48b54e20a919 -r 0aa4dd8af7cf8303ef9dd9af95c2e2676854ecca lib/galaxy/jobs/runners/pulsar.py
--- a/lib/galaxy/jobs/runners/pulsar.py
+++ b/lib/galaxy/jobs/runners/pulsar.py
@@ -342,7 +342,12 @@
encoded_job_id = self.app.security.encode_id(job_id)
job_key = self.app.security.encode_id( job_id, kind="jobs_files" )
- files_endpoint = "%s/api/jobs/%s/files?job_key=%s" % (
+ endpoint_base = "%s/api/jobs/%s?job_key=%s"
+ if self.app.config.nginx_upload_job_files_path:
+ endpoint_base = "%s" + \
+ self.app.config.nginx_upload_job_files_path + \
+ "?job_id=%s&job_key=%s"
+ files_endpoint = endpoint_base % (
self.galaxy_url,
encoded_job_id,
job_key
diff -r 6395e70351435911f7ab75863c1b48b54e20a919 -r 0aa4dd8af7cf8303ef9dd9af95c2e2676854ecca lib/galaxy/jobs/runners/state_handlers/resubmit.py
--- a/lib/galaxy/jobs/runners/state_handlers/resubmit.py
+++ b/lib/galaxy/jobs/runners/state_handlers/resubmit.py
@@ -1,4 +1,5 @@
import logging
+
from galaxy import model
@@ -13,31 +14,45 @@
def failure(app, job_runner, job_state):
- if getattr( job_state, 'runner_state', None ) and job_state.runner_state in ( job_state.runner_states.WALLTIME_REACHED, job_state.runner_states.MEMORY_LIMIT_REACHED ):
- # Intercept jobs that hit the walltime and have a walltime or nonspecific resubmit destination configured
+ if (getattr(job_state, 'runner_state', None)
+ and job_state.runner_state in
+ (job_state.runner_states.WALLTIME_REACHED,
+ job_state.runner_states.MEMORY_LIMIT_REACHED)):
+ # Intercept jobs that hit the walltime and have a walltime or
+ # nonspecific resubmit destination configured
for resubmit in job_state.job_destination.get('resubmit'):
- if resubmit.get('condition', None) and resubmit['condition'] != job_state.runner_state:
- continue # There is a resubmit defined for the destination but its condition is not for walltime_reached
- log.info("(%s/%s) Job will be resubmitted to '%s' because %s at the '%s' destination",
- job_state.job_wrapper.job_id,
- job_state.job_id,
- resubmit['destination'],
- MESSAGES[job_state.runner_state],
- job_state.job_wrapper.job_destination.id )
+ if (resubmit.get('condition', None) and resubmit['condition'] !=
+ job_state.runner_state):
+ # There is a resubmit defined for the destination but
+ # its condition is not for walltime_reached
+ continue
+ log.info("(%s/%s) Job will be resubmitted to '%s' because %s at "
+ "the '%s' destination",
+ job_state.job_wrapper.job_id,
+ job_state.job_id,
+ resubmit['destination'],
+ MESSAGES[job_state.runner_state],
+ job_state.job_wrapper.job_destination.id )
# fetch JobDestination for the id or tag
- new_destination = app.job_config.get_destination(resubmit['destination'])
+ new_destination = app.job_config.get_destination(
+ resubmit['destination'])
# Resolve dynamic if necessary
- new_destination = job_state.job_wrapper.job_runner_mapper.cache_job_destination( new_destination )
+ new_destination = (job_state.job_wrapper.job_runner_mapper
+ .cache_job_destination(new_destination))
# Reset job state
job = job_state.job_wrapper.get_job()
if resubmit.get('handler', None):
- log.debug('(%s/%s) Job reassigned to handler %s', job_state.job_wrapper.job_id, job_state.job_id, resubmit['handler'])
+ log.debug('(%s/%s) Job reassigned to handler %s',
+ job_state.job_wrapper.job_id, job_state.job_id,
+ resubmit['handler'])
job.set_handler(resubmit['handler'])
job_runner.sa_session.add( job )
# Is this safe to do here?
job_runner.sa_session.flush()
- # Cache the destination to prevent rerunning dynamic after resubmit
- job_state.job_wrapper.job_runner_mapper.cached_job_destination = new_destination
+ # Cache the destination to prevent rerunning dynamic after
+ # resubmit
+ job_state.job_wrapper.job_runner_mapper \
+ .cached_job_destination = new_destination
job_state.job_wrapper.set_job_destination(new_destination)
# Clear external ID (state change below flushes the change)
job.job_runner_external_id = None
@@ -45,5 +60,7 @@
if job.params is None:
job.params = {}
job_state.runner_state_handled = True
- job_runner.mark_as_resubmitted( job_state )
+ info = "This job was resubmitted to the queue because %s on its " \
+ "compute resource." % MESSAGES[job_state.runner_state]
+ job_runner.mark_as_resubmitted(job_state, info=info)
return
diff -r 6395e70351435911f7ab75863c1b48b54e20a919 -r 0aa4dd8af7cf8303ef9dd9af95c2e2676854ecca lib/galaxy/managers/base.py
--- a/lib/galaxy/managers/base.py
+++ b/lib/galaxy/managers/base.py
@@ -700,8 +700,8 @@
setattr( item, key, val )
return val
- def deserialize_basestring( self, trans, item, key, val ):
- val = self.validate.basestring( key, val )
+ def deserialize_basestring( self, trans, item, key, val, convert_none_to_empty=False ):
+ val = '' if ( convert_none_to_empty and val is None ) else self.validate.basestring( key, val )
return self.default_deserializer( trans, item, key, val )
def deserialize_bool( self, trans, item, key, val ):
diff -r 6395e70351435911f7ab75863c1b48b54e20a919 -r 0aa4dd8af7cf8303ef9dd9af95c2e2676854ecca lib/galaxy/managers/hdas.py
--- a/lib/galaxy/managers/hdas.py
+++ b/lib/galaxy/managers/hdas.py
@@ -154,8 +154,9 @@
# error here if disallowed - before jobs are stopped
#TODO: poss. move to DatasetAssociationManager
self.dataset_manager.error_unless_dataset_purge_allowed( trans, hda )
+ if trans.user:
+ trans.user.total_disk_usage -= hda.quota_amount( trans.user )
super( HDAManager, self ).purge( trans, hda, flush=flush )
-
if hda.creating_job_associations:
job = hda.creating_job_associations[0].job
if not job.finished:
@@ -195,6 +196,32 @@
break
return job
+ def _job_state_history_query( self, hda ):
+ """
+ Return a query of the job's state history for the job that created this hda.
+ """
+ session = self.app.model.context
+ JobToOutputDatasetAssociation = model.JobToOutputDatasetAssociation
+ JobStateHistory = model.JobStateHistory
+
+ # TODO: this does not play well with copied hdas
+ # NOTE: don't eagerload (JODA will load the hda were using!)
+ hda_id = hda.id
+ query = ( session.query( JobToOutputDatasetAssociation, JobStateHistory )
+ .filter( JobToOutputDatasetAssociation.dataset_id == hda_id )
+ .filter( JobStateHistory.job_id == JobToOutputDatasetAssociation.job_id )
+ .enable_eagerloads( False ) )
+ return query
+
+ def has_been_resubmitted( self, hda ):
+ """
+ Return True if the hda's job was resubmitted at any point.
+ """
+ job_states = model.Job.states
+ query = ( self._job_state_history_query( hda )
+ .filter( model.JobStateHistory.state == job_states.RESUBMITTED ) )
+ return self.app.model.context.query( query.exists() ).scalar()
+
# .... serialization
def get_display_apps( self, trans, hda ):
"""
@@ -324,7 +351,7 @@
'history_content_type',
'dataset_id',
'state', 'extension',
- 'deleted', 'purged', 'visible', 'resubmitted',
+ 'deleted', 'purged', 'visible',
'type', 'url'
])
self.add_view( 'detailed', [
@@ -340,7 +367,8 @@
'file_ext', 'file_size',
'create_time', 'update_time',
- 'metadata', 'meta_files', 'data_type',
+ 'resubmitted',
+ 'metadata', 'meta_files', 'data_type',
'peek',
#TODO: why is this named uuid!? The hda doesn't have a uuid - it's the underlying dataset's uuid!
@@ -388,7 +416,7 @@
'hda_ldda' : lambda *a: 'hda',
# remapped
- 'info' : lambda t, i, k: i.info.strip() if isinstance( i.info, basestring ) else i.info,
+ 'info' : lambda t, i, k: i.info.strip() if isinstance( i.info, basestring ) else '',
'misc_info' : lambda t, i, k: self.serializers[ 'info' ]( t, i, k ),
'misc_blurb' : lambda t, i, k: i.blurb,
'genome_build' : lambda t, i, k: i.dbkey,
@@ -400,7 +428,7 @@
'copied_from_history_dataset_association_id' : self.serialize_id,
'copied_from_library_dataset_dataset_association_id': self.serialize_id,
- 'resubmitted' : lambda t, i, k: i._state == t.app.model.Dataset.states.RESUBMITTED,
+ 'resubmitted' : lambda t, i, k: self.hda_manager.has_been_resubmitted( i ),
'meta_files' : self.serialize_meta_files,
'file_path' : self.serialize_file_path,
@@ -583,7 +611,8 @@
# remapped
'genome_build' : lambda t, i, k, v: self.deserialize_genome_build( t, i, 'dbkey', v ),
- 'misc_info' : lambda t, i, k, v: self.deserialize_basestring( t, i, 'info', v ),
+ 'misc_info' : lambda t, i, k, v: (
+ self.deserialize_basestring( t, i, 'info', v, convert_none_to_empty=True ) ),
#TODO: mixin: deletable
'deleted' : self.deserialize_bool,
diff -r 6395e70351435911f7ab75863c1b48b54e20a919 -r 0aa4dd8af7cf8303ef9dd9af95c2e2676854ecca lib/galaxy/managers/workflows.py
--- a/lib/galaxy/managers/workflows.py
+++ b/lib/galaxy/managers/workflows.py
@@ -569,7 +569,7 @@
for step_index in step_indices:
step_dict = supplied_steps[ step_index ]
uuid = step_dict.get("uuid", None)
- if uuid:
+ if uuid and uuid != "None":
if uuid in discovered_uuids:
raise exceptions.DuplicatedIdentifierException("Duplicate step UUID in request.")
discovered_uuids.add(uuid)
@@ -586,10 +586,9 @@
type-specific functionality from the incoming dicitionary.
"""
step = model.WorkflowStep()
-
# TODO: Consider handling position inside module.
step.position = step_dict['position']
- if "uuid" in step_dict:
+ if "uuid" in step_dict and step_dict['uuid'] != "None":
step.uuid = step_dict["uuid"]
if "label" in step_dict:
step.label = step_dict["label"]
diff -r 6395e70351435911f7ab75863c1b48b54e20a919 -r 0aa4dd8af7cf8303ef9dd9af95c2e2676854ecca lib/galaxy/model/__init__.py
--- a/lib/galaxy/model/__init__.py
+++ b/lib/galaxy/model/__init__.py
@@ -1335,9 +1335,8 @@
DISCARDED = 'discarded',
PAUSED = 'paused',
SETTING_METADATA = 'setting_metadata',
- FAILED_METADATA = 'failed_metadata',
- RESUBMITTED = 'resubmitted' )
- # failed_metadata and resubmitted are only valid as DatasetInstance states currently
+ FAILED_METADATA = 'failed_metadata')
+ # failed_metadata is only valid as DatasetInstance state currently
non_ready_states = (
states.UPLOAD,
diff -r 6395e70351435911f7ab75863c1b48b54e20a919 -r 0aa4dd8af7cf8303ef9dd9af95c2e2676854ecca lib/galaxy/model/orm/logging_connection_proxy.py
--- a/lib/galaxy/model/orm/logging_connection_proxy.py
+++ b/lib/galaxy/model/orm/logging_connection_proxy.py
@@ -2,7 +2,7 @@
import inspect
import os
-from galaxy.model.orm import *
+from galaxy.model.orm import ConnectionProxy
import logging
diff -r 6395e70351435911f7ab75863c1b48b54e20a919 -r 0aa4dd8af7cf8303ef9dd9af95c2e2676854ecca lib/galaxy/tools/__init__.py
--- a/lib/galaxy/tools/__init__.py
+++ b/lib/galaxy/tools/__init__.py
@@ -417,13 +417,14 @@
dict_collection_visible_keys = ( 'id', 'name', 'version', 'description' )
default_template = 'tool_form.mako'
- def __init__( self, config_file, tool_source, app, guid=None, repository_id=None ):
+ def __init__( self, config_file, tool_source, app, guid=None, repository_id=None, allow_code_files=True ):
"""Load a tool from the config named by `config_file`"""
# Determine the full path of the directory where the tool config is
self.config_file = config_file
self.tool_dir = os.path.dirname( config_file )
self.app = app
self.repository_id = repository_id
+ self._allow_code_files = allow_code_files
#setup initial attribute values
self.inputs = odict()
self.stdio_exit_codes = list()
@@ -704,14 +705,15 @@
# Load any tool specific code (optional) Edit: INS 5/29/2007,
# allow code files to have access to the individual tool's
# "module" if it has one. Allows us to reuse code files, etc.
- for code_elem in root.findall("code"):
- for hook_elem in code_elem.findall("hook"):
- for key, value in hook_elem.items():
- # map hook to function
- self.hook_map[key] = value
- file_name = code_elem.get("file")
- code_path = os.path.join( self.tool_dir, file_name )
- execfile( code_path, self.code_namespace )
+ if self._allow_code_files:
+ for code_elem in root.findall("code"):
+ for hook_elem in code_elem.findall("hook"):
+ for key, value in hook_elem.items():
+ # map hook to function
+ self.hook_map[key] = value
+ file_name = code_elem.get("file")
+ code_path = os.path.join( self.tool_dir, file_name )
+ execfile( code_path, self.code_namespace )
# User interface hints
uihints_elem = root.find( "uihints" )
@@ -2433,7 +2435,7 @@
continue
# state for subsection/group
- group_state = state_inputs[input.name]
+ group_state = state_inputs.get(input.name, {})
# iterate and update values
if input.type == 'repeat':
@@ -2444,10 +2446,12 @@
elif input.type == 'conditional':
if 'test_param' in tool_dict:
test_param = tool_dict['test_param']
- test_param['value'] = jsonify(group_state[test_param['name']])
- if '__current_case__' in group_state:
- i = group_state['__current_case__']
- iterate(tool_dict['cases'][i]['inputs'], input.cases[i].inputs, group_state, other_values)
+ test_param['value'] = jsonify(group_state.get(test_param['name'], None))
+ for i in range (len ( tool_dict['cases'] ) ):
+ current_state = {}
+ if i == group_state.get('__current_case__', None):
+ current_state = group_state
+ iterate(tool_dict['cases'][i]['inputs'], input.cases[i].inputs, current_state, other_values)
else:
# create input dictionary, try to pass other_values if to_dict function supports it e.g. dynamic options
try:
@@ -2459,11 +2463,15 @@
input_name = tool_dict.get('name')
if input_name:
# backup default value
- tool_dict['default_value'] = input.get_initial_value(trans, other_values)
+ try:
+ tool_dict['default_value'] = input.get_initial_value(trans, other_values)
+ except Exception:
+ # get initial value failed due to improper late validation
+ tool_dict['default_value'] = None
+ pass
# update input value from tool state
- if input_name in state_inputs:
- tool_dict['value'] = state_inputs[input_name]
+ tool_dict['value'] = state_inputs.get(input_name, None)
# sanitize values
sanitize(tool_dict, 'value')
@@ -2584,28 +2592,44 @@
# dataset used; parameter should be the analygous dataset in the
# current history.
history = trans.get_history()
- hda_source_dict = {} # Mapping from HDA in history to source HDAs.
+
+ # Create index for hdas.
+ hda_source_dict = {}
for hda in history.datasets:
- source_hda = hda.copied_from_history_dataset_association
- while source_hda:
- if source_hda.dataset.id not in hda_source_dict or source_hda.hid == hda.hid:
- hda_source_dict[ source_hda.dataset.id ] = hda
- source_hda = source_hda.copied_from_history_dataset_association
+ key = '%s_%s' % (hda.hid, hda.dataset.id)
+ hda_source_dict[ hda.dataset.id ] = hda_source_dict[ key ] = hda
# Ditto for dataset collections.
hdca_source_dict = {}
for hdca in history.dataset_collections:
- source_hdca = hdca.copied_from_history_dataset_collection_association
- while source_hdca:
- if source_hdca.collection.id not in hdca_source_dict or source_hdca.hid == hdca.hid:
- hdca_source_dict[ source_hdca.collection.id ] = hdca
- source_hdca = source_hdca.copied_from_history_dataset_collection_association
+ key = '%s_%s' % (hdca.hid, hdca.collection.id)
+ hdca_source_dict[ hdca.collection.id ] = hdca_source_dict[ key ] = hdca
+
+ # Map dataset or collection to current history
+ def map_to_history(value):
+ id = None
+ source = None
+ if isinstance(value, trans.app.model.HistoryDatasetAssociation):
+ id = value.dataset.id
+ source = hda_source_dict
+ elif isinstance(value, trans.app.model.HistoryDatasetCollectionAssociation):
+ id = value.collection.id
+ source = hdca_source_dict
+ else:
+ return None
+ key = '%s_%s' % (value.hid, id)
+ if key in source:
+ return source[ key ]
+ elif id in source:
+ return source[ id ]
+ else:
+ return None
# Unpack unvalidated values to strings, they'll be validated when the
# form is submitted (this happens when re-running a job that was
# initially run by a workflow)
#This needs to be done recursively through grouping parameters
- def rerun_callback( input, value, prefixed_name, prefixed_label ):
+ def mapping_callback( input, value, prefixed_name, prefixed_label ):
if isinstance( value, UnvalidatedValue ):
try:
return input.to_html_value( value.value, trans.app )
@@ -2617,22 +2641,17 @@
if isinstance(value,list):
values = []
for val in value:
- if isinstance(val, trans.app.model.HistoryDatasetAssociation):
- if val.dataset.id in hda_source_dict:
- values.append( hda_source_dict[ val.dataset.id ] )
- else:
- values.append( val )
+ new_val = map_to_history( val )
+ if new_val:
+ values.append( new_val )
+ else:
+ values.append( val )
return values
- if isinstance(value, trans.app.model.HistoryDatasetAssociation):
- if value.dataset.id in hda_source_dict:
- return hda_source_dict[ value.dataset.id ]
- if isinstance(value, trans.app.model.HistoryDatasetCollectionAssociation):
- if value.collection.id in hdca_source_dict:
- return hdca_source_dict[ value.collection.id ]
+ else:
+ return map_to_history( value )
elif isinstance( input, DataCollectionToolParameter ):
- if value.collection.id in hdca_source_dict:
- return hdca_source_dict[ value.collection.id ]
- visit_input_values( tool_inputs, params, rerun_callback )
+ return map_to_history( value )
+ visit_input_values( tool_inputs, params, mapping_callback )
def _compare_tool_version( self, trans, job ):
"""
diff -r 6395e70351435911f7ab75863c1b48b54e20a919 -r 0aa4dd8af7cf8303ef9dd9af95c2e2676854ecca lib/galaxy/tools/parameters/basic.py
--- a/lib/galaxy/tools/parameters/basic.py
+++ b/lib/galaxy/tools/parameters/basic.py
@@ -15,6 +15,7 @@
from galaxy.util import string_as_bool, sanitize_param, unicodify
from galaxy.util import listify
from galaxy.util.odict import odict
+from galaxy.util.expressions import ExpressionContext
from sanitize import ToolParameterSanitizer
import validation
import dynamic_options
@@ -802,8 +803,9 @@
self.is_dynamic = ( ( self.dynamic_options is not None ) or ( self.options is not None ) )
def _get_dynamic_options_call_other_values( self, trans, other_values ):
- call_other_values = { "__trans__": trans }
+ call_other_values = ExpressionContext({ "__trans__": trans })
if other_values:
+ call_other_values.parent = other_values.parent
call_other_values.update( other_values.dict )
return call_other_values
@@ -1505,8 +1507,9 @@
def _get_options_from_code( self, trans=None, value=None, other_values=None ):
assert self.dynamic_options, Exception( "dynamic_options was not specifed" )
- call_other_values = { '__trans__': trans, '__value__': value }
+ call_other_values = ExpressionContext({ '__trans__': trans, '__value__': value })
if other_values:
+ call_other_values.parent = other_values.parent
call_other_values.update( other_values.dict )
try:
return eval( self.dynamic_options, self.tool.code_namespace, call_other_values )
diff -r 6395e70351435911f7ab75863c1b48b54e20a919 -r 0aa4dd8af7cf8303ef9dd9af95c2e2676854ecca lib/galaxy/tools/toolbox/base.py
--- a/lib/galaxy/tools/toolbox/base.py
+++ b/lib/galaxy/tools/toolbox/base.py
@@ -978,7 +978,9 @@
if tool_key in val.elems:
self._tool_panel[ key ].elems[ tool_key ] = new_tool
break
- self._tools_by_id[ tool_id ] = new_tool
+ # (Re-)Register the reloaded tool, this will handle
+ # _tools_by_id and _tool_versions_by_id
+ self.register_tool( new_tool )
message = "Reloaded the tool:<br/>"
message += "<b>name:</b> %s<br/>" % old_tool.name
message += "<b>id:</b> %s<br/>" % old_tool.id
diff -r 6395e70351435911f7ab75863c1b48b54e20a919 -r 0aa4dd8af7cf8303ef9dd9af95c2e2676854ecca lib/galaxy/util/dbkeys.py
--- a/lib/galaxy/util/dbkeys.py
+++ b/lib/galaxy/util/dbkeys.py
@@ -38,7 +38,7 @@
for dataset in datasets:
rval.append( ( dataset.dbkey, "%s (%s) [History]" % ( dataset.name, dataset.dbkey ) ) )
user = trans.user
- if user and 'dbkeys' in user.preferences:
+ if user and hasattr( user, 'preferences' ) and 'dbkeys' in user.preferences:
user_keys = loads( user.preferences['dbkeys'] )
for key, chrom_dict in user_keys.iteritems():
rval.append( ( key, "%s (%s) [Custom]" % ( chrom_dict['name'], key ) ) )
diff -r 6395e70351435911f7ab75863c1b48b54e20a919 -r 0aa4dd8af7cf8303ef9dd9af95c2e2676854ecca lib/galaxy/version.py
--- a/lib/galaxy/version.py
+++ b/lib/galaxy/version.py
@@ -1,3 +1,3 @@
VERSION_MAJOR = "15.03"
-VERSION_MINOR = "1"
+VERSION_MINOR = "2"
VERSION = VERSION_MAJOR + ('.' + VERSION_MINOR if VERSION_MINOR else '')
diff -r 6395e70351435911f7ab75863c1b48b54e20a919 -r 0aa4dd8af7cf8303ef9dd9af95c2e2676854ecca lib/galaxy/web/framework/webapp.py
--- a/lib/galaxy/web/framework/webapp.py
+++ b/lib/galaxy/web/framework/webapp.py
@@ -668,7 +668,8 @@
"""
history = None
if self.galaxy_session:
- history = self.galaxy_session.current_history
+ if hasattr( self.galaxy_session, 'current_history' ):
+ history = self.galaxy_session.current_history
if not history and util.string_as_bool( create ):
history = self.new_history()
return history
diff -r 6395e70351435911f7ab75863c1b48b54e20a919 -r 0aa4dd8af7cf8303ef9dd9af95c2e2676854ecca lib/galaxy/webapps/galaxy/api/job_files.py
--- a/lib/galaxy/webapps/galaxy/api/job_files.py
+++ b/lib/galaxy/webapps/galaxy/api/job_files.py
@@ -83,9 +83,21 @@
self.__check_job_can_write_to_path( trans, job, path )
# Is this writing an unneeded file? Should this just copy in Python?
- input_file = payload.get( "file", payload.get( "__file", None ) ).file
+ if '__file_path' in payload:
+ file_path = payload.get( '__file_path' )
+ upload_store = trans.app.config.nginx_upload_job_files_store
+ assert upload_store, ( "Request appears to have been processed by"
+ " nginx_upload_module but Galaxy is not"
+ " configured to recognize it" )
+ assert file_path.startswith( upload_store ), \
+ ( "Filename provided by nginx (%s) is not in correct"
+ " directory (%s)" % ( file_path, upload_store ) )
+ input_file = open( file_path )
+ else:
+ input_file = payload.get( "file",
+ payload.get( "__file", None ) ).file
try:
- shutil.copyfile( input_file.name, path )
+ shutil.move( input_file.name, path )
finally:
input_file.close()
return {"message": "ok"}
diff -r 6395e70351435911f7ab75863c1b48b54e20a919 -r 0aa4dd8af7cf8303ef9dd9af95c2e2676854ecca lib/galaxy/webapps/galaxy/api/tools.py
--- a/lib/galaxy/webapps/galaxy/api/tools.py
+++ b/lib/galaxy/webapps/galaxy/api/tools.py
@@ -145,7 +145,6 @@
if success:
trans.response.set_content_type( 'application/x-gzip' )
download_file = open( tool_tarball )
- os.unlink( tool_tarball )
tarball_path, filename = os.path.split( tool_tarball )
trans.response.headers[ "Content-Disposition" ] = 'attachment; filename="%s.tgz"' % ( id )
return download_file
@@ -332,7 +331,7 @@
# job's previous parameters and incoming parameters. Incoming parameters
# have priority.
#
- original_job = self.hda_manager.creating_job( original_dataset )
+ original_job = self.hda_manager.creating_job( trans, original_dataset )
tool = trans.app.toolbox.get_tool( original_job.tool_id )
if not tool or not tool.allow_user_access( trans.user ):
return trans.app.model.Dataset.conversion_messages.NO_TOOL
diff -r 6395e70351435911f7ab75863c1b48b54e20a919 -r 0aa4dd8af7cf8303ef9dd9af95c2e2676854ecca lib/galaxy/webapps/galaxy/buildapp.py
--- a/lib/galaxy/webapps/galaxy/buildapp.py
+++ b/lib/galaxy/webapps/galaxy/buildapp.py
@@ -106,13 +106,13 @@
pack_scripts()
# Close any pooled database connections before forking
try:
- galaxy.model.mapping.metadata.engine.connection_provider._pool.dispose()
+ galaxy.model.mapping.metadata.bind.dispose()
except:
- pass
+ log.exception("Unable to dispose of pooled galaxy model database connections.")
try:
- galaxy.model.tool_shed_install.mapping.metadata.engine.connection_provider._pool.dispose()
+ galaxy.model.tool_shed_install.mapping.metadata.bind.dispose()
except:
- pass
+ log.exception("Unable to dispose of pooled toolshed install model database connections.")
if not app.config.is_uwsgi:
postfork_setup()
diff -r 6395e70351435911f7ab75863c1b48b54e20a919 -r 0aa4dd8af7cf8303ef9dd9af95c2e2676854ecca lib/galaxy/webapps/galaxy/controllers/dataset.py
--- a/lib/galaxy/webapps/galaxy/controllers/dataset.py
+++ b/lib/galaxy/webapps/galaxy/controllers/dataset.py
@@ -852,22 +852,24 @@
status = 'done'
try:
id = trans.app.security.decode_id( dataset_id )
- history = trans.get_history()
user = trans.get_user()
hda = trans.sa_session.query( self.app.model.HistoryDatasetAssociation ).get( id )
# Invalid HDA
assert hda, 'Invalid history dataset ID'
+
# Walk up parent datasets to find the containing history
+ history = trans.get_history()
topmost_parent = hda
while topmost_parent.parent:
topmost_parent = topmost_parent.parent
- assert topmost_parent in history.datasets, "Data does not belong to current history"
# If the user is anonymous, make sure the HDA is owned by the current session.
if not user:
- assert trans.galaxy_session.current_history_id == trans.history.id, 'Invalid history dataset ID'
+ current_history_id = trans.galaxy_session.current_history_id
+ assert topmost_parent.history.id == current_history_id, 'Data does not belong to current user'
# If the user is known, make sure the HDA is owned by the current user.
else:
- assert topmost_parent.history.user == trans.user, 'Invalid history dataset ID'
+ assert topmost_parent.history.user == user, 'Data does not belong to current user'
+
# Ensure HDA is deleted
hda.deleted = True
# HDA is purgeable
@@ -890,8 +892,8 @@
except:
log.exception( 'Unable to purge dataset (%s) on purge of HDA (%s):' % ( hda.dataset.id, hda.id ) )
trans.sa_session.flush()
- except Exception:
- msg = 'HDA purge failed (encoded: %s, decoded: %s)' % ( dataset_id, id )
+ except Exception, exc:
+ msg = 'HDA purge failed (encoded: %s, decoded: %s): %s' % ( dataset_id, id, exc )
log.exception( msg )
trans.log_event( msg )
message = 'Dataset removal from disk failed'
diff -r 6395e70351435911f7ab75863c1b48b54e20a919 -r 0aa4dd8af7cf8303ef9dd9af95c2e2676854ecca lib/galaxy/webapps/galaxy/controllers/history.py
--- a/lib/galaxy/webapps/galaxy/controllers/history.py
+++ b/lib/galaxy/webapps/galaxy/controllers/history.py
@@ -605,9 +605,13 @@
except Exception, exc:
user_id = str( trans.user.id ) if trans.user else '(anonymous)'
- log.exception( 'Error bootstrapping history for user %s: %s', user_id, str( exc ) )
- history_dictionary[ 'error' ] = ( 'An error occurred getting the history data from the server. '
- + 'Please contact a Galaxy administrator if the problem persists.' )
+ log.exception( 'Error bootstrapping history for user %s: %s', user_id, exc )
+ if isinstance( exc, exceptions.ItemAccessibilityException ):
+ error_msg = 'You do not have permission to view this history.'
+ else:
+ error_msg = ( 'An error occurred getting the history data from the server. '
+ + 'Please contact a Galaxy administrator if the problem persists.' )
+ return trans.show_error_message( error_msg, use_panels=use_panels )
return trans.fill_template_mako( "history/view.mako",
history=history_dictionary, hdas=hda_dictionaries, user_is_owner=user_is_owner,
diff -r 6395e70351435911f7ab75863c1b48b54e20a919 -r 0aa4dd8af7cf8303ef9dd9af95c2e2676854ecca lib/galaxy/webapps/galaxy/controllers/library_common.py
--- a/lib/galaxy/webapps/galaxy/controllers/library_common.py
+++ b/lib/galaxy/webapps/galaxy/controllers/library_common.py
@@ -1136,7 +1136,7 @@
def make_library_uploaded_dataset( self, trans, cntrller, params, name, path, type, library_bunch, in_folder=None ):
link_data_only = params.get( 'link_data_only', 'copy_files' )
uuid_str = params.get( 'uuid', None )
- file_type = params.get( 'file_type' )
+ file_type = params.get( 'file_type', None )
library_bunch.replace_dataset = None # not valid for these types of upload
uploaded_dataset = util.bunch.Bunch()
new_name = name
@@ -1152,8 +1152,8 @@
uploaded_dataset.type = type
uploaded_dataset.ext = None
uploaded_dataset.file_type = file_type
- uploaded_dataset.dbkey = params.get( 'dbkey' )
- uploaded_dataset.space_to_tab = params.get( 'space_to_tab' )
+ uploaded_dataset.dbkey = params.get( 'dbkey', None )
+ uploaded_dataset.space_to_tab = params.get( 'space_to_tab', None )
if in_folder:
uploaded_dataset.in_folder = in_folder
uploaded_dataset.data = upload_common.new_upload( trans, cntrller, uploaded_dataset, library_bunch )
diff -r 6395e70351435911f7ab75863c1b48b54e20a919 -r 0aa4dd8af7cf8303ef9dd9af95c2e2676854ecca lib/galaxy/webapps/galaxy/controllers/tag.py
--- a/lib/galaxy/webapps/galaxy/controllers/tag.py
+++ b/lib/galaxy/webapps/galaxy/controllers/tag.py
@@ -42,7 +42,7 @@
# Apply tag.
item = self._get_item( trans, item_class, trans.security.decode_id( item_id ) )
user = trans.user
- self.get_tag_handler( trans ).apply_item_tags( trans, user, item, new_tag.encode( 'utf-8' ) )
+ self.get_tag_handler( trans ).apply_item_tags( user, item, new_tag.encode( 'utf-8' ) )
trans.sa_session.flush()
# Log.
params = dict( item_id=item.id, item_class=item_class, tag=new_tag )
@@ -57,7 +57,7 @@
# Remove tag.
item = self._get_item( trans, item_class, trans.security.decode_id( item_id ) )
user = trans.user
- self.get_tag_handler( trans ).remove_item_tag( trans, user, item, tag_name.encode( 'utf-8' ) )
+ self.get_tag_handler( trans ).remove_item_tag( user, item, tag_name.encode( 'utf-8' ) )
trans.sa_session.flush()
# Log.
params = dict( item_id=item.id, item_class=item_class, tag=tag_name )
@@ -73,8 +73,8 @@
# Apply tags.
item = self._get_item( trans, item_class, trans.security.decode_id( item_id ) )
user = trans.user
- self.get_tag_handler( trans ).delete_item_tags( trans, user, item )
- self.get_tag_handler( trans ).apply_item_tags( trans, user, item, new_tags.encode( 'utf-8' ) )
+ self.get_tag_handler( trans ).delete_item_tags( user, item )
+ self.get_tag_handler( trans ).apply_item_tags( user, item, new_tags.encode( 'utf-8' ) )
trans.sa_session.flush()
@web.expose
diff -r 6395e70351435911f7ab75863c1b48b54e20a919 -r 0aa4dd8af7cf8303ef9dd9af95c2e2676854ecca lib/galaxy/webapps/galaxy/controllers/visualization.py
--- a/lib/galaxy/webapps/galaxy/controllers/visualization.py
+++ b/lib/galaxy/webapps/galaxy/controllers/visualization.py
@@ -985,7 +985,7 @@
else:
# Loading new visualization.
dataset = self.get_hda_or_ldda( trans, hda_ldda, dataset_id )
- job = self.hda_manager.creating_job( dataset )
+ job = self.hda_manager.creating_job( trans, dataset )
viz_config = {
'dataset_id': dataset_id,
'tool_id': job.tool_id,
@@ -1017,7 +1017,7 @@
if dataset_id:
decoded_id = self.decode_id( dataset_id )
hda = self.hda_manager.get_accessible( trans, decoded_id, trans.user )
- hda = self.hda_manager.error_if_uploading( hda )
+ hda = self.hda_manager.error_if_uploading( trans, hda )
else:
return trans.show_message( "Phyloviz couldn't find a dataset_id" )
diff -r 6395e70351435911f7ab75863c1b48b54e20a919 -r 0aa4dd8af7cf8303ef9dd9af95c2e2676854ecca lib/galaxy/webapps/reports/buildapp.py
--- a/lib/galaxy/webapps/reports/buildapp.py
+++ b/lib/galaxy/webapps/reports/buildapp.py
@@ -70,12 +70,13 @@
webapp = wrap_in_static( webapp, global_conf, **kwargs )
# Close any pooled database connections before forking
try:
- galaxy.model.mapping.metadata.engine.connection_provider._pool.dispose()
+ galaxy.model.mapping.metadata.bind.dispose()
except:
- pass
+ log.exception("Unable to dispose of pooled galaxy model database connections.")
# Return
return webapp
+
def wrap_in_middleware( app, global_conf, **local_conf ):
"""Based on the configuration wrap `app` in a set of common and useful middleware."""
# Merge the global and local configurations
diff -r 6395e70351435911f7ab75863c1b48b54e20a919 -r 0aa4dd8af7cf8303ef9dd9af95c2e2676854ecca lib/galaxy/webapps/tool_shed/buildapp.py
--- a/lib/galaxy/webapps/tool_shed/buildapp.py
+++ b/lib/galaxy/webapps/tool_shed/buildapp.py
@@ -134,13 +134,28 @@
# Wrap the webapp in some useful middleware
if kwargs.get( 'middleware', True ):
webapp = wrap_in_middleware( webapp, global_conf, **kwargs )
- if asbool( kwargs.get( 'static_enabled', True ) ):
- webapp = wrap_in_static( webapp, global_conf, **kwargs )
+ # TEST FOR UWSGI -- TODO save this somewhere so we only have to do it once.
+ is_uwsgi = False
+ try:
+ # The uwsgi module is automatically injected by the parent uwsgi
+ # process and only exists that way. If anything works, this is a
+ # uwsgi-managed process.
+ import uwsgi
+ is_uwsgi = uwsgi.numproc
+ is_uwsgi = True
+ except ImportError:
+ # This is not a uwsgi process, or something went horribly wrong.
+ pass
+ if asbool( kwargs.get( 'static_enabled', True) ):
+ if is_uwsgi:
+ log.error("Static middleware is enabled in your configuration but this is a uwsgi process. Refusing to wrap in static middleware.")
+ else:
+ webapp = wrap_in_static( webapp, global_conf, **kwargs )
# Close any pooled database connections before forking
try:
- galaxy.webapps.tool_shed.model.mapping.metadata.engine.connection_provider._pool.dispose()
+ galaxy.webapps.tool_shed.model.mapping.metadata.bind.dispose()
except:
- pass
+ log.exception("Unable to dispose of pooled tool_shed model database connections.")
# Return
return webapp
diff -r 6395e70351435911f7ab75863c1b48b54e20a919 -r 0aa4dd8af7cf8303ef9dd9af95c2e2676854ecca lib/tool_shed/metadata/metadata_generator.py
--- a/lib/tool_shed/metadata/metadata_generator.py
+++ b/lib/tool_shed/metadata/metadata_generator.py
@@ -456,8 +456,8 @@
try:
exported_workflow_dict = json.loads( workflow_text )
except Exception, e:
- log.exception( "Skipping file %s since it does not seem to be a valid exported Galaxy workflow: %s" \
- % str( relative_path ), str( e ) )
+ log.exception( "Skipping file %s since it does not seem to be a valid exported Galaxy workflow: %s"
+ % ( str( relative_path ), str( e ) ) )
valid_exported_galaxy_workflow = False
if valid_exported_galaxy_workflow and \
'a_galaxy_workflow' in exported_workflow_dict and \
diff -r 6395e70351435911f7ab75863c1b48b54e20a919 -r 0aa4dd8af7cf8303ef9dd9af95c2e2676854ecca lib/tool_shed/tools/tool_validator.py
--- a/lib/tool_shed/tools/tool_validator.py
+++ b/lib/tool_shed/tools/tool_validator.py
@@ -292,7 +292,7 @@
def load_tool_from_config( self, repository_id, full_path ):
try:
- tool = self.app.toolbox.load_tool( full_path, repository_id=repository_id )
+ tool = self.app.toolbox.load_tool( full_path, repository_id=repository_id, allow_code_files=False )
valid = True
error_message = None
except KeyError, e:
diff -r 6395e70351435911f7ab75863c1b48b54e20a919 -r 0aa4dd8af7cf8303ef9dd9af95c2e2676854ecca lib/tool_shed/util/tool_util.py
--- a/lib/tool_shed/util/tool_util.py
+++ b/lib/tool_shed/util/tool_util.py
@@ -237,12 +237,19 @@
if invalid:
# We're attempting to display a tool in the tool shed that has been determined to have errors, so is invalid.
return state
+ try:
+ # Attempt to generate the tool state using the standard Galaxy-side code
+ return tool.new_state( trans )
+ except Exception, e:
+ # Fall back to building tool state as below
+ log.debug( 'Failed to build tool state for tool "%s" using standard method, will try to fall back on custom method: %s', tool.id, e )
inputs = tool.inputs_by_page[ 0 ]
context = ExpressionContext( state.inputs, parent=None )
for input in inputs.itervalues():
try:
state.inputs[ input.name ] = input.get_initial_value( trans, context )
except:
+ # FIXME: not all values should be an empty list
state.inputs[ input.name ] = []
return state
diff -r 6395e70351435911f7ab75863c1b48b54e20a919 -r 0aa4dd8af7cf8303ef9dd9af95c2e2676854ecca static/scripts/mvc/history/history-model.js
--- a/static/scripts/mvc/history/history-model.js
+++ b/static/scripts/mvc/history/history-model.js
@@ -257,7 +257,7 @@
setAsCurrent : function(){
var history = this,
- xhr = jQuery.getJSON( '/history/set_as_current?id=' + this.id );
+ xhr = jQuery.getJSON( galaxy_config.root + 'history/set_as_current?id=' + this.id );
xhr.done( function(){
history.trigger( 'set-as-current', history );
@@ -361,7 +361,7 @@
var HistoryCollection = Backbone.Collection.extend( BASE_MVC.LoggableMixin ).extend(
/** @lends HistoryCollection.prototype */{
model : History,
-
+
/** logger used to record this.log messages, commonly set to console */
//logger : console,
diff -r 6395e70351435911f7ab75863c1b48b54e20a919 -r 0aa4dd8af7cf8303ef9dd9af95c2e2676854ecca static/scripts/mvc/library/library-dataset-view.js
--- a/static/scripts/mvc/library/library-dataset-view.js
+++ b/static/scripts/mvc/library/library-dataset-view.js
@@ -116,7 +116,7 @@
},
downloadDataset: function(){
- var url = '/api/libraries/datasets/download/uncompressed';
+ var url = ( window.galaxy_config ? galaxy_config.root : '/' ) + 'api/libraries/datasets/download/uncompressed';
var data = {'ld_ids' : this.id};
this.processDownload(url, data);
},
@@ -232,7 +232,7 @@
var self = this;
if (this.options.fetched_permissions === undefined){
- $.get( "/api/libraries/datasets/" + self.id + "/permissions?scope=current").done(function(fetched_permissions) {
+ $.get( ( window.galaxy_config ? galaxy_config.root : '/' ) + "api/libraries/datasets/" + self.id + "/permissions?scope=current").done(function(fetched_permissions) {
self.prepareSelectBoxes({fetched_permissions:fetched_permissions, is_admin:is_admin});
}).fail(function(){
mod_toastr.error('An error occurred while attempting to fetch dataset permissions.');
@@ -273,7 +273,7 @@
placeholder: 'Click to select a role',
container: self.$el.find('#access_perm'),
ajax: {
- url: "/api/libraries/datasets/" + self.id + "/permissions?scope=available",
+ url: ( window.galaxy_config ? galaxy_config.root : '/' ) + "api/libraries/datasets/" + self.id + "/permissions?scope=available",
dataType: 'json',
quietMillis: 100,
data: function (term, page) { // page is the one-based page number tracked by Select2
@@ -320,7 +320,7 @@
placeholder: 'Click to select a role',
container: self.$el.find('#modify_perm'),
ajax: {
- url: "/api/libraries/datasets/" + self.id + "/permissions?scope=available",
+ url: ( window.galaxy_config ? galaxy_config.root : '/' ) + "api/libraries/datasets/" + self.id + "/permissions?scope=available",
dataType: 'json',
quietMillis: 100,
data: function (term, page) { // page is the one-based page number tracked by Select2
@@ -367,7 +367,7 @@
placeholder: 'Click to select a role',
container: self.$el.find('#manage_perm'),
ajax: {
- url: "/api/libraries/datasets/" + self.id + "/permissions?scope=available",
+ url: ( window.galaxy_config ? galaxy_config.root : '/' ) + "api/libraries/datasets/" + self.id + "/permissions?scope=available",
dataType: 'json',
quietMillis: 100,
data: function (term, page) { // page is the one-based page number tracked by Select2
@@ -413,7 +413,7 @@
self.manageSelectObject = new mod_select.View(manage_select_options);
} else { // Non-admins have select with pre-loaded options
var template = self.templateAccessSelect();
- $.get( "/api/libraries/datasets/" + self.id + "/permissions?scope=available", function( data ) {
+ $.get( ( window.galaxy_config ? galaxy_config.root : '/' ) + "api/libraries/datasets/" + self.id + "/permissions?scope=available", function( data ) {
$('.access_perm').html(template({options:data.roles}));
self.accessSelectObject = $('#access_select').select2();
}).fail(function() {
@@ -436,7 +436,7 @@
makeDatasetPrivate: function(){
var self = this;
- $.post("/api/libraries/datasets/" + self.id + "/permissions?action=make_private").done(function(fetched_permissions) {
+ $.post( ( window.galaxy_config ? galaxy_config.root : '/' ) + "api/libraries/datasets/" + self.id + "/permissions?action=make_private").done(function(fetched_permissions) {
self.model.set({is_unrestricted:false});
self.showPermissions({fetched_permissions:fetched_permissions})
mod_toastr.success('The dataset is now private to you.');
@@ -447,7 +447,7 @@
removeDatasetRestrictions: function(){
var self = this;
- $.post("/api/libraries/datasets/" + self.id + "/permissions?action=remove_restrictions")
+ $.post( ( window.galaxy_config ? galaxy_config.root : '/' ) + "api/libraries/datasets/" + self.id + "/permissions?action=remove_restrictions")
.done(function(fetched_permissions) {
self.model.set({is_unrestricted:true});
self.showPermissions({fetched_permissions:fetched_permissions})
@@ -478,7 +478,7 @@
modify_ids.push(modify_roles[i].id);
};
- $.post("/api/libraries/datasets/" + self.id + "/permissions?action=set_permissions", { 'access_ids[]': access_ids, 'manage_ids[]': manage_ids, 'modify_ids[]': modify_ids, } )
+ $.post( ( window.galaxy_config ? galaxy_config.root : '/' ) + "api/libraries/datasets/" + self.id + "/permissions?action=set_permissions", { 'access_ids[]': access_ids, 'manage_ids[]': manage_ids, 'modify_ids[]': modify_ids, } )
.done(function(fetched_permissions){
//fetch dataset again
self.showPermissions({fetched_permissions:fetched_permissions})
diff -r 6395e70351435911f7ab75863c1b48b54e20a919 -r 0aa4dd8af7cf8303ef9dd9af95c2e2676854ecca static/scripts/mvc/library/library-folder-view.js
--- a/static/scripts/mvc/library/library-folder-view.js
+++ b/static/scripts/mvc/library/library-folder-view.js
@@ -81,7 +81,7 @@
var self = this;
if (this.options.fetched_permissions === undefined){
- $.get( "/api/folders/" + self.id + "/permissions?scope=current").done(function(fetched_permissions) {
+ $.get( ( window.galaxy_config ? galaxy_config.root : '/' ) + "api/folders/" + self.id + "/permissions?scope=current").done(function(fetched_permissions) {
self.prepareSelectBoxes({fetched_permissions:fetched_permissions});
}).fail(function(){
mod_toastr.error('An error occurred while attempting to fetch folder permissions.');
@@ -125,7 +125,7 @@
placeholder: 'Click to select a role',
container: self.$el.find('#' + id),
ajax: {
- url: "/api/folders/" + self.id + "/permissions?scope=available",
+ url: ( window.galaxy_config ? galaxy_config.root : '/' ) + "api/folders/" + self.id + "/permissions?scope=available",
dataType: 'json',
quietMillis: 100,
data: function (term, page) { // page is the one-based page number tracked by Select2
@@ -195,7 +195,7 @@
var manage_ids = this._extractIds(this.manageSelectObject.$el.select2('data'));
var modify_ids = this._extractIds(this.modifySelectObject.$el.select2('data'));
- $.post("/api/folders/" + self.id + "/permissions?action=set_permissions", { 'add_ids[]': add_ids, 'manage_ids[]': manage_ids, 'modify_ids[]': modify_ids, } )
+ $.post( ( window.galaxy_config ? galaxy_config.root : '/' ) + "api/folders/" + self.id + "/permissions?action=set_permissions", { 'add_ids[]': add_ids, 'manage_ids[]': manage_ids, 'modify_ids[]': modify_ids, } )
.done(function(fetched_permissions){
//fetch dataset again
self.showPermissions({fetched_permissions:fetched_permissions})
diff -r 6395e70351435911f7ab75863c1b48b54e20a919 -r 0aa4dd8af7cf8303ef9dd9af95c2e2676854ecca static/scripts/mvc/library/library-foldertoolbar-view.js
--- a/static/scripts/mvc/library/library-foldertoolbar-view.js
+++ b/static/scripts/mvc/library/library-foldertoolbar-view.js
@@ -294,7 +294,7 @@
dataset_ids.push( this.parentElement.parentElement.id );
}
} );
- var url = '/api/libraries/datasets/download/' + format;
+ var url = ( window.galaxy_config ? galaxy_config.root : '/' ) + 'api/libraries/datasets/download/' + format;
var data = { 'ld_ids' : dataset_ids };
this.processDownload( url, data, 'get' );
},
@@ -386,7 +386,7 @@
fetchExtAndGenomes: function(){
var that = this;
mod_utils.get({
- url : galaxy_config.root + "api/datatypes?extension_only=False",
+ url : ( window.galaxy_config ? galaxy_config.root : '/' ) + "api/datatypes?extension_only=False",
success : function( datatypes ) {
for (key in datatypes) {
that.list_extensions.push({
@@ -403,7 +403,7 @@
}
});
mod_utils.get({
- url: galaxy_config.root + "api/genomes",
+ url: ( window.galaxy_config ? galaxy_config.root : '/' ) + "api/genomes",
success: function( genomes ) {
for ( key in genomes ) {
that.list_genomes.push({
@@ -689,7 +689,7 @@
for ( var i = history_dataset_ids.length - 1; i >= 0; i-- ) {
history_dataset_id = history_dataset_ids[i];
var folder_item = new mod_library_model.Item();
- folder_item.url = '/api/folders/' + this.options.id + '/contents';
+ folder_item.url = ( window.galaxy_config ? galaxy_config.root : '/' ) + 'api/folders/' + this.options.id + '/contents';
folder_item.set( { 'from_hda_id':history_dataset_id } );
hdas_to_add.push( folder_item );
}
@@ -749,7 +749,7 @@
}
return true;
}
- var promise = $.when( $.post( '/api/libraries/datasets?encoded_folder_id=' + that.id +
+ var promise = $.when( $.post( ( window.galaxy_config ? galaxy_config.root : '/' ) + 'api/libraries/datasets?encoded_folder_id=' + that.id +
'&source=' + options.source +
'&path=' + popped_item +
'&file_type=' + options.file_type +
@@ -788,7 +788,7 @@
}
return true;
}
- var promise = $.when( $.post( '/api/libraries/datasets?encoded_folder_id=' + that.id +
+ var promise = $.when( $.post( ( window.galaxy_config ? galaxy_config.root : '/' ) + 'api/libraries/datasets?encoded_folder_id=' + that.id +
'&source=' + options.source +
'&path=' + popped_item +
'&preserve_dirs=' + options.preserve_dirs +
diff -r 6395e70351435911f7ab75863c1b48b54e20a919 -r 0aa4dd8af7cf8303ef9dd9af95c2e2676854ecca static/scripts/mvc/library/library-library-view.js
--- a/static/scripts/mvc/library/library-library-view.js
+++ b/static/scripts/mvc/library/library-library-view.js
@@ -87,7 +87,7 @@
var self = this;
if (this.options.fetched_permissions === undefined){
- $.get( "/api/libraries/" + self.id + "/permissions?scope=current").done(function(fetched_permissions) {
+ $.get( ( window.galaxy_config ? galaxy_config.root : '/' ) + "api/libraries/" + self.id + "/permissions?scope=current").done(function(fetched_permissions) {
self.prepareSelectBoxes({fetched_permissions:fetched_permissions});
}).fail(function(){
mod_toastr.error('An error occurred while attempting to fetch library permissions.');
@@ -134,7 +134,7 @@
placeholder: 'Click to select a role',
container: self.$el.find('#' + id),
ajax: {
- url: "/api/libraries/" + self.id + "/permissions?scope=available&is_library_access=" + is_library_access,
+ url: ( window.galaxy_config ? galaxy_config.root : '/' ) + "api/libraries/" + self.id + "/permissions?scope=available&is_library_access=" + is_library_access,
dataType: 'json',
quietMillis: 100,
data: function (term, page) { // page is the one-based page number tracked by Select2
@@ -193,7 +193,7 @@
makeDatasetPrivate: function(){
var self = this;
- $.post("/api/libraries/datasets/" + self.id + "/permissions?action=make_private").done(function(fetched_permissions) {
+ $.post( ( window.galaxy_config ? galaxy_config.root : '/' ) + "api/libraries/datasets/" + self.id + "/permissions?action=make_private").done(function(fetched_permissions) {
self.model.set({is_unrestricted:false});
self.showPermissions({fetched_permissions:fetched_permissions})
mod_toastr.success('The dataset is now private to you.');
@@ -204,7 +204,7 @@
removeDatasetRestrictions: function(){
var self = this;
- $.post("/api/libraries/datasets/" + self.id + "/permissions?action=remove_restrictions")
+ $.post( ( window.galaxy_config ? galaxy_config.root : '/' ) + "api/libraries/datasets/" + self.id + "/permissions?action=remove_restrictions")
.done(function(fetched_permissions) {
self.model.set({is_unrestricted:true});
self.showPermissions({fetched_permissions:fetched_permissions})
@@ -230,7 +230,7 @@
var manage_ids = this._extractIds(this.manageSelectObject.$el.select2('data'));
var modify_ids = this._extractIds(this.modifySelectObject.$el.select2('data'));
- $.post("/api/libraries/" + self.id + "/permissions?action=set_permissions", { 'access_ids[]': access_ids, 'add_ids[]': add_ids, 'manage_ids[]': manage_ids, 'modify_ids[]': modify_ids, } )
+ $.post( ( window.galaxy_config ? galaxy_config.root : '/' ) + "api/libraries/" + self.id + "/permissions?action=set_permissions", { 'access_ids[]': access_ids, 'add_ids[]': add_ids, 'manage_ids[]': manage_ids, 'modify_ids[]': modify_ids, } )
.done(function(fetched_permissions){
//fetch dataset again
self.showPermissions({fetched_permissions:fetched_permissions})
diff -r 6395e70351435911f7ab75863c1b48b54e20a919 -r 0aa4dd8af7cf8303ef9dd9af95c2e2676854ecca static/scripts/mvc/library/library-model.js
--- a/static/scripts/mvc/library/library-model.js
+++ b/static/scripts/mvc/library/library-model.js
@@ -4,7 +4,7 @@
// LIBRARY RELATED MODELS
var Library = Backbone.Model.extend({
- urlRoot: '/api/libraries/',
+ urlRoot: ( window.galaxy_config ? galaxy_config.root : '/' ) + 'api/libraries/',
/** based on show_deleted would this lib show in the list of lib's?
* @param {Boolean} show_deleted are we including deleted libraries?
@@ -19,7 +19,7 @@
});
var Libraries = Backbone.Collection.extend({
- url: '/api/libraries',
+ url: ( window.galaxy_config ? galaxy_config.root : '/' ) + 'api/libraries',
model: Library,
@@ -84,15 +84,15 @@
// FOLDER RELATED MODELS
var Item = Backbone.Model.extend({
- urlRoot : '/api/libraries/datasets/'
+ urlRoot : ( window.galaxy_config ? galaxy_config.root : '/' ) + 'api/libraries/datasets/'
});
var Ldda = Backbone.Model.extend({
- urlRoot : '/api/libraries/datasets/'
+ urlRoot : ( window.galaxy_config ? galaxy_config.root : '/' ) + 'api/libraries/datasets/'
});
var FolderAsModel = Backbone.Model.extend({
- urlRoot: '/api/folders'
+ urlRoot: ( window.galaxy_config ? galaxy_config.root : '/' ) + 'api/folders'
});
var Folder = Backbone.Collection.extend({
@@ -152,7 +152,7 @@
var FolderContainer = Backbone.Model.extend({
defaults : {
folder : new Folder(),
- urlRoot : "/api/folders/",
+ urlRoot : ( window.galaxy_config ? galaxy_config.root : '/' ) + 'api/folders/',
id : "unknown"
},
parse : function(obj) {
@@ -169,11 +169,11 @@
// TODO UNITE
var HistoryItem = Backbone.Model.extend({
- urlRoot : '/api/histories/'
+ urlRoot : ( window.galaxy_config ? galaxy_config.root : '/' ) + 'api/histories/'
});
var HistoryContents = Backbone.Collection.extend({
- urlRoot : '/api/histories/',
+ urlRoot : ( window.galaxy_config ? galaxy_config.root : '/' ) + 'api/histories/',
initialize: function(options){
this.id = options.id;
},
@@ -184,11 +184,11 @@
});
var GalaxyHistory = Backbone.Model.extend({
- urlRoot : '/api/histories/'
+ urlRoot : ( window.galaxy_config ? galaxy_config.root : '/' ) + 'api/histories/'
});
var GalaxyHistories = Backbone.Collection.extend({
- url : '/api/histories',
+ url : ( window.galaxy_config ? galaxy_config.root : '/' ) + 'api/histories',
model : GalaxyHistory
});
@@ -199,7 +199,7 @@
*/
var Jstree = Backbone.Model.extend({
- urlRoot: '/api/remote_files'
+ urlRoot: ( window.galaxy_config ? galaxy_config.root : '/' ) + 'api/remote_files'
});
return {
diff -r 6395e70351435911f7ab75863c1b48b54e20a919 -r 0aa4dd8af7cf8303ef9dd9af95c2e2676854ecca static/scripts/mvc/tools/tools-parameters.js
--- a/static/scripts/mvc/tools/tools-parameters.js
+++ b/static/scripts/mvc/tools/tools-parameters.js
@@ -145,6 +145,7 @@
data : options,
error_text : input_def.error_text || 'No options available',
multiple : input_def.multiple,
+ optional : input_def.optional,
searchable : input_def.searchable,
onchange : function() {
self.app.trigger('refresh');
diff -r 6395e70351435911f7ab75863c1b48b54e20a919 -r 0aa4dd8af7cf8303ef9dd9af95c2e2676854ecca static/scripts/packed/mvc/history/history-model.js
--- a/static/scripts/packed/mvc/history/history-model.js
+++ b/static/scripts/packed/mvc/history/history-model.js
@@ -1,1 +1,1 @@
-define(["mvc/history/history-contents","mvc/base-mvc","utils/localization"],function(h,i,d){var e=Backbone.Model.extend(i.LoggableMixin).extend(i.mixin(i.SearchableModelMixin,{defaults:{model_class:"History",id:null,name:"Unnamed History",state:"new",diskSize:0,deleted:false},urlRoot:galaxy_config.root+"api/histories",initialize:function(k,l,j){j=j||{};this.logger=j.logger||null;this.log(this+".initialize:",k,l,j);this.log("creating history contents:",l);this.contents=new h.HistoryContents(l||[],{historyId:this.get("id")});this._setUpListeners();this.updateTimeoutId=null},_setUpListeners:function(){this.on("error",function(k,n,j,m,l){this.errorHandler(k,n,j,m,l)});if(this.contents){this.listenTo(this.contents,"error",function(){this.trigger.apply(this,["error:contents"].concat(jQuery.makeArray(arguments)))})}this.on("change:id",function(k,j){if(this.contents){this.contents.historyId=j}},this)},errorHandler:function(k,n,j,m,l){this.clearUpdateTimeout()},ownedByCurrUser:function(){if(!Galaxy||!Galaxy.currUser){return false}if(Galaxy.currUser.isAnonymous()||Galaxy.currUser.id!==this.get("user_id")){return false}return true},contentsCount:function(){return _.reduce(_.values(this.get("state_details")),function(j,k){return j+k},0)},searchAttributes:["name","annotation","tags"],searchAliases:{title:"name",tag:"tags"},checkForUpdates:function(j){if(this.contents.running().length){this.setUpdateTimeout()}else{this.trigger("ready");if(_.isFunction(j)){j.call(this)}}return this},setUpdateTimeout:function(j){j=j||e.UPDATE_DELAY;var k=this;this.clearUpdateTimeout();this.updateTimeoutId=setTimeout(function(){k.refresh()},j);return this.updateTimeoutId},clearUpdateTimeout:function(){if(this.updateTimeoutId){clearTimeout(this.updateTimeoutId);this.updateTimeoutId=null}},refresh:function(k,j){k=k||[];j=j||{};var l=this;j.data=j.data||{};if(k.length){j.data.details=k.join(",")}var m=this.contents.fetch(j);m.done(function(n){l.checkForUpdates(function(){this.fetch()})});return m},_delete:function(j){if(this.get("deleted")){return jQuery.when()}return this.save({deleted:true},j)},purge:function(j){if(this.get("purged")){return jQuery.when()}return this.save({deleted:true,purged:true},j)},undelete:function(j){if(!this.get("deleted")){return jQuery.when()}return this.save({deleted:false},j)},copy:function(m,k){m=(m!==undefined)?(m):(true);if(!this.id){throw new Error("You must set the history ID before copying it.")}var j={history_id:this.id};if(m){j.current=true}if(k){j.name=k}var l=this,n=jQuery.post(this.urlRoot,j);if(m){return n.then(function(o){var p=new e(o);return p.setAsCurrent().done(function(){l.trigger("copied",l,o)})})}return n.done(function(o){l.trigger("copied",l,o)})},setAsCurrent:function(){var j=this,k=jQuery.getJSON("/history/set_as_current?id="+this.id);k.done(function(){j.trigger("set-as-current",j)});return k},toString:function(){return"History("+this.get("id")+","+this.get("name")+")"}}));e.UPDATE_DELAY=4000;e.getHistoryData=function c(j,v){v=v||{};var r=v.detailIdsFn||[];var m=v.hdcaDetailIds||[];var s=jQuery.Deferred(),p=null;function k(w){if(j==="current"){return jQuery.getJSON(galaxy_config.root+"history/current_history_json")}return jQuery.ajax(galaxy_config.root+"api/histories/"+j)}function o(w){return w&&w.empty}function q(x){if(o(x)){return[]}if(_.isFunction(r)){r=r(x)}if(_.isFunction(m)){m=m(x)}var w={};if(r.length){w.dataset_details=r.join(",")}if(m.length){w.dataset_collection_details=m.join(",")}return jQuery.ajax(galaxy_config.root+"api/histories/"+x.id+"/contents",{data:w})}var t=v.historyFn||k,u=v.contentsFn||q;var n=t(j);n.done(function(w){p=w;s.notify({status:"history data retrieved",historyJSON:p})});n.fail(function(y,w,x){s.reject(y,"loading the history")});var l=n.then(u);l.then(function(w){s.notify({status:"contents data retrieved",historyJSON:p,contentsJSON:w});s.resolve(p,w)});l.fail(function(y,w,x){s.reject(y,"loading the contents",{history:p})});return s};var f=Backbone.Collection.extend(i.LoggableMixin).extend({model:e,urlRoot:(window.galaxy_config?galaxy_config.root:"/")+"api/histories",initialize:function(k,j){j=j||{};this.log("HistoryCollection.initialize",arguments);this.includeDeleted=j.includeDeleted||false;this.setUpListeners()},setUpListeners:function a(){var j=this;this.on("change:deleted",function(k){this.debug("change:deleted",j.includeDeleted,k.get("deleted"));if(!j.includeDeleted&&k.get("deleted")){j.remove(k)}});this.on("copied",function(k,l){this.unshift(new e(l,[]))})},create:function g(m,k,j,l){var o=this,n=jQuery.getJSON(galaxy_config.root+"history/create_new_current");return n.done(function(p){var q=new e(p,[],j||{});o.unshift(q);o.trigger("new-current")})},toString:function b(){return"HistoryCollection("+this.length+")"}});return{History:e,HistoryCollection:f}});
\ No newline at end of file
+define(["mvc/history/history-contents","mvc/base-mvc","utils/localization"],function(h,i,d){var e=Backbone.Model.extend(i.LoggableMixin).extend(i.mixin(i.SearchableModelMixin,{defaults:{model_class:"History",id:null,name:"Unnamed History",state:"new",diskSize:0,deleted:false},urlRoot:galaxy_config.root+"api/histories",initialize:function(k,l,j){j=j||{};this.logger=j.logger||null;this.log(this+".initialize:",k,l,j);this.log("creating history contents:",l);this.contents=new h.HistoryContents(l||[],{historyId:this.get("id")});this._setUpListeners();this.updateTimeoutId=null},_setUpListeners:function(){this.on("error",function(k,n,j,m,l){this.errorHandler(k,n,j,m,l)});if(this.contents){this.listenTo(this.contents,"error",function(){this.trigger.apply(this,["error:contents"].concat(jQuery.makeArray(arguments)))})}this.on("change:id",function(k,j){if(this.contents){this.contents.historyId=j}},this)},errorHandler:function(k,n,j,m,l){this.clearUpdateTimeout()},ownedByCurrUser:function(){if(!Galaxy||!Galaxy.currUser){return false}if(Galaxy.currUser.isAnonymous()||Galaxy.currUser.id!==this.get("user_id")){return false}return true},contentsCount:function(){return _.reduce(_.values(this.get("state_details")),function(j,k){return j+k},0)},searchAttributes:["name","annotation","tags"],searchAliases:{title:"name",tag:"tags"},checkForUpdates:function(j){if(this.contents.running().length){this.setUpdateTimeout()}else{this.trigger("ready");if(_.isFunction(j)){j.call(this)}}return this},setUpdateTimeout:function(j){j=j||e.UPDATE_DELAY;var k=this;this.clearUpdateTimeout();this.updateTimeoutId=setTimeout(function(){k.refresh()},j);return this.updateTimeoutId},clearUpdateTimeout:function(){if(this.updateTimeoutId){clearTimeout(this.updateTimeoutId);this.updateTimeoutId=null}},refresh:function(k,j){k=k||[];j=j||{};var l=this;j.data=j.data||{};if(k.length){j.data.details=k.join(",")}var m=this.contents.fetch(j);m.done(function(n){l.checkForUpdates(function(){this.fetch()})});return m},_delete:function(j){if(this.get("deleted")){return jQuery.when()}return this.save({deleted:true},j)},purge:function(j){if(this.get("purged")){return jQuery.when()}return this.save({deleted:true,purged:true},j)},undelete:function(j){if(!this.get("deleted")){return jQuery.when()}return this.save({deleted:false},j)},copy:function(m,k){m=(m!==undefined)?(m):(true);if(!this.id){throw new Error("You must set the history ID before copying it.")}var j={history_id:this.id};if(m){j.current=true}if(k){j.name=k}var l=this,n=jQuery.post(this.urlRoot,j);if(m){return n.then(function(o){var p=new e(o);return p.setAsCurrent().done(function(){l.trigger("copied",l,o)})})}return n.done(function(o){l.trigger("copied",l,o)})},setAsCurrent:function(){var j=this,k=jQuery.getJSON(galaxy_config.root+"history/set_as_current?id="+this.id);k.done(function(){j.trigger("set-as-current",j)});return k},toString:function(){return"History("+this.get("id")+","+this.get("name")+")"}}));e.UPDATE_DELAY=4000;e.getHistoryData=function c(j,v){v=v||{};var r=v.detailIdsFn||[];var m=v.hdcaDetailIds||[];var s=jQuery.Deferred(),p=null;function k(w){if(j==="current"){return jQuery.getJSON(galaxy_config.root+"history/current_history_json")}return jQuery.ajax(galaxy_config.root+"api/histories/"+j)}function o(w){return w&&w.empty}function q(x){if(o(x)){return[]}if(_.isFunction(r)){r=r(x)}if(_.isFunction(m)){m=m(x)}var w={};if(r.length){w.dataset_details=r.join(",")}if(m.length){w.dataset_collection_details=m.join(",")}return jQuery.ajax(galaxy_config.root+"api/histories/"+x.id+"/contents",{data:w})}var t=v.historyFn||k,u=v.contentsFn||q;var n=t(j);n.done(function(w){p=w;s.notify({status:"history data retrieved",historyJSON:p})});n.fail(function(y,w,x){s.reject(y,"loading the history")});var l=n.then(u);l.then(function(w){s.notify({status:"contents data retrieved",historyJSON:p,contentsJSON:w});s.resolve(p,w)});l.fail(function(y,w,x){s.reject(y,"loading the contents",{history:p})});return s};var f=Backbone.Collection.extend(i.LoggableMixin).extend({model:e,urlRoot:(window.galaxy_config?galaxy_config.root:"/")+"api/histories",initialize:function(k,j){j=j||{};this.log("HistoryCollection.initialize",arguments);this.includeDeleted=j.includeDeleted||false;this.setUpListeners()},setUpListeners:function a(){var j=this;this.on("change:deleted",function(k){this.debug("change:deleted",j.includeDeleted,k.get("deleted"));if(!j.includeDeleted&&k.get("deleted")){j.remove(k)}});this.on("copied",function(k,l){this.unshift(new e(l,[]))})},create:function g(m,k,j,l){var o=this,n=jQuery.getJSON(galaxy_config.root+"history/create_new_current");return n.done(function(p){var q=new e(p,[],j||{});o.unshift(q);o.trigger("new-current")})},toString:function b(){return"HistoryCollection("+this.length+")"}});return{History:e,HistoryCollection:f}});
\ No newline at end of file
diff -r 6395e70351435911f7ab75863c1b48b54e20a919 -r 0aa4dd8af7cf8303ef9dd9af95c2e2676854ecca static/scripts/packed/mvc/library/library-dataset-view.js
--- a/static/scripts/packed/mvc/library/library-dataset-view.js
+++ b/static/scripts/packed/mvc/library/library-dataset-view.js
@@ -1,1 +1,1 @@
-define(["libs/toastr","mvc/library/library-model","mvc/ui/ui-select"],function(d,c,b){var a=Backbone.View.extend({el:"#center",model:null,options:{},events:{"click .toolbtn_modify_dataset":"enableModification","click .toolbtn_cancel_modifications":"render","click .toolbtn-download-dataset":"downloadDataset","click .toolbtn-import-dataset":"importIntoHistory","click .toolbtn-share-dataset":"shareDataset","click .btn-copy-link-to-clipboard":"copyToClipboard","click .btn-make-private":"makeDatasetPrivate","click .btn-remove-restrictions":"removeDatasetRestrictions","click .toolbtn_save_permissions":"savePermissions","click .toolbtn_save_modifications":"comingSoon",},initialize:function(e){this.options=_.extend(this.options,e);if(this.options.id){this.fetchDataset()}},fetchDataset:function(e){this.options=_.extend(this.options,e);this.model=new c.Item({id:this.options.id});var f=this;this.model.fetch({success:function(){if(f.options.show_permissions){f.showPermissions()}else{if(f.options.show_version){f.fetchVersion()}else{f.render()}}},error:function(h,g){if(typeof g.responseJSON!=="undefined"){d.error(g.responseJSON.err_msg+" Click this to go back.","",{onclick:function(){Galaxy.libraries.library_router.back()}})}else{d.error("An error ocurred. Click this to go back.","",{onclick:function(){Galaxy.libraries.library_router.back()}})}}})},render:function(e){this.options=_.extend(this.options,e);$(".tooltip").remove();var f=this.templateDataset();this.$el.html(f({item:this.model}));$(".peek").html(this.model.get("peek"));$("#center [data-toggle]").tooltip()},fetchVersion:function(e){this.options=_.extend(this.options,e);that=this;if(!this.options.ldda_id){this.render();d.error("Library dataset version requested but no id provided.")}else{this.ldda=new c.Ldda({id:this.options.ldda_id});this.ldda.url=this.ldda.urlRoot+this.model.id+"/versions/"+this.ldda.id;this.ldda.fetch({success:function(){that.renderVersion()},error:function(g,f){if(typeof f.responseJSON!=="undefined"){d.error(f.responseJSON.err_msg)}else{d.error("An error ocurred.")}}})}},renderVersion:function(){$(".tooltip").remove();var e=this.templateVersion();this.$el.html(e({item:this.model,ldda:this.ldda}));$(".peek").html(this.ldda.get("peek"))},enableModification:function(){$(".tooltip").remove();var e=this.templateModifyDataset();this.$el.html(e({item:this.model}));$(".peek").html(this.model.get("peek"));$("#center [data-toggle]").tooltip()},downloadDataset:function(){var e="/api/libraries/datasets/download/uncompressed";var f={ld_ids:this.id};this.processDownload(e,f)},processDownload:function(f,g,h){if(f&&g){g=typeof g=="string"?g:$.param(g);var e="";$.each(g.split("&"),function(){var i=this.split("=");e+='<input type="hidden" name="'+i[0]+'" value="'+i[1]+'" />'});$('<form action="'+f+'" method="'+(h||"post")+'">'+e+"</form>").appendTo("body").submit().remove();d.info("Your download will begin soon.")}},importIntoHistory:function(){this.refreshUserHistoriesList(function(e){var f=e.templateBulkImportInModal();e.modal=Galaxy.modal;e.modal.show({closing_events:true,title:"Import into History",body:f({histories:e.histories.models}),buttons:{Import:function(){e.importCurrentIntoHistory()},Close:function(){Galaxy.modal.hide()}}})})},refreshUserHistoriesList:function(f){var e=this;this.histories=new c.GalaxyHistories();this.histories.fetch({success:function(g){if(g.length===0){d.warning("You have to create history first. Click this to do so.","",{onclick:function(){window.location="/"}})}else{f(e)}},error:function(h,g){if(typeof g.responseJSON!=="undefined"){d.error(g.responseJSON.err_msg)}else{d.error("An error ocurred.")}}})},importCurrentIntoHistory:function(){var e=$(this.modal.elMain).find("select[name=dataset_import_single] option:selected").val();var f=new c.HistoryItem();f.url=f.urlRoot+e+"/contents";jQuery.getJSON(galaxy_config.root+"history/set_as_current?id="+e);f.save({content:this.id,source:"library"},{success:function(){Galaxy.modal.hide();d.success("Dataset imported. Click this to start analysing it.","",{onclick:function(){window.location="/"}})},error:function(h,g){if(typeof g.responseJSON!=="undefined"){d.error("Dataset not imported. "+g.responseJSON.err_msg)}else{d.error("An error occured. Dataset not imported. Please try again.")}}})},shareDataset:function(){d.info("Feature coming soon.")},goBack:function(){Galaxy.libraries.library_router.back()},showPermissions:function(f){this.options=_.extend(this.options,f);$(".tooltip").remove();if(this.options.fetched_permissions!==undefined){if(this.options.fetched_permissions.access_dataset_roles.length===0){this.model.set({is_unrestricted:true})}else{this.model.set({is_unrestricted:false})}}var h=false;if(Galaxy.currUser){h=Galaxy.currUser.isAdmin()}var g=this.templateDatasetPermissions();this.$el.html(g({item:this.model,is_admin:h}));var e=this;if(this.options.fetched_permissions===undefined){$.get("/api/libraries/datasets/"+e.id+"/permissions?scope=current").done(function(i){e.prepareSelectBoxes({fetched_permissions:i,is_admin:h})}).fail(function(){d.error("An error occurred while attempting to fetch dataset permissions.")})}else{this.prepareSelectBoxes({is_admin:h})}$("#center [data-toggle]").tooltip();$("#center").css("overflow","auto")},prepareSelectBoxes:function(r){this.options=_.extend(this.options,r);var s=this.options.fetched_permissions;var k=this.options.is_admin;var q=this;var m=[];for(var h=0;h<s.access_dataset_roles.length;h++){m.push(s.access_dataset_roles[h]+":"+s.access_dataset_roles[h])}var f=[];for(var h=0;h<s.modify_item_roles.length;h++){f.push(s.modify_item_roles[h]+":"+s.modify_item_roles[h])}var g=[];for(var h=0;h<s.manage_dataset_roles.length;h++){g.push(s.manage_dataset_roles[h]+":"+s.manage_dataset_roles[h])}if(k){var o={minimumInputLength:0,css:"access_perm",multiple:true,placeholder:"Click to select a role",container:q.$el.find("#access_perm"),ajax:{url:"/api/libraries/datasets/"+q.id+"/permissions?scope=available",dataType:"json",quietMillis:100,data:function(i,t){return{q:i,page_limit:10,page:t}},results:function(u,t){var i=(t*10)<u.total;return{results:u.roles,more:i}}},formatResult:function j(i){return i.name+" type: "+i.type},formatSelection:function e(i){return i.name},initSelection:function(i,u){var t=[];$(i.val().split(",")).each(function(){var v=this.split(":");t.push({id:v[1],name:v[1]})});u(t)},initialData:m.join(","),dropdownCssClass:"bigdrop"};var l={minimumInputLength:0,css:"modify_perm",multiple:true,placeholder:"Click to select a role",container:q.$el.find("#modify_perm"),ajax:{url:"/api/libraries/datasets/"+q.id+"/permissions?scope=available",dataType:"json",quietMillis:100,data:function(i,t){return{q:i,page_limit:10,page:t}},results:function(u,t){var i=(t*10)<u.total;return{results:u.roles,more:i}}},formatResult:function j(i){return i.name+" type: "+i.type},formatSelection:function e(i){return i.name},initSelection:function(i,u){var t=[];$(i.val().split(",")).each(function(){var v=this.split(":");t.push({id:v[1],name:v[1]})});u(t)},initialData:f.join(","),dropdownCssClass:"bigdrop"};var p={minimumInputLength:0,css:"manage_perm",multiple:true,placeholder:"Click to select a role",container:q.$el.find("#manage_perm"),ajax:{url:"/api/libraries/datasets/"+q.id+"/permissions?scope=available",dataType:"json",quietMillis:100,data:function(i,t){return{q:i,page_limit:10,page:t}},results:function(u,t){var i=(t*10)<u.total;return{results:u.roles,more:i}}},formatResult:function j(i){return i.name+" type: "+i.type},formatSelection:function e(i){return i.name},initSelection:function(i,u){var t=[];$(i.val().split(",")).each(function(){var v=this.split(":");t.push({id:v[1],name:v[1]})});u(t)},initialData:g.join(","),dropdownCssClass:"bigdrop"};q.accessSelectObject=new b.View(o);q.modifySelectObject=new b.View(l);q.manageSelectObject=new b.View(p)}else{var n=q.templateAccessSelect();$.get("/api/libraries/datasets/"+q.id+"/permissions?scope=available",function(i){$(".access_perm").html(n({options:i.roles}));q.accessSelectObject=$("#access_select").select2()}).fail(function(){d.error("An error occurred while attempting to fetch dataset permissions.")})}},comingSoon:function(){d.warning("Feature coming soon.")},copyToClipboard:function(){var e=Backbone.history.location.href;if(e.lastIndexOf("/permissions")!==-1){e=e.substr(0,e.lastIndexOf("/permissions"))}window.prompt("Copy to clipboard: Ctrl+C, Enter",e)},makeDatasetPrivate:function(){var e=this;$.post("/api/libraries/datasets/"+e.id+"/permissions?action=make_private").done(function(f){e.model.set({is_unrestricted:false});e.showPermissions({fetched_permissions:f});d.success("The dataset is now private to you.")}).fail(function(){d.error("An error occurred while attempting to make dataset private.")})},removeDatasetRestrictions:function(){var e=this;$.post("/api/libraries/datasets/"+e.id+"/permissions?action=remove_restrictions").done(function(f){e.model.set({is_unrestricted:true});e.showPermissions({fetched_permissions:f});d.success("Access to this dataset is now unrestricted.")}).fail(function(){d.error("An error occurred while attempting to make dataset unrestricted.")})},savePermissions:function(e){var n=this;var k=this.accessSelectObject.$el.select2("data");var f=this.manageSelectObject.$el.select2("data");var m=this.modifySelectObject.$el.select2("data");var g=[];var j=[];var l=[];for(var h=k.length-1;h>=0;h--){g.push(k[h].id)}for(var h=f.length-1;h>=0;h--){j.push(f[h].id)}for(var h=m.length-1;h>=0;h--){l.push(m[h].id)}$.post("/api/libraries/datasets/"+n.id+"/permissions?action=set_permissions",{"access_ids[]":g,"manage_ids[]":j,"modify_ids[]":l,}).done(function(i){n.showPermissions({fetched_permissions:i});d.success("Permissions saved.")}).fail(function(){d.error("An error occurred while attempting to set dataset permissions.")})},templateDataset:function(){var e=[];e.push('<div class="library_style_container">');e.push(' <div id="library_toolbar">');e.push(' <button data-toggle="tooltip" data-placement="top" title="Download dataset" class="btn btn-default toolbtn-download-dataset primary-button" type="button"><span class="fa fa-download"></span> Download</span></button>');e.push(' <button data-toggle="tooltip" data-placement="top" title="Import dataset into history" class="btn btn-default toolbtn-import-dataset primary-button" type="button"><span class="fa fa-book"></span> to History</span></button>');e.push(' <% if (item.get("can_user_modify")) { %>');e.push(' <button data-toggle="tooltip" data-placement="top" title="Modify library item" class="btn btn-default toolbtn_modify_dataset primary-button" type="button"><span class="fa fa-pencil"></span> Modify</span></button>');e.push(" <% } %>");e.push(' <% if (item.get("can_user_manage")) { %>');e.push(' <a href="#folders/<%- item.get("folder_id") %>/datasets/<%- item.id %>/permissions"><button data-toggle="tooltip" data-placement="top" title="Manage permissions" class="btn btn-default toolbtn_change_permissions primary-button" type="button"><span class="fa fa-group"></span> Permissions</span></button></a>');e.push(" <% } %>");e.push(" </div>");e.push('<ol class="breadcrumb">');e.push(' <li><a title="Return to the list of libraries" href="#">Libraries</a></li>');e.push(' <% _.each(item.get("full_path"), function(path_item) { %>');e.push(" <% if (path_item[0] != item.id) { %>");e.push(' <li><a title="Return to this folder" href="#/folders/<%- path_item[0] %>"><%- path_item[1] %></a></li> ');e.push("<% } else { %>");e.push(' <li class="active"><span title="You are here"><%- path_item[1] %></span></li>');e.push(" <% } %>");e.push(" <% }); %>");e.push("</ol>");e.push('<% if (item.get("is_unrestricted")) { %>');e.push(' <div class="alert alert-info">');e.push(" This dataset is unrestricted so everybody can access it. Just share the URL of this page. ");e.push(' <button data-toggle="tooltip" data-placement="top" title="Copy to clipboard" class="btn btn-default btn-copy-link-to-clipboard primary-button" type="button"><span class="fa fa-clipboard"></span> To Clipboard</span></button> ');e.push(" </div>");e.push("<% } %>");e.push('<div class="dataset_table">');e.push(' <table class="grid table table-striped table-condensed">');e.push(" <tr>");e.push(' <th scope="row" id="id_row" data-id="<%= _.escape(item.get("ldda_id")) %>">Name</th>');e.push(' <td><%= _.escape(item.get("name")) %></td>');e.push(" </tr>");e.push(' <% if (item.get("file_ext")) { %>');e.push(" <tr>");e.push(' <th scope="row">Data type</th>');e.push(' <td><%= _.escape(item.get("file_ext")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(' <% if (item.get("genome_build")) { %>');e.push(" <tr>");e.push(' <th scope="row">Genome build</th>');e.push(' <td><%= _.escape(item.get("genome_build")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(' <% if (item.get("file_size")) { %>');e.push(" <tr>");e.push(' <th scope="row">Size</th>');e.push(' <td><%= _.escape(item.get("file_size")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(' <% if (item.get("date_uploaded")) { %>');e.push(" <tr>");e.push(' <th scope="row">Date uploaded (UTC)</th>');e.push(' <td><%= _.escape(item.get("date_uploaded")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(' <% if (item.get("uploaded_by")) { %>');e.push(" <tr>");e.push(' <th scope="row">Uploaded by</th>');e.push(' <td><%= _.escape(item.get("uploaded_by")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(' <% if (item.get("metadata_data_lines")) { %>');e.push(" <tr>");e.push(' <th scope="row">Data Lines</th>');e.push(' <td scope="row"><%= _.escape(item.get("metadata_data_lines")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(' <% if (item.get("metadata_comment_lines")) { %>');e.push(" <tr>");e.push(' <th scope="row">Comment Lines</th>');e.push(' <td scope="row"><%= _.escape(item.get("metadata_comment_lines")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(' <% if (item.get("metadata_columns")) { %>');e.push(" <tr>");e.push(' <th scope="row">Number of Columns</th>');e.push(' <td scope="row"><%= _.escape(item.get("metadata_columns")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(' <% if (item.get("metadata_column_types")) { %>');e.push(" <tr>");e.push(' <th scope="row">Column Types</th>');e.push(' <td scope="row"><%= _.escape(item.get("metadata_column_types")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(' <% if (item.get("message")) { %>');e.push(" <tr>");e.push(' <th scope="row">Message</th>');e.push(' <td scope="row"><%= _.escape(item.get("message")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(' <% if (item.get("misc_blurb")) { %>');e.push(" <tr>");e.push(' <th scope="row">Miscellaneous blurb</th>');e.push(' <td scope="row"><%= _.escape(item.get("misc_blurb")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(' <% if (item.get("misc_info")) { %>');e.push(" <tr>");e.push(' <th scope="row">Miscellaneous information</th>');e.push(' <td scope="row"><%= _.escape(item.get("misc_info")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(" </table>");e.push(" <div>");e.push(' <pre class="peek">');e.push(" </pre>");e.push(" </div>");e.push(' <% if (item.get("has_versions")) { %>');e.push(" <div>");e.push(" <h3>Expired versions:</h3>");e.push(" <ul>");e.push(' <% _.each(item.get("expired_versions"), function(version) { %>');e.push(' <li><a title="See details of this version" href="#folders/<%- item.get("folder_id") %>/datasets/<%- item.id %>/versions/<%- version[0] %>"><%- version[1] %></a></li>');e.push(" <% }) %>");e.push(" <ul>");e.push(" </div>");e.push(" <% } %>");e.push("</div>");e.push("</div>");return _.template(e.join(""))},templateVersion:function(){var e=[];e.push('<div class="library_style_container">');e.push(' <div id="library_toolbar">');e.push(' <a href="#folders/<%- item.get("folder_id") %>/datasets/<%- item.id %>"><button data-toggle="tooltip" data-placement="top" title="Go to latest dataset" class="btn btn-default primary-button" type="button"><span class="fa fa-caret-left fa-lg"></span> Latest dataset</span></button><a>');e.push(" </div>");e.push('<ol class="breadcrumb">');e.push(' <li><a title="Return to the list of libraries" href="#">Libraries</a></li>');e.push(' <% _.each(item.get("full_path"), function(path_item) { %>');e.push(" <% if (path_item[0] != item.id) { %>");e.push(' <li><a title="Return to this folder" href="#/folders/<%- path_item[0] %>"><%- path_item[1] %></a></li> ');e.push("<% } else { %>");e.push(' <li class="active"><span title="You are here"><%- path_item[1] %></span></li>');e.push(" <% } %>");e.push(" <% }); %>");e.push("</ol>");e.push(' <div class="alert alert-warning">This is an expired version of the library dataset: <%= _.escape(item.get("name")) %></div>');e.push('<div class="dataset_table">');e.push(' <table class="grid table table-striped table-condensed">');e.push(" <tr>");e.push(' <th scope="row" id="id_row" data-id="<%= _.escape(ldda.id) %>">Name</th>');e.push(' <td><%= _.escape(ldda.get("name")) %></td>');e.push(" </tr>");e.push(' <% if (ldda.get("file_ext")) { %>');e.push(" <tr>");e.push(' <th scope="row">Data type</th>');e.push(' <td><%= _.escape(ldda.get("file_ext")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(' <% if (ldda.get("genome_build")) { %>');e.push(" <tr>");e.push(' <th scope="row">Genome build</th>');e.push(' <td><%= _.escape(ldda.get("genome_build")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(' <% if (ldda.get("file_size")) { %>');e.push(" <tr>");e.push(' <th scope="row">Size</th>');e.push(' <td><%= _.escape(ldda.get("file_size")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(' <% if (ldda.get("date_uploaded")) { %>');e.push(" <tr>");e.push(' <th scope="row">Date uploaded (UTC)</th>');e.push(' <td><%= _.escape(ldda.get("date_uploaded")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(' <% if (ldda.get("uploaded_by")) { %>');e.push(" <tr>");e.push(' <th scope="row">Uploaded by</th>');e.push(' <td><%= _.escape(ldda.get("uploaded_by")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(' <% if (ldda.get("metadata_data_lines")) { %>');e.push(" <tr>");e.push(' <th scope="row">Data Lines</th>');e.push(' <td scope="row"><%= _.escape(ldda.get("metadata_data_lines")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(' <% if (ldda.get("metadata_comment_lines")) { %>');e.push(" <tr>");e.push(' <th scope="row">Comment Lines</th>');e.push(' <td scope="row"><%= _.escape(ldda.get("metadata_comment_lines")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(' <% if (ldda.get("metadata_columns")) { %>');e.push(" <tr>");e.push(' <th scope="row">Number of Columns</th>');e.push(' <td scope="row"><%= _.escape(ldda.get("metadata_columns")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(' <% if (ldda.get("metadata_column_types")) { %>');e.push(" <tr>");e.push(' <th scope="row">Column Types</th>');e.push(' <td scope="row"><%= _.escape(ldda.get("metadata_column_types")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(' <% if (ldda.get("message")) { %>');e.push(" <tr>");e.push(' <th scope="row">Message</th>');e.push(' <td scope="row"><%= _.escape(ldda.get("message")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(' <% if (ldda.get("misc_blurb")) { %>');e.push(" <tr>");e.push(' <th scope="row">Miscellaneous blurb</th>');e.push(' <td scope="row"><%= _.escape(ldda.get("misc_blurb")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(' <% if (ldda.get("misc_info")) { %>');e.push(" <tr>");e.push(' <th scope="row">Miscellaneous information</th>');e.push(' <td scope="row"><%= _.escape(ldda.get("misc_info")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(" </table>");e.push(" <div>");e.push(' <pre class="peek">');e.push(" </pre>");e.push(" </div>");e.push("</div>");e.push("</div>");return _.template(e.join(""))},templateModifyDataset:function(){var e=[];e.push('<div class="library_style_container">');e.push(' <div id="library_toolbar">');e.push(' <button data-toggle="tooltip" data-placement="top" title="Cancel modifications" class="btn btn-default toolbtn_cancel_modifications primary-button" type="button"><span class="fa fa-times"></span> Cancel</span></button>');e.push(' <button data-toggle="tooltip" data-placement="top" title="Save modifications" class="btn btn-default toolbtn_save_modifications primary-button" type="button"><span class="fa fa-floppy-o"></span> Save</span></button>');e.push(" </div>");e.push('<ol class="breadcrumb">');e.push(' <li><a title="Return to the list of libraries" href="#">Libraries</a></li>');e.push(' <% _.each(item.get("full_path"), function(path_item) { %>');e.push(" <% if (path_item[0] != item.id) { %>");e.push(' <li><a title="Return to this folder" href="#/folders/<%- path_item[0] %>"><%- path_item[1] %></a></li> ');e.push("<% } else { %>");e.push(' <li class="active"><span title="You are here"><%- path_item[1] %></span></li>');e.push(" <% } %>");e.push(" <% }); %>");e.push("</ol>");e.push('<div class="dataset_table">');e.push('<p>For more editing options please import the dataset to history and use "Edit attributes" on it.</p>');e.push(' <table class="grid table table-striped table-condensed">');e.push(" <tr>");e.push(' <th scope="row" id="id_row" data-id="<%= _.escape(item.get("ldda_id")) %>">Name</th>');e.push(' <td><input class="input_dataset_name form-control" type="text" placeholder="name" value="<%= _.escape(item.get("name")) %>"></td>');e.push(" </tr>");e.push(" <tr>");e.push(' <th scope="row">Data type</th>');e.push(' <td><%= _.escape(item.get("file_ext")) %></td>');e.push(" </tr>");e.push(" <tr>");e.push(' <th scope="row">Genome build</th>');e.push(' <td><%= _.escape(item.get("genome_build")) %></td>');e.push(" </tr>");e.push(" <tr>");e.push(' <th scope="row">Size</th>');e.push(' <td><%= _.escape(item.get("file_size")) %></td>');e.push(" </tr>");e.push(" <tr>");e.push(' <th scope="row">Date uploaded (UTC)</th>');e.push(' <td><%= _.escape(item.get("date_uploaded")) %></td>');e.push(" </tr>");e.push(" <tr>");e.push(' <th scope="row">Uploaded by</th>');e.push(' <td><%= _.escape(item.get("uploaded_by")) %></td>');e.push(" </tr>");e.push(' <tr scope="row">');e.push(' <th scope="row">Data Lines</th>');e.push(' <td scope="row"><%= _.escape(item.get("metadata_data_lines")) %></td>');e.push(" </tr>");e.push(' <th scope="row">Comment Lines</th>');e.push(' <% if (item.get("metadata_comment_lines") === "") { %>');e.push(' <td scope="row"><%= _.escape(item.get("metadata_comment_lines")) %></td>');e.push(" <% } else { %>");e.push(' <td scope="row">unknown</td>');e.push(" <% } %>");e.push(" </tr>");e.push(" <tr>");e.push(' <th scope="row">Number of Columns</th>');e.push(' <td scope="row"><%= _.escape(item.get("metadata_columns")) %></td>');e.push(" </tr>");e.push(" <tr>");e.push(' <th scope="row">Column Types</th>');e.push(' <td scope="row"><%= _.escape(item.get("metadata_column_types")) %></td>');e.push(" </tr>");e.push(" <tr>");e.push(' <th scope="row">Message</th>');e.push(' <td scope="row"><%= _.escape(item.get("message")) %></td>');e.push(" </tr>");e.push(" <tr>");e.push(' <th scope="row">Miscellaneous information</th>');e.push(' <td scope="row"><%= _.escape(item.get("misc_info")) %></td>');e.push(" </tr>");e.push(" <tr>");e.push(' <th scope="row">Miscellaneous blurb</th>');e.push(' <td scope="row"><%= _.escape(item.get("misc_blurb")) %></td>');e.push(" </tr>");e.push(" </table>");e.push("<div>");e.push(' <pre class="peek">');e.push(" </pre>");e.push("</div>");e.push("</div>");e.push("</div>");return _.template(e.join(""))},templateDatasetPermissions:function(){var e=[];e.push('<div class="library_style_container">');e.push(' <div id="library_toolbar">');e.push(' <a href="#folders/<%- item.get("folder_id") %>"><button data-toggle="tooltip" data-placement="top" title="Go back to containing folder" class="btn btn-default primary-button" type="button"><span class="fa fa-folder-open-o"></span> Containing Folder</span></button></a>');e.push(' <a href="#folders/<%- item.get("folder_id") %>/datasets/<%- item.id %>"><button data-toggle="tooltip" data-placement="top" title="Go back to dataset" class="btn btn-default primary-button" type="button"><span class="fa fa-file-o"></span> Dataset Details</span></button><a>');e.push(" </div>");e.push('<ol class="breadcrumb">');e.push(' <li><a title="Return to the list of libraries" href="#">Libraries</a></li>');e.push(' <% _.each(item.get("full_path"), function(path_item) { %>');e.push(" <% if (path_item[0] != item.id) { %>");e.push(' <li><a title="Return to this folder" href="#/folders/<%- path_item[0] %>"><%- path_item[1] %></a></li> ');e.push("<% } else { %>");e.push(' <li class="active"><span title="You are here"><%- path_item[1] %></span></li>');e.push(" <% } %>");e.push(" <% }); %>");e.push("</ol>");e.push('<h1>Dataset: <%= _.escape(item.get("name")) %></h1>');e.push('<div class="alert alert-warning">');e.push("<% if (is_admin) { %>");e.push("You are logged in as an <strong>administrator</strong> therefore you can manage any dataset on this Galaxy instance. Please make sure you understand the consequences.");e.push("<% } else { %>");e.push("You can assign any number of roles to any of the following permission types. However please read carefully the implications of such actions.");e.push("<% } %>");e.push("</div>");e.push('<div class="dataset_table">');e.push("<h2>Library-related permissions</h2>");e.push("<h4>Roles that can modify the library item</h4>");e.push('<div id="modify_perm" class="modify_perm roles-selection"></div>');e.push('<div class="alert alert-info roles-selection">User with <strong>any</strong> of these roles can modify name, metadata, and other information about this library item.</div>');e.push("<hr/>");e.push("<h2>Dataset-related permissions</h2>");e.push('<div class="alert alert-warning">Changes made below will affect <strong>every</strong> library item that was created from this dataset and also every history this dataset is part of.</div>');e.push('<% if (!item.get("is_unrestricted")) { %>');e.push(" <p>You can remove all access restrictions on this dataset. ");e.push(' <button data-toggle="tooltip" data-placement="top" title="Everybody will be able to access the dataset." class="btn btn-default btn-remove-restrictions primary-button" type="button">');e.push(' <span class="fa fa-globe"> Remove restrictions</span>');e.push(" </button>");e.push(" </p>");e.push("<% } else { %>");e.push(" This dataset is unrestricted so everybody can access it. Just share the URL of this page.");e.push(' <button data-toggle="tooltip" data-placement="top" title="Copy to clipboard" class="btn btn-default btn-copy-link-to-clipboard primary-button" type="button"><span class="fa fa-clipboard"> To Clipboard</span></button> ');e.push(" <p>You can make this dataset private to you. ");e.push(' <button data-toggle="tooltip" data-placement="top" title="Only you will be able to access the dataset." class="btn btn-default btn-make-private primary-button" type="button"><span class="fa fa-key"> Make Private</span></button>');e.push(" </p>");e.push("<% } %>");e.push("<h4>Roles that can access the dataset</h4>");e.push('<div id="access_perm" class="access_perm roles-selection"></div>');e.push('<div class="alert alert-info roles-selection">User has to have <strong>all these roles</strong> in order to access this dataset. Users without access permission <strong>cannot</strong> have other permissions on this dataset. If there are no access roles set on the dataset it is considered <strong>unrestricted</strong>.</div>');e.push("<h4>Roles that can manage permissions on the dataset</h4>");e.push('<div id="manage_perm" class="manage_perm roles-selection"></div>');e.push('<div class="alert alert-info roles-selection">User with <strong>any</strong> of these roles can manage permissions of this dataset. If you remove yourself you will loose the ability manage this dataset unless you are an admin.</div>');e.push('<button data-toggle="tooltip" data-placement="top" title="Save modifications made on this page" class="btn btn-default toolbtn_save_permissions primary-button" type="button"><span class="fa fa-floppy-o"></span> Save</span></button>');e.push("</div>");e.push("</div>");return _.template(e.join(""))},templateBulkImportInModal:function(){var e=[];e.push('<span id="history_modal_combo_bulk" style="width:90%; margin-left: 1em; margin-right: 1em; ">');e.push("Select history: ");e.push('<select id="dataset_import_single" name="dataset_import_single" style="width:50%; margin-bottom: 1em; "> ');e.push(" <% _.each(histories, function(history) { %>");e.push(' <option value="<%= _.escape(history.get("id")) %>"><%= _.escape(history.get("name")) %></option>');e.push(" <% }); %>");e.push("</select>");e.push("</span>");return _.template(e.join(""))},templateAccessSelect:function(){var e=[];e.push('<select id="access_select" multiple>');e.push(" <% _.each(options, function(option) { %>");e.push(' <option value="<%- option.name %>"><%- option.name %></option>');e.push(" <% }); %>");e.push("</select>");return _.template(e.join(""))}});return{LibraryDatasetView:a}});
\ No newline at end of file
+define(["libs/toastr","mvc/library/library-model","mvc/ui/ui-select"],function(d,c,b){var a=Backbone.View.extend({el:"#center",model:null,options:{},events:{"click .toolbtn_modify_dataset":"enableModification","click .toolbtn_cancel_modifications":"render","click .toolbtn-download-dataset":"downloadDataset","click .toolbtn-import-dataset":"importIntoHistory","click .toolbtn-share-dataset":"shareDataset","click .btn-copy-link-to-clipboard":"copyToClipboard","click .btn-make-private":"makeDatasetPrivate","click .btn-remove-restrictions":"removeDatasetRestrictions","click .toolbtn_save_permissions":"savePermissions","click .toolbtn_save_modifications":"comingSoon",},initialize:function(e){this.options=_.extend(this.options,e);if(this.options.id){this.fetchDataset()}},fetchDataset:function(e){this.options=_.extend(this.options,e);this.model=new c.Item({id:this.options.id});var f=this;this.model.fetch({success:function(){if(f.options.show_permissions){f.showPermissions()}else{if(f.options.show_version){f.fetchVersion()}else{f.render()}}},error:function(h,g){if(typeof g.responseJSON!=="undefined"){d.error(g.responseJSON.err_msg+" Click this to go back.","",{onclick:function(){Galaxy.libraries.library_router.back()}})}else{d.error("An error ocurred. Click this to go back.","",{onclick:function(){Galaxy.libraries.library_router.back()}})}}})},render:function(e){this.options=_.extend(this.options,e);$(".tooltip").remove();var f=this.templateDataset();this.$el.html(f({item:this.model}));$(".peek").html(this.model.get("peek"));$("#center [data-toggle]").tooltip()},fetchVersion:function(e){this.options=_.extend(this.options,e);that=this;if(!this.options.ldda_id){this.render();d.error("Library dataset version requested but no id provided.")}else{this.ldda=new c.Ldda({id:this.options.ldda_id});this.ldda.url=this.ldda.urlRoot+this.model.id+"/versions/"+this.ldda.id;this.ldda.fetch({success:function(){that.renderVersion()},error:function(g,f){if(typeof f.responseJSON!=="undefined"){d.error(f.responseJSON.err_msg)}else{d.error("An error ocurred.")}}})}},renderVersion:function(){$(".tooltip").remove();var e=this.templateVersion();this.$el.html(e({item:this.model,ldda:this.ldda}));$(".peek").html(this.ldda.get("peek"))},enableModification:function(){$(".tooltip").remove();var e=this.templateModifyDataset();this.$el.html(e({item:this.model}));$(".peek").html(this.model.get("peek"));$("#center [data-toggle]").tooltip()},downloadDataset:function(){var e=(window.galaxy_config?galaxy_config.root:"/")+"api/libraries/datasets/download/uncompressed";var f={ld_ids:this.id};this.processDownload(e,f)},processDownload:function(f,g,h){if(f&&g){g=typeof g=="string"?g:$.param(g);var e="";$.each(g.split("&"),function(){var i=this.split("=");e+='<input type="hidden" name="'+i[0]+'" value="'+i[1]+'" />'});$('<form action="'+f+'" method="'+(h||"post")+'">'+e+"</form>").appendTo("body").submit().remove();d.info("Your download will begin soon.")}},importIntoHistory:function(){this.refreshUserHistoriesList(function(e){var f=e.templateBulkImportInModal();e.modal=Galaxy.modal;e.modal.show({closing_events:true,title:"Import into History",body:f({histories:e.histories.models}),buttons:{Import:function(){e.importCurrentIntoHistory()},Close:function(){Galaxy.modal.hide()}}})})},refreshUserHistoriesList:function(f){var e=this;this.histories=new c.GalaxyHistories();this.histories.fetch({success:function(g){if(g.length===0){d.warning("You have to create history first. Click this to do so.","",{onclick:function(){window.location="/"}})}else{f(e)}},error:function(h,g){if(typeof g.responseJSON!=="undefined"){d.error(g.responseJSON.err_msg)}else{d.error("An error ocurred.")}}})},importCurrentIntoHistory:function(){var e=$(this.modal.elMain).find("select[name=dataset_import_single] option:selected").val();var f=new c.HistoryItem();f.url=f.urlRoot+e+"/contents";jQuery.getJSON(galaxy_config.root+"history/set_as_current?id="+e);f.save({content:this.id,source:"library"},{success:function(){Galaxy.modal.hide();d.success("Dataset imported. Click this to start analysing it.","",{onclick:function(){window.location="/"}})},error:function(h,g){if(typeof g.responseJSON!=="undefined"){d.error("Dataset not imported. "+g.responseJSON.err_msg)}else{d.error("An error occured. Dataset not imported. Please try again.")}}})},shareDataset:function(){d.info("Feature coming soon.")},goBack:function(){Galaxy.libraries.library_router.back()},showPermissions:function(f){this.options=_.extend(this.options,f);$(".tooltip").remove();if(this.options.fetched_permissions!==undefined){if(this.options.fetched_permissions.access_dataset_roles.length===0){this.model.set({is_unrestricted:true})}else{this.model.set({is_unrestricted:false})}}var h=false;if(Galaxy.currUser){h=Galaxy.currUser.isAdmin()}var g=this.templateDatasetPermissions();this.$el.html(g({item:this.model,is_admin:h}));var e=this;if(this.options.fetched_permissions===undefined){$.get((window.galaxy_config?galaxy_config.root:"/")+"api/libraries/datasets/"+e.id+"/permissions?scope=current").done(function(i){e.prepareSelectBoxes({fetched_permissions:i,is_admin:h})}).fail(function(){d.error("An error occurred while attempting to fetch dataset permissions.")})}else{this.prepareSelectBoxes({is_admin:h})}$("#center [data-toggle]").tooltip();$("#center").css("overflow","auto")},prepareSelectBoxes:function(r){this.options=_.extend(this.options,r);var s=this.options.fetched_permissions;var k=this.options.is_admin;var q=this;var m=[];for(var h=0;h<s.access_dataset_roles.length;h++){m.push(s.access_dataset_roles[h]+":"+s.access_dataset_roles[h])}var f=[];for(var h=0;h<s.modify_item_roles.length;h++){f.push(s.modify_item_roles[h]+":"+s.modify_item_roles[h])}var g=[];for(var h=0;h<s.manage_dataset_roles.length;h++){g.push(s.manage_dataset_roles[h]+":"+s.manage_dataset_roles[h])}if(k){var o={minimumInputLength:0,css:"access_perm",multiple:true,placeholder:"Click to select a role",container:q.$el.find("#access_perm"),ajax:{url:(window.galaxy_config?galaxy_config.root:"/")+"api/libraries/datasets/"+q.id+"/permissions?scope=available",dataType:"json",quietMillis:100,data:function(i,t){return{q:i,page_limit:10,page:t}},results:function(u,t){var i=(t*10)<u.total;return{results:u.roles,more:i}}},formatResult:function j(i){return i.name+" type: "+i.type},formatSelection:function e(i){return i.name},initSelection:function(i,u){var t=[];$(i.val().split(",")).each(function(){var v=this.split(":");t.push({id:v[1],name:v[1]})});u(t)},initialData:m.join(","),dropdownCssClass:"bigdrop"};var l={minimumInputLength:0,css:"modify_perm",multiple:true,placeholder:"Click to select a role",container:q.$el.find("#modify_perm"),ajax:{url:(window.galaxy_config?galaxy_config.root:"/")+"api/libraries/datasets/"+q.id+"/permissions?scope=available",dataType:"json",quietMillis:100,data:function(i,t){return{q:i,page_limit:10,page:t}},results:function(u,t){var i=(t*10)<u.total;return{results:u.roles,more:i}}},formatResult:function j(i){return i.name+" type: "+i.type},formatSelection:function e(i){return i.name},initSelection:function(i,u){var t=[];$(i.val().split(",")).each(function(){var v=this.split(":");t.push({id:v[1],name:v[1]})});u(t)},initialData:f.join(","),dropdownCssClass:"bigdrop"};var p={minimumInputLength:0,css:"manage_perm",multiple:true,placeholder:"Click to select a role",container:q.$el.find("#manage_perm"),ajax:{url:(window.galaxy_config?galaxy_config.root:"/")+"api/libraries/datasets/"+q.id+"/permissions?scope=available",dataType:"json",quietMillis:100,data:function(i,t){return{q:i,page_limit:10,page:t}},results:function(u,t){var i=(t*10)<u.total;return{results:u.roles,more:i}}},formatResult:function j(i){return i.name+" type: "+i.type},formatSelection:function e(i){return i.name},initSelection:function(i,u){var t=[];$(i.val().split(",")).each(function(){var v=this.split(":");t.push({id:v[1],name:v[1]})});u(t)},initialData:g.join(","),dropdownCssClass:"bigdrop"};q.accessSelectObject=new b.View(o);q.modifySelectObject=new b.View(l);q.manageSelectObject=new b.View(p)}else{var n=q.templateAccessSelect();$.get((window.galaxy_config?galaxy_config.root:"/")+"api/libraries/datasets/"+q.id+"/permissions?scope=available",function(i){$(".access_perm").html(n({options:i.roles}));q.accessSelectObject=$("#access_select").select2()}).fail(function(){d.error("An error occurred while attempting to fetch dataset permissions.")})}},comingSoon:function(){d.warning("Feature coming soon.")},copyToClipboard:function(){var e=Backbone.history.location.href;if(e.lastIndexOf("/permissions")!==-1){e=e.substr(0,e.lastIndexOf("/permissions"))}window.prompt("Copy to clipboard: Ctrl+C, Enter",e)},makeDatasetPrivate:function(){var e=this;$.post((window.galaxy_config?galaxy_config.root:"/")+"api/libraries/datasets/"+e.id+"/permissions?action=make_private").done(function(f){e.model.set({is_unrestricted:false});e.showPermissions({fetched_permissions:f});d.success("The dataset is now private to you.")}).fail(function(){d.error("An error occurred while attempting to make dataset private.")})},removeDatasetRestrictions:function(){var e=this;$.post((window.galaxy_config?galaxy_config.root:"/")+"api/libraries/datasets/"+e.id+"/permissions?action=remove_restrictions").done(function(f){e.model.set({is_unrestricted:true});e.showPermissions({fetched_permissions:f});d.success("Access to this dataset is now unrestricted.")}).fail(function(){d.error("An error occurred while attempting to make dataset unrestricted.")})},savePermissions:function(e){var n=this;var k=this.accessSelectObject.$el.select2("data");var f=this.manageSelectObject.$el.select2("data");var m=this.modifySelectObject.$el.select2("data");var g=[];var j=[];var l=[];for(var h=k.length-1;h>=0;h--){g.push(k[h].id)}for(var h=f.length-1;h>=0;h--){j.push(f[h].id)}for(var h=m.length-1;h>=0;h--){l.push(m[h].id)}$.post((window.galaxy_config?galaxy_config.root:"/")+"api/libraries/datasets/"+n.id+"/permissions?action=set_permissions",{"access_ids[]":g,"manage_ids[]":j,"modify_ids[]":l,}).done(function(i){n.showPermissions({fetched_permissions:i});d.success("Permissions saved.")}).fail(function(){d.error("An error occurred while attempting to set dataset permissions.")})},templateDataset:function(){var e=[];e.push('<div class="library_style_container">');e.push(' <div id="library_toolbar">');e.push(' <button data-toggle="tooltip" data-placement="top" title="Download dataset" class="btn btn-default toolbtn-download-dataset primary-button" type="button"><span class="fa fa-download"></span> Download</span></button>');e.push(' <button data-toggle="tooltip" data-placement="top" title="Import dataset into history" class="btn btn-default toolbtn-import-dataset primary-button" type="button"><span class="fa fa-book"></span> to History</span></button>');e.push(' <% if (item.get("can_user_modify")) { %>');e.push(' <button data-toggle="tooltip" data-placement="top" title="Modify library item" class="btn btn-default toolbtn_modify_dataset primary-button" type="button"><span class="fa fa-pencil"></span> Modify</span></button>');e.push(" <% } %>");e.push(' <% if (item.get("can_user_manage")) { %>');e.push(' <a href="#folders/<%- item.get("folder_id") %>/datasets/<%- item.id %>/permissions"><button data-toggle="tooltip" data-placement="top" title="Manage permissions" class="btn btn-default toolbtn_change_permissions primary-button" type="button"><span class="fa fa-group"></span> Permissions</span></button></a>');e.push(" <% } %>");e.push(" </div>");e.push('<ol class="breadcrumb">');e.push(' <li><a title="Return to the list of libraries" href="#">Libraries</a></li>');e.push(' <% _.each(item.get("full_path"), function(path_item) { %>');e.push(" <% if (path_item[0] != item.id) { %>");e.push(' <li><a title="Return to this folder" href="#/folders/<%- path_item[0] %>"><%- path_item[1] %></a></li> ');e.push("<% } else { %>");e.push(' <li class="active"><span title="You are here"><%- path_item[1] %></span></li>');e.push(" <% } %>");e.push(" <% }); %>");e.push("</ol>");e.push('<% if (item.get("is_unrestricted")) { %>');e.push(' <div class="alert alert-info">');e.push(" This dataset is unrestricted so everybody can access it. Just share the URL of this page. ");e.push(' <button data-toggle="tooltip" data-placement="top" title="Copy to clipboard" class="btn btn-default btn-copy-link-to-clipboard primary-button" type="button"><span class="fa fa-clipboard"></span> To Clipboard</span></button> ');e.push(" </div>");e.push("<% } %>");e.push('<div class="dataset_table">');e.push(' <table class="grid table table-striped table-condensed">');e.push(" <tr>");e.push(' <th scope="row" id="id_row" data-id="<%= _.escape(item.get("ldda_id")) %>">Name</th>');e.push(' <td><%= _.escape(item.get("name")) %></td>');e.push(" </tr>");e.push(' <% if (item.get("file_ext")) { %>');e.push(" <tr>");e.push(' <th scope="row">Data type</th>');e.push(' <td><%= _.escape(item.get("file_ext")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(' <% if (item.get("genome_build")) { %>');e.push(" <tr>");e.push(' <th scope="row">Genome build</th>');e.push(' <td><%= _.escape(item.get("genome_build")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(' <% if (item.get("file_size")) { %>');e.push(" <tr>");e.push(' <th scope="row">Size</th>');e.push(' <td><%= _.escape(item.get("file_size")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(' <% if (item.get("date_uploaded")) { %>');e.push(" <tr>");e.push(' <th scope="row">Date uploaded (UTC)</th>');e.push(' <td><%= _.escape(item.get("date_uploaded")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(' <% if (item.get("uploaded_by")) { %>');e.push(" <tr>");e.push(' <th scope="row">Uploaded by</th>');e.push(' <td><%= _.escape(item.get("uploaded_by")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(' <% if (item.get("metadata_data_lines")) { %>');e.push(" <tr>");e.push(' <th scope="row">Data Lines</th>');e.push(' <td scope="row"><%= _.escape(item.get("metadata_data_lines")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(' <% if (item.get("metadata_comment_lines")) { %>');e.push(" <tr>");e.push(' <th scope="row">Comment Lines</th>');e.push(' <td scope="row"><%= _.escape(item.get("metadata_comment_lines")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(' <% if (item.get("metadata_columns")) { %>');e.push(" <tr>");e.push(' <th scope="row">Number of Columns</th>');e.push(' <td scope="row"><%= _.escape(item.get("metadata_columns")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(' <% if (item.get("metadata_column_types")) { %>');e.push(" <tr>");e.push(' <th scope="row">Column Types</th>');e.push(' <td scope="row"><%= _.escape(item.get("metadata_column_types")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(' <% if (item.get("message")) { %>');e.push(" <tr>");e.push(' <th scope="row">Message</th>');e.push(' <td scope="row"><%= _.escape(item.get("message")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(' <% if (item.get("misc_blurb")) { %>');e.push(" <tr>");e.push(' <th scope="row">Miscellaneous blurb</th>');e.push(' <td scope="row"><%= _.escape(item.get("misc_blurb")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(' <% if (item.get("misc_info")) { %>');e.push(" <tr>");e.push(' <th scope="row">Miscellaneous information</th>');e.push(' <td scope="row"><%= _.escape(item.get("misc_info")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(" </table>");e.push(" <div>");e.push(' <pre class="peek">');e.push(" </pre>");e.push(" </div>");e.push(' <% if (item.get("has_versions")) { %>');e.push(" <div>");e.push(" <h3>Expired versions:</h3>");e.push(" <ul>");e.push(' <% _.each(item.get("expired_versions"), function(version) { %>');e.push(' <li><a title="See details of this version" href="#folders/<%- item.get("folder_id") %>/datasets/<%- item.id %>/versions/<%- version[0] %>"><%- version[1] %></a></li>');e.push(" <% }) %>");e.push(" <ul>");e.push(" </div>");e.push(" <% } %>");e.push("</div>");e.push("</div>");return _.template(e.join(""))},templateVersion:function(){var e=[];e.push('<div class="library_style_container">');e.push(' <div id="library_toolbar">');e.push(' <a href="#folders/<%- item.get("folder_id") %>/datasets/<%- item.id %>"><button data-toggle="tooltip" data-placement="top" title="Go to latest dataset" class="btn btn-default primary-button" type="button"><span class="fa fa-caret-left fa-lg"></span> Latest dataset</span></button><a>');e.push(" </div>");e.push('<ol class="breadcrumb">');e.push(' <li><a title="Return to the list of libraries" href="#">Libraries</a></li>');e.push(' <% _.each(item.get("full_path"), function(path_item) { %>');e.push(" <% if (path_item[0] != item.id) { %>");e.push(' <li><a title="Return to this folder" href="#/folders/<%- path_item[0] %>"><%- path_item[1] %></a></li> ');e.push("<% } else { %>");e.push(' <li class="active"><span title="You are here"><%- path_item[1] %></span></li>');e.push(" <% } %>");e.push(" <% }); %>");e.push("</ol>");e.push(' <div class="alert alert-warning">This is an expired version of the library dataset: <%= _.escape(item.get("name")) %></div>');e.push('<div class="dataset_table">');e.push(' <table class="grid table table-striped table-condensed">');e.push(" <tr>");e.push(' <th scope="row" id="id_row" data-id="<%= _.escape(ldda.id) %>">Name</th>');e.push(' <td><%= _.escape(ldda.get("name")) %></td>');e.push(" </tr>");e.push(' <% if (ldda.get("file_ext")) { %>');e.push(" <tr>");e.push(' <th scope="row">Data type</th>');e.push(' <td><%= _.escape(ldda.get("file_ext")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(' <% if (ldda.get("genome_build")) { %>');e.push(" <tr>");e.push(' <th scope="row">Genome build</th>');e.push(' <td><%= _.escape(ldda.get("genome_build")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(' <% if (ldda.get("file_size")) { %>');e.push(" <tr>");e.push(' <th scope="row">Size</th>');e.push(' <td><%= _.escape(ldda.get("file_size")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(' <% if (ldda.get("date_uploaded")) { %>');e.push(" <tr>");e.push(' <th scope="row">Date uploaded (UTC)</th>');e.push(' <td><%= _.escape(ldda.get("date_uploaded")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(' <% if (ldda.get("uploaded_by")) { %>');e.push(" <tr>");e.push(' <th scope="row">Uploaded by</th>');e.push(' <td><%= _.escape(ldda.get("uploaded_by")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(' <% if (ldda.get("metadata_data_lines")) { %>');e.push(" <tr>");e.push(' <th scope="row">Data Lines</th>');e.push(' <td scope="row"><%= _.escape(ldda.get("metadata_data_lines")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(' <% if (ldda.get("metadata_comment_lines")) { %>');e.push(" <tr>");e.push(' <th scope="row">Comment Lines</th>');e.push(' <td scope="row"><%= _.escape(ldda.get("metadata_comment_lines")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(' <% if (ldda.get("metadata_columns")) { %>');e.push(" <tr>");e.push(' <th scope="row">Number of Columns</th>');e.push(' <td scope="row"><%= _.escape(ldda.get("metadata_columns")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(' <% if (ldda.get("metadata_column_types")) { %>');e.push(" <tr>");e.push(' <th scope="row">Column Types</th>');e.push(' <td scope="row"><%= _.escape(ldda.get("metadata_column_types")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(' <% if (ldda.get("message")) { %>');e.push(" <tr>");e.push(' <th scope="row">Message</th>');e.push(' <td scope="row"><%= _.escape(ldda.get("message")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(' <% if (ldda.get("misc_blurb")) { %>');e.push(" <tr>");e.push(' <th scope="row">Miscellaneous blurb</th>');e.push(' <td scope="row"><%= _.escape(ldda.get("misc_blurb")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(' <% if (ldda.get("misc_info")) { %>');e.push(" <tr>");e.push(' <th scope="row">Miscellaneous information</th>');e.push(' <td scope="row"><%= _.escape(ldda.get("misc_info")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(" </table>");e.push(" <div>");e.push(' <pre class="peek">');e.push(" </pre>");e.push(" </div>");e.push("</div>");e.push("</div>");return _.template(e.join(""))},templateModifyDataset:function(){var e=[];e.push('<div class="library_style_container">');e.push(' <div id="library_toolbar">');e.push(' <button data-toggle="tooltip" data-placement="top" title="Cancel modifications" class="btn btn-default toolbtn_cancel_modifications primary-button" type="button"><span class="fa fa-times"></span> Cancel</span></button>');e.push(' <button data-toggle="tooltip" data-placement="top" title="Save modifications" class="btn btn-default toolbtn_save_modifications primary-button" type="button"><span class="fa fa-floppy-o"></span> Save</span></button>');e.push(" </div>");e.push('<ol class="breadcrumb">');e.push(' <li><a title="Return to the list of libraries" href="#">Libraries</a></li>');e.push(' <% _.each(item.get("full_path"), function(path_item) { %>');e.push(" <% if (path_item[0] != item.id) { %>");e.push(' <li><a title="Return to this folder" href="#/folders/<%- path_item[0] %>"><%- path_item[1] %></a></li> ');e.push("<% } else { %>");e.push(' <li class="active"><span title="You are here"><%- path_item[1] %></span></li>');e.push(" <% } %>");e.push(" <% }); %>");e.push("</ol>");e.push('<div class="dataset_table">');e.push('<p>For more editing options please import the dataset to history and use "Edit attributes" on it.</p>');e.push(' <table class="grid table table-striped table-condensed">');e.push(" <tr>");e.push(' <th scope="row" id="id_row" data-id="<%= _.escape(item.get("ldda_id")) %>">Name</th>');e.push(' <td><input class="input_dataset_name form-control" type="text" placeholder="name" value="<%= _.escape(item.get("name")) %>"></td>');e.push(" </tr>");e.push(" <tr>");e.push(' <th scope="row">Data type</th>');e.push(' <td><%= _.escape(item.get("file_ext")) %></td>');e.push(" </tr>");e.push(" <tr>");e.push(' <th scope="row">Genome build</th>');e.push(' <td><%= _.escape(item.get("genome_build")) %></td>');e.push(" </tr>");e.push(" <tr>");e.push(' <th scope="row">Size</th>');e.push(' <td><%= _.escape(item.get("file_size")) %></td>');e.push(" </tr>");e.push(" <tr>");e.push(' <th scope="row">Date uploaded (UTC)</th>');e.push(' <td><%= _.escape(item.get("date_uploaded")) %></td>');e.push(" </tr>");e.push(" <tr>");e.push(' <th scope="row">Uploaded by</th>');e.push(' <td><%= _.escape(item.get("uploaded_by")) %></td>');e.push(" </tr>");e.push(' <tr scope="row">');e.push(' <th scope="row">Data Lines</th>');e.push(' <td scope="row"><%= _.escape(item.get("metadata_data_lines")) %></td>');e.push(" </tr>");e.push(' <th scope="row">Comment Lines</th>');e.push(' <% if (item.get("metadata_comment_lines") === "") { %>');e.push(' <td scope="row"><%= _.escape(item.get("metadata_comment_lines")) %></td>');e.push(" <% } else { %>");e.push(' <td scope="row">unknown</td>');e.push(" <% } %>");e.push(" </tr>");e.push(" <tr>");e.push(' <th scope="row">Number of Columns</th>');e.push(' <td scope="row"><%= _.escape(item.get("metadata_columns")) %></td>');e.push(" </tr>");e.push(" <tr>");e.push(' <th scope="row">Column Types</th>');e.push(' <td scope="row"><%= _.escape(item.get("metadata_column_types")) %></td>');e.push(" </tr>");e.push(" <tr>");e.push(' <th scope="row">Message</th>');e.push(' <td scope="row"><%= _.escape(item.get("message")) %></td>');e.push(" </tr>");e.push(" <tr>");e.push(' <th scope="row">Miscellaneous information</th>');e.push(' <td scope="row"><%= _.escape(item.get("misc_info")) %></td>');e.push(" </tr>");e.push(" <tr>");e.push(' <th scope="row">Miscellaneous blurb</th>');e.push(' <td scope="row"><%= _.escape(item.get("misc_blurb")) %></td>');e.push(" </tr>");e.push(" </table>");e.push("<div>");e.push(' <pre class="peek">');e.push(" </pre>");e.push("</div>");e.push("</div>");e.push("</div>");return _.template(e.join(""))},templateDatasetPermissions:function(){var e=[];e.push('<div class="library_style_container">');e.push(' <div id="library_toolbar">');e.push(' <a href="#folders/<%- item.get("folder_id") %>"><button data-toggle="tooltip" data-placement="top" title="Go back to containing folder" class="btn btn-default primary-button" type="button"><span class="fa fa-folder-open-o"></span> Containing Folder</span></button></a>');e.push(' <a href="#folders/<%- item.get("folder_id") %>/datasets/<%- item.id %>"><button data-toggle="tooltip" data-placement="top" title="Go back to dataset" class="btn btn-default primary-button" type="button"><span class="fa fa-file-o"></span> Dataset Details</span></button><a>');e.push(" </div>");e.push('<ol class="breadcrumb">');e.push(' <li><a title="Return to the list of libraries" href="#">Libraries</a></li>');e.push(' <% _.each(item.get("full_path"), function(path_item) { %>');e.push(" <% if (path_item[0] != item.id) { %>");e.push(' <li><a title="Return to this folder" href="#/folders/<%- path_item[0] %>"><%- path_item[1] %></a></li> ');e.push("<% } else { %>");e.push(' <li class="active"><span title="You are here"><%- path_item[1] %></span></li>');e.push(" <% } %>");e.push(" <% }); %>");e.push("</ol>");e.push('<h1>Dataset: <%= _.escape(item.get("name")) %></h1>');e.push('<div class="alert alert-warning">');e.push("<% if (is_admin) { %>");e.push("You are logged in as an <strong>administrator</strong> therefore you can manage any dataset on this Galaxy instance. Please make sure you understand the consequences.");e.push("<% } else { %>");e.push("You can assign any number of roles to any of the following permission types. However please read carefully the implications of such actions.");e.push("<% } %>");e.push("</div>");e.push('<div class="dataset_table">');e.push("<h2>Library-related permissions</h2>");e.push("<h4>Roles that can modify the library item</h4>");e.push('<div id="modify_perm" class="modify_perm roles-selection"></div>');e.push('<div class="alert alert-info roles-selection">User with <strong>any</strong> of these roles can modify name, metadata, and other information about this library item.</div>');e.push("<hr/>");e.push("<h2>Dataset-related permissions</h2>");e.push('<div class="alert alert-warning">Changes made below will affect <strong>every</strong> library item that was created from this dataset and also every history this dataset is part of.</div>');e.push('<% if (!item.get("is_unrestricted")) { %>');e.push(" <p>You can remove all access restrictions on this dataset. ");e.push(' <button data-toggle="tooltip" data-placement="top" title="Everybody will be able to access the dataset." class="btn btn-default btn-remove-restrictions primary-button" type="button">');e.push(' <span class="fa fa-globe"> Remove restrictions</span>');e.push(" </button>");e.push(" </p>");e.push("<% } else { %>");e.push(" This dataset is unrestricted so everybody can access it. Just share the URL of this page.");e.push(' <button data-toggle="tooltip" data-placement="top" title="Copy to clipboard" class="btn btn-default btn-copy-link-to-clipboard primary-button" type="button"><span class="fa fa-clipboard"> To Clipboard</span></button> ');e.push(" <p>You can make this dataset private to you. ");e.push(' <button data-toggle="tooltip" data-placement="top" title="Only you will be able to access the dataset." class="btn btn-default btn-make-private primary-button" type="button"><span class="fa fa-key"> Make Private</span></button>');e.push(" </p>");e.push("<% } %>");e.push("<h4>Roles that can access the dataset</h4>");e.push('<div id="access_perm" class="access_perm roles-selection"></div>');e.push('<div class="alert alert-info roles-selection">User has to have <strong>all these roles</strong> in order to access this dataset. Users without access permission <strong>cannot</strong> have other permissions on this dataset. If there are no access roles set on the dataset it is considered <strong>unrestricted</strong>.</div>');e.push("<h4>Roles that can manage permissions on the dataset</h4>");e.push('<div id="manage_perm" class="manage_perm roles-selection"></div>');e.push('<div class="alert alert-info roles-selection">User with <strong>any</strong> of these roles can manage permissions of this dataset. If you remove yourself you will loose the ability manage this dataset unless you are an admin.</div>');e.push('<button data-toggle="tooltip" data-placement="top" title="Save modifications made on this page" class="btn btn-default toolbtn_save_permissions primary-button" type="button"><span class="fa fa-floppy-o"></span> Save</span></button>');e.push("</div>");e.push("</div>");return _.template(e.join(""))},templateBulkImportInModal:function(){var e=[];e.push('<span id="history_modal_combo_bulk" style="width:90%; margin-left: 1em; margin-right: 1em; ">');e.push("Select history: ");e.push('<select id="dataset_import_single" name="dataset_import_single" style="width:50%; margin-bottom: 1em; "> ');e.push(" <% _.each(histories, function(history) { %>");e.push(' <option value="<%= _.escape(history.get("id")) %>"><%= _.escape(history.get("name")) %></option>');e.push(" <% }); %>");e.push("</select>");e.push("</span>");return _.template(e.join(""))},templateAccessSelect:function(){var e=[];e.push('<select id="access_select" multiple>');e.push(" <% _.each(options, function(option) { %>");e.push(' <option value="<%- option.name %>"><%- option.name %></option>');e.push(" <% }); %>");e.push("</select>");return _.template(e.join(""))}});return{LibraryDatasetView:a}});
\ No newline at end of file
diff -r 6395e70351435911f7ab75863c1b48b54e20a919 -r 0aa4dd8af7cf8303ef9dd9af95c2e2676854ecca static/scripts/packed/mvc/library/library-folder-view.js
--- a/static/scripts/packed/mvc/library/library-folder-view.js
+++ b/static/scripts/packed/mvc/library/library-folder-view.js
@@ -1,1 +1,1 @@
-define(["libs/toastr","mvc/library/library-model","mvc/ui/ui-select"],function(d,c,a){var b=Backbone.View.extend({el:"#center",model:null,options:{},events:{"click .toolbtn_save_permissions":"savePermissions"},initialize:function(e){this.options=_.extend(this.options,e);if(this.options.id){this.fetchFolder()}},fetchFolder:function(e){this.options=_.extend(this.options,e);this.model=new c.FolderAsModel({id:this.options.id});var f=this;this.model.fetch({success:function(){if(f.options.show_permissions){f.showPermissions()}else{f.render()}},error:function(h,g){if(typeof g.responseJSON!=="undefined"){d.error(g.responseJSON.err_msg+" Click this to go back.","",{onclick:function(){Galaxy.libraries.library_router.back()}})}else{d.error("An error ocurred. Click this to go back.","",{onclick:function(){Galaxy.libraries.library_router.back()}})}}})},render:function(e){$(".tooltip").remove();this.options=_.extend(this.options,e);var f=this.templateFolder();this.$el.html(f({item:this.model}));$(".peek").html(this.model.get("peek"));$("#center [data-toggle]").tooltip()},shareFolder:function(){d.info("Feature coming soon.")},goBack:function(){Galaxy.libraries.library_router.back()},showPermissions:function(f){this.options=_.extend(this.options,f);$(".tooltip").remove();var h=false;if(Galaxy.currUser){h=Galaxy.currUser.isAdmin()}var g=this.templateFolderPermissions();this.$el.html(g({folder:this.model,is_admin:h}));var e=this;if(this.options.fetched_permissions===undefined){$.get("/api/folders/"+e.id+"/permissions?scope=current").done(function(i){e.prepareSelectBoxes({fetched_permissions:i})}).fail(function(){d.error("An error occurred while attempting to fetch folder permissions.")})}else{this.prepareSelectBoxes({})}$("#center [data-toggle]").tooltip();$("#center").css("overflow","auto")},_serializeRoles:function(g){var e=[];for(var f=0;f<g.length;f++){e.push(g[f]+":"+g[f])}return e},prepareSelectBoxes:function(h){this.options=_.extend(this.options,h);var f=this.options.fetched_permissions;var g=this;var i=this._serializeRoles(f.add_library_item_role_list);var j=this._serializeRoles(f.manage_folder_role_list);var e=this._serializeRoles(f.modify_folder_role_list);g.addSelectObject=new a.View(this._createSelectOptions(this,"add_perm",i,false));g.manageSelectObject=new a.View(this._createSelectOptions(this,"manage_perm",j,false));g.modifySelectObject=new a.View(this._createSelectOptions(this,"modify_perm",e,false))},_createSelectOptions:function(e,j,h){var i={minimumInputLength:0,css:j,multiple:true,placeholder:"Click to select a role",container:e.$el.find("#"+j),ajax:{url:"/api/folders/"+e.id+"/permissions?scope=available",dataType:"json",quietMillis:100,data:function(k,l){return{q:k,page_limit:10,page:l}},results:function(m,l){var k=(l*10)<m.total;return{results:m.roles,more:k}}},formatResult:function f(k){return k.name+" type: "+k.type},formatSelection:function g(k){return k.name},initSelection:function(k,m){var l=[];$(k.val().split(",")).each(function(){var n=this.split(":");l.push({id:n[1],name:n[1]})});m(l)},initialData:h.join(","),dropdownCssClass:"bigdrop"};return i},comingSoon:function(){d.warning("Feature coming soon.")},copyToClipboard:function(){var e=Backbone.history.location.href;if(e.lastIndexOf("/permissions")!==-1){e=e.substr(0,e.lastIndexOf("/permissions"))}window.prompt("Copy to clipboard: Ctrl+C, Enter",e)},_extractIds:function(e){ids_list=[];for(var f=e.length-1;f>=0;f--){ids_list.push(e[f].id)}return ids_list},savePermissions:function(h){var g=this;var e=this._extractIds(this.addSelectObject.$el.select2("data"));var i=this._extractIds(this.manageSelectObject.$el.select2("data"));var f=this._extractIds(this.modifySelectObject.$el.select2("data"));$.post("/api/folders/"+g.id+"/permissions?action=set_permissions",{"add_ids[]":e,"manage_ids[]":i,"modify_ids[]":f,}).done(function(j){g.showPermissions({fetched_permissions:j});d.success("Permissions saved.")}).fail(function(){d.error("An error occurred while attempting to set folder permissions.")})},templateFolder:function(){var e=[];e.push('<div class="library_style_container">');e.push(' <div id="library_toolbar">');e.push(' <button data-toggle="tooltip" data-placement="top" title="Modify library item" class="btn btn-default toolbtn_modify_dataset primary-button" type="button"><span class="fa fa-pencil"></span> Modify</span></button>');e.push(' <a href="#folders/<%- item.get("folder_id") %>/datasets/<%- item.id %>/permissions"><button data-toggle="tooltip" data-placement="top" title="Manage permissions" class="btn btn-default toolbtn_change_permissions primary-button" type="button"><span class="fa fa-group"></span> Permissions</span></button></a>');e.push(' <button data-toggle="tooltip" data-placement="top" title="Share dataset" class="btn btn-default toolbtn-share-dataset primary-button" type="button"><span class="fa fa-share"></span> Share</span></button>');e.push(" </div>");e.push(" <p>");e.push(" This dataset is unrestricted so everybody can access it. Just share the URL of this page. ");e.push(' <button data-toggle="tooltip" data-placement="top" title="Copy to clipboard" class="btn btn-default btn-copy-link-to-clipboard primary-button" type="button"><span class="fa fa-clipboard"></span> To Clipboard</span></button> ');e.push(" </p>");e.push('<div class="dataset_table">');e.push(' <table class="grid table table-striped table-condensed">');e.push(" <tr>");e.push(' <th scope="row" id="id_row" data-id="<%= _.escape(item.get("ldda_id")) %>">Name</th>');e.push(' <td><%= _.escape(item.get("name")) %></td>');e.push(" </tr>");e.push(' <% if (item.get("file_ext")) { %>');e.push(" <tr>");e.push(' <th scope="row">Data type</th>');e.push(' <td><%= _.escape(item.get("file_ext")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(" </table>");e.push("</div>");e.push("</div>");return _.template(e.join(""))},templateFolderPermissions:function(){var e=[];e.push('<div class="library_style_container">');e.push(' <div id="library_toolbar">');e.push(' <a href="#/folders/<%= folder.get("parent_id") %>"><button data-toggle="tooltip" data-placement="top" title="Go back to the parent folder" class="btn btn-default primary-button" type="button"><span class="fa fa-caret-left fa-lg"></span> Parent folder</span></button></a>');e.push(" </div>");e.push('<h1>Folder: <%= _.escape(folder.get("name")) %></h1>');e.push('<div class="alert alert-warning">');e.push("<% if (is_admin) { %>");e.push("You are logged in as an <strong>administrator</strong> therefore you can manage any folder on this Galaxy instance. Please make sure you understand the consequences.");e.push("<% } else { %>");e.push("You can assign any number of roles to any of the following permission types. However please read carefully the implications of such actions.");e.push("<% }%>");e.push("</div>");e.push('<div class="dataset_table">');e.push("<h2>Folder permissions</h2>");e.push("<h4>Roles that can manage permissions on this folder</h4>");e.push('<div id="manage_perm" class="manage_perm roles-selection"></div>');e.push('<div class="alert alert-info roles-selection">User with <strong>any</strong> of these roles can manage permissions on this folder.</div>');e.push("<h4>Roles that can add items to this folder</h4>");e.push('<div id="add_perm" class="add_perm roles-selection"></div>');e.push('<div class="alert alert-info roles-selection">User with <strong>any</strong> of these roles can add items to this folder (folders and datasets).</div>');e.push("<h4>Roles that can modify this folder</h4>");e.push('<div id="modify_perm" class="modify_perm roles-selection"></div>');e.push('<div class="alert alert-info roles-selection">User with <strong>any</strong> of these roles can modify this folder (name, etc.).</div>');e.push('<button data-toggle="tooltip" data-placement="top" title="Save modifications" class="btn btn-default toolbtn_save_permissions primary-button" type="button"><span class="fa fa-floppy-o"></span> Save</span></button>');e.push("</div>");e.push("</div>");return _.template(e.join(""))}});return{FolderView:b}});
\ No newline at end of file
+define(["libs/toastr","mvc/library/library-model","mvc/ui/ui-select"],function(d,c,a){var b=Backbone.View.extend({el:"#center",model:null,options:{},events:{"click .toolbtn_save_permissions":"savePermissions"},initialize:function(e){this.options=_.extend(this.options,e);if(this.options.id){this.fetchFolder()}},fetchFolder:function(e){this.options=_.extend(this.options,e);this.model=new c.FolderAsModel({id:this.options.id});var f=this;this.model.fetch({success:function(){if(f.options.show_permissions){f.showPermissions()}else{f.render()}},error:function(h,g){if(typeof g.responseJSON!=="undefined"){d.error(g.responseJSON.err_msg+" Click this to go back.","",{onclick:function(){Galaxy.libraries.library_router.back()}})}else{d.error("An error ocurred. Click this to go back.","",{onclick:function(){Galaxy.libraries.library_router.back()}})}}})},render:function(e){$(".tooltip").remove();this.options=_.extend(this.options,e);var f=this.templateFolder();this.$el.html(f({item:this.model}));$(".peek").html(this.model.get("peek"));$("#center [data-toggle]").tooltip()},shareFolder:function(){d.info("Feature coming soon.")},goBack:function(){Galaxy.libraries.library_router.back()},showPermissions:function(f){this.options=_.extend(this.options,f);$(".tooltip").remove();var h=false;if(Galaxy.currUser){h=Galaxy.currUser.isAdmin()}var g=this.templateFolderPermissions();this.$el.html(g({folder:this.model,is_admin:h}));var e=this;if(this.options.fetched_permissions===undefined){$.get((window.galaxy_config?galaxy_config.root:"/")+"api/folders/"+e.id+"/permissions?scope=current").done(function(i){e.prepareSelectBoxes({fetched_permissions:i})}).fail(function(){d.error("An error occurred while attempting to fetch folder permissions.")})}else{this.prepareSelectBoxes({})}$("#center [data-toggle]").tooltip();$("#center").css("overflow","auto")},_serializeRoles:function(g){var e=[];for(var f=0;f<g.length;f++){e.push(g[f]+":"+g[f])}return e},prepareSelectBoxes:function(h){this.options=_.extend(this.options,h);var f=this.options.fetched_permissions;var g=this;var i=this._serializeRoles(f.add_library_item_role_list);var j=this._serializeRoles(f.manage_folder_role_list);var e=this._serializeRoles(f.modify_folder_role_list);g.addSelectObject=new a.View(this._createSelectOptions(this,"add_perm",i,false));g.manageSelectObject=new a.View(this._createSelectOptions(this,"manage_perm",j,false));g.modifySelectObject=new a.View(this._createSelectOptions(this,"modify_perm",e,false))},_createSelectOptions:function(e,j,h){var i={minimumInputLength:0,css:j,multiple:true,placeholder:"Click to select a role",container:e.$el.find("#"+j),ajax:{url:(window.galaxy_config?galaxy_config.root:"/")+"api/folders/"+e.id+"/permissions?scope=available",dataType:"json",quietMillis:100,data:function(k,l){return{q:k,page_limit:10,page:l}},results:function(m,l){var k=(l*10)<m.total;return{results:m.roles,more:k}}},formatResult:function f(k){return k.name+" type: "+k.type},formatSelection:function g(k){return k.name},initSelection:function(k,m){var l=[];$(k.val().split(",")).each(function(){var n=this.split(":");l.push({id:n[1],name:n[1]})});m(l)},initialData:h.join(","),dropdownCssClass:"bigdrop"};return i},comingSoon:function(){d.warning("Feature coming soon.")},copyToClipboard:function(){var e=Backbone.history.location.href;if(e.lastIndexOf("/permissions")!==-1){e=e.substr(0,e.lastIndexOf("/permissions"))}window.prompt("Copy to clipboard: Ctrl+C, Enter",e)},_extractIds:function(e){ids_list=[];for(var f=e.length-1;f>=0;f--){ids_list.push(e[f].id)}return ids_list},savePermissions:function(h){var g=this;var e=this._extractIds(this.addSelectObject.$el.select2("data"));var i=this._extractIds(this.manageSelectObject.$el.select2("data"));var f=this._extractIds(this.modifySelectObject.$el.select2("data"));$.post((window.galaxy_config?galaxy_config.root:"/")+"api/folders/"+g.id+"/permissions?action=set_permissions",{"add_ids[]":e,"manage_ids[]":i,"modify_ids[]":f,}).done(function(j){g.showPermissions({fetched_permissions:j});d.success("Permissions saved.")}).fail(function(){d.error("An error occurred while attempting to set folder permissions.")})},templateFolder:function(){var e=[];e.push('<div class="library_style_container">');e.push(' <div id="library_toolbar">');e.push(' <button data-toggle="tooltip" data-placement="top" title="Modify library item" class="btn btn-default toolbtn_modify_dataset primary-button" type="button"><span class="fa fa-pencil"></span> Modify</span></button>');e.push(' <a href="#folders/<%- item.get("folder_id") %>/datasets/<%- item.id %>/permissions"><button data-toggle="tooltip" data-placement="top" title="Manage permissions" class="btn btn-default toolbtn_change_permissions primary-button" type="button"><span class="fa fa-group"></span> Permissions</span></button></a>');e.push(' <button data-toggle="tooltip" data-placement="top" title="Share dataset" class="btn btn-default toolbtn-share-dataset primary-button" type="button"><span class="fa fa-share"></span> Share</span></button>');e.push(" </div>");e.push(" <p>");e.push(" This dataset is unrestricted so everybody can access it. Just share the URL of this page. ");e.push(' <button data-toggle="tooltip" data-placement="top" title="Copy to clipboard" class="btn btn-default btn-copy-link-to-clipboard primary-button" type="button"><span class="fa fa-clipboard"></span> To Clipboard</span></button> ');e.push(" </p>");e.push('<div class="dataset_table">');e.push(' <table class="grid table table-striped table-condensed">');e.push(" <tr>");e.push(' <th scope="row" id="id_row" data-id="<%= _.escape(item.get("ldda_id")) %>">Name</th>');e.push(' <td><%= _.escape(item.get("name")) %></td>');e.push(" </tr>");e.push(' <% if (item.get("file_ext")) { %>');e.push(" <tr>");e.push(' <th scope="row">Data type</th>');e.push(' <td><%= _.escape(item.get("file_ext")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(" </table>");e.push("</div>");e.push("</div>");return _.template(e.join(""))},templateFolderPermissions:function(){var e=[];e.push('<div class="library_style_container">');e.push(' <div id="library_toolbar">');e.push(' <a href="#/folders/<%= folder.get("parent_id") %>"><button data-toggle="tooltip" data-placement="top" title="Go back to the parent folder" class="btn btn-default primary-button" type="button"><span class="fa fa-caret-left fa-lg"></span> Parent folder</span></button></a>');e.push(" </div>");e.push('<h1>Folder: <%= _.escape(folder.get("name")) %></h1>');e.push('<div class="alert alert-warning">');e.push("<% if (is_admin) { %>");e.push("You are logged in as an <strong>administrator</strong> therefore you can manage any folder on this Galaxy instance. Please make sure you understand the consequences.");e.push("<% } else { %>");e.push("You can assign any number of roles to any of the following permission types. However please read carefully the implications of such actions.");e.push("<% }%>");e.push("</div>");e.push('<div class="dataset_table">');e.push("<h2>Folder permissions</h2>");e.push("<h4>Roles that can manage permissions on this folder</h4>");e.push('<div id="manage_perm" class="manage_perm roles-selection"></div>');e.push('<div class="alert alert-info roles-selection">User with <strong>any</strong> of these roles can manage permissions on this folder.</div>');e.push("<h4>Roles that can add items to this folder</h4>");e.push('<div id="add_perm" class="add_perm roles-selection"></div>');e.push('<div class="alert alert-info roles-selection">User with <strong>any</strong> of these roles can add items to this folder (folders and datasets).</div>');e.push("<h4>Roles that can modify this folder</h4>");e.push('<div id="modify_perm" class="modify_perm roles-selection"></div>');e.push('<div class="alert alert-info roles-selection">User with <strong>any</strong> of these roles can modify this folder (name, etc.).</div>');e.push('<button data-toggle="tooltip" data-placement="top" title="Save modifications" class="btn btn-default toolbtn_save_permissions primary-button" type="button"><span class="fa fa-floppy-o"></span> Save</span></button>');e.push("</div>");e.push("</div>");return _.template(e.join(""))}});return{FolderView:b}});
\ No newline at end of file
This diff is so big that we needed to truncate the remainder.
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
2 new commits in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/bfd4635011e3/
Changeset: bfd4635011e3
Branch: stable
User: natefoo
Date: 2015-04-22 19:29:22+00:00
Summary: Merge release_15.03 for v15.03.2
Affected #: 60 files
diff -r 28113eeee212db2eef9cf4304abe9c3b2a92abcd -r bfd4635011e39aa210b2b1498dd65831dd2a365e client/galaxy/scripts/mvc/history/history-model.js
--- a/client/galaxy/scripts/mvc/history/history-model.js
+++ b/client/galaxy/scripts/mvc/history/history-model.js
@@ -257,7 +257,7 @@
setAsCurrent : function(){
var history = this,
- xhr = jQuery.getJSON( '/history/set_as_current?id=' + this.id );
+ xhr = jQuery.getJSON( galaxy_config.root + 'history/set_as_current?id=' + this.id );
xhr.done( function(){
history.trigger( 'set-as-current', history );
@@ -361,7 +361,7 @@
var HistoryCollection = Backbone.Collection.extend( BASE_MVC.LoggableMixin ).extend(
/** @lends HistoryCollection.prototype */{
model : History,
-
+
/** logger used to record this.log messages, commonly set to console */
//logger : console,
diff -r 28113eeee212db2eef9cf4304abe9c3b2a92abcd -r bfd4635011e39aa210b2b1498dd65831dd2a365e client/galaxy/scripts/mvc/library/library-dataset-view.js
--- a/client/galaxy/scripts/mvc/library/library-dataset-view.js
+++ b/client/galaxy/scripts/mvc/library/library-dataset-view.js
@@ -116,7 +116,7 @@
},
downloadDataset: function(){
- var url = '/api/libraries/datasets/download/uncompressed';
+ var url = ( window.galaxy_config ? galaxy_config.root : '/' ) + 'api/libraries/datasets/download/uncompressed';
var data = {'ld_ids' : this.id};
this.processDownload(url, data);
},
@@ -232,7 +232,7 @@
var self = this;
if (this.options.fetched_permissions === undefined){
- $.get( "/api/libraries/datasets/" + self.id + "/permissions?scope=current").done(function(fetched_permissions) {
+ $.get( ( window.galaxy_config ? galaxy_config.root : '/' ) + "api/libraries/datasets/" + self.id + "/permissions?scope=current").done(function(fetched_permissions) {
self.prepareSelectBoxes({fetched_permissions:fetched_permissions, is_admin:is_admin});
}).fail(function(){
mod_toastr.error('An error occurred while attempting to fetch dataset permissions.');
@@ -273,7 +273,7 @@
placeholder: 'Click to select a role',
container: self.$el.find('#access_perm'),
ajax: {
- url: "/api/libraries/datasets/" + self.id + "/permissions?scope=available",
+ url: ( window.galaxy_config ? galaxy_config.root : '/' ) + "api/libraries/datasets/" + self.id + "/permissions?scope=available",
dataType: 'json',
quietMillis: 100,
data: function (term, page) { // page is the one-based page number tracked by Select2
@@ -320,7 +320,7 @@
placeholder: 'Click to select a role',
container: self.$el.find('#modify_perm'),
ajax: {
- url: "/api/libraries/datasets/" + self.id + "/permissions?scope=available",
+ url: ( window.galaxy_config ? galaxy_config.root : '/' ) + "api/libraries/datasets/" + self.id + "/permissions?scope=available",
dataType: 'json',
quietMillis: 100,
data: function (term, page) { // page is the one-based page number tracked by Select2
@@ -367,7 +367,7 @@
placeholder: 'Click to select a role',
container: self.$el.find('#manage_perm'),
ajax: {
- url: "/api/libraries/datasets/" + self.id + "/permissions?scope=available",
+ url: ( window.galaxy_config ? galaxy_config.root : '/' ) + "api/libraries/datasets/" + self.id + "/permissions?scope=available",
dataType: 'json',
quietMillis: 100,
data: function (term, page) { // page is the one-based page number tracked by Select2
@@ -413,7 +413,7 @@
self.manageSelectObject = new mod_select.View(manage_select_options);
} else { // Non-admins have select with pre-loaded options
var template = self.templateAccessSelect();
- $.get( "/api/libraries/datasets/" + self.id + "/permissions?scope=available", function( data ) {
+ $.get( ( window.galaxy_config ? galaxy_config.root : '/' ) + "api/libraries/datasets/" + self.id + "/permissions?scope=available", function( data ) {
$('.access_perm').html(template({options:data.roles}));
self.accessSelectObject = $('#access_select').select2();
}).fail(function() {
@@ -436,7 +436,7 @@
makeDatasetPrivate: function(){
var self = this;
- $.post("/api/libraries/datasets/" + self.id + "/permissions?action=make_private").done(function(fetched_permissions) {
+ $.post( ( window.galaxy_config ? galaxy_config.root : '/' ) + "api/libraries/datasets/" + self.id + "/permissions?action=make_private").done(function(fetched_permissions) {
self.model.set({is_unrestricted:false});
self.showPermissions({fetched_permissions:fetched_permissions})
mod_toastr.success('The dataset is now private to you.');
@@ -447,7 +447,7 @@
removeDatasetRestrictions: function(){
var self = this;
- $.post("/api/libraries/datasets/" + self.id + "/permissions?action=remove_restrictions")
+ $.post( ( window.galaxy_config ? galaxy_config.root : '/' ) + "api/libraries/datasets/" + self.id + "/permissions?action=remove_restrictions")
.done(function(fetched_permissions) {
self.model.set({is_unrestricted:true});
self.showPermissions({fetched_permissions:fetched_permissions})
@@ -478,7 +478,7 @@
modify_ids.push(modify_roles[i].id);
};
- $.post("/api/libraries/datasets/" + self.id + "/permissions?action=set_permissions", { 'access_ids[]': access_ids, 'manage_ids[]': manage_ids, 'modify_ids[]': modify_ids, } )
+ $.post( ( window.galaxy_config ? galaxy_config.root : '/' ) + "api/libraries/datasets/" + self.id + "/permissions?action=set_permissions", { 'access_ids[]': access_ids, 'manage_ids[]': manage_ids, 'modify_ids[]': modify_ids, } )
.done(function(fetched_permissions){
//fetch dataset again
self.showPermissions({fetched_permissions:fetched_permissions})
diff -r 28113eeee212db2eef9cf4304abe9c3b2a92abcd -r bfd4635011e39aa210b2b1498dd65831dd2a365e client/galaxy/scripts/mvc/library/library-folder-view.js
--- a/client/galaxy/scripts/mvc/library/library-folder-view.js
+++ b/client/galaxy/scripts/mvc/library/library-folder-view.js
@@ -81,7 +81,7 @@
var self = this;
if (this.options.fetched_permissions === undefined){
- $.get( "/api/folders/" + self.id + "/permissions?scope=current").done(function(fetched_permissions) {
+ $.get( ( window.galaxy_config ? galaxy_config.root : '/' ) + "api/folders/" + self.id + "/permissions?scope=current").done(function(fetched_permissions) {
self.prepareSelectBoxes({fetched_permissions:fetched_permissions});
}).fail(function(){
mod_toastr.error('An error occurred while attempting to fetch folder permissions.');
@@ -125,7 +125,7 @@
placeholder: 'Click to select a role',
container: self.$el.find('#' + id),
ajax: {
- url: "/api/folders/" + self.id + "/permissions?scope=available",
+ url: ( window.galaxy_config ? galaxy_config.root : '/' ) + "api/folders/" + self.id + "/permissions?scope=available",
dataType: 'json',
quietMillis: 100,
data: function (term, page) { // page is the one-based page number tracked by Select2
@@ -195,7 +195,7 @@
var manage_ids = this._extractIds(this.manageSelectObject.$el.select2('data'));
var modify_ids = this._extractIds(this.modifySelectObject.$el.select2('data'));
- $.post("/api/folders/" + self.id + "/permissions?action=set_permissions", { 'add_ids[]': add_ids, 'manage_ids[]': manage_ids, 'modify_ids[]': modify_ids, } )
+ $.post( ( window.galaxy_config ? galaxy_config.root : '/' ) + "api/folders/" + self.id + "/permissions?action=set_permissions", { 'add_ids[]': add_ids, 'manage_ids[]': manage_ids, 'modify_ids[]': modify_ids, } )
.done(function(fetched_permissions){
//fetch dataset again
self.showPermissions({fetched_permissions:fetched_permissions})
diff -r 28113eeee212db2eef9cf4304abe9c3b2a92abcd -r bfd4635011e39aa210b2b1498dd65831dd2a365e client/galaxy/scripts/mvc/library/library-foldertoolbar-view.js
--- a/client/galaxy/scripts/mvc/library/library-foldertoolbar-view.js
+++ b/client/galaxy/scripts/mvc/library/library-foldertoolbar-view.js
@@ -294,7 +294,7 @@
dataset_ids.push( this.parentElement.parentElement.id );
}
} );
- var url = '/api/libraries/datasets/download/' + format;
+ var url = ( window.galaxy_config ? galaxy_config.root : '/' ) + 'api/libraries/datasets/download/' + format;
var data = { 'ld_ids' : dataset_ids };
this.processDownload( url, data, 'get' );
},
@@ -386,7 +386,7 @@
fetchExtAndGenomes: function(){
var that = this;
mod_utils.get({
- url : galaxy_config.root + "api/datatypes?extension_only=False",
+ url : ( window.galaxy_config ? galaxy_config.root : '/' ) + "api/datatypes?extension_only=False",
success : function( datatypes ) {
for (key in datatypes) {
that.list_extensions.push({
@@ -403,7 +403,7 @@
}
});
mod_utils.get({
- url: galaxy_config.root + "api/genomes",
+ url: ( window.galaxy_config ? galaxy_config.root : '/' ) + "api/genomes",
success: function( genomes ) {
for ( key in genomes ) {
that.list_genomes.push({
@@ -689,7 +689,7 @@
for ( var i = history_dataset_ids.length - 1; i >= 0; i-- ) {
history_dataset_id = history_dataset_ids[i];
var folder_item = new mod_library_model.Item();
- folder_item.url = '/api/folders/' + this.options.id + '/contents';
+ folder_item.url = ( window.galaxy_config ? galaxy_config.root : '/' ) + 'api/folders/' + this.options.id + '/contents';
folder_item.set( { 'from_hda_id':history_dataset_id } );
hdas_to_add.push( folder_item );
}
@@ -749,7 +749,7 @@
}
return true;
}
- var promise = $.when( $.post( '/api/libraries/datasets?encoded_folder_id=' + that.id +
+ var promise = $.when( $.post( ( window.galaxy_config ? galaxy_config.root : '/' ) + 'api/libraries/datasets?encoded_folder_id=' + that.id +
'&source=' + options.source +
'&path=' + popped_item +
'&file_type=' + options.file_type +
@@ -788,7 +788,7 @@
}
return true;
}
- var promise = $.when( $.post( '/api/libraries/datasets?encoded_folder_id=' + that.id +
+ var promise = $.when( $.post( ( window.galaxy_config ? galaxy_config.root : '/' ) + 'api/libraries/datasets?encoded_folder_id=' + that.id +
'&source=' + options.source +
'&path=' + popped_item +
'&preserve_dirs=' + options.preserve_dirs +
diff -r 28113eeee212db2eef9cf4304abe9c3b2a92abcd -r bfd4635011e39aa210b2b1498dd65831dd2a365e client/galaxy/scripts/mvc/library/library-library-view.js
--- a/client/galaxy/scripts/mvc/library/library-library-view.js
+++ b/client/galaxy/scripts/mvc/library/library-library-view.js
@@ -87,7 +87,7 @@
var self = this;
if (this.options.fetched_permissions === undefined){
- $.get( "/api/libraries/" + self.id + "/permissions?scope=current").done(function(fetched_permissions) {
+ $.get( ( window.galaxy_config ? galaxy_config.root : '/' ) + "api/libraries/" + self.id + "/permissions?scope=current").done(function(fetched_permissions) {
self.prepareSelectBoxes({fetched_permissions:fetched_permissions});
}).fail(function(){
mod_toastr.error('An error occurred while attempting to fetch library permissions.');
@@ -134,7 +134,7 @@
placeholder: 'Click to select a role',
container: self.$el.find('#' + id),
ajax: {
- url: "/api/libraries/" + self.id + "/permissions?scope=available&is_library_access=" + is_library_access,
+ url: ( window.galaxy_config ? galaxy_config.root : '/' ) + "api/libraries/" + self.id + "/permissions?scope=available&is_library_access=" + is_library_access,
dataType: 'json',
quietMillis: 100,
data: function (term, page) { // page is the one-based page number tracked by Select2
@@ -193,7 +193,7 @@
makeDatasetPrivate: function(){
var self = this;
- $.post("/api/libraries/datasets/" + self.id + "/permissions?action=make_private").done(function(fetched_permissions) {
+ $.post( ( window.galaxy_config ? galaxy_config.root : '/' ) + "api/libraries/datasets/" + self.id + "/permissions?action=make_private").done(function(fetched_permissions) {
self.model.set({is_unrestricted:false});
self.showPermissions({fetched_permissions:fetched_permissions})
mod_toastr.success('The dataset is now private to you.');
@@ -204,7 +204,7 @@
removeDatasetRestrictions: function(){
var self = this;
- $.post("/api/libraries/datasets/" + self.id + "/permissions?action=remove_restrictions")
+ $.post( ( window.galaxy_config ? galaxy_config.root : '/' ) + "api/libraries/datasets/" + self.id + "/permissions?action=remove_restrictions")
.done(function(fetched_permissions) {
self.model.set({is_unrestricted:true});
self.showPermissions({fetched_permissions:fetched_permissions})
@@ -230,7 +230,7 @@
var manage_ids = this._extractIds(this.manageSelectObject.$el.select2('data'));
var modify_ids = this._extractIds(this.modifySelectObject.$el.select2('data'));
- $.post("/api/libraries/" + self.id + "/permissions?action=set_permissions", { 'access_ids[]': access_ids, 'add_ids[]': add_ids, 'manage_ids[]': manage_ids, 'modify_ids[]': modify_ids, } )
+ $.post( ( window.galaxy_config ? galaxy_config.root : '/' ) + "api/libraries/" + self.id + "/permissions?action=set_permissions", { 'access_ids[]': access_ids, 'add_ids[]': add_ids, 'manage_ids[]': manage_ids, 'modify_ids[]': modify_ids, } )
.done(function(fetched_permissions){
//fetch dataset again
self.showPermissions({fetched_permissions:fetched_permissions})
diff -r 28113eeee212db2eef9cf4304abe9c3b2a92abcd -r bfd4635011e39aa210b2b1498dd65831dd2a365e client/galaxy/scripts/mvc/library/library-model.js
--- a/client/galaxy/scripts/mvc/library/library-model.js
+++ b/client/galaxy/scripts/mvc/library/library-model.js
@@ -4,7 +4,7 @@
// LIBRARY RELATED MODELS
var Library = Backbone.Model.extend({
- urlRoot: '/api/libraries/',
+ urlRoot: ( window.galaxy_config ? galaxy_config.root : '/' ) + 'api/libraries/',
/** based on show_deleted would this lib show in the list of lib's?
* @param {Boolean} show_deleted are we including deleted libraries?
@@ -19,7 +19,7 @@
});
var Libraries = Backbone.Collection.extend({
- url: '/api/libraries',
+ url: ( window.galaxy_config ? galaxy_config.root : '/' ) + 'api/libraries',
model: Library,
@@ -84,15 +84,15 @@
// FOLDER RELATED MODELS
var Item = Backbone.Model.extend({
- urlRoot : '/api/libraries/datasets/'
+ urlRoot : ( window.galaxy_config ? galaxy_config.root : '/' ) + 'api/libraries/datasets/'
});
var Ldda = Backbone.Model.extend({
- urlRoot : '/api/libraries/datasets/'
+ urlRoot : ( window.galaxy_config ? galaxy_config.root : '/' ) + 'api/libraries/datasets/'
});
var FolderAsModel = Backbone.Model.extend({
- urlRoot: '/api/folders'
+ urlRoot: ( window.galaxy_config ? galaxy_config.root : '/' ) + 'api/folders'
});
var Folder = Backbone.Collection.extend({
@@ -152,7 +152,7 @@
var FolderContainer = Backbone.Model.extend({
defaults : {
folder : new Folder(),
- urlRoot : "/api/folders/",
+ urlRoot : ( window.galaxy_config ? galaxy_config.root : '/' ) + 'api/folders/',
id : "unknown"
},
parse : function(obj) {
@@ -169,11 +169,11 @@
// TODO UNITE
var HistoryItem = Backbone.Model.extend({
- urlRoot : '/api/histories/'
+ urlRoot : ( window.galaxy_config ? galaxy_config.root : '/' ) + 'api/histories/'
});
var HistoryContents = Backbone.Collection.extend({
- urlRoot : '/api/histories/',
+ urlRoot : ( window.galaxy_config ? galaxy_config.root : '/' ) + 'api/histories/',
initialize: function(options){
this.id = options.id;
},
@@ -184,11 +184,11 @@
});
var GalaxyHistory = Backbone.Model.extend({
- urlRoot : '/api/histories/'
+ urlRoot : ( window.galaxy_config ? galaxy_config.root : '/' ) + 'api/histories/'
});
var GalaxyHistories = Backbone.Collection.extend({
- url : '/api/histories',
+ url : ( window.galaxy_config ? galaxy_config.root : '/' ) + 'api/histories',
model : GalaxyHistory
});
@@ -199,7 +199,7 @@
*/
var Jstree = Backbone.Model.extend({
- urlRoot: '/api/remote_files'
+ urlRoot: ( window.galaxy_config ? galaxy_config.root : '/' ) + 'api/remote_files'
});
return {
diff -r 28113eeee212db2eef9cf4304abe9c3b2a92abcd -r bfd4635011e39aa210b2b1498dd65831dd2a365e client/galaxy/scripts/mvc/tools/tools-parameters.js
--- a/client/galaxy/scripts/mvc/tools/tools-parameters.js
+++ b/client/galaxy/scripts/mvc/tools/tools-parameters.js
@@ -145,6 +145,7 @@
data : options,
error_text : input_def.error_text || 'No options available',
multiple : input_def.multiple,
+ optional : input_def.optional,
searchable : input_def.searchable,
onchange : function() {
self.app.trigger('refresh');
diff -r 28113eeee212db2eef9cf4304abe9c3b2a92abcd -r bfd4635011e39aa210b2b1498dd65831dd2a365e client/galaxy/scripts/viz/circster.js
--- a/client/galaxy/scripts/viz/circster.js
+++ b/client/galaxy/scripts/viz/circster.js
@@ -1,16 +1,20 @@
// load required libraries
-require(
-[
+require([
'utils/utils',
- 'mvc/ui/icon-button',
- 'libs/farbtastic',
-], function(mod_utils, mod_icon_btn)
+], function(mod_utils)
{
// load css
mod_utils.cssLoadFile("static/style/circster.css");
});
-define(["libs/underscore", "libs/d3", "viz/visualization", "utils/config"], function(_, d3, visualization, config) {
+define([
+ "libs/underscore",
+ "libs/d3",
+ "viz/visualization",
+ "utils/config",
+ 'mvc/ui/icon-button',
+ 'libs/farbtastic'
+], function(_, d3, visualization, config, mod_icon_btn) {
/**
* Utility class for working with SVG.
@@ -71,7 +75,7 @@
else {
tick_coords = [1, 0, 4, 0];
text_coords = [0, 4, ".35em", ""];
-
+
}
ticks.append("line")
@@ -80,7 +84,7 @@
.attr("x2", tick_coords[2])
.attr("y1", tick_coords[3])
.style("stroke", "#000");
-
+
return ticks.append("text")
.attr("x", text_coords[0])
.attr("y", text_coords[1])
@@ -98,11 +102,11 @@
// Use default of 2 sig. digits.
if (sigDigits === undefined)
sigDigits = 2;
-
+
// Verify input number
if (num === null)
return null;
-
+
// Calculate return value
var rval = null;
if (Math.abs(num) < 1) {
@@ -141,7 +145,7 @@
*/
var CircsterView = Backbone.View.extend({
className: 'circster',
-
+
initialize: function(options) {
this.genome = options.genome;
this.label_arc_height = 50;
@@ -188,7 +192,7 @@
track_gap = this.model.get('config').get_value('track_gap'),
// Subtract 20 to make sure chrom labels are on screen.
min_dimension = Math.min(this.$el.width(), this.$el.height()) - 20,
- // Compute radius start based on model, will be centered
+ // Compute radius start based on model, will be centered
// and fit entirely inside element by default.
radius_start = min_dimension / 2 -
circular_tracks.length * (dataset_arc_height + track_gap) +
@@ -198,14 +202,14 @@
// Compute range of track starting radii.
tracks_start_radii = d3.range(radius_start, min_dimension / 2, dataset_arc_height + track_gap);
-
+
// Map from track start to bounds.
var self = this;
return _.map(tracks_start_radii, function(radius) {
return [radius, radius + dataset_arc_height];
});
},
-
+
/**
* Renders circular tracks, chord tracks, and label tracks.
*/
@@ -254,7 +258,7 @@
}))
.attr("transform", "translate(" + width / 2 + "," + height / 2 + ")")
.append('svg:g').attr('class', 'tracks');
-
+
// -- Render circular tracks. --
// Create a view for each track in the visualization and render.
@@ -266,12 +270,12 @@
genome: self.genome,
total_gap: total_gap
});
-
+
view.render();
-
+
return view;
});
-
+
// -- Render chords tracks. --
this.chords_views = chords_tracks.map(function(track) {
@@ -289,10 +293,10 @@
});
// -- Render label track. --
-
+
// Track bounds are:
// (a) outer radius of last circular track;
- // (b)
+ // (b)
var outermost_radius = this.circular_views[this.circular_views.length-1].radius_bounds[1],
track_bounds = [
outermost_radius,
@@ -305,7 +309,7 @@
genome: self.genome,
total_gap: total_gap
});
-
+
this.label_track_view.render();
},
@@ -356,7 +360,7 @@
// Update label track.
/*
- FIXME: should never have to update label track because vis always expands to fit area
+ FIXME: should never have to update label track because vis always expands to fit area
within label track.
var track_bounds = new_track_bounds[ new_track_bounds.length-1 ];
track_bounds[1] = track_bounds[0];
@@ -373,7 +377,7 @@
var track_view = this.circular_views[options.index];
this.circular_views.splice(options.index, 1);
track_view.$el.remove();
-
+
// Recompute and update track bounds.
var new_track_bounds = this.get_tracks_bounds();
_.each(this.circular_views, function(track_view, i) {
@@ -392,7 +396,7 @@
_.each(this.chords_views, function(track_view) {
track_view.update_radius_bounds(new_track_bounds[0]);
});
-
+
}
});
@@ -455,7 +459,7 @@
// Append titles to paths.
chroms_paths.append("title").text(function(d) { return d.data.chrom; });
-
+
// -- Render track data and, when track data is rendered, apply preferences and update chrom_elts fill. --
var self = this,
@@ -490,7 +494,7 @@
var new_d = d3.svg.arc()
.innerRadius(this.radius_bounds[0])
.outerRadius(this.radius_bounds[1]);
-
+
this.parent_elt.selectAll('g>path.chrom-background').transition().duration(1000).attr('d', new_d);
this._transition_chrom_data();
@@ -511,7 +515,7 @@
}
// -- Scale increased, so render visible data with more detail. --
-
+
var self = this,
utils = new SVGUtils();
@@ -539,7 +543,7 @@
$.when(data_deferred).then(function(data) {
// Remove current data path.
path_elt.remove();
-
+
// Update data bounds with new data.
self._update_data_bounds();
@@ -598,12 +602,12 @@
_transition_labels: function() {},
/**
- * Update data bounds. If there are new_bounds, use them; otherwise use
+ * Update data bounds. If there are new_bounds, use them; otherwise use
* default data bounds.
*/
_update_data_bounds: function(new_bounds) {
var old_bounds = this.data_bounds;
- this.data_bounds = new_bounds ||
+ this.data_bounds = new_bounds ||
this.get_data_bounds(this.track.get('data_manager').get_genome_wide_data(this.genome));
this._transition_chrom_data();
},
@@ -624,7 +628,7 @@
// Set min, max value in config so that they can be adjusted. Make this silent
// because these attributes are watched for changes and the viz is updated
- // accordingly (set up in initialize). Because we are setting up, we don't want
+ // accordingly (set up in initialize). Because we are setting up, we don't want
// the watch to trigger events here.
track.get('config').set_value('min_value', self.data_bounds[0], {silent: true});
track.get('config').set_value('max_value', self.data_bounds[1], {silent: true});
@@ -660,7 +664,7 @@
_get_path_function: function(chrom_arc, chrom_data) {},
/**
- * Returns arc layouts for genome's chromosomes/contigs. Arcs are arranged in a circle
+ * Returns arc layouts for genome's chromosomes/contigs. Arcs are arranged in a circle
* separated by gaps.
*/
_chroms_layout: function() {
@@ -700,14 +704,14 @@
* Render labels.
*/
_render_data: function(svg) {
- // -- Add chromosome label where it will fit; an alternative labeling mechanism
+ // -- Add chromosome label where it will fit; an alternative labeling mechanism
// would be nice for small chromosomes. --
var self = this,
chrom_arcs = svg.selectAll('g');
chrom_arcs.selectAll('path')
.attr('id', function(d) { return 'label-' + d.data.chrom; });
-
+
chrom_arcs.append("svg:text")
.filter(function(d) {
return d.endAngle - d.startAngle > self.min_arc_len;
@@ -857,12 +861,12 @@
return "rotate(90)";
};
- // FIXME:
+ // FIXME:
// (1) using min_max class below is needed for _update_min_max, which could be improved.
// (2) showing config on tick click should be replaced by proper track config icon.
// Draw min, max on first chrom only.
- var ticks = this.drawTicks(this.parent_elt, [ this.chroms_layout[0] ],
+ var ticks = this.drawTicks(this.parent_elt, [ this.chroms_layout[0] ],
this._data_bounds_ticks_fn(), textTransform, true)
.classed('min_max', true);
@@ -872,7 +876,7 @@
var view = new config.ConfigSettingCollectionView({
collection: self.track.get('config')
});
- view.render_in_modal('Configure Track');
+ view.render_in_modal('Configure Track');
});
});
@@ -951,7 +955,7 @@
var CircsterBigWigTrackView = CircsterQuantitativeTrackView.extend({
get_data_bounds: function(data) {
- // Set max across dataset by extracting all values, flattening them into a
+ // Set max across dataset by extracting all values, flattening them into a
// single array, and getting third quartile.
var values = _.flatten( _.map(data, function(d) {
if (d) {
@@ -965,8 +969,8 @@
return 0;
}
}) );
-
- // For max, use 98% quantile in attempt to avoid very large values. However, this max may be 0
+
+ // For max, use 98% quantile in attempt to avoid very large values. However, this max may be 0
// for sparsely populated data, so use max in that case.
return [ _.min(values), this._quantile(values, 0.98) || _.max(values) ];
}
@@ -1068,13 +1072,13 @@
genome : genome,
model : vis
});
-
+
// Render vizualization
viz_view.render();
-
+
// setup title
$('#center .unified-panel-header-inner').append(galaxy_config.app.viz_config.title + " " + galaxy_config.app.viz_config.dbkey);
-
+
// setup menu
var menu = mod_icon_btn.create_icon_buttons_menu([
{
@@ -1100,7 +1104,7 @@
{
// show saving dialog box
Galaxy.modal.show({title: "Saving...", body: "progress" });
-
+
// send to server
$.ajax({
url: galaxy_config.root + "visualization/save",
@@ -1132,11 +1136,11 @@
window.location = galaxy_config.root + "visualization/list";
}
}], { tooltip_config: { placement: 'bottom' } });
-
+
// add menu
menu.$el.attr("style", "float: right");
$("#center .unified-panel-header-inner").append(menu.$el);
-
+
// manual tooltip config because default gravity is S and cannot be changed
$(".menu-button").tooltip( { placement: 'bottom' } );
}
diff -r 28113eeee212db2eef9cf4304abe9c3b2a92abcd -r bfd4635011e39aa210b2b1498dd65831dd2a365e config/galaxy.ini.sample
--- a/config/galaxy.ini.sample
+++ b/config/galaxy.ini.sample
@@ -580,6 +580,13 @@
# requests.
#nginx_upload_path = False
+# Galaxy can also use nginx_upload_module to receive files staged out upon job
+# completion by remote job runners (i.e. Pulsar) that initiate staging
+# operations on the remote end. See the Galaxy nginx documentation for the
+# corresponding nginx configuration.
+#nginx_upload_job_files_store = False
+#nginx_upload_job_files_path = False
+
# Have Galaxy manage dynamic proxy component for routing requests to other
# services based on Galaxy's session cookie. It will attempt to do this by
# default though you do need to install node+npm and do an npm install from
@@ -960,6 +967,17 @@
# always, onsuccess, never
#cleanup_job = always
+# For sites where all users in Galaxy match users on the system on which Galaxy
+# runs, the DRMAA job runner can be configured to submit jobs to the DRM as the
+# actual user instead of as the user running the Galaxy server process. For
+# details on these options, see the documentation at:
+#
+# http://galaxyproject.org/wiki/Admin/Config/Performance/Cluster
+#
+#drmaa_external_runjob_script = scripts/drmaa_external_runner.py
+#drmaa_external_killjob_script = scripts/drmaa_external_killer.py
+#external_chown_script = scripts/external_chown_script.py
+
# File to source to set up the environment when running jobs. By default, the
# environment in which the Galaxy server starts is used when running jobs
# locally, and the environment set up per the DRM's submission method and
diff -r 28113eeee212db2eef9cf4304abe9c3b2a92abcd -r bfd4635011e39aa210b2b1498dd65831dd2a365e config/job_conf.xml.sample_advanced
--- a/config/job_conf.xml.sample_advanced
+++ b/config/job_conf.xml.sample_advanced
@@ -252,10 +252,7 @@
--></destination><destination id="real_user_cluster" runner="drmaa">
- <!-- TODO: The real user options should maybe not be considered runner params. -->
- <param id="galaxy_external_runjob_script">scripts/drmaa_external_runner.py</param>
- <param id="galaxy_external_killjob_script">scripts/drmaa_external_killer.py</param>
- <param id="galaxy_external_chown_script">scripts/external_chown_script.py</param>
+ <!-- Make sure to setup 3 real user parameters in galaxy.ini. --></destination><destination id="dynamic" runner="dynamic"><!-- A destination that represents a method in the dynamic runner. -->
diff -r 28113eeee212db2eef9cf4304abe9c3b2a92abcd -r bfd4635011e39aa210b2b1498dd65831dd2a365e lib/galaxy/config.py
--- a/lib/galaxy/config.py
+++ b/lib/galaxy/config.py
@@ -293,6 +293,8 @@
self.nginx_x_archive_files_base = kwargs.get( 'nginx_x_archive_files_base', False )
self.nginx_upload_store = kwargs.get( 'nginx_upload_store', False )
self.nginx_upload_path = kwargs.get( 'nginx_upload_path', False )
+ self.nginx_upload_job_files_store = kwargs.get( 'nginx_upload_job_files_store', False )
+ self.nginx_upload_job_files_path = kwargs.get( 'nginx_upload_job_files_path', False )
if self.nginx_upload_store:
self.nginx_upload_store = os.path.abspath( self.nginx_upload_store )
self.object_store = kwargs.get( 'object_store', 'disk' )
@@ -466,7 +468,7 @@
datatypes_config_file=[ 'config/datatypes_conf.xml', 'datatypes_conf.xml', 'config/datatypes_conf.xml.sample' ],
external_service_type_config_file=[ 'config/external_service_types_conf.xml', 'external_service_types_conf.xml', 'config/external_service_types_conf.xml.sample' ],
job_config_file=[ 'config/job_conf.xml', 'job_conf.xml' ],
- job_metrics_config_file=[ 'config/job_metrics_conf.xml', 'job_metrics_conf.xml' ],
+ job_metrics_config_file=[ 'config/job_metrics_conf.xml', 'job_metrics_conf.xml','config/job_metrics_conf.xml.sample' ],
dependency_resolvers_config_file=[ 'config/dependency_resolvers_conf.xml', 'dependency_resolvers_conf.xml' ],
job_resource_params_file=[ 'config/job_resource_params_conf.xml', 'job_resource_params_conf.xml' ],
migrated_tools_config=[ 'migrated_tools_conf.xml', 'config/migrated_tools_conf.xml' ],
diff -r 28113eeee212db2eef9cf4304abe9c3b2a92abcd -r bfd4635011e39aa210b2b1498dd65831dd2a365e lib/galaxy/jobs/__init__.py
--- a/lib/galaxy/jobs/__init__.py
+++ b/lib/galaxy/jobs/__init__.py
@@ -962,12 +962,11 @@
job.set_state( job.states.PAUSED )
self.sa_session.add( job )
- def mark_as_resubmitted( self ):
+ def mark_as_resubmitted( self, info=None ):
job = self.get_job()
self.sa_session.refresh( job )
- for dataset in [ dataset_assoc.dataset for dataset_assoc in job.output_datasets + job.output_library_datasets ]:
- dataset._state = model.Dataset.states.RESUBMITTED
- self.sa_session.add( dataset )
+ if info is not None:
+ job.info = info
job.set_state( model.Job.states.RESUBMITTED )
self.sa_session.add( job )
self.sa_session.flush()
@@ -1251,6 +1250,16 @@
if job.user:
job.user.total_disk_usage += bytes
+ # Emperically, we need to update job.user and
+ # job.workflow_invocation_step.workflow_invocation in separate
+ # transactions. Best guess as to why is that the workflow_invocation
+ # may or may not exist when the job is first loaded by the handler -
+ # and depending on whether it is or not sqlalchemy orders the updates
+ # differently and deadlocks can occur (one thread updates user and
+ # waits on invocation and the other updates invocation and waits on
+ # user).
+ self.sa_session.flush()
+
# fix permissions
for path in [ dp.real_path for dp in self.get_mutable_output_fnames() ]:
util.umask_fix_perms( path, self.app.config.umask, 0666, self.app.config.gid )
diff -r 28113eeee212db2eef9cf4304abe9c3b2a92abcd -r bfd4635011e39aa210b2b1498dd65831dd2a365e lib/galaxy/jobs/runners/__init__.py
--- a/lib/galaxy/jobs/runners/__init__.py
+++ b/lib/galaxy/jobs/runners/__init__.py
@@ -341,8 +341,8 @@
except:
log.exception('Caught exception in runner state handler:')
- def mark_as_resubmitted( self, job_state ):
- job_state.job_wrapper.mark_as_resubmitted()
+ def mark_as_resubmitted( self, job_state, info=None ):
+ job_state.job_wrapper.mark_as_resubmitted( info=info )
if not self.app.config.track_jobs_in_database:
job_state.job_wrapper.change_state( model.Job.states.QUEUED )
self.app.job_manager.job_handler.dispatcher.put( job_state.job_wrapper )
diff -r 28113eeee212db2eef9cf4304abe9c3b2a92abcd -r bfd4635011e39aa210b2b1498dd65831dd2a365e lib/galaxy/jobs/runners/pulsar.py
--- a/lib/galaxy/jobs/runners/pulsar.py
+++ b/lib/galaxy/jobs/runners/pulsar.py
@@ -342,7 +342,12 @@
encoded_job_id = self.app.security.encode_id(job_id)
job_key = self.app.security.encode_id( job_id, kind="jobs_files" )
- files_endpoint = "%s/api/jobs/%s/files?job_key=%s" % (
+ endpoint_base = "%s/api/jobs/%s?job_key=%s"
+ if self.app.config.nginx_upload_job_files_path:
+ endpoint_base = "%s" + \
+ self.app.config.nginx_upload_job_files_path + \
+ "?job_id=%s&job_key=%s"
+ files_endpoint = endpoint_base % (
self.galaxy_url,
encoded_job_id,
job_key
diff -r 28113eeee212db2eef9cf4304abe9c3b2a92abcd -r bfd4635011e39aa210b2b1498dd65831dd2a365e lib/galaxy/jobs/runners/state_handlers/resubmit.py
--- a/lib/galaxy/jobs/runners/state_handlers/resubmit.py
+++ b/lib/galaxy/jobs/runners/state_handlers/resubmit.py
@@ -1,4 +1,5 @@
import logging
+
from galaxy import model
@@ -13,31 +14,45 @@
def failure(app, job_runner, job_state):
- if getattr( job_state, 'runner_state', None ) and job_state.runner_state in ( job_state.runner_states.WALLTIME_REACHED, job_state.runner_states.MEMORY_LIMIT_REACHED ):
- # Intercept jobs that hit the walltime and have a walltime or nonspecific resubmit destination configured
+ if (getattr(job_state, 'runner_state', None)
+ and job_state.runner_state in
+ (job_state.runner_states.WALLTIME_REACHED,
+ job_state.runner_states.MEMORY_LIMIT_REACHED)):
+ # Intercept jobs that hit the walltime and have a walltime or
+ # nonspecific resubmit destination configured
for resubmit in job_state.job_destination.get('resubmit'):
- if resubmit.get('condition', None) and resubmit['condition'] != job_state.runner_state:
- continue # There is a resubmit defined for the destination but its condition is not for walltime_reached
- log.info("(%s/%s) Job will be resubmitted to '%s' because %s at the '%s' destination",
- job_state.job_wrapper.job_id,
- job_state.job_id,
- resubmit['destination'],
- MESSAGES[job_state.runner_state],
- job_state.job_wrapper.job_destination.id )
+ if (resubmit.get('condition', None) and resubmit['condition'] !=
+ job_state.runner_state):
+ # There is a resubmit defined for the destination but
+ # its condition is not for walltime_reached
+ continue
+ log.info("(%s/%s) Job will be resubmitted to '%s' because %s at "
+ "the '%s' destination",
+ job_state.job_wrapper.job_id,
+ job_state.job_id,
+ resubmit['destination'],
+ MESSAGES[job_state.runner_state],
+ job_state.job_wrapper.job_destination.id )
# fetch JobDestination for the id or tag
- new_destination = app.job_config.get_destination(resubmit['destination'])
+ new_destination = app.job_config.get_destination(
+ resubmit['destination'])
# Resolve dynamic if necessary
- new_destination = job_state.job_wrapper.job_runner_mapper.cache_job_destination( new_destination )
+ new_destination = (job_state.job_wrapper.job_runner_mapper
+ .cache_job_destination(new_destination))
# Reset job state
job = job_state.job_wrapper.get_job()
if resubmit.get('handler', None):
- log.debug('(%s/%s) Job reassigned to handler %s', job_state.job_wrapper.job_id, job_state.job_id, resubmit['handler'])
+ log.debug('(%s/%s) Job reassigned to handler %s',
+ job_state.job_wrapper.job_id, job_state.job_id,
+ resubmit['handler'])
job.set_handler(resubmit['handler'])
job_runner.sa_session.add( job )
# Is this safe to do here?
job_runner.sa_session.flush()
- # Cache the destination to prevent rerunning dynamic after resubmit
- job_state.job_wrapper.job_runner_mapper.cached_job_destination = new_destination
+ # Cache the destination to prevent rerunning dynamic after
+ # resubmit
+ job_state.job_wrapper.job_runner_mapper \
+ .cached_job_destination = new_destination
job_state.job_wrapper.set_job_destination(new_destination)
# Clear external ID (state change below flushes the change)
job.job_runner_external_id = None
@@ -45,5 +60,7 @@
if job.params is None:
job.params = {}
job_state.runner_state_handled = True
- job_runner.mark_as_resubmitted( job_state )
+ info = "This job was resubmitted to the queue because %s on its " \
+ "compute resource." % MESSAGES[job_state.runner_state]
+ job_runner.mark_as_resubmitted(job_state, info=info)
return
diff -r 28113eeee212db2eef9cf4304abe9c3b2a92abcd -r bfd4635011e39aa210b2b1498dd65831dd2a365e lib/galaxy/managers/base.py
--- a/lib/galaxy/managers/base.py
+++ b/lib/galaxy/managers/base.py
@@ -700,8 +700,8 @@
setattr( item, key, val )
return val
- def deserialize_basestring( self, trans, item, key, val ):
- val = self.validate.basestring( key, val )
+ def deserialize_basestring( self, trans, item, key, val, convert_none_to_empty=False ):
+ val = '' if ( convert_none_to_empty and val is None ) else self.validate.basestring( key, val )
return self.default_deserializer( trans, item, key, val )
def deserialize_bool( self, trans, item, key, val ):
diff -r 28113eeee212db2eef9cf4304abe9c3b2a92abcd -r bfd4635011e39aa210b2b1498dd65831dd2a365e lib/galaxy/managers/hdas.py
--- a/lib/galaxy/managers/hdas.py
+++ b/lib/galaxy/managers/hdas.py
@@ -154,8 +154,9 @@
# error here if disallowed - before jobs are stopped
#TODO: poss. move to DatasetAssociationManager
self.dataset_manager.error_unless_dataset_purge_allowed( trans, hda )
+ if trans.user:
+ trans.user.total_disk_usage -= hda.quota_amount( trans.user )
super( HDAManager, self ).purge( trans, hda, flush=flush )
-
if hda.creating_job_associations:
job = hda.creating_job_associations[0].job
if not job.finished:
@@ -195,6 +196,32 @@
break
return job
+ def _job_state_history_query( self, hda ):
+ """
+ Return a query of the job's state history for the job that created this hda.
+ """
+ session = self.app.model.context
+ JobToOutputDatasetAssociation = model.JobToOutputDatasetAssociation
+ JobStateHistory = model.JobStateHistory
+
+ # TODO: this does not play well with copied hdas
+ # NOTE: don't eagerload (JODA will load the hda were using!)
+ hda_id = hda.id
+ query = ( session.query( JobToOutputDatasetAssociation, JobStateHistory )
+ .filter( JobToOutputDatasetAssociation.dataset_id == hda_id )
+ .filter( JobStateHistory.job_id == JobToOutputDatasetAssociation.job_id )
+ .enable_eagerloads( False ) )
+ return query
+
+ def has_been_resubmitted( self, hda ):
+ """
+ Return True if the hda's job was resubmitted at any point.
+ """
+ job_states = model.Job.states
+ query = ( self._job_state_history_query( hda )
+ .filter( model.JobStateHistory.state == job_states.RESUBMITTED ) )
+ return self.app.model.context.query( query.exists() ).scalar()
+
# .... serialization
def get_display_apps( self, trans, hda ):
"""
@@ -324,7 +351,7 @@
'history_content_type',
'dataset_id',
'state', 'extension',
- 'deleted', 'purged', 'visible', 'resubmitted',
+ 'deleted', 'purged', 'visible',
'type', 'url'
])
self.add_view( 'detailed', [
@@ -340,7 +367,8 @@
'file_ext', 'file_size',
'create_time', 'update_time',
- 'metadata', 'meta_files', 'data_type',
+ 'resubmitted',
+ 'metadata', 'meta_files', 'data_type',
'peek',
#TODO: why is this named uuid!? The hda doesn't have a uuid - it's the underlying dataset's uuid!
@@ -388,7 +416,7 @@
'hda_ldda' : lambda *a: 'hda',
# remapped
- 'info' : lambda t, i, k: i.info.strip() if isinstance( i.info, basestring ) else i.info,
+ 'info' : lambda t, i, k: i.info.strip() if isinstance( i.info, basestring ) else '',
'misc_info' : lambda t, i, k: self.serializers[ 'info' ]( t, i, k ),
'misc_blurb' : lambda t, i, k: i.blurb,
'genome_build' : lambda t, i, k: i.dbkey,
@@ -400,7 +428,7 @@
'copied_from_history_dataset_association_id' : self.serialize_id,
'copied_from_library_dataset_dataset_association_id': self.serialize_id,
- 'resubmitted' : lambda t, i, k: i._state == t.app.model.Dataset.states.RESUBMITTED,
+ 'resubmitted' : lambda t, i, k: self.hda_manager.has_been_resubmitted( i ),
'meta_files' : self.serialize_meta_files,
'file_path' : self.serialize_file_path,
@@ -583,7 +611,8 @@
# remapped
'genome_build' : lambda t, i, k, v: self.deserialize_genome_build( t, i, 'dbkey', v ),
- 'misc_info' : lambda t, i, k, v: self.deserialize_basestring( t, i, 'info', v ),
+ 'misc_info' : lambda t, i, k, v: (
+ self.deserialize_basestring( t, i, 'info', v, convert_none_to_empty=True ) ),
#TODO: mixin: deletable
'deleted' : self.deserialize_bool,
diff -r 28113eeee212db2eef9cf4304abe9c3b2a92abcd -r bfd4635011e39aa210b2b1498dd65831dd2a365e lib/galaxy/managers/workflows.py
--- a/lib/galaxy/managers/workflows.py
+++ b/lib/galaxy/managers/workflows.py
@@ -569,7 +569,7 @@
for step_index in step_indices:
step_dict = supplied_steps[ step_index ]
uuid = step_dict.get("uuid", None)
- if uuid:
+ if uuid and uuid != "None":
if uuid in discovered_uuids:
raise exceptions.DuplicatedIdentifierException("Duplicate step UUID in request.")
discovered_uuids.add(uuid)
@@ -586,10 +586,9 @@
type-specific functionality from the incoming dicitionary.
"""
step = model.WorkflowStep()
-
# TODO: Consider handling position inside module.
step.position = step_dict['position']
- if "uuid" in step_dict:
+ if "uuid" in step_dict and step_dict['uuid'] != "None":
step.uuid = step_dict["uuid"]
if "label" in step_dict:
step.label = step_dict["label"]
diff -r 28113eeee212db2eef9cf4304abe9c3b2a92abcd -r bfd4635011e39aa210b2b1498dd65831dd2a365e lib/galaxy/model/__init__.py
--- a/lib/galaxy/model/__init__.py
+++ b/lib/galaxy/model/__init__.py
@@ -1335,9 +1335,8 @@
DISCARDED = 'discarded',
PAUSED = 'paused',
SETTING_METADATA = 'setting_metadata',
- FAILED_METADATA = 'failed_metadata',
- RESUBMITTED = 'resubmitted' )
- # failed_metadata and resubmitted are only valid as DatasetInstance states currently
+ FAILED_METADATA = 'failed_metadata')
+ # failed_metadata is only valid as DatasetInstance state currently
non_ready_states = (
states.UPLOAD,
diff -r 28113eeee212db2eef9cf4304abe9c3b2a92abcd -r bfd4635011e39aa210b2b1498dd65831dd2a365e lib/galaxy/model/orm/logging_connection_proxy.py
--- a/lib/galaxy/model/orm/logging_connection_proxy.py
+++ b/lib/galaxy/model/orm/logging_connection_proxy.py
@@ -2,7 +2,7 @@
import inspect
import os
-from galaxy.model.orm import *
+from galaxy.model.orm import ConnectionProxy
import logging
diff -r 28113eeee212db2eef9cf4304abe9c3b2a92abcd -r bfd4635011e39aa210b2b1498dd65831dd2a365e lib/galaxy/tools/__init__.py
--- a/lib/galaxy/tools/__init__.py
+++ b/lib/galaxy/tools/__init__.py
@@ -417,13 +417,14 @@
dict_collection_visible_keys = ( 'id', 'name', 'version', 'description' )
default_template = 'tool_form.mako'
- def __init__( self, config_file, tool_source, app, guid=None, repository_id=None ):
+ def __init__( self, config_file, tool_source, app, guid=None, repository_id=None, allow_code_files=True ):
"""Load a tool from the config named by `config_file`"""
# Determine the full path of the directory where the tool config is
self.config_file = config_file
self.tool_dir = os.path.dirname( config_file )
self.app = app
self.repository_id = repository_id
+ self._allow_code_files = allow_code_files
#setup initial attribute values
self.inputs = odict()
self.stdio_exit_codes = list()
@@ -704,14 +705,15 @@
# Load any tool specific code (optional) Edit: INS 5/29/2007,
# allow code files to have access to the individual tool's
# "module" if it has one. Allows us to reuse code files, etc.
- for code_elem in root.findall("code"):
- for hook_elem in code_elem.findall("hook"):
- for key, value in hook_elem.items():
- # map hook to function
- self.hook_map[key] = value
- file_name = code_elem.get("file")
- code_path = os.path.join( self.tool_dir, file_name )
- execfile( code_path, self.code_namespace )
+ if self._allow_code_files:
+ for code_elem in root.findall("code"):
+ for hook_elem in code_elem.findall("hook"):
+ for key, value in hook_elem.items():
+ # map hook to function
+ self.hook_map[key] = value
+ file_name = code_elem.get("file")
+ code_path = os.path.join( self.tool_dir, file_name )
+ execfile( code_path, self.code_namespace )
# User interface hints
uihints_elem = root.find( "uihints" )
@@ -2433,7 +2435,7 @@
continue
# state for subsection/group
- group_state = state_inputs[input.name]
+ group_state = state_inputs.get(input.name, {})
# iterate and update values
if input.type == 'repeat':
@@ -2444,10 +2446,12 @@
elif input.type == 'conditional':
if 'test_param' in tool_dict:
test_param = tool_dict['test_param']
- test_param['value'] = jsonify(group_state[test_param['name']])
- if '__current_case__' in group_state:
- i = group_state['__current_case__']
- iterate(tool_dict['cases'][i]['inputs'], input.cases[i].inputs, group_state, other_values)
+ test_param['value'] = jsonify(group_state.get(test_param['name'], None))
+ for i in range (len ( tool_dict['cases'] ) ):
+ current_state = {}
+ if i == group_state.get('__current_case__', None):
+ current_state = group_state
+ iterate(tool_dict['cases'][i]['inputs'], input.cases[i].inputs, current_state, other_values)
else:
# create input dictionary, try to pass other_values if to_dict function supports it e.g. dynamic options
try:
@@ -2459,11 +2463,15 @@
input_name = tool_dict.get('name')
if input_name:
# backup default value
- tool_dict['default_value'] = input.get_initial_value(trans, other_values)
+ try:
+ tool_dict['default_value'] = input.get_initial_value(trans, other_values)
+ except Exception:
+ # get initial value failed due to improper late validation
+ tool_dict['default_value'] = None
+ pass
# update input value from tool state
- if input_name in state_inputs:
- tool_dict['value'] = state_inputs[input_name]
+ tool_dict['value'] = state_inputs.get(input_name, None)
# sanitize values
sanitize(tool_dict, 'value')
@@ -2584,28 +2592,44 @@
# dataset used; parameter should be the analygous dataset in the
# current history.
history = trans.get_history()
- hda_source_dict = {} # Mapping from HDA in history to source HDAs.
+
+ # Create index for hdas.
+ hda_source_dict = {}
for hda in history.datasets:
- source_hda = hda.copied_from_history_dataset_association
- while source_hda:
- if source_hda.dataset.id not in hda_source_dict or source_hda.hid == hda.hid:
- hda_source_dict[ source_hda.dataset.id ] = hda
- source_hda = source_hda.copied_from_history_dataset_association
+ key = '%s_%s' % (hda.hid, hda.dataset.id)
+ hda_source_dict[ hda.dataset.id ] = hda_source_dict[ key ] = hda
# Ditto for dataset collections.
hdca_source_dict = {}
for hdca in history.dataset_collections:
- source_hdca = hdca.copied_from_history_dataset_collection_association
- while source_hdca:
- if source_hdca.collection.id not in hdca_source_dict or source_hdca.hid == hdca.hid:
- hdca_source_dict[ source_hdca.collection.id ] = hdca
- source_hdca = source_hdca.copied_from_history_dataset_collection_association
+ key = '%s_%s' % (hdca.hid, hdca.collection.id)
+ hdca_source_dict[ hdca.collection.id ] = hdca_source_dict[ key ] = hdca
+
+ # Map dataset or collection to current history
+ def map_to_history(value):
+ id = None
+ source = None
+ if isinstance(value, trans.app.model.HistoryDatasetAssociation):
+ id = value.dataset.id
+ source = hda_source_dict
+ elif isinstance(value, trans.app.model.HistoryDatasetCollectionAssociation):
+ id = value.collection.id
+ source = hdca_source_dict
+ else:
+ return None
+ key = '%s_%s' % (value.hid, id)
+ if key in source:
+ return source[ key ]
+ elif id in source:
+ return source[ id ]
+ else:
+ return None
# Unpack unvalidated values to strings, they'll be validated when the
# form is submitted (this happens when re-running a job that was
# initially run by a workflow)
#This needs to be done recursively through grouping parameters
- def rerun_callback( input, value, prefixed_name, prefixed_label ):
+ def mapping_callback( input, value, prefixed_name, prefixed_label ):
if isinstance( value, UnvalidatedValue ):
try:
return input.to_html_value( value.value, trans.app )
@@ -2617,22 +2641,17 @@
if isinstance(value,list):
values = []
for val in value:
- if isinstance(val, trans.app.model.HistoryDatasetAssociation):
- if val.dataset.id in hda_source_dict:
- values.append( hda_source_dict[ val.dataset.id ] )
- else:
- values.append( val )
+ new_val = map_to_history( val )
+ if new_val:
+ values.append( new_val )
+ else:
+ values.append( val )
return values
- if isinstance(value, trans.app.model.HistoryDatasetAssociation):
- if value.dataset.id in hda_source_dict:
- return hda_source_dict[ value.dataset.id ]
- if isinstance(value, trans.app.model.HistoryDatasetCollectionAssociation):
- if value.collection.id in hdca_source_dict:
- return hdca_source_dict[ value.collection.id ]
+ else:
+ return map_to_history( value )
elif isinstance( input, DataCollectionToolParameter ):
- if value.collection.id in hdca_source_dict:
- return hdca_source_dict[ value.collection.id ]
- visit_input_values( tool_inputs, params, rerun_callback )
+ return map_to_history( value )
+ visit_input_values( tool_inputs, params, mapping_callback )
def _compare_tool_version( self, trans, job ):
"""
diff -r 28113eeee212db2eef9cf4304abe9c3b2a92abcd -r bfd4635011e39aa210b2b1498dd65831dd2a365e lib/galaxy/tools/parameters/basic.py
--- a/lib/galaxy/tools/parameters/basic.py
+++ b/lib/galaxy/tools/parameters/basic.py
@@ -15,6 +15,7 @@
from galaxy.util import string_as_bool, sanitize_param, unicodify
from galaxy.util import listify
from galaxy.util.odict import odict
+from galaxy.util.expressions import ExpressionContext
from sanitize import ToolParameterSanitizer
import validation
import dynamic_options
@@ -802,8 +803,9 @@
self.is_dynamic = ( ( self.dynamic_options is not None ) or ( self.options is not None ) )
def _get_dynamic_options_call_other_values( self, trans, other_values ):
- call_other_values = { "__trans__": trans }
+ call_other_values = ExpressionContext({ "__trans__": trans })
if other_values:
+ call_other_values.parent = other_values.parent
call_other_values.update( other_values.dict )
return call_other_values
@@ -1505,8 +1507,9 @@
def _get_options_from_code( self, trans=None, value=None, other_values=None ):
assert self.dynamic_options, Exception( "dynamic_options was not specifed" )
- call_other_values = { '__trans__': trans, '__value__': value }
+ call_other_values = ExpressionContext({ '__trans__': trans, '__value__': value })
if other_values:
+ call_other_values.parent = other_values.parent
call_other_values.update( other_values.dict )
try:
return eval( self.dynamic_options, self.tool.code_namespace, call_other_values )
diff -r 28113eeee212db2eef9cf4304abe9c3b2a92abcd -r bfd4635011e39aa210b2b1498dd65831dd2a365e lib/galaxy/tools/toolbox/base.py
--- a/lib/galaxy/tools/toolbox/base.py
+++ b/lib/galaxy/tools/toolbox/base.py
@@ -978,7 +978,9 @@
if tool_key in val.elems:
self._tool_panel[ key ].elems[ tool_key ] = new_tool
break
- self._tools_by_id[ tool_id ] = new_tool
+ # (Re-)Register the reloaded tool, this will handle
+ # _tools_by_id and _tool_versions_by_id
+ self.register_tool( new_tool )
message = "Reloaded the tool:<br/>"
message += "<b>name:</b> %s<br/>" % old_tool.name
message += "<b>id:</b> %s<br/>" % old_tool.id
diff -r 28113eeee212db2eef9cf4304abe9c3b2a92abcd -r bfd4635011e39aa210b2b1498dd65831dd2a365e lib/galaxy/util/dbkeys.py
--- a/lib/galaxy/util/dbkeys.py
+++ b/lib/galaxy/util/dbkeys.py
@@ -38,7 +38,7 @@
for dataset in datasets:
rval.append( ( dataset.dbkey, "%s (%s) [History]" % ( dataset.name, dataset.dbkey ) ) )
user = trans.user
- if user and 'dbkeys' in user.preferences:
+ if user and hasattr( user, 'preferences' ) and 'dbkeys' in user.preferences:
user_keys = loads( user.preferences['dbkeys'] )
for key, chrom_dict in user_keys.iteritems():
rval.append( ( key, "%s (%s) [Custom]" % ( chrom_dict['name'], key ) ) )
diff -r 28113eeee212db2eef9cf4304abe9c3b2a92abcd -r bfd4635011e39aa210b2b1498dd65831dd2a365e lib/galaxy/version.py
--- a/lib/galaxy/version.py
+++ b/lib/galaxy/version.py
@@ -1,3 +1,3 @@
VERSION_MAJOR = "15.03"
-VERSION_MINOR = "1"
+VERSION_MINOR = "2"
VERSION = VERSION_MAJOR + ('.' + VERSION_MINOR if VERSION_MINOR else '')
diff -r 28113eeee212db2eef9cf4304abe9c3b2a92abcd -r bfd4635011e39aa210b2b1498dd65831dd2a365e lib/galaxy/web/framework/webapp.py
--- a/lib/galaxy/web/framework/webapp.py
+++ b/lib/galaxy/web/framework/webapp.py
@@ -668,7 +668,8 @@
"""
history = None
if self.galaxy_session:
- history = self.galaxy_session.current_history
+ if hasattr( self.galaxy_session, 'current_history' ):
+ history = self.galaxy_session.current_history
if not history and util.string_as_bool( create ):
history = self.new_history()
return history
diff -r 28113eeee212db2eef9cf4304abe9c3b2a92abcd -r bfd4635011e39aa210b2b1498dd65831dd2a365e lib/galaxy/webapps/galaxy/api/job_files.py
--- a/lib/galaxy/webapps/galaxy/api/job_files.py
+++ b/lib/galaxy/webapps/galaxy/api/job_files.py
@@ -83,9 +83,21 @@
self.__check_job_can_write_to_path( trans, job, path )
# Is this writing an unneeded file? Should this just copy in Python?
- input_file = payload.get( "file", payload.get( "__file", None ) ).file
+ if '__file_path' in payload:
+ file_path = payload.get( '__file_path' )
+ upload_store = trans.app.config.nginx_upload_job_files_store
+ assert upload_store, ( "Request appears to have been processed by"
+ " nginx_upload_module but Galaxy is not"
+ " configured to recognize it" )
+ assert file_path.startswith( upload_store ), \
+ ( "Filename provided by nginx (%s) is not in correct"
+ " directory (%s)" % ( file_path, upload_store ) )
+ input_file = open( file_path )
+ else:
+ input_file = payload.get( "file",
+ payload.get( "__file", None ) ).file
try:
- shutil.copyfile( input_file.name, path )
+ shutil.move( input_file.name, path )
finally:
input_file.close()
return {"message": "ok"}
diff -r 28113eeee212db2eef9cf4304abe9c3b2a92abcd -r bfd4635011e39aa210b2b1498dd65831dd2a365e lib/galaxy/webapps/galaxy/api/tools.py
--- a/lib/galaxy/webapps/galaxy/api/tools.py
+++ b/lib/galaxy/webapps/galaxy/api/tools.py
@@ -145,7 +145,6 @@
if success:
trans.response.set_content_type( 'application/x-gzip' )
download_file = open( tool_tarball )
- os.unlink( tool_tarball )
tarball_path, filename = os.path.split( tool_tarball )
trans.response.headers[ "Content-Disposition" ] = 'attachment; filename="%s.tgz"' % ( id )
return download_file
@@ -332,7 +331,7 @@
# job's previous parameters and incoming parameters. Incoming parameters
# have priority.
#
- original_job = self.hda_manager.creating_job( original_dataset )
+ original_job = self.hda_manager.creating_job( trans, original_dataset )
tool = trans.app.toolbox.get_tool( original_job.tool_id )
if not tool or not tool.allow_user_access( trans.user ):
return trans.app.model.Dataset.conversion_messages.NO_TOOL
diff -r 28113eeee212db2eef9cf4304abe9c3b2a92abcd -r bfd4635011e39aa210b2b1498dd65831dd2a365e lib/galaxy/webapps/galaxy/buildapp.py
--- a/lib/galaxy/webapps/galaxy/buildapp.py
+++ b/lib/galaxy/webapps/galaxy/buildapp.py
@@ -106,13 +106,13 @@
pack_scripts()
# Close any pooled database connections before forking
try:
- galaxy.model.mapping.metadata.engine.connection_provider._pool.dispose()
+ galaxy.model.mapping.metadata.bind.dispose()
except:
- pass
+ log.exception("Unable to dispose of pooled galaxy model database connections.")
try:
- galaxy.model.tool_shed_install.mapping.metadata.engine.connection_provider._pool.dispose()
+ galaxy.model.tool_shed_install.mapping.metadata.bind.dispose()
except:
- pass
+ log.exception("Unable to dispose of pooled toolshed install model database connections.")
if not app.config.is_uwsgi:
postfork_setup()
diff -r 28113eeee212db2eef9cf4304abe9c3b2a92abcd -r bfd4635011e39aa210b2b1498dd65831dd2a365e lib/galaxy/webapps/galaxy/controllers/dataset.py
--- a/lib/galaxy/webapps/galaxy/controllers/dataset.py
+++ b/lib/galaxy/webapps/galaxy/controllers/dataset.py
@@ -852,22 +852,24 @@
status = 'done'
try:
id = trans.app.security.decode_id( dataset_id )
- history = trans.get_history()
user = trans.get_user()
hda = trans.sa_session.query( self.app.model.HistoryDatasetAssociation ).get( id )
# Invalid HDA
assert hda, 'Invalid history dataset ID'
+
# Walk up parent datasets to find the containing history
+ history = trans.get_history()
topmost_parent = hda
while topmost_parent.parent:
topmost_parent = topmost_parent.parent
- assert topmost_parent in history.datasets, "Data does not belong to current history"
# If the user is anonymous, make sure the HDA is owned by the current session.
if not user:
- assert trans.galaxy_session.current_history_id == trans.history.id, 'Invalid history dataset ID'
+ current_history_id = trans.galaxy_session.current_history_id
+ assert topmost_parent.history.id == current_history_id, 'Data does not belong to current user'
# If the user is known, make sure the HDA is owned by the current user.
else:
- assert topmost_parent.history.user == trans.user, 'Invalid history dataset ID'
+ assert topmost_parent.history.user == user, 'Data does not belong to current user'
+
# Ensure HDA is deleted
hda.deleted = True
# HDA is purgeable
@@ -890,8 +892,8 @@
except:
log.exception( 'Unable to purge dataset (%s) on purge of HDA (%s):' % ( hda.dataset.id, hda.id ) )
trans.sa_session.flush()
- except Exception:
- msg = 'HDA purge failed (encoded: %s, decoded: %s)' % ( dataset_id, id )
+ except Exception, exc:
+ msg = 'HDA purge failed (encoded: %s, decoded: %s): %s' % ( dataset_id, id, exc )
log.exception( msg )
trans.log_event( msg )
message = 'Dataset removal from disk failed'
diff -r 28113eeee212db2eef9cf4304abe9c3b2a92abcd -r bfd4635011e39aa210b2b1498dd65831dd2a365e lib/galaxy/webapps/galaxy/controllers/history.py
--- a/lib/galaxy/webapps/galaxy/controllers/history.py
+++ b/lib/galaxy/webapps/galaxy/controllers/history.py
@@ -605,9 +605,13 @@
except Exception, exc:
user_id = str( trans.user.id ) if trans.user else '(anonymous)'
- log.exception( 'Error bootstrapping history for user %s: %s', user_id, str( exc ) )
- history_dictionary[ 'error' ] = ( 'An error occurred getting the history data from the server. '
- + 'Please contact a Galaxy administrator if the problem persists.' )
+ log.exception( 'Error bootstrapping history for user %s: %s', user_id, exc )
+ if isinstance( exc, exceptions.ItemAccessibilityException ):
+ error_msg = 'You do not have permission to view this history.'
+ else:
+ error_msg = ( 'An error occurred getting the history data from the server. '
+ + 'Please contact a Galaxy administrator if the problem persists.' )
+ return trans.show_error_message( error_msg, use_panels=use_panels )
return trans.fill_template_mako( "history/view.mako",
history=history_dictionary, hdas=hda_dictionaries, user_is_owner=user_is_owner,
diff -r 28113eeee212db2eef9cf4304abe9c3b2a92abcd -r bfd4635011e39aa210b2b1498dd65831dd2a365e lib/galaxy/webapps/galaxy/controllers/library_common.py
--- a/lib/galaxy/webapps/galaxy/controllers/library_common.py
+++ b/lib/galaxy/webapps/galaxy/controllers/library_common.py
@@ -1136,7 +1136,7 @@
def make_library_uploaded_dataset( self, trans, cntrller, params, name, path, type, library_bunch, in_folder=None ):
link_data_only = params.get( 'link_data_only', 'copy_files' )
uuid_str = params.get( 'uuid', None )
- file_type = params.get( 'file_type' )
+ file_type = params.get( 'file_type', None )
library_bunch.replace_dataset = None # not valid for these types of upload
uploaded_dataset = util.bunch.Bunch()
new_name = name
@@ -1152,8 +1152,8 @@
uploaded_dataset.type = type
uploaded_dataset.ext = None
uploaded_dataset.file_type = file_type
- uploaded_dataset.dbkey = params.get( 'dbkey' )
- uploaded_dataset.space_to_tab = params.get( 'space_to_tab' )
+ uploaded_dataset.dbkey = params.get( 'dbkey', None )
+ uploaded_dataset.space_to_tab = params.get( 'space_to_tab', None )
if in_folder:
uploaded_dataset.in_folder = in_folder
uploaded_dataset.data = upload_common.new_upload( trans, cntrller, uploaded_dataset, library_bunch )
diff -r 28113eeee212db2eef9cf4304abe9c3b2a92abcd -r bfd4635011e39aa210b2b1498dd65831dd2a365e lib/galaxy/webapps/galaxy/controllers/tag.py
--- a/lib/galaxy/webapps/galaxy/controllers/tag.py
+++ b/lib/galaxy/webapps/galaxy/controllers/tag.py
@@ -42,7 +42,7 @@
# Apply tag.
item = self._get_item( trans, item_class, trans.security.decode_id( item_id ) )
user = trans.user
- self.get_tag_handler( trans ).apply_item_tags( trans, user, item, new_tag.encode( 'utf-8' ) )
+ self.get_tag_handler( trans ).apply_item_tags( user, item, new_tag.encode( 'utf-8' ) )
trans.sa_session.flush()
# Log.
params = dict( item_id=item.id, item_class=item_class, tag=new_tag )
@@ -57,7 +57,7 @@
# Remove tag.
item = self._get_item( trans, item_class, trans.security.decode_id( item_id ) )
user = trans.user
- self.get_tag_handler( trans ).remove_item_tag( trans, user, item, tag_name.encode( 'utf-8' ) )
+ self.get_tag_handler( trans ).remove_item_tag( user, item, tag_name.encode( 'utf-8' ) )
trans.sa_session.flush()
# Log.
params = dict( item_id=item.id, item_class=item_class, tag=tag_name )
@@ -73,8 +73,8 @@
# Apply tags.
item = self._get_item( trans, item_class, trans.security.decode_id( item_id ) )
user = trans.user
- self.get_tag_handler( trans ).delete_item_tags( trans, user, item )
- self.get_tag_handler( trans ).apply_item_tags( trans, user, item, new_tags.encode( 'utf-8' ) )
+ self.get_tag_handler( trans ).delete_item_tags( user, item )
+ self.get_tag_handler( trans ).apply_item_tags( user, item, new_tags.encode( 'utf-8' ) )
trans.sa_session.flush()
@web.expose
diff -r 28113eeee212db2eef9cf4304abe9c3b2a92abcd -r bfd4635011e39aa210b2b1498dd65831dd2a365e lib/galaxy/webapps/galaxy/controllers/visualization.py
--- a/lib/galaxy/webapps/galaxy/controllers/visualization.py
+++ b/lib/galaxy/webapps/galaxy/controllers/visualization.py
@@ -985,7 +985,7 @@
else:
# Loading new visualization.
dataset = self.get_hda_or_ldda( trans, hda_ldda, dataset_id )
- job = self.hda_manager.creating_job( dataset )
+ job = self.hda_manager.creating_job( trans, dataset )
viz_config = {
'dataset_id': dataset_id,
'tool_id': job.tool_id,
@@ -1017,7 +1017,7 @@
if dataset_id:
decoded_id = self.decode_id( dataset_id )
hda = self.hda_manager.get_accessible( trans, decoded_id, trans.user )
- hda = self.hda_manager.error_if_uploading( hda )
+ hda = self.hda_manager.error_if_uploading( trans, hda )
else:
return trans.show_message( "Phyloviz couldn't find a dataset_id" )
diff -r 28113eeee212db2eef9cf4304abe9c3b2a92abcd -r bfd4635011e39aa210b2b1498dd65831dd2a365e lib/galaxy/webapps/reports/buildapp.py
--- a/lib/galaxy/webapps/reports/buildapp.py
+++ b/lib/galaxy/webapps/reports/buildapp.py
@@ -70,12 +70,13 @@
webapp = wrap_in_static( webapp, global_conf, **kwargs )
# Close any pooled database connections before forking
try:
- galaxy.model.mapping.metadata.engine.connection_provider._pool.dispose()
+ galaxy.model.mapping.metadata.bind.dispose()
except:
- pass
+ log.exception("Unable to dispose of pooled galaxy model database connections.")
# Return
return webapp
+
def wrap_in_middleware( app, global_conf, **local_conf ):
"""Based on the configuration wrap `app` in a set of common and useful middleware."""
# Merge the global and local configurations
diff -r 28113eeee212db2eef9cf4304abe9c3b2a92abcd -r bfd4635011e39aa210b2b1498dd65831dd2a365e lib/galaxy/webapps/tool_shed/buildapp.py
--- a/lib/galaxy/webapps/tool_shed/buildapp.py
+++ b/lib/galaxy/webapps/tool_shed/buildapp.py
@@ -134,13 +134,28 @@
# Wrap the webapp in some useful middleware
if kwargs.get( 'middleware', True ):
webapp = wrap_in_middleware( webapp, global_conf, **kwargs )
- if asbool( kwargs.get( 'static_enabled', True ) ):
- webapp = wrap_in_static( webapp, global_conf, **kwargs )
+ # TEST FOR UWSGI -- TODO save this somewhere so we only have to do it once.
+ is_uwsgi = False
+ try:
+ # The uwsgi module is automatically injected by the parent uwsgi
+ # process and only exists that way. If anything works, this is a
+ # uwsgi-managed process.
+ import uwsgi
+ is_uwsgi = uwsgi.numproc
+ is_uwsgi = True
+ except ImportError:
+ # This is not a uwsgi process, or something went horribly wrong.
+ pass
+ if asbool( kwargs.get( 'static_enabled', True) ):
+ if is_uwsgi:
+ log.error("Static middleware is enabled in your configuration but this is a uwsgi process. Refusing to wrap in static middleware.")
+ else:
+ webapp = wrap_in_static( webapp, global_conf, **kwargs )
# Close any pooled database connections before forking
try:
- galaxy.webapps.tool_shed.model.mapping.metadata.engine.connection_provider._pool.dispose()
+ galaxy.webapps.tool_shed.model.mapping.metadata.bind.dispose()
except:
- pass
+ log.exception("Unable to dispose of pooled tool_shed model database connections.")
# Return
return webapp
diff -r 28113eeee212db2eef9cf4304abe9c3b2a92abcd -r bfd4635011e39aa210b2b1498dd65831dd2a365e lib/tool_shed/metadata/metadata_generator.py
--- a/lib/tool_shed/metadata/metadata_generator.py
+++ b/lib/tool_shed/metadata/metadata_generator.py
@@ -456,8 +456,8 @@
try:
exported_workflow_dict = json.loads( workflow_text )
except Exception, e:
- log.exception( "Skipping file %s since it does not seem to be a valid exported Galaxy workflow: %s" \
- % str( relative_path ), str( e ) )
+ log.exception( "Skipping file %s since it does not seem to be a valid exported Galaxy workflow: %s"
+ % ( str( relative_path ), str( e ) ) )
valid_exported_galaxy_workflow = False
if valid_exported_galaxy_workflow and \
'a_galaxy_workflow' in exported_workflow_dict and \
diff -r 28113eeee212db2eef9cf4304abe9c3b2a92abcd -r bfd4635011e39aa210b2b1498dd65831dd2a365e lib/tool_shed/tools/tool_validator.py
--- a/lib/tool_shed/tools/tool_validator.py
+++ b/lib/tool_shed/tools/tool_validator.py
@@ -292,7 +292,7 @@
def load_tool_from_config( self, repository_id, full_path ):
try:
- tool = self.app.toolbox.load_tool( full_path, repository_id=repository_id )
+ tool = self.app.toolbox.load_tool( full_path, repository_id=repository_id, allow_code_files=False )
valid = True
error_message = None
except KeyError, e:
diff -r 28113eeee212db2eef9cf4304abe9c3b2a92abcd -r bfd4635011e39aa210b2b1498dd65831dd2a365e lib/tool_shed/util/tool_util.py
--- a/lib/tool_shed/util/tool_util.py
+++ b/lib/tool_shed/util/tool_util.py
@@ -237,12 +237,19 @@
if invalid:
# We're attempting to display a tool in the tool shed that has been determined to have errors, so is invalid.
return state
+ try:
+ # Attempt to generate the tool state using the standard Galaxy-side code
+ return tool.new_state( trans )
+ except Exception, e:
+ # Fall back to building tool state as below
+ log.debug( 'Failed to build tool state for tool "%s" using standard method, will try to fall back on custom method: %s', tool.id, e )
inputs = tool.inputs_by_page[ 0 ]
context = ExpressionContext( state.inputs, parent=None )
for input in inputs.itervalues():
try:
state.inputs[ input.name ] = input.get_initial_value( trans, context )
except:
+ # FIXME: not all values should be an empty list
state.inputs[ input.name ] = []
return state
diff -r 28113eeee212db2eef9cf4304abe9c3b2a92abcd -r bfd4635011e39aa210b2b1498dd65831dd2a365e static/scripts/mvc/history/history-model.js
--- a/static/scripts/mvc/history/history-model.js
+++ b/static/scripts/mvc/history/history-model.js
@@ -257,7 +257,7 @@
setAsCurrent : function(){
var history = this,
- xhr = jQuery.getJSON( '/history/set_as_current?id=' + this.id );
+ xhr = jQuery.getJSON( galaxy_config.root + 'history/set_as_current?id=' + this.id );
xhr.done( function(){
history.trigger( 'set-as-current', history );
@@ -361,7 +361,7 @@
var HistoryCollection = Backbone.Collection.extend( BASE_MVC.LoggableMixin ).extend(
/** @lends HistoryCollection.prototype */{
model : History,
-
+
/** logger used to record this.log messages, commonly set to console */
//logger : console,
diff -r 28113eeee212db2eef9cf4304abe9c3b2a92abcd -r bfd4635011e39aa210b2b1498dd65831dd2a365e static/scripts/mvc/library/library-dataset-view.js
--- a/static/scripts/mvc/library/library-dataset-view.js
+++ b/static/scripts/mvc/library/library-dataset-view.js
@@ -116,7 +116,7 @@
},
downloadDataset: function(){
- var url = '/api/libraries/datasets/download/uncompressed';
+ var url = ( window.galaxy_config ? galaxy_config.root : '/' ) + 'api/libraries/datasets/download/uncompressed';
var data = {'ld_ids' : this.id};
this.processDownload(url, data);
},
@@ -232,7 +232,7 @@
var self = this;
if (this.options.fetched_permissions === undefined){
- $.get( "/api/libraries/datasets/" + self.id + "/permissions?scope=current").done(function(fetched_permissions) {
+ $.get( ( window.galaxy_config ? galaxy_config.root : '/' ) + "api/libraries/datasets/" + self.id + "/permissions?scope=current").done(function(fetched_permissions) {
self.prepareSelectBoxes({fetched_permissions:fetched_permissions, is_admin:is_admin});
}).fail(function(){
mod_toastr.error('An error occurred while attempting to fetch dataset permissions.');
@@ -273,7 +273,7 @@
placeholder: 'Click to select a role',
container: self.$el.find('#access_perm'),
ajax: {
- url: "/api/libraries/datasets/" + self.id + "/permissions?scope=available",
+ url: ( window.galaxy_config ? galaxy_config.root : '/' ) + "api/libraries/datasets/" + self.id + "/permissions?scope=available",
dataType: 'json',
quietMillis: 100,
data: function (term, page) { // page is the one-based page number tracked by Select2
@@ -320,7 +320,7 @@
placeholder: 'Click to select a role',
container: self.$el.find('#modify_perm'),
ajax: {
- url: "/api/libraries/datasets/" + self.id + "/permissions?scope=available",
+ url: ( window.galaxy_config ? galaxy_config.root : '/' ) + "api/libraries/datasets/" + self.id + "/permissions?scope=available",
dataType: 'json',
quietMillis: 100,
data: function (term, page) { // page is the one-based page number tracked by Select2
@@ -367,7 +367,7 @@
placeholder: 'Click to select a role',
container: self.$el.find('#manage_perm'),
ajax: {
- url: "/api/libraries/datasets/" + self.id + "/permissions?scope=available",
+ url: ( window.galaxy_config ? galaxy_config.root : '/' ) + "api/libraries/datasets/" + self.id + "/permissions?scope=available",
dataType: 'json',
quietMillis: 100,
data: function (term, page) { // page is the one-based page number tracked by Select2
@@ -413,7 +413,7 @@
self.manageSelectObject = new mod_select.View(manage_select_options);
} else { // Non-admins have select with pre-loaded options
var template = self.templateAccessSelect();
- $.get( "/api/libraries/datasets/" + self.id + "/permissions?scope=available", function( data ) {
+ $.get( ( window.galaxy_config ? galaxy_config.root : '/' ) + "api/libraries/datasets/" + self.id + "/permissions?scope=available", function( data ) {
$('.access_perm').html(template({options:data.roles}));
self.accessSelectObject = $('#access_select').select2();
}).fail(function() {
@@ -436,7 +436,7 @@
makeDatasetPrivate: function(){
var self = this;
- $.post("/api/libraries/datasets/" + self.id + "/permissions?action=make_private").done(function(fetched_permissions) {
+ $.post( ( window.galaxy_config ? galaxy_config.root : '/' ) + "api/libraries/datasets/" + self.id + "/permissions?action=make_private").done(function(fetched_permissions) {
self.model.set({is_unrestricted:false});
self.showPermissions({fetched_permissions:fetched_permissions})
mod_toastr.success('The dataset is now private to you.');
@@ -447,7 +447,7 @@
removeDatasetRestrictions: function(){
var self = this;
- $.post("/api/libraries/datasets/" + self.id + "/permissions?action=remove_restrictions")
+ $.post( ( window.galaxy_config ? galaxy_config.root : '/' ) + "api/libraries/datasets/" + self.id + "/permissions?action=remove_restrictions")
.done(function(fetched_permissions) {
self.model.set({is_unrestricted:true});
self.showPermissions({fetched_permissions:fetched_permissions})
@@ -478,7 +478,7 @@
modify_ids.push(modify_roles[i].id);
};
- $.post("/api/libraries/datasets/" + self.id + "/permissions?action=set_permissions", { 'access_ids[]': access_ids, 'manage_ids[]': manage_ids, 'modify_ids[]': modify_ids, } )
+ $.post( ( window.galaxy_config ? galaxy_config.root : '/' ) + "api/libraries/datasets/" + self.id + "/permissions?action=set_permissions", { 'access_ids[]': access_ids, 'manage_ids[]': manage_ids, 'modify_ids[]': modify_ids, } )
.done(function(fetched_permissions){
//fetch dataset again
self.showPermissions({fetched_permissions:fetched_permissions})
diff -r 28113eeee212db2eef9cf4304abe9c3b2a92abcd -r bfd4635011e39aa210b2b1498dd65831dd2a365e static/scripts/mvc/library/library-folder-view.js
--- a/static/scripts/mvc/library/library-folder-view.js
+++ b/static/scripts/mvc/library/library-folder-view.js
@@ -81,7 +81,7 @@
var self = this;
if (this.options.fetched_permissions === undefined){
- $.get( "/api/folders/" + self.id + "/permissions?scope=current").done(function(fetched_permissions) {
+ $.get( ( window.galaxy_config ? galaxy_config.root : '/' ) + "api/folders/" + self.id + "/permissions?scope=current").done(function(fetched_permissions) {
self.prepareSelectBoxes({fetched_permissions:fetched_permissions});
}).fail(function(){
mod_toastr.error('An error occurred while attempting to fetch folder permissions.');
@@ -125,7 +125,7 @@
placeholder: 'Click to select a role',
container: self.$el.find('#' + id),
ajax: {
- url: "/api/folders/" + self.id + "/permissions?scope=available",
+ url: ( window.galaxy_config ? galaxy_config.root : '/' ) + "api/folders/" + self.id + "/permissions?scope=available",
dataType: 'json',
quietMillis: 100,
data: function (term, page) { // page is the one-based page number tracked by Select2
@@ -195,7 +195,7 @@
var manage_ids = this._extractIds(this.manageSelectObject.$el.select2('data'));
var modify_ids = this._extractIds(this.modifySelectObject.$el.select2('data'));
- $.post("/api/folders/" + self.id + "/permissions?action=set_permissions", { 'add_ids[]': add_ids, 'manage_ids[]': manage_ids, 'modify_ids[]': modify_ids, } )
+ $.post( ( window.galaxy_config ? galaxy_config.root : '/' ) + "api/folders/" + self.id + "/permissions?action=set_permissions", { 'add_ids[]': add_ids, 'manage_ids[]': manage_ids, 'modify_ids[]': modify_ids, } )
.done(function(fetched_permissions){
//fetch dataset again
self.showPermissions({fetched_permissions:fetched_permissions})
diff -r 28113eeee212db2eef9cf4304abe9c3b2a92abcd -r bfd4635011e39aa210b2b1498dd65831dd2a365e static/scripts/mvc/library/library-foldertoolbar-view.js
--- a/static/scripts/mvc/library/library-foldertoolbar-view.js
+++ b/static/scripts/mvc/library/library-foldertoolbar-view.js
@@ -294,7 +294,7 @@
dataset_ids.push( this.parentElement.parentElement.id );
}
} );
- var url = '/api/libraries/datasets/download/' + format;
+ var url = ( window.galaxy_config ? galaxy_config.root : '/' ) + 'api/libraries/datasets/download/' + format;
var data = { 'ld_ids' : dataset_ids };
this.processDownload( url, data, 'get' );
},
@@ -386,7 +386,7 @@
fetchExtAndGenomes: function(){
var that = this;
mod_utils.get({
- url : galaxy_config.root + "api/datatypes?extension_only=False",
+ url : ( window.galaxy_config ? galaxy_config.root : '/' ) + "api/datatypes?extension_only=False",
success : function( datatypes ) {
for (key in datatypes) {
that.list_extensions.push({
@@ -403,7 +403,7 @@
}
});
mod_utils.get({
- url: galaxy_config.root + "api/genomes",
+ url: ( window.galaxy_config ? galaxy_config.root : '/' ) + "api/genomes",
success: function( genomes ) {
for ( key in genomes ) {
that.list_genomes.push({
@@ -689,7 +689,7 @@
for ( var i = history_dataset_ids.length - 1; i >= 0; i-- ) {
history_dataset_id = history_dataset_ids[i];
var folder_item = new mod_library_model.Item();
- folder_item.url = '/api/folders/' + this.options.id + '/contents';
+ folder_item.url = ( window.galaxy_config ? galaxy_config.root : '/' ) + 'api/folders/' + this.options.id + '/contents';
folder_item.set( { 'from_hda_id':history_dataset_id } );
hdas_to_add.push( folder_item );
}
@@ -749,7 +749,7 @@
}
return true;
}
- var promise = $.when( $.post( '/api/libraries/datasets?encoded_folder_id=' + that.id +
+ var promise = $.when( $.post( ( window.galaxy_config ? galaxy_config.root : '/' ) + 'api/libraries/datasets?encoded_folder_id=' + that.id +
'&source=' + options.source +
'&path=' + popped_item +
'&file_type=' + options.file_type +
@@ -788,7 +788,7 @@
}
return true;
}
- var promise = $.when( $.post( '/api/libraries/datasets?encoded_folder_id=' + that.id +
+ var promise = $.when( $.post( ( window.galaxy_config ? galaxy_config.root : '/' ) + 'api/libraries/datasets?encoded_folder_id=' + that.id +
'&source=' + options.source +
'&path=' + popped_item +
'&preserve_dirs=' + options.preserve_dirs +
diff -r 28113eeee212db2eef9cf4304abe9c3b2a92abcd -r bfd4635011e39aa210b2b1498dd65831dd2a365e static/scripts/mvc/library/library-library-view.js
--- a/static/scripts/mvc/library/library-library-view.js
+++ b/static/scripts/mvc/library/library-library-view.js
@@ -87,7 +87,7 @@
var self = this;
if (this.options.fetched_permissions === undefined){
- $.get( "/api/libraries/" + self.id + "/permissions?scope=current").done(function(fetched_permissions) {
+ $.get( ( window.galaxy_config ? galaxy_config.root : '/' ) + "api/libraries/" + self.id + "/permissions?scope=current").done(function(fetched_permissions) {
self.prepareSelectBoxes({fetched_permissions:fetched_permissions});
}).fail(function(){
mod_toastr.error('An error occurred while attempting to fetch library permissions.');
@@ -134,7 +134,7 @@
placeholder: 'Click to select a role',
container: self.$el.find('#' + id),
ajax: {
- url: "/api/libraries/" + self.id + "/permissions?scope=available&is_library_access=" + is_library_access,
+ url: ( window.galaxy_config ? galaxy_config.root : '/' ) + "api/libraries/" + self.id + "/permissions?scope=available&is_library_access=" + is_library_access,
dataType: 'json',
quietMillis: 100,
data: function (term, page) { // page is the one-based page number tracked by Select2
@@ -193,7 +193,7 @@
makeDatasetPrivate: function(){
var self = this;
- $.post("/api/libraries/datasets/" + self.id + "/permissions?action=make_private").done(function(fetched_permissions) {
+ $.post( ( window.galaxy_config ? galaxy_config.root : '/' ) + "api/libraries/datasets/" + self.id + "/permissions?action=make_private").done(function(fetched_permissions) {
self.model.set({is_unrestricted:false});
self.showPermissions({fetched_permissions:fetched_permissions})
mod_toastr.success('The dataset is now private to you.');
@@ -204,7 +204,7 @@
removeDatasetRestrictions: function(){
var self = this;
- $.post("/api/libraries/datasets/" + self.id + "/permissions?action=remove_restrictions")
+ $.post( ( window.galaxy_config ? galaxy_config.root : '/' ) + "api/libraries/datasets/" + self.id + "/permissions?action=remove_restrictions")
.done(function(fetched_permissions) {
self.model.set({is_unrestricted:true});
self.showPermissions({fetched_permissions:fetched_permissions})
@@ -230,7 +230,7 @@
var manage_ids = this._extractIds(this.manageSelectObject.$el.select2('data'));
var modify_ids = this._extractIds(this.modifySelectObject.$el.select2('data'));
- $.post("/api/libraries/" + self.id + "/permissions?action=set_permissions", { 'access_ids[]': access_ids, 'add_ids[]': add_ids, 'manage_ids[]': manage_ids, 'modify_ids[]': modify_ids, } )
+ $.post( ( window.galaxy_config ? galaxy_config.root : '/' ) + "api/libraries/" + self.id + "/permissions?action=set_permissions", { 'access_ids[]': access_ids, 'add_ids[]': add_ids, 'manage_ids[]': manage_ids, 'modify_ids[]': modify_ids, } )
.done(function(fetched_permissions){
//fetch dataset again
self.showPermissions({fetched_permissions:fetched_permissions})
diff -r 28113eeee212db2eef9cf4304abe9c3b2a92abcd -r bfd4635011e39aa210b2b1498dd65831dd2a365e static/scripts/mvc/library/library-model.js
--- a/static/scripts/mvc/library/library-model.js
+++ b/static/scripts/mvc/library/library-model.js
@@ -4,7 +4,7 @@
// LIBRARY RELATED MODELS
var Library = Backbone.Model.extend({
- urlRoot: '/api/libraries/',
+ urlRoot: ( window.galaxy_config ? galaxy_config.root : '/' ) + 'api/libraries/',
/** based on show_deleted would this lib show in the list of lib's?
* @param {Boolean} show_deleted are we including deleted libraries?
@@ -19,7 +19,7 @@
});
var Libraries = Backbone.Collection.extend({
- url: '/api/libraries',
+ url: ( window.galaxy_config ? galaxy_config.root : '/' ) + 'api/libraries',
model: Library,
@@ -84,15 +84,15 @@
// FOLDER RELATED MODELS
var Item = Backbone.Model.extend({
- urlRoot : '/api/libraries/datasets/'
+ urlRoot : ( window.galaxy_config ? galaxy_config.root : '/' ) + 'api/libraries/datasets/'
});
var Ldda = Backbone.Model.extend({
- urlRoot : '/api/libraries/datasets/'
+ urlRoot : ( window.galaxy_config ? galaxy_config.root : '/' ) + 'api/libraries/datasets/'
});
var FolderAsModel = Backbone.Model.extend({
- urlRoot: '/api/folders'
+ urlRoot: ( window.galaxy_config ? galaxy_config.root : '/' ) + 'api/folders'
});
var Folder = Backbone.Collection.extend({
@@ -152,7 +152,7 @@
var FolderContainer = Backbone.Model.extend({
defaults : {
folder : new Folder(),
- urlRoot : "/api/folders/",
+ urlRoot : ( window.galaxy_config ? galaxy_config.root : '/' ) + 'api/folders/',
id : "unknown"
},
parse : function(obj) {
@@ -169,11 +169,11 @@
// TODO UNITE
var HistoryItem = Backbone.Model.extend({
- urlRoot : '/api/histories/'
+ urlRoot : ( window.galaxy_config ? galaxy_config.root : '/' ) + 'api/histories/'
});
var HistoryContents = Backbone.Collection.extend({
- urlRoot : '/api/histories/',
+ urlRoot : ( window.galaxy_config ? galaxy_config.root : '/' ) + 'api/histories/',
initialize: function(options){
this.id = options.id;
},
@@ -184,11 +184,11 @@
});
var GalaxyHistory = Backbone.Model.extend({
- urlRoot : '/api/histories/'
+ urlRoot : ( window.galaxy_config ? galaxy_config.root : '/' ) + 'api/histories/'
});
var GalaxyHistories = Backbone.Collection.extend({
- url : '/api/histories',
+ url : ( window.galaxy_config ? galaxy_config.root : '/' ) + 'api/histories',
model : GalaxyHistory
});
@@ -199,7 +199,7 @@
*/
var Jstree = Backbone.Model.extend({
- urlRoot: '/api/remote_files'
+ urlRoot: ( window.galaxy_config ? galaxy_config.root : '/' ) + 'api/remote_files'
});
return {
diff -r 28113eeee212db2eef9cf4304abe9c3b2a92abcd -r bfd4635011e39aa210b2b1498dd65831dd2a365e static/scripts/mvc/tools/tools-parameters.js
--- a/static/scripts/mvc/tools/tools-parameters.js
+++ b/static/scripts/mvc/tools/tools-parameters.js
@@ -145,6 +145,7 @@
data : options,
error_text : input_def.error_text || 'No options available',
multiple : input_def.multiple,
+ optional : input_def.optional,
searchable : input_def.searchable,
onchange : function() {
self.app.trigger('refresh');
diff -r 28113eeee212db2eef9cf4304abe9c3b2a92abcd -r bfd4635011e39aa210b2b1498dd65831dd2a365e static/scripts/packed/mvc/history/history-model.js
--- a/static/scripts/packed/mvc/history/history-model.js
+++ b/static/scripts/packed/mvc/history/history-model.js
@@ -1,1 +1,1 @@
-define(["mvc/history/history-contents","mvc/base-mvc","utils/localization"],function(h,i,d){var e=Backbone.Model.extend(i.LoggableMixin).extend(i.mixin(i.SearchableModelMixin,{defaults:{model_class:"History",id:null,name:"Unnamed History",state:"new",diskSize:0,deleted:false},urlRoot:galaxy_config.root+"api/histories",initialize:function(k,l,j){j=j||{};this.logger=j.logger||null;this.log(this+".initialize:",k,l,j);this.log("creating history contents:",l);this.contents=new h.HistoryContents(l||[],{historyId:this.get("id")});this._setUpListeners();this.updateTimeoutId=null},_setUpListeners:function(){this.on("error",function(k,n,j,m,l){this.errorHandler(k,n,j,m,l)});if(this.contents){this.listenTo(this.contents,"error",function(){this.trigger.apply(this,["error:contents"].concat(jQuery.makeArray(arguments)))})}this.on("change:id",function(k,j){if(this.contents){this.contents.historyId=j}},this)},errorHandler:function(k,n,j,m,l){this.clearUpdateTimeout()},ownedByCurrUser:function(){if(!Galaxy||!Galaxy.currUser){return false}if(Galaxy.currUser.isAnonymous()||Galaxy.currUser.id!==this.get("user_id")){return false}return true},contentsCount:function(){return _.reduce(_.values(this.get("state_details")),function(j,k){return j+k},0)},searchAttributes:["name","annotation","tags"],searchAliases:{title:"name",tag:"tags"},checkForUpdates:function(j){if(this.contents.running().length){this.setUpdateTimeout()}else{this.trigger("ready");if(_.isFunction(j)){j.call(this)}}return this},setUpdateTimeout:function(j){j=j||e.UPDATE_DELAY;var k=this;this.clearUpdateTimeout();this.updateTimeoutId=setTimeout(function(){k.refresh()},j);return this.updateTimeoutId},clearUpdateTimeout:function(){if(this.updateTimeoutId){clearTimeout(this.updateTimeoutId);this.updateTimeoutId=null}},refresh:function(k,j){k=k||[];j=j||{};var l=this;j.data=j.data||{};if(k.length){j.data.details=k.join(",")}var m=this.contents.fetch(j);m.done(function(n){l.checkForUpdates(function(){this.fetch()})});return m},_delete:function(j){if(this.get("deleted")){return jQuery.when()}return this.save({deleted:true},j)},purge:function(j){if(this.get("purged")){return jQuery.when()}return this.save({deleted:true,purged:true},j)},undelete:function(j){if(!this.get("deleted")){return jQuery.when()}return this.save({deleted:false},j)},copy:function(m,k){m=(m!==undefined)?(m):(true);if(!this.id){throw new Error("You must set the history ID before copying it.")}var j={history_id:this.id};if(m){j.current=true}if(k){j.name=k}var l=this,n=jQuery.post(this.urlRoot,j);if(m){return n.then(function(o){var p=new e(o);return p.setAsCurrent().done(function(){l.trigger("copied",l,o)})})}return n.done(function(o){l.trigger("copied",l,o)})},setAsCurrent:function(){var j=this,k=jQuery.getJSON("/history/set_as_current?id="+this.id);k.done(function(){j.trigger("set-as-current",j)});return k},toString:function(){return"History("+this.get("id")+","+this.get("name")+")"}}));e.UPDATE_DELAY=4000;e.getHistoryData=function c(j,v){v=v||{};var r=v.detailIdsFn||[];var m=v.hdcaDetailIds||[];var s=jQuery.Deferred(),p=null;function k(w){if(j==="current"){return jQuery.getJSON(galaxy_config.root+"history/current_history_json")}return jQuery.ajax(galaxy_config.root+"api/histories/"+j)}function o(w){return w&&w.empty}function q(x){if(o(x)){return[]}if(_.isFunction(r)){r=r(x)}if(_.isFunction(m)){m=m(x)}var w={};if(r.length){w.dataset_details=r.join(",")}if(m.length){w.dataset_collection_details=m.join(",")}return jQuery.ajax(galaxy_config.root+"api/histories/"+x.id+"/contents",{data:w})}var t=v.historyFn||k,u=v.contentsFn||q;var n=t(j);n.done(function(w){p=w;s.notify({status:"history data retrieved",historyJSON:p})});n.fail(function(y,w,x){s.reject(y,"loading the history")});var l=n.then(u);l.then(function(w){s.notify({status:"contents data retrieved",historyJSON:p,contentsJSON:w});s.resolve(p,w)});l.fail(function(y,w,x){s.reject(y,"loading the contents",{history:p})});return s};var f=Backbone.Collection.extend(i.LoggableMixin).extend({model:e,urlRoot:(window.galaxy_config?galaxy_config.root:"/")+"api/histories",initialize:function(k,j){j=j||{};this.log("HistoryCollection.initialize",arguments);this.includeDeleted=j.includeDeleted||false;this.setUpListeners()},setUpListeners:function a(){var j=this;this.on("change:deleted",function(k){this.debug("change:deleted",j.includeDeleted,k.get("deleted"));if(!j.includeDeleted&&k.get("deleted")){j.remove(k)}});this.on("copied",function(k,l){this.unshift(new e(l,[]))})},create:function g(m,k,j,l){var o=this,n=jQuery.getJSON(galaxy_config.root+"history/create_new_current");return n.done(function(p){var q=new e(p,[],j||{});o.unshift(q);o.trigger("new-current")})},toString:function b(){return"HistoryCollection("+this.length+")"}});return{History:e,HistoryCollection:f}});
\ No newline at end of file
+define(["mvc/history/history-contents","mvc/base-mvc","utils/localization"],function(h,i,d){var e=Backbone.Model.extend(i.LoggableMixin).extend(i.mixin(i.SearchableModelMixin,{defaults:{model_class:"History",id:null,name:"Unnamed History",state:"new",diskSize:0,deleted:false},urlRoot:galaxy_config.root+"api/histories",initialize:function(k,l,j){j=j||{};this.logger=j.logger||null;this.log(this+".initialize:",k,l,j);this.log("creating history contents:",l);this.contents=new h.HistoryContents(l||[],{historyId:this.get("id")});this._setUpListeners();this.updateTimeoutId=null},_setUpListeners:function(){this.on("error",function(k,n,j,m,l){this.errorHandler(k,n,j,m,l)});if(this.contents){this.listenTo(this.contents,"error",function(){this.trigger.apply(this,["error:contents"].concat(jQuery.makeArray(arguments)))})}this.on("change:id",function(k,j){if(this.contents){this.contents.historyId=j}},this)},errorHandler:function(k,n,j,m,l){this.clearUpdateTimeout()},ownedByCurrUser:function(){if(!Galaxy||!Galaxy.currUser){return false}if(Galaxy.currUser.isAnonymous()||Galaxy.currUser.id!==this.get("user_id")){return false}return true},contentsCount:function(){return _.reduce(_.values(this.get("state_details")),function(j,k){return j+k},0)},searchAttributes:["name","annotation","tags"],searchAliases:{title:"name",tag:"tags"},checkForUpdates:function(j){if(this.contents.running().length){this.setUpdateTimeout()}else{this.trigger("ready");if(_.isFunction(j)){j.call(this)}}return this},setUpdateTimeout:function(j){j=j||e.UPDATE_DELAY;var k=this;this.clearUpdateTimeout();this.updateTimeoutId=setTimeout(function(){k.refresh()},j);return this.updateTimeoutId},clearUpdateTimeout:function(){if(this.updateTimeoutId){clearTimeout(this.updateTimeoutId);this.updateTimeoutId=null}},refresh:function(k,j){k=k||[];j=j||{};var l=this;j.data=j.data||{};if(k.length){j.data.details=k.join(",")}var m=this.contents.fetch(j);m.done(function(n){l.checkForUpdates(function(){this.fetch()})});return m},_delete:function(j){if(this.get("deleted")){return jQuery.when()}return this.save({deleted:true},j)},purge:function(j){if(this.get("purged")){return jQuery.when()}return this.save({deleted:true,purged:true},j)},undelete:function(j){if(!this.get("deleted")){return jQuery.when()}return this.save({deleted:false},j)},copy:function(m,k){m=(m!==undefined)?(m):(true);if(!this.id){throw new Error("You must set the history ID before copying it.")}var j={history_id:this.id};if(m){j.current=true}if(k){j.name=k}var l=this,n=jQuery.post(this.urlRoot,j);if(m){return n.then(function(o){var p=new e(o);return p.setAsCurrent().done(function(){l.trigger("copied",l,o)})})}return n.done(function(o){l.trigger("copied",l,o)})},setAsCurrent:function(){var j=this,k=jQuery.getJSON(galaxy_config.root+"history/set_as_current?id="+this.id);k.done(function(){j.trigger("set-as-current",j)});return k},toString:function(){return"History("+this.get("id")+","+this.get("name")+")"}}));e.UPDATE_DELAY=4000;e.getHistoryData=function c(j,v){v=v||{};var r=v.detailIdsFn||[];var m=v.hdcaDetailIds||[];var s=jQuery.Deferred(),p=null;function k(w){if(j==="current"){return jQuery.getJSON(galaxy_config.root+"history/current_history_json")}return jQuery.ajax(galaxy_config.root+"api/histories/"+j)}function o(w){return w&&w.empty}function q(x){if(o(x)){return[]}if(_.isFunction(r)){r=r(x)}if(_.isFunction(m)){m=m(x)}var w={};if(r.length){w.dataset_details=r.join(",")}if(m.length){w.dataset_collection_details=m.join(",")}return jQuery.ajax(galaxy_config.root+"api/histories/"+x.id+"/contents",{data:w})}var t=v.historyFn||k,u=v.contentsFn||q;var n=t(j);n.done(function(w){p=w;s.notify({status:"history data retrieved",historyJSON:p})});n.fail(function(y,w,x){s.reject(y,"loading the history")});var l=n.then(u);l.then(function(w){s.notify({status:"contents data retrieved",historyJSON:p,contentsJSON:w});s.resolve(p,w)});l.fail(function(y,w,x){s.reject(y,"loading the contents",{history:p})});return s};var f=Backbone.Collection.extend(i.LoggableMixin).extend({model:e,urlRoot:(window.galaxy_config?galaxy_config.root:"/")+"api/histories",initialize:function(k,j){j=j||{};this.log("HistoryCollection.initialize",arguments);this.includeDeleted=j.includeDeleted||false;this.setUpListeners()},setUpListeners:function a(){var j=this;this.on("change:deleted",function(k){this.debug("change:deleted",j.includeDeleted,k.get("deleted"));if(!j.includeDeleted&&k.get("deleted")){j.remove(k)}});this.on("copied",function(k,l){this.unshift(new e(l,[]))})},create:function g(m,k,j,l){var o=this,n=jQuery.getJSON(galaxy_config.root+"history/create_new_current");return n.done(function(p){var q=new e(p,[],j||{});o.unshift(q);o.trigger("new-current")})},toString:function b(){return"HistoryCollection("+this.length+")"}});return{History:e,HistoryCollection:f}});
\ No newline at end of file
diff -r 28113eeee212db2eef9cf4304abe9c3b2a92abcd -r bfd4635011e39aa210b2b1498dd65831dd2a365e static/scripts/packed/mvc/library/library-dataset-view.js
--- a/static/scripts/packed/mvc/library/library-dataset-view.js
+++ b/static/scripts/packed/mvc/library/library-dataset-view.js
@@ -1,1 +1,1 @@
-define(["libs/toastr","mvc/library/library-model","mvc/ui/ui-select"],function(d,c,b){var a=Backbone.View.extend({el:"#center",model:null,options:{},events:{"click .toolbtn_modify_dataset":"enableModification","click .toolbtn_cancel_modifications":"render","click .toolbtn-download-dataset":"downloadDataset","click .toolbtn-import-dataset":"importIntoHistory","click .toolbtn-share-dataset":"shareDataset","click .btn-copy-link-to-clipboard":"copyToClipboard","click .btn-make-private":"makeDatasetPrivate","click .btn-remove-restrictions":"removeDatasetRestrictions","click .toolbtn_save_permissions":"savePermissions","click .toolbtn_save_modifications":"comingSoon",},initialize:function(e){this.options=_.extend(this.options,e);if(this.options.id){this.fetchDataset()}},fetchDataset:function(e){this.options=_.extend(this.options,e);this.model=new c.Item({id:this.options.id});var f=this;this.model.fetch({success:function(){if(f.options.show_permissions){f.showPermissions()}else{if(f.options.show_version){f.fetchVersion()}else{f.render()}}},error:function(h,g){if(typeof g.responseJSON!=="undefined"){d.error(g.responseJSON.err_msg+" Click this to go back.","",{onclick:function(){Galaxy.libraries.library_router.back()}})}else{d.error("An error ocurred. Click this to go back.","",{onclick:function(){Galaxy.libraries.library_router.back()}})}}})},render:function(e){this.options=_.extend(this.options,e);$(".tooltip").remove();var f=this.templateDataset();this.$el.html(f({item:this.model}));$(".peek").html(this.model.get("peek"));$("#center [data-toggle]").tooltip()},fetchVersion:function(e){this.options=_.extend(this.options,e);that=this;if(!this.options.ldda_id){this.render();d.error("Library dataset version requested but no id provided.")}else{this.ldda=new c.Ldda({id:this.options.ldda_id});this.ldda.url=this.ldda.urlRoot+this.model.id+"/versions/"+this.ldda.id;this.ldda.fetch({success:function(){that.renderVersion()},error:function(g,f){if(typeof f.responseJSON!=="undefined"){d.error(f.responseJSON.err_msg)}else{d.error("An error ocurred.")}}})}},renderVersion:function(){$(".tooltip").remove();var e=this.templateVersion();this.$el.html(e({item:this.model,ldda:this.ldda}));$(".peek").html(this.ldda.get("peek"))},enableModification:function(){$(".tooltip").remove();var e=this.templateModifyDataset();this.$el.html(e({item:this.model}));$(".peek").html(this.model.get("peek"));$("#center [data-toggle]").tooltip()},downloadDataset:function(){var e="/api/libraries/datasets/download/uncompressed";var f={ld_ids:this.id};this.processDownload(e,f)},processDownload:function(f,g,h){if(f&&g){g=typeof g=="string"?g:$.param(g);var e="";$.each(g.split("&"),function(){var i=this.split("=");e+='<input type="hidden" name="'+i[0]+'" value="'+i[1]+'" />'});$('<form action="'+f+'" method="'+(h||"post")+'">'+e+"</form>").appendTo("body").submit().remove();d.info("Your download will begin soon.")}},importIntoHistory:function(){this.refreshUserHistoriesList(function(e){var f=e.templateBulkImportInModal();e.modal=Galaxy.modal;e.modal.show({closing_events:true,title:"Import into History",body:f({histories:e.histories.models}),buttons:{Import:function(){e.importCurrentIntoHistory()},Close:function(){Galaxy.modal.hide()}}})})},refreshUserHistoriesList:function(f){var e=this;this.histories=new c.GalaxyHistories();this.histories.fetch({success:function(g){if(g.length===0){d.warning("You have to create history first. Click this to do so.","",{onclick:function(){window.location="/"}})}else{f(e)}},error:function(h,g){if(typeof g.responseJSON!=="undefined"){d.error(g.responseJSON.err_msg)}else{d.error("An error ocurred.")}}})},importCurrentIntoHistory:function(){var e=$(this.modal.elMain).find("select[name=dataset_import_single] option:selected").val();var f=new c.HistoryItem();f.url=f.urlRoot+e+"/contents";jQuery.getJSON(galaxy_config.root+"history/set_as_current?id="+e);f.save({content:this.id,source:"library"},{success:function(){Galaxy.modal.hide();d.success("Dataset imported. Click this to start analysing it.","",{onclick:function(){window.location="/"}})},error:function(h,g){if(typeof g.responseJSON!=="undefined"){d.error("Dataset not imported. "+g.responseJSON.err_msg)}else{d.error("An error occured. Dataset not imported. Please try again.")}}})},shareDataset:function(){d.info("Feature coming soon.")},goBack:function(){Galaxy.libraries.library_router.back()},showPermissions:function(f){this.options=_.extend(this.options,f);$(".tooltip").remove();if(this.options.fetched_permissions!==undefined){if(this.options.fetched_permissions.access_dataset_roles.length===0){this.model.set({is_unrestricted:true})}else{this.model.set({is_unrestricted:false})}}var h=false;if(Galaxy.currUser){h=Galaxy.currUser.isAdmin()}var g=this.templateDatasetPermissions();this.$el.html(g({item:this.model,is_admin:h}));var e=this;if(this.options.fetched_permissions===undefined){$.get("/api/libraries/datasets/"+e.id+"/permissions?scope=current").done(function(i){e.prepareSelectBoxes({fetched_permissions:i,is_admin:h})}).fail(function(){d.error("An error occurred while attempting to fetch dataset permissions.")})}else{this.prepareSelectBoxes({is_admin:h})}$("#center [data-toggle]").tooltip();$("#center").css("overflow","auto")},prepareSelectBoxes:function(r){this.options=_.extend(this.options,r);var s=this.options.fetched_permissions;var k=this.options.is_admin;var q=this;var m=[];for(var h=0;h<s.access_dataset_roles.length;h++){m.push(s.access_dataset_roles[h]+":"+s.access_dataset_roles[h])}var f=[];for(var h=0;h<s.modify_item_roles.length;h++){f.push(s.modify_item_roles[h]+":"+s.modify_item_roles[h])}var g=[];for(var h=0;h<s.manage_dataset_roles.length;h++){g.push(s.manage_dataset_roles[h]+":"+s.manage_dataset_roles[h])}if(k){var o={minimumInputLength:0,css:"access_perm",multiple:true,placeholder:"Click to select a role",container:q.$el.find("#access_perm"),ajax:{url:"/api/libraries/datasets/"+q.id+"/permissions?scope=available",dataType:"json",quietMillis:100,data:function(i,t){return{q:i,page_limit:10,page:t}},results:function(u,t){var i=(t*10)<u.total;return{results:u.roles,more:i}}},formatResult:function j(i){return i.name+" type: "+i.type},formatSelection:function e(i){return i.name},initSelection:function(i,u){var t=[];$(i.val().split(",")).each(function(){var v=this.split(":");t.push({id:v[1],name:v[1]})});u(t)},initialData:m.join(","),dropdownCssClass:"bigdrop"};var l={minimumInputLength:0,css:"modify_perm",multiple:true,placeholder:"Click to select a role",container:q.$el.find("#modify_perm"),ajax:{url:"/api/libraries/datasets/"+q.id+"/permissions?scope=available",dataType:"json",quietMillis:100,data:function(i,t){return{q:i,page_limit:10,page:t}},results:function(u,t){var i=(t*10)<u.total;return{results:u.roles,more:i}}},formatResult:function j(i){return i.name+" type: "+i.type},formatSelection:function e(i){return i.name},initSelection:function(i,u){var t=[];$(i.val().split(",")).each(function(){var v=this.split(":");t.push({id:v[1],name:v[1]})});u(t)},initialData:f.join(","),dropdownCssClass:"bigdrop"};var p={minimumInputLength:0,css:"manage_perm",multiple:true,placeholder:"Click to select a role",container:q.$el.find("#manage_perm"),ajax:{url:"/api/libraries/datasets/"+q.id+"/permissions?scope=available",dataType:"json",quietMillis:100,data:function(i,t){return{q:i,page_limit:10,page:t}},results:function(u,t){var i=(t*10)<u.total;return{results:u.roles,more:i}}},formatResult:function j(i){return i.name+" type: "+i.type},formatSelection:function e(i){return i.name},initSelection:function(i,u){var t=[];$(i.val().split(",")).each(function(){var v=this.split(":");t.push({id:v[1],name:v[1]})});u(t)},initialData:g.join(","),dropdownCssClass:"bigdrop"};q.accessSelectObject=new b.View(o);q.modifySelectObject=new b.View(l);q.manageSelectObject=new b.View(p)}else{var n=q.templateAccessSelect();$.get("/api/libraries/datasets/"+q.id+"/permissions?scope=available",function(i){$(".access_perm").html(n({options:i.roles}));q.accessSelectObject=$("#access_select").select2()}).fail(function(){d.error("An error occurred while attempting to fetch dataset permissions.")})}},comingSoon:function(){d.warning("Feature coming soon.")},copyToClipboard:function(){var e=Backbone.history.location.href;if(e.lastIndexOf("/permissions")!==-1){e=e.substr(0,e.lastIndexOf("/permissions"))}window.prompt("Copy to clipboard: Ctrl+C, Enter",e)},makeDatasetPrivate:function(){var e=this;$.post("/api/libraries/datasets/"+e.id+"/permissions?action=make_private").done(function(f){e.model.set({is_unrestricted:false});e.showPermissions({fetched_permissions:f});d.success("The dataset is now private to you.")}).fail(function(){d.error("An error occurred while attempting to make dataset private.")})},removeDatasetRestrictions:function(){var e=this;$.post("/api/libraries/datasets/"+e.id+"/permissions?action=remove_restrictions").done(function(f){e.model.set({is_unrestricted:true});e.showPermissions({fetched_permissions:f});d.success("Access to this dataset is now unrestricted.")}).fail(function(){d.error("An error occurred while attempting to make dataset unrestricted.")})},savePermissions:function(e){var n=this;var k=this.accessSelectObject.$el.select2("data");var f=this.manageSelectObject.$el.select2("data");var m=this.modifySelectObject.$el.select2("data");var g=[];var j=[];var l=[];for(var h=k.length-1;h>=0;h--){g.push(k[h].id)}for(var h=f.length-1;h>=0;h--){j.push(f[h].id)}for(var h=m.length-1;h>=0;h--){l.push(m[h].id)}$.post("/api/libraries/datasets/"+n.id+"/permissions?action=set_permissions",{"access_ids[]":g,"manage_ids[]":j,"modify_ids[]":l,}).done(function(i){n.showPermissions({fetched_permissions:i});d.success("Permissions saved.")}).fail(function(){d.error("An error occurred while attempting to set dataset permissions.")})},templateDataset:function(){var e=[];e.push('<div class="library_style_container">');e.push(' <div id="library_toolbar">');e.push(' <button data-toggle="tooltip" data-placement="top" title="Download dataset" class="btn btn-default toolbtn-download-dataset primary-button" type="button"><span class="fa fa-download"></span> Download</span></button>');e.push(' <button data-toggle="tooltip" data-placement="top" title="Import dataset into history" class="btn btn-default toolbtn-import-dataset primary-button" type="button"><span class="fa fa-book"></span> to History</span></button>');e.push(' <% if (item.get("can_user_modify")) { %>');e.push(' <button data-toggle="tooltip" data-placement="top" title="Modify library item" class="btn btn-default toolbtn_modify_dataset primary-button" type="button"><span class="fa fa-pencil"></span> Modify</span></button>');e.push(" <% } %>");e.push(' <% if (item.get("can_user_manage")) { %>');e.push(' <a href="#folders/<%- item.get("folder_id") %>/datasets/<%- item.id %>/permissions"><button data-toggle="tooltip" data-placement="top" title="Manage permissions" class="btn btn-default toolbtn_change_permissions primary-button" type="button"><span class="fa fa-group"></span> Permissions</span></button></a>');e.push(" <% } %>");e.push(" </div>");e.push('<ol class="breadcrumb">');e.push(' <li><a title="Return to the list of libraries" href="#">Libraries</a></li>');e.push(' <% _.each(item.get("full_path"), function(path_item) { %>');e.push(" <% if (path_item[0] != item.id) { %>");e.push(' <li><a title="Return to this folder" href="#/folders/<%- path_item[0] %>"><%- path_item[1] %></a></li> ');e.push("<% } else { %>");e.push(' <li class="active"><span title="You are here"><%- path_item[1] %></span></li>');e.push(" <% } %>");e.push(" <% }); %>");e.push("</ol>");e.push('<% if (item.get("is_unrestricted")) { %>');e.push(' <div class="alert alert-info">');e.push(" This dataset is unrestricted so everybody can access it. Just share the URL of this page. ");e.push(' <button data-toggle="tooltip" data-placement="top" title="Copy to clipboard" class="btn btn-default btn-copy-link-to-clipboard primary-button" type="button"><span class="fa fa-clipboard"></span> To Clipboard</span></button> ');e.push(" </div>");e.push("<% } %>");e.push('<div class="dataset_table">');e.push(' <table class="grid table table-striped table-condensed">');e.push(" <tr>");e.push(' <th scope="row" id="id_row" data-id="<%= _.escape(item.get("ldda_id")) %>">Name</th>');e.push(' <td><%= _.escape(item.get("name")) %></td>');e.push(" </tr>");e.push(' <% if (item.get("file_ext")) { %>');e.push(" <tr>");e.push(' <th scope="row">Data type</th>');e.push(' <td><%= _.escape(item.get("file_ext")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(' <% if (item.get("genome_build")) { %>');e.push(" <tr>");e.push(' <th scope="row">Genome build</th>');e.push(' <td><%= _.escape(item.get("genome_build")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(' <% if (item.get("file_size")) { %>');e.push(" <tr>");e.push(' <th scope="row">Size</th>');e.push(' <td><%= _.escape(item.get("file_size")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(' <% if (item.get("date_uploaded")) { %>');e.push(" <tr>");e.push(' <th scope="row">Date uploaded (UTC)</th>');e.push(' <td><%= _.escape(item.get("date_uploaded")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(' <% if (item.get("uploaded_by")) { %>');e.push(" <tr>");e.push(' <th scope="row">Uploaded by</th>');e.push(' <td><%= _.escape(item.get("uploaded_by")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(' <% if (item.get("metadata_data_lines")) { %>');e.push(" <tr>");e.push(' <th scope="row">Data Lines</th>');e.push(' <td scope="row"><%= _.escape(item.get("metadata_data_lines")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(' <% if (item.get("metadata_comment_lines")) { %>');e.push(" <tr>");e.push(' <th scope="row">Comment Lines</th>');e.push(' <td scope="row"><%= _.escape(item.get("metadata_comment_lines")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(' <% if (item.get("metadata_columns")) { %>');e.push(" <tr>");e.push(' <th scope="row">Number of Columns</th>');e.push(' <td scope="row"><%= _.escape(item.get("metadata_columns")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(' <% if (item.get("metadata_column_types")) { %>');e.push(" <tr>");e.push(' <th scope="row">Column Types</th>');e.push(' <td scope="row"><%= _.escape(item.get("metadata_column_types")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(' <% if (item.get("message")) { %>');e.push(" <tr>");e.push(' <th scope="row">Message</th>');e.push(' <td scope="row"><%= _.escape(item.get("message")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(' <% if (item.get("misc_blurb")) { %>');e.push(" <tr>");e.push(' <th scope="row">Miscellaneous blurb</th>');e.push(' <td scope="row"><%= _.escape(item.get("misc_blurb")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(' <% if (item.get("misc_info")) { %>');e.push(" <tr>");e.push(' <th scope="row">Miscellaneous information</th>');e.push(' <td scope="row"><%= _.escape(item.get("misc_info")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(" </table>");e.push(" <div>");e.push(' <pre class="peek">');e.push(" </pre>");e.push(" </div>");e.push(' <% if (item.get("has_versions")) { %>');e.push(" <div>");e.push(" <h3>Expired versions:</h3>");e.push(" <ul>");e.push(' <% _.each(item.get("expired_versions"), function(version) { %>');e.push(' <li><a title="See details of this version" href="#folders/<%- item.get("folder_id") %>/datasets/<%- item.id %>/versions/<%- version[0] %>"><%- version[1] %></a></li>');e.push(" <% }) %>");e.push(" <ul>");e.push(" </div>");e.push(" <% } %>");e.push("</div>");e.push("</div>");return _.template(e.join(""))},templateVersion:function(){var e=[];e.push('<div class="library_style_container">');e.push(' <div id="library_toolbar">');e.push(' <a href="#folders/<%- item.get("folder_id") %>/datasets/<%- item.id %>"><button data-toggle="tooltip" data-placement="top" title="Go to latest dataset" class="btn btn-default primary-button" type="button"><span class="fa fa-caret-left fa-lg"></span> Latest dataset</span></button><a>');e.push(" </div>");e.push('<ol class="breadcrumb">');e.push(' <li><a title="Return to the list of libraries" href="#">Libraries</a></li>');e.push(' <% _.each(item.get("full_path"), function(path_item) { %>');e.push(" <% if (path_item[0] != item.id) { %>");e.push(' <li><a title="Return to this folder" href="#/folders/<%- path_item[0] %>"><%- path_item[1] %></a></li> ');e.push("<% } else { %>");e.push(' <li class="active"><span title="You are here"><%- path_item[1] %></span></li>');e.push(" <% } %>");e.push(" <% }); %>");e.push("</ol>");e.push(' <div class="alert alert-warning">This is an expired version of the library dataset: <%= _.escape(item.get("name")) %></div>');e.push('<div class="dataset_table">');e.push(' <table class="grid table table-striped table-condensed">');e.push(" <tr>");e.push(' <th scope="row" id="id_row" data-id="<%= _.escape(ldda.id) %>">Name</th>');e.push(' <td><%= _.escape(ldda.get("name")) %></td>');e.push(" </tr>");e.push(' <% if (ldda.get("file_ext")) { %>');e.push(" <tr>");e.push(' <th scope="row">Data type</th>');e.push(' <td><%= _.escape(ldda.get("file_ext")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(' <% if (ldda.get("genome_build")) { %>');e.push(" <tr>");e.push(' <th scope="row">Genome build</th>');e.push(' <td><%= _.escape(ldda.get("genome_build")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(' <% if (ldda.get("file_size")) { %>');e.push(" <tr>");e.push(' <th scope="row">Size</th>');e.push(' <td><%= _.escape(ldda.get("file_size")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(' <% if (ldda.get("date_uploaded")) { %>');e.push(" <tr>");e.push(' <th scope="row">Date uploaded (UTC)</th>');e.push(' <td><%= _.escape(ldda.get("date_uploaded")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(' <% if (ldda.get("uploaded_by")) { %>');e.push(" <tr>");e.push(' <th scope="row">Uploaded by</th>');e.push(' <td><%= _.escape(ldda.get("uploaded_by")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(' <% if (ldda.get("metadata_data_lines")) { %>');e.push(" <tr>");e.push(' <th scope="row">Data Lines</th>');e.push(' <td scope="row"><%= _.escape(ldda.get("metadata_data_lines")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(' <% if (ldda.get("metadata_comment_lines")) { %>');e.push(" <tr>");e.push(' <th scope="row">Comment Lines</th>');e.push(' <td scope="row"><%= _.escape(ldda.get("metadata_comment_lines")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(' <% if (ldda.get("metadata_columns")) { %>');e.push(" <tr>");e.push(' <th scope="row">Number of Columns</th>');e.push(' <td scope="row"><%= _.escape(ldda.get("metadata_columns")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(' <% if (ldda.get("metadata_column_types")) { %>');e.push(" <tr>");e.push(' <th scope="row">Column Types</th>');e.push(' <td scope="row"><%= _.escape(ldda.get("metadata_column_types")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(' <% if (ldda.get("message")) { %>');e.push(" <tr>");e.push(' <th scope="row">Message</th>');e.push(' <td scope="row"><%= _.escape(ldda.get("message")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(' <% if (ldda.get("misc_blurb")) { %>');e.push(" <tr>");e.push(' <th scope="row">Miscellaneous blurb</th>');e.push(' <td scope="row"><%= _.escape(ldda.get("misc_blurb")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(' <% if (ldda.get("misc_info")) { %>');e.push(" <tr>");e.push(' <th scope="row">Miscellaneous information</th>');e.push(' <td scope="row"><%= _.escape(ldda.get("misc_info")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(" </table>");e.push(" <div>");e.push(' <pre class="peek">');e.push(" </pre>");e.push(" </div>");e.push("</div>");e.push("</div>");return _.template(e.join(""))},templateModifyDataset:function(){var e=[];e.push('<div class="library_style_container">');e.push(' <div id="library_toolbar">');e.push(' <button data-toggle="tooltip" data-placement="top" title="Cancel modifications" class="btn btn-default toolbtn_cancel_modifications primary-button" type="button"><span class="fa fa-times"></span> Cancel</span></button>');e.push(' <button data-toggle="tooltip" data-placement="top" title="Save modifications" class="btn btn-default toolbtn_save_modifications primary-button" type="button"><span class="fa fa-floppy-o"></span> Save</span></button>');e.push(" </div>");e.push('<ol class="breadcrumb">');e.push(' <li><a title="Return to the list of libraries" href="#">Libraries</a></li>');e.push(' <% _.each(item.get("full_path"), function(path_item) { %>');e.push(" <% if (path_item[0] != item.id) { %>");e.push(' <li><a title="Return to this folder" href="#/folders/<%- path_item[0] %>"><%- path_item[1] %></a></li> ');e.push("<% } else { %>");e.push(' <li class="active"><span title="You are here"><%- path_item[1] %></span></li>');e.push(" <% } %>");e.push(" <% }); %>");e.push("</ol>");e.push('<div class="dataset_table">');e.push('<p>For more editing options please import the dataset to history and use "Edit attributes" on it.</p>');e.push(' <table class="grid table table-striped table-condensed">');e.push(" <tr>");e.push(' <th scope="row" id="id_row" data-id="<%= _.escape(item.get("ldda_id")) %>">Name</th>');e.push(' <td><input class="input_dataset_name form-control" type="text" placeholder="name" value="<%= _.escape(item.get("name")) %>"></td>');e.push(" </tr>");e.push(" <tr>");e.push(' <th scope="row">Data type</th>');e.push(' <td><%= _.escape(item.get("file_ext")) %></td>');e.push(" </tr>");e.push(" <tr>");e.push(' <th scope="row">Genome build</th>');e.push(' <td><%= _.escape(item.get("genome_build")) %></td>');e.push(" </tr>");e.push(" <tr>");e.push(' <th scope="row">Size</th>');e.push(' <td><%= _.escape(item.get("file_size")) %></td>');e.push(" </tr>");e.push(" <tr>");e.push(' <th scope="row">Date uploaded (UTC)</th>');e.push(' <td><%= _.escape(item.get("date_uploaded")) %></td>');e.push(" </tr>");e.push(" <tr>");e.push(' <th scope="row">Uploaded by</th>');e.push(' <td><%= _.escape(item.get("uploaded_by")) %></td>');e.push(" </tr>");e.push(' <tr scope="row">');e.push(' <th scope="row">Data Lines</th>');e.push(' <td scope="row"><%= _.escape(item.get("metadata_data_lines")) %></td>');e.push(" </tr>");e.push(' <th scope="row">Comment Lines</th>');e.push(' <% if (item.get("metadata_comment_lines") === "") { %>');e.push(' <td scope="row"><%= _.escape(item.get("metadata_comment_lines")) %></td>');e.push(" <% } else { %>");e.push(' <td scope="row">unknown</td>');e.push(" <% } %>");e.push(" </tr>");e.push(" <tr>");e.push(' <th scope="row">Number of Columns</th>');e.push(' <td scope="row"><%= _.escape(item.get("metadata_columns")) %></td>');e.push(" </tr>");e.push(" <tr>");e.push(' <th scope="row">Column Types</th>');e.push(' <td scope="row"><%= _.escape(item.get("metadata_column_types")) %></td>');e.push(" </tr>");e.push(" <tr>");e.push(' <th scope="row">Message</th>');e.push(' <td scope="row"><%= _.escape(item.get("message")) %></td>');e.push(" </tr>");e.push(" <tr>");e.push(' <th scope="row">Miscellaneous information</th>');e.push(' <td scope="row"><%= _.escape(item.get("misc_info")) %></td>');e.push(" </tr>");e.push(" <tr>");e.push(' <th scope="row">Miscellaneous blurb</th>');e.push(' <td scope="row"><%= _.escape(item.get("misc_blurb")) %></td>');e.push(" </tr>");e.push(" </table>");e.push("<div>");e.push(' <pre class="peek">');e.push(" </pre>");e.push("</div>");e.push("</div>");e.push("</div>");return _.template(e.join(""))},templateDatasetPermissions:function(){var e=[];e.push('<div class="library_style_container">');e.push(' <div id="library_toolbar">');e.push(' <a href="#folders/<%- item.get("folder_id") %>"><button data-toggle="tooltip" data-placement="top" title="Go back to containing folder" class="btn btn-default primary-button" type="button"><span class="fa fa-folder-open-o"></span> Containing Folder</span></button></a>');e.push(' <a href="#folders/<%- item.get("folder_id") %>/datasets/<%- item.id %>"><button data-toggle="tooltip" data-placement="top" title="Go back to dataset" class="btn btn-default primary-button" type="button"><span class="fa fa-file-o"></span> Dataset Details</span></button><a>');e.push(" </div>");e.push('<ol class="breadcrumb">');e.push(' <li><a title="Return to the list of libraries" href="#">Libraries</a></li>');e.push(' <% _.each(item.get("full_path"), function(path_item) { %>');e.push(" <% if (path_item[0] != item.id) { %>");e.push(' <li><a title="Return to this folder" href="#/folders/<%- path_item[0] %>"><%- path_item[1] %></a></li> ');e.push("<% } else { %>");e.push(' <li class="active"><span title="You are here"><%- path_item[1] %></span></li>');e.push(" <% } %>");e.push(" <% }); %>");e.push("</ol>");e.push('<h1>Dataset: <%= _.escape(item.get("name")) %></h1>');e.push('<div class="alert alert-warning">');e.push("<% if (is_admin) { %>");e.push("You are logged in as an <strong>administrator</strong> therefore you can manage any dataset on this Galaxy instance. Please make sure you understand the consequences.");e.push("<% } else { %>");e.push("You can assign any number of roles to any of the following permission types. However please read carefully the implications of such actions.");e.push("<% } %>");e.push("</div>");e.push('<div class="dataset_table">');e.push("<h2>Library-related permissions</h2>");e.push("<h4>Roles that can modify the library item</h4>");e.push('<div id="modify_perm" class="modify_perm roles-selection"></div>');e.push('<div class="alert alert-info roles-selection">User with <strong>any</strong> of these roles can modify name, metadata, and other information about this library item.</div>');e.push("<hr/>");e.push("<h2>Dataset-related permissions</h2>");e.push('<div class="alert alert-warning">Changes made below will affect <strong>every</strong> library item that was created from this dataset and also every history this dataset is part of.</div>');e.push('<% if (!item.get("is_unrestricted")) { %>');e.push(" <p>You can remove all access restrictions on this dataset. ");e.push(' <button data-toggle="tooltip" data-placement="top" title="Everybody will be able to access the dataset." class="btn btn-default btn-remove-restrictions primary-button" type="button">');e.push(' <span class="fa fa-globe"> Remove restrictions</span>');e.push(" </button>");e.push(" </p>");e.push("<% } else { %>");e.push(" This dataset is unrestricted so everybody can access it. Just share the URL of this page.");e.push(' <button data-toggle="tooltip" data-placement="top" title="Copy to clipboard" class="btn btn-default btn-copy-link-to-clipboard primary-button" type="button"><span class="fa fa-clipboard"> To Clipboard</span></button> ');e.push(" <p>You can make this dataset private to you. ");e.push(' <button data-toggle="tooltip" data-placement="top" title="Only you will be able to access the dataset." class="btn btn-default btn-make-private primary-button" type="button"><span class="fa fa-key"> Make Private</span></button>');e.push(" </p>");e.push("<% } %>");e.push("<h4>Roles that can access the dataset</h4>");e.push('<div id="access_perm" class="access_perm roles-selection"></div>');e.push('<div class="alert alert-info roles-selection">User has to have <strong>all these roles</strong> in order to access this dataset. Users without access permission <strong>cannot</strong> have other permissions on this dataset. If there are no access roles set on the dataset it is considered <strong>unrestricted</strong>.</div>');e.push("<h4>Roles that can manage permissions on the dataset</h4>");e.push('<div id="manage_perm" class="manage_perm roles-selection"></div>');e.push('<div class="alert alert-info roles-selection">User with <strong>any</strong> of these roles can manage permissions of this dataset. If you remove yourself you will loose the ability manage this dataset unless you are an admin.</div>');e.push('<button data-toggle="tooltip" data-placement="top" title="Save modifications made on this page" class="btn btn-default toolbtn_save_permissions primary-button" type="button"><span class="fa fa-floppy-o"></span> Save</span></button>');e.push("</div>");e.push("</div>");return _.template(e.join(""))},templateBulkImportInModal:function(){var e=[];e.push('<span id="history_modal_combo_bulk" style="width:90%; margin-left: 1em; margin-right: 1em; ">');e.push("Select history: ");e.push('<select id="dataset_import_single" name="dataset_import_single" style="width:50%; margin-bottom: 1em; "> ');e.push(" <% _.each(histories, function(history) { %>");e.push(' <option value="<%= _.escape(history.get("id")) %>"><%= _.escape(history.get("name")) %></option>');e.push(" <% }); %>");e.push("</select>");e.push("</span>");return _.template(e.join(""))},templateAccessSelect:function(){var e=[];e.push('<select id="access_select" multiple>');e.push(" <% _.each(options, function(option) { %>");e.push(' <option value="<%- option.name %>"><%- option.name %></option>');e.push(" <% }); %>");e.push("</select>");return _.template(e.join(""))}});return{LibraryDatasetView:a}});
\ No newline at end of file
+define(["libs/toastr","mvc/library/library-model","mvc/ui/ui-select"],function(d,c,b){var a=Backbone.View.extend({el:"#center",model:null,options:{},events:{"click .toolbtn_modify_dataset":"enableModification","click .toolbtn_cancel_modifications":"render","click .toolbtn-download-dataset":"downloadDataset","click .toolbtn-import-dataset":"importIntoHistory","click .toolbtn-share-dataset":"shareDataset","click .btn-copy-link-to-clipboard":"copyToClipboard","click .btn-make-private":"makeDatasetPrivate","click .btn-remove-restrictions":"removeDatasetRestrictions","click .toolbtn_save_permissions":"savePermissions","click .toolbtn_save_modifications":"comingSoon",},initialize:function(e){this.options=_.extend(this.options,e);if(this.options.id){this.fetchDataset()}},fetchDataset:function(e){this.options=_.extend(this.options,e);this.model=new c.Item({id:this.options.id});var f=this;this.model.fetch({success:function(){if(f.options.show_permissions){f.showPermissions()}else{if(f.options.show_version){f.fetchVersion()}else{f.render()}}},error:function(h,g){if(typeof g.responseJSON!=="undefined"){d.error(g.responseJSON.err_msg+" Click this to go back.","",{onclick:function(){Galaxy.libraries.library_router.back()}})}else{d.error("An error ocurred. Click this to go back.","",{onclick:function(){Galaxy.libraries.library_router.back()}})}}})},render:function(e){this.options=_.extend(this.options,e);$(".tooltip").remove();var f=this.templateDataset();this.$el.html(f({item:this.model}));$(".peek").html(this.model.get("peek"));$("#center [data-toggle]").tooltip()},fetchVersion:function(e){this.options=_.extend(this.options,e);that=this;if(!this.options.ldda_id){this.render();d.error("Library dataset version requested but no id provided.")}else{this.ldda=new c.Ldda({id:this.options.ldda_id});this.ldda.url=this.ldda.urlRoot+this.model.id+"/versions/"+this.ldda.id;this.ldda.fetch({success:function(){that.renderVersion()},error:function(g,f){if(typeof f.responseJSON!=="undefined"){d.error(f.responseJSON.err_msg)}else{d.error("An error ocurred.")}}})}},renderVersion:function(){$(".tooltip").remove();var e=this.templateVersion();this.$el.html(e({item:this.model,ldda:this.ldda}));$(".peek").html(this.ldda.get("peek"))},enableModification:function(){$(".tooltip").remove();var e=this.templateModifyDataset();this.$el.html(e({item:this.model}));$(".peek").html(this.model.get("peek"));$("#center [data-toggle]").tooltip()},downloadDataset:function(){var e=(window.galaxy_config?galaxy_config.root:"/")+"api/libraries/datasets/download/uncompressed";var f={ld_ids:this.id};this.processDownload(e,f)},processDownload:function(f,g,h){if(f&&g){g=typeof g=="string"?g:$.param(g);var e="";$.each(g.split("&"),function(){var i=this.split("=");e+='<input type="hidden" name="'+i[0]+'" value="'+i[1]+'" />'});$('<form action="'+f+'" method="'+(h||"post")+'">'+e+"</form>").appendTo("body").submit().remove();d.info("Your download will begin soon.")}},importIntoHistory:function(){this.refreshUserHistoriesList(function(e){var f=e.templateBulkImportInModal();e.modal=Galaxy.modal;e.modal.show({closing_events:true,title:"Import into History",body:f({histories:e.histories.models}),buttons:{Import:function(){e.importCurrentIntoHistory()},Close:function(){Galaxy.modal.hide()}}})})},refreshUserHistoriesList:function(f){var e=this;this.histories=new c.GalaxyHistories();this.histories.fetch({success:function(g){if(g.length===0){d.warning("You have to create history first. Click this to do so.","",{onclick:function(){window.location="/"}})}else{f(e)}},error:function(h,g){if(typeof g.responseJSON!=="undefined"){d.error(g.responseJSON.err_msg)}else{d.error("An error ocurred.")}}})},importCurrentIntoHistory:function(){var e=$(this.modal.elMain).find("select[name=dataset_import_single] option:selected").val();var f=new c.HistoryItem();f.url=f.urlRoot+e+"/contents";jQuery.getJSON(galaxy_config.root+"history/set_as_current?id="+e);f.save({content:this.id,source:"library"},{success:function(){Galaxy.modal.hide();d.success("Dataset imported. Click this to start analysing it.","",{onclick:function(){window.location="/"}})},error:function(h,g){if(typeof g.responseJSON!=="undefined"){d.error("Dataset not imported. "+g.responseJSON.err_msg)}else{d.error("An error occured. Dataset not imported. Please try again.")}}})},shareDataset:function(){d.info("Feature coming soon.")},goBack:function(){Galaxy.libraries.library_router.back()},showPermissions:function(f){this.options=_.extend(this.options,f);$(".tooltip").remove();if(this.options.fetched_permissions!==undefined){if(this.options.fetched_permissions.access_dataset_roles.length===0){this.model.set({is_unrestricted:true})}else{this.model.set({is_unrestricted:false})}}var h=false;if(Galaxy.currUser){h=Galaxy.currUser.isAdmin()}var g=this.templateDatasetPermissions();this.$el.html(g({item:this.model,is_admin:h}));var e=this;if(this.options.fetched_permissions===undefined){$.get((window.galaxy_config?galaxy_config.root:"/")+"api/libraries/datasets/"+e.id+"/permissions?scope=current").done(function(i){e.prepareSelectBoxes({fetched_permissions:i,is_admin:h})}).fail(function(){d.error("An error occurred while attempting to fetch dataset permissions.")})}else{this.prepareSelectBoxes({is_admin:h})}$("#center [data-toggle]").tooltip();$("#center").css("overflow","auto")},prepareSelectBoxes:function(r){this.options=_.extend(this.options,r);var s=this.options.fetched_permissions;var k=this.options.is_admin;var q=this;var m=[];for(var h=0;h<s.access_dataset_roles.length;h++){m.push(s.access_dataset_roles[h]+":"+s.access_dataset_roles[h])}var f=[];for(var h=0;h<s.modify_item_roles.length;h++){f.push(s.modify_item_roles[h]+":"+s.modify_item_roles[h])}var g=[];for(var h=0;h<s.manage_dataset_roles.length;h++){g.push(s.manage_dataset_roles[h]+":"+s.manage_dataset_roles[h])}if(k){var o={minimumInputLength:0,css:"access_perm",multiple:true,placeholder:"Click to select a role",container:q.$el.find("#access_perm"),ajax:{url:(window.galaxy_config?galaxy_config.root:"/")+"api/libraries/datasets/"+q.id+"/permissions?scope=available",dataType:"json",quietMillis:100,data:function(i,t){return{q:i,page_limit:10,page:t}},results:function(u,t){var i=(t*10)<u.total;return{results:u.roles,more:i}}},formatResult:function j(i){return i.name+" type: "+i.type},formatSelection:function e(i){return i.name},initSelection:function(i,u){var t=[];$(i.val().split(",")).each(function(){var v=this.split(":");t.push({id:v[1],name:v[1]})});u(t)},initialData:m.join(","),dropdownCssClass:"bigdrop"};var l={minimumInputLength:0,css:"modify_perm",multiple:true,placeholder:"Click to select a role",container:q.$el.find("#modify_perm"),ajax:{url:(window.galaxy_config?galaxy_config.root:"/")+"api/libraries/datasets/"+q.id+"/permissions?scope=available",dataType:"json",quietMillis:100,data:function(i,t){return{q:i,page_limit:10,page:t}},results:function(u,t){var i=(t*10)<u.total;return{results:u.roles,more:i}}},formatResult:function j(i){return i.name+" type: "+i.type},formatSelection:function e(i){return i.name},initSelection:function(i,u){var t=[];$(i.val().split(",")).each(function(){var v=this.split(":");t.push({id:v[1],name:v[1]})});u(t)},initialData:f.join(","),dropdownCssClass:"bigdrop"};var p={minimumInputLength:0,css:"manage_perm",multiple:true,placeholder:"Click to select a role",container:q.$el.find("#manage_perm"),ajax:{url:(window.galaxy_config?galaxy_config.root:"/")+"api/libraries/datasets/"+q.id+"/permissions?scope=available",dataType:"json",quietMillis:100,data:function(i,t){return{q:i,page_limit:10,page:t}},results:function(u,t){var i=(t*10)<u.total;return{results:u.roles,more:i}}},formatResult:function j(i){return i.name+" type: "+i.type},formatSelection:function e(i){return i.name},initSelection:function(i,u){var t=[];$(i.val().split(",")).each(function(){var v=this.split(":");t.push({id:v[1],name:v[1]})});u(t)},initialData:g.join(","),dropdownCssClass:"bigdrop"};q.accessSelectObject=new b.View(o);q.modifySelectObject=new b.View(l);q.manageSelectObject=new b.View(p)}else{var n=q.templateAccessSelect();$.get((window.galaxy_config?galaxy_config.root:"/")+"api/libraries/datasets/"+q.id+"/permissions?scope=available",function(i){$(".access_perm").html(n({options:i.roles}));q.accessSelectObject=$("#access_select").select2()}).fail(function(){d.error("An error occurred while attempting to fetch dataset permissions.")})}},comingSoon:function(){d.warning("Feature coming soon.")},copyToClipboard:function(){var e=Backbone.history.location.href;if(e.lastIndexOf("/permissions")!==-1){e=e.substr(0,e.lastIndexOf("/permissions"))}window.prompt("Copy to clipboard: Ctrl+C, Enter",e)},makeDatasetPrivate:function(){var e=this;$.post((window.galaxy_config?galaxy_config.root:"/")+"api/libraries/datasets/"+e.id+"/permissions?action=make_private").done(function(f){e.model.set({is_unrestricted:false});e.showPermissions({fetched_permissions:f});d.success("The dataset is now private to you.")}).fail(function(){d.error("An error occurred while attempting to make dataset private.")})},removeDatasetRestrictions:function(){var e=this;$.post((window.galaxy_config?galaxy_config.root:"/")+"api/libraries/datasets/"+e.id+"/permissions?action=remove_restrictions").done(function(f){e.model.set({is_unrestricted:true});e.showPermissions({fetched_permissions:f});d.success("Access to this dataset is now unrestricted.")}).fail(function(){d.error("An error occurred while attempting to make dataset unrestricted.")})},savePermissions:function(e){var n=this;var k=this.accessSelectObject.$el.select2("data");var f=this.manageSelectObject.$el.select2("data");var m=this.modifySelectObject.$el.select2("data");var g=[];var j=[];var l=[];for(var h=k.length-1;h>=0;h--){g.push(k[h].id)}for(var h=f.length-1;h>=0;h--){j.push(f[h].id)}for(var h=m.length-1;h>=0;h--){l.push(m[h].id)}$.post((window.galaxy_config?galaxy_config.root:"/")+"api/libraries/datasets/"+n.id+"/permissions?action=set_permissions",{"access_ids[]":g,"manage_ids[]":j,"modify_ids[]":l,}).done(function(i){n.showPermissions({fetched_permissions:i});d.success("Permissions saved.")}).fail(function(){d.error("An error occurred while attempting to set dataset permissions.")})},templateDataset:function(){var e=[];e.push('<div class="library_style_container">');e.push(' <div id="library_toolbar">');e.push(' <button data-toggle="tooltip" data-placement="top" title="Download dataset" class="btn btn-default toolbtn-download-dataset primary-button" type="button"><span class="fa fa-download"></span> Download</span></button>');e.push(' <button data-toggle="tooltip" data-placement="top" title="Import dataset into history" class="btn btn-default toolbtn-import-dataset primary-button" type="button"><span class="fa fa-book"></span> to History</span></button>');e.push(' <% if (item.get("can_user_modify")) { %>');e.push(' <button data-toggle="tooltip" data-placement="top" title="Modify library item" class="btn btn-default toolbtn_modify_dataset primary-button" type="button"><span class="fa fa-pencil"></span> Modify</span></button>');e.push(" <% } %>");e.push(' <% if (item.get("can_user_manage")) { %>');e.push(' <a href="#folders/<%- item.get("folder_id") %>/datasets/<%- item.id %>/permissions"><button data-toggle="tooltip" data-placement="top" title="Manage permissions" class="btn btn-default toolbtn_change_permissions primary-button" type="button"><span class="fa fa-group"></span> Permissions</span></button></a>');e.push(" <% } %>");e.push(" </div>");e.push('<ol class="breadcrumb">');e.push(' <li><a title="Return to the list of libraries" href="#">Libraries</a></li>');e.push(' <% _.each(item.get("full_path"), function(path_item) { %>');e.push(" <% if (path_item[0] != item.id) { %>");e.push(' <li><a title="Return to this folder" href="#/folders/<%- path_item[0] %>"><%- path_item[1] %></a></li> ');e.push("<% } else { %>");e.push(' <li class="active"><span title="You are here"><%- path_item[1] %></span></li>');e.push(" <% } %>");e.push(" <% }); %>");e.push("</ol>");e.push('<% if (item.get("is_unrestricted")) { %>');e.push(' <div class="alert alert-info">');e.push(" This dataset is unrestricted so everybody can access it. Just share the URL of this page. ");e.push(' <button data-toggle="tooltip" data-placement="top" title="Copy to clipboard" class="btn btn-default btn-copy-link-to-clipboard primary-button" type="button"><span class="fa fa-clipboard"></span> To Clipboard</span></button> ');e.push(" </div>");e.push("<% } %>");e.push('<div class="dataset_table">');e.push(' <table class="grid table table-striped table-condensed">');e.push(" <tr>");e.push(' <th scope="row" id="id_row" data-id="<%= _.escape(item.get("ldda_id")) %>">Name</th>');e.push(' <td><%= _.escape(item.get("name")) %></td>');e.push(" </tr>");e.push(' <% if (item.get("file_ext")) { %>');e.push(" <tr>");e.push(' <th scope="row">Data type</th>');e.push(' <td><%= _.escape(item.get("file_ext")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(' <% if (item.get("genome_build")) { %>');e.push(" <tr>");e.push(' <th scope="row">Genome build</th>');e.push(' <td><%= _.escape(item.get("genome_build")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(' <% if (item.get("file_size")) { %>');e.push(" <tr>");e.push(' <th scope="row">Size</th>');e.push(' <td><%= _.escape(item.get("file_size")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(' <% if (item.get("date_uploaded")) { %>');e.push(" <tr>");e.push(' <th scope="row">Date uploaded (UTC)</th>');e.push(' <td><%= _.escape(item.get("date_uploaded")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(' <% if (item.get("uploaded_by")) { %>');e.push(" <tr>");e.push(' <th scope="row">Uploaded by</th>');e.push(' <td><%= _.escape(item.get("uploaded_by")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(' <% if (item.get("metadata_data_lines")) { %>');e.push(" <tr>");e.push(' <th scope="row">Data Lines</th>');e.push(' <td scope="row"><%= _.escape(item.get("metadata_data_lines")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(' <% if (item.get("metadata_comment_lines")) { %>');e.push(" <tr>");e.push(' <th scope="row">Comment Lines</th>');e.push(' <td scope="row"><%= _.escape(item.get("metadata_comment_lines")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(' <% if (item.get("metadata_columns")) { %>');e.push(" <tr>");e.push(' <th scope="row">Number of Columns</th>');e.push(' <td scope="row"><%= _.escape(item.get("metadata_columns")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(' <% if (item.get("metadata_column_types")) { %>');e.push(" <tr>");e.push(' <th scope="row">Column Types</th>');e.push(' <td scope="row"><%= _.escape(item.get("metadata_column_types")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(' <% if (item.get("message")) { %>');e.push(" <tr>");e.push(' <th scope="row">Message</th>');e.push(' <td scope="row"><%= _.escape(item.get("message")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(' <% if (item.get("misc_blurb")) { %>');e.push(" <tr>");e.push(' <th scope="row">Miscellaneous blurb</th>');e.push(' <td scope="row"><%= _.escape(item.get("misc_blurb")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(' <% if (item.get("misc_info")) { %>');e.push(" <tr>");e.push(' <th scope="row">Miscellaneous information</th>');e.push(' <td scope="row"><%= _.escape(item.get("misc_info")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(" </table>");e.push(" <div>");e.push(' <pre class="peek">');e.push(" </pre>");e.push(" </div>");e.push(' <% if (item.get("has_versions")) { %>');e.push(" <div>");e.push(" <h3>Expired versions:</h3>");e.push(" <ul>");e.push(' <% _.each(item.get("expired_versions"), function(version) { %>');e.push(' <li><a title="See details of this version" href="#folders/<%- item.get("folder_id") %>/datasets/<%- item.id %>/versions/<%- version[0] %>"><%- version[1] %></a></li>');e.push(" <% }) %>");e.push(" <ul>");e.push(" </div>");e.push(" <% } %>");e.push("</div>");e.push("</div>");return _.template(e.join(""))},templateVersion:function(){var e=[];e.push('<div class="library_style_container">');e.push(' <div id="library_toolbar">');e.push(' <a href="#folders/<%- item.get("folder_id") %>/datasets/<%- item.id %>"><button data-toggle="tooltip" data-placement="top" title="Go to latest dataset" class="btn btn-default primary-button" type="button"><span class="fa fa-caret-left fa-lg"></span> Latest dataset</span></button><a>');e.push(" </div>");e.push('<ol class="breadcrumb">');e.push(' <li><a title="Return to the list of libraries" href="#">Libraries</a></li>');e.push(' <% _.each(item.get("full_path"), function(path_item) { %>');e.push(" <% if (path_item[0] != item.id) { %>");e.push(' <li><a title="Return to this folder" href="#/folders/<%- path_item[0] %>"><%- path_item[1] %></a></li> ');e.push("<% } else { %>");e.push(' <li class="active"><span title="You are here"><%- path_item[1] %></span></li>');e.push(" <% } %>");e.push(" <% }); %>");e.push("</ol>");e.push(' <div class="alert alert-warning">This is an expired version of the library dataset: <%= _.escape(item.get("name")) %></div>');e.push('<div class="dataset_table">');e.push(' <table class="grid table table-striped table-condensed">');e.push(" <tr>");e.push(' <th scope="row" id="id_row" data-id="<%= _.escape(ldda.id) %>">Name</th>');e.push(' <td><%= _.escape(ldda.get("name")) %></td>');e.push(" </tr>");e.push(' <% if (ldda.get("file_ext")) { %>');e.push(" <tr>");e.push(' <th scope="row">Data type</th>');e.push(' <td><%= _.escape(ldda.get("file_ext")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(' <% if (ldda.get("genome_build")) { %>');e.push(" <tr>");e.push(' <th scope="row">Genome build</th>');e.push(' <td><%= _.escape(ldda.get("genome_build")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(' <% if (ldda.get("file_size")) { %>');e.push(" <tr>");e.push(' <th scope="row">Size</th>');e.push(' <td><%= _.escape(ldda.get("file_size")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(' <% if (ldda.get("date_uploaded")) { %>');e.push(" <tr>");e.push(' <th scope="row">Date uploaded (UTC)</th>');e.push(' <td><%= _.escape(ldda.get("date_uploaded")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(' <% if (ldda.get("uploaded_by")) { %>');e.push(" <tr>");e.push(' <th scope="row">Uploaded by</th>');e.push(' <td><%= _.escape(ldda.get("uploaded_by")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(' <% if (ldda.get("metadata_data_lines")) { %>');e.push(" <tr>");e.push(' <th scope="row">Data Lines</th>');e.push(' <td scope="row"><%= _.escape(ldda.get("metadata_data_lines")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(' <% if (ldda.get("metadata_comment_lines")) { %>');e.push(" <tr>");e.push(' <th scope="row">Comment Lines</th>');e.push(' <td scope="row"><%= _.escape(ldda.get("metadata_comment_lines")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(' <% if (ldda.get("metadata_columns")) { %>');e.push(" <tr>");e.push(' <th scope="row">Number of Columns</th>');e.push(' <td scope="row"><%= _.escape(ldda.get("metadata_columns")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(' <% if (ldda.get("metadata_column_types")) { %>');e.push(" <tr>");e.push(' <th scope="row">Column Types</th>');e.push(' <td scope="row"><%= _.escape(ldda.get("metadata_column_types")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(' <% if (ldda.get("message")) { %>');e.push(" <tr>");e.push(' <th scope="row">Message</th>');e.push(' <td scope="row"><%= _.escape(ldda.get("message")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(' <% if (ldda.get("misc_blurb")) { %>');e.push(" <tr>");e.push(' <th scope="row">Miscellaneous blurb</th>');e.push(' <td scope="row"><%= _.escape(ldda.get("misc_blurb")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(' <% if (ldda.get("misc_info")) { %>');e.push(" <tr>");e.push(' <th scope="row">Miscellaneous information</th>');e.push(' <td scope="row"><%= _.escape(ldda.get("misc_info")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(" </table>");e.push(" <div>");e.push(' <pre class="peek">');e.push(" </pre>");e.push(" </div>");e.push("</div>");e.push("</div>");return _.template(e.join(""))},templateModifyDataset:function(){var e=[];e.push('<div class="library_style_container">');e.push(' <div id="library_toolbar">');e.push(' <button data-toggle="tooltip" data-placement="top" title="Cancel modifications" class="btn btn-default toolbtn_cancel_modifications primary-button" type="button"><span class="fa fa-times"></span> Cancel</span></button>');e.push(' <button data-toggle="tooltip" data-placement="top" title="Save modifications" class="btn btn-default toolbtn_save_modifications primary-button" type="button"><span class="fa fa-floppy-o"></span> Save</span></button>');e.push(" </div>");e.push('<ol class="breadcrumb">');e.push(' <li><a title="Return to the list of libraries" href="#">Libraries</a></li>');e.push(' <% _.each(item.get("full_path"), function(path_item) { %>');e.push(" <% if (path_item[0] != item.id) { %>");e.push(' <li><a title="Return to this folder" href="#/folders/<%- path_item[0] %>"><%- path_item[1] %></a></li> ');e.push("<% } else { %>");e.push(' <li class="active"><span title="You are here"><%- path_item[1] %></span></li>');e.push(" <% } %>");e.push(" <% }); %>");e.push("</ol>");e.push('<div class="dataset_table">');e.push('<p>For more editing options please import the dataset to history and use "Edit attributes" on it.</p>');e.push(' <table class="grid table table-striped table-condensed">');e.push(" <tr>");e.push(' <th scope="row" id="id_row" data-id="<%= _.escape(item.get("ldda_id")) %>">Name</th>');e.push(' <td><input class="input_dataset_name form-control" type="text" placeholder="name" value="<%= _.escape(item.get("name")) %>"></td>');e.push(" </tr>");e.push(" <tr>");e.push(' <th scope="row">Data type</th>');e.push(' <td><%= _.escape(item.get("file_ext")) %></td>');e.push(" </tr>");e.push(" <tr>");e.push(' <th scope="row">Genome build</th>');e.push(' <td><%= _.escape(item.get("genome_build")) %></td>');e.push(" </tr>");e.push(" <tr>");e.push(' <th scope="row">Size</th>');e.push(' <td><%= _.escape(item.get("file_size")) %></td>');e.push(" </tr>");e.push(" <tr>");e.push(' <th scope="row">Date uploaded (UTC)</th>');e.push(' <td><%= _.escape(item.get("date_uploaded")) %></td>');e.push(" </tr>");e.push(" <tr>");e.push(' <th scope="row">Uploaded by</th>');e.push(' <td><%= _.escape(item.get("uploaded_by")) %></td>');e.push(" </tr>");e.push(' <tr scope="row">');e.push(' <th scope="row">Data Lines</th>');e.push(' <td scope="row"><%= _.escape(item.get("metadata_data_lines")) %></td>');e.push(" </tr>");e.push(' <th scope="row">Comment Lines</th>');e.push(' <% if (item.get("metadata_comment_lines") === "") { %>');e.push(' <td scope="row"><%= _.escape(item.get("metadata_comment_lines")) %></td>');e.push(" <% } else { %>");e.push(' <td scope="row">unknown</td>');e.push(" <% } %>");e.push(" </tr>");e.push(" <tr>");e.push(' <th scope="row">Number of Columns</th>');e.push(' <td scope="row"><%= _.escape(item.get("metadata_columns")) %></td>');e.push(" </tr>");e.push(" <tr>");e.push(' <th scope="row">Column Types</th>');e.push(' <td scope="row"><%= _.escape(item.get("metadata_column_types")) %></td>');e.push(" </tr>");e.push(" <tr>");e.push(' <th scope="row">Message</th>');e.push(' <td scope="row"><%= _.escape(item.get("message")) %></td>');e.push(" </tr>");e.push(" <tr>");e.push(' <th scope="row">Miscellaneous information</th>');e.push(' <td scope="row"><%= _.escape(item.get("misc_info")) %></td>');e.push(" </tr>");e.push(" <tr>");e.push(' <th scope="row">Miscellaneous blurb</th>');e.push(' <td scope="row"><%= _.escape(item.get("misc_blurb")) %></td>');e.push(" </tr>");e.push(" </table>");e.push("<div>");e.push(' <pre class="peek">');e.push(" </pre>");e.push("</div>");e.push("</div>");e.push("</div>");return _.template(e.join(""))},templateDatasetPermissions:function(){var e=[];e.push('<div class="library_style_container">');e.push(' <div id="library_toolbar">');e.push(' <a href="#folders/<%- item.get("folder_id") %>"><button data-toggle="tooltip" data-placement="top" title="Go back to containing folder" class="btn btn-default primary-button" type="button"><span class="fa fa-folder-open-o"></span> Containing Folder</span></button></a>');e.push(' <a href="#folders/<%- item.get("folder_id") %>/datasets/<%- item.id %>"><button data-toggle="tooltip" data-placement="top" title="Go back to dataset" class="btn btn-default primary-button" type="button"><span class="fa fa-file-o"></span> Dataset Details</span></button><a>');e.push(" </div>");e.push('<ol class="breadcrumb">');e.push(' <li><a title="Return to the list of libraries" href="#">Libraries</a></li>');e.push(' <% _.each(item.get("full_path"), function(path_item) { %>');e.push(" <% if (path_item[0] != item.id) { %>");e.push(' <li><a title="Return to this folder" href="#/folders/<%- path_item[0] %>"><%- path_item[1] %></a></li> ');e.push("<% } else { %>");e.push(' <li class="active"><span title="You are here"><%- path_item[1] %></span></li>');e.push(" <% } %>");e.push(" <% }); %>");e.push("</ol>");e.push('<h1>Dataset: <%= _.escape(item.get("name")) %></h1>');e.push('<div class="alert alert-warning">');e.push("<% if (is_admin) { %>");e.push("You are logged in as an <strong>administrator</strong> therefore you can manage any dataset on this Galaxy instance. Please make sure you understand the consequences.");e.push("<% } else { %>");e.push("You can assign any number of roles to any of the following permission types. However please read carefully the implications of such actions.");e.push("<% } %>");e.push("</div>");e.push('<div class="dataset_table">');e.push("<h2>Library-related permissions</h2>");e.push("<h4>Roles that can modify the library item</h4>");e.push('<div id="modify_perm" class="modify_perm roles-selection"></div>');e.push('<div class="alert alert-info roles-selection">User with <strong>any</strong> of these roles can modify name, metadata, and other information about this library item.</div>');e.push("<hr/>");e.push("<h2>Dataset-related permissions</h2>");e.push('<div class="alert alert-warning">Changes made below will affect <strong>every</strong> library item that was created from this dataset and also every history this dataset is part of.</div>');e.push('<% if (!item.get("is_unrestricted")) { %>');e.push(" <p>You can remove all access restrictions on this dataset. ");e.push(' <button data-toggle="tooltip" data-placement="top" title="Everybody will be able to access the dataset." class="btn btn-default btn-remove-restrictions primary-button" type="button">');e.push(' <span class="fa fa-globe"> Remove restrictions</span>');e.push(" </button>");e.push(" </p>");e.push("<% } else { %>");e.push(" This dataset is unrestricted so everybody can access it. Just share the URL of this page.");e.push(' <button data-toggle="tooltip" data-placement="top" title="Copy to clipboard" class="btn btn-default btn-copy-link-to-clipboard primary-button" type="button"><span class="fa fa-clipboard"> To Clipboard</span></button> ');e.push(" <p>You can make this dataset private to you. ");e.push(' <button data-toggle="tooltip" data-placement="top" title="Only you will be able to access the dataset." class="btn btn-default btn-make-private primary-button" type="button"><span class="fa fa-key"> Make Private</span></button>');e.push(" </p>");e.push("<% } %>");e.push("<h4>Roles that can access the dataset</h4>");e.push('<div id="access_perm" class="access_perm roles-selection"></div>');e.push('<div class="alert alert-info roles-selection">User has to have <strong>all these roles</strong> in order to access this dataset. Users without access permission <strong>cannot</strong> have other permissions on this dataset. If there are no access roles set on the dataset it is considered <strong>unrestricted</strong>.</div>');e.push("<h4>Roles that can manage permissions on the dataset</h4>");e.push('<div id="manage_perm" class="manage_perm roles-selection"></div>');e.push('<div class="alert alert-info roles-selection">User with <strong>any</strong> of these roles can manage permissions of this dataset. If you remove yourself you will loose the ability manage this dataset unless you are an admin.</div>');e.push('<button data-toggle="tooltip" data-placement="top" title="Save modifications made on this page" class="btn btn-default toolbtn_save_permissions primary-button" type="button"><span class="fa fa-floppy-o"></span> Save</span></button>');e.push("</div>");e.push("</div>");return _.template(e.join(""))},templateBulkImportInModal:function(){var e=[];e.push('<span id="history_modal_combo_bulk" style="width:90%; margin-left: 1em; margin-right: 1em; ">');e.push("Select history: ");e.push('<select id="dataset_import_single" name="dataset_import_single" style="width:50%; margin-bottom: 1em; "> ');e.push(" <% _.each(histories, function(history) { %>");e.push(' <option value="<%= _.escape(history.get("id")) %>"><%= _.escape(history.get("name")) %></option>');e.push(" <% }); %>");e.push("</select>");e.push("</span>");return _.template(e.join(""))},templateAccessSelect:function(){var e=[];e.push('<select id="access_select" multiple>');e.push(" <% _.each(options, function(option) { %>");e.push(' <option value="<%- option.name %>"><%- option.name %></option>');e.push(" <% }); %>");e.push("</select>");return _.template(e.join(""))}});return{LibraryDatasetView:a}});
\ No newline at end of file
diff -r 28113eeee212db2eef9cf4304abe9c3b2a92abcd -r bfd4635011e39aa210b2b1498dd65831dd2a365e static/scripts/packed/mvc/library/library-folder-view.js
--- a/static/scripts/packed/mvc/library/library-folder-view.js
+++ b/static/scripts/packed/mvc/library/library-folder-view.js
@@ -1,1 +1,1 @@
-define(["libs/toastr","mvc/library/library-model","mvc/ui/ui-select"],function(d,c,a){var b=Backbone.View.extend({el:"#center",model:null,options:{},events:{"click .toolbtn_save_permissions":"savePermissions"},initialize:function(e){this.options=_.extend(this.options,e);if(this.options.id){this.fetchFolder()}},fetchFolder:function(e){this.options=_.extend(this.options,e);this.model=new c.FolderAsModel({id:this.options.id});var f=this;this.model.fetch({success:function(){if(f.options.show_permissions){f.showPermissions()}else{f.render()}},error:function(h,g){if(typeof g.responseJSON!=="undefined"){d.error(g.responseJSON.err_msg+" Click this to go back.","",{onclick:function(){Galaxy.libraries.library_router.back()}})}else{d.error("An error ocurred. Click this to go back.","",{onclick:function(){Galaxy.libraries.library_router.back()}})}}})},render:function(e){$(".tooltip").remove();this.options=_.extend(this.options,e);var f=this.templateFolder();this.$el.html(f({item:this.model}));$(".peek").html(this.model.get("peek"));$("#center [data-toggle]").tooltip()},shareFolder:function(){d.info("Feature coming soon.")},goBack:function(){Galaxy.libraries.library_router.back()},showPermissions:function(f){this.options=_.extend(this.options,f);$(".tooltip").remove();var h=false;if(Galaxy.currUser){h=Galaxy.currUser.isAdmin()}var g=this.templateFolderPermissions();this.$el.html(g({folder:this.model,is_admin:h}));var e=this;if(this.options.fetched_permissions===undefined){$.get("/api/folders/"+e.id+"/permissions?scope=current").done(function(i){e.prepareSelectBoxes({fetched_permissions:i})}).fail(function(){d.error("An error occurred while attempting to fetch folder permissions.")})}else{this.prepareSelectBoxes({})}$("#center [data-toggle]").tooltip();$("#center").css("overflow","auto")},_serializeRoles:function(g){var e=[];for(var f=0;f<g.length;f++){e.push(g[f]+":"+g[f])}return e},prepareSelectBoxes:function(h){this.options=_.extend(this.options,h);var f=this.options.fetched_permissions;var g=this;var i=this._serializeRoles(f.add_library_item_role_list);var j=this._serializeRoles(f.manage_folder_role_list);var e=this._serializeRoles(f.modify_folder_role_list);g.addSelectObject=new a.View(this._createSelectOptions(this,"add_perm",i,false));g.manageSelectObject=new a.View(this._createSelectOptions(this,"manage_perm",j,false));g.modifySelectObject=new a.View(this._createSelectOptions(this,"modify_perm",e,false))},_createSelectOptions:function(e,j,h){var i={minimumInputLength:0,css:j,multiple:true,placeholder:"Click to select a role",container:e.$el.find("#"+j),ajax:{url:"/api/folders/"+e.id+"/permissions?scope=available",dataType:"json",quietMillis:100,data:function(k,l){return{q:k,page_limit:10,page:l}},results:function(m,l){var k=(l*10)<m.total;return{results:m.roles,more:k}}},formatResult:function f(k){return k.name+" type: "+k.type},formatSelection:function g(k){return k.name},initSelection:function(k,m){var l=[];$(k.val().split(",")).each(function(){var n=this.split(":");l.push({id:n[1],name:n[1]})});m(l)},initialData:h.join(","),dropdownCssClass:"bigdrop"};return i},comingSoon:function(){d.warning("Feature coming soon.")},copyToClipboard:function(){var e=Backbone.history.location.href;if(e.lastIndexOf("/permissions")!==-1){e=e.substr(0,e.lastIndexOf("/permissions"))}window.prompt("Copy to clipboard: Ctrl+C, Enter",e)},_extractIds:function(e){ids_list=[];for(var f=e.length-1;f>=0;f--){ids_list.push(e[f].id)}return ids_list},savePermissions:function(h){var g=this;var e=this._extractIds(this.addSelectObject.$el.select2("data"));var i=this._extractIds(this.manageSelectObject.$el.select2("data"));var f=this._extractIds(this.modifySelectObject.$el.select2("data"));$.post("/api/folders/"+g.id+"/permissions?action=set_permissions",{"add_ids[]":e,"manage_ids[]":i,"modify_ids[]":f,}).done(function(j){g.showPermissions({fetched_permissions:j});d.success("Permissions saved.")}).fail(function(){d.error("An error occurred while attempting to set folder permissions.")})},templateFolder:function(){var e=[];e.push('<div class="library_style_container">');e.push(' <div id="library_toolbar">');e.push(' <button data-toggle="tooltip" data-placement="top" title="Modify library item" class="btn btn-default toolbtn_modify_dataset primary-button" type="button"><span class="fa fa-pencil"></span> Modify</span></button>');e.push(' <a href="#folders/<%- item.get("folder_id") %>/datasets/<%- item.id %>/permissions"><button data-toggle="tooltip" data-placement="top" title="Manage permissions" class="btn btn-default toolbtn_change_permissions primary-button" type="button"><span class="fa fa-group"></span> Permissions</span></button></a>');e.push(' <button data-toggle="tooltip" data-placement="top" title="Share dataset" class="btn btn-default toolbtn-share-dataset primary-button" type="button"><span class="fa fa-share"></span> Share</span></button>');e.push(" </div>");e.push(" <p>");e.push(" This dataset is unrestricted so everybody can access it. Just share the URL of this page. ");e.push(' <button data-toggle="tooltip" data-placement="top" title="Copy to clipboard" class="btn btn-default btn-copy-link-to-clipboard primary-button" type="button"><span class="fa fa-clipboard"></span> To Clipboard</span></button> ');e.push(" </p>");e.push('<div class="dataset_table">');e.push(' <table class="grid table table-striped table-condensed">');e.push(" <tr>");e.push(' <th scope="row" id="id_row" data-id="<%= _.escape(item.get("ldda_id")) %>">Name</th>');e.push(' <td><%= _.escape(item.get("name")) %></td>');e.push(" </tr>");e.push(' <% if (item.get("file_ext")) { %>');e.push(" <tr>");e.push(' <th scope="row">Data type</th>');e.push(' <td><%= _.escape(item.get("file_ext")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(" </table>");e.push("</div>");e.push("</div>");return _.template(e.join(""))},templateFolderPermissions:function(){var e=[];e.push('<div class="library_style_container">');e.push(' <div id="library_toolbar">');e.push(' <a href="#/folders/<%= folder.get("parent_id") %>"><button data-toggle="tooltip" data-placement="top" title="Go back to the parent folder" class="btn btn-default primary-button" type="button"><span class="fa fa-caret-left fa-lg"></span> Parent folder</span></button></a>');e.push(" </div>");e.push('<h1>Folder: <%= _.escape(folder.get("name")) %></h1>');e.push('<div class="alert alert-warning">');e.push("<% if (is_admin) { %>");e.push("You are logged in as an <strong>administrator</strong> therefore you can manage any folder on this Galaxy instance. Please make sure you understand the consequences.");e.push("<% } else { %>");e.push("You can assign any number of roles to any of the following permission types. However please read carefully the implications of such actions.");e.push("<% }%>");e.push("</div>");e.push('<div class="dataset_table">');e.push("<h2>Folder permissions</h2>");e.push("<h4>Roles that can manage permissions on this folder</h4>");e.push('<div id="manage_perm" class="manage_perm roles-selection"></div>');e.push('<div class="alert alert-info roles-selection">User with <strong>any</strong> of these roles can manage permissions on this folder.</div>');e.push("<h4>Roles that can add items to this folder</h4>");e.push('<div id="add_perm" class="add_perm roles-selection"></div>');e.push('<div class="alert alert-info roles-selection">User with <strong>any</strong> of these roles can add items to this folder (folders and datasets).</div>');e.push("<h4>Roles that can modify this folder</h4>");e.push('<div id="modify_perm" class="modify_perm roles-selection"></div>');e.push('<div class="alert alert-info roles-selection">User with <strong>any</strong> of these roles can modify this folder (name, etc.).</div>');e.push('<button data-toggle="tooltip" data-placement="top" title="Save modifications" class="btn btn-default toolbtn_save_permissions primary-button" type="button"><span class="fa fa-floppy-o"></span> Save</span></button>');e.push("</div>");e.push("</div>");return _.template(e.join(""))}});return{FolderView:b}});
\ No newline at end of file
+define(["libs/toastr","mvc/library/library-model","mvc/ui/ui-select"],function(d,c,a){var b=Backbone.View.extend({el:"#center",model:null,options:{},events:{"click .toolbtn_save_permissions":"savePermissions"},initialize:function(e){this.options=_.extend(this.options,e);if(this.options.id){this.fetchFolder()}},fetchFolder:function(e){this.options=_.extend(this.options,e);this.model=new c.FolderAsModel({id:this.options.id});var f=this;this.model.fetch({success:function(){if(f.options.show_permissions){f.showPermissions()}else{f.render()}},error:function(h,g){if(typeof g.responseJSON!=="undefined"){d.error(g.responseJSON.err_msg+" Click this to go back.","",{onclick:function(){Galaxy.libraries.library_router.back()}})}else{d.error("An error ocurred. Click this to go back.","",{onclick:function(){Galaxy.libraries.library_router.back()}})}}})},render:function(e){$(".tooltip").remove();this.options=_.extend(this.options,e);var f=this.templateFolder();this.$el.html(f({item:this.model}));$(".peek").html(this.model.get("peek"));$("#center [data-toggle]").tooltip()},shareFolder:function(){d.info("Feature coming soon.")},goBack:function(){Galaxy.libraries.library_router.back()},showPermissions:function(f){this.options=_.extend(this.options,f);$(".tooltip").remove();var h=false;if(Galaxy.currUser){h=Galaxy.currUser.isAdmin()}var g=this.templateFolderPermissions();this.$el.html(g({folder:this.model,is_admin:h}));var e=this;if(this.options.fetched_permissions===undefined){$.get((window.galaxy_config?galaxy_config.root:"/")+"api/folders/"+e.id+"/permissions?scope=current").done(function(i){e.prepareSelectBoxes({fetched_permissions:i})}).fail(function(){d.error("An error occurred while attempting to fetch folder permissions.")})}else{this.prepareSelectBoxes({})}$("#center [data-toggle]").tooltip();$("#center").css("overflow","auto")},_serializeRoles:function(g){var e=[];for(var f=0;f<g.length;f++){e.push(g[f]+":"+g[f])}return e},prepareSelectBoxes:function(h){this.options=_.extend(this.options,h);var f=this.options.fetched_permissions;var g=this;var i=this._serializeRoles(f.add_library_item_role_list);var j=this._serializeRoles(f.manage_folder_role_list);var e=this._serializeRoles(f.modify_folder_role_list);g.addSelectObject=new a.View(this._createSelectOptions(this,"add_perm",i,false));g.manageSelectObject=new a.View(this._createSelectOptions(this,"manage_perm",j,false));g.modifySelectObject=new a.View(this._createSelectOptions(this,"modify_perm",e,false))},_createSelectOptions:function(e,j,h){var i={minimumInputLength:0,css:j,multiple:true,placeholder:"Click to select a role",container:e.$el.find("#"+j),ajax:{url:(window.galaxy_config?galaxy_config.root:"/")+"api/folders/"+e.id+"/permissions?scope=available",dataType:"json",quietMillis:100,data:function(k,l){return{q:k,page_limit:10,page:l}},results:function(m,l){var k=(l*10)<m.total;return{results:m.roles,more:k}}},formatResult:function f(k){return k.name+" type: "+k.type},formatSelection:function g(k){return k.name},initSelection:function(k,m){var l=[];$(k.val().split(",")).each(function(){var n=this.split(":");l.push({id:n[1],name:n[1]})});m(l)},initialData:h.join(","),dropdownCssClass:"bigdrop"};return i},comingSoon:function(){d.warning("Feature coming soon.")},copyToClipboard:function(){var e=Backbone.history.location.href;if(e.lastIndexOf("/permissions")!==-1){e=e.substr(0,e.lastIndexOf("/permissions"))}window.prompt("Copy to clipboard: Ctrl+C, Enter",e)},_extractIds:function(e){ids_list=[];for(var f=e.length-1;f>=0;f--){ids_list.push(e[f].id)}return ids_list},savePermissions:function(h){var g=this;var e=this._extractIds(this.addSelectObject.$el.select2("data"));var i=this._extractIds(this.manageSelectObject.$el.select2("data"));var f=this._extractIds(this.modifySelectObject.$el.select2("data"));$.post((window.galaxy_config?galaxy_config.root:"/")+"api/folders/"+g.id+"/permissions?action=set_permissions",{"add_ids[]":e,"manage_ids[]":i,"modify_ids[]":f,}).done(function(j){g.showPermissions({fetched_permissions:j});d.success("Permissions saved.")}).fail(function(){d.error("An error occurred while attempting to set folder permissions.")})},templateFolder:function(){var e=[];e.push('<div class="library_style_container">');e.push(' <div id="library_toolbar">');e.push(' <button data-toggle="tooltip" data-placement="top" title="Modify library item" class="btn btn-default toolbtn_modify_dataset primary-button" type="button"><span class="fa fa-pencil"></span> Modify</span></button>');e.push(' <a href="#folders/<%- item.get("folder_id") %>/datasets/<%- item.id %>/permissions"><button data-toggle="tooltip" data-placement="top" title="Manage permissions" class="btn btn-default toolbtn_change_permissions primary-button" type="button"><span class="fa fa-group"></span> Permissions</span></button></a>');e.push(' <button data-toggle="tooltip" data-placement="top" title="Share dataset" class="btn btn-default toolbtn-share-dataset primary-button" type="button"><span class="fa fa-share"></span> Share</span></button>');e.push(" </div>");e.push(" <p>");e.push(" This dataset is unrestricted so everybody can access it. Just share the URL of this page. ");e.push(' <button data-toggle="tooltip" data-placement="top" title="Copy to clipboard" class="btn btn-default btn-copy-link-to-clipboard primary-button" type="button"><span class="fa fa-clipboard"></span> To Clipboard</span></button> ');e.push(" </p>");e.push('<div class="dataset_table">');e.push(' <table class="grid table table-striped table-condensed">');e.push(" <tr>");e.push(' <th scope="row" id="id_row" data-id="<%= _.escape(item.get("ldda_id")) %>">Name</th>');e.push(' <td><%= _.escape(item.get("name")) %></td>');e.push(" </tr>");e.push(' <% if (item.get("file_ext")) { %>');e.push(" <tr>");e.push(' <th scope="row">Data type</th>');e.push(' <td><%= _.escape(item.get("file_ext")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(" </table>");e.push("</div>");e.push("</div>");return _.template(e.join(""))},templateFolderPermissions:function(){var e=[];e.push('<div class="library_style_container">');e.push(' <div id="library_toolbar">');e.push(' <a href="#/folders/<%= folder.get("parent_id") %>"><button data-toggle="tooltip" data-placement="top" title="Go back to the parent folder" class="btn btn-default primary-button" type="button"><span class="fa fa-caret-left fa-lg"></span> Parent folder</span></button></a>');e.push(" </div>");e.push('<h1>Folder: <%= _.escape(folder.get("name")) %></h1>');e.push('<div class="alert alert-warning">');e.push("<% if (is_admin) { %>");e.push("You are logged in as an <strong>administrator</strong> therefore you can manage any folder on this Galaxy instance. Please make sure you understand the consequences.");e.push("<% } else { %>");e.push("You can assign any number of roles to any of the following permission types. However please read carefully the implications of such actions.");e.push("<% }%>");e.push("</div>");e.push('<div class="dataset_table">');e.push("<h2>Folder permissions</h2>");e.push("<h4>Roles that can manage permissions on this folder</h4>");e.push('<div id="manage_perm" class="manage_perm roles-selection"></div>');e.push('<div class="alert alert-info roles-selection">User with <strong>any</strong> of these roles can manage permissions on this folder.</div>');e.push("<h4>Roles that can add items to this folder</h4>");e.push('<div id="add_perm" class="add_perm roles-selection"></div>');e.push('<div class="alert alert-info roles-selection">User with <strong>any</strong> of these roles can add items to this folder (folders and datasets).</div>');e.push("<h4>Roles that can modify this folder</h4>");e.push('<div id="modify_perm" class="modify_perm roles-selection"></div>');e.push('<div class="alert alert-info roles-selection">User with <strong>any</strong> of these roles can modify this folder (name, etc.).</div>');e.push('<button data-toggle="tooltip" data-placement="top" title="Save modifications" class="btn btn-default toolbtn_save_permissions primary-button" type="button"><span class="fa fa-floppy-o"></span> Save</span></button>');e.push("</div>");e.push("</div>");return _.template(e.join(""))}});return{FolderView:b}});
\ No newline at end of file
diff -r 28113eeee212db2eef9cf4304abe9c3b2a92abcd -r bfd4635011e39aa210b2b1498dd65831dd2a365e static/scripts/packed/mvc/library/library-foldertoolbar-view.js
--- a/static/scripts/packed/mvc/library/library-foldertoolbar-view.js
+++ b/static/scripts/packed/mvc/library/library-foldertoolbar-view.js
@@ -1,1 +1,1 @@
-define(["galaxy.masthead","utils/utils","libs/toastr","mvc/library/library-model","mvc/ui/ui-select"],function(c,e,f,d,a){var b=Backbone.View.extend({el:"#center",events:{"click #toolbtn_create_folder":"createFolderFromModal","click #toolbtn_bulk_import":"modalBulkImport","click #include_deleted_datasets_chk":"checkIncludeDeleted","click #toolbtn_show_libinfo":"showLibInfo","click #toolbtn_bulk_delete":"deleteSelectedDatasets","click #page_size_prompt":"showPageSizePrompt"},defaults:{can_add_library_item:false,contains_file:false,chain_call_control:{total_number:0,failed_number:0},disabled_jstree_element:"folders"},modal:null,jstree:null,histories:null,select_genome:null,select_extension:null,list_extensions:[],auto:{id:"auto",text:"Auto-detect",description:"This system will try to detect the file type automatically. If your file is not detected properly as one of the known formats, it most likely means that it has some format problems (e.g., different number of columns on different rows). You can still coerce the system to set your data to the format you think it should be. You can also upload compressed files, which will automatically be decompressed."},list_genomes:[],initialize:function(g){this.options=_.defaults(g||{},this.defaults);this.fetchExtAndGenomes();this.render()},render:function(g){this.options=_.extend(this.options,g);var i=this.templateToolBar();var h={id:this.options.id,is_admin:false,is_anonym:true,mutiple_add_dataset_options:false};if(Galaxy.currUser){h.is_admin=Galaxy.currUser.isAdmin();h.is_anonym=Galaxy.currUser.isAnonymous();if(Galaxy.config.user_library_import_dir!==null||Galaxy.config.allow_library_path_paste!==false||Galaxy.config.library_import_dir!==null){h.mutiple_add_dataset_options=true}}this.$el.html(i(h))},renderPaginator:function(h){this.options=_.extend(this.options,h);var g=this.templatePaginator();this.$el.find("#folder_paginator").html(g({id:this.options.id,show_page:parseInt(this.options.show_page),page_count:parseInt(this.options.page_count),total_items_count:this.options.total_items_count,items_shown:this.options.items_shown}))},configureElements:function(g){this.options=_.extend(this.options,g);if(this.options.can_add_library_item===true){$(".add-library-items").show()}else{$(".add-library-items").hide()}if(this.options.contains_file===true){if(Galaxy.currUser){if(!Galaxy.currUser.isAnonymous()){$(".logged-dataset-manipulation").show();$(".dataset-manipulation").show()}else{$(".dataset-manipulation").show();$(".logged-dataset-manipulation").hide()}}else{$(".logged-dataset-manipulation").hide();$(".dataset-manipulation").hide()}}else{$(".logged-dataset-manipulation").hide();$(".dataset-manipulation").hide()}this.$el.find("[data-toggle]").tooltip()},createFolderFromModal:function(i){i.preventDefault();i.stopPropagation();var g=this;var h=this.templateNewFolderInModal();this.modal=Galaxy.modal;this.modal.show({closing_events:true,title:"Create New Folder",body:h(),buttons:{Create:function(){g.create_new_folder_event()},Close:function(){Galaxy.modal.hide()}}})},create_new_folder_event:function(){var g=this.serialize_new_folder();if(this.validate_new_folder(g)){var h=new d.FolderAsModel();url_items=Backbone.history.fragment.split("/");current_folder_id=url_items[url_items.length-1];h.url=h.urlRoot+"/"+current_folder_id;h.save(g,{success:function(i){Galaxy.modal.hide();f.success("Folder created.");i.set({type:"folder"});Galaxy.libraries.folderListView.collection.add(i)},error:function(j,i){Galaxy.modal.hide();if(typeof i.responseJSON!=="undefined"){f.error(i.responseJSON.err_msg)}else{f.error("An error ocurred.")}}})}else{f.error("Folder's name is missing.")}return false},serialize_new_folder:function(){return{name:$("input[name='Name']").val(),description:$("input[name='Description']").val()}},validate_new_folder:function(g){return g.name!==""},modalBulkImport:function(){var g=$("#folder_table").find(":checked");if(g.length===0){f.info("You must select some datasets first.")}else{this.refreshUserHistoriesList(function(i){var h=i.templateBulkImportInModal();i.modal=Galaxy.modal;i.modal.show({closing_events:true,title:"Import into History",body:h({histories:i.histories.models}),buttons:{Import:function(){i.importAllIntoHistory()},Close:function(){Galaxy.modal.hide()}}})})}},refreshUserHistoriesList:function(h){var g=this;this.histories=new d.GalaxyHistories();this.histories.fetch({success:function(){h(g)},error:function(j,i){if(typeof i.responseJSON!=="undefined"){f.error(i.responseJSON.err_msg)}else{f.error("An error ocurred.")}}})},importAllIntoHistory:function(){this.modal.disableButton("Import");var k=$("select[name=dataset_import_bulk] option:selected").val();var n=$("select[name=dataset_import_bulk] option:selected").text();this.options.last_used_history_id=k;var h=[];$("#folder_table").find(":checked").each(function(){if(this.parentElement.parentElement.id!==""){h.push(this.parentElement.parentElement.id)}});var m=[];for(var j=h.length-1;j>=0;j--){var g=h[j];var l=new d.HistoryItem();l.url=l.urlRoot+k+"/contents";l.content=g;l.source="library";m.push(l)}this.initChainCallControl({length:m.length,action:"to_history",history_name:n});jQuery.getJSON(galaxy_config.root+"history/set_as_current?id="+k);this.chainCallImportingIntoHistory(m,n)},updateProgress:function(){this.progress+=this.progressStep;$(".progress-bar-import").width(Math.round(this.progress)+"%");txt_representation=Math.round(this.progress)+"% Complete";$(".completion_span").text(txt_representation)},download:function(g,k){var i=[];$("#folder_table").find(":checked").each(function(){if(this.parentElement.parentElement.id!==""){i.push(this.parentElement.parentElement.id)}});var h="/api/libraries/datasets/download/"+k;var j={ld_ids:i};this.processDownload(h,j,"get")},processDownload:function(h,i,j){if(h&&i){i=typeof i==="string"?i:$.param(i);var g="";$.each(i.split("&"),function(){var k=this.split("=");g+='<input type="hidden" name="'+k[0]+'" value="'+k[1]+'" />'});$('<form action="'+h+'" method="'+(j||"post")+'">'+g+"</form>").appendTo("body").submit().remove();f.info("Your download will begin soon.")}else{f.error("An error occurred.")}},addFilesFromHistoryModal:function(){this.refreshUserHistoriesList(function(g){g.modal=Galaxy.modal;var h=g.templateAddFilesFromHistory();var i=g.options.full_path[g.options.full_path.length-1][1];g.modal.show({closing_events:true,title:"Adding datasets from your history to folder "+i,body:h({histories:g.histories.models}),buttons:{Add:function(){g.addAllDatasetsFromHistory()},Close:function(){Galaxy.modal.hide()}},closing_callback:function(){Galaxy.libraries.library_router.back()}});if(g.histories.models.length>0){g.fetchAndDisplayHistoryContents(g.histories.models[0].id);$("#dataset_add_bulk").change(function(j){g.fetchAndDisplayHistoryContents(j.target.value)})}else{f.error("An error ocurred.")}})},importFilesFromPathModal:function(){var h=this;this.modal=Galaxy.modal;var g=this.templateImportPathModal();this.modal.show({closing_events:true,title:"Please enter paths to import",body:g({}),buttons:{Import:function(){h.importFromPathsClicked(h)},Close:function(){Galaxy.modal.hide()}},closing_callback:function(){Galaxy.libraries.library_router.navigate("folders/"+h.id,{trigger:true})}});this.renderSelectBoxes()},fetchExtAndGenomes:function(){var g=this;e.get({url:galaxy_config.root+"api/datatypes?extension_only=False",success:function(h){for(key in h){g.list_extensions.push({id:h[key].extension,text:h[key].extension,description:h[key].description,description_url:h[key].description_url})}g.list_extensions.sort(function(j,i){return j.id>i.id?1:j.id<i.id?-1:0});g.list_extensions.unshift(g.auto)}});e.get({url:galaxy_config.root+"api/genomes",success:function(h){for(key in h){g.list_genomes.push({id:h[key][1],text:h[key][0]})}g.list_genomes.sort(function(j,i){return j.id>i.id?1:j.id<i.id?-1:0})}})},renderSelectBoxes:function(){var g=this;this.select_genome=new a.View({css:"library-genome-select",data:g.list_genomes,container:Galaxy.modal.$el.find("#library_genome_select"),value:"?"});this.select_extension=new a.View({css:"library-extension-select",data:g.list_extensions,container:Galaxy.modal.$el.find("#library_extension_select"),value:"auto"})},importFilesFromGalaxyFolderModal:function(g){var i=this;var h=this.templateBrowserModal();this.modal=Galaxy.modal;this.modal.show({closing_events:true,title:"Please select folders or files",body:h({}),buttons:{Import:function(){i.importFromJstreePath(i,g)},Close:function(){Galaxy.modal.hide()}},closing_callback:function(){Galaxy.libraries.library_router.navigate("folders/"+i.id,{trigger:true})}});this.renderSelectBoxes();g.disabled_jstree_element="folders";this.renderJstree(g);$("input[type=radio]").change(function(j){if(j.target.value==="jstree-disable-folders"){g.disabled_jstree_element="folders";i.renderJstree(g);$(".jstree-folders-message").hide();$(".jstree-preserve-structure").hide();$(".jstree-link-files").hide();$(".jstree-files-message").show()}else{if(j.target.value==="jstree-disable-files"){$(".jstree-files-message").hide();$(".jstree-folders-message").show();$(".jstree-link-files").show();$(".jstree-preserve-structure").show();g.disabled_jstree_element="files";i.renderJstree(g)}}})},renderJstree:function(g){var i=this;this.options=_.extend(this.options,g);var j=g.source||"userdir";var h=this.options.disabled_jstree_element;this.jstree=new d.Jstree();this.jstree.url=this.jstree.urlRoot+"?target="+j+"&format=jstree&disable="+h;this.jstree.fetch({success:function(l,k){define("jquery",function(){return jQuery});require(["libs/jquery/jstree"],function(m){$("#jstree_browser").jstree("destroy");$("#jstree_browser").jstree({core:{data:l},plugins:["types","checkbox"],types:{folder:{icon:"jstree-folder"},file:{icon:"jstree-file"}},checkbox:{three_state:false}})})},error:function(l,k){if(typeof k.responseJSON!=="undefined"){f.error(k.responseJSON.err_msg)}else{f.error("An error ocurred.")}}})},importFromPathsClicked:function(){var g=this.modal.$el.find(".preserve-checkbox").is(":checked");var n=this.modal.$el.find(".link-checkbox").is(":checked");var h=this.select_extension.value();var j=this.select_genome.value();var m=$("textarea#import_paths").val();var l=[];if(!m){f.info("Please enter a path relative to Galaxy root.")}else{this.modal.disableButton("Import");m=m.split("\n");for(var k=m.length-1;k>=0;k--){trimmed=m[k].trim();if(trimmed.length!==0){l.push(trimmed)}}this.initChainCallControl({length:l.length,action:"adding_datasets"});this.chainCallImportingFolders({paths:l,preserve_dirs:g,link_data:n,source:"admin_path",file_type:h,dbkey:j})}},initChainCallControl:function(g){var h;switch(g.action){case"adding_datasets":h=this.templateAddingDatasetsProgressBar();this.modal.$el.find(".modal-body").html(h({folder_name:this.options.folder_name}));break;case"deleting_datasets":h=this.templateDeletingDatasetsProgressBar();this.modal.$el.find(".modal-body").html(h());break;case"to_history":h=this.templateImportIntoHistoryProgressBar();this.modal.$el.find(".modal-body").html(h({history_name:g.history_name}));break;default:console.error("Wrong action specified.");break}this.progress=0;this.progressStep=100/g.length;this.options.chain_call_control.total_number=g.length;this.options.chain_call_control.failed_number=0},importFromJstreePath:function(n,r){var g=$("#jstree_browser").jstree().get_selected(true);var m=this.modal.$el.find(".preserve-checkbox").is(":checked");var o=this.modal.$el.find(".link-checkbox").is(":checked");var j=this.select_extension.value();var p=this.select_genome.value();var k=g[0].type;var q=[];if(g.length<1){f.info("Please select some items first.")}else{this.modal.disableButton("Import");for(var l=g.length-1;l>=0;l--){if(g[l].li_attr.full_path!==undefined){q.push(g[l].li_attr.full_path)}}this.initChainCallControl({length:q.length,action:"adding_datasets"});if(k==="folder"){var h=r.source+"_folder";this.chainCallImportingFolders({paths:q,preserve_dirs:m,link_data:o,source:h,file_type:j,dbkey:p})}else{if(k==="file"){var h=r.source+"_file";this.chainCallImportingUserdirFiles({paths:q,file_type:j,dbkey:p,source:h})}}}},fetchAndDisplayHistoryContents:function(i){var h=new d.HistoryContents({id:i});var g=this;h.fetch({success:function(k){var j=g.templateHistoryContents();g.histories.get(i).set({contents:k});g.modal.$el.find("#selected_history_content").html(j({history_contents:k.models.reverse()}))},error:function(k,j){if(typeof j.responseJSON!=="undefined"){f.error(j.responseJSON.err_msg)}else{f.error("An error ocurred.")}}})},addAllDatasetsFromHistory:function(){var l=this.modal.$el.find("#selected_history_content").find(":checked");var g=[];var k=[];if(l.length<1){f.info("You must select some datasets first.")}else{this.modal.disableButton("Add");l.each(function(){var i=$(this.parentElement).data("id");if(i){g.push(i)}});for(var j=g.length-1;j>=0;j--){history_dataset_id=g[j];var h=new d.Item();h.url="/api/folders/"+this.options.id+"/contents";h.set({from_hda_id:history_dataset_id});k.push(h)}this.initChainCallControl({length:k.length,action:"adding_datasets"});this.chainCallAddingHdas(k)}},chainCallImportingIntoHistory:function(h,k){var g=this;var i=h.pop();if(typeof i=="undefined"){if(this.options.chain_call_control.failed_number===0){f.success("Selected datasets imported into history. Click this to start analysing it.","",{onclick:function(){window.location="/"}})}else{if(this.options.chain_call_control.failed_number===this.options.chain_call_control.total_number){f.error("There was an error and no datasets were imported into history.")}else{if(this.options.chain_call_control.failed_number<this.options.chain_call_control.total_number){f.warning("Some of the datasets could not be imported into history. Click this to see what was imported.","",{onclick:function(){window.location="/"}})}}}Galaxy.modal.hide();return true}var j=$.when(i.save({content:i.content,source:i.source}));j.done(function(){g.updateProgress();g.chainCallImportingIntoHistory(h,k)}).fail(function(){g.options.chain_call_control.failed_number+=1;g.updateProgress();g.chainCallImportingIntoHistory(h,k)})},chainCallImportingUserdirFiles:function(g){var h=this;var i=g.paths.pop();if(typeof i==="undefined"){if(this.options.chain_call_control.failed_number===0){f.success("Selected files imported into the current folder");Galaxy.modal.hide()}else{f.error("An error occured.")}return true}var j=$.when($.post("/api/libraries/datasets?encoded_folder_id="+h.id+"&source="+g.source+"&path="+i+"&file_type="+g.file_type+"&dbkey="+g.dbkey));j.done(function(k){h.updateProgress();h.chainCallImportingUserdirFiles(g)}).fail(function(){h.options.chain_call_control.failed_number+=1;h.updateProgress();h.chainCallImportingUserdirFiles(g)})},chainCallImportingFolders:function(g){var h=this;var i=g.paths.pop();if(typeof i=="undefined"){if(this.options.chain_call_control.failed_number===0){f.success("Selected folders and their contents imported into the current folder.");Galaxy.modal.hide()}else{f.error("An error occured.")}return true}var j=$.when($.post("/api/libraries/datasets?encoded_folder_id="+h.id+"&source="+g.source+"&path="+i+"&preserve_dirs="+g.preserve_dirs+"&link_data="+g.link_data+"&file_type="+g.file_type+"&dbkey="+g.dbkey));j.done(function(k){h.updateProgress();h.chainCallImportingFolders(g)}).fail(function(){h.options.chain_call_control.failed_number+=1;h.updateProgress();h.chainCallImportingFolders(g)})},chainCallAddingHdas:function(h){var g=this;this.added_hdas=new d.Folder();var i=h.pop();if(typeof i=="undefined"){if(this.options.chain_call_control.failed_number===0){f.success("Selected datasets from history added to the folder")}else{if(this.options.chain_call_control.failed_number===this.options.chain_call_control.total_number){f.error("There was an error and no datasets were added to the folder.")}else{if(this.options.chain_call_control.failed_number<this.options.chain_call_control.total_number){f.warning("Some of the datasets could not be added to the folder")}}}Galaxy.modal.hide();return this.added_hdas}var j=$.when(i.save({from_hda_id:i.get("from_hda_id")}));j.done(function(k){Galaxy.libraries.folderListView.collection.add(k);g.updateProgress();g.chainCallAddingHdas(h)}).fail(function(){g.options.chain_call_control.failed_number+=1;g.updateProgress();g.chainCallAddingHdas(h)})},chainCallDeletingHdas:function(h){var g=this;this.deleted_lddas=new d.Folder();var i=h.pop();if(typeof i==="undefined"){if(this.options.chain_call_control.failed_number===0){f.success("Selected datasets were deleted.")}else{if(this.options.chain_call_control.failed_number===this.options.chain_call_control.total_number){f.error("There was an error and no datasets were deleted. Please make sure you have sufficient permissions.")}else{if(this.options.chain_call_control.failed_number<this.options.chain_call_control.total_number){f.warning("Some of the datasets could not be deleted. Please make sure you have sufficient permissions.")}}}Galaxy.modal.hide();return this.deleted_lddas}var j=$.when(i.destroy());j.done(function(l){Galaxy.libraries.folderListView.collection.remove(i.id);g.updateProgress();if(Galaxy.libraries.folderListView.options.include_deleted){var k=new d.Item(l);Galaxy.libraries.folderListView.collection.add(k)}g.chainCallDeletingHdas(h)}).fail(function(){g.options.chain_call_control.failed_number+=1;g.updateProgress();g.chainCallDeletingHdas(h)})},checkIncludeDeleted:function(g){if(g.target.checked){Galaxy.libraries.folderListView.fetchFolder({include_deleted:true})}else{Galaxy.libraries.folderListView.fetchFolder({include_deleted:false})}},deleteSelectedDatasets:function(){var g=$("#folder_table").find(":checked");if(g.length===0){f.info("You must select at least one dataset for deletion.")}else{var k=this.templateDeletingDatasetsProgressBar();this.modal=Galaxy.modal;this.modal.show({closing_events:true,title:"Deleting selected datasets",body:k({}),buttons:{Close:function(){Galaxy.modal.hide()}}});this.options.chain_call_control.total_number=0;this.options.chain_call_control.failed_number=0;var h=[];g.each(function(){if(this.parentElement.parentElement.id!==""){h.push(this.parentElement.parentElement.id)}});this.progressStep=100/h.length;this.progress=0;var m=[];for(var j=h.length-1;j>=0;j--){var l=new d.Item({id:h[j]});m.push(l)}this.options.chain_call_control.total_number=h.length;this.chainCallDeletingHdas(m)}},showLibInfo:function(){var h=Galaxy.libraries.folderListView.folderContainer.attributes.metadata.parent_library_id;var g=null;var i=this;if(Galaxy.libraries.libraryListView!==null){g=Galaxy.libraries.libraryListView.collection.get(h);this.showLibInfoModal(g)}else{g=new d.Library({id:h});g.fetch({success:function(){i.showLibInfoModal(g)},error:function(k,j){if(typeof j.responseJSON!=="undefined"){f.error(j.responseJSON.err_msg)}else{f.error("An error ocurred.")}}})}},showLibInfoModal:function(g){var h=this.templateLibInfoInModal();this.modal=Galaxy.modal;this.modal.show({closing_events:true,title:"Library Information",body:h({library:g}),buttons:{Close:function(){Galaxy.modal.hide()}}})},showImportModal:function(g){switch(g.source){case"history":this.addFilesFromHistoryModal();break;case"importdir":this.importFilesFromGalaxyFolderModal({source:"importdir"});break;case"path":this.importFilesFromPathModal();break;case"userdir":this.importFilesFromGalaxyFolderModal({source:"userdir"});break;default:Galaxy.libraries.library_router.back();f.error("Invalid import source.");break}},showPageSizePrompt:function(){var g=prompt("How many items per page do you want to see?",Galaxy.libraries.preferences.get("folder_page_size"));if((g!=null)&&(g==parseInt(g))){Galaxy.libraries.preferences.set({folder_page_size:parseInt(g)});Galaxy.libraries.folderListView.render({id:this.options.id,show_page:1})}},templateToolBar:function(){tmpl_array=[];tmpl_array.push('<div class="library_style_container">');tmpl_array.push(' <div id="library_toolbar">');tmpl_array.push(" <span><strong>DATA LIBRARIES</strong></span>");tmpl_array.push(' <span data-toggle="tooltip" data-placement="top" class="logged-dataset-manipulation" title="Include deleted datasets" style="display:none;"> | <input id="include_deleted_datasets_chk" style="margin: 0;" type="checkbox"> include deleted | </input></span>');tmpl_array.push(' <button style="display:none;" data-toggle="tooltip" data-placement="top" title="Create New Folder" id="toolbtn_create_folder" class="btn btn-default primary-button add-library-items" type="button"><span class="fa fa-plus"></span><span class="fa fa-folder"></span></button>');tmpl_array.push("<% if(mutiple_add_dataset_options) { %>");tmpl_array.push(' <div class="btn-group add-library-items" style="display:none;">');tmpl_array.push(' <button title="Add Datasets to Current Folder" id="" type="button" class="primary-button dropdown-toggle" data-toggle="dropdown">');tmpl_array.push(' <span class="fa fa-plus"></span><span class="fa fa-file"></span><span class="caret"></span>');tmpl_array.push(" </button>");tmpl_array.push(' <ul class="dropdown-menu" role="menu">');tmpl_array.push(' <li><a href="#folders/<%= id %>/import/history"> from History</a></li>');tmpl_array.push("<% if(Galaxy.config.user_library_import_dir !== null) { %>");tmpl_array.push(' <li><a href="#folders/<%= id %>/import/userdir"> from User Directory</a></li>');tmpl_array.push("<% } %>");tmpl_array.push("<% if(Galaxy.config.allow_library_path_paste) { %>");tmpl_array.push(' <li class="divider"></li>');tmpl_array.push(' <li class="dropdown-header">Admins only</li>');tmpl_array.push("<% if(Galaxy.config.library_import_dir !== null) { %>");tmpl_array.push(' <li><a href="#folders/<%= id %>/import/importdir">from Import Directory</a></li>');tmpl_array.push("<% } %>");tmpl_array.push("<% if(Galaxy.config.allow_library_path_paste) { %>");tmpl_array.push(' <li><a href="#folders/<%= id %>/import/path">from Path</a></li>');tmpl_array.push("<% } %>");tmpl_array.push("<% } %>");tmpl_array.push(" </ul>");tmpl_array.push(" </div>");tmpl_array.push("<% } else { %>");tmpl_array.push(' <a data-placement="top" title="Add Datasets to Current Folder" style="display:none;" class="btn btn-default add-library-items" href="#folders/<%= id %>/import/history" role="button"><span class="fa fa-plus"></span><span class="fa fa-file"></span></span></a>');tmpl_array.push("<% } %>");tmpl_array.push(' <button data-toggle="tooltip" data-placement="top" title="Import selected datasets into history" id="toolbtn_bulk_import" class="primary-button dataset-manipulation" style="margin-left: 0.5em; display:none;" type="button"><span class="fa fa-book"></span> to History</button>');tmpl_array.push(' <div id="toolbtn_dl" class="btn-group dataset-manipulation" style="margin-left: 0.5em; display:none; ">');tmpl_array.push(' <button title="Download selected datasets as archive" id="drop_toggle" type="button" class="primary-button dropdown-toggle" data-toggle="dropdown">');tmpl_array.push(' <span class="fa fa-download"></span> Download <span class="caret"></span>');tmpl_array.push(" </button>");tmpl_array.push(' <ul class="dropdown-menu" role="menu">');tmpl_array.push(' <li><a href="#/folders/<%= id %>/download/tgz">.tar.gz</a></li>');tmpl_array.push(' <li><a href="#/folders/<%= id %>/download/tbz">.tar.bz</a></li>');tmpl_array.push(' <li><a href="#/folders/<%= id %>/download/zip">.zip</a></li>');tmpl_array.push(" </ul>");tmpl_array.push(" </div>");tmpl_array.push(' <button data-toggle="tooltip" data-placement="top" title="Mark selected datasets deleted" id="toolbtn_bulk_delete" class="primary-button logged-dataset-manipulation" style="margin-left: 0.5em; display:none; " type="button"><span class="fa fa-times"></span> Delete</button>');tmpl_array.push(' <button data-id="<%- id %>" data-toggle="tooltip" data-placement="top" title="Show library information" id="toolbtn_show_libinfo" class="primary-button" style="margin-left: 0.5em;" type="button"><span class="fa fa-info-circle"></span> Library Info</button>');tmpl_array.push(' <span class="help-button" data-toggle="tooltip" data-placement="top" title="Visit Libraries Wiki"><a href="https://wiki.galaxyproject.org/DataLibraries/screen/FolderContents" target="_blank"><button class="primary-button" type="button"><span class="fa fa-question-circle"></span> Help</button></a></span>');tmpl_array.push(' <span id="folder_paginator" class="library-paginator">');tmpl_array.push(" </span>");tmpl_array.push(" </div>");tmpl_array.push(' <div id="folder_items_element">');tmpl_array.push(" </div>");tmpl_array.push("</div>");return _.template(tmpl_array.join(""))},templateLibInfoInModal:function(){tmpl_array=[];tmpl_array.push('<div id="lif_info_modal">');tmpl_array.push("<h2>Library name:</h2>");tmpl_array.push('<p><%- library.get("name") %></p>');tmpl_array.push("<h3>Library description:</h3>");tmpl_array.push('<p><%- library.get("description") %></p>');tmpl_array.push("<h3>Library synopsis:</h3>");tmpl_array.push('<p><%- library.get("synopsis") %></p>');tmpl_array.push("</div>");return _.template(tmpl_array.join(""))},templateNewFolderInModal:function(){tmpl_array=[];tmpl_array.push('<div id="new_folder_modal">');tmpl_array.push("<form>");tmpl_array.push('<input type="text" name="Name" value="" placeholder="Name">');tmpl_array.push('<input type="text" name="Description" value="" placeholder="Description">');tmpl_array.push("</form>");tmpl_array.push("</div>");return _.template(tmpl_array.join(""))},templateBulkImportInModal:function(){var g=[];g.push('<span id="history_modal_combo_bulk" style="width:90%; margin-left: 1em; margin-right: 1em; ">');g.push("Select history: ");g.push('<select id="dataset_import_bulk" name="dataset_import_bulk" style="width:50%; margin-bottom: 1em; "> ');g.push(" <% _.each(histories, function(history) { %>");g.push(' <option value="<%= _.escape(history.get("id")) %>"><%= _.escape(history.get("name")) %></option>');g.push(" <% }); %>");g.push("</select>");g.push("</span>");return _.template(g.join(""))},templateImportIntoHistoryProgressBar:function(){var g=[];g.push('<div class="import_text">');g.push("Importing selected datasets to history <b><%= _.escape(history_name) %></b>");g.push("</div>");g.push('<div class="progress">');g.push(' <div class="progress-bar progress-bar-import" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100" style="width: 00%;">');g.push(' <span class="completion_span">0% Complete</span>');g.push(" </div>");g.push("</div>");g.push("");return _.template(g.join(""))},templateAddingDatasetsProgressBar:function(){var g=[];g.push('<div class="import_text">');g.push("Adding selected datasets to library folder <b><%= _.escape(folder_name) %></b>");g.push("</div>");g.push('<div class="progress">');g.push(' <div class="progress-bar progress-bar-import" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100" style="width: 00%;">');g.push(' <span class="completion_span">0% Complete</span>');g.push(" </div>");g.push("</div>");g.push("");return _.template(g.join(""))},templateDeletingDatasetsProgressBar:function(){var g=[];g.push('<div class="import_text">');g.push("</div>");g.push('<div class="progress">');g.push(' <div class="progress-bar progress-bar-import" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100" style="width: 00%;">');g.push(' <span class="completion_span">0% Complete</span>');g.push(" </div>");g.push("</div>");g.push("");return _.template(g.join(""))},templateBrowserModal:function(){var g=[];g.push('<div id="file_browser_modal">');g.push('<div class="alert alert-info jstree-files-message">All files you select will be imported into the current folder.</div>');g.push('<div class="alert alert-info jstree-folders-message" style="display:none;">All files within the selected folders and their subfolders will be imported into the current folder.</div>');g.push('<div style="margin-bottom:1em;">');g.push('<label class="radio-inline">');g.push(' <input title="Switch to selecting files" type="radio" name="jstree-radio" value="jstree-disable-folders" checked="checked"> Files');g.push("</label>");g.push('<label class="radio-inline">');g.push(' <input title="Switch to selecting folders" type="radio" name="jstree-radio" value="jstree-disable-files"> Folders');g.push("</label>");g.push("</div>");g.push('<div style="margin-bottom:1em;">');g.push('<label class="checkbox-inline jstree-preserve-structure" style="display:none;">');g.push(' <input class="preserve-checkbox" type="checkbox" value="preserve_directory_structure">');g.push("Preserve directory structure");g.push(" </label>");g.push('<label class="checkbox-inline jstree-link-files" style="display:none;">');g.push(' <input class="link-checkbox" type="checkbox" value="link_files">');g.push("Link files instead of copying");g.push(" </label>");g.push("</div>");g.push('<div id="jstree_browser">');g.push("</div>");g.push("<hr />");g.push("<p>You can set extension type and genome for all imported datasets at once:</p>");g.push("<div>");g.push('Type: <span id="library_extension_select" class="library-extension-select" />');g.push(' Genome: <span id="library_genome_select" class="library-genome-select" />');g.push("</div>");g.push("</div>");return _.template(g.join(""))},templateImportPathModal:function(){var g=[];g.push('<div id="file_browser_modal">');g.push('<div class="alert alert-info jstree-folders-message">All files within the given folders and their subfolders will be imported into the current folder.</div>');g.push('<div style="margin-bottom: 0.5em;">');g.push('<label class="checkbox-inline jstree-preserve-structure">');g.push(' <input class="preserve-checkbox" type="checkbox" value="preserve_directory_structure">');g.push("Preserve directory structure");g.push(" </label>");g.push('<label class="checkbox-inline jstree-link-files">');g.push(' <input class="link-checkbox" type="checkbox" value="link_files">');g.push("Link files instead of copying");g.push(" </label>");g.push("</div>");g.push('<textarea id="import_paths" class="form-control" rows="5" placeholder="Absolute paths (or paths relative to Galaxy root) separated by newline"></textarea>');g.push("<hr />");g.push("<p>You can set extension type and genome for all imported datasets at once:</p>");g.push("<div>");g.push('Type: <span id="library_extension_select" class="library-extension-select" />');g.push(' Genome: <span id="library_genome_select" class="library-genome-select" />');g.push("</div>");g.push("</div>");return _.template(g.join(""))},templateAddFilesFromHistory:function(){var g=[];g.push('<div id="add_files_modal">');g.push('<div id="history_modal_combo_bulk">');g.push("Select history: ");g.push('<select id="dataset_add_bulk" name="dataset_add_bulk" style="width:66%; "> ');g.push(" <% _.each(histories, function(history) { %>");g.push(' <option value="<%= _.escape(history.get("id")) %>"><%= _.escape(history.get("name")) %></option>');g.push(" <% }); %>");g.push("</select>");g.push("</div>");g.push("<br/>");g.push('<div id="selected_history_content">');g.push("</div>");g.push("</div>");return _.template(g.join(""))},templateHistoryContents:function(){var g=[];g.push("<strong>Choose the datasets to import:</strong>");g.push("<ul>");g.push(" <% _.each(history_contents, function(history_item) { %>");g.push(' <li data-id="<%= _.escape(history_item.get("id")) %>">');g.push(' <input style="margin: 0;" type="checkbox"><%= _.escape(history_item.get("hid")) %>: <%= _.escape(history_item.get("name")) %>');g.push(" </li>");g.push(" <% }); %>");g.push("</ul>");return _.template(g.join(""))},templatePaginator:function(){tmpl_array=[];tmpl_array.push(' <ul class="pagination pagination-sm">');tmpl_array.push(" <% if ( ( show_page - 1 ) > 0 ) { %>");tmpl_array.push(" <% if ( ( show_page - 1 ) > page_count ) { %>");tmpl_array.push(' <li><a href="#folders/<%= id %>/page/1"><span class="fa fa-angle-double-left"></span></a></li>');tmpl_array.push(' <li class="disabled"><a href="#folders/<%= id %>/page/<% print( show_page ) %>"><% print( show_page - 1 ) %></a></li>');tmpl_array.push(" <% } else { %>");tmpl_array.push(' <li><a href="#folders/<%= id %>/page/1"><span class="fa fa-angle-double-left"></span></a></li>');tmpl_array.push(' <li><a href="#folders/<%= id %>/page/<% print( show_page - 1 ) %>"><% print( show_page - 1 ) %></a></li>');tmpl_array.push(" <% } %>");tmpl_array.push(" <% } else { %>");tmpl_array.push(' <li class="disabled"><a href="#folders/<%= id %>/page/1"><span class="fa fa-angle-double-left"></span></a></li>');tmpl_array.push(' <li class="disabled"><a href="#folders/<%= id %>/page/<% print( show_page ) %>"><% print( show_page - 1 ) %></a></li>');tmpl_array.push(" <% } %>");tmpl_array.push(' <li class="active">');tmpl_array.push(' <a href="#folders/<%= id %>/page/<% print( show_page ) %>"><% print( show_page ) %></a>');tmpl_array.push(" </li>");tmpl_array.push(" <% if ( ( show_page ) < page_count ) { %>");tmpl_array.push(' <li><a href="#folders/<%= id %>/page/<% print( show_page + 1 ) %>"><% print( show_page + 1 ) %></a></li>');tmpl_array.push(' <li><a href="#folders/<%= id %>/page/<% print( page_count ) %>"><span class="fa fa-angle-double-right"></span></a></li>');tmpl_array.push(" <% } else { %>");tmpl_array.push(' <li class="disabled"><a href="#folders/<%= id %>/page/<% print( show_page ) %>"><% print( show_page + 1 ) %></a></li>');tmpl_array.push(' <li class="disabled"><a href="#folders/<%= id %>/page/<% print( page_count ) %>"><span class="fa fa-angle-double-right"></span></a></li>');tmpl_array.push(" <% } %>");tmpl_array.push(" </ul>");tmpl_array.push(" <span>");tmpl_array.push(' showing <a data-toggle="tooltip" data-placement="top" title="Click to change the number of items on page" id="page_size_prompt"><%- items_shown %></a> of <%- total_items_count %> items');tmpl_array.push(" </span>");return _.template(tmpl_array.join(""))},});return{FolderToolbarView:b}});
\ No newline at end of file
+define(["galaxy.masthead","utils/utils","libs/toastr","mvc/library/library-model","mvc/ui/ui-select"],function(c,e,f,d,a){var b=Backbone.View.extend({el:"#center",events:{"click #toolbtn_create_folder":"createFolderFromModal","click #toolbtn_bulk_import":"modalBulkImport","click #include_deleted_datasets_chk":"checkIncludeDeleted","click #toolbtn_show_libinfo":"showLibInfo","click #toolbtn_bulk_delete":"deleteSelectedDatasets","click #page_size_prompt":"showPageSizePrompt"},defaults:{can_add_library_item:false,contains_file:false,chain_call_control:{total_number:0,failed_number:0},disabled_jstree_element:"folders"},modal:null,jstree:null,histories:null,select_genome:null,select_extension:null,list_extensions:[],auto:{id:"auto",text:"Auto-detect",description:"This system will try to detect the file type automatically. If your file is not detected properly as one of the known formats, it most likely means that it has some format problems (e.g., different number of columns on different rows). You can still coerce the system to set your data to the format you think it should be. You can also upload compressed files, which will automatically be decompressed."},list_genomes:[],initialize:function(g){this.options=_.defaults(g||{},this.defaults);this.fetchExtAndGenomes();this.render()},render:function(g){this.options=_.extend(this.options,g);var i=this.templateToolBar();var h={id:this.options.id,is_admin:false,is_anonym:true,mutiple_add_dataset_options:false};if(Galaxy.currUser){h.is_admin=Galaxy.currUser.isAdmin();h.is_anonym=Galaxy.currUser.isAnonymous();if(Galaxy.config.user_library_import_dir!==null||Galaxy.config.allow_library_path_paste!==false||Galaxy.config.library_import_dir!==null){h.mutiple_add_dataset_options=true}}this.$el.html(i(h))},renderPaginator:function(h){this.options=_.extend(this.options,h);var g=this.templatePaginator();this.$el.find("#folder_paginator").html(g({id:this.options.id,show_page:parseInt(this.options.show_page),page_count:parseInt(this.options.page_count),total_items_count:this.options.total_items_count,items_shown:this.options.items_shown}))},configureElements:function(g){this.options=_.extend(this.options,g);if(this.options.can_add_library_item===true){$(".add-library-items").show()}else{$(".add-library-items").hide()}if(this.options.contains_file===true){if(Galaxy.currUser){if(!Galaxy.currUser.isAnonymous()){$(".logged-dataset-manipulation").show();$(".dataset-manipulation").show()}else{$(".dataset-manipulation").show();$(".logged-dataset-manipulation").hide()}}else{$(".logged-dataset-manipulation").hide();$(".dataset-manipulation").hide()}}else{$(".logged-dataset-manipulation").hide();$(".dataset-manipulation").hide()}this.$el.find("[data-toggle]").tooltip()},createFolderFromModal:function(i){i.preventDefault();i.stopPropagation();var g=this;var h=this.templateNewFolderInModal();this.modal=Galaxy.modal;this.modal.show({closing_events:true,title:"Create New Folder",body:h(),buttons:{Create:function(){g.create_new_folder_event()},Close:function(){Galaxy.modal.hide()}}})},create_new_folder_event:function(){var g=this.serialize_new_folder();if(this.validate_new_folder(g)){var h=new d.FolderAsModel();url_items=Backbone.history.fragment.split("/");current_folder_id=url_items[url_items.length-1];h.url=h.urlRoot+"/"+current_folder_id;h.save(g,{success:function(i){Galaxy.modal.hide();f.success("Folder created.");i.set({type:"folder"});Galaxy.libraries.folderListView.collection.add(i)},error:function(j,i){Galaxy.modal.hide();if(typeof i.responseJSON!=="undefined"){f.error(i.responseJSON.err_msg)}else{f.error("An error ocurred.")}}})}else{f.error("Folder's name is missing.")}return false},serialize_new_folder:function(){return{name:$("input[name='Name']").val(),description:$("input[name='Description']").val()}},validate_new_folder:function(g){return g.name!==""},modalBulkImport:function(){var g=$("#folder_table").find(":checked");if(g.length===0){f.info("You must select some datasets first.")}else{this.refreshUserHistoriesList(function(i){var h=i.templateBulkImportInModal();i.modal=Galaxy.modal;i.modal.show({closing_events:true,title:"Import into History",body:h({histories:i.histories.models}),buttons:{Import:function(){i.importAllIntoHistory()},Close:function(){Galaxy.modal.hide()}}})})}},refreshUserHistoriesList:function(h){var g=this;this.histories=new d.GalaxyHistories();this.histories.fetch({success:function(){h(g)},error:function(j,i){if(typeof i.responseJSON!=="undefined"){f.error(i.responseJSON.err_msg)}else{f.error("An error ocurred.")}}})},importAllIntoHistory:function(){this.modal.disableButton("Import");var k=$("select[name=dataset_import_bulk] option:selected").val();var n=$("select[name=dataset_import_bulk] option:selected").text();this.options.last_used_history_id=k;var h=[];$("#folder_table").find(":checked").each(function(){if(this.parentElement.parentElement.id!==""){h.push(this.parentElement.parentElement.id)}});var m=[];for(var j=h.length-1;j>=0;j--){var g=h[j];var l=new d.HistoryItem();l.url=l.urlRoot+k+"/contents";l.content=g;l.source="library";m.push(l)}this.initChainCallControl({length:m.length,action:"to_history",history_name:n});jQuery.getJSON(galaxy_config.root+"history/set_as_current?id="+k);this.chainCallImportingIntoHistory(m,n)},updateProgress:function(){this.progress+=this.progressStep;$(".progress-bar-import").width(Math.round(this.progress)+"%");txt_representation=Math.round(this.progress)+"% Complete";$(".completion_span").text(txt_representation)},download:function(g,k){var i=[];$("#folder_table").find(":checked").each(function(){if(this.parentElement.parentElement.id!==""){i.push(this.parentElement.parentElement.id)}});var h=(window.galaxy_config?galaxy_config.root:"/")+"api/libraries/datasets/download/"+k;var j={ld_ids:i};this.processDownload(h,j,"get")},processDownload:function(h,i,j){if(h&&i){i=typeof i==="string"?i:$.param(i);var g="";$.each(i.split("&"),function(){var k=this.split("=");g+='<input type="hidden" name="'+k[0]+'" value="'+k[1]+'" />'});$('<form action="'+h+'" method="'+(j||"post")+'">'+g+"</form>").appendTo("body").submit().remove();f.info("Your download will begin soon.")}else{f.error("An error occurred.")}},addFilesFromHistoryModal:function(){this.refreshUserHistoriesList(function(g){g.modal=Galaxy.modal;var h=g.templateAddFilesFromHistory();var i=g.options.full_path[g.options.full_path.length-1][1];g.modal.show({closing_events:true,title:"Adding datasets from your history to folder "+i,body:h({histories:g.histories.models}),buttons:{Add:function(){g.addAllDatasetsFromHistory()},Close:function(){Galaxy.modal.hide()}},closing_callback:function(){Galaxy.libraries.library_router.back()}});if(g.histories.models.length>0){g.fetchAndDisplayHistoryContents(g.histories.models[0].id);$("#dataset_add_bulk").change(function(j){g.fetchAndDisplayHistoryContents(j.target.value)})}else{f.error("An error ocurred.")}})},importFilesFromPathModal:function(){var h=this;this.modal=Galaxy.modal;var g=this.templateImportPathModal();this.modal.show({closing_events:true,title:"Please enter paths to import",body:g({}),buttons:{Import:function(){h.importFromPathsClicked(h)},Close:function(){Galaxy.modal.hide()}},closing_callback:function(){Galaxy.libraries.library_router.navigate("folders/"+h.id,{trigger:true})}});this.renderSelectBoxes()},fetchExtAndGenomes:function(){var g=this;e.get({url:(window.galaxy_config?galaxy_config.root:"/")+"api/datatypes?extension_only=False",success:function(h){for(key in h){g.list_extensions.push({id:h[key].extension,text:h[key].extension,description:h[key].description,description_url:h[key].description_url})}g.list_extensions.sort(function(j,i){return j.id>i.id?1:j.id<i.id?-1:0});g.list_extensions.unshift(g.auto)}});e.get({url:(window.galaxy_config?galaxy_config.root:"/")+"api/genomes",success:function(h){for(key in h){g.list_genomes.push({id:h[key][1],text:h[key][0]})}g.list_genomes.sort(function(j,i){return j.id>i.id?1:j.id<i.id?-1:0})}})},renderSelectBoxes:function(){var g=this;this.select_genome=new a.View({css:"library-genome-select",data:g.list_genomes,container:Galaxy.modal.$el.find("#library_genome_select"),value:"?"});this.select_extension=new a.View({css:"library-extension-select",data:g.list_extensions,container:Galaxy.modal.$el.find("#library_extension_select"),value:"auto"})},importFilesFromGalaxyFolderModal:function(g){var i=this;var h=this.templateBrowserModal();this.modal=Galaxy.modal;this.modal.show({closing_events:true,title:"Please select folders or files",body:h({}),buttons:{Import:function(){i.importFromJstreePath(i,g)},Close:function(){Galaxy.modal.hide()}},closing_callback:function(){Galaxy.libraries.library_router.navigate("folders/"+i.id,{trigger:true})}});this.renderSelectBoxes();g.disabled_jstree_element="folders";this.renderJstree(g);$("input[type=radio]").change(function(j){if(j.target.value==="jstree-disable-folders"){g.disabled_jstree_element="folders";i.renderJstree(g);$(".jstree-folders-message").hide();$(".jstree-preserve-structure").hide();$(".jstree-link-files").hide();$(".jstree-files-message").show()}else{if(j.target.value==="jstree-disable-files"){$(".jstree-files-message").hide();$(".jstree-folders-message").show();$(".jstree-link-files").show();$(".jstree-preserve-structure").show();g.disabled_jstree_element="files";i.renderJstree(g)}}})},renderJstree:function(g){var i=this;this.options=_.extend(this.options,g);var j=g.source||"userdir";var h=this.options.disabled_jstree_element;this.jstree=new d.Jstree();this.jstree.url=this.jstree.urlRoot+"?target="+j+"&format=jstree&disable="+h;this.jstree.fetch({success:function(l,k){define("jquery",function(){return jQuery});require(["libs/jquery/jstree"],function(m){$("#jstree_browser").jstree("destroy");$("#jstree_browser").jstree({core:{data:l},plugins:["types","checkbox"],types:{folder:{icon:"jstree-folder"},file:{icon:"jstree-file"}},checkbox:{three_state:false}})})},error:function(l,k){if(typeof k.responseJSON!=="undefined"){f.error(k.responseJSON.err_msg)}else{f.error("An error ocurred.")}}})},importFromPathsClicked:function(){var g=this.modal.$el.find(".preserve-checkbox").is(":checked");var n=this.modal.$el.find(".link-checkbox").is(":checked");var h=this.select_extension.value();var j=this.select_genome.value();var m=$("textarea#import_paths").val();var l=[];if(!m){f.info("Please enter a path relative to Galaxy root.")}else{this.modal.disableButton("Import");m=m.split("\n");for(var k=m.length-1;k>=0;k--){trimmed=m[k].trim();if(trimmed.length!==0){l.push(trimmed)}}this.initChainCallControl({length:l.length,action:"adding_datasets"});this.chainCallImportingFolders({paths:l,preserve_dirs:g,link_data:n,source:"admin_path",file_type:h,dbkey:j})}},initChainCallControl:function(g){var h;switch(g.action){case"adding_datasets":h=this.templateAddingDatasetsProgressBar();this.modal.$el.find(".modal-body").html(h({folder_name:this.options.folder_name}));break;case"deleting_datasets":h=this.templateDeletingDatasetsProgressBar();this.modal.$el.find(".modal-body").html(h());break;case"to_history":h=this.templateImportIntoHistoryProgressBar();this.modal.$el.find(".modal-body").html(h({history_name:g.history_name}));break;default:console.error("Wrong action specified.");break}this.progress=0;this.progressStep=100/g.length;this.options.chain_call_control.total_number=g.length;this.options.chain_call_control.failed_number=0},importFromJstreePath:function(n,r){var g=$("#jstree_browser").jstree().get_selected(true);var m=this.modal.$el.find(".preserve-checkbox").is(":checked");var o=this.modal.$el.find(".link-checkbox").is(":checked");var j=this.select_extension.value();var p=this.select_genome.value();var k=g[0].type;var q=[];if(g.length<1){f.info("Please select some items first.")}else{this.modal.disableButton("Import");for(var l=g.length-1;l>=0;l--){if(g[l].li_attr.full_path!==undefined){q.push(g[l].li_attr.full_path)}}this.initChainCallControl({length:q.length,action:"adding_datasets"});if(k==="folder"){var h=r.source+"_folder";this.chainCallImportingFolders({paths:q,preserve_dirs:m,link_data:o,source:h,file_type:j,dbkey:p})}else{if(k==="file"){var h=r.source+"_file";this.chainCallImportingUserdirFiles({paths:q,file_type:j,dbkey:p,source:h})}}}},fetchAndDisplayHistoryContents:function(i){var h=new d.HistoryContents({id:i});var g=this;h.fetch({success:function(k){var j=g.templateHistoryContents();g.histories.get(i).set({contents:k});g.modal.$el.find("#selected_history_content").html(j({history_contents:k.models.reverse()}))},error:function(k,j){if(typeof j.responseJSON!=="undefined"){f.error(j.responseJSON.err_msg)}else{f.error("An error ocurred.")}}})},addAllDatasetsFromHistory:function(){var l=this.modal.$el.find("#selected_history_content").find(":checked");var g=[];var k=[];if(l.length<1){f.info("You must select some datasets first.")}else{this.modal.disableButton("Add");l.each(function(){var i=$(this.parentElement).data("id");if(i){g.push(i)}});for(var j=g.length-1;j>=0;j--){history_dataset_id=g[j];var h=new d.Item();h.url=(window.galaxy_config?galaxy_config.root:"/")+"api/folders/"+this.options.id+"/contents";h.set({from_hda_id:history_dataset_id});k.push(h)}this.initChainCallControl({length:k.length,action:"adding_datasets"});this.chainCallAddingHdas(k)}},chainCallImportingIntoHistory:function(h,k){var g=this;var i=h.pop();if(typeof i=="undefined"){if(this.options.chain_call_control.failed_number===0){f.success("Selected datasets imported into history. Click this to start analysing it.","",{onclick:function(){window.location="/"}})}else{if(this.options.chain_call_control.failed_number===this.options.chain_call_control.total_number){f.error("There was an error and no datasets were imported into history.")}else{if(this.options.chain_call_control.failed_number<this.options.chain_call_control.total_number){f.warning("Some of the datasets could not be imported into history. Click this to see what was imported.","",{onclick:function(){window.location="/"}})}}}Galaxy.modal.hide();return true}var j=$.when(i.save({content:i.content,source:i.source}));j.done(function(){g.updateProgress();g.chainCallImportingIntoHistory(h,k)}).fail(function(){g.options.chain_call_control.failed_number+=1;g.updateProgress();g.chainCallImportingIntoHistory(h,k)})},chainCallImportingUserdirFiles:function(g){var h=this;var i=g.paths.pop();if(typeof i==="undefined"){if(this.options.chain_call_control.failed_number===0){f.success("Selected files imported into the current folder");Galaxy.modal.hide()}else{f.error("An error occured.")}return true}var j=$.when($.post((window.galaxy_config?galaxy_config.root:"/")+"api/libraries/datasets?encoded_folder_id="+h.id+"&source="+g.source+"&path="+i+"&file_type="+g.file_type+"&dbkey="+g.dbkey));j.done(function(k){h.updateProgress();h.chainCallImportingUserdirFiles(g)}).fail(function(){h.options.chain_call_control.failed_number+=1;h.updateProgress();h.chainCallImportingUserdirFiles(g)})},chainCallImportingFolders:function(g){var h=this;var i=g.paths.pop();if(typeof i=="undefined"){if(this.options.chain_call_control.failed_number===0){f.success("Selected folders and their contents imported into the current folder.");Galaxy.modal.hide()}else{f.error("An error occured.")}return true}var j=$.when($.post((window.galaxy_config?galaxy_config.root:"/")+"api/libraries/datasets?encoded_folder_id="+h.id+"&source="+g.source+"&path="+i+"&preserve_dirs="+g.preserve_dirs+"&link_data="+g.link_data+"&file_type="+g.file_type+"&dbkey="+g.dbkey));j.done(function(k){h.updateProgress();h.chainCallImportingFolders(g)}).fail(function(){h.options.chain_call_control.failed_number+=1;h.updateProgress();h.chainCallImportingFolders(g)})},chainCallAddingHdas:function(h){var g=this;this.added_hdas=new d.Folder();var i=h.pop();if(typeof i=="undefined"){if(this.options.chain_call_control.failed_number===0){f.success("Selected datasets from history added to the folder")}else{if(this.options.chain_call_control.failed_number===this.options.chain_call_control.total_number){f.error("There was an error and no datasets were added to the folder.")}else{if(this.options.chain_call_control.failed_number<this.options.chain_call_control.total_number){f.warning("Some of the datasets could not be added to the folder")}}}Galaxy.modal.hide();return this.added_hdas}var j=$.when(i.save({from_hda_id:i.get("from_hda_id")}));j.done(function(k){Galaxy.libraries.folderListView.collection.add(k);g.updateProgress();g.chainCallAddingHdas(h)}).fail(function(){g.options.chain_call_control.failed_number+=1;g.updateProgress();g.chainCallAddingHdas(h)})},chainCallDeletingHdas:function(h){var g=this;this.deleted_lddas=new d.Folder();var i=h.pop();if(typeof i==="undefined"){if(this.options.chain_call_control.failed_number===0){f.success("Selected datasets were deleted.")}else{if(this.options.chain_call_control.failed_number===this.options.chain_call_control.total_number){f.error("There was an error and no datasets were deleted. Please make sure you have sufficient permissions.")}else{if(this.options.chain_call_control.failed_number<this.options.chain_call_control.total_number){f.warning("Some of the datasets could not be deleted. Please make sure you have sufficient permissions.")}}}Galaxy.modal.hide();return this.deleted_lddas}var j=$.when(i.destroy());j.done(function(l){Galaxy.libraries.folderListView.collection.remove(i.id);g.updateProgress();if(Galaxy.libraries.folderListView.options.include_deleted){var k=new d.Item(l);Galaxy.libraries.folderListView.collection.add(k)}g.chainCallDeletingHdas(h)}).fail(function(){g.options.chain_call_control.failed_number+=1;g.updateProgress();g.chainCallDeletingHdas(h)})},checkIncludeDeleted:function(g){if(g.target.checked){Galaxy.libraries.folderListView.fetchFolder({include_deleted:true})}else{Galaxy.libraries.folderListView.fetchFolder({include_deleted:false})}},deleteSelectedDatasets:function(){var g=$("#folder_table").find(":checked");if(g.length===0){f.info("You must select at least one dataset for deletion.")}else{var k=this.templateDeletingDatasetsProgressBar();this.modal=Galaxy.modal;this.modal.show({closing_events:true,title:"Deleting selected datasets",body:k({}),buttons:{Close:function(){Galaxy.modal.hide()}}});this.options.chain_call_control.total_number=0;this.options.chain_call_control.failed_number=0;var h=[];g.each(function(){if(this.parentElement.parentElement.id!==""){h.push(this.parentElement.parentElement.id)}});this.progressStep=100/h.length;this.progress=0;var m=[];for(var j=h.length-1;j>=0;j--){var l=new d.Item({id:h[j]});m.push(l)}this.options.chain_call_control.total_number=h.length;this.chainCallDeletingHdas(m)}},showLibInfo:function(){var h=Galaxy.libraries.folderListView.folderContainer.attributes.metadata.parent_library_id;var g=null;var i=this;if(Galaxy.libraries.libraryListView!==null){g=Galaxy.libraries.libraryListView.collection.get(h);this.showLibInfoModal(g)}else{g=new d.Library({id:h});g.fetch({success:function(){i.showLibInfoModal(g)},error:function(k,j){if(typeof j.responseJSON!=="undefined"){f.error(j.responseJSON.err_msg)}else{f.error("An error ocurred.")}}})}},showLibInfoModal:function(g){var h=this.templateLibInfoInModal();this.modal=Galaxy.modal;this.modal.show({closing_events:true,title:"Library Information",body:h({library:g}),buttons:{Close:function(){Galaxy.modal.hide()}}})},showImportModal:function(g){switch(g.source){case"history":this.addFilesFromHistoryModal();break;case"importdir":this.importFilesFromGalaxyFolderModal({source:"importdir"});break;case"path":this.importFilesFromPathModal();break;case"userdir":this.importFilesFromGalaxyFolderModal({source:"userdir"});break;default:Galaxy.libraries.library_router.back();f.error("Invalid import source.");break}},showPageSizePrompt:function(){var g=prompt("How many items per page do you want to see?",Galaxy.libraries.preferences.get("folder_page_size"));if((g!=null)&&(g==parseInt(g))){Galaxy.libraries.preferences.set({folder_page_size:parseInt(g)});Galaxy.libraries.folderListView.render({id:this.options.id,show_page:1})}},templateToolBar:function(){tmpl_array=[];tmpl_array.push('<div class="library_style_container">');tmpl_array.push(' <div id="library_toolbar">');tmpl_array.push(" <span><strong>DATA LIBRARIES</strong></span>");tmpl_array.push(' <span data-toggle="tooltip" data-placement="top" class="logged-dataset-manipulation" title="Include deleted datasets" style="display:none;"> | <input id="include_deleted_datasets_chk" style="margin: 0;" type="checkbox"> include deleted | </input></span>');tmpl_array.push(' <button style="display:none;" data-toggle="tooltip" data-placement="top" title="Create New Folder" id="toolbtn_create_folder" class="btn btn-default primary-button add-library-items" type="button"><span class="fa fa-plus"></span><span class="fa fa-folder"></span></button>');tmpl_array.push("<% if(mutiple_add_dataset_options) { %>");tmpl_array.push(' <div class="btn-group add-library-items" style="display:none;">');tmpl_array.push(' <button title="Add Datasets to Current Folder" id="" type="button" class="primary-button dropdown-toggle" data-toggle="dropdown">');tmpl_array.push(' <span class="fa fa-plus"></span><span class="fa fa-file"></span><span class="caret"></span>');tmpl_array.push(" </button>");tmpl_array.push(' <ul class="dropdown-menu" role="menu">');tmpl_array.push(' <li><a href="#folders/<%= id %>/import/history"> from History</a></li>');tmpl_array.push("<% if(Galaxy.config.user_library_import_dir !== null) { %>");tmpl_array.push(' <li><a href="#folders/<%= id %>/import/userdir"> from User Directory</a></li>');tmpl_array.push("<% } %>");tmpl_array.push("<% if(Galaxy.config.allow_library_path_paste) { %>");tmpl_array.push(' <li class="divider"></li>');tmpl_array.push(' <li class="dropdown-header">Admins only</li>');tmpl_array.push("<% if(Galaxy.config.library_import_dir !== null) { %>");tmpl_array.push(' <li><a href="#folders/<%= id %>/import/importdir">from Import Directory</a></li>');tmpl_array.push("<% } %>");tmpl_array.push("<% if(Galaxy.config.allow_library_path_paste) { %>");tmpl_array.push(' <li><a href="#folders/<%= id %>/import/path">from Path</a></li>');tmpl_array.push("<% } %>");tmpl_array.push("<% } %>");tmpl_array.push(" </ul>");tmpl_array.push(" </div>");tmpl_array.push("<% } else { %>");tmpl_array.push(' <a data-placement="top" title="Add Datasets to Current Folder" style="display:none;" class="btn btn-default add-library-items" href="#folders/<%= id %>/import/history" role="button"><span class="fa fa-plus"></span><span class="fa fa-file"></span></span></a>');tmpl_array.push("<% } %>");tmpl_array.push(' <button data-toggle="tooltip" data-placement="top" title="Import selected datasets into history" id="toolbtn_bulk_import" class="primary-button dataset-manipulation" style="margin-left: 0.5em; display:none;" type="button"><span class="fa fa-book"></span> to History</button>');tmpl_array.push(' <div id="toolbtn_dl" class="btn-group dataset-manipulation" style="margin-left: 0.5em; display:none; ">');tmpl_array.push(' <button title="Download selected datasets as archive" id="drop_toggle" type="button" class="primary-button dropdown-toggle" data-toggle="dropdown">');tmpl_array.push(' <span class="fa fa-download"></span> Download <span class="caret"></span>');tmpl_array.push(" </button>");tmpl_array.push(' <ul class="dropdown-menu" role="menu">');tmpl_array.push(' <li><a href="#/folders/<%= id %>/download/tgz">.tar.gz</a></li>');tmpl_array.push(' <li><a href="#/folders/<%= id %>/download/tbz">.tar.bz</a></li>');tmpl_array.push(' <li><a href="#/folders/<%= id %>/download/zip">.zip</a></li>');tmpl_array.push(" </ul>");tmpl_array.push(" </div>");tmpl_array.push(' <button data-toggle="tooltip" data-placement="top" title="Mark selected datasets deleted" id="toolbtn_bulk_delete" class="primary-button logged-dataset-manipulation" style="margin-left: 0.5em; display:none; " type="button"><span class="fa fa-times"></span> Delete</button>');tmpl_array.push(' <button data-id="<%- id %>" data-toggle="tooltip" data-placement="top" title="Show library information" id="toolbtn_show_libinfo" class="primary-button" style="margin-left: 0.5em;" type="button"><span class="fa fa-info-circle"></span> Library Info</button>');tmpl_array.push(' <span class="help-button" data-toggle="tooltip" data-placement="top" title="Visit Libraries Wiki"><a href="https://wiki.galaxyproject.org/DataLibraries/screen/FolderContents" target="_blank"><button class="primary-button" type="button"><span class="fa fa-question-circle"></span> Help</button></a></span>');tmpl_array.push(' <span id="folder_paginator" class="library-paginator">');tmpl_array.push(" </span>");tmpl_array.push(" </div>");tmpl_array.push(' <div id="folder_items_element">');tmpl_array.push(" </div>");tmpl_array.push("</div>");return _.template(tmpl_array.join(""))},templateLibInfoInModal:function(){tmpl_array=[];tmpl_array.push('<div id="lif_info_modal">');tmpl_array.push("<h2>Library name:</h2>");tmpl_array.push('<p><%- library.get("name") %></p>');tmpl_array.push("<h3>Library description:</h3>");tmpl_array.push('<p><%- library.get("description") %></p>');tmpl_array.push("<h3>Library synopsis:</h3>");tmpl_array.push('<p><%- library.get("synopsis") %></p>');tmpl_array.push("</div>");return _.template(tmpl_array.join(""))},templateNewFolderInModal:function(){tmpl_array=[];tmpl_array.push('<div id="new_folder_modal">');tmpl_array.push("<form>");tmpl_array.push('<input type="text" name="Name" value="" placeholder="Name">');tmpl_array.push('<input type="text" name="Description" value="" placeholder="Description">');tmpl_array.push("</form>");tmpl_array.push("</div>");return _.template(tmpl_array.join(""))},templateBulkImportInModal:function(){var g=[];g.push('<span id="history_modal_combo_bulk" style="width:90%; margin-left: 1em; margin-right: 1em; ">');g.push("Select history: ");g.push('<select id="dataset_import_bulk" name="dataset_import_bulk" style="width:50%; margin-bottom: 1em; "> ');g.push(" <% _.each(histories, function(history) { %>");g.push(' <option value="<%= _.escape(history.get("id")) %>"><%= _.escape(history.get("name")) %></option>');g.push(" <% }); %>");g.push("</select>");g.push("</span>");return _.template(g.join(""))},templateImportIntoHistoryProgressBar:function(){var g=[];g.push('<div class="import_text">');g.push("Importing selected datasets to history <b><%= _.escape(history_name) %></b>");g.push("</div>");g.push('<div class="progress">');g.push(' <div class="progress-bar progress-bar-import" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100" style="width: 00%;">');g.push(' <span class="completion_span">0% Complete</span>');g.push(" </div>");g.push("</div>");g.push("");return _.template(g.join(""))},templateAddingDatasetsProgressBar:function(){var g=[];g.push('<div class="import_text">');g.push("Adding selected datasets to library folder <b><%= _.escape(folder_name) %></b>");g.push("</div>");g.push('<div class="progress">');g.push(' <div class="progress-bar progress-bar-import" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100" style="width: 00%;">');g.push(' <span class="completion_span">0% Complete</span>');g.push(" </div>");g.push("</div>");g.push("");return _.template(g.join(""))},templateDeletingDatasetsProgressBar:function(){var g=[];g.push('<div class="import_text">');g.push("</div>");g.push('<div class="progress">');g.push(' <div class="progress-bar progress-bar-import" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100" style="width: 00%;">');g.push(' <span class="completion_span">0% Complete</span>');g.push(" </div>");g.push("</div>");g.push("");return _.template(g.join(""))},templateBrowserModal:function(){var g=[];g.push('<div id="file_browser_modal">');g.push('<div class="alert alert-info jstree-files-message">All files you select will be imported into the current folder.</div>');g.push('<div class="alert alert-info jstree-folders-message" style="display:none;">All files within the selected folders and their subfolders will be imported into the current folder.</div>');g.push('<div style="margin-bottom:1em;">');g.push('<label class="radio-inline">');g.push(' <input title="Switch to selecting files" type="radio" name="jstree-radio" value="jstree-disable-folders" checked="checked"> Files');g.push("</label>");g.push('<label class="radio-inline">');g.push(' <input title="Switch to selecting folders" type="radio" name="jstree-radio" value="jstree-disable-files"> Folders');g.push("</label>");g.push("</div>");g.push('<div style="margin-bottom:1em;">');g.push('<label class="checkbox-inline jstree-preserve-structure" style="display:none;">');g.push(' <input class="preserve-checkbox" type="checkbox" value="preserve_directory_structure">');g.push("Preserve directory structure");g.push(" </label>");g.push('<label class="checkbox-inline jstree-link-files" style="display:none;">');g.push(' <input class="link-checkbox" type="checkbox" value="link_files">');g.push("Link files instead of copying");g.push(" </label>");g.push("</div>");g.push('<div id="jstree_browser">');g.push("</div>");g.push("<hr />");g.push("<p>You can set extension type and genome for all imported datasets at once:</p>");g.push("<div>");g.push('Type: <span id="library_extension_select" class="library-extension-select" />');g.push(' Genome: <span id="library_genome_select" class="library-genome-select" />');g.push("</div>");g.push("</div>");return _.template(g.join(""))},templateImportPathModal:function(){var g=[];g.push('<div id="file_browser_modal">');g.push('<div class="alert alert-info jstree-folders-message">All files within the given folders and their subfolders will be imported into the current folder.</div>');g.push('<div style="margin-bottom: 0.5em;">');g.push('<label class="checkbox-inline jstree-preserve-structure">');g.push(' <input class="preserve-checkbox" type="checkbox" value="preserve_directory_structure">');g.push("Preserve directory structure");g.push(" </label>");g.push('<label class="checkbox-inline jstree-link-files">');g.push(' <input class="link-checkbox" type="checkbox" value="link_files">');g.push("Link files instead of copying");g.push(" </label>");g.push("</div>");g.push('<textarea id="import_paths" class="form-control" rows="5" placeholder="Absolute paths (or paths relative to Galaxy root) separated by newline"></textarea>');g.push("<hr />");g.push("<p>You can set extension type and genome for all imported datasets at once:</p>");g.push("<div>");g.push('Type: <span id="library_extension_select" class="library-extension-select" />');g.push(' Genome: <span id="library_genome_select" class="library-genome-select" />');g.push("</div>");g.push("</div>");return _.template(g.join(""))},templateAddFilesFromHistory:function(){var g=[];g.push('<div id="add_files_modal">');g.push('<div id="history_modal_combo_bulk">');g.push("Select history: ");g.push('<select id="dataset_add_bulk" name="dataset_add_bulk" style="width:66%; "> ');g.push(" <% _.each(histories, function(history) { %>");g.push(' <option value="<%= _.escape(history.get("id")) %>"><%= _.escape(history.get("name")) %></option>');g.push(" <% }); %>");g.push("</select>");g.push("</div>");g.push("<br/>");g.push('<div id="selected_history_content">');g.push("</div>");g.push("</div>");return _.template(g.join(""))},templateHistoryContents:function(){var g=[];g.push("<strong>Choose the datasets to import:</strong>");g.push("<ul>");g.push(" <% _.each(history_contents, function(history_item) { %>");g.push(' <li data-id="<%= _.escape(history_item.get("id")) %>">');g.push(' <input style="margin: 0;" type="checkbox"><%= _.escape(history_item.get("hid")) %>: <%= _.escape(history_item.get("name")) %>');g.push(" </li>");g.push(" <% }); %>");g.push("</ul>");return _.template(g.join(""))},templatePaginator:function(){tmpl_array=[];tmpl_array.push(' <ul class="pagination pagination-sm">');tmpl_array.push(" <% if ( ( show_page - 1 ) > 0 ) { %>");tmpl_array.push(" <% if ( ( show_page - 1 ) > page_count ) { %>");tmpl_array.push(' <li><a href="#folders/<%= id %>/page/1"><span class="fa fa-angle-double-left"></span></a></li>');tmpl_array.push(' <li class="disabled"><a href="#folders/<%= id %>/page/<% print( show_page ) %>"><% print( show_page - 1 ) %></a></li>');tmpl_array.push(" <% } else { %>");tmpl_array.push(' <li><a href="#folders/<%= id %>/page/1"><span class="fa fa-angle-double-left"></span></a></li>');tmpl_array.push(' <li><a href="#folders/<%= id %>/page/<% print( show_page - 1 ) %>"><% print( show_page - 1 ) %></a></li>');tmpl_array.push(" <% } %>");tmpl_array.push(" <% } else { %>");tmpl_array.push(' <li class="disabled"><a href="#folders/<%= id %>/page/1"><span class="fa fa-angle-double-left"></span></a></li>');tmpl_array.push(' <li class="disabled"><a href="#folders/<%= id %>/page/<% print( show_page ) %>"><% print( show_page - 1 ) %></a></li>');tmpl_array.push(" <% } %>");tmpl_array.push(' <li class="active">');tmpl_array.push(' <a href="#folders/<%= id %>/page/<% print( show_page ) %>"><% print( show_page ) %></a>');tmpl_array.push(" </li>");tmpl_array.push(" <% if ( ( show_page ) < page_count ) { %>");tmpl_array.push(' <li><a href="#folders/<%= id %>/page/<% print( show_page + 1 ) %>"><% print( show_page + 1 ) %></a></li>');tmpl_array.push(' <li><a href="#folders/<%= id %>/page/<% print( page_count ) %>"><span class="fa fa-angle-double-right"></span></a></li>');tmpl_array.push(" <% } else { %>");tmpl_array.push(' <li class="disabled"><a href="#folders/<%= id %>/page/<% print( show_page ) %>"><% print( show_page + 1 ) %></a></li>');tmpl_array.push(' <li class="disabled"><a href="#folders/<%= id %>/page/<% print( page_count ) %>"><span class="fa fa-angle-double-right"></span></a></li>');tmpl_array.push(" <% } %>");tmpl_array.push(" </ul>");tmpl_array.push(" <span>");tmpl_array.push(' showing <a data-toggle="tooltip" data-placement="top" title="Click to change the number of items on page" id="page_size_prompt"><%- items_shown %></a> of <%- total_items_count %> items');tmpl_array.push(" </span>");return _.template(tmpl_array.join(""))},});return{FolderToolbarView:b}});
\ No newline at end of file
diff -r 28113eeee212db2eef9cf4304abe9c3b2a92abcd -r bfd4635011e39aa210b2b1498dd65831dd2a365e static/scripts/packed/mvc/library/library-library-view.js
--- a/static/scripts/packed/mvc/library/library-library-view.js
+++ b/static/scripts/packed/mvc/library/library-library-view.js
@@ -1,1 +1,1 @@
-define(["libs/toastr","mvc/library/library-model","mvc/ui/ui-select"],function(d,c,a){var b=Backbone.View.extend({el:"#center",model:null,options:{},events:{"click .toolbtn_save_permissions":"savePermissions"},initialize:function(e){this.options=_.extend(this.options,e);if(this.options.id){this.fetchLibrary()}},fetchLibrary:function(e){this.options=_.extend(this.options,e);this.model=new c.Library({id:this.options.id});var f=this;this.model.fetch({success:function(){if(f.options.show_permissions){f.showPermissions()}else{f.render()}},error:function(h,g){if(typeof g.responseJSON!=="undefined"){d.error(g.responseJSON.err_msg+" Click this to go back.","",{onclick:function(){Galaxy.libraries.library_router.back()}})}else{d.error("An error ocurred. Click this to go back.","",{onclick:function(){Galaxy.libraries.library_router.back()}})}}})},render:function(e){$(".tooltip").remove();this.options=_.extend(this.options,e);var f=this.templateLibrary();this.$el.html(f({item:this.model}));$("#center [data-toggle]").tooltip()},shareDataset:function(){d.info("Feature coming soon.")},goBack:function(){Galaxy.libraries.library_router.back()},showPermissions:function(f){this.options=_.extend(this.options,f);$(".tooltip").remove();if(this.options.fetched_permissions!==undefined){if(this.options.fetched_permissions.access_library_role_list.length===0){this.model.set({is_unrestricted:true})}else{this.model.set({is_unrestricted:false})}}var h=false;if(Galaxy.currUser){h=Galaxy.currUser.isAdmin()}var g=this.templateLibraryPermissions();this.$el.html(g({library:this.model,is_admin:h}));var e=this;if(this.options.fetched_permissions===undefined){$.get("/api/libraries/"+e.id+"/permissions?scope=current").done(function(i){e.prepareSelectBoxes({fetched_permissions:i})}).fail(function(){d.error("An error occurred while attempting to fetch library permissions.")})}else{this.prepareSelectBoxes({})}$("#center [data-toggle]").tooltip();$("#center").css("overflow","auto")},_serializeRoles:function(g){var e=[];for(var f=0;f<g.length;f++){e.push(g[f][1]+":"+g[f][0])}return e},prepareSelectBoxes:function(i){this.options=_.extend(this.options,i);var e=this.options.fetched_permissions;var g=this;var f=this._serializeRoles(e.access_library_role_list);var j=this._serializeRoles(e.add_library_item_role_list);var h=this._serializeRoles(e.manage_library_role_list);var k=this._serializeRoles(e.modify_library_role_list);g.accessSelectObject=new a.View(this._createSelectOptions(this,"access_perm",f,true));g.addSelectObject=new a.View(this._createSelectOptions(this,"add_perm",j,false));g.manageSelectObject=new a.View(this._createSelectOptions(this,"manage_perm",h,false));g.modifySelectObject=new a.View(this._createSelectOptions(this,"modify_perm",k,false))},_createSelectOptions:function(f,k,i,e){e=e===true?e:false;var j={minimumInputLength:0,css:k,multiple:true,placeholder:"Click to select a role",container:f.$el.find("#"+k),ajax:{url:"/api/libraries/"+f.id+"/permissions?scope=available&is_library_access="+e,dataType:"json",quietMillis:100,data:function(l,m){return{q:l,page_limit:10,page:m}},results:function(n,m){var l=(m*10)<n.total;return{results:n.roles,more:l}}},formatResult:function g(l){return l.name+" type: "+l.type},formatSelection:function h(l){return l.name},initSelection:function(l,n){var m=[];$(l.val().split(",")).each(function(){var o=this.split(":");m.push({id:o[0],name:o[1]})});n(m)},initialData:i,dropdownCssClass:"bigdrop"};return j},comingSoon:function(){d.warning("Feature coming soon.")},copyToClipboard:function(){var e=Backbone.history.location.href;if(e.lastIndexOf("/permissions")!==-1){e=e.substr(0,e.lastIndexOf("/permissions"))}window.prompt("Copy to clipboard: Ctrl+C, Enter",e)},makeDatasetPrivate:function(){var e=this;$.post("/api/libraries/datasets/"+e.id+"/permissions?action=make_private").done(function(f){e.model.set({is_unrestricted:false});e.showPermissions({fetched_permissions:f});d.success("The dataset is now private to you.")}).fail(function(){d.error("An error occurred while attempting to make dataset private.")})},removeDatasetRestrictions:function(){var e=this;$.post("/api/libraries/datasets/"+e.id+"/permissions?action=remove_restrictions").done(function(f){e.model.set({is_unrestricted:true});e.showPermissions({fetched_permissions:f});d.success("Access to this dataset is now unrestricted.")}).fail(function(){d.error("An error occurred while attempting to make dataset unrestricted.")})},_extractIds:function(e){ids_list=[];for(var f=e.length-1;f>=0;f--){ids_list.push(e[f].id)}return ids_list},savePermissions:function(h){var g=this;var i=this._extractIds(this.accessSelectObject.$el.select2("data"));var e=this._extractIds(this.addSelectObject.$el.select2("data"));var j=this._extractIds(this.manageSelectObject.$el.select2("data"));var f=this._extractIds(this.modifySelectObject.$el.select2("data"));$.post("/api/libraries/"+g.id+"/permissions?action=set_permissions",{"access_ids[]":i,"add_ids[]":e,"manage_ids[]":j,"modify_ids[]":f,}).done(function(k){g.showPermissions({fetched_permissions:k});d.success("Permissions saved.")}).fail(function(){d.error("An error occurred while attempting to set library permissions.")})},templateLibrary:function(){var e=[];e.push('<div class="library_style_container">');e.push(' <div id="library_toolbar">');e.push(' <button data-toggle="tooltip" data-placement="top" title="Modify library item" class="btn btn-default toolbtn_modify_dataset primary-button" type="button"><span class="fa fa-pencil"></span> Modify</span></button>');e.push(' <a href="#folders/<%- item.get("folder_id") %>/datasets/<%- item.id %>/permissions"><button data-toggle="tooltip" data-placement="top" title="Manage permissions" class="btn btn-default toolbtn_change_permissions primary-button" type="button"><span class="fa fa-group"></span> Permissions</span></button></a>');e.push(' <button data-toggle="tooltip" data-placement="top" title="Share dataset" class="btn btn-default toolbtn-share-dataset primary-button" type="button"><span class="fa fa-share"></span> Share</span></button>');e.push(" </div>");e.push(" <p>");e.push(" This dataset is unrestricted so everybody can access it. Just share the URL of this page. ");e.push(' <button data-toggle="tooltip" data-placement="top" title="Copy to clipboard" class="btn btn-default btn-copy-link-to-clipboard primary-button" type="button"><span class="fa fa-clipboard"></span> To Clipboard</span></button> ');e.push(" </p>");e.push('<div class="dataset_table">');e.push(' <table class="grid table table-striped table-condensed">');e.push(" <tr>");e.push(' <th scope="row" id="id_row" data-id="<%= _.escape(item.get("ldda_id")) %>">Name</th>');e.push(' <td><%= _.escape(item.get("name")) %></td>');e.push(" </tr>");e.push(' <% if (item.get("file_ext")) { %>');e.push(" <tr>");e.push(' <th scope="row">Data type</th>');e.push(' <td><%= _.escape(item.get("file_ext")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(" </table>");e.push("</div>");e.push("</div>");return _.template(e.join(""))},templateLibraryPermissions:function(){var e=[];e.push('<div class="library_style_container">');e.push(' <div id="library_toolbar">');e.push(' <a href="#"><button data-toggle="tooltip" data-placement="top" title="Go back to the list of Libraries" class="btn btn-default primary-button" type="button"><span class="fa fa-list"></span> Libraries</span></button></a>');e.push(" </div>");e.push('<h1>Library: <%= _.escape(library.get("name")) %></h1>');e.push('<div class="alert alert-warning">');e.push("<% if (is_admin) { %>");e.push("You are logged in as an <strong>administrator</strong> therefore you can manage any library on this Galaxy instance. Please make sure you understand the consequences.");e.push("<% } else { %>");e.push("You can assign any number of roles to any of the following permission types. However please read carefully the implications of such actions.");e.push("<% }%>");e.push("</div>");e.push('<div class="dataset_table">');e.push("<h2>Library permissions</h2>");e.push("<h4>Roles that can access the library</h4>");e.push('<div id="access_perm" class="access_perm roles-selection"></div>');e.push('<div class="alert alert-info roles-selection">User with <strong>any</strong> of these roles can access this library. If there are no access roles set on the library it is considered <strong>unrestricted</strong>.</div>');e.push("<h4>Roles that can manage permissions on this library</h4>");e.push('<div id="manage_perm" class="manage_perm roles-selection"></div>');e.push('<div class="alert alert-info roles-selection">User with <strong>any</strong> of these roles can manage permissions on this library (includes giving access).</div>');e.push("<h4>Roles that can add items to this library</h4>");e.push('<div id="add_perm" class="add_perm roles-selection"></div>');e.push('<div class="alert alert-info roles-selection">User with <strong>any</strong> of these roles can add items to this library (folders and datasets).</div>');e.push("<h4>Roles that can modify this library</h4>");e.push('<div id="modify_perm" class="modify_perm roles-selection"></div>');e.push('<div class="alert alert-info roles-selection">User with <strong>any</strong> of these roles can modify this library (name, synopsis, etc.).</div>');e.push('<button data-toggle="tooltip" data-placement="top" title="Save modifications made on this page" class="btn btn-default toolbtn_save_permissions primary-button" type="button"><span class="fa fa-floppy-o"></span> Save</span></button>');e.push("</div>");e.push("</div>");return _.template(e.join(""))}});return{LibraryView:b}});
\ No newline at end of file
+define(["libs/toastr","mvc/library/library-model","mvc/ui/ui-select"],function(d,c,a){var b=Backbone.View.extend({el:"#center",model:null,options:{},events:{"click .toolbtn_save_permissions":"savePermissions"},initialize:function(e){this.options=_.extend(this.options,e);if(this.options.id){this.fetchLibrary()}},fetchLibrary:function(e){this.options=_.extend(this.options,e);this.model=new c.Library({id:this.options.id});var f=this;this.model.fetch({success:function(){if(f.options.show_permissions){f.showPermissions()}else{f.render()}},error:function(h,g){if(typeof g.responseJSON!=="undefined"){d.error(g.responseJSON.err_msg+" Click this to go back.","",{onclick:function(){Galaxy.libraries.library_router.back()}})}else{d.error("An error ocurred. Click this to go back.","",{onclick:function(){Galaxy.libraries.library_router.back()}})}}})},render:function(e){$(".tooltip").remove();this.options=_.extend(this.options,e);var f=this.templateLibrary();this.$el.html(f({item:this.model}));$("#center [data-toggle]").tooltip()},shareDataset:function(){d.info("Feature coming soon.")},goBack:function(){Galaxy.libraries.library_router.back()},showPermissions:function(f){this.options=_.extend(this.options,f);$(".tooltip").remove();if(this.options.fetched_permissions!==undefined){if(this.options.fetched_permissions.access_library_role_list.length===0){this.model.set({is_unrestricted:true})}else{this.model.set({is_unrestricted:false})}}var h=false;if(Galaxy.currUser){h=Galaxy.currUser.isAdmin()}var g=this.templateLibraryPermissions();this.$el.html(g({library:this.model,is_admin:h}));var e=this;if(this.options.fetched_permissions===undefined){$.get((window.galaxy_config?galaxy_config.root:"/")+"api/libraries/"+e.id+"/permissions?scope=current").done(function(i){e.prepareSelectBoxes({fetched_permissions:i})}).fail(function(){d.error("An error occurred while attempting to fetch library permissions.")})}else{this.prepareSelectBoxes({})}$("#center [data-toggle]").tooltip();$("#center").css("overflow","auto")},_serializeRoles:function(g){var e=[];for(var f=0;f<g.length;f++){e.push(g[f][1]+":"+g[f][0])}return e},prepareSelectBoxes:function(i){this.options=_.extend(this.options,i);var e=this.options.fetched_permissions;var g=this;var f=this._serializeRoles(e.access_library_role_list);var j=this._serializeRoles(e.add_library_item_role_list);var h=this._serializeRoles(e.manage_library_role_list);var k=this._serializeRoles(e.modify_library_role_list);g.accessSelectObject=new a.View(this._createSelectOptions(this,"access_perm",f,true));g.addSelectObject=new a.View(this._createSelectOptions(this,"add_perm",j,false));g.manageSelectObject=new a.View(this._createSelectOptions(this,"manage_perm",h,false));g.modifySelectObject=new a.View(this._createSelectOptions(this,"modify_perm",k,false))},_createSelectOptions:function(f,k,i,e){e=e===true?e:false;var j={minimumInputLength:0,css:k,multiple:true,placeholder:"Click to select a role",container:f.$el.find("#"+k),ajax:{url:(window.galaxy_config?galaxy_config.root:"/")+"api/libraries/"+f.id+"/permissions?scope=available&is_library_access="+e,dataType:"json",quietMillis:100,data:function(l,m){return{q:l,page_limit:10,page:m}},results:function(n,m){var l=(m*10)<n.total;return{results:n.roles,more:l}}},formatResult:function g(l){return l.name+" type: "+l.type},formatSelection:function h(l){return l.name},initSelection:function(l,n){var m=[];$(l.val().split(",")).each(function(){var o=this.split(":");m.push({id:o[0],name:o[1]})});n(m)},initialData:i,dropdownCssClass:"bigdrop"};return j},comingSoon:function(){d.warning("Feature coming soon.")},copyToClipboard:function(){var e=Backbone.history.location.href;if(e.lastIndexOf("/permissions")!==-1){e=e.substr(0,e.lastIndexOf("/permissions"))}window.prompt("Copy to clipboard: Ctrl+C, Enter",e)},makeDatasetPrivate:function(){var e=this;$.post((window.galaxy_config?galaxy_config.root:"/")+"api/libraries/datasets/"+e.id+"/permissions?action=make_private").done(function(f){e.model.set({is_unrestricted:false});e.showPermissions({fetched_permissions:f});d.success("The dataset is now private to you.")}).fail(function(){d.error("An error occurred while attempting to make dataset private.")})},removeDatasetRestrictions:function(){var e=this;$.post((window.galaxy_config?galaxy_config.root:"/")+"api/libraries/datasets/"+e.id+"/permissions?action=remove_restrictions").done(function(f){e.model.set({is_unrestricted:true});e.showPermissions({fetched_permissions:f});d.success("Access to this dataset is now unrestricted.")}).fail(function(){d.error("An error occurred while attempting to make dataset unrestricted.")})},_extractIds:function(e){ids_list=[];for(var f=e.length-1;f>=0;f--){ids_list.push(e[f].id)}return ids_list},savePermissions:function(h){var g=this;var i=this._extractIds(this.accessSelectObject.$el.select2("data"));var e=this._extractIds(this.addSelectObject.$el.select2("data"));var j=this._extractIds(this.manageSelectObject.$el.select2("data"));var f=this._extractIds(this.modifySelectObject.$el.select2("data"));$.post((window.galaxy_config?galaxy_config.root:"/")+"api/libraries/"+g.id+"/permissions?action=set_permissions",{"access_ids[]":i,"add_ids[]":e,"manage_ids[]":j,"modify_ids[]":f,}).done(function(k){g.showPermissions({fetched_permissions:k});d.success("Permissions saved.")}).fail(function(){d.error("An error occurred while attempting to set library permissions.")})},templateLibrary:function(){var e=[];e.push('<div class="library_style_container">');e.push(' <div id="library_toolbar">');e.push(' <button data-toggle="tooltip" data-placement="top" title="Modify library item" class="btn btn-default toolbtn_modify_dataset primary-button" type="button"><span class="fa fa-pencil"></span> Modify</span></button>');e.push(' <a href="#folders/<%- item.get("folder_id") %>/datasets/<%- item.id %>/permissions"><button data-toggle="tooltip" data-placement="top" title="Manage permissions" class="btn btn-default toolbtn_change_permissions primary-button" type="button"><span class="fa fa-group"></span> Permissions</span></button></a>');e.push(' <button data-toggle="tooltip" data-placement="top" title="Share dataset" class="btn btn-default toolbtn-share-dataset primary-button" type="button"><span class="fa fa-share"></span> Share</span></button>');e.push(" </div>");e.push(" <p>");e.push(" This dataset is unrestricted so everybody can access it. Just share the URL of this page. ");e.push(' <button data-toggle="tooltip" data-placement="top" title="Copy to clipboard" class="btn btn-default btn-copy-link-to-clipboard primary-button" type="button"><span class="fa fa-clipboard"></span> To Clipboard</span></button> ');e.push(" </p>");e.push('<div class="dataset_table">');e.push(' <table class="grid table table-striped table-condensed">');e.push(" <tr>");e.push(' <th scope="row" id="id_row" data-id="<%= _.escape(item.get("ldda_id")) %>">Name</th>');e.push(' <td><%= _.escape(item.get("name")) %></td>');e.push(" </tr>");e.push(' <% if (item.get("file_ext")) { %>');e.push(" <tr>");e.push(' <th scope="row">Data type</th>');e.push(' <td><%= _.escape(item.get("file_ext")) %></td>');e.push(" </tr>");e.push(" <% } %>");e.push(" </table>");e.push("</div>");e.push("</div>");return _.template(e.join(""))},templateLibraryPermissions:function(){var e=[];e.push('<div class="library_style_container">');e.push(' <div id="library_toolbar">');e.push(' <a href="#"><button data-toggle="tooltip" data-placement="top" title="Go back to the list of Libraries" class="btn btn-default primary-button" type="button"><span class="fa fa-list"></span> Libraries</span></button></a>');e.push(" </div>");e.push('<h1>Library: <%= _.escape(library.get("name")) %></h1>');e.push('<div class="alert alert-warning">');e.push("<% if (is_admin) { %>");e.push("You are logged in as an <strong>administrator</strong> therefore you can manage any library on this Galaxy instance. Please make sure you understand the consequences.");e.push("<% } else { %>");e.push("You can assign any number of roles to any of the following permission types. However please read carefully the implications of such actions.");e.push("<% }%>");e.push("</div>");e.push('<div class="dataset_table">');e.push("<h2>Library permissions</h2>");e.push("<h4>Roles that can access the library</h4>");e.push('<div id="access_perm" class="access_perm roles-selection"></div>');e.push('<div class="alert alert-info roles-selection">User with <strong>any</strong> of these roles can access this library. If there are no access roles set on the library it is considered <strong>unrestricted</strong>.</div>');e.push("<h4>Roles that can manage permissions on this library</h4>");e.push('<div id="manage_perm" class="manage_perm roles-selection"></div>');e.push('<div class="alert alert-info roles-selection">User with <strong>any</strong> of these roles can manage permissions on this library (includes giving access).</div>');e.push("<h4>Roles that can add items to this library</h4>");e.push('<div id="add_perm" class="add_perm roles-selection"></div>');e.push('<div class="alert alert-info roles-selection">User with <strong>any</strong> of these roles can add items to this library (folders and datasets).</div>');e.push("<h4>Roles that can modify this library</h4>");e.push('<div id="modify_perm" class="modify_perm roles-selection"></div>');e.push('<div class="alert alert-info roles-selection">User with <strong>any</strong> of these roles can modify this library (name, synopsis, etc.).</div>');e.push('<button data-toggle="tooltip" data-placement="top" title="Save modifications made on this page" class="btn btn-default toolbtn_save_permissions primary-button" type="button"><span class="fa fa-floppy-o"></span> Save</span></button>');e.push("</div>");e.push("</div>");return _.template(e.join(""))}});return{LibraryView:b}});
\ No newline at end of file
This diff is so big that we needed to truncate the remainder.
https://bitbucket.org/galaxy/galaxy-central/commits/2fd81de68ec1/
Changeset: 2fd81de68ec1
Branch: stable
User: natefoo
Date: 2015-04-22 19:30:08+00:00
Summary: Update latest_15.03 tag and create v15.03.2 tag.
Affected #: 1 file
diff -r bfd4635011e39aa210b2b1498dd65831dd2a365e -r 2fd81de68ec10fcfdcc9d031e7ffc59033e56bbc .hgtags
--- a/.hgtags
+++ b/.hgtags
@@ -25,4 +25,5 @@
5cdf5dc395f16f47e88a5567775dcd21b4906f08 latest_2015.01.13
738f4ad0eb62d5e4bcf0d22a2722ee6c570382b9 v15.03
9f40ff3e3fe1f7fed7e055d4269fe83199cf5ed2 v15.03.1
-9f40ff3e3fe1f7fed7e055d4269fe83199cf5ed2 latest_15.03
+bfd4635011e39aa210b2b1498dd65831dd2a365e v15.03.2
+bfd4635011e39aa210b2b1498dd65831dd2a365e latest_15.03
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
22 Apr '15
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/d7a9896af111/
Changeset: d7a9896af111
Branch: release_15.03
User: natefoo
Date: 2015-04-22 20:05:21+00:00
Summary: Bump version to 15.03.2
Affected #: 1 file
diff -r f4f0baa542a89db2d1002a2ff5b119077d2e9de6 -r d7a9896af111d6f86735eb4f2295eee67f7e3527 lib/galaxy/version.py
--- a/lib/galaxy/version.py
+++ b/lib/galaxy/version.py
@@ -1,3 +1,3 @@
VERSION_MAJOR = "15.03"
-VERSION_MINOR = "1"
+VERSION_MINOR = "2"
VERSION = VERSION_MAJOR + ('.' + VERSION_MINOR if VERSION_MINOR else '')
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
2 new commits in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/4781746d1979/
Changeset: 4781746d1979
Branch: release_15.03
User: jmchilton
Date: 2015-04-21 16:41:33+00:00
Summary: Bugfix: Typo in remap dataset handling in tools.
Affected #: 1 file
diff -r 57bbbe1463f616f98793a87d6b3ac0d4356825f4 -r 4781746d1979e6b33cf3e8f0177ec88b6cad6d7e lib/galaxy/tools/__init__.py
--- a/lib/galaxy/tools/__init__.py
+++ b/lib/galaxy/tools/__init__.py
@@ -2601,7 +2601,7 @@
hdca_source_dict = {}
for hdca in history.dataset_collections:
key = '%s_%s' % (hdca.hid, hdca.collection.id)
- hdca_source_dict[ hda.collection.id ] = hdca_source_dict[ key ] = hdca
+ hdca_source_dict[ hdca.collection.id ] = hdca_source_dict[ key ] = hdca
# Map dataset or collection to current history
def map_to_history(value):
https://bitbucket.org/galaxy/galaxy-central/commits/f4f0baa542a8/
Changeset: f4f0baa542a8
Branch: release_15.03
User: dan
Date: 2015-04-06 15:29:32+00:00
Summary: Fix for abitrary code execution in the ToolShed when uploaded tools reference a <code file=...>.
Affected #: 2 files
diff -r 4781746d1979e6b33cf3e8f0177ec88b6cad6d7e -r f4f0baa542a89db2d1002a2ff5b119077d2e9de6 lib/galaxy/tools/__init__.py
--- a/lib/galaxy/tools/__init__.py
+++ b/lib/galaxy/tools/__init__.py
@@ -417,13 +417,14 @@
dict_collection_visible_keys = ( 'id', 'name', 'version', 'description' )
default_template = 'tool_form.mako'
- def __init__( self, config_file, tool_source, app, guid=None, repository_id=None ):
+ def __init__( self, config_file, tool_source, app, guid=None, repository_id=None, allow_code_files=True ):
"""Load a tool from the config named by `config_file`"""
# Determine the full path of the directory where the tool config is
self.config_file = config_file
self.tool_dir = os.path.dirname( config_file )
self.app = app
self.repository_id = repository_id
+ self._allow_code_files = allow_code_files
#setup initial attribute values
self.inputs = odict()
self.stdio_exit_codes = list()
@@ -704,14 +705,15 @@
# Load any tool specific code (optional) Edit: INS 5/29/2007,
# allow code files to have access to the individual tool's
# "module" if it has one. Allows us to reuse code files, etc.
- for code_elem in root.findall("code"):
- for hook_elem in code_elem.findall("hook"):
- for key, value in hook_elem.items():
- # map hook to function
- self.hook_map[key] = value
- file_name = code_elem.get("file")
- code_path = os.path.join( self.tool_dir, file_name )
- execfile( code_path, self.code_namespace )
+ if self._allow_code_files:
+ for code_elem in root.findall("code"):
+ for hook_elem in code_elem.findall("hook"):
+ for key, value in hook_elem.items():
+ # map hook to function
+ self.hook_map[key] = value
+ file_name = code_elem.get("file")
+ code_path = os.path.join( self.tool_dir, file_name )
+ execfile( code_path, self.code_namespace )
# User interface hints
uihints_elem = root.find( "uihints" )
diff -r 4781746d1979e6b33cf3e8f0177ec88b6cad6d7e -r f4f0baa542a89db2d1002a2ff5b119077d2e9de6 lib/tool_shed/tools/tool_validator.py
--- a/lib/tool_shed/tools/tool_validator.py
+++ b/lib/tool_shed/tools/tool_validator.py
@@ -292,7 +292,7 @@
def load_tool_from_config( self, repository_id, full_path ):
try:
- tool = self.app.toolbox.load_tool( full_path, repository_id=repository_id )
+ tool = self.app.toolbox.load_tool( full_path, repository_id=repository_id, allow_code_files=False )
valid = True
error_message = None
except KeyError, e:
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
3 new commits in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/74f9d06223e4/
Changeset: 74f9d06223e4
Branch: release_14.08
User: dan
Date: 2015-04-22 19:36:36+00:00
Summary: Fix for abitrary code execution in the ToolShed when uploaded tools
reference a <code file=...>.
Release 14.08..15.01 version.
Affected #: 2 files
diff -r de9d5f65c15eb5a5a6b61d72d0dbbaf105ea2ccb -r 74f9d06223e40395e9b991171ab4aa21eec73b2e lib/galaxy/tools/__init__.py
--- a/lib/galaxy/tools/__init__.py
+++ b/lib/galaxy/tools/__init__.py
@@ -1062,13 +1062,14 @@
default_tool_action = DefaultToolAction
dict_collection_visible_keys = ( 'id', 'name', 'version', 'description' )
- def __init__( self, config_file, root, app, guid=None, repository_id=None ):
+ def __init__( self, config_file, root, app, guid=None, repository_id=None, allow_code_files=True ):
"""Load a tool from the config named by `config_file`"""
# Determine the full path of the directory where the tool config is
self.config_file = config_file
self.tool_dir = os.path.dirname( config_file )
self.app = app
self.repository_id = repository_id
+ self._allow_code_files = allow_code_files
#setup initial attribute values
self.inputs = odict()
self.stdio_exit_codes = list()
@@ -1303,14 +1304,15 @@
# "module" if it has one. Allows us to reuse code files, etc.
self.code_namespace = dict()
self.hook_map = {}
- for code_elem in root.findall("code"):
- for hook_elem in code_elem.findall("hook"):
- for key, value in hook_elem.items():
- # map hook to function
- self.hook_map[key] = value
- file_name = code_elem.get("file")
- code_path = os.path.join( self.tool_dir, file_name )
- execfile( code_path, self.code_namespace )
+ if self._allow_code_files:
+ for code_elem in root.findall("code"):
+ for hook_elem in code_elem.findall("hook"):
+ for key, value in hook_elem.items():
+ # map hook to function
+ self.hook_map[key] = value
+ file_name = code_elem.get("file")
+ code_path = os.path.join( self.tool_dir, file_name )
+ execfile( code_path, self.code_namespace )
# Load any tool specific options (optional)
self.options = dict( sanitize=True, refresh=False )
for option_elem in root.findall("options"):
diff -r de9d5f65c15eb5a5a6b61d72d0dbbaf105ea2ccb -r 74f9d06223e40395e9b991171ab4aa21eec73b2e lib/tool_shed/tools/tool_validator.py
--- a/lib/tool_shed/tools/tool_validator.py
+++ b/lib/tool_shed/tools/tool_validator.py
@@ -292,7 +292,7 @@
def load_tool_from_config( self, repository_id, full_path ):
try:
- tool = self.app.toolbox.load_tool( full_path, repository_id=repository_id )
+ tool = self.app.toolbox.load_tool( full_path, repository_id=repository_id, allow_code_files=False )
valid = True
error_message = None
except KeyError, e:
https://bitbucket.org/galaxy/galaxy-central/commits/9eaf8d97dfef/
Changeset: 9eaf8d97dfef
Branch: release_14.10
User: dan
Date: 2015-04-22 19:40:55+00:00
Summary: Fix for abitrary code execution in the ToolShed when uploaded tools
reference a <code file=...>.
Release 14.08..15.01 version
Affected #: 2 files
diff -r a2fad44da847abfe5c39ffdf82f10f6e4be3d1e3 -r 9eaf8d97dfef5577825c921a86df74e8dadb2134 lib/galaxy/tools/__init__.py
--- a/lib/galaxy/tools/__init__.py
+++ b/lib/galaxy/tools/__init__.py
@@ -1179,13 +1179,14 @@
dict_collection_visible_keys = ( 'id', 'name', 'version', 'description' )
default_template = 'tool_form.mako'
- def __init__( self, config_file, root, app, guid=None, repository_id=None ):
+ def __init__( self, config_file, root, app, guid=None, repository_id=None, allow_code_files=True ):
"""Load a tool from the config named by `config_file`"""
# Determine the full path of the directory where the tool config is
self.config_file = config_file
self.tool_dir = os.path.dirname( config_file )
self.app = app
self.repository_id = repository_id
+ self._allow_code_files = allow_code_files
#setup initial attribute values
self.inputs = odict()
self.stdio_exit_codes = list()
@@ -1420,14 +1421,15 @@
# "module" if it has one. Allows us to reuse code files, etc.
self.code_namespace = dict()
self.hook_map = {}
- for code_elem in root.findall("code"):
- for hook_elem in code_elem.findall("hook"):
- for key, value in hook_elem.items():
- # map hook to function
- self.hook_map[key] = value
- file_name = code_elem.get("file")
- code_path = os.path.join( self.tool_dir, file_name )
- execfile( code_path, self.code_namespace )
+ if self._allow_code_files:
+ for code_elem in root.findall("code"):
+ for hook_elem in code_elem.findall("hook"):
+ for key, value in hook_elem.items():
+ # map hook to function
+ self.hook_map[key] = value
+ file_name = code_elem.get("file")
+ code_path = os.path.join( self.tool_dir, file_name )
+ execfile( code_path, self.code_namespace )
# Load any tool specific options (optional)
self.options = dict( sanitize=True, refresh=False )
for option_elem in root.findall("options"):
diff -r a2fad44da847abfe5c39ffdf82f10f6e4be3d1e3 -r 9eaf8d97dfef5577825c921a86df74e8dadb2134 lib/tool_shed/tools/tool_validator.py
--- a/lib/tool_shed/tools/tool_validator.py
+++ b/lib/tool_shed/tools/tool_validator.py
@@ -292,7 +292,7 @@
def load_tool_from_config( self, repository_id, full_path ):
try:
- tool = self.app.toolbox.load_tool( full_path, repository_id=repository_id )
+ tool = self.app.toolbox.load_tool( full_path, repository_id=repository_id, allow_code_files=False )
valid = True
error_message = None
except KeyError, e:
https://bitbucket.org/galaxy/galaxy-central/commits/8586ba87fdfe/
Changeset: 8586ba87fdfe
Branch: release_15.01
User: dan
Date: 2015-04-22 19:42:50+00:00
Summary: Fix for abitrary code execution in the ToolShed when uploaded tools
reference a <code file=...>.
Release 14.08..15.01 version
Affected #: 2 files
diff -r 7a09c05aed7a3ca0cb64edb0e5e331d59028d86e -r 8586ba87fdfe4a3d9f3088ddb07f4466c53d3945 lib/galaxy/tools/__init__.py
--- a/lib/galaxy/tools/__init__.py
+++ b/lib/galaxy/tools/__init__.py
@@ -1238,13 +1238,14 @@
dict_collection_visible_keys = ( 'id', 'name', 'version', 'description' )
default_template = 'tool_form.mako'
- def __init__( self, config_file, root, app, guid=None, repository_id=None ):
+ def __init__( self, config_file, root, app, guid=None, repository_id=None, allow_code_files=True ):
"""Load a tool from the config named by `config_file`"""
# Determine the full path of the directory where the tool config is
self.config_file = config_file
self.tool_dir = os.path.dirname( config_file )
self.app = app
self.repository_id = repository_id
+ self._allow_code_files = allow_code_files
#setup initial attribute values
self.inputs = odict()
self.stdio_exit_codes = list()
@@ -1485,14 +1486,15 @@
# "module" if it has one. Allows us to reuse code files, etc.
self.code_namespace = dict()
self.hook_map = {}
- for code_elem in root.findall("code"):
- for hook_elem in code_elem.findall("hook"):
- for key, value in hook_elem.items():
- # map hook to function
- self.hook_map[key] = value
- file_name = code_elem.get("file")
- code_path = os.path.join( self.tool_dir, file_name )
- execfile( code_path, self.code_namespace )
+ if self._allow_code_files:
+ for code_elem in root.findall("code"):
+ for hook_elem in code_elem.findall("hook"):
+ for key, value in hook_elem.items():
+ # map hook to function
+ self.hook_map[key] = value
+ file_name = code_elem.get("file")
+ code_path = os.path.join( self.tool_dir, file_name )
+ execfile( code_path, self.code_namespace )
# Load any tool specific options (optional)
self.options = dict( sanitize=True, refresh=False )
for option_elem in root.findall("options"):
diff -r 7a09c05aed7a3ca0cb64edb0e5e331d59028d86e -r 8586ba87fdfe4a3d9f3088ddb07f4466c53d3945 lib/tool_shed/tools/tool_validator.py
--- a/lib/tool_shed/tools/tool_validator.py
+++ b/lib/tool_shed/tools/tool_validator.py
@@ -292,7 +292,7 @@
def load_tool_from_config( self, repository_id, full_path ):
try:
- tool = self.app.toolbox.load_tool( full_path, repository_id=repository_id )
+ tool = self.app.toolbox.load_tool( full_path, repository_id=repository_id, allow_code_files=False )
valid = True
error_message = None
except KeyError, e:
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
Branch: refs/heads/master
Home: https://github.com/galaxyproject/usegalaxy-playbook
Commit: df33f13029bfbddf6a9530dcb741f758cf6b9aa5
https://github.com/galaxyproject/usegalaxy-playbook/commit/df33f13029bfbddf…
Author: Nate Coraor <nate(a)bx.psu.edu>
Date: 2015-04-22 (Wed, 22 Apr 2015)
Changed paths:
M production/group_vars/pulsarservers.yml
Log Message:
-----------
Update Main Pulsar
Commit: df4a9bb43b7449f1406260e85c8d2e6f574b22cb
https://github.com/galaxyproject/usegalaxy-playbook/commit/df4a9bb43b7449f1…
Author: Nate Coraor <nate(a)bx.psu.edu>
Date: 2015-04-22 (Wed, 22 Apr 2015)
Changed paths:
A files/galaxy/common/static/welcome_img/GCC2015PostersDue.png
A files/galaxy/common/static/welcome_img/GCC2015Scholarships.png
M stage/group_vars/toolshedservers.yml
M templates/galaxy/common/static/welcome.html.j2
Log Message:
-----------
Merge branch 'master' of github.com:galaxyproject/usegalaxy-playbook
Compare: https://github.com/galaxyproject/usegalaxy-playbook/compare/2c468f8f2495...…
1
0
Branch: refs/heads/master
Home: https://github.com/galaxyproject/usegalaxy-playbook
Commit: 2c468f8f2495dd88109a1f750e7b304b271c26cb
https://github.com/galaxyproject/usegalaxy-playbook/commit/2c468f8f2495dd88…
Author: Martin Cech <cech.marten(a)gmail.com>
Date: 2015-04-21 (Tue, 21 Apr 2015)
Changed paths:
M stage/group_vars/toolshedservers.yml
Log Message:
-----------
update TTS
1
0
21 Apr '15
Branch: refs/heads/master
Home: https://github.com/galaxyproject/usegalaxy-playbook
Commit: 2ee595800192fa7a202cf002ec48bd70decf1139
https://github.com/galaxyproject/usegalaxy-playbook/commit/2ee595800192fa7a…
Author: tnabtaf <clements(a)galaxyproject.org>
Date: 2015-04-21 (Tue, 21 Apr 2015)
Changed paths:
A files/galaxy/common/static/welcome_img/GCC2015Scholarships.png
M templates/galaxy/common/static/welcome.html.j2
Log Message:
-----------
Added GCC2015 Scholarships slide
1
0
[galaxyproject/usegalaxy-playbook] 5260cd: Swapped poster abstracts due slide in for talk abs...
by GitHub 21 Apr '15
by GitHub 21 Apr '15
21 Apr '15
Branch: refs/heads/master
Home: https://github.com/galaxyproject/usegalaxy-playbook
Commit: 5260cd9ae712392abf173579d224657d5ccf4c07
https://github.com/galaxyproject/usegalaxy-playbook/commit/5260cd9ae712392a…
Author: Dave Clements <clements(a)Clements-Galaxy.local>
Date: 2015-04-21 (Tue, 21 Apr 2015)
Changed paths:
A files/galaxy/common/static/welcome_img/GCC2015PostersDue.png
M templates/galaxy/common/static/welcome.html.j2
Log Message:
-----------
Swapped poster abstracts due slide in for talk abstracts due slide.
1
0
21 Apr '15
Branch: refs/heads/master
Home: https://github.com/galaxyproject/usegalaxy-playbook
Commit: 33b39a41c95da135b5a02f119b26d541d11d3c2e
https://github.com/galaxyproject/usegalaxy-playbook/commit/33b39a41c95da135…
Author: Nate Coraor <nate(a)bx.psu.edu>
Date: 2015-04-21 (Tue, 21 Apr 2015)
Changed paths:
M templates/galaxy/usegalaxy.org/config/job_conf.xml.j2
Log Message:
-----------
Reenable Stampede on Main
1
0
[galaxyproject/usegalaxy-playbook] b6cf73: Use absolute path to display site files (fixes war...
by GitHub 21 Apr '15
by GitHub 21 Apr '15
21 Apr '15
Branch: refs/heads/master
Home: https://github.com/galaxyproject/usegalaxy-playbook
Commit: b6cf73d1bc2d5acaebc9490dcc39fef72f030a7e
https://github.com/galaxyproject/usegalaxy-playbook/commit/b6cf73d1bc2d5aca…
Author: Nate Coraor <nate(a)bx.psu.edu>
Date: 2015-04-21 (Tue, 21 Apr 2015)
Changed paths:
M templates/galaxy/usegalaxy.org/config/datatypes_conf.xml.j2
Log Message:
-----------
Use absolute path to display site files (fixes warnings under Pulsar).
1
0
[galaxyproject/usegalaxy-playbook] 1be70d: Integrated tool panel update from Test
by GitHub 20 Apr '15
by GitHub 20 Apr '15
20 Apr '15
Branch: refs/heads/master
Home: https://github.com/galaxyproject/usegalaxy-playbook
Commit: 1be70d633396e57c55ecc1d39eb15ca8f41385e9
https://github.com/galaxyproject/usegalaxy-playbook/commit/1be70d633396e57c…
Author: Nate Coraor <nate(a)bx.psu.edu>
Date: 2015-04-20 (Mon, 20 Apr 2015)
Changed paths:
M files/galaxy/test.galaxyproject.org/var/integrated_tool_panel.xml
Log Message:
-----------
Integrated tool panel update from Test
Commit: b198b80789638623b3c8f73ff5907f2404350faf
https://github.com/galaxyproject/usegalaxy-playbook/commit/b198b80789638623…
Author: Nate Coraor <nate(a)bx.psu.edu>
Date: 2015-04-20 (Mon, 20 Apr 2015)
Changed paths:
M templates/galaxy/test.galaxyproject.org/config/job_conf.xml.j2
M templates/galaxy/usegalaxy.org/config/job_conf.xml.j2
Log Message:
-----------
Increase varscan memory to 16GB
Compare: https://github.com/galaxyproject/usegalaxy-playbook/compare/578c429426ec...…
1
0
[galaxyproject/usegalaxy-playbook] 578c42: update TTS, include sentry_dsn config from vault
by GitHub 20 Apr '15
by GitHub 20 Apr '15
20 Apr '15
Branch: refs/heads/master
Home: https://github.com/galaxyproject/usegalaxy-playbook
Commit: 578c429426ecfb11447c7097b4eaec55837a1a5a
https://github.com/galaxyproject/usegalaxy-playbook/commit/578c429426ecfb11…
Author: Martin Cech <cech.marten(a)gmail.com>
Date: 2015-04-20 (Mon, 20 Apr 2015)
Changed paths:
M stage/group_vars/toolshedservers.yml
Log Message:
-----------
update TTS, include sentry_dsn config from vault
1
0
20 Apr '15
Branch: refs/heads/master
Home: https://github.com/galaxyproject/usegalaxy-playbook
Commit: 249c34b7aeb0322916a5b8b901373bf932d12750
https://github.com/galaxyproject/usegalaxy-playbook/commit/249c34b7aeb03229…
Author: Martin Cech <cech.marten(a)gmail.com>
Date: 2015-04-20 (Mon, 20 Apr 2015)
Changed paths:
M stage/secret_vars/toolshedservers.yml
Log Message:
-----------
adding sentry entry for TTS
1
0
NDQgbmV3IGNvbW1pdHMgaW4gZ2FsYXh5LWNlbnRyYWw6CgpodHRwczovL2JpdGJ1Y2tldC5vcmcv
Z2FsYXh5L2dhbGF4eS1jZW50cmFsL2NvbW1pdHMvYzJhNjg4OWQ3YTY0LwpDaGFuZ2VzZXQ6ICAg
YzJhNjg4OWQ3YTY0CkJyYW5jaDogICAgICByZWxlYXNlXzE1LjAzClVzZXI6ICAgICAgICBkYW4K
RGF0ZTogICAgICAgIDIwMTUtMDMtMTcgMTc6NDY6MjErMDA6MDAKU3VtbWFyeTogICAgIEZpeCBm
b3IgcmVsb2FkaW5nIHRvb2xzLiBQcmV2aW91c2x5LCB3aGVuIGEgdG9vbCB3YXMgcmVsb2FkZWQg
PQoob2YgdGhlIHNhbWUgdmVyc2lvbiksIHlvdSB3b3VsZCBnZXQgdGhlIG5ldy9jb3JyZWN0IHRv
b2wgd2hlbiBjbGlja2luZyBpbiA9ClRvb2wgUGFuZWwsIGJ1dCB0aGUgcmVydW4gYnV0dG9uIHdv
dWxkIHJldHVybiB0aGUgb2xkL3ByZS1yZWxvYWQgdG9vbDsgdGhpcz0KIGlzIGR1ZSB0byB0aGUg
cmVsb2FkIG5vdCByZXBsYWNpbmcgdGhlIGVudHJpZXMgaW4gX3Rvb2xfdmVyc2lvbnNfYnlfaWQu
CkFmZmVjdGVkICM6ICAxIGZpbGUKCmRpZmYgLXIgMDE0MTIyNDE1NDJhYjRmM2IwZmE2NzEzOTM5
NGIzMDI3N2Q1YmU0OSAtciBjMmE2ODg5ZDdhNjRkNDA5ZjdmZmMyMz0KZGYwOTUxZDhjN2Q3YTQ0
YjkgbGliL2dhbGF4eS90b29scy90b29sYm94L2Jhc2UucHkKLS0tIGEvbGliL2dhbGF4eS90b29s
cy90b29sYm94L2Jhc2UucHkKKysrIGIvbGliL2dhbGF4eS90b29scy90b29sYm94L2Jhc2UucHkK
QEAgLTk3OCw3ICs5NzgsOSBAQAogICAgICAgICAgICAgICAgICAgICBpZiB0b29sX2tleSBpbiB2
YWwuZWxlbXM6CiAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl90b29sX3BhbmVsWyBrZXkg
XS5lbGVtc1sgdG9vbF9rZXkgXSA9M0QgbmV3Xz0KdG9vbAogICAgICAgICAgICAgICAgICAgICAg
ICAgYnJlYWsKLSAgICAgICAgICAgIHNlbGYuX3Rvb2xzX2J5X2lkWyB0b29sX2lkIF0gPTNEIG5l
d190b29sCisgICAgICAgICAgICAjIChSZS0pUmVnaXN0ZXIgdGhlIHJlbG9hZGVkIHRvb2wsIHRo
aXMgd2lsbCBoYW5kbGUKKyAgICAgICAgICAgICMgIF90b29sc19ieV9pZCBhbmQgX3Rvb2xfdmVy
c2lvbnNfYnlfaWQKKyAgICAgICAgICAgIHNlbGYucmVnaXN0ZXJfdG9vbCggbmV3X3Rvb2wgKQog
ICAgICAgICAgICAgbWVzc2FnZSA9M0QgIlJlbG9hZGVkIHRoZSB0b29sOjxici8+IgogICAgICAg
ICAgICAgbWVzc2FnZSArPTNEICI8Yj5uYW1lOjwvYj4gJXM8YnIvPiIgJSBvbGRfdG9vbC5uYW1l
CiAgICAgICAgICAgICBtZXNzYWdlICs9M0QgIjxiPmlkOjwvYj4gJXM8YnIvPiIgJSBvbGRfdG9v
bC5pZAoKCmh0dHBzOi8vYml0YnVja2V0Lm9yZy9nYWxheHkvZ2FsYXh5LWNlbnRyYWwvY29tbWl0
cy9mM2VhYzc0NjAzZTQvCkNoYW5nZXNldDogICBmM2VhYzc0NjAzZTQKQnJhbmNoOiAgICAgIHJl
bGVhc2VfMTUuMDMKVXNlcjogICAgICAgIGRhbm5vbgpEYXRlOiAgICAgICAgMjAxNS0wMy0xNyAx
OTowODowNyswMDowMApTdW1tYXJ5OiAgICAgRml4IHB1cmdlIHF1b3RhIGFkanVzdG1lbnQgdmlh
IG1hbmFnZXIgZnVuY3Rpb25hbGl0eS4KQWZmZWN0ZWQgIzogIDEgZmlsZQoKZGlmZiAtciBjMmE2
ODg5ZDdhNjRkNDA5ZjdmZmMyM2RmMDk1MWQ4YzdkN2E0NGI5IC1yIGYzZWFjNzQ2MDNlNDM3ZDhh
ODYxMTYxPQpjYjQxZWRmNGJjMGQ3YWUyZiBsaWIvZ2FsYXh5L21hbmFnZXJzL2hkYXMucHkKLS0t
IGEvbGliL2dhbGF4eS9tYW5hZ2Vycy9oZGFzLnB5CisrKyBiL2xpYi9nYWxheHkvbWFuYWdlcnMv
aGRhcy5weQpAQCAtMTU0LDggKzE1NCw5IEBACiAgICAgICAgICMgZXJyb3IgaGVyZSBpZiBkaXNh
bGxvd2VkIC0gYmVmb3JlIGpvYnMgYXJlIHN0b3BwZWQKICAgICAgICAgI1RPRE86IHBvc3MuIG1v
dmUgdG8gRGF0YXNldEFzc29jaWF0aW9uTWFuYWdlcgogICAgICAgICBzZWxmLmRhdGFzZXRfbWFu
YWdlci5lcnJvcl91bmxlc3NfZGF0YXNldF9wdXJnZV9hbGxvd2VkKCB0cmFucywgaGQ9CmEgKQor
ICAgICAgICBpZiB0cmFucy51c2VyOgorICAgICAgICAgICAgdHJhbnMudXNlci50b3RhbF9kaXNr
X3VzYWdlIC09M0QgaGRhLnF1b3RhX2Ftb3VudCggdHJhbnMudXNlciApCiAgICAgICAgIHN1cGVy
KCBIREFNYW5hZ2VyLCBzZWxmICkucHVyZ2UoIHRyYW5zLCBoZGEsIGZsdXNoPTNEZmx1c2ggKQot
CiAgICAgICAgIGlmIGhkYS5jcmVhdGluZ19qb2JfYXNzb2NpYXRpb25zOgogICAgICAgICAgICAg
am9iID0zRCBoZGEuY3JlYXRpbmdfam9iX2Fzc29jaWF0aW9uc1swXS5qb2IKICAgICAgICAgICAg
IGlmIG5vdCBqb2IuZmluaXNoZWQ6CgoKaHR0cHM6Ly9iaXRidWNrZXQub3JnL2dhbGF4eS9nYWxh
eHktY2VudHJhbC9jb21taXRzL2E4YWVjNGQ2MDNhOC8KQ2hhbmdlc2V0OiAgIGE4YWVjNGQ2MDNh
OApCcmFuY2g6ICAgICAgcmVsZWFzZV8xNS4wMwpVc2VyOiAgICAgICAgZGFubm9uCkRhdGU6ICAg
ICAgICAyMDE1LTAzLTE3IDIwOjMzOjQ0KzAwOjAwClN1bW1hcnk6ICAgICBGaXggd29ya2Zsb3cg
c3RlcCB1dWlkIGhhbmRsaW5nIHRvIGhhbmRsZSBVVUlEIGJlaW5nIHRoZSBzdHJpbj0KZyBOb25l
IGluIGlucHV0IEpTT04uICBUaGlzIGZpeGVzIGV4cG9ydC9pbXBvcnQgdGhhdCB3YXMgYnJva2Vu
IHdpdGggcmVsZWFzPQplXzE1LjAzLgpBZmZlY3RlZCAjOiAgMSBmaWxlCgpkaWZmIC1yIGYzZWFj
NzQ2MDNlNDM3ZDhhODYxMTYxY2I0MWVkZjRiYzBkN2FlMmYgLXIgYThhZWM0ZDYwM2E4OTZiMTlk
NWM1ZTE9CmY0MzZjNDUyOWUzNzUyYzUzIGxpYi9nYWxheHkvbWFuYWdlcnMvd29ya2Zsb3dzLnB5
Ci0tLSBhL2xpYi9nYWxheHkvbWFuYWdlcnMvd29ya2Zsb3dzLnB5CisrKyBiL2xpYi9nYWxheHkv
bWFuYWdlcnMvd29ya2Zsb3dzLnB5CkBAIC01NjksNyArNTY5LDcgQEAKICAgICAgICAgZm9yIHN0
ZXBfaW5kZXggaW4gc3RlcF9pbmRpY2VzOgogICAgICAgICAgICAgc3RlcF9kaWN0ID0zRCBzdXBw
bGllZF9zdGVwc1sgc3RlcF9pbmRleCBdCiAgICAgICAgICAgICB1dWlkID0zRCBzdGVwX2RpY3Qu
Z2V0KCJ1dWlkIiwgTm9uZSkKLSAgICAgICAgICAgIGlmIHV1aWQ6CisgICAgICAgICAgICBpZiB1
dWlkIGFuZCB1dWlkICE9M0QgIk5vbmUiOgogICAgICAgICAgICAgICAgIGlmIHV1aWQgaW4gZGlz
Y292ZXJlZF91dWlkczoKICAgICAgICAgICAgICAgICAgICAgcmFpc2UgZXhjZXB0aW9ucy5EdXBs
aWNhdGVkSWRlbnRpZmllckV4Y2VwdGlvbigiRHVwbGljPQphdGUgc3RlcCBVVUlEIGluIHJlcXVl
c3QuIikKICAgICAgICAgICAgICAgICBkaXNjb3ZlcmVkX3V1aWRzLmFkZCh1dWlkKQpAQCAtNTg2
LDEwICs1ODYsOSBAQAogICAgICAgICB0eXBlLXNwZWNpZmljIGZ1bmN0aW9uYWxpdHkgZnJvbSB0
aGUgaW5jb21pbmcgZGljaXRpb25hcnkuCiAgICAgICAgICIiIgogICAgICAgICBzdGVwID0zRCBt
b2RlbC5Xb3JrZmxvd1N0ZXAoKQotCiAgICAgICAgICMgVE9ETzogQ29uc2lkZXIgaGFuZGxpbmcg
cG9zaXRpb24gaW5zaWRlIG1vZHVsZS4KICAgICAgICAgc3RlcC5wb3NpdGlvbiA9M0Qgc3RlcF9k
aWN0Wydwb3NpdGlvbiddCi0gICAgICAgIGlmICJ1dWlkIiBpbiBzdGVwX2RpY3Q6CisgICAgICAg
IGlmICJ1dWlkIiBpbiBzdGVwX2RpY3QgYW5kIHN0ZXBfZGljdFsndXVpZCddICE9M0QgIk5vbmUi
OgogICAgICAgICAgICAgc3RlcC51dWlkID0zRCBzdGVwX2RpY3RbInV1aWQiXQogICAgICAgICBp
ZiAibGFiZWwiIGluIHN0ZXBfZGljdDoKICAgICAgICAgICAgIHN0ZXAubGFiZWwgPTNEIHN0ZXBf
ZGljdFsibGFiZWwiXQoKCmh0dHBzOi8vYml0YnVja2V0Lm9yZy9nYWxheHkvZ2FsYXh5LWNlbnRy
YWwvY29tbWl0cy80ZGU1NTZiZDdhNmMvCkNoYW5nZXNldDogICA0ZGU1NTZiZDdhNmMKQnJhbmNo
OiAgICAgIHJlbGVhc2VfMTUuMDMKVXNlcjogICAgICAgIGd1ZXJsZXIKRGF0ZTogICAgICAgIDIw
MTUtMDMtMTkgMDk6NTA6MzUrMDA6MDAKU3VtbWFyeTogICAgIFVuaWZpZXMgYW5kIGltcHJvdmVz
IHRoZSBoYW5kbGluZyBvZiBvcHRpb25hbCBzZWxlY3QgZmllbGRzCkFmZmVjdGVkICM6ICAzIGZp
bGVzCgpkaWZmIC1yIGE4YWVjNGQ2MDNhODk2YjE5ZDVjNWUxZjQzNmM0NTI5ZTM3NTJjNTMgLXIg
NGRlNTU2YmQ3YTZjNjBiYTA0MjlmYTQ9CjE2YjViMWY3MWRhOTBjMDE3IGNsaWVudC9nYWxheHkv
c2NyaXB0cy9tdmMvdG9vbHMvdG9vbHMtcGFyYW1ldGVycy5qcwotLS0gYS9jbGllbnQvZ2FsYXh5
L3NjcmlwdHMvbXZjL3Rvb2xzL3Rvb2xzLXBhcmFtZXRlcnMuanMKKysrIGIvY2xpZW50L2dhbGF4
eS9zY3JpcHRzL212Yy90b29scy90b29scy1wYXJhbWV0ZXJzLmpzCkBAIC0xNDUsNiArMTQ1LDcg
QEAKICAgICAgICAgICAgICAgICBkYXRhICAgICAgICA6IG9wdGlvbnMsCiAgICAgICAgICAgICAg
ICAgZXJyb3JfdGV4dCAgOiBpbnB1dF9kZWYuZXJyb3JfdGV4dCB8fCAnTm8gb3B0aW9ucyBhdmFp
bGFibD0KZScsCiAgICAgICAgICAgICAgICAgbXVsdGlwbGUgICAgOiBpbnB1dF9kZWYubXVsdGlw
bGUsCisgICAgICAgICAgICAgICAgb3B0aW9uYWwgICAgOiBpbnB1dF9kZWYub3B0aW9uYWwsCiAg
ICAgICAgICAgICAgICAgc2VhcmNoYWJsZSAgOiBpbnB1dF9kZWYuc2VhcmNoYWJsZSwKICAgICAg
ICAgICAgICAgICBvbmNoYW5nZSAgICA6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAg
ICBzZWxmLmFwcC50cmlnZ2VyKCdyZWZyZXNoJyk7CgpkaWZmIC1yIGE4YWVjNGQ2MDNhODk2YjE5
ZDVjNWUxZjQzNmM0NTI5ZTM3NTJjNTMgLXIgNGRlNTU2YmQ3YTZjNjBiYTA0MjlmYTQ9CjE2YjVi
MWY3MWRhOTBjMDE3IHN0YXRpYy9zY3JpcHRzL212Yy90b29scy90b29scy1wYXJhbWV0ZXJzLmpz
Ci0tLSBhL3N0YXRpYy9zY3JpcHRzL212Yy90b29scy90b29scy1wYXJhbWV0ZXJzLmpzCisrKyBi
L3N0YXRpYy9zY3JpcHRzL212Yy90b29scy90b29scy1wYXJhbWV0ZXJzLmpzCkBAIC0xNDUsNiAr
MTQ1LDcgQEAKICAgICAgICAgICAgICAgICBkYXRhICAgICAgICA6IG9wdGlvbnMsCiAgICAgICAg
ICAgICAgICAgZXJyb3JfdGV4dCAgOiBpbnB1dF9kZWYuZXJyb3JfdGV4dCB8fCAnTm8gb3B0aW9u
cyBhdmFpbGFibD0KZScsCiAgICAgICAgICAgICAgICAgbXVsdGlwbGUgICAgOiBpbnB1dF9kZWYu
bXVsdGlwbGUsCisgICAgICAgICAgICAgICAgb3B0aW9uYWwgICAgOiBpbnB1dF9kZWYub3B0aW9u
YWwsCiAgICAgICAgICAgICAgICAgc2VhcmNoYWJsZSAgOiBpbnB1dF9kZWYuc2VhcmNoYWJsZSwK
ICAgICAgICAgICAgICAgICBvbmNoYW5nZSAgICA6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAg
ICAgICAgICBzZWxmLmFwcC50cmlnZ2VyKCdyZWZyZXNoJyk7CgpkaWZmIC1yIGE4YWVjNGQ2MDNh
ODk2YjE5ZDVjNWUxZjQzNmM0NTI5ZTM3NTJjNTMgLXIgNGRlNTU2YmQ3YTZjNjBiYTA0MjlmYTQ9
CjE2YjViMWY3MWRhOTBjMDE3IHN0YXRpYy9zY3JpcHRzL3BhY2tlZC9tdmMvdG9vbHMvdG9vbHMt
cGFyYW1ldGVycy5qcwotLS0gYS9zdGF0aWMvc2NyaXB0cy9wYWNrZWQvbXZjL3Rvb2xzL3Rvb2xz
LXBhcmFtZXRlcnMuanMKKysrIGIvc3RhdGljL3NjcmlwdHMvcGFja2VkL212Yy90b29scy90b29s
cy1wYXJhbWV0ZXJzLmpzCkBAIC0xLDEgKzEsMSBAQAotZGVmaW5lKFsidXRpbHMvdXRpbHMiLCJt
dmMvdWkvdWktbWlzYyIsIm12Yy90b29scy90b29scy1zZWxlY3QtY29udGVudCIsIm09CnZjL3Vp
L3VpLWNvbG9yLXBpY2tlciJdLGZ1bmN0aW9uKGMsZCxhLGIpe3JldHVybiBCYWNrYm9uZS5Nb2Rl
bC5leHRlbmQoe3R5cD0KZXM6e3RleHQ6Il9maWVsZFRleHQiLHNlbGVjdDoiX2ZpZWxkU2VsZWN0
IixkYXRhX2NvbHVtbjoiX2ZpZWxkU2VsZWN0IixnZW5vPQptZWJ1aWxkOiJfZmllbGRTZWxlY3Qi
LGRhdGE6Il9maWVsZERhdGEiLGRhdGFfY29sbGVjdGlvbjoiX2ZpZWxkRGF0YSIsaW50ZWc9CmVy
OiJfZmllbGRTbGlkZXIiLCJmbG9hdCI6Il9maWVsZFNsaWRlciIsImJvb2xlYW4iOiJfZmllbGRC
b29sZWFuIixkcmlsbF9kbz0Kd246Il9maWVsZERyaWxsZG93biIsY29sb3I6Il9maWVsZENvbG9y
IixoaWRkZW46Il9maWVsZEhpZGRlbiIsaGlkZGVuX2RhdGE6PQoiX2ZpZWxkSGlkZGVuIixiYXNl
dXJsOiJfZmllbGRIaWRkZW4iLH0saW5pdGlhbGl6ZTpmdW5jdGlvbihmLGUpe3RoaXMuYXBwPQo9
M0RmfSxjcmVhdGU6ZnVuY3Rpb24oZSl7aWYoZS52YWx1ZT0zRD0zRD0zRHVuZGVmaW5lZCl7ZS52
YWx1ZT0zRG51bGx9aWYoZS49CmRlZmF1bHRfdmFsdWU9M0Q9M0Q9M0R1bmRlZmluZWQpe2UuZGVm
YXVsdF92YWx1ZT0zRGUudmFsdWV9dmFyIGc9M0RudWxsO3Zhcj0KIGY9M0R0aGlzLnR5cGVzW2Uu
dHlwZV07aWYoZiYmdHlwZW9mKHRoaXNbZl0pPTNEPTNEPTNEImZ1bmN0aW9uIil7Zz0zRHRoaXNb
PQpmXS5jYWxsKHRoaXMsZSl9aWYoIWcpe3RoaXMuYXBwLmluY29tcGF0aWJsZT0zRHRydWU7aWYo
ZS5vcHRpb25zKXtnPTNEdGhpcy49Cl9maWVsZFNlbGVjdChlKX1lbHNle2c9M0R0aGlzLl9maWVs
ZFRleHQoZSl9Y29uc29sZS5kZWJ1ZygidG9vbHMtZm9ybTo6X2FkZD0KUm93KCkgOiBBdXRvIG1h
dGNoZWQgZmllbGQgdHlwZSAoIitlLnR5cGUrIikuIil9aWYoZS52YWx1ZSE9M0Q9M0R1bmRlZmlu
ZWQpPQp7Zy52YWx1ZShlLnZhbHVlKX1yZXR1cm4gZ30sX2ZpZWxkRGF0YTpmdW5jdGlvbihlKXtp
ZighdGhpcy5hcHAub3B0aW9ucy5pc189CmR5bmFtaWMpe2UuaW5mbz0zRCJEYXRhIGlucHV0ICci
K2UubmFtZSsiJyAoIitjLnRleHRpZnkoZS5leHRlbnNpb25zLnRvU3RyaT0KbmcoKSkrIikiO2Uu
dmFsdWU9M0RudWxsO3JldHVybiB0aGlzLl9maWVsZEhpZGRlbihlKX12YXIgZj0zRHRoaXM7cmV0
dXJuIG5lPQp3IGEuVmlldyh0aGlzLmFwcCx7aWQ6ImZpZWxkLSIrZS5pZCxleHRlbnNpb25zOmUu
ZXh0ZW5zaW9ucyxvcHRpb25hbDplLm9wdGk9Cm9uYWwsbXVsdGlwbGU6ZS5tdWx0aXBsZSx0eXBl
OmUudHlwZSxkYXRhOmUub3B0aW9ucyxvbmNoYW5nZTpmdW5jdGlvbigpe2YuYT0KcHAudHJpZ2dl
cigicmVmcmVzaCIpfX0pfSxfZmllbGRTZWxlY3Q6ZnVuY3Rpb24oZSl7aWYoIXRoaXMuYXBwLm9w
dGlvbnMuaXNfPQpkeW5hbWljJiZlLmlzX2R5bmFtaWMpe3JldHVybiB0aGlzLl9maWVsZFRleHQo
ZSl9aWYoZS50eXBlPTNEPTNEImRhdGFfY29sdW09Cm4iKXtlLmVycm9yX3RleHQ9M0QiTWlzc2lu
ZyBjb2x1bW5zIGluIHJlZmVyZW5jZWQgZGF0YXNldC4ifWlmKGUudHlwZT0zRD0zRD0KImdlbm9t
ZWJ1aWxkIil7ZS5zZWFyY2hhYmxlPTNEdHJ1ZX12YXIgZz0zRFtdO2Zvcih2YXIgaCBpbiBlLm9w
dGlvbnMpe3ZhciBqPQo9M0RlLm9wdGlvbnNbaF07Zy5wdXNoKHtsYWJlbDpqWzBdLHZhbHVlOmpb
MV19KX12YXIgaz0zRGQuU2VsZWN0O3N3aXRjaChlLmQ9CmlzcGxheSl7Y2FzZSJjaGVja2JveGVz
IjprPTNEZC5DaGVja2JveDticmVhaztjYXNlInJhZGlvIjprPTNEZC5SYWRpbzticmVhaz0KfXZh
ciBmPTNEdGhpcztyZXR1cm4gbmV3IGsuVmlldyh7aWQ6ImZpZWxkLSIrZS5pZCxkYXRhOmcsZXJy
b3JfdGV4dDplLmVycm9yPQpfdGV4dHx8Ik5vIG9wdGlvbnMgYXZhaWxhYmxlIixtdWx0aXBsZTpl
Lm11bHRpcGxlLHNlYXJjaGFibGU6ZS5zZWFyY2hhYmxlLG89Cm5jaGFuZ2U6ZnVuY3Rpb24oKXtm
LmFwcC50cmlnZ2VyKCJyZWZyZXNoIil9fSl9LF9maWVsZERyaWxsZG93bjpmdW5jdGlvbihlKT0K
e2lmKCF0aGlzLmFwcC5vcHRpb25zLmlzX2R5bmFtaWMmJmUuaXNfZHluYW1pYyl7cmV0dXJuIHRo
aXMuX2ZpZWxkVGV4dChlKX12PQphciBmPTNEdGhpcztyZXR1cm4gbmV3IGQuRHJpbGxkb3duLlZp
ZXcoe2lkOiJmaWVsZC0iK2UuaWQsZGF0YTplLm9wdGlvbnMsZGk9CnNwbGF5OmUuZGlzcGxheSxv
bmNoYW5nZTpmdW5jdGlvbigpe2YuYXBwLnRyaWdnZXIoInJlZnJlc2giKX19KX0sX2ZpZWxkVGV4
dD0KOmZ1bmN0aW9uKGUpe2lmKGUub3B0aW9ucyl7ZS5hcmVhPTNEZS5tdWx0aXBsZTtpZighYy52
YWxpZGF0ZShlLnZhbHVlKSl7ZS52PQphbHVlPTNEIiJ9ZWxzZXtpZihlLnZhbHVlIGluc3RhbmNl
b2YgQXJyYXkpe2UudmFsdWU9M0R2YWx1ZS50b1N0cmluZygpfWVsc2U9CntlLnZhbHVlPTNEU3Ry
aW5nKGUudmFsdWUpLnJlcGxhY2UoL1tcW1xdJyJcc10vZywiIik7aWYoZS5tdWx0aXBsZSl7ZS52
YWx1ZT0KPTNEZS52YWx1ZS5yZXBsYWNlKC8sL2csIlxuIil9fX19dmFyIGY9M0R0aGlzO3JldHVy
biBuZXcgZC5JbnB1dCh7aWQ6ImZpZWxkPQotIitlLmlkLGFyZWE6ZS5hcmVhLG9uY2hhbmdlOmZ1
bmN0aW9uKCl7Zi5hcHAudHJpZ2dlcigicmVmcmVzaCIpfX0pfSxfZmllbGQ9ClNsaWRlcjpmdW5j
dGlvbihlKXt2YXIgZj0zRHRoaXM7cmV0dXJuIG5ldyBkLlNsaWRlci5WaWV3KHtpZDoiZmllbGQt
IitlLmlkLD0KcHJlY2lzZTplLnR5cGU9M0Q9M0QiZmxvYXQiLG1pbjplLm1pbixtYXg6ZS5tYXgs
b25jaGFuZ2U6ZnVuY3Rpb24oKXtmLmFwcC50PQpyaWdnZXIoInJlZnJlc2giKX19KX0sX2ZpZWxk
SGlkZGVuOmZ1bmN0aW9uKGUpe3JldHVybiBuZXcgZC5IaWRkZW4oe2lkOiJmaWU9CmxkLSIrZS5p
ZCxpbmZvOmUuaW5mb30pfSxfZmllbGRCb29sZWFuOmZ1bmN0aW9uKGUpe3ZhciBmPTNEdGhpczty
ZXR1cm4gbmV3ID0KZC5SYWRpb0J1dHRvbi5WaWV3KHtpZDoiZmllbGQtIitlLmlkLGRhdGE6W3ts
YWJlbDoiWWVzIix2YWx1ZToidHJ1ZSJ9LHtsYWJlPQpsOiJObyIsdmFsdWU6ImZhbHNlIn1dLG9u
Y2hhbmdlOmZ1bmN0aW9uKCl7Zi5hcHAudHJpZ2dlcigicmVmcmVzaCIpfX0pfSxfZmk9CmVsZENv
bG9yOmZ1bmN0aW9uKGUpe3ZhciBmPTNEdGhpcztyZXR1cm4gbmV3IGIoe2lkOiJmaWVsZC0iK2Uu
aWQsb25jaGFuZ2U6Zj0KdW5jdGlvbigpe2YuYXBwLnRyaWdnZXIoInJlZnJlc2giKX19KX19KTty
ZXR1cm57VmlldzpWaWV3fX0pOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK2RlZmluZShb
InV0aWxzL3V0aWxzIiwibXZjL3VpL3VpLW1pc2MiLCJtdmMvdG9vbHMvdG9vbHMtc2VsZWN0LWNv
bnRlbnQiLCJtPQp2Yy91aS91aS1jb2xvci1waWNrZXIiXSxmdW5jdGlvbihjLGQsYSxiKXtyZXR1
cm4gQmFja2JvbmUuTW9kZWwuZXh0ZW5kKHt0eXA9CmVzOnt0ZXh0OiJfZmllbGRUZXh0IixzZWxl
Y3Q6Il9maWVsZFNlbGVjdCIsZGF0YV9jb2x1bW46Il9maWVsZFNlbGVjdCIsZ2Vubz0KbWVidWls
ZDoiX2ZpZWxkU2VsZWN0IixkYXRhOiJfZmllbGREYXRhIixkYXRhX2NvbGxlY3Rpb246Il9maWVs
ZERhdGEiLGludGVnPQplcjoiX2ZpZWxkU2xpZGVyIiwiZmxvYXQiOiJfZmllbGRTbGlkZXIiLCJi
b29sZWFuIjoiX2ZpZWxkQm9vbGVhbiIsZHJpbGxfZG89CnduOiJfZmllbGREcmlsbGRvd24iLGNv
bG9yOiJfZmllbGRDb2xvciIsaGlkZGVuOiJfZmllbGRIaWRkZW4iLGhpZGRlbl9kYXRhOj0KIl9m
aWVsZEhpZGRlbiIsYmFzZXVybDoiX2ZpZWxkSGlkZGVuIix9LGluaXRpYWxpemU6ZnVuY3Rpb24o
ZixlKXt0aGlzLmFwcD0KPTNEZn0sY3JlYXRlOmZ1bmN0aW9uKGUpe2lmKGUudmFsdWU9M0Q9M0Q9
M0R1bmRlZmluZWQpe2UudmFsdWU9M0RudWxsfWlmKGUuPQpkZWZhdWx0X3ZhbHVlPTNEPTNEPTNE
dW5kZWZpbmVkKXtlLmRlZmF1bHRfdmFsdWU9M0RlLnZhbHVlfXZhciBnPTNEbnVsbDt2YXI9CiBm
PTNEdGhpcy50eXBlc1tlLnR5cGVdO2lmKGYmJnR5cGVvZih0aGlzW2ZdKT0zRD0zRD0zRCJmdW5j
dGlvbiIpe2c9M0R0aGlzWz0KZl0uY2FsbCh0aGlzLGUpfWlmKCFnKXt0aGlzLmFwcC5pbmNvbXBh
dGlibGU9M0R0cnVlO2lmKGUub3B0aW9ucyl7Zz0zRHRoaXMuPQpfZmllbGRTZWxlY3QoZSl9ZWxz
ZXtnPTNEdGhpcy5fZmllbGRUZXh0KGUpfWNvbnNvbGUuZGVidWcoInRvb2xzLWZvcm06Ol9hZGQ9
ClJvdygpIDogQXV0byBtYXRjaGVkIGZpZWxkIHR5cGUgKCIrZS50eXBlKyIpLiIpfWlmKGUudmFs
dWUhPTNEPTNEdW5kZWZpbmVkKT0Ke2cudmFsdWUoZS52YWx1ZSl9cmV0dXJuIGd9LF9maWVsZERh
dGE6ZnVuY3Rpb24oZSl7aWYoIXRoaXMuYXBwLm9wdGlvbnMuaXNfPQpkeW5hbWljKXtlLmluZm89
M0QiRGF0YSBpbnB1dCAnIitlLm5hbWUrIicgKCIrYy50ZXh0aWZ5KGUuZXh0ZW5zaW9ucy50b1N0
cmk9Cm5nKCkpKyIpIjtlLnZhbHVlPTNEbnVsbDtyZXR1cm4gdGhpcy5fZmllbGRIaWRkZW4oZSl9
dmFyIGY9M0R0aGlzO3JldHVybiBuZT0KdyBhLlZpZXcodGhpcy5hcHAse2lkOiJmaWVsZC0iK2Uu
aWQsZXh0ZW5zaW9uczplLmV4dGVuc2lvbnMsb3B0aW9uYWw6ZS5vcHRpPQpvbmFsLG11bHRpcGxl
OmUubXVsdGlwbGUsdHlwZTplLnR5cGUsZGF0YTplLm9wdGlvbnMsb25jaGFuZ2U6ZnVuY3Rpb24o
KXtmLmE9CnBwLnRyaWdnZXIoInJlZnJlc2giKX19KX0sX2ZpZWxkU2VsZWN0OmZ1bmN0aW9uKGUp
e2lmKCF0aGlzLmFwcC5vcHRpb25zLmlzXz0KZHluYW1pYyYmZS5pc19keW5hbWljKXtyZXR1cm4g
dGhpcy5fZmllbGRUZXh0KGUpfWlmKGUudHlwZT0zRD0zRCJkYXRhX2NvbHVtPQpuIil7ZS5lcnJv
cl90ZXh0PTNEIk1pc3NpbmcgY29sdW1ucyBpbiByZWZlcmVuY2VkIGRhdGFzZXQuIn1pZihlLnR5
cGU9M0Q9M0Q9CiJnZW5vbWVidWlsZCIpe2Uuc2VhcmNoYWJsZT0zRHRydWV9dmFyIGc9M0RbXTtm
b3IodmFyIGggaW4gZS5vcHRpb25zKXt2YXIgaj0KPTNEZS5vcHRpb25zW2hdO2cucHVzaCh7bGFi
ZWw6alswXSx2YWx1ZTpqWzFdfSl9dmFyIGs9M0RkLlNlbGVjdDtzd2l0Y2goZS5kPQppc3BsYXkp
e2Nhc2UiY2hlY2tib3hlcyI6az0zRGQuQ2hlY2tib3g7YnJlYWs7Y2FzZSJyYWRpbyI6az0zRGQu
UmFkaW87YnJlYWs9Cn12YXIgZj0zRHRoaXM7cmV0dXJuIG5ldyBrLlZpZXcoe2lkOiJmaWVsZC0i
K2UuaWQsZGF0YTpnLGVycm9yX3RleHQ6ZS5lcnJvcj0KX3RleHR8fCJObyBvcHRpb25zIGF2YWls
YWJsZSIsbXVsdGlwbGU6ZS5tdWx0aXBsZSxvcHRpb25hbDplLm9wdGlvbmFsLHNlYXJjPQpoYWJs
ZTplLnNlYXJjaGFibGUsb25jaGFuZ2U6ZnVuY3Rpb24oKXtmLmFwcC50cmlnZ2VyKCJyZWZyZXNo
Iil9fSl9LF9maWVsZEQ9CnJpbGxkb3duOmZ1bmN0aW9uKGUpe2lmKCF0aGlzLmFwcC5vcHRpb25z
LmlzX2R5bmFtaWMmJmUuaXNfZHluYW1pYyl7cmV0dXJuID0KdGhpcy5fZmllbGRUZXh0KGUpfXZh
ciBmPTNEdGhpcztyZXR1cm4gbmV3IGQuRHJpbGxkb3duLlZpZXcoe2lkOiJmaWVsZC0iK2UuPQpp
ZCxkYXRhOmUub3B0aW9ucyxkaXNwbGF5OmUuZGlzcGxheSxvbmNoYW5nZTpmdW5jdGlvbigpe2Yu
YXBwLnRyaWdnZXIoInJlZnI9CmVzaCIpfX0pfSxfZmllbGRUZXh0OmZ1bmN0aW9uKGUpe2lmKGUu
b3B0aW9ucyl7ZS5hcmVhPTNEZS5tdWx0aXBsZTtpZighYy52YT0KbGlkYXRlKGUudmFsdWUpKXtl
LnZhbHVlPTNEIiJ9ZWxzZXtpZihlLnZhbHVlIGluc3RhbmNlb2YgQXJyYXkpe2UudmFsdWU9M0R2
PQphbHVlLnRvU3RyaW5nKCl9ZWxzZXtlLnZhbHVlPTNEU3RyaW5nKGUudmFsdWUpLnJlcGxhY2Uo
L1tcW1xdJyJcc10vZywiIik7aWY9CihlLm11bHRpcGxlKXtlLnZhbHVlPTNEZS52YWx1ZS5yZXBs
YWNlKC8sL2csIlxuIil9fX19dmFyIGY9M0R0aGlzO3JldHVybiBuZT0KdyBkLklucHV0KHtpZDoi
ZmllbGQtIitlLmlkLGFyZWE6ZS5hcmVhLG9uY2hhbmdlOmZ1bmN0aW9uKCl7Zi5hcHAudHJpZ2dl
cigiPQpyZWZyZXNoIil9fSl9LF9maWVsZFNsaWRlcjpmdW5jdGlvbihlKXt2YXIgZj0zRHRoaXM7
cmV0dXJuIG5ldyBkLlNsaWRlci5WaWU9Cncoe2lkOiJmaWVsZC0iK2UuaWQscHJlY2lzZTplLnR5
cGU9M0Q9M0QiZmxvYXQiLG1pbjplLm1pbixtYXg6ZS5tYXgsb25jaGFuZz0KZTpmdW5jdGlvbigp
e2YuYXBwLnRyaWdnZXIoInJlZnJlc2giKX19KX0sX2ZpZWxkSGlkZGVuOmZ1bmN0aW9uKGUpe3Jl
dHVybiBuPQpldyBkLkhpZGRlbih7aWQ6ImZpZWxkLSIrZS5pZCxpbmZvOmUuaW5mb30pfSxfZmll
bGRCb29sZWFuOmZ1bmN0aW9uKGUpe3ZhciA9CmY9M0R0aGlzO3JldHVybiBuZXcgZC5SYWRpb0J1
dHRvbi5WaWV3KHtpZDoiZmllbGQtIitlLmlkLGRhdGE6W3tsYWJlbDoiWWVzIj0KLHZhbHVlOiJ0
cnVlIn0se2xhYmVsOiJObyIsdmFsdWU6ImZhbHNlIn1dLG9uY2hhbmdlOmZ1bmN0aW9uKCl7Zi5h
cHAudHJpZ2dlPQpyKCJyZWZyZXNoIil9fSl9LF9maWVsZENvbG9yOmZ1bmN0aW9uKGUpe3ZhciBm
PTNEdGhpcztyZXR1cm4gbmV3IGIoe2lkOiJmaWU9CmxkLSIrZS5pZCxvbmNoYW5nZTpmdW5jdGlv
bigpe2YuYXBwLnRyaWdnZXIoInJlZnJlc2giKX19KX19KTtyZXR1cm57VmlldzpWaT0KZXd9fSk7
ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQoKCmh0dHBzOi8vYml0YnVja2V0Lm9yZy9nYWxh
eHkvZ2FsYXh5LWNlbnRyYWwvY29tbWl0cy8xNmNhMTlmMTJhNGYvCkNoYW5nZXNldDogICAxNmNh
MTlmMTJhNGYKQnJhbmNoOiAgICAgIHJlbGVhc2VfMTUuMDMKVXNlcjogICAgICAgIGRhbgpEYXRl
OiAgICAgICAgMjAxNS0wMy0yMCAyMjoxODowOCswMDowMApTdW1tYXJ5OiAgICAgRml4IGRpc3Bs
YXlpbmcgYW4gZXJyb3IgbWVzc2FnZSB3aGVuIGEgdXNlciBjYW5ub3QgdmlldyBhIGhpc3Q9Cm9y
eS4gUHJldmlvdXNseSwgaXQgd2FzIHRocm93aW5nIGEgc2VydmVyIGVycm9yIHdoZW4gaXQgd2Fz
IGF0dGVtcHRpbmcgdG8gZD0KaXNwbGF5IGZyb20gYW4gZW1wdHkgaGlzdG9yeV9kaWN0LgpBZmZl
Y3RlZCAjOiAgMSBmaWxlCgpkaWZmIC1yIDRkZTU1NmJkN2E2YzYwYmEwNDI5ZmE0MTZiNWIxZjcx
ZGE5MGMwMTcgLXIgMTZjYTE5ZjEyYTRmNmIyNjg3ZWMxYWQ9CjEzYzdiZTBlZWVjNmU1ZTgwIGxp
Yi9nYWxheHkvd2ViYXBwcy9nYWxheHkvY29udHJvbGxlcnMvaGlzdG9yeS5weQotLS0gYS9saWIv
Z2FsYXh5L3dlYmFwcHMvZ2FsYXh5L2NvbnRyb2xsZXJzL2hpc3RvcnkucHkKKysrIGIvbGliL2dh
bGF4eS93ZWJhcHBzL2dhbGF4eS9jb250cm9sbGVycy9oaXN0b3J5LnB5CkBAIC02MDUsOSArNjA1
LDEzIEBACj0yMAogICAgICAgICBleGNlcHQgRXhjZXB0aW9uLCBleGM6CiAgICAgICAgICAgICB1
c2VyX2lkID0zRCBzdHIoIHRyYW5zLnVzZXIuaWQgKSBpZiB0cmFucy51c2VyIGVsc2UgJyhhbm9u
eW1vdT0KcyknCi0gICAgICAgICAgICBsb2cuZXhjZXB0aW9uKCAnRXJyb3IgYm9vdHN0cmFwcGlu
ZyBoaXN0b3J5IGZvciB1c2VyICVzOiAlcycsID0KdXNlcl9pZCwgc3RyKCBleGMgKSApCi0gICAg
ICAgICAgICBoaXN0b3J5X2RpY3Rpb25hcnlbICdlcnJvcicgXSA9M0QgKCAnQW4gZXJyb3Igb2Nj
dXJyZWQgZ2V0dGluZz0KIHRoZSBoaXN0b3J5IGRhdGEgZnJvbSB0aGUgc2VydmVyLiAnCi0gICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgJ1BsZWFzZSBjb250YWN0
IGEgR2FsYXh5IGFkbT0KaW5pc3RyYXRvciBpZiB0aGUgcHJvYmxlbSBwZXJzaXN0cy4nICkKKyAg
ICAgICAgICAgIGxvZy5leGNlcHRpb24oICdFcnJvciBib290c3RyYXBwaW5nIGhpc3RvcnkgZm9y
IHVzZXIgJXM6ICVzJywgPQp1c2VyX2lkLCBleGMgKQorICAgICAgICAgICAgaWYgaXNpbnN0YW5j
ZSggZXhjLCBleGNlcHRpb25zLkl0ZW1BY2Nlc3NpYmlsaXR5RXhjZXB0aW9uICk6CisgICAgICAg
ICAgICAgICAgZXJyb3JfbXNnID0zRCAnWW91IGRvIG5vdCBoYXZlIHBlcm1pc3Npb24gdG8gdmll
dyB0aGlzIGhpcz0KdG9yeS4nCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGVy
cm9yX21zZyA9M0QgKCAnQW4gZXJyb3Igb2NjdXJyZWQgZ2V0dGluZyB0aGUgaGlzdG9yeSBkYXQ9
CmEgZnJvbSB0aGUgc2VydmVyLiAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICdQ
bGVhc2UgY29udGFjdCBhIEdhbGF4eSBhZG1pbmlzdHJhdG9yIGlmID0KdGhlIHByb2JsZW0gcGVy
c2lzdHMuJyApCisgICAgICAgICAgICByZXR1cm4gdHJhbnMuc2hvd19lcnJvcl9tZXNzYWdlKCBl
cnJvcl9tc2csIHVzZV9wYW5lbHM9M0R1c2VfcD0KYW5lbHMgKQo9MjAKICAgICAgICAgcmV0dXJu
IHRyYW5zLmZpbGxfdGVtcGxhdGVfbWFrbyggImhpc3Rvcnkvdmlldy5tYWtvIiwKICAgICAgICAg
ICAgIGhpc3Rvcnk9M0RoaXN0b3J5X2RpY3Rpb25hcnksIGhkYXM9M0RoZGFfZGljdGlvbmFyaWVz
LCB1c2VyX2lzPQpfb3duZXI9M0R1c2VyX2lzX293bmVyLAoKCmh0dHBzOi8vYml0YnVja2V0Lm9y
Zy9nYWxheHkvZ2FsYXh5LWNlbnRyYWwvY29tbWl0cy85ODhjYzRkZGEyMTIvCkNoYW5nZXNldDog
ICA5ODhjYzRkZGEyMTIKQnJhbmNoOiAgICAgIHJlbGVhc2VfMTUuMDMKVXNlcjogICAgICAgIGpt
Y2hpbHRvbgpEYXRlOiAgICAgICAgMjAxNS0wMy0yNCAxNTo0MzozMCswMDowMApTdW1tYXJ5OiAg
ICAgRml4IGxvZ2dpbmdfY29ubmVjdGlvbl9wcm94eSBmb3Igc3FsYWxjaGVteSB1cGdyYWRlLgoK
VGhlIGltcG9ydCAqIGlzIG5vdyBpbXBvcnRpbmcgc29tZXRoaW5nIGNhbGwgaW5zcGVjdCB3aGlj
aCBpcyBtYXNraW5nIHRoZSBhPQpjdHVhbCBkZXNpcmVkIGluc3BlY3QgaW1wb3J0IGFib3ZlIGl0
LgpBZmZlY3RlZCAjOiAgMSBmaWxlCgpkaWZmIC1yIDE2Y2ExOWYxMmE0ZjZiMjY4N2VjMWFkMTNj
N2JlMGVlZWM2ZTVlODAgLXIgOTg4Y2M0ZGRhMjEyOWZiZDAwZDgzZDI9CmMxMjY0NWZhZmY4Y2Jl
N2U5IGxpYi9nYWxheHkvbW9kZWwvb3JtL2xvZ2dpbmdfY29ubmVjdGlvbl9wcm94eS5weQotLS0g
YS9saWIvZ2FsYXh5L21vZGVsL29ybS9sb2dnaW5nX2Nvbm5lY3Rpb25fcHJveHkucHkKKysrIGIv
bGliL2dhbGF4eS9tb2RlbC9vcm0vbG9nZ2luZ19jb25uZWN0aW9uX3Byb3h5LnB5CkBAIC0yLDcg
KzIsNyBAQAogaW1wb3J0IGluc3BlY3QKIGltcG9ydCBvcwo9MjAKLWZyb20gZ2FsYXh5Lm1vZGVs
Lm9ybSBpbXBvcnQgKgorZnJvbSBnYWxheHkubW9kZWwub3JtIGltcG9ydCBDb25uZWN0aW9uUHJv
eHkKPTIwCiBpbXBvcnQgbG9nZ2luZwo9MjAKCgpodHRwczovL2JpdGJ1Y2tldC5vcmcvZ2FsYXh5
L2dhbGF4eS1jZW50cmFsL2NvbW1pdHMvNDlkNTBiY2U0NjMyLwpDaGFuZ2VzZXQ6ICAgNDlkNTBi
Y2U0NjMyCkJyYW5jaDogICAgICByZWxlYXNlXzE1LjAzClVzZXI6ICAgICAgICBtYXJ0ZW5zb24K
RGF0ZTogICAgICAgIDIwMTUtMDMtMjQgMTY6MTQ6MTErMDA6MDAKU3VtbWFyeTogICAgIGFkZCBy
b290IHByZWZpeCB0byBhbGwgbGlicmFyeSBCQiBtb2RlbCB1cmxzCkFmZmVjdGVkICM6ICAzIGZp
bGVzCgpkaWZmIC1yIDk4OGNjNGRkYTIxMjlmYmQwMGQ4M2QyYzEyNjQ1ZmFmZjhjYmU3ZTkgLXIg
NDlkNTBiY2U0NjMyMDZmNDQ1MDYzZDI9CmIyN2IyZjJiMzkzYWRiZTExIGNsaWVudC9nYWxheHkv
c2NyaXB0cy9tdmMvbGlicmFyeS9saWJyYXJ5LW1vZGVsLmpzCi0tLSBhL2NsaWVudC9nYWxheHkv
c2NyaXB0cy9tdmMvbGlicmFyeS9saWJyYXJ5LW1vZGVsLmpzCisrKyBiL2NsaWVudC9nYWxheHkv
c2NyaXB0cy9tdmMvbGlicmFyeS9saWJyYXJ5LW1vZGVsLmpzCkBAIC00LDcgKzQsNyBAQAogLy8g
TElCUkFSWSBSRUxBVEVEIE1PREVMUwo9MjAKICAgICB2YXIgTGlicmFyeSA9M0QgQmFja2JvbmUu
TW9kZWwuZXh0ZW5kKHsKLSAgICAgIHVybFJvb3Q6ICcvYXBpL2xpYnJhcmllcy8nLAorICAgICAg
dXJsUm9vdDogKCB3aW5kb3cuZ2FsYXh5X2NvbmZpZyA/IGdhbGF4eV9jb25maWcucm9vdCA6ICcv
JyApICsgJ2FwaS89CmxpYnJhcmllcy8nLAo9MjAKICAgICAgIC8qKiBiYXNlZCBvbiBzaG93X2Rl
bGV0ZWQgd291bGQgdGhpcyBsaWIgc2hvdyBpbiB0aGUgbGlzdCBvZiBsaWIncz8KICAgICAgICAq
ICBAcGFyYW0ge0Jvb2xlYW59IHNob3dfZGVsZXRlZCBhcmUgd2UgaW5jbHVkaW5nIGRlbGV0ZWQg
bGlicmFyaWVzPwpAQCAtMTksNyArMTksNyBAQAogICAgIH0pOwo9MjAKICAgICB2YXIgTGlicmFy
aWVzID0zRCBCYWNrYm9uZS5Db2xsZWN0aW9uLmV4dGVuZCh7Ci0gICAgICB1cmw6ICcvYXBpL2xp
YnJhcmllcycsCisgICAgICB1cmw6ICggd2luZG93LmdhbGF4eV9jb25maWcgPyBnYWxheHlfY29u
ZmlnLnJvb3QgOiAnLycgKSArICdhcGkvbGlicj0KYXJpZXMnLAo9MjAKICAgICAgIG1vZGVsOiBM
aWJyYXJ5LAo9MjAKQEAgLTg0LDE1ICs4NCwxNSBAQAogLy8gRk9MREVSIFJFTEFURUQgTU9ERUxT
Cj0yMAogICAgIHZhciBJdGVtID0zRCBCYWNrYm9uZS5Nb2RlbC5leHRlbmQoewotICAgICAgdXJs
Um9vdCA6ICcvYXBpL2xpYnJhcmllcy9kYXRhc2V0cy8nCisgICAgICB1cmxSb290IDogKCB3aW5k
b3cuZ2FsYXh5X2NvbmZpZyA/IGdhbGF4eV9jb25maWcucm9vdCA6ICcvJyApICsgJ2FwaT0KL2xp
YnJhcmllcy9kYXRhc2V0cy8nCiAgICAgfSk7Cj0yMAogICAgIHZhciBMZGRhID0zRCBCYWNrYm9u
ZS5Nb2RlbC5leHRlbmQoewotICAgICAgdXJsUm9vdCA6ICcvYXBpL2xpYnJhcmllcy9kYXRhc2V0
cy8nCisgICAgICB1cmxSb290IDogKCB3aW5kb3cuZ2FsYXh5X2NvbmZpZyA/IGdhbGF4eV9jb25m
aWcucm9vdCA6ICcvJyApICsgJ2FwaT0KL2xpYnJhcmllcy9kYXRhc2V0cy8nCiAgICAgfSk7Cj0y
MAogICAgIHZhciBGb2xkZXJBc01vZGVsID0zRCBCYWNrYm9uZS5Nb2RlbC5leHRlbmQoewotICAg
ICAgdXJsUm9vdDogJy9hcGkvZm9sZGVycycKKyAgICAgIHVybFJvb3Q6ICggd2luZG93LmdhbGF4
eV9jb25maWcgPyBnYWxheHlfY29uZmlnLnJvb3QgOiAnLycgKSArICdhcGkvPQpmb2xkZXJzJwog
ICAgIH0pOwo9MjAKICAgICB2YXIgRm9sZGVyID0zRCBCYWNrYm9uZS5Db2xsZWN0aW9uLmV4dGVu
ZCh7CkBAIC0xNTIsNyArMTUyLDcgQEAKICAgICB2YXIgRm9sZGVyQ29udGFpbmVyID0zRCBCYWNr
Ym9uZS5Nb2RlbC5leHRlbmQoewogICAgICAgICBkZWZhdWx0cyA6IHsKICAgICAgICAgICAgIGZv
bGRlciA6IG5ldyBGb2xkZXIoKSwKLSAgICAgICAgICAgIHVybFJvb3QgOiAiL2FwaS9mb2xkZXJz
LyIsCisgICAgICAgICAgICB1cmxSb290IDogKCB3aW5kb3cuZ2FsYXh5X2NvbmZpZyA/IGdhbGF4
eV9jb25maWcucm9vdCA6ICcvJyApID0KKyAnYXBpL2ZvbGRlcnMvJywKICAgICAgICAgICAgIGlk
IDogInVua25vd24iCiAgICAgICAgIH0sCiAgICAgcGFyc2UgOiBmdW5jdGlvbihvYmopIHsKQEAg
LTE2OSwxMSArMTY5LDExIEBACiAvLyBUT0RPIFVOSVRFCj0yMAogICAgIHZhciBIaXN0b3J5SXRl
bSA9M0QgQmFja2JvbmUuTW9kZWwuZXh0ZW5kKHsKLSAgICAgIHVybFJvb3QgOiAnL2FwaS9oaXN0
b3JpZXMvJworICAgICAgdXJsUm9vdCA6ICggd2luZG93LmdhbGF4eV9jb25maWcgPyBnYWxheHlf
Y29uZmlnLnJvb3QgOiAnLycgKSArICdhcGk9Ci9oaXN0b3JpZXMvJwogICAgIH0pOwo9MjAKICAg
ICB2YXIgSGlzdG9yeUNvbnRlbnRzID0zRCBCYWNrYm9uZS5Db2xsZWN0aW9uLmV4dGVuZCh7Ci0g
ICAgICB1cmxSb290IDogJy9hcGkvaGlzdG9yaWVzLycsCisgICAgICB1cmxSb290IDogKCB3aW5k
b3cuZ2FsYXh5X2NvbmZpZyA/IGdhbGF4eV9jb25maWcucm9vdCA6ICcvJyApICsgJ2FwaT0KL2hp
c3Rvcmllcy8nLAogICAgICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24ob3B0aW9ucyl7CiAgICAgICAg
IHRoaXMuaWQgPTNEIG9wdGlvbnMuaWQ7CiAgICAgICB9LApAQCAtMTg0LDExICsxODQsMTEgQEAK
ICAgICB9KTsKPTIwCiAgICAgdmFyIEdhbGF4eUhpc3RvcnkgPTNEIEJhY2tib25lLk1vZGVsLmV4
dGVuZCh7Ci0gICAgICB1cmxSb290IDogJy9hcGkvaGlzdG9yaWVzLycKKyAgICAgIHVybFJvb3Qg
OiAoIHdpbmRvdy5nYWxheHlfY29uZmlnID8gZ2FsYXh5X2NvbmZpZy5yb290IDogJy8nICkgKyAn
YXBpPQovaGlzdG9yaWVzLycKICAgICB9KTsKPTIwCiAgICAgdmFyIEdhbGF4eUhpc3RvcmllcyA9
M0QgQmFja2JvbmUuQ29sbGVjdGlvbi5leHRlbmQoewotICAgICAgdXJsIDogJy9hcGkvaGlzdG9y
aWVzJywKKyAgICAgIHVybCA6ICggd2luZG93LmdhbGF4eV9jb25maWcgPyBnYWxheHlfY29uZmln
LnJvb3QgOiAnLycgKSArICdhcGkvaGlzPQp0b3JpZXMnLAogICAgICAgbW9kZWwgOiBHYWxheHlI
aXN0b3J5CiAgICAgfSk7Cj0yMApAQCAtMTk5LDcgKzE5OSw3IEBACiAgICAgICovCiAgICA9MjAK
ICAgICB2YXIgSnN0cmVlID0zRCBCYWNrYm9uZS5Nb2RlbC5leHRlbmQoewotICAgICAgdXJsUm9v
dDogJy9hcGkvcmVtb3RlX2ZpbGVzJworICAgICAgdXJsUm9vdDogKCB3aW5kb3cuZ2FsYXh5X2Nv
bmZpZyA/IGdhbGF4eV9jb25maWcucm9vdCA6ICcvJyApICsgJ2FwaS89CnJlbW90ZV9maWxlcycK
ICAgICB9KTsKPTIwCiByZXR1cm4gewoKZGlmZiAtciA5ODhjYzRkZGEyMTI5ZmJkMDBkODNkMmMx
MjY0NWZhZmY4Y2JlN2U5IC1yIDQ5ZDUwYmNlNDYzMjA2ZjQ0NTA2M2QyPQpiMjdiMmYyYjM5M2Fk
YmUxMSBzdGF0aWMvc2NyaXB0cy9tdmMvbGlicmFyeS9saWJyYXJ5LW1vZGVsLmpzCi0tLSBhL3N0
YXRpYy9zY3JpcHRzL212Yy9saWJyYXJ5L2xpYnJhcnktbW9kZWwuanMKKysrIGIvc3RhdGljL3Nj
cmlwdHMvbXZjL2xpYnJhcnkvbGlicmFyeS1tb2RlbC5qcwpAQCAtNCw3ICs0LDcgQEAKIC8vIExJ
QlJBUlkgUkVMQVRFRCBNT0RFTFMKPTIwCiAgICAgdmFyIExpYnJhcnkgPTNEIEJhY2tib25lLk1v
ZGVsLmV4dGVuZCh7Ci0gICAgICB1cmxSb290OiAnL2FwaS9saWJyYXJpZXMvJywKKyAgICAgIHVy
bFJvb3Q6ICggd2luZG93LmdhbGF4eV9jb25maWcgPyBnYWxheHlfY29uZmlnLnJvb3QgOiAnLycg
KSArICdhcGkvPQpsaWJyYXJpZXMvJywKPTIwCiAgICAgICAvKiogYmFzZWQgb24gc2hvd19kZWxl
dGVkIHdvdWxkIHRoaXMgbGliIHNob3cgaW4gdGhlIGxpc3Qgb2YgbGliJ3M/CiAgICAgICAgKiAg
QHBhcmFtIHtCb29sZWFufSBzaG93X2RlbGV0ZWQgYXJlIHdlIGluY2x1ZGluZyBkZWxldGVkIGxp
YnJhcmllcz8KQEAgLTE5LDcgKzE5LDcgQEAKICAgICB9KTsKPTIwCiAgICAgdmFyIExpYnJhcmll
cyA9M0QgQmFja2JvbmUuQ29sbGVjdGlvbi5leHRlbmQoewotICAgICAgdXJsOiAnL2FwaS9saWJy
YXJpZXMnLAorICAgICAgdXJsOiAoIHdpbmRvdy5nYWxheHlfY29uZmlnID8gZ2FsYXh5X2NvbmZp
Zy5yb290IDogJy8nICkgKyAnYXBpL2xpYnI9CmFyaWVzJywKPTIwCiAgICAgICBtb2RlbDogTGli
cmFyeSwKPTIwCkBAIC04NCwxNSArODQsMTUgQEAKIC8vIEZPTERFUiBSRUxBVEVEIE1PREVMUwo9
MjAKICAgICB2YXIgSXRlbSA9M0QgQmFja2JvbmUuTW9kZWwuZXh0ZW5kKHsKLSAgICAgIHVybFJv
b3QgOiAnL2FwaS9saWJyYXJpZXMvZGF0YXNldHMvJworICAgICAgdXJsUm9vdCA6ICggd2luZG93
LmdhbGF4eV9jb25maWcgPyBnYWxheHlfY29uZmlnLnJvb3QgOiAnLycgKSArICdhcGk9Ci9saWJy
YXJpZXMvZGF0YXNldHMvJwogICAgIH0pOwo9MjAKICAgICB2YXIgTGRkYSA9M0QgQmFja2JvbmUu
TW9kZWwuZXh0ZW5kKHsKLSAgICAgIHVybFJvb3QgOiAnL2FwaS9saWJyYXJpZXMvZGF0YXNldHMv
JworICAgICAgdXJsUm9vdCA6ICggd2luZG93LmdhbGF4eV9jb25maWcgPyBnYWxheHlfY29uZmln
LnJvb3QgOiAnLycgKSArICdhcGk9Ci9saWJyYXJpZXMvZGF0YXNldHMvJwogICAgIH0pOwo9MjAK
ICAgICB2YXIgRm9sZGVyQXNNb2RlbCA9M0QgQmFja2JvbmUuTW9kZWwuZXh0ZW5kKHsKLSAgICAg
IHVybFJvb3Q6ICcvYXBpL2ZvbGRlcnMnCisgICAgICB1cmxSb290OiAoIHdpbmRvdy5nYWxheHlf
Y29uZmlnID8gZ2FsYXh5X2NvbmZpZy5yb290IDogJy8nICkgKyAnYXBpLz0KZm9sZGVycycKICAg
ICB9KTsKPTIwCiAgICAgdmFyIEZvbGRlciA9M0QgQmFja2JvbmUuQ29sbGVjdGlvbi5leHRlbmQo
ewpAQCAtMTUyLDcgKzE1Miw3IEBACiAgICAgdmFyIEZvbGRlckNvbnRhaW5lciA9M0QgQmFja2Jv
bmUuTW9kZWwuZXh0ZW5kKHsKICAgICAgICAgZGVmYXVsdHMgOiB7CiAgICAgICAgICAgICBmb2xk
ZXIgOiBuZXcgRm9sZGVyKCksCi0gICAgICAgICAgICB1cmxSb290IDogIi9hcGkvZm9sZGVycy8i
LAorICAgICAgICAgICAgdXJsUm9vdCA6ICggd2luZG93LmdhbGF4eV9jb25maWcgPyBnYWxheHlf
Y29uZmlnLnJvb3QgOiAnLycgKSA9CisgJ2FwaS9mb2xkZXJzLycsCiAgICAgICAgICAgICBpZCA6
ICJ1bmtub3duIgogICAgICAgICB9LAogICAgIHBhcnNlIDogZnVuY3Rpb24ob2JqKSB7CkBAIC0x
NjksMTEgKzE2OSwxMSBAQAogLy8gVE9ETyBVTklURQo9MjAKICAgICB2YXIgSGlzdG9yeUl0ZW0g
PTNEIEJhY2tib25lLk1vZGVsLmV4dGVuZCh7Ci0gICAgICB1cmxSb290IDogJy9hcGkvaGlzdG9y
aWVzLycKKyAgICAgIHVybFJvb3QgOiAoIHdpbmRvdy5nYWxheHlfY29uZmlnID8gZ2FsYXh5X2Nv
bmZpZy5yb290IDogJy8nICkgKyAnYXBpPQovaGlzdG9yaWVzLycKICAgICB9KTsKPTIwCiAgICAg
dmFyIEhpc3RvcnlDb250ZW50cyA9M0QgQmFja2JvbmUuQ29sbGVjdGlvbi5leHRlbmQoewotICAg
ICAgdXJsUm9vdCA6ICcvYXBpL2hpc3Rvcmllcy8nLAorICAgICAgdXJsUm9vdCA6ICggd2luZG93
LmdhbGF4eV9jb25maWcgPyBnYWxheHlfY29uZmlnLnJvb3QgOiAnLycgKSArICdhcGk9Ci9oaXN0
b3JpZXMvJywKICAgICAgIGluaXRpYWxpemU6IGZ1bmN0aW9uKG9wdGlvbnMpewogICAgICAgICB0
aGlzLmlkID0zRCBvcHRpb25zLmlkOwogICAgICAgfSwKQEAgLTE4NCwxMSArMTg0LDExIEBACiAg
ICAgfSk7Cj0yMAogICAgIHZhciBHYWxheHlIaXN0b3J5ID0zRCBCYWNrYm9uZS5Nb2RlbC5leHRl
bmQoewotICAgICAgdXJsUm9vdCA6ICcvYXBpL2hpc3Rvcmllcy8nCisgICAgICB1cmxSb290IDog
KCB3aW5kb3cuZ2FsYXh5X2NvbmZpZyA/IGdhbGF4eV9jb25maWcucm9vdCA6ICcvJyApICsgJ2Fw
aT0KL2hpc3Rvcmllcy8nCiAgICAgfSk7Cj0yMAogICAgIHZhciBHYWxheHlIaXN0b3JpZXMgPTNE
IEJhY2tib25lLkNvbGxlY3Rpb24uZXh0ZW5kKHsKLSAgICAgIHVybCA6ICcvYXBpL2hpc3Rvcmll
cycsCisgICAgICB1cmwgOiAoIHdpbmRvdy5nYWxheHlfY29uZmlnID8gZ2FsYXh5X2NvbmZpZy5y
b290IDogJy8nICkgKyAnYXBpL2hpcz0KdG9yaWVzJywKICAgICAgIG1vZGVsIDogR2FsYXh5SGlz
dG9yeQogICAgIH0pOwo9MjAKQEAgLTE5OSw3ICsxOTksNyBAQAogICAgICAqLwogICAgPTIwCiAg
ICAgdmFyIEpzdHJlZSA9M0QgQmFja2JvbmUuTW9kZWwuZXh0ZW5kKHsKLSAgICAgIHVybFJvb3Q6
ICcvYXBpL3JlbW90ZV9maWxlcycKKyAgICAgIHVybFJvb3Q6ICggd2luZG93LmdhbGF4eV9jb25m
aWcgPyBnYWxheHlfY29uZmlnLnJvb3QgOiAnLycgKSArICdhcGkvPQpyZW1vdGVfZmlsZXMnCiAg
ICAgfSk7Cj0yMAogcmV0dXJuIHsKCmRpZmYgLXIgOTg4Y2M0ZGRhMjEyOWZiZDAwZDgzZDJjMTI2
NDVmYWZmOGNiZTdlOSAtciA0OWQ1MGJjZTQ2MzIwNmY0NDUwNjNkMj0KYjI3YjJmMmIzOTNhZGJl
MTEgc3RhdGljL3NjcmlwdHMvcGFja2VkL212Yy9saWJyYXJ5L2xpYnJhcnktbW9kZWwuanMKLS0t
IGEvc3RhdGljL3NjcmlwdHMvcGFja2VkL212Yy9saWJyYXJ5L2xpYnJhcnktbW9kZWwuanMKKysr
IGIvc3RhdGljL3NjcmlwdHMvcGFja2VkL212Yy9saWJyYXJ5L2xpYnJhcnktbW9kZWwuanMKQEAg
LTEsMSArMSwxIEBACi1kZWZpbmUoW10sZnVuY3Rpb24oKXt2YXIgZj0zREJhY2tib25lLk1vZGVs
LmV4dGVuZCh7dXJsUm9vdDoiL2FwaS9saWJyYXJpZT0Kcy8iLGlzVmlzaWJsZTpmdW5jdGlvbihu
KXt2YXIgbT0zRHRydWU7aWYoKCFuKSYmKHRoaXMuZ2V0KCJkZWxldGVkIikpKXttPTNEPQpmYWxz
ZX1yZXR1cm4gbX19KTt2YXIgaT0zREJhY2tib25lLkNvbGxlY3Rpb24uZXh0ZW5kKHt1cmw6Ii9h
cGkvbGlicmFyaWVzIiw9Cm1vZGVsOmYsc29ydF9rZXk6Im5hbWUiLHNvcnRfb3JkZXI6bnVsbCxp
bml0aWFsaXplOmZ1bmN0aW9uKG0pe209M0RtfHx7fX0sZz0KZXRWaXNpYmxlOmZ1bmN0aW9uKG4s
byl7bz0zRG98fFtdO3ZhciBtPTNEbmV3IGkodGhpcy5maWx0ZXIoZnVuY3Rpb24ocCl7cmV0PQp1
cm4gcC5pc1Zpc2libGUobil9KSk7cmV0dXJuIG19LHNvcnRCeU5hbWVBc2M6ZnVuY3Rpb24oKXt0
aGlzLmNvbXBhcmF0b3I9M0Q9CmZ1bmN0aW9uKG4sbSl7aWYobi5nZXQoIm5hbWUiKS50b0xvd2Vy
Q2FzZSgpPm0uZ2V0KCJuYW1lIikudG9Mb3dlckNhc2UoKSl7cj0KZXR1cm4gMX1pZihtLmdldCgi
bmFtZSIpLnRvTG93ZXJDYXNlKCk+bi5nZXQoIm5hbWUiKS50b0xvd2VyQ2FzZSgpKXtyZXR1cm4g
PQotMX1yZXR1cm4gMH07dGhpcy5zb3J0KCk7cmV0dXJuIHRoaXN9LHNvcnRCeU5hbWVEZXNjOmZ1
bmN0aW9uKCl7dGhpcy5jb21wYXI9CmF0b3I9M0RmdW5jdGlvbihuLG0pe2lmKG4uZ2V0KCJuYW1l
IikudG9Mb3dlckNhc2UoKT5tLmdldCgibmFtZSIpLnRvTG93ZXJDYT0Kc2UoKSl7cmV0dXJuIC0x
fWlmKG0uZ2V0KCJuYW1lIikudG9Mb3dlckNhc2UoKT5uLmdldCgibmFtZSIpLnRvTG93ZXJDYXNl
KCkpPQp7cmV0dXJuIDF9cmV0dXJuIDB9O3RoaXMuc29ydCgpO3JldHVybiB0aGlzfX0pO3ZhciBn
PTNEQmFja2JvbmUuTW9kZWwuZXh0ZW49CmQoe3VybFJvb3Q6Ii9hcGkvbGlicmFyaWVzL2RhdGFz
ZXRzLyJ9KTt2YXIgbD0zREJhY2tib25lLk1vZGVsLmV4dGVuZCh7dXJsUj0Kb290OiIvYXBpL2xp
YnJhcmllcy9kYXRhc2V0cy8ifSk7dmFyIGE9M0RCYWNrYm9uZS5Nb2RlbC5leHRlbmQoe3VybFJv
b3Q6Ii9hPQpwaS9mb2xkZXJzIn0pO3ZhciBjPTNEQmFja2JvbmUuQ29sbGVjdGlvbi5leHRlbmQo
e21vZGVsOmcsc29ydEJ5TmFtZUFzYzpmdW49CmN0aW9uKCl7dGhpcy5jb21wYXJhdG9yPTNEZnVu
Y3Rpb24obixtKXtpZihuLmdldCgidHlwZSIpPTNEPTNEPTNEbS5nZXQoInR5cD0KZSIpKXtpZihu
LmdldCgibmFtZSIpLnRvTG93ZXJDYXNlKCk+bS5nZXQoIm5hbWUiKS50b0xvd2VyQ2FzZSgpKXty
ZXR1cm4gMX1pPQpmKG0uZ2V0KCJuYW1lIikudG9Mb3dlckNhc2UoKT5uLmdldCgibmFtZSIpLnRv
TG93ZXJDYXNlKCkpe3JldHVybiAtMX1yZXR1cm49CiAwfWVsc2V7aWYobi5nZXQoInR5cGUiKT0z
RD0zRD0zRCJmb2xkZXIiKXtyZXR1cm4gLTF9ZWxzZXtyZXR1cm4gMX19fTt0aGlzLj0Kc29ydCgp
O3JldHVybiB0aGlzfSxzb3J0QnlOYW1lRGVzYzpmdW5jdGlvbigpe3RoaXMuY29tcGFyYXRvcj0z
RGZ1bmN0aW9uKG4sPQptKXtpZihuLmdldCgidHlwZSIpPTNEPTNEPTNEbS5nZXQoInR5cGUiKSl7
aWYobi5nZXQoIm5hbWUiKS50b0xvd2VyQ2FzZSgpPm09Ci5nZXQoIm5hbWUiKS50b0xvd2VyQ2Fz
ZSgpKXtyZXR1cm4gLTF9aWYobS5nZXQoIm5hbWUiKS50b0xvd2VyQ2FzZSgpPm4uZ2V0KD0KIm5h
bWUiKS50b0xvd2VyQ2FzZSgpKXtyZXR1cm4gMX1yZXR1cm4gMH1lbHNle2lmKG4uZ2V0KCJ0eXBl
Iik9M0Q9M0Q9M0QiZm9sPQpkZXIiKXtyZXR1cm4gLTF9ZWxzZXtyZXR1cm4gMX19fTt0aGlzLnNv
cnQoKTtyZXR1cm4gdGhpc319KTt2YXIgZT0zREJhY2tib249CmUuTW9kZWwuZXh0ZW5kKHtkZWZh
dWx0czp7Zm9sZGVyOm5ldyBjKCksdXJsUm9vdDoiL2FwaS9mb2xkZXJzLyIsaWQ6InVua25vdz0K
biJ9LHBhcnNlOmZ1bmN0aW9uKG0pe3RoaXMuZ2V0KCJmb2xkZXIiKS5yZXNldChtLmZvbGRlcl9j
b250ZW50cyk7cmV0dXJuIG19PQp9KTt2YXIgYj0zREJhY2tib25lLk1vZGVsLmV4dGVuZCh7dXJs
Um9vdDoiL2FwaS9oaXN0b3JpZXMvIn0pO3ZhciBkPTNEQmFja2I9Cm9uZS5Db2xsZWN0aW9uLmV4
dGVuZCh7dXJsUm9vdDoiL2FwaS9oaXN0b3JpZXMvIixpbml0aWFsaXplOmZ1bmN0aW9uKG0pe3Ro
aT0Kcy5pZD0zRG0uaWR9LHVybDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnVybFJvb3QrdGhpcy5p
ZCsiL2NvbnRlbnRzIn0sbW9kZWw6PQpifSk7dmFyIGg9M0RCYWNrYm9uZS5Nb2RlbC5leHRlbmQo
e3VybFJvb3Q6Ii9hcGkvaGlzdG9yaWVzLyJ9KTt2YXIgaz0zREJhY2s9CmJvbmUuQ29sbGVjdGlv
bi5leHRlbmQoe3VybDoiL2FwaS9oaXN0b3JpZXMiLG1vZGVsOmh9KTt2YXIgaj0zREJhY2tib25l
Lk1vZD0KZWwuZXh0ZW5kKHt1cmxSb290OiIvYXBpL3JlbW90ZV9maWxlcyJ9KTtyZXR1cm57TGli
cmFyeTpmLEZvbGRlckFzTW9kZWw6YSxMPQppYnJhcmllczppLEl0ZW06ZyxMZGRhOmwsRm9sZGVy
OmMsRm9sZGVyQ29udGFpbmVyOmUsSGlzdG9yeUl0ZW06YixIaXN0b3J5Q289Cm50ZW50czpkLEdh
bGF4eUhpc3Rvcnk6aCxHYWxheHlIaXN0b3JpZXM6ayxKc3RyZWU6an19KTsKXCBObyBuZXdsaW5l
IGF0IGVuZCBvZiBmaWxlCitkZWZpbmUoW10sZnVuY3Rpb24oKXt2YXIgZj0zREJhY2tib25lLk1v
ZGVsLmV4dGVuZCh7dXJsUm9vdDood2luZG93LmdhbGF4eT0KX2NvbmZpZz9nYWxheHlfY29uZmln
LnJvb3Q6Ii8iKSsiYXBpL2xpYnJhcmllcy8iLGlzVmlzaWJsZTpmdW5jdGlvbihuKXt2YXIgPQpt
PTNEdHJ1ZTtpZigoIW4pJiYodGhpcy5nZXQoImRlbGV0ZWQiKSkpe209M0RmYWxzZX1yZXR1cm4g
bX19KTt2YXIgaT0zREJhY2s9CmJvbmUuQ29sbGVjdGlvbi5leHRlbmQoe3VybDood2luZG93Lmdh
bGF4eV9jb25maWc/Z2FsYXh5X2NvbmZpZy5yb290OiIvIikrIj0KYXBpL2xpYnJhcmllcyIsbW9k
ZWw6Zixzb3J0X2tleToibmFtZSIsc29ydF9vcmRlcjpudWxsLGluaXRpYWxpemU6ZnVuY3Rpb24o
PQptKXttPTNEbXx8e319LGdldFZpc2libGU6ZnVuY3Rpb24obixvKXtvPTNEb3x8W107dmFyIG09
M0RuZXcgaSh0aGlzLmZpbHRlcig9CmZ1bmN0aW9uKHApe3JldHVybiBwLmlzVmlzaWJsZShuKX0p
KTtyZXR1cm4gbX0sc29ydEJ5TmFtZUFzYzpmdW5jdGlvbigpe3RoaT0Kcy5jb21wYXJhdG9yPTNE
ZnVuY3Rpb24obixtKXtpZihuLmdldCgibmFtZSIpLnRvTG93ZXJDYXNlKCk+bS5nZXQoIm5hbWUi
KS50PQpvTG93ZXJDYXNlKCkpe3JldHVybiAxfWlmKG0uZ2V0KCJuYW1lIikudG9Mb3dlckNhc2Uo
KT5uLmdldCgibmFtZSIpLnRvTG93ZXI9CkNhc2UoKSl7cmV0dXJuIC0xfXJldHVybiAwfTt0aGlz
LnNvcnQoKTtyZXR1cm4gdGhpc30sc29ydEJ5TmFtZURlc2M6ZnVuY3Rpbz0Kbigpe3RoaXMuY29t
cGFyYXRvcj0zRGZ1bmN0aW9uKG4sbSl7aWYobi5nZXQoIm5hbWUiKS50b0xvd2VyQ2FzZSgpPm0u
Z2V0KCJuPQphbWUiKS50b0xvd2VyQ2FzZSgpKXtyZXR1cm4gLTF9aWYobS5nZXQoIm5hbWUiKS50
b0xvd2VyQ2FzZSgpPm4uZ2V0KCJuYW1lIik9Ci50b0xvd2VyQ2FzZSgpKXtyZXR1cm4gMX1yZXR1
cm4gMH07dGhpcy5zb3J0KCk7cmV0dXJuIHRoaXN9fSk7dmFyIGc9M0RCYWNrYj0Kb25lLk1vZGVs
LmV4dGVuZCh7dXJsUm9vdDood2luZG93LmdhbGF4eV9jb25maWc/Z2FsYXh5X2NvbmZpZy5yb290
OiIvIikrImFwPQppL2xpYnJhcmllcy9kYXRhc2V0cy8ifSk7dmFyIGw9M0RCYWNrYm9uZS5Nb2Rl
bC5leHRlbmQoe3VybFJvb3Q6KHdpbmRvdy5nYWw9CmF4eV9jb25maWc/Z2FsYXh5X2NvbmZpZy5y
b290OiIvIikrImFwaS9saWJyYXJpZXMvZGF0YXNldHMvIn0pO3ZhciBhPTNEQmFjaz0KYm9uZS5N
b2RlbC5leHRlbmQoe3VybFJvb3Q6KHdpbmRvdy5nYWxheHlfY29uZmlnP2dhbGF4eV9jb25maWcu
cm9vdDoiLyIpKyJhPQpwaS9mb2xkZXJzIn0pO3ZhciBjPTNEQmFja2JvbmUuQ29sbGVjdGlvbi5l
eHRlbmQoe21vZGVsOmcsc29ydEJ5TmFtZUFzYzpmdW49CmN0aW9uKCl7dGhpcy5jb21wYXJhdG9y
PTNEZnVuY3Rpb24obixtKXtpZihuLmdldCgidHlwZSIpPTNEPTNEPTNEbS5nZXQoInR5cD0KZSIp
KXtpZihuLmdldCgibmFtZSIpLnRvTG93ZXJDYXNlKCk+bS5nZXQoIm5hbWUiKS50b0xvd2VyQ2Fz
ZSgpKXtyZXR1cm4gMX1pPQpmKG0uZ2V0KCJuYW1lIikudG9Mb3dlckNhc2UoKT5uLmdldCgibmFt
ZSIpLnRvTG93ZXJDYXNlKCkpe3JldHVybiAtMX1yZXR1cm49CiAwfWVsc2V7aWYobi5nZXQoInR5
cGUiKT0zRD0zRD0zRCJmb2xkZXIiKXtyZXR1cm4gLTF9ZWxzZXtyZXR1cm4gMX19fTt0aGlzLj0K
c29ydCgpO3JldHVybiB0aGlzfSxzb3J0QnlOYW1lRGVzYzpmdW5jdGlvbigpe3RoaXMuY29tcGFy
YXRvcj0zRGZ1bmN0aW9uKG4sPQptKXtpZihuLmdldCgidHlwZSIpPTNEPTNEPTNEbS5nZXQoInR5
cGUiKSl7aWYobi5nZXQoIm5hbWUiKS50b0xvd2VyQ2FzZSgpPm09Ci5nZXQoIm5hbWUiKS50b0xv
d2VyQ2FzZSgpKXtyZXR1cm4gLTF9aWYobS5nZXQoIm5hbWUiKS50b0xvd2VyQ2FzZSgpPm4uZ2V0
KD0KIm5hbWUiKS50b0xvd2VyQ2FzZSgpKXtyZXR1cm4gMX1yZXR1cm4gMH1lbHNle2lmKG4uZ2V0
KCJ0eXBlIik9M0Q9M0Q9M0QiZm9sPQpkZXIiKXtyZXR1cm4gLTF9ZWxzZXtyZXR1cm4gMX19fTt0
aGlzLnNvcnQoKTtyZXR1cm4gdGhpc319KTt2YXIgZT0zREJhY2tib249CmUuTW9kZWwuZXh0ZW5k
KHtkZWZhdWx0czp7Zm9sZGVyOm5ldyBjKCksdXJsUm9vdDood2luZG93LmdhbGF4eV9jb25maWc/
Z2FsYT0KeHlfY29uZmlnLnJvb3Q6Ii8iKSsiYXBpL2ZvbGRlcnMvIixpZDoidW5rbm93biJ9LHBh
cnNlOmZ1bmN0aW9uKG0pe3RoaXMuZ2V0PQooImZvbGRlciIpLnJlc2V0KG0uZm9sZGVyX2NvbnRl
bnRzKTtyZXR1cm4gbX19KTt2YXIgYj0zREJhY2tib25lLk1vZGVsLmV4dGU9Cm5kKHt1cmxSb290
Oih3aW5kb3cuZ2FsYXh5X2NvbmZpZz9nYWxheHlfY29uZmlnLnJvb3Q6Ii8iKSsiYXBpL2hpc3Rv
cmllcy8ifT0KKTt2YXIgZD0zREJhY2tib25lLkNvbGxlY3Rpb24uZXh0ZW5kKHt1cmxSb290Oih3
aW5kb3cuZ2FsYXh5X2NvbmZpZz9nYWxheHlfPQpjb25maWcucm9vdDoiLyIpKyJhcGkvaGlzdG9y
aWVzLyIsaW5pdGlhbGl6ZTpmdW5jdGlvbihtKXt0aGlzLmlkPTNEbS5pZH0sdXI9Cmw6ZnVuY3Rp
b24oKXtyZXR1cm4gdGhpcy51cmxSb290K3RoaXMuaWQrIi9jb250ZW50cyJ9LG1vZGVsOmJ9KTt2
YXIgaD0zREJhYz0Ka2JvbmUuTW9kZWwuZXh0ZW5kKHt1cmxSb290Oih3aW5kb3cuZ2FsYXh5X2Nv
bmZpZz9nYWxheHlfY29uZmlnLnJvb3Q6Ii8iKSsiPQphcGkvaGlzdG9yaWVzLyJ9KTt2YXIgaz0z
REJhY2tib25lLkNvbGxlY3Rpb24uZXh0ZW5kKHt1cmw6KHdpbmRvdy5nYWxheHlfY289Cm5maWc/
Z2FsYXh5X2NvbmZpZy5yb290OiIvIikrImFwaS9oaXN0b3JpZXMiLG1vZGVsOmh9KTt2YXIgaj0z
REJhY2tib25lLk1vZD0KZWwuZXh0ZW5kKHt1cmxSb290Oih3aW5kb3cuZ2FsYXh5X2NvbmZpZz9n
YWxheHlfY29uZmlnLnJvb3Q6Ii8iKSsiYXBpL3JlbW90PQplX2ZpbGVzIn0pO3JldHVybntMaWJy
YXJ5OmYsRm9sZGVyQXNNb2RlbDphLExpYnJhcmllczppLEl0ZW06ZyxMZGRhOmwsRm9sZGU9CnI6
YyxGb2xkZXJDb250YWluZXI6ZSxIaXN0b3J5SXRlbTpiLEhpc3RvcnlDb250ZW50czpkLEdhbGF4
eUhpc3Rvcnk6aCxHYWxheD0KeUhpc3RvcmllczprLEpzdHJlZTpqfX0pOwpcIE5vIG5ld2xpbmUg
YXQgZW5kIG9mIGZpbGUKCgpodHRwczovL2JpdGJ1Y2tldC5vcmcvZ2FsYXh5L2dhbGF4eS1jZW50
cmFsL2NvbW1pdHMvMWNjZjQwYmRhZmExLwpDaGFuZ2VzZXQ6ICAgMWNjZjQwYmRhZmExCkJyYW5j
aDogICAgICByZWxlYXNlXzE1LjAzClVzZXI6ICAgICAgICBtYXJ0ZW5zb24KRGF0ZTogICAgICAg
IDIwMTUtMDMtMjQgMTk6MTE6NDErMDA6MDAKU3VtbWFyeTogICAgIGFkZCByb290IHByZWZpeCB0
byBhbGwgYWpheCBjYWxscyBpbiBkYXRhIGxpYnJhcmllcwpBZmZlY3RlZCAjOiAgMTIgZmlsZXMK
CmRpZmYgLXIgNDlkNTBiY2U0NjMyMDZmNDQ1MDYzZDJiMjdiMmYyYjM5M2FkYmUxMSAtciAxY2Nm
NDBiZGFmYTE4NGIzYmUzMWFhNz0KYjFlY2RmY2UzYmM3MDVlZmIgY2xpZW50L2dhbGF4eS9zY3Jp
cHRzL212Yy9saWJyYXJ5L2xpYnJhcnktZGF0YXNldC12aWV3LmpzCi0tLSBhL2NsaWVudC9nYWxh
eHkvc2NyaXB0cy9tdmMvbGlicmFyeS9saWJyYXJ5LWRhdGFzZXQtdmlldy5qcworKysgYi9jbGll
bnQvZ2FsYXh5L3NjcmlwdHMvbXZjL2xpYnJhcnkvbGlicmFyeS1kYXRhc2V0LXZpZXcuanMKQEAg
LTExNiw3ICsxMTYsNyBAQAogICB9LAo9MjAKICAgZG93bmxvYWREYXRhc2V0OiBmdW5jdGlvbigp
ewotICAgIHZhciB1cmwgPTNEICcvYXBpL2xpYnJhcmllcy9kYXRhc2V0cy9kb3dubG9hZC91bmNv
bXByZXNzZWQnOworICAgIHZhciB1cmwgPTNEICggd2luZG93LmdhbGF4eV9jb25maWcgPyBnYWxh
eHlfY29uZmlnLnJvb3QgOiAnLycgKSArICdhcGk9Ci9saWJyYXJpZXMvZGF0YXNldHMvZG93bmxv
YWQvdW5jb21wcmVzc2VkJzsKICAgICB2YXIgZGF0YSA9M0QgeydsZF9pZHMnIDogdGhpcy5pZH07
CiAgICAgdGhpcy5wcm9jZXNzRG93bmxvYWQodXJsLCBkYXRhKTsKICAgfSwKQEAgLTIzMiw3ICsy
MzIsNyBAQAo9MjAKICAgICB2YXIgc2VsZiA9M0QgdGhpczsKICAgICBpZiAodGhpcy5vcHRpb25z
LmZldGNoZWRfcGVybWlzc2lvbnMgPTNEPTNEPTNEIHVuZGVmaW5lZCl7Ci0gICAgICAkLmdldCgg
Ii9hcGkvbGlicmFyaWVzL2RhdGFzZXRzLyIgKyBzZWxmLmlkICsgIi9wZXJtaXNzaW9ucz9zY29w
ZT0zRD0KY3VycmVudCIpLmRvbmUoZnVuY3Rpb24oZmV0Y2hlZF9wZXJtaXNzaW9ucykgeworICAg
ICAgJC5nZXQoICggd2luZG93LmdhbGF4eV9jb25maWcgPyBnYWxheHlfY29uZmlnLnJvb3QgOiAn
LycgKSArICJhcGkvbGk9CmJyYXJpZXMvZGF0YXNldHMvIiArIHNlbGYuaWQgKyAiL3Blcm1pc3Np
b25zP3Njb3BlPTNEY3VycmVudCIpLmRvbmUoZnVuY3Rpbz0KbihmZXRjaGVkX3Blcm1pc3Npb25z
KSB7CiAgICAgICAgIHNlbGYucHJlcGFyZVNlbGVjdEJveGVzKHtmZXRjaGVkX3Blcm1pc3Npb25z
OmZldGNoZWRfcGVybWlzc2lvbnMsID0KaXNfYWRtaW46aXNfYWRtaW59KTsKICAgICAgIH0pLmZh
aWwoZnVuY3Rpb24oKXsKICAgICAgICAgICBtb2RfdG9hc3RyLmVycm9yKCdBbiBlcnJvciBvY2N1
cnJlZCB3aGlsZSBhdHRlbXB0aW5nIHRvIGZldGNoIGRhPQp0YXNldCBwZXJtaXNzaW9ucy4nKTsK
QEAgLTI3Myw3ICsyNzMsNyBAQAogICAgICAgICAgICAgICBwbGFjZWhvbGRlcjogJ0NsaWNrIHRv
IHNlbGVjdCBhIHJvbGUnLAogICAgICAgICAgICAgICBjb250YWluZXI6IHNlbGYuJGVsLmZpbmQo
JyNhY2Nlc3NfcGVybScpLAogICAgICAgICAgICAgICBhamF4OiB7Ci0gICAgICAgICAgICAgICAg
ICB1cmw6ICIvYXBpL2xpYnJhcmllcy9kYXRhc2V0cy8iICsgc2VsZi5pZCArICIvcGVybWlzc2lv
bj0Kcz9zY29wZT0zRGF2YWlsYWJsZSIsCisgICAgICAgICAgICAgICAgICB1cmw6ICggd2luZG93
LmdhbGF4eV9jb25maWcgPyBnYWxheHlfY29uZmlnLnJvb3QgOiAnLycgKT0KICsgImFwaS9saWJy
YXJpZXMvZGF0YXNldHMvIiArIHNlbGYuaWQgKyAiL3Blcm1pc3Npb25zP3Njb3BlPTNEYXZhaWxh
YmxlIiwKICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlOiAnanNvbicsCiAgICAgICAgICAgICAg
ICAgICBxdWlldE1pbGxpczogMTAwLAogICAgICAgICAgICAgICAgICAgZGF0YTogZnVuY3Rpb24g
KHRlcm0sIHBhZ2UpIHsgLy8gcGFnZSBpcyB0aGUgb25lLWJhc2VkIHA9CmFnZSBudW1iZXIgdHJh
Y2tlZCBieSBTZWxlY3QyCkBAIC0zMjAsNyArMzIwLDcgQEAKICAgICAgICAgICAgICAgcGxhY2Vo
b2xkZXI6ICdDbGljayB0byBzZWxlY3QgYSByb2xlJywKICAgICAgICAgICAgICAgY29udGFpbmVy
OiBzZWxmLiRlbC5maW5kKCcjbW9kaWZ5X3Blcm0nKSwKICAgICAgICAgICAgICAgYWpheDogewot
ICAgICAgICAgICAgICAgICAgdXJsOiAiL2FwaS9saWJyYXJpZXMvZGF0YXNldHMvIiArIHNlbGYu
aWQgKyAiL3Blcm1pc3Npb249CnM/c2NvcGU9M0RhdmFpbGFibGUiLAorICAgICAgICAgICAgICAg
ICAgdXJsOiAoIHdpbmRvdy5nYWxheHlfY29uZmlnID8gZ2FsYXh5X2NvbmZpZy5yb290IDogJy8n
ICk9CiArICJhcGkvbGlicmFyaWVzL2RhdGFzZXRzLyIgKyBzZWxmLmlkICsgIi9wZXJtaXNzaW9u
cz9zY29wZT0zRGF2YWlsYWJsZSIsCiAgICAgICAgICAgICAgICAgICBkYXRhVHlwZTogJ2pzb24n
LAogICAgICAgICAgICAgICAgICAgcXVpZXRNaWxsaXM6IDEwMCwKICAgICAgICAgICAgICAgICAg
IGRhdGE6IGZ1bmN0aW9uICh0ZXJtLCBwYWdlKSB7IC8vIHBhZ2UgaXMgdGhlIG9uZS1iYXNlZCBw
PQphZ2UgbnVtYmVyIHRyYWNrZWQgYnkgU2VsZWN0MgpAQCAtMzY3LDcgKzM2Nyw3IEBACiAgICAg
ICAgICAgICAgIHBsYWNlaG9sZGVyOiAnQ2xpY2sgdG8gc2VsZWN0IGEgcm9sZScsCiAgICAgICAg
ICAgICAgIGNvbnRhaW5lcjogc2VsZi4kZWwuZmluZCgnI21hbmFnZV9wZXJtJyksCiAgICAgICAg
ICAgICAgIGFqYXg6IHsKLSAgICAgICAgICAgICAgICAgIHVybDogIi9hcGkvbGlicmFyaWVzL2Rh
dGFzZXRzLyIgKyBzZWxmLmlkICsgIi9wZXJtaXNzaW9uPQpzP3Njb3BlPTNEYXZhaWxhYmxlIiwK
KyAgICAgICAgICAgICAgICAgIHVybDogKCB3aW5kb3cuZ2FsYXh5X2NvbmZpZyA/IGdhbGF4eV9j
b25maWcucm9vdCA6ICcvJyApPQogKyAiYXBpL2xpYnJhcmllcy9kYXRhc2V0cy8iICsgc2VsZi5p
ZCArICIvcGVybWlzc2lvbnM/c2NvcGU9M0RhdmFpbGFibGUiLAogICAgICAgICAgICAgICAgICAg
ZGF0YVR5cGU6ICdqc29uJywKICAgICAgICAgICAgICAgICAgIHF1aWV0TWlsbGlzOiAxMDAsCiAg
ICAgICAgICAgICAgICAgICBkYXRhOiBmdW5jdGlvbiAodGVybSwgcGFnZSkgeyAvLyBwYWdlIGlz
IHRoZSBvbmUtYmFzZWQgcD0KYWdlIG51bWJlciB0cmFja2VkIGJ5IFNlbGVjdDIKQEAgLTQxMyw3
ICs0MTMsNyBAQAogICAgICAgICAgICAgc2VsZi5tYW5hZ2VTZWxlY3RPYmplY3QgPTNEIG5ldyBt
b2Rfc2VsZWN0LlZpZXcobWFuYWdlX3NlbGVjdF89Cm9wdGlvbnMpOwogICAgICAgICB9IGVsc2Ug
eyAvLyBOb24tYWRtaW5zIGhhdmUgc2VsZWN0IHdpdGggcHJlLWxvYWRlZCBvcHRpb25zCiAgICAg
ICAgICAgICB2YXIgdGVtcGxhdGUgPTNEIHNlbGYudGVtcGxhdGVBY2Nlc3NTZWxlY3QoKTsKLSAg
ICAgICAgICAgICQuZ2V0KCAiL2FwaS9saWJyYXJpZXMvZGF0YXNldHMvIiArIHNlbGYuaWQgKyAi
L3Blcm1pc3Npb25zP3NjPQpvcGU9M0RhdmFpbGFibGUiLCBmdW5jdGlvbiggZGF0YSApIHsKKyAg
ICAgICAgICAgICQuZ2V0KCAoIHdpbmRvdy5nYWxheHlfY29uZmlnID8gZ2FsYXh5X2NvbmZpZy5y
b290IDogJy8nICkgKyAiPQphcGkvbGlicmFyaWVzL2RhdGFzZXRzLyIgKyBzZWxmLmlkICsgIi9w
ZXJtaXNzaW9ucz9zY29wZT0zRGF2YWlsYWJsZSIsIGZ1bmM9CnRpb24oIGRhdGEgKSB7CiAgICAg
ICAgICAgICAgICAgJCgnLmFjY2Vzc19wZXJtJykuaHRtbCh0ZW1wbGF0ZSh7b3B0aW9uczpkYXRh
LnJvbGVzfSkpOwogICAgICAgICAgICAgICAgIHNlbGYuYWNjZXNzU2VsZWN0T2JqZWN0ID0zRCAk
KCcjYWNjZXNzX3NlbGVjdCcpLnNlbGVjdDIoKTsKICAgICAgICAgICAgIH0pLmZhaWwoZnVuY3Rp
b24oKSB7CkBAIC00MzYsNyArNDM2LDcgQEAKPTIwCiAgIG1ha2VEYXRhc2V0UHJpdmF0ZTogZnVu
Y3Rpb24oKXsKICAgICB2YXIgc2VsZiA9M0QgdGhpczsKLSAgICAkLnBvc3QoIi9hcGkvbGlicmFy
aWVzL2RhdGFzZXRzLyIgKyBzZWxmLmlkICsgIi9wZXJtaXNzaW9ucz9hY3Rpb249M0RtPQpha2Vf
cHJpdmF0ZSIpLmRvbmUoZnVuY3Rpb24oZmV0Y2hlZF9wZXJtaXNzaW9ucykgeworICAgICQucG9z
dCggKCB3aW5kb3cuZ2FsYXh5X2NvbmZpZyA/IGdhbGF4eV9jb25maWcucm9vdCA6ICcvJyApICsg
ImFwaS9saWI9CnJhcmllcy9kYXRhc2V0cy8iICsgc2VsZi5pZCArICIvcGVybWlzc2lvbnM/YWN0
aW9uPTNEbWFrZV9wcml2YXRlIikuZG9uZShmdT0KbmN0aW9uKGZldGNoZWRfcGVybWlzc2lvbnMp
IHsKICAgICAgIHNlbGYubW9kZWwuc2V0KHtpc191bnJlc3RyaWN0ZWQ6ZmFsc2V9KTsKICAgICAg
IHNlbGYuc2hvd1Blcm1pc3Npb25zKHtmZXRjaGVkX3Blcm1pc3Npb25zOmZldGNoZWRfcGVybWlz
c2lvbnN9KQogICAgICAgbW9kX3RvYXN0ci5zdWNjZXNzKCdUaGUgZGF0YXNldCBpcyBub3cgcHJp
dmF0ZSB0byB5b3UuJyk7CkBAIC00NDcsNyArNDQ3LDcgQEAKPTIwCiAgIHJlbW92ZURhdGFzZXRS
ZXN0cmljdGlvbnM6IGZ1bmN0aW9uKCl7CiAgICAgdmFyIHNlbGYgPTNEIHRoaXM7Ci0gICAgJC5w
b3N0KCIvYXBpL2xpYnJhcmllcy9kYXRhc2V0cy8iICsgc2VsZi5pZCArICIvcGVybWlzc2lvbnM/
YWN0aW9uPTNEcj0KZW1vdmVfcmVzdHJpY3Rpb25zIikKKyAgICAkLnBvc3QoICggd2luZG93Lmdh
bGF4eV9jb25maWcgPyBnYWxheHlfY29uZmlnLnJvb3QgOiAnLycgKSArICJhcGkvbGliPQpyYXJp
ZXMvZGF0YXNldHMvIiArIHNlbGYuaWQgKyAiL3Blcm1pc3Npb25zP2FjdGlvbj0zRHJlbW92ZV9y
ZXN0cmljdGlvbnMiKQogICAgIC5kb25lKGZ1bmN0aW9uKGZldGNoZWRfcGVybWlzc2lvbnMpIHsK
ICAgICAgIHNlbGYubW9kZWwuc2V0KHtpc191bnJlc3RyaWN0ZWQ6dHJ1ZX0pOwogICAgICAgc2Vs
Zi5zaG93UGVybWlzc2lvbnMoe2ZldGNoZWRfcGVybWlzc2lvbnM6ZmV0Y2hlZF9wZXJtaXNzaW9u
c30pCkBAIC00NzgsNyArNDc4LDcgQEAKICAgICAgIG1vZGlmeV9pZHMucHVzaChtb2RpZnlfcm9s
ZXNbaV0uaWQpOwogICAgIH07Cj0yMAotICAgICQucG9zdCgiL2FwaS9saWJyYXJpZXMvZGF0YXNl
dHMvIiArIHNlbGYuaWQgKyAiL3Blcm1pc3Npb25zP2FjdGlvbj0zRHM9CmV0X3Blcm1pc3Npb25z
IiwgeyAnYWNjZXNzX2lkc1tdJzogYWNjZXNzX2lkcywgJ21hbmFnZV9pZHNbXSc6IG1hbmFnZV9p
ZHMsID0KJ21vZGlmeV9pZHNbXSc6IG1vZGlmeV9pZHMsIH0gKQorICAgICQucG9zdCggKCB3aW5k
b3cuZ2FsYXh5X2NvbmZpZyA/IGdhbGF4eV9jb25maWcucm9vdCA6ICcvJyApICsgImFwaS9saWI9
CnJhcmllcy9kYXRhc2V0cy8iICsgc2VsZi5pZCArICIvcGVybWlzc2lvbnM/YWN0aW9uPTNEc2V0
X3Blcm1pc3Npb25zIiwgeyAnYT0KY2Nlc3NfaWRzW10nOiBhY2Nlc3NfaWRzLCAnbWFuYWdlX2lk
c1tdJzogbWFuYWdlX2lkcywgJ21vZGlmeV9pZHNbXSc6IG1vZGlmPQp5X2lkcywgfSApCiAgICAg
LmRvbmUoZnVuY3Rpb24oZmV0Y2hlZF9wZXJtaXNzaW9ucyl7CiAgICAgICAvL2ZldGNoIGRhdGFz
ZXQgYWdhaW4KICAgICAgIHNlbGYuc2hvd1Blcm1pc3Npb25zKHtmZXRjaGVkX3Blcm1pc3Npb25z
OmZldGNoZWRfcGVybWlzc2lvbnN9KQoKZGlmZiAtciA0OWQ1MGJjZTQ2MzIwNmY0NDUwNjNkMmIy
N2IyZjJiMzkzYWRiZTExIC1yIDFjY2Y0MGJkYWZhMTg0YjNiZTMxYWE3PQpiMWVjZGZjZTNiYzcw
NWVmYiBjbGllbnQvZ2FsYXh5L3NjcmlwdHMvbXZjL2xpYnJhcnkvbGlicmFyeS1mb2xkZXItdmll
dy5qcwotLS0gYS9jbGllbnQvZ2FsYXh5L3NjcmlwdHMvbXZjL2xpYnJhcnkvbGlicmFyeS1mb2xk
ZXItdmlldy5qcworKysgYi9jbGllbnQvZ2FsYXh5L3NjcmlwdHMvbXZjL2xpYnJhcnkvbGlicmFy
eS1mb2xkZXItdmlldy5qcwpAQCAtODEsNyArODEsNyBAQAo9MjAKICAgICB2YXIgc2VsZiA9M0Qg
dGhpczsKICAgICBpZiAodGhpcy5vcHRpb25zLmZldGNoZWRfcGVybWlzc2lvbnMgPTNEPTNEPTNE
IHVuZGVmaW5lZCl7Ci0gICAgICAkLmdldCggIi9hcGkvZm9sZGVycy8iICsgc2VsZi5pZCArICIv
cGVybWlzc2lvbnM/c2NvcGU9M0RjdXJyZW50IikuZD0Kb25lKGZ1bmN0aW9uKGZldGNoZWRfcGVy
bWlzc2lvbnMpIHsKKyAgICAgICQuZ2V0KCAoIHdpbmRvdy5nYWxheHlfY29uZmlnID8gZ2FsYXh5
X2NvbmZpZy5yb290IDogJy8nICkgKyAiYXBpL2ZvPQpsZGVycy8iICsgc2VsZi5pZCArICIvcGVy
bWlzc2lvbnM/c2NvcGU9M0RjdXJyZW50IikuZG9uZShmdW5jdGlvbihmZXRjaGVkX3A9CmVybWlz
c2lvbnMpIHsKICAgICAgICAgc2VsZi5wcmVwYXJlU2VsZWN0Qm94ZXMoe2ZldGNoZWRfcGVybWlz
c2lvbnM6ZmV0Y2hlZF9wZXJtaXNzaW9uc30pOwogICAgICAgfSkuZmFpbChmdW5jdGlvbigpewog
ICAgICAgICAgIG1vZF90b2FzdHIuZXJyb3IoJ0FuIGVycm9yIG9jY3VycmVkIHdoaWxlIGF0dGVt
cHRpbmcgdG8gZmV0Y2ggZm89CmxkZXIgcGVybWlzc2lvbnMuJyk7CkBAIC0xMjUsNyArMTI1LDcg
QEAKICAgICAgIHBsYWNlaG9sZGVyOiAnQ2xpY2sgdG8gc2VsZWN0IGEgcm9sZScsCiAgICAgICBj
b250YWluZXI6IHNlbGYuJGVsLmZpbmQoJyMnICsgaWQpLAogICAgICAgYWpheDogewotICAgICAg
ICAgIHVybDogIi9hcGkvZm9sZGVycy8iICsgc2VsZi5pZCArICIvcGVybWlzc2lvbnM/c2NvcGU9
M0RhdmFpbGFibGU9CiIsCisgICAgICAgICAgdXJsOiAoIHdpbmRvdy5nYWxheHlfY29uZmlnID8g
Z2FsYXh5X2NvbmZpZy5yb290IDogJy8nICkgKyAiYXBpLz0KZm9sZGVycy8iICsgc2VsZi5pZCAr
ICIvcGVybWlzc2lvbnM/c2NvcGU9M0RhdmFpbGFibGUiLAogICAgICAgICAgIGRhdGFUeXBlOiAn
anNvbicsCiAgICAgICAgICAgcXVpZXRNaWxsaXM6IDEwMCwKICAgICAgICAgICBkYXRhOiBmdW5j
dGlvbiAodGVybSwgcGFnZSkgeyAvLyBwYWdlIGlzIHRoZSBvbmUtYmFzZWQgcGFnZSBudW1iPQpl
ciB0cmFja2VkIGJ5IFNlbGVjdDIKQEAgLTE5NSw3ICsxOTUsNyBAQAogICAgIHZhciBtYW5hZ2Vf
aWRzID0zRCB0aGlzLl9leHRyYWN0SWRzKHRoaXMubWFuYWdlU2VsZWN0T2JqZWN0LiRlbC5zZWxl
Y3Q9CjIoJ2RhdGEnKSk7CiAgICAgdmFyIG1vZGlmeV9pZHMgPTNEIHRoaXMuX2V4dHJhY3RJZHMo
dGhpcy5tb2RpZnlTZWxlY3RPYmplY3QuJGVsLnNlbGVjdD0KMignZGF0YScpKTsKPTIwCi0gICAg
JC5wb3N0KCIvYXBpL2ZvbGRlcnMvIiArIHNlbGYuaWQgKyAiL3Blcm1pc3Npb25zP2FjdGlvbj0z
RHNldF9wZXJtaXNzaT0Kb25zIiwgeyAnYWRkX2lkc1tdJzogYWRkX2lkcywgJ21hbmFnZV9pZHNb
XSc6IG1hbmFnZV9pZHMsICdtb2RpZnlfaWRzW10nOiBtPQpvZGlmeV9pZHMsIH0gKQorICAgICQu
cG9zdCggKCB3aW5kb3cuZ2FsYXh5X2NvbmZpZyA/IGdhbGF4eV9jb25maWcucm9vdCA6ICcvJyAp
ICsgImFwaS9mb2w9CmRlcnMvIiArIHNlbGYuaWQgKyAiL3Blcm1pc3Npb25zP2FjdGlvbj0zRHNl
dF9wZXJtaXNzaW9ucyIsIHsgJ2FkZF9pZHNbXSc6ID0KYWRkX2lkcywgJ21hbmFnZV9pZHNbXSc6
IG1hbmFnZV9pZHMsICdtb2RpZnlfaWRzW10nOiBtb2RpZnlfaWRzLCB9ICkKICAgICAuZG9uZShm
dW5jdGlvbihmZXRjaGVkX3Blcm1pc3Npb25zKXsKICAgICAgIC8vZmV0Y2ggZGF0YXNldCBhZ2Fp
bgogICAgICAgc2VsZi5zaG93UGVybWlzc2lvbnMoe2ZldGNoZWRfcGVybWlzc2lvbnM6ZmV0Y2hl
ZF9wZXJtaXNzaW9uc30pCgpkaWZmIC1yIDQ5ZDUwYmNlNDYzMjA2ZjQ0NTA2M2QyYjI3YjJmMmIz
OTNhZGJlMTEgLXIgMWNjZjQwYmRhZmExODRiM2JlMzFhYTc9CmIxZWNkZmNlM2JjNzA1ZWZiIGNs
aWVudC9nYWxheHkvc2NyaXB0cy9tdmMvbGlicmFyeS9saWJyYXJ5LWZvbGRlcnRvb2xiYXItdj0K
aWV3LmpzCi0tLSBhL2NsaWVudC9nYWxheHkvc2NyaXB0cy9tdmMvbGlicmFyeS9saWJyYXJ5LWZv
bGRlcnRvb2xiYXItdmlldy5qcworKysgYi9jbGllbnQvZ2FsYXh5L3NjcmlwdHMvbXZjL2xpYnJh
cnkvbGlicmFyeS1mb2xkZXJ0b29sYmFyLXZpZXcuanMKQEAgLTI5NCw3ICsyOTQsNyBAQAogICAg
ICAgICAgICAgICAgIGRhdGFzZXRfaWRzLnB1c2goIHRoaXMucGFyZW50RWxlbWVudC5wYXJlbnRF
bGVtZW50LmlkICk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gKTsKLSAgICB2YXIgdXJsID0z
RCAnL2FwaS9saWJyYXJpZXMvZGF0YXNldHMvZG93bmxvYWQvJyArIGZvcm1hdDsKKyAgICB2YXIg
dXJsID0zRCAoIHdpbmRvdy5nYWxheHlfY29uZmlnID8gZ2FsYXh5X2NvbmZpZy5yb290IDogJy8n
ICkgKyAnYXBpPQovbGlicmFyaWVzL2RhdGFzZXRzL2Rvd25sb2FkLycgKyBmb3JtYXQ7CiAgICAg
dmFyIGRhdGEgPTNEIHsgJ2xkX2lkcycgOiBkYXRhc2V0X2lkcyB9OwogICAgIHRoaXMucHJvY2Vz
c0Rvd25sb2FkKCB1cmwsIGRhdGEsICdnZXQnICk7CiAgIH0sCkBAIC0zODYsNyArMzg2LDcgQEAK
ICAgZmV0Y2hFeHRBbmRHZW5vbWVzOiBmdW5jdGlvbigpewogICAgIHZhciB0aGF0ID0zRCB0aGlz
OwogICAgIG1vZF91dGlscy5nZXQoewotICAgICAgICB1cmwgICAgICA6ICBnYWxheHlfY29uZmln
LnJvb3QgKyAiYXBpL2RhdGF0eXBlcz9leHRlbnNpb25fb25seT0zREY9CmFsc2UiLAorICAgICAg
ICB1cmwgICAgICA6ICAoIHdpbmRvdy5nYWxheHlfY29uZmlnID8gZ2FsYXh5X2NvbmZpZy5yb290
IDogJy8nICkgKyA9CiJhcGkvZGF0YXR5cGVzP2V4dGVuc2lvbl9vbmx5PTNERmFsc2UiLAogICAg
ICAgICBzdWNjZXNzICA6ICBmdW5jdGlvbiggZGF0YXR5cGVzICkgewogICAgICAgICAgICAgICAg
ICAgICAgICAgZm9yIChrZXkgaW4gZGF0YXR5cGVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgdGhhdC5saXN0X2V4dGVuc2lvbnMucHVzaCh7CkBAIC00MDMsNyArNDAzLDcgQEAKICAg
ICAgICAgICAgICAgICAgICAgfQogICAgICAgfSk7CiAgICAgbW9kX3V0aWxzLmdldCh7Ci0gICAg
ICAgIHVybDogICAgZ2FsYXh5X2NvbmZpZy5yb290ICsgImFwaS9nZW5vbWVzIiwKKyAgICAgICAg
dXJsOiAgICAoIHdpbmRvdy5nYWxheHlfY29uZmlnID8gZ2FsYXh5X2NvbmZpZy5yb290IDogJy8n
ICkgKyAiYXBpPQovZ2Vub21lcyIsCiAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKCBnZW5vbWVz
ICkgewogICAgICAgICAgICAgICAgICAgICBmb3IgKCBrZXkgaW4gZ2Vub21lcyApIHsKICAgICAg
ICAgICAgICAgICAgICAgICAgIHRoYXQubGlzdF9nZW5vbWVzLnB1c2goewpAQCAtNjg5LDcgKzY4
OSw3IEBACiAgICAgICBmb3IgKCB2YXIgaSA9M0QgaGlzdG9yeV9kYXRhc2V0X2lkcy5sZW5ndGgg
LSAxOyBpID49M0QgMDsgaS0tICkgewogICAgICAgICBoaXN0b3J5X2RhdGFzZXRfaWQgPTNEIGhp
c3RvcnlfZGF0YXNldF9pZHNbaV07CiAgICAgICAgIHZhciBmb2xkZXJfaXRlbSA9M0QgbmV3IG1v
ZF9saWJyYXJ5X21vZGVsLkl0ZW0oKTsKLSAgICAgICAgZm9sZGVyX2l0ZW0udXJsID0zRCAnL2Fw
aS9mb2xkZXJzLycgKyB0aGlzLm9wdGlvbnMuaWQgKyAnL2NvbnRlbnRzPQonOworICAgICAgICBm
b2xkZXJfaXRlbS51cmwgPTNEICggd2luZG93LmdhbGF4eV9jb25maWcgPyBnYWxheHlfY29uZmln
LnJvb3QgOiA9CicvJyApICsgJ2FwaS9mb2xkZXJzLycgKyB0aGlzLm9wdGlvbnMuaWQgKyAnL2Nv
bnRlbnRzJzsKICAgICAgICAgZm9sZGVyX2l0ZW0uc2V0KCB7ICdmcm9tX2hkYV9pZCc6aGlzdG9y
eV9kYXRhc2V0X2lkIH0gKTsKICAgICAgICAgaGRhc190b19hZGQucHVzaCggZm9sZGVyX2l0ZW0g
KTsKICAgICAgIH0KQEAgLTc0OSw3ICs3NDksNyBAQAogICAgICAgfQogICAgICAgcmV0dXJuIHRy
dWU7CiAgICAgfQotICAgIHZhciBwcm9taXNlID0zRCAkLndoZW4oICQucG9zdCggJy9hcGkvbGli
cmFyaWVzL2RhdGFzZXRzP2VuY29kZWRfZm9sZGU9CnJfaWQ9M0QnICsgdGhhdC5pZCArPTIwCisg
ICAgdmFyIHByb21pc2UgPTNEICQud2hlbiggJC5wb3N0KCAoIHdpbmRvdy5nYWxheHlfY29uZmln
ID8gZ2FsYXh5X2NvbmZpZz0KLnJvb3QgOiAnLycgKSArICdhcGkvbGlicmFyaWVzL2RhdGFzZXRz
P2VuY29kZWRfZm9sZGVyX2lkPTNEJyArIHRoYXQuaWQgKz0yMAogICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcmc291cmNlPTNEJyArIG9wdGk9
Cm9ucy5zb3VyY2UgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICcmcGF0aD0zRCcgKyBwb3BwZWQ9Cl9pdGVtICsKICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJmZpbGVfdHlwZT0zRCcg
KyBvPQpwdGlvbnMuZmlsZV90eXBlICsKQEAgLTc4OCw3ICs3ODgsNyBAQAogICAgICAgfQogICAg
ICAgcmV0dXJuIHRydWU7CiAgICAgfQotICAgIHZhciBwcm9taXNlID0zRCAkLndoZW4oICQucG9z
dCggJy9hcGkvbGlicmFyaWVzL2RhdGFzZXRzP2VuY29kZWRfZm9sZGU9CnJfaWQ9M0QnICsgdGhh
dC5pZCArCisgICAgdmFyIHByb21pc2UgPTNEICQud2hlbiggJC5wb3N0KCAoIHdpbmRvdy5nYWxh
eHlfY29uZmlnID8gZ2FsYXh5X2NvbmZpZz0KLnJvb3QgOiAnLycgKSArICdhcGkvbGlicmFyaWVz
L2RhdGFzZXRzP2VuY29kZWRfZm9sZGVyX2lkPTNEJyArIHRoYXQuaWQgKwogICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcmc291cmNlPTNE
JyArIG89CnB0aW9ucy5zb3VyY2UgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICcmcGF0aD0zRCcgKyBwb3A9CnBlZF9pdGVtICsKICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAn
JnByZXNlcnZlX2RpcnM9Cj0zRCcgKyBvcHRpb25zLnByZXNlcnZlX2RpcnMgKwoKZGlmZiAtciA0
OWQ1MGJjZTQ2MzIwNmY0NDUwNjNkMmIyN2IyZjJiMzkzYWRiZTExIC1yIDFjY2Y0MGJkYWZhMTg0
YjNiZTMxYWE3PQpiMWVjZGZjZTNiYzcwNWVmYiBjbGllbnQvZ2FsYXh5L3NjcmlwdHMvbXZjL2xp
YnJhcnkvbGlicmFyeS1saWJyYXJ5LXZpZXcuanMKLS0tIGEvY2xpZW50L2dhbGF4eS9zY3JpcHRz
L212Yy9saWJyYXJ5L2xpYnJhcnktbGlicmFyeS12aWV3LmpzCisrKyBiL2NsaWVudC9nYWxheHkv
c2NyaXB0cy9tdmMvbGlicmFyeS9saWJyYXJ5LWxpYnJhcnktdmlldy5qcwpAQCAtODcsNyArODcs
NyBAQAo9MjAKICAgICB2YXIgc2VsZiA9M0QgdGhpczsKICAgICBpZiAodGhpcy5vcHRpb25zLmZl
dGNoZWRfcGVybWlzc2lvbnMgPTNEPTNEPTNEIHVuZGVmaW5lZCl7Ci0gICAgICAkLmdldCggIi9h
cGkvbGlicmFyaWVzLyIgKyBzZWxmLmlkICsgIi9wZXJtaXNzaW9ucz9zY29wZT0zRGN1cnJlbnQi
KT0KLmRvbmUoZnVuY3Rpb24oZmV0Y2hlZF9wZXJtaXNzaW9ucykgeworICAgICAgJC5nZXQoICgg
d2luZG93LmdhbGF4eV9jb25maWcgPyBnYWxheHlfY29uZmlnLnJvb3QgOiAnLycgKSArICJhcGkv
bGk9CmJyYXJpZXMvIiArIHNlbGYuaWQgKyAiL3Blcm1pc3Npb25zP3Njb3BlPTNEY3VycmVudCIp
LmRvbmUoZnVuY3Rpb24oZmV0Y2hlZD0KX3Blcm1pc3Npb25zKSB7CiAgICAgICAgIHNlbGYucHJl
cGFyZVNlbGVjdEJveGVzKHtmZXRjaGVkX3Blcm1pc3Npb25zOmZldGNoZWRfcGVybWlzc2lvbnN9
KTsKICAgICAgIH0pLmZhaWwoZnVuY3Rpb24oKXsKICAgICAgICAgICBtb2RfdG9hc3RyLmVycm9y
KCdBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBhdHRlbXB0aW5nIHRvIGZldGNoIGxpPQpicmFyeSBw
ZXJtaXNzaW9ucy4nKTsKQEAgLTEzNCw3ICsxMzQsNyBAQAogICAgICAgcGxhY2Vob2xkZXI6ICdD
bGljayB0byBzZWxlY3QgYSByb2xlJywKICAgICAgIGNvbnRhaW5lcjogc2VsZi4kZWwuZmluZCgn
IycgKyBpZCksCiAgICAgICBhamF4OiB7Ci0gICAgICAgICAgdXJsOiAiL2FwaS9saWJyYXJpZXMv
IiArIHNlbGYuaWQgKyAiL3Blcm1pc3Npb25zP3Njb3BlPTNEYXZhaWxhYj0KbGUmaXNfbGlicmFy
eV9hY2Nlc3M9M0QiICsgaXNfbGlicmFyeV9hY2Nlc3MsCisgICAgICAgICAgdXJsOiAoIHdpbmRv
dy5nYWxheHlfY29uZmlnID8gZ2FsYXh5X2NvbmZpZy5yb290IDogJy8nICkgKyAiYXBpLz0KbGli
cmFyaWVzLyIgKyBzZWxmLmlkICsgIi9wZXJtaXNzaW9ucz9zY29wZT0zRGF2YWlsYWJsZSZpc19s
aWJyYXJ5X2FjY2Vzcz0KPTNEIiArIGlzX2xpYnJhcnlfYWNjZXNzLAogICAgICAgICAgIGRhdGFU
eXBlOiAnanNvbicsCiAgICAgICAgICAgcXVpZXRNaWxsaXM6IDEwMCwKICAgICAgICAgICBkYXRh
OiBmdW5jdGlvbiAodGVybSwgcGFnZSkgeyAvLyBwYWdlIGlzIHRoZSBvbmUtYmFzZWQgcGFnZSBu
dW1iPQplciB0cmFja2VkIGJ5IFNlbGVjdDIKQEAgLTE5Myw3ICsxOTMsNyBAQAo9MjAKICAgbWFr
ZURhdGFzZXRQcml2YXRlOiBmdW5jdGlvbigpewogICAgIHZhciBzZWxmID0zRCB0aGlzOwotICAg
ICQucG9zdCgiL2FwaS9saWJyYXJpZXMvZGF0YXNldHMvIiArIHNlbGYuaWQgKyAiL3Blcm1pc3Np
b25zP2FjdGlvbj0zRG09CmFrZV9wcml2YXRlIikuZG9uZShmdW5jdGlvbihmZXRjaGVkX3Blcm1p
c3Npb25zKSB7CisgICAgJC5wb3N0KCAoIHdpbmRvdy5nYWxheHlfY29uZmlnID8gZ2FsYXh5X2Nv
bmZpZy5yb290IDogJy8nICkgKyAiYXBpL2xpYj0KcmFyaWVzL2RhdGFzZXRzLyIgKyBzZWxmLmlk
ICsgIi9wZXJtaXNzaW9ucz9hY3Rpb249M0RtYWtlX3ByaXZhdGUiKS5kb25lKGZ1PQpuY3Rpb24o
ZmV0Y2hlZF9wZXJtaXNzaW9ucykgewogICAgICAgc2VsZi5tb2RlbC5zZXQoe2lzX3VucmVzdHJp
Y3RlZDpmYWxzZX0pOwogICAgICAgc2VsZi5zaG93UGVybWlzc2lvbnMoe2ZldGNoZWRfcGVybWlz
c2lvbnM6ZmV0Y2hlZF9wZXJtaXNzaW9uc30pCiAgICAgICBtb2RfdG9hc3RyLnN1Y2Nlc3MoJ1Ro
ZSBkYXRhc2V0IGlzIG5vdyBwcml2YXRlIHRvIHlvdS4nKTsKQEAgLTIwNCw3ICsyMDQsNyBAQAo9
MjAKICAgcmVtb3ZlRGF0YXNldFJlc3RyaWN0aW9uczogZnVuY3Rpb24oKXsKICAgICB2YXIgc2Vs
ZiA9M0QgdGhpczsKLSAgICAkLnBvc3QoIi9hcGkvbGlicmFyaWVzL2RhdGFzZXRzLyIgKyBzZWxm
LmlkICsgIi9wZXJtaXNzaW9ucz9hY3Rpb249M0RyPQplbW92ZV9yZXN0cmljdGlvbnMiKQorICAg
ICQucG9zdCggKCB3aW5kb3cuZ2FsYXh5X2NvbmZpZyA/IGdhbGF4eV9jb25maWcucm9vdCA6ICcv
JyApICsgImFwaS9saWI9CnJhcmllcy9kYXRhc2V0cy8iICsgc2VsZi5pZCArICIvcGVybWlzc2lv
bnM/YWN0aW9uPTNEcmVtb3ZlX3Jlc3RyaWN0aW9ucyIpCiAgICAgLmRvbmUoZnVuY3Rpb24oZmV0
Y2hlZF9wZXJtaXNzaW9ucykgewogICAgICAgc2VsZi5tb2RlbC5zZXQoe2lzX3VucmVzdHJpY3Rl
ZDp0cnVlfSk7CiAgICAgICBzZWxmLnNob3dQZXJtaXNzaW9ucyh7ZmV0Y2hlZF9wZXJtaXNzaW9u
czpmZXRjaGVkX3Blcm1pc3Npb25zfSkKQEAgLTIzMCw3ICsyMzAsNyBAQAogICAgIHZhciBtYW5h
Z2VfaWRzID0zRCB0aGlzLl9leHRyYWN0SWRzKHRoaXMubWFuYWdlU2VsZWN0T2JqZWN0LiRlbC5z
ZWxlY3Q9CjIoJ2RhdGEnKSk7CiAgICAgdmFyIG1vZGlmeV9pZHMgPTNEIHRoaXMuX2V4dHJhY3RJ
ZHModGhpcy5tb2RpZnlTZWxlY3RPYmplY3QuJGVsLnNlbGVjdD0KMignZGF0YScpKTsKPTIwCi0g
ICAgJC5wb3N0KCIvYXBpL2xpYnJhcmllcy8iICsgc2VsZi5pZCArICIvcGVybWlzc2lvbnM/YWN0
aW9uPTNEc2V0X3Blcm1pcz0Kc2lvbnMiLCB7ICdhY2Nlc3NfaWRzW10nOiBhY2Nlc3NfaWRzLCAn
YWRkX2lkc1tdJzogYWRkX2lkcywgJ21hbmFnZV9pZHNbXSc6PQogbWFuYWdlX2lkcywgJ21vZGlm
eV9pZHNbXSc6IG1vZGlmeV9pZHMsIH0gKQorICAgICQucG9zdCggKCB3aW5kb3cuZ2FsYXh5X2Nv
bmZpZyA/IGdhbGF4eV9jb25maWcucm9vdCA6ICcvJyApICsgImFwaS9saWI9CnJhcmllcy8iICsg
c2VsZi5pZCArICIvcGVybWlzc2lvbnM/YWN0aW9uPTNEc2V0X3Blcm1pc3Npb25zIiwgeyAnYWNj
ZXNzX2lkcz0KW10nOiBhY2Nlc3NfaWRzLCAnYWRkX2lkc1tdJzogYWRkX2lkcywgJ21hbmFnZV9p
ZHNbXSc6IG1hbmFnZV9pZHMsICdtb2RpZnlfPQppZHNbXSc6IG1vZGlmeV9pZHMsIH0gKQogICAg
IC5kb25lKGZ1bmN0aW9uKGZldGNoZWRfcGVybWlzc2lvbnMpewogICAgICAgLy9mZXRjaCBkYXRh
c2V0IGFnYWluCiAgICAgICBzZWxmLnNob3dQZXJtaXNzaW9ucyh7ZmV0Y2hlZF9wZXJtaXNzaW9u
czpmZXRjaGVkX3Blcm1pc3Npb25zfSkKCmRpZmYgLXIgNDlkNTBiY2U0NjMyMDZmNDQ1MDYzZDJi
MjdiMmYyYjM5M2FkYmUxMSAtciAxY2NmNDBiZGFmYTE4NGIzYmUzMWFhNz0KYjFlY2RmY2UzYmM3
MDVlZmIgc3RhdGljL3NjcmlwdHMvbXZjL2xpYnJhcnkvbGlicmFyeS1kYXRhc2V0LXZpZXcuanMK
LS0tIGEvc3RhdGljL3NjcmlwdHMvbXZjL2xpYnJhcnkvbGlicmFyeS1kYXRhc2V0LXZpZXcuanMK
KysrIGIvc3RhdGljL3NjcmlwdHMvbXZjL2xpYnJhcnkvbGlicmFyeS1kYXRhc2V0LXZpZXcuanMK
QEAgLTExNiw3ICsxMTYsNyBAQAogICB9LAo9MjAKICAgZG93bmxvYWREYXRhc2V0OiBmdW5jdGlv
bigpewotICAgIHZhciB1cmwgPTNEICcvYXBpL2xpYnJhcmllcy9kYXRhc2V0cy9kb3dubG9hZC91
bmNvbXByZXNzZWQnOworICAgIHZhciB1cmwgPTNEICggd2luZG93LmdhbGF4eV9jb25maWcgPyBn
YWxheHlfY29uZmlnLnJvb3QgOiAnLycgKSArICdhcGk9Ci9saWJyYXJpZXMvZGF0YXNldHMvZG93
bmxvYWQvdW5jb21wcmVzc2VkJzsKICAgICB2YXIgZGF0YSA9M0QgeydsZF9pZHMnIDogdGhpcy5p
ZH07CiAgICAgdGhpcy5wcm9jZXNzRG93bmxvYWQodXJsLCBkYXRhKTsKICAgfSwKQEAgLTIzMiw3
ICsyMzIsNyBAQAo9MjAKICAgICB2YXIgc2VsZiA9M0QgdGhpczsKICAgICBpZiAodGhpcy5vcHRp
b25zLmZldGNoZWRfcGVybWlzc2lvbnMgPTNEPTNEPTNEIHVuZGVmaW5lZCl7Ci0gICAgICAkLmdl
dCggIi9hcGkvbGlicmFyaWVzL2RhdGFzZXRzLyIgKyBzZWxmLmlkICsgIi9wZXJtaXNzaW9ucz9z
Y29wZT0zRD0KY3VycmVudCIpLmRvbmUoZnVuY3Rpb24oZmV0Y2hlZF9wZXJtaXNzaW9ucykgewor
ICAgICAgJC5nZXQoICggd2luZG93LmdhbGF4eV9jb25maWcgPyBnYWxheHlfY29uZmlnLnJvb3Qg
OiAnLycgKSArICJhcGkvbGk9CmJyYXJpZXMvZGF0YXNldHMvIiArIHNlbGYuaWQgKyAiL3Blcm1p
c3Npb25zP3Njb3BlPTNEY3VycmVudCIpLmRvbmUoZnVuY3Rpbz0KbihmZXRjaGVkX3Blcm1pc3Np
b25zKSB7CiAgICAgICAgIHNlbGYucHJlcGFyZVNlbGVjdEJveGVzKHtmZXRjaGVkX3Blcm1pc3Np
b25zOmZldGNoZWRfcGVybWlzc2lvbnMsID0KaXNfYWRtaW46aXNfYWRtaW59KTsKICAgICAgIH0p
LmZhaWwoZnVuY3Rpb24oKXsKICAgICAgICAgICBtb2RfdG9hc3RyLmVycm9yKCdBbiBlcnJvciBv
Y2N1cnJlZCB3aGlsZSBhdHRlbXB0aW5nIHRvIGZldGNoIGRhPQp0YXNldCBwZXJtaXNzaW9ucy4n
KTsKQEAgLTI3Myw3ICsyNzMsNyBAQAogICAgICAgICAgICAgICBwbGFjZWhvbGRlcjogJ0NsaWNr
IHRvIHNlbGVjdCBhIHJvbGUnLAogICAgICAgICAgICAgICBjb250YWluZXI6IHNlbGYuJGVsLmZp
bmQoJyNhY2Nlc3NfcGVybScpLAogICAgICAgICAgICAgICBhamF4OiB7Ci0gICAgICAgICAgICAg
ICAgICB1cmw6ICIvYXBpL2xpYnJhcmllcy9kYXRhc2V0cy8iICsgc2VsZi5pZCArICIvcGVybWlz
c2lvbj0Kcz9zY29wZT0zRGF2YWlsYWJsZSIsCisgICAgICAgICAgICAgICAgICB1cmw6ICggd2lu
ZG93LmdhbGF4eV9jb25maWcgPyBnYWxheHlfY29uZmlnLnJvb3QgOiAnLycgKT0KICsgImFwaS9s
aWJyYXJpZXMvZGF0YXNldHMvIiArIHNlbGYuaWQgKyAiL3Blcm1pc3Npb25zP3Njb3BlPTNEYXZh
aWxhYmxlIiwKICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlOiAnanNvbicsCiAgICAgICAgICAg
ICAgICAgICBxdWlldE1pbGxpczogMTAwLAogICAgICAgICAgICAgICAgICAgZGF0YTogZnVuY3Rp
b24gKHRlcm0sIHBhZ2UpIHsgLy8gcGFnZSBpcyB0aGUgb25lLWJhc2VkIHA9CmFnZSBudW1iZXIg
dHJhY2tlZCBieSBTZWxlY3QyCkBAIC0zMjAsNyArMzIwLDcgQEAKICAgICAgICAgICAgICAgcGxh
Y2Vob2xkZXI6ICdDbGljayB0byBzZWxlY3QgYSByb2xlJywKICAgICAgICAgICAgICAgY29udGFp
bmVyOiBzZWxmLiRlbC5maW5kKCcjbW9kaWZ5X3Blcm0nKSwKICAgICAgICAgICAgICAgYWpheDog
ewotICAgICAgICAgICAgICAgICAgdXJsOiAiL2FwaS9saWJyYXJpZXMvZGF0YXNldHMvIiArIHNl
bGYuaWQgKyAiL3Blcm1pc3Npb249CnM/c2NvcGU9M0RhdmFpbGFibGUiLAorICAgICAgICAgICAg
ICAgICAgdXJsOiAoIHdpbmRvdy5nYWxheHlfY29uZmlnID8gZ2FsYXh5X2NvbmZpZy5yb290IDog
Jy8nICk9CiArICJhcGkvbGlicmFyaWVzL2RhdGFzZXRzLyIgKyBzZWxmLmlkICsgIi9wZXJtaXNz
aW9ucz9zY29wZT0zRGF2YWlsYWJsZSIsCiAgICAgICAgICAgICAgICAgICBkYXRhVHlwZTogJ2pz
b24nLAogICAgICAgICAgICAgICAgICAgcXVpZXRNaWxsaXM6IDEwMCwKICAgICAgICAgICAgICAg
ICAgIGRhdGE6IGZ1bmN0aW9uICh0ZXJtLCBwYWdlKSB7IC8vIHBhZ2UgaXMgdGhlIG9uZS1iYXNl
ZCBwPQphZ2UgbnVtYmVyIHRyYWNrZWQgYnkgU2VsZWN0MgpAQCAtMzY3LDcgKzM2Nyw3IEBACiAg
ICAgICAgICAgICAgIHBsYWNlaG9sZGVyOiAnQ2xpY2sgdG8gc2VsZWN0IGEgcm9sZScsCiAgICAg
ICAgICAgICAgIGNvbnRhaW5lcjogc2VsZi4kZWwuZmluZCgnI21hbmFnZV9wZXJtJyksCiAgICAg
ICAgICAgICAgIGFqYXg6IHsKLSAgICAgICAgICAgICAgICAgIHVybDogIi9hcGkvbGlicmFyaWVz
L2RhdGFzZXRzLyIgKyBzZWxmLmlkICsgIi9wZXJtaXNzaW9uPQpzP3Njb3BlPTNEYXZhaWxhYmxl
IiwKKyAgICAgICAgICAgICAgICAgIHVybDogKCB3aW5kb3cuZ2FsYXh5X2NvbmZpZyA/IGdhbGF4
eV9jb25maWcucm9vdCA6ICcvJyApPQogKyAiYXBpL2xpYnJhcmllcy9kYXRhc2V0cy8iICsgc2Vs
Zi5pZCArICIvcGVybWlzc2lvbnM/c2NvcGU9M0RhdmFpbGFibGUiLAogICAgICAgICAgICAgICAg
ICAgZGF0YVR5cGU6ICdqc29uJywKICAgICAgICAgICAgICAgICAgIHF1aWV0TWlsbGlzOiAxMDAs
CiAgICAgICAgICAgICAgICAgICBkYXRhOiBmdW5jdGlvbiAodGVybSwgcGFnZSkgeyAvLyBwYWdl
IGlzIHRoZSBvbmUtYmFzZWQgcD0KYWdlIG51bWJlciB0cmFja2VkIGJ5IFNlbGVjdDIKQEAgLTQx
Myw3ICs0MTMsNyBAQAogICAgICAgICAgICAgc2VsZi5tYW5hZ2VTZWxlY3RPYmplY3QgPTNEIG5l
dyBtb2Rfc2VsZWN0LlZpZXcobWFuYWdlX3NlbGVjdF89Cm9wdGlvbnMpOwogICAgICAgICB9IGVs
c2UgeyAvLyBOb24tYWRtaW5zIGhhdmUgc2VsZWN0IHdpdGggcHJlLWxvYWRlZCBvcHRpb25zCiAg
ICAgICAgICAgICB2YXIgdGVtcGxhdGUgPTNEIHNlbGYudGVtcGxhdGVBY2Nlc3NTZWxlY3QoKTsK
LSAgICAgICAgICAgICQuZ2V0KCAiL2FwaS9saWJyYXJpZXMvZGF0YXNldHMvIiArIHNlbGYuaWQg
KyAiL3Blcm1pc3Npb25zP3NjPQpvcGU9M0RhdmFpbGFibGUiLCBmdW5jdGlvbiggZGF0YSApIHsK
KyAgICAgICAgICAgICQuZ2V0KCAoIHdpbmRvdy5nYWxheHlfY29uZmlnID8gZ2FsYXh5X2NvbmZp
Zy5yb290IDogJy8nICkgKyAiPQphcGkvbGlicmFyaWVzL2RhdGFzZXRzLyIgKyBzZWxmLmlkICsg
Ii9wZXJtaXNzaW9ucz9zY29wZT0zRGF2YWlsYWJsZSIsIGZ1bmM9CnRpb24oIGRhdGEgKSB7CiAg
ICAgICAgICAgICAgICAgJCgnLmFjY2Vzc19wZXJtJykuaHRtbCh0ZW1wbGF0ZSh7b3B0aW9uczpk
YXRhLnJvbGVzfSkpOwogICAgICAgICAgICAgICAgIHNlbGYuYWNjZXNzU2VsZWN0T2JqZWN0ID0z
RCAkKCcjYWNjZXNzX3NlbGVjdCcpLnNlbGVjdDIoKTsKICAgICAgICAgICAgIH0pLmZhaWwoZnVu
Y3Rpb24oKSB7CkBAIC00MzYsNyArNDM2LDcgQEAKPTIwCiAgIG1ha2VEYXRhc2V0UHJpdmF0ZTog
ZnVuY3Rpb24oKXsKICAgICB2YXIgc2VsZiA9M0QgdGhpczsKLSAgICAkLnBvc3QoIi9hcGkvbGli
cmFyaWVzL2RhdGFzZXRzLyIgKyBzZWxmLmlkICsgIi9wZXJtaXNzaW9ucz9hY3Rpb249M0RtPQph
a2VfcHJpdmF0ZSIpLmRvbmUoZnVuY3Rpb24oZmV0Y2hlZF9wZXJtaXNzaW9ucykgeworICAgICQu
cG9zdCggKCB3aW5kb3cuZ2FsYXh5X2NvbmZpZyA/IGdhbGF4eV9jb25maWcucm9vdCA6ICcvJyAp
ICsgImFwaS9saWI9CnJhcmllcy9kYXRhc2V0cy8iICsgc2VsZi5pZCArICIvcGVybWlzc2lvbnM/
YWN0aW9uPTNEbWFrZV9wcml2YXRlIikuZG9uZShmdT0KbmN0aW9uKGZldGNoZWRfcGVybWlzc2lv
bnMpIHsKICAgICAgIHNlbGYubW9kZWwuc2V0KHtpc191bnJlc3RyaWN0ZWQ6ZmFsc2V9KTsKICAg
ICAgIHNlbGYuc2hvd1Blcm1pc3Npb25zKHtmZXRjaGVkX3Blcm1pc3Npb25zOmZldGNoZWRfcGVy
bWlzc2lvbnN9KQogICAgICAgbW9kX3RvYXN0ci5zdWNjZXNzKCdUaGUgZGF0YXNldCBpcyBub3cg
cHJpdmF0ZSB0byB5b3UuJyk7CkBAIC00NDcsNyArNDQ3LDcgQEAKPTIwCiAgIHJlbW92ZURhdGFz
ZXRSZXN0cmljdGlvbnM6IGZ1bmN0aW9uKCl7CiAgICAgdmFyIHNlbGYgPTNEIHRoaXM7Ci0gICAg
JC5wb3N0KCIvYXBpL2xpYnJhcmllcy9kYXRhc2V0cy8iICsgc2VsZi5pZCArICIvcGVybWlzc2lv
bnM/YWN0aW9uPTNEcj0KZW1vdmVfcmVzdHJpY3Rpb25zIikKKyAgICAkLnBvc3QoICggd2luZG93
LmdhbGF4eV9jb25maWcgPyBnYWxheHlfY29uZmlnLnJvb3QgOiAnLycgKSArICJhcGkvbGliPQpy
YXJpZXMvZGF0YXNldHMvIiArIHNlbGYuaWQgKyAiL3Blcm1pc3Npb25zP2FjdGlvbj0zRHJlbW92
ZV9yZXN0cmljdGlvbnMiKQogICAgIC5kb25lKGZ1bmN0aW9uKGZldGNoZWRfcGVybWlzc2lvbnMp
IHsKICAgICAgIHNlbGYubW9kZWwuc2V0KHtpc191bnJlc3RyaWN0ZWQ6dHJ1ZX0pOwogICAgICAg
c2VsZi5zaG93UGVybWlzc2lvbnMoe2ZldGNoZWRfcGVybWlzc2lvbnM6ZmV0Y2hlZF9wZXJtaXNz
aW9uc30pCkBAIC00NzgsNyArNDc4LDcgQEAKICAgICAgIG1vZGlmeV9pZHMucHVzaChtb2RpZnlf
cm9sZXNbaV0uaWQpOwogICAgIH07Cj0yMAotICAgICQucG9zdCgiL2FwaS9saWJyYXJpZXMvZGF0
YXNldHMvIiArIHNlbGYuaWQgKyAiL3Blcm1pc3Npb25zP2FjdGlvbj0zRHM9CmV0X3Blcm1pc3Np
b25zIiwgeyAnYWNjZXNzX2lkc1tdJzogYWNjZXNzX2lkcywgJ21hbmFnZV9pZHNbXSc6IG1hbmFn
ZV9pZHMsID0KJ21vZGlmeV9pZHNbXSc6IG1vZGlmeV9pZHMsIH0gKQorICAgICQucG9zdCggKCB3
aW5kb3cuZ2FsYXh5X2NvbmZpZyA/IGdhbGF4eV9jb25maWcucm9vdCA6ICcvJyApICsgImFwaS9s
aWI9CnJhcmllcy9kYXRhc2V0cy8iICsgc2VsZi5pZCArICIvcGVybWlzc2lvbnM/YWN0aW9uPTNE
c2V0X3Blcm1pc3Npb25zIiwgeyAnYT0KY2Nlc3NfaWRzW10nOiBhY2Nlc3NfaWRzLCAnbWFuYWdl
X2lkc1tdJzogbWFuYWdlX2lkcywgJ21vZGlmeV9pZHNbXSc6IG1vZGlmPQp5X2lkcywgfSApCiAg
ICAgLmRvbmUoZnVuY3Rpb24oZmV0Y2hlZF9wZXJtaXNzaW9ucyl7CiAgICAgICAvL2ZldGNoIGRh
dGFzZXQgYWdhaW4KICAgICAgIHNlbGYuc2hvd1Blcm1pc3Npb25zKHtmZXRjaGVkX3Blcm1pc3Np
b25zOmZldGNoZWRfcGVybWlzc2lvbnN9KQoKZGlmZiAtciA0OWQ1MGJjZTQ2MzIwNmY0NDUwNjNk
MmIyN2IyZjJiMzkzYWRiZTExIC1yIDFjY2Y0MGJkYWZhMTg0YjNiZTMxYWE3PQpiMWVjZGZjZTNi
YzcwNWVmYiBzdGF0aWMvc2NyaXB0cy9tdmMvbGlicmFyeS9saWJyYXJ5LWZvbGRlci12aWV3Lmpz
Ci0tLSBhL3N0YXRpYy9zY3JpcHRzL212Yy9saWJyYXJ5L2xpYnJhcnktZm9sZGVyLXZpZXcuanMK
KysrIGIvc3RhdGljL3NjcmlwdHMvbXZjL2xpYnJhcnkvbGlicmFyeS1mb2xkZXItdmlldy5qcwpA
QCAtODEsNyArODEsNyBAQAo9MjAKICAgICB2YXIgc2VsZiA9M0QgdGhpczsKICAgICBpZiAodGhp
cy5vcHRpb25zLmZldGNoZWRfcGVybWlzc2lvbnMgPTNEPTNEPTNEIHVuZGVmaW5lZCl7Ci0gICAg
ICAkLmdldCggIi9hcGkvZm9sZGVycy8iICsgc2VsZi5pZCArICIvcGVybWlzc2lvbnM/c2NvcGU9
M0RjdXJyZW50IikuZD0Kb25lKGZ1bmN0aW9uKGZldGNoZWRfcGVybWlzc2lvbnMpIHsKKyAgICAg
ICQuZ2V0KCAoIHdpbmRvdy5nYWxheHlfY29uZmlnID8gZ2FsYXh5X2NvbmZpZy5yb290IDogJy8n
ICkgKyAiYXBpL2ZvPQpsZGVycy8iICsgc2VsZi5pZCArICIvcGVybWlzc2lvbnM/c2NvcGU9M0Rj
dXJyZW50IikuZG9uZShmdW5jdGlvbihmZXRjaGVkX3A9CmVybWlzc2lvbnMpIHsKICAgICAgICAg
c2VsZi5wcmVwYXJlU2VsZWN0Qm94ZXMoe2ZldGNoZWRfcGVybWlzc2lvbnM6ZmV0Y2hlZF9wZXJt
aXNzaW9uc30pOwogICAgICAgfSkuZmFpbChmdW5jdGlvbigpewogICAgICAgICAgIG1vZF90b2Fz
dHIuZXJyb3IoJ0FuIGVycm9yIG9jY3VycmVkIHdoaWxlIGF0dGVtcHRpbmcgdG8gZmV0Y2ggZm89
CmxkZXIgcGVybWlzc2lvbnMuJyk7CkBAIC0xMjUsNyArMTI1LDcgQEAKICAgICAgIHBsYWNlaG9s
ZGVyOiAnQ2xpY2sgdG8gc2VsZWN0IGEgcm9sZScsCiAgICAgICBjb250YWluZXI6IHNlbGYuJGVs
LmZpbmQoJyMnICsgaWQpLAogICAgICAgYWpheDogewotICAgICAgICAgIHVybDogIi9hcGkvZm9s
ZGVycy8iICsgc2VsZi5pZCArICIvcGVybWlzc2lvbnM/c2NvcGU9M0RhdmFpbGFibGU9CiIsCisg
ICAgICAgICAgdXJsOiAoIHdpbmRvdy5nYWxheHlfY29uZmlnID8gZ2FsYXh5X2NvbmZpZy5yb290
IDogJy8nICkgKyAiYXBpLz0KZm9sZGVycy8iICsgc2VsZi5pZCArICIvcGVybWlzc2lvbnM/c2Nv
cGU9M0RhdmFpbGFibGUiLAogICAgICAgICAgIGRhdGFUeXBlOiAnanNvbicsCiAgICAgICAgICAg
cXVpZXRNaWxsaXM6IDEwMCwKICAgICAgICAgICBkYXRhOiBmdW5jdGlvbiAodGVybSwgcGFnZSkg
eyAvLyBwYWdlIGlzIHRoZSBvbmUtYmFzZWQgcGFnZSBudW1iPQplciB0cmFja2VkIGJ5IFNlbGVj
dDIKQEAgLTE5NSw3ICsxOTUsNyBAQAogICAgIHZhciBtYW5hZ2VfaWRzID0zRCB0aGlzLl9leHRy
YWN0SWRzKHRoaXMubWFuYWdlU2VsZWN0T2JqZWN0LiRlbC5zZWxlY3Q9CjIoJ2RhdGEnKSk7CiAg
ICAgdmFyIG1vZGlmeV9pZHMgPTNEIHRoaXMuX2V4dHJhY3RJZHModGhpcy5tb2RpZnlTZWxlY3RP
YmplY3QuJGVsLnNlbGVjdD0KMignZGF0YScpKTsKPTIwCi0gICAgJC5wb3N0KCIvYXBpL2ZvbGRl
cnMvIiArIHNlbGYuaWQgKyAiL3Blcm1pc3Npb25zP2FjdGlvbj0zRHNldF9wZXJtaXNzaT0Kb25z
IiwgeyAnYWRkX2lkc1tdJzogYWRkX2lkcywgJ21hbmFnZV9pZHNbXSc6IG1hbmFnZV9pZHMsICdt
b2RpZnlfaWRzW10nOiBtPQpvZGlmeV9pZHMsIH0gKQorICAgICQucG9zdCggKCB3aW5kb3cuZ2Fs
YXh5X2NvbmZpZyA/IGdhbGF4eV9jb25maWcucm9vdCA6ICcvJyApICsgImFwaS9mb2w9CmRlcnMv
IiArIHNlbGYuaWQgKyAiL3Blcm1pc3Npb25zP2FjdGlvbj0zRHNldF9wZXJtaXNzaW9ucyIsIHsg
J2FkZF9pZHNbXSc6ID0KYWRkX2lkcywgJ21hbmFnZV9pZHNbXSc6IG1hbmFnZV9pZHMsICdtb2Rp
ZnlfaWRzW10nOiBtb2RpZnlfaWRzLCB9ICkKICAgICAuZG9uZShmdW5jdGlvbihmZXRjaGVkX3Bl
cm1pc3Npb25zKXsKICAgICAgIC8vZmV0Y2ggZGF0YXNldCBhZ2FpbgogICAgICAgc2VsZi5zaG93
UGVybWlzc2lvbnMoe2ZldGNoZWRfcGVybWlzc2lvbnM6ZmV0Y2hlZF9wZXJtaXNzaW9uc30pCgpk
aWZmIC1yIDQ5ZDUwYmNlNDYzMjA2ZjQ0NTA2M2QyYjI3YjJmMmIzOTNhZGJlMTEgLXIgMWNjZjQw
YmRhZmExODRiM2JlMzFhYTc9CmIxZWNkZmNlM2JjNzA1ZWZiIHN0YXRpYy9zY3JpcHRzL212Yy9s
aWJyYXJ5L2xpYnJhcnktZm9sZGVydG9vbGJhci12aWV3LmpzCi0tLSBhL3N0YXRpYy9zY3JpcHRz
L212Yy9saWJyYXJ5L2xpYnJhcnktZm9sZGVydG9vbGJhci12aWV3LmpzCisrKyBiL3N0YXRpYy9z
Y3JpcHRzL212Yy9saWJyYXJ5L2xpYnJhcnktZm9sZGVydG9vbGJhci12aWV3LmpzCkBAIC0yOTQs
NyArMjk0LDcgQEAKICAgICAgICAgICAgICAgICBkYXRhc2V0X2lkcy5wdXNoKCB0aGlzLnBhcmVu
dEVsZW1lbnQucGFyZW50RWxlbWVudC5pZCApOwogICAgICAgICAgICAgfQogICAgICAgICB9ICk7
Ci0gICAgdmFyIHVybCA9M0QgJy9hcGkvbGlicmFyaWVzL2RhdGFzZXRzL2Rvd25sb2FkLycgKyBm
b3JtYXQ7CisgICAgdmFyIHVybCA9M0QgKCB3aW5kb3cuZ2FsYXh5X2NvbmZpZyA/IGdhbGF4eV9j
b25maWcucm9vdCA6ICcvJyApICsgJ2FwaT0KL2xpYnJhcmllcy9kYXRhc2V0cy9kb3dubG9hZC8n
ICsgZm9ybWF0OwogICAgIHZhciBkYXRhID0zRCB7ICdsZF9pZHMnIDogZGF0YXNldF9pZHMgfTsK
ICAgICB0aGlzLnByb2Nlc3NEb3dubG9hZCggdXJsLCBkYXRhLCAnZ2V0JyApOwogICB9LApAQCAt
Mzg2LDcgKzM4Niw3IEBACiAgIGZldGNoRXh0QW5kR2Vub21lczogZnVuY3Rpb24oKXsKICAgICB2
YXIgdGhhdCA9M0QgdGhpczsKICAgICBtb2RfdXRpbHMuZ2V0KHsKLSAgICAgICAgdXJsICAgICAg
OiAgZ2FsYXh5X2NvbmZpZy5yb290ICsgImFwaS9kYXRhdHlwZXM/ZXh0ZW5zaW9uX29ubHk9M0RG
PQphbHNlIiwKKyAgICAgICAgdXJsICAgICAgOiAgKCB3aW5kb3cuZ2FsYXh5X2NvbmZpZyA/IGdh
bGF4eV9jb25maWcucm9vdCA6ICcvJyApICsgPQoiYXBpL2RhdGF0eXBlcz9leHRlbnNpb25fb25s
eT0zREZhbHNlIiwKICAgICAgICAgc3VjY2VzcyAgOiAgZnVuY3Rpb24oIGRhdGF0eXBlcyApIHsK
ICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoa2V5IGluIGRhdGF0eXBlcykgewogICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIHRoYXQubGlzdF9leHRlbnNpb25zLnB1c2goewpAQCAtNDAz
LDcgKzQwMyw3IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgIH0pOwogICAgIG1vZF91
dGlscy5nZXQoewotICAgICAgICB1cmw6ICAgIGdhbGF4eV9jb25maWcucm9vdCArICJhcGkvZ2Vu
b21lcyIsCisgICAgICAgIHVybDogICAgKCB3aW5kb3cuZ2FsYXh5X2NvbmZpZyA/IGdhbGF4eV9j
b25maWcucm9vdCA6ICcvJyApICsgImFwaT0KL2dlbm9tZXMiLAogICAgICAgICBzdWNjZXNzOiBm
dW5jdGlvbiggZ2Vub21lcyApIHsKICAgICAgICAgICAgICAgICAgICAgZm9yICgga2V5IGluIGdl
bm9tZXMgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Lmxpc3RfZ2Vub21lcy5wdXNo
KHsKQEAgLTY4OSw3ICs2ODksNyBAQAogICAgICAgZm9yICggdmFyIGkgPTNEIGhpc3RvcnlfZGF0
YXNldF9pZHMubGVuZ3RoIC0gMTsgaSA+PTNEIDA7IGktLSApIHsKICAgICAgICAgaGlzdG9yeV9k
YXRhc2V0X2lkID0zRCBoaXN0b3J5X2RhdGFzZXRfaWRzW2ldOwogICAgICAgICB2YXIgZm9sZGVy
X2l0ZW0gPTNEIG5ldyBtb2RfbGlicmFyeV9tb2RlbC5JdGVtKCk7Ci0gICAgICAgIGZvbGRlcl9p
dGVtLnVybCA9M0QgJy9hcGkvZm9sZGVycy8nICsgdGhpcy5vcHRpb25zLmlkICsgJy9jb250ZW50
cz0KJzsKKyAgICAgICAgZm9sZGVyX2l0ZW0udXJsID0zRCAoIHdpbmRvdy5nYWxheHlfY29uZmln
ID8gZ2FsYXh5X2NvbmZpZy5yb290IDogPQonLycgKSArICdhcGkvZm9sZGVycy8nICsgdGhpcy5v
cHRpb25zLmlkICsgJy9jb250ZW50cyc7CiAgICAgICAgIGZvbGRlcl9pdGVtLnNldCggeyAnZnJv
bV9oZGFfaWQnOmhpc3RvcnlfZGF0YXNldF9pZCB9ICk7CiAgICAgICAgIGhkYXNfdG9fYWRkLnB1
c2goIGZvbGRlcl9pdGVtICk7CiAgICAgICB9CkBAIC03NDksNyArNzQ5LDcgQEAKICAgICAgIH0K
ICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KLSAgICB2YXIgcHJvbWlzZSA9M0QgJC53aGVuKCAk
LnBvc3QoICcvYXBpL2xpYnJhcmllcy9kYXRhc2V0cz9lbmNvZGVkX2ZvbGRlPQpyX2lkPTNEJyAr
IHRoYXQuaWQgKz0yMAorICAgIHZhciBwcm9taXNlID0zRCAkLndoZW4oICQucG9zdCggKCB3aW5k
b3cuZ2FsYXh5X2NvbmZpZyA/IGdhbGF4eV9jb25maWc9Ci5yb290IDogJy8nICkgKyAnYXBpL2xp
YnJhcmllcy9kYXRhc2V0cz9lbmNvZGVkX2ZvbGRlcl9pZD0zRCcgKyB0aGF0LmlkICs9MjAKICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJnNv
dXJjZT0zRCcgKyBvcHRpPQpvbnMuc291cmNlICsKICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJnBhdGg9M0QnICsgcG9wcGVkPQpfaXRlbSAr
CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
JyZmaWxlX3R5cGU9M0QnICsgbz0KcHRpb25zLmZpbGVfdHlwZSArCkBAIC03ODgsNyArNzg4LDcg
QEAKICAgICAgIH0KICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KLSAgICB2YXIgcHJvbWlzZSA9
M0QgJC53aGVuKCAkLnBvc3QoICcvYXBpL2xpYnJhcmllcy9kYXRhc2V0cz9lbmNvZGVkX2ZvbGRl
PQpyX2lkPTNEJyArIHRoYXQuaWQgKworICAgIHZhciBwcm9taXNlID0zRCAkLndoZW4oICQucG9z
dCggKCB3aW5kb3cuZ2FsYXh5X2NvbmZpZyA/IGdhbGF4eV9jb25maWc9Ci5yb290IDogJy8nICkg
KyAnYXBpL2xpYnJhcmllcy9kYXRhc2V0cz9lbmNvZGVkX2ZvbGRlcl9pZD0zRCcgKyB0aGF0Lmlk
ICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAnJnNvdXJjZT0zRCcgKyBvPQpwdGlvbnMuc291cmNlICsKICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJnBhdGg9M0QnICsgcG9w
PQpwZWRfaXRlbSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgJyZwcmVzZXJ2ZV9kaXJzPQo9M0QnICsgb3B0aW9ucy5wcmVzZXJ2ZV9k
aXJzICsKCmRpZmYgLXIgNDlkNTBiY2U0NjMyMDZmNDQ1MDYzZDJiMjdiMmYyYjM5M2FkYmUxMSAt
ciAxY2NmNDBiZGFmYTE4NGIzYmUzMWFhNz0KYjFlY2RmY2UzYmM3MDVlZmIgc3RhdGljL3Njcmlw
dHMvbXZjL2xpYnJhcnkvbGlicmFyeS1saWJyYXJ5LXZpZXcuanMKLS0tIGEvc3RhdGljL3Njcmlw
dHMvbXZjL2xpYnJhcnkvbGlicmFyeS1saWJyYXJ5LXZpZXcuanMKKysrIGIvc3RhdGljL3Njcmlw
dHMvbXZjL2xpYnJhcnkvbGlicmFyeS1saWJyYXJ5LXZpZXcuanMKQEAgLTg3LDcgKzg3LDcgQEAK
PTIwCiAgICAgdmFyIHNlbGYgPTNEIHRoaXM7CiAgICAgaWYgKHRoaXMub3B0aW9ucy5mZXRjaGVk
X3Blcm1pc3Npb25zID0zRD0zRD0zRCB1bmRlZmluZWQpewotICAgICAgJC5nZXQoICIvYXBpL2xp
YnJhcmllcy8iICsgc2VsZi5pZCArICIvcGVybWlzc2lvbnM/c2NvcGU9M0RjdXJyZW50Iik9Ci5k
b25lKGZ1bmN0aW9uKGZldGNoZWRfcGVybWlzc2lvbnMpIHsKKyAgICAgICQuZ2V0KCAoIHdpbmRv
dy5nYWxheHlfY29uZmlnID8gZ2FsYXh5X2NvbmZpZy5yb290IDogJy8nICkgKyAiYXBpL2xpPQpi
cmFyaWVzLyIgKyBzZWxmLmlkICsgIi9wZXJtaXNzaW9ucz9zY29wZT0zRGN1cnJlbnQiKS5kb25l
KGZ1bmN0aW9uKGZldGNoZWQ9Cl9wZXJtaXNzaW9ucykgewogICAgICAgICBzZWxmLnByZXBhcmVT
ZWxlY3RCb3hlcyh7ZmV0Y2hlZF9wZXJtaXNzaW9uczpmZXRjaGVkX3Blcm1pc3Npb25zfSk7CiAg
ICAgICB9KS5mYWlsKGZ1bmN0aW9uKCl7CiAgICAgICAgICAgbW9kX3RvYXN0ci5lcnJvcignQW4g
ZXJyb3Igb2NjdXJyZWQgd2hpbGUgYXR0ZW1wdGluZyB0byBmZXRjaCBsaT0KYnJhcnkgcGVybWlz
c2lvbnMuJyk7CkBAIC0xMzQsNyArMTM0LDcgQEAKICAgICAgIHBsYWNlaG9sZGVyOiAnQ2xpY2sg
dG8gc2VsZWN0IGEgcm9sZScsCiAgICAgICBjb250YWluZXI6IHNlbGYuJGVsLmZpbmQoJyMnICsg
aWQpLAogICAgICAgYWpheDogewotICAgICAgICAgIHVybDogIi9hcGkvbGlicmFyaWVzLyIgKyBz
ZWxmLmlkICsgIi9wZXJtaXNzaW9ucz9zY29wZT0zRGF2YWlsYWI9CmxlJmlzX2xpYnJhcnlfYWNj
ZXNzPTNEIiArIGlzX2xpYnJhcnlfYWNjZXNzLAorICAgICAgICAgIHVybDogKCB3aW5kb3cuZ2Fs
YXh5X2NvbmZpZyA/IGdhbGF4eV9jb25maWcucm9vdCA6ICcvJyApICsgImFwaS89CmxpYnJhcmll
cy8iICsgc2VsZi5pZCArICIvcGVybWlzc2lvbnM/c2NvcGU9M0RhdmFpbGFibGUmaXNfbGlicmFy
eV9hY2Nlc3M9Cj0zRCIgKyBpc19saWJyYXJ5X2FjY2VzcywKICAgICAgICAgICBkYXRhVHlwZTog
J2pzb24nLAogICAgICAgICAgIHF1aWV0TWlsbGlzOiAxMDAsCiAgICAgICAgICAgZGF0YTogZnVu
Y3Rpb24gKHRlcm0sIHBhZ2UpIHsgLy8gcGFnZSBpcyB0aGUgb25lLWJhc2VkIHBhZ2UgbnVtYj0K
ZXIgdHJhY2tlZCBieSBTZWxlY3QyCkBAIC0xOTMsNyArMTkzLDcgQEAKPTIwCiAgIG1ha2VEYXRh
c2V0UHJpdmF0ZTogZnVuY3Rpb24oKXsKICAgICB2YXIgc2VsZiA9M0QgdGhpczsKLSAgICAkLnBv
c3QoIi9hcGkvbGlicmFyaWVzL2RhdGFzZXRzLyIgKyBzZWxmLmlkICsgIi9wZXJtaXNzaW9ucz9h
Y3Rpb249M0RtPQpha2VfcHJpdmF0ZSIpLmRvbmUoZnVuY3Rpb24oZmV0Y2hlZF9wZXJtaXNzaW9u
cykgeworICAgICQucG9zdCggKCB3aW5kb3cuZ2FsYXh5X2NvbmZpZyA/IGdhbGF4eV9jb25maWcu
cm9vdCA6ICcvJyApICsgImFwaS9saWI9CnJhcmllcy9kYXRhc2V0cy8iICsgc2VsZi5pZCArICIv
cGVybWlzc2lvbnM/YWN0aW9uPTNEbWFrZV9wcml2YXRlIikuZG9uZShmdT0KbmN0aW9uKGZldGNo
ZWRfcGVybWlzc2lvbnMpIHsKICAgICAgIHNlbGYubW9kZWwuc2V0KHtpc191bnJlc3RyaWN0ZWQ6
ZmFsc2V9KTsKICAgICAgIHNlbGYuc2hvd1Blcm1pc3Npb25zKHtmZXRjaGVkX3Blcm1pc3Npb25z
OmZldGNoZWRfcGVybWlzc2lvbnN9KQogICAgICAgbW9kX3RvYXN0ci5zdWNjZXNzKCdUaGUgZGF0
YXNldCBpcyBub3cgcHJpdmF0ZSB0byB5b3UuJyk7CkBAIC0yMDQsNyArMjA0LDcgQEAKPTIwCiAg
IHJlbW92ZURhdGFzZXRSZXN0cmljdGlvbnM6IGZ1bmN0aW9uKCl7CiAgICAgdmFyIHNlbGYgPTNE
IHRoaXM7Ci0gICAgJC5wb3N0KCIvYXBpL2xpYnJhcmllcy9kYXRhc2V0cy8iICsgc2VsZi5pZCAr
ICIvcGVybWlzc2lvbnM/YWN0aW9uPTNEcj0KZW1vdmVfcmVzdHJpY3Rpb25zIikKKyAgICAkLnBv
c3QoICggd2luZG93LmdhbGF4eV9jb25maWcgPyBnYWxheHlfY29uZmlnLnJvb3QgOiAnLycgKSAr
ICJhcGkvbGliPQpyYXJpZXMvZGF0YXNldHMvIiArIHNlbGYuaWQgKyAiL3Blcm1pc3Npb25zP2Fj
dGlvbj0zRHJlbW92ZV9yZXN0cmljdGlvbnMiKQogICAgIC5kb25lKGZ1bmN0aW9uKGZldGNoZWRf
cGVybWlzc2lvbnMpIHsKICAgICAgIHNlbGYubW9kZWwuc2V0KHtpc191bnJlc3RyaWN0ZWQ6dHJ1
ZX0pOwogICAgICAgc2VsZi5zaG93UGVybWlzc2lvbnMoe2ZldGNoZWRfcGVybWlzc2lvbnM6ZmV0
Y2hlZF9wZXJtaXNzaW9uc30pCkBAIC0yMzAsNyArMjMwLDcgQEAKICAgICB2YXIgbWFuYWdlX2lk
cyA9M0QgdGhpcy5fZXh0cmFjdElkcyh0aGlzLm1hbmFnZVNlbGVjdE9iamVjdC4kZWwuc2VsZWN0
PQoyKCdkYXRhJykpOwogICAgIHZhciBtb2RpZnlfaWRzID0zRCB0aGlzLl9leHRyYWN0SWRzKHRo
aXMubW9kaWZ5U2VsZWN0T2JqZWN0LiRlbC5zZWxlY3Q9CjIoJ2RhdGEnKSk7Cj0yMAotICAgICQu
cG9zdCgiL2FwaS9saWJyYXJpZXMvIiArIHNlbGYuaWQgKyAiL3Blcm1pc3Npb25zP2FjdGlvbj0z
RHNldF9wZXJtaXM9CnNpb25zIiwgeyAnYWNjZXNzX2lkc1tdJzogYWNjZXNzX2lkcywgJ2FkZF9p
ZHNbXSc6IGFkZF9pZHMsICdtYW5hZ2VfaWRzW10nOj0KIG1hbmFnZV9pZHMsICdtb2RpZnlfaWRz
W10nOiBtb2RpZnlfaWRzLCB9ICkKKyAgICAkLnBvc3QoICggd2luZG93LmdhbGF4eV9jb25maWcg
PyBnYWxheHlfY29uZmlnLnJvb3QgOiAnLycgKSArICJhcGkvbGliPQpyYXJpZXMvIiArIHNlbGYu
aWQgKyAiL3Blcm1pc3Npb25zP2FjdGlvbj0zRHNldF9wZXJtaXNzaW9ucyIsIHsgJ2FjY2Vzc19p
ZHM9CltdJzogYWNjZXNzX2lkcywgJ2FkZF9pZHNbXSc6IGFkZF9pZHMsICdtYW5hZ2VfaWRzW10n
OiBtYW5hZ2VfaWRzLCAnbW9kaWZ5Xz0KaWRzW10nOiBtb2RpZnlfaWRzLCB9ICkKICAgICAuZG9u
ZShmdW5jdGlvbihmZXRjaGVkX3Blcm1pc3Npb25zKXsKICAgICAgIC8vZmV0Y2ggZGF0YXNldCBh
Z2FpbgogICAgICAgc2VsZi5zaG93UGVybWlzc2lvbnMoe2ZldGNoZWRfcGVybWlzc2lvbnM6ZmV0
Y2hlZF9wZXJtaXNzaW9uc30pCgpkaWZmIC1yIDQ5ZDUwYmNlNDYzMjA2ZjQ0NTA2M2QyYjI3YjJm
MmIzOTNhZGJlMTEgLXIgMWNjZjQwYmRhZmExODRiM2JlMzFhYTc9CmIxZWNkZmNlM2JjNzA1ZWZi
IHN0YXRpYy9zY3JpcHRzL3BhY2tlZC9tdmMvbGlicmFyeS9saWJyYXJ5LWRhdGFzZXQtdmlldy5q
cwotLS0gYS9zdGF0aWMvc2NyaXB0cy9wYWNrZWQvbXZjL2xpYnJhcnkvbGlicmFyeS1kYXRhc2V0
LXZpZXcuanMKKysrIGIvc3RhdGljL3NjcmlwdHMvcGFja2VkL212Yy9saWJyYXJ5L2xpYnJhcnkt
ZGF0YXNldC12aWV3LmpzCkBAIC0xLDEgKzEsMSBAQAotZGVmaW5lKFsibGlicy90b2FzdHIiLCJt
dmMvbGlicmFyeS9saWJyYXJ5LW1vZGVsIiwibXZjL3VpL3VpLXNlbGVjdCJdLGZ1bmM9CnRpb24o
ZCxjLGIpe3ZhciBhPTNEQmFja2JvbmUuVmlldy5leHRlbmQoe2VsOiIjY2VudGVyIixtb2RlbDpu
dWxsLG9wdGlvbnM6ez0KfSxldmVudHM6eyJjbGljayAudG9vbGJ0bl9tb2RpZnlfZGF0YXNldCI6
ImVuYWJsZU1vZGlmaWNhdGlvbiIsImNsaWNrIC50b29sPQpidG5fY2FuY2VsX21vZGlmaWNhdGlv
bnMiOiJyZW5kZXIiLCJjbGljayAudG9vbGJ0bi1kb3dubG9hZC1kYXRhc2V0IjoiZG93bmw9Cm9h
ZERhdGFzZXQiLCJjbGljayAudG9vbGJ0bi1pbXBvcnQtZGF0YXNldCI6ImltcG9ydEludG9IaXN0
b3J5IiwiY2xpY2sgLnRvbz0KbGJ0bi1zaGFyZS1kYXRhc2V0Ijoic2hhcmVEYXRhc2V0IiwiY2xp
Y2sgLmJ0bi1jb3B5LWxpbmstdG8tY2xpcGJvYXJkIjoiY29wPQp5VG9DbGlwYm9hcmQiLCJjbGlj
ayAuYnRuLW1ha2UtcHJpdmF0ZSI6Im1ha2VEYXRhc2V0UHJpdmF0ZSIsImNsaWNrIC5idG4tcmU9
Cm1vdmUtcmVzdHJpY3Rpb25zIjoicmVtb3ZlRGF0YXNldFJlc3RyaWN0aW9ucyIsImNsaWNrIC50
b29sYnRuX3NhdmVfcGVybWlzcz0KaW9ucyI6InNhdmVQZXJtaXNzaW9ucyIsImNsaWNrIC50b29s
YnRuX3NhdmVfbW9kaWZpY2F0aW9ucyI6ImNvbWluZ1Nvb24iLH0sPQppbml0aWFsaXplOmZ1bmN0
aW9uKGUpe3RoaXMub3B0aW9ucz0zRF8uZXh0ZW5kKHRoaXMub3B0aW9ucyxlKTtpZih0aGlzLm9w
dGk9Cm9ucy5pZCl7dGhpcy5mZXRjaERhdGFzZXQoKX19LGZldGNoRGF0YXNldDpmdW5jdGlvbihl
KXt0aGlzLm9wdGlvbnM9M0RfLmV4dD0KZW5kKHRoaXMub3B0aW9ucyxlKTt0aGlzLm1vZGVsPTNE
bmV3IGMuSXRlbSh7aWQ6dGhpcy5vcHRpb25zLmlkfSk7dmFyIGY9M0R0PQpoaXM7dGhpcy5tb2Rl
bC5mZXRjaCh7c3VjY2VzczpmdW5jdGlvbigpe2lmKGYub3B0aW9ucy5zaG93X3Blcm1pc3Npb25z
KXtmLnM9Cmhvd1Blcm1pc3Npb25zKCl9ZWxzZXtpZihmLm9wdGlvbnMuc2hvd192ZXJzaW9uKXtm
LmZldGNoVmVyc2lvbigpfWVsc2V7Zi5yZT0KbmRlcigpfX19LGVycm9yOmZ1bmN0aW9uKGgsZyl7
aWYodHlwZW9mIGcucmVzcG9uc2VKU09OIT0zRD0zRCJ1bmRlZmluZWQiKXtkPQouZXJyb3IoZy5y
ZXNwb25zZUpTT04uZXJyX21zZysiIENsaWNrIHRoaXMgdG8gZ28gYmFjay4iLCIiLHtvbmNsaWNr
OmZ1bmN0aW89Cm4oKXtHYWxheHkubGlicmFyaWVzLmxpYnJhcnlfcm91dGVyLmJhY2soKX19KX1l
bHNle2QuZXJyb3IoIkFuIGVycm9yIG9jdXJyZT0KZC4gQ2xpY2sgdGhpcyB0byBnbyBiYWNrLiIs
IiIse29uY2xpY2s6ZnVuY3Rpb24oKXtHYWxheHkubGlicmFyaWVzLmxpYnJhcnlfPQpyb3V0ZXIu
YmFjaygpfX0pfX19KX0scmVuZGVyOmZ1bmN0aW9uKGUpe3RoaXMub3B0aW9ucz0zRF8uZXh0ZW5k
KHRoaXMub3B0aW89Cm5zLGUpOyQoIi50b29sdGlwIikucmVtb3ZlKCk7dmFyIGY9M0R0aGlzLnRl
bXBsYXRlRGF0YXNldCgpO3RoaXMuJGVsLmh0bWwoZj0KKHtpdGVtOnRoaXMubW9kZWx9KSk7JCgi
LnBlZWsiKS5odG1sKHRoaXMubW9kZWwuZ2V0KCJwZWVrIikpOyQoIiNjZW50ZXIgW2RhPQp0YS10
b2dnbGVdIikudG9vbHRpcCgpfSxmZXRjaFZlcnNpb246ZnVuY3Rpb24oZSl7dGhpcy5vcHRpb25z
PTNEXy5leHRlbmQodGg9CmlzLm9wdGlvbnMsZSk7dGhhdD0zRHRoaXM7aWYoIXRoaXMub3B0aW9u
cy5sZGRhX2lkKXt0aGlzLnJlbmRlcigpO2QuZXJyb3IoIj0KTGlicmFyeSBkYXRhc2V0IHZlcnNp
b24gcmVxdWVzdGVkIGJ1dCBubyBpZCBwcm92aWRlZC4iKX1lbHNle3RoaXMubGRkYT0zRG5lPQp3
IGMuTGRkYSh7aWQ6dGhpcy5vcHRpb25zLmxkZGFfaWR9KTt0aGlzLmxkZGEudXJsPTNEdGhpcy5s
ZGRhLnVybFJvb3QrdGhpcy49Cm1vZGVsLmlkKyIvdmVyc2lvbnMvIit0aGlzLmxkZGEuaWQ7dGhp
cy5sZGRhLmZldGNoKHtzdWNjZXNzOmZ1bmN0aW9uKCl7dGhhdD0KLnJlbmRlclZlcnNpb24oKX0s
ZXJyb3I6ZnVuY3Rpb24oZyxmKXtpZih0eXBlb2YgZi5yZXNwb25zZUpTT04hPTNEPTNEInVuZGVm
PQppbmVkIil7ZC5lcnJvcihmLnJlc3BvbnNlSlNPTi5lcnJfbXNnKX1lbHNle2QuZXJyb3IoIkFu
IGVycm9yIG9jdXJyZWQuIil9fX09Cil9fSxyZW5kZXJWZXJzaW9uOmZ1bmN0aW9uKCl7JCgiLnRv
b2x0aXAiKS5yZW1vdmUoKTt2YXIgZT0zRHRoaXMudGVtcGxhdGVWZT0KcnNpb24oKTt0aGlzLiRl
bC5odG1sKGUoe2l0ZW06dGhpcy5tb2RlbCxsZGRhOnRoaXMubGRkYX0pKTskKCIucGVlayIpLmh0
bWwoPQp0aGlzLmxkZGEuZ2V0KCJwZWVrIikpfSxlbmFibGVNb2RpZmljYXRpb246ZnVuY3Rpb24o
KXskKCIudG9vbHRpcCIpLnJlbW92ZSg9Cik7dmFyIGU9M0R0aGlzLnRlbXBsYXRlTW9kaWZ5RGF0
YXNldCgpO3RoaXMuJGVsLmh0bWwoZSh7aXRlbTp0aGlzLm1vZGVsfSkpOz0KJCgiLnBlZWsiKS5o
dG1sKHRoaXMubW9kZWwuZ2V0KCJwZWVrIikpOyQoIiNjZW50ZXIgW2RhdGEtdG9nZ2xlXSIpLnRv
b2x0aXAoPQopfSxkb3dubG9hZERhdGFzZXQ6ZnVuY3Rpb24oKXt2YXIgZT0zRCIvYXBpL2xpYnJh
cmllcy9kYXRhc2V0cy9kb3dubG9hZC91bmM9Cm9tcHJlc3NlZCI7dmFyIGY9M0R7bGRfaWRzOnRo
aXMuaWR9O3RoaXMucHJvY2Vzc0Rvd25sb2FkKGUsZil9LHByb2Nlc3NEb3dubD0Kb2FkOmZ1bmN0
aW9uKGYsZyxoKXtpZihmJiZnKXtnPTNEdHlwZW9mIGc9M0Q9M0Qic3RyaW5nIj9nOiQucGFyYW0o
Zyk7dmFyIGU9Cj0zRCIiOyQuZWFjaChnLnNwbGl0KCImIiksZnVuY3Rpb24oKXt2YXIgaT0zRHRo
aXMuc3BsaXQoIj0zRCIpO2UrPTNEJzxpbnB1dD0KIHR5cGU9M0QiaGlkZGVuIiBuYW1lPTNEIicr
aVswXSsnIiB2YWx1ZT0zRCInK2lbMV0rJyIgLz4nfSk7JCgnPGZvcm0gYWN0aW9uPQo9M0QiJytm
KyciIG1ldGhvZD0zRCInKyhofHwicG9zdCIpKyciPicrZSsiPC9mb3JtPiIpLmFwcGVuZFRvKCJi
b2R5Iikuc3VibWk9CnQoKS5yZW1vdmUoKTtkLmluZm8oIllvdXIgZG93bmxvYWQgd2lsbCBiZWdp
biBzb29uLiIpfX0saW1wb3J0SW50b0hpc3Rvcnk6Zj0KdW5jdGlvbigpe3RoaXMucmVmcmVzaFVz
ZXJIaXN0b3JpZXNMaXN0KGZ1bmN0aW9uKGUpe3ZhciBmPTNEZS50ZW1wbGF0ZUJ1bGtJPQptcG9y
dEluTW9kYWwoKTtlLm1vZGFsPTNER2FsYXh5Lm1vZGFsO2UubW9kYWwuc2hvdyh7Y2xvc2luZ19l
dmVudHM6dHJ1ZSx0aXQ9CmxlOiJJbXBvcnQgaW50byBIaXN0b3J5Iixib2R5OmYoe2hpc3Rvcmll
czplLmhpc3Rvcmllcy5tb2RlbHN9KSxidXR0b25zOntJbT0KcG9ydDpmdW5jdGlvbigpe2UuaW1w
b3J0Q3VycmVudEludG9IaXN0b3J5KCl9LENsb3NlOmZ1bmN0aW9uKCl7R2FsYXh5Lm1vZGFsPQou
aGlkZSgpfX19KX0pfSxyZWZyZXNoVXNlckhpc3Rvcmllc0xpc3Q6ZnVuY3Rpb24oZil7dmFyIGU9
M0R0aGlzO3RoaXMuaGlzdG89CnJpZXM9M0RuZXcgYy5HYWxheHlIaXN0b3JpZXMoKTt0aGlzLmhp
c3Rvcmllcy5mZXRjaCh7c3VjY2VzczpmdW5jdGlvbihnKXtpZj0KKGcubGVuZ3RoPTNEPTNEPTNE
MCl7ZC53YXJuaW5nKCJZb3UgaGF2ZSB0byBjcmVhdGUgaGlzdG9yeSBmaXJzdC4gQ2xpY2sgdGhp
PQpzIHRvIGRvIHNvLiIsIiIse29uY2xpY2s6ZnVuY3Rpb24oKXt3aW5kb3cubG9jYXRpb249M0Qi
LyJ9fSl9ZWxzZXtmKGUpfX0sZXI9CnJvcjpmdW5jdGlvbihoLGcpe2lmKHR5cGVvZiBnLnJlc3Bv
bnNlSlNPTiE9M0Q9M0QidW5kZWZpbmVkIil7ZC5lcnJvcihnLnJlcz0KcG9uc2VKU09OLmVycl9t
c2cpfWVsc2V7ZC5lcnJvcigiQW4gZXJyb3Igb2N1cnJlZC4iKX19fSl9LGltcG9ydEN1cnJlbnRJ
bnRvPQpIaXN0b3J5OmZ1bmN0aW9uKCl7dmFyIGU9M0QkKHRoaXMubW9kYWwuZWxNYWluKS5maW5k
KCJzZWxlY3RbbmFtZT0zRGRhdGFzZXQ9Cl9pbXBvcnRfc2luZ2xlXSBvcHRpb246c2VsZWN0ZWQi
KS52YWwoKTt2YXIgZj0zRG5ldyBjLkhpc3RvcnlJdGVtKCk7Zi51cmw9Cj0zRGYudXJsUm9vdCtl
KyIvY29udGVudHMiO2pRdWVyeS5nZXRKU09OKGdhbGF4eV9jb25maWcucm9vdCsiaGlzdG9yeS9z
ZXRfYT0Kc19jdXJyZW50P2lkPTNEIitlKTtmLnNhdmUoe2NvbnRlbnQ6dGhpcy5pZCxzb3VyY2U6
ImxpYnJhcnkifSx7c3VjY2VzczpmdW5jPQp0aW9uKCl7R2FsYXh5Lm1vZGFsLmhpZGUoKTtkLnN1
Y2Nlc3MoIkRhdGFzZXQgaW1wb3J0ZWQuIENsaWNrIHRoaXMgdG8gc3RhcnQ9CiBhbmFseXNpbmcg
aXQuIiwiIix7b25jbGljazpmdW5jdGlvbigpe3dpbmRvdy5sb2NhdGlvbj0zRCIvIn19KX0sZXJy
b3I6ZnVuYz0KdGlvbihoLGcpe2lmKHR5cGVvZiBnLnJlc3BvbnNlSlNPTiE9M0Q9M0QidW5kZWZp
bmVkIil7ZC5lcnJvcigiRGF0YXNldCBub3QgPQppbXBvcnRlZC4gIitnLnJlc3BvbnNlSlNPTi5l
cnJfbXNnKX1lbHNle2QuZXJyb3IoIkFuIGVycm9yIG9jY3VyZWQuIERhdGFzZXQ9CiBub3QgaW1w
b3J0ZWQuIFBsZWFzZSB0cnkgYWdhaW4uIil9fX0pfSxzaGFyZURhdGFzZXQ6ZnVuY3Rpb24oKXtk
LmluZm8oIkZlYT0KdHVyZSBjb21pbmcgc29vbi4iKX0sZ29CYWNrOmZ1bmN0aW9uKCl7R2FsYXh5
LmxpYnJhcmllcy5saWJyYXJ5X3JvdXRlci5iYWNrPQooKX0sc2hvd1Blcm1pc3Npb25zOmZ1bmN0
aW9uKGYpe3RoaXMub3B0aW9ucz0zRF8uZXh0ZW5kKHRoaXMub3B0aW9ucyxmKTskKCI9Ci50b29s
dGlwIikucmVtb3ZlKCk7aWYodGhpcy5vcHRpb25zLmZldGNoZWRfcGVybWlzc2lvbnMhPTNEPTNE
dW5kZWZpbmVkKXtpZj0KKHRoaXMub3B0aW9ucy5mZXRjaGVkX3Blcm1pc3Npb25zLmFjY2Vzc19k
YXRhc2V0X3JvbGVzLmxlbmd0aD0zRD0zRD0zRDApe3RoPQppcy5tb2RlbC5zZXQoe2lzX3VucmVz
dHJpY3RlZDp0cnVlfSl9ZWxzZXt0aGlzLm1vZGVsLnNldCh7aXNfdW5yZXN0cmljdGVkOmY9CmFs
c2V9KX19dmFyIGg9M0RmYWxzZTtpZihHYWxheHkuY3VyclVzZXIpe2g9M0RHYWxheHkuY3VyclVz
ZXIuaXNBZG1pbigpfXZhcj0KIGc9M0R0aGlzLnRlbXBsYXRlRGF0YXNldFBlcm1pc3Npb25zKCk7
dGhpcy4kZWwuaHRtbChnKHtpdGVtOnRoaXMubW9kZWwsaXNfPQphZG1pbjpofSkpO3ZhciBlPTNE
dGhpcztpZih0aGlzLm9wdGlvbnMuZmV0Y2hlZF9wZXJtaXNzaW9ucz0zRD0zRD0zRHVuZGVmaW49
CmVkKXskLmdldCgiL2FwaS9saWJyYXJpZXMvZGF0YXNldHMvIitlLmlkKyIvcGVybWlzc2lvbnM/
c2NvcGU9M0RjdXJyZW50IikuZD0Kb25lKGZ1bmN0aW9uKGkpe2UucHJlcGFyZVNlbGVjdEJveGVz
KHtmZXRjaGVkX3Blcm1pc3Npb25zOmksaXNfYWRtaW46aH0pfSkuPQpmYWlsKGZ1bmN0aW9uKCl7
ZC5lcnJvcigiQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgYXR0ZW1wdGluZyB0byBmZXRjaCBkYXRh
c2U9CnQgcGVybWlzc2lvbnMuIil9KX1lbHNle3RoaXMucHJlcGFyZVNlbGVjdEJveGVzKHtpc19h
ZG1pbjpofSl9JCgiI2NlbnRlciBbZD0KYXRhLXRvZ2dsZV0iKS50b29sdGlwKCk7JCgiI2NlbnRl
ciIpLmNzcygib3ZlcmZsb3ciLCJhdXRvIil9LHByZXBhcmVTZWxlY3RCPQpveGVzOmZ1bmN0aW9u
KHIpe3RoaXMub3B0aW9ucz0zRF8uZXh0ZW5kKHRoaXMub3B0aW9ucyxyKTt2YXIgcz0zRHRoaXMu
b3B0aW89Cm5zLmZldGNoZWRfcGVybWlzc2lvbnM7dmFyIGs9M0R0aGlzLm9wdGlvbnMuaXNfYWRt
aW47dmFyIHE9M0R0aGlzO3ZhciBtPTNEWz0KXTtmb3IodmFyIGg9M0QwO2g8cy5hY2Nlc3NfZGF0
YXNldF9yb2xlcy5sZW5ndGg7aCsrKXttLnB1c2gocy5hY2Nlc3NfZGF0YXNlPQp0X3JvbGVzW2hd
KyI6IitzLmFjY2Vzc19kYXRhc2V0X3JvbGVzW2hdKX12YXIgZj0zRFtdO2Zvcih2YXIgaD0zRDA7
aDxzLm1vZGk9CmZ5X2l0ZW1fcm9sZXMubGVuZ3RoO2grKyl7Zi5wdXNoKHMubW9kaWZ5X2l0ZW1f
cm9sZXNbaF0rIjoiK3MubW9kaWZ5X2l0ZW1fcj0Kb2xlc1toXSl9dmFyIGc9M0RbXTtmb3IodmFy
IGg9M0QwO2g8cy5tYW5hZ2VfZGF0YXNldF9yb2xlcy5sZW5ndGg7aCsrKXtnLnB1PQpzaChzLm1h
bmFnZV9kYXRhc2V0X3JvbGVzW2hdKyI6IitzLm1hbmFnZV9kYXRhc2V0X3JvbGVzW2hdKX1pZihr
KXt2YXIgbz0zRHs9Cm1pbmltdW1JbnB1dExlbmd0aDowLGNzczoiYWNjZXNzX3Blcm0iLG11bHRp
cGxlOnRydWUscGxhY2Vob2xkZXI6IkNsaWNrIHRvID0Kc2VsZWN0IGEgcm9sZSIsY29udGFpbmVy
OnEuJGVsLmZpbmQoIiNhY2Nlc3NfcGVybSIpLGFqYXg6e3VybDoiL2FwaS9saWJyYXJpPQplcy9k
YXRhc2V0cy8iK3EuaWQrIi9wZXJtaXNzaW9ucz9zY29wZT0zRGF2YWlsYWJsZSIsZGF0YVR5cGU6
Impzb24iLHF1aWV0TWk9CmxsaXM6MTAwLGRhdGE6ZnVuY3Rpb24oaSx0KXtyZXR1cm57cTppLHBh
Z2VfbGltaXQ6MTAscGFnZTp0fX0scmVzdWx0czpmdW5jdD0KaW9uKHUsdCl7dmFyIGk9M0QodCox
MCk8dS50b3RhbDtyZXR1cm57cmVzdWx0czp1LnJvbGVzLG1vcmU6aX19fSxmb3JtYXRSZXN1PQps
dDpmdW5jdGlvbiBqKGkpe3JldHVybiBpLm5hbWUrIiB0eXBlOiAiK2kudHlwZX0sZm9ybWF0U2Vs
ZWN0aW9uOmZ1bmN0aW9uIGU9CihpKXtyZXR1cm4gaS5uYW1lfSxpbml0U2VsZWN0aW9uOmZ1bmN0
aW9uKGksdSl7dmFyIHQ9M0RbXTskKGkudmFsKCkuc3BsaXQoIj0KLCIpKS5lYWNoKGZ1bmN0aW9u
KCl7dmFyIHY9M0R0aGlzLnNwbGl0KCI6Iik7dC5wdXNoKHtpZDp2WzFdLG5hbWU6dlsxXX0pfSk7
PQp1KHQpfSxpbml0aWFsRGF0YTptLmpvaW4oIiwiKSxkcm9wZG93bkNzc0NsYXNzOiJiaWdkcm9w
In07dmFyIGw9M0R7bWluaW11bUk9Cm5wdXRMZW5ndGg6MCxjc3M6Im1vZGlmeV9wZXJtIixtdWx0
aXBsZTp0cnVlLHBsYWNlaG9sZGVyOiJDbGljayB0byBzZWxlY3QgYT0KIHJvbGUiLGNvbnRhaW5l
cjpxLiRlbC5maW5kKCIjbW9kaWZ5X3Blcm0iKSxhamF4Ont1cmw6Ii9hcGkvbGlicmFyaWVzL2Rh
dGFzPQpldHMvIitxLmlkKyIvcGVybWlzc2lvbnM/c2NvcGU9M0RhdmFpbGFibGUiLGRhdGFUeXBl
OiJqc29uIixxdWlldE1pbGxpczoxMDA9CixkYXRhOmZ1bmN0aW9uKGksdCl7cmV0dXJue3E6aSxw
YWdlX2xpbWl0OjEwLHBhZ2U6dH19LHJlc3VsdHM6ZnVuY3Rpb24odSx0KT0Ke3ZhciBpPTNEKHQq
MTApPHUudG90YWw7cmV0dXJue3Jlc3VsdHM6dS5yb2xlcyxtb3JlOml9fX0sZm9ybWF0UmVzdWx0
OmZ1bmN0PQppb24gaihpKXtyZXR1cm4gaS5uYW1lKyIgdHlwZTogIitpLnR5cGV9LGZvcm1hdFNl
bGVjdGlvbjpmdW5jdGlvbiBlKGkpe3JldHU9CnJuIGkubmFtZX0saW5pdFNlbGVjdGlvbjpmdW5j
dGlvbihpLHUpe3ZhciB0PTNEW107JChpLnZhbCgpLnNwbGl0KCIsIikpLmVhYz0KaChmdW5jdGlv
bigpe3ZhciB2PTNEdGhpcy5zcGxpdCgiOiIpO3QucHVzaCh7aWQ6dlsxXSxuYW1lOnZbMV19KX0p
O3UodCl9LGluPQppdGlhbERhdGE6Zi5qb2luKCIsIiksZHJvcGRvd25Dc3NDbGFzczoiYmlnZHJv
cCJ9O3ZhciBwPTNEe21pbmltdW1JbnB1dExlbmc9CnRoOjAsY3NzOiJtYW5hZ2VfcGVybSIsbXVs
dGlwbGU6dHJ1ZSxwbGFjZWhvbGRlcjoiQ2xpY2sgdG8gc2VsZWN0IGEgcm9sZSIsYz0Kb250YWlu
ZXI6cS4kZWwuZmluZCgiI21hbmFnZV9wZXJtIiksYWpheDp7dXJsOiIvYXBpL2xpYnJhcmllcy9k
YXRhc2V0cy8iK3EuPQppZCsiL3Blcm1pc3Npb25zP3Njb3BlPTNEYXZhaWxhYmxlIixkYXRhVHlw
ZToianNvbiIscXVpZXRNaWxsaXM6MTAwLGRhdGE6ZnU9Cm5jdGlvbihpLHQpe3JldHVybntxOmks
cGFnZV9saW1pdDoxMCxwYWdlOnR9fSxyZXN1bHRzOmZ1bmN0aW9uKHUsdCl7dmFyIGk9Cj0zRCh0
KjEwKTx1LnRvdGFsO3JldHVybntyZXN1bHRzOnUucm9sZXMsbW9yZTppfX19LGZvcm1hdFJlc3Vs
dDpmdW5jdGlvbiBqKD0KaSl7cmV0dXJuIGkubmFtZSsiIHR5cGU6ICIraS50eXBlfSxmb3JtYXRT
ZWxlY3Rpb246ZnVuY3Rpb24gZShpKXtyZXR1cm4gaS5uPQphbWV9LGluaXRTZWxlY3Rpb246ZnVu
Y3Rpb24oaSx1KXt2YXIgdD0zRFtdOyQoaS52YWwoKS5zcGxpdCgiLCIpKS5lYWNoKGZ1bmM9CnRp
b24oKXt2YXIgdj0zRHRoaXMuc3BsaXQoIjoiKTt0LnB1c2goe2lkOnZbMV0sbmFtZTp2WzFdfSl9
KTt1KHQpfSxpbml0aWFsRD0KYXRhOmcuam9pbigiLCIpLGRyb3Bkb3duQ3NzQ2xhc3M6ImJpZ2Ry
b3AifTtxLmFjY2Vzc1NlbGVjdE9iamVjdD0zRG5ldyBiLlZpPQpldyhvKTtxLm1vZGlmeVNlbGVj
dE9iamVjdD0zRG5ldyBiLlZpZXcobCk7cS5tYW5hZ2VTZWxlY3RPYmplY3Q9M0RuZXcgYi5WaWU9
CncocCl9ZWxzZXt2YXIgbj0zRHEudGVtcGxhdGVBY2Nlc3NTZWxlY3QoKTskLmdldCgiL2FwaS9s
aWJyYXJpZXMvZGF0YXNldHMvIj0KK3EuaWQrIi9wZXJtaXNzaW9ucz9zY29wZT0zRGF2YWlsYWJs
ZSIsZnVuY3Rpb24oaSl7JCgiLmFjY2Vzc19wZXJtIikuaHRtbChuPQooe29wdGlvbnM6aS5yb2xl
c30pKTtxLmFjY2Vzc1NlbGVjdE9iamVjdD0zRCQoIiNhY2Nlc3Nfc2VsZWN0Iikuc2VsZWN0Migp
fSk9Ci5mYWlsKGZ1bmN0aW9uKCl7ZC5lcnJvcigiQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgYXR0
ZW1wdGluZyB0byBmZXRjaCBkYXRhcz0KZXQgcGVybWlzc2lvbnMuIil9KX19LGNvbWluZ1Nvb246
ZnVuY3Rpb24oKXtkLndhcm5pbmcoIkZlYXR1cmUgY29taW5nIHNvb24uPQoiKX0sY29weVRvQ2xp
cGJvYXJkOmZ1bmN0aW9uKCl7dmFyIGU9M0RCYWNrYm9uZS5oaXN0b3J5LmxvY2F0aW9uLmhyZWY7
aWYoZS49Cmxhc3RJbmRleE9mKCIvcGVybWlzc2lvbnMiKSE9M0Q9M0QtMSl7ZT0zRGUuc3Vic3Ry
KDAsZS5sYXN0SW5kZXhPZigiL3Blcm1pcz0Kc2lvbnMiKSl9d2luZG93LnByb21wdCgiQ29weSB0
byBjbGlwYm9hcmQ6IEN0cmwrQywgRW50ZXIiLGUpfSxtYWtlRGF0YXNldFByPQppdmF0ZTpmdW5j
dGlvbigpe3ZhciBlPTNEdGhpczskLnBvc3QoIi9hcGkvbGlicmFyaWVzL2RhdGFzZXRzLyIrZS5p
ZCsiL3Blcm09Cmlzc2lvbnM/YWN0aW9uPTNEbWFrZV9wcml2YXRlIikuZG9uZShmdW5jdGlvbihm
KXtlLm1vZGVsLnNldCh7aXNfdW5yZXN0cmljdD0KZWQ6ZmFsc2V9KTtlLnNob3dQZXJtaXNzaW9u
cyh7ZmV0Y2hlZF9wZXJtaXNzaW9uczpmfSk7ZC5zdWNjZXNzKCJUaGUgZGF0YXNlPQp0IGlzIG5v
dyBwcml2YXRlIHRvIHlvdS4iKX0pLmZhaWwoZnVuY3Rpb24oKXtkLmVycm9yKCJBbiBlcnJvciBv
Y2N1cnJlZCB3aGk9CmxlIGF0dGVtcHRpbmcgdG8gbWFrZSBkYXRhc2V0IHByaXZhdGUuIil9KX0s
cmVtb3ZlRGF0YXNldFJlc3RyaWN0aW9uczpmdW5jdD0KaW9uKCl7dmFyIGU9M0R0aGlzOyQucG9z
dCgiL2FwaS9saWJyYXJpZXMvZGF0YXNldHMvIitlLmlkKyIvcGVybWlzc2lvbnM/YWN0PQppb249
M0RyZW1vdmVfcmVzdHJpY3Rpb25zIikuZG9uZShmdW5jdGlvbihmKXtlLm1vZGVsLnNldCh7aXNf
dW5yZXN0cmljdGVkOnQ9CnJ1ZX0pO2Uuc2hvd1Blcm1pc3Npb25zKHtmZXRjaGVkX3Blcm1pc3Np
b25zOmZ9KTtkLnN1Y2Nlc3MoIkFjY2VzcyB0byB0aGlzID0KZGF0YXNldCBpcyBub3cgdW5yZXN0
cmljdGVkLiIpfSkuZmFpbChmdW5jdGlvbigpe2QuZXJyb3IoIkFuIGVycm9yIG9jY3VycmVkPQog
d2hpbGUgYXR0ZW1wdGluZyB0byBtYWtlIGRhdGFzZXQgdW5yZXN0cmljdGVkLiIpfSl9LHNhdmVQ
ZXJtaXNzaW9uczpmdW5jdGk9Cm9uKGUpe3ZhciBuPTNEdGhpczt2YXIgaz0zRHRoaXMuYWNjZXNz
U2VsZWN0T2JqZWN0LiRlbC5zZWxlY3QyKCJkYXRhIik7dmFyID0KZj0zRHRoaXMubWFuYWdlU2Vs
ZWN0T2JqZWN0LiRlbC5zZWxlY3QyKCJkYXRhIik7dmFyIG09M0R0aGlzLm1vZGlmeVNlbGVjdE9i
PQpqZWN0LiRlbC5zZWxlY3QyKCJkYXRhIik7dmFyIGc9M0RbXTt2YXIgaj0zRFtdO3ZhciBsPTNE
W107Zm9yKHZhciBoPTNEay5sZW49Cmd0aC0xO2g+PTNEMDtoLS0pe2cucHVzaChrW2hdLmlkKX1m
b3IodmFyIGg9M0RmLmxlbmd0aC0xO2g+PTNEMDtoLS0pe2oucHVzaD0KKGZbaF0uaWQpfWZvcih2
YXIgaD0zRG0ubGVuZ3RoLTE7aD49M0QwO2gtLSl7bC5wdXNoKG1baF0uaWQpfSQucG9zdCgiL2Fw
aS9sPQppYnJhcmllcy9kYXRhc2V0cy8iK24uaWQrIi9wZXJtaXNzaW9ucz9hY3Rpb249M0RzZXRf
cGVybWlzc2lvbnMiLHsiYWNjZXNzX2k9CmRzW10iOmcsIm1hbmFnZV9pZHNbXSI6aiwibW9kaWZ5
X2lkc1tdIjpsLH0pLmRvbmUoZnVuY3Rpb24oaSl7bi5zaG93UGVybWlzcz0KaW9ucyh7ZmV0Y2hl
ZF9wZXJtaXNzaW9uczppfSk7ZC5zdWNjZXNzKCJQZXJtaXNzaW9ucyBzYXZlZC4iKX0pLmZhaWwo
ZnVuY3RpPQpvbigpe2QuZXJyb3IoIkFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGF0dGVtcHRpbmcg
dG8gc2V0IGRhdGFzZXQgcGVybWlzc2lvbnM9Ci4iKX0pfSx0ZW1wbGF0ZURhdGFzZXQ6ZnVuY3Rp
b24oKXt2YXIgZT0zRFtdO2UucHVzaCgnPGRpdiBjbGFzcz0zRCJsaWJyYXJ5Xz0Kc3R5bGVfY29u
dGFpbmVyIj4nKTtlLnB1c2goJyAgPGRpdiBpZD0zRCJsaWJyYXJ5X3Rvb2xiYXIiPicpO2UucHVz
aCgnICAgPGJ1PQp0dG9uIGRhdGEtdG9nZ2xlPTNEInRvb2x0aXAiIGRhdGEtcGxhY2VtZW50PTNE
InRvcCIgdGl0bGU9M0QiRG93bmxvYWQgZGF0YXM9CmV0IiBjbGFzcz0zRCJidG4gYnRuLWRlZmF1
bHQgdG9vbGJ0bi1kb3dubG9hZC1kYXRhc2V0IHByaW1hcnktYnV0dG9uIiB0eXBlPQo9M0QiYnV0
dG9uIj48c3BhbiBjbGFzcz0zRCJmYSBmYS1kb3dubG9hZCI+PC9zcGFuPiBEb3dubG9hZDwvc3Bh
bj48L2J1dHRvbj49CicpO2UucHVzaCgnICAgPGJ1dHRvbiBkYXRhLXRvZ2dsZT0zRCJ0b29sdGlw
IiBkYXRhLXBsYWNlbWVudD0zRCJ0b3AiIHRpdGxlPQo9M0QiSW1wb3J0IGRhdGFzZXQgaW50byBo
aXN0b3J5IiBjbGFzcz0zRCJidG4gYnRuLWRlZmF1bHQgdG9vbGJ0bi1pbXBvcnQtZGE9CnRhc2V0
IHByaW1hcnktYnV0dG9uIiB0eXBlPTNEImJ1dHRvbiI+PHNwYW4gY2xhc3M9M0QiZmEgZmEtYm9v
ayI+PC9zcGFuPiB0bz0KIEhpc3Rvcnk8L3NwYW4+PC9idXR0b24+Jyk7ZS5wdXNoKCcgICA8JSBp
ZiAoaXRlbS5nZXQoImNhbl91c2VyX21vZGlmeSIpKSB7PQogJT4nKTtlLnB1c2goJyAgIDxidXR0
b24gZGF0YS10b2dnbGU9M0QidG9vbHRpcCIgZGF0YS1wbGFjZW1lbnQ9M0QidG9wIiB0aXQ9Cmxl
PTNEIk1vZGlmeSBsaWJyYXJ5IGl0ZW0iIGNsYXNzPTNEImJ0biBidG4tZGVmYXVsdCB0b29sYnRu
X21vZGlmeV9kYXRhc2V0ID0KcHJpbWFyeS1idXR0b24iIHR5cGU9M0QiYnV0dG9uIj48c3BhbiBj
bGFzcz0zRCJmYSBmYS1wZW5jaWwiPjwvc3Bhbj4gTW9kaWZ5PQo8L3NwYW4+PC9idXR0b24+Jyk7
ZS5wdXNoKCIgICA8JSB9ICU+Iik7ZS5wdXNoKCcgICA8JSBpZiAoaXRlbS5nZXQoImNhbl91c2U9
CnJfbWFuYWdlIikpIHsgJT4nKTtlLnB1c2goJyAgIDxhIGhyZWY9M0QiI2ZvbGRlcnMvPCUtIGl0
ZW0uZ2V0KCJmb2xkZXJfaWQiKT0KICU+L2RhdGFzZXRzLzwlLSBpdGVtLmlkICU+L3Blcm1pc3Np
b25zIj48YnV0dG9uIGRhdGEtdG9nZ2xlPTNEInRvb2x0aXAiIGRhPQp0YS1wbGFjZW1lbnQ9M0Qi
dG9wIiB0aXRsZT0zRCJNYW5hZ2UgcGVybWlzc2lvbnMiIGNsYXNzPTNEImJ0biBidG4tZGVmYXVs
dCA9CnRvb2xidG5fY2hhbmdlX3Blcm1pc3Npb25zIHByaW1hcnktYnV0dG9uIiB0eXBlPTNEImJ1
dHRvbiI+PHNwYW4gY2xhc3M9M0QiZj0KYSBmYS1ncm91cCI+PC9zcGFuPiBQZXJtaXNzaW9uczwv
c3Bhbj48L2J1dHRvbj48L2E+Jyk7ZS5wdXNoKCIgICA8JSB9ICU+Iik7PQplLnB1c2goIiAgPC9k
aXY+Iik7ZS5wdXNoKCc8b2wgY2xhc3M9M0QiYnJlYWRjcnVtYiI+Jyk7ZS5wdXNoKCcgICA8bGk+
PGEgdGk9CnRsZT0zRCJSZXR1cm4gdG8gdGhlIGxpc3Qgb2YgbGlicmFyaWVzIiBocmVmPTNEIiMi
PkxpYnJhcmllczwvYT48L2xpPicpO2UucD0KdXNoKCcgICA8JSBfLmVhY2goaXRlbS5nZXQoImZ1
bGxfcGF0aCIpLCBmdW5jdGlvbihwYXRoX2l0ZW0pIHsgJT4nKTtlLnB1c2goPQoiICAgPCUgaWYg
KHBhdGhfaXRlbVswXSAhPTNEIGl0ZW0uaWQpIHsgJT4iKTtlLnB1c2goJyAgIDxsaT48YSB0aXRs
ZT0zRCJSZXQ9CnVybiB0byB0aGlzIGZvbGRlciIgaHJlZj0zRCIjL2ZvbGRlcnMvPCUtIHBhdGhf
aXRlbVswXSAlPiI+PCUtIHBhdGhfaXRlbVsxXT0KICU+PC9hPjwvbGk+ICcpO2UucHVzaCgiPCUg
fSBlbHNlIHsgJT4iKTtlLnB1c2goJyAgIDxsaSBjbGFzcz0zRCJhY3RpdmUiPjxzPQpwYW4gdGl0
bGU9M0QiWW91IGFyZSBoZXJlIj48JS0gcGF0aF9pdGVtWzFdICU+PC9zcGFuPjwvbGk+Jyk7ZS5w
dXNoKCIgICA8JSA9Cn0gJT4iKTtlLnB1c2goIiAgIDwlIH0pOyAlPiIpO2UucHVzaCgiPC9vbD4i
KTtlLnB1c2goJzwlIGlmIChpdGVtLmdldCgiaXNfdT0KbnJlc3RyaWN0ZWQiKSkgeyAlPicpO2Uu
cHVzaCgnICA8ZGl2IGNsYXNzPTNEImFsZXJ0IGFsZXJ0LWluZm8iPicpO2UucHVzaCgiPQogIFRo
aXMgZGF0YXNldCBpcyB1bnJlc3RyaWN0ZWQgc28gZXZlcnlib2R5IGNhbiBhY2Nlc3MgaXQuIEp1
c3Qgc2hhcmUgdGhlIFU9ClJMIG9mIHRoaXMgcGFnZS4gIik7ZS5wdXNoKCcgIDxidXR0b24gZGF0
YS10b2dnbGU9M0QidG9vbHRpcCIgZGF0YS1wbGFjZW1lbj0KdD0zRCJ0b3AiIHRpdGxlPTNEIkNv
cHkgdG8gY2xpcGJvYXJkIiBjbGFzcz0zRCJidG4gYnRuLWRlZmF1bHQgYnRuLWNvcHktbGluPQpr
LXRvLWNsaXBib2FyZCBwcmltYXJ5LWJ1dHRvbiIgdHlwZT0zRCJidXR0b24iPjxzcGFuIGNsYXNz
PTNEImZhIGZhLWNsaXBib2E9CnJkIj48L3NwYW4+IFRvIENsaXBib2FyZDwvc3Bhbj48L2J1dHRv
bj4gJyk7ZS5wdXNoKCIgIDwvZGl2PiIpO2UucHVzaCgiPCUgfT0KICU+Iik7ZS5wdXNoKCc8ZGl2
IGNsYXNzPTNEImRhdGFzZXRfdGFibGUiPicpO2UucHVzaCgnICAgPHRhYmxlIGNsYXNzPTNEImdy
PQppZCB0YWJsZSB0YWJsZS1zdHJpcGVkIHRhYmxlLWNvbmRlbnNlZCI+Jyk7ZS5wdXNoKCIgICAg
ICAgPHRyPiIpO2UucHVzaCgnICA9CiAgICAgICAgIDx0aCBzY29wZT0zRCJyb3ciIGlkPTNEImlk
X3JvdyIgZGF0YS1pZD0zRCI8JT0zRCBfLmVzY2FwZShpdGVtLmdldD0KKCJsZGRhX2lkIikpICU+
Ij5OYW1lPC90aD4nKTtlLnB1c2goJyAgICAgICAgICAgPHRkPjwlPTNEIF8uZXNjYXBlKGl0ZW0u
Z2V0PQooIm5hbWUiKSkgJT48L3RkPicpO2UucHVzaCgiICAgICAgIDwvdHI+Iik7ZS5wdXNoKCcg
ICA8JSBpZiAoaXRlbS5nZXQoImZpbGU9Cl9leHQiKSkgeyAlPicpO2UucHVzaCgiICAgICAgIDx0
cj4iKTtlLnB1c2goJyAgICAgICAgICAgPHRoIHNjb3BlPTNEInJvdyI+RD0KYXRhIHR5cGU8L3Ro
PicpO2UucHVzaCgnICAgICAgICAgICA8dGQ+PCU9M0QgXy5lc2NhcGUoaXRlbS5nZXQoImZpbGVf
ZXh0IikpPQogJT48L3RkPicpO2UucHVzaCgiICAgICAgIDwvdHI+Iik7ZS5wdXNoKCIgICA8JSB9
ICU+Iik7ZS5wdXNoKCcgICA8JSBpZiAoaXQ9CmVtLmdldCgiZ2Vub21lX2J1aWxkIikpIHsgJT4n
KTtlLnB1c2goIiAgICAgICA8dHI+Iik7ZS5wdXNoKCcgICAgICAgICAgIDx0aD0KIHNjb3BlPTNE
InJvdyI+R2Vub21lIGJ1aWxkPC90aD4nKTtlLnB1c2goJyAgICAgICAgICAgPHRkPjwlPTNEIF8u
ZXNjYXBlKGl0PQplbS5nZXQoImdlbm9tZV9idWlsZCIpKSAlPjwvdGQ+Jyk7ZS5wdXNoKCIgICAg
ICAgPC90cj4iKTtlLnB1c2goIiAgIDwlIH0gJT49CiIpO2UucHVzaCgnICAgPCUgaWYgKGl0ZW0u
Z2V0KCJmaWxlX3NpemUiKSkgeyAlPicpO2UucHVzaCgiICAgICAgIDx0cj4iKTtlLj0KcHVzaCgn
ICAgICAgICAgICA8dGggc2NvcGU9M0Qicm93Ij5TaXplPC90aD4nKTtlLnB1c2goJyAgICAgICAg
ICAgPHRkPjwlPTNEPQogXy5lc2NhcGUoaXRlbS5nZXQoImZpbGVfc2l6ZSIpKSAlPjwvdGQ+Jyk7
ZS5wdXNoKCIgICAgICAgPC90cj4iKTtlLnB1c2goIiA9CiAgPCUgfSAlPiIpO2UucHVzaCgnICAg
PCUgaWYgKGl0ZW0uZ2V0KCJkYXRlX3VwbG9hZGVkIikpIHsgJT4nKTtlLnB1c2goIiAgID0KICAg
IDx0cj4iKTtlLnB1c2goJyAgICAgICAgICAgPHRoIHNjb3BlPTNEInJvdyI+RGF0ZSB1cGxvYWRl
ZCAoVVRDKTwvdGg+Jyk7PQplLnB1c2goJyAgICAgICAgICAgPHRkPjwlPTNEIF8uZXNjYXBlKGl0
ZW0uZ2V0KCJkYXRlX3VwbG9hZGVkIikpICU+PC90ZD4nKTs9CmUucHVzaCgiICAgICAgIDwvdHI+
Iik7ZS5wdXNoKCIgICA8JSB9ICU+Iik7ZS5wdXNoKCcgICA8JSBpZiAoaXRlbS5nZXQoInVwbD0K
b2FkZWRfYnkiKSkgeyAlPicpO2UucHVzaCgiICAgICAgIDx0cj4iKTtlLnB1c2goJyAgICAgICAg
ICAgPHRoIHNjb3BlPTNEInJvPQp3Ij5VcGxvYWRlZCBieTwvdGg+Jyk7ZS5wdXNoKCcgICAgICAg
ICAgIDx0ZD48JT0zRCBfLmVzY2FwZShpdGVtLmdldCgidXBsb2E9CmRlZF9ieSIpKSAlPjwvdGQ+
Jyk7ZS5wdXNoKCIgICAgICAgPC90cj4iKTtlLnB1c2goIiAgIDwlIH0gJT4iKTtlLnB1c2goJyAg
ID0KPCUgaWYgKGl0ZW0uZ2V0KCJtZXRhZGF0YV9kYXRhX2xpbmVzIikpIHsgJT4nKTtlLnB1c2go
IiAgICAgICA8dHI+Iik7ZS5wdXNoPQooJyAgICAgICAgICAgPHRoIHNjb3BlPTNEInJvdyI+RGF0
YSBMaW5lczwvdGg+Jyk7ZS5wdXNoKCcgICAgICAgICAgIDx0ZCBzY289CnBlPTNEInJvdyI+PCU9
M0QgXy5lc2NhcGUoaXRlbS5nZXQoIm1ldGFkYXRhX2RhdGFfbGluZXMiKSkgJT48L3RkPicpO2Uu
cHVzaD0KKCIgICAgICAgPC90cj4iKTtlLnB1c2goIiAgIDwlIH0gJT4iKTtlLnB1c2goJyAgIDwl
IGlmIChpdGVtLmdldCgibWV0YWRhdGFfPQpjb21tZW50X2xpbmVzIikpIHsgJT4nKTtlLnB1c2go
IiAgICAgICA8dHI+Iik7ZS5wdXNoKCcgICAgICAgICAgIDx0aCBzY29wZT0KPTNEInJvdyI+Q29t
bWVudCBMaW5lczwvdGg+Jyk7ZS5wdXNoKCcgICAgICAgICAgIDx0ZCBzY29wZT0zRCJyb3ciPjwl
PTNEIF8uPQplc2NhcGUoaXRlbS5nZXQoIm1ldGFkYXRhX2NvbW1lbnRfbGluZXMiKSkgJT48L3Rk
PicpO2UucHVzaCgiICAgICAgIDwvdHI+Iik9CjtlLnB1c2goIiAgIDwlIH0gJT4iKTtlLnB1c2go
JyAgIDwlIGlmIChpdGVtLmdldCgibWV0YWRhdGFfY29sdW1ucyIpKSB7ICU+Jz0KKTtlLnB1c2go
IiAgICAgICA8dHI+Iik7ZS5wdXNoKCcgICAgICAgICAgIDx0aCBzY29wZT0zRCJyb3ciPk51bWJl
ciBvZiBDb2x1PQptbnM8L3RoPicpO2UucHVzaCgnICAgICAgICAgICA8dGQgc2NvcGU9M0Qicm93
Ij48JT0zRCBfLmVzY2FwZShpdGVtLmdldCgibWU9CnRhZGF0YV9jb2x1bW5zIikpICU+PC90ZD4n
KTtlLnB1c2goIiAgICAgICA8L3RyPiIpO2UucHVzaCgiICAgPCUgfSAlPiIpO2UucD0KdXNoKCcg
ICA8JSBpZiAoaXRlbS5nZXQoIm1ldGFkYXRhX2NvbHVtbl90eXBlcyIpKSB7ICU+Jyk7ZS5wdXNo
KCIgICAgICAgPHRyPQo+Iik7ZS5wdXNoKCcgICAgICAgICAgIDx0aCBzY29wZT0zRCJyb3ciPkNv
bHVtbiBUeXBlczwvdGg+Jyk7ZS5wdXNoKCcgICAgICA9CiAgICAgPHRkIHNjb3BlPTNEInJvdyI+
PCU9M0QgXy5lc2NhcGUoaXRlbS5nZXQoIm1ldGFkYXRhX2NvbHVtbl90eXBlcyIpKSAlPj0KPC90
ZD4nKTtlLnB1c2goIiAgICAgICA8L3RyPiIpO2UucHVzaCgiICAgPCUgfSAlPiIpO2UucHVzaCgn
ICAgPCUgaWYgKGl0ZW0uPQpnZXQoIm1lc3NhZ2UiKSkgeyAlPicpO2UucHVzaCgiICAgICAgIDx0
cj4iKTtlLnB1c2goJyAgICAgICAgICAgPHRoIHNjb3BlPQo9M0Qicm93Ij5NZXNzYWdlPC90aD4n
KTtlLnB1c2goJyAgICAgICAgICAgPHRkIHNjb3BlPTNEInJvdyI+PCU9M0QgXy5lc2NhcGU9Cihp
dGVtLmdldCgibWVzc2FnZSIpKSAlPjwvdGQ+Jyk7ZS5wdXNoKCIgICAgICAgPC90cj4iKTtlLnB1
c2goIiAgIDwlIH0gJT4iKT0KO2UucHVzaCgnICAgPCUgaWYgKGl0ZW0uZ2V0KCJtaXNjX2JsdXJi
IikpIHsgJT4nKTtlLnB1c2goIiAgICAgICA8dHI+Iik7ZS5wPQp1c2goJyAgICAgICAgICAgPHRo
IHNjb3BlPTNEInJvdyI+TWlzY2VsbGFuZW91cyBibHVyYjwvdGg+Jyk7ZS5wdXNoKCcgICAgICA9
CiAgICAgPHRkIHNjb3BlPTNEInJvdyI+PCU9M0QgXy5lc2NhcGUoaXRlbS5nZXQoIm1pc2NfYmx1
cmIiKSkgJT48L3RkPicpO2UucD0KdXNoKCIgICAgICAgPC90cj4iKTtlLnB1c2goIiAgIDwlIH0g
JT4iKTtlLnB1c2goJyAgIDwlIGlmIChpdGVtLmdldCgibWlzY19pPQpuZm8iKSkgeyAlPicpO2Uu
cHVzaCgiICAgICAgIDx0cj4iKTtlLnB1c2goJyAgICAgICAgICAgPHRoIHNjb3BlPTNEInJvdyI+
TWk9CnNjZWxsYW5lb3VzIGluZm9ybWF0aW9uPC90aD4nKTtlLnB1c2goJyAgICAgICAgICAgPHRk
IHNjb3BlPTNEInJvdyI+PCU9M0QgXz0KLmVzY2FwZShpdGVtLmdldCgibWlzY19pbmZvIikpICU+
PC90ZD4nKTtlLnB1c2goIiAgICAgICA8L3RyPiIpO2UucHVzaCgiICAgPQo8JSB9ICU+Iik7ZS5w
dXNoKCIgICAgPC90YWJsZT4iKTtlLnB1c2goIiAgICA8ZGl2PiIpO2UucHVzaCgnICAgICAgICA8
cHJlIGM9Cmxhc3M9M0QicGVlayI+Jyk7ZS5wdXNoKCIgICAgICAgIDwvcHJlPiIpO2UucHVzaCgi
ICAgIDwvZGl2PiIpO2UucHVzaCgnICAgPD0KJSBpZiAoaXRlbS5nZXQoImhhc192ZXJzaW9ucyIp
KSB7ICU+Jyk7ZS5wdXNoKCIgICAgICA8ZGl2PiIpO2UucHVzaCgiICAgICAgPQo8aDM+RXhwaXJl
ZCB2ZXJzaW9uczo8L2gzPiIpO2UucHVzaCgiICAgICAgPHVsPiIpO2UucHVzaCgnICAgICAgPCUg
Xy5lYWNoKGk9CnRlbS5nZXQoImV4cGlyZWRfdmVyc2lvbnMiKSwgZnVuY3Rpb24odmVyc2lvbikg
eyAlPicpO2UucHVzaCgnICAgICAgICA8bGk+PD0KYSB0aXRsZT0zRCJTZWUgZGV0YWlscyBvZiB0
aGlzIHZlcnNpb24iIGhyZWY9M0QiI2ZvbGRlcnMvPCUtIGl0ZW0uZ2V0KCJmb2xkPQplcl9pZCIp
ICU+L2RhdGFzZXRzLzwlLSBpdGVtLmlkICU+L3ZlcnNpb25zLzwlLSB2ZXJzaW9uWzBdICU+Ij48
JS0gdmVyc2lvbls9CjFdICU+PC9hPjwvbGk+Jyk7ZS5wdXNoKCIgICAgICA8JSB9KSAlPiIpO2Uu
cHVzaCgiICAgICAgPHVsPiIpO2UucHVzaCgiICAgID0KICA8L2Rpdj4iKTtlLnB1c2goIiAgIDwl
IH0gJT4iKTtlLnB1c2goIjwvZGl2PiIpO2UucHVzaCgiPC9kaXY+Iik7cmV0dXJuIF8uPQp0ZW1w
bGF0ZShlLmpvaW4oIiIpKX0sdGVtcGxhdGVWZXJzaW9uOmZ1bmN0aW9uKCl7dmFyIGU9M0RbXTtl
LnB1c2goJzxkaXYgY2w9CmFzcz0zRCJsaWJyYXJ5X3N0eWxlX2NvbnRhaW5lciI+Jyk7ZS5wdXNo
KCcgIDxkaXYgaWQ9M0QibGlicmFyeV90b29sYmFyIj4nKT0KO2UucHVzaCgnICAgPGEgaHJlZj0z
RCIjZm9sZGVycy88JS0gaXRlbS5nZXQoImZvbGRlcl9pZCIpICU+L2RhdGFzZXRzLzwlLSBpPQp0
ZW0uaWQgJT4iPjxidXR0b24gZGF0YS10b2dnbGU9M0QidG9vbHRpcCIgZGF0YS1wbGFjZW1lbnQ9
M0QidG9wIiB0aXRsZT0zRCI9CkdvIHRvIGxhdGVzdCBkYXRhc2V0IiBjbGFzcz0zRCJidG4gYnRu
LWRlZmF1bHQgcHJpbWFyeS1idXR0b24iIHR5cGU9M0QiYnV0dD0Kb24iPjxzcGFuIGNsYXNzPTNE
ImZhIGZhLWNhcmV0LWxlZnQgZmEtbGciPjwvc3Bhbj4gTGF0ZXN0IGRhdGFzZXQ8L3NwYW4+PC9i
PQp1dHRvbj48YT4nKTtlLnB1c2goIiAgPC9kaXY+Iik7ZS5wdXNoKCc8b2wgY2xhc3M9M0QiYnJl
YWRjcnVtYiI+Jyk7ZS5wdXNoKCc9CiAgIDxsaT48YSB0aXRsZT0zRCJSZXR1cm4gdG8gdGhlIGxp
c3Qgb2YgbGlicmFyaWVzIiBocmVmPTNEIiMiPkxpYnJhcmllczwvYT0KPjwvbGk+Jyk7ZS5wdXNo
KCcgICA8JSBfLmVhY2goaXRlbS5nZXQoImZ1bGxfcGF0aCIpLCBmdW5jdGlvbihwYXRoX2l0ZW0p
IHsgPQolPicpO2UucHVzaCgiICAgPCUgaWYgKHBhdGhfaXRlbVswXSAhPTNEIGl0ZW0uaWQpIHsg
JT4iKTtlLnB1c2goJyAgIDxsaT48YSA9CnRpdGxlPTNEIlJldHVybiB0byB0aGlzIGZvbGRlciIg
aHJlZj0zRCIjL2ZvbGRlcnMvPCUtIHBhdGhfaXRlbVswXSAlPiI+PCUtID0KcGF0aF9pdGVtWzFd
ICU+PC9hPjwvbGk+ICcpO2UucHVzaCgiPCUgfSBlbHNlIHsgJT4iKTtlLnB1c2goJyAgIDxsaSBj
bGFzcz0KPTNEImFjdGl2ZSI+PHNwYW4gdGl0bGU9M0QiWW91IGFyZSBoZXJlIj48JS0gcGF0aF9p
dGVtWzFdICU+PC9zcGFuPjwvbGk+Jyk7PQplLnB1c2goIiAgIDwlIH0gJT4iKTtlLnB1c2goIiAg
IDwlIH0pOyAlPiIpO2UucHVzaCgiPC9vbD4iKTtlLnB1c2goJyAgPGRpdiA9CmNsYXNzPTNEImFs
ZXJ0IGFsZXJ0LXdhcm5pbmciPlRoaXMgaXMgYW4gZXhwaXJlZCB2ZXJzaW9uIG9mIHRoZSBsaWJy
YXJ5IGRhdD0KYXNldDogPCU9M0QgXy5lc2NhcGUoaXRlbS5nZXQoIm5hbWUiKSkgJT48L2Rpdj4n
KTtlLnB1c2goJzxkaXYgY2xhc3M9M0QiZGF0PQphc2V0X3RhYmxlIj4nKTtlLnB1c2goJyAgIDx0
YWJsZSBjbGFzcz0zRCJncmlkIHRhYmxlIHRhYmxlLXN0cmlwZWQgdGFibGUtY289Cm5kZW5zZWQi
PicpO2UucHVzaCgiICAgICAgIDx0cj4iKTtlLnB1c2goJyAgICAgICAgICAgPHRoIHNjb3BlPTNE
InJvdyIgaWQ9Cj0zRCJpZF9yb3ciIGRhdGEtaWQ9M0QiPCU9M0QgXy5lc2NhcGUobGRkYS5pZCkg
JT4iPk5hbWU8L3RoPicpO2UucHVzaCgnICAgID0KICAgICAgIDx0ZD48JT0zRCBfLmVzY2FwZShs
ZGRhLmdldCgibmFtZSIpKSAlPjwvdGQ+Jyk7ZS5wdXNoKCIgICAgICAgPC90cj4iPQopO2UucHVz
aCgnICAgPCUgaWYgKGxkZGEuZ2V0KCJmaWxlX2V4dCIpKSB7ICU+Jyk7ZS5wdXNoKCIgICAgICAg
PHRyPiIpO2UucHU9CnNoKCcgICAgICAgICAgIDx0aCBzY29wZT0zRCJyb3ciPkRhdGEgdHlwZTwv
dGg+Jyk7ZS5wdXNoKCcgICAgICAgICAgIDx0ZD48JT0KPTNEIF8uZXNjYXBlKGxkZGEuZ2V0KCJm
aWxlX2V4dCIpKSAlPjwvdGQ+Jyk7ZS5wdXNoKCIgICAgICAgPC90cj4iKTtlLnB1c2goPQoiICAg
PCUgfSAlPiIpO2UucHVzaCgnICAgPCUgaWYgKGxkZGEuZ2V0KCJnZW5vbWVfYnVpbGQiKSkgeyAl
PicpO2UucHVzaCgiICA9CiAgICAgPHRyPiIpO2UucHVzaCgnICAgICAgICAgICA8dGggc2NvcGU9
M0Qicm93Ij5HZW5vbWUgYnVpbGQ8L3RoPicpO2UucHVzaD0KKCcgICAgICAgICAgIDx0ZD48JT0z
RCBfLmVzY2FwZShsZGRhLmdldCgiZ2Vub21lX2J1aWxkIikpICU+PC90ZD4nKTtlLnB1c2goPQoi
ICAgICAgIDwvdHI+Iik7ZS5wdXNoKCIgICA8JSB9ICU+Iik7ZS5wdXNoKCcgICA8JSBpZiAobGRk
YS5nZXQoImZpbGVfc2l6ZSI9CikpIHsgJT4nKTtlLnB1c2goIiAgICAgICA8dHI+Iik7ZS5wdXNo
KCcgICAgICAgICAgIDx0aCBzY29wZT0zRCJyb3ciPlNpemU8Lz0KdGg+Jyk7ZS5wdXNoKCcgICAg
ICAgICAgIDx0ZD48JT0zRCBfLmVzY2FwZShsZGRhLmdldCgiZmlsZV9zaXplIikpICU+PC90ZD4n
PQopO2UucHVzaCgiICAgICAgIDwvdHI+Iik7ZS5wdXNoKCIgICA8JSB9ICU+Iik7ZS5wdXNoKCcg
ICA8JSBpZiAobGRkYS5nZXQoImQ9CmF0ZV91cGxvYWRlZCIpKSB7ICU+Jyk7ZS5wdXNoKCIgICAg
ICAgPHRyPiIpO2UucHVzaCgnICAgICAgICAgICA8dGggc2NvcGU9Cj0zRCJyb3ciPkRhdGUgdXBs
b2FkZWQgKFVUQyk8L3RoPicpO2UucHVzaCgnICAgICAgICAgICA8dGQ+PCU9M0QgXy5lc2NhcGUo
bD0KZGRhLmdldCgiZGF0ZV91cGxvYWRlZCIpKSAlPjwvdGQ+Jyk7ZS5wdXNoKCIgICAgICAgPC90
cj4iKTtlLnB1c2goIiAgIDwlIH0gPQolPiIpO2UucHVzaCgnICAgPCUgaWYgKGxkZGEuZ2V0KCJ1
cGxvYWRlZF9ieSIpKSB7ICU+Jyk7ZS5wdXNoKCIgICAgICAgPHRyPiI9Cik7ZS5wdXNoKCcgICAg
ICAgICAgIDx0aCBzY29wZT0zRCJyb3ciPlVwbG9hZGVkIGJ5PC90aD4nKTtlLnB1c2goJyAgICAg
ICAgID0KICA8dGQ+PCU9M0QgXy5lc2NhcGUobGRkYS5nZXQoInVwbG9hZGVkX2J5IikpICU+PC90
ZD4nKTtlLnB1c2goIiAgICAgICA8L3RyPQo+Iik7ZS5wdXNoKCIgICA8JSB9ICU+Iik7ZS5wdXNo
KCcgICA8JSBpZiAobGRkYS5nZXQoIm1ldGFkYXRhX2RhdGFfbGluZXMiKSk9CiB7ICU+Jyk7ZS5w
dXNoKCIgICAgICAgPHRyPiIpO2UucHVzaCgnICAgICAgICAgICA8dGggc2NvcGU9M0Qicm93Ij5E
YXRhIExpbj0KZXM8L3RoPicpO2UucHVzaCgnICAgICAgICAgICA8dGQgc2NvcGU9M0Qicm93Ij48
JT0zRCBfLmVzY2FwZShsZGRhLmdldCgibWV0PQphZGF0YV9kYXRhX2xpbmVzIikpICU+PC90ZD4n
KTtlLnB1c2goIiAgICAgICA8L3RyPiIpO2UucHVzaCgiICAgPCUgfSAlPiIpO2U9Ci5wdXNoKCcg
ICA8JSBpZiAobGRkYS5nZXQoIm1ldGFkYXRhX2NvbW1lbnRfbGluZXMiKSkgeyAlPicpO2UucHVz
aCgiICAgICAgID0KPHRyPiIpO2UucHVzaCgnICAgICAgICAgICA8dGggc2NvcGU9M0Qicm93Ij5D
b21tZW50IExpbmVzPC90aD4nKTtlLnB1c2goJyAgPQogICAgICAgICA8dGQgc2NvcGU9M0Qicm93
Ij48JT0zRCBfLmVzY2FwZShsZGRhLmdldCgibWV0YWRhdGFfY29tbWVudF9saW5lcyI9CikpICU+
PC90ZD4nKTtlLnB1c2goIiAgICAgICA8L3RyPiIpO2UucHVzaCgiICAgPCUgfSAlPiIpO2UucHVz
aCgnICAgPCUgaWYgKD0KbGRkYS5nZXQoIm1ldGFkYXRhX2NvbHVtbnMiKSkgeyAlPicpO2UucHVz
aCgiICAgICAgIDx0cj4iKTtlLnB1c2goJyAgICAgICAgPQogICA8dGggc2NvcGU9M0Qicm93Ij5O
dW1iZXIgb2YgQ29sdW1uczwvdGg+Jyk7ZS5wdXNoKCcgICAgICAgICAgIDx0ZCBzY29wZT0KPTNE
InJvdyI+PCU9M0QgXy5lc2NhcGUobGRkYS5nZXQoIm1ldGFkYXRhX2NvbHVtbnMiKSkgJT48L3Rk
PicpO2UucHVzaCgiICAgPQogICAgPC90cj4iKTtlLnB1c2goIiAgIDwlIH0gJT4iKTtlLnB1c2go
JyAgIDwlIGlmIChsZGRhLmdldCgibWV0YWRhdGFfY29sdW09Cm5fdHlwZXMiKSkgeyAlPicpO2Uu
cHVzaCgiICAgICAgIDx0cj4iKTtlLnB1c2goJyAgICAgICAgICAgPHRoIHNjb3BlPTNEInJvdz0K
Ij5Db2x1bW4gVHlwZXM8L3RoPicpO2UucHVzaCgnICAgICAgICAgICA8dGQgc2NvcGU9M0Qicm93
Ij48JT0zRCBfLmVzY2FwZShsPQpkZGEuZ2V0KCJtZXRhZGF0YV9jb2x1bW5fdHlwZXMiKSkgJT48
L3RkPicpO2UucHVzaCgiICAgICAgIDwvdHI+Iik7ZS5wdXNoKCI9CiAgIDwlIH0gJT4iKTtlLnB1
c2goJyAgIDwlIGlmIChsZGRhLmdldCgibWVzc2FnZSIpKSB7ICU+Jyk7ZS5wdXNoKCIgICAgICAg
PD0KdHI+Iik7ZS5wdXNoKCcgICAgICAgICAgIDx0aCBzY29wZT0zRCJyb3ciPk1lc3NhZ2U8L3Ro
PicpO2UucHVzaCgnICAgICAgICAgPQogIDx0ZCBzY29wZT0zRCJyb3ciPjwlPTNEIF8uZXNjYXBl
KGxkZGEuZ2V0KCJtZXNzYWdlIikpICU+PC90ZD4nKTtlLnB1c2goIiA9CiAgICAgIDwvdHI+Iik7
ZS5wdXNoKCIgICA8JSB9ICU+Iik7ZS5wdXNoKCcgICA8JSBpZiAobGRkYS5nZXQoIm1pc2NfYmx1
cmIiKT0KKSB7ICU+Jyk7ZS5wdXNoKCIgICAgICAgPHRyPiIpO2UucHVzaCgnICAgICAgICAgICA8
dGggc2NvcGU9M0Qicm93Ij5NaXNjZWxsPQphbmVvdXMgYmx1cmI8L3RoPicpO2UucHVzaCgnICAg
ICAgICAgICA8dGQgc2NvcGU9M0Qicm93Ij48JT0zRCBfLmVzY2FwZShsZGQ9CmEuZ2V0KCJtaXNj
X2JsdXJiIikpICU+PC90ZD4nKTtlLnB1c2goIiAgICAgICA8L3RyPiIpO2UucHVzaCgiICAgPCUg
fSAlPiIpOz0KZS5wdXNoKCcgICA8JSBpZiAobGRkYS5nZXQoIm1pc2NfaW5mbyIpKSB7ICU+Jyk7
ZS5wdXNoKCIgICAgICAgPHRyPiIpO2UucHVzPQpoKCcgICAgICAgICAgIDx0aCBzY29wZT0zRCJy
b3ciPk1pc2NlbGxhbmVvdXMgaW5mb3JtYXRpb248L3RoPicpO2UucHVzaCgnICA9CiAgICAgICAg
IDx0ZCBzY29wZT0zRCJyb3ciPjwlPTNEIF8uZXNjYXBlKGxkZGEuZ2V0KCJtaXNjX2luZm8iKSkg
JT48L3RkPicpOz0KZS5wdXNoKCIgICAgICAgPC90cj4iKTtlLnB1c2goIiAgIDwlIH0gJT4iKTtl
LnB1c2goIiAgICA8L3RhYmxlPiIpO2UucHVzaCgiPQogICAgPGRpdj4iKTtlLnB1c2goJyAgICAg
ICAgPHByZSBjbGFzcz0zRCJwZWVrIj4nKTtlLnB1c2goIiAgICAgICAgPC9wcmU+Iik9CjtlLnB1
c2goIiAgICA8L2Rpdj4iKTtlLnB1c2goIjwvZGl2PiIpO2UucHVzaCgiPC9kaXY+Iik7cmV0dXJu
IF8udGVtcGxhdGUoZT0KLmpvaW4oIiIpKX0sdGVtcGxhdGVNb2RpZnlEYXRhc2V0OmZ1bmN0aW9u
KCl7dmFyIGU9M0RbXTtlLnB1c2goJzxkaXYgY2xhc3M9Cj0zRCJsaWJyYXJ5X3N0eWxlX2NvbnRh
aW5lciI+Jyk7ZS5wdXNoKCcgIDxkaXYgaWQ9M0QibGlicmFyeV90b29sYmFyIj4nKTtlLj0KcHVz
aCgnICAgPGJ1dHRvbiBkYXRhLXRvZ2dsZT0zRCJ0b29sdGlwIiBkYXRhLXBsYWNlbWVudD0zRCJ0
b3AiIHRpdGxlPTNEIkNhPQpuY2VsIG1vZGlmaWNhdGlvbnMiIGNsYXNzPTNEImJ0biBidG4tZGVm
YXVsdCB0b29sYnRuX2NhbmNlbF9tb2RpZmljYXRpb25zIHA9CnJpbWFyeS1idXR0b24iIHR5cGU9
M0QiYnV0dG9uIj48c3BhbiBjbGFzcz0zRCJmYSBmYS10aW1lcyI+PC9zcGFuPiBDYW5jZWw8Lz0K
c3Bhbj48L2J1dHRvbj4nKTtlLnB1c2goJyAgIDxidXR0b24gZGF0YS10b2dnbGU9M0QidG9vbHRp
cCIgZGF0YS1wbGFjZW1lbnQ9Cj0zRCJ0b3AiIHRpdGxlPTNEIlNhdmUgbW9kaWZpY2F0aW9ucyIg
Y2xhc3M9M0QiYnRuIGJ0bi1kZWZhdWx0IHRvb2xidG5fc2F2ZT0KX21vZGlmaWNhdGlvbnMgcHJp
bWFyeS1idXR0b24iIHR5cGU9M0QiYnV0dG9uIj48c3BhbiBjbGFzcz0zRCJmYSBmYS1mbG9wcHkt
PQpvIj48L3NwYW4+IFNhdmU8L3NwYW4+PC9idXR0b24+Jyk7ZS5wdXNoKCIgIDwvZGl2PiIpO2Uu
cHVzaCgnPG9sIGNsYXNzPTNEImI9CnJlYWRjcnVtYiI+Jyk7ZS5wdXNoKCcgICA8bGk+PGEgdGl0
bGU9M0QiUmV0dXJuIHRvIHRoZSBsaXN0IG9mIGxpYnJhcmllcyIgaD0KcmVmPTNEIiMiPkxpYnJh
cmllczwvYT48L2xpPicpO2UucHVzaCgnICAgPCUgXy5lYWNoKGl0ZW0uZ2V0KCJmdWxsX3BhdGgi
KSwgPQpmdW5jdGlvbihwYXRoX2l0ZW0pIHsgJT4nKTtlLnB1c2goIiAgIDwlIGlmIChwYXRoX2l0
ZW1bMF0gIT0zRCBpdGVtLmlkKSB7ICU9Cj4iKTtlLnB1c2goJyAgIDxsaT48YSB0aXRsZT0zRCJS
ZXR1cm4gdG8gdGhpcyBmb2xkZXIiIGhyZWY9M0QiIy9mb2xkZXJzLzwlLT0KIHBhdGhfaXRlbVsw
XSAlPiI+PCUtIHBhdGhfaXRlbVsxXSAlPjwvYT48L2xpPiAnKTtlLnB1c2goIjwlIH0gZWxzZSB7
ICU+Iik7PQplLnB1c2goJyAgIDxsaSBjbGFzcz0zRCJhY3RpdmUiPjxzcGFuIHRpdGxlPTNEIllv
dSBhcmUgaGVyZSI+PCUtIHBhdGhfaXRlbVs9CjFdICU+PC9zcGFuPjwvbGk+Jyk7ZS5wdXNoKCIg
ICA8JSB9ICU+Iik7ZS5wdXNoKCIgICA8JSB9KTsgJT4iKTtlLnB1c2goIjwvbz0KbD4iKTtlLnB1
c2goJzxkaXYgY2xhc3M9M0QiZGF0YXNldF90YWJsZSI+Jyk7ZS5wdXNoKCc8cD5Gb3IgbW9yZSBl
ZGl0aW5nIG9wPQp0aW9ucyBwbGVhc2UgaW1wb3J0IHRoZSBkYXRhc2V0IHRvIGhpc3RvcnkgYW5k
IHVzZSAiRWRpdCBhdHRyaWJ1dGVzIiBvbiBpdC49CjwvcD4nKTtlLnB1c2goJyAgIDx0YWJsZSBj
bGFzcz0zRCJncmlkIHRhYmxlIHRhYmxlLXN0cmlwZWQgdGFibGUtY29uZGVuc2VkIj0KPicpO2Uu
cHVzaCgiICAgICAgIDx0cj4iKTtlLnB1c2goJyAgICAgICAgICAgPHRoIHNjb3BlPTNEInJvdyIg
aWQ9M0QiaWRfcm93PQoiIGRhdGEtaWQ9M0QiPCU9M0QgXy5lc2NhcGUoaXRlbS5nZXQoImxkZGFf
aWQiKSkgJT4iPk5hbWU8L3RoPicpO2UucHVzaCgnICA9CiAgICAgICAgIDx0ZD48aW5wdXQgY2xh
c3M9M0QiaW5wdXRfZGF0YXNldF9uYW1lIGZvcm0tY29udHJvbCIgdHlwZT0zRCJ0ZXh0Ij0KIHBs
YWNlaG9sZGVyPTNEIm5hbWUiIHZhbHVlPTNEIjwlPTNEIF8uZXNjYXBlKGl0ZW0uZ2V0KCJuYW1l
IikpICU+Ij48L3RkPicpPQo7ZS5wdXNoKCIgICAgICAgPC90cj4iKTtlLnB1c2goIiAgICAgICA8
dHI+Iik7ZS5wdXNoKCcgICAgICAgICAgIDx0aCBzY29wZT0KPTNEInJvdyI+RGF0YSB0eXBlPC90
aD4nKTtlLnB1c2goJyAgICAgICAgICAgPHRkPjwlPTNEIF8uZXNjYXBlKGl0ZW0uZ2V0KCJmPQpp
bGVfZXh0IikpICU+PC90ZD4nKTtlLnB1c2goIiAgICAgICA8L3RyPiIpO2UucHVzaCgiICAgICAg
IDx0cj4iKTtlLnB1c2goJyA9CiAgICAgICAgICA8dGggc2NvcGU9M0Qicm93Ij5HZW5vbWUgYnVp
bGQ8L3RoPicpO2UucHVzaCgnICAgICAgICAgICA8dGQ+PCU9Cj0zRCBfLmVzY2FwZShpdGVtLmdl
dCgiZ2Vub21lX2J1aWxkIikpICU+PC90ZD4nKTtlLnB1c2goIiAgICAgICA8L3RyPiIpO2UucD0K
dXNoKCIgICAgICAgPHRyPiIpO2UucHVzaCgnICAgICAgICAgICA8dGggc2NvcGU9M0Qicm93Ij5T
aXplPC90aD4nKTtlLnB1c2goPQonICAgICAgICAgICA8dGQ+PCU9M0QgXy5lc2NhcGUoaXRlbS5n
ZXQoImZpbGVfc2l6ZSIpKSAlPjwvdGQ+Jyk7ZS5wdXNoKCIgICA9CiAgICA8L3RyPiIpO2UucHVz
aCgiICAgICAgIDx0cj4iKTtlLnB1c2goJyAgICAgICAgICAgPHRoIHNjb3BlPTNEInJvdyI+RGF0
ZT0KIHVwbG9hZGVkIChVVEMpPC90aD4nKTtlLnB1c2goJyAgICAgICAgICAgPHRkPjwlPTNEIF8u
ZXNjYXBlKGl0ZW0uZ2V0KCJkYXRlPQpfdXBsb2FkZWQiKSkgJT48L3RkPicpO2UucHVzaCgiICAg
ICAgIDwvdHI+Iik7ZS5wdXNoKCIgICAgICAgPHRyPiIpO2UucHVzaCg9CicgICAgICAgICAgIDx0
aCBzY29wZT0zRCJyb3ciPlVwbG9hZGVkIGJ5PC90aD4nKTtlLnB1c2goJyAgICAgICAgICAgPHRk
PjwlPQo9M0QgXy5lc2NhcGUoaXRlbS5nZXQoInVwbG9hZGVkX2J5IikpICU+PC90ZD4nKTtlLnB1
c2goIiAgICAgICA8L3RyPiIpO2UucHU9CnNoKCcgICAgICAgICAgIDx0ciBzY29wZT0zRCJyb3ci
PicpO2UucHVzaCgnICAgICAgICAgICA8dGggc2NvcGU9M0Qicm93Ij5EYT0KdGEgTGluZXM8L3Ro
PicpO2UucHVzaCgnICAgICAgICAgICA8dGQgc2NvcGU9M0Qicm93Ij48JT0zRCBfLmVzY2FwZShp
dGVtLmdlPQp0KCJtZXRhZGF0YV9kYXRhX2xpbmVzIikpICU+PC90ZD4nKTtlLnB1c2goIiAgICAg
ICA8L3RyPiIpO2UucHVzaCgnICAgICAgIDw9CnRoIHNjb3BlPTNEInJvdyI+Q29tbWVudCBMaW5l
czwvdGg+Jyk7ZS5wdXNoKCcgICAgICAgICAgIDwlIGlmIChpdGVtLmdldCgibT0KZXRhZGF0YV9j
b21tZW50X2xpbmVzIikgPTNEPTNEPTNEICIiKSB7ICU+Jyk7ZS5wdXNoKCcgICAgICAgICAgICAg
ICA8dGQgc2NvPQpwZT0zRCJyb3ciPjwlPTNEIF8uZXNjYXBlKGl0ZW0uZ2V0KCJtZXRhZGF0YV9j
b21tZW50X2xpbmVzIikpICU+PC90ZD4nKTtlLnA9CnVzaCgiICAgICAgICAgICA8JSB9IGVsc2Ug
eyAlPiIpO2UucHVzaCgnICAgICAgICAgICAgICAgPHRkIHNjb3BlPTNEInJvdyI+dT0Kbmtub3du
PC90ZD4nKTtlLnB1c2goIiAgICAgICAgICAgPCUgfSAlPiIpO2UucHVzaCgiICAgICAgIDwvdHI+
Iik7ZS5wdXNoKCIgPQogICAgICA8dHI+Iik7ZS5wdXNoKCcgICAgICAgICAgIDx0aCBzY29wZT0z
RCJyb3ciPk51bWJlciBvZiBDb2x1bW5zPC90aD4nKTs9CmUucHVzaCgnICAgICAgICAgICA8dGQg
c2NvcGU9M0Qicm93Ij48JT0zRCBfLmVzY2FwZShpdGVtLmdldCgibWV0YWRhdGFfY29sdT0KbW5z
IikpICU+PC90ZD4nKTtlLnB1c2goIiAgICAgICA8L3RyPiIpO2UucHVzaCgiICAgICAgIDx0cj4i
KTtlLnB1c2goJyAgICAgPQogICAgICA8dGggc2NvcGU9M0Qicm93Ij5Db2x1bW4gVHlwZXM8L3Ro
PicpO2UucHVzaCgnICAgICAgICAgICA8dGQgc2NvcGU9M0Q9CiJyb3ciPjwlPTNEIF8uZXNjYXBl
KGl0ZW0uZ2V0KCJtZXRhZGF0YV9jb2x1bW5fdHlwZXMiKSkgJT48L3RkPicpO2UucHVzaCgiID0K
ICAgICAgPC90cj4iKTtlLnB1c2goIiAgICAgICA8dHI+Iik7ZS5wdXNoKCcgICAgICAgICAgIDx0
aCBzY29wZT0zRCJyb3ciPk1lPQpzc2FnZTwvdGg+Jyk7ZS5wdXNoKCcgICAgICAgICAgIDx0ZCBz
Y29wZT0zRCJyb3ciPjwlPTNEIF8uZXNjYXBlKGl0ZW0uZ2V0KCI9Cm1lc3NhZ2UiKSkgJT48L3Rk
PicpO2UucHVzaCgiICAgICAgIDwvdHI+Iik7ZS5wdXNoKCIgICAgICAgPHRyPiIpO2UucHVzaCgn
ID0KICAgICAgICAgIDx0aCBzY29wZT0zRCJyb3ciPk1pc2NlbGxhbmVvdXMgaW5mb3JtYXRpb248
L3RoPicpO2UucHVzaCgnICAgICAgPQogICAgIDx0ZCBzY29wZT0zRCJyb3ciPjwlPTNEIF8uZXNj
YXBlKGl0ZW0uZ2V0KCJtaXNjX2luZm8iKSkgJT48L3RkPicpO2UucHU9CnNoKCIgICAgICAgPC90
cj4iKTtlLnB1c2goIiAgICAgICA8dHI+Iik7ZS5wdXNoKCcgICAgICAgICAgIDx0aCBzY29wZT0z
RCJybz0KdyI+TWlzY2VsbGFuZW91cyBibHVyYjwvdGg+Jyk7ZS5wdXNoKCcgICAgICAgICAgIDx0
ZCBzY29wZT0zRCJyb3ciPjwlPTNEIF8uPQplc2NhcGUoaXRlbS5nZXQoIm1pc2NfYmx1cmIiKSkg
JT48L3RkPicpO2UucHVzaCgiICAgICAgIDwvdHI+Iik7ZS5wdXNoKCIgICA9CjwvdGFibGU+Iik7
ZS5wdXNoKCI8ZGl2PiIpO2UucHVzaCgnICAgPHByZSBjbGFzcz0zRCJwZWVrIj4nKTtlLnB1c2go
IiAgIDwvcD0KcmU+Iik7ZS5wdXNoKCI8L2Rpdj4iKTtlLnB1c2goIjwvZGl2PiIpO2UucHVzaCgi
PC9kaXY+Iik7cmV0dXJuIF8udGVtcGxhdGUoPQplLmpvaW4oIiIpKX0sdGVtcGxhdGVEYXRhc2V0
UGVybWlzc2lvbnM6ZnVuY3Rpb24oKXt2YXIgZT0zRFtdO2UucHVzaCgnPGRpdiA9CmNsYXNzPTNE
ImxpYnJhcnlfc3R5bGVfY29udGFpbmVyIj4nKTtlLnB1c2goJyAgPGRpdiBpZD0zRCJsaWJyYXJ5
X3Rvb2xiYXIiPj0KJyk7ZS5wdXNoKCcgICA8YSBocmVmPTNEIiNmb2xkZXJzLzwlLSBpdGVtLmdl
dCgiZm9sZGVyX2lkIikgJT4iPjxidXR0b24gZGF0PQphLXRvZ2dsZT0zRCJ0b29sdGlwIiBkYXRh
LXBsYWNlbWVudD0zRCJ0b3AiIHRpdGxlPTNEIkdvIGJhY2sgdG8gY29udGFpbmluZyA9CmZvbGRl
ciIgY2xhc3M9M0QiYnRuIGJ0bi1kZWZhdWx0IHByaW1hcnktYnV0dG9uIiB0eXBlPTNEImJ1dHRv
biI+PHNwYW4gY2xhcz0Kcz0zRCJmYSBmYS1mb2xkZXItb3Blbi1vIj48L3NwYW4+IENvbnRhaW5p
bmcgRm9sZGVyPC9zcGFuPjwvYnV0dG9uPjwvYT4nKTtlPQoucHVzaCgnICAgPGEgaHJlZj0zRCIj
Zm9sZGVycy88JS0gaXRlbS5nZXQoImZvbGRlcl9pZCIpICU+L2RhdGFzZXRzLzwlLSBpdGU9Cm0u
aWQgJT4iPjxidXR0b24gZGF0YS10b2dnbGU9M0QidG9vbHRpcCIgZGF0YS1wbGFjZW1lbnQ9M0Qi
dG9wIiB0aXRsZT0zRCJHbz0KIGJhY2sgdG8gZGF0YXNldCIgY2xhc3M9M0QiYnRuIGJ0bi1kZWZh
dWx0IHByaW1hcnktYnV0dG9uIiB0eXBlPTNEImJ1dHRvbiI+PQo8c3BhbiBjbGFzcz0zRCJmYSBm
YS1maWxlLW8iPjwvc3Bhbj4gRGF0YXNldCBEZXRhaWxzPC9zcGFuPjwvYnV0dG9uPjxhPicpO2U9
Ci5wdXNoKCIgIDwvZGl2PiIpO2UucHVzaCgnPG9sIGNsYXNzPTNEImJyZWFkY3J1bWIiPicpO2Uu
cHVzaCgnICAgPGxpPjxhIHRpdD0KbGU9M0QiUmV0dXJuIHRvIHRoZSBsaXN0IG9mIGxpYnJhcmll
cyIgaHJlZj0zRCIjIj5MaWJyYXJpZXM8L2E+PC9saT4nKTtlLnB1PQpzaCgnICAgPCUgXy5lYWNo
KGl0ZW0uZ2V0KCJmdWxsX3BhdGgiKSwgZnVuY3Rpb24ocGF0aF9pdGVtKSB7ICU+Jyk7ZS5wdXNo
KCI9CiAgIDwlIGlmIChwYXRoX2l0ZW1bMF0gIT0zRCBpdGVtLmlkKSB7ICU+Iik7ZS5wdXNoKCcg
ICA8bGk+PGEgdGl0bGU9M0QiUmV0dT0Kcm4gdG8gdGhpcyBmb2xkZXIiIGhyZWY9M0QiIy9mb2xk
ZXJzLzwlLSBwYXRoX2l0ZW1bMF0gJT4iPjwlLSBwYXRoX2l0ZW1bMV0gPQolPjwvYT48L2xpPiAn
KTtlLnB1c2goIjwlIH0gZWxzZSB7ICU+Iik7ZS5wdXNoKCcgICA8bGkgY2xhc3M9M0QiYWN0aXZl
Ij48c3A9CmFuIHRpdGxlPTNEIllvdSBhcmUgaGVyZSI+PCUtIHBhdGhfaXRlbVsxXSAlPjwvc3Bh
bj48L2xpPicpO2UucHVzaCgiICAgPCUgfT0KICU+Iik7ZS5wdXNoKCIgICA8JSB9KTsgJT4iKTtl
LnB1c2goIjwvb2w+Iik7ZS5wdXNoKCc8aDE+RGF0YXNldDogPCU9M0QgXy5lPQpzY2FwZShpdGVt
LmdldCgibmFtZSIpKSAlPjwvaDE+Jyk7ZS5wdXNoKCc8ZGl2IGNsYXNzPTNEImFsZXJ0IGFsZXJ0
LXdhcm5pbmc9CiI+Jyk7ZS5wdXNoKCI8JSBpZiAoaXNfYWRtaW4pIHsgJT4iKTtlLnB1c2goIllv
dSBhcmUgbG9nZ2VkIGluIGFzIGFuIDxzdHJvbj0KZz5hZG1pbmlzdHJhdG9yPC9zdHJvbmc+IHRo
ZXJlZm9yZSB5b3UgY2FuIG1hbmFnZSBhbnkgZGF0YXNldCBvbiB0aGlzIEdhbGF4PQp5IGluc3Rh
bmNlLiBQbGVhc2UgbWFrZSBzdXJlIHlvdSB1bmRlcnN0YW5kIHRoZSBjb25zZXF1ZW5jZXMuIik7
ZS5wdXNoKCI8JSA9Cn0gZWxzZSB7ICU+Iik7ZS5wdXNoKCJZb3UgY2FuIGFzc2lnbiBhbnkgbnVt
YmVyIG9mIHJvbGVzIHRvIGFueSBvZiB0aGUgZm9sbD0Kb3dpbmcgcGVybWlzc2lvbiB0eXBlcy4g
SG93ZXZlciBwbGVhc2UgcmVhZCBjYXJlZnVsbHkgdGhlIGltcGxpY2F0aW9ucyBvZiBzPQp1Y2gg
YWN0aW9ucy4iKTtlLnB1c2goIjwlIH0gJT4iKTtlLnB1c2goIjwvZGl2PiIpO2UucHVzaCgnPGRp
diBjbGFzcz0zRCJkYXQ9CmFzZXRfdGFibGUiPicpO2UucHVzaCgiPGgyPkxpYnJhcnktcmVsYXRl
ZCBwZXJtaXNzaW9uczwvaDI+Iik7ZS5wdXNoKCI8aDQ+Uj0Kb2xlcyB0aGF0IGNhbiBtb2RpZnkg
dGhlIGxpYnJhcnkgaXRlbTwvaDQ+Iik7ZS5wdXNoKCc8ZGl2IGlkPTNEIm1vZGlmeV9wZXJtPQoi
IGNsYXNzPTNEIm1vZGlmeV9wZXJtIHJvbGVzLXNlbGVjdGlvbiI+PC9kaXY+Jyk7ZS5wdXNoKCc8
ZGl2IGNsYXNzPTNEImFsZXI9CnQgYWxlcnQtaW5mbyByb2xlcy1zZWxlY3Rpb24iPlVzZXIgd2l0
aCA8c3Ryb25nPmFueTwvc3Ryb25nPiBvZiB0aGVzZSByb2xlcz0KIGNhbiBtb2RpZnkgbmFtZSwg
bWV0YWRhdGEsIGFuZCBvdGhlciBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGxpYnJhcnkgaXRlbS48
PQovZGl2PicpO2UucHVzaCgiPGhyLz4iKTtlLnB1c2goIjxoMj5EYXRhc2V0LXJlbGF0ZWQgcGVy
bWlzc2lvbnM8L2gyPiIpO2UucHU9CnNoKCc8ZGl2IGNsYXNzPTNEImFsZXJ0IGFsZXJ0LXdhcm5p
bmciPkNoYW5nZXMgbWFkZSBiZWxvdyB3aWxsIGFmZmVjdCA8c3Rybz0Kbmc+ZXZlcnk8L3N0cm9u
Zz4gbGlicmFyeSBpdGVtIHRoYXQgd2FzIGNyZWF0ZWQgZnJvbSB0aGlzIGRhdGFzZXQgYW5kIGFs
c28gPQpldmVyeSBoaXN0b3J5IHRoaXMgZGF0YXNldCBpcyBwYXJ0IG9mLjwvZGl2PicpO2UucHVz
aCgnPCUgaWYgKCFpdGVtLmdldCgiaXM9Cl91bnJlc3RyaWN0ZWQiKSkgeyAlPicpO2UucHVzaCgi
IDxwPllvdSBjYW4gcmVtb3ZlIGFsbCBhY2Nlc3MgcmVzdHJpY3Rpb25zID0Kb24gdGhpcyBkYXRh
c2V0LiAiKTtlLnB1c2goJyA8YnV0dG9uIGRhdGEtdG9nZ2xlPTNEInRvb2x0aXAiIGRhdGEtcGxh
Y2VtZW50PQo9M0QidG9wIiB0aXRsZT0zRCJFdmVyeWJvZHkgd2lsbCBiZSBhYmxlIHRvIGFjY2Vz
cyB0aGUgZGF0YXNldC4iIGNsYXNzPTNEImI9CnRuIGJ0bi1kZWZhdWx0IGJ0bi1yZW1vdmUtcmVz
dHJpY3Rpb25zIHByaW1hcnktYnV0dG9uIiB0eXBlPTNEImJ1dHRvbiI+Jyk7ZT0KLnB1c2goJyA8
c3BhbiBjbGFzcz0zRCJmYSBmYS1nbG9iZSI+IFJlbW92ZSByZXN0cmljdGlvbnM8L3NwYW4+Jyk7
ZS5wdXNoKCIgPQo8L2J1dHRvbj4iKTtlLnB1c2goIiA8L3A+Iik7ZS5wdXNoKCI8JSB9IGVsc2Ug
eyAlPiIpO2UucHVzaCgiICBUaGlzIGRhdGFzZXQ9CiBpcyB1bnJlc3RyaWN0ZWQgc28gZXZlcnli
b2R5IGNhbiBhY2Nlc3MgaXQuIEp1c3Qgc2hhcmUgdGhlIFVSTCBvZiB0aGlzIHBhZz0KZS4iKTtl
LnB1c2goJyAgPGJ1dHRvbiBkYXRhLXRvZ2dsZT0zRCJ0b29sdGlwIiBkYXRhLXBsYWNlbWVudD0z
RCJ0b3AiIHRpdGxlPQo9M0QiQ29weSB0byBjbGlwYm9hcmQiIGNsYXNzPTNEImJ0biBidG4tZGVm
YXVsdCBidG4tY29weS1saW5rLXRvLWNsaXBib2FyZCA9CnByaW1hcnktYnV0dG9uIiB0eXBlPTNE
ImJ1dHRvbiI+PHNwYW4gY2xhc3M9M0QiZmEgZmEtY2xpcGJvYXJkIj4gVG8gQ2xpcGJvYT0KcmQ8
L3NwYW4+PC9idXR0b24+ICcpO2UucHVzaCgiICA8cD5Zb3UgY2FuIG1ha2UgdGhpcyBkYXRhc2V0
IHByaXZhdGUgdG8geW91PQouICIpO2UucHVzaCgnIDxidXR0b24gZGF0YS10b2dnbGU9M0QidG9v
bHRpcCIgZGF0YS1wbGFjZW1lbnQ9M0QidG9wIiB0aXRsZT0KPTNEIk9ubHkgeW91IHdpbGwgYmUg
YWJsZSB0byBhY2Nlc3MgdGhlIGRhdGFzZXQuIiBjbGFzcz0zRCJidG4gYnRuLWRlZmF1bHQgPQpi
dG4tbWFrZS1wcml2YXRlIHByaW1hcnktYnV0dG9uIiB0eXBlPTNEImJ1dHRvbiI+PHNwYW4gY2xh
c3M9M0QiZmEgZmEta2V5Ij49CiBNYWtlIFByaXZhdGU8L3NwYW4+PC9idXR0b24+Jyk7ZS5wdXNo
KCIgPC9wPiIpO2UucHVzaCgiPCUgfSAlPiIpO2UucHVzaCgiPD0KaDQ+Um9sZXMgdGhhdCBjYW4g
YWNjZXNzIHRoZSBkYXRhc2V0PC9oND4iKTtlLnB1c2goJzxkaXYgaWQ9M0QiYWNjZXNzX3Blcm0i
PQogY2xhc3M9M0QiYWNjZXNzX3Blcm0gcm9sZXMtc2VsZWN0aW9uIj48L2Rpdj4nKTtlLnB1c2go
JzxkaXYgY2xhc3M9M0QiYWxlcnQ9CiBhbGVydC1pbmZvIHJvbGVzLXNlbGVjdGlvbiI+VXNlciBo
YXMgdG8gaGF2ZSA8c3Ryb25nPmFsbCB0aGVzZSByb2xlczwvc3Rybz0Kbmc+IGluIG9yZGVyIHRv
IGFjY2VzcyB0aGlzIGRhdGFzZXQuIFVzZXJzIHdpdGhvdXQgYWNjZXNzIHBlcm1pc3Npb24gPHN0
cm9uPQpnPmNhbm5vdDwvc3Ryb25nPiBoYXZlIG90aGVyIHBlcm1pc3Npb25zIG9uIHRoaXMgZGF0
YXNldC4gSWYgdGhlcmUgYXJlIG5vIGE9CmNjZXNzIHJvbGVzIHNldCBvbiB0aGUgZGF0YXNldCBp
dCBpcyBjb25zaWRlcmVkIDxzdHJvbmc+dW5yZXN0cmljdGVkPC9zdHJvbj0KZz4uPC9kaXY+Jyk7
ZS5wdXNoKCI8aDQ+Um9sZXMgdGhhdCBjYW4gbWFuYWdlIHBlcm1pc3Npb25zIG9uIHRoZSBkYXRh
c2V0PC9oPQo0PiIpO2UucHVzaCgnPGRpdiBpZD0zRCJtYW5hZ2VfcGVybSIgY2xhc3M9M0QibWFu
YWdlX3Blcm0gcm9sZXMtc2VsZWN0aW9uIj49CjwvZGl2PicpO2UucHVzaCgnPGRpdiBjbGFzcz0z
RCJhbGVydCBhbGVydC1pbmZvIHJvbGVzLXNlbGVjdGlvbiI+VXNlciB3aXRoID0KPHN0cm9uZz5h
bnk8L3N0cm9uZz4gb2YgdGhlc2Ugcm9sZXMgY2FuIG1hbmFnZSBwZXJtaXNzaW9ucyBvZiB0aGlz
IGRhdGFzZXQuPQogSWYgeW91IHJlbW92ZSB5b3Vyc2VsZiB5b3Ugd2lsbCBsb29zZSB0aGUgYWJp
bGl0eSBtYW5hZ2UgdGhpcyBkYXRhc2V0IHVubGU9CnNzIHlvdSBhcmUgYW4gYWRtaW4uPC9kaXY+
Jyk7ZS5wdXNoKCc8YnV0dG9uIGRhdGEtdG9nZ2xlPTNEInRvb2x0aXAiIGRhdGEtcD0KbGFjZW1l
bnQ9M0QidG9wIiB0aXRsZT0zRCJTYXZlIG1vZGlmaWNhdGlvbnMgbWFkZSBvbiB0aGlzIHBhZ2Ui
IGNsYXNzPTNEImJ0PQpuIGJ0bi1kZWZhdWx0IHRvb2xidG5fc2F2ZV9wZXJtaXNzaW9ucyBwcmlt
YXJ5LWJ1dHRvbiIgdHlwZT0zRCJidXR0b24iPjxzcGE9Cm4gY2xhc3M9M0QiZmEgZmEtZmxvcHB5
LW8iPjwvc3Bhbj4gU2F2ZTwvc3Bhbj48L2J1dHRvbj4nKTtlLnB1c2goIjwvZGl2PiIpOz0KZS5w
dXNoKCI8L2Rpdj4iKTtyZXR1cm4gXy50ZW1wbGF0ZShlLmpvaW4oIiIpKX0sdGVtcGxhdGVCdWxr
SW1wb3J0SW5Nb2RhbDpmPQp1bmN0aW9uKCl7dmFyIGU9M0RbXTtlLnB1c2goJzxzcGFuIGlkPTNE
Imhpc3RvcnlfbW9kYWxfY29tYm9fYnVsayIgc3R5bGU9M0Q9CiJ3aWR0aDo5MCU7IG1hcmdpbi1s
ZWZ0OiAxZW07IG1hcmdpbi1yaWdodDogMWVtOyAiPicpO2UucHVzaCgiU2VsZWN0IGhpc3Rvcj0K
eTogIik7ZS5wdXNoKCc8c2VsZWN0IGlkPTNEImRhdGFzZXRfaW1wb3J0X3NpbmdsZSIgbmFtZT0z
RCJkYXRhc2V0X2ltcG9ydF9zPQppbmdsZSIgc3R5bGU9M0Qid2lkdGg6NTAlOyBtYXJnaW4tYm90
dG9tOiAxZW07ICI+ICcpO2UucHVzaCgiICAgPCUgXy5lYWNoKGg9CmlzdG9yaWVzLCBmdW5jdGlv
bihoaXN0b3J5KSB7ICU+Iik7ZS5wdXNoKCcgICAgICAgPG9wdGlvbiB2YWx1ZT0zRCI8JT0zRCBf
Lj0KZXNjYXBlKGhpc3RvcnkuZ2V0KCJpZCIpKSAlPiI+PCU9M0QgXy5lc2NhcGUoaGlzdG9yeS5n
ZXQoIm5hbWUiKSkgJT48L29wdGlvPQpuPicpO2UucHVzaCgiICAgPCUgfSk7ICU+Iik7ZS5wdXNo
KCI8L3NlbGVjdD4iKTtlLnB1c2goIjwvc3Bhbj4iKTtyZXR1cm4gXy49CnRlbXBsYXRlKGUuam9p
bigiIikpfSx0ZW1wbGF0ZUFjY2Vzc1NlbGVjdDpmdW5jdGlvbigpe3ZhciBlPTNEW107ZS5wdXNo
KCc8cz0KZWxlY3QgaWQ9M0QiYWNjZXNzX3NlbGVjdCIgbXVsdGlwbGU+Jyk7ZS5wdXNoKCIgICA8
JSBfLmVhY2gob3B0aW9ucywgZnVuY3RpPQpvbihvcHRpb24pIHsgJT4iKTtlLnB1c2goJyAgICAg
ICA8b3B0aW9uIHZhbHVlPTNEIjwlLSBvcHRpb24ubmFtZSAlPiI+PCUtIG89CnB0aW9uLm5hbWUg
JT48L29wdGlvbj4nKTtlLnB1c2goIiAgIDwlIH0pOyAlPiIpO2UucHVzaCgiPC9zZWxlY3Q+Iik7
cmV0dXJuID0KXy50ZW1wbGF0ZShlLmpvaW4oIiIpKX19KTtyZXR1cm57TGlicmFyeURhdGFzZXRW
aWV3OmF9fSk7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorZGVmaW5lKFsibGlicy90b2Fz
dHIiLCJtdmMvbGlicmFyeS9saWJyYXJ5LW1vZGVsIiwibXZjL3VpL3VpLXNlbGVjdCJdLGZ1bmM9
CnRpb24oZCxjLGIpe3ZhciBhPTNEQmFja2JvbmUuVmlldy5leHRlbmQoe2VsOiIjY2VudGVyIixt
b2RlbDpudWxsLG9wdGlvbnM6ez0KfSxldmVudHM6eyJjbGljayAudG9vbGJ0bl9tb2RpZnlfZGF0
YXNldCI6ImVuYWJsZU1vZGlmaWNhdGlvbiIsImNsaWNrIC50b29sPQpidG5fY2FuY2VsX21vZGlm
aWNhdGlvbnMiOiJyZW5kZXIiLCJjbGljayAudG9vbGJ0bi1kb3dubG9hZC1kYXRhc2V0IjoiZG93
bmw9Cm9hZERhdGFzZXQiLCJjbGljayAudG9vbGJ0bi1pbXBvcnQtZGF0YXNldCI6ImltcG9ydElu
dG9IaXN0b3J5IiwiY2xpY2sgLnRvbz0KbGJ0bi1zaGFyZS1kYXRhc2V0Ijoic2hhcmVEYXRhc2V0
IiwiY2xpY2sgLmJ0bi1jb3B5LWxpbmstdG8tY2xpcGJvYXJkIjoiY29wPQp5VG9DbGlwYm9hcmQi
LCJjbGljayAuYnRuLW1ha2UtcHJpdmF0ZSI6Im1ha2VEYXRhc2V0UHJpdmF0ZSIsImNsaWNrIC5i
dG4tcmU9Cm1vdmUtcmVzdHJpY3Rpb25zIjoicmVtb3ZlRGF0YXNldFJlc3RyaWN0aW9ucyIsImNs
aWNrIC50b29sYnRuX3NhdmVfcGVybWlzcz0KaW9ucyI6InNhdmVQZXJtaXNzaW9ucyIsImNsaWNr
IC50b29sYnRuX3NhdmVfbW9kaWZpY2F0aW9ucyI6ImNvbWluZ1Nvb24iLH0sPQppbml0aWFsaXpl
OmZ1bmN0aW9uKGUpe3RoaXMub3B0aW9ucz0zRF8uZXh0ZW5kKHRoaXMub3B0aW9ucyxlKTtpZih0
aGlzLm9wdGk9Cm9ucy5pZCl7dGhpcy5mZXRjaERhdGFzZXQoKX19LGZldGNoRGF0YXNldDpmdW5j
dGlvbihlKXt0aGlzLm9wdGlvbnM9M0RfLmV4dD0KZW5kKHRoaXMub3B0aW9ucyxlKTt0aGlzLm1v
ZGVsPTNEbmV3IGMuSXRlbSh7aWQ6dGhpcy5vcHRpb25zLmlkfSk7dmFyIGY9M0R0PQpoaXM7dGhp
cy5tb2RlbC5mZXRjaCh7c3VjY2VzczpmdW5jdGlvbigpe2lmKGYub3B0aW9ucy5zaG93X3Blcm1p
c3Npb25zKXtmLnM9Cmhvd1Blcm1pc3Npb25zKCl9ZWxzZXtpZihmLm9wdGlvbnMuc2hvd192ZXJz
aW9uKXtmLmZldGNoVmVyc2lvbigpfWVsc2V7Zi5yZT0KbmRlcigpfX19LGVycm9yOmZ1bmN0aW9u
KGgsZyl7aWYodHlwZW9mIGcucmVzcG9uc2VKU09OIT0zRD0zRCJ1bmRlZmluZWQiKXtkPQouZXJy
b3IoZy5yZXNwb25zZUpTT04uZXJyX21zZysiIENsaWNrIHRoaXMgdG8gZ28gYmFjay4iLCIiLHtv
bmNsaWNrOmZ1bmN0aW89Cm4oKXtHYWxheHkubGlicmFyaWVzLmxpYnJhcnlfcm91dGVyLmJhY2so
KX19KX1lbHNle2QuZXJyb3IoIkFuIGVycm9yIG9jdXJyZT0KZC4gQ2xpY2sgdGhpcyB0byBnbyBi
YWNrLiIsIiIse29uY2xpY2s6ZnVuY3Rpb24oKXtHYWxheHkubGlicmFyaWVzLmxpYnJhcnlfPQpy
b3V0ZXIuYmFjaygpfX0pfX19KX0scmVuZGVyOmZ1bmN0aW9uKGUpe3RoaXMub3B0aW9ucz0zRF8u
ZXh0ZW5kKHRoaXMub3B0aW89Cm5zLGUpOyQoIi50b29sdGlwIikucmVtb3ZlKCk7dmFyIGY9M0R0
aGlzLnRlbXBsYXRlRGF0YXNldCgpO3RoaXMuJGVsLmh0bWwoZj0KKHtpdGVtOnRoaXMubW9kZWx9
KSk7JCgiLnBlZWsiKS5odG1sKHRoaXMubW9kZWwuZ2V0KCJwZWVrIikpOyQoIiNjZW50ZXIgW2Rh
PQp0YS10b2dnbGVdIikudG9vbHRpcCgpfSxmZXRjaFZlcnNpb246ZnVuY3Rpb24oZSl7dGhpcy5v
cHRpb25zPTNEXy5leHRlbmQodGg9CmlzLm9wdGlvbnMsZSk7dGhhdD0zRHRoaXM7aWYoIXRoaXMu
b3B0aW9ucy5sZGRhX2lkKXt0aGlzLnJlbmRlcigpO2QuZXJyb3IoIj0KTGlicmFyeSBkYXRhc2V0
IHZlcnNpb24gcmVxdWVzdGVkIGJ1dCBubyBpZCBwcm92aWRlZC4iKX1lbHNle3RoaXMubGRkYT0z
RG5lPQp3IGMuTGRkYSh7aWQ6dGhpcy5vcHRpb25zLmxkZGFfaWR9KTt0aGlzLmxkZGEudXJsPTNE
dGhpcy5sZGRhLnVybFJvb3QrdGhpcy49Cm1vZGVsLmlkKyIvdmVyc2lvbnMvIit0aGlzLmxkZGEu
aWQ7dGhpcy5sZGRhLmZldGNoKHtzdWNjZXNzOmZ1bmN0aW9uKCl7dGhhdD0KLnJlbmRlclZlcnNp
b24oKX0sZXJyb3I6ZnVuY3Rpb24oZyxmKXtpZih0eXBlb2YgZi5yZXNwb25zZUpTT04hPTNEPTNE
InVuZGVmPQppbmVkIil7ZC5lcnJvcihmLnJlc3BvbnNlSlNPTi5lcnJfbXNnKX1lbHNle2QuZXJy
b3IoIkFuIGVycm9yIG9jdXJyZWQuIil9fX09Cil9fSxyZW5kZXJWZXJzaW9uOmZ1bmN0aW9uKCl7
JCgiLnRvb2x0aXAiKS5yZW1vdmUoKTt2YXIgZT0zRHRoaXMudGVtcGxhdGVWZT0KcnNpb24oKTt0
aGlzLiRlbC5odG1sKGUoe2l0ZW06dGhpcy5tb2RlbCxsZGRhOnRoaXMubGRkYX0pKTskKCIucGVl
ayIpLmh0bWwoPQp0aGlzLmxkZGEuZ2V0KCJwZWVrIikpfSxlbmFibGVNb2RpZmljYXRpb246ZnVu
Y3Rpb24oKXskKCIudG9vbHRpcCIpLnJlbW92ZSg9Cik7dmFyIGU9M0R0aGlzLnRlbXBsYXRlTW9k
aWZ5RGF0YXNldCgpO3RoaXMuJGVsLmh0bWwoZSh7aXRlbTp0aGlzLm1vZGVsfSkpOz0KJCgiLnBl
ZWsiKS5odG1sKHRoaXMubW9kZWwuZ2V0KCJwZWVrIikpOyQoIiNjZW50ZXIgW2RhdGEtdG9nZ2xl
XSIpLnRvb2x0aXAoPQopfSxkb3dubG9hZERhdGFzZXQ6ZnVuY3Rpb24oKXt2YXIgZT0zRCh3aW5k
b3cuZ2FsYXh5X2NvbmZpZz9nYWxheHlfY29uZmlnLnI9Cm9vdDoiLyIpKyJhcGkvbGlicmFyaWVz
L2RhdGFzZXRzL2Rvd25sb2FkL3VuY29tcHJlc3NlZCI7dmFyIGY9M0R7bGRfaWRzOnRoaT0Kcy5p
ZH07dGhpcy5wcm9jZXNzRG93bmxvYWQoZSxmKX0scHJvY2Vzc0Rvd25sb2FkOmZ1bmN0aW9uKGYs
ZyxoKXtpZihmJiZnKXtnPQo9M0R0eXBlb2YgZz0zRD0zRCJzdHJpbmciP2c6JC5wYXJhbShnKTt2
YXIgZT0zRCIiOyQuZWFjaChnLnNwbGl0KCImIiksZnVuY3Q9Cmlvbigpe3ZhciBpPTNEdGhpcy5z
cGxpdCgiPTNEIik7ZSs9M0QnPGlucHV0IHR5cGU9M0QiaGlkZGVuIiBuYW1lPTNEIicraVswXT0K
KyciIHZhbHVlPTNEIicraVsxXSsnIiAvPid9KTskKCc8Zm9ybSBhY3Rpb249M0QiJytmKyciIG1l
dGhvZD0zRCInKyhofHwicG9zPQp0IikrJyI+JytlKyI8L2Zvcm0+IikuYXBwZW5kVG8oImJvZHki
KS5zdWJtaXQoKS5yZW1vdmUoKTtkLmluZm8oIllvdXIgZG93bmw9Cm9hZCB3aWxsIGJlZ2luIHNv
b24uIil9fSxpbXBvcnRJbnRvSGlzdG9yeTpmdW5jdGlvbigpe3RoaXMucmVmcmVzaFVzZXJIaXN0
bz0Kcmllc0xpc3QoZnVuY3Rpb24oZSl7dmFyIGY9M0RlLnRlbXBsYXRlQnVsa0ltcG9ydEluTW9k
YWwoKTtlLm1vZGFsPTNER2FsYXh5PQoubW9kYWw7ZS5tb2RhbC5zaG93KHtjbG9zaW5nX2V2ZW50
czp0cnVlLHRpdGxlOiJJbXBvcnQgaW50byBIaXN0b3J5Iixib2R5OmY9Cih7aGlzdG9yaWVzOmUu
aGlzdG9yaWVzLm1vZGVsc30pLGJ1dHRvbnM6e0ltcG9ydDpmdW5jdGlvbigpe2UuaW1wb3J0Q3Vy
cmVudD0KSW50b0hpc3RvcnkoKX0sQ2xvc2U6ZnVuY3Rpb24oKXtHYWxheHkubW9kYWwuaGlkZSgp
fX19KX0pfSxyZWZyZXNoVXNlckhpc3RvPQpyaWVzTGlzdDpmdW5jdGlvbihmKXt2YXIgZT0zRHRo
aXM7dGhpcy5oaXN0b3JpZXM9M0RuZXcgYy5HYWxheHlIaXN0b3JpZXMoKTs9CnRoaXMuaGlzdG9y
aWVzLmZldGNoKHtzdWNjZXNzOmZ1bmN0aW9uKGcpe2lmKGcubGVuZ3RoPTNEPTNEPTNEMCl7ZC53
YXJuaW5nKD0KIllvdSBoYXZlIHRvIGNyZWF0ZSBoaXN0b3J5IGZpcnN0LiBDbGljayB0aGlzIHRv
IGRvIHNvLiIsIiIse29uY2xpY2s6ZnVuY3RpPQpvbigpe3dpbmRvdy5sb2NhdGlvbj0zRCIvIn19
KX1lbHNle2YoZSl9fSxlcnJvcjpmdW5jdGlvbihoLGcpe2lmKHR5cGVvZiBnLnI9CmVzcG9uc2VK
U09OIT0zRD0zRCJ1bmRlZmluZWQiKXtkLmVycm9yKGcucmVzcG9uc2VKU09OLmVycl9tc2cpfWVs
c2V7ZC5lcnJvcj0KKCJBbiBlcnJvciBvY3VycmVkLiIpfX19KX0saW1wb3J0Q3VycmVudEludG9I
aXN0b3J5OmZ1bmN0aW9uKCl7dmFyIGU9M0QkKHRoPQppcy5tb2RhbC5lbE1haW4pLmZpbmQoInNl
bGVjdFtuYW1lPTNEZGF0YXNldF9pbXBvcnRfc2luZ2xlXSBvcHRpb246c2VsZWN0ZWQ9CiIpLnZh
bCgpO3ZhciBmPTNEbmV3IGMuSGlzdG9yeUl0ZW0oKTtmLnVybD0zRGYudXJsUm9vdCtlKyIvY29u
dGVudHMiO2pRdWVyeT0KLmdldEpTT04oZ2FsYXh5X2NvbmZpZy5yb290KyJoaXN0b3J5L3NldF9h
c19jdXJyZW50P2lkPTNEIitlKTtmLnNhdmUoe2NvbnRlPQpudDp0aGlzLmlkLHNvdXJjZToibGli
cmFyeSJ9LHtzdWNjZXNzOmZ1bmN0aW9uKCl7R2FsYXh5Lm1vZGFsLmhpZGUoKTtkLnN1Y2M9CmVz
cygiRGF0YXNldCBpbXBvcnRlZC4gQ2xpY2sgdGhpcyB0byBzdGFydCBhbmFseXNpbmcgaXQuIiwi
Iix7b25jbGljazpmdW5jdD0KaW9uKCl7d2luZG93LmxvY2F0aW9uPTNEIi8ifX0pfSxlcnJvcjpm
dW5jdGlvbihoLGcpe2lmKHR5cGVvZiBnLnJlc3BvbnNlSlNPPQpOIT0zRD0zRCJ1bmRlZmluZWQi
KXtkLmVycm9yKCJEYXRhc2V0IG5vdCBpbXBvcnRlZC4gIitnLnJlc3BvbnNlSlNPTi5lcnJfbXM9
CmcpfWVsc2V7ZC5lcnJvcigiQW4gZXJyb3Igb2NjdXJlZC4gRGF0YXNldCBub3QgaW1wb3J0ZWQu
IFBsZWFzZSB0cnkgYWdhaW4uIj0KKX19fSl9LHNoYXJlRGF0YXNldDpmdW5jdGlvbigpe2QuaW5m
bygiRmVhdHVyZSBjb21pbmcgc29vbi4iKX0sZ29CYWNrOmZ1bmN0PQppb24oKXtHYWxheHkubGli
cmFyaWVzLmxpYnJhcnlfcm91dGVyLmJhY2soKX0sc2hvd1Blcm1pc3Npb25zOmZ1bmN0aW9uKGYp
e3Q9Cmhpcy5vcHRpb25zPTNEXy5leHRlbmQodGhpcy5vcHRpb25zLGYpOyQoIi50b29sdGlwIiku
cmVtb3ZlKCk7aWYodGhpcy5vcHRpbz0KbnMuZmV0Y2hlZF9wZXJtaXNzaW9ucyE9M0Q9M0R1bmRl
ZmluZWQpe2lmKHRoaXMub3B0aW9ucy5mZXRjaGVkX3Blcm1pc3Npb25zPQouYWNjZXNzX2RhdGFz
ZXRfcm9sZXMubGVuZ3RoPTNEPTNEPTNEMCl7dGhpcy5tb2RlbC5zZXQoe2lzX3VucmVzdHJpY3Rl
ZDp0cnU9CmV9KX1lbHNle3RoaXMubW9kZWwuc2V0KHtpc191bnJlc3RyaWN0ZWQ6ZmFsc2V9KX19
dmFyIGg9M0RmYWxzZTtpZihHYWxheHkuYz0KdXJyVXNlcil7aD0zREdhbGF4eS5jdXJyVXNlci5p
c0FkbWluKCl9dmFyIGc9M0R0aGlzLnRlbXBsYXRlRGF0YXNldFBlcm1pc3NpPQpvbnMoKTt0aGlz
LiRlbC5odG1sKGcoe2l0ZW06dGhpcy5tb2RlbCxpc19hZG1pbjpofSkpO3ZhciBlPTNEdGhpcztp
Zih0aGlzLm89CnB0aW9ucy5mZXRjaGVkX3Blcm1pc3Npb25zPTNEPTNEPTNEdW5kZWZpbmVkKXsk
LmdldCgod2luZG93LmdhbGF4eV9jb25maWc/Zz0KYWxheHlfY29uZmlnLnJvb3Q6Ii8iKSsiYXBp
L2xpYnJhcmllcy9kYXRhc2V0cy8iK2UuaWQrIi9wZXJtaXNzaW9ucz9zY29wZT0KPTNEY3VycmVu
dCIpLmRvbmUoZnVuY3Rpb24oaSl7ZS5wcmVwYXJlU2VsZWN0Qm94ZXMoe2ZldGNoZWRfcGVybWlz
c2lvbnM6aSxpPQpzX2FkbWluOmh9KX0pLmZhaWwoZnVuY3Rpb24oKXtkLmVycm9yKCJBbiBlcnJv
ciBvY2N1cnJlZCB3aGlsZSBhdHRlbXB0aW5nIHQ9Cm8gZmV0Y2ggZGF0YXNldCBwZXJtaXNzaW9u
cy4iKX0pfWVsc2V7dGhpcy5wcmVwYXJlU2VsZWN0Qm94ZXMoe2lzX2FkbWluOmh9KT0KfSQoIiNj
ZW50ZXIgW2RhdGEtdG9nZ2xlXSIpLnRvb2x0aXAoKTskKCIjY2VudGVyIikuY3NzKCJvdmVyZmxv
dyIsImF1dG8iKX0sPQpwcmVwYXJlU2VsZWN0Qm94ZXM6ZnVuY3Rpb24ocil7dGhpcy5vcHRpb25z
PTNEXy5leHRlbmQodGhpcy5vcHRpb25zLHIpO3ZhciA9CnM9M0R0aGlzLm9wdGlvbnMuZmV0Y2hl
ZF9wZXJtaXNzaW9uczt2YXIgaz0zRHRoaXMub3B0aW9ucy5pc19hZG1pbjt2YXIgcT0zRD0KdGhp
czt2YXIgbT0zRFtdO2Zvcih2YXIgaD0zRDA7aDxzLmFjY2Vzc19kYXRhc2V0X3JvbGVzLmxlbmd0
aDtoKyspe20ucHVzaChzPQouYWNjZXNzX2RhdGFzZXRfcm9sZXNbaF0rIjoiK3MuYWNjZXNzX2Rh
dGFzZXRfcm9sZXNbaF0pfXZhciBmPTNEW107Zm9yKHZhciA9Cmg9M0QwO2g8cy5tb2RpZnlfaXRl
bV9yb2xlcy5sZW5ndGg7aCsrKXtmLnB1c2gocy5tb2RpZnlfaXRlbV9yb2xlc1toXSsiOiIrcz0K
Lm1vZGlmeV9pdGVtX3JvbGVzW2hdKX12YXIgZz0zRFtdO2Zvcih2YXIgaD0zRDA7aDxzLm1hbmFn
ZV9kYXRhc2V0X3JvbGVzLmxlPQpuZ3RoO2grKyl7Zy5wdXNoKHMubWFuYWdlX2RhdGFzZXRfcm9s
ZXNbaF0rIjoiK3MubWFuYWdlX2RhdGFzZXRfcm9sZXNbaF0pfWk9CmYoayl7dmFyIG89M0R7bWlu
aW11bUlucHV0TGVuZ3RoOjAsY3NzOiJhY2Nlc3NfcGVybSIsbXVsdGlwbGU6dHJ1ZSxwbGFjZWhv
bD0KZGVyOiJDbGljayB0byBzZWxlY3QgYSByb2xlIixjb250YWluZXI6cS4kZWwuZmluZCgiI2Fj
Y2Vzc19wZXJtIiksYWpheDp7dXJsPQo6KHdpbmRvdy5nYWxheHlfY29uZmlnP2dhbGF4eV9jb25m
aWcucm9vdDoiLyIpKyJhcGkvbGlicmFyaWVzL2RhdGFzZXRzLyIrcS49CmlkKyIvcGVybWlzc2lv
bnM/c2NvcGU9M0RhdmFpbGFibGUiLGRhdGFUeXBlOiJqc29uIixxdWlldE1pbGxpczoxMDAsZGF0
YTpmdT0KbmN0aW9uKGksdCl7cmV0dXJue3E6aSxwYWdlX2xpbWl0OjEwLHBhZ2U6dH19LHJlc3Vs
dHM6ZnVuY3Rpb24odSx0KXt2YXIgaT0KPTNEKHQqMTApPHUudG90YWw7cmV0dXJue3Jlc3VsdHM6
dS5yb2xlcyxtb3JlOml9fX0sZm9ybWF0UmVzdWx0OmZ1bmN0aW9uIGooPQppKXtyZXR1cm4gaS5u
YW1lKyIgdHlwZTogIitpLnR5cGV9LGZvcm1hdFNlbGVjdGlvbjpmdW5jdGlvbiBlKGkpe3JldHVy
biBpLm49CmFtZX0saW5pdFNlbGVjdGlvbjpmdW5jdGlvbihpLHUpe3ZhciB0PTNEW107JChpLnZh
bCgpLnNwbGl0KCIsIikpLmVhY2goZnVuYz0KdGlvbigpe3ZhciB2PTNEdGhpcy5zcGxpdCgiOiIp
O3QucHVzaCh7aWQ6dlsxXSxuYW1lOnZbMV19KX0pO3UodCl9LGluaXRpYWxEPQphdGE6bS5qb2lu
KCIsIiksZHJvcGRvd25Dc3NDbGFzczoiYmlnZHJvcCJ9O3ZhciBsPTNEe21pbmltdW1JbnB1dExl
bmd0aDowLGM9CnNzOiJtb2RpZnlfcGVybSIsbXVsdGlwbGU6dHJ1ZSxwbGFjZWhvbGRlcjoiQ2xp
Y2sgdG8gc2VsZWN0IGEgcm9sZSIsY29udGFpbj0KZXI6cS4kZWwuZmluZCgiI21vZGlmeV9wZXJt
IiksYWpheDp7dXJsOih3aW5kb3cuZ2FsYXh5X2NvbmZpZz9nYWxheHlfY29uZmlnPQoucm9vdDoi
LyIpKyJhcGkvbGlicmFyaWVzL2RhdGFzZXRzLyIrcS5pZCsiL3Blcm1pc3Npb25zP3Njb3BlPTNE
YXZhaWxhYmxlIiw9CmRhdGFUeXBlOiJqc29uIixxdWlldE1pbGxpczoxMDAsZGF0YTpmdW5jdGlv
bihpLHQpe3JldHVybntxOmkscGFnZV9saW1pdDoxMD0KLHBhZ2U6dH19LHJlc3VsdHM6ZnVuY3Rp
b24odSx0KXt2YXIgaT0zRCh0KjEwKTx1LnRvdGFsO3JldHVybntyZXN1bHRzOnUucm9sPQplcyxt
b3JlOml9fX0sZm9ybWF0UmVzdWx0OmZ1bmN0aW9uIGooaSl7cmV0dXJuIGkubmFtZSsiIHR5cGU6
ICIraS50eXBlfSxmb3I9Cm1hdFNlbGVjdGlvbjpmdW5jdGlvbiBlKGkpe3JldHVybiBpLm5hbWV9
LGluaXRTZWxlY3Rpb246ZnVuY3Rpb24oaSx1KXt2YXIgdD0KPTNEW107JChpLnZhbCgpLnNwbGl0
KCIsIikpLmVhY2goZnVuY3Rpb24oKXt2YXIgdj0zRHRoaXMuc3BsaXQoIjoiKTt0LnB1c2goPQp7
aWQ6dlsxXSxuYW1lOnZbMV19KX0pO3UodCl9LGluaXRpYWxEYXRhOmYuam9pbigiLCIpLGRyb3Bk
b3duQ3NzQ2xhc3M6ImJpZ2Q9CnJvcCJ9O3ZhciBwPTNEe21pbmltdW1JbnB1dExlbmd0aDowLGNz
czoibWFuYWdlX3Blcm0iLG11bHRpcGxlOnRydWUscGxhY2Vobz0KbGRlcjoiQ2xpY2sgdG8gc2Vs
ZWN0IGEgcm9sZSIsY29udGFpbmVyOnEuJGVsLmZpbmQoIiNtYW5hZ2VfcGVybSIpLGFqYXg6e3Vy
PQpsOih3aW5kb3cuZ2FsYXh5X2NvbmZpZz9nYWxheHlfY29uZmlnLnJvb3Q6Ii8iKSsiYXBpL2xp
YnJhcmllcy9kYXRhc2V0cy8iK3E9Ci5pZCsiL3Blcm1pc3Npb25zP3Njb3BlPTNEYXZhaWxhYmxl
IixkYXRhVHlwZToianNvbiIscXVpZXRNaWxsaXM6MTAwLGRhdGE6Zj0KdW5jdGlvbihpLHQpe3Jl
dHVybntxOmkscGFnZV9saW1pdDoxMCxwYWdlOnR9fSxyZXN1bHRzOmZ1bmN0aW9uKHUsdCl7dmFy
IGk9Cj0zRCh0KjEwKTx1LnRvdGFsO3JldHVybntyZXN1bHRzOnUucm9sZXMsbW9yZTppfX19LGZv
cm1hdFJlc3VsdDpmdW5jdGlvbiBqKD0KaSl7cmV0dXJuIGkubmFtZSsiIHR5cGU6ICIraS50eXBl
fSxmb3JtYXRTZWxlY3Rpb246ZnVuY3Rpb24gZShpKXtyZXR1cm4gaS5uPQphbWV9LGluaXRTZWxl
Y3Rpb246ZnVuY3Rpb24oaSx1KXt2YXIgdD0zRFtdOyQoaS52YWwoKS5zcGxpdCgiLCIpKS5lYWNo
KGZ1bmM9CnRpb24oKXt2YXIgdj0zRHRoaXMuc3BsaXQoIjoiKTt0LnB1c2goe2lkOnZbMV0sbmFt
ZTp2WzFdfSl9KTt1KHQpfSxpbml0aWFsRD0KYXRhOmcuam9pbigiLCIpLGRyb3Bkb3duQ3NzQ2xh
c3M6ImJpZ2Ryb3AifTtxLmFjY2Vzc1NlbGVjdE9iamVjdD0zRG5ldyBiLlZpPQpldyhvKTtxLm1v
ZGlmeVNlbGVjdE9iamVjdD0zRG5ldyBiLlZpZXcobCk7cS5tYW5hZ2VTZWxlY3RPYmplY3Q9M0Ru
ZXcgYi5WaWU9CncocCl9ZWxzZXt2YXIgbj0zRHEudGVtcGxhdGVBY2Nlc3NTZWxlY3QoKTskLmdl
dCgod2luZG93LmdhbGF4eV9jb25maWc/Z2FsYT0KeHlfY29uZmlnLnJvb3Q6Ii8iKSsiYXBpL2xp
YnJhcmllcy9kYXRhc2V0cy8iK3EuaWQrIi9wZXJtaXNzaW9ucz9zY29wZT0zRGF2PQphaWxhYmxl
IixmdW5jdGlvbihpKXskKCIuYWNjZXNzX3Blcm0iKS5odG1sKG4oe29wdGlvbnM6aS5yb2xlc30p
KTtxLmFjY2Vzc1M9CmVsZWN0T2JqZWN0PTNEJCgiI2FjY2Vzc19zZWxlY3QiKS5zZWxlY3QyKCl9
KS5mYWlsKGZ1bmN0aW9uKCl7ZC5lcnJvcigiQW4gZT0KcnJvciBvY2N1cnJlZCB3aGlsZSBhdHRl
bXB0aW5nIHRvIGZldGNoIGRhdGFzZXQgcGVybWlzc2lvbnMuIil9KX19LGNvbWluZ1NvPQpvbjpm
dW5jdGlvbigpe2Qud2FybmluZygiRmVhdHVyZSBjb21pbmcgc29vbi4iKX0sY29weVRvQ2xpcGJv
YXJkOmZ1bmN0aW9uKCk9Cnt2YXIgZT0zREJhY2tib25lLmhpc3RvcnkubG9jYXRpb24uaHJlZjtp
ZihlLmxhc3RJbmRleE9mKCIvcGVybWlzc2lvbnMiKSE9Cj0zRD0zRC0xKXtlPTNEZS5zdWJzdHIo
MCxlLmxhc3RJbmRleE9mKCIvcGVybWlzc2lvbnMiKSl9d2luZG93LnByb21wdCgiQ29weT0KIHRv
IGNsaXBib2FyZDogQ3RybCtDLCBFbnRlciIsZSl9LG1ha2VEYXRhc2V0UHJpdmF0ZTpmdW5jdGlv
bigpe3ZhciBlPTNEdGhpPQpzOyQucG9zdCgod2luZG93LmdhbGF4eV9jb25maWc/Z2FsYXh5X2Nv
bmZpZy5yb290OiIvIikrImFwaS9saWJyYXJpZXMvZGF0YXM9CmV0cy8iK2UuaWQrIi9wZXJtaXNz
aW9ucz9hY3Rpb249M0RtYWtlX3ByaXZhdGUiKS5kb25lKGZ1bmN0aW9uKGYpe2UubW9kZWwucz0K
ZXQoe2lzX3VucmVzdHJpY3RlZDpmYWxzZX0pO2Uuc2hvd1Blcm1pc3Npb25zKHtmZXRjaGVkX3Bl
cm1pc3Npb25zOmZ9KTtkLnN1PQpjY2VzcygiVGhlIGRhdGFzZXQgaXMgbm93IHByaXZhdGUgdG8g
eW91LiIpfSkuZmFpbChmdW5jdGlvbigpe2QuZXJyb3IoIkFuIGU9CnJyb3Igb2NjdXJyZWQgd2hp
bGUgYXR0ZW1wdGluZyB0byBtYWtlIGRhdGFzZXQgcHJpdmF0ZS4iKX0pfSxyZW1vdmVEYXRhc2V0
Uj0KZXN0cmljdGlvbnM6ZnVuY3Rpb24oKXt2YXIgZT0zRHRoaXM7JC5wb3N0KCh3aW5kb3cuZ2Fs
YXh5X2NvbmZpZz9nYWxheHlfY29uPQpmaWcucm9vdDoiLyIpKyJhcGkvbGlicmFyaWVzL2RhdGFz
ZXRzLyIrZS5pZCsiL3Blcm1pc3Npb25zP2FjdGlvbj0zRHJlbW92ZV89CnJlc3RyaWN0aW9ucyIp
LmRvbmUoZnVuY3Rpb24oZil7ZS5tb2RlbC5zZXQoe2lzX3VucmVzdHJpY3RlZDp0cnVlfSk7ZS5z
aG93UD0KZXJtaXNzaW9ucyh7ZmV0Y2hlZF9wZXJtaXNzaW9uczpmfSk7ZC5zdWNjZXNzKCJBY2Nl
c3MgdG8gdGhpcyBkYXRhc2V0IGlzIG5vPQp3IHVucmVzdHJpY3RlZC4iKX0pLmZhaWwoZnVuY3Rp
b24oKXtkLmVycm9yKCJBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBhdHRlbXA9CnRpbmcgdG8gbWFr
ZSBkYXRhc2V0IHVucmVzdHJpY3RlZC4iKX0pfSxzYXZlUGVybWlzc2lvbnM6ZnVuY3Rpb24oZSl7
dmFyIG49Cj0zRHRoaXM7dmFyIGs9M0R0aGlzLmFjY2Vzc1NlbGVjdE9iamVjdC4kZWwuc2VsZWN0
MigiZGF0YSIpO3ZhciBmPTNEdGhpcy5tYT0KbmFnZVNlbGVjdE9iamVjdC4kZWwuc2VsZWN0Migi
ZGF0YSIpO3ZhciBtPTNEdGhpcy5tb2RpZnlTZWxlY3RPYmplY3QuJGVsLnNlPQpsZWN0MigiZGF0
YSIpO3ZhciBnPTNEW107dmFyIGo9M0RbXTt2YXIgbD0zRFtdO2Zvcih2YXIgaD0zRGsubGVuZ3Ro
LTE7aD49M0Q9CjA7aC0tKXtnLnB1c2goa1toXS5pZCl9Zm9yKHZhciBoPTNEZi5sZW5ndGgtMTto
Pj0zRDA7aC0tKXtqLnB1c2goZltoXS5pZCl9Zj0Kb3IodmFyIGg9M0RtLmxlbmd0aC0xO2g+PTNE
MDtoLS0pe2wucHVzaChtW2hdLmlkKX0kLnBvc3QoKHdpbmRvdy5nYWxheHlfY29uPQpmaWc/Z2Fs
YXh5X2NvbmZpZy5yb290OiIvIikrImFwaS9saWJyYXJpZXMvZGF0YXNldHMvIituLmlkKyIvcGVy
bWlzc2lvbnM/YWM9CnRpb249M0RzZXRfcGVybWlzc2lvbnMiLHsiYWNjZXNzX2lkc1tdIjpnLCJt
YW5hZ2VfaWRzW10iOmosIm1vZGlmeV9pZHNbXSI6bD0KLH0pLmRvbmUoZnVuY3Rpb24oaSl7bi5z
aG93UGVybWlzc2lvbnMoe2ZldGNoZWRfcGVybWlzc2lvbnM6aX0pO2Quc3VjY2VzcygiPQpQZXJt
aXNzaW9ucyBzYXZlZC4iKX0pLmZhaWwoZnVuY3Rpb24oKXtkLmVycm9yKCJBbiBlcnJvciBvY2N1
cnJlZCB3aGlsZSBhdHQ9CmVtcHRpbmcgdG8gc2V0IGRhdGFzZXQgcGVybWlzc2lvbnMuIil9KX0s
dGVtcGxhdGVEYXRhc2V0OmZ1bmN0aW9uKCl7dmFyIGU9Cj0zRFtdO2UucHVzaCgnPGRpdiBjbGFz
cz0zRCJsaWJyYXJ5X3N0eWxlX2NvbnRhaW5lciI+Jyk7ZS5wdXNoKCcgIDxkaXYgaWQ9Cj0zRCJs
aWJyYXJ5X3Rvb2xiYXIiPicpO2UucHVzaCgnICAgPGJ1dHRvbiBkYXRhLXRvZ2dsZT0zRCJ0b29s
dGlwIiBkYXRhLXBsYT0KY2VtZW50PTNEInRvcCIgdGl0bGU9M0QiRG93bmxvYWQgZGF0YXNldCIg
Y2xhc3M9M0QiYnRuIGJ0bi1kZWZhdWx0IHRvb2xidG4tPQpkb3dubG9hZC1kYXRhc2V0IHByaW1h
cnktYnV0dG9uIiB0eXBlPTNEImJ1dHRvbiI+PHNwYW4gY2xhc3M9M0QiZmEgZmEtZG93bmw9Cm9h
ZCI+PC9zcGFuPiBEb3dubG9hZDwvc3Bhbj48L2J1dHRvbj4nKTtlLnB1c2goJyAgIDxidXR0b24g
ZGF0YS10b2dnbGU9M0QidD0Kb29sdGlwIiBkYXRhLXBsYWNlbWVudD0zRCJ0b3AiIHRpdGxlPTNE
IkltcG9ydCBkYXRhc2V0IGludG8gaGlzdG9yeSIgY2xhc3M9Cj0zRCJidG4gYnRuLWRlZmF1bHQg
dG9vbGJ0bi1pbXBvcnQtZGF0YXNldCBwcmltYXJ5LWJ1dHRvbiIgdHlwZT0zRCJidXR0b24iPj0K
PHNwYW4gY2xhc3M9M0QiZmEgZmEtYm9vayI+PC9zcGFuPiB0byBIaXN0b3J5PC9zcGFuPjwvYnV0
dG9uPicpO2UucHVzaCgnICAgPQo8JSBpZiAoaXRlbS5nZXQoImNhbl91c2VyX21vZGlmeSIpKSB7
ICU+Jyk7ZS5wdXNoKCcgICA8YnV0dG9uIGRhdGEtdG9nZ2xlPQo9M0QidG9vbHRpcCIgZGF0YS1w
bGFjZW1lbnQ9M0QidG9wIiB0aXRsZT0zRCJNb2RpZnkgbGlicmFyeSBpdGVtIiBjbGFzcz0zRCI9
CmJ0biBidG4tZGVmYXVsdCB0b29sYnRuX21vZGlmeV9kYXRhc2V0IHByaW1hcnktYnV0dG9uIiB0
eXBlPTNEImJ1dHRvbiI+PHNwYT0KbiBjbGFzcz0zRCJmYSBmYS1wZW5jaWwiPjwvc3Bhbj4gTW9k
aWZ5PC9zcGFuPjwvYnV0dG9uPicpO2UucHVzaCgiICAgPCUgfSAlPQo+Iik7ZS5wdXNoKCcgICA8
JSBpZiAoaXRlbS5nZXQoImNhbl91c2VyX21hbmFnZSIpKSB7ICU+Jyk7ZS5wdXNoKCcgICA8YSBo
cmU9CmY9M0QiI2ZvbGRlcnMvPCUtIGl0ZW0uZ2V0KCJmb2xkZXJfaWQiKSAlPi9kYXRhc2V0cy88
JS0gaXRlbS5pZCAlPi9wZXJtaXNzaT0Kb25zIj48YnV0dG9uIGRhdGEtdG9nZ2xlPTNEInRvb2x0
aXAiIGRhdGEtcGxhY2VtZW50PTNEInRvcCIgdGl0bGU9M0QiTWFuYWdlPQogcGVybWlzc2lvbnMi
IGNsYXNzPTNEImJ0biBidG4tZGVmYXVsdCB0b29sYnRuX2NoYW5nZV9wZXJtaXNzaW9ucyBwcmlt
YXJ5LWI9CnV0dG9uIiB0eXBlPTNEImJ1dHRvbiI+PHNwYW4gY2xhc3M9M0QiZmEgZmEtZ3JvdXAi
Pjwvc3Bhbj4gUGVybWlzc2lvbnM8L3NwYT0Kbj48L2J1dHRvbj48L2E+Jyk7ZS5wdXNoKCIgICA8
JSB9ICU+Iik7ZS5wdXNoKCIgIDwvZGl2PiIpO2UucHVzaCgnPG9sIGNsYXNzPQo9M0QiYnJlYWRj
cnVtYiI+Jyk7ZS5wdXNoKCcgICA8bGk+PGEgdGl0bGU9M0QiUmV0dXJuIHRvIHRoZSBsaXN0IG9m
IGxpYnJhcmk9CmVzIiBocmVmPTNEIiMiPkxpYnJhcmllczwvYT48L2xpPicpO2UucHVzaCgnICAg
PCUgXy5lYWNoKGl0ZW0uZ2V0KCJmdWxsX3BhdD0KaCIpLCBmdW5jdGlvbihwYXRoX2l0ZW0pIHsg
JT4nKTtlLnB1c2goIiAgIDwlIGlmIChwYXRoX2l0ZW1bMF0gIT0zRCBpdGVtLmlkPQopIHsgJT4i
KTtlLnB1c2goJyAgIDxsaT48YSB0aXRsZT0zRCJSZXR1cm4gdG8gdGhpcyBmb2xkZXIiIGhyZWY9
M0QiIy9mb2xkZXI9CnMvPCUtIHBhdGhfaXRlbVswXSAlPiI+PCUtIHBhdGhfaXRlbVsxXSAlPjwv
YT48L2xpPiAnKTtlLnB1c2goIjwlIH0gZWxzZSB7ID0KJT4iKTtlLnB1c2goJyAgIDxsaSBjbGFz
cz0zRCJhY3RpdmUiPjxzcGFuIHRpdGxlPTNEIllvdSBhcmUgaGVyZSI+PCUtIHBhdGhfPQppdGVt
WzFdICU+PC9zcGFuPjwvbGk+Jyk7ZS5wdXNoKCIgICA8JSB9ICU+Iik7ZS5wdXNoKCIgICA8JSB9
KTsgJT4iKTtlLnB1c2g9CigiPC9vbD4iKTtlLnB1c2goJzwlIGlmIChpdGVtLmdldCgiaXNfdW5y
ZXN0cmljdGVkIikpIHsgJT4nKTtlLnB1c2goJyAgPGRpdj0KIGNsYXNzPTNEImFsZXJ0IGFsZXJ0
LWluZm8iPicpO2UucHVzaCgiICBUaGlzIGRhdGFzZXQgaXMgdW5yZXN0cmljdGVkIHNvIGV2PQpl
cnlib2R5IGNhbiBhY2Nlc3MgaXQuIEp1c3Qgc2hhcmUgdGhlIFVSTCBvZiB0aGlzIHBhZ2UuICIp
O2UucHVzaCgnICA8YnV0dG89Cm4gZGF0YS10b2dnbGU9M0QidG9vbHRpcCIgZGF0YS1wbGFjZW1l
bnQ9M0QidG9wIiB0aXRsZT0zRCJDb3B5IHRvIGNsaXBib2FyZD0KIiBjbGFzcz0zRCJidG4gYnRu
LWRlZmF1bHQgYnRuLWNvcHktbGluay10by1jbGlwYm9hcmQgcHJpbWFyeS1idXR0b24iIHR5cGU9
Cj0zRCJidXR0b24iPjxzcGFuIGNsYXNzPTNEImZhIGZhLWNsaXBib2FyZCI+PC9zcGFuPiBUbyBD
bGlwYm9hcmQ8L3NwYW4+PC9idT0KdHRvbj4gJyk7ZS5wdXNoKCIgIDwvZGl2PiIpO2UucHVzaCgi
PCUgfSAlPiIpO2UucHVzaCgnPGRpdiBjbGFzcz0zRCJkYXRhc2V0PQpfdGFibGUiPicpO2UucHVz
aCgnICAgPHRhYmxlIGNsYXNzPTNEImdyaWQgdGFibGUgdGFibGUtc3RyaXBlZCB0YWJsZS1jb25k
ZW49CnNlZCI+Jyk7ZS5wdXNoKCIgICAgICAgPHRyPiIpO2UucHVzaCgnICAgICAgICAgICA8dGgg
c2NvcGU9M0Qicm93IiBpZD0zRCJpZD0KX3JvdyIgZGF0YS1pZD0zRCI8JT0zRCBfLmVzY2FwZShp
dGVtLmdldCgibGRkYV9pZCIpKSAlPiI+TmFtZTwvdGg+Jyk7ZS5wdXNoPQooJyAgICAgICAgICAg
PHRkPjwlPTNEIF8uZXNjYXBlKGl0ZW0uZ2V0KCJuYW1lIikpICU+PC90ZD4nKTtlLnB1c2goIiAg
ICAgICA9CjwvdHI+Iik7ZS5wdXNoKCcgICA8JSBpZiAoaXRlbS5nZXQoImZpbGVfZXh0IikpIHsg
JT4nKTtlLnB1c2goIiAgICAgICA8dHI+Ij0KKTtlLnB1c2goJyAgICAgICAgICAgPHRoIHNjb3Bl
PTNEInJvdyI+RGF0YSB0eXBlPC90aD4nKTtlLnB1c2goJyAgICAgICAgICAgPQo8dGQ+PCU9M0Qg
Xy5lc2NhcGUoaXRlbS5nZXQoImZpbGVfZXh0IikpICU+PC90ZD4nKTtlLnB1c2goIiAgICAgICA8
L3RyPiIpO2U9Ci5wdXNoKCIgICA8JSB9ICU+Iik7ZS5wdXNoKCcgICA8JSBpZiAoaXRlbS5nZXQo
Imdlbm9tZV9idWlsZCIpKSB7ICU+Jyk7ZS5wdT0Kc2goIiAgICAgICA8dHI+Iik7ZS5wdXNoKCcg
ICAgICAgICAgIDx0aCBzY29wZT0zRCJyb3ciPkdlbm9tZSBidWlsZDwvdGg+Jyk7PQplLnB1c2go
JyAgICAgICAgICAgPHRkPjwlPTNEIF8uZXNjYXBlKGl0ZW0uZ2V0KCJnZW5vbWVfYnVpbGQiKSkg
JT48L3RkPicpO2U9Ci5wdXNoKCIgICAgICAgPC90cj4iKTtlLnB1c2goIiAgIDwlIH0gJT4iKTtl
LnB1c2goJyAgIDwlIGlmIChpdGVtLmdldCgiZmlsZT0KX3NpemUiKSkgeyAlPicpO2UucHVzaCgi
ICAgICAgIDx0cj4iKTtlLnB1c2goJyAgICAgICAgICAgPHRoIHNjb3BlPTNEInJvdyI+PQpTaXpl
PC90aD4nKTtlLnB1c2goJyAgICAgICAgICAgPHRkPjwlPTNEIF8uZXNjYXBlKGl0ZW0uZ2V0KCJm
aWxlX3NpemUiKSkgJT49CjwvdGQ+Jyk7ZS5wdXNoKCIgICAgICAgPC90cj4iKTtlLnB1c2goIiAg
IDwlIH0gJT4iKTtlLnB1c2goJyAgIDwlIGlmIChpdGVtLj0KZ2V0KCJkYXRlX3VwbG9hZGVkIikp
IHsgJT4nKTtlLnB1c2goIiAgICAgICA8dHI+Iik7ZS5wdXNoKCcgICAgICAgICAgIDx0aCBzPQpj
b3BlPTNEInJvdyI+RGF0ZSB1cGxvYWRlZCAoVVRDKTwvdGg+Jyk7ZS5wdXNoKCcgICAgICAgICAg
IDx0ZD48JT0zRCBfLmVzY2E9CnBlKGl0ZW0uZ2V0KCJkYXRlX3VwbG9hZGVkIikpICU+PC90ZD4n
KTtlLnB1c2goIiAgICAgICA8L3RyPiIpO2UucHVzaCgiICAgPD0KJSB9ICU+Iik7ZS5wdXNoKCcg
ICA8JSBpZiAoaXRlbS5nZXQoInVwbG9hZGVkX2J5IikpIHsgJT4nKTtlLnB1c2goIiAgICAgICA8
PQp0cj4iKTtlLnB1c2goJyAgICAgICAgICAgPHRoIHNjb3BlPTNEInJvdyI+VXBsb2FkZWQgYnk8
L3RoPicpO2UucHVzaCgnICAgICA9CiAgICAgIDx0ZD48JT0zRCBfLmVzY2FwZShpdGVtLmdldCgi
dXBsb2FkZWRfYnkiKSkgJT48L3RkPicpO2UucHVzaCgiICAgICAgID0KPC90cj4iKTtlLnB1c2go
IiAgIDwlIH0gJT4iKTtlLnB1c2goJyAgIDwlIGlmIChpdGVtLmdldCgibWV0YWRhdGFfZGF0YV9s
aW5lPQpzIikpIHsgJT4nKTtlLnB1c2goIiAgICAgICA8dHI+Iik7ZS5wdXNoKCcgICAgICAgICAg
IDx0aCBzY29wZT0zRCJyb3ciPkRhdGE9CiBMaW5lczwvdGg+Jyk7ZS5wdXNoKCcgICAgICAgICAg
IDx0ZCBzY29wZT0zRCJyb3ciPjwlPTNEIF8uZXNjYXBlKGl0ZW0uZ2V0KD0KIm1ldGFkYXRhX2Rh
dGFfbGluZXMiKSkgJT48L3RkPicpO2UucHVzaCgiICAgICAgIDwvdHI+Iik7ZS5wdXNoKCIgICA8
JSB9ICU+PQoiKTtlLnB1c2goJyAgIDwlIGlmIChpdGVtLmdldCgibWV0YWRhdGFfY29tbWVudF9s
aW5lcyIpKSB7ICU+Jyk7ZS5wdXNoKCIgICA9CiAgICA8dHI+Iik7ZS5wdXNoKCcgICAgICAgICAg
IDx0aCBzY29wZT0zRCJyb3ciPkNvbW1lbnQgTGluZXM8L3RoPicpO2UucHVzaD0KKCcgICAgICAg
ICAgIDx0ZCBzY29wZT0zRCJyb3ciPjwlPTNEIF8uZXNjYXBlKGl0ZW0uZ2V0KCJtZXRhZGF0YV9j
b21tZW50X2xpPQpuZXMiKSkgJT48L3RkPicpO2UucHVzaCgiICAgICAgIDwvdHI+Iik7ZS5wdXNo
KCIgICA8JSB9ICU+Iik7ZS5wdXNoKCcgICA8JSA9CmlmIChpdGVtLmdldCgibWV0YWRhdGFfY29s
dW1ucyIpKSB7ICU+Jyk7ZS5wdXNoKCIgICAgICAgPHRyPiIpO2UucHVzaCgnICAgID0KICAgICAg
IDx0aCBzY29wZT0zRCJyb3ciPk51bWJlciBvZiBDb2x1bW5zPC90aD4nKTtlLnB1c2goJyAgICAg
ICAgICAgPHRkIHNjPQpvcGU9M0Qicm93Ij48JT0zRCBfLmVzY2FwZShpdGVtLmdldCgibWV0YWRh
dGFfY29sdW1ucyIpKSAlPjwvdGQ+Jyk7ZS5wdXNoKCI9CiAgICAgICA8L3RyPiIpO2UucHVzaCgi
ICAgPCUgfSAlPiIpO2UucHVzaCgnICAgPCUgaWYgKGl0ZW0uZ2V0KCJtZXRhZGF0YV9jbz0KbHVt
bl90eXBlcyIpKSB7ICU+Jyk7ZS5wdXNoKCIgICAgICAgPHRyPiIpO2UucHVzaCgnICAgICAgICAg
ICA8dGggc2NvcGU9M0QiPQpyb3ciPkNvbHVtbiBUeXBlczwvdGg+Jyk7ZS5wdXNoKCcgICAgICAg
ICAgIDx0ZCBzY29wZT0zRCJyb3ciPjwlPTNEIF8uZXNjYXA9CmUoaXRlbS5nZXQoIm1ldGFkYXRh
X2NvbHVtbl90eXBlcyIpKSAlPjwvdGQ+Jyk7ZS5wdXNoKCIgICAgICAgPC90cj4iKTtlLnB1cz0K
aCgiICAgPCUgfSAlPiIpO2UucHVzaCgnICAgPCUgaWYgKGl0ZW0uZ2V0KCJtZXNzYWdlIikpIHsg
JT4nKTtlLnB1c2goIiAgICAgPQogIDx0cj4iKTtlLnB1c2goJyAgICAgICAgICAgPHRoIHNjb3Bl
PTNEInJvdyI+TWVzc2FnZTwvdGg+Jyk7ZS5wdXNoKCcgICAgICA9CiAgICAgPHRkIHNjb3BlPTNE
InJvdyI+PCU9M0QgXy5lc2NhcGUoaXRlbS5nZXQoIm1lc3NhZ2UiKSkgJT48L3RkPicpO2UucHVz
aD0KKCIgICAgICAgPC90cj4iKTtlLnB1c2goIiAgIDwlIH0gJT4iKTtlLnB1c2goJyAgIDwlIGlm
IChpdGVtLmdldCgibWlzY19ibHVyPQpiIikpIHsgJT4nKTtlLnB1c2goIiAgICAgICA8dHI+Iik7
ZS5wdXNoKCcgICAgICAgICAgIDx0aCBzY29wZT0zRCJyb3ciPk1pc2M9CmVsbGFuZW91cyBibHVy
YjwvdGg+Jyk7ZS5wdXNoKCcgICAgICAgICAgIDx0ZCBzY29wZT0zRCJyb3ciPjwlPTNEIF8uZXNj
YXBlKD0KaXRlbS5nZXQoIm1pc2NfYmx1cmIiKSkgJT48L3RkPicpO2UucHVzaCgiICAgICAgIDwv
dHI+Iik7ZS5wdXNoKCIgICA8JSB9ICU+PQoiKTtlLnB1c2goJyAgIDwlIGlmIChpdGVtLmdldCgi
bWlzY19pbmZvIikpIHsgJT4nKTtlLnB1c2goIiAgICAgICA8dHI+Iik7ZS49CnB1c2goJyAgICAg
ICAgICAgPHRoIHNjb3BlPTNEInJvdyI+TWlzY2VsbGFuZW91cyBpbmZvcm1hdGlvbjwvdGg+Jyk7
ZS5wdXNoKD0KJyAgICAgICAgICAgPHRkIHNjb3BlPTNEInJvdyI+PCU9M0QgXy5lc2NhcGUoaXRl
bS5nZXQoIm1pc2NfaW5mbyIpKSAlPjwvdGQ+PQonKTtlLnB1c2goIiAgICAgICA8L3RyPiIpO2Uu
cHVzaCgiICAgPCUgfSAlPiIpO2UucHVzaCgiICAgIDwvdGFibGU+Iik7ZS5wdXM9CmgoIiAgICA8
ZGl2PiIpO2UucHVzaCgnICAgICAgICA8cHJlIGNsYXNzPTNEInBlZWsiPicpO2UucHVzaCgiICAg
ICAgICA8L3ByZT0KPiIpO2UucHVzaCgiICAgIDwvZGl2PiIpO2UucHVzaCgnICAgPCUgaWYgKGl0
ZW0uZ2V0KCJoYXNfdmVyc2lvbnMiKSkgeyAlPicpPQo7ZS5wdXNoKCIgICAgICA8ZGl2PiIpO2Uu
cHVzaCgiICAgICAgPGgzPkV4cGlyZWQgdmVyc2lvbnM6PC9oMz4iKTtlLnB1c2goIiA9CiAgICAg
PHVsPiIpO2UucHVzaCgnICAgICAgPCUgXy5lYWNoKGl0ZW0uZ2V0KCJleHBpcmVkX3ZlcnNpb25z
IiksIGZ1bmN0aW9uKD0KdmVyc2lvbikgeyAlPicpO2UucHVzaCgnICAgICAgICA8bGk+PGEgdGl0
bGU9M0QiU2VlIGRldGFpbHMgb2YgdGhpcyB2ZXJzaW9uPQoiIGhyZWY9M0QiI2ZvbGRlcnMvPCUt
IGl0ZW0uZ2V0KCJmb2xkZXJfaWQiKSAlPi9kYXRhc2V0cy88JS0gaXRlbS5pZCAlPi92ZXI9CnNp
b25zLzwlLSB2ZXJzaW9uWzBdICU+Ij48JS0gdmVyc2lvblsxXSAlPjwvYT48L2xpPicpO2UucHVz
aCgiICAgICAgPCUgfSkgJT0KPiIpO2UucHVzaCgiICAgICAgPHVsPiIpO2UucHVzaCgiICAgICAg
PC9kaXY+Iik7ZS5wdXNoKCIgICA8JSB9ICU+Iik7ZS5wdXNoPQooIjwvZGl2PiIpO2UucHVzaCgi
PC9kaXY+Iik7cmV0dXJuIF8udGVtcGxhdGUoZS5qb2luKCIiKSl9LHRlbXBsYXRlVmVyc2lvbjo9
CmZ1bmN0aW9uKCl7dmFyIGU9M0RbXTtlLnB1c2goJzxkaXYgY2xhc3M9M0QibGlicmFyeV9zdHls
ZV9jb250YWluZXIiPicpO2UucD0KdXNoKCcgIDxkaXYgaWQ9M0QibGlicmFyeV90b29sYmFyIj4n
KTtlLnB1c2goJyAgIDxhIGhyZWY9M0QiI2ZvbGRlcnMvPCUtIGl0PQplbS5nZXQoImZvbGRlcl9p
ZCIpICU+L2RhdGFzZXRzLzwlLSBpdGVtLmlkICU+Ij48YnV0dG9uIGRhdGEtdG9nZ2xlPTNEInRv
b2w9CnRpcCIgZGF0YS1wbGFjZW1lbnQ9M0QidG9wIiB0aXRsZT0zRCJHbyB0byBsYXRlc3QgZGF0
YXNldCIgY2xhc3M9M0QiYnRuIGJ0bj0KLWRlZmF1bHQgcHJpbWFyeS1idXR0b24iIHR5cGU9M0Qi
YnV0dG9uIj48c3BhbiBjbGFzcz0zRCJmYSBmYS1jYXJldC1sZWZ0IGZhPQotbGciPjwvc3Bhbj4g
TGF0ZXN0IGRhdGFzZXQ8L3NwYW4+PC9idXR0b24+PGE+Jyk7ZS5wdXNoKCIgIDwvZGl2PiIpO2Uu
cHVzaCg9Cic8b2wgY2xhc3M9M0QiYnJlYWRjcnVtYiI+Jyk7ZS5wdXNoKCcgICA8bGk+PGEgdGl0
bGU9M0QiUmV0dXJuIHRvIHRoZSBsaXN0ID0Kb2YgbGlicmFyaWVzIiBocmVmPTNEIiMiPkxpYnJh
cmllczwvYT48L2xpPicpO2UucHVzaCgnICAgPCUgXy5lYWNoKGl0ZW0uZ2V0PQooImZ1bGxfcGF0
aCIpLCBmdW5jdGlvbihwYXRoX2l0ZW0pIHsgJT4nKTtlLnB1c2goIiAgIDwlIGlmIChwYXRoX2l0
ZW1bMF0gIT0KPTNEIGl0ZW0uaWQpIHsgJT4iKTtlLnB1c2goJyAgIDxsaT48YSB0aXRsZT0zRCJS
ZXR1cm4gdG8gdGhpcyBmb2xkZXIiIGhyZWY9Cj0zRCIjL2ZvbGRlcnMvPCUtIHBhdGhfaXRlbVsw
XSAlPiI+PCUtIHBhdGhfaXRlbVsxXSAlPjwvYT48L2xpPiAnKTtlLnB1c2goIj0KPCUgfSBlbHNl
IHsgJT4iKTtlLnB1c2goJyAgIDxsaSBjbGFzcz0zRCJhY3RpdmUiPjxzcGFuIHRpdGxlPTNEIllv
dSBhcmUgaGVyPQplIj48JS0gcGF0aF9pdGVtWzFdICU+PC9zcGFuPjwvbGk+Jyk7ZS5wdXNoKCIg
ICA8JSB9ICU+Iik7ZS5wdXNoKCIgICA8JSB9KTs9CiAlPiIpO2UucHVzaCgiPC9vbD4iKTtlLnB1
c2goJyAgPGRpdiBjbGFzcz0zRCJhbGVydCBhbGVydC13YXJuaW5nIj5UaGlzIGlzID0KYW4gZXhw
aXJlZCB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5IGRhdGFzZXQ6IDwlPTNEIF8uZXNjYXBlKGl0ZW0u
Z2V0KCJuYW1lIikpPQogJT48L2Rpdj4nKTtlLnB1c2goJzxkaXYgY2xhc3M9M0QiZGF0YXNldF90
YWJsZSI+Jyk7ZS5wdXNoKCcgICA8dGFibGUgY2xhc3M9Cj0zRCJncmlkIHRhYmxlIHRhYmxlLXN0
cmlwZWQgdGFibGUtY29uZGVuc2VkIj4nKTtlLnB1c2goIiAgICAgICA8dHI+Iik7ZS5wdT0Kc2go
JyAgICAgICAgICAgPHRoIHNjb3BlPTNEInJvdyIgaWQ9M0QiaWRfcm93IiBkYXRhLWlkPTNEIjwl
PTNEIF8uZXNjYXBlKGxkPQpkYS5pZCkgJT4iPk5hbWU8L3RoPicpO2UucHVzaCgnICAgICAgICAg
ICA8dGQ+PCU9M0QgXy5lc2NhcGUobGRkYS5nZXQoIm5hbWU9CiIpKSAlPjwvdGQ+Jyk7ZS5wdXNo
KCIgICAgICAgPC90cj4iKTtlLnB1c2goJyAgIDwlIGlmIChsZGRhLmdldCgiZmlsZV9leHQiKT0K
KSB7ICU+Jyk7ZS5wdXNoKCIgICAgICAgPHRyPiIpO2UucHVzaCgnICAgICAgICAgICA8dGggc2Nv
cGU9M0Qicm93Ij5EYXRhIHR5PQpwZTwvdGg+Jyk7ZS5wdXNoKCcgICAgICAgICAgIDx0ZD48JT0z
RCBfLmVzY2FwZShsZGRhLmdldCgiZmlsZV9leHQiKSkgJT48L3Q9CmQ+Jyk7ZS5wdXNoKCIgICAg
ICAgPC90cj4iKTtlLnB1c2goIiAgIDwlIH0gJT4iKTtlLnB1c2goJyAgIDwlIGlmIChsZGRhLmdl
dD0KKCJnZW5vbWVfYnVpbGQiKSkgeyAlPicpO2UucHVzaCgiICAgICAgIDx0cj4iKTtlLnB1c2go
JyAgICAgICAgICAgPHRoIHNjb3BlPQo9M0Qicm93Ij5HZW5vbWUgYnVpbGQ8L3RoPicpO2UucHVz
aCgnICAgICAgICAgICA8dGQ+PCU9M0QgXy5lc2NhcGUobGRkYS5nZXQ9CigiZ2Vub21lX2J1aWxk
IikpICU+PC90ZD4nKTtlLnB1c2goIiAgICAgICA8L3RyPiIpO2UucHVzaCgiICAgPCUgfSAlPiIp
O2UucD0KdXNoKCcgICA8JSBpZiAobGRkYS5nZXQoImZpbGVfc2l6ZSIpKSB7ICU+Jyk7ZS5wdXNo
KCIgICAgICAgPHRyPiIpO2UucHVzaCgnPQogICAgICAgICAgIDx0aCBzY29wZT0zRCJyb3ciPlNp
emU8L3RoPicpO2UucHVzaCgnICAgICAgICAgICA8dGQ+PCU9M0QgXy5lc2M9CmFwZShsZGRhLmdl
dCgiZmlsZV9zaXplIikpICU+PC90ZD4nKTtlLnB1c2goIiAgICAgICA8L3RyPiIpO2UucHVzaCgi
ICAgPCUgfT0KICU+Iik7ZS5wdXNoKCcgICA8JSBpZiAobGRkYS5nZXQoImRhdGVfdXBsb2FkZWQi
KSkgeyAlPicpO2UucHVzaCgiICAgICAgIDx0PQpyPiIpO2UucHVzaCgnICAgICAgICAgICA8dGgg
c2NvcGU9M0Qicm93Ij5EYXRlIHVwbG9hZGVkIChVVEMpPC90aD4nKTtlLnB1c2g9CignICAgICAg
ICAgICA8dGQ+PCU9M0QgXy5lc2NhcGUobGRkYS5nZXQoImRhdGVfdXBsb2FkZWQiKSkgJT48L3Rk
PicpO2UucHVzaD0KKCIgICAgICAgPC90cj4iKTtlLnB1c2goIiAgIDwlIH0gJT4iKTtlLnB1c2go
JyAgIDwlIGlmIChsZGRhLmdldCgidXBsb2FkZWRfPQpieSIpKSB7ICU+Jyk7ZS5wdXNoKCIgICAg
ICAgPHRyPiIpO2UucHVzaCgnICAgICAgICAgICA8dGggc2NvcGU9M0Qicm93Ij5VcGw9Cm9hZGVk
IGJ5PC90aD4nKTtlLnB1c2goJyAgICAgICAgICAgPHRkPjwlPTNEIF8uZXNjYXBlKGxkZGEuZ2V0
KCJ1cGxvYWRlZF9ieT0KIikpICU+PC90ZD4nKTtlLnB1c2goIiAgICAgICA8L3RyPiIpO2UucHVz
aCgiICAgPCUgfSAlPiIpO2UucHVzaCgnICAgPCUgaWYgPQoobGRkYS5nZXQoIm1ldGFkYXRhX2Rh
dGFfbGluZXMiKSkgeyAlPicpO2UucHVzaCgiICAgICAgIDx0cj4iKTtlLnB1c2goJyAgICA9CiAg
ICAgICA8dGggc2NvcGU9M0Qicm93Ij5EYXRhIExpbmVzPC90aD4nKTtlLnB1c2goJyAgICAgICAg
ICAgPHRkIHNjb3BlPTNEIj0Kcm93Ij48JT0zRCBfLmVzY2FwZShsZGRhLmdldCgibWV0YWRhdGFf
ZGF0YV9saW5lcyIpKSAlPjwvdGQ+Jyk7ZS5wdXNoKCIgICAgPQogICA8L3RyPiIpO2UucHVzaCgi
ICAgPCUgfSAlPiIpO2UucHVzaCgnICAgPCUgaWYgKGxkZGEuZ2V0KCJtZXRhZGF0YV9jb21tZW49
CnRfbGluZXMiKSkgeyAlPicpO2UucHVzaCgiICAgICAgIDx0cj4iKTtlLnB1c2goJyAgICAgICAg
ICAgPHRoIHNjb3BlPTNEInJvdz0KIj5Db21tZW50IExpbmVzPC90aD4nKTtlLnB1c2goJyAgICAg
ICAgICAgPHRkIHNjb3BlPTNEInJvdyI+PCU9M0QgXy5lc2NhcGUoPQpsZGRhLmdldCgibWV0YWRh
dGFfY29tbWVudF9saW5lcyIpKSAlPjwvdGQ+Jyk7ZS5wdXNoKCIgICAgICAgPC90cj4iKTtlLnB1
c2g9CigiICAgPCUgfSAlPiIpO2UucHVzaCgnICAgPCUgaWYgKGxkZGEuZ2V0KCJtZXRhZGF0YV9j
b2x1bW5zIikpIHsgJT4nKTtlLnB1cz0KaCgiICAgICAgIDx0cj4iKTtlLnB1c2goJyAgICAgICAg
ICAgPHRoIHNjb3BlPTNEInJvdyI+TnVtYmVyIG9mIENvbHVtbnM8L3RoPQo+Jyk7ZS5wdXNoKCcg
ICAgICAgICAgIDx0ZCBzY29wZT0zRCJyb3ciPjwlPTNEIF8uZXNjYXBlKGxkZGEuZ2V0KCJtZXRh
ZGF0YV89CmNvbHVtbnMiKSkgJT48L3RkPicpO2UucHVzaCgiICAgICAgIDwvdHI+Iik7ZS5wdXNo
KCIgICA8JSB9ICU+Iik7ZS5wdXNoKCcgID0KIDwlIGlmIChsZGRhLmdldCgibWV0YWRhdGFfY29s
dW1uX3R5cGVzIikpIHsgJT4nKTtlLnB1c2goIiAgICAgICA8dHI+Iik7ZS5wPQp1c2goJyAgICAg
ICAgICAgPHRoIHNjb3BlPTNEInJvdyI+Q29sdW1uIFR5cGVzPC90aD4nKTtlLnB1c2goJyAgICAg
ICAgICAgPHQ9CmQgc2NvcGU9M0Qicm93Ij48JT0zRCBfLmVzY2FwZShsZGRhLmdldCgibWV0YWRh
dGFfY29sdW1uX3R5cGVzIikpICU+PC90ZD4nKT0KO2UucHVzaCgiICAgICAgIDwvdHI+Iik7ZS5w
dXNoKCIgICA8JSB9ICU+Iik7ZS5wdXNoKCcgICA8JSBpZiAobGRkYS5nZXQoIm1lPQpzc2FnZSIp
KSB7ICU+Jyk7ZS5wdXNoKCIgICAgICAgPHRyPiIpO2UucHVzaCgnICAgICAgICAgICA8dGggc2Nv
cGU9M0Qicm93Ij49Ck1lc3NhZ2U8L3RoPicpO2UucHVzaCgnICAgICAgICAgICA8dGQgc2NvcGU9
M0Qicm93Ij48JT0zRCBfLmVzY2FwZShsZGRhLmdldD0KKCJtZXNzYWdlIikpICU+PC90ZD4nKTtl
LnB1c2goIiAgICAgICA8L3RyPiIpO2UucHVzaCgiICAgPCUgfSAlPiIpO2UucHVzaCgnPQogICA8
JSBpZiAobGRkYS5nZXQoIm1pc2NfYmx1cmIiKSkgeyAlPicpO2UucHVzaCgiICAgICAgIDx0cj4i
KTtlLnB1c2goJyAgICA9CiAgICAgICA8dGggc2NvcGU9M0Qicm93Ij5NaXNjZWxsYW5lb3VzIGJs
dXJiPC90aD4nKTtlLnB1c2goJyAgICAgICAgICAgPHRkID0Kc2NvcGU9M0Qicm93Ij48JT0zRCBf
LmVzY2FwZShsZGRhLmdldCgibWlzY19ibHVyYiIpKSAlPjwvdGQ+Jyk7ZS5wdXNoKCIgICAgPQog
ICA8L3RyPiIpO2UucHVzaCgiICAgPCUgfSAlPiIpO2UucHVzaCgnICAgPCUgaWYgKGxkZGEuZ2V0
KCJtaXNjX2luZm8iKSkgeyA9CiU+Jyk7ZS5wdXNoKCIgICAgICAgPHRyPiIpO2UucHVzaCgnICAg
ICAgICAgICA8dGggc2NvcGU9M0Qicm93Ij5NaXNjZWxsYW5lbz0KdXMgaW5mb3JtYXRpb248L3Ro
PicpO2UucHVzaCgnICAgICAgICAgICA8dGQgc2NvcGU9M0Qicm93Ij48JT0zRCBfLmVzY2FwZShs
PQpkZGEuZ2V0KCJtaXNjX2luZm8iKSkgJT48L3RkPicpO2UucHVzaCgiICAgICAgIDwvdHI+Iik7
ZS5wdXNoKCIgICA8JSB9ICU+Iik9CjtlLnB1c2goIiAgICA8L3RhYmxlPiIpO2UucHVzaCgiICAg
IDxkaXY+Iik7ZS5wdXNoKCcgICAgICAgIDxwcmUgY2xhc3M9M0QicD0KZWVrIj4nKTtlLnB1c2go
IiAgICAgICAgPC9wcmU+Iik7ZS5wdXNoKCIgICAgPC9kaXY+Iik7ZS5wdXNoKCI8L2Rpdj4iKTtl
LnB1PQpzaCgiPC9kaXY+Iik7cmV0dXJuIF8udGVtcGxhdGUoZS5qb2luKCIiKSl9LHRlbXBsYXRl
TW9kaWZ5RGF0YXNldDpmdW5jdGlvbig9Cil7dmFyIGU9M0RbXTtlLnB1c2goJzxkaXYgY2xhc3M9
M0QibGlicmFyeV9zdHlsZV9jb250YWluZXIiPicpO2UucHVzaCgnICA8ZD0KaXYgaWQ9M0QibGli
cmFyeV90b29sYmFyIj4nKTtlLnB1c2goJyAgIDxidXR0b24gZGF0YS10b2dnbGU9M0QidG9vbHRp
cCIgZGF0PQphLXBsYWNlbWVudD0zRCJ0b3AiIHRpdGxlPTNEIkNhbmNlbCBtb2RpZmljYXRpb25z
IiBjbGFzcz0zRCJidG4gYnRuLWRlZmF1bHQ9CiB0b29sYnRuX2NhbmNlbF9tb2RpZmljYXRpb25z
IHByaW1hcnktYnV0dG9uIiB0eXBlPTNEImJ1dHRvbiI+PHNwYW4gY2xhc3M9Cj0zRCJmYSBmYS10
aW1lcyI+PC9zcGFuPiBDYW5jZWw8L3NwYW4+PC9idXR0b24+Jyk7ZS5wdXNoKCcgICA8YnV0dG9u
IGRhdGEtdD0Kb2dnbGU9M0QidG9vbHRpcCIgZGF0YS1wbGFjZW1lbnQ9M0QidG9wIiB0aXRsZT0z
RCJTYXZlIG1vZGlmaWNhdGlvbnMiIGNsYXNzPQo9M0QiYnRuIGJ0bi1kZWZhdWx0IHRvb2xidG5f
c2F2ZV9tb2RpZmljYXRpb25zIHByaW1hcnktYnV0dG9uIiB0eXBlPTNEImJ1dHQ9Cm9uIj48c3Bh
biBjbGFzcz0zRCJmYSBmYS1mbG9wcHktbyI+PC9zcGFuPiBTYXZlPC9zcGFuPjwvYnV0dG9uPicp
O2UucHVzaCgiID0KIDwvZGl2PiIpO2UucHVzaCgnPG9sIGNsYXNzPTNEImJyZWFkY3J1bWIiPicp
O2UucHVzaCgnICAgPGxpPjxhIHRpdGxlPTNEIlJlPQp0dXJuIHRvIHRoZSBsaXN0IG9mIGxpYnJh
cmllcyIgaHJlZj0zRCIjIj5MaWJyYXJpZXM8L2E+PC9saT4nKTtlLnB1c2goJyAgIDw9CiUgXy5l
YWNoKGl0ZW0uZ2V0KCJmdWxsX3BhdGgiKSwgZnVuY3Rpb24ocGF0aF9pdGVtKSB7ICU+Jyk7ZS5w
dXNoKCIgICA8JSBpZj0KIChwYXRoX2l0ZW1bMF0gIT0zRCBpdGVtLmlkKSB7ICU+Iik7ZS5wdXNo
KCcgICA8bGk+PGEgdGl0bGU9M0QiUmV0dXJuIHRvIHRoPQppcyBmb2xkZXIiIGhyZWY9M0QiIy9m
b2xkZXJzLzwlLSBwYXRoX2l0ZW1bMF0gJT4iPjwlLSBwYXRoX2l0ZW1bMV0gJT48L2E+PC89Cmxp
PiAnKTtlLnB1c2goIjwlIH0gZWxzZSB7ICU+Iik7ZS5wdXNoKCcgICA8bGkgY2xhc3M9M0QiYWN0
aXZlIj48c3BhbiB0aXRsZT0KPTNEIllvdSBhcmUgaGVyZSI+PCUtIHBhdGhfaXRlbVsxXSAlPjwv
c3Bhbj48L2xpPicpO2UucHVzaCgiICAgPCUgfSAlPiIpO2UuPQpwdXNoKCIgICA8JSB9KTsgJT4i
KTtlLnB1c2goIjwvb2w+Iik7ZS5wdXNoKCc8ZGl2IGNsYXNzPTNEImRhdGFzZXRfdGFibGUiPic9
Cik7ZS5wdXNoKCc8cD5Gb3IgbW9yZSBlZGl0aW5nIG9wdGlvbnMgcGxlYXNlIGltcG9ydCB0aGUg
ZGF0YXNldCB0byBoaXN0b3J5ID0KYW5kIHVzZSAiRWRpdCBhdHRyaWJ1dGVzIiBvbiBpdC48L3A+
Jyk7ZS5wdXNoKCcgICA8dGFibGUgY2xhc3M9M0QiZ3JpZCB0YWJsPQplIHRhYmxlLXN0cmlwZWQg
dGFibGUtY29uZGVuc2VkIj4nKTtlLnB1c2goIiAgICAgICA8dHI+Iik7ZS5wdXNoKCcgICAgICAg
ICA9CiAgPHRoIHNjb3BlPTNEInJvdyIgaWQ9M0QiaWRfcm93IiBkYXRhLWlkPTNEIjwlPTNEIF8u
ZXNjYXBlKGl0ZW0uZ2V0KCJsZGRhXz0KaWQiKSkgJT4iPk5hbWU8L3RoPicpO2UucHVzaCgnICAg
ICAgICAgICA8dGQ+PGlucHV0IGNsYXNzPTNEImlucHV0X2RhdGFzZXRfPQpuYW1lIGZvcm0tY29u
dHJvbCIgdHlwZT0zRCJ0ZXh0IiBwbGFjZWhvbGRlcj0zRCJuYW1lIiB2YWx1ZT0zRCI8JT0zRCBf
LmVzY2E9CnBlKGl0ZW0uZ2V0KCJuYW1lIikpICU+Ij48L3RkPicpO2UucHVzaCgiICAgICAgIDwv
dHI+Iik7ZS5wdXNoKCIgICAgICAgPHRyPj0KIik7ZS5wdXNoKCcgICAgICAgICAgIDx0aCBzY29w
ZT0zRCJyb3ciPkRhdGEgdHlwZTwvdGg+Jyk7ZS5wdXNoKCcgICAgICAgICAgPQogPHRkPjwlPTNE
IF8uZXNjYXBlKGl0ZW0uZ2V0KCJmaWxlX2V4dCIpKSAlPjwvdGQ+Jyk7ZS5wdXNoKCIgICAgICAg
PC90cj4iKTs9CmUucHVzaCgiICAgICAgIDx0cj4iKTtlLnB1c2goJyAgICAgICAgICAgPHRoIHNj
b3BlPTNEInJvdyI+R2Vub21lIGJ1aWxkPC90aD0KPicpO2UucHVzaCgnICAgICAgICAgICA8dGQ+
PCU9M0QgXy5lc2NhcGUoaXRlbS5nZXQoImdlbm9tZV9idWlsZCIpKSAlPjwvdGQ+PQonKTtlLnB1
c2goIiAgICAgICA8L3RyPiIpO2UucHVzaCgiICAgICAgIDx0cj4iKTtlLnB1c2goJyAgICAgICAg
ICAgPHRoIHNjb3A9CmU9M0Qicm93Ij5TaXplPC90aD4nKTtlLnB1c2goJyAgICAgICAgICAgPHRk
PjwlPTNEIF8uZXNjYXBlKGl0ZW0uZ2V0KCJmaWxlXz0Kc2l6ZSIpKSAlPjwvdGQ+Jyk7ZS5wdXNo
KCIgICAgICAgPC90cj4iKTtlLnB1c2goIiAgICAgICA8dHI+Iik7ZS5wdXNoKCcgICAgPQogICAg
ICAgPHRoIHNjb3BlPTNEInJvdyI+RGF0ZSB1cGxvYWRlZCAoVVRDKTwvdGg+Jyk7ZS5wdXNoKCcg
ICAgICAgICAgIDx0ZD49CjwlPTNEIF8uZXNjYXBlKGl0ZW0uZ2V0KCJkYXRlX3VwbG9hZGVkIikp
ICU+PC90ZD4nKTtlLnB1c2goIiAgICAgICA8L3RyPiIpOz0KZS5wdXNoKCIgICAgICAgPHRyPiIp
O2UucHVzaCgnICAgICAgICAgICA8dGggc2NvcGU9M0Qicm93Ij5VcGxvYWRlZCBieTwvdGg+PQon
KTtlLnB1c2goJyAgICAgICAgICAgPHRkPjwlPTNEIF8uZXNjYXBlKGl0ZW0uZ2V0KCJ1cGxvYWRl
ZF9ieSIpKSAlPjwvdGQ+Jyk9CjtlLnB1c2goIiAgICAgICA8L3RyPiIpO2UucHVzaCgnICAgICAg
ICAgICA8dHIgc2NvcGU9M0Qicm93Ij4nKTtlLnB1c2goJyAgID0KICAgICAgICA8dGggc2NvcGU9
M0Qicm93Ij5EYXRhIExpbmVzPC90aD4nKTtlLnB1c2goJyAgICAgICAgICAgPHRkIHNjb3BlPTNE
PQoicm93Ij48JT0zRCBfLmVzY2FwZShpdGVtLmdldCgibWV0YWRhdGFfZGF0YV9saW5lcyIpKSAl
PjwvdGQ+Jyk7ZS5wdXNoKCIgICA9CiAgICA8L3RyPiIpO2UucHVzaCgnICAgICAgIDx0aCBzY29w
ZT0zRCJyb3ciPkNvbW1lbnQgTGluZXM8L3RoPicpO2UucHVzaCgnID0KICAgICAgICAgIDwlIGlm
IChpdGVtLmdldCgibWV0YWRhdGFfY29tbWVudF9saW5lcyIpID0zRD0zRD0zRCAiIikgeyAlPicp
O2UuPQpwdXNoKCcgICAgICAgICAgICAgICA8dGQgc2NvcGU9M0Qicm93Ij48JT0zRCBfLmVzY2Fw
ZShpdGVtLmdldCgibWV0YWRhdGFfY289Cm1tZW50X2xpbmVzIikpICU+PC90ZD4nKTtlLnB1c2go
IiAgICAgICAgICAgPCUgfSBlbHNlIHsgJT4iKTtlLnB1c2goJyAgICAgID0KICAgICAgICAgPHRk
IHNjb3BlPTNEInJvdyI+dW5rbm93bjwvdGQ+Jyk7ZS5wdXNoKCIgICAgICAgICAgIDwlIH0gJT4i
KTtlLnB1PQpzaCgiICAgICAgIDwvdHI+Iik7ZS5wdXNoKCIgICAgICAgPHRyPiIpO2UucHVzaCgn
ICAgICAgICAgICA8dGggc2NvcGU9M0Qicm89CnciPk51bWJlciBvZiBDb2x1bW5zPC90aD4nKTtl
LnB1c2goJyAgICAgICAgICAgPHRkIHNjb3BlPTNEInJvdyI+PCU9M0QgXy5lcz0KY2FwZShpdGVt
LmdldCgibWV0YWRhdGFfY29sdW1ucyIpKSAlPjwvdGQ+Jyk7ZS5wdXNoKCIgICAgICAgPC90cj4i
KTtlLnB1c2goPQoiICAgICAgIDx0cj4iKTtlLnB1c2goJyAgICAgICAgICAgPHRoIHNjb3BlPTNE
InJvdyI+Q29sdW1uIFR5cGVzPC90aD4nKTtlLnA9CnVzaCgnICAgICAgICAgICA8dGQgc2NvcGU9
M0Qicm93Ij48JT0zRCBfLmVzY2FwZShpdGVtLmdldCgibWV0YWRhdGFfY29sdW1uXz0KdHlwZXMi
KSkgJT48L3RkPicpO2UucHVzaCgiICAgICAgIDwvdHI+Iik7ZS5wdXNoKCIgICAgICAgPHRyPiIp
O2UucHVzaCgnICAgPQogICAgICAgIDx0aCBzY29wZT0zRCJyb3ciPk1lc3NhZ2U8L3RoPicpO2Uu
cHVzaCgnICAgICAgICAgICA8dGQgc2NvcGU9M0Qicm89CnciPjwlPTNEIF8uZXNjYXBlKGl0ZW0u
Z2V0KCJtZXNzYWdlIikpICU+PC90ZD4nKTtlLnB1c2goIiAgICAgICA8L3RyPiIpO2UucD0KdXNo
KCIgICAgICAgPHRyPiIpO2UucHVzaCgnICAgICAgICAgICA8dGggc2NvcGU9M0Qicm93Ij5NaXNj
ZWxsYW5lb3VzIGluZm9yPQptYXRpb248L3RoPicpO2UucHVzaCgnICAgICAgICAgICA8dGQgc2Nv
cGU9M0Qicm93Ij48JT0zRCBfLmVzY2FwZShpdGVtLmdldCg9CiJtaXNjX2luZm8iKSkgJT48L3Rk
PicpO2UucHVzaCgiICAgICAgIDwvdHI+Iik7ZS5wdXNoKCIgICAgICAgPHRyPiIpO2UucHVzaD0K
KCcgICAgICAgICAgIDx0aCBzY29wZT0zRCJyb3ciPk1pc2NlbGxhbmVvdXMgYmx1cmI8L3RoPicp
O2UucHVzaCgnICAgICAgICAgPQogIDx0ZCBzY29wZT0zRCJyb3ciPjwlPTNEIF8uZXNjYXBlKGl0
ZW0uZ2V0KCJtaXNjX2JsdXJiIikpICU+PC90ZD4nKTtlLnB1c2g9CigiICAgICAgIDwvdHI+Iik7
ZS5wdXNoKCIgICA8L3RhYmxlPiIpO2UucHVzaCgiPGRpdj4iKTtlLnB1c2goJyAgIDxwcmUgY2xh
cz0Kcz0zRCJwZWVrIj4nKTtlLnB1c2goIiAgIDwvcHJlPiIpO2UucHVzaCgiPC9kaXY+Iik7ZS5w
dXNoKCI8L2Rpdj4iKTtlLnB1c2goPQoiPC9kaXY+Iik7cmV0dXJuIF8udGVtcGxhdGUoZS5qb2lu
KCIiKSl9LHRlbXBsYXRlRGF0YXNldFBlcm1pc3Npb25zOmZ1bmN0aW89Cm4oKXt2YXIgZT0zRFtd
O2UucHVzaCgnPGRpdiBjbGFzcz0zRCJsaWJyYXJ5X3N0eWxlX2NvbnRhaW5lciI+Jyk7ZS5wdXNo
KCcgID0KPGRpdiBpZD0zRCJsaWJyYXJ5X3Rvb2xiYXIiPicpO2UucHVzaCgnICAgPGEgaHJlZj0z
RCIjZm9sZGVycy88JS0gaXRlbS5nZXQoPQoiZm9sZGVyX2lkIikgJT4iPjxidXR0b24gZGF0YS10
b2dnbGU9M0QidG9vbHRpcCIgZGF0YS1wbGFjZW1lbnQ9M0QidG9wIiB0aXQ9CmxlPTNEIkdvIGJh
Y2sgdG8gY29udGFpbmluZyBmb2xkZXIiIGNsYXNzPTNEImJ0biBidG4tZGVmYXVsdCBwcmltYXJ5
LWJ1dHRvbj0KIiB0eXBlPTNEImJ1dHRvbiI+PHNwYW4gY2xhc3M9M0QiZmEgZmEtZm9sZGVyLW9w
ZW4tbyI+PC9zcGFuPiBDb250YWluaW5nIEZvPQpsZGVyPC9zcGFuPjwvYnV0dG9uPjwvYT4nKTtl
LnB1c2goJyAgIDxhIGhyZWY9M0QiI2ZvbGRlcnMvPCUtIGl0ZW0uZ2V0KCJmb2w9CmRlcl9pZCIp
ICU+L2RhdGFzZXRzLzwlLSBpdGVtLmlkICU+Ij48YnV0dG9uIGRhdGEtdG9nZ2xlPTNEInRvb2x0
aXAiIGRhdGEtcD0KbGFjZW1lbnQ9M0QidG9wIiB0aXRsZT0zRCJHbyBiYWNrIHRvIGRhdGFzZXQi
IGNsYXNzPTNEImJ0biBidG4tZGVmYXVsdCBwcmltPQphcnktYnV0dG9uIiB0eXBlPTNEImJ1dHRv
biI+PHNwYW4gY2xhc3M9M0QiZmEgZmEtZmlsZS1vIj48L3NwYW4+IERhdGFzZXQgRGU9CnRhaWxz
PC9zcGFuPjwvYnV0dG9uPjxhPicpO2UucHVzaCgiICA8L2Rpdj4iKTtlLnB1c2goJzxvbCBjbGFz
cz0zRCJicmVhZGNydT0KbWIiPicpO2UucHVzaCgnICAgPGxpPjxhIHRpdGxlPTNEIlJldHVybiB0
byB0aGUgbGlzdCBvZiBsaWJyYXJpZXMiIGhyZWY9M0QiPQojIj5MaWJyYXJpZXM8L2E+PC9saT4n
KTtlLnB1c2goJyAgIDwlIF8uZWFjaChpdGVtLmdldCgiZnVsbF9wYXRoIiksIGZ1bmN0aW89Cm4o
cGF0aF9pdGVtKSB7ICU+Jyk7ZS5wdXNoKCIgICA8JSBpZiAocGF0aF9pdGVtWzBdICE9M0QgaXRl
bS5pZCkgeyAlPiIpO2UucD0KdXNoKCcgICA8bGk+PGEgdGl0bGU9M0QiUmV0dXJuIHRvIHRoaXMg
Zm9sZGVyIiBocmVmPTNEIiMvZm9sZGVycy88JS0gcGF0aF9pPQp0ZW1bMF0gJT4iPjwlLSBwYXRo
X2l0ZW1bMV0gJT48L2E+PC9saT4gJyk7ZS5wdXNoKCI8JSB9IGVsc2UgeyAlPiIpO2UucHVzaCg9
CicgICA8bGkgY2xhc3M9M0QiYWN0aXZlIj48c3BhbiB0aXRsZT0zRCJZb3UgYXJlIGhlcmUiPjwl
LSBwYXRoX2l0ZW1bMV0gJT48Lz0Kc3Bhbj48L2xpPicpO2UucHVzaCgiICAgPCUgfSAlPiIpO2Uu
cHVzaCgiICAgPCUgfSk7ICU+Iik7ZS5wdXNoKCI8L29sPiIpO2UuPQpwdXNoKCc8aDE+RGF0YXNl
dDogPCU9M0QgXy5lc2NhcGUoaXRlbS5nZXQoIm5hbWUiKSkgJT48L2gxPicpO2UucHVzaCgnPGRp
diA9CmNsYXNzPTNEImFsZXJ0IGFsZXJ0LXdhcm5pbmciPicpO2UucHVzaCgiPCUgaWYgKGlzX2Fk
bWluKSB7ICU+Iik7ZS5wdXNoKCJZbz0KdSBhcmUgbG9nZ2VkIGluIGFzIGFuIDxzdHJvbmc+YWRt
aW5pc3RyYXRvcjwvc3Ryb25nPiB0aGVyZWZvcmUgeW91IGNhbiBtYW5hPQpnZSBhbnkgZGF0YXNl
dCBvbiB0aGlzIEdhbGF4eSBpbnN0YW5jZS4gUGxlYXNlIG1ha2Ugc3VyZSB5b3UgdW5kZXJzdGFu
ZCB0aGU9CiBjb25zZXF1ZW5jZXMuIik7ZS5wdXNoKCI8JSB9IGVsc2UgeyAlPiIpO2UucHVzaCgi
WW91IGNhbiBhc3NpZ24gYW55IG51bWJlcj0KIG9mIHJvbGVzIHRvIGFueSBvZiB0aGUgZm9sbG93
aW5nIHBlcm1pc3Npb24gdHlwZXMuIEhvd2V2ZXIgcGxlYXNlIHJlYWQgY2FyPQplZnVsbHkgdGhl
IGltcGxpY2F0aW9ucyBvZiBzdWNoIGFjdGlvbnMuIik7ZS5wdXNoKCI8JSB9ICU+Iik7ZS5wdXNo
KCI8L2Rpdj49CiIpO2UucHVzaCgnPGRpdiBjbGFzcz0zRCJkYXRhc2V0X3RhYmxlIj4nKTtlLnB1
c2goIjxoMj5MaWJyYXJ5LXJlbGF0ZWQgcGVybT0KaXNzaW9uczwvaDI+Iik7ZS5wdXNoKCI8aDQ+
Um9sZXMgdGhhdCBjYW4gbW9kaWZ5IHRoZSBsaWJyYXJ5IGl0ZW08L2g0PiIpO2UuPQpwdXNoKCc8
ZGl2IGlkPTNEIm1vZGlmeV9wZXJtIiBjbGFzcz0zRCJtb2RpZnlfcGVybSByb2xlcy1zZWxlY3Rp
b24iPjwvZGl2Pic9Cik7ZS5wdXNoKCc8ZGl2IGNsYXNzPTNEImFsZXJ0IGFsZXJ0LWluZm8gcm9s
ZXMtc2VsZWN0aW9uIj5Vc2VyIHdpdGggPHN0cm9uZz0KPmFueTwvc3Ryb25nPiBvZiB0aGVzZSBy
b2xlcyBjYW4gbW9kaWZ5IG5hbWUsIG1ldGFkYXRhLCBhbmQgb3RoZXIgaW5mb3JtYXRpPQpvbiBh
Ym91dCB0aGlzIGxpYnJhcnkgaXRlbS48L2Rpdj4nKTtlLnB1c2goIjxoci8+Iik7ZS5wdXNoKCI8
aDI+RGF0YXNldC1yZWw9CmF0ZWQgcGVybWlzc2lvbnM8L2gyPiIpO2UucHVzaCgnPGRpdiBjbGFz
cz0zRCJhbGVydCBhbGVydC13YXJuaW5nIj5DaGFuZ2VzID0KbWFkZSBiZWxvdyB3aWxsIGFmZmVj
dCA8c3Ryb25nPmV2ZXJ5PC9zdHJvbmc+IGxpYnJhcnkgaXRlbSB0aGF0IHdhcyBjcmVhdGVkPQog
ZnJvbSB0aGlzIGRhdGFzZXQgYW5kIGFsc28gZXZlcnkgaGlzdG9yeSB0aGlzIGRhdGFzZXQgaXMg
cGFydCBvZi48L2Rpdj4nKTs9CmUucHVzaCgnPCUgaWYgKCFpdGVtLmdldCgiaXNfdW5yZXN0cmlj
dGVkIikpIHsgJT4nKTtlLnB1c2goIiA8cD5Zb3UgY2FuIHJlbT0Kb3ZlIGFsbCBhY2Nlc3MgcmVz
dHJpY3Rpb25zIG9uIHRoaXMgZGF0YXNldC4gIik7ZS5wdXNoKCcgPGJ1dHRvbiBkYXRhLXRvZ2ds
PQplPTNEInRvb2x0aXAiIGRhdGEtcGxhY2VtZW50PTNEInRvcCIgdGl0bGU9M0QiRXZlcnlib2R5
IHdpbGwgYmUgYWJsZSB0byBhY2M9CmVzcyB0aGUgZGF0YXNldC4iIGNsYXNzPTNEImJ0biBidG4t
ZGVmYXVsdCBidG4tcmVtb3ZlLXJlc3RyaWN0aW9ucyBwcmltYXJ5LT0KYnV0dG9uIiB0eXBlPTNE
ImJ1dHRvbiI+Jyk7ZS5wdXNoKCcgPHNwYW4gY2xhc3M9M0QiZmEgZmEtZ2xvYmUiPiBSZW1vdmUg
cmVzPQp0cmljdGlvbnM8L3NwYW4+Jyk7ZS5wdXNoKCIgPC9idXR0b24+Iik7ZS5wdXNoKCIgPC9w
PiIpO2UucHVzaCgiPCUgfSBlbHNlIHs9CiAlPiIpO2UucHVzaCgiICBUaGlzIGRhdGFzZXQgaXMg
dW5yZXN0cmljdGVkIHNvIGV2ZXJ5Ym9keSBjYW4gYWNjZXNzIGl0LiBKdT0Kc3Qgc2hhcmUgdGhl
IFVSTCBvZiB0aGlzIHBhZ2UuIik7ZS5wdXNoKCcgIDxidXR0b24gZGF0YS10b2dnbGU9M0QidG9v
bHRpcCIgPQpkYXRhLXBsYWNlbWVudD0zRCJ0b3AiIHRpdGxlPTNEIkNvcHkgdG8gY2xpcGJvYXJk
IiBjbGFzcz0zRCJidG4gYnRuLWRlZmF1bHQ9CiBidG4tY29weS1saW5rLXRvLWNsaXBib2FyZCBw
cmltYXJ5LWJ1dHRvbiIgdHlwZT0zRCJidXR0b24iPjxzcGFuIGNsYXNzPTNEIj0KZmEgZmEtY2xp
cGJvYXJkIj4gVG8gQ2xpcGJvYXJkPC9zcGFuPjwvYnV0dG9uPiAnKTtlLnB1c2goIiAgPHA+WW91
IGNhbiBtYWtlPQogdGhpcyBkYXRhc2V0IHByaXZhdGUgdG8geW91LiAiKTtlLnB1c2goJyA8YnV0
dG9uIGRhdGEtdG9nZ2xlPTNEInRvb2x0aXAiIGQ9CmF0YS1wbGFjZW1lbnQ9M0QidG9wIiB0aXRs
ZT0zRCJPbmx5IHlvdSB3aWxsIGJlIGFibGUgdG8gYWNjZXNzIHRoZSBkYXRhc2V0Lj0KIiBjbGFz
cz0zRCJidG4gYnRuLWRlZmF1bHQgYnRuLW1ha2UtcHJpdmF0ZSBwcmltYXJ5LWJ1dHRvbiIgdHlw
ZT0zRCJidXR0b24iPQo+PHNwYW4gY2xhc3M9M0QiZmEgZmEta2V5Ij4gTWFrZSBQcml2YXRlPC9z
cGFuPjwvYnV0dG9uPicpO2UucHVzaCgiIDwvcD4iKTs9CmUucHVzaCgiPCUgfSAlPiIpO2UucHVz
aCgiPGg0PlJvbGVzIHRoYXQgY2FuIGFjY2VzcyB0aGUgZGF0YXNldDwvaDQ+Iik7ZS5wdT0Kc2go
JzxkaXYgaWQ9M0QiYWNjZXNzX3Blcm0iIGNsYXNzPTNEImFjY2Vzc19wZXJtIHJvbGVzLXNlbGVj
dGlvbiI+PC9kaXY+Jyk7PQplLnB1c2goJzxkaXYgY2xhc3M9M0QiYWxlcnQgYWxlcnQtaW5mbyBy
b2xlcy1zZWxlY3Rpb24iPlVzZXIgaGFzIHRvIGhhdmUgPHM9CnRyb25nPmFsbCB0aGVzZSByb2xl
czwvc3Ryb25nPiBpbiBvcmRlciB0byBhY2Nlc3MgdGhpcyBkYXRhc2V0LiBVc2VycyB3aXRobz0K
dXQgYWNjZXNzIHBlcm1pc3Npb24gPHN0cm9uZz5jYW5ub3Q8L3N0cm9uZz4gaGF2ZSBvdGhlciBw
ZXJtaXNzaW9ucyBvbiB0aGlzPQogZGF0YXNldC4gSWYgdGhlcmUgYXJlIG5vIGFjY2VzcyByb2xl
cyBzZXQgb24gdGhlIGRhdGFzZXQgaXQgaXMgY29uc2lkZXJlZCA9CjxzdHJvbmc+dW5yZXN0cmlj
dGVkPC9zdHJvbmc+LjwvZGl2PicpO2UucHVzaCgiPGg0PlJvbGVzIHRoYXQgY2FuIG1hbmFnZSBw
ZT0Kcm1pc3Npb25zIG9uIHRoZSBkYXRhc2V0PC9oND4iKTtlLnB1c2goJzxkaXYgaWQ9M0QibWFu
YWdlX3Blcm0iIGNsYXNzPTNEIm1hPQpuYWdlX3Blcm0gcm9sZXMtc2VsZWN0aW9uIj48L2Rpdj4n
KTtlLnB1c2goJzxkaXYgY2xhc3M9M0QiYWxlcnQgYWxlcnQtaW5mbyA9CnJvbGVzLXNlbGVjdGlv
biI+VXNlciB3aXRoIDxzdHJvbmc+YW55PC9zdHJvbmc+IG9mIHRoZXNlIHJvbGVzIGNhbiBtYW5h
Z2UgcD0KZXJtaXNzaW9ucyBvZiB0aGlzIGRhdGFzZXQuIElmIHlvdSByZW1vdmUgeW91cnNlbGYg
eW91IHdpbGwgbG9vc2UgdGhlIGFiaWxpPQp0eSBtYW5hZ2UgdGhpcyBkYXRhc2V0IHVubGVzcyB5
b3UgYXJlIGFuIGFkbWluLjwvZGl2PicpO2UucHVzaCgnPGJ1dHRvbiBkYXQ9CmEtdG9nZ2xlPTNE
InRvb2x0aXAiIGRhdGEtcGxhY2VtZW50PTNEInRvcCIgdGl0bGU9M0QiU2F2ZSBtb2RpZmljYXRp
b25zIG1hZD0KZSBvbiB0aGlzIHBhZ2UiIGNsYXNzPTNEImJ0biBidG4tZGVmYXVsdCB0b29sYnRu
X3NhdmVfcGVybWlzc2lvbnMgcHJpbWFyeS1iPQp1dHRvbiIgdHlwZT0zRCJidXR0b24iPjxzcGFu
IGNsYXNzPTNEImZhIGZhLWZsb3BweS1vIj48L3NwYW4+IFNhdmU8L3NwYW4+PC89CmJ1dHRvbj4n
KTtlLnB1c2goIjwvZGl2PiIpO2UucHVzaCgiPC9kaXY+Iik7cmV0dXJuIF8udGVtcGxhdGUoZS5q
b2luKCIiKSl9LD0KdGVtcGxhdGVCdWxrSW1wb3J0SW5Nb2RhbDpmdW5jdGlvbigpe3ZhciBlPTNE
W107ZS5wdXNoKCc8c3BhbiBpZD0zRCJoaXN0b3J5PQpfbW9kYWxfY29tYm9fYnVsayIgc3R5bGU9
M0Qid2lkdGg6OTAlOyBtYXJnaW4tbGVmdDogMWVtOyBtYXJnaW4tcmlnaHQ6IDFlbTs9CiAiPicp
O2UucHVzaCgiU2VsZWN0IGhpc3Rvcnk6ICIpO2UucHVzaCgnPHNlbGVjdCBpZD0zRCJkYXRhc2V0
X2ltcG9ydF9zaW5nbD0KZSIgbmFtZT0zRCJkYXRhc2V0X2ltcG9ydF9zaW5nbGUiIHN0eWxlPTNE
IndpZHRoOjUwJTsgbWFyZ2luLWJvdHRvbTogMWVtOyAiPQo+ICcpO2UucHVzaCgiICAgPCUgXy5l
YWNoKGhpc3RvcmllcywgZnVuY3Rpb24oaGlzdG9yeSkgeyAlPiIpO2UucHVzaCgnICAgICA9CiAg
PG9wdGlvbiB2YWx1ZT0zRCI8JT0zRCBfLmVzY2FwZShoaXN0b3J5LmdldCgiaWQiKSkgJT4iPjwl
PTNEIF8uZXNjYXBlKGhpcz0KdG9yeS5nZXQoIm5hbWUiKSkgJT48L29wdGlvbj4nKTtlLnB1c2go
IiAgIDwlIH0pOyAlPiIpO2UucHVzaCgiPC9zZWxlY3Q+Iik7PQplLnB1c2goIjwvc3Bhbj4iKTty
ZXR1cm4gXy50ZW1wbGF0ZShlLmpvaW4oIiIpKX0sdGVtcGxhdGVBY2Nlc3NTZWxlY3Q6ZnVuY3Q9
Cmlvbigpe3ZhciBlPTNEW107ZS5wdXNoKCc8c2VsZWN0IGlkPTNEImFjY2Vzc19zZWxlY3QiIG11
bHRpcGxlPicpO2UucHVzaCgiID0KICA8JSBfLmVhY2gob3B0aW9ucywgZnVuY3Rpb24ob3B0aW9u
KSB7ICU+Iik7ZS5wdXNoKCcgICAgICAgPG9wdGlvbiB2YWx1ZT0KPTNEIjwlLSBvcHRpb24ubmFt
ZSAlPiI+PCUtIG9wdGlvbi5uYW1lICU+PC9vcHRpb24+Jyk7ZS5wdXNoKCIgICA8JSB9KTsgJT4i
PQopO2UucHVzaCgiPC9zZWxlY3Q+Iik7cmV0dXJuIF8udGVtcGxhdGUoZS5qb2luKCIiKSl9fSk7
cmV0dXJue0xpYnJhcnlEYXRhc2U9CnRWaWV3OmF9fSk7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2Yg
ZmlsZQoKZGlmZiAtciA0OWQ1MGJjZTQ2MzIwNmY0NDUwNjNkMmIyN2IyZjJiMzkzYWRiZTExIC1y
IDFjY2Y0MGJkYWZhMTg0YjNiZTMxYWE3PQpiMWVjZGZjZTNiYzcwNWVmYiBzdGF0aWMvc2NyaXB0
cy9wYWNrZWQvbXZjL2xpYnJhcnkvbGlicmFyeS1mb2xkZXItdmlldy5qcwotLS0gYS9zdGF0aWMv
c2NyaXB0cy9wYWNrZWQvbXZjL2xpYnJhcnkvbGlicmFyeS1mb2xkZXItdmlldy5qcworKysgYi9z
dGF0aWMvc2NyaXB0cy9wYWNrZWQvbXZjL2xpYnJhcnkvbGlicmFyeS1mb2xkZXItdmlldy5qcwpA
QCAtMSwxICsxLDEgQEAKLWRlZmluZShbImxpYnMvdG9hc3RyIiwibXZjL2xpYnJhcnkvbGlicmFy
eS1tb2RlbCIsIm12Yy91aS91aS1zZWxlY3QiXSxmdW5jPQp0aW9uKGQsYyxhKXt2YXIgYj0zREJh
Y2tib25lLlZpZXcuZXh0ZW5kKHtlbDoiI2NlbnRlciIsbW9kZWw6bnVsbCxvcHRpb25zOns9Cn0s
ZXZlbnRzOnsiY2xpY2sgLnRvb2xidG5fc2F2ZV9wZXJtaXNzaW9ucyI6InNhdmVQZXJtaXNzaW9u
cyJ9LGluaXRpYWxpemU6Zj0KdW5jdGlvbihlKXt0aGlzLm9wdGlvbnM9M0RfLmV4dGVuZCh0aGlz
Lm9wdGlvbnMsZSk7aWYodGhpcy5vcHRpb25zLmlkKXt0aGlzPQouZmV0Y2hGb2xkZXIoKX19LGZl
dGNoRm9sZGVyOmZ1bmN0aW9uKGUpe3RoaXMub3B0aW9ucz0zRF8uZXh0ZW5kKHRoaXMub3B0aW89
Cm5zLGUpO3RoaXMubW9kZWw9M0RuZXcgYy5Gb2xkZXJBc01vZGVsKHtpZDp0aGlzLm9wdGlvbnMu
aWR9KTt2YXIgZj0zRHRoaXM7dD0KaGlzLm1vZGVsLmZldGNoKHtzdWNjZXNzOmZ1bmN0aW9uKCl7
aWYoZi5vcHRpb25zLnNob3dfcGVybWlzc2lvbnMpe2Yuc2hvd1BlPQpybWlzc2lvbnMoKX1lbHNl
e2YucmVuZGVyKCl9fSxlcnJvcjpmdW5jdGlvbihoLGcpe2lmKHR5cGVvZiBnLnJlc3BvbnNlSlNP
TiE9Cj0zRD0zRCJ1bmRlZmluZWQiKXtkLmVycm9yKGcucmVzcG9uc2VKU09OLmVycl9tc2crIiBD
bGljayB0aGlzIHRvIGdvIGJhY2suIj0KLCIiLHtvbmNsaWNrOmZ1bmN0aW9uKCl7R2FsYXh5Lmxp
YnJhcmllcy5saWJyYXJ5X3JvdXRlci5iYWNrKCl9fSl9ZWxzZXtkLmVyPQpyb3IoIkFuIGVycm9y
IG9jdXJyZWQuIENsaWNrIHRoaXMgdG8gZ28gYmFjay4iLCIiLHtvbmNsaWNrOmZ1bmN0aW9uKCl7
R2FsYXg9CnkubGlicmFyaWVzLmxpYnJhcnlfcm91dGVyLmJhY2soKX19KX19fSl9LHJlbmRlcjpm
dW5jdGlvbihlKXskKCIudG9vbHRpcCIpLj0KcmVtb3ZlKCk7dGhpcy5vcHRpb25zPTNEXy5leHRl
bmQodGhpcy5vcHRpb25zLGUpO3ZhciBmPTNEdGhpcy50ZW1wbGF0ZUZvbGRlPQpyKCk7dGhpcy4k
ZWwuaHRtbChmKHtpdGVtOnRoaXMubW9kZWx9KSk7JCgiLnBlZWsiKS5odG1sKHRoaXMubW9kZWwu
Z2V0KCJwZWU9CmsiKSk7JCgiI2NlbnRlciBbZGF0YS10b2dnbGVdIikudG9vbHRpcCgpfSxzaGFy
ZUZvbGRlcjpmdW5jdGlvbigpe2QuaW5mbygiRj0KZWF0dXJlIGNvbWluZyBzb29uLiIpfSxnb0Jh
Y2s6ZnVuY3Rpb24oKXtHYWxheHkubGlicmFyaWVzLmxpYnJhcnlfcm91dGVyLmJhPQpjaygpfSxz
aG93UGVybWlzc2lvbnM6ZnVuY3Rpb24oZil7dGhpcy5vcHRpb25zPTNEXy5leHRlbmQodGhpcy5v
cHRpb25zLGYpOyQ9CigiLnRvb2x0aXAiKS5yZW1vdmUoKTt2YXIgaD0zRGZhbHNlO2lmKEdhbGF4
eS5jdXJyVXNlcil7aD0zREdhbGF4eS5jdXJyVXNlcj0KLmlzQWRtaW4oKX12YXIgZz0zRHRoaXMu
dGVtcGxhdGVGb2xkZXJQZXJtaXNzaW9ucygpO3RoaXMuJGVsLmh0bWwoZyh7Zm9sZGVyPQo6dGhp
cy5tb2RlbCxpc19hZG1pbjpofSkpO3ZhciBlPTNEdGhpcztpZih0aGlzLm9wdGlvbnMuZmV0Y2hl
ZF9wZXJtaXNzaW9ucz0KPTNEPTNEPTNEdW5kZWZpbmVkKXskLmdldCgiL2FwaS9mb2xkZXJzLyIr
ZS5pZCsiL3Blcm1pc3Npb25zP3Njb3BlPTNEY3VycmVuPQp0IikuZG9uZShmdW5jdGlvbihpKXtl
LnByZXBhcmVTZWxlY3RCb3hlcyh7ZmV0Y2hlZF9wZXJtaXNzaW9uczppfSl9KS5mYWlsKGY9CnVu
Y3Rpb24oKXtkLmVycm9yKCJBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBhdHRlbXB0aW5nIHRvIGZl
dGNoIGZvbGRlciBwZXJtaT0Kc3Npb25zLiIpfSl9ZWxzZXt0aGlzLnByZXBhcmVTZWxlY3RCb3hl
cyh7fSl9JCgiI2NlbnRlciBbZGF0YS10b2dnbGVdIikudG9vPQpsdGlwKCk7JCgiI2NlbnRlciIp
LmNzcygib3ZlcmZsb3ciLCJhdXRvIil9LF9zZXJpYWxpemVSb2xlczpmdW5jdGlvbihnKXt2YXI9
CiBlPTNEW107Zm9yKHZhciBmPTNEMDtmPGcubGVuZ3RoO2YrKyl7ZS5wdXNoKGdbZl0rIjoiK2db
Zl0pfXJldHVybiBlfSxwcmVwYT0KcmVTZWxlY3RCb3hlczpmdW5jdGlvbihoKXt0aGlzLm9wdGlv
bnM9M0RfLmV4dGVuZCh0aGlzLm9wdGlvbnMsaCk7dmFyIGY9M0R0PQpoaXMub3B0aW9ucy5mZXRj
aGVkX3Blcm1pc3Npb25zO3ZhciBnPTNEdGhpczt2YXIgaT0zRHRoaXMuX3NlcmlhbGl6ZVJvbGVz
KGY9Ci5hZGRfbGlicmFyeV9pdGVtX3JvbGVfbGlzdCk7dmFyIGo9M0R0aGlzLl9zZXJpYWxpemVS
b2xlcyhmLm1hbmFnZV9mb2xkZXJfcj0Kb2xlX2xpc3QpO3ZhciBlPTNEdGhpcy5fc2VyaWFsaXpl
Um9sZXMoZi5tb2RpZnlfZm9sZGVyX3JvbGVfbGlzdCk7Zy5hZGRTZWxlPQpjdE9iamVjdD0zRG5l
dyBhLlZpZXcodGhpcy5fY3JlYXRlU2VsZWN0T3B0aW9ucyh0aGlzLCJhZGRfcGVybSIsaSxmYWxz
ZSkpO2c9Ci5tYW5hZ2VTZWxlY3RPYmplY3Q9M0RuZXcgYS5WaWV3KHRoaXMuX2NyZWF0ZVNlbGVj
dE9wdGlvbnModGhpcywibWFuYWdlX3Blcj0KbSIsaixmYWxzZSkpO2cubW9kaWZ5U2VsZWN0T2Jq
ZWN0PTNEbmV3IGEuVmlldyh0aGlzLl9jcmVhdGVTZWxlY3RPcHRpb25zKHRoPQppcywibW9kaWZ5
X3Blcm0iLGUsZmFsc2UpKX0sX2NyZWF0ZVNlbGVjdE9wdGlvbnM6ZnVuY3Rpb24oZSxqLGgpe3Zh
ciBpPTNEe209CmluaW11bUlucHV0TGVuZ3RoOjAsY3NzOmosbXVsdGlwbGU6dHJ1ZSxwbGFjZWhv
bGRlcjoiQ2xpY2sgdG8gc2VsZWN0IGEgcm9sZT0KIixjb250YWluZXI6ZS4kZWwuZmluZCgiIyIr
aiksYWpheDp7dXJsOiIvYXBpL2ZvbGRlcnMvIitlLmlkKyIvcGVybWlzc2lvbnM/PQpzY29wZT0z
RGF2YWlsYWJsZSIsZGF0YVR5cGU6Impzb24iLHF1aWV0TWlsbGlzOjEwMCxkYXRhOmZ1bmN0aW9u
KGssbCl7cmV0dXI9Cm57cTprLHBhZ2VfbGltaXQ6MTAscGFnZTpsfX0scmVzdWx0czpmdW5jdGlv
bihtLGwpe3ZhciBrPTNEKGwqMTApPG0udG90YWw7cj0KZXR1cm57cmVzdWx0czptLnJvbGVzLG1v
cmU6a319fSxmb3JtYXRSZXN1bHQ6ZnVuY3Rpb24gZihrKXtyZXR1cm4gay5uYW1lKyIgPQp0eXBl
OiAiK2sudHlwZX0sZm9ybWF0U2VsZWN0aW9uOmZ1bmN0aW9uIGcoayl7cmV0dXJuIGsubmFtZX0s
aW5pdFNlbGVjdGlvbjo9CmZ1bmN0aW9uKGssbSl7dmFyIGw9M0RbXTskKGsudmFsKCkuc3BsaXQo
IiwiKSkuZWFjaChmdW5jdGlvbigpe3ZhciBuPTNEdGhpcz0KLnNwbGl0KCI6Iik7bC5wdXNoKHtp
ZDpuWzFdLG5hbWU6blsxXX0pfSk7bShsKX0saW5pdGlhbERhdGE6aC5qb2luKCIsIiksZHJvPQpw
ZG93bkNzc0NsYXNzOiJiaWdkcm9wIn07cmV0dXJuIGl9LGNvbWluZ1Nvb246ZnVuY3Rpb24oKXtk
Lndhcm5pbmcoIkZlYXR1cmU9CiBjb21pbmcgc29vbi4iKX0sY29weVRvQ2xpcGJvYXJkOmZ1bmN0
aW9uKCl7dmFyIGU9M0RCYWNrYm9uZS5oaXN0b3J5LmxvY2F0aT0Kb24uaHJlZjtpZihlLmxhc3RJ
bmRleE9mKCIvcGVybWlzc2lvbnMiKSE9M0Q9M0QtMSl7ZT0zRGUuc3Vic3RyKDAsZS5sYXN0SW5k
PQpleE9mKCIvcGVybWlzc2lvbnMiKSl9d2luZG93LnByb21wdCgiQ29weSB0byBjbGlwYm9hcmQ6
IEN0cmwrQywgRW50ZXIiLGUpfSw9Cl9leHRyYWN0SWRzOmZ1bmN0aW9uKGUpe2lkc19saXN0PTNE
W107Zm9yKHZhciBmPTNEZS5sZW5ndGgtMTtmPj0zRDA7Zi0tKXtpZD0Kc19saXN0LnB1c2goZVtm
XS5pZCl9cmV0dXJuIGlkc19saXN0fSxzYXZlUGVybWlzc2lvbnM6ZnVuY3Rpb24oaCl7dmFyIGc9
M0R0PQpoaXM7dmFyIGU9M0R0aGlzLl9leHRyYWN0SWRzKHRoaXMuYWRkU2VsZWN0T2JqZWN0LiRl
bC5zZWxlY3QyKCJkYXRhIikpO3ZhciA9Cmk9M0R0aGlzLl9leHRyYWN0SWRzKHRoaXMubWFuYWdl
U2VsZWN0T2JqZWN0LiRlbC5zZWxlY3QyKCJkYXRhIikpO3ZhciBmPTNEdD0KaGlzLl9leHRyYWN0
SWRzKHRoaXMubW9kaWZ5U2VsZWN0T2JqZWN0LiRlbC5zZWxlY3QyKCJkYXRhIikpOyQucG9zdCgi
L2FwaS9mPQpvbGRlcnMvIitnLmlkKyIvcGVybWlzc2lvbnM/YWN0aW9uPTNEc2V0X3Blcm1pc3Np
b25zIix7ImFkZF9pZHNbXSI6ZSwibWFuYWc9CmVfaWRzW10iOmksIm1vZGlmeV9pZHNbXSI6Zix9
KS5kb25lKGZ1bmN0aW9uKGope2cuc2hvd1Blcm1pc3Npb25zKHtmZXRjaGVkXz0KcGVybWlzc2lv
bnM6an0pO2Quc3VjY2VzcygiUGVybWlzc2lvbnMgc2F2ZWQuIil9KS5mYWlsKGZ1bmN0aW9uKCl7
ZC5lcnJvcigiPQpBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBhdHRlbXB0aW5nIHRvIHNldCBmb2xk
ZXIgcGVybWlzc2lvbnMuIil9KX0sdGVtcGxhdGU9CkZvbGRlcjpmdW5jdGlvbigpe3ZhciBlPTNE
W107ZS5wdXNoKCc8ZGl2IGNsYXNzPTNEImxpYnJhcnlfc3R5bGVfY29udGFpbmVyIj0KPicpO2Uu
cHVzaCgnICA8ZGl2IGlkPTNEImxpYnJhcnlfdG9vbGJhciI+Jyk7ZS5wdXNoKCcgICA8YnV0dG9u
IGRhdGEtdG9nZ2xlPQo9M0QidG9vbHRpcCIgZGF0YS1wbGFjZW1lbnQ9M0QidG9wIiB0aXRsZT0z
RCJNb2RpZnkgbGlicmFyeSBpdGVtIiBjbGFzcz0zRCI9CmJ0biBidG4tZGVmYXVsdCB0b29sYnRu
X21vZGlmeV9kYXRhc2V0IHByaW1hcnktYnV0dG9uIiB0eXBlPTNEImJ1dHRvbiI+PHNwYT0KbiBj
bGFzcz0zRCJmYSBmYS1wZW5jaWwiPjwvc3Bhbj4gTW9kaWZ5PC9zcGFuPjwvYnV0dG9uPicpO2Uu
cHVzaCgnICAgPGEgaHJlPQpmPTNEIiNmb2xkZXJzLzwlLSBpdGVtLmdldCgiZm9sZGVyX2lkIikg
JT4vZGF0YXNldHMvPCUtIGl0ZW0uaWQgJT4vcGVybWlzc2k9Cm9ucyI+PGJ1dHRvbiBkYXRhLXRv
Z2dsZT0zRCJ0b29sdGlwIiBkYXRhLXBsYWNlbWVudD0zRCJ0b3AiIHRpdGxlPTNEIk1hbmFnZT0K
IHBlcm1pc3Npb25zIiBjbGFzcz0zRCJidG4gYnRuLWRlZmF1bHQgdG9vbGJ0bl9jaGFuZ2VfcGVy
bWlzc2lvbnMgcHJpbWFyeS1iPQp1dHRvbiIgdHlwZT0zRCJidXR0b24iPjxzcGFuIGNsYXNzPTNE
ImZhIGZhLWdyb3VwIj48L3NwYW4+IFBlcm1pc3Npb25zPC9zcGE9Cm4+PC9idXR0b24+PC9hPicp
O2UucHVzaCgnICAgPGJ1dHRvbiBkYXRhLXRvZ2dsZT0zRCJ0b29sdGlwIiBkYXRhLXBsYWNlbWVu
dD0KPTNEInRvcCIgdGl0bGU9M0QiU2hhcmUgZGF0YXNldCIgY2xhc3M9M0QiYnRuIGJ0bi1kZWZh
dWx0IHRvb2xidG4tc2hhcmUtZGF0PQphc2V0IHByaW1hcnktYnV0dG9uIiB0eXBlPTNEImJ1dHRv
biI+PHNwYW4gY2xhc3M9M0QiZmEgZmEtc2hhcmUiPjwvc3Bhbj4gU2g9CmFyZTwvc3Bhbj48L2J1
dHRvbj4nKTtlLnB1c2goIiAgPC9kaXY+Iik7ZS5wdXNoKCIgIDxwPiIpO2UucHVzaCgiICBUaGlz
IGRhdD0KYXNldCBpcyB1bnJlc3RyaWN0ZWQgc28gZXZlcnlib2R5IGNhbiBhY2Nlc3MgaXQuIEp1
c3Qgc2hhcmUgdGhlIFVSTCBvZiB0aGlzPQogcGFnZS4gIik7ZS5wdXNoKCcgIDxidXR0b24gZGF0
YS10b2dnbGU9M0QidG9vbHRpcCIgZGF0YS1wbGFjZW1lbnQ9M0QidG9wIiA9CnRpdGxlPTNEIkNv
cHkgdG8gY2xpcGJvYXJkIiBjbGFzcz0zRCJidG4gYnRuLWRlZmF1bHQgYnRuLWNvcHktbGluay10
by1jbGlwYj0Kb2FyZCBwcmltYXJ5LWJ1dHRvbiIgdHlwZT0zRCJidXR0b24iPjxzcGFuIGNsYXNz
PTNEImZhIGZhLWNsaXBib2FyZCI+PC9zcGFuPQo+IFRvIENsaXBib2FyZDwvc3Bhbj48L2J1dHRv
bj4gJyk7ZS5wdXNoKCIgIDwvcD4iKTtlLnB1c2goJzxkaXYgY2xhc3M9M0QiZGE9CnRhc2V0X3Rh
YmxlIj4nKTtlLnB1c2goJyAgIDx0YWJsZSBjbGFzcz0zRCJncmlkIHRhYmxlIHRhYmxlLXN0cmlw
ZWQgdGFibGUtYz0Kb25kZW5zZWQiPicpO2UucHVzaCgiICAgICAgIDx0cj4iKTtlLnB1c2goJyAg
ICAgICAgICAgPHRoIHNjb3BlPTNEInJvdyIgaWQ9Cj0zRCJpZF9yb3ciIGRhdGEtaWQ9M0QiPCU9
M0QgXy5lc2NhcGUoaXRlbS5nZXQoImxkZGFfaWQiKSkgJT4iPk5hbWU8L3RoPicpOz0KZS5wdXNo
KCcgICAgICAgICAgIDx0ZD48JT0zRCBfLmVzY2FwZShpdGVtLmdldCgibmFtZSIpKSAlPjwvdGQ+
Jyk7ZS5wdXNoKCIgPQogICAgICA8L3RyPiIpO2UucHVzaCgnICAgPCUgaWYgKGl0ZW0uZ2V0KCJm
aWxlX2V4dCIpKSB7ICU+Jyk7ZS5wdXNoKCIgICAgICA9CiA8dHI+Iik7ZS5wdXNoKCcgICAgICAg
ICAgIDx0aCBzY29wZT0zRCJyb3ciPkRhdGEgdHlwZTwvdGg+Jyk7ZS5wdXNoKCcgICAgID0KICAg
ICAgPHRkPjwlPTNEIF8uZXNjYXBlKGl0ZW0uZ2V0KCJmaWxlX2V4dCIpKSAlPjwvdGQ+Jyk7ZS5w
dXNoKCIgICAgICAgPC90PQpyPiIpO2UucHVzaCgiICAgPCUgfSAlPiIpO2UucHVzaCgiICAgIDwv
dGFibGU+Iik7ZS5wdXNoKCI8L2Rpdj4iKTtlLnB1c2goIjw9Ci9kaXY+Iik7cmV0dXJuIF8udGVt
cGxhdGUoZS5qb2luKCIiKSl9LHRlbXBsYXRlRm9sZGVyUGVybWlzc2lvbnM6ZnVuY3Rpb24oKT0K
e3ZhciBlPTNEW107ZS5wdXNoKCc8ZGl2IGNsYXNzPTNEImxpYnJhcnlfc3R5bGVfY29udGFpbmVy
Ij4nKTtlLnB1c2goJyAgPGRpPQp2IGlkPTNEImxpYnJhcnlfdG9vbGJhciI+Jyk7ZS5wdXNoKCcg
ICA8YSBocmVmPTNEIiMvZm9sZGVycy88JT0zRCBmb2xkZXIuZ2U9CnQoInBhcmVudF9pZCIpICU+
Ij48YnV0dG9uIGRhdGEtdG9nZ2xlPTNEInRvb2x0aXAiIGRhdGEtcGxhY2VtZW50PTNEInRvcCIg
dD0KaXRsZT0zRCJHbyBiYWNrIHRvIHRoZSBwYXJlbnQgZm9sZGVyIiBjbGFzcz0zRCJidG4gYnRu
LWRlZmF1bHQgcHJpbWFyeS1idXR0PQpvbiIgdHlwZT0zRCJidXR0b24iPjxzcGFuIGNsYXNzPTNE
ImZhIGZhLWNhcmV0LWxlZnQgZmEtbGciPjwvc3Bhbj4gUGFyZW50IGY9Cm9sZGVyPC9zcGFuPjwv
YnV0dG9uPjwvYT4nKTtlLnB1c2goIiAgPC9kaXY+Iik7ZS5wdXNoKCc8aDE+Rm9sZGVyOiA8JT0z
RCBfLj0KZXNjYXBlKGZvbGRlci5nZXQoIm5hbWUiKSkgJT48L2gxPicpO2UucHVzaCgnPGRpdiBj
bGFzcz0zRCJhbGVydCBhbGVydC13YXJuPQppbmciPicpO2UucHVzaCgiPCUgaWYgKGlzX2FkbWlu
KSB7ICU+Iik7ZS5wdXNoKCJZb3UgYXJlIGxvZ2dlZCBpbiBhcyBhbiA8c3Q9CnJvbmc+YWRtaW5p
c3RyYXRvcjwvc3Ryb25nPiB0aGVyZWZvcmUgeW91IGNhbiBtYW5hZ2UgYW55IGZvbGRlciBvbiB0
aGlzIEdhbD0KYXh5IGluc3RhbmNlLiBQbGVhc2UgbWFrZSBzdXJlIHlvdSB1bmRlcnN0YW5kIHRo
ZSBjb25zZXF1ZW5jZXMuIik7ZS5wdXNoKCI8PQolIH0gZWxzZSB7ICU+Iik7ZS5wdXNoKCJZb3Ug
Y2FuIGFzc2lnbiBhbnkgbnVtYmVyIG9mIHJvbGVzIHRvIGFueSBvZiB0aGUgZm89Cmxsb3dpbmcg
cGVybWlzc2lvbiB0eXBlcy4gSG93ZXZlciBwbGVhc2UgcmVhZCBjYXJlZnVsbHkgdGhlIGltcGxp
Y2F0aW9ucyBvZj0KIHN1Y2ggYWN0aW9ucy4iKTtlLnB1c2goIjwlIH0lPiIpO2UucHVzaCgiPC9k
aXY+Iik7ZS5wdXNoKCc8ZGl2IGNsYXNzPTNEImRhPQp0YXNldF90YWJsZSI+Jyk7ZS5wdXNoKCI8
aDI+Rm9sZGVyIHBlcm1pc3Npb25zPC9oMj4iKTtlLnB1c2goIjxoND5Sb2xlcyB0aGE9CnQgY2Fu
IG1hbmFnZSBwZXJtaXNzaW9ucyBvbiB0aGlzIGZvbGRlcjwvaDQ+Iik7ZS5wdXNoKCc8ZGl2IGlk
PTNEIm1hbmFnZV9wZT0Kcm0iIGNsYXNzPTNEIm1hbmFnZV9wZXJtIHJvbGVzLXNlbGVjdGlvbiI+
PC9kaXY+Jyk7ZS5wdXNoKCc8ZGl2IGNsYXNzPTNEImFsPQplcnQgYWxlcnQtaW5mbyByb2xlcy1z
ZWxlY3Rpb24iPlVzZXIgd2l0aCA8c3Ryb25nPmFueTwvc3Ryb25nPiBvZiB0aGVzZSByb2w9CmVz
IGNhbiBtYW5hZ2UgcGVybWlzc2lvbnMgb24gdGhpcyBmb2xkZXIuPC9kaXY+Jyk7ZS5wdXNoKCI8
aDQ+Um9sZXMgdGhhdCBjYT0KbiBhZGQgaXRlbXMgdG8gdGhpcyBmb2xkZXI8L2g0PiIpO2UucHVz
aCgnPGRpdiBpZD0zRCJhZGRfcGVybSIgY2xhc3M9M0QiYWRkPQpfcGVybSByb2xlcy1zZWxlY3Rp
b24iPjwvZGl2PicpO2UucHVzaCgnPGRpdiBjbGFzcz0zRCJhbGVydCBhbGVydC1pbmZvIHJvbGU9
CnMtc2VsZWN0aW9uIj5Vc2VyIHdpdGggPHN0cm9uZz5hbnk8L3N0cm9uZz4gb2YgdGhlc2Ugcm9s
ZXMgY2FuIGFkZCBpdGVtcyB0bz0KIHRoaXMgZm9sZGVyIChmb2xkZXJzIGFuZCBkYXRhc2V0cyku
PC9kaXY+Jyk7ZS5wdXNoKCI8aDQ+Um9sZXMgdGhhdCBjYW4gbW9kPQppZnkgdGhpcyBmb2xkZXI8
L2g0PiIpO2UucHVzaCgnPGRpdiBpZD0zRCJtb2RpZnlfcGVybSIgY2xhc3M9M0QibW9kaWZ5X3Bl
cm09CiByb2xlcy1zZWxlY3Rpb24iPjwvZGl2PicpO2UucHVzaCgnPGRpdiBjbGFzcz0zRCJhbGVy
dCBhbGVydC1pbmZvIHJvbGVzLXNlbD0KZWN0aW9uIj5Vc2VyIHdpdGggPHN0cm9uZz5hbnk8L3N0
cm9uZz4gb2YgdGhlc2Ugcm9sZXMgY2FuIG1vZGlmeSB0aGlzIGZvbGRlPQpyIChuYW1lLCBldGMu
KS48L2Rpdj4nKTtlLnB1c2goJzxidXR0b24gZGF0YS10b2dnbGU9M0QidG9vbHRpcCIgZGF0YS1w
bGFjZW09CmVudD0zRCJ0b3AiIHRpdGxlPTNEIlNhdmUgbW9kaWZpY2F0aW9ucyIgY2xhc3M9M0Qi
YnRuIGJ0bi1kZWZhdWx0IHRvb2xidG5fcz0KYXZlX3Blcm1pc3Npb25zIHByaW1hcnktYnV0dG9u
IiB0eXBlPTNEImJ1dHRvbiI+PHNwYW4gY2xhc3M9M0QiZmEgZmEtZmxvcHB5PQotbyI+PC9zcGFu
PiBTYXZlPC9zcGFuPjwvYnV0dG9uPicpO2UucHVzaCgiPC9kaXY+Iik7ZS5wdXNoKCI8L2Rpdj4i
KTtyZXR1cm49CiBfLnRlbXBsYXRlKGUuam9pbigiIikpfX0pO3JldHVybntGb2xkZXJWaWV3OmJ9
fSk7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorZGVmaW5lKFsibGlicy90b2FzdHIiLCJt
dmMvbGlicmFyeS9saWJyYXJ5LW1vZGVsIiwibXZjL3VpL3VpLXNlbGVjdCJdLGZ1bmM9CnRpb24o
ZCxjLGEpe3ZhciBiPTNEQmFja2JvbmUuVmlldy5leHRlbmQoe2VsOiIjY2VudGVyIixtb2RlbDpu
dWxsLG9wdGlvbnM6ez0KfSxldmVudHM6eyJjbGljayAudG9vbGJ0bl9zYXZlX3Blcm1pc3Npb25z
Ijoic2F2ZVBlcm1pc3Npb25zIn0saW5pdGlhbGl6ZTpmPQp1bmN0aW9uKGUpe3RoaXMub3B0aW9u
cz0zRF8uZXh0ZW5kKHRoaXMub3B0aW9ucyxlKTtpZih0aGlzLm9wdGlvbnMuaWQpe3RoaXM9Ci5m
ZXRjaEZvbGRlcigpfX0sZmV0Y2hGb2xkZXI6ZnVuY3Rpb24oZSl7dGhpcy5vcHRpb25zPTNEXy5l
eHRlbmQodGhpcy5vcHRpbz0KbnMsZSk7dGhpcy5tb2RlbD0zRG5ldyBjLkZvbGRlckFzTW9kZWwo
e2lkOnRoaXMub3B0aW9ucy5pZH0pO3ZhciBmPTNEdGhpczt0PQpoaXMubW9kZWwuZmV0Y2goe3N1
Y2Nlc3M6ZnVuY3Rpb24oKXtpZihmLm9wdGlvbnMuc2hvd19wZXJtaXNzaW9ucyl7Zi5zaG93UGU9
CnJtaXNzaW9ucygpfWVsc2V7Zi5yZW5kZXIoKX19LGVycm9yOmZ1bmN0aW9uKGgsZyl7aWYodHlw
ZW9mIGcucmVzcG9uc2VKU09OIT0KPTNEPTNEInVuZGVmaW5lZCIpe2QuZXJyb3IoZy5yZXNwb25z
ZUpTT04uZXJyX21zZysiIENsaWNrIHRoaXMgdG8gZ28gYmFjay4iPQosIiIse29uY2xpY2s6ZnVu
Y3Rpb24oKXtHYWxheHkubGlicmFyaWVzLmxpYnJhcnlfcm91dGVyLmJhY2soKX19KX1lbHNle2Qu
ZXI9CnJvcigiQW4gZXJyb3Igb2N1cnJlZC4gQ2xpY2sgdGhpcyB0byBnbyBiYWNrLiIsIiIse29u
Y2xpY2s6ZnVuY3Rpb24oKXtHYWxheD0KeS5saWJyYXJpZXMubGlicmFyeV9yb3V0ZXIuYmFjaygp
fX0pfX19KX0scmVuZGVyOmZ1bmN0aW9uKGUpeyQoIi50b29sdGlwIikuPQpyZW1vdmUoKTt0aGlz
Lm9wdGlvbnM9M0RfLmV4dGVuZCh0aGlzLm9wdGlvbnMsZSk7dmFyIGY9M0R0aGlzLnRlbXBsYXRl
Rm9sZGU9CnIoKTt0aGlzLiRlbC5odG1sKGYoe2l0ZW06dGhpcy5tb2RlbH0pKTskKCIucGVlayIp
Lmh0bWwodGhpcy5tb2RlbC5nZXQoInBlZT0KayIpKTskKCIjY2VudGVyIFtkYXRhLXRvZ2dsZV0i
KS50b29sdGlwKCl9LHNoYXJlRm9sZGVyOmZ1bmN0aW9uKCl7ZC5pbmZvKCJGPQplYXR1cmUgY29t
aW5nIHNvb24uIil9LGdvQmFjazpmdW5jdGlvbigpe0dhbGF4eS5saWJyYXJpZXMubGlicmFyeV9y
b3V0ZXIuYmE9CmNrKCl9LHNob3dQZXJtaXNzaW9uczpmdW5jdGlvbihmKXt0aGlzLm9wdGlvbnM9
M0RfLmV4dGVuZCh0aGlzLm9wdGlvbnMsZik7JD0KKCIudG9vbHRpcCIpLnJlbW92ZSgpO3ZhciBo
PTNEZmFsc2U7aWYoR2FsYXh5LmN1cnJVc2VyKXtoPTNER2FsYXh5LmN1cnJVc2VyPQouaXNBZG1p
bigpfXZhciBnPTNEdGhpcy50ZW1wbGF0ZUZvbGRlclBlcm1pc3Npb25zKCk7dGhpcy4kZWwuaHRt
bChnKHtmb2xkZXI9Cjp0aGlzLm1vZGVsLGlzX2FkbWluOmh9KSk7dmFyIGU9M0R0aGlzO2lmKHRo
aXMub3B0aW9ucy5mZXRjaGVkX3Blcm1pc3Npb25zPQo9M0Q9M0Q9M0R1bmRlZmluZWQpeyQuZ2V0
KCh3aW5kb3cuZ2FsYXh5X2NvbmZpZz9nYWxheHlfY29uZmlnLnJvb3Q6Ii8iKSsiYXA9CmkvZm9s
ZGVycy8iK2UuaWQrIi9wZXJtaXNzaW9ucz9zY29wZT0zRGN1cnJlbnQiKS5kb25lKGZ1bmN0aW9u
KGkpe2UucHJlcGFyZT0KU2VsZWN0Qm94ZXMoe2ZldGNoZWRfcGVybWlzc2lvbnM6aX0pfSkuZmFp
bChmdW5jdGlvbigpe2QuZXJyb3IoIkFuIGVycm9yIG9jPQpjdXJyZWQgd2hpbGUgYXR0ZW1wdGlu
ZyB0byBmZXRjaCBmb2xkZXIgcGVybWlzc2lvbnMuIil9KX1lbHNle3RoaXMucHJlcGFyZVM9CmVs
ZWN0Qm94ZXMoe30pfSQoIiNjZW50ZXIgW2RhdGEtdG9nZ2xlXSIpLnRvb2x0aXAoKTskKCIjY2Vu
dGVyIikuY3NzKCJvdmVyZj0KbG93IiwiYXV0byIpfSxfc2VyaWFsaXplUm9sZXM6ZnVuY3Rpb24o
Zyl7dmFyIGU9M0RbXTtmb3IodmFyIGY9M0QwO2Y8Zy5sZW5nPQp0aDtmKyspe2UucHVzaChnW2Zd
KyI6IitnW2ZdKX1yZXR1cm4gZX0scHJlcGFyZVNlbGVjdEJveGVzOmZ1bmN0aW9uKGgpe3RoaXM9
Ci5vcHRpb25zPTNEXy5leHRlbmQodGhpcy5vcHRpb25zLGgpO3ZhciBmPTNEdGhpcy5vcHRpb25z
LmZldGNoZWRfcGVybWlzc2lvbj0Kczt2YXIgZz0zRHRoaXM7dmFyIGk9M0R0aGlzLl9zZXJpYWxp
emVSb2xlcyhmLmFkZF9saWJyYXJ5X2l0ZW1fcm9sZV9saXN0KTt2PQphciBqPTNEdGhpcy5fc2Vy
aWFsaXplUm9sZXMoZi5tYW5hZ2VfZm9sZGVyX3JvbGVfbGlzdCk7dmFyIGU9M0R0aGlzLl9zZXJp
YWw9Cml6ZVJvbGVzKGYubW9kaWZ5X2ZvbGRlcl9yb2xlX2xpc3QpO2cuYWRkU2VsZWN0T2JqZWN0
PTNEbmV3IGEuVmlldyh0aGlzLl9jcj0KZWF0ZVNlbGVjdE9wdGlvbnModGhpcywiYWRkX3Blcm0i
LGksZmFsc2UpKTtnLm1hbmFnZVNlbGVjdE9iamVjdD0zRG5ldyBhLlZpPQpldyh0aGlzLl9jcmVh
dGVTZWxlY3RPcHRpb25zKHRoaXMsIm1hbmFnZV9wZXJtIixqLGZhbHNlKSk7Zy5tb2RpZnlTZWxl
Y3RPYmo9CmVjdD0zRG5ldyBhLlZpZXcodGhpcy5fY3JlYXRlU2VsZWN0T3B0aW9ucyh0aGlzLCJt
b2RpZnlfcGVybSIsZSxmYWxzZSkpfSxfYz0KcmVhdGVTZWxlY3RPcHRpb25zOmZ1bmN0aW9uKGUs
aixoKXt2YXIgaT0zRHttaW5pbXVtSW5wdXRMZW5ndGg6MCxjc3M6aixtdWx0PQppcGxlOnRydWUs
cGxhY2Vob2xkZXI6IkNsaWNrIHRvIHNlbGVjdCBhIHJvbGUiLGNvbnRhaW5lcjplLiRlbC5maW5k
KCIjIitqKSw9CmFqYXg6e3VybDood2luZG93LmdhbGF4eV9jb25maWc/Z2FsYXh5X2NvbmZpZy5y
b290OiIvIikrImFwaS9mb2xkZXJzLyIrZS5pZD0KKyIvcGVybWlzc2lvbnM/c2NvcGU9M0RhdmFp
bGFibGUiLGRhdGFUeXBlOiJqc29uIixxdWlldE1pbGxpczoxMDAsZGF0YTpmdW5jPQp0aW9uKGss
bCl7cmV0dXJue3E6ayxwYWdlX2xpbWl0OjEwLHBhZ2U6bH19LHJlc3VsdHM6ZnVuY3Rpb24obSxs
KXt2YXIgaz0zRCg9CmwqMTApPG0udG90YWw7cmV0dXJue3Jlc3VsdHM6bS5yb2xlcyxtb3JlOmt9
fX0sZm9ybWF0UmVzdWx0OmZ1bmN0aW9uIGYoayl7cj0KZXR1cm4gay5uYW1lKyIgdHlwZTogIitr
LnR5cGV9LGZvcm1hdFNlbGVjdGlvbjpmdW5jdGlvbiBnKGspe3JldHVybiBrLm5hbWV9PQosaW5p
dFNlbGVjdGlvbjpmdW5jdGlvbihrLG0pe3ZhciBsPTNEW107JChrLnZhbCgpLnNwbGl0KCIsIikp
LmVhY2goZnVuY3Rpb249Cigpe3ZhciBuPTNEdGhpcy5zcGxpdCgiOiIpO2wucHVzaCh7aWQ6blsx
XSxuYW1lOm5bMV19KX0pO20obCl9LGluaXRpYWxEYXRhOj0KaC5qb2luKCIsIiksZHJvcGRvd25D
c3NDbGFzczoiYmlnZHJvcCJ9O3JldHVybiBpfSxjb21pbmdTb29uOmZ1bmN0aW9uKCl7ZC53PQph
cm5pbmcoIkZlYXR1cmUgY29taW5nIHNvb24uIil9LGNvcHlUb0NsaXBib2FyZDpmdW5jdGlvbigp
e3ZhciBlPTNEQmFja2JvbmU9Ci5oaXN0b3J5LmxvY2F0aW9uLmhyZWY7aWYoZS5sYXN0SW5kZXhP
ZigiL3Blcm1pc3Npb25zIikhPTNEPTNELTEpe2U9M0RlLnN1Yj0Kc3RyKDAsZS5sYXN0SW5kZXhP
ZigiL3Blcm1pc3Npb25zIikpfXdpbmRvdy5wcm9tcHQoIkNvcHkgdG8gY2xpcGJvYXJkOiBDdHJs
PQorQywgRW50ZXIiLGUpfSxfZXh0cmFjdElkczpmdW5jdGlvbihlKXtpZHNfbGlzdD0zRFtdO2Zv
cih2YXIgZj0zRGUubGVuZ3RoLTE9CjtmPj0zRDA7Zi0tKXtpZHNfbGlzdC5wdXNoKGVbZl0uaWQp
fXJldHVybiBpZHNfbGlzdH0sc2F2ZVBlcm1pc3Npb25zOmZ1bmN0aT0Kb24oaCl7dmFyIGc9M0R0
aGlzO3ZhciBlPTNEdGhpcy5fZXh0cmFjdElkcyh0aGlzLmFkZFNlbGVjdE9iamVjdC4kZWwuc2Vs
ZWN0PQoyKCJkYXRhIikpO3ZhciBpPTNEdGhpcy5fZXh0cmFjdElkcyh0aGlzLm1hbmFnZVNlbGVj
dE9iamVjdC4kZWwuc2VsZWN0MigiZGE9CnRhIikpO3ZhciBmPTNEdGhpcy5fZXh0cmFjdElkcyh0
aGlzLm1vZGlmeVNlbGVjdE9iamVjdC4kZWwuc2VsZWN0MigiZGF0YSIpKT0KOyQucG9zdCgod2lu
ZG93LmdhbGF4eV9jb25maWc/Z2FsYXh5X2NvbmZpZy5yb290OiIvIikrImFwaS9mb2xkZXJzLyIr
Zy5pZCsiPQovcGVybWlzc2lvbnM/YWN0aW9uPTNEc2V0X3Blcm1pc3Npb25zIix7ImFkZF9pZHNb
XSI6ZSwibWFuYWdlX2lkc1tdIjppLCJtb2Q9CmlmeV9pZHNbXSI6Zix9KS5kb25lKGZ1bmN0aW9u
KGope2cuc2hvd1Blcm1pc3Npb25zKHtmZXRjaGVkX3Blcm1pc3Npb25zOmp9KT0KO2Quc3VjY2Vz
cygiUGVybWlzc2lvbnMgc2F2ZWQuIil9KS5mYWlsKGZ1bmN0aW9uKCl7ZC5lcnJvcigiQW4gZXJy
b3Igb2NjdXJyPQplZCB3aGlsZSBhdHRlbXB0aW5nIHRvIHNldCBmb2xkZXIgcGVybWlzc2lvbnMu
Iil9KX0sdGVtcGxhdGVGb2xkZXI6ZnVuY3Rpb249Cigpe3ZhciBlPTNEW107ZS5wdXNoKCc8ZGl2
IGNsYXNzPTNEImxpYnJhcnlfc3R5bGVfY29udGFpbmVyIj4nKTtlLnB1c2goJyAgPD0KZGl2IGlk
PTNEImxpYnJhcnlfdG9vbGJhciI+Jyk7ZS5wdXNoKCcgICA8YnV0dG9uIGRhdGEtdG9nZ2xlPTNE
InRvb2x0aXAiIGRhPQp0YS1wbGFjZW1lbnQ9M0QidG9wIiB0aXRsZT0zRCJNb2RpZnkgbGlicmFy
eSBpdGVtIiBjbGFzcz0zRCJidG4gYnRuLWRlZmF1bHQ9CiB0b29sYnRuX21vZGlmeV9kYXRhc2V0
IHByaW1hcnktYnV0dG9uIiB0eXBlPTNEImJ1dHRvbiI+PHNwYW4gY2xhc3M9M0QiZmEgZj0KYS1w
ZW5jaWwiPjwvc3Bhbj4gTW9kaWZ5PC9zcGFuPjwvYnV0dG9uPicpO2UucHVzaCgnICAgPGEgaHJl
Zj0zRCIjZm9sZGVycy88PQolLSBpdGVtLmdldCgiZm9sZGVyX2lkIikgJT4vZGF0YXNldHMvPCUt
IGl0ZW0uaWQgJT4vcGVybWlzc2lvbnMiPjxidXR0b24gZGE9CnRhLXRvZ2dsZT0zRCJ0b29sdGlw
IiBkYXRhLXBsYWNlbWVudD0zRCJ0b3AiIHRpdGxlPTNEIk1hbmFnZSBwZXJtaXNzaW9ucyIgYz0K
bGFzcz0zRCJidG4gYnRuLWRlZmF1bHQgdG9vbGJ0bl9jaGFuZ2VfcGVybWlzc2lvbnMgcHJpbWFy
eS1idXR0b24iIHR5cGU9M0QiPQpidXR0b24iPjxzcGFuIGNsYXNzPTNEImZhIGZhLWdyb3VwIj48
L3NwYW4+IFBlcm1pc3Npb25zPC9zcGFuPjwvYnV0dG9uPjwvYT49CicpO2UucHVzaCgnICAgPGJ1
dHRvbiBkYXRhLXRvZ2dsZT0zRCJ0b29sdGlwIiBkYXRhLXBsYWNlbWVudD0zRCJ0b3AiIHRpdGxl
PQo9M0QiU2hhcmUgZGF0YXNldCIgY2xhc3M9M0QiYnRuIGJ0bi1kZWZhdWx0IHRvb2xidG4tc2hh
cmUtZGF0YXNldCBwcmltYXJ5LWI9CnV0dG9uIiB0eXBlPTNEImJ1dHRvbiI+PHNwYW4gY2xhc3M9
M0QiZmEgZmEtc2hhcmUiPjwvc3Bhbj4gU2hhcmU8L3NwYW4+PC9idT0KdHRvbj4nKTtlLnB1c2go
IiAgPC9kaXY+Iik7ZS5wdXNoKCIgIDxwPiIpO2UucHVzaCgiICBUaGlzIGRhdGFzZXQgaXMgdW5y
ZXN0PQpyaWN0ZWQgc28gZXZlcnlib2R5IGNhbiBhY2Nlc3MgaXQuIEp1c3Qgc2hhcmUgdGhlIFVS
TCBvZiB0aGlzIHBhZ2UuICIpO2UucHU9CnNoKCcgIDxidXR0b24gZGF0YS10b2dnbGU9M0QidG9v
bHRpcCIgZGF0YS1wbGFjZW1lbnQ9M0QidG9wIiB0aXRsZT0zRCJDb3B5ID0KdG8gY2xpcGJvYXJk
IiBjbGFzcz0zRCJidG4gYnRuLWRlZmF1bHQgYnRuLWNvcHktbGluay10by1jbGlwYm9hcmQgcHJp
bWFyeS1iPQp1dHRvbiIgdHlwZT0zRCJidXR0b24iPjxzcGFuIGNsYXNzPTNEImZhIGZhLWNsaXBi
b2FyZCI+PC9zcGFuPiBUbyBDbGlwYm9hcmQ9Cjwvc3Bhbj48L2J1dHRvbj4gJyk7ZS5wdXNoKCIg
IDwvcD4iKTtlLnB1c2goJzxkaXYgY2xhc3M9M0QiZGF0YXNldF90YWJsZSI+Jz0KKTtlLnB1c2go
JyAgIDx0YWJsZSBjbGFzcz0zRCJncmlkIHRhYmxlIHRhYmxlLXN0cmlwZWQgdGFibGUtY29uZGVu
c2VkIj4nKTtlPQoucHVzaCgiICAgICAgIDx0cj4iKTtlLnB1c2goJyAgICAgICAgICAgPHRoIHNj
b3BlPTNEInJvdyIgaWQ9M0QiaWRfcm93IiBkYXQ9CmEtaWQ9M0QiPCU9M0QgXy5lc2NhcGUoaXRl
bS5nZXQoImxkZGFfaWQiKSkgJT4iPk5hbWU8L3RoPicpO2UucHVzaCgnICAgICAgID0KICAgIDx0
ZD48JT0zRCBfLmVzY2FwZShpdGVtLmdldCgibmFtZSIpKSAlPjwvdGQ+Jyk7ZS5wdXNoKCIgICAg
ICAgPC90cj4iKTtlPQoucHVzaCgnICAgPCUgaWYgKGl0ZW0uZ2V0KCJmaWxlX2V4dCIpKSB7ICU+
Jyk7ZS5wdXNoKCIgICAgICAgPHRyPiIpO2UucHVzaCg9CicgICAgICAgICAgIDx0aCBzY29wZT0z
RCJyb3ciPkRhdGEgdHlwZTwvdGg+Jyk7ZS5wdXNoKCcgICAgICAgICAgIDx0ZD48JT0zRD0KIF8u
ZXNjYXBlKGl0ZW0uZ2V0KCJmaWxlX2V4dCIpKSAlPjwvdGQ+Jyk7ZS5wdXNoKCIgICAgICAgPC90
cj4iKTtlLnB1c2goIiAgPQogPCUgfSAlPiIpO2UucHVzaCgiICAgIDwvdGFibGU+Iik7ZS5wdXNo
KCI8L2Rpdj4iKTtlLnB1c2goIjwvZGl2PiIpO3JldHVybiA9Cl8udGVtcGxhdGUoZS5qb2luKCIi
KSl9LHRlbXBsYXRlRm9sZGVyUGVybWlzc2lvbnM6ZnVuY3Rpb24oKXt2YXIgZT0zRFtdO2UucD0K
dXNoKCc8ZGl2IGNsYXNzPTNEImxpYnJhcnlfc3R5bGVfY29udGFpbmVyIj4nKTtlLnB1c2goJyAg
PGRpdiBpZD0zRCJsaWJyYXJ5PQpfdG9vbGJhciI+Jyk7ZS5wdXNoKCcgICA8YSBocmVmPTNEIiMv
Zm9sZGVycy88JT0zRCBmb2xkZXIuZ2V0KCJwYXJlbnRfaWQiKSA9CiU+Ij48YnV0dG9uIGRhdGEt
dG9nZ2xlPTNEInRvb2x0aXAiIGRhdGEtcGxhY2VtZW50PTNEInRvcCIgdGl0bGU9M0QiR28gYmFj
az0KIHRvIHRoZSBwYXJlbnQgZm9sZGVyIiBjbGFzcz0zRCJidG4gYnRuLWRlZmF1bHQgcHJpbWFy
eS1idXR0b24iIHR5cGU9M0QiYnV0PQp0b24iPjxzcGFuIGNsYXNzPTNEImZhIGZhLWNhcmV0LWxl
ZnQgZmEtbGciPjwvc3Bhbj4gUGFyZW50IGZvbGRlcjwvc3Bhbj48L2I9CnV0dG9uPjwvYT4nKTtl
LnB1c2goIiAgPC9kaXY+Iik7ZS5wdXNoKCc8aDE+Rm9sZGVyOiA8JT0zRCBfLmVzY2FwZShmb2xk
ZXIuZz0KZXQoIm5hbWUiKSkgJT48L2gxPicpO2UucHVzaCgnPGRpdiBjbGFzcz0zRCJhbGVydCBh
bGVydC13YXJuaW5nIj4nKTtlLnB1c2goPQoiPCUgaWYgKGlzX2FkbWluKSB7ICU+Iik7ZS5wdXNo
KCJZb3UgYXJlIGxvZ2dlZCBpbiBhcyBhbiA8c3Ryb25nPmFkbWluaXN0cmE9CnRvcjwvc3Ryb25n
PiB0aGVyZWZvcmUgeW91IGNhbiBtYW5hZ2UgYW55IGZvbGRlciBvbiB0aGlzIEdhbGF4eSBpbnN0
YW5jZS4gUD0KbGVhc2UgbWFrZSBzdXJlIHlvdSB1bmRlcnN0YW5kIHRoZSBjb25zZXF1ZW5jZXMu
Iik7ZS5wdXNoKCI8JSB9IGVsc2UgeyAlPiIpPQo7ZS5wdXNoKCJZb3UgY2FuIGFzc2lnbiBhbnkg
bnVtYmVyIG9mIHJvbGVzIHRvIGFueSBvZiB0aGUgZm9sbG93aW5nIHBlcm1pc3M9CmlvbiB0eXBl
cy4gSG93ZXZlciBwbGVhc2UgcmVhZCBjYXJlZnVsbHkgdGhlIGltcGxpY2F0aW9ucyBvZiBzdWNo
IGFjdGlvbnMuIj0KKTtlLnB1c2goIjwlIH0lPiIpO2UucHVzaCgiPC9kaXY+Iik7ZS5wdXNoKCc8
ZGl2IGNsYXNzPTNEImRhdGFzZXRfdGFibGUiPicpPQo7ZS5wdXNoKCI8aDI+Rm9sZGVyIHBlcm1p
c3Npb25zPC9oMj4iKTtlLnB1c2goIjxoND5Sb2xlcyB0aGF0IGNhbiBtYW5hZ2UgcGU9CnJtaXNz
aW9ucyBvbiB0aGlzIGZvbGRlcjwvaDQ+Iik7ZS5wdXNoKCc8ZGl2IGlkPTNEIm1hbmFnZV9wZXJt
IiBjbGFzcz0zRCJtYT0KbmFnZV9wZXJtIHJvbGVzLXNlbGVjdGlvbiI+PC9kaXY+Jyk7ZS5wdXNo
KCc8ZGl2IGNsYXNzPTNEImFsZXJ0IGFsZXJ0LWluZm8gPQpyb2xlcy1zZWxlY3Rpb24iPlVzZXIg
d2l0aCA8c3Ryb25nPmFueTwvc3Ryb25nPiBvZiB0aGVzZSByb2xlcyBjYW4gbWFuYWdlIHA9CmVy
bWlzc2lvbnMgb24gdGhpcyBmb2xkZXIuPC9kaXY+Jyk7ZS5wdXNoKCI8aDQ+Um9sZXMgdGhhdCBj
YW4gYWRkIGl0ZW1zIHRvID0KdGhpcyBmb2xkZXI8L2g0PiIpO2UucHVzaCgnPGRpdiBpZD0zRCJh
ZGRfcGVybSIgY2xhc3M9M0QiYWRkX3Blcm0gcm9sZXMtc2VsPQplY3Rpb24iPjwvZGl2PicpO2Uu
cHVzaCgnPGRpdiBjbGFzcz0zRCJhbGVydCBhbGVydC1pbmZvIHJvbGVzLXNlbGVjdGlvbiI+VXM9
CmVyIHdpdGggPHN0cm9uZz5hbnk8L3N0cm9uZz4gb2YgdGhlc2Ugcm9sZXMgY2FuIGFkZCBpdGVt
cyB0byB0aGlzIGZvbGRlciAoZj0Kb2xkZXJzIGFuZCBkYXRhc2V0cykuPC9kaXY+Jyk7ZS5wdXNo
KCI8aDQ+Um9sZXMgdGhhdCBjYW4gbW9kaWZ5IHRoaXMgZm9sZGVyPQo8L2g0PiIpO2UucHVzaCgn
PGRpdiBpZD0zRCJtb2RpZnlfcGVybSIgY2xhc3M9M0QibW9kaWZ5X3Blcm0gcm9sZXMtc2VsZWN0
aW89Cm4iPjwvZGl2PicpO2UucHVzaCgnPGRpdiBjbGFzcz0zRCJhbGVydCBhbGVydC1pbmZvIHJv
bGVzLXNlbGVjdGlvbiI+VXNlciB3aT0KdGggPHN0cm9uZz5hbnk8L3N0cm9uZz4gb2YgdGhlc2Ug
cm9sZXMgY2FuIG1vZGlmeSB0aGlzIGZvbGRlciAobmFtZSwgZXRjLikuPQo8L2Rpdj4nKTtlLnB1
c2goJzxidXR0b24gZGF0YS10b2dnbGU9M0QidG9vbHRpcCIgZGF0YS1wbGFjZW1lbnQ9M0QidG9w
IiB0aXQ9CmxlPTNEIlNhdmUgbW9kaWZpY2F0aW9ucyIgY2xhc3M9M0QiYnRuIGJ0bi1kZWZhdWx0
IHRvb2xidG5fc2F2ZV9wZXJtaXNzaW9ucz0KIHByaW1hcnktYnV0dG9uIiB0eXBlPTNEImJ1dHRv
biI+PHNwYW4gY2xhc3M9M0QiZmEgZmEtZmxvcHB5LW8iPjwvc3Bhbj4gU2F2PQplPC9zcGFuPjwv
YnV0dG9uPicpO2UucHVzaCgiPC9kaXY+Iik7ZS5wdXNoKCI8L2Rpdj4iKTtyZXR1cm4gXy50ZW1w
bGF0ZShlLmo9Cm9pbigiIikpfX0pO3JldHVybntGb2xkZXJWaWV3OmJ9fSk7ClwgTm8gbmV3bGlu
ZSBhdCBlbmQgb2YgZmlsZQoKZGlmZiAtciA0OWQ1MGJjZTQ2MzIwNmY0NDUwNjNkMmIyN2IyZjJi
MzkzYWRiZTExIC1yIDFjY2Y0MGJkYWZhMTg0YjNiZTMxYWE3PQpiMWVjZGZjZTNiYzcwNWVmYiBz
dGF0aWMvc2NyaXB0cy9wYWNrZWQvbXZjL2xpYnJhcnkvbGlicmFyeS1mb2xkZXJ0b29sYmFyLXY9
Cmlldy5qcwotLS0gYS9zdGF0aWMvc2NyaXB0cy9wYWNrZWQvbXZjL2xpYnJhcnkvbGlicmFyeS1m
b2xkZXJ0b29sYmFyLXZpZXcuanMKKysrIGIvc3RhdGljL3NjcmlwdHMvcGFja2VkL212Yy9saWJy
YXJ5L2xpYnJhcnktZm9sZGVydG9vbGJhci12aWV3LmpzCkBAIC0xLDEgKzEsMSBAQAotZGVmaW5l
KFsiZ2FsYXh5Lm1hc3RoZWFkIiwidXRpbHMvdXRpbHMiLCJsaWJzL3RvYXN0ciIsIm12Yy9saWJy
YXJ5L2xpYnJhcnk9Ci1tb2RlbCIsIm12Yy91aS91aS1zZWxlY3QiXSxmdW5jdGlvbihjLGUsZixk
LGEpe3ZhciBiPTNEQmFja2JvbmUuVmlldy5leHRlbj0KZCh7ZWw6IiNjZW50ZXIiLGV2ZW50czp7
ImNsaWNrICN0b29sYnRuX2NyZWF0ZV9mb2xkZXIiOiJjcmVhdGVGb2xkZXJGcm9tTW9kPQphbCIs
ImNsaWNrICN0b29sYnRuX2J1bGtfaW1wb3J0IjoibW9kYWxCdWxrSW1wb3J0IiwiY2xpY2sgI2lu
Y2x1ZGVfZGVsZXRlZF89CmRhdGFzZXRzX2NoayI6ImNoZWNrSW5jbHVkZURlbGV0ZWQiLCJjbGlj
ayAjdG9vbGJ0bl9zaG93X2xpYmluZm8iOiJzaG93TGliST0KbmZvIiwiY2xpY2sgI3Rvb2xidG5f
YnVsa19kZWxldGUiOiJkZWxldGVTZWxlY3RlZERhdGFzZXRzIiwiY2xpY2sgI3BhZ2Vfc2l6PQpl
X3Byb21wdCI6InNob3dQYWdlU2l6ZVByb21wdCJ9LGRlZmF1bHRzOntjYW5fYWRkX2xpYnJhcnlf
aXRlbTpmYWxzZSxjb250YWk9Cm5zX2ZpbGU6ZmFsc2UsY2hhaW5fY2FsbF9jb250cm9sOnt0b3Rh
bF9udW1iZXI6MCxmYWlsZWRfbnVtYmVyOjB9LGRpc2FibGVkXz0KanN0cmVlX2VsZW1lbnQ6ImZv
bGRlcnMifSxtb2RhbDpudWxsLGpzdHJlZTpudWxsLGhpc3RvcmllczpudWxsLHNlbGVjdF9nZW5v
PQptZTpudWxsLHNlbGVjdF9leHRlbnNpb246bnVsbCxsaXN0X2V4dGVuc2lvbnM6W10sYXV0bzp7
aWQ6ImF1dG8iLHRleHQ6IkF1dG89Ci1kZXRlY3QiLGRlc2NyaXB0aW9uOiJUaGlzIHN5c3RlbSB3
aWxsIHRyeSB0byBkZXRlY3QgdGhlIGZpbGUgdHlwZSBhdXRvbWF0aT0KY2FsbHkuIElmIHlvdXIg
ZmlsZSBpcyBub3QgZGV0ZWN0ZWQgcHJvcGVybHkgYXMgb25lIG9mIHRoZSBrbm93biBmb3JtYXRz
LCBpPQp0IG1vc3QgbGlrZWx5IG1lYW5zIHRoYXQgaXQgaGFzIHNvbWUgZm9ybWF0IHByb2JsZW1z
IChlLmcuLCBkaWZmZXJlbnQgbnVtYmU9CnIgb2YgY29sdW1ucyBvbiBkaWZmZXJlbnQgcm93cyku
IFlvdSBjYW4gc3RpbGwgY29lcmNlIHRoZSBzeXN0ZW0gdG8gc2V0IHlvdT0KciBkYXRhIHRvIHRo
ZSBmb3JtYXQgeW91IHRoaW5rIGl0IHNob3VsZCBiZS4gWW91IGNhbiBhbHNvIHVwbG9hZCBjb21w
cmVzc2VkPQogZmlsZXMsIHdoaWNoIHdpbGwgYXV0b21hdGljYWxseSBiZSBkZWNvbXByZXNzZWQu
In0sbGlzdF9nZW5vbWVzOltdLGluaXRpYWw9Cml6ZTpmdW5jdGlvbihnKXt0aGlzLm9wdGlvbnM9
M0RfLmRlZmF1bHRzKGd8fHt9LHRoaXMuZGVmYXVsdHMpO3RoaXMuZmV0Y2hFeD0KdEFuZEdlbm9t
ZXMoKTt0aGlzLnJlbmRlcigpfSxyZW5kZXI6ZnVuY3Rpb24oZyl7dGhpcy5vcHRpb25zPTNEXy5l
eHRlbmQodGhpPQpzLm9wdGlvbnMsZyk7dmFyIGk9M0R0aGlzLnRlbXBsYXRlVG9vbEJhcigpO3Zh
ciBoPTNEe2lkOnRoaXMub3B0aW9ucy5pZCxpc189CmFkbWluOmZhbHNlLGlzX2Fub255bTp0cnVl
LG11dGlwbGVfYWRkX2RhdGFzZXRfb3B0aW9uczpmYWxzZX07aWYoR2FsYXh5LmN1cj0KclVzZXIp
e2guaXNfYWRtaW49M0RHYWxheHkuY3VyclVzZXIuaXNBZG1pbigpO2guaXNfYW5vbnltPTNER2Fs
YXh5LmN1cnJVc2VyPQouaXNBbm9ueW1vdXMoKTtpZihHYWxheHkuY29uZmlnLnVzZXJfbGlicmFy
eV9pbXBvcnRfZGlyIT0zRD0zRG51bGx8fEdhbGF4eS49CmNvbmZpZy5hbGxvd19saWJyYXJ5X3Bh
dGhfcGFzdGUhPTNEPTNEZmFsc2V8fEdhbGF4eS5jb25maWcubGlicmFyeV9pbXBvcnRfZD0KaXIh
PTNEPTNEbnVsbCl7aC5tdXRpcGxlX2FkZF9kYXRhc2V0X29wdGlvbnM9M0R0cnVlfX10aGlzLiRl
bC5odG1sKGkoaCkpfSxyPQplbmRlclBhZ2luYXRvcjpmdW5jdGlvbihoKXt0aGlzLm9wdGlvbnM9
M0RfLmV4dGVuZCh0aGlzLm9wdGlvbnMsaCk7dmFyIGc9M0Q9CnRoaXMudGVtcGxhdGVQYWdpbmF0
b3IoKTt0aGlzLiRlbC5maW5kKCIjZm9sZGVyX3BhZ2luYXRvciIpLmh0bWwoZyh7aWQ6dGhpcz0K
Lm9wdGlvbnMuaWQsc2hvd19wYWdlOnBhcnNlSW50KHRoaXMub3B0aW9ucy5zaG93X3BhZ2UpLHBh
Z2VfY291bnQ6cGFyc2VJbnQoPQp0aGlzLm9wdGlvbnMucGFnZV9jb3VudCksdG90YWxfaXRlbXNf
Y291bnQ6dGhpcy5vcHRpb25zLnRvdGFsX2l0ZW1zX2NvdW50LGk9CnRlbXNfc2hvd246dGhpcy5v
cHRpb25zLml0ZW1zX3Nob3dufSkpfSxjb25maWd1cmVFbGVtZW50czpmdW5jdGlvbihnKXt0aGlz
Lj0Kb3B0aW9ucz0zRF8uZXh0ZW5kKHRoaXMub3B0aW9ucyxnKTtpZih0aGlzLm9wdGlvbnMuY2Fu
X2FkZF9saWJyYXJ5X2l0ZW09M0Q9Cj0zRD0zRHRydWUpeyQoIi5hZGQtbGlicmFyeS1pdGVtcyIp
LnNob3coKX1lbHNleyQoIi5hZGQtbGlicmFyeS1pdGVtcyIpLmhpZD0KZSgpfWlmKHRoaXMub3B0
aW9ucy5jb250YWluc19maWxlPTNEPTNEPTNEdHJ1ZSl7aWYoR2FsYXh5LmN1cnJVc2VyKXtpZigh
R2FsPQpheHkuY3VyclVzZXIuaXNBbm9ueW1vdXMoKSl7JCgiLmxvZ2dlZC1kYXRhc2V0LW1hbmlw
dWxhdGlvbiIpLnNob3coKTskKCIuZGE9CnRhc2V0LW1hbmlwdWxhdGlvbiIpLnNob3coKX1lbHNl
eyQoIi5kYXRhc2V0LW1hbmlwdWxhdGlvbiIpLnNob3coKTskKCIubG9nZz0KZWQtZGF0YXNldC1t
YW5pcHVsYXRpb24iKS5oaWRlKCl9fWVsc2V7JCgiLmxvZ2dlZC1kYXRhc2V0LW1hbmlwdWxhdGlv
biIpLmhpPQpkZSgpOyQoIi5kYXRhc2V0LW1hbmlwdWxhdGlvbiIpLmhpZGUoKX19ZWxzZXskKCIu
bG9nZ2VkLWRhdGFzZXQtbWFuaXB1bGF0aW89Cm4iKS5oaWRlKCk7JCgiLmRhdGFzZXQtbWFuaXB1
bGF0aW9uIikuaGlkZSgpfXRoaXMuJGVsLmZpbmQoIltkYXRhLXRvZ2dsZV0iKT0KLnRvb2x0aXAo
KX0sY3JlYXRlRm9sZGVyRnJvbU1vZGFsOmZ1bmN0aW9uKGkpe2kucHJldmVudERlZmF1bHQoKTtp
LnN0b3BQcm9wPQphZ2F0aW9uKCk7dmFyIGc9M0R0aGlzO3ZhciBoPTNEdGhpcy50ZW1wbGF0ZU5l
d0ZvbGRlckluTW9kYWwoKTt0aGlzLm1vZGFsPQo9M0RHYWxheHkubW9kYWw7dGhpcy5tb2RhbC5z
aG93KHtjbG9zaW5nX2V2ZW50czp0cnVlLHRpdGxlOiJDcmVhdGUgTmV3IEZvbGQ9CmVyIixib2R5
OmgoKSxidXR0b25zOntDcmVhdGU6ZnVuY3Rpb24oKXtnLmNyZWF0ZV9uZXdfZm9sZGVyX2V2ZW50
KCl9LENsb3NlOj0KZnVuY3Rpb24oKXtHYWxheHkubW9kYWwuaGlkZSgpfX19KX0sY3JlYXRlX25l
d19mb2xkZXJfZXZlbnQ6ZnVuY3Rpb24oKXt2YXIgPQpnPTNEdGhpcy5zZXJpYWxpemVfbmV3X2Zv
bGRlcigpO2lmKHRoaXMudmFsaWRhdGVfbmV3X2ZvbGRlcihnKSl7dmFyIGg9M0RuZXc9CiBkLkZv
bGRlckFzTW9kZWwoKTt1cmxfaXRlbXM9M0RCYWNrYm9uZS5oaXN0b3J5LmZyYWdtZW50LnNwbGl0
KCIvIik7Y3VycmVudD0KX2ZvbGRlcl9pZD0zRHVybF9pdGVtc1t1cmxfaXRlbXMubGVuZ3RoLTFd
O2gudXJsPTNEaC51cmxSb290KyIvIitjdXJyZW50X2ZvPQpsZGVyX2lkO2guc2F2ZShnLHtzdWNj
ZXNzOmZ1bmN0aW9uKGkpe0dhbGF4eS5tb2RhbC5oaWRlKCk7Zi5zdWNjZXNzKCJGb2xkZXI9CiBj
cmVhdGVkLiIpO2kuc2V0KHt0eXBlOiJmb2xkZXIifSk7R2FsYXh5LmxpYnJhcmllcy5mb2xkZXJM
aXN0Vmlldy5jb2xsZWN0aT0Kb24uYWRkKGkpfSxlcnJvcjpmdW5jdGlvbihqLGkpe0dhbGF4eS5t
b2RhbC5oaWRlKCk7aWYodHlwZW9mIGkucmVzcG9uc2VKU09OPQohPTNEPTNEInVuZGVmaW5lZCIp
e2YuZXJyb3IoaS5yZXNwb25zZUpTT04uZXJyX21zZyl9ZWxzZXtmLmVycm9yKCJBbiBlcnJvciA9
Cm9jdXJyZWQuIil9fX0pfWVsc2V7Zi5lcnJvcigiRm9sZGVyJ3MgbmFtZSBpcyBtaXNzaW5nLiIp
fXJldHVybiBmYWxzZX0sc2VyaT0KYWxpemVfbmV3X2ZvbGRlcjpmdW5jdGlvbigpe3JldHVybntu
YW1lOiQoImlucHV0W25hbWU9M0QnTmFtZSddIikudmFsKCksZGVzPQpjcmlwdGlvbjokKCJpbnB1
dFtuYW1lPTNEJ0Rlc2NyaXB0aW9uJ10iKS52YWwoKX19LHZhbGlkYXRlX25ld19mb2xkZXI6ZnVu
Y3Q9CmlvbihnKXtyZXR1cm4gZy5uYW1lIT0zRD0zRCIifSxtb2RhbEJ1bGtJbXBvcnQ6ZnVuY3Rp
b24oKXt2YXIgZz0zRCQoIiNmb2xkZT0Kcl90YWJsZSIpLmZpbmQoIjpjaGVja2VkIik7aWYoZy5s
ZW5ndGg9M0Q9M0Q9M0QwKXtmLmluZm8oIllvdSBtdXN0IHNlbGVjdCBzPQpvbWUgZGF0YXNldHMg
Zmlyc3QuIil9ZWxzZXt0aGlzLnJlZnJlc2hVc2VySGlzdG9yaWVzTGlzdChmdW5jdGlvbihpKXt2
YXIgaD0KPTNEaS50ZW1wbGF0ZUJ1bGtJbXBvcnRJbk1vZGFsKCk7aS5tb2RhbD0zREdhbGF4eS5t
b2RhbDtpLm1vZGFsLnNob3coe2Nsb3NpPQpuZ19ldmVudHM6dHJ1ZSx0aXRsZToiSW1wb3J0IGlu
dG8gSGlzdG9yeSIsYm9keTpoKHtoaXN0b3JpZXM6aS5oaXN0b3JpZXMubW89CmRlbHN9KSxidXR0
b25zOntJbXBvcnQ6ZnVuY3Rpb24oKXtpLmltcG9ydEFsbEludG9IaXN0b3J5KCl9LENsb3NlOmZ1
bmN0aW9uKD0KKXtHYWxheHkubW9kYWwuaGlkZSgpfX19KX0pfX0scmVmcmVzaFVzZXJIaXN0b3Jp
ZXNMaXN0OmZ1bmN0aW9uKGgpe3ZhciBnPTNEPQp0aGlzO3RoaXMuaGlzdG9yaWVzPTNEbmV3IGQu
R2FsYXh5SGlzdG9yaWVzKCk7dGhpcy5oaXN0b3JpZXMuZmV0Y2goe3N1Y2Nlc3M9CjpmdW5jdGlv
bigpe2goZyl9LGVycm9yOmZ1bmN0aW9uKGosaSl7aWYodHlwZW9mIGkucmVzcG9uc2VKU09OIT0z
RD0zRCJ1bmRlZj0KaW5lZCIpe2YuZXJyb3IoaS5yZXNwb25zZUpTT04uZXJyX21zZyl9ZWxzZXtm
LmVycm9yKCJBbiBlcnJvciBvY3VycmVkLiIpfX19PQopfSxpbXBvcnRBbGxJbnRvSGlzdG9yeTpm
dW5jdGlvbigpe3RoaXMubW9kYWwuZGlzYWJsZUJ1dHRvbigiSW1wb3J0Iik7dmFyIGs9Cj0zRCQo
InNlbGVjdFtuYW1lPTNEZGF0YXNldF9pbXBvcnRfYnVsa10gb3B0aW9uOnNlbGVjdGVkIikudmFs
KCk7dmFyIG49M0QkKD0KInNlbGVjdFtuYW1lPTNEZGF0YXNldF9pbXBvcnRfYnVsa10gb3B0aW9u
OnNlbGVjdGVkIikudGV4dCgpO3RoaXMub3B0aW9ucy5sPQphc3RfdXNlZF9oaXN0b3J5X2lkPTNE
azt2YXIgaD0zRFtdOyQoIiNmb2xkZXJfdGFibGUiKS5maW5kKCI6Y2hlY2tlZCIpLmVhY2g9Cihm
dW5jdGlvbigpe2lmKHRoaXMucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmlkIT0zRD0zRCIi
KXtoLnB1c2godGhpcy5wYT0KcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5pZCl9fSk7dmFyIG09
M0RbXTtmb3IodmFyIGo9M0RoLmxlbmd0aC0xO2o+PTNEMDtqPQotLSl7dmFyIGc9M0RoW2pdO3Zh
ciBsPTNEbmV3IGQuSGlzdG9yeUl0ZW0oKTtsLnVybD0zRGwudXJsUm9vdCtrKyIvY29udGVudHM9
CiI7bC5jb250ZW50PTNEZztsLnNvdXJjZT0zRCJsaWJyYXJ5IjttLnB1c2gobCl9dGhpcy5pbml0
Q2hhaW5DYWxsQ29udHJvbCh7bD0KZW5ndGg6bS5sZW5ndGgsYWN0aW9uOiJ0b19oaXN0b3J5Iixo
aXN0b3J5X25hbWU6bn0pO2pRdWVyeS5nZXRKU09OKGdhbGF4eV9jPQpvbmZpZy5yb290KyJoaXN0
b3J5L3NldF9hc19jdXJyZW50P2lkPTNEIitrKTt0aGlzLmNoYWluQ2FsbEltcG9ydGluZ0ludG9I
aXM9CnRvcnkobSxuKX0sdXBkYXRlUHJvZ3Jlc3M6ZnVuY3Rpb24oKXt0aGlzLnByb2dyZXNzKz0z
RHRoaXMucHJvZ3Jlc3NTdGVwOyQoIj0KLnByb2dyZXNzLWJhci1pbXBvcnQiKS53aWR0aChNYXRo
LnJvdW5kKHRoaXMucHJvZ3Jlc3MpKyIlIik7dHh0X3JlcHJlc2VudGF0PQppb249M0RNYXRoLnJv
dW5kKHRoaXMucHJvZ3Jlc3MpKyIlIENvbXBsZXRlIjskKCIuY29tcGxldGlvbl9zcGFuIikudGV4
dCh0eHQ9Cl9yZXByZXNlbnRhdGlvbil9LGRvd25sb2FkOmZ1bmN0aW9uKGcsayl7dmFyIGk9M0Rb
XTskKCIjZm9sZGVyX3RhYmxlIikuZmluZD0KKCI6Y2hlY2tlZCIpLmVhY2goZnVuY3Rpb24oKXtp
Zih0aGlzLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5pZCE9M0Q9M0QiPQoiKXtpLnB1c2go
dGhpcy5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQuaWQpfX0pO3ZhciBoPTNEIi9hcGkvbGli
cmFyaWVzL2Q9CmF0YXNldHMvZG93bmxvYWQvIitrO3ZhciBqPTNEe2xkX2lkczppfTt0aGlzLnBy
b2Nlc3NEb3dubG9hZChoLGosImdldCIpfSxwcj0Kb2Nlc3NEb3dubG9hZDpmdW5jdGlvbihoLGks
ail7aWYoaCYmaSl7aT0zRHR5cGVvZiBpPTNEPTNEPTNEInN0cmluZyI/aTokLnBhPQpyYW0oaSk7
dmFyIGc9M0QiIjskLmVhY2goaS5zcGxpdCgiJiIpLGZ1bmN0aW9uKCl7dmFyIGs9M0R0aGlzLnNw
bGl0KCI9M0QiKTs9CmcrPTNEJzxpbnB1dCB0eXBlPTNEImhpZGRlbiIgbmFtZT0zRCInK2tbMF0r
JyIgdmFsdWU9M0QiJytrWzFdKyciIC8+J30pOyQoJz0KPGZvcm0gYWN0aW9uPTNEIicraCsnIiBt
ZXRob2Q9M0QiJysoanx8InBvc3QiKSsnIj4nK2crIjwvZm9ybT4iKS5hcHBlbmRUbygiPQpib2R5
Iikuc3VibWl0KCkucmVtb3ZlKCk7Zi5pbmZvKCJZb3VyIGRvd25sb2FkIHdpbGwgYmVnaW4gc29v
bi4iKX1lbHNle2YuZXI9CnJvcigiQW4gZXJyb3Igb2NjdXJyZWQuIil9fSxhZGRGaWxlc0Zyb21I
aXN0b3J5TW9kYWw6ZnVuY3Rpb24oKXt0aGlzLnJlZnJlcz0KaFVzZXJIaXN0b3JpZXNMaXN0KGZ1
bmN0aW9uKGcpe2cubW9kYWw9M0RHYWxheHkubW9kYWw7dmFyIGg9M0RnLnRlbXBsYXRlQWRkPQpG
aWxlc0Zyb21IaXN0b3J5KCk7dmFyIGk9M0RnLm9wdGlvbnMuZnVsbF9wYXRoW2cub3B0aW9ucy5m
dWxsX3BhdGgubGVuZ3RoLTE9Cl1bMV07Zy5tb2RhbC5zaG93KHtjbG9zaW5nX2V2ZW50czp0cnVl
LHRpdGxlOiJBZGRpbmcgZGF0YXNldHMgZnJvbSB5b3VyIGhpcz0KdG9yeSB0byBmb2xkZXIgIitp
LGJvZHk6aCh7aGlzdG9yaWVzOmcuaGlzdG9yaWVzLm1vZGVsc30pLGJ1dHRvbnM6e0FkZDpmdW5j
PQp0aW9uKCl7Zy5hZGRBbGxEYXRhc2V0c0Zyb21IaXN0b3J5KCl9LENsb3NlOmZ1bmN0aW9uKCl7
R2FsYXh5Lm1vZGFsLmhpZGUoKX09Cn0sY2xvc2luZ19jYWxsYmFjazpmdW5jdGlvbigpe0dhbGF4
eS5saWJyYXJpZXMubGlicmFyeV9yb3V0ZXIuYmFjaygpfX0pO2lmKD0KZy5oaXN0b3JpZXMubW9k
ZWxzLmxlbmd0aD4wKXtnLmZldGNoQW5kRGlzcGxheUhpc3RvcnlDb250ZW50cyhnLmhpc3Rvcmll
cy5tPQpvZGVsc1swXS5pZCk7JCgiI2RhdGFzZXRfYWRkX2J1bGsiKS5jaGFuZ2UoZnVuY3Rpb24o
ail7Zy5mZXRjaEFuZERpc3BsYXlIaXM9CnRvcnlDb250ZW50cyhqLnRhcmdldC52YWx1ZSl9KX1l
bHNle2YuZXJyb3IoIkFuIGVycm9yIG9jdXJyZWQuIil9fSl9LGltcG9ydD0KRmlsZXNGcm9tUGF0
aE1vZGFsOmZ1bmN0aW9uKCl7dmFyIGg9M0R0aGlzO3RoaXMubW9kYWw9M0RHYWxheHkubW9kYWw7
dmFyIGc9Cj0zRHRoaXMudGVtcGxhdGVJbXBvcnRQYXRoTW9kYWwoKTt0aGlzLm1vZGFsLnNob3co
e2Nsb3NpbmdfZXZlbnRzOnRydWUsdGl0bD0KZToiUGxlYXNlIGVudGVyIHBhdGhzIHRvIGltcG9y
dCIsYm9keTpnKHt9KSxidXR0b25zOntJbXBvcnQ6ZnVuY3Rpb24oKXtoLmltPQpwb3J0RnJvbVBh
dGhzQ2xpY2tlZChoKX0sQ2xvc2U6ZnVuY3Rpb24oKXtHYWxheHkubW9kYWwuaGlkZSgpfX0sY2xv
c2luZ19jYWw9CmxiYWNrOmZ1bmN0aW9uKCl7R2FsYXh5LmxpYnJhcmllcy5saWJyYXJ5X3JvdXRl
ci5uYXZpZ2F0ZSgiZm9sZGVycy8iK2guaWQsez0KdHJpZ2dlcjp0cnVlfSl9fSk7dGhpcy5yZW5k
ZXJTZWxlY3RCb3hlcygpfSxmZXRjaEV4dEFuZEdlbm9tZXM6ZnVuY3Rpb24oKXt2PQphciBnPTNE
dGhpcztlLmdldCh7dXJsOmdhbGF4eV9jb25maWcucm9vdCsiYXBpL2RhdGF0eXBlcz9leHRlbnNp
b25fb25seT0zREY9CmFsc2UiLHN1Y2Nlc3M6ZnVuY3Rpb24oaCl7Zm9yKGtleSBpbiBoKXtnLmxp
c3RfZXh0ZW5zaW9ucy5wdXNoKHtpZDpoW2tleV0uZT0KeHRlbnNpb24sdGV4dDpoW2tleV0uZXh0
ZW5zaW9uLGRlc2NyaXB0aW9uOmhba2V5XS5kZXNjcmlwdGlvbixkZXNjcmlwdGlvbl91PQpybDpo
W2tleV0uZGVzY3JpcHRpb25fdXJsfSl9Zy5saXN0X2V4dGVuc2lvbnMuc29ydChmdW5jdGlvbihq
LGkpe3JldHVybiBqLmk9CmQ+aS5pZD8xOmouaWQ8aS5pZD8tMTowfSk7Zy5saXN0X2V4dGVuc2lv
bnMudW5zaGlmdChnLmF1dG8pfX0pO2UuZ2V0KHt1cmw6Zz0KYWxheHlfY29uZmlnLnJvb3QrImFw
aS9nZW5vbWVzIixzdWNjZXNzOmZ1bmN0aW9uKGgpe2ZvcihrZXkgaW4gaCl7Zy5saXN0X2dlPQpu
b21lcy5wdXNoKHtpZDpoW2tleV1bMV0sdGV4dDpoW2tleV1bMF19KX1nLmxpc3RfZ2Vub21lcy5z
b3J0KGZ1bmN0aW9uKGosaSk9CntyZXR1cm4gai5pZD5pLmlkPzE6ai5pZDxpLmlkPy0xOjB9KX19
KX0scmVuZGVyU2VsZWN0Qm94ZXM6ZnVuY3Rpb24oKXt2YXIgZz0KPTNEdGhpczt0aGlzLnNlbGVj
dF9nZW5vbWU9M0RuZXcgYS5WaWV3KHtjc3M6ImxpYnJhcnktZ2Vub21lLXNlbGVjdCIsZGF0YTpn
PQoubGlzdF9nZW5vbWVzLGNvbnRhaW5lcjpHYWxheHkubW9kYWwuJGVsLmZpbmQoIiNsaWJyYXJ5
X2dlbm9tZV9zZWxlY3QiKSx2YWw9CnVlOiI/In0pO3RoaXMuc2VsZWN0X2V4dGVuc2lvbj0zRG5l
dyBhLlZpZXcoe2NzczoibGlicmFyeS1leHRlbnNpb24tc2VsZWN0Ij0KLGRhdGE6Zy5saXN0X2V4
dGVuc2lvbnMsY29udGFpbmVyOkdhbGF4eS5tb2RhbC4kZWwuZmluZCgiI2xpYnJhcnlfZXh0ZW5z
aW9uPQpfc2VsZWN0IiksdmFsdWU6ImF1dG8ifSl9LGltcG9ydEZpbGVzRnJvbUdhbGF4eUZvbGRl
ck1vZGFsOmZ1bmN0aW9uKGcpe3ZhciA9Cmk9M0R0aGlzO3ZhciBoPTNEdGhpcy50ZW1wbGF0ZUJy
b3dzZXJNb2RhbCgpO3RoaXMubW9kYWw9M0RHYWxheHkubW9kYWw7dGhpcz0KLm1vZGFsLnNob3co
e2Nsb3NpbmdfZXZlbnRzOnRydWUsdGl0bGU6IlBsZWFzZSBzZWxlY3QgZm9sZGVycyBvciBmaWxl
cyIsYm9kPQp5Omgoe30pLGJ1dHRvbnM6e0ltcG9ydDpmdW5jdGlvbigpe2kuaW1wb3J0RnJvbUpz
dHJlZVBhdGgoaSxnKX0sQ2xvc2U6ZnVuY3Q9Cmlvbigpe0dhbGF4eS5tb2RhbC5oaWRlKCl9fSxj
bG9zaW5nX2NhbGxiYWNrOmZ1bmN0aW9uKCl7R2FsYXh5LmxpYnJhcmllcy5saT0KYnJhcnlfcm91
dGVyLm5hdmlnYXRlKCJmb2xkZXJzLyIraS5pZCx7dHJpZ2dlcjp0cnVlfSl9fSk7dGhpcy5yZW5k
ZXJTZWxlY3RCPQpveGVzKCk7Zy5kaXNhYmxlZF9qc3RyZWVfZWxlbWVudD0zRCJmb2xkZXJzIjt0
aGlzLnJlbmRlckpzdHJlZShnKTskKCJpbnB1dFs9CnR5cGU9M0RyYWRpb10iKS5jaGFuZ2UoZnVu
Y3Rpb24oail7aWYoai50YXJnZXQudmFsdWU9M0Q9M0Q9M0QianN0cmVlLWRpc2FibD0KZS1mb2xk
ZXJzIil7Zy5kaXNhYmxlZF9qc3RyZWVfZWxlbWVudD0zRCJmb2xkZXJzIjtpLnJlbmRlckpzdHJl
ZShnKTskKCIuanN0PQpyZWUtZm9sZGVycy1tZXNzYWdlIikuaGlkZSgpOyQoIi5qc3RyZWUtcHJl
c2VydmUtc3RydWN0dXJlIikuaGlkZSgpOyQoIi5qc3Q9CnJlZS1saW5rLWZpbGVzIikuaGlkZSgp
OyQoIi5qc3RyZWUtZmlsZXMtbWVzc2FnZSIpLnNob3coKX1lbHNle2lmKGoudGFyZ2V0Lj0KdmFs
dWU9M0Q9M0Q9M0QianN0cmVlLWRpc2FibGUtZmlsZXMiKXskKCIuanN0cmVlLWZpbGVzLW1lc3Nh
Z2UiKS5oaWRlKCk7JCgiPQouanN0cmVlLWZvbGRlcnMtbWVzc2FnZSIpLnNob3coKTskKCIuanN0
cmVlLWxpbmstZmlsZXMiKS5zaG93KCk7JCgiLmpzdHJlZS09CnByZXNlcnZlLXN0cnVjdHVyZSIp
LnNob3coKTtnLmRpc2FibGVkX2pzdHJlZV9lbGVtZW50PTNEImZpbGVzIjtpLnJlbmRlckpzdD0K
cmVlKGcpfX19KX0scmVuZGVySnN0cmVlOmZ1bmN0aW9uKGcpe3ZhciBpPTNEdGhpczt0aGlzLm9w
dGlvbnM9M0RfLmV4dGVuZCh0PQpoaXMub3B0aW9ucyxnKTt2YXIgaj0zRGcuc291cmNlfHwidXNl
cmRpciI7dmFyIGg9M0R0aGlzLm9wdGlvbnMuZGlzYWJsZWRfanM9CnRyZWVfZWxlbWVudDt0aGlz
LmpzdHJlZT0zRG5ldyBkLkpzdHJlZSgpO3RoaXMuanN0cmVlLnVybD0zRHRoaXMuanN0cmVlLnVy
bD0KUm9vdCsiP3RhcmdldD0zRCIraisiJmZvcm1hdD0zRGpzdHJlZSZkaXNhYmxlPTNEIitoO3Ro
aXMuanN0cmVlLmZldGNoKHtzdWNjPQplc3M6ZnVuY3Rpb24obCxrKXtkZWZpbmUoImpxdWVyeSIs
ZnVuY3Rpb24oKXtyZXR1cm4galF1ZXJ5fSk7cmVxdWlyZShbImxpYnM9Ci9qcXVlcnkvanN0cmVl
Il0sZnVuY3Rpb24obSl7JCgiI2pzdHJlZV9icm93c2VyIikuanN0cmVlKCJkZXN0cm95Iik7JCgi
I2pzdD0KcmVlX2Jyb3dzZXIiKS5qc3RyZWUoe2NvcmU6e2RhdGE6bH0scGx1Z2luczpbInR5cGVz
IiwiY2hlY2tib3giXSx0eXBlczp7Zm9sPQpkZXI6e2ljb246ImpzdHJlZS1mb2xkZXIifSxmaWxl
OntpY29uOiJqc3RyZWUtZmlsZSJ9fSxjaGVja2JveDp7dGhyZWVfc3RhdGU9CjpmYWxzZX19KX0p
fSxlcnJvcjpmdW5jdGlvbihsLGspe2lmKHR5cGVvZiBrLnJlc3BvbnNlSlNPTiE9M0Q9M0QidW5k
ZWZpbmVkIj0KKXtmLmVycm9yKGsucmVzcG9uc2VKU09OLmVycl9tc2cpfWVsc2V7Zi5lcnJvcigi
QW4gZXJyb3Igb2N1cnJlZC4iKX19fSl9LGltPQpwb3J0RnJvbVBhdGhzQ2xpY2tlZDpmdW5jdGlv
bigpe3ZhciBnPTNEdGhpcy5tb2RhbC4kZWwuZmluZCgiLnByZXNlcnZlLWNoZWM9Cmtib3giKS5p
cygiOmNoZWNrZWQiKTt2YXIgbj0zRHRoaXMubW9kYWwuJGVsLmZpbmQoIi5saW5rLWNoZWNrYm94
IikuaXMoIjpjaD0KZWNrZWQiKTt2YXIgaD0zRHRoaXMuc2VsZWN0X2V4dGVuc2lvbi52YWx1ZSgp
O3ZhciBqPTNEdGhpcy5zZWxlY3RfZ2Vub21lLnZhPQpsdWUoKTt2YXIgbT0zRCQoInRleHRhcmVh
I2ltcG9ydF9wYXRocyIpLnZhbCgpO3ZhciBsPTNEW107aWYoIW0pe2YuaW5mbygiUGw9CmVhc2Ug
ZW50ZXIgYSBwYXRoIHJlbGF0aXZlIHRvIEdhbGF4eSByb290LiIpfWVsc2V7dGhpcy5tb2RhbC5k
aXNhYmxlQnV0dG9uKD0KIkltcG9ydCIpO209M0RtLnNwbGl0KCJcbiIpO2Zvcih2YXIgaz0zRG0u
bGVuZ3RoLTE7az49M0QwO2stLSl7dHJpbW1lZD0zRG1bPQprXS50cmltKCk7aWYodHJpbW1lZC5s
ZW5ndGghPTNEPTNEMCl7bC5wdXNoKHRyaW1tZWQpfX10aGlzLmluaXRDaGFpbkNhbGxDb249CnRy
b2woe2xlbmd0aDpsLmxlbmd0aCxhY3Rpb246ImFkZGluZ19kYXRhc2V0cyJ9KTt0aGlzLmNoYWlu
Q2FsbEltcG9ydGluZ0ZvbD0KZGVycyh7cGF0aHM6bCxwcmVzZXJ2ZV9kaXJzOmcsbGlua19kYXRh
Om4sc291cmNlOiJhZG1pbl9wYXRoIixmaWxlX3R5cGU6aCxkPQpia2V5Omp9KX19LGluaXRDaGFp
bkNhbGxDb250cm9sOmZ1bmN0aW9uKGcpe3ZhciBoO3N3aXRjaChnLmFjdGlvbil7Y2FzZSJhZGQ9
CmluZ19kYXRhc2V0cyI6aD0zRHRoaXMudGVtcGxhdGVBZGRpbmdEYXRhc2V0c1Byb2dyZXNzQmFy
KCk7dGhpcy5tb2RhbC4kZWwuZj0KaW5kKCIubW9kYWwtYm9keSIpLmh0bWwoaCh7Zm9sZGVyX25h
bWU6dGhpcy5vcHRpb25zLmZvbGRlcl9uYW1lfSkpO2JyZWFrO2NhPQpzZSJkZWxldGluZ19kYXRh
c2V0cyI6aD0zRHRoaXMudGVtcGxhdGVEZWxldGluZ0RhdGFzZXRzUHJvZ3Jlc3NCYXIoKTt0aGlz
Lm09Cm9kYWwuJGVsLmZpbmQoIi5tb2RhbC1ib2R5IikuaHRtbChoKCkpO2JyZWFrO2Nhc2UidG9f
aGlzdG9yeSI6aD0zRHRoaXMudGVtcD0KbGF0ZUltcG9ydEludG9IaXN0b3J5UHJvZ3Jlc3NCYXIo
KTt0aGlzLm1vZGFsLiRlbC5maW5kKCIubW9kYWwtYm9keSIpLmh0bWwoPQpoKHtoaXN0b3J5X25h
bWU6Zy5oaXN0b3J5X25hbWV9KSk7YnJlYWs7ZGVmYXVsdDpjb25zb2xlLmVycm9yKCJXcm9uZyBh
Y3Rpb249CiBzcGVjaWZpZWQuIik7YnJlYWt9dGhpcy5wcm9ncmVzcz0zRDA7dGhpcy5wcm9ncmVz
c1N0ZXA9M0QxMDAvZy5sZW5ndGg7dGhpcz0KLm9wdGlvbnMuY2hhaW5fY2FsbF9jb250cm9sLnRv
dGFsX251bWJlcj0zRGcubGVuZ3RoO3RoaXMub3B0aW9ucy5jaGFpbl9jYWxsPQpfY29udHJvbC5m
YWlsZWRfbnVtYmVyPTNEMH0saW1wb3J0RnJvbUpzdHJlZVBhdGg6ZnVuY3Rpb24obixyKXt2YXIg
Zz0zRCQoIiM9CmpzdHJlZV9icm93c2VyIikuanN0cmVlKCkuZ2V0X3NlbGVjdGVkKHRydWUpO3Zh
ciBtPTNEdGhpcy5tb2RhbC4kZWwuZmluZCgiLj0KcHJlc2VydmUtY2hlY2tib3giKS5pcygiOmNo
ZWNrZWQiKTt2YXIgbz0zRHRoaXMubW9kYWwuJGVsLmZpbmQoIi5saW5rLWNoZWNrPQpib3giKS5p
cygiOmNoZWNrZWQiKTt2YXIgaj0zRHRoaXMuc2VsZWN0X2V4dGVuc2lvbi52YWx1ZSgpO3ZhciBw
PTNEdGhpcy5zZWw9CmVjdF9nZW5vbWUudmFsdWUoKTt2YXIgaz0zRGdbMF0udHlwZTt2YXIgcT0z
RFtdO2lmKGcubGVuZ3RoPDEpe2YuaW5mbygiUGxlYT0Kc2Ugc2VsZWN0IHNvbWUgaXRlbXMgZmly
c3QuIil9ZWxzZXt0aGlzLm1vZGFsLmRpc2FibGVCdXR0b24oIkltcG9ydCIpO2Zvcih2PQphciBs
PTNEZy5sZW5ndGgtMTtsPj0zRDA7bC0tKXtpZihnW2xdLmxpX2F0dHIuZnVsbF9wYXRoIT0zRD0z
RHVuZGVmaW5lZCl7cS49CnB1c2goZ1tsXS5saV9hdHRyLmZ1bGxfcGF0aCl9fXRoaXMuaW5pdENo
YWluQ2FsbENvbnRyb2woe2xlbmd0aDpxLmxlbmd0aCxhYz0KdGlvbjoiYWRkaW5nX2RhdGFzZXRz
In0pO2lmKGs9M0Q9M0Q9M0QiZm9sZGVyIil7dmFyIGg9M0RyLnNvdXJjZSsiX2ZvbGRlciI7PQp0
aGlzLmNoYWluQ2FsbEltcG9ydGluZ0ZvbGRlcnMoe3BhdGhzOnEscHJlc2VydmVfZGlyczptLGxp
bmtfZGF0YTpvLHNvdXJjZTo9CmgsZmlsZV90eXBlOmosZGJrZXk6cH0pfWVsc2V7aWYoaz0zRD0z
RD0zRCJmaWxlIil7dmFyIGg9M0RyLnNvdXJjZSsiX2ZpbGUiOz0KdGhpcy5jaGFpbkNhbGxJbXBv
cnRpbmdVc2VyZGlyRmlsZXMoe3BhdGhzOnEsZmlsZV90eXBlOmosZGJrZXk6cCxzb3VyY2U6aH0p
PQp9fX19LGZldGNoQW5kRGlzcGxheUhpc3RvcnlDb250ZW50czpmdW5jdGlvbihpKXt2YXIgaD0z
RG5ldyBkLkhpc3RvcnlDb250ZW49CnRzKHtpZDppfSk7dmFyIGc9M0R0aGlzO2guZmV0Y2goe3N1
Y2Nlc3M6ZnVuY3Rpb24oayl7dmFyIGo9M0RnLnRlbXBsYXRlSGlzdD0Kb3J5Q29udGVudHMoKTtn
Lmhpc3Rvcmllcy5nZXQoaSkuc2V0KHtjb250ZW50czprfSk7Zy5tb2RhbC4kZWwuZmluZCgiI3Nl
bGVjPQp0ZWRfaGlzdG9yeV9jb250ZW50IikuaHRtbChqKHtoaXN0b3J5X2NvbnRlbnRzOmsubW9k
ZWxzLnJldmVyc2UoKX0pKX0sZXJyb3I9CjpmdW5jdGlvbihrLGope2lmKHR5cGVvZiBqLnJlc3Bv
bnNlSlNPTiE9M0Q9M0QidW5kZWZpbmVkIil7Zi5lcnJvcihqLnJlc3Bvbj0Kc2VKU09OLmVycl9t
c2cpfWVsc2V7Zi5lcnJvcigiQW4gZXJyb3Igb2N1cnJlZC4iKX19fSl9LGFkZEFsbERhdGFzZXRz
RnJvbUhpPQpzdG9yeTpmdW5jdGlvbigpe3ZhciBsPTNEdGhpcy5tb2RhbC4kZWwuZmluZCgiI3Nl
bGVjdGVkX2hpc3RvcnlfY29udGVudCIpLmY9CmluZCgiOmNoZWNrZWQiKTt2YXIgZz0zRFtdO3Zh
ciBrPTNEW107aWYobC5sZW5ndGg8MSl7Zi5pbmZvKCJZb3UgbXVzdCBzZWxlYz0KdCBzb21lIGRh
dGFzZXRzIGZpcnN0LiIpfWVsc2V7dGhpcy5tb2RhbC5kaXNhYmxlQnV0dG9uKCJBZGQiKTtsLmVh
Y2goZnVuY3RpPQpvbigpe3ZhciBpPTNEJCh0aGlzLnBhcmVudEVsZW1lbnQpLmRhdGEoImlkIik7
aWYoaSl7Zy5wdXNoKGkpfX0pO2Zvcih2YXIgaj0KPTNEZy5sZW5ndGgtMTtqPj0zRDA7ai0tKXto
aXN0b3J5X2RhdGFzZXRfaWQ9M0RnW2pdO3ZhciBoPTNEbmV3IGQuSXRlbSgpO2guPQp1cmw9M0Qi
L2FwaS9mb2xkZXJzLyIrdGhpcy5vcHRpb25zLmlkKyIvY29udGVudHMiO2guc2V0KHtmcm9tX2hk
YV9pZDpoaXN0b3I9CnlfZGF0YXNldF9pZH0pO2sucHVzaChoKX10aGlzLmluaXRDaGFpbkNhbGxD
b250cm9sKHtsZW5ndGg6ay5sZW5ndGgsYWN0aW9uOj0KImFkZGluZ19kYXRhc2V0cyJ9KTt0aGlz
LmNoYWluQ2FsbEFkZGluZ0hkYXMoayl9fSxjaGFpbkNhbGxJbXBvcnRpbmdJbnRvSGlzPQp0b3J5
OmZ1bmN0aW9uKGgsayl7dmFyIGc9M0R0aGlzO3ZhciBpPTNEaC5wb3AoKTtpZih0eXBlb2YgaT0z
RD0zRCJ1bmRlZmluZWQ9CiIpe2lmKHRoaXMub3B0aW9ucy5jaGFpbl9jYWxsX2NvbnRyb2wuZmFp
bGVkX251bWJlcj0zRD0zRD0zRDApe2Yuc3VjY2VzcygiUz0KZWxlY3RlZCBkYXRhc2V0cyBpbXBv
cnRlZCBpbnRvIGhpc3RvcnkuIENsaWNrIHRoaXMgdG8gc3RhcnQgYW5hbHlzaW5nIGl0LiIsPQoi
Iix7b25jbGljazpmdW5jdGlvbigpe3dpbmRvdy5sb2NhdGlvbj0zRCIvIn19KX1lbHNle2lmKHRo
aXMub3B0aW9ucy5jaGFpbl89CmNhbGxfY29udHJvbC5mYWlsZWRfbnVtYmVyPTNEPTNEPTNEdGhp
cy5vcHRpb25zLmNoYWluX2NhbGxfY29udHJvbC50b3RhbF9udT0KbWJlcil7Zi5lcnJvcigiVGhl
cmUgd2FzIGFuIGVycm9yIGFuZCBubyBkYXRhc2V0cyB3ZXJlIGltcG9ydGVkIGludG8gaGlzdG9y
PQp5LiIpfWVsc2V7aWYodGhpcy5vcHRpb25zLmNoYWluX2NhbGxfY29udHJvbC5mYWlsZWRfbnVt
YmVyPHRoaXMub3B0aW9ucy5jaGE9CmluX2NhbGxfY29udHJvbC50b3RhbF9udW1iZXIpe2Yud2Fy
bmluZygiU29tZSBvZiB0aGUgZGF0YXNldHMgY291bGQgbm90IGJlID0KaW1wb3J0ZWQgaW50byBo
aXN0b3J5LiBDbGljayB0aGlzIHRvIHNlZSB3aGF0IHdhcyBpbXBvcnRlZC4iLCIiLHtvbmNsaWNr
OmZ1PQpuY3Rpb24oKXt3aW5kb3cubG9jYXRpb249M0QiLyJ9fSl9fX1HYWxheHkubW9kYWwuaGlk
ZSgpO3JldHVybiB0cnVlfXZhciBqPQo9M0QkLndoZW4oaS5zYXZlKHtjb250ZW50OmkuY29udGVu
dCxzb3VyY2U6aS5zb3VyY2V9KSk7ai5kb25lKGZ1bmN0aW9uKCl7Zy49CnVwZGF0ZVByb2dyZXNz
KCk7Zy5jaGFpbkNhbGxJbXBvcnRpbmdJbnRvSGlzdG9yeShoLGspfSkuZmFpbChmdW5jdGlvbigp
e2cubz0KcHRpb25zLmNoYWluX2NhbGxfY29udHJvbC5mYWlsZWRfbnVtYmVyKz0zRDE7Zy51cGRh
dGVQcm9ncmVzcygpO2cuY2hhaW5DYWxsPQpJbXBvcnRpbmdJbnRvSGlzdG9yeShoLGspfSl9LGNo
YWluQ2FsbEltcG9ydGluZ1VzZXJkaXJGaWxlczpmdW5jdGlvbihnKXt2YXI9CiBoPTNEdGhpczt2
YXIgaT0zRGcucGF0aHMucG9wKCk7aWYodHlwZW9mIGk9M0Q9M0Q9M0QidW5kZWZpbmVkIil7aWYo
dGhpcy5vcD0KdGlvbnMuY2hhaW5fY2FsbF9jb250cm9sLmZhaWxlZF9udW1iZXI9M0Q9M0Q9M0Qw
KXtmLnN1Y2Nlc3MoIlNlbGVjdGVkIGZpbGVzPQogaW1wb3J0ZWQgaW50byB0aGUgY3VycmVudCBm
b2xkZXIiKTtHYWxheHkubW9kYWwuaGlkZSgpfWVsc2V7Zi5lcnJvcigiQW4gZXI9CnJvciBvY2N1
cmVkLiIpfXJldHVybiB0cnVlfXZhciBqPTNEJC53aGVuKCQucG9zdCgiL2FwaS9saWJyYXJpZXMv
ZGF0YXNldHM/ZT0KbmNvZGVkX2ZvbGRlcl9pZD0zRCIraC5pZCsiJnNvdXJjZT0zRCIrZy5zb3Vy
Y2UrIiZwYXRoPTNEIitpKyImZmlsZV90eXBlPTNEPQoiK2cuZmlsZV90eXBlKyImZGJrZXk9M0Qi
K2cuZGJrZXkpKTtqLmRvbmUoZnVuY3Rpb24oayl7aC51cGRhdGVQcm9ncmVzcygpO2g9Ci5jaGFp
bkNhbGxJbXBvcnRpbmdVc2VyZGlyRmlsZXMoZyl9KS5mYWlsKGZ1bmN0aW9uKCl7aC5vcHRpb25z
LmNoYWluX2NhbGxfYz0Kb250cm9sLmZhaWxlZF9udW1iZXIrPTNEMTtoLnVwZGF0ZVByb2dyZXNz
KCk7aC5jaGFpbkNhbGxJbXBvcnRpbmdVc2VyZGlyRmlsPQplcyhnKX0pfSxjaGFpbkNhbGxJbXBv
cnRpbmdGb2xkZXJzOmZ1bmN0aW9uKGcpe3ZhciBoPTNEdGhpczt2YXIgaT0zRGcucGF0aHM9Ci5w
b3AoKTtpZih0eXBlb2YgaT0zRD0zRCJ1bmRlZmluZWQiKXtpZih0aGlzLm9wdGlvbnMuY2hhaW5f
Y2FsbF9jb250cm9sLmZhaT0KbGVkX251bWJlcj0zRD0zRD0zRDApe2Yuc3VjY2VzcygiU2VsZWN0
ZWQgZm9sZGVycyBhbmQgdGhlaXIgY29udGVudHMgaW1wb3J0PQplZCBpbnRvIHRoZSBjdXJyZW50
IGZvbGRlci4iKTtHYWxheHkubW9kYWwuaGlkZSgpfWVsc2V7Zi5lcnJvcigiQW4gZXJyb3Igb2M9
CmN1cmVkLiIpfXJldHVybiB0cnVlfXZhciBqPTNEJC53aGVuKCQucG9zdCgiL2FwaS9saWJyYXJp
ZXMvZGF0YXNldHM/ZW5jb2RlZD0KX2ZvbGRlcl9pZD0zRCIraC5pZCsiJnNvdXJjZT0zRCIrZy5z
b3VyY2UrIiZwYXRoPTNEIitpKyImcHJlc2VydmVfZGlycz0zRCIrPQpnLnByZXNlcnZlX2RpcnMr
IiZsaW5rX2RhdGE9M0QiK2cubGlua19kYXRhKyImZmlsZV90eXBlPTNEIitnLmZpbGVfdHlwZSsi
JmQ9CmJrZXk9M0QiK2cuZGJrZXkpKTtqLmRvbmUoZnVuY3Rpb24oayl7aC51cGRhdGVQcm9ncmVz
cygpO2guY2hhaW5DYWxsSW1wb3J0aT0KbmdGb2xkZXJzKGcpfSkuZmFpbChmdW5jdGlvbigpe2gu
b3B0aW9ucy5jaGFpbl9jYWxsX2NvbnRyb2wuZmFpbGVkX251bWJlcis9Cj0zRDE7aC51cGRhdGVQ
cm9ncmVzcygpO2guY2hhaW5DYWxsSW1wb3J0aW5nRm9sZGVycyhnKX0pfSxjaGFpbkNhbGxBZGRp
bmdIZD0KYXM6ZnVuY3Rpb24oaCl7dmFyIGc9M0R0aGlzO3RoaXMuYWRkZWRfaGRhcz0zRG5ldyBk
LkZvbGRlcigpO3ZhciBpPTNEaC5wb3AoPQopO2lmKHR5cGVvZiBpPTNEPTNEInVuZGVmaW5lZCIp
e2lmKHRoaXMub3B0aW9ucy5jaGFpbl9jYWxsX2NvbnRyb2wuZmFpbGVkX249CnVtYmVyPTNEPTNE
PTNEMCl7Zi5zdWNjZXNzKCJTZWxlY3RlZCBkYXRhc2V0cyBmcm9tIGhpc3RvcnkgYWRkZWQgdG8g
dGhlIGZvbD0KZGVyIil9ZWxzZXtpZih0aGlzLm9wdGlvbnMuY2hhaW5fY2FsbF9jb250cm9sLmZh
aWxlZF9udW1iZXI9M0Q9M0Q9M0R0aGlzLm9wPQp0aW9ucy5jaGFpbl9jYWxsX2NvbnRyb2wudG90
YWxfbnVtYmVyKXtmLmVycm9yKCJUaGVyZSB3YXMgYW4gZXJyb3IgYW5kIG5vIGQ9CmF0YXNldHMg
d2VyZSBhZGRlZCB0byB0aGUgZm9sZGVyLiIpfWVsc2V7aWYodGhpcy5vcHRpb25zLmNoYWluX2Nh
bGxfY29udHJvbD0KLmZhaWxlZF9udW1iZXI8dGhpcy5vcHRpb25zLmNoYWluX2NhbGxfY29udHJv
bC50b3RhbF9udW1iZXIpe2Yud2FybmluZygiU29tPQplIG9mIHRoZSBkYXRhc2V0cyBjb3VsZCBu
b3QgYmUgYWRkZWQgdG8gdGhlIGZvbGRlciIpfX19R2FsYXh5Lm1vZGFsLmhpZGUoKTs9CnJldHVy
biB0aGlzLmFkZGVkX2hkYXN9dmFyIGo9M0QkLndoZW4oaS5zYXZlKHtmcm9tX2hkYV9pZDppLmdl
dCgiZnJvbV9oZGFfaT0KZCIpfSkpO2ouZG9uZShmdW5jdGlvbihrKXtHYWxheHkubGlicmFyaWVz
LmZvbGRlckxpc3RWaWV3LmNvbGxlY3Rpb24uYWRkKGspPQo7Zy51cGRhdGVQcm9ncmVzcygpO2cu
Y2hhaW5DYWxsQWRkaW5nSGRhcyhoKX0pLmZhaWwoZnVuY3Rpb24oKXtnLm9wdGlvbnMuY2g9CmFp
bl9jYWxsX2NvbnRyb2wuZmFpbGVkX251bWJlcis9M0QxO2cudXBkYXRlUHJvZ3Jlc3MoKTtnLmNo
YWluQ2FsbEFkZGluZ0hkYT0KcyhoKX0pfSxjaGFpbkNhbGxEZWxldGluZ0hkYXM6ZnVuY3Rpb24o
aCl7dmFyIGc9M0R0aGlzO3RoaXMuZGVsZXRlZF9sZGRhcz0KPTNEbmV3IGQuRm9sZGVyKCk7dmFy
IGk9M0RoLnBvcCgpO2lmKHR5cGVvZiBpPTNEPTNEPTNEInVuZGVmaW5lZCIpe2lmKHRoaXMuPQpv
cHRpb25zLmNoYWluX2NhbGxfY29udHJvbC5mYWlsZWRfbnVtYmVyPTNEPTNEPTNEMCl7Zi5zdWNj
ZXNzKCJTZWxlY3RlZCBkYXQ9CmFzZXRzIHdlcmUgZGVsZXRlZC4iKX1lbHNle2lmKHRoaXMub3B0
aW9ucy5jaGFpbl9jYWxsX2NvbnRyb2wuZmFpbGVkX251bWJlcj0KPTNEPTNEPTNEdGhpcy5vcHRp
b25zLmNoYWluX2NhbGxfY29udHJvbC50b3RhbF9udW1iZXIpe2YuZXJyb3IoIlRoZXJlIHdhcyBh
PQpuIGVycm9yIGFuZCBubyBkYXRhc2V0cyB3ZXJlIGRlbGV0ZWQuIFBsZWFzZSBtYWtlIHN1cmUg
eW91IGhhdmUgc3VmZmljaWVudCA9CnBlcm1pc3Npb25zLiIpfWVsc2V7aWYodGhpcy5vcHRpb25z
LmNoYWluX2NhbGxfY29udHJvbC5mYWlsZWRfbnVtYmVyPHRoaXMubz0KcHRpb25zLmNoYWluX2Nh
bGxfY29udHJvbC50b3RhbF9udW1iZXIpe2Yud2FybmluZygiU29tZSBvZiB0aGUgZGF0YXNldHMg
Y291PQpsZCBub3QgYmUgZGVsZXRlZC4gUGxlYXNlIG1ha2Ugc3VyZSB5b3UgaGF2ZSBzdWZmaWNp
ZW50IHBlcm1pc3Npb25zLiIpfX19R2E9CmxheHkubW9kYWwuaGlkZSgpO3JldHVybiB0aGlzLmRl
bGV0ZWRfbGRkYXN9dmFyIGo9M0QkLndoZW4oaS5kZXN0cm95KCkpO2ouZD0Kb25lKGZ1bmN0aW9u
KGwpe0dhbGF4eS5saWJyYXJpZXMuZm9sZGVyTGlzdFZpZXcuY29sbGVjdGlvbi5yZW1vdmUoaS5p
ZCk7Zy51PQpwZGF0ZVByb2dyZXNzKCk7aWYoR2FsYXh5LmxpYnJhcmllcy5mb2xkZXJMaXN0Vmll
dy5vcHRpb25zLmluY2x1ZGVfZGVsZXRlZCk9Cnt2YXIgaz0zRG5ldyBkLkl0ZW0obCk7R2FsYXh5
LmxpYnJhcmllcy5mb2xkZXJMaXN0Vmlldy5jb2xsZWN0aW9uLmFkZChrKX1nLj0KY2hhaW5DYWxs
RGVsZXRpbmdIZGFzKGgpfSkuZmFpbChmdW5jdGlvbigpe2cub3B0aW9ucy5jaGFpbl9jYWxsX2Nv
bnRyb2wuZmFpPQpsZWRfbnVtYmVyKz0zRDE7Zy51cGRhdGVQcm9ncmVzcygpO2cuY2hhaW5DYWxs
RGVsZXRpbmdIZGFzKGgpfSl9LGNoZWNrSW5jbHU9CmRlRGVsZXRlZDpmdW5jdGlvbihnKXtpZihn
LnRhcmdldC5jaGVja2VkKXtHYWxheHkubGlicmFyaWVzLmZvbGRlckxpc3RWaWV3Lj0KZmV0Y2hG
b2xkZXIoe2luY2x1ZGVfZGVsZXRlZDp0cnVlfSl9ZWxzZXtHYWxheHkubGlicmFyaWVzLmZvbGRl
ckxpc3RWaWV3LmZlPQp0Y2hGb2xkZXIoe2luY2x1ZGVfZGVsZXRlZDpmYWxzZX0pfX0sZGVsZXRl
U2VsZWN0ZWREYXRhc2V0czpmdW5jdGlvbigpe3ZhciA9Cmc9M0QkKCIjZm9sZGVyX3RhYmxlIiku
ZmluZCgiOmNoZWNrZWQiKTtpZihnLmxlbmd0aD0zRD0zRD0zRDApe2YuaW5mbygiWW91ID0KbXVz
dCBzZWxlY3QgYXQgbGVhc3Qgb25lIGRhdGFzZXQgZm9yIGRlbGV0aW9uLiIpfWVsc2V7dmFyIGs9
M0R0aGlzLnRlbXBsYXRlPQpEZWxldGluZ0RhdGFzZXRzUHJvZ3Jlc3NCYXIoKTt0aGlzLm1vZGFs
PTNER2FsYXh5Lm1vZGFsO3RoaXMubW9kYWwuc2hvdyh7Y2w9Cm9zaW5nX2V2ZW50czp0cnVlLHRp
dGxlOiJEZWxldGluZyBzZWxlY3RlZCBkYXRhc2V0cyIsYm9keTprKHt9KSxidXR0b25zOntDbD0K
b3NlOmZ1bmN0aW9uKCl7R2FsYXh5Lm1vZGFsLmhpZGUoKX19fSk7dGhpcy5vcHRpb25zLmNoYWlu
X2NhbGxfY29udHJvbC50b3RhPQpsX251bWJlcj0zRDA7dGhpcy5vcHRpb25zLmNoYWluX2NhbGxf
Y29udHJvbC5mYWlsZWRfbnVtYmVyPTNEMDt2YXIgaD0zRFtdO2c9Ci5lYWNoKGZ1bmN0aW9uKCl7
aWYodGhpcy5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQuaWQhPTNEPTNEIiIpe2gucHVzaCh0
aD0KaXMucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmlkKX19KTt0aGlzLnByb2dyZXNzU3Rl
cD0zRDEwMC9oLmxlbmd0aDt0aGlzPQoucHJvZ3Jlc3M9M0QwO3ZhciBtPTNEW107Zm9yKHZhciBq
PTNEaC5sZW5ndGgtMTtqPj0zRDA7ai0tKXt2YXIgbD0zRG5ldyBkLkk9CnRlbSh7aWQ6aFtqXX0p
O20ucHVzaChsKX10aGlzLm9wdGlvbnMuY2hhaW5fY2FsbF9jb250cm9sLnRvdGFsX251bWJlcj0z
RGgubD0KZW5ndGg7dGhpcy5jaGFpbkNhbGxEZWxldGluZ0hkYXMobSl9fSxzaG93TGliSW5mbzpm
dW5jdGlvbigpe3ZhciBoPTNER2FsYXh5PQoubGlicmFyaWVzLmZvbGRlckxpc3RWaWV3LmZvbGRl
ckNvbnRhaW5lci5hdHRyaWJ1dGVzLm1ldGFkYXRhLnBhcmVudF9saWJyYXI9CnlfaWQ7dmFyIGc9
M0RudWxsO3ZhciBpPTNEdGhpcztpZihHYWxheHkubGlicmFyaWVzLmxpYnJhcnlMaXN0VmlldyE9
M0Q9M0RudT0KbGwpe2c9M0RHYWxheHkubGlicmFyaWVzLmxpYnJhcnlMaXN0Vmlldy5jb2xsZWN0
aW9uLmdldChoKTt0aGlzLnNob3dMaWJJbmZvPQpNb2RhbChnKX1lbHNle2c9M0RuZXcgZC5MaWJy
YXJ5KHtpZDpofSk7Zy5mZXRjaCh7c3VjY2VzczpmdW5jdGlvbigpe2kuc2hvd0w9CmliSW5mb01v
ZGFsKGcpfSxlcnJvcjpmdW5jdGlvbihrLGope2lmKHR5cGVvZiBqLnJlc3BvbnNlSlNPTiE9M0Q9
M0QidW5kZWZpbj0KZWQiKXtmLmVycm9yKGoucmVzcG9uc2VKU09OLmVycl9tc2cpfWVsc2V7Zi5l
cnJvcigiQW4gZXJyb3Igb2N1cnJlZC4iKX19fSl9PQp9LHNob3dMaWJJbmZvTW9kYWw6ZnVuY3Rp
b24oZyl7dmFyIGg9M0R0aGlzLnRlbXBsYXRlTGliSW5mb0luTW9kYWwoKTt0aGlzLm09Cm9kYWw9
M0RHYWxheHkubW9kYWw7dGhpcy5tb2RhbC5zaG93KHtjbG9zaW5nX2V2ZW50czp0cnVlLHRpdGxl
OiJMaWJyYXJ5IEluZj0Kb3JtYXRpb24iLGJvZHk6aCh7bGlicmFyeTpnfSksYnV0dG9uczp7Q2xv
c2U6ZnVuY3Rpb24oKXtHYWxheHkubW9kYWwuaGlkZSgpPQp9fX0pfSxzaG93SW1wb3J0TW9kYWw6
ZnVuY3Rpb24oZyl7c3dpdGNoKGcuc291cmNlKXtjYXNlImhpc3RvcnkiOnRoaXMuYWRkRmk9Cmxl
c0Zyb21IaXN0b3J5TW9kYWwoKTticmVhaztjYXNlImltcG9ydGRpciI6dGhpcy5pbXBvcnRGaWxl
c0Zyb21HYWxheHlGb2xkZT0Kck1vZGFsKHtzb3VyY2U6ImltcG9ydGRpciJ9KTticmVhaztjYXNl
InBhdGgiOnRoaXMuaW1wb3J0RmlsZXNGcm9tUGF0aE1vZGFsPQooKTticmVhaztjYXNlInVzZXJk
aXIiOnRoaXMuaW1wb3J0RmlsZXNGcm9tR2FsYXh5Rm9sZGVyTW9kYWwoe3NvdXJjZToidXNlcmQ9
CmlyIn0pO2JyZWFrO2RlZmF1bHQ6R2FsYXh5LmxpYnJhcmllcy5saWJyYXJ5X3JvdXRlci5iYWNr
KCk7Zi5lcnJvcigiSW52YWxpZD0KIGltcG9ydCBzb3VyY2UuIik7YnJlYWt9fSxzaG93UGFnZVNp
emVQcm9tcHQ6ZnVuY3Rpb24oKXt2YXIgZz0zRHByb21wdCgiSG93PQogbWFueSBpdGVtcyBwZXIg
cGFnZSBkbyB5b3Ugd2FudCB0byBzZWU/IixHYWxheHkubGlicmFyaWVzLnByZWZlcmVuY2VzLmdl
dCg9CiJmb2xkZXJfcGFnZV9zaXplIikpO2lmKChnIT0zRG51bGwpJiYoZz0zRD0zRHBhcnNlSW50
KGcpKSl7R2FsYXh5LmxpYnJhcmllcz0KLnByZWZlcmVuY2VzLnNldCh7Zm9sZGVyX3BhZ2Vfc2l6
ZTpwYXJzZUludChnKX0pO0dhbGF4eS5saWJyYXJpZXMuZm9sZGVyTGlzPQp0Vmlldy5yZW5kZXIo
e2lkOnRoaXMub3B0aW9ucy5pZCxzaG93X3BhZ2U6MX0pfX0sdGVtcGxhdGVUb29sQmFyOmZ1bmN0
aW9uKCk9Cnt0bXBsX2FycmF5PTNEW107dG1wbF9hcnJheS5wdXNoKCc8ZGl2IGNsYXNzPTNEImxp
YnJhcnlfc3R5bGVfY29udGFpbmVyIj4nKT0KO3RtcGxfYXJyYXkucHVzaCgnIDxkaXYgaWQ9M0Qi
bGlicmFyeV90b29sYmFyIj4nKTt0bXBsX2FycmF5LnB1c2goIiAgIDxzcGFuPQo+PHN0cm9uZz5E
QVRBIExJQlJBUklFUzwvc3Ryb25nPjwvc3Bhbj4iKTt0bXBsX2FycmF5LnB1c2goJyAgIDxzcGFu
IGRhdGEtdG89CmdnbGU9M0QidG9vbHRpcCIgZGF0YS1wbGFjZW1lbnQ9M0QidG9wIiBjbGFzcz0z
RCJsb2dnZWQtZGF0YXNldC1tYW5pcHVsYXRpbz0KbiIgdGl0bGU9M0QiSW5jbHVkZSBkZWxldGVk
IGRhdGFzZXRzIiBzdHlsZT0zRCJkaXNwbGF5Om5vbmU7Ij4gfCA8aW5wdXQgaWQ9Cj0zRCJpbmNs
dWRlX2RlbGV0ZWRfZGF0YXNldHNfY2hrIiBzdHlsZT0zRCJtYXJnaW46IDA7IiB0eXBlPTNEImNo
ZWNrYm94Ij4gaT0KbmNsdWRlIGRlbGV0ZWQgfCA8L2lucHV0Pjwvc3Bhbj4nKTt0bXBsX2FycmF5
LnB1c2goJyAgIDxidXR0b24gc3R5bGU9M0QiZGlzPQpwbGF5Om5vbmU7IiBkYXRhLXRvZ2dsZT0z
RCJ0b29sdGlwIiBkYXRhLXBsYWNlbWVudD0zRCJ0b3AiIHRpdGxlPTNEIkNyZWF0ZSA9Ck5ldyBG
b2xkZXIiIGlkPTNEInRvb2xidG5fY3JlYXRlX2ZvbGRlciIgY2xhc3M9M0QiYnRuIGJ0bi1kZWZh
dWx0IHByaW1hcnktYj0KdXR0b24gYWRkLWxpYnJhcnktaXRlbXMiIHR5cGU9M0QiYnV0dG9uIj48
c3BhbiBjbGFzcz0zRCJmYSBmYS1wbHVzIj48L3NwYW4+PQo8c3BhbiBjbGFzcz0zRCJmYSBmYS1m
b2xkZXIiPjwvc3Bhbj48L2J1dHRvbj4nKTt0bXBsX2FycmF5LnB1c2goIjwlIGlmKG11dGk9CnBs
ZV9hZGRfZGF0YXNldF9vcHRpb25zKSB7ICU+Iik7dG1wbF9hcnJheS5wdXNoKCcgICA8ZGl2IGNs
YXNzPTNEImJ0bi1ncm91cD0KIGFkZC1saWJyYXJ5LWl0ZW1zIiBzdHlsZT0zRCJkaXNwbGF5Om5v
bmU7Ij4nKTt0bXBsX2FycmF5LnB1c2goJyAgICAgPGJ1dHRvPQpuIHRpdGxlPTNEIkFkZCBEYXRh
c2V0cyB0byBDdXJyZW50IEZvbGRlciIgaWQ9M0QiIiB0eXBlPTNEImJ1dHRvbiIgY2xhc3M9M0Q9
CiJwcmltYXJ5LWJ1dHRvbiBkcm9wZG93bi10b2dnbGUiIGRhdGEtdG9nZ2xlPTNEImRyb3Bkb3du
Ij4nKTt0bXBsX2FycmF5LnB1cz0KaCgnICAgICA8c3BhbiBjbGFzcz0zRCJmYSBmYS1wbHVzIj48
L3NwYW4+PHNwYW4gY2xhc3M9M0QiZmEgZmEtZmlsZSI+PC9zcGFuPQo+PHNwYW4gY2xhc3M9M0Qi
Y2FyZXQiPjwvc3Bhbj4nKTt0bXBsX2FycmF5LnB1c2goIiAgICAgPC9idXR0b24+Iik7dG1wbF9h
cnI9CmF5LnB1c2goJyAgICAgPHVsIGNsYXNzPTNEImRyb3Bkb3duLW1lbnUiIHJvbGU9M0QibWVu
dSI+Jyk7dG1wbF9hcnJheS5wdXNoKD0KJyAgICAgICAgPGxpPjxhIGhyZWY9M0QiI2ZvbGRlcnMv
PCU9M0QgaWQgJT4vaW1wb3J0L2hpc3RvcnkiPiBmcm9tIEhpc3Rvcnk8PQovYT48L2xpPicpO3Rt
cGxfYXJyYXkucHVzaCgiPCUgaWYoR2FsYXh5LmNvbmZpZy51c2VyX2xpYnJhcnlfaW1wb3J0X2Rp
ciAhPQo9M0Q9M0QgbnVsbCkgeyAlPiIpO3RtcGxfYXJyYXkucHVzaCgnICAgICAgICA8bGk+PGEg
aHJlZj0zRCIjZm9sZGVycy88JT0zRCA9CmlkICU+L2ltcG9ydC91c2VyZGlyIj4gZnJvbSBVc2Vy
IERpcmVjdG9yeTwvYT48L2xpPicpO3RtcGxfYXJyYXkucHVzaCgiPCUgfT0KICU+Iik7dG1wbF9h
cnJheS5wdXNoKCI8JSBpZihHYWxheHkuY29uZmlnLmFsbG93X2xpYnJhcnlfcGF0aF9wYXN0ZSkg
eyAlPiIpPQo7dG1wbF9hcnJheS5wdXNoKCcgICA8bGkgY2xhc3M9M0QiZGl2aWRlciI+PC9saT4n
KTt0bXBsX2FycmF5LnB1c2goJyAgIDxsaSA9CmNsYXNzPTNEImRyb3Bkb3duLWhlYWRlciI+QWRt
aW5zIG9ubHk8L2xpPicpO3RtcGxfYXJyYXkucHVzaCgiPCUgaWYoR2FsYXh5Lj0KY29uZmlnLmxp
YnJhcnlfaW1wb3J0X2RpciAhPTNEPTNEIG51bGwpIHsgJT4iKTt0bXBsX2FycmF5LnB1c2goJyAg
IDxsaT48YSBoPQpyZWY9M0QiI2ZvbGRlcnMvPCU9M0QgaWQgJT4vaW1wb3J0L2ltcG9ydGRpciI+
ZnJvbSBJbXBvcnQgRGlyZWN0b3J5PC9hPjwvbGk9Cj4nKTt0bXBsX2FycmF5LnB1c2goIjwlIH0g
JT4iKTt0bXBsX2FycmF5LnB1c2goIjwlIGlmKEdhbGF4eS5jb25maWcuYWxsb3dfbD0KaWJyYXJ5
X3BhdGhfcGFzdGUpIHsgJT4iKTt0bXBsX2FycmF5LnB1c2goJyAgICAgICAgPGxpPjxhIGhyZWY9
M0QiI2ZvbGRlcnMvPQo8JT0zRCBpZCAlPi9pbXBvcnQvcGF0aCI+ZnJvbSBQYXRoPC9hPjwvbGk+
Jyk7dG1wbF9hcnJheS5wdXNoKCI8JSB9ICU+Iik7dG09CnBsX2FycmF5LnB1c2goIjwlIH0gJT4i
KTt0bXBsX2FycmF5LnB1c2goIiAgICAgPC91bD4iKTt0bXBsX2FycmF5LnB1c2goIiAgID0KPC9k
aXY+Iik7dG1wbF9hcnJheS5wdXNoKCI8JSB9IGVsc2UgeyAlPiIpO3RtcGxfYXJyYXkucHVzaCgn
IDxhICBkYXRhLXBsYWNlPQptZW50PTNEInRvcCIgdGl0bGU9M0QiQWRkIERhdGFzZXRzIHRvIEN1
cnJlbnQgRm9sZGVyIiBzdHlsZT0zRCJkaXNwbGF5Om5vbmU9CjsiIGNsYXNzPTNEImJ0biBidG4t
ZGVmYXVsdCBhZGQtbGlicmFyeS1pdGVtcyIgaHJlZj0zRCIjZm9sZGVycy88JT0zRCBpZCAlPj0K
L2ltcG9ydC9oaXN0b3J5IiByb2xlPTNEImJ1dHRvbiI+PHNwYW4gY2xhc3M9M0QiZmEgZmEtcGx1
cyI+PC9zcGFuPjxzcGFuIGNsPQphc3M9M0QiZmEgZmEtZmlsZSI+PC9zcGFuPjwvc3Bhbj48L2E+
Jyk7dG1wbF9hcnJheS5wdXNoKCI8JSB9ICU+Iik7dG1wbF9hcnI9CmF5LnB1c2goJyAgPGJ1dHRv
biBkYXRhLXRvZ2dsZT0zRCJ0b29sdGlwIiBkYXRhLXBsYWNlbWVudD0zRCJ0b3AiIHRpdGxlPTNE
Ij0KSW1wb3J0IHNlbGVjdGVkIGRhdGFzZXRzIGludG8gaGlzdG9yeSIgaWQ9M0QidG9vbGJ0bl9i
dWxrX2ltcG9ydCIgY2xhc3M9M0QiPQpwcmltYXJ5LWJ1dHRvbiBkYXRhc2V0LW1hbmlwdWxhdGlv
biIgc3R5bGU9M0QibWFyZ2luLWxlZnQ6IDAuNWVtOyBkaXNwbGF5Om49Cm9uZTsiIHR5cGU9M0Qi
YnV0dG9uIj48c3BhbiBjbGFzcz0zRCJmYSBmYS1ib29rIj48L3NwYW4+IHRvIEhpc3Rvcnk8L2J1
dHRvbj0KPicpO3RtcGxfYXJyYXkucHVzaCgnICAgPGRpdiBpZD0zRCJ0b29sYnRuX2RsIiBjbGFz
cz0zRCJidG4tZ3JvdXAgZGF0YXNldC1tPQphbmlwdWxhdGlvbiIgc3R5bGU9M0QibWFyZ2luLWxl
ZnQ6IDAuNWVtOyBkaXNwbGF5Om5vbmU7ICI+Jyk7dG1wbF9hcnJheS5wdXM9CmgoJyAgICAgPGJ1
dHRvbiB0aXRsZT0zRCJEb3dubG9hZCBzZWxlY3RlZCBkYXRhc2V0cyBhcyBhcmNoaXZlIiBpZD0z
RCJkcm9wXz0KdG9nZ2xlIiB0eXBlPTNEImJ1dHRvbiIgY2xhc3M9M0QicHJpbWFyeS1idXR0b24g
ZHJvcGRvd24tdG9nZ2xlIiBkYXRhLXRvZ2dsPQplPTNEImRyb3Bkb3duIj4nKTt0bXBsX2FycmF5
LnB1c2goJyAgICAgPHNwYW4gY2xhc3M9M0QiZmEgZmEtZG93bmxvYWQiPjwvc3A9CmFuPiBEb3du
bG9hZCA8c3BhbiBjbGFzcz0zRCJjYXJldCI+PC9zcGFuPicpO3RtcGxfYXJyYXkucHVzaCgiICAg
ICA8L2J1dHRvbj0KPiIpO3RtcGxfYXJyYXkucHVzaCgnICAgICA8dWwgY2xhc3M9M0QiZHJvcGRv
d24tbWVudSIgcm9sZT0zRCJtZW51Ij4nKTt0bXBsPQpfYXJyYXkucHVzaCgnICAgICAgICA8bGk+
PGEgaHJlZj0zRCIjL2ZvbGRlcnMvPCU9M0QgaWQgJT4vZG93bmxvYWQvdGd6Ij4udGE9CnIuZ3o8
L2E+PC9saT4nKTt0bXBsX2FycmF5LnB1c2goJyAgICAgICAgPGxpPjxhIGhyZWY9M0QiIy9mb2xk
ZXJzLzwlPTNEIGlkID0KJT4vZG93bmxvYWQvdGJ6Ij4udGFyLmJ6PC9hPjwvbGk+Jyk7dG1wbF9h
cnJheS5wdXNoKCcgICAgICAgIDxsaT48YSBocmVmPTNEPQoiIy9mb2xkZXJzLzwlPTNEIGlkICU+
L2Rvd25sb2FkL3ppcCI+LnppcDwvYT48L2xpPicpO3RtcGxfYXJyYXkucHVzaCgiICAgICA9Cjwv
dWw+Iik7dG1wbF9hcnJheS5wdXNoKCIgICA8L2Rpdj4iKTt0bXBsX2FycmF5LnB1c2goJyAgIDxi
dXR0b24gZGF0YS10b2dnbD0KZT0zRCJ0b29sdGlwIiBkYXRhLXBsYWNlbWVudD0zRCJ0b3AiIHRp
dGxlPTNEIk1hcmsgc2VsZWN0ZWQgZGF0YXNldHMgZGVsZXRlPQpkIiBpZD0zRCJ0b29sYnRuX2J1
bGtfZGVsZXRlIiBjbGFzcz0zRCJwcmltYXJ5LWJ1dHRvbiBsb2dnZWQtZGF0YXNldC1tYW5pcHU9
CmxhdGlvbiIgc3R5bGU9M0QibWFyZ2luLWxlZnQ6IDAuNWVtOyBkaXNwbGF5Om5vbmU7ICIgdHlw
ZT0zRCJidXR0b24iPjxzcGFuID0KY2xhc3M9M0QiZmEgZmEtdGltZXMiPjwvc3Bhbj4gRGVsZXRl
PC9idXR0b24+Jyk7dG1wbF9hcnJheS5wdXNoKCcgICA8YnV0dG9uPQogZGF0YS1pZD0zRCI8JS0g
aWQgJT4iIGRhdGEtdG9nZ2xlPTNEInRvb2x0aXAiIGRhdGEtcGxhY2VtZW50PTNEInRvcCIgdGl0
bGU9Cj0zRCJTaG93IGxpYnJhcnkgaW5mb3JtYXRpb24iIGlkPTNEInRvb2xidG5fc2hvd19saWJp
bmZvIiBjbGFzcz0zRCJwcmltYXJ5LT0KYnV0dG9uIiBzdHlsZT0zRCJtYXJnaW4tbGVmdDogMC41
ZW07IiB0eXBlPTNEImJ1dHRvbiI+PHNwYW4gY2xhc3M9M0QiZmEgZmEtPQppbmZvLWNpcmNsZSI+
PC9zcGFuPiBMaWJyYXJ5IEluZm88L2J1dHRvbj4nKTt0bXBsX2FycmF5LnB1c2goJyAgIDxzcGFu
IGNsYXM9CnM9M0QiaGVscC1idXR0b24iIGRhdGEtdG9nZ2xlPTNEInRvb2x0aXAiIGRhdGEtcGxh
Y2VtZW50PTNEInRvcCIgdGl0bGU9M0QiVj0KaXNpdCBMaWJyYXJpZXMgV2lraSI+PGEgaHJlZj0z
RCJodHRwczovL3dpa2kuZ2FsYXh5cHJvamVjdC5vcmcvRGF0YUxpYnJhcmllPQpzL3NjcmVlbi9G
b2xkZXJDb250ZW50cyIgdGFyZ2V0PTNEIl9ibGFuayI+PGJ1dHRvbiBjbGFzcz0zRCJwcmltYXJ5
LWJ1dHRvbiI9CiB0eXBlPTNEImJ1dHRvbiI+PHNwYW4gY2xhc3M9M0QiZmEgZmEtcXVlc3Rpb24t
Y2lyY2xlIj48L3NwYW4+IEhlbHA8L2J1dHRvbj0KPjwvYT48L3NwYW4+Jyk7dG1wbF9hcnJheS5w
dXNoKCcgICAgICAgICAgPHNwYW4gaWQ9M0QiZm9sZGVyX3BhZ2luYXRvciIgY2xhPQpzcz0zRCJs
aWJyYXJ5LXBhZ2luYXRvciI+Jyk7dG1wbF9hcnJheS5wdXNoKCIgICAgICAgICAgPC9zcGFuPiIp
O3RtcGxfYXJyYXk9Ci5wdXNoKCIgPC9kaXY+Iik7dG1wbF9hcnJheS5wdXNoKCcgPGRpdiBpZD0z
RCJmb2xkZXJfaXRlbXNfZWxlbWVudCI+Jyk7dG1wbD0KX2FycmF5LnB1c2goIiA8L2Rpdj4iKTt0
bXBsX2FycmF5LnB1c2goIjwvZGl2PiIpO3JldHVybiBfLnRlbXBsYXRlKHRtcGxfYXJyPQpheS5q
b2luKCIiKSl9LHRlbXBsYXRlTGliSW5mb0luTW9kYWw6ZnVuY3Rpb24oKXt0bXBsX2FycmF5PTNE
W107dG1wbF9hcnJheS49CnB1c2goJzxkaXYgaWQ9M0QibGlmX2luZm9fbW9kYWwiPicpO3RtcGxf
YXJyYXkucHVzaCgiPGgyPkxpYnJhcnkgbmFtZTo8L2gyPj0KIik7dG1wbF9hcnJheS5wdXNoKCc8
cD48JS0gbGlicmFyeS5nZXQoIm5hbWUiKSAlPjwvcD4nKTt0bXBsX2FycmF5LnB1c2goIjxoPQoz
PkxpYnJhcnkgZGVzY3JpcHRpb246PC9oMz4iKTt0bXBsX2FycmF5LnB1c2goJzxwPjwlLSBsaWJy
YXJ5LmdldCgiZGVzY3JpcHQ9CmlvbiIpICU+PC9wPicpO3RtcGxfYXJyYXkucHVzaCgiPGgzPkxp
YnJhcnkgc3lub3BzaXM6PC9oMz4iKTt0bXBsX2FycmF5LnB1cz0KaCgnPHA+PCUtIGxpYnJhcnku
Z2V0KCJzeW5vcHNpcyIpICU+PC9wPicpO3RtcGxfYXJyYXkucHVzaCgiPC9kaXY+Iik7cmV0dXJu
PQogXy50ZW1wbGF0ZSh0bXBsX2FycmF5LmpvaW4oIiIpKX0sdGVtcGxhdGVOZXdGb2xkZXJJbk1v
ZGFsOmZ1bmN0aW9uKCl7dG1wbF89CmFycmF5PTNEW107dG1wbF9hcnJheS5wdXNoKCc8ZGl2IGlk
PTNEIm5ld19mb2xkZXJfbW9kYWwiPicpO3RtcGxfYXJyYXkucHVzaD0KKCI8Zm9ybT4iKTt0bXBs
X2FycmF5LnB1c2goJzxpbnB1dCB0eXBlPTNEInRleHQiIG5hbWU9M0QiTmFtZSIgdmFsdWU9M0Qi
IiBwPQpsYWNlaG9sZGVyPTNEIk5hbWUiPicpO3RtcGxfYXJyYXkucHVzaCgnPGlucHV0IHR5cGU9
M0QidGV4dCIgbmFtZT0zRCJEZXNjcmk9CnB0aW9uIiB2YWx1ZT0zRCIiIHBsYWNlaG9sZGVyPTNE
IkRlc2NyaXB0aW9uIj4nKTt0bXBsX2FycmF5LnB1c2goIjwvZm9ybT4iKT0KO3RtcGxfYXJyYXku
cHVzaCgiPC9kaXY+Iik7cmV0dXJuIF8udGVtcGxhdGUodG1wbF9hcnJheS5qb2luKCIiKSl9LHRl
bXBsYXRlPQpCdWxrSW1wb3J0SW5Nb2RhbDpmdW5jdGlvbigpe3ZhciBnPTNEW107Zy5wdXNoKCc8
c3BhbiBpZD0zRCJoaXN0b3J5X21vZGFsX2M9Cm9tYm9fYnVsayIgc3R5bGU9M0Qid2lkdGg6OTAl
OyBtYXJnaW4tbGVmdDogMWVtOyBtYXJnaW4tcmlnaHQ6IDFlbTsgIj4nKTtnLj0KcHVzaCgiU2Vs
ZWN0IGhpc3Rvcnk6ICIpO2cucHVzaCgnPHNlbGVjdCBpZD0zRCJkYXRhc2V0X2ltcG9ydF9idWxr
IiBuYW1lPTNEPQoiZGF0YXNldF9pbXBvcnRfYnVsayIgc3R5bGU9M0Qid2lkdGg6NTAlOyBtYXJn
aW4tYm90dG9tOiAxZW07ICI+ICcpO2cucHVzaCg9CiIgICA8JSBfLmVhY2goaGlzdG9yaWVzLCBm
dW5jdGlvbihoaXN0b3J5KSB7ICU+Iik7Zy5wdXNoKCcgICAgICAgPG9wdGlvbiB2YT0KbHVlPTNE
IjwlPTNEIF8uZXNjYXBlKGhpc3RvcnkuZ2V0KCJpZCIpKSAlPiI+PCU9M0QgXy5lc2NhcGUoaGlz
dG9yeS5nZXQoIm5hPQptZSIpKSAlPjwvb3B0aW9uPicpO2cucHVzaCgiICAgPCUgfSk7ICU+Iik7
Zy5wdXNoKCI8L3NlbGVjdD4iKTtnLnB1c2goIjwvc3A9CmFuPiIpO3JldHVybiBfLnRlbXBsYXRl
KGcuam9pbigiIikpfSx0ZW1wbGF0ZUltcG9ydEludG9IaXN0b3J5UHJvZ3Jlc3NCYXI6Zj0KdW5j
dGlvbigpe3ZhciBnPTNEW107Zy5wdXNoKCc8ZGl2IGNsYXNzPTNEImltcG9ydF90ZXh0Ij4nKTtn
LnB1c2goIkltcG9ydGluPQpnIHNlbGVjdGVkIGRhdGFzZXRzIHRvIGhpc3RvcnkgPGI+PCU9M0Qg
Xy5lc2NhcGUoaGlzdG9yeV9uYW1lKSAlPjwvYj4iKTtnLnA9CnVzaCgiPC9kaXY+Iik7Zy5wdXNo
KCc8ZGl2IGNsYXNzPTNEInByb2dyZXNzIj4nKTtnLnB1c2goJyAgIDxkaXYgY2xhc3M9M0QicD0K
cm9ncmVzcy1iYXIgcHJvZ3Jlc3MtYmFyLWltcG9ydCIgcm9sZT0zRCJwcm9ncmVzc2JhciIgYXJp
YS12YWx1ZW5vdz0zRCIwIiBhPQpyaWEtdmFsdWVtaW49M0QiMCIgYXJpYS12YWx1ZW1heD0zRCIx
MDAiIHN0eWxlPTNEIndpZHRoOiAwMCU7Ij4nKTtnLnB1c2goJyA9CiAgICAgIDxzcGFuIGNsYXNz
PTNEImNvbXBsZXRpb25fc3BhbiI+MCUgQ29tcGxldGU8L3NwYW4+Jyk7Zy5wdXNoKCIgICA8L2Rp
dj0KPiIpO2cucHVzaCgiPC9kaXY+Iik7Zy5wdXNoKCIiKTtyZXR1cm4gXy50ZW1wbGF0ZShnLmpv
aW4oIiIpKX0sdGVtcGxhdGVBZGRpPQpuZ0RhdGFzZXRzUHJvZ3Jlc3NCYXI6ZnVuY3Rpb24oKXt2
YXIgZz0zRFtdO2cucHVzaCgnPGRpdiBjbGFzcz0zRCJpbXBvcnRfdGU9Cnh0Ij4nKTtnLnB1c2go
IkFkZGluZyBzZWxlY3RlZCBkYXRhc2V0cyB0byBsaWJyYXJ5IGZvbGRlciA8Yj48JT0zRCBfLmVz
Y2FwZT0KKGZvbGRlcl9uYW1lKSAlPjwvYj4iKTtnLnB1c2goIjwvZGl2PiIpO2cucHVzaCgnPGRp
diBjbGFzcz0zRCJwcm9ncmVzcyI+Jyk7PQpnLnB1c2goJyAgIDxkaXYgY2xhc3M9M0QicHJvZ3Jl
c3MtYmFyIHByb2dyZXNzLWJhci1pbXBvcnQiIHJvbGU9M0QicHJvZ3Jlc3M9CmJhciIgYXJpYS12
YWx1ZW5vdz0zRCIwIiBhcmlhLXZhbHVlbWluPTNEIjAiIGFyaWEtdmFsdWVtYXg9M0QiMTAwIiBz
dHlsZT0zRD0KIndpZHRoOiAwMCU7Ij4nKTtnLnB1c2goJyAgICAgICA8c3BhbiBjbGFzcz0zRCJj
b21wbGV0aW9uX3NwYW4iPjAlIENvbXBsZXRlPQo8L3NwYW4+Jyk7Zy5wdXNoKCIgICA8L2Rpdj4i
KTtnLnB1c2goIjwvZGl2PiIpO2cucHVzaCgiIik7cmV0dXJuIF8udGVtcGxhdGU9CihnLmpvaW4o
IiIpKX0sdGVtcGxhdGVEZWxldGluZ0RhdGFzZXRzUHJvZ3Jlc3NCYXI6ZnVuY3Rpb24oKXt2YXIg
Zz0zRFtdO2cucD0KdXNoKCc8ZGl2IGNsYXNzPTNEImltcG9ydF90ZXh0Ij4nKTtnLnB1c2goIjwv
ZGl2PiIpO2cucHVzaCgnPGRpdiBjbGFzcz0zRCJwPQpyb2dyZXNzIj4nKTtnLnB1c2goJyAgIDxk
aXYgY2xhc3M9M0QicHJvZ3Jlc3MtYmFyIHByb2dyZXNzLWJhci1pbXBvcnQiIHJvbGU9Cj0zRCJw
cm9ncmVzc2JhciIgYXJpYS12YWx1ZW5vdz0zRCIwIiBhcmlhLXZhbHVlbWluPTNEIjAiIGFyaWEt
dmFsdWVtYXg9M0QiMT0KMDAiIHN0eWxlPTNEIndpZHRoOiAwMCU7Ij4nKTtnLnB1c2goJyAgICAg
ICA8c3BhbiBjbGFzcz0zRCJjb21wbGV0aW9uX3NwYW4iPQo+MCUgQ29tcGxldGU8L3NwYW4+Jyk7
Zy5wdXNoKCIgICA8L2Rpdj4iKTtnLnB1c2goIjwvZGl2PiIpO2cucHVzaCgiIik7cmV0dXI9Cm4g
Xy50ZW1wbGF0ZShnLmpvaW4oIiIpKX0sdGVtcGxhdGVCcm93c2VyTW9kYWw6ZnVuY3Rpb24oKXt2
YXIgZz0zRFtdO2cucHVzaD0KKCc8ZGl2IGlkPTNEImZpbGVfYnJvd3Nlcl9tb2RhbCI+Jyk7Zy5w
dXNoKCc8ZGl2IGNsYXNzPTNEImFsZXJ0IGFsZXJ0LWluZm8gPQpqc3RyZWUtZmlsZXMtbWVzc2Fn
ZSI+QWxsIGZpbGVzIHlvdSBzZWxlY3Qgd2lsbCBiZSBpbXBvcnRlZCBpbnRvIHRoZSBjdXJyZW49
CnQgZm9sZGVyLjwvZGl2PicpO2cucHVzaCgnPGRpdiBjbGFzcz0zRCJhbGVydCBhbGVydC1pbmZv
IGpzdHJlZS1mb2xkZXJzLW1lcz0Kc2FnZSIgc3R5bGU9M0QiZGlzcGxheTpub25lOyI+QWxsIGZp
bGVzIHdpdGhpbiB0aGUgc2VsZWN0ZWQgZm9sZGVycyBhbmQgdGhlPQppciBzdWJmb2xkZXJzIHdp
bGwgYmUgaW1wb3J0ZWQgaW50byB0aGUgY3VycmVudCBmb2xkZXIuPC9kaXY+Jyk7Zy5wdXNoKCc8
ZGk9CnYgc3R5bGU9M0QibWFyZ2luLWJvdHRvbToxZW07Ij4nKTtnLnB1c2goJzxsYWJlbCBjbGFz
cz0zRCJyYWRpby1pbmxpbmUiPicpOz0KZy5wdXNoKCcgIDxpbnB1dCB0aXRsZT0zRCJTd2l0Y2gg
dG8gc2VsZWN0aW5nIGZpbGVzIiB0eXBlPTNEInJhZGlvIiBuYW1lPTNEPQoianN0cmVlLXJhZGlv
IiB2YWx1ZT0zRCJqc3RyZWUtZGlzYWJsZS1mb2xkZXJzIiBjaGVja2VkPTNEImNoZWNrZWQiPiBG
aWxlcyc9Cik7Zy5wdXNoKCI8L2xhYmVsPiIpO2cucHVzaCgnPGxhYmVsIGNsYXNzPTNEInJhZGlv
LWlubGluZSI+Jyk7Zy5wdXNoKCcgIDxpbj0KcHV0IHRpdGxlPTNEIlN3aXRjaCB0byBzZWxlY3Rp
bmcgZm9sZGVycyIgdHlwZT0zRCJyYWRpbyIgbmFtZT0zRCJqc3RyZWUtcmFkPQppbyIgdmFsdWU9
M0QianN0cmVlLWRpc2FibGUtZmlsZXMiPiBGb2xkZXJzJyk7Zy5wdXNoKCI8L2xhYmVsPiIpO2cu
cHVzaCgiPC89CmRpdj4iKTtnLnB1c2goJzxkaXYgc3R5bGU9M0QibWFyZ2luLWJvdHRvbToxZW07
Ij4nKTtnLnB1c2goJzxsYWJlbCBjbGFzcz0zRD0KImNoZWNrYm94LWlubGluZSBqc3RyZWUtcHJl
c2VydmUtc3RydWN0dXJlIiBzdHlsZT0zRCJkaXNwbGF5Om5vbmU7Ij4nKTtnLnB1PQpzaCgnICAg
PGlucHV0IGNsYXNzPTNEInByZXNlcnZlLWNoZWNrYm94IiB0eXBlPTNEImNoZWNrYm94IiB2YWx1
ZT0zRCJwcmVzZXI9CnZlX2RpcmVjdG9yeV9zdHJ1Y3R1cmUiPicpO2cucHVzaCgiUHJlc2VydmUg
ZGlyZWN0b3J5IHN0cnVjdHVyZSIpO2cucHVzaCgiID0KPC9sYWJlbD4iKTtnLnB1c2goJzxsYWJl
bCBjbGFzcz0zRCJjaGVja2JveC1pbmxpbmUganN0cmVlLWxpbmstZmlsZXMiIHN0eWxlPQo9M0Qi
ZGlzcGxheTpub25lOyI+Jyk7Zy5wdXNoKCcgICA8aW5wdXQgY2xhc3M9M0QibGluay1jaGVja2Jv
eCIgdHlwZT0zRCJjaGU9CmNrYm94IiB2YWx1ZT0zRCJsaW5rX2ZpbGVzIj4nKTtnLnB1c2goIkxp
bmsgZmlsZXMgaW5zdGVhZCBvZiBjb3B5aW5nIik7Zy5wdT0Kc2goIiA8L2xhYmVsPiIpO2cucHVz
aCgiPC9kaXY+Iik7Zy5wdXNoKCc8ZGl2IGlkPTNEImpzdHJlZV9icm93c2VyIj4nKTtnLnB1PQpz
aCgiPC9kaXY+Iik7Zy5wdXNoKCI8aHIgLz4iKTtnLnB1c2goIjxwPllvdSBjYW4gc2V0IGV4dGVu
c2lvbiB0eXBlIGFuZCBnZW49Cm9tZSBmb3IgYWxsIGltcG9ydGVkIGRhdGFzZXRzIGF0IG9uY2U6
PC9wPiIpO2cucHVzaCgiPGRpdj4iKTtnLnB1c2goJ1R5cGU6ID0KPHNwYW4gaWQ9M0QibGlicmFy
eV9leHRlbnNpb25fc2VsZWN0IiBjbGFzcz0zRCJsaWJyYXJ5LWV4dGVuc2lvbi1zZWxlY3QiIC8+
PQonKTtnLnB1c2goJyAgR2Vub21lOiA8c3BhbiBpZD0zRCJsaWJyYXJ5X2dlbm9tZV9zZWxlY3Qi
IGNsYXNzPTNEImxpYnJhcnktZ2U9Cm5vbWUtc2VsZWN0IiAvPicpO2cucHVzaCgiPC9kaXY+Iik7
Zy5wdXNoKCI8L2Rpdj4iKTtyZXR1cm4gXy50ZW1wbGF0ZShnLmpvaT0KbigiIikpfSx0ZW1wbGF0
ZUltcG9ydFBhdGhNb2RhbDpmdW5jdGlvbigpe3ZhciBnPTNEW107Zy5wdXNoKCc8ZGl2IGlkPTNE
ImZpPQpsZV9icm93c2VyX21vZGFsIj4nKTtnLnB1c2goJzxkaXYgY2xhc3M9M0QiYWxlcnQgYWxl
cnQtaW5mbyBqc3RyZWUtZm9sZGVycy09Cm1lc3NhZ2UiPkFsbCBmaWxlcyB3aXRoaW4gdGhlIGdp
dmVuIGZvbGRlcnMgYW5kIHRoZWlyIHN1YmZvbGRlcnMgd2lsbCBiZSBpbT0KcG9ydGVkIGludG8g
dGhlIGN1cnJlbnQgZm9sZGVyLjwvZGl2PicpO2cucHVzaCgnPGRpdiBzdHlsZT0zRCJtYXJnaW4t
Ym90dG9tPQo6IDAuNWVtOyI+Jyk7Zy5wdXNoKCc8bGFiZWwgY2xhc3M9M0QiY2hlY2tib3gtaW5s
aW5lIGpzdHJlZS1wcmVzZXJ2ZS1zdHJ1Y3Q9CnVyZSI+Jyk7Zy5wdXNoKCcgICA8aW5wdXQgY2xh
c3M9M0QicHJlc2VydmUtY2hlY2tib3giIHR5cGU9M0QiY2hlY2tib3giIHZhbD0KdWU9M0QicHJl
c2VydmVfZGlyZWN0b3J5X3N0cnVjdHVyZSI+Jyk7Zy5wdXNoKCJQcmVzZXJ2ZSBkaXJlY3Rvcnkg
c3RydWN0dXJlPQoiKTtnLnB1c2goIiA8L2xhYmVsPiIpO2cucHVzaCgnPGxhYmVsIGNsYXNzPTNE
ImNoZWNrYm94LWlubGluZSBqc3RyZWUtbGluay09CmZpbGVzIj4nKTtnLnB1c2goJyAgIDxpbnB1
dCBjbGFzcz0zRCJsaW5rLWNoZWNrYm94IiB0eXBlPTNEImNoZWNrYm94IiB2YWx1ZT0KPTNEImxp
bmtfZmlsZXMiPicpO2cucHVzaCgiTGluayBmaWxlcyBpbnN0ZWFkIG9mIGNvcHlpbmciKTtnLnB1
c2goIiA8L2xhYmVsPQo+Iik7Zy5wdXNoKCI8L2Rpdj4iKTtnLnB1c2goJzx0ZXh0YXJlYSBpZD0z
RCJpbXBvcnRfcGF0aHMiIGNsYXNzPTNEImZvcm0tY289Cm50cm9sIiByb3dzPTNEIjUiIHBsYWNl
aG9sZGVyPTNEIkFic29sdXRlIHBhdGhzIChvciBwYXRocyByZWxhdGl2ZSB0byBHYWxheD0KeSBy
b290KSBzZXBhcmF0ZWQgYnkgbmV3bGluZSI+PC90ZXh0YXJlYT4nKTtnLnB1c2goIjxociAvPiIp
O2cucHVzaCgiPHA+WW91PQogY2FuIHNldCBleHRlbnNpb24gdHlwZSBhbmQgZ2Vub21lIGZvciBh
bGwgaW1wb3J0ZWQgZGF0YXNldHMgYXQgb25jZTo8L3A+Iik9CjtnLnB1c2goIjxkaXY+Iik7Zy5w
dXNoKCdUeXBlOiA8c3BhbiBpZD0zRCJsaWJyYXJ5X2V4dGVuc2lvbl9zZWxlY3QiIGNsYXNzPQo9
M0QibGlicmFyeS1leHRlbnNpb24tc2VsZWN0IiAvPicpO2cucHVzaCgnICBHZW5vbWU6IDxzcGFu
IGlkPTNEImxpYnJhcnlfZ2U9Cm5vbWVfc2VsZWN0IiBjbGFzcz0zRCJsaWJyYXJ5LWdlbm9tZS1z
ZWxlY3QiIC8+Jyk7Zy5wdXNoKCI8L2Rpdj4iKTtnLnB1c2goIj0KPC9kaXY+Iik7cmV0dXJuIF8u
dGVtcGxhdGUoZy5qb2luKCIiKSl9LHRlbXBsYXRlQWRkRmlsZXNGcm9tSGlzdG9yeTpmdW5jdGlv
PQpuKCl7dmFyIGc9M0RbXTtnLnB1c2goJzxkaXYgaWQ9M0QiYWRkX2ZpbGVzX21vZGFsIj4nKTtn
LnB1c2goJzxkaXYgaWQ9M0QiaGk9CnN0b3J5X21vZGFsX2NvbWJvX2J1bGsiPicpO2cucHVzaCgi
U2VsZWN0IGhpc3Rvcnk6ICAiKTtnLnB1c2goJzxzZWxlY3QgaWQ9Cj0zRCJkYXRhc2V0X2FkZF9i
dWxrIiBuYW1lPTNEImRhdGFzZXRfYWRkX2J1bGsiIHN0eWxlPTNEIndpZHRoOjY2JTsgIj4gJyk7
Zz0KLnB1c2goIiAgIDwlIF8uZWFjaChoaXN0b3JpZXMsIGZ1bmN0aW9uKGhpc3RvcnkpIHsgJT4i
KTtnLnB1c2goJyAgICAgICA8b3B0PQppb24gdmFsdWU9M0QiPCU9M0QgXy5lc2NhcGUoaGlzdG9y
eS5nZXQoImlkIikpICU+Ij48JT0zRCBfLmVzY2FwZShoaXN0b3J5Lmc9CmV0KCJuYW1lIikpICU+
PC9vcHRpb24+Jyk7Zy5wdXNoKCIgICA8JSB9KTsgJT4iKTtnLnB1c2goIjwvc2VsZWN0PiIpO2cu
cHVzaD0KKCI8L2Rpdj4iKTtnLnB1c2goIjxici8+Iik7Zy5wdXNoKCc8ZGl2IGlkPTNEInNlbGVj
dGVkX2hpc3RvcnlfY29udGVudCI+Jyk7PQpnLnB1c2goIjwvZGl2PiIpO2cucHVzaCgiPC9kaXY+
Iik7cmV0dXJuIF8udGVtcGxhdGUoZy5qb2luKCIiKSl9LHRlbXBsYXRlSGk9CnN0b3J5Q29udGVu
dHM6ZnVuY3Rpb24oKXt2YXIgZz0zRFtdO2cucHVzaCgiPHN0cm9uZz5DaG9vc2UgdGhlIGRhdGFz
ZXRzIHRvID0KaW1wb3J0Ojwvc3Ryb25nPiIpO2cucHVzaCgiPHVsPiIpO2cucHVzaCgiIDwlIF8u
ZWFjaChoaXN0b3J5X2NvbnRlbnRzLCBmdW5jPQp0aW9uKGhpc3RvcnlfaXRlbSkgeyAlPiIpO2cu
cHVzaCgnIDxsaSBkYXRhLWlkPTNEIjwlPTNEIF8uZXNjYXBlKGhpc3RvcnlfaXQ9CmVtLmdldCgi
aWQiKSkgJT4iPicpO2cucHVzaCgnICAgPGlucHV0IHN0eWxlPTNEIm1hcmdpbjogMDsiIHR5cGU9
M0QiY2hlY2tibz0KeCI+PCU9M0QgXy5lc2NhcGUoaGlzdG9yeV9pdGVtLmdldCgiaGlkIikpICU+
OiA8JT0zRCBfLmVzY2FwZShoaXN0b3J5X2l0ZW0uPQpnZXQoIm5hbWUiKSkgJT4nKTtnLnB1c2go
IiA8L2xpPiIpO2cucHVzaCgiIDwlIH0pOyAlPiIpO2cucHVzaCgiPC91bD4iKTtyZXQ9CnVybiBf
LnRlbXBsYXRlKGcuam9pbigiIikpfSx0ZW1wbGF0ZVBhZ2luYXRvcjpmdW5jdGlvbigpe3RtcGxf
YXJyYXk9M0RbXTt0bT0KcGxfYXJyYXkucHVzaCgnICAgPHVsIGNsYXNzPTNEInBhZ2luYXRpb24g
cGFnaW5hdGlvbi1zbSI+Jyk7dG1wbF9hcnJheS5wdXNoPQooIiAgICAgICA8JSBpZiAoICggc2hv
d19wYWdlIC0gMSApID4gMCApIHsgJT4iKTt0bXBsX2FycmF5LnB1c2goIiAgICAgICAgICA9CiA8
JSBpZiAoICggc2hvd19wYWdlIC0gMSApID4gcGFnZV9jb3VudCApIHsgJT4iKTt0bXBsX2FycmF5
LnB1c2goJyAgICAgICAgID0KICAgICAgPGxpPjxhIGhyZWY9M0QiI2ZvbGRlcnMvPCU9M0QgaWQg
JT4vcGFnZS8xIj48c3BhbiBjbGFzcz0zRCJmYSBmYS1hbmdsPQplLWRvdWJsZS1sZWZ0Ij48L3Nw
YW4+PC9hPjwvbGk+Jyk7dG1wbF9hcnJheS5wdXNoKCcgICAgICAgICAgICAgICA8bGkgY2xhc3M9
Cj0zRCJkaXNhYmxlZCI+PGEgaHJlZj0zRCIjZm9sZGVycy88JT0zRCBpZCAlPi9wYWdlLzwlIHBy
aW50KCBzaG93X3BhZ2UgKSAlPj0KIj48JSBwcmludCggc2hvd19wYWdlIC0gMSApICU+PC9hPjwv
bGk+Jyk7dG1wbF9hcnJheS5wdXNoKCIgICAgICAgICAgIDwlIH0gPQplbHNlIHsgJT4iKTt0bXBs
X2FycmF5LnB1c2goJyAgICAgICAgICAgICAgIDxsaT48YSBocmVmPTNEIiNmb2xkZXJzLzwlPTNE
IGk9CmQgJT4vcGFnZS8xIj48c3BhbiBjbGFzcz0zRCJmYSBmYS1hbmdsZS1kb3VibGUtbGVmdCI+
PC9zcGFuPjwvYT48L2xpPicpO3RtcD0KbF9hcnJheS5wdXNoKCcgICAgICAgICAgICAgICA8bGk+
PGEgaHJlZj0zRCIjZm9sZGVycy88JT0zRCBpZCAlPi9wYWdlLzwlIHByPQppbnQoIHNob3dfcGFn
ZSAtIDEgKSAlPiI+PCUgcHJpbnQoIHNob3dfcGFnZSAtIDEgKSAlPjwvYT48L2xpPicpO3RtcGxf
YXJyYXk9Ci5wdXNoKCIgICAgICAgICAgIDwlIH0gJT4iKTt0bXBsX2FycmF5LnB1c2goIiAgICAg
ICA8JSB9IGVsc2UgeyAlPiIpO3RtcGxfYT0KcnJheS5wdXNoKCcgICAgICAgICAgIDxsaSBjbGFz
cz0zRCJkaXNhYmxlZCI+PGEgaHJlZj0zRCIjZm9sZGVycy88JT0zRCBpZCAlPQo+L3BhZ2UvMSI+
PHNwYW4gY2xhc3M9M0QiZmEgZmEtYW5nbGUtZG91YmxlLWxlZnQiPjwvc3Bhbj48L2E+PC9saT4n
KTt0bXBsX2E9CnJyYXkucHVzaCgnICAgICAgICAgICA8bGkgY2xhc3M9M0QiZGlzYWJsZWQiPjxh
IGhyZWY9M0QiI2ZvbGRlcnMvPCU9M0QgaWQgJT0KPi9wYWdlLzwlIHByaW50KCBzaG93X3BhZ2Ug
KSAlPiI+PCUgcHJpbnQoIHNob3dfcGFnZSAtIDEgKSAlPjwvYT48L2xpPicpO3RtPQpwbF9hcnJh
eS5wdXNoKCIgICAgICAgPCUgfSAlPiIpO3RtcGxfYXJyYXkucHVzaCgnICAgICAgIDxsaSBjbGFz
cz0zRCJhY3RpdmU9CiI+Jyk7dG1wbF9hcnJheS5wdXNoKCcgICAgICAgPGEgaHJlZj0zRCIjZm9s
ZGVycy88JT0zRCBpZCAlPi9wYWdlLzwlIHByaW50KD0KIHNob3dfcGFnZSApICU+Ij48JSBwcmlu
dCggc2hvd19wYWdlICkgJT48L2E+Jyk7dG1wbF9hcnJheS5wdXNoKCIgICAgICAgPC9sPQppPiIp
O3RtcGxfYXJyYXkucHVzaCgiICAgICAgIDwlIGlmICggKCBzaG93X3BhZ2UgKSA8IHBhZ2VfY291
bnQgKSB7ICU+Iik7dG09CnBsX2FycmF5LnB1c2goJyAgICAgICAgICAgPGxpPjxhIGhyZWY9M0Qi
I2ZvbGRlcnMvPCU9M0QgaWQgJT4vcGFnZS88JSBwcmludD0KKCBzaG93X3BhZ2UgKyAxICkgJT4i
PjwlIHByaW50KCBzaG93X3BhZ2UgKyAxICkgJT48L2E+PC9saT4nKTt0bXBsX2FycmF5LnB1PQpz
aCgnICAgICAgICAgICA8bGk+PGEgaHJlZj0zRCIjZm9sZGVycy88JT0zRCBpZCAlPi9wYWdlLzwl
IHByaW50KCBwYWdlX2NvdW49CnQgKSAlPiI+PHNwYW4gY2xhc3M9M0QiZmEgZmEtYW5nbGUtZG91
YmxlLXJpZ2h0Ij48L3NwYW4+PC9hPjwvbGk+Jyk7dG1wbF9hcj0KcmF5LnB1c2goIiAgICAgICA8
JSB9IGVsc2UgeyAlPiIpO3RtcGxfYXJyYXkucHVzaCgnICAgICAgICAgICA8bGkgY2xhc3M9M0Qi
PQpkaXNhYmxlZCI+PGEgaHJlZj0zRCIjZm9sZGVycy88JT0zRCBpZCAlPi9wYWdlLzwlIHByaW50
KCBzaG93X3BhZ2UgICkgJT4iPjw9CiUgcHJpbnQoIHNob3dfcGFnZSArIDEgKSAlPjwvYT48L2xp
PicpO3RtcGxfYXJyYXkucHVzaCgnICAgICAgICAgICA8bGkgY2xhcz0Kcz0zRCJkaXNhYmxlZCI+
PGEgaHJlZj0zRCIjZm9sZGVycy88JT0zRCBpZCAlPi9wYWdlLzwlIHByaW50KCBwYWdlX2NvdW50
ICkgPQolPiI+PHNwYW4gY2xhc3M9M0QiZmEgZmEtYW5nbGUtZG91YmxlLXJpZ2h0Ij48L3NwYW4+
PC9hPjwvbGk+Jyk7dG1wbF9hcnJheS49CnB1c2goIiAgICAgICA8JSB9ICU+Iik7dG1wbF9hcnJh
eS5wdXNoKCIgICA8L3VsPiIpO3RtcGxfYXJyYXkucHVzaCgiICAgPHNwYT0Kbj4iKTt0bXBsX2Fy
cmF5LnB1c2goJyAgICAgICBzaG93aW5nIDxhIGRhdGEtdG9nZ2xlPTNEInRvb2x0aXAiIGRhdGEt
cGxhY2VtPQplbnQ9M0QidG9wIiB0aXRsZT0zRCJDbGljayB0byBjaGFuZ2UgdGhlIG51bWJlciBv
ZiBpdGVtcyBvbiBwYWdlIiBpZD0zRCJwYWc9CmVfc2l6ZV9wcm9tcHQiPjwlLSBpdGVtc19zaG93
biAlPjwvYT4gb2YgPCUtIHRvdGFsX2l0ZW1zX2NvdW50ICU+IGl0ZW1zJyk7dD0KbXBsX2FycmF5
LnB1c2goIiAgIDwvc3Bhbj4iKTtyZXR1cm4gXy50ZW1wbGF0ZSh0bXBsX2FycmF5LmpvaW4oIiIp
KX0sfSk7cmV0PQp1cm57Rm9sZGVyVG9vbGJhclZpZXc6Yn19KTsKXCBObyBuZXdsaW5lIGF0IGVu
ZCBvZiBmaWxlCitkZWZpbmUoWyJnYWxheHkubWFzdGhlYWQiLCJ1dGlscy91dGlscyIsImxpYnMv
dG9hc3RyIiwibXZjL2xpYnJhcnkvbGlicmFyeT0KLW1vZGVsIiwibXZjL3VpL3VpLXNlbGVjdCJd
LGZ1bmN0aW9uKGMsZSxmLGQsYSl7dmFyIGI9M0RCYWNrYm9uZS5WaWV3LmV4dGVuPQpkKHtlbDoi
I2NlbnRlciIsZXZlbnRzOnsiY2xpY2sgI3Rvb2xidG5fY3JlYXRlX2ZvbGRlciI6ImNyZWF0ZUZv
bGRlckZyb21Nb2Q9CmFsIiwiY2xpY2sgI3Rvb2xidG5fYnVsa19pbXBvcnQiOiJtb2RhbEJ1bGtJ
bXBvcnQiLCJjbGljayAjaW5jbHVkZV9kZWxldGVkXz0KZGF0YXNldHNfY2hrIjoiY2hlY2tJbmNs
dWRlRGVsZXRlZCIsImNsaWNrICN0b29sYnRuX3Nob3dfbGliaW5mbyI6InNob3dMaWJJPQpuZm8i
LCJjbGljayAjdG9vbGJ0bl9idWxrX2RlbGV0ZSI6ImRlbGV0ZVNlbGVjdGVkRGF0YXNldHMiLCJj
bGljayAjcGFnZV9zaXo9CmVfcHJvbXB0Ijoic2hvd1BhZ2VTaXplUHJvbXB0In0sZGVmYXVsdHM6
e2Nhbl9hZGRfbGlicmFyeV9pdGVtOmZhbHNlLGNvbnRhaT0KbnNfZmlsZTpmYWxzZSxjaGFpbl9j
YWxsX2NvbnRyb2w6e3RvdGFsX251bWJlcjowLGZhaWxlZF9udW1iZXI6MH0sZGlzYWJsZWRfPQpq
c3RyZWVfZWxlbWVudDoiZm9sZGVycyJ9LG1vZGFsOm51bGwsanN0cmVlOm51bGwsaGlzdG9yaWVz
Om51bGwsc2VsZWN0X2dlbm89Cm1lOm51bGwsc2VsZWN0X2V4dGVuc2lvbjpudWxsLGxpc3RfZXh0
ZW5zaW9uczpbXSxhdXRvOntpZDoiYXV0byIsdGV4dDoiQXV0bz0KLWRldGVjdCIsZGVzY3JpcHRp
b246IlRoaXMgc3lzdGVtIHdpbGwgdHJ5IHRvIGRldGVjdCB0aGUgZmlsZSB0eXBlIGF1dG9tYXRp
PQpjYWxseS4gSWYgeW91ciBmaWxlIGlzIG5vdCBkZXRlY3RlZCBwcm9wZXJseSBhcyBvbmUgb2Yg
dGhlIGtub3duIGZvcm1hdHMsIGk9CnQgbW9zdCBsaWtlbHkgbWVhbnMgdGhhdCBpdCBoYXMgc29t
ZSBmb3JtYXQgcHJvYmxlbXMgKGUuZy4sIGRpZmZlcmVudCBudW1iZT0KciBvZiBjb2x1bW5zIG9u
IGRpZmZlcmVudCByb3dzKS4gWW91IGNhbiBzdGlsbCBjb2VyY2UgdGhlIHN5c3RlbSB0byBzZXQg
eW91PQpyIGRhdGEgdG8gdGhlIGZvcm1hdCB5b3UgdGhpbmsgaXQgc2hvdWxkIGJlLiBZb3UgY2Fu
IGFsc28gdXBsb2FkIGNvbXByZXNzZWQ9CiBmaWxlcywgd2hpY2ggd2lsbCBhdXRvbWF0aWNhbGx5
IGJlIGRlY29tcHJlc3NlZC4ifSxsaXN0X2dlbm9tZXM6W10saW5pdGlhbD0KaXplOmZ1bmN0aW9u
KGcpe3RoaXMub3B0aW9ucz0zRF8uZGVmYXVsdHMoZ3x8e30sdGhpcy5kZWZhdWx0cyk7dGhpcy5m
ZXRjaEV4PQp0QW5kR2Vub21lcygpO3RoaXMucmVuZGVyKCl9LHJlbmRlcjpmdW5jdGlvbihnKXt0
aGlzLm9wdGlvbnM9M0RfLmV4dGVuZCh0aGk9CnMub3B0aW9ucyxnKTt2YXIgaT0zRHRoaXMudGVt
cGxhdGVUb29sQmFyKCk7dmFyIGg9M0R7aWQ6dGhpcy5vcHRpb25zLmlkLGlzXz0KYWRtaW46ZmFs
c2UsaXNfYW5vbnltOnRydWUsbXV0aXBsZV9hZGRfZGF0YXNldF9vcHRpb25zOmZhbHNlfTtpZihH
YWxheHkuY3VyPQpyVXNlcil7aC5pc19hZG1pbj0zREdhbGF4eS5jdXJyVXNlci5pc0FkbWluKCk7
aC5pc19hbm9ueW09M0RHYWxheHkuY3VyclVzZXI9Ci5pc0Fub255bW91cygpO2lmKEdhbGF4eS5j
b25maWcudXNlcl9saWJyYXJ5X2ltcG9ydF9kaXIhPTNEPTNEbnVsbHx8R2FsYXh5Lj0KY29uZmln
LmFsbG93X2xpYnJhcnlfcGF0aF9wYXN0ZSE9M0Q9M0RmYWxzZXx8R2FsYXh5LmNvbmZpZy5saWJy
YXJ5X2ltcG9ydF9kPQppciE9M0Q9M0RudWxsKXtoLm11dGlwbGVfYWRkX2RhdGFzZXRfb3B0aW9u
cz0zRHRydWV9fXRoaXMuJGVsLmh0bWwoaShoKSl9LHI9CmVuZGVyUGFnaW5hdG9yOmZ1bmN0aW9u
KGgpe3RoaXMub3B0aW9ucz0zRF8uZXh0ZW5kKHRoaXMub3B0aW9ucyxoKTt2YXIgZz0zRD0KdGhp
cy50ZW1wbGF0ZVBhZ2luYXRvcigpO3RoaXMuJGVsLmZpbmQoIiNmb2xkZXJfcGFnaW5hdG9yIiku
aHRtbChnKHtpZDp0aGlzPQoub3B0aW9ucy5pZCxzaG93X3BhZ2U6cGFyc2VJbnQodGhpcy5vcHRp
b25zLnNob3dfcGFnZSkscGFnZV9jb3VudDpwYXJzZUludCg9CnRoaXMub3B0aW9ucy5wYWdlX2Nv
dW50KSx0b3RhbF9pdGVtc19jb3VudDp0aGlzLm9wdGlvbnMudG90YWxfaXRlbXNfY291bnQsaT0K
dGVtc19zaG93bjp0aGlzLm9wdGlvbnMuaXRlbXNfc2hvd259KSl9LGNvbmZpZ3VyZUVsZW1lbnRz
OmZ1bmN0aW9uKGcpe3RoaXMuPQpvcHRpb25zPTNEXy5leHRlbmQodGhpcy5vcHRpb25zLGcpO2lm
KHRoaXMub3B0aW9ucy5jYW5fYWRkX2xpYnJhcnlfaXRlbT0zRD0KPTNEPTNEdHJ1ZSl7JCgiLmFk
ZC1saWJyYXJ5LWl0ZW1zIikuc2hvdygpfWVsc2V7JCgiLmFkZC1saWJyYXJ5LWl0ZW1zIikuaGlk
PQplKCl9aWYodGhpcy5vcHRpb25zLmNvbnRhaW5zX2ZpbGU9M0Q9M0Q9M0R0cnVlKXtpZihHYWxh
eHkuY3VyclVzZXIpe2lmKCFHYWw9CmF4eS5jdXJyVXNlci5pc0Fub255bW91cygpKXskKCIubG9n
Z2VkLWRhdGFzZXQtbWFuaXB1bGF0aW9uIikuc2hvdygpOyQoIi5kYT0KdGFzZXQtbWFuaXB1bGF0
aW9uIikuc2hvdygpfWVsc2V7JCgiLmRhdGFzZXQtbWFuaXB1bGF0aW9uIikuc2hvdygpOyQoIi5s
b2dnPQplZC1kYXRhc2V0LW1hbmlwdWxhdGlvbiIpLmhpZGUoKX19ZWxzZXskKCIubG9nZ2VkLWRh
dGFzZXQtbWFuaXB1bGF0aW9uIikuaGk9CmRlKCk7JCgiLmRhdGFzZXQtbWFuaXB1bGF0aW9uIiku
aGlkZSgpfX1lbHNleyQoIi5sb2dnZWQtZGF0YXNldC1tYW5pcHVsYXRpbz0KbiIpLmhpZGUoKTsk
KCIuZGF0YXNldC1tYW5pcHVsYXRpb24iKS5oaWRlKCl9dGhpcy4kZWwuZmluZCgiW2RhdGEtdG9n
Z2xlXSIpPQoudG9vbHRpcCgpfSxjcmVhdGVGb2xkZXJGcm9tTW9kYWw6ZnVuY3Rpb24oaSl7aS5w
cmV2ZW50RGVmYXVsdCgpO2kuc3RvcFByb3A9CmFnYXRpb24oKTt2YXIgZz0zRHRoaXM7dmFyIGg9
M0R0aGlzLnRlbXBsYXRlTmV3Rm9sZGVySW5Nb2RhbCgpO3RoaXMubW9kYWw9Cj0zREdhbGF4eS5t
b2RhbDt0aGlzLm1vZGFsLnNob3coe2Nsb3NpbmdfZXZlbnRzOnRydWUsdGl0bGU6IkNyZWF0ZSBO
ZXcgRm9sZD0KZXIiLGJvZHk6aCgpLGJ1dHRvbnM6e0NyZWF0ZTpmdW5jdGlvbigpe2cuY3JlYXRl
X25ld19mb2xkZXJfZXZlbnQoKX0sQ2xvc2U6PQpmdW5jdGlvbigpe0dhbGF4eS5tb2RhbC5oaWRl
KCl9fX0pfSxjcmVhdGVfbmV3X2ZvbGRlcl9ldmVudDpmdW5jdGlvbigpe3ZhciA9Cmc9M0R0aGlz
LnNlcmlhbGl6ZV9uZXdfZm9sZGVyKCk7aWYodGhpcy52YWxpZGF0ZV9uZXdfZm9sZGVyKGcpKXt2
YXIgaD0zRG5ldz0KIGQuRm9sZGVyQXNNb2RlbCgpO3VybF9pdGVtcz0zREJhY2tib25lLmhpc3Rv
cnkuZnJhZ21lbnQuc3BsaXQoIi8iKTtjdXJyZW50PQpfZm9sZGVyX2lkPTNEdXJsX2l0ZW1zW3Vy
bF9pdGVtcy5sZW5ndGgtMV07aC51cmw9M0RoLnVybFJvb3QrIi8iK2N1cnJlbnRfZm89CmxkZXJf
aWQ7aC5zYXZlKGcse3N1Y2Nlc3M6ZnVuY3Rpb24oaSl7R2FsYXh5Lm1vZGFsLmhpZGUoKTtmLnN1
Y2Nlc3MoIkZvbGRlcj0KIGNyZWF0ZWQuIik7aS5zZXQoe3R5cGU6ImZvbGRlciJ9KTtHYWxheHku
bGlicmFyaWVzLmZvbGRlckxpc3RWaWV3LmNvbGxlY3RpPQpvbi5hZGQoaSl9LGVycm9yOmZ1bmN0
aW9uKGosaSl7R2FsYXh5Lm1vZGFsLmhpZGUoKTtpZih0eXBlb2YgaS5yZXNwb25zZUpTT049CiE9
M0Q9M0QidW5kZWZpbmVkIil7Zi5lcnJvcihpLnJlc3BvbnNlSlNPTi5lcnJfbXNnKX1lbHNle2Yu
ZXJyb3IoIkFuIGVycm9yID0Kb2N1cnJlZC4iKX19fSl9ZWxzZXtmLmVycm9yKCJGb2xkZXIncyBu
YW1lIGlzIG1pc3NpbmcuIil9cmV0dXJuIGZhbHNlfSxzZXJpPQphbGl6ZV9uZXdfZm9sZGVyOmZ1
bmN0aW9uKCl7cmV0dXJue25hbWU6JCgiaW5wdXRbbmFtZT0zRCdOYW1lJ10iKS52YWwoKSxkZXM9
CmNyaXB0aW9uOiQoImlucHV0W25hbWU9M0QnRGVzY3JpcHRpb24nXSIpLnZhbCgpfX0sdmFsaWRh
dGVfbmV3X2ZvbGRlcjpmdW5jdD0KaW9uKGcpe3JldHVybiBnLm5hbWUhPTNEPTNEIiJ9LG1vZGFs
QnVsa0ltcG9ydDpmdW5jdGlvbigpe3ZhciBnPTNEJCgiI2ZvbGRlPQpyX3RhYmxlIikuZmluZCgi
OmNoZWNrZWQiKTtpZihnLmxlbmd0aD0zRD0zRD0zRDApe2YuaW5mbygiWW91IG11c3Qgc2VsZWN0
IHM9Cm9tZSBkYXRhc2V0cyBmaXJzdC4iKX1lbHNle3RoaXMucmVmcmVzaFVzZXJIaXN0b3JpZXNM
aXN0KGZ1bmN0aW9uKGkpe3ZhciBoPQo9M0RpLnRlbXBsYXRlQnVsa0ltcG9ydEluTW9kYWwoKTtp
Lm1vZGFsPTNER2FsYXh5Lm1vZGFsO2kubW9kYWwuc2hvdyh7Y2xvc2k9Cm5nX2V2ZW50czp0cnVl
LHRpdGxlOiJJbXBvcnQgaW50byBIaXN0b3J5Iixib2R5Omgoe2hpc3RvcmllczppLmhpc3Rvcmll
cy5tbz0KZGVsc30pLGJ1dHRvbnM6e0ltcG9ydDpmdW5jdGlvbigpe2kuaW1wb3J0QWxsSW50b0hp
c3RvcnkoKX0sQ2xvc2U6ZnVuY3Rpb24oPQope0dhbGF4eS5tb2RhbC5oaWRlKCl9fX0pfSl9fSxy
ZWZyZXNoVXNlckhpc3Rvcmllc0xpc3Q6ZnVuY3Rpb24oaCl7dmFyIGc9M0Q9CnRoaXM7dGhpcy5o
aXN0b3JpZXM9M0RuZXcgZC5HYWxheHlIaXN0b3JpZXMoKTt0aGlzLmhpc3Rvcmllcy5mZXRjaCh7
c3VjY2Vzcz0KOmZ1bmN0aW9uKCl7aChnKX0sZXJyb3I6ZnVuY3Rpb24oaixpKXtpZih0eXBlb2Yg
aS5yZXNwb25zZUpTT04hPTNEPTNEInVuZGVmPQppbmVkIil7Zi5lcnJvcihpLnJlc3BvbnNlSlNP
Ti5lcnJfbXNnKX1lbHNle2YuZXJyb3IoIkFuIGVycm9yIG9jdXJyZWQuIil9fX09Cil9LGltcG9y
dEFsbEludG9IaXN0b3J5OmZ1bmN0aW9uKCl7dGhpcy5tb2RhbC5kaXNhYmxlQnV0dG9uKCJJbXBv
cnQiKTt2YXIgaz0KPTNEJCgic2VsZWN0W25hbWU9M0RkYXRhc2V0X2ltcG9ydF9idWxrXSBvcHRp
b246c2VsZWN0ZWQiKS52YWwoKTt2YXIgbj0zRCQoPQoic2VsZWN0W25hbWU9M0RkYXRhc2V0X2lt
cG9ydF9idWxrXSBvcHRpb246c2VsZWN0ZWQiKS50ZXh0KCk7dGhpcy5vcHRpb25zLmw9CmFzdF91
c2VkX2hpc3RvcnlfaWQ9M0RrO3ZhciBoPTNEW107JCgiI2ZvbGRlcl90YWJsZSIpLmZpbmQoIjpj
aGVja2VkIikuZWFjaD0KKGZ1bmN0aW9uKCl7aWYodGhpcy5wYXJlbnRFbGVtZW50LnBhcmVudEVs
ZW1lbnQuaWQhPTNEPTNEIiIpe2gucHVzaCh0aGlzLnBhPQpyZW50RWxlbWVudC5wYXJlbnRFbGVt
ZW50LmlkKX19KTt2YXIgbT0zRFtdO2Zvcih2YXIgaj0zRGgubGVuZ3RoLTE7aj49M0QwO2o9Ci0t
KXt2YXIgZz0zRGhbal07dmFyIGw9M0RuZXcgZC5IaXN0b3J5SXRlbSgpO2wudXJsPTNEbC51cmxS
b290K2srIi9jb250ZW50cz0KIjtsLmNvbnRlbnQ9M0RnO2wuc291cmNlPTNEImxpYnJhcnkiO20u
cHVzaChsKX10aGlzLmluaXRDaGFpbkNhbGxDb250cm9sKHtsPQplbmd0aDptLmxlbmd0aCxhY3Rp
b246InRvX2hpc3RvcnkiLGhpc3RvcnlfbmFtZTpufSk7alF1ZXJ5LmdldEpTT04oZ2FsYXh5X2M9
Cm9uZmlnLnJvb3QrImhpc3Rvcnkvc2V0X2FzX2N1cnJlbnQ/aWQ9M0QiK2spO3RoaXMuY2hhaW5D
YWxsSW1wb3J0aW5nSW50b0hpcz0KdG9yeShtLG4pfSx1cGRhdGVQcm9ncmVzczpmdW5jdGlvbigp
e3RoaXMucHJvZ3Jlc3MrPTNEdGhpcy5wcm9ncmVzc1N0ZXA7JCgiPQoucHJvZ3Jlc3MtYmFyLWlt
cG9ydCIpLndpZHRoKE1hdGgucm91bmQodGhpcy5wcm9ncmVzcykrIiUiKTt0eHRfcmVwcmVzZW50
YXQ9Cmlvbj0zRE1hdGgucm91bmQodGhpcy5wcm9ncmVzcykrIiUgQ29tcGxldGUiOyQoIi5jb21w
bGV0aW9uX3NwYW4iKS50ZXh0KHR4dD0KX3JlcHJlc2VudGF0aW9uKX0sZG93bmxvYWQ6ZnVuY3Rp
b24oZyxrKXt2YXIgaT0zRFtdOyQoIiNmb2xkZXJfdGFibGUiKS5maW5kPQooIjpjaGVja2VkIiku
ZWFjaChmdW5jdGlvbigpe2lmKHRoaXMucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmlkIT0z
RD0zRCI9CiIpe2kucHVzaCh0aGlzLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5pZCl9fSk7
dmFyIGg9M0Qod2luZG93LmdhbGF4eV9jbz0KbmZpZz9nYWxheHlfY29uZmlnLnJvb3Q6Ii8iKSsi
YXBpL2xpYnJhcmllcy9kYXRhc2V0cy9kb3dubG9hZC8iK2s7dmFyIGo9M0R7PQpsZF9pZHM6aX07
dGhpcy5wcm9jZXNzRG93bmxvYWQoaCxqLCJnZXQiKX0scHJvY2Vzc0Rvd25sb2FkOmZ1bmN0aW9u
KGgsaSxqKXs9CmlmKGgmJmkpe2k9M0R0eXBlb2YgaT0zRD0zRD0zRCJzdHJpbmciP2k6JC5wYXJh
bShpKTt2YXIgZz0zRCIiOyQuZWFjaChpLnNwbD0KaXQoIiYiKSxmdW5jdGlvbigpe3ZhciBrPTNE
dGhpcy5zcGxpdCgiPTNEIik7Zys9M0QnPGlucHV0IHR5cGU9M0QiaGlkZGVuIiBuPQphbWU9M0Qi
JytrWzBdKyciIHZhbHVlPTNEIicra1sxXSsnIiAvPid9KTskKCc8Zm9ybSBhY3Rpb249M0QiJyto
KyciIG1ldGhvZD0KPTNEIicrKGp8fCJwb3N0IikrJyI+JytnKyI8L2Zvcm0+IikuYXBwZW5kVG8o
ImJvZHkiKS5zdWJtaXQoKS5yZW1vdmUoKTtmLmluPQpmbygiWW91ciBkb3dubG9hZCB3aWxsIGJl
Z2luIHNvb24uIil9ZWxzZXtmLmVycm9yKCJBbiBlcnJvciBvY2N1cnJlZC4iKX19LGE9CmRkRmls
ZXNGcm9tSGlzdG9yeU1vZGFsOmZ1bmN0aW9uKCl7dGhpcy5yZWZyZXNoVXNlckhpc3Rvcmllc0xp
c3QoZnVuY3Rpb24oZz0KKXtnLm1vZGFsPTNER2FsYXh5Lm1vZGFsO3ZhciBoPTNEZy50ZW1wbGF0
ZUFkZEZpbGVzRnJvbUhpc3RvcnkoKTt2YXIgaT0zRGcuPQpvcHRpb25zLmZ1bGxfcGF0aFtnLm9w
dGlvbnMuZnVsbF9wYXRoLmxlbmd0aC0xXVsxXTtnLm1vZGFsLnNob3coe2Nsb3NpbmdfZXY9CmVu
dHM6dHJ1ZSx0aXRsZToiQWRkaW5nIGRhdGFzZXRzIGZyb20geW91ciBoaXN0b3J5IHRvIGZvbGRl
ciAiK2ksYm9keTpoKHtoaT0Kc3RvcmllczpnLmhpc3Rvcmllcy5tb2RlbHN9KSxidXR0b25zOntB
ZGQ6ZnVuY3Rpb24oKXtnLmFkZEFsbERhdGFzZXRzRnJvbUhpPQpzdG9yeSgpfSxDbG9zZTpmdW5j
dGlvbigpe0dhbGF4eS5tb2RhbC5oaWRlKCl9fSxjbG9zaW5nX2NhbGxiYWNrOmZ1bmN0aW9uKCk9
CntHYWxheHkubGlicmFyaWVzLmxpYnJhcnlfcm91dGVyLmJhY2soKX19KTtpZihnLmhpc3Rvcmll
cy5tb2RlbHMubGVuZ3RoPjApez0KZy5mZXRjaEFuZERpc3BsYXlIaXN0b3J5Q29udGVudHMoZy5o
aXN0b3JpZXMubW9kZWxzWzBdLmlkKTskKCIjZGF0YXNldF9hZGRfPQpidWxrIikuY2hhbmdlKGZ1
bmN0aW9uKGope2cuZmV0Y2hBbmREaXNwbGF5SGlzdG9yeUNvbnRlbnRzKGoudGFyZ2V0LnZhbHVl
KX09Cil9ZWxzZXtmLmVycm9yKCJBbiBlcnJvciBvY3VycmVkLiIpfX0pfSxpbXBvcnRGaWxlc0Zy
b21QYXRoTW9kYWw6ZnVuY3Rpb24oKT0Ke3ZhciBoPTNEdGhpczt0aGlzLm1vZGFsPTNER2FsYXh5
Lm1vZGFsO3ZhciBnPTNEdGhpcy50ZW1wbGF0ZUltcG9ydFBhdGhNb2RhPQpsKCk7dGhpcy5tb2Rh
bC5zaG93KHtjbG9zaW5nX2V2ZW50czp0cnVlLHRpdGxlOiJQbGVhc2UgZW50ZXIgcGF0aHMgdG8g
aW1wb3I9CnQiLGJvZHk6Zyh7fSksYnV0dG9uczp7SW1wb3J0OmZ1bmN0aW9uKCl7aC5pbXBvcnRG
cm9tUGF0aHNDbGlja2VkKGgpfSxDbG9zZT0KOmZ1bmN0aW9uKCl7R2FsYXh5Lm1vZGFsLmhpZGUo
KX19LGNsb3NpbmdfY2FsbGJhY2s6ZnVuY3Rpb24oKXtHYWxheHkubGlicmFyPQppZXMubGlicmFy
eV9yb3V0ZXIubmF2aWdhdGUoImZvbGRlcnMvIitoLmlkLHt0cmlnZ2VyOnRydWV9KX19KTt0aGlz
LnJlbmRlclM9CmVsZWN0Qm94ZXMoKX0sZmV0Y2hFeHRBbmRHZW5vbWVzOmZ1bmN0aW9uKCl7dmFy
IGc9M0R0aGlzO2UuZ2V0KHt1cmw6KHdpbmRvdz0KLmdhbGF4eV9jb25maWc/Z2FsYXh5X2NvbmZp
Zy5yb290OiIvIikrImFwaS9kYXRhdHlwZXM/ZXh0ZW5zaW9uX29ubHk9M0RGYWxzPQplIixzdWNj
ZXNzOmZ1bmN0aW9uKGgpe2ZvcihrZXkgaW4gaCl7Zy5saXN0X2V4dGVuc2lvbnMucHVzaCh7aWQ6
aFtrZXldLmV4dGU9Cm5zaW9uLHRleHQ6aFtrZXldLmV4dGVuc2lvbixkZXNjcmlwdGlvbjpoW2tl
eV0uZGVzY3JpcHRpb24sZGVzY3JpcHRpb25fdXJsOj0KaFtrZXldLmRlc2NyaXB0aW9uX3VybH0p
fWcubGlzdF9leHRlbnNpb25zLnNvcnQoZnVuY3Rpb24oaixpKXtyZXR1cm4gai5pZD5pPQouaWQ/
MTpqLmlkPGkuaWQ/LTE6MH0pO2cubGlzdF9leHRlbnNpb25zLnVuc2hpZnQoZy5hdXRvKX19KTtl
LmdldCh7dXJsOih3aW49CmRvdy5nYWxheHlfY29uZmlnP2dhbGF4eV9jb25maWcucm9vdDoiLyIp
KyJhcGkvZ2Vub21lcyIsc3VjY2VzczpmdW5jdGlvbihoKT0Ke2ZvcihrZXkgaW4gaCl7Zy5saXN0
X2dlbm9tZXMucHVzaCh7aWQ6aFtrZXldWzFdLHRleHQ6aFtrZXldWzBdfSl9Zy5saXN0X2dlPQpu
b21lcy5zb3J0KGZ1bmN0aW9uKGosaSl7cmV0dXJuIGouaWQ+aS5pZD8xOmouaWQ8aS5pZD8tMTow
fSl9fSl9LHJlbmRlclNlbGU9CmN0Qm94ZXM6ZnVuY3Rpb24oKXt2YXIgZz0zRHRoaXM7dGhpcy5z
ZWxlY3RfZ2Vub21lPTNEbmV3IGEuVmlldyh7Y3NzOiJsaWJyYT0KcnktZ2Vub21lLXNlbGVjdCIs
ZGF0YTpnLmxpc3RfZ2Vub21lcyxjb250YWluZXI6R2FsYXh5Lm1vZGFsLiRlbC5maW5kKCIjbGli
PQpyYXJ5X2dlbm9tZV9zZWxlY3QiKSx2YWx1ZToiPyJ9KTt0aGlzLnNlbGVjdF9leHRlbnNpb249
M0RuZXcgYS5WaWV3KHtjc3M6Imw9CmlicmFyeS1leHRlbnNpb24tc2VsZWN0IixkYXRhOmcubGlz
dF9leHRlbnNpb25zLGNvbnRhaW5lcjpHYWxheHkubW9kYWwuJGVsLj0KZmluZCgiI2xpYnJhcnlf
ZXh0ZW5zaW9uX3NlbGVjdCIpLHZhbHVlOiJhdXRvIn0pfSxpbXBvcnRGaWxlc0Zyb21HYWxheHlG
b2xkPQplck1vZGFsOmZ1bmN0aW9uKGcpe3ZhciBpPTNEdGhpczt2YXIgaD0zRHRoaXMudGVtcGxh
dGVCcm93c2VyTW9kYWwoKTt0aGlzLm09Cm9kYWw9M0RHYWxheHkubW9kYWw7dGhpcy5tb2RhbC5z
aG93KHtjbG9zaW5nX2V2ZW50czp0cnVlLHRpdGxlOiJQbGVhc2Ugc2VsZT0KY3QgZm9sZGVycyBv
ciBmaWxlcyIsYm9keTpoKHt9KSxidXR0b25zOntJbXBvcnQ6ZnVuY3Rpb24oKXtpLmltcG9ydEZy
b21Kc3RyPQplZVBhdGgoaSxnKX0sQ2xvc2U6ZnVuY3Rpb24oKXtHYWxheHkubW9kYWwuaGlkZSgp
fX0sY2xvc2luZ19jYWxsYmFjazpmdW5jdGk9Cm9uKCl7R2FsYXh5LmxpYnJhcmllcy5saWJyYXJ5
X3JvdXRlci5uYXZpZ2F0ZSgiZm9sZGVycy8iK2kuaWQse3RyaWdnZXI6dHJ1ZT0KfSl9fSk7dGhp
cy5yZW5kZXJTZWxlY3RCb3hlcygpO2cuZGlzYWJsZWRfanN0cmVlX2VsZW1lbnQ9M0QiZm9sZGVy
cyI7dGhpcy5yPQplbmRlckpzdHJlZShnKTskKCJpbnB1dFt0eXBlPTNEcmFkaW9dIikuY2hhbmdl
KGZ1bmN0aW9uKGope2lmKGoudGFyZ2V0LnZhbHU9CmU9M0Q9M0Q9M0QianN0cmVlLWRpc2FibGUt
Zm9sZGVycyIpe2cuZGlzYWJsZWRfanN0cmVlX2VsZW1lbnQ9M0QiZm9sZGVycyI7aT0KLnJlbmRl
ckpzdHJlZShnKTskKCIuanN0cmVlLWZvbGRlcnMtbWVzc2FnZSIpLmhpZGUoKTskKCIuanN0cmVl
LXByZXNlcnZlLXN0PQpydWN0dXJlIikuaGlkZSgpOyQoIi5qc3RyZWUtbGluay1maWxlcyIpLmhp
ZGUoKTskKCIuanN0cmVlLWZpbGVzLW1lc3NhZ2UiKS49CnNob3coKX1lbHNle2lmKGoudGFyZ2V0
LnZhbHVlPTNEPTNEPTNEImpzdHJlZS1kaXNhYmxlLWZpbGVzIil7JCgiLmpzdHJlZS1maT0KbGVz
LW1lc3NhZ2UiKS5oaWRlKCk7JCgiLmpzdHJlZS1mb2xkZXJzLW1lc3NhZ2UiKS5zaG93KCk7JCgi
LmpzdHJlZS1saW5rLWZpPQpsZXMiKS5zaG93KCk7JCgiLmpzdHJlZS1wcmVzZXJ2ZS1zdHJ1Y3R1
cmUiKS5zaG93KCk7Zy5kaXNhYmxlZF9qc3RyZWVfZWxlbWU9Cm50PTNEImZpbGVzIjtpLnJlbmRl
ckpzdHJlZShnKX19fSl9LHJlbmRlckpzdHJlZTpmdW5jdGlvbihnKXt2YXIgaT0zRHRoaXM7dD0K
aGlzLm9wdGlvbnM9M0RfLmV4dGVuZCh0aGlzLm9wdGlvbnMsZyk7dmFyIGo9M0RnLnNvdXJjZXx8
InVzZXJkaXIiO3ZhciBoPTNEPQp0aGlzLm9wdGlvbnMuZGlzYWJsZWRfanN0cmVlX2VsZW1lbnQ7
dGhpcy5qc3RyZWU9M0RuZXcgZC5Kc3RyZWUoKTt0aGlzLmpzdHI9CmVlLnVybD0zRHRoaXMuanN0
cmVlLnVybFJvb3QrIj90YXJnZXQ9M0QiK2orIiZmb3JtYXQ9M0Rqc3RyZWUmZGlzYWJsZT0zRCIr
aD0KO3RoaXMuanN0cmVlLmZldGNoKHtzdWNjZXNzOmZ1bmN0aW9uKGwsayl7ZGVmaW5lKCJqcXVl
cnkiLGZ1bmN0aW9uKCl7cmV0dXJuPQogalF1ZXJ5fSk7cmVxdWlyZShbImxpYnMvanF1ZXJ5L2pz
dHJlZSJdLGZ1bmN0aW9uKG0peyQoIiNqc3RyZWVfYnJvd3NlciIpLmo9CnN0cmVlKCJkZXN0cm95
Iik7JCgiI2pzdHJlZV9icm93c2VyIikuanN0cmVlKHtjb3JlOntkYXRhOmx9LHBsdWdpbnM6WyJ0
eXBlcz0KIiwiY2hlY2tib3giXSx0eXBlczp7Zm9sZGVyOntpY29uOiJqc3RyZWUtZm9sZGVyIn0s
ZmlsZTp7aWNvbjoianN0cmVlLWZpbGUiPQp9fSxjaGVja2JveDp7dGhyZWVfc3RhdGU6ZmFsc2V9
fSl9KX0sZXJyb3I6ZnVuY3Rpb24obCxrKXtpZih0eXBlb2Ygay5yZXNwb249CnNlSlNPTiE9M0Q9
M0QidW5kZWZpbmVkIil7Zi5lcnJvcihrLnJlc3BvbnNlSlNPTi5lcnJfbXNnKX1lbHNle2YuZXJy
b3IoIkFuID0KZXJyb3Igb2N1cnJlZC4iKX19fSl9LGltcG9ydEZyb21QYXRoc0NsaWNrZWQ6ZnVu
Y3Rpb24oKXt2YXIgZz0zRHRoaXMubW9kYWwuPQokZWwuZmluZCgiLnByZXNlcnZlLWNoZWNrYm94
IikuaXMoIjpjaGVja2VkIik7dmFyIG49M0R0aGlzLm1vZGFsLiRlbC5maW5kKCI9Ci5saW5rLWNo
ZWNrYm94IikuaXMoIjpjaGVja2VkIik7dmFyIGg9M0R0aGlzLnNlbGVjdF9leHRlbnNpb24udmFs
dWUoKTt2YXIgaj0KPTNEdGhpcy5zZWxlY3RfZ2Vub21lLnZhbHVlKCk7dmFyIG09M0QkKCJ0ZXh0
YXJlYSNpbXBvcnRfcGF0aHMiKS52YWwoKTt2YXIgPQpsPTNEW107aWYoIW0pe2YuaW5mbygiUGxl
YXNlIGVudGVyIGEgcGF0aCByZWxhdGl2ZSB0byBHYWxheHkgcm9vdC4iKX1lbHNle3Q9Cmhpcy5t
b2RhbC5kaXNhYmxlQnV0dG9uKCJJbXBvcnQiKTttPTNEbS5zcGxpdCgiXG4iKTtmb3IodmFyIGs9
M0RtLmxlbmd0aC0xOz0Kaz49M0QwO2stLSl7dHJpbW1lZD0zRG1ba10udHJpbSgpO2lmKHRyaW1t
ZWQubGVuZ3RoIT0zRD0zRDApe2wucHVzaCh0cmltbWVkPQopfX10aGlzLmluaXRDaGFpbkNhbGxD
b250cm9sKHtsZW5ndGg6bC5sZW5ndGgsYWN0aW9uOiJhZGRpbmdfZGF0YXNldHMifSk7dGg9Cmlz
LmNoYWluQ2FsbEltcG9ydGluZ0ZvbGRlcnMoe3BhdGhzOmwscHJlc2VydmVfZGlyczpnLGxpbmtf
ZGF0YTpuLHNvdXJjZToiYT0KZG1pbl9wYXRoIixmaWxlX3R5cGU6aCxkYmtleTpqfSl9fSxpbml0
Q2hhaW5DYWxsQ29udHJvbDpmdW5jdGlvbihnKXt2YXIgaDtzPQp3aXRjaChnLmFjdGlvbil7Y2Fz
ZSJhZGRpbmdfZGF0YXNldHMiOmg9M0R0aGlzLnRlbXBsYXRlQWRkaW5nRGF0YXNldHNQcm9ncmU9
CnNzQmFyKCk7dGhpcy5tb2RhbC4kZWwuZmluZCgiLm1vZGFsLWJvZHkiKS5odG1sKGgoe2ZvbGRl
cl9uYW1lOnRoaXMub3B0aW9ucz0KLmZvbGRlcl9uYW1lfSkpO2JyZWFrO2Nhc2UiZGVsZXRpbmdf
ZGF0YXNldHMiOmg9M0R0aGlzLnRlbXBsYXRlRGVsZXRpbmdEYXRhPQpzZXRzUHJvZ3Jlc3NCYXIo
KTt0aGlzLm1vZGFsLiRlbC5maW5kKCIubW9kYWwtYm9keSIpLmh0bWwoaCgpKTticmVhaztjYXNl
InQ9Cm9faGlzdG9yeSI6aD0zRHRoaXMudGVtcGxhdGVJbXBvcnRJbnRvSGlzdG9yeVByb2dyZXNz
QmFyKCk7dGhpcy5tb2RhbC4kZWwuZj0KaW5kKCIubW9kYWwtYm9keSIpLmh0bWwoaCh7aGlzdG9y
eV9uYW1lOmcuaGlzdG9yeV9uYW1lfSkpO2JyZWFrO2RlZmF1bHQ6Y29uPQpzb2xlLmVycm9yKCJX
cm9uZyBhY3Rpb24gc3BlY2lmaWVkLiIpO2JyZWFrfXRoaXMucHJvZ3Jlc3M9M0QwO3RoaXMucHJv
Z3Jlc3M9ClN0ZXA9M0QxMDAvZy5sZW5ndGg7dGhpcy5vcHRpb25zLmNoYWluX2NhbGxfY29udHJv
bC50b3RhbF9udW1iZXI9M0RnLmxlbmd0aD0KO3RoaXMub3B0aW9ucy5jaGFpbl9jYWxsX2NvbnRy
b2wuZmFpbGVkX251bWJlcj0zRDB9LGltcG9ydEZyb21Kc3RyZWVQYXRoOmZ1PQpuY3Rpb24obixy
KXt2YXIgZz0zRCQoIiNqc3RyZWVfYnJvd3NlciIpLmpzdHJlZSgpLmdldF9zZWxlY3RlZCh0cnVl
KTt2YXIgbT0KPTNEdGhpcy5tb2RhbC4kZWwuZmluZCgiLnByZXNlcnZlLWNoZWNrYm94IikuaXMo
IjpjaGVja2VkIik7dmFyIG89M0R0aGlzLm1vPQpkYWwuJGVsLmZpbmQoIi5saW5rLWNoZWNrYm94
IikuaXMoIjpjaGVja2VkIik7dmFyIGo9M0R0aGlzLnNlbGVjdF9leHRlbnNpb249Ci52YWx1ZSgp
O3ZhciBwPTNEdGhpcy5zZWxlY3RfZ2Vub21lLnZhbHVlKCk7dmFyIGs9M0RnWzBdLnR5cGU7dmFy
IHE9M0RbXTtpZj0KKGcubGVuZ3RoPDEpe2YuaW5mbygiUGxlYXNlIHNlbGVjdCBzb21lIGl0ZW1z
IGZpcnN0LiIpfWVsc2V7dGhpcy5tb2RhbC5kaXNhPQpibGVCdXR0b24oIkltcG9ydCIpO2Zvcih2
YXIgbD0zRGcubGVuZ3RoLTE7bD49M0QwO2wtLSl7aWYoZ1tsXS5saV9hdHRyLmZ1bGw9Cl9wYXRo
IT0zRD0zRHVuZGVmaW5lZCl7cS5wdXNoKGdbbF0ubGlfYXR0ci5mdWxsX3BhdGgpfX10aGlzLmlu
aXRDaGFpbkNhbGxDbz0KbnRyb2woe2xlbmd0aDpxLmxlbmd0aCxhY3Rpb246ImFkZGluZ19kYXRh
c2V0cyJ9KTtpZihrPTNEPTNEPTNEImZvbGRlciIpe3ZhPQpyIGg9M0RyLnNvdXJjZSsiX2ZvbGRl
ciI7dGhpcy5jaGFpbkNhbGxJbXBvcnRpbmdGb2xkZXJzKHtwYXRoczpxLHByZXNlcnZlX2Q9Cmly
czptLGxpbmtfZGF0YTpvLHNvdXJjZTpoLGZpbGVfdHlwZTpqLGRia2V5OnB9KX1lbHNle2lmKGs9
M0Q9M0Q9M0QiZmlsZSIpez0KdmFyIGg9M0RyLnNvdXJjZSsiX2ZpbGUiO3RoaXMuY2hhaW5DYWxs
SW1wb3J0aW5nVXNlcmRpckZpbGVzKHtwYXRoczpxLGZpbGVfPQp0eXBlOmosZGJrZXk6cCxzb3Vy
Y2U6aH0pfX19fSxmZXRjaEFuZERpc3BsYXlIaXN0b3J5Q29udGVudHM6ZnVuY3Rpb24oaSl7dmE9
CnIgaD0zRG5ldyBkLkhpc3RvcnlDb250ZW50cyh7aWQ6aX0pO3ZhciBnPTNEdGhpcztoLmZldGNo
KHtzdWNjZXNzOmZ1bmN0aW9uKD0Kayl7dmFyIGo9M0RnLnRlbXBsYXRlSGlzdG9yeUNvbnRlbnRz
KCk7Zy5oaXN0b3JpZXMuZ2V0KGkpLnNldCh7Y29udGVudHM6a30pPQo7Zy5tb2RhbC4kZWwuZmlu
ZCgiI3NlbGVjdGVkX2hpc3RvcnlfY29udGVudCIpLmh0bWwoaih7aGlzdG9yeV9jb250ZW50czpr
Lm09Cm9kZWxzLnJldmVyc2UoKX0pKX0sZXJyb3I6ZnVuY3Rpb24oayxqKXtpZih0eXBlb2Ygai5y
ZXNwb25zZUpTT04hPTNEPTNEInVuZD0KZWZpbmVkIil7Zi5lcnJvcihqLnJlc3BvbnNlSlNPTi5l
cnJfbXNnKX1lbHNle2YuZXJyb3IoIkFuIGVycm9yIG9jdXJyZWQuIil9PQp9fSl9LGFkZEFsbERh
dGFzZXRzRnJvbUhpc3Rvcnk6ZnVuY3Rpb24oKXt2YXIgbD0zRHRoaXMubW9kYWwuJGVsLmZpbmQo
IiNzZWw9CmVjdGVkX2hpc3RvcnlfY29udGVudCIpLmZpbmQoIjpjaGVja2VkIik7dmFyIGc9M0Rb
XTt2YXIgaz0zRFtdO2lmKGwubGVuZ3RoPD0KMSl7Zi5pbmZvKCJZb3UgbXVzdCBzZWxlY3Qgc29t
ZSBkYXRhc2V0cyBmaXJzdC4iKX1lbHNle3RoaXMubW9kYWwuZGlzYWJsZUJ1PQp0dG9uKCJBZGQi
KTtsLmVhY2goZnVuY3Rpb24oKXt2YXIgaT0zRCQodGhpcy5wYXJlbnRFbGVtZW50KS5kYXRhKCJp
ZCIpO2lmKGk9Cil7Zy5wdXNoKGkpfX0pO2Zvcih2YXIgaj0zRGcubGVuZ3RoLTE7aj49M0QwO2ot
LSl7aGlzdG9yeV9kYXRhc2V0X2lkPTNEZ1tqXT0KO3ZhciBoPTNEbmV3IGQuSXRlbSgpO2gudXJs
PTNEKHdpbmRvdy5nYWxheHlfY29uZmlnP2dhbGF4eV9jb25maWcucm9vdDoiLyIpPQorImFwaS9m
b2xkZXJzLyIrdGhpcy5vcHRpb25zLmlkKyIvY29udGVudHMiO2guc2V0KHtmcm9tX2hkYV9pZDpo
aXN0b3J5X2RhdGE9CnNldF9pZH0pO2sucHVzaChoKX10aGlzLmluaXRDaGFpbkNhbGxDb250cm9s
KHtsZW5ndGg6ay5sZW5ndGgsYWN0aW9uOiJhZGRpbj0KZ19kYXRhc2V0cyJ9KTt0aGlzLmNoYWlu
Q2FsbEFkZGluZ0hkYXMoayl9fSxjaGFpbkNhbGxJbXBvcnRpbmdJbnRvSGlzdG9yeTpmPQp1bmN0
aW9uKGgsayl7dmFyIGc9M0R0aGlzO3ZhciBpPTNEaC5wb3AoKTtpZih0eXBlb2YgaT0zRD0zRCJ1
bmRlZmluZWQiKXtpZig9CnRoaXMub3B0aW9ucy5jaGFpbl9jYWxsX2NvbnRyb2wuZmFpbGVkX251
bWJlcj0zRD0zRD0zRDApe2Yuc3VjY2VzcygiU2VsZWN0ZT0KZCBkYXRhc2V0cyBpbXBvcnRlZCBp
bnRvIGhpc3RvcnkuIENsaWNrIHRoaXMgdG8gc3RhcnQgYW5hbHlzaW5nIGl0LiIsIiIse29uPQpj
bGljazpmdW5jdGlvbigpe3dpbmRvdy5sb2NhdGlvbj0zRCIvIn19KX1lbHNle2lmKHRoaXMub3B0
aW9ucy5jaGFpbl9jYWxsX2M9Cm9udHJvbC5mYWlsZWRfbnVtYmVyPTNEPTNEPTNEdGhpcy5vcHRp
b25zLmNoYWluX2NhbGxfY29udHJvbC50b3RhbF9udW1iZXIpez0KZi5lcnJvcigiVGhlcmUgd2Fz
IGFuIGVycm9yIGFuZCBubyBkYXRhc2V0cyB3ZXJlIGltcG9ydGVkIGludG8gaGlzdG9yeS4iKX1l
PQpsc2V7aWYodGhpcy5vcHRpb25zLmNoYWluX2NhbGxfY29udHJvbC5mYWlsZWRfbnVtYmVyPHRo
aXMub3B0aW9ucy5jaGFpbl9jYWw9CmxfY29udHJvbC50b3RhbF9udW1iZXIpe2Yud2FybmluZygi
U29tZSBvZiB0aGUgZGF0YXNldHMgY291bGQgbm90IGJlIGltcG9ydD0KZWQgaW50byBoaXN0b3J5
LiBDbGljayB0aGlzIHRvIHNlZSB3aGF0IHdhcyBpbXBvcnRlZC4iLCIiLHtvbmNsaWNrOmZ1bmN0
aW9uPQooKXt3aW5kb3cubG9jYXRpb249M0QiLyJ9fSl9fX1HYWxheHkubW9kYWwuaGlkZSgpO3Jl
dHVybiB0cnVlfXZhciBqPTNEJC53aGU9Cm4oaS5zYXZlKHtjb250ZW50OmkuY29udGVudCxzb3Vy
Y2U6aS5zb3VyY2V9KSk7ai5kb25lKGZ1bmN0aW9uKCl7Zy51cGRhdGVQcj0Kb2dyZXNzKCk7Zy5j
aGFpbkNhbGxJbXBvcnRpbmdJbnRvSGlzdG9yeShoLGspfSkuZmFpbChmdW5jdGlvbigpe2cub3B0
aW9ucy5jPQpoYWluX2NhbGxfY29udHJvbC5mYWlsZWRfbnVtYmVyKz0zRDE7Zy51cGRhdGVQcm9n
cmVzcygpO2cuY2hhaW5DYWxsSW1wb3J0aW49CmdJbnRvSGlzdG9yeShoLGspfSl9LGNoYWluQ2Fs
bEltcG9ydGluZ1VzZXJkaXJGaWxlczpmdW5jdGlvbihnKXt2YXIgaD0zRHRoaT0Kczt2YXIgaT0z
RGcucGF0aHMucG9wKCk7aWYodHlwZW9mIGk9M0Q9M0Q9M0QidW5kZWZpbmVkIil7aWYodGhpcy5v
cHRpb25zLmNoPQphaW5fY2FsbF9jb250cm9sLmZhaWxlZF9udW1iZXI9M0Q9M0Q9M0QwKXtmLnN1
Y2Nlc3MoIlNlbGVjdGVkIGZpbGVzIGltcG9ydGU9CmQgaW50byB0aGUgY3VycmVudCBmb2xkZXIi
KTtHYWxheHkubW9kYWwuaGlkZSgpfWVsc2V7Zi5lcnJvcigiQW4gZXJyb3Igb2NjdT0KcmVkLiIp
fXJldHVybiB0cnVlfXZhciBqPTNEJC53aGVuKCQucG9zdCgod2luZG93LmdhbGF4eV9jb25maWc/
Z2FsYXh5X2NvbmZpPQpnLnJvb3Q6Ii8iKSsiYXBpL2xpYnJhcmllcy9kYXRhc2V0cz9lbmNvZGVk
X2ZvbGRlcl9pZD0zRCIraC5pZCsiJnNvdXJjZT0zRCI9CitnLnNvdXJjZSsiJnBhdGg9M0QiK2kr
IiZmaWxlX3R5cGU9M0QiK2cuZmlsZV90eXBlKyImZGJrZXk9M0QiK2cuZGJrZXkpKTtqLj0KZG9u
ZShmdW5jdGlvbihrKXtoLnVwZGF0ZVByb2dyZXNzKCk7aC5jaGFpbkNhbGxJbXBvcnRpbmdVc2Vy
ZGlyRmlsZXMoZyl9KS5mPQphaWwoZnVuY3Rpb24oKXtoLm9wdGlvbnMuY2hhaW5fY2FsbF9jb250
cm9sLmZhaWxlZF9udW1iZXIrPTNEMTtoLnVwZGF0ZVByb2c9CnJlc3MoKTtoLmNoYWluQ2FsbElt
cG9ydGluZ1VzZXJkaXJGaWxlcyhnKX0pfSxjaGFpbkNhbGxJbXBvcnRpbmdGb2xkZXJzOmZ1bj0K
Y3Rpb24oZyl7dmFyIGg9M0R0aGlzO3ZhciBpPTNEZy5wYXRocy5wb3AoKTtpZih0eXBlb2YgaT0z
RD0zRCJ1bmRlZmluZWQiKXtpPQpmKHRoaXMub3B0aW9ucy5jaGFpbl9jYWxsX2NvbnRyb2wuZmFp
bGVkX251bWJlcj0zRD0zRD0zRDApe2Yuc3VjY2VzcygiU2VsZWM9CnRlZCBmb2xkZXJzIGFuZCB0
aGVpciBjb250ZW50cyBpbXBvcnRlZCBpbnRvIHRoZSBjdXJyZW50IGZvbGRlci4iKTtHYWxheHku
bT0Kb2RhbC5oaWRlKCl9ZWxzZXtmLmVycm9yKCJBbiBlcnJvciBvY2N1cmVkLiIpfXJldHVybiB0
cnVlfXZhciBqPTNEJC53aGVuKCQuPQpwb3N0KCh3aW5kb3cuZ2FsYXh5X2NvbmZpZz9nYWxheHlf
Y29uZmlnLnJvb3Q6Ii8iKSsiYXBpL2xpYnJhcmllcy9kYXRhc2V0cz89CmVuY29kZWRfZm9sZGVy
X2lkPTNEIitoLmlkKyImc291cmNlPTNEIitnLnNvdXJjZSsiJnBhdGg9M0QiK2krIiZwcmVzZXJ2
ZV9kaT0KcnM9M0QiK2cucHJlc2VydmVfZGlycysiJmxpbmtfZGF0YT0zRCIrZy5saW5rX2RhdGEr
IiZmaWxlX3R5cGU9M0QiK2cuZmlsZV90PQp5cGUrIiZkYmtleT0zRCIrZy5kYmtleSkpO2ouZG9u
ZShmdW5jdGlvbihrKXtoLnVwZGF0ZVByb2dyZXNzKCk7aC5jaGFpbkNhbGw9CkltcG9ydGluZ0Zv
bGRlcnMoZyl9KS5mYWlsKGZ1bmN0aW9uKCl7aC5vcHRpb25zLmNoYWluX2NhbGxfY29udHJvbC5m
YWlsZWRfbj0KdW1iZXIrPTNEMTtoLnVwZGF0ZVByb2dyZXNzKCk7aC5jaGFpbkNhbGxJbXBvcnRp
bmdGb2xkZXJzKGcpfSl9LGNoYWluQ2FsbEFkPQpkaW5nSGRhczpmdW5jdGlvbihoKXt2YXIgZz0z
RHRoaXM7dGhpcy5hZGRlZF9oZGFzPTNEbmV3IGQuRm9sZGVyKCk7dmFyIGk9M0Q9CmgucG9wKCk7
aWYodHlwZW9mIGk9M0Q9M0QidW5kZWZpbmVkIil7aWYodGhpcy5vcHRpb25zLmNoYWluX2NhbGxf
Y29udHJvbC5mYT0KaWxlZF9udW1iZXI9M0Q9M0Q9M0QwKXtmLnN1Y2Nlc3MoIlNlbGVjdGVkIGRh
dGFzZXRzIGZyb20gaGlzdG9yeSBhZGRlZCB0byB0PQpoZSBmb2xkZXIiKX1lbHNle2lmKHRoaXMu
b3B0aW9ucy5jaGFpbl9jYWxsX2NvbnRyb2wuZmFpbGVkX251bWJlcj0zRD0zRD0zRHQ9Cmhpcy5v
cHRpb25zLmNoYWluX2NhbGxfY29udHJvbC50b3RhbF9udW1iZXIpe2YuZXJyb3IoIlRoZXJlIHdh
cyBhbiBlcnJvciBhbj0KZCBubyBkYXRhc2V0cyB3ZXJlIGFkZGVkIHRvIHRoZSBmb2xkZXIuIil9
ZWxzZXtpZih0aGlzLm9wdGlvbnMuY2hhaW5fY2FsbF9jPQpvbnRyb2wuZmFpbGVkX251bWJlcjx0
aGlzLm9wdGlvbnMuY2hhaW5fY2FsbF9jb250cm9sLnRvdGFsX251bWJlcil7Zi53YXJuaW49Cmco
IlNvbWUgb2YgdGhlIGRhdGFzZXRzIGNvdWxkIG5vdCBiZSBhZGRlZCB0byB0aGUgZm9sZGVyIil9
fX1HYWxheHkubW9kYWwuaD0KaWRlKCk7cmV0dXJuIHRoaXMuYWRkZWRfaGRhc312YXIgaj0zRCQu
d2hlbihpLnNhdmUoe2Zyb21faGRhX2lkOmkuZ2V0KCJmcm9tPQpfaGRhX2lkIil9KSk7ai5kb25l
KGZ1bmN0aW9uKGspe0dhbGF4eS5saWJyYXJpZXMuZm9sZGVyTGlzdFZpZXcuY29sbGVjdGlvbi49
CmFkZChrKTtnLnVwZGF0ZVByb2dyZXNzKCk7Zy5jaGFpbkNhbGxBZGRpbmdIZGFzKGgpfSkuZmFp
bChmdW5jdGlvbigpe2cub3B0aT0Kb25zLmNoYWluX2NhbGxfY29udHJvbC5mYWlsZWRfbnVtYmVy
Kz0zRDE7Zy51cGRhdGVQcm9ncmVzcygpO2cuY2hhaW5DYWxsQWRkPQppbmdIZGFzKGgpfSl9LGNo
YWluQ2FsbERlbGV0aW5nSGRhczpmdW5jdGlvbihoKXt2YXIgZz0zRHRoaXM7dGhpcy5kZWxldGVk
X2w9CmRkYXM9M0RuZXcgZC5Gb2xkZXIoKTt2YXIgaT0zRGgucG9wKCk7aWYodHlwZW9mIGk9M0Q9
M0Q9M0QidW5kZWZpbmVkIil7aWYodD0KaGlzLm9wdGlvbnMuY2hhaW5fY2FsbF9jb250cm9sLmZh
aWxlZF9udW1iZXI9M0Q9M0Q9M0QwKXtmLnN1Y2Nlc3MoIlNlbGVjdGVkPQogZGF0YXNldHMgd2Vy
ZSBkZWxldGVkLiIpfWVsc2V7aWYodGhpcy5vcHRpb25zLmNoYWluX2NhbGxfY29udHJvbC5mYWls
ZWRfbnU9Cm1iZXI9M0Q9M0Q9M0R0aGlzLm9wdGlvbnMuY2hhaW5fY2FsbF9jb250cm9sLnRvdGFs
X251bWJlcil7Zi5lcnJvcigiVGhlcmUgdz0KYXMgYW4gZXJyb3IgYW5kIG5vIGRhdGFzZXRzIHdl
cmUgZGVsZXRlZC4gUGxlYXNlIG1ha2Ugc3VyZSB5b3UgaGF2ZSBzdWZmaWNpPQplbnQgcGVybWlz
c2lvbnMuIil9ZWxzZXtpZih0aGlzLm9wdGlvbnMuY2hhaW5fY2FsbF9jb250cm9sLmZhaWxlZF9u
dW1iZXI8dGg9CmlzLm9wdGlvbnMuY2hhaW5fY2FsbF9jb250cm9sLnRvdGFsX251bWJlcil7Zi53
YXJuaW5nKCJTb21lIG9mIHRoZSBkYXRhc2V0cz0KIGNvdWxkIG5vdCBiZSBkZWxldGVkLiBQbGVh
c2UgbWFrZSBzdXJlIHlvdSBoYXZlIHN1ZmZpY2llbnQgcGVybWlzc2lvbnMuIil9PQp9fUdhbGF4
eS5tb2RhbC5oaWRlKCk7cmV0dXJuIHRoaXMuZGVsZXRlZF9sZGRhc312YXIgaj0zRCQud2hlbihp
LmRlc3Ryb3koKSk9CjtqLmRvbmUoZnVuY3Rpb24obCl7R2FsYXh5LmxpYnJhcmllcy5mb2xkZXJM
aXN0Vmlldy5jb2xsZWN0aW9uLnJlbW92ZShpLmlkKT0KO2cudXBkYXRlUHJvZ3Jlc3MoKTtpZihH
YWxheHkubGlicmFyaWVzLmZvbGRlckxpc3RWaWV3Lm9wdGlvbnMuaW5jbHVkZV9kZWxlPQp0ZWQp
e3ZhciBrPTNEbmV3IGQuSXRlbShsKTtHYWxheHkubGlicmFyaWVzLmZvbGRlckxpc3RWaWV3LmNv
bGxlY3Rpb24uYWRkKGs9Cil9Zy5jaGFpbkNhbGxEZWxldGluZ0hkYXMoaCl9KS5mYWlsKGZ1bmN0
aW9uKCl7Zy5vcHRpb25zLmNoYWluX2NhbGxfY29udHJvbD0KLmZhaWxlZF9udW1iZXIrPTNEMTtn
LnVwZGF0ZVByb2dyZXNzKCk7Zy5jaGFpbkNhbGxEZWxldGluZ0hkYXMoaCl9KX0sY2hlY2tJPQpu
Y2x1ZGVEZWxldGVkOmZ1bmN0aW9uKGcpe2lmKGcudGFyZ2V0LmNoZWNrZWQpe0dhbGF4eS5saWJy
YXJpZXMuZm9sZGVyTGlzdFY9Cmlldy5mZXRjaEZvbGRlcih7aW5jbHVkZV9kZWxldGVkOnRydWV9
KX1lbHNle0dhbGF4eS5saWJyYXJpZXMuZm9sZGVyTGlzdFZpZT0Kdy5mZXRjaEZvbGRlcih7aW5j
bHVkZV9kZWxldGVkOmZhbHNlfSl9fSxkZWxldGVTZWxlY3RlZERhdGFzZXRzOmZ1bmN0aW9uKCl7
PQp2YXIgZz0zRCQoIiNmb2xkZXJfdGFibGUiKS5maW5kKCI6Y2hlY2tlZCIpO2lmKGcubGVuZ3Ro
PTNEPTNEPTNEMCl7Zi5pbmZvKCI9CllvdSBtdXN0IHNlbGVjdCBhdCBsZWFzdCBvbmUgZGF0YXNl
dCBmb3IgZGVsZXRpb24uIil9ZWxzZXt2YXIgaz0zRHRoaXMudGVtcD0KbGF0ZURlbGV0aW5nRGF0
YXNldHNQcm9ncmVzc0JhcigpO3RoaXMubW9kYWw9M0RHYWxheHkubW9kYWw7dGhpcy5tb2RhbC5z
aG93PQooe2Nsb3NpbmdfZXZlbnRzOnRydWUsdGl0bGU6IkRlbGV0aW5nIHNlbGVjdGVkIGRhdGFz
ZXRzIixib2R5Omsoe30pLGJ1dHRvbnM9Cjp7Q2xvc2U6ZnVuY3Rpb24oKXtHYWxheHkubW9kYWwu
aGlkZSgpfX19KTt0aGlzLm9wdGlvbnMuY2hhaW5fY2FsbF9jb250cm9sLj0KdG90YWxfbnVtYmVy
PTNEMDt0aGlzLm9wdGlvbnMuY2hhaW5fY2FsbF9jb250cm9sLmZhaWxlZF9udW1iZXI9M0QwO3Zh
ciBoPTNEPQpbXTtnLmVhY2goZnVuY3Rpb24oKXtpZih0aGlzLnBhcmVudEVsZW1lbnQucGFyZW50
RWxlbWVudC5pZCE9M0Q9M0QiIil7aC5wdXM9CmgodGhpcy5wYXJlbnRFbGVtZW50LnBhcmVudEVs
ZW1lbnQuaWQpfX0pO3RoaXMucHJvZ3Jlc3NTdGVwPTNEMTAwL2gubGVuZ3RoOz0KdGhpcy5wcm9n
cmVzcz0zRDA7dmFyIG09M0RbXTtmb3IodmFyIGo9M0RoLmxlbmd0aC0xO2o+PTNEMDtqLS0pe3Zh
ciBsPTNEbmV3PQogZC5JdGVtKHtpZDpoW2pdfSk7bS5wdXNoKGwpfXRoaXMub3B0aW9ucy5jaGFp
bl9jYWxsX2NvbnRyb2wudG90YWxfbnVtYmVyPQo9M0RoLmxlbmd0aDt0aGlzLmNoYWluQ2FsbERl
bGV0aW5nSGRhcyhtKX19LHNob3dMaWJJbmZvOmZ1bmN0aW9uKCl7dmFyIGg9M0Q9CkdhbGF4eS5s
aWJyYXJpZXMuZm9sZGVyTGlzdFZpZXcuZm9sZGVyQ29udGFpbmVyLmF0dHJpYnV0ZXMubWV0YWRh
dGEucGFyZW50Xz0KbGlicmFyeV9pZDt2YXIgZz0zRG51bGw7dmFyIGk9M0R0aGlzO2lmKEdhbGF4
eS5saWJyYXJpZXMubGlicmFyeUxpc3RWaWV3IT0KPTNEPTNEbnVsbCl7Zz0zREdhbGF4eS5saWJy
YXJpZXMubGlicmFyeUxpc3RWaWV3LmNvbGxlY3Rpb24uZ2V0KGgpO3RoaXMuc2hvPQp3TGliSW5m
b01vZGFsKGcpfWVsc2V7Zz0zRG5ldyBkLkxpYnJhcnkoe2lkOmh9KTtnLmZldGNoKHtzdWNjZXNz
OmZ1bmN0aW9uKCk9CntpLnNob3dMaWJJbmZvTW9kYWwoZyl9LGVycm9yOmZ1bmN0aW9uKGssail7
aWYodHlwZW9mIGoucmVzcG9uc2VKU09OIT0zRD0zRD0KInVuZGVmaW5lZCIpe2YuZXJyb3Ioai5y
ZXNwb25zZUpTT04uZXJyX21zZyl9ZWxzZXtmLmVycm9yKCJBbiBlcnJvciBvY3VycmVkPQouIil9
fX0pfX0sc2hvd0xpYkluZm9Nb2RhbDpmdW5jdGlvbihnKXt2YXIgaD0zRHRoaXMudGVtcGxhdGVM
aWJJbmZvSW5Nb2RhbCg9Cik7dGhpcy5tb2RhbD0zREdhbGF4eS5tb2RhbDt0aGlzLm1vZGFsLnNo
b3coe2Nsb3NpbmdfZXZlbnRzOnRydWUsdGl0bGU6IkxpYj0KcmFyeSBJbmZvcm1hdGlvbiIsYm9k
eTpoKHtsaWJyYXJ5Omd9KSxidXR0b25zOntDbG9zZTpmdW5jdGlvbigpe0dhbGF4eS5tb2RhPQps
LmhpZGUoKX19fSl9LHNob3dJbXBvcnRNb2RhbDpmdW5jdGlvbihnKXtzd2l0Y2goZy5zb3VyY2Up
e2Nhc2UiaGlzdG9yeSI6dGg9CmlzLmFkZEZpbGVzRnJvbUhpc3RvcnlNb2RhbCgpO2JyZWFrO2Nh
c2UiaW1wb3J0ZGlyIjp0aGlzLmltcG9ydEZpbGVzRnJvbUdhbD0KYXh5Rm9sZGVyTW9kYWwoe3Nv
dXJjZToiaW1wb3J0ZGlyIn0pO2JyZWFrO2Nhc2UicGF0aCI6dGhpcy5pbXBvcnRGaWxlc0Zyb21Q
PQphdGhNb2RhbCgpO2JyZWFrO2Nhc2UidXNlcmRpciI6dGhpcy5pbXBvcnRGaWxlc0Zyb21HYWxh
eHlGb2xkZXJNb2RhbCh7c291cmM9CmU6InVzZXJkaXIifSk7YnJlYWs7ZGVmYXVsdDpHYWxheHku
bGlicmFyaWVzLmxpYnJhcnlfcm91dGVyLmJhY2soKTtmLmVycm9yKD0KIkludmFsaWQgaW1wb3J0
IHNvdXJjZS4iKTticmVha319LHNob3dQYWdlU2l6ZVByb21wdDpmdW5jdGlvbigpe3ZhciBnPTNE
cHJvPQptcHQoIkhvdyBtYW55IGl0ZW1zIHBlciBwYWdlIGRvIHlvdSB3YW50IHRvIHNlZT8iLEdh
bGF4eS5saWJyYXJpZXMucHJlZmVyZW49CmNlcy5nZXQoImZvbGRlcl9wYWdlX3NpemUiKSk7aWYo
KGchPTNEbnVsbCkmJihnPTNEPTNEcGFyc2VJbnQoZykpKXtHYWxheHkubD0KaWJyYXJpZXMucHJl
ZmVyZW5jZXMuc2V0KHtmb2xkZXJfcGFnZV9zaXplOnBhcnNlSW50KGcpfSk7R2FsYXh5LmxpYnJh
cmllcy5mPQpvbGRlckxpc3RWaWV3LnJlbmRlcih7aWQ6dGhpcy5vcHRpb25zLmlkLHNob3dfcGFn
ZToxfSl9fSx0ZW1wbGF0ZVRvb2xCYXI6ZnU9Cm5jdGlvbigpe3RtcGxfYXJyYXk9M0RbXTt0bXBs
X2FycmF5LnB1c2goJzxkaXYgY2xhc3M9M0QibGlicmFyeV9zdHlsZV9jb250YT0KaW5lciI+Jyk7
dG1wbF9hcnJheS5wdXNoKCcgPGRpdiBpZD0zRCJsaWJyYXJ5X3Rvb2xiYXIiPicpO3RtcGxfYXJy
YXkucHVzaCgiPQogICA8c3Bhbj48c3Ryb25nPkRBVEEgTElCUkFSSUVTPC9zdHJvbmc+PC9zcGFu
PiIpO3RtcGxfYXJyYXkucHVzaCgnICAgPHNwYW49CiBkYXRhLXRvZ2dsZT0zRCJ0b29sdGlwIiBk
YXRhLXBsYWNlbWVudD0zRCJ0b3AiIGNsYXNzPTNEImxvZ2dlZC1kYXRhc2V0LW1hbj0KaXB1bGF0
aW9uIiB0aXRsZT0zRCJJbmNsdWRlIGRlbGV0ZWQgZGF0YXNldHMiIHN0eWxlPTNEImRpc3BsYXk6
bm9uZTsiPiB8IDxpPQpucHV0IGlkPTNEImluY2x1ZGVfZGVsZXRlZF9kYXRhc2V0c19jaGsiIHN0
eWxlPTNEIm1hcmdpbjogMDsiIHR5cGU9M0QiY2hlY2s9CmJveCI+IGluY2x1ZGUgZGVsZXRlZCB8
IDwvaW5wdXQ+PC9zcGFuPicpO3RtcGxfYXJyYXkucHVzaCgnICAgPGJ1dHRvbiBzdHlsZT0KPTNE
ImRpc3BsYXk6bm9uZTsiIGRhdGEtdG9nZ2xlPTNEInRvb2x0aXAiIGRhdGEtcGxhY2VtZW50PTNE
InRvcCIgdGl0bGU9M0QiPQpDcmVhdGUgTmV3IEZvbGRlciIgaWQ9M0QidG9vbGJ0bl9jcmVhdGVf
Zm9sZGVyIiBjbGFzcz0zRCJidG4gYnRuLWRlZmF1bHQgcHI9CmltYXJ5LWJ1dHRvbiBhZGQtbGli
cmFyeS1pdGVtcyIgdHlwZT0zRCJidXR0b24iPjxzcGFuIGNsYXNzPTNEImZhIGZhLXBsdXMiPj0K
PC9zcGFuPjxzcGFuIGNsYXNzPTNEImZhIGZhLWZvbGRlciI+PC9zcGFuPjwvYnV0dG9uPicpO3Rt
cGxfYXJyYXkucHVzaCgiPCUgPQppZihtdXRpcGxlX2FkZF9kYXRhc2V0X29wdGlvbnMpIHsgJT4i
KTt0bXBsX2FycmF5LnB1c2goJyAgIDxkaXYgY2xhc3M9M0QiYnQ9Cm4tZ3JvdXAgYWRkLWxpYnJh
cnktaXRlbXMiIHN0eWxlPTNEImRpc3BsYXk6bm9uZTsiPicpO3RtcGxfYXJyYXkucHVzaCgnICAg
ID0KIDxidXR0b24gdGl0bGU9M0QiQWRkIERhdGFzZXRzIHRvIEN1cnJlbnQgRm9sZGVyIiBpZD0z
RCIiIHR5cGU9M0QiYnV0dG9uIiBjPQpsYXNzPTNEInByaW1hcnktYnV0dG9uIGRyb3Bkb3duLXRv
Z2dsZSIgZGF0YS10b2dnbGU9M0QiZHJvcGRvd24iPicpO3RtcGxfYXI9CnJheS5wdXNoKCcgICAg
IDxzcGFuIGNsYXNzPTNEImZhIGZhLXBsdXMiPjwvc3Bhbj48c3BhbiBjbGFzcz0zRCJmYSBmYS1m
aWxlIj0KPjwvc3Bhbj48c3BhbiBjbGFzcz0zRCJjYXJldCI+PC9zcGFuPicpO3RtcGxfYXJyYXku
cHVzaCgiICAgICA8L2J1dHRvbj4iKTt0PQptcGxfYXJyYXkucHVzaCgnICAgICA8dWwgY2xhc3M9
M0QiZHJvcGRvd24tbWVudSIgcm9sZT0zRCJtZW51Ij4nKTt0bXBsX2FycmE9CnkucHVzaCgnICAg
ICAgICA8bGk+PGEgaHJlZj0zRCIjZm9sZGVycy88JT0zRCBpZCAlPi9pbXBvcnQvaGlzdG9yeSI+
IGZyb20gSD0KaXN0b3J5PC9hPjwvbGk+Jyk7dG1wbF9hcnJheS5wdXNoKCI8JSBpZihHYWxheHku
Y29uZmlnLnVzZXJfbGlicmFyeV9pbXBvcnRfPQpkaXIgIT0zRD0zRCBudWxsKSB7ICU+Iik7dG1w
bF9hcnJheS5wdXNoKCcgICAgICAgIDxsaT48YSBocmVmPTNEIiNmb2xkZXJzLzw9CiU9M0QgaWQg
JT4vaW1wb3J0L3VzZXJkaXIiPiBmcm9tIFVzZXIgRGlyZWN0b3J5PC9hPjwvbGk+Jyk7dG1wbF9h
cnJheS5wdXNoKD0KIjwlIH0gJT4iKTt0bXBsX2FycmF5LnB1c2goIjwlIGlmKEdhbGF4eS5jb25m
aWcuYWxsb3dfbGlicmFyeV9wYXRoX3Bhc3RlKSB7PQogJT4iKTt0bXBsX2FycmF5LnB1c2goJyAg
IDxsaSBjbGFzcz0zRCJkaXZpZGVyIj48L2xpPicpO3RtcGxfYXJyYXkucHVzaCgnICA9CiA8bGkg
Y2xhc3M9M0QiZHJvcGRvd24taGVhZGVyIj5BZG1pbnMgb25seTwvbGk+Jyk7dG1wbF9hcnJheS5w
dXNoKCI8JSBpZihHYT0KbGF4eS5jb25maWcubGlicmFyeV9pbXBvcnRfZGlyICE9M0Q9M0QgbnVs
bCkgeyAlPiIpO3RtcGxfYXJyYXkucHVzaCgnICAgPGxpPQo+PGEgaHJlZj0zRCIjZm9sZGVycy88
JT0zRCBpZCAlPi9pbXBvcnQvaW1wb3J0ZGlyIj5mcm9tIEltcG9ydCBEaXJlY3Rvcnk8L2E9Cj48
L2xpPicpO3RtcGxfYXJyYXkucHVzaCgiPCUgfSAlPiIpO3RtcGxfYXJyYXkucHVzaCgiPCUgaWYo
R2FsYXh5LmNvbmZpZy5hbD0KbG93X2xpYnJhcnlfcGF0aF9wYXN0ZSkgeyAlPiIpO3RtcGxfYXJy
YXkucHVzaCgnICAgICAgICA8bGk+PGEgaHJlZj0zRCIjZm9sPQpkZXJzLzwlPTNEIGlkICU+L2lt
cG9ydC9wYXRoIj5mcm9tIFBhdGg8L2E+PC9saT4nKTt0bXBsX2FycmF5LnB1c2goIjwlIH0gJT49
CiIpO3RtcGxfYXJyYXkucHVzaCgiPCUgfSAlPiIpO3RtcGxfYXJyYXkucHVzaCgiICAgICA8L3Vs
PiIpO3RtcGxfYXJyYXkucHVzaD0KKCIgICA8L2Rpdj4iKTt0bXBsX2FycmF5LnB1c2goIjwlIH0g
ZWxzZSB7ICU+Iik7dG1wbF9hcnJheS5wdXNoKCcgPGEgIGRhdGEtPQpwbGFjZW1lbnQ9M0QidG9w
IiB0aXRsZT0zRCJBZGQgRGF0YXNldHMgdG8gQ3VycmVudCBGb2xkZXIiIHN0eWxlPTNEImRpc3Bs
YXk9Cjpub25lOyIgY2xhc3M9M0QiYnRuIGJ0bi1kZWZhdWx0IGFkZC1saWJyYXJ5LWl0ZW1zIiBo
cmVmPTNEIiNmb2xkZXJzLzwlPTNEID0KaWQgJT4vaW1wb3J0L2hpc3RvcnkiIHJvbGU9M0QiYnV0
dG9uIj48c3BhbiBjbGFzcz0zRCJmYSBmYS1wbHVzIj48L3NwYW4+PHNwPQphbiBjbGFzcz0zRCJm
YSBmYS1maWxlIj48L3NwYW4+PC9zcGFuPjwvYT4nKTt0bXBsX2FycmF5LnB1c2goIjwlIH0gJT4i
KTt0bXA9CmxfYXJyYXkucHVzaCgnICA8YnV0dG9uIGRhdGEtdG9nZ2xlPTNEInRvb2x0aXAiIGRh
dGEtcGxhY2VtZW50PTNEInRvcCIgdGl0bD0KZT0zRCJJbXBvcnQgc2VsZWN0ZWQgZGF0YXNldHMg
aW50byBoaXN0b3J5IiBpZD0zRCJ0b29sYnRuX2J1bGtfaW1wb3J0IiBjbGFzPQpzPTNEInByaW1h
cnktYnV0dG9uIGRhdGFzZXQtbWFuaXB1bGF0aW9uIiBzdHlsZT0zRCJtYXJnaW4tbGVmdDogMC41
ZW07IGRpc3A9CmxheTpub25lOyIgdHlwZT0zRCJidXR0b24iPjxzcGFuIGNsYXNzPTNEImZhIGZh
LWJvb2siPjwvc3Bhbj4gdG8gSGlzdG9yeTwvYj0KdXR0b24+Jyk7dG1wbF9hcnJheS5wdXNoKCcg
ICA8ZGl2IGlkPTNEInRvb2xidG5fZGwiIGNsYXNzPTNEImJ0bi1ncm91cCBkYXRhPQpzZXQtbWFu
aXB1bGF0aW9uIiBzdHlsZT0zRCJtYXJnaW4tbGVmdDogMC41ZW07IGRpc3BsYXk6bm9uZTsgIj4n
KTt0bXBsX2FycmE9CnkucHVzaCgnICAgICA8YnV0dG9uIHRpdGxlPTNEIkRvd25sb2FkIHNlbGVj
dGVkIGRhdGFzZXRzIGFzIGFyY2hpdmUiIGlkPTNEIj0KZHJvcF90b2dnbGUiIHR5cGU9M0QiYnV0
dG9uIiBjbGFzcz0zRCJwcmltYXJ5LWJ1dHRvbiBkcm9wZG93bi10b2dnbGUiIGRhdGEtPQp0b2dn
bGU9M0QiZHJvcGRvd24iPicpO3RtcGxfYXJyYXkucHVzaCgnICAgICA8c3BhbiBjbGFzcz0zRCJm
YSBmYS1kb3dubG9hZCI9Cj48L3NwYW4+IERvd25sb2FkIDxzcGFuIGNsYXNzPTNEImNhcmV0Ij48
L3NwYW4+Jyk7dG1wbF9hcnJheS5wdXNoKCIgICAgIDwvYj0KdXR0b24+Iik7dG1wbF9hcnJheS5w
dXNoKCcgICAgIDx1bCBjbGFzcz0zRCJkcm9wZG93bi1tZW51IiByb2xlPTNEIm1lbnUiPicpPQo7
dG1wbF9hcnJheS5wdXNoKCcgICAgICAgIDxsaT48YSBocmVmPTNEIiMvZm9sZGVycy88JT0zRCBp
ZCAlPi9kb3dubG9hZC90Z3o9CiI+LnRhci5nejwvYT48L2xpPicpO3RtcGxfYXJyYXkucHVzaCgn
ICAgICAgICA8bGk+PGEgaHJlZj0zRCIjL2ZvbGRlcnMvPCU9Cj0zRCBpZCAlPi9kb3dubG9hZC90
YnoiPi50YXIuYno8L2E+PC9saT4nKTt0bXBsX2FycmF5LnB1c2goJyAgICAgICAgPGxpPjxhID0K
aHJlZj0zRCIjL2ZvbGRlcnMvPCU9M0QgaWQgJT4vZG93bmxvYWQvemlwIj4uemlwPC9hPjwvbGk+
Jyk7dG1wbF9hcnJheS5wdXNoPQooIiAgICAgPC91bD4iKTt0bXBsX2FycmF5LnB1c2goIiAgIDwv
ZGl2PiIpO3RtcGxfYXJyYXkucHVzaCgnICAgPGJ1dHRvbiBkYXQ9CmEtdG9nZ2xlPTNEInRvb2x0
aXAiIGRhdGEtcGxhY2VtZW50PTNEInRvcCIgdGl0bGU9M0QiTWFyayBzZWxlY3RlZCBkYXRhc2V0
cz0KIGRlbGV0ZWQiIGlkPTNEInRvb2xidG5fYnVsa19kZWxldGUiIGNsYXNzPTNEInByaW1hcnkt
YnV0dG9uIGxvZ2dlZC1kYXRhc2V0PQotbWFuaXB1bGF0aW9uIiBzdHlsZT0zRCJtYXJnaW4tbGVm
dDogMC41ZW07IGRpc3BsYXk6bm9uZTsgIiB0eXBlPTNEImJ1dHRvbiI9Cj48c3BhbiBjbGFzcz0z
RCJmYSBmYS10aW1lcyI+PC9zcGFuPiBEZWxldGU8L2J1dHRvbj4nKTt0bXBsX2FycmF5LnB1c2go
JyAgID0KPGJ1dHRvbiBkYXRhLWlkPTNEIjwlLSBpZCAlPiIgZGF0YS10b2dnbGU9M0QidG9vbHRp
cCIgZGF0YS1wbGFjZW1lbnQ9M0QidG9wPQoiIHRpdGxlPTNEIlNob3cgbGlicmFyeSBpbmZvcm1h
dGlvbiIgaWQ9M0QidG9vbGJ0bl9zaG93X2xpYmluZm8iIGNsYXNzPTNEInA9CnJpbWFyeS1idXR0
b24iIHN0eWxlPTNEIm1hcmdpbi1sZWZ0OiAwLjVlbTsiIHR5cGU9M0QiYnV0dG9uIj48c3BhbiBj
bGFzcz0zRD0KImZhIGZhLWluZm8tY2lyY2xlIj48L3NwYW4+IExpYnJhcnkgSW5mbzwvYnV0dG9u
PicpO3RtcGxfYXJyYXkucHVzaCgnICAgPHNwPQphbiBjbGFzcz0zRCJoZWxwLWJ1dHRvbiIgZGF0
YS10b2dnbGU9M0QidG9vbHRpcCIgZGF0YS1wbGFjZW1lbnQ9M0QidG9wIiB0aXQ9CmxlPTNEIlZp
c2l0IExpYnJhcmllcyBXaWtpIj48YSBocmVmPTNEImh0dHBzOi8vd2lraS5nYWxheHlwcm9qZWN0
Lm9yZy9EYXRhTD0KaWJyYXJpZXMvc2NyZWVuL0ZvbGRlckNvbnRlbnRzIiB0YXJnZXQ9M0QiX2Js
YW5rIj48YnV0dG9uIGNsYXNzPTNEInByaW1hcnktPQpidXR0b24iIHR5cGU9M0QiYnV0dG9uIj48
c3BhbiBjbGFzcz0zRCJmYSBmYS1xdWVzdGlvbi1jaXJjbGUiPjwvc3Bhbj4gSGVscDw9Ci9idXR0
b24+PC9hPjwvc3Bhbj4nKTt0bXBsX2FycmF5LnB1c2goJyAgICAgICAgICA8c3BhbiBpZD0zRCJm
b2xkZXJfcGFnaW5hdD0Kb3IiIGNsYXNzPTNEImxpYnJhcnktcGFnaW5hdG9yIj4nKTt0bXBsX2Fy
cmF5LnB1c2goIiAgICAgICAgICA8L3NwYW4+Iik7dG1wPQpsX2FycmF5LnB1c2goIiA8L2Rpdj4i
KTt0bXBsX2FycmF5LnB1c2goJyA8ZGl2IGlkPTNEImZvbGRlcl9pdGVtc19lbGVtZW50Ij49Cicp
O3RtcGxfYXJyYXkucHVzaCgiIDwvZGl2PiIpO3RtcGxfYXJyYXkucHVzaCgiPC9kaXY+Iik7cmV0
dXJuIF8udGVtcGxhdGUodD0KbXBsX2FycmF5LmpvaW4oIiIpKX0sdGVtcGxhdGVMaWJJbmZvSW5N
b2RhbDpmdW5jdGlvbigpe3RtcGxfYXJyYXk9M0RbXTt0bXBsPQpfYXJyYXkucHVzaCgnPGRpdiBp
ZD0zRCJsaWZfaW5mb19tb2RhbCI+Jyk7dG1wbF9hcnJheS5wdXNoKCI8aDI+TGlicmFyeSBuYW09
CmU6PC9oMj4iKTt0bXBsX2FycmF5LnB1c2goJzxwPjwlLSBsaWJyYXJ5LmdldCgibmFtZSIpICU+
PC9wPicpO3RtcGxfYXJyYXkucD0KdXNoKCI8aDM+TGlicmFyeSBkZXNjcmlwdGlvbjo8L2gzPiIp
O3RtcGxfYXJyYXkucHVzaCgnPHA+PCUtIGxpYnJhcnkuZ2V0KCJkPQplc2NyaXB0aW9uIikgJT48
L3A+Jyk7dG1wbF9hcnJheS5wdXNoKCI8aDM+TGlicmFyeSBzeW5vcHNpczo8L2gzPiIpO3RtcGxf
YXI9CnJheS5wdXNoKCc8cD48JS0gbGlicmFyeS5nZXQoInN5bm9wc2lzIikgJT48L3A+Jyk7dG1w
bF9hcnJheS5wdXNoKCI8L2Rpdj4iKT0KO3JldHVybiBfLnRlbXBsYXRlKHRtcGxfYXJyYXkuam9p
bigiIikpfSx0ZW1wbGF0ZU5ld0ZvbGRlckluTW9kYWw6ZnVuY3Rpb24oPQope3RtcGxfYXJyYXk9
M0RbXTt0bXBsX2FycmF5LnB1c2goJzxkaXYgaWQ9M0QibmV3X2ZvbGRlcl9tb2RhbCI+Jyk7dG1w
bF9hcnI9CmF5LnB1c2goIjxmb3JtPiIpO3RtcGxfYXJyYXkucHVzaCgnPGlucHV0IHR5cGU9M0Qi
dGV4dCIgbmFtZT0zRCJOYW1lIiB2YWx1ZT0KPTNEIiIgcGxhY2Vob2xkZXI9M0QiTmFtZSI+Jyk7
dG1wbF9hcnJheS5wdXNoKCc8aW5wdXQgdHlwZT0zRCJ0ZXh0IiBuYW1lPTNEPQoiRGVzY3JpcHRp
b24iIHZhbHVlPTNEIiIgcGxhY2Vob2xkZXI9M0QiRGVzY3JpcHRpb24iPicpO3RtcGxfYXJyYXku
cHVzaCgiPC89CmZvcm0+Iik7dG1wbF9hcnJheS5wdXNoKCI8L2Rpdj4iKTtyZXR1cm4gXy50ZW1w
bGF0ZSh0bXBsX2FycmF5LmpvaW4oIiIpKX0sdD0KZW1wbGF0ZUJ1bGtJbXBvcnRJbk1vZGFsOmZ1
bmN0aW9uKCl7dmFyIGc9M0RbXTtnLnB1c2goJzxzcGFuIGlkPTNEImhpc3RvcnlfPQptb2RhbF9j
b21ib19idWxrIiBzdHlsZT0zRCJ3aWR0aDo5MCU7IG1hcmdpbi1sZWZ0OiAxZW07IG1hcmdpbi1y
aWdodDogMWVtOyA9CiI+Jyk7Zy5wdXNoKCJTZWxlY3QgaGlzdG9yeTogIik7Zy5wdXNoKCc8c2Vs
ZWN0IGlkPTNEImRhdGFzZXRfaW1wb3J0X2J1bGsiID0KbmFtZT0zRCJkYXRhc2V0X2ltcG9ydF9i
dWxrIiBzdHlsZT0zRCJ3aWR0aDo1MCU7IG1hcmdpbi1ib3R0b206IDFlbTsgIj4gJyk7PQpnLnB1
c2goIiAgIDwlIF8uZWFjaChoaXN0b3JpZXMsIGZ1bmN0aW9uKGhpc3RvcnkpIHsgJT4iKTtnLnB1
c2goJyAgICAgICA8b3A9CnRpb24gdmFsdWU9M0QiPCU9M0QgXy5lc2NhcGUoaGlzdG9yeS5nZXQo
ImlkIikpICU+Ij48JT0zRCBfLmVzY2FwZShoaXN0b3J5Lj0KZ2V0KCJuYW1lIikpICU+PC9vcHRp
b24+Jyk7Zy5wdXNoKCIgICA8JSB9KTsgJT4iKTtnLnB1c2goIjwvc2VsZWN0PiIpO2cucHVzPQpo
KCI8L3NwYW4+Iik7cmV0dXJuIF8udGVtcGxhdGUoZy5qb2luKCIiKSl9LHRlbXBsYXRlSW1wb3J0
SW50b0hpc3RvcnlQcm9ncmU9CnNzQmFyOmZ1bmN0aW9uKCl7dmFyIGc9M0RbXTtnLnB1c2goJzxk
aXYgY2xhc3M9M0QiaW1wb3J0X3RleHQiPicpO2cucHVzaCgiST0KbXBvcnRpbmcgc2VsZWN0ZWQg
ZGF0YXNldHMgdG8gaGlzdG9yeSA8Yj48JT0zRCBfLmVzY2FwZShoaXN0b3J5X25hbWUpICU+PC9i
PQo+Iik7Zy5wdXNoKCI8L2Rpdj4iKTtnLnB1c2goJzxkaXYgY2xhc3M9M0QicHJvZ3Jlc3MiPicp
O2cucHVzaCgnICAgPGRpdiBjbGE9CnNzPTNEInByb2dyZXNzLWJhciBwcm9ncmVzcy1iYXItaW1w
b3J0IiByb2xlPTNEInByb2dyZXNzYmFyIiBhcmlhLXZhbHVlbm93PQo9M0QiMCIgYXJpYS12YWx1
ZW1pbj0zRCIwIiBhcmlhLXZhbHVlbWF4PTNEIjEwMCIgc3R5bGU9M0Qid2lkdGg6IDAwJTsiPicp
O2c9Ci5wdXNoKCcgICAgICAgPHNwYW4gY2xhc3M9M0QiY29tcGxldGlvbl9zcGFuIj4wJSBDb21w
bGV0ZTwvc3Bhbj4nKTtnLnB1c2goIj0KICAgPC9kaXY+Iik7Zy5wdXNoKCI8L2Rpdj4iKTtnLnB1
c2goIiIpO3JldHVybiBfLnRlbXBsYXRlKGcuam9pbigiIikpfSx0ZW1wPQpsYXRlQWRkaW5nRGF0
YXNldHNQcm9ncmVzc0JhcjpmdW5jdGlvbigpe3ZhciBnPTNEW107Zy5wdXNoKCc8ZGl2IGNsYXNz
PTNEImk9Cm1wb3J0X3RleHQiPicpO2cucHVzaCgiQWRkaW5nIHNlbGVjdGVkIGRhdGFzZXRzIHRv
IGxpYnJhcnkgZm9sZGVyIDxiPjwlPTNEID0KXy5lc2NhcGUoZm9sZGVyX25hbWUpICU+PC9iPiIp
O2cucHVzaCgiPC9kaXY+Iik7Zy5wdXNoKCc8ZGl2IGNsYXNzPTNEInByb2dyPQplc3MiPicpO2cu
cHVzaCgnICAgPGRpdiBjbGFzcz0zRCJwcm9ncmVzcy1iYXIgcHJvZ3Jlc3MtYmFyLWltcG9ydCIg
cm9sZT0zRCI9CnByb2dyZXNzYmFyIiBhcmlhLXZhbHVlbm93PTNEIjAiIGFyaWEtdmFsdWVtaW49
M0QiMCIgYXJpYS12YWx1ZW1heD0zRCIxMDAiID0Kc3R5bGU9M0Qid2lkdGg6IDAwJTsiPicpO2cu
cHVzaCgnICAgICAgIDxzcGFuIGNsYXNzPTNEImNvbXBsZXRpb25fc3BhbiI+MCUgPQpDb21wbGV0
ZTwvc3Bhbj4nKTtnLnB1c2goIiAgIDwvZGl2PiIpO2cucHVzaCgiPC9kaXY+Iik7Zy5wdXNoKCIi
KTtyZXR1cm4gXy49CnRlbXBsYXRlKGcuam9pbigiIikpfSx0ZW1wbGF0ZURlbGV0aW5nRGF0YXNl
dHNQcm9ncmVzc0JhcjpmdW5jdGlvbigpe3ZhciBnPQo9M0RbXTtnLnB1c2goJzxkaXYgY2xhc3M9
M0QiaW1wb3J0X3RleHQiPicpO2cucHVzaCgiPC9kaXY+Iik7Zy5wdXNoKCc8ZGl2IGM9Cmxhc3M9
M0QicHJvZ3Jlc3MiPicpO2cucHVzaCgnICAgPGRpdiBjbGFzcz0zRCJwcm9ncmVzcy1iYXIgcHJv
Z3Jlc3MtYmFyLWltcD0Kb3J0IiByb2xlPTNEInByb2dyZXNzYmFyIiBhcmlhLXZhbHVlbm93PTNE
IjAiIGFyaWEtdmFsdWVtaW49M0QiMCIgYXJpYS12YWx1PQplbWF4PTNEIjEwMCIgc3R5bGU9M0Qi
d2lkdGg6IDAwJTsiPicpO2cucHVzaCgnICAgICAgIDxzcGFuIGNsYXNzPTNEImNvbXBsZXQ9Cmlv
bl9zcGFuIj4wJSBDb21wbGV0ZTwvc3Bhbj4nKTtnLnB1c2goIiAgIDwvZGl2PiIpO2cucHVzaCgi
PC9kaXY+Iik7Zy5wdXNoKD0KIiIpO3JldHVybiBfLnRlbXBsYXRlKGcuam9pbigiIikpfSx0ZW1w
bGF0ZUJyb3dzZXJNb2RhbDpmdW5jdGlvbigpe3ZhciBnPTNEPQpbXTtnLnB1c2goJzxkaXYgaWQ9
M0QiZmlsZV9icm93c2VyX21vZGFsIj4nKTtnLnB1c2goJzxkaXYgY2xhc3M9M0QiYWxlcnQgYWw9
CmVydC1pbmZvIGpzdHJlZS1maWxlcy1tZXNzYWdlIj5BbGwgZmlsZXMgeW91IHNlbGVjdCB3aWxs
IGJlIGltcG9ydGVkIGludG8gdD0KaGUgY3VycmVudCBmb2xkZXIuPC9kaXY+Jyk7Zy5wdXNoKCc8
ZGl2IGNsYXNzPTNEImFsZXJ0IGFsZXJ0LWluZm8ganN0cmVlLWZvPQpsZGVycy1tZXNzYWdlIiBz
dHlsZT0zRCJkaXNwbGF5Om5vbmU7Ij5BbGwgZmlsZXMgd2l0aGluIHRoZSBzZWxlY3RlZCBmb2xk
ZXI9CnMgYW5kIHRoZWlyIHN1YmZvbGRlcnMgd2lsbCBiZSBpbXBvcnRlZCBpbnRvIHRoZSBjdXJy
ZW50IGZvbGRlci48L2Rpdj4nKTtnLj0KcHVzaCgnPGRpdiBzdHlsZT0zRCJtYXJnaW4tYm90dG9t
OjFlbTsiPicpO2cucHVzaCgnPGxhYmVsIGNsYXNzPTNEInJhZGlvLWluPQpsaW5lIj4nKTtnLnB1
c2goJyAgPGlucHV0IHRpdGxlPTNEIlN3aXRjaCB0byBzZWxlY3RpbmcgZmlsZXMiIHR5cGU9M0Qi
cmFkaW89CiIgbmFtZT0zRCJqc3RyZWUtcmFkaW8iIHZhbHVlPTNEImpzdHJlZS1kaXNhYmxlLWZv
bGRlcnMiIGNoZWNrZWQ9M0QiY2hlY2tlZD0KIj4gRmlsZXMnKTtnLnB1c2goIjwvbGFiZWw+Iik7
Zy5wdXNoKCc8bGFiZWwgY2xhc3M9M0QicmFkaW8taW5saW5lIj4nKTtnLnB1PQpzaCgnICA8aW5w
dXQgdGl0bGU9M0QiU3dpdGNoIHRvIHNlbGVjdGluZyBmb2xkZXJzIiB0eXBlPTNEInJhZGlvIiBu
YW1lPTNEImo9CnN0cmVlLXJhZGlvIiB2YWx1ZT0zRCJqc3RyZWUtZGlzYWJsZS1maWxlcyI+IEZv
bGRlcnMnKTtnLnB1c2goIjwvbGFiZWw+Iik7Zz0KLnB1c2goIjwvZGl2PiIpO2cucHVzaCgnPGRp
diBzdHlsZT0zRCJtYXJnaW4tYm90dG9tOjFlbTsiPicpO2cucHVzaCgnPGxhYmVsPQogY2xhc3M9
M0QiY2hlY2tib3gtaW5saW5lIGpzdHJlZS1wcmVzZXJ2ZS1zdHJ1Y3R1cmUiIHN0eWxlPTNEImRp
c3BsYXk6bm9uZTs9CiI+Jyk7Zy5wdXNoKCcgICA8aW5wdXQgY2xhc3M9M0QicHJlc2VydmUtY2hl
Y2tib3giIHR5cGU9M0QiY2hlY2tib3giIHZhbHVlPQo9M0QicHJlc2VydmVfZGlyZWN0b3J5X3N0
cnVjdHVyZSI+Jyk7Zy5wdXNoKCJQcmVzZXJ2ZSBkaXJlY3Rvcnkgc3RydWN0dXJlIik9CjtnLnB1
c2goIiA8L2xhYmVsPiIpO2cucHVzaCgnPGxhYmVsIGNsYXNzPTNEImNoZWNrYm94LWlubGluZSBq
c3RyZWUtbGluay1maT0KbGVzIiBzdHlsZT0zRCJkaXNwbGF5Om5vbmU7Ij4nKTtnLnB1c2goJyAg
IDxpbnB1dCBjbGFzcz0zRCJsaW5rLWNoZWNrYm94IiB0PQp5cGU9M0QiY2hlY2tib3giIHZhbHVl
PTNEImxpbmtfZmlsZXMiPicpO2cucHVzaCgiTGluayBmaWxlcyBpbnN0ZWFkIG9mIGNvcHk9Cmlu
ZyIpO2cucHVzaCgiIDwvbGFiZWw+Iik7Zy5wdXNoKCI8L2Rpdj4iKTtnLnB1c2goJzxkaXYgaWQ9
M0QianN0cmVlX2Jyb3dzZT0KciI+Jyk7Zy5wdXNoKCI8L2Rpdj4iKTtnLnB1c2goIjxociAvPiIp
O2cucHVzaCgiPHA+WW91IGNhbiBzZXQgZXh0ZW5zaW9uIHR5PQpwZSBhbmQgZ2Vub21lIGZvciBh
bGwgaW1wb3J0ZWQgZGF0YXNldHMgYXQgb25jZTo8L3A+Iik7Zy5wdXNoKCI8ZGl2PiIpO2cucHU9
CnNoKCdUeXBlOiA8c3BhbiBpZD0zRCJsaWJyYXJ5X2V4dGVuc2lvbl9zZWxlY3QiIGNsYXNzPTNE
ImxpYnJhcnktZXh0ZW5zaW9uLT0Kc2VsZWN0IiAvPicpO2cucHVzaCgnICBHZW5vbWU6IDxzcGFu
IGlkPTNEImxpYnJhcnlfZ2Vub21lX3NlbGVjdCIgY2xhc3M9M0QiPQpsaWJyYXJ5LWdlbm9tZS1z
ZWxlY3QiIC8+Jyk7Zy5wdXNoKCI8L2Rpdj4iKTtnLnB1c2goIjwvZGl2PiIpO3JldHVybiBfLnRl
bXA9CmxhdGUoZy5qb2luKCIiKSl9LHRlbXBsYXRlSW1wb3J0UGF0aE1vZGFsOmZ1bmN0aW9uKCl7
dmFyIGc9M0RbXTtnLnB1c2goJzxkaT0KdiBpZD0zRCJmaWxlX2Jyb3dzZXJfbW9kYWwiPicpO2cu
cHVzaCgnPGRpdiBjbGFzcz0zRCJhbGVydCBhbGVydC1pbmZvIGpzdHJlPQplLWZvbGRlcnMtbWVz
c2FnZSI+QWxsIGZpbGVzIHdpdGhpbiB0aGUgZ2l2ZW4gZm9sZGVycyBhbmQgdGhlaXIgc3ViZm9s
ZGVycyA9CndpbGwgYmUgaW1wb3J0ZWQgaW50byB0aGUgY3VycmVudCBmb2xkZXIuPC9kaXY+Jyk7
Zy5wdXNoKCc8ZGl2IHN0eWxlPTNEIm1hcj0KZ2luLWJvdHRvbTogMC41ZW07Ij4nKTtnLnB1c2go
JzxsYWJlbCBjbGFzcz0zRCJjaGVja2JveC1pbmxpbmUganN0cmVlLXByZXNlPQpydmUtc3RydWN0
dXJlIj4nKTtnLnB1c2goJyAgIDxpbnB1dCBjbGFzcz0zRCJwcmVzZXJ2ZS1jaGVja2JveCIgdHlw
ZT0zRCJjaGU9CmNrYm94IiB2YWx1ZT0zRCJwcmVzZXJ2ZV9kaXJlY3Rvcnlfc3RydWN0dXJlIj4n
KTtnLnB1c2goIlByZXNlcnZlIGRpcmVjdG9yeT0KIHN0cnVjdHVyZSIpO2cucHVzaCgiIDwvbGFi
ZWw+Iik7Zy5wdXNoKCc8bGFiZWwgY2xhc3M9M0QiY2hlY2tib3gtaW5saW5lIGpzPQp0cmVlLWxp
bmstZmlsZXMiPicpO2cucHVzaCgnICAgPGlucHV0IGNsYXNzPTNEImxpbmstY2hlY2tib3giIHR5
cGU9M0QiY2hlY2s9CmJveCIgdmFsdWU9M0QibGlua19maWxlcyI+Jyk7Zy5wdXNoKCJMaW5rIGZp
bGVzIGluc3RlYWQgb2YgY29weWluZyIpO2cucHVzaD0KKCIgPC9sYWJlbD4iKTtnLnB1c2goIjwv
ZGl2PiIpO2cucHVzaCgnPHRleHRhcmVhIGlkPTNEImltcG9ydF9wYXRocyIgY2xhc3M9Cj0zRCJm
b3JtLWNvbnRyb2wiIHJvd3M9M0QiNSIgcGxhY2Vob2xkZXI9M0QiQWJzb2x1dGUgcGF0aHMgKG9y
IHBhdGhzIHJlbGF0aT0KdmUgdG8gR2FsYXh5IHJvb3QpIHNlcGFyYXRlZCBieSBuZXdsaW5lIj48
L3RleHRhcmVhPicpO2cucHVzaCgiPGhyIC8+Iik7Zy5wPQp1c2goIjxwPllvdSBjYW4gc2V0IGV4
dGVuc2lvbiB0eXBlIGFuZCBnZW5vbWUgZm9yIGFsbCBpbXBvcnRlZCBkYXRhc2V0cyBhdCA9Cm9u
Y2U6PC9wPiIpO2cucHVzaCgiPGRpdj4iKTtnLnB1c2goJ1R5cGU6IDxzcGFuIGlkPTNEImxpYnJh
cnlfZXh0ZW5zaW9uX3NlbD0KZWN0IiBjbGFzcz0zRCJsaWJyYXJ5LWV4dGVuc2lvbi1zZWxlY3Qi
IC8+Jyk7Zy5wdXNoKCcgIEdlbm9tZTogPHNwYW4gaWQ9M0QiPQpsaWJyYXJ5X2dlbm9tZV9zZWxl
Y3QiIGNsYXNzPTNEImxpYnJhcnktZ2Vub21lLXNlbGVjdCIgLz4nKTtnLnB1c2goIjwvZGl2PiI9
Cik7Zy5wdXNoKCI8L2Rpdj4iKTtyZXR1cm4gXy50ZW1wbGF0ZShnLmpvaW4oIiIpKX0sdGVtcGxh
dGVBZGRGaWxlc0Zyb21IaXN0bz0Kcnk6ZnVuY3Rpb24oKXt2YXIgZz0zRFtdO2cucHVzaCgnPGRp
diBpZD0zRCJhZGRfZmlsZXNfbW9kYWwiPicpO2cucHVzaCgnPGRpPQp2IGlkPTNEImhpc3Rvcnlf
bW9kYWxfY29tYm9fYnVsayI+Jyk7Zy5wdXNoKCJTZWxlY3QgaGlzdG9yeTogICIpO2cucHVzaCgn
PHM9CmVsZWN0IGlkPTNEImRhdGFzZXRfYWRkX2J1bGsiIG5hbWU9M0QiZGF0YXNldF9hZGRfYnVs
ayIgc3R5bGU9M0Qid2lkdGg6NjYlOz0KICI+ICcpO2cucHVzaCgiICAgPCUgXy5lYWNoKGhpc3Rv
cmllcywgZnVuY3Rpb24oaGlzdG9yeSkgeyAlPiIpO2cucHVzaCgnICAgPQogICAgPG9wdGlvbiB2
YWx1ZT0zRCI8JT0zRCBfLmVzY2FwZShoaXN0b3J5LmdldCgiaWQiKSkgJT4iPjwlPTNEIF8uZXNj
YXBlKGg9CmlzdG9yeS5nZXQoIm5hbWUiKSkgJT48L29wdGlvbj4nKTtnLnB1c2goIiAgIDwlIH0p
OyAlPiIpO2cucHVzaCgiPC9zZWxlY3Q+Ij0KKTtnLnB1c2goIjwvZGl2PiIpO2cucHVzaCgiPGJy
Lz4iKTtnLnB1c2goJzxkaXYgaWQ9M0Qic2VsZWN0ZWRfaGlzdG9yeV9jb250PQplbnQiPicpO2cu
cHVzaCgiPC9kaXY+Iik7Zy5wdXNoKCI8L2Rpdj4iKTtyZXR1cm4gXy50ZW1wbGF0ZShnLmpvaW4o
IiIpKX0sdGU9Cm1wbGF0ZUhpc3RvcnlDb250ZW50czpmdW5jdGlvbigpe3ZhciBnPTNEW107Zy5w
dXNoKCI8c3Ryb25nPkNob29zZSB0aGUgZGF0YT0Kc2V0cyB0byBpbXBvcnQ6PC9zdHJvbmc+Iik7
Zy5wdXNoKCI8dWw+Iik7Zy5wdXNoKCIgPCUgXy5lYWNoKGhpc3RvcnlfY29udGVuPQp0cywgZnVu
Y3Rpb24oaGlzdG9yeV9pdGVtKSB7ICU+Iik7Zy5wdXNoKCcgPGxpIGRhdGEtaWQ9M0QiPCU9M0Qg
Xy5lc2NhcGUoaGk9CnN0b3J5X2l0ZW0uZ2V0KCJpZCIpKSAlPiI+Jyk7Zy5wdXNoKCcgICA8aW5w
dXQgc3R5bGU9M0QibWFyZ2luOiAwOyIgdHlwZT0zRD0KImNoZWNrYm94Ij48JT0zRCBfLmVzY2Fw
ZShoaXN0b3J5X2l0ZW0uZ2V0KCJoaWQiKSkgJT46IDwlPTNEIF8uZXNjYXBlKGhpc3RvPQpyeV9p
dGVtLmdldCgibmFtZSIpKSAlPicpO2cucHVzaCgiIDwvbGk+Iik7Zy5wdXNoKCIgPCUgfSk7ICU+
Iik7Zy5wdXNoKCI8L3U9Cmw+Iik7cmV0dXJuIF8udGVtcGxhdGUoZy5qb2luKCIiKSl9LHRlbXBs
YXRlUGFnaW5hdG9yOmZ1bmN0aW9uKCl7dG1wbF9hcnJheT0KPTNEW107dG1wbF9hcnJheS5wdXNo
KCcgICA8dWwgY2xhc3M9M0QicGFnaW5hdGlvbiBwYWdpbmF0aW9uLXNtIj4nKTt0bXBsX2FyPQpy
YXkucHVzaCgiICAgICAgIDwlIGlmICggKCBzaG93X3BhZ2UgLSAxICkgPiAwICkgeyAlPiIpO3Rt
cGxfYXJyYXkucHVzaCgiICA9CiAgICAgICAgIDwlIGlmICggKCBzaG93X3BhZ2UgLSAxICkgPiBw
YWdlX2NvdW50ICkgeyAlPiIpO3RtcGxfYXJyYXkucHVzaCgnID0KICAgICAgICAgICAgICA8bGk+
PGEgaHJlZj0zRCIjZm9sZGVycy88JT0zRCBpZCAlPi9wYWdlLzEiPjxzcGFuIGNsYXNzPTNEImZh
PQogZmEtYW5nbGUtZG91YmxlLWxlZnQiPjwvc3Bhbj48L2E+PC9saT4nKTt0bXBsX2FycmF5LnB1
c2goJyAgICAgICAgICAgICAgIDw9CmxpIGNsYXNzPTNEImRpc2FibGVkIj48YSBocmVmPTNEIiNm
b2xkZXJzLzwlPTNEIGlkICU+L3BhZ2UvPCUgcHJpbnQoIHNob3dfcD0KYWdlICkgJT4iPjwlIHBy
aW50KCBzaG93X3BhZ2UgLSAxICkgJT48L2E+PC9saT4nKTt0bXBsX2FycmF5LnB1c2goIiAgICAg
ICAgPQogICA8JSB9IGVsc2UgeyAlPiIpO3RtcGxfYXJyYXkucHVzaCgnICAgICAgICAgICAgICAg
PGxpPjxhIGhyZWY9M0QiI2ZvbGRlcnM9Ci88JT0zRCBpZCAlPi9wYWdlLzEiPjxzcGFuIGNsYXNz
PTNEImZhIGZhLWFuZ2xlLWRvdWJsZS1sZWZ0Ij48L3NwYW4+PC9hPjwvbD0KaT4nKTt0bXBsX2Fy
cmF5LnB1c2goJyAgICAgICAgICAgICAgIDxsaT48YSBocmVmPTNEIiNmb2xkZXJzLzwlPTNEIGlk
ICU+L3BhPQpnZS88JSBwcmludCggc2hvd19wYWdlIC0gMSApICU+Ij48JSBwcmludCggc2hvd19w
YWdlIC0gMSApICU+PC9hPjwvbGk+Jyk7dG09CnBsX2FycmF5LnB1c2goIiAgICAgICAgICAgPCUg
fSAlPiIpO3RtcGxfYXJyYXkucHVzaCgiICAgICAgIDwlIH0gZWxzZSB7ICU+Ij0KKTt0bXBsX2Fy
cmF5LnB1c2goJyAgICAgICAgICAgPGxpIGNsYXNzPTNEImRpc2FibGVkIj48YSBocmVmPTNEIiNm
b2xkZXJzLzwlPQo9M0QgaWQgJT4vcGFnZS8xIj48c3BhbiBjbGFzcz0zRCJmYSBmYS1hbmdsZS1k
b3VibGUtbGVmdCI+PC9zcGFuPjwvYT48L2xpPic9Cik7dG1wbF9hcnJheS5wdXNoKCcgICAgICAg
ICAgIDxsaSBjbGFzcz0zRCJkaXNhYmxlZCI+PGEgaHJlZj0zRCIjZm9sZGVycy88JT0KPTNEIGlk
ICU+L3BhZ2UvPCUgcHJpbnQoIHNob3dfcGFnZSApICU+Ij48JSBwcmludCggc2hvd19wYWdlIC0g
MSApICU+PC9hPjwvPQpsaT4nKTt0bXBsX2FycmF5LnB1c2goIiAgICAgICA8JSB9ICU+Iik7dG1w
bF9hcnJheS5wdXNoKCcgICAgICAgPGxpIGNsYXNzPQo9M0QiYWN0aXZlIj4nKTt0bXBsX2FycmF5
LnB1c2goJyAgICAgICA8YSBocmVmPTNEIiNmb2xkZXJzLzwlPTNEIGlkICU+L3BhZ2U9Ci88JSBw
cmludCggc2hvd19wYWdlICkgJT4iPjwlIHByaW50KCBzaG93X3BhZ2UgKSAlPjwvYT4nKTt0bXBs
X2FycmF5LnB1c2goIj0KICAgICAgIDwvbGk+Iik7dG1wbF9hcnJheS5wdXNoKCIgICAgICAgPCUg
aWYgKCAoIHNob3dfcGFnZSApIDwgcGFnZV9jb3VudCApPQogeyAlPiIpO3RtcGxfYXJyYXkucHVz
aCgnICAgICAgICAgICA8bGk+PGEgaHJlZj0zRCIjZm9sZGVycy88JT0zRCBpZCAlPi9wYWc9CmUv
PCUgcHJpbnQoIHNob3dfcGFnZSArIDEgKSAlPiI+PCUgcHJpbnQoIHNob3dfcGFnZSArIDEgKSAl
PjwvYT48L2xpPicpO3RtcD0KbF9hcnJheS5wdXNoKCcgICAgICAgICAgIDxsaT48YSBocmVmPTNE
IiNmb2xkZXJzLzwlPTNEIGlkICU+L3BhZ2UvPCUgcHJpbnQoPQogcGFnZV9jb3VudCApICU+Ij48
c3BhbiBjbGFzcz0zRCJmYSBmYS1hbmdsZS1kb3VibGUtcmlnaHQiPjwvc3Bhbj48L2E+PC9saT49
CicpO3RtcGxfYXJyYXkucHVzaCgiICAgICAgIDwlIH0gZWxzZSB7ICU+Iik7dG1wbF9hcnJheS5w
dXNoKCcgICAgICAgICAgIDxsaT0KIGNsYXNzPTNEImRpc2FibGVkIj48YSBocmVmPTNEIiNmb2xk
ZXJzLzwlPTNEIGlkICU+L3BhZ2UvPCUgcHJpbnQoIHNob3dfcGFnPQplICApICU+Ij48JSBwcmlu
dCggc2hvd19wYWdlICsgMSApICU+PC9hPjwvbGk+Jyk7dG1wbF9hcnJheS5wdXNoKCcgICAgICAg
ICA9CiAgPGxpIGNsYXNzPTNEImRpc2FibGVkIj48YSBocmVmPTNEIiNmb2xkZXJzLzwlPTNEIGlk
ICU+L3BhZ2UvPCUgcHJpbnQoIHBhZz0KZV9jb3VudCApICU+Ij48c3BhbiBjbGFzcz0zRCJmYSBm
YS1hbmdsZS1kb3VibGUtcmlnaHQiPjwvc3Bhbj48L2E+PC9saT4nKTt0PQptcGxfYXJyYXkucHVz
aCgiICAgICAgIDwlIH0gJT4iKTt0bXBsX2FycmF5LnB1c2goIiAgIDwvdWw+Iik7dG1wbF9hcnJh
eS5wdXM9CmgoIiAgIDxzcGFuPiIpO3RtcGxfYXJyYXkucHVzaCgnICAgICAgIHNob3dpbmcgPGEg
ZGF0YS10b2dnbGU9M0QidG9vbHRpcCIgZD0KYXRhLXBsYWNlbWVudD0zRCJ0b3AiIHRpdGxlPTNE
IkNsaWNrIHRvIGNoYW5nZSB0aGUgbnVtYmVyIG9mIGl0ZW1zIG9uIHBhZ2UiPQogaWQ9M0QicGFn
ZV9zaXplX3Byb21wdCI+PCUtIGl0ZW1zX3Nob3duICU+PC9hPiBvZiA8JS0gdG90YWxfaXRlbXNf
Y291bnQgJT49CiBpdGVtcycpO3RtcGxfYXJyYXkucHVzaCgiICAgPC9zcGFuPiIpO3JldHVybiBf
LnRlbXBsYXRlKHRtcGxfYXJyYXkuam9pbigiIj0KKSl9LH0pO3JldHVybntGb2xkZXJUb29sYmFy
VmlldzpifX0pOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKCmRpZmYgLXIgNDlkNTBiY2U0
NjMyMDZmNDQ1MDYzZDJiMjdiMmYyYjM5M2FkYmUxMSAtciAxY2NmNDBiZGFmYTE4NGIzYmUzMWFh
Nz0KYjFlY2RmY2UzYmM3MDVlZmIgc3RhdGljL3NjcmlwdHMvcGFja2VkL212Yy9saWJyYXJ5L2xp
YnJhcnktbGlicmFyeS12aWV3LmpzCi0tLSBhL3N0YXRpYy9zY3JpcHRzL3BhY2tlZC9tdmMvbGli
cmFyeS9saWJyYXJ5LWxpYnJhcnktdmlldy5qcworKysgYi9zdGF0aWMvc2NyaXB0cy9wYWNrZWQv
bXZjL2xpYnJhcnkvbGlicmFyeS1saWJyYXJ5LXZpZXcuanMKQEAgLTEsMSArMSwxIEBACi1kZWZp
bmUoWyJsaWJzL3RvYXN0ciIsIm12Yy9saWJyYXJ5L2xpYnJhcnktbW9kZWwiLCJtdmMvdWkvdWkt
c2VsZWN0Il0sZnVuYz0KdGlvbihkLGMsYSl7dmFyIGI9M0RCYWNrYm9uZS5WaWV3LmV4dGVuZCh7
ZWw6IiNjZW50ZXIiLG1vZGVsOm51bGwsb3B0aW9uczp7PQp9LGV2ZW50czp7ImNsaWNrIC50b29s
YnRuX3NhdmVfcGVybWlzc2lvbnMiOiJzYXZlUGVybWlzc2lvbnMifSxpbml0aWFsaXplOmY9CnVu
Y3Rpb24oZSl7dGhpcy5vcHRpb25zPTNEXy5leHRlbmQodGhpcy5vcHRpb25zLGUpO2lmKHRoaXMu
b3B0aW9ucy5pZCl7dGhpcz0KLmZldGNoTGlicmFyeSgpfX0sZmV0Y2hMaWJyYXJ5OmZ1bmN0aW9u
KGUpe3RoaXMub3B0aW9ucz0zRF8uZXh0ZW5kKHRoaXMub3B0PQppb25zLGUpO3RoaXMubW9kZWw9
M0RuZXcgYy5MaWJyYXJ5KHtpZDp0aGlzLm9wdGlvbnMuaWR9KTt2YXIgZj0zRHRoaXM7dGhpcy49
Cm1vZGVsLmZldGNoKHtzdWNjZXNzOmZ1bmN0aW9uKCl7aWYoZi5vcHRpb25zLnNob3dfcGVybWlz
c2lvbnMpe2Yuc2hvd1Blcm1pcz0Kc2lvbnMoKX1lbHNle2YucmVuZGVyKCl9fSxlcnJvcjpmdW5j
dGlvbihoLGcpe2lmKHR5cGVvZiBnLnJlc3BvbnNlSlNPTiE9M0Q9Cj0zRCJ1bmRlZmluZWQiKXtk
LmVycm9yKGcucmVzcG9uc2VKU09OLmVycl9tc2crIiBDbGljayB0aGlzIHRvIGdvIGJhY2suIiwi
Ij0KLHtvbmNsaWNrOmZ1bmN0aW9uKCl7R2FsYXh5LmxpYnJhcmllcy5saWJyYXJ5X3JvdXRlci5i
YWNrKCl9fSl9ZWxzZXtkLmVycm9yPQooIkFuIGVycm9yIG9jdXJyZWQuIENsaWNrIHRoaXMgdG8g
Z28gYmFjay4iLCIiLHtvbmNsaWNrOmZ1bmN0aW9uKCl7R2FsYXh5Lmw9CmlicmFyaWVzLmxpYnJh
cnlfcm91dGVyLmJhY2soKX19KX19fSl9LHJlbmRlcjpmdW5jdGlvbihlKXskKCIudG9vbHRpcCIp
LnJlbT0Kb3ZlKCk7dGhpcy5vcHRpb25zPTNEXy5leHRlbmQodGhpcy5vcHRpb25zLGUpO3ZhciBm
PTNEdGhpcy50ZW1wbGF0ZUxpYnJhcnkoPQopO3RoaXMuJGVsLmh0bWwoZih7aXRlbTp0aGlzLm1v
ZGVsfSkpOyQoIiNjZW50ZXIgW2RhdGEtdG9nZ2xlXSIpLnRvb2x0aXAoKX09CixzaGFyZURhdGFz
ZXQ6ZnVuY3Rpb24oKXtkLmluZm8oIkZlYXR1cmUgY29taW5nIHNvb24uIil9LGdvQmFjazpmdW5j
dGlvbigpez0KR2FsYXh5LmxpYnJhcmllcy5saWJyYXJ5X3JvdXRlci5iYWNrKCl9LHNob3dQZXJt
aXNzaW9uczpmdW5jdGlvbihmKXt0aGlzLm9wPQp0aW9ucz0zRF8uZXh0ZW5kKHRoaXMub3B0aW9u
cyxmKTskKCIudG9vbHRpcCIpLnJlbW92ZSgpO2lmKHRoaXMub3B0aW9ucy5mZXQ9CmNoZWRfcGVy
bWlzc2lvbnMhPTNEPTNEdW5kZWZpbmVkKXtpZih0aGlzLm9wdGlvbnMuZmV0Y2hlZF9wZXJtaXNz
aW9ucy5hY2Nlcz0Kc19saWJyYXJ5X3JvbGVfbGlzdC5sZW5ndGg9M0Q9M0Q9M0QwKXt0aGlzLm1v
ZGVsLnNldCh7aXNfdW5yZXN0cmljdGVkOnRydWV9PQopfWVsc2V7dGhpcy5tb2RlbC5zZXQoe2lz
X3VucmVzdHJpY3RlZDpmYWxzZX0pfX12YXIgaD0zRGZhbHNlO2lmKEdhbGF4eS5jdXI9CnJVc2Vy
KXtoPTNER2FsYXh5LmN1cnJVc2VyLmlzQWRtaW4oKX12YXIgZz0zRHRoaXMudGVtcGxhdGVMaWJy
YXJ5UGVybWlzc2lvbj0KcygpO3RoaXMuJGVsLmh0bWwoZyh7bGlicmFyeTp0aGlzLm1vZGVsLGlz
X2FkbWluOmh9KSk7dmFyIGU9M0R0aGlzO2lmKHRoaXMuPQpvcHRpb25zLmZldGNoZWRfcGVybWlz
c2lvbnM9M0Q9M0Q9M0R1bmRlZmluZWQpeyQuZ2V0KCIvYXBpL2xpYnJhcmllcy8iK2UuaWQ9Cisi
L3Blcm1pc3Npb25zP3Njb3BlPTNEY3VycmVudCIpLmRvbmUoZnVuY3Rpb24oaSl7ZS5wcmVwYXJl
U2VsZWN0Qm94ZXMoe2ZldD0KY2hlZF9wZXJtaXNzaW9uczppfSl9KS5mYWlsKGZ1bmN0aW9uKCl7
ZC5lcnJvcigiQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgYXR0PQplbXB0aW5nIHRvIGZldGNoIGxp
YnJhcnkgcGVybWlzc2lvbnMuIil9KX1lbHNle3RoaXMucHJlcGFyZVNlbGVjdEJveGVzKHt9KX09
CiQoIiNjZW50ZXIgW2RhdGEtdG9nZ2xlXSIpLnRvb2x0aXAoKTskKCIjY2VudGVyIikuY3NzKCJv
dmVyZmxvdyIsImF1dG8iKX0sXz0Kc2VyaWFsaXplUm9sZXM6ZnVuY3Rpb24oZyl7dmFyIGU9M0Rb
XTtmb3IodmFyIGY9M0QwO2Y8Zy5sZW5ndGg7ZisrKXtlLnB1c2goPQpnW2ZdWzFdKyI6IitnW2Zd
WzBdKX1yZXR1cm4gZX0scHJlcGFyZVNlbGVjdEJveGVzOmZ1bmN0aW9uKGkpe3RoaXMub3B0aW9u
cz0KPTNEXy5leHRlbmQodGhpcy5vcHRpb25zLGkpO3ZhciBlPTNEdGhpcy5vcHRpb25zLmZldGNo
ZWRfcGVybWlzc2lvbnM7dmFyIGc9Cj0zRHRoaXM7dmFyIGY9M0R0aGlzLl9zZXJpYWxpemVSb2xl
cyhlLmFjY2Vzc19saWJyYXJ5X3JvbGVfbGlzdCk7dmFyIGo9M0R0aD0KaXMuX3NlcmlhbGl6ZVJv
bGVzKGUuYWRkX2xpYnJhcnlfaXRlbV9yb2xlX2xpc3QpO3ZhciBoPTNEdGhpcy5fc2VyaWFsaXpl
Um9sPQplcyhlLm1hbmFnZV9saWJyYXJ5X3JvbGVfbGlzdCk7dmFyIGs9M0R0aGlzLl9zZXJpYWxp
emVSb2xlcyhlLm1vZGlmeV9saWJyYXI9Cnlfcm9sZV9saXN0KTtnLmFjY2Vzc1NlbGVjdE9iamVj
dD0zRG5ldyBhLlZpZXcodGhpcy5fY3JlYXRlU2VsZWN0T3B0aW9ucyh0aD0KaXMsImFjY2Vzc19w
ZXJtIixmLHRydWUpKTtnLmFkZFNlbGVjdE9iamVjdD0zRG5ldyBhLlZpZXcodGhpcy5fY3JlYXRl
U2VsZWN0PQpPcHRpb25zKHRoaXMsImFkZF9wZXJtIixqLGZhbHNlKSk7Zy5tYW5hZ2VTZWxlY3RP
YmplY3Q9M0RuZXcgYS5WaWV3KHRoaXMuX2M9CnJlYXRlU2VsZWN0T3B0aW9ucyh0aGlzLCJtYW5h
Z2VfcGVybSIsaCxmYWxzZSkpO2cubW9kaWZ5U2VsZWN0T2JqZWN0PTNEbmV3ID0KYS5WaWV3KHRo
aXMuX2NyZWF0ZVNlbGVjdE9wdGlvbnModGhpcywibW9kaWZ5X3Blcm0iLGssZmFsc2UpKX0sX2Ny
ZWF0ZVNlbGVjPQp0T3B0aW9uczpmdW5jdGlvbihmLGssaSxlKXtlPTNEZT0zRD0zRD0zRHRydWU/
ZTpmYWxzZTt2YXIgaj0zRHttaW5pbXVtSW5wdXQ9Ckxlbmd0aDowLGNzczprLG11bHRpcGxlOnRy
dWUscGxhY2Vob2xkZXI6IkNsaWNrIHRvIHNlbGVjdCBhIHJvbGUiLGNvbnRhaW5lcj0KOmYuJGVs
LmZpbmQoIiMiK2spLGFqYXg6e3VybDoiL2FwaS9saWJyYXJpZXMvIitmLmlkKyIvcGVybWlzc2lv
bnM/c2NvcGU9M0RhPQp2YWlsYWJsZSZpc19saWJyYXJ5X2FjY2Vzcz0zRCIrZSxkYXRhVHlwZToi
anNvbiIscXVpZXRNaWxsaXM6MTAwLGRhdGE6ZnVuY3Q9CmlvbihsLG0pe3JldHVybntxOmwscGFn
ZV9saW1pdDoxMCxwYWdlOm19fSxyZXN1bHRzOmZ1bmN0aW9uKG4sbSl7dmFyIGw9M0QobT0KKjEw
KTxuLnRvdGFsO3JldHVybntyZXN1bHRzOm4ucm9sZXMsbW9yZTpsfX19LGZvcm1hdFJlc3VsdDpm
dW5jdGlvbiBnKGwpe3JlPQp0dXJuIGwubmFtZSsiIHR5cGU6ICIrbC50eXBlfSxmb3JtYXRTZWxl
Y3Rpb246ZnVuY3Rpb24gaChsKXtyZXR1cm4gbC5uYW1lfSw9CmluaXRTZWxlY3Rpb246ZnVuY3Rp
b24obCxuKXt2YXIgbT0zRFtdOyQobC52YWwoKS5zcGxpdCgiLCIpKS5lYWNoKGZ1bmN0aW9uKD0K
KXt2YXIgbz0zRHRoaXMuc3BsaXQoIjoiKTttLnB1c2goe2lkOm9bMF0sbmFtZTpvWzFdfSl9KTtu
KG0pfSxpbml0aWFsRGF0YTppPQosZHJvcGRvd25Dc3NDbGFzczoiYmlnZHJvcCJ9O3JldHVybiBq
fSxjb21pbmdTb29uOmZ1bmN0aW9uKCl7ZC53YXJuaW5nKCJGZWE9CnR1cmUgY29taW5nIHNvb24u
Iil9LGNvcHlUb0NsaXBib2FyZDpmdW5jdGlvbigpe3ZhciBlPTNEQmFja2JvbmUuaGlzdG9yeS5s
bz0KY2F0aW9uLmhyZWY7aWYoZS5sYXN0SW5kZXhPZigiL3Blcm1pc3Npb25zIikhPTNEPTNELTEp
e2U9M0RlLnN1YnN0cigwLGUubGFzPQp0SW5kZXhPZigiL3Blcm1pc3Npb25zIikpfXdpbmRvdy5w
cm9tcHQoIkNvcHkgdG8gY2xpcGJvYXJkOiBDdHJsK0MsIEVudGVyIiw9CmUpfSxtYWtlRGF0YXNl
dFByaXZhdGU6ZnVuY3Rpb24oKXt2YXIgZT0zRHRoaXM7JC5wb3N0KCIvYXBpL2xpYnJhcmllcy9k
YXRhcz0KZXRzLyIrZS5pZCsiL3Blcm1pc3Npb25zP2FjdGlvbj0zRG1ha2VfcHJpdmF0ZSIpLmRv
bmUoZnVuY3Rpb24oZil7ZS5tb2RlbC5zPQpldCh7aXNfdW5yZXN0cmljdGVkOmZhbHNlfSk7ZS5z
aG93UGVybWlzc2lvbnMoe2ZldGNoZWRfcGVybWlzc2lvbnM6Zn0pO2Quc3U9CmNjZXNzKCJUaGUg
ZGF0YXNldCBpcyBub3cgcHJpdmF0ZSB0byB5b3UuIil9KS5mYWlsKGZ1bmN0aW9uKCl7ZC5lcnJv
cigiQW4gZT0KcnJvciBvY2N1cnJlZCB3aGlsZSBhdHRlbXB0aW5nIHRvIG1ha2UgZGF0YXNldCBw
cml2YXRlLiIpfSl9LHJlbW92ZURhdGFzZXRSPQplc3RyaWN0aW9uczpmdW5jdGlvbigpe3ZhciBl
PTNEdGhpczskLnBvc3QoIi9hcGkvbGlicmFyaWVzL2RhdGFzZXRzLyIrZS5pZCs9CiIvcGVybWlz
c2lvbnM/YWN0aW9uPTNEcmVtb3ZlX3Jlc3RyaWN0aW9ucyIpLmRvbmUoZnVuY3Rpb24oZil7ZS5t
b2RlbC5zZXQoez0KaXNfdW5yZXN0cmljdGVkOnRydWV9KTtlLnNob3dQZXJtaXNzaW9ucyh7ZmV0
Y2hlZF9wZXJtaXNzaW9uczpmfSk7ZC5zdWNjZXNzPQooIkFjY2VzcyB0byB0aGlzIGRhdGFzZXQg
aXMgbm93IHVucmVzdHJpY3RlZC4iKX0pLmZhaWwoZnVuY3Rpb24oKXtkLmVycm9yKCI9CkFuIGVy
cm9yIG9jY3VycmVkIHdoaWxlIGF0dGVtcHRpbmcgdG8gbWFrZSBkYXRhc2V0IHVucmVzdHJpY3Rl
ZC4iKX0pfSxfZXh0cj0KYWN0SWRzOmZ1bmN0aW9uKGUpe2lkc19saXN0PTNEW107Zm9yKHZhciBm
PTNEZS5sZW5ndGgtMTtmPj0zRDA7Zi0tKXtpZHNfbGlzPQp0LnB1c2goZVtmXS5pZCl9cmV0dXJu
IGlkc19saXN0fSxzYXZlUGVybWlzc2lvbnM6ZnVuY3Rpb24oaCl7dmFyIGc9M0R0aGlzO3Y9CmFy
IGk9M0R0aGlzLl9leHRyYWN0SWRzKHRoaXMuYWNjZXNzU2VsZWN0T2JqZWN0LiRlbC5zZWxlY3Qy
KCJkYXRhIikpO3ZhciBlPQo9M0R0aGlzLl9leHRyYWN0SWRzKHRoaXMuYWRkU2VsZWN0T2JqZWN0
LiRlbC5zZWxlY3QyKCJkYXRhIikpO3ZhciBqPTNEdGhpcy49Cl9leHRyYWN0SWRzKHRoaXMubWFu
YWdlU2VsZWN0T2JqZWN0LiRlbC5zZWxlY3QyKCJkYXRhIikpO3ZhciBmPTNEdGhpcy5fZXh0cj0K
YWN0SWRzKHRoaXMubW9kaWZ5U2VsZWN0T2JqZWN0LiRlbC5zZWxlY3QyKCJkYXRhIikpOyQucG9z
dCgiL2FwaS9saWJyYXJpZXMvPQoiK2cuaWQrIi9wZXJtaXNzaW9ucz9hY3Rpb249M0RzZXRfcGVy
bWlzc2lvbnMiLHsiYWNjZXNzX2lkc1tdIjppLCJhZGRfaWRzW109CiI6ZSwibWFuYWdlX2lkc1td
IjpqLCJtb2RpZnlfaWRzW10iOmYsfSkuZG9uZShmdW5jdGlvbihrKXtnLnNob3dQZXJtaXNzaW9u
cz0KKHtmZXRjaGVkX3Blcm1pc3Npb25zOmt9KTtkLnN1Y2Nlc3MoIlBlcm1pc3Npb25zIHNhdmVk
LiIpfSkuZmFpbChmdW5jdGlvbigpPQp7ZC5lcnJvcigiQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUg
YXR0ZW1wdGluZyB0byBzZXQgbGlicmFyeSBwZXJtaXNzaW9ucy4iKX09Cil9LHRlbXBsYXRlTGli
cmFyeTpmdW5jdGlvbigpe3ZhciBlPTNEW107ZS5wdXNoKCc8ZGl2IGNsYXNzPTNEImxpYnJhcnlf
c3R5bD0KZV9jb250YWluZXIiPicpO2UucHVzaCgnICA8ZGl2IGlkPTNEImxpYnJhcnlfdG9vbGJh
ciI+Jyk7ZS5wdXNoKCcgICA8YnV0dG9uPQogZGF0YS10b2dnbGU9M0QidG9vbHRpcCIgZGF0YS1w
bGFjZW1lbnQ9M0QidG9wIiB0aXRsZT0zRCJNb2RpZnkgbGlicmFyeSBpdGU9Cm0iIGNsYXNzPTNE
ImJ0biBidG4tZGVmYXVsdCB0b29sYnRuX21vZGlmeV9kYXRhc2V0IHByaW1hcnktYnV0dG9uIiB0
eXBlPTNEIj0KYnV0dG9uIj48c3BhbiBjbGFzcz0zRCJmYSBmYS1wZW5jaWwiPjwvc3Bhbj4gTW9k
aWZ5PC9zcGFuPjwvYnV0dG9uPicpO2UucHVzPQpoKCcgICA8YSBocmVmPTNEIiNmb2xkZXJzLzwl
LSBpdGVtLmdldCgiZm9sZGVyX2lkIikgJT4vZGF0YXNldHMvPCUtIGl0ZW0uaWQ9CiAlPi9wZXJt
aXNzaW9ucyI+PGJ1dHRvbiBkYXRhLXRvZ2dsZT0zRCJ0b29sdGlwIiBkYXRhLXBsYWNlbWVudD0z
RCJ0b3AiIHRpdD0KbGU9M0QiTWFuYWdlIHBlcm1pc3Npb25zIiBjbGFzcz0zRCJidG4gYnRuLWRl
ZmF1bHQgdG9vbGJ0bl9jaGFuZ2VfcGVybWlzc2lvPQpucyBwcmltYXJ5LWJ1dHRvbiIgdHlwZT0z
RCJidXR0b24iPjxzcGFuIGNsYXNzPTNEImZhIGZhLWdyb3VwIj48L3NwYW4+IFBlcm09Cmlzc2lv
bnM8L3NwYW4+PC9idXR0b24+PC9hPicpO2UucHVzaCgnICAgPGJ1dHRvbiBkYXRhLXRvZ2dsZT0z
RCJ0b29sdGlwIiBkYT0KdGEtcGxhY2VtZW50PTNEInRvcCIgdGl0bGU9M0QiU2hhcmUgZGF0YXNl
dCIgY2xhc3M9M0QiYnRuIGJ0bi1kZWZhdWx0IHRvb2xiPQp0bi1zaGFyZS1kYXRhc2V0IHByaW1h
cnktYnV0dG9uIiB0eXBlPTNEImJ1dHRvbiI+PHNwYW4gY2xhc3M9M0QiZmEgZmEtc2hhcmU9CiI+
PC9zcGFuPiBTaGFyZTwvc3Bhbj48L2J1dHRvbj4nKTtlLnB1c2goIiAgPC9kaXY+Iik7ZS5wdXNo
KCIgIDxwPiIpO2UucHVzaD0KKCIgIFRoaXMgZGF0YXNldCBpcyB1bnJlc3RyaWN0ZWQgc28gZXZl
cnlib2R5IGNhbiBhY2Nlc3MgaXQuIEp1c3Qgc2hhcmUgdGhlPQogVVJMIG9mIHRoaXMgcGFnZS4g
Iik7ZS5wdXNoKCcgIDxidXR0b24gZGF0YS10b2dnbGU9M0QidG9vbHRpcCIgZGF0YS1wbGFjZW09
CmVudD0zRCJ0b3AiIHRpdGxlPTNEIkNvcHkgdG8gY2xpcGJvYXJkIiBjbGFzcz0zRCJidG4gYnRu
LWRlZmF1bHQgYnRuLWNvcHktbD0KaW5rLXRvLWNsaXBib2FyZCBwcmltYXJ5LWJ1dHRvbiIgdHlw
ZT0zRCJidXR0b24iPjxzcGFuIGNsYXNzPTNEImZhIGZhLWNsaXBiPQpvYXJkIj48L3NwYW4+IFRv
IENsaXBib2FyZDwvc3Bhbj48L2J1dHRvbj4gJyk7ZS5wdXNoKCIgIDwvcD4iKTtlLnB1c2goJzxk
aXY9CiBjbGFzcz0zRCJkYXRhc2V0X3RhYmxlIj4nKTtlLnB1c2goJyAgIDx0YWJsZSBjbGFzcz0z
RCJncmlkIHRhYmxlIHRhYmxlLXN0cj0KaXBlZCB0YWJsZS1jb25kZW5zZWQiPicpO2UucHVzaCgi
ICAgICAgIDx0cj4iKTtlLnB1c2goJyAgICAgICAgICAgPHRoIHNjb3BlPQo9M0Qicm93IiBpZD0z
RCJpZF9yb3ciIGRhdGEtaWQ9M0QiPCU9M0QgXy5lc2NhcGUoaXRlbS5nZXQoImxkZGFfaWQiKSkg
JT4iPk49CmFtZTwvdGg+Jyk7ZS5wdXNoKCcgICAgICAgICAgIDx0ZD48JT0zRCBfLmVzY2FwZShp
dGVtLmdldCgibmFtZSIpKSAlPjwvdGQ+Jz0KKTtlLnB1c2goIiAgICAgICA8L3RyPiIpO2UucHVz
aCgnICAgPCUgaWYgKGl0ZW0uZ2V0KCJmaWxlX2V4dCIpKSB7ICU+Jyk7ZS5wPQp1c2goIiAgICAg
ICA8dHI+Iik7ZS5wdXNoKCcgICAgICAgICAgIDx0aCBzY29wZT0zRCJyb3ciPkRhdGEgdHlwZTwv
dGg+Jyk7ZS49CnB1c2goJyAgICAgICAgICAgPHRkPjwlPTNEIF8uZXNjYXBlKGl0ZW0uZ2V0KCJm
aWxlX2V4dCIpKSAlPjwvdGQ+Jyk7ZS5wdXNoKD0KIiAgICAgICA8L3RyPiIpO2UucHVzaCgiICAg
PCUgfSAlPiIpO2UucHVzaCgiICAgIDwvdGFibGU+Iik7ZS5wdXNoKCI8L2Rpdj4iPQopO2UucHVz
aCgiPC9kaXY+Iik7cmV0dXJuIF8udGVtcGxhdGUoZS5qb2luKCIiKSl9LHRlbXBsYXRlTGlicmFy
eVBlcm1pc3Npb249CnM6ZnVuY3Rpb24oKXt2YXIgZT0zRFtdO2UucHVzaCgnPGRpdiBjbGFzcz0z
RCJsaWJyYXJ5X3N0eWxlX2NvbnRhaW5lciI+Jyk7ZT0KLnB1c2goJyAgPGRpdiBpZD0zRCJsaWJy
YXJ5X3Rvb2xiYXIiPicpO2UucHVzaCgnICAgPGEgaHJlZj0zRCIjIj48YnV0dG9uIGRhPQp0YS10
b2dnbGU9M0QidG9vbHRpcCIgZGF0YS1wbGFjZW1lbnQ9M0QidG9wIiB0aXRsZT0zRCJHbyBiYWNr
IHRvIHRoZSBsaXN0IG89CmYgTGlicmFyaWVzIiBjbGFzcz0zRCJidG4gYnRuLWRlZmF1bHQgcHJp
bWFyeS1idXR0b24iIHR5cGU9M0QiYnV0dG9uIj48c3Bhbj0KIGNsYXNzPTNEImZhIGZhLWxpc3Qi
Pjwvc3Bhbj4gTGlicmFyaWVzPC9zcGFuPjwvYnV0dG9uPjwvYT4nKTtlLnB1c2goIiAgPC9kPQpp
dj4iKTtlLnB1c2goJzxoMT5MaWJyYXJ5OiA8JT0zRCBfLmVzY2FwZShsaWJyYXJ5LmdldCgibmFt
ZSIpKSAlPjwvaDE+Jyk7ZS49CnB1c2goJzxkaXYgY2xhc3M9M0QiYWxlcnQgYWxlcnQtd2Fybmlu
ZyI+Jyk7ZS5wdXNoKCI8JSBpZiAoaXNfYWRtaW4pIHsgJT4iKT0KO2UucHVzaCgiWW91IGFyZSBs
b2dnZWQgaW4gYXMgYW4gPHN0cm9uZz5hZG1pbmlzdHJhdG9yPC9zdHJvbmc+IHRoZXJlZm9yZSB5
PQpvdSBjYW4gbWFuYWdlIGFueSBsaWJyYXJ5IG9uIHRoaXMgR2FsYXh5IGluc3RhbmNlLiBQbGVh
c2UgbWFrZSBzdXJlIHlvdSB1bmQ9CmVyc3RhbmQgdGhlIGNvbnNlcXVlbmNlcy4iKTtlLnB1c2go
IjwlIH0gZWxzZSB7ICU+Iik7ZS5wdXNoKCJZb3UgY2FuIGFzc2lnbj0KIGFueSBudW1iZXIgb2Yg
cm9sZXMgdG8gYW55IG9mIHRoZSBmb2xsb3dpbmcgcGVybWlzc2lvbiB0eXBlcy4gSG93ZXZlciBw
bGVhPQpzZSByZWFkIGNhcmVmdWxseSB0aGUgaW1wbGljYXRpb25zIG9mIHN1Y2ggYWN0aW9ucy4i
KTtlLnB1c2goIjwlIH0lPiIpO2UucHU9CnNoKCI8L2Rpdj4iKTtlLnB1c2goJzxkaXYgY2xhc3M9
M0QiZGF0YXNldF90YWJsZSI+Jyk7ZS5wdXNoKCI8aDI+TGlicmFyeSBwZT0Kcm1pc3Npb25zPC9o
Mj4iKTtlLnB1c2goIjxoND5Sb2xlcyB0aGF0IGNhbiBhY2Nlc3MgdGhlIGxpYnJhcnk8L2g0PiIp
O2UucHVzPQpoKCc8ZGl2IGlkPTNEImFjY2Vzc19wZXJtIiBjbGFzcz0zRCJhY2Nlc3NfcGVybSBy
b2xlcy1zZWxlY3Rpb24iPjwvZGl2PicpO2U9Ci5wdXNoKCc8ZGl2IGNsYXNzPTNEImFsZXJ0IGFs
ZXJ0LWluZm8gcm9sZXMtc2VsZWN0aW9uIj5Vc2VyIHdpdGggPHN0cm9uZz5hbj0KeTwvc3Ryb25n
PiBvZiB0aGVzZSByb2xlcyBjYW4gYWNjZXNzIHRoaXMgbGlicmFyeS4gSWYgdGhlcmUgYXJlIG5v
IGFjY2VzcyByPQpvbGVzIHNldCBvbiB0aGUgbGlicmFyeSBpdCBpcyBjb25zaWRlcmVkIDxzdHJv
bmc+dW5yZXN0cmljdGVkPC9zdHJvbmc+LjwvZGk9CnY+Jyk7ZS5wdXNoKCI8aDQ+Um9sZXMgdGhh
dCBjYW4gbWFuYWdlIHBlcm1pc3Npb25zIG9uIHRoaXMgbGlicmFyeTwvaDQ+Iik7ZT0KLnB1c2go
JzxkaXYgaWQ9M0QibWFuYWdlX3Blcm0iIGNsYXNzPTNEIm1hbmFnZV9wZXJtIHJvbGVzLXNlbGVj
dGlvbiI+PC9kaXY+PQonKTtlLnB1c2goJzxkaXYgY2xhc3M9M0QiYWxlcnQgYWxlcnQtaW5mbyBy
b2xlcy1zZWxlY3Rpb24iPlVzZXIgd2l0aCA8c3Ryb249Cmc+YW55PC9zdHJvbmc+IG9mIHRoZXNl
IHJvbGVzIGNhbiBtYW5hZ2UgcGVybWlzc2lvbnMgb24gdGhpcyBsaWJyYXJ5IChpbmNsdT0KZGVz
IGdpdmluZyBhY2Nlc3MpLjwvZGl2PicpO2UucHVzaCgiPGg0PlJvbGVzIHRoYXQgY2FuIGFkZCBp
dGVtcyB0byB0aGlzIGxpPQpicmFyeTwvaDQ+Iik7ZS5wdXNoKCc8ZGl2IGlkPTNEImFkZF9wZXJt
IiBjbGFzcz0zRCJhZGRfcGVybSByb2xlcy1zZWxlY3Rpb249CiI+PC9kaXY+Jyk7ZS5wdXNoKCc8
ZGl2IGNsYXNzPTNEImFsZXJ0IGFsZXJ0LWluZm8gcm9sZXMtc2VsZWN0aW9uIj5Vc2VyIHdpdD0K
aCA8c3Ryb25nPmFueTwvc3Ryb25nPiBvZiB0aGVzZSByb2xlcyBjYW4gYWRkIGl0ZW1zIHRvIHRo
aXMgbGlicmFyeSAoZm9sZGVyPQpzIGFuZCBkYXRhc2V0cykuPC9kaXY+Jyk7ZS5wdXNoKCI8aDQ+
Um9sZXMgdGhhdCBjYW4gbW9kaWZ5IHRoaXMgbGlicmFyeTwvaDQ9Cj4iKTtlLnB1c2goJzxkaXYg
aWQ9M0QibW9kaWZ5X3Blcm0iIGNsYXNzPTNEIm1vZGlmeV9wZXJtIHJvbGVzLXNlbGVjdGlvbiI+
PD0KL2Rpdj4nKTtlLnB1c2goJzxkaXYgY2xhc3M9M0QiYWxlcnQgYWxlcnQtaW5mbyByb2xlcy1z
ZWxlY3Rpb24iPlVzZXIgd2l0aCA8PQpzdHJvbmc+YW55PC9zdHJvbmc+IG9mIHRoZXNlIHJvbGVz
IGNhbiBtb2RpZnkgdGhpcyBsaWJyYXJ5IChuYW1lLCBzeW5vcHNpcyw9CiBldGMuKS48L2Rpdj4n
KTtlLnB1c2goJzxidXR0b24gZGF0YS10b2dnbGU9M0QidG9vbHRpcCIgZGF0YS1wbGFjZW1lbnQ9
M0QidD0Kb3AiIHRpdGxlPTNEIlNhdmUgbW9kaWZpY2F0aW9ucyBtYWRlIG9uIHRoaXMgcGFnZSIg
Y2xhc3M9M0QiYnRuIGJ0bi1kZWZhdWx0PQogdG9vbGJ0bl9zYXZlX3Blcm1pc3Npb25zIHByaW1h
cnktYnV0dG9uIiB0eXBlPTNEImJ1dHRvbiI+PHNwYW4gY2xhc3M9M0QiZmE9CiBmYS1mbG9wcHkt
byI+PC9zcGFuPiBTYXZlPC9zcGFuPjwvYnV0dG9uPicpO2UucHVzaCgiPC9kaXY+Iik7ZS5wdXNo
KCI8L2Rpdj0KPiIpO3JldHVybiBfLnRlbXBsYXRlKGUuam9pbigiIikpfX0pO3JldHVybntMaWJy
YXJ5VmlldzpifX0pOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK2RlZmluZShbImxpYnMv
dG9hc3RyIiwibXZjL2xpYnJhcnkvbGlicmFyeS1tb2RlbCIsIm12Yy91aS91aS1zZWxlY3QiXSxm
dW5jPQp0aW9uKGQsYyxhKXt2YXIgYj0zREJhY2tib25lLlZpZXcuZXh0ZW5kKHtlbDoiI2NlbnRl
ciIsbW9kZWw6bnVsbCxvcHRpb25zOns9Cn0sZXZlbnRzOnsiY2xpY2sgLnRvb2xidG5fc2F2ZV9w
ZXJtaXNzaW9ucyI6InNhdmVQZXJtaXNzaW9ucyJ9LGluaXRpYWxpemU6Zj0KdW5jdGlvbihlKXt0
aGlzLm9wdGlvbnM9M0RfLmV4dGVuZCh0aGlzLm9wdGlvbnMsZSk7aWYodGhpcy5vcHRpb25zLmlk
KXt0aGlzPQouZmV0Y2hMaWJyYXJ5KCl9fSxmZXRjaExpYnJhcnk6ZnVuY3Rpb24oZSl7dGhpcy5v
cHRpb25zPTNEXy5leHRlbmQodGhpcy5vcHQ9CmlvbnMsZSk7dGhpcy5tb2RlbD0zRG5ldyBjLkxp
YnJhcnkoe2lkOnRoaXMub3B0aW9ucy5pZH0pO3ZhciBmPTNEdGhpczt0aGlzLj0KbW9kZWwuZmV0
Y2goe3N1Y2Nlc3M6ZnVuY3Rpb24oKXtpZihmLm9wdGlvbnMuc2hvd19wZXJtaXNzaW9ucyl7Zi5z
aG93UGVybWlzPQpzaW9ucygpfWVsc2V7Zi5yZW5kZXIoKX19LGVycm9yOmZ1bmN0aW9uKGgsZyl7
aWYodHlwZW9mIGcucmVzcG9uc2VKU09OIT0zRD0KPTNEInVuZGVmaW5lZCIpe2QuZXJyb3IoZy5y
ZXNwb25zZUpTT04uZXJyX21zZysiIENsaWNrIHRoaXMgdG8gZ28gYmFjay4iLCIiPQose29uY2xp
Y2s6ZnVuY3Rpb24oKXtHYWxheHkubGlicmFyaWVzLmxpYnJhcnlfcm91dGVyLmJhY2soKX19KX1l
bHNle2QuZXJyb3I9CigiQW4gZXJyb3Igb2N1cnJlZC4gQ2xpY2sgdGhpcyB0byBnbyBiYWNrLiIs
IiIse29uY2xpY2s6ZnVuY3Rpb24oKXtHYWxheHkubD0KaWJyYXJpZXMubGlicmFyeV9yb3V0ZXIu
YmFjaygpfX0pfX19KX0scmVuZGVyOmZ1bmN0aW9uKGUpeyQoIi50b29sdGlwIikucmVtPQpvdmUo
KTt0aGlzLm9wdGlvbnM9M0RfLmV4dGVuZCh0aGlzLm9wdGlvbnMsZSk7dmFyIGY9M0R0aGlzLnRl
bXBsYXRlTGlicmFyeSg9Cik7dGhpcy4kZWwuaHRtbChmKHtpdGVtOnRoaXMubW9kZWx9KSk7JCgi
I2NlbnRlciBbZGF0YS10b2dnbGVdIikudG9vbHRpcCgpfT0KLHNoYXJlRGF0YXNldDpmdW5jdGlv
bigpe2QuaW5mbygiRmVhdHVyZSBjb21pbmcgc29vbi4iKX0sZ29CYWNrOmZ1bmN0aW9uKCl7PQpH
YWxheHkubGlicmFyaWVzLmxpYnJhcnlfcm91dGVyLmJhY2soKX0sc2hvd1Blcm1pc3Npb25zOmZ1
bmN0aW9uKGYpe3RoaXMub3A9CnRpb25zPTNEXy5leHRlbmQodGhpcy5vcHRpb25zLGYpOyQoIi50
b29sdGlwIikucmVtb3ZlKCk7aWYodGhpcy5vcHRpb25zLmZldD0KY2hlZF9wZXJtaXNzaW9ucyE9
M0Q9M0R1bmRlZmluZWQpe2lmKHRoaXMub3B0aW9ucy5mZXRjaGVkX3Blcm1pc3Npb25zLmFjY2Vz
PQpzX2xpYnJhcnlfcm9sZV9saXN0Lmxlbmd0aD0zRD0zRD0zRDApe3RoaXMubW9kZWwuc2V0KHtp
c191bnJlc3RyaWN0ZWQ6dHJ1ZX09Cil9ZWxzZXt0aGlzLm1vZGVsLnNldCh7aXNfdW5yZXN0cmlj
dGVkOmZhbHNlfSl9fXZhciBoPTNEZmFsc2U7aWYoR2FsYXh5LmN1cj0KclVzZXIpe2g9M0RHYWxh
eHkuY3VyclVzZXIuaXNBZG1pbigpfXZhciBnPTNEdGhpcy50ZW1wbGF0ZUxpYnJhcnlQZXJtaXNz
aW9uPQpzKCk7dGhpcy4kZWwuaHRtbChnKHtsaWJyYXJ5OnRoaXMubW9kZWwsaXNfYWRtaW46aH0p
KTt2YXIgZT0zRHRoaXM7aWYodGhpcy49Cm9wdGlvbnMuZmV0Y2hlZF9wZXJtaXNzaW9ucz0zRD0z
RD0zRHVuZGVmaW5lZCl7JC5nZXQoKHdpbmRvdy5nYWxheHlfY29uZmlnPz0KZ2FsYXh5X2NvbmZp
Zy5yb290OiIvIikrImFwaS9saWJyYXJpZXMvIitlLmlkKyIvcGVybWlzc2lvbnM/c2NvcGU9M0Rj
dXJyZW50PQoiKS5kb25lKGZ1bmN0aW9uKGkpe2UucHJlcGFyZVNlbGVjdEJveGVzKHtmZXRjaGVk
X3Blcm1pc3Npb25zOml9KX0pLmZhaWwoZnU9Cm5jdGlvbigpe2QuZXJyb3IoIkFuIGVycm9yIG9j
Y3VycmVkIHdoaWxlIGF0dGVtcHRpbmcgdG8gZmV0Y2ggbGlicmFyeSBwZXJtaT0Kc3Npb25zLiIp
fSl9ZWxzZXt0aGlzLnByZXBhcmVTZWxlY3RCb3hlcyh7fSl9JCgiI2NlbnRlciBbZGF0YS10b2dn
bGVdIikudG9vPQpsdGlwKCk7JCgiI2NlbnRlciIpLmNzcygib3ZlcmZsb3ciLCJhdXRvIil9LF9z
ZXJpYWxpemVSb2xlczpmdW5jdGlvbihnKXt2YXI9CiBlPTNEW107Zm9yKHZhciBmPTNEMDtmPGcu
bGVuZ3RoO2YrKyl7ZS5wdXNoKGdbZl1bMV0rIjoiK2dbZl1bMF0pfXJldHVybiBlfT0KLHByZXBh
cmVTZWxlY3RCb3hlczpmdW5jdGlvbihpKXt0aGlzLm9wdGlvbnM9M0RfLmV4dGVuZCh0aGlzLm9w
dGlvbnMsaSk7dmFyPQogZT0zRHRoaXMub3B0aW9ucy5mZXRjaGVkX3Blcm1pc3Npb25zO3ZhciBn
PTNEdGhpczt2YXIgZj0zRHRoaXMuX3NlcmlhbGl6ZVI9Cm9sZXMoZS5hY2Nlc3NfbGlicmFyeV9y
b2xlX2xpc3QpO3ZhciBqPTNEdGhpcy5fc2VyaWFsaXplUm9sZXMoZS5hZGRfbGlicmFyeT0KX2l0
ZW1fcm9sZV9saXN0KTt2YXIgaD0zRHRoaXMuX3NlcmlhbGl6ZVJvbGVzKGUubWFuYWdlX2xpYnJh
cnlfcm9sZV9saXN0KTt2PQphciBrPTNEdGhpcy5fc2VyaWFsaXplUm9sZXMoZS5tb2RpZnlfbGli
cmFyeV9yb2xlX2xpc3QpO2cuYWNjZXNzU2VsZWN0T2JqZWM9CnQ9M0RuZXcgYS5WaWV3KHRoaXMu
X2NyZWF0ZVNlbGVjdE9wdGlvbnModGhpcywiYWNjZXNzX3Blcm0iLGYsdHJ1ZSkpO2cuYWRkUz0K
ZWxlY3RPYmplY3Q9M0RuZXcgYS5WaWV3KHRoaXMuX2NyZWF0ZVNlbGVjdE9wdGlvbnModGhpcywi
YWRkX3Blcm0iLGosZmFsc2UpPQopO2cubWFuYWdlU2VsZWN0T2JqZWN0PTNEbmV3IGEuVmlldyh0
aGlzLl9jcmVhdGVTZWxlY3RPcHRpb25zKHRoaXMsIm1hbmFnZV89CnBlcm0iLGgsZmFsc2UpKTtn
Lm1vZGlmeVNlbGVjdE9iamVjdD0zRG5ldyBhLlZpZXcodGhpcy5fY3JlYXRlU2VsZWN0T3B0aW9u
cz0KKHRoaXMsIm1vZGlmeV9wZXJtIixrLGZhbHNlKSl9LF9jcmVhdGVTZWxlY3RPcHRpb25zOmZ1
bmN0aW9uKGYsayxpLGUpe2U9M0RlPQo9M0Q9M0Q9M0R0cnVlP2U6ZmFsc2U7dmFyIGo9M0R7bWlu
aW11bUlucHV0TGVuZ3RoOjAsY3NzOmssbXVsdGlwbGU6dHJ1ZSxwbGE9CmNlaG9sZGVyOiJDbGlj
ayB0byBzZWxlY3QgYSByb2xlIixjb250YWluZXI6Zi4kZWwuZmluZCgiIyIrayksYWpheDp7dXJs
Oih3aT0KbmRvdy5nYWxheHlfY29uZmlnP2dhbGF4eV9jb25maWcucm9vdDoiLyIpKyJhcGkvbGli
cmFyaWVzLyIrZi5pZCsiL3Blcm1pc3NpPQpvbnM/c2NvcGU9M0RhdmFpbGFibGUmaXNfbGlicmFy
eV9hY2Nlc3M9M0QiK2UsZGF0YVR5cGU6Impzb24iLHF1aWV0TWlsbGlzOjE9CjAwLGRhdGE6ZnVu
Y3Rpb24obCxtKXtyZXR1cm57cTpsLHBhZ2VfbGltaXQ6MTAscGFnZTptfX0scmVzdWx0czpmdW5j
dGlvbihuLD0KbSl7dmFyIGw9M0QobSoxMCk8bi50b3RhbDtyZXR1cm57cmVzdWx0czpuLnJvbGVz
LG1vcmU6bH19fSxmb3JtYXRSZXN1bHQ6ZnVuPQpjdGlvbiBnKGwpe3JldHVybiBsLm5hbWUrIiB0
eXBlOiAiK2wudHlwZX0sZm9ybWF0U2VsZWN0aW9uOmZ1bmN0aW9uIGgobCl7cmU9CnR1cm4gbC5u
YW1lfSxpbml0U2VsZWN0aW9uOmZ1bmN0aW9uKGwsbil7dmFyIG09M0RbXTskKGwudmFsKCkuc3Bs
aXQoIiwiKSkuZT0KYWNoKGZ1bmN0aW9uKCl7dmFyIG89M0R0aGlzLnNwbGl0KCI6Iik7bS5wdXNo
KHtpZDpvWzBdLG5hbWU6b1sxXX0pfSk7bihtKX0sPQppbml0aWFsRGF0YTppLGRyb3Bkb3duQ3Nz
Q2xhc3M6ImJpZ2Ryb3AifTtyZXR1cm4gan0sY29taW5nU29vbjpmdW5jdGlvbigpe2Q9Ci53YXJu
aW5nKCJGZWF0dXJlIGNvbWluZyBzb29uLiIpfSxjb3B5VG9DbGlwYm9hcmQ6ZnVuY3Rpb24oKXt2
YXIgZT0zREJhY2tibz0KbmUuaGlzdG9yeS5sb2NhdGlvbi5ocmVmO2lmKGUubGFzdEluZGV4T2Yo
Ii9wZXJtaXNzaW9ucyIpIT0zRD0zRC0xKXtlPTNEZS5zPQp1YnN0cigwLGUubGFzdEluZGV4T2Yo
Ii9wZXJtaXNzaW9ucyIpKX13aW5kb3cucHJvbXB0KCJDb3B5IHRvIGNsaXBib2FyZDogQ3Q9CnJs
K0MsIEVudGVyIixlKX0sbWFrZURhdGFzZXRQcml2YXRlOmZ1bmN0aW9uKCl7dmFyIGU9M0R0aGlz
OyQucG9zdCgod2luZG93Lj0KZ2FsYXh5X2NvbmZpZz9nYWxheHlfY29uZmlnLnJvb3Q6Ii8iKSsi
YXBpL2xpYnJhcmllcy9kYXRhc2V0cy8iK2UuaWQrIi9wZXJtPQppc3Npb25zP2FjdGlvbj0zRG1h
a2VfcHJpdmF0ZSIpLmRvbmUoZnVuY3Rpb24oZil7ZS5tb2RlbC5zZXQoe2lzX3VucmVzdHJpY3Q9
CmVkOmZhbHNlfSk7ZS5zaG93UGVybWlzc2lvbnMoe2ZldGNoZWRfcGVybWlzc2lvbnM6Zn0pO2Qu
c3VjY2VzcygiVGhlIGRhdGFzZT0KdCBpcyBub3cgcHJpdmF0ZSB0byB5b3UuIil9KS5mYWlsKGZ1
bmN0aW9uKCl7ZC5lcnJvcigiQW4gZXJyb3Igb2NjdXJyZWQgd2hpPQpsZSBhdHRlbXB0aW5nIHRv
IG1ha2UgZGF0YXNldCBwcml2YXRlLiIpfSl9LHJlbW92ZURhdGFzZXRSZXN0cmljdGlvbnM6ZnVu
Y3Q9Cmlvbigpe3ZhciBlPTNEdGhpczskLnBvc3QoKHdpbmRvdy5nYWxheHlfY29uZmlnP2dhbGF4
eV9jb25maWcucm9vdDoiLyIpKyJhcD0KaS9saWJyYXJpZXMvZGF0YXNldHMvIitlLmlkKyIvcGVy
bWlzc2lvbnM/YWN0aW9uPTNEcmVtb3ZlX3Jlc3RyaWN0aW9ucyIpLmRvPQpuZShmdW5jdGlvbihm
KXtlLm1vZGVsLnNldCh7aXNfdW5yZXN0cmljdGVkOnRydWV9KTtlLnNob3dQZXJtaXNzaW9ucyh7
ZmV0Y2g9CmVkX3Blcm1pc3Npb25zOmZ9KTtkLnN1Y2Nlc3MoIkFjY2VzcyB0byB0aGlzIGRhdGFz
ZXQgaXMgbm93IHVucmVzdHJpY3RlZC4iKT0KfSkuZmFpbChmdW5jdGlvbigpe2QuZXJyb3IoIkFu
IGVycm9yIG9jY3VycmVkIHdoaWxlIGF0dGVtcHRpbmcgdG8gbWFrZSBkYXRhPQpzZXQgdW5yZXN0
cmljdGVkLiIpfSl9LF9leHRyYWN0SWRzOmZ1bmN0aW9uKGUpe2lkc19saXN0PTNEW107Zm9yKHZh
ciBmPTNEZS49Cmxlbmd0aC0xO2Y+PTNEMDtmLS0pe2lkc19saXN0LnB1c2goZVtmXS5pZCl9cmV0
dXJuIGlkc19saXN0fSxzYXZlUGVybWlzc2lvbj0KczpmdW5jdGlvbihoKXt2YXIgZz0zRHRoaXM7
dmFyIGk9M0R0aGlzLl9leHRyYWN0SWRzKHRoaXMuYWNjZXNzU2VsZWN0T2JqZWN0PQouJGVsLnNl
bGVjdDIoImRhdGEiKSk7dmFyIGU9M0R0aGlzLl9leHRyYWN0SWRzKHRoaXMuYWRkU2VsZWN0T2Jq
ZWN0LiRlbC5zZWw9CmVjdDIoImRhdGEiKSk7dmFyIGo9M0R0aGlzLl9leHRyYWN0SWRzKHRoaXMu
bWFuYWdlU2VsZWN0T2JqZWN0LiRlbC5zZWxlY3QyKD0KImRhdGEiKSk7dmFyIGY9M0R0aGlzLl9l
eHRyYWN0SWRzKHRoaXMubW9kaWZ5U2VsZWN0T2JqZWN0LiRlbC5zZWxlY3QyKCJkYXRhPQoiKSk7
JC5wb3N0KCh3aW5kb3cuZ2FsYXh5X2NvbmZpZz9nYWxheHlfY29uZmlnLnJvb3Q6Ii8iKSsiYXBp
L2xpYnJhcmllcy8iK2c9Ci5pZCsiL3Blcm1pc3Npb25zP2FjdGlvbj0zRHNldF9wZXJtaXNzaW9u
cyIseyJhY2Nlc3NfaWRzW10iOmksImFkZF9pZHNbXSI6ZT0KLCJtYW5hZ2VfaWRzW10iOmosIm1v
ZGlmeV9pZHNbXSI6Zix9KS5kb25lKGZ1bmN0aW9uKGspe2cuc2hvd1Blcm1pc3Npb25zKHtmPQpl
dGNoZWRfcGVybWlzc2lvbnM6a30pO2Quc3VjY2VzcygiUGVybWlzc2lvbnMgc2F2ZWQuIil9KS5m
YWlsKGZ1bmN0aW9uKCl7ZC49CmVycm9yKCJBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBhdHRlbXB0
aW5nIHRvIHNldCBsaWJyYXJ5IHBlcm1pc3Npb25zLiIpfSl9LD0KdGVtcGxhdGVMaWJyYXJ5OmZ1
bmN0aW9uKCl7dmFyIGU9M0RbXTtlLnB1c2goJzxkaXYgY2xhc3M9M0QibGlicmFyeV9zdHlsZV9j
PQpvbnRhaW5lciI+Jyk7ZS5wdXNoKCcgIDxkaXYgaWQ9M0QibGlicmFyeV90b29sYmFyIj4nKTtl
LnB1c2goJyAgIDxidXR0b24gZGE9CnRhLXRvZ2dsZT0zRCJ0b29sdGlwIiBkYXRhLXBsYWNlbWVu
dD0zRCJ0b3AiIHRpdGxlPTNEIk1vZGlmeSBsaWJyYXJ5IGl0ZW0iID0KY2xhc3M9M0QiYnRuIGJ0
bi1kZWZhdWx0IHRvb2xidG5fbW9kaWZ5X2RhdGFzZXQgcHJpbWFyeS1idXR0b24iIHR5cGU9M0Qi
YnV0PQp0b24iPjxzcGFuIGNsYXNzPTNEImZhIGZhLXBlbmNpbCI+PC9zcGFuPiBNb2RpZnk8L3Nw
YW4+PC9idXR0b24+Jyk7ZS5wdXNoKCc9CiAgIDxhIGhyZWY9M0QiI2ZvbGRlcnMvPCUtIGl0ZW0u
Z2V0KCJmb2xkZXJfaWQiKSAlPi9kYXRhc2V0cy88JS0gaXRlbS5pZCAlPj0KL3Blcm1pc3Npb25z
Ij48YnV0dG9uIGRhdGEtdG9nZ2xlPTNEInRvb2x0aXAiIGRhdGEtcGxhY2VtZW50PTNEInRvcCIg
dGl0bGU9Cj0zRCJNYW5hZ2UgcGVybWlzc2lvbnMiIGNsYXNzPTNEImJ0biBidG4tZGVmYXVsdCB0
b29sYnRuX2NoYW5nZV9wZXJtaXNzaW9ucz0KIHByaW1hcnktYnV0dG9uIiB0eXBlPTNEImJ1dHRv
biI+PHNwYW4gY2xhc3M9M0QiZmEgZmEtZ3JvdXAiPjwvc3Bhbj4gUGVybWlzPQpzaW9uczwvc3Bh
bj48L2J1dHRvbj48L2E+Jyk7ZS5wdXNoKCcgICA8YnV0dG9uIGRhdGEtdG9nZ2xlPTNEInRvb2x0
aXAiIGRhdGE9Ci1wbGFjZW1lbnQ9M0QidG9wIiB0aXRsZT0zRCJTaGFyZSBkYXRhc2V0IiBjbGFz
cz0zRCJidG4gYnRuLWRlZmF1bHQgdG9vbGJ0bj0KLXNoYXJlLWRhdGFzZXQgcHJpbWFyeS1idXR0
b24iIHR5cGU9M0QiYnV0dG9uIj48c3BhbiBjbGFzcz0zRCJmYSBmYS1zaGFyZSI+PQo8L3NwYW4+
IFNoYXJlPC9zcGFuPjwvYnV0dG9uPicpO2UucHVzaCgiICA8L2Rpdj4iKTtlLnB1c2goIiAgPHA+
Iik7ZS5wdXNoKCI9CiAgVGhpcyBkYXRhc2V0IGlzIHVucmVzdHJpY3RlZCBzbyBldmVyeWJvZHkg
Y2FuIGFjY2VzcyBpdC4gSnVzdCBzaGFyZSB0aGUgVT0KUkwgb2YgdGhpcyBwYWdlLiAiKTtlLnB1
c2goJyAgPGJ1dHRvbiBkYXRhLXRvZ2dsZT0zRCJ0b29sdGlwIiBkYXRhLXBsYWNlbWVuPQp0PTNE
InRvcCIgdGl0bGU9M0QiQ29weSB0byBjbGlwYm9hcmQiIGNsYXNzPTNEImJ0biBidG4tZGVmYXVs
dCBidG4tY29weS1saW49CmstdG8tY2xpcGJvYXJkIHByaW1hcnktYnV0dG9uIiB0eXBlPTNEImJ1
dHRvbiI+PHNwYW4gY2xhc3M9M0QiZmEgZmEtY2xpcGJvYT0KcmQiPjwvc3Bhbj4gVG8gQ2xpcGJv
YXJkPC9zcGFuPjwvYnV0dG9uPiAnKTtlLnB1c2goIiAgPC9wPiIpO2UucHVzaCgnPGRpdiBjPQps
YXNzPTNEImRhdGFzZXRfdGFibGUiPicpO2UucHVzaCgnICAgPHRhYmxlIGNsYXNzPTNEImdyaWQg
dGFibGUgdGFibGUtc3RyaXA9CmVkIHRhYmxlLWNvbmRlbnNlZCI+Jyk7ZS5wdXNoKCIgICAgICAg
PHRyPiIpO2UucHVzaCgnICAgICAgICAgICA8dGggc2NvcGU9Cj0zRCJyb3ciIGlkPTNEImlkX3Jv
dyIgZGF0YS1pZD0zRCI8JT0zRCBfLmVzY2FwZShpdGVtLmdldCgibGRkYV9pZCIpKSAlPiI+Tj0K
YW1lPC90aD4nKTtlLnB1c2goJyAgICAgICAgICAgPHRkPjwlPTNEIF8uZXNjYXBlKGl0ZW0uZ2V0
KCJuYW1lIikpICU+PC90ZD4nPQopO2UucHVzaCgiICAgICAgIDwvdHI+Iik7ZS5wdXNoKCcgICA8
JSBpZiAoaXRlbS5nZXQoImZpbGVfZXh0IikpIHsgJT4nKTtlLnA9CnVzaCgiICAgICAgIDx0cj4i
KTtlLnB1c2goJyAgICAgICAgICAgPHRoIHNjb3BlPTNEInJvdyI+RGF0YSB0eXBlPC90aD4nKTtl
Lj0KcHVzaCgnICAgICAgICAgICA8dGQ+PCU9M0QgXy5lc2NhcGUoaXRlbS5nZXQoImZpbGVfZXh0
IikpICU+PC90ZD4nKTtlLnB1c2goPQoiICAgICAgIDwvdHI+Iik7ZS5wdXNoKCIgICA8JSB9ICU+
Iik7ZS5wdXNoKCIgICAgPC90YWJsZT4iKTtlLnB1c2goIjwvZGl2PiI9Cik7ZS5wdXNoKCI8L2Rp
dj4iKTtyZXR1cm4gXy50ZW1wbGF0ZShlLmpvaW4oIiIpKX0sdGVtcGxhdGVMaWJyYXJ5UGVybWlz
c2lvbj0KczpmdW5jdGlvbigpe3ZhciBlPTNEW107ZS5wdXNoKCc8ZGl2IGNsYXNzPTNEImxpYnJh
cnlfc3R5bGVfY29udGFpbmVyIj4nKTtlPQoucHVzaCgnICA8ZGl2IGlkPTNEImxpYnJhcnlfdG9v
bGJhciI+Jyk7ZS5wdXNoKCcgICA8YSBocmVmPTNEIiMiPjxidXR0b24gZGE9CnRhLXRvZ2dsZT0z
RCJ0b29sdGlwIiBkYXRhLXBsYWNlbWVudD0zRCJ0b3AiIHRpdGxlPTNEIkdvIGJhY2sgdG8gdGhl
IGxpc3Qgbz0KZiBMaWJyYXJpZXMiIGNsYXNzPTNEImJ0biBidG4tZGVmYXVsdCBwcmltYXJ5LWJ1
dHRvbiIgdHlwZT0zRCJidXR0b24iPjxzcGFuPQogY2xhc3M9M0QiZmEgZmEtbGlzdCI+PC9zcGFu
PiBMaWJyYXJpZXM8L3NwYW4+PC9idXR0b24+PC9hPicpO2UucHVzaCgiICA8L2Q9Cml2PiIpO2Uu
cHVzaCgnPGgxPkxpYnJhcnk6IDwlPTNEIF8uZXNjYXBlKGxpYnJhcnkuZ2V0KCJuYW1lIikpICU+
PC9oMT4nKTtlLj0KcHVzaCgnPGRpdiBjbGFzcz0zRCJhbGVydCBhbGVydC13YXJuaW5nIj4nKTtl
LnB1c2goIjwlIGlmIChpc19hZG1pbikgeyAlPiIpPQo7ZS5wdXNoKCJZb3UgYXJlIGxvZ2dlZCBp
biBhcyBhbiA8c3Ryb25nPmFkbWluaXN0cmF0b3I8L3N0cm9uZz4gdGhlcmVmb3JlIHk9Cm91IGNh
biBtYW5hZ2UgYW55IGxpYnJhcnkgb24gdGhpcyBHYWxheHkgaW5zdGFuY2UuIFBsZWFzZSBtYWtl
IHN1cmUgeW91IHVuZD0KZXJzdGFuZCB0aGUgY29uc2VxdWVuY2VzLiIpO2UucHVzaCgiPCUgfSBl
bHNlIHsgJT4iKTtlLnB1c2goIllvdSBjYW4gYXNzaWduPQogYW55IG51bWJlciBvZiByb2xlcyB0
byBhbnkgb2YgdGhlIGZvbGxvd2luZyBwZXJtaXNzaW9uIHR5cGVzLiBIb3dldmVyIHBsZWE9CnNl
IHJlYWQgY2FyZWZ1bGx5IHRoZSBpbXBsaWNhdGlvbnMgb2Ygc3VjaCBhY3Rpb25zLiIpO2UucHVz
aCgiPCUgfSU+Iik7ZS5wdT0Kc2goIjwvZGl2PiIpO2UucHVzaCgnPGRpdiBjbGFzcz0zRCJkYXRh
c2V0X3RhYmxlIj4nKTtlLnB1c2goIjxoMj5MaWJyYXJ5IHBlPQpybWlzc2lvbnM8L2gyPiIpO2Uu
cHVzaCgiPGg0PlJvbGVzIHRoYXQgY2FuIGFjY2VzcyB0aGUgbGlicmFyeTwvaDQ+Iik7ZS5wdXM9
CmgoJzxkaXYgaWQ9M0QiYWNjZXNzX3Blcm0iIGNsYXNzPTNEImFjY2Vzc19wZXJtIHJvbGVzLXNl
bGVjdGlvbiI+PC9kaXY+Jyk7ZT0KLnB1c2goJzxkaXYgY2xhc3M9M0QiYWxlcnQgYWxlcnQtaW5m
byByb2xlcy1zZWxlY3Rpb24iPlVzZXIgd2l0aCA8c3Ryb25nPmFuPQp5PC9zdHJvbmc+IG9mIHRo
ZXNlIHJvbGVzIGNhbiBhY2Nlc3MgdGhpcyBsaWJyYXJ5LiBJZiB0aGVyZSBhcmUgbm8gYWNjZXNz
IHI9Cm9sZXMgc2V0IG9uIHRoZSBsaWJyYXJ5IGl0IGlzIGNvbnNpZGVyZWQgPHN0cm9uZz51bnJl
c3RyaWN0ZWQ8L3N0cm9uZz4uPC9kaT0Kdj4nKTtlLnB1c2goIjxoND5Sb2xlcyB0aGF0IGNhbiBt
YW5hZ2UgcGVybWlzc2lvbnMgb24gdGhpcyBsaWJyYXJ5PC9oND4iKTtlPQoucHVzaCgnPGRpdiBp
ZD0zRCJtYW5hZ2VfcGVybSIgY2xhc3M9M0QibWFuYWdlX3Blcm0gcm9sZXMtc2VsZWN0aW9uIj48
L2Rpdj49CicpO2UucHVzaCgnPGRpdiBjbGFzcz0zRCJhbGVydCBhbGVydC1pbmZvIHJvbGVzLXNl
bGVjdGlvbiI+VXNlciB3aXRoIDxzdHJvbj0KZz5hbnk8L3N0cm9uZz4gb2YgdGhlc2Ugcm9sZXMg
Y2FuIG1hbmFnZSBwZXJtaXNzaW9ucyBvbiB0aGlzIGxpYnJhcnkgKGluY2x1PQpkZXMgZ2l2aW5n
IGFjY2VzcykuPC9kaXY+Jyk7ZS5wdXNoKCI8aDQ+Um9sZXMgdGhhdCBjYW4gYWRkIGl0ZW1zIHRv
IHRoaXMgbGk9CmJyYXJ5PC9oND4iKTtlLnB1c2goJzxkaXYgaWQ9M0QiYWRkX3Blcm0iIGNsYXNz
PTNEImFkZF9wZXJtIHJvbGVzLXNlbGVjdGlvbj0KIj48L2Rpdj4nKTtlLnB1c2goJzxkaXYgY2xh
c3M9M0QiYWxlcnQgYWxlcnQtaW5mbyByb2xlcy1zZWxlY3Rpb24iPlVzZXIgd2l0PQpoIDxzdHJv
bmc+YW55PC9zdHJvbmc+IG9mIHRoZXNlIHJvbGVzIGNhbiBhZGQgaXRlbXMgdG8gdGhpcyBsaWJy
YXJ5IChmb2xkZXI9CnMgYW5kIGRhdGFzZXRzKS48L2Rpdj4nKTtlLnB1c2goIjxoND5Sb2xlcyB0
aGF0IGNhbiBtb2RpZnkgdGhpcyBsaWJyYXJ5PC9oND0KPiIpO2UucHVzaCgnPGRpdiBpZD0zRCJt
b2RpZnlfcGVybSIgY2xhc3M9M0QibW9kaWZ5X3Blcm0gcm9sZXMtc2VsZWN0aW9uIj48PQovZGl2
PicpO2UucHVzaCgnPGRpdiBjbGFzcz0zRCJhbGVydCBhbGVydC1pbmZvIHJvbGVzLXNlbGVjdGlv
biI+VXNlciB3aXRoIDw9CnN0cm9uZz5hbnk8L3N0cm9uZz4gb2YgdGhlc2Ugcm9sZXMgY2FuIG1v
ZGlmeSB0aGlzIGxpYnJhcnkgKG5hbWUsIHN5bm9wc2lzLD0KIGV0Yy4pLjwvZGl2PicpO2UucHVz
aCgnPGJ1dHRvbiBkYXRhLXRvZ2dsZT0zRCJ0b29sdGlwIiBkYXRhLXBsYWNlbWVudD0zRCJ0PQpv
cCIgdGl0bGU9M0QiU2F2ZSBtb2RpZmljYXRpb25zIG1hZGUgb24gdGhpcyBwYWdlIiBjbGFzcz0z
RCJidG4gYnRuLWRlZmF1bHQ9CiB0b29sYnRuX3NhdmVfcGVybWlzc2lvbnMgcHJpbWFyeS1idXR0
b24iIHR5cGU9M0QiYnV0dG9uIj48c3BhbiBjbGFzcz0zRCJmYT0KIGZhLWZsb3BweS1vIj48L3Nw
YW4+IFNhdmU8L3NwYW4+PC9idXR0b24+Jyk7ZS5wdXNoKCI8L2Rpdj4iKTtlLnB1c2goIjwvZGl2
PQo+Iik7cmV0dXJuIF8udGVtcGxhdGUoZS5qb2luKCIiKSl9fSk7cmV0dXJue0xpYnJhcnlWaWV3
OmJ9fSk7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQoKCmh0dHBzOi8vYml0YnVja2V0Lm9y
Zy9nYWxheHkvZ2FsYXh5LWNlbnRyYWwvY29tbWl0cy9lMmFkMzk3YTJlYzcvCkNoYW5nZXNldDog
ICBlMmFkMzk3YTJlYzcKQnJhbmNoOiAgICAgIHJlbGVhc2VfMTUuMDMKVXNlcjogICAgICAgIGNh
cmxmZWJlcmhhcmQKRGF0ZTogICAgICAgIDIwMTUtMDMtMjQgMjI6MDM6NTkrMDA6MDAKU3VtbWFy
eTogICAgIFVJLCBIaXN0b3J5OiBmaXggbW9kZWwgc2V0QXNDdXJyZW50IHRvIHVzZSBnYWxheHlf
Y29uZmlnLnJvb3QgPQpwcm94eSBwcmVmaXgKQWZmZWN0ZWQgIzogIDMgZmlsZXMKCmRpZmYgLXIg
MWNjZjQwYmRhZmExODRiM2JlMzFhYTdiMWVjZGZjZTNiYzcwNWVmYiAtciBlMmFkMzk3YTJlYzdm
NzQ4YmYxYjk0MT0KOGMyYjI5YWEzNzhlNDE2NDcgY2xpZW50L2dhbGF4eS9zY3JpcHRzL212Yy9o
aXN0b3J5L2hpc3RvcnktbW9kZWwuanMKLS0tIGEvY2xpZW50L2dhbGF4eS9zY3JpcHRzL212Yy9o
aXN0b3J5L2hpc3RvcnktbW9kZWwuanMKKysrIGIvY2xpZW50L2dhbGF4eS9zY3JpcHRzL212Yy9o
aXN0b3J5L2hpc3RvcnktbW9kZWwuanMKQEAgLTI1Nyw3ICsyNTcsNyBAQAo9MjAKICAgICBzZXRB
c0N1cnJlbnQgOiBmdW5jdGlvbigpewogICAgICAgICB2YXIgaGlzdG9yeSA9M0QgdGhpcywKLSAg
ICAgICAgICAgIHhociA9M0QgalF1ZXJ5LmdldEpTT04oICcvaGlzdG9yeS9zZXRfYXNfY3VycmVu
dD9pZD0zRCcgKyB0aGlzPQouaWQgKTsKKyAgICAgICAgICAgIHhociA9M0QgalF1ZXJ5LmdldEpT
T04oIGdhbGF4eV9jb25maWcucm9vdCArICdoaXN0b3J5L3NldF9hc19jPQp1cnJlbnQ/aWQ9M0Qn
ICsgdGhpcy5pZCApOwo9MjAKICAgICAgICAgeGhyLmRvbmUoIGZ1bmN0aW9uKCl7CiAgICAgICAg
ICAgICBoaXN0b3J5LnRyaWdnZXIoICdzZXQtYXMtY3VycmVudCcsIGhpc3RvcnkgKTsKQEAgLTM2
MSw3ICszNjEsNyBAQAogdmFyIEhpc3RvcnlDb2xsZWN0aW9uID0zRCBCYWNrYm9uZS5Db2xsZWN0
aW9uLmV4dGVuZCggQkFTRV9NVkMuTG9nZ2FibGVNaXg9CmluICkuZXh0ZW5kKAogLyoqIEBsZW5k
cyBIaXN0b3J5Q29sbGVjdGlvbi5wcm90b3R5cGUgKi97CiAgICAgbW9kZWwgICA6IEhpc3Rvcnks
Ci0gICA9MjAKKwogICAgIC8qKiBsb2dnZXIgdXNlZCB0byByZWNvcmQgdGhpcy5sb2cgbWVzc2Fn
ZXMsIGNvbW1vbmx5IHNldCB0byBjb25zb2xlICovCiAgICAgLy9sb2dnZXIgICAgICAgICAgICAg
IDogY29uc29sZSwKPTIwCgpkaWZmIC1yIDFjY2Y0MGJkYWZhMTg0YjNiZTMxYWE3YjFlY2RmY2Uz
YmM3MDVlZmIgLXIgZTJhZDM5N2EyZWM3Zjc0OGJmMWI5NDE9CjhjMmIyOWFhMzc4ZTQxNjQ3IHN0
YXRpYy9zY3JpcHRzL212Yy9oaXN0b3J5L2hpc3RvcnktbW9kZWwuanMKLS0tIGEvc3RhdGljL3Nj
cmlwdHMvbXZjL2hpc3RvcnkvaGlzdG9yeS1tb2RlbC5qcworKysgYi9zdGF0aWMvc2NyaXB0cy9t
dmMvaGlzdG9yeS9oaXN0b3J5LW1vZGVsLmpzCkBAIC0yNTcsNyArMjU3LDcgQEAKPTIwCiAgICAg
c2V0QXNDdXJyZW50IDogZnVuY3Rpb24oKXsKICAgICAgICAgdmFyIGhpc3RvcnkgPTNEIHRoaXMs
Ci0gICAgICAgICAgICB4aHIgPTNEIGpRdWVyeS5nZXRKU09OKCAnL2hpc3Rvcnkvc2V0X2FzX2N1
cnJlbnQ/aWQ9M0QnICsgdGhpcz0KLmlkICk7CisgICAgICAgICAgICB4aHIgPTNEIGpRdWVyeS5n
ZXRKU09OKCBnYWxheHlfY29uZmlnLnJvb3QgKyAnaGlzdG9yeS9zZXRfYXNfYz0KdXJyZW50P2lk
PTNEJyArIHRoaXMuaWQgKTsKPTIwCiAgICAgICAgIHhoci5kb25lKCBmdW5jdGlvbigpewogICAg
ICAgICAgICAgaGlzdG9yeS50cmlnZ2VyKCAnc2V0LWFzLWN1cnJlbnQnLCBoaXN0b3J5ICk7CkBA
IC0zNjEsNyArMzYxLDcgQEAKIHZhciBIaXN0b3J5Q29sbGVjdGlvbiA9M0QgQmFja2JvbmUuQ29s
bGVjdGlvbi5leHRlbmQoIEJBU0VfTVZDLkxvZ2dhYmxlTWl4PQppbiApLmV4dGVuZCgKIC8qKiBA
bGVuZHMgSGlzdG9yeUNvbGxlY3Rpb24ucHJvdG90eXBlICovewogICAgIG1vZGVsICAgOiBIaXN0
b3J5LAotICAgPTIwCisKICAgICAvKiogbG9nZ2VyIHVzZWQgdG8gcmVjb3JkIHRoaXMubG9nIG1l
c3NhZ2VzLCBjb21tb25seSBzZXQgdG8gY29uc29sZSAqLwogICAgIC8vbG9nZ2VyICAgICAgICAg
ICAgICA6IGNvbnNvbGUsCj0yMAoKZGlmZiAtciAxY2NmNDBiZGFmYTE4NGIzYmUzMWFhN2IxZWNk
ZmNlM2JjNzA1ZWZiIC1yIGUyYWQzOTdhMmVjN2Y3NDhiZjFiOTQxPQo4YzJiMjlhYTM3OGU0MTY0
NyBzdGF0aWMvc2NyaXB0cy9wYWNrZWQvbXZjL2hpc3RvcnkvaGlzdG9yeS1tb2RlbC5qcwotLS0g
YS9zdGF0aWMvc2NyaXB0cy9wYWNrZWQvbXZjL2hpc3RvcnkvaGlzdG9yeS1tb2RlbC5qcworKysg
Yi9zdGF0aWMvc2NyaXB0cy9wYWNrZWQvbXZjL2hpc3RvcnkvaGlzdG9yeS1tb2RlbC5qcwpAQCAt
MSwxICsxLDEgQEAKLWRlZmluZShbIm12Yy9oaXN0b3J5L2hpc3RvcnktY29udGVudHMiLCJtdmMv
YmFzZS1tdmMiLCJ1dGlscy9sb2NhbGl6YXRpb24iPQpdLGZ1bmN0aW9uKGgsaSxkKXt2YXIgZT0z
REJhY2tib25lLk1vZGVsLmV4dGVuZChpLkxvZ2dhYmxlTWl4aW4pLmV4dGVuZChpLm09Cml4aW4o
aS5TZWFyY2hhYmxlTW9kZWxNaXhpbix7ZGVmYXVsdHM6e21vZGVsX2NsYXNzOiJIaXN0b3J5Iixp
ZDpudWxsLG5hbWU6Ij0KVW5uYW1lZCBIaXN0b3J5IixzdGF0ZToibmV3IixkaXNrU2l6ZTowLGRl
bGV0ZWQ6ZmFsc2V9LHVybFJvb3Q6Z2FsYXh5X2NvbmZpPQpnLnJvb3QrImFwaS9oaXN0b3JpZXMi
LGluaXRpYWxpemU6ZnVuY3Rpb24oayxsLGope2o9M0RqfHx7fTt0aGlzLmxvZ2dlcj0zRGo9Ci5s
b2dnZXJ8fG51bGw7dGhpcy5sb2codGhpcysiLmluaXRpYWxpemU6IixrLGwsaik7dGhpcy5sb2co
ImNyZWF0aW5nIGhpc3Rvcj0KeSBjb250ZW50czoiLGwpO3RoaXMuY29udGVudHM9M0RuZXcgaC5I
aXN0b3J5Q29udGVudHMobHx8W10se2hpc3RvcnlJZDp0aGlzPQouZ2V0KCJpZCIpfSk7dGhpcy5f
c2V0VXBMaXN0ZW5lcnMoKTt0aGlzLnVwZGF0ZVRpbWVvdXRJZD0zRG51bGx9LF9zZXRVcExpc3Q9
CmVuZXJzOmZ1bmN0aW9uKCl7dGhpcy5vbigiZXJyb3IiLGZ1bmN0aW9uKGssbixqLG0sbCl7dGhp
cy5lcnJvckhhbmRsZXIoayxuLD0KaixtLGwpfSk7aWYodGhpcy5jb250ZW50cyl7dGhpcy5saXN0
ZW5Ubyh0aGlzLmNvbnRlbnRzLCJlcnJvciIsZnVuY3Rpb24oKXt0PQpoaXMudHJpZ2dlci5hcHBs
eSh0aGlzLFsiZXJyb3I6Y29udGVudHMiXS5jb25jYXQoalF1ZXJ5Lm1ha2VBcnJheShhcmd1bWVu
dHM9CikpKX0pfXRoaXMub24oImNoYW5nZTppZCIsZnVuY3Rpb24oayxqKXtpZih0aGlzLmNvbnRl
bnRzKXt0aGlzLmNvbnRlbnRzLmhpcz0KdG9yeUlkPTNEan19LHRoaXMpfSxlcnJvckhhbmRsZXI6
ZnVuY3Rpb24oayxuLGosbSxsKXt0aGlzLmNsZWFyVXBkYXRlVGltZW91PQp0KCl9LG93bmVkQnlD
dXJyVXNlcjpmdW5jdGlvbigpe2lmKCFHYWxheHl8fCFHYWxheHkuY3VyclVzZXIpe3JldHVybiBm
YWxzZX09CmlmKEdhbGF4eS5jdXJyVXNlci5pc0Fub255bW91cygpfHxHYWxheHkuY3VyclVzZXIu
aWQhPTNEPTNEdGhpcy5nZXQoInVzZXJfaT0KZCIpKXtyZXR1cm4gZmFsc2V9cmV0dXJuIHRydWV9
LGNvbnRlbnRzQ291bnQ6ZnVuY3Rpb24oKXtyZXR1cm4gXy5yZWR1Y2UoXy52PQphbHVlcyh0aGlz
LmdldCgic3RhdGVfZGV0YWlscyIpKSxmdW5jdGlvbihqLGspe3JldHVybiBqK2t9LDApfSxzZWFy
Y2hBdHRyaWI9CnV0ZXM6WyJuYW1lIiwiYW5ub3RhdGlvbiIsInRhZ3MiXSxzZWFyY2hBbGlhc2Vz
Ont0aXRsZToibmFtZSIsdGFnOiJ0YWdzIn0sYz0KaGVja0ZvclVwZGF0ZXM6ZnVuY3Rpb24oail7
aWYodGhpcy5jb250ZW50cy5ydW5uaW5nKCkubGVuZ3RoKXt0aGlzLnNldFVwZGF0PQplVGltZW91
dCgpfWVsc2V7dGhpcy50cmlnZ2VyKCJyZWFkeSIpO2lmKF8uaXNGdW5jdGlvbihqKSl7ai5jYWxs
KHRoaXMpfX1yZXQ9CnVybiB0aGlzfSxzZXRVcGRhdGVUaW1lb3V0OmZ1bmN0aW9uKGope2o9M0Rq
fHxlLlVQREFURV9ERUxBWTt2YXIgaz0zRHRoaXM7dD0KaGlzLmNsZWFyVXBkYXRlVGltZW91dCgp
O3RoaXMudXBkYXRlVGltZW91dElkPTNEc2V0VGltZW91dChmdW5jdGlvbigpe2sucmVmPQpyZXNo
KCl9LGopO3JldHVybiB0aGlzLnVwZGF0ZVRpbWVvdXRJZH0sY2xlYXJVcGRhdGVUaW1lb3V0OmZ1
bmN0aW9uKCl7aWYodGg9CmlzLnVwZGF0ZVRpbWVvdXRJZCl7Y2xlYXJUaW1lb3V0KHRoaXMudXBk
YXRlVGltZW91dElkKTt0aGlzLnVwZGF0ZVRpbWVvdXRJZD0KPTNEbnVsbH19LHJlZnJlc2g6ZnVu
Y3Rpb24oayxqKXtrPTNEa3x8W107aj0zRGp8fHt9O3ZhciBsPTNEdGhpcztqLmRhdGE9M0RqPQou
ZGF0YXx8e307aWYoay5sZW5ndGgpe2ouZGF0YS5kZXRhaWxzPTNEay5qb2luKCIsIil9dmFyIG09
M0R0aGlzLmNvbnRlbnRzLmY9CmV0Y2goaik7bS5kb25lKGZ1bmN0aW9uKG4pe2wuY2hlY2tGb3JV
cGRhdGVzKGZ1bmN0aW9uKCl7dGhpcy5mZXRjaCgpfSl9KTtyZT0KdHVybiBtfSxfZGVsZXRlOmZ1
bmN0aW9uKGope2lmKHRoaXMuZ2V0KCJkZWxldGVkIikpe3JldHVybiBqUXVlcnkud2hlbigpfXJl
PQp0dXJuIHRoaXMuc2F2ZSh7ZGVsZXRlZDp0cnVlfSxqKX0scHVyZ2U6ZnVuY3Rpb24oail7aWYo
dGhpcy5nZXQoInB1cmdlZCIpKXs9CnJldHVybiBqUXVlcnkud2hlbigpfXJldHVybiB0aGlzLnNh
dmUoe2RlbGV0ZWQ6dHJ1ZSxwdXJnZWQ6dHJ1ZX0sail9LHVuZGVsZT0KdGU6ZnVuY3Rpb24oail7
aWYoIXRoaXMuZ2V0KCJkZWxldGVkIikpe3JldHVybiBqUXVlcnkud2hlbigpfXJldHVybiB0aGlz
LnNhPQp2ZSh7ZGVsZXRlZDpmYWxzZX0sail9LGNvcHk6ZnVuY3Rpb24obSxrKXttPTNEKG0hPTNE
PTNEdW5kZWZpbmVkKT8obSk6KHRydWU9Cik7aWYoIXRoaXMuaWQpe3Rocm93IG5ldyBFcnJvcigi
WW91IG11c3Qgc2V0IHRoZSBoaXN0b3J5IElEIGJlZm9yZSBjb3B5aW5nID0KaXQuIil9dmFyIGo9
M0R7aGlzdG9yeV9pZDp0aGlzLmlkfTtpZihtKXtqLmN1cnJlbnQ9M0R0cnVlfWlmKGspe2oubmFt
ZT0zRGt9PQp2YXIgbD0zRHRoaXMsbj0zRGpRdWVyeS5wb3N0KHRoaXMudXJsUm9vdCxqKTtpZiht
KXtyZXR1cm4gbi50aGVuKGZ1bmN0aW9uKG89Cil7dmFyIHA9M0RuZXcgZShvKTtyZXR1cm4gcC5z
ZXRBc0N1cnJlbnQoKS5kb25lKGZ1bmN0aW9uKCl7bC50cmlnZ2VyKCJjb3BpZT0KZCIsbCxvKX0p
fSl9cmV0dXJuIG4uZG9uZShmdW5jdGlvbihvKXtsLnRyaWdnZXIoImNvcGllZCIsbCxvKX0pfSxz
ZXRBc0N1cnJlPQpudDpmdW5jdGlvbigpe3ZhciBqPTNEdGhpcyxrPTNEalF1ZXJ5LmdldEpTT04o
Ii9oaXN0b3J5L3NldF9hc19jdXJyZW50P2lkPQo9M0QiK3RoaXMuaWQpO2suZG9uZShmdW5jdGlv
bigpe2oudHJpZ2dlcigic2V0LWFzLWN1cnJlbnQiLGopfSk7cmV0dXJuIGt9LHQ9Cm9TdHJpbmc6
ZnVuY3Rpb24oKXtyZXR1cm4iSGlzdG9yeSgiK3RoaXMuZ2V0KCJpZCIpKyIsIit0aGlzLmdldCgi
bmFtZSIpKyIpIj0KfX0pKTtlLlVQREFURV9ERUxBWT0zRDQwMDA7ZS5nZXRIaXN0b3J5RGF0YT0z
RGZ1bmN0aW9uIGMoaix2KXt2PTNEdnx8e307dmFyPQogcj0zRHYuZGV0YWlsSWRzRm58fFtdO3Zh
ciBtPTNEdi5oZGNhRGV0YWlsSWRzfHxbXTt2YXIgcz0zRGpRdWVyeS5EZWZlcnJlZCg9CikscD0z
RG51bGw7ZnVuY3Rpb24gayh3KXtpZihqPTNEPTNEPTNEImN1cnJlbnQiKXtyZXR1cm4galF1ZXJ5
LmdldEpTT04oZ2FsYT0KeHlfY29uZmlnLnJvb3QrImhpc3RvcnkvY3VycmVudF9oaXN0b3J5X2pz
b24iKX1yZXR1cm4galF1ZXJ5LmFqYXgoZ2FsYXh5X2NvPQpuZmlnLnJvb3QrImFwaS9oaXN0b3Jp
ZXMvIitqKX1mdW5jdGlvbiBvKHcpe3JldHVybiB3JiZ3LmVtcHR5fWZ1bmN0aW9uIHEoeCk9Cntp
ZihvKHgpKXtyZXR1cm5bXX1pZihfLmlzRnVuY3Rpb24ocikpe3I9M0RyKHgpfWlmKF8uaXNGdW5j
dGlvbihtKSl7bT0zRG0oeD0KKX12YXIgdz0zRHt9O2lmKHIubGVuZ3RoKXt3LmRhdGFzZXRfZGV0
YWlscz0zRHIuam9pbigiLCIpfWlmKG0ubGVuZ3RoKXt3LmRhPQp0YXNldF9jb2xsZWN0aW9uX2Rl
dGFpbHM9M0RtLmpvaW4oIiwiKX1yZXR1cm4galF1ZXJ5LmFqYXgoZ2FsYXh5X2NvbmZpZy5yb289
CnQrImFwaS9oaXN0b3JpZXMvIit4LmlkKyIvY29udGVudHMiLHtkYXRhOnd9KX12YXIgdD0zRHYu
aGlzdG9yeUZufHxrLHU9M0R2Lj0KY29udGVudHNGbnx8cTt2YXIgbj0zRHQoaik7bi5kb25lKGZ1
bmN0aW9uKHcpe3A9M0R3O3Mubm90aWZ5KHtzdGF0dXM6Imhpc3RvPQpyeSBkYXRhIHJldHJpZXZl
ZCIsaGlzdG9yeUpTT046cH0pfSk7bi5mYWlsKGZ1bmN0aW9uKHksdyx4KXtzLnJlamVjdCh5LCJs
b2E9CmRpbmcgdGhlIGhpc3RvcnkiKX0pO3ZhciBsPTNEbi50aGVuKHUpO2wudGhlbihmdW5jdGlv
bih3KXtzLm5vdGlmeSh7c3RhdHVzOj0KImNvbnRlbnRzIGRhdGEgcmV0cmlldmVkIixoaXN0b3J5
SlNPTjpwLGNvbnRlbnRzSlNPTjp3fSk7cy5yZXNvbHZlKHAsdyl9KTtsPQouZmFpbChmdW5jdGlv
bih5LHcseCl7cy5yZWplY3QoeSwibG9hZGluZyB0aGUgY29udGVudHMiLHtoaXN0b3J5OnB9KX0p
O3JldHU9CnJuIHN9O3ZhciBmPTNEQmFja2JvbmUuQ29sbGVjdGlvbi5leHRlbmQoaS5Mb2dnYWJs
ZU1peGluKS5leHRlbmQoe21vZGVsOmUsdT0KcmxSb290Oih3aW5kb3cuZ2FsYXh5X2NvbmZpZz9n
YWxheHlfY29uZmlnLnJvb3Q6Ii8iKSsiYXBpL2hpc3RvcmllcyIsaW5pdGlhPQpsaXplOmZ1bmN0
aW9uKGssail7aj0zRGp8fHt9O3RoaXMubG9nKCJIaXN0b3J5Q29sbGVjdGlvbi5pbml0aWFsaXpl
Iixhcmd1bWU9Cm50cyk7dGhpcy5pbmNsdWRlRGVsZXRlZD0zRGouaW5jbHVkZURlbGV0ZWR8fGZh
bHNlO3RoaXMuc2V0VXBMaXN0ZW5lcnMoKX0scz0KZXRVcExpc3RlbmVyczpmdW5jdGlvbiBhKCl7
dmFyIGo9M0R0aGlzO3RoaXMub24oImNoYW5nZTpkZWxldGVkIixmdW5jdGlvbihrPQope3RoaXMu
ZGVidWcoImNoYW5nZTpkZWxldGVkIixqLmluY2x1ZGVEZWxldGVkLGsuZ2V0KCJkZWxldGVkIikp
O2lmKCFqLmluY2w9CnVkZURlbGV0ZWQmJmsuZ2V0KCJkZWxldGVkIikpe2oucmVtb3ZlKGspfX0p
O3RoaXMub24oImNvcGllZCIsZnVuY3Rpb24oayxsKT0Ke3RoaXMudW5zaGlmdChuZXcgZShsLFtd
KSl9KX0sY3JlYXRlOmZ1bmN0aW9uIGcobSxrLGosbCl7dmFyIG89M0R0aGlzLG49M0RqPQpRdWVy
eS5nZXRKU09OKGdhbGF4eV9jb25maWcucm9vdCsiaGlzdG9yeS9jcmVhdGVfbmV3X2N1cnJlbnQi
KTtyZXR1cm4gbi5kb249CmUoZnVuY3Rpb24ocCl7dmFyIHE9M0RuZXcgZShwLFtdLGp8fHt9KTtv
LnVuc2hpZnQocSk7by50cmlnZ2VyKCJuZXctY3VycmVudD0KIil9KX0sdG9TdHJpbmc6ZnVuY3Rp
b24gYigpe3JldHVybiJIaXN0b3J5Q29sbGVjdGlvbigiK3RoaXMubGVuZ3RoKyIpIn19KTtyPQpl
dHVybntIaXN0b3J5OmUsSGlzdG9yeUNvbGxlY3Rpb246Zn19KTsKXCBObyBuZXdsaW5lIGF0IGVu
ZCBvZiBmaWxlCitkZWZpbmUoWyJtdmMvaGlzdG9yeS9oaXN0b3J5LWNvbnRlbnRzIiwibXZjL2Jh
c2UtbXZjIiwidXRpbHMvbG9jYWxpemF0aW9uIj0KXSxmdW5jdGlvbihoLGksZCl7dmFyIGU9M0RC
YWNrYm9uZS5Nb2RlbC5leHRlbmQoaS5Mb2dnYWJsZU1peGluKS5leHRlbmQoaS5tPQppeGluKGku
U2VhcmNoYWJsZU1vZGVsTWl4aW4se2RlZmF1bHRzOnttb2RlbF9jbGFzczoiSGlzdG9yeSIsaWQ6
bnVsbCxuYW1lOiI9ClVubmFtZWQgSGlzdG9yeSIsc3RhdGU6Im5ldyIsZGlza1NpemU6MCxkZWxl
dGVkOmZhbHNlfSx1cmxSb290OmdhbGF4eV9jb25maT0KZy5yb290KyJhcGkvaGlzdG9yaWVzIixp
bml0aWFsaXplOmZ1bmN0aW9uKGssbCxqKXtqPTNEanx8e307dGhpcy5sb2dnZXI9M0RqPQoubG9n
Z2VyfHxudWxsO3RoaXMubG9nKHRoaXMrIi5pbml0aWFsaXplOiIsayxsLGopO3RoaXMubG9nKCJj
cmVhdGluZyBoaXN0b3I9CnkgY29udGVudHM6IixsKTt0aGlzLmNvbnRlbnRzPTNEbmV3IGguSGlz
dG9yeUNvbnRlbnRzKGx8fFtdLHtoaXN0b3J5SWQ6dGhpcz0KLmdldCgiaWQiKX0pO3RoaXMuX3Nl
dFVwTGlzdGVuZXJzKCk7dGhpcy51cGRhdGVUaW1lb3V0SWQ9M0RudWxsfSxfc2V0VXBMaXN0PQpl
bmVyczpmdW5jdGlvbigpe3RoaXMub24oImVycm9yIixmdW5jdGlvbihrLG4saixtLGwpe3RoaXMu
ZXJyb3JIYW5kbGVyKGssbiw9CmosbSxsKX0pO2lmKHRoaXMuY29udGVudHMpe3RoaXMubGlzdGVu
VG8odGhpcy5jb250ZW50cywiZXJyb3IiLGZ1bmN0aW9uKCl7dD0KaGlzLnRyaWdnZXIuYXBwbHko
dGhpcyxbImVycm9yOmNvbnRlbnRzIl0uY29uY2F0KGpRdWVyeS5tYWtlQXJyYXkoYXJndW1lbnRz
PQopKSl9KX10aGlzLm9uKCJjaGFuZ2U6aWQiLGZ1bmN0aW9uKGssail7aWYodGhpcy5jb250ZW50
cyl7dGhpcy5jb250ZW50cy5oaXM9CnRvcnlJZD0zRGp9fSx0aGlzKX0sZXJyb3JIYW5kbGVyOmZ1
bmN0aW9uKGssbixqLG0sbCl7dGhpcy5jbGVhclVwZGF0ZVRpbWVvdT0KdCgpfSxvd25lZEJ5Q3Vy
clVzZXI6ZnVuY3Rpb24oKXtpZighR2FsYXh5fHwhR2FsYXh5LmN1cnJVc2VyKXtyZXR1cm4gZmFs
c2V9PQppZihHYWxheHkuY3VyclVzZXIuaXNBbm9ueW1vdXMoKXx8R2FsYXh5LmN1cnJVc2VyLmlk
IT0zRD0zRHRoaXMuZ2V0KCJ1c2VyX2k9CmQiKSl7cmV0dXJuIGZhbHNlfXJldHVybiB0cnVlfSxj
b250ZW50c0NvdW50OmZ1bmN0aW9uKCl7cmV0dXJuIF8ucmVkdWNlKF8udj0KYWx1ZXModGhpcy5n
ZXQoInN0YXRlX2RldGFpbHMiKSksZnVuY3Rpb24oaixrKXtyZXR1cm4gaitrfSwwKX0sc2VhcmNo
QXR0cmliPQp1dGVzOlsibmFtZSIsImFubm90YXRpb24iLCJ0YWdzIl0sc2VhcmNoQWxpYXNlczp7
dGl0bGU6Im5hbWUiLHRhZzoidGFncyJ9LGM9CmhlY2tGb3JVcGRhdGVzOmZ1bmN0aW9uKGope2lm
KHRoaXMuY29udGVudHMucnVubmluZygpLmxlbmd0aCl7dGhpcy5zZXRVcGRhdD0KZVRpbWVvdXQo
KX1lbHNle3RoaXMudHJpZ2dlcigicmVhZHkiKTtpZihfLmlzRnVuY3Rpb24oaikpe2ouY2FsbCh0
aGlzKX19cmV0PQp1cm4gdGhpc30sc2V0VXBkYXRlVGltZW91dDpmdW5jdGlvbihqKXtqPTNEanx8
ZS5VUERBVEVfREVMQVk7dmFyIGs9M0R0aGlzO3Q9Cmhpcy5jbGVhclVwZGF0ZVRpbWVvdXQoKTt0
aGlzLnVwZGF0ZVRpbWVvdXRJZD0zRHNldFRpbWVvdXQoZnVuY3Rpb24oKXtrLnJlZj0KcmVzaCgp
fSxqKTtyZXR1cm4gdGhpcy51cGRhdGVUaW1lb3V0SWR9LGNsZWFyVXBkYXRlVGltZW91dDpmdW5j
dGlvbigpe2lmKHRoPQppcy51cGRhdGVUaW1lb3V0SWQpe2NsZWFyVGltZW91dCh0aGlzLnVwZGF0
ZVRpbWVvdXRJZCk7dGhpcy51cGRhdGVUaW1lb3V0SWQ9Cj0zRG51bGx9fSxyZWZyZXNoOmZ1bmN0
aW9uKGssail7az0zRGt8fFtdO2o9M0RqfHx7fTt2YXIgbD0zRHRoaXM7ai5kYXRhPTNEaj0KLmRh
dGF8fHt9O2lmKGsubGVuZ3RoKXtqLmRhdGEuZGV0YWlscz0zRGsuam9pbigiLCIpfXZhciBtPTNE
dGhpcy5jb250ZW50cy5mPQpldGNoKGopO20uZG9uZShmdW5jdGlvbihuKXtsLmNoZWNrRm9yVXBk
YXRlcyhmdW5jdGlvbigpe3RoaXMuZmV0Y2goKX0pfSk7cmU9CnR1cm4gbX0sX2RlbGV0ZTpmdW5j
dGlvbihqKXtpZih0aGlzLmdldCgiZGVsZXRlZCIpKXtyZXR1cm4galF1ZXJ5LndoZW4oKX1yZT0K
dHVybiB0aGlzLnNhdmUoe2RlbGV0ZWQ6dHJ1ZX0sail9LHB1cmdlOmZ1bmN0aW9uKGope2lmKHRo
aXMuZ2V0KCJwdXJnZWQiKSl7PQpyZXR1cm4galF1ZXJ5LndoZW4oKX1yZXR1cm4gdGhpcy5zYXZl
KHtkZWxldGVkOnRydWUscHVyZ2VkOnRydWV9LGopfSx1bmRlbGU9CnRlOmZ1bmN0aW9uKGope2lm
KCF0aGlzLmdldCgiZGVsZXRlZCIpKXtyZXR1cm4galF1ZXJ5LndoZW4oKX1yZXR1cm4gdGhpcy5z
YT0KdmUoe2RlbGV0ZWQ6ZmFsc2V9LGopfSxjb3B5OmZ1bmN0aW9uKG0sayl7bT0zRChtIT0zRD0z
RHVuZGVmaW5lZCk/KG0pOih0cnVlPQopO2lmKCF0aGlzLmlkKXt0aHJvdyBuZXcgRXJyb3IoIllv
dSBtdXN0IHNldCB0aGUgaGlzdG9yeSBJRCBiZWZvcmUgY29weWluZyA9Cml0LiIpfXZhciBqPTNE
e2hpc3RvcnlfaWQ6dGhpcy5pZH07aWYobSl7ai5jdXJyZW50PTNEdHJ1ZX1pZihrKXtqLm5hbWU9
M0RrfT0KdmFyIGw9M0R0aGlzLG49M0RqUXVlcnkucG9zdCh0aGlzLnVybFJvb3Qsaik7aWYobSl7
cmV0dXJuIG4udGhlbihmdW5jdGlvbihvPQope3ZhciBwPTNEbmV3IGUobyk7cmV0dXJuIHAuc2V0
QXNDdXJyZW50KCkuZG9uZShmdW5jdGlvbigpe2wudHJpZ2dlcigiY29waWU9CmQiLGwsbyl9KX0p
fXJldHVybiBuLmRvbmUoZnVuY3Rpb24obyl7bC50cmlnZ2VyKCJjb3BpZWQiLGwsbyl9KX0sc2V0
QXNDdXJyZT0KbnQ6ZnVuY3Rpb24oKXt2YXIgaj0zRHRoaXMsaz0zRGpRdWVyeS5nZXRKU09OKGdh
bGF4eV9jb25maWcucm9vdCsiaGlzdG9yeS9zPQpldF9hc19jdXJyZW50P2lkPTNEIit0aGlzLmlk
KTtrLmRvbmUoZnVuY3Rpb24oKXtqLnRyaWdnZXIoInNldC1hcy1jdXJyZW50Iiw9CmopfSk7cmV0
dXJuIGt9LHRvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIkhpc3RvcnkoIit0aGlzLmdldCgiaWQi
KSsiLCIrdGhpcz0KLmdldCgibmFtZSIpKyIpIn19KSk7ZS5VUERBVEVfREVMQVk9M0Q0MDAwO2Uu
Z2V0SGlzdG9yeURhdGE9M0RmdW5jdGlvbiBjKGosPQp2KXt2PTNEdnx8e307dmFyIHI9M0R2LmRl
dGFpbElkc0ZufHxbXTt2YXIgbT0zRHYuaGRjYURldGFpbElkc3x8W107dmFyIHM9M0Q9CmpRdWVy
eS5EZWZlcnJlZCgpLHA9M0RudWxsO2Z1bmN0aW9uIGsodyl7aWYoaj0zRD0zRD0zRCJjdXJyZW50
Iil7cmV0dXJuIGpRdT0KZXJ5LmdldEpTT04oZ2FsYXh5X2NvbmZpZy5yb290KyJoaXN0b3J5L2N1
cnJlbnRfaGlzdG9yeV9qc29uIil9cmV0dXJuIGpRdWVyPQp5LmFqYXgoZ2FsYXh5X2NvbmZpZy5y
b290KyJhcGkvaGlzdG9yaWVzLyIrail9ZnVuY3Rpb24gbyh3KXtyZXR1cm4gdyYmdy5lbXA9CnR5
fWZ1bmN0aW9uIHEoeCl7aWYobyh4KSl7cmV0dXJuW119aWYoXy5pc0Z1bmN0aW9uKHIpKXtyPTNE
cih4KX1pZihfLmlzRnVuYz0KdGlvbihtKSl7bT0zRG0oeCl9dmFyIHc9M0R7fTtpZihyLmxlbmd0
aCl7dy5kYXRhc2V0X2RldGFpbHM9M0RyLmpvaW4oIiwiKX1pPQpmKG0ubGVuZ3RoKXt3LmRhdGFz
ZXRfY29sbGVjdGlvbl9kZXRhaWxzPTNEbS5qb2luKCIsIil9cmV0dXJuIGpRdWVyeS5hamF4KGc9
CmFsYXh5X2NvbmZpZy5yb290KyJhcGkvaGlzdG9yaWVzLyIreC5pZCsiL2NvbnRlbnRzIix7ZGF0
YTp3fSl9dmFyIHQ9M0R2Lmhpcz0KdG9yeUZufHxrLHU9M0R2LmNvbnRlbnRzRm58fHE7dmFyIG49
M0R0KGopO24uZG9uZShmdW5jdGlvbih3KXtwPTNEdztzLm5vdGlmPQp5KHtzdGF0dXM6Imhpc3Rv
cnkgZGF0YSByZXRyaWV2ZWQiLGhpc3RvcnlKU09OOnB9KX0pO24uZmFpbChmdW5jdGlvbih5LHcs
eCk9CntzLnJlamVjdCh5LCJsb2FkaW5nIHRoZSBoaXN0b3J5Iil9KTt2YXIgbD0zRG4udGhlbih1
KTtsLnRoZW4oZnVuY3Rpb24odyl7cz0KLm5vdGlmeSh7c3RhdHVzOiJjb250ZW50cyBkYXRhIHJl
dHJpZXZlZCIsaGlzdG9yeUpTT046cCxjb250ZW50c0pTT046d30pO3MuPQpyZXNvbHZlKHAsdyl9
KTtsLmZhaWwoZnVuY3Rpb24oeSx3LHgpe3MucmVqZWN0KHksImxvYWRpbmcgdGhlIGNvbnRlbnRz
Iix7aGk9CnN0b3J5OnB9KX0pO3JldHVybiBzfTt2YXIgZj0zREJhY2tib25lLkNvbGxlY3Rpb24u
ZXh0ZW5kKGkuTG9nZ2FibGVNaXhpbikuZT0KeHRlbmQoe21vZGVsOmUsdXJsUm9vdDood2luZG93
LmdhbGF4eV9jb25maWc/Z2FsYXh5X2NvbmZpZy5yb290OiIvIikrImFwaS9oPQppc3RvcmllcyIs
aW5pdGlhbGl6ZTpmdW5jdGlvbihrLGope2o9M0RqfHx7fTt0aGlzLmxvZygiSGlzdG9yeUNvbGxl
Y3Rpb24uaW49Cml0aWFsaXplIixhcmd1bWVudHMpO3RoaXMuaW5jbHVkZURlbGV0ZWQ9M0RqLmlu
Y2x1ZGVEZWxldGVkfHxmYWxzZTt0aGlzLnNldD0KVXBMaXN0ZW5lcnMoKX0sc2V0VXBMaXN0ZW5l
cnM6ZnVuY3Rpb24gYSgpe3ZhciBqPTNEdGhpczt0aGlzLm9uKCJjaGFuZ2U6ZGVsPQpldGVkIixm
dW5jdGlvbihrKXt0aGlzLmRlYnVnKCJjaGFuZ2U6ZGVsZXRlZCIsai5pbmNsdWRlRGVsZXRlZCxr
LmdldCgiZGVsZXQ9CmVkIikpO2lmKCFqLmluY2x1ZGVEZWxldGVkJiZrLmdldCgiZGVsZXRlZCIp
KXtqLnJlbW92ZShrKX19KTt0aGlzLm9uKCJjb3BpZT0KZCIsZnVuY3Rpb24oayxsKXt0aGlzLnVu
c2hpZnQobmV3IGUobCxbXSkpfSl9LGNyZWF0ZTpmdW5jdGlvbiBnKG0sayxqLGwpe3ZhPQpyIG89
M0R0aGlzLG49M0RqUXVlcnkuZ2V0SlNPTihnYWxheHlfY29uZmlnLnJvb3QrImhpc3RvcnkvY3Jl
YXRlX25ld19jdXJyZW49CnQiKTtyZXR1cm4gbi5kb25lKGZ1bmN0aW9uKHApe3ZhciBxPTNEbmV3
IGUocCxbXSxqfHx7fSk7by51bnNoaWZ0KHEpO28udHJpZz0KZ2VyKCJuZXctY3VycmVudCIpfSl9
LHRvU3RyaW5nOmZ1bmN0aW9uIGIoKXtyZXR1cm4iSGlzdG9yeUNvbGxlY3Rpb24oIit0aGlzPQou
bGVuZ3RoKyIpIn19KTtyZXR1cm57SGlzdG9yeTplLEhpc3RvcnlDb2xsZWN0aW9uOmZ9fSk7Clwg
Tm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQoKCmh0dHBzOi8vYml0YnVja2V0Lm9yZy9nYWxheHkv
Z2FsYXh5LWNlbnRyYWwvY29tbWl0cy8yYTJlYjI4YzA1NzMvCkNoYW5nZXNldDogICAyYTJlYjI4
YzA1NzMKQnJhbmNoOiAgICAgIHJlbGVhc2VfMTUuMDMKVXNlcjogICAgICAgIGNhcmxmZWJlcmhh
cmQKRGF0ZTogICAgICAgIDIwMTUtMDMtMjUgMjM6MzI6MTkrMDA6MDAKU3VtbWFyeTogICAgIEhE
QSBBUEk6IGRlc2VyaWFsaXppbmcgTm9uZSBpbiBtaXNjX2luZm8vaW5mbyBhcyB0aGUgZW1wdHkg
c3RyPQppbmcKQWZmZWN0ZWQgIzogIDIgZmlsZXMKCmRpZmYgLXIgZTJhZDM5N2EyZWM3Zjc0OGJm
MWI5NDE4YzJiMjlhYTM3OGU0MTY0NyAtciAyYTJlYjI4YzA1NzM2Y2Q1ZjgwNGQwNT0KMTE3YWY3
M2EyMDgyYmU1OTAgbGliL2dhbGF4eS9tYW5hZ2Vycy9iYXNlLnB5Ci0tLSBhL2xpYi9nYWxheHkv
bWFuYWdlcnMvYmFzZS5weQorKysgYi9saWIvZ2FsYXh5L21hbmFnZXJzL2Jhc2UucHkKQEAgLTcw
MCw4ICs3MDAsOCBAQAogICAgICAgICAgICAgc2V0YXR0ciggaXRlbSwga2V5LCB2YWwgKQogICAg
ICAgICByZXR1cm4gdmFsCj0yMAotICAgIGRlZiBkZXNlcmlhbGl6ZV9iYXNlc3RyaW5nKCBzZWxm
LCB0cmFucywgaXRlbSwga2V5LCB2YWwgKToKLSAgICAgICAgdmFsID0zRCBzZWxmLnZhbGlkYXRl
LmJhc2VzdHJpbmcoIGtleSwgdmFsICkKKyAgICBkZWYgZGVzZXJpYWxpemVfYmFzZXN0cmluZygg
c2VsZiwgdHJhbnMsIGl0ZW0sIGtleSwgdmFsLCBjb252ZXJ0X25vbmVfPQp0b19lbXB0eT0zREZh
bHNlICk6CisgICAgICAgIHZhbCA9M0QgJycgaWYgKCBjb252ZXJ0X25vbmVfdG9fZW1wdHkgYW5k
IHZhbCBpcyBOb25lICkgZWxzZSBzZWxmLj0KdmFsaWRhdGUuYmFzZXN0cmluZygga2V5LCB2YWwg
KQogICAgICAgICByZXR1cm4gc2VsZi5kZWZhdWx0X2Rlc2VyaWFsaXplciggdHJhbnMsIGl0ZW0s
IGtleSwgdmFsICkKPTIwCiAgICAgZGVmIGRlc2VyaWFsaXplX2Jvb2woIHNlbGYsIHRyYW5zLCBp
dGVtLCBrZXksIHZhbCApOgoKZGlmZiAtciBlMmFkMzk3YTJlYzdmNzQ4YmYxYjk0MThjMmIyOWFh
Mzc4ZTQxNjQ3IC1yIDJhMmViMjhjMDU3MzZjZDVmODA0ZDA1PQoxMTdhZjczYTIwODJiZTU5MCBs
aWIvZ2FsYXh5L21hbmFnZXJzL2hkYXMucHkKLS0tIGEvbGliL2dhbGF4eS9tYW5hZ2Vycy9oZGFz
LnB5CisrKyBiL2xpYi9nYWxheHkvbWFuYWdlcnMvaGRhcy5weQpAQCAtMzg5LDcgKzM4OSw3IEBA
CiAgICAgICAgICAgICAnaGRhX2xkZGEnICAgICAgOiBsYW1iZGEgKmE6ICdoZGEnLAo9MjAKICAg
ICAgICAgICAgICMgcmVtYXBwZWQKLSAgICAgICAgICAgICdpbmZvJyAgICAgICAgICA6IGxhbWJk
YSB0LCBpLCBrOiBpLmluZm8uc3RyaXAoKSBpZiBpc2luc3RhbmNlPQooIGkuaW5mbywgYmFzZXN0
cmluZyApIGVsc2UgaS5pbmZvLAorICAgICAgICAgICAgJ2luZm8nICAgICAgICAgIDogbGFtYmRh
IHQsIGksIGs6IGkuaW5mby5zdHJpcCgpIGlmIGlzaW5zdGFuY2U9CiggaS5pbmZvLCBiYXNlc3Ry
aW5nICkgZWxzZSAnJywKICAgICAgICAgICAgICdtaXNjX2luZm8nICAgICA6IGxhbWJkYSB0LCBp
LCBrOiBzZWxmLnNlcmlhbGl6ZXJzWyAnaW5mbycgXSggPQp0LCBpLCBrICksCiAgICAgICAgICAg
ICAnbWlzY19ibHVyYicgICAgOiBsYW1iZGEgdCwgaSwgazogaS5ibHVyYiwKICAgICAgICAgICAg
ICdnZW5vbWVfYnVpbGQnICA6IGxhbWJkYSB0LCBpLCBrOiBpLmRia2V5LApAQCAtNTg0LDcgKzU4
NCw4IEBACj0yMAogICAgICAgICAgICAgIyByZW1hcHBlZAogICAgICAgICAgICAgJ2dlbm9tZV9i
dWlsZCcgIDogbGFtYmRhIHQsIGksIGssIHY6IHNlbGYuZGVzZXJpYWxpemVfZ2Vub21lX2I9CnVp
bGQoIHQsIGksICdkYmtleScsIHYgKSwKLSAgICAgICAgICAgICdtaXNjX2luZm8nICAgICA6IGxh
bWJkYSB0LCBpLCBrLCB2OiBzZWxmLmRlc2VyaWFsaXplX2Jhc2VzdHJpPQpuZyggdCwgaSwgJ2lu
Zm8nLCB2ICksCisgICAgICAgICAgICAnbWlzY19pbmZvJyAgICAgOiBsYW1iZGEgdCwgaSwgaywg
djogKAorICAgICAgICAgICAgICAgIHNlbGYuZGVzZXJpYWxpemVfYmFzZXN0cmluZyggdCwgaSwg
J2luZm8nLCB2LCBjb252ZXJ0X25vbmU9Cl90b19lbXB0eT0zRFRydWUgKSApLAo9MjAKICAgICAg
ICAgICAgICNUT0RPOiBtaXhpbjogZGVsZXRhYmxlCiAgICAgICAgICAgICAnZGVsZXRlZCcgICAg
ICAgOiBzZWxmLmRlc2VyaWFsaXplX2Jvb2wsCgoKaHR0cHM6Ly9iaXRidWNrZXQub3JnL2dhbGF4
eS9nYWxheHktY2VudHJhbC9jb21taXRzLzYyZDM2Yjk0YmVlYy8KQ2hhbmdlc2V0OiAgIDYyZDM2
Yjk0YmVlYwpCcmFuY2g6ICAgICAgcmVsZWFzZV8xNS4wMwpVc2VyOiAgICAgICAgam1jaGlsdG9u
CkRhdGU6ICAgICAgICAyMDE1LTAzLTI2IDAzOjAxOjI5KzAwOjAwClN1bW1hcnk6ICAgICBSZS1l
bmFibGUgam9iIG1ldHJpY3MgYnkgZGVmYXVsdC4KClRoaXMgaGFzIGJlZW4gYnJva2VuIHNpbmNl
IDE0LjEwLgpBZmZlY3RlZCAjOiAgMSBmaWxlCgpkaWZmIC1yIDJhMmViMjhjMDU3MzZjZDVmODA0
ZDA1MTE3YWY3M2EyMDgyYmU1OTAgLXIgNjJkMzZiOTRiZWVjZGZmNzA5YmM0NDc9CjZjMGU5OThi
NzVhNGY5ZGRmIGxpYi9nYWxheHkvY29uZmlnLnB5Ci0tLSBhL2xpYi9nYWxheHkvY29uZmlnLnB5
CisrKyBiL2xpYi9nYWxheHkvY29uZmlnLnB5CkBAIC00NjYsNyArNDY2LDcgQEAKICAgICAgICAg
ICAgIGRhdGF0eXBlc19jb25maWdfZmlsZT0zRFsgJ2NvbmZpZy9kYXRhdHlwZXNfY29uZi54bWwn
LCAnZGF0YXR5PQpwZXNfY29uZi54bWwnLCAnY29uZmlnL2RhdGF0eXBlc19jb25mLnhtbC5zYW1w
bGUnIF0sCiAgICAgICAgICAgICBleHRlcm5hbF9zZXJ2aWNlX3R5cGVfY29uZmlnX2ZpbGU9M0Rb
ICdjb25maWcvZXh0ZXJuYWxfc2VydmljZT0KX3R5cGVzX2NvbmYueG1sJywgJ2V4dGVybmFsX3Nl
cnZpY2VfdHlwZXNfY29uZi54bWwnLCAnY29uZmlnL2V4dGVybmFsX3NlcnZpPQpjZV90eXBlc19j
b25mLnhtbC5zYW1wbGUnIF0sCiAgICAgICAgICAgICBqb2JfY29uZmlnX2ZpbGU9M0RbICdjb25m
aWcvam9iX2NvbmYueG1sJywgJ2pvYl9jb25mLnhtbCcgXSwKLSAgICAgICAgICAgIGpvYl9tZXRy
aWNzX2NvbmZpZ19maWxlPTNEWyAnY29uZmlnL2pvYl9tZXRyaWNzX2NvbmYueG1sJywgJ2pvPQpi
X21ldHJpY3NfY29uZi54bWwnIF0sCisgICAgICAgICAgICBqb2JfbWV0cmljc19jb25maWdfZmls
ZT0zRFsgJ2NvbmZpZy9qb2JfbWV0cmljc19jb25mLnhtbCcsICdqbz0KYl9tZXRyaWNzX2NvbmYu
eG1sJywnY29uZmlnL2pvYl9tZXRyaWNzX2NvbmYueG1sLnNhbXBsZScgXSwKICAgICAgICAgICAg
IGRlcGVuZGVuY3lfcmVzb2x2ZXJzX2NvbmZpZ19maWxlPTNEWyAnY29uZmlnL2RlcGVuZGVuY3lf
cmVzb2x2PQplcnNfY29uZi54bWwnLCAnZGVwZW5kZW5jeV9yZXNvbHZlcnNfY29uZi54bWwnIF0s
CiAgICAgICAgICAgICBqb2JfcmVzb3VyY2VfcGFyYW1zX2ZpbGU9M0RbICdjb25maWcvam9iX3Jl
c291cmNlX3BhcmFtc19jb25mLj0KeG1sJywgJ2pvYl9yZXNvdXJjZV9wYXJhbXNfY29uZi54bWwn
IF0sCiAgICAgICAgICAgICBtaWdyYXRlZF90b29sc19jb25maWc9M0RbICdtaWdyYXRlZF90b29s
c19jb25mLnhtbCcsICdjb25maWcvbT0KaWdyYXRlZF90b29sc19jb25mLnhtbCcgXSwKCgpodHRw
czovL2JpdGJ1Y2tldC5vcmcvZ2FsYXh5L2dhbGF4eS1jZW50cmFsL2NvbW1pdHMvNGEzZjFmYmY3
ZDFhLwpDaGFuZ2VzZXQ6ICAgNGEzZjFmYmY3ZDFhCkJyYW5jaDogICAgICByZWxlYXNlXzE1LjAz
ClVzZXI6ICAgICAgICBqbWNoaWx0b24KRGF0ZTogICAgICAgIDIwMTUtMDMtMjYgMTg6NDg6MDgr
MDA6MDAKU3VtbWFyeTogICAgIEZpeCBwcm94aWVkIEFQSSB0b29sIGRvd25sb2Fkcy4KCkZyb20g
SVJDOgoKMTc6MjIgPCBrZWxscm90dD4gQW55IGlkZWFzIGFib3V0IGhvdyB0byBkZWFsIHdpdGgg
aHR0cHM6Ly9naXRodWIuY29tL2JncnVlPQpuaW5nL2RvY2tlci1nYWxheHktc3RhYmxlL2lzc3Vl
cy81MCA/CjE3OjIyIDwgbXJzY3JpYmU+IFRpdGxlOiBUb29sIGRvd25sb2FkcyBhcmUgbm90IHdv
cmtpbmcgPUMyPUI3IElzc3VlICM1MCA9Cj1DMj1CNyBiZ3J1ZW5pbmcvZG9ja2VyLWdhbGF4eS1z
dGFibGUgPUMyPUI3IEdpdEh1YiAoYXQKICAgICAgICAgICAgICAgICAgZ2l0aHViLmNvbSkKMTc6
MjQgPCBrZWxscm90dD4gSSB0aGluayBpdHMgZnJvbSBob3cgdGhlIHRvb2wgZG93bmxvYWQgZnVu
Y3Rpb24gdW5saW5rcyBhPQogZmlsZSB3aGlsZSBob2xkaW5nIHRoZSBvcGVuIGZpbGUgaGFuZGxl
CiAgICAgICAgICAgICAgICAgICggaHR0cHM6Ly9naXRodWIuY29tL2dhbGF4eXByb2plY3QvZ2Fs
YXh5L2Jsb2IvZGV2L2xpYi9nYT0KbGF4eS93ZWJhcHBzL2dhbGF4eS9hcGkvdG9vbHMucHkjTDIw
OCApCjE3OjI0IDwgbXJzY3JpYmU+IFRpdGxlOiBnYWxheHkvdG9vbHMucHkgYXQgZGV2ID1DMj1C
NyBnYWxheHlwcm9qZWN0L2dhbGF4eT0KID1DMj1CNyBHaXRIdWIgKGF0IGdpdGh1Yi5jb20pCjE3
OjI3IDwgam1jaGlsdG9uPiBIYXZlIHlvdSB0cmllZCBub3QgdW5saW5raW5nIHRoYXQgZmlsZT8K
MTc6MjggPCBqbWNoaWx0b24+IElmIHRoYXQgZml4ZXMgaXQgSSBoYXZlIG5vIHByb2JsZW0ganVz
dCBsZWF2aW5nIHRoZSBmaWxlPQogaW4gdGVtcCAtIEdhbGF4eSBsZWF2ZXMgYSBsb3Qgb2Ygc3R1
ZmYKICAgICAgICAgICAgICAgICAgIGluIHRlbXAgYW55d2F5CjE3OjQ2IDwga2VsbHJvdHQ+IHll
cCwgdGhhdCBkb2VzIHRoZSB0cmljawoKQ2xvc2VzIGJncnVlbmluZy9kb2NrZXItZ2FsYXh5LXN0
YWJsZSM1MC4KQWZmZWN0ZWQgIzogIDEgZmlsZQoKZGlmZiAtciA2MmQzNmI5NGJlZWNkZmY3MDli
YzQ0NzZjMGU5OThiNzVhNGY5ZGRmIC1yIDRhM2YxZmJmN2QxYTEzZjQ4ZDA1OWQzPQpkZTE5ZmFj
M2M1NDFkMTQ3YiBsaWIvZ2FsYXh5L3dlYmFwcHMvZ2FsYXh5L2FwaS90b29scy5weQotLS0gYS9s
aWIvZ2FsYXh5L3dlYmFwcHMvZ2FsYXh5L2FwaS90b29scy5weQorKysgYi9saWIvZ2FsYXh5L3dl
YmFwcHMvZ2FsYXh5L2FwaS90b29scy5weQpAQCAtMTQ1LDcgKzE0NSw2IEBACiAgICAgICAgIGlm
IHN1Y2Nlc3M6CiAgICAgICAgICAgICB0cmFucy5yZXNwb25zZS5zZXRfY29udGVudF90eXBlKCAn
YXBwbGljYXRpb24veC1nemlwJyApCiAgICAgICAgICAgICBkb3dubG9hZF9maWxlID0zRCBvcGVu
KCB0b29sX3RhcmJhbGwgKQotICAgICAgICAgICAgb3MudW5saW5rKCB0b29sX3RhcmJhbGwgKQog
ICAgICAgICAgICAgdGFyYmFsbF9wYXRoLCBmaWxlbmFtZSA9M0Qgb3MucGF0aC5zcGxpdCggdG9v
bF90YXJiYWxsICkKICAgICAgICAgICAgIHRyYW5zLnJlc3BvbnNlLmhlYWRlcnNbICJDb250ZW50
LURpc3Bvc2l0aW9uIiBdID0zRCAnYXR0YWNobWVuPQp0OyBmaWxlbmFtZT0zRCIlcy50Z3oiJyAl
ICggaWQgKQogICAgICAgICAgICAgcmV0dXJuIGRvd25sb2FkX2ZpbGUKCgpodHRwczovL2JpdGJ1
Y2tldC5vcmcvZ2FsYXh5L2dhbGF4eS1jZW50cmFsL2NvbW1pdHMvYmQ4MTQzYWNhNDNjLwpDaGFu
Z2VzZXQ6ICAgYmQ4MTQzYWNhNDNjCkJyYW5jaDogICAgICByZWxlYXNlXzE1LjAzClVzZXI6ICAg
ICAgICBndWVybGVyCkRhdGU6ICAgICAgICAyMDE1LTAzLTI3IDE4OjAyOjQ4KzAwOjAwClN1bW1h
cnk6ICAgICBGaXggZGVmYXVsdCB2YWx1ZXMgZm9yIGNvbmRpdGlvbmFsIG11bHRpIHNlbGVjdCBm
aWVsZHMKQWZmZWN0ZWQgIzogIDEgZmlsZQoKZGlmZiAtciA0YTNmMWZiZjdkMWExM2Y0OGQwNTlk
M2RlMTlmYWMzYzU0MWQxNDdiIC1yIGJkODE0M2FjYTQzY2FhNmM0ODUwOWYzPQoyYzI3M2M5Y2Ey
YmUyMjMxNiBsaWIvZ2FsYXh5L3Rvb2xzL19faW5pdF9fLnB5Ci0tLSBhL2xpYi9nYWxheHkvdG9v
bHMvX19pbml0X18ucHkKKysrIGIvbGliL2dhbGF4eS90b29scy9fX2luaXRfXy5weQpAQCAtMjQz
Myw3ICsyNDMzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgY29udGludWUKPTIwCiAgICAgICAg
ICAgICAgICAgIyBzdGF0ZSBmb3Igc3Vic2VjdGlvbi9ncm91cAotICAgICAgICAgICAgICAgIGdy
b3VwX3N0YXRlID0zRCBzdGF0ZV9pbnB1dHNbaW5wdXQubmFtZV0KKyAgICAgICAgICAgICAgICBn
cm91cF9zdGF0ZSA9M0Qgc3RhdGVfaW5wdXRzLmdldChpbnB1dC5uYW1lLCB7fSkKPTIwCiAgICAg
ICAgICAgICAgICAgIyBpdGVyYXRlIGFuZCB1cGRhdGUgdmFsdWVzCiAgICAgICAgICAgICAgICAg
aWYgaW5wdXQudHlwZSA9M0Q9M0QgJ3JlcGVhdCc6CkBAIC0yNDQ0LDcgKzI0NDQsOSBAQAogICAg
ICAgICAgICAgICAgIGVsaWYgaW5wdXQudHlwZSA9M0Q9M0QgJ2NvbmRpdGlvbmFsJzoKICAgICAg
ICAgICAgICAgICAgICAgaWYgJ3Rlc3RfcGFyYW0nIGluIHRvb2xfZGljdDoKICAgICAgICAgICAg
ICAgICAgICAgICAgIHRlc3RfcGFyYW0gPTNEIHRvb2xfZGljdFsndGVzdF9wYXJhbSddCi0gICAg
ICAgICAgICAgICAgICAgICAgICB0ZXN0X3BhcmFtWyd2YWx1ZSddID0zRCBqc29uaWZ5KGdyb3Vw
X3N0YXRlW3Rlc3RfcD0KYXJhbVsnbmFtZSddXSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRl
c3RfcGFyYW1bJ3ZhbHVlJ10gPTNEIGpzb25pZnkoZ3JvdXBfc3RhdGUuZ2V0KHRlPQpzdF9wYXJh
bVsnbmFtZSddLCBOb25lKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciBpIGluIHJhbmdl
IChsZW4gKCB0b29sX2RpY3RbJ2Nhc2VzJ10gKSApOgorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGl0ZXJhdGUodG9vbF9kaWN0WydjYXNlcyddW2ldWydpbnB1dHMnXSwgaW5wdXQ9Ci5jYXNl
c1tpXS5pbnB1dHMsIHt9LCBvdGhlcl92YWx1ZXMpCiAgICAgICAgICAgICAgICAgICAgICAgICBp
ZiAnX19jdXJyZW50X2Nhc2VfXycgaW4gZ3JvdXBfc3RhdGU6CiAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgaSA9M0QgZ3JvdXBfc3RhdGVbJ19fY3VycmVudF9jYXNlX18nXQogICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGl0ZXJhdGUodG9vbF9kaWN0WydjYXNlcyddW2ldWydpbnB1dHMn
XSwgaW5wdXQ9Ci5jYXNlc1tpXS5pbnB1dHMsIGdyb3VwX3N0YXRlLCBvdGhlcl92YWx1ZXMpCkBA
IC0yNDYyLDggKzI0NjQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgdG9vbF9kaWN0Wydk
ZWZhdWx0X3ZhbHVlJ10gPTNEIGlucHV0LmdldF9pbml0aWFsX3Y9CmFsdWUodHJhbnMsIG90aGVy
X3ZhbHVlcykKPTIwCiAgICAgICAgICAgICAgICAgICAgICAgICAjIHVwZGF0ZSBpbnB1dCB2YWx1
ZSBmcm9tIHRvb2wgc3RhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIGlucHV0X25hbWUg
aW4gc3RhdGVfaW5wdXRzOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvb2xfZGljdFsn
dmFsdWUnXSA9M0Qgc3RhdGVfaW5wdXRzW2lucHV0X25hbWVdCisgICAgICAgICAgICAgICAgICAg
ICAgICB0b29sX2RpY3RbJ3ZhbHVlJ10gPTNEIHN0YXRlX2lucHV0cy5nZXQoaW5wdXRfbmFtZT0K
LCBOb25lKQo9MjAKICAgICAgICAgICAgICAgICAgICAgICAgICMgc2FuaXRpemUgdmFsdWVzCiAg
ICAgICAgICAgICAgICAgICAgICAgICBzYW5pdGl6ZSh0b29sX2RpY3QsICd2YWx1ZScpCgoKaHR0
cHM6Ly9iaXRidWNrZXQub3JnL2dhbGF4eS9nYWxheHktY2VudHJhbC9jb21taXRzLzg5NzE2OTM2
NTQ5Ni8KQ2hhbmdlc2V0OiAgIDg5NzE2OTM2NTQ5NgpCcmFuY2g6ICAgICAgcmVsZWFzZV8xNS4w
MwpVc2VyOiAgICAgICAgZ3VlcmxlcgpEYXRlOiAgICAgICAgMjAxNS0wMy0yNyAxODo1NjoyMCsw
MDowMApTdW1tYXJ5OiAgICAgSGFuZGxlIGZhaWxlZCBsYXRlIHZhbGlkYXRpb24KQWZmZWN0ZWQg
IzogIDEgZmlsZQoKZGlmZiAtciBiZDgxNDNhY2E0M2NhYTZjNDg1MDlmMzJjMjczYzljYTJiZTIy
MzE2IC1yIDg5NzE2OTM2NTQ5NjIxNWE2OWNmYjk5PQo3ZDM2MTNhMjFiNTVjZmVlYiBsaWIvZ2Fs
YXh5L3Rvb2xzL19faW5pdF9fLnB5Ci0tLSBhL2xpYi9nYWxheHkvdG9vbHMvX19pbml0X18ucHkK
KysrIGIvbGliL2dhbGF4eS90b29scy9fX2luaXRfXy5weQpAQCAtMjQ0NiwxMCArMjQ0NiwxMCBA
QAogICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9wYXJhbSA9M0QgdG9vbF9kaWN0Wyd0ZXN0
X3BhcmFtJ10KICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RfcGFyYW1bJ3ZhbHVlJ10gPTNE
IGpzb25pZnkoZ3JvdXBfc3RhdGUuZ2V0KHRlPQpzdF9wYXJhbVsnbmFtZSddLCBOb25lKSkKICAg
ICAgICAgICAgICAgICAgICAgICAgIGZvciBpIGluIHJhbmdlIChsZW4gKCB0b29sX2RpY3RbJ2Nh
c2VzJ10gKSApOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdGUodG9vbF9kaWN0
WydjYXNlcyddW2ldWydpbnB1dHMnXSwgaW5wdXQ9Ci5jYXNlc1tpXS5pbnB1dHMsIHt9LCBvdGhl
cl92YWx1ZXMpCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAnX19jdXJyZW50X2Nhc2VfXycg
aW4gZ3JvdXBfc3RhdGU6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA9M0QgZ3JvdXBf
c3RhdGVbJ19fY3VycmVudF9jYXNlX18nXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0
ZXJhdGUodG9vbF9kaWN0WydjYXNlcyddW2ldWydpbnB1dHMnXSwgaW5wdXQ9Ci5jYXNlc1tpXS5p
bnB1dHMsIGdyb3VwX3N0YXRlLCBvdGhlcl92YWx1ZXMpCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgY3VycmVudF9zdGF0ZSA9M0Qge30KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBp
ZiBpID0zRD0zRCBncm91cF9zdGF0ZS5nZXQoJ19fY3VycmVudF9jYXNlX18nPQosIE5vbmUpOgor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X3N0YXRlID0zRCBncm91cF9z
dGF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdGUodG9vbF9kaWN0WydjYXNl
cyddW2ldWydpbnB1dHMnXSwgaW5wdXQ9Ci5jYXNlc1tpXS5pbnB1dHMsIGN1cnJlbnRfc3RhdGUs
IG90aGVyX3ZhbHVlcykKICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAg
ICAjIGNyZWF0ZSBpbnB1dCBkaWN0aW9uYXJ5LCB0cnkgdG8gcGFzcyBvdGhlcl92YWx1ZXMgaWY9
CiB0b19kaWN0IGZ1bmN0aW9uIHN1cHBvcnRzIGl0IGUuZy4gZHluYW1pYyBvcHRpb25zCiAgICAg
ICAgICAgICAgICAgICAgIHRyeToKQEAgLTI0NjEsNyArMjQ2MSwxMSBAQAogICAgICAgICAgICAg
ICAgICAgICBpbnB1dF9uYW1lID0zRCB0b29sX2RpY3QuZ2V0KCduYW1lJykKICAgICAgICAgICAg
ICAgICAgICAgaWYgaW5wdXRfbmFtZToKICAgICAgICAgICAgICAgICAgICAgICAgICMgYmFja3Vw
IGRlZmF1bHQgdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgIHRvb2xfZGljdFsnZGVmYXVs
dF92YWx1ZSddID0zRCBpbnB1dC5nZXRfaW5pdGlhbF92PQphbHVlKHRyYW5zLCBvdGhlcl92YWx1
ZXMpCisgICAgICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgdG9vbF9kaWN0WydkZWZhdWx0X3ZhbHVlJ10gPTNEIGlucHV0LmdldF9pbml0aT0KYWxf
dmFsdWUodHJhbnMsIG90aGVyX3ZhbHVlcykKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2Vw
dCBFeGNlcHRpb246CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBnZXQgaW5pdGlhbCB2
YWx1ZSBmYWlsZWQgZHVlIHRvIGltcHJvcGVyIGxhdD0KZSB2YWxpZGF0aW9uCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgcGFzcwo9MjAKICAgICAgICAgICAgICAgICAgICAgICAgICMgdXBk
YXRlIGlucHV0IHZhbHVlIGZyb20gdG9vbCBzdGF0ZQogICAgICAgICAgICAgICAgICAgICAgICAg
dG9vbF9kaWN0Wyd2YWx1ZSddID0zRCBzdGF0ZV9pbnB1dHMuZ2V0KGlucHV0X25hbWU9CiwgTm9u
ZSkKCgpodHRwczovL2JpdGJ1Y2tldC5vcmcvZ2FsYXh5L2dhbGF4eS1jZW50cmFsL2NvbW1pdHMv
OTJhMDkxM2EwOGI3LwpDaGFuZ2VzZXQ6ICAgOTJhMDkxM2EwOGI3CkJyYW5jaDogICAgICByZWxl
YXNlXzE1LjAzClVzZXI6ICAgICAgICBndWVybGVyCkRhdGU6ICAgICAgICAyMDE1LTAzLTI3IDE5
OjE3OjA5KzAwOjAwClN1bW1hcnk6ICAgICBTZXQgKGRlZmF1bHQpIGRlZmF1bHQgdmFsdWUgdG8g
Tm9uZQpBZmZlY3RlZCAjOiAgMSBmaWxlCgpkaWZmIC1yIDg5NzE2OTM2NTQ5NjIxNWE2OWNmYjk5
N2QzNjEzYTIxYjU1Y2ZlZWIgLXIgOTJhMDkxM2EwOGI3OGRmNTMxNTg3ZGM9Cjc5ZmRjODA0MDA5
NDMzYzBlIGxpYi9nYWxheHkvdG9vbHMvX19pbml0X18ucHkKLS0tIGEvbGliL2dhbGF4eS90b29s
cy9fX2luaXRfXy5weQorKysgYi9saWIvZ2FsYXh5L3Rvb2xzL19faW5pdF9fLnB5CkBAIC0yNDY1
LDYgKzI0NjUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvb2xfZGljdFsnZGVm
YXVsdF92YWx1ZSddID0zRCBpbnB1dC5nZXRfaW5pdGk9CmFsX3ZhbHVlKHRyYW5zLCBvdGhlcl92
YWx1ZXMpCiAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICMgZ2V0IGluaXRpYWwgdmFsdWUgZmFpbGVkIGR1ZSB0byBp
bXByb3BlciBsYXQ9CmUgdmFsaWRhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRv
b2xfZGljdFsnZGVmYXVsdF92YWx1ZSddID0zRCBOb25lCiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgcGFzcwo9MjAKICAgICAgICAgICAgICAgICAgICAgICAgICMgdXBkYXRlIGlucHV0IHZh
bHVlIGZyb20gdG9vbCBzdGF0ZQoKCmh0dHBzOi8vYml0YnVja2V0Lm9yZy9nYWxheHkvZ2FsYXh5
LWNlbnRyYWwvY29tbWl0cy8xMzAzNzY2MWYxYjkvCkNoYW5nZXNldDogICAxMzAzNzY2MWYxYjkK
QnJhbmNoOiAgICAgIHJlbGVhc2VfMTUuMDMKVXNlcjogICAgICAgIG5hdGVmb28KRGF0ZTogICAg
ICAgIDIwMTUtMDMtMzAgMTY6MzI6MzArMDA6MDAKU3VtbWFyeTogICAgIEFwcGx5IEBkYW5ub24n
cyBjaGFuZ2UgZnJvbSBHYWxheHkgdG8gdGhlIFRvb2wgU2hlZCBkaXNhYmxpbmcgPQpzdGF0aWMK
bWlkZGxld2FyZSB3aGVuIHVXU0dJIGlzIGluIHVzZS4KQWZmZWN0ZWQgIzogIDEgZmlsZQoKZGlm
ZiAtciA5MmEwOTEzYTA4Yjc4ZGY1MzE1ODdkYzc5ZmRjODA0MDA5NDMzYzBlIC1yIDEzMDM3NjYx
ZjFiOTExZmQ4OTQ2N2ZkPQplN2IwYjRiZTcwZDQzYTBlYiBsaWIvZ2FsYXh5L3dlYmFwcHMvdG9v
bF9zaGVkL2J1aWxkYXBwLnB5Ci0tLSBhL2xpYi9nYWxheHkvd2ViYXBwcy90b29sX3NoZWQvYnVp
bGRhcHAucHkKKysrIGIvbGliL2dhbGF4eS93ZWJhcHBzL3Rvb2xfc2hlZC9idWlsZGFwcC5weQpA
QCAtMTM0LDggKzEzNCwyMyBAQAogICAgICMgV3JhcCB0aGUgd2ViYXBwIGluIHNvbWUgdXNlZnVs
IG1pZGRsZXdhcmUKICAgICBpZiBrd2FyZ3MuZ2V0KCAnbWlkZGxld2FyZScsIFRydWUgKToKICAg
ICAgICAgd2ViYXBwID0zRCB3cmFwX2luX21pZGRsZXdhcmUoIHdlYmFwcCwgZ2xvYmFsX2NvbmYs
ICoqa3dhcmdzICkKLSAgICBpZiBhc2Jvb2woIGt3YXJncy5nZXQoICdzdGF0aWNfZW5hYmxlZCcs
IFRydWUgKSApOgotICAgICAgICB3ZWJhcHAgPTNEIHdyYXBfaW5fc3RhdGljKCB3ZWJhcHAsIGds
b2JhbF9jb25mLCAqKmt3YXJncyApCisgICAgIyBURVNUIEZPUiBVV1NHSSAtLSBUT0RPIHNhdmUg
dGhpcyBzb21ld2hlcmUgc28gd2Ugb25seSBoYXZlIHRvIGRvIGl0ID0Kb25jZS4KKyAgICBpc191
d3NnaSA9M0QgRmFsc2UKKyAgICB0cnk6CisgICAgICAgICMgVGhlIHV3c2dpIG1vZHVsZSBpcyBh
dXRvbWF0aWNhbGx5IGluamVjdGVkIGJ5IHRoZSBwYXJlbnQgdXdzZ2kKKyAgICAgICAgIyBwcm9j
ZXNzIGFuZCBvbmx5IGV4aXN0cyB0aGF0IHdheS4gIElmIGFueXRoaW5nIHdvcmtzLCB0aGlzIGlz
IGEKKyAgICAgICAgIyB1d3NnaS1tYW5hZ2VkIHByb2Nlc3MuCisgICAgICAgIGltcG9ydCB1d3Nn
aQorICAgICAgICBpc191d3NnaSA9M0QgdXdzZ2kubnVtcHJvYworICAgICAgICBpc191d3NnaSA9
M0QgVHJ1ZQorICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgIyBUaGlzIGlzIG5vdCBh
IHV3c2dpIHByb2Nlc3MsIG9yIHNvbWV0aGluZyB3ZW50IGhvcnJpYmx5IHdyb25nLgorICAgICAg
ICBwYXNzCisgICAgaWYgYXNib29sKCBrd2FyZ3MuZ2V0KCAnc3RhdGljX2VuYWJsZWQnLCBUcnVl
KSApOgorICAgICAgICBpZiBpc191d3NnaToKKyAgICAgICAgICAgIGxvZy5lcnJvcigiU3RhdGlj
IG1pZGRsZXdhcmUgaXMgZW5hYmxlZCBpbiB5b3VyIGNvbmZpZ3VyYXRpb24gPQpidXQgdGhpcyBp
cyBhIHV3c2dpIHByb2Nlc3MuICBSZWZ1c2luZyB0byB3cmFwIGluIHN0YXRpYyBtaWRkbGV3YXJl
LiIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB3ZWJhcHAgPTNEIHdyYXBfaW5fc3RhdGlj
KCB3ZWJhcHAsIGdsb2JhbF9jb25mLCAqKmt3YXJncyApCiAgICAgIyBDbG9zZSBhbnkgcG9vbGVk
IGRhdGFiYXNlIGNvbm5lY3Rpb25zIGJlZm9yZSBmb3JraW5nCiAgICAgdHJ5OgogICAgICAgICBn
YWxheHkud2ViYXBwcy50b29sX3NoZWQubW9kZWwubWFwcGluZy5tZXRhZGF0YS5lbmdpbmUuY29u
bmVjdGlvbl89CnByb3ZpZGVyLl9wb29sLmRpc3Bvc2UoKQoKCmh0dHBzOi8vYml0YnVja2V0Lm9y
Zy9nYWxheHkvZ2FsYXh5LWNlbnRyYWwvY29tbWl0cy8wMGI4ZGVkZjA5OGUvCkNoYW5nZXNldDog
ICAwMGI4ZGVkZjA5OGUKQnJhbmNoOiAgICAgIHJlbGVhc2VfMTUuMDMKVXNlcjogICAgICAgIGpt
Y2hpbHRvbgpEYXRlOiAgICAgICAgMjAxNS0wMy0zMCAxNzozMjo0NyswMDowMApTdW1tYXJ5OiAg
ICAgRml4IGRhdGFiYXNlIGRlYWRsb2NrcyB3aGVuIHJ1bm5pbmcgbGFyZ2Ugd29ya2Zsb3dzLgoK
VGhpcyBmaXggd2FzIGZpcnN0IHRlc3RlZCBhbmQgaW5pdGlhbGx5IHZlcmZpZWQgYnkgTWFyaXVz
IHZhbiBkZW4gQmVlayB3aXRoPQogc3Vic2VxdWVudCBwYXJhbGxlbCB2ZXJpZmljYXRpb24gZnJv
bSBQaGlsaXAgTWFib24gYW5kIEFhcm9uIFBldGthdS4KCkxpa2VseSB0aGVzZSBkZWFkbG9ja3Mg
d2VyZSBpbnRyb2R1Y2VkIGluIDE0LjEwIHdoZW4gSSBhZGRlZCBhbiB1cGRhdGUgdGltZT0KIHRv
IHdvcmtmbG93IGludm9jYXRpb25zIHNvIHdlIGNhbiByZS1ldmFsdWF0ZSB0aGVtIG92ZXIgdGlt
ZSAtIGFuIGV4cGxhbmF0PQppb24gZm9yIHdoeSB0aGUgZGVhZGxvY2tzIGFyZSBsaWtlbHkgb2Nj
dXJpbmcgY2FuIGJlIGZvdW5kIGluIHRoZSBjb2RlIGNvbW09CmVudHMuCkFmZmVjdGVkICM6ICAx
IGZpbGUKCmRpZmYgLXIgMTMwMzc2NjFmMWI5MTFmZDg5NDY3ZmRlN2IwYjRiZTcwZDQzYTBlYiAt
ciAwMGI4ZGVkZjA5OGVhMjAyMmViNTQ4Yz0KMGJlZTBhZGEwZTVmNzNkZTggbGliL2dhbGF4eS9q
b2JzL19faW5pdF9fLnB5Ci0tLSBhL2xpYi9nYWxheHkvam9icy9fX2luaXRfXy5weQorKysgYi9s
aWIvZ2FsYXh5L2pvYnMvX19pbml0X18ucHkKQEAgLTEyNTEsNiArMTI1MSwxNiBAQAogICAgICAg
ICBpZiBqb2IudXNlcjoKICAgICAgICAgICAgIGpvYi51c2VyLnRvdGFsX2Rpc2tfdXNhZ2UgKz0z
RCBieXRlcwo9MjAKKyAgICAgICAgIyBFbXBlcmljYWxseSwgd2UgbmVlZCB0byB1cGRhdGUgam9i
LnVzZXIgYW5kCisgICAgICAgICMgam9iLndvcmtmbG93X2ludm9jYXRpb25fc3RlcC53b3JrZmxv
d19pbnZvY2F0aW9uIGluIHNlcGFyYXRlCisgICAgICAgICMgdHJhbnNhY3Rpb25zLiBCZXN0IGd1
ZXNzIGFzIHRvIHdoeSBpcyB0aGF0IHRoZSB3b3JrZmxvd19pbnZvY2F0aT0Kb24KKyAgICAgICAg
IyBtYXkgb3IgbWF5IG5vdCBleGlzdCB3aGVuIHRoZSBqb2IgaXMgZmlyc3QgbG9hZGVkIGJ5IHRo
ZSBoYW5kbGVyPQogLQorICAgICAgICAjIGFuZCBkZXBlbmRpbmcgb24gd2hldGhlciBpdCBpcyBv
ciBub3Qgc3FsYWxjaGVteSBvcmRlcnMgdGhlIHVwZGE9CnRlcworICAgICAgICAjIGRpZmZlcmVu
dGx5IGFuZCBkZWFkbG9ja3MgY2FuIG9jY3VyIChvbmUgdGhyZWFkIHVwZGF0ZXMgdXNlciBhbmQK
KyAgICAgICAgIyB3YWl0cyBvbiBpbnZvY2F0aW9uIGFuZCB0aGUgb3RoZXIgdXBkYXRlcyBpbnZv
Y2F0aW9uIGFuZCB3YWl0cyBvbgorICAgICAgICAjIHVzZXIpLgorICAgICAgICBzZWxmLnNhX3Nl
c3Npb24uZmx1c2goKQorCiAgICAgICAgICMgZml4IHBlcm1pc3Npb25zCiAgICAgICAgIGZvciBw
YXRoIGluIFsgZHAucmVhbF9wYXRoIGZvciBkcCBpbiBzZWxmLmdldF9tdXRhYmxlX291dHB1dF9m
bmFtZT0KcygpIF06CiAgICAgICAgICAgICB1dGlsLnVtYXNrX2ZpeF9wZXJtcyggcGF0aCwgc2Vs
Zi5hcHAuY29uZmlnLnVtYXNrLCAwNjY2LCBzZWxmLj0KYXBwLmNvbmZpZy5naWQgKQoKCmh0dHBz
Oi8vYml0YnVja2V0Lm9yZy9nYWxheHkvZ2FsYXh5LWNlbnRyYWwvY29tbWl0cy81YTU1ZTljZGJh
MzcvCkNoYW5nZXNldDogICA1YTU1ZTljZGJhMzcKQnJhbmNoOiAgICAgIHJlbGVhc2VfMTUuMDMK
VXNlcjogICAgICAgIG1hcnRlbnNvbgpEYXRlOiAgICAgICAgMjAxNS0wMy0zMCAxODowODozMisw
MDowMApTdW1tYXJ5OiAgICAgZml4IG1pc3NpbmcgZGVmYXVsdHMgZm9yIGdldCgpCnBhcmFtcyBj
bGFzcyBvdmVycmlkZSB0aGUgbWV0aG9kIGFuZCBmb3JjZSBkZWZhdWx0IHRvIGJlIGluY2x1ZGVk
CkFmZmVjdGVkICM6ICAxIGZpbGUKCmRpZmYgLXIgMDBiOGRlZGYwOThlYTIwMjJlYjU0OGMwYmVl
MGFkYTBlNWY3M2RlOCAtciA1YTU1ZTljZGJhMzdmNjg1ZmUzYzVmOD0KYThjZDVmMjQ0YjlhM2I3
ODUgbGliL2dhbGF4eS93ZWJhcHBzL2dhbGF4eS9jb250cm9sbGVycy9saWJyYXJ5X2NvbW1vbi5w
eQotLS0gYS9saWIvZ2FsYXh5L3dlYmFwcHMvZ2FsYXh5L2NvbnRyb2xsZXJzL2xpYnJhcnlfY29t
bW9uLnB5CisrKyBiL2xpYi9nYWxheHkvd2ViYXBwcy9nYWxheHkvY29udHJvbGxlcnMvbGlicmFy
eV9jb21tb24ucHkKQEAgLTExMzYsNyArMTEzNiw3IEBACiAgICAgZGVmIG1ha2VfbGlicmFyeV91
cGxvYWRlZF9kYXRhc2V0KCBzZWxmLCB0cmFucywgY250cmxsZXIsIHBhcmFtcywgbmFtZT0KLCBw
YXRoLCB0eXBlLCBsaWJyYXJ5X2J1bmNoLCBpbl9mb2xkZXI9M0ROb25lICk6CiAgICAgICAgIGxp
bmtfZGF0YV9vbmx5ID0zRCBwYXJhbXMuZ2V0KCAnbGlua19kYXRhX29ubHknLCAnY29weV9maWxl
cycgKQogICAgICAgICB1dWlkX3N0ciA9M0QgIHBhcmFtcy5nZXQoICd1dWlkJywgTm9uZSApCi0g
ICAgICAgIGZpbGVfdHlwZSA9M0QgcGFyYW1zLmdldCggJ2ZpbGVfdHlwZScgKQorICAgICAgICBm
aWxlX3R5cGUgPTNEIHBhcmFtcy5nZXQoICdmaWxlX3R5cGUnLCBOb25lICkKICAgICAgICAgbGli
cmFyeV9idW5jaC5yZXBsYWNlX2RhdGFzZXQgPTNEIE5vbmUgIyBub3QgdmFsaWQgZm9yIHRoZXNl
IHR5cGVzPQogb2YgdXBsb2FkCiAgICAgICAgIHVwbG9hZGVkX2RhdGFzZXQgPTNEIHV0aWwuYnVu
Y2guQnVuY2goKQogICAgICAgICBuZXdfbmFtZSA9M0QgbmFtZQpAQCAtMTE1Miw4ICsxMTUyLDgg
QEAKICAgICAgICAgdXBsb2FkZWRfZGF0YXNldC50eXBlID0zRCB0eXBlCiAgICAgICAgIHVwbG9h
ZGVkX2RhdGFzZXQuZXh0ID0zRCBOb25lCiAgICAgICAgIHVwbG9hZGVkX2RhdGFzZXQuZmlsZV90
eXBlID0zRCBmaWxlX3R5cGUKLSAgICAgICAgdXBsb2FkZWRfZGF0YXNldC5kYmtleSA9M0QgcGFy
YW1zLmdldCggJ2Ria2V5JyApCi0gICAgICAgIHVwbG9hZGVkX2RhdGFzZXQuc3BhY2VfdG9fdGFi
ID0zRCBwYXJhbXMuZ2V0KCAnc3BhY2VfdG9fdGFiJyApCisgICAgICAgIHVwbG9hZGVkX2RhdGFz
ZXQuZGJrZXkgPTNEIHBhcmFtcy5nZXQoICdkYmtleScsIE5vbmUgKQorICAgICAgICB1cGxvYWRl
ZF9kYXRhc2V0LnNwYWNlX3RvX3RhYiA9M0QgcGFyYW1zLmdldCggJ3NwYWNlX3RvX3RhYicsIE5v
bmU9CiApCiAgICAgICAgIGlmIGluX2ZvbGRlcjoKICAgICAgICAgICAgIHVwbG9hZGVkX2RhdGFz
ZXQuaW5fZm9sZGVyID0zRCBpbl9mb2xkZXIKICAgICAgICAgdXBsb2FkZWRfZGF0YXNldC5kYXRh
ID0zRCB1cGxvYWRfY29tbW9uLm5ld191cGxvYWQoIHRyYW5zLCBjbnRybGxlPQpyLCB1cGxvYWRl
ZF9kYXRhc2V0LCBsaWJyYXJ5X2J1bmNoICkKCgpodHRwczovL2JpdGJ1Y2tldC5vcmcvZ2FsYXh5
L2dhbGF4eS1jZW50cmFsL2NvbW1pdHMvNjJjNTY0YmJmMDA2LwpDaGFuZ2VzZXQ6ICAgNjJjNTY0
YmJmMDA2CkJyYW5jaDogICAgICByZWxlYXNlXzE1LjAzClVzZXI6ICAgICAgICBjYXJsZmViZXJo
YXJkCkRhdGU6ICAgICAgICAyMDE1LTAzLTI1IDE2OjI3OjM1KzAwOjAwClN1bW1hcnk6ICAgICBB
UEksIEhEQXM6IHByb3Blcmx5IGZldGNoIHJlc3VibWl0dGVkIGZsYWcgZnJvbSB0aGUgbmV3IGpv
YiBzdD0KYXRlIGhpc3RvcnkgdGFibGUKCihjaGVycnkgcGlja2VkIGZyb20gY29tbWl0IGI0Y2Y0
OWE0NDlhYTAwMmIxMzA4Y2RlZGVjM2Q3ZDRiMjA1ZTA1YjMpCkFmZmVjdGVkICM6ICAxIGZpbGUK
CmRpZmYgLXIgNWE1NWU5Y2RiYTM3ZjY4NWZlM2M1ZjhhOGNkNWYyNDRiOWEzYjc4NSAtciA2MmM1
NjRiYmYwMDYyOGVmMTA0OWQ1YT0KYTIyOGJmMmVhZTQyOTIwMzYgbGliL2dhbGF4eS9tYW5hZ2Vy
cy9oZGFzLnB5Ci0tLSBhL2xpYi9nYWxheHkvbWFuYWdlcnMvaGRhcy5weQorKysgYi9saWIvZ2Fs
YXh5L21hbmFnZXJzL2hkYXMucHkKQEAgLTE5Niw2ICsxOTYsMzIgQEAKICAgICAgICAgICAgIGJy
ZWFrCiAgICAgICAgIHJldHVybiBqb2IKPTIwCisgICAgZGVmIF9qb2Jfc3RhdGVfaGlzdG9yeV9x
dWVyeSggc2VsZiwgaGRhICk6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm4gYSBxdWVyeSBv
ZiB0aGUgam9iJ3Mgc3RhdGUgaGlzdG9yeSBmb3IgdGhlIGpvYiB0aGF0IGNyZWF0ZWQ9CiB0aGlz
IGhkYS4KKyAgICAgICAgIiIiCisgICAgICAgIHNlc3Npb24gPTNEIHNlbGYuYXBwLm1vZGVsLmNv
bnRleHQKKyAgICAgICAgSm9iVG9PdXRwdXREYXRhc2V0QXNzb2NpYXRpb24gPTNEIG1vZGVsLkpv
YlRvT3V0cHV0RGF0YXNldEFzc29jaWF0PQppb24KKyAgICAgICAgSm9iU3RhdGVIaXN0b3J5ID0z
RCBtb2RlbC5Kb2JTdGF0ZUhpc3RvcnkKKworICAgICAgICAjIFRPRE86IHRoaXMgZG9lcyBub3Qg
cGxheSB3ZWxsIHdpdGggY29waWVkIGhkYXMKKyAgICAgICAgIyBOT1RFOiBkb24ndCBlYWdlcmxv
YWQgKEpPREEgd2lsbCBsb2FkIHRoZSBoZGEgd2VyZSB1c2luZyEpCisgICAgICAgIGhkYV9pZCA9
M0QgaGRhLmlkCisgICAgICAgIHF1ZXJ5ID0zRCAoIHNlc3Npb24ucXVlcnkoIEpvYlRvT3V0cHV0
RGF0YXNldEFzc29jaWF0aW9uLCBKb2JTdGF0ZT0KSGlzdG9yeSApCisgICAgICAgICAgICAuZmls
dGVyKCBKb2JUb091dHB1dERhdGFzZXRBc3NvY2lhdGlvbi5kYXRhc2V0X2lkID0zRD0zRCBoZGFf
aT0KZCApCisgICAgICAgICAgICAuZmlsdGVyKCBKb2JTdGF0ZUhpc3Rvcnkuam9iX2lkID0zRD0z
RCBKb2JUb091dHB1dERhdGFzZXRBc3NvYz0KaWF0aW9uLmpvYl9pZCApCisgICAgICAgICAgICAu
ZW5hYmxlX2VhZ2VybG9hZHMoIEZhbHNlICkgKQorICAgICAgICByZXR1cm4gcXVlcnkKKworICAg
IGRlZiBoYXNfYmVlbl9yZXN1Ym1pdHRlZCggc2VsZiwgaGRhICk6CisgICAgICAgICIiIgorICAg
ICAgICBSZXR1cm4gVHJ1ZSBpZiB0aGUgaGRhJ3Mgam9iIHdhcyByZXN1Ym1pdHRlZCBhdCBhbnkg
cG9pbnQuCisgICAgICAgICIiIgorICAgICAgICBqb2Jfc3RhdGVzID0zRCBtb2RlbC5Kb2Iuc3Rh
dGVzCisgICAgICAgIHF1ZXJ5ID0zRCAoIHNlbGYuX2pvYl9zdGF0ZV9oaXN0b3J5X3F1ZXJ5KCBo
ZGEgKQorICAgICAgICAgICAgLmZpbHRlciggbW9kZWwuSm9iU3RhdGVIaXN0b3J5LnN0YXRlID0z
RD0zRCBqb2Jfc3RhdGVzLlJFU1VCTUk9ClRURUQgKSApCisgICAgICAgIHJldHVybiBzZWxmLmFw
cC5tb2RlbC5jb250ZXh0LnF1ZXJ5KCBxdWVyeS5leGlzdHMoKSApLnNjYWxhcigpCisKICAgICAj
IC4uLi4gc2VyaWFsaXphdGlvbgogICAgIGRlZiBnZXRfZGlzcGxheV9hcHBzKCBzZWxmLCB0cmFu
cywgaGRhICk6CiAgICAgICAgICIiIgpAQCAtMzI1LDcgKzM1MSw3IEBACiAgICAgICAgICAgICAn
aGlzdG9yeV9jb250ZW50X3R5cGUnLAogICAgICAgICAgICAgJ2RhdGFzZXRfaWQnLAogICAgICAg
ICAgICAgJ3N0YXRlJywgJ2V4dGVuc2lvbicsCi0gICAgICAgICAgICAnZGVsZXRlZCcsICdwdXJn
ZWQnLCAndmlzaWJsZScsICdyZXN1Ym1pdHRlZCcsCisgICAgICAgICAgICAnZGVsZXRlZCcsICdw
dXJnZWQnLCAndmlzaWJsZScsCiAgICAgICAgICAgICAndHlwZScsICd1cmwnCiAgICAgICAgIF0p
CiAgICAgICAgIHNlbGYuYWRkX3ZpZXcoICdkZXRhaWxlZCcsIFsKQEAgLTM0MSw3ICszNjcsOCBA
QAogICAgICAgICAgICAgJ2ZpbGVfZXh0JywgJ2ZpbGVfc2l6ZScsCj0yMAogICAgICAgICAgICAg
J2NyZWF0ZV90aW1lJywgJ3VwZGF0ZV90aW1lJywKLSAgICAgICAgICAgICdtZXRhZGF0YScsICdt
ZXRhX2ZpbGVzJywgJ2RhdGFfdHlwZScsCisgICAgICAgICAgICAncmVzdWJtaXR0ZWQnLAorICAg
ICAgICAgICAgICdtZXRhZGF0YScsICdtZXRhX2ZpbGVzJywgJ2RhdGFfdHlwZScsCiAgICAgICAg
ICAgICAncGVlaycsCj0yMAogICAgICAgICAgICAgI1RPRE86IHdoeSBpcyB0aGlzIG5hbWVkIHV1
aWQhPyBUaGUgaGRhIGRvZXNuJ3QgaGF2ZSBhIHV1aWQgLSA9Cml0J3MgdGhlIHVuZGVybHlpbmcg
ZGF0YXNldCdzIHV1aWQhCkBAIC00MDEsNyArNDI4LDcgQEAKICAgICAgICAgICAgICdjb3BpZWRf
ZnJvbV9oaXN0b3J5X2RhdGFzZXRfYXNzb2NpYXRpb25faWQnICAgICAgICA6IHNlbGYuc2VyPQpp
YWxpemVfaWQsCiAgICAgICAgICAgICAnY29waWVkX2Zyb21fbGlicmFyeV9kYXRhc2V0X2RhdGFz
ZXRfYXNzb2NpYXRpb25faWQnOiBzZWxmLnNlcj0KaWFsaXplX2lkLAo9MjAKLSAgICAgICAgICAg
ICdyZXN1Ym1pdHRlZCcgICA6IGxhbWJkYSB0LCBpLCBrOiBpLl9zdGF0ZSA9M0Q9M0QgdC5hcHAu
bW9kZWwuPQpEYXRhc2V0LnN0YXRlcy5SRVNVQk1JVFRFRCwKKyAgICAgICAgICAgICdyZXN1Ym1p
dHRlZCcgICA6IGxhbWJkYSB0LCBpLCBrOiBzZWxmLmhkYV9tYW5hZ2VyLmhhc19iZWVuX3JlPQpz
dWJtaXR0ZWQoIGkgKSwKPTIwCiAgICAgICAgICAgICAnbWV0YV9maWxlcycgICAgOiBzZWxmLnNl
cmlhbGl6ZV9tZXRhX2ZpbGVzLAogICAgICAgICAgICAgJ2ZpbGVfcGF0aCcgICAgIDogc2VsZi5z
ZXJpYWxpemVfZmlsZV9wYXRoLAoKCmh0dHBzOi8vYml0YnVja2V0Lm9yZy9nYWxheHkvZ2FsYXh5
LWNlbnRyYWwvY29tbWl0cy81ZGQ2NTQ5YWFjM2EvCkNoYW5nZXNldDogICA1ZGQ2NTQ5YWFjM2EK
QnJhbmNoOiAgICAgIHJlbGVhc2VfMTUuMDMKVXNlcjogICAgICAgIG5hdGVmb28KRGF0ZTogICAg
ICAgIDIwMTUtMDMtMjUgMjE6MTc6NDkrMDA6MDAKU3VtbWFyeTogICAgIEdldCByaWQgb2YgdGhl
ICJyZXN1Ym1pdHRlZCIgZGF0YXNldCBzdGF0ZSBhbmQgcHJvdmlkZSBhIHNsaWdoPQp0bHkgdXNl
ZnVsCm1lc3NhZ2Ugb24gam9iL2pvYl9zdGF0ZV9oaXN0b3J5LmluZm8gZXhwbGFpbmluZyB0aGUg
cmVzdWJtaXQgcmVhc29uLgoKQWxzbyBQRVAtOCB3aGlsZSBJJ20gaW4gdGhlcmUuCgooY2hlcnJ5
IHBpY2tlZCBmcm9tIGNvbW1pdCBiY2U4MTcxOWViMGE5MWRhMTVlMTEyZDViNWIyZjFjZGY2MGVk
ZGFjKQpBZmZlY3RlZCAjOiAgNCBmaWxlcwoKZGlmZiAtciA2MmM1NjRiYmYwMDYyOGVmMTA0OWQ1
YWEyMjhiZjJlYWU0MjkyMDM2IC1yIDVkZDY1NDlhYWMzYTI5YjE1NjJmZDNlPQo1MzA2YzFjNjll
ZjAwNDdhNyBsaWIvZ2FsYXh5L2pvYnMvX19pbml0X18ucHkKLS0tIGEvbGliL2dhbGF4eS9qb2Jz
L19faW5pdF9fLnB5CisrKyBiL2xpYi9nYWxheHkvam9icy9fX2luaXRfXy5weQpAQCAtOTYyLDEy
ICs5NjIsMTEgQEAKICAgICAgICAgICAgIGpvYi5zZXRfc3RhdGUoIGpvYi5zdGF0ZXMuUEFVU0VE
ICkKICAgICAgICAgICAgIHNlbGYuc2Ffc2Vzc2lvbi5hZGQoIGpvYiApCj0yMAotICAgIGRlZiBt
YXJrX2FzX3Jlc3VibWl0dGVkKCBzZWxmICk6CisgICAgZGVmIG1hcmtfYXNfcmVzdWJtaXR0ZWQo
IHNlbGYsIGluZm89M0ROb25lICk6CiAgICAgICAgIGpvYiA9M0Qgc2VsZi5nZXRfam9iKCkKICAg
ICAgICAgc2VsZi5zYV9zZXNzaW9uLnJlZnJlc2goIGpvYiApCi0gICAgICAgIGZvciBkYXRhc2V0
IGluIFsgZGF0YXNldF9hc3NvYy5kYXRhc2V0IGZvciBkYXRhc2V0X2Fzc29jIGluIGpvYi5vdT0K
dHB1dF9kYXRhc2V0cyArIGpvYi5vdXRwdXRfbGlicmFyeV9kYXRhc2V0cyBdOgotICAgICAgICAg
ICAgZGF0YXNldC5fc3RhdGUgPTNEIG1vZGVsLkRhdGFzZXQuc3RhdGVzLlJFU1VCTUlUVEVECi0g
ICAgICAgICAgICBzZWxmLnNhX3Nlc3Npb24uYWRkKCBkYXRhc2V0ICkKKyAgICAgICAgaWYgaW5m
byBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGpvYi5pbmZvID0zRCBpbmZvCiAgICAgICAgIGpv
Yi5zZXRfc3RhdGUoIG1vZGVsLkpvYi5zdGF0ZXMuUkVTVUJNSVRURUQgKQogICAgICAgICBzZWxm
LnNhX3Nlc3Npb24uYWRkKCBqb2IgKQogICAgICAgICBzZWxmLnNhX3Nlc3Npb24uZmx1c2goKQoK
ZGlmZiAtciA2MmM1NjRiYmYwMDYyOGVmMTA0OWQ1YWEyMjhiZjJlYWU0MjkyMDM2IC1yIDVkZDY1
NDlhYWMzYTI5YjE1NjJmZDNlPQo1MzA2YzFjNjllZjAwNDdhNyBsaWIvZ2FsYXh5L2pvYnMvcnVu
bmVycy9fX2luaXRfXy5weQotLS0gYS9saWIvZ2FsYXh5L2pvYnMvcnVubmVycy9fX2luaXRfXy5w
eQorKysgYi9saWIvZ2FsYXh5L2pvYnMvcnVubmVycy9fX2luaXRfXy5weQpAQCAtMzQxLDggKzM0
MSw4IEBACiAgICAgICAgIGV4Y2VwdDoKICAgICAgICAgICAgIGxvZy5leGNlcHRpb24oJ0NhdWdo
dCBleGNlcHRpb24gaW4gcnVubmVyIHN0YXRlIGhhbmRsZXI6JykKPTIwCi0gICAgZGVmIG1hcmtf
YXNfcmVzdWJtaXR0ZWQoIHNlbGYsIGpvYl9zdGF0ZSApOgotICAgICAgICBqb2Jfc3RhdGUuam9i
X3dyYXBwZXIubWFya19hc19yZXN1Ym1pdHRlZCgpCisgICAgZGVmIG1hcmtfYXNfcmVzdWJtaXR0
ZWQoIHNlbGYsIGpvYl9zdGF0ZSwgaW5mbz0zRE5vbmUgKToKKyAgICAgICAgam9iX3N0YXRlLmpv
Yl93cmFwcGVyLm1hcmtfYXNfcmVzdWJtaXR0ZWQoIGluZm89M0RpbmZvICkKICAgICAgICAgaWYg
bm90IHNlbGYuYXBwLmNvbmZpZy50cmFja19qb2JzX2luX2RhdGFiYXNlOgogICAgICAgICAgICAg
am9iX3N0YXRlLmpvYl93cmFwcGVyLmNoYW5nZV9zdGF0ZSggbW9kZWwuSm9iLnN0YXRlcy5RVUVV
RUQgKQogICAgICAgICAgICAgc2VsZi5hcHAuam9iX21hbmFnZXIuam9iX2hhbmRsZXIuZGlzcGF0
Y2hlci5wdXQoIGpvYl9zdGF0ZS5qb2I9Cl93cmFwcGVyICkKCmRpZmYgLXIgNjJjNTY0YmJmMDA2
MjhlZjEwNDlkNWFhMjI4YmYyZWFlNDI5MjAzNiAtciA1ZGQ2NTQ5YWFjM2EyOWIxNTYyZmQzZT0K
NTMwNmMxYzY5ZWYwMDQ3YTcgbGliL2dhbGF4eS9qb2JzL3J1bm5lcnMvc3RhdGVfaGFuZGxlcnMv
cmVzdWJtaXQucHkKLS0tIGEvbGliL2dhbGF4eS9qb2JzL3J1bm5lcnMvc3RhdGVfaGFuZGxlcnMv
cmVzdWJtaXQucHkKKysrIGIvbGliL2dhbGF4eS9qb2JzL3J1bm5lcnMvc3RhdGVfaGFuZGxlcnMv
cmVzdWJtaXQucHkKQEAgLTEsNCArMSw1IEBACiBpbXBvcnQgbG9nZ2luZworCiBmcm9tIGdhbGF4
eSBpbXBvcnQgbW9kZWwKPTIwCj0yMApAQCAtMTMsMzEgKzE0LDQ1IEBACj0yMAo9MjAKIGRlZiBm
YWlsdXJlKGFwcCwgam9iX3J1bm5lciwgam9iX3N0YXRlKToKLSAgICBpZiBnZXRhdHRyKCBqb2Jf
c3RhdGUsICdydW5uZXJfc3RhdGUnLCBOb25lICkgYW5kIGpvYl9zdGF0ZS5ydW5uZXJfc3RhPQp0
ZSBpbiAoIGpvYl9zdGF0ZS5ydW5uZXJfc3RhdGVzLldBTExUSU1FX1JFQUNIRUQsIGpvYl9zdGF0
ZS5ydW5uZXJfc3RhdGVzLk09CkVNT1JZX0xJTUlUX1JFQUNIRUQgKToKLSAgICAgICAgIyBJbnRl
cmNlcHQgam9icyB0aGF0IGhpdCB0aGUgd2FsbHRpbWUgYW5kIGhhdmUgYSB3YWxsdGltZSBvciBu
b25zPQpwZWNpZmljIHJlc3VibWl0IGRlc3RpbmF0aW9uIGNvbmZpZ3VyZWQKKyAgICBpZiAoZ2V0
YXR0cihqb2Jfc3RhdGUsICdydW5uZXJfc3RhdGUnLCBOb25lKQorICAgICAgICBhbmQgam9iX3N0
YXRlLnJ1bm5lcl9zdGF0ZSBpbgorICAgICAgICAoam9iX3N0YXRlLnJ1bm5lcl9zdGF0ZXMuV0FM
TFRJTUVfUkVBQ0hFRCwKKyAgICAgICAgIGpvYl9zdGF0ZS5ydW5uZXJfc3RhdGVzLk1FTU9SWV9M
SU1JVF9SRUFDSEVEKSk6CisgICAgICAgICMgSW50ZXJjZXB0IGpvYnMgdGhhdCBoaXQgdGhlIHdh
bGx0aW1lIGFuZCBoYXZlIGEgd2FsbHRpbWUgb3IKKyAgICAgICAgIyBub25zcGVjaWZpYyByZXN1
Ym1pdCBkZXN0aW5hdGlvbiBjb25maWd1cmVkCiAgICAgICAgIGZvciByZXN1Ym1pdCBpbiBqb2Jf
c3RhdGUuam9iX2Rlc3RpbmF0aW9uLmdldCgncmVzdWJtaXQnKToKLSAgICAgICAgICAgIGlmIHJl
c3VibWl0LmdldCgnY29uZGl0aW9uJywgTm9uZSkgYW5kIHJlc3VibWl0Wydjb25kaXRpb24nXSAh
PQo9M0Qgam9iX3N0YXRlLnJ1bm5lcl9zdGF0ZToKLSAgICAgICAgICAgICAgICBjb250aW51ZSAj
IFRoZXJlIGlzIGEgcmVzdWJtaXQgZGVmaW5lZCBmb3IgdGhlIGRlc3RpbmF0aW9uPQogYnV0IGl0
cyBjb25kaXRpb24gaXMgbm90IGZvciB3YWxsdGltZV9yZWFjaGVkCi0gICAgICAgICAgICBsb2cu
aW5mbygiKCVzLyVzKSBKb2Igd2lsbCBiZSByZXN1Ym1pdHRlZCB0byAnJXMnIGJlY2F1c2UgJXMg
YT0KdCB0aGUgJyVzJyBkZXN0aW5hdGlvbiIsCi0gICAgICAgICAgICAgICAgICAgIGpvYl9zdGF0
ZS5qb2Jfd3JhcHBlci5qb2JfaWQsCi0gICAgICAgICAgICAgICAgICAgIGpvYl9zdGF0ZS5qb2Jf
aWQsCi0gICAgICAgICAgICAgICAgICAgIHJlc3VibWl0WydkZXN0aW5hdGlvbiddLAotICAgICAg
ICAgICAgICAgICAgICBNRVNTQUdFU1tqb2Jfc3RhdGUucnVubmVyX3N0YXRlXSwKLSAgICAgICAg
ICAgICAgICAgICAgam9iX3N0YXRlLmpvYl93cmFwcGVyLmpvYl9kZXN0aW5hdGlvbi5pZCApCisg
ICAgICAgICAgICBpZiAocmVzdWJtaXQuZ2V0KCdjb25kaXRpb24nLCBOb25lKSBhbmQgcmVzdWJt
aXRbJ2NvbmRpdGlvbiddID0KIT0zRAorICAgICAgICAgICAgICAgIGpvYl9zdGF0ZS5ydW5uZXJf
c3RhdGUpOgorICAgICAgICAgICAgICAgICMgVGhlcmUgaXMgYSByZXN1Ym1pdCBkZWZpbmVkIGZv
ciB0aGUgZGVzdGluYXRpb24gYnV0CisgICAgICAgICAgICAgICAgIyBpdHMgY29uZGl0aW9uIGlz
IG5vdCBmb3Igd2FsbHRpbWVfcmVhY2hlZAorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAg
ICAgICAgICBsb2cuaW5mbygiKCVzLyVzKSBKb2Igd2lsbCBiZSByZXN1Ym1pdHRlZCB0byAnJXMn
IGJlY2F1c2UgJXMgYT0KdCAiCisgICAgICAgICAgICAgICAgICAgICAidGhlICclcycgZGVzdGlu
YXRpb24iLAorICAgICAgICAgICAgICAgICAgICAgam9iX3N0YXRlLmpvYl93cmFwcGVyLmpvYl9p
ZCwKKyAgICAgICAgICAgICAgICAgICAgIGpvYl9zdGF0ZS5qb2JfaWQsCisgICAgICAgICAgICAg
ICAgICAgICByZXN1Ym1pdFsnZGVzdGluYXRpb24nXSwKKyAgICAgICAgICAgICAgICAgICAgIE1F
U1NBR0VTW2pvYl9zdGF0ZS5ydW5uZXJfc3RhdGVdLAorICAgICAgICAgICAgICAgICAgICAgam9i
X3N0YXRlLmpvYl93cmFwcGVyLmpvYl9kZXN0aW5hdGlvbi5pZCApCiAgICAgICAgICAgICAjIGZl
dGNoIEpvYkRlc3RpbmF0aW9uIGZvciB0aGUgaWQgb3IgdGFnCi0gICAgICAgICAgICBuZXdfZGVz
dGluYXRpb24gPTNEIGFwcC5qb2JfY29uZmlnLmdldF9kZXN0aW5hdGlvbihyZXN1Ym1pdFsnZD0K
ZXN0aW5hdGlvbiddKQorICAgICAgICAgICAgbmV3X2Rlc3RpbmF0aW9uID0zRCBhcHAuam9iX2Nv
bmZpZy5nZXRfZGVzdGluYXRpb24oCisgICAgICAgICAgICAgICAgcmVzdWJtaXRbJ2Rlc3RpbmF0
aW9uJ10pCiAgICAgICAgICAgICAjIFJlc29sdmUgZHluYW1pYyBpZiBuZWNlc3NhcnkKLSAgICAg
ICAgICAgIG5ld19kZXN0aW5hdGlvbiA9M0Qgam9iX3N0YXRlLmpvYl93cmFwcGVyLmpvYl9ydW5u
ZXJfbWFwcGVyLmNhPQpjaGVfam9iX2Rlc3RpbmF0aW9uKCBuZXdfZGVzdGluYXRpb24gKQorICAg
ICAgICAgICAgbmV3X2Rlc3RpbmF0aW9uID0zRCAoam9iX3N0YXRlLmpvYl93cmFwcGVyLmpvYl9y
dW5uZXJfbWFwcGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNhY2hlX2pvYl9k
ZXN0aW5hdGlvbihuZXdfZGVzdGluYXRpb24pKQogICAgICAgICAgICAgIyBSZXNldCBqb2Igc3Rh
dGUKICAgICAgICAgICAgIGpvYiA9M0Qgam9iX3N0YXRlLmpvYl93cmFwcGVyLmdldF9qb2IoKQog
ICAgICAgICAgICAgaWYgcmVzdWJtaXQuZ2V0KCdoYW5kbGVyJywgTm9uZSk6Ci0gICAgICAgICAg
ICAgICAgbG9nLmRlYnVnKCcoJXMvJXMpIEpvYiByZWFzc2lnbmVkIHRvIGhhbmRsZXIgJXMnLCBq
b2Jfc3RhdD0KZS5qb2Jfd3JhcHBlci5qb2JfaWQsIGpvYl9zdGF0ZS5qb2JfaWQsIHJlc3VibWl0
WydoYW5kbGVyJ10pCisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCcoJXMvJXMpIEpvYiByZWFz
c2lnbmVkIHRvIGhhbmRsZXIgJXMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICBqb2Jfc3Rh
dGUuam9iX3dyYXBwZXIuam9iX2lkLCBqb2Jfc3RhdGUuam9iX2lkLAorICAgICAgICAgICAgICAg
ICAgICAgICAgICByZXN1Ym1pdFsnaGFuZGxlciddKQogICAgICAgICAgICAgICAgIGpvYi5zZXRf
aGFuZGxlcihyZXN1Ym1pdFsnaGFuZGxlciddKQogICAgICAgICAgICAgICAgIGpvYl9ydW5uZXIu
c2Ffc2Vzc2lvbi5hZGQoIGpvYiApCiAgICAgICAgICAgICAgICAgIyBJcyB0aGlzIHNhZmUgdG8g
ZG8gaGVyZT8KICAgICAgICAgICAgICAgICBqb2JfcnVubmVyLnNhX3Nlc3Npb24uZmx1c2goKQot
ICAgICAgICAgICAgIyBDYWNoZSB0aGUgZGVzdGluYXRpb24gdG8gcHJldmVudCByZXJ1bm5pbmcg
ZHluYW1pYyBhZnRlciByZXM9CnVibWl0Ci0gICAgICAgICAgICBqb2Jfc3RhdGUuam9iX3dyYXBw
ZXIuam9iX3J1bm5lcl9tYXBwZXIuY2FjaGVkX2pvYl9kZXN0aW5hdGlvbj0KID0zRCBuZXdfZGVz
dGluYXRpb24KKyAgICAgICAgICAgICMgQ2FjaGUgdGhlIGRlc3RpbmF0aW9uIHRvIHByZXZlbnQg
cmVydW5uaW5nIGR5bmFtaWMgYWZ0ZXIKKyAgICAgICAgICAgICMgcmVzdWJtaXQKKyAgICAgICAg
ICAgIGpvYl9zdGF0ZS5qb2Jfd3JhcHBlci5qb2JfcnVubmVyX21hcHBlciBcCisgICAgICAgICAg
ICAgICAgLmNhY2hlZF9qb2JfZGVzdGluYXRpb24gPTNEIG5ld19kZXN0aW5hdGlvbgogICAgICAg
ICAgICAgam9iX3N0YXRlLmpvYl93cmFwcGVyLnNldF9qb2JfZGVzdGluYXRpb24obmV3X2Rlc3Rp
bmF0aW9uKQogICAgICAgICAgICAgIyBDbGVhciBleHRlcm5hbCBJRCAoc3RhdGUgY2hhbmdlIGJl
bG93IGZsdXNoZXMgdGhlIGNoYW5nZSkKICAgICAgICAgICAgIGpvYi5qb2JfcnVubmVyX2V4dGVy
bmFsX2lkID0zRCBOb25lCkBAIC00NSw1ICs2MCw3IEBACiAgICAgICAgICAgICBpZiBqb2IucGFy
YW1zIGlzIE5vbmU6CiAgICAgICAgICAgICAgICAgam9iLnBhcmFtcyA9M0Qge30KICAgICAgICAg
ICAgIGpvYl9zdGF0ZS5ydW5uZXJfc3RhdGVfaGFuZGxlZCA9M0QgVHJ1ZQotICAgICAgICAgICAg
am9iX3J1bm5lci5tYXJrX2FzX3Jlc3VibWl0dGVkKCBqb2Jfc3RhdGUgKQorICAgICAgICAgICAg
aW5mbyA9M0QgIlRoaXMgam9iIHdhcyByZXN1Ym1pdHRlZCB0byB0aGUgcXVldWUgYmVjYXVzZSAl
cyBvbiA9Cml0cyAiIFwKKyAgICAgICAgICAgICAgICAgICAiY29tcHV0ZSByZXNvdXJjZS4iICUg
TUVTU0FHRVNbam9iX3N0YXRlLnJ1bm5lcl9zdGF0ZV0KKyAgICAgICAgICAgIGpvYl9ydW5uZXIu
bWFya19hc19yZXN1Ym1pdHRlZChqb2Jfc3RhdGUsIGluZm89M0RpbmZvKQogICAgICAgICAgICAg
cmV0dXJuCgpkaWZmIC1yIDYyYzU2NGJiZjAwNjI4ZWYxMDQ5ZDVhYTIyOGJmMmVhZTQyOTIwMzYg
LXIgNWRkNjU0OWFhYzNhMjliMTU2MmZkM2U9CjUzMDZjMWM2OWVmMDA0N2E3IGxpYi9nYWxheHkv
bW9kZWwvX19pbml0X18ucHkKLS0tIGEvbGliL2dhbGF4eS9tb2RlbC9fX2luaXRfXy5weQorKysg
Yi9saWIvZ2FsYXh5L21vZGVsL19faW5pdF9fLnB5CkBAIC0xMzM1LDkgKzEzMzUsOCBAQAogICAg
ICAgICAgICAgICAgICAgICBESVNDQVJERUQgPTNEICdkaXNjYXJkZWQnLAogICAgICAgICAgICAg
ICAgICAgICBQQVVTRUQgPTNEICdwYXVzZWQnLAogICAgICAgICAgICAgICAgICAgICBTRVRUSU5H
X01FVEFEQVRBID0zRCAnc2V0dGluZ19tZXRhZGF0YScsCi0gICAgICAgICAgICAgICAgICAgIEZB
SUxFRF9NRVRBREFUQSA9M0QgJ2ZhaWxlZF9tZXRhZGF0YScsCi0gICAgICAgICAgICAgICAgICAg
IFJFU1VCTUlUVEVEID0zRCAncmVzdWJtaXR0ZWQnICkKLSAgICAjIGZhaWxlZF9tZXRhZGF0YSBh
bmQgcmVzdWJtaXR0ZWQgYXJlIG9ubHkgdmFsaWQgYXMgRGF0YXNldEluc3RhbmNlIHN0PQphdGVz
IGN1cnJlbnRseQorICAgICAgICAgICAgICAgICAgICBGQUlMRURfTUVUQURBVEEgPTNEICdmYWls
ZWRfbWV0YWRhdGEnKQorICAgICMgZmFpbGVkX21ldGFkYXRhIGlzIG9ubHkgdmFsaWQgYXMgRGF0
YXNldEluc3RhbmNlIHN0YXRlIGN1cnJlbnRseQo9MjAKICAgICBub25fcmVhZHlfc3RhdGVzID0z
RCAoCiAgICAgICAgIHN0YXRlcy5VUExPQUQsCgoKaHR0cHM6Ly9iaXRidWNrZXQub3JnL2dhbGF4
eS9nYWxheHktY2VudHJhbC9jb21taXRzLzY1YjIzMzBiODIzYy8KQ2hhbmdlc2V0OiAgIDY1YjIz
MzBiODIzYwpCcmFuY2g6ICAgICAgcmVsZWFzZV8xNS4wMwpVc2VyOiAgICAgICAgY2FybGZlYmVy
aGFyZApEYXRlOiAgICAgICAgMjAxNS0wMy0zMSAyMjowNTo1MCswMDowMApTdW1tYXJ5OiAgICAg
Rml4IHRvIGJhNDQ0NTI6IHByb3Blcmx5IHNjb3BlIG1vZF9pY29uX2J0biBpbiBkZWZpbmUgbm90
IHJlcXU9CmlyZQpBZmZlY3RlZCAjOiAgMyBmaWxlcwoKZGlmZiAtciA1ZGQ2NTQ5YWFjM2EyOWIx
NTYyZmQzZTUzMDZjMWM2OWVmMDA0N2E3IC1yIDY1YjIzMzBiODIzYzc2MTEzNjliOTdiPQowODI5
MmE2Yzg2NGRlZTExYyBjbGllbnQvZ2FsYXh5L3NjcmlwdHMvdml6L2NpcmNzdGVyLmpzCi0tLSBh
L2NsaWVudC9nYWxheHkvc2NyaXB0cy92aXovY2lyY3N0ZXIuanMKKysrIGIvY2xpZW50L2dhbGF4
eS9zY3JpcHRzL3Zpei9jaXJjc3Rlci5qcwpAQCAtMSwxNiArMSwyMCBAQAogLy8gbG9hZCByZXF1
aXJlZCBsaWJyYXJpZXMKLXJlcXVpcmUoCi1bCityZXF1aXJlKFsKICAgICAndXRpbHMvdXRpbHMn
LAotICAgICdtdmMvdWkvaWNvbi1idXR0b24nLAotICAgICdsaWJzL2ZhcmJ0YXN0aWMnLAotXSwg
ZnVuY3Rpb24obW9kX3V0aWxzLCBtb2RfaWNvbl9idG4pCitdLCBmdW5jdGlvbihtb2RfdXRpbHMp
CiB7CiAgICAgLy8gbG9hZCBjc3MKICAgICBtb2RfdXRpbHMuY3NzTG9hZEZpbGUoInN0YXRpYy9z
dHlsZS9jaXJjc3Rlci5jc3MiKTsKIH0pOwo9MjAKLWRlZmluZShbImxpYnMvdW5kZXJzY29yZSIs
ICJsaWJzL2QzIiwgInZpei92aXN1YWxpemF0aW9uIiwgInV0aWxzL2NvbmZpZyJdPQosIGZ1bmN0
aW9uKF8sIGQzLCB2aXN1YWxpemF0aW9uLCBjb25maWcpIHsKK2RlZmluZShbCisgICAgImxpYnMv
dW5kZXJzY29yZSIsCisgICAgImxpYnMvZDMiLAorICAgICJ2aXovdmlzdWFsaXphdGlvbiIsCisg
ICAgInV0aWxzL2NvbmZpZyIsCisgICAgJ212Yy91aS9pY29uLWJ1dHRvbicsCisgICAgJ2xpYnMv
ZmFyYnRhc3RpYycKK10sIGZ1bmN0aW9uKF8sIGQzLCB2aXN1YWxpemF0aW9uLCBjb25maWcsIG1v
ZF9pY29uX2J0bikgewo9MjAKIC8qKgogICogVXRpbGl0eSBjbGFzcyBmb3Igd29ya2luZyB3aXRo
IFNWRy4KQEAgLTcxLDcgKzc1LDcgQEAKICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICB0aWNr
X2Nvb3JkcyA9M0QgWzEsIDAsIDQsIDBdOwogICAgICAgICAgICAgdGV4dF9jb29yZHMgPTNEIFsw
LCA0LCAiLjM1ZW0iLCAiIl07Ci0gICAgICAgICAgID0yMAorCiAgICAgICAgIH0KPTIwCiAgICAg
ICAgIHRpY2tzLmFwcGVuZCgibGluZSIpCkBAIC04MCw3ICs4NCw3IEBACiAgICAgICAgICAgICAg
LmF0dHIoIngyIiwgdGlja19jb29yZHNbMl0pCiAgICAgICAgICAgICAgLmF0dHIoInkxIiwgdGlj
a19jb29yZHNbM10pCiAgICAgICAgICAgICAgLnN0eWxlKCJzdHJva2UiLCAiIzAwMCIpOwotICAg
ICAgID0yMAorCiAgICAgICAgIHJldHVybiB0aWNrcy5hcHBlbmQoInRleHQiKQogICAgICAgICAg
ICAgICAgICAgICAuYXR0cigieCIsIHRleHRfY29vcmRzWzBdKQogICAgICAgICAgICAgICAgICAg
ICAuYXR0cigieSIsIHRleHRfY29vcmRzWzFdKQpAQCAtOTgsMTEgKzEwMiwxMSBAQAogICAgICAg
ICAvLyBVc2UgZGVmYXVsdCBvZiAyIHNpZy4gZGlnaXRzLgogICAgICAgICBpZiAoc2lnRGlnaXRz
ID0zRD0zRD0zRCB1bmRlZmluZWQpCiAgICAgICAgICAgICBzaWdEaWdpdHMgPTNEIDI7Ci0gICAg
ICA9MjAKKwogICAgICAgICAvLyBWZXJpZnkgaW5wdXQgbnVtYmVyCiAgICAgICAgIGlmIChudW0g
PTNEPTNEPTNEIG51bGwpCiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgID0yMAorCiAg
ICAgICAgIC8vIENhbGN1bGF0ZSByZXR1cm4gdmFsdWUKICAgICAgICAgdmFyIHJ2YWwgPTNEIG51
bGw7CiAgICAgICAgIGlmIChNYXRoLmFicyhudW0pIDwgMSkgewpAQCAtMTQxLDcgKzE0NSw3IEBA
CiAgKi8KIHZhciBDaXJjc3RlclZpZXcgPTNEIEJhY2tib25lLlZpZXcuZXh0ZW5kKHsKICAgICBj
bGFzc05hbWU6ICdjaXJjc3RlcicsCi0gICA9MjAKKwogICAgIGluaXRpYWxpemU6IGZ1bmN0aW9u
KG9wdGlvbnMpIHsKICAgICAgICAgdGhpcy5nZW5vbWUgPTNEIG9wdGlvbnMuZ2Vub21lOwogICAg
ICAgICB0aGlzLmxhYmVsX2FyY19oZWlnaHQgPTNEIDUwOwpAQCAtMTg4LDcgKzE5Miw3IEBACiAg
ICAgICAgICAgICB0cmFja19nYXAgPTNEIHRoaXMubW9kZWwuZ2V0KCdjb25maWcnKS5nZXRfdmFs
dWUoJ3RyYWNrX2dhcCcpLAogICAgICAgICAgICAgLy8gU3VidHJhY3QgMjAgdG8gbWFrZSBzdXJl
IGNocm9tIGxhYmVscyBhcmUgb24gc2NyZWVuLgogICAgICAgICAgICAgbWluX2RpbWVuc2lvbiA9
M0QgTWF0aC5taW4odGhpcy4kZWwud2lkdGgoKSwgdGhpcy4kZWwuaGVpZ2h0KCk9CikgLSAyMCwK
LSAgICAgICAgICAgIC8vIENvbXB1dGUgcmFkaXVzIHN0YXJ0IGJhc2VkIG9uIG1vZGVsLCB3aWxs
IGJlIGNlbnRlcmVkPTIwCisgICAgICAgICAgICAvLyBDb21wdXRlIHJhZGl1cyBzdGFydCBiYXNl
ZCBvbiBtb2RlbCwgd2lsbCBiZSBjZW50ZXJlZAogICAgICAgICAgICAgLy8gYW5kIGZpdCBlbnRp
cmVseSBpbnNpZGUgZWxlbWVudCBieSBkZWZhdWx0LgogICAgICAgICAgICAgcmFkaXVzX3N0YXJ0
ID0zRCBtaW5fZGltZW5zaW9uIC8gMiAtCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ly
Y3VsYXJfdHJhY2tzLmxlbmd0aCAqIChkYXRhc2V0X2FyY19oZWlnaHQgKz0KIHRyYWNrX2dhcCkg
KwpAQCAtMTk4LDE0ICsyMDIsMTQgQEAKPTIwCiAgICAgICAgICAgICAvLyBDb21wdXRlIHJhbmdl
IG9mIHRyYWNrIHN0YXJ0aW5nIHJhZGlpLgogICAgICAgICAgICAgdHJhY2tzX3N0YXJ0X3JhZGlp
ID0zRCBkMy5yYW5nZShyYWRpdXNfc3RhcnQsIG1pbl9kaW1lbnNpb24gLyA9CjIsIGRhdGFzZXRf
YXJjX2hlaWdodCArIHRyYWNrX2dhcCk7Ci0gICAgICAgICAgID0yMAorCiAgICAgICAgIC8vIE1h
cCBmcm9tIHRyYWNrIHN0YXJ0IHRvIGJvdW5kcy4KICAgICAgICAgdmFyIHNlbGYgPTNEIHRoaXM7
CiAgICAgICAgIHJldHVybiBfLm1hcCh0cmFja3Nfc3RhcnRfcmFkaWksIGZ1bmN0aW9uKHJhZGl1
cykgewogICAgICAgICAgICAgcmV0dXJuIFtyYWRpdXMsIHJhZGl1cyArIGRhdGFzZXRfYXJjX2hl
aWdodF07CiAgICAgICAgIH0pOwogICAgIH0sCi0gICA9MjAKKwogICAgIC8qKgogICAgICAqIFJl
bmRlcnMgY2lyY3VsYXIgdHJhY2tzLCBjaG9yZCB0cmFja3MsIGFuZCBsYWJlbCB0cmFja3MuCiAg
ICAgICovCkBAIC0yNTQsNyArMjU4LDcgQEAKICAgICAgICAgICAgICAgICB9KSkKICAgICAgICAg
ICAgICAgICAuYXR0cigidHJhbnNmb3JtIiwgInRyYW5zbGF0ZSgiICsgd2lkdGggLyAyICsgIiwi
ICsgaGVpZ2h0PQogLyAyICsgIikiKQogICAgICAgICAgICAgICAuYXBwZW5kKCdzdmc6ZycpLmF0
dHIoJ2NsYXNzJywgJ3RyYWNrcycpOwotICAgICAgICAgICAgICAgPTIwCisKICAgICAgICAgLy8g
LS0gUmVuZGVyIGNpcmN1bGFyIHRyYWNrcy4gLS0KPTIwCiAgICAgICAgIC8vIENyZWF0ZSBhIHZp
ZXcgZm9yIGVhY2ggdHJhY2sgaW4gdGhlIHZpc3VhbGl6YXRpb24gYW5kIHJlbmRlci4KQEAgLTI2
NiwxMiArMjcwLDEyIEBACiAgICAgICAgICAgICAgICAgICAgIGdlbm9tZTogc2VsZi5nZW5vbWUs
CiAgICAgICAgICAgICAgICAgICAgIHRvdGFsX2dhcDogdG90YWxfZ2FwCiAgICAgICAgICAgICAg
ICAgfSk7Ci0gICAgICAgICAgID0yMAorCiAgICAgICAgICAgICB2aWV3LnJlbmRlcigpOwotICAg
ICAgICAgICA9MjAKKwogICAgICAgICAgICAgcmV0dXJuIHZpZXc7CiAgICAgICAgIH0pOwotICAg
ICAgID0yMAorCiAgICAgICAgIC8vIC0tIFJlbmRlciBjaG9yZHMgdHJhY2tzLiAtLQo9MjAKICAg
ICAgICAgdGhpcy5jaG9yZHNfdmlld3MgPTNEIGNob3Jkc190cmFja3MubWFwKGZ1bmN0aW9uKHRy
YWNrKSB7CkBAIC0yODksMTAgKzI5MywxMCBAQAogICAgICAgICB9KTsKPTIwCiAgICAgICAgIC8v
IC0tIFJlbmRlciBsYWJlbCB0cmFjay4gLS0KLSAgICAgICA9MjAKKwogICAgICAgICAvLyBUcmFj
ayBib3VuZHMgYXJlOgogICAgICAgICAvLyAoYSkgb3V0ZXIgcmFkaXVzIG9mIGxhc3QgY2lyY3Vs
YXIgdHJhY2s7Ci0gICAgICAgIC8vIChiKT0yMAorICAgICAgICAvLyAoYikKICAgICAgICAgdmFy
IG91dGVybW9zdF9yYWRpdXMgPTNEIHRoaXMuY2lyY3VsYXJfdmlld3NbdGhpcy5jaXJjdWxhcl92
aWV3cy5sPQplbmd0aC0xXS5yYWRpdXNfYm91bmRzWzFdLAogICAgICAgICAgICAgdHJhY2tfYm91
bmRzID0zRCBbCiAgICAgICAgICAgICAgICAgb3V0ZXJtb3N0X3JhZGl1cywKQEAgLTMwNSw3ICsz
MDksNyBAQAogICAgICAgICAgICAgZ2Vub21lOiBzZWxmLmdlbm9tZSwKICAgICAgICAgICAgIHRv
dGFsX2dhcDogdG90YWxfZ2FwCiAgICAgICAgIH0pOwotICAgICAgID0yMAorCiAgICAgICAgIHRo
aXMubGFiZWxfdHJhY2tfdmlldy5yZW5kZXIoKTsKICAgICB9LAo9MjAKQEAgLTM1Niw3ICszNjAs
NyBAQAo9MjAKICAgICAgICAgICAgIC8vIFVwZGF0ZSBsYWJlbCB0cmFjay4KICAgICAgICAgICAg
IC8qCi0gICAgICAgICAgICBGSVhNRTogc2hvdWxkIG5ldmVyIGhhdmUgdG8gdXBkYXRlIGxhYmVs
IHRyYWNrIGJlY2F1c2UgdmlzIGFsdz0KYXlzIGV4cGFuZHMgdG8gZml0IGFyZWE9MjAKKyAgICAg
ICAgICAgIEZJWE1FOiBzaG91bGQgbmV2ZXIgaGF2ZSB0byB1cGRhdGUgbGFiZWwgdHJhY2sgYmVj
YXVzZSB2aXMgYWx3PQpheXMgZXhwYW5kcyB0byBmaXQgYXJlYQogICAgICAgICAgICAgd2l0aGlu
IGxhYmVsIHRyYWNrLgogICAgICAgICAgICAgdmFyIHRyYWNrX2JvdW5kcyA9M0QgbmV3X3RyYWNr
X2JvdW5kc1sgbmV3X3RyYWNrX2JvdW5kcy5sZW5ndGg9Ci0xIF07CiAgICAgICAgICAgICB0cmFj
a19ib3VuZHNbMV0gPTNEIHRyYWNrX2JvdW5kc1swXTsKQEAgLTM3Myw3ICszNzcsNyBAQAogICAg
ICAgICB2YXIgdHJhY2tfdmlldyA9M0QgdGhpcy5jaXJjdWxhcl92aWV3c1tvcHRpb25zLmluZGV4
XTsKICAgICAgICAgdGhpcy5jaXJjdWxhcl92aWV3cy5zcGxpY2Uob3B0aW9ucy5pbmRleCwgMSk7
CiAgICAgICAgIHRyYWNrX3ZpZXcuJGVsLnJlbW92ZSgpOwotICAgICAgID0yMAorCiAgICAgICAg
IC8vIFJlY29tcHV0ZSBhbmQgdXBkYXRlIHRyYWNrIGJvdW5kcy4KICAgICAgICAgdmFyIG5ld190
cmFja19ib3VuZHMgPTNEIHRoaXMuZ2V0X3RyYWNrc19ib3VuZHMoKTsKICAgICAgICAgXy5lYWNo
KHRoaXMuY2lyY3VsYXJfdmlld3MsIGZ1bmN0aW9uKHRyYWNrX3ZpZXcsIGkpIHsKQEAgLTM5Miw3
ICszOTYsNyBAQAogICAgICAgICBfLmVhY2godGhpcy5jaG9yZHNfdmlld3MsIGZ1bmN0aW9uKHRy
YWNrX3ZpZXcpIHsKICAgICAgICAgICAgIHRyYWNrX3ZpZXcudXBkYXRlX3JhZGl1c19ib3VuZHMo
bmV3X3RyYWNrX2JvdW5kc1swXSk7CiAgICAgICAgIH0pOwotICAgICAgID0yMAorCiAgICAgfQog
fSk7Cj0yMApAQCAtNDU1LDcgKzQ1OSw3IEBACj0yMAogICAgICAgICAgICAgLy8gQXBwZW5kIHRp
dGxlcyB0byBwYXRocy4KICAgICAgICAgICAgIGNocm9tc19wYXRocy5hcHBlbmQoInRpdGxlIiku
dGV4dChmdW5jdGlvbihkKSB7IHJldHVybiBkLmRhdGEuPQpjaHJvbTsgfSk7Ci0gICAgICAgICAg
ID0yMAorCiAgICAgICAgIC8vIC0tIFJlbmRlciB0cmFjayBkYXRhIGFuZCwgd2hlbiB0cmFjayBk
YXRhIGlzIHJlbmRlcmVkLCBhcHBseSBwcj0KZWZlcmVuY2VzIGFuZCB1cGRhdGUgY2hyb21fZWx0
cyBmaWxsLiAtLQo9MjAKICAgICAgICAgdmFyIHNlbGYgPTNEIHRoaXMsCkBAIC00OTAsNyArNDk0
LDcgQEAKICAgICAgICAgdmFyIG5ld19kID0zRCBkMy5zdmcuYXJjKCkKICAgICAgICAgICAgICAg
ICAgICAgICAgIC5pbm5lclJhZGl1cyh0aGlzLnJhZGl1c19ib3VuZHNbMF0pCiAgICAgICAgICAg
ICAgICAgICAgICAgICAub3V0ZXJSYWRpdXModGhpcy5yYWRpdXNfYm91bmRzWzFdKTsKLSAgICAg
ICA9MjAKKwogICAgICAgICB0aGlzLnBhcmVudF9lbHQuc2VsZWN0QWxsKCdnPnBhdGguY2hyb20t
YmFja2dyb3VuZCcpLnRyYW5zaXRpb24oKS49CmR1cmF0aW9uKDEwMDApLmF0dHIoJ2QnLCBuZXdf
ZCk7Cj0yMAogICAgICAgICB0aGlzLl90cmFuc2l0aW9uX2Nocm9tX2RhdGEoKTsKQEAgLTUxMSw3
ICs1MTUsNyBAQAogICAgICAgICB9Cj0yMAogICAgICAgICAvLyAtLSBTY2FsZSBpbmNyZWFzZWQs
IHNvIHJlbmRlciB2aXNpYmxlIGRhdGEgd2l0aCBtb3JlIGRldGFpbC4gLS0KLSAgICAgICA9MjAK
KwogICAgICAgICB2YXIgc2VsZiA9M0QgdGhpcywKICAgICAgICAgICAgIHV0aWxzID0zRCBuZXcg
U1ZHVXRpbHMoKTsKPTIwCkBAIC01MzksNyArNTQzLDcgQEAKICAgICAgICAgICAgICQud2hlbihk
YXRhX2RlZmVycmVkKS50aGVuKGZ1bmN0aW9uKGRhdGEpIHsKICAgICAgICAgICAgICAgICAvLyBS
ZW1vdmUgY3VycmVudCBkYXRhIHBhdGguCiAgICAgICAgICAgICAgICAgcGF0aF9lbHQucmVtb3Zl
KCk7Ci0gICAgICAgICAgICAgICA9MjAKKwogICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBkYXRh
IGJvdW5kcyB3aXRoIG5ldyBkYXRhLgogICAgICAgICAgICAgICAgIHNlbGYuX3VwZGF0ZV9kYXRh
X2JvdW5kcygpOwo9MjAKQEAgLTU5OCwxMiArNjAyLDEyIEBACiAgICAgX3RyYW5zaXRpb25fbGFi
ZWxzOiBmdW5jdGlvbigpIHt9LAo9MjAKICAgICAvKioKLSAgICAgKiBVcGRhdGUgZGF0YSBib3Vu
ZHMuIElmIHRoZXJlIGFyZSBuZXdfYm91bmRzLCB1c2UgdGhlbTsgb3RoZXJ3aXNlIHVzPQplPTIw
CisgICAgICogVXBkYXRlIGRhdGEgYm91bmRzLiBJZiB0aGVyZSBhcmUgbmV3X2JvdW5kcywgdXNl
IHRoZW07IG90aGVyd2lzZSB1c2UKICAgICAgKiBkZWZhdWx0IGRhdGEgYm91bmRzLgogICAgICAq
LwogICAgIF91cGRhdGVfZGF0YV9ib3VuZHM6IGZ1bmN0aW9uKG5ld19ib3VuZHMpIHsKICAgICAg
ICAgdmFyIG9sZF9ib3VuZHMgPTNEIHRoaXMuZGF0YV9ib3VuZHM7Ci0gICAgICAgIHRoaXMuZGF0
YV9ib3VuZHMgPTNEIG5ld19ib3VuZHMgfHw9MjAKKyAgICAgICAgdGhpcy5kYXRhX2JvdW5kcyA9
M0QgbmV3X2JvdW5kcyB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRfZGF0
YV9ib3VuZHModGhpcy50cmFjay5nZXQoJ2RhdGFfbWFuYWc9CmVyJykuZ2V0X2dlbm9tZV93aWRl
X2RhdGEodGhpcy5nZW5vbWUpKTsKICAgICAgICAgdGhpcy5fdHJhbnNpdGlvbl9jaHJvbV9kYXRh
KCk7CiAgICAgfSwKQEAgLTYyNCw3ICs2MjgsNyBAQAo9MjAKICAgICAgICAgICAgIC8vIFNldCBt
aW4sIG1heCB2YWx1ZSBpbiBjb25maWcgc28gdGhhdCB0aGV5IGNhbiBiZSBhZGp1c3RlZC4gPQpN
YWtlIHRoaXMgc2lsZW50CiAgICAgICAgICAgICAvLyBiZWNhdXNlIHRoZXNlIGF0dHJpYnV0ZXMg
YXJlIHdhdGNoZWQgZm9yIGNoYW5nZXMgYW5kIHRoZSB2aT0KeiBpcyB1cGRhdGVkCi0gICAgICAg
ICAgICAvLyBhY2NvcmRpbmdseSAoc2V0IHVwIGluIGluaXRpYWxpemUpLiBCZWNhdXNlIHdlIGFy
ZSBzZXR0aW5nID0KdXAsIHdlIGRvbid0IHdhbnQ9MjAKKyAgICAgICAgICAgIC8vIGFjY29yZGlu
Z2x5IChzZXQgdXAgaW4gaW5pdGlhbGl6ZSkuIEJlY2F1c2Ugd2UgYXJlIHNldHRpbmcgPQp1cCwg
d2UgZG9uJ3Qgd2FudAogICAgICAgICAgICAgLy8gdGhlIHdhdGNoIHRvIHRyaWdnZXIgZXZlbnRz
IGhlcmUuCiAgICAgICAgICAgICB0cmFjay5nZXQoJ2NvbmZpZycpLnNldF92YWx1ZSgnbWluX3Zh
bHVlJywgc2VsZi5kYXRhX2JvdW5kc1swXT0KLCB7c2lsZW50OiB0cnVlfSk7CiAgICAgICAgICAg
ICB0cmFjay5nZXQoJ2NvbmZpZycpLnNldF92YWx1ZSgnbWF4X3ZhbHVlJywgc2VsZi5kYXRhX2Jv
dW5kc1sxXT0KLCB7c2lsZW50OiB0cnVlfSk7CkBAIC02NjAsNyArNjY0LDcgQEAKICAgICBfZ2V0
X3BhdGhfZnVuY3Rpb246IGZ1bmN0aW9uKGNocm9tX2FyYywgY2hyb21fZGF0YSkge30sCj0yMAog
ICAgIC8qKgotICAgICAqIFJldHVybnMgYXJjIGxheW91dHMgZm9yIGdlbm9tZSdzIGNocm9tb3Nv
bWVzL2NvbnRpZ3MuIEFyY3MgYXJlIGFycmE9Cm5nZWQgaW4gYSBjaXJjbGU9MjAKKyAgICAgKiBS
ZXR1cm5zIGFyYyBsYXlvdXRzIGZvciBnZW5vbWUncyBjaHJvbW9zb21lcy9jb250aWdzLiBBcmNz
IGFyZSBhcnJhPQpuZ2VkIGluIGEgY2lyY2xlCiAgICAgICogc2VwYXJhdGVkIGJ5IGdhcHMuCiAg
ICAgICovCiAgICAgX2Nocm9tc19sYXlvdXQ6IGZ1bmN0aW9uKCkgewpAQCAtNzAwLDE0ICs3MDQs
MTQgQEAKICAgICAgKiBSZW5kZXIgbGFiZWxzLgogICAgICAqLwogICAgIF9yZW5kZXJfZGF0YTog
ZnVuY3Rpb24oc3ZnKSB7Ci0gICAgICAgIC8vIC0tIEFkZCBjaHJvbW9zb21lIGxhYmVsIHdoZXJl
IGl0IHdpbGwgZml0OyBhbiBhbHRlcm5hdGl2ZSBsYWJlbD0KaW5nIG1lY2hhbmlzbT0yMAorICAg
ICAgICAvLyAtLSBBZGQgY2hyb21vc29tZSBsYWJlbCB3aGVyZSBpdCB3aWxsIGZpdDsgYW4gYWx0
ZXJuYXRpdmUgbGFiZWw9CmluZyBtZWNoYW5pc20KICAgICAgICAgLy8gd291bGQgYmUgbmljZSBm
b3Igc21hbGwgY2hyb21vc29tZXMuIC0tCiAgICAgICAgIHZhciBzZWxmID0zRCB0aGlzLAogICAg
ICAgICAgICAgY2hyb21fYXJjcyA9M0Qgc3ZnLnNlbGVjdEFsbCgnZycpOwo9MjAKICAgICAgICAg
Y2hyb21fYXJjcy5zZWxlY3RBbGwoJ3BhdGgnKQogICAgICAgICAgICAgLmF0dHIoJ2lkJywgZnVu
Y3Rpb24oZCkgeyByZXR1cm4gJ2xhYmVsLScgKyBkLmRhdGEuY2hyb207IH0pOwotICAgICAgICAg
PTIwCisKICAgICAgICAgY2hyb21fYXJjcy5hcHBlbmQoInN2Zzp0ZXh0IikKICAgICAgICAgICAg
IC5maWx0ZXIoZnVuY3Rpb24oZCkgewogICAgICAgICAgICAgICAgIHJldHVybiBkLmVuZEFuZ2xl
IC0gZC5zdGFydEFuZ2xlID4gc2VsZi5taW5fYXJjX2xlbjsKQEAgLTg1NywxMiArODYxLDEyIEBA
CiAgICAgICAgICAgICAgICAgcmV0dXJuICJyb3RhdGUoOTApIjsKICAgICAgICAgICAgIH07Cj0y
MAotICAgICAgICAvLyBGSVhNRTo9MjAKKyAgICAgICAgLy8gRklYTUU6CiAgICAgICAgIC8vICgx
KSB1c2luZyBtaW5fbWF4IGNsYXNzIGJlbG93IGlzIG5lZWRlZCBmb3IgX3VwZGF0ZV9taW5fbWF4
LCB3aD0KaWNoIGNvdWxkIGJlIGltcHJvdmVkLgogICAgICAgICAvLyAoMikgc2hvd2luZyBjb25m
aWcgb24gdGljayBjbGljayBzaG91bGQgYmUgcmVwbGFjZWQgYnkgcHJvcGVyIHQ9CnJhY2sgY29u
ZmlnIGljb24uCj0yMAogICAgICAgICAvLyBEcmF3IG1pbiwgbWF4IG9uIGZpcnN0IGNocm9tIG9u
bHkuCi0gICAgICAgIHZhciB0aWNrcyA9M0QgdGhpcy5kcmF3VGlja3ModGhpcy5wYXJlbnRfZWx0
LCBbIHRoaXMuY2hyb21zX2xheW91dD0KWzBdIF0sPTIwCisgICAgICAgIHZhciB0aWNrcyA9M0Qg
dGhpcy5kcmF3VGlja3ModGhpcy5wYXJlbnRfZWx0LCBbIHRoaXMuY2hyb21zX2xheW91dD0KWzBd
IF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2RhdGFfYm91bmRz
X3RpY2tzX2ZuKCksIHRleHRUcmFucz0KZm9ybSwgdHJ1ZSkKICAgICAgICAgICAgICAgICAgICAg
ICAgIC5jbGFzc2VkKCdtaW5fbWF4JywgdHJ1ZSk7Cj0yMApAQCAtODcyLDcgKzg3Niw3IEBACiAg
ICAgICAgICAgICAgICAgdmFyIHZpZXcgPTNEIG5ldyBjb25maWcuQ29uZmlnU2V0dGluZ0NvbGxl
Y3Rpb25WaWV3KHsKICAgICAgICAgICAgICAgICAgICAgY29sbGVjdGlvbjogc2VsZi50cmFjay5n
ZXQoJ2NvbmZpZycpCiAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICAgICAgdmlldy5y
ZW5kZXJfaW5fbW9kYWwoJ0NvbmZpZ3VyZSBUcmFjaycpOz0yMAorICAgICAgICAgICAgICAgIHZp
ZXcucmVuZGVyX2luX21vZGFsKCdDb25maWd1cmUgVHJhY2snKTsKICAgICAgICAgICAgIH0pOwog
ICAgICAgICB9KTsKPTIwCkBAIC05NTEsNyArOTU1LDcgQEAKIHZhciBDaXJjc3RlckJpZ1dpZ1Ry
YWNrVmlldyA9M0QgQ2lyY3N0ZXJRdWFudGl0YXRpdmVUcmFja1ZpZXcuZXh0ZW5kKHsKPTIwCiAg
ICAgZ2V0X2RhdGFfYm91bmRzOiBmdW5jdGlvbihkYXRhKSB7Ci0gICAgICAgIC8vIFNldCBtYXgg
YWNyb3NzIGRhdGFzZXQgYnkgZXh0cmFjdGluZyBhbGwgdmFsdWVzLCBmbGF0dGVuaW5nIHRoZT0K
bSBpbnRvIGE9MjAKKyAgICAgICAgLy8gU2V0IG1heCBhY3Jvc3MgZGF0YXNldCBieSBleHRyYWN0
aW5nIGFsbCB2YWx1ZXMsIGZsYXR0ZW5pbmcgdGhlPQptIGludG8gYQogICAgICAgICAvLyBzaW5n
bGUgYXJyYXksIGFuZCBnZXR0aW5nIHRoaXJkIHF1YXJ0aWxlLgogICAgICAgICB2YXIgdmFsdWVz
ID0zRCBfLmZsYXR0ZW4oIF8ubWFwKGRhdGEsIGZ1bmN0aW9uKGQpIHsKICAgICAgICAgICAgIGlm
IChkKSB7CkBAIC05NjUsOCArOTY5LDggQEAKICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAg
ICAgICAgICAgIH0KICAgICAgICAgfSkgKTsKLSAgICAgICA9MjAKLSAgICAgICAgLy8gRm9yIG1h
eCwgdXNlIDk4JSBxdWFudGlsZSBpbiBhdHRlbXB0IHRvIGF2b2lkIHZlcnkgbGFyZ2UgdmFsdWVz
PQouIEhvd2V2ZXIsIHRoaXMgbWF4IG1heSBiZSAwPTIwCisKKyAgICAgICAgLy8gRm9yIG1heCwg
dXNlIDk4JSBxdWFudGlsZSBpbiBhdHRlbXB0IHRvIGF2b2lkIHZlcnkgbGFyZ2UgdmFsdWVzPQou
IEhvd2V2ZXIsIHRoaXMgbWF4IG1heSBiZSAwCiAgICAgICAgIC8vIGZvciBzcGFyc2VseSBwb3B1
bGF0ZWQgZGF0YSwgc28gdXNlIG1heCBpbiB0aGF0IGNhc2UuCiAgICAgICAgIHJldHVybiBbIF8u
bWluKHZhbHVlcyksIHRoaXMuX3F1YW50aWxlKHZhbHVlcywgMC45OCkgfHwgXy5tYXgodmFsdT0K
ZXMpIF07CiAgICAgfQpAQCAtMTA2OCwxMyArMTA3MiwxMyBAQAogICAgICAgICAgICAgICAgIGdl
bm9tZSAgICAgICAgICAgICAgOiBnZW5vbWUsCiAgICAgICAgICAgICAgICAgbW9kZWwgICAgICAg
ICAgICAgICA6IHZpcwogICAgICAgICAgICAgfSk7Ci0gICAgICAgPTIwCisKICAgICAgICAgLy8g
UmVuZGVyIHZpenVhbGl6YXRpb24KICAgICAgICAgdml6X3ZpZXcucmVuZGVyKCk7Ci0gICAgICAg
PTIwCisKICAgICAgICAgLy8gc2V0dXAgdGl0bGUKICAgICAgICAgJCgnI2NlbnRlciAudW5pZmll
ZC1wYW5lbC1oZWFkZXItaW5uZXInKS5hcHBlbmQoZ2FsYXh5X2NvbmZpZy5hcHAuPQp2aXpfY29u
ZmlnLnRpdGxlICsgIiAiICsgZ2FsYXh5X2NvbmZpZy5hcHAudml6X2NvbmZpZy5kYmtleSk7Ci0g
ICA9MjAKKwogICAgICAgICAvLyBzZXR1cCBtZW51CiAgICAgICAgIHZhciBtZW51ID0zRCBtb2Rf
aWNvbl9idG4uY3JlYXRlX2ljb25fYnV0dG9uc19tZW51KFsKICAgICAgICAgewpAQCAtMTEwMCw3
ICsxMTA0LDcgQEAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAvLyBzaG93IHNhdmlu
ZyBkaWFsb2cgYm94CiAgICAgICAgICAgICAgICAgR2FsYXh5Lm1vZGFsLnNob3coe3RpdGxlOiAi
U2F2aW5nLi4uIiwgYm9keTogInByb2dyZXNzIiB9KTsKLSAgICA9MjAKKwogICAgICAgICAgICAg
ICAgIC8vIHNlbmQgdG8gc2VydmVyCiAgICAgICAgICAgICAgICAgJC5hamF4KHsKICAgICAgICAg
ICAgICAgICAgICAgdXJsOiBnYWxheHlfY29uZmlnLnJvb3QgKyAidmlzdWFsaXphdGlvbi9zYXZl
IiwKQEAgLTExMzIsMTEgKzExMzYsMTEgQEAKICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRp
b24gPTNEIGdhbGF4eV9jb25maWcucm9vdCArICJ2aXN1YWxpemF0aW9uL2xpPQpzdCI7CiAgICAg
ICAgICAgICB9CiAgICAgICAgIH1dLCB7IHRvb2x0aXBfY29uZmlnOiB7IHBsYWNlbWVudDogJ2Jv
dHRvbScgfSB9KTsKLSAgICAgICAgICAgPTIwCisKICAgICAgICAgLy8gYWRkIG1lbnUKICAgICAg
ICAgbWVudS4kZWwuYXR0cigic3R5bGUiLCAiZmxvYXQ6IHJpZ2h0Iik7CiAgICAgICAgICQoIiNj
ZW50ZXIgLnVuaWZpZWQtcGFuZWwtaGVhZGVyLWlubmVyIikuYXBwZW5kKG1lbnUuJGVsKTsKLSAg
ICAgICAgICAgPTIwCisKICAgICAgICAgLy8gbWFudWFsIHRvb2x0aXAgY29uZmlnIGJlY2F1c2Ug
ZGVmYXVsdCBncmF2aXR5IGlzIFMgYW5kIGNhbm5vdCBiPQplIGNoYW5nZWQKICAgICAgICAgJCgi
Lm1lbnUtYnV0dG9uIikudG9vbHRpcCggeyBwbGFjZW1lbnQ6ICdib3R0b20nIH0gKTsKICAgICB9
CgpkaWZmIC1yIDVkZDY1NDlhYWMzYTI5YjE1NjJmZDNlNTMwNmMxYzY5ZWYwMDQ3YTcgLXIgNjVi
MjMzMGI4MjNjNzYxMTM2OWI5N2I9CjA4MjkyYTZjODY0ZGVlMTFjIHN0YXRpYy9zY3JpcHRzL3Bh
Y2tlZC92aXovY2lyY3N0ZXIuanMKLS0tIGEvc3RhdGljL3NjcmlwdHMvcGFja2VkL3Zpei9jaXJj
c3Rlci5qcworKysgYi9zdGF0aWMvc2NyaXB0cy9wYWNrZWQvdml6L2NpcmNzdGVyLmpzCkBAIC0x
LDEgKzEsMSBAQAotcmVxdWlyZShbInV0aWxzL3V0aWxzIiwibXZjL3VpL2ljb24tYnV0dG9uIiwi
bGlicy9mYXJidGFzdGljIixdLGZ1bmN0aW9uKGI9CixhKXtiLmNzc0xvYWRGaWxlKCJzdGF0aWMv
c3R5bGUvY2lyY3N0ZXIuY3NzIil9KTtkZWZpbmUoWyJsaWJzL3VuZGVyc2NvcmUiLD0KImxpYnMv
ZDMiLCJ2aXovdmlzdWFsaXphdGlvbiIsInV0aWxzL2NvbmZpZyJdLGZ1bmN0aW9uKGgsbSxqLGMp
e3ZhciBuPTNEQmFjPQprYm9uZS5Nb2RlbC5leHRlbmQoe2lzX3Zpc2libGU6ZnVuY3Rpb24ocixv
KXt2YXIgcD0zRHIuZ2V0Qm91bmRpbmdDbGllbnRSZWM9CnQoKSxxPTNEJCgic3ZnIilbMF0uZ2V0
Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYocC5yaWdodDwwfHxwLmxlZnQ+cS5yaWdodHx8cD0KLmJv
dHRvbTwwfHxwLnRvcD5xLmJvdHRvbSl7cmV0dXJuIGZhbHNlfXJldHVybiB0cnVlfX0pO3ZhciBp
PTNEe2RyYXdUaWNrczpmPQp1bmN0aW9uKHMscix3LHEsbyl7dmFyIHY9M0RzLmFwcGVuZCgiZyIp
LnNlbGVjdEFsbCgiZyIpLmRhdGEocikuZW50ZXIoKS5hcHA9CmVuZCgiZyIpLnNlbGVjdEFsbCgi
ZyIpLmRhdGEodykuZW50ZXIoKS5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsInRpY2siKS5hdD0K
dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24oeCl7cmV0dXJuInJvdGF0ZSgiKyh4LmFuZ2xlKjE4MC9N
YXRoLlBJLTkwKSsiKXRyYW5zPQpsYXRlKCIreC5yYWRpdXMrIiwwKSJ9KTt2YXIgdT0zRFtdLHQ9
M0RbXSxwPTNEZnVuY3Rpb24oeCl7cmV0dXJuIHguYW5nbGU+TWE9CnRoLlBJPyJlbmQiOm51bGx9
O2lmKG8pe3U9M0RbMCwwLDAsLTRdO3Q9M0RbNCwwLCIiLCIuMzVlbSJdO3A9M0RudWxsfWVsc2V7
dT0KPTNEWzEsMCw0LDBdO3Q9M0RbMCw0LCIuMzVlbSIsIiJdfXYuYXBwZW5kKCJsaW5lIikuYXR0
cigieDEiLHVbMF0pLmF0dHIoInkxPQoiLHVbMV0pLmF0dHIoIngyIix1WzJdKS5hdHRyKCJ5MSIs
dVszXSkuc3R5bGUoInN0cm9rZSIsIiMwMDAiKTtyZXR1cm4gdi5hcHA9CmVuZCgidGV4dCIpLmF0
dHIoIngiLHRbMF0pLmF0dHIoInkiLHRbMV0pLmF0dHIoImR4Iix0WzJdKS5hdHRyKCJkeSIsdFsz
XSkuYT0KdHRyKCJ0ZXh0LWFuY2hvciIscCkuYXR0cigidHJhbnNmb3JtIixxKS50ZXh0KGZ1bmN0
aW9uKHgpe3JldHVybiB4LmxhYmVsfSl9PQosZm9ybWF0TnVtOmZ1bmN0aW9uKHAsbyl7aWYobz0z
RD0zRD0zRHVuZGVmaW5lZCl7bz0zRDJ9aWYocD0zRD0zRD0zRG51bGwpe3I9CmV0dXJuIG51bGx9
dmFyIHI9M0RudWxsO2lmKE1hdGguYWJzKHApPDEpe3I9M0RwLnRvUHJlY2lzaW9uKG8pfWVsc2V7
dmFyIHE9Cj0zRE1hdGgucm91bmQocC50b1ByZWNpc2lvbihvKSk7cD0zRE1hdGguYWJzKHApO2lm
KHA8MTAwMCl7cj0zRHF9ZWxzZXtpZihwPD0KMTAwMDAwMCl7cj0zRE1hdGgucm91bmQoKHEvMTAw
MCkudG9QcmVjaXNpb24oMykpLnRvRml4ZWQoMCkrIksifWVsc2V7aWYocDwxPQowMDAwMDAwMDAp
e3I9M0RNYXRoLnJvdW5kKChxLzEwMDAwMDApLnRvUHJlY2lzaW9uKDMpKS50b0ZpeGVkKDApKyJN
In19fX1yZXQ9CnVybiByfX07dmFyIGQ9M0RCYWNrYm9uZS5Nb2RlbC5leHRlbmQoe30pO3ZhciBh
PTNEQmFja2JvbmUuVmlldy5leHRlbmQoe2NsYT0Kc3NOYW1lOiJjaXJjc3RlciIsaW5pdGlhbGl6
ZTpmdW5jdGlvbihvKXt0aGlzLmdlbm9tZT0zRG8uZ2Vub21lO3RoaXMubGFiZWxfPQphcmNfaGVp
Z2h0PTNENTA7dGhpcy5zY2FsZT0zRDE7dGhpcy5jaXJjdWxhcl92aWV3cz0zRG51bGw7dGhpcy5j
aG9yZHNfdmlld3M9Cj0zRG51bGw7dGhpcy5tb2RlbC5nZXQoImRyYXdhYmxlcyIpLm9uKCJhZGQi
LHRoaXMuYWRkX3RyYWNrLHRoaXMpO3RoaXMubW9kZT0KbC5nZXQoImRyYXdhYmxlcyIpLm9uKCJy
ZW1vdmUiLHRoaXMucmVtb3ZlX3RyYWNrLHRoaXMpO3ZhciBwPTNEdGhpcy5tb2RlbC5nPQpldCgi
Y29uZmlnIik7cC5nZXQoImFyY19kYXRhc2V0X2hlaWdodCIpLm9uKCJjaGFuZ2U6dmFsdWUiLHRo
aXMudXBkYXRlX3RyYWM9CmtfYm91bmRzLHRoaXMpO3AuZ2V0KCJ0cmFja19nYXAiKS5vbigiY2hh
bmdlOnZhbHVlIix0aGlzLnVwZGF0ZV90cmFja19ib3VuZD0Kcyx0aGlzKX0sZ2V0X2NpcmN1bGFy
X3RyYWNrczpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1vZGVsLmdldCgiZHJhd2FibGVzIikuPQpm
aWx0ZXIoZnVuY3Rpb24obyl7cmV0dXJuIG8uZ2V0KCJ0cmFja190eXBlIikhPTNEPTNEIkRpYWdv
bmFsSGVhdG1hcFRyYWNrIn09Cil9LGdldF9jaG9yZF90cmFja3M6ZnVuY3Rpb24oKXtyZXR1cm4g
dGhpcy5tb2RlbC5nZXQoImRyYXdhYmxlcyIpLmZpbHRlcihmdT0KbmN0aW9uKG8pe3JldHVybiBv
LmdldCgidHJhY2tfdHlwZSIpPTNEPTNEPTNEIkRpYWdvbmFsSGVhdG1hcFRyYWNrIn0pfSxnZXRf
PQp0cmFja3NfYm91bmRzOmZ1bmN0aW9uKCl7dmFyIHE9M0R0aGlzLmdldF9jaXJjdWxhcl90cmFj
a3MoKSxzPTNEdGhpcy5tb2RlbC49CmdldCgiY29uZmlnIikuZ2V0X3ZhbHVlKCJhcmNfZGF0YXNl
dF9oZWlnaHQiKSxyPTNEdGhpcy5tb2RlbC5nZXQoImNvbmZpZyIpLj0KZ2V0X3ZhbHVlKCJ0cmFj
a19nYXAiKSxvPTNETWF0aC5taW4odGhpcy4kZWwud2lkdGgoKSx0aGlzLiRlbC5oZWlnaHQoKSkt
MjAsPQp1PTNEby8yLXEubGVuZ3RoKihzK3IpK3ItdGhpcy5sYWJlbF9hcmNfaGVpZ2h0LHQ9M0Rt
LnJhbmdlKHUsby8yLHMrcik7dmFyIHA9Cj0zRHRoaXM7cmV0dXJuIGgubWFwKHQsZnVuY3Rpb24o
dil7cmV0dXJuW3YsditzXX0pfSxyZW5kZXI6ZnVuY3Rpb24oKXt2YXIgeD0KPTNEdGhpcyxvPTNE
eC4kZWwud2lkdGgoKSx3PTNEeC4kZWwuaGVpZ2h0KCksdD0zRHRoaXMuZ2V0X2NpcmN1bGFyX3Ry
YWNrcygpPQoscj0zRHRoaXMuZ2V0X2Nob3JkX3RyYWNrcygpLHE9M0R4Lm1vZGVsLmdldCgiY29u
ZmlnIikuZ2V0X3ZhbHVlKCJ0b3RhbF9nYXA9CiIpLHM9M0R0aGlzLmdldF90cmFja3NfYm91bmRz
KCkscD0zRG0uc2VsZWN0KHguJGVsWzBdKS5hcHBlbmQoInN2ZyIpLmF0dHIoIj0Kd2lkdGgiLG8p
LmF0dHIoImhlaWdodCIsdykuYXR0cigicG9pbnRlci1ldmVudHMiLCJhbGwiKS5hcHBlbmQoInN2
ZzpnIikuY2FsPQpsKG0uYmVoYXZpb3Iuem9vbSgpLm9uKCJ6b29tIixmdW5jdGlvbigpe3ZhciB5
PTNEbS5ldmVudC5zY2FsZTtwLmF0dHIoInRyYW49CnNmb3JtIiwidHJhbnNsYXRlKCIrbS5ldmVu
dC50cmFuc2xhdGUrIikgc2NhbGUoIit5KyIpIik7aWYoeC5zY2FsZSE9M0Q9M0R5KT0Ke2lmKHgu
em9vbV9kcmFnX3RpbWVvdXQpe2NsZWFyVGltZW91dCh4Lnpvb21fZHJhZ190aW1lb3V0KX14Lnpv
b21fZHJhZ190aW1lPQpvdXQ9M0RzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSw0MDApfX0pKS5hdHRy
KCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIitvLzIrIiw9CiIrdy8yKyIpIikuYXBwZW5kKCJzdmc6
ZyIpLmF0dHIoImNsYXNzIiwidHJhY2tzIik7dGhpcy5jaXJjdWxhcl92aWV3cz0zRHQubT0KYXAo
ZnVuY3Rpb24oeixBKXt2YXIgeT0zRG5ldyBlKHtlbDpwLmFwcGVuZCgiZyIpWzBdLHRyYWNrOnos
cmFkaXVzX2JvdW5kczpzPQpbQV0sZ2Vub21lOnguZ2Vub21lLHRvdGFsX2dhcDpxfSk7eS5yZW5k
ZXIoKTtyZXR1cm4geX0pO3RoaXMuY2hvcmRzX3ZpZXdzPQo9M0RyLm1hcChmdW5jdGlvbih6KXt2
YXIgeT0zRG5ldyBrKHtlbDpwLmFwcGVuZCgiZyIpWzBdLHRyYWNrOnoscmFkaXVzX2JvdW49CmRz
OnNbMF0sZ2Vub21lOnguZ2Vub21lLHRvdGFsX2dhcDpxfSk7eS5yZW5kZXIoKTtyZXR1cm4geX0p
O3ZhciB2PTNEdGhpcy5jaT0KcmN1bGFyX3ZpZXdzW3RoaXMuY2lyY3VsYXJfdmlld3MubGVuZ3Ro
LTFdLnJhZGl1c19ib3VuZHNbMV0sdT0zRFt2LHYrdGhpcy5sPQphYmVsX2FyY19oZWlnaHRdO3Ro
aXMubGFiZWxfdHJhY2tfdmlldz0zRG5ldyBiKHtlbDpwLmFwcGVuZCgiZyIpWzBdLHRyYWNrOm49
CmV3IGQoKSxyYWRpdXNfYm91bmRzOnUsZ2Vub21lOnguZ2Vub21lLHRvdGFsX2dhcDpxfSk7dGhp
cy5sYWJlbF90cmFja192aWV3Lj0KcmVuZGVyKCl9LGFkZF90cmFjazpmdW5jdGlvbih1KXt2YXIg
cD0zRHRoaXMubW9kZWwuZ2V0KCJjb25maWciKS5nZXRfdmFsdWUoPQoidG90YWxfZ2FwIik7aWYo
dS5nZXQoInRyYWNrX3R5cGUiKT0zRD0zRD0zRCJEaWFnb25hbEhlYXRtYXBUcmFjayIpe3ZhciBx
PQo9M0R0aGlzLmNpcmN1bGFyX3ZpZXdzWzBdLnJhZGl1c19ib3VuZHMsdD0zRG5ldyBrKHtlbDpt
LnNlbGVjdCgiZy50cmFja3MiKS49CmFwcGVuZCgiZyIpWzBdLHRyYWNrOnUscmFkaXVzX2JvdW5k
czpxLGdlbm9tZTp0aGlzLmdlbm9tZSx0b3RhbF9nYXA6cH0pO3Qucj0KZW5kZXIoKTt0aGlzLmNo
b3Jkc192aWV3cy5wdXNoKHQpfWVsc2V7dmFyIHM9M0R0aGlzLmdldF90cmFja3NfYm91bmRzKCk7
aC5lPQphY2godGhpcy5jaXJjdWxhcl92aWV3cyxmdW5jdGlvbih2LHcpe3YudXBkYXRlX3JhZGl1
c19ib3VuZHMoc1t3XSl9KTtoLmVhY2g9Cih0aGlzLmNob3Jkc192aWV3cyxmdW5jdGlvbih2KXt2
LnVwZGF0ZV9yYWRpdXNfYm91bmRzKHNbMF0pfSk7dmFyIHI9M0R0aGlzLj0KY2lyY3VsYXJfdmll
d3MubGVuZ3RoLG89M0RuZXcgZSh7ZWw6bS5zZWxlY3QoImcudHJhY2tzIikuYXBwZW5kKCJnIilb
MF0sdHJhPQpjazp1LHJhZGl1c19ib3VuZHM6c1tyXSxnZW5vbWU6dGhpcy5nZW5vbWUsdG90YWxf
Z2FwOnB9KTtvLnJlbmRlcigpO3RoaXMuY2k9CnJjdWxhcl92aWV3cy5wdXNoKG8pfX0scmVtb3Zl
X3RyYWNrOmZ1bmN0aW9uKHAscixxKXt2YXIgbz0zRHRoaXMuY2lyY3VsYXJfdj0KaWV3c1txLmlu
ZGV4XTt0aGlzLmNpcmN1bGFyX3ZpZXdzLnNwbGljZShxLmluZGV4LDEpO28uJGVsLnJlbW92ZSgp
O3ZhciBzPTNEPQp0aGlzLmdldF90cmFja3NfYm91bmRzKCk7aC5lYWNoKHRoaXMuY2lyY3VsYXJf
dmlld3MsZnVuY3Rpb24odCx1KXt0LnVwZGF0ZV89CnJhZGl1c19ib3VuZHMoc1t1XSl9KX0sdXBk
YXRlX3RyYWNrX2JvdW5kczpmdW5jdGlvbigpe3ZhciBvPTNEdGhpcy5nZXRfdHJhYz0Ka3NfYm91
bmRzKCk7aC5lYWNoKHRoaXMuY2lyY3VsYXJfdmlld3MsZnVuY3Rpb24ocCxxKXtwLnVwZGF0ZV9y
YWRpdXNfYm91bmRzPQoob1txXSl9KTtoLmVhY2godGhpcy5jaG9yZHNfdmlld3MsZnVuY3Rpb24o
cCl7cC51cGRhdGVfcmFkaXVzX2JvdW5kcyhvWzBdKX09Cil9fSk7dmFyIGw9M0RCYWNrYm9uZS5W
aWV3LmV4dGVuZCh7dGFnTmFtZToiZyIsaW5pdGlhbGl6ZTpmdW5jdGlvbihvKXt0aGlzLj0KYmdf
c3Ryb2tlPTNEIiNkZGQiO3RoaXMubG9hZGluZ19iZ19maWxsPTNEIiNmZmMiO3RoaXMuYmdfZmls
bD0zRCIjZGRkIjt0aGlzPQoudG90YWxfZ2FwPTNEby50b3RhbF9nYXA7dGhpcy50cmFjaz0zRG8u
dHJhY2s7dGhpcy5yYWRpdXNfYm91bmRzPTNEby5yYWRpdXM9Cl9ib3VuZHM7dGhpcy5nZW5vbWU9
M0RvLmdlbm9tZTt0aGlzLmNocm9tc19sYXlvdXQ9M0R0aGlzLl9jaHJvbXNfbGF5b3V0KCk7dD0K
aGlzLmRhdGFfYm91bmRzPTNEW107dGhpcy5zY2FsZT0zRDE7dGhpcy5wYXJlbnRfZWx0PTNEbS5z
ZWxlY3QodGhpcy4kZWxbMF0pPQp9LGdldF9maWxsX2NvbG9yOmZ1bmN0aW9uKCl7dmFyIG89M0R0
aGlzLnRyYWNrLmdldCgiY29uZmlnIikuZ2V0X3ZhbHVlKCJibG89CmNrX2NvbG9yIik7aWYoIW8p
e289M0R0aGlzLnRyYWNrLmdldCgiY29uZmlnIikuZ2V0X3ZhbHVlKCJjb2xvciIpfXJldHVybiBv
fT0KLHJlbmRlcjpmdW5jdGlvbigpe3ZhciBzPTNEdGhpcy5wYXJlbnRfZWx0O3ZhciByPTNEdGhp
cy5jaHJvbXNfbGF5b3V0LHU9M0RtPQouc3ZnLmFyYygpLmlubmVyUmFkaXVzKHRoaXMucmFkaXVz
X2JvdW5kc1swXSkub3V0ZXJSYWRpdXModGhpcy5yYWRpdXNfYm91bmQ9CnNbMV0pLG89M0RzLnNl
bGVjdEFsbCgiZyIpLmRhdGEocikuZW50ZXIoKS5hcHBlbmQoInN2ZzpnIikscT0zRG8uYXBwZW5k
KCJwYT0KdGgiKS5hdHRyKCJkIix1KS5hdHRyKCJjbGFzcyIsImNocm9tLWJhY2tncm91bmQiKS5z
dHlsZSgic3Ryb2tlIix0aGlzLmJnX3N0PQpyb2tlKS5zdHlsZSgiZmlsbCIsdGhpcy5sb2FkaW5n
X2JnX2ZpbGwpO3EuYXBwZW5kKCJ0aXRsZSIpLnRleHQoZnVuY3Rpb24odyk9CntyZXR1cm4gdy5k
YXRhLmNocm9tfSk7dmFyIHA9M0R0aGlzLHQ9M0RwLnRyYWNrLmdldCgiZGF0YV9tYW5hZ2VyIiks
dj0zRCh0Pz0KdC5kYXRhX2lzX3JlYWR5KCk6dHJ1ZSk7JC53aGVuKHYpLnRoZW4oZnVuY3Rpb24o
KXskLndoZW4ocC5fcmVuZGVyX2RhdGEocykpPQoudGhlbihmdW5jdGlvbigpe3Euc3R5bGUoImZp
bGwiLHAuYmdfZmlsbCk7cC5yZW5kZXJfbGFiZWxzKCl9KX0pfSxyZW5kZXJfbGE9CmJlbHM6ZnVu
Y3Rpb24oKXt9LHVwZGF0ZV9yYWRpdXNfYm91bmRzOmZ1bmN0aW9uKHApe3RoaXMucmFkaXVzX2Jv
dW5kcz0zRHA7dj0KYXIgbz0zRG0uc3ZnLmFyYygpLmlubmVyUmFkaXVzKHRoaXMucmFkaXVzX2Jv
dW5kc1swXSkub3V0ZXJSYWRpdXModGhpcy5yYWRpPQp1c19ib3VuZHNbMV0pO3RoaXMucGFyZW50
X2VsdC5zZWxlY3RBbGwoImc+cGF0aC5jaHJvbS1iYWNrZ3JvdW5kIikudHJhbnNpdGk9Cm9uKCku
ZHVyYXRpb24oMTAwMCkuYXR0cigiZCIsbyk7dGhpcy5fdHJhbnNpdGlvbl9jaHJvbV9kYXRhKCk7
dGhpcy5fdHJhbnNpdD0KaW9uX2xhYmVscygpfSx1cGRhdGVfc2NhbGU6ZnVuY3Rpb24ocil7dmFy
IHE9M0R0aGlzLnNjYWxlO3RoaXMuc2NhbGU9M0RyO2lmPQoocjw9M0RxKXtyZXR1cm59dmFyIHA9
M0R0aGlzLG89M0RuZXcgbigpO3RoaXMucGFyZW50X2VsdC5zZWxlY3RBbGwoInBhdGguY2g9CnJv
bS1kYXRhIikuZmlsdGVyKGZ1bmN0aW9uKHQscyl7cmV0dXJuIG8uaXNfdmlzaWJsZSh0aGlzKX0p
LmVhY2goZnVuY3Rpb24oeT0KLHUpe3ZhciB4PTNEbS5zZWxlY3QodGhpcyksdD0zRHguYXR0cigi
Y2hyb20iKSx3PTNEcC5nZW5vbWUuZ2V0X2Nocm9tX3JlZ2lvPQpuKHQpLHY9M0RwLnRyYWNrLmdl
dCgiZGF0YV9tYW5hZ2VyIikscztpZighdi5jYW5fZ2V0X21vcmVfZGV0YWlsZWRfZGF0YSh3KSk9
CntyZXR1cm59cz0zRHAudHJhY2suZ2V0KCJkYXRhX21hbmFnZXIiKS5nZXRfbW9yZV9kZXRhaWxl
ZF9kYXRhKHcsIkNvdmVyYWdlIj0KLDAscik7JC53aGVuKHMpLnRoZW4oZnVuY3Rpb24oQil7eC5y
ZW1vdmUoKTtwLl91cGRhdGVfZGF0YV9ib3VuZHMoKTt2YXIgQT0KPTNEaC5maW5kKHAuY2hyb21z
X2xheW91dCxmdW5jdGlvbihDKXtyZXR1cm4gQy5kYXRhLmNocm9tPTNEPTNEPTNEdH0pO3ZhciB6
PQo9M0RwLmdldF9maWxsX2NvbG9yKCk7cC5fcmVuZGVyX2Nocm9tX2RhdGEocC5wYXJlbnRfZWx0
LEEsQikuc3R5bGUoInN0cm9rZSI9Cix6KS5zdHlsZSgiZmlsbCIseil9KX0pO3JldHVybiBwfSxf
dHJhbnNpdGlvbl9jaHJvbV9kYXRhOmZ1bmN0aW9uKCl7dmFyIHA9Cj0zRHRoaXMudHJhY2sscj0z
RHRoaXMuY2hyb21zX2xheW91dCxvPTNEdGhpcy5wYXJlbnRfZWx0LnNlbGVjdEFsbCgiZz5wYXRo
Lj0KY2hyb20tZGF0YSIpLHM9M0RvWzBdLmxlbmd0aDtpZihzPjApe3ZhciBxPTNEdGhpczskLndo
ZW4ocC5nZXQoImRhdGFfbWFuYWdlPQpyIikuZ2V0X2dlbm9tZV93aWRlX2RhdGEodGhpcy5nZW5v
bWUpKS50aGVuKGZ1bmN0aW9uKHYpe3ZhciB1PTNEaC5yZWplY3QoaC49Cm1hcCh2LGZ1bmN0aW9u
KHcseCl7dmFyIHk9M0RudWxsLHo9M0RxLl9nZXRfcGF0aF9mdW5jdGlvbihyW3hdLHcpO2lmKHop
e3k9Cj0zRHoody5kYXRhKX1yZXR1cm4geX0pLGZ1bmN0aW9uKHcpe3JldHVybiB3PTNEPTNEPTNE
bnVsbH0pO3ZhciB0PTNEcC5nZXQoIj0KY29uZmlnIikuZ2V0X3ZhbHVlKCJjb2xvciIpO28uZWFj
aChmdW5jdGlvbih4LHcpe20uc2VsZWN0KHRoaXMpLnRyYW5zaXRpb24oPQopLmR1cmF0aW9uKDEw
MDApLnN0eWxlKCJzdHJva2UiLHQpLnN0eWxlKCJmaWxsIix0KS5hdHRyKCJkIix1W3ddKX0pfSl9
fSxfdHI9CmFuc2l0aW9uX2xhYmVsczpmdW5jdGlvbigpe30sX3VwZGF0ZV9kYXRhX2JvdW5kczpm
dW5jdGlvbihwKXt2YXIgbz0zRHRoaXMuZD0KYXRhX2JvdW5kczt0aGlzLmRhdGFfYm91bmRzPTNE
cHx8dGhpcy5nZXRfZGF0YV9ib3VuZHModGhpcy50cmFjay5nZXQoImRhdGFfPQptYW5hZ2VyIiku
Z2V0X2dlbm9tZV93aWRlX2RhdGEodGhpcy5nZW5vbWUpKTt0aGlzLl90cmFuc2l0aW9uX2Nocm9t
X2RhdGEoKX09CixfcmVuZGVyX2RhdGE6ZnVuY3Rpb24ocil7dmFyIHE9M0R0aGlzLHA9M0R0aGlz
LmNocm9tc19sYXlvdXQsbz0zRHRoaXMudHJhYz0KayxzPTNEJC5EZWZlcnJlZCgpOyQud2hlbihv
LmdldCgiZGF0YV9tYW5hZ2VyIikuZ2V0X2dlbm9tZV93aWRlX2RhdGEodGhpcy5nPQplbm9tZSkp
LnRoZW4oZnVuY3Rpb24odSl7cS5kYXRhX2JvdW5kcz0zRHEuZ2V0X2RhdGFfYm91bmRzKHUpO28u
Z2V0KCJjb25maWc9CiIpLnNldF92YWx1ZSgibWluX3ZhbHVlIixxLmRhdGFfYm91bmRzWzBdLHtz
aWxlbnQ6dHJ1ZX0pO28uZ2V0KCJjb25maWciKS5zZT0KdF92YWx1ZSgibWF4X3ZhbHVlIixxLmRh
dGFfYm91bmRzWzFdLHtzaWxlbnQ6dHJ1ZX0pO2xheW91dF9hbmRfZGF0YT0zRGguemlwPQoocCx1
KSxjaHJvbXNfZGF0YV9sYXlvdXQ9M0RoLm1hcChsYXlvdXRfYW5kX2RhdGEsZnVuY3Rpb24odil7
dmFyIHc9M0R2WzBdLHg9Cj0zRHZbMV07cmV0dXJuIHEuX3JlbmRlcl9jaHJvbV9kYXRhKHIsdyx4
KX0pO3ZhciB0PTNEcS5nZXRfZmlsbF9jb2xvcigpO3EucD0KYXJlbnRfZWx0LnNlbGVjdEFsbCgi
cGF0aC5jaHJvbS1kYXRhIikuc3R5bGUoInN0cm9rZSIsdCkuc3R5bGUoImZpbGwiLHQpO3MuPQpy
ZXNvbHZlKHIpfSk7cmV0dXJuIHN9LF9yZW5kZXJfY2hyb21fZGF0YTpmdW5jdGlvbihvLHAscSl7
fSxfZ2V0X3BhdGhfZnVuY3Q9CmlvbjpmdW5jdGlvbihwLG8pe30sX2Nocm9tc19sYXlvdXQ6ZnVu
Y3Rpb24oKXt2YXIgcD0zRHRoaXMuZ2Vub21lLmdldF9jaHJvbT0Kc19pbmZvKCkscj0zRG0ubGF5
b3V0LnBpZSgpLnZhbHVlKGZ1bmN0aW9uKHQpe3JldHVybiB0Lmxlbn0pLnNvcnQobnVsbCkscz0K
PTNEcihwKSxvPTNEMipNYXRoLlBJKnRoaXMudG90YWxfZ2FwL3AubGVuZ3RoLHE9M0RoLm1hcChz
LGZ1bmN0aW9uKHYsdSl7dmFyPQogdD0zRHYuZW5kQW5nbGUtbzt2LmVuZEFuZ2xlPTNEKHQ+di5z
dGFydEFuZ2xlP3Q6di5zdGFydEFuZ2xlKTtyZXR1cm4gdn0pO3I9CmV0dXJuIHF9fSk7dmFyIGI9
M0RsLmV4dGVuZCh7aW5pdGlhbGl6ZTpmdW5jdGlvbihvKXtsLnByb3RvdHlwZS5pbml0aWFsaXpl
Lj0KY2FsbCh0aGlzLG8pO3RoaXMuaW5uZXJSYWRpdXM9M0R0aGlzLnJhZGl1c19ib3VuZHNbMF07
dGhpcy5yYWRpdXNfYm91bmRzWzBdPQo9M0R0aGlzLnJhZGl1c19ib3VuZHNbMV07dGhpcy5iZ19z
dHJva2U9M0QiI2ZmZiI7dGhpcy5iZ19maWxsPTNEIiNmZmYiO3RoaXM9Ci5taW5fYXJjX2xlbj0z
RDAuMDV9LF9yZW5kZXJfZGF0YTpmdW5jdGlvbihxKXt2YXIgcD0zRHRoaXMsbz0zRHEuc2VsZWN0
QWxsKD0KImciKTtvLnNlbGVjdEFsbCgicGF0aCIpLmF0dHIoImlkIixmdW5jdGlvbih1KXtyZXR1
cm4ibGFiZWwtIit1LmRhdGEuY2hyb219PQopO28uYXBwZW5kKCJzdmc6dGV4dCIpLmZpbHRlcihm
dW5jdGlvbih1KXtyZXR1cm4gdS5lbmRBbmdsZS11LnN0YXJ0QW5nbGU+cC49Cm1pbl9hcmNfbGVu
fSkuYXR0cigidGV4dC1hbmNob3IiLCJtaWRkbGUiKS5hcHBlbmQoInN2Zzp0ZXh0UGF0aCIpLmF0
dHIoImNsYT0Kc3MiLCJjaHJvbS1sYWJlbCIpLmF0dHIoInhsaW5rOmhyZWYiLGZ1bmN0aW9uKHUp
e3JldHVybiIjbGFiZWwtIit1LmRhdGEuY2hyPQpvbX0pLmF0dHIoInN0YXJ0T2Zmc2V0IiwiMjUl
IikudGV4dChmdW5jdGlvbih1KXtyZXR1cm4gdS5kYXRhLmNocm9tfSk7dmFyIHI9Cj0zRGZ1bmN0
aW9uKHcpe3ZhciB1PTNEKHcuZW5kQW5nbGUtdy5zdGFydEFuZ2xlKS93LnZhbHVlLHY9M0RtLnJh
bmdlKDAsdy52YT0KbHVlLDI1MDAwMDAwKS5tYXAoZnVuY3Rpb24oeCx5KXtyZXR1cm57cmFkaXVz
OnAuaW5uZXJSYWRpdXMsYW5nbGU6eCp1K3cuc3RhPQpydEFuZ2xlLGxhYmVsOnk9M0Q9M0Q9M0Qw
PzA6KHklMz9udWxsOnAuZm9ybWF0TnVtKHgpKX19KTtpZih2Lmxlbmd0aDw0KXt2W3Y9Ci5sZW5n
dGgtMV0ubGFiZWw9M0RwLmZvcm1hdE51bShNYXRoLnJvdW5kKCh2W3YubGVuZ3RoLTFdLmFuZ2xl
LXcuc3RhcnRBbmdsZT0KKS91KSl9cmV0dXJuIHZ9O3ZhciB0PTNEZnVuY3Rpb24odSl7cmV0dXJu
IHUuYW5nbGU+TWF0aC5QST8icm90YXRlKDE4MCl0cmFuPQpzbGF0ZSgtMTYpIjpudWxsfTt2YXIg
cz0zRGguZmlsdGVyKHRoaXMuY2hyb21zX2xheW91dCxmdW5jdGlvbih1KXtyZXR1cm4gdS49CmVu
ZEFuZ2xlLXUuc3RhcnRBbmdsZT5wLm1pbl9hcmNfbGVufSk7dGhpcy5kcmF3VGlja3ModGhpcy5w
YXJlbnRfZWx0LHMscix0KT0KfX0pO2guZXh0ZW5kKGIucHJvdG90eXBlLGkpO3ZhciBnPTNEbC5l
eHRlbmQoe2luaXRpYWxpemU6ZnVuY3Rpb24obyl7bC5wcm90PQpvdHlwZS5pbml0aWFsaXplLmNh
bGwodGhpcyxvKTt2YXIgcD0zRHRoaXMudHJhY2suZ2V0KCJjb25maWciKTtwLmdldCgibWluX3Y9
CmFsdWUiKS5vbigiY2hhbmdlOnZhbHVlIix0aGlzLl91cGRhdGVfbWluX21heCx0aGlzKTtwLmdl
dCgibWF4X3ZhbHVlIikub24oIj0KY2hhbmdlOnZhbHVlIix0aGlzLl91cGRhdGVfbWluX21heCx0
aGlzKTtwLmdldCgiY29sb3IiKS5vbigiY2hhbmdlOnZhbHVlIix0PQpoaXMuX3RyYW5zaXRpb25f
Y2hyb21fZGF0YSx0aGlzKX0sX3VwZGF0ZV9taW5fbWF4OmZ1bmN0aW9uKCl7dmFyIHA9M0R0aGlz
LnQ9CnJhY2suZ2V0KCJjb25maWciKSxvPTNEW3AuZ2V0X3ZhbHVlKCJtaW5fdmFsdWUiKSxwLmdl
dF92YWx1ZSgibWF4X3ZhbHVlIildOz0KdGhpcy5fdXBkYXRlX2RhdGFfYm91bmRzKG8pO3RoaXMu
cGFyZW50X2VsdC5zZWxlY3RBbGwoIi5taW5fbWF4IikudGV4dChmdW5jPQp0aW9uKHIscSl7cmV0
dXJuIG9bcV19KX0sX3F1YW50aWxlOmZ1bmN0aW9uKHAsbyl7cC5zb3J0KG0uYXNjZW5kaW5nKTty
ZXR1cm49CiBtLnF1YW50aWxlKHAsbyl9LF9yZW5kZXJfY2hyb21fZGF0YTpmdW5jdGlvbihvLHIs
cCl7dmFyIHM9M0R0aGlzLl9nZXRfcGF0aD0KX2Z1bmN0aW9uKHIscCk7aWYoIXMpe3JldHVybiBu
dWxsfXZhciBxPTNEby5kYXR1bShwLmRhdGEpLHQ9M0RxLmFwcGVuZCgicGF0PQpoIikuYXR0cigi
Y2xhc3MiLCJjaHJvbS1kYXRhIikuYXR0cigiY2hyb20iLHIuZGF0YS5jaHJvbSkuYXR0cigiZCIs
cyk7cmV0dXI9Cm4gdH0sX2dldF9wYXRoX2Z1bmN0aW9uOmZ1bmN0aW9uKHIscSl7aWYodHlwZW9m
IHE9M0Q9M0Q9M0Qic3RyaW5nInx8IXEuZGF0YT0KfHxxLmRhdGEubGVuZ3RoPTNEPTNEPTNEMCl7
cmV0dXJuIG51bGx9dmFyIG89M0RtLnNjYWxlLmxpbmVhcigpLmRvbWFpbih0aGlzPQouZGF0YV9i
b3VuZHMpLnJhbmdlKHRoaXMucmFkaXVzX2JvdW5kcykuY2xhbXAodHJ1ZSk7dmFyIHM9M0RtLnNj
YWxlLmxpbmVhcig9CikuZG9tYWluKFswLHEuZGF0YS5sZW5ndGhdKS5yYW5nZShbci5zdGFydEFu
Z2xlLHIuZW5kQW5nbGVdKTt2YXIgcD0zRG0uc3ZnLj0KbGluZS5yYWRpYWwoKS5pbnRlcnBvbGF0
ZSgibGluZWFyIikucmFkaXVzKGZ1bmN0aW9uKHQpe3JldHVybiBvKHRbMV0pfSkuYW5nPQpsZShm
dW5jdGlvbih1LHQpe3JldHVybiBzKHQpfSk7cmV0dXJuIG0uc3ZnLmFyZWEucmFkaWFsKCkuaW50
ZXJwb2xhdGUocC5pbnQ9CmVycG9sYXRlKCkpLmlubmVyUmFkaXVzKG8oMCkpLm91dGVyUmFkaXVz
KHAucmFkaXVzKCkpLmFuZ2xlKHAuYW5nbGUoKSl9LHJlbj0KZGVyX2xhYmVsczpmdW5jdGlvbigp
e3ZhciBvPTNEdGhpcyxxPTNEZnVuY3Rpb24oKXtyZXR1cm4icm90YXRlKDkwKSJ9O3ZhciBwPQo9
M0R0aGlzLmRyYXdUaWNrcyh0aGlzLnBhcmVudF9lbHQsW3RoaXMuY2hyb21zX2xheW91dFswXV0s
dGhpcy5fZGF0YV9ib3VuZHM9Cl90aWNrc19mbigpLHEsdHJ1ZSkuY2xhc3NlZCgibWluX21heCIs
dHJ1ZSk7aC5lYWNoKHAsZnVuY3Rpb24ocil7JChyKS5jbGljaz0KKGZ1bmN0aW9uKCl7dmFyIHM9
M0RuZXcgYy5Db25maWdTZXR0aW5nQ29sbGVjdGlvblZpZXcoe2NvbGxlY3Rpb246by50cmFjay5n
PQpldCgiY29uZmlnIil9KTtzLnJlbmRlcl9pbl9tb2RhbCgiQ29uZmlndXJlIFRyYWNrIil9KX0p
fSxfdHJhbnNpdGlvbl9sYWJlbHM9CjpmdW5jdGlvbigpe2lmKHRoaXMuZGF0YV9ib3VuZHMubGVu
Z3RoPTNEPTNEPTNEMCl7cmV0dXJufXZhciBwPTNEdGhpcyxyPTNEaD0KLmZpbHRlcih0aGlzLmNo
cm9tc19sYXlvdXQsZnVuY3Rpb24ocyl7cmV0dXJuIHMuZW5kQW5nbGUtcy5zdGFydEFuZ2xlPjAu
MDh9PQopLHE9M0RoLmZpbHRlcihyLGZ1bmN0aW9uKHQscyl7cmV0dXJuIHMlMz0zRD0zRD0zRDB9
KSxvPTNEaC5mbGF0dGVuKGgubWFwKHE9CixmdW5jdGlvbihzKXtyZXR1cm4gcC5fZGF0YV9ib3Vu
ZHNfdGlja3NfZm4oKShzKX0pKTt0aGlzLnBhcmVudF9lbHQuc2VsZWN0QT0KbGwoImcudGljayIp
LmRhdGEobykudHJhbnNpdGlvbigpLmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24ocyl7cmV0dXJu
InJvdGF0PQplKCIrKHMuYW5nbGUqMTgwL01hdGguUEktOTApKyIpdHJhbnNsYXRlKCIrcy5yYWRp
dXMrIiwwKSJ9KX0sX2RhdGFfYm91bmRzX3Q9Cmlja3NfZm46ZnVuY3Rpb24oKXt2YXIgbz0zRHRo
aXM7dmlzaWJsZUNocm9tcz0zRDA7cmV0dXJuIGZ1bmN0aW9uKHApe3JldHVybj0KW3tyYWRpdXM6
by5yYWRpdXNfYm91bmRzWzBdLGFuZ2xlOnAuc3RhcnRBbmdsZSxsYWJlbDpvLmZvcm1hdE51bShv
LmRhdGFfYm91PQpuZHNbMF0pfSx7cmFkaXVzOm8ucmFkaXVzX2JvdW5kc1sxXSxhbmdsZTpwLnN0
YXJ0QW5nbGUsbGFiZWw6by5mb3JtYXROdW0oby49CmRhdGFfYm91bmRzWzFdKX1dfX0sZ2V0X2Rh
dGFfYm91bmRzOmZ1bmN0aW9uKG8pe319KTtoLmV4dGVuZChnLnByb3RvdHlwZSxpKT0KO3ZhciBl
PTNEZy5leHRlbmQoe2dldF9kYXRhX2JvdW5kczpmdW5jdGlvbihwKXt2YXIgbz0zRGguZmxhdHRl
bihoLm1hcChwLGZ1PQpuY3Rpb24ocSl7aWYocSl7cmV0dXJuIGgubWFwKHEuZGF0YSxmdW5jdGlv
bihyKXtyZXR1cm4gcGFyc2VJbnQoclsxXSwxMCl8fDA9Cn0pfWVsc2V7cmV0dXJuIDB9fSkpO3Jl
dHVybltoLm1pbihvKSx0aGlzLl9xdWFudGlsZShvLDAuOTgpfHxoLm1heChvKV19fSk7dj0KYXIg
az0zRGwuZXh0ZW5kKHtyZW5kZXI6ZnVuY3Rpb24oKXt2YXIgbz0zRHRoaXM7JC53aGVuKG8udHJh
Y2suZ2V0KCJkYXRhX21hPQpuYWdlciIpLmRhdGFfaXNfcmVhZHkoKSkudGhlbihmdW5jdGlvbigp
eyQud2hlbihvLnRyYWNrLmdldCgiZGF0YV9tYW5hZ2VyIik9Ci5nZXRfZ2Vub21lX3dpZGVfZGF0
YShvLmdlbm9tZSkpLnRoZW4oZnVuY3Rpb24ocil7dmFyIHE9M0RbXSxwPTNEby5nZW5vbWUuZz0K
ZXRfY2hyb21zX2luZm8oKTtoLmVhY2gocixmdW5jdGlvbih2LHUpe3ZhciBzPTNEcFt1XS5jaHJv
bTt2YXIgdD0zRGgubWFwKHYuPQpkYXRhLGZ1bmN0aW9uKHgpe3ZhciB3PTNEby5fZ2V0X3JlZ2lv
bl9hbmdsZShzLHhbMV0pLHk9M0RvLl9nZXRfcmVnaW9uX2FuZ2w9CmUoeFszXSx4WzRdKTtyZXR1
cm57c291cmNlOntzdGFydEFuZ2xlOncsZW5kQW5nbGU6dyswLjAxfSx0YXJnZXQ6e3N0YXJ0QW5n
bD0KZTp5LGVuZEFuZ2xlOnkrMC4wMX19fSk7cT0zRHEuY29uY2F0KHQpfSk7by5wYXJlbnRfZWx0
LmFwcGVuZCgiZyIpLmF0dHIoImNsPQphc3MiLCJjaG9yZCIpLnNlbGVjdEFsbCgicGF0aCIpLmRh
dGEocSkuZW50ZXIoKS5hcHBlbmQoInBhdGgiKS5zdHlsZSgiZmlsbCI9CixvLmdldF9maWxsX2Nv
bG9yKCkpLmF0dHIoImQiLG0uc3ZnLmNob3JkKCkucmFkaXVzKG8ucmFkaXVzX2JvdW5kc1swXSkp
LnN0eT0KbGUoIm9wYWNpdHkiLDEpfSl9KX0sdXBkYXRlX3JhZGl1c19ib3VuZHM6ZnVuY3Rpb24o
byl7dGhpcy5yYWRpdXNfYm91bmRzPTNEPQpvO3RoaXMucGFyZW50X2VsdC5zZWxlY3RBbGwoInBh
dGgiKS50cmFuc2l0aW9uKCkuYXR0cigiZCIsbS5zdmcuY2hvcmQoKS5yYWQ9Cml1cyh0aGlzLnJh
ZGl1c19ib3VuZHNbMF0pKX0sX2dldF9yZWdpb25fYW5nbGU6ZnVuY3Rpb24ocSxvKXt2YXIgcD0z
RGguZmluZD0KKHRoaXMuY2hyb21zX2xheW91dCxmdW5jdGlvbihyKXtyZXR1cm4gci5kYXRhLmNo
cm9tPTNEPTNEPTNEcX0pO3JldHVybiBwLmVuPQpkQW5nbGUtKChwLmVuZEFuZ2xlLXAuc3RhcnRB
bmdsZSkqKHAuZGF0YS5sZW4tbykvcC5kYXRhLmxlbil9fSk7dmFyIGY9M0RCYWM9Cmtib25lLlZp
ZXcuZXh0ZW5kKHtpbml0aWFsaXplOmZ1bmN0aW9uKCl7dmFyIG89M0RuZXcgai5HZW5vbWUoZ2Fs
YXh5X2NvbmZpZz0KLmFwcC5nZW5vbWUpLHA9M0RuZXcgai5HZW5vbWVWaXN1YWxpemF0aW9uKGdh
bGF4eV9jb25maWcuYXBwLnZpel9jb25maWcpO3AuPQpnZXQoImNvbmZpZyIpLmFkZChbe2tleToi
YXJjX2RhdGFzZXRfaGVpZ2h0IixsYWJlbDoiQXJjIERhdGFzZXQgSGVpZ2h0Iix0eXA9CmU6Imlu
dCIsdmFsdWU6MjUsdmlldzoiY2lyY3N0ZXIifSx7a2V5OiJ0cmFja19nYXAiLGxhYmVsOiJHYXAg
QmV0d2VlbiBUcmFjaz0KcyIsdHlwZToiaW50Iix2YWx1ZTo1LHZpZXc6ImNpcmNzdGVyIn0se2tl
eToidG90YWxfZ2FwIixsYWJlbDoiR2FwIFswLTFdIix0PQp5cGU6ImZsb2F0Iix2YWx1ZTowLjQs
dmlldzoiY2lyY3N0ZXIiLGhpZGRlbjp0cnVlfV0pO3ZhciByPTNEbmV3IGEoe2VsOiQoIiM9CmNl
bnRlciAudW5pZmllZC1wYW5lbC1ib2R5IiksZ2Vub21lOm8sbW9kZWw6cH0pO3IucmVuZGVyKCk7
JCgiI2NlbnRlciAudW5pZj0KaWVkLXBhbmVsLWhlYWRlci1pbm5lciIpLmFwcGVuZChnYWxheHlf
Y29uZmlnLmFwcC52aXpfY29uZmlnLnRpdGxlKyIgIitnYWxhPQp4eV9jb25maWcuYXBwLnZpel9j
b25maWcuZGJrZXkpO3ZhciBxPTNEbW9kX2ljb25fYnRuLmNyZWF0ZV9pY29uX2J1dHRvbnNfbWU9
Cm51KFt7aWNvbl9jbGFzczoicGx1cy1idXR0b24iLHRpdGxlOiJBZGQgdHJhY2tzIixvbl9jbGlj
azpmdW5jdGlvbigpe2ouc2VsZT0KY3RfZGF0YXNldHMoZ2FsYXh5X2NvbmZpZy5yb290KyJ2aXN1
YWxpemF0aW9uL2xpc3RfY3VycmVudF9oaXN0b3J5X2RhdGFzZXRzPQoiLGdhbGF4eV9jb25maWcu
cm9vdCsiYXBpL2RhdGFzZXRzIixwLmdldCgiZGJrZXkiKSxmdW5jdGlvbihzKXtwLmFkZF90cmFj
a3M9CihzKX0pfX0se2ljb25fY2xhc3M6ImdlYXIiLHRpdGxlOiJTZXR0aW5ncyIsb25fY2xpY2s6
ZnVuY3Rpb24oKXt2YXIgcz0zRG5ldz0KIGMuQ29uZmlnU2V0dGluZ0NvbGxlY3Rpb25WaWV3KHtj
b2xsZWN0aW9uOnAuZ2V0KCJjb25maWciKX0pO3MucmVuZGVyX2luX21vPQpkYWwoIkNvbmZpZ3Vy
ZSBWaXN1YWxpemF0aW9uIil9fSx7aWNvbl9jbGFzczoiZGlzay0tYXJyb3ciLHRpdGxlOiJTYXZl
Iixvbl89CmNsaWNrOmZ1bmN0aW9uKCl7R2FsYXh5Lm1vZGFsLnNob3coe3RpdGxlOiJTYXZpbmcu
Li4iLGJvZHk6InByb2dyZXNzIn0pOyQuYT0KamF4KHt1cmw6Z2FsYXh5X2NvbmZpZy5yb290KyJ2
aXN1YWxpemF0aW9uL3NhdmUiLHR5cGU6IlBPU1QiLGRhdGFUeXBlOiJqc29uPQoiLGRhdGE6e2lk
OnAuZ2V0KCJ2aXNfaWQiKSx0aXRsZTpwLmdldCgidGl0bGUiKSxkYmtleTpwLmdldCgiZGJrZXki
KSx0eXBlOiI9CnRyYWNrc3RlciIsdmlzX2pzb246SlNPTi5zdHJpbmdpZnkocCl9fSkuc3VjY2Vz
cyhmdW5jdGlvbihzKXtHYWxheHkubW9kYWwuaD0KaWRlKCk7cC5zZXQoInZpc19pZCIscy52aXNf
aWQpfSkuZXJyb3IoZnVuY3Rpb24oKXtHYWxheHkubW9kYWwuc2hvdyh7dGl0bGU6PQoiQ291bGQg
Tm90IFNhdmUiLGJvZHk6IkNvdWxkIG5vdCBzYXZlIHZpc3VhbGl6YXRpb24uIFBsZWFzZSB0cnkg
YWdhaW4gbGF0ZXI9Ci4iLGJ1dHRvbnM6e0NhbmNlbDpmdW5jdGlvbigpe0dhbGF4eS5tb2RhbC5o
aWRlKCl9fX0pfSl9fSx7aWNvbl9jbGFzczoiY3Jvcz0Kcy1jaXJjbGUiLHRpdGxlOiJDbG9zZSIs
b25fY2xpY2s6ZnVuY3Rpb24oKXt3aW5kb3cubG9jYXRpb249M0RnYWxheHlfY29uZmlnPQoucm9v
dCsidmlzdWFsaXphdGlvbi9saXN0In19XSx7dG9vbHRpcF9jb25maWc6e3BsYWNlbWVudDoiYm90
dG9tIn19KTtxLiRlbC49CmF0dHIoInN0eWxlIiwiZmxvYXQ6IHJpZ2h0Iik7JCgiI2NlbnRlciAu
dW5pZmllZC1wYW5lbC1oZWFkZXItaW5uZXIiKS5hcHBlbj0KZChxLiRlbCk7JCgiLm1lbnUtYnV0
dG9uIikudG9vbHRpcCh7cGxhY2VtZW50OiJib3R0b20ifSl9fSk7cmV0dXJue0dhbGF4eUFwPQpw
OmZ9fSk7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorcmVxdWlyZShbInV0aWxzL3V0aWxz
IixdLGZ1bmN0aW9uKGEpe2EuY3NzTG9hZEZpbGUoInN0YXRpYy9zdHlsZS9jaXJjc3Rlci49CmNz
cyIpfSk7ZGVmaW5lKFsibGlicy91bmRlcnNjb3JlIiwibGlicy9kMyIsInZpei92aXN1YWxpemF0
aW9uIiwidXRpbHMvY29uZj0KaWciLCJtdmMvdWkvaWNvbi1idXR0b24iLCJsaWJzL2ZhcmJ0YXN0
aWMiXSxmdW5jdGlvbihpLG4sayxjLGYpe3ZhciBvPTNEQmFjPQprYm9uZS5Nb2RlbC5leHRlbmQo
e2lzX3Zpc2libGU6ZnVuY3Rpb24ocyxwKXt2YXIgcT0zRHMuZ2V0Qm91bmRpbmdDbGllbnRSZWM9
CnQoKSxyPTNEJCgic3ZnIilbMF0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYocS5yaWdodDww
fHxxLmxlZnQ+ci5yaWdodHx8cT0KLmJvdHRvbTwwfHxxLnRvcD5yLmJvdHRvbSl7cmV0dXJuIGZh
bHNlfXJldHVybiB0cnVlfX0pO3ZhciBqPTNEe2RyYXdUaWNrczpmPQp1bmN0aW9uKHQscyx4LHIs
cCl7dmFyIHc9M0R0LmFwcGVuZCgiZyIpLnNlbGVjdEFsbCgiZyIpLmRhdGEocykuZW50ZXIoKS5h
cHA9CmVuZCgiZyIpLnNlbGVjdEFsbCgiZyIpLmRhdGEoeCkuZW50ZXIoKS5hcHBlbmQoImciKS5h
dHRyKCJjbGFzcyIsInRpY2siKS5hdD0KdHIoInRyYW5zZm9ybSIsZnVuY3Rpb24oeSl7cmV0dXJu
InJvdGF0ZSgiKyh5LmFuZ2xlKjE4MC9NYXRoLlBJLTkwKSsiKXRyYW5zPQpsYXRlKCIreS5yYWRp
dXMrIiwwKSJ9KTt2YXIgdj0zRFtdLHU9M0RbXSxxPTNEZnVuY3Rpb24oeSl7cmV0dXJuIHkuYW5n
bGU+TWE9CnRoLlBJPyJlbmQiOm51bGx9O2lmKHApe3Y9M0RbMCwwLDAsLTRdO3U9M0RbNCwwLCIi
LCIuMzVlbSJdO3E9M0RudWxsfWVsc2V7dj0KPTNEWzEsMCw0LDBdO3U9M0RbMCw0LCIuMzVlbSIs
IiJdfXcuYXBwZW5kKCJsaW5lIikuYXR0cigieDEiLHZbMF0pLmF0dHIoInkxPQoiLHZbMV0pLmF0
dHIoIngyIix2WzJdKS5hdHRyKCJ5MSIsdlszXSkuc3R5bGUoInN0cm9rZSIsIiMwMDAiKTtyZXR1
cm4gdy5hcHA9CmVuZCgidGV4dCIpLmF0dHIoIngiLHVbMF0pLmF0dHIoInkiLHVbMV0pLmF0dHIo
ImR4Iix1WzJdKS5hdHRyKCJkeSIsdVszXSkuYT0KdHRyKCJ0ZXh0LWFuY2hvciIscSkuYXR0cigi
dHJhbnNmb3JtIixyKS50ZXh0KGZ1bmN0aW9uKHkpe3JldHVybiB5LmxhYmVsfSl9PQosZm9ybWF0
TnVtOmZ1bmN0aW9uKHEscCl7aWYocD0zRD0zRD0zRHVuZGVmaW5lZCl7cD0zRDJ9aWYocT0zRD0z
RD0zRG51bGwpe3I9CmV0dXJuIG51bGx9dmFyIHM9M0RudWxsO2lmKE1hdGguYWJzKHEpPDEpe3M9
M0RxLnRvUHJlY2lzaW9uKHApfWVsc2V7dmFyIHI9Cj0zRE1hdGgucm91bmQocS50b1ByZWNpc2lv
bihwKSk7cT0zRE1hdGguYWJzKHEpO2lmKHE8MTAwMCl7cz0zRHJ9ZWxzZXtpZihxPD0KMTAwMDAw
MCl7cz0zRE1hdGgucm91bmQoKHIvMTAwMCkudG9QcmVjaXNpb24oMykpLnRvRml4ZWQoMCkrIksi
fWVsc2V7aWYocTwxPQowMDAwMDAwMDApe3M9M0RNYXRoLnJvdW5kKChyLzEwMDAwMDApLnRvUHJl
Y2lzaW9uKDMpKS50b0ZpeGVkKDApKyJNIn19fX1yZXQ9CnVybiBzfX07dmFyIGQ9M0RCYWNrYm9u
ZS5Nb2RlbC5leHRlbmQoe30pO3ZhciBhPTNEQmFja2JvbmUuVmlldy5leHRlbmQoe2NsYT0Kc3NO
YW1lOiJjaXJjc3RlciIsaW5pdGlhbGl6ZTpmdW5jdGlvbihwKXt0aGlzLmdlbm9tZT0zRHAuZ2Vu
b21lO3RoaXMubGFiZWxfPQphcmNfaGVpZ2h0PTNENTA7dGhpcy5zY2FsZT0zRDE7dGhpcy5jaXJj
dWxhcl92aWV3cz0zRG51bGw7dGhpcy5jaG9yZHNfdmlld3M9Cj0zRG51bGw7dGhpcy5tb2RlbC5n
ZXQoImRyYXdhYmxlcyIpLm9uKCJhZGQiLHRoaXMuYWRkX3RyYWNrLHRoaXMpO3RoaXMubW9kZT0K
bC5nZXQoImRyYXdhYmxlcyIpLm9uKCJyZW1vdmUiLHRoaXMucmVtb3ZlX3RyYWNrLHRoaXMpO3Zh
ciBxPTNEdGhpcy5tb2RlbC5nPQpldCgiY29uZmlnIik7cS5nZXQoImFyY19kYXRhc2V0X2hlaWdo
dCIpLm9uKCJjaGFuZ2U6dmFsdWUiLHRoaXMudXBkYXRlX3RyYWM9CmtfYm91bmRzLHRoaXMpO3Eu
Z2V0KCJ0cmFja19nYXAiKS5vbigiY2hhbmdlOnZhbHVlIix0aGlzLnVwZGF0ZV90cmFja19ib3Vu
ZD0Kcyx0aGlzKX0sZ2V0X2NpcmN1bGFyX3RyYWNrczpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1v
ZGVsLmdldCgiZHJhd2FibGVzIikuPQpmaWx0ZXIoZnVuY3Rpb24ocCl7cmV0dXJuIHAuZ2V0KCJ0
cmFja190eXBlIikhPTNEPTNEIkRpYWdvbmFsSGVhdG1hcFRyYWNrIn09Cil9LGdldF9jaG9yZF90
cmFja3M6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tb2RlbC5nZXQoImRyYXdhYmxlcyIpLmZpbHRl
cihmdT0KbmN0aW9uKHApe3JldHVybiBwLmdldCgidHJhY2tfdHlwZSIpPTNEPTNEPTNEIkRpYWdv
bmFsSGVhdG1hcFRyYWNrIn0pfSxnZXRfPQp0cmFja3NfYm91bmRzOmZ1bmN0aW9uKCl7dmFyIHI9
M0R0aGlzLmdldF9jaXJjdWxhcl90cmFja3MoKSx0PTNEdGhpcy5tb2RlbC49CmdldCgiY29uZmln
IikuZ2V0X3ZhbHVlKCJhcmNfZGF0YXNldF9oZWlnaHQiKSxzPTNEdGhpcy5tb2RlbC5nZXQoImNv
bmZpZyIpLj0KZ2V0X3ZhbHVlKCJ0cmFja19nYXAiKSxwPTNETWF0aC5taW4odGhpcy4kZWwud2lk
dGgoKSx0aGlzLiRlbC5oZWlnaHQoKSktMjAsPQp2PTNEcC8yLXIubGVuZ3RoKih0K3MpK3MtdGhp
cy5sYWJlbF9hcmNfaGVpZ2h0LHU9M0RuLnJhbmdlKHYscC8yLHQrcyk7dmFyIHE9Cj0zRHRoaXM7
cmV0dXJuIGkubWFwKHUsZnVuY3Rpb24odyl7cmV0dXJuW3csdyt0XX0pfSxyZW5kZXI6ZnVuY3Rp
b24oKXt2YXIgeT0KPTNEdGhpcyxwPTNEeS4kZWwud2lkdGgoKSx4PTNEeS4kZWwuaGVpZ2h0KCks
dT0zRHRoaXMuZ2V0X2NpcmN1bGFyX3RyYWNrcygpPQoscz0zRHRoaXMuZ2V0X2Nob3JkX3RyYWNr
cygpLHI9M0R5Lm1vZGVsLmdldCgiY29uZmlnIikuZ2V0X3ZhbHVlKCJ0b3RhbF9nYXA9CiIpLHQ9
M0R0aGlzLmdldF90cmFja3NfYm91bmRzKCkscT0zRG4uc2VsZWN0KHkuJGVsWzBdKS5hcHBlbmQo
InN2ZyIpLmF0dHIoIj0Kd2lkdGgiLHApLmF0dHIoImhlaWdodCIseCkuYXR0cigicG9pbnRlci1l
dmVudHMiLCJhbGwiKS5hcHBlbmQoInN2ZzpnIikuY2FsPQpsKG4uYmVoYXZpb3Iuem9vbSgpLm9u
KCJ6b29tIixmdW5jdGlvbigpe3ZhciB6PTNEbi5ldmVudC5zY2FsZTtxLmF0dHIoInRyYW49CnNm
b3JtIiwidHJhbnNsYXRlKCIrbi5ldmVudC50cmFuc2xhdGUrIikgc2NhbGUoIit6KyIpIik7aWYo
eS5zY2FsZSE9M0Q9M0R6KT0Ke2lmKHkuem9vbV9kcmFnX3RpbWVvdXQpe2NsZWFyVGltZW91dCh5
Lnpvb21fZHJhZ190aW1lb3V0KX15Lnpvb21fZHJhZ190aW1lPQpvdXQ9M0RzZXRUaW1lb3V0KGZ1
bmN0aW9uKCl7fSw0MDApfX0pKS5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIitwLzIrIiw9
CiIreC8yKyIpIikuYXBwZW5kKCJzdmc6ZyIpLmF0dHIoImNsYXNzIiwidHJhY2tzIik7dGhpcy5j
aXJjdWxhcl92aWV3cz0zRHUubT0KYXAoZnVuY3Rpb24oQSxCKXt2YXIgej0zRG5ldyBlKHtlbDpx
LmFwcGVuZCgiZyIpWzBdLHRyYWNrOkEscmFkaXVzX2JvdW5kczp0PQpbQl0sZ2Vub21lOnkuZ2Vu
b21lLHRvdGFsX2dhcDpyfSk7ei5yZW5kZXIoKTtyZXR1cm4gen0pO3RoaXMuY2hvcmRzX3ZpZXdz
PQo9M0RzLm1hcChmdW5jdGlvbihBKXt2YXIgej0zRG5ldyBsKHtlbDpxLmFwcGVuZCgiZyIpWzBd
LHRyYWNrOkEscmFkaXVzX2JvdW49CmRzOnRbMF0sZ2Vub21lOnkuZ2Vub21lLHRvdGFsX2dhcDpy
fSk7ei5yZW5kZXIoKTtyZXR1cm4gen0pO3ZhciB3PTNEdGhpcy5jaT0KcmN1bGFyX3ZpZXdzW3Ro
aXMuY2lyY3VsYXJfdmlld3MubGVuZ3RoLTFdLnJhZGl1c19ib3VuZHNbMV0sdj0zRFt3LHcrdGhp
cy5sPQphYmVsX2FyY19oZWlnaHRdO3RoaXMubGFiZWxfdHJhY2tfdmlldz0zRG5ldyBiKHtlbDpx
LmFwcGVuZCgiZyIpWzBdLHRyYWNrOm49CmV3IGQoKSxyYWRpdXNfYm91bmRzOnYsZ2Vub21lOnku
Z2Vub21lLHRvdGFsX2dhcDpyfSk7dGhpcy5sYWJlbF90cmFja192aWV3Lj0KcmVuZGVyKCl9LGFk
ZF90cmFjazpmdW5jdGlvbih2KXt2YXIgcT0zRHRoaXMubW9kZWwuZ2V0KCJjb25maWciKS5nZXRf
dmFsdWUoPQoidG90YWxfZ2FwIik7aWYodi5nZXQoInRyYWNrX3R5cGUiKT0zRD0zRD0zRCJEaWFn
b25hbEhlYXRtYXBUcmFjayIpe3ZhciByPQo9M0R0aGlzLmNpcmN1bGFyX3ZpZXdzWzBdLnJhZGl1
c19ib3VuZHMsdT0zRG5ldyBsKHtlbDpuLnNlbGVjdCgiZy50cmFja3MiKS49CmFwcGVuZCgiZyIp
WzBdLHRyYWNrOnYscmFkaXVzX2JvdW5kczpyLGdlbm9tZTp0aGlzLmdlbm9tZSx0b3RhbF9nYXA6
cX0pO3Uucj0KZW5kZXIoKTt0aGlzLmNob3Jkc192aWV3cy5wdXNoKHUpfWVsc2V7dmFyIHQ9M0R0
aGlzLmdldF90cmFja3NfYm91bmRzKCk7aS5lPQphY2godGhpcy5jaXJjdWxhcl92aWV3cyxmdW5j
dGlvbih3LHgpe3cudXBkYXRlX3JhZGl1c19ib3VuZHModFt4XSl9KTtpLmVhY2g9Cih0aGlzLmNo
b3Jkc192aWV3cyxmdW5jdGlvbih3KXt3LnVwZGF0ZV9yYWRpdXNfYm91bmRzKHRbMF0pfSk7dmFy
IHM9M0R0aGlzLj0KY2lyY3VsYXJfdmlld3MubGVuZ3RoLHA9M0RuZXcgZSh7ZWw6bi5zZWxlY3Qo
ImcudHJhY2tzIikuYXBwZW5kKCJnIilbMF0sdHJhPQpjazp2LHJhZGl1c19ib3VuZHM6dFtzXSxn
ZW5vbWU6dGhpcy5nZW5vbWUsdG90YWxfZ2FwOnF9KTtwLnJlbmRlcigpO3RoaXMuY2k9CnJjdWxh
cl92aWV3cy5wdXNoKHApfX0scmVtb3ZlX3RyYWNrOmZ1bmN0aW9uKHEscyxyKXt2YXIgcD0zRHRo
aXMuY2lyY3VsYXJfdj0KaWV3c1tyLmluZGV4XTt0aGlzLmNpcmN1bGFyX3ZpZXdzLnNwbGljZShy
LmluZGV4LDEpO3AuJGVsLnJlbW92ZSgpO3ZhciB0PTNEPQp0aGlzLmdldF90cmFja3NfYm91bmRz
KCk7aS5lYWNoKHRoaXMuY2lyY3VsYXJfdmlld3MsZnVuY3Rpb24odSx2KXt1LnVwZGF0ZV89CnJh
ZGl1c19ib3VuZHModFt2XSl9KX0sdXBkYXRlX3RyYWNrX2JvdW5kczpmdW5jdGlvbigpe3ZhciBw
PTNEdGhpcy5nZXRfdHJhYz0Ka3NfYm91bmRzKCk7aS5lYWNoKHRoaXMuY2lyY3VsYXJfdmlld3Ms
ZnVuY3Rpb24ocSxyKXtxLnVwZGF0ZV9yYWRpdXNfYm91bmRzPQoocFtyXSl9KTtpLmVhY2godGhp
cy5jaG9yZHNfdmlld3MsZnVuY3Rpb24ocSl7cS51cGRhdGVfcmFkaXVzX2JvdW5kcyhwWzBdKX09
Cil9fSk7dmFyIG09M0RCYWNrYm9uZS5WaWV3LmV4dGVuZCh7dGFnTmFtZToiZyIsaW5pdGlhbGl6
ZTpmdW5jdGlvbihwKXt0aGlzLj0KYmdfc3Ryb2tlPTNEIiNkZGQiO3RoaXMubG9hZGluZ19iZ19m
aWxsPTNEIiNmZmMiO3RoaXMuYmdfZmlsbD0zRCIjZGRkIjt0aGlzPQoudG90YWxfZ2FwPTNEcC50
b3RhbF9nYXA7dGhpcy50cmFjaz0zRHAudHJhY2s7dGhpcy5yYWRpdXNfYm91bmRzPTNEcC5yYWRp
dXM9Cl9ib3VuZHM7dGhpcy5nZW5vbWU9M0RwLmdlbm9tZTt0aGlzLmNocm9tc19sYXlvdXQ9M0R0
aGlzLl9jaHJvbXNfbGF5b3V0KCk7dD0KaGlzLmRhdGFfYm91bmRzPTNEW107dGhpcy5zY2FsZT0z
RDE7dGhpcy5wYXJlbnRfZWx0PTNEbi5zZWxlY3QodGhpcy4kZWxbMF0pPQp9LGdldF9maWxsX2Nv
bG9yOmZ1bmN0aW9uKCl7dmFyIHA9M0R0aGlzLnRyYWNrLmdldCgiY29uZmlnIikuZ2V0X3ZhbHVl
KCJibG89CmNrX2NvbG9yIik7aWYoIXApe3A9M0R0aGlzLnRyYWNrLmdldCgiY29uZmlnIikuZ2V0
X3ZhbHVlKCJjb2xvciIpfXJldHVybiBwfT0KLHJlbmRlcjpmdW5jdGlvbigpe3ZhciB0PTNEdGhp
cy5wYXJlbnRfZWx0O3ZhciBzPTNEdGhpcy5jaHJvbXNfbGF5b3V0LHY9M0RuPQouc3ZnLmFyYygp
LmlubmVyUmFkaXVzKHRoaXMucmFkaXVzX2JvdW5kc1swXSkub3V0ZXJSYWRpdXModGhpcy5yYWRp
dXNfYm91bmQ9CnNbMV0pLHA9M0R0LnNlbGVjdEFsbCgiZyIpLmRhdGEocykuZW50ZXIoKS5hcHBl
bmQoInN2ZzpnIikscj0zRHAuYXBwZW5kKCJwYT0KdGgiKS5hdHRyKCJkIix2KS5hdHRyKCJjbGFz
cyIsImNocm9tLWJhY2tncm91bmQiKS5zdHlsZSgic3Ryb2tlIix0aGlzLmJnX3N0PQpyb2tlKS5z
dHlsZSgiZmlsbCIsdGhpcy5sb2FkaW5nX2JnX2ZpbGwpO3IuYXBwZW5kKCJ0aXRsZSIpLnRleHQo
ZnVuY3Rpb24oeCk9CntyZXR1cm4geC5kYXRhLmNocm9tfSk7dmFyIHE9M0R0aGlzLHU9M0RxLnRy
YWNrLmdldCgiZGF0YV9tYW5hZ2VyIiksdz0zRCh1Pz0KdS5kYXRhX2lzX3JlYWR5KCk6dHJ1ZSk7
JC53aGVuKHcpLnRoZW4oZnVuY3Rpb24oKXskLndoZW4ocS5fcmVuZGVyX2RhdGEodCkpPQoudGhl
bihmdW5jdGlvbigpe3Iuc3R5bGUoImZpbGwiLHEuYmdfZmlsbCk7cS5yZW5kZXJfbGFiZWxzKCl9
KX0pfSxyZW5kZXJfbGE9CmJlbHM6ZnVuY3Rpb24oKXt9LHVwZGF0ZV9yYWRpdXNfYm91bmRzOmZ1
bmN0aW9uKHEpe3RoaXMucmFkaXVzX2JvdW5kcz0zRHE7dj0KYXIgcD0zRG4uc3ZnLmFyYygpLmlu
bmVyUmFkaXVzKHRoaXMucmFkaXVzX2JvdW5kc1swXSkub3V0ZXJSYWRpdXModGhpcy5yYWRpPQp1
c19ib3VuZHNbMV0pO3RoaXMucGFyZW50X2VsdC5zZWxlY3RBbGwoImc+cGF0aC5jaHJvbS1iYWNr
Z3JvdW5kIikudHJhbnNpdGk9Cm9uKCkuZHVyYXRpb24oMTAwMCkuYXR0cigiZCIscCk7dGhpcy5f
dHJhbnNpdGlvbl9jaHJvbV9kYXRhKCk7dGhpcy5fdHJhbnNpdD0KaW9uX2xhYmVscygpfSx1cGRh
dGVfc2NhbGU6ZnVuY3Rpb24ocyl7dmFyIHI9M0R0aGlzLnNjYWxlO3RoaXMuc2NhbGU9M0RzO2lm
PQooczw9M0RyKXtyZXR1cm59dmFyIHE9M0R0aGlzLHA9M0RuZXcgbygpO3RoaXMucGFyZW50X2Vs
dC5zZWxlY3RBbGwoInBhdGguY2g9CnJvbS1kYXRhIikuZmlsdGVyKGZ1bmN0aW9uKHUsdCl7cmV0
dXJuIHAuaXNfdmlzaWJsZSh0aGlzKX0pLmVhY2goZnVuY3Rpb24oej0KLHYpe3ZhciB5PTNEbi5z
ZWxlY3QodGhpcyksdT0zRHkuYXR0cigiY2hyb20iKSx4PTNEcS5nZW5vbWUuZ2V0X2Nocm9tX3Jl
Z2lvPQpuKHUpLHc9M0RxLnRyYWNrLmdldCgiZGF0YV9tYW5hZ2VyIiksdDtpZighdy5jYW5fZ2V0
X21vcmVfZGV0YWlsZWRfZGF0YSh4KSk9CntyZXR1cm59dD0zRHEudHJhY2suZ2V0KCJkYXRhX21h
bmFnZXIiKS5nZXRfbW9yZV9kZXRhaWxlZF9kYXRhKHgsIkNvdmVyYWdlIj0KLDAscyk7JC53aGVu
KHQpLnRoZW4oZnVuY3Rpb24oQyl7eS5yZW1vdmUoKTtxLl91cGRhdGVfZGF0YV9ib3VuZHMoKTt2
YXIgQj0KPTNEaS5maW5kKHEuY2hyb21zX2xheW91dCxmdW5jdGlvbihEKXtyZXR1cm4gRC5kYXRh
LmNocm9tPTNEPTNEPTNEdX0pO3ZhciBBPQo9M0RxLmdldF9maWxsX2NvbG9yKCk7cS5fcmVuZGVy
X2Nocm9tX2RhdGEocS5wYXJlbnRfZWx0LEIsQykuc3R5bGUoInN0cm9rZSI9CixBKS5zdHlsZSgi
ZmlsbCIsQSl9KX0pO3JldHVybiBxfSxfdHJhbnNpdGlvbl9jaHJvbV9kYXRhOmZ1bmN0aW9uKCl7
dmFyIHE9Cj0zRHRoaXMudHJhY2sscz0zRHRoaXMuY2hyb21zX2xheW91dCxwPTNEdGhpcy5wYXJl
bnRfZWx0LnNlbGVjdEFsbCgiZz5wYXRoLj0KY2hyb20tZGF0YSIpLHQ9M0RwWzBdLmxlbmd0aDtp
Zih0PjApe3ZhciByPTNEdGhpczskLndoZW4ocS5nZXQoImRhdGFfbWFuYWdlPQpyIikuZ2V0X2dl
bm9tZV93aWRlX2RhdGEodGhpcy5nZW5vbWUpKS50aGVuKGZ1bmN0aW9uKHcpe3ZhciB2PTNEaS5y
ZWplY3QoaS49Cm1hcCh3LGZ1bmN0aW9uKHgseSl7dmFyIHo9M0RudWxsLEE9M0RyLl9nZXRfcGF0
aF9mdW5jdGlvbihzW3ldLHgpO2lmKEEpe3o9Cj0zREEoeC5kYXRhKX1yZXR1cm4gen0pLGZ1bmN0
aW9uKHgpe3JldHVybiB4PTNEPTNEPTNEbnVsbH0pO3ZhciB1PTNEcS5nZXQoIj0KY29uZmlnIiku
Z2V0X3ZhbHVlKCJjb2xvciIpO3AuZWFjaChmdW5jdGlvbih5LHgpe24uc2VsZWN0KHRoaXMpLnRy
YW5zaXRpb24oPQopLmR1cmF0aW9uKDEwMDApLnN0eWxlKCJzdHJva2UiLHUpLnN0eWxlKCJmaWxs
Iix1KS5hdHRyKCJkIix2W3hdKX0pfSl9fSxfdHI9CmFuc2l0aW9uX2xhYmVsczpmdW5jdGlvbigp
e30sX3VwZGF0ZV9kYXRhX2JvdW5kczpmdW5jdGlvbihxKXt2YXIgcD0zRHRoaXMuZD0KYXRhX2Jv
dW5kczt0aGlzLmRhdGFfYm91bmRzPTNEcXx8dGhpcy5nZXRfZGF0YV9ib3VuZHModGhpcy50cmFj
ay5nZXQoImRhdGFfPQptYW5hZ2VyIikuZ2V0X2dlbm9tZV93aWRlX2RhdGEodGhpcy5nZW5vbWUp
KTt0aGlzLl90cmFuc2l0aW9uX2Nocm9tX2RhdGEoKX09CixfcmVuZGVyX2RhdGE6ZnVuY3Rpb24o
cyl7dmFyIHI9M0R0aGlzLHE9M0R0aGlzLmNocm9tc19sYXlvdXQscD0zRHRoaXMudHJhYz0Kayx0
PTNEJC5EZWZlcnJlZCgpOyQud2hlbihwLmdldCgiZGF0YV9tYW5hZ2VyIikuZ2V0X2dlbm9tZV93
aWRlX2RhdGEodGhpcy5nPQplbm9tZSkpLnRoZW4oZnVuY3Rpb24odil7ci5kYXRhX2JvdW5kcz0z
RHIuZ2V0X2RhdGFfYm91bmRzKHYpO3AuZ2V0KCJjb25maWc9CiIpLnNldF92YWx1ZSgibWluX3Zh
bHVlIixyLmRhdGFfYm91bmRzWzBdLHtzaWxlbnQ6dHJ1ZX0pO3AuZ2V0KCJjb25maWciKS5zZT0K
dF92YWx1ZSgibWF4X3ZhbHVlIixyLmRhdGFfYm91bmRzWzFdLHtzaWxlbnQ6dHJ1ZX0pO2xheW91
dF9hbmRfZGF0YT0zRGkuemlwPQoocSx2KSxjaHJvbXNfZGF0YV9sYXlvdXQ9M0RpLm1hcChsYXlv
dXRfYW5kX2RhdGEsZnVuY3Rpb24odyl7dmFyIHg9M0R3WzBdLHk9Cj0zRHdbMV07cmV0dXJuIHIu
X3JlbmRlcl9jaHJvbV9kYXRhKHMseCx5KX0pO3ZhciB1PTNEci5nZXRfZmlsbF9jb2xvcigpO3Iu
cD0KYXJlbnRfZWx0LnNlbGVjdEFsbCgicGF0aC5jaHJvbS1kYXRhIikuc3R5bGUoInN0cm9rZSIs
dSkuc3R5bGUoImZpbGwiLHUpO3QuPQpyZXNvbHZlKHMpfSk7cmV0dXJuIHR9LF9yZW5kZXJfY2hy
b21fZGF0YTpmdW5jdGlvbihwLHEscil7fSxfZ2V0X3BhdGhfZnVuY3Q9CmlvbjpmdW5jdGlvbihx
LHApe30sX2Nocm9tc19sYXlvdXQ6ZnVuY3Rpb24oKXt2YXIgcT0zRHRoaXMuZ2Vub21lLmdldF9j
aHJvbT0Kc19pbmZvKCkscz0zRG4ubGF5b3V0LnBpZSgpLnZhbHVlKGZ1bmN0aW9uKHUpe3JldHVy
biB1Lmxlbn0pLnNvcnQobnVsbCksdD0KPTNEcyhxKSxwPTNEMipNYXRoLlBJKnRoaXMudG90YWxf
Z2FwL3EubGVuZ3RoLHI9M0RpLm1hcCh0LGZ1bmN0aW9uKHcsdil7dmFyPQogdT0zRHcuZW5kQW5n
bGUtcDt3LmVuZEFuZ2xlPTNEKHU+dy5zdGFydEFuZ2xlP3U6dy5zdGFydEFuZ2xlKTtyZXR1cm4g
d30pO3I9CmV0dXJuIHJ9fSk7dmFyIGI9M0RtLmV4dGVuZCh7aW5pdGlhbGl6ZTpmdW5jdGlvbihw
KXttLnByb3RvdHlwZS5pbml0aWFsaXplLj0KY2FsbCh0aGlzLHApO3RoaXMuaW5uZXJSYWRpdXM9
M0R0aGlzLnJhZGl1c19ib3VuZHNbMF07dGhpcy5yYWRpdXNfYm91bmRzWzBdPQo9M0R0aGlzLnJh
ZGl1c19ib3VuZHNbMV07dGhpcy5iZ19zdHJva2U9M0QiI2ZmZiI7dGhpcy5iZ19maWxsPTNEIiNm
ZmYiO3RoaXM9Ci5taW5fYXJjX2xlbj0zRDAuMDV9LF9yZW5kZXJfZGF0YTpmdW5jdGlvbihyKXt2
YXIgcT0zRHRoaXMscD0zRHIuc2VsZWN0QWxsKD0KImciKTtwLnNlbGVjdEFsbCgicGF0aCIpLmF0
dHIoImlkIixmdW5jdGlvbih2KXtyZXR1cm4ibGFiZWwtIit2LmRhdGEuY2hyb219PQopO3AuYXBw
ZW5kKCJzdmc6dGV4dCIpLmZpbHRlcihmdW5jdGlvbih2KXtyZXR1cm4gdi5lbmRBbmdsZS12LnN0
YXJ0QW5nbGU+cS49Cm1pbl9hcmNfbGVufSkuYXR0cigidGV4dC1hbmNob3IiLCJtaWRkbGUiKS5h
cHBlbmQoInN2Zzp0ZXh0UGF0aCIpLmF0dHIoImNsYT0Kc3MiLCJjaHJvbS1sYWJlbCIpLmF0dHIo
InhsaW5rOmhyZWYiLGZ1bmN0aW9uKHYpe3JldHVybiIjbGFiZWwtIit2LmRhdGEuY2hyPQpvbX0p
LmF0dHIoInN0YXJ0T2Zmc2V0IiwiMjUlIikudGV4dChmdW5jdGlvbih2KXtyZXR1cm4gdi5kYXRh
LmNocm9tfSk7dmFyIHM9Cj0zRGZ1bmN0aW9uKHgpe3ZhciB2PTNEKHguZW5kQW5nbGUteC5zdGFy
dEFuZ2xlKS94LnZhbHVlLHc9M0RuLnJhbmdlKDAseC52YT0KbHVlLDI1MDAwMDAwKS5tYXAoZnVu
Y3Rpb24oeSx6KXtyZXR1cm57cmFkaXVzOnEuaW5uZXJSYWRpdXMsYW5nbGU6eSp2K3guc3RhPQpy
dEFuZ2xlLGxhYmVsOno9M0Q9M0Q9M0QwPzA6KHolMz9udWxsOnEuZm9ybWF0TnVtKHkpKX19KTtp
Zih3Lmxlbmd0aDw0KXt3W3c9Ci5sZW5ndGgtMV0ubGFiZWw9M0RxLmZvcm1hdE51bShNYXRoLnJv
dW5kKCh3W3cubGVuZ3RoLTFdLmFuZ2xlLXguc3RhcnRBbmdsZT0KKS92KSl9cmV0dXJuIHd9O3Zh
ciB1PTNEZnVuY3Rpb24odil7cmV0dXJuIHYuYW5nbGU+TWF0aC5QST8icm90YXRlKDE4MCl0cmFu
PQpzbGF0ZSgtMTYpIjpudWxsfTt2YXIgdD0zRGkuZmlsdGVyKHRoaXMuY2hyb21zX2xheW91dCxm
dW5jdGlvbih2KXtyZXR1cm4gdi49CmVuZEFuZ2xlLXYuc3RhcnRBbmdsZT5xLm1pbl9hcmNfbGVu
fSk7dGhpcy5kcmF3VGlja3ModGhpcy5wYXJlbnRfZWx0LHQscyx1KT0KfX0pO2kuZXh0ZW5kKGIu
cHJvdG90eXBlLGopO3ZhciBoPTNEbS5leHRlbmQoe2luaXRpYWxpemU6ZnVuY3Rpb24ocCl7bS5w
cm90PQpvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcyxwKTt2YXIgcT0zRHRoaXMudHJhY2suZ2V0
KCJjb25maWciKTtxLmdldCgibWluX3Y9CmFsdWUiKS5vbigiY2hhbmdlOnZhbHVlIix0aGlzLl91
cGRhdGVfbWluX21heCx0aGlzKTtxLmdldCgibWF4X3ZhbHVlIikub24oIj0KY2hhbmdlOnZhbHVl
Iix0aGlzLl91cGRhdGVfbWluX21heCx0aGlzKTtxLmdldCgiY29sb3IiKS5vbigiY2hhbmdlOnZh
bHVlIix0PQpoaXMuX3RyYW5zaXRpb25fY2hyb21fZGF0YSx0aGlzKX0sX3VwZGF0ZV9taW5fbWF4
OmZ1bmN0aW9uKCl7dmFyIHE9M0R0aGlzLnQ9CnJhY2suZ2V0KCJjb25maWciKSxwPTNEW3EuZ2V0
X3ZhbHVlKCJtaW5fdmFsdWUiKSxxLmdldF92YWx1ZSgibWF4X3ZhbHVlIildOz0KdGhpcy5fdXBk
YXRlX2RhdGFfYm91bmRzKHApO3RoaXMucGFyZW50X2VsdC5zZWxlY3RBbGwoIi5taW5fbWF4Iiku
dGV4dChmdW5jPQp0aW9uKHMscil7cmV0dXJuIHBbcl19KX0sX3F1YW50aWxlOmZ1bmN0aW9uKHEs
cCl7cS5zb3J0KG4uYXNjZW5kaW5nKTtyZXR1cm49CiBuLnF1YW50aWxlKHEscCl9LF9yZW5kZXJf
Y2hyb21fZGF0YTpmdW5jdGlvbihwLHMscSl7dmFyIHQ9M0R0aGlzLl9nZXRfcGF0aD0KX2Z1bmN0
aW9uKHMscSk7aWYoIXQpe3JldHVybiBudWxsfXZhciByPTNEcC5kYXR1bShxLmRhdGEpLHU9M0Ry
LmFwcGVuZCgicGF0PQpoIikuYXR0cigiY2xhc3MiLCJjaHJvbS1kYXRhIikuYXR0cigiY2hyb20i
LHMuZGF0YS5jaHJvbSkuYXR0cigiZCIsdCk7cmV0dXI9Cm4gdX0sX2dldF9wYXRoX2Z1bmN0aW9u
OmZ1bmN0aW9uKHMscil7aWYodHlwZW9mIHI9M0Q9M0Q9M0Qic3RyaW5nInx8IXIuZGF0YT0KfHxy
LmRhdGEubGVuZ3RoPTNEPTNEPTNEMCl7cmV0dXJuIG51bGx9dmFyIHA9M0RuLnNjYWxlLmxpbmVh
cigpLmRvbWFpbih0aGlzPQouZGF0YV9ib3VuZHMpLnJhbmdlKHRoaXMucmFkaXVzX2JvdW5kcyku
Y2xhbXAodHJ1ZSk7dmFyIHQ9M0RuLnNjYWxlLmxpbmVhcig9CikuZG9tYWluKFswLHIuZGF0YS5s
ZW5ndGhdKS5yYW5nZShbcy5zdGFydEFuZ2xlLHMuZW5kQW5nbGVdKTt2YXIgcT0zRG4uc3ZnLj0K
bGluZS5yYWRpYWwoKS5pbnRlcnBvbGF0ZSgibGluZWFyIikucmFkaXVzKGZ1bmN0aW9uKHUpe3Jl
dHVybiBwKHVbMV0pfSkuYW5nPQpsZShmdW5jdGlvbih2LHUpe3JldHVybiB0KHUpfSk7cmV0dXJu
IG4uc3ZnLmFyZWEucmFkaWFsKCkuaW50ZXJwb2xhdGUocS5pbnQ9CmVycG9sYXRlKCkpLmlubmVy
UmFkaXVzKHAoMCkpLm91dGVyUmFkaXVzKHEucmFkaXVzKCkpLmFuZ2xlKHEuYW5nbGUoKSl9LHJl
bj0KZGVyX2xhYmVsczpmdW5jdGlvbigpe3ZhciBwPTNEdGhpcyxyPTNEZnVuY3Rpb24oKXtyZXR1
cm4icm90YXRlKDkwKSJ9O3ZhciBxPQo9M0R0aGlzLmRyYXdUaWNrcyh0aGlzLnBhcmVudF9lbHQs
W3RoaXMuY2hyb21zX2xheW91dFswXV0sdGhpcy5fZGF0YV9ib3VuZHM9Cl90aWNrc19mbigpLHIs
dHJ1ZSkuY2xhc3NlZCgibWluX21heCIsdHJ1ZSk7aS5lYWNoKHEsZnVuY3Rpb24ocyl7JChzKS5j
bGljaz0KKGZ1bmN0aW9uKCl7dmFyIHQ9M0RuZXcgYy5Db25maWdTZXR0aW5nQ29sbGVjdGlvblZp
ZXcoe2NvbGxlY3Rpb246cC50cmFjay5nPQpldCgiY29uZmlnIil9KTt0LnJlbmRlcl9pbl9tb2Rh
bCgiQ29uZmlndXJlIFRyYWNrIil9KX0pfSxfdHJhbnNpdGlvbl9sYWJlbHM9CjpmdW5jdGlvbigp
e2lmKHRoaXMuZGF0YV9ib3VuZHMubGVuZ3RoPTNEPTNEPTNEMCl7cmV0dXJufXZhciBxPTNEdGhp
cyxzPTNEaT0KLmZpbHRlcih0aGlzLmNocm9tc19sYXlvdXQsZnVuY3Rpb24odCl7cmV0dXJuIHQu
ZW5kQW5nbGUtdC5zdGFydEFuZ2xlPjAuMDh9PQopLHI9M0RpLmZpbHRlcihzLGZ1bmN0aW9uKHUs
dCl7cmV0dXJuIHQlMz0zRD0zRD0zRDB9KSxwPTNEaS5mbGF0dGVuKGkubWFwKHI9CixmdW5jdGlv
bih0KXtyZXR1cm4gcS5fZGF0YV9ib3VuZHNfdGlja3NfZm4oKSh0KX0pKTt0aGlzLnBhcmVudF9l
bHQuc2VsZWN0QT0KbGwoImcudGljayIpLmRhdGEocCkudHJhbnNpdGlvbigpLmF0dHIoInRyYW5z
Zm9ybSIsZnVuY3Rpb24odCl7cmV0dXJuInJvdGF0PQplKCIrKHQuYW5nbGUqMTgwL01hdGguUEkt
OTApKyIpdHJhbnNsYXRlKCIrdC5yYWRpdXMrIiwwKSJ9KX0sX2RhdGFfYm91bmRzX3Q9Cmlja3Nf
Zm46ZnVuY3Rpb24oKXt2YXIgcD0zRHRoaXM7dmlzaWJsZUNocm9tcz0zRDA7cmV0dXJuIGZ1bmN0
aW9uKHEpe3JldHVybj0KW3tyYWRpdXM6cC5yYWRpdXNfYm91bmRzWzBdLGFuZ2xlOnEuc3RhcnRB
bmdsZSxsYWJlbDpwLmZvcm1hdE51bShwLmRhdGFfYm91PQpuZHNbMF0pfSx7cmFkaXVzOnAucmFk
aXVzX2JvdW5kc1sxXSxhbmdsZTpxLnN0YXJ0QW5nbGUsbGFiZWw6cC5mb3JtYXROdW0ocC49CmRh
dGFfYm91bmRzWzFdKX1dfX0sZ2V0X2RhdGFfYm91bmRzOmZ1bmN0aW9uKHApe319KTtpLmV4dGVu
ZChoLnByb3RvdHlwZSxqKT0KO3ZhciBlPTNEaC5leHRlbmQoe2dldF9kYXRhX2JvdW5kczpmdW5j
dGlvbihxKXt2YXIgcD0zRGkuZmxhdHRlbihpLm1hcChxLGZ1PQpuY3Rpb24ocil7aWYocil7cmV0
dXJuIGkubWFwKHIuZGF0YSxmdW5jdGlvbihzKXtyZXR1cm4gcGFyc2VJbnQoc1sxXSwxMCl8fDA9
Cn0pfWVsc2V7cmV0dXJuIDB9fSkpO3JldHVybltpLm1pbihwKSx0aGlzLl9xdWFudGlsZShwLDAu
OTgpfHxpLm1heChwKV19fSk7dj0KYXIgbD0zRG0uZXh0ZW5kKHtyZW5kZXI6ZnVuY3Rpb24oKXt2
YXIgcD0zRHRoaXM7JC53aGVuKHAudHJhY2suZ2V0KCJkYXRhX21hPQpuYWdlciIpLmRhdGFfaXNf
cmVhZHkoKSkudGhlbihmdW5jdGlvbigpeyQud2hlbihwLnRyYWNrLmdldCgiZGF0YV9tYW5hZ2Vy
Iik9Ci5nZXRfZ2Vub21lX3dpZGVfZGF0YShwLmdlbm9tZSkpLnRoZW4oZnVuY3Rpb24ocyl7dmFy
IHI9M0RbXSxxPTNEcC5nZW5vbWUuZz0KZXRfY2hyb21zX2luZm8oKTtpLmVhY2gocyxmdW5jdGlv
bih3LHYpe3ZhciB0PTNEcVt2XS5jaHJvbTt2YXIgdT0zRGkubWFwKHcuPQpkYXRhLGZ1bmN0aW9u
KHkpe3ZhciB4PTNEcC5fZ2V0X3JlZ2lvbl9hbmdsZSh0LHlbMV0pLHo9M0RwLl9nZXRfcmVnaW9u
X2FuZ2w9CmUoeVszXSx5WzRdKTtyZXR1cm57c291cmNlOntzdGFydEFuZ2xlOngsZW5kQW5nbGU6
eCswLjAxfSx0YXJnZXQ6e3N0YXJ0QW5nbD0KZTp6LGVuZEFuZ2xlOnorMC4wMX19fSk7cj0zRHIu
Y29uY2F0KHUpfSk7cC5wYXJlbnRfZWx0LmFwcGVuZCgiZyIpLmF0dHIoImNsPQphc3MiLCJjaG9y
ZCIpLnNlbGVjdEFsbCgicGF0aCIpLmRhdGEocikuZW50ZXIoKS5hcHBlbmQoInBhdGgiKS5zdHls
ZSgiZmlsbCI9CixwLmdldF9maWxsX2NvbG9yKCkpLmF0dHIoImQiLG4uc3ZnLmNob3JkKCkucmFk
aXVzKHAucmFkaXVzX2JvdW5kc1swXSkpLnN0eT0KbGUoIm9wYWNpdHkiLDEpfSl9KX0sdXBkYXRl
X3JhZGl1c19ib3VuZHM6ZnVuY3Rpb24ocCl7dGhpcy5yYWRpdXNfYm91bmRzPTNEPQpwO3RoaXMu
cGFyZW50X2VsdC5zZWxlY3RBbGwoInBhdGgiKS50cmFuc2l0aW9uKCkuYXR0cigiZCIsbi5zdmcu
Y2hvcmQoKS5yYWQ9Cml1cyh0aGlzLnJhZGl1c19ib3VuZHNbMF0pKX0sX2dldF9yZWdpb25fYW5n
bGU6ZnVuY3Rpb24ocixwKXt2YXIgcT0zRGkuZmluZD0KKHRoaXMuY2hyb21zX2xheW91dCxmdW5j
dGlvbihzKXtyZXR1cm4gcy5kYXRhLmNocm9tPTNEPTNEPTNEcn0pO3JldHVybiBxLmVuPQpkQW5n
bGUtKChxLmVuZEFuZ2xlLXEuc3RhcnRBbmdsZSkqKHEuZGF0YS5sZW4tcCkvcS5kYXRhLmxlbil9
fSk7dmFyIGc9M0RCYWM9Cmtib25lLlZpZXcuZXh0ZW5kKHtpbml0aWFsaXplOmZ1bmN0aW9uKCl7
dmFyIHA9M0RuZXcgay5HZW5vbWUoZ2FsYXh5X2NvbmZpZz0KLmFwcC5nZW5vbWUpLHE9M0RuZXcg
ay5HZW5vbWVWaXN1YWxpemF0aW9uKGdhbGF4eV9jb25maWcuYXBwLnZpel9jb25maWcpO3EuPQpn
ZXQoImNvbmZpZyIpLmFkZChbe2tleToiYXJjX2RhdGFzZXRfaGVpZ2h0IixsYWJlbDoiQXJjIERh
dGFzZXQgSGVpZ2h0Iix0eXA9CmU6ImludCIsdmFsdWU6MjUsdmlldzoiY2lyY3N0ZXIifSx7a2V5
OiJ0cmFja19nYXAiLGxhYmVsOiJHYXAgQmV0d2VlbiBUcmFjaz0KcyIsdHlwZToiaW50Iix2YWx1
ZTo1LHZpZXc6ImNpcmNzdGVyIn0se2tleToidG90YWxfZ2FwIixsYWJlbDoiR2FwIFswLTFdIix0
PQp5cGU6ImZsb2F0Iix2YWx1ZTowLjQsdmlldzoiY2lyY3N0ZXIiLGhpZGRlbjp0cnVlfV0pO3Zh
ciBzPTNEbmV3IGEoe2VsOiQoIiM9CmNlbnRlciAudW5pZmllZC1wYW5lbC1ib2R5IiksZ2Vub21l
OnAsbW9kZWw6cX0pO3MucmVuZGVyKCk7JCgiI2NlbnRlciAudW5pZj0KaWVkLXBhbmVsLWhlYWRl
ci1pbm5lciIpLmFwcGVuZChnYWxheHlfY29uZmlnLmFwcC52aXpfY29uZmlnLnRpdGxlKyIgIitn
YWxhPQp4eV9jb25maWcuYXBwLnZpel9jb25maWcuZGJrZXkpO3ZhciByPTNEZi5jcmVhdGVfaWNv
bl9idXR0b25zX21lbnUoW3tpY29uX2M9Cmxhc3M6InBsdXMtYnV0dG9uIix0aXRsZToiQWRkIHRy
YWNrcyIsb25fY2xpY2s6ZnVuY3Rpb24oKXtrLnNlbGVjdF9kYXRhc2V0cz0KKGdhbGF4eV9jb25m
aWcucm9vdCsidmlzdWFsaXphdGlvbi9saXN0X2N1cnJlbnRfaGlzdG9yeV9kYXRhc2V0cyIsZ2Fs
YXh5X2NvPQpuZmlnLnJvb3QrImFwaS9kYXRhc2V0cyIscS5nZXQoImRia2V5IiksZnVuY3Rpb24o
dCl7cS5hZGRfdHJhY2tzKHQpfSl9fSx7aWM9Cm9uX2NsYXNzOiJnZWFyIix0aXRsZToiU2V0dGlu
Z3MiLG9uX2NsaWNrOmZ1bmN0aW9uKCl7dmFyIHQ9M0RuZXcgYy5Db25maWdTZT0KdHRpbmdDb2xs
ZWN0aW9uVmlldyh7Y29sbGVjdGlvbjpxLmdldCgiY29uZmlnIil9KTt0LnJlbmRlcl9pbl9tb2Rh
bCgiQ29uZmlnPQp1cmUgVmlzdWFsaXphdGlvbiIpfX0se2ljb25fY2xhc3M6ImRpc2stLWFycm93
Iix0aXRsZToiU2F2ZSIsb25fY2xpY2s6ZnVuY3Q9Cmlvbigpe0dhbGF4eS5tb2RhbC5zaG93KHt0
aXRsZToiU2F2aW5nLi4uIixib2R5OiJwcm9ncmVzcyJ9KTskLmFqYXgoe3VybDpnYT0KbGF4eV9j
b25maWcucm9vdCsidmlzdWFsaXphdGlvbi9zYXZlIix0eXBlOiJQT1NUIixkYXRhVHlwZToianNv
biIsZGF0YTp7aWQ6PQpxLmdldCgidmlzX2lkIiksdGl0bGU6cS5nZXQoInRpdGxlIiksZGJrZXk6
cS5nZXQoImRia2V5IiksdHlwZToidHJhY2tzdGVyIiw9CnZpc19qc29uOkpTT04uc3RyaW5naWZ5
KHEpfX0pLnN1Y2Nlc3MoZnVuY3Rpb24odCl7R2FsYXh5Lm1vZGFsLmhpZGUoKTtxLnNldD0KKCJ2
aXNfaWQiLHQudmlzX2lkKX0pLmVycm9yKGZ1bmN0aW9uKCl7R2FsYXh5Lm1vZGFsLnNob3coe3Rp
dGxlOiJDb3VsZCBOb3QgPQpTYXZlIixib2R5OiJDb3VsZCBub3Qgc2F2ZSB2aXN1YWxpemF0aW9u
LiBQbGVhc2UgdHJ5IGFnYWluIGxhdGVyLiIsYnV0dG9uczo9CntDYW5jZWw6ZnVuY3Rpb24oKXtH
YWxheHkubW9kYWwuaGlkZSgpfX19KX0pfX0se2ljb25fY2xhc3M6ImNyb3NzLWNpcmNsZSIsdD0K
aXRsZToiQ2xvc2UiLG9uX2NsaWNrOmZ1bmN0aW9uKCl7d2luZG93LmxvY2F0aW9uPTNEZ2FsYXh5
X2NvbmZpZy5yb290KyJ2aXN1PQphbGl6YXRpb24vbGlzdCJ9fV0se3Rvb2x0aXBfY29uZmlnOntw
bGFjZW1lbnQ6ImJvdHRvbSJ9fSk7ci4kZWwuYXR0cigic3R5bGU9CiIsImZsb2F0OiByaWdodCIp
OyQoIiNjZW50ZXIgLnVuaWZpZWQtcGFuZWwtaGVhZGVyLWlubmVyIikuYXBwZW5kKHIuJGVsKTsk
KD0KIi5tZW51LWJ1dHRvbiIpLnRvb2x0aXAoe3BsYWNlbWVudDoiYm90dG9tIn0pfX0pO3JldHVy
bntHYWxheHlBcHA6Z319KTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCgpkaWZmIC1yIDVk
ZDY1NDlhYWMzYTI5YjE1NjJmZDNlNTMwNmMxYzY5ZWYwMDQ3YTcgLXIgNjViMjMzMGI4MjNjNzYx
MTM2OWI5N2I9CjA4MjkyYTZjODY0ZGVlMTFjIHN0YXRpYy9zY3JpcHRzL3Zpei9jaXJjc3Rlci5q
cwotLS0gYS9zdGF0aWMvc2NyaXB0cy92aXovY2lyY3N0ZXIuanMKKysrIGIvc3RhdGljL3Njcmlw
dHMvdml6L2NpcmNzdGVyLmpzCkBAIC0xLDE2ICsxLDIwIEBACiAvLyBsb2FkIHJlcXVpcmVkIGxp
YnJhcmllcwotcmVxdWlyZSgKLVsKK3JlcXVpcmUoWwogICAgICd1dGlscy91dGlscycsCi0gICAg
J212Yy91aS9pY29uLWJ1dHRvbicsCi0gICAgJ2xpYnMvZmFyYnRhc3RpYycsCi1dLCBmdW5jdGlv
bihtb2RfdXRpbHMsIG1vZF9pY29uX2J0bikKK10sIGZ1bmN0aW9uKG1vZF91dGlscykKIHsKICAg
ICAvLyBsb2FkIGNzcwogICAgIG1vZF91dGlscy5jc3NMb2FkRmlsZSgic3RhdGljL3N0eWxlL2Np
cmNzdGVyLmNzcyIpOwogfSk7Cj0yMAotZGVmaW5lKFsibGlicy91bmRlcnNjb3JlIiwgImxpYnMv
ZDMiLCAidml6L3Zpc3VhbGl6YXRpb24iLCAidXRpbHMvY29uZmlnIl09CiwgZnVuY3Rpb24oXywg
ZDMsIHZpc3VhbGl6YXRpb24sIGNvbmZpZykgeworZGVmaW5lKFsKKyAgICAibGlicy91bmRlcnNj
b3JlIiwKKyAgICAibGlicy9kMyIsCisgICAgInZpei92aXN1YWxpemF0aW9uIiwKKyAgICAidXRp
bHMvY29uZmlnIiwKKyAgICAnbXZjL3VpL2ljb24tYnV0dG9uJywKKyAgICAnbGlicy9mYXJidGFz
dGljJworXSwgZnVuY3Rpb24oXywgZDMsIHZpc3VhbGl6YXRpb24sIGNvbmZpZywgbW9kX2ljb25f
YnRuKSB7Cj0yMAogLyoqCiAgKiBVdGlsaXR5IGNsYXNzIGZvciB3b3JraW5nIHdpdGggU1ZHLgpA
QCAtNzEsNyArNzUsNyBAQAogICAgICAgICBlbHNlIHsKICAgICAgICAgICAgIHRpY2tfY29vcmRz
ID0zRCBbMSwgMCwgNCwgMF07CiAgICAgICAgICAgICB0ZXh0X2Nvb3JkcyA9M0QgWzAsIDQsICIu
MzVlbSIsICIiXTsKLSAgICAgICAgICAgPTIwCisKICAgICAgICAgfQo9MjAKICAgICAgICAgdGlj
a3MuYXBwZW5kKCJsaW5lIikKQEAgLTgwLDcgKzg0LDcgQEAKICAgICAgICAgICAgICAuYXR0cigi
eDIiLCB0aWNrX2Nvb3Jkc1syXSkKICAgICAgICAgICAgICAuYXR0cigieTEiLCB0aWNrX2Nvb3Jk
c1szXSkKICAgICAgICAgICAgICAuc3R5bGUoInN0cm9rZSIsICIjMDAwIik7Ci0gICAgICAgPTIw
CisKICAgICAgICAgcmV0dXJuIHRpY2tzLmFwcGVuZCgidGV4dCIpCiAgICAgICAgICAgICAgICAg
ICAgIC5hdHRyKCJ4IiwgdGV4dF9jb29yZHNbMF0pCiAgICAgICAgICAgICAgICAgICAgIC5hdHRy
KCJ5IiwgdGV4dF9jb29yZHNbMV0pCkBAIC05OCwxMSArMTAyLDExIEBACiAgICAgICAgIC8vIFVz
ZSBkZWZhdWx0IG9mIDIgc2lnLiBkaWdpdHMuCiAgICAgICAgIGlmIChzaWdEaWdpdHMgPTNEPTNE
PTNEIHVuZGVmaW5lZCkKICAgICAgICAgICAgIHNpZ0RpZ2l0cyA9M0QgMjsKLSAgICAgID0yMAor
CiAgICAgICAgIC8vIFZlcmlmeSBpbnB1dCBudW1iZXIKICAgICAgICAgaWYgKG51bSA9M0Q9M0Q9
M0QgbnVsbCkKICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgPTIwCisKICAgICAgICAg
Ly8gQ2FsY3VsYXRlIHJldHVybiB2YWx1ZQogICAgICAgICB2YXIgcnZhbCA9M0QgbnVsbDsKICAg
ICAgICAgaWYgKE1hdGguYWJzKG51bSkgPCAxKSB7CkBAIC0xNDEsNyArMTQ1LDcgQEAKICAqLwog
dmFyIENpcmNzdGVyVmlldyA9M0QgQmFja2JvbmUuVmlldy5leHRlbmQoewogICAgIGNsYXNzTmFt
ZTogJ2NpcmNzdGVyJywKLSAgID0yMAorCiAgICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24ob3B0aW9u
cykgewogICAgICAgICB0aGlzLmdlbm9tZSA9M0Qgb3B0aW9ucy5nZW5vbWU7CiAgICAgICAgIHRo
aXMubGFiZWxfYXJjX2hlaWdodCA9M0QgNTA7CkBAIC0xODgsNyArMTkyLDcgQEAKICAgICAgICAg
ICAgIHRyYWNrX2dhcCA9M0QgdGhpcy5tb2RlbC5nZXQoJ2NvbmZpZycpLmdldF92YWx1ZSgndHJh
Y2tfZ2FwJyksCiAgICAgICAgICAgICAvLyBTdWJ0cmFjdCAyMCB0byBtYWtlIHN1cmUgY2hyb20g
bGFiZWxzIGFyZSBvbiBzY3JlZW4uCiAgICAgICAgICAgICBtaW5fZGltZW5zaW9uID0zRCBNYXRo
Lm1pbih0aGlzLiRlbC53aWR0aCgpLCB0aGlzLiRlbC5oZWlnaHQoKT0KKSAtIDIwLAotICAgICAg
ICAgICAgLy8gQ29tcHV0ZSByYWRpdXMgc3RhcnQgYmFzZWQgb24gbW9kZWwsIHdpbGwgYmUgY2Vu
dGVyZWQ9MjAKKyAgICAgICAgICAgIC8vIENvbXB1dGUgcmFkaXVzIHN0YXJ0IGJhc2VkIG9uIG1v
ZGVsLCB3aWxsIGJlIGNlbnRlcmVkCiAgICAgICAgICAgICAvLyBhbmQgZml0IGVudGlyZWx5IGlu
c2lkZSBlbGVtZW50IGJ5IGRlZmF1bHQuCiAgICAgICAgICAgICByYWRpdXNfc3RhcnQgPTNEIG1p
bl9kaW1lbnNpb24gLyAyIC0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaXJjdWxhcl90
cmFja3MubGVuZ3RoICogKGRhdGFzZXRfYXJjX2hlaWdodCArPQogdHJhY2tfZ2FwKSArCkBAIC0x
OTgsMTQgKzIwMiwxNCBAQAo9MjAKICAgICAgICAgICAgIC8vIENvbXB1dGUgcmFuZ2Ugb2YgdHJh
Y2sgc3RhcnRpbmcgcmFkaWkuCiAgICAgICAgICAgICB0cmFja3Nfc3RhcnRfcmFkaWkgPTNEIGQz
LnJhbmdlKHJhZGl1c19zdGFydCwgbWluX2RpbWVuc2lvbiAvID0KMiwgZGF0YXNldF9hcmNfaGVp
Z2h0ICsgdHJhY2tfZ2FwKTsKLSAgICAgICAgICAgPTIwCisKICAgICAgICAgLy8gTWFwIGZyb20g
dHJhY2sgc3RhcnQgdG8gYm91bmRzLgogICAgICAgICB2YXIgc2VsZiA9M0QgdGhpczsKICAgICAg
ICAgcmV0dXJuIF8ubWFwKHRyYWNrc19zdGFydF9yYWRpaSwgZnVuY3Rpb24ocmFkaXVzKSB7CiAg
ICAgICAgICAgICByZXR1cm4gW3JhZGl1cywgcmFkaXVzICsgZGF0YXNldF9hcmNfaGVpZ2h0XTsK
ICAgICAgICAgfSk7CiAgICAgfSwKLSAgID0yMAorCiAgICAgLyoqCiAgICAgICogUmVuZGVycyBj
aXJjdWxhciB0cmFja3MsIGNob3JkIHRyYWNrcywgYW5kIGxhYmVsIHRyYWNrcy4KICAgICAgKi8K
QEAgLTI1NCw3ICsyNTgsNyBAQAogICAgICAgICAgICAgICAgIH0pKQogICAgICAgICAgICAgICAg
IC5hdHRyKCJ0cmFuc2Zvcm0iLCAidHJhbnNsYXRlKCIgKyB3aWR0aCAvIDIgKyAiLCIgKyBoZWln
aHQ9CiAvIDIgKyAiKSIpCiAgICAgICAgICAgICAgIC5hcHBlbmQoJ3N2ZzpnJykuYXR0cignY2xh
c3MnLCAndHJhY2tzJyk7Ci0gICAgICAgICAgICAgICA9MjAKKwogICAgICAgICAvLyAtLSBSZW5k
ZXIgY2lyY3VsYXIgdHJhY2tzLiAtLQo9MjAKICAgICAgICAgLy8gQ3JlYXRlIGEgdmlldyBmb3Ig
ZWFjaCB0cmFjayBpbiB0aGUgdmlzdWFsaXphdGlvbiBhbmQgcmVuZGVyLgpAQCAtMjY2LDEyICsy
NzAsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgZ2Vub21lOiBzZWxmLmdlbm9tZSwKICAgICAg
ICAgICAgICAgICAgICAgdG90YWxfZ2FwOiB0b3RhbF9nYXAKICAgICAgICAgICAgICAgICB9KTsK
LSAgICAgICAgICAgPTIwCisKICAgICAgICAgICAgIHZpZXcucmVuZGVyKCk7Ci0gICAgICAgICAg
ID0yMAorCiAgICAgICAgICAgICByZXR1cm4gdmlldzsKICAgICAgICAgfSk7Ci0gICAgICAgPTIw
CisKICAgICAgICAgLy8gLS0gUmVuZGVyIGNob3JkcyB0cmFja3MuIC0tCj0yMAogICAgICAgICB0
aGlzLmNob3Jkc192aWV3cyA9M0QgY2hvcmRzX3RyYWNrcy5tYXAoZnVuY3Rpb24odHJhY2spIHsK
QEAgLTI4OSwxMCArMjkzLDEwIEBACiAgICAgICAgIH0pOwo9MjAKICAgICAgICAgLy8gLS0gUmVu
ZGVyIGxhYmVsIHRyYWNrLiAtLQotICAgICAgID0yMAorCiAgICAgICAgIC8vIFRyYWNrIGJvdW5k
cyBhcmU6CiAgICAgICAgIC8vIChhKSBvdXRlciByYWRpdXMgb2YgbGFzdCBjaXJjdWxhciB0cmFj
azsKLSAgICAgICAgLy8gKGIpPTIwCisgICAgICAgIC8vIChiKQogICAgICAgICB2YXIgb3V0ZXJt
b3N0X3JhZGl1cyA9M0QgdGhpcy5jaXJjdWxhcl92aWV3c1t0aGlzLmNpcmN1bGFyX3ZpZXdzLmw9
CmVuZ3RoLTFdLnJhZGl1c19ib3VuZHNbMV0sCiAgICAgICAgICAgICB0cmFja19ib3VuZHMgPTNE
IFsKICAgICAgICAgICAgICAgICBvdXRlcm1vc3RfcmFkaXVzLApAQCAtMzA1LDcgKzMwOSw3IEBA
CiAgICAgICAgICAgICBnZW5vbWU6IHNlbGYuZ2Vub21lLAogICAgICAgICAgICAgdG90YWxfZ2Fw
OiB0b3RhbF9nYXAKICAgICAgICAgfSk7Ci0gICAgICAgPTIwCisKICAgICAgICAgdGhpcy5sYWJl
bF90cmFja192aWV3LnJlbmRlcigpOwogICAgIH0sCj0yMApAQCAtMzU2LDcgKzM2MCw3IEBACj0y
MAogICAgICAgICAgICAgLy8gVXBkYXRlIGxhYmVsIHRyYWNrLgogICAgICAgICAgICAgLyoKLSAg
ICAgICAgICAgIEZJWE1FOiBzaG91bGQgbmV2ZXIgaGF2ZSB0byB1cGRhdGUgbGFiZWwgdHJhY2sg
YmVjYXVzZSB2aXMgYWx3PQpheXMgZXhwYW5kcyB0byBmaXQgYXJlYT0yMAorICAgICAgICAgICAg
RklYTUU6IHNob3VsZCBuZXZlciBoYXZlIHRvIHVwZGF0ZSBsYWJlbCB0cmFjayBiZWNhdXNlIHZp
cyBhbHc9CmF5cyBleHBhbmRzIHRvIGZpdCBhcmVhCiAgICAgICAgICAgICB3aXRoaW4gbGFiZWwg
dHJhY2suCiAgICAgICAgICAgICB2YXIgdHJhY2tfYm91bmRzID0zRCBuZXdfdHJhY2tfYm91bmRz
WyBuZXdfdHJhY2tfYm91bmRzLmxlbmd0aD0KLTEgXTsKICAgICAgICAgICAgIHRyYWNrX2JvdW5k
c1sxXSA9M0QgdHJhY2tfYm91bmRzWzBdOwpAQCAtMzczLDcgKzM3Nyw3IEBACiAgICAgICAgIHZh
ciB0cmFja192aWV3ID0zRCB0aGlzLmNpcmN1bGFyX3ZpZXdzW29wdGlvbnMuaW5kZXhdOwogICAg
ICAgICB0aGlzLmNpcmN1bGFyX3ZpZXdzLnNwbGljZShvcHRpb25zLmluZGV4LCAxKTsKICAgICAg
ICAgdHJhY2tfdmlldy4kZWwucmVtb3ZlKCk7Ci0gICAgICAgPTIwCisKICAgICAgICAgLy8gUmVj
b21wdXRlIGFuZCB1cGRhdGUgdHJhY2sgYm91bmRzLgogICAgICAgICB2YXIgbmV3X3RyYWNrX2Jv
dW5kcyA9M0QgdGhpcy5nZXRfdHJhY2tzX2JvdW5kcygpOwogICAgICAgICBfLmVhY2godGhpcy5j
aXJjdWxhcl92aWV3cywgZnVuY3Rpb24odHJhY2tfdmlldywgaSkgewpAQCAtMzkyLDcgKzM5Niw3
IEBACiAgICAgICAgIF8uZWFjaCh0aGlzLmNob3Jkc192aWV3cywgZnVuY3Rpb24odHJhY2tfdmll
dykgewogICAgICAgICAgICAgdHJhY2tfdmlldy51cGRhdGVfcmFkaXVzX2JvdW5kcyhuZXdfdHJh
Y2tfYm91bmRzWzBdKTsKICAgICAgICAgfSk7Ci0gICAgICAgPTIwCisKICAgICB9CiB9KTsKPTIw
CkBAIC00NTUsNyArNDU5LDcgQEAKPTIwCiAgICAgICAgICAgICAvLyBBcHBlbmQgdGl0bGVzIHRv
IHBhdGhzLgogICAgICAgICAgICAgY2hyb21zX3BhdGhzLmFwcGVuZCgidGl0bGUiKS50ZXh0KGZ1
bmN0aW9uKGQpIHsgcmV0dXJuIGQuZGF0YS49CmNocm9tOyB9KTsKLSAgICAgICAgICAgPTIwCisK
ICAgICAgICAgLy8gLS0gUmVuZGVyIHRyYWNrIGRhdGEgYW5kLCB3aGVuIHRyYWNrIGRhdGEgaXMg
cmVuZGVyZWQsIGFwcGx5IHByPQplZmVyZW5jZXMgYW5kIHVwZGF0ZSBjaHJvbV9lbHRzIGZpbGwu
IC0tCj0yMAogICAgICAgICB2YXIgc2VsZiA9M0QgdGhpcywKQEAgLTQ5MCw3ICs0OTQsNyBAQAog
ICAgICAgICB2YXIgbmV3X2QgPTNEIGQzLnN2Zy5hcmMoKQogICAgICAgICAgICAgICAgICAgICAg
ICAgLmlubmVyUmFkaXVzKHRoaXMucmFkaXVzX2JvdW5kc1swXSkKICAgICAgICAgICAgICAgICAg
ICAgICAgIC5vdXRlclJhZGl1cyh0aGlzLnJhZGl1c19ib3VuZHNbMV0pOwotICAgICAgID0yMAor
CiAgICAgICAgIHRoaXMucGFyZW50X2VsdC5zZWxlY3RBbGwoJ2c+cGF0aC5jaHJvbS1iYWNrZ3Jv
dW5kJykudHJhbnNpdGlvbigpLj0KZHVyYXRpb24oMTAwMCkuYXR0cignZCcsIG5ld19kKTsKPTIw
CiAgICAgICAgIHRoaXMuX3RyYW5zaXRpb25fY2hyb21fZGF0YSgpOwpAQCAtNTExLDcgKzUxNSw3
IEBACiAgICAgICAgIH0KPTIwCiAgICAgICAgIC8vIC0tIFNjYWxlIGluY3JlYXNlZCwgc28gcmVu
ZGVyIHZpc2libGUgZGF0YSB3aXRoIG1vcmUgZGV0YWlsLiAtLQotICAgICAgID0yMAorCiAgICAg
ICAgIHZhciBzZWxmID0zRCB0aGlzLAogICAgICAgICAgICAgdXRpbHMgPTNEIG5ldyBTVkdVdGls
cygpOwo9MjAKQEAgLTUzOSw3ICs1NDMsNyBAQAogICAgICAgICAgICAgJC53aGVuKGRhdGFfZGVm
ZXJyZWQpLnRoZW4oZnVuY3Rpb24oZGF0YSkgewogICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBj
dXJyZW50IGRhdGEgcGF0aC4KICAgICAgICAgICAgICAgICBwYXRoX2VsdC5yZW1vdmUoKTsKLSAg
ICAgICAgICAgICAgID0yMAorCiAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIGRhdGEgYm91bmRz
IHdpdGggbmV3IGRhdGEuCiAgICAgICAgICAgICAgICAgc2VsZi5fdXBkYXRlX2RhdGFfYm91bmRz
KCk7Cj0yMApAQCAtNTk4LDEyICs2MDIsMTIgQEAKICAgICBfdHJhbnNpdGlvbl9sYWJlbHM6IGZ1
bmN0aW9uKCkge30sCj0yMAogICAgIC8qKgotICAgICAqIFVwZGF0ZSBkYXRhIGJvdW5kcy4gSWYg
dGhlcmUgYXJlIG5ld19ib3VuZHMsIHVzZSB0aGVtOyBvdGhlcndpc2UgdXM9CmU9MjAKKyAgICAg
KiBVcGRhdGUgZGF0YSBib3VuZHMuIElmIHRoZXJlIGFyZSBuZXdfYm91bmRzLCB1c2UgdGhlbTsg
b3RoZXJ3aXNlIHVzZQogICAgICAqIGRlZmF1bHQgZGF0YSBib3VuZHMuCiAgICAgICovCiAgICAg
X3VwZGF0ZV9kYXRhX2JvdW5kczogZnVuY3Rpb24obmV3X2JvdW5kcykgewogICAgICAgICB2YXIg
b2xkX2JvdW5kcyA9M0QgdGhpcy5kYXRhX2JvdW5kczsKLSAgICAgICAgdGhpcy5kYXRhX2JvdW5k
cyA9M0QgbmV3X2JvdW5kcyB8fD0yMAorICAgICAgICB0aGlzLmRhdGFfYm91bmRzID0zRCBuZXdf
Ym91bmRzIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldF9kYXRhX2JvdW5k
cyh0aGlzLnRyYWNrLmdldCgnZGF0YV9tYW5hZz0KZXInKS5nZXRfZ2Vub21lX3dpZGVfZGF0YSh0
aGlzLmdlbm9tZSkpOwogICAgICAgICB0aGlzLl90cmFuc2l0aW9uX2Nocm9tX2RhdGEoKTsKICAg
ICB9LApAQCAtNjI0LDcgKzYyOCw3IEBACj0yMAogICAgICAgICAgICAgLy8gU2V0IG1pbiwgbWF4
IHZhbHVlIGluIGNvbmZpZyBzbyB0aGF0IHRoZXkgY2FuIGJlIGFkanVzdGVkLiA9Ck1ha2UgdGhp
cyBzaWxlbnQKICAgICAgICAgICAgIC8vIGJlY2F1c2UgdGhlc2UgYXR0cmlidXRlcyBhcmUgd2F0
Y2hlZCBmb3IgY2hhbmdlcyBhbmQgdGhlIHZpPQp6IGlzIHVwZGF0ZWQKLSAgICAgICAgICAgIC8v
IGFjY29yZGluZ2x5IChzZXQgdXAgaW4gaW5pdGlhbGl6ZSkuIEJlY2F1c2Ugd2UgYXJlIHNldHRp
bmcgPQp1cCwgd2UgZG9uJ3Qgd2FudD0yMAorICAgICAgICAgICAgLy8gYWNjb3JkaW5nbHkgKHNl
dCB1cCBpbiBpbml0aWFsaXplKS4gQmVjYXVzZSB3ZSBhcmUgc2V0dGluZyA9CnVwLCB3ZSBkb24n
dCB3YW50CiAgICAgICAgICAgICAvLyB0aGUgd2F0Y2ggdG8gdHJpZ2dlciBldmVudHMgaGVyZS4K
ICAgICAgICAgICAgIHRyYWNrLmdldCgnY29uZmlnJykuc2V0X3ZhbHVlKCdtaW5fdmFsdWUnLCBz
ZWxmLmRhdGFfYm91bmRzWzBdPQosIHtzaWxlbnQ6IHRydWV9KTsKICAgICAgICAgICAgIHRyYWNr
LmdldCgnY29uZmlnJykuc2V0X3ZhbHVlKCdtYXhfdmFsdWUnLCBzZWxmLmRhdGFfYm91bmRzWzFd
PQosIHtzaWxlbnQ6IHRydWV9KTsKQEAgLTY2MCw3ICs2NjQsNyBAQAogICAgIF9nZXRfcGF0aF9m
dW5jdGlvbjogZnVuY3Rpb24oY2hyb21fYXJjLCBjaHJvbV9kYXRhKSB7fSwKPTIwCiAgICAgLyoq
Ci0gICAgICogUmV0dXJucyBhcmMgbGF5b3V0cyBmb3IgZ2Vub21lJ3MgY2hyb21vc29tZXMvY29u
dGlncy4gQXJjcyBhcmUgYXJyYT0KbmdlZCBpbiBhIGNpcmNsZT0yMAorICAgICAqIFJldHVybnMg
YXJjIGxheW91dHMgZm9yIGdlbm9tZSdzIGNocm9tb3NvbWVzL2NvbnRpZ3MuIEFyY3MgYXJlIGFy
cmE9Cm5nZWQgaW4gYSBjaXJjbGUKICAgICAgKiBzZXBhcmF0ZWQgYnkgZ2Fwcy4KICAgICAgKi8K
ICAgICBfY2hyb21zX2xheW91dDogZnVuY3Rpb24oKSB7CkBAIC03MDAsMTQgKzcwNCwxNCBAQAog
ICAgICAqIFJlbmRlciBsYWJlbHMuCiAgICAgICovCiAgICAgX3JlbmRlcl9kYXRhOiBmdW5jdGlv
bihzdmcpIHsKLSAgICAgICAgLy8gLS0gQWRkIGNocm9tb3NvbWUgbGFiZWwgd2hlcmUgaXQgd2ls
bCBmaXQ7IGFuIGFsdGVybmF0aXZlIGxhYmVsPQppbmcgbWVjaGFuaXNtPTIwCisgICAgICAgIC8v
IC0tIEFkZCBjaHJvbW9zb21lIGxhYmVsIHdoZXJlIGl0IHdpbGwgZml0OyBhbiBhbHRlcm5hdGl2
ZSBsYWJlbD0KaW5nIG1lY2hhbmlzbQogICAgICAgICAvLyB3b3VsZCBiZSBuaWNlIGZvciBzbWFs
bCBjaHJvbW9zb21lcy4gLS0KICAgICAgICAgdmFyIHNlbGYgPTNEIHRoaXMsCiAgICAgICAgICAg
ICBjaHJvbV9hcmNzID0zRCBzdmcuc2VsZWN0QWxsKCdnJyk7Cj0yMAogICAgICAgICBjaHJvbV9h
cmNzLnNlbGVjdEFsbCgncGF0aCcpCiAgICAgICAgICAgICAuYXR0cignaWQnLCBmdW5jdGlvbihk
KSB7IHJldHVybiAnbGFiZWwtJyArIGQuZGF0YS5jaHJvbTsgfSk7Ci0gICAgICAgICA9MjAKKwog
ICAgICAgICBjaHJvbV9hcmNzLmFwcGVuZCgic3ZnOnRleHQiKQogICAgICAgICAgICAgLmZpbHRl
cihmdW5jdGlvbihkKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGQuZW5kQW5nbGUgLSBkLnN0
YXJ0QW5nbGUgPiBzZWxmLm1pbl9hcmNfbGVuOwpAQCAtODU3LDEyICs4NjEsMTIgQEAKICAgICAg
ICAgICAgICAgICByZXR1cm4gInJvdGF0ZSg5MCkiOwogICAgICAgICAgICAgfTsKPTIwCi0gICAg
ICAgIC8vIEZJWE1FOj0yMAorICAgICAgICAvLyBGSVhNRToKICAgICAgICAgLy8gKDEpIHVzaW5n
IG1pbl9tYXggY2xhc3MgYmVsb3cgaXMgbmVlZGVkIGZvciBfdXBkYXRlX21pbl9tYXgsIHdoPQpp
Y2ggY291bGQgYmUgaW1wcm92ZWQuCiAgICAgICAgIC8vICgyKSBzaG93aW5nIGNvbmZpZyBvbiB0
aWNrIGNsaWNrIHNob3VsZCBiZSByZXBsYWNlZCBieSBwcm9wZXIgdD0KcmFjayBjb25maWcgaWNv
bi4KPTIwCiAgICAgICAgIC8vIERyYXcgbWluLCBtYXggb24gZmlyc3QgY2hyb20gb25seS4KLSAg
ICAgICAgdmFyIHRpY2tzID0zRCB0aGlzLmRyYXdUaWNrcyh0aGlzLnBhcmVudF9lbHQsIFsgdGhp
cy5jaHJvbXNfbGF5b3V0PQpbMF0gXSw9MjAKKyAgICAgICAgdmFyIHRpY2tzID0zRCB0aGlzLmRy
YXdUaWNrcyh0aGlzLnBhcmVudF9lbHQsIFsgdGhpcy5jaHJvbXNfbGF5b3V0PQpbMF0gXSwKICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGF0YV9ib3VuZHNfdGlja3Nf
Zm4oKSwgdGV4dFRyYW5zPQpmb3JtLCB0cnVlKQogICAgICAgICAgICAgICAgICAgICAgICAgLmNs
YXNzZWQoJ21pbl9tYXgnLCB0cnVlKTsKPTIwCkBAIC04NzIsNyArODc2LDcgQEAKICAgICAgICAg
ICAgICAgICB2YXIgdmlldyA9M0QgbmV3IGNvbmZpZy5Db25maWdTZXR0aW5nQ29sbGVjdGlvblZp
ZXcoewogICAgICAgICAgICAgICAgICAgICBjb2xsZWN0aW9uOiBzZWxmLnRyYWNrLmdldCgnY29u
ZmlnJykKICAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgICAgICB2aWV3LnJlbmRlcl9p
bl9tb2RhbCgnQ29uZmlndXJlIFRyYWNrJyk7PTIwCisgICAgICAgICAgICAgICAgdmlldy5yZW5k
ZXJfaW5fbW9kYWwoJ0NvbmZpZ3VyZSBUcmFjaycpOwogICAgICAgICAgICAgfSk7CiAgICAgICAg
IH0pOwo9MjAKQEAgLTk1MSw3ICs5NTUsNyBAQAogdmFyIENpcmNzdGVyQmlnV2lnVHJhY2tWaWV3
ID0zRCBDaXJjc3RlclF1YW50aXRhdGl2ZVRyYWNrVmlldy5leHRlbmQoewo9MjAKICAgICBnZXRf
ZGF0YV9ib3VuZHM6IGZ1bmN0aW9uKGRhdGEpIHsKLSAgICAgICAgLy8gU2V0IG1heCBhY3Jvc3Mg
ZGF0YXNldCBieSBleHRyYWN0aW5nIGFsbCB2YWx1ZXMsIGZsYXR0ZW5pbmcgdGhlPQptIGludG8g
YT0yMAorICAgICAgICAvLyBTZXQgbWF4IGFjcm9zcyBkYXRhc2V0IGJ5IGV4dHJhY3RpbmcgYWxs
IHZhbHVlcywgZmxhdHRlbmluZyB0aGU9Cm0gaW50byBhCiAgICAgICAgIC8vIHNpbmdsZSBhcnJh
eSwgYW5kIGdldHRpbmcgdGhpcmQgcXVhcnRpbGUuCiAgICAgICAgIHZhciB2YWx1ZXMgPTNEIF8u
ZmxhdHRlbiggXy5tYXAoZGF0YSwgZnVuY3Rpb24oZCkgewogICAgICAgICAgICAgaWYgKGQpIHsK
QEAgLTk2NSw4ICs5NjksOCBAQAogICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAg
ICAgfQogICAgICAgICB9KSApOwotICAgICAgID0yMAotICAgICAgICAvLyBGb3IgbWF4LCB1c2Ug
OTglIHF1YW50aWxlIGluIGF0dGVtcHQgdG8gYXZvaWQgdmVyeSBsYXJnZSB2YWx1ZXM9Ci4gSG93
ZXZlciwgdGhpcyBtYXggbWF5IGJlIDA9MjAKKworICAgICAgICAvLyBGb3IgbWF4LCB1c2UgOTgl
IHF1YW50aWxlIGluIGF0dGVtcHQgdG8gYXZvaWQgdmVyeSBsYXJnZSB2YWx1ZXM9Ci4gSG93ZXZl
ciwgdGhpcyBtYXggbWF5IGJlIDAKICAgICAgICAgLy8gZm9yIHNwYXJzZWx5IHBvcHVsYXRlZCBk
YXRhLCBzbyB1c2UgbWF4IGluIHRoYXQgY2FzZS4KICAgICAgICAgcmV0dXJuIFsgXy5taW4odmFs
dWVzKSwgdGhpcy5fcXVhbnRpbGUodmFsdWVzLCAwLjk4KSB8fCBfLm1heCh2YWx1PQplcykgXTsK
ICAgICB9CkBAIC0xMDY4LDEzICsxMDcyLDEzIEBACiAgICAgICAgICAgICAgICAgZ2Vub21lICAg
ICAgICAgICAgICA6IGdlbm9tZSwKICAgICAgICAgICAgICAgICBtb2RlbCAgICAgICAgICAgICAg
IDogdmlzCiAgICAgICAgICAgICB9KTsKLSAgICAgICA9MjAKKwogICAgICAgICAvLyBSZW5kZXIg
dml6dWFsaXphdGlvbgogICAgICAgICB2aXpfdmlldy5yZW5kZXIoKTsKLSAgICAgICA9MjAKKwog
ICAgICAgICAvLyBzZXR1cCB0aXRsZQogICAgICAgICAkKCcjY2VudGVyIC51bmlmaWVkLXBhbmVs
LWhlYWRlci1pbm5lcicpLmFwcGVuZChnYWxheHlfY29uZmlnLmFwcC49CnZpel9jb25maWcudGl0
bGUgKyAiICIgKyBnYWxheHlfY29uZmlnLmFwcC52aXpfY29uZmlnLmRia2V5KTsKLSAgID0yMAor
CiAgICAgICAgIC8vIHNldHVwIG1lbnUKICAgICAgICAgdmFyIG1lbnUgPTNEIG1vZF9pY29uX2J0
bi5jcmVhdGVfaWNvbl9idXR0b25zX21lbnUoWwogICAgICAgICB7CkBAIC0xMTAwLDcgKzExMDQs
NyBAQAogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIC8vIHNob3cgc2F2aW5nIGRpYWxv
ZyBib3gKICAgICAgICAgICAgICAgICBHYWxheHkubW9kYWwuc2hvdyh7dGl0bGU6ICJTYXZpbmcu
Li4iLCBib2R5OiAicHJvZ3Jlc3MiIH0pOwotICAgID0yMAorCiAgICAgICAgICAgICAgICAgLy8g
c2VuZCB0byBzZXJ2ZXIKICAgICAgICAgICAgICAgICAkLmFqYXgoewogICAgICAgICAgICAgICAg
ICAgICB1cmw6IGdhbGF4eV9jb25maWcucm9vdCArICJ2aXN1YWxpemF0aW9uL3NhdmUiLApAQCAt
MTEzMiwxMSArMTEzNiwxMSBAQAogICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbiA9M0Qg
Z2FsYXh5X2NvbmZpZy5yb290ICsgInZpc3VhbGl6YXRpb24vbGk9CnN0IjsKICAgICAgICAgICAg
IH0KICAgICAgICAgfV0sIHsgdG9vbHRpcF9jb25maWc6IHsgcGxhY2VtZW50OiAnYm90dG9tJyB9
IH0pOwotICAgICAgICAgICA9MjAKKwogICAgICAgICAvLyBhZGQgbWVudQogICAgICAgICBtZW51
LiRlbC5hdHRyKCJzdHlsZSIsICJmbG9hdDogcmlnaHQiKTsKICAgICAgICAgJCgiI2NlbnRlciAu
dW5pZmllZC1wYW5lbC1oZWFkZXItaW5uZXIiKS5hcHBlbmQobWVudS4kZWwpOwotICAgICAgICAg
ICA9MjAKKwogICAgICAgICAvLyBtYW51YWwgdG9vbHRpcCBjb25maWcgYmVjYXVzZSBkZWZhdWx0
IGdyYXZpdHkgaXMgUyBhbmQgY2Fubm90IGI9CmUgY2hhbmdlZAogICAgICAgICAkKCIubWVudS1i
dXR0b24iKS50b29sdGlwKCB7IHBsYWNlbWVudDogJ2JvdHRvbScgfSApOwogICAgIH0KCgpodHRw
czovL2JpdGJ1Y2tldC5vcmcvZ2FsYXh5L2dhbGF4eS1jZW50cmFsL2NvbW1pdHMvMTNlNmRkNzY4
N2M0LwpDaGFuZ2VzZXQ6ICAgMTNlNmRkNzY4N2M0CkJyYW5jaDogICAgICByZWxlYXNlXzE1LjAz
ClVzZXI6ICAgICAgICBkYW5ub24KRGF0ZTogICAgICAgIDIwMTUtMDQtMDIgMTM6MTM6MzMrMDA6
MDAKU3VtbWFyeTogICAgIEZpeCBkeW5hbWljIG9wdGlvbnMgbm90IGZpbGxpbmcgcHJvcGVybHkK
QWZmZWN0ZWQgIzogIDEgZmlsZQoKZGlmZiAtciA2NWIyMzMwYjgyM2M3NjExMzY5Yjk3YjA4Mjky
YTZjODY0ZGVlMTFjIC1yIDEzZTZkZDc2ODdjNDFiYzA4Y2QzNmVjPQoxN2QyZmE3YjM5NmI3YjM2
ZSBsaWIvZ2FsYXh5L3Rvb2xzL3BhcmFtZXRlcnMvYmFzaWMucHkKLS0tIGEvbGliL2dhbGF4eS90
b29scy9wYXJhbWV0ZXJzL2Jhc2ljLnB5CisrKyBiL2xpYi9nYWxheHkvdG9vbHMvcGFyYW1ldGVy
cy9iYXNpYy5weQpAQCAtMTUsNiArMTUsNyBAQAogZnJvbSBnYWxheHkudXRpbCBpbXBvcnQgc3Ry
aW5nX2FzX2Jvb2wsIHNhbml0aXplX3BhcmFtLCB1bmljb2RpZnkKIGZyb20gZ2FsYXh5LnV0aWwg
aW1wb3J0IGxpc3RpZnkKIGZyb20gZ2FsYXh5LnV0aWwub2RpY3QgaW1wb3J0IG9kaWN0Citmcm9t
IGdhbGF4eS51dGlsLmV4cHJlc3Npb25zIGltcG9ydCBFeHByZXNzaW9uQ29udGV4dAogZnJvbSBz
YW5pdGl6ZSBpbXBvcnQgVG9vbFBhcmFtZXRlclNhbml0aXplcgogaW1wb3J0IHZhbGlkYXRpb24K
IGltcG9ydCBkeW5hbWljX29wdGlvbnMKQEAgLTgwMiw4ICs4MDMsOSBAQAogICAgICAgICBzZWxm
LmlzX2R5bmFtaWMgPTNEICggKCBzZWxmLmR5bmFtaWNfb3B0aW9ucyBpcyBub3QgTm9uZSApIG9y
ICggc2U9CmxmLm9wdGlvbnMgaXMgbm90IE5vbmUgKSApCj0yMAogICAgIGRlZiBfZ2V0X2R5bmFt
aWNfb3B0aW9uc19jYWxsX290aGVyX3ZhbHVlcyggc2VsZiwgdHJhbnMsIG90aGVyX3ZhbHVlcyA9
Cik6Ci0gICAgICAgIGNhbGxfb3RoZXJfdmFsdWVzID0zRCB7ICJfX3RyYW5zX18iOiB0cmFucyB9
CisgICAgICAgIGNhbGxfb3RoZXJfdmFsdWVzID0zRCBFeHByZXNzaW9uQ29udGV4dCh7ICJfX3Ry
YW5zX18iOiB0cmFucyB9KQogICAgICAgICBpZiBvdGhlcl92YWx1ZXM6CisgICAgICAgICAgICBj
YWxsX290aGVyX3ZhbHVlcy5wYXJlbnQgPTNEIG90aGVyX3ZhbHVlcy5wYXJlbnQKICAgICAgICAg
ICAgIGNhbGxfb3RoZXJfdmFsdWVzLnVwZGF0ZSggb3RoZXJfdmFsdWVzLmRpY3QgKQogICAgICAg
ICByZXR1cm4gY2FsbF9vdGhlcl92YWx1ZXMKPTIwCgoKaHR0cHM6Ly9iaXRidWNrZXQub3JnL2dh
bGF4eS9nYWxheHktY2VudHJhbC9jb21taXRzLzRlZTgxMzk1NWEyMy8KQ2hhbmdlc2V0OiAgIDRl
ZTgxMzk1NWEyMwpCcmFuY2g6ICAgICAgcmVsZWFzZV8xNS4wMwpVc2VyOiAgICAgICAgZGFubm9u
CkRhdGU6ICAgICAgICAyMDE1LTA0LTAyIDEzOjE1OjQzKzAwOjAwClN1bW1hcnk6ICAgICBGaXgg
Z2V0X29wdGlvbnNfZnJvbV9jb2RlIHRvIGNvcnJlY3RseSB1c2UgYW4gZXhwcmVzaW9uY29udGV4
dD0KIGFzIHdlbGwsIHRoaXMgd291bGQgaGF2ZSBwcmV2ZW50ZWQgaXQgd29ya2luZyBpbiByZXBl
YXRzL2V0YwpBZmZlY3RlZCAjOiAgMSBmaWxlCgpkaWZmIC1yIDEzZTZkZDc2ODdjNDFiYzA4Y2Qz
NmVjMTdkMmZhN2IzOTZiN2IzNmUgLXIgNGVlODEzOTU1YTIzY2Y4ZDAwOTMxMjg9Cjg3MjE3OTQ0
MWNlYzQ4ZjVmIGxpYi9nYWxheHkvdG9vbHMvcGFyYW1ldGVycy9iYXNpYy5weQotLS0gYS9saWIv
Z2FsYXh5L3Rvb2xzL3BhcmFtZXRlcnMvYmFzaWMucHkKKysrIGIvbGliL2dhbGF4eS90b29scy9w
YXJhbWV0ZXJzL2Jhc2ljLnB5CkBAIC0xNTA3LDggKzE1MDcsOSBAQAo9MjAKICAgICBkZWYgX2dl
dF9vcHRpb25zX2Zyb21fY29kZSggc2VsZiwgdHJhbnM9M0ROb25lLCB2YWx1ZT0zRE5vbmUsIG90
aGVyX3ZhPQpsdWVzPTNETm9uZSApOgogICAgICAgICBhc3NlcnQgc2VsZi5keW5hbWljX29wdGlv
bnMsIEV4Y2VwdGlvbiggImR5bmFtaWNfb3B0aW9ucyB3YXMgbm90IHM9CnBlY2lmZWQiICkKLSAg
ICAgICAgY2FsbF9vdGhlcl92YWx1ZXMgPTNEIHsgJ19fdHJhbnNfXyc6IHRyYW5zLCAnX192YWx1
ZV9fJzogdmFsdWUgfQorICAgICAgICBjYWxsX290aGVyX3ZhbHVlcyA9M0QgRXhwcmVzc2lvbkNv
bnRleHQoeyAnX190cmFuc19fJzogdHJhbnMsICdfX3Y9CmFsdWVfXyc6IHZhbHVlIH0pCiAgICAg
ICAgIGlmIG90aGVyX3ZhbHVlczoKKyAgICAgICAgICAgIGNhbGxfb3RoZXJfdmFsdWVzLnBhcmVu
dCA9M0Qgb3RoZXJfdmFsdWVzLnBhcmVudAogICAgICAgICAgICAgY2FsbF9vdGhlcl92YWx1ZXMu
dXBkYXRlKCBvdGhlcl92YWx1ZXMuZGljdCApCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHJl
dHVybiBldmFsKCBzZWxmLmR5bmFtaWNfb3B0aW9ucywgc2VsZi50b29sLmNvZGVfbmFtZXNwYWNl
LCBjPQphbGxfb3RoZXJfdmFsdWVzICkKCgpodHRwczovL2JpdGJ1Y2tldC5vcmcvZ2FsYXh5L2dh
bGF4eS1jZW50cmFsL2NvbW1pdHMvZDk0Y2NlYWQ0MDA1LwpDaGFuZ2VzZXQ6ICAgZDk0Y2NlYWQ0
MDA1CkJyYW5jaDogICAgICByZWxlYXNlXzE1LjAzClVzZXI6ICAgICAgICBkYW5ub24KRGF0ZTog
ICAgICAgIDIwMTUtMDQtMDEgMjE6NTY6MjkrMDA6MDAKU3VtbWFyeTogICAgIEZpeCBlcnJvciBp
biB0b29sc2hlZCBtZXRhZGF0YSBnZW5lcmF0b3IgcmVwb3J0ZWQgYnkgQG1hcnRlbnNvbgpBZmZl
Y3RlZCAjOiAgMSBmaWxlCgpkaWZmIC1yIDRlZTgxMzk1NWEyM2NmOGQwMDkzMTI4ODcyMTc5NDQx
Y2VjNDhmNWYgLXIgZDk0Y2NlYWQ0MDA1YmY1MGMwYjI4YmE9CmM1YTRjYzhlOTU4MWZjNjMxIGxp
Yi90b29sX3NoZWQvbWV0YWRhdGEvbWV0YWRhdGFfZ2VuZXJhdG9yLnB5Ci0tLSBhL2xpYi90b29s
X3NoZWQvbWV0YWRhdGEvbWV0YWRhdGFfZ2VuZXJhdG9yLnB5CisrKyBiL2xpYi90b29sX3NoZWQv
bWV0YWRhdGEvbWV0YWRhdGFfZ2VuZXJhdG9yLnB5CkBAIC00NTYsOCArNDU2LDggQEAKICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgZXhwb3J0ZWRfd29ya2Zsb3dfZGljdCA9M0QganNvbi5sb2Fkcyg9CiB3b3Jr
Zmxvd190ZXh0ICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0IEV4Y2Vw
dGlvbiwgZToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5leGNlcHRp
b24oICJTa2lwcGluZyBmaWxlICVzIHNpbmNlPQogaXQgZG9lcyBub3Qgc2VlbSB0byBiZSBhIHZh
bGlkIGV4cG9ydGVkIEdhbGF4eSB3b3JrZmxvdzogJXMiIFwKLSAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgc3RyKCByZWxhdGl2ZV9wYXRoICksPQog
c3RyKCBlICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmV4Y2Vw
dGlvbiggIlNraXBwaW5nIGZpbGUgJXMgc2luY2U9CiBpdCBkb2VzIG5vdCBzZWVtIHRvIGJlIGEg
dmFsaWQgZXhwb3J0ZWQgR2FsYXh5IHdvcmtmbG93OiAlcyIKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgKHN0ciggcmVsYXRpdmVfcGF0aCApPQos
IHN0ciggZSApICkgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRf
ZXhwb3J0ZWRfZ2FsYXh5X3dvcmtmbG93ID0zRCBGYWw9CnNlCiAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgaWYgdmFsaWRfZXhwb3J0ZWRfZ2FsYXh5X3dvcmtmbG93IGFuZCBcCiAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICdhX2dhbGF4eV93b3JrZmxvdycgaW4gZXhwb3J0ZWRf
d29ya2Zsb3dfZD0KaWN0IGFuZCBcCgoKaHR0cHM6Ly9iaXRidWNrZXQub3JnL2dhbGF4eS9nYWxh
eHktY2VudHJhbC9jb21taXRzLzA2MGNiMDg1ZTgzYy8KQ2hhbmdlc2V0OiAgIDA2MGNiMDg1ZTgz
YwpCcmFuY2g6ICAgICAgcmVsZWFzZV8xNS4wMwpVc2VyOiAgICAgICAgZGFubm9uCkRhdGU6ICAg
ICAgICAyMDE1LTA0LTAxIDIyOjMxOjE0KzAwOjAwClN1bW1hcnk6ICAgICBGaXggc3BhY2luZyB0
byBmb2xsb3cgb3VyIGd1aWRlbGluZXMuCkFmZmVjdGVkICM6ICAxIGZpbGUKCmRpZmYgLXIgZDk0
Y2NlYWQ0MDA1YmY1MGMwYjI4YmFjNWE0Y2M4ZTk1ODFmYzYzMSAtciAwNjBjYjA4NWU4M2M4YmVm
N2E4NzViYz0KYTAwN2IzOTNmMjkxMDM5YWQgbGliL3Rvb2xfc2hlZC9tZXRhZGF0YS9tZXRhZGF0
YV9nZW5lcmF0b3IucHkKLS0tIGEvbGliL3Rvb2xfc2hlZC9tZXRhZGF0YS9tZXRhZGF0YV9nZW5l
cmF0b3IucHkKKysrIGIvbGliL3Rvb2xfc2hlZC9tZXRhZGF0YS9tZXRhZGF0YV9nZW5lcmF0b3Iu
cHkKQEAgLTQ1Nyw3ICs0NTcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgZXhwb3J0ZWRfd29ya2Zsb3dfZGljdCA9M0QganNvbi5sb2Fkcyg9CiB3b3JrZmxvd190ZXh0
ICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiwgZToK
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5leGNlcHRpb24oICJTa2lw
cGluZyBmaWxlICVzIHNpbmNlPQogaXQgZG9lcyBub3Qgc2VlbSB0byBiZSBhIHZhbGlkIGV4cG9y
dGVkIEdhbGF4eSB3b3JrZmxvdzogJXMiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAlIChzdHIoIHJlbGF0aXZlX3BhdGggKT0KLCBzdHIoIGUgKSAp
ICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUg
KCBzdHIoIHJlbGF0aXZlX3BhdGggPQopLCBzdHIoIGUgKSApICkKICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIHZhbGlkX2V4cG9ydGVkX2dhbGF4eV93b3JrZmxvdyA9M0QgRmFs
PQpzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHZhbGlkX2V4cG9ydGVkX2dhbGF4
eV93b3JrZmxvdyBhbmQgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYV9nYWxh
eHlfd29ya2Zsb3cnIGluIGV4cG9ydGVkX3dvcmtmbG93X2Q9CmljdCBhbmQgXAoKCmh0dHBzOi8v
Yml0YnVja2V0Lm9yZy9nYWxheHkvZ2FsYXh5LWNlbnRyYWwvY29tbWl0cy8xMGFlMzdiODYzZmUv
CkNoYW5nZXNldDogICAxMGFlMzdiODYzZmUKQnJhbmNoOiAgICAgIHJlbGVhc2VfMTUuMDMKVXNl
cjogICAgICAgIGNhcmxmZWJlcmhhcmQKRGF0ZTogICAgICAgIDIwMTUtMDQtMDIgMTY6Mzg6MzAr
MDA6MDAKU3VtbWFyeTogICAgIEZpeDogaGRhIG1hbmFnZXIgdHJhbnMgcGFyYW0gaW4gdmlzdWFs
aXphdGlvbnMgY29udHJvbGxlciBhbmQgPQp0b29scyBhcGkgX3JlcnVuX3Rvb2wKQWZmZWN0ZWQg
IzogIDIgZmlsZXMKCmRpZmYgLXIgMDYwY2IwODVlODNjOGJlZjdhODc1YmNhMDA3YjM5M2YyOTEw
MzlhZCAtciAxMGFlMzdiODYzZmUzNjVlMTk1ZTViMj0KMDQ0YTQ4NTkyMzlkYTQyOTYgbGliL2dh
bGF4eS93ZWJhcHBzL2dhbGF4eS9hcGkvdG9vbHMucHkKLS0tIGEvbGliL2dhbGF4eS93ZWJhcHBz
L2dhbGF4eS9hcGkvdG9vbHMucHkKKysrIGIvbGliL2dhbGF4eS93ZWJhcHBzL2dhbGF4eS9hcGkv
dG9vbHMucHkKQEAgLTMzMSw3ICszMzEsNyBAQAogICAgICAgICAjIGpvYidzIHByZXZpb3VzIHBh
cmFtZXRlcnMgYW5kIGluY29taW5nIHBhcmFtZXRlcnMuIEluY29taW5nIHBhcmE9Cm1ldGVycwog
ICAgICAgICAjIGhhdmUgcHJpb3JpdHkuCiAgICAgICAgICMKLSAgICAgICAgb3JpZ2luYWxfam9i
ID0zRCBzZWxmLmhkYV9tYW5hZ2VyLmNyZWF0aW5nX2pvYiggb3JpZ2luYWxfZGF0YXNldCApCisg
ICAgICAgIG9yaWdpbmFsX2pvYiA9M0Qgc2VsZi5oZGFfbWFuYWdlci5jcmVhdGluZ19qb2IoIHRy
YW5zLCBvcmlnaW5hbF9kYT0KdGFzZXQgKQogICAgICAgICB0b29sID0zRCB0cmFucy5hcHAudG9v
bGJveC5nZXRfdG9vbCggb3JpZ2luYWxfam9iLnRvb2xfaWQgKQogICAgICAgICBpZiBub3QgdG9v
bCBvciBub3QgdG9vbC5hbGxvd191c2VyX2FjY2VzcyggdHJhbnMudXNlciApOgogICAgICAgICAg
ICAgcmV0dXJuIHRyYW5zLmFwcC5tb2RlbC5EYXRhc2V0LmNvbnZlcnNpb25fbWVzc2FnZXMuTk9f
VE9PTAoKZGlmZiAtciAwNjBjYjA4NWU4M2M4YmVmN2E4NzViY2EwMDdiMzkzZjI5MTAzOWFkIC1y
IDEwYWUzN2I4NjNmZTM2NWUxOTVlNWIyPQowNDRhNDg1OTIzOWRhNDI5NiBsaWIvZ2FsYXh5L3dl
YmFwcHMvZ2FsYXh5L2NvbnRyb2xsZXJzL3Zpc3VhbGl6YXRpb24ucHkKLS0tIGEvbGliL2dhbGF4
eS93ZWJhcHBzL2dhbGF4eS9jb250cm9sbGVycy92aXN1YWxpemF0aW9uLnB5CisrKyBiL2xpYi9n
YWxheHkvd2ViYXBwcy9nYWxheHkvY29udHJvbGxlcnMvdmlzdWFsaXphdGlvbi5weQpAQCAtOTg1
LDcgKzk4NSw3IEBACiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAjIExvYWRpbmcgbmV3IHZp
c3VhbGl6YXRpb24uCiAgICAgICAgICAgICBkYXRhc2V0ID0zRCBzZWxmLmdldF9oZGFfb3JfbGRk
YSggdHJhbnMsIGhkYV9sZGRhLCBkYXRhc2V0X2lkICkKLSAgICAgICAgICAgIGpvYiA9M0Qgc2Vs
Zi5oZGFfbWFuYWdlci5jcmVhdGluZ19qb2IoIGRhdGFzZXQgKQorICAgICAgICAgICAgam9iID0z
RCBzZWxmLmhkYV9tYW5hZ2VyLmNyZWF0aW5nX2pvYiggdHJhbnMsIGRhdGFzZXQgKQogICAgICAg
ICAgICAgdml6X2NvbmZpZyA9M0QgewogICAgICAgICAgICAgICAgICdkYXRhc2V0X2lkJzogZGF0
YXNldF9pZCwKICAgICAgICAgICAgICAgICAndG9vbF9pZCc6IGpvYi50b29sX2lkLApAQCAtMTAx
Nyw3ICsxMDE3LDcgQEAKICAgICAgICAgaWYgZGF0YXNldF9pZDoKICAgICAgICAgICAgIGRlY29k
ZWRfaWQgPTNEIHNlbGYuZGVjb2RlX2lkKCBkYXRhc2V0X2lkICkKICAgICAgICAgICAgIGhkYSA9
M0Qgc2VsZi5oZGFfbWFuYWdlci5nZXRfYWNjZXNzaWJsZSggdHJhbnMsIGRlY29kZWRfaWQsIHRy
PQphbnMudXNlciApCi0gICAgICAgICAgICBoZGEgPTNEIHNlbGYuaGRhX21hbmFnZXIuZXJyb3Jf
aWZfdXBsb2FkaW5nKCBoZGEgKQorICAgICAgICAgICAgaGRhID0zRCBzZWxmLmhkYV9tYW5hZ2Vy
LmVycm9yX2lmX3VwbG9hZGluZyggdHJhbnMsIGhkYSApCiAgICAgICAgIGVsc2U6CiAgICAgICAg
ICAgICByZXR1cm4gdHJhbnMuc2hvd19tZXNzYWdlKCAiUGh5bG92aXogY291bGRuJ3QgZmluZCBh
IGRhdGFzZXRfaT0KZCIgKQo9MjAKCgpodHRwczovL2JpdGJ1Y2tldC5vcmcvZ2FsYXh5L2dhbGF4
eS1jZW50cmFsL2NvbW1pdHMvZDA3OTllOGNmOTc2LwpDaGFuZ2VzZXQ6ICAgZDA3OTllOGNmOTc2
CkJyYW5jaDogICAgICByZWxlYXNlXzE1LjAzClVzZXI6ICAgICAgICBkYW5ub24KRGF0ZTogICAg
ICAgIDIwMTUtMDQtMDIgMjA6NDI6MzgrMDA6MDAKU3VtbWFyeTogICAgIE1vcmUgZml4ZXMgZm9y
IHJlbW92YWwgb2YgdHJhbnMgZnJvbSB2YXJpb3VzIG1hbmFnZXIgZnVuY3Rpb25zLgpBZmZlY3Rl
ZCAjOiAgMSBmaWxlCgpkaWZmIC1yIDEwYWUzN2I4NjNmZTM2NWUxOTVlNWIyMDQ0YTQ4NTkyMzlk
YTQyOTYgLXIgZDA3OTllOGNmOTc2OGU5YjdkNWQ3ZDU9Cjc0NjY3ZTE1MzhkMzE2YzUwIGxpYi9n
YWxheHkvd2ViYXBwcy9nYWxheHkvY29udHJvbGxlcnMvdGFnLnB5Ci0tLSBhL2xpYi9nYWxheHkv
d2ViYXBwcy9nYWxheHkvY29udHJvbGxlcnMvdGFnLnB5CisrKyBiL2xpYi9nYWxheHkvd2ViYXBw
cy9nYWxheHkvY29udHJvbGxlcnMvdGFnLnB5CkBAIC00Miw3ICs0Miw3IEBACiAgICAgICAgICMg
QXBwbHkgdGFnLgogICAgICAgICBpdGVtID0zRCBzZWxmLl9nZXRfaXRlbSggdHJhbnMsIGl0ZW1f
Y2xhc3MsIHRyYW5zLnNlY3VyaXR5LmRlY29kZV89CmlkKCBpdGVtX2lkICkgKQogICAgICAgICB1
c2VyID0zRCB0cmFucy51c2VyCi0gICAgICAgIHNlbGYuZ2V0X3RhZ19oYW5kbGVyKCB0cmFucyAp
LmFwcGx5X2l0ZW1fdGFncyggdHJhbnMsIHVzZXIsIGl0ZW0sID0KbmV3X3RhZy5lbmNvZGUoICd1
dGYtOCcgKSApCisgICAgICAgIHNlbGYuZ2V0X3RhZ19oYW5kbGVyKCB0cmFucyApLmFwcGx5X2l0
ZW1fdGFncyggdXNlciwgaXRlbSwgbmV3X3RhZz0KLmVuY29kZSggJ3V0Zi04JyApICkKICAgICAg
ICAgdHJhbnMuc2Ffc2Vzc2lvbi5mbHVzaCgpCiAgICAgICAgICMgTG9nLgogICAgICAgICBwYXJh
bXMgPTNEIGRpY3QoIGl0ZW1faWQ9M0RpdGVtLmlkLCBpdGVtX2NsYXNzPTNEaXRlbV9jbGFzcywg
dGFnPQo9M0RuZXdfdGFnICkKQEAgLTU3LDcgKzU3LDcgQEAKICAgICAgICAgIyBSZW1vdmUgdGFn
LgogICAgICAgICBpdGVtID0zRCBzZWxmLl9nZXRfaXRlbSggdHJhbnMsIGl0ZW1fY2xhc3MsIHRy
YW5zLnNlY3VyaXR5LmRlY29kZV89CmlkKCBpdGVtX2lkICkgKQogICAgICAgICB1c2VyID0zRCB0
cmFucy51c2VyCi0gICAgICAgIHNlbGYuZ2V0X3RhZ19oYW5kbGVyKCB0cmFucyApLnJlbW92ZV9p
dGVtX3RhZyggdHJhbnMsIHVzZXIsIGl0ZW0sID0KdGFnX25hbWUuZW5jb2RlKCAndXRmLTgnICkg
KQorICAgICAgICBzZWxmLmdldF90YWdfaGFuZGxlciggdHJhbnMgKS5yZW1vdmVfaXRlbV90YWco
IHVzZXIsIGl0ZW0sIHRhZ19uYW09CmUuZW5jb2RlKCAndXRmLTgnICkgKQogICAgICAgICB0cmFu
cy5zYV9zZXNzaW9uLmZsdXNoKCkKICAgICAgICAgIyBMb2cuCiAgICAgICAgIHBhcmFtcyA9M0Qg
ZGljdCggaXRlbV9pZD0zRGl0ZW0uaWQsIGl0ZW1fY2xhc3M9M0RpdGVtX2NsYXNzLCB0YWc9Cj0z
RHRhZ19uYW1lICkKQEAgLTczLDggKzczLDggQEAKICAgICAgICAgIyBBcHBseSB0YWdzLgogICAg
ICAgICBpdGVtID0zRCBzZWxmLl9nZXRfaXRlbSggdHJhbnMsIGl0ZW1fY2xhc3MsIHRyYW5zLnNl
Y3VyaXR5LmRlY29kZV89CmlkKCBpdGVtX2lkICkgKQogICAgICAgICB1c2VyID0zRCB0cmFucy51
c2VyCi0gICAgICAgIHNlbGYuZ2V0X3RhZ19oYW5kbGVyKCB0cmFucyApLmRlbGV0ZV9pdGVtX3Rh
Z3MoIHRyYW5zLCB1c2VyLCBpdGVtICkKLSAgICAgICAgc2VsZi5nZXRfdGFnX2hhbmRsZXIoIHRy
YW5zICkuYXBwbHlfaXRlbV90YWdzKCB0cmFucywgdXNlciwgaXRlbSwgPQpuZXdfdGFncy5lbmNv
ZGUoICd1dGYtOCcgKSApCisgICAgICAgIHNlbGYuZ2V0X3RhZ19oYW5kbGVyKCB0cmFucyApLmRl
bGV0ZV9pdGVtX3RhZ3MoIHVzZXIsIGl0ZW0gKQorICAgICAgICBzZWxmLmdldF90YWdfaGFuZGxl
ciggdHJhbnMgKS5hcHBseV9pdGVtX3RhZ3MoIHVzZXIsIGl0ZW0sIG5ld190YWc9CnMuZW5jb2Rl
KCAndXRmLTgnICkgKQogICAgICAgICB0cmFucy5zYV9zZXNzaW9uLmZsdXNoKCkKPTIwCiAgICAg
QHdlYi5leHBvc2UKCgpodHRwczovL2JpdGJ1Y2tldC5vcmcvZ2FsYXh5L2dhbGF4eS1jZW50cmFs
L2NvbW1pdHMvZjBiYmY1Nzc1ZDNmLwpDaGFuZ2VzZXQ6ICAgZjBiYmY1Nzc1ZDNmCkJyYW5jaDog
ICAgICByZWxlYXNlXzE1LjAzClVzZXI6ICAgICAgICBndWVybGVyCkRhdGU6ICAgICAgICAyMDE1
LTA0LTAzIDE2OjQ2OjE3KzAwOjAwClN1bW1hcnk6ICAgICBbU1RBQkxFXSBSZXZpc2UgcmUtcnVu
IG1hcHBpbmcgb2YgZGF0YXNldHMgYW5kIGNvbGxlY3Rpb25zIGZvcj0KIGltcG9ydGVkIGFuZCBj
b3BpZWQgaGlzdG9yeSBpdGVtcy4gVGhlIHByZXZpb3VzIG1ldGhvZCAoZnJvbSB0b29sX3J1bm5l
ci5wPQp5KSBoYWQgZGlmZmljdWx0aWVzIHdpdGggY29uc2lzdGVudGx5IGhhc2hpbmcgaGlzdG9y
eSBpdGVtcyB3aGljaCBjYXVzZWQgaXM9CnN1ZXMgZm9yIGltcG9ydGVkIGRhdGFzZXRzLiBXZSBm
aXhlZCB0aGF0LCBob3dldmVyIG5vdyBkYXRhc2V0cyBjb3BpZWQgYmFjaz0KIHRvIHRoZSBzYW1l
IGhpc3RvcnkgYXJlIHNob3duIGluc3RlYWQgb2YgdGhlIG9yaWdpbmFsIGRhdGFzZXQuCkFmZmVj
dGVkICM6ICAxIGZpbGUKCmRpZmYgLXIgZDA3OTllOGNmOTc2OGU5YjdkNWQ3ZDU3NDY2N2UxNTM4
ZDMxNmM1MCAtciBmMGJiZjU3NzVkM2Y3NzBlYzlhZmU0Nz0KMTIyZDk3YjdkMDQ2ZmYwOGUgbGli
L2dhbGF4eS90b29scy9fX2luaXRfXy5weQotLS0gYS9saWIvZ2FsYXh5L3Rvb2xzL19faW5pdF9f
LnB5CisrKyBiL2xpYi9nYWxheHkvdG9vbHMvX19pbml0X18ucHkKQEAgLTI1OTAsMjggKzI1OTAs
NDQgQEAKICAgICAgICAgIyBkYXRhc2V0IHVzZWQ7IHBhcmFtZXRlciBzaG91bGQgYmUgdGhlIGFu
YWx5Z291cyBkYXRhc2V0IGluIHRoZQogICAgICAgICAjIGN1cnJlbnQgaGlzdG9yeS4KICAgICAg
ICAgaGlzdG9yeSA9M0QgdHJhbnMuZ2V0X2hpc3RvcnkoKQotICAgICAgICBoZGFfc291cmNlX2Rp
Y3QgPTNEIHt9ICMgTWFwcGluZyBmcm9tIEhEQSBpbiBoaXN0b3J5IHRvIHNvdXJjZSBIREE9CnMu
CisKKyAgICAgICAgIyBDcmVhdGUgaW5kZXggZm9yIGhkYXMuCisgICAgICAgIGhkYV9zb3VyY2Vf
ZGljdCA9M0Qge30KICAgICAgICAgZm9yIGhkYSBpbiBoaXN0b3J5LmRhdGFzZXRzOgotICAgICAg
ICAgICAgc291cmNlX2hkYSA9M0QgaGRhLmNvcGllZF9mcm9tX2hpc3RvcnlfZGF0YXNldF9hc3Nv
Y2lhdGlvbgotICAgICAgICAgICAgd2hpbGUgc291cmNlX2hkYToKLSAgICAgICAgICAgICAgICBp
ZiBzb3VyY2VfaGRhLmRhdGFzZXQuaWQgbm90IGluIGhkYV9zb3VyY2VfZGljdCBvciBzb3VyY2Vf
PQpoZGEuaGlkID0zRD0zRCBoZGEuaGlkOgotICAgICAgICAgICAgICAgICAgICBoZGFfc291cmNl
X2RpY3RbIHNvdXJjZV9oZGEuZGF0YXNldC5pZCBdID0zRCBoZGEKLSAgICAgICAgICAgICAgICBz
b3VyY2VfaGRhID0zRCBzb3VyY2VfaGRhLmNvcGllZF9mcm9tX2hpc3RvcnlfZGF0YXNldF9hc3Nv
PQpjaWF0aW9uCisgICAgICAgICAgICBrZXkgPTNEICclc18lcycgJSAoaGRhLmhpZCwgaGRhLmRh
dGFzZXQuaWQpCisgICAgICAgICAgICBoZGFfc291cmNlX2RpY3RbIGhkYS5kYXRhc2V0LmlkIF0g
PTNEIGhkYV9zb3VyY2VfZGljdFsga2V5IF0gPQo9M0QgaGRhCj0yMAogICAgICAgICAjIERpdHRv
IGZvciBkYXRhc2V0IGNvbGxlY3Rpb25zLgogICAgICAgICBoZGNhX3NvdXJjZV9kaWN0ID0zRCB7
fQogICAgICAgICBmb3IgaGRjYSBpbiBoaXN0b3J5LmRhdGFzZXRfY29sbGVjdGlvbnM6Ci0gICAg
ICAgICAgICBzb3VyY2VfaGRjYSA9M0QgaGRjYS5jb3BpZWRfZnJvbV9oaXN0b3J5X2RhdGFzZXRf
Y29sbGVjdGlvbl9hcz0Kc29jaWF0aW9uCi0gICAgICAgICAgICB3aGlsZSBzb3VyY2VfaGRjYToK
LSAgICAgICAgICAgICAgICBpZiBzb3VyY2VfaGRjYS5jb2xsZWN0aW9uLmlkIG5vdCBpbiBoZGNh
X3NvdXJjZV9kaWN0IG9yIHNvPQp1cmNlX2hkY2EuaGlkID0zRD0zRCBoZGNhLmhpZDoKLSAgICAg
ICAgICAgICAgICAgICAgaGRjYV9zb3VyY2VfZGljdFsgc291cmNlX2hkY2EuY29sbGVjdGlvbi5p
ZCBdID0zRCBoZGNhCi0gICAgICAgICAgICAgICAgc291cmNlX2hkY2EgPTNEIHNvdXJjZV9oZGNh
LmNvcGllZF9mcm9tX2hpc3RvcnlfZGF0YXNldF9jbz0KbGxlY3Rpb25fYXNzb2NpYXRpb24KKyAg
ICAgICAgICAgIGtleSA9M0QgJyVzXyVzJyAlIChoZGNhLmhpZCwgaGRjYS5jb2xsZWN0aW9uLmlk
KQorICAgICAgICAgICAgaGRjYV9zb3VyY2VfZGljdFsgaGRhLmNvbGxlY3Rpb24uaWQgXSA9M0Qg
aGRjYV9zb3VyY2VfZGljdFsga2U9CnkgXSA9M0QgaGRjYQorCisgICAgICAgICMgTWFwIGRhdGFz
ZXQgb3IgY29sbGVjdGlvbiB0byBjdXJyZW50IGhpc3RvcnkKKyAgICAgICAgZGVmIG1hcF90b19o
aXN0b3J5KHZhbHVlKToKKyAgICAgICAgICAgIGlkID0zRCBOb25lCisgICAgICAgICAgICBzb3Vy
Y2UgPTNEIE5vbmUKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIHRyYW5zLmFwcC5t
b2RlbC5IaXN0b3J5RGF0YXNldEFzc29jaWF0aW9uPQopOgorICAgICAgICAgICAgICAgIGlkID0z
RCB2YWx1ZS5kYXRhc2V0LmlkCisgICAgICAgICAgICAgICAgc291cmNlID0zRCBoZGFfc291cmNl
X2RpY3QKKyAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZSh2YWx1ZSwgdHJhbnMuYXBwLm1vZGVs
Lkhpc3RvcnlEYXRhc2V0Q29sbGVjdGlvPQpuQXNzb2NpYXRpb24pOgorICAgICAgICAgICAgICAg
IGlkID0zRCB2YWx1ZS5jb2xsZWN0aW9uLmlkCisgICAgICAgICAgICAgICAgc291cmNlID0zRCBo
ZGNhX3NvdXJjZV9kaWN0CisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVy
biBOb25lCisgICAgICAgICAgICBrZXkgPTNEICclc18lcycgJSAodmFsdWUuaGlkLCBpZCkKKyAg
ICAgICAgICAgIGlmIGtleSBpbiBzb3VyY2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNvdXJj
ZVsga2V5IF0KKyAgICAgICAgICAgIGVsaWYgaWQgaW4gc291cmNlOgorICAgICAgICAgICAgICAg
IHJldHVybiBzb3VyY2VbIGlkIF0KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAg
cmV0dXJuIE5vbmUKPTIwCiAgICAgICAgICMgVW5wYWNrIHVudmFsaWRhdGVkIHZhbHVlcyB0byBz
dHJpbmdzLCB0aGV5J2xsIGJlIHZhbGlkYXRlZCB3aGVuID0KdGhlCiAgICAgICAgICMgZm9ybSBp
cyBzdWJtaXR0ZWQgKHRoaXMgaGFwcGVucyB3aGVuIHJlLXJ1bm5pbmcgYSBqb2IgdGhhdCB3YXMK
ICAgICAgICAgIyBpbml0aWFsbHkgcnVuIGJ5IGEgd29ya2Zsb3cpCiAgICAgICAgICNUaGlzIG5l
ZWRzIHRvIGJlIGRvbmUgcmVjdXJzaXZlbHkgdGhyb3VnaCBncm91cGluZyBwYXJhbWV0ZXJzCi0g
ICAgICAgIGRlZiByZXJ1bl9jYWxsYmFjayggaW5wdXQsIHZhbHVlLCBwcmVmaXhlZF9uYW1lLCBw
cmVmaXhlZF9sYWJlbCApOgorICAgICAgICBkZWYgbWFwcGluZ19jYWxsYmFjayggaW5wdXQsIHZh
bHVlLCBwcmVmaXhlZF9uYW1lLCBwcmVmaXhlZF9sYWJlbCA9Cik6CiAgICAgICAgICAgICBpZiBp
c2luc3RhbmNlKCB2YWx1ZSwgVW52YWxpZGF0ZWRWYWx1ZSApOgogICAgICAgICAgICAgICAgIHRy
eToKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlucHV0LnRvX2h0bWxfdmFsdWUoIHZhbHVl
LnZhbHVlLCB0cmFucy5hcHAgKQpAQCAtMjYyMywyMiArMjYzOSwxNyBAQAogICAgICAgICAgICAg
ICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsbGlzdCk6CiAgICAgICAgICAgICAgICAgICAgIHZhbHVl
cyA9M0QgW10KICAgICAgICAgICAgICAgICAgICAgZm9yIHZhbCBpbiB2YWx1ZToKLSAgICAgICAg
ICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodmFsLCB0cmFucy5hcHAubW9kZWwuSGlzdG9y
eURhdGFzZXRBPQpzc29jaWF0aW9uKToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB2
YWwuZGF0YXNldC5pZCBpbiBoZGFfc291cmNlX2RpY3Q6Ci0gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIHZhbHVlcy5hcHBlbmQoIGhkYV9zb3VyY2VfZGljdFsgdmFsLmRhdGFzZT0KdC5p
ZCBdICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICB2YWx1ZXMuYXBwZW5kKCB2YWwgKQorICAgICAgICAgICAgICAgICAg
ICAgICAgbmV3X3ZhbCA9M0QgbWFwX3RvX2hpc3RvcnkoIHZhbCApCisgICAgICAgICAgICAgICAg
ICAgICAgICBpZiBuZXdfdmFsOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcy5h
cHBlbmQoIG5ld192YWwgKQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICB2YWx1ZXMuYXBwZW5kKCB2YWwgKQogICAgICAgICAgICAgICAg
ICAgICByZXR1cm4gdmFsdWVzCi0gICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwg
dHJhbnMuYXBwLm1vZGVsLkhpc3RvcnlEYXRhc2V0QXNzb2NpYT0KdGlvbik6Ci0gICAgICAgICAg
ICAgICAgICAgIGlmIHZhbHVlLmRhdGFzZXQuaWQgaW4gaGRhX3NvdXJjZV9kaWN0OgotICAgICAg
ICAgICAgICAgICAgICAgICAgcmV0dXJuIGhkYV9zb3VyY2VfZGljdFsgdmFsdWUuZGF0YXNldC5p
ZCBdCi0gICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgdHJhbnMuYXBwLm1vZGVs
Lkhpc3RvcnlEYXRhc2V0Q29sbGVjdD0KaW9uQXNzb2NpYXRpb24pOgotICAgICAgICAgICAgICAg
ICAgICBpZiB2YWx1ZS5jb2xsZWN0aW9uLmlkIGluIGhkY2Ffc291cmNlX2RpY3Q6Ci0gICAgICAg
ICAgICAgICAgICAgICAgICByZXR1cm4gaGRjYV9zb3VyY2VfZGljdFsgdmFsdWUuY29sbGVjdGlv
bi5pZCBdCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJu
IG1hcF90b19oaXN0b3J5KCB2YWx1ZSApCiAgICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2UoIGlu
cHV0LCBEYXRhQ29sbGVjdGlvblRvb2xQYXJhbWV0ZXIgKToKLSAgICAgICAgICAgICAgICBpZiB2
YWx1ZS5jb2xsZWN0aW9uLmlkIGluIGhkY2Ffc291cmNlX2RpY3Q6Ci0gICAgICAgICAgICAgICAg
ICAgIHJldHVybiBoZGNhX3NvdXJjZV9kaWN0WyB2YWx1ZS5jb2xsZWN0aW9uLmlkIF0KLSAgICAg
ICAgdmlzaXRfaW5wdXRfdmFsdWVzKCB0b29sX2lucHV0cywgcGFyYW1zLCByZXJ1bl9jYWxsYmFj
ayApCisgICAgICAgICAgICAgICAgcmV0dXJuIG1hcF90b19oaXN0b3J5KCB2YWx1ZSApCisgICAg
ICAgIHZpc2l0X2lucHV0X3ZhbHVlcyggdG9vbF9pbnB1dHMsIHBhcmFtcywgbWFwcGluZ19jYWxs
YmFjayApCj0yMAogICAgIGRlZiBfY29tcGFyZV90b29sX3ZlcnNpb24oIHNlbGYsIHRyYW5zLCBq
b2IgKToKICAgICAgICAgIiIiCgoKaHR0cHM6Ly9iaXRidWNrZXQub3JnL2dhbGF4eS9nYWxheHkt
Y2VudHJhbC9jb21taXRzL2NhYWRlOGJjYzczZi8KQ2hhbmdlc2V0OiAgIGNhYWRlOGJjYzczZgpC
cmFuY2g6ICAgICAgcmVsZWFzZV8xNS4wMwpVc2VyOiAgICAgICAgZGFuCkRhdGU6ICAgICAgICAy
MDE1LTA0LTAzIDE5OjM5OjQwKzAwOjAwClN1bW1hcnk6ICAgICBGaXhlcyBmb3IgZGlzcGxheWlu
ZyBjZXJ0YWluIHZhbGlkIHRvb2wgaW50ZXJmYWNlcyBpbiB0aGUgVG9vbD0KU2hlZC4KQWZmZWN0
ZWQgIzogIDMgZmlsZXMKCmRpZmYgLXIgZjBiYmY1Nzc1ZDNmNzcwZWM5YWZlNDcxMjJkOTdiN2Qw
NDZmZjA4ZSAtciBjYWFkZThiY2M3M2ZmNzEzZmNlYzhjYj0KMTBjYzgwODk2YmE2NTQyNjYgbGli
L2dhbGF4eS91dGlsL2Ria2V5cy5weQotLS0gYS9saWIvZ2FsYXh5L3V0aWwvZGJrZXlzLnB5Cisr
KyBiL2xpYi9nYWxheHkvdXRpbC9kYmtleXMucHkKQEAgLTM4LDcgKzM4LDcgQEAKICAgICAgICAg
ICAgICAgICBmb3IgZGF0YXNldCBpbiBkYXRhc2V0czoKICAgICAgICAgICAgICAgICAgICAgcnZh
bC5hcHBlbmQoICggZGF0YXNldC5kYmtleSwgIiVzICglcykgW0hpc3RvcnldIiAlICggPQpkYXRh
c2V0Lm5hbWUsIGRhdGFzZXQuZGJrZXkgKSApICkKICAgICAgICAgICAgIHVzZXIgPTNEIHRyYW5z
LnVzZXIKLSAgICAgICAgICAgIGlmIHVzZXIgYW5kICdkYmtleXMnIGluIHVzZXIucHJlZmVyZW5j
ZXM6CisgICAgICAgICAgICBpZiB1c2VyIGFuZCBoYXNhdHRyKCB1c2VyLCAncHJlZmVyZW5jZXMn
ICkgYW5kICdkYmtleXMnIGluIHVzZT0Kci5wcmVmZXJlbmNlczoKICAgICAgICAgICAgICAgICB1
c2VyX2tleXMgPTNEIGxvYWRzKCB1c2VyLnByZWZlcmVuY2VzWydkYmtleXMnXSApCiAgICAgICAg
ICAgICAgICAgZm9yIGtleSwgY2hyb21fZGljdCBpbiB1c2VyX2tleXMuaXRlcml0ZW1zKCk6CiAg
ICAgICAgICAgICAgICAgICAgIHJ2YWwuYXBwZW5kKCAoIGtleSwgIiVzICglcykgW0N1c3RvbV0i
ICUgKCBjaHJvbV9kaWN0Wz0KJ25hbWUnXSwga2V5ICkgKSApCgpkaWZmIC1yIGYwYmJmNTc3NWQz
Zjc3MGVjOWFmZTQ3MTIyZDk3YjdkMDQ2ZmYwOGUgLXIgY2FhZGU4YmNjNzNmZjcxM2ZjZWM4Y2I9
CjEwY2M4MDg5NmJhNjU0MjY2IGxpYi9nYWxheHkvd2ViL2ZyYW1ld29yay93ZWJhcHAucHkKLS0t
IGEvbGliL2dhbGF4eS93ZWIvZnJhbWV3b3JrL3dlYmFwcC5weQorKysgYi9saWIvZ2FsYXh5L3dl
Yi9mcmFtZXdvcmsvd2ViYXBwLnB5CkBAIC02NjgsNyArNjY4LDggQEAKICAgICAgICAgIiIiCiAg
ICAgICAgIGhpc3RvcnkgPTNEIE5vbmUKICAgICAgICAgaWYgc2VsZi5nYWxheHlfc2Vzc2lvbjoK
LSAgICAgICAgICAgIGhpc3RvcnkgPTNEIHNlbGYuZ2FsYXh5X3Nlc3Npb24uY3VycmVudF9oaXN0
b3J5CisgICAgICAgICAgICBpZiBoYXNhdHRyKCBzZWxmLmdhbGF4eV9zZXNzaW9uLCAnY3VycmVu
dF9oaXN0b3J5JyApOgorICAgICAgICAgICAgICAgIGhpc3RvcnkgPTNEIHNlbGYuZ2FsYXh5X3Nl
c3Npb24uY3VycmVudF9oaXN0b3J5CiAgICAgICAgIGlmIG5vdCBoaXN0b3J5IGFuZCB1dGlsLnN0
cmluZ19hc19ib29sKCBjcmVhdGUgKToKICAgICAgICAgICAgIGhpc3RvcnkgPTNEIHNlbGYubmV3
X2hpc3RvcnkoKQogICAgICAgICByZXR1cm4gaGlzdG9yeQoKZGlmZiAtciBmMGJiZjU3NzVkM2Y3
NzBlYzlhZmU0NzEyMmQ5N2I3ZDA0NmZmMDhlIC1yIGNhYWRlOGJjYzczZmY3MTNmY2VjOGNiPQox
MGNjODA4OTZiYTY1NDI2NiBsaWIvdG9vbF9zaGVkL3V0aWwvdG9vbF91dGlsLnB5Ci0tLSBhL2xp
Yi90b29sX3NoZWQvdXRpbC90b29sX3V0aWwucHkKKysrIGIvbGliL3Rvb2xfc2hlZC91dGlsL3Rv
b2xfdXRpbC5weQpAQCAtMjM3LDEyICsyMzcsMTkgQEAKICAgICBpZiBpbnZhbGlkOgogICAgICAg
ICAjIFdlJ3JlIGF0dGVtcHRpbmcgdG8gZGlzcGxheSBhIHRvb2wgaW4gdGhlIHRvb2wgc2hlZCB0
aGF0IGhhcyBiZWU9Cm4gZGV0ZXJtaW5lZCB0byBoYXZlIGVycm9ycywgc28gaXMgaW52YWxpZC4K
ICAgICAgICAgcmV0dXJuIHN0YXRlCisgICAgdHJ5OgorICAgICAgICAjIEF0dGVtcHQgdG8gZ2Vu
ZXJhdGUgdGhlIHRvb2wgc3RhdGUgdXNpbmcgdGhlIHN0YW5kYXJkIEdhbGF4eS1zaWQ9CmUgY29k
ZQorICAgICAgICByZXR1cm4gdG9vbC5uZXdfc3RhdGUoIHRyYW5zICkKKyAgICBleGNlcHQgRXhj
ZXB0aW9uLCBlOgorICAgICAgICAjIEZhbGwgYmFjayB0byBidWlsZGluZyB0b29sIHN0YXRlIGFz
IGJlbG93CisgICAgICAgIGxvZy5kZWJ1ZyggJ0ZhaWxlZCB0byBidWlsZCB0b29sIHN0YXRlIGZv
ciB0b29sICIlcyIgdXNpbmcgc3RhbmRhcj0KZCBtZXRob2QsIHdpbGwgdHJ5IHRvIGZhbGwgYmFj
ayBvbiBjdXN0b20gbWV0aG9kOiAlcycsIHRvb2wuaWQsIGUgKQogICAgIGlucHV0cyA9M0QgdG9v
bC5pbnB1dHNfYnlfcGFnZVsgMCBdCiAgICAgY29udGV4dCA9M0QgRXhwcmVzc2lvbkNvbnRleHQo
IHN0YXRlLmlucHV0cywgcGFyZW50PTNETm9uZSApCiAgICAgZm9yIGlucHV0IGluIGlucHV0cy5p
dGVydmFsdWVzKCk6CiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHN0YXRlLmlucHV0c1sgaW5w
dXQubmFtZSBdID0zRCBpbnB1dC5nZXRfaW5pdGlhbF92YWx1ZSggdHJhbnMsPQogY29udGV4dCAp
CiAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICMgRklYTUU6IG5vdCBhbGwgdmFsdWVzIHNo
b3VsZCBiZSBhbiBlbXB0eSBsaXN0CiAgICAgICAgICAgICBzdGF0ZS5pbnB1dHNbIGlucHV0Lm5h
bWUgXSA9M0QgW10KICAgICByZXR1cm4gc3RhdGUKPTIwCgoKaHR0cHM6Ly9iaXRidWNrZXQub3Jn
L2dhbGF4eS9nYWxheHktY2VudHJhbC9jb21taXRzL2NlOTdhN2IyMDk0ZS8KQ2hhbmdlc2V0OiAg
IGNlOTdhN2IyMDk0ZQpCcmFuY2g6ICAgICAgcmVsZWFzZV8xNS4wMwpVc2VyOiAgICAgICAgZGFu
CkRhdGU6ICAgICAgICAyMDE1LTAzLTI2IDE1OjQ3OjU4KzAwOjAwClN1bW1hcnk6ICAgICBSZS1l
bmFibGUgSUdWIGxvY2FsIGV4dGVybmFsIGRpc3BsYXkgYXBwbGljYXRpb24gYnkgZGVmYXVsdC4g
QT0KZGQgaGczOCBhcyBhdmFpbGFibGUgZ2Vub21lLiBXZSBzaG91bGQgcHJvYmFibHkgdXBkYXRl
IHRoaXMgdmlldyB0byBlaXRoZXIgPQphbGxvdyBhbnkgZ2Vub21lIG9yIHRvIGZ1bmN0aW9uIGxp
a2UgdGhlIGN1cnJlbnQgd2ViX2xpbmtfbWFpbi4KQWZmZWN0ZWQgIzogIDEgZmlsZQoKZGlmZiAt
ciBjYWFkZThiY2M3M2ZmNzEzZmNlYzhjYjEwY2M4MDg5NmJhNjU0MjY2IC1yIGNlOTdhN2IyMDk0
ZTE3ODQ0MzY1MzgxPQowZTE5YzkxOTViOGQ5MTliZiB0b29sLWRhdGEvc2hhcmVkL2lndi9pZ3Zf
YnVpbGRfc2l0ZXMudHh0LnNhbXBsZQotLS0gYS90b29sLWRhdGEvc2hhcmVkL2lndi9pZ3ZfYnVp
bGRfc2l0ZXMudHh0LnNhbXBsZQorKysgYi90b29sLWRhdGEvc2hhcmVkL2lndi9pZ3ZfYnVpbGRf
c2l0ZXMudHh0LnNhbXBsZQpAQCAtMSw0ICsxLDQgQEAKICNzaXRlX2lkCXNpdGVfbmFtZQlzaXRl
X3VybAlkYmtleQlpdmdfYnVpbGRfbmFtZQogd2ViX2xpbmtfbWFpbgl3ZWIgY3VycmVudAlodHRw
Oi8vd3d3LmJyb2FkaW5zdGl0dXRlLm9yZy9pZ3YvcHJvamVjdHMvY3VycmU9Cm50L2lndi5waHAJ
aGdfZzFrX3YzNwliMzcKICN3ZWJfam5scF8xLjUJd2ViIDEuNQlodHRwOi8vd3d3LmJyb2FkaW5z
dGl0dXRlLm9yZy9pZ3ZkYXRhL2p3cy9wcm9kCWhnMTksPQpoZ19nMWtfdjM3LGhnMTgsMWtnX3Jl
ZixoZzE3LGhnMTYsbW05LG1tOCxtbTcscGFuVHJvMixyaGVNYWMyLHJuNCxjYW5GYW0yLGI9Cm9z
VGF1Nixib3NUYXU0LGJvc1RhdTMsc3VzU2Nyb2ZhLGdhbEdhbDMsY2F2UG9yMyxtb25Eb201LHhl
blRybzIsdGFlR3V0MSx6ZT0KYnJhZmlzaCxkYW5SZXI2LGRhblJlcjcsZ2FzQWN1MSxBcGx5c2lh
LFBsYXNtb2RpdW1fM0Q3X3YyLjEsUGxhc21vZGl1bV8zRDdfPQp2NS41LFBsYXNtb2RpdW1fNi4x
LFBsYXNtb0RCXzcuMCxwdml2YXgsR1NNNTUyOTEwLHNhY0NlcjEsc2FjQ2VyMixzazEsWTU1LHM9
CmFjQ2VyNjIsc3BvbWJlXzcwOSxzcG9tYmVfMS41NSxjYW5kaWRhLG1nOCxzcHVyXzIuMSxzcHVy
XzIuNSxzcHVyXzMuMCxXUzIwMT0KLGNlNixjZTQsZG0zLGRtMixkbWVsXzUuOSxkbWVsX3I1LjIy
LGRtZWxfcjUuMzMsdGNhc18yLjAsdGNhc18zLjAsbmNyYXNzYV92PQozLG5jMTAsR2xhbWJsaWFf
Mi4wLG1lNDksdGI5MjcsdGJnYW1iaSxsbWpyLGFuaWR1bGFuc180LjEsTkNfMDA5MDEyLFUwMDA5
Ni49CjIsTkNfMDAwOTEzLjIsTkNfMDAyNjU1LjIsQ1NhdmlnbnlpX3YyLjEsdGFpcjgsdGFpcjks
dGFpcjEwLE9fU2F0aXZhX3I2LG9zYT0KdGl2YV82LjEsQjczLFptQjczXzVhLHBwYXRlbnNfMS4y
LEQuZGlzY29pZGV1bQloZzE5LGIzNyxoZzE4LDFrZ19yZWYsaGcxNyxoPQpnMTYsbW05LG1tOCxt
bTcscGFuVHJvMixyaGVNYWMyLHJuNCxjYW5GYW0yLGJvc1RhdTYsYm9zVGF1NCxib3NUYXUzLHN1
c1Njcm89CmZhLGdhbEdhbDMsY2F2UG9yMyxtb25Eb201LHhlblRybzIsdGFlR3V0MSx6ZWJyYWZp
c2gsZGFuUmVyNixkYW5SZXI3LGdhc0FjdT0KMSxBcGx5c2lhLFBsYXNtb2RpdW1fM0Q3X3YyLjEs
UGxhc21vZGl1bV8zRDdfdjUuNSxQbGFzbW9kaXVtXzYuMSxQbGFzbW9EQl83PQouMCxwdml2YXgs
R1NNNTUyOTEwLHNhY0NlcjEsc2FjQ2VyMixzazEsWTU1LHNhY0NlcjYyLHNwb21iZV83MDksc3Bv
bWJlXzEuNTU9CixjYW5kaWRhLG1nOCxzcHVyXzIuMSxzcHVyXzIuNSxzcHVyXzMuMCxXUzIwMSxj
ZTYsY2U0LGRtMyxkbTIsZG1lbF81LjksZG1lbD0KX3I1LjIyLGRtZWxfcjUuMzMsdGNhc18yLjAs
dGNhc18zLjAsbmNyYXNzYV92MyxuYzEwLEdsYW1ibGlhXzIuMCxtZTQ5LHRiOTI3PQosdGJnYW1i
aSxsbWpyLGFuaWR1bGFuc180LjEsTkNfMDA5MDEyLFUwMDA5Ni4yLE5DXzAwMDkxMy4yLE5DXzAw
MjY1NS4yLENTYXY9CmlnbnlpX3YyLjEsdGFpcjgsdGFpcjksdGFpcjEwLE9fU2F0aXZhX3I2LG9z
YXRpdmFfNi4xLEI3MyxabUI3M181YSxwcGF0ZW5zXz0KMS4yLEQuZGlzY29pZGV1bQotI2xvY2Fs
X2RlZmF1bHQJbG9jYWwJaHR0cDovL2xvY2FsaG9zdDo2MDE1MS9sb2FkCWhnMTksaGdfZzFrX3Yz
NyxoZzE4LDFrZ189CnJlZixoZzE3LGhnMTYsbW05LG1tOCxtbTcscGFuVHJvMixyaGVNYWMyLHJu
NCxjYW5GYW0yLGJvc1RhdTYsYm9zVGF1NCxib3NUYT0KdTMsc3VzU2Nyb2ZhLGdhbEdhbDMsY2F2
UG9yMyxtb25Eb201LHhlblRybzIsdGFlR3V0MSx6ZWJyYWZpc2gsZGFuUmVyNixkYW5SPQplcjcs
Z2FzQWN1MSxBcGx5c2lhLFBsYXNtb2RpdW1fM0Q3X3YyLjEsUGxhc21vZGl1bV8zRDdfdjUuNSxQ
bGFzbW9kaXVtXzYuMSw9ClBsYXNtb0RCXzcuMCxwdml2YXgsR1NNNTUyOTEwLHNhY0NlcjEsc2Fj
Q2VyMixzazEsWTU1LHNhY0NlcjYyLHNwb21iZV83MDkscz0KcG9tYmVfMS41NSxjYW5kaWRhLG1n
OCxzcHVyXzIuMSxzcHVyXzIuNSxzcHVyXzMuMCxXUzIwMSxjZTYsY2U0LGRtMyxkbTIsZG1lPQps
XzUuOSxkbWVsX3I1LjIyLGRtZWxfcjUuMzMsdGNhc18yLjAsdGNhc18zLjAsbmNyYXNzYV92Myxu
YzEwLEdsYW1ibGlhXzIuMCw9Cm1lNDksdGI5MjcsdGJnYW1iaSxsbWpyLGFuaWR1bGFuc180LjEs
TkNfMDA5MDEyLFUwMDA5Ni4yLE5DXzAwMDkxMy4yLE5DXzAwMj0KNjU1LjIsQ1NhdmlnbnlpX3Yy
LjEsdGFpcjgsdGFpcjksdGFpcjEwLE9fU2F0aXZhX3I2LG9zYXRpdmFfNi4xLEI3MyxabUI3M181
PQphLHBwYXRlbnNfMS4yLEQuZGlzY29pZGV1bQloZzE5LGIzNyxoZzE4LDFrZ19yZWYsaGcxNyxo
ZzE2LG1tOSxtbTgsbW03LHBhblQ9CnJvMixyaGVNYWMyLHJuNCxjYW5GYW0yLGJvc1RhdTYsYm9z
VGF1NCxib3NUYXUzLHN1c1Njcm9mYSxnYWxHYWwzLGNhdlBvcjMsbT0Kb25Eb201LHhlblRybzIs
dGFlR3V0MSx6ZWJyYWZpc2gsZGFuUmVyNixkYW5SZXI3LGdhc0FjdTEsQXBseXNpYSxQbGFzbW9k
aXVtPQpfM0Q3X3YyLjEsUGxhc21vZGl1bV8zRDdfdjUuNSxQbGFzbW9kaXVtXzYuMSxQbGFzbW9E
Ql83LjAscHZpdmF4LEdTTTU1MjkxMCw9CnNhY0NlcjEsc2FjQ2VyMixzazEsWTU1LHNhY0NlcjYy
LHNwb21iZV83MDksc3BvbWJlXzEuNTUsY2FuZGlkYSxtZzgsc3B1cl8yLj0KMSxzcHVyXzIuNSxz
cHVyXzMuMCxXUzIwMSxjZTYsY2U0LGRtMyxkbTIsZG1lbF81LjksZG1lbF9yNS4yMixkbWVsX3I1
LjMzLHRjPQphc18yLjAsdGNhc18zLjAsbmNyYXNzYV92MyxuYzEwLEdsYW1ibGlhXzIuMCxtZTQ5
LHRiOTI3LHRiZ2FtYmksbG1qcixhbmlkdWw9CmFuc180LjEsTkNfMDA5MDEyLFUwMDA5Ni4yLE5D
XzAwMDkxMy4yLE5DXzAwMjY1NS4yLENTYXZpZ255aV92Mi4xLHRhaXI4LHRhaT0KcjksdGFpcjEw
LE9fU2F0aXZhX3I2LG9zYXRpdmFfNi4xLEI3MyxabUI3M181YSxwcGF0ZW5zXzEuMixELmRpc2Nv
aWRldW0KK2xvY2FsX2RlZmF1bHQJbG9jYWwJaHR0cDovL2xvY2FsaG9zdDo2MDE1MS9sb2FkCWhn
MzgsaGcxOSxoZ19nMWtfdjM3LGhnMTgsPQoxa2dfcmVmLGhnMTcsaGcxNixtbTksbW04LG1tNyxw
YW5Ucm8yLHJoZU1hYzIscm40LGNhbkZhbTIsYm9zVGF1Nixib3NUYXU0LGI9Cm9zVGF1MyxzdXNT
Y3JvZmEsZ2FsR2FsMyxjYXZQb3IzLG1vbkRvbTUseGVuVHJvMix0YWVHdXQxLHplYnJhZmlzaCxk
YW5SZXI2LD0KZGFuUmVyNyxnYXNBY3UxLEFwbHlzaWEsUGxhc21vZGl1bV8zRDdfdjIuMSxQbGFz
bW9kaXVtXzNEN192NS41LFBsYXNtb2RpdW1fPQo2LjEsUGxhc21vREJfNy4wLHB2aXZheCxHU001
NTI5MTAsc2FjQ2VyMSxzYWNDZXIyLHNrMSxZNTUsc2FjQ2VyNjIsc3BvbWJlXzc9CjA5LHNwb21i
ZV8xLjU1LGNhbmRpZGEsbWc4LHNwdXJfMi4xLHNwdXJfMi41LHNwdXJfMy4wLFdTMjAxLGNlNixj
ZTQsZG0zLGRtMj0KLGRtZWxfNS45LGRtZWxfcjUuMjIsZG1lbF9yNS4zMyx0Y2FzXzIuMCx0Y2Fz
XzMuMCxuY3Jhc3NhX3YzLG5jMTAsR2xhbWJsaWFfPQoyLjAsbWU0OSx0YjkyNyx0YmdhbWJpLGxt
anIsYW5pZHVsYW5zXzQuMSxOQ18wMDkwMTIsVTAwMDk2LjIsTkNfMDAwOTEzLjIsTkM9Cl8wMDI2
NTUuMixDU2F2aWdueWlfdjIuMSx0YWlyOCx0YWlyOSx0YWlyMTAsT19TYXRpdmFfcjYsb3NhdGl2
YV82LjEsQjczLFptQj0KNzNfNWEscHBhdGVuc18xLjIsRC5kaXNjb2lkZXVtCWhnMzgsaGcxOSxi
MzcsaGcxOCwxa2dfcmVmLGhnMTcsaGcxNixtbTksbW04PQosbW03LHBhblRybzIscmhlTWFjMixy
bjQsY2FuRmFtMixib3NUYXU2LGJvc1RhdTQsYm9zVGF1MyxzdXNTY3JvZmEsZ2FsR2FsMyw9CmNh
dlBvcjMsbW9uRG9tNSx4ZW5Ucm8yLHRhZUd1dDEsemVicmFmaXNoLGRhblJlcjYsZGFuUmVyNyxn
YXNBY3UxLEFwbHlzaWEsUD0KbGFzbW9kaXVtXzNEN192Mi4xLFBsYXNtb2RpdW1fM0Q3X3Y1LjUs
UGxhc21vZGl1bV82LjEsUGxhc21vREJfNy4wLHB2aXZheCxHPQpTTTU1MjkxMCxzYWNDZXIxLHNh
Y0NlcjIsc2sxLFk1NSxzYWNDZXI2MixzcG9tYmVfNzA5LHNwb21iZV8xLjU1LGNhbmRpZGEsbWc9
Cjgsc3B1cl8yLjEsc3B1cl8yLjUsc3B1cl8zLjAsV1MyMDEsY2U2LGNlNCxkbTMsZG0yLGRtZWxf
NS45LGRtZWxfcjUuMjIsZG1lbD0KX3I1LjMzLHRjYXNfMi4wLHRjYXNfMy4wLG5jcmFzc2FfdjMs
bmMxMCxHbGFtYmxpYV8yLjAsbWU0OSx0YjkyNyx0YmdhbWJpLGxtPQpqcixhbmlkdWxhbnNfNC4x
LE5DXzAwOTAxMixVMDAwOTYuMixOQ18wMDA5MTMuMixOQ18wMDI2NTUuMixDU2F2aWdueWlfdjIu
MSw9CnRhaXI4LHRhaXI5LHRhaXIxMCxPX1NhdGl2YV9yNixvc2F0aXZhXzYuMSxCNzMsWm1CNzNf
NWEscHBhdGVuc18xLjIsRC5kaXNjbz0KaWRldW0KCgpodHRwczovL2JpdGJ1Y2tldC5vcmcvZ2Fs
YXh5L2dhbGF4eS1jZW50cmFsL2NvbW1pdHMvMjJiMWRhOTIzMThkLwpDaGFuZ2VzZXQ6ICAgMjJi
MWRhOTIzMThkCkJyYW5jaDogICAgICByZWxlYXNlXzE1LjAzClVzZXI6ICAgICAgICBqbWNoaWx0
b24KRGF0ZTogICAgICAgIDIwMTUtMDQtMDYgMTY6Mzc6NDcrMDA6MDAKU3VtbWFyeTogICAgIEJ1
Z2ZpeGVzIGZvciBydW50aW1lIHBhcmFtZXRlciBoYW5kbGluZyBpbiB0aGUgd29ya2Zsb3cgcnVu
IGZvPQpybS4KClRoZSBiZWhhdmlvciBvZiB0aGVzZSBmb3JtcyB3YXMgbW9kaWZpZWQgaW4gUFIg
NDMzIChodHRwczovL2JpdGJ1Y2tldC5vcmcvZz0KYWxheHkvZ2FsYXh5LWNlbnRyYWwvcHVsbC1y
ZXF1ZXN0LzQzMy9maXgtYWxsb3ctZWRpdGluZy13b3JrZmxvd3Mtb24tdGhlLWZsPQp5LWZvci9k
aWZmIyAtIG5vdCBtZXJnZWQgYnkgbWUgOnwgKSAtIHNvIHRoYXQgdGhlIGVudGlyZSB3b3JrZmxv
dyB3b3VsZCBiZSA9CnN1Ym1pdHRlZCBhcyBydW50aW1lIHBhcmFtZXRlcnMgb24gZWFjaCBzdWJt
aXNzaW9uLgoKSW4gYWRkaXRpb24gdG8gdGhpcyBjYXVzaW5nIGJ1Z3MgcmVsYXRlZCB0byB1bnZh
bGlkYXRlZCBwYXJhbWV0ZXJzIGh0dHBzOi8vPQp0cmVsbG8uY29tL2MvNzJXdVo4bXUgYW5kIG90
aGVyIHByb2JsZW1zIHdpdGggc2VsZWN0IHBhcmFtZXRlcnMgKGUuZy4gaHR0cDo9Ci8vZGV2Lmxp
c3QuZ2FsYXh5cHJvamVjdC5vcmcvV29ya2Zsb3ctYnVnLXdoZW4tbG9jLWVudHJpZXMtYXJlLW1p
c3NpbmctdGM0Nj0KNjY4NzUuaHRtbCkgLSBJIGp1c3QgZGlzY292ZXJlZCBpdCB3b3VsZCBhbHNv
IGNhdXNlIHRoZSBtb2RpZmllZCB2YWx1ZSB0byBiPQplIHN1Ym1pdHRlZCBldmVuIGlmIHRoZSB1
c2VyIG9wdHMgdG8gdW5kbyB0aGUgc2VsZWN0aW9uIG9mIGEgcnVudGltZSB3b3JrZmw9Cm93IHBh
cmFtZXRlciBhbmQgcmVzdG9yZSB0aGUgcHJldmlvdXMgc2VsZWN0aW9uIChpLmUuIHRoZSBmb3Jt
IHdvdWxkIHNob3cgdD0KaGUgb3JpZ2luYWwgdmFsdWUgYnV0IHRoZSBuZXcgdmFsdWUgd291bGQg
YmUgc3VibWl0dGVkKS4KClRoaXMgUFIgcmVzdG9yZXMgdGhlIHByZXZpb3VzIGJlaGF2aW9yIG9m
IGdpdmluZyB0aGUgc3VibWl0dGVkIGZvcm0gZWxlbWVudD0KcyBhIHVuaXF1ZSBuYW1lIHNvIGV2
ZXJ5IHZhbHVlIGluIHRoZSB3b3JrZmxvdyBpcyBub3QgcmVwbGFjZWQgYXMgcGFydCBvZiB0PQpo
ZSBzdWJtaXNzaW9uIC0gZml4aW5nIHRoZSBmb3JtZXIgcHJvYmxlbS4gVGhlIG5ldyB0ZWNobmlx
dWUgYWxzbyBmaXhlcyB0aGU9CiBvdGhlciBwcm9ibGVtIGFzIHdlbGwuCkFmZmVjdGVkICM6ICAx
IGZpbGUKCmRpZmYgLXIgY2U5N2E3YjIwOTRlMTc4NDQzNjUzODEwZTE5YzkxOTViOGQ5MTliZiAt
ciAyMmIxZGE5MjMxOGRjZmZjY2FkMDA5OD0KYzkxYzc5YmZkNDJhOTU2MzEgdGVtcGxhdGVzL3dl
YmFwcHMvZ2FsYXh5L3dvcmtmbG93L3J1bi5tYWtvCi0tLSBhL3RlbXBsYXRlcy93ZWJhcHBzL2dh
bGF4eS93b3JrZmxvdy9ydW4ubWFrbworKysgYi90ZW1wbGF0ZXMvd2ViYXBwcy9nYWxheHkvd29y
a2Zsb3cvcnVuLm1ha28KQEAgLTE1NCwxMSArMTU0LDExIEBACj0yMAogICAgICAgICAgJCgiLndv
cmtmbG93LWVkaXQtYnV0dG9uIikub24oImNsaWNrIixmdW5jdGlvbigpewogICAgICAgICAgICAg
ICAgIHZhciBzdGF0ZSA9M0QgJCh0aGlzKS5hdHRyKCJuYW1lIik7Ci0gICAgICAgICAgICAgICAg
dmFyIHN0ZXBUb29sQm94ID0zRCAkKHRoaXMpLnBhcmVudCgpLmZpbmQoJ2lucHV0Om5vdChbY2xh
cz0Kc10pOm5vdChbdHlwZT0zRCJoaWRkZW4iXSksIHNlbGVjdDpub3QoW2NsYXNzXSknKTsKLSAg
ICAgICAgICAgICAgICB2YXIgbGFiZWxzID0zRCAkKHRoaXMpLnBhcmVudCgpLmZpbmQoJ2xhYmVs
Jyk7CisgICAgICAgICAgICAgICAgdmFyIHN0ZXBUb29sQm94ID0zRCAkKHRoaXMpLnBhcmVudCgp
LnBhcmVudCgpLmZpbmQoJy5lZGl0YT0KYmxlLXBhcmFtJykuZmluZCgnaW5wdXQ6bm90KFtjbGFz
c10pOm5vdChbdHlwZT0zRCJoaWRkZW4iXSksIHNlbGVjdDpub3QoW2NsPQphc3NdKScpOworICAg
ICAgICAgICAgICAgIHZhciBsYWJlbHMgPTNEICQodGhpcykucGFyZW50KCkucGFyZW50KCkuZmlu
ZCgnLmVkaXRhYmxlLXA9CmFyYW0nKS5maW5kKCdsYWJlbCcpOwogICAgICAgICAgICAgICAgIHZh
ciBzcGxpdF9uYW1lID0zRCBzdGVwVG9vbEJveC5hdHRyKCJuYW1lIikuc3BsaXQoInwiKTsKICAg
ICAgICAgICAgICAgICB2YXIgc3RlcF9pZCA9M0Qgc3BsaXRfbmFtZVswXTsKLSAgICAgICAgICAg
ICAgICB2YXIgc3RlcF9uYW1lID0zRCBzcGxpdF9uYW1lLnNsaWNlKDEsIHNwbGl0X25hbWUubGVu
Z3RoKS5qPQpvaW4oInwiKTsKKyAgICAgICAgICAgICAgICB2YXIgc3RlcF9uYW1lID0zRCBzcGxp
dF9uYW1lLnNsaWNlKDIsIHNwbGl0X25hbWUubGVuZ3RoKS5qPQpvaW4oInwiKTsKICAgICAgICAg
ICAgICAgICB2YXIgaGlkZGVuX2h0bWwgPTNEICI8aW5wdXQgdHlwZT0zRCdoaWRkZW4nIG5hbWU9
M0QnIitzdGVwPQpfaWQrInxfX3J1bnRpbWVfXyIrc3RlcF9uYW1lKyInIHZhbHVlPTNEJ3RydWUn
IC8+IjsKICAgICAgICAgICAgICAgICB2YXIgaHRtbCA9M0QgIiI7CiAgICAgICAgICAgICAgICAg
aWYgKHN0YXRlID0zRD0zRD0zRCAiZWRpdCIpewpAQCAtMTc5LDkgKzE3OSw5IEBACiAgICAgICAg
ICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2V7CiAgICAgICAgICAgICAgICAgICAgICQo
dGhpcykucGFyZW50KCkuZmluZCgiLmVkaXRhYmxlIikuaGlkZSgpOworICAgICAgICAgICAgICAg
ICAgICAkKHRoaXMpLnBhcmVudCgpLmZpbmQoIi5lZGl0YWJsZSIpLmVtcHR5KCk7CiAgICAgICAg
ICAgICAgICAgICAgICQodGhpcykucGFyZW50KCkucGFyZW50KCkuZmluZCgiLnVuZWRpdGFibGVf
ZmllbGQiKS5zaD0Kb3coKTsKICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5hdHRyKCJuYW1l
IiwgImVkaXQiKTsKLSAgICAgICAgICAgICAgICAgICAgc3RlcFRvb2xCb3guaGlkZSgpOwogICAg
ICAgICAgICAgICAgICAgICByZWFkeVBhcmFtZXRlcigkKHRoaXMpKTsKICAgICAgICAgICAgICAg
ICB9CiAgICAgICAgICAgICB9KS5lYWNoKGZ1bmN0aW9uKGksIGljb24pIHsKQEAgLTI4MSw2ICsy
ODEsOSBAQAogICAgIC5lZGl0YWJsZSB7CiAgICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgfQor
ICAgIC5lZGl0YWJsZS1wYXJhbSB7CisgICAgICAgIGRpc3BsYXk6IG5vbmU7CisgICAgfQo9MjAK
ICAgICAud29ya2Zsb3ctZWRpdC1idXR0b24tZWRpdGluZyB7CiAgICAgICAgIGNvbG9yOiBibGFj
azsKQEAgLTQ0OCwxMSArNDUxLDE3IEBACiAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj48c3Bh
biBjbGFzcz0zRCJlZGl0YWJsZV9maWVsZCI+PHNwYW4gY2xhc3M9M0QiZT0KZGl0YWJsZSI+Ci0g
ICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtwYXJhbS5nZXRfaHRtbF9maWVsZCggdCwgdmFs
dWUsIG90aGVyX3ZhbHVlcz0KKS5nZXRfaHRtbCggc3RyKHN0ZXAuaWQpICsgInwiKyBwcmVmaXgg
KX0KICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj48aSBjbGFzcz0zRCJmYSB3b3JrZmxv
dy1lZGl0LWJ1dHRvbiI+PC9pPjwvPQpzcGFuPgorICAgICAgICAgICAgICAgICAgICA8c3BhbiBj
bGFzcz0zRCJlZGl0YWJsZS1wYXJhbSI+CisgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFBy
aXN0aW5lIHZhcmlhbnQgb2YgcGFyYW0sIHRoaXMgd2lsbCBiZSBjbG9uZWQKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgYW5kIG1vZGlmaWVkIHdoZW4gdGhlIHVzZXIgb3B0cyB0byBtYWtl
IHRoaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWRpdGFibGUuCisgICAgICAgICAg
ICAgICAgICAgICAgICAtLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICR7cGFyYW0uZ2V0X2h0
bWxfZmllbGQoIHQsIHZhbHVlLCBvdGhlcl92YWx1ZXMpLmdlPQp0X2h0bWwoIHN0cihzdGVwLmlk
KSArICJ8IisgImVkaXRhYmxlIiArICJ8IiArIHByZWZpeCApfQorICAgICAgICAgICAgICAgICAg
ICA8L3NwYW4+PC9zcGFuPgogICAgICAgICAgICAgICAgICVlbmRpZgogICAgICAgICAgICAgJWVu
ZGlmCgoKaHR0cHM6Ly9iaXRidWNrZXQub3JnL2dhbGF4eS9nYWxheHktY2VudHJhbC9jb21taXRz
L2M4ZTU4MWQwZDVlYi8KQ2hhbmdlc2V0OiAgIGM4ZTU4MWQwZDVlYgpCcmFuY2g6ICAgICAgcmVs
ZWFzZV8xNS4wMwpVc2VyOiAgICAgICAgY2FybGZlYmVyaGFyZApEYXRlOiAgICAgICAgMjAxNS0w
NC0wNiAxODo0NDoyMSswMDowMApTdW1tYXJ5OiAgICAgRml4OiBkYXRhc2V0cy5wdXJnZV9hc3lu
Yy9fcHVyZ2UgdG8gYWxsb3cgcHVyZ2luZyBoZGFzIHdpdGhpbiA9Cm5vbi1jdXJyZW50IGhpc3Rv
cmllcwpBZmZlY3RlZCAjOiAgMSBmaWxlCgpkaWZmIC1yIDIyYjFkYTkyMzE4ZGNmZmNjYWQwMDk4
YzkxYzc5YmZkNDJhOTU2MzEgLXIgYzhlNTgxZDBkNWViNTVlZjMzMjNjMTg9CjEwMDRmOWY3OGQz
YjJhYzE3IGxpYi9nYWxheHkvd2ViYXBwcy9nYWxheHkvY29udHJvbGxlcnMvZGF0YXNldC5weQot
LS0gYS9saWIvZ2FsYXh5L3dlYmFwcHMvZ2FsYXh5L2NvbnRyb2xsZXJzL2RhdGFzZXQucHkKKysr
IGIvbGliL2dhbGF4eS93ZWJhcHBzL2dhbGF4eS9jb250cm9sbGVycy9kYXRhc2V0LnB5CkBAIC04
NTIsMjIgKzg1MiwyNCBAQAogICAgICAgICBzdGF0dXMgPTNEICdkb25lJwogICAgICAgICB0cnk6
CiAgICAgICAgICAgICBpZCA9M0QgdHJhbnMuYXBwLnNlY3VyaXR5LmRlY29kZV9pZCggZGF0YXNl
dF9pZCApCi0gICAgICAgICAgICBoaXN0b3J5ID0zRCB0cmFucy5nZXRfaGlzdG9yeSgpCiAgICAg
ICAgICAgICB1c2VyID0zRCB0cmFucy5nZXRfdXNlcigpCiAgICAgICAgICAgICBoZGEgPTNEIHRy
YW5zLnNhX3Nlc3Npb24ucXVlcnkoIHNlbGYuYXBwLm1vZGVsLkhpc3RvcnlEYXRhc2V0QT0Kc3Nv
Y2lhdGlvbiApLmdldCggaWQgKQogICAgICAgICAgICAgIyBJbnZhbGlkIEhEQQogICAgICAgICAg
ICAgYXNzZXJ0IGhkYSwgJ0ludmFsaWQgaGlzdG9yeSBkYXRhc2V0IElEJworCiAgICAgICAgICAg
ICAjIFdhbGsgdXAgcGFyZW50IGRhdGFzZXRzIHRvIGZpbmQgdGhlIGNvbnRhaW5pbmcgaGlzdG9y
eQorICAgICAgICAgICAgaGlzdG9yeSA9M0QgdHJhbnMuZ2V0X2hpc3RvcnkoKQogICAgICAgICAg
ICAgdG9wbW9zdF9wYXJlbnQgPTNEIGhkYQogICAgICAgICAgICAgd2hpbGUgdG9wbW9zdF9wYXJl
bnQucGFyZW50OgogICAgICAgICAgICAgICAgIHRvcG1vc3RfcGFyZW50ID0zRCB0b3Btb3N0X3Bh
cmVudC5wYXJlbnQKLSAgICAgICAgICAgIGFzc2VydCB0b3Btb3N0X3BhcmVudCBpbiBoaXN0b3J5
LmRhdGFzZXRzLCAiRGF0YSBkb2VzIG5vdCBiZWxvPQpuZyB0byBjdXJyZW50IGhpc3RvcnkiCiAg
ICAgICAgICAgICAjIElmIHRoZSB1c2VyIGlzIGFub255bW91cywgbWFrZSBzdXJlIHRoZSBIREEg
aXMgb3duZWQgYnkgdGhlID0KY3VycmVudCBzZXNzaW9uLgogICAgICAgICAgICAgaWYgbm90IHVz
ZXI6Ci0gICAgICAgICAgICAgICAgYXNzZXJ0IHRyYW5zLmdhbGF4eV9zZXNzaW9uLmN1cnJlbnRf
aGlzdG9yeV9pZCA9M0Q9M0QgdHJhbj0Kcy5oaXN0b3J5LmlkLCAnSW52YWxpZCBoaXN0b3J5IGRh
dGFzZXQgSUQnCisgICAgICAgICAgICAgICAgY3VycmVudF9oaXN0b3J5X2lkID0zRCB0cmFucy5n
YWxheHlfc2Vzc2lvbi5jdXJyZW50X2hpc3Rvcj0KeV9pZAorICAgICAgICAgICAgICAgIGFzc2Vy
dCB0b3Btb3N0X3BhcmVudC5oaXN0b3J5LmlkID0zRD0zRCBjdXJyZW50X2hpc3RvcnlfaWQ9Ciwg
J0RhdGEgZG9lcyBub3QgYmVsb25nIHRvIGN1cnJlbnQgdXNlcicKICAgICAgICAgICAgICMgSWYg
dGhlIHVzZXIgaXMga25vd24sIG1ha2Ugc3VyZSB0aGUgSERBIGlzIG93bmVkIGJ5IHRoZSBjdXJy
PQplbnQgdXNlci4KICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgYXNzZXJ0IHRv
cG1vc3RfcGFyZW50Lmhpc3RvcnkudXNlciA9M0Q9M0QgdHJhbnMudXNlciwgJ0ludj0KYWxpZCBo
aXN0b3J5IGRhdGFzZXQgSUQnCisgICAgICAgICAgICAgICAgYXNzZXJ0IHRvcG1vc3RfcGFyZW50
Lmhpc3RvcnkudXNlciA9M0Q9M0QgdXNlciwgJ0RhdGEgZG9lcz0KIG5vdCBiZWxvbmcgdG8gY3Vy
cmVudCB1c2VyJworCiAgICAgICAgICAgICAjIEVuc3VyZSBIREEgaXMgZGVsZXRlZAogICAgICAg
ICAgICAgaGRhLmRlbGV0ZWQgPTNEIFRydWUKICAgICAgICAgICAgICMgSERBIGlzIHB1cmdlYWJs
ZQpAQCAtODkwLDggKzg5Miw4IEBACiAgICAgICAgICAgICAgICAgZXhjZXB0OgogICAgICAgICAg
ICAgICAgICAgICBsb2cuZXhjZXB0aW9uKCAnVW5hYmxlIHRvIHB1cmdlIGRhdGFzZXQgKCVzKSBv
biBwdXJnZSA9Cm9mIEhEQSAoJXMpOicgJSAoIGhkYS5kYXRhc2V0LmlkLCBoZGEuaWQgKSApCiAg
ICAgICAgICAgICB0cmFucy5zYV9zZXNzaW9uLmZsdXNoKCkKLSAgICAgICAgZXhjZXB0IEV4Y2Vw
dGlvbjoKLSAgICAgICAgICAgIG1zZyA9M0QgJ0hEQSBwdXJnZSBmYWlsZWQgKGVuY29kZWQ6ICVz
LCBkZWNvZGVkOiAlcyknICUgKCBkYXRhPQpzZXRfaWQsIGlkICkKKyAgICAgICAgZXhjZXB0IEV4
Y2VwdGlvbiwgZXhjOgorICAgICAgICAgICAgbXNnID0zRCAnSERBIHB1cmdlIGZhaWxlZCAoZW5j
b2RlZDogJXMsIGRlY29kZWQ6ICVzKTogJXMnICUgKCA9CmRhdGFzZXRfaWQsIGlkLCBleGMgKQog
ICAgICAgICAgICAgbG9nLmV4Y2VwdGlvbiggbXNnICkKICAgICAgICAgICAgIHRyYW5zLmxvZ19l
dmVudCggbXNnICkKICAgICAgICAgICAgIG1lc3NhZ2UgPTNEICdEYXRhc2V0IHJlbW92YWwgZnJv
bSBkaXNrIGZhaWxlZCcKCgpodHRwczovL2JpdGJ1Y2tldC5vcmcvZ2FsYXh5L2dhbGF4eS1jZW50
cmFsL2NvbW1pdHMvN2IwYzMyODI4Mjk4LwpDaGFuZ2VzZXQ6ICAgN2IwYzMyODI4Mjk4CkJyYW5j
aDogICAgICByZWxlYXNlXzE1LjAzClVzZXI6ICAgICAgICBndWVybGVyCkRhdGU6ICAgICAgICAy
MDE1LTA0LTA3IDE4OjExOjM5KzAwOjAwClN1bW1hcnk6ICAgICBGaXggcmUtcnVuIG9wdGlvbiBm
b3IgZGF0YSBtYW5hZ2VyIHRvb2xzCkFmZmVjdGVkICM6ICAxIGZpbGUKCmRpZmYgLXIgYzhlNTgx
ZDBkNWViNTVlZjMzMjNjMTgxMDA0ZjlmNzhkM2IyYWMxNyAtciA3YjBjMzI4MjgyOTg0NDEwNjdh
ZDZmMj0KMDNjMzgwNTA5Y2YxNjlkYzQgdGVtcGxhdGVzL3dlYmFwcHMvZ2FsYXh5L3Rvb2xfZm9y
bS5tYWtvCi0tLSBhL3RlbXBsYXRlcy93ZWJhcHBzL2dhbGF4eS90b29sX2Zvcm0ubWFrbworKysg
Yi90ZW1wbGF0ZXMvd2ViYXBwcy9nYWxheHkvdG9vbF9mb3JtLm1ha28KQEAgLTEwLDYgKzEwLDcg
QEAKICAgICAgICAgIyMgVGhpcyBhdm9pZHMgbWFraW5nIHR3byBzZXBhcmF0ZSByZXF1ZXN0cyBz
aW5jZSB0aGUgY2xhc3NpYyBmb3JtPQogcmVxdWlyZXMgdGhlIG1ha28gYW55d2F5LgogICAgICAg
ICBwYXJhbXMgPTNEIGRpY3QodHJhbnMucmVxdWVzdC5wYXJhbXMpCiAgICAgICAgIHBhcmFtc1sn
X19kYXRhc2V0X2lkX18nXSA9M0QgcGFyYW1zLmdldCgnaWQnLCBOb25lKQorICAgICAgICBwYXJh
bXNbJ19fam9iX2lkX18nXSA9M0QgcGFyYW1zLmdldCgnam9iX2lkJywgTm9uZSkKICAgICAgICAg
c2VsZi5mb3JtX2NvbmZpZyA9M0QgdG9vbC50b19qc29uKHRyYW5zLCBwYXJhbXMpCiAgICAgICAg
IHNlbGYuZm9ybV9jb25maWcudXBkYXRlKHsKICAgICAgICAgICAgICdpZCcgICAgICAgICAgICAg
ICAgOiB0b29sLmlkLAoKCmh0dHBzOi8vYml0YnVja2V0Lm9yZy9nYWxheHkvZ2FsYXh5LWNlbnRy
YWwvY29tbWl0cy80YWU3OGU0MGQyNDcvCkNoYW5nZXNldDogICA0YWU3OGU0MGQyNDcKQnJhbmNo
OiAgICAgIHJlbGVhc2VfMTUuMDMKVXNlcjogICAgICAgIGptY2hpbHRvbgpEYXRlOiAgICAgICAg
MjAxNS0wNC0wOCAxMzo0NzoxMCswMDowMApTdW1tYXJ5OiAgICAgRml4IGRvY3VtZW50YXRpb24g
Zm9yIHJlYWwgdXNlciBwYXJhbWV0ZXJzLgoKSSB0aGluayB3aGF0IHdhcyBkb2N1bWVudGVkIHdh
cyB0aGUgaWRlYWwgY2FzZSAtIHdoaWNoIHdvdWxkIGJlIGdyZWF0IGlmIHRoPQplc2UgY291bGQg
YmUgc2V0IHBlciBkZXN0aW5hdGlvbiAtIGJ1dCB0aGV5IGNhbm5vdCBiZSBzbyB0aGV5IHNob3Vs
ZG4ndCBiZSA9CmRvY3VtZW50ZWQgdGhhdCB3YXkuCgpEb2N1bWVudGF0aW9uIGJyb2tlbiBpbiBo
dHRwczovL2dpdGh1Yi5jb20vZ2FsYXh5cHJvamVjdC9nYWxheHkvY29tbWl0LzliNzc9Cjc1YmUw
MzcyOGY3MjRjMDI1YTgzYmM3ZmZhOWUyOGMyYzkzMi4KQWZmZWN0ZWQgIzogIDIgZmlsZXMKCmRp
ZmYgLXIgN2IwYzMyODI4Mjk4NDQxMDY3YWQ2ZjIwM2MzODA1MDljZjE2OWRjNCAtciA0YWU3OGU0
MGQyNDc1ZjUzNjMwMTRiZT0KYWQ2Y2M3NzJlZmM5OGQ0ZDUgY29uZmlnL2dhbGF4eS5pbmkuc2Ft
cGxlCi0tLSBhL2NvbmZpZy9nYWxheHkuaW5pLnNhbXBsZQorKysgYi9jb25maWcvZ2FsYXh5Lmlu
aS5zYW1wbGUKQEAgLTk2MCw2ICs5NjAsMTcgQEAKICMgYWx3YXlzLCBvbnN1Y2Nlc3MsIG5ldmVy
CiAjY2xlYW51cF9qb2IgPTNEIGFsd2F5cwo9MjAKKyMgRm9yIHNpdGVzIHdoZXJlIGFsbCB1c2Vy
cyBpbiBHYWxheHkgbWF0Y2ggdXNlcnMgb24gdGhlIHN5c3RlbSBvbiB3aGljaCBHPQphbGF4eQor
IyBydW5zLCB0aGUgRFJNQUEgam9iIHJ1bm5lciBjYW4gYmUgY29uZmlndXJlZCB0byBzdWJtaXQg
am9icyB0byB0aGUgRFJNIGE9CnMgdGhlCisjIGFjdHVhbCB1c2VyIGluc3RlYWQgb2YgYXMgdGhl
IHVzZXIgcnVubmluZyB0aGUgR2FsYXh5IHNlcnZlciBwcm9jZXNzLiAgRj0Kb3IKKyMgZGV0YWls
cyBvbiB0aGVzZSBvcHRpb25zLCBzZWUgdGhlIGRvY3VtZW50YXRpb24gYXQ6CisjCisjIGh0dHA6
Ly9nYWxheHlwcm9qZWN0Lm9yZy93aWtpL0FkbWluL0NvbmZpZy9QZXJmb3JtYW5jZS9DbHVzdGVy
CisjCisjZHJtYWFfZXh0ZXJuYWxfcnVuam9iX3NjcmlwdCA9M0Qgc2NyaXB0cy9kcm1hYV9leHRl
cm5hbF9ydW5uZXIucHkKKyNkcm1hYV9leHRlcm5hbF9raWxsam9iX3NjcmlwdCA9M0Qgc2NyaXB0
cy9kcm1hYV9leHRlcm5hbF9raWxsZXIucHkKKyNleHRlcm5hbF9jaG93bl9zY3JpcHQgPTNEIHNj
cmlwdHMvZXh0ZXJuYWxfY2hvd25fc2NyaXB0LnB5CisKICMgRmlsZSB0byBzb3VyY2UgdG8gc2V0
IHVwIHRoZSBlbnZpcm9ubWVudCB3aGVuIHJ1bm5pbmcgam9icy4gIEJ5IGRlZmF1bHQsPQogdGhl
CiAjIGVudmlyb25tZW50IGluIHdoaWNoIHRoZSBHYWxheHkgc2VydmVyIHN0YXJ0cyBpcyB1c2Vk
IHdoZW4gcnVubmluZyBqb2JzCiAjIGxvY2FsbHksIGFuZCB0aGUgZW52aXJvbm1lbnQgc2V0IHVw
IHBlciB0aGUgRFJNJ3Mgc3VibWlzc2lvbiBtZXRob2QgYW5kCgpkaWZmIC1yIDdiMGMzMjgyODI5
ODQ0MTA2N2FkNmYyMDNjMzgwNTA5Y2YxNjlkYzQgLXIgNGFlNzhlNDBkMjQ3NWY1MzYzMDE0YmU9
CmFkNmNjNzcyZWZjOThkNGQ1IGNvbmZpZy9qb2JfY29uZi54bWwuc2FtcGxlX2FkdmFuY2VkCi0t
LSBhL2NvbmZpZy9qb2JfY29uZi54bWwuc2FtcGxlX2FkdmFuY2VkCisrKyBiL2NvbmZpZy9qb2Jf
Y29uZi54bWwuc2FtcGxlX2FkdmFuY2VkCkBAIC0yNTIsMTAgKzI1Miw3IEBACiAgICAgICAgICAg
LS0+PC9kZXN0aW5hdGlvbj48ZGVzdGluYXRpb24gaWQ9M0QicmVhbF91c2VyX2NsdXN0ZXIiIHJ1
bm5lcj0zRD0KImRybWFhIj4KLSAgICAgICAgICAgIDwhLS0gVE9ETzogVGhlIHJlYWwgdXNlciBv
cHRpb25zIHNob3VsZCBtYXliZSBub3QgYmUgY29uc2lkZXJlPQpkIHJ1bm5lciBwYXJhbXMuIC0t
PgotICAgICAgICAgICAgPHBhcmFtIGlkPTNEImdhbGF4eV9leHRlcm5hbF9ydW5qb2Jfc2NyaXB0
Ij5zY3JpcHRzL2RybWFhX2V4dGU9CnJuYWxfcnVubmVyLnB5PC9wYXJhbT4KLSAgICAgICAgICAg
IDxwYXJhbSBpZD0zRCJnYWxheHlfZXh0ZXJuYWxfa2lsbGpvYl9zY3JpcHQiPnNjcmlwdHMvZHJt
YWFfZXh0PQplcm5hbF9raWxsZXIucHk8L3BhcmFtPgotICAgICAgICAgICAgPHBhcmFtIGlkPTNE
ImdhbGF4eV9leHRlcm5hbF9jaG93bl9zY3JpcHQiPnNjcmlwdHMvZXh0ZXJuYWxfY2g9Cm93bl9z
Y3JpcHQucHk8L3BhcmFtPgorICAgICAgICAgICAgPCEtLSBNYWtlIHN1cmUgdG8gc2V0dXAgMyBy
ZWFsIHVzZXIgcGFyYW1ldGVycyBpbiBnYWxheHkuaW5pLiA9Ci0tPjwvZGVzdGluYXRpb24+PGRl
c3RpbmF0aW9uIGlkPTNEImR5bmFtaWMiIHJ1bm5lcj0zRCJkeW5hbWljIj48IS0tIEEgZGVzdD0K
aW5hdGlvbiB0aGF0IHJlcHJlc2VudHMgYSBtZXRob2QgaW4gdGhlIGR5bmFtaWMgcnVubmVyLiAt
LT4KCgpodHRwczovL2JpdGJ1Y2tldC5vcmcvZ2FsYXh5L2dhbGF4eS1jZW50cmFsL2NvbW1pdHMv
NDc0NDQ1MWEzNDA2LwpDaGFuZ2VzZXQ6ICAgNDc0NDQ1MWEzNDA2CkJyYW5jaDogICAgICByZWxl
YXNlXzE1LjAzClVzZXI6ICAgICAgICBkYW5ub24KRGF0ZTogICAgICAgIDIwMTUtMDQtMDggMTY6
NTA6MzQrMDA6MDAKU3VtbWFyeTogICAgIFBvdGVudGlhbCBmaXggZm9yIHJlY2VudCB1d3NnaSB0
b29sc2hlZCBkYXRhYmFzZSBpc3N1ZXMuICBJbiBhPQpueSBldmVudCwgdGhpcyBjdXJyZW50IHBv
b2wgZGlzcG9zYWwgaXMgZGVmaW5pdGVseSBicm9rZW4gKGFuZCBoaWRkZW4gZnJvbSA9CnZpZXcg
ZHVlIHRvIGJsYW5rZXQgcGFzc2luZyBleGNlcHQpIGluIHRoZSBjdXJyZW50IGltcGxlbWVudGF0
aW9uLgpBZmZlY3RlZCAjOiAgMSBmaWxlCgpkaWZmIC1yIDRhZTc4ZTQwZDI0NzVmNTM2MzAxNGJl
YWQ2Y2M3NzJlZmM5OGQ0ZDUgLXIgNDc0NDQ1MWEzNDA2MzhhNjMwMWZmMzA9CmQ3N2QyNGI1N2E0
MWJkZjIwIGxpYi9nYWxheHkvd2ViYXBwcy90b29sX3NoZWQvYnVpbGRhcHAucHkKLS0tIGEvbGli
L2dhbGF4eS93ZWJhcHBzL3Rvb2xfc2hlZC9idWlsZGFwcC5weQorKysgYi9saWIvZ2FsYXh5L3dl
YmFwcHMvdG9vbF9zaGVkL2J1aWxkYXBwLnB5CkBAIC0xNTMsOSArMTUzLDkgQEAKICAgICAgICAg
ICAgIHdlYmFwcCA9M0Qgd3JhcF9pbl9zdGF0aWMoIHdlYmFwcCwgZ2xvYmFsX2NvbmYsICoqa3dh
cmdzICkKICAgICAjIENsb3NlIGFueSBwb29sZWQgZGF0YWJhc2UgY29ubmVjdGlvbnMgYmVmb3Jl
IGZvcmtpbmcKICAgICB0cnk6Ci0gICAgICAgIGdhbGF4eS53ZWJhcHBzLnRvb2xfc2hlZC5tb2Rl
bC5tYXBwaW5nLm1ldGFkYXRhLmVuZ2luZS5jb25uZWN0aW9uXz0KcHJvdmlkZXIuX3Bvb2wuZGlz
cG9zZSgpCisgICAgICAgIGdhbGF4eS53ZWJhcHBzLnRvb2xfc2hlZC5tb2RlbC5tYXBwaW5nLm1l
dGFkYXRhLmJpbmQuZGlzcG9zZSgpCiAgICAgZXhjZXB0OgotICAgICAgICBwYXNzCisgICAgICAg
IGxvZy5leGNlcHRpb24oIlVuYWJsZSB0byBkaXNwb3NlIG9mIHBvb2xlZCB0b29sX3NoZWQgbW9k
ZWwgZGF0YWJhcz0KZSBjb25uZWN0aW9ucy4iKQogICAgICMgUmV0dXJuCiAgICAgcmV0dXJuIHdl
YmFwcAo9MjAKCgpodHRwczovL2JpdGJ1Y2tldC5vcmcvZ2FsYXh5L2dhbGF4eS1jZW50cmFsL2Nv
bW1pdHMvZGNlZTIwN2ViYWRhLwpDaGFuZ2VzZXQ6ICAgZGNlZTIwN2ViYWRhCkJyYW5jaDogICAg
ICByZWxlYXNlXzE1LjAzClVzZXI6ICAgICAgICBkYW5ub24KRGF0ZTogICAgICAgIDIwMTUtMDQt
MDggMTY6NTM6MzIrMDA6MDAKU3VtbWFyeTogICAgIFNpbWlsYXIgZml4IGFzIHRoZSBwcmV2aW91
cyAtLSBHYWxheHkgd2Fzbid0IGRpc3Bvc2luZyBvZiBwb29sPQplZCBjb25uZWN0aW9ucyBwcmlv
ciB0byByZXR1cm5pbmcgd2ViYXBwIGFuZCAocG90ZW50aWFsKSBmb3JraW5nLgpBZmZlY3RlZCAj
OiAgMSBmaWxlCgpkaWZmIC1yIDQ3NDQ0NTFhMzQwNjM4YTYzMDFmZjMwZDc3ZDI0YjU3YTQxYmRm
MjAgLXIgZGNlZTIwN2ViYWRhNGI5YjNiYTM1ZTQ9CmI5N2VhMjQwMTg4YjFjNmNiIGxpYi9nYWxh
eHkvd2ViYXBwcy9nYWxheHkvYnVpbGRhcHAucHkKLS0tIGEvbGliL2dhbGF4eS93ZWJhcHBzL2dh
bGF4eS9idWlsZGFwcC5weQorKysgYi9saWIvZ2FsYXh5L3dlYmFwcHMvZ2FsYXh5L2J1aWxkYXBw
LnB5CkBAIC0xMDYsMTMgKzEwNiwxMyBAQAogICAgICAgICBwYWNrX3NjcmlwdHMoKQogICAgICMg
Q2xvc2UgYW55IHBvb2xlZCBkYXRhYmFzZSBjb25uZWN0aW9ucyBiZWZvcmUgZm9ya2luZwogICAg
IHRyeToKLSAgICAgICAgZ2FsYXh5Lm1vZGVsLm1hcHBpbmcubWV0YWRhdGEuZW5naW5lLmNvbm5l
Y3Rpb25fcHJvdmlkZXIuX3Bvb2wuZGlzPQpwb3NlKCkKKyAgICAgICAgZ2FsYXh5Lm1vZGVsLm1h
cHBpbmcubWV0YWRhdGEuYmluZC5kaXNwb3NlKCkKICAgICBleGNlcHQ6Ci0gICAgICAgIHBhc3MK
KyAgICAgICAgbG9nLmV4Y2VwdGlvbigiVW5hYmxlIHRvIGRpc3Bvc2Ugb2YgcG9vbGVkIGdhbGF4
eSBtb2RlbCBkYXRhYmFzZSBjPQpvbm5lY3Rpb25zLiIpCiAgICAgdHJ5OgotICAgICAgICBnYWxh
eHkubW9kZWwudG9vbF9zaGVkX2luc3RhbGwubWFwcGluZy5tZXRhZGF0YS5lbmdpbmUuY29ubmVj
dGlvbl89CnByb3ZpZGVyLl9wb29sLmRpc3Bvc2UoKQorICAgICAgICBnYWxheHkubW9kZWwudG9v
bF9zaGVkX2luc3RhbGwubWFwcGluZy5tZXRhZGF0YS5iaW5kLmRpc3Bvc2UoKQogICAgIGV4Y2Vw
dDoKLSAgICAgICAgcGFzcworICAgICAgICBsb2cuZXhjZXB0aW9uKCJVbmFibGUgdG8gZGlzcG9z
ZSBvZiBwb29sZWQgdG9vbHNoZWQgaW5zdGFsbCBtb2RlbCA9CmRhdGFiYXNlIGNvbm5lY3Rpb25z
LiIpCj0yMAogICAgIGlmIG5vdCBhcHAuY29uZmlnLmlzX3V3c2dpOgogICAgICAgICBwb3N0Zm9y
a19zZXR1cCgpCgoKaHR0cHM6Ly9iaXRidWNrZXQub3JnL2dhbGF4eS9nYWxheHktY2VudHJhbC9j
b21taXRzL2Y4OTFjZjVmNWFhNC8KQ2hhbmdlc2V0OiAgIGY4OTFjZjVmNWFhNApCcmFuY2g6ICAg
ICAgcmVsZWFzZV8xNS4wMwpVc2VyOiAgICAgICAgZGFubm9uCkRhdGU6ICAgICAgICAyMDE1LTA0
LTA4IDE4OjQ2OjU1KzAwOjAwClN1bW1hcnk6ICAgICBBbm90aGVyIHBvb2wgZGlzcG9zYWwgZml4
LCBmb3IgcmVwb3J0cy4KQWZmZWN0ZWQgIzogIDEgZmlsZQoKZGlmZiAtciBkY2VlMjA3ZWJhZGE0
YjliM2JhMzVlNGI5N2VhMjQwMTg4YjFjNmNiIC1yIGY4OTFjZjVmNWFhNGE5ZGFjZTY0YzRkPQpl
ZWMwYmM2NzhhM2FhYjk3MCBsaWIvZ2FsYXh5L3dlYmFwcHMvcmVwb3J0cy9idWlsZGFwcC5weQot
LS0gYS9saWIvZ2FsYXh5L3dlYmFwcHMvcmVwb3J0cy9idWlsZGFwcC5weQorKysgYi9saWIvZ2Fs
YXh5L3dlYmFwcHMvcmVwb3J0cy9idWlsZGFwcC5weQpAQCAtNzAsMTIgKzcwLDEzIEBACiAgICAg
ICAgIHdlYmFwcCA9M0Qgd3JhcF9pbl9zdGF0aWMoIHdlYmFwcCwgZ2xvYmFsX2NvbmYsICoqa3dh
cmdzICkKICAgICAjIENsb3NlIGFueSBwb29sZWQgZGF0YWJhc2UgY29ubmVjdGlvbnMgYmVmb3Jl
IGZvcmtpbmcKICAgICB0cnk6Ci0gICAgICAgIGdhbGF4eS5tb2RlbC5tYXBwaW5nLm1ldGFkYXRh
LmVuZ2luZS5jb25uZWN0aW9uX3Byb3ZpZGVyLl9wb29sLmRpcz0KcG9zZSgpCisgICAgICAgIGdh
bGF4eS5tb2RlbC5tYXBwaW5nLm1ldGFkYXRhLmJpbmQuZGlzcG9zZSgpCiAgICAgZXhjZXB0Ogot
ICAgICAgICBwYXNzCisgICAgICAgIGxvZy5leGNlcHRpb24oIlVuYWJsZSB0byBkaXNwb3NlIG9m
IHBvb2xlZCBnYWxheHkgbW9kZWwgZGF0YWJhc2UgYz0Kb25uZWN0aW9ucy4iKQogICAgICMgUmV0
dXJuCiAgICAgcmV0dXJuIHdlYmFwcAo9MjAKKwogZGVmIHdyYXBfaW5fbWlkZGxld2FyZSggYXBw
LCBnbG9iYWxfY29uZiwgKipsb2NhbF9jb25mICk6CiAgICAgIiIiQmFzZWQgb24gdGhlIGNvbmZp
Z3VyYXRpb24gd3JhcCBgYXBwYCBpbiBhIHNldCBvZiBjb21tb24gYW5kIHVzZWZ1bD0KIG1pZGRs
ZXdhcmUuIiIiCiAgICAgIyBNZXJnZSB0aGUgZ2xvYmFsIGFuZCBsb2NhbCBjb25maWd1cmF0aW9u
cwoKCmh0dHBzOi8vYml0YnVja2V0Lm9yZy9nYWxheHkvZ2FsYXh5LWNlbnRyYWwvY29tbWl0cy85
NDM5Y2VkMGE1YzEvCkNoYW5nZXNldDogICA5NDM5Y2VkMGE1YzEKQnJhbmNoOiAgICAgIHJlbGVh
c2VfMTUuMDMKVXNlcjogICAgICAgIG5hdGVmb28KRGF0ZTogICAgICAgIDIwMTUtMDQtMTAgMjA6
Mjk6MTgrMDA6MDAKU3VtbWFyeTogICAgIEVuYWJsZSB1c2Ugb2YgbmdpbnhfdXBsb2FkX21vZHVs
ZSBmb3IgdGhlIGpvYiBmaWxlcyBhcGkuCkFmZmVjdGVkICM6ICA0IGZpbGVzCgpkaWZmIC1yIGY4
OTFjZjVmNWFhNGE5ZGFjZTY0YzRkZWVjMGJjNjc4YTNhYWI5NzAgLXIgOTQzOWNlZDBhNWMxYjFh
Y2Q3ZjQ5ODc9CmY1ODIzYmI2YmM4MGVmNTdmIGNvbmZpZy9nYWxheHkuaW5pLnNhbXBsZQotLS0g
YS9jb25maWcvZ2FsYXh5LmluaS5zYW1wbGUKKysrIGIvY29uZmlnL2dhbGF4eS5pbmkuc2FtcGxl
CkBAIC01ODAsNiArNTgwLDEzIEBACiAjIHJlcXVlc3RzLgogI25naW54X3VwbG9hZF9wYXRoID0z
RCBGYWxzZQo9MjAKKyMgR2FsYXh5IGNhbiBhbHNvIHVzZSBuZ2lueF91cGxvYWRfbW9kdWxlIHRv
IHJlY2VpdmUgZmlsZXMgc3RhZ2VkIG91dCB1cG9uPQogam9iCisjIGNvbXBsZXRpb24gYnkgcmVt
b3RlIGpvYiBydW5uZXJzIChpLmUuIFB1bHNhcikgdGhhdCBpbml0aWF0ZSBzdGFnaW5nCisjIG9w
ZXJhdGlvbnMgb24gdGhlIHJlbW90ZSBlbmQuICBTZWUgdGhlIEdhbGF4eSBuZ2lueCBkb2N1bWVu
dGF0aW9uIGZvciB0aGUKKyMgY29ycmVzcG9uZGluZyBuZ2lueCBjb25maWd1cmF0aW9uLgorI25n
aW54X3VwbG9hZF9qb2JfZmlsZXNfc3RvcmUgPTNEIEZhbHNlCisjbmdpbnhfdXBsb2FkX2pvYl9m
aWxlc19wYXRoID0zRCBGYWxzZQorCiAjIEhhdmUgR2FsYXh5IG1hbmFnZSBkeW5hbWljIHByb3h5
IGNvbXBvbmVudCBmb3Igcm91dGluZyByZXF1ZXN0cyB0byBvdGhlcgogIyBzZXJ2aWNlcyBiYXNl
ZCBvbiBHYWxheHkncyBzZXNzaW9uIGNvb2tpZS4gIEl0IHdpbGwgYXR0ZW1wdCB0byBkbyB0aGlz
IGJ5CiAjIGRlZmF1bHQgdGhvdWdoIHlvdSBkbyBuZWVkIHRvIGluc3RhbGwgbm9kZStucG0gYW5k
IGRvIGFuIG5wbSBpbnN0YWxsIGZyb20KCmRpZmYgLXIgZjg5MWNmNWY1YWE0YTlkYWNlNjRjNGRl
ZWMwYmM2NzhhM2FhYjk3MCAtciA5NDM5Y2VkMGE1YzFiMWFjZDdmNDk4Nz0KZjU4MjNiYjZiYzgw
ZWY1N2YgbGliL2dhbGF4eS9jb25maWcucHkKLS0tIGEvbGliL2dhbGF4eS9jb25maWcucHkKKysr
IGIvbGliL2dhbGF4eS9jb25maWcucHkKQEAgLTI5Myw2ICsyOTMsOCBAQAogICAgICAgICBzZWxm
Lm5naW54X3hfYXJjaGl2ZV9maWxlc19iYXNlID0zRCBrd2FyZ3MuZ2V0KCAnbmdpbnhfeF9hcmNo
aXZlX2Y9CmlsZXNfYmFzZScsIEZhbHNlICkKICAgICAgICAgc2VsZi5uZ2lueF91cGxvYWRfc3Rv
cmUgPTNEIGt3YXJncy5nZXQoICduZ2lueF91cGxvYWRfc3RvcmUnLCBGYWxzPQplICkKICAgICAg
ICAgc2VsZi5uZ2lueF91cGxvYWRfcGF0aCA9M0Qga3dhcmdzLmdldCggJ25naW54X3VwbG9hZF9w
YXRoJywgRmFsc2UgKQorICAgICAgICBzZWxmLm5naW54X3VwbG9hZF9qb2JfZmlsZXNfc3RvcmUg
PTNEIGt3YXJncy5nZXQoICduZ2lueF91cGxvYWRfam89CmJfZmlsZXNfc3RvcmUnLCBGYWxzZSAp
CisgICAgICAgIHNlbGYubmdpbnhfdXBsb2FkX2pvYl9maWxlc19wYXRoID0zRCBrd2FyZ3MuZ2V0
KCAnbmdpbnhfdXBsb2FkX2pvYj0KX2ZpbGVzX3BhdGgnLCBGYWxzZSApCiAgICAgICAgIGlmIHNl
bGYubmdpbnhfdXBsb2FkX3N0b3JlOgogICAgICAgICAgICAgc2VsZi5uZ2lueF91cGxvYWRfc3Rv
cmUgPTNEIG9zLnBhdGguYWJzcGF0aCggc2VsZi5uZ2lueF91cGxvYWQ9Cl9zdG9yZSApCiAgICAg
ICAgIHNlbGYub2JqZWN0X3N0b3JlID0zRCBrd2FyZ3MuZ2V0KCAnb2JqZWN0X3N0b3JlJywgJ2Rp
c2snICkKCmRpZmYgLXIgZjg5MWNmNWY1YWE0YTlkYWNlNjRjNGRlZWMwYmM2NzhhM2FhYjk3MCAt
ciA5NDM5Y2VkMGE1YzFiMWFjZDdmNDk4Nz0KZjU4MjNiYjZiYzgwZWY1N2YgbGliL2dhbGF4eS9q
b2JzL3J1bm5lcnMvcHVsc2FyLnB5Ci0tLSBhL2xpYi9nYWxheHkvam9icy9ydW5uZXJzL3B1bHNh
ci5weQorKysgYi9saWIvZ2FsYXh5L2pvYnMvcnVubmVycy9wdWxzYXIucHkKQEAgLTM0Miw3ICsz
NDIsMTIgQEAKPTIwCiAgICAgICAgIGVuY29kZWRfam9iX2lkID0zRCBzZWxmLmFwcC5zZWN1cml0
eS5lbmNvZGVfaWQoam9iX2lkKQogICAgICAgICBqb2Jfa2V5ID0zRCBzZWxmLmFwcC5zZWN1cml0
eS5lbmNvZGVfaWQoIGpvYl9pZCwga2luZD0zRCJqb2JzX2ZpbGU9CnMiICkKLSAgICAgICAgZmls
ZXNfZW5kcG9pbnQgPTNEICIlcy9hcGkvam9icy8lcy9maWxlcz9qb2Jfa2V5PTNEJXMiICUgKAor
ICAgICAgICBlbmRwb2ludF9iYXNlID0zRCAiJXMvYXBpL2pvYnMvJXM/am9iX2tleT0zRCVzIgor
ICAgICAgICBpZiBzZWxmLmFwcC5jb25maWcubmdpbnhfdXBsb2FkX2pvYl9maWxlc19wYXRoOgor
ICAgICAgICAgICAgZW5kcG9pbnRfYmFzZSA9M0QgIiVzIiArIFwKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBzZWxmLmFwcC5jb25maWcubmdpbnhfdXBsb2FkX2pvYl9maWxlc19wYXRoICsg
XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICI/am9iX2lkPTNEJXMmam9iX2tleT0zRCVz
IgorICAgICAgICBmaWxlc19lbmRwb2ludCA9M0QgZW5kcG9pbnRfYmFzZSAlICgKICAgICAgICAg
ICAgIHNlbGYuZ2FsYXh5X3VybCwKICAgICAgICAgICAgIGVuY29kZWRfam9iX2lkLAogICAgICAg
ICAgICAgam9iX2tleQoKZGlmZiAtciBmODkxY2Y1ZjVhYTRhOWRhY2U2NGM0ZGVlYzBiYzY3OGEz
YWFiOTcwIC1yIDk0MzljZWQwYTVjMWIxYWNkN2Y0OTg3PQpmNTgyM2JiNmJjODBlZjU3ZiBsaWIv
Z2FsYXh5L3dlYmFwcHMvZ2FsYXh5L2FwaS9qb2JfZmlsZXMucHkKLS0tIGEvbGliL2dhbGF4eS93
ZWJhcHBzL2dhbGF4eS9hcGkvam9iX2ZpbGVzLnB5CisrKyBiL2xpYi9nYWxheHkvd2ViYXBwcy9n
YWxheHkvYXBpL2pvYl9maWxlcy5weQpAQCAtODMsNyArODMsMTkgQEAKICAgICAgICAgc2VsZi5f
X2NoZWNrX2pvYl9jYW5fd3JpdGVfdG9fcGF0aCggdHJhbnMsIGpvYiwgcGF0aCApCj0yMAogICAg
ICAgICAjIElzIHRoaXMgd3JpdGluZyBhbiB1bm5lZWRlZCBmaWxlPyBTaG91bGQgdGhpcyBqdXN0
IGNvcHkgaW4gUHl0aG89Cm4/Ci0gICAgICAgIGlucHV0X2ZpbGUgPTNEIHBheWxvYWQuZ2V0KCAi
ZmlsZSIsIHBheWxvYWQuZ2V0KCAiX19maWxlIiwgTm9uZSApID0KKS5maWxlCisgICAgICAgIGlm
ICdfX2ZpbGVfcGF0aCcgaW4gcGF5bG9hZDoKKyAgICAgICAgICAgIGZpbGVfcGF0aCA9M0QgcGF5
bG9hZC5nZXQoICdfX2ZpbGVfcGF0aCcgKQorICAgICAgICAgICAgdXBsb2FkX3N0b3JlID0zRCB0
cmFucy5hcHAuY29uZmlnLm5naW54X3VwbG9hZF9qb2JfZmlsZXNfc3RvcmUKKyAgICAgICAgICAg
IGFzc2VydCB1cGxvYWRfc3RvcmUsICggIlJlcXVlc3QgYXBwZWFycyB0byBoYXZlIGJlZW4gcHJv
Y2Vzc2VkPQogYnkiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgbmdpbnhf
dXBsb2FkX21vZHVsZSBidXQgR2FsYXh5IGlzIG5vdCIKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIiBjb25maWd1cmVkIHRvIHJlY29nbml6ZSBpdCIgKQorICAgICAgICAgICAg
YXNzZXJ0IGZpbGVfcGF0aC5zdGFydHN3aXRoKCB1cGxvYWRfc3RvcmUgKSwgXAorICAgICAgICAg
ICAgICAgICAgICAoICJGaWxlbmFtZSBwcm92aWRlZCBieSBuZ2lueCAoJXMpIGlzIG5vdCBpbiBj
b3JyZWN0IgorICAgICAgICAgICAgICAgICAgICAgICIgZGlyZWN0b3J5ICglcykiICUgKCBmaWxl
X3BhdGgsIHVwbG9hZF9zdG9yZSApICkKKyAgICAgICAgICAgIGlucHV0X2ZpbGUgPTNEIG9wZW4o
IGZpbGVfcGF0aCApCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpbnB1dF9maWxlID0zRCBw
YXlsb2FkLmdldCggImZpbGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBwYXlsb2FkLmdldCggIl9fZmlsZSIsIE5vbmUgKSApLmZpbGUKICAgICAgICAgdHJ5OgogICAg
ICAgICAgICAgc2h1dGlsLmNvcHlmaWxlKCBpbnB1dF9maWxlLm5hbWUsIHBhdGggKQogICAgICAg
ICBmaW5hbGx5OgoKCmh0dHBzOi8vYml0YnVja2V0Lm9yZy9nYWxheHkvZ2FsYXh5LWNlbnRyYWwv
Y29tbWl0cy8wNjE1NDgwMmEzNzEvCkNoYW5nZXNldDogICAwNjE1NDgwMmEzNzEKQnJhbmNoOiAg
ICAgIHJlbGVhc2VfMTUuMDMKVXNlcjogICAgICAgIG5hdGVmb28KRGF0ZTogICAgICAgIDIwMTUt
MDQtMTAgMjA6MzA6MzErMDA6MDAKU3VtbWFyeTogICAgIE1vdmUsIHJhdGhlciB0aGFuIGNvcHkg
ZmlsZXMgc3RhZ2VkIGJhY2sgdG8gR2FsYXh5IHZpYSB0aGUgam9iPQogZmlsZXMKYXBpLiBNb3Zp
bmcgaXMgYSByZW5hbWUgd2hlbiB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBhcmUgb24gdGhl
IHNhbWUKZmlsZXN5c3RlbSwgd2hpY2ggaXMgbmVhcmx5IGluc3RhbnRhbmVvdXMgYW5kIGdyZWF0
bHkgcmVkdWNlcyB0aGUKcG9zc2liaWxpdHkgZm9yIGZhaWx1cmUgZHVlIHRvIG1pZC1jb3B5IHJl
c3RhcnRzLgpBZmZlY3RlZCAjOiAgMSBmaWxlCgpkaWZmIC1yIDk0MzljZWQwYTVjMWIxYWNkN2Y0
OTg3ZjU4MjNiYjZiYzgwZWY1N2YgLXIgMDYxNTQ4MDJhMzcxYzZmMmFhMGZmMGU9CjEyNWU4OGYy
NTQ3YjhmMTA5IGxpYi9nYWxheHkvd2ViYXBwcy9nYWxheHkvYXBpL2pvYl9maWxlcy5weQotLS0g
YS9saWIvZ2FsYXh5L3dlYmFwcHMvZ2FsYXh5L2FwaS9qb2JfZmlsZXMucHkKKysrIGIvbGliL2dh
bGF4eS93ZWJhcHBzL2dhbGF4eS9hcGkvam9iX2ZpbGVzLnB5CkBAIC05Nyw3ICs5Nyw3IEBACiAg
ICAgICAgICAgICBpbnB1dF9maWxlID0zRCBwYXlsb2FkLmdldCggImZpbGUiLAogICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkLmdldCggIl9fZmlsZSIsIE5vbmUg
KSApLmZpbGUKICAgICAgICAgdHJ5OgotICAgICAgICAgICAgc2h1dGlsLmNvcHlmaWxlKCBpbnB1
dF9maWxlLm5hbWUsIHBhdGggKQorICAgICAgICAgICAgc2h1dGlsLm1vdmUoIGlucHV0X2ZpbGUu
bmFtZSwgcGF0aCApCiAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICBpbnB1dF9maWxlLmNs
b3NlKCkKICAgICAgICAgcmV0dXJuIHsibWVzc2FnZSI6ICJvayJ9CgoKaHR0cHM6Ly9iaXRidWNr
ZXQub3JnL2dhbGF4eS9nYWxheHktY2VudHJhbC9jb21taXRzLzRiZWM2ZjAxMGE4OS8KQ2hhbmdl
c2V0OiAgIDRiZWM2ZjAxMGE4OQpCcmFuY2g6ICAgICAgcmVsZWFzZV8xNS4wMwpVc2VyOiAgICAg
ICAgZGFuCkRhdGU6ICAgICAgICAyMDE1LTAzLTE3IDE4OjA4OjA2KzAwOjAwClN1bW1hcnk6ICAg
ICBTb21lIGJhc2ljIENhY2hpbmcgZm9yIHRoZSBHZW5vbWVTcGFjZSBFeHBvcnQgVG9vbCdzIGxp
c3Qgb2YgYT0KdmFpbGFibGUgdGFyZ2V0IGRpcmVjdG9yaWVzLCBzbyB3ZSBkb24ndCBoYXZlIHRv
IHJlbG9hZCBhbmQgZG93bmxvYWQgZXZlcnl0PQpoaW5nIGV2ZXJ5IHRpbWUsIGVzcGVjaWFsbHkg
bm93IHRoYXQgd2UgYXJlIGNhbGxpbmcgdGhlIHBhcmFtZXRlcidzIGdldCBvcHQ9CmlvbnMgbWV0
aG9kIDUgdGltZXMgKDYgb24gcmVsb2FkKSB3aGVuIGEgdXNlciBsb2FkcyB0aGUgdG9vbCBpbnRl
cmZhY2UuIEZvcj0KIG5vdywgd2UnbGwgdXNlIDMwIHNlY29uZHMgYXMgdGhlIGNhY2hlIHZhbGlk
IHRpbWUgbGVuZ3RoLgoKKGNoZXJyeSBwaWNrZWQgZnJvbSBjb21taXQgZmViMGEyNmY4ZDI0YzZl
YjAwOGMwMmYwMDIzMDc3N2Q5NzhhNjJjYikKQWZmZWN0ZWQgIzogIDEgZmlsZQoKZGlmZiAtciAw
NjE1NDgwMmEzNzFjNmYyYWEwZmYwZTEyNWU4OGYyNTQ3YjhmMTA5IC1yIDRiZWM2ZjAxMGE4OWFi
MGFjYzNkNjcyPQphYjBjZTIwNGUxZDFkNmViMiB0b29scy9nZW5vbWVzcGFjZS9nZW5vbWVzcGFj
ZV9leHBvcnRlci5weQotLS0gYS90b29scy9nZW5vbWVzcGFjZS9nZW5vbWVzcGFjZV9leHBvcnRl
ci5weQorKysgYi90b29scy9nZW5vbWVzcGFjZS9nZW5vbWVzcGFjZV9leHBvcnRlci5weQpAQCAt
NCw2ICs0LDcgQEAKIGltcG9ydCBiaW5hc2NpaQogaW1wb3J0IGNnaQogaW1wb3J0IGNvb2tpZWxp
YgoraW1wb3J0IGRhdGV0aW1lCiBpbXBvcnQgaGFzaGxpYgogaW1wb3J0IGpzb24KIGltcG9ydCBs
b2dnaW5nCkBAIC0yMCw2ICsyMSwxMyBAQAo9MjAKIENIVU5LX1NJWkUgPTNEIDIqKjIwICMxbWIK
PTIwCisjIFNvbWUgYmFzaWMgQ2FjaGluZywgc28gd2UgZG9uJ3QgaGF2ZSB0byByZWxvYWQgYW5k
IGRvd25sb2FkIGV2ZXJ5dGhpbmcgZT0KdmVyeSB0aW1lLAorIyBlc3BlY2lhbGx5IG5vdyB0aGF0
IHdlIGFyZSBjYWxsaW5nIHRoZSBwYXJhbWV0ZXIncyBnZXQgb3B0aW9ucyBtZXRob2QgNSA9CnRp
bWVzCisjICg2IG9uIHJlbG9hZCkgd2hlbiBhIHVzZXIgbG9hZHMgdGhlIHRvb2wgaW50ZXJmYWNl
CisjIEZvciBub3csIHdlJ2xsIHVzZSAzMCBzZWNvbmRzIGFzIHRoZSBjYWNoZSB2YWxpZCB0aW1l
CitDQUNIRV9USU1FID0zRCBkYXRldGltZS50aW1lZGVsdGEoIHNlY29uZHM9M0QzMCApCitHRU5P
TUVTUEFDRV9ESVJFQ1RPUklFU19CWV9VU0VSID0zRCB7fQorCj0yMAogZGVmIGNodW5rX3dyaXRl
KCBzb3VyY2Vfc3RyZWFtLCB0YXJnZXRfc3RyZWFtLCBzb3VyY2VfbWV0aG9kID0zRCAicmVhZCIs
IHQ9CmFyZ2V0X21ldGhvZD0zRCJ3cml0ZSIgKToKICAgICBzb3VyY2VfbWV0aG9kID0zRCBnZXRh
dHRyKCBzb3VyY2Vfc3RyZWFtLCBzb3VyY2VfbWV0aG9kICkKQEAgLTE1MCwxNCArMTU4LDMyIEBA
CiAgICAgICAgIHVzZXJuYW1lID0zRCB0cmFucy51c2VyLnByZWZlcmVuY2VzLmdldCggJ2dlbm9t
ZXNwYWNlX3VzZXJuYW1lJywgTj0Kb25lICkKICAgICAgICAgdG9rZW4gPTNEIHRyYW5zLnVzZXIu
cHJlZmVyZW5jZXMuZ2V0KCAnZ2Vub21lc3BhY2VfdG9rZW4nLCBOb25lICkKICAgICAgICAgaWYg
Tm9uZSBub3QgaW4gKCB1c2VybmFtZSwgdG9rZW4gKToKLSAgICAgICAgICAgIHVybF9vcGVuZXIg
PTNEIGdldF9jb29raWVfb3BlbmVyKCB1c2VybmFtZSwgdG9rZW4gKQotICAgICAgICAgICAgZ2Vu
b21lc3BhY2Vfc2l0ZV9kaWN0ID0zRCBnZXRfZ2Vub21lc3BhY2Vfc2l0ZV91cmxzKClbIGdlbm9t
ZXM9CnBhY2Vfc2l0ZSBdCi0gICAgICAgICAgICBkbV91cmwgPTNEIGdlbm9tZXNwYWNlX3NpdGVf
ZGljdFsnZG1TZXJ2ZXInXQotICAgICAgICAgICAgI2dldCBleHBvcnQgcm9vdCBkaXJlY3RvcnkK
LSAgICAgICAgICAgICNkaXJlY3RvcnlfZGljdCA9M0QgZ2V0X2RlZmF1bHRfZGlyZWN0b3J5KCB1
cmxfb3BlbmVyLCBkbV91cmwgPQopLmdldCggJ2RpcmVjdG9yeScsIE5vbmUgKSAjVGhpcyBkaXJl
Y3RvcnkgY29udGFpbnMgc2hhcmVzIGFuZCBvdGhlciBpdGVtcyA9Cm91dHNpZGUgb2YgdGhlIHVz
ZXJzIGhvbWUKLSAgICAgICAgICAgIGRpcmVjdG9yeV9kaWN0ID0zRCBnZXRfcGVyc29uYWxfZGly
ZWN0b3J5KCB1cmxfb3BlbmVyLCBkbV91cmwgPQopLmdldCggJ2RpcmVjdG9yeScsIE5vbmUgKSAj
TGltaXQgZXhwb3J0IGxpc3QgdG8gb25seSB1c2VyJ3MgaG9tZSBkaXIKLSAgICAgICAgICAgIGlm
IGRpcmVjdG9yeV9kaWN0IGlzIG5vdCBOb25lOgotICAgICAgICAgICAgICAgIHJlY3Vyc2VfZGly
ZWN0b3J5X2RpY3QoIHVybF9vcGVuZXIsIHJ2YWwsIGRpcmVjdG9yeV9kaWN0Lmc9CmV0KCAndXJs
JyApICkKKyAgICAgICAgICAgICMgTkI6IGl0IGlzIHBvc3NpYmxlLCBidXQgdW5saWtlbHkgZm9y
IGEgdXNlciB0byBzd2FwIEdlbm9tZVNwPQphY2UgYWNjb3VudHMgYXJvdW5kCisgICAgICAgICAg
ICAjIGluIHRoZSBtaWRkbGUgb2YgaW50ZXJhY3Rpbmcgd2l0aCB0b29scywgc28gd2UnbGwgaGF2
ZSBzZXZlcj0KYWwgbGF5ZXJzIG9mIGNhY2hpbmcgYnkgaWRzL3ZhbHVlcworICAgICAgICAgICAg
aWYgdHJhbnMudXNlciBpbiBHRU5PTUVTUEFDRV9ESVJFQ1RPUklFU19CWV9VU0VSOgorICAgICAg
ICAgICAgICAgIGlmIHVzZXJuYW1lIGluIEdFTk9NRVNQQUNFX0RJUkVDVE9SSUVTX0JZX1VTRVJb
IHRyYW5zLnVzZXI9CiBdOgorICAgICAgICAgICAgICAgICAgICBpZiB0b2tlbiBpbiBHRU5PTUVT
UEFDRV9ESVJFQ1RPUklFU19CWV9VU0VSWyB0cmFucy51c2U9CnIgXVsgdXNlcm5hbWUgXToKKyAg
ICAgICAgICAgICAgICAgICAgICAgIGNhY2hlX2RpY3QgPTNEIEdFTk9NRVNQQUNFX0RJUkVDVE9S
SUVTX0JZX1VTRVJbIHRyPQphbnMudXNlciBdWyB1c2VybmFtZSBdWyB0b2tlbiBdCisgICAgICAg
ICAgICAgICAgICAgICAgICBpZiBkYXRldGltZS5kYXRldGltZS5ub3coKSAtIGNhY2hlX2RpY3Qu
Z2V0KCAndGltZT0KX2xvYWRlZCcgKSA+IENBQ0hFX1RJTUU6CisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIyBjYWNoZSB0b28gb2xkLCBuZWVkIHRvIHJlbG9hZCwgd2UnbGwganVzdCBraT0K
bGwgdGhlIHdob2xlIHRyYW5zLnVzZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWwg
R0VOT01FU1BBQ0VfRElSRUNUT1JJRVNfQllfVVNFUlsgdHJhbnMudXNlPQpyIF0KKyAgICAgICAg
ICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnZhbCA9
M0QgY2FjaGVfZGljdC5nZXQoICdydmFsJyApCisgICAgICAgICAgICAgICAgICAgIGVsc2U6Cisg
ICAgICAgICAgICAgICAgICAgICAgICBkZWwgR0VOT01FU1BBQ0VfRElSRUNUT1JJRVNfQllfVVNF
UlsgdHJhbnMudXNlciBdCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAg
ICAgZGVsIEdFTk9NRVNQQUNFX0RJUkVDVE9SSUVTX0JZX1VTRVJbIHRyYW5zLnVzZXIgXQorICAg
ICAgICAgICAgaWYgbm90IHJ2YWw6CisgICAgICAgICAgICAgICAgdXJsX29wZW5lciA9M0QgZ2V0
X2Nvb2tpZV9vcGVuZXIoIHVzZXJuYW1lLCB0b2tlbiApCisgICAgICAgICAgICAgICAgZ2Vub21l
c3BhY2Vfc2l0ZV9kaWN0ID0zRCBnZXRfZ2Vub21lc3BhY2Vfc2l0ZV91cmxzKClbIGdlbj0Kb21l
c3BhY2Vfc2l0ZSBdCisgICAgICAgICAgICAgICAgZG1fdXJsID0zRCBnZW5vbWVzcGFjZV9zaXRl
X2RpY3RbJ2RtU2VydmVyJ10KKyAgICAgICAgICAgICAgICAjZ2V0IGV4cG9ydCByb290IGRpcmVj
dG9yeQorICAgICAgICAgICAgICAgICNkaXJlY3RvcnlfZGljdCA9M0QgZ2V0X2RlZmF1bHRfZGly
ZWN0b3J5KCB1cmxfb3BlbmVyLCBkbV89CnVybCApLmdldCggJ2RpcmVjdG9yeScsIE5vbmUgKSAj
VGhpcyBkaXJlY3RvcnkgY29udGFpbnMgc2hhcmVzIGFuZCBvdGhlciBpdD0KZW1zIG91dHNpZGUg
b2YgdGhlIHVzZXJzIGhvbWUKKyAgICAgICAgICAgICAgICBkaXJlY3RvcnlfZGljdCA9M0QgZ2V0
X3BlcnNvbmFsX2RpcmVjdG9yeSggdXJsX29wZW5lciwgZG1fPQp1cmwgKS5nZXQoICdkaXJlY3Rv
cnknLCBOb25lICkgI0xpbWl0IGV4cG9ydCBsaXN0IHRvIG9ubHkgdXNlcidzIGhvbWUgZGlyCisg
ICAgICAgICAgICAgICAgaWYgZGlyZWN0b3J5X2RpY3QgaXMgbm90IE5vbmU6CisgICAgICAgICAg
ICAgICAgICAgIHJlY3Vyc2VfZGlyZWN0b3J5X2RpY3QoIHVybF9vcGVuZXIsIHJ2YWwsIGRpcmVj
dG9yeV9kaT0KY3QuZ2V0KCAndXJsJyApICkKKyAgICAgICAgICAgICAgICAjIFNhdmUgdGhlIGNh
Y2hlCisgICAgICAgICAgICAgICAgR0VOT01FU1BBQ0VfRElSRUNUT1JJRVNfQllfVVNFUlsgdHJh
bnMudXNlciBdID0zRCB7IHVzZXJuYT0KbWU6IHsgdG9rZW46IHsgJ3RpbWVfbG9hZGVkJzogZGF0
ZXRpbWUuZGF0ZXRpbWUubm93KCksICdydmFsJzogcnZhbCB9IH0gIH0KICAgICBpZiBub3QgcnZh
bDoKICAgICAgICAgaWYgbm90IGJhc2VfdXJsOgogICAgICAgICAgICAgYmFzZV91cmwgPTNEICcu
LicKQEAgLTE4MCw3ICsyMDYsNyBAQAogICAgICNnZXQgdXBsb2FkIHVybAogICAgIHVwbG9hZF91
cmwgPTNEICJ1cGxvYWR1cmwiCiAgICAgY29udGVudF9sZW5ndGggPTNEIG9zLnBhdGguZ2V0c2l6
ZSggc291cmNlX2ZpbGVuYW1lICkKLSAgICBpbnB1dF9maWxlID0zRCBvcGVuKCBzb3VyY2VfZmls
ZW5hbWUgKQorICAgIGlucHV0X2ZpbGUgPTNEIG9wZW4oIHNvdXJjZV9maWxlbmFtZSwgJ3JiJyAp
CiAgICAgY29udGVudF9tZDUgPTNEIGhhc2hsaWIubWQ1KCkKICAgICBjaHVua193cml0ZSggaW5w
dXRfZmlsZSwgY29udGVudF9tZDUsIHRhcmdldF9tZXRob2Q9M0QidXBkYXRlIiApCiAgICAgaW5w
dXRfZmlsZS5zZWVrKCAwICkgI2JhY2sgdG8gc3RhcnQsIGZvciB1cGxvYWRpbmcKCgpodHRwczov
L2JpdGJ1Y2tldC5vcmcvZ2FsYXh5L2dhbGF4eS1jZW50cmFsL2NvbW1pdHMvNTdiYmJlMTQ2M2Y2
LwpDaGFuZ2VzZXQ6ICAgNTdiYmJlMTQ2M2Y2CkJyYW5jaDogICAgICByZWxlYXNlXzE1LjAzClVz
ZXI6ICAgICAgICBkYW4KRGF0ZTogICAgICAgIDIwMTUtMDQtMDIgMTU6MTY6MDIrMDA6MDAKU3Vt
bWFyeTogICAgIEVuYWJsZSBtdWx0aS1wYXJ0IHVwbG9hZCBmb3IgdGhlIEdlbm9tZVNwYWNlIGV4
cG9ydCB0b29sLiBGaWxlPQpzIGdyZWF0ZXIgdGhhbiA1Z2IgY2FuIG9uY2UgYWdhaW4gYmUgc2Vu
ZCB0byBHZW5vbWVTcGFjZSBmcm9tIEdhbGF4eS4KCihjaGVycnkgcGlja2VkIGZyb20gY29tbWl0
IDEyNmFlMDczYWZkMzlhODNkYjkwYjNmODAwMmY3MTRiZTlkZmRlYzIpCkFmZmVjdGVkICM6ICAy
IGZpbGVzCgpkaWZmIC1yIDRiZWM2ZjAxMGE4OWFiMGFjYzNkNjcyYWIwY2UyMDRlMWQxZDZlYjIg
LXIgNTdiYmJlMTQ2M2Y2MTZmOTg3OTNhODc9CmQ2YjNhYzBkNDM1NjgyNWY0IHRvb2xzL2dlbm9t
ZXNwYWNlL2dlbm9tZXNwYWNlX2V4cG9ydGVyLnB5Ci0tLSBhL3Rvb2xzL2dlbm9tZXNwYWNlL2dl
bm9tZXNwYWNlX2V4cG9ydGVyLnB5CisrKyBiL3Rvb2xzL2dlbm9tZXNwYWNlL2dlbm9tZXNwYWNl
X2V4cG9ydGVyLnB5CkBAIC0xLDMgKzEsNCBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCiAjRGFu
IEJsYW5rZW5iZXJnCj0yMAogaW1wb3J0IGJhc2U2NApAQCAtMTAsMTcgKzExLDM3IEBACiBpbXBv
cnQgbG9nZ2luZwogaW1wb3J0IG9wdHBhcnNlCiBpbXBvcnQgb3MKK2ltcG9ydCB0ZW1wZmlsZQog
aW1wb3J0IHVybGxpYgogaW1wb3J0IHVybGxpYjIKIGZyb20gdXJscGFyc2UgaW1wb3J0IHVybGpv
aW4KPTIwCiBsb2cgPTNEIGxvZ2dpbmcuZ2V0TG9nZ2VyKCAidG9vbHMuZ2Vub21lc3BhY2UuZ2Vu
b21lc3BhY2VfZXhwb3J0ZXIiICkjKCBfXz0KbmFtZV9fICkKPTIwCit0cnk6CisgICAgZnJvbSBn
YWxheHkgaW1wb3J0IGVnZ3MKKyAgICBlZ2dzLnJlcXVpcmUoJ2JvdG8nKQorZXhjZXB0IEltcG9y
dEVycm9yOgorICAgIHBhc3MKKwordHJ5OgorICAgIGltcG9ydCBib3RvCisgICAgZnJvbSBib3Rv
LnMzLmNvbm5lY3Rpb24gaW1wb3J0IFMzQ29ubmVjdGlvbgorZXhjZXB0IEltcG9ydEVycm9yOgor
ICAgIGJvdG8gPTNEIE5vbmUKKwogR0VOT01FU1BBQ0VfQVBJX1ZFUlNJT05fU1RSSU5HID0zRCAi
djEuMCIKIEdFTk9NRVNQQUNFX1NFUlZFUl9VUkxfUFJPUEVSVElFUyA9M0QgImh0dHBzOi8vZG0u
Z2Vub21lc3BhY2Uub3JnL2NvbmZpZy8lPQpzL3NlcnZlcnVybC5wcm9wZXJ0aWVzIiAlICggR0VO
T01FU1BBQ0VfQVBJX1ZFUlNJT05fU1RSSU5HICkKPTIwCiBDSFVOS19TSVpFID0zRCAyKioyMCAj
MW1iCj0yMAorIyBUT0RPOiBUQVJHRVRfU1BMSVRfU0laRSBhbmQgVEFSR0VUX1NJTVBMRV9QVVRf
VVBMT0FEX1NJWkUgYXJlIGFyYml0cmFyaWw9CnkgZGVmaW5lZAorIyB3ZSBzaG91bGQgcHJvZ3Jh
bW1hdGljYWxseSBkZXRlcm1pbmUgdGhlc2UsIGJhc2VkIHVwb24gdGhlIGN1cnJlbnQgZW52aXI9
Cm9ubWVudD0yMAorVEFSR0VUX1NQTElUX1NJWkUgPTNEIDI1MCAqIDEwMjQgKiAxMDI0ICMgMjUw
IG1iCitNSU5fTVVMVElQQVJUX1VQTE9BRF9TSVpFID0zRCA1ICogMTAyNCAqIDEwMjQgIyA1bWIK
K01BWF9TSU1QTEVfUFVUX1VQTE9BRF9TSVpFID0zRCA1ICogMTAyNCAqIDEwMjQgKiAxMDI0ICMg
NWdiCitUQVJHRVRfU0lNUExFX1BVVF9VUExPQURfU0laRSA9M0QgTUFYX1NJTVBMRV9QVVRfVVBM
T0FEX1NJWkUgLyAyCisKICMgU29tZSBiYXNpYyBDYWNoaW5nLCBzbyB3ZSBkb24ndCBoYXZlIHRv
IHJlbG9hZCBhbmQgZG93bmxvYWQgZXZlcnl0aGluZyBlPQp2ZXJ5IHRpbWUsCiAjIGVzcGVjaWFs
bHkgbm93IHRoYXQgd2UgYXJlIGNhbGxpbmcgdGhlIHBhcmFtZXRlcidzIGdldCBvcHRpb25zIG1l
dGhvZCA1ID0KdGltZXMKICMgKDYgb24gcmVsb2FkKSB3aGVuIGEgdXNlciBsb2FkcyB0aGUgdG9v
bCBpbnRlcmZhY2UKQEAgLTIwMywyOCArMjI0LDY5IEBACiAgICAgICAgIGRpcmVjdG9yeV9kaWN0
ID0zRCBnZXRfcGVyc29uYWxfZGlyZWN0b3J5KCB1cmxfb3BlbmVyLCBkbV91cmwgKVsnZD0KaXJl
Y3RvcnknXSAjdGhpcyBpcyB0aGUgYmFzZSBmb3IgdGhlIGF1dG8tZ2VuZXJhdGVkIGdhbGF4eSBl
eHBvcnQgZGlyZWN0b3JpPQplcwogICAgICN3aGF0IGRpcmVjdG9yeSB0byBzdHVmZiB0aGlzIGlu
CiAgICAgdGFyZ2V0X2RpcmVjdG9yeV9kaWN0ID0zRCBjcmVhdGVfZGlyZWN0b3J5KCB1cmxfb3Bl
bmVyLCBkaXJlY3RvcnlfZGljdD0KLCB0YXJnZXRfZGlyZWN0b3J5LCBkbV91cmwgKQotICAgICNn
ZXQgdXBsb2FkIHVybAotICAgIHVwbG9hZF91cmwgPTNEICJ1cGxvYWR1cmwiCiAgICAgY29udGVu
dF9sZW5ndGggPTNEIG9zLnBhdGguZ2V0c2l6ZSggc291cmNlX2ZpbGVuYW1lICkKICAgICBpbnB1
dF9maWxlID0zRCBvcGVuKCBzb3VyY2VfZmlsZW5hbWUsICdyYicgKQotICAgIGNvbnRlbnRfbWQ1
ID0zRCBoYXNobGliLm1kNSgpCi0gICAgY2h1bmtfd3JpdGUoIGlucHV0X2ZpbGUsIGNvbnRlbnRf
bWQ1LCB0YXJnZXRfbWV0aG9kPTNEInVwZGF0ZSIgKQotICAgIGlucHV0X2ZpbGUuc2VlayggMCAp
ICNiYWNrIHRvIHN0YXJ0LCBmb3IgdXBsb2FkaW5nCi0KLSAgICB1cGxvYWRfcGFyYW1zID0zRCB7
ICdDb250ZW50LUxlbmd0aCc6IGNvbnRlbnRfbGVuZ3RoLCAnQ29udGVudC1NRDUnOiBiPQphc2U2
NC5zdGFuZGFyZF9iNjRlbmNvZGUoIGNvbnRlbnRfbWQ1LmRpZ2VzdCgpICksICdDb250ZW50LVR5
cGUnOiBjb250ZW50X3Q9CnlwZSB9Ci0gICAgdXBsb2FkX3VybCA9M0QgIiVzLyVzLyVzJXMvJXM/
JXMiICUgKCBkbV91cmwsIEdFTk9NRVNQQUNFX0FQSV9WRVJTSU9OXz0KU1RSSU5HLCB1cGxvYWRf
dXJsLCB0YXJnZXRfZGlyZWN0b3J5X2RpY3RbJ3BhdGgnXSwgdXJsbGliLnF1b3RlKCB0YXJnZXRf
ZmlsPQplbmFtZSwgc2FmZT0zRCcnICksIHVybGxpYi51cmxlbmNvZGUoIHVwbG9hZF9wYXJhbXMg
KSApCi0gICAgbmV3X2ZpbGVfcmVxdWVzdCA9M0QgdXJsbGliMi5SZXF1ZXN0KCB1cGxvYWRfdXJs
ICkjLCBoZWFkZXJzID0zRCB7ICdDbz0KbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJywg
J0FjY2VwdCc6ICdhcHBsaWNhdGlvbi90ZXh0JyB9ICkgI2FwcGFyZW50PQpseSBodHRwOi8vd3d3
Lmdlbm9tZXNwYWNlLm9yZy90ZWFtL3NwZWNzL3VwZGF0ZWQtZG0tcmVzdC1hcGk6IkV2ZXJ5IEhU
VFAgcmU9CnF1ZXN0IHRvIHRoZSBEYXRhIE1hbmFnZXIgc2hvdWxkIGluY2x1ZGUgdGhlIEFjY2Vw
dCBoZWFkZXIgd2l0aCBhIHByZWZlcmVuYz0KZSBmb3IgdGhlIG1lZGlhIHR5cGVzIGFwcGxpY2F0
aW9uL2pzb24gYW5kIGFwcGxpY2F0aW9uL3RleHQuIiBpcyBub3QgY29ycmVjPQp0PTIwCi0gICAg
bmV3X2ZpbGVfcmVxdWVzdC5nZXRfbWV0aG9kID0zRCBsYW1iZGE6ICdHRVQnCi0gICAgI2dldCB1
cmwgdG8gdXBsb2FkIHRvCi0gICAgdGFyZ2V0X3VwbG9hZF91cmwgPTNEIHVybF9vcGVuZXIub3Bl
biggbmV3X2ZpbGVfcmVxdWVzdCApLnJlYWQoKQotICAgICN1cGxvYWQgZmlsZSB0byBkZXRlcm1p
bmVkIHVybAotICAgIHVwbG9hZF9oZWFkZXJzID0zRCBkaWN0KCB1cGxvYWRfcGFyYW1zICkKLSAg
ICAjdXBsb2FkX2hlYWRlcnNbICd4LWFtei1tZXRhLW1kNS1oYXNoJyBdID0zRCBjb250ZW50X21k
NS5oZXhkaWdlc3QoKQotICAgIHVwbG9hZF9oZWFkZXJzWyAnQWNjZXB0JyBdID0zRCAnYXBwbGlj
YXRpb24vanNvbicKLSAgICB1cGxvYWRfZmlsZV9yZXF1ZXN0ID0zRCB1cmxsaWIyLlJlcXVlc3Qo
IHRhcmdldF91cGxvYWRfdXJsLCBoZWFkZXJzID0KPTNEIHVwbG9hZF9oZWFkZXJzLCBkYXRhID0z
RCBpbnB1dF9maWxlICkKLSAgICB1cGxvYWRfZmlsZV9yZXF1ZXN0LmdldF9tZXRob2QgPTNEIGxh
bWJkYTogJ1BVVCcKLSAgICB1cGxvYWRfcmVzdWx0ID0zRCB1cmxsaWIyLnVybG9wZW4oIHVwbG9h
ZF9maWxlX3JlcXVlc3QgKS5yZWFkKCkKKyAgICBpZiBjb250ZW50X2xlbmd0aCA+IFRBUkdFVF9T
SU1QTEVfUFVUX1VQTE9BRF9TSVpFOgorICAgICAgICAjIERldGVybWluZSBzaXplcyBvZiBlYWNo
IHBhcnQuCisgICAgICAgIHNwbGl0X2NvdW50ID0zRCBjb250ZW50X2xlbmd0aCAvIFRBUkdFVF9T
UExJVF9TSVpFCisgICAgICAgIGxhc3Rfc2l6ZSA9M0QgY29udGVudF9sZW5ndGggLSAoIHNwbGl0
X2NvdW50ICogVEFSR0VUX1NQTElUX1NJWkUgKQorICAgICAgICBzaXplcyA9M0QgWyBUQVJHRVRf
U1BMSVRfU0laRSBdICogc3BsaXRfY291bnQKKyAgICAgICAgaWYgbGFzdF9zaXplOgorICAgICAg
ICAgICAgaWYgbGFzdF9zaXplIDwgTUlOX01VTFRJUEFSVF9VUExPQURfU0laRToKKyAgICAgICAg
ICAgICAgICBpZiBzaXplczoKKyAgICAgICAgICAgICAgICAgICAgc2l6ZXNbLTFdID0zRCBzaXpl
c1stMV0gKyBsYXN0X3NpemUKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAg
ICAgICBzaXplcyA9M0QgWyBsYXN0X3NpemUgXQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAg
ICAgICAgICBzaXplcy5hcHBlbmQoIGxhc3Rfc2l6ZSApCisgICAgICAgIHByaW50ICJQZXJmb3Jt
aW5nIG11bHRpLXBhcnQgdXBsb2FkIGluICVpIHBhcnRzLiIgJSAoIGxlbiggc2l6ZXMgKT0KICkK
KyAgICAgICAgI2dldCB1cGxvYWQgdXJsCisgICAgICAgIHVwbG9hZF91cmwgPTNEICJ1cGxvYWRp
bmZvIgorICAgICAgICB1cGxvYWRfdXJsID0zRCAiJXMvJXMvJXMlcy8lcyIgJSAoIGRtX3VybCwg
R0VOT01FU1BBQ0VfQVBJX1ZFUlNJT049Cl9TVFJJTkcsIHVwbG9hZF91cmwsIHRhcmdldF9kaXJl
Y3RvcnlfZGljdFsncGF0aCddLCB1cmxsaWIucXVvdGUoIHRhcmdldF9maT0KbGVuYW1lLCBzYWZl
PTNEJycgKSApCisgICAgICAgIHVwbG9hZF9yZXF1ZXN0ID0zRCB1cmxsaWIyLlJlcXVlc3QoIHVw
bG9hZF91cmwsIGhlYWRlcnMgPTNEIHsgJ0Nvbj0KdGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pz
b24nLCAnQWNjZXB0JzogJ2FwcGxpY2F0aW9uL2pzb24nIH0gKQorICAgICAgICB1cGxvYWRfcmVx
dWVzdC5nZXRfbWV0aG9kID0zRCBsYW1iZGE6ICdHRVQnCisgICAgICAgIHVwbG9hZF9pbmZvID0z
RCBqc29uLmxvYWRzKCB1cmxfb3BlbmVyLm9wZW4oIHVwbG9hZF9yZXF1ZXN0ICkucmVhZD0KKCkg
KQorICAgICAgICBjb25uID0zRCBTM0Nvbm5lY3Rpb24oIGF3c19hY2Nlc3Nfa2V5X2lkPTNEdXBs
b2FkX2luZm9bJ2FtYXpvbkNyZWQ9CmVudGlhbHMnXVsnYWNjZXNzS2V5J10sCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd3Nfc2VjcmV0X2FjY2Vzc19r
ZXk9M0R1cD0KbG9hZF9pbmZvWydhbWF6b25DcmVkZW50aWFscyddWydzZWNyZXRLZXknXSwKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3VyaXR5X3Rv
a2VuPTNEdXBsb2FkX2luPQpmb1snYW1hem9uQ3JlZGVudGlhbHMnXVsnc2Vzc2lvblRva2VuJ10g
KQorICAgICAgICAjIENhbm5vdCB1c2UgY29ubi5nZXRfYnVja2V0IGR1ZSB0byBwZXJtaXNzaW9u
cywgbWFudWFsbHkgY3JlYXRlIGI9CnVja2V0IG9iamVjdAorICAgICAgICBidWNrZXQgPTNEIGJv
dG8uczMuYnVja2V0LkJ1Y2tldCggY29ubmVjdGlvbj0zRGNvbm4sIG5hbWU9M0R1cGxvYWQ9Cl9p
bmZvWydzM0J1Y2tldE5hbWUnXSApCisgICAgICAgIG1wID0zRCBidWNrZXQuaW5pdGlhdGVfbXVs
dGlwYXJ0X3VwbG9hZCggdXBsb2FkX2luZm9bJ3MzT2JqZWN0S2V5Jz0KXSApCisgICAgICAgIGZv
ciBpLHBhcnRfc2l6ZSBpbiBlbnVtZXJhdGUoIHNpemVzLCBzdGFydD0zRDEgKToKKyAgICAgICAg
ICAgIGZoID0zRCB0ZW1wZmlsZS5UZW1wb3JhcnlGaWxlKCAnd2IrJyApCisgICAgICAgICAgICB3
aGlsZSBwYXJ0X3NpemU6CisgICAgICAgICAgICAgICAgaWYgQ0hVTktfU0laRSA+IHBhcnRfc2l6
ZToKKyAgICAgICAgICAgICAgICAgICAgcmVhZF9zaXplID0zRCBwYXJ0X3NpemUKKyAgICAgICAg
ICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICByZWFkX3NpemUgPTNEIENIVU5LX1NJ
WkUKKyAgICAgICAgICAgICAgICBjaHVuayA9M0QgaW5wdXRfZmlsZS5yZWFkKCByZWFkX3NpemUg
KQorICAgICAgICAgICAgICAgIGZoLndyaXRlKCBjaHVuayApCisgICAgICAgICAgICAgICAgcGFy
dF9zaXplID0zRCBwYXJ0X3NpemUgLSByZWFkX3NpemUKKyAgICAgICAgICAgIGZoLmZsdXNoKCkK
KyAgICAgICAgICAgIGZoLnNlZWsoMCkKKyAgICAgICAgICAgIG1wLnVwbG9hZF9wYXJ0X2Zyb21f
ZmlsZSggZmgsIGkgKQorICAgICAgICAgICAgZmguY2xvc2UoKQorICAgICAgICB1cGxvYWRfcmVz
dWx0ID0zRCBtcC5jb21wbGV0ZV91cGxvYWQoKQorICAgIGVsc2U6CisgICAgICAgIHByaW50ICdQ
ZXJmb3JtaW5nIHNpbXBsZSBwdXQgdXBsb2FkLicKKyAgICAgICAgdXBsb2FkX3VybCA9M0QgInVw
bG9hZHVybCIKKyAgICAgICAgY29udGVudF9tZDUgPTNEIGhhc2hsaWIubWQ1KCkKKyAgICAgICAg
Y2h1bmtfd3JpdGUoIGlucHV0X2ZpbGUsIGNvbnRlbnRfbWQ1LCB0YXJnZXRfbWV0aG9kPTNEInVw
ZGF0ZSIgKQorICAgICAgICBpbnB1dF9maWxlLnNlZWsoIDAgKSAjYmFjayB0byBzdGFydCwgZm9y
IHVwbG9hZGluZwogICAgPTIwCisgICAgICAgIHVwbG9hZF9wYXJhbXMgPTNEIHsgJ0NvbnRlbnQt
TGVuZ3RoJzogY29udGVudF9sZW5ndGgsICdDb250ZW50LU1ENT0KJzogYmFzZTY0LnN0YW5kYXJk
X2I2NGVuY29kZSggY29udGVudF9tZDUuZGlnZXN0KCkgKSwgJ0NvbnRlbnQtVHlwZSc6IGNvbnRl
PQpudF90eXBlIH0KKyAgICAgICAgdXBsb2FkX3VybCA9M0QgIiVzLyVzLyVzJXMvJXM/JXMiICUg
KCBkbV91cmwsIEdFTk9NRVNQQUNFX0FQSV9WRVJTPQpJT05fU1RSSU5HLCB1cGxvYWRfdXJsLCB0
YXJnZXRfZGlyZWN0b3J5X2RpY3RbJ3BhdGgnXSwgdXJsbGliLnF1b3RlKCB0YXJnZXQ9Cl9maWxl
bmFtZSwgc2FmZT0zRCcnICksIHVybGxpYi51cmxlbmNvZGUoIHVwbG9hZF9wYXJhbXMgKSApCisg
ICAgICAgIG5ld19maWxlX3JlcXVlc3QgPTNEIHVybGxpYjIuUmVxdWVzdCggdXBsb2FkX3VybCAp
IywgaGVhZGVycyA9M0Qgez0KICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsICdB
Y2NlcHQnOiAnYXBwbGljYXRpb24vdGV4dCcgfSApICNhcHBhPQpyZW50bHkgaHR0cDovL3d3dy5n
ZW5vbWVzcGFjZS5vcmcvdGVhbS9zcGVjcy91cGRhdGVkLWRtLXJlc3QtYXBpOiJFdmVyeSBIVFQ9
ClAgcmVxdWVzdCB0byB0aGUgRGF0YSBNYW5hZ2VyIHNob3VsZCBpbmNsdWRlIHRoZSBBY2NlcHQg
aGVhZGVyIHdpdGggYSBwcmVmZT0KcmVuY2UgZm9yIHRoZSBtZWRpYSB0eXBlcyBhcHBsaWNhdGlv
bi9qc29uIGFuZCBhcHBsaWNhdGlvbi90ZXh0LiIgaXMgbm90IGNvPQpycmVjdD0yMAorICAgICAg
ICBuZXdfZmlsZV9yZXF1ZXN0LmdldF9tZXRob2QgPTNEIGxhbWJkYTogJ0dFVCcKKyAgICAgICAg
I2dldCB1cmwgdG8gdXBsb2FkIHRvCisgICAgICAgIHRhcmdldF91cGxvYWRfdXJsID0zRCB1cmxf
b3BlbmVyLm9wZW4oIG5ld19maWxlX3JlcXVlc3QgKS5yZWFkKCkKKyAgICAgICAgI3VwbG9hZCBm
aWxlIHRvIGRldGVybWluZWQgdXJsCisgICAgICAgIHVwbG9hZF9oZWFkZXJzID0zRCBkaWN0KCB1
cGxvYWRfcGFyYW1zICkKKyAgICAgICAgI3VwbG9hZF9oZWFkZXJzWyAneC1hbXotbWV0YS1tZDUt
aGFzaCcgXSA9M0QgY29udGVudF9tZDUuaGV4ZGlnZXN0PQooKQorICAgICAgICB1cGxvYWRfaGVh
ZGVyc1sgJ0FjY2VwdCcgXSA9M0QgJ2FwcGxpY2F0aW9uL2pzb24nCisgICAgICAgIHVwbG9hZF9m
aWxlX3JlcXVlc3QgPTNEIHVybGxpYjIuUmVxdWVzdCggdGFyZ2V0X3VwbG9hZF91cmwsIGhlYWRl
cj0KcyA9M0QgdXBsb2FkX2hlYWRlcnMsIGRhdGEgPTNEIGlucHV0X2ZpbGUgKQorICAgICAgICB1
cGxvYWRfZmlsZV9yZXF1ZXN0LmdldF9tZXRob2QgPTNEIGxhbWJkYTogJ1BVVCcKKyAgICAgICAg
dXBsb2FkX3Jlc3VsdCA9M0QgdXJsbGliMi51cmxvcGVuKCB1cGxvYWRfZmlsZV9yZXF1ZXN0ICku
cmVhZCgpCiAgICAgcmVzdWx0X3VybCA9M0QgIiVzLyVzIiAlICggdGFyZ2V0X2RpcmVjdG9yeV9k
aWN0Wyd1cmwnXSwgdXJsbGliLnF1b3RlKD0KIHRhcmdldF9maWxlbmFtZSwgc2FmZT0zRCcnICkg
KQogICAgICNkZXRlcm1pbmUgYXZhaWxhYmxlIGdzIGxhdW5jaCBhcHBzCiAgICAgd2ViX3Rvb2xz
ID0zRCBnZXRfZ2Vub21lX3NwYWNlX2xhdW5jaF9hcHBzKCBnZW5vbWVzcGFjZV9zaXRlX2RpY3Rb
J2F0bT0KU2VydmVyJ10sIHVybF9vcGVuZXIsIHJlc3VsdF91cmwsIGZpbGVfdHlwZSApCgpkaWZm
IC1yIDRiZWM2ZjAxMGE4OWFiMGFjYzNkNjcyYWIwY2UyMDRlMWQxZDZlYjIgLXIgNTdiYmJlMTQ2
M2Y2MTZmOTg3OTNhODc9CmQ2YjNhYzBkNDM1NjgyNWY0IHRvb2xzL2dlbm9tZXNwYWNlL2dlbm9t
ZXNwYWNlX2V4cG9ydGVyLnhtbAotLS0gYS90b29scy9nZW5vbWVzcGFjZS9nZW5vbWVzcGFjZV9l
eHBvcnRlci54bWwKKysrIGIvdG9vbHMvZ2Vub21lc3BhY2UvZ2Vub21lc3BhY2VfZXhwb3J0ZXIu
eG1sCkBAIC0xLDUgKzEsNSBAQAogPD94bWwgdmVyc2lvbj0zRCIxLjAiPz4KLTx0b29sIG5hbWU9
M0QiR2Vub21lU3BhY2UgRXhwb3J0ZXIiIGlkPTNEImdlbm9tZXNwYWNlX2V4cG9ydGVyIiByZXF1
aXJlX2xvPQpnaW49M0QiVHJ1ZSIgdmVyc2lvbj0zRCIwLjAuMiI+Cis8dG9vbCBuYW1lPTNEIkdl
bm9tZVNwYWNlIEV4cG9ydGVyIiBpZD0zRCJnZW5vbWVzcGFjZV9leHBvcnRlciIgcmVxdWlyZV9s
bz0KZ2luPTNEIlRydWUiIHZlcnNpb249M0QiMC4wLjMiPjxkZXNjcmlwdGlvbj4gLSBzZW5kIGRh
dGEgdG8gR2Vub21lU3BhY2U8L2RlPQpzY3JpcHRpb24+PGNvbW1hbmQgaW50ZXJwcmV0ZXI9M0Qi
cHl0aG9uIj5nZW5vbWVzcGFjZV9leHBvcnRlci5weT0yMAogICAgICAgICAtLWdlbm9tZXNwYWNl
X3NpdGUgInByb2QiCkBAIC0zNiw3ICszNiw3IEBACiAgICAgICAgIDxwYXJhbSBmb3JtYXQ9M0Qi
ZGF0YSIgbmFtZT0zRCJpbnB1dDEiIHR5cGU9M0QiZGF0YSIgbGFiZWw9M0QiU2VuZD0KIHRoaXMg
ZGF0YXNldCB0byBHZW5vbWVTcGFjZSIgLz48cGFyYW0gbmFtZT0zRCJiYXNlX3VybCIgdHlwZT0z
RCJiYXNldXJsIiAvPQo+PHBhcmFtIG5hbWU9M0Qic3ViZGlyZWN0b3J5IiB0eXBlPTNEImRyaWxs
X2Rvd24iIGRpc3BsYXk9M0QicmFkaW8iIGhpZXJhcmM9Cmh5PTNEImV4YWN0IiBtdWx0aXBsZT0z
RCJGYWxzZSIgb3B0aW9uYWw9M0QiVHJ1ZSIgbGFiZWw9M0QiQ2hvb3NlIFRhcmdldCBEaT0KcmVj
dG9yeSIgZHluYW1pY19vcHRpb25zPTNEImdhbGF4eV9jb2RlX2dldF9nZW5vbWVzcGFjZV9mb2xk
ZXJzKCBnZW5vbWVzcGFjPQplX3NpdGUgPTNEICdwcm9kJywgdHJhbnM9M0RfX3RyYW5zX18sIHZh
bHVlPTNEX192YWx1ZV9fLCBpbnB1dF9kYXRhc2V0PTNEaW49CnB1dDEsIGJhc2VfdXJsPTNEYmFz
ZV91cmwgKSIgaGVscD0zRCJMZWF2ZSBibGFuayB0byBnZW5lcmF0ZSBhdXRvbWF0aWNhbGx5Ij0K
Lz4KLSAgICAgICAgPHBhcmFtIG5hbWU9M0QiZmlsZW5hbWUiIHR5cGU9M0QidGV4dCIgc2l6ZT0z
RCI4MCIgaGVscD0zRCJMZWF2ZSBiPQpsYW5rIHRvIGdlbmVyYXRlIGF1dG9tYXRpY2FsbHkiIC8+
CisgICAgICAgIDxwYXJhbSBuYW1lPTNEImZpbGVuYW1lIiB0eXBlPTNEInRleHQiIHNpemU9M0Qi
ODAiIGxhYmVsPTNEIkZpbGVuYT0KbWUiIGhlbHA9M0QiTGVhdmUgYmxhbmsgdG8gZ2VuZXJhdGUg
YXV0b21hdGljYWxseSIgLz48L2lucHV0cz48b3V0cHV0cz48ZGF0PQphIGZvcm1hdD0zRCJodG1s
IiBuYW1lPTNEIm91dHB1dF9sb2ciIC8+CgoKaHR0cHM6Ly9iaXRidWNrZXQub3JnL2dhbGF4eS9n
YWxheHktY2VudHJhbC9jb21taXRzL2RlOWQ1ZjY1YzE1ZS8KQ2hhbmdlc2V0OiAgIGRlOWQ1ZjY1
YzE1ZQpCcmFuY2g6ICAgICAgcmVsZWFzZV8xNC4wOApVc2VyOiAgICAgICAgbmF0ZWZvbwpEYXRl
OiAgICAgICAgMjAxNS0wNC0yMCAxNToyODozNyswMDowMApTdW1tYXJ5OiAgICAgQ3JlYXRlIGJy
YW5jaCByZWxlYXNlXzE0LjA4IGZyb20gbGF0ZXN0XzIwMTQuMDguMTEKQWZmZWN0ZWQgIzogIDAg
ZmlsZXMKCgoKaHR0cHM6Ly9iaXRidWNrZXQub3JnL2dhbGF4eS9nYWxheHktY2VudHJhbC9jb21t
aXRzL2EyZmFkNDRkYTg0Ny8KQ2hhbmdlc2V0OiAgIGEyZmFkNDRkYTg0NwpCcmFuY2g6ICAgICAg
cmVsZWFzZV8xNC4xMApVc2VyOiAgICAgICAgbmF0ZWZvbwpEYXRlOiAgICAgICAgMjAxNS0wNC0y
MCAxNTozMDoyMSswMDowMApTdW1tYXJ5OiAgICAgQ3JlYXRlIGJyYW5jaCByZWxlYXNlXzE0LjEw
IGZyb20gbGF0ZXN0XzIwMTQuMTAuMDYKQWZmZWN0ZWQgIzogIDAgZmlsZXMKCgoKaHR0cHM6Ly9i
aXRidWNrZXQub3JnL2dhbGF4eS9nYWxheHktY2VudHJhbC9jb21taXRzLzdhMDljMDVhZWQ3YS8K
Q2hhbmdlc2V0OiAgIDdhMDljMDVhZWQ3YQpCcmFuY2g6ICAgICAgcmVsZWFzZV8xNS4wMQpVc2Vy
OiAgICAgICAgbmF0ZWZvbwpEYXRlOiAgICAgICAgMjAxNS0wNC0yMCAxNTozMToyNSswMDowMApT
dW1tYXJ5OiAgICAgQ3JlYXRlIGJyYW5jaCByZWxlYXNlXzE1LjAxIGZyb20gbGF0ZXN0XzIwMTUu
MDEuMTMKQWZmZWN0ZWQgIzogIDAgZmlsZXMKClJlcG9zaXRvcnkgVVJMOiBodHRwczovL2JpdGJ1
Y2tldC5vcmcvZ2FsYXh5L2dhbGF4eS1jZW50cmFsLwoKLS0KClRoaXMgaXMgYSBjb21taXQgbm90
aWZpY2F0aW9uIGZyb20gYml0YnVja2V0Lm9yZy4gWW91IGFyZSByZWNlaXZpbmcKdGhpcyBiZWNh
dXNlIHlvdSBoYXZlIHRoZSBzZXJ2aWNlIGVuYWJsZWQsIGFkZHJlc3NpbmcgdGhlIHJlY2lwaWVu
dCBvZgp0aGlzIGVtYWlsLgo
1
0
Branch: refs/heads/master
Home: https://github.com/galaxyproject/usegalaxy-playbook
Commit: b5768fb2d3238552dfb045f974e33590ec093068
https://github.com/galaxyproject/usegalaxy-playbook/commit/b5768fb2d3238552…
Author: Martin Cech <cech.marten(a)gmail.com>
Date: 2015-04-17 (Fri, 17 Apr 2015)
Changed paths:
M stage/group_vars/toolshedservers.yml
Log Message:
-----------
update TTS config
1
0
17 Apr '15
Branch: refs/heads/master
Home: https://github.com/galaxyproject/usegalaxy-playbook
Commit: d164d700b94e5da2444e188d164482fe95875807
https://github.com/galaxyproject/usegalaxy-playbook/commit/d164d700b94e5da2…
Author: Nate Coraor <nate(a)bx.psu.edu>
Date: 2015-04-17 (Fri, 17 Apr 2015)
Changed paths:
M roles/usegalaxy_admin/tasks/main.yml
Log Message:
-----------
Fix log archival cron jobs.
1
0
17 Apr '15
Branch: refs/heads/master
Home: https://github.com/galaxyproject/usegalaxy-playbook
Commit: aebfe1c548b38dbb2c86a2b49c85a64b0b3412bd
https://github.com/galaxyproject/usegalaxy-playbook/commit/aebfe1c548b38dbb…
Author: Nate Coraor <nate(a)bx.psu.edu>
Date: 2015-04-17 (Fri, 17 Apr 2015)
Changed paths:
M production/group_vars/galaxyservers.yml
Log Message:
-----------
Enable nginx upload for job files.
1
0
Branch: refs/heads/master
Home: https://github.com/galaxyproject/usegalaxy-playbook
Commit: 8a9c357a3d20693a621962b5ad9b36722842474e
https://github.com/galaxyproject/usegalaxy-playbook/commit/8a9c357a3d20693a…
Author: Nate Coraor <nate(a)bx.psu.edu>
Date: 2015-04-17 (Fri, 17 Apr 2015)
Changed paths:
M templates/galaxy/usegalaxy.org/config/job_conf.xml.j2
Log Message:
-----------
Reenable rodeo
1
0
[galaxyproject/ansible-galaxy] b88864: Add a flag to force vcs checkout (defaulting to no...
by GitHub 16 Apr '15
by GitHub 16 Apr '15
16 Apr '15
Branch: refs/heads/master
Home: https://github.com/galaxyproject/ansible-galaxy
Commit: b8886463194ed66c22c2a810956b84b2ed551638
https://github.com/galaxyproject/ansible-galaxy/commit/b8886463194ed66c22c2…
Author: Enis Afgan <afgane(a)gmail.com>
Date: 2015-04-16 (Thu, 16 Apr 2015)
Changed paths:
M README.md
M defaults/main.yml
M tasks/clone.yml
Log Message:
-----------
Add a flag to force vcs checkout (defaulting to no)
1
0