openstack-uicore-foundation 4.0.97 → 4.0.98

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 (95) hide show
  1. package/lib/components/ajaxloader.js +184 -1
  2. package/lib/components/attendance-tracker.js +1992 -1
  3. package/lib/components/bulk-actions-selector.js +194 -1
  4. package/lib/components/circle-button.js +223 -1
  5. package/lib/components/clock.js +678 -1
  6. package/lib/components/exclusive-wrapper.js +151 -1
  7. package/lib/components/extra-questions.js +1902 -1
  8. package/lib/components/form-validation.js +190 -1
  9. package/lib/components/forms/rsvp-form.js +940 -1
  10. package/lib/components/forms/simple-form.js +708 -1
  11. package/lib/components/free-text-search.js +2042 -1
  12. package/lib/components/google-map.js +576 -1
  13. package/lib/components/index.js +12840 -1
  14. package/lib/components/inputs/access-levels-input.js +2306 -1
  15. package/lib/components/inputs/action-dropdown.js +219 -1
  16. package/lib/components/inputs/checkbox-list.js +339 -1
  17. package/lib/components/inputs/company-input.js +2341 -1
  18. package/lib/components/inputs/country-dropdown.js +2399 -1
  19. package/lib/components/inputs/country-input.js +2302 -1
  20. package/lib/components/inputs/datetimepicker.js +314 -1
  21. package/lib/components/inputs/dropdown.js +259 -1
  22. package/lib/components/inputs/editor-input.js +270 -1
  23. package/lib/components/inputs/event-input.js +2280 -1
  24. package/lib/components/inputs/free-multi-text-input.js +252 -1
  25. package/lib/components/inputs/group-input.js +2275 -1
  26. package/lib/components/inputs/grouped-dropdown.js +244 -1
  27. package/lib/components/inputs/language-input.js +2307 -1
  28. package/lib/components/inputs/member-input.js +2302 -1
  29. package/lib/components/inputs/operator-input.js +328 -1
  30. package/lib/components/inputs/organization-input.js +2325 -1
  31. package/lib/components/inputs/promocode-input.js +2310 -1
  32. package/lib/components/inputs/radio-list.js +297 -1
  33. package/lib/components/inputs/registration-company-input.js +2470 -1
  34. package/lib/components/inputs/speaker-input.js +2336 -1
  35. package/lib/components/inputs/sponsor-input.js +2284 -1
  36. package/lib/components/inputs/stepped-select.js +197 -1
  37. package/lib/components/inputs/summit-days-select.js +162 -1
  38. package/lib/components/inputs/summit-input.js +2282 -1
  39. package/lib/components/inputs/summit-venues-select.js +172 -1
  40. package/lib/components/inputs/tag-input.js +2352 -1
  41. package/lib/components/inputs/text-input.js +202 -1
  42. package/lib/components/inputs/textarea-input.js +181 -1
  43. package/lib/components/inputs/ticket-types-input.js +2338 -1
  44. package/lib/components/inputs/upload-input-v2.js +834 -1
  45. package/lib/components/inputs/upload-input.js +391 -1
  46. package/lib/components/progressive-img.js +289 -1
  47. package/lib/components/raw-html.js +125 -1
  48. package/lib/components/schedule-builder-constants.js +81 -1
  49. package/lib/components/schedule-builder-view.js +1684 -1
  50. package/lib/components/sections/panel.js +156 -1
  51. package/lib/components/simple-link-list.js +790 -1
  52. package/lib/components/sponsored-project-input.js +2281 -1
  53. package/lib/components/summit-dropdown.js +214 -1
  54. package/lib/components/table-editable.js +895 -1
  55. package/lib/components/table-selectable.js +552 -1
  56. package/lib/components/table-sortable.js +657 -1
  57. package/lib/components/table.js +510 -1
  58. package/lib/components/video-stream.js +226 -1
  59. package/lib/css/components/bulk-actions-selector.css +16 -1
  60. package/lib/css/components/circle-button.css +24 -1
  61. package/lib/css/components/extra-questions.css +29 -1
  62. package/lib/css/components/form-validation.css +29 -1
  63. package/lib/css/components/free-text-search.css +29 -1
  64. package/lib/css/components/index.css +1354 -2
  65. package/lib/css/components/inputs/action-dropdown.css +46 -1
  66. package/lib/css/components/inputs/datetimepicker.css +208 -1
  67. package/lib/css/components/inputs/grouped-dropdown.css +25 -1
  68. package/lib/css/components/inputs/stepped-select.css +12 -1
  69. package/lib/css/components/inputs/upload-input-v2.css +106 -1
  70. package/lib/css/components/inputs/upload-input.css +43 -1
  71. package/lib/css/components/progressive-img.css +16 -1
  72. package/lib/css/components/schedule-builder-view.css +230 -1
  73. package/lib/css/components/simple-link-list.css +189 -1
  74. package/lib/css/components/summit-dropdown.css +35 -1
  75. package/lib/css/components/table-editable.css +145 -1
  76. package/lib/css/components/table-selectable.css +147 -1
  77. package/lib/css/components/table-sortable.css +150 -1
  78. package/lib/css/components/table.css +147 -1
  79. package/lib/i18n.js +449 -1
  80. package/lib/models/index.js +238 -1
  81. package/lib/models/summit-event.js +210 -1
  82. package/lib/security/abstract-auth-callback-route.js +2114 -1
  83. package/lib/security/actions.js +1818 -1
  84. package/lib/security/constants.js +71 -1
  85. package/lib/security/methods.js +1818 -1
  86. package/lib/security/reducers.js +1961 -1
  87. package/lib/security/session-checker.js +2179 -1
  88. package/lib/utils/actions.js +1818 -1
  89. package/lib/utils/fragment-parser.js +207 -1
  90. package/lib/utils/methods.js +369 -1
  91. package/lib/utils/query-actions.js +2154 -1
  92. package/lib/utils/questions-set.js +609 -1
  93. package/lib/utils/reducers.js +1874 -1
  94. package/lib/utils/use-fit-text.js +178 -1
  95. package/package.json +1 -1
@@ -1 +1,1902 @@
1
- !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define("openstack-uicore-foundation",[],t):"object"==typeof exports?exports["openstack-uicore-foundation"]=t():e["openstack-uicore-foundation"]=t()}(this,(()=>(()=>{"use strict";var e={2230:(e,t,a)=>{a.d(t,{default:()=>p});var r=a(3838),n=a.n(r),s=a(580),l=a.n(s),i=a(6689),o=a.n(i),u=a(4656),c=a.n(u),d=a(418);const m=["onChange","value","className","options","id","children","error","disabled","name","ariaLabelledBy"];class p extends o().Component{constructor(e){super(e);let t=!!e.value&&e.value.find((t=>!e.options.map((e=>e.value)).includes(t)));this.state={otherChecked:!!t},this.handleChange=this.handleChange.bind(this),this.handleOtherCBChange=this.handleOtherCBChange.bind(this)}handleChange(e){let t=this.props.options.map((e=>e.value)),a=this.props.value?[...this.props.value]:[];if("checkbox"===e.target.type)if(e.target.checked){const t=isNaN(e.target.value)?e.target.value:parseInt(e.target.value);a.push(t)}else a=a.filter((t=>t!=e.target.value));else a=a.filter((e=>t.includes(e))),a.push(e.target.value);let r={target:{id:this.props.id,value:a,type:"checkboxlist"}};this.props.onChange(r)}handleOtherCBChange(e){this.setState({otherChecked:e.target.checked})}render(){let e,t=this.props,{onChange:a,value:r,className:s,options:l,id:i,children:u,error:p,disabled:h,name:b,ariaLabelledBy:g}=t,{otherChecked:f}=(n()(t,m),this.state),v=this.props.hasOwnProperty("inline"),y=this.props.hasOwnProperty("html"),_=this.props.hasOwnProperty("allowOther"),E=!!r&&r.find((e=>!l.map((e=>e.value)).includes(e))),q=this.props.hasOwnProperty("error")&&""!==p,C=this.props.hasOwnProperty("disabled")&&1==h;return e=v?{paddingLeft:"22px",marginLeft:"20px",float:"left"}:{paddingLeft:"22px",marginTop:"7px"},o().createElement("div",{id:`chl_wrapper_${i}`,"aria-labelledby":g},o().createElement("div",{className:"checkboxes-div"+(q?" error":"")},l.map((t=>{let a=!!r&&r.includes(t.value);return o().createElement("div",{className:"form-check abc-checkbox",key:"radio_key_"+t.value,style:e},o().createElement("input",{type:"checkbox",id:`cb_${i}_${t.value}`,name:b||i,checked:a,disabled:C,onChange:this.handleChange,className:"form-check-input",value:t.value}),o().createElement("label",{className:"form-check-label",htmlFor:`cb_${i}_${t.value}`},y&&o().createElement(d.default,null,t.label),!y&&t.label))})),_&&o().createElement("div",{className:"form-check abc-checkbox",style:e},o().createElement("input",{type:"checkbox",id:"cb_other"+i,checked:f,disabled:C,onChange:this.handleOtherCBChange,className:"form-check-input",value:"other"}),o().createElement("label",{className:"form-check-label",htmlFor:"cb_other"+i},c().translate("general.other"))),_&&f&&o().createElement("div",{style:{paddingLeft:"22px",width:"50%"}},o().createElement("input",{className:"form-control",disabled:C,onChange:this.handleChange,value:E}))),q&&o().createElement("p",{className:"error-label"},p))}}p.defaultProps={ariaLabelledBy:null},p.propTypes={id:l().string.isRequired}},401:(e,t,a)=>{a.d(t,{default:()=>g});var r=a(8213),n=a.n(r),s=a(8779),l=a.n(s),i=a(3838),o=a.n(i),u=a(6689),c=a.n(u),d=a(1929),m=a.n(d);const p=["onChange","value","className","error","clearable","disabled","overrideCSS","ariaLabelledBy"];function h(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function b(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?h(Object(a),!0).forEach((function(t){l()(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):h(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}class g extends c().Component{constructor(e){super(e),this.handleChange=this.handleChange.bind(this)}handleChange(e){let t=null;t=this.props.isMulti?e?e.map((e=>e.value)):null:e?e.value:null;let a={target:{id:this.props.id,value:t,type:"dropdown"}};this.props.onChange(a)}render(){let e=this.props,{onChange:t,value:a,className:r,error:s,clearable:l,disabled:i,overrideCSS:u,ariaLabelledBy:d}=e,h=o()(e,p),g=this.props.hasOwnProperty("error")&&""!=s,f=this.props.hasOwnProperty("clearable"),v=this.props.hasOwnProperty("disabled")&&1==i,y=null,_=r;this.props.hasOwnProperty("overrideCSS")&&0!=u||(_="dropdown "+r+" "+(g?"error":"")),y=this.props.isMulti?this.props.options.filter((e=>a.includes(e.value))):a instanceof Object||null==a?a:this.props.options.find((e=>e.value==a));const E={menu:e=>b(b({},e),{},{zIndex:999})};return c().createElement("div",null,c().createElement(m(),n()({className:_,value:y,onChange:this.handleChange,isClearable:f,isDisabled:v,styles:E,"aria-labelledby":d},h)),g&&c().createElement("p",{className:"error-label"},s))}}g.defaultProps={ariaLabelledBy:null}},7027:(e,t,a)=>{a.d(t,{default:()=>d});var r=a(3838),n=a.n(r),s=a(6689),l=a.n(s),i=a(418),o=a(580),u=a.n(o);const c=["onChange","value","className","error","ariaLabelledBy","disabled","options","id","name"];class d extends l().Component{constructor(e){super(e),this.state={value:e.value},this.handleChange=this.handleChange.bind(this)}handleChange(e){let t={target:{id:this.props.id,value:e.target.value,type:"radio"}};this.props.onChange(t)}getLabel(e,t,a,r,n){return a?l().createElement("label",{className:"form-check-label",htmlFor:`radio_${t}_${e.value}`,style:{display:"inline-block"}},n&&l().createElement(i.default,null,e.label),!n&&e.label):r?l().createElement("label",{className:"form-check-label",htmlFor:`radio_${t}_${e.value}`},e.label):l().createElement("label",{className:"form-check-label",htmlFor:`radio_${t}_${e.value}`,style:{display:"inline-block"}},l().createElement("h4",{style:{marginTop:"0px"}},e.label),l().createElement(i.default,null,e.description))}render(){let e,t=this.props,{onChange:a,value:r,className:s,error:i,ariaLabelledBy:o,disabled:u,options:d,id:m,name:p}=t,h=(n()(t,c),this.props.hasOwnProperty("error")&&""!=i),b=this.props.hasOwnProperty("inline"),g=this.props.hasOwnProperty("simple"),f=this.props.hasOwnProperty("html"),v=this.props.hasOwnProperty("disabled")&&1==u;return e=b?{paddingLeft:"22px",marginLeft:"20px",float:"left"}:{paddingLeft:"22px"},l().createElement("div",{id:`rl_wrapper_${m}`,"aria-labelledby":o},d.map((t=>{let a=t.value==r;return l().createElement("div",{className:"form-check abc-radio",key:`radio_key_${m}_${t.value}`,style:e},l().createElement("input",{className:"form-check-input",type:"radio",id:`radio_${m}_${t.value}`,value:t.value,checked:a,onChange:this.handleChange,disabled:v,name:p||`radio_${m}`}),this.getLabel(t,m,b,g,f))})),h&&l().createElement("p",{className:"error-label"},i))}}d.defaultProps={ariaLabelledBy:null},d.propTypes={id:u().string.isRequired}},1833:(e,t,a)=>{a.d(t,{default:()=>c});var r=a(8213),n=a.n(r),s=a(3838),l=a.n(s),i=a(6689),o=a.n(i);const u=["onChange","value","className","error","ariaLabelledBy","containerClassName"];class c extends o().Component{constructor(e){super(e),this.handleChange=this.handleChange.bind(this)}componentDidUpdate(e,t,a){this.props.value!==e.value&&(this.input.value=this.props.value)}handleChange(e){this.props.onChange(e)}render(){let e=this.props,{onChange:t,value:a,className:r,error:s,ariaLabelledBy:i,containerClassName:c}=e,d=l()(e,u),m=this.props.hasOwnProperty("error")&&""!==s,p=this.props.hasOwnProperty("className")?r:"form-control",h=this.props.hasOwnProperty("containerClassName")?c:"container-form-control";return o().createElement("div",{className:h},o().createElement("input",n()({className:`${p} ${m?"error":""}`,ref:e=>{this.input=e},defaultValue:a,"aria-labelledby":i,onChange:this.handleChange},d)),m&&o().createElement("p",{className:"error-label"},s))}}c.defaultProps={ariaLabelledBy:null}},418:(e,t,a)=>{a.d(t,{default:()=>s});var r=a(6689),n=a.n(r);const s=({children:e,replaceNewLine:t=!1,className:a=""})=>n().createElement("span",{className:a,dangerouslySetInnerHTML:{__html:t?null==e?void 0:e.replace(/\n/g,"<br />"):e}})},6793:(e,t,a)=>{a.d(t,{toSlug:()=>r});a(8362),a(6530);const r=e=>(e=e.toLowerCase()).replace(/[^a-zA-Z0-9]+/g,"_")},1995:(e,t,a)=>{a.d(t,{default:()=>h});var r=a(8779),n=a.n(r),s=a(6793);function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function i(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?l(Object(a),!0).forEach((function(t){n()(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):l(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}const o="ComboBox",u="CheckBoxList",c="RadioButtonList",d=[o,u,c],m="And",p="Equal";class h{constructor(e,t=[]){n()(this,"_parseQuestion",(e=>{if(this.questionByName[(0,s.toSlug)(e.name)]=e,this.questionById[parseInt(e.id)]=e,e.hasOwnProperty("sub_question_rules"))for(let t of e.sub_question_rules)this.rules[parseInt(t.id)]=t,this._parseQuestion(t.sub_question)})),n()(this,"_parseQuestions",(()=>{for(let e of this.questions)this._parseQuestion(e)})),n()(this,"_allowsValues",(e=>d.includes(e.type))),n()(this,"_allowsValue",((e,t)=>{let a=t.value.split(",").map((e=>parseInt(e)));for(let t of a)if(!e.values.map((e=>e.id)).includes(t))return!1;return!0})),n()(this,"_getAnswerFor",(e=>{let t=Number.isInteger(e)?e:e.id,a=this.answers[t]||null;return a||null})),n()(this,"_hasValue",(e=>""!==e.value)),n()(this,"_answerContains",((e,t)=>e.value.split(",").includes(t))),n()(this,"_isSubQuestionVisible",(e=>{let t=e.answer_values_operator===m;const a=this._getAnswerFor(e.parent_question_id);if(a)switch(e.visibility_condition){case p:for(let r of e.answer_values)t=e.answer_values_operator===m?t&&this._answerContains(a,r):t||this._answerContains(a,r);break;case"NotEqual":for(let r of e.answer_values)t=e.answer_values_operator===m?t&&!this._answerContains(a,r):t||!this._answerContains(a,r)}else t=e.visibility_condition!==p;return"Visible"===e.visibility?t:!t})),n()(this,"_isAnswered",(e=>{const t=this._getAnswerFor(e);if("MainQuestion"===e.class)return!e.mandatory||!!t&&(!!this._hasValue(t)&&!(this._allowsValues(e)&&!this._allowsValue(e,t)));for(let a of e.parent_rules)if(this._isSubQuestionVisible(this.rules[a]))return!e.mandatory||!!t&&(!!this._hasValue(t)&&!(this._allowsValues(e)&&!this._allowsValue(e,t)));return!0})),n()(this,"_checkQuestion",(e=>{let t=this._isAnswered(e);if(e.hasOwnProperty("sub_question_rules"))for(let a of e.sub_question_rules)t=t&&this._checkQuestion(a.sub_question);return t})),n()(this,"_formatQuestionAnswer",(e=>{var t;let a={};const r=(0,s.toSlug)(e.name);let n=null===(t=this.originalAnswers.find((t=>t.question_id===e.id)))||void 0===t?void 0:t.value;if(n&&("CheckBox"===e.type&&(n="false"!==n&&!!n),e.type!==c&&e.type!==o||(n=parseInt(n)),e.type===u&&(n=n.split(",").map((e=>parseInt(e)))||[])),a[r]=n||"",e.type===u&&""===a[r]&&(a[r]=[]),e.hasOwnProperty("sub_question_rules"))for(let t of e.sub_question_rules){let e=this._formatQuestionAnswer(t.sub_question);a=i(i({},a),e)}return a})),n()(this,"formatAnswers",(()=>{let e={};return this.questions.forEach((t=>{let a=this._formatQuestionAnswer(t);e=i(i({},e),a)})),e})),n()(this,"completed",(()=>{let e=!0;for(let t of this.questions)e=e&&this._checkQuestion(t);return e})),n()(this,"getQuestionByName",(e=>{const t=(0,s.toSlug)(e);return this.questionByName[e]||this.questionByName[t]||null})),n()(this,"getQuestionById",(e=>this.questionById[parseInt(e)]||null)),this.questions=e,this.originalAnswers=t,this.answers=[];for(let e of this.originalAnswers)this.answers[e.question_id]=e;this.questionByName={},this.questionById={},this.rules={},this._parseQuestions()}}},8779:e=>{e.exports=require("@babel/runtime/helpers/defineProperty")},8213:e=>{e.exports=require("@babel/runtime/helpers/extends")},3838:e=>{e.exports=require("@babel/runtime/helpers/objectWithoutProperties")},4656:e=>{e.exports=require("i18n-react/dist/i18n-react")},8362:e=>{e.exports=require("moment-timezone")},580:e=>{e.exports=require("prop-types")},6689:e=>{e.exports=require("react")},1929:e=>{e.exports=require("react-select")},6530:e=>{e.exports=require("urijs")}},t={};function a(r){var n=t[r];if(void 0!==n)return n.exports;var s=t[r]={exports:{}};return e[r](s,s.exports,a),s.exports}(()=>{a.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return a.d(t,{a:t}),t}})(),(()=>{a.d=(e,t)=>{for(var r in t)a.o(t,r)&&!a.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})}})(),(()=>{a.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t)})(),(()=>{a.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})}})();var r={};return(()=>{a.r(r),a.d(r,{default:()=>k});var e=a(8213),t=a.n(e),n=a(3838),s=a.n(n),l=a(6689),i=a.n(l),o=a(580),u=a.n(o),c=a(418),d=a(1833),m=a(401),p=a(7027),h=a(2230),b=a(1995);const g=require("react-final-form");var f=a(6793);const v=["input","meta","question","className","isDisabled","isRequired"],y=["input","meta","question","isDisabled","isRequired"],_=["input","meta","question","isDisabled","isRequired"],E=["input","meta","question","isDisabled","isRequired","maxValues"],q=e=>{let{input:a,meta:r,question:n,className:l,isDisabled:o,isRequired:u}=e,c=s()(e,v);return i().createElement(d.default,t()({},a,c,{containerClassName:l,name:(0,f.toSlug)(n.name),ariaLabelledBy:`${(0,f.toSlug)(n.name)} label`,id:(0,f.toSlug)(n.name),value:a.value,disabled:o,required:u,onChange:a.onChange,placeholder:n.placeholder}))},C=e=>{let{input:a,meta:r,question:n,isDisabled:l,isRequired:o}=e,u=s()(e,y);return i().createElement(p.default,t()({},a,u,{name:(0,f.toSlug)(n.name),ariaLabelledBy:`${(0,f.toSlug)(n.name)} label`,id:(0,f.toSlug)(n.name),overrideCSS:!0,value:a.value,disabled:l,required:o,onChange:a.onChange}))},w=e=>{let{input:a,meta:r,question:n,isDisabled:l,isRequired:o}=e,u=s()(e,_);return i().createElement(m.default,t()({},a,u,{name:(0,f.toSlug)(n.name),ariaLabelledBy:`${(0,f.toSlug)(n.name)} label`,id:(0,f.toSlug)(n.name),overrideCSS:!0,value:a.value,disabled:l,required:o,onChange:a.onChange}))},S=e=>{let{input:a,meta:r,question:n,isDisabled:l,isRequired:o,maxValues:u}=e,c=s()(e,E);return i().createElement(h.default,t()({},a,c,{id:(0,f.toSlug)(n.name),name:(0,f.toSlug)(n.name),ariaLabelledBy:`${(0,f.toSlug)(n.name)} label`,value:a.value,disabled:l,required:o,onChange:e=>{const t=e.target.value;return u>0&&t.length>u?null:a.onChange(e)}}))},N=e=>e?e=>e?void 0:"Required":()=>{},O=i().forwardRef((({extraQuestions:e,userAnswers:t,onAnswerChanges:a,className:r="questions-form",questionContainerClassName:n="question-container",questionLabelContainerClassName:s="question-label-container",questionControlContainerClassName:o="question-control-container",readOnly:u=!1,debug:d=!1,buttonText:m="Submit",RequiredErrorMessage:p="Required",ValidationErrorClassName:h="extra-question-error",allowExtraQuestionsEdit:v=!0,onError:y=(e=>console.log("form errors: ",e)),shouldScroll2FirstError:_=!0},E)=>{let O=null;const k=(0,l.useRef)({}),x=(0,l.useRef)(null),[P,B]=(0,l.useState)({});(0,l.useEffect)((()=>{L()}),[e]),(0,l.useImperativeHandle)(E,(()=>({doSubmit(){x.current.dispatchEvent(new Event("submit",{cancelable:!0,bubbles:!0}))}})));const L=()=>{const a=new b.default(e,t);B(a.formatAnswers())},j=({when:e,rule:t,children:a})=>i().createElement(g.Field,{name:e,subscription:{value:!0}},(({input:{value:e}})=>R(t,$(e,t),a))),F=({name:e})=>i().createElement(g.Field,{name:e,subscription:{error:!0,touched:!0}},(({meta:{error:e,touched:t}})=>e&&t?i().createElement("div",{className:h},e):null)),$=(e,t)=>{let a=t.answer_values;if(Array.isArray(e)){if(!e.length)return!1;let r="And"===t.answer_values_operator;return a.forEach((a=>{r="And"===t.answer_values_operator?r&&e.includes(parseInt(a)):r||e.includes(parseInt(a))})),r}return a.includes(e.toString())},R=(e,t,a)=>"Visible"===e.visibility?"Equal"===e.visibility_condition?t?a:(delete k.current[e.sub_question.id],null):t?(delete k.current[e.sub_question.id],null):a:"Equal"===e.visibility_condition?t?(delete k.current[e.sub_question.id],null):a:t?a:(delete k.current[e.sub_question.id],null),A=e=>{const t=String.fromCharCode(160),a=document.createElement("div");a.innerHTML=e.label;const r=a.textContent||a.innerText||"",n=e.mandatory?`${r}${t}<b>*</b>`:r;return`<label id="${(0,f.toSlug)(e.name)} label" htmlFor="${(0,f.toSlug)(e.name)}">\n ${n}\n </label>`},D=e=>{let t=e.values;const a=!v&&((e,t)=>{const a=(0,f.toSlug)(e.name);if(!t.hasOwnProperty(a))return!1;const r=t[a];return Array.isArray(r)||"string"==typeof r?r.length>0:"number"==typeof r?r>0:"boolean"==typeof r&&r})(e,P);var r,u,d;if("Text"===e.type)return i().createElement(l.Fragment,{key:(0,f.toSlug)(e.name)},i().createElement("div",{ref:t=>k.current[e.id]=t,className:n},i().createElement(c.default,{className:s},A(e)),i().createElement("div",{className:o},i().createElement(g.Field,{name:(0,f.toSlug)(e.name),question:e,isDisabled:a,isRequired:e.mandatory,validate:N(e.mandatory),component:q}),i().createElement(F,{name:(0,f.toSlug)(e.name)}))),(null===(r=e.sub_question_rules)||void 0===r?void 0:r.length)>0&&e.sub_question_rules.map((t=>i().createElement(j,{key:t.id,when:(0,f.toSlug)(e.name),rule:t},D(t.sub_question)))));if("TextArea"===e.type)return i().createElement(l.Fragment,{key:(0,f.toSlug)(e.name)},i().createElement("div",{ref:t=>k.current[e.id]=t,className:n},i().createElement(c.default,{className:s},A(e)),i().createElement("div",{className:o},i().createElement(g.Field,{validate:N(e.mandatory),name:(0,f.toSlug)(e.name),id:(0,f.toSlug)(e.name),disabled:a,required:e.mandatory,component:"textarea"}),i().createElement(F,{name:(0,f.toSlug)(e.name)}))),(null===(u=e.sub_question_rules)||void 0===u?void 0:u.length)>0&&e.sub_question_rules.map((t=>i().createElement(j,{key:t.id,when:(0,f.toSlug)(e.name),rule:t},D(t.sub_question)))));if("CheckBox"===e.type)return i().createElement(l.Fragment,{key:(0,f.toSlug)(e.name)},i().createElement("div",{ref:t=>k.current[e.id]=t,style:{display:"flex"},className:n},i().createElement(c.default,{className:`eq-checkbox-label ${s}`},A(e)),i().createElement("div",{className:o},i().createElement("div",{className:"form-check abc-checkbox"},i().createElement(g.Field,{name:(0,f.toSlug)(e.name),id:(0,f.toSlug)(e.name),validate:N(e.mandatory),disabled:a,required:e.mandatory,type:"checkbox",className:"form-check-input",component:"input"}),i().createElement("label",{className:"form-check-label",htmlFor:(0,f.toSlug)(e.name)}),i().createElement(F,{name:(0,f.toSlug)(e.name)})))),(null===(d=e.sub_question_rules)||void 0===d?void 0:d.length)>0&&e.sub_question_rules.map((t=>i().createElement(j,{key:t.id,when:(0,f.toSlug)(e.name),rule:t},D(t.sub_question)))));if("RadioButtonList"===e.type){var m;const r=t.map((e=>({label:e.label,value:e.id})));return i().createElement(l.Fragment,{key:(0,f.toSlug)(e.name)},i().createElement("div",{key:(0,f.toSlug)(e.name),ref:t=>k.current[e.id]=t,className:n},i().createElement(c.default,{className:s},A(e)),i().createElement("div",{className:o},i().createElement(g.Field,{name:(0,f.toSlug)(e.name),options:r,question:e,validate:N(e.mandatory),isDisabled:a,isRequired:e.mandatory,component:C}),i().createElement(F,{name:(0,f.toSlug)(e.name)}))),(null===(m=e.sub_question_rules)||void 0===m?void 0:m.length)>0&&e.sub_question_rules.map((t=>i().createElement(j,{key:t.id,when:(0,f.toSlug)(e.name),rule:t},D(t.sub_question)))))}if("ComboBox"===e.type){var p;const r=t.map((e=>({label:e.label,value:e.id})));return i().createElement(l.Fragment,{key:(0,f.toSlug)(e.name)},i().createElement("div",{ref:t=>k.current[e.id]=t,className:n},i().createElement(c.default,{className:s},A(e)),i().createElement("div",{className:o},i().createElement(g.Field,{name:(0,f.toSlug)(e.name),options:r,question:e,validate:N(e.mandatory),isDisabled:a,isRequired:e.mandatory,component:w}),i().createElement(F,{name:(0,f.toSlug)(e.name)}))),(null===(p=e.sub_question_rules)||void 0===p?void 0:p.length)>0&&e.sub_question_rules.map((t=>i().createElement(j,{key:t.id,when:(0,f.toSlug)(e.name),rule:t},D(t.sub_question)))))}if("CheckBoxList"===e.type){var h;const r=t.map((e=>({label:e.label,value:e.id})));return i().createElement(l.Fragment,{key:(0,f.toSlug)(e.name)},i().createElement("div",{ref:t=>k.current[e.id]=t,className:n},i().createElement(c.default,{className:s},A(e)),i().createElement("div",{className:o},i().createElement(g.Field,{name:(0,f.toSlug)(e.name),className:o,validate:N(e.mandatory),options:r,question:e,maxValues:e.max_selected_values,isDisabled:a,isRequired:e.mandatory,component:S}),i().createElement(F,{name:(0,f.toSlug)(e.name)}))),(null===(h=e.sub_question_rules)||void 0===h?void 0:h.length)>0&&e.sub_question_rules.map((t=>i().createElement(j,{key:t.id,when:(0,f.toSlug)(e.name),rule:t},D(t.sub_question)))))}return null},V=(e,t,a)=>{var r;if(e.mandatory&&(e=>!!k.current[e.id])(e)){const r=(0,f.toSlug)(e.name);t.hasOwnProperty((0,f.toSlug)(r))&&""!==t[(0,f.toSlug)(r)]&&0!==t[r].length||(a[r]=p)}null===(r=e.sub_question_rules)||void 0===r||r.forEach((e=>{V(e.sub_question,t,a)}))};if(!Object.keys(P).length)return null;const Q=(e,t,a)=>{var r;t.includes((0,f.toSlug)(e.name))&&a.push(e),null===(r=e.sub_question_rules)||void 0===r||r.forEach((e=>{Q(e.sub_question,t,a)}))},I=t=>{const a=[];return e.forEach((e=>{Q(e,t,a)})),a.sort(((e,t)=>e.order>t.order))[0]};return Object.keys(P).length?i().createElement("div",{className:r},i().createElement(g.Form,{validate:t=>{const a={};return e.forEach((e=>{V(e,t,a)})),a},onSubmit:e=>{a(e)},initialValues:P},(({handleSubmit:t,form:a,submitting:r,pristine:n,values:s})=>(O=t,i().createElement("form",{onSubmit:e=>{const r=a.getRegisteredFields().filter((e=>a.getFieldState(e).invalid));if(r.length>0){const e=I(r);y(r,k.current[e.id]),_&&(e=>{const t=I(e);k.current[t.id].scrollIntoView({behavior:"smooth",block:"center"})})(r)}t(e)},ref:x},u?i().createElement("fieldset",{disabled:"disabled"},e.map((e=>D(e)))):e.map((e=>D(e))),d&&i().createElement("pre",null,JSON.stringify(s,0,2)))))),!E&&i().createElement("button",{type:"submit",onClick:e=>{O(e)},style:{marginTop:10}},m)):null}));O.propTypes={extraQuestions:u().array.isRequired,userAnswers:u().array.isRequired,onAnswerChanges:u().func.isRequired,className:u().string,debug:u().bool,buttonText:u().string,questionContainerClassName:u().string,questionLabelContainerClassName:u().string,questionControlContainerClassName:u().string,RequiredErrorMessage:u().string,ValidationErrorClassName:u().string,allowExtraQuestionsEdit:u().bool,shouldScroll2FirstError:u().bool};const k=O})(),r})()));
1
+ (function webpackUniversalModuleDefinition(root, factory) {
2
+ if(typeof exports === 'object' && typeof module === 'object')
3
+ module.exports = factory();
4
+ else if(typeof define === 'function' && define.amd)
5
+ define("openstack-uicore-foundation", [], factory);
6
+ else if(typeof exports === 'object')
7
+ exports["openstack-uicore-foundation"] = factory();
8
+ else
9
+ root["openstack-uicore-foundation"] = factory();
10
+ })(this, () => {
11
+ return /******/ (() => { // webpackBootstrap
12
+ /******/ "use strict";
13
+ /******/ var __webpack_modules__ = ({
14
+
15
+ /***/ "./src/components/inputs/checkbox-list.js":
16
+ /*!************************************************!*\
17
+ !*** ./src/components/inputs/checkbox-list.js ***!
18
+ \************************************************/
19
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
20
+
21
+ __webpack_require__.r(__webpack_exports__);
22
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
23
+ /* harmony export */ "default": () => (/* binding */ CheckboxList)
24
+ /* harmony export */ });
25
+ /* harmony import */ var _babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/objectWithoutProperties */ "@babel/runtime/helpers/objectWithoutProperties");
26
+ /* harmony import */ var _babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0__);
27
+ /* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "prop-types");
28
+ /* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
29
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ "react");
30
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);
31
+ /* harmony import */ var i18n_react_dist_i18n_react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! i18n-react/dist/i18n-react */ "i18n-react/dist/i18n-react");
32
+ /* harmony import */ var i18n_react_dist_i18n_react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(i18n_react_dist_i18n_react__WEBPACK_IMPORTED_MODULE_3__);
33
+ /* harmony import */ var _raw_html__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../raw-html */ "./src/components/raw-html/index.js");
34
+
35
+ const _excluded = ["onChange", "value", "className", "options", "id", "children", "error", "disabled", "name", "ariaLabelledBy"];
36
+
37
+ /**
38
+ * Copyright 2018 OpenStack Foundation
39
+ * Licensed under the Apache License, Version 2.0 (the "License");
40
+ * you may not use this file except in compliance with the License.
41
+ * You may obtain a copy of the License at
42
+ * http://www.apache.org/licenses/LICENSE-2.0
43
+ * Unless required by applicable law or agreed to in writing, software
44
+ * distributed under the License is distributed on an "AS IS" BASIS,
45
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
46
+ * See the License for the specific language governing permissions and
47
+ * limitations under the License.
48
+ **/
49
+
50
+
51
+
52
+
53
+ class CheckboxList extends (react__WEBPACK_IMPORTED_MODULE_2___default().Component) {
54
+ constructor(props) {
55
+ super(props);
56
+ let otherValue = props.value ? props.value.find(v => !props.options.map(op => op.value).includes(v)) : false;
57
+ this.state = {
58
+ otherChecked: !!otherValue
59
+ };
60
+ this.handleChange = this.handleChange.bind(this);
61
+ this.handleOtherCBChange = this.handleOtherCBChange.bind(this);
62
+ }
63
+
64
+ handleChange(event) {
65
+ let optionValues = this.props.options.map(op => op.value);
66
+ let value = this.props.value ? [...this.props.value] : [];
67
+
68
+ if (event.target.type === 'checkbox') {
69
+ if (event.target.checked) {
70
+ const theVal = isNaN(event.target.value) ? event.target.value : parseInt(event.target.value);
71
+ value.push(theVal);
72
+ } else {
73
+ value = value.filter(v => v != event.target.value);
74
+ }
75
+ } else {
76
+ value = value.filter(v => optionValues.includes(v));
77
+ value.push(event.target.value);
78
+ }
79
+
80
+ let ev = {
81
+ target: {
82
+ id: this.props.id,
83
+ value: value,
84
+ type: 'checkboxlist'
85
+ }
86
+ };
87
+ this.props.onChange(ev);
88
+ }
89
+
90
+ handleOtherCBChange(event) {
91
+ this.setState({
92
+ otherChecked: event.target.checked
93
+ });
94
+ }
95
+
96
+ render() {
97
+ let _this$props = this.props,
98
+ {
99
+ onChange,
100
+ value,
101
+ className,
102
+ options,
103
+ id,
104
+ children,
105
+ error,
106
+ disabled,
107
+ name,
108
+ ariaLabelledBy
109
+ } = _this$props,
110
+ rest = _babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0___default()(_this$props, _excluded);
111
+
112
+ let {
113
+ otherChecked
114
+ } = this.state;
115
+ let inline = this.props.hasOwnProperty('inline');
116
+ let html = this.props.hasOwnProperty('html');
117
+ let allowOther = this.props.hasOwnProperty('allowOther');
118
+ let otherValue = value ? value.find(v => !options.map(op => op.value).includes(v)) : false;
119
+ let has_error = this.props.hasOwnProperty('error') && error !== '';
120
+ let isDisabled = this.props.hasOwnProperty('disabled') && disabled == true;
121
+ let style, label;
122
+
123
+ if (inline) {
124
+ style = {
125
+ paddingLeft: '22px',
126
+ marginLeft: '20px',
127
+ float: 'left'
128
+ };
129
+ } else {
130
+ style = {
131
+ paddingLeft: '22px',
132
+ marginTop: '7px'
133
+ };
134
+ }
135
+
136
+ return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement("div", {
137
+ id: `chl_wrapper_${id}`,
138
+ "aria-labelledby": ariaLabelledBy
139
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement("div", {
140
+ className: "checkboxes-div" + (has_error ? ' error' : '')
141
+ }, options.map(op => {
142
+ let checked = value ? value.includes(op.value) : false;
143
+ return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement("div", {
144
+ className: "form-check abc-checkbox",
145
+ key: "radio_key_" + op.value,
146
+ style: style
147
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement("input", {
148
+ type: "checkbox",
149
+ id: `cb_${id}_${op.value}`,
150
+ name: name ? name : id,
151
+ checked: checked,
152
+ disabled: isDisabled,
153
+ onChange: this.handleChange,
154
+ className: "form-check-input",
155
+ value: op.value
156
+ }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement("label", {
157
+ className: "form-check-label",
158
+ htmlFor: `cb_${id}_${op.value}`
159
+ }, html && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement(_raw_html__WEBPACK_IMPORTED_MODULE_4__["default"], null, op.label), !html && op.label));
160
+ }), allowOther && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement("div", {
161
+ className: "form-check abc-checkbox",
162
+ style: style
163
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement("input", {
164
+ type: "checkbox",
165
+ id: "cb_other" + id,
166
+ checked: otherChecked,
167
+ disabled: isDisabled,
168
+ onChange: this.handleOtherCBChange,
169
+ className: "form-check-input",
170
+ value: "other"
171
+ }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement("label", {
172
+ className: "form-check-label",
173
+ htmlFor: "cb_other" + id
174
+ }, i18n_react_dist_i18n_react__WEBPACK_IMPORTED_MODULE_3___default().translate("general.other"))), allowOther && otherChecked && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement("div", {
175
+ style: {
176
+ paddingLeft: '22px',
177
+ width: '50%'
178
+ }
179
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement("input", {
180
+ className: "form-control",
181
+ disabled: isDisabled,
182
+ onChange: this.handleChange,
183
+ value: otherValue
184
+ }))), has_error && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement("p", {
185
+ className: "error-label"
186
+ }, error));
187
+ }
188
+
189
+ }
190
+ CheckboxList.defaultProps = {
191
+ ariaLabelledBy: null
192
+ };
193
+ CheckboxList.propTypes = {
194
+ id: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string.isRequired)
195
+ };
196
+
197
+ /***/ }),
198
+
199
+ /***/ "./src/components/inputs/dropdown.js":
200
+ /*!*******************************************!*\
201
+ !*** ./src/components/inputs/dropdown.js ***!
202
+ \*******************************************/
203
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
204
+
205
+ __webpack_require__.r(__webpack_exports__);
206
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
207
+ /* harmony export */ "default": () => (/* binding */ Dropdown)
208
+ /* harmony export */ });
209
+ /* harmony import */ var _babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/extends */ "@babel/runtime/helpers/extends");
210
+ /* harmony import */ var _babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0__);
211
+ /* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "@babel/runtime/helpers/defineProperty");
212
+ /* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__);
213
+ /* harmony import */ var _babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/objectWithoutProperties */ "@babel/runtime/helpers/objectWithoutProperties");
214
+ /* harmony import */ var _babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_2__);
215
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "react");
216
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__);
217
+ /* harmony import */ var react_select__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react-select */ "react-select");
218
+ /* harmony import */ var react_select__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(react_select__WEBPACK_IMPORTED_MODULE_4__);
219
+
220
+
221
+
222
+ const _excluded = ["onChange", "value", "className", "error", "clearable", "disabled", "overrideCSS", "ariaLabelledBy"];
223
+
224
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
225
+
226
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1___default()(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
227
+
228
+ /**
229
+ * Copyright 2017 OpenStack Foundation
230
+ * Licensed under the Apache License, Version 2.0 (the "License");
231
+ * you may not use this file except in compliance with the License.
232
+ * You may obtain a copy of the License at
233
+ * http://www.apache.org/licenses/LICENSE-2.0
234
+ * Unless required by applicable law or agreed to in writing, software
235
+ * distributed under the License is distributed on an "AS IS" BASIS,
236
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
237
+ * See the License for the specific language governing permissions and
238
+ * limitations under the License.
239
+ **/
240
+
241
+
242
+ class Dropdown extends (react__WEBPACK_IMPORTED_MODULE_3___default().Component) {
243
+ constructor(props) {
244
+ super(props);
245
+ this.handleChange = this.handleChange.bind(this);
246
+ }
247
+
248
+ handleChange(selection) {
249
+ let value = null;
250
+
251
+ if (this.props.isMulti) {
252
+ value = selection ? selection.map(val => val.value) : null;
253
+ } else {
254
+ value = selection ? selection.value : null;
255
+ }
256
+
257
+ let ev = {
258
+ target: {
259
+ id: this.props.id,
260
+ value: value,
261
+ type: 'dropdown'
262
+ }
263
+ };
264
+ this.props.onChange(ev);
265
+ }
266
+
267
+ render() {
268
+ let _this$props = this.props,
269
+ {
270
+ onChange,
271
+ value,
272
+ className,
273
+ error,
274
+ clearable,
275
+ disabled,
276
+ overrideCSS,
277
+ ariaLabelledBy
278
+ } = _this$props,
279
+ rest = _babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_2___default()(_this$props, _excluded);
280
+
281
+ let has_error = this.props.hasOwnProperty('error') && error != '';
282
+ let isClearable = this.props.hasOwnProperty('clearable');
283
+ let isDisabled = this.props.hasOwnProperty('disabled') && disabled == true;
284
+ let theValue = null;
285
+ let selectClassName = className;
286
+
287
+ if (!this.props.hasOwnProperty('overrideCSS') || overrideCSS == false) {
288
+ selectClassName = 'dropdown ' + className + ' ' + (has_error ? 'error' : '');
289
+ }
290
+
291
+ if (this.props.isMulti) {
292
+ theValue = this.props.options.filter(op => value.includes(op.value));
293
+ } else {
294
+ theValue = value instanceof Object || value == null ? value : this.props.options.find(opt => opt.value == value);
295
+ }
296
+
297
+ const selectStyles = {
298
+ menu: styles => _objectSpread(_objectSpread({}, styles), {}, {
299
+ zIndex: 999
300
+ })
301
+ };
302
+ return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default().createElement("div", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default().createElement((react_select__WEBPACK_IMPORTED_MODULE_4___default()), _babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0___default()({
303
+ className: selectClassName,
304
+ value: theValue,
305
+ onChange: this.handleChange,
306
+ isClearable: isClearable,
307
+ isDisabled: isDisabled,
308
+ styles: selectStyles,
309
+ "aria-labelledby": ariaLabelledBy
310
+ }, rest)), has_error && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default().createElement("p", {
311
+ className: "error-label"
312
+ }, error));
313
+ }
314
+
315
+ }
316
+ Dropdown.defaultProps = {
317
+ ariaLabelledBy: null
318
+ };
319
+
320
+ /***/ }),
321
+
322
+ /***/ "./src/components/inputs/radio-list.js":
323
+ /*!*********************************************!*\
324
+ !*** ./src/components/inputs/radio-list.js ***!
325
+ \*********************************************/
326
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
327
+
328
+ __webpack_require__.r(__webpack_exports__);
329
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
330
+ /* harmony export */ "default": () => (/* binding */ RadioList)
331
+ /* harmony export */ });
332
+ /* harmony import */ var _babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/objectWithoutProperties */ "@babel/runtime/helpers/objectWithoutProperties");
333
+ /* harmony import */ var _babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0__);
334
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "react");
335
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
336
+ /* harmony import */ var _raw_html__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../raw-html */ "./src/components/raw-html/index.js");
337
+ /* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ "prop-types");
338
+ /* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);
339
+
340
+ const _excluded = ["onChange", "value", "className", "error", "ariaLabelledBy", "disabled", "options", "id", "name"];
341
+
342
+ /**
343
+ * Copyright 2018 OpenStack Foundation
344
+ * Licensed under the Apache License, Version 2.0 (the "License");
345
+ * you may not use this file except in compliance with the License.
346
+ * You may obtain a copy of the License at
347
+ * http://www.apache.org/licenses/LICENSE-2.0
348
+ * Unless required by applicable law or agreed to in writing, software
349
+ * distributed under the License is distributed on an "AS IS" BASIS,
350
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
351
+ * See the License for the specific language governing permissions and
352
+ * limitations under the License.
353
+ **/
354
+
355
+
356
+
357
+ class RadioList extends (react__WEBPACK_IMPORTED_MODULE_1___default().Component) {
358
+ constructor(props) {
359
+ super(props);
360
+ this.state = {
361
+ value: props.value
362
+ };
363
+ this.handleChange = this.handleChange.bind(this);
364
+ }
365
+
366
+ handleChange(selection) {
367
+ let ev = {
368
+ target: {
369
+ id: this.props.id,
370
+ value: selection.target.value,
371
+ type: 'radio'
372
+ }
373
+ };
374
+ this.props.onChange(ev);
375
+ }
376
+
377
+ getLabel(option, id, inline, simple, html) {
378
+ if (inline) {
379
+ return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement("label", {
380
+ className: "form-check-label",
381
+ htmlFor: `radio_${id}_${option.value}`,
382
+ style: {
383
+ display: 'inline-block'
384
+ }
385
+ }, html && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_raw_html__WEBPACK_IMPORTED_MODULE_2__["default"], null, option.label), !html && option.label);
386
+ } else if (simple) {
387
+ return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement("label", {
388
+ className: "form-check-label",
389
+ htmlFor: `radio_${id}_${option.value}`
390
+ }, option.label);
391
+ } else {
392
+ return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement("label", {
393
+ className: "form-check-label",
394
+ htmlFor: `radio_${id}_${option.value}`,
395
+ style: {
396
+ display: 'inline-block'
397
+ }
398
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement("h4", {
399
+ style: {
400
+ marginTop: '0px'
401
+ }
402
+ }, option.label), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_raw_html__WEBPACK_IMPORTED_MODULE_2__["default"], null, option.description));
403
+ }
404
+ }
405
+
406
+ render() {
407
+ let _this$props = this.props,
408
+ {
409
+ onChange,
410
+ value,
411
+ className,
412
+ error,
413
+ ariaLabelledBy,
414
+ disabled,
415
+ options,
416
+ id,
417
+ name
418
+ } = _this$props,
419
+ rest = _babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0___default()(_this$props, _excluded);
420
+
421
+ let has_error = this.props.hasOwnProperty('error') && error != '';
422
+ let inline = this.props.hasOwnProperty('inline');
423
+ let simple = this.props.hasOwnProperty('simple');
424
+ let html = this.props.hasOwnProperty('html');
425
+ let isDisabled = this.props.hasOwnProperty('disabled') && disabled == true;
426
+ let style, label;
427
+
428
+ if (inline) {
429
+ style = {
430
+ paddingLeft: '22px',
431
+ marginLeft: '20px',
432
+ float: 'left'
433
+ };
434
+ } else {
435
+ style = {
436
+ paddingLeft: '22px'
437
+ };
438
+ }
439
+
440
+ return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", {
441
+ id: `rl_wrapper_${id}`,
442
+ "aria-labelledby": ariaLabelledBy
443
+ }, options.map(op => {
444
+ let checked = op.value == value;
445
+ return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", {
446
+ className: "form-check abc-radio",
447
+ key: `radio_key_${id}_${op.value}`,
448
+ style: style
449
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement("input", {
450
+ className: "form-check-input",
451
+ type: "radio",
452
+ id: `radio_${id}_${op.value}`,
453
+ value: op.value,
454
+ checked: checked,
455
+ onChange: this.handleChange,
456
+ disabled: isDisabled,
457
+ name: name ? name : `radio_${id}`
458
+ }), this.getLabel(op, id, inline, simple, html));
459
+ }), has_error && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement("p", {
460
+ className: "error-label"
461
+ }, error));
462
+ }
463
+
464
+ }
465
+ RadioList.defaultProps = {
466
+ ariaLabelledBy: null
467
+ };
468
+ RadioList.propTypes = {
469
+ id: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string.isRequired)
470
+ };
471
+
472
+ /***/ }),
473
+
474
+ /***/ "./src/components/inputs/text-input.js":
475
+ /*!*********************************************!*\
476
+ !*** ./src/components/inputs/text-input.js ***!
477
+ \*********************************************/
478
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
479
+
480
+ __webpack_require__.r(__webpack_exports__);
481
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
482
+ /* harmony export */ "default": () => (/* binding */ Input)
483
+ /* harmony export */ });
484
+ /* harmony import */ var _babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/extends */ "@babel/runtime/helpers/extends");
485
+ /* harmony import */ var _babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0__);
486
+ /* harmony import */ var _babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/objectWithoutProperties */ "@babel/runtime/helpers/objectWithoutProperties");
487
+ /* harmony import */ var _babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__);
488
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ "react");
489
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);
490
+
491
+
492
+ const _excluded = ["onChange", "value", "className", "error", "ariaLabelledBy", "containerClassName"];
493
+
494
+ /**
495
+ * Copyright 2017 OpenStack Foundation
496
+ * Licensed under the Apache License, Version 2.0 (the "License");
497
+ * you may not use this file except in compliance with the License.
498
+ * You may obtain a copy of the License at
499
+ * http://www.apache.org/licenses/LICENSE-2.0
500
+ * Unless required by applicable law or agreed to in writing, software
501
+ * distributed under the License is distributed on an "AS IS" BASIS,
502
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
503
+ * See the License for the specific language governing permissions and
504
+ * limitations under the License.
505
+ **/
506
+
507
+ class Input extends (react__WEBPACK_IMPORTED_MODULE_2___default().Component) {
508
+ constructor(props) {
509
+ super(props);
510
+ this.handleChange = this.handleChange.bind(this);
511
+ }
512
+
513
+ componentDidUpdate(prevProps, prevState, snapshot) {
514
+ if (this.props.value !== prevProps.value) {
515
+ this.input.value = this.props.value;
516
+ }
517
+ }
518
+
519
+ handleChange(ev) {
520
+ this.props.onChange(ev);
521
+ }
522
+
523
+ render() {
524
+ let _this$props = this.props,
525
+ {
526
+ onChange,
527
+ value,
528
+ className,
529
+ error,
530
+ ariaLabelledBy,
531
+ containerClassName
532
+ } = _this$props,
533
+ rest = _babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1___default()(_this$props, _excluded);
534
+
535
+ let has_error = this.props.hasOwnProperty('error') && error !== '';
536
+ let class_name = this.props.hasOwnProperty('className') ? className : 'form-control';
537
+ let container_class_name = this.props.hasOwnProperty('containerClassName') ? containerClassName : 'container-form-control';
538
+ return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement("div", {
539
+ className: container_class_name
540
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement("input", _babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0___default()({
541
+ className: `${class_name} ${has_error ? 'error' : ''}`,
542
+ ref: node => {
543
+ this.input = node;
544
+ },
545
+ defaultValue: value,
546
+ "aria-labelledby": ariaLabelledBy,
547
+ onChange: this.handleChange
548
+ }, rest)), has_error && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement("p", {
549
+ className: "error-label"
550
+ }, error));
551
+ }
552
+
553
+ }
554
+ Input.defaultProps = {
555
+ ariaLabelledBy: null
556
+ };
557
+
558
+ /***/ }),
559
+
560
+ /***/ "./src/components/raw-html/index.js":
561
+ /*!******************************************!*\
562
+ !*** ./src/components/raw-html/index.js ***!
563
+ \******************************************/
564
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
565
+
566
+ __webpack_require__.r(__webpack_exports__);
567
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
568
+ /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
569
+ /* harmony export */ });
570
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react");
571
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
572
+
573
+
574
+ const RawHTML = ({
575
+ children,
576
+ replaceNewLine = false,
577
+ className = ""
578
+ }) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", {
579
+ className: className,
580
+ dangerouslySetInnerHTML: {
581
+ __html: replaceNewLine ? children === null || children === void 0 ? void 0 : children.replace(/\n/g, '<br />') : children
582
+ }
583
+ });
584
+
585
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (RawHTML);
586
+
587
+ /***/ }),
588
+
589
+ /***/ "./src/utils/methods.js":
590
+ /*!******************************!*\
591
+ !*** ./src/utils/methods.js ***!
592
+ \******************************/
593
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
594
+
595
+ __webpack_require__.r(__webpack_exports__);
596
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
597
+ /* harmony export */ "arraysEqual": () => (/* binding */ arraysEqual),
598
+ /* harmony export */ "base64URLEncode": () => (/* binding */ base64URLEncode),
599
+ /* harmony export */ "buildAPIBaseUrl": () => (/* binding */ buildAPIBaseUrl),
600
+ /* harmony export */ "epochToMoment": () => (/* binding */ epochToMoment),
601
+ /* harmony export */ "epochToMomentTimeZone": () => (/* binding */ epochToMomentTimeZone),
602
+ /* harmony export */ "findElementPos": () => (/* binding */ findElementPos),
603
+ /* harmony export */ "formatEpoch": () => (/* binding */ formatEpoch),
604
+ /* harmony export */ "getAllowedUserGroups": () => (/* binding */ getAllowedUserGroups),
605
+ /* harmony export */ "getAuthCallback": () => (/* binding */ getAuthCallback),
606
+ /* harmony export */ "getBackURL": () => (/* binding */ getBackURL),
607
+ /* harmony export */ "getCurrentHref": () => (/* binding */ getCurrentHref),
608
+ /* harmony export */ "getCurrentLocation": () => (/* binding */ getCurrentLocation),
609
+ /* harmony export */ "getCurrentPathName": () => (/* binding */ getCurrentPathName),
610
+ /* harmony export */ "getCurrentUserLanguage": () => (/* binding */ getCurrentUserLanguage),
611
+ /* harmony export */ "getFromLocalStorage": () => (/* binding */ getFromLocalStorage),
612
+ /* harmony export */ "getOrigin": () => (/* binding */ getOrigin),
613
+ /* harmony export */ "getTimeServiceUrl": () => (/* binding */ getTimeServiceUrl),
614
+ /* harmony export */ "hasErrors": () => (/* binding */ hasErrors),
615
+ /* harmony export */ "isClearingSessionState": () => (/* binding */ isClearingSessionState),
616
+ /* harmony export */ "isEmpty": () => (/* binding */ isEmpty),
617
+ /* harmony export */ "objectToQueryString": () => (/* binding */ objectToQueryString),
618
+ /* harmony export */ "putOnLocalStorage": () => (/* binding */ putOnLocalStorage),
619
+ /* harmony export */ "removeFromLocalStorage": () => (/* binding */ removeFromLocalStorage),
620
+ /* harmony export */ "retryPromise": () => (/* binding */ retryPromise),
621
+ /* harmony export */ "scrollToError": () => (/* binding */ scrollToError),
622
+ /* harmony export */ "setSessionClearingState": () => (/* binding */ setSessionClearingState),
623
+ /* harmony export */ "shallowEqual": () => (/* binding */ shallowEqual),
624
+ /* harmony export */ "toSlug": () => (/* binding */ toSlug)
625
+ /* harmony export */ });
626
+ /* harmony import */ var moment_timezone__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! moment-timezone */ "moment-timezone");
627
+ /* harmony import */ var moment_timezone__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(moment_timezone__WEBPACK_IMPORTED_MODULE_0__);
628
+ /* harmony import */ var urijs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! urijs */ "urijs");
629
+ /* harmony import */ var urijs__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(urijs__WEBPACK_IMPORTED_MODULE_1__);
630
+ /**
631
+ * Copyright 2018 OpenStack Foundation
632
+ * Licensed under the Apache License, Version 2.0 (the "License");
633
+ * you may not use this file except in compliance with the License.
634
+ * You may obtain a copy of the License at
635
+ * http://www.apache.org/licenses/LICENSE-2.0
636
+ * Unless required by applicable law or agreed to in writing, software
637
+ * distributed under the License is distributed on an "AS IS" BASIS,
638
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
639
+ * See the License for the specific language governing permissions and
640
+ * limitations under the License.
641
+ **/
642
+
643
+
644
+ const findElementPos = obj => {
645
+ var curtop = -70;
646
+
647
+ if (obj.offsetParent) {
648
+ do {
649
+ curtop += obj.offsetTop;
650
+ } while (obj = obj.offsetParent);
651
+
652
+ return [curtop];
653
+ }
654
+ };
655
+ const epochToMoment = atime => {
656
+ if (!atime) return atime;
657
+ atime = atime * 1000;
658
+ return moment_timezone__WEBPACK_IMPORTED_MODULE_0___default()(atime);
659
+ };
660
+ const epochToMomentTimeZone = (atime, time_zone) => {
661
+ if (!atime) return atime;
662
+ atime = atime * 1000;
663
+ return moment_timezone__WEBPACK_IMPORTED_MODULE_0___default()(atime).tz(time_zone);
664
+ };
665
+ const formatEpoch = (atime, format = 'M/D/YYYY h:mm a') => {
666
+ if (!atime) return atime;
667
+ return epochToMoment(atime).format(format);
668
+ };
669
+ const objectToQueryString = obj => {
670
+ var str = "";
671
+
672
+ for (var key in obj) {
673
+ if (str != "") {
674
+ str += "&";
675
+ }
676
+
677
+ str += key + "=" + encodeURIComponent(obj[key]);
678
+ }
679
+
680
+ return str;
681
+ };
682
+ const getBackURL = () => {
683
+ let url = urijs__WEBPACK_IMPORTED_MODULE_1___default()(window.location.href);
684
+ let query = url.search(true);
685
+ let fragment = url.fragment();
686
+ let backUrl = query.hasOwnProperty('BackUrl') ? query['BackUrl'] : null;
687
+
688
+ if (fragment != null && fragment != '') {
689
+ backUrl += `#${fragment}`;
690
+ }
691
+
692
+ return backUrl;
693
+ };
694
+ const toSlug = text => {
695
+ text = text.toLowerCase();
696
+ return text.replace(/[^a-zA-Z0-9]+/g, '_');
697
+ };
698
+ const getAuthCallback = () => {
699
+ if (typeof window !== 'undefined') {
700
+ return `${window.location.origin}/auth/callback`;
701
+ }
702
+
703
+ return null;
704
+ };
705
+ const getCurrentLocation = () => {
706
+ let location = '';
707
+
708
+ if (typeof window !== 'undefined') {
709
+ location = window.location; // check if we are on iframe
710
+
711
+ if (window.top) location = window.top.location;
712
+ }
713
+
714
+ return location;
715
+ };
716
+ const getOrigin = () => {
717
+ if (typeof window !== 'undefined') {
718
+ return window.location.origin;
719
+ }
720
+
721
+ return null;
722
+ };
723
+ const getCurrentPathName = () => {
724
+ if (typeof window !== 'undefined') {
725
+ return window.location.pathname;
726
+ }
727
+
728
+ return null;
729
+ };
730
+ const getCurrentHref = () => {
731
+ if (typeof window !== 'undefined') {
732
+ return window.location.href;
733
+ }
734
+
735
+ return null;
736
+ };
737
+ const getAllowedUserGroups = () => {
738
+ if (typeof window !== 'undefined') {
739
+ return window.ALLOWED_USER_GROUPS || '';
740
+ }
741
+
742
+ return null;
743
+ };
744
+ const buildAPIBaseUrl = relativeUrl => {
745
+ if (typeof window !== 'undefined') {
746
+ return `${window.API_BASE_URL}${relativeUrl}`;
747
+ }
748
+
749
+ return null``;
750
+ };
751
+ const putOnLocalStorage = (key, value) => {
752
+ if (typeof window !== 'undefined') {
753
+ window.localStorage.setItem(key, value);
754
+ }
755
+ };
756
+ const getFromLocalStorage = (key, removeIt) => {
757
+ if (typeof window !== 'undefined') {
758
+ let val = window.localStorage.getItem(key);
759
+
760
+ if (removeIt) {
761
+ console.log(`getFromLocalStorage removing key ${key}`);
762
+ removeFromLocalStorage(key);
763
+ }
764
+
765
+ return val;
766
+ }
767
+
768
+ return null;
769
+ };
770
+ const removeFromLocalStorage = key => {
771
+ if (typeof window !== 'undefined') {
772
+ window.localStorage.removeItem(key);
773
+ }
774
+ };
775
+ const isClearingSessionState = () => {
776
+ if (typeof window !== 'undefined') {
777
+ return window.clearing_session_state;
778
+ }
779
+
780
+ return false;
781
+ };
782
+ const setSessionClearingState = val => {
783
+ if (typeof window !== 'undefined') {
784
+ window.clearing_session_state = val;
785
+ }
786
+ };
787
+ const getCurrentUserLanguage = () => {
788
+ let language = 'en';
789
+
790
+ if (typeof navigator !== 'undefined') {
791
+ language = navigator.languages && navigator.languages[0] || navigator.language || navigator.userLanguage;
792
+ }
793
+
794
+ return language;
795
+ };
796
+ const scrollToError = errors => {
797
+ if (Object.keys(errors).length > 0) {
798
+ const firstError = Object.keys(errors)[0];
799
+ const firstNode = document.getElementById(firstError);
800
+ if (firstNode) window.scrollTo(0, findElementPos(firstNode));
801
+ }
802
+ };
803
+ const hasErrors = (field, errors) => {
804
+ if (field in errors) {
805
+ return errors[field];
806
+ }
807
+
808
+ return '';
809
+ };
810
+ const shallowEqual = (object1, object2) => {
811
+ const keys1 = Object.keys(object1);
812
+ const keys2 = Object.keys(object2);
813
+
814
+ if (keys1.length !== keys2.length) {
815
+ return false;
816
+ }
817
+
818
+ for (let key of keys1) {
819
+ if (object1[key] !== object2[key]) {
820
+ return false;
821
+ }
822
+ }
823
+
824
+ return true;
825
+ };
826
+ const arraysEqual = (a1, a2) => a1.length === a2.length && a1.every((o, idx) => shallowEqual(o, a2[idx]));
827
+ const isEmpty = obj => {
828
+ return Object.keys(obj).length === 0;
829
+ };
830
+ const base64URLEncode = str => {
831
+ return str.toString('base64').replace(/\+/g, '-').replace(/\//g, '_').replace(/=/g, '');
832
+ };
833
+ const retryPromise = async (cb, maxNumberOfRetries = 3) => {
834
+ for (let i = 0; i < maxNumberOfRetries; i++) {
835
+ if (await cb()) {
836
+ return true;
837
+ }
838
+ }
839
+
840
+ return false;
841
+ };
842
+ const getTimeServiceUrl = () => {
843
+ if (typeof window !== 'undefined') {
844
+ return window.TIMEINTERVALSINCE1970_API_URL || process.env.TIMEINTERVALSINCE1970_API_URL;
845
+ }
846
+
847
+ return null;
848
+ };
849
+
850
+ /***/ }),
851
+
852
+ /***/ "./src/utils/questions-set.js":
853
+ /*!************************************!*\
854
+ !*** ./src/utils/questions-set.js ***!
855
+ \************************************/
856
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
857
+
858
+ __webpack_require__.r(__webpack_exports__);
859
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
860
+ /* harmony export */ "AllowedMultipleValueQuestionType": () => (/* binding */ AllowedMultipleValueQuestionType),
861
+ /* harmony export */ "AnswerValuesOperator_And": () => (/* binding */ AnswerValuesOperator_And),
862
+ /* harmony export */ "AnswerValuesOperator_Or": () => (/* binding */ AnswerValuesOperator_Or),
863
+ /* harmony export */ "CheckBoxListQuestionType": () => (/* binding */ CheckBoxListQuestionType),
864
+ /* harmony export */ "CheckBoxQuestionType": () => (/* binding */ CheckBoxQuestionType),
865
+ /* harmony export */ "ComboBoxQuestionType": () => (/* binding */ ComboBoxQuestionType),
866
+ /* harmony export */ "MainQuestionClassType": () => (/* binding */ MainQuestionClassType),
867
+ /* harmony export */ "RadioButtonListQuestionType": () => (/* binding */ RadioButtonListQuestionType),
868
+ /* harmony export */ "VisibilityCondition_Equal": () => (/* binding */ VisibilityCondition_Equal),
869
+ /* harmony export */ "VisibilityCondition_NotEqual": () => (/* binding */ VisibilityCondition_NotEqual),
870
+ /* harmony export */ "Visibility_Visible": () => (/* binding */ Visibility_Visible),
871
+ /* harmony export */ "default": () => (/* binding */ QuestionsSet)
872
+ /* harmony export */ });
873
+ /* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "@babel/runtime/helpers/defineProperty");
874
+ /* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__);
875
+ /* harmony import */ var _methods__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./methods */ "./src/utils/methods.js");
876
+
877
+
878
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
879
+
880
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default()(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
881
+
882
+ const CheckBoxQuestionType = 'CheckBox';
883
+ const ComboBoxQuestionType = 'ComboBox';
884
+ const CheckBoxListQuestionType = 'CheckBoxList';
885
+ const RadioButtonListQuestionType = 'RadioButtonList';
886
+ const AllowedMultipleValueQuestionType = [ComboBoxQuestionType, CheckBoxListQuestionType, RadioButtonListQuestionType];
887
+ const AnswerValuesOperator_And = 'And';
888
+ const AnswerValuesOperator_Or = 'Or';
889
+ const VisibilityCondition_Equal = 'Equal';
890
+ const VisibilityCondition_NotEqual = 'NotEqual';
891
+ const Visibility_Visible = 'Visible';
892
+ const MainQuestionClassType = 'MainQuestion';
893
+
894
+ class QuestionsSet {
895
+ constructor(questions, answers = []) {
896
+ _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default()(this, "_parseQuestion", q => {
897
+ this.questionByName[(0,_methods__WEBPACK_IMPORTED_MODULE_1__.toSlug)(q.name)] = q;
898
+ this.questionById[parseInt(q.id)] = q;
899
+ if (q.hasOwnProperty('sub_question_rules')) for (let r of q.sub_question_rules) {
900
+ this.rules[parseInt(r.id)] = r;
901
+
902
+ this._parseQuestion(r.sub_question);
903
+ }
904
+ });
905
+
906
+ _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default()(this, "_parseQuestions", () => {
907
+ for (let q of this.questions) {
908
+ this._parseQuestion(q);
909
+ }
910
+ });
911
+
912
+ _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default()(this, "_allowsValues", q => {
913
+ return AllowedMultipleValueQuestionType.includes(q.type);
914
+ });
915
+
916
+ _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default()(this, "_allowsValue", (q, answer) => {
917
+ let value = answer.value.split(',').map(v => parseInt(v));
918
+
919
+ for (let av of value) {
920
+ if (!q.values.map(e => e.id).includes(av)) return false;
921
+ }
922
+
923
+ return true;
924
+ });
925
+
926
+ _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default()(this, "_getAnswerFor", q => {
927
+ let id = Number.isInteger(q) ? q : q.id;
928
+ let a = this.answers[id] || null;
929
+ return a ? a : null;
930
+ });
931
+
932
+ _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default()(this, "_hasValue", answer => {
933
+ return answer.value !== '';
934
+ });
935
+
936
+ _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default()(this, "_answerContains", (answer, val) => {
937
+ return answer.value.split(',').includes(val);
938
+ });
939
+
940
+ _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default()(this, "_isSubQuestionVisible", rule => {
941
+ let initialCondition = rule.answer_values_operator === AnswerValuesOperator_And ? true : false;
942
+
943
+ const parentQuestionAnswer = this._getAnswerFor(rule.parent_question_id);
944
+
945
+ if (!parentQuestionAnswer) {
946
+ initialCondition = rule.visibility_condition === VisibilityCondition_Equal ? false : true;
947
+ } else {
948
+ switch (rule.visibility_condition) {
949
+ case VisibilityCondition_Equal:
950
+ {
951
+ for (let answerValue of rule.answer_values) {
952
+ if (rule.answer_values_operator === AnswerValuesOperator_And) initialCondition = initialCondition && this._answerContains(parentQuestionAnswer, answerValue);else initialCondition = initialCondition || this._answerContains(parentQuestionAnswer, answerValue);
953
+ }
954
+ }
955
+ break;
956
+
957
+ case VisibilityCondition_NotEqual:
958
+ {
959
+ for (let answerValue of rule.answer_values) {
960
+ if (rule.answer_values_operator === AnswerValuesOperator_And) initialCondition = initialCondition && !this._answerContains(parentQuestionAnswer, answerValue);else initialCondition = initialCondition || !this._answerContains(parentQuestionAnswer, answerValue);
961
+ }
962
+ }
963
+ break;
964
+ }
965
+ } // final visibility check
966
+
967
+
968
+ if (rule.visibility === Visibility_Visible) {
969
+ return initialCondition;
970
+ } // not visible
971
+
972
+
973
+ return !initialCondition;
974
+ });
975
+
976
+ _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default()(this, "_isAnswered", q => {
977
+ const answer = this._getAnswerFor(q);
978
+
979
+ if (q.class === MainQuestionClassType) {
980
+ if (!q.mandatory) return true;
981
+ if (!answer) return false;
982
+ if (!this._hasValue(answer)) return false;
983
+ if (this._allowsValues(q) && !this._allowsValue(q, answer)) return false;
984
+ return true;
985
+ } // check parent rules ...
986
+
987
+
988
+ for (let ruleId of q.parent_rules) {
989
+ if (!this._isSubQuestionVisible(this.rules[ruleId])) // if question is not visible skip it
990
+ continue;
991
+ if (!q.mandatory) return true;
992
+ if (!answer) return false;
993
+ if (!this._hasValue(answer)) return false;
994
+ if (this._allowsValues(q) && !this._allowsValue(q, answer)) return false;
995
+ return true;
996
+ }
997
+
998
+ return true;
999
+ });
1000
+
1001
+ _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default()(this, "_checkQuestion", q => {
1002
+ let res = this._isAnswered(q);
1003
+
1004
+ if (q.hasOwnProperty('sub_question_rules')) for (let rule of q.sub_question_rules) {
1005
+ // check recursive all the tree till leaves ...
1006
+ res = res && this._checkQuestion(rule.sub_question);
1007
+ }
1008
+ return res;
1009
+ });
1010
+
1011
+ _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default()(this, "_formatQuestionAnswer", question => {
1012
+ var _this$originalAnswers;
1013
+
1014
+ let res = {};
1015
+ const slug = (0,_methods__WEBPACK_IMPORTED_MODULE_1__.toSlug)(question.name);
1016
+ let userAnswer = (_this$originalAnswers = this.originalAnswers.find(a => a.question_id === question.id)) === null || _this$originalAnswers === void 0 ? void 0 : _this$originalAnswers.value;
1017
+
1018
+ if (userAnswer) {
1019
+ if (question.type === CheckBoxQuestionType) userAnswer = userAnswer === 'false' ? false : !!userAnswer;
1020
+ if (question.type === RadioButtonListQuestionType || question.type === ComboBoxQuestionType) userAnswer = parseInt(userAnswer);
1021
+ if (question.type === CheckBoxListQuestionType) userAnswer = userAnswer.split(',').map(ansVal => parseInt(ansVal)) || [];
1022
+ }
1023
+
1024
+ res[slug] = userAnswer || '';
1025
+ if (question.type === CheckBoxListQuestionType && res[slug] === '') res[slug] = [];
1026
+ if (question.hasOwnProperty('sub_question_rules')) for (let rule of question.sub_question_rules) {
1027
+ // check recursive all the tree till leaves ...
1028
+ let res1 = this._formatQuestionAnswer(rule.sub_question);
1029
+
1030
+ res = _objectSpread(_objectSpread({}, res), res1);
1031
+ }
1032
+ return res;
1033
+ });
1034
+
1035
+ _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default()(this, "formatAnswers", () => {
1036
+ let res = {};
1037
+ this.questions.forEach(q => {
1038
+ let res1 = this._formatQuestionAnswer(q);
1039
+
1040
+ res = _objectSpread(_objectSpread({}, res), res1);
1041
+ });
1042
+ return res;
1043
+ });
1044
+
1045
+ _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default()(this, "completed", () => {
1046
+ let res = true;
1047
+
1048
+ for (let q of this.questions) {
1049
+ res = res && this._checkQuestion(q);
1050
+ }
1051
+
1052
+ return res;
1053
+ });
1054
+
1055
+ _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default()(this, "getQuestionByName", name => {
1056
+ const slug = (0,_methods__WEBPACK_IMPORTED_MODULE_1__.toSlug)(name);
1057
+ return this.questionByName[name] || this.questionByName[slug] || null;
1058
+ });
1059
+
1060
+ _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default()(this, "getQuestionById", id => {
1061
+ return this.questionById[parseInt(id)] || null;
1062
+ });
1063
+
1064
+ this.questions = questions;
1065
+ this.originalAnswers = answers;
1066
+ this.answers = []; // map answers to associate array
1067
+
1068
+ for (let a of this.originalAnswers) this.answers[a.question_id] = a;
1069
+
1070
+ this.questionByName = {};
1071
+ this.questionById = {}; // associative array ( rule id , rule);
1072
+
1073
+ this.rules = {};
1074
+
1075
+ this._parseQuestions();
1076
+ }
1077
+
1078
+ }
1079
+
1080
+ /***/ }),
1081
+
1082
+ /***/ "./src/components/extra-questions/index.scss":
1083
+ /*!***************************************************!*\
1084
+ !*** ./src/components/extra-questions/index.scss ***!
1085
+ \***************************************************/
1086
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1087
+
1088
+ __webpack_require__.r(__webpack_exports__);
1089
+ // extracted by mini-css-extract-plugin
1090
+
1091
+
1092
+ /***/ }),
1093
+
1094
+ /***/ "@babel/runtime/helpers/defineProperty":
1095
+ /*!********************************************************!*\
1096
+ !*** external "@babel/runtime/helpers/defineProperty" ***!
1097
+ \********************************************************/
1098
+ /***/ ((module) => {
1099
+
1100
+ module.exports = require("@babel/runtime/helpers/defineProperty");
1101
+
1102
+ /***/ }),
1103
+
1104
+ /***/ "@babel/runtime/helpers/extends":
1105
+ /*!*************************************************!*\
1106
+ !*** external "@babel/runtime/helpers/extends" ***!
1107
+ \*************************************************/
1108
+ /***/ ((module) => {
1109
+
1110
+ module.exports = require("@babel/runtime/helpers/extends");
1111
+
1112
+ /***/ }),
1113
+
1114
+ /***/ "@babel/runtime/helpers/objectWithoutProperties":
1115
+ /*!*****************************************************************!*\
1116
+ !*** external "@babel/runtime/helpers/objectWithoutProperties" ***!
1117
+ \*****************************************************************/
1118
+ /***/ ((module) => {
1119
+
1120
+ module.exports = require("@babel/runtime/helpers/objectWithoutProperties");
1121
+
1122
+ /***/ }),
1123
+
1124
+ /***/ "i18n-react/dist/i18n-react":
1125
+ /*!*********************************************!*\
1126
+ !*** external "i18n-react/dist/i18n-react" ***!
1127
+ \*********************************************/
1128
+ /***/ ((module) => {
1129
+
1130
+ module.exports = require("i18n-react/dist/i18n-react");
1131
+
1132
+ /***/ }),
1133
+
1134
+ /***/ "moment-timezone":
1135
+ /*!**********************************!*\
1136
+ !*** external "moment-timezone" ***!
1137
+ \**********************************/
1138
+ /***/ ((module) => {
1139
+
1140
+ module.exports = require("moment-timezone");
1141
+
1142
+ /***/ }),
1143
+
1144
+ /***/ "prop-types":
1145
+ /*!*****************************!*\
1146
+ !*** external "prop-types" ***!
1147
+ \*****************************/
1148
+ /***/ ((module) => {
1149
+
1150
+ module.exports = require("prop-types");
1151
+
1152
+ /***/ }),
1153
+
1154
+ /***/ "react":
1155
+ /*!************************!*\
1156
+ !*** external "react" ***!
1157
+ \************************/
1158
+ /***/ ((module) => {
1159
+
1160
+ module.exports = require("react");
1161
+
1162
+ /***/ }),
1163
+
1164
+ /***/ "react-final-form":
1165
+ /*!***********************************!*\
1166
+ !*** external "react-final-form" ***!
1167
+ \***********************************/
1168
+ /***/ ((module) => {
1169
+
1170
+ module.exports = require("react-final-form");
1171
+
1172
+ /***/ }),
1173
+
1174
+ /***/ "react-select":
1175
+ /*!*******************************!*\
1176
+ !*** external "react-select" ***!
1177
+ \*******************************/
1178
+ /***/ ((module) => {
1179
+
1180
+ module.exports = require("react-select");
1181
+
1182
+ /***/ }),
1183
+
1184
+ /***/ "urijs":
1185
+ /*!************************!*\
1186
+ !*** external "urijs" ***!
1187
+ \************************/
1188
+ /***/ ((module) => {
1189
+
1190
+ module.exports = require("urijs");
1191
+
1192
+ /***/ })
1193
+
1194
+ /******/ });
1195
+ /************************************************************************/
1196
+ /******/ // The module cache
1197
+ /******/ var __webpack_module_cache__ = {};
1198
+ /******/
1199
+ /******/ // The require function
1200
+ /******/ function __webpack_require__(moduleId) {
1201
+ /******/ // Check if module is in cache
1202
+ /******/ var cachedModule = __webpack_module_cache__[moduleId];
1203
+ /******/ if (cachedModule !== undefined) {
1204
+ /******/ return cachedModule.exports;
1205
+ /******/ }
1206
+ /******/ // Create a new module (and put it into the cache)
1207
+ /******/ var module = __webpack_module_cache__[moduleId] = {
1208
+ /******/ // no module.id needed
1209
+ /******/ // no module.loaded needed
1210
+ /******/ exports: {}
1211
+ /******/ };
1212
+ /******/
1213
+ /******/ // Execute the module function
1214
+ /******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
1215
+ /******/
1216
+ /******/ // Return the exports of the module
1217
+ /******/ return module.exports;
1218
+ /******/ }
1219
+ /******/
1220
+ /************************************************************************/
1221
+ /******/ /* webpack/runtime/compat get default export */
1222
+ /******/ (() => {
1223
+ /******/ // getDefaultExport function for compatibility with non-harmony modules
1224
+ /******/ __webpack_require__.n = (module) => {
1225
+ /******/ var getter = module && module.__esModule ?
1226
+ /******/ () => (module['default']) :
1227
+ /******/ () => (module);
1228
+ /******/ __webpack_require__.d(getter, { a: getter });
1229
+ /******/ return getter;
1230
+ /******/ };
1231
+ /******/ })();
1232
+ /******/
1233
+ /******/ /* webpack/runtime/define property getters */
1234
+ /******/ (() => {
1235
+ /******/ // define getter functions for harmony exports
1236
+ /******/ __webpack_require__.d = (exports, definition) => {
1237
+ /******/ for(var key in definition) {
1238
+ /******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
1239
+ /******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
1240
+ /******/ }
1241
+ /******/ }
1242
+ /******/ };
1243
+ /******/ })();
1244
+ /******/
1245
+ /******/ /* webpack/runtime/hasOwnProperty shorthand */
1246
+ /******/ (() => {
1247
+ /******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
1248
+ /******/ })();
1249
+ /******/
1250
+ /******/ /* webpack/runtime/make namespace object */
1251
+ /******/ (() => {
1252
+ /******/ // define __esModule on exports
1253
+ /******/ __webpack_require__.r = (exports) => {
1254
+ /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
1255
+ /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
1256
+ /******/ }
1257
+ /******/ Object.defineProperty(exports, '__esModule', { value: true });
1258
+ /******/ };
1259
+ /******/ })();
1260
+ /******/
1261
+ /************************************************************************/
1262
+ var __webpack_exports__ = {};
1263
+ // This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk.
1264
+ (() => {
1265
+ /*!*************************************************!*\
1266
+ !*** ./src/components/extra-questions/index.js ***!
1267
+ \*************************************************/
1268
+ __webpack_require__.r(__webpack_exports__);
1269
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
1270
+ /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
1271
+ /* harmony export */ });
1272
+ /* harmony import */ var _babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/extends */ "@babel/runtime/helpers/extends");
1273
+ /* harmony import */ var _babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0__);
1274
+ /* harmony import */ var _babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/objectWithoutProperties */ "@babel/runtime/helpers/objectWithoutProperties");
1275
+ /* harmony import */ var _babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__);
1276
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ "react");
1277
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);
1278
+ /* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ "prop-types");
1279
+ /* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);
1280
+ /* harmony import */ var _raw_html__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../raw-html */ "./src/components/raw-html/index.js");
1281
+ /* harmony import */ var _inputs_text_input__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../inputs/text-input */ "./src/components/inputs/text-input.js");
1282
+ /* harmony import */ var _inputs_dropdown__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../inputs/dropdown */ "./src/components/inputs/dropdown.js");
1283
+ /* harmony import */ var _inputs_radio_list__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../inputs/radio-list */ "./src/components/inputs/radio-list.js");
1284
+ /* harmony import */ var _inputs_checkbox_list__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../inputs/checkbox-list */ "./src/components/inputs/checkbox-list.js");
1285
+ /* harmony import */ var _utils_questions_set__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../utils/questions-set */ "./src/utils/questions-set.js");
1286
+ /* harmony import */ var react_final_form__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! react-final-form */ "react-final-form");
1287
+ /* harmony import */ var react_final_form__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(react_final_form__WEBPACK_IMPORTED_MODULE_10__);
1288
+ /* harmony import */ var _index_scss__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./index.scss */ "./src/components/extra-questions/index.scss");
1289
+ /* harmony import */ var _utils_methods__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../../utils/methods */ "./src/utils/methods.js");
1290
+
1291
+
1292
+ const _excluded = ["input", "meta", "question", "className", "isDisabled", "isRequired"],
1293
+ _excluded2 = ["input", "meta", "question", "isDisabled", "isRequired"],
1294
+ _excluded3 = ["input", "meta", "question", "isDisabled", "isRequired"],
1295
+ _excluded4 = ["input", "meta", "question", "isDisabled", "isRequired", "maxValues"];
1296
+
1297
+ /**
1298
+ * Copyright 2017 OpenStack Foundation
1299
+ * Licensed under the Apache License, Version 2.0 (the "License");
1300
+ * you may not use this file except in compliance with the License.
1301
+ * You may obtain a copy of the License at
1302
+ * http://www.apache.org/licenses/LICENSE-2.0
1303
+ * Unless required by applicable law or agreed to in writing, software
1304
+ * distributed under the License is distributed on an "AS IS" BASIS,
1305
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1306
+ * See the License for the specific language governing permissions and
1307
+ * limitations under the License.
1308
+ **/
1309
+
1310
+
1311
+
1312
+
1313
+
1314
+
1315
+
1316
+
1317
+
1318
+
1319
+
1320
+
1321
+ const InputAdapter = _ref => {
1322
+ let {
1323
+ input,
1324
+ meta,
1325
+ question,
1326
+ className,
1327
+ isDisabled,
1328
+ isRequired
1329
+ } = _ref,
1330
+ rest = _babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1___default()(_ref, _excluded);
1331
+
1332
+ return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement(_inputs_text_input__WEBPACK_IMPORTED_MODULE_5__["default"], _babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0___default()({}, input, rest, {
1333
+ containerClassName: className,
1334
+ name: (0,_utils_methods__WEBPACK_IMPORTED_MODULE_12__.toSlug)(question.name),
1335
+ ariaLabelledBy: `${(0,_utils_methods__WEBPACK_IMPORTED_MODULE_12__.toSlug)(question.name)} label`,
1336
+ id: (0,_utils_methods__WEBPACK_IMPORTED_MODULE_12__.toSlug)(question.name),
1337
+ value: input.value,
1338
+ disabled: isDisabled,
1339
+ required: isRequired,
1340
+ onChange: input.onChange,
1341
+ placeholder: question.placeholder
1342
+ }));
1343
+ };
1344
+
1345
+ const RadioButtonListAdapter = _ref2 => {
1346
+ let {
1347
+ input,
1348
+ meta,
1349
+ question,
1350
+ isDisabled,
1351
+ isRequired
1352
+ } = _ref2,
1353
+ rest = _babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1___default()(_ref2, _excluded2);
1354
+
1355
+ return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement(_inputs_radio_list__WEBPACK_IMPORTED_MODULE_7__["default"], _babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0___default()({}, input, rest, {
1356
+ name: (0,_utils_methods__WEBPACK_IMPORTED_MODULE_12__.toSlug)(question.name),
1357
+ ariaLabelledBy: `${(0,_utils_methods__WEBPACK_IMPORTED_MODULE_12__.toSlug)(question.name)} label`,
1358
+ id: (0,_utils_methods__WEBPACK_IMPORTED_MODULE_12__.toSlug)(question.name),
1359
+ overrideCSS: true,
1360
+ value: input.value,
1361
+ disabled: isDisabled,
1362
+ required: isRequired,
1363
+ onChange: input.onChange
1364
+ }));
1365
+ };
1366
+
1367
+ const DropdownAdapter = _ref3 => {
1368
+ let {
1369
+ input,
1370
+ meta,
1371
+ question,
1372
+ isDisabled,
1373
+ isRequired
1374
+ } = _ref3,
1375
+ rest = _babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1___default()(_ref3, _excluded3);
1376
+
1377
+ return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement(_inputs_dropdown__WEBPACK_IMPORTED_MODULE_6__["default"], _babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0___default()({}, input, rest, {
1378
+ name: (0,_utils_methods__WEBPACK_IMPORTED_MODULE_12__.toSlug)(question.name),
1379
+ ariaLabelledBy: `${(0,_utils_methods__WEBPACK_IMPORTED_MODULE_12__.toSlug)(question.name)} label`,
1380
+ id: (0,_utils_methods__WEBPACK_IMPORTED_MODULE_12__.toSlug)(question.name),
1381
+ overrideCSS: true,
1382
+ value: input.value,
1383
+ disabled: isDisabled,
1384
+ required: isRequired,
1385
+ onChange: input.onChange
1386
+ }));
1387
+ };
1388
+
1389
+ const CheckBoxListAdapter = _ref4 => {
1390
+ let {
1391
+ input,
1392
+ meta,
1393
+ question,
1394
+ isDisabled,
1395
+ isRequired,
1396
+ maxValues
1397
+ } = _ref4,
1398
+ rest = _babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1___default()(_ref4, _excluded4);
1399
+
1400
+ const shouldChange = ev => {
1401
+ const question_answers = ev.target.value; // if there's a max value of options checked and the value from the input is higher than the max, don't change the value
1402
+
1403
+ if (maxValues > 0 && question_answers.length > maxValues) {
1404
+ return null;
1405
+ }
1406
+
1407
+ return input.onChange(ev);
1408
+ };
1409
+
1410
+ return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement(_inputs_checkbox_list__WEBPACK_IMPORTED_MODULE_8__["default"], _babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0___default()({}, input, rest, {
1411
+ id: (0,_utils_methods__WEBPACK_IMPORTED_MODULE_12__.toSlug)(question.name),
1412
+ name: (0,_utils_methods__WEBPACK_IMPORTED_MODULE_12__.toSlug)(question.name),
1413
+ ariaLabelledBy: `${(0,_utils_methods__WEBPACK_IMPORTED_MODULE_12__.toSlug)(question.name)} label`,
1414
+ value: input.value,
1415
+ disabled: isDisabled,
1416
+ required: isRequired,
1417
+ onChange: shouldChange
1418
+ }));
1419
+ };
1420
+
1421
+ const getValidator = isRequired => isRequired ? value => value ? undefined : "Required" : () => {};
1422
+
1423
+ const ExtraQuestionsForm = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().forwardRef(({
1424
+ extraQuestions,
1425
+ userAnswers,
1426
+ onAnswerChanges,
1427
+ className = 'questions-form',
1428
+ questionContainerClassName = 'question-container',
1429
+ questionLabelContainerClassName = 'question-label-container',
1430
+ questionControlContainerClassName = 'question-control-container',
1431
+ readOnly = false,
1432
+ debug = false,
1433
+ buttonText = 'Submit',
1434
+ RequiredErrorMessage = 'Required',
1435
+ ValidationErrorClassName = 'extra-question-error',
1436
+ allowExtraQuestionsEdit = true,
1437
+ onError = e => console.log('form errors: ', e),
1438
+ shouldScroll2FirstError = true
1439
+ }, ref) => {
1440
+ let submit = null;
1441
+ const questionRef = (0,react__WEBPACK_IMPORTED_MODULE_2__.useRef)({});
1442
+ const formRef = (0,react__WEBPACK_IMPORTED_MODULE_2__.useRef)(null);
1443
+ const [answers, setAnswers] = (0,react__WEBPACK_IMPORTED_MODULE_2__.useState)({});
1444
+ (0,react__WEBPACK_IMPORTED_MODULE_2__.useEffect)(() => {
1445
+ formatUserAnswers();
1446
+ }, [extraQuestions]); // @see https://beta.reactjs.org/reference/react/useImperativeHandle
1447
+
1448
+ (0,react__WEBPACK_IMPORTED_MODULE_2__.useImperativeHandle)(ref, () => ({
1449
+ doSubmit() {
1450
+ formRef.current.dispatchEvent(new Event("submit", {
1451
+ cancelable: true,
1452
+ bubbles: true
1453
+ }));
1454
+ }
1455
+
1456
+ }));
1457
+
1458
+ const formatUserAnswers = () => {
1459
+ const qs = new _utils_questions_set__WEBPACK_IMPORTED_MODULE_9__["default"](extraQuestions, userAnswers);
1460
+ setAnswers(qs.formatAnswers());
1461
+ };
1462
+
1463
+ const Condition = ({
1464
+ when,
1465
+ rule,
1466
+ children
1467
+ }) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement(react_final_form__WEBPACK_IMPORTED_MODULE_10__.Field, {
1468
+ name: when,
1469
+ subscription: {
1470
+ value: true
1471
+ }
1472
+ }, ({
1473
+ input: {
1474
+ value
1475
+ }
1476
+ }) => checkVisibility(rule, checkRule(value, rule), children));
1477
+
1478
+ const Error = ({
1479
+ name
1480
+ }) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement(react_final_form__WEBPACK_IMPORTED_MODULE_10__.Field, {
1481
+ name: name,
1482
+ subscription: {
1483
+ error: true,
1484
+ touched: true
1485
+ }
1486
+ }, ({
1487
+ meta: {
1488
+ error,
1489
+ touched
1490
+ }
1491
+ }) => error && touched ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement("div", {
1492
+ className: ValidationErrorClassName
1493
+ }, error) : null);
1494
+
1495
+ const checkRule = (value, rule) => {
1496
+ let values = rule.answer_values;
1497
+
1498
+ if (Array.isArray(value)) {
1499
+ if (!value.length) return false;
1500
+ let res = rule.answer_values_operator === "And";
1501
+ values.forEach(v => {
1502
+ if (rule.answer_values_operator === "And") {
1503
+ res = res && value.includes(parseInt(v));
1504
+ } else {
1505
+ // Or
1506
+ res = res || value.includes(parseInt(v));
1507
+ }
1508
+ });
1509
+ return res;
1510
+ }
1511
+
1512
+ return values.includes(value.toString());
1513
+ };
1514
+
1515
+ const checkVisibility = (rule, ruleResult, children) => {
1516
+ if (rule.visibility === "Visible") {
1517
+ if (rule.visibility_condition === "Equal") {
1518
+ if (ruleResult) return children;
1519
+ delete questionRef.current[rule.sub_question.id];
1520
+ return null;
1521
+ } // Non Equal
1522
+
1523
+
1524
+ if (!ruleResult) {
1525
+ return children;
1526
+ }
1527
+
1528
+ delete questionRef.current[rule.sub_question.id];
1529
+ return null;
1530
+ } // not visible
1531
+
1532
+
1533
+ if (rule.visibility_condition === "Equal") {
1534
+ if (!ruleResult) return children;
1535
+ delete questionRef.current[rule.sub_question.id];
1536
+ return null;
1537
+ }
1538
+
1539
+ if (ruleResult) return children;
1540
+ delete questionRef.current[rule.sub_question.id];
1541
+ return null;
1542
+ };
1543
+
1544
+ const getLabel = q => {
1545
+ // Keep the last word and the required asterisk on the same line
1546
+ const nonBreakingSpace = String.fromCharCode(160); // equals to &nbsp;
1547
+ // Using browser parser isntead of regex to avoid possible issues
1548
+
1549
+ const div = document.createElement("div");
1550
+ div.innerHTML = q.label;
1551
+ const label = div.textContent || div.innerText || "";
1552
+ const labelText = q.mandatory ? `${label}${nonBreakingSpace}<b>*</b>` : label;
1553
+ const labelHTML = `<label id="${(0,_utils_methods__WEBPACK_IMPORTED_MODULE_12__.toSlug)(q.name)} label" htmlFor="${(0,_utils_methods__WEBPACK_IMPORTED_MODULE_12__.toSlug)(q.name)}">
1554
+ ${labelText}
1555
+ </label>`;
1556
+ return labelHTML;
1557
+ };
1558
+
1559
+ const isAnswered = (q, answers) => {
1560
+ const slug = (0,_utils_methods__WEBPACK_IMPORTED_MODULE_12__.toSlug)(q.name);
1561
+ if (!answers.hasOwnProperty(slug)) return false;
1562
+ const answer = answers[slug]; // check type
1563
+
1564
+ if (Array.isArray(answer)) return answer.length > 0;
1565
+ if (typeof answer === 'string') return answer.length > 0;
1566
+ if (typeof answer === 'number') return answer > 0;
1567
+ if (typeof answer === 'boolean') return answer;
1568
+ return false;
1569
+ };
1570
+
1571
+ const renderQuestion = q => {
1572
+ let questionValues = q.values; // disable field if edit isn't allowed and the questions is answered
1573
+
1574
+ const isDisabled = !allowExtraQuestionsEdit && isAnswered(q, answers); // @see https://codesandbox.io/s/vg05y?file=/index.js
1575
+
1576
+ if (q.type === "Text") {
1577
+ var _q$sub_question_rules;
1578
+
1579
+ return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement(react__WEBPACK_IMPORTED_MODULE_2__.Fragment, {
1580
+ key: (0,_utils_methods__WEBPACK_IMPORTED_MODULE_12__.toSlug)(q.name)
1581
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement("div", {
1582
+ ref: el => questionRef.current[q.id] = el,
1583
+ className: questionContainerClassName
1584
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement(_raw_html__WEBPACK_IMPORTED_MODULE_4__["default"], {
1585
+ className: questionLabelContainerClassName
1586
+ }, getLabel(q)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement("div", {
1587
+ className: questionControlContainerClassName
1588
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement(react_final_form__WEBPACK_IMPORTED_MODULE_10__.Field, {
1589
+ name: (0,_utils_methods__WEBPACK_IMPORTED_MODULE_12__.toSlug)(q.name),
1590
+ question: q,
1591
+ isDisabled: isDisabled,
1592
+ isRequired: q.mandatory,
1593
+ validate: getValidator(q.mandatory),
1594
+ component: InputAdapter
1595
+ }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement(Error, {
1596
+ name: (0,_utils_methods__WEBPACK_IMPORTED_MODULE_12__.toSlug)(q.name)
1597
+ }))), ((_q$sub_question_rules = q.sub_question_rules) === null || _q$sub_question_rules === void 0 ? void 0 : _q$sub_question_rules.length) > 0 && q.sub_question_rules.map(r => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement(Condition, {
1598
+ key: r.id,
1599
+ when: (0,_utils_methods__WEBPACK_IMPORTED_MODULE_12__.toSlug)(q.name),
1600
+ rule: r
1601
+ }, renderQuestion(r.sub_question))));
1602
+ }
1603
+
1604
+ if (q.type === "TextArea") {
1605
+ var _q$sub_question_rules2;
1606
+
1607
+ return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement(react__WEBPACK_IMPORTED_MODULE_2__.Fragment, {
1608
+ key: (0,_utils_methods__WEBPACK_IMPORTED_MODULE_12__.toSlug)(q.name)
1609
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement("div", {
1610
+ ref: el => questionRef.current[q.id] = el,
1611
+ className: questionContainerClassName
1612
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement(_raw_html__WEBPACK_IMPORTED_MODULE_4__["default"], {
1613
+ className: questionLabelContainerClassName
1614
+ }, getLabel(q)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement("div", {
1615
+ className: questionControlContainerClassName
1616
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement(react_final_form__WEBPACK_IMPORTED_MODULE_10__.Field, {
1617
+ validate: getValidator(q.mandatory),
1618
+ name: (0,_utils_methods__WEBPACK_IMPORTED_MODULE_12__.toSlug)(q.name),
1619
+ id: (0,_utils_methods__WEBPACK_IMPORTED_MODULE_12__.toSlug)(q.name),
1620
+ disabled: isDisabled,
1621
+ required: q.mandatory,
1622
+ component: "textarea"
1623
+ }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement(Error, {
1624
+ name: (0,_utils_methods__WEBPACK_IMPORTED_MODULE_12__.toSlug)(q.name)
1625
+ }))), ((_q$sub_question_rules2 = q.sub_question_rules) === null || _q$sub_question_rules2 === void 0 ? void 0 : _q$sub_question_rules2.length) > 0 && q.sub_question_rules.map(r => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement(Condition, {
1626
+ key: r.id,
1627
+ when: (0,_utils_methods__WEBPACK_IMPORTED_MODULE_12__.toSlug)(q.name),
1628
+ rule: r
1629
+ }, renderQuestion(r.sub_question))));
1630
+ }
1631
+
1632
+ if (q.type === "CheckBox") {
1633
+ var _q$sub_question_rules3;
1634
+
1635
+ return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement(react__WEBPACK_IMPORTED_MODULE_2__.Fragment, {
1636
+ key: (0,_utils_methods__WEBPACK_IMPORTED_MODULE_12__.toSlug)(q.name)
1637
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement("div", {
1638
+ ref: el => questionRef.current[q.id] = el,
1639
+ style: {
1640
+ display: 'flex'
1641
+ },
1642
+ className: questionContainerClassName
1643
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement(_raw_html__WEBPACK_IMPORTED_MODULE_4__["default"], {
1644
+ className: `eq-checkbox-label ${questionLabelContainerClassName}`
1645
+ }, getLabel(q)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement("div", {
1646
+ className: questionControlContainerClassName
1647
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement("div", {
1648
+ className: "form-check abc-checkbox"
1649
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement(react_final_form__WEBPACK_IMPORTED_MODULE_10__.Field, {
1650
+ name: (0,_utils_methods__WEBPACK_IMPORTED_MODULE_12__.toSlug)(q.name),
1651
+ id: (0,_utils_methods__WEBPACK_IMPORTED_MODULE_12__.toSlug)(q.name),
1652
+ validate: getValidator(q.mandatory),
1653
+ disabled: isDisabled,
1654
+ required: q.mandatory,
1655
+ type: "checkbox",
1656
+ className: "form-check-input",
1657
+ component: "input"
1658
+ }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement("label", {
1659
+ className: "form-check-label",
1660
+ htmlFor: (0,_utils_methods__WEBPACK_IMPORTED_MODULE_12__.toSlug)(q.name)
1661
+ }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement(Error, {
1662
+ name: (0,_utils_methods__WEBPACK_IMPORTED_MODULE_12__.toSlug)(q.name)
1663
+ })))), ((_q$sub_question_rules3 = q.sub_question_rules) === null || _q$sub_question_rules3 === void 0 ? void 0 : _q$sub_question_rules3.length) > 0 && q.sub_question_rules.map(r => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement(Condition, {
1664
+ key: r.id,
1665
+ when: (0,_utils_methods__WEBPACK_IMPORTED_MODULE_12__.toSlug)(q.name),
1666
+ rule: r
1667
+ }, renderQuestion(r.sub_question))));
1668
+ }
1669
+
1670
+ if (q.type === "RadioButtonList") {
1671
+ var _q$sub_question_rules4;
1672
+
1673
+ const options = questionValues.map(val => ({
1674
+ label: val.label,
1675
+ value: val.id
1676
+ }));
1677
+ return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement(react__WEBPACK_IMPORTED_MODULE_2__.Fragment, {
1678
+ key: (0,_utils_methods__WEBPACK_IMPORTED_MODULE_12__.toSlug)(q.name)
1679
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement("div", {
1680
+ key: (0,_utils_methods__WEBPACK_IMPORTED_MODULE_12__.toSlug)(q.name),
1681
+ ref: el => questionRef.current[q.id] = el,
1682
+ className: questionContainerClassName
1683
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement(_raw_html__WEBPACK_IMPORTED_MODULE_4__["default"], {
1684
+ className: questionLabelContainerClassName
1685
+ }, getLabel(q)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement("div", {
1686
+ className: questionControlContainerClassName
1687
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement(react_final_form__WEBPACK_IMPORTED_MODULE_10__.Field, {
1688
+ name: (0,_utils_methods__WEBPACK_IMPORTED_MODULE_12__.toSlug)(q.name),
1689
+ options: options,
1690
+ question: q,
1691
+ validate: getValidator(q.mandatory),
1692
+ isDisabled: isDisabled,
1693
+ isRequired: q.mandatory,
1694
+ component: RadioButtonListAdapter
1695
+ }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement(Error, {
1696
+ name: (0,_utils_methods__WEBPACK_IMPORTED_MODULE_12__.toSlug)(q.name)
1697
+ }))), ((_q$sub_question_rules4 = q.sub_question_rules) === null || _q$sub_question_rules4 === void 0 ? void 0 : _q$sub_question_rules4.length) > 0 && q.sub_question_rules.map(r => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement(Condition, {
1698
+ key: r.id,
1699
+ when: (0,_utils_methods__WEBPACK_IMPORTED_MODULE_12__.toSlug)(q.name),
1700
+ rule: r
1701
+ }, renderQuestion(r.sub_question))));
1702
+ }
1703
+
1704
+ if (q.type === "ComboBox") {
1705
+ var _q$sub_question_rules5;
1706
+
1707
+ const options = questionValues.map(val => ({
1708
+ label: val.label,
1709
+ value: val.id
1710
+ }));
1711
+ return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement(react__WEBPACK_IMPORTED_MODULE_2__.Fragment, {
1712
+ key: (0,_utils_methods__WEBPACK_IMPORTED_MODULE_12__.toSlug)(q.name)
1713
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement("div", {
1714
+ ref: el => questionRef.current[q.id] = el,
1715
+ className: questionContainerClassName
1716
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement(_raw_html__WEBPACK_IMPORTED_MODULE_4__["default"], {
1717
+ className: questionLabelContainerClassName
1718
+ }, getLabel(q)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement("div", {
1719
+ className: questionControlContainerClassName
1720
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement(react_final_form__WEBPACK_IMPORTED_MODULE_10__.Field, {
1721
+ name: (0,_utils_methods__WEBPACK_IMPORTED_MODULE_12__.toSlug)(q.name),
1722
+ options: options,
1723
+ question: q,
1724
+ validate: getValidator(q.mandatory),
1725
+ isDisabled: isDisabled,
1726
+ isRequired: q.mandatory,
1727
+ component: DropdownAdapter
1728
+ }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement(Error, {
1729
+ name: (0,_utils_methods__WEBPACK_IMPORTED_MODULE_12__.toSlug)(q.name)
1730
+ }))), ((_q$sub_question_rules5 = q.sub_question_rules) === null || _q$sub_question_rules5 === void 0 ? void 0 : _q$sub_question_rules5.length) > 0 && q.sub_question_rules.map(r => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement(Condition, {
1731
+ key: r.id,
1732
+ when: (0,_utils_methods__WEBPACK_IMPORTED_MODULE_12__.toSlug)(q.name),
1733
+ rule: r
1734
+ }, renderQuestion(r.sub_question))));
1735
+ }
1736
+
1737
+ if (q.type === "CheckBoxList") {
1738
+ var _q$sub_question_rules6;
1739
+
1740
+ const options = questionValues.map(val => ({
1741
+ label: val.label,
1742
+ value: val.id
1743
+ }));
1744
+ return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement(react__WEBPACK_IMPORTED_MODULE_2__.Fragment, {
1745
+ key: (0,_utils_methods__WEBPACK_IMPORTED_MODULE_12__.toSlug)(q.name)
1746
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement("div", {
1747
+ ref: el => questionRef.current[q.id] = el,
1748
+ className: questionContainerClassName
1749
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement(_raw_html__WEBPACK_IMPORTED_MODULE_4__["default"], {
1750
+ className: questionLabelContainerClassName
1751
+ }, getLabel(q)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement("div", {
1752
+ className: questionControlContainerClassName
1753
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement(react_final_form__WEBPACK_IMPORTED_MODULE_10__.Field, {
1754
+ name: (0,_utils_methods__WEBPACK_IMPORTED_MODULE_12__.toSlug)(q.name),
1755
+ className: questionControlContainerClassName,
1756
+ validate: getValidator(q.mandatory),
1757
+ options: options,
1758
+ question: q,
1759
+ maxValues: q.max_selected_values,
1760
+ isDisabled: isDisabled,
1761
+ isRequired: q.mandatory,
1762
+ component: CheckBoxListAdapter
1763
+ }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement(Error, {
1764
+ name: (0,_utils_methods__WEBPACK_IMPORTED_MODULE_12__.toSlug)(q.name)
1765
+ }))), ((_q$sub_question_rules6 = q.sub_question_rules) === null || _q$sub_question_rules6 === void 0 ? void 0 : _q$sub_question_rules6.length) > 0 && q.sub_question_rules.map(r => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement(Condition, {
1766
+ key: r.id,
1767
+ when: (0,_utils_methods__WEBPACK_IMPORTED_MODULE_12__.toSlug)(q.name),
1768
+ rule: r
1769
+ }, renderQuestion(r.sub_question))));
1770
+ }
1771
+
1772
+ return null;
1773
+ };
1774
+
1775
+ const isVisible = q => {
1776
+ return !!questionRef.current[q.id];
1777
+ };
1778
+
1779
+ const validateQuestion = (q, values, errors) => {
1780
+ var _q$sub_question_rules7;
1781
+
1782
+ if (q.mandatory && isVisible(q)) {
1783
+ const slug = (0,_utils_methods__WEBPACK_IMPORTED_MODULE_12__.toSlug)(q.name);
1784
+
1785
+ if (!values.hasOwnProperty((0,_utils_methods__WEBPACK_IMPORTED_MODULE_12__.toSlug)(slug)) || values[(0,_utils_methods__WEBPACK_IMPORTED_MODULE_12__.toSlug)(slug)] === "" || values[slug].length === 0) {
1786
+ errors[slug] = RequiredErrorMessage;
1787
+ }
1788
+ } // validate sub rules
1789
+
1790
+
1791
+ (_q$sub_question_rules7 = q.sub_question_rules) === null || _q$sub_question_rules7 === void 0 ? void 0 : _q$sub_question_rules7.forEach(r => {
1792
+ validateQuestion(r.sub_question, values, errors);
1793
+ });
1794
+ };
1795
+
1796
+ const onSubmit = values => {
1797
+ onAnswerChanges(values);
1798
+ };
1799
+
1800
+ const validate = values => {
1801
+ const errors = {};
1802
+ extraQuestions.forEach(q => {
1803
+ validateQuestion(q, values, errors);
1804
+ });
1805
+ return errors;
1806
+ };
1807
+
1808
+ if (!Object.keys(answers).length) return null;
1809
+
1810
+ const getErrorFields = (q, invalidFormFields, errorFields) => {
1811
+ var _q$sub_question_rules8;
1812
+
1813
+ if (invalidFormFields.includes((0,_utils_methods__WEBPACK_IMPORTED_MODULE_12__.toSlug)(q.name))) {
1814
+ errorFields.push(q);
1815
+ } // find errors on sub rules
1816
+
1817
+
1818
+ (_q$sub_question_rules8 = q.sub_question_rules) === null || _q$sub_question_rules8 === void 0 ? void 0 : _q$sub_question_rules8.forEach(r => {
1819
+ getErrorFields(r.sub_question, invalidFormFields, errorFields);
1820
+ });
1821
+ };
1822
+
1823
+ const getFirstError = invalidFormFields => {
1824
+ const errorFields = [];
1825
+ extraQuestions.forEach(q => {
1826
+ getErrorFields(q, invalidFormFields, errorFields);
1827
+ });
1828
+ return errorFields.sort((a, b) => a.order > b.order)[0];
1829
+ };
1830
+
1831
+ const scrollToFirstError = invalidFormFields => {
1832
+ const firstError = getFirstError(invalidFormFields);
1833
+ questionRef.current[firstError.id].scrollIntoView({
1834
+ behavior: 'smooth',
1835
+ block: 'center'
1836
+ });
1837
+ };
1838
+
1839
+ if (!Object.keys(answers).length) return null;
1840
+ return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement("div", {
1841
+ className: className
1842
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement(react_final_form__WEBPACK_IMPORTED_MODULE_10__.Form, {
1843
+ validate: validate,
1844
+ onSubmit: onSubmit,
1845
+ initialValues: answers
1846
+ }, ({
1847
+ handleSubmit,
1848
+ form,
1849
+ submitting,
1850
+ pristine,
1851
+ values
1852
+ }) => {
1853
+ submit = handleSubmit;
1854
+ return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement("form", {
1855
+ onSubmit: event => {
1856
+ const invalidFormFields = form.getRegisteredFields().filter(field => form.getFieldState(field).invalid);
1857
+
1858
+ if (invalidFormFields.length > 0) {
1859
+ const firstError = getFirstError(invalidFormFields);
1860
+ onError(invalidFormFields, questionRef.current[firstError.id]);
1861
+ if (shouldScroll2FirstError) scrollToFirstError(invalidFormFields);
1862
+ }
1863
+
1864
+ handleSubmit(event);
1865
+ },
1866
+ ref: formRef
1867
+ }, readOnly ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement("fieldset", {
1868
+ disabled: "disabled"
1869
+ }, extraQuestions.map(q => renderQuestion(q))) : extraQuestions.map(q => renderQuestion(q)), debug && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement("pre", null, JSON.stringify(values, 0, 2)));
1870
+ }), !ref && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement("button", {
1871
+ type: "submit",
1872
+ onClick: event => {
1873
+ submit(event);
1874
+ },
1875
+ style: {
1876
+ marginTop: 10
1877
+ }
1878
+ }, buttonText));
1879
+ });
1880
+ ExtraQuestionsForm.propTypes = {
1881
+ extraQuestions: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().array.isRequired),
1882
+ userAnswers: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().array.isRequired),
1883
+ onAnswerChanges: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func.isRequired),
1884
+ className: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string),
1885
+ debug: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().bool),
1886
+ buttonText: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string),
1887
+ questionContainerClassName: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string),
1888
+ questionLabelContainerClassName: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string),
1889
+ questionControlContainerClassName: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string),
1890
+ RequiredErrorMessage: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string),
1891
+ ValidationErrorClassName: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string),
1892
+ allowExtraQuestionsEdit: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().bool),
1893
+ shouldScroll2FirstError: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().bool)
1894
+ };
1895
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ExtraQuestionsForm);
1896
+ })();
1897
+
1898
+ /******/ return __webpack_exports__;
1899
+ /******/ })()
1900
+ ;
1901
+ });
1902
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,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QjBSLHdCQUF3QixFQUFFMVIsMERBWEM7RUFZM0IyUix1QkFBdUIsRUFBRTNSLHdEQVpFO0VBYTNCNlIsdUJBQXVCLEVBQUU3Uix3REFBYzhWO0FBYlosQ0FBL0I7QUFnQkEsaUVBQWVoRixrQkFBZixFIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vb3BlbnN0YWNrLXVpY29yZS1mb3VuZGF0aW9uL3dlYnBhY2svdW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbiIsIndlYnBhY2s6Ly9vcGVuc3RhY2stdWljb3JlLWZvdW5kYXRpb24vLi9zcmMvY29tcG9uZW50cy9pbnB1dHMvY2hlY2tib3gtbGlzdC5qcyIsIndlYnBhY2s6Ly9vcGVuc3RhY2stdWljb3JlLWZvdW5kYXRpb24vLi9zcmMvY29tcG9uZW50cy9pbnB1dHMvZHJvcGRvd24uanMiLCJ3ZWJwYWNrOi8vb3BlbnN0YWNrLXVpY29yZS1mb3VuZGF0aW9uLy4vc3JjL2NvbXBvbmVudHMvaW5wdXRzL3JhZGlvLWxpc3QuanMiLCJ3ZWJwYWNrOi8vb3BlbnN0YWNrLXVpY29yZS1mb3VuZGF0aW9uLy4vc3JjL2NvbXBvbmVudHMvaW5wdXRzL3RleHQtaW5wdXQuanMiLCJ3ZWJwYWNrOi8vb3BlbnN0YWNrLXVpY29yZS1mb3VuZGF0aW9uLy4vc3JjL2NvbXBvbmVudHMvcmF3LWh0bWwvaW5kZXguanMiLCJ3ZWJwYWNrOi8vb3BlbnN0YWNrLXVpY29yZS1mb3VuZGF0aW9uLy4vc3JjL3V0aWxzL21ldGhvZHMuanMiLCJ3ZWJwYWNrOi8vb3BlbnN0YWNrLXVpY29yZS1mb3VuZGF0aW9uLy4vc3JjL3V0aWxzL3F1ZXN0aW9ucy1zZXQuanMiLCJ3ZWJwYWNrOi8vb3BlbnN0YWNrLXVpY29yZS1mb3VuZGF0aW9uLy4vc3JjL2NvbXBvbmVudHMvZXh0cmEtcXVlc3Rpb25zL2luZGV4LnNjc3M/MWE3MyIsIndlYnBhY2s6Ly9vcGVuc3RhY2stdWljb3JlLWZvdW5kYXRpb24vZXh0ZXJuYWwgY29tbW9uanMgXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIiLCJ3ZWJwYWNrOi8vb3BlbnN0YWNrLXVpY29yZS1mb3VuZGF0aW9uL2V4dGVybmFsIGNvbW1vbmpzIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9leHRlbmRzXCIiLCJ3ZWJwYWNrOi8vb3BlbnN0YWNrLXVpY29yZS1mb3VuZGF0aW9uL2V4dGVybmFsIGNvbW1vbmpzIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiIiwid2VicGFjazovL29wZW5zdGFjay11aWNvcmUtZm91bmRhdGlvbi9leHRlcm5hbCBjb21tb25qcyBcImkxOG4tcmVhY3QvZGlzdC9pMThuLXJlYWN0XCIiLCJ3ZWJwYWNrOi8vb3BlbnN0YWNrLXVpY29yZS1mb3VuZGF0aW9uL2V4dGVybmFsIGNvbW1vbmpzIFwibW9tZW50LXRpbWV6b25lXCIiLCJ3ZWJwYWNrOi8vb3BlbnN0YWNrLXVpY29yZS1mb3VuZGF0aW9uL2V4dGVybmFsIGNvbW1vbmpzIFwicHJvcC10eXBlc1wiIiwid2VicGFjazovL29wZW5zdGFjay11aWNvcmUtZm91bmRhdGlvbi9leHRlcm5hbCBjb21tb25qcyBcInJlYWN0XCIiLCJ3ZWJwYWNrOi8vb3BlbnN0YWNrLXVpY29yZS1mb3VuZGF0aW9uL2V4dGVybmFsIGNvbW1vbmpzIFwicmVhY3QtZmluYWwtZm9ybVwiIiwid2VicGFjazovL29wZW5zdGFjay11aWNvcmUtZm91bmRhdGlvbi9leHRlcm5hbCBjb21tb25qcyBcInJlYWN0LXNlbGVjdFwiIiwid2VicGFjazovL29wZW5zdGFjay11aWNvcmUtZm91bmRhdGlvbi9leHRlcm5hbCBjb21tb25qcyBcInVyaWpzXCIiLCJ3ZWJwYWNrOi8vb3BlbnN0YWNrLXVpY29yZS1mb3VuZGF0aW9uL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL29wZW5zdGFjay11aWNvcmUtZm91bmRhdGlvbi93ZWJwYWNrL3J1bnRpbWUvY29tcGF0IGdldCBkZWZhdWx0IGV4cG9ydCIsIndlYnBhY2s6Ly9vcGVuc3RhY2stdWljb3JlLWZvdW5kYXRpb24vd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovL29wZW5zdGFjay11aWNvcmUtZm91bmRhdGlvbi93ZWJwYWNrL3J1bnRpbWUvaGFzT3duUHJvcGVydHkgc2hvcnRoYW5kIiwid2VicGFjazovL29wZW5zdGFjay11aWNvcmUtZm91bmRhdGlvbi93ZWJwYWNrL3J1bnRpbWUvbWFrZSBuYW1lc3BhY2Ugb2JqZWN0Iiwid2VicGFjazovL29wZW5zdGFjay11aWNvcmUtZm91bmRhdGlvbi8uL3NyYy9jb21wb25lbnRzL2V4dHJhLXF1ZXN0aW9ucy9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShcIm9wZW5zdGFjay11aWNvcmUtZm91bmRhdGlvblwiLCBbXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJvcGVuc3RhY2stdWljb3JlLWZvdW5kYXRpb25cIl0gPSBmYWN0b3J5KCk7XG5cdGVsc2Vcblx0XHRyb290W1wib3BlbnN0YWNrLXVpY29yZS1mb3VuZGF0aW9uXCJdID0gZmFjdG9yeSgpO1xufSkodGhpcywgKCkgPT4ge1xucmV0dXJuICIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTggT3BlblN0YWNrIEZvdW5kYXRpb25cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKi9cbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcydcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgVCBmcm9tICdpMThuLXJlYWN0L2Rpc3QvaTE4bi1yZWFjdCc7XG5pbXBvcnQgUmF3SFRNTCBmcm9tICcuLi9yYXctaHRtbCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENoZWNrYm94TGlzdCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICBzdXBlcihwcm9wcyk7XG5cbiAgICAgICAgbGV0IG90aGVyVmFsdWUgPSBwcm9wcy52YWx1ZSA/IHByb3BzLnZhbHVlLmZpbmQoIHYgPT4gIXByb3BzLm9wdGlvbnMubWFwKG9wID0+IG9wLnZhbHVlKS5pbmNsdWRlcyh2KSApIDogZmFsc2U7XG5cbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgICAgICAgIG90aGVyQ2hlY2tlZDogISFvdGhlclZhbHVlXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5oYW5kbGVDaGFuZ2UgPSB0aGlzLmhhbmRsZUNoYW5nZS5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLmhhbmRsZU90aGVyQ0JDaGFuZ2UgPSB0aGlzLmhhbmRsZU90aGVyQ0JDaGFuZ2UuYmluZCh0aGlzKTtcbiAgICB9XG5cbiAgICBoYW5kbGVDaGFuZ2UoZXZlbnQpIHtcbiAgICAgICAgbGV0IG9wdGlvblZhbHVlcyA9IHRoaXMucHJvcHMub3B0aW9ucy5tYXAob3AgPT4gb3AudmFsdWUpO1xuICAgICAgICBsZXQgdmFsdWUgPSB0aGlzLnByb3BzLnZhbHVlID8gWy4uLnRoaXMucHJvcHMudmFsdWVdIDogW107XG5cbiAgICAgICAgaWYgKGV2ZW50LnRhcmdldC50eXBlID09PSAnY2hlY2tib3gnKSB7XG4gICAgICAgICAgICBpZiAoZXZlbnQudGFyZ2V0LmNoZWNrZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0aGVWYWwgPSBpc05hTihldmVudC50YXJnZXQudmFsdWUpID8gZXZlbnQudGFyZ2V0LnZhbHVlIDogcGFyc2VJbnQoZXZlbnQudGFyZ2V0LnZhbHVlKTtcbiAgICAgICAgICAgICAgICB2YWx1ZS5wdXNoKHRoZVZhbCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUuZmlsdGVyKCB2ID0+IHYgIT0gZXZlbnQudGFyZ2V0LnZhbHVlIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUuZmlsdGVyKHYgPT4gb3B0aW9uVmFsdWVzLmluY2x1ZGVzKHYpKTtcbiAgICAgICAgICAgIHZhbHVlLnB1c2goZXZlbnQudGFyZ2V0LnZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBldiA9IHt0YXJnZXQ6IHtcbiAgICAgICAgICAgICAgICBpZDogdGhpcy5wcm9wcy5pZCxcbiAgICAgICAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgICAgICAgdHlwZTogJ2NoZWNrYm94bGlzdCdcbiAgICAgICAgICAgIH19O1xuXG4gICAgICAgIHRoaXMucHJvcHMub25DaGFuZ2UoZXYpO1xuICAgIH1cblxuICAgIGhhbmRsZU90aGVyQ0JDaGFuZ2UoZXZlbnQpIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7b3RoZXJDaGVja2VkOiBldmVudC50YXJnZXQuY2hlY2tlZH0pO1xuICAgIH1cblxuICAgIHJlbmRlcigpIHtcblxuICAgICAgICBsZXQge29uQ2hhbmdlLCB2YWx1ZSwgY2xhc3NOYW1lLCBvcHRpb25zLCBpZCwgY2hpbGRyZW4sIGVycm9yLCBkaXNhYmxlZCxuYW1lLCBhcmlhTGFiZWxsZWRCeSwgLi4ucmVzdH0gPSB0aGlzLnByb3BzO1xuICAgICAgICBsZXQgeyBvdGhlckNoZWNrZWQgfSA9IHRoaXMuc3RhdGU7XG5cbiAgICAgICAgbGV0IGlubGluZSA9ICggdGhpcy5wcm9wcy5oYXNPd25Qcm9wZXJ0eSgnaW5saW5lJykgKTtcbiAgICAgICAgbGV0IGh0bWwgPSAoIHRoaXMucHJvcHMuaGFzT3duUHJvcGVydHkoJ2h0bWwnKSApO1xuICAgICAgICBsZXQgYWxsb3dPdGhlciA9ICggdGhpcy5wcm9wcy5oYXNPd25Qcm9wZXJ0eSgnYWxsb3dPdGhlcicpICk7XG4gICAgICAgIGxldCBvdGhlclZhbHVlID0gdmFsdWUgPyB2YWx1ZS5maW5kKCB2ID0+ICFvcHRpb25zLm1hcChvcCA9PiBvcC52YWx1ZSkuaW5jbHVkZXModikgKSA6IGZhbHNlIDtcbiAgICAgICAgbGV0IGhhc19lcnJvciA9ICggdGhpcy5wcm9wcy5oYXNPd25Qcm9wZXJ0eSgnZXJyb3InKSAmJiBlcnJvciAhPT0gJycgKTtcbiAgICAgICAgbGV0IGlzRGlzYWJsZWQgPSAodGhpcy5wcm9wcy5oYXNPd25Qcm9wZXJ0eSgnZGlzYWJsZWQnKSAmJiBkaXNhYmxlZCA9PSB0cnVlKTtcblxuXG4gICAgICAgIGxldCBzdHlsZSwgbGFiZWw7XG5cbiAgICAgICAgaWYgKGlubGluZSkge1xuICAgICAgICAgICAgc3R5bGUgPSB7XG4gICAgICAgICAgICAgICAgcGFkZGluZ0xlZnQ6ICcyMnB4JyxcbiAgICAgICAgICAgICAgICBtYXJnaW5MZWZ0OiAnMjBweCcsXG4gICAgICAgICAgICAgICAgZmxvYXQ6ICdsZWZ0J1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0eWxlID0ge1xuICAgICAgICAgICAgICAgIHBhZGRpbmdMZWZ0OiAnMjJweCcsXG4gICAgICAgICAgICAgICAgbWFyZ2luVG9wOiAnN3B4J1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxkaXYgaWQ9e2BjaGxfd3JhcHBlcl8ke2lkfWB9IGFyaWEtbGFiZWxsZWRieT17YXJpYUxhYmVsbGVkQnl9PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtcImNoZWNrYm94ZXMtZGl2XCIgKyAoaGFzX2Vycm9yID8gJyBlcnJvcicgOiAnJykgfT5cbiAgICAgICAgICAgICAgICAgICAgeyBvcHRpb25zLm1hcChvcCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY2hlY2tlZCA9IHZhbHVlID8gdmFsdWUuaW5jbHVkZXMob3AudmFsdWUpIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9ybS1jaGVjayBhYmMtY2hlY2tib3hcIiBrZXk9e1wicmFkaW9fa2V5X1wiICsgb3AudmFsdWV9IHN0eWxlPXtzdHlsZX0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9e2BjYl8ke2lkfV8ke29wLnZhbHVlfWB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPXtuYW1lPyBuYW1lIDogaWQgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tlZD17Y2hlY2tlZH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXtpc0Rpc2FibGVkfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e3RoaXMuaGFuZGxlQ2hhbmdlfSBjbGFzc05hbWU9XCJmb3JtLWNoZWNrLWlucHV0XCIgdmFsdWU9e29wLnZhbHVlfSAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3NOYW1lPVwiZm9ybS1jaGVjay1sYWJlbFwiIGh0bWxGb3I9e2BjYl8ke2lkfV8ke29wLnZhbHVlfWAgIH0gPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2h0bWwgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxSYXdIVE1MPntvcC5sYWJlbH08L1Jhd0hUTUw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IWh0bWwgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wLmxhYmVsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIH0pfVxuXG4gICAgICAgICAgICAgICAgICAgIHthbGxvd090aGVyICYmXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9ybS1jaGVjayBhYmMtY2hlY2tib3hcIiBzdHlsZT17c3R5bGV9PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPXtcImNiX290aGVyXCIgKyBpZH0gY2hlY2tlZD17b3RoZXJDaGVja2VkfSBkaXNhYmxlZD17aXNEaXNhYmxlZH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17dGhpcy5oYW5kbGVPdGhlckNCQ2hhbmdlfSBjbGFzc05hbWU9XCJmb3JtLWNoZWNrLWlucHV0XCIgdmFsdWU9XCJvdGhlclwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3NOYW1lPVwiZm9ybS1jaGVjay1sYWJlbFwiIGh0bWxGb3I9e1wiY2Jfb3RoZXJcIiArIGlkfT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7VC50cmFuc2xhdGUoXCJnZW5lcmFsLm90aGVyXCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB7YWxsb3dPdGhlciAmJiBvdGhlckNoZWNrZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT17e3BhZGRpbmdMZWZ0OiAnMjJweCcsIHdpZHRoOiAnNTAlJ319PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzTmFtZT1cImZvcm0tY29udHJvbFwiIGRpc2FibGVkPXtpc0Rpc2FibGVkfSBvbkNoYW5nZT17dGhpcy5oYW5kbGVDaGFuZ2V9IHZhbHVlPXtvdGhlclZhbHVlfSAvPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAge2hhc19lcnJvciAmJlxuICAgICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cImVycm9yLWxhYmVsXCI+e2Vycm9yfTwvcD5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKTtcblxuICAgIH1cbn1cblxuQ2hlY2tib3hMaXN0LmRlZmF1bHRQcm9wcyA9IHtcbiAgICBhcmlhTGFiZWxsZWRCeSA6IG51bGwsXG59XG5cblxuQ2hlY2tib3hMaXN0LnByb3BUeXBlcyA9IHtcbiAgICBpZDogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkXG59OyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTcgT3BlblN0YWNrIEZvdW5kYXRpb25cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKi9cblxuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBTZWxlY3QgZnJvbSAncmVhY3Qtc2VsZWN0JztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRHJvcGRvd24gZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgc3VwZXIocHJvcHMpO1xuXG4gICAgICAgIHRoaXMuaGFuZGxlQ2hhbmdlID0gdGhpcy5oYW5kbGVDaGFuZ2UuYmluZCh0aGlzKTtcbiAgICB9XG5cbiAgICBoYW5kbGVDaGFuZ2Uoc2VsZWN0aW9uKSB7XG5cbiAgICAgICAgbGV0IHZhbHVlID0gbnVsbDtcbiAgICAgICAgaWYgKHRoaXMucHJvcHMuaXNNdWx0aSkge1xuICAgICAgICAgICAgdmFsdWUgPSBzZWxlY3Rpb24gPyBzZWxlY3Rpb24ubWFwKHZhbCA9PiB2YWwudmFsdWUpIDogbnVsbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhbHVlID0gc2VsZWN0aW9uID8gc2VsZWN0aW9uLnZhbHVlIDogbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBldiA9IHt0YXJnZXQ6IHtcbiAgICAgICAgICAgICAgICBpZDogdGhpcy5wcm9wcy5pZCxcbiAgICAgICAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgICAgICAgdHlwZTogJ2Ryb3Bkb3duJ1xuICAgICAgICAgICAgfX07XG5cbiAgICAgICAgdGhpcy5wcm9wcy5vbkNoYW5nZShldik7XG4gICAgfVxuXG4gICAgcmVuZGVyKCkge1xuXG4gICAgICAgIGxldCB7b25DaGFuZ2UsIHZhbHVlLCBjbGFzc05hbWUsIGVycm9yLCBjbGVhcmFibGUsIGRpc2FibGVkLCBvdmVycmlkZUNTUywgYXJpYUxhYmVsbGVkQnksIC4uLnJlc3R9ID0gdGhpcy5wcm9wcztcbiAgICAgICAgbGV0IGhhc19lcnJvciA9ICggdGhpcy5wcm9wcy5oYXNPd25Qcm9wZXJ0eSgnZXJyb3InKSAmJiBlcnJvciAhPSAnJyApO1xuICAgICAgICBsZXQgaXNDbGVhcmFibGUgPSAodGhpcy5wcm9wcy5oYXNPd25Qcm9wZXJ0eSgnY2xlYXJhYmxlJykpO1xuICAgICAgICBsZXQgaXNEaXNhYmxlZCA9ICh0aGlzLnByb3BzLmhhc093blByb3BlcnR5KCdkaXNhYmxlZCcpICYmIGRpc2FibGVkID09IHRydWUpO1xuICAgICAgICBsZXQgdGhlVmFsdWUgPSBudWxsO1xuXG4gICAgICAgIGxldCBzZWxlY3RDbGFzc05hbWUgPSBjbGFzc05hbWU7XG5cbiAgICAgICAgaWYgKCF0aGlzLnByb3BzLmhhc093blByb3BlcnR5KCdvdmVycmlkZUNTUycpIHx8IG92ZXJyaWRlQ1NTID09IGZhbHNlKSB7XG4gICAgICAgICAgICBzZWxlY3RDbGFzc05hbWUgPSAnZHJvcGRvd24gJyArIGNsYXNzTmFtZSArICcgJyArIChoYXNfZXJyb3IgPyAnZXJyb3InIDogJycpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMucHJvcHMuaXNNdWx0aSkge1xuICAgICAgICAgICAgdGhlVmFsdWUgPSB0aGlzLnByb3BzLm9wdGlvbnMuZmlsdGVyKG9wID0+IHZhbHVlLmluY2x1ZGVzKG9wLnZhbHVlKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGVWYWx1ZSA9ICh2YWx1ZSBpbnN0YW5jZW9mIE9iamVjdCB8fCB2YWx1ZSA9PSBudWxsKSA/IHZhbHVlIDogdGhpcy5wcm9wcy5vcHRpb25zLmZpbmQob3B0ID0+IG9wdC52YWx1ZSA9PSB2YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzZWxlY3RTdHlsZXMgPSB7IG1lbnU6IHN0eWxlcyA9PiAoeyAuLi5zdHlsZXMsIHpJbmRleDogOTk5IH0pIH07XG5cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPFNlbGVjdFxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e3NlbGVjdENsYXNzTmFtZX1cbiAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3RoZVZhbHVlfVxuICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17dGhpcy5oYW5kbGVDaGFuZ2V9XG4gICAgICAgICAgICAgICAgICAgIGlzQ2xlYXJhYmxlPXtpc0NsZWFyYWJsZX1cbiAgICAgICAgICAgICAgICAgICAgaXNEaXNhYmxlZD17aXNEaXNhYmxlZH1cbiAgICAgICAgICAgICAgICAgICAgc3R5bGVzPXtzZWxlY3RTdHlsZXN9XG4gICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWxsZWRieT17YXJpYUxhYmVsbGVkQnl9XG4gICAgICAgICAgICAgICAgICAgIHsuLi5yZXN0fVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAge2hhc19lcnJvciAmJlxuICAgICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cImVycm9yLWxhYmVsXCI+e2Vycm9yfTwvcD5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKTtcblxuICAgIH1cbn1cblxuRHJvcGRvd24uZGVmYXVsdFByb3BzID0ge1xuICAgIGFyaWFMYWJlbGxlZEJ5IDogbnVsbCxcbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTggT3BlblN0YWNrIEZvdW5kYXRpb25cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKi9cblxuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBSYXdIVE1MIGZyb20gJy4uL3Jhdy1odG1sJztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmFkaW9MaXN0IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcblxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHN1cGVyKHByb3BzKTtcblxuICAgICAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgICAgICAgdmFsdWU6IHByb3BzLnZhbHVlLFxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuaGFuZGxlQ2hhbmdlID0gdGhpcy5oYW5kbGVDaGFuZ2UuYmluZCh0aGlzKTtcbiAgICB9XG5cbiAgICBoYW5kbGVDaGFuZ2Uoc2VsZWN0aW9uKSB7XG5cbiAgICAgICAgbGV0IGV2ID0ge3RhcmdldDoge1xuICAgICAgICAgICAgICAgIGlkOiB0aGlzLnByb3BzLmlkLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBzZWxlY3Rpb24udGFyZ2V0LnZhbHVlLFxuICAgICAgICAgICAgICAgIHR5cGU6ICdyYWRpbydcbiAgICAgICAgICAgIH19O1xuXG4gICAgICAgIHRoaXMucHJvcHMub25DaGFuZ2UoZXYpO1xuICAgIH1cblxuICAgIGdldExhYmVsKG9wdGlvbiwgaWQsIGlubGluZSwgc2ltcGxlLCBodG1sKSB7XG4gICAgICAgIGlmIChpbmxpbmUpIHtcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzTmFtZT1cImZvcm0tY2hlY2stbGFiZWxcIiBodG1sRm9yPXtgcmFkaW9fJHtpZH1fJHtvcHRpb24udmFsdWV9YH0gc3R5bGU9e3tkaXNwbGF5OiAnaW5saW5lLWJsb2NrJ319PlxuICAgICAgICAgICAgICAgICAgICB7aHRtbCAmJlxuICAgICAgICAgICAgICAgICAgICA8UmF3SFRNTD5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtvcHRpb24ubGFiZWx9XG4gICAgICAgICAgICAgICAgICAgIDwvUmF3SFRNTD5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB7IWh0bWwgJiZcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9uLmxhYmVsXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmIChzaW1wbGUpIHtcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzTmFtZT1cImZvcm0tY2hlY2stbGFiZWxcIiBodG1sRm9yPXtgcmFkaW9fJHtpZH1fJHtvcHRpb24udmFsdWV9YH0gPlxuICAgICAgICAgICAgICAgICAgICB7b3B0aW9uLmxhYmVsfVxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3NOYW1lPVwiZm9ybS1jaGVjay1sYWJlbFwiIGh0bWxGb3I9e2ByYWRpb18ke2lkfV8ke29wdGlvbi52YWx1ZX1gfSBzdHlsZT17e2Rpc3BsYXk6ICdpbmxpbmUtYmxvY2snfX0+XG4gICAgICAgICAgICAgICAgICAgIDxoNCBzdHlsZT17e21hcmdpblRvcDogJzBweCd9fT57b3B0aW9uLmxhYmVsfTwvaDQ+XG4gICAgICAgICAgICAgICAgICAgIDxSYXdIVE1MPntvcHRpb24uZGVzY3JpcHRpb259PC9SYXdIVE1MPlxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVuZGVyKCkge1xuXG4gICAgICAgIGxldCB7b25DaGFuZ2UsIHZhbHVlLCBjbGFzc05hbWUsIGVycm9yLCBhcmlhTGFiZWxsZWRCeSwgZGlzYWJsZWQsIG9wdGlvbnMsaWQsIG5hbWUsLi4ucmVzdH0gPSB0aGlzLnByb3BzO1xuICAgICAgICBsZXQgaGFzX2Vycm9yID0gKCB0aGlzLnByb3BzLmhhc093blByb3BlcnR5KCdlcnJvcicpICYmIGVycm9yICE9ICcnICk7XG4gICAgICAgIGxldCBpbmxpbmUgPSAoIHRoaXMucHJvcHMuaGFzT3duUHJvcGVydHkoJ2lubGluZScpICk7XG4gICAgICAgIGxldCBzaW1wbGUgPSAoIHRoaXMucHJvcHMuaGFzT3duUHJvcGVydHkoJ3NpbXBsZScpICk7XG4gICAgICAgIGxldCBodG1sID0gKCB0aGlzLnByb3BzLmhhc093blByb3BlcnR5KCdodG1sJykgKTtcbiAgICAgICAgbGV0IGlzRGlzYWJsZWQgPSAodGhpcy5wcm9wcy5oYXNPd25Qcm9wZXJ0eSgnZGlzYWJsZWQnKSAmJiBkaXNhYmxlZCA9PSB0cnVlKTtcblxuICAgICAgICBsZXQgc3R5bGUsIGxhYmVsO1xuXG4gICAgICAgIGlmIChpbmxpbmUpIHtcbiAgICAgICAgICAgIHN0eWxlID0ge1xuICAgICAgICAgICAgICAgIHBhZGRpbmdMZWZ0OiAnMjJweCcsXG4gICAgICAgICAgICAgICAgbWFyZ2luTGVmdDogJzIwcHgnLFxuICAgICAgICAgICAgICAgIGZsb2F0OiAnbGVmdCdcbiAgICAgICAgICAgIH07XG5cblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3R5bGUgPSB7XG4gICAgICAgICAgICAgICAgcGFkZGluZ0xlZnQ6ICcyMnB4J1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxkaXYgaWQ9e2BybF93cmFwcGVyXyR7aWR9YH0gYXJpYS1sYWJlbGxlZGJ5PXthcmlhTGFiZWxsZWRCeX0+XG4gICAgICAgICAgICAgICAgeyBvcHRpb25zLm1hcChvcCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjaGVja2VkID0gKG9wLnZhbHVlID09IHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9ybS1jaGVjayBhYmMtcmFkaW9cIiBrZXk9e2ByYWRpb19rZXlfJHtpZH1fJHtvcC52YWx1ZX1gfSBzdHlsZT17c3R5bGV9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJmb3JtLWNoZWNrLWlucHV0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInJhZGlvXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9e2ByYWRpb18ke2lkfV8ke29wLnZhbHVlfWB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtvcC52YWx1ZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tlZD17Y2hlY2tlZH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e3RoaXMuaGFuZGxlQ2hhbmdlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17aXNEaXNhYmxlZH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT17bmFtZSA/IG5hbWUgOiBgcmFkaW9fJHtpZH1gfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3RoaXMuZ2V0TGFiZWwob3AsIGlkLCBpbmxpbmUsIHNpbXBsZSwgaHRtbCl9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIH0pfVxuXG4gICAgICAgICAgICAgICAge2hhc19lcnJvciAmJlxuICAgICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cImVycm9yLWxhYmVsXCI+e2Vycm9yfTwvcD5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKTtcblxuICAgIH1cbn1cblxuUmFkaW9MaXN0LmRlZmF1bHRQcm9wcyA9IHtcbiAgICBhcmlhTGFiZWxsZWRCeSA6IG51bGwsXG59XG5cblJhZGlvTGlzdC5wcm9wVHlwZXMgPSB7XG4gICAgaWQ6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZFxufTsiLCIvKipcbiAqIENvcHlyaWdodCAyMDE3IE9wZW5TdGFjayBGb3VuZGF0aW9uXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiovXG5cbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIElucHV0IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcblxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHN1cGVyKHByb3BzKTtcblxuICAgICAgICB0aGlzLmhhbmRsZUNoYW5nZSA9IHRoaXMuaGFuZGxlQ2hhbmdlLmJpbmQodGhpcyk7XG4gICAgfVxuXG4gICAgY29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wcywgcHJldlN0YXRlLCBzbmFwc2hvdCkge1xuICAgICAgICBpZiAodGhpcy5wcm9wcy52YWx1ZSAhPT0gcHJldlByb3BzLnZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLmlucHV0LnZhbHVlID0gdGhpcy5wcm9wcy52YWx1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGhhbmRsZUNoYW5nZShldikge1xuICAgICAgICB0aGlzLnByb3BzLm9uQ2hhbmdlKGV2KTtcbiAgICB9XG5cbiAgICByZW5kZXIoKSB7XG5cbiAgICAgICAgbGV0IHtvbkNoYW5nZSwgdmFsdWUsIGNsYXNzTmFtZSwgZXJyb3IsIGFyaWFMYWJlbGxlZEJ5LCBjb250YWluZXJDbGFzc05hbWUsLi4ucmVzdH0gPSB0aGlzLnByb3BzO1xuICAgICAgICBsZXQgaGFzX2Vycm9yID0gKCB0aGlzLnByb3BzLmhhc093blByb3BlcnR5KCdlcnJvcicpICYmIGVycm9yICE9PSAnJyApO1xuICAgICAgICBsZXQgY2xhc3NfbmFtZSA9IHRoaXMucHJvcHMuaGFzT3duUHJvcGVydHkoJ2NsYXNzTmFtZScpID8gY2xhc3NOYW1lIDogJ2Zvcm0tY29udHJvbCc7XG4gICAgICAgIGxldCBjb250YWluZXJfY2xhc3NfbmFtZSA9IHRoaXMucHJvcHMuaGFzT3duUHJvcGVydHkoJ2NvbnRhaW5lckNsYXNzTmFtZScpID8gY29udGFpbmVyQ2xhc3NOYW1lIDogJ2NvbnRhaW5lci1mb3JtLWNvbnRyb2wnO1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e2NvbnRhaW5lcl9jbGFzc19uYW1lfT5cbiAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgJHtjbGFzc19uYW1lfSAke2hhc19lcnJvciA/ICdlcnJvcicgOiAnJ31gfVxuICAgICAgICAgICAgICAgICAgICByZWY9e25vZGUgPT4ge3RoaXMuaW5wdXQgPSBub2RlfX1cbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlPXt2YWx1ZX1cbiAgICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbGxlZGJ5PXthcmlhTGFiZWxsZWRCeX1cbiAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e3RoaXMuaGFuZGxlQ2hhbmdlfVxuICAgICAgICAgICAgICAgICAgICB7Li4ucmVzdH1cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIHtoYXNfZXJyb3IgJiZcbiAgICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJlcnJvci1sYWJlbFwiPntlcnJvcn08L3A+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICk7XG5cbiAgICB9XG59XG5cbklucHV0LmRlZmF1bHRQcm9wcyA9IHtcbiAgICBhcmlhTGFiZWxsZWRCeSA6IG51bGwsXG59IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcblxuY29uc3QgUmF3SFRNTCA9ICh7Y2hpbGRyZW4sIHJlcGxhY2VOZXdMaW5lID0gZmFsc2UsIGNsYXNzTmFtZSA9IFwiXCJ9KSA9PlxuICAgIDxzcGFuIGNsYXNzTmFtZT17Y2xhc3NOYW1lfVxuICAgICAgICAgIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MPXt7IF9faHRtbDogcmVwbGFjZU5ld0xpbmUgPyBjaGlsZHJlbj8ucmVwbGFjZSgvXFxuL2csICc8YnIgLz4nKSA6IGNoaWxkcmVufX0gLz5cblxuZXhwb3J0IGRlZmF1bHQgUmF3SFRNTDsiLCIvKipcbiAqIENvcHlyaWdodCAyMDE4IE9wZW5TdGFjayBGb3VuZGF0aW9uXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiovXG5cbmltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50LXRpbWV6b25lJztcbmltcG9ydCBVUkkgZnJvbSBcInVyaWpzXCI7XG5cbmV4cG9ydCBjb25zdCBmaW5kRWxlbWVudFBvcyA9IChvYmopID0+IHtcbiAgICB2YXIgY3VydG9wID0gLTcwO1xuICAgIGlmIChvYmoub2Zmc2V0UGFyZW50KSB7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIGN1cnRvcCArPSBvYmoub2Zmc2V0VG9wO1xuICAgICAgICB9IHdoaWxlIChvYmogPSBvYmoub2Zmc2V0UGFyZW50KTtcbiAgICAgICAgcmV0dXJuIFtjdXJ0b3BdO1xuICAgIH1cbn07XG5cbmV4cG9ydCBjb25zdCBlcG9jaFRvTW9tZW50ID0gKGF0aW1lKSA9PiB7XG4gICAgaWYoIWF0aW1lKSByZXR1cm4gYXRpbWU7XG4gICAgYXRpbWUgPSBhdGltZSAqIDEwMDA7XG4gICAgcmV0dXJuIG1vbWVudChhdGltZSk7XG59O1xuXG5leHBvcnQgY29uc3QgZXBvY2hUb01vbWVudFRpbWVab25lID0gKGF0aW1lLCB0aW1lX3pvbmUpID0+IHtcbiAgICBpZighYXRpbWUpIHJldHVybiBhdGltZTtcbiAgICBhdGltZSA9IGF0aW1lICogMTAwMDtcbiAgICByZXR1cm4gbW9tZW50KGF0aW1lKS50eih0aW1lX3pvbmUpO1xufTtcblxuZXhwb3J0IGNvbnN0IGZvcm1hdEVwb2NoID0gKGF0aW1lLCBmb3JtYXQgPSAnTS9EL1lZWVkgaDptbSBhJykgPT4ge1xuICAgIGlmKCFhdGltZSkgcmV0dXJuIGF0aW1lO1xuICAgIHJldHVybiBlcG9jaFRvTW9tZW50KGF0aW1lKS5mb3JtYXQoZm9ybWF0KTtcbn07XG5cbmV4cG9ydCBjb25zdCBvYmplY3RUb1F1ZXJ5U3RyaW5nID0gKG9iaikgPT4ge1xuICAgIHZhciBzdHIgPSBcIlwiO1xuICAgIGZvciAodmFyIGtleSBpbiBvYmopIHtcbiAgICAgICAgaWYgKHN0ciAhPSBcIlwiKSB7XG4gICAgICAgICAgICBzdHIgKz0gXCImXCI7XG4gICAgICAgIH1cbiAgICAgICAgc3RyICs9IGtleSArIFwiPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KG9ialtrZXldKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3RyO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEJhY2tVUkwgPSAoKSA9PiB7XG4gICAgbGV0IHVybCAgICAgID0gVVJJKHdpbmRvdy5sb2NhdGlvbi5ocmVmKTtcbiAgICBsZXQgcXVlcnkgICAgPSB1cmwuc2VhcmNoKHRydWUpO1xuICAgIGxldCBmcmFnbWVudCA9IHVybC5mcmFnbWVudCgpO1xuICAgIGxldCBiYWNrVXJsICA9IHF1ZXJ5Lmhhc093blByb3BlcnR5KCdCYWNrVXJsJykgPyBxdWVyeVsnQmFja1VybCddIDogbnVsbDtcbiAgICBpZihmcmFnbWVudCAhPSBudWxsICYmIGZyYWdtZW50ICE9ICcnKXtcbiAgICAgICAgYmFja1VybCArPSBgIyR7ZnJhZ21lbnR9YDtcbiAgICB9XG4gICAgcmV0dXJuIGJhY2tVcmw7XG59O1xuXG5leHBvcnQgY29uc3QgdG9TbHVnID0gKHRleHQpID0+e1xuICAgIHRleHQgPSB0ZXh0LnRvTG93ZXJDYXNlKCk7XG4gICAgcmV0dXJuIHRleHQucmVwbGFjZSgvW15hLXpBLVowLTldKy9nLCdfJyk7XG59XG5cbmV4cG9ydCBjb25zdCBnZXRBdXRoQ2FsbGJhY2sgPSAoKSA9PiB7XG4gICAgaWYodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIGAke3dpbmRvdy5sb2NhdGlvbi5vcmlnaW59L2F1dGgvY2FsbGJhY2tgO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRDdXJyZW50TG9jYXRpb24gPSAoKSA9PiB7XG4gICAgbGV0IGxvY2F0aW9uID0gJyc7XG4gICAgaWYodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgbG9jYXRpb24gPSB3aW5kb3cubG9jYXRpb247XG4gICAgICAgIC8vIGNoZWNrIGlmIHdlIGFyZSBvbiBpZnJhbWVcbiAgICAgICAgaWYgKHdpbmRvdy50b3ApXG4gICAgICAgICAgICBsb2NhdGlvbiA9IHdpbmRvdy50b3AubG9jYXRpb247XG4gICAgfVxuICAgIHJldHVybiBsb2NhdGlvbjtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRPcmlnaW4gPSAoKSA9PiB7XG4gICAgaWYodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIHdpbmRvdy5sb2NhdGlvbi5vcmlnaW47XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEN1cnJlbnRQYXRoTmFtZSA9ICgpID0+IHtcbiAgICBpZih0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgIHJldHVybiB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWU7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEN1cnJlbnRIcmVmID0gKCkgPT4ge1xuICAgIGlmKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiB3aW5kb3cubG9jYXRpb24uaHJlZjtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0QWxsb3dlZFVzZXJHcm91cHMgPSAoKSA9PiB7XG4gICAgaWYodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIHdpbmRvdy5BTExPV0VEX1VTRVJfR1JPVVBTIHx8ICcnO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn07XG5cbmV4cG9ydCBjb25zdCBidWlsZEFQSUJhc2VVcmwgPSAocmVsYXRpdmVVcmwpID0+IHtcbiAgICBpZih0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyl7XG4gICAgICAgIHJldHVybiBgJHt3aW5kb3cuQVBJX0JBU0VfVVJMfSR7cmVsYXRpdmVVcmx9YDtcbiAgICB9XG4gICAgcmV0dXJuIG51bGxgYDtcbn07XG5cbmV4cG9ydCBjb25zdCBwdXRPbkxvY2FsU3RvcmFnZSA9IChrZXksIHZhbHVlKSA9PiB7XG4gICAgaWYodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgd2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKGtleSwgdmFsdWUpO1xuICAgIH1cbn07XG5cbmV4cG9ydCBjb25zdCBnZXRGcm9tTG9jYWxTdG9yYWdlID0gKGtleSwgcmVtb3ZlSXQpID0+IHtcbiAgICBpZih0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBsZXQgdmFsID0gd2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKGtleSk7XG4gICAgICAgIGlmKHJlbW92ZUl0KXtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBnZXRGcm9tTG9jYWxTdG9yYWdlIHJlbW92aW5nIGtleSAke2tleX1gKTtcbiAgICAgICAgICAgIHJlbW92ZUZyb21Mb2NhbFN0b3JhZ2Uoa2V5KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn07XG5cbmV4cG9ydCBjb25zdCByZW1vdmVGcm9tTG9jYWxTdG9yYWdlID0gKGtleSkgPT4ge1xuICAgIGlmKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShrZXkpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNvbnN0IGlzQ2xlYXJpbmdTZXNzaW9uU3RhdGUgPSAoKSA9PiB7XG4gICAgaWYodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIHdpbmRvdy5jbGVhcmluZ19zZXNzaW9uX3N0YXRlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59O1xuXG5leHBvcnQgY29uc3Qgc2V0U2Vzc2lvbkNsZWFyaW5nU3RhdGUgPSAodmFsKSA9PiB7XG4gICAgaWYodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgd2luZG93LmNsZWFyaW5nX3Nlc3Npb25fc3RhdGUgPSB2YWw7XG4gICAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGdldEN1cnJlbnRVc2VyTGFuZ3VhZ2UgPSAoKSA9PiB7XG4gICAgbGV0IGxhbmd1YWdlID0gJ2VuJztcbiAgICBpZih0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBsYW5ndWFnZSA9IChuYXZpZ2F0b3IubGFuZ3VhZ2VzICYmIG5hdmlnYXRvci5sYW5ndWFnZXNbMF0pIHx8IG5hdmlnYXRvci5sYW5ndWFnZSB8fCBuYXZpZ2F0b3IudXNlckxhbmd1YWdlO1xuICAgIH1cbiAgICByZXR1cm4gbGFuZ3VhZ2U7XG59O1xuXG5leHBvcnQgY29uc3Qgc2Nyb2xsVG9FcnJvciA9IChlcnJvcnMpID0+IHtcbiAgICBpZihPYmplY3Qua2V5cyhlcnJvcnMpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgZmlyc3RFcnJvciA9IE9iamVjdC5rZXlzKGVycm9ycylbMF07XG4gICAgICAgIGNvbnN0IGZpcnN0Tm9kZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGZpcnN0RXJyb3IpO1xuICAgICAgICBpZiAoZmlyc3ROb2RlKSB3aW5kb3cuc2Nyb2xsVG8oMCwgZmluZEVsZW1lbnRQb3MoZmlyc3ROb2RlKSk7XG4gICAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGhhc0Vycm9ycyA9IChmaWVsZCwgZXJyb3JzKSA9PiB7XG4gICAgaWYoZmllbGQgaW4gZXJyb3JzKSB7XG4gICAgICAgIHJldHVybiBlcnJvcnNbZmllbGRdO1xuICAgIH1cbiAgICByZXR1cm4gJyc7XG59O1xuXG5leHBvcnQgY29uc3Qgc2hhbGxvd0VxdWFsID0gKG9iamVjdDEsIG9iamVjdDIpID0+IHtcbiAgICBjb25zdCBrZXlzMSA9IE9iamVjdC5rZXlzKG9iamVjdDEpO1xuICAgIGNvbnN0IGtleXMyID0gT2JqZWN0LmtleXMob2JqZWN0Mik7XG5cbiAgICBpZiAoa2V5czEubGVuZ3RoICE9PSBrZXlzMi5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGZvciAobGV0IGtleSBvZiBrZXlzMSkge1xuICAgICAgICBpZiAob2JqZWN0MVtrZXldICE9PSBvYmplY3QyW2tleV0pIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xufTtcblxuZXhwb3J0IGNvbnN0IGFycmF5c0VxdWFsID0gKGExLCBhMikgPT5cbiAgICBhMS5sZW5ndGggPT09IGEyLmxlbmd0aCAmJiBhMS5ldmVyeSgobywgaWR4KSA9PiBzaGFsbG93RXF1YWwobywgYTJbaWR4XSkpO1xuXG5leHBvcnQgY29uc3QgaXNFbXB0eSA9IChvYmopID0+IHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMob2JqKS5sZW5ndGggPT09IDA7XG59O1xuXG5cbmV4cG9ydCBjb25zdCBiYXNlNjRVUkxFbmNvZGUgPSAoc3RyKSA9PiB7XG4gICAgcmV0dXJuIHN0clxuICAgICAgICAudG9TdHJpbmcoJ2Jhc2U2NCcpXG4gICAgICAgIC5yZXBsYWNlKC9cXCsvZywgJy0nKVxuICAgICAgICAucmVwbGFjZSgvXFwvL2csICdfJylcbiAgICAgICAgLnJlcGxhY2UoLz0vZywgJycpXG59XG5cbmV4cG9ydCBjb25zdCByZXRyeVByb21pc2UgPSBhc3luYyAoXG4gICAgY2IsXG4gICAgbWF4TnVtYmVyT2ZSZXRyaWVzID0gM1xuKSA9PiB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXhOdW1iZXJPZlJldHJpZXM7IGkrKykge1xuICAgICAgICBpZiAoYXdhaXQgY2IoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmV4cG9ydCBjb25zdCBnZXRUaW1lU2VydmljZVVybCA9ICgpID0+IHtcbiAgICBpZih0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gd2luZG93LlRJTUVJTlRFUlZBTFNJTkNFMTk3MF9BUElfVVJMIHx8IHByb2Nlc3MuZW52LlRJTUVJTlRFUlZBTFNJTkNFMTk3MF9BUElfVVJMO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn07XG4iLCJleHBvcnQgY29uc3QgQ2hlY2tCb3hRdWVzdGlvblR5cGUgPSAnQ2hlY2tCb3gnO1xuZXhwb3J0IGNvbnN0IENvbWJvQm94UXVlc3Rpb25UeXBlID0gJ0NvbWJvQm94J1xuZXhwb3J0IGNvbnN0IENoZWNrQm94TGlzdFF1ZXN0aW9uVHlwZSA9ICdDaGVja0JveExpc3QnO1xuZXhwb3J0IGNvbnN0IFJhZGlvQnV0dG9uTGlzdFF1ZXN0aW9uVHlwZSA9ICdSYWRpb0J1dHRvbkxpc3QnO1xuZXhwb3J0IGNvbnN0IEFsbG93ZWRNdWx0aXBsZVZhbHVlUXVlc3Rpb25UeXBlID0gW0NvbWJvQm94UXVlc3Rpb25UeXBlLCBDaGVja0JveExpc3RRdWVzdGlvblR5cGUsIFJhZGlvQnV0dG9uTGlzdFF1ZXN0aW9uVHlwZV07XG5leHBvcnQgY29uc3QgQW5zd2VyVmFsdWVzT3BlcmF0b3JfQW5kID0gJ0FuZCc7XG5leHBvcnQgY29uc3QgQW5zd2VyVmFsdWVzT3BlcmF0b3JfT3IgPSAnT3InO1xuZXhwb3J0IGNvbnN0IFZpc2liaWxpdHlDb25kaXRpb25fRXF1YWwgPSAnRXF1YWwnO1xuZXhwb3J0IGNvbnN0IFZpc2liaWxpdHlDb25kaXRpb25fTm90RXF1YWwgPSAnTm90RXF1YWwnO1xuZXhwb3J0IGNvbnN0IFZpc2liaWxpdHlfVmlzaWJsZSA9ICdWaXNpYmxlJztcbmV4cG9ydCBjb25zdCBNYWluUXVlc3Rpb25DbGFzc1R5cGUgPSAnTWFpblF1ZXN0aW9uJztcbmltcG9ydCB7dG9TbHVnfSBmcm9tIFwiLi9tZXRob2RzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFF1ZXN0aW9uc1NldCB7XG5cbiAgICBjb25zdHJ1Y3RvcihxdWVzdGlvbnMsIGFuc3dlcnMgPSBbXSkge1xuICAgICAgICB0aGlzLnF1ZXN0aW9ucyA9IHF1ZXN0aW9ucztcbiAgICAgICAgdGhpcy5vcmlnaW5hbEFuc3dlcnMgPSBhbnN3ZXJzXG4gICAgICAgIHRoaXMuYW5zd2VycyA9IFtdO1xuICAgICAgICAvLyBtYXAgYW5zd2VycyB0byBhc3NvY2lhdGUgYXJyYXlcbiAgICAgICAgZm9yIChsZXQgYSBvZiB0aGlzLm9yaWdpbmFsQW5zd2VycylcbiAgICAgICAgICAgIHRoaXMuYW5zd2Vyc1thLnF1ZXN0aW9uX2lkXSA9IGE7XG4gICAgICAgIHRoaXMucXVlc3Rpb25CeU5hbWUgPSB7fVxuICAgICAgICB0aGlzLnF1ZXN0aW9uQnlJZCA9IHt9XG4gICAgICAgIC8vIGFzc29jaWF0aXZlIGFycmF5ICggcnVsZSBpZCAsIHJ1bGUpO1xuICAgICAgICB0aGlzLnJ1bGVzID0ge307XG4gICAgICAgIHRoaXMuX3BhcnNlUXVlc3Rpb25zKCk7XG4gICAgfVxuXG4gICAgX3BhcnNlUXVlc3Rpb24gPSAocSkgPT4ge1xuICAgICAgICB0aGlzLnF1ZXN0aW9uQnlOYW1lW3RvU2x1ZyhxLm5hbWUpXSA9IHE7XG4gICAgICAgIHRoaXMucXVlc3Rpb25CeUlkW3BhcnNlSW50KHEuaWQpXSA9IHE7XG4gICAgICAgIGlmKHEuaGFzT3duUHJvcGVydHkoJ3N1Yl9xdWVzdGlvbl9ydWxlcycpKVxuICAgICAgICAgICAgZm9yIChsZXQgciBvZiBxLnN1Yl9xdWVzdGlvbl9ydWxlcykge1xuICAgICAgICAgICAgICAgIHRoaXMucnVsZXNbcGFyc2VJbnQoci5pZCldID0gcjtcbiAgICAgICAgICAgICAgICB0aGlzLl9wYXJzZVF1ZXN0aW9uKHIuc3ViX3F1ZXN0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICB9XG5cbiAgICBfcGFyc2VRdWVzdGlvbnMgPSAoKSA9PiB7XG4gICAgICAgIGZvciAobGV0IHEgb2YgdGhpcy5xdWVzdGlvbnMpIHtcbiAgICAgICAgICAgIHRoaXMuX3BhcnNlUXVlc3Rpb24ocSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfYWxsb3dzVmFsdWVzID0gKHEpID0+IHtcbiAgICAgICAgcmV0dXJuIEFsbG93ZWRNdWx0aXBsZVZhbHVlUXVlc3Rpb25UeXBlLmluY2x1ZGVzKHEudHlwZSk7XG4gICAgfVxuXG4gICAgX2FsbG93c1ZhbHVlID0gKHEsIGFuc3dlcikgPT4ge1xuICAgICAgICBsZXQgdmFsdWUgPSBhbnN3ZXIudmFsdWUuc3BsaXQoJywnKS5tYXAodiA9PiBwYXJzZUludCh2KSk7XG4gICAgICAgIGZvciAobGV0IGF2IG9mIHZhbHVlKSB7XG4gICAgICAgICAgICBpZiAoIXEudmFsdWVzLm1hcChlID0+IGUuaWQpLmluY2x1ZGVzKGF2KSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgX2dldEFuc3dlckZvciA9IChxKSA9PiB7XG4gICAgICAgIGxldCBpZCA9IE51bWJlci5pc0ludGVnZXIocSkgPyBxIDogcS5pZDtcbiAgICAgICAgbGV0IGEgPSB0aGlzLmFuc3dlcnNbaWRdIHx8IG51bGw7XG4gICAgICAgIHJldHVybiBhID8gYSA6IG51bGw7XG4gICAgfVxuXG4gICAgX2hhc1ZhbHVlID0gKGFuc3dlcikgPT4ge1xuICAgICAgICByZXR1cm4gYW5zd2VyLnZhbHVlICE9PSAnJztcbiAgICB9XG5cbiAgICBfYW5zd2VyQ29udGFpbnMgPSAoYW5zd2VyLCB2YWwpID0+IHtcbiAgICAgICAgcmV0dXJuIGFuc3dlci52YWx1ZS5zcGxpdCgnLCcpLmluY2x1ZGVzKHZhbCk7XG4gICAgfVxuXG4gICAgX2lzU3ViUXVlc3Rpb25WaXNpYmxlID0gKHJ1bGUpID0+IHtcbiAgICAgICAgbGV0IGluaXRpYWxDb25kaXRpb24gPSBydWxlLmFuc3dlcl92YWx1ZXNfb3BlcmF0b3IgPT09IEFuc3dlclZhbHVlc09wZXJhdG9yX0FuZCA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgY29uc3QgcGFyZW50UXVlc3Rpb25BbnN3ZXIgPSB0aGlzLl9nZXRBbnN3ZXJGb3IocnVsZS5wYXJlbnRfcXVlc3Rpb25faWQpO1xuICAgICAgICBpZiAoIXBhcmVudFF1ZXN0aW9uQW5zd2VyKSB7XG4gICAgICAgICAgICBpbml0aWFsQ29uZGl0aW9uID0gcnVsZS52aXNpYmlsaXR5X2NvbmRpdGlvbiA9PT0gVmlzaWJpbGl0eUNvbmRpdGlvbl9FcXVhbCA/IGZhbHNlIDogdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN3aXRjaCAocnVsZS52aXNpYmlsaXR5X2NvbmRpdGlvbikge1xuICAgICAgICAgICAgICAgIGNhc2UgVmlzaWJpbGl0eUNvbmRpdGlvbl9FcXVhbDoge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBhbnN3ZXJWYWx1ZSBvZiBydWxlLmFuc3dlcl92YWx1ZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydWxlLmFuc3dlcl92YWx1ZXNfb3BlcmF0b3IgPT09IEFuc3dlclZhbHVlc09wZXJhdG9yX0FuZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsQ29uZGl0aW9uID0gaW5pdGlhbENvbmRpdGlvbiAmJiB0aGlzLl9hbnN3ZXJDb250YWlucyhwYXJlbnRRdWVzdGlvbkFuc3dlciwgYW5zd2VyVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxDb25kaXRpb24gPSBpbml0aWFsQ29uZGl0aW9uIHx8IHRoaXMuX2Fuc3dlckNvbnRhaW5zKHBhcmVudFF1ZXN0aW9uQW5zd2VyLCBhbnN3ZXJWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgVmlzaWJpbGl0eUNvbmRpdGlvbl9Ob3RFcXVhbDoge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBhbnN3ZXJWYWx1ZSBvZiBydWxlLmFuc3dlcl92YWx1ZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydWxlLmFuc3dlcl92YWx1ZXNfb3BlcmF0b3IgPT09IEFuc3dlclZhbHVlc09wZXJhdG9yX0FuZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsQ29uZGl0aW9uID0gaW5pdGlhbENvbmRpdGlvbiAmJiAhdGhpcy5fYW5zd2VyQ29udGFpbnMocGFyZW50UXVlc3Rpb25BbnN3ZXIsIGFuc3dlclZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsQ29uZGl0aW9uID0gaW5pdGlhbENvbmRpdGlvbiB8fCAhdGhpcy5fYW5zd2VyQ29udGFpbnMocGFyZW50UXVlc3Rpb25BbnN3ZXIsIGFuc3dlclZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gZmluYWwgdmlzaWJpbGl0eSBjaGVja1xuICAgICAgICBpZiAocnVsZS52aXNpYmlsaXR5ID09PSBWaXNpYmlsaXR5X1Zpc2libGUpIHtcbiAgICAgICAgICAgIHJldHVybiBpbml0aWFsQ29uZGl0aW9uO1xuICAgICAgICB9XG4gICAgICAgIC8vIG5vdCB2aXNpYmxlXG4gICAgICAgIHJldHVybiAhaW5pdGlhbENvbmRpdGlvbjtcbiAgICB9XG5cbiAgICBfaXNBbnN3ZXJlZCA9IChxKSA9PiB7XG4gICAgICAgIGNvbnN0IGFuc3dlciA9IHRoaXMuX2dldEFuc3dlckZvcihxKTtcblxuICAgICAgICBpZiAocS5jbGFzcyA9PT0gTWFpblF1ZXN0aW9uQ2xhc3NUeXBlKSB7XG4gICAgICAgICAgICBpZiAoIXEubWFuZGF0b3J5KSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIGlmICghYW5zd2VyKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX2hhc1ZhbHVlKGFuc3dlcikpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGlmICh0aGlzLl9hbGxvd3NWYWx1ZXMocSkgJiYgIXRoaXMuX2FsbG93c1ZhbHVlKHEsIGFuc3dlcikpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjaGVjayBwYXJlbnQgcnVsZXMgLi4uXG4gICAgICAgIGZvciAobGV0IHJ1bGVJZCBvZiBxLnBhcmVudF9ydWxlcykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLl9pc1N1YlF1ZXN0aW9uVmlzaWJsZSh0aGlzLnJ1bGVzW3J1bGVJZF0pKSAvLyBpZiBxdWVzdGlvbiBpcyBub3QgdmlzaWJsZSBza2lwIGl0XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBpZiAoIXEubWFuZGF0b3J5KSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIGlmICghYW5zd2VyKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX2hhc1ZhbHVlKGFuc3dlcikpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGlmICh0aGlzLl9hbGxvd3NWYWx1ZXMocSkgJiYgIXRoaXMuX2FsbG93c1ZhbHVlKHEsIGFuc3dlcikpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBfY2hlY2tRdWVzdGlvbiA9IChxKSA9PiB7XG4gICAgICAgIGxldCByZXMgPSB0aGlzLl9pc0Fuc3dlcmVkKHEpO1xuICAgICAgICBpZihxLmhhc093blByb3BlcnR5KCdzdWJfcXVlc3Rpb25fcnVsZXMnKSlcbiAgICAgICAgICAgIGZvciAobGV0IHJ1bGUgb2YgcS5zdWJfcXVlc3Rpb25fcnVsZXMpIHtcbiAgICAgICAgICAgICAgICAvLyBjaGVjayByZWN1cnNpdmUgYWxsIHRoZSB0cmVlIHRpbGwgbGVhdmVzIC4uLlxuICAgICAgICAgICAgICAgIHJlcyA9IHJlcyAmJiB0aGlzLl9jaGVja1F1ZXN0aW9uKHJ1bGUuc3ViX3F1ZXN0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICBfZm9ybWF0UXVlc3Rpb25BbnN3ZXIgPSAocXVlc3Rpb24pID0+IHtcbiAgICAgICAgbGV0IHJlcyA9IHt9O1xuICAgICAgICBjb25zdCBzbHVnID0gdG9TbHVnKHF1ZXN0aW9uLm5hbWUpO1xuICAgICAgICBsZXQgdXNlckFuc3dlciA9IHRoaXMub3JpZ2luYWxBbnN3ZXJzLmZpbmQoYSA9PiBhLnF1ZXN0aW9uX2lkID09PSBxdWVzdGlvbi5pZCk/LnZhbHVlO1xuXG4gICAgICAgIGlmKHVzZXJBbnN3ZXIpIHtcbiAgICAgICAgICAgIGlmIChxdWVzdGlvbi50eXBlID09PSBDaGVja0JveFF1ZXN0aW9uVHlwZSkgdXNlckFuc3dlciA9IHVzZXJBbnN3ZXIgPT09ICdmYWxzZScgPyBmYWxzZSA6ICEhdXNlckFuc3dlcjtcbiAgICAgICAgICAgIGlmIChxdWVzdGlvbi50eXBlID09PSBSYWRpb0J1dHRvbkxpc3RRdWVzdGlvblR5cGUgfHwgcXVlc3Rpb24udHlwZSA9PT0gQ29tYm9Cb3hRdWVzdGlvblR5cGUpIHVzZXJBbnN3ZXIgPSBwYXJzZUludCh1c2VyQW5zd2VyKTtcbiAgICAgICAgICAgIGlmIChxdWVzdGlvbi50eXBlID09PSBDaGVja0JveExpc3RRdWVzdGlvblR5cGUpIHVzZXJBbnN3ZXIgPSB1c2VyQW5zd2VyLnNwbGl0KCcsJykubWFwKGFuc1ZhbCA9PiBwYXJzZUludChhbnNWYWwpKSB8fCBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlc1tzbHVnXSA9ICB1c2VyQW5zd2VyIHx8ICcnO1xuICAgICAgICBpZihxdWVzdGlvbi50eXBlID09PSBDaGVja0JveExpc3RRdWVzdGlvblR5cGUgJiYgcmVzW3NsdWddID09PSAnJykgcmVzW3NsdWddID0gW11cbiAgICAgICAgaWYocXVlc3Rpb24uaGFzT3duUHJvcGVydHkoJ3N1Yl9xdWVzdGlvbl9ydWxlcycpKVxuICAgICAgICAgICAgZm9yIChsZXQgcnVsZSBvZiBxdWVzdGlvbi5zdWJfcXVlc3Rpb25fcnVsZXMpIHtcbiAgICAgICAgICAgICAgICAvLyBjaGVjayByZWN1cnNpdmUgYWxsIHRoZSB0cmVlIHRpbGwgbGVhdmVzIC4uLlxuICAgICAgICAgICAgICAgIGxldCByZXMxID0gdGhpcy5fZm9ybWF0UXVlc3Rpb25BbnN3ZXIocnVsZS5zdWJfcXVlc3Rpb24pO1xuICAgICAgICAgICAgICAgIHJlcyA9IHsuLi5yZXMsIC4uLnJlczF9O1xuICAgICAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIGZvcm1hdEFuc3dlcnMgPSAoKSA9PiB7XG4gICAgICAgIGxldCByZXMgPSB7fVxuICAgICAgICB0aGlzLnF1ZXN0aW9ucy5mb3JFYWNoKHEgPT4ge1xuICAgICAgICAgICAgbGV0IHJlczEgPSB0aGlzLl9mb3JtYXRRdWVzdGlvbkFuc3dlcihxKTtcbiAgICAgICAgICAgIHJlcyA9IHsuLi5yZXMsLi4ucmVzMX07XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIGNvbXBsZXRlZCA9ICgpID0+IHtcbiAgICAgICAgbGV0IHJlcyA9IHRydWU7XG4gICAgICAgIGZvciAobGV0IHEgb2YgdGhpcy5xdWVzdGlvbnMpIHtcbiAgICAgICAgICAgIHJlcyA9IHJlcyAmJiB0aGlzLl9jaGVja1F1ZXN0aW9uKHEpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgZ2V0UXVlc3Rpb25CeU5hbWUgPSAobmFtZSkgPT4ge1xuICAgICAgICBjb25zdCBzbHVnID0gdG9TbHVnKG5hbWUpXG4gICAgICAgIHJldHVybiB0aGlzLnF1ZXN0aW9uQnlOYW1lW25hbWVdIHx8IHRoaXMucXVlc3Rpb25CeU5hbWVbc2x1Z10gIHx8IG51bGw7XG4gICAgfVxuXG4gICAgZ2V0UXVlc3Rpb25CeUlkID0gKGlkKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnF1ZXN0aW9uQnlJZFtwYXJzZUludChpZCldIHx8IG51bGw7XG4gICAgfVxufVxuIiwiLy8gZXh0cmFjdGVkIGJ5IG1pbmktY3NzLWV4dHJhY3QtcGx1Z2luXG5leHBvcnQge307IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2V4dGVuZHNcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJpMThuLXJlYWN0L2Rpc3QvaTE4bi1yZWFjdFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJtb21lbnQtdGltZXpvbmVcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwicHJvcC10eXBlc1wiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJyZWFjdFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJyZWFjdC1maW5hbC1mb3JtXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInJlYWN0LXNlbGVjdFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJ1cmlqc1wiKTsiLCIvLyBUaGUgbW9kdWxlIGNhY2hlXG52YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG5cbi8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG5mdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuXHR2YXIgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0aWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuXHR9XG5cdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG5cdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuXHRcdC8vIG5vIG1vZHVsZS5pZCBuZWVkZWRcblx0XHQvLyBubyBtb2R1bGUubG9hZGVkIG5lZWRlZFxuXHRcdGV4cG9ydHM6IHt9XG5cdH07XG5cblx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG5cdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdKG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG5cdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG5cdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbn1cblxuIiwiLy8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbl9fd2VicGFja19yZXF1aXJlX18ubiA9IChtb2R1bGUpID0+IHtcblx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG5cdFx0KCkgPT4gKG1vZHVsZVsnZGVmYXVsdCddKSA6XG5cdFx0KCkgPT4gKG1vZHVsZSk7XG5cdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsIHsgYTogZ2V0dGVyIH0pO1xuXHRyZXR1cm4gZ2V0dGVyO1xufTsiLCIvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9ucyBmb3IgaGFybW9ueSBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSAoZXhwb3J0cywgZGVmaW5pdGlvbikgPT4ge1xuXHRmb3IodmFyIGtleSBpbiBkZWZpbml0aW9uKSB7XG5cdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGRlZmluaXRpb24sIGtleSkgJiYgIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBrZXkpKSB7XG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywga2V5LCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZGVmaW5pdGlvbltrZXldIH0pO1xuXHRcdH1cblx0fVxufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSAob2JqLCBwcm9wKSA9PiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCkpIiwiLy8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yID0gKGV4cG9ydHMpID0+IHtcblx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG5cdH1cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbn07IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxNyBPcGVuU3RhY2sgRm91bmRhdGlvblxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqL1xuXG5pbXBvcnQgUmVhY3QsIHtGcmFnbWVudCwgdXNlRWZmZWN0LCB1c2VSZWYsIHVzZVN0YXRlLCB1c2VJbXBlcmF0aXZlSGFuZGxlfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuXG5pbXBvcnQgUmF3SFRNTCBmcm9tICcuLi9yYXctaHRtbCdcbmltcG9ydCBJbnB1dCBmcm9tICcuLi9pbnB1dHMvdGV4dC1pbnB1dCdcbmltcG9ydCBEcm9wZG93biBmcm9tICcuLi9pbnB1dHMvZHJvcGRvd24nXG5pbXBvcnQgUmFkaW9MaXN0IGZyb20gJy4uL2lucHV0cy9yYWRpby1saXN0J1xuaW1wb3J0IENoZWNrYm94TGlzdCBmcm9tICcuLi9pbnB1dHMvY2hlY2tib3gtbGlzdCdcbmltcG9ydCBRdWVzdGlvbnNTZXQgZnJvbSAnLi4vLi4vdXRpbHMvcXVlc3Rpb25zLXNldCc7XG5pbXBvcnQge0ZpZWxkLCBGb3JtfSBmcm9tIFwicmVhY3QtZmluYWwtZm9ybVwiO1xuaW1wb3J0ICcuL2luZGV4LnNjc3MnO1xuaW1wb3J0IHt0b1NsdWd9IGZyb20gXCIuLi8uLi91dGlscy9tZXRob2RzXCI7XG5cbmNvbnN0IElucHV0QWRhcHRlciA9ICh7IGlucHV0LCBtZXRhLCBxdWVzdGlvbiwgY2xhc3NOYW1lLCBpc0Rpc2FibGVkLCBpc1JlcXVpcmVkLCAuLi5yZXN0IH0pID0+IHtcblxuICAgIHJldHVybiAoXG4gICAgICAgIDxJbnB1dFxuICAgICAgICAgICAgey4uLmlucHV0fVxuICAgICAgICAgICAgey4uLnJlc3R9XG4gICAgICAgICAgICBjb250YWluZXJDbGFzc05hbWU9e2NsYXNzTmFtZX1cbiAgICAgICAgICAgIG5hbWU9e3RvU2x1ZyhxdWVzdGlvbi5uYW1lKX1cbiAgICAgICAgICAgIGFyaWFMYWJlbGxlZEJ5PXtgJHt0b1NsdWcocXVlc3Rpb24ubmFtZSl9IGxhYmVsYH1cbiAgICAgICAgICAgIGlkPXt0b1NsdWcocXVlc3Rpb24ubmFtZSl9XG4gICAgICAgICAgICB2YWx1ZT17aW5wdXQudmFsdWV9XG4gICAgICAgICAgICBkaXNhYmxlZD17aXNEaXNhYmxlZH1cbiAgICAgICAgICAgIHJlcXVpcmVkPXtpc1JlcXVpcmVkfVxuICAgICAgICAgICAgb25DaGFuZ2U9e2lucHV0Lm9uQ2hhbmdlfVxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9e3F1ZXN0aW9uLnBsYWNlaG9sZGVyfVxuICAgICAgICAvPlxuICAgIClcbn1cblxuY29uc3QgUmFkaW9CdXR0b25MaXN0QWRhcHRlciA9ICh7IGlucHV0LCBtZXRhLCBxdWVzdGlvbiwgaXNEaXNhYmxlZCwgaXNSZXF1aXJlZCwgLi4ucmVzdCB9KSA9PiB7XG5cbiAgICByZXR1cm4gKFxuICAgICAgICA8UmFkaW9MaXN0XG4gICAgICAgICAgICB7Li4uaW5wdXR9XG4gICAgICAgICAgICB7Li4ucmVzdH1cbiAgICAgICAgICAgIG5hbWU9e3RvU2x1ZyhxdWVzdGlvbi5uYW1lKX1cbiAgICAgICAgICAgIGFyaWFMYWJlbGxlZEJ5PXtgJHt0b1NsdWcocXVlc3Rpb24ubmFtZSl9IGxhYmVsYH1cbiAgICAgICAgICAgIGlkPXt0b1NsdWcocXVlc3Rpb24ubmFtZSl9XG4gICAgICAgICAgICBvdmVycmlkZUNTUz17dHJ1ZX1cbiAgICAgICAgICAgIHZhbHVlPXtpbnB1dC52YWx1ZX1cbiAgICAgICAgICAgIGRpc2FibGVkPXtpc0Rpc2FibGVkfVxuICAgICAgICAgICAgcmVxdWlyZWQ9e2lzUmVxdWlyZWR9XG4gICAgICAgICAgICBvbkNoYW5nZT17aW5wdXQub25DaGFuZ2V9XG4gICAgICAgIC8+XG4gICAgKX07XG5cbmNvbnN0IERyb3Bkb3duQWRhcHRlciA9ICh7IGlucHV0LCBtZXRhLCBxdWVzdGlvbiwgaXNEaXNhYmxlZCwgaXNSZXF1aXJlZCwgLi4ucmVzdCB9KSA9PiB7XG5cbiAgICByZXR1cm4gKDxEcm9wZG93blxuICAgICAgICB7Li4uaW5wdXR9XG4gICAgICAgIHsuLi5yZXN0fVxuICAgICAgICBuYW1lPXt0b1NsdWcocXVlc3Rpb24ubmFtZSl9XG4gICAgICAgIGFyaWFMYWJlbGxlZEJ5PXtgJHt0b1NsdWcocXVlc3Rpb24ubmFtZSl9IGxhYmVsYH1cbiAgICAgICAgaWQ9e3RvU2x1ZyhxdWVzdGlvbi5uYW1lKX1cbiAgICAgICAgb3ZlcnJpZGVDU1M9e3RydWV9XG4gICAgICAgIHZhbHVlPXtpbnB1dC52YWx1ZX1cbiAgICAgICAgZGlzYWJsZWQ9e2lzRGlzYWJsZWR9XG4gICAgICAgIHJlcXVpcmVkPXtpc1JlcXVpcmVkfVxuICAgICAgICBvbkNoYW5nZT17aW5wdXQub25DaGFuZ2V9XG4gICAgLz4pXG59XG5cbmNvbnN0IENoZWNrQm94TGlzdEFkYXB0ZXIgPSAoeyBpbnB1dCwgbWV0YSwgcXVlc3Rpb24sIGlzRGlzYWJsZWQsIGlzUmVxdWlyZWQsIG1heFZhbHVlcywgLi4ucmVzdCB9KSA9PiB7XG5cbiAgICBjb25zdCBzaG91bGRDaGFuZ2UgPSAoZXYpID0+IHtcbiAgICAgICAgY29uc3QgcXVlc3Rpb25fYW5zd2VycyA9IGV2LnRhcmdldC52YWx1ZTtcbiAgICAgICAgLy8gaWYgdGhlcmUncyBhIG1heCB2YWx1ZSBvZiBvcHRpb25zIGNoZWNrZWQgYW5kIHRoZSB2YWx1ZSBmcm9tIHRoZSBpbnB1dCBpcyBoaWdoZXIgdGhhbiB0aGUgbWF4LCBkb24ndCBjaGFuZ2UgdGhlIHZhbHVlXG4gICAgICAgIGlmIChtYXhWYWx1ZXMgPiAwICYmIHF1ZXN0aW9uX2Fuc3dlcnMubGVuZ3RoID4gbWF4VmFsdWVzKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpbnB1dC5vbkNoYW5nZShldilcbiAgICB9XG4gICAgcmV0dXJuIChcbiAgICAgICAgPENoZWNrYm94TGlzdFxuICAgICAgICAgICAgey4uLmlucHV0fVxuICAgICAgICAgICAgey4uLnJlc3R9XG4gICAgICAgICAgICBpZD17dG9TbHVnKHF1ZXN0aW9uLm5hbWUpfVxuICAgICAgICAgICAgbmFtZT17dG9TbHVnKHF1ZXN0aW9uLm5hbWUpfVxuICAgICAgICAgICAgYXJpYUxhYmVsbGVkQnk9e2Ake3RvU2x1ZyhxdWVzdGlvbi5uYW1lKX0gbGFiZWxgfVxuICAgICAgICAgICAgdmFsdWU9e2lucHV0LnZhbHVlfVxuICAgICAgICAgICAgZGlzYWJsZWQ9e2lzRGlzYWJsZWR9XG4gICAgICAgICAgICByZXF1aXJlZD17aXNSZXF1aXJlZH1cbiAgICAgICAgICAgIG9uQ2hhbmdlPXtzaG91bGRDaGFuZ2V9XG4gICAgICAgIC8+XG4gICAgKVxufVxuXG5jb25zdCBnZXRWYWxpZGF0b3IgPSBpc1JlcXVpcmVkID0+XG4gICAgaXNSZXF1aXJlZCA/IHZhbHVlID0+ICh2YWx1ZSA/IHVuZGVmaW5lZCA6IFwiUmVxdWlyZWRcIikgOiAoKSA9PiB7fTtcblxuY29uc3QgRXh0cmFRdWVzdGlvbnNGb3JtID0gUmVhY3QuZm9yd2FyZFJlZigoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhUXVlc3Rpb25zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJBbnN3ZXJzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQW5zd2VyQ2hhbmdlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSAncXVlc3Rpb25zLWZvcm0nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXN0aW9uQ29udGFpbmVyQ2xhc3NOYW1lID0gJ3F1ZXN0aW9uLWNvbnRhaW5lcicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlc3Rpb25MYWJlbENvbnRhaW5lckNsYXNzTmFtZSA9ICdxdWVzdGlvbi1sYWJlbC1jb250YWluZXInLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXN0aW9uQ29udHJvbENvbnRhaW5lckNsYXNzTmFtZT0gJ3F1ZXN0aW9uLWNvbnRyb2wtY29udGFpbmVyJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkT25seSA9IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnID0gZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9uVGV4dCA9ICdTdWJtaXQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcXVpcmVkRXJyb3JNZXNzYWdlID0gJ1JlcXVpcmVkJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0aW9uRXJyb3JDbGFzc05hbWUgPSAnZXh0cmEtcXVlc3Rpb24tZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93RXh0cmFRdWVzdGlvbnNFZGl0ID0gdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkVycm9yID0gKGUpID0+IGNvbnNvbGUubG9nKCdmb3JtIGVycm9yczogJywgZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkU2Nyb2xsMkZpcnN0RXJyb3IgPSB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCByZWYpID0+IHtcblxuICAgIGxldCBzdWJtaXQgPSBudWxsO1xuXG4gICAgY29uc3QgcXVlc3Rpb25SZWYgPSB1c2VSZWYoe30pO1xuICAgIGNvbnN0IGZvcm1SZWYgPSB1c2VSZWYobnVsbCk7XG4gICAgY29uc3QgW2Fuc3dlcnMsIHNldEFuc3dlcnNdID0gdXNlU3RhdGUoe30pO1xuXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgZm9ybWF0VXNlckFuc3dlcnMoKTtcbiAgICB9LCBbZXh0cmFRdWVzdGlvbnNdKVxuXG5cbiAgICAvLyBAc2VlIGh0dHBzOi8vYmV0YS5yZWFjdGpzLm9yZy9yZWZlcmVuY2UvcmVhY3QvdXNlSW1wZXJhdGl2ZUhhbmRsZVxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCAoKSA9PiAoe1xuICAgICAgICBkb1N1Ym1pdCgpIHtcbiAgICAgICAgICAgIGZvcm1SZWYuY3VycmVudC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChcInN1Ym1pdFwiLCB7IGNhbmNlbGFibGU6IHRydWUsIGJ1YmJsZXM6IHRydWUgfSkpO1xuICAgICAgICB9XG4gICAgfSkpO1xuXG4gICAgY29uc3QgZm9ybWF0VXNlckFuc3dlcnMgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHFzID0gbmV3IFF1ZXN0aW9uc1NldChleHRyYVF1ZXN0aW9ucywgdXNlckFuc3dlcnMpO1xuICAgICAgICBzZXRBbnN3ZXJzKHFzLmZvcm1hdEFuc3dlcnMoKSk7XG4gICAgfVxuXG4gICAgY29uc3QgQ29uZGl0aW9uID0gKHt3aGVuLCBydWxlLCBjaGlsZHJlbn0pID0+IChcbiAgICAgICAgPEZpZWxkIG5hbWU9e3doZW59IHN1YnNjcmlwdGlvbj17e3ZhbHVlOiB0cnVlfX0+XG4gICAgICAgICAgICB7KHtpbnB1dDoge3ZhbHVlfX0pID0+XG4gICAgICAgICAgICAgICAgY2hlY2tWaXNpYmlsaXR5KHJ1bGUsIGNoZWNrUnVsZSh2YWx1ZSwgcnVsZSksIGNoaWxkcmVuKVxuICAgICAgICAgICAgfVxuICAgICAgICA8L0ZpZWxkPlxuICAgICk7XG5cbiAgICBjb25zdCBFcnJvciA9ICh7IG5hbWUgfSkgPT4gKFxuICAgICAgICA8RmllbGQgbmFtZT17bmFtZX0gc3Vic2NyaXB0aW9uPXt7IGVycm9yOiB0cnVlLCB0b3VjaGVkOiB0cnVlIH19PlxuICAgICAgICAgICAgeyh7IG1ldGE6IHsgZXJyb3IsIHRvdWNoZWQgfSB9KSA9PlxuICAgICAgICAgICAgICAgIGVycm9yICYmIHRvdWNoZWQgPyA8ZGl2IGNsYXNzTmFtZT17VmFsaWRhdGlvbkVycm9yQ2xhc3NOYW1lfT57ZXJyb3J9PC9kaXY+IDogbnVsbFxuICAgICAgICAgICAgfVxuICAgICAgICA8L0ZpZWxkPlxuICAgIClcblxuICAgIGNvbnN0IGNoZWNrUnVsZSA9ICh2YWx1ZSwgcnVsZSkgPT4ge1xuICAgICAgICBsZXQgdmFsdWVzID0gcnVsZS5hbnN3ZXJfdmFsdWVzO1xuXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgaWYgKCF2YWx1ZS5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGxldCByZXMgPSBydWxlLmFuc3dlcl92YWx1ZXNfb3BlcmF0b3IgPT09IFwiQW5kXCI7XG4gICAgICAgICAgICB2YWx1ZXMuZm9yRWFjaCgodikgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChydWxlLmFuc3dlcl92YWx1ZXNfb3BlcmF0b3IgPT09IFwiQW5kXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzID0gcmVzICYmIHZhbHVlLmluY2x1ZGVzKHBhcnNlSW50KHYpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBPclxuICAgICAgICAgICAgICAgICAgICByZXMgPSByZXMgfHwgdmFsdWUuaW5jbHVkZXMocGFyc2VJbnQodikpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWVzLmluY2x1ZGVzKHZhbHVlLnRvU3RyaW5nKCkpO1xuICAgIH07XG5cbiAgICBjb25zdCBjaGVja1Zpc2liaWxpdHkgPSAocnVsZSwgcnVsZVJlc3VsdCwgY2hpbGRyZW4pID0+IHtcbiAgICAgICAgaWYgKHJ1bGUudmlzaWJpbGl0eSA9PT0gXCJWaXNpYmxlXCIpIHtcbiAgICAgICAgICAgIGlmIChydWxlLnZpc2liaWxpdHlfY29uZGl0aW9uID09PSBcIkVxdWFsXCIpIHtcbiAgICAgICAgICAgICAgICBpZihydWxlUmVzdWx0KSByZXR1cm4gY2hpbGRyZW47XG4gICAgICAgICAgICAgICAgZGVsZXRlIHF1ZXN0aW9uUmVmLmN1cnJlbnRbcnVsZS5zdWJfcXVlc3Rpb24uaWRdXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBOb24gRXF1YWxcbiAgICAgICAgICAgIGlmKCFydWxlUmVzdWx0KXtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2hpbGRyZW47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWxldGUgcXVlc3Rpb25SZWYuY3VycmVudFtydWxlLnN1Yl9xdWVzdGlvbi5pZF1cbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIC8vIG5vdCB2aXNpYmxlXG4gICAgICAgIGlmIChydWxlLnZpc2liaWxpdHlfY29uZGl0aW9uID09PSBcIkVxdWFsXCIpIHtcbiAgICAgICAgICAgIGlmKCFydWxlUmVzdWx0KSByZXR1cm4gY2hpbGRyZW47XG4gICAgICAgICAgICBkZWxldGUgcXVlc3Rpb25SZWYuY3VycmVudFtydWxlLnN1Yl9xdWVzdGlvbi5pZF1cbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmKHJ1bGVSZXN1bHQpIHJldHVybiBjaGlsZHJlbjtcbiAgICAgICAgZGVsZXRlIHF1ZXN0aW9uUmVmLmN1cnJlbnRbcnVsZS5zdWJfcXVlc3Rpb24uaWRdXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG5cbiAgICBjb25zdCBnZXRMYWJlbCA9IChxKSA9PiB7XG4gICAgICAgIC8vIEtlZXAgdGhlIGxhc3Qgd29yZCBhbmQgdGhlIHJlcXVpcmVkIGFzdGVyaXNrIG9uIHRoZSBzYW1lIGxpbmVcbiAgICAgICAgY29uc3Qgbm9uQnJlYWtpbmdTcGFjZSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoMTYwKTsgLy8gZXF1YWxzIHRvICZuYnNwO1xuICAgICAgICBcbiAgICAgICAgLy8gVXNpbmcgYnJvd3NlciBwYXJzZXIgaXNudGVhZCBvZiByZWdleCB0byBhdm9pZCBwb3NzaWJsZSBpc3N1ZXNcbiAgICAgICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgZGl2LmlubmVySFRNTCA9IHEubGFiZWw7XG4gICAgICAgIGNvbnN0IGxhYmVsID0gZGl2LnRleHRDb250ZW50IHx8IGRpdi5pbm5lclRleHQgfHwgXCJcIjtcblxuICAgICAgICBjb25zdCBsYWJlbFRleHQgPSBxLm1hbmRhdG9yeSA/IGAke2xhYmVsfSR7bm9uQnJlYWtpbmdTcGFjZX08Yj4qPC9iPmAgOiBsYWJlbFxuICAgICAgICBjb25zdCBsYWJlbEhUTUwgPSBgPGxhYmVsIGlkPVwiJHt0b1NsdWcocS5uYW1lKX0gbGFiZWxcIiBodG1sRm9yPVwiJHt0b1NsdWcocS5uYW1lKX1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtsYWJlbFRleHR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPmBcblxuICAgICAgICByZXR1cm4gbGFiZWxIVE1MO1xuICAgIH1cblxuICAgIGNvbnN0IGlzQW5zd2VyZWQgPSAocSwgYW5zd2VycykgPT4ge1xuICAgICAgICBjb25zdCBzbHVnID0gdG9TbHVnKHEubmFtZSk7XG4gICAgICAgIGlmKCFhbnN3ZXJzLmhhc093blByb3BlcnR5KHNsdWcpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGNvbnN0IGFuc3dlciA9IGFuc3dlcnNbc2x1Z107XG4gICAgICAgIC8vIGNoZWNrIHR5cGVcbiAgICAgICAgaWYoQXJyYXkuaXNBcnJheShhbnN3ZXIpKSByZXR1cm4gYW5zd2VyLmxlbmd0aCA+IDA7XG4gICAgICAgIGlmICh0eXBlb2YgYW5zd2VyID09PSAnc3RyaW5nJykgcmV0dXJuIGFuc3dlci5sZW5ndGggPiAwO1xuICAgICAgICBpZih0eXBlb2YgYW5zd2VyID09PSAnbnVtYmVyJykgcmV0dXJuIGFuc3dlciA+IDA7XG4gICAgICAgIGlmKHR5cGVvZiBhbnN3ZXIgPT09ICdib29sZWFuJykgcmV0dXJuIGFuc3dlcjtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IHJlbmRlclF1ZXN0aW9uID0gKHEpID0+IHtcbiAgICAgICAgbGV0IHF1ZXN0aW9uVmFsdWVzID0gcS52YWx1ZXM7XG4gICAgICAgIC8vIGRpc2FibGUgZmllbGQgaWYgZWRpdCBpc24ndCBhbGxvd2VkIGFuZCB0aGUgcXVlc3Rpb25zIGlzIGFuc3dlcmVkXG4gICAgICAgIGNvbnN0IGlzRGlzYWJsZWQgPSAhYWxsb3dFeHRyYVF1ZXN0aW9uc0VkaXQgJiYgaXNBbnN3ZXJlZChxLCBhbnN3ZXJzKTtcbiAgICAgICAgLy8gQHNlZSBodHRwczovL2NvZGVzYW5kYm94LmlvL3MvdmcwNXk/ZmlsZT0vaW5kZXguanNcbiAgICAgICAgaWYgKHEudHlwZSA9PT0gXCJUZXh0XCIpIHtcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgPEZyYWdtZW50IGtleT17dG9TbHVnKHEubmFtZSl9PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IHJlZj17ZWwgPT4gcXVlc3Rpb25SZWYuY3VycmVudFtxLmlkXSA9IGVsfSBjbGFzc05hbWU9e3F1ZXN0aW9uQ29udGFpbmVyQ2xhc3NOYW1lfT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxSYXdIVE1MIGNsYXNzTmFtZT17cXVlc3Rpb25MYWJlbENvbnRhaW5lckNsYXNzTmFtZX0+e2dldExhYmVsKHEpfTwvUmF3SFRNTD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtxdWVzdGlvbkNvbnRyb2xDb250YWluZXJDbGFzc05hbWV9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxGaWVsZCBuYW1lPXt0b1NsdWcocS5uYW1lKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlc3Rpb249e3F9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzRGlzYWJsZWQ9e2lzRGlzYWJsZWR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUmVxdWlyZWQ9e3EubWFuZGF0b3J5fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZT17Z2V0VmFsaWRhdG9yKHEubWFuZGF0b3J5KX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50PXtJbnB1dEFkYXB0ZXJ9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8RXJyb3IgbmFtZT17dG9TbHVnKHEubmFtZSl9Lz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAge3Euc3ViX3F1ZXN0aW9uX3J1bGVzPy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgICAgICAgICAgIHEuc3ViX3F1ZXN0aW9uX3J1bGVzLm1hcCgocikgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Q29uZGl0aW9uIGtleT17ci5pZH0gd2hlbj17dG9TbHVnKHEubmFtZSl9IHJ1bGU9e3J9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cmVuZGVyUXVlc3Rpb24oci5zdWJfcXVlc3Rpb24pfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvQ29uZGl0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgIDwvRnJhZ21lbnQ+XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChxLnR5cGUgPT09IFwiVGV4dEFyZWFcIikge1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICA8RnJhZ21lbnQga2V5PXt0b1NsdWcocS5uYW1lKX0+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgcmVmPXtlbCA9PiBxdWVzdGlvblJlZi5jdXJyZW50W3EuaWRdID0gZWx9IGNsYXNzTmFtZT17cXVlc3Rpb25Db250YWluZXJDbGFzc05hbWV9PlxuICAgICAgICAgICAgICAgICAgICAgICAgPFJhd0hUTUwgY2xhc3NOYW1lPXtxdWVzdGlvbkxhYmVsQ29udGFpbmVyQ2xhc3NOYW1lfT57Z2V0TGFiZWwocSl9PC9SYXdIVE1MPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e3F1ZXN0aW9uQ29udHJvbENvbnRhaW5lckNsYXNzTmFtZX0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPEZpZWxkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlPXtnZXRWYWxpZGF0b3IocS5tYW5kYXRvcnkpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPXt0b1NsdWcocS5uYW1lKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9e3RvU2x1ZyhxLm5hbWUpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17aXNEaXNhYmxlZH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ9e3EubWFuZGF0b3J5fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQ9XCJ0ZXh0YXJlYVwiLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8RXJyb3IgbmFtZT17dG9TbHVnKHEubmFtZSl9Lz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAge3Euc3ViX3F1ZXN0aW9uX3J1bGVzPy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgICAgICAgICAgIHEuc3ViX3F1ZXN0aW9uX3J1bGVzLm1hcCgocikgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Q29uZGl0aW9uIGtleT17ci5pZH0gd2hlbj17dG9TbHVnKHEubmFtZSl9IHJ1bGU9e3J9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cmVuZGVyUXVlc3Rpb24oci5zdWJfcXVlc3Rpb24pfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvQ29uZGl0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgIDwvRnJhZ21lbnQ+XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChxLnR5cGUgPT09IFwiQ2hlY2tCb3hcIikge1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICA8RnJhZ21lbnQga2V5PXt0b1NsdWcocS5uYW1lKX0+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgcmVmPXtlbCA9PiBxdWVzdGlvblJlZi5jdXJyZW50W3EuaWRdID0gZWx9IHN0eWxlPXt7ZGlzcGxheTogJ2ZsZXgnfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e3F1ZXN0aW9uQ29udGFpbmVyQ2xhc3NOYW1lfT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxSYXdIVE1MIGNsYXNzTmFtZT17YGVxLWNoZWNrYm94LWxhYmVsICR7cXVlc3Rpb25MYWJlbENvbnRhaW5lckNsYXNzTmFtZX1gfT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Z2V0TGFiZWwocSl9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L1Jhd0hUTUw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17cXVlc3Rpb25Db250cm9sQ29udGFpbmVyQ2xhc3NOYW1lfT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvcm0tY2hlY2sgYWJjLWNoZWNrYm94XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxGaWVsZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT17dG9TbHVnKHEubmFtZSl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZD17dG9TbHVnKHEubmFtZSl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZT17Z2V0VmFsaWRhdG9yKHEubWFuZGF0b3J5KX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXtpc0Rpc2FibGVkfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ9e3EubWFuZGF0b3J5fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZvcm0tY2hlY2staW5wdXRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50PVwiaW5wdXRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3NOYW1lPVwiZm9ybS1jaGVjay1sYWJlbFwiIGh0bWxGb3I9e3RvU2x1ZyhxLm5hbWUpfS8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxFcnJvciBuYW1lPXt0b1NsdWcocS5uYW1lKX0vPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICB7cS5zdWJfcXVlc3Rpb25fcnVsZXM/Lmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICAgICAgICAgICAgcS5zdWJfcXVlc3Rpb25fcnVsZXMubWFwKChyKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxDb25kaXRpb24ga2V5PXtyLmlkfSB3aGVuPXt0b1NsdWcocS5uYW1lKX0gcnVsZT17cn0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtyZW5kZXJRdWVzdGlvbihyLnN1Yl9xdWVzdGlvbil9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9Db25kaXRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgPC9GcmFnbWVudD5cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHEudHlwZSA9PT0gXCJSYWRpb0J1dHRvbkxpc3RcIikge1xuICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHF1ZXN0aW9uVmFsdWVzLm1hcCh2YWwgPT4gKHtsYWJlbCA6IHZhbC5sYWJlbCwgdmFsdWUgOiB2YWwuaWR9KSk7XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIDxGcmFnbWVudCBrZXk9e3RvU2x1ZyhxLm5hbWUpfT5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBrZXk9e3RvU2x1ZyhxLm5hbWUpfSByZWY9e2VsID0+IHF1ZXN0aW9uUmVmLmN1cnJlbnRbcS5pZF0gPSBlbH0gY2xhc3NOYW1lPXtxdWVzdGlvbkNvbnRhaW5lckNsYXNzTmFtZX0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8UmF3SFRNTCBjbGFzc05hbWU9e3F1ZXN0aW9uTGFiZWxDb250YWluZXJDbGFzc05hbWV9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtnZXRMYWJlbChxKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvUmF3SFRNTD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtxdWVzdGlvbkNvbnRyb2xDb250YWluZXJDbGFzc05hbWV9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxGaWVsZCBuYW1lPXt0b1NsdWcocS5uYW1lKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucz17b3B0aW9uc31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlc3Rpb249e3F9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlPXtnZXRWYWxpZGF0b3IocS5tYW5kYXRvcnkpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0Rpc2FibGVkPXtpc0Rpc2FibGVkfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1JlcXVpcmVkPXtxLm1hbmRhdG9yeX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50PXtSYWRpb0J1dHRvbkxpc3RBZGFwdGVyfSAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxFcnJvciBuYW1lPXt0b1NsdWcocS5uYW1lKX0vPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICB7cS5zdWJfcXVlc3Rpb25fcnVsZXM/Lmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICAgICAgICAgICAgcS5zdWJfcXVlc3Rpb25fcnVsZXMubWFwKChyKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxDb25kaXRpb24ga2V5PXtyLmlkfSB3aGVuPXt0b1NsdWcocS5uYW1lKX0gcnVsZT17cn0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtyZW5kZXJRdWVzdGlvbihyLnN1Yl9xdWVzdGlvbil9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9Db25kaXRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgPC9GcmFnbWVudD5cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHEudHlwZSA9PT0gXCJDb21ib0JveFwiKSB7XG4gICAgICAgICAgICBjb25zdCBvcHRpb25zID0gcXVlc3Rpb25WYWx1ZXMubWFwKHZhbCA9PiAoe2xhYmVsIDogdmFsLmxhYmVsLCB2YWx1ZSA6IHZhbC5pZH0pKTtcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgPEZyYWdtZW50IGtleT17dG9TbHVnKHEubmFtZSl9PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IHJlZj17ZWwgPT4gcXVlc3Rpb25SZWYuY3VycmVudFtxLmlkXSA9IGVsfSBjbGFzc05hbWU9e3F1ZXN0aW9uQ29udGFpbmVyQ2xhc3NOYW1lfT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxSYXdIVE1MIGNsYXNzTmFtZT17cXVlc3Rpb25MYWJlbENvbnRhaW5lckNsYXNzTmFtZX0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge2dldExhYmVsKHEpfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9SYXdIVE1MPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e3F1ZXN0aW9uQ29udHJvbENvbnRhaW5lckNsYXNzTmFtZX0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPEZpZWxkIG5hbWU9e3RvU2x1ZyhxLm5hbWUpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zPXtvcHRpb25zfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVzdGlvbj17cX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGU9e2dldFZhbGlkYXRvcihxLm1hbmRhdG9yeSl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzRGlzYWJsZWQ9e2lzRGlzYWJsZWR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUmVxdWlyZWQ9e3EubWFuZGF0b3J5fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQ9e0Ryb3Bkb3duQWRhcHRlcn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxFcnJvciBuYW1lPXt0b1NsdWcocS5uYW1lKX0vPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICB7cS5zdWJfcXVlc3Rpb25fcnVsZXM/Lmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICAgICAgICAgICAgcS5zdWJfcXVlc3Rpb25fcnVsZXMubWFwKChyKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxDb25kaXRpb24ga2V5PXtyLmlkfSB3aGVuPXt0b1NsdWcocS5uYW1lKX0gcnVsZT17cn0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtyZW5kZXJRdWVzdGlvbihyLnN1Yl9xdWVzdGlvbil9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9Db25kaXRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgPC9GcmFnbWVudD5cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHEudHlwZSA9PT0gXCJDaGVja0JveExpc3RcIikge1xuICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHF1ZXN0aW9uVmFsdWVzLm1hcCh2YWwgPT4gKHtsYWJlbCA6IHZhbC5sYWJlbCwgdmFsdWUgOiB2YWwuaWR9KSk7XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIDxGcmFnbWVudCBrZXk9e3RvU2x1ZyhxLm5hbWUpfT5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiByZWY9e2VsID0+IHF1ZXN0aW9uUmVmLmN1cnJlbnRbcS5pZF0gPSBlbH0gY2xhc3NOYW1lPXtxdWVzdGlvbkNvbnRhaW5lckNsYXNzTmFtZX0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8UmF3SFRNTCBjbGFzc05hbWU9e3F1ZXN0aW9uTGFiZWxDb250YWluZXJDbGFzc05hbWV9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtnZXRMYWJlbChxKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvUmF3SFRNTD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtxdWVzdGlvbkNvbnRyb2xDb250YWluZXJDbGFzc05hbWV9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxGaWVsZCBuYW1lPXt0b1NsdWcocS5uYW1lKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtxdWVzdGlvbkNvbnRyb2xDb250YWluZXJDbGFzc05hbWV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlPXtnZXRWYWxpZGF0b3IocS5tYW5kYXRvcnkpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zPXtvcHRpb25zfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVzdGlvbj17cX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4VmFsdWVzPXtxLm1heF9zZWxlY3RlZF92YWx1ZXN9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzRGlzYWJsZWQ9e2lzRGlzYWJsZWR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUmVxdWlyZWQ9e3EubWFuZGF0b3J5fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQ9e0NoZWNrQm94TGlzdEFkYXB0ZXJ9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8RXJyb3IgbmFtZT17dG9TbHVnKHEubmFtZSl9Lz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAge3Euc3ViX3F1ZXN0aW9uX3J1bGVzPy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgICAgICAgICAgIHEuc3ViX3F1ZXN0aW9uX3J1bGVzLm1hcCgocikgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Q29uZGl0aW9uIGtleT17ci5pZH0gd2hlbj17dG9TbHVnKHEubmFtZSl9IHJ1bGU9e3J9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cmVuZGVyUXVlc3Rpb24oci5zdWJfcXVlc3Rpb24pfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvQ29uZGl0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgIDwvRnJhZ21lbnQ+XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG5cbiAgICBjb25zdCBpc1Zpc2libGUgPSAocSkgPT4ge1xuICAgICAgICByZXR1cm4gISFxdWVzdGlvblJlZi5jdXJyZW50W3EuaWRdO1xuICAgIH07XG5cbiAgICBjb25zdCB2YWxpZGF0ZVF1ZXN0aW9uID0gKHEsIHZhbHVlcywgZXJyb3JzKSA9PiB7XG4gICAgICAgIGlmIChxLm1hbmRhdG9yeSAmJiBpc1Zpc2libGUocSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHNsdWcgPSB0b1NsdWcocS5uYW1lKTtcbiAgICAgICAgICAgIGlmICghdmFsdWVzLmhhc093blByb3BlcnR5KHRvU2x1ZyhzbHVnKSkgfHwgdmFsdWVzW3RvU2x1ZyhzbHVnKV0gPT09IFwiXCIgfHwgdmFsdWVzW3NsdWddLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGVycm9yc1tzbHVnXSA9IFJlcXVpcmVkRXJyb3JNZXNzYWdlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIHZhbGlkYXRlIHN1YiBydWxlc1xuICAgICAgICBxLnN1Yl9xdWVzdGlvbl9ydWxlcz8uZm9yRWFjaCgocikgPT4ge1xuICAgICAgICAgICAgdmFsaWRhdGVRdWVzdGlvbihyLnN1Yl9xdWVzdGlvbiwgdmFsdWVzLCBlcnJvcnMpO1xuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgY29uc3Qgb25TdWJtaXQgPSAodmFsdWVzKSA9PiB7XG4gICAgICAgIG9uQW5zd2VyQ2hhbmdlcyh2YWx1ZXMpXG4gICAgfTtcblxuICAgIGNvbnN0IHZhbGlkYXRlID0gKHZhbHVlcykgPT4ge1xuICAgICAgICBjb25zdCBlcnJvcnMgPSB7fTtcbiAgICAgICAgZXh0cmFRdWVzdGlvbnMuZm9yRWFjaCggcSA9PiB7XG4gICAgICAgICAgICB2YWxpZGF0ZVF1ZXN0aW9uKHEsIHZhbHVlcywgZXJyb3JzKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBlcnJvcnM7XG4gICAgfVxuXG4gICAgaWYoIU9iamVjdC5rZXlzKGFuc3dlcnMpLmxlbmd0aCkgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCBnZXRFcnJvckZpZWxkcyA9IChxLCBpbnZhbGlkRm9ybUZpZWxkcywgZXJyb3JGaWVsZHMpID0+IHtcbiAgICAgICAgaWYgKGludmFsaWRGb3JtRmllbGRzLmluY2x1ZGVzKHRvU2x1ZyhxLm5hbWUpKSkge1xuICAgICAgICAgICAgZXJyb3JGaWVsZHMucHVzaChxKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBmaW5kIGVycm9ycyBvbiBzdWIgcnVsZXNcbiAgICAgICAgcS5zdWJfcXVlc3Rpb25fcnVsZXM/LmZvckVhY2goKHIpID0+IHtcbiAgICAgICAgICAgIGdldEVycm9yRmllbGRzKHIuc3ViX3F1ZXN0aW9uLCBpbnZhbGlkRm9ybUZpZWxkcywgZXJyb3JGaWVsZHMpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBnZXRGaXJzdEVycm9yID0gKGludmFsaWRGb3JtRmllbGRzKSA9PiB7XG4gICAgICAgIGNvbnN0IGVycm9yRmllbGRzID0gW107XG4gICAgICAgIGV4dHJhUXVlc3Rpb25zLmZvckVhY2gocSA9PiB7XG4gICAgICAgICAgICBnZXRFcnJvckZpZWxkcyhxLCBpbnZhbGlkRm9ybUZpZWxkcywgZXJyb3JGaWVsZHMpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGVycm9yRmllbGRzLnNvcnQoKGEsIGIpID0+IGEub3JkZXIgPiBiLm9yZGVyKVswXTtcbiAgICB9XG5cbiAgICBjb25zdCBzY3JvbGxUb0ZpcnN0RXJyb3IgPSAoaW52YWxpZEZvcm1GaWVsZHMpID0+IHtcbiAgICAgICAgY29uc3QgZmlyc3RFcnJvciA9IGdldEZpcnN0RXJyb3IoaW52YWxpZEZvcm1GaWVsZHMpXG4gICAgICAgIHF1ZXN0aW9uUmVmLmN1cnJlbnRbZmlyc3RFcnJvci5pZF0uc2Nyb2xsSW50b1ZpZXcoe1xuICAgICAgICAgICAgYmVoYXZpb3I6ICdzbW9vdGgnLFxuICAgICAgICAgICAgYmxvY2s6ICdjZW50ZXInLFxuICAgICAgICB9KVxuICAgIH1cblxuICAgIGlmICghT2JqZWN0LmtleXMoYW5zd2VycykubGVuZ3RoKSByZXR1cm4gbnVsbDtcblxuICAgIHJldHVybiAoXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPXtjbGFzc05hbWV9PlxuICAgICAgICAgICAgPEZvcm1cbiAgICAgICAgICAgICAgICB2YWxpZGF0ZT17dmFsaWRhdGV9XG4gICAgICAgICAgICAgICAgb25TdWJtaXQ9e29uU3VibWl0fVxuICAgICAgICAgICAgICAgIGluaXRpYWxWYWx1ZXM9e2Fuc3dlcnN9PlxuXG4gICAgICAgICAgICAgICAgeyh7aGFuZGxlU3VibWl0LCBmb3JtLCBzdWJtaXR0aW5nLCBwcmlzdGluZSwgdmFsdWVzfSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBzdWJtaXQgPSBoYW5kbGVTdWJtaXQ7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgICAgICA8Zm9ybVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uU3VibWl0PXsoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW52YWxpZEZvcm1GaWVsZHMgPSBmb3JtLmdldFJlZ2lzdGVyZWRGaWVsZHMoKS5maWx0ZXIoZmllbGQgPT4gZm9ybS5nZXRGaWVsZFN0YXRlKGZpZWxkKS5pbnZhbGlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGludmFsaWRGb3JtRmllbGRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpcnN0RXJyb3IgPSBnZXRGaXJzdEVycm9yKGludmFsaWRGb3JtRmllbGRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uRXJyb3IoaW52YWxpZEZvcm1GaWVsZHMsIHF1ZXN0aW9uUmVmLmN1cnJlbnRbZmlyc3RFcnJvci5pZF0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihzaG91bGRTY3JvbGwyRmlyc3RFcnJvcilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxUb0ZpcnN0RXJyb3IoaW52YWxpZEZvcm1GaWVsZHMpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlU3VibWl0KGV2ZW50KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmPXtmb3JtUmVmfT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cmVhZE9ubHkgP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXQgZGlzYWJsZWQ9XCJkaXNhYmxlZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2V4dHJhUXVlc3Rpb25zLm1hcCgocSkgPT4gcmVuZGVyUXVlc3Rpb24ocSkpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhUXVlc3Rpb25zLm1hcCgocSkgPT4gcmVuZGVyUXVlc3Rpb24ocSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtkZWJ1ZyAmJiA8cHJlPntKU09OLnN0cmluZ2lmeSh2YWx1ZXMsIDAsIDIpfTwvcHJlPn1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZm9ybT5cbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgPC9Gb3JtPlxuICAgICAgICAgICAgeyFyZWYgJiZcbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICB0eXBlPVwic3VibWl0XCJcbiAgICAgICAgICAgICAgICBvbkNsaWNrPXsoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgc3VibWl0KGV2ZW50KTtcbiAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgIHN0eWxlPXt7bWFyZ2luVG9wOiAxMH19XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge2J1dHRvblRleHR9XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgKVxufSk7XG5cbkV4dHJhUXVlc3Rpb25zRm9ybS5wcm9wVHlwZXMgPSB7XG4gICAgZXh0cmFRdWVzdGlvbnM6IFByb3BUeXBlcy5hcnJheS5pc1JlcXVpcmVkLFxuICAgIHVzZXJBbnN3ZXJzOiBQcm9wVHlwZXMuYXJyYXkuaXNSZXF1aXJlZCxcbiAgICBvbkFuc3dlckNoYW5nZXM6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gICAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIGRlYnVnOiBQcm9wVHlwZXMuYm9vbCxcbiAgICBidXR0b25UZXh0OiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIHF1ZXN0aW9uQ29udGFpbmVyQ2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIHF1ZXN0aW9uTGFiZWxDb250YWluZXJDbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgcXVlc3Rpb25Db250cm9sQ29udGFpbmVyQ2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIFJlcXVpcmVkRXJyb3JNZXNzYWdlOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIFZhbGlkYXRpb25FcnJvckNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgICBhbGxvd0V4dHJhUXVlc3Rpb25zRWRpdDogUHJvcFR5cGVzLmJvb2wsXG4gICAgc2hvdWxkU2Nyb2xsMkZpcnN0RXJyb3I6IFByb3BUeXBlcy5ib29sLFxufTtcblxuZXhwb3J0IGRlZmF1bHQgRXh0cmFRdWVzdGlvbnNGb3JtO1xuIl0sIm5hbWVzIjpbIlByb3BUeXBlcyIsIlJlYWN0IiwiVCIsIlJhd0hUTUwiLCJDaGVja2JveExpc3QiLCJDb21wb25lbnQiLCJjb25zdHJ1Y3RvciIsInByb3BzIiwib3RoZXJWYWx1ZSIsInZhbHVlIiwiZmluZCIsInYiLCJvcHRpb25zIiwibWFwIiwib3AiLCJpbmNsdWRlcyIsInN0YXRlIiwib3RoZXJDaGVja2VkIiwiaGFuZGxlQ2hhbmdlIiwiYmluZCIsImhhbmRsZU90aGVyQ0JDaGFuZ2UiLCJldmVudCIsIm9wdGlvblZhbHVlcyIsInRhcmdldCIsInR5cGUiLCJjaGVja2VkIiwidGhlVmFsIiwiaXNOYU4iLCJwYXJzZUludCIsInB1c2giLCJmaWx0ZXIiLCJldiIsImlkIiwib25DaGFuZ2UiLCJzZXRTdGF0ZSIsInJlbmRlciIsImNsYXNzTmFtZSIsImNoaWxkcmVuIiwiZXJyb3IiLCJkaXNhYmxlZCIsIm5hbWUiLCJhcmlhTGFiZWxsZWRCeSIsInJlc3QiLCJpbmxpbmUiLCJoYXNPd25Qcm9wZXJ0eSIsImh0bWwiLCJhbGxvd090aGVyIiwiaGFzX2Vycm9yIiwiaXNEaXNhYmxlZCIsInN0eWxlIiwibGFiZWwiLCJwYWRkaW5nTGVmdCIsIm1hcmdpbkxlZnQiLCJmbG9hdCIsIm1hcmdpblRvcCIsInRyYW5zbGF0ZSIsIndpZHRoIiwiZGVmYXVsdFByb3BzIiwicHJvcFR5cGVzIiwic3RyaW5nIiwiaXNSZXF1aXJlZCIsIlNlbGVjdCIsIkRyb3Bkb3duIiwic2VsZWN0aW9uIiwiaXNNdWx0aSIsInZhbCIsImNsZWFyYWJsZSIsIm92ZXJyaWRlQ1NTIiwiaXNDbGVhcmFibGUiLCJ0aGVWYWx1ZSIsInNlbGVjdENsYXNzTmFtZSIsIk9iamVjdCIsIm9wdCIsInNlbGVjdFN0eWxlcyIsIm1lbnUiLCJzdHlsZXMiLCJ6SW5kZXgiLCJSYWRpb0xpc3QiLCJnZXRMYWJlbCIsIm9wdGlvbiIsInNpbXBsZSIsImRpc3BsYXkiLCJkZXNjcmlwdGlvbiIsIklucHV0IiwiY29tcG9uZW50RGlkVXBkYXRlIiwicHJldlByb3BzIiwicHJldlN0YXRlIiwic25hcHNob3QiLCJpbnB1dCIsImNvbnRhaW5lckNsYXNzTmFtZSIsImNsYXNzX25hbWUiLCJjb250YWluZXJfY2xhc3NfbmFtZSIsIm5vZGUiLCJyZXBsYWNlTmV3TGluZSIsIl9faHRtbCIsInJlcGxhY2UiLCJtb21lbnQiLCJVUkkiLCJmaW5kRWxlbWVudFBvcyIsIm9iaiIsImN1cnRvcCIsIm9mZnNldFBhcmVudCIsIm9mZnNldFRvcCIsImVwb2NoVG9Nb21lbnQiLCJhdGltZSIsImVwb2NoVG9Nb21lbnRUaW1lWm9uZSIsInRpbWVfem9uZSIsInR6IiwiZm9ybWF0RXBvY2giLCJmb3JtYXQiLCJvYmplY3RUb1F1ZXJ5U3RyaW5nIiwic3RyIiwia2V5IiwiZW5jb2RlVVJJQ29tcG9uZW50IiwiZ2V0QmFja1VSTCIsInVybCIsIndpbmRvdyIsImxvY2F0aW9uIiwiaHJlZiIsInF1ZXJ5Iiwic2VhcmNoIiwiZnJhZ21lbnQiLCJiYWNrVXJsIiwidG9TbHVnIiwidGV4dCIsInRvTG93ZXJDYXNlIiwiZ2V0QXV0aENhbGxiYWNrIiwib3JpZ2luIiwiZ2V0Q3VycmVudExvY2F0aW9uIiwidG9wIiwiZ2V0T3JpZ2luIiwiZ2V0Q3VycmVudFBhdGhOYW1lIiwicGF0aG5hbWUiLCJnZXRDdXJyZW50SHJlZiIsImdldEFsbG93ZWRVc2VyR3JvdXBzIiwiQUxMT1dFRF9VU0VSX0dST1VQUyIsImJ1aWxkQVBJQmFzZVVybCIsInJlbGF0aXZlVXJsIiwiQVBJX0JBU0VfVVJMIiwicHV0T25Mb2NhbFN0b3JhZ2UiLCJsb2NhbFN0b3JhZ2UiLCJzZXRJdGVtIiwiZ2V0RnJvbUxvY2FsU3RvcmFnZSIsInJlbW92ZUl0IiwiZ2V0SXRlbSIsImNvbnNvbGUiLCJsb2ciLCJyZW1vdmVGcm9tTG9jYWxTdG9yYWdlIiwicmVtb3ZlSXRlbSIsImlzQ2xlYXJpbmdTZXNzaW9uU3RhdGUiLCJjbGVhcmluZ19zZXNzaW9uX3N0YXRlIiwic2V0U2Vzc2lvbkNsZWFyaW5nU3RhdGUiLCJnZXRDdXJyZW50VXNlckxhbmd1YWdlIiwibGFuZ3VhZ2UiLCJuYXZpZ2F0b3IiLCJsYW5ndWFnZXMiLCJ1c2VyTGFuZ3VhZ2UiLCJzY3JvbGxUb0Vycm9yIiwiZXJyb3JzIiwia2V5cyIsImxlbmd0aCIsImZpcnN0RXJyb3IiLCJmaXJzdE5vZGUiLCJkb2N1bWVudCIsImdldEVsZW1lbnRCeUlkIiwic2Nyb2xsVG8iLCJoYXNFcnJvcnMiLCJmaWVsZCIsInNoYWxsb3dFcXVhbCIsIm9iamVjdDEiLCJvYmplY3QyIiwia2V5czEiLCJrZXlzMiIsImFycmF5c0VxdWFsIiwiYTEiLCJhMiIsImV2ZXJ5IiwibyIsImlkeCIsImlzRW1wdHkiLCJiYXNlNjRVUkxFbmNvZGUiLCJ0b1N0cmluZyIsInJldHJ5UHJvbWlzZSIsImNiIiwibWF4TnVtYmVyT2ZSZXRyaWVzIiwiaSIsImdldFRpbWVTZXJ2aWNlVXJsIiwiVElNRUlOVEVSVkFMU0lOQ0UxOTcwX0FQSV9VUkwiLCJwcm9jZXNzIiwiZW52IiwiQ2hlY2tCb3hRdWVzdGlvblR5cGUiLCJDb21ib0JveFF1ZXN0aW9uVHlwZSIsIkNoZWNrQm94TGlzdFF1ZXN0aW9uVHlwZSIsIlJhZGlvQnV0dG9uTGlzdFF1ZXN0aW9uVHlwZSIsIkFsbG93ZWRNdWx0aXBsZVZhbHVlUXVlc3Rpb25UeXBlIiwiQW5zd2VyVmFsdWVzT3BlcmF0b3JfQW5kIiwiQW5zd2VyVmFsdWVzT3BlcmF0b3JfT3IiLCJWaXNpYmlsaXR5Q29uZGl0aW9uX0VxdWFsIiwiVmlzaWJpbGl0eUNvbmRpdGlvbl9Ob3RFcXVhbCIsIlZpc2liaWxpdHlfVmlzaWJsZSIsIk1haW5RdWVzdGlvbkNsYXNzVHlwZSIsIlF1ZXN0aW9uc1NldCIsInF1ZXN0aW9ucyIsImFuc3dlcnMiLCJxIiwicXVlc3Rpb25CeU5hbWUiLCJxdWVzdGlvbkJ5SWQiLCJyIiwic3ViX3F1ZXN0aW9uX3J1bGVzIiwicnVsZXMiLCJfcGFyc2VRdWVzdGlvbiIsInN1Yl9xdWVzdGlvbiIsImFuc3dlciIsInNwbGl0IiwiYXYiLCJ2YWx1ZXMiLCJlIiwiTnVtYmVyIiwiaXNJbnRlZ2VyIiwiYSIsInJ1bGUiLCJpbml0aWFsQ29uZGl0aW9uIiwiYW5zd2VyX3ZhbHVlc19vcGVyYXRvciIsInBhcmVudFF1ZXN0aW9uQW5zd2VyIiwiX2dldEFuc3dlckZvciIsInBhcmVudF9xdWVzdGlvbl9pZCIsInZpc2liaWxpdHlfY29uZGl0aW9uIiwiYW5zd2VyVmFsdWUiLCJhbnN3ZXJfdmFsdWVzIiwiX2Fuc3dlckNvbnRhaW5zIiwidmlzaWJpbGl0eSIsImNsYXNzIiwibWFuZGF0b3J5IiwiX2hhc1ZhbHVlIiwiX2FsbG93c1ZhbHVlcyIsIl9hbGxvd3NWYWx1ZSIsInJ1bGVJZCIsInBhcmVudF9ydWxlcyIsIl9pc1N1YlF1ZXN0aW9uVmlzaWJsZSIsInJlcyIsIl9pc0Fuc3dlcmVkIiwiX2NoZWNrUXVlc3Rpb24iLCJxdWVzdGlvbiIsInNsdWciLCJ1c2VyQW5zd2VyIiwib3JpZ2luYWxBbnN3ZXJzIiwicXVlc3Rpb25faWQiLCJhbnNWYWwiLCJyZXMxIiwiX2Zvcm1hdFF1ZXN0aW9uQW5zd2VyIiwiZm9yRWFjaCIsIl9wYXJzZVF1ZXN0aW9ucyIsIkZyYWdtZW50IiwidXNlRWZmZWN0IiwidXNlUmVmIiwidXNlU3RhdGUiLCJ1c2VJbXBlcmF0aXZlSGFuZGxlIiwiRmllbGQiLCJGb3JtIiwiSW5wdXRBZGFwdGVyIiwibWV0YSIsInBsYWNlaG9sZGVyIiwiUmFkaW9CdXR0b25MaXN0QWRhcHRlciIsIkRyb3Bkb3duQWRhcHRlciIsIkNoZWNrQm94TGlzdEFkYXB0ZXIiLCJtYXhWYWx1ZXMiLCJzaG91bGRDaGFuZ2UiLCJxdWVzdGlvbl9hbnN3ZXJzIiwiZ2V0VmFsaWRhdG9yIiwidW5kZWZpbmVkIiwiRXh0cmFRdWVzdGlvbnNGb3JtIiwiZm9yd2FyZFJlZiIsImV4dHJhUXVlc3Rpb25zIiwidXNlckFuc3dlcnMiLCJvbkFuc3dlckNoYW5nZXMiLCJxdWVzdGlvbkNvbnRhaW5lckNsYXNzTmFtZSIsInF1ZXN0aW9uTGFiZWxDb250YWluZXJDbGFzc05hbWUiLCJxdWVzdGlvbkNvbnRyb2xDb250YWluZXJDbGFzc05hbWUiLCJyZWFkT25seSIsImRlYnVnIiwiYnV0dG9uVGV4dCIsIlJlcXVpcmVkRXJyb3JNZXNzYWdlIiwiVmFsaWRhdGlvbkVycm9yQ2xhc3NOYW1lIiwiYWxsb3dFeHRyYVF1ZXN0aW9uc0VkaXQiLCJvbkVycm9yIiwic2hvdWxkU2Nyb2xsMkZpcnN0RXJyb3IiLCJyZWYiLCJzdWJtaXQiLCJxdWVzdGlvblJlZiIsImZvcm1SZWYiLCJzZXRBbnN3ZXJzIiwiZm9ybWF0VXNlckFuc3dlcnMiLCJkb1N1Ym1pdCIsImN1cnJlbnQiLCJkaXNwYXRjaEV2ZW50IiwiRXZlbnQiLCJjYW5jZWxhYmxlIiwiYnViYmxlcyIsInFzIiwiZm9ybWF0QW5zd2VycyIsIkNvbmRpdGlvbiIsIndoZW4iLCJjaGVja1Zpc2liaWxpdHkiLCJjaGVja1J1bGUiLCJFcnJvciIsInRvdWNoZWQiLCJBcnJheSIsImlzQXJyYXkiLCJydWxlUmVzdWx0Iiwibm9uQnJlYWtpbmdTcGFjZSIsIlN0cmluZyIsImZyb21DaGFyQ29kZSIsImRpdiIsImNyZWF0ZUVsZW1lbnQiLCJpbm5lckhUTUwiLCJ0ZXh0Q29udGVudCIsImlubmVyVGV4dCIsImxhYmVsVGV4dCIsImxhYmVsSFRNTCIsImlzQW5zd2VyZWQiLCJyZW5kZXJRdWVzdGlvbiIsInF1ZXN0aW9uVmFsdWVzIiwiZWwiLCJtYXhfc2VsZWN0ZWRfdmFsdWVzIiwiaXNWaXNpYmxlIiwidmFsaWRhdGVRdWVzdGlvbiIsIm9uU3VibWl0IiwidmFsaWRhdGUiLCJnZXRFcnJvckZpZWxkcyIsImludmFsaWRGb3JtRmllbGRzIiwiZXJyb3JGaWVsZHMiLCJnZXRGaXJzdEVycm9yIiwic29ydCIsImIiLCJvcmRlciIsInNjcm9sbFRvRmlyc3RFcnJvciIsInNjcm9sbEludG9WaWV3IiwiYmVoYXZpb3IiLCJibG9jayIsImhhbmRsZVN1Ym1pdCIsImZvcm0iLCJzdWJtaXR0aW5nIiwicHJpc3RpbmUiLCJnZXRSZWdpc3RlcmVkRmllbGRzIiwiZ2V0RmllbGRTdGF0ZSIsImludmFsaWQiLCJKU09OIiwic3RyaW5naWZ5IiwiYXJyYXkiLCJmdW5jIiwiYm9vbCJdLCJzb3VyY2VSb290IjoiIn0=