@hotstaq/admin-panel 0.3.18 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/assets/css/freelight-panel.css +174 -0
  2. package/build/WebExport.d.ts.map +1 -1
  3. package/build/WebExport.js +7 -1
  4. package/build/WebExport.js.map +1 -1
  5. package/build/components/admin-add-panel.d.ts +62 -0
  6. package/build/components/admin-add-panel.d.ts.map +1 -0
  7. package/build/components/admin-add-panel.js +191 -0
  8. package/build/components/admin-add-panel.js.map +1 -0
  9. package/build/components/admin-card-table.d.ts +55 -0
  10. package/build/components/admin-card-table.d.ts.map +1 -0
  11. package/build/components/admin-card-table.js +149 -0
  12. package/build/components/admin-card-table.js.map +1 -0
  13. package/build/components/admin-detail-page.d.ts +68 -0
  14. package/build/components/admin-detail-page.d.ts.map +1 -0
  15. package/build/components/admin-detail-page.js +247 -0
  16. package/build/components/admin-detail-page.js.map +1 -0
  17. package/build/components/admin-disclaimer.d.ts +21 -0
  18. package/build/components/admin-disclaimer.d.ts.map +1 -0
  19. package/build/components/admin-disclaimer.js +37 -0
  20. package/build/components/admin-disclaimer.js.map +1 -0
  21. package/build/components/admin-eyebrow-heading.d.ts +23 -0
  22. package/build/components/admin-eyebrow-heading.d.ts.map +1 -0
  23. package/build/components/admin-eyebrow-heading.js +40 -0
  24. package/build/components/admin-eyebrow-heading.js.map +1 -0
  25. package/build/components/admin-form-field.d.ts +69 -0
  26. package/build/components/admin-form-field.d.ts.map +1 -0
  27. package/build/components/admin-form-field.js +117 -0
  28. package/build/components/admin-form-field.js.map +1 -0
  29. package/build/index.d.ts +7 -1
  30. package/build/index.d.ts.map +1 -1
  31. package/build/index.js +16 -1
  32. package/build/index.js.map +1 -1
  33. package/build/tsconfig.tsbuildinfo +1 -1
  34. package/build-web/AdminPanelComponents.js +2 -2
  35. package/package.json +1 -1
  36. package/src/WebExport.ts +7 -1
  37. package/src/components/admin-add-panel.ts +232 -0
  38. package/src/components/admin-card-table.ts +183 -0
  39. package/src/components/admin-detail-page.ts +270 -0
  40. package/src/components/admin-disclaimer.ts +43 -0
  41. package/src/components/admin-eyebrow-heading.ts +50 -0
  42. package/src/components/admin-form-field.ts +166 -0
  43. package/src/index.ts +18 -2
@@ -1,2 +1,2 @@
1
- var AdminPanelComponentsWeb;(()=>{"use strict";var t={41:t=>{t.exports=DataTable},79:t=>{t.exports=HotStaqWeb},91:function(t,e,n){var i=this&&this.__awaiter||function(t,e,n,i){return new(n||(n=Promise))((function(l,s){function o(t){try{d(i.next(t))}catch(t){s(t)}}function a(t){try{d(i.throw(t))}catch(t){s(t)}}function d(t){var e;t.done?l(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(o,a)}d((i=i.apply(t,e||[])).next())}))};Object.defineProperty(e,"__esModule",{value:!0}),e.AdminDropdown=void 0;const l=n(79);class s extends l.HotComponent{constructor(t,e){super(t,e),this.tag="admin-dropdown",this.placeholder="Search",this.onsearch=null,this.onselect=null}onPostPlace(t,e){let n=t.querySelectorAll('hot-place-here[type="modal"]');if(n.length>0){let i=n[0];t.removeChild(e),i.appendChild(e)}return null!=this.onsearch&&("string"==typeof this.onsearch&&(this.onsearch=new Function(this.onsearch)),e.querySelector("input").addEventListener("keyup",(t=>i(this,void 0,void 0,(function*(){const e=t.currentTarget.value;let n=yield this.onsearch(e,t),i=$(this.htmlElements[1]).find(".searchResults");i.empty();for(let t=0;t<n.length;t++){const e=n[t];let l=e.url,s=e.value,o=e.text;const a=$('<li><a class="dropdown-item" href="" data-value="" onclick=""></a></li>'),d=a.find("a");d.attr("href",l),d.attr("data-value",s),d.text(o),d.removeAttr("onclick").on("click",(()=>{this.selected(t)})),i.append(a)}}))))),null}selected(t){return i(this,void 0,void 0,(function*(){if(null!=this.onselect){"string"==typeof this.onselect&&(this.onselect=new Function(this.onselect));const e=this.htmlElements[1].querySelectorAll("a")[t].getAttribute("href"),n=this.htmlElements[1].querySelectorAll("a")[t].getAttribute("data-value"),i=this.htmlElements[1].querySelectorAll("a")[t].innerHTML;yield this.onselect(e,n,i)}}))}output(){return`<div class="dropdown">\n\t\t<button class="btn btn-primary dropdown-toggle" type="button" data-bs-toggle="dropdown" aria-expanded="false">\n\t\t ${this.inner}\n\t\t</button>\n\t\t<ul class="dropdown-menu">\n\t\t\t<li>\n\t\t\t\t<div class = "input-group">\n\t\t\t\t\t<input type = "text" class = "form-control" placeholder = "${this.placeholder}" value = "" />\n\t\t\t\t</div>\n\t\t\t</li>\n\t\t\t<div class = "searchResults">\n\t\t\t</div>\n\t\t</ul>\n\t</div>`}}e.AdminDropdown=s},383:t=>{t.exports=bootstrap},494:function(t,e,n){var i=this&&this.__awaiter||function(t,e,n,i){return new(n||(n=Promise))((function(l,s){function o(t){try{d(i.next(t))}catch(t){s(t)}}function a(t){try{d(i.throw(t))}catch(t){s(t)}}function d(t){var e;t.done?l(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(o,a)}d((i=i.apply(t,e||[])).next())}))},l=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.AdminEdit=void 0;const s=n(79),o=l(n(383));class a extends s.HotComponent{constructor(t,e){super(t,e),this.onAddClicked=null,this.onEditClicked=null,this.onRemoveClicked=null,this.tag="admin-edit",this.title="",this.button_title="Save",this.attached_list="",this.schema="",this.modalId="",this.add_text="Add",this.add_place_here="dashboardHeader",this.edit_text="Edit",this.edit_place_here="dashboardHeader",this.remove_text="Remove",this.remove_place_here="dashboardHeader",this.css_class="",this.modal=null,this.modalType="add",this.closeOnSave=!0,this.selectedFields=[],this.onsave=null,this.onedit=null,this.ondelete=null}processHotFields(t){return i(this,void 0,void 0,(function*(){const e=this.htmlElements[1].querySelectorAll("[hot-field]");for(let n=0;n<e.length;n++){const i=e[n],l=$(i).attr("hot-field");let s=$(i).attr("hot-field-type"),o=$(i).attr("hot-field-input");null!=s&&""!==s||(s="text"),i.fieldType=s,yield t(i,{name:l,type:s,input:o})}}))}addClicked(){return i(this,arguments,void 0,(function*(t=[]){if(null==this.onAddClicked||!1!==(yield this.onAddClicked())){if(this.modalType="add",yield this.processHotFields(((t,e)=>i(this,void 0,void 0,(function*(){$(t).val("")})))),this.selectedFields=t,null!=this.onadd){"string"==typeof this.onadd&&(this.onadd=new Function(this.onadd));let t=yield this.onadd(this.modalType,this.selectedFields);if(null!=t&&!1===t)return}o.default.Modal.getInstance(`#${this.modalId}`).show()}}))}getAttachedHTMLLists(){const t=this.attached_list.split(","),e=[];for(let n=0;n<t.length;n++){const i=t[n];let l=document.getElementById(i);e.push(l)}return e}getAttachedLists(){const t=this.getAttachedHTMLLists();let e=[];for(let n=0;n<t.length;n++){const i=t[n].hotComponent;e.push(i)}return e}editClicked(){return i(this,arguments,void 0,(function*(t=null,e=[]){if(null==this.onEditClicked||!1!==(yield this.onEditClicked(t,e))){if(this.modalType="edit",this.selectedFields=e,""!==this.attached_list){const e=this.getAttachedLists();for(let n=0;n<e.length;n++){let l=e[n];if(null!=t&&l.name!==t)continue;l.attachedEdit=this;let s=l.getSelected();null!=s&&(yield this.processHotFields(((t,e)=>i(this,void 0,void 0,(function*(){let n=s[e.name];if(null!=e.input&&""!==e.input){let i=new Function(e.input);n=yield i.call(this,this,t,n)}null!=n&&$(t).val(n)})))),this.selectedFields=[s])}}if(null!=this.onedit){"string"==typeof this.onedit&&(this.onedit=new Function(this.onedit));let t=yield this.onedit(this.modalType,this.selectedFields);if(null!=t&&!1===t)return}o.default.Modal.getInstance(`#${this.modalId}`).show()}}))}removeClicked(){return i(this,void 0,void 0,(function*(){if(null!=this.onRemoveClicked&&!1===(yield this.onRemoveClicked()))return;this.modalType="remove";let t=[],e=null;if(""!==this.attached_list){const n=this.getAttachedLists();for(let i=0;i<n.length;i++){e=n[i],e.attachedEdit=this;let l=e.getCheckedRows();if(l.length>0)for(let e=0;e<l.length;e++){let n=l[e];t.push(n)}let s=e.getSelected();null!=s&&(t=[s])}}if(!0===confirm("Are you sure you want to remove this item?")){for(let n=0;n<t.length;n++){let i=t[n];if(null!=e)for(let t in i){let n=e.getFieldType(t);null!=n&&"remove"===n&&delete i[t]}if(null!=this.ondelete)"string"==typeof this.ondelete&&(this.ondelete=new Function(this.ondelete)),yield this.ondelete(i);else{let t=s.Hot.Data.AdminPanel.removeUrl;yield s.Hot.jsonRequest(t,{schema:this.schema,whereFields:i})}}if(0===t.length)if(null!=this.ondelete)"string"==typeof this.ondelete&&(this.ondelete=new Function(this.ondelete)),yield this.ondelete(null);else{let t=s.Hot.Data.AdminPanel.removeUrl;yield s.Hot.jsonRequest(t,{schema:this.schema,whereFields:null})}if(null!=e){const t=yield e.refreshList(),n=e.prepareData(t);e.tableCallback(n)}}}))}onSave(){return i(this,void 0,void 0,(function*(){let t={};if(yield this.processHotFields(((e,n)=>i(this,void 0,void 0,(function*(){if("remove"===n.type)return;let i=$(e).val();if(null!=$(e).attr("hot-value")&&(i=$(e).attr("hot-value")),null!=$(e).attr("hot-field-save")){let t=$(e).attr("hot-field-save");if(null!=t&&""!==t){let n=new Function(t);i=yield n.call(this,this,e,i)}}if("array"===n.type)return null==t[n.name]&&(t[n.name]=[]),void t[n.name].push(i);if("number"===n.type&&(i=parseFloat(i)),"integer"===n.type&&(i=parseInt(i)),"bool"===n.type||"boolean"===n.type){const t=i.toLowerCase();i=!1,"1"!=t&&"true"!=t&&"yes"!=t||(i=!0)}t[n.name]=i})))),null!=this.onsave){if("string"==typeof this.onsave&&(this.onsave=new Function(this.onsave)),!1===(yield this.onsave(this.modalType,t,this.selectedFields)))return}else{if("add"===this.modalType){let e=s.Hot.Data.AdminPanel.addUrl;yield s.Hot.jsonRequest(e,{schema:this.schema,fields:t})}if("edit"===this.modalType){if(0===this.selectedFields.length)return void alert("No item(s) selected!");let e={};yield this.processHotFields(((t,n)=>i(this,void 0,void 0,(function*(){if("remove"===n.type)return;let i=$(t).val();if(null!=$(t).attr("hot-value")&&(i=$(t).attr("hot-value")),"array"===n.type)return null==e[n.name]&&(e[n.name]=[]),void e[n.name].push(i);e[n.name]=i}))));let n=s.Hot.Data.AdminPanel.editUrl;yield s.Hot.jsonRequest(n,{schema:this.schema,whereFields:e,fields:t})}}if(""!==this.attached_list){const t=this.getAttachedLists();for(let e=0;e<t.length;e++){let n=t[e];n.attachedEdit=this;const i=yield n.refreshList(),l=n.prepareData(i);n.tableCallback(l)}}!0===this.closeOnSave&&o.default.Modal.getInstance(`#${this.modalId}`).hide()}))}onPostPlace(t,e){return this.modal=new o.default.Modal($(`#${this.modalId}`)[0],{backdrop:!0,keyboard:!0,focus:!0}),setTimeout((()=>{if(""!==this.attached_list){const t=this.getAttachedLists();for(let e=0;e<t.length;e++){let n=t[e];null!=n&&(n.attachedEdit=this)}}}),50),null}output(){if(""===this.name)throw new Error("You must specify a name for each admin-edit element!");this.modalId=`${this.name}Modal`;let t=[{html:`\n\t\t\t\x3c!-- ${this.title} Modal Start --\x3e\n\t\t\t<div class="modal fade ${this.css_class}" id="${this.modalId}" tabindex="-1" aria-labelledby="${this.name}ModalLabel" aria-hidden="true">\n\t\t\t\t<div class="modal-dialog">\n\t\t\t\t\t<div class="modal-content">\n\t\t\t\t\t<div class="modal-header">\n\t\t\t\t\t\t<h5 class="modal-title" id="${this.name}ModalLabel">${this.title}</h5>\n\t\t\t\t\t\t<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class="modal-body">\n\t\t\t\t\t\t<hot-place-here name = "modalBody" type = "modal"></hot-place-here>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class="modal-footer">\n\t\t\t\t\t\t<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Cancel</button>\n\t\t\t\t\t\t<button type="button" class="btn btn-primary" onclick = "document.getElementById('${this.modalId}').onSave ();">${this.button_title}</button>\n\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t\x3c!-- ${this.title} Modal End --\x3e`,documentSelector:"body"}];return""!==this.add_place_here&&t.push({html:`<button id = "${this.modalId}-add-btn" type="button" class="btn btn-sm btn-outline-secondary" onclick = "this.addClicked ();">${this.add_text}</button>`,documentSelector:`hot-place-here[name="${this.add_place_here}"]`}),""!==this.edit_place_here&&t.push({html:`<button id = "${this.modalId}-edit-btn" type="button" class="btn btn-sm btn-outline-secondary" onclick = "this.editClicked ('${this.modalId}');">${this.edit_text}</button>`,documentSelector:`hot-place-here[name="${this.edit_place_here}"]`}),""!==this.remove_place_here&&t.push({html:`<button id = "${this.modalId}-remove-btn" type="button" class="btn btn-sm btn-outline-secondary" onclick = "this.removeClicked ();">${this.remove_text}</button>`,documentSelector:`hot-place-here[name="${this.remove_place_here}"]`}),t}}e.AdminEdit=a},594:function(t,e,n){var i=this&&this.__awaiter||function(t,e,n,i){return new(n||(n=Promise))((function(l,s){function o(t){try{d(i.next(t))}catch(t){s(t)}}function a(t){try{d(i.throw(t))}catch(t){s(t)}}function d(t){var e;t.done?l(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(o,a)}d((i=i.apply(t,e||[])).next())}))};Object.defineProperty(e,"__esModule",{value:!0}),e.AdminButton=void 0;const l=n(79);class s extends l.HotComponent{constructor(t,e){super(t,e),this.tag="admin-button",this.css_class="btn btn-sm btn-outline-secondary",this.onclick=null}buttonClicked(){return i(this,void 0,void 0,(function*(){}))}onPostPlace(t,e){let n=t.querySelectorAll('hot-place-here[type="modal"]');if(n.length>0){let i=n[0];t.removeChild(e),i.appendChild(e)}return null!=this.onclick&&("string"==typeof this.onclick&&(this.onclick=new Function(this.onclick)),e.addEventListener("click",this.onclick)),null}output(){return`<button id = "${this.htmlElements[0].id}" class = "${this.css_class}" onclick = "this.buttonClicked ();">${this.inner}</button>`}}e.AdminButton=s},620:function(t,e,n){var i=this&&this.__awaiter||function(t,e,n,i){return new(n||(n=Promise))((function(l,s){function o(t){try{d(i.next(t))}catch(t){s(t)}}function a(t){try{d(i.throw(t))}catch(t){s(t)}}function d(t){var e;t.done?l(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(o,a)}d((i=i.apply(t,e||[])).next())}))},l=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.AdminTable=void 0;const s=n(79),o=l(n(41));class a extends s.HotComponent{constructor(t,e){super(t,e),this.rowElements=[],this.tag="admin-table",this.title="",this.schema="",this.headers={fields:{},elements:{},indicies:[]},this.rowElements=[],this.tableCallback=null,this.tableData=null,this.onlist=null,this.listurl="",this.checkbox=!0,this.singleclickedit=!1,this.onselectedrow=null,this.attachedEdit=null,this.selected=-1,this.dataTable=null,this.isListRefreshing=!1}addHeader(t){let e=this.htmlElements[0].getElementsByTagName("thead")[0];this.headers.indicies.length<1&&this.headers.indicies.push(null),this.headers.indicies.push(t.hotComponent.field),e.appendChild(t)}addHeaderDataOnly(t,e){this.headers.indicies.length<1&&this.headers.indicies.push(null),this.headers.indicies.push(t.field),this.headers.fields[t.field]=t,this.headers.elements[t.field]=e}getFieldType(t){if(null!=this.headers.elements[t]){let e=this.headers.elements[t].hotComponent;if(null!=e)return e.field_type}return null}selectRow(t,e){return i(this,void 0,void 0,(function*(){{let e=this.htmlElements[1].getElementsByTagName("tbody")[0].getElementsByTagName("tr");for(let t=0;t<e.length;t++){let n=e[t];!0===n.classList.contains("table-primary")&&n.classList.remove("table-primary")}t.classList.add("table-primary")}if(this.selected=e,"string"==typeof this.singleclickedit&&(this.singleclickedit=s.HotStaq.parseBoolean(this.singleclickedit)),!0===this.singleclickedit&&null!=this.attachedEdit&&(yield this.attachedEdit.editClicked(this.name)),null!=this.onselectedrow){"string"==typeof this.onselectedrow&&(this.onselectedrow=new Function(this.onselectedrow));let t=this.getSelected();if(null==t)return;if(!1===(yield this.onselectedrow(e,t)))return}}))}getSelected(){let t=this.selected;return t<0?null:this.dataTable.row(t).data()}getCheckedRows(){let t=[],e=this.htmlElements[1].getElementsByTagName("tbody")[0].getElementsByTagName("input");for(let n=0;n<e.length;n++){let i=e[n];if(null!=i.checked&&!0===i.checked){let e=i.parentElement.parentElement.getAttribute("data-index"),n=parseInt(e);t.push(this.rowElements[n].fields)}}return t}getRow(t){return this.rowElements[t].fields}addRow(t){if(null==t)return;if(0==t.length)return;this.htmlElements[1].getElementsByTagName("tbody")[0];let e=this.rowElements.length;"string"==typeof this.checkbox&&(this.checkbox=s.HotStaq.parseBoolean(this.checkbox));let n=[];for(let i=0;i<this.headers.indicies.length;i++){let l=this.headers.indicies[i];if(null==l)continue;let s=t[l],o=l.split(".");if(o.length>1){let e=t[o[0]];for(let t=1;t<o.length;t++)e=e[o[t]];s=e}let a=null;if(null!=this.headers.elements[l]){let t=this.getFieldType(l);if(null==t&&(t="text"),"remove"!==t){const t=this.headers.fields[l];let n=!0;null!=t&&(null!=t.oninput&&("string"==typeof t.oninput&&(this.headers.fields[l].oninput=new Function(t.oninput)),s=t.oninput(s)),null!=t.onoutput)&&("string"==typeof t.onoutput&&(this.headers.fields[l].onoutput=new Function(t.onoutput)),n=!1,a={index:e,value:t.onoutput(e,s)}),!0===n&&(a=s)}}n.push(a)}null==this.rows&&(this.rows=[])}clearRows(){return i(this,void 0,void 0,(function*(){this.rowElements=[],null!=this.dataTable&&this.dataTable.clear()}))}refreshList(){return i(this,arguments,void 0,(function*(t=null){this.isListRefreshing=!0;let e={search:"",offset:0,limit:10};if(null!=this.dataTable){const t=this.dataTable.search(),n=this.dataTable.page.info();e={search:t||"",offset:n.start||0,limit:n.length||10}}if(null!=this.onlist)"string"==typeof this.onlist&&(this.onlist=new Function(this.onlist)),t=yield this.onlist(e);else{let n="";""!==this.listurl&&(n=this.listurl),""!==n&&(t=yield s.Hot.jsonRequest(n,{schema:this.schema,search:e}))}if(this.clearRows(),null!=t){if(null!=t.error)return console.error(`List error: ${t.error}`),this.isListRefreshing=!1,null;if(null==t.data)throw new Error(`Returning list data to "${this.name}" component has a null data field. API response does not match the "IAPIResponse" schema.`);for(let e=0;e<t.data.length;e++){let n=t.data[e];for(let i in n){let l=n[i],s=this.getFieldType(i);if(null==s&&(s="text"),"remove"!==s){const n=this.headers.fields[i];let s=!0;null!=n&&(null!=n.oninput&&("string"==typeof n.oninput&&(this.headers.fields[i].oninput=new Function(n.oninput)),l=n.oninput(l)),null!=n.onoutput)&&("string"==typeof n.onoutput&&(this.headers.fields[i].onoutput=new Function(n.onoutput)),s=!1,l=n.onoutput(e,l)),t.data[e][i]=l}}}}let n=this.htmlElements[1].getElementsByTagName("tbody")[0];return n.hotComponent=this,$(n).on("click","tr",(function(){const t=this.parentNode.hotComponent,e=t.dataTable.row(this).index();null!=e?t.selectRow(this,e):null!=t.attachedEdit&&null!=t.attachedEdit.addClicked&&t.attachedEdit.addClicked()})),this.isListRefreshing=!1,t}))}prepareData(t){const e={draw:this.tableData,data:[],recordsTotal:0,recordsFiltered:0};if(null!=t){t instanceof Array?(e.data=t,e.recordsTotal=t.length,e.recordsFiltered=t.length):(null!=t.length&&(e.recordsTotal=t.length,e.recordsFiltered=t.length),null!=t.data&&(e.data=t.data));let n=!0;null!=e.data.hotSanitize&&(n=e.data.hotSanitize);for(let t=0;t<e.data.length;t++){const i=e.data[t];e.data[t]=!0===n?s.HotStaq.sanitizeJSON(i):i}}return e}onPostPlace(t,e){return setTimeout((()=>i(this,void 0,void 0,(function*(){const t=$(e).find("table");let n=[];$(t).find("thead th").each((function(){const t=$(this).text(),e=$(this).data("field");let i=$(this).data("field-type");if(null==t||""===t)return;if(null==e||""===e)return;"text"===i&&(i="string");const l=t;n.push({title:t,data:e,createdCell:function(t,e,n,i,s){t.setAttribute("data-label",l)}})})),$(t).find("thead").remove(),this.dataTable=new o.default(t[0],{processing:!0,serverSide:!0,colReorder:!0,scroller:!0,select:!0,dom:"Qlfrtip",columns:n,data:[],ajax:(t,e,n)=>i(this,void 0,void 0,(function*(){if(!0===this.isListRefreshing)return;this.tableCallback=e,this.tableData=t.draw;let n=yield this.refreshList();const i=this.prepareData(n);this.tableCallback(i)}))})}))),50),null}output(){return`\n\t\t<div id = "${this.htmlElements[0].id}">\n\t\t\t<h2>${this.title}</h2>\n\t\t\t<div class="table-responsive">\n\t\t\t<table id = "${this.htmlElements[0].id}Table" class="table table-striped table-sm">\n\t\t\t\t<thead>\n\t\t\t\t\t<tr hot-place-here = "header">\n\t\t\t\t\t\t<th></th>\n\t\t\t\t\t</tr>\n\t\t\t\t</thead>\n\t\t\t\t<tbody hot-place-here = "results">\n\t\t\t\t</tbody>\n\t\t\t</table>\n\t\t\t<hot-place-here name = "afterTable"></hot-place-here>\n\t\t\t</div>\n\t\t</div>`}}e.AdminTable=a},741:(t,e,n)=>{Object.defineProperty(e,"__esModule",{value:!0}),e.AdminText=void 0;const i=n(79);class l extends i.HotComponent{constructor(t,e){super(t,e),this.tag="admin-text",this.no_output="0",this.css_class="form-control"}onPostPlace(t,e){let n=t.querySelectorAll('hot-place-here[type="modal"]');if(n.length>0){let i=n[0];t.removeChild(e),i.appendChild(e)}return null}output(){let t="";if(null!=this.value&&(t=this.value),"1"===this.no_output)return`<div><input class="${this.css_class}" type = "hidden" value = "${t}" /></div>`;const e=this.htmlElements[0].getAttribute("hot-field");let n=this.htmlElements[0].getAttribute("hot-field-type"),i=this.htmlElements[0].getAttribute("type")||"text";return null==n&&(n="text"),`<div>\n\t\t\t<label class="form-label">${this.inner}</label>\n\t\t\t<input class="${this.css_class}" type = "${i}" hot-field = "${e}" hot-field-type = "${n}" value = "${t}" />\n\t\t</div>`}}e.AdminText=l},837:(t,e,n)=>{Object.defineProperty(e,"__esModule",{value:!0}),e.AdminTableField=void 0;const i=n(79);class l extends i.HotComponent{constructor(t,e){super(t,e),this.tag="admin-table-field",this.field=0,this.field_type="text",this.no_output="0",this.oninput=null,this.onoutput=null}onPostPlace(t,e){let n=null;return n=null!=t.parentNode.parentNode.hotComponent?t.parentNode.parentNode.hotComponent:t.parentNode.parentNode.parentNode.parentNode.hotComponent,null!=n&&n.addHeaderDataOnly(this,e),null}output(){return"1"===this.no_output?[{html:"<div></div>",placeHereParent:"afterTable"}]:[{html:`<th data-field = "${this.field}" data-field-type = "${this.field_type}">${this.inner}</th>`,placeHereParent:"header"}]}}e.AdminTableField=l},877:(t,e,n)=>{Object.defineProperty(e,"__esModule",{value:!0}),e.AdminTableRow=void 0;const i=n(79);class l extends i.HotComponent{constructor(t,e){super(t,e),this.tag="admin-table-row",this.fields=[]}onPostPlace(t,e){return t.parentNode.parentNode.parentNode.hotComponent.rowElements.push({fields:this.fields,element:e}),null}output(){let t="";this.fields.length>0&&(t+='<td><input type = "checkbox" /></td>');for(let e=0;e<this.fields.length;e++){let n=this.fields[e];for(let e in n)t+=`<td>${n[e]}</td>`}return[{html:`<tr>${t}</tr>`,placeHereParent:"results"}]}}e.AdminTableRow=l},924:(t,e,n)=>{Object.defineProperty(e,"__esModule",{value:!0}),e.AdminDashboard=void 0;const i=n(79);class l extends i.HotComponent{constructor(t,e){super(t,e),this.tag="admin-dashboard",this.title="",this.base=""}onPostPlace(t,e){return null==i.Hot.Data.AdminPanel&&(i.Hot.Data.AdminPanel={}),null==i.Hot.Data.AdminPanel.baseUrl&&(i.Hot.Data.AdminPanel.baseUrl=this.base),null==i.Hot.Data.AdminPanel.addUrl&&(i.Hot.Data.AdminPanel.addUrl=`${i.Hot.Data.AdminPanel.baseUrl}/v1/data/add`),null==i.Hot.Data.AdminPanel.editUrl&&(i.Hot.Data.AdminPanel.editUrl=`${i.Hot.Data.AdminPanel.baseUrl}/v1/data/edit`),null==i.Hot.Data.AdminPanel.removeUrl&&(i.Hot.Data.AdminPanel.removeUrl=`${i.Hot.Data.AdminPanel.baseUrl}/v1/data/remove`),null==i.Hot.Data.AdminPanel.listUrl&&(i.Hot.Data.AdminPanel.listUrl=`${i.Hot.Data.AdminPanel.baseUrl}/v1/data/list`),null}output(){return`\n\t\t<main class="col-md-9 ms-sm-auto col-lg-10 px-md-4">\n\t\t\t<div class="d-flex justify-content-between flex-wrap flex-md-nowrap align-items-center pt-3 pb-2 mb-3 border-bottom">\n\t\t\t\t<h1 class="h2">${this.title}</h1>\n\t\t\t\t<div class="btn-toolbar mb-2 mb-md-0">\n\t\t\t\t\t<div class="btn-group me-2">\n\t\t\t\t\t\t<hot-place-here name = "dashboardHeader"></hot-place-here>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<hot-place-here name = "body"></hot-place-here>\n\t\t</main>`}}e.AdminDashboard=l}},e={};function n(i){var l=e[i];if(void 0!==l)return l.exports;var s=e[i]={exports:{}};return t[i].call(s.exports,s,s.exports,n),s.exports}var i={};(()=>{var t=i;Object.defineProperty(t,"__esModule",{value:!0}),t.AdminText=t.AdminTableRow=t.AdminTableField=t.AdminTable=t.AdminEdit=t.AdminDashboard=t.AdminDropdown=t.AdminButton=void 0;const e=n(594);Object.defineProperty(t,"AdminButton",{enumerable:!0,get:function(){return e.AdminButton}});const l=n(91);Object.defineProperty(t,"AdminDropdown",{enumerable:!0,get:function(){return l.AdminDropdown}});const s=n(924);Object.defineProperty(t,"AdminDashboard",{enumerable:!0,get:function(){return s.AdminDashboard}});const o=n(494);Object.defineProperty(t,"AdminEdit",{enumerable:!0,get:function(){return o.AdminEdit}});const a=n(620);Object.defineProperty(t,"AdminTable",{enumerable:!0,get:function(){return a.AdminTable}});const d=n(837);Object.defineProperty(t,"AdminTableField",{enumerable:!0,get:function(){return d.AdminTableField}});const r=n(877);Object.defineProperty(t,"AdminTableRow",{enumerable:!0,get:function(){return r.AdminTableRow}});const h=n(741);Object.defineProperty(t,"AdminText",{enumerable:!0,get:function(){return h.AdminText}})})(),AdminPanelComponentsWeb=i})();
2
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,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LFdBQVdpQixVQUN2QixFQUFBbkIsSUFBSUMsS0FBS0MsV0FBV2lCLFFBQVUsR0FBRyxFQUFBbkIsSUFBSUMsS0FBS0MsV0FBV2tJLHdCQUVqQixNQUFqQyxFQUFBcEksSUFBSUMsS0FBS0MsV0FBV0gsWUFDdkIsRUFBQUMsSUFBSUMsS0FBS0MsV0FBV0gsVUFBWSxHQUFHLEVBQUFDLElBQUlDLEtBQUtDLFdBQVdrSSwwQkFFckIsTUFBL0IsRUFBQXBJLElBQUlDLEtBQUtDLFdBQVdxRixVQUN2QixFQUFBdkYsSUFBSUMsS0FBS0MsV0FBV3FGLFFBQVUsR0FBRyxFQUFBdkYsSUFBSUMsS0FBS0MsV0FBV2tJLHdCQUUvQyxJQUNSLENBRUEsTUFBQTdNLEdBRUMsTUFBTyxtTkFHWXpDLEtBQUtnRCxnU0FTekIsRUE1REQsa0IsR0NESXVNLEVBQTJCLENBQUMsRUFHaEMsU0FBU0MsRUFBb0JDLEdBRTVCLElBQUlDLEVBQWVILEVBQXlCRSxHQUM1QyxRQUFxQkUsSUFBakJELEVBQ0gsT0FBT0EsRUFBYW5RLFFBR3JCLElBQUlELEVBQVNpUSxFQUF5QkUsR0FBWSxDQUdqRGxRLFFBQVMsQ0FBQyxHQU9YLE9BSEFxUSxFQUFvQkgsR0FBVWxKLEtBQUtqSCxFQUFPQyxRQUFTRCxFQUFRQSxFQUFPQyxRQUFTaVEsR0FHcEVsUSxFQUFPQyxPQUNmLEMscU1DdEJBLGVBVUUsMkVBVk8sRUFBQXFKLFdBQVcsSUFDcEIsY0FVRSw2RUFWTyxFQUFBbEosYUFBYSxJQUN0QixlQVVFLDhFQVZPLEVBQUEwUCxjQUFjLElBQ3ZCLGVBVUUseUVBVk8sRUFBQXhNLFNBQVMsSUFDbEIsZUFVRSwwRUFWTyxFQUFBb0csVUFBVSxJQUNuQixlQVVFLCtFQVZPLEVBQUE4RixlQUFlLElBQ3hCLGVBVUUsNkVBVk8sRUFBQUUsYUFBYSxJQUN0QixlQVVFLHlFQVZPLEVBQUFOLFNBQVMsRyIsInNvdXJjZXMiOlsid2VicGFjazovL0FkbWluUGFuZWxDb21wb25lbnRzV2ViL2V4dGVybmFsIHZhciBcIkRhdGFUYWJsZVwiIiwid2VicGFjazovL0FkbWluUGFuZWxDb21wb25lbnRzV2ViL2V4dGVybmFsIHZhciBcIkhvdFN0YXFXZWJcIiIsIndlYnBhY2s6Ly9BZG1pblBhbmVsQ29tcG9uZW50c1dlYi8uL3NyYy9jb21wb25lbnRzL2FkbWluLWRyb3Bkb3duLnRzIiwid2VicGFjazovL0FkbWluUGFuZWxDb21wb25lbnRzV2ViL2V4dGVybmFsIHZhciBcImJvb3RzdHJhcFwiIiwid2VicGFjazovL0FkbWluUGFuZWxDb21wb25lbnRzV2ViLy4vc3JjL2NvbXBvbmVudHMvYWRtaW4tZWRpdC50cyIsIndlYnBhY2s6Ly9BZG1pblBhbmVsQ29tcG9uZW50c1dlYi8uL3NyYy9jb21wb25lbnRzL2FkbWluLWJ1dHRvbi50cyIsIndlYnBhY2s6Ly9BZG1pblBhbmVsQ29tcG9uZW50c1dlYi8uL3NyYy9jb21wb25lbnRzL2FkbWluLXRhYmxlLnRzIiwid2VicGFjazovL0FkbWluUGFuZWxDb21wb25lbnRzV2ViLy4vc3JjL2NvbXBvbmVudHMvYWRtaW4tdGV4dC50cyIsIndlYnBhY2s6Ly9BZG1pblBhbmVsQ29tcG9uZW50c1dlYi8uL3NyYy9jb21wb25lbnRzL2FkbWluLXRhYmxlLWZpZWxkLnRzIiwid2VicGFjazovL0FkbWluUGFuZWxDb21wb25lbnRzV2ViLy4vc3JjL2NvbXBvbmVudHMvYWRtaW4tdGFibGUtcm93LnRzIiwid2VicGFjazovL0FkbWluUGFuZWxDb21wb25lbnRzV2ViLy4vc3JjL2NvbXBvbmVudHMvYWRtaW4tZGFzaGJvYXJkLnRzIiwid2VicGFjazovL0FkbWluUGFuZWxDb21wb25lbnRzV2ViL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL0FkbWluUGFuZWxDb21wb25lbnRzV2ViLy4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gRGF0YVRhYmxlOyIsIm1vZHVsZS5leHBvcnRzID0gSG90U3RhcVdlYjsiLCJpbXBvcnQgeyBIb3RTdGFxLCBIb3QsIEhvdEFQSSwgSG90Q29tcG9uZW50IH0gZnJvbSBcImhvdHN0YXFcIjtcblxuZXhwb3J0IGNsYXNzIEFkbWluRHJvcGRvd24gZXh0ZW5kcyBIb3RDb21wb25lbnRcbntcblx0LyoqXG5cdCAqIFRoZSBzZWFyY2ggc3RyaW5nIHBsYWNlaG9sZGVyIHRvIHNob3cuXG5cdCAqL1xuXHRwbGFjZWhvbGRlcjogc3RyaW5nO1xuXHQvKipcblx0ICogRXhlY3V0ZXMgd2hlbiB0aGUga2V5Ym9hcmQgdXAgYnV0dG9uIGlzIHRyaWdnZXJlZC5cblx0ICovXG5cdG9uc2VhcmNoOiAoc2VhcmNoVGV4dDogc3RyaW5nLCBldmVudDogS2V5Ym9hcmRFdmVudCkgPT4gUHJvbWlzZTx7IHVybDogc3RyaW5nOyB2YWx1ZTogc3RyaW5nOyB0ZXh0OiBzdHJpbmc7IH1bXT47XG5cdC8qKlxuXHQgKiBFeGVjdXRlcyB3aGVuIGFuIHNlYXJjaCByZXN1bHQgaGFzIGJlZW4gc2VsZWN0ZWQuXG5cdCAqL1xuXHRvbnNlbGVjdDogKHVybDogc3RyaW5nLCB2YWx1ZTogc3RyaW5nLCB0ZXh0OiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD47XG5cblx0Y29uc3RydWN0b3IgKGNvcHk6IEhvdENvbXBvbmVudCB8IEhvdFN0YXEsIGFwaTogSG90QVBJKVxuXHR7XG5cdFx0c3VwZXIgKGNvcHksIGFwaSk7XG5cblx0XHR0aGlzLnRhZyA9IFwiYWRtaW4tZHJvcGRvd25cIjtcblx0XHR0aGlzLnBsYWNlaG9sZGVyID0gXCJTZWFyY2hcIjtcblx0XHR0aGlzLm9uc2VhcmNoID0gbnVsbDtcblx0XHR0aGlzLm9uc2VsZWN0ID0gbnVsbDtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb3JyZWN0cyB0aGUgcGxhY2VtZW50IG9mIHRoZSB0ZXh0IGVsZW1lbnRzIGZvciBtb2RhbHMuXG5cdCAqL1xuXHRvblBvc3RQbGFjZSAocGFyZW50SHRtbEVsZW1lbnQ6IEhUTUxFbGVtZW50LCBodG1sRWxlbWVudDogSFRNTEVsZW1lbnQpOiBIVE1MRWxlbWVudFxuXHR7XG5cdFx0bGV0IHBsYWNlSGVyZUFycmF5ID0gcGFyZW50SHRtbEVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCAoYGhvdC1wbGFjZS1oZXJlW3R5cGU9XCJtb2RhbFwiXWApO1xuXG5cdFx0aWYgKHBsYWNlSGVyZUFycmF5Lmxlbmd0aCA+IDApXG5cdFx0e1xuXHRcdFx0bGV0IHBsYWNlSGVyZSA9IHBsYWNlSGVyZUFycmF5WzBdO1xuXHRcdFx0cGFyZW50SHRtbEVsZW1lbnQucmVtb3ZlQ2hpbGQgKGh0bWxFbGVtZW50KTtcblx0XHRcdHBsYWNlSGVyZS5hcHBlbmRDaGlsZCAoaHRtbEVsZW1lbnQpO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLm9uc2VhcmNoICE9IG51bGwpXG5cdFx0e1xuXHRcdFx0aWYgKHR5cGVvZiAodGhpcy5vbnNlYXJjaCkgPT09IFwic3RyaW5nXCIpXG5cdFx0XHRcdHRoaXMub25zZWFyY2ggPSAoPChzZWFyY2hUZXh0OiBzdHJpbmcsIGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiBQcm9taXNlPHsgdXJsOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmc7IHRleHQ6IHN0cmluZzsgfVtdPj5uZXcgRnVuY3Rpb24gKHRoaXMub25zZWFyY2gpKTtcblxuXHRcdFx0aHRtbEVsZW1lbnQucXVlcnlTZWxlY3RvciAoXCJpbnB1dFwiKS5hZGRFdmVudExpc3RlbmVyIChcImtleXVwXCIsIFxuXHRcdFx0XHRhc3luYyAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+XG5cdFx0XHRcdHtcblx0XHRcdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHRcdFx0Y29uc3Qgc2VhcmNoVGV4dCA9IGV2ZW50LmN1cnJlbnRUYXJnZXQudmFsdWU7XG5cblx0XHRcdFx0XHRsZXQgcmVzdWx0cyA9IGF3YWl0IHRoaXMub25zZWFyY2ggKHNlYXJjaFRleHQsIGV2ZW50KTtcblxuXHRcdFx0XHRcdGxldCBzZWFyY2hSZXN1bHRzRGl2ID0gJCh0aGlzLmh0bWxFbGVtZW50c1sxXSkuZmluZCAoXCIuc2VhcmNoUmVzdWx0c1wiKTtcblxuXHRcdFx0XHRcdHNlYXJjaFJlc3VsdHNEaXYuZW1wdHkgKCk7XG5cblx0XHRcdFx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IHJlc3VsdHMubGVuZ3RoOyBpSWR4KyspXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0Y29uc3QgcmVzdWx0ID0gcmVzdWx0c1tpSWR4XTtcblx0XHRcdFx0XHRcdGxldCB1cmw6IHN0cmluZyA9IHJlc3VsdC51cmw7XG5cdFx0XHRcdFx0XHRsZXQgdmFsdWU6IHN0cmluZyA9IHJlc3VsdC52YWx1ZTtcblx0XHRcdFx0XHRcdGxldCB0ZXh0OiBzdHJpbmcgPSByZXN1bHQudGV4dDtcblxuXHRcdFx0XHRcdFx0Y29uc3QgJHRlbXBsYXRlID0gJChgPGxpPjxhIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiIGhyZWY9XCJcIiBkYXRhLXZhbHVlPVwiXCIgb25jbGljaz1cIlwiPjwvYT48L2xpPmApO1xuXG5cdFx0XHRcdFx0XHRjb25zdCAkYSA9ICR0ZW1wbGF0ZS5maW5kKFwiYVwiKTtcblx0XHRcdFx0XHRcdCRhLmF0dHIoXCJocmVmXCIsIHVybCk7XG5cdFx0XHRcdFx0XHQkYS5hdHRyKFwiZGF0YS12YWx1ZVwiLCB2YWx1ZSk7XG5cdFx0XHRcdFx0XHQkYS50ZXh0KHRleHQpO1xuXG5cdFx0XHRcdFx0XHQkYS5yZW1vdmVBdHRyKFwib25jbGlja1wiKS5vbihcImNsaWNrXCIsICgpID0+IHtcblx0XHRcdFx0XHRcdFx0dGhpcy5zZWxlY3RlZChpSWR4KTtcblx0XHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0XHRzZWFyY2hSZXN1bHRzRGl2LmFwcGVuZCgkdGVtcGxhdGUpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIChudWxsKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBFeGVjdXRlZCB3aGVuIGFuIGl0ZW0gaXMgc2VsZWN0ZWQuXG5cdCAqL1xuXHRhc3luYyBzZWxlY3RlZCAoaW5kZXg6IG51bWJlcik6IFByb21pc2U8dm9pZD5cblx0e1xuXHRcdGlmICh0aGlzLm9uc2VsZWN0ICE9IG51bGwpXG5cdFx0e1xuXHRcdFx0aWYgKHR5cGVvZiAodGhpcy5vbnNlbGVjdCkgPT09IFwic3RyaW5nXCIpXG5cdFx0XHRcdHRoaXMub25zZWxlY3QgPSAoPCh1cmw6IHN0cmluZywgdmFsdWU6IHN0cmluZywgdGV4dDogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+Pm5ldyBGdW5jdGlvbiAodGhpcy5vbnNlbGVjdCkpO1xuXG5cdFx0XHRjb25zdCB1cmwgPSB0aGlzLmh0bWxFbGVtZW50c1sxXS5xdWVyeVNlbGVjdG9yQWxsIChcImFcIilbaW5kZXhdLmdldEF0dHJpYnV0ZSAoXCJocmVmXCIpO1xuXHRcdFx0Y29uc3QgdmFsdWUgPSB0aGlzLmh0bWxFbGVtZW50c1sxXS5xdWVyeVNlbGVjdG9yQWxsIChcImFcIilbaW5kZXhdLmdldEF0dHJpYnV0ZSAoXCJkYXRhLXZhbHVlXCIpO1xuXHRcdFx0Y29uc3QgdGV4dCA9IHRoaXMuaHRtbEVsZW1lbnRzWzFdLnF1ZXJ5U2VsZWN0b3JBbGwgKFwiYVwiKVtpbmRleF0uaW5uZXJIVE1MO1xuXG5cdFx0XHRhd2FpdCB0aGlzLm9uc2VsZWN0ICh1cmwsIHZhbHVlLCB0ZXh0KTtcblx0XHR9XG5cdH1cblxuXHRvdXRwdXQgKCk6IHN0cmluZ1xuXHR7XG5cdFx0cmV0dXJuIChcblx0YDxkaXYgY2xhc3M9XCJkcm9wZG93blwiPlxuXHRcdDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgZHJvcGRvd24tdG9nZ2xlXCIgdHlwZT1cImJ1dHRvblwiIGRhdGEtYnMtdG9nZ2xlPVwiZHJvcGRvd25cIiBhcmlhLWV4cGFuZGVkPVwiZmFsc2VcIj5cblx0XHQgICR7dGhpcy5pbm5lcn1cblx0XHQ8L2J1dHRvbj5cblx0XHQ8dWwgY2xhc3M9XCJkcm9wZG93bi1tZW51XCI+XG5cdFx0XHQ8bGk+XG5cdFx0XHRcdDxkaXYgY2xhc3MgPSBcImlucHV0LWdyb3VwXCI+XG5cdFx0XHRcdFx0PGlucHV0IHR5cGUgPSBcInRleHRcIiBjbGFzcyA9IFwiZm9ybS1jb250cm9sXCIgcGxhY2Vob2xkZXIgPSBcIiR7dGhpcy5wbGFjZWhvbGRlcn1cIiB2YWx1ZSA9IFwiXCIgLz5cblx0XHRcdFx0PC9kaXY+XG5cdFx0XHQ8L2xpPlxuXHRcdFx0PGRpdiBjbGFzcyA9IFwic2VhcmNoUmVzdWx0c1wiPlxuXHRcdFx0PC9kaXY+XG5cdFx0PC91bD5cblx0PC9kaXY+YCk7XG5cdH1cbn1cbiIsIm1vZHVsZS5leHBvcnRzID0gYm9vdHN0cmFwOyIsImltcG9ydCB7IEhvdFN0YXEsIEhvdCwgSG90QVBJLCBIb3RDb21wb25lbnQsIEhvdENvbXBvbmVudE91dHB1dCB9IGZyb20gXCJob3RzdGFxXCI7XG5cbmltcG9ydCBib290c3RyYXAgZnJvbSBcImJvb3RzdHJhcFwiO1xuXG5pbXBvcnQgeyBBZG1pblRhYmxlIH0gZnJvbSBcIi4vYWRtaW4tdGFibGVcIjtcblxuZXhwb3J0IGNsYXNzIEFkbWluRWRpdCBleHRlbmRzIEhvdENvbXBvbmVudFxue1xuXHQvKipcblx0ICogVGhlIHRpdGxlIG9mIHRoaXMgZWRpdCBtb2RhbC5cblx0ICovXG5cdHRpdGxlOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgYnV0dG9uIHRpdGxlLlxuXHQgKi9cblx0YnV0dG9uX3RpdGxlOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgYXR0YWNoZWQgbGlzdC5cblx0ICovXG5cdGF0dGFjaGVkX2xpc3Q6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBhdHRhY2hlZCBzY2hlbWEuXG5cdCAqL1xuXHRzY2hlbWE6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBtb2RhbCBpZC5cblx0ICovXG5cdG1vZGFsSWQ6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSB0ZXh0IGZvciB0aGUgYWRkIGJ1dHRvbi5cblx0ICovXG5cdGFkZF90ZXh0OiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgbG9jYXRpb24gdG8gcHV0IHRoZSBhZGQgYnV0dG9uLlxuXHQgKi9cblx0YWRkX3BsYWNlX2hlcmU6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSB0ZXh0IGZvciB0aGUgZWRpdCBidXR0b24uXG5cdCAqL1xuXHRlZGl0X3RleHQ6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBsb2NhdGlvbiB0byBwdXQgdGhlIGVkaXQgYnV0dG9uLlxuXHQgKi9cblx0ZWRpdF9wbGFjZV9oZXJlOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgdGV4dCBmb3IgdGhlIHJlbW92ZSBidXR0b24uXG5cdCAqL1xuXHRyZW1vdmVfdGV4dDogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIGxvY2F0aW9uIHRvIHB1dCB0aGUgcmVtb3ZlIGJ1dHRvbi5cblx0ICovXG5cdHJlbW92ZV9wbGFjZV9oZXJlOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgaG90LWNsYXNzIGF0dHJpYnV0ZSB0byBwYXNzIHRvIGFkZCB0byB0aGUgbW9kYWwncyBjbGFzc2VzLlxuXHQgKi9cblx0Y3NzX2NsYXNzOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgYm9vdHN0cmFwIG1vZGFsIGluc3RhbmNlLlxuXHQgKi9cblx0bW9kYWw6IGJvb3RzdHJhcC5Nb2RhbDtcblx0LyoqXG5cdCAqIElmIHNldCB0byB0cnVlLCB0aGlzIHdpbGwgY2xvc2UgdGhlIG1vZGFsIHdoZW4gc2F2ZSBpcyBjbGlja2VkLlxuXHQgKi9cblx0Y2xvc2VPblNhdmU6IGJvb2xlYW47XG5cdC8qKlxuXHQgKiBUaGUgdHlwZSBvZiBtb2RhbCB0byBvcGVuLiBDYW4gYmU6XG5cdCAqICogYWRkXG5cdCAqICogZWRpdFxuXHQgKiAqIHJlbW92ZVxuXHQgKi9cblx0cHJvdGVjdGVkIG1vZGFsVHlwZTogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIHNlbGVjdGVkIGZpZWxkcy5cblx0ICovXG5cdHByb3RlY3RlZCBzZWxlY3RlZEZpZWxkczogYW55W107XG5cdC8qKlxuXHQgKiBXaGF0IHRvIGV4ZWN1dGUgd2hlbiB0aGUgc2F2ZSBidXR0b24gaXMgY2xpY2tlZC4gSWYgdGhpcyByZXR1cm5zIHRydWUsIHRoZSBtb2RhbCB3aWxsIGNsb3NlLlxuXHQgKiBJZiB0aGlzIHJldHVybnMgZmFsc2UsIHRoZSBtb2RhbCB3aWxsIG5vdCBjbG9zZS5cblx0ICovXG5cdG9uc2F2ZTogKG1vZGFsVHlwZTogc3RyaW5nLCB2YWx1ZXM6IGFueSwgc2VsZWN0ZWRGaWVsZHM6IGFueVtdKSA9PiBQcm9taXNlPGJvb2xlYW4+O1xuXHQvKipcblx0ICogV2hhdCB0byBleGVjdXRlIHdoZW4gdGhlIGVkaXQgYnV0dG9uIGlzIGNsaWNrZWQuXG5cdCAqL1xuXHRvbmFkZDogKG1vZGFsVHlwZTogc3RyaW5nLCBzZWxlY3RlZEZpZWxkczogYW55W10pID0+IFByb21pc2U8Ym9vbGVhbj47XG5cdC8qKlxuXHQgKiBXaGF0IHRvIGV4ZWN1dGUgd2hlbiB0aGUgZWRpdCBidXR0b24gaXMgY2xpY2tlZC5cblx0ICovXG5cdG9uZWRpdDogKG1vZGFsVHlwZTogc3RyaW5nLCBzZWxlY3RlZEZpZWxkczogYW55W10pID0+IFByb21pc2U8Ym9vbGVhbj47XG5cdC8qKlxuXHQgKiBXaGF0IHRvIGV4ZWN1dGUgd2hlbiB0aGUgZGVsZXRlIGJ1dHRvbiBpcyBjbGlja2VkLlxuXHQgKi9cblx0b25kZWxldGU6IChzZWxlY3RlZEZpZWxkOiBhbnkpID0+IFByb21pc2U8dm9pZD47XG5cblx0Y29uc3RydWN0b3IgKGNvcHk6IEhvdENvbXBvbmVudCB8IEhvdFN0YXEsIGFwaTogSG90QVBJKVxuXHR7XG5cdFx0c3VwZXIgKGNvcHksIGFwaSk7XG5cblx0XHR0aGlzLnRhZyA9IFwiYWRtaW4tZWRpdFwiO1xuXHRcdHRoaXMudGl0bGUgPSBcIlwiO1xuXHRcdHRoaXMuYnV0dG9uX3RpdGxlID0gXCJTYXZlXCI7XG5cdFx0dGhpcy5hdHRhY2hlZF9saXN0ID0gXCJcIjtcblx0XHR0aGlzLnNjaGVtYSA9IFwiXCI7XG5cblx0XHR0aGlzLm1vZGFsSWQgPSBcIlwiO1xuXHRcdHRoaXMuYWRkX3RleHQgPSBcIkFkZFwiO1xuXHRcdHRoaXMuYWRkX3BsYWNlX2hlcmUgPSBcImRhc2hib2FyZEhlYWRlclwiO1xuXHRcdHRoaXMuZWRpdF90ZXh0ID0gXCJFZGl0XCI7XG5cdFx0dGhpcy5lZGl0X3BsYWNlX2hlcmUgPSBcImRhc2hib2FyZEhlYWRlclwiO1xuXHRcdHRoaXMucmVtb3ZlX3RleHQgPSBcIlJlbW92ZVwiO1xuXHRcdHRoaXMucmVtb3ZlX3BsYWNlX2hlcmUgPSBcImRhc2hib2FyZEhlYWRlclwiO1xuXHRcdHRoaXMuY3NzX2NsYXNzID0gXCJcIjtcblx0XHR0aGlzLm1vZGFsID0gbnVsbDtcblx0XHR0aGlzLm1vZGFsVHlwZSA9IFwiYWRkXCI7XG5cdFx0dGhpcy5jbG9zZU9uU2F2ZSA9IHRydWU7XG5cdFx0dGhpcy5zZWxlY3RlZEZpZWxkcyA9IFtdO1xuXHRcdHRoaXMub25zYXZlID0gbnVsbDtcblx0XHR0aGlzLm9uZWRpdCA9IG51bGw7XG5cdFx0dGhpcy5vbmRlbGV0ZSA9IG51bGw7XG5cdH1cblxuXHQvKipcblx0ICogUHJvY2VzcyB0aGUgaG90IGZpZWxkcy5cblx0ICovXG5cdGFzeW5jIHByb2Nlc3NIb3RGaWVsZHMgKG9uRmllbGQ6IChodG1sRWxlbWVudDogRWxlbWVudCwgXG5cdFx0ZmllbGQ6IHsgbmFtZTogc3RyaW5nOyB0eXBlOiBzdHJpbmc7IGlucHV0OiBzdHJpbmc7IH0pID0+IFByb21pc2U8dm9pZD4pOiBQcm9taXNlPHZvaWQ+XG5cdHtcblx0XHRjb25zdCBlbG1zID0gdGhpcy5odG1sRWxlbWVudHNbMV0ucXVlcnlTZWxlY3RvckFsbCAoXCJbaG90LWZpZWxkXVwiKTtcblxuXHRcdGZvciAobGV0IGlJZHggPSAwOyBpSWR4IDwgZWxtcy5sZW5ndGg7IGlJZHgrKylcblx0XHR7XG5cdFx0XHRjb25zdCBlbG0gPSBlbG1zW2lJZHhdO1xuXHRcdFx0Y29uc3QgZmllbGQgPSAkKGVsbSkuYXR0ciAoXCJob3QtZmllbGRcIik7XG5cdFx0XHRsZXQgZmllbGRUeXBlID0gJChlbG0pLmF0dHIgKFwiaG90LWZpZWxkLXR5cGVcIik7XG5cdFx0XHRsZXQgZmllbGRJbnB1dCA9ICQoZWxtKS5hdHRyIChcImhvdC1maWVsZC1pbnB1dFwiKTtcblxuXHRcdFx0aWYgKChmaWVsZFR5cGUgPT0gbnVsbCkgfHwgKGZpZWxkVHlwZSA9PT0gXCJcIikpXG5cdFx0XHRcdGZpZWxkVHlwZSA9IFwidGV4dFwiO1xuXG5cdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHRlbG0uZmllbGRUeXBlID0gZmllbGRUeXBlO1xuXG5cdFx0XHRhd2FpdCBvbkZpZWxkIChlbG0sIHsgbmFtZTogZmllbGQsIHR5cGU6IGZpZWxkVHlwZSwgaW5wdXQ6IGZpZWxkSW5wdXQgfSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSBldmVudCB0aGF0IGNhbiBiZSBjYWxsZWQgd2hlbiB0aGUgYWRkIGJ1dHRvbiBpcyBjbGlja2VkLlxuXHQgKiBUaGlzIGlzIGNhbGxlZCBiZWZvcmUgdGhlIGFkZCBtb2RhbCBvcGVucy5cblx0ICovXG5cdG9uQWRkQ2xpY2tlZDogKCkgPT4gUHJvbWlzZTxib29sZWFuPiA9IG51bGw7XG5cblx0LyoqXG5cdCAqIEV4ZWN1dGVzIHdoZW4gdGhlIGFkZCBidXR0b24gaXMgY2xpY2tlZC5cblx0ICovXG5cdGFzeW5jIGFkZENsaWNrZWQgKHNlbGVjdGVkRmllbGRzOiBhbnlbXSA9IFtdKTogUHJvbWlzZTx2b2lkPlxuXHR7XG5cdFx0aWYgKHRoaXMub25BZGRDbGlja2VkICE9IG51bGwpXG5cdFx0e1xuXHRcdFx0bGV0IHJlc3VsdCA9IGF3YWl0IHRoaXMub25BZGRDbGlja2VkICgpO1xuXG5cdFx0XHRpZiAocmVzdWx0ID09PSBmYWxzZSlcblx0XHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHRoaXMubW9kYWxUeXBlID0gXCJhZGRcIjtcblxuXHRcdGF3YWl0IHRoaXMucHJvY2Vzc0hvdEZpZWxkcyAoXG5cdFx0XHRhc3luYyAoaHRtbEVsZW1lbnQ6IEVsZW1lbnQsIGZpZWxkOiB7IG5hbWU6IHN0cmluZzsgdHlwZTogc3RyaW5nOyB9KSA9PlxuXHRcdFx0e1xuXHRcdFx0XHQkKGh0bWxFbGVtZW50KS52YWwgKFwiXCIpO1xuXHRcdFx0fSk7XG5cblx0XHR0aGlzLnNlbGVjdGVkRmllbGRzID0gc2VsZWN0ZWRGaWVsZHM7XG5cblx0XHRpZiAodGhpcy5vbmFkZCAhPSBudWxsKVxuXHRcdHtcblx0XHRcdGlmICh0eXBlb2YgKHRoaXMub25hZGQpID09PSBcInN0cmluZ1wiKVxuXHRcdFx0XHR0aGlzLm9uYWRkID0gKDwobW9kYWxUeXBlOiBzdHJpbmcsIHNlbGVjdGVkRmllbGRzOiBhbnlbXSkgPT4gUHJvbWlzZTxib29sZWFuPj5uZXcgRnVuY3Rpb24gKHRoaXMub25hZGQpKTtcblxuXHRcdFx0bGV0IHJlc3VsdCA9IGF3YWl0IHRoaXMub25hZGQgKHRoaXMubW9kYWxUeXBlLCB0aGlzLnNlbGVjdGVkRmllbGRzKTtcblxuXHRcdFx0aWYgKHJlc3VsdCAhPSBudWxsKVxuXHRcdFx0e1xuXHRcdFx0XHRpZiAocmVzdWx0ID09PSBmYWxzZSlcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ym9vdHN0cmFwLk1vZGFsLmdldEluc3RhbmNlIChgIyR7dGhpcy5tb2RhbElkfWApLnNob3cgKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIGV2ZW50IHRoYXQgY2FuIGJlIGNhbGxlZCB3aGVuIHRoZSBlZGl0IGJ1dHRvbiBpcyBjbGlja2VkLlxuXHQgKiBUaGlzIGlzIGNhbGxlZCBiZWZvcmUgdGhlIGVkaXQgbW9kYWwgb3BlbnMuXG5cdCAqL1xuXHRvbkVkaXRDbGlja2VkOiAoY2xpY2tlZFRhYmxlPzogc3RyaW5nLCBzZWxlY3RlZEZpZWxkcz86IGFueVtdKSA9PiBQcm9taXNlPGJvb2xlYW4+ID0gbnVsbDtcblxuXHQvKipcblx0ICogR2V0IHRoZSBhdHRhY2hlZCBsaXN0cy5cblx0ICovXG5cdGdldEF0dGFjaGVkSFRNTExpc3RzICgpOiBIVE1MRWxlbWVudFtdXG5cdHtcblx0XHRjb25zdCBzdHJzID0gdGhpcy5hdHRhY2hlZF9saXN0LnNwbGl0IChcIixcIik7XG5cdFx0Y29uc3QgYXR0YWNoZWRMaXN0czogSFRNTEVsZW1lbnRbXSA9IFtdO1xuXG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBzdHJzLmxlbmd0aDsgaSsrKVxuXHRcdHtcblx0XHRcdGNvbnN0IGF0dGFjaGVkTGlzdCA9IHN0cnNbaV07XG5cdFx0XHRsZXQgYXR0YWNoZWRMaXN0T2JqID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQgKGF0dGFjaGVkTGlzdCk7XG5cdFx0XHRhdHRhY2hlZExpc3RzLnB1c2ggKGF0dGFjaGVkTGlzdE9iaik7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIChhdHRhY2hlZExpc3RzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgdGhlIGF0dGFjaGVkIGxpc3RzLlxuXHQgKi9cblx0Z2V0QXR0YWNoZWRMaXN0cyAoKTogSG90Q29tcG9uZW50W11cblx0e1xuXHRcdGNvbnN0IGF0dGFjaGVkTGlzdHMgPSB0aGlzLmdldEF0dGFjaGVkSFRNTExpc3RzICgpO1xuXHRcdGxldCBhdHRhY2hlZExpc3RPYmpzID0gW107XG5cblx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IGF0dGFjaGVkTGlzdHMubGVuZ3RoOyBpSWR4KyspXG5cdFx0e1xuXHRcdFx0bGV0IGF0dGFjaGVkTGlzdCA9IGF0dGFjaGVkTGlzdHNbaUlkeF07XG5cdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHRjb25zdCBob3RDb21wb25lbnQgPSBhdHRhY2hlZExpc3QuaG90Q29tcG9uZW50O1xuXG5cdFx0XHRhdHRhY2hlZExpc3RPYmpzLnB1c2ggKGhvdENvbXBvbmVudCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIChhdHRhY2hlZExpc3RPYmpzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBFeGVjdXRlcyB3aGVuIHRoZSBlZGl0IGJ1dHRvbiBpcyBjbGlja2VkLlxuXHQgKi9cblx0YXN5bmMgZWRpdENsaWNrZWQgKGNsaWNrZWRUYWJsZTogc3RyaW5nID0gbnVsbCwgc2VsZWN0ZWRGaWVsZHM6IGFueVtdID0gW10pOiBQcm9taXNlPHZvaWQ+XG5cdHtcblx0XHRpZiAodGhpcy5vbkVkaXRDbGlja2VkICE9IG51bGwpXG5cdFx0e1xuXHRcdFx0bGV0IHJlc3VsdCA9IGF3YWl0IHRoaXMub25FZGl0Q2xpY2tlZCAoY2xpY2tlZFRhYmxlLCBzZWxlY3RlZEZpZWxkcyk7XG5cblx0XHRcdGlmIChyZXN1bHQgPT09IGZhbHNlKVxuXHRcdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dGhpcy5tb2RhbFR5cGUgPSBcImVkaXRcIjtcblxuXHRcdHRoaXMuc2VsZWN0ZWRGaWVsZHMgPSBzZWxlY3RlZEZpZWxkcztcblxuXHRcdGlmICh0aGlzLmF0dGFjaGVkX2xpc3QgIT09IFwiXCIpXG5cdFx0e1xuXHRcdFx0Y29uc3QgYXR0YWNoZWRMaXN0cyA9IHRoaXMuZ2V0QXR0YWNoZWRMaXN0cyAoKTtcblxuXHRcdFx0Zm9yIChsZXQgaUlkeCA9IDA7IGlJZHggPCBhdHRhY2hlZExpc3RzLmxlbmd0aDsgaUlkeCsrKVxuXHRcdFx0e1xuXHRcdFx0XHRsZXQgYXR0YWNoZWRMaXN0ID0gYXR0YWNoZWRMaXN0c1tpSWR4XTtcblx0XHRcdFx0bGV0IHRhYmxlOiBBZG1pblRhYmxlID0gKDxBZG1pblRhYmxlPmF0dGFjaGVkTGlzdCk7XG5cblx0XHRcdFx0aWYgKGNsaWNrZWRUYWJsZSAhPSBudWxsKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0aWYgKHRhYmxlLm5hbWUgIT09IGNsaWNrZWRUYWJsZSlcblx0XHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGFibGUuYXR0YWNoZWRFZGl0ID0gdGhpcztcblx0XHRcdFx0bGV0IHNlbGVjdGVkRmllbGQgPSB0YWJsZS5nZXRTZWxlY3RlZCAoKTtcblxuXHRcdFx0XHRpZiAoc2VsZWN0ZWRGaWVsZCAhPSBudWxsKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5wcm9jZXNzSG90RmllbGRzIChcblx0XHRcdFx0XHRcdGFzeW5jIChodG1sRWxlbWVudDogRWxlbWVudCwgZmllbGQ6IHsgbmFtZTogc3RyaW5nOyB0eXBlOiBzdHJpbmc7IGlucHV0OiBzdHJpbmc7IH0pID0+XG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdFx0XHRcdFx0bGV0IHZhbHVlID0gc2VsZWN0ZWRGaWVsZFtmaWVsZC5uYW1lXTtcblxuXHRcdFx0XHRcdFx0XHRpZiAoZmllbGQuaW5wdXQgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdGlmIChmaWVsZC5pbnB1dCAhPT0gXCJcIilcblx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHRsZXQgZnVuYyA9IG5ldyBGdW5jdGlvbiAoZmllbGQuaW5wdXQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0dmFsdWUgPSBhd2FpdCBmdW5jLmNhbGwgKHRoaXMsIHRoaXMsIGh0bWxFbGVtZW50LCB2YWx1ZSk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0aWYgKHZhbHVlICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0JChodG1sRWxlbWVudCkudmFsICh2YWx1ZSk7XG5cdFx0XHRcdFx0XHR9KTtcblxuXHRcdFx0XHRcdHRoaXMuc2VsZWN0ZWRGaWVsZHMgPSBbc2VsZWN0ZWRGaWVsZF07XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAodGhpcy5vbmVkaXQgIT0gbnVsbClcblx0XHR7XG5cdFx0XHRpZiAodHlwZW9mICh0aGlzLm9uZWRpdCkgPT09IFwic3RyaW5nXCIpXG5cdFx0XHRcdHRoaXMub25lZGl0ID0gKDwobW9kYWxUeXBlOiBzdHJpbmcsIHNlbGVjdGVkRmllbGRzOiBhbnlbXSkgPT4gUHJvbWlzZTxib29sZWFuPj5uZXcgRnVuY3Rpb24gKHRoaXMub25lZGl0KSk7XG5cblx0XHRcdGxldCByZXN1bHQgPSBhd2FpdCB0aGlzLm9uZWRpdCAodGhpcy5tb2RhbFR5cGUsIHRoaXMuc2VsZWN0ZWRGaWVsZHMpO1xuXG5cdFx0XHRpZiAocmVzdWx0ICE9IG51bGwpXG5cdFx0XHR7XG5cdFx0XHRcdGlmIChyZXN1bHQgPT09IGZhbHNlKVxuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRib290c3RyYXAuTW9kYWwuZ2V0SW5zdGFuY2UgKGAjJHt0aGlzLm1vZGFsSWR9YCkuc2hvdyAoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgZXZlbnQgdGhhdCBjYW4gYmUgY2FsbGVkIHdoZW4gdGhlIHJlbW92ZSBidXR0b24gaXMgY2xpY2tlZC5cblx0ICogVGhpcyBpcyBjYWxsZWQgYmVmb3JlIHRoZSByZW1vdmUgbW9kYWwgb3BlbnMuXG5cdCAqL1xuXHRvblJlbW92ZUNsaWNrZWQ6ICgpID0+IFByb21pc2U8Ym9vbGVhbj4gPSBudWxsO1xuXG5cdC8qKlxuXHQgKiBFeGVjdXRlcyB3aGVuIHRoZSByZW1vdmUgYnV0dG9uIGlzIGNsaWNrZWQuXG5cdCAqL1xuXHRhc3luYyByZW1vdmVDbGlja2VkICgpOiBQcm9taXNlPHZvaWQ+XG5cdHtcblx0XHRpZiAodGhpcy5vblJlbW92ZUNsaWNrZWQgIT0gbnVsbClcblx0XHR7XG5cdFx0XHRsZXQgcmVzdWx0ID0gYXdhaXQgdGhpcy5vblJlbW92ZUNsaWNrZWQgKCk7XG5cblx0XHRcdGlmIChyZXN1bHQgPT09IGZhbHNlKVxuXHRcdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dGhpcy5tb2RhbFR5cGUgPSBcInJlbW92ZVwiO1xuXG5cdFx0bGV0IHdoZXJlRmllbGRzOiBhbnlbXSA9IFtdO1xuXHRcdGxldCBob3RDb21wb25lbnQ6IEFkbWluVGFibGUgPSBudWxsO1xuXG5cdFx0aWYgKHRoaXMuYXR0YWNoZWRfbGlzdCAhPT0gXCJcIilcblx0XHR7XG5cdFx0XHRjb25zdCBhdHRhY2hlZExpc3RzID0gdGhpcy5nZXRBdHRhY2hlZExpc3RzICgpO1xuXG5cdFx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IGF0dGFjaGVkTGlzdHMubGVuZ3RoOyBpSWR4KyspXG5cdFx0XHR7XG5cdFx0XHRcdGxldCBhdHRhY2hlZExpc3QgPSBhdHRhY2hlZExpc3RzW2lJZHhdO1xuXHRcdFx0XHRob3RDb21wb25lbnQgPSAoPEFkbWluVGFibGU+YXR0YWNoZWRMaXN0KTtcblxuXHRcdFx0XHRob3RDb21wb25lbnQuYXR0YWNoZWRFZGl0ID0gdGhpcztcblx0XHRcdFx0bGV0IGNoZWNrZWRSb3dzID0gaG90Q29tcG9uZW50LmdldENoZWNrZWRSb3dzICgpO1xuXG5cdFx0XHRcdGlmIChjaGVja2VkUm93cy5sZW5ndGggPiAwKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBjaGVja2VkUm93cy5sZW5ndGg7IGkrKylcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsZXQgY2hlY2tlZFJvdyA9IGNoZWNrZWRSb3dzW2ldO1xuXHRcdFx0XHRcdFx0d2hlcmVGaWVsZHMucHVzaCAoY2hlY2tlZFJvdyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0bGV0IHNlbGVjdGVkRmllbGQgPSBob3RDb21wb25lbnQuZ2V0U2VsZWN0ZWQgKCk7XG5cblx0XHRcdFx0aWYgKHNlbGVjdGVkRmllbGQgIT0gbnVsbClcblx0XHRcdFx0XHR3aGVyZUZpZWxkcyA9IFtzZWxlY3RlZEZpZWxkXTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRjb25zdCBjb25maXJtZWQ6IGJvb2xlYW4gPSBjb25maXJtIChcIkFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byByZW1vdmUgdGhpcyBpdGVtP1wiKTtcblxuXHRcdGlmIChjb25maXJtZWQgPT09IHRydWUpXG5cdFx0e1xuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCB3aGVyZUZpZWxkcy5sZW5ndGg7IGkrKylcblx0XHRcdHtcblx0XHRcdFx0bGV0IHdoZXJlRmllbGQgPSB3aGVyZUZpZWxkc1tpXTtcblxuXHRcdFx0XHRpZiAoaG90Q29tcG9uZW50ICE9IG51bGwpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHQvLyBSZW1vdmUgYW55IGZpZWxkcyB0aGF0IGFyZSBtYXJrZWQgYXMgcmVtb3ZlLlxuXHRcdFx0XHRcdGZvciAobGV0IGtleSBpbiB3aGVyZUZpZWxkKVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGxldCBmaWVsZFR5cGUgPSBob3RDb21wb25lbnQuZ2V0RmllbGRUeXBlIChrZXkpO1xuXG5cdFx0XHRcdFx0XHRpZiAoZmllbGRUeXBlICE9IG51bGwpXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGlmIChmaWVsZFR5cGUgPT09IFwicmVtb3ZlXCIpXG5cdFx0XHRcdFx0XHRcdFx0ZGVsZXRlIHdoZXJlRmllbGRba2V5XTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAodGhpcy5vbmRlbGV0ZSAhPSBudWxsKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0aWYgKHR5cGVvZiAodGhpcy5vbmRlbGV0ZSkgPT09IFwic3RyaW5nXCIpXG5cdFx0XHRcdFx0XHR0aGlzLm9uZGVsZXRlID0gKDwoc2VsZWN0ZWRGaWVsZDogYW55KSA9PiBQcm9taXNlPHZvaWQ+Pm5ldyBGdW5jdGlvbiAodGhpcy5vbmRlbGV0ZSkpO1xuXG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5vbmRlbGV0ZSAod2hlcmVGaWVsZCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZWxzZVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGV0IHJlbW92ZVVybDogc3RyaW5nID0gSG90LkRhdGEuQWRtaW5QYW5lbC5yZW1vdmVVcmw7XG5cblx0XHRcdFx0XHRhd2FpdCBIb3QuanNvblJlcXVlc3QgKHJlbW92ZVVybCwge1xuXHRcdFx0XHRcdFx0XHRzY2hlbWE6IHRoaXMuc2NoZW1hLFxuXHRcdFx0XHRcdFx0XHR3aGVyZUZpZWxkczogd2hlcmVGaWVsZFxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0aWYgKHdoZXJlRmllbGRzLmxlbmd0aCA9PT0gMClcblx0XHRcdHtcblx0XHRcdFx0aWYgKHRoaXMub25kZWxldGUgIT0gbnVsbClcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGlmICh0eXBlb2YgKHRoaXMub25kZWxldGUpID09PSBcInN0cmluZ1wiKVxuXHRcdFx0XHRcdFx0dGhpcy5vbmRlbGV0ZSA9ICg8KHNlbGVjdGVkRmllbGQ6IGFueSkgPT4gUHJvbWlzZTx2b2lkPj5uZXcgRnVuY3Rpb24gKHRoaXMub25kZWxldGUpKTtcblxuXHRcdFx0XHRcdGF3YWl0IHRoaXMub25kZWxldGUgKG51bGwpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxldCByZW1vdmVVcmw6IHN0cmluZyA9IEhvdC5EYXRhLkFkbWluUGFuZWwucmVtb3ZlVXJsO1xuXG5cdFx0XHRcdFx0YXdhaXQgSG90Lmpzb25SZXF1ZXN0IChyZW1vdmVVcmwsIHtcblx0XHRcdFx0XHRcdFx0c2NoZW1hOiB0aGlzLnNjaGVtYSxcblx0XHRcdFx0XHRcdFx0d2hlcmVGaWVsZHM6IG51bGxcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFxuXHRcdFx0aWYgKGhvdENvbXBvbmVudCAhPSBudWxsKVxuXHRcdFx0e1xuXHRcdFx0XHRjb25zdCBjdXJyZW50RGF0YSA9IGF3YWl0IGhvdENvbXBvbmVudC5yZWZyZXNoTGlzdCAoKTtcblx0XHRcdFx0Y29uc3QgcHJlcGFyZWREYXRhID0gaG90Q29tcG9uZW50LnByZXBhcmVEYXRhIChjdXJyZW50RGF0YSk7XG5cblx0XHRcdFx0aG90Q29tcG9uZW50LnRhYmxlQ2FsbGJhY2sgKHByZXBhcmVkRGF0YSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFNhdmUgdGhpcyBmb3JtLlxuXHQgKi9cblx0YXN5bmMgb25TYXZlICgpXG5cdHtcblx0XHRsZXQgdmFsdWVzOiBhbnkgPSB7fTtcblxuXHRcdGF3YWl0IHRoaXMucHJvY2Vzc0hvdEZpZWxkcyAoYXN5bmMgKGh0bWxFbGVtZW50OiBFbGVtZW50LCBmaWVsZDogeyBuYW1lOiBzdHJpbmc7IHR5cGU6IHN0cmluZzsgfSkgPT5cblx0XHRcdHtcblx0XHRcdFx0aWYgKGZpZWxkLnR5cGUgPT09IFwicmVtb3ZlXCIpXG5cdFx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHRcdGxldCB2YWx1ZSA9ICQoaHRtbEVsZW1lbnQpLnZhbCAoKTtcblxuXHRcdFx0XHRpZiAoJChodG1sRWxlbWVudCkuYXR0ciAoXCJob3QtdmFsdWVcIikgIT0gbnVsbClcblx0XHRcdFx0XHR2YWx1ZSA9ICQoaHRtbEVsZW1lbnQpLmF0dHIgKFwiaG90LXZhbHVlXCIpO1xuXG5cdFx0XHRcdGlmICgkKGh0bWxFbGVtZW50KS5hdHRyIChcImhvdC1maWVsZC1zYXZlXCIpICE9IG51bGwpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsZXQgZmllbGRTYXZlID0gJChodG1sRWxlbWVudCkuYXR0ciAoXCJob3QtZmllbGQtc2F2ZVwiKTtcblxuXHRcdFx0XHRcdGlmIChmaWVsZFNhdmUgIT0gbnVsbClcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRpZiAoZmllbGRTYXZlICE9PSBcIlwiKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRsZXQgZnVuYyA9IG5ldyBGdW5jdGlvbiAoZmllbGRTYXZlKTtcblx0XHRcdFx0XHRcdFx0dmFsdWUgPSBhd2FpdCBmdW5jLmNhbGwgKHRoaXMsIHRoaXMsIGh0bWxFbGVtZW50LCB2YWx1ZSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKGZpZWxkLnR5cGUgPT09IFwiYXJyYXlcIilcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGlmICh2YWx1ZXNbZmllbGQubmFtZV0gPT0gbnVsbClcblx0XHRcdFx0XHRcdHZhbHVlc1tmaWVsZC5uYW1lXSA9IFtdO1xuXG5cdFx0XHRcdFx0dmFsdWVzW2ZpZWxkLm5hbWVdLnB1c2ggKHZhbHVlKTtcblxuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChmaWVsZC50eXBlID09PSBcIm51bWJlclwiKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0XHRcdHZhbHVlID0gcGFyc2VGbG9hdCAodmFsdWUpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKGZpZWxkLnR5cGUgPT09IFwiaW50ZWdlclwiKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0XHRcdHZhbHVlID0gcGFyc2VJbnQgKHZhbHVlKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICgoZmllbGQudHlwZSA9PT0gXCJib29sXCIpIHx8IChmaWVsZC50eXBlID09PSBcImJvb2xlYW5cIikpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHRcdFx0Y29uc3QgYm9vbHZhbCA9IHZhbHVlLnRvTG93ZXJDYXNlICgpO1xuXG5cdFx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0XHRcdHZhbHVlID0gZmFsc2U7XG5cblx0XHRcdFx0XHRpZiAoKGJvb2x2YWwgPT0gXCIxXCIpIHx8IChib29sdmFsID09IFwidHJ1ZVwiKSB8fCAoYm9vbHZhbCA9PSBcInllc1wiKSlcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHRcdFx0XHR2YWx1ZSA9IHRydWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dmFsdWVzW2ZpZWxkLm5hbWVdID0gdmFsdWU7XG5cdFx0XHR9KTtcblxuXHRcdGlmICh0aGlzLm9uc2F2ZSAhPSBudWxsKVxuXHRcdHtcblx0XHRcdGlmICh0eXBlb2YgKHRoaXMub25zYXZlKSA9PT0gXCJzdHJpbmdcIilcblx0XHRcdFx0dGhpcy5vbnNhdmUgPSAoPChtb2RhbFR5cGU6IHN0cmluZywgdmFsdWVzOiBhbnksIHNlbGVjdGVkRmllbGRzOiBhbnlbXSkgPT4gUHJvbWlzZTxib29sZWFuPj5uZXcgRnVuY3Rpb24gKHRoaXMub25zYXZlKSk7XG5cblx0XHRcdGxldCByZXN1bHQgPSBhd2FpdCB0aGlzLm9uc2F2ZSAodGhpcy5tb2RhbFR5cGUsIHZhbHVlcywgdGhpcy5zZWxlY3RlZEZpZWxkcyk7XG5cblx0XHRcdGlmIChyZXN1bHQgPT09IGZhbHNlKVxuXHRcdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGVsc2Vcblx0XHR7XG5cdFx0XHRpZiAodGhpcy5tb2RhbFR5cGUgPT09IFwiYWRkXCIpXG5cdFx0XHR7XG5cdFx0XHRcdGxldCBhZGRVcmw6IHN0cmluZyA9IEhvdC5EYXRhLkFkbWluUGFuZWwuYWRkVXJsO1xuXG5cdFx0XHRcdGF3YWl0IEhvdC5qc29uUmVxdWVzdCAoYWRkVXJsLCB7XG5cdFx0XHRcdFx0XHRzY2hlbWE6IHRoaXMuc2NoZW1hLFxuXHRcdFx0XHRcdFx0ZmllbGRzOiB2YWx1ZXNcblx0XHRcdFx0XHR9KTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRoaXMubW9kYWxUeXBlID09PSBcImVkaXRcIilcblx0XHRcdHtcblx0XHRcdFx0aWYgKHRoaXMuc2VsZWN0ZWRGaWVsZHMubGVuZ3RoID09PSAwKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0YWxlcnQgKFwiTm8gaXRlbShzKSBzZWxlY3RlZCFcIik7XG5cblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRsZXQgd2hlcmVGaWVsZHM6IGFueSA9IHt9O1xuXG5cdFx0XHRcdGF3YWl0IHRoaXMucHJvY2Vzc0hvdEZpZWxkcyAoYXN5bmMgKGh0bWxFbGVtZW50OiBFbGVtZW50LCBmaWVsZDogeyBuYW1lOiBzdHJpbmc7IHR5cGU6IHN0cmluZzsgfSkgPT5cblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRpZiAoZmllbGQudHlwZSA9PT0gXCJyZW1vdmVcIilcblx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFxuXHRcdFx0XHRcdFx0bGV0IHZhbHVlID0gJChodG1sRWxlbWVudCkudmFsICgpO1xuXHRcdFxuXHRcdFx0XHRcdFx0aWYgKCQoaHRtbEVsZW1lbnQpLmF0dHIgKFwiaG90LXZhbHVlXCIpICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdHZhbHVlID0gJChodG1sRWxlbWVudCkuYXR0ciAoXCJob3QtdmFsdWVcIik7XG5cdFx0XG5cdFx0XHRcdFx0XHRpZiAoZmllbGQudHlwZSA9PT0gXCJhcnJheVwiKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRpZiAod2hlcmVGaWVsZHNbZmllbGQubmFtZV0gPT0gbnVsbClcblx0XHRcdFx0XHRcdFx0XHR3aGVyZUZpZWxkc1tmaWVsZC5uYW1lXSA9IFtdO1xuXHRcdFxuXHRcdFx0XHRcdFx0XHR3aGVyZUZpZWxkc1tmaWVsZC5uYW1lXS5wdXNoICh2YWx1ZSk7XG5cdFx0XG5cdFx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHRcdH1cblx0XHRcblx0XHRcdFx0XHRcdHdoZXJlRmllbGRzW2ZpZWxkLm5hbWVdID0gdmFsdWU7XG5cdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0bGV0IGVkaXRVcmw6IHN0cmluZyA9IEhvdC5EYXRhLkFkbWluUGFuZWwuZWRpdFVybDtcblxuXHRcdFx0XHRhd2FpdCBIb3QuanNvblJlcXVlc3QgKGVkaXRVcmwsIHtcblx0XHRcdFx0XHRcdHNjaGVtYTogdGhpcy5zY2hlbWEsXG5cdFx0XHRcdFx0XHR3aGVyZUZpZWxkczogd2hlcmVGaWVsZHMsXG5cdFx0XHRcdFx0XHRmaWVsZHM6IHZhbHVlc1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICh0aGlzLmF0dGFjaGVkX2xpc3QgIT09IFwiXCIpXG5cdFx0e1xuXHRcdFx0Y29uc3QgYXR0YWNoZWRMaXN0cyA9IHRoaXMuZ2V0QXR0YWNoZWRMaXN0cyAoKTtcblxuXHRcdFx0Zm9yIChsZXQgaUlkeCA9IDA7IGlJZHggPCBhdHRhY2hlZExpc3RzLmxlbmd0aDsgaUlkeCsrKVxuXHRcdFx0e1xuXHRcdFx0XHRsZXQgYXR0YWNoZWRMaXN0ID0gYXR0YWNoZWRMaXN0c1tpSWR4XTtcblx0XHRcdFx0bGV0IHRhYmxlOiBBZG1pblRhYmxlID0gKDxBZG1pblRhYmxlPmF0dGFjaGVkTGlzdCk7XG5cblx0XHRcdFx0dGFibGUuYXR0YWNoZWRFZGl0ID0gdGhpcztcblxuXHRcdFx0XHRjb25zdCBjdXJyZW50RGF0YSA9IGF3YWl0IHRhYmxlLnJlZnJlc2hMaXN0ICgpO1xuXHRcdFx0XHRjb25zdCBwcmVwYXJlZERhdGEgPSB0YWJsZS5wcmVwYXJlRGF0YSAoY3VycmVudERhdGEpO1xuXG5cdFx0XHRcdHRhYmxlLnRhYmxlQ2FsbGJhY2sgKHByZXBhcmVkRGF0YSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuY2xvc2VPblNhdmUgPT09IHRydWUpXG5cdFx0e1xuXHRcdFx0Ym9vdHN0cmFwLk1vZGFsLmdldEluc3RhbmNlIChgIyR7dGhpcy5tb2RhbElkfWApLmhpZGUgKCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEdldCB0aGUgbGlzdCBvZiBkYXRhIGZyb20gdGhlIHNlcnZlci5cblx0ICovXG5cdG9uUG9zdFBsYWNlIChwYXJlbnRIdG1sRWxlbWVudDogSFRNTEVsZW1lbnQsIGh0bWxFbGVtZW50OiBIVE1MRWxlbWVudCk6IEhUTUxFbGVtZW50XG5cdHtcblx0XHR0aGlzLm1vZGFsID0gbmV3IGJvb3RzdHJhcC5Nb2RhbCAoJChgIyR7dGhpcy5tb2RhbElkfWApWzBdLCB7XG5cdFx0XHRcdFwiYmFja2Ryb3BcIjogdHJ1ZSxcblx0XHRcdFx0XCJrZXlib2FyZFwiOiB0cnVlLFxuXHRcdFx0XHRcImZvY3VzXCI6IHRydWVcblx0XHRcdH0pO1xuXG5cdFx0Ly8vIEB0b2RvIEZpeCB0aGlzIHRlbXBvcmFyeSBoYWNrLiBJIGRvbnQgbGlrZSBpdC5cblx0XHRzZXRUaW1lb3V0ICgoKSA9PlxuXHRcdFx0e1xuXHRcdFx0XHRpZiAodGhpcy5hdHRhY2hlZF9saXN0ICE9PSBcIlwiKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0Y29uc3QgYXR0YWNoZWRMaXN0cyA9IHRoaXMuZ2V0QXR0YWNoZWRMaXN0cyAoKTtcblx0XHRcblx0XHRcdFx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IGF0dGFjaGVkTGlzdHMubGVuZ3RoOyBpSWR4KyspXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bGV0IGF0dGFjaGVkTGlzdCA9IGF0dGFjaGVkTGlzdHNbaUlkeF07XG5cdFx0XHRcdFx0XHRsZXQgdGFibGU6IEFkbWluVGFibGUgPSAoPEFkbWluVGFibGU+YXR0YWNoZWRMaXN0KTtcblxuXHRcdFx0XHRcdFx0aWYgKHRhYmxlICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdHRhYmxlLmF0dGFjaGVkRWRpdCA9IHRoaXM7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9LCA1MCk7XG5cblx0XHRyZXR1cm4gKG51bGwpO1xuXHR9XG5cblx0b3V0cHV0ICgpOiBzdHJpbmcgfCBIb3RDb21wb25lbnRPdXRwdXRbXVxuXHR7XG5cdFx0aWYgKHRoaXMubmFtZSA9PT0gXCJcIilcblx0XHRcdHRocm93IG5ldyBFcnJvciAoYFlvdSBtdXN0IHNwZWNpZnkgYSBuYW1lIGZvciBlYWNoIGFkbWluLWVkaXQgZWxlbWVudCFgKTtcblxuXHRcdHRoaXMubW9kYWxJZCA9IGAke3RoaXMubmFtZX1Nb2RhbGA7XG5cblx0XHRsZXQgb3V0cHV0T2JqID0gW3tcblx0XHRcdGh0bWw6IGBcblx0XHRcdDwhLS0gJHt0aGlzLnRpdGxlfSBNb2RhbCBTdGFydCAtLT5cblx0XHRcdDxkaXYgY2xhc3M9XCJtb2RhbCBmYWRlICR7dGhpcy5jc3NfY2xhc3N9XCIgaWQ9XCIke3RoaXMubW9kYWxJZH1cIiB0YWJpbmRleD1cIi0xXCIgYXJpYS1sYWJlbGxlZGJ5PVwiJHt0aGlzLm5hbWV9TW9kYWxMYWJlbFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwibW9kYWwtZGlhbG9nXCI+XG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cIm1vZGFsLWNvbnRlbnRcIj5cblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyXCI+XG5cdFx0XHRcdFx0XHQ8aDUgY2xhc3M9XCJtb2RhbC10aXRsZVwiIGlkPVwiJHt0aGlzLm5hbWV9TW9kYWxMYWJlbFwiPiR7dGhpcy50aXRsZX08L2g1PlxuXHRcdFx0XHRcdFx0PGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4tY2xvc2VcIiBkYXRhLWJzLWRpc21pc3M9XCJtb2RhbFwiIGFyaWEtbGFiZWw9XCJDbG9zZVwiPjwvYnV0dG9uPlxuXHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCI+XG5cdFx0XHRcdFx0XHQ8aG90LXBsYWNlLWhlcmUgbmFtZSA9IFwibW9kYWxCb2R5XCIgdHlwZSA9IFwibW9kYWxcIj48L2hvdC1wbGFjZS1oZXJlPlxuXHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJtb2RhbC1mb290ZXJcIj5cblx0XHRcdFx0XHRcdDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1zZWNvbmRhcnlcIiBkYXRhLWJzLWRpc21pc3M9XCJtb2RhbFwiPkNhbmNlbDwvYnV0dG9uPlxuXHRcdFx0XHRcdFx0PGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIiBvbmNsaWNrID0gXCJkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnJHt0aGlzLm1vZGFsSWR9Jykub25TYXZlICgpO1wiPiR7dGhpcy5idXR0b25fdGl0bGV9PC9idXR0b24+XG5cdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdDwvZGl2PlxuXHRcdFx0PC9kaXY+XG5cdFx0XHQ8IS0tICR7dGhpcy50aXRsZX0gTW9kYWwgRW5kIC0tPmAsXG5cdFx0XHRkb2N1bWVudFNlbGVjdG9yOiBcImJvZHlcIlxuXHRcdH1dO1xuXG5cdFx0aWYgKHRoaXMuYWRkX3BsYWNlX2hlcmUgIT09IFwiXCIpXG5cdFx0e1xuXHRcdFx0b3V0cHV0T2JqLnB1c2ggKHtcblx0XHRcdFx0aHRtbDogYDxidXR0b24gaWQgPSBcIiR7dGhpcy5tb2RhbElkfS1hZGQtYnRuXCIgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tb3V0bGluZS1zZWNvbmRhcnlcIiBvbmNsaWNrID0gXCJ0aGlzLmFkZENsaWNrZWQgKCk7XCI+JHt0aGlzLmFkZF90ZXh0fTwvYnV0dG9uPmAsXG5cdFx0XHRcdGRvY3VtZW50U2VsZWN0b3I6IGBob3QtcGxhY2UtaGVyZVtuYW1lPVwiJHt0aGlzLmFkZF9wbGFjZV9oZXJlfVwiXWBcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLmVkaXRfcGxhY2VfaGVyZSAhPT0gXCJcIilcblx0XHR7XG5cdFx0XHRvdXRwdXRPYmoucHVzaCAoe1xuXHRcdFx0XHRodG1sOiBgPGJ1dHRvbiBpZCA9IFwiJHt0aGlzLm1vZGFsSWR9LWVkaXQtYnRuXCIgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tb3V0bGluZS1zZWNvbmRhcnlcIiBvbmNsaWNrID0gXCJ0aGlzLmVkaXRDbGlja2VkICgnJHt0aGlzLm1vZGFsSWR9Jyk7XCI+JHt0aGlzLmVkaXRfdGV4dH08L2J1dHRvbj5gLFxuXHRcdFx0XHRkb2N1bWVudFNlbGVjdG9yOiBgaG90LXBsYWNlLWhlcmVbbmFtZT1cIiR7dGhpcy5lZGl0X3BsYWNlX2hlcmV9XCJdYFxuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMucmVtb3ZlX3BsYWNlX2hlcmUgIT09IFwiXCIpXG5cdFx0e1xuXHRcdFx0b3V0cHV0T2JqLnB1c2ggKHtcblx0XHRcdFx0aHRtbDogYDxidXR0b24gaWQgPSBcIiR7dGhpcy5tb2RhbElkfS1yZW1vdmUtYnRuXCIgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tb3V0bGluZS1zZWNvbmRhcnlcIiBvbmNsaWNrID0gXCJ0aGlzLnJlbW92ZUNsaWNrZWQgKCk7XCI+JHt0aGlzLnJlbW92ZV90ZXh0fTwvYnV0dG9uPmAsXG5cdFx0XHRcdGRvY3VtZW50U2VsZWN0b3I6IGBob3QtcGxhY2UtaGVyZVtuYW1lPVwiJHt0aGlzLnJlbW92ZV9wbGFjZV9oZXJlfVwiXWBcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdHJldHVybiAob3V0cHV0T2JqKTtcblx0fVxufVxuIiwiaW1wb3J0IHsgSG90U3RhcSwgSG90LCBIb3RBUEksIEhvdENvbXBvbmVudCB9IGZyb20gXCJob3RzdGFxXCI7XG5cbmV4cG9ydCBjbGFzcyBBZG1pbkJ1dHRvbiBleHRlbmRzIEhvdENvbXBvbmVudFxue1xuXHQvKipcblx0ICogVGhlIENTUyBjbGFzcyB0byBhcHBseSB0byB0aGUgYnV0dG9uLlxuXHQgKi9cblx0Y3NzX2NsYXNzOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBFeGVjdXRlcyB3aGVuIHRoZSBidXR0b24gaXMgY2xpY2tlZC5cblx0ICovXG5cdG9uY2xpY2s6IChldmVudDogTW91c2VFdmVudCkgPT4gUHJvbWlzZTxhbnk+O1xuXG5cdGNvbnN0cnVjdG9yIChjb3B5OiBIb3RDb21wb25lbnQgfCBIb3RTdGFxLCBhcGk6IEhvdEFQSSlcblx0e1xuXHRcdHN1cGVyIChjb3B5LCBhcGkpO1xuXG5cdFx0dGhpcy50YWcgPSBcImFkbWluLWJ1dHRvblwiO1xuXHRcdHRoaXMuY3NzX2NsYXNzID0gXCJidG4gYnRuLXNtIGJ0bi1vdXRsaW5lLXNlY29uZGFyeVwiO1xuXHRcdHRoaXMub25jbGljayA9IG51bGw7XG5cdH1cblxuXHRhc3luYyBidXR0b25DbGlja2VkICgpOiBQcm9taXNlPHZvaWQ+XG5cdHtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb3JyZWN0cyB0aGUgcGxhY2VtZW50IG9mIHRoZSB0ZXh0IGVsZW1lbnRzIGZvciBtb2RhbHMuXG5cdCAqL1xuXHRvblBvc3RQbGFjZSAocGFyZW50SHRtbEVsZW1lbnQ6IEhUTUxFbGVtZW50LCBodG1sRWxlbWVudDogSFRNTEVsZW1lbnQpOiBIVE1MRWxlbWVudFxuXHR7XG5cdFx0bGV0IHBsYWNlSGVyZUFycmF5ID0gcGFyZW50SHRtbEVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCAoYGhvdC1wbGFjZS1oZXJlW3R5cGU9XCJtb2RhbFwiXWApO1xuXG5cdFx0aWYgKHBsYWNlSGVyZUFycmF5Lmxlbmd0aCA+IDApXG5cdFx0e1xuXHRcdFx0bGV0IHBsYWNlSGVyZSA9IHBsYWNlSGVyZUFycmF5WzBdO1xuXHRcdFx0cGFyZW50SHRtbEVsZW1lbnQucmVtb3ZlQ2hpbGQgKGh0bWxFbGVtZW50KTtcblx0XHRcdHBsYWNlSGVyZS5hcHBlbmRDaGlsZCAoaHRtbEVsZW1lbnQpO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLm9uY2xpY2sgIT0gbnVsbClcblx0XHR7XG5cdFx0XHRpZiAodHlwZW9mICh0aGlzLm9uY2xpY2spID09PSBcInN0cmluZ1wiKVxuXHRcdFx0XHR0aGlzLm9uY2xpY2sgPSAoPChldmVudDogTW91c2VFdmVudCkgPT4gUHJvbWlzZTxhbnk+Pm5ldyBGdW5jdGlvbiAodGhpcy5vbmNsaWNrKSk7XG5cblx0XHRcdGh0bWxFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIgKFwiY2xpY2tcIiwgdGhpcy5vbmNsaWNrKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gKG51bGwpO1xuXHR9XG5cblx0b3V0cHV0ICgpOiBzdHJpbmdcblx0e1xuXHRcdHJldHVybiAoYDxidXR0b24gaWQgPSBcIiR7dGhpcy5odG1sRWxlbWVudHNbMF0uaWR9XCIgY2xhc3MgPSBcIiR7dGhpcy5jc3NfY2xhc3N9XCIgb25jbGljayA9IFwidGhpcy5idXR0b25DbGlja2VkICgpO1wiPiR7dGhpcy5pbm5lcn08L2J1dHRvbj5gKTtcblx0fVxufVxuIiwiaW1wb3J0IHsgSG90U3RhcSwgSG90LCBIb3RBUEksIEhvdENvbXBvbmVudCwgSG90Q29tcG9uZW50T3V0cHV0IH0gZnJvbSBcImhvdHN0YXFcIjtcbmltcG9ydCB7IEFkbWluVGFibGVGaWVsZCB9IGZyb20gXCIuL2FkbWluLXRhYmxlLWZpZWxkXCI7XG5pbXBvcnQgeyBBZG1pbkVkaXQgfSBmcm9tIFwiLi9hZG1pbi1lZGl0XCI7XG5cbmltcG9ydCBEYXRhVGFibGUsIHsgQXBpLCBDb25maWdDb2x1bW5zLCBJbnRlcm5hbFNldHRpbmdzIH0gZnJvbSBcImRhdGF0YWJsZXMubmV0XCI7XG5pbXBvcnQgZHQ1IGZyb20gJ2RhdGF0YWJsZXMubmV0LWJzNSc7XG5pbXBvcnQgZHRjIGZyb20gJ2RhdGF0YWJsZXMubmV0LWNvbHJlb3JkZXItYnM1JztcbmltcG9ydCBkdHMgZnJvbSAnZGF0YXRhYmxlcy5uZXQtc2Nyb2xsZXItYnM1JztcbmltcG9ydCBkdHNiIGZyb20gJ2RhdGF0YWJsZXMubmV0LXNlYXJjaGJ1aWxkZXItYnM1JztcbmltcG9ydCBkdHNlbCBmcm9tICdkYXRhdGFibGVzLm5ldC1zZWxlY3QtYnM1JztcblxuLyoqXG4gKiBUaGUgcHJvcGVydGllcyBmb3IgdGhlIGxpc3Qgc2VhcmNoLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElMaXN0U2VhcmNoUHJvcGVydGllc1xue1xuXHQvKipcblx0ICogVGhlIHNlYXJjaC5cblx0ICovXG5cdHNlYXJjaD86IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBzdGFydCBpbmRleC5cblx0ICovXG5cdG9mZnNldD86IG51bWJlcjtcblx0LyoqXG5cdCAqIFRoZSBsZW5ndGguXG5cdCAqL1xuXHRsaW1pdD86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBUaGUgQVBJIHJlc3BvbnNlIHRoYXQgaXMgZXhwZWN0ZWQgdG8gYmUgcmV0dXJuZWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUFQSVJlc3BvbnNlXG57XG5cdC8qKlxuXHQgKiBUaGUgbGVuZ3RoIG9mIHRoZSBkYXRhLlxuXHQgKi9cblx0bGVuZ3RoOiBudW1iZXI7XG5cdC8qKlxuXHQgKiBUaGUgZGF0YSB0byByZXR1cm4uXG5cdCAqL1xuXHRkYXRhOiBhbnlbXTtcblx0LyoqXG5cdCAqIFRoZSBlcnJvciBtZXNzYWdlLCBpZiBhbnkuXG5cdCAqL1xuXHRlcnJvcj86IHN0cmluZztcblx0LyoqXG5cdCAqIENhbiBlbmFibGUvZGlzYWJsZSBzYW5pdGl6YXRpb24gb2YgdGhlIHJldHVybmluZyBkYXRhLlxuXHQgKi9cblx0aG90U2FuaXRpemU/OiBib29sZWFuO1xufVxuXG5leHBvcnQgY2xhc3MgQWRtaW5UYWJsZSBleHRlbmRzIEhvdENvbXBvbmVudFxue1xuXHQvKipcblx0ICogVGhlIHRpdGxlIG9mIHRoaXMgdGFibGUuXG5cdCAqL1xuXHR0aXRsZTogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIGF0dGFjaGVkIHNjaGVtYS5cblx0ICovXG5cdHNjaGVtYTogc3RyaW5nO1xuXHRoZWFkZXJzOiB7XG5cdFx0LyoqXG5cdFx0ICogVGhlIHN0b3JlZCBoZWFkZXIgZmllbGRzLlxuXHRcdCAqL1xuXHRcdGZpZWxkczogeyBbbmFtZTogc3RyaW5nXTogQWRtaW5UYWJsZUZpZWxkOyB9O1xuXHRcdC8qKlxuXHRcdCAqIFRoZSBoZWFkZXJzIGFyZSBzdG9yZWQgaW4gYSBrZXkvdmFsdWUgb2JqZWN0LlxuXHRcdCAqIFxuXHRcdCAqIEBleGFtcGxlIHsgXCJuYW1lXCI6IFwiPHRoPk5hbWU8L3RoPlwiLCBcImVtYWlsXCI6IFwiPHRoPkVtYWlsPC90aD5cIiB9XG5cdFx0ICovXG5cdFx0ZWxlbWVudHM6IHsgW25hbWU6IHN0cmluZ106IGFueTsgfTtcblx0XHQvKipcblx0XHQgKiBUaGUgaGVhZGVyIGluZGljaWVzIGFyZSBzdG9yZWQgaW4gYSBrZXkvdmFsdWUgb2JqZWN0LlxuXHRcdCAqIFxuXHRcdCAqIEBleGFtcGxlIGNvbnNvbGUubG9nICh0aGlzLmhlYWRlckluZGljaWVzW1wibmFtZVwiXSk7IC8vIE91dHB1dHMgMFxuXHRcdCAqL1xuXHRcdGluZGljaWVzOiBudW1iZXJbXTtcblx0fTtcblx0LyoqXG5cdCAqIFRoZSByb3cgZWxlbWVudHMgYXJlIHN0b3JlZCBpbiBhbiBhcnJheSB3aXRoIGtleS92YWx1ZSBmaWVsZHMgYW5kIGl0J3MgYXR0YWNoZWQgaHRtbCBlbGVtZW50LlxuXHQgKiBcblx0ICogQGV4YW1wbGVcblx0ICoge1xuXHQgKiAgIFwiZmllbGRzXCI6IFtcblx0ICogICAgICAge1xuXHQgKiAgICAgICAgIFwibmFtZVwiOiBcIkpvaG4gU21pdGhcIixcblx0ICogICAgICAgICBcImVtYWlsXCI6IFwiam9obi5zbWl0aEB0ZXN0LmNvbVwiXG5cdCAqICAgICAgIH1cblx0ICogICAgIF0sXG5cdCAqICAgXCJodG1sXCI6IFwiPHRyPjx0ZD5Kb2huIFNtaXRoPC90ZD48dGQ+am9obi5zbWl0aEB0ZXN0LmNvbTwvdGQ+PC90cj5cIlxuXHQgKiB9XG5cdCAqL1xuXHRyb3dFbGVtZW50czogeyBmaWVsZHM6IGFueVtdOyBlbGVtZW50OiBIVE1MRWxlbWVudDsgfVtdID0gW107XG5cdC8qKlxuXHQgKiBUaGUgdGFibGUgY2FsbGJhY2sgZm9yIHdoZW4gdXBkYXRpbmcgZGF0YS5cblx0ICovXG5cdHRhYmxlQ2FsbGJhY2s6ICgoZGF0YTogYW55KSA9PiB2b2lkKTtcblx0LyoqXG5cdCAqIFRoZSB0YWJsZSBkYXRhIGZvciB3aGVuIHVwZGF0aW5nIGRhdGEuXG5cdCAqL1xuXHRwcm90ZWN0ZWQgdGFibGVEYXRhOiBhbnk7XG5cdC8qKlxuXHQgKiBUaGUgc2VsZWN0ZWQgcm93IGluZGljaWVzLiBFYWNoIGluZGV4IG1hcHMgdG8gdGhlIHJvd0VsZW1lbnRzIGFycmF5LlxuXHQgKiBcblx0ICogQGZpeG1lIEFkZCBzdXBwb3J0IGZvciB0aGlzIGluIHRoZSBmdXR1cmUuXG5cdCAqL1xuXHQvL3Byb3RlY3RlZCBzZWxlY3RlZFJvd3M6IG51bWJlcltdO1xuXHQvKipcblx0ICogVGhlIG1vc3QgcmVjZW50bHkgc2VsZWN0ZWQgcm93IGluZGV4LiBUaGUgaW5kZXggbWFwcyB0byB0aGUgcm93RWxlbWVudHMgYXJyYXkuXG5cdCAqL1xuXHRwcm90ZWN0ZWQgc2VsZWN0ZWQ6IG51bWJlcjtcblx0LyoqXG5cdCAqIFRoZSBsaXN0IGZ1bmN0aW9uIHRvIGV4ZWN1dGUgdG8gcmV0cmlldmUgZGF0YS5cblx0ICovXG5cdG9ubGlzdDogKHNlYXJjaDogSUxpc3RTZWFyY2hQcm9wZXJ0aWVzKSA9PiBQcm9taXNlPElBUElSZXNwb25zZT47XG5cdC8qKlxuXHQgKiBUaGUgbGlzdCB1cmwgdG8gdXNlIGZvciB0aGlzIHRhYmxlLiBIb3QuRGF0YS5BZG1pblBhbmVsLmxpc3RVcmwgd2lsbCBub3QgYmUgdXNlZCBpbiB0aGlzIGNhc2UuXG5cdCAqL1xuXHRsaXN0dXJsOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBJZiBzZXQgdG8gdHJ1ZSwgZWFjaCByb3cgd2lsbCBoYXZlIGEgY2hlY2tib3guXG5cdCAqIEBkZWZhdWx0IHRydWVcblx0ICovXG5cdGNoZWNrYm94OiBib29sZWFuO1xuXHQvKipcblx0ICogSWYgc2V0IHRvIHRydWUsIGEgc2luZ2xlIGNsaWNrIHdpbGwgYWxsb3cgdGhlIHVzZXIgdG8gZWRpdCB0aGUgcm93LlxuXHQgKi9cblx0c2luZ2xlY2xpY2tlZGl0OiBib29sZWFuO1xuXHQvKipcblx0ICogRXhlY3V0ZXMgdGhpcyBldmVudCB3aGVuIGEgcm93IGlzIHNlbGVjdGVkLiBUaGUgcG90ZW50aWFsIGl0ZW0gdG8gYmUgc2VsZWN0ZWQgXG5cdCAqIHdpbGwgYWxzbyBiZSBwYXNzZWQuIElmIHRoaXMgcmV0dXJucyBmYWxzZSwgdGhlIHJvdyB3aWxsIG5vdCBiZSBzZWxlY3RlZC5cblx0ICovXG5cdG9uc2VsZWN0ZWRyb3c6IChyb3dJbmRleDogbnVtYmVyLCBpdGVtOiBhbnlbXSkgPT4gUHJvbWlzZTxib29sZWFuPjtcblx0LyoqXG5cdCAqIFRoZSBhdHRhY2hlZCBlZGl0IGZvcm0sIGlmIGFueS5cblx0ICovXG5cdGF0dGFjaGVkRWRpdDogQWRtaW5FZGl0O1xuXHQvKipcblx0ICogVGhlIGFzc29jaWF0ZWQgRGF0YVRhYmxlLlxuXHQgKi9cblx0ZGF0YVRhYmxlOiBEYXRhVGFibGU8QXBpPjtcblx0LyoqXG5cdCAqIEluZGljYXRlcyBpZiB0aGUgbGlzdCBpcyByZWZyZXNoaW5nLlxuXHQgKi9cblx0aXNMaXN0UmVmcmVzaGluZzogYm9vbGVhbjtcblxuXHRjb25zdHJ1Y3RvciAoY29weTogSG90Q29tcG9uZW50IHwgSG90U3RhcSwgYXBpOiBIb3RBUEkpXG5cdHtcblx0XHRzdXBlciAoY29weSwgYXBpKTtcblxuXHRcdHRoaXMudGFnID0gXCJhZG1pbi10YWJsZVwiO1xuXHRcdHRoaXMudGl0bGUgPSBcIlwiO1xuXHRcdHRoaXMuc2NoZW1hID0gXCJcIjtcblx0XHR0aGlzLmhlYWRlcnMgPSB7XG5cdFx0XHRcdGZpZWxkczoge30sXG5cdFx0XHRcdGVsZW1lbnRzOiB7fSxcblx0XHRcdFx0aW5kaWNpZXM6IFtdXG5cdFx0XHR9O1xuXHRcdHRoaXMucm93RWxlbWVudHMgPSBbXTtcblx0XHR0aGlzLnRhYmxlQ2FsbGJhY2sgPSBudWxsO1xuXHRcdHRoaXMudGFibGVEYXRhID0gbnVsbDtcblx0XHQvL3RoaXMuc2VsZWN0ZWRSb3dzID0gW107XG5cdFx0dGhpcy5vbmxpc3QgPSBudWxsO1xuXHRcdHRoaXMubGlzdHVybCA9IFwiXCI7XG5cdFx0dGhpcy5jaGVja2JveCA9IHRydWU7XG5cdFx0dGhpcy5zaW5nbGVjbGlja2VkaXQgPSBmYWxzZTtcblx0XHR0aGlzLm9uc2VsZWN0ZWRyb3cgPSBudWxsO1xuXHRcdHRoaXMuYXR0YWNoZWRFZGl0ID0gbnVsbDtcblx0XHR0aGlzLnNlbGVjdGVkID0gLTE7XG5cdFx0dGhpcy5kYXRhVGFibGUgPSBudWxsO1xuXHRcdHRoaXMuaXNMaXN0UmVmcmVzaGluZyA9IGZhbHNlO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZCBhIGhlYWRlciB0byB0aGUgdGFibGUuXG5cdCAqL1xuXHRhZGRIZWFkZXIgKHRhYmxlRmllbGRFbGVtZW50OiBIVE1MRWxlbWVudClcblx0e1xuXHRcdGxldCBoZWFkZXIgPSB0aGlzLmh0bWxFbGVtZW50c1swXS5nZXRFbGVtZW50c0J5VGFnTmFtZSAoXCJ0aGVhZFwiKVswXTtcblxuXHRcdGlmICh0aGlzLmhlYWRlcnMuaW5kaWNpZXMubGVuZ3RoIDwgMSlcblx0XHRcdHRoaXMuaGVhZGVycy5pbmRpY2llcy5wdXNoIChudWxsKTtcblxuXHRcdC8vIEB0cy1pZ25vcmVcblx0XHR0aGlzLmhlYWRlcnMuaW5kaWNpZXMucHVzaCAodGFibGVGaWVsZEVsZW1lbnQuaG90Q29tcG9uZW50LmZpZWxkKTtcblx0XHRoZWFkZXIuYXBwZW5kQ2hpbGQgKHRhYmxlRmllbGRFbGVtZW50KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBZGQgYSBoZWFkZXIgdG8gdGhlIHRhYmxlLlxuXHQgKi9cblx0YWRkSGVhZGVyRGF0YU9ubHkgKHRhYmxlRmllbGQ6IEFkbWluVGFibGVGaWVsZCwgaHRtbEVsZW1lbnQ6IEhUTUxFbGVtZW50KVxuXHR7XG5cdFx0aWYgKHRoaXMuaGVhZGVycy5pbmRpY2llcy5sZW5ndGggPCAxKVxuXHRcdFx0dGhpcy5oZWFkZXJzLmluZGljaWVzLnB1c2ggKG51bGwpO1xuXG5cdFx0dGhpcy5oZWFkZXJzLmluZGljaWVzLnB1c2ggKHRhYmxlRmllbGQuZmllbGQpO1xuXHRcdHRoaXMuaGVhZGVycy5maWVsZHNbdGFibGVGaWVsZC5maWVsZF0gPSB0YWJsZUZpZWxkO1xuXHRcdHRoaXMuaGVhZGVycy5lbGVtZW50c1t0YWJsZUZpZWxkLmZpZWxkXSA9IGh0bWxFbGVtZW50O1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCB0aGUgZmllbGQgdHlwZSBvZiBhIGZpZWxkLlxuXHQgKi9cblx0Z2V0RmllbGRUeXBlIChmaWVsZE5hbWU6IHN0cmluZyk6IHN0cmluZ1xuXHR7XG5cdFx0aWYgKHRoaXMuaGVhZGVycy5lbGVtZW50c1tmaWVsZE5hbWVdICE9IG51bGwpXG5cdFx0e1xuXHRcdFx0bGV0IGhvdENvbXBvbmVudDogQWRtaW5UYWJsZUZpZWxkID0gdGhpcy5oZWFkZXJzLmVsZW1lbnRzW2ZpZWxkTmFtZV0uaG90Q29tcG9uZW50O1xuXG5cdFx0XHRpZiAoaG90Q29tcG9uZW50ICE9IG51bGwpXG5cdFx0XHRcdHJldHVybiAoaG90Q29tcG9uZW50LmZpZWxkX3R5cGUpO1xuXHRcdH1cblxuXHRcdHJldHVybiAobnVsbCk7XG5cdH1cblxuXHQvKipcblx0ICogRXhlY3V0ZXMgd2hlbiBhIHJvdyBpcyBzZWxlY3RlZC5cblx0ICovXG5cdGFzeW5jIHNlbGVjdFJvdyAoaHRtbEVsZW1lbnQ6IEhUTUxFbGVtZW50LCByb3dJbmRleDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPlxuXHR7XG5cdFx0Ly8gSW4gdGhlIGZ1dHVyZSwgd2Ugd2lsbCBzdXBwb3J0IG11bHRpcGxlIHJvd3MgYmVpbmcgc2VsZWN0ZWQuIEZvciBub3cgXG5cdFx0Ly8gdGhpcyB3aWxsIGVuc3VyZSB0aGF0IG9ubHkgb25lIHJvdyBpcyBzZWxlY3RlZCBhdCBhIHRpbWUuXG5cdFx0e1xuXHRcdFx0bGV0IHRib2R5ID0gdGhpcy5odG1sRWxlbWVudHNbMV0uZ2V0RWxlbWVudHNCeVRhZ05hbWUgKFwidGJvZHlcIilbMF07XG5cdFx0XHRsZXQgcm93cyA9IHRib2R5LmdldEVsZW1lbnRzQnlUYWdOYW1lIChcInRyXCIpO1xuXG5cdFx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IHJvd3MubGVuZ3RoOyBpSWR4KyspXG5cdFx0XHR7XG5cdFx0XHRcdGxldCByb3c6IEhUTUxUYWJsZVJvd0VsZW1lbnQgPSByb3dzW2lJZHhdO1xuXG5cdFx0XHRcdGlmIChyb3cuY2xhc3NMaXN0LmNvbnRhaW5zIChcInRhYmxlLXByaW1hcnlcIikgPT09IHRydWUpXG5cdFx0XHRcdFx0cm93LmNsYXNzTGlzdC5yZW1vdmUgKFwidGFibGUtcHJpbWFyeVwiKTtcblx0XHRcdH1cblxuXHRcdFx0aHRtbEVsZW1lbnQuY2xhc3NMaXN0LmFkZCAoXCJ0YWJsZS1wcmltYXJ5XCIpO1xuXHRcdH1cblxuXHRcdHRoaXMuc2VsZWN0ZWQgPSByb3dJbmRleDtcblxuXHRcdGlmICh0eXBlb2YgKHRoaXMuc2luZ2xlY2xpY2tlZGl0KSA9PT0gXCJzdHJpbmdcIilcblx0XHRcdHRoaXMuc2luZ2xlY2xpY2tlZGl0ID0gSG90U3RhcS5wYXJzZUJvb2xlYW4gKHRoaXMuc2luZ2xlY2xpY2tlZGl0KTtcblxuXHRcdGlmICh0aGlzLnNpbmdsZWNsaWNrZWRpdCA9PT0gdHJ1ZSlcblx0XHR7XG5cdFx0XHRpZiAodGhpcy5hdHRhY2hlZEVkaXQgIT0gbnVsbClcblx0XHRcdFx0YXdhaXQgdGhpcy5hdHRhY2hlZEVkaXQuZWRpdENsaWNrZWQgKHRoaXMubmFtZSk7XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMub25zZWxlY3RlZHJvdyAhPSBudWxsKVxuXHRcdHtcblx0XHRcdGlmICh0eXBlb2YgKHRoaXMub25zZWxlY3RlZHJvdykgPT09IFwic3RyaW5nXCIpXG5cdFx0XHRcdHRoaXMub25zZWxlY3RlZHJvdyA9ICg8KHJvd0luZGV4OiBudW1iZXIsIGl0ZW06IGFueVtdKSA9PiBQcm9taXNlPGJvb2xlYW4+Pm5ldyBGdW5jdGlvbiAodGhpcy5vbnNlbGVjdGVkcm93KSk7XG5cblx0XHRcdGxldCBpdGVtOiBhbnlbXSA9IHRoaXMuZ2V0U2VsZWN0ZWQgKCk7XG5cblx0XHRcdGlmIChpdGVtID09IG51bGwpXG5cdFx0XHRcdHJldHVybjtcblxuXHRcdFx0bGV0IHJlc3VsdCA9IGF3YWl0IHRoaXMub25zZWxlY3RlZHJvdyAocm93SW5kZXgsIGl0ZW0pO1xuXG5cdFx0XHRpZiAocmVzdWx0ID09PSBmYWxzZSlcblx0XHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8qdGhpcy5zZWxlY3RlZFJvd3MgPSBbXTtcblx0XHRsZXQgdGJvZHkgPSB0aGlzLmh0bWxFbGVtZW50c1sxXS5nZXRFbGVtZW50c0J5VGFnTmFtZSAoXCJ0Ym9keVwiKVswXTtcblxuXHRcdC8vIEZpbmQgYWxsIHRoZSBjaGVja2JveGVzIGluIHRib2R5LlxuXHRcdGxldCBjaGVja2JveGVzID0gdGJvZHkuZ2V0RWxlbWVudHNCeVRhZ05hbWUgKFwiaW5wdXRcIik7XG5cblx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IGNoZWNrYm94ZXMubGVuZ3RoOyBpSWR4KyspXG5cdFx0e1xuXHRcdFx0bGV0IGNoZWNrYm94OiBIVE1MSW5wdXRFbGVtZW50ID0gY2hlY2tib3hlc1tpSWR4XTtcblxuXHRcdFx0aWYgKGNoZWNrYm94LmNoZWNrZWQgIT0gbnVsbClcblx0XHRcdHtcblx0XHRcdFx0aWYgKGNoZWNrYm94LmNoZWNrZWQgPT09IHRydWUpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHQvLyBHZXQgdGhlIGRhdGEtaW5kZXggYXR0cmlidXRlLlxuXHRcdFx0XHRcdGxldCBkYXRhSW5kZXhTdHI6IHN0cmluZyA9IGNoZWNrYm94LnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUgKFwiZGF0YS1pbmRleFwiKTtcblx0XHRcdFx0XHRsZXQgZGF0YUluZGV4OiBudW1iZXIgPSAgcGFyc2VJbnQgKGRhdGFJbmRleFN0cik7XG5cblx0XHRcdFx0XHR0aGlzLnNlbGVjdGVkUm93cy5wdXNoIChkYXRhSW5kZXgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSovXG5cdH1cblxuXHQvKipcblx0ICogR2V0IHRoZSBzZWxlY3RlZCBkYXRhLlxuXHQgKi9cblx0Z2V0U2VsZWN0ZWQgKCk6IGFueVtdXG5cdHtcblx0XHRsZXQgaW5kZXg6IG51bWJlciA9IHRoaXMuc2VsZWN0ZWQ7XG5cblx0XHRpZiAoaW5kZXggPCAwKVxuXHRcdFx0cmV0dXJuIChudWxsKTtcblxuXHRcdC8vIEB0cy1pZ25vcmVcblx0XHRjb25zdCByZXN1bHQgPSB0aGlzLmRhdGFUYWJsZS5yb3coaW5kZXgpLmRhdGEoKTtcblxuXHRcdHJldHVybiAocmVzdWx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgdGhlIHNlbGVjdGVkIGRhdGEuXG5cdCAqL1xuXHQvKmdldFNlbGVjdGVkUm93cyAoKTogYW55W11cblx0e1xuXHRcdGxldCByb3dzOiBhbnlbXSA9IFtdO1xuXG5cdFx0Zm9yIChsZXQgaUlkeCA9IDA7IGlJZHggPCB0aGlzLnNlbGVjdGVkUm93cy5sZW5ndGg7IGlJZHgrKylcblx0XHR7XG5cdFx0XHRsZXQgaW5kZXg6IG51bWJlciA9IHRoaXMuc2VsZWN0ZWRSb3dzW2lJZHhdO1xuXHRcdFx0cm93cy5wdXNoICh0aGlzLnJvd0VsZW1lbnRzW2luZGV4XS5maWVsZHMpO1xuXHRcdH1cblxuXHRcdHJldHVybiAocm93cyk7XG5cdH0qL1xuXG5cdC8qKlxuXHQgKiBHZXQgdGhlIGRhdGEgZm9yIGVhY2ggcm93IHRoYXQgaGFzIGJlZW4gY2hlY2tlZC5cblx0ICovXG5cdGdldENoZWNrZWRSb3dzICgpOiBhbnlbXVxuXHR7XG5cdFx0bGV0IHJvd3M6IGFueVtdID0gW107XG5cdFx0bGV0IHRib2R5ID0gdGhpcy5odG1sRWxlbWVudHNbMV0uZ2V0RWxlbWVudHNCeVRhZ05hbWUgKFwidGJvZHlcIilbMF07XG5cblx0XHQvLyBGaW5kIGFsbCB0aGUgY2hlY2tib3hlcyBpbiB0Ym9keS5cblx0XHRsZXQgY2hlY2tib3hlcyA9IHRib2R5LmdldEVsZW1lbnRzQnlUYWdOYW1lIChcImlucHV0XCIpO1xuXG5cdFx0Zm9yIChsZXQgaUlkeCA9IDA7IGlJZHggPCBjaGVja2JveGVzLmxlbmd0aDsgaUlkeCsrKVxuXHRcdHtcblx0XHRcdGxldCBjaGVja2JveDogSFRNTElucHV0RWxlbWVudCA9IGNoZWNrYm94ZXNbaUlkeF07XG5cblx0XHRcdGlmIChjaGVja2JveC5jaGVja2VkICE9IG51bGwpXG5cdFx0XHR7XG5cdFx0XHRcdGlmIChjaGVja2JveC5jaGVja2VkID09PSB0cnVlKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0Ly8gR2V0IHRoZSBkYXRhLWluZGV4IGF0dHJpYnV0ZS5cblx0XHRcdFx0XHRsZXQgZGF0YUluZGV4U3RyOiBzdHJpbmcgPSBjaGVja2JveC5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQuZ2V0QXR0cmlidXRlIChcImRhdGEtaW5kZXhcIik7XG5cdFx0XHRcdFx0bGV0IGRhdGFJbmRleDogbnVtYmVyID0gIHBhcnNlSW50IChkYXRhSW5kZXhTdHIpO1xuXG5cdFx0XHRcdFx0cm93cy5wdXNoICh0aGlzLnJvd0VsZW1lbnRzW2RhdGFJbmRleF0uZmllbGRzKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiAocm93cyk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IGEgcm93J3MgZGF0YS5cblx0ICovXG5cdGdldFJvdyAoaW5kZXg6IG51bWJlcik6IGFueVtdXG5cdHtcblx0XHRyZXR1cm4gKHRoaXMucm93RWxlbWVudHNbaW5kZXhdLmZpZWxkcyk7XG5cdH1cblxuXHQvKipcblx0ICogQWRkIGEgcm93IHRvIHRoZSB0YWJsZS5cblx0ICogXG5cdCAqIEBwYXJhbSB7QXJyYXl9IGZpZWxkcyBBIGxpc3Qgb2YgdmFsdWVzIHRvIGFwcGVuZC5cblx0ICovXG5cdGFkZFJvdyAoZmllbGRzOiB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfVtdKVxuXHR7XG5cdFx0aWYgKGZpZWxkcyA9PSBudWxsKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0aWYgKGZpZWxkcy5sZW5ndGggPT0gMClcblx0XHRcdHJldHVybjtcblxuXHRcdGxldCB0Ym9keSA9IHRoaXMuaHRtbEVsZW1lbnRzWzFdLmdldEVsZW1lbnRzQnlUYWdOYW1lIChcInRib2R5XCIpWzBdO1xuXHRcdGxldCBpbmRleDogbnVtYmVyID0gdGhpcy5yb3dFbGVtZW50cy5sZW5ndGg7XG5cdFx0Ly9sZXQgcm93U3RyID0gYDx0ciBvbmNsaWNrID0gXCJ0aGlzLnBhcmVudE5vZGUucGFyZW50Tm9kZS5wYXJlbnROb2RlLnBhcmVudE5vZGUuaG90Q29tcG9uZW50LnNlbGVjdFJvdyAodGhpcywgJHtpbmRleH0pO1wiPmA7XG5cblx0XHRpZiAodHlwZW9mICh0aGlzLmNoZWNrYm94KSA9PT0gXCJzdHJpbmdcIilcblx0XHRcdHRoaXMuY2hlY2tib3ggPSBIb3RTdGFxLnBhcnNlQm9vbGVhbiAodGhpcy5jaGVja2JveCk7XG5cblx0XHQvKmlmICh0aGlzLmNoZWNrYm94ID09PSB0cnVlKVxuXHRcdFx0cm93U3RyICs9IGA8dGQ+PGlucHV0IHR5cGUgPSBcImNoZWNrYm94XCIgLz48L3RkPmA7XG5cdFx0ZWxzZVxuXHRcdFx0cm93U3RyICs9IGA8dGQ+PC90ZD5gOyovXG5cdFx0bGV0IHJvd3NGaWVsZHM6IGFueVtdID0gW107XG5cblx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IHRoaXMuaGVhZGVycy5pbmRpY2llcy5sZW5ndGg7IGlJZHgrKylcblx0XHR7XG5cdFx0XHQvLyBAdHMtaWdub3JlIC0gQGZpeG1lIEkgbWVzc2VkIHRoaXMgdXAsIHdpbGwgZml4LlxuXHRcdFx0bGV0IGtleTogc3RyaW5nID0gdGhpcy5oZWFkZXJzLmluZGljaWVzW2lJZHhdO1xuXG5cdFx0XHRpZiAoa2V5ID09IG51bGwpXG5cdFx0XHRcdGNvbnRpbnVlO1xuXG5cdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHRsZXQgdmFsdWUgPSBmaWVsZHNba2V5XTtcblx0XHRcdC8vIEZvciBlYWNoIC4gaW4ga2V5IHdlIG5lZWQgdG8gZ2V0IHRoZSBuZXh0IG9iamVjdC5cblx0XHRcdGxldCBrZXlQYXJ0czogc3RyaW5nW10gPSBrZXkuc3BsaXQgKFwiLlwiKTtcblx0XHRcdFxuXHRcdFx0aWYgKGtleVBhcnRzLmxlbmd0aCA+IDEpXG5cdFx0XHR7XG5cdFx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdFx0bGV0IHRlbXBWYWx1ZTogYW55ID0gZmllbGRzW2tleVBhcnRzWzBdXTtcblxuXHRcdFx0XHRmb3IgKGxldCBpSWR4ID0gMTsgaUlkeCA8IGtleVBhcnRzLmxlbmd0aDsgaUlkeCsrKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0Y29uc3QgcGFydDogc3RyaW5nID0ga2V5UGFydHNbaUlkeF07XG5cblx0XHRcdFx0XHR0ZW1wVmFsdWUgPSB0ZW1wVmFsdWVbcGFydF07XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR2YWx1ZSA9IHRlbXBWYWx1ZTtcblx0XHRcdH1cblxuXHRcdFx0bGV0IHJvd09iaiA9IG51bGw7XG5cblx0XHRcdGlmICh0aGlzLmhlYWRlcnMuZWxlbWVudHNba2V5XSAhPSBudWxsKVxuXHRcdFx0e1xuXHRcdFx0XHQvLyBAdHMtaWdub3JlIC0gQGZpeG1lIEkgbWVzc2VkIHRoaXMgdXAsIHdpbGwgZml4LlxuXHRcdFx0XHRsZXQgZmllbGRUeXBlOiBzdHJpbmcgPSB0aGlzLmdldEZpZWxkVHlwZSAoa2V5KTtcblxuXHRcdFx0XHRpZiAoZmllbGRUeXBlID09IG51bGwpXG5cdFx0XHRcdFx0ZmllbGRUeXBlID0gXCJ0ZXh0XCI7XG5cblx0XHRcdFx0aWYgKGZpZWxkVHlwZSAhPT0gXCJyZW1vdmVcIilcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGNvbnN0IG9yZ0ZpZWxkID0gdGhpcy5oZWFkZXJzLmZpZWxkc1trZXldO1xuXHRcdFx0XHRcdGxldCBkZWZhdWx0T3V0cHV0OiBib29sZWFuID0gdHJ1ZTtcblxuXHRcdFx0XHRcdGlmIChvcmdGaWVsZCAhPSBudWxsKVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGlmIChvcmdGaWVsZC5vbmlucHV0ICE9IG51bGwpXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGlmICh0eXBlb2YgKG9yZ0ZpZWxkLm9uaW5wdXQpID09PSBcInN0cmluZ1wiKVxuXHRcdFx0XHRcdFx0XHRcdHRoaXMuaGVhZGVycy5maWVsZHNba2V5XS5vbmlucHV0ID0gKDwoaXRlbTogYW55KSA9PiBhbnk+bmV3IEZ1bmN0aW9uIChvcmdGaWVsZC5vbmlucHV0KSk7XG5cblx0XHRcdFx0XHRcdFx0dmFsdWUgPSBvcmdGaWVsZC5vbmlucHV0ICh2YWx1ZSk7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGlmIChvcmdGaWVsZC5vbm91dHB1dCAhPSBudWxsKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRpZiAodHlwZW9mIChvcmdGaWVsZC5vbm91dHB1dCkgPT09IFwic3RyaW5nXCIpXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5oZWFkZXJzLmZpZWxkc1trZXldLm9ub3V0cHV0ID0gKDwoaW5kZXg6IG51bWJlciwgdmFsdWU6IHN0cmluZykgPT4gc3RyaW5nPm5ldyBGdW5jdGlvbiAob3JnRmllbGQub25vdXRwdXQpKTtcblxuXHRcdFx0XHRcdFx0XHRkZWZhdWx0T3V0cHV0ID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IG5ld091dHB1dDogc3RyaW5nID0gb3JnRmllbGQub25vdXRwdXQgKGluZGV4LCB2YWx1ZSk7XG5cdFx0XHRcdFx0XHRcdC8vcm93U3RyICs9IG5ld091dHB1dDtcblx0XHRcdFx0XHRcdFx0cm93T2JqID0geyBpbmRleDogaW5kZXgsIHZhbHVlOiBuZXdPdXRwdXQgfTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAoZGVmYXVsdE91dHB1dCA9PT0gdHJ1ZSlcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHQvL3Jvd1N0ciArPSBgPHRkIGRhdGEtaW5kZXggPSBcIiR7aW5kZXh9XCI+JHt2YWx1ZX08L3RkPmA7XG5cdFx0XHRcdFx0XHRyb3dPYmogPSB2YWx1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0cm93c0ZpZWxkcy5wdXNoIChyb3dPYmopO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLnJvd3MgPT0gbnVsbClcblx0XHRcdHRoaXMucm93cyA9IFtdO1xuXG5cdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdC8vdGhpcy5kYXRhVGFibGUucm93LmFkZCAocm93c0ZpZWxkcyk7XG5cdFx0Ly90aGlzLnJvd3MucHVzaCAocm93c0ZpZWxkcyk7XG5cdFx0Lypyb3dTdHIgKz0gXCI8L3RyPlwiO1xuXG5cdFx0bGV0IG5ld09iaiA9IEhvdFN0YXEuYWRkSHRtbFVuc2FmZSAodGJvZHksIHJvd1N0cik7XG5cblx0XHR0aGlzLnJvd0VsZW1lbnRzLnB1c2ggKHtcblx0XHRcdFx0ZmllbGRzOiBmaWVsZHMsXG5cdFx0XHRcdGVsZW1lbnQ6ICg8SFRNTEVsZW1lbnQ+bmV3T2JqKVxuXHRcdFx0fSk7Ki9cblx0fVxuXG5cdHJvd3M6IGFueVtdO1xuXG5cdC8qKlxuXHQgKiBDbGVhciB0aGUgbGlzdCBvZiByb3dzLlxuXHQgKi9cblx0YXN5bmMgY2xlYXJSb3dzICgpXG5cdHtcblx0XHR0aGlzLnJvd0VsZW1lbnRzID0gW107XG5cblx0XHQvKmxldCB0Ym9keSA9IHRoaXMuaHRtbEVsZW1lbnRzWzFdLmdldEVsZW1lbnRzQnlUYWdOYW1lIChcInRib2R5XCIpWzBdO1xuXG5cdFx0dGJvZHkuaW5uZXJIVE1MID0gXCJcIjsqL1xuXG5cdFx0aWYgKHRoaXMuZGF0YVRhYmxlICE9IG51bGwpXG5cdFx0e1xuXHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0dGhpcy5kYXRhVGFibGUuY2xlYXIgKCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFJlZnJlc2ggdGhlIGxpc3QuXG5cdCAqIFxuXHQgKiBAcmV0dXJucyBUaGUgdG90YWwgbnVtYmVyIG9mIHJvd3MgYXZhaWxhYmxlIGluIHRoZSBsaXN0LlxuXHQgKi9cblx0YXN5bmMgcmVmcmVzaExpc3QgKGxpc3Q6IElBUElSZXNwb25zZSA9IG51bGwpOiBQcm9taXNlPElBUElSZXNwb25zZT5cblx0e1xuXHRcdHRoaXMuaXNMaXN0UmVmcmVzaGluZyA9IHRydWU7XG5cblx0XHRsZXQgc2VhcmNoOiBJTGlzdFNlYXJjaFByb3BlcnRpZXMgPSB7XG5cdFx0XHRcdHNlYXJjaDogXCJcIixcblx0XHRcdFx0b2Zmc2V0OiAwLFxuXHRcdFx0XHRsaW1pdDogMTBcblx0XHRcdH07XG5cblx0XHRpZiAodGhpcy5kYXRhVGFibGUgIT0gbnVsbClcblx0XHR7XG5cdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHRjb25zdCBzZWFyY2hTdHI6IHN0cmluZyA9IHRoaXMuZGF0YVRhYmxlLnNlYXJjaCAoKTtcblx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdGNvbnN0IGluZm8gPSB0aGlzLmRhdGFUYWJsZS5wYWdlLmluZm8gKCk7XG5cblx0XHRcdHNlYXJjaCA9IHtcblx0XHRcdFx0c2VhcmNoOiBzZWFyY2hTdHIgfHwgXCJcIixcblx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0XHRvZmZzZXQ6IGluZm8uc3RhcnQgfHwgMCxcblx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0XHRsaW1pdDogaW5mby5sZW5ndGggfHwgMTBcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMub25saXN0ICE9IG51bGwpXG5cdFx0e1xuXHRcdFx0aWYgKHR5cGVvZiAodGhpcy5vbmxpc3QpID09PSBcInN0cmluZ1wiKVxuXHRcdFx0XHR0aGlzLm9ubGlzdCA9ICg8KHNlYXJjaDogSUxpc3RTZWFyY2hQcm9wZXJ0aWVzKSA9PiBQcm9taXNlPElBUElSZXNwb25zZT4+bmV3IEZ1bmN0aW9uICh0aGlzLm9ubGlzdCkpO1xuXG5cdFx0XHRsaXN0ID0gYXdhaXQgdGhpcy5vbmxpc3QgKHNlYXJjaCk7XG5cdFx0fVxuXHRcdGVsc2Vcblx0XHR7XG5cdFx0XHRsZXQgbGlzdFVybDogc3RyaW5nID0gXCJcIjtcblxuXHRcdFx0aWYgKHRoaXMubGlzdHVybCAhPT0gXCJcIilcblx0XHRcdFx0bGlzdFVybCA9IHRoaXMubGlzdHVybDtcblxuXHRcdFx0aWYgKGxpc3RVcmwgIT09IFwiXCIpXG5cdFx0XHR7XG5cdFx0XHRcdGxpc3QgPSBhd2FpdCBIb3QuanNvblJlcXVlc3QgKGxpc3RVcmwsIHtcblx0XHRcdFx0XHRcdHNjaGVtYTogdGhpcy5zY2hlbWEsXG5cdFx0XHRcdFx0XHRzZWFyY2g6IHNlYXJjaFxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHRoaXMuY2xlYXJSb3dzICgpO1xuXG5cdFx0aWYgKGxpc3QgIT0gbnVsbClcblx0XHR7XG5cdFx0XHRpZiAobGlzdC5lcnJvciAhPSBudWxsKVxuXHRcdFx0e1xuXHRcdFx0XHRjb25zb2xlLmVycm9yIChgTGlzdCBlcnJvcjogJHtsaXN0LmVycm9yfWApO1xuXHRcdFx0XHR0aGlzLmlzTGlzdFJlZnJlc2hpbmcgPSBmYWxzZTtcblxuXHRcdFx0XHRyZXR1cm4gKG51bGwpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAobGlzdC5kYXRhID09IG51bGwpXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvciAoYFJldHVybmluZyBsaXN0IGRhdGEgdG8gXCIke3RoaXMubmFtZX1cIiBjb21wb25lbnQgaGFzIGEgbnVsbCBkYXRhIGZpZWxkLiBBUEkgcmVzcG9uc2UgZG9lcyBub3QgbWF0Y2ggdGhlIFwiSUFQSVJlc3BvbnNlXCIgc2NoZW1hLmApO1xuXG5cdFx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IGxpc3QuZGF0YS5sZW5ndGg7IGlJZHgrKylcblx0XHRcdHtcblx0XHRcdFx0bGV0IGVsbSA9IGxpc3QuZGF0YVtpSWR4XTtcblxuXHRcdFx0XHRmb3IgKGxldCBrZXkgaW4gZWxtKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGV0IHZhbHVlID0gZWxtW2tleV07XG5cdFx0XHRcdFx0bGV0IGZpZWxkVHlwZTogc3RyaW5nID0gdGhpcy5nZXRGaWVsZFR5cGUgKGtleSk7XG5cblx0XHRcdFx0XHRpZiAoZmllbGRUeXBlID09IG51bGwpXG5cdFx0XHRcdFx0XHRmaWVsZFR5cGUgPSBcInRleHRcIjtcblxuXHRcdFx0XHRcdGlmIChmaWVsZFR5cGUgIT09IFwicmVtb3ZlXCIpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0Y29uc3Qgb3JnRmllbGQgPSB0aGlzLmhlYWRlcnMuZmllbGRzW2tleV07XG5cdFx0XHRcdFx0XHRsZXQgZGVmYXVsdE91dHB1dDogYm9vbGVhbiA9IHRydWU7XG5cblx0XHRcdFx0XHRcdGlmIChvcmdGaWVsZCAhPSBudWxsKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRpZiAob3JnRmllbGQub25pbnB1dCAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKHR5cGVvZiAob3JnRmllbGQub25pbnB1dCkgPT09IFwic3RyaW5nXCIpXG5cdFx0XHRcdFx0XHRcdFx0XHR0aGlzLmhlYWRlcnMuZmllbGRzW2tleV0ub25pbnB1dCA9ICg8KGl0ZW06IGFueSkgPT4gYW55Pm5ldyBGdW5jdGlvbiAob3JnRmllbGQub25pbnB1dCkpO1xuXG5cdFx0XHRcdFx0XHRcdFx0dmFsdWUgPSBvcmdGaWVsZC5vbmlucHV0ICh2YWx1ZSk7XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRpZiAob3JnRmllbGQub25vdXRwdXQgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdGlmICh0eXBlb2YgKG9yZ0ZpZWxkLm9ub3V0cHV0KSA9PT0gXCJzdHJpbmdcIilcblx0XHRcdFx0XHRcdFx0XHRcdHRoaXMuaGVhZGVycy5maWVsZHNba2V5XS5vbm91dHB1dCA9ICg8KGluZGV4OiBudW1iZXIsIHZhbHVlOiBzdHJpbmcpID0+IHN0cmluZz5uZXcgRnVuY3Rpb24gKG9yZ0ZpZWxkLm9ub3V0cHV0KSk7XG5cblx0XHRcdFx0XHRcdFx0XHRkZWZhdWx0T3V0cHV0ID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgbmV3T3V0cHV0OiBzdHJpbmcgPSBvcmdGaWVsZC5vbm91dHB1dCAoaUlkeCwgdmFsdWUpO1xuXHRcdFx0XHRcdFx0XHRcdHZhbHVlID0gbmV3T3V0cHV0O1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGxpc3QuZGF0YVtpSWR4XVtrZXldID0gdmFsdWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0bGV0IHRib2R5ID0gdGhpcy5odG1sRWxlbWVudHNbMV0uZ2V0RWxlbWVudHNCeVRhZ05hbWUgKFwidGJvZHlcIilbMF07XG5cdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdHRib2R5LmhvdENvbXBvbmVudCA9IHRoaXM7XG5cdFx0JCh0Ym9keSkub24gKCdjbGljaycsICd0cicsIGZ1bmN0aW9uICgpXG5cdFx0XHR7XG5cdFx0XHRcdGNvbnN0IGhvdENvbXBvbmVudDogQWRtaW5UYWJsZSA9IHRoaXMucGFyZW50Tm9kZS5ob3RDb21wb25lbnQ7XG5cdFx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdFx0Y29uc3QgaW5kZXggPSBob3RDb21wb25lbnQuZGF0YVRhYmxlLnJvdyAodGhpcykuaW5kZXggKCk7XG5cblx0XHRcdFx0aWYgKGluZGV4ICE9IG51bGwpXG5cdFx0XHRcdFx0aG90Q29tcG9uZW50LnNlbGVjdFJvdyAodGhpcywgaW5kZXgpO1xuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRpZiAoaG90Q29tcG9uZW50LmF0dGFjaGVkRWRpdCAhPSBudWxsKVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGlmIChob3RDb21wb25lbnQuYXR0YWNoZWRFZGl0LmFkZENsaWNrZWQgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0aG90Q29tcG9uZW50LmF0dGFjaGVkRWRpdC5hZGRDbGlja2VkICgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cblx0XHR0aGlzLmlzTGlzdFJlZnJlc2hpbmcgPSBmYWxzZTtcblxuXHRcdHJldHVybiAobGlzdCk7XG5cdH1cblxuXHQvKipcblx0ICogUHJlcGFyZSBkYXRhLlxuXHQgKi9cblx0cHJlcGFyZURhdGEgKGN1cnJlbnREYXRhOiBhbnlbXSB8IElBUElSZXNwb25zZSk6IHtcblx0XHRcdGRyYXc6IGFueTtcblx0XHRcdGRhdGE6IGFueVtdO1xuXHRcdFx0cmVjb3Jkc1RvdGFsOiBudW1iZXI7XG5cdFx0XHRyZWNvcmRzRmlsdGVyZWQ6IG51bWJlcjtcblx0XHR9XG5cdHtcblx0XHRjb25zdCBjYWxsYmFja09iajogYW55ID0ge1xuXHRcdFx0ZHJhdzogdGhpcy50YWJsZURhdGEsXG5cdFx0XHRkYXRhOiBbXSxcblx0XHRcdHJlY29yZHNUb3RhbDogMCxcblx0XHRcdHJlY29yZHNGaWx0ZXJlZDogMFxuXHRcdH07XG5cblx0XHRpZiAoY3VycmVudERhdGEgIT0gbnVsbClcblx0XHR7XG5cdFx0XHRpZiAoISAoY3VycmVudERhdGEgaW5zdGFuY2VvZiBBcnJheSkpXG5cdFx0XHR7XG5cdFx0XHRcdGlmIChjdXJyZW50RGF0YS5sZW5ndGggIT0gbnVsbClcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGNhbGxiYWNrT2JqLnJlY29yZHNUb3RhbCA9IGN1cnJlbnREYXRhLmxlbmd0aDtcblx0XHRcdFx0XHRjYWxsYmFja09iai5yZWNvcmRzRmlsdGVyZWQgPSBjdXJyZW50RGF0YS5sZW5ndGg7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoY3VycmVudERhdGEuZGF0YSAhPSBudWxsKVxuXHRcdFx0XHRcdGNhbGxiYWNrT2JqLmRhdGEgPSBjdXJyZW50RGF0YS5kYXRhO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZVxuXHRcdFx0e1xuXHRcdFx0XHRjYWxsYmFja09iai5kYXRhID0gY3VycmVudERhdGE7XG5cdFx0XHRcdGNhbGxiYWNrT2JqLnJlY29yZHNUb3RhbCA9IGN1cnJlbnREYXRhLmxlbmd0aDtcblx0XHRcdFx0Y2FsbGJhY2tPYmoucmVjb3Jkc0ZpbHRlcmVkID0gY3VycmVudERhdGEubGVuZ3RoO1xuXHRcdFx0fVxuXG5cdFx0XHRsZXQgc2FuaXRpemUgPSB0cnVlO1xuXG5cdFx0XHRpZiAoY2FsbGJhY2tPYmouZGF0YS5ob3RTYW5pdGl6ZSAhPSBudWxsKVxuXHRcdFx0XHRzYW5pdGl6ZSA9IGNhbGxiYWNrT2JqLmRhdGEuaG90U2FuaXRpemU7XG5cblx0XHRcdGZvciAobGV0IGlJZHggPSAwOyBpSWR4IDwgY2FsbGJhY2tPYmouZGF0YS5sZW5ndGg7IGlJZHgrKylcblx0XHRcdHtcblx0XHRcdFx0Y29uc3Qgcm93ID0gY2FsbGJhY2tPYmouZGF0YVtpSWR4XTtcblxuXHRcdFx0XHRpZiAoc2FuaXRpemUgPT09IHRydWUpXG5cdFx0XHRcdFx0Y2FsbGJhY2tPYmouZGF0YVtpSWR4XSA9IEhvdFN0YXEuc2FuaXRpemVKU09OIChyb3cpO1xuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0Y2FsbGJhY2tPYmouZGF0YVtpSWR4XSA9IHJvdztcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gKGNhbGxiYWNrT2JqKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgdGhlIGxpc3Qgb2YgZGF0YSBmcm9tIHRoZSBzZXJ2ZXIuXG5cdCAqL1xuXHRvblBvc3RQbGFjZSAocGFyZW50SHRtbEVsZW1lbnQ6IEhUTUxFbGVtZW50LCBodG1sRWxlbWVudDogSFRNTEVsZW1lbnQpOiBIVE1MRWxlbWVudFxuXHR7XG5cdFx0c2V0VGltZW91dCAoYXN5bmMgKCkgPT5cblx0XHRcdHtcblx0XHRcdFx0Y29uc3QgdGFibGUgPSAkKGh0bWxFbGVtZW50KS5maW5kKFwidGFibGVcIik7XG5cblx0XHRcdFx0Ly8gVGhlIGRhdGEgc3RvcmVkIGluIGNvbHVtbnMgc2hvdWxkIGJlIGNvbnNpZGVyZWQgc2FmZSBhcyBpdCBjb21lcyBkaXJlY3RseSBmcm9tIFxuXHRcdFx0XHQvLyB0aGUgSFRNTCBhZnRlciBsb2FkLlxuXHRcdFx0XHRsZXQgY29sdW1uczogQ29uZmlnQ29sdW1uc1tdID0gW107XG5cdFx0XHRcdCQodGFibGUpLmZpbmQgKFwidGhlYWQgdGhcIikuZWFjaCAoZnVuY3Rpb24gKClcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRjb25zdCB0ZXh0ID0gJCh0aGlzKS50ZXh0ICgpO1xuXHRcdFx0XHRcdFx0Y29uc3QgZGF0YSA9ICQodGhpcykuZGF0YSAoXCJmaWVsZFwiKTtcblx0XHRcdFx0XHRcdGxldCBkYXRhVHlwZSA9ICQodGhpcykuZGF0YSAoXCJmaWVsZC10eXBlXCIpO1xuXG5cdFx0XHRcdFx0XHRpZiAoKHRleHQgPT0gbnVsbCkgfHwgKHRleHQgPT09IFwiXCIpKVxuXHRcdFx0XHRcdFx0XHRyZXR1cm47XG5cblx0XHRcdFx0XHRcdGlmICgoZGF0YSA9PSBudWxsKSB8fCAoZGF0YSA9PT0gXCJcIikpXG5cdFx0XHRcdFx0XHRcdHJldHVybjtcblxuXHRcdFx0XHRcdFx0aWYgKGRhdGFUeXBlID09PSBcInRleHRcIilcblx0XHRcdFx0XHRcdFx0ZGF0YVR5cGUgPSBcInN0cmluZ1wiO1xuXG5cdFx0XHRcdFx0XHQvLyBTdGFtcCBkYXRhLWxhYmVsPVwiPGNvbHVtbiB0aXRsZT5cIiBvbiBlYWNoIHJlbmRlcmVkIDx0ZD5cblx0XHRcdFx0XHRcdC8vIHNvIGNvbnN1bWVycyBjYW4gdHJhbnNmb3JtIHRhYmxlcyB0byBjYXJkLW1vZGUgYmVsb3dcblx0XHRcdFx0XHRcdC8vIHRoZSBtb2JpbGUgYnJlYWtwb2ludCB2aWEgQ1NTIGF0dHIoKS5cblx0XHRcdFx0XHRcdGNvbnN0IGxhYmVsID0gdGV4dDtcblx0XHRcdFx0XHRcdGNvbHVtbnMucHVzaCh7XG5cdFx0XHRcdFx0XHRcdFx0dGl0bGU6IHRleHQsXG5cdFx0XHRcdFx0XHRcdFx0ZGF0YTogZGF0YSxcblx0XHRcdFx0XHRcdFx0XHRjcmVhdGVkQ2VsbDogZnVuY3Rpb24gKGNlbGw6IE5vZGUsIF9jZWxsRGF0YTogYW55LCBfcm93RGF0YTogYW55LCBfcm93SWR4OiBudW1iZXIsIF9jb2xJZHg6IG51bWJlcilcblx0XHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0KGNlbGwgYXMgSFRNTEVsZW1lbnQpLnNldEF0dHJpYnV0ZSAoXCJkYXRhLWxhYmVsXCIsIGxhYmVsKTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0JCh0YWJsZSkuZmluZCAoXCJ0aGVhZFwiKS5yZW1vdmUgKCk7XG5cblx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0XHR0aGlzLmRhdGFUYWJsZSA9IG5ldyBEYXRhVGFibGUgKHRhYmxlWzBdLCB7XG5cdFx0XHRcdFx0cHJvY2Vzc2luZzogdHJ1ZSxcblx0XHRcdFx0XHRzZXJ2ZXJTaWRlOiB0cnVlLFxuXHRcdFx0XHRcdGNvbFJlb3JkZXI6IHRydWUsXG5cdFx0XHRcdFx0c2Nyb2xsZXI6IHRydWUsXG5cdFx0XHRcdFx0c2VsZWN0OiB0cnVlLFxuXHRcdFx0XHRcdGRvbTogJ1FsZnJ0aXAnLFxuXHRcdFx0XHRcdGNvbHVtbnM6IGNvbHVtbnMsXG5cdFx0XHRcdFx0ZGF0YTogW10sXG5cdFx0XHRcdFx0YWpheDogYXN5bmMgKGRhdGE6IG9iamVjdCwgY2FsbGJhY2s6ICgoZGF0YTogYW55KSA9PiB2b2lkKSwgc2V0dGluZ3M6IEludGVybmFsU2V0dGluZ3MpID0+XG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGlmICh0aGlzLmlzTGlzdFJlZnJlc2hpbmcgPT09IHRydWUpXG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHRcdFx0XHRcdHRoaXMudGFibGVDYWxsYmFjayA9IGNhbGxiYWNrO1xuXHRcdFx0XHRcdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHRcdFx0XHRcdHRoaXMudGFibGVEYXRhID0gZGF0YS5kcmF3O1xuXG5cdFx0XHRcdFx0XHRcdGxldCBjdXJyZW50RGF0YSA9IGF3YWl0IHRoaXMucmVmcmVzaExpc3QgKCk7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHByZXBhcmVkRGF0YSA9IHRoaXMucHJlcGFyZURhdGEgKGN1cnJlbnREYXRhKTtcblxuXHRcdFx0XHRcdFx0XHR0aGlzLnRhYmxlQ2FsbGJhY2sgKHByZXBhcmVkRGF0YSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9LCA1MCk7IC8vLyBAdG9kbyBGaXggdGhpcyBzdHVwaWQgaGFjay4gVGhpcyBzaG91bGQgaGFwcGVuIHNsaWdodGx5IGFmdGVyIHRoZSBkb2N1bWVudCBoYXMgYmVlbiBsb2FkZWQuXG5cblx0XHRyZXR1cm4gKG51bGwpO1xuXHR9XG5cblx0b3V0cHV0ICgpOiBzdHJpbmcgfCBIb3RDb21wb25lbnRPdXRwdXRbXVxuXHR7XG5cdFx0bGV0IGVtcHR5Q2hlY2tib3hIZWFkZXI6IHN0cmluZyA9IFwiPHRoPjwvdGg+XCI7XG5cblx0XHRyZXR1cm4gKGBcblx0XHQ8ZGl2IGlkID0gXCIke3RoaXMuaHRtbEVsZW1lbnRzWzBdLmlkfVwiPlxuXHRcdFx0PGgyPiR7dGhpcy50aXRsZX08L2gyPlxuXHRcdFx0PGRpdiBjbGFzcz1cInRhYmxlLXJlc3BvbnNpdmVcIj5cblx0XHRcdDx0YWJsZSBpZCA9IFwiJHt0aGlzLmh0bWxFbGVtZW50c1swXS5pZH1UYWJsZVwiIGNsYXNzPVwidGFibGUgdGFibGUtc3RyaXBlZCB0YWJsZS1zbVwiPlxuXHRcdFx0XHQ8dGhlYWQ+XG5cdFx0XHRcdFx0PHRyIGhvdC1wbGFjZS1oZXJlID0gXCJoZWFkZXJcIj5cblx0XHRcdFx0XHRcdCR7ZW1wdHlDaGVja2JveEhlYWRlcn1cblx0XHRcdFx0XHQ8L3RyPlxuXHRcdFx0XHQ8L3RoZWFkPlxuXHRcdFx0XHQ8dGJvZHkgaG90LXBsYWNlLWhlcmUgPSBcInJlc3VsdHNcIj5cblx0XHRcdFx0PC90Ym9keT5cblx0XHRcdDwvdGFibGU+XG5cdFx0XHQ8aG90LXBsYWNlLWhlcmUgbmFtZSA9IFwiYWZ0ZXJUYWJsZVwiPjwvaG90LXBsYWNlLWhlcmU+XG5cdFx0XHQ8L2Rpdj5cblx0XHQ8L2Rpdj5gKTtcblx0fVxufVxuIiwiaW1wb3J0IHsgSG90U3RhcSwgSG90LCBIb3RBUEksIEhvdENvbXBvbmVudCwgSG90Q29tcG9uZW50T3V0cHV0IH0gZnJvbSBcImhvdHN0YXFcIjtcblxuZXhwb3J0IGNsYXNzIEFkbWluVGV4dCBleHRlbmRzIEhvdENvbXBvbmVudFxue1xuXHQvKipcblx0ICogSWYgc2V0IHRvIDEsIHRoaXMgd2lsbCBub3Qgb3V0cHV0IHRoZSBmaWVsZC5cblx0ICovXG5cdG5vX291dHB1dDogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIGNsYXNzZXMgdG8gc2V0IGZvciB0aGUgaW5wdXQuXG5cdCAqIEBkZWZhdWx0IFwiZm9ybS1jb250cm9sXCJcblx0ICovXG5cdGNzc19jbGFzczogc3RyaW5nO1xuXG5cdGNvbnN0cnVjdG9yIChjb3B5OiBIb3RDb21wb25lbnQgfCBIb3RTdGFxLCBhcGk6IEhvdEFQSSlcblx0e1xuXHRcdHN1cGVyIChjb3B5LCBhcGkpO1xuXG5cdFx0dGhpcy50YWcgPSBcImFkbWluLXRleHRcIjtcblx0XHR0aGlzLm5vX291dHB1dCA9IFwiMFwiO1xuXHRcdHRoaXMuY3NzX2NsYXNzID0gXCJmb3JtLWNvbnRyb2xcIlxuXHR9XG5cblx0LyoqXG5cdCAqIENvcnJlY3RzIHRoZSBwbGFjZW1lbnQgb2YgdGhlIHRleHQgZWxlbWVudHMgZm9yIG1vZGFscy5cblx0ICovXG5cdG9uUG9zdFBsYWNlIChwYXJlbnRIdG1sRWxlbWVudDogSFRNTEVsZW1lbnQsIGh0bWxFbGVtZW50OiBIVE1MRWxlbWVudCk6IEhUTUxFbGVtZW50XG5cdHtcblx0XHRsZXQgcGxhY2VIZXJlQXJyYXkgPSBwYXJlbnRIdG1sRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsIChgaG90LXBsYWNlLWhlcmVbdHlwZT1cIm1vZGFsXCJdYCk7XG5cblx0XHRpZiAocGxhY2VIZXJlQXJyYXkubGVuZ3RoID4gMClcblx0XHR7XG5cdFx0XHRsZXQgcGxhY2VIZXJlID0gcGxhY2VIZXJlQXJyYXlbMF07XG5cdFx0XHRwYXJlbnRIdG1sRWxlbWVudC5yZW1vdmVDaGlsZCAoaHRtbEVsZW1lbnQpO1xuXHRcdFx0cGxhY2VIZXJlLmFwcGVuZENoaWxkIChodG1sRWxlbWVudCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIChudWxsKTtcblx0fVxuXG5cdG91dHB1dCAoKTogc3RyaW5nIHwgSG90Q29tcG9uZW50T3V0cHV0W11cblx0e1xuXHRcdGxldCB2YWx1ZTogc3RyaW5nID0gXCJcIjtcblxuXHRcdGlmICh0aGlzLnZhbHVlICE9IG51bGwpXG5cdFx0XHR2YWx1ZSA9IHRoaXMudmFsdWU7XG5cblx0XHRpZiAodGhpcy5ub19vdXRwdXQgPT09IFwiMVwiKVxuXHRcdFx0cmV0dXJuIChgPGRpdj48aW5wdXQgY2xhc3M9XCIke3RoaXMuY3NzX2NsYXNzfVwiIHR5cGUgPSBcImhpZGRlblwiIHZhbHVlID0gXCIke3ZhbHVlfVwiIC8+PC9kaXY+YCk7XG5cblx0XHRjb25zdCBmaWVsZCA9IHRoaXMuaHRtbEVsZW1lbnRzWzBdLmdldEF0dHJpYnV0ZSAoXCJob3QtZmllbGRcIik7XG5cdFx0bGV0IGZpZWxkX3R5cGUgPSB0aGlzLmh0bWxFbGVtZW50c1swXS5nZXRBdHRyaWJ1dGUgKFwiaG90LWZpZWxkLXR5cGVcIik7XG5cdFx0bGV0IGh0bWxUeXBlID0gdGhpcy5odG1sRWxlbWVudHNbMF0uZ2V0QXR0cmlidXRlIChcInR5cGVcIikgfHwgXCJ0ZXh0XCI7XG5cblx0XHRpZiAoZmllbGRfdHlwZSA9PSBudWxsKVxuXHRcdFx0ZmllbGRfdHlwZSA9IFwidGV4dFwiO1xuXG5cdFx0cmV0dXJuIChgPGRpdj5cblx0XHRcdDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIj4ke3RoaXMuaW5uZXJ9PC9sYWJlbD5cblx0XHRcdDxpbnB1dCBjbGFzcz1cIiR7dGhpcy5jc3NfY2xhc3N9XCIgdHlwZSA9IFwiJHtodG1sVHlwZX1cIiBob3QtZmllbGQgPSBcIiR7ZmllbGR9XCIgaG90LWZpZWxkLXR5cGUgPSBcIiR7ZmllbGRfdHlwZX1cIiB2YWx1ZSA9IFwiJHt2YWx1ZX1cIiAvPlxuXHRcdDwvZGl2PmApO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBIb3RTdGFxLCBIb3QsIEhvdEFQSSwgSG90Q29tcG9uZW50LCBIb3RDb21wb25lbnRPdXRwdXQgfSBmcm9tIFwiaG90c3RhcVwiO1xuaW1wb3J0IHsgQWRtaW5UYWJsZSB9IGZyb20gXCIuL2FkbWluLXRhYmxlXCI7XG5cbmV4cG9ydCBjbGFzcyBBZG1pblRhYmxlRmllbGQgZXh0ZW5kcyBIb3RDb21wb25lbnRcbntcblx0LyoqXG5cdCAqIFRoZSB0YWJsZSBmaWVsZC5cblx0ICovXG5cdGZpZWxkOiBudW1iZXI7XG5cdC8qKlxuXHQgKiBUaGUgdHlwZSBvZiBmaWVsZC4gQ2FuIGJlOlxuXHQgKiAqIHRleHRcblx0ICogKiByZW1vdmVcblx0ICogXG5cdCAqIERlZmF1bHQ6IHRleHRcblx0ICovXG5cdGZpZWxkX3R5cGU6IHN0cmluZztcblx0LyoqXG5cdCAqIElmIHNldCB0byAxLCB0aGlzIHdpbGwgbm90IG91dHB1dCB0aGUgZmllbGQuXG5cdCAqL1xuXHRub19vdXRwdXQ6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBvbmlucHV0IGV2ZW50IGlzIGZpcmVkIHdoZW4gYW4gaXRlbSBpcyBhYm91dCB0byBiZSBwbGFjZWQgaW50byB0aGUgdGFibGUuXG5cdCAqL1xuXHRvbmlucHV0OiAoaXRlbTogYW55KSA9PiBhbnk7XG5cdC8qKlxuXHQgKiBUaGUgb3V0cHV0IHRvIGRpc3BsYXkuXG5cdCAqL1xuXHRvbm91dHB1dDogKGluZGV4OiBudW1iZXIsIHZhbHVlOiBzdHJpbmcpID0+IHN0cmluZztcblxuXHRjb25zdHJ1Y3RvciAoY29weTogSG90Q29tcG9uZW50IHwgSG90U3RhcSwgYXBpOiBIb3RBUEkpXG5cdHtcblx0XHRzdXBlciAoY29weSwgYXBpKTtcblxuXHRcdHRoaXMudGFnID0gXCJhZG1pbi10YWJsZS1maWVsZFwiO1xuXHRcdHRoaXMuZmllbGQgPSAwO1xuXHRcdHRoaXMuZmllbGRfdHlwZSA9IFwidGV4dFwiO1xuXHRcdHRoaXMubm9fb3V0cHV0ID0gXCIwXCI7XG5cdFx0dGhpcy5vbmlucHV0ID0gbnVsbDtcblx0XHR0aGlzLm9ub3V0cHV0ID0gbnVsbDtcblx0fVxuXG5cdC8qKlxuXHQgKiBBZGQgdGhpcyB0YWJsZSBmaWVsZCB0byB0aGUgdGFibGVcblx0ICovXG5cdG9uUG9zdFBsYWNlIChwYXJlbnRIdG1sRWxlbWVudDogSFRNTEVsZW1lbnQsIGh0bWxFbGVtZW50OiBIVE1MRWxlbWVudCk6IEhUTUxFbGVtZW50XG5cdHtcblx0XHRsZXQgaG90Q29tcG9uZW50OiBBZG1pblRhYmxlID0gbnVsbDtcblxuXHRcdC8vIEB0cy1pZ25vcmVcblx0XHRpZiAocGFyZW50SHRtbEVsZW1lbnQucGFyZW50Tm9kZS5wYXJlbnROb2RlLmhvdENvbXBvbmVudCAhPSBudWxsKVxuXHRcdHtcblx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdGhvdENvbXBvbmVudCA9IHBhcmVudEh0bWxFbGVtZW50LnBhcmVudE5vZGUucGFyZW50Tm9kZS5ob3RDb21wb25lbnQ7XG5cdFx0fVxuXHRcdGVsc2Vcblx0XHR7XG5cdFx0XHQvLyBAdHMtaWdub3JlIC0gbG9vb29sLiBBZGQgYSBiZXR0ZXIgd2F5IHRvIGdldCB0aGUgcGFyZW50IEhvdENvbXBvbmVudC5cblx0XHRcdGhvdENvbXBvbmVudCA9IHBhcmVudEh0bWxFbGVtZW50LnBhcmVudE5vZGUucGFyZW50Tm9kZS5wYXJlbnROb2RlLnBhcmVudE5vZGUuaG90Q29tcG9uZW50O1xuXHRcdH1cblxuXHRcdGlmIChob3RDb21wb25lbnQgIT0gbnVsbClcblx0XHRcdGhvdENvbXBvbmVudC5hZGRIZWFkZXJEYXRhT25seSAodGhpcywgaHRtbEVsZW1lbnQpO1xuXG5cdFx0cmV0dXJuIChudWxsKTtcblx0fVxuXG5cdG91dHB1dCAoKTogc3RyaW5nIHwgSG90Q29tcG9uZW50T3V0cHV0W11cblx0e1xuXHRcdGlmICh0aGlzLm5vX291dHB1dCA9PT0gXCIxXCIpXG5cdFx0e1xuXHRcdFx0cmV0dXJuIChbe1xuXHRcdFx0XHRodG1sOiBgPGRpdj48L2Rpdj5gLFxuXHRcdFx0XHRwbGFjZUhlcmVQYXJlbnQ6IFwiYWZ0ZXJUYWJsZVwiXG5cdFx0XHR9XSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIChbe1xuXHRcdFx0aHRtbDogYDx0aCBkYXRhLWZpZWxkID0gXCIke3RoaXMuZmllbGR9XCIgZGF0YS1maWVsZC10eXBlID0gXCIke3RoaXMuZmllbGRfdHlwZX1cIj4ke3RoaXMuaW5uZXJ9PC90aD5gLFxuXHRcdFx0cGxhY2VIZXJlUGFyZW50OiBcImhlYWRlclwiXG5cdFx0fV0pO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBIb3RTdGFxLCBIb3QsIEhvdEFQSSwgSG90Q29tcG9uZW50LCBIb3RDb21wb25lbnRPdXRwdXQgfSBmcm9tIFwiaG90c3RhcVwiO1xuXG5leHBvcnQgY2xhc3MgQWRtaW5UYWJsZVJvdyBleHRlbmRzIEhvdENvbXBvbmVudFxue1xuXHQvKipcblx0ICogVGhlIGZpZWxkcyBhcmUgc3RvcmVkIGluIGEga2V5L3ZhbHVlIG9iamVjdC5cblx0ICogXG5cdCAqIEBleGFtcGxlIHsgXCJuYW1lXCI6IFwiSm9obiBTbWl0aFwiLCBcImVtYWlsXCI6IFwiam9obi5zbWl0aEBlbWFpbC5jb21cIiB9XG5cdCAqL1xuXHRmaWVsZHM6IGFueVtdO1xuXG5cdGNvbnN0cnVjdG9yIChjb3B5OiBIb3RDb21wb25lbnQgfCBIb3RTdGFxLCBhcGk6IEhvdEFQSSlcblx0e1xuXHRcdHN1cGVyIChjb3B5LCBhcGkpO1xuXG5cdFx0dGhpcy50YWcgPSBcImFkbWluLXRhYmxlLXJvd1wiO1xuXHRcdHRoaXMuZmllbGRzID0gW107XG5cdH1cblxuXHQvKipcblx0ICogQWRkIHRoaXMgdGFibGUgcm93IHRvIHRoZSB0YWJsZVxuXHQgKi9cblx0b25Qb3N0UGxhY2UgKHBhcmVudEh0bWxFbGVtZW50OiBIVE1MRWxlbWVudCwgaHRtbEVsZW1lbnQ6IEhUTUxFbGVtZW50KTogSFRNTEVsZW1lbnRcblx0e1xuXHRcdC8vIEB0cy1pZ25vcmVcblx0XHRwYXJlbnRIdG1sRWxlbWVudC5wYXJlbnROb2RlLnBhcmVudE5vZGUucGFyZW50Tm9kZS5ob3RDb21wb25lbnQucm93RWxlbWVudHMucHVzaCAoeyBmaWVsZHM6IHRoaXMuZmllbGRzLCBlbGVtZW50OiBodG1sRWxlbWVudH0pO1xuXG5cdFx0cmV0dXJuIChudWxsKTtcblx0fVxuXG5cdG91dHB1dCAoKTogc3RyaW5nIHwgSG90Q29tcG9uZW50T3V0cHV0W11cblx0e1xuXHRcdGxldCByb3dIdG1sID0gXCJcIjtcblxuXHRcdGlmICh0aGlzLmZpZWxkcy5sZW5ndGggPiAwKVxuXHRcdFx0cm93SHRtbCArPSBgPHRkPjxpbnB1dCB0eXBlID0gXCJjaGVja2JveFwiIC8+PC90ZD5gO1xuXG5cdFx0Zm9yIChsZXQgaUlkeCA9IDA7IGlJZHggPCB0aGlzLmZpZWxkcy5sZW5ndGg7IGlJZHgrKylcblx0XHR7XG5cdFx0XHRsZXQgZmllbGRPYmogPSB0aGlzLmZpZWxkc1tpSWR4XTtcblxuXHRcdFx0Zm9yIChsZXQga2V5IGluIGZpZWxkT2JqKVxuXHRcdFx0e1xuXHRcdFx0XHRsZXQgdmFsdWUgPSBmaWVsZE9ialtrZXldO1xuXG5cdFx0XHRcdHJvd0h0bWwgKz0gYDx0ZD4ke3ZhbHVlfTwvdGQ+YDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gKFt7XG5cdFx0XHRodG1sOiBgPHRyPiR7cm93SHRtbH08L3RyPmAsXG5cdFx0XHRwbGFjZUhlcmVQYXJlbnQ6IFwicmVzdWx0c1wiXG5cdFx0fV0pO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBIb3RTdGFxLCBIb3QsIEhvdEFQSSwgSG90Q29tcG9uZW50IH0gZnJvbSBcImhvdHN0YXFcIjtcblxuZXhwb3J0IGNsYXNzIEFkbWluRGFzaGJvYXJkIGV4dGVuZHMgSG90Q29tcG9uZW50XG57XG5cdC8qKlxuXHQgKiBUaGUgdGl0bGUgb2YgdGhpcyBkYXNoYm9hcmQuXG5cdCAqL1xuXHR0aXRsZTogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIGJhc2UgdXJsIHRvIHVzZSBmb3IgdGhpcyBkYXNoYm9hcmQuXG5cdCAqL1xuXHRiYXNlOiBzdHJpbmc7XG5cblx0Y29uc3RydWN0b3IgKGNvcHk6IEhvdENvbXBvbmVudCB8IEhvdFN0YXEsIGFwaTogSG90QVBJKVxuXHR7XG5cdFx0c3VwZXIgKGNvcHksIGFwaSk7XG5cblx0XHR0aGlzLnRhZyA9IFwiYWRtaW4tZGFzaGJvYXJkXCI7XG5cdFx0dGhpcy50aXRsZSA9IFwiXCI7XG5cdFx0dGhpcy5iYXNlID0gXCJcIjtcblx0fVxuXG5cdC8qKlxuXHQgKiBBZGQgdGhpcyB0YWJsZSBmaWVsZCB0byB0aGUgdGFibGVcblx0ICovXG5cdG9uUG9zdFBsYWNlIChwYXJlbnRIdG1sRWxlbWVudDogSFRNTEVsZW1lbnQsIGh0bWxFbGVtZW50OiBIVE1MRWxlbWVudCk6IEhUTUxFbGVtZW50XG5cdHtcblx0XHRpZiAoSG90LkRhdGEuQWRtaW5QYW5lbCA9PSBudWxsKVxuXHRcdFx0SG90LkRhdGEuQWRtaW5QYW5lbCA9IHt9O1xuXG5cdFx0aWYgKEhvdC5EYXRhLkFkbWluUGFuZWwuYmFzZVVybCA9PSBudWxsKVxuXHRcdFx0SG90LkRhdGEuQWRtaW5QYW5lbC5iYXNlVXJsID0gdGhpcy5iYXNlO1xuXG5cdFx0aWYgKEhvdC5EYXRhLkFkbWluUGFuZWwuYWRkVXJsID09IG51bGwpXG5cdFx0XHRIb3QuRGF0YS5BZG1pblBhbmVsLmFkZFVybCA9IGAke0hvdC5EYXRhLkFkbWluUGFuZWwuYmFzZVVybH0vdjEvZGF0YS9hZGRgO1xuXG5cdFx0aWYgKEhvdC5EYXRhLkFkbWluUGFuZWwuZWRpdFVybCA9PSBudWxsKVxuXHRcdFx0SG90LkRhdGEuQWRtaW5QYW5lbC5lZGl0VXJsID0gYCR7SG90LkRhdGEuQWRtaW5QYW5lbC5iYXNlVXJsfS92MS9kYXRhL2VkaXRgO1xuXG5cdFx0aWYgKEhvdC5EYXRhLkFkbWluUGFuZWwucmVtb3ZlVXJsID09IG51bGwpXG5cdFx0XHRIb3QuRGF0YS5BZG1pblBhbmVsLnJlbW92ZVVybCA9IGAke0hvdC5EYXRhLkFkbWluUGFuZWwuYmFzZVVybH0vdjEvZGF0YS9yZW1vdmVgO1xuXG5cdFx0aWYgKEhvdC5EYXRhLkFkbWluUGFuZWwubGlzdFVybCA9PSBudWxsKVxuXHRcdFx0SG90LkRhdGEuQWRtaW5QYW5lbC5saXN0VXJsID0gYCR7SG90LkRhdGEuQWRtaW5QYW5lbC5iYXNlVXJsfS92MS9kYXRhL2xpc3RgO1xuXG5cdFx0cmV0dXJuIChudWxsKTtcblx0fVxuXG5cdG91dHB1dCAoKTogc3RyaW5nXG5cdHtcblx0XHRyZXR1cm4gKGBcblx0XHQ8bWFpbiBjbGFzcz1cImNvbC1tZC05IG1zLXNtLWF1dG8gY29sLWxnLTEwIHB4LW1kLTRcIj5cblx0XHRcdDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gZmxleC13cmFwIGZsZXgtbWQtbm93cmFwIGFsaWduLWl0ZW1zLWNlbnRlciBwdC0zIHBiLTIgbWItMyBib3JkZXItYm90dG9tXCI+XG5cdFx0XHRcdDxoMSBjbGFzcz1cImgyXCI+JHt0aGlzLnRpdGxlfTwvaDE+XG5cdFx0XHRcdDxkaXYgY2xhc3M9XCJidG4tdG9vbGJhciBtYi0yIG1iLW1kLTBcIj5cblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwIG1lLTJcIj5cblx0XHRcdFx0XHRcdDxob3QtcGxhY2UtaGVyZSBuYW1lID0gXCJkYXNoYm9hcmRIZWFkZXJcIj48L2hvdC1wbGFjZS1oZXJlPlxuXHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHQ8L2Rpdj5cblx0XHRcdDwvZGl2PlxuXHRcdFx0PGhvdC1wbGFjZS1oZXJlIG5hbWUgPSBcImJvZHlcIj48L2hvdC1wbGFjZS1oZXJlPlxuXHRcdDwvbWFpbj5gKTtcblx0fVxufVxuIiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsImltcG9ydCB7IEFkbWluQnV0dG9uIH0gZnJvbSBcIi4vY29tcG9uZW50cy9hZG1pbi1idXR0b25cIjtcbmltcG9ydCB7IEFkbWluRHJvcGRvd24gfSBmcm9tIFwiLi9jb21wb25lbnRzL2FkbWluLWRyb3Bkb3duXCI7XG5pbXBvcnQgeyBBZG1pbkRhc2hib2FyZCB9IGZyb20gXCIuL2NvbXBvbmVudHMvYWRtaW4tZGFzaGJvYXJkXCI7XG5pbXBvcnQgeyBBZG1pbkVkaXQgfSBmcm9tIFwiLi9jb21wb25lbnRzL2FkbWluLWVkaXRcIjtcbmltcG9ydCB7IEFkbWluVGFibGUgfSBmcm9tIFwiLi9jb21wb25lbnRzL2FkbWluLXRhYmxlXCI7XG5pbXBvcnQgeyBBZG1pblRhYmxlRmllbGQgfSBmcm9tIFwiLi9jb21wb25lbnRzL2FkbWluLXRhYmxlLWZpZWxkXCI7XG5pbXBvcnQgeyBBZG1pblRhYmxlUm93IH0gZnJvbSBcIi4vY29tcG9uZW50cy9hZG1pbi10YWJsZS1yb3dcIjtcbmltcG9ydCB7IEFkbWluVGV4dCB9IGZyb20gXCIuL2NvbXBvbmVudHMvYWRtaW4tdGV4dFwiO1xuXG5leHBvcnQge1xuXHRcdEFkbWluQnV0dG9uLFxuXHRcdEFkbWluRHJvcGRvd24sXG5cdFx0QWRtaW5EYXNoYm9hcmQsXG5cdFx0QWRtaW5FZGl0LFxuXHRcdEFkbWluVGFibGUsXG5cdFx0QWRtaW5UYWJsZUZpZWxkLFxuXHRcdEFkbWluVGFibGVSb3csXG5cdFx0QWRtaW5UZXh0XG5cdH07Il0sIm5hbWVzIjpbIm1vZHVsZSIsImV4cG9ydHMiLCJEYXRhVGFibGUiLCJIb3RTdGFxV2ViIiwiQWRtaW5Ecm9wZG93biIsIkhvdENvbXBvbmVudCIsImNvbnN0cnVjdG9yIiwiY29weSIsImFwaSIsInN1cGVyIiwidGhpcyIsInRhZyIsInBsYWNlaG9sZGVyIiwib25zZWFyY2giLCJvbnNlbGVjdCIsIm9uUG9zdFBsYWNlIiwicGFyZW50SHRtbEVsZW1lbnQiLCJodG1sRWxlbWVudCIsInBsYWNlSGVyZUFycmF5IiwicXVlcnlTZWxlY3RvckFsbCIsImxlbmd0aCIsInBsYWNlSGVyZSIsInJlbW92ZUNoaWxkIiwiYXBwZW5kQ2hpbGQiLCJGdW5jdGlvbiIsInF1ZXJ5U2VsZWN0b3IiLCJhZGRFdmVudExpc3RlbmVyIiwiZXZlbnQiLCJzZWFyY2hUZXh0IiwiY3VycmVudFRhcmdldCIsInZhbHVlIiwicmVzdWx0cyIsInNlYXJjaFJlc3VsdHNEaXYiLCIkIiwiaHRtbEVsZW1lbnRzIiwiZmluZCIsImVtcHR5IiwiaUlkeCIsInJlc3VsdCIsInVybCIsInRleHQiLCIkdGVtcGxhdGUiLCIkYSIsImF0dHIiLCJyZW1vdmVBdHRyIiwib24iLCJzZWxlY3RlZCIsImFwcGVuZCIsImluZGV4IiwiZ2V0QXR0cmlidXRlIiwiaW5uZXJIVE1MIiwib3V0cHV0IiwiaW5uZXIiLCJib290c3RyYXAiLCJBZG1pbkVkaXQiLCJvbkFkZENsaWNrZWQiLCJvbkVkaXRDbGlja2VkIiwib25SZW1vdmVDbGlja2VkIiwidGl0bGUiLCJidXR0b25fdGl0bGUiLCJhdHRhY2hlZF9saXN0Iiwic2NoZW1hIiwibW9kYWxJZCIsImFkZF90ZXh0IiwiYWRkX3BsYWNlX2hlcmUiLCJlZGl0X3RleHQiLCJlZGl0X3BsYWNlX2hlcmUiLCJyZW1vdmVfdGV4dCIsInJlbW92ZV9wbGFjZV9oZXJlIiwiY3NzX2NsYXNzIiwibW9kYWwiLCJtb2RhbFR5cGUiLCJjbG9zZU9uU2F2ZSIsInNlbGVjdGVkRmllbGRzIiwib25zYXZlIiwib25lZGl0Iiwib25kZWxldGUiLCJwcm9jZXNzSG90RmllbGRzIiwib25GaWVsZCIsImVsbXMiLCJlbG0iLCJmaWVsZCIsImZpZWxkVHlwZSIsImZpZWxkSW5wdXQiLCJuYW1lIiwidHlwZSIsImlucHV0IiwiYWRkQ2xpY2tlZCIsInZhbCIsIm9uYWRkIiwiTW9kYWwiLCJnZXRJbnN0YW5jZSIsInNob3ciLCJnZXRBdHRhY2hlZEhUTUxMaXN0cyIsInN0cnMiLCJzcGxpdCIsImF0dGFjaGVkTGlzdHMiLCJpIiwiYXR0YWNoZWRMaXN0IiwiYXR0YWNoZWRMaXN0T2JqIiwiZG9jdW1lbnQiLCJnZXRFbGVtZW50QnlJZCIsInB1c2giLCJnZXRBdHRhY2hlZExpc3RzIiwiYXR0YWNoZWRMaXN0T2JqcyIsImhvdENvbXBvbmVudCIsImVkaXRDbGlja2VkIiwiY2xpY2tlZFRhYmxlIiwidGFibGUiLCJhdHRhY2hlZEVkaXQiLCJzZWxlY3RlZEZpZWxkIiwiZ2V0U2VsZWN0ZWQiLCJmdW5jIiwiY2FsbCIsInJlbW92ZUNsaWNrZWQiLCJ3aGVyZUZpZWxkcyIsImNoZWNrZWRSb3dzIiwiZ2V0Q2hlY2tlZFJvd3MiLCJjaGVja2VkUm93IiwiY29uZmlybSIsIndoZXJlRmllbGQiLCJrZXkiLCJnZXRGaWVsZFR5cGUiLCJyZW1vdmVVcmwiLCJIb3QiLCJEYXRhIiwiQWRtaW5QYW5lbCIsImpzb25SZXF1ZXN0IiwiY3VycmVudERhdGEiLCJyZWZyZXNoTGlzdCIsInByZXBhcmVkRGF0YSIsInByZXBhcmVEYXRhIiwidGFibGVDYWxsYmFjayIsIm9uU2F2ZSIsInZhbHVlcyIsImZpZWxkU2F2ZSIsInBhcnNlRmxvYXQiLCJwYXJzZUludCIsImJvb2x2YWwiLCJ0b0xvd2VyQ2FzZSIsImFkZFVybCIsImZpZWxkcyIsImFsZXJ0IiwiZWRpdFVybCIsImhpZGUiLCJzZXRUaW1lb3V0IiwiRXJyb3IiLCJvdXRwdXRPYmoiLCJodG1sIiwiZG9jdW1lbnRTZWxlY3RvciIsIkFkbWluQnV0dG9uIiwib25jbGljayIsImJ1dHRvbkNsaWNrZWQiLCJpZCIsIkFkbWluVGFibGUiLCJyb3dFbGVtZW50cyIsImhlYWRlcnMiLCJlbGVtZW50cyIsImluZGljaWVzIiwidGFibGVEYXRhIiwib25saXN0IiwibGlzdHVybCIsImNoZWNrYm94Iiwic2luZ2xlY2xpY2tlZGl0Iiwib25zZWxlY3RlZHJvdyIsImRhdGFUYWJsZSIsImlzTGlzdFJlZnJlc2hpbmciLCJhZGRIZWFkZXIiLCJ0YWJsZUZpZWxkRWxlbWVudCIsImhlYWRlciIsImdldEVsZW1lbnRzQnlUYWdOYW1lIiwiYWRkSGVhZGVyRGF0YU9ubHkiLCJ0YWJsZUZpZWxkIiwiZmllbGROYW1lIiwic2VsZWN0Um93Iiwicm93SW5kZXgiLCJyb3dzIiwicm93IiwiY2xhc3NMaXN0IiwiY29udGFpbnMiLCJyZW1vdmUiLCJhZGQiLCJIb3RTdGFxIiwicGFyc2VCb29sZWFuIiwiaXRlbSIsImRhdGEiLCJjaGVja2JveGVzIiwiY2hlY2tlZCIsImRhdGFJbmRleFN0ciIsInBhcmVudEVsZW1lbnQiLCJkYXRhSW5kZXgiLCJnZXRSb3ciLCJhZGRSb3ciLCJyb3dzRmllbGRzIiwia2V5UGFydHMiLCJ0ZW1wVmFsdWUiLCJyb3dPYmoiLCJvcmdGaWVsZCIsImRlZmF1bHRPdXRwdXQiLCJvbmlucHV0Iiwib25vdXRwdXQiLCJjbGVhclJvd3MiLCJjbGVhciIsImxpc3QiLCJzZWFyY2giLCJvZmZzZXQiLCJsaW1pdCIsInNlYXJjaFN0ciIsImluZm8iLCJwYWdlIiwic3RhcnQiLCJsaXN0VXJsIiwiZXJyb3IiLCJjb25zb2xlIiwidGJvZHkiLCJwYXJlbnROb2RlIiwiY2FsbGJhY2tPYmoiLCJkcmF3IiwicmVjb3Jkc1RvdGFsIiwicmVjb3Jkc0ZpbHRlcmVkIiwiQXJyYXkiLCJzYW5pdGl6ZSIsImhvdFNhbml0aXplIiwic2FuaXRpemVKU09OIiwiY29sdW1ucyIsImVhY2giLCJkYXRhVHlwZSIsImxhYmVsIiwiY3JlYXRlZENlbGwiLCJjZWxsIiwiX2NlbGxEYXRhIiwiX3Jvd0RhdGEiLCJfcm93SWR4IiwiX2NvbElkeCIsInNldEF0dHJpYnV0ZSIsInByb2Nlc3NpbmciLCJzZXJ2ZXJTaWRlIiwiY29sUmVvcmRlciIsInNjcm9sbGVyIiwic2VsZWN0IiwiZG9tIiwiYWpheCIsImNhbGxiYWNrIiwic2V0dGluZ3MiLCJBZG1pblRleHQiLCJub19vdXRwdXQiLCJmaWVsZF90eXBlIiwiaHRtbFR5cGUiLCJBZG1pblRhYmxlRmllbGQiLCJwbGFjZUhlcmVQYXJlbnQiLCJBZG1pblRhYmxlUm93IiwiZWxlbWVudCIsInJvd0h0bWwiLCJmaWVsZE9iaiIsIkFkbWluRGFzaGJvYXJkIiwiYmFzZSIsImJhc2VVcmwiLCJfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18iLCJfX3dlYnBhY2tfcmVxdWlyZV9fIiwibW9kdWxlSWQiLCJjYWNoZWRNb2R1bGUiLCJ1bmRlZmluZWQiLCJfX3dlYnBhY2tfbW9kdWxlc19fIl0sInNvdXJjZVJvb3QiOiIifQ==
1
+ var AdminPanelComponentsWeb;(()=>{"use strict";var t={41:t=>{t.exports=DataTable},79:t=>{t.exports=HotStaqWeb},91:function(t,e,n){var i=this&&this.__awaiter||function(t,e,n,i){return new(n||(n=Promise))((function(l,s){function a(t){try{d(i.next(t))}catch(t){s(t)}}function o(t){try{d(i.throw(t))}catch(t){s(t)}}function d(t){var e;t.done?l(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(a,o)}d((i=i.apply(t,e||[])).next())}))};Object.defineProperty(e,"__esModule",{value:!0}),e.AdminDropdown=void 0;const l=n(79);class s extends l.HotComponent{constructor(t,e){super(t,e),this.tag="admin-dropdown",this.placeholder="Search",this.onsearch=null,this.onselect=null}onPostPlace(t,e){let n=t.querySelectorAll('hot-place-here[type="modal"]');if(n.length>0){let i=n[0];t.removeChild(e),i.appendChild(e)}return null!=this.onsearch&&("string"==typeof this.onsearch&&(this.onsearch=new Function(this.onsearch)),e.querySelector("input").addEventListener("keyup",(t=>i(this,void 0,void 0,(function*(){const e=t.currentTarget.value;let n=yield this.onsearch(e,t),i=$(this.htmlElements[1]).find(".searchResults");i.empty();for(let t=0;t<n.length;t++){const e=n[t];let l=e.url,s=e.value,a=e.text;const o=$('<li><a class="dropdown-item" href="" data-value="" onclick=""></a></li>'),d=o.find("a");d.attr("href",l),d.attr("data-value",s),d.text(a),d.removeAttr("onclick").on("click",(()=>{this.selected(t)})),i.append(o)}}))))),null}selected(t){return i(this,void 0,void 0,(function*(){if(null!=this.onselect){"string"==typeof this.onselect&&(this.onselect=new Function(this.onselect));const e=this.htmlElements[1].querySelectorAll("a")[t].getAttribute("href"),n=this.htmlElements[1].querySelectorAll("a")[t].getAttribute("data-value"),i=this.htmlElements[1].querySelectorAll("a")[t].innerHTML;yield this.onselect(e,n,i)}}))}output(){return`<div class="dropdown">\n\t\t<button class="btn btn-primary dropdown-toggle" type="button" data-bs-toggle="dropdown" aria-expanded="false">\n\t\t ${this.inner}\n\t\t</button>\n\t\t<ul class="dropdown-menu">\n\t\t\t<li>\n\t\t\t\t<div class = "input-group">\n\t\t\t\t\t<input type = "text" class = "form-control" placeholder = "${this.placeholder}" value = "" />\n\t\t\t\t</div>\n\t\t\t</li>\n\t\t\t<div class = "searchResults">\n\t\t\t</div>\n\t\t</ul>\n\t</div>`}}e.AdminDropdown=s},272:(t,e,n)=>{Object.defineProperty(e,"__esModule",{value:!0}),e.AdminEyebrowHeading=void 0;const i=n(79);class l extends i.HotComponent{constructor(t,e){super(t,e),this.tag="admin-eyebrow-heading",this.eyebrow="",this.heading="",this.subtitle="",this.align="start"}output(){const t="center"===this.align?"text-center":"",e=this.eyebrow?`<div class="text-uppercase text-muted small mb-2" style="letter-spacing:0.08em;">${this.eyebrow}</div>`:"",n=this.subtitle?`<p class="text-muted mb-0">${this.subtitle}</p>`:"";return`\n\t\t\t<div class="fl-eyebrow-heading mb-3 ${t}">\n\t\t\t\t${e}\n\t\t\t\t<h1 class="h3 mb-1">${this.heading||this.inner||""}</h1>\n\t\t\t\t${n}\n\t\t\t</div>`}}e.AdminEyebrowHeading=l},357:function(t,e,n){var i=this&&this.__awaiter||function(t,e,n,i){return new(n||(n=Promise))((function(l,s){function a(t){try{d(i.next(t))}catch(t){s(t)}}function o(t){try{d(i.throw(t))}catch(t){s(t)}}function d(t){var e;t.done?l(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(a,o)}d((i=i.apply(t,e||[])).next())}))};Object.defineProperty(e,"__esModule",{value:!0}),e.AdminCardTable=void 0;const l=n(79);class s extends l.HotComponent{constructor(t,e){super(t,e),this.tag="admin-card-table",this.title="",this.list_url="",this.jwt="",this.list_params="{}",this.primary_field="name",this.subline_field="",this.detail_route="",this.empty_text="No items yet.",this.loading_text="Loading…",this.row_actions="",this.add_slot=""}onPostPlace(t,e){const n=this,i=document.getElementById(this.name);return null==i||(i.refreshList=function(){return n.fetchAndRender()},n.fetchAndRender()),null}fetchAndRender(){return i(this,void 0,void 0,(function*(){const t=document.getElementById(this.name),e=t?t.querySelector(".fl-card-list"):null;if(null!=e)try{let t={};try{t=JSON.parse(this.list_params||"{}")}catch(e){t={}}const n={"Content-Type":"application/json"};this.jwt&&(n.Authorization="Bearer "+this.jwt);const i=yield fetch(this.list_url,{method:"POST",headers:n,body:JSON.stringify(t)});if(!i.ok)return void(e.innerHTML=`<div class="text-danger small p-3">Could not load: HTTP ${i.status}</div>`);const l=yield i.json(),s=l&&Array.isArray(l.data)?l.data:Array.isArray(l)?l:[];if(0===s.length)return void(e.innerHTML=`<div class="text-muted small text-center py-4">${this.empty_text}</div>`);e.innerHTML=s.map((t=>this.renderRow(t))).join("")}catch(t){e.innerHTML=`<div class="text-danger small p-3">Could not load: ${t.message}</div>`}}))}escapeHtml(t){return String(null==t?"":t).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}interpolate(t,e){return t?t.replace(/:(\w+)/g,((t,n)=>this.escapeHtml(e[n]||""))):""}renderRow(t){const e=t[this.primary_field],n=this.escapeHtml(null!=e&&""!==e?e:t.id||""),i=this.subline_field?t[this.subline_field]:"",l=`\n\t\t\t<div class="fl-card-row-main">\n\t\t\t\t<div class="fl-card-row-label">${n}</div>\n\t\t\t\t${i?`<div class="fl-card-row-sub text-muted small">${this.escapeHtml(i)}</div>`:""}\n\t\t\t</div>\n\t\t\t<div class="fl-card-row-actions">${this.interpolate(this.row_actions,t)}</div>`;return this.detail_route?`<a href="${this.interpolate(this.detail_route,t)}" class="fl-card-row fl-card-row-link list-group-item list-group-item-action">${l}</a>`:`<div class="fl-card-row list-group-item">${l}</div>`}output(){if(""===this.name)throw new Error("admin-card-table: id (name) is required");if(""===this.list_url)throw new Error("admin-card-table: hot-list-url is required");const t=this.title?`<strong>${this.title}</strong>`:"",e=this.add_slot?` data-card-table-add-slot="${this.add_slot}"`:` data-card-table-add-slot="${this.name}"`;return`\n\t\t\t<div id="${this.name}" class="card fl-card-table mb-4">\n\t\t\t\t<div class="card-header d-flex justify-content-between align-items-center">\n\t\t\t\t\t${t}\n\t\t\t\t\t<div class="fl-card-table-actions"${e}></div>\n\t\t\t\t</div>\n\t\t\t\t<div class="fl-card-list list-group list-group-flush">\n\t\t\t\t\t<div class="text-muted small text-center py-4">${this.loading_text}</div>\n\t\t\t\t</div>\n\t\t\t</div>`}}e.AdminCardTable=s},383:t=>{t.exports=bootstrap},494:function(t,e,n){var i=this&&this.__awaiter||function(t,e,n,i){return new(n||(n=Promise))((function(l,s){function a(t){try{d(i.next(t))}catch(t){s(t)}}function o(t){try{d(i.throw(t))}catch(t){s(t)}}function d(t){var e;t.done?l(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(a,o)}d((i=i.apply(t,e||[])).next())}))},l=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.AdminEdit=void 0;const s=n(79),a=l(n(383));class o extends s.HotComponent{constructor(t,e){super(t,e),this.onAddClicked=null,this.onEditClicked=null,this.onRemoveClicked=null,this.tag="admin-edit",this.title="",this.button_title="Save",this.attached_list="",this.schema="",this.modalId="",this.add_text="Add",this.add_place_here="dashboardHeader",this.edit_text="Edit",this.edit_place_here="dashboardHeader",this.remove_text="Remove",this.remove_place_here="dashboardHeader",this.css_class="",this.modal=null,this.modalType="add",this.closeOnSave=!0,this.selectedFields=[],this.onsave=null,this.onedit=null,this.ondelete=null}processHotFields(t){return i(this,void 0,void 0,(function*(){const e=this.htmlElements[1].querySelectorAll("[hot-field]");for(let n=0;n<e.length;n++){const i=e[n],l=$(i).attr("hot-field");let s=$(i).attr("hot-field-type"),a=$(i).attr("hot-field-input");null!=s&&""!==s||(s="text"),i.fieldType=s,yield t(i,{name:l,type:s,input:a})}}))}addClicked(){return i(this,arguments,void 0,(function*(t=[]){if(null==this.onAddClicked||!1!==(yield this.onAddClicked())){if(this.modalType="add",yield this.processHotFields(((t,e)=>i(this,void 0,void 0,(function*(){$(t).val("")})))),this.selectedFields=t,null!=this.onadd){"string"==typeof this.onadd&&(this.onadd=new Function(this.onadd));let t=yield this.onadd(this.modalType,this.selectedFields);if(null!=t&&!1===t)return}a.default.Modal.getInstance(`#${this.modalId}`).show()}}))}getAttachedHTMLLists(){const t=this.attached_list.split(","),e=[];for(let n=0;n<t.length;n++){const i=t[n];let l=document.getElementById(i);e.push(l)}return e}getAttachedLists(){const t=this.getAttachedHTMLLists();let e=[];for(let n=0;n<t.length;n++){const i=t[n].hotComponent;e.push(i)}return e}editClicked(){return i(this,arguments,void 0,(function*(t=null,e=[]){if(null==this.onEditClicked||!1!==(yield this.onEditClicked(t,e))){if(this.modalType="edit",this.selectedFields=e,""!==this.attached_list){const e=this.getAttachedLists();for(let n=0;n<e.length;n++){let l=e[n];if(null!=t&&l.name!==t)continue;l.attachedEdit=this;let s=l.getSelected();null!=s&&(yield this.processHotFields(((t,e)=>i(this,void 0,void 0,(function*(){let n=s[e.name];if(null!=e.input&&""!==e.input){let i=new Function(e.input);n=yield i.call(this,this,t,n)}null!=n&&$(t).val(n)})))),this.selectedFields=[s])}}if(null!=this.onedit){"string"==typeof this.onedit&&(this.onedit=new Function(this.onedit));let t=yield this.onedit(this.modalType,this.selectedFields);if(null!=t&&!1===t)return}a.default.Modal.getInstance(`#${this.modalId}`).show()}}))}removeClicked(){return i(this,void 0,void 0,(function*(){if(null!=this.onRemoveClicked&&!1===(yield this.onRemoveClicked()))return;this.modalType="remove";let t=[],e=null;if(""!==this.attached_list){const n=this.getAttachedLists();for(let i=0;i<n.length;i++){e=n[i],e.attachedEdit=this;let l=e.getCheckedRows();if(l.length>0)for(let e=0;e<l.length;e++){let n=l[e];t.push(n)}let s=e.getSelected();null!=s&&(t=[s])}}if(!0===confirm("Are you sure you want to remove this item?")){for(let n=0;n<t.length;n++){let i=t[n];if(null!=e)for(let t in i){let n=e.getFieldType(t);null!=n&&"remove"===n&&delete i[t]}if(null!=this.ondelete)"string"==typeof this.ondelete&&(this.ondelete=new Function(this.ondelete)),yield this.ondelete(i);else{let t=s.Hot.Data.AdminPanel.removeUrl;yield s.Hot.jsonRequest(t,{schema:this.schema,whereFields:i})}}if(0===t.length)if(null!=this.ondelete)"string"==typeof this.ondelete&&(this.ondelete=new Function(this.ondelete)),yield this.ondelete(null);else{let t=s.Hot.Data.AdminPanel.removeUrl;yield s.Hot.jsonRequest(t,{schema:this.schema,whereFields:null})}if(null!=e){const t=yield e.refreshList(),n=e.prepareData(t);e.tableCallback(n)}}}))}onSave(){return i(this,void 0,void 0,(function*(){let t={};if(yield this.processHotFields(((e,n)=>i(this,void 0,void 0,(function*(){if("remove"===n.type)return;let i=$(e).val();if(null!=$(e).attr("hot-value")&&(i=$(e).attr("hot-value")),null!=$(e).attr("hot-field-save")){let t=$(e).attr("hot-field-save");if(null!=t&&""!==t){let n=new Function(t);i=yield n.call(this,this,e,i)}}if("array"===n.type)return null==t[n.name]&&(t[n.name]=[]),void t[n.name].push(i);if("number"===n.type&&(i=parseFloat(i)),"integer"===n.type&&(i=parseInt(i)),"bool"===n.type||"boolean"===n.type){const t=i.toLowerCase();i=!1,"1"!=t&&"true"!=t&&"yes"!=t||(i=!0)}t[n.name]=i})))),null!=this.onsave){if("string"==typeof this.onsave&&(this.onsave=new Function(this.onsave)),!1===(yield this.onsave(this.modalType,t,this.selectedFields)))return}else{if("add"===this.modalType){let e=s.Hot.Data.AdminPanel.addUrl;yield s.Hot.jsonRequest(e,{schema:this.schema,fields:t})}if("edit"===this.modalType){if(0===this.selectedFields.length)return void alert("No item(s) selected!");let e={};yield this.processHotFields(((t,n)=>i(this,void 0,void 0,(function*(){if("remove"===n.type)return;let i=$(t).val();if(null!=$(t).attr("hot-value")&&(i=$(t).attr("hot-value")),"array"===n.type)return null==e[n.name]&&(e[n.name]=[]),void e[n.name].push(i);e[n.name]=i}))));let n=s.Hot.Data.AdminPanel.editUrl;yield s.Hot.jsonRequest(n,{schema:this.schema,whereFields:e,fields:t})}}if(""!==this.attached_list){const t=this.getAttachedLists();for(let e=0;e<t.length;e++){let n=t[e];n.attachedEdit=this;const i=yield n.refreshList(),l=n.prepareData(i);n.tableCallback(l)}}!0===this.closeOnSave&&a.default.Modal.getInstance(`#${this.modalId}`).hide()}))}onPostPlace(t,e){return this.modal=new a.default.Modal($(`#${this.modalId}`)[0],{backdrop:!0,keyboard:!0,focus:!0}),setTimeout((()=>{if(""!==this.attached_list){const t=this.getAttachedLists();for(let e=0;e<t.length;e++){let n=t[e];null!=n&&(n.attachedEdit=this)}}}),50),null}output(){if(""===this.name)throw new Error("You must specify a name for each admin-edit element!");this.modalId=`${this.name}Modal`;let t=[{html:`\n\t\t\t\x3c!-- ${this.title} Modal Start --\x3e\n\t\t\t<div class="modal fade ${this.css_class}" id="${this.modalId}" tabindex="-1" aria-labelledby="${this.name}ModalLabel" aria-hidden="true">\n\t\t\t\t<div class="modal-dialog">\n\t\t\t\t\t<div class="modal-content">\n\t\t\t\t\t<div class="modal-header">\n\t\t\t\t\t\t<h5 class="modal-title" id="${this.name}ModalLabel">${this.title}</h5>\n\t\t\t\t\t\t<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class="modal-body">\n\t\t\t\t\t\t<hot-place-here name = "modalBody" type = "modal"></hot-place-here>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class="modal-footer">\n\t\t\t\t\t\t<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Cancel</button>\n\t\t\t\t\t\t<button type="button" class="btn btn-primary" onclick = "document.getElementById('${this.modalId}').onSave ();">${this.button_title}</button>\n\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t\x3c!-- ${this.title} Modal End --\x3e`,documentSelector:"body"}];return""!==this.add_place_here&&t.push({html:`<button id = "${this.modalId}-add-btn" type="button" class="btn btn-sm btn-outline-secondary" onclick = "this.addClicked ();">${this.add_text}</button>`,documentSelector:`hot-place-here[name="${this.add_place_here}"]`}),""!==this.edit_place_here&&t.push({html:`<button id = "${this.modalId}-edit-btn" type="button" class="btn btn-sm btn-outline-secondary" onclick = "this.editClicked ('${this.modalId}');">${this.edit_text}</button>`,documentSelector:`hot-place-here[name="${this.edit_place_here}"]`}),""!==this.remove_place_here&&t.push({html:`<button id = "${this.modalId}-remove-btn" type="button" class="btn btn-sm btn-outline-secondary" onclick = "this.removeClicked ();">${this.remove_text}</button>`,documentSelector:`hot-place-here[name="${this.remove_place_here}"]`}),t}}e.AdminEdit=o},551:function(t,e,n){var i=this&&this.__awaiter||function(t,e,n,i){return new(n||(n=Promise))((function(l,s){function a(t){try{d(i.next(t))}catch(t){s(t)}}function o(t){try{d(i.throw(t))}catch(t){s(t)}}function d(t){var e;t.done?l(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(a,o)}d((i=i.apply(t,e||[])).next())}))};Object.defineProperty(e,"__esModule",{value:!0}),e.AdminDetailPage=void 0;const l=n(79);class s extends l.HotComponent{constructor(t,e){super(t,e),this.tag="admin-detail-page",this.title="",this.back_url="/",this.back_text="← Back",this.get_url="",this.save_url="",this.delete_url="",this.payload_key="",this.jwt="",this.id_param="id",this.save_text="Save",this.delete_text="Delete",this.delete_confirm="Are you sure you want to delete this?"}onPostPlace(t,e){const n=this,i=document.getElementById(this.name);if(null==i)return null;const l=n.readIdFromUrl();if(!l)return n.showError(i,"No id provided in the URL."),null;const s=i.querySelector(".fl-detail-save"),a=i.querySelector(".fl-detail-delete");return null!=s&&s.addEventListener("click",(t=>{t.preventDefault(),n.handleSave(i,l)})),null!=a&&a.addEventListener("click",(t=>{t.preventDefault(),n.handleDelete(l)})),n.fetchAndFill(i,l),null}readIdFromUrl(){return new URLSearchParams(window.location.search).get(this.id_param)||""}showError(t,e){const n=t.querySelector(".fl-detail-feedback");n&&(n.className="fl-detail-feedback alert alert-danger",n.textContent=e)}showSuccess(t,e){const n=t.querySelector(".fl-detail-feedback");n&&(n.className="fl-detail-feedback alert alert-success",n.textContent=e,setTimeout((()=>{n.className="fl-detail-feedback d-none",n.textContent=""}),2500))}fetchAndFill(t,e){return i(this,void 0,void 0,(function*(){try{const n={"Content-Type":"application/json"};this.jwt&&(n.Authorization="Bearer "+this.jwt);const i=yield fetch(this.get_url,{method:"POST",headers:n,body:JSON.stringify({id:e})});if(!i.ok)return void this.showError(t,"Could not load: HTTP "+i.status);const l=yield i.json();if(null==l)return void this.showError(t,"Record not found.");this.populateFields(t,l)}catch(e){this.showError(t,"Could not load: "+e.message)}}))}populateFields(t,e){const n=t.querySelectorAll("[hot-field]");for(let t=0;t<n.length;t++){const i=n[t],l=i.getAttribute("hot-field");if(null==l||""===l)continue;const s=e[l];null!=s&&(i instanceof HTMLInputElement&&"checkbox"===i.type?i.checked=!0===s||"true"===s||1===s:i.value=String(s))}}collectValues(t){const e={},n=t.querySelectorAll("[hot-field]");for(let t=0;t<n.length;t++){const i=n[t],l=i.getAttribute("hot-field");null!=l&&""!==l&&(i instanceof HTMLInputElement&&"checkbox"===i.type?e[l]=i.checked:i instanceof HTMLInputElement&&"number"===i.type?e[l]=""===i.value?null:Number(i.value):e[l]=i.value)}return e}handleSave(t,e){return i(this,void 0,void 0,(function*(){const n=this.collectValues(t);n.id=e;const i=this.payload_key?{[this.payload_key]:n}:n,l=t.querySelector(".fl-detail-save");l&&(l.disabled=!0);try{const e={"Content-Type":"application/json"};this.jwt&&(e.Authorization="Bearer "+this.jwt);const n=yield fetch(this.save_url,{method:"POST",headers:e,body:JSON.stringify(i)});if(!n.ok){let e="HTTP "+n.status;try{const t=yield n.json();t&&t.error&&(e=t.error)}catch(t){}return void this.showError(t,"Save failed: "+e)}this.showSuccess(t,"Saved.")}catch(e){this.showError(t,"Save failed: "+e.message)}finally{l&&(l.disabled=!1)}}))}handleDelete(t){return i(this,void 0,void 0,(function*(){if(window.confirm(this.delete_confirm))try{const e={"Content-Type":"application/json"};this.jwt&&(e.Authorization="Bearer "+this.jwt);const n=yield fetch(this.delete_url,{method:"POST",headers:e,body:JSON.stringify({id:t})});if(!n.ok)return void alert("Delete failed: HTTP "+n.status);window.location.href=this.back_url}catch(t){alert("Delete failed: "+t.message)}}))}output(){if(""===this.name)throw new Error("admin-detail-page: id (name) is required");if(""===this.get_url||""===this.save_url)throw new Error("admin-detail-page: hot-get-url and hot-save-url are required");const t=this.delete_url?`<button type="button" class="btn btn-outline-danger fl-detail-delete">${this.delete_text}</button>`:"";return`\n\t\t\t<div id="${this.name}" class="fl-detail-page">\n\t\t\t\t<div class="container" style="max-width:880px;padding:1.5rem 1rem 7rem;">\n\t\t\t\t\t<div class="mb-3"><a href="${this.back_url}" class="text-muted small text-decoration-none">${this.back_text}</a></div>\n\t\t\t\t\t<h1 class="h3 mb-3">${this.title}</h1>\n\t\t\t\t\t<div class="fl-detail-feedback d-none"></div>\n\t\t\t\t\t<div class="card mb-3"><div class="card-body">\n\t\t\t\t\t\t<div class="row g-3">\n\t\t\t\t\t\t\t<hot-place-here name="detailBody"></hot-place-here>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div></div>\n\t\t\t\t</div>\n\t\t\t\t<div class="fl-detail-save-bar">\n\t\t\t\t\t<div class="container d-flex justify-content-between align-items-center" style="max-width:880px;">\n\t\t\t\t\t\t${t}\n\t\t\t\t\t\t<button type="button" class="btn btn-primary fl-detail-save ms-auto">${this.save_text}</button>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>`}}e.AdminDetailPage=s},594:function(t,e,n){var i=this&&this.__awaiter||function(t,e,n,i){return new(n||(n=Promise))((function(l,s){function a(t){try{d(i.next(t))}catch(t){s(t)}}function o(t){try{d(i.throw(t))}catch(t){s(t)}}function d(t){var e;t.done?l(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(a,o)}d((i=i.apply(t,e||[])).next())}))};Object.defineProperty(e,"__esModule",{value:!0}),e.AdminButton=void 0;const l=n(79);class s extends l.HotComponent{constructor(t,e){super(t,e),this.tag="admin-button",this.css_class="btn btn-sm btn-outline-secondary",this.onclick=null}buttonClicked(){return i(this,void 0,void 0,(function*(){}))}onPostPlace(t,e){let n=t.querySelectorAll('hot-place-here[type="modal"]');if(n.length>0){let i=n[0];t.removeChild(e),i.appendChild(e)}return null!=this.onclick&&("string"==typeof this.onclick&&(this.onclick=new Function(this.onclick)),e.addEventListener("click",this.onclick)),null}output(){return`<button id = "${this.htmlElements[0].id}" class = "${this.css_class}" onclick = "this.buttonClicked ();">${this.inner}</button>`}}e.AdminButton=s},620:function(t,e,n){var i=this&&this.__awaiter||function(t,e,n,i){return new(n||(n=Promise))((function(l,s){function a(t){try{d(i.next(t))}catch(t){s(t)}}function o(t){try{d(i.throw(t))}catch(t){s(t)}}function d(t){var e;t.done?l(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(a,o)}d((i=i.apply(t,e||[])).next())}))},l=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.AdminTable=void 0;const s=n(79),a=l(n(41));class o extends s.HotComponent{constructor(t,e){super(t,e),this.rowElements=[],this.tag="admin-table",this.title="",this.schema="",this.headers={fields:{},elements:{},indicies:[]},this.rowElements=[],this.tableCallback=null,this.tableData=null,this.onlist=null,this.listurl="",this.checkbox=!0,this.singleclickedit=!1,this.onselectedrow=null,this.attachedEdit=null,this.selected=-1,this.dataTable=null,this.isListRefreshing=!1}addHeader(t){let e=this.htmlElements[0].getElementsByTagName("thead")[0];this.headers.indicies.length<1&&this.headers.indicies.push(null),this.headers.indicies.push(t.hotComponent.field),e.appendChild(t)}addHeaderDataOnly(t,e){this.headers.indicies.length<1&&this.headers.indicies.push(null),this.headers.indicies.push(t.field),this.headers.fields[t.field]=t,this.headers.elements[t.field]=e}getFieldType(t){if(null!=this.headers.elements[t]){let e=this.headers.elements[t].hotComponent;if(null!=e)return e.field_type}return null}selectRow(t,e){return i(this,void 0,void 0,(function*(){{let e=this.htmlElements[1].getElementsByTagName("tbody")[0].getElementsByTagName("tr");for(let t=0;t<e.length;t++){let n=e[t];!0===n.classList.contains("table-primary")&&n.classList.remove("table-primary")}t.classList.add("table-primary")}if(this.selected=e,"string"==typeof this.singleclickedit&&(this.singleclickedit=s.HotStaq.parseBoolean(this.singleclickedit)),!0===this.singleclickedit&&null!=this.attachedEdit&&(yield this.attachedEdit.editClicked(this.name)),null!=this.onselectedrow){"string"==typeof this.onselectedrow&&(this.onselectedrow=new Function(this.onselectedrow));let t=this.getSelected();if(null==t)return;if(!1===(yield this.onselectedrow(e,t)))return}}))}getSelected(){let t=this.selected;return t<0?null:this.dataTable.row(t).data()}getCheckedRows(){let t=[],e=this.htmlElements[1].getElementsByTagName("tbody")[0].getElementsByTagName("input");for(let n=0;n<e.length;n++){let i=e[n];if(null!=i.checked&&!0===i.checked){let e=i.parentElement.parentElement.getAttribute("data-index"),n=parseInt(e);t.push(this.rowElements[n].fields)}}return t}getRow(t){return this.rowElements[t].fields}addRow(t){if(null==t)return;if(0==t.length)return;this.htmlElements[1].getElementsByTagName("tbody")[0];let e=this.rowElements.length;"string"==typeof this.checkbox&&(this.checkbox=s.HotStaq.parseBoolean(this.checkbox));let n=[];for(let i=0;i<this.headers.indicies.length;i++){let l=this.headers.indicies[i];if(null==l)continue;let s=t[l],a=l.split(".");if(a.length>1){let e=t[a[0]];for(let t=1;t<a.length;t++)e=e[a[t]];s=e}let o=null;if(null!=this.headers.elements[l]){let t=this.getFieldType(l);if(null==t&&(t="text"),"remove"!==t){const t=this.headers.fields[l];let n=!0;null!=t&&(null!=t.oninput&&("string"==typeof t.oninput&&(this.headers.fields[l].oninput=new Function(t.oninput)),s=t.oninput(s)),null!=t.onoutput)&&("string"==typeof t.onoutput&&(this.headers.fields[l].onoutput=new Function(t.onoutput)),n=!1,o={index:e,value:t.onoutput(e,s)}),!0===n&&(o=s)}}n.push(o)}null==this.rows&&(this.rows=[])}clearRows(){return i(this,void 0,void 0,(function*(){this.rowElements=[],null!=this.dataTable&&this.dataTable.clear()}))}refreshList(){return i(this,arguments,void 0,(function*(t=null){this.isListRefreshing=!0;let e={search:"",offset:0,limit:10};if(null!=this.dataTable){const t=this.dataTable.search(),n=this.dataTable.page.info();e={search:t||"",offset:n.start||0,limit:n.length||10}}if(null!=this.onlist)"string"==typeof this.onlist&&(this.onlist=new Function(this.onlist)),t=yield this.onlist(e);else{let n="";""!==this.listurl&&(n=this.listurl),""!==n&&(t=yield s.Hot.jsonRequest(n,{schema:this.schema,search:e}))}if(this.clearRows(),null!=t){if(null!=t.error)return console.error(`List error: ${t.error}`),this.isListRefreshing=!1,null;if(null==t.data)throw new Error(`Returning list data to "${this.name}" component has a null data field. API response does not match the "IAPIResponse" schema.`);for(let e=0;e<t.data.length;e++){let n=t.data[e];for(let i in n){let l=n[i],s=this.getFieldType(i);if(null==s&&(s="text"),"remove"!==s){const n=this.headers.fields[i];let s=!0;null!=n&&(null!=n.oninput&&("string"==typeof n.oninput&&(this.headers.fields[i].oninput=new Function(n.oninput)),l=n.oninput(l)),null!=n.onoutput)&&("string"==typeof n.onoutput&&(this.headers.fields[i].onoutput=new Function(n.onoutput)),s=!1,l=n.onoutput(e,l)),t.data[e][i]=l}}}}let n=this.htmlElements[1].getElementsByTagName("tbody")[0];return n.hotComponent=this,$(n).on("click","tr",(function(){const t=this.parentNode.hotComponent,e=t.dataTable.row(this).index();null!=e?t.selectRow(this,e):null!=t.attachedEdit&&null!=t.attachedEdit.addClicked&&t.attachedEdit.addClicked()})),this.isListRefreshing=!1,t}))}prepareData(t){const e={draw:this.tableData,data:[],recordsTotal:0,recordsFiltered:0};if(null!=t){t instanceof Array?(e.data=t,e.recordsTotal=t.length,e.recordsFiltered=t.length):(null!=t.length&&(e.recordsTotal=t.length,e.recordsFiltered=t.length),null!=t.data&&(e.data=t.data));let n=!0;null!=e.data.hotSanitize&&(n=e.data.hotSanitize);for(let t=0;t<e.data.length;t++){const i=e.data[t];e.data[t]=!0===n?s.HotStaq.sanitizeJSON(i):i}}return e}onPostPlace(t,e){return setTimeout((()=>i(this,void 0,void 0,(function*(){const t=$(e).find("table");let n=[];$(t).find("thead th").each((function(){const t=$(this).text(),e=$(this).data("field");let i=$(this).data("field-type");if(null==t||""===t)return;if(null==e||""===e)return;"text"===i&&(i="string");const l=t;n.push({title:t,data:e,createdCell:function(t,e,n,i,s){t.setAttribute("data-label",l)}})})),$(t).find("thead").remove(),this.dataTable=new a.default(t[0],{processing:!0,serverSide:!0,colReorder:!0,scroller:!0,select:!0,dom:"Qlfrtip",columns:n,data:[],ajax:(t,e,n)=>i(this,void 0,void 0,(function*(){if(!0===this.isListRefreshing)return;this.tableCallback=e,this.tableData=t.draw;let n=yield this.refreshList();const i=this.prepareData(n);this.tableCallback(i)}))})}))),50),null}output(){return`\n\t\t<div id = "${this.htmlElements[0].id}">\n\t\t\t<h2>${this.title}</h2>\n\t\t\t<div class="table-responsive">\n\t\t\t<table id = "${this.htmlElements[0].id}Table" class="table table-striped table-sm">\n\t\t\t\t<thead>\n\t\t\t\t\t<tr hot-place-here = "header">\n\t\t\t\t\t\t<th></th>\n\t\t\t\t\t</tr>\n\t\t\t\t</thead>\n\t\t\t\t<tbody hot-place-here = "results">\n\t\t\t\t</tbody>\n\t\t\t</table>\n\t\t\t<hot-place-here name = "afterTable"></hot-place-here>\n\t\t\t</div>\n\t\t</div>`}}e.AdminTable=o},741:(t,e,n)=>{Object.defineProperty(e,"__esModule",{value:!0}),e.AdminText=void 0;const i=n(79);class l extends i.HotComponent{constructor(t,e){super(t,e),this.tag="admin-text",this.no_output="0",this.css_class="form-control"}onPostPlace(t,e){let n=t.querySelectorAll('hot-place-here[type="modal"]');if(n.length>0){let i=n[0];t.removeChild(e),i.appendChild(e)}return null}output(){let t="";if(null!=this.value&&(t=this.value),"1"===this.no_output)return`<div><input class="${this.css_class}" type = "hidden" value = "${t}" /></div>`;const e=this.htmlElements[0].getAttribute("hot-field");let n=this.htmlElements[0].getAttribute("hot-field-type"),i=this.htmlElements[0].getAttribute("type")||"text";return null==n&&(n="text"),`<div>\n\t\t\t<label class="form-label">${this.inner}</label>\n\t\t\t<input class="${this.css_class}" type = "${i}" hot-field = "${e}" hot-field-type = "${n}" value = "${t}" />\n\t\t</div>`}}e.AdminText=l},805:(t,e,n)=>{Object.defineProperty(e,"__esModule",{value:!0}),e.AdminDisclaimer=void 0;const i=n(79);class l extends i.HotComponent{constructor(t,e){super(t,e),this.tag="admin-disclaimer",this.heading="",this.accent="#4f46e5"}output(){const t=this.heading?`<h2 class="h6 mb-2" style="letter-spacing:0.02em;">${this.heading}</h2>`:"";return`\n\t\t\t<div class="card fl-disclaimer mb-3" style="border-left:4px solid ${this.accent};">\n\t\t\t\t<div class="card-body">\n\t\t\t\t\t${t}\n\t\t\t\t\t<div class="mb-0 text-muted" style="font-size:0.9rem;line-height:1.45;">\n\t\t\t\t\t\t${this.inner||""}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>`}}e.AdminDisclaimer=l},837:(t,e,n)=>{Object.defineProperty(e,"__esModule",{value:!0}),e.AdminTableField=void 0;const i=n(79);class l extends i.HotComponent{constructor(t,e){super(t,e),this.tag="admin-table-field",this.field=0,this.field_type="text",this.no_output="0",this.oninput=null,this.onoutput=null}onPostPlace(t,e){let n=null;return n=null!=t.parentNode.parentNode.hotComponent?t.parentNode.parentNode.hotComponent:t.parentNode.parentNode.parentNode.parentNode.hotComponent,null!=n&&n.addHeaderDataOnly(this,e),null}output(){return"1"===this.no_output?[{html:"<div></div>",placeHereParent:"afterTable"}]:[{html:`<th data-field = "${this.field}" data-field-type = "${this.field_type}">${this.inner}</th>`,placeHereParent:"header"}]}}e.AdminTableField=l},877:(t,e,n)=>{Object.defineProperty(e,"__esModule",{value:!0}),e.AdminTableRow=void 0;const i=n(79);class l extends i.HotComponent{constructor(t,e){super(t,e),this.tag="admin-table-row",this.fields=[]}onPostPlace(t,e){return t.parentNode.parentNode.parentNode.hotComponent.rowElements.push({fields:this.fields,element:e}),null}output(){let t="";this.fields.length>0&&(t+='<td><input type = "checkbox" /></td>');for(let e=0;e<this.fields.length;e++){let n=this.fields[e];for(let e in n)t+=`<td>${n[e]}</td>`}return[{html:`<tr>${t}</tr>`,placeHereParent:"results"}]}}e.AdminTableRow=l},924:(t,e,n)=>{Object.defineProperty(e,"__esModule",{value:!0}),e.AdminDashboard=void 0;const i=n(79);class l extends i.HotComponent{constructor(t,e){super(t,e),this.tag="admin-dashboard",this.title="",this.base=""}onPostPlace(t,e){return null==i.Hot.Data.AdminPanel&&(i.Hot.Data.AdminPanel={}),null==i.Hot.Data.AdminPanel.baseUrl&&(i.Hot.Data.AdminPanel.baseUrl=this.base),null==i.Hot.Data.AdminPanel.addUrl&&(i.Hot.Data.AdminPanel.addUrl=`${i.Hot.Data.AdminPanel.baseUrl}/v1/data/add`),null==i.Hot.Data.AdminPanel.editUrl&&(i.Hot.Data.AdminPanel.editUrl=`${i.Hot.Data.AdminPanel.baseUrl}/v1/data/edit`),null==i.Hot.Data.AdminPanel.removeUrl&&(i.Hot.Data.AdminPanel.removeUrl=`${i.Hot.Data.AdminPanel.baseUrl}/v1/data/remove`),null==i.Hot.Data.AdminPanel.listUrl&&(i.Hot.Data.AdminPanel.listUrl=`${i.Hot.Data.AdminPanel.baseUrl}/v1/data/list`),null}output(){return`\n\t\t<main class="col-md-9 ms-sm-auto col-lg-10 px-md-4">\n\t\t\t<div class="d-flex justify-content-between flex-wrap flex-md-nowrap align-items-center pt-3 pb-2 mb-3 border-bottom">\n\t\t\t\t<h1 class="h2">${this.title}</h1>\n\t\t\t\t<div class="btn-toolbar mb-2 mb-md-0">\n\t\t\t\t\t<div class="btn-group me-2">\n\t\t\t\t\t\t<hot-place-here name = "dashboardHeader"></hot-place-here>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<hot-place-here name = "body"></hot-place-here>\n\t\t</main>`}}e.AdminDashboard=l},937:(t,e,n)=>{Object.defineProperty(e,"__esModule",{value:!0}),e.AdminFormField=void 0;const i=n(79);class l extends i.HotComponent{constructor(t,e){super(t,e),this.tag="admin-form-field",this.field="",this.label="",this.required="0",this.type="text",this.control="input",this.placeholder="",this.autocomplete="",this.help="",this.options="",this.rows="3",this.min="",this.step="",this.maxlength="",this.col="",this.size="sm",this.css_class=""}onPostPlace(t,e){return null}renderInput(t,e,n){const i=this.min?` min="${this.min}"`:"",l=this.step?` step="${this.step}"`:"",s=this.maxlength?` maxlength="${this.maxlength}"`:"",a=this.autocomplete?` autocomplete="${this.autocomplete}"`:"",o="date"===this.type||""===this.placeholder?"":` placeholder="${this.placeholder.replace(/"/g,"&quot;")}"`;return`<input id="${t}" hot-field="${this.field}" type="${this.type}" class="form-control${e}${n}"${i}${l}${s}${a}${o} />`}renderSelect(t,e,n){const i=(this.options||"").split(",").map((t=>{const e=t.trim();if(""===e)return"";const n=e.indexOf(":"),i=n>=0?e.slice(0,n):e,l=n>=0?e.slice(n+1):e;return`<option value="${i.replace(/"/g,"&quot;")}">${l}</option>`})).join("");return`<select id="${t}" hot-field="${this.field}" class="form-select${e}${n}">${i}</select>`}renderTextarea(t,e,n){const i=this.placeholder?` placeholder="${this.placeholder.replace(/"/g,"&quot;")}"`:"",l=this.maxlength?` maxlength="${this.maxlength}"`:"";return`<textarea id="${t}" hot-field="${this.field}" rows="${this.rows}" class="form-control${e}${n}"${l}${i}></textarea>`}renderCheckbox(t){return`<div class="form-check"><input id="${t}" hot-field="${this.field}" type="checkbox" class="form-check-input" /><label for="${t}" class="form-check-label">${this.label}</label></div>`}output(){if(""===this.field)throw new Error("admin-form-field: hot-field is required");const t=`ff-${this.field}-${Math.random().toString(36).slice(2,7)}`,e="sm"===this.size?" form-control-sm":"",n=this.css_class?" "+this.css_class:"";if("checkbox"===this.control){const e=this.renderCheckbox(t);return this.col?`<div class="${this.col}">${e}</div>`:e}let i="";i="select"===this.control?this.renderSelect(t,e,n):"textarea"===this.control?this.renderTextarea(t,e,n):this.renderInput(t,e,n);const l="1"===this.required||"true"===this.required?' <span class="text-danger" aria-label="required">*</span>':"",s=this.help?`<div class="form-text small">${this.help}</div>`:"",a=`\n\t\t\t<label for="${t}" class="form-label small mb-1">${this.label}${l}</label>\n\t\t\t${i}\n\t\t\t${s}`;return this.col?`<div class="${this.col}">${a}</div>`:`<div>${a}</div>`}}e.AdminFormField=l},976:function(t,e,n){var i=this&&this.__awaiter||function(t,e,n,i){return new(n||(n=Promise))((function(l,s){function a(t){try{d(i.next(t))}catch(t){s(t)}}function o(t){try{d(i.throw(t))}catch(t){s(t)}}function d(t){var e;t.done?l(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(a,o)}d((i=i.apply(t,e||[])).next())}))};Object.defineProperty(e,"__esModule",{value:!0}),e.AdminAddPanel=void 0;const l=n(79);class s extends l.HotComponent{constructor(t,e){super(t,e),this.tag="admin-add-panel",this.title="",this.button_title="Save",this.cancel_text="Cancel",this.attached_list="",this.add_place_here="",this.add_text="+ Add",this.start_open="0",this.onsave=null}onPostPlace(t,e){const n=this,l=document.getElementById(this.panelId);if(null==l)return null;const s=l.querySelector(".fl-add-panel-submit"),a=l.querySelector(".fl-add-panel-cancel");return null!=s&&s.addEventListener("click",(t=>i(this,void 0,void 0,(function*(){t.preventDefault();const e=n.collectFieldValues(l);s.disabled=!0;try{let t=!1;"function"==typeof n.onsave&&(t=yield n.onsave(e)),!1!==t&&null!=t||(n.resetFields(l),n.collapsePanel(),n.refreshAttachedList())}catch(t){console.error("admin-add-panel onsave threw:",t)}finally{s.disabled=!1}})))),null!=a&&a.addEventListener("click",(t=>{t.preventDefault(),n.resetFields(l),n.collapsePanel()})),null}collectFieldValues(t){const e={},n=t.querySelectorAll("[hot-field]");for(let t=0;t<n.length;t++){const i=n[t],l=i.getAttribute("hot-field");null!=l&&""!==l&&(i instanceof HTMLInputElement&&"checkbox"===i.type?e[l]=i.checked:i instanceof HTMLInputElement&&"number"===i.type?e[l]=""===i.value?null:Number(i.value):e[l]=i.value)}return e}resetFields(t){const e=t.querySelectorAll("[hot-field]");for(let t=0;t<e.length;t++){const n=e[t];n instanceof HTMLInputElement&&"checkbox"===n.type?n.checked=!1:n instanceof HTMLSelectElement?n.selectedIndex=0:n.value=""}}collapsePanel(){const t=document.getElementById(this.panelId);null!=t&&(t.classList.remove("show"),document.querySelectorAll(`[data-bs-target="#${this.panelId}"]`).forEach((t=>t.setAttribute("aria-expanded","false"))))}refreshAttachedList(){if(""===this.attached_list)return;const t=document.getElementById(this.attached_list);null!=t&&"function"==typeof t.refreshList&&t.refreshList()}output(){if(""===this.name)throw new Error("admin-add-panel: name is required");this.panelId=`${this.name}Panel`,this.formId=`${this.name}Form`;const t="1"===this.start_open||"true"===this.start_open?" show":"",e=this.title?`<h2 class="h6 fl-add-panel-title mb-3">${this.title}</h2>`:"",n=this.cancel_text?`<button type="button" class="btn btn-sm btn-link text-muted fl-add-panel-cancel">${this.cancel_text}</button>`:"",i=[{html:`\n\t\t\t<div id="${this.panelId}" class="collapse fl-add-panel${t}">\n\t\t\t\t<div class="card-body border-top bg-body-tertiary fl-add-panel-body">\n\t\t\t\t\t${e}\n\t\t\t\t\t<form id="${this.formId}" class="fl-add-panel-form">\n\t\t\t\t\t\t<div class="row g-2 align-items-end">\n\t\t\t\t\t\t\t<hot-place-here name="panelBody"></hot-place-here>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class="d-flex justify-content-end gap-2 mt-3">\n\t\t\t\t\t\t\t${n}\n\t\t\t\t\t\t\t<button type="submit" class="btn btn-sm btn-success fl-add-panel-submit">${this.button_title}</button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</form>\n\t\t\t\t</div>\n\t\t\t</div>`,documentSelector:"body"}],l=`<button type="button" class="btn btn-sm btn-primary fl-add-panel-toggle" data-bs-toggle="collapse" data-bs-target="#${this.panelId}" aria-expanded="${t?"true":"false"}" aria-controls="${this.panelId}">${this.add_text}</button>`;return""!==this.attached_list?i.push({html:l,documentSelector:`[data-card-table-add-slot="${this.attached_list}"]`}):""!==this.add_place_here&&i.push({html:l,documentSelector:`hot-place-here[name="${this.add_place_here}"]`}),i}}e.AdminAddPanel=s}},e={};function n(i){var l=e[i];if(void 0!==l)return l.exports;var s=e[i]={exports:{}};return t[i].call(s.exports,s,s.exports,n),s.exports}var i={};(()=>{var t=i;Object.defineProperty(t,"__esModule",{value:!0}),t.AdminEyebrowHeading=t.AdminDisclaimer=t.AdminDetailPage=t.AdminCardTable=t.AdminAddPanel=t.AdminFormField=t.AdminText=t.AdminTableRow=t.AdminTableField=t.AdminTable=t.AdminEdit=t.AdminDashboard=t.AdminDropdown=t.AdminButton=void 0;const e=n(594);Object.defineProperty(t,"AdminButton",{enumerable:!0,get:function(){return e.AdminButton}});const l=n(91);Object.defineProperty(t,"AdminDropdown",{enumerable:!0,get:function(){return l.AdminDropdown}});const s=n(924);Object.defineProperty(t,"AdminDashboard",{enumerable:!0,get:function(){return s.AdminDashboard}});const a=n(494);Object.defineProperty(t,"AdminEdit",{enumerable:!0,get:function(){return a.AdminEdit}});const o=n(620);Object.defineProperty(t,"AdminTable",{enumerable:!0,get:function(){return o.AdminTable}});const d=n(837);Object.defineProperty(t,"AdminTableField",{enumerable:!0,get:function(){return d.AdminTableField}});const r=n(877);Object.defineProperty(t,"AdminTableRow",{enumerable:!0,get:function(){return r.AdminTableRow}});const h=n(741);Object.defineProperty(t,"AdminText",{enumerable:!0,get:function(){return h.AdminText}});const c=n(937);Object.defineProperty(t,"AdminFormField",{enumerable:!0,get:function(){return c.AdminFormField}});const u=n(976);Object.defineProperty(t,"AdminAddPanel",{enumerable:!0,get:function(){return u.AdminAddPanel}});const m=n(357);Object.defineProperty(t,"AdminCardTable",{enumerable:!0,get:function(){return m.AdminCardTable}});const p=n(551);Object.defineProperty(t,"AdminDetailPage",{enumerable:!0,get:function(){return p.AdminDetailPage}});const f=n(805);Object.defineProperty(t,"AdminDisclaimer",{enumerable:!0,get:function(){return f.AdminDisclaimer}});const b=n(272);Object.defineProperty(t,"AdminEyebrowHeading",{enumerable:!0,get:function(){return b.AdminEyebrowHeading}})})(),AdminPanelComponentsWeb=i})();
2
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,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bXBvbmVudHNXZWIvZXh0ZXJuYWwgdmFyIFwiRGF0YVRhYmxlXCIiLCJ3ZWJwYWNrOi8vQWRtaW5QYW5lbENvbXBvbmVudHNXZWIvZXh0ZXJuYWwgdmFyIFwiSG90U3RhcVdlYlwiIiwid2VicGFjazovL0FkbWluUGFuZWxDb21wb25lbnRzV2ViLy4vc3JjL2NvbXBvbmVudHMvYWRtaW4tZHJvcGRvd24udHMiLCJ3ZWJwYWNrOi8vQWRtaW5QYW5lbENvbXBvbmVudHNXZWIvLi9zcmMvY29tcG9uZW50cy9hZG1pbi1leWVicm93LWhlYWRpbmcudHMiLCJ3ZWJwYWNrOi8vQWRtaW5QYW5lbENvbXBvbmVudHNXZWIvLi9zcmMvY29tcG9uZW50cy9hZG1pbi1jYXJkLXRhYmxlLnRzIiwid2VicGFjazovL0FkbWluUGFuZWxDb21wb25lbnRzV2ViL2V4dGVybmFsIHZhciBcImJvb3RzdHJhcFwiIiwid2VicGFjazovL0FkbWluUGFuZWxDb21wb25lbnRzV2ViLy4vc3JjL2NvbXBvbmVudHMvYWRtaW4tZWRpdC50cyIsIndlYnBhY2s6Ly9BZG1pblBhbmVsQ29tcG9uZW50c1dlYi8uL3NyYy9jb21wb25lbnRzL2FkbWluLWRldGFpbC1wYWdlLnRzIiwid2VicGFjazovL0FkbWluUGFuZWxDb21wb25lbnRzV2ViLy4vc3JjL2NvbXBvbmVudHMvYWRtaW4tYnV0dG9uLnRzIiwid2VicGFjazovL0FkbWluUGFuZWxDb21wb25lbnRzV2ViLy4vc3JjL2NvbXBvbmVudHMvYWRtaW4tdGFibGUudHMiLCJ3ZWJwYWNrOi8vQWRtaW5QYW5lbENvbXBvbmVudHNXZWIvLi9zcmMvY29tcG9uZW50cy9hZG1pbi10ZXh0LnRzIiwid2VicGFjazovL0FkbWluUGFuZWxDb21wb25lbnRzV2ViLy4vc3JjL2NvbXBvbmVudHMvYWRtaW4tZGlzY2xhaW1lci50cyIsIndlYnBhY2s6Ly9BZG1pblBhbmVsQ29tcG9uZW50c1dlYi8uL3NyYy9jb21wb25lbnRzL2FkbWluLXRhYmxlLWZpZWxkLnRzIiwid2VicGFjazovL0FkbWluUGFuZWxDb21wb25lbnRzV2ViLy4vc3JjL2NvbXBvbmVudHMvYWRtaW4tdGFibGUtcm93LnRzIiwid2VicGFjazovL0FkbWluUGFuZWxDb21wb25lbnRzV2ViLy4vc3JjL2NvbXBvbmVudHMvYWRtaW4tZGFzaGJvYXJkLnRzIiwid2VicGFjazovL0FkbWluUGFuZWxDb21wb25lbnRzV2ViLy4vc3JjL2NvbXBvbmVudHMvYWRtaW4tZm9ybS1maWVsZC50cyIsIndlYnBhY2s6Ly9BZG1pblBhbmVsQ29tcG9uZW50c1dlYi8uL3NyYy9jb21wb25lbnRzL2FkbWluLWFkZC1wYW5lbC50cyIsIndlYnBhY2s6Ly9BZG1pblBhbmVsQ29tcG9uZW50c1dlYi93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9BZG1pblBhbmVsQ29tcG9uZW50c1dlYi8uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IERhdGFUYWJsZTsiLCJtb2R1bGUuZXhwb3J0cyA9IEhvdFN0YXFXZWI7IiwiaW1wb3J0IHsgSG90U3RhcSwgSG90LCBIb3RBUEksIEhvdENvbXBvbmVudCB9IGZyb20gXCJob3RzdGFxXCI7XG5cbmV4cG9ydCBjbGFzcyBBZG1pbkRyb3Bkb3duIGV4dGVuZHMgSG90Q29tcG9uZW50XG57XG5cdC8qKlxuXHQgKiBUaGUgc2VhcmNoIHN0cmluZyBwbGFjZWhvbGRlciB0byBzaG93LlxuXHQgKi9cblx0cGxhY2Vob2xkZXI6IHN0cmluZztcblx0LyoqXG5cdCAqIEV4ZWN1dGVzIHdoZW4gdGhlIGtleWJvYXJkIHVwIGJ1dHRvbiBpcyB0cmlnZ2VyZWQuXG5cdCAqL1xuXHRvbnNlYXJjaDogKHNlYXJjaFRleHQ6IHN0cmluZywgZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IFByb21pc2U8eyB1cmw6IHN0cmluZzsgdmFsdWU6IHN0cmluZzsgdGV4dDogc3RyaW5nOyB9W10+O1xuXHQvKipcblx0ICogRXhlY3V0ZXMgd2hlbiBhbiBzZWFyY2ggcmVzdWx0IGhhcyBiZWVuIHNlbGVjdGVkLlxuXHQgKi9cblx0b25zZWxlY3Q6ICh1cmw6IHN0cmluZywgdmFsdWU6IHN0cmluZywgdGV4dDogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+O1xuXG5cdGNvbnN0cnVjdG9yIChjb3B5OiBIb3RDb21wb25lbnQgfCBIb3RTdGFxLCBhcGk6IEhvdEFQSSlcblx0e1xuXHRcdHN1cGVyIChjb3B5LCBhcGkpO1xuXG5cdFx0dGhpcy50YWcgPSBcImFkbWluLWRyb3Bkb3duXCI7XG5cdFx0dGhpcy5wbGFjZWhvbGRlciA9IFwiU2VhcmNoXCI7XG5cdFx0dGhpcy5vbnNlYXJjaCA9IG51bGw7XG5cdFx0dGhpcy5vbnNlbGVjdCA9IG51bGw7XG5cdH1cblxuXHQvKipcblx0ICogQ29ycmVjdHMgdGhlIHBsYWNlbWVudCBvZiB0aGUgdGV4dCBlbGVtZW50cyBmb3IgbW9kYWxzLlxuXHQgKi9cblx0b25Qb3N0UGxhY2UgKHBhcmVudEh0bWxFbGVtZW50OiBIVE1MRWxlbWVudCwgaHRtbEVsZW1lbnQ6IEhUTUxFbGVtZW50KTogSFRNTEVsZW1lbnRcblx0e1xuXHRcdGxldCBwbGFjZUhlcmVBcnJheSA9IHBhcmVudEh0bWxFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwgKGBob3QtcGxhY2UtaGVyZVt0eXBlPVwibW9kYWxcIl1gKTtcblxuXHRcdGlmIChwbGFjZUhlcmVBcnJheS5sZW5ndGggPiAwKVxuXHRcdHtcblx0XHRcdGxldCBwbGFjZUhlcmUgPSBwbGFjZUhlcmVBcnJheVswXTtcblx0XHRcdHBhcmVudEh0bWxFbGVtZW50LnJlbW92ZUNoaWxkIChodG1sRWxlbWVudCk7XG5cdFx0XHRwbGFjZUhlcmUuYXBwZW5kQ2hpbGQgKGh0bWxFbGVtZW50KTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5vbnNlYXJjaCAhPSBudWxsKVxuXHRcdHtcblx0XHRcdGlmICh0eXBlb2YgKHRoaXMub25zZWFyY2gpID09PSBcInN0cmluZ1wiKVxuXHRcdFx0XHR0aGlzLm9uc2VhcmNoID0gKDwoc2VhcmNoVGV4dDogc3RyaW5nLCBldmVudDogS2V5Ym9hcmRFdmVudCkgPT4gUHJvbWlzZTx7IHVybDogc3RyaW5nOyB2YWx1ZTogc3RyaW5nOyB0ZXh0OiBzdHJpbmc7IH1bXT4+bmV3IEZ1bmN0aW9uICh0aGlzLm9uc2VhcmNoKSk7XG5cblx0XHRcdGh0bWxFbGVtZW50LnF1ZXJ5U2VsZWN0b3IgKFwiaW5wdXRcIikuYWRkRXZlbnRMaXN0ZW5lciAoXCJrZXl1cFwiLCBcblx0XHRcdFx0YXN5bmMgKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PlxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0XHRcdGNvbnN0IHNlYXJjaFRleHQgPSBldmVudC5jdXJyZW50VGFyZ2V0LnZhbHVlO1xuXG5cdFx0XHRcdFx0bGV0IHJlc3VsdHMgPSBhd2FpdCB0aGlzLm9uc2VhcmNoIChzZWFyY2hUZXh0LCBldmVudCk7XG5cblx0XHRcdFx0XHRsZXQgc2VhcmNoUmVzdWx0c0RpdiA9ICQodGhpcy5odG1sRWxlbWVudHNbMV0pLmZpbmQgKFwiLnNlYXJjaFJlc3VsdHNcIik7XG5cblx0XHRcdFx0XHRzZWFyY2hSZXN1bHRzRGl2LmVtcHR5ICgpO1xuXG5cdFx0XHRcdFx0Zm9yIChsZXQgaUlkeCA9IDA7IGlJZHggPCByZXN1bHRzLmxlbmd0aDsgaUlkeCsrKVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGNvbnN0IHJlc3VsdCA9IHJlc3VsdHNbaUlkeF07XG5cdFx0XHRcdFx0XHRsZXQgdXJsOiBzdHJpbmcgPSByZXN1bHQudXJsO1xuXHRcdFx0XHRcdFx0bGV0IHZhbHVlOiBzdHJpbmcgPSByZXN1bHQudmFsdWU7XG5cdFx0XHRcdFx0XHRsZXQgdGV4dDogc3RyaW5nID0gcmVzdWx0LnRleHQ7XG5cblx0XHRcdFx0XHRcdGNvbnN0ICR0ZW1wbGF0ZSA9ICQoYDxsaT48YSBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIiBocmVmPVwiXCIgZGF0YS12YWx1ZT1cIlwiIG9uY2xpY2s9XCJcIj48L2E+PC9saT5gKTtcblxuXHRcdFx0XHRcdFx0Y29uc3QgJGEgPSAkdGVtcGxhdGUuZmluZChcImFcIik7XG5cdFx0XHRcdFx0XHQkYS5hdHRyKFwiaHJlZlwiLCB1cmwpO1xuXHRcdFx0XHRcdFx0JGEuYXR0cihcImRhdGEtdmFsdWVcIiwgdmFsdWUpO1xuXHRcdFx0XHRcdFx0JGEudGV4dCh0ZXh0KTtcblxuXHRcdFx0XHRcdFx0JGEucmVtb3ZlQXR0cihcIm9uY2xpY2tcIikub24oXCJjbGlja1wiLCAoKSA9PiB7XG5cdFx0XHRcdFx0XHRcdHRoaXMuc2VsZWN0ZWQoaUlkeCk7XG5cdFx0XHRcdFx0XHR9KTtcblxuXHRcdFx0XHRcdFx0c2VhcmNoUmVzdWx0c0Rpdi5hcHBlbmQoJHRlbXBsYXRlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdHJldHVybiAobnVsbCk7XG5cdH1cblxuXHQvKipcblx0ICogRXhlY3V0ZWQgd2hlbiBhbiBpdGVtIGlzIHNlbGVjdGVkLlxuXHQgKi9cblx0YXN5bmMgc2VsZWN0ZWQgKGluZGV4OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+XG5cdHtcblx0XHRpZiAodGhpcy5vbnNlbGVjdCAhPSBudWxsKVxuXHRcdHtcblx0XHRcdGlmICh0eXBlb2YgKHRoaXMub25zZWxlY3QpID09PSBcInN0cmluZ1wiKVxuXHRcdFx0XHR0aGlzLm9uc2VsZWN0ID0gKDwodXJsOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcsIHRleHQ6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPj5uZXcgRnVuY3Rpb24gKHRoaXMub25zZWxlY3QpKTtcblxuXHRcdFx0Y29uc3QgdXJsID0gdGhpcy5odG1sRWxlbWVudHNbMV0ucXVlcnlTZWxlY3RvckFsbCAoXCJhXCIpW2luZGV4XS5nZXRBdHRyaWJ1dGUgKFwiaHJlZlwiKTtcblx0XHRcdGNvbnN0IHZhbHVlID0gdGhpcy5odG1sRWxlbWVudHNbMV0ucXVlcnlTZWxlY3RvckFsbCAoXCJhXCIpW2luZGV4XS5nZXRBdHRyaWJ1dGUgKFwiZGF0YS12YWx1ZVwiKTtcblx0XHRcdGNvbnN0IHRleHQgPSB0aGlzLmh0bWxFbGVtZW50c1sxXS5xdWVyeVNlbGVjdG9yQWxsIChcImFcIilbaW5kZXhdLmlubmVySFRNTDtcblxuXHRcdFx0YXdhaXQgdGhpcy5vbnNlbGVjdCAodXJsLCB2YWx1ZSwgdGV4dCk7XG5cdFx0fVxuXHR9XG5cblx0b3V0cHV0ICgpOiBzdHJpbmdcblx0e1xuXHRcdHJldHVybiAoXG5cdGA8ZGl2IGNsYXNzPVwiZHJvcGRvd25cIj5cblx0XHQ8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IGRyb3Bkb3duLXRvZ2dsZVwiIHR5cGU9XCJidXR0b25cIiBkYXRhLWJzLXRvZ2dsZT1cImRyb3Bkb3duXCIgYXJpYS1leHBhbmRlZD1cImZhbHNlXCI+XG5cdFx0ICAke3RoaXMuaW5uZXJ9XG5cdFx0PC9idXR0b24+XG5cdFx0PHVsIGNsYXNzPVwiZHJvcGRvd24tbWVudVwiPlxuXHRcdFx0PGxpPlxuXHRcdFx0XHQ8ZGl2IGNsYXNzID0gXCJpbnB1dC1ncm91cFwiPlxuXHRcdFx0XHRcdDxpbnB1dCB0eXBlID0gXCJ0ZXh0XCIgY2xhc3MgPSBcImZvcm0tY29udHJvbFwiIHBsYWNlaG9sZGVyID0gXCIke3RoaXMucGxhY2Vob2xkZXJ9XCIgdmFsdWUgPSBcIlwiIC8+XG5cdFx0XHRcdDwvZGl2PlxuXHRcdFx0PC9saT5cblx0XHRcdDxkaXYgY2xhc3MgPSBcInNlYXJjaFJlc3VsdHNcIj5cblx0XHRcdDwvZGl2PlxuXHRcdDwvdWw+XG5cdDwvZGl2PmApO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBIb3RTdGFxLCBIb3QsIEhvdEFQSSwgSG90Q29tcG9uZW50LCBIb3RDb21wb25lbnRPdXRwdXQgfSBmcm9tIFwiaG90c3RhcVwiO1xuXG4vKipcbiAqIEEgcGFnZSBoZWFkaW5nIHdpdGggYSBzbWFsbCB1cHBlcmNhc2UgXCJleWVicm93XCIgbGFiZWwgYWJvdmUgaXQuXG4gKiBQYXR0ZXJuIGxpZnRlZCBmcm9tIHRoZSAvbGl2ZSBwYWdlIG9uIEZyZWVsaWdodCDigJQgdGhlIFwiTGl2ZSBDYW1wYWlnblxuICogUGFnZVwiIGxhYmVsIGFib3ZlIHRoZSBjYW5kaWRhdGUgbmFtZS5cbiAqXG4gKiBVc2FnZTpcbiAqICAgPGFkbWluLWV5ZWJyb3ctaGVhZGluZyBob3QtZXllYnJvdz1cIkNhbXBhaWduIFByb2plY3RcIlxuICogICAgICAgICAgICAgICAgICAgICAgICAgIGhvdC1oZWFkaW5nPVwiUTQgT3V0cmVhY2ggUGxhblwiPjwvYWRtaW4tZXllYnJvdy1oZWFkaW5nPlxuICovXG5leHBvcnQgY2xhc3MgQWRtaW5FeWVicm93SGVhZGluZyBleHRlbmRzIEhvdENvbXBvbmVudFxue1xuXHQvKiogVGhlIHNtYWxsIHVwcGVyY2FzZSBsYWJlbCByZW5kZXJlZCBhYm92ZSB0aGUgaGVhZGluZy4gKi9cblx0ZXllYnJvdzogc3RyaW5nO1xuXHQvKiogVGhlIGgxIHRleHQuICovXG5cdGhlYWRpbmc6IHN0cmluZztcblx0LyoqIE9wdGlvbmFsIG11dGVkIHN1YnRpdGxlIHJlbmRlcmVkIGJlbG93IHRoZSBoZWFkaW5nLiAqL1xuXHRzdWJ0aXRsZTogc3RyaW5nO1xuXHQvKiogXCJjZW50ZXJcIiB8IFwic3RhcnRcIiAoZGVmYXVsdCkuICovXG5cdGFsaWduOiBzdHJpbmc7XG5cblx0Y29uc3RydWN0b3IgKGNvcHk6IEhvdENvbXBvbmVudCB8IEhvdFN0YXEsIGFwaTogSG90QVBJKVxuXHR7XG5cdFx0c3VwZXIgKGNvcHksIGFwaSk7XG5cblx0XHR0aGlzLnRhZyAgICAgID0gXCJhZG1pbi1leWVicm93LWhlYWRpbmdcIjtcblx0XHR0aGlzLmV5ZWJyb3cgID0gXCJcIjtcblx0XHR0aGlzLmhlYWRpbmcgID0gXCJcIjtcblx0XHR0aGlzLnN1YnRpdGxlID0gXCJcIjtcblx0XHR0aGlzLmFsaWduICAgID0gXCJzdGFydFwiO1xuXHR9XG5cblx0b3V0cHV0ICgpOiBzdHJpbmcgfCBIb3RDb21wb25lbnRPdXRwdXRbXVxuXHR7XG5cdFx0Y29uc3QgYWxpZ25DbGFzcyA9IHRoaXMuYWxpZ24gPT09IFwiY2VudGVyXCIgPyBcInRleHQtY2VudGVyXCIgOiBcIlwiO1xuXHRcdGNvbnN0IGV5ZWJyb3cgPSB0aGlzLmV5ZWJyb3dcblx0XHRcdD8gYDxkaXYgY2xhc3M9XCJ0ZXh0LXVwcGVyY2FzZSB0ZXh0LW11dGVkIHNtYWxsIG1iLTJcIiBzdHlsZT1cImxldHRlci1zcGFjaW5nOjAuMDhlbTtcIj4ke3RoaXMuZXllYnJvd308L2Rpdj5gXG5cdFx0XHQ6IFwiXCI7XG5cdFx0Y29uc3Qgc3VidGl0bGUgPSB0aGlzLnN1YnRpdGxlXG5cdFx0XHQ/IGA8cCBjbGFzcz1cInRleHQtbXV0ZWQgbWItMFwiPiR7dGhpcy5zdWJ0aXRsZX08L3A+YFxuXHRcdFx0OiBcIlwiO1xuXHRcdHJldHVybiBgXG5cdFx0XHQ8ZGl2IGNsYXNzPVwiZmwtZXllYnJvdy1oZWFkaW5nIG1iLTMgJHthbGlnbkNsYXNzfVwiPlxuXHRcdFx0XHQke2V5ZWJyb3d9XG5cdFx0XHRcdDxoMSBjbGFzcz1cImgzIG1iLTFcIj4ke3RoaXMuaGVhZGluZyB8fCB0aGlzLmlubmVyIHx8IFwiXCJ9PC9oMT5cblx0XHRcdFx0JHtzdWJ0aXRsZX1cblx0XHRcdDwvZGl2PmA7XG5cdH1cbn1cbiIsImltcG9ydCB7IEhvdFN0YXEsIEhvdCwgSG90QVBJLCBIb3RDb21wb25lbnQsIEhvdENvbXBvbmVudE91dHB1dCB9IGZyb20gXCJob3RzdGFxXCI7XG5cbi8qKlxuICogRnJlZWxpZ2h0LXN0eWxlIGNhcmQgbGlzdC4gUmVuZGVycyBjYW1wYWlnbiAvIHByb2plY3QgLyBtZW1iZXIgcm93c1xuICogYXMgY2FyZHMgb24gZXZlcnkgdmlld3BvcnQsIHdpdGggb3B0aW9uYWwgaW5saW5lIGFjdGlvbiBidXR0b25zIGFuZFxuICogYSBzdWItbGluZSBiZWxvdyB0aGUgcHJpbWFyeSBsYWJlbC5cbiAqXG4gKiBSZXBsYWNlcyB0aGUgY2xpY2stcm93LW9wZW5zLW1vZGFsIGZsb3cgb2YgPGFkbWluLXRhYmxlPiArIDxhZG1pbi1lZGl0PjpcbiAqIHdoZW4gYGhvdC1kZXRhaWwtcm91dGVgIGlzIHNldCwgdGhlIHdob2xlIHJvdyBiZWNvbWVzIGEgbGluayB0byB0aGVcbiAqIGNvbmZpZ3VyZWQgZGV0YWlsIFVSTCAoZS5nLiBcIi9idWRnZXQvOmlkXCIpLiBXaGVuIGBob3QtZGV0YWlsLXJvdXRlYCBpc1xuICogZW1wdHksIHRoZSByb3cgcmVuZGVycyB3aXRob3V0IG5hdmlnYXRpb24g4oCUIHRoZSBjYWxsZXIgaXMgZXhwZWN0ZWQgdG9cbiAqIHByb3ZpZGUgdGhlaXIgb3duIGlubGluZSBhY3Rpb24gYnV0dG9ucyB2aWEgYGhvdC1yb3ctYWN0aW9uc2AuXG4gKlxuICogVXNhZ2U6XG4gKiAgIDxhZG1pbi1jYXJkLXRhYmxlIGlkPVwiYmFua0FjY291bnRzTGlzdFwiIGhvdC1saXN0LXVybD1cIi92MS9iYW5rX2FjY291bnRzL2xpc3RcIlxuICogICAgICAgICAgICAgICAgICAgICBob3QtZGV0YWlsLXJvdXRlPVwiL2JhbmtBY2NvdW50LzppZFwiXG4gKiAgICAgICAgICAgICAgICAgICAgIGhvdC1wcmltYXJ5LWZpZWxkPVwibmFtZVwiIGhvdC1zdWJsaW5lLWZpZWxkPVwiYmFua1N5bmNBUElUeXBlXCJcbiAqICAgICAgICAgICAgICAgICAgICAgaG90LWVtcHR5LXRleHQ9XCJObyBiYW5rIGFjY291bnRzIHlldC5cIj5cbiAqICAgPC9hZG1pbi1jYXJkLXRhYmxlPlxuICpcbiAqIFRoZSBjb21wb25lbnQgZXhwb3NlcyBhIGAucmVmcmVzaExpc3QoKWAgbWV0aG9kIG9uIHRoZSByZW5kZXJlZCBET01cbiAqIGVsZW1lbnQgc28gY2FsbGVycyAodGhlIHBhaXJlZCBhZG1pbi1hZGQtcGFuZWwsIGFuIGVkaXQtc2F2ZSBjYWxsYmFjayxcbiAqIGV0Yy4pIGNhbiByZS1mZXRjaCB3aXRob3V0IGEgcGFnZSByZWxvYWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBBZG1pbkNhcmRUYWJsZSBleHRlbmRzIEhvdENvbXBvbmVudFxue1xuXHQvKiogT3B0aW9uYWwgdGl0bGUgc2hvd24gaW4gdGhlIGNhcmQgaGVhZGVyLiAqL1xuXHR0aXRsZTogc3RyaW5nO1xuXHQvKiogRW5kcG9pbnQgdGhhdCByZXR1cm5zIHsgbGVuZ3RoLCBkYXRhOiBbLi4uXSB9IOKAlCB1c3VhbGx5IHRoZSBlbnRpdHkncyBsaXN0IHJvdXRlLiAqL1xuXHRsaXN0X3VybDogc3RyaW5nO1xuXHQvKiogSldUIHRva2VuIHRvIHNlbmQgYXMgQXV0aG9yaXphdGlvbiBiZWFyZXIuIEVtcHR5IGZvciBwdWJsaWMgZW5kcG9pbnRzLiAqL1xuXHRqd3Q6IHN0cmluZztcblx0LyoqIEJvZHkgcGFyYW1zIHRvIFBPU1Qgd2l0aCB0aGUgbGlzdCBjYWxsIChKU09OKS4gKi9cblx0bGlzdF9wYXJhbXM6IHN0cmluZztcblx0LyoqIEZpZWxkIG5hbWUgb24gZWFjaCByb3cgdXNlZCBhcyB0aGUgcHJpbWFyeSBjYXJkIGxhYmVsIChkZWZhdWx0IFwibmFtZVwiKS4gKi9cblx0cHJpbWFyeV9maWVsZDogc3RyaW5nO1xuXHQvKiogT3B0aW9uYWwgc2Vjb25kLWxpbmUgZmllbGQgcmVuZGVyZWQgaW4gbXV0ZWQgdGV4dCB1bmRlciB0aGUgcHJpbWFyeSBsYWJlbC4gKi9cblx0c3VibGluZV9maWVsZDogc3RyaW5nO1xuXHQvKiogUGF0dGVybiBmb3IgdGhlIHJvdydzIGNsaWNrIHRhcmdldC4gXCI6aWRcIiBpbnRlcnBvbGF0ZXMgcm93LmlkLiBFbXB0eSBkaXNhYmxlcyByb3cgbmF2aWdhdGlvbi4gKi9cblx0ZGV0YWlsX3JvdXRlOiBzdHJpbmc7XG5cdC8qKiBUZXh0IHNob3duIHdoZW4gdGhlIGxpc3QgaXMgZW1wdHkuICovXG5cdGVtcHR5X3RleHQ6IHN0cmluZztcblx0LyoqIFRleHQgc2hvd24gd2hpbGUgdGhlIGxpc3QgaXMgbG9hZGluZy4gKi9cblx0bG9hZGluZ190ZXh0OiBzdHJpbmc7XG5cdC8qKiBJbm5lciBIVE1MIHRlbXBsYXRlIGZvciB0aGUgcmlnaHQtc2lkZSBhY3Rpb24gYXJlYSwgd2l0aCBcIjppZFwiIHBsYWNlaG9sZGVyLiAqL1xuXHRyb3dfYWN0aW9uczogc3RyaW5nO1xuXHQvKiogU2xvdCBuYW1lIHdoZXJlIHRoZSBwYXJ0bmVyIGFkbWluLWFkZC1wYW5lbCBpbmplY3RzIGl0cyB0b2dnbGUgYnV0dG9uLiAqL1xuXHRhZGRfc2xvdDogc3RyaW5nO1xuXG5cdGNvbnN0cnVjdG9yIChjb3B5OiBIb3RDb21wb25lbnQgfCBIb3RTdGFxLCBhcGk6IEhvdEFQSSlcblx0e1xuXHRcdHN1cGVyIChjb3B5LCBhcGkpO1xuXG5cdFx0dGhpcy50YWcgICAgICAgICAgID0gXCJhZG1pbi1jYXJkLXRhYmxlXCI7XG5cdFx0dGhpcy50aXRsZSAgICAgICAgID0gXCJcIjtcblx0XHR0aGlzLmxpc3RfdXJsICAgICAgPSBcIlwiO1xuXHRcdHRoaXMuand0ICAgICAgICAgICA9IFwiXCI7XG5cdFx0dGhpcy5saXN0X3BhcmFtcyAgID0gXCJ7fVwiO1xuXHRcdHRoaXMucHJpbWFyeV9maWVsZCA9IFwibmFtZVwiO1xuXHRcdHRoaXMuc3VibGluZV9maWVsZCA9IFwiXCI7XG5cdFx0dGhpcy5kZXRhaWxfcm91dGUgID0gXCJcIjtcblx0XHR0aGlzLmVtcHR5X3RleHQgICAgPSBcIk5vIGl0ZW1zIHlldC5cIjtcblx0XHR0aGlzLmxvYWRpbmdfdGV4dCAgPSBcIkxvYWRpbmfigKZcIjtcblx0XHR0aGlzLnJvd19hY3Rpb25zICAgPSBcIlwiO1xuXHRcdHRoaXMuYWRkX3Nsb3QgICAgICA9IFwiXCI7XG5cdH1cblxuXHRvblBvc3RQbGFjZSAocGFyZW50SHRtbEVsZW1lbnQ6IEhUTUxFbGVtZW50LCBodG1sRWxlbWVudDogSFRNTEVsZW1lbnQpOiBIVE1MRWxlbWVudFxuXHR7XG5cdFx0Y29uc3Qgc2VsZiA9IHRoaXM7XG5cdFx0Y29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQgKHRoaXMubmFtZSk7XG5cdFx0aWYgKGNvbnRhaW5lciA9PSBudWxsKVxuXHRcdFx0cmV0dXJuIChudWxsKTtcblxuXHRcdC8vIEV4cG9zZSBhIHJlZnJlc2hMaXN0KCkgbWV0aG9kIG9uIHRoZSByZW5kZXJlZCBlbGVtZW50IHNvIHRoZVxuXHRcdC8vIHBhcnRuZXIgYWRkLXBhbmVsIChhbmQgYW55IG90aGVyIGNhbGxlcikgY2FuIHJlLWZldGNoIHdoZW4gYVxuXHRcdC8vIHJvdyBjaGFuZ2VzLlxuXHRcdChjb250YWluZXIgYXMgYW55KS5yZWZyZXNoTGlzdCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHNlbGYuZmV0Y2hBbmRSZW5kZXIgKCk7IH07XG5cblx0XHQvLyBJbml0aWFsIGxvYWQuXG5cdFx0c2VsZi5mZXRjaEFuZFJlbmRlciAoKTtcblxuXHRcdHJldHVybiAobnVsbCk7XG5cdH1cblxuXHRwcm90ZWN0ZWQgYXN5bmMgZmV0Y2hBbmRSZW5kZXIgKCk6IFByb21pc2U8dm9pZD5cblx0e1xuXHRcdGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkICh0aGlzLm5hbWUpO1xuXHRcdGNvbnN0IGxpc3QgPSBjb250YWluZXIgPyBjb250YWluZXIucXVlcnlTZWxlY3RvciAoXCIuZmwtY2FyZC1saXN0XCIpIGFzIEhUTUxFbGVtZW50IDogbnVsbDtcblx0XHRpZiAobGlzdCA9PSBudWxsKSByZXR1cm47XG5cblx0XHR0cnlcblx0XHR7XG5cdFx0XHRsZXQgcGF5bG9hZDogYW55ID0ge307XG5cdFx0XHR0cnkgeyBwYXlsb2FkID0gSlNPTi5wYXJzZSAodGhpcy5saXN0X3BhcmFtcyB8fCBcInt9XCIpOyB9IGNhdGNoIChlKSB7IHBheWxvYWQgPSB7fTsgfVxuXG5cdFx0XHRjb25zdCBoZWFkZXJzOiBhbnkgPSB7IFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiIH07XG5cdFx0XHRpZiAodGhpcy5qd3QpIGhlYWRlcnNbXCJBdXRob3JpemF0aW9uXCJdID0gXCJCZWFyZXIgXCIgKyB0aGlzLmp3dDtcblxuXHRcdFx0Y29uc3QgcmVzID0gYXdhaXQgZmV0Y2ggKHRoaXMubGlzdF91cmwsIHtcblx0XHRcdFx0bWV0aG9kOiBcIlBPU1RcIiwgaGVhZGVyczogaGVhZGVycywgYm9keTogSlNPTi5zdHJpbmdpZnkgKHBheWxvYWQpXG5cdFx0XHR9KTtcblxuXHRcdFx0aWYgKCFyZXMub2spXG5cdFx0XHR7XG5cdFx0XHRcdGxpc3QuaW5uZXJIVE1MID0gYDxkaXYgY2xhc3M9XCJ0ZXh0LWRhbmdlciBzbWFsbCBwLTNcIj5Db3VsZCBub3QgbG9hZDogSFRUUCAke3Jlcy5zdGF0dXN9PC9kaXY+YDtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCByZXN1bHQgPSBhd2FpdCByZXMuanNvbiAoKTtcblx0XHRcdGNvbnN0IHJvd3M6IGFueVtdID0gKHJlc3VsdCAmJiBBcnJheS5pc0FycmF5IChyZXN1bHQuZGF0YSkpID8gcmVzdWx0LmRhdGEgOiAoQXJyYXkuaXNBcnJheSAocmVzdWx0KSA/IHJlc3VsdCA6IFtdKTtcblxuXHRcdFx0aWYgKHJvd3MubGVuZ3RoID09PSAwKVxuXHRcdFx0e1xuXHRcdFx0XHRsaXN0LmlubmVySFRNTCA9IGA8ZGl2IGNsYXNzPVwidGV4dC1tdXRlZCBzbWFsbCB0ZXh0LWNlbnRlciBweS00XCI+JHt0aGlzLmVtcHR5X3RleHR9PC9kaXY+YDtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRsaXN0LmlubmVySFRNTCA9IHJvd3MubWFwICgocm93KSA9PiB0aGlzLnJlbmRlclJvdyAocm93KSkuam9pbiAoXCJcIik7XG5cdFx0fVxuXHRcdGNhdGNoIChleClcblx0XHR7XG5cdFx0XHRsaXN0LmlubmVySFRNTCA9IGA8ZGl2IGNsYXNzPVwidGV4dC1kYW5nZXIgc21hbGwgcC0zXCI+Q291bGQgbm90IGxvYWQ6ICR7KGV4IGFzIEVycm9yKS5tZXNzYWdlfTwvZGl2PmA7XG5cdFx0fVxuXHR9XG5cblx0cHJvdGVjdGVkIGVzY2FwZUh0bWwgKHM6IGFueSk6IHN0cmluZ1xuXHR7XG5cdFx0cmV0dXJuIFN0cmluZyAocyA9PSBudWxsID8gXCJcIiA6IHMpXG5cdFx0XHQucmVwbGFjZSAoLyYvZywgXCImYW1wO1wiKS5yZXBsYWNlICgvPC9nLCBcIiZsdDtcIikucmVwbGFjZSAoLz4vZywgXCImZ3Q7XCIpXG5cdFx0XHQucmVwbGFjZSAoL1wiL2csIFwiJnF1b3Q7XCIpLnJlcGxhY2UgKC8nL2csIFwiJiMzOTtcIik7XG5cdH1cblxuXHRwcm90ZWN0ZWQgaW50ZXJwb2xhdGUgKHRlbXBsYXRlOiBzdHJpbmcsIHJvdzogYW55KTogc3RyaW5nXG5cdHtcblx0XHRpZiAoIXRlbXBsYXRlKSByZXR1cm4gXCJcIjtcblx0XHRyZXR1cm4gdGVtcGxhdGUucmVwbGFjZSAoLzooXFx3KykvZywgKF9tLCBrZXkpID0+IHRoaXMuZXNjYXBlSHRtbCAocm93W2tleV0gfHwgXCJcIikpO1xuXHR9XG5cblx0cHJvdGVjdGVkIHJlbmRlclJvdyAocm93OiBhbnkpOiBzdHJpbmdcblx0e1xuXHRcdGNvbnN0IHByaW1hcnlSYXcgPSByb3dbdGhpcy5wcmltYXJ5X2ZpZWxkXTtcblx0XHRjb25zdCBwcmltYXJ5ID0gdGhpcy5lc2NhcGVIdG1sIChwcmltYXJ5UmF3ICE9IG51bGwgJiYgcHJpbWFyeVJhdyAhPT0gXCJcIiA/IHByaW1hcnlSYXcgOiAocm93LmlkIHx8IFwiXCIpKTtcblx0XHRjb25zdCBzdWJsaW5lUmF3ID0gdGhpcy5zdWJsaW5lX2ZpZWxkID8gcm93W3RoaXMuc3VibGluZV9maWVsZF0gOiBcIlwiO1xuXHRcdGNvbnN0IHN1YmxpbmUgPSBzdWJsaW5lUmF3ID8gYDxkaXYgY2xhc3M9XCJmbC1jYXJkLXJvdy1zdWIgdGV4dC1tdXRlZCBzbWFsbFwiPiR7dGhpcy5lc2NhcGVIdG1sIChzdWJsaW5lUmF3KX08L2Rpdj5gIDogXCJcIjtcblxuXHRcdGNvbnN0IGlubmVyID0gYFxuXHRcdFx0PGRpdiBjbGFzcz1cImZsLWNhcmQtcm93LW1haW5cIj5cblx0XHRcdFx0PGRpdiBjbGFzcz1cImZsLWNhcmQtcm93LWxhYmVsXCI+JHtwcmltYXJ5fTwvZGl2PlxuXHRcdFx0XHQke3N1YmxpbmV9XG5cdFx0XHQ8L2Rpdj5cblx0XHRcdDxkaXYgY2xhc3M9XCJmbC1jYXJkLXJvdy1hY3Rpb25zXCI+JHt0aGlzLmludGVycG9sYXRlICh0aGlzLnJvd19hY3Rpb25zLCByb3cpfTwvZGl2PmA7XG5cblx0XHRpZiAodGhpcy5kZXRhaWxfcm91dGUpXG5cdFx0e1xuXHRcdFx0Y29uc3QgaHJlZiA9IHRoaXMuaW50ZXJwb2xhdGUgKHRoaXMuZGV0YWlsX3JvdXRlLCByb3cpO1xuXHRcdFx0cmV0dXJuIGA8YSBocmVmPVwiJHtocmVmfVwiIGNsYXNzPVwiZmwtY2FyZC1yb3cgZmwtY2FyZC1yb3ctbGluayBsaXN0LWdyb3VwLWl0ZW0gbGlzdC1ncm91cC1pdGVtLWFjdGlvblwiPiR7aW5uZXJ9PC9hPmA7XG5cdFx0fVxuXHRcdHJldHVybiBgPGRpdiBjbGFzcz1cImZsLWNhcmQtcm93IGxpc3QtZ3JvdXAtaXRlbVwiPiR7aW5uZXJ9PC9kaXY+YDtcblx0fVxuXG5cdG91dHB1dCAoKTogc3RyaW5nIHwgSG90Q29tcG9uZW50T3V0cHV0W11cblx0e1xuXHRcdGlmICh0aGlzLm5hbWUgPT09IFwiXCIpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKFwiYWRtaW4tY2FyZC10YWJsZTogaWQgKG5hbWUpIGlzIHJlcXVpcmVkXCIpO1xuXHRcdGlmICh0aGlzLmxpc3RfdXJsID09PSBcIlwiKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChcImFkbWluLWNhcmQtdGFibGU6IGhvdC1saXN0LXVybCBpcyByZXF1aXJlZFwiKTtcblxuXHRcdGNvbnN0IHRpdGxlSHRtbCA9IHRoaXMudGl0bGUgPyBgPHN0cm9uZz4ke3RoaXMudGl0bGV9PC9zdHJvbmc+YCA6IFwiXCI7XG5cdFx0Y29uc3QgYWRkU2xvdEF0dHIgPSB0aGlzLmFkZF9zbG90ID8gYCBkYXRhLWNhcmQtdGFibGUtYWRkLXNsb3Q9XCIke3RoaXMuYWRkX3Nsb3R9XCJgIDogYCBkYXRhLWNhcmQtdGFibGUtYWRkLXNsb3Q9XCIke3RoaXMubmFtZX1cImA7XG5cblx0XHRyZXR1cm4gKGBcblx0XHRcdDxkaXYgaWQ9XCIke3RoaXMubmFtZX1cIiBjbGFzcz1cImNhcmQgZmwtY2FyZC10YWJsZSBtYi00XCI+XG5cdFx0XHRcdDxkaXYgY2xhc3M9XCJjYXJkLWhlYWRlciBkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyXCI+XG5cdFx0XHRcdFx0JHt0aXRsZUh0bWx9XG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cImZsLWNhcmQtdGFibGUtYWN0aW9uc1wiJHthZGRTbG90QXR0cn0+PC9kaXY+XG5cdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwiZmwtY2FyZC1saXN0IGxpc3QtZ3JvdXAgbGlzdC1ncm91cC1mbHVzaFwiPlxuXHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJ0ZXh0LW11dGVkIHNtYWxsIHRleHQtY2VudGVyIHB5LTRcIj4ke3RoaXMubG9hZGluZ190ZXh0fTwvZGl2PlxuXHRcdFx0XHQ8L2Rpdj5cblx0XHRcdDwvZGl2PmApO1xuXHR9XG59XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGJvb3RzdHJhcDsiLCJpbXBvcnQgeyBIb3RTdGFxLCBIb3QsIEhvdEFQSSwgSG90Q29tcG9uZW50LCBIb3RDb21wb25lbnRPdXRwdXQgfSBmcm9tIFwiaG90c3RhcVwiO1xuXG5pbXBvcnQgYm9vdHN0cmFwIGZyb20gXCJib290c3RyYXBcIjtcblxuaW1wb3J0IHsgQWRtaW5UYWJsZSB9IGZyb20gXCIuL2FkbWluLXRhYmxlXCI7XG5cbmV4cG9ydCBjbGFzcyBBZG1pbkVkaXQgZXh0ZW5kcyBIb3RDb21wb25lbnRcbntcblx0LyoqXG5cdCAqIFRoZSB0aXRsZSBvZiB0aGlzIGVkaXQgbW9kYWwuXG5cdCAqL1xuXHR0aXRsZTogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIGJ1dHRvbiB0aXRsZS5cblx0ICovXG5cdGJ1dHRvbl90aXRsZTogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIGF0dGFjaGVkIGxpc3QuXG5cdCAqL1xuXHRhdHRhY2hlZF9saXN0OiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgYXR0YWNoZWQgc2NoZW1hLlxuXHQgKi9cblx0c2NoZW1hOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgbW9kYWwgaWQuXG5cdCAqL1xuXHRtb2RhbElkOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgdGV4dCBmb3IgdGhlIGFkZCBidXR0b24uXG5cdCAqL1xuXHRhZGRfdGV4dDogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIGxvY2F0aW9uIHRvIHB1dCB0aGUgYWRkIGJ1dHRvbi5cblx0ICovXG5cdGFkZF9wbGFjZV9oZXJlOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgdGV4dCBmb3IgdGhlIGVkaXQgYnV0dG9uLlxuXHQgKi9cblx0ZWRpdF90ZXh0OiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgbG9jYXRpb24gdG8gcHV0IHRoZSBlZGl0IGJ1dHRvbi5cblx0ICovXG5cdGVkaXRfcGxhY2VfaGVyZTogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIHRleHQgZm9yIHRoZSByZW1vdmUgYnV0dG9uLlxuXHQgKi9cblx0cmVtb3ZlX3RleHQ6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBsb2NhdGlvbiB0byBwdXQgdGhlIHJlbW92ZSBidXR0b24uXG5cdCAqL1xuXHRyZW1vdmVfcGxhY2VfaGVyZTogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIGhvdC1jbGFzcyBhdHRyaWJ1dGUgdG8gcGFzcyB0byBhZGQgdG8gdGhlIG1vZGFsJ3MgY2xhc3Nlcy5cblx0ICovXG5cdGNzc19jbGFzczogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIGJvb3RzdHJhcCBtb2RhbCBpbnN0YW5jZS5cblx0ICovXG5cdG1vZGFsOiBib290c3RyYXAuTW9kYWw7XG5cdC8qKlxuXHQgKiBJZiBzZXQgdG8gdHJ1ZSwgdGhpcyB3aWxsIGNsb3NlIHRoZSBtb2RhbCB3aGVuIHNhdmUgaXMgY2xpY2tlZC5cblx0ICovXG5cdGNsb3NlT25TYXZlOiBib29sZWFuO1xuXHQvKipcblx0ICogVGhlIHR5cGUgb2YgbW9kYWwgdG8gb3Blbi4gQ2FuIGJlOlxuXHQgKiAqIGFkZFxuXHQgKiAqIGVkaXRcblx0ICogKiByZW1vdmVcblx0ICovXG5cdHByb3RlY3RlZCBtb2RhbFR5cGU6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBzZWxlY3RlZCBmaWVsZHMuXG5cdCAqL1xuXHRwcm90ZWN0ZWQgc2VsZWN0ZWRGaWVsZHM6IGFueVtdO1xuXHQvKipcblx0ICogV2hhdCB0byBleGVjdXRlIHdoZW4gdGhlIHNhdmUgYnV0dG9uIGlzIGNsaWNrZWQuIElmIHRoaXMgcmV0dXJucyB0cnVlLCB0aGUgbW9kYWwgd2lsbCBjbG9zZS5cblx0ICogSWYgdGhpcyByZXR1cm5zIGZhbHNlLCB0aGUgbW9kYWwgd2lsbCBub3QgY2xvc2UuXG5cdCAqL1xuXHRvbnNhdmU6IChtb2RhbFR5cGU6IHN0cmluZywgdmFsdWVzOiBhbnksIHNlbGVjdGVkRmllbGRzOiBhbnlbXSkgPT4gUHJvbWlzZTxib29sZWFuPjtcblx0LyoqXG5cdCAqIFdoYXQgdG8gZXhlY3V0ZSB3aGVuIHRoZSBlZGl0IGJ1dHRvbiBpcyBjbGlja2VkLlxuXHQgKi9cblx0b25hZGQ6IChtb2RhbFR5cGU6IHN0cmluZywgc2VsZWN0ZWRGaWVsZHM6IGFueVtdKSA9PiBQcm9taXNlPGJvb2xlYW4+O1xuXHQvKipcblx0ICogV2hhdCB0byBleGVjdXRlIHdoZW4gdGhlIGVkaXQgYnV0dG9uIGlzIGNsaWNrZWQuXG5cdCAqL1xuXHRvbmVkaXQ6IChtb2RhbFR5cGU6IHN0cmluZywgc2VsZWN0ZWRGaWVsZHM6IGFueVtdKSA9PiBQcm9taXNlPGJvb2xlYW4+O1xuXHQvKipcblx0ICogV2hhdCB0byBleGVjdXRlIHdoZW4gdGhlIGRlbGV0ZSBidXR0b24gaXMgY2xpY2tlZC5cblx0ICovXG5cdG9uZGVsZXRlOiAoc2VsZWN0ZWRGaWVsZDogYW55KSA9PiBQcm9taXNlPHZvaWQ+O1xuXG5cdGNvbnN0cnVjdG9yIChjb3B5OiBIb3RDb21wb25lbnQgfCBIb3RTdGFxLCBhcGk6IEhvdEFQSSlcblx0e1xuXHRcdHN1cGVyIChjb3B5LCBhcGkpO1xuXG5cdFx0dGhpcy50YWcgPSBcImFkbWluLWVkaXRcIjtcblx0XHR0aGlzLnRpdGxlID0gXCJcIjtcblx0XHR0aGlzLmJ1dHRvbl90aXRsZSA9IFwiU2F2ZVwiO1xuXHRcdHRoaXMuYXR0YWNoZWRfbGlzdCA9IFwiXCI7XG5cdFx0dGhpcy5zY2hlbWEgPSBcIlwiO1xuXG5cdFx0dGhpcy5tb2RhbElkID0gXCJcIjtcblx0XHR0aGlzLmFkZF90ZXh0ID0gXCJBZGRcIjtcblx0XHR0aGlzLmFkZF9wbGFjZV9oZXJlID0gXCJkYXNoYm9hcmRIZWFkZXJcIjtcblx0XHR0aGlzLmVkaXRfdGV4dCA9IFwiRWRpdFwiO1xuXHRcdHRoaXMuZWRpdF9wbGFjZV9oZXJlID0gXCJkYXNoYm9hcmRIZWFkZXJcIjtcblx0XHR0aGlzLnJlbW92ZV90ZXh0ID0gXCJSZW1vdmVcIjtcblx0XHR0aGlzLnJlbW92ZV9wbGFjZV9oZXJlID0gXCJkYXNoYm9hcmRIZWFkZXJcIjtcblx0XHR0aGlzLmNzc19jbGFzcyA9IFwiXCI7XG5cdFx0dGhpcy5tb2RhbCA9IG51bGw7XG5cdFx0dGhpcy5tb2RhbFR5cGUgPSBcImFkZFwiO1xuXHRcdHRoaXMuY2xvc2VPblNhdmUgPSB0cnVlO1xuXHRcdHRoaXMuc2VsZWN0ZWRGaWVsZHMgPSBbXTtcblx0XHR0aGlzLm9uc2F2ZSA9IG51bGw7XG5cdFx0dGhpcy5vbmVkaXQgPSBudWxsO1xuXHRcdHRoaXMub25kZWxldGUgPSBudWxsO1xuXHR9XG5cblx0LyoqXG5cdCAqIFByb2Nlc3MgdGhlIGhvdCBmaWVsZHMuXG5cdCAqL1xuXHRhc3luYyBwcm9jZXNzSG90RmllbGRzIChvbkZpZWxkOiAoaHRtbEVsZW1lbnQ6IEVsZW1lbnQsIFxuXHRcdGZpZWxkOiB7IG5hbWU6IHN0cmluZzsgdHlwZTogc3RyaW5nOyBpbnB1dDogc3RyaW5nOyB9KSA9PiBQcm9taXNlPHZvaWQ+KTogUHJvbWlzZTx2b2lkPlxuXHR7XG5cdFx0Y29uc3QgZWxtcyA9IHRoaXMuaHRtbEVsZW1lbnRzWzFdLnF1ZXJ5U2VsZWN0b3JBbGwgKFwiW2hvdC1maWVsZF1cIik7XG5cblx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IGVsbXMubGVuZ3RoOyBpSWR4KyspXG5cdFx0e1xuXHRcdFx0Y29uc3QgZWxtID0gZWxtc1tpSWR4XTtcblx0XHRcdGNvbnN0IGZpZWxkID0gJChlbG0pLmF0dHIgKFwiaG90LWZpZWxkXCIpO1xuXHRcdFx0bGV0IGZpZWxkVHlwZSA9ICQoZWxtKS5hdHRyIChcImhvdC1maWVsZC10eXBlXCIpO1xuXHRcdFx0bGV0IGZpZWxkSW5wdXQgPSAkKGVsbSkuYXR0ciAoXCJob3QtZmllbGQtaW5wdXRcIik7XG5cblx0XHRcdGlmICgoZmllbGRUeXBlID09IG51bGwpIHx8IChmaWVsZFR5cGUgPT09IFwiXCIpKVxuXHRcdFx0XHRmaWVsZFR5cGUgPSBcInRleHRcIjtcblxuXHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0ZWxtLmZpZWxkVHlwZSA9IGZpZWxkVHlwZTtcblxuXHRcdFx0YXdhaXQgb25GaWVsZCAoZWxtLCB7IG5hbWU6IGZpZWxkLCB0eXBlOiBmaWVsZFR5cGUsIGlucHV0OiBmaWVsZElucHV0IH0pO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgZXZlbnQgdGhhdCBjYW4gYmUgY2FsbGVkIHdoZW4gdGhlIGFkZCBidXR0b24gaXMgY2xpY2tlZC5cblx0ICogVGhpcyBpcyBjYWxsZWQgYmVmb3JlIHRoZSBhZGQgbW9kYWwgb3BlbnMuXG5cdCAqL1xuXHRvbkFkZENsaWNrZWQ6ICgpID0+IFByb21pc2U8Ym9vbGVhbj4gPSBudWxsO1xuXG5cdC8qKlxuXHQgKiBFeGVjdXRlcyB3aGVuIHRoZSBhZGQgYnV0dG9uIGlzIGNsaWNrZWQuXG5cdCAqL1xuXHRhc3luYyBhZGRDbGlja2VkIChzZWxlY3RlZEZpZWxkczogYW55W10gPSBbXSk6IFByb21pc2U8dm9pZD5cblx0e1xuXHRcdGlmICh0aGlzLm9uQWRkQ2xpY2tlZCAhPSBudWxsKVxuXHRcdHtcblx0XHRcdGxldCByZXN1bHQgPSBhd2FpdCB0aGlzLm9uQWRkQ2xpY2tlZCAoKTtcblxuXHRcdFx0aWYgKHJlc3VsdCA9PT0gZmFsc2UpXG5cdFx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR0aGlzLm1vZGFsVHlwZSA9IFwiYWRkXCI7XG5cblx0XHRhd2FpdCB0aGlzLnByb2Nlc3NIb3RGaWVsZHMgKFxuXHRcdFx0YXN5bmMgKGh0bWxFbGVtZW50OiBFbGVtZW50LCBmaWVsZDogeyBuYW1lOiBzdHJpbmc7IHR5cGU6IHN0cmluZzsgfSkgPT5cblx0XHRcdHtcblx0XHRcdFx0JChodG1sRWxlbWVudCkudmFsIChcIlwiKTtcblx0XHRcdH0pO1xuXG5cdFx0dGhpcy5zZWxlY3RlZEZpZWxkcyA9IHNlbGVjdGVkRmllbGRzO1xuXG5cdFx0aWYgKHRoaXMub25hZGQgIT0gbnVsbClcblx0XHR7XG5cdFx0XHRpZiAodHlwZW9mICh0aGlzLm9uYWRkKSA9PT0gXCJzdHJpbmdcIilcblx0XHRcdFx0dGhpcy5vbmFkZCA9ICg8KG1vZGFsVHlwZTogc3RyaW5nLCBzZWxlY3RlZEZpZWxkczogYW55W10pID0+IFByb21pc2U8Ym9vbGVhbj4+bmV3IEZ1bmN0aW9uICh0aGlzLm9uYWRkKSk7XG5cblx0XHRcdGxldCByZXN1bHQgPSBhd2FpdCB0aGlzLm9uYWRkICh0aGlzLm1vZGFsVHlwZSwgdGhpcy5zZWxlY3RlZEZpZWxkcyk7XG5cblx0XHRcdGlmIChyZXN1bHQgIT0gbnVsbClcblx0XHRcdHtcblx0XHRcdFx0aWYgKHJlc3VsdCA9PT0gZmFsc2UpXG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGJvb3RzdHJhcC5Nb2RhbC5nZXRJbnN0YW5jZSAoYCMke3RoaXMubW9kYWxJZH1gKS5zaG93ICgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSBldmVudCB0aGF0IGNhbiBiZSBjYWxsZWQgd2hlbiB0aGUgZWRpdCBidXR0b24gaXMgY2xpY2tlZC5cblx0ICogVGhpcyBpcyBjYWxsZWQgYmVmb3JlIHRoZSBlZGl0IG1vZGFsIG9wZW5zLlxuXHQgKi9cblx0b25FZGl0Q2xpY2tlZDogKGNsaWNrZWRUYWJsZT86IHN0cmluZywgc2VsZWN0ZWRGaWVsZHM/OiBhbnlbXSkgPT4gUHJvbWlzZTxib29sZWFuPiA9IG51bGw7XG5cblx0LyoqXG5cdCAqIEdldCB0aGUgYXR0YWNoZWQgbGlzdHMuXG5cdCAqL1xuXHRnZXRBdHRhY2hlZEhUTUxMaXN0cyAoKTogSFRNTEVsZW1lbnRbXVxuXHR7XG5cdFx0Y29uc3Qgc3RycyA9IHRoaXMuYXR0YWNoZWRfbGlzdC5zcGxpdCAoXCIsXCIpO1xuXHRcdGNvbnN0IGF0dGFjaGVkTGlzdHM6IEhUTUxFbGVtZW50W10gPSBbXTtcblxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgc3Rycy5sZW5ndGg7IGkrKylcblx0XHR7XG5cdFx0XHRjb25zdCBhdHRhY2hlZExpc3QgPSBzdHJzW2ldO1xuXHRcdFx0bGV0IGF0dGFjaGVkTGlzdE9iaiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkIChhdHRhY2hlZExpc3QpO1xuXHRcdFx0YXR0YWNoZWRMaXN0cy5wdXNoIChhdHRhY2hlZExpc3RPYmopO1xuXHRcdH1cblxuXHRcdHJldHVybiAoYXR0YWNoZWRMaXN0cyk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IHRoZSBhdHRhY2hlZCBsaXN0cy5cblx0ICovXG5cdGdldEF0dGFjaGVkTGlzdHMgKCk6IEhvdENvbXBvbmVudFtdXG5cdHtcblx0XHRjb25zdCBhdHRhY2hlZExpc3RzID0gdGhpcy5nZXRBdHRhY2hlZEhUTUxMaXN0cyAoKTtcblx0XHRsZXQgYXR0YWNoZWRMaXN0T2JqcyA9IFtdO1xuXG5cdFx0Zm9yIChsZXQgaUlkeCA9IDA7IGlJZHggPCBhdHRhY2hlZExpc3RzLmxlbmd0aDsgaUlkeCsrKVxuXHRcdHtcblx0XHRcdGxldCBhdHRhY2hlZExpc3QgPSBhdHRhY2hlZExpc3RzW2lJZHhdO1xuXHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0Y29uc3QgaG90Q29tcG9uZW50ID0gYXR0YWNoZWRMaXN0LmhvdENvbXBvbmVudDtcblxuXHRcdFx0YXR0YWNoZWRMaXN0T2Jqcy5wdXNoIChob3RDb21wb25lbnQpO1xuXHRcdH1cblxuXHRcdHJldHVybiAoYXR0YWNoZWRMaXN0T2Jqcyk7XG5cdH1cblxuXHQvKipcblx0ICogRXhlY3V0ZXMgd2hlbiB0aGUgZWRpdCBidXR0b24gaXMgY2xpY2tlZC5cblx0ICovXG5cdGFzeW5jIGVkaXRDbGlja2VkIChjbGlja2VkVGFibGU6IHN0cmluZyA9IG51bGwsIHNlbGVjdGVkRmllbGRzOiBhbnlbXSA9IFtdKTogUHJvbWlzZTx2b2lkPlxuXHR7XG5cdFx0aWYgKHRoaXMub25FZGl0Q2xpY2tlZCAhPSBudWxsKVxuXHRcdHtcblx0XHRcdGxldCByZXN1bHQgPSBhd2FpdCB0aGlzLm9uRWRpdENsaWNrZWQgKGNsaWNrZWRUYWJsZSwgc2VsZWN0ZWRGaWVsZHMpO1xuXG5cdFx0XHRpZiAocmVzdWx0ID09PSBmYWxzZSlcblx0XHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHRoaXMubW9kYWxUeXBlID0gXCJlZGl0XCI7XG5cblx0XHR0aGlzLnNlbGVjdGVkRmllbGRzID0gc2VsZWN0ZWRGaWVsZHM7XG5cblx0XHRpZiAodGhpcy5hdHRhY2hlZF9saXN0ICE9PSBcIlwiKVxuXHRcdHtcblx0XHRcdGNvbnN0IGF0dGFjaGVkTGlzdHMgPSB0aGlzLmdldEF0dGFjaGVkTGlzdHMgKCk7XG5cblx0XHRcdGZvciAobGV0IGlJZHggPSAwOyBpSWR4IDwgYXR0YWNoZWRMaXN0cy5sZW5ndGg7IGlJZHgrKylcblx0XHRcdHtcblx0XHRcdFx0bGV0IGF0dGFjaGVkTGlzdCA9IGF0dGFjaGVkTGlzdHNbaUlkeF07XG5cdFx0XHRcdGxldCB0YWJsZTogQWRtaW5UYWJsZSA9ICg8QWRtaW5UYWJsZT5hdHRhY2hlZExpc3QpO1xuXG5cdFx0XHRcdGlmIChjbGlja2VkVGFibGUgIT0gbnVsbClcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGlmICh0YWJsZS5uYW1lICE9PSBjbGlja2VkVGFibGUpXG5cdFx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRhYmxlLmF0dGFjaGVkRWRpdCA9IHRoaXM7XG5cdFx0XHRcdGxldCBzZWxlY3RlZEZpZWxkID0gdGFibGUuZ2V0U2VsZWN0ZWQgKCk7XG5cblx0XHRcdFx0aWYgKHNlbGVjdGVkRmllbGQgIT0gbnVsbClcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGF3YWl0IHRoaXMucHJvY2Vzc0hvdEZpZWxkcyAoXG5cdFx0XHRcdFx0XHRhc3luYyAoaHRtbEVsZW1lbnQ6IEVsZW1lbnQsIGZpZWxkOiB7IG5hbWU6IHN0cmluZzsgdHlwZTogc3RyaW5nOyBpbnB1dDogc3RyaW5nOyB9KSA9PlxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHRcdFx0XHRcdGxldCB2YWx1ZSA9IHNlbGVjdGVkRmllbGRbZmllbGQubmFtZV07XG5cblx0XHRcdFx0XHRcdFx0aWYgKGZpZWxkLmlucHV0ICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRpZiAoZmllbGQuaW5wdXQgIT09IFwiXCIpXG5cdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0bGV0IGZ1bmMgPSBuZXcgRnVuY3Rpb24gKGZpZWxkLmlucHV0KTtcblx0XHRcdFx0XHRcdFx0XHRcdHZhbHVlID0gYXdhaXQgZnVuYy5jYWxsICh0aGlzLCB0aGlzLCBodG1sRWxlbWVudCwgdmFsdWUpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdGlmICh2YWx1ZSAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdCQoaHRtbEVsZW1lbnQpLnZhbCAodmFsdWUpO1xuXHRcdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0XHR0aGlzLnNlbGVjdGVkRmllbGRzID0gW3NlbGVjdGVkRmllbGRdO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMub25lZGl0ICE9IG51bGwpXG5cdFx0e1xuXHRcdFx0aWYgKHR5cGVvZiAodGhpcy5vbmVkaXQpID09PSBcInN0cmluZ1wiKVxuXHRcdFx0XHR0aGlzLm9uZWRpdCA9ICg8KG1vZGFsVHlwZTogc3RyaW5nLCBzZWxlY3RlZEZpZWxkczogYW55W10pID0+IFByb21pc2U8Ym9vbGVhbj4+bmV3IEZ1bmN0aW9uICh0aGlzLm9uZWRpdCkpO1xuXG5cdFx0XHRsZXQgcmVzdWx0ID0gYXdhaXQgdGhpcy5vbmVkaXQgKHRoaXMubW9kYWxUeXBlLCB0aGlzLnNlbGVjdGVkRmllbGRzKTtcblxuXHRcdFx0aWYgKHJlc3VsdCAhPSBudWxsKVxuXHRcdFx0e1xuXHRcdFx0XHRpZiAocmVzdWx0ID09PSBmYWxzZSlcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ym9vdHN0cmFwLk1vZGFsLmdldEluc3RhbmNlIChgIyR7dGhpcy5tb2RhbElkfWApLnNob3cgKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIGV2ZW50IHRoYXQgY2FuIGJlIGNhbGxlZCB3aGVuIHRoZSByZW1vdmUgYnV0dG9uIGlzIGNsaWNrZWQuXG5cdCAqIFRoaXMgaXMgY2FsbGVkIGJlZm9yZSB0aGUgcmVtb3ZlIG1vZGFsIG9wZW5zLlxuXHQgKi9cblx0b25SZW1vdmVDbGlja2VkOiAoKSA9PiBQcm9taXNlPGJvb2xlYW4+ID0gbnVsbDtcblxuXHQvKipcblx0ICogRXhlY3V0ZXMgd2hlbiB0aGUgcmVtb3ZlIGJ1dHRvbiBpcyBjbGlja2VkLlxuXHQgKi9cblx0YXN5bmMgcmVtb3ZlQ2xpY2tlZCAoKTogUHJvbWlzZTx2b2lkPlxuXHR7XG5cdFx0aWYgKHRoaXMub25SZW1vdmVDbGlja2VkICE9IG51bGwpXG5cdFx0e1xuXHRcdFx0bGV0IHJlc3VsdCA9IGF3YWl0IHRoaXMub25SZW1vdmVDbGlja2VkICgpO1xuXG5cdFx0XHRpZiAocmVzdWx0ID09PSBmYWxzZSlcblx0XHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHRoaXMubW9kYWxUeXBlID0gXCJyZW1vdmVcIjtcblxuXHRcdGxldCB3aGVyZUZpZWxkczogYW55W10gPSBbXTtcblx0XHRsZXQgaG90Q29tcG9uZW50OiBBZG1pblRhYmxlID0gbnVsbDtcblxuXHRcdGlmICh0aGlzLmF0dGFjaGVkX2xpc3QgIT09IFwiXCIpXG5cdFx0e1xuXHRcdFx0Y29uc3QgYXR0YWNoZWRMaXN0cyA9IHRoaXMuZ2V0QXR0YWNoZWRMaXN0cyAoKTtcblxuXHRcdFx0Zm9yIChsZXQgaUlkeCA9IDA7IGlJZHggPCBhdHRhY2hlZExpc3RzLmxlbmd0aDsgaUlkeCsrKVxuXHRcdFx0e1xuXHRcdFx0XHRsZXQgYXR0YWNoZWRMaXN0ID0gYXR0YWNoZWRMaXN0c1tpSWR4XTtcblx0XHRcdFx0aG90Q29tcG9uZW50ID0gKDxBZG1pblRhYmxlPmF0dGFjaGVkTGlzdCk7XG5cblx0XHRcdFx0aG90Q29tcG9uZW50LmF0dGFjaGVkRWRpdCA9IHRoaXM7XG5cdFx0XHRcdGxldCBjaGVja2VkUm93cyA9IGhvdENvbXBvbmVudC5nZXRDaGVja2VkUm93cyAoKTtcblxuXHRcdFx0XHRpZiAoY2hlY2tlZFJvd3MubGVuZ3RoID4gMClcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgY2hlY2tlZFJvd3MubGVuZ3RoOyBpKyspXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bGV0IGNoZWNrZWRSb3cgPSBjaGVja2VkUm93c1tpXTtcblx0XHRcdFx0XHRcdHdoZXJlRmllbGRzLnB1c2ggKGNoZWNrZWRSb3cpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGxldCBzZWxlY3RlZEZpZWxkID0gaG90Q29tcG9uZW50LmdldFNlbGVjdGVkICgpO1xuXG5cdFx0XHRcdGlmIChzZWxlY3RlZEZpZWxkICE9IG51bGwpXG5cdFx0XHRcdFx0d2hlcmVGaWVsZHMgPSBbc2VsZWN0ZWRGaWVsZF07XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Y29uc3QgY29uZmlybWVkOiBib29sZWFuID0gY29uZmlybSAoXCJBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gcmVtb3ZlIHRoaXMgaXRlbT9cIik7XG5cblx0XHRpZiAoY29uZmlybWVkID09PSB0cnVlKVxuXHRcdHtcblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgd2hlcmVGaWVsZHMubGVuZ3RoOyBpKyspXG5cdFx0XHR7XG5cdFx0XHRcdGxldCB3aGVyZUZpZWxkID0gd2hlcmVGaWVsZHNbaV07XG5cblx0XHRcdFx0aWYgKGhvdENvbXBvbmVudCAhPSBudWxsKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0Ly8gUmVtb3ZlIGFueSBmaWVsZHMgdGhhdCBhcmUgbWFya2VkIGFzIHJlbW92ZS5cblx0XHRcdFx0XHRmb3IgKGxldCBrZXkgaW4gd2hlcmVGaWVsZClcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsZXQgZmllbGRUeXBlID0gaG90Q29tcG9uZW50LmdldEZpZWxkVHlwZSAoa2V5KTtcblxuXHRcdFx0XHRcdFx0aWYgKGZpZWxkVHlwZSAhPSBudWxsKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRpZiAoZmllbGRUeXBlID09PSBcInJlbW92ZVwiKVxuXHRcdFx0XHRcdFx0XHRcdGRlbGV0ZSB3aGVyZUZpZWxkW2tleV07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKHRoaXMub25kZWxldGUgIT0gbnVsbClcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGlmICh0eXBlb2YgKHRoaXMub25kZWxldGUpID09PSBcInN0cmluZ1wiKVxuXHRcdFx0XHRcdFx0dGhpcy5vbmRlbGV0ZSA9ICg8KHNlbGVjdGVkRmllbGQ6IGFueSkgPT4gUHJvbWlzZTx2b2lkPj5uZXcgRnVuY3Rpb24gKHRoaXMub25kZWxldGUpKTtcblxuXHRcdFx0XHRcdGF3YWl0IHRoaXMub25kZWxldGUgKHdoZXJlRmllbGQpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxldCByZW1vdmVVcmw6IHN0cmluZyA9IEhvdC5EYXRhLkFkbWluUGFuZWwucmVtb3ZlVXJsO1xuXG5cdFx0XHRcdFx0YXdhaXQgSG90Lmpzb25SZXF1ZXN0IChyZW1vdmVVcmwsIHtcblx0XHRcdFx0XHRcdFx0c2NoZW1hOiB0aGlzLnNjaGVtYSxcblx0XHRcdFx0XHRcdFx0d2hlcmVGaWVsZHM6IHdoZXJlRmllbGRcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGlmICh3aGVyZUZpZWxkcy5sZW5ndGggPT09IDApXG5cdFx0XHR7XG5cdFx0XHRcdGlmICh0aGlzLm9uZGVsZXRlICE9IG51bGwpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRpZiAodHlwZW9mICh0aGlzLm9uZGVsZXRlKSA9PT0gXCJzdHJpbmdcIilcblx0XHRcdFx0XHRcdHRoaXMub25kZWxldGUgPSAoPChzZWxlY3RlZEZpZWxkOiBhbnkpID0+IFByb21pc2U8dm9pZD4+bmV3IEZ1bmN0aW9uICh0aGlzLm9uZGVsZXRlKSk7XG5cblx0XHRcdFx0XHRhd2FpdCB0aGlzLm9uZGVsZXRlIChudWxsKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsZXQgcmVtb3ZlVXJsOiBzdHJpbmcgPSBIb3QuRGF0YS5BZG1pblBhbmVsLnJlbW92ZVVybDtcblxuXHRcdFx0XHRcdGF3YWl0IEhvdC5qc29uUmVxdWVzdCAocmVtb3ZlVXJsLCB7XG5cdFx0XHRcdFx0XHRcdHNjaGVtYTogdGhpcy5zY2hlbWEsXG5cdFx0XHRcdFx0XHRcdHdoZXJlRmllbGRzOiBudWxsXG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcblx0XHRcdGlmIChob3RDb21wb25lbnQgIT0gbnVsbClcblx0XHRcdHtcblx0XHRcdFx0Y29uc3QgY3VycmVudERhdGEgPSBhd2FpdCBob3RDb21wb25lbnQucmVmcmVzaExpc3QgKCk7XG5cdFx0XHRcdGNvbnN0IHByZXBhcmVkRGF0YSA9IGhvdENvbXBvbmVudC5wcmVwYXJlRGF0YSAoY3VycmVudERhdGEpO1xuXG5cdFx0XHRcdGhvdENvbXBvbmVudC50YWJsZUNhbGxiYWNrIChwcmVwYXJlZERhdGEpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBTYXZlIHRoaXMgZm9ybS5cblx0ICovXG5cdGFzeW5jIG9uU2F2ZSAoKVxuXHR7XG5cdFx0bGV0IHZhbHVlczogYW55ID0ge307XG5cblx0XHRhd2FpdCB0aGlzLnByb2Nlc3NIb3RGaWVsZHMgKGFzeW5jIChodG1sRWxlbWVudDogRWxlbWVudCwgZmllbGQ6IHsgbmFtZTogc3RyaW5nOyB0eXBlOiBzdHJpbmc7IH0pID0+XG5cdFx0XHR7XG5cdFx0XHRcdGlmIChmaWVsZC50eXBlID09PSBcInJlbW92ZVwiKVxuXHRcdFx0XHRcdHJldHVybjtcblxuXHRcdFx0XHRsZXQgdmFsdWUgPSAkKGh0bWxFbGVtZW50KS52YWwgKCk7XG5cblx0XHRcdFx0aWYgKCQoaHRtbEVsZW1lbnQpLmF0dHIgKFwiaG90LXZhbHVlXCIpICE9IG51bGwpXG5cdFx0XHRcdFx0dmFsdWUgPSAkKGh0bWxFbGVtZW50KS5hdHRyIChcImhvdC12YWx1ZVwiKTtcblxuXHRcdFx0XHRpZiAoJChodG1sRWxlbWVudCkuYXR0ciAoXCJob3QtZmllbGQtc2F2ZVwiKSAhPSBudWxsKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGV0IGZpZWxkU2F2ZSA9ICQoaHRtbEVsZW1lbnQpLmF0dHIgKFwiaG90LWZpZWxkLXNhdmVcIik7XG5cblx0XHRcdFx0XHRpZiAoZmllbGRTYXZlICE9IG51bGwpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0aWYgKGZpZWxkU2F2ZSAhPT0gXCJcIilcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0bGV0IGZ1bmMgPSBuZXcgRnVuY3Rpb24gKGZpZWxkU2F2ZSk7XG5cdFx0XHRcdFx0XHRcdHZhbHVlID0gYXdhaXQgZnVuYy5jYWxsICh0aGlzLCB0aGlzLCBodG1sRWxlbWVudCwgdmFsdWUpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChmaWVsZC50eXBlID09PSBcImFycmF5XCIpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRpZiAodmFsdWVzW2ZpZWxkLm5hbWVdID09IG51bGwpXG5cdFx0XHRcdFx0XHR2YWx1ZXNbZmllbGQubmFtZV0gPSBbXTtcblxuXHRcdFx0XHRcdHZhbHVlc1tmaWVsZC5uYW1lXS5wdXNoICh2YWx1ZSk7XG5cblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoZmllbGQudHlwZSA9PT0gXCJudW1iZXJcIilcblx0XHRcdFx0e1xuXHRcdFx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdFx0XHR2YWx1ZSA9IHBhcnNlRmxvYXQgKHZhbHVlKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChmaWVsZC50eXBlID09PSBcImludGVnZXJcIilcblx0XHRcdFx0e1xuXHRcdFx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdFx0XHR2YWx1ZSA9IHBhcnNlSW50ICh2YWx1ZSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoKGZpZWxkLnR5cGUgPT09IFwiYm9vbFwiKSB8fCAoZmllbGQudHlwZSA9PT0gXCJib29sZWFuXCIpKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0XHRcdGNvbnN0IGJvb2x2YWwgPSB2YWx1ZS50b0xvd2VyQ2FzZSAoKTtcblxuXHRcdFx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdFx0XHR2YWx1ZSA9IGZhbHNlO1xuXG5cdFx0XHRcdFx0aWYgKChib29sdmFsID09IFwiMVwiKSB8fCAoYm9vbHZhbCA9PSBcInRydWVcIikgfHwgKGJvb2x2YWwgPT0gXCJ5ZXNcIikpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0XHRcdFx0dmFsdWUgPSB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHZhbHVlc1tmaWVsZC5uYW1lXSA9IHZhbHVlO1xuXHRcdFx0fSk7XG5cblx0XHRpZiAodGhpcy5vbnNhdmUgIT0gbnVsbClcblx0XHR7XG5cdFx0XHRpZiAodHlwZW9mICh0aGlzLm9uc2F2ZSkgPT09IFwic3RyaW5nXCIpXG5cdFx0XHRcdHRoaXMub25zYXZlID0gKDwobW9kYWxUeXBlOiBzdHJpbmcsIHZhbHVlczogYW55LCBzZWxlY3RlZEZpZWxkczogYW55W10pID0+IFByb21pc2U8Ym9vbGVhbj4+bmV3IEZ1bmN0aW9uICh0aGlzLm9uc2F2ZSkpO1xuXG5cdFx0XHRsZXQgcmVzdWx0ID0gYXdhaXQgdGhpcy5vbnNhdmUgKHRoaXMubW9kYWxUeXBlLCB2YWx1ZXMsIHRoaXMuc2VsZWN0ZWRGaWVsZHMpO1xuXG5cdFx0XHRpZiAocmVzdWx0ID09PSBmYWxzZSlcblx0XHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRlbHNlXG5cdFx0e1xuXHRcdFx0aWYgKHRoaXMubW9kYWxUeXBlID09PSBcImFkZFwiKVxuXHRcdFx0e1xuXHRcdFx0XHRsZXQgYWRkVXJsOiBzdHJpbmcgPSBIb3QuRGF0YS5BZG1pblBhbmVsLmFkZFVybDtcblxuXHRcdFx0XHRhd2FpdCBIb3QuanNvblJlcXVlc3QgKGFkZFVybCwge1xuXHRcdFx0XHRcdFx0c2NoZW1hOiB0aGlzLnNjaGVtYSxcblx0XHRcdFx0XHRcdGZpZWxkczogdmFsdWVzXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0aGlzLm1vZGFsVHlwZSA9PT0gXCJlZGl0XCIpXG5cdFx0XHR7XG5cdFx0XHRcdGlmICh0aGlzLnNlbGVjdGVkRmllbGRzLmxlbmd0aCA9PT0gMClcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGFsZXJ0IChcIk5vIGl0ZW0ocykgc2VsZWN0ZWQhXCIpO1xuXG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0bGV0IHdoZXJlRmllbGRzOiBhbnkgPSB7fTtcblxuXHRcdFx0XHRhd2FpdCB0aGlzLnByb2Nlc3NIb3RGaWVsZHMgKGFzeW5jIChodG1sRWxlbWVudDogRWxlbWVudCwgZmllbGQ6IHsgbmFtZTogc3RyaW5nOyB0eXBlOiBzdHJpbmc7IH0pID0+XG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0aWYgKGZpZWxkLnR5cGUgPT09IFwicmVtb3ZlXCIpXG5cdFx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcblx0XHRcdFx0XHRcdGxldCB2YWx1ZSA9ICQoaHRtbEVsZW1lbnQpLnZhbCAoKTtcblx0XHRcblx0XHRcdFx0XHRcdGlmICgkKGh0bWxFbGVtZW50KS5hdHRyIChcImhvdC12YWx1ZVwiKSAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHR2YWx1ZSA9ICQoaHRtbEVsZW1lbnQpLmF0dHIgKFwiaG90LXZhbHVlXCIpO1xuXHRcdFxuXHRcdFx0XHRcdFx0aWYgKGZpZWxkLnR5cGUgPT09IFwiYXJyYXlcIilcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0aWYgKHdoZXJlRmllbGRzW2ZpZWxkLm5hbWVdID09IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0d2hlcmVGaWVsZHNbZmllbGQubmFtZV0gPSBbXTtcblx0XHRcblx0XHRcdFx0XHRcdFx0d2hlcmVGaWVsZHNbZmllbGQubmFtZV0ucHVzaCAodmFsdWUpO1xuXHRcdFxuXHRcdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0XHR9XG5cdFx0XG5cdFx0XHRcdFx0XHR3aGVyZUZpZWxkc1tmaWVsZC5uYW1lXSA9IHZhbHVlO1xuXHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdGxldCBlZGl0VXJsOiBzdHJpbmcgPSBIb3QuRGF0YS5BZG1pblBhbmVsLmVkaXRVcmw7XG5cblx0XHRcdFx0YXdhaXQgSG90Lmpzb25SZXF1ZXN0IChlZGl0VXJsLCB7XG5cdFx0XHRcdFx0XHRzY2hlbWE6IHRoaXMuc2NoZW1hLFxuXHRcdFx0XHRcdFx0d2hlcmVGaWVsZHM6IHdoZXJlRmllbGRzLFxuXHRcdFx0XHRcdFx0ZmllbGRzOiB2YWx1ZXNcblx0XHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAodGhpcy5hdHRhY2hlZF9saXN0ICE9PSBcIlwiKVxuXHRcdHtcblx0XHRcdGNvbnN0IGF0dGFjaGVkTGlzdHMgPSB0aGlzLmdldEF0dGFjaGVkTGlzdHMgKCk7XG5cblx0XHRcdGZvciAobGV0IGlJZHggPSAwOyBpSWR4IDwgYXR0YWNoZWRMaXN0cy5sZW5ndGg7IGlJZHgrKylcblx0XHRcdHtcblx0XHRcdFx0bGV0IGF0dGFjaGVkTGlzdCA9IGF0dGFjaGVkTGlzdHNbaUlkeF07XG5cdFx0XHRcdGxldCB0YWJsZTogQWRtaW5UYWJsZSA9ICg8QWRtaW5UYWJsZT5hdHRhY2hlZExpc3QpO1xuXG5cdFx0XHRcdHRhYmxlLmF0dGFjaGVkRWRpdCA9IHRoaXM7XG5cblx0XHRcdFx0Y29uc3QgY3VycmVudERhdGEgPSBhd2FpdCB0YWJsZS5yZWZyZXNoTGlzdCAoKTtcblx0XHRcdFx0Y29uc3QgcHJlcGFyZWREYXRhID0gdGFibGUucHJlcGFyZURhdGEgKGN1cnJlbnREYXRhKTtcblxuXHRcdFx0XHR0YWJsZS50YWJsZUNhbGxiYWNrIChwcmVwYXJlZERhdGEpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICh0aGlzLmNsb3NlT25TYXZlID09PSB0cnVlKVxuXHRcdHtcblx0XHRcdGJvb3RzdHJhcC5Nb2RhbC5nZXRJbnN0YW5jZSAoYCMke3RoaXMubW9kYWxJZH1gKS5oaWRlICgpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgdGhlIGxpc3Qgb2YgZGF0YSBmcm9tIHRoZSBzZXJ2ZXIuXG5cdCAqL1xuXHRvblBvc3RQbGFjZSAocGFyZW50SHRtbEVsZW1lbnQ6IEhUTUxFbGVtZW50LCBodG1sRWxlbWVudDogSFRNTEVsZW1lbnQpOiBIVE1MRWxlbWVudFxuXHR7XG5cdFx0dGhpcy5tb2RhbCA9IG5ldyBib290c3RyYXAuTW9kYWwgKCQoYCMke3RoaXMubW9kYWxJZH1gKVswXSwge1xuXHRcdFx0XHRcImJhY2tkcm9wXCI6IHRydWUsXG5cdFx0XHRcdFwia2V5Ym9hcmRcIjogdHJ1ZSxcblx0XHRcdFx0XCJmb2N1c1wiOiB0cnVlXG5cdFx0XHR9KTtcblxuXHRcdC8vLyBAdG9kbyBGaXggdGhpcyB0ZW1wb3JhcnkgaGFjay4gSSBkb250IGxpa2UgaXQuXG5cdFx0c2V0VGltZW91dCAoKCkgPT5cblx0XHRcdHtcblx0XHRcdFx0aWYgKHRoaXMuYXR0YWNoZWRfbGlzdCAhPT0gXCJcIilcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGNvbnN0IGF0dGFjaGVkTGlzdHMgPSB0aGlzLmdldEF0dGFjaGVkTGlzdHMgKCk7XG5cdFx0XG5cdFx0XHRcdFx0Zm9yIChsZXQgaUlkeCA9IDA7IGlJZHggPCBhdHRhY2hlZExpc3RzLmxlbmd0aDsgaUlkeCsrKVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGxldCBhdHRhY2hlZExpc3QgPSBhdHRhY2hlZExpc3RzW2lJZHhdO1xuXHRcdFx0XHRcdFx0bGV0IHRhYmxlOiBBZG1pblRhYmxlID0gKDxBZG1pblRhYmxlPmF0dGFjaGVkTGlzdCk7XG5cblx0XHRcdFx0XHRcdGlmICh0YWJsZSAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHR0YWJsZS5hdHRhY2hlZEVkaXQgPSB0aGlzO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSwgNTApO1xuXG5cdFx0cmV0dXJuIChudWxsKTtcblx0fVxuXG5cdG91dHB1dCAoKTogc3RyaW5nIHwgSG90Q29tcG9uZW50T3V0cHV0W11cblx0e1xuXHRcdGlmICh0aGlzLm5hbWUgPT09IFwiXCIpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBZb3UgbXVzdCBzcGVjaWZ5IGEgbmFtZSBmb3IgZWFjaCBhZG1pbi1lZGl0IGVsZW1lbnQhYCk7XG5cblx0XHR0aGlzLm1vZGFsSWQgPSBgJHt0aGlzLm5hbWV9TW9kYWxgO1xuXG5cdFx0bGV0IG91dHB1dE9iaiA9IFt7XG5cdFx0XHRodG1sOiBgXG5cdFx0XHQ8IS0tICR7dGhpcy50aXRsZX0gTW9kYWwgU3RhcnQgLS0+XG5cdFx0XHQ8ZGl2IGNsYXNzPVwibW9kYWwgZmFkZSAke3RoaXMuY3NzX2NsYXNzfVwiIGlkPVwiJHt0aGlzLm1vZGFsSWR9XCIgdGFiaW5kZXg9XCItMVwiIGFyaWEtbGFiZWxsZWRieT1cIiR7dGhpcy5uYW1lfU1vZGFsTGFiZWxcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cblx0XHRcdFx0PGRpdiBjbGFzcz1cIm1vZGFsLWRpYWxvZ1wiPlxuXHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50XCI+XG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxuXHRcdFx0XHRcdFx0PGg1IGNsYXNzPVwibW9kYWwtdGl0bGVcIiBpZD1cIiR7dGhpcy5uYW1lfU1vZGFsTGFiZWxcIj4ke3RoaXMudGl0bGV9PC9oNT5cblx0XHRcdFx0XHRcdDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuLWNsb3NlXCIgZGF0YS1icy1kaXNtaXNzPVwibW9kYWxcIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIj48L2J1dHRvbj5cblx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiPlxuXHRcdFx0XHRcdFx0PGhvdC1wbGFjZS1oZXJlIG5hbWUgPSBcIm1vZGFsQm9keVwiIHR5cGUgPSBcIm1vZGFsXCI+PC9ob3QtcGxhY2UtaGVyZT5cblx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCI+XG5cdFx0XHRcdFx0XHQ8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tc2Vjb25kYXJ5XCIgZGF0YS1icy1kaXNtaXNzPVwibW9kYWxcIj5DYW5jZWw8L2J1dHRvbj5cblx0XHRcdFx0XHRcdDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgb25jbGljayA9IFwiZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJyR7dGhpcy5tb2RhbElkfScpLm9uU2F2ZSAoKTtcIj4ke3RoaXMuYnV0dG9uX3RpdGxlfTwvYnV0dG9uPlxuXHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHQ8L2Rpdj5cblx0XHRcdDwvZGl2PlxuXHRcdFx0PCEtLSAke3RoaXMudGl0bGV9IE1vZGFsIEVuZCAtLT5gLFxuXHRcdFx0ZG9jdW1lbnRTZWxlY3RvcjogXCJib2R5XCJcblx0XHR9XTtcblxuXHRcdGlmICh0aGlzLmFkZF9wbGFjZV9oZXJlICE9PSBcIlwiKVxuXHRcdHtcblx0XHRcdG91dHB1dE9iai5wdXNoICh7XG5cdFx0XHRcdGh0bWw6IGA8YnV0dG9uIGlkID0gXCIke3RoaXMubW9kYWxJZH0tYWRkLWJ0blwiIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tc20gYnRuLW91dGxpbmUtc2Vjb25kYXJ5XCIgb25jbGljayA9IFwidGhpcy5hZGRDbGlja2VkICgpO1wiPiR7dGhpcy5hZGRfdGV4dH08L2J1dHRvbj5gLFxuXHRcdFx0XHRkb2N1bWVudFNlbGVjdG9yOiBgaG90LXBsYWNlLWhlcmVbbmFtZT1cIiR7dGhpcy5hZGRfcGxhY2VfaGVyZX1cIl1gXG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5lZGl0X3BsYWNlX2hlcmUgIT09IFwiXCIpXG5cdFx0e1xuXHRcdFx0b3V0cHV0T2JqLnB1c2ggKHtcblx0XHRcdFx0aHRtbDogYDxidXR0b24gaWQgPSBcIiR7dGhpcy5tb2RhbElkfS1lZGl0LWJ0blwiIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tc20gYnRuLW91dGxpbmUtc2Vjb25kYXJ5XCIgb25jbGljayA9IFwidGhpcy5lZGl0Q2xpY2tlZCAoJyR7dGhpcy5tb2RhbElkfScpO1wiPiR7dGhpcy5lZGl0X3RleHR9PC9idXR0b24+YCxcblx0XHRcdFx0ZG9jdW1lbnRTZWxlY3RvcjogYGhvdC1wbGFjZS1oZXJlW25hbWU9XCIke3RoaXMuZWRpdF9wbGFjZV9oZXJlfVwiXWBcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLnJlbW92ZV9wbGFjZV9oZXJlICE9PSBcIlwiKVxuXHRcdHtcblx0XHRcdG91dHB1dE9iai5wdXNoICh7XG5cdFx0XHRcdGh0bWw6IGA8YnV0dG9uIGlkID0gXCIke3RoaXMubW9kYWxJZH0tcmVtb3ZlLWJ0blwiIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tc20gYnRuLW91dGxpbmUtc2Vjb25kYXJ5XCIgb25jbGljayA9IFwidGhpcy5yZW1vdmVDbGlja2VkICgpO1wiPiR7dGhpcy5yZW1vdmVfdGV4dH08L2J1dHRvbj5gLFxuXHRcdFx0XHRkb2N1bWVudFNlbGVjdG9yOiBgaG90LXBsYWNlLWhlcmVbbmFtZT1cIiR7dGhpcy5yZW1vdmVfcGxhY2VfaGVyZX1cIl1gXG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gKG91dHB1dE9iaik7XG5cdH1cbn1cbiIsImltcG9ydCB7IEhvdFN0YXEsIEhvdCwgSG90QVBJLCBIb3RDb21wb25lbnQsIEhvdENvbXBvbmVudE91dHB1dCB9IGZyb20gXCJob3RzdGFxXCI7XG5cbi8qKlxuICogRnVsbC1wYWdlIGRldGFpbCBjaHJvbWUgZm9yIGFuIGVudGl0eS4gUmVwbGFjZXMgdGhlIG1vZGFsIG9wZW5lZCBieVxuICogPGFkbWluLWVkaXQgaG90LXR5cGU9XCJlZGl0XCI+IHdpdGggYSBkZWRpY2F0ZWQgcGFnZSAoZS5nLiAvYnVkZ2V0LzppZClcbiAqIHRoYXQgaGFzIGl0cyBvd24gYmFjayBsaW5rLCBzZWN0aW9ucywgYW5kIGEgc3RpY2t5IHNhdmUgYmFyIGF0IHRoZVxuICogYm90dG9tLlxuICpcbiAqIFRoZSBwYWdlIGlzIHJlc3BvbnNpYmxlIGZvciBwbGFjaW5nIDxhZG1pbi1mb3JtLWZpZWxkPnMgaW5zaWRlIHRoZVxuICogYDxob3QtcGxhY2UtaGVyZSBuYW1lPVwiZGV0YWlsQm9keVwiPmAgc2xvdC4gVGhpcyBjb21wb25lbnQgaGFuZGxlczpcbiAqICAgLSByZWFkaW5nID9pZCBmcm9tIHRoZSBVUkxcbiAqICAgLSBHRVQnaW5nIHRoZSBlbnRpdHkgdmlhIGhvdC1nZXQtdXJsIGFuZCBwb3B1bGF0aW5nIGZvcm0gZmllbGRzIGJ5XG4gKiAgICAgbWF0Y2hpbmcgaG90LWZpZWxkIG5hbWVzIGFnYWluc3QgdGhlIHJlc3BvbnNlIGtleXNcbiAqICAgLSBQT1NUJ2luZyB2YWx1ZXMgdG8gaG90LXNhdmUtdXJsIG9uIFNhdmUgY2xpY2tcbiAqICAgLSBERUxFVEUnaW5nIHZpYSBob3QtZGVsZXRlLXVybCBvbiBEZWxldGUgY2xpY2sgKHdpdGggY29uZmlybSlcbiAqICAgLSBzaG93aW5nIGEgYmFjayBsaW5rIHRvIGhvdC1iYWNrLXVybFxuICpcbiAqIFVzYWdlOlxuICogICA8YWRtaW4tZGV0YWlsLXBhZ2UgbmFtZT1cImJ1ZGdldERldGFpbFwiXG4gKiAgICAgICAgICAgICAgICAgICAgICBob3QtdGl0bGU9XCJCdWRnZXRcIlxuICogICAgICAgICAgICAgICAgICAgICAgaG90LWJhY2stdXJsPVwiL2J1ZGdldHNcIlxuICogICAgICAgICAgICAgICAgICAgICAgaG90LWJhY2stdGV4dD1cIuKGkCBBbGwgYnVkZ2V0c1wiXG4gKiAgICAgICAgICAgICAgICAgICAgICBob3QtZ2V0LXVybD1cIi92MS9idWRnZXRzL2dldFwiXG4gKiAgICAgICAgICAgICAgICAgICAgICBob3Qtc2F2ZS11cmw9XCIvdjEvYnVkZ2V0cy9lZGl0XCJcbiAqICAgICAgICAgICAgICAgICAgICAgIGhvdC1kZWxldGUtdXJsPVwiL3YxL2J1ZGdldHMvZGVsZXRlXCJcbiAqICAgICAgICAgICAgICAgICAgICAgIGhvdC1wYXlsb2FkLWtleT1cImJ1ZGdldFwiXG4gKiAgICAgICAgICAgICAgICAgICAgICBob3Qtand0PVwiJHtqd3RUb2tlbn1cIj5cbiAqICAgICA8YWRtaW4tZm9ybS1maWVsZCBob3QtZmllbGQ9XCJuYW1lXCIgaG90LWxhYmVsPVwiTmFtZVwiIGhvdC1yZXF1aXJlZD1cIjFcIj48L2FkbWluLWZvcm0tZmllbGQ+XG4gKiAgICAgLi4uXG4gKiAgIDwvYWRtaW4tZGV0YWlsLXBhZ2U+XG4gKi9cbmV4cG9ydCBjbGFzcyBBZG1pbkRldGFpbFBhZ2UgZXh0ZW5kcyBIb3RDb21wb25lbnRcbntcblx0LyoqIEhlYWRpbmcgc2hvd24gYXQgdGhlIHRvcCBvZiB0aGUgcGFnZS4gKi9cblx0dGl0bGU6IHN0cmluZztcblx0LyoqIFVSTCB0aGUgYmFjayBsaW5rIHBvaW50cyBhdC4gKi9cblx0YmFja191cmw6IHN0cmluZztcblx0LyoqIFRleHQgb24gdGhlIGJhY2sgbGluay4gKi9cblx0YmFja190ZXh0OiBzdHJpbmc7XG5cdC8qKiBHRVQtYnktaWQgZW5kcG9pbnQuIFBPU1RlZCB3aXRoIHsgaWQ6IDxpZD4gfS4gKi9cblx0Z2V0X3VybDogc3RyaW5nO1xuXHQvKiogRWRpdC9zYXZlIGVuZHBvaW50LiBQT1NUZWQgd2l0aCB7IFtwYXlsb2FkX2tleV06IHsgaWQsIC4uLmZpZWxkcyB9IH0uICovXG5cdHNhdmVfdXJsOiBzdHJpbmc7XG5cdC8qKiBPcHRpb25hbCBkZWxldGUgZW5kcG9pbnQuIEhpZGVzIHRoZSBEZWxldGUgYnV0dG9uIHdoZW4gYmxhbmsuICovXG5cdGRlbGV0ZV91cmw6IHN0cmluZztcblx0LyoqIFdyYXBwZXIga2V5IGluIHRoZSBzYXZlIHBheWxvYWQgKG1vc3QgREFPIHJvdXRlcyBleHBlY3QgeyBidWRnZXQ6IHsuLi59IH0gLyB7IGlzc3VlOiB7Li4ufSB9IGV0YykuICovXG5cdHBheWxvYWRfa2V5OiBzdHJpbmc7XG5cdC8qKiBKV1QgYmVhcmVyIGZvciB0aGUgQVBJIGNhbGxzLiAqL1xuXHRqd3Q6IHN0cmluZztcblx0LyoqIFVSTCBxdWVyeSBwYXJhbSB0aGF0IGhvbGRzIHRoZSBlbnRpdHkgaWQgKGRlZmF1bHQ6IFwiaWRcIikuICovXG5cdGlkX3BhcmFtOiBzdHJpbmc7XG5cdC8qKiBTYXZlIGJ1dHRvbiB0ZXh0LiAqL1xuXHRzYXZlX3RleHQ6IHN0cmluZztcblx0LyoqIERlbGV0ZSBidXR0b24gdGV4dC4gKi9cblx0ZGVsZXRlX3RleHQ6IHN0cmluZztcblx0LyoqIENvbmZpcm1hdGlvbiBwcm9tcHQgZm9yIGRlbGV0ZS4gKi9cblx0ZGVsZXRlX2NvbmZpcm06IHN0cmluZztcblxuXHRjb25zdHJ1Y3RvciAoY29weTogSG90Q29tcG9uZW50IHwgSG90U3RhcSwgYXBpOiBIb3RBUEkpXG5cdHtcblx0XHRzdXBlciAoY29weSwgYXBpKTtcblxuXHRcdHRoaXMudGFnICAgICAgICAgICAgID0gXCJhZG1pbi1kZXRhaWwtcGFnZVwiO1xuXHRcdHRoaXMudGl0bGUgICAgICAgICAgID0gXCJcIjtcblx0XHR0aGlzLmJhY2tfdXJsICAgICAgICA9IFwiL1wiO1xuXHRcdHRoaXMuYmFja190ZXh0ICAgICAgID0gXCLihpAgQmFja1wiO1xuXHRcdHRoaXMuZ2V0X3VybCAgICAgICAgID0gXCJcIjtcblx0XHR0aGlzLnNhdmVfdXJsICAgICAgICA9IFwiXCI7XG5cdFx0dGhpcy5kZWxldGVfdXJsICAgICAgPSBcIlwiO1xuXHRcdHRoaXMucGF5bG9hZF9rZXkgICAgID0gXCJcIjtcblx0XHR0aGlzLmp3dCAgICAgICAgICAgICA9IFwiXCI7XG5cdFx0dGhpcy5pZF9wYXJhbSAgICAgICAgPSBcImlkXCI7XG5cdFx0dGhpcy5zYXZlX3RleHQgICAgICAgPSBcIlNhdmVcIjtcblx0XHR0aGlzLmRlbGV0ZV90ZXh0ICAgICA9IFwiRGVsZXRlXCI7XG5cdFx0dGhpcy5kZWxldGVfY29uZmlybSAgPSBcIkFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgdGhpcz9cIjtcblx0fVxuXG5cdG9uUG9zdFBsYWNlIChwYXJlbnRIdG1sRWxlbWVudDogSFRNTEVsZW1lbnQsIGh0bWxFbGVtZW50OiBIVE1MRWxlbWVudCk6IEhUTUxFbGVtZW50XG5cdHtcblx0XHRjb25zdCBzZWxmID0gdGhpcztcblx0XHRjb25zdCBwYWdlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQgKHRoaXMubmFtZSk7XG5cdFx0aWYgKHBhZ2UgPT0gbnVsbCkgcmV0dXJuIChudWxsKTtcblxuXHRcdGNvbnN0IGlkID0gc2VsZi5yZWFkSWRGcm9tVXJsICgpO1xuXHRcdGlmICghaWQpXG5cdFx0e1xuXHRcdFx0c2VsZi5zaG93RXJyb3IgKHBhZ2UsIFwiTm8gaWQgcHJvdmlkZWQgaW4gdGhlIFVSTC5cIik7XG5cdFx0XHRyZXR1cm4gKG51bGwpO1xuXHRcdH1cblxuXHRcdC8vIFdpcmUgYnV0dG9ucy5cblx0XHRjb25zdCBzYXZlQnRuICAgPSBwYWdlLnF1ZXJ5U2VsZWN0b3IgKFwiLmZsLWRldGFpbC1zYXZlXCIpIGFzIEhUTUxCdXR0b25FbGVtZW50IHwgbnVsbDtcblx0XHRjb25zdCBkZWxldGVCdG4gPSBwYWdlLnF1ZXJ5U2VsZWN0b3IgKFwiLmZsLWRldGFpbC1kZWxldGVcIikgYXMgSFRNTEJ1dHRvbkVsZW1lbnQgfCBudWxsO1xuXG5cdFx0aWYgKHNhdmVCdG4gIT0gbnVsbClcblx0XHRcdHNhdmVCdG4uYWRkRXZlbnRMaXN0ZW5lciAoXCJjbGlja1wiLCAoZSkgPT4geyBlLnByZXZlbnREZWZhdWx0ICgpOyBzZWxmLmhhbmRsZVNhdmUgKHBhZ2UsIGlkKTsgfSk7XG5cblx0XHRpZiAoZGVsZXRlQnRuICE9IG51bGwpXG5cdFx0XHRkZWxldGVCdG4uYWRkRXZlbnRMaXN0ZW5lciAoXCJjbGlja1wiLCAoZSkgPT4geyBlLnByZXZlbnREZWZhdWx0ICgpOyBzZWxmLmhhbmRsZURlbGV0ZSAoaWQpOyB9KTtcblxuXHRcdC8vIExvYWQgZXhpc3RpbmcgcmVjb3JkLlxuXHRcdHNlbGYuZmV0Y2hBbmRGaWxsIChwYWdlLCBpZCk7XG5cblx0XHRyZXR1cm4gKG51bGwpO1xuXHR9XG5cblx0cHJvdGVjdGVkIHJlYWRJZEZyb21VcmwgKCk6IHN0cmluZ1xuXHR7XG5cdFx0Y29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyAod2luZG93LmxvY2F0aW9uLnNlYXJjaCk7XG5cdFx0cmV0dXJuIHBhcmFtcy5nZXQgKHRoaXMuaWRfcGFyYW0pIHx8IFwiXCI7XG5cdH1cblxuXHRwcm90ZWN0ZWQgc2hvd0Vycm9yIChwYWdlOiBIVE1MRWxlbWVudCwgbXNnOiBzdHJpbmcpOiB2b2lkXG5cdHtcblx0XHRjb25zdCBmYiA9IHBhZ2UucXVlcnlTZWxlY3RvciAoXCIuZmwtZGV0YWlsLWZlZWRiYWNrXCIpIGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcblx0XHRpZiAoZmIpIHsgZmIuY2xhc3NOYW1lID0gXCJmbC1kZXRhaWwtZmVlZGJhY2sgYWxlcnQgYWxlcnQtZGFuZ2VyXCI7IGZiLnRleHRDb250ZW50ID0gbXNnOyB9XG5cdH1cblxuXHRwcm90ZWN0ZWQgc2hvd1N1Y2Nlc3MgKHBhZ2U6IEhUTUxFbGVtZW50LCBtc2c6IHN0cmluZyk6IHZvaWRcblx0e1xuXHRcdGNvbnN0IGZiID0gcGFnZS5xdWVyeVNlbGVjdG9yIChcIi5mbC1kZXRhaWwtZmVlZGJhY2tcIikgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuXHRcdGlmIChmYilcblx0XHR7XG5cdFx0XHRmYi5jbGFzc05hbWUgPSBcImZsLWRldGFpbC1mZWVkYmFjayBhbGVydCBhbGVydC1zdWNjZXNzXCI7XG5cdFx0XHRmYi50ZXh0Q29udGVudCA9IG1zZztcblx0XHRcdHNldFRpbWVvdXQgKCgpID0+IHsgZmIuY2xhc3NOYW1lID0gXCJmbC1kZXRhaWwtZmVlZGJhY2sgZC1ub25lXCI7IGZiLnRleHRDb250ZW50ID0gXCJcIjsgfSwgMjUwMCk7XG5cdFx0fVxuXHR9XG5cblx0cHJvdGVjdGVkIGFzeW5jIGZldGNoQW5kRmlsbCAocGFnZTogSFRNTEVsZW1lbnQsIGlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+XG5cdHtcblx0XHR0cnlcblx0XHR7XG5cdFx0XHRjb25zdCBoZWFkZXJzOiBhbnkgPSB7IFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiIH07XG5cdFx0XHRpZiAodGhpcy5qd3QpIGhlYWRlcnNbXCJBdXRob3JpemF0aW9uXCJdID0gXCJCZWFyZXIgXCIgKyB0aGlzLmp3dDtcblx0XHRcdGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoICh0aGlzLmdldF91cmwsIHtcblx0XHRcdFx0bWV0aG9kOiBcIlBPU1RcIiwgaGVhZGVyczogaGVhZGVycywgYm9keTogSlNPTi5zdHJpbmdpZnkgKHsgaWQ6IGlkIH0pXG5cdFx0XHR9KTtcblx0XHRcdGlmICghcmVzLm9rKSB7IHRoaXMuc2hvd0Vycm9yIChwYWdlLCBcIkNvdWxkIG5vdCBsb2FkOiBIVFRQIFwiICsgcmVzLnN0YXR1cyk7IHJldHVybjsgfVxuXHRcdFx0Y29uc3Qgb2JqID0gYXdhaXQgcmVzLmpzb24gKCk7XG5cdFx0XHRpZiAob2JqID09IG51bGwpIHsgdGhpcy5zaG93RXJyb3IgKHBhZ2UsIFwiUmVjb3JkIG5vdCBmb3VuZC5cIik7IHJldHVybjsgfVxuXHRcdFx0dGhpcy5wb3B1bGF0ZUZpZWxkcyAocGFnZSwgb2JqKTtcblx0XHR9XG5cdFx0Y2F0Y2ggKGV4KVxuXHRcdHtcblx0XHRcdHRoaXMuc2hvd0Vycm9yIChwYWdlLCBcIkNvdWxkIG5vdCBsb2FkOiBcIiArIChleCBhcyBFcnJvcikubWVzc2FnZSk7XG5cdFx0fVxuXHR9XG5cblx0cHJvdGVjdGVkIHBvcHVsYXRlRmllbGRzIChwYWdlOiBIVE1MRWxlbWVudCwgb2JqOiBhbnkpOiB2b2lkXG5cdHtcblx0XHRjb25zdCBub2RlcyA9IHBhZ2UucXVlcnlTZWxlY3RvckFsbCAoXCJbaG90LWZpZWxkXVwiKTtcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKVxuXHRcdHtcblx0XHRcdGNvbnN0IGVsID0gbm9kZXNbaV0gYXMgSFRNTElucHV0RWxlbWVudCB8IEhUTUxTZWxlY3RFbGVtZW50IHwgSFRNTFRleHRBcmVhRWxlbWVudDtcblx0XHRcdGNvbnN0IGZpZWxkID0gZWwuZ2V0QXR0cmlidXRlIChcImhvdC1maWVsZFwiKTtcblx0XHRcdGlmIChmaWVsZCA9PSBudWxsIHx8IGZpZWxkID09PSBcIlwiKSBjb250aW51ZTtcblx0XHRcdGNvbnN0IHZhbCA9IG9ialtmaWVsZF07XG5cdFx0XHRpZiAodmFsID09IG51bGwpIGNvbnRpbnVlO1xuXHRcdFx0aWYgKGVsIGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCAmJiBlbC50eXBlID09PSBcImNoZWNrYm94XCIpXG5cdFx0XHRcdGVsLmNoZWNrZWQgPSB2YWwgPT09IHRydWUgfHwgdmFsID09PSBcInRydWVcIiB8fCB2YWwgPT09IDE7XG5cdFx0XHRlbHNlXG5cdFx0XHRcdGVsLnZhbHVlID0gU3RyaW5nICh2YWwpO1xuXHRcdH1cblx0fVxuXG5cdHByb3RlY3RlZCBjb2xsZWN0VmFsdWVzIChwYWdlOiBIVE1MRWxlbWVudCk6IGFueVxuXHR7XG5cdFx0Y29uc3Qgb3V0OiBhbnkgPSB7fTtcblx0XHRjb25zdCBub2RlcyA9IHBhZ2UucXVlcnlTZWxlY3RvckFsbCAoXCJbaG90LWZpZWxkXVwiKTtcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKVxuXHRcdHtcblx0XHRcdGNvbnN0IGVsID0gbm9kZXNbaV0gYXMgSFRNTElucHV0RWxlbWVudCB8IEhUTUxTZWxlY3RFbGVtZW50IHwgSFRNTFRleHRBcmVhRWxlbWVudDtcblx0XHRcdGNvbnN0IGZpZWxkID0gZWwuZ2V0QXR0cmlidXRlIChcImhvdC1maWVsZFwiKTtcblx0XHRcdGlmIChmaWVsZCA9PSBudWxsIHx8IGZpZWxkID09PSBcIlwiKSBjb250aW51ZTtcblx0XHRcdGlmIChlbCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQgJiYgZWwudHlwZSA9PT0gXCJjaGVja2JveFwiKVxuXHRcdFx0XHRvdXRbZmllbGRdID0gZWwuY2hlY2tlZDtcblx0XHRcdGVsc2UgaWYgKGVsIGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCAmJiBlbC50eXBlID09PSBcIm51bWJlclwiKVxuXHRcdFx0XHRvdXRbZmllbGRdID0gZWwudmFsdWUgPT09IFwiXCIgPyBudWxsIDogTnVtYmVyIChlbC52YWx1ZSk7XG5cdFx0XHRlbHNlXG5cdFx0XHRcdG91dFtmaWVsZF0gPSBlbC52YWx1ZTtcblx0XHR9XG5cdFx0cmV0dXJuIG91dDtcblx0fVxuXG5cdHByb3RlY3RlZCBhc3luYyBoYW5kbGVTYXZlIChwYWdlOiBIVE1MRWxlbWVudCwgaWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD5cblx0e1xuXHRcdGNvbnN0IHZhbHVlcyA9IHRoaXMuY29sbGVjdFZhbHVlcyAocGFnZSk7XG5cdFx0dmFsdWVzLmlkID0gaWQ7XG5cdFx0Y29uc3QgYm9keTogYW55ID0gdGhpcy5wYXlsb2FkX2tleSA/IHsgW3RoaXMucGF5bG9hZF9rZXldOiB2YWx1ZXMgfSA6IHZhbHVlcztcblxuXHRcdGNvbnN0IGJ0biA9IHBhZ2UucXVlcnlTZWxlY3RvciAoXCIuZmwtZGV0YWlsLXNhdmVcIikgYXMgSFRNTEJ1dHRvbkVsZW1lbnQgfCBudWxsO1xuXHRcdGlmIChidG4pIGJ0bi5kaXNhYmxlZCA9IHRydWU7XG5cdFx0dHJ5XG5cdFx0e1xuXHRcdFx0Y29uc3QgaGVhZGVyczogYW55ID0geyBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIiB9O1xuXHRcdFx0aWYgKHRoaXMuand0KSBoZWFkZXJzW1wiQXV0aG9yaXphdGlvblwiXSA9IFwiQmVhcmVyIFwiICsgdGhpcy5qd3Q7XG5cdFx0XHRjb25zdCByZXMgPSBhd2FpdCBmZXRjaCAodGhpcy5zYXZlX3VybCwge1xuXHRcdFx0XHRtZXRob2Q6IFwiUE9TVFwiLCBoZWFkZXJzOiBoZWFkZXJzLCBib2R5OiBKU09OLnN0cmluZ2lmeSAoYm9keSlcblx0XHRcdH0pO1xuXHRcdFx0aWYgKCFyZXMub2spXG5cdFx0XHR7XG5cdFx0XHRcdGxldCBtc2cgPSBcIkhUVFAgXCIgKyByZXMuc3RhdHVzO1xuXHRcdFx0XHR0cnkgeyBjb25zdCBqID0gYXdhaXQgcmVzLmpzb24gKCk7IGlmIChqICYmIGouZXJyb3IpIG1zZyA9IGouZXJyb3I7IH0gY2F0Y2ggKGUpIHt9XG5cdFx0XHRcdHRoaXMuc2hvd0Vycm9yIChwYWdlLCBcIlNhdmUgZmFpbGVkOiBcIiArIG1zZyk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdHRoaXMuc2hvd1N1Y2Nlc3MgKHBhZ2UsIFwiU2F2ZWQuXCIpO1xuXHRcdH1cblx0XHRjYXRjaCAoZXgpXG5cdFx0e1xuXHRcdFx0dGhpcy5zaG93RXJyb3IgKHBhZ2UsIFwiU2F2ZSBmYWlsZWQ6IFwiICsgKGV4IGFzIEVycm9yKS5tZXNzYWdlKTtcblx0XHR9XG5cdFx0ZmluYWxseVxuXHRcdHtcblx0XHRcdGlmIChidG4pIGJ0bi5kaXNhYmxlZCA9IGZhbHNlO1xuXHRcdH1cblx0fVxuXG5cdHByb3RlY3RlZCBhc3luYyBoYW5kbGVEZWxldGUgKGlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+XG5cdHtcblx0XHRpZiAoIXdpbmRvdy5jb25maXJtICh0aGlzLmRlbGV0ZV9jb25maXJtKSkgcmV0dXJuO1xuXHRcdHRyeVxuXHRcdHtcblx0XHRcdGNvbnN0IGhlYWRlcnM6IGFueSA9IHsgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIgfTtcblx0XHRcdGlmICh0aGlzLmp3dCkgaGVhZGVyc1tcIkF1dGhvcml6YXRpb25cIl0gPSBcIkJlYXJlciBcIiArIHRoaXMuand0O1xuXHRcdFx0Y29uc3QgcmVzID0gYXdhaXQgZmV0Y2ggKHRoaXMuZGVsZXRlX3VybCwge1xuXHRcdFx0XHRtZXRob2Q6IFwiUE9TVFwiLCBoZWFkZXJzOiBoZWFkZXJzLCBib2R5OiBKU09OLnN0cmluZ2lmeSAoeyBpZDogaWQgfSlcblx0XHRcdH0pO1xuXHRcdFx0aWYgKCFyZXMub2spIHsgYWxlcnQgKFwiRGVsZXRlIGZhaWxlZDogSFRUUCBcIiArIHJlcy5zdGF0dXMpOyByZXR1cm47IH1cblx0XHRcdHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gdGhpcy5iYWNrX3VybDtcblx0XHR9XG5cdFx0Y2F0Y2ggKGV4KVxuXHRcdHtcblx0XHRcdGFsZXJ0IChcIkRlbGV0ZSBmYWlsZWQ6IFwiICsgKGV4IGFzIEVycm9yKS5tZXNzYWdlKTtcblx0XHR9XG5cdH1cblxuXHRvdXRwdXQgKCk6IHN0cmluZyB8IEhvdENvbXBvbmVudE91dHB1dFtdXG5cdHtcblx0XHRpZiAodGhpcy5uYW1lID09PSBcIlwiKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChcImFkbWluLWRldGFpbC1wYWdlOiBpZCAobmFtZSkgaXMgcmVxdWlyZWRcIik7XG5cdFx0aWYgKHRoaXMuZ2V0X3VybCA9PT0gXCJcIiB8fCB0aGlzLnNhdmVfdXJsID09PSBcIlwiKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChcImFkbWluLWRldGFpbC1wYWdlOiBob3QtZ2V0LXVybCBhbmQgaG90LXNhdmUtdXJsIGFyZSByZXF1aXJlZFwiKTtcblxuXHRcdGNvbnN0IGRlbGV0ZUJ0biA9IHRoaXMuZGVsZXRlX3VybFxuXHRcdFx0PyBgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtZGFuZ2VyIGZsLWRldGFpbC1kZWxldGVcIj4ke3RoaXMuZGVsZXRlX3RleHR9PC9idXR0b24+YFxuXHRcdFx0OiBcIlwiO1xuXG5cdFx0cmV0dXJuIChgXG5cdFx0XHQ8ZGl2IGlkPVwiJHt0aGlzLm5hbWV9XCIgY2xhc3M9XCJmbC1kZXRhaWwtcGFnZVwiPlxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwiY29udGFpbmVyXCIgc3R5bGU9XCJtYXgtd2lkdGg6ODgwcHg7cGFkZGluZzoxLjVyZW0gMXJlbSA3cmVtO1wiPlxuXHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJtYi0zXCI+PGEgaHJlZj1cIiR7dGhpcy5iYWNrX3VybH1cIiBjbGFzcz1cInRleHQtbXV0ZWQgc21hbGwgdGV4dC1kZWNvcmF0aW9uLW5vbmVcIj4ke3RoaXMuYmFja190ZXh0fTwvYT48L2Rpdj5cblx0XHRcdFx0XHQ8aDEgY2xhc3M9XCJoMyBtYi0zXCI+JHt0aGlzLnRpdGxlfTwvaDE+XG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cImZsLWRldGFpbC1mZWVkYmFjayBkLW5vbmVcIj48L2Rpdj5cblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiY2FyZCBtYi0zXCI+PGRpdiBjbGFzcz1cImNhcmQtYm9keVwiPlxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cInJvdyBnLTNcIj5cblx0XHRcdFx0XHRcdFx0PGhvdC1wbGFjZS1oZXJlIG5hbWU9XCJkZXRhaWxCb2R5XCI+PC9ob3QtcGxhY2UtaGVyZT5cblx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdDwvZGl2PjwvZGl2PlxuXHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0PGRpdiBjbGFzcz1cImZsLWRldGFpbC1zYXZlLWJhclwiPlxuXHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJjb250YWluZXIgZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlclwiIHN0eWxlPVwibWF4LXdpZHRoOjg4MHB4O1wiPlxuXHRcdFx0XHRcdFx0JHtkZWxldGVCdG59XG5cdFx0XHRcdFx0XHQ8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBmbC1kZXRhaWwtc2F2ZSBtcy1hdXRvXCI+JHt0aGlzLnNhdmVfdGV4dH08L2J1dHRvbj5cblx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0PC9kaXY+XG5cdFx0XHQ8L2Rpdj5gKTtcblx0fVxufVxuIiwiaW1wb3J0IHsgSG90U3RhcSwgSG90LCBIb3RBUEksIEhvdENvbXBvbmVudCB9IGZyb20gXCJob3RzdGFxXCI7XG5cbmV4cG9ydCBjbGFzcyBBZG1pbkJ1dHRvbiBleHRlbmRzIEhvdENvbXBvbmVudFxue1xuXHQvKipcblx0ICogVGhlIENTUyBjbGFzcyB0byBhcHBseSB0byB0aGUgYnV0dG9uLlxuXHQgKi9cblx0Y3NzX2NsYXNzOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBFeGVjdXRlcyB3aGVuIHRoZSBidXR0b24gaXMgY2xpY2tlZC5cblx0ICovXG5cdG9uY2xpY2s6IChldmVudDogTW91c2VFdmVudCkgPT4gUHJvbWlzZTxhbnk+O1xuXG5cdGNvbnN0cnVjdG9yIChjb3B5OiBIb3RDb21wb25lbnQgfCBIb3RTdGFxLCBhcGk6IEhvdEFQSSlcblx0e1xuXHRcdHN1cGVyIChjb3B5LCBhcGkpO1xuXG5cdFx0dGhpcy50YWcgPSBcImFkbWluLWJ1dHRvblwiO1xuXHRcdHRoaXMuY3NzX2NsYXNzID0gXCJidG4gYnRuLXNtIGJ0bi1vdXRsaW5lLXNlY29uZGFyeVwiO1xuXHRcdHRoaXMub25jbGljayA9IG51bGw7XG5cdH1cblxuXHRhc3luYyBidXR0b25DbGlja2VkICgpOiBQcm9taXNlPHZvaWQ+XG5cdHtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb3JyZWN0cyB0aGUgcGxhY2VtZW50IG9mIHRoZSB0ZXh0IGVsZW1lbnRzIGZvciBtb2RhbHMuXG5cdCAqL1xuXHRvblBvc3RQbGFjZSAocGFyZW50SHRtbEVsZW1lbnQ6IEhUTUxFbGVtZW50LCBodG1sRWxlbWVudDogSFRNTEVsZW1lbnQpOiBIVE1MRWxlbWVudFxuXHR7XG5cdFx0bGV0IHBsYWNlSGVyZUFycmF5ID0gcGFyZW50SHRtbEVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCAoYGhvdC1wbGFjZS1oZXJlW3R5cGU9XCJtb2RhbFwiXWApO1xuXG5cdFx0aWYgKHBsYWNlSGVyZUFycmF5Lmxlbmd0aCA+IDApXG5cdFx0e1xuXHRcdFx0bGV0IHBsYWNlSGVyZSA9IHBsYWNlSGVyZUFycmF5WzBdO1xuXHRcdFx0cGFyZW50SHRtbEVsZW1lbnQucmVtb3ZlQ2hpbGQgKGh0bWxFbGVtZW50KTtcblx0XHRcdHBsYWNlSGVyZS5hcHBlbmRDaGlsZCAoaHRtbEVsZW1lbnQpO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLm9uY2xpY2sgIT0gbnVsbClcblx0XHR7XG5cdFx0XHRpZiAodHlwZW9mICh0aGlzLm9uY2xpY2spID09PSBcInN0cmluZ1wiKVxuXHRcdFx0XHR0aGlzLm9uY2xpY2sgPSAoPChldmVudDogTW91c2VFdmVudCkgPT4gUHJvbWlzZTxhbnk+Pm5ldyBGdW5jdGlvbiAodGhpcy5vbmNsaWNrKSk7XG5cblx0XHRcdGh0bWxFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIgKFwiY2xpY2tcIiwgdGhpcy5vbmNsaWNrKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gKG51bGwpO1xuXHR9XG5cblx0b3V0cHV0ICgpOiBzdHJpbmdcblx0e1xuXHRcdHJldHVybiAoYDxidXR0b24gaWQgPSBcIiR7dGhpcy5odG1sRWxlbWVudHNbMF0uaWR9XCIgY2xhc3MgPSBcIiR7dGhpcy5jc3NfY2xhc3N9XCIgb25jbGljayA9IFwidGhpcy5idXR0b25DbGlja2VkICgpO1wiPiR7dGhpcy5pbm5lcn08L2J1dHRvbj5gKTtcblx0fVxufVxuIiwiaW1wb3J0IHsgSG90U3RhcSwgSG90LCBIb3RBUEksIEhvdENvbXBvbmVudCwgSG90Q29tcG9uZW50T3V0cHV0IH0gZnJvbSBcImhvdHN0YXFcIjtcbmltcG9ydCB7IEFkbWluVGFibGVGaWVsZCB9IGZyb20gXCIuL2FkbWluLXRhYmxlLWZpZWxkXCI7XG5pbXBvcnQgeyBBZG1pbkVkaXQgfSBmcm9tIFwiLi9hZG1pbi1lZGl0XCI7XG5cbmltcG9ydCBEYXRhVGFibGUsIHsgQXBpLCBDb25maWdDb2x1bW5zLCBJbnRlcm5hbFNldHRpbmdzIH0gZnJvbSBcImRhdGF0YWJsZXMubmV0XCI7XG5pbXBvcnQgZHQ1IGZyb20gJ2RhdGF0YWJsZXMubmV0LWJzNSc7XG5pbXBvcnQgZHRjIGZyb20gJ2RhdGF0YWJsZXMubmV0LWNvbHJlb3JkZXItYnM1JztcbmltcG9ydCBkdHMgZnJvbSAnZGF0YXRhYmxlcy5uZXQtc2Nyb2xsZXItYnM1JztcbmltcG9ydCBkdHNiIGZyb20gJ2RhdGF0YWJsZXMubmV0LXNlYXJjaGJ1aWxkZXItYnM1JztcbmltcG9ydCBkdHNlbCBmcm9tICdkYXRhdGFibGVzLm5ldC1zZWxlY3QtYnM1JztcblxuLyoqXG4gKiBUaGUgcHJvcGVydGllcyBmb3IgdGhlIGxpc3Qgc2VhcmNoLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElMaXN0U2VhcmNoUHJvcGVydGllc1xue1xuXHQvKipcblx0ICogVGhlIHNlYXJjaC5cblx0ICovXG5cdHNlYXJjaD86IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBzdGFydCBpbmRleC5cblx0ICovXG5cdG9mZnNldD86IG51bWJlcjtcblx0LyoqXG5cdCAqIFRoZSBsZW5ndGguXG5cdCAqL1xuXHRsaW1pdD86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBUaGUgQVBJIHJlc3BvbnNlIHRoYXQgaXMgZXhwZWN0ZWQgdG8gYmUgcmV0dXJuZWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUFQSVJlc3BvbnNlXG57XG5cdC8qKlxuXHQgKiBUaGUgbGVuZ3RoIG9mIHRoZSBkYXRhLlxuXHQgKi9cblx0bGVuZ3RoOiBudW1iZXI7XG5cdC8qKlxuXHQgKiBUaGUgZGF0YSB0byByZXR1cm4uXG5cdCAqL1xuXHRkYXRhOiBhbnlbXTtcblx0LyoqXG5cdCAqIFRoZSBlcnJvciBtZXNzYWdlLCBpZiBhbnkuXG5cdCAqL1xuXHRlcnJvcj86IHN0cmluZztcblx0LyoqXG5cdCAqIENhbiBlbmFibGUvZGlzYWJsZSBzYW5pdGl6YXRpb24gb2YgdGhlIHJldHVybmluZyBkYXRhLlxuXHQgKi9cblx0aG90U2FuaXRpemU/OiBib29sZWFuO1xufVxuXG5leHBvcnQgY2xhc3MgQWRtaW5UYWJsZSBleHRlbmRzIEhvdENvbXBvbmVudFxue1xuXHQvKipcblx0ICogVGhlIHRpdGxlIG9mIHRoaXMgdGFibGUuXG5cdCAqL1xuXHR0aXRsZTogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIGF0dGFjaGVkIHNjaGVtYS5cblx0ICovXG5cdHNjaGVtYTogc3RyaW5nO1xuXHRoZWFkZXJzOiB7XG5cdFx0LyoqXG5cdFx0ICogVGhlIHN0b3JlZCBoZWFkZXIgZmllbGRzLlxuXHRcdCAqL1xuXHRcdGZpZWxkczogeyBbbmFtZTogc3RyaW5nXTogQWRtaW5UYWJsZUZpZWxkOyB9O1xuXHRcdC8qKlxuXHRcdCAqIFRoZSBoZWFkZXJzIGFyZSBzdG9yZWQgaW4gYSBrZXkvdmFsdWUgb2JqZWN0LlxuXHRcdCAqIFxuXHRcdCAqIEBleGFtcGxlIHsgXCJuYW1lXCI6IFwiPHRoPk5hbWU8L3RoPlwiLCBcImVtYWlsXCI6IFwiPHRoPkVtYWlsPC90aD5cIiB9XG5cdFx0ICovXG5cdFx0ZWxlbWVudHM6IHsgW25hbWU6IHN0cmluZ106IGFueTsgfTtcblx0XHQvKipcblx0XHQgKiBUaGUgaGVhZGVyIGluZGljaWVzIGFyZSBzdG9yZWQgaW4gYSBrZXkvdmFsdWUgb2JqZWN0LlxuXHRcdCAqIFxuXHRcdCAqIEBleGFtcGxlIGNvbnNvbGUubG9nICh0aGlzLmhlYWRlckluZGljaWVzW1wibmFtZVwiXSk7IC8vIE91dHB1dHMgMFxuXHRcdCAqL1xuXHRcdGluZGljaWVzOiBudW1iZXJbXTtcblx0fTtcblx0LyoqXG5cdCAqIFRoZSByb3cgZWxlbWVudHMgYXJlIHN0b3JlZCBpbiBhbiBhcnJheSB3aXRoIGtleS92YWx1ZSBmaWVsZHMgYW5kIGl0J3MgYXR0YWNoZWQgaHRtbCBlbGVtZW50LlxuXHQgKiBcblx0ICogQGV4YW1wbGVcblx0ICoge1xuXHQgKiAgIFwiZmllbGRzXCI6IFtcblx0ICogICAgICAge1xuXHQgKiAgICAgICAgIFwibmFtZVwiOiBcIkpvaG4gU21pdGhcIixcblx0ICogICAgICAgICBcImVtYWlsXCI6IFwiam9obi5zbWl0aEB0ZXN0LmNvbVwiXG5cdCAqICAgICAgIH1cblx0ICogICAgIF0sXG5cdCAqICAgXCJodG1sXCI6IFwiPHRyPjx0ZD5Kb2huIFNtaXRoPC90ZD48dGQ+am9obi5zbWl0aEB0ZXN0LmNvbTwvdGQ+PC90cj5cIlxuXHQgKiB9XG5cdCAqL1xuXHRyb3dFbGVtZW50czogeyBmaWVsZHM6IGFueVtdOyBlbGVtZW50OiBIVE1MRWxlbWVudDsgfVtdID0gW107XG5cdC8qKlxuXHQgKiBUaGUgdGFibGUgY2FsbGJhY2sgZm9yIHdoZW4gdXBkYXRpbmcgZGF0YS5cblx0ICovXG5cdHRhYmxlQ2FsbGJhY2s6ICgoZGF0YTogYW55KSA9PiB2b2lkKTtcblx0LyoqXG5cdCAqIFRoZSB0YWJsZSBkYXRhIGZvciB3aGVuIHVwZGF0aW5nIGRhdGEuXG5cdCAqL1xuXHRwcm90ZWN0ZWQgdGFibGVEYXRhOiBhbnk7XG5cdC8qKlxuXHQgKiBUaGUgc2VsZWN0ZWQgcm93IGluZGljaWVzLiBFYWNoIGluZGV4IG1hcHMgdG8gdGhlIHJvd0VsZW1lbnRzIGFycmF5LlxuXHQgKiBcblx0ICogQGZpeG1lIEFkZCBzdXBwb3J0IGZvciB0aGlzIGluIHRoZSBmdXR1cmUuXG5cdCAqL1xuXHQvL3Byb3RlY3RlZCBzZWxlY3RlZFJvd3M6IG51bWJlcltdO1xuXHQvKipcblx0ICogVGhlIG1vc3QgcmVjZW50bHkgc2VsZWN0ZWQgcm93IGluZGV4LiBUaGUgaW5kZXggbWFwcyB0byB0aGUgcm93RWxlbWVudHMgYXJyYXkuXG5cdCAqL1xuXHRwcm90ZWN0ZWQgc2VsZWN0ZWQ6IG51bWJlcjtcblx0LyoqXG5cdCAqIFRoZSBsaXN0IGZ1bmN0aW9uIHRvIGV4ZWN1dGUgdG8gcmV0cmlldmUgZGF0YS5cblx0ICovXG5cdG9ubGlzdDogKHNlYXJjaDogSUxpc3RTZWFyY2hQcm9wZXJ0aWVzKSA9PiBQcm9taXNlPElBUElSZXNwb25zZT47XG5cdC8qKlxuXHQgKiBUaGUgbGlzdCB1cmwgdG8gdXNlIGZvciB0aGlzIHRhYmxlLiBIb3QuRGF0YS5BZG1pblBhbmVsLmxpc3RVcmwgd2lsbCBub3QgYmUgdXNlZCBpbiB0aGlzIGNhc2UuXG5cdCAqL1xuXHRsaXN0dXJsOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBJZiBzZXQgdG8gdHJ1ZSwgZWFjaCByb3cgd2lsbCBoYXZlIGEgY2hlY2tib3guXG5cdCAqIEBkZWZhdWx0IHRydWVcblx0ICovXG5cdGNoZWNrYm94OiBib29sZWFuO1xuXHQvKipcblx0ICogSWYgc2V0IHRvIHRydWUsIGEgc2luZ2xlIGNsaWNrIHdpbGwgYWxsb3cgdGhlIHVzZXIgdG8gZWRpdCB0aGUgcm93LlxuXHQgKi9cblx0c2luZ2xlY2xpY2tlZGl0OiBib29sZWFuO1xuXHQvKipcblx0ICogRXhlY3V0ZXMgdGhpcyBldmVudCB3aGVuIGEgcm93IGlzIHNlbGVjdGVkLiBUaGUgcG90ZW50aWFsIGl0ZW0gdG8gYmUgc2VsZWN0ZWQgXG5cdCAqIHdpbGwgYWxzbyBiZSBwYXNzZWQuIElmIHRoaXMgcmV0dXJucyBmYWxzZSwgdGhlIHJvdyB3aWxsIG5vdCBiZSBzZWxlY3RlZC5cblx0ICovXG5cdG9uc2VsZWN0ZWRyb3c6IChyb3dJbmRleDogbnVtYmVyLCBpdGVtOiBhbnlbXSkgPT4gUHJvbWlzZTxib29sZWFuPjtcblx0LyoqXG5cdCAqIFRoZSBhdHRhY2hlZCBlZGl0IGZvcm0sIGlmIGFueS5cblx0ICovXG5cdGF0dGFjaGVkRWRpdDogQWRtaW5FZGl0O1xuXHQvKipcblx0ICogVGhlIGFzc29jaWF0ZWQgRGF0YVRhYmxlLlxuXHQgKi9cblx0ZGF0YVRhYmxlOiBEYXRhVGFibGU8QXBpPjtcblx0LyoqXG5cdCAqIEluZGljYXRlcyBpZiB0aGUgbGlzdCBpcyByZWZyZXNoaW5nLlxuXHQgKi9cblx0aXNMaXN0UmVmcmVzaGluZzogYm9vbGVhbjtcblxuXHRjb25zdHJ1Y3RvciAoY29weTogSG90Q29tcG9uZW50IHwgSG90U3RhcSwgYXBpOiBIb3RBUEkpXG5cdHtcblx0XHRzdXBlciAoY29weSwgYXBpKTtcblxuXHRcdHRoaXMudGFnID0gXCJhZG1pbi10YWJsZVwiO1xuXHRcdHRoaXMudGl0bGUgPSBcIlwiO1xuXHRcdHRoaXMuc2NoZW1hID0gXCJcIjtcblx0XHR0aGlzLmhlYWRlcnMgPSB7XG5cdFx0XHRcdGZpZWxkczoge30sXG5cdFx0XHRcdGVsZW1lbnRzOiB7fSxcblx0XHRcdFx0aW5kaWNpZXM6IFtdXG5cdFx0XHR9O1xuXHRcdHRoaXMucm93RWxlbWVudHMgPSBbXTtcblx0XHR0aGlzLnRhYmxlQ2FsbGJhY2sgPSBudWxsO1xuXHRcdHRoaXMudGFibGVEYXRhID0gbnVsbDtcblx0XHQvL3RoaXMuc2VsZWN0ZWRSb3dzID0gW107XG5cdFx0dGhpcy5vbmxpc3QgPSBudWxsO1xuXHRcdHRoaXMubGlzdHVybCA9IFwiXCI7XG5cdFx0dGhpcy5jaGVja2JveCA9IHRydWU7XG5cdFx0dGhpcy5zaW5nbGVjbGlja2VkaXQgPSBmYWxzZTtcblx0XHR0aGlzLm9uc2VsZWN0ZWRyb3cgPSBudWxsO1xuXHRcdHRoaXMuYXR0YWNoZWRFZGl0ID0gbnVsbDtcblx0XHR0aGlzLnNlbGVjdGVkID0gLTE7XG5cdFx0dGhpcy5kYXRhVGFibGUgPSBudWxsO1xuXHRcdHRoaXMuaXNMaXN0UmVmcmVzaGluZyA9IGZhbHNlO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZCBhIGhlYWRlciB0byB0aGUgdGFibGUuXG5cdCAqL1xuXHRhZGRIZWFkZXIgKHRhYmxlRmllbGRFbGVtZW50OiBIVE1MRWxlbWVudClcblx0e1xuXHRcdGxldCBoZWFkZXIgPSB0aGlzLmh0bWxFbGVtZW50c1swXS5nZXRFbGVtZW50c0J5VGFnTmFtZSAoXCJ0aGVhZFwiKVswXTtcblxuXHRcdGlmICh0aGlzLmhlYWRlcnMuaW5kaWNpZXMubGVuZ3RoIDwgMSlcblx0XHRcdHRoaXMuaGVhZGVycy5pbmRpY2llcy5wdXNoIChudWxsKTtcblxuXHRcdC8vIEB0cy1pZ25vcmVcblx0XHR0aGlzLmhlYWRlcnMuaW5kaWNpZXMucHVzaCAodGFibGVGaWVsZEVsZW1lbnQuaG90Q29tcG9uZW50LmZpZWxkKTtcblx0XHRoZWFkZXIuYXBwZW5kQ2hpbGQgKHRhYmxlRmllbGRFbGVtZW50KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBZGQgYSBoZWFkZXIgdG8gdGhlIHRhYmxlLlxuXHQgKi9cblx0YWRkSGVhZGVyRGF0YU9ubHkgKHRhYmxlRmllbGQ6IEFkbWluVGFibGVGaWVsZCwgaHRtbEVsZW1lbnQ6IEhUTUxFbGVtZW50KVxuXHR7XG5cdFx0aWYgKHRoaXMuaGVhZGVycy5pbmRpY2llcy5sZW5ndGggPCAxKVxuXHRcdFx0dGhpcy5oZWFkZXJzLmluZGljaWVzLnB1c2ggKG51bGwpO1xuXG5cdFx0dGhpcy5oZWFkZXJzLmluZGljaWVzLnB1c2ggKHRhYmxlRmllbGQuZmllbGQpO1xuXHRcdHRoaXMuaGVhZGVycy5maWVsZHNbdGFibGVGaWVsZC5maWVsZF0gPSB0YWJsZUZpZWxkO1xuXHRcdHRoaXMuaGVhZGVycy5lbGVtZW50c1t0YWJsZUZpZWxkLmZpZWxkXSA9IGh0bWxFbGVtZW50O1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCB0aGUgZmllbGQgdHlwZSBvZiBhIGZpZWxkLlxuXHQgKi9cblx0Z2V0RmllbGRUeXBlIChmaWVsZE5hbWU6IHN0cmluZyk6IHN0cmluZ1xuXHR7XG5cdFx0aWYgKHRoaXMuaGVhZGVycy5lbGVtZW50c1tmaWVsZE5hbWVdICE9IG51bGwpXG5cdFx0e1xuXHRcdFx0bGV0IGhvdENvbXBvbmVudDogQWRtaW5UYWJsZUZpZWxkID0gdGhpcy5oZWFkZXJzLmVsZW1lbnRzW2ZpZWxkTmFtZV0uaG90Q29tcG9uZW50O1xuXG5cdFx0XHRpZiAoaG90Q29tcG9uZW50ICE9IG51bGwpXG5cdFx0XHRcdHJldHVybiAoaG90Q29tcG9uZW50LmZpZWxkX3R5cGUpO1xuXHRcdH1cblxuXHRcdHJldHVybiAobnVsbCk7XG5cdH1cblxuXHQvKipcblx0ICogRXhlY3V0ZXMgd2hlbiBhIHJvdyBpcyBzZWxlY3RlZC5cblx0ICovXG5cdGFzeW5jIHNlbGVjdFJvdyAoaHRtbEVsZW1lbnQ6IEhUTUxFbGVtZW50LCByb3dJbmRleDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPlxuXHR7XG5cdFx0Ly8gSW4gdGhlIGZ1dHVyZSwgd2Ugd2lsbCBzdXBwb3J0IG11bHRpcGxlIHJvd3MgYmVpbmcgc2VsZWN0ZWQuIEZvciBub3cgXG5cdFx0Ly8gdGhpcyB3aWxsIGVuc3VyZSB0aGF0IG9ubHkgb25lIHJvdyBpcyBzZWxlY3RlZCBhdCBhIHRpbWUuXG5cdFx0e1xuXHRcdFx0bGV0IHRib2R5ID0gdGhpcy5odG1sRWxlbWVudHNbMV0uZ2V0RWxlbWVudHNCeVRhZ05hbWUgKFwidGJvZHlcIilbMF07XG5cdFx0XHRsZXQgcm93cyA9IHRib2R5LmdldEVsZW1lbnRzQnlUYWdOYW1lIChcInRyXCIpO1xuXG5cdFx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IHJvd3MubGVuZ3RoOyBpSWR4KyspXG5cdFx0XHR7XG5cdFx0XHRcdGxldCByb3c6IEhUTUxUYWJsZVJvd0VsZW1lbnQgPSByb3dzW2lJZHhdO1xuXG5cdFx0XHRcdGlmIChyb3cuY2xhc3NMaXN0LmNvbnRhaW5zIChcInRhYmxlLXByaW1hcnlcIikgPT09IHRydWUpXG5cdFx0XHRcdFx0cm93LmNsYXNzTGlzdC5yZW1vdmUgKFwidGFibGUtcHJpbWFyeVwiKTtcblx0XHRcdH1cblxuXHRcdFx0aHRtbEVsZW1lbnQuY2xhc3NMaXN0LmFkZCAoXCJ0YWJsZS1wcmltYXJ5XCIpO1xuXHRcdH1cblxuXHRcdHRoaXMuc2VsZWN0ZWQgPSByb3dJbmRleDtcblxuXHRcdGlmICh0eXBlb2YgKHRoaXMuc2luZ2xlY2xpY2tlZGl0KSA9PT0gXCJzdHJpbmdcIilcblx0XHRcdHRoaXMuc2luZ2xlY2xpY2tlZGl0ID0gSG90U3RhcS5wYXJzZUJvb2xlYW4gKHRoaXMuc2luZ2xlY2xpY2tlZGl0KTtcblxuXHRcdGlmICh0aGlzLnNpbmdsZWNsaWNrZWRpdCA9PT0gdHJ1ZSlcblx0XHR7XG5cdFx0XHRpZiAodGhpcy5hdHRhY2hlZEVkaXQgIT0gbnVsbClcblx0XHRcdFx0YXdhaXQgdGhpcy5hdHRhY2hlZEVkaXQuZWRpdENsaWNrZWQgKHRoaXMubmFtZSk7XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMub25zZWxlY3RlZHJvdyAhPSBudWxsKVxuXHRcdHtcblx0XHRcdGlmICh0eXBlb2YgKHRoaXMub25zZWxlY3RlZHJvdykgPT09IFwic3RyaW5nXCIpXG5cdFx0XHRcdHRoaXMub25zZWxlY3RlZHJvdyA9ICg8KHJvd0luZGV4OiBudW1iZXIsIGl0ZW06IGFueVtdKSA9PiBQcm9taXNlPGJvb2xlYW4+Pm5ldyBGdW5jdGlvbiAodGhpcy5vbnNlbGVjdGVkcm93KSk7XG5cblx0XHRcdGxldCBpdGVtOiBhbnlbXSA9IHRoaXMuZ2V0U2VsZWN0ZWQgKCk7XG5cblx0XHRcdGlmIChpdGVtID09IG51bGwpXG5cdFx0XHRcdHJldHVybjtcblxuXHRcdFx0bGV0IHJlc3VsdCA9IGF3YWl0IHRoaXMub25zZWxlY3RlZHJvdyAocm93SW5kZXgsIGl0ZW0pO1xuXG5cdFx0XHRpZiAocmVzdWx0ID09PSBmYWxzZSlcblx0XHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8qdGhpcy5zZWxlY3RlZFJvd3MgPSBbXTtcblx0XHRsZXQgdGJvZHkgPSB0aGlzLmh0bWxFbGVtZW50c1sxXS5nZXRFbGVtZW50c0J5VGFnTmFtZSAoXCJ0Ym9keVwiKVswXTtcblxuXHRcdC8vIEZpbmQgYWxsIHRoZSBjaGVja2JveGVzIGluIHRib2R5LlxuXHRcdGxldCBjaGVja2JveGVzID0gdGJvZHkuZ2V0RWxlbWVudHNCeVRhZ05hbWUgKFwiaW5wdXRcIik7XG5cblx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IGNoZWNrYm94ZXMubGVuZ3RoOyBpSWR4KyspXG5cdFx0e1xuXHRcdFx0bGV0IGNoZWNrYm94OiBIVE1MSW5wdXRFbGVtZW50ID0gY2hlY2tib3hlc1tpSWR4XTtcblxuXHRcdFx0aWYgKGNoZWNrYm94LmNoZWNrZWQgIT0gbnVsbClcblx0XHRcdHtcblx0XHRcdFx0aWYgKGNoZWNrYm94LmNoZWNrZWQgPT09IHRydWUpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHQvLyBHZXQgdGhlIGRhdGEtaW5kZXggYXR0cmlidXRlLlxuXHRcdFx0XHRcdGxldCBkYXRhSW5kZXhTdHI6IHN0cmluZyA9IGNoZWNrYm94LnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUgKFwiZGF0YS1pbmRleFwiKTtcblx0XHRcdFx0XHRsZXQgZGF0YUluZGV4OiBudW1iZXIgPSAgcGFyc2VJbnQgKGRhdGFJbmRleFN0cik7XG5cblx0XHRcdFx0XHR0aGlzLnNlbGVjdGVkUm93cy5wdXNoIChkYXRhSW5kZXgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSovXG5cdH1cblxuXHQvKipcblx0ICogR2V0IHRoZSBzZWxlY3RlZCBkYXRhLlxuXHQgKi9cblx0Z2V0U2VsZWN0ZWQgKCk6IGFueVtdXG5cdHtcblx0XHRsZXQgaW5kZXg6IG51bWJlciA9IHRoaXMuc2VsZWN0ZWQ7XG5cblx0XHRpZiAoaW5kZXggPCAwKVxuXHRcdFx0cmV0dXJuIChudWxsKTtcblxuXHRcdC8vIEB0cy1pZ25vcmVcblx0XHRjb25zdCByZXN1bHQgPSB0aGlzLmRhdGFUYWJsZS5yb3coaW5kZXgpLmRhdGEoKTtcblxuXHRcdHJldHVybiAocmVzdWx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgdGhlIHNlbGVjdGVkIGRhdGEuXG5cdCAqL1xuXHQvKmdldFNlbGVjdGVkUm93cyAoKTogYW55W11cblx0e1xuXHRcdGxldCByb3dzOiBhbnlbXSA9IFtdO1xuXG5cdFx0Zm9yIChsZXQgaUlkeCA9IDA7IGlJZHggPCB0aGlzLnNlbGVjdGVkUm93cy5sZW5ndGg7IGlJZHgrKylcblx0XHR7XG5cdFx0XHRsZXQgaW5kZXg6IG51bWJlciA9IHRoaXMuc2VsZWN0ZWRSb3dzW2lJZHhdO1xuXHRcdFx0cm93cy5wdXNoICh0aGlzLnJvd0VsZW1lbnRzW2luZGV4XS5maWVsZHMpO1xuXHRcdH1cblxuXHRcdHJldHVybiAocm93cyk7XG5cdH0qL1xuXG5cdC8qKlxuXHQgKiBHZXQgdGhlIGRhdGEgZm9yIGVhY2ggcm93IHRoYXQgaGFzIGJlZW4gY2hlY2tlZC5cblx0ICovXG5cdGdldENoZWNrZWRSb3dzICgpOiBhbnlbXVxuXHR7XG5cdFx0bGV0IHJvd3M6IGFueVtdID0gW107XG5cdFx0bGV0IHRib2R5ID0gdGhpcy5odG1sRWxlbWVudHNbMV0uZ2V0RWxlbWVudHNCeVRhZ05hbWUgKFwidGJvZHlcIilbMF07XG5cblx0XHQvLyBGaW5kIGFsbCB0aGUgY2hlY2tib3hlcyBpbiB0Ym9keS5cblx0XHRsZXQgY2hlY2tib3hlcyA9IHRib2R5LmdldEVsZW1lbnRzQnlUYWdOYW1lIChcImlucHV0XCIpO1xuXG5cdFx0Zm9yIChsZXQgaUlkeCA9IDA7IGlJZHggPCBjaGVja2JveGVzLmxlbmd0aDsgaUlkeCsrKVxuXHRcdHtcblx0XHRcdGxldCBjaGVja2JveDogSFRNTElucHV0RWxlbWVudCA9IGNoZWNrYm94ZXNbaUlkeF07XG5cblx0XHRcdGlmIChjaGVja2JveC5jaGVja2VkICE9IG51bGwpXG5cdFx0XHR7XG5cdFx0XHRcdGlmIChjaGVja2JveC5jaGVja2VkID09PSB0cnVlKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0Ly8gR2V0IHRoZSBkYXRhLWluZGV4IGF0dHJpYnV0ZS5cblx0XHRcdFx0XHRsZXQgZGF0YUluZGV4U3RyOiBzdHJpbmcgPSBjaGVja2JveC5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQuZ2V0QXR0cmlidXRlIChcImRhdGEtaW5kZXhcIik7XG5cdFx0XHRcdFx0bGV0IGRhdGFJbmRleDogbnVtYmVyID0gIHBhcnNlSW50IChkYXRhSW5kZXhTdHIpO1xuXG5cdFx0XHRcdFx0cm93cy5wdXNoICh0aGlzLnJvd0VsZW1lbnRzW2RhdGFJbmRleF0uZmllbGRzKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiAocm93cyk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IGEgcm93J3MgZGF0YS5cblx0ICovXG5cdGdldFJvdyAoaW5kZXg6IG51bWJlcik6IGFueVtdXG5cdHtcblx0XHRyZXR1cm4gKHRoaXMucm93RWxlbWVudHNbaW5kZXhdLmZpZWxkcyk7XG5cdH1cblxuXHQvKipcblx0ICogQWRkIGEgcm93IHRvIHRoZSB0YWJsZS5cblx0ICogXG5cdCAqIEBwYXJhbSB7QXJyYXl9IGZpZWxkcyBBIGxpc3Qgb2YgdmFsdWVzIHRvIGFwcGVuZC5cblx0ICovXG5cdGFkZFJvdyAoZmllbGRzOiB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfVtdKVxuXHR7XG5cdFx0aWYgKGZpZWxkcyA9PSBudWxsKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0aWYgKGZpZWxkcy5sZW5ndGggPT0gMClcblx0XHRcdHJldHVybjtcblxuXHRcdGxldCB0Ym9keSA9IHRoaXMuaHRtbEVsZW1lbnRzWzFdLmdldEVsZW1lbnRzQnlUYWdOYW1lIChcInRib2R5XCIpWzBdO1xuXHRcdGxldCBpbmRleDogbnVtYmVyID0gdGhpcy5yb3dFbGVtZW50cy5sZW5ndGg7XG5cdFx0Ly9sZXQgcm93U3RyID0gYDx0ciBvbmNsaWNrID0gXCJ0aGlzLnBhcmVudE5vZGUucGFyZW50Tm9kZS5wYXJlbnROb2RlLnBhcmVudE5vZGUuaG90Q29tcG9uZW50LnNlbGVjdFJvdyAodGhpcywgJHtpbmRleH0pO1wiPmA7XG5cblx0XHRpZiAodHlwZW9mICh0aGlzLmNoZWNrYm94KSA9PT0gXCJzdHJpbmdcIilcblx0XHRcdHRoaXMuY2hlY2tib3ggPSBIb3RTdGFxLnBhcnNlQm9vbGVhbiAodGhpcy5jaGVja2JveCk7XG5cblx0XHQvKmlmICh0aGlzLmNoZWNrYm94ID09PSB0cnVlKVxuXHRcdFx0cm93U3RyICs9IGA8dGQ+PGlucHV0IHR5cGUgPSBcImNoZWNrYm94XCIgLz48L3RkPmA7XG5cdFx0ZWxzZVxuXHRcdFx0cm93U3RyICs9IGA8dGQ+PC90ZD5gOyovXG5cdFx0bGV0IHJvd3NGaWVsZHM6IGFueVtdID0gW107XG5cblx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IHRoaXMuaGVhZGVycy5pbmRpY2llcy5sZW5ndGg7IGlJZHgrKylcblx0XHR7XG5cdFx0XHQvLyBAdHMtaWdub3JlIC0gQGZpeG1lIEkgbWVzc2VkIHRoaXMgdXAsIHdpbGwgZml4LlxuXHRcdFx0bGV0IGtleTogc3RyaW5nID0gdGhpcy5oZWFkZXJzLmluZGljaWVzW2lJZHhdO1xuXG5cdFx0XHRpZiAoa2V5ID09IG51bGwpXG5cdFx0XHRcdGNvbnRpbnVlO1xuXG5cdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHRsZXQgdmFsdWUgPSBmaWVsZHNba2V5XTtcblx0XHRcdC8vIEZvciBlYWNoIC4gaW4ga2V5IHdlIG5lZWQgdG8gZ2V0IHRoZSBuZXh0IG9iamVjdC5cblx0XHRcdGxldCBrZXlQYXJ0czogc3RyaW5nW10gPSBrZXkuc3BsaXQgKFwiLlwiKTtcblx0XHRcdFxuXHRcdFx0aWYgKGtleVBhcnRzLmxlbmd0aCA+IDEpXG5cdFx0XHR7XG5cdFx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdFx0bGV0IHRlbXBWYWx1ZTogYW55ID0gZmllbGRzW2tleVBhcnRzWzBdXTtcblxuXHRcdFx0XHRmb3IgKGxldCBpSWR4ID0gMTsgaUlkeCA8IGtleVBhcnRzLmxlbmd0aDsgaUlkeCsrKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0Y29uc3QgcGFydDogc3RyaW5nID0ga2V5UGFydHNbaUlkeF07XG5cblx0XHRcdFx0XHR0ZW1wVmFsdWUgPSB0ZW1wVmFsdWVbcGFydF07XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR2YWx1ZSA9IHRlbXBWYWx1ZTtcblx0XHRcdH1cblxuXHRcdFx0bGV0IHJvd09iaiA9IG51bGw7XG5cblx0XHRcdGlmICh0aGlzLmhlYWRlcnMuZWxlbWVudHNba2V5XSAhPSBudWxsKVxuXHRcdFx0e1xuXHRcdFx0XHQvLyBAdHMtaWdub3JlIC0gQGZpeG1lIEkgbWVzc2VkIHRoaXMgdXAsIHdpbGwgZml4LlxuXHRcdFx0XHRsZXQgZmllbGRUeXBlOiBzdHJpbmcgPSB0aGlzLmdldEZpZWxkVHlwZSAoa2V5KTtcblxuXHRcdFx0XHRpZiAoZmllbGRUeXBlID09IG51bGwpXG5cdFx0XHRcdFx0ZmllbGRUeXBlID0gXCJ0ZXh0XCI7XG5cblx0XHRcdFx0aWYgKGZpZWxkVHlwZSAhPT0gXCJyZW1vdmVcIilcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGNvbnN0IG9yZ0ZpZWxkID0gdGhpcy5oZWFkZXJzLmZpZWxkc1trZXldO1xuXHRcdFx0XHRcdGxldCBkZWZhdWx0T3V0cHV0OiBib29sZWFuID0gdHJ1ZTtcblxuXHRcdFx0XHRcdGlmIChvcmdGaWVsZCAhPSBudWxsKVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGlmIChvcmdGaWVsZC5vbmlucHV0ICE9IG51bGwpXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGlmICh0eXBlb2YgKG9yZ0ZpZWxkLm9uaW5wdXQpID09PSBcInN0cmluZ1wiKVxuXHRcdFx0XHRcdFx0XHRcdHRoaXMuaGVhZGVycy5maWVsZHNba2V5XS5vbmlucHV0ID0gKDwoaXRlbTogYW55KSA9PiBhbnk+bmV3IEZ1bmN0aW9uIChvcmdGaWVsZC5vbmlucHV0KSk7XG5cblx0XHRcdFx0XHRcdFx0dmFsdWUgPSBvcmdGaWVsZC5vbmlucHV0ICh2YWx1ZSk7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGlmIChvcmdGaWVsZC5vbm91dHB1dCAhPSBudWxsKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRpZiAodHlwZW9mIChvcmdGaWVsZC5vbm91dHB1dCkgPT09IFwic3RyaW5nXCIpXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5oZWFkZXJzLmZpZWxkc1trZXldLm9ub3V0cHV0ID0gKDwoaW5kZXg6IG51bWJlciwgdmFsdWU6IHN0cmluZykgPT4gc3RyaW5nPm5ldyBGdW5jdGlvbiAob3JnRmllbGQub25vdXRwdXQpKTtcblxuXHRcdFx0XHRcdFx0XHRkZWZhdWx0T3V0cHV0ID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IG5ld091dHB1dDogc3RyaW5nID0gb3JnRmllbGQub25vdXRwdXQgKGluZGV4LCB2YWx1ZSk7XG5cdFx0XHRcdFx0XHRcdC8vcm93U3RyICs9IG5ld091dHB1dDtcblx0XHRcdFx0XHRcdFx0cm93T2JqID0geyBpbmRleDogaW5kZXgsIHZhbHVlOiBuZXdPdXRwdXQgfTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAoZGVmYXVsdE91dHB1dCA9PT0gdHJ1ZSlcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHQvL3Jvd1N0ciArPSBgPHRkIGRhdGEtaW5kZXggPSBcIiR7aW5kZXh9XCI+JHt2YWx1ZX08L3RkPmA7XG5cdFx0XHRcdFx0XHRyb3dPYmogPSB2YWx1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0cm93c0ZpZWxkcy5wdXNoIChyb3dPYmopO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLnJvd3MgPT0gbnVsbClcblx0XHRcdHRoaXMucm93cyA9IFtdO1xuXG5cdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdC8vdGhpcy5kYXRhVGFibGUucm93LmFkZCAocm93c0ZpZWxkcyk7XG5cdFx0Ly90aGlzLnJvd3MucHVzaCAocm93c0ZpZWxkcyk7XG5cdFx0Lypyb3dTdHIgKz0gXCI8L3RyPlwiO1xuXG5cdFx0bGV0IG5ld09iaiA9IEhvdFN0YXEuYWRkSHRtbFVuc2FmZSAodGJvZHksIHJvd1N0cik7XG5cblx0XHR0aGlzLnJvd0VsZW1lbnRzLnB1c2ggKHtcblx0XHRcdFx0ZmllbGRzOiBmaWVsZHMsXG5cdFx0XHRcdGVsZW1lbnQ6ICg8SFRNTEVsZW1lbnQ+bmV3T2JqKVxuXHRcdFx0fSk7Ki9cblx0fVxuXG5cdHJvd3M6IGFueVtdO1xuXG5cdC8qKlxuXHQgKiBDbGVhciB0aGUgbGlzdCBvZiByb3dzLlxuXHQgKi9cblx0YXN5bmMgY2xlYXJSb3dzICgpXG5cdHtcblx0XHR0aGlzLnJvd0VsZW1lbnRzID0gW107XG5cblx0XHQvKmxldCB0Ym9keSA9IHRoaXMuaHRtbEVsZW1lbnRzWzFdLmdldEVsZW1lbnRzQnlUYWdOYW1lIChcInRib2R5XCIpWzBdO1xuXG5cdFx0dGJvZHkuaW5uZXJIVE1MID0gXCJcIjsqL1xuXG5cdFx0aWYgKHRoaXMuZGF0YVRhYmxlICE9IG51bGwpXG5cdFx0e1xuXHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0dGhpcy5kYXRhVGFibGUuY2xlYXIgKCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFJlZnJlc2ggdGhlIGxpc3QuXG5cdCAqIFxuXHQgKiBAcmV0dXJucyBUaGUgdG90YWwgbnVtYmVyIG9mIHJvd3MgYXZhaWxhYmxlIGluIHRoZSBsaXN0LlxuXHQgKi9cblx0YXN5bmMgcmVmcmVzaExpc3QgKGxpc3Q6IElBUElSZXNwb25zZSA9IG51bGwpOiBQcm9taXNlPElBUElSZXNwb25zZT5cblx0e1xuXHRcdHRoaXMuaXNMaXN0UmVmcmVzaGluZyA9IHRydWU7XG5cblx0XHRsZXQgc2VhcmNoOiBJTGlzdFNlYXJjaFByb3BlcnRpZXMgPSB7XG5cdFx0XHRcdHNlYXJjaDogXCJcIixcblx0XHRcdFx0b2Zmc2V0OiAwLFxuXHRcdFx0XHRsaW1pdDogMTBcblx0XHRcdH07XG5cblx0XHRpZiAodGhpcy5kYXRhVGFibGUgIT0gbnVsbClcblx0XHR7XG5cdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHRjb25zdCBzZWFyY2hTdHI6IHN0cmluZyA9IHRoaXMuZGF0YVRhYmxlLnNlYXJjaCAoKTtcblx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdGNvbnN0IGluZm8gPSB0aGlzLmRhdGFUYWJsZS5wYWdlLmluZm8gKCk7XG5cblx0XHRcdHNlYXJjaCA9IHtcblx0XHRcdFx0c2VhcmNoOiBzZWFyY2hTdHIgfHwgXCJcIixcblx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0XHRvZmZzZXQ6IGluZm8uc3RhcnQgfHwgMCxcblx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0XHRsaW1pdDogaW5mby5sZW5ndGggfHwgMTBcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMub25saXN0ICE9IG51bGwpXG5cdFx0e1xuXHRcdFx0aWYgKHR5cGVvZiAodGhpcy5vbmxpc3QpID09PSBcInN0cmluZ1wiKVxuXHRcdFx0XHR0aGlzLm9ubGlzdCA9ICg8KHNlYXJjaDogSUxpc3RTZWFyY2hQcm9wZXJ0aWVzKSA9PiBQcm9taXNlPElBUElSZXNwb25zZT4+bmV3IEZ1bmN0aW9uICh0aGlzLm9ubGlzdCkpO1xuXG5cdFx0XHRsaXN0ID0gYXdhaXQgdGhpcy5vbmxpc3QgKHNlYXJjaCk7XG5cdFx0fVxuXHRcdGVsc2Vcblx0XHR7XG5cdFx0XHRsZXQgbGlzdFVybDogc3RyaW5nID0gXCJcIjtcblxuXHRcdFx0aWYgKHRoaXMubGlzdHVybCAhPT0gXCJcIilcblx0XHRcdFx0bGlzdFVybCA9IHRoaXMubGlzdHVybDtcblxuXHRcdFx0aWYgKGxpc3RVcmwgIT09IFwiXCIpXG5cdFx0XHR7XG5cdFx0XHRcdGxpc3QgPSBhd2FpdCBIb3QuanNvblJlcXVlc3QgKGxpc3RVcmwsIHtcblx0XHRcdFx0XHRcdHNjaGVtYTogdGhpcy5zY2hlbWEsXG5cdFx0XHRcdFx0XHRzZWFyY2g6IHNlYXJjaFxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHRoaXMuY2xlYXJSb3dzICgpO1xuXG5cdFx0aWYgKGxpc3QgIT0gbnVsbClcblx0XHR7XG5cdFx0XHRpZiAobGlzdC5lcnJvciAhPSBudWxsKVxuXHRcdFx0e1xuXHRcdFx0XHRjb25zb2xlLmVycm9yIChgTGlzdCBlcnJvcjogJHtsaXN0LmVycm9yfWApO1xuXHRcdFx0XHR0aGlzLmlzTGlzdFJlZnJlc2hpbmcgPSBmYWxzZTtcblxuXHRcdFx0XHRyZXR1cm4gKG51bGwpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAobGlzdC5kYXRhID09IG51bGwpXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvciAoYFJldHVybmluZyBsaXN0IGRhdGEgdG8gXCIke3RoaXMubmFtZX1cIiBjb21wb25lbnQgaGFzIGEgbnVsbCBkYXRhIGZpZWxkLiBBUEkgcmVzcG9uc2UgZG9lcyBub3QgbWF0Y2ggdGhlIFwiSUFQSVJlc3BvbnNlXCIgc2NoZW1hLmApO1xuXG5cdFx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IGxpc3QuZGF0YS5sZW5ndGg7IGlJZHgrKylcblx0XHRcdHtcblx0XHRcdFx0bGV0IGVsbSA9IGxpc3QuZGF0YVtpSWR4XTtcblxuXHRcdFx0XHRmb3IgKGxldCBrZXkgaW4gZWxtKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGV0IHZhbHVlID0gZWxtW2tleV07XG5cdFx0XHRcdFx0bGV0IGZpZWxkVHlwZTogc3RyaW5nID0gdGhpcy5nZXRGaWVsZFR5cGUgKGtleSk7XG5cblx0XHRcdFx0XHRpZiAoZmllbGRUeXBlID09IG51bGwpXG5cdFx0XHRcdFx0XHRmaWVsZFR5cGUgPSBcInRleHRcIjtcblxuXHRcdFx0XHRcdGlmIChmaWVsZFR5cGUgIT09IFwicmVtb3ZlXCIpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0Y29uc3Qgb3JnRmllbGQgPSB0aGlzLmhlYWRlcnMuZmllbGRzW2tleV07XG5cdFx0XHRcdFx0XHRsZXQgZGVmYXVsdE91dHB1dDogYm9vbGVhbiA9IHRydWU7XG5cblx0XHRcdFx0XHRcdGlmIChvcmdGaWVsZCAhPSBudWxsKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRpZiAob3JnRmllbGQub25pbnB1dCAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKHR5cGVvZiAob3JnRmllbGQub25pbnB1dCkgPT09IFwic3RyaW5nXCIpXG5cdFx0XHRcdFx0XHRcdFx0XHR0aGlzLmhlYWRlcnMuZmllbGRzW2tleV0ub25pbnB1dCA9ICg8KGl0ZW06IGFueSkgPT4gYW55Pm5ldyBGdW5jdGlvbiAob3JnRmllbGQub25pbnB1dCkpO1xuXG5cdFx0XHRcdFx0XHRcdFx0dmFsdWUgPSBvcmdGaWVsZC5vbmlucHV0ICh2YWx1ZSk7XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRpZiAob3JnRmllbGQub25vdXRwdXQgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdGlmICh0eXBlb2YgKG9yZ0ZpZWxkLm9ub3V0cHV0KSA9PT0gXCJzdHJpbmdcIilcblx0XHRcdFx0XHRcdFx0XHRcdHRoaXMuaGVhZGVycy5maWVsZHNba2V5XS5vbm91dHB1dCA9ICg8KGluZGV4OiBudW1iZXIsIHZhbHVlOiBzdHJpbmcpID0+IHN0cmluZz5uZXcgRnVuY3Rpb24gKG9yZ0ZpZWxkLm9ub3V0cHV0KSk7XG5cblx0XHRcdFx0XHRcdFx0XHRkZWZhdWx0T3V0cHV0ID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgbmV3T3V0cHV0OiBzdHJpbmcgPSBvcmdGaWVsZC5vbm91dHB1dCAoaUlkeCwgdmFsdWUpO1xuXHRcdFx0XHRcdFx0XHRcdHZhbHVlID0gbmV3T3V0cHV0O1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGxpc3QuZGF0YVtpSWR4XVtrZXldID0gdmFsdWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0bGV0IHRib2R5ID0gdGhpcy5odG1sRWxlbWVudHNbMV0uZ2V0RWxlbWVudHNCeVRhZ05hbWUgKFwidGJvZHlcIilbMF07XG5cdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdHRib2R5LmhvdENvbXBvbmVudCA9IHRoaXM7XG5cdFx0JCh0Ym9keSkub24gKCdjbGljaycsICd0cicsIGZ1bmN0aW9uICgpXG5cdFx0XHR7XG5cdFx0XHRcdGNvbnN0IGhvdENvbXBvbmVudDogQWRtaW5UYWJsZSA9IHRoaXMucGFyZW50Tm9kZS5ob3RDb21wb25lbnQ7XG5cdFx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdFx0Y29uc3QgaW5kZXggPSBob3RDb21wb25lbnQuZGF0YVRhYmxlLnJvdyAodGhpcykuaW5kZXggKCk7XG5cblx0XHRcdFx0aWYgKGluZGV4ICE9IG51bGwpXG5cdFx0XHRcdFx0aG90Q29tcG9uZW50LnNlbGVjdFJvdyAodGhpcywgaW5kZXgpO1xuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRpZiAoaG90Q29tcG9uZW50LmF0dGFjaGVkRWRpdCAhPSBudWxsKVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGlmIChob3RDb21wb25lbnQuYXR0YWNoZWRFZGl0LmFkZENsaWNrZWQgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0aG90Q29tcG9uZW50LmF0dGFjaGVkRWRpdC5hZGRDbGlja2VkICgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cblx0XHR0aGlzLmlzTGlzdFJlZnJlc2hpbmcgPSBmYWxzZTtcblxuXHRcdHJldHVybiAobGlzdCk7XG5cdH1cblxuXHQvKipcblx0ICogUHJlcGFyZSBkYXRhLlxuXHQgKi9cblx0cHJlcGFyZURhdGEgKGN1cnJlbnREYXRhOiBhbnlbXSB8IElBUElSZXNwb25zZSk6IHtcblx0XHRcdGRyYXc6IGFueTtcblx0XHRcdGRhdGE6IGFueVtdO1xuXHRcdFx0cmVjb3Jkc1RvdGFsOiBudW1iZXI7XG5cdFx0XHRyZWNvcmRzRmlsdGVyZWQ6IG51bWJlcjtcblx0XHR9XG5cdHtcblx0XHRjb25zdCBjYWxsYmFja09iajogYW55ID0ge1xuXHRcdFx0ZHJhdzogdGhpcy50YWJsZURhdGEsXG5cdFx0XHRkYXRhOiBbXSxcblx0XHRcdHJlY29yZHNUb3RhbDogMCxcblx0XHRcdHJlY29yZHNGaWx0ZXJlZDogMFxuXHRcdH07XG5cblx0XHRpZiAoY3VycmVudERhdGEgIT0gbnVsbClcblx0XHR7XG5cdFx0XHRpZiAoISAoY3VycmVudERhdGEgaW5zdGFuY2VvZiBBcnJheSkpXG5cdFx0XHR7XG5cdFx0XHRcdGlmIChjdXJyZW50RGF0YS5sZW5ndGggIT0gbnVsbClcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGNhbGxiYWNrT2JqLnJlY29yZHNUb3RhbCA9IGN1cnJlbnREYXRhLmxlbmd0aDtcblx0XHRcdFx0XHRjYWxsYmFja09iai5yZWNvcmRzRmlsdGVyZWQgPSBjdXJyZW50RGF0YS5sZW5ndGg7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoY3VycmVudERhdGEuZGF0YSAhPSBudWxsKVxuXHRcdFx0XHRcdGNhbGxiYWNrT2JqLmRhdGEgPSBjdXJyZW50RGF0YS5kYXRhO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZVxuXHRcdFx0e1xuXHRcdFx0XHRjYWxsYmFja09iai5kYXRhID0gY3VycmVudERhdGE7XG5cdFx0XHRcdGNhbGxiYWNrT2JqLnJlY29yZHNUb3RhbCA9IGN1cnJlbnREYXRhLmxlbmd0aDtcblx0XHRcdFx0Y2FsbGJhY2tPYmoucmVjb3Jkc0ZpbHRlcmVkID0gY3VycmVudERhdGEubGVuZ3RoO1xuXHRcdFx0fVxuXG5cdFx0XHRsZXQgc2FuaXRpemUgPSB0cnVlO1xuXG5cdFx0XHRpZiAoY2FsbGJhY2tPYmouZGF0YS5ob3RTYW5pdGl6ZSAhPSBudWxsKVxuXHRcdFx0XHRzYW5pdGl6ZSA9IGNhbGxiYWNrT2JqLmRhdGEuaG90U2FuaXRpemU7XG5cblx0XHRcdGZvciAobGV0IGlJZHggPSAwOyBpSWR4IDwgY2FsbGJhY2tPYmouZGF0YS5sZW5ndGg7IGlJZHgrKylcblx0XHRcdHtcblx0XHRcdFx0Y29uc3Qgcm93ID0gY2FsbGJhY2tPYmouZGF0YVtpSWR4XTtcblxuXHRcdFx0XHRpZiAoc2FuaXRpemUgPT09IHRydWUpXG5cdFx0XHRcdFx0Y2FsbGJhY2tPYmouZGF0YVtpSWR4XSA9IEhvdFN0YXEuc2FuaXRpemVKU09OIChyb3cpO1xuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0Y2FsbGJhY2tPYmouZGF0YVtpSWR4XSA9IHJvdztcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gKGNhbGxiYWNrT2JqKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgdGhlIGxpc3Qgb2YgZGF0YSBmcm9tIHRoZSBzZXJ2ZXIuXG5cdCAqL1xuXHRvblBvc3RQbGFjZSAocGFyZW50SHRtbEVsZW1lbnQ6IEhUTUxFbGVtZW50LCBodG1sRWxlbWVudDogSFRNTEVsZW1lbnQpOiBIVE1MRWxlbWVudFxuXHR7XG5cdFx0c2V0VGltZW91dCAoYXN5bmMgKCkgPT5cblx0XHRcdHtcblx0XHRcdFx0Y29uc3QgdGFibGUgPSAkKGh0bWxFbGVtZW50KS5maW5kKFwidGFibGVcIik7XG5cblx0XHRcdFx0Ly8gVGhlIGRhdGEgc3RvcmVkIGluIGNvbHVtbnMgc2hvdWxkIGJlIGNvbnNpZGVyZWQgc2FmZSBhcyBpdCBjb21lcyBkaXJlY3RseSBmcm9tIFxuXHRcdFx0XHQvLyB0aGUgSFRNTCBhZnRlciBsb2FkLlxuXHRcdFx0XHRsZXQgY29sdW1uczogQ29uZmlnQ29sdW1uc1tdID0gW107XG5cdFx0XHRcdCQodGFibGUpLmZpbmQgKFwidGhlYWQgdGhcIikuZWFjaCAoZnVuY3Rpb24gKClcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRjb25zdCB0ZXh0ID0gJCh0aGlzKS50ZXh0ICgpO1xuXHRcdFx0XHRcdFx0Y29uc3QgZGF0YSA9ICQodGhpcykuZGF0YSAoXCJmaWVsZFwiKTtcblx0XHRcdFx0XHRcdGxldCBkYXRhVHlwZSA9ICQodGhpcykuZGF0YSAoXCJmaWVsZC10eXBlXCIpO1xuXG5cdFx0XHRcdFx0XHRpZiAoKHRleHQgPT0gbnVsbCkgfHwgKHRleHQgPT09IFwiXCIpKVxuXHRcdFx0XHRcdFx0XHRyZXR1cm47XG5cblx0XHRcdFx0XHRcdGlmICgoZGF0YSA9PSBudWxsKSB8fCAoZGF0YSA9PT0gXCJcIikpXG5cdFx0XHRcdFx0XHRcdHJldHVybjtcblxuXHRcdFx0XHRcdFx0aWYgKGRhdGFUeXBlID09PSBcInRleHRcIilcblx0XHRcdFx0XHRcdFx0ZGF0YVR5cGUgPSBcInN0cmluZ1wiO1xuXG5cdFx0XHRcdFx0XHQvLyBTdGFtcCBkYXRhLWxhYmVsPVwiPGNvbHVtbiB0aXRsZT5cIiBvbiBlYWNoIHJlbmRlcmVkIDx0ZD5cblx0XHRcdFx0XHRcdC8vIHNvIGNvbnN1bWVycyBjYW4gdHJhbnNmb3JtIHRhYmxlcyB0byBjYXJkLW1vZGUgYmVsb3dcblx0XHRcdFx0XHRcdC8vIHRoZSBtb2JpbGUgYnJlYWtwb2ludCB2aWEgQ1NTIGF0dHIoKS5cblx0XHRcdFx0XHRcdGNvbnN0IGxhYmVsID0gdGV4dDtcblx0XHRcdFx0XHRcdGNvbHVtbnMucHVzaCh7XG5cdFx0XHRcdFx0XHRcdFx0dGl0bGU6IHRleHQsXG5cdFx0XHRcdFx0XHRcdFx0ZGF0YTogZGF0YSxcblx0XHRcdFx0XHRcdFx0XHRjcmVhdGVkQ2VsbDogZnVuY3Rpb24gKGNlbGw6IE5vZGUsIF9jZWxsRGF0YTogYW55LCBfcm93RGF0YTogYW55LCBfcm93SWR4OiBudW1iZXIsIF9jb2xJZHg6IG51bWJlcilcblx0XHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0KGNlbGwgYXMgSFRNTEVsZW1lbnQpLnNldEF0dHJpYnV0ZSAoXCJkYXRhLWxhYmVsXCIsIGxhYmVsKTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0JCh0YWJsZSkuZmluZCAoXCJ0aGVhZFwiKS5yZW1vdmUgKCk7XG5cblx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0XHR0aGlzLmRhdGFUYWJsZSA9IG5ldyBEYXRhVGFibGUgKHRhYmxlWzBdLCB7XG5cdFx0XHRcdFx0cHJvY2Vzc2luZzogdHJ1ZSxcblx0XHRcdFx0XHRzZXJ2ZXJTaWRlOiB0cnVlLFxuXHRcdFx0XHRcdGNvbFJlb3JkZXI6IHRydWUsXG5cdFx0XHRcdFx0c2Nyb2xsZXI6IHRydWUsXG5cdFx0XHRcdFx0c2VsZWN0OiB0cnVlLFxuXHRcdFx0XHRcdGRvbTogJ1FsZnJ0aXAnLFxuXHRcdFx0XHRcdGNvbHVtbnM6IGNvbHVtbnMsXG5cdFx0XHRcdFx0ZGF0YTogW10sXG5cdFx0XHRcdFx0YWpheDogYXN5bmMgKGRhdGE6IG9iamVjdCwgY2FsbGJhY2s6ICgoZGF0YTogYW55KSA9PiB2b2lkKSwgc2V0dGluZ3M6IEludGVybmFsU2V0dGluZ3MpID0+XG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGlmICh0aGlzLmlzTGlzdFJlZnJlc2hpbmcgPT09IHRydWUpXG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHRcdFx0XHRcdHRoaXMudGFibGVDYWxsYmFjayA9IGNhbGxiYWNrO1xuXHRcdFx0XHRcdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHRcdFx0XHRcdHRoaXMudGFibGVEYXRhID0gZGF0YS5kcmF3O1xuXG5cdFx0XHRcdFx0XHRcdGxldCBjdXJyZW50RGF0YSA9IGF3YWl0IHRoaXMucmVmcmVzaExpc3QgKCk7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHByZXBhcmVkRGF0YSA9IHRoaXMucHJlcGFyZURhdGEgKGN1cnJlbnREYXRhKTtcblxuXHRcdFx0XHRcdFx0XHR0aGlzLnRhYmxlQ2FsbGJhY2sgKHByZXBhcmVkRGF0YSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9LCA1MCk7IC8vLyBAdG9kbyBGaXggdGhpcyBzdHVwaWQgaGFjay4gVGhpcyBzaG91bGQgaGFwcGVuIHNsaWdodGx5IGFmdGVyIHRoZSBkb2N1bWVudCBoYXMgYmVlbiBsb2FkZWQuXG5cblx0XHRyZXR1cm4gKG51bGwpO1xuXHR9XG5cblx0b3V0cHV0ICgpOiBzdHJpbmcgfCBIb3RDb21wb25lbnRPdXRwdXRbXVxuXHR7XG5cdFx0bGV0IGVtcHR5Q2hlY2tib3hIZWFkZXI6IHN0cmluZyA9IFwiPHRoPjwvdGg+XCI7XG5cblx0XHRyZXR1cm4gKGBcblx0XHQ8ZGl2IGlkID0gXCIke3RoaXMuaHRtbEVsZW1lbnRzWzBdLmlkfVwiPlxuXHRcdFx0PGgyPiR7dGhpcy50aXRsZX08L2gyPlxuXHRcdFx0PGRpdiBjbGFzcz1cInRhYmxlLXJlc3BvbnNpdmVcIj5cblx0XHRcdDx0YWJsZSBpZCA9IFwiJHt0aGlzLmh0bWxFbGVtZW50c1swXS5pZH1UYWJsZVwiIGNsYXNzPVwidGFibGUgdGFibGUtc3RyaXBlZCB0YWJsZS1zbVwiPlxuXHRcdFx0XHQ8dGhlYWQ+XG5cdFx0XHRcdFx0PHRyIGhvdC1wbGFjZS1oZXJlID0gXCJoZWFkZXJcIj5cblx0XHRcdFx0XHRcdCR7ZW1wdHlDaGVja2JveEhlYWRlcn1cblx0XHRcdFx0XHQ8L3RyPlxuXHRcdFx0XHQ8L3RoZWFkPlxuXHRcdFx0XHQ8dGJvZHkgaG90LXBsYWNlLWhlcmUgPSBcInJlc3VsdHNcIj5cblx0XHRcdFx0PC90Ym9keT5cblx0XHRcdDwvdGFibGU+XG5cdFx0XHQ8aG90LXBsYWNlLWhlcmUgbmFtZSA9IFwiYWZ0ZXJUYWJsZVwiPjwvaG90LXBsYWNlLWhlcmU+XG5cdFx0XHQ8L2Rpdj5cblx0XHQ8L2Rpdj5gKTtcblx0fVxufVxuIiwiaW1wb3J0IHsgSG90U3RhcSwgSG90LCBIb3RBUEksIEhvdENvbXBvbmVudCwgSG90Q29tcG9uZW50T3V0cHV0IH0gZnJvbSBcImhvdHN0YXFcIjtcblxuZXhwb3J0IGNsYXNzIEFkbWluVGV4dCBleHRlbmRzIEhvdENvbXBvbmVudFxue1xuXHQvKipcblx0ICogSWYgc2V0IHRvIDEsIHRoaXMgd2lsbCBub3Qgb3V0cHV0IHRoZSBmaWVsZC5cblx0ICovXG5cdG5vX291dHB1dDogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIGNsYXNzZXMgdG8gc2V0IGZvciB0aGUgaW5wdXQuXG5cdCAqIEBkZWZhdWx0IFwiZm9ybS1jb250cm9sXCJcblx0ICovXG5cdGNzc19jbGFzczogc3RyaW5nO1xuXG5cdGNvbnN0cnVjdG9yIChjb3B5OiBIb3RDb21wb25lbnQgfCBIb3RTdGFxLCBhcGk6IEhvdEFQSSlcblx0e1xuXHRcdHN1cGVyIChjb3B5LCBhcGkpO1xuXG5cdFx0dGhpcy50YWcgPSBcImFkbWluLXRleHRcIjtcblx0XHR0aGlzLm5vX291dHB1dCA9IFwiMFwiO1xuXHRcdHRoaXMuY3NzX2NsYXNzID0gXCJmb3JtLWNvbnRyb2xcIlxuXHR9XG5cblx0LyoqXG5cdCAqIENvcnJlY3RzIHRoZSBwbGFjZW1lbnQgb2YgdGhlIHRleHQgZWxlbWVudHMgZm9yIG1vZGFscy5cblx0ICovXG5cdG9uUG9zdFBsYWNlIChwYXJlbnRIdG1sRWxlbWVudDogSFRNTEVsZW1lbnQsIGh0bWxFbGVtZW50OiBIVE1MRWxlbWVudCk6IEhUTUxFbGVtZW50XG5cdHtcblx0XHRsZXQgcGxhY2VIZXJlQXJyYXkgPSBwYXJlbnRIdG1sRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsIChgaG90LXBsYWNlLWhlcmVbdHlwZT1cIm1vZGFsXCJdYCk7XG5cblx0XHRpZiAocGxhY2VIZXJlQXJyYXkubGVuZ3RoID4gMClcblx0XHR7XG5cdFx0XHRsZXQgcGxhY2VIZXJlID0gcGxhY2VIZXJlQXJyYXlbMF07XG5cdFx0XHRwYXJlbnRIdG1sRWxlbWVudC5yZW1vdmVDaGlsZCAoaHRtbEVsZW1lbnQpO1xuXHRcdFx0cGxhY2VIZXJlLmFwcGVuZENoaWxkIChodG1sRWxlbWVudCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIChudWxsKTtcblx0fVxuXG5cdG91dHB1dCAoKTogc3RyaW5nIHwgSG90Q29tcG9uZW50T3V0cHV0W11cblx0e1xuXHRcdGxldCB2YWx1ZTogc3RyaW5nID0gXCJcIjtcblxuXHRcdGlmICh0aGlzLnZhbHVlICE9IG51bGwpXG5cdFx0XHR2YWx1ZSA9IHRoaXMudmFsdWU7XG5cblx0XHRpZiAodGhpcy5ub19vdXRwdXQgPT09IFwiMVwiKVxuXHRcdFx0cmV0dXJuIChgPGRpdj48aW5wdXQgY2xhc3M9XCIke3RoaXMuY3NzX2NsYXNzfVwiIHR5cGUgPSBcImhpZGRlblwiIHZhbHVlID0gXCIke3ZhbHVlfVwiIC8+PC9kaXY+YCk7XG5cblx0XHRjb25zdCBmaWVsZCA9IHRoaXMuaHRtbEVsZW1lbnRzWzBdLmdldEF0dHJpYnV0ZSAoXCJob3QtZmllbGRcIik7XG5cdFx0bGV0IGZpZWxkX3R5cGUgPSB0aGlzLmh0bWxFbGVtZW50c1swXS5nZXRBdHRyaWJ1dGUgKFwiaG90LWZpZWxkLXR5cGVcIik7XG5cdFx0bGV0IGh0bWxUeXBlID0gdGhpcy5odG1sRWxlbWVudHNbMF0uZ2V0QXR0cmlidXRlIChcInR5cGVcIikgfHwgXCJ0ZXh0XCI7XG5cblx0XHRpZiAoZmllbGRfdHlwZSA9PSBudWxsKVxuXHRcdFx0ZmllbGRfdHlwZSA9IFwidGV4dFwiO1xuXG5cdFx0cmV0dXJuIChgPGRpdj5cblx0XHRcdDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIj4ke3RoaXMuaW5uZXJ9PC9sYWJlbD5cblx0XHRcdDxpbnB1dCBjbGFzcz1cIiR7dGhpcy5jc3NfY2xhc3N9XCIgdHlwZSA9IFwiJHtodG1sVHlwZX1cIiBob3QtZmllbGQgPSBcIiR7ZmllbGR9XCIgaG90LWZpZWxkLXR5cGUgPSBcIiR7ZmllbGRfdHlwZX1cIiB2YWx1ZSA9IFwiJHt2YWx1ZX1cIiAvPlxuXHRcdDwvZGl2PmApO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBIb3RTdGFxLCBIb3QsIEhvdEFQSSwgSG90Q29tcG9uZW50LCBIb3RDb21wb25lbnRPdXRwdXQgfSBmcm9tIFwiaG90c3RhcVwiO1xuXG4vKipcbiAqIFBpbm5lZCBpbmZvIGNhcmQg4oCUIHNob3J0IGhlYWRsaW5lICsgYm9keSB0ZXh0LCBpbmRpZ28gbGVmdCBib3JkZXIuXG4gKiBQYXR0ZXJuIGxpZnRlZCBmcm9tIHRoZSBEb25vclRpZXJzIFwiTm8gZ292ZXJuYW5jZSBpbmZsdWVuY2VcIlxuICogZGlzY2xhaW1lciBvbiAvZG9ub3JUaWVycy4gVXNlZnVsIGZvciBcIm5vIGluZmx1ZW5jZVwiLCBcImRyYWZ0IG9ubHlcIixcbiAqIFwiaW50ZXJuYWwgdXNlXCIsIGV0Yy4gbm90ZXMgdGhhdCBiZWxvbmcgYWJvdmUgdGhlIG1haW4gY29udGVudC5cbiAqXG4gKiBVc2FnZTpcbiAqICAgPGFkbWluLWRpc2NsYWltZXIgaG90LWhlYWRpbmc9XCJEaXNjbGFpbWVyXCI+XG4gKiAgICAgVGhlIGJvZHkgdGV4dCBvZiB0aGUgZGlzY2xhaW1lciBnb2VzIGhlcmUuXG4gKiAgIDwvYWRtaW4tZGlzY2xhaW1lcj5cbiAqL1xuZXhwb3J0IGNsYXNzIEFkbWluRGlzY2xhaW1lciBleHRlbmRzIEhvdENvbXBvbmVudFxue1xuXHQvKiogSGVhZGluZyAoaDIuaDYpLiAqL1xuXHRoZWFkaW5nOiBzdHJpbmc7XG5cdC8qKiBBY2NlbnQgY29sb3IgZm9yIHRoZSBsZWZ0IGJvcmRlci4gKi9cblx0YWNjZW50OiBzdHJpbmc7XG5cblx0Y29uc3RydWN0b3IgKGNvcHk6IEhvdENvbXBvbmVudCB8IEhvdFN0YXEsIGFwaTogSG90QVBJKVxuXHR7XG5cdFx0c3VwZXIgKGNvcHksIGFwaSk7XG5cblx0XHR0aGlzLnRhZyAgICAgPSBcImFkbWluLWRpc2NsYWltZXJcIjtcblx0XHR0aGlzLmhlYWRpbmcgPSBcIlwiO1xuXHRcdHRoaXMuYWNjZW50ICA9IFwiIzRmNDZlNVwiO1xuXHR9XG5cblx0b3V0cHV0ICgpOiBzdHJpbmcgfCBIb3RDb21wb25lbnRPdXRwdXRbXVxuXHR7XG5cdFx0Y29uc3QgaGVhZGluZyA9IHRoaXMuaGVhZGluZyA/IGA8aDIgY2xhc3M9XCJoNiBtYi0yXCIgc3R5bGU9XCJsZXR0ZXItc3BhY2luZzowLjAyZW07XCI+JHt0aGlzLmhlYWRpbmd9PC9oMj5gIDogXCJcIjtcblx0XHRyZXR1cm4gYFxuXHRcdFx0PGRpdiBjbGFzcz1cImNhcmQgZmwtZGlzY2xhaW1lciBtYi0zXCIgc3R5bGU9XCJib3JkZXItbGVmdDo0cHggc29saWQgJHt0aGlzLmFjY2VudH07XCI+XG5cdFx0XHRcdDxkaXYgY2xhc3M9XCJjYXJkLWJvZHlcIj5cblx0XHRcdFx0XHQke2hlYWRpbmd9XG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cIm1iLTAgdGV4dC1tdXRlZFwiIHN0eWxlPVwiZm9udC1zaXplOjAuOXJlbTtsaW5lLWhlaWdodDoxLjQ1O1wiPlxuXHRcdFx0XHRcdFx0JHt0aGlzLmlubmVyIHx8IFwiXCJ9XG5cdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdDwvZGl2PlxuXHRcdFx0PC9kaXY+YDtcblx0fVxufVxuIiwiaW1wb3J0IHsgSG90U3RhcSwgSG90LCBIb3RBUEksIEhvdENvbXBvbmVudCwgSG90Q29tcG9uZW50T3V0cHV0IH0gZnJvbSBcImhvdHN0YXFcIjtcbmltcG9ydCB7IEFkbWluVGFibGUgfSBmcm9tIFwiLi9hZG1pbi10YWJsZVwiO1xuXG5leHBvcnQgY2xhc3MgQWRtaW5UYWJsZUZpZWxkIGV4dGVuZHMgSG90Q29tcG9uZW50XG57XG5cdC8qKlxuXHQgKiBUaGUgdGFibGUgZmllbGQuXG5cdCAqL1xuXHRmaWVsZDogbnVtYmVyO1xuXHQvKipcblx0ICogVGhlIHR5cGUgb2YgZmllbGQuIENhbiBiZTpcblx0ICogKiB0ZXh0XG5cdCAqICogcmVtb3ZlXG5cdCAqIFxuXHQgKiBEZWZhdWx0OiB0ZXh0XG5cdCAqL1xuXHRmaWVsZF90eXBlOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBJZiBzZXQgdG8gMSwgdGhpcyB3aWxsIG5vdCBvdXRwdXQgdGhlIGZpZWxkLlxuXHQgKi9cblx0bm9fb3V0cHV0OiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgb25pbnB1dCBldmVudCBpcyBmaXJlZCB3aGVuIGFuIGl0ZW0gaXMgYWJvdXQgdG8gYmUgcGxhY2VkIGludG8gdGhlIHRhYmxlLlxuXHQgKi9cblx0b25pbnB1dDogKGl0ZW06IGFueSkgPT4gYW55O1xuXHQvKipcblx0ICogVGhlIG91dHB1dCB0byBkaXNwbGF5LlxuXHQgKi9cblx0b25vdXRwdXQ6IChpbmRleDogbnVtYmVyLCB2YWx1ZTogc3RyaW5nKSA9PiBzdHJpbmc7XG5cblx0Y29uc3RydWN0b3IgKGNvcHk6IEhvdENvbXBvbmVudCB8IEhvdFN0YXEsIGFwaTogSG90QVBJKVxuXHR7XG5cdFx0c3VwZXIgKGNvcHksIGFwaSk7XG5cblx0XHR0aGlzLnRhZyA9IFwiYWRtaW4tdGFibGUtZmllbGRcIjtcblx0XHR0aGlzLmZpZWxkID0gMDtcblx0XHR0aGlzLmZpZWxkX3R5cGUgPSBcInRleHRcIjtcblx0XHR0aGlzLm5vX291dHB1dCA9IFwiMFwiO1xuXHRcdHRoaXMub25pbnB1dCA9IG51bGw7XG5cdFx0dGhpcy5vbm91dHB1dCA9IG51bGw7XG5cdH1cblxuXHQvKipcblx0ICogQWRkIHRoaXMgdGFibGUgZmllbGQgdG8gdGhlIHRhYmxlXG5cdCAqL1xuXHRvblBvc3RQbGFjZSAocGFyZW50SHRtbEVsZW1lbnQ6IEhUTUxFbGVtZW50LCBodG1sRWxlbWVudDogSFRNTEVsZW1lbnQpOiBIVE1MRWxlbWVudFxuXHR7XG5cdFx0bGV0IGhvdENvbXBvbmVudDogQWRtaW5UYWJsZSA9IG51bGw7XG5cblx0XHQvLyBAdHMtaWdub3JlXG5cdFx0aWYgKHBhcmVudEh0bWxFbGVtZW50LnBhcmVudE5vZGUucGFyZW50Tm9kZS5ob3RDb21wb25lbnQgIT0gbnVsbClcblx0XHR7XG5cdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHRob3RDb21wb25lbnQgPSBwYXJlbnRIdG1sRWxlbWVudC5wYXJlbnROb2RlLnBhcmVudE5vZGUuaG90Q29tcG9uZW50O1xuXHRcdH1cblx0XHRlbHNlXG5cdFx0e1xuXHRcdFx0Ly8gQHRzLWlnbm9yZSAtIGxvb29vbC4gQWRkIGEgYmV0dGVyIHdheSB0byBnZXQgdGhlIHBhcmVudCBIb3RDb21wb25lbnQuXG5cdFx0XHRob3RDb21wb25lbnQgPSBwYXJlbnRIdG1sRWxlbWVudC5wYXJlbnROb2RlLnBhcmVudE5vZGUucGFyZW50Tm9kZS5wYXJlbnROb2RlLmhvdENvbXBvbmVudDtcblx0XHR9XG5cblx0XHRpZiAoaG90Q29tcG9uZW50ICE9IG51bGwpXG5cdFx0XHRob3RDb21wb25lbnQuYWRkSGVhZGVyRGF0YU9ubHkgKHRoaXMsIGh0bWxFbGVtZW50KTtcblxuXHRcdHJldHVybiAobnVsbCk7XG5cdH1cblxuXHRvdXRwdXQgKCk6IHN0cmluZyB8IEhvdENvbXBvbmVudE91dHB1dFtdXG5cdHtcblx0XHRpZiAodGhpcy5ub19vdXRwdXQgPT09IFwiMVwiKVxuXHRcdHtcblx0XHRcdHJldHVybiAoW3tcblx0XHRcdFx0aHRtbDogYDxkaXY+PC9kaXY+YCxcblx0XHRcdFx0cGxhY2VIZXJlUGFyZW50OiBcImFmdGVyVGFibGVcIlxuXHRcdFx0fV0pO1xuXHRcdH1cblxuXHRcdHJldHVybiAoW3tcblx0XHRcdGh0bWw6IGA8dGggZGF0YS1maWVsZCA9IFwiJHt0aGlzLmZpZWxkfVwiIGRhdGEtZmllbGQtdHlwZSA9IFwiJHt0aGlzLmZpZWxkX3R5cGV9XCI+JHt0aGlzLmlubmVyfTwvdGg+YCxcblx0XHRcdHBsYWNlSGVyZVBhcmVudDogXCJoZWFkZXJcIlxuXHRcdH1dKTtcblx0fVxufVxuIiwiaW1wb3J0IHsgSG90U3RhcSwgSG90LCBIb3RBUEksIEhvdENvbXBvbmVudCwgSG90Q29tcG9uZW50T3V0cHV0IH0gZnJvbSBcImhvdHN0YXFcIjtcblxuZXhwb3J0IGNsYXNzIEFkbWluVGFibGVSb3cgZXh0ZW5kcyBIb3RDb21wb25lbnRcbntcblx0LyoqXG5cdCAqIFRoZSBmaWVsZHMgYXJlIHN0b3JlZCBpbiBhIGtleS92YWx1ZSBvYmplY3QuXG5cdCAqIFxuXHQgKiBAZXhhbXBsZSB7IFwibmFtZVwiOiBcIkpvaG4gU21pdGhcIiwgXCJlbWFpbFwiOiBcImpvaG4uc21pdGhAZW1haWwuY29tXCIgfVxuXHQgKi9cblx0ZmllbGRzOiBhbnlbXTtcblxuXHRjb25zdHJ1Y3RvciAoY29weTogSG90Q29tcG9uZW50IHwgSG90U3RhcSwgYXBpOiBIb3RBUEkpXG5cdHtcblx0XHRzdXBlciAoY29weSwgYXBpKTtcblxuXHRcdHRoaXMudGFnID0gXCJhZG1pbi10YWJsZS1yb3dcIjtcblx0XHR0aGlzLmZpZWxkcyA9IFtdO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZCB0aGlzIHRhYmxlIHJvdyB0byB0aGUgdGFibGVcblx0ICovXG5cdG9uUG9zdFBsYWNlIChwYXJlbnRIdG1sRWxlbWVudDogSFRNTEVsZW1lbnQsIGh0bWxFbGVtZW50OiBIVE1MRWxlbWVudCk6IEhUTUxFbGVtZW50XG5cdHtcblx0XHQvLyBAdHMtaWdub3JlXG5cdFx0cGFyZW50SHRtbEVsZW1lbnQucGFyZW50Tm9kZS5wYXJlbnROb2RlLnBhcmVudE5vZGUuaG90Q29tcG9uZW50LnJvd0VsZW1lbnRzLnB1c2ggKHsgZmllbGRzOiB0aGlzLmZpZWxkcywgZWxlbWVudDogaHRtbEVsZW1lbnR9KTtcblxuXHRcdHJldHVybiAobnVsbCk7XG5cdH1cblxuXHRvdXRwdXQgKCk6IHN0cmluZyB8IEhvdENvbXBvbmVudE91dHB1dFtdXG5cdHtcblx0XHRsZXQgcm93SHRtbCA9IFwiXCI7XG5cblx0XHRpZiAodGhpcy5maWVsZHMubGVuZ3RoID4gMClcblx0XHRcdHJvd0h0bWwgKz0gYDx0ZD48aW5wdXQgdHlwZSA9IFwiY2hlY2tib3hcIiAvPjwvdGQ+YDtcblxuXHRcdGZvciAobGV0IGlJZHggPSAwOyBpSWR4IDwgdGhpcy5maWVsZHMubGVuZ3RoOyBpSWR4KyspXG5cdFx0e1xuXHRcdFx0bGV0IGZpZWxkT2JqID0gdGhpcy5maWVsZHNbaUlkeF07XG5cblx0XHRcdGZvciAobGV0IGtleSBpbiBmaWVsZE9iailcblx0XHRcdHtcblx0XHRcdFx0bGV0IHZhbHVlID0gZmllbGRPYmpba2V5XTtcblxuXHRcdFx0XHRyb3dIdG1sICs9IGA8dGQ+JHt2YWx1ZX08L3RkPmA7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIChbe1xuXHRcdFx0aHRtbDogYDx0cj4ke3Jvd0h0bWx9PC90cj5gLFxuXHRcdFx0cGxhY2VIZXJlUGFyZW50OiBcInJlc3VsdHNcIlxuXHRcdH1dKTtcblx0fVxufVxuIiwiaW1wb3J0IHsgSG90U3RhcSwgSG90LCBIb3RBUEksIEhvdENvbXBvbmVudCB9IGZyb20gXCJob3RzdGFxXCI7XG5cbmV4cG9ydCBjbGFzcyBBZG1pbkRhc2hib2FyZCBleHRlbmRzIEhvdENvbXBvbmVudFxue1xuXHQvKipcblx0ICogVGhlIHRpdGxlIG9mIHRoaXMgZGFzaGJvYXJkLlxuXHQgKi9cblx0dGl0bGU6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBiYXNlIHVybCB0byB1c2UgZm9yIHRoaXMgZGFzaGJvYXJkLlxuXHQgKi9cblx0YmFzZTogc3RyaW5nO1xuXG5cdGNvbnN0cnVjdG9yIChjb3B5OiBIb3RDb21wb25lbnQgfCBIb3RTdGFxLCBhcGk6IEhvdEFQSSlcblx0e1xuXHRcdHN1cGVyIChjb3B5LCBhcGkpO1xuXG5cdFx0dGhpcy50YWcgPSBcImFkbWluLWRhc2hib2FyZFwiO1xuXHRcdHRoaXMudGl0bGUgPSBcIlwiO1xuXHRcdHRoaXMuYmFzZSA9IFwiXCI7XG5cdH1cblxuXHQvKipcblx0ICogQWRkIHRoaXMgdGFibGUgZmllbGQgdG8gdGhlIHRhYmxlXG5cdCAqL1xuXHRvblBvc3RQbGFjZSAocGFyZW50SHRtbEVsZW1lbnQ6IEhUTUxFbGVtZW50LCBodG1sRWxlbWVudDogSFRNTEVsZW1lbnQpOiBIVE1MRWxlbWVudFxuXHR7XG5cdFx0aWYgKEhvdC5EYXRhLkFkbWluUGFuZWwgPT0gbnVsbClcblx0XHRcdEhvdC5EYXRhLkFkbWluUGFuZWwgPSB7fTtcblxuXHRcdGlmIChIb3QuRGF0YS5BZG1pblBhbmVsLmJhc2VVcmwgPT0gbnVsbClcblx0XHRcdEhvdC5EYXRhLkFkbWluUGFuZWwuYmFzZVVybCA9IHRoaXMuYmFzZTtcblxuXHRcdGlmIChIb3QuRGF0YS5BZG1pblBhbmVsLmFkZFVybCA9PSBudWxsKVxuXHRcdFx0SG90LkRhdGEuQWRtaW5QYW5lbC5hZGRVcmwgPSBgJHtIb3QuRGF0YS5BZG1pblBhbmVsLmJhc2VVcmx9L3YxL2RhdGEvYWRkYDtcblxuXHRcdGlmIChIb3QuRGF0YS5BZG1pblBhbmVsLmVkaXRVcmwgPT0gbnVsbClcblx0XHRcdEhvdC5EYXRhLkFkbWluUGFuZWwuZWRpdFVybCA9IGAke0hvdC5EYXRhLkFkbWluUGFuZWwuYmFzZVVybH0vdjEvZGF0YS9lZGl0YDtcblxuXHRcdGlmIChIb3QuRGF0YS5BZG1pblBhbmVsLnJlbW92ZVVybCA9PSBudWxsKVxuXHRcdFx0SG90LkRhdGEuQWRtaW5QYW5lbC5yZW1vdmVVcmwgPSBgJHtIb3QuRGF0YS5BZG1pblBhbmVsLmJhc2VVcmx9L3YxL2RhdGEvcmVtb3ZlYDtcblxuXHRcdGlmIChIb3QuRGF0YS5BZG1pblBhbmVsLmxpc3RVcmwgPT0gbnVsbClcblx0XHRcdEhvdC5EYXRhLkFkbWluUGFuZWwubGlzdFVybCA9IGAke0hvdC5EYXRhLkFkbWluUGFuZWwuYmFzZVVybH0vdjEvZGF0YS9saXN0YDtcblxuXHRcdHJldHVybiAobnVsbCk7XG5cdH1cblxuXHRvdXRwdXQgKCk6IHN0cmluZ1xuXHR7XG5cdFx0cmV0dXJuIChgXG5cdFx0PG1haW4gY2xhc3M9XCJjb2wtbWQtOSBtcy1zbS1hdXRvIGNvbC1sZy0xMCBweC1tZC00XCI+XG5cdFx0XHQ8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGZsZXgtd3JhcCBmbGV4LW1kLW5vd3JhcCBhbGlnbi1pdGVtcy1jZW50ZXIgcHQtMyBwYi0yIG1iLTMgYm9yZGVyLWJvdHRvbVwiPlxuXHRcdFx0XHQ8aDEgY2xhc3M9XCJoMlwiPiR7dGhpcy50aXRsZX08L2gxPlxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwiYnRuLXRvb2xiYXIgbWItMiBtYi1tZC0wXCI+XG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cImJ0bi1ncm91cCBtZS0yXCI+XG5cdFx0XHRcdFx0XHQ8aG90LXBsYWNlLWhlcmUgbmFtZSA9IFwiZGFzaGJvYXJkSGVhZGVyXCI+PC9ob3QtcGxhY2UtaGVyZT5cblx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0PC9kaXY+XG5cdFx0XHQ8L2Rpdj5cblx0XHRcdDxob3QtcGxhY2UtaGVyZSBuYW1lID0gXCJib2R5XCI+PC9ob3QtcGxhY2UtaGVyZT5cblx0XHQ8L21haW4+YCk7XG5cdH1cbn1cbiIsImltcG9ydCB7IEhvdFN0YXEsIEhvdCwgSG90QVBJLCBIb3RDb21wb25lbnQsIEhvdENvbXBvbmVudE91dHB1dCB9IGZyb20gXCJob3RzdGFxXCI7XG5cbi8qKlxuICogQSBsYWJlbGVkIGZvcm0gZmllbGQuIFdyYXBzIGEgc2luZ2xlIDxpbnB1dD4sIDxzZWxlY3Q+LCBvciA8dGV4dGFyZWE+XG4gKiB3aXRoIGEgcHJvcGVyIDxsYWJlbD4sIGFuIG9wdGlvbmFsIHJlcXVpcmVkLW1hcmtlciwgYW5kIGhlbHBlciB0ZXh0LlxuICpcbiAqIFJlcGxhY2VzIHRoZSBib2lsZXJwbGF0ZSBvZiBoYW5kLXJvbGxpbmcgbGFiZWwgKyBpbnB1dCArIHNtYWxsIGhlbHBcbiAqIGRpdiBhY3Jvc3MgZXZlcnkgQWRkL0VkaXQgZm9ybS4gSW5zcGlyZWQgYnkgdGhlIEZyZWVsaWdodCBwYWdlc1xuICogKHZvbHVudGVlcnMuaG90dCwgeWFyZC1zaWducy5ob3R0LCBtZW1iZXJzLmhvdHQpIHdoZXJlIGV2ZXJ5IGZpZWxkXG4gKiBhbHJlYWR5IGZvbGxvd3MgdGhpcyBwYXR0ZXJuLlxuICpcbiAqIFVzYWdlOlxuICogICA8YWRtaW4tZm9ybS1maWVsZCBob3QtZmllbGQ9XCJuYW1lXCIgaG90LWxhYmVsPVwiRmlyc3QgbmFtZVwiIGhvdC1yZXF1aXJlZD1cIjFcIlxuICogICAgICAgICAgICAgICAgICAgICBob3QtcGxhY2Vob2xkZXI9XCJlLmcuIEphbmVcIiBob3QtYXV0b2NvbXBsZXRlPVwiZ2l2ZW4tbmFtZVwiPlxuICogICA8L2FkbWluLWZvcm0tZmllbGQ+XG4gKlxuICogICA8YWRtaW4tZm9ybS1maWVsZCBob3QtZmllbGQ9XCJzdGF0dXNcIiBob3QtbGFiZWw9XCJTdGF0dXNcIiBob3QtY29udHJvbD1cInNlbGVjdFwiXG4gKiAgICAgICAgICAgICAgICAgICAgIGhvdC1vcHRpb25zPVwiYWN0aXZlLHN1c3BlbmRlZCxpbnZpdGVkXCI+PC9hZG1pbi1mb3JtLWZpZWxkPlxuICpcbiAqICAgPGFkbWluLWZvcm0tZmllbGQgaG90LWZpZWxkPVwiZGVzY3JpcHRpb25cIiBob3QtbGFiZWw9XCJEZXNjcmlwdGlvblwiXG4gKiAgICAgICAgICAgICAgICAgICAgIGhvdC1jb250cm9sPVwidGV4dGFyZWFcIiBob3Qtcm93cz1cIjNcIlxuICogICAgICAgICAgICAgICAgICAgICBob3QtaGVscD1cIlNob3duIG9uIHRoZSBwdWJsaWMgcGFnZS5cIj48L2FkbWluLWZvcm0tZmllbGQ+XG4gKi9cbmV4cG9ydCBjbGFzcyBBZG1pbkZvcm1GaWVsZCBleHRlbmRzIEhvdENvbXBvbmVudFxue1xuXHQvKiogVGhlIGZpZWxkIG5hbWUgKHVzZWQgZm9yIGhvdC1maWVsZCBhbmQgdGhlIGxhYmVsJ3MgYGZvcmAgYXR0cmlidXRlKS4gKi9cblx0ZmllbGQ6IHN0cmluZztcblx0LyoqIFRoZSB2aXNpYmxlIGxhYmVsIHRleHQuICovXG5cdGxhYmVsOiBzdHJpbmc7XG5cdC8qKiBcIjFcIiAvIFwidHJ1ZVwiIHRvIHJlbmRlciB0aGUgcmVkIHJlcXVpcmVkIG1hcmtlciBhZnRlciB0aGUgbGFiZWwuICovXG5cdHJlcXVpcmVkOiBzdHJpbmc7XG5cdC8qKiBpbnB1dCB0eXBlIHdoZW4gY29udHJvbCBpcyBcImlucHV0XCIgKHRleHQsIGVtYWlsLCB0ZWwsIG51bWJlciwgZGF0ZSwgZXRjKS4gKi9cblx0dHlwZTogc3RyaW5nO1xuXHQvKiogQ29udHJvbCBraW5kOiBcImlucHV0XCIgKGRlZmF1bHQpIHwgXCJzZWxlY3RcIiB8IFwidGV4dGFyZWFcIiB8IFwiY2hlY2tib3hcIi4gKi9cblx0Y29udHJvbDogc3RyaW5nO1xuXHQvKiogUGxhY2Vob2xkZXIgdGV4dCAoaWdub3JlZCBmb3IgdHlwZT1kYXRlIC8gY29udHJvbD1zZWxlY3QgLyBjaGVja2JveCkuICovXG5cdHBsYWNlaG9sZGVyOiBzdHJpbmc7XG5cdC8qKiBBdXRvY29tcGxldGUgYXR0cmlidXRlIHZhbHVlIChnaXZlbi1uYW1lLCBlbWFpbCwgdGVsLCBzdHJlZXQtYWRkcmVzcywgZXRjKS4gKi9cblx0YXV0b2NvbXBsZXRlOiBzdHJpbmc7XG5cdC8qKiBTbWFsbCBoZWxwZXIgdGV4dCBzaG93biBiZWxvdyB0aGUgaW5wdXQuICovXG5cdGhlbHA6IHN0cmluZztcblx0LyoqIENvbW1hLXNlcGFyYXRlZCBvcHRpb25zIHdoZW4gY29udHJvbD1cInNlbGVjdFwiLiBFYWNoIGl0ZW0gY2FuIGJlIFwidmFsdWU6bGFiZWxcIiBvciBqdXN0IFwidmFsdWVcIi4gKi9cblx0b3B0aW9uczogc3RyaW5nO1xuXHQvKiogUm93cyBmb3IgY29udHJvbD1cInRleHRhcmVhXCIuICovXG5cdHJvd3M6IHN0cmluZztcblx0LyoqIE1pbmltdW0gdmFsdWUgZm9yIHR5cGU9bnVtYmVyLiAqL1xuXHRtaW46IHN0cmluZztcblx0LyoqIFN0ZXAgZm9yIHR5cGU9bnVtYmVyLiAqL1xuXHRzdGVwOiBzdHJpbmc7XG5cdC8qKiBNYXggbGVuZ3RoIGZvciBpbnB1dC90ZXh0YXJlYS4gKi9cblx0bWF4bGVuZ3RoOiBzdHJpbmc7XG5cdC8qKiBCb290c3RyYXAgY29sdW1uIGNsYXNzIGZvciBncmlkIHVzZSwgZS5nLiBcImNvbC1tZC02XCIuIEVtcHR5ID0+IG5vIHdyYXBwZXIgY29sLiAqL1xuXHRjb2w6IHN0cmluZztcblx0LyoqIFNpemU6IFwic21cIiAoZGVmYXVsdCBpbiB0aGUgbmV3IHRoZW1lKSB8IFwibWRcIi4gKi9cblx0c2l6ZTogc3RyaW5nO1xuXHQvKiogRXh0cmEgQ1NTIGNsYXNzZXMgZm9yIHRoZSBpbnB1dCBlbGVtZW50IGl0c2VsZi4gKi9cblx0Y3NzX2NsYXNzOiBzdHJpbmc7XG5cblx0Y29uc3RydWN0b3IgKGNvcHk6IEhvdENvbXBvbmVudCB8IEhvdFN0YXEsIGFwaTogSG90QVBJKVxuXHR7XG5cdFx0c3VwZXIgKGNvcHksIGFwaSk7XG5cblx0XHR0aGlzLnRhZyAgICAgICAgICAgPSBcImFkbWluLWZvcm0tZmllbGRcIjtcblx0XHR0aGlzLmZpZWxkICAgICAgICAgPSBcIlwiO1xuXHRcdHRoaXMubGFiZWwgICAgICAgICA9IFwiXCI7XG5cdFx0dGhpcy5yZXF1aXJlZCAgICAgID0gXCIwXCI7XG5cdFx0dGhpcy50eXBlICAgICAgICAgID0gXCJ0ZXh0XCI7XG5cdFx0dGhpcy5jb250cm9sICAgICAgID0gXCJpbnB1dFwiO1xuXHRcdHRoaXMucGxhY2Vob2xkZXIgICA9IFwiXCI7XG5cdFx0dGhpcy5hdXRvY29tcGxldGUgID0gXCJcIjtcblx0XHR0aGlzLmhlbHAgICAgICAgICAgPSBcIlwiO1xuXHRcdHRoaXMub3B0aW9ucyAgICAgICA9IFwiXCI7XG5cdFx0dGhpcy5yb3dzICAgICAgICAgID0gXCIzXCI7XG5cdFx0dGhpcy5taW4gICAgICAgICAgID0gXCJcIjtcblx0XHR0aGlzLnN0ZXAgICAgICAgICAgPSBcIlwiO1xuXHRcdHRoaXMubWF4bGVuZ3RoICAgICA9IFwiXCI7XG5cdFx0dGhpcy5jb2wgICAgICAgICAgID0gXCJcIjtcblx0XHR0aGlzLnNpemUgICAgICAgICAgPSBcInNtXCI7XG5cdFx0dGhpcy5jc3NfY2xhc3MgICAgID0gXCJcIjtcblx0fVxuXG5cdC8qKlxuXHQgKiBGaWVsZCByZW5kZXJzIGluc2lkZSB0aGUgc3Vycm91bmRpbmcgZmxvdyDigJQgbm8gbW9kYWwtYm9keS1yZWxvY2F0aW9uXG5cdCAqIHRyaWNrIGxpa2UgYWRtaW4tdGV4dCBkb2VzLiBUaGUgbmV3IGNvbXBvbmVudHMgYXJlIGRlc2lnbmVkIGZvclxuXHQgKiBkZXRhaWwgcGFnZXMgYW5kIGlubGluZSBhZGQgcGFuZWxzLCBub3QgbW9kYWxzLlxuXHQgKi9cblx0b25Qb3N0UGxhY2UgKHBhcmVudEh0bWxFbGVtZW50OiBIVE1MRWxlbWVudCwgaHRtbEVsZW1lbnQ6IEhUTUxFbGVtZW50KTogSFRNTEVsZW1lbnRcblx0e1xuXHRcdHJldHVybiAobnVsbCk7XG5cdH1cblxuXHRwcml2YXRlIHJlbmRlcklucHV0IChpZDogc3RyaW5nLCBzaXplQ2xhc3M6IHN0cmluZywgY2xhc3Nlczogc3RyaW5nKTogc3RyaW5nXG5cdHtcblx0XHRjb25zdCBtaW5BdHRyICA9IHRoaXMubWluICA/IGAgbWluPVwiJHt0aGlzLm1pbn1cImAgIDogXCJcIjtcblx0XHRjb25zdCBzdGVwQXR0ciA9IHRoaXMuc3RlcCA/IGAgc3RlcD1cIiR7dGhpcy5zdGVwfVwiYCA6IFwiXCI7XG5cdFx0Y29uc3QgbWF4QXR0ciAgPSB0aGlzLm1heGxlbmd0aCA/IGAgbWF4bGVuZ3RoPVwiJHt0aGlzLm1heGxlbmd0aH1cImAgOiBcIlwiO1xuXHRcdGNvbnN0IGFjQXR0ciAgID0gdGhpcy5hdXRvY29tcGxldGUgPyBgIGF1dG9jb21wbGV0ZT1cIiR7dGhpcy5hdXRvY29tcGxldGV9XCJgIDogXCJcIjtcblx0XHRjb25zdCBwaEF0dHIgICA9ICh0aGlzLnR5cGUgPT09IFwiZGF0ZVwiIHx8IHRoaXMucGxhY2Vob2xkZXIgPT09IFwiXCIpXG5cdFx0XHQ/IFwiXCIgOiBgIHBsYWNlaG9sZGVyPVwiJHt0aGlzLnBsYWNlaG9sZGVyLnJlcGxhY2UgKC9cIi9nLCBcIiZxdW90O1wiKX1cImA7XG5cdFx0cmV0dXJuIGA8aW5wdXQgaWQ9XCIke2lkfVwiIGhvdC1maWVsZD1cIiR7dGhpcy5maWVsZH1cIiB0eXBlPVwiJHt0aGlzLnR5cGV9XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wke3NpemVDbGFzc30ke2NsYXNzZXN9XCIke21pbkF0dHJ9JHtzdGVwQXR0cn0ke21heEF0dHJ9JHthY0F0dHJ9JHtwaEF0dHJ9IC8+YDtcblx0fVxuXG5cdHByaXZhdGUgcmVuZGVyU2VsZWN0IChpZDogc3RyaW5nLCBzaXplQ2xhc3M6IHN0cmluZywgY2xhc3Nlczogc3RyaW5nKTogc3RyaW5nXG5cdHtcblx0XHRjb25zdCBvcHRzID0gKHRoaXMub3B0aW9ucyB8fCBcIlwiKS5zcGxpdCAoXCIsXCIpLm1hcCAoKHJhdykgPT5cblx0XHRcdHtcblx0XHRcdFx0Y29uc3QgcGFydCA9IHJhdy50cmltICgpO1xuXHRcdFx0XHRpZiAocGFydCA9PT0gXCJcIikgcmV0dXJuIFwiXCI7XG5cdFx0XHRcdGNvbnN0IGNvbG9uID0gcGFydC5pbmRleE9mIChcIjpcIik7XG5cdFx0XHRcdGNvbnN0IHZhbCAgID0gY29sb24gPj0gMCA/IHBhcnQuc2xpY2UgKDAsIGNvbG9uKSA6IHBhcnQ7XG5cdFx0XHRcdGNvbnN0IGxibCAgID0gY29sb24gPj0gMCA/IHBhcnQuc2xpY2UgKGNvbG9uICsgMSkgOiBwYXJ0O1xuXHRcdFx0XHRyZXR1cm4gYDxvcHRpb24gdmFsdWU9XCIke3ZhbC5yZXBsYWNlICgvXCIvZywgXCImcXVvdDtcIil9XCI+JHtsYmx9PC9vcHRpb24+YDtcblx0XHRcdH0pLmpvaW4gKFwiXCIpO1xuXHRcdHJldHVybiBgPHNlbGVjdCBpZD1cIiR7aWR9XCIgaG90LWZpZWxkPVwiJHt0aGlzLmZpZWxkfVwiIGNsYXNzPVwiZm9ybS1zZWxlY3Qke3NpemVDbGFzc30ke2NsYXNzZXN9XCI+JHtvcHRzfTwvc2VsZWN0PmA7XG5cdH1cblxuXHRwcml2YXRlIHJlbmRlclRleHRhcmVhIChpZDogc3RyaW5nLCBzaXplQ2xhc3M6IHN0cmluZywgY2xhc3Nlczogc3RyaW5nKTogc3RyaW5nXG5cdHtcblx0XHRjb25zdCBwaEF0dHIgPSB0aGlzLnBsYWNlaG9sZGVyID8gYCBwbGFjZWhvbGRlcj1cIiR7dGhpcy5wbGFjZWhvbGRlci5yZXBsYWNlICgvXCIvZywgXCImcXVvdDtcIil9XCJgIDogXCJcIjtcblx0XHRjb25zdCBtYXhBdHRyID0gdGhpcy5tYXhsZW5ndGggPyBgIG1heGxlbmd0aD1cIiR7dGhpcy5tYXhsZW5ndGh9XCJgIDogXCJcIjtcblx0XHRyZXR1cm4gYDx0ZXh0YXJlYSBpZD1cIiR7aWR9XCIgaG90LWZpZWxkPVwiJHt0aGlzLmZpZWxkfVwiIHJvd3M9XCIke3RoaXMucm93c31cIiBjbGFzcz1cImZvcm0tY29udHJvbCR7c2l6ZUNsYXNzfSR7Y2xhc3Nlc31cIiR7bWF4QXR0cn0ke3BoQXR0cn0+PC90ZXh0YXJlYT5gO1xuXHR9XG5cblx0cHJpdmF0ZSByZW5kZXJDaGVja2JveCAoaWQ6IHN0cmluZyk6IHN0cmluZ1xuXHR7XG5cdFx0cmV0dXJuIGA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVja1wiPjxpbnB1dCBpZD1cIiR7aWR9XCIgaG90LWZpZWxkPVwiJHt0aGlzLmZpZWxkfVwiIHR5cGU9XCJjaGVja2JveFwiIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dFwiIC8+PGxhYmVsIGZvcj1cIiR7aWR9XCIgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsXCI+JHt0aGlzLmxhYmVsfTwvbGFiZWw+PC9kaXY+YDtcblx0fVxuXG5cdG91dHB1dCAoKTogc3RyaW5nIHwgSG90Q29tcG9uZW50T3V0cHV0W11cblx0e1xuXHRcdGlmICh0aGlzLmZpZWxkID09PSBcIlwiKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChcImFkbWluLWZvcm0tZmllbGQ6IGhvdC1maWVsZCBpcyByZXF1aXJlZFwiKTtcblxuXHRcdGNvbnN0IGlkICAgICAgICA9IGBmZi0ke3RoaXMuZmllbGR9LSR7TWF0aC5yYW5kb20gKCkudG9TdHJpbmcgKDM2KS5zbGljZSAoMiwgNyl9YDtcblx0XHRjb25zdCBzaXplQ2xhc3MgPSB0aGlzLnNpemUgPT09IFwic21cIiA/IFwiIGZvcm0tY29udHJvbC1zbVwiIDogXCJcIjtcblx0XHRjb25zdCBjbGFzc2VzICAgPSB0aGlzLmNzc19jbGFzcyA/IFwiIFwiICsgdGhpcy5jc3NfY2xhc3MgOiBcIlwiO1xuXG5cdFx0Ly8gQ2hlY2tib3ggaXMgYSBzcGVjaWFsIGNhc2Ug4oCUIHRoZSBsYWJlbCBzaXRzIG5leHQgdG8gdGhlIGJveCxcblx0XHQvLyBub3QgYWJvdmUuIFNraXAgdGhlIHJlc3Qgb2YgdGhlIHdyYXBwaW5nLlxuXHRcdGlmICh0aGlzLmNvbnRyb2wgPT09IFwiY2hlY2tib3hcIilcblx0XHR7XG5cdFx0XHRjb25zdCBpbm5lciA9IHRoaXMucmVuZGVyQ2hlY2tib3ggKGlkKTtcblx0XHRcdHJldHVybiAodGhpcy5jb2wgPyBgPGRpdiBjbGFzcz1cIiR7dGhpcy5jb2x9XCI+JHtpbm5lcn08L2Rpdj5gIDogaW5uZXIpO1xuXHRcdH1cblxuXHRcdGxldCBjb250cm9sID0gXCJcIjtcblx0XHRpZiAodGhpcy5jb250cm9sID09PSBcInNlbGVjdFwiKSAgICAgICAgY29udHJvbCA9IHRoaXMucmVuZGVyU2VsZWN0ICAgKGlkLCBzaXplQ2xhc3MsIGNsYXNzZXMpO1xuXHRcdGVsc2UgaWYgKHRoaXMuY29udHJvbCA9PT0gXCJ0ZXh0YXJlYVwiKSBjb250cm9sID0gdGhpcy5yZW5kZXJUZXh0YXJlYSAoaWQsIHNpemVDbGFzcywgY2xhc3Nlcyk7XG5cdFx0ZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sID0gdGhpcy5yZW5kZXJJbnB1dCAgICAoaWQsIHNpemVDbGFzcywgY2xhc3Nlcyk7XG5cblx0XHRjb25zdCByZXF1aXJlZE1hcmtlciA9ICh0aGlzLnJlcXVpcmVkID09PSBcIjFcIiB8fCB0aGlzLnJlcXVpcmVkID09PSBcInRydWVcIilcblx0XHRcdD8gYCA8c3BhbiBjbGFzcz1cInRleHQtZGFuZ2VyXCIgYXJpYS1sYWJlbD1cInJlcXVpcmVkXCI+Kjwvc3Bhbj5gXG5cdFx0XHQ6IFwiXCI7XG5cblx0XHRjb25zdCBoZWxwSHRtbCA9IHRoaXMuaGVscFxuXHRcdFx0PyBgPGRpdiBjbGFzcz1cImZvcm0tdGV4dCBzbWFsbFwiPiR7dGhpcy5oZWxwfTwvZGl2PmBcblx0XHRcdDogXCJcIjtcblxuXHRcdGNvbnN0IGZpZWxkSHRtbCA9IGBcblx0XHRcdDxsYWJlbCBmb3I9XCIke2lkfVwiIGNsYXNzPVwiZm9ybS1sYWJlbCBzbWFsbCBtYi0xXCI+JHt0aGlzLmxhYmVsfSR7cmVxdWlyZWRNYXJrZXJ9PC9sYWJlbD5cblx0XHRcdCR7Y29udHJvbH1cblx0XHRcdCR7aGVscEh0bWx9YDtcblxuXHRcdHJldHVybiAodGhpcy5jb2wgPyBgPGRpdiBjbGFzcz1cIiR7dGhpcy5jb2x9XCI+JHtmaWVsZEh0bWx9PC9kaXY+YCA6IGA8ZGl2PiR7ZmllbGRIdG1sfTwvZGl2PmApO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBIb3RTdGFxLCBIb3QsIEhvdEFQSSwgSG90Q29tcG9uZW50LCBIb3RDb21wb25lbnRPdXRwdXQgfSBmcm9tIFwiaG90c3RhcVwiO1xuXG4vKipcbiAqIElubGluZSBjb2xsYXBzaWJsZSBcIkFkZFwiIHBhbmVsLiBSZXBsYWNlcyB0aGUgbW9kYWwgb3BlbmVkIGJ5XG4gKiA8YWRtaW4tZWRpdCBob3QtdHlwZT1cImFkZFwiPi4gQnVpbHQgb24gQm9vdHN0cmFwJ3MgY29sbGFwc2Ugc28gaXRcbiAqIHNsaWRlcyBkb3duIGJlbG93IGEgdHJpZ2dlciBidXR0b24gd2l0aG91dCBvdmVybGF5aW5nIHRoZSBwYWdlLlxuICpcbiAqIFBhaXJzIHdpdGggPGFkbWluLWNhcmQtdGFibGU+OiB0aGUgdGFibGUncyBcIisgQWRkXCIgYnV0dG9uIHRvZ2dsZXNcbiAqIHRoaXMgcGFuZWwgdmlhIEJvb3RzdHJhcCdzIGRhdGEtYnMtdG9nZ2xlPVwiY29sbGFwc2VcIiBkYXRhLWJzLXRhcmdldC5cbiAqIFNsb3QgZm9yIGZvcm0gZmllbGRzIGxpdmVzIGF0IGBob3QtcGxhY2UtaGVyZSBuYW1lPVwicGFuZWxCb2R5XCJgLlxuICpcbiAqIFVzYWdlOlxuICogICA8YWRtaW4tYWRkLXBhbmVsIG5hbWU9XCJiYW5rQWNjb3VudHNBZGRcIiBob3QtdGl0bGU9XCJBZGQgYmFuayBhY2NvdW50XCJcbiAqICAgICAgICAgICAgICAgICAgICBob3Qtb25zYXZlPVwiPCh2YWx1ZXMpID0+IHtcbiAqICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByID0gYXdhaXQgSG90Lmpzb25SZXF1ZXN0KGAke2NvbmZpZy5iYXNlVXJsfS92MS9iYW5rX2FjY291bnRzL2NyZWF0ZWAsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGJhbmtBY2NvdW50OiB2YWx1ZXMgfSwgJyR7and0VG9rZW59Jyk7XG4gKiAgICAgICAgICAgICAgICAgICAgICAgaWYgKHIgJiYgci5lcnJvcikgeyBhbGVydEVycm9yKHIuZXJyb3IpOyByZXR1cm4gZmFsc2U7IH1cbiAqICAgICAgICAgICAgICAgICAgICB9UmE+XCJcbiAqICAgICAgICAgICAgICAgICAgICBob3QtYXR0YWNoZWRfbGlzdD1cImJhbmtBY2NvdW50c0xpc3RcIj5cbiAqICAgICA8YWRtaW4tZm9ybS1maWVsZCBob3QtZmllbGQ9XCJuYW1lXCIgaG90LWxhYmVsPVwiTmFtZVwiIGhvdC1yZXF1aXJlZD1cIjFcIlxuICogICAgICAgICAgICAgICAgICAgICAgIGhvdC1jb2w9XCJjb2wtbWQtNlwiPjwvYWRtaW4tZm9ybS1maWVsZD5cbiAqICAgICAuLi5cbiAqICAgPC9hZG1pbi1hZGQtcGFuZWw+XG4gKi9cbmV4cG9ydCBjbGFzcyBBZG1pbkFkZFBhbmVsIGV4dGVuZHMgSG90Q29tcG9uZW50XG57XG5cdC8qKiBUaXRsZSBzaG93biBhdCB0aGUgdG9wIG9mIHRoZSBwYW5lbC4gKi9cblx0dGl0bGU6IHN0cmluZztcblx0LyoqIFN1Ym1pdCBidXR0b24gbGFiZWwuICovXG5cdGJ1dHRvbl90aXRsZTogc3RyaW5nO1xuXHQvKiogQ2FuY2VsIGJ1dHRvbiBsYWJlbC4gRW1wdHkgZGlzYWJsZXMgdGhlIGNhbmNlbCBidXR0b24uICovXG5cdGNhbmNlbF90ZXh0OiBzdHJpbmc7XG5cdC8qKiBPcHRpb25hbCBpZCBvZiB0aGUgcmVsYXRlZCA8YWRtaW4tY2FyZC10YWJsZT47IHRoZSB0b2dnbGUgYnV0dG9uIGdldHMgaW5qZWN0ZWQgaW50byBpdHMgaGVhZGVyLiAqL1xuXHRhdHRhY2hlZF9saXN0OiBzdHJpbmc7XG5cdC8qKiBXaGVyZSB0byByZW5kZXIgdGhlIHRvZ2dsZSBidXR0b24gKGEgaG90LXBsYWNlLWhlcmUgbmFtZSBvbiB0aGUgcGFnZSkuIExlYXZlIGJsYW5rIHdoZW4gYXR0YWNoZWRfbGlzdCBpcyBzZXQuICovXG5cdGFkZF9wbGFjZV9oZXJlOiBzdHJpbmc7XG5cdC8qKiBUZXh0IHNob3duIG9uIHRoZSB0b2dnbGUgYnV0dG9uLiAqL1xuXHRhZGRfdGV4dDogc3RyaW5nO1xuXHQvKiogV2hlbiBzZXQgdG8gXCIxXCIgLyBcInRydWVcIiwgcGFuZWwgc3RhcnRzIGV4cGFuZGVkLiAqL1xuXHRzdGFydF9vcGVuOiBzdHJpbmc7XG5cdC8qKiBXaGF0IHRvIHJ1biB3aGVuIHRoZSB1c2VyIGNsaWNrcyBTYXZlLiBSZWNlaXZlcyBhIHZhbHVlcyBvYmplY3QgYnVpbHQgZnJvbSBob3QtZmllbGQgaW5wdXRzLiBSZXR1cm4gZmFsc2UgdG8ga2VlcCB0aGUgcGFuZWwgb3Blbi4gKi9cblx0b25zYXZlOiAodmFsdWVzOiBhbnkpID0+IFByb21pc2U8Ym9vbGVhbiB8IHZvaWQ+O1xuXG5cdHByb3RlY3RlZCBwYW5lbElkOiBzdHJpbmc7XG5cdHByb3RlY3RlZCBmb3JtSWQ6IHN0cmluZztcblxuXHRjb25zdHJ1Y3RvciAoY29weTogSG90Q29tcG9uZW50IHwgSG90U3RhcSwgYXBpOiBIb3RBUEkpXG5cdHtcblx0XHRzdXBlciAoY29weSwgYXBpKTtcblxuXHRcdHRoaXMudGFnICAgICAgICAgICAgID0gXCJhZG1pbi1hZGQtcGFuZWxcIjtcblx0XHR0aGlzLnRpdGxlICAgICAgICAgICA9IFwiXCI7XG5cdFx0dGhpcy5idXR0b25fdGl0bGUgICAgPSBcIlNhdmVcIjtcblx0XHR0aGlzLmNhbmNlbF90ZXh0ICAgICA9IFwiQ2FuY2VsXCI7XG5cdFx0dGhpcy5hdHRhY2hlZF9saXN0ICAgPSBcIlwiO1xuXHRcdHRoaXMuYWRkX3BsYWNlX2hlcmUgID0gXCJcIjtcblx0XHR0aGlzLmFkZF90ZXh0ICAgICAgICA9IFwiKyBBZGRcIjtcblx0XHR0aGlzLnN0YXJ0X29wZW4gICAgICA9IFwiMFwiO1xuXHRcdHRoaXMub25zYXZlICAgICAgICAgID0gbnVsbDtcblx0fVxuXG5cdC8qKlxuXHQgKiBXaXJlcyB0aGUgc3VibWl0ICsgY2FuY2VsIGhhbmRsZXJzIGFmdGVyIHRoZSBET00gaXMgaW4gcGxhY2UuXG5cdCAqIEJyb3dzZXJzIGhhbmRsZSB0aGUgY29sbGFwc2Ugb3Blbi9jbG9zZSB2aWEgQm9vdHN0cmFwIGRhdGEtYXR0cnNcblx0ICogb24gdGhlIHRvZ2dsZSBidXR0b24g4oCUIHdlIGRvbid0IG5lZWQgdG8gbWFuYWdlIHRoYXQgb3Vyc2VsdmVzLlxuXHQgKi9cblx0b25Qb3N0UGxhY2UgKHBhcmVudEh0bWxFbGVtZW50OiBIVE1MRWxlbWVudCwgaHRtbEVsZW1lbnQ6IEhUTUxFbGVtZW50KTogSFRNTEVsZW1lbnRcblx0e1xuXHRcdGNvbnN0IHNlbGYgPSB0aGlzO1xuXHRcdGNvbnN0IHBhbmVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQgKHRoaXMucGFuZWxJZCk7XG5cdFx0aWYgKHBhbmVsID09IG51bGwpXG5cdFx0XHRyZXR1cm4gKG51bGwpO1xuXG5cdFx0Y29uc3Qgc3VibWl0QnRuID0gcGFuZWwucXVlcnlTZWxlY3RvciAoYC5mbC1hZGQtcGFuZWwtc3VibWl0YCkgYXMgSFRNTEJ1dHRvbkVsZW1lbnQgfCBudWxsO1xuXHRcdGNvbnN0IGNhbmNlbEJ0biA9IHBhbmVsLnF1ZXJ5U2VsZWN0b3IgKGAuZmwtYWRkLXBhbmVsLWNhbmNlbGApIGFzIEhUTUxCdXR0b25FbGVtZW50IHwgbnVsbDtcblxuXHRcdGlmIChzdWJtaXRCdG4gIT0gbnVsbClcblx0XHR7XG5cdFx0XHRzdWJtaXRCdG4uYWRkRXZlbnRMaXN0ZW5lciAoXCJjbGlja1wiLCBhc3luYyAoZSkgPT5cblx0XHRcdFx0e1xuXHRcdFx0XHRcdGUucHJldmVudERlZmF1bHQgKCk7XG5cdFx0XHRcdFx0Y29uc3QgdmFsdWVzID0gc2VsZi5jb2xsZWN0RmllbGRWYWx1ZXMgKHBhbmVsKTtcblx0XHRcdFx0XHRzdWJtaXRCdG4uZGlzYWJsZWQgPSB0cnVlO1xuXHRcdFx0XHRcdHRyeVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGxldCBrZWVwT3BlbjogYW55ID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRpZiAodHlwZW9mIHNlbGYub25zYXZlID09PSBcImZ1bmN0aW9uXCIpXG5cdFx0XHRcdFx0XHRcdGtlZXBPcGVuID0gYXdhaXQgc2VsZi5vbnNhdmUgKHZhbHVlcyk7XG5cblx0XHRcdFx0XHRcdGlmIChrZWVwT3BlbiA9PT0gZmFsc2UgfHwga2VlcE9wZW4gPT0gbnVsbClcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0c2VsZi5yZXNldEZpZWxkcyAocGFuZWwpO1xuXHRcdFx0XHRcdFx0XHRzZWxmLmNvbGxhcHNlUGFuZWwgKCk7XG5cdFx0XHRcdFx0XHRcdHNlbGYucmVmcmVzaEF0dGFjaGVkTGlzdCAoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Y2F0Y2ggKGV4KVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IgKFwiYWRtaW4tYWRkLXBhbmVsIG9uc2F2ZSB0aHJldzpcIiwgZXgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRmaW5hbGx5XG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0c3VibWl0QnRuLmRpc2FibGVkID0gZmFsc2U7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHR9XG5cblx0XHRpZiAoY2FuY2VsQnRuICE9IG51bGwpXG5cdFx0e1xuXHRcdFx0Y2FuY2VsQnRuLmFkZEV2ZW50TGlzdGVuZXIgKFwiY2xpY2tcIiwgKGUpID0+XG5cdFx0XHRcdHtcblx0XHRcdFx0XHRlLnByZXZlbnREZWZhdWx0ICgpO1xuXHRcdFx0XHRcdHNlbGYucmVzZXRGaWVsZHMgKHBhbmVsKTtcblx0XHRcdFx0XHRzZWxmLmNvbGxhcHNlUGFuZWwgKCk7XG5cdFx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdHJldHVybiAobnVsbCk7XG5cdH1cblxuXHQvKiogUmVhZCBldmVyeSBob3QtZmllbGQtbWFya2VkIGlucHV0IGluc2lkZSB0aGUgcGFuZWwgaW50byBhIHBsYWluIG9iamVjdC4gKi9cblx0cHJvdGVjdGVkIGNvbGxlY3RGaWVsZFZhbHVlcyAocGFuZWw6IEhUTUxFbGVtZW50KTogYW55XG5cdHtcblx0XHRjb25zdCBvdXQ6IGFueSA9IHt9O1xuXHRcdGNvbnN0IG5vZGVzID0gcGFuZWwucXVlcnlTZWxlY3RvckFsbCAoXCJbaG90LWZpZWxkXVwiKTtcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKVxuXHRcdHtcblx0XHRcdGNvbnN0IGVsID0gbm9kZXNbaV0gYXMgSFRNTElucHV0RWxlbWVudCB8IEhUTUxTZWxlY3RFbGVtZW50IHwgSFRNTFRleHRBcmVhRWxlbWVudDtcblx0XHRcdGNvbnN0IGZpZWxkID0gZWwuZ2V0QXR0cmlidXRlIChcImhvdC1maWVsZFwiKTtcblx0XHRcdGlmIChmaWVsZCA9PSBudWxsIHx8IGZpZWxkID09PSBcIlwiKSBjb250aW51ZTtcblxuXHRcdFx0aWYgKGVsIGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCAmJiBlbC50eXBlID09PSBcImNoZWNrYm94XCIpXG5cdFx0XHRcdG91dFtmaWVsZF0gPSBlbC5jaGVja2VkO1xuXHRcdFx0ZWxzZSBpZiAoZWwgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50ICYmIGVsLnR5cGUgPT09IFwibnVtYmVyXCIpXG5cdFx0XHRcdG91dFtmaWVsZF0gPSBlbC52YWx1ZSA9PT0gXCJcIiA/IG51bGwgOiBOdW1iZXIgKGVsLnZhbHVlKTtcblx0XHRcdGVsc2Vcblx0XHRcdFx0b3V0W2ZpZWxkXSA9IGVsLnZhbHVlO1xuXHRcdH1cblx0XHRyZXR1cm4gKG91dCk7XG5cdH1cblxuXHRwcm90ZWN0ZWQgcmVzZXRGaWVsZHMgKHBhbmVsOiBIVE1MRWxlbWVudCk6IHZvaWRcblx0e1xuXHRcdGNvbnN0IG5vZGVzID0gcGFuZWwucXVlcnlTZWxlY3RvckFsbCAoXCJbaG90LWZpZWxkXVwiKTtcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKVxuXHRcdHtcblx0XHRcdGNvbnN0IGVsID0gbm9kZXNbaV0gYXMgSFRNTElucHV0RWxlbWVudCB8IEhUTUxTZWxlY3RFbGVtZW50IHwgSFRNTFRleHRBcmVhRWxlbWVudDtcblx0XHRcdGlmIChlbCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQgJiYgZWwudHlwZSA9PT0gXCJjaGVja2JveFwiKSBlbC5jaGVja2VkID0gZmFsc2U7XG5cdFx0XHRlbHNlIGlmIChlbCBpbnN0YW5jZW9mIEhUTUxTZWxlY3RFbGVtZW50KSBlbC5zZWxlY3RlZEluZGV4ID0gMDtcblx0XHRcdGVsc2UgZWwudmFsdWUgPSBcIlwiO1xuXHRcdH1cblx0fVxuXG5cdHByb3RlY3RlZCBjb2xsYXBzZVBhbmVsICgpOiB2b2lkXG5cdHtcblx0XHRjb25zdCBwYW5lbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkICh0aGlzLnBhbmVsSWQpO1xuXHRcdGlmIChwYW5lbCA9PSBudWxsKSByZXR1cm47XG5cdFx0Ly8gQm9vdHN0cmFwIGNvbGxhcHNlIGhpZGUg4oCUIHdvcmtzIHdpdGhvdXQgaW1wb3J0aW5nIEJvb3RzdHJhcCBKU1xuXHRcdC8vIGRpcmVjdGx5IGJ5IHRvZ2dsaW5nIHRoZSAuc2hvdyBjbGFzcyBhbmQgYXJpYS1leHBhbmRlZCBvbiBhbnlcblx0XHQvLyB0cmlnZ2VyIHBvaW50ZWQgYXQgdXMuXG5cdFx0cGFuZWwuY2xhc3NMaXN0LnJlbW92ZSAoXCJzaG93XCIpO1xuXHRcdGNvbnN0IHRyaWdnZXJzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCAoYFtkYXRhLWJzLXRhcmdldD1cIiMke3RoaXMucGFuZWxJZH1cIl1gKTtcblx0XHR0cmlnZ2Vycy5mb3JFYWNoICh0ID0+IHQuc2V0QXR0cmlidXRlIChcImFyaWEtZXhwYW5kZWRcIiwgXCJmYWxzZVwiKSk7XG5cdH1cblxuXHQvKipcblx0ICogQmVzdC1lZmZvcnQgcmVmcmVzaCBvZiB0aGUgcGFpcmVkIDxhZG1pbi1jYXJkLXRhYmxlPi4gVGhlIHRhYmxlXG5cdCAqIGV4cG9zZXMgYSBgcmVmcmVzaExpc3RgIG1ldGhvZCBvbiB0aGUgcmVuZGVyZWQgZWxlbWVudCB3aGVuIGl0c1xuXHQgKiBkYXRhIGlzIGxvYWRlZDsgY2FsbGluZyBpdCByZS1mZXRjaGVzIHdpdGhvdXQgYSBwYWdlIHJlbG9hZC5cblx0ICovXG5cdHByb3RlY3RlZCByZWZyZXNoQXR0YWNoZWRMaXN0ICgpOiB2b2lkXG5cdHtcblx0XHRpZiAodGhpcy5hdHRhY2hlZF9saXN0ID09PSBcIlwiKSByZXR1cm47XG5cdFx0Y29uc3QgbGlzdDogYW55ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQgKHRoaXMuYXR0YWNoZWRfbGlzdCk7XG5cdFx0aWYgKGxpc3QgIT0gbnVsbCAmJiB0eXBlb2YgbGlzdC5yZWZyZXNoTGlzdCA9PT0gXCJmdW5jdGlvblwiKVxuXHRcdFx0bGlzdC5yZWZyZXNoTGlzdCAoKTtcblx0fVxuXG5cdG91dHB1dCAoKTogc3RyaW5nIHwgSG90Q29tcG9uZW50T3V0cHV0W11cblx0e1xuXHRcdGlmICh0aGlzLm5hbWUgPT09IFwiXCIpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKFwiYWRtaW4tYWRkLXBhbmVsOiBuYW1lIGlzIHJlcXVpcmVkXCIpO1xuXG5cdFx0dGhpcy5wYW5lbElkID0gYCR7dGhpcy5uYW1lfVBhbmVsYDtcblx0XHR0aGlzLmZvcm1JZCAgPSBgJHt0aGlzLm5hbWV9Rm9ybWA7XG5cblx0XHRjb25zdCBzaG93Q2xhc3MgPSAodGhpcy5zdGFydF9vcGVuID09PSBcIjFcIiB8fCB0aGlzLnN0YXJ0X29wZW4gPT09IFwidHJ1ZVwiKSA/IFwiIHNob3dcIiA6IFwiXCI7XG5cdFx0Y29uc3QgdGl0bGVIdG1sID0gdGhpcy50aXRsZSA/IGA8aDIgY2xhc3M9XCJoNiBmbC1hZGQtcGFuZWwtdGl0bGUgbWItM1wiPiR7dGhpcy50aXRsZX08L2gyPmAgOiBcIlwiO1xuXHRcdGNvbnN0IGNhbmNlbEh0bWwgPSB0aGlzLmNhbmNlbF90ZXh0XG5cdFx0XHQ/IGA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tc20gYnRuLWxpbmsgdGV4dC1tdXRlZCBmbC1hZGQtcGFuZWwtY2FuY2VsXCI+JHt0aGlzLmNhbmNlbF90ZXh0fTwvYnV0dG9uPmBcblx0XHRcdDogXCJcIjtcblxuXHRcdGNvbnN0IHBhbmVsSHRtbCA9IGBcblx0XHRcdDxkaXYgaWQ9XCIke3RoaXMucGFuZWxJZH1cIiBjbGFzcz1cImNvbGxhcHNlIGZsLWFkZC1wYW5lbCR7c2hvd0NsYXNzfVwiPlxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5IGJvcmRlci10b3AgYmctYm9keS10ZXJ0aWFyeSBmbC1hZGQtcGFuZWwtYm9keVwiPlxuXHRcdFx0XHRcdCR7dGl0bGVIdG1sfVxuXHRcdFx0XHRcdDxmb3JtIGlkPVwiJHt0aGlzLmZvcm1JZH1cIiBjbGFzcz1cImZsLWFkZC1wYW5lbC1mb3JtXCI+XG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwicm93IGctMiBhbGlnbi1pdGVtcy1lbmRcIj5cblx0XHRcdFx0XHRcdFx0PGhvdC1wbGFjZS1oZXJlIG5hbWU9XCJwYW5lbEJvZHlcIj48L2hvdC1wbGFjZS1oZXJlPlxuXHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1lbmQgZ2FwLTIgbXQtM1wiPlxuXHRcdFx0XHRcdFx0XHQke2NhbmNlbEh0bWx9XG5cdFx0XHRcdFx0XHRcdDxidXR0b24gdHlwZT1cInN1Ym1pdFwiIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tc3VjY2VzcyBmbC1hZGQtcGFuZWwtc3VibWl0XCI+JHt0aGlzLmJ1dHRvbl90aXRsZX08L2J1dHRvbj5cblx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdDwvZm9ybT5cblx0XHRcdFx0PC9kaXY+XG5cdFx0XHQ8L2Rpdj5gO1xuXG5cdFx0Y29uc3Qgb3V0cHV0czogSG90Q29tcG9uZW50T3V0cHV0W10gPSBbeyBodG1sOiBwYW5lbEh0bWwsIGRvY3VtZW50U2VsZWN0b3I6IFwiYm9keVwiIH1dO1xuXG5cdFx0Ly8gSWYgYSBwYXJ0bmVyIGNhcmQtdGFibGUgaXMgbmFtZWQsIGluamVjdCB0aGUgdG9nZ2xlIGJ1dHRvbiBpbnRvXG5cdFx0Ly8gaXRzIGhlYWRlciBzbG90LiBPdGhlcndpc2UgaG9ub3VyIGFuIGV4cGxpY2l0IGFkZF9wbGFjZV9oZXJlLlxuXHRcdGNvbnN0IHRvZ2dsZUJ0biA9IGA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tc20gYnRuLXByaW1hcnkgZmwtYWRkLXBhbmVsLXRvZ2dsZVwiIGRhdGEtYnMtdG9nZ2xlPVwiY29sbGFwc2VcIiBkYXRhLWJzLXRhcmdldD1cIiMke3RoaXMucGFuZWxJZH1cIiBhcmlhLWV4cGFuZGVkPVwiJHtzaG93Q2xhc3MgPyBcInRydWVcIiA6IFwiZmFsc2VcIn1cIiBhcmlhLWNvbnRyb2xzPVwiJHt0aGlzLnBhbmVsSWR9XCI+JHt0aGlzLmFkZF90ZXh0fTwvYnV0dG9uPmA7XG5cblx0XHRpZiAodGhpcy5hdHRhY2hlZF9saXN0ICE9PSBcIlwiKVxuXHRcdHtcblx0XHRcdG91dHB1dHMucHVzaCAoe1xuXHRcdFx0XHRodG1sOiB0b2dnbGVCdG4sXG5cdFx0XHRcdGRvY3VtZW50U2VsZWN0b3I6IGBbZGF0YS1jYXJkLXRhYmxlLWFkZC1zbG90PVwiJHt0aGlzLmF0dGFjaGVkX2xpc3R9XCJdYFxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdGVsc2UgaWYgKHRoaXMuYWRkX3BsYWNlX2hlcmUgIT09IFwiXCIpXG5cdFx0e1xuXHRcdFx0b3V0cHV0cy5wdXNoICh7XG5cdFx0XHRcdGh0bWw6IHRvZ2dsZUJ0bixcblx0XHRcdFx0ZG9jdW1lbnRTZWxlY3RvcjogYGhvdC1wbGFjZS1oZXJlW25hbWU9XCIke3RoaXMuYWRkX3BsYWNlX2hlcmV9XCJdYFxuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIChvdXRwdXRzKTtcblx0fVxufVxuIiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsImltcG9ydCB7IEFkbWluQnV0dG9uIH0gZnJvbSBcIi4vY29tcG9uZW50cy9hZG1pbi1idXR0b25cIjtcbmltcG9ydCB7IEFkbWluRHJvcGRvd24gfSBmcm9tIFwiLi9jb21wb25lbnRzL2FkbWluLWRyb3Bkb3duXCI7XG5pbXBvcnQgeyBBZG1pbkRhc2hib2FyZCB9IGZyb20gXCIuL2NvbXBvbmVudHMvYWRtaW4tZGFzaGJvYXJkXCI7XG5pbXBvcnQgeyBBZG1pbkVkaXQgfSBmcm9tIFwiLi9jb21wb25lbnRzL2FkbWluLWVkaXRcIjtcbmltcG9ydCB7IEFkbWluVGFibGUgfSBmcm9tIFwiLi9jb21wb25lbnRzL2FkbWluLXRhYmxlXCI7XG5pbXBvcnQgeyBBZG1pblRhYmxlRmllbGQgfSBmcm9tIFwiLi9jb21wb25lbnRzL2FkbWluLXRhYmxlLWZpZWxkXCI7XG5pbXBvcnQgeyBBZG1pblRhYmxlUm93IH0gZnJvbSBcIi4vY29tcG9uZW50cy9hZG1pbi10YWJsZS1yb3dcIjtcbmltcG9ydCB7IEFkbWluVGV4dCB9IGZyb20gXCIuL2NvbXBvbmVudHMvYWRtaW4tdGV4dFwiO1xuXG4vLyBhZG1pbi1wYW5lbCAwLjQuMCDigJQgRnJlZWxpZ2h0LXN0eWxlIGNvbXBvbmVudHMuIEJhY2t3YXJkcyBjb21wYXRpYmxlXG4vLyB3aXRoIHRoZSBleGlzdGluZyBtb2RhbC90YWJsZSBzZXQgYWJvdmU7IHBhZ2VzIG9wdCBpbiBieSBzd2l0Y2hpbmdcbi8vIHRoZWlyIC5ob3R0IHRlbXBsYXRlcyB0byB1c2UgdGhlIG5ldyB0YWdzLlxuaW1wb3J0IHsgQWRtaW5Gb3JtRmllbGQgfSBmcm9tIFwiLi9jb21wb25lbnRzL2FkbWluLWZvcm0tZmllbGRcIjtcbmltcG9ydCB7IEFkbWluQWRkUGFuZWwgfSBmcm9tIFwiLi9jb21wb25lbnRzL2FkbWluLWFkZC1wYW5lbFwiO1xuaW1wb3J0IHsgQWRtaW5DYXJkVGFibGUgfSBmcm9tIFwiLi9jb21wb25lbnRzL2FkbWluLWNhcmQtdGFibGVcIjtcbmltcG9ydCB7IEFkbWluRGV0YWlsUGFnZSB9IGZyb20gXCIuL2NvbXBvbmVudHMvYWRtaW4tZGV0YWlsLXBhZ2VcIjtcbmltcG9ydCB7IEFkbWluRGlzY2xhaW1lciB9IGZyb20gXCIuL2NvbXBvbmVudHMvYWRtaW4tZGlzY2xhaW1lclwiO1xuaW1wb3J0IHsgQWRtaW5FeWVicm93SGVhZGluZyB9IGZyb20gXCIuL2NvbXBvbmVudHMvYWRtaW4tZXllYnJvdy1oZWFkaW5nXCI7XG5cbmV4cG9ydCB7XG5cdFx0QWRtaW5CdXR0b24sXG5cdFx0QWRtaW5Ecm9wZG93bixcblx0XHRBZG1pbkRhc2hib2FyZCxcblx0XHRBZG1pbkVkaXQsXG5cdFx0QWRtaW5UYWJsZSxcblx0XHRBZG1pblRhYmxlRmllbGQsXG5cdFx0QWRtaW5UYWJsZVJvdyxcblx0XHRBZG1pblRleHQsXG5cdFx0QWRtaW5Gb3JtRmllbGQsXG5cdFx0QWRtaW5BZGRQYW5lbCxcblx0XHRBZG1pbkNhcmRUYWJsZSxcblx0XHRBZG1pbkRldGFpbFBhZ2UsXG5cdFx0QWRtaW5EaXNjbGFpbWVyLFxuXHRcdEFkbWluRXllYnJvd0hlYWRpbmdcblx0fTtcbiJdLCJuYW1lcyI6WyJtb2R1bGUiLCJleHBvcnRzIiwiRGF0YVRhYmxlIiwiSG90U3RhcVdlYiIsIkFkbWluRHJvcGRvd24iLCJIb3RDb21wb25lbnQiLCJjb25zdHJ1Y3RvciIsImNvcHkiLCJhcGkiLCJzdXBlciIsInRoaXMiLCJ0YWciLCJwbGFjZWhvbGRlciIsIm9uc2VhcmNoIiwib25zZWxlY3QiLCJvblBvc3RQbGFjZSIsInBhcmVudEh0bWxFbGVtZW50IiwiaHRtbEVsZW1lbnQiLCJwbGFjZUhlcmVBcnJheSIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJsZW5ndGgiLCJwbGFjZUhlcmUiLCJyZW1vdmVDaGlsZCIsImFwcGVuZENoaWxkIiwiRnVuY3Rpb24iLCJxdWVyeVNlbGVjdG9yIiwiYWRkRXZlbnRMaXN0ZW5lciIsImV2ZW50Iiwic2VhcmNoVGV4dCIsImN1cnJlbnRUYXJnZXQiLCJ2YWx1ZSIsInJlc3VsdHMiLCJzZWFyY2hSZXN1bHRzRGl2IiwiJCIsImh0bWxFbGVtZW50cyIsImZpbmQiLCJlbXB0eSIsImlJZHgiLCJyZXN1bHQiLCJ1cmwiLCJ0ZXh0IiwiJHRlbXBsYXRlIiwiJGEiLCJhdHRyIiwicmVtb3ZlQXR0ciIsIm9uIiwic2VsZWN0ZWQiLCJhcHBlbmQiLCJpbmRleCIsImdldEF0dHJpYnV0ZSIsImlubmVySFRNTCIsIm91dHB1dCIsImlubmVyIiwiQWRtaW5FeWVicm93SGVhZGluZyIsImV5ZWJyb3ciLCJoZWFkaW5nIiwic3VidGl0bGUiLCJhbGlnbiIsImFsaWduQ2xhc3MiLCJBZG1pbkNhcmRUYWJsZSIsInRpdGxlIiwibGlzdF91cmwiLCJqd3QiLCJsaXN0X3BhcmFtcyIsInByaW1hcnlfZmllbGQiLCJzdWJsaW5lX2ZpZWxkIiwiZGV0YWlsX3JvdXRlIiwiZW1wdHlfdGV4dCIsImxvYWRpbmdfdGV4dCIsInJvd19hY3Rpb25zIiwiYWRkX3Nsb3QiLCJzZWxmIiwiY29udGFpbmVyIiwiZG9jdW1lbnQiLCJnZXRFbGVtZW50QnlJZCIsIm5hbWUiLCJyZWZyZXNoTGlzdCIsImZldGNoQW5kUmVuZGVyIiwibGlzdCIsInBheWxvYWQiLCJKU09OIiwicGFyc2UiLCJlIiwiaGVhZGVycyIsInJlcyIsImZldGNoIiwibWV0aG9kIiwiYm9keSIsInN0cmluZ2lmeSIsIm9rIiwic3RhdHVzIiwianNvbiIsInJvd3MiLCJBcnJheSIsImlzQXJyYXkiLCJkYXRhIiwibWFwIiwicm93IiwicmVuZGVyUm93Iiwiam9pbiIsImV4IiwibWVzc2FnZSIsImVzY2FwZUh0bWwiLCJzIiwiU3RyaW5nIiwicmVwbGFjZSIsImludGVycG9sYXRlIiwidGVtcGxhdGUiLCJfbSIsImtleSIsInByaW1hcnlSYXciLCJwcmltYXJ5IiwiaWQiLCJzdWJsaW5lUmF3IiwiRXJyb3IiLCJ0aXRsZUh0bWwiLCJhZGRTbG90QXR0ciIsImJvb3RzdHJhcCIsIkFkbWluRWRpdCIsIm9uQWRkQ2xpY2tlZCIsIm9uRWRpdENsaWNrZWQiLCJvblJlbW92ZUNsaWNrZWQiLCJidXR0b25fdGl0bGUiLCJhdHRhY2hlZF9saXN0Iiwic2NoZW1hIiwibW9kYWxJZCIsImFkZF90ZXh0IiwiYWRkX3BsYWNlX2hlcmUiLCJlZGl0X3RleHQiLCJlZGl0X3BsYWNlX2hlcmUiLCJyZW1vdmVfdGV4dCIsInJlbW92ZV9wbGFjZV9oZXJlIiwiY3NzX2NsYXNzIiwibW9kYWwiLCJtb2RhbFR5cGUiLCJjbG9zZU9uU2F2ZSIsInNlbGVjdGVkRmllbGRzIiwib25zYXZlIiwib25lZGl0Iiwib25kZWxldGUiLCJwcm9jZXNzSG90RmllbGRzIiwib25GaWVsZCIsImVsbXMiLCJlbG0iLCJmaWVsZCIsImZpZWxkVHlwZSIsImZpZWxkSW5wdXQiLCJ0eXBlIiwiaW5wdXQiLCJhZGRDbGlja2VkIiwidmFsIiwib25hZGQiLCJNb2RhbCIsImdldEluc3RhbmNlIiwic2hvdyIsImdldEF0dGFjaGVkSFRNTExpc3RzIiwic3RycyIsInNwbGl0IiwiYXR0YWNoZWRMaXN0cyIsImkiLCJhdHRhY2hlZExpc3QiLCJhdHRhY2hlZExpc3RPYmoiLCJwdXNoIiwiZ2V0QXR0YWNoZWRMaXN0cyIsImF0dGFjaGVkTGlzdE9ianMiLCJob3RDb21wb25lbnQiLCJlZGl0Q2xpY2tlZCIsImNsaWNrZWRUYWJsZSIsInRhYmxlIiwiYXR0YWNoZWRFZGl0Iiwic2VsZWN0ZWRGaWVsZCIsImdldFNlbGVjdGVkIiwiZnVuYyIsImNhbGwiLCJyZW1vdmVDbGlja2VkIiwid2hlcmVGaWVsZHMiLCJjaGVja2VkUm93cyIsImdldENoZWNrZWRSb3dzIiwiY2hlY2tlZFJvdyIsImNvbmZpcm0iLCJ3aGVyZUZpZWxkIiwiZ2V0RmllbGRUeXBlIiwicmVtb3ZlVXJsIiwiSG90IiwiRGF0YSIsIkFkbWluUGFuZWwiLCJqc29uUmVxdWVzdCIsImN1cnJlbnREYXRhIiwicHJlcGFyZWREYXRhIiwicHJlcGFyZURhdGEiLCJ0YWJsZUNhbGxiYWNrIiwib25TYXZlIiwidmFsdWVzIiwiZmllbGRTYXZlIiwicGFyc2VGbG9hdCIsInBhcnNlSW50IiwiYm9vbHZhbCIsInRvTG93ZXJDYXNlIiwiYWRkVXJsIiwiZmllbGRzIiwiYWxlcnQiLCJlZGl0VXJsIiwiaGlkZSIsInNldFRpbWVvdXQiLCJvdXRwdXRPYmoiLCJodG1sIiwiZG9jdW1lbnRTZWxlY3RvciIsIkFkbWluRGV0YWlsUGFnZSIsImJhY2tfdXJsIiwiYmFja190ZXh0IiwiZ2V0X3VybCIsInNhdmVfdXJsIiwiZGVsZXRlX3VybCIsInBheWxvYWRfa2V5IiwiaWRfcGFyYW0iLCJzYXZlX3RleHQiLCJkZWxldGVfdGV4dCIsImRlbGV0ZV9jb25maXJtIiwicGFnZSIsInJlYWRJZEZyb21VcmwiLCJzaG93RXJyb3IiLCJzYXZlQnRuIiwiZGVsZXRlQnRuIiwicHJldmVudERlZmF1bHQiLCJoYW5kbGVTYXZlIiwiaGFuZGxlRGVsZXRlIiwiZmV0Y2hBbmRGaWxsIiwiVVJMU2VhcmNoUGFyYW1zIiwid2luZG93IiwibG9jYXRpb24iLCJzZWFyY2giLCJnZXQiLCJtc2ciLCJmYiIsImNsYXNzTmFtZSIsInRleHRDb250ZW50Iiwic2hvd1N1Y2Nlc3MiLCJvYmoiLCJwb3B1bGF0ZUZpZWxkcyIsIm5vZGVzIiwiZWwiLCJIVE1MSW5wdXRFbGVtZW50IiwiY2hlY2tlZCIsImNvbGxlY3RWYWx1ZXMiLCJvdXQiLCJOdW1iZXIiLCJidG4iLCJkaXNhYmxlZCIsImoiLCJlcnJvciIsImhyZWYiLCJBZG1pbkJ1dHRvbiIsIm9uY2xpY2siLCJidXR0b25DbGlja2VkIiwiQWRtaW5UYWJsZSIsInJvd0VsZW1lbnRzIiwiZWxlbWVudHMiLCJpbmRpY2llcyIsInRhYmxlRGF0YSIsIm9ubGlzdCIsImxpc3R1cmwiLCJjaGVja2JveCIsInNpbmdsZWNsaWNrZWRpdCIsIm9uc2VsZWN0ZWRyb3ciLCJkYXRhVGFibGUiLCJpc0xpc3RSZWZyZXNoaW5nIiwiYWRkSGVhZGVyIiwidGFibGVGaWVsZEVsZW1lbnQiLCJoZWFkZXIiLCJnZXRFbGVtZW50c0J5VGFnTmFtZSIsImFkZEhlYWRlckRhdGFPbmx5IiwidGFibGVGaWVsZCIsImZpZWxkTmFtZSIsInNlbGVjdFJvdyIsInJvd0luZGV4IiwiY2xhc3NMaXN0IiwiY29udGFpbnMiLCJyZW1vdmUiLCJhZGQiLCJIb3RTdGFxIiwicGFyc2VCb29sZWFuIiwiaXRlbSIsImNoZWNrYm94ZXMiLCJkYXRhSW5kZXhTdHIiLCJwYXJlbnRFbGVtZW50IiwiZGF0YUluZGV4IiwiZ2V0Um93IiwiYWRkUm93Iiwicm93c0ZpZWxkcyIsImtleVBhcnRzIiwidGVtcFZhbHVlIiwicm93T2JqIiwib3JnRmllbGQiLCJkZWZhdWx0T3V0cHV0Iiwib25pbnB1dCIsIm9ub3V0cHV0IiwiY2xlYXJSb3dzIiwiY2xlYXIiLCJvZmZzZXQiLCJsaW1pdCIsInNlYXJjaFN0ciIsImluZm8iLCJzdGFydCIsImxpc3RVcmwiLCJjb25zb2xlIiwidGJvZHkiLCJwYXJlbnROb2RlIiwiY2FsbGJhY2tPYmoiLCJkcmF3IiwicmVjb3Jkc1RvdGFsIiwicmVjb3Jkc0ZpbHRlcmVkIiwic2FuaXRpemUiLCJob3RTYW5pdGl6ZSIsInNhbml0aXplSlNPTiIsImNvbHVtbnMiLCJlYWNoIiwiZGF0YVR5cGUiLCJsYWJlbCIsImNyZWF0ZWRDZWxsIiwiY2VsbCIsIl9jZWxsRGF0YSIsIl9yb3dEYXRhIiwiX3Jvd0lkeCIsIl9jb2xJZHgiLCJzZXRBdHRyaWJ1dGUiLCJwcm9jZXNzaW5nIiwic2VydmVyU2lkZSIsImNvbFJlb3JkZXIiLCJzY3JvbGxlciIsInNlbGVjdCIsImRvbSIsImFqYXgiLCJjYWxsYmFjayIsInNldHRpbmdzIiwiQWRtaW5UZXh0Iiwibm9fb3V0cHV0IiwiZmllbGRfdHlwZSIsImh0bWxUeXBlIiwiQWRtaW5EaXNjbGFpbWVyIiwiYWNjZW50IiwiQWRtaW5UYWJsZUZpZWxkIiwicGxhY2VIZXJlUGFyZW50IiwiQWRtaW5UYWJsZVJvdyIsImVsZW1lbnQiLCJyb3dIdG1sIiwiZmllbGRPYmoiLCJBZG1pbkRhc2hib2FyZCIsImJhc2UiLCJiYXNlVXJsIiwiQWRtaW5Gb3JtRmllbGQiLCJyZXF1aXJlZCIsImNvbnRyb2wiLCJhdXRvY29tcGxldGUiLCJoZWxwIiwib3B0aW9ucyIsIm1pbiIsInN0ZXAiLCJtYXhsZW5ndGgiLCJjb2wiLCJzaXplIiwicmVuZGVySW5wdXQiLCJzaXplQ2xhc3MiLCJjbGFzc2VzIiwibWluQXR0ciIsInN0ZXBBdHRyIiwibWF4QXR0ciIsImFjQXR0ciIsInBoQXR0ciIsInJlbmRlclNlbGVjdCIsIm9wdHMiLCJyYXciLCJwYXJ0IiwidHJpbSIsImNvbG9uIiwiaW5kZXhPZiIsInNsaWNlIiwibGJsIiwicmVuZGVyVGV4dGFyZWEiLCJyZW5kZXJDaGVja2JveCIsIk1hdGgiLCJyYW5kb20iLCJ0b1N0cmluZyIsInJlcXVpcmVkTWFya2VyIiwiaGVscEh0bWwiLCJmaWVsZEh0bWwiLCJBZG1pbkFkZFBhbmVsIiwiY2FuY2VsX3RleHQiLCJzdGFydF9vcGVuIiwicGFuZWwiLCJwYW5lbElkIiwic3VibWl0QnRuIiwiY2FuY2VsQnRuIiwiY29sbGVjdEZpZWxkVmFsdWVzIiwia2VlcE9wZW4iLCJyZXNldEZpZWxkcyIsImNvbGxhcHNlUGFuZWwiLCJyZWZyZXNoQXR0YWNoZWRMaXN0IiwiSFRNTFNlbGVjdEVsZW1lbnQiLCJzZWxlY3RlZEluZGV4IiwiZm9yRWFjaCIsInQiLCJmb3JtSWQiLCJzaG93Q2xhc3MiLCJjYW5jZWxIdG1sIiwib3V0cHV0cyIsInRvZ2dsZUJ0biIsIl9fd2VicGFja19tb2R1bGVfY2FjaGVfXyIsIl9fd2VicGFja19yZXF1aXJlX18iLCJtb2R1bGVJZCIsImNhY2hlZE1vZHVsZSIsInVuZGVmaW5lZCIsIl9fd2VicGFja19tb2R1bGVzX18iXSwic291cmNlUm9vdCI6IiJ9