diff --git a/demo/assets/bundle.js b/demo/assets/bundle.js index a5203a3..cb23c15 100644 --- a/demo/assets/bundle.js +++ b/demo/assets/bundle.js @@ -1,2 +1,2 @@ -(()=>{var e={282:(e,n,t)=>{"use strict";t.d(n,{A:()=>l});var o=t(354),i=t.n(o),r=t(314),s=t.n(r)()(i());s.push([e.id,'/** CSS reset */\n\n.button-reset {\n border: none;\n margin: 0;\n padding: 0;\n width: auto;\n overflow: visible;\n background: transparent;\n color: inherit;\n font: inherit;\n line-height: normal;\n -webkit-font-smoothing: inherit;\n -moz-osx-font-smoothing: inherit;\n -webkit-appearance: none;\n}\n\n\n\n/** add block */\n.add-block {\n margin: 0;\n padding: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n border: 1px solid #000;\n background-color: white;\n transition: all 0.3s ease;\n box-sizing: border-box;\n margin-left: 1.3rem;\n}\n\n.add-block-wrapper {\n width: 100%;\n height: 3.125rem;\n}\n\n.add-block-wrapper:hover .add-block {\n display: flex;\n}\n\n/** and add block */\n\n\n\n/** List **/\nol.johannes-content-element,\nul.johannes-content-element {\n padding-left: 1rem !important;\n}\n\n\n\n.johannes-content-element li>button {\n /* display: none; */\n display: none;\n position: absolute;\n margin-left: 10px;\n top: 0;\n\n flex-direction: row;\n align-items: start;\n justify-content: start;\n\n}\n\n.johannes-content-element li {\n position: relative;\n}\n\n.johannes-content-element li::before {\n margin-left: 0.3125rem;\n}\n\n.johannes-content-element li:hover>button {\n /* display: inline-block; */\n display: inline-flex;\n\n}\n\np.johannes-content-element {\n display: inline-block;\n line-height: 1;\n margin: 0;\n padding: 0;\n}\n\n.johannes-content-element .checkbox-list {\n list-style-type: none;\n padding-left: 0 !important;\n}\n\n\n.johannes-content-element .checkbox-list li {\n display: flex;\n flex-direction: row;\n justify-content: left;\n}\n\n\n.johannes-content-element ul.checkbox-list input[type="checkbox"]:checked+span {\n text-decoration: line-through;\n}\n\nul.johannes-content-element:not(.checkbox-list),\nol.johannes-content-element:not(.checkbox-list) {\n padding-left: 1.5rem !important;\n}\n\n/** and list **/\n\n\n\n.block>.drag-handler {\n color: #84888d;\n visibility: hidden;\n cursor: grab;\n align-self: start;\n\n /* background-color: pink; */\n padding-top: 0.33rem;\n position: absolute;\n}\n\n.drag-handler svg {\n /* background-color: red; */\n}\n\n.drag-handler svg use {\n /* background-color: blue; */\n}\n\n.drag-handler:active {\n cursor: grabbing;\n}\n\n.block {\n display: flex;\n flex-direction: row;\n margin-bottom: 1rem;\n position: relative;\n}\n\n.block>*:not(.drag-handler) {\n padding-left: 1.25rem;\n}\n\n.block:hover .drag-handler {\n visibility: visible;\n vertical-align: top;\n justify-content: start;\n}\n\n.drop-line {\n height: 1rem;\n background-color: #84888d;\n width: 100%;\n}\n\n\n.title h1 {\n margin-left: 1.3rem;\n}\n\nh1[data-placeholder]:empty:before {\n content: attr(data-placeholder);\n color: #84888d !important;\n display: block;\n}\n\nh1[data-placeholder]:focus:before {}\n\n\n*[contenteditable="true"]:not(h1):empty:before {\n content: attr(data-placeholder);\n color: #84888acd;\n display: none;\n}\n\n*[contenteditable="true"]:not(h1):empty:hover:before {\n display: block;\n}\n\ncite[contenteditable="true"]:empty:before {\n display: block;\n}\n\n*[contenteditable="true"]:not(h1)[data-placeholder]:empty:focus:before {\n content: attr(data-placeholder);\n color: #84888acd !important;\n display: block;\n}\n\n\n\nh1 {\n font-size: 2.5rem;\n font-weight: bolder !important;\n}\n\n.johannes-editor {\n width: 100%;\n\n}\n\n.content {\n width: 100%;\n box-sizing: border-box;\n\n\n}\n\npre {\n width: 100%;\n}\n\n[contenteditable] {\n outline: none;\n}\n\nbody {\n height: 2000px;\n background-color: #f0f0f1 !important;\n\n font-family: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";\n}\n\n\n.editor {\n display: flex;\n margin-top: 80px;\n}\n\np {\n color: #242424;\n}\n\n\n.block,\n.block * {\n user-select: text;\n}\n\n\n.johannes-content-element {\n width: 100%;\n padding: 0;\n margin: 0;\n /* background-color: green; */\n}\n\n\n#johannesEditor {\n width: 60%;\n margin-left: auto;\n margin-right: auto;\n}\n\n.johannes-editor hr {\n width: 100%;\n height: 2px;\n visibility: visible;\n border: none;\n border-bottom: 1px solid rgba(55, 53, 47, 0.16);\n}\n\n\n\n.johannes-editor blockquote {\n margin: 0.5rem 0;\n padding-left: 20px;\n border-left: 4px solid rgb(55, 53, 47);\n font-style: italic\n}\n\n.johannes-editor cite {\n padding-top: 1rem !important;\n display: inline-block;\n}\n\n\n.johannes-editor cite::before {\n content: \'— \';\n}\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n#linkBox {\n border-radius: 2px;\n padding: 20px;\n background-color: #f9f9f9;\n\n\n box-shadow:\n 0 4px 6px rgba(0, 0, 0, 0.1),\n 0 -2px 4px rgba(0, 0, 0, 0.02),\n -2px 0 4px rgba(0, 0, 0, 0.02),\n 2px 0 4px rgba(0, 0, 0, 0.02);\n\n\n border: 1px solid #d0d0d0;\n width: fit-content;\n z-index: 999999;\n color: rgb(120, 119, 116);\n border-radius: none;\n}\n\n\n#linkBox input {\n width: 316px;\n padding: 8px 40px 8px 16px;\n /* border-color: #d0d0d0; */\n\n border: 1px solid #949494;\n /* border-radius: 4px; */\n height: 24px;\n\n display: flex;\n flex-direction: row;\n justify-content: center;\n align-items: center;\n}\n\n\n#linkBox input::selection,\n#linkBox input:focus {\n border-radius: none;\n}\n\n\n\n\n\n\n\n\n/** Text formatting Bar **/\n\n\n\n#floatingToolbar {\n justify-content: space-between;\n padding: 8px 16px;\n background-color: #f9f9f9;\n width: fit-content;\n z-index: 999999;\n position: absolute;\n user-select: none;\n}\n\n/* TODO: remove this*/\nspan {\n font-family: Arial, sans-serif;\n}\n\n\n#floatingToolbar .item {\n color: rgb(120, 119, 116);\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n#floatingToolbar .item>button {\n\n display: inline-flex;\n align-items: center;\n}\n\n\n#floatingToolbar select {\n color: rgb(120, 119, 116);\n border: none;\n font-size: 0.85rem;\n background-color: inherit;\n}\n\n.select-wrapper {\n display: flex;\n flex-direction: row;\n align-items: center;\n}\n\n.select-wrapper ul {\n position: absolute;\n background: #f9f9f9;\n flex-direction: column;\n width: fit-content;\n padding-bottom: 0.5rem;\n padding-left: 5px;\n padding-right: 5px;\n top: 2.2rem;\n color: rgb(55, 53, 47);\n padding-right: 0.3125rem;\n}\n\n\n\n.select-wrapper ul li {\n /* display: flex;\n flex-direction: row !important;\n background-color: yellow; */\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 0.625rem;\n padding: 0.1875rem 0.3125rem;\n border-radius: 0.1875rem;\n user-select: none !important;\n\n font-size: small !important;\n font-weight: 500;\n}\n\n.select-wrapper ul li span {\n display: inline-block;\n width: max-content;\n}\n\n.select-wrapper ul li .option-image {\n width: 1.375rem;\n height: 1.375rem;\n color: #242424;\n padding: 0 !important;\n margin: 0 !important;\n}\n\n.select-wrapper ul li .option-image svg {\n color: #4f4f4f;\n padding: 0 !important;\n margin: 0 !important;\n}\n\n.text-formatting-select-button {\n display: flex;\n flex-direction: row;\n align-items: center;\n}\n\n#turnIntoButton span {\n display: inline-flex;\n flex-direction: row;\n justify-content: center;\n align-items: center;\n font-size: 0.9rem;\n\n}\n\n#turnIntoButton svg use {\n margin: auto;\n}\n\n.select-wrapper {\n position: relative;\n color: rgb(120, 119, 116);\n}\n\n\n.select-wrapper > button {\n color: rgba(55, 53, 47, 0.85);\n}\n\n\n\n\n\n\n\ncode:not(pre code) {\n margin: 0;\n padding: 0;\n background-color: #d0d0d0;\n background-color: #f6f5f4;\n font-size: inherit;\n font-size: 1rem !important;\n border: 1px solid #0000001a;\n padding: 0 3px;\n display: inline-block;\n border-radius: 4px;\n box-sizing: border-box;\n}\n\n\n\n\na:not([href]) {\n background-color: #d3e3fd;\n}\n\n.text-formatting-button-active {\n color: #2382e2;\n}\n\n.text-formatting-circle-active {\n border-color: #2382e2 !important;\n}\n\n\n\n#moreTextOptionSelect {\n position: absolute;\n}\n\n.moreTextOptionWrapper {\n position: relative;\n}\n\n\n.select-wrapper ul li>h3 {\n margin: 0;\n font-size: small !important;\n color: #37352fa6;\n margin: 0;\n padding: 0;\n font-weight: 600 !important;\n margin-top: 0.3125rem;\n margin-bottom: 0.3125rem;\n}\n\n\n.bgc-red {\n background-color: #FDDEDE;\n}\n\n.bgc-green {\n background-color: #D7F7DC;\n}\n\n.bgc-blue {\n background-color: #D9EDF6;\n}\n\n.bgc-yellow {\n background-color: #FAF4D1;\n}\n\n.bgc-grey {\n background-color: #E1E0E0;\n}\n\np,\nmark {\n line-height: 1;\n}\n\n#turnIntoSelect .option-image {\n /* display: none !important; */\n}\n\n.border-less-image {\n width: 24px;\n height: 24px;\n}\n\n\n\n\n/** Block Options **/\n.soft-box-shadow {\n margin: 0;\n padding: 0;\n border-radius: 2px;\n box-shadow:\n 0 4px 6px rgba(0, 0, 0, 0.1),\n 0 -2px 4px rgba(216, 196, 196, 0.02),\n -2px 0 4px rgba(0, 0, 0, 0.02),\n 2px 0 4px rgba(0, 0, 0, 0.02);\n\n border: 1px solid #d0d0d0;\n}\n\n.block-options-wrapper {\n z-index: 999999;\n position: absolute;\n display: none;\n}\n\n.block-options {\n width: fit-content;\n max-height: 19rem;\n overflow-y: auto;\n}\n\n.block-options {\n padding: 0 0.625rem;\n background: #f9f9f9;\n}\n\n.block-options section h2 {\n font-size: small !important;\n color: #37352fa6;\n margin: 0;\n padding: 0;\n font-weight: 600 !important;\n margin-top: 0.3125rem;\n margin-bottom: 0.3125rem;\n padding-left: 0.3125rem;\n}\n\n.block-options .option {\n padding: 0.3125rem 0.625rem;\n margin: 0.3125rem 0;\n cursor: pointer;\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: left;\n gap: 0.6rem;\n border-radius: 3px;\n}\n\n.block-options .option:focus {\n outline: none;\n background-color: #e9e9e9;\n border: inherit;\n}\n\n.option-focused {\n outline: none;\n background-color: #e9e9e9;\n border: none;\n}\n\n#deleteOption.option-focused {\n color: #EB5757 !important;\n}\n\n#deleteOption.option-focused svg {\n color: #EB5757 !important;\n}\n\n\n\n.block-options .option:focus-visible {\n outline: none;\n background-color: #e9e9e9;\n border: inherit;\n}\n\n/* .option-hover:hover {\n background-color: #e9e9e9;\n box-shadow: 0px 0px 0px 2px #e9e9e9;\n border-radius: 1px;\n transition: 0.1s ease;\n} */\n\n/* .select-wrapper>button, */\n\n/* #turnIntoButton,\n#colorTextButton {\n padding-left: 4px;\n} */\n\n#turnIntoButton:not([disabled]):hover,\n#colorTextButton:not([disabled]):hover,\n#moreTextOptionButton:not([disabled]):hover,\n#floatingToolbar .item>button:not([disabled]):hover {\n background-color: #e9e9e9;\n box-shadow: 0px 0px 0px 2px #e9e9e9;\n border-radius: 1px;\n transition: 0.1s ease;\n}\n\n\n\n.option[focused="true"] {\n background-color: #bde4ff;\n}\n\n\n\n\n\n.option-image {\n width: 2.875rem;\n height: 2.875rem;\n border-radius: 0.1875rem;\n border: 1px solid #ccc;\n color: #4f4f4f;\n\n display: flex;\n flex-direction: row;\n justify-content: center;\n vertical-align: middle;\n align-items: center;\n background-color: #ffff;\n box-sizing: border-box;\n}\n\n.option-image img {\n max-width: 2.875rem;\n max-height: 2.875rem;\n}\n\n.option-image svg {\n margin: 0;\n padding: 0;\n padding: 0.625rem;\n box-sizing: border-box;\n\n}\n\n.option-text * {\n margin: 0;\n padding: 0;\n\n}\n\n.option-text .block-title {\n font-size: small !important;\n font-weight: 500;\n}\n\n.option-text .block-description {\n font-size: small !important;\n color: rgba(55, 53, 47, 0.5);\n}\n\n/** End Block Options **/\n\n\n\n#deleteBlockButton:hover svg,\n#deleteBlockButton:hover {\n color: rgb(235, 87, 87) !important;\n}\n\n\n\n.johannes-editor *::selection {\n background-color: rgba(211, 227, 253, 0.5) !important;\n}\n\n.johannes-editor mark,\n.johannes-editor * {\n line-height: 1.5 !important;\n}\n\n.option {\n justify-content: space-between;\n}\n\n.text-option {\n display: flex;\n flex-direction: row;\n justify-content: start;\n align-items: center;\n gap: 0.625rem;\n}\n\n\n\n\n:root {\n /* font-size: 16px; */\n /* Tamanho padrão */\n}\n\n/* Para telas com densidade média */\n@media only screen and (-webkit-min-device-pixel-ratio: 2),\nonly screen and (min--moz-device-pixel-ratio: 2),\nonly screen and (min-resolution: 192dpi),\nonly screen and (min-resolution: 2dppx) {\n :root {\n font-size: 18px;\n /* Aumenta o tamanho da fonte para telas de alta densidade */\n }\n}\n\n/* Para telas com altíssima densidade */\n@media only screen and (-webkit-min-device-pixel-ratio: 3),\nonly screen and (min--moz-device-pixel-ratio: 3),\nonly screen and (min-resolution: 288dpi),\nonly screen and (min-resolution: 3dppx) {\n :root {\n font-size: 20px;\n /* Ainda maior para telas de densidade muito alta */\n }\n}',"",{version:3,sources:["webpack://./src/assets/css/main.css"],names:[],mappings:"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",sourcesContent:['/** CSS reset */\n\n.button-reset {\n border: none;\n margin: 0;\n padding: 0;\n width: auto;\n overflow: visible;\n background: transparent;\n color: inherit;\n font: inherit;\n line-height: normal;\n -webkit-font-smoothing: inherit;\n -moz-osx-font-smoothing: inherit;\n -webkit-appearance: none;\n}\n\n\n\n/** add block */\n.add-block {\n margin: 0;\n padding: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n border: 1px solid #000;\n background-color: white;\n transition: all 0.3s ease;\n box-sizing: border-box;\n margin-left: 1.3rem;\n}\n\n.add-block-wrapper {\n width: 100%;\n height: 3.125rem;\n}\n\n.add-block-wrapper:hover .add-block {\n display: flex;\n}\n\n/** and add block */\n\n\n\n/** List **/\nol.johannes-content-element,\nul.johannes-content-element {\n padding-left: 1rem !important;\n}\n\n\n\n.johannes-content-element li>button {\n /* display: none; */\n display: none;\n position: absolute;\n margin-left: 10px;\n top: 0;\n\n flex-direction: row;\n align-items: start;\n justify-content: start;\n\n}\n\n.johannes-content-element li {\n position: relative;\n}\n\n.johannes-content-element li::before {\n margin-left: 0.3125rem;\n}\n\n.johannes-content-element li:hover>button {\n /* display: inline-block; */\n display: inline-flex;\n\n}\n\np.johannes-content-element {\n display: inline-block;\n line-height: 1;\n margin: 0;\n padding: 0;\n}\n\n.johannes-content-element .checkbox-list {\n list-style-type: none;\n padding-left: 0 !important;\n}\n\n\n.johannes-content-element .checkbox-list li {\n display: flex;\n flex-direction: row;\n justify-content: left;\n}\n\n\n.johannes-content-element ul.checkbox-list input[type="checkbox"]:checked+span {\n text-decoration: line-through;\n}\n\nul.johannes-content-element:not(.checkbox-list),\nol.johannes-content-element:not(.checkbox-list) {\n padding-left: 1.5rem !important;\n}\n\n/** and list **/\n\n\n\n.block>.drag-handler {\n color: #84888d;\n visibility: hidden;\n cursor: grab;\n align-self: start;\n\n /* background-color: pink; */\n padding-top: 0.33rem;\n position: absolute;\n}\n\n.drag-handler svg {\n /* background-color: red; */\n}\n\n.drag-handler svg use {\n /* background-color: blue; */\n}\n\n.drag-handler:active {\n cursor: grabbing;\n}\n\n.block {\n display: flex;\n flex-direction: row;\n margin-bottom: 1rem;\n position: relative;\n}\n\n.block>*:not(.drag-handler) {\n padding-left: 1.25rem;\n}\n\n.block:hover .drag-handler {\n visibility: visible;\n vertical-align: top;\n justify-content: start;\n}\n\n.drop-line {\n height: 1rem;\n background-color: #84888d;\n width: 100%;\n}\n\n\n.title h1 {\n margin-left: 1.3rem;\n}\n\nh1[data-placeholder]:empty:before {\n content: attr(data-placeholder);\n color: #84888d !important;\n display: block;\n}\n\nh1[data-placeholder]:focus:before {}\n\n\n*[contenteditable="true"]:not(h1):empty:before {\n content: attr(data-placeholder);\n color: #84888acd;\n display: none;\n}\n\n*[contenteditable="true"]:not(h1):empty:hover:before {\n display: block;\n}\n\ncite[contenteditable="true"]:empty:before {\n display: block;\n}\n\n*[contenteditable="true"]:not(h1)[data-placeholder]:empty:focus:before {\n content: attr(data-placeholder);\n color: #84888acd !important;\n display: block;\n}\n\n\n\nh1 {\n font-size: 2.5rem;\n font-weight: bolder !important;\n}\n\n.johannes-editor {\n width: 100%;\n\n}\n\n.content {\n width: 100%;\n box-sizing: border-box;\n\n\n}\n\npre {\n width: 100%;\n}\n\n[contenteditable] {\n outline: none;\n}\n\nbody {\n height: 2000px;\n background-color: #f0f0f1 !important;\n\n font-family: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";\n}\n\n\n.editor {\n display: flex;\n margin-top: 80px;\n}\n\np {\n color: #242424;\n}\n\n\n.block,\n.block * {\n user-select: text;\n}\n\n\n.johannes-content-element {\n width: 100%;\n padding: 0;\n margin: 0;\n /* background-color: green; */\n}\n\n\n#johannesEditor {\n width: 60%;\n margin-left: auto;\n margin-right: auto;\n}\n\n.johannes-editor hr {\n width: 100%;\n height: 2px;\n visibility: visible;\n border: none;\n border-bottom: 1px solid rgba(55, 53, 47, 0.16);\n}\n\n\n\n.johannes-editor blockquote {\n margin: 0.5rem 0;\n padding-left: 20px;\n border-left: 4px solid rgb(55, 53, 47);\n font-style: italic\n}\n\n.johannes-editor cite {\n padding-top: 1rem !important;\n display: inline-block;\n}\n\n\n.johannes-editor cite::before {\n content: \'— \';\n}\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n#linkBox {\n border-radius: 2px;\n padding: 20px;\n background-color: #f9f9f9;\n\n\n box-shadow:\n 0 4px 6px rgba(0, 0, 0, 0.1),\n 0 -2px 4px rgba(0, 0, 0, 0.02),\n -2px 0 4px rgba(0, 0, 0, 0.02),\n 2px 0 4px rgba(0, 0, 0, 0.02);\n\n\n border: 1px solid #d0d0d0;\n width: fit-content;\n z-index: 999999;\n color: rgb(120, 119, 116);\n border-radius: none;\n}\n\n\n#linkBox input {\n width: 316px;\n padding: 8px 40px 8px 16px;\n /* border-color: #d0d0d0; */\n\n border: 1px solid #949494;\n /* border-radius: 4px; */\n height: 24px;\n\n display: flex;\n flex-direction: row;\n justify-content: center;\n align-items: center;\n}\n\n\n#linkBox input::selection,\n#linkBox input:focus {\n border-radius: none;\n}\n\n\n\n\n\n\n\n\n/** Text formatting Bar **/\n\n\n\n#floatingToolbar {\n justify-content: space-between;\n padding: 8px 16px;\n background-color: #f9f9f9;\n width: fit-content;\n z-index: 999999;\n position: absolute;\n user-select: none;\n}\n\n/* TODO: remove this*/\nspan {\n font-family: Arial, sans-serif;\n}\n\n\n#floatingToolbar .item {\n color: rgb(120, 119, 116);\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n#floatingToolbar .item>button {\n\n display: inline-flex;\n align-items: center;\n}\n\n\n#floatingToolbar select {\n color: rgb(120, 119, 116);\n border: none;\n font-size: 0.85rem;\n background-color: inherit;\n}\n\n.select-wrapper {\n display: flex;\n flex-direction: row;\n align-items: center;\n}\n\n.select-wrapper ul {\n position: absolute;\n background: #f9f9f9;\n flex-direction: column;\n width: fit-content;\n padding-bottom: 0.5rem;\n padding-left: 5px;\n padding-right: 5px;\n top: 2.2rem;\n color: rgb(55, 53, 47);\n padding-right: 0.3125rem;\n}\n\n\n\n.select-wrapper ul li {\n /* display: flex;\n flex-direction: row !important;\n background-color: yellow; */\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 0.625rem;\n padding: 0.1875rem 0.3125rem;\n border-radius: 0.1875rem;\n user-select: none !important;\n\n font-size: small !important;\n font-weight: 500;\n}\n\n.select-wrapper ul li span {\n display: inline-block;\n width: max-content;\n}\n\n.select-wrapper ul li .option-image {\n width: 1.375rem;\n height: 1.375rem;\n color: #242424;\n padding: 0 !important;\n margin: 0 !important;\n}\n\n.select-wrapper ul li .option-image svg {\n color: #4f4f4f;\n padding: 0 !important;\n margin: 0 !important;\n}\n\n.text-formatting-select-button {\n display: flex;\n flex-direction: row;\n align-items: center;\n}\n\n#turnIntoButton span {\n display: inline-flex;\n flex-direction: row;\n justify-content: center;\n align-items: center;\n font-size: 0.9rem;\n\n}\n\n#turnIntoButton svg use {\n margin: auto;\n}\n\n.select-wrapper {\n position: relative;\n color: rgb(120, 119, 116);\n}\n\n\n.select-wrapper > button {\n color: rgba(55, 53, 47, 0.85);\n}\n\n\n\n\n\n\n\ncode:not(pre code) {\n margin: 0;\n padding: 0;\n background-color: #d0d0d0;\n background-color: #f6f5f4;\n font-size: inherit;\n font-size: 1rem !important;\n border: 1px solid #0000001a;\n padding: 0 3px;\n display: inline-block;\n border-radius: 4px;\n box-sizing: border-box;\n}\n\n\n\n\na:not([href]) {\n background-color: #d3e3fd;\n}\n\n.text-formatting-button-active {\n color: #2382e2;\n}\n\n.text-formatting-circle-active {\n border-color: #2382e2 !important;\n}\n\n\n\n#moreTextOptionSelect {\n position: absolute;\n}\n\n.moreTextOptionWrapper {\n position: relative;\n}\n\n\n.select-wrapper ul li>h3 {\n margin: 0;\n font-size: small !important;\n color: #37352fa6;\n margin: 0;\n padding: 0;\n font-weight: 600 !important;\n margin-top: 0.3125rem;\n margin-bottom: 0.3125rem;\n}\n\n\n.bgc-red {\n background-color: #FDDEDE;\n}\n\n.bgc-green {\n background-color: #D7F7DC;\n}\n\n.bgc-blue {\n background-color: #D9EDF6;\n}\n\n.bgc-yellow {\n background-color: #FAF4D1;\n}\n\n.bgc-grey {\n background-color: #E1E0E0;\n}\n\np,\nmark {\n line-height: 1;\n}\n\n#turnIntoSelect .option-image {\n /* display: none !important; */\n}\n\n.border-less-image {\n width: 24px;\n height: 24px;\n}\n\n\n\n\n/** Block Options **/\n.soft-box-shadow {\n margin: 0;\n padding: 0;\n border-radius: 2px;\n box-shadow:\n 0 4px 6px rgba(0, 0, 0, 0.1),\n 0 -2px 4px rgba(216, 196, 196, 0.02),\n -2px 0 4px rgba(0, 0, 0, 0.02),\n 2px 0 4px rgba(0, 0, 0, 0.02);\n\n border: 1px solid #d0d0d0;\n}\n\n.block-options-wrapper {\n z-index: 999999;\n position: absolute;\n display: none;\n}\n\n.block-options {\n width: fit-content;\n max-height: 19rem;\n overflow-y: auto;\n}\n\n.block-options {\n padding: 0 0.625rem;\n background: #f9f9f9;\n}\n\n.block-options section h2 {\n font-size: small !important;\n color: #37352fa6;\n margin: 0;\n padding: 0;\n font-weight: 600 !important;\n margin-top: 0.3125rem;\n margin-bottom: 0.3125rem;\n padding-left: 0.3125rem;\n}\n\n.block-options .option {\n padding: 0.3125rem 0.625rem;\n margin: 0.3125rem 0;\n cursor: pointer;\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: left;\n gap: 0.6rem;\n border-radius: 3px;\n}\n\n.block-options .option:focus {\n outline: none;\n background-color: #e9e9e9;\n border: inherit;\n}\n\n.option-focused {\n outline: none;\n background-color: #e9e9e9;\n border: none;\n}\n\n#deleteOption.option-focused {\n color: #EB5757 !important;\n}\n\n#deleteOption.option-focused svg {\n color: #EB5757 !important;\n}\n\n\n\n.block-options .option:focus-visible {\n outline: none;\n background-color: #e9e9e9;\n border: inherit;\n}\n\n/* .option-hover:hover {\n background-color: #e9e9e9;\n box-shadow: 0px 0px 0px 2px #e9e9e9;\n border-radius: 1px;\n transition: 0.1s ease;\n} */\n\n/* .select-wrapper>button, */\n\n/* #turnIntoButton,\n#colorTextButton {\n padding-left: 4px;\n} */\n\n#turnIntoButton:not([disabled]):hover,\n#colorTextButton:not([disabled]):hover,\n#moreTextOptionButton:not([disabled]):hover,\n#floatingToolbar .item>button:not([disabled]):hover {\n background-color: #e9e9e9;\n box-shadow: 0px 0px 0px 2px #e9e9e9;\n border-radius: 1px;\n transition: 0.1s ease;\n}\n\n\n\n.option[focused="true"] {\n background-color: #bde4ff;\n}\n\n\n\n\n\n.option-image {\n width: 2.875rem;\n height: 2.875rem;\n border-radius: 0.1875rem;\n border: 1px solid #ccc;\n color: #4f4f4f;\n\n display: flex;\n flex-direction: row;\n justify-content: center;\n vertical-align: middle;\n align-items: center;\n background-color: #ffff;\n box-sizing: border-box;\n}\n\n.option-image img {\n max-width: 2.875rem;\n max-height: 2.875rem;\n}\n\n.option-image svg {\n margin: 0;\n padding: 0;\n padding: 0.625rem;\n box-sizing: border-box;\n\n}\n\n.option-text * {\n margin: 0;\n padding: 0;\n\n}\n\n.option-text .block-title {\n font-size: small !important;\n font-weight: 500;\n}\n\n.option-text .block-description {\n font-size: small !important;\n color: rgba(55, 53, 47, 0.5);\n}\n\n/** End Block Options **/\n\n\n\n#deleteBlockButton:hover svg,\n#deleteBlockButton:hover {\n color: rgb(235, 87, 87) !important;\n}\n\n\n\n.johannes-editor *::selection {\n background-color: rgba(211, 227, 253, 0.5) !important;\n}\n\n.johannes-editor mark,\n.johannes-editor * {\n line-height: 1.5 !important;\n}\n\n.option {\n justify-content: space-between;\n}\n\n.text-option {\n display: flex;\n flex-direction: row;\n justify-content: start;\n align-items: center;\n gap: 0.625rem;\n}\n\n\n\n\n:root {\n /* font-size: 16px; */\n /* Tamanho padrão */\n}\n\n/* Para telas com densidade média */\n@media only screen and (-webkit-min-device-pixel-ratio: 2),\nonly screen and (min--moz-device-pixel-ratio: 2),\nonly screen and (min-resolution: 192dpi),\nonly screen and (min-resolution: 2dppx) {\n :root {\n font-size: 18px;\n /* Aumenta o tamanho da fonte para telas de alta densidade */\n }\n}\n\n/* Para telas com altíssima densidade */\n@media only screen and (-webkit-min-device-pixel-ratio: 3),\nonly screen and (min--moz-device-pixel-ratio: 3),\nonly screen and (min-resolution: 288dpi),\nonly screen and (min-resolution: 3dppx) {\n :root {\n font-size: 20px;\n /* Ainda maior para telas de densidade muito alta */\n }\n}'],sourceRoot:""}]);const l=s},314:e=>{"use strict";e.exports=function(e){var n=[];return n.toString=function(){return this.map((function(n){var t="",o=void 0!==n[5];return n[4]&&(t+="@supports (".concat(n[4],") {")),n[2]&&(t+="@media ".concat(n[2]," {")),o&&(t+="@layer".concat(n[5].length>0?" ".concat(n[5]):""," {")),t+=e(n),o&&(t+="}"),n[2]&&(t+="}"),n[4]&&(t+="}"),t})).join("")},n.i=function(e,t,o,i,r){"string"==typeof e&&(e=[[null,e,void 0]]);var s={};if(o)for(var l=0;l0?" ".concat(d[5]):""," {").concat(d[1],"}")),d[5]=r),t&&(d[2]?(d[1]="@media ".concat(d[2]," {").concat(d[1],"}"),d[2]=t):d[2]=t),i&&(d[4]?(d[1]="@supports (".concat(d[4],") {").concat(d[1],"}"),d[4]=i):d[4]="".concat(i)),n.push(d))}},n}},354:e=>{"use strict";e.exports=function(e){var n=e[1],t=e[3];if(!t)return n;if("function"==typeof btoa){var o=btoa(unescape(encodeURIComponent(JSON.stringify(t)))),i="sourceMappingURL=data:application/json;charset=utf-8;base64,".concat(o),r="/*# ".concat(i," */");return[n].concat([r]).join("\n")}return[n].join("\n")}},72:e=>{"use strict";var n=[];function t(e){for(var t=-1,o=0;o{"use strict";var n={};e.exports=function(e,t){var o=function(e){if(void 0===n[e]){var t=document.querySelector(e);if(window.HTMLIFrameElement&&t instanceof window.HTMLIFrameElement)try{t=t.contentDocument.head}catch(e){t=null}n[e]=t}return n[e]}(e);if(!o)throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");o.appendChild(t)}},540:e=>{"use strict";e.exports=function(e){var n=document.createElement("style");return e.setAttributes(n,e.attributes),e.insert(n,e.options),n}},56:(e,n,t)=>{"use strict";e.exports=function(e){var n=t.nc;n&&e.setAttribute("nonce",n)}},825:e=>{"use strict";e.exports=function(e){if("undefined"==typeof document)return{update:function(){},remove:function(){}};var n=e.insertStyleElement(e);return{update:function(t){!function(e,n,t){var o="";t.supports&&(o+="@supports (".concat(t.supports,") {")),t.media&&(o+="@media ".concat(t.media," {"));var i=void 0!==t.layer;i&&(o+="@layer".concat(t.layer.length>0?" ".concat(t.layer):""," {")),o+=t.css,i&&(o+="}"),t.media&&(o+="}"),t.supports&&(o+="}");var r=t.sourceMap;r&&"undefined"!=typeof btoa&&(o+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(r))))," */")),n.styleTagTransform(o,e,n.options)}(n,e,t)},remove:function(){!function(e){if(null===e.parentNode)return!1;e.parentNode.removeChild(e)}(n)}}}},113:e=>{"use strict";e.exports=function(e,n){if(n.styleSheet)n.styleSheet.cssText=e;else{for(;n.firstChild;)n.removeChild(n.firstChild);n.appendChild(document.createTextNode(e))}}},528:()=>{document.addEventListener("DOMContentLoaded",(function(){const e=document.querySelector(".johannes-editor");let n=null,t=document.createElement("div");t.classList.add("drop-line"),t.style.height="2px",t.style.display="none",e.addEventListener("dragstart",(e=>{e.target.classList?.contains("drag-handler")&&(n=e.target.closest(".block"),n.setAttribute("draggable","true"),setTimeout((()=>{n.style.opacity="0.5"}),0))})),e.addEventListener("dragend",(()=>{setTimeout((()=>{n&&(n.style.opacity="",n.removeAttribute("draggable"),n=null),t.remove()}),0)})),e.addEventListener("dragover",(e=>{e.preventDefault();let o=e.target.closest(".block");if(o&&o!==n){let n=o.getBoundingClientRect(),i=n.y+n.height/2;e.clientY>i?o.nextElementSibling!==t&&o.insertAdjacentElement("afterend",t):o.previousElementSibling!==t&&o.insertAdjacentElement("beforebegin",t)}t.style.display="block"})),e.addEventListener("drop",(e=>{e.preventDefault(),n&&t&&t.parentElement&&(t.parentElement.insertBefore(n,t),t.remove())}))}))},167:()=>{let e=[],n=[];document.addEventListener("DOMContentLoaded",(function(){const t=document.querySelector(".content");if(t){function o(){const n=t.innerHTML;e.push(n)}t.addEventListener("input",(()=>{o()})),document.addEventListener("keydown",(o=>{o.ctrlKey&&"z"===o.key?(function(){if(e.length>0){const o=e.pop();n.push(t.innerHTML),t.innerHTML=o}}(),o.preventDefault()):o.ctrlKey&&"y"===o.key&&(function(){if(n.length>0){const o=n.pop();e.push(t.innerHTML),t.innerHTML=o}}(),o.preventDefault())})),o()}}))}},n={};function t(o){var i=n[o];if(void 0!==i)return i.exports;var r=n[o]={id:o,exports:{}};return e[o](r,r.exports,t),r.exports}t.n=e=>{var n=e&&e.__esModule?()=>e.default:()=>e;return t.d(n,{a:n}),n},t.d=(e,n)=>{for(var o in n)t.o(n,o)&&!t.o(e,o)&&Object.defineProperty(e,o,{enumerable:!0,get:n[o]})},t.o=(e,n)=>Object.prototype.hasOwnProperty.call(e,n),t.nc=void 0,(()=>{"use strict";class e{creators;static _instance;static ELEMENT_TYPES={BLOCK_PARAGRAPH:"block-p",PARAGRAPH:"p",CHECKBOX_ITEM:"checkboxItem",LIST_ITEM:"listItem",CODE:"code",QUOTE:"blockquote",BULLETED_LIST:"ul",NUMBERED_LIST:"ol",CHECK_LIST:"checkLists",HEADER_1:"h1",HEADER_2:"h2",HEADER_3:"h3",HEADER_4:"h4",HEADER_5:"h5",HEADER_6:"h6",DRAG_HANDLE_BUTTON:"drag-handle-button"};constructor(){if(e._instance)throw new Error("Use ElementFactoryService.getInstance() to get instance.");this.creators={},this.register(e.ELEMENT_TYPES.BLOCK_PARAGRAPH,e.blockParagraphCreator()),this.register(e.ELEMENT_TYPES.PARAGRAPH,e.paragraphCreator()),this.register(e.ELEMENT_TYPES.CHECKBOX_ITEM,e.checkboxItemCreator()),this.register(e.ELEMENT_TYPES.LIST_ITEM,e.listItemCreator()),this.register(e.ELEMENT_TYPES.CODE,e.codeCreator()),this.register(e.ELEMENT_TYPES.QUOTE,e.quoteCreator()),this.register(e.ELEMENT_TYPES.CHECK_LIST,e.checkListCreator()),this.register(e.ELEMENT_TYPES.BULLETED_LIST,e.bulletedListCreator()),this.register(e.ELEMENT_TYPES.NUMBERED_LIST,e.numberedListCreator()),this.register(e.ELEMENT_TYPES.HEADER_1,e.headingCreator(1)),this.register(e.ELEMENT_TYPES.HEADER_2,e.headingCreator(2)),this.register(e.ELEMENT_TYPES.HEADER_3,e.headingCreator(3)),this.register(e.ELEMENT_TYPES.HEADER_4,e.headingCreator(4)),this.register(e.ELEMENT_TYPES.HEADER_5,e.headingCreator(5)),this.register(e.ELEMENT_TYPES.HEADER_6,e.headingCreator(6)),this.register(e.ELEMENT_TYPES.DRAG_HANDLE_BUTTON,e.dragHandleButtonCreator()),e._instance=this}static getInstance(){return this._instance||(this._instance=new e),this._instance}register(e,n){this.creators[e]=n}create(e,n){const t=this.creators[e];if(!t)throw new TypeError(`No creator registered for type: ${e}`);return t(n||"")}static blockParagraphCreator(){return n=>e.blockParagraph(n)}static paragraphCreator(){return n=>e.paragraph(n)}static headingCreator(n){return t=>e.heading(n,t)}static checkboxItemCreator(){return n=>e.checkboxItem(n||"")}static listItemCreator(){return n=>e.listItem_2(n)}static dragHandleButtonCreator(){return()=>e.dragHandleButton()}static codeCreator(){return e=>{const n=document.createElement("pre"),t=document.createElement("code");return t.textContent=e||"",n.appendChild(t),t.contentEditable="true",n.classList.add("johannes-content-element"),t.classList.add("johannes-code"),n}}static quoteCreator(){return e=>{const n=document.createElement("blockquote");return n.textContent=e||"",n.contentEditable="true",n.classList.add("johannes-content-element"),n}}static checkListCreator(){return n=>{const t=document.createElement("ul");t.contentEditable="true",t.classList.add("johannes-content-element"),t.classList.add("swittable"),t.classList.add("list"),t.classList.add("checkbox-list");const o=e.checkboxItem(n||"");return t.appendChild(o),t}}static bulletedListCreator(){return n=>{const t=document.createElement("ul");t.contentEditable="true",t.classList.add("johannes-content-element"),t.classList.add("swittable"),t.classList.add("list");const o=e.listItem(n||"");return t.appendChild(o),t}}static numberedListCreator(){return n=>{const t=document.createElement("ol");t.contentEditable="true",t.classList.add("johannes-content-element"),t.classList.add("swittable"),t.classList.add("list");const o=e.listItem(n||"");return t.appendChild(o),t}}static paragraph(e=null){const n=document.createElement("p");return n.innerText=e||"",n.contentEditable="true",n.setAttribute("data-type","p"),n.classList.add("johannes-content-element"),n.classList.add("swittable"),n.classList.add("focusable"),n.classList.add("key-trigger"),n.setAttribute("data-placeholder","Write something or type / (slash) to choose a block..."),n}static listItem(e){let n=document.createElement("li");return n.classList.add("focusable"),n.classList.add("deletable"),n.classList.add("editable"),n.classList.add("focus"),n.classList.add("key-trigger"),n.classList.add("list-item"),n.innerText=e,n.contentEditable="true",n.setAttribute("data-placeholder","Item"),n}static heading(e,n=null){const t=document.createElement(`h${e}`);return t.innerText=n||"",t.contentEditable="true",t.setAttribute("data-type",`h${e}`),t.classList.add("johannes-content-element"),t.classList.add("swittable"),t.classList.add("focusable"),t.classList.add("focus"),t.classList.add("key-trigger"),t}static checkboxItem(e){let n=document.createElement("li");n.classList.add("deletable"),n.classList.add("list-item");let t=document.createElement("input");t.setAttribute("type","checkbox");let o=document.createElement("span");return o.textContent=e,o.setAttribute("data-placeholder","To-do"),o.setAttribute("contentEditable","true"),o.classList.add("focusable"),o.classList.add("editable"),o.classList.add("focus"),n.appendChild(t),n.appendChild(o),n}static listItem_2(e=null){let n=document.createElement("li");return n.classList.add("focusable"),n.classList.add("deletable"),n.classList.add("editable"),n.classList.add("focus"),n.classList.add("key-trigger"),n.classList.add("list-item"),n.innerText=e||"",n.setAttribute("contentEditable","true"),n.setAttribute("data-placeholder","Item"),n}static blockParagraph(n=null){let t=document.createElement("div"),o=e.paragraph(n),i=document.createElement("button");return i.innerHTML='',t.appendChild(o),t.classList.add("block"),t.classList.add("deletable"),i.classList.add("drag-handler"),i.classList.add("button-reset"),i.draggable=!0,t}static dragHandleButton(){let e=document.createElement("button");return e.innerHTML='',e.classList.add("drag-handler"),e.classList.add("button-reset"),e.draggable=!0,e}}class n{elementFactoryService;static instance;static BLOCK_OPERATIONS={TURN_INTO:"turnInto",CREATE_DEFAULT_BLOCK:"CreateDefaultBlock",DELETE_FOCUS_ON_PREVIOUS:"DeleteAndFocusOnPrevious",DELETE_FOCUS_ON_NEXT:"DeleteAndFocusOnNext",FOCUS_ON_FIRST:"FocusOnFirst",FOCUS_ON_PREVIOUS:"FocusOnPrevious",FOCUS_ON_NEXT:"FocusOnNext",DELETE:"delete",DUPLICATE:"duplicate",COPY:"copy",PASTE:"pates",CUT:"cut",REMOVE_FORMAT:"removeFormat",TRANSFORM_BLOCK:"transformBlock"};constructor(e){if(n.instance)throw new Error("Use BlockOperationsService.getInstance() to get instance.");this.elementFactoryService=e,n.instance=this}execCommand(e,t,o=null){if(e==n.BLOCK_OPERATIONS.COPY){if(document.getSelection&&navigator.clipboard&&navigator.clipboard.writeText){const e=document.getSelection();if(e&&e.toString().length>0){const n=e.toString();navigator.clipboard.writeText(n).then((()=>{const e=new CustomEvent("copiedText",{bubbles:!0,cancelable:!0});return document.dispatchEvent(e),!0})).catch((e=>{console.error("Error when copy text",e)}))}}return!1}if(e==n.BLOCK_OPERATIONS.CUT){if(document.getSelection&&navigator.clipboard&&navigator.clipboard.writeText){const e=document.getSelection();if(e&&e.toString().length>0){const n=e.toString();e.deleteFromDocument();const t=new CustomEvent("requestHideFloatingToolbar",{bubbles:!0,cancelable:!0});document.dispatchEvent(t),navigator.clipboard.writeText(n).then((()=>!0)).catch((e=>{console.error("Error when cut text: ",e)}))}}return!1}if(e==n.BLOCK_OPERATIONS.PASTE)return navigator.clipboard&&navigator.clipboard.readText&&navigator.clipboard.readText().then((e=>{const n=document.getSelection();if(n&&n.rangeCount>0){const t=n.getRangeAt(0);t.deleteContents(),t.insertNode(document.createTextNode(e));const o=new CustomEvent("requestUpdateFloatingToolbar",{bubbles:!0,cancelable:!0});return document.dispatchEvent(o),!0}console.error("No text selected or clipboard empty.")})).catch((e=>{console.error("Error when pasting text: ",e)})),!1;if(e==n.BLOCK_OPERATIONS.TRANSFORM_BLOCK){const e=this.getCurrentSelectedBlock();e&&o&&this.transformBlock(e,o)}if(e==n.BLOCK_OPERATIONS.REMOVE_FORMAT)return document.execCommand(n.BLOCK_OPERATIONS.REMOVE_FORMAT,!1);if(e==n.BLOCK_OPERATIONS.DELETE){this.deleteAndFocusOnNext();const e=new CustomEvent("requestHideFloatingToolbar",{bubbles:!0,cancelable:!0});return document.dispatchEvent(e),!0}if(e==n.BLOCK_OPERATIONS.DUPLICATE)return this.duplicateSelectedBlock(),!0;if(e==n.BLOCK_OPERATIONS.CREATE_DEFAULT_BLOCK){const e=document.activeElement||null;return this.createDefaultBlock(e),!0}if(e==n.BLOCK_OPERATIONS.FOCUS_ON_FIRST){const e=document.querySelector(".focusable");return!!e&&(e.focus(),!0)}if(e==n.BLOCK_OPERATIONS.DELETE_FOCUS_ON_PREVIOUS)return this.deleteAndFocusOnPrevious(),!0;if(e==n.BLOCK_OPERATIONS.DELETE_FOCUS_ON_NEXT)return this.deleteAndFocusOnNext(),!0;if(e==n.BLOCK_OPERATIONS.FOCUS_ON_PREVIOUS){const e=document.activeElement;return!!e&&(this.focusOnPrevious(e),!0)}if(e==n.BLOCK_OPERATIONS.FOCUS_ON_NEXT){const e=document.activeElement;return!!e&&(this.focusOnNext(e),!0)}if(e==n.BLOCK_OPERATIONS.TURN_INTO){if(!o)throw new Error;const e=n.getDraggableElementFromSelection();this.formatBlock(e,o)}const i=new CustomEvent("requestHideFloatingToolbar",{bubbles:!0,cancelable:!0});return document.dispatchEvent(i),!0}queryCommandState(){throw new Error("Method not implemented.")}static getInstance(t=null){return this.instance||(this.instance=new n(t||e.getInstance())),this.instance}formatBlock(e,n){let t=e.querySelector(".swittable"),o=t.innerText,i=this.elementFactoryService.create(n,o);e.replaceChild(i,t),i.closest(".focusable")||e.querySelector(".focusable")}static getDraggableElementFromSelection(){const e=window.getSelection();if(e&&e.rangeCount>0){let n=e.getRangeAt(0).commonAncestorContainer;for(n.nodeType===Node.TEXT_NODE&&(n=n.parentNode);n&&!(n instanceof HTMLElement);)n=n.parentNode;if(n)return n.closest(".block")}throw new Error}transformBlock(n,t){let o,i=n.querySelector(".swittable"),r=i?.innerText;switch(t){case e.ELEMENT_TYPES.PARAGRAPH:o=this.elementFactoryService.create(e.ELEMENT_TYPES.PARAGRAPH),o.innerText=r;break;case e.ELEMENT_TYPES.HEADER_1:o=this.elementFactoryService.create(e.ELEMENT_TYPES.HEADER_1),o.innerText=r;break;case e.ELEMENT_TYPES.HEADER_2:o=this.elementFactoryService.create(e.ELEMENT_TYPES.HEADER_2),o.innerText=r;break;case e.ELEMENT_TYPES.HEADER_3:o=this.elementFactoryService.create(e.ELEMENT_TYPES.HEADER_3),o.innerText=r;break;case e.ELEMENT_TYPES.HEADER_4:o=this.elementFactoryService.create(e.ELEMENT_TYPES.HEADER_4),o.innerText=r;break;case e.ELEMENT_TYPES.HEADER_5:o=this.elementFactoryService.create(e.ELEMENT_TYPES.HEADER_5),o.innerText=r;break;case e.ELEMENT_TYPES.HEADER_6:o=this.elementFactoryService.create(e.ELEMENT_TYPES.HEADER_6),o.innerText=r;break;case e.ELEMENT_TYPES.CODE:o=document.createElement("pre");const n=document.createElement("code");n.innerText=r,o.appendChild(n);break;case"image":o=document.createElement("img"),o.src=r,o.alt="Descriptive text";break;case e.ELEMENT_TYPES.QUOTE:break;case e.ELEMENT_TYPES.BULLETED_LIST:o=this.elementFactoryService.create(e.ELEMENT_TYPES.BULLETED_LIST,r);break;case e.ELEMENT_TYPES.NUMBERED_LIST:o=this.elementFactoryService.create(e.ELEMENT_TYPES.NUMBERED_LIST,r);break;case e.ELEMENT_TYPES.CHECK_LIST:o=this.elementFactoryService.create(e.ELEMENT_TYPES.CHECK_LIST,r);break;case"separator":break;default:return void console.error("Unsupported type")}o&&(n.replaceChild(o,i),o.closest(".focusable")||n.querySelector(".focusable"))}createNewElement(e){const n=e.target.closest(".johannes-content-element");n&&n.classList.contains("list")?this.createListItem(n):this.createDefaultBlock(n)}createListItem(e){let n=null,t=(document.activeElement,e.closest(".johannes-content-element"));t.classList.contains("checkbox-list")?n=this.elementFactoryService.create("checkboxItem",""):t.classList.contains("list")&&(n=this.elementFactoryService.create("listItem",""))}createDefaultBlock(n){const t=this.elementFactoryService.create(e.ELEMENT_TYPES.BLOCK_PARAGRAPH,"");n&&n.closest(".block")?n.closest(".block").insertAdjacentElement("afterend",t):document.querySelector("#johannesEditor .content").appendChild(t),t.querySelector(".johannes-content-element").focus()}deleteAndFocusOnPrevious(){const e=document.activeElement;this.focusOnPrevious(e),this.deleteTheCurrentElementAndTheDraggableBlockIfEmpty(e)}deleteAndFocusOnNext(){let e=this.getCurrentSelectedBlock()||this.getCurrentActiveBlock();e&&(this.focusOnNext(e),this.deleteTheCurrentElementAndTheDraggableBlockIfEmpty(e))}focusOnPrevious(e,n=null){let t=null;if("LI"===e.tagName.toUpperCase()){let o=e.previousElementSibling;if(!o)return;if(o&&o.classList.contains("focusable"))return t=o,void(n?this.applyCursorXEndPosition(t,n):this.focusOnTheEndOfTheText(t))}if("LI"===e.parentNode.tagName.toUpperCase()){let o=e.closest("li")?.previousElementSibling?.querySelector(".focusable");if(o&&o.classList.contains("focusable"))return t=o,void(n?this.applyCursorXEndPosition(t,n):this.focusOnTheEndOfTheText(t))}let o=e.closest(".block");if(!o)return;let i=o.previousElementSibling;for(;i;){let e=i.querySelectorAll(".focusable");if(e.length>0)return t=e[e.length-1],void(n?this.applyCursorXEndPosition(t,n):this.focusOnTheEndOfTheText(t));i=i.previousElementSibling}}focusOnNext(e,n=null){let t=null;if("LI"===e.tagName.toUpperCase()){let o=e.nextElementSibling;if(o&&o.classList.contains("focusable"))return t=o,n?this.applyCursorXStartPosition(t,n):this.focusOnTheStartOfTheText(t),t}if("LI"===e.parentNode.tagName.toUpperCase()){let o=e.closest("li")?.nextElementSibling?.querySelector(".focusable");if(o&&o.classList.contains("focusable"))return t=o,n?this.applyCursorXStartPosition(t,n):this.focusOnTheStartOfTheText(t),t}let o=e.closest(".block");if(!o)return;let i=o.nextElementSibling;for(;i;){let e=i.querySelectorAll(".focusable");if(e.length>0)return t=e[0],n?this.applyCursorXStartPosition(t,n):this.focusOnTheStartOfTheText(t),t;i=i.nextElementSibling}return t}deleteTheCurrentElementAndTheDraggableBlockIfEmpty(e){const n=e.closest(".block"),t=e.closest(".deletable");t?.remove(),n&&0==n.querySelectorAll(".editable").length&&n.remove()}applyCursorXEndPosition(e,n){const t=window.getSelection(),o=document.createRange();let i=e.lastChild,r=null;for(;i;){if(i.nodeType===Node.TEXT_NODE){r=this.adjustCursorOffset(i,n);break}i=(i.nodeName.toUpperCase(),i.previousSibling)}r&&r.closestNode?(o.setStart(r.closestNode,r.closestOffset),o.collapse(!0),t.removeAllRanges(),t.addRange(o),e.focus()):(o.selectNodeContents(e),o.collapse(!1),t.removeAllRanges(),t.addRange(o),e.focus())}applyCursorXStartPosition(e,n){const t=window.getSelection(),o=document.createRange();let i=e.firstChild,r=null;for(;i;){if(i.nodeType===Node.TEXT_NODE){r=this.adjustCursorOffset(i,n);break}i=i.nextSibling}r&&r.closestNode?(o.setStart(r.closestNode,r.closestOffset),o.collapse(!0),t.removeAllRanges(),t.addRange(o),e.focus()):(o.selectNodeContents(e),o.collapse(!0),t.removeAllRanges(),t.addRange(o),e.focus())}adjustCursorOffset(e,n){let t=document.createRange(),o=e,i=0,r=1/0;for(let o=0;ot.getBoundingClientRect().right&&(i=e.textContent.length),{closestNode:o,closestOffset:i}}focusOnTheEndOfTheText(e){setTimeout((()=>{const n=document.createRange(),t=window.getSelection();n.selectNodeContents(e);let o=e;for(;o.lastChild&&o.lastChild.nodeType===Node.ELEMENT_NODE;)o=o.lastChild;o.lastChild&&(o=o.lastChild),n.setEnd(o,o.textContent.length),n.collapse(!1),t.removeAllRanges(),t.addRange(n),e.focus()}),10)}focusOnTheStartOfTheText(e){setTimeout((()=>{const n=document.createRange(),t=window.getSelection();n.selectNodeContents(e),n.collapse(!0),t.removeAllRanges(),t.addRange(n),e.focus()}),10)}getCurrentSelectedFocusable(){const e=window.getSelection();if(!e||0===e.rangeCount)return null;let n=e.getRangeAt(0).commonAncestorContainer;return n.nodeType===Node.TEXT_NODE&&(n=n.parentNode),n.closest(".focusable")}getCurrentSelectedBlock(){const e=window.getSelection();if(!e||0===e.rangeCount)return null;let n=e.getRangeAt(0).commonAncestorContainer;return n.nodeType===Node.TEXT_NODE&&(n=n.parentNode),n.closest(".block")}getCurrentActiveBlock(){let e=document.activeElement;return e?e.closest(".block"):null}duplicateSelectedBlock(){let e=this.getCurrentSelectedBlock()||this.getCurrentActiveBlock();if(!e||!e.parentNode)return void console.error("O elemento fornecido é inválido ou não está no DOM.");const n=e.cloneNode(!0),t=e.nextSibling;e.parentNode.insertBefore(n,t)}}class o{_canHide;props;htmlElement;constructor(e){this.props=e,this.htmlElement=this.init(),this._canHide=!0}get display(){return"block"}documentAppendTo(e){e.appendChild(this.htmlElement)}get isVisible(){let e=this.htmlElement;if("none"===e.style.display||"hidden"===e.style.visibility||!document.contains(e))return!1;for(;e;){const n=window.getComputedStyle(e);if("none"===n.display||"hidden"===n.visibility)return!1;if(!e.parentElement)break;e=e.parentElement}return!0}show(){this._canHide=!1,this.htmlElement.style.display=this.display,setTimeout((()=>{this._canHide=!0}),100)}hide(){this._canHide||console.warn("Attempted to hide the element before 100 milliseconds have passed since the last display."),this.htmlElement.style.display="none"}get canHide(){return this._canHide&&this.isVisible}set canHide(e){this._canHide=e}focus(){this.htmlElement.focus()}changeColor(e){this.htmlElement.style.color=e}removeColor(){this.htmlElement.style.color="inherit"}changeVisibilityToVisible(){this.htmlElement.style.visibility="visible"}changeVisibilityToHidden(){this.htmlElement.style.visibility="hidden"}get doesElementOverflowScreen(){const e=this.htmlElement.style.display,n=this.htmlElement.style.visibility,t=this.htmlElement.style.position;"none"===e&&(this.htmlElement.style.display="block",this.htmlElement.style.visibility="hidden",this.htmlElement.style.position="absolute");const o=this.htmlElement.getBoundingClientRect(),i=window.innerWidth;return"none"===e&&(this.htmlElement.style.display=e,this.htmlElement.style.visibility=n,this.htmlElement.style.position=t),o.right>i||o.left<0}}class i extends o{constructor(){super({})}init(){const e=document.createElement("span");return e.innerText="No results",e.classList.add("empty-block-options"),e.style.padding="10px",e.style.color="rgba(55, 53, 47, 0.65)",e.style.display="none",e}}class r{head=null;tail=null;length=0;getFirst(){return this.head}getLast(){return this.tail}*[Symbol.iterator](){let e=this.head;if(e)do{yield e,e=e.nextNode}while(e&&e!==this.head)}forEach(e){let n=0;for(let t of this)e(t.value,n,this),n++}any(e){let n=this.head;for(;n;){if(e(n.value))return!0;if(n=n.nextNode,n===this.head)break}return!1}findFirst(e){if(!this.head)return null;let n=this.head;do{if(e(n.value))return n;n=n.nextNode}while(n&&n!==this.head);return null}findLast(e){if(!this.tail)return null;let n=this.tail;do{if(e(n.value))return n;n=n.previousNode}while(n&&n!==this.tail);return null}find(e){let n=this.head;for(;n;){if(n.value==e)return n;if(n=n.nextNode,n===this.head)break}return null}}class s{parentList;previousNode;nextNode;value;constructor(e,n){this.previousNode=null,this.nextNode=null,this.value=e,this.parentList=n}setNext(e){this.nextNode=e}setPrevious(e){this.previousNode=e}getNextSatisfying(e){let n=this.nextNode;const t=this;for(;n;){if(e(n.value))return n;if(n=n.nextNode,n===t)break}return null}getPreviousSatisfying(e){let n=this.previousNode;const t=this;for(;n&&n!==t;){if(e(n.value))return n;if(n=n.previousNode,n===this)break}return null}}class l extends r{constructor(){super()}append(e){const n=new s(e,this);this.head&&this.tail?(n.setPrevious(this.tail),n.setNext(this.head),this.tail.setNext(n),this.head.setPrevious(n),this.tail=n):(this.head=n,this.tail=n,this.head.setNext(this.tail),this.head.setPrevious(this.tail)),this.length++}}class a extends Error{constructor(e){super(`Service not found: ${e}`),this.name="ServiceNotFoundException"}}class c{static instance;services=new Map;constructor(){}static getInstance(){return c.instance||(c.instance=new c),c.instance}getInstanceOf(e){const n=this.services.get(e);if(!n)throw new a(e);return n}registerService(e,n){this.services.set(e,n)}registerServices(e){e.forEach(((e,n)=>{this.registerService(n,e)}))}reset(){this.services.clear()}}class d extends o{static id="quickMenu";blockOperationsService;currentFocusedMenuItem;htmlFocusedElementBeforeOpenQuickMenu;menuSections;quickMenuEmpty;filterInput;static instance;constructor(){super({}),this.blockOperationsService=c.getInstance().getInstanceOf("IBlockOperationsService"),this.currentFocusedMenuItem=null,this.htmlFocusedElementBeforeOpenQuickMenu=null,this.menuSections=new l,this.quickMenuEmpty=new i;let e=this.htmlElement.querySelector(".block-options");this.quickMenuEmpty.documentAppendTo(e),this.attachEvents(),this.filterInput=""}init(){const e=document.createElement("div");e.id=d.id,e.classList.add("block-options-wrapper","soft-box-shadow"),e.style.display="none";const n=document.createElement("div");return n.classList.add("block-options"),n.style.position="relative",e.appendChild(n),e}append(e){this.menuSections.append(e),this.htmlElement.querySelector(".block-options").appendChild(e.htmlElement)}static getInstance(){return d.instance||(d.instance=new d),d.instance}switchVisualFocus(e){this.currentFocusedMenuItem!=e&&(this.currentFocusedMenuItem&&this.currentFocusedMenuItem.value.removeFocus(),this.currentFocusedMenuItem=e,this.currentFocusedMenuItem.value.focus(),this.htmlFocusedElementBeforeOpenQuickMenu?.focus())}focusOnTheFirstVisibleItem(){const e=this.menuSections.getFirst();let n=e;for(;n;){const t=n.value.menuItems.findFirst((e=>e.isVisible));if(t)return void this.switchVisualFocus(t);if(n=n.nextNode,n==e)return}}focusPreviousVisibleItem(){let e;if(this.currentFocusedMenuItem){if(e=this.currentFocusedMenuItem.getPreviousSatisfying((e=>e.isVisible)),!e){let n=this.menuSections.find(this.currentFocusedMenuItem.value.quickMenuSectionInstance).getPreviousSatisfying((e=>e.isVisible));if(!n)return;e=n.value.menuItems.findLast((e=>e.isVisible))}}else{let n=this.menuSections.findLast((e=>e.isVisible));if(!n)return;e=n.value.menuItems.findLast((e=>e.isVisible))}this.switchVisualFocus(e)}focusNextVisibleItem(){let e;if(this.currentFocusedMenuItem){if(e=this.currentFocusedMenuItem.getNextSatisfying((e=>e.isVisible)),!e){let n=this.menuSections.find(this.currentFocusedMenuItem.value.quickMenuSectionInstance).getNextSatisfying((e=>e.isVisible));if(!n)return;e=n.value.menuItems.findFirst((e=>e.isVisible))}}else{let n=this.menuSections.findFirst((e=>e.isVisible));if(!n)return;e=n.value.menuItems.findFirst((e=>e.isVisible))}this.switchVisualFocus(e)}filterItems(){this.menuSections.forEach((e=>{e.filterSection(this.filterInput)})),this.menuSections.any((e=>e.isVisible))?this.quickMenuEmpty.hide():this.quickMenuEmpty.show(),this.focusOnTheFirstVisibleItem()}show(){setTimeout((()=>{if(this.htmlFocusedElementBeforeOpenQuickMenu=document.activeElement,!this.htmlFocusedElementBeforeOpenQuickMenu)throw new Error("Failed to capture the focused element before displaying the QuickMenu. Ensure an element is focused.");const e=window.getSelection();if(!e||0===e.rangeCount)throw new Error("Nenhuma seleção encontrada");const n=e.getRangeAt(0).getBoundingClientRect();this.htmlElement.style.display="flex";const t=this.htmlElement.offsetWidth;let o=n.left+window.scrollX;o+t>window.innerWidth&&(o=window.innerWidth-t-20);const i=this.htmlElement.offsetHeight;let r=n.top+window.scrollY-i-10;r<0&&(r=n.bottom+window.scrollY+10),this.htmlElement.style.left=`${o}px`,this.htmlElement.style.top=`${r}px`,super.show(),this.focusOnTheFirstVisibleItem(),this.htmlFocusedElementBeforeOpenQuickMenu.focus()}),10)}restore(){this.filterInput="",this.menuSections.forEach((e=>{e.restore()}))}hide(){this.restore(),this.htmlFocusedElementBeforeOpenQuickMenu?.focus(),super.hide()}attachEvents(){document.addEventListener("keydown",(e=>{if(this.isVisible||"/"!==e.key||e.ctrlKey||e.shiftKey||e.altKey)if(!this.isVisible||"ArrowLeft"!==e.key||e.ctrlKey||e.shiftKey||e.altKey)if(!this.isVisible||"ArrowRight"!==e.key||e.ctrlKey||e.shiftKey||e.altKey)if(!this.isVisible||"ArrowDown"!==e.key||e.ctrlKey||e.shiftKey||e.altKey)if(!this.isVisible||"ArrowUp"!==e.key||e.ctrlKey||e.shiftKey||e.altKey)if(!this.isVisible||!/^[a-z0-9 ]$/i.test(e.key)||e.ctrlKey||e.shiftKey||e.altKey)if(this.isVisible&&"Backspace"===e.key)""==this.filterInput?this.hide():(this.removeLastFilterInputCharacter(),this.filterItems());else if(!this.isVisible||"Escape"!==e.key||e.ctrlKey||e.shiftKey||e.altKey){if("Enter"===e.key&&this.isVisible&&!e.ctrlKey&&!e.shiftKey&&!e.altKey){e.preventDefault(),e.stopPropagation();let n=this.currentFocusedMenuItem.value.htmlElement.getAttribute("data-type");n&&this.transformHtmlFocusedElementBeforeOpenQuickMenu(n)}}else this.hide();else this.concatFilterInput(e.key),this.filterItems();else e.preventDefault(),this.focusPreviousVisibleItem();else e.preventDefault(),this.focusNextVisibleItem();else e.preventDefault(),e.stopPropagation();else e.preventDefault(),e.stopPropagation();else this.show()})),document.addEventListener("click",(e=>{this.isVisible&&!e.target.closest(`#${this.htmlElement.id}`)&&this.hide()})),document.addEventListener("keydown",(e=>{if("Enter"===e.key&&this.isVisible){e.preventDefault(),e.stopPropagation();const n=this.currentFocusedMenuItem?.value.blockType;n&&this.transformHtmlFocusedElementBeforeOpenQuickMenu(n)}}))}transformHtmlFocusedElementBeforeOpenQuickMenu(e){let n=this.htmlFocusedElementBeforeOpenQuickMenu?.closest(".block");n&&e&&this.blockOperationsService.formatBlock(n,e),this.hide()}concatFilterInput(e){this.filterInput+=e.toLowerCase()}removeLastFilterInputCharacter(){this.filterInput.length>0&&(this.filterInput=this.filterInput.slice(0,-1))}}class A extends r{constructor(){super()}append(e){const n=new s(e,this);this.head&&this.tail?(this.tail.setNext(n),n.setPrevious(this.tail),this.tail=n):(this.head=n,this.tail=n),this.length++}}class u extends o{quickMenuInstance;menuItems=new A;constructor(e){super({title:e.title,classList:e.classList}),this.quickMenuInstance=e.quickMenuInstance}init(){const e=document.createElement("section");e.classList.add(this.props.classList);const n=document.createElement("h2");return n.textContent=this.props.title,e.appendChild(n),e}appendQuickMenuItems(e){e.forEach((e=>{this.appendQuickMenuItem(e)}))}appendQuickMenuItem(e){this.menuItems.append(e),this.htmlElement.appendChild(e.htmlElement)}filterSection(e){this.restore(),""!==e&&(this.menuItems.forEach((n=>{n.filterValue.toLocaleLowerCase().includes(e)||n.hide()})),this.menuItems.any((n=>n.filterValue.toLocaleLowerCase().includes(e)))||this.hide())}restore(){this.show(),this.menuItems.forEach((e=>{e.show()}))}}class p extends o{useElement;constructor(e,n="1rem",t="1rem"){super({hrefUseId:e,width:n,height:t}),this.useElement=this.htmlElement.querySelector("use")}init(){const e=document.createElementNS("http://www.w3.org/2000/svg","svg");e.style.color="rgba(55, 53, 47, 0.85)";let n=document.createElementNS("http://www.w3.org/2000/svg","use");return n.setAttributeNS("http://www.w3.org/1999/xlink","href",`#${this.props.hrefUseId}`),e.appendChild(n),e.setAttribute("width",this.props.width),e.setAttribute("height",this.props.height),e.setAttribute("fill","currentColor"),e}clone(){return new p(this.props.hrefUseId,this.props.width,this.props.height)}setUseTo(e){this.useElement.setAttributeNS("http://www.w3.org/1999/xlink","href",`#${e}`)}}class m extends o{blockType;title;filterValue;description;quickMenuSectionInstance;constructor(e,n,t,o,i,r){super({title:n,description:t,SVGHrefUseId:o}),this.blockType=i,this.title=n,this.description=t,this.filterValue=r,this.quickMenuSectionInstance=e,this.blockType=i,this.attachEvents()}init(){const e=document.createElement("div");e.classList.add("option","option-hover","block-operation"),e.setAttribute("data-block-operation","apply-selected-block-type"),e.setAttribute("tabindex","0"),e.setAttribute("role","option");const n=document.createElement("div");n.classList.add("option-image");const t=new p(this.props.SVGHrefUseId,"100%","100%");n.appendChild(t.htmlElement),e.appendChild(n);const o=document.createElement("div");o.classList.add("option-text");const i=document.createElement("p");i.classList.add("block-title"),i.innerText=this.props.title,o.appendChild(i);const r=document.createElement("p");return r.classList.add("block-description"),r.innerText=this.props.description,o.appendChild(r),e.appendChild(o),e}get display(){return"flex"}focus(){this.htmlElement.classList.add("option-focused"),this.htmlElement.focus()}removeFocus(){this.htmlElement.classList.remove("option-focused")}attachEvents(){this.htmlElement.addEventListener("mousemove",(()=>{const e=this.quickMenuSectionInstance.menuItems.find(this);this.quickMenuSectionInstance.quickMenuInstance.switchVisualFocus(e)})),this.htmlElement.addEventListener("click",(e=>{e.preventDefault(),e.stopPropagation(),this.quickMenuSectionInstance.quickMenuInstance.transformHtmlFocusedElementBeforeOpenQuickMenu(this.blockType)}))}}class h{static build(){const n=d.getInstance(),t=new u({quickMenuInstance:n,title:"Basic blocks",classList:"basic-section"});t.appendQuickMenuItems([new m(t,"Text","Start writing in plain text.","icon-material-format",e.ELEMENT_TYPES.PARAGRAPH,"paragraph text p"),new m(t,"Image","Upload image.","icon-material-aperture","image","image figure photo illustration picture "),new m(t,"Bulleted list","Organize items with bullet points.","icon-wordpress-bulleted-list","bulleted-list","bulleted list unordered list ul"),new m(t,"Numbered list","List items in a numbered format.","icon-wordpress-numbered-list","numbered-list","numbered list number list sequential list ol enumerated list ordered list"),new m(t,"Code","Include code snippet.","icon-wordpress-code-mark","code","code script source markup"),new m(t,"Quote","Highlight text as a quote.","icon-wordpress-quote","quote","quote blockquote citation quotation"),new m(t,"Heading 2","Medium header for sections.","icon-julia-head-2",e.ELEMENT_TYPES.HEADER_2,"header 2 heading 2 h2"),new m(t,"Heading 3","Small header for subsections.","icon-julia-head-2",e.ELEMENT_TYPES.HEADER_3,"header 3 heading 3 h3"),new m(t,"Separator","Visually divide blocks.","icon-wordpress-separator","separator","separator divider rule line")]),n.append(t);const o=new u({quickMenuInstance:n,title:"Heading",classList:"heading-section"});o.appendQuickMenuItems([new m(o,"Heading 1","Large header for main topics.","icon-julia-head-1",e.ELEMENT_TYPES.HEADER_1,"header 1 heading 1 h1"),new m(o,"Heading 2","Medium header for sections.","icon-julia-head-2",e.ELEMENT_TYPES.HEADER_2,"header 2 heading 2 h2"),new m(o,"Heading 3","Small header for subsections.","icon-julia-head-3",e.ELEMENT_TYPES.HEADER_3,"header 3 heading 3 h3"),new m(o,"Heading 4","Detailed header for subtopics.","icon-julia-head-4",e.ELEMENT_TYPES.HEADER_4,"header 4 heading 4 h4"),new m(o,"Heading 5","Minor header for specifics.","icon-julia-head-5",e.ELEMENT_TYPES.HEADER_5,"header 5 heading 5 h5"),new m(o,"Heading 6","Smallest header for fine details.","icon-julia-head-6",e.ELEMENT_TYPES.HEADER_6,"header 6 heading 6 h6")]),n.append(o);const i=new u({quickMenuInstance:n,title:"List",classList:"list-section"});return i.appendQuickMenuItems([new m(i,"Todo list","Track tasks with checkboxes.","icon-material-check-list-2","todo-list","todo list task list checklist"),new m(i,"Bulleted list","Organize items with bullet points.","icon-wordpress-bulleted-list","bulleted-list","bulleted list unordered list ul"),new m(i,"Numbered list","List items in a numbered format.","icon-wordpress-numbered-list","numbered-list","numbered list number list sequential list ol enumerated list ordered list")]),n.append(i),n}}class E extends o{dropdownButton;dropdownList;constructor(e,n){super({}),this.dropdownButton=e,this.dropdownList=n,e.documentAppendTo(this.htmlElement),n.documentAppendTo(this.htmlElement)}init(){const e=document.createElement("div");return e.classList.add("select-wrapper"),e}}class C{static instance;constructor(){if(C.instance)throw new Error}static getInstance(){return this.instance||(this.instance=new C),this.instance}execCommand(e,n,t){if(e==C.QUERY_TEXT_OPERATIONS.INLINE_CODE)return this.toggleCodeExecCommand(),!0;let o=t||void 0;if("initial"==o&&(o=this.getInitialColorAsHex()),e==C.QUERY_TEXT_OPERATIONS.CREATE_LINK){const e=C.getSelectedHTMLElement();if(e?.closest("a"))return document.execCommand("unlink",!1,o);if(n){const e=new CustomEvent("showInputLinkBoxRequested",{bubbles:!0,cancelable:!0});return document.dispatchEvent(e),!0}}if(e==C.QUERY_TEXT_OPERATIONS.HILITE_COLOR||e==C.QUERY_TEXT_OPERATIONS.FORE_COLOR){document.execCommand(e,!1,o);const n=new CustomEvent("colorChange",{bubbles:!0,cancelable:!0});document.dispatchEvent(n)}return document.execCommand(e,!1,o)}static QUERY_TEXT_OPERATIONS={HILITE_COLOR:"hiliteColor",FORE_COLOR:"foreColor",INLINE_CODE:"inlineCode",CREATE_LINK:"createLink",UNDERLINE:"underline"};queryCommandState(e,n){return e===C.QUERY_TEXT_OPERATIONS.CREATE_LINK?!!C.getSelectedHTMLElement()?.closest("a"):(e!==C.QUERY_TEXT_OPERATIONS.UNDERLINE||!C.getSelectedHTMLElement()?.closest("a"))&&(e===C.QUERY_TEXT_OPERATIONS.HILITE_COLOR?this.queryHiliteColor(n):e===C.QUERY_TEXT_OPERATIONS.FORE_COLOR?this.queryForeColor(n):document.queryCommandState(e))}toggleCodeExecCommand(){const e=window.getSelection();if(!e||0===e.rangeCount)return;const n=e.getRangeAt(0);let t=n.commonAncestorContainer;for(;t&&"CODE"!==t.nodeName;)t=t.parentNode;if(t&&"CODE"===t.nodeName){const e=t,o=document.createRange();if(o.selectNodeContents(e),n.toString()===o.toString()){const n=e.parentNode;for(;n&&e.firstChild;)n.insertBefore(e.firstChild,e);n?.removeChild(e)}else{const e=n.toString();document.execCommand("insertHTML",!1,e)}document.getSelection()?.removeAllRanges()}else{const e=(new XMLSerializer).serializeToString(n.cloneContents());document.execCommand("insertHTML",!1,`${e}`)}}queryForeColor(e){const n=window.getSelection();if(!n)return!1;if(!n.rangeCount)return!1;let t=n.getRangeAt(0).commonAncestorContainer;t.nodeType===Node.TEXT_NODE&&(t=t.parentNode);const o=t.closest("font[color]");if(!o)return!1;const i=window.getComputedStyle(o).color;return this.rgbToHex(i).toUpperCase()===e.toUpperCase()}queryHiliteColor(e){const n=window.getSelection();if(!n)return!1;if(!n.rangeCount)return!1;let t=n.getRangeAt(0).commonAncestorContainer;t.nodeType===Node.TEXT_NODE&&(t=t.parentNode);const o=t.closest("span[style*='background-color']")||t.closest("font[style*='background-color']");if(!o)return!1;const i=window.getComputedStyle(o).backgroundColor;return this.rgbToHex(i).toUpperCase()===e.toUpperCase()}rgbToHex(e){return"#"+e.match(/\d+/g).map(Number).map((e=>{const n=e.toString(16);return 1===n.length?"0"+n:n})).join("")}getInitialColorAsHex(){const e=document.createElement("div");document.body.appendChild(e),e.style.color="initial";const n=window.getComputedStyle(e).color;return document.body.removeChild(e),this.rgbToHex(n)}getTargetElementMap(e){switch(e){case"strong":case"bold":case"b":return"strong";case"italic":case"i":case"em":return"em";case"underline":case"u":return"u";case"strikethrough":case"s":return"s";case"background":case"color":return"span";default:throw new Error}}static getSelectedHTMLElement(){const e=window.getSelection();if(e&&e.rangeCount>0){let n=e.getRangeAt(0).commonAncestorContainer;for(n.nodeType===Node.TEXT_NODE&&(n=n.parentNode);n&&!(n instanceof HTMLElement);)n=n.parentNode;if(n)return n}return null}getSelectedTextNodes(){const e=window.getSelection();if(!e||0===e.rangeCount)return[];const n=[];for(let t=0;to.intersectsNode(e)?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_REJECT});let r;for(;r=i.nextNode();)if(r.nodeType===Node.TEXT_NODE){const e=document.createRange();e.selectNodeContents(r),-1===o.compareBoundaryPoints(Range.END_TO_START,e)&&1===o.compareBoundaryPoints(Range.START_TO_END,e)&&n.push(r)}}return n}findClosestMatchingParent(e,n){for(e&&e.nodeType===Node.TEXT_NODE&&(e=e.parentElement);e&&e!==document.body;){if(e.nodeType===Node.ELEMENT_NODE){const t=e;if(t.tagName.toLowerCase()===n.nodeType.toLowerCase()&&(!n.classes||n.classes.every((e=>t.classList.contains(e)))))return t}e=e.parentElement}return null}extractSelectedText(e){const n=window.getSelection();if(!n||0===n.rangeCount)return"";const t=n.getRangeAt(0);if(e.nodeType!==Node.TEXT_NODE)return"";const o=e.textContent||"";let i=0,r=o.length;return t.intersectsNode(e)?(t.startContainer===e?i=t.startOffset:t.startContainer.contains(e)&&(i=0),t.endContainer===e?r=t.endOffset:t.endContainer.contains(e)&&(r=o.length),i{if("Enter"==e.key&&this.isVisible){e.preventDefault(),e.stopPropagation();const n=this.htmlElement.value;setTimeout((()=>{C.getInstance().execCommand(C.QUERY_TEXT_OPERATIONS.CREATE_LINK,!1,n)}),10),this.htmlElement.value="",this.parentWrapper?.hide()}"Escape"==e.key&&this.isVisible&&(this.htmlElement.value="",this.parentWrapper?.hide())})),document.addEventListener("click",(e=>{!this.canHide||e.target.closest(`#${this.htmlElement.id}`)||e.target.closest("#floatingToolbar")||this.parentWrapper?.hide()})),this.htmlElement.addEventListener("keydown",(e=>{"/"==e.key&&e.stopPropagation()}))}}class b extends o{inputLinkBox;range;highlights=[];constructor(){const e=new g;super({inputLinkBox:e}),this.inputLinkBox=e,this.attachEvent(),e.setParentWrapper(this)}init(){const e=document.createElement("div");return e.id="linkBox",e.style.display="none",e.classList.add("dependent-box"),e.style.position="absolute",e.appendChild(this.props.inputLinkBox.htmlElement),e}attachEvent(){document.addEventListener("showInputLinkBoxRequested",(()=>{this.show(),this.highlightSelectedText(),this.inputLinkBox.focus()}))}hide(){super.hide(),this.removeHighlights(),setTimeout((()=>{const e=new CustomEvent("showInputLinkBoxFinished",{bubbles:!0,cancelable:!0});document.dispatchEvent(e)}),0)}highlightSelectedText(){const e=window.getSelection();if(!e?.rangeCount)return;const n=e.getRangeAt(0).getClientRects();for(let e=0;e{document.body.removeChild(e)})),this.highlights=[]}}class f{static isSelectedTextDescendantOf(e){const n=document.getSelection();if(!n)return!1;if(!n.rangeCount)return!1;let t=n.getRangeAt(0).startContainer;return t.nodeType===Node.TEXT_NODE&&(t=t.parentNode),!!t&&null!==t.closest(e)}}class B extends o{dropdowns;currentSelectionRange;inputLinkBoxWrapper;constructor(){const e=new b;super({inputLinkBoxWrapper:e}),this.inputLinkBoxWrapper=e,this.attachEvents(),this.dropdowns=[],this.currentSelectionRange=null}init(){const e=document.createElement("div");e.id="floatingToolbar",e.style.display="none",e.classList.add("soft-box-shadow");const n=document.createElement("div");n.classList.add("select-wrapper"),e.appendChild(n);const t=document.getElementById("johannesEditor");return t?.appendChild(this.props.inputLinkBoxWrapper.htmlElement),e}get display(){return"flex"}show(){requestAnimationFrame((()=>{const e=window.getSelection();if(!e||0===e.rangeCount)throw new Error("Nenhuma seleção encontrada");this.currentSelectionRange=e.getRangeAt(0);const n=e.getRangeAt(0).getBoundingClientRect();this.htmlElement.style.display="flex";const t=this.htmlElement.offsetWidth;let o=n.left+window.scrollX-50;o+t>window.innerWidth&&(o=window.innerWidth-t-20);const i=this.htmlElement.offsetHeight;let r=n.top+window.scrollY-i-10;r<0&&(r=n.bottom+window.scrollY+10),this.htmlElement.style.left=`${o}px`,this.htmlElement.style.top=`${r}px`,super.show()}))}hide(){this.currentSelectionRange=null,super.hide()}appendDropdown(e){this.dropdowns.push(e),this.htmlElement.appendChild(e.htmlElement)}appendSeparator(e){this.htmlElement.appendChild(e.htmlElement)}appendTextToolbar(e){this.htmlElement.appendChild(e.htmlElement)}anyDropdownVisible(){for(const e of this.dropdowns)if(e.dropdownList.isVisible)return!0;return!1}hideAllDropdownVisible(){for(const e of this.dropdowns)e.dropdownList.canHide&&e.dropdownList.hide();return!1}attachEvents(){document.addEventListener("showInputLinkBoxRequested",(()=>{this.canHide=!1})),document.addEventListener("showInputLinkBoxFinished",(()=>{this.canHide=!0,this.restoreRangeSelection()})),document.addEventListener("keydown",(e=>{this.canHide&&"Escape"===e.key&&(this.anyDropdownVisible()?this.hideAllDropdownVisible():this.hide()),!this.canHide||"ArrowLeft"!==e.key&&"ArrowRight"!==e.key&&"ArrowUp"!==e.key&&"ArrowDown"!==e.key||this.isSelectionEmpty()&&this.hide()})),document.addEventListener("keyup",(e=>{if(("Shift"===e.key||"Control"===e.key)&&""!==window.getSelection().toString().trim()){if(f.isSelectedTextDescendantOf(".title"))return;e.preventDefault(),e.stopPropagation(),this.show()}})),document.addEventListener("click",(e=>{!this.canHide||e.target.closest(`#${this.htmlElement.id}`)||this.anyDropdownVisible()?!this.isVisible||e.target.closest(`#${this.htmlElement.id}`)||this.inputLinkBoxWrapper.isVisible||this.restoreRangeSelection():this.hide()})),document.addEventListener("mouseup",(e=>{this.isVisible||requestAnimationFrame((()=>{if(""!==window.getSelection().toString().trim()){if(f.isSelectedTextDescendantOf(".title"))return;e.preventDefault(),e.stopPropagation(),this.show()}}))})),document.addEventListener("selectedBlockDeleted",(e=>{this.canHide&&this.hide()})),document.addEventListener("requestHideFloatingToolbar",(()=>{this.canHide&&(this.anyDropdownVisible()&&this.hideAllDropdownVisible(),this.hide())}))}isSelectionEmpty(){const e=document.getSelection();return!e||0===e.rangeCount||""===e.toString().trim()}restoreRangeSelection(){document.getSelection()?.removeAllRanges(),document.getSelection()?.addRange(this.currentSelectionRange)}}class I extends o{textOperationService;command;value;activeIcon;parentDropdownMenuList;constructor(e,n,t,o,i,r,s,l=null){const a=new p("icon-material-small-check");a.htmlElement.style.visibility="hidden",i&&(r.style.color=i),super({id:e,leftIcon:r,title:s,icon:a,shortcut:l}),this.command=o,this.value=i,this.textOperationService=t,this.parentDropdownMenuList=n,this.activeIcon=a,this.attachEvent()}focus(){this.htmlElement.classList.add("option-focused")}removeFocus(){this.htmlElement.classList.remove("option-focused")}init(){const e=document.createElement("li");e.id=this.props.id,e.classList.add("option","option-hover","block-operation"),e.tabIndex=2,e.style.color="#37352F";const n=document.createElement("div");n.classList.add("text-option"),n.appendChild(this.props.leftIcon);const t=document.createElement("span");if(t.innerText=this.props.title,n.appendChild(t),e.appendChild(n),e.appendChild(this.props.icon.htmlElement),this.props.shortcut){const n=document.createElement("span");n.innerText=this.props.shortcut,n.style.color="rgba(55, 53, 47, 0.5)",e.appendChild(n)}return e}performAction(){this.textOperationService.execCommand(this.command,!1,this.value),requestAnimationFrame((()=>{const e=window.getSelection();if(!e||0===e.rangeCount)return;let n=e.getRangeAt(0).commonAncestorContainer;n?.nodeType===Node.TEXT_NODE&&(n=n.parentNode);const t=n.closest(".focusable");t&&this.normalizeAndMergeElements(t)}))}attachEvent(){this.htmlElement.addEventListener("mousemove",(()=>{const e=this.parentDropdownMenuList.dropdownItems.find(this);this.parentDropdownMenuList.switchVisualFocus(e)})),this.htmlElement.addEventListener("click",(()=>{this.performAction()})),document.addEventListener("selectionchange",(()=>{this.command!=C.QUERY_TEXT_OPERATIONS.HILITE_COLOR&&this.command!=C.QUERY_TEXT_OPERATIONS.FORE_COLOR||this.changeCheckIconVisibility()})),document.addEventListener("colorChange",(()=>{this.command!=C.QUERY_TEXT_OPERATIONS.HILITE_COLOR&&this.command!=C.QUERY_TEXT_OPERATIONS.FORE_COLOR||this.changeCheckIconVisibility()}))}normalizeAndMergeElements(e){if(!e)return;let n=e.firstChild;for(;n;){n.nodeType===Node.ELEMENT_NODE&&this.normalizeAndMergeElements(n);let e=n.nextSibling;for(;e&&this.shouldMerge(n,e);){n.innerHTML+=e.innerHTML;const t=e.nextSibling;e.parentNode.removeChild(e),e=t}n=n.nextSibling}e.normalize()}shouldMerge(e,n){if(e?.nodeType!==Node.ELEMENT_NODE||n?.nodeType!==Node.ELEMENT_NODE)return!1;const t=e,o=n;return t.tagName===o.tagName&&t.style.cssText===o.style.cssText&&window.getComputedStyle(t).color===window.getComputedStyle(o).color}changeCheckIconVisibility(){requestAnimationFrame((()=>{this.textOperationService.queryCommandState(this.command,this.value)?this.activeIcon?.changeVisibilityToVisible():this.activeIcon?.changeVisibilityToHidden()}))}}class y extends o{parentDropdownParentButton;dropdownItems;currentFocusedMenuItem;constructor(e){super({id:e}),this.dropdownItems=new l,this.currentFocusedMenuItem=null,this.attachEvents()}get display(){return"flex"}init(){const e=document.createElement("ul");return e.id=this.props.id,e.setAttribute("name","block-type"),e.style.display="none",e.classList.add("soft-box-shadow","dependent-box","checkable-items"),e.style.position="absolute",e.style.maxHeight="25vmax",e.style.overflowY="auto",e}append(e){this.dropdownItems.append(e),this.htmlElement.appendChild(e.htmlElement)}setParentDropdownMenuButton(e){this.parentDropdownParentButton=e}attachEvents(){document.addEventListener("keydown",(e=>{this.isVisible&&this.currentFocusedMenuItem&&"Enter"===e.key&&this.currentFocusedMenuItem.value.performAction()})),document.addEventListener("click",(e=>{this.clickedOutsideTheDropdownWhileDropdownIsVisible(e)&&this.hide()})),document.addEventListener("keydown",(e=>{this.keyPressedOutsideTheDropdownWhileDropdownIsVisible(e)&&("ArrowDown"==e.key&&(e.preventDefault(),this.focusNextVisibleItem()),"ArrowUp"==e.key&&(e.preventDefault(),this.focusPreviousVisibleItem()))}))}show(){this.htmlElement.style.left="0",this.htmlElement.style.right="auto",this.doesElementOverflowScreen&&(this.htmlElement.style.left="auto",this.htmlElement.style.right="0"),this.parentDropdownParentButton?.svgIcon?.setUseTo("icon-wordpress-chevron-up"),super.show()}hide(){this.parentDropdownParentButton?.svgIcon?.setUseTo("icon-wordpress-chevron-down"),this.currentFocusedMenuItem?.value.removeFocus(),this.currentFocusedMenuItem=null,super.hide()}switchVisualFocus(e){this.currentFocusedMenuItem!=e&&(this.currentFocusedMenuItem&&this.currentFocusedMenuItem.value.removeFocus(),this.currentFocusedMenuItem=e,this.currentFocusedMenuItem.value.focus())}focusNextVisibleItem(){let e;e=this.currentFocusedMenuItem?this.currentFocusedMenuItem.getNextSatisfying((e=>e instanceof I)):this.dropdownItems.findFirst((e=>e instanceof I)),this.switchVisualFocus(e)}focusPreviousVisibleItem(){let e;e=this.currentFocusedMenuItem?this.currentFocusedMenuItem.getPreviousSatisfying((e=>e instanceof I)):this.dropdownItems.findFirst((e=>e instanceof I)),this.switchVisualFocus(e)}clickedOutsideTheDropdownWhileDropdownIsVisible(e){return this.canHide&&!e.target.closest(`#${this.htmlElement.id}`)}keyPressedOutsideTheDropdownWhileDropdownIsVisible(e){return this.canHide&&!e.target.closest(`#${this.htmlElement.id}`)}}class w extends o{constructor(){super({})}init(){const e=document.createElement("div");return e.style.height="24px",e.style.width="1px",e.style.borderRight="1px solid #d0d0d0",e.style.margin="auto 6px",e}}class T extends o{constructor(){super({})}init(){const e=document.createElement("div");return e.classList.add("item"),e.style.marginLeft="10px",e.style.marginRight="10px",e}}class k extends o{commandService;command;showUI;icon;constructor(e,n,t,o){const i=new p(o,"1.25rem","1.25rem");super({title:t,icon:i}),this.commandService=e,this.command=n,this.showUI=n==C.QUERY_TEXT_OPERATIONS.CREATE_LINK,this.icon=i,this.attachEvents()}init(){const e=document.createElement("button");return e.role="button",e.classList.add("entry","button-reset","text-formatting-operation","option-hover"),e.title=this.props.title,e.tabIndex=1,e.appendChild(this.props.icon.htmlElement),e}attachEvents(){this.htmlElement.addEventListener("click",(e=>{const n=this.getParentEditable();this.commandService.execCommand(this.command,this.showUI),this.changeIconColor(),setTimeout((()=>{n?.normalize()}),10)})),document.addEventListener("selectionchange",(e=>{const n=window.getSelection();n?.isCollapsed||this.changeIconColor()}))}getParentEditable(){let e=window.getSelection().getRangeAt(0).commonAncestorContainer;return 3===e.nodeType&&(e=e.parentNode),e.closest(".editable")}changeIconColor(){this.commandService.queryCommandState(this.command)?this.icon.changeColor("#2382e2"):this.icon.changeColor("rgba(55, 53, 47, 0.85)")}}class v extends o{constructor(e){super({color:e})}init(){const e=document.createElement("div");return e.style.width="1.25rem",e.style.height="1.25rem",e.style.borderRadius="50%",e.style.backgroundColor=this.props.color,e.style.border="1px solid #d0d0d0",e.style.boxSizing="border-box",e}}class x extends o{dropdownList;svgIcon;constructor(e,n,t,o=!0){const i=new p("icon-wordpress-chevron-down");super({id:e,title:n,dropdownList:t,svgIcon:o?i:null}),this.dropdownList=t,this.svgIcon=i,this.attachEvents(),t.setParentDropdownMenuButton(this)}init(){const e=document.createElement("button");if(e.id=this.props.id,e.role="button",e.classList.add("button-reset","text-formatting-select-button","text-formatting-operation","option-hover"),e.tabIndex=1,e.style.position="relative",e.setAttribute("aria-controls",this.props.dropdownList.htmlElement.id),"string"==typeof this.props.title){const n=document.createElement("span");n.textContent=this.props.title,e.appendChild(n)}else e.appendChild(this.props.title);return this.props.svgIcon&&e.appendChild(this.props.svgIcon.htmlElement),e}attachEvents(){this.htmlElement.addEventListener("click",(()=>{this.dropdownList.isVisible||this.dropdownList.show()}))}}class O extends o{parentDropdownMenuList;constructor(e,n){super({title:n}),this.parentDropdownMenuList=e}performAction(){throw new Error("Method not implemented.")}removeFocus(){throw new Error("Method not implemented.")}focus(){throw new Error("Method not implemented.")}init(){const e=document.createElement("li"),n=document.createElement("h3");return n.innerText=this.props.title,e.appendChild(n),e}}class L{static build(){const e=new B;return e.appendDropdown(L.turnIntoDropdown()),e.appendSeparator(L.separator()),e.appendSeparator(L.groupButton()),e.appendDropdown(L.colorDropdown()),e.appendSeparator(L.separator()),e.appendDropdown(L.moreOptionsDropdown()),e}static turnIntoDropdown(){const t=new y("turnIntoSelect"),o=new x("turnIntoButton","Text",t),i=new E(o,t);return t.append(new O(t,"Turn into")),t.append(new I("turnIntoOptionText",t,n.getInstance(),n.BLOCK_OPERATIONS.TRANSFORM_BLOCK,e.ELEMENT_TYPES.PARAGRAPH,S.paragraph.htmlElement,"Text","Ctrl+Shift+Enter")),t.append(new I("turnIntoOptionTodoList",t,n.getInstance(),n.BLOCK_OPERATIONS.TRANSFORM_BLOCK,e.ELEMENT_TYPES.CHECK_LIST,S.todo_list.htmlElement,"Todo list","Ctrl+1")),t.append(new I("turnIntoOptionBulletedList",t,n.getInstance(),n.BLOCK_OPERATIONS.TRANSFORM_BLOCK,e.ELEMENT_TYPES.BULLETED_LIST,S.b_list.htmlElement,"Bulleted list","Ctrl+.")),t.append(new I("turnIntoOptionNumberedList",t,n.getInstance(),n.BLOCK_OPERATIONS.TRANSFORM_BLOCK,e.ELEMENT_TYPES.NUMBERED_LIST,S.n_list.htmlElement,"Numbered list","Ctrl+/")),t.append(new I("turnIntoOptionBlockCode",t,n.getInstance(),n.BLOCK_OPERATIONS.TRANSFORM_BLOCK,e.ELEMENT_TYPES.CODE,S.code.htmlElement,"Block code")),t.append(new I("turnIntoOptionQuote",t,n.getInstance(),n.BLOCK_OPERATIONS.TRANSFORM_BLOCK,e.ELEMENT_TYPES.QUOTE,S.quote.htmlElement,"Quote")),t.append(new I("turnIntoOptionHeading1",t,n.getInstance(),n.BLOCK_OPERATIONS.TRANSFORM_BLOCK,e.ELEMENT_TYPES.HEADER_1,S.head1.htmlElement,"Heading 1","Ctrl+Alt+1")),t.append(new I("turnIntoOptionHeading2",t,n.getInstance(),n.BLOCK_OPERATIONS.TRANSFORM_BLOCK,e.ELEMENT_TYPES.HEADER_2,S.head2.htmlElement,"Heading 2","Ctrl+Alt+2")),t.append(new I("turnIntoOptionHeading3",t,n.getInstance(),n.BLOCK_OPERATIONS.TRANSFORM_BLOCK,e.ELEMENT_TYPES.HEADER_3,S.head3.htmlElement,"Heading 3","Ctrl+Alt+3")),t.append(new I("turnIntoOptionHeading4",t,n.getInstance(),n.BLOCK_OPERATIONS.TRANSFORM_BLOCK,e.ELEMENT_TYPES.HEADER_4,S.head4.htmlElement,"Heading 4","Ctrl+Alt+4")),t.append(new I("turnIntoOptionHeading5",t,n.getInstance(),n.BLOCK_OPERATIONS.TRANSFORM_BLOCK,e.ELEMENT_TYPES.HEADER_5,S.head5.htmlElement,"Heading 5","Ctrl+Alt+5")),t.append(new I("turnIntoOptionHeading6",t,n.getInstance(),n.BLOCK_OPERATIONS.TRANSFORM_BLOCK,e.ELEMENT_TYPES.HEADER_6,S.head6.htmlElement,"Heading 6","Ctrl+Alt+6")),i}static separator(){return new w}static groupButton(){const e=new T;return new k(C.getInstance(),C.QUERY_TEXT_OPERATIONS.CREATE_LINK,"Link","icon-material-link").documentAppendTo(e.htmlElement),new k(C.getInstance(),"bold","Bold","icon-wordpress-bold").documentAppendTo(e.htmlElement),new k(C.getInstance(),"italic","Italic","icon-material-italic").documentAppendTo(e.htmlElement),new k(C.getInstance(),C.QUERY_TEXT_OPERATIONS.UNDERLINE,"Underline","icon-material-underline").documentAppendTo(e.htmlElement),new k(C.getInstance(),C.QUERY_TEXT_OPERATIONS.INLINE_CODE,"Code","icon-material-code-inline").documentAppendTo(e.htmlElement),new k(C.getInstance(),"strikeThrough","Strike-through","icon-wordpress-strike-through").documentAppendTo(e.htmlElement),e}static colorDropdown(){const e=new y("colorTextOptionSelect"),n=new x("colorTextButton",new v("#FAF4D1").htmlElement,e),t=new E(n,e);e.append(new O(e,"Background"));const o=C.getInstance();return e.append(new I("backgroundOptionRed",e,o,C.QUERY_TEXT_OPERATIONS.HILITE_COLOR,"#FDDEDE",new v("#FDDEDE").htmlElement,"Red")),e.append(new I("backgroundOptionGreen",e,o,C.QUERY_TEXT_OPERATIONS.HILITE_COLOR,"#D7F7DC",new v("#D7F7DC").htmlElement,"Green")),e.append(new I("backgroundOptionBlue",e,o,C.QUERY_TEXT_OPERATIONS.HILITE_COLOR,"#D9EDF6",new v("#D9EDF6").htmlElement,"Blue")),e.append(new I("backgroundOptionYellow",e,o,C.QUERY_TEXT_OPERATIONS.HILITE_COLOR,"#FAF4D1",new v("#FAF4D1").htmlElement,"Yellow")),e.append(new I("backgroundOptionGrey",e,o,C.QUERY_TEXT_OPERATIONS.HILITE_COLOR,"#E1E0E0",new v("#E1E0E0").htmlElement,"Grey")),e.append(new I("backgroundOptionNone",e,o,C.QUERY_TEXT_OPERATIONS.HILITE_COLOR,"transparent",new v("transparent").htmlElement,"None")),e.append(new O(e,"Color")),e.append(new I("colorOptionRed",e,o,C.QUERY_TEXT_OPERATIONS.FORE_COLOR,"#D44C47",new p("icon-material-format","1.25rem","1.25rem").htmlElement,"Red")),e.append(new I("colorOptionGreen",e,o,C.QUERY_TEXT_OPERATIONS.FORE_COLOR,"#448361",new p("icon-material-format","1.25rem","1.25rem").htmlElement,"Green")),e.append(new I("colorOptionBlue",e,o,C.QUERY_TEXT_OPERATIONS.FORE_COLOR,"#337EA9",new p("icon-material-format","1.25rem","1.25rem").htmlElement,"Blue")),e.append(new I("colorOptionYellow",e,o,C.QUERY_TEXT_OPERATIONS.FORE_COLOR,"#CB912F",new p("icon-material-format","1.25rem","1.25rem").htmlElement,"Yellow")),e.append(new I("colorOptionGrey",e,o,C.QUERY_TEXT_OPERATIONS.FORE_COLOR,"#787774",new p("icon-material-format","1.25rem","1.25rem").htmlElement,"Grey")),e.append(new I("colorOptionNone",e,o,C.QUERY_TEXT_OPERATIONS.FORE_COLOR,"initial",new p("icon-material-format","1.25rem","1.25rem").htmlElement,"None")),t}static moreOptionsDropdown(){const e=new p("icon-material-more","1.25rem","1.25rem"),t=new y("moreTextOptionSelect"),o=new x("moreTextOptionButton",e.htmlElement,t,!1),i=new E(o,t);return t.append(new O(t,"More options")),t.append(new I("copyOption",t,n.getInstance(),n.BLOCK_OPERATIONS.COPY,null,S.copy.htmlElement,"Copy","Ctrl+C")),t.append(new I("cutOption",t,n.getInstance(),n.BLOCK_OPERATIONS.CUT,null,S.cut.htmlElement,"Cut","Ctrl+X")),t.append(new I("pasteOption",t,n.getInstance(),n.BLOCK_OPERATIONS.PASTE,null,S.paste.htmlElement,"Replace","Ctrl+V")),t.append(new I("duplicateOption",t,n.getInstance(),n.BLOCK_OPERATIONS.DUPLICATE,null,S.duplicate.htmlElement,"Clone Block","Ctrl+D")),t.append(new I("resetOption",t,n.getInstance(),n.BLOCK_OPERATIONS.REMOVE_FORMAT,null,S.eraser.htmlElement,"Reset Style","Ctrl+\\")),t.append(new I("deleteOption",t,n.getInstance(),n.BLOCK_OPERATIONS.DELETE,null,S.delete.htmlElement,"Delete Block","Shift+Del")),i}}const S={paragraph:new p("icon-material-format","1.25rem","1.25rem"),todo_list:new p("icon-material-check-list-2","1.25rem","1.25rem"),b_list:new p("icon-wordpress-bulleted-list","1.25rem","1.25rem"),n_list:new p("icon-wordpress-numbered-list","1.25rem","1.25rem"),code:new p("icon-wordpress-code-mark","1.25rem","1.25rem"),quote:new p("icon-wordpress-quote","1.25rem","1.25rem"),head1:new p("icon-julia-head-1","1.25rem","1.25rem"),head2:new p("icon-julia-head-2","1.25rem","1.25rem"),head3:new p("icon-julia-head-3","1.25rem","1.25rem"),head4:new p("icon-julia-head-4","1.25rem","1.25rem"),head5:new p("icon-julia-head-5","1.25rem","1.25rem"),head6:new p("icon-julia-head-6","1.25rem","1.25rem"),duplicate:new p("icon-material-duplicate","1.25rem","1.25rem"),delete:new p("icon-material-trash","1.25rem","1.25rem"),eraser:new p("icon-material-clear","1.25rem","1.25rem"),copy:new p("icon-material-copy","1.25rem","1.25rem"),cut:new p("icon-material-cut","1.25rem","1.25rem"),paste:new p("icon-material-paste","1.25rem","1.25rem")};class N extends o{blockOperationsService;constructor(e){super({}),this.blockOperationsService=e,this.attachEvents()}init(){const e=document.createElement("button");e.title="Add a new block",e.classList.add("add-block","block-operation");const n=new p("icon-add-block","1.5rem","1.5rem");return e.appendChild(n.htmlElement),e}attachEvents(){this.htmlElement.addEventListener("click",(()=>{this.blockOperationsService.execCommand(n.BLOCK_OPERATIONS.CREATE_DEFAULT_BLOCK,!1)}))}}class _ extends o{constructor(e){super({blockOperationService:e})}init(){const e=document.createElement("div");e.classList.add("add-block-wrapper");const n=new N(this.props.blockOperationService);return e.appendChild(n.htmlElement),e}}class R extends o{blockOperationsService;constructor(e,n){super({elementFactoryService:e,blockOperationsService:n}),this.blockOperationsService=n,this.attachEvent()}init(){const n=document.createElement("div");n.classList.add("content"),window.editorConfig;{const t=this.props.elementFactoryService.create(e.ELEMENT_TYPES.BLOCK_PARAGRAPH);n.append(t)}return n}attachEvent(){document.addEventListener("copiedText",(()=>{const e=document.querySelector("#copyOption .text-option span");e&&(e.textContent="Copied!",setTimeout((()=>{e.textContent="Copy"}),1500))})),document.addEventListener("keydown",(t=>{console.log(`Key: ${t.key}, Code: ${t.code}, Ctrl: ${t.ctrlKey}, Alt: ${t.altKey}, AltGr: ${"AltGraph"===t.key}, NumLock: ${t.getModifierState("NumLock")}`);const o=t.code.startsWith("Numpad"),i=t.getModifierState("NumLock");(t.ctrlKey||t.metaKey)&&t.shiftKey&&"Enter"===t.key?(t.preventDefault(),t.stopPropagation(),this.blockOperationsService.execCommand(n.BLOCK_OPERATIONS.TRANSFORM_BLOCK,!1,e.ELEMENT_TYPES.PARAGRAPH)):!t.ctrlKey&&!t.metaKey||t.shiftKey||"Digit1"!==t.code&&"Numpad1"!==t.code?!t.ctrlKey&&!t.metaKey||t.shiftKey||"."!==t.key?!t.ctrlKey&&!t.metaKey||t.shiftKey||"/"!==t.key?t.ctrlKey&&t.altKey&&("Digit1"===t.code||o&&i&&"Numpad1"===t.code)?(t.preventDefault(),t.stopPropagation(),this.blockOperationsService.execCommand(n.BLOCK_OPERATIONS.TRANSFORM_BLOCK,!1,e.ELEMENT_TYPES.HEADER_1)):t.ctrlKey&&t.altKey&&("Digit2"===t.code||o&&i&&"Numpad2"===t.code)?(t.preventDefault(),t.stopPropagation(),this.blockOperationsService.execCommand(n.BLOCK_OPERATIONS.TRANSFORM_BLOCK,!1,e.ELEMENT_TYPES.HEADER_2)):t.ctrlKey&&t.altKey&&("Digit3"===t.code||o&&i&&"Numpad3"===t.code)?(t.preventDefault(),t.stopPropagation(),this.blockOperationsService.execCommand(n.BLOCK_OPERATIONS.TRANSFORM_BLOCK,!1,e.ELEMENT_TYPES.HEADER_3)):t.ctrlKey&&t.altKey&&("Digit4"===t.code||o&&i&&"Numpad4"===t.code)?(t.preventDefault(),t.stopPropagation(),this.blockOperationsService.execCommand(n.BLOCK_OPERATIONS.TRANSFORM_BLOCK,!1,e.ELEMENT_TYPES.HEADER_4)):t.ctrlKey&&t.altKey&&("Digit5"===t.code||o&&i&&"Numpad5"===t.code)?(t.preventDefault(),t.stopPropagation(),this.blockOperationsService.execCommand(n.BLOCK_OPERATIONS.TRANSFORM_BLOCK,!1,e.ELEMENT_TYPES.HEADER_5)):t.ctrlKey&&t.altKey&&("Digit6"===t.code||o&&i&&"Numpad6"===t.code)?(t.preventDefault(),t.stopPropagation(),this.blockOperationsService.execCommand(n.BLOCK_OPERATIONS.TRANSFORM_BLOCK,!1,e.ELEMENT_TYPES.HEADER_6)):"D"!==t.key&&"d"!==t.key||!t.ctrlKey?"Delete"!==t.key&&"Backspace"!==t.key||!t.shiftKey?"\\"===t.key&&(t.ctrlKey||t.metaKey)?this.blockOperationsService.execCommand(n.BLOCK_OPERATIONS.REMOVE_FORMAT,!1):t.ctrlKey&&t.altKey&&"Digit1"===t.code&&t.preventDefault():(t.preventDefault(),t.stopPropagation(),this.blockOperationsService.execCommand(n.BLOCK_OPERATIONS.DELETE,!1)):(t.preventDefault(),t.stopPropagation(),this.blockOperationsService.execCommand(n.BLOCK_OPERATIONS.DUPLICATE,!1)):(t.preventDefault(),t.stopPropagation(),this.blockOperationsService.execCommand(n.BLOCK_OPERATIONS.TRANSFORM_BLOCK,!1,e.ELEMENT_TYPES.NUMBERED_LIST)):(t.preventDefault(),t.stopPropagation(),this.blockOperationsService.execCommand(n.BLOCK_OPERATIONS.TRANSFORM_BLOCK,!1,e.ELEMENT_TYPES.BULLETED_LIST)):(t.preventDefault(),t.stopPropagation(),this.blockOperationsService.execCommand(n.BLOCK_OPERATIONS.TRANSFORM_BLOCK,!1,e.ELEMENT_TYPES.CHECK_LIST))})),this.htmlElement.addEventListener("keydown",(async e=>{if(!(e.ctrlKey||e.shiftKey||e.altKey))if("Enter"!==e.key||d.getInstance().isVisible)if("Backspace"===e.key){const t=e.target;t.classList.contains("johannes-content-element")&&""===t.textContent?.trim()?this.blockOperationsService.execCommand(n.BLOCK_OPERATIONS.DELETE_FOCUS_ON_PREVIOUS,!1):t.classList.contains("johannes-content-element")&&t.textContent?.trim()}else if("Delete"===e.key){const t=e.target;t.classList.contains("johannes-content-element")&&""===t.textContent?.trim()?this.blockOperationsService.execCommand(n.BLOCK_OPERATIONS.DELETE_FOCUS_ON_NEXT,!1):t.classList.contains("johannes-content-element")&&t.textContent?.trim()}else"ArrowRight"===e.key&&R.isCursorAtEnd(e.target)?this.blockOperationsService.execCommand(n.BLOCK_OPERATIONS.FOCUS_ON_NEXT,!1):"ArrowLeft"===e.key&&R.isCursorAtStart(e.target)?this.blockOperationsService.execCommand(n.BLOCK_OPERATIONS.FOCUS_ON_PREVIOUS,!1):"ArrowDown"===e.key&&R.isCursorOnLastLine()?this.blockOperationsService.execCommand(n.BLOCK_OPERATIONS.FOCUS_ON_NEXT,!1):"ArrowUp"===e.key&&R.isCursorOnFirstLine()&&this.blockOperationsService.execCommand(n.BLOCK_OPERATIONS.FOCUS_ON_PREVIOUS,!1);else e.preventDefault(),this.blockOperationsService.execCommand(n.BLOCK_OPERATIONS.CREATE_DEFAULT_BLOCK,!1)}))}static isCursorAtEnd(e){const n=e.closest(".focusable");if(!n)return!1;const t=window.getSelection();if(!t.rangeCount)return!1;const o=t.getRangeAt(0);let i=o.endContainer;return i.nodeType===Node.TEXT_NODE&&(i=i.parentNode),o.collapsed&&i===n&&o.endOffset===(o.endContainer.textContent||"").length}static isCursorAtStart(e){const n=e.closest(".focusable");if(!n)return!1;const t=window.getSelection();if(!t.rangeCount)return!1;const o=t.getRangeAt(0);let i=o.startContainer;return i.nodeType===Node.TEXT_NODE&&(i=i.parentNode),o.collapsed&&i===n&&0===o.startOffset}static isAtFirstVisibleLine(e){const n=window.getSelection();if(!n.rangeCount)return!1;const t=n.getRangeAt(0).cloneRange();return t.collapse(!0),t.setStart(e,0),t.getBoundingClientRect().top===e.getBoundingClientRect().top}static isAtLastVisibleLine(e){const n=window.getSelection();if(!n.rangeCount)return!1;const t=n.getRangeAt(0).cloneRange();return t.collapse(!1),t.setEnd(e,e.childNodes.length),t.getBoundingClientRect().bottom===e.getBoundingClientRect().bottom}static didCursorMove(e){const n=window.getSelection();if(!n.rangeCount)return Promise.resolve(!1);const t=n.getRangeAt(0).cloneRange().getBoundingClientRect();return new Promise((o=>{setTimeout((()=>{const i=n.getRangeAt(0).cloneRange().getBoundingClientRect(),r=!(t.top===i.top&&t.left===i.left);r||e.preventDefault(),o(r)}),0)}))}static isCursorOnFirstLine(){const e=window.getSelection();if(!e||!e.rangeCount)return!1;const n=e.getRangeAt(0);return 0===n.startOffset&&n.startContainer===n.commonAncestorContainer}static isCursorOnLastLine(){const e=window.getSelection();if(!e||!e.rangeCount)return!1;const n=e.getRangeAt(0);return n.endOffset===n.endContainer.textContent?.length&&n.endContainer===n.commonAncestorContainer}}class M extends o{blockOperationsService;constructor(e){super({}),this.blockOperationsService=e,this.attachEvents()}init(){const e=document.createElement("div");e.classList.add("title");const n=document.createElement("h1");return n.setAttribute("contentEditable","true"),n.setAttribute("data-placeholder","Untitled"),window.editorConfig?.title&&(n.textContent=window.editorConfig?.title),e.appendChild(n),e}attachEvents(){this.htmlElement.addEventListener("keydown",(e=>{"Enter"==e.key&&(e.preventDefault(),this.blockOperationsService.execCommand(n.BLOCK_OPERATIONS.FOCUS_ON_FIRST,!1))}))}}class D extends o{elementFactoryService;static editorId="johannesEditor";static instance;title;content;constructor(e,n){if(super({elementFactoryService:e,blockOperationsService:n}),D.instance)throw new Error("Use BlockOperationsService.getInstance() to get instance.");this.elementFactoryService=e,this.attachEvents(),D.instance=this}init(){const e=document.getElementById(D.editorId)||document.createElement("div");return e.classList.add("johannes-editor"),window.editorConfig,this.title=new M(this.props.blockOperationsService),e.appendChild(this.title.htmlElement),this.content=new R(this.props.elementFactoryService,this.props.blockOperationsService),e.appendChild(this.content.htmlElement),e}static getInstance(e,n){return D.instance||(D.instance=new D(e,n)),D.instance}attachEvents(){const e=document.getElementById(D.editorId);if(e?.addEventListener("mouseover",(e=>{const n=e.target;if(n instanceof Node){let e=n;if(e.nodeType===Node.TEXT_NODE&&(e=e.parentElement),e instanceof Element){const n=e.closest(".block");n&&this.appendDragHandler(n)}else console.error("Event target is not an HTMLElement and cannot handle HTMLElement specific methods:",e)}else console.error("Event target is not a Node:",n)})),"loading"===document.readyState)document.addEventListener("DOMContentLoaded",(()=>{const e=document.querySelector("#johannesEditor > .content .block p");e&&e.focus()}));else{const e=document.querySelector("#johannesEditor > .content .block p");e&&e.focus()}document.addEventListener("paste",(function(e){if("true"===e.target.getAttribute("contenteditable")){e.preventDefault();const n=e.clipboardData;if(n){const e=n.getData("text/plain");D.insertTextAtCursor(e)}}}),!0)}static insertTextAtCursor(e){const n=window.getSelection();if(n&&n.rangeCount>0){const t=n.getRangeAt(0);t.deleteContents();const o=document.createTextNode(e);t.insertNode(o),t.setStartAfter(o),t.setEndAfter(o),n.removeAllRanges(),n.addRange(t)}}appendDragHandler(n){if(n.nodeType===Node.TEXT_NODE&&(n=n.parentNode),!(n instanceof HTMLElement))return void console.error("Provided element is not an HTMLElement:",n);const t=n.closest(".block");let o=t?.querySelector(".drag-handler");!o&&t&&(o=this.elementFactoryService.create(e.ELEMENT_TYPES.DRAG_HANDLE_BUTTON),t.prepend(o))}removeDragHandler(e){if(e.nodeType===Node.TEXT_NODE&&(e=e.parentNode),!(e instanceof HTMLElement))return void console.error("Provided element is not an HTMLElement:",e);const n=e.closest(".block");if(n){const e=n.querySelector(".drag-handler");e?.remove()}}extractContent(){throw new Error("Not implemented Exception")}}class H{static instance;editor;addBlock;floatingToolbar;quickMenu;constructor(e,n,t,o){if(H.instance)throw new Error;this.editor=e,this.addBlock=n,this.floatingToolbar=t,this.quickMenu=o,H.instance=this}static build(t){if(H.instance)return H.instance;const o=c.getInstance();t?(o.reset(),o.registerServices(t)):(o.registerService("IBlockOperationsService",n.getInstance()),o.registerService("IElementFactoryService",e.getInstance()),o.registerService("ITextOperationService",C.getInstance()));const i=D.getInstance(o.getInstanceOf("IElementFactoryService"),o.getInstanceOf("IBlockOperationsService")),r=new _(o.getInstanceOf("IBlockOperationsService")),s=L.build(),l=h.build();return new H(i,r,s,l)}start(){return window.editorConfig,this.editor.htmlElement.appendChild(this.addBlock.htmlElement),window.editorConfig,this.editor.htmlElement.appendChild(this.floatingToolbar.htmlElement),window.editorConfig,this.editor.htmlElement.appendChild(this.quickMenu.htmlElement),this.editor}}document.addEventListener("DOMContentLoaded",(function(){const e=document.querySelector(".johannes-editor");if(e){let n=e.querySelectorAll(".block");if(1==n.length){const e=n[0].querySelector(".johannes-content-element");""==e.innerText&&e.focus()}}})),document.addEventListener("DOMContentLoaded",(function(){H.build().start()})),document.addEventListener("DOMContentLoaded",(function(){const e=document.createElement("div");e.innerHTML='\r\n\r\n \r\n\r\n \r\n\r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n\r\n \x3c!-- tags --\x3e\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n\r\n \r\n\r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n\r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n\r\n \r\n \r\n \r\n\r\n\r\n \r\n \r\n \r\n\r\n',e.className="svg-icons-container",document.body.appendChild(e)})),document.addEventListener("DOMContentLoaded",(function(){})),document.addEventListener("DOMContentLoaded",(function(){document.addEventListener("keydown",(function(e){}))})),document.addEventListener("keyup",(function(e){})),t(528),t(167);var P=t(72),V=t.n(P),q=t(825),F=t.n(q),j=t(659),K=t.n(j),U=t(56),Y=t.n(U),z=t(540),X=t.n(z),Q=t(113),Z=t.n(Q),W=t(282),G={};G.styleTagTransform=Z(),G.setAttributes=Y(),G.insert=K().bind(null,"head"),G.domAPI=F(),G.insertStyleElement=X(),V()(W.A,G),W.A&&W.A.locals&&W.A.locals})()})(); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUMxQyxNQUFNMG9CLEVBQWVycUIsU0FBU1csY0FBYyxPQUM1QzBwQixFQUFhOW1CLFUsdzJoQ0FFYjhtQixFQUFhQyxVQUFZLHNCQUV6QnRxQixTQUFTd2QsS0FBSy9jLFlBQVk0cEIsRUFDOUIsSUMvQkFycUIsU0FBUzJCLGlCQUFpQixvQkFBb0IsV0E0QzlDLElBR0EzQixTQUFTMkIsaUJBQWlCLG9CQUFvQixXQUUxQzNCLFNBQVMyQixpQkFBaUIsV0FBVyxTQUFVNkIsR0FzRS9DLEdBQ0osSUFJQXhELFNBQVMyQixpQkFBaUIsU0FBUyxTQUFVNkIsR0FXN0MsSSxxSUNySUl0RixFQUFVLENBQUMsRUFFZkEsRUFBUWdELGtCQUFvQixJQUM1QmhELEVBQVEwQyxjQUFnQixJQUN4QjFDLEVBQVEwQixPQUFTLFNBQWMsS0FBTSxRQUNyQzFCLEVBQVFlLE9BQVMsSUFDakJmLEVBQVErQyxtQkFBcUIsSUFFaEIsSUFBSSxJQUFTL0MsR0FLSixLQUFXLElBQVFxc0IsUUFBUyxJQUFRQSxNIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvYXNzZXRzL2Nzcy9tYWluLmNzcyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvc291cmNlTWFwcy5qcyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qcyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydEJ5U2VsZWN0b3IuanMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMuanMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZURvbUFQSS5qcyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlVGFnVHJhbnNmb3JtLmpzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2RyYWctYW5kLWRyb3AuanMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvbWVtZW50by5qcyIsIndlYnBhY2s6Ly9qb2hhbm5lcy93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9qb2hhbm5lcy93ZWJwYWNrL3J1bnRpbWUvY29tcGF0IGdldCBkZWZhdWx0IGV4cG9ydCIsIndlYnBhY2s6Ly9qb2hhbm5lcy93ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly9qb2hhbm5lcy93ZWJwYWNrL3J1bnRpbWUvbm9uY2UiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvc2VydmljZXMvZWxlbWVudC1mYWN0b3J5L0VsZW1lbnRGYWN0b3J5U2VydmljZS50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9zZXJ2aWNlcy9ibG9jay1vcGVyYXRpb25zL0Jsb2NrT3BlcmF0aW9uc1NlcnZpY2UudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tcG9uZW50cy9jb21tb24vQmFzZVVJQ29tcG9uZW50LnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbXBvbmVudHMvcXVpY2stbWVudS9RdWlja01lbnVFbXB0eS50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21tb24vQmFzZURvdWJseUxpbmtlZExpc3QudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tbW9uL0pOb2RlLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbW1vbi9DaXJjdWxhckRvdWJseUxpbmtlZExpc3QudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvc2VydmljZXMvZXJyb3JzL1NlcnZpY2VOb3RGb3VuZEV4Y2VwdGlvbi50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9zZXJ2aWNlcy9zZXJ2aWNlLXByb3ZpZGVyL1NlcnZpY2VQcm92aWRlci50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21wb25lbnRzL3F1aWNrLW1lbnUvUXVpY2tNZW51LnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbW1vbi9Eb3VibHlMaW5rZWRMaXN0LnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbXBvbmVudHMvcXVpY2stbWVudS9RdWlja01lbnVTZWN0aW9uLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbXBvbmVudHMvY29tbW9uL1NWR0ljb24udHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tcG9uZW50cy9xdWljay1tZW51L1F1aWNrTWVudUl0ZW0udHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvYnVpbGRlcnMvUXVpY2tNZW51QnVpbGRlci50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvZHJvcGRvd24tdG9vbC9Ecm9wZG93bk1lbnUudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvc2VydmljZXMvdGV4dC1vcGVyYXRpb25zL1RleHRPcGVyYXRpb25TZXJ2aWNlLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbXBvbmVudHMvZmxvYXRpbmctdG9vbGJhci9saW5rLWJveC9JbnB1dExpbmtCb3gudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL2xpbmstYm94L0lucHV0TGlua0JveFdyYXBwZXIudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvdXRpbGl0aWVzL1V0aWxzLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbXBvbmVudHMvZmxvYXRpbmctdG9vbGJhci9GbG9hdGluZ1Rvb2xiYXIudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL2Ryb3Bkb3duLXRvb2wvRHJvcGRvd25NZW51TGlzdEl0ZW0udHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL2Ryb3Bkb3duLXRvb2wvRHJvcGRvd25NZW51TGlzdC50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvc2VwYXJhdG9yL0Zsb2F0aW5nVG9vbGJhclNlcGFyYXRvci50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvZ3JvdXAtYnV0dG9uL0dyb3VwQnV0dG9uLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbXBvbmVudHMvZmxvYXRpbmctdG9vbGJhci9ncm91cC1idXR0b24vR3JvdXBlZEJ1dHRvbi50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvZHJvcGRvd24tdG9vbC9Db2xvckljb24udHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL2Ryb3Bkb3duLXRvb2wvRHJvcGRvd25NZW51QnV0dG9uLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbXBvbmVudHMvZmxvYXRpbmctdG9vbGJhci9kcm9wZG93bi10b29sL0Ryb3Bkb3duTWVudUxpc3RJdGVtVGl0bGUudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvYnVpbGRlcnMvRmxvYXRpbmdUb29sYmFyQnVpbGRlci50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21wb25lbnRzL2FkZC1ibG9jay9BZGRCbG9ja0J1dHRvbi50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21wb25lbnRzL2FkZC1ibG9jay9BZGRCbG9jay50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21wb25lbnRzL2NvbnRlbnQvQ29udGVudC50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21wb25lbnRzL3RpdGxlL1RpdGxlLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbXBvbmVudHMvZWRpdG9yL0VkaXRvci50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9idWlsZGVycy9VSUJ1aWxkZXIudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvdHJpZ2dlcnMvbG9hZC1ldmVudHMuanMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvdHJpZ2dlcnMva2V5cHJlc3MtZXZlbnRzLmpzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2Fzc2V0cy9jc3MvbWFpbi5jc3M/MWZiYSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBgLyoqIENTUyByZXNldCAqL1xuXG4uYnV0dG9uLXJlc2V0IHtcbiAgICBib3JkZXI6IG5vbmU7XG4gICAgbWFyZ2luOiAwO1xuICAgIHBhZGRpbmc6IDA7XG4gICAgd2lkdGg6IGF1dG87XG4gICAgb3ZlcmZsb3c6IHZpc2libGU7XG4gICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gICAgY29sb3I6IGluaGVyaXQ7XG4gICAgZm9udDogaW5oZXJpdDtcbiAgICBsaW5lLWhlaWdodDogbm9ybWFsO1xuICAgIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGluaGVyaXQ7XG4gICAgLW1vei1vc3gtZm9udC1zbW9vdGhpbmc6IGluaGVyaXQ7XG4gICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xufVxuXG5cblxuLyoqIGFkZCBibG9jayAqL1xuLmFkZC1ibG9jayB7XG4gICAgbWFyZ2luOiAwO1xuICAgIHBhZGRpbmc6IDA7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgIGJvcmRlcjogMXB4IHNvbGlkICMwMDA7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XG4gICAgdHJhbnNpdGlvbjogYWxsIDAuM3MgZWFzZTtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIG1hcmdpbi1sZWZ0OiAxLjNyZW07XG59XG5cbi5hZGQtYmxvY2std3JhcHBlciB7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiAzLjEyNXJlbTtcbn1cblxuLmFkZC1ibG9jay13cmFwcGVyOmhvdmVyIC5hZGQtYmxvY2sge1xuICAgIGRpc3BsYXk6IGZsZXg7XG59XG5cbi8qKiBhbmQgYWRkIGJsb2NrICovXG5cblxuXG4vKiogTGlzdCAgKiovXG5vbC5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQsXG51bC5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQge1xuICAgIHBhZGRpbmctbGVmdDogMXJlbSAhaW1wb3J0YW50O1xufVxuXG5cblxuLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCBsaT5idXR0b24ge1xuICAgIC8qIGRpc3BsYXk6IG5vbmU7ICovXG4gICAgZGlzcGxheTogbm9uZTtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgbWFyZ2luLWxlZnQ6IDEwcHg7XG4gICAgdG9wOiAwO1xuXG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICBhbGlnbi1pdGVtczogc3RhcnQ7XG4gICAganVzdGlmeS1jb250ZW50OiBzdGFydDtcblxufVxuXG4uam9oYW5uZXMtY29udGVudC1lbGVtZW50IGxpIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG5cbi5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQgbGk6OmJlZm9yZSB7XG4gICAgbWFyZ2luLWxlZnQ6IDAuMzEyNXJlbTtcbn1cblxuLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCBsaTpob3Zlcj5idXR0b24ge1xuICAgIC8qIGRpc3BsYXk6IGlubGluZS1ibG9jazsgKi9cbiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcblxufVxuXG5wLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIGxpbmUtaGVpZ2h0OiAxO1xuICAgIG1hcmdpbjogMDtcbiAgICBwYWRkaW5nOiAwO1xufVxuXG4uam9oYW5uZXMtY29udGVudC1lbGVtZW50IC5jaGVja2JveC1saXN0IHtcbiAgICBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7XG4gICAgcGFkZGluZy1sZWZ0OiAwICFpbXBvcnRhbnQ7XG59XG5cblxuLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCAuY2hlY2tib3gtbGlzdCBsaSB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIGp1c3RpZnktY29udGVudDogbGVmdDtcbn1cblxuXG4uam9oYW5uZXMtY29udGVudC1lbGVtZW50IHVsLmNoZWNrYm94LWxpc3QgaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdOmNoZWNrZWQrc3BhbiB7XG4gICAgdGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7XG59XG5cbnVsLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudDpub3QoLmNoZWNrYm94LWxpc3QpLFxub2wuam9oYW5uZXMtY29udGVudC1lbGVtZW50Om5vdCguY2hlY2tib3gtbGlzdCkge1xuICAgIHBhZGRpbmctbGVmdDogMS41cmVtICFpbXBvcnRhbnQ7XG59XG5cbi8qKiBhbmQgbGlzdCAqKi9cblxuXG5cbi5ibG9jaz4uZHJhZy1oYW5kbGVyIHtcbiAgICBjb2xvcjogIzg0ODg4ZDtcbiAgICB2aXNpYmlsaXR5OiBoaWRkZW47XG4gICAgY3Vyc29yOiBncmFiO1xuICAgIGFsaWduLXNlbGY6IHN0YXJ0O1xuXG4gICAgLyogYmFja2dyb3VuZC1jb2xvcjogcGluazsgKi9cbiAgICBwYWRkaW5nLXRvcDogMC4zM3JlbTtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG59XG5cbi5kcmFnLWhhbmRsZXIgc3ZnIHtcbiAgICAvKiBiYWNrZ3JvdW5kLWNvbG9yOiByZWQ7ICovXG59XG5cbi5kcmFnLWhhbmRsZXIgc3ZnIHVzZSB7XG4gICAgLyogYmFja2dyb3VuZC1jb2xvcjogYmx1ZTsgKi9cbn1cblxuLmRyYWctaGFuZGxlcjphY3RpdmUge1xuICAgIGN1cnNvcjogZ3JhYmJpbmc7XG59XG5cbi5ibG9jayB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIG1hcmdpbi1ib3R0b206IDFyZW07XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xufVxuXG4uYmxvY2s+Kjpub3QoLmRyYWctaGFuZGxlcikge1xuICAgIHBhZGRpbmctbGVmdDogMS4yNXJlbTtcbn1cblxuLmJsb2NrOmhvdmVyIC5kcmFnLWhhbmRsZXIge1xuICAgIHZpc2liaWxpdHk6IHZpc2libGU7XG4gICAgdmVydGljYWwtYWxpZ246IHRvcDtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHN0YXJ0O1xufVxuXG4uZHJvcC1saW5lIHtcbiAgICBoZWlnaHQ6IDFyZW07XG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzg0ODg4ZDtcbiAgICB3aWR0aDogMTAwJTtcbn1cblxuXG4udGl0bGUgaDEge1xuICAgIG1hcmdpbi1sZWZ0OiAxLjNyZW07XG59XG5cbmgxW2RhdGEtcGxhY2Vob2xkZXJdOmVtcHR5OmJlZm9yZSB7XG4gICAgY29udGVudDogYXR0cihkYXRhLXBsYWNlaG9sZGVyKTtcbiAgICBjb2xvcjogIzg0ODg4ZCAhaW1wb3J0YW50O1xuICAgIGRpc3BsYXk6IGJsb2NrO1xufVxuXG5oMVtkYXRhLXBsYWNlaG9sZGVyXTpmb2N1czpiZWZvcmUge31cblxuXG4qW2NvbnRlbnRlZGl0YWJsZT1cInRydWVcIl06bm90KGgxKTplbXB0eTpiZWZvcmUge1xuICAgIGNvbnRlbnQ6IGF0dHIoZGF0YS1wbGFjZWhvbGRlcik7XG4gICAgY29sb3I6ICM4NDg4OGFjZDtcbiAgICBkaXNwbGF5OiBub25lO1xufVxuXG4qW2NvbnRlbnRlZGl0YWJsZT1cInRydWVcIl06bm90KGgxKTplbXB0eTpob3ZlcjpiZWZvcmUge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xufVxuXG5jaXRlW2NvbnRlbnRlZGl0YWJsZT1cInRydWVcIl06ZW1wdHk6YmVmb3JlIHtcbiAgICBkaXNwbGF5OiBibG9jaztcbn1cblxuKltjb250ZW50ZWRpdGFibGU9XCJ0cnVlXCJdOm5vdChoMSlbZGF0YS1wbGFjZWhvbGRlcl06ZW1wdHk6Zm9jdXM6YmVmb3JlIHtcbiAgICBjb250ZW50OiBhdHRyKGRhdGEtcGxhY2Vob2xkZXIpO1xuICAgIGNvbG9yOiAjODQ4ODhhY2QgIWltcG9ydGFudDtcbiAgICBkaXNwbGF5OiBibG9jaztcbn1cblxuXG5cbmgxIHtcbiAgICBmb250LXNpemU6IDIuNXJlbTtcbiAgICBmb250LXdlaWdodDogYm9sZGVyICFpbXBvcnRhbnQ7XG59XG5cbi5qb2hhbm5lcy1lZGl0b3Ige1xuICAgIHdpZHRoOiAxMDAlO1xuXG59XG5cbi5jb250ZW50IHtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuXG5cbn1cblxucHJlIHtcbiAgICB3aWR0aDogMTAwJTtcbn1cblxuW2NvbnRlbnRlZGl0YWJsZV0ge1xuICAgIG91dGxpbmU6IG5vbmU7XG59XG5cbmJvZHkge1xuICAgIGhlaWdodDogMjAwMHB4O1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNmMGYwZjEgIWltcG9ydGFudDtcblxuICAgIGZvbnQtZmFtaWx5OiBzeXN0ZW0tdWksIC1hcHBsZS1zeXN0ZW0sIFwiU2Vnb2UgVUlcIiwgUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIFwiTm90byBTYW5zXCIsIFwiTGliZXJhdGlvbiBTYW5zXCIsIEFyaWFsLCBzYW5zLXNlcmlmLCBcIkFwcGxlIENvbG9yIEVtb2ppXCIsIFwiU2Vnb2UgVUkgRW1vamlcIiwgXCJTZWdvZSBVSSBTeW1ib2xcIiwgXCJOb3RvIENvbG9yIEVtb2ppXCI7XG59XG5cblxuLmVkaXRvciB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBtYXJnaW4tdG9wOiA4MHB4O1xufVxuXG5wIHtcbiAgICBjb2xvcjogIzI0MjQyNDtcbn1cblxuXG4uYmxvY2ssXG4uYmxvY2sgKiB7XG4gICAgdXNlci1zZWxlY3Q6IHRleHQ7XG59XG5cblxuLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCB7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgcGFkZGluZzogMDtcbiAgICBtYXJnaW46IDA7XG4gICAgLyogYmFja2dyb3VuZC1jb2xvcjogZ3JlZW47ICovXG59XG5cblxuI2pvaGFubmVzRWRpdG9yIHtcbiAgICB3aWR0aDogNjAlO1xuICAgIG1hcmdpbi1sZWZ0OiBhdXRvO1xuICAgIG1hcmdpbi1yaWdodDogYXV0bztcbn1cblxuLmpvaGFubmVzLWVkaXRvciBociB7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiAycHg7XG4gICAgdmlzaWJpbGl0eTogdmlzaWJsZTtcbiAgICBib3JkZXI6IG5vbmU7XG4gICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHJnYmEoNTUsIDUzLCA0NywgMC4xNik7XG59XG5cblxuXG4uam9oYW5uZXMtZWRpdG9yIGJsb2NrcXVvdGUge1xuICAgIG1hcmdpbjogMC41cmVtIDA7XG4gICAgcGFkZGluZy1sZWZ0OiAyMHB4O1xuICAgIGJvcmRlci1sZWZ0OiA0cHggc29saWQgcmdiKDU1LCA1MywgNDcpO1xuICAgIGZvbnQtc3R5bGU6IGl0YWxpY1xufVxuXG4uam9oYW5uZXMtZWRpdG9yIGNpdGUge1xuICAgIHBhZGRpbmctdG9wOiAxcmVtICFpbXBvcnRhbnQ7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xufVxuXG5cbi5qb2hhbm5lcy1lZGl0b3IgY2l0ZTo6YmVmb3JlIHtcbiAgICBjb250ZW50OiAn4oCUICc7XG59XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiNsaW5rQm94IHtcbiAgICBib3JkZXItcmFkaXVzOiAycHg7XG4gICAgcGFkZGluZzogMjBweDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjlmOWY5O1xuXG5cbiAgICBib3gtc2hhZG93OlxuICAgICAgICAwIDRweCA2cHggcmdiYSgwLCAwLCAwLCAwLjEpLFxuICAgICAgICAwIC0ycHggNHB4IHJnYmEoMCwgMCwgMCwgMC4wMiksXG4gICAgICAgIC0ycHggMCA0cHggcmdiYSgwLCAwLCAwLCAwLjAyKSxcbiAgICAgICAgMnB4IDAgNHB4IHJnYmEoMCwgMCwgMCwgMC4wMik7XG5cblxuICAgIGJvcmRlcjogMXB4IHNvbGlkICNkMGQwZDA7XG4gICAgd2lkdGg6IGZpdC1jb250ZW50O1xuICAgIHotaW5kZXg6IDk5OTk5OTtcbiAgICBjb2xvcjogcmdiKDEyMCwgMTE5LCAxMTYpO1xuICAgIGJvcmRlci1yYWRpdXM6IG5vbmU7XG59XG5cblxuI2xpbmtCb3ggaW5wdXQge1xuICAgIHdpZHRoOiAzMTZweDtcbiAgICBwYWRkaW5nOiA4cHggNDBweCA4cHggMTZweDtcbiAgICAvKiBib3JkZXItY29sb3I6ICNkMGQwZDA7ICovXG5cbiAgICBib3JkZXI6IDFweCBzb2xpZCAjOTQ5NDk0O1xuICAgIC8qIGJvcmRlci1yYWRpdXM6IDRweDsgKi9cbiAgICBoZWlnaHQ6IDI0cHg7XG5cbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbn1cblxuXG4jbGlua0JveCBpbnB1dDo6c2VsZWN0aW9uLFxuI2xpbmtCb3ggaW5wdXQ6Zm9jdXMge1xuICAgIGJvcmRlci1yYWRpdXM6IG5vbmU7XG59XG5cblxuXG5cblxuXG5cblxuLyoqIFRleHQgZm9ybWF0dGluZyBCYXIgKiovXG5cblxuXG4jZmxvYXRpbmdUb29sYmFyIHtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gICAgcGFkZGluZzogOHB4IDE2cHg7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2Y5ZjlmOTtcbiAgICB3aWR0aDogZml0LWNvbnRlbnQ7XG4gICAgei1pbmRleDogOTk5OTk5O1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB1c2VyLXNlbGVjdDogbm9uZTtcbn1cblxuLyogVE9ETzogcmVtb3ZlIHRoaXMqL1xuc3BhbiB7XG4gICAgZm9udC1mYW1pbHk6IEFyaWFsLCBzYW5zLXNlcmlmO1xufVxuXG5cbiNmbG9hdGluZ1Rvb2xiYXIgLml0ZW0ge1xuICAgIGNvbG9yOiByZ2IoMTIwLCAxMTksIDExNik7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGdhcDogMTBweDtcbn1cblxuI2Zsb2F0aW5nVG9vbGJhciAuaXRlbT5idXR0b24ge1xuXG4gICAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbn1cblxuXG4jZmxvYXRpbmdUb29sYmFyIHNlbGVjdCB7XG4gICAgY29sb3I6IHJnYigxMjAsIDExOSwgMTE2KTtcbiAgICBib3JkZXI6IG5vbmU7XG4gICAgZm9udC1zaXplOiAwLjg1cmVtO1xuICAgIGJhY2tncm91bmQtY29sb3I6IGluaGVyaXQ7XG59XG5cbi5zZWxlY3Qtd3JhcHBlciB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG59XG5cbi5zZWxlY3Qtd3JhcHBlciB1bCB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIGJhY2tncm91bmQ6ICNmOWY5Zjk7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICB3aWR0aDogZml0LWNvbnRlbnQ7XG4gICAgcGFkZGluZy1ib3R0b206IDAuNXJlbTtcbiAgICBwYWRkaW5nLWxlZnQ6IDVweDtcbiAgICBwYWRkaW5nLXJpZ2h0OiA1cHg7XG4gICAgdG9wOiAyLjJyZW07XG4gICAgY29sb3I6IHJnYig1NSwgNTMsIDQ3KTtcbiAgICBwYWRkaW5nLXJpZ2h0OiAwLjMxMjVyZW07XG59XG5cblxuXG4uc2VsZWN0LXdyYXBwZXIgdWwgbGkge1xuICAgIC8qIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdyAhaW1wb3J0YW50O1xuICAgIGJhY2tncm91bmQtY29sb3I6IHllbGxvdzsgKi9cbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBnYXA6IDAuNjI1cmVtO1xuICAgIHBhZGRpbmc6IDAuMTg3NXJlbSAwLjMxMjVyZW07XG4gICAgYm9yZGVyLXJhZGl1czogMC4xODc1cmVtO1xuICAgIHVzZXItc2VsZWN0OiBub25lICFpbXBvcnRhbnQ7XG5cbiAgICBmb250LXNpemU6IHNtYWxsICFpbXBvcnRhbnQ7XG4gICAgZm9udC13ZWlnaHQ6IDUwMDtcbn1cblxuLnNlbGVjdC13cmFwcGVyIHVsIGxpIHNwYW4ge1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICB3aWR0aDogbWF4LWNvbnRlbnQ7XG59XG5cbi5zZWxlY3Qtd3JhcHBlciB1bCBsaSAub3B0aW9uLWltYWdlIHtcbiAgICB3aWR0aDogMS4zNzVyZW07XG4gICAgaGVpZ2h0OiAxLjM3NXJlbTtcbiAgICBjb2xvcjogIzI0MjQyNDtcbiAgICBwYWRkaW5nOiAwICFpbXBvcnRhbnQ7XG4gICAgbWFyZ2luOiAwICFpbXBvcnRhbnQ7XG59XG5cbi5zZWxlY3Qtd3JhcHBlciB1bCBsaSAub3B0aW9uLWltYWdlIHN2ZyB7XG4gICAgY29sb3I6ICM0ZjRmNGY7XG4gICAgcGFkZGluZzogMCAhaW1wb3J0YW50O1xuICAgIG1hcmdpbjogMCAhaW1wb3J0YW50O1xufVxuXG4udGV4dC1mb3JtYXR0aW5nLXNlbGVjdC1idXR0b24ge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xufVxuXG4jdHVybkludG9CdXR0b24gc3BhbiB7XG4gICAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGZvbnQtc2l6ZTogMC45cmVtO1xuXG59XG5cbiN0dXJuSW50b0J1dHRvbiBzdmcgdXNlIHtcbiAgICBtYXJnaW46IGF1dG87XG59XG5cbi5zZWxlY3Qtd3JhcHBlciB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIGNvbG9yOiByZ2IoMTIwLCAxMTksIDExNik7XG59XG5cblxuLnNlbGVjdC13cmFwcGVyID4gYnV0dG9uIHtcbiAgICBjb2xvcjogcmdiYSg1NSwgNTMsIDQ3LCAwLjg1KTtcbn1cblxuXG5cblxuXG5cblxuY29kZTpub3QocHJlIGNvZGUpIHtcbiAgICBtYXJnaW46IDA7XG4gICAgcGFkZGluZzogMDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZDBkMGQwO1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNmNmY1ZjQ7XG4gICAgZm9udC1zaXplOiBpbmhlcml0O1xuICAgIGZvbnQtc2l6ZTogMXJlbSAhaW1wb3J0YW50O1xuICAgIGJvcmRlcjogMXB4IHNvbGlkICMwMDAwMDAxYTtcbiAgICBwYWRkaW5nOiAwIDNweDtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgYm9yZGVyLXJhZGl1czogNHB4O1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG59XG5cblxuXG5cbmE6bm90KFtocmVmXSkge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNkM2UzZmQ7XG59XG5cbi50ZXh0LWZvcm1hdHRpbmctYnV0dG9uLWFjdGl2ZSB7XG4gICAgY29sb3I6ICMyMzgyZTI7XG59XG5cbi50ZXh0LWZvcm1hdHRpbmctY2lyY2xlLWFjdGl2ZSB7XG4gICAgYm9yZGVyLWNvbG9yOiAjMjM4MmUyICFpbXBvcnRhbnQ7XG59XG5cblxuXG4jbW9yZVRleHRPcHRpb25TZWxlY3Qge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbn1cblxuLm1vcmVUZXh0T3B0aW9uV3JhcHBlciB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xufVxuXG5cbi5zZWxlY3Qtd3JhcHBlciB1bCBsaT5oMyB7XG4gICAgbWFyZ2luOiAwO1xuICAgIGZvbnQtc2l6ZTogc21hbGwgIWltcG9ydGFudDtcbiAgICBjb2xvcjogIzM3MzUyZmE2O1xuICAgIG1hcmdpbjogMDtcbiAgICBwYWRkaW5nOiAwO1xuICAgIGZvbnQtd2VpZ2h0OiA2MDAgIWltcG9ydGFudDtcbiAgICBtYXJnaW4tdG9wOiAwLjMxMjVyZW07XG4gICAgbWFyZ2luLWJvdHRvbTogMC4zMTI1cmVtO1xufVxuXG5cbi5iZ2MtcmVkIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkRERURFO1xufVxuXG4uYmdjLWdyZWVuIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRDdGN0RDO1xufVxuXG4uYmdjLWJsdWUge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNEOUVERjY7XG59XG5cbi5iZ2MteWVsbG93IHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkFGNEQxO1xufVxuXG4uYmdjLWdyZXkge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNFMUUwRTA7XG59XG5cbnAsXG5tYXJrIHtcbiAgICBsaW5lLWhlaWdodDogMTtcbn1cblxuI3R1cm5JbnRvU2VsZWN0IC5vcHRpb24taW1hZ2Uge1xuICAgIC8qIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsgKi9cbn1cblxuLmJvcmRlci1sZXNzLWltYWdlIHtcbiAgICB3aWR0aDogMjRweDtcbiAgICBoZWlnaHQ6IDI0cHg7XG59XG5cblxuXG5cbi8qKiBCbG9jayBPcHRpb25zICoqL1xuLnNvZnQtYm94LXNoYWRvdyB7XG4gICAgbWFyZ2luOiAwO1xuICAgIHBhZGRpbmc6IDA7XG4gICAgYm9yZGVyLXJhZGl1czogMnB4O1xuICAgIGJveC1zaGFkb3c6XG4gICAgICAgIDAgNHB4IDZweCByZ2JhKDAsIDAsIDAsIDAuMSksXG4gICAgICAgIDAgLTJweCA0cHggcmdiYSgyMTYsIDE5NiwgMTk2LCAwLjAyKSxcbiAgICAgICAgLTJweCAwIDRweCByZ2JhKDAsIDAsIDAsIDAuMDIpLFxuICAgICAgICAycHggMCA0cHggcmdiYSgwLCAwLCAwLCAwLjAyKTtcblxuICAgIGJvcmRlcjogMXB4IHNvbGlkICNkMGQwZDA7XG59XG5cbi5ibG9jay1vcHRpb25zLXdyYXBwZXIge1xuICAgIHotaW5kZXg6IDk5OTk5OTtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgZGlzcGxheTogbm9uZTtcbn1cblxuLmJsb2NrLW9wdGlvbnMge1xuICAgIHdpZHRoOiBmaXQtY29udGVudDtcbiAgICBtYXgtaGVpZ2h0OiAxOXJlbTtcbiAgICBvdmVyZmxvdy15OiBhdXRvO1xufVxuXG4uYmxvY2stb3B0aW9ucyB7XG4gICAgcGFkZGluZzogMCAwLjYyNXJlbTtcbiAgICBiYWNrZ3JvdW5kOiAjZjlmOWY5O1xufVxuXG4uYmxvY2stb3B0aW9ucyBzZWN0aW9uIGgyIHtcbiAgICBmb250LXNpemU6IHNtYWxsICFpbXBvcnRhbnQ7XG4gICAgY29sb3I6ICMzNzM1MmZhNjtcbiAgICBtYXJnaW46IDA7XG4gICAgcGFkZGluZzogMDtcbiAgICBmb250LXdlaWdodDogNjAwICFpbXBvcnRhbnQ7XG4gICAgbWFyZ2luLXRvcDogMC4zMTI1cmVtO1xuICAgIG1hcmdpbi1ib3R0b206IDAuMzEyNXJlbTtcbiAgICBwYWRkaW5nLWxlZnQ6IDAuMzEyNXJlbTtcbn1cblxuLmJsb2NrLW9wdGlvbnMgLm9wdGlvbiB7XG4gICAgcGFkZGluZzogMC4zMTI1cmVtIDAuNjI1cmVtO1xuICAgIG1hcmdpbjogMC4zMTI1cmVtIDA7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGp1c3RpZnktY29udGVudDogbGVmdDtcbiAgICBnYXA6IDAuNnJlbTtcbiAgICBib3JkZXItcmFkaXVzOiAzcHg7XG59XG5cbi5ibG9jay1vcHRpb25zIC5vcHRpb246Zm9jdXMge1xuICAgIG91dGxpbmU6IG5vbmU7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2U5ZTllOTtcbiAgICBib3JkZXI6IGluaGVyaXQ7XG59XG5cbi5vcHRpb24tZm9jdXNlZCB7XG4gICAgb3V0bGluZTogbm9uZTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTllOWU5O1xuICAgIGJvcmRlcjogbm9uZTtcbn1cblxuI2RlbGV0ZU9wdGlvbi5vcHRpb24tZm9jdXNlZCB7XG4gICAgY29sb3I6ICNFQjU3NTcgIWltcG9ydGFudDtcbn1cblxuI2RlbGV0ZU9wdGlvbi5vcHRpb24tZm9jdXNlZCBzdmcge1xuICAgIGNvbG9yOiAjRUI1NzU3ICFpbXBvcnRhbnQ7XG59XG5cblxuXG4uYmxvY2stb3B0aW9ucyAub3B0aW9uOmZvY3VzLXZpc2libGUge1xuICAgIG91dGxpbmU6IG5vbmU7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2U5ZTllOTtcbiAgICBib3JkZXI6IGluaGVyaXQ7XG59XG5cbi8qIC5vcHRpb24taG92ZXI6aG92ZXIge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNlOWU5ZTk7XG4gICAgYm94LXNoYWRvdzogMHB4IDBweCAwcHggMnB4ICNlOWU5ZTk7XG4gICAgYm9yZGVyLXJhZGl1czogMXB4O1xuICAgIHRyYW5zaXRpb246IDAuMXMgZWFzZTtcbn0gKi9cblxuLyogLnNlbGVjdC13cmFwcGVyPmJ1dHRvbiwgKi9cblxuLyogI3R1cm5JbnRvQnV0dG9uLFxuI2NvbG9yVGV4dEJ1dHRvbiB7XG4gICAgcGFkZGluZy1sZWZ0OiA0cHg7XG59ICovXG5cbiN0dXJuSW50b0J1dHRvbjpub3QoW2Rpc2FibGVkXSk6aG92ZXIsXG4jY29sb3JUZXh0QnV0dG9uOm5vdChbZGlzYWJsZWRdKTpob3ZlcixcbiNtb3JlVGV4dE9wdGlvbkJ1dHRvbjpub3QoW2Rpc2FibGVkXSk6aG92ZXIsXG4jZmxvYXRpbmdUb29sYmFyIC5pdGVtPmJ1dHRvbjpub3QoW2Rpc2FibGVkXSk6aG92ZXIge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNlOWU5ZTk7XG4gICAgYm94LXNoYWRvdzogMHB4IDBweCAwcHggMnB4ICNlOWU5ZTk7XG4gICAgYm9yZGVyLXJhZGl1czogMXB4O1xuICAgIHRyYW5zaXRpb246IDAuMXMgZWFzZTtcbn1cblxuXG5cbi5vcHRpb25bZm9jdXNlZD1cInRydWVcIl0ge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNiZGU0ZmY7XG59XG5cblxuXG5cblxuLm9wdGlvbi1pbWFnZSB7XG4gICAgd2lkdGg6IDIuODc1cmVtO1xuICAgIGhlaWdodDogMi44NzVyZW07XG4gICAgYm9yZGVyLXJhZGl1czogMC4xODc1cmVtO1xuICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7XG4gICAgY29sb3I6ICM0ZjRmNGY7XG5cbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmO1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG59XG5cbi5vcHRpb24taW1hZ2UgaW1nIHtcbiAgICBtYXgtd2lkdGg6IDIuODc1cmVtO1xuICAgIG1heC1oZWlnaHQ6IDIuODc1cmVtO1xufVxuXG4ub3B0aW9uLWltYWdlIHN2ZyB7XG4gICAgbWFyZ2luOiAwO1xuICAgIHBhZGRpbmc6IDA7XG4gICAgcGFkZGluZzogMC42MjVyZW07XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcblxufVxuXG4ub3B0aW9uLXRleHQgKiB7XG4gICAgbWFyZ2luOiAwO1xuICAgIHBhZGRpbmc6IDA7XG5cbn1cblxuLm9wdGlvbi10ZXh0IC5ibG9jay10aXRsZSB7XG4gICAgZm9udC1zaXplOiBzbWFsbCAhaW1wb3J0YW50O1xuICAgIGZvbnQtd2VpZ2h0OiA1MDA7XG59XG5cbi5vcHRpb24tdGV4dCAuYmxvY2stZGVzY3JpcHRpb24ge1xuICAgIGZvbnQtc2l6ZTogc21hbGwgIWltcG9ydGFudDtcbiAgICBjb2xvcjogcmdiYSg1NSwgNTMsIDQ3LCAwLjUpO1xufVxuXG4vKiogRW5kIEJsb2NrIE9wdGlvbnMgKiovXG5cblxuXG4jZGVsZXRlQmxvY2tCdXR0b246aG92ZXIgc3ZnLFxuI2RlbGV0ZUJsb2NrQnV0dG9uOmhvdmVyIHtcbiAgICBjb2xvcjogcmdiKDIzNSwgODcsIDg3KSAhaW1wb3J0YW50O1xufVxuXG5cblxuLmpvaGFubmVzLWVkaXRvciAqOjpzZWxlY3Rpb24ge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMjExLCAyMjcsIDI1MywgMC41KSAhaW1wb3J0YW50O1xufVxuXG4uam9oYW5uZXMtZWRpdG9yIG1hcmssXG4uam9oYW5uZXMtZWRpdG9yICoge1xuICAgIGxpbmUtaGVpZ2h0OiAxLjUgIWltcG9ydGFudDtcbn1cblxuLm9wdGlvbiB7XG4gICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xufVxuXG4udGV4dC1vcHRpb24ge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHN0YXJ0O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgZ2FwOiAwLjYyNXJlbTtcbn1cblxuXG5cblxuOnJvb3Qge1xuICAgIC8qIGZvbnQtc2l6ZTogMTZweDsgKi9cbiAgICAvKiBUYW1hbmhvIHBhZHLDo28gKi9cbn1cblxuLyogUGFyYSB0ZWxhcyBjb20gZGVuc2lkYWRlIG3DqWRpYSAqL1xuQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAoLXdlYmtpdC1taW4tZGV2aWNlLXBpeGVsLXJhdGlvOiAyKSxcbm9ubHkgc2NyZWVuIGFuZCAobWluLS1tb3otZGV2aWNlLXBpeGVsLXJhdGlvOiAyKSxcbm9ubHkgc2NyZWVuIGFuZCAobWluLXJlc29sdXRpb246IDE5MmRwaSksXG5vbmx5IHNjcmVlbiBhbmQgKG1pbi1yZXNvbHV0aW9uOiAyZHBweCkge1xuICAgIDpyb290IHtcbiAgICAgICAgZm9udC1zaXplOiAxOHB4O1xuICAgICAgICAvKiBBdW1lbnRhIG8gdGFtYW5obyBkYSBmb250ZSBwYXJhIHRlbGFzIGRlIGFsdGEgZGVuc2lkYWRlICovXG4gICAgfVxufVxuXG4vKiBQYXJhIHRlbGFzIGNvbSBhbHTDrXNzaW1hIGRlbnNpZGFkZSAqL1xuQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAoLXdlYmtpdC1taW4tZGV2aWNlLXBpeGVsLXJhdGlvOiAzKSxcbm9ubHkgc2NyZWVuIGFuZCAobWluLS1tb3otZGV2aWNlLXBpeGVsLXJhdGlvOiAzKSxcbm9ubHkgc2NyZWVuIGFuZCAobWluLXJlc29sdXRpb246IDI4OGRwaSksXG5vbmx5IHNjcmVlbiBhbmQgKG1pbi1yZXNvbHV0aW9uOiAzZHBweCkge1xuICAgIDpyb290IHtcbiAgICAgICAgZm9udC1zaXplOiAyMHB4O1xuICAgICAgICAvKiBBaW5kYSBtYWlvciBwYXJhIHRlbGFzIGRlIGRlbnNpZGFkZSBtdWl0byBhbHRhICovXG4gICAgfVxufWAsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vc3JjL2Fzc2V0cy9jc3MvbWFpbi5jc3NcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIkFBQUEsZUFBZTs7QUFFZjtJQUNJLFlBQVk7SUFDWixTQUFTO0lBQ1QsVUFBVTtJQUNWLFdBQVc7SUFDWCxpQkFBaUI7SUFDakIsdUJBQXVCO0lBQ3ZCLGNBQWM7SUFDZCxhQUFhO0lBQ2IsbUJBQW1CO0lBQ25CLCtCQUErQjtJQUMvQixnQ0FBZ0M7SUFDaEMsd0JBQXdCO0FBQzVCOzs7O0FBSUEsZUFBZTtBQUNmO0lBQ0ksU0FBUztJQUNULFVBQVU7SUFDVixhQUFhO0lBQ2IsbUJBQW1CO0lBQ25CLHVCQUF1QjtJQUN2QixzQkFBc0I7SUFDdEIsdUJBQXVCO0lBQ3ZCLHlCQUF5QjtJQUN6QixzQkFBc0I7SUFDdEIsbUJBQW1CO0FBQ3ZCOztBQUVBO0lBQ0ksV0FBVztJQUNYLGdCQUFnQjtBQUNwQjs7QUFFQTtJQUNJLGFBQWE7QUFDakI7O0FBRUEsbUJBQW1COzs7O0FBSW5CLFlBQVk7QUFDWjs7SUFFSSw2QkFBNkI7QUFDakM7Ozs7QUFJQTtJQUNJLG1CQUFtQjtJQUNuQixhQUFhO0lBQ2Isa0JBQWtCO0lBQ2xCLGlCQUFpQjtJQUNqQixNQUFNOztJQUVOLG1CQUFt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QkFBd0I7Ozs7QUFJeEI7O0lBRUksa0NBQWtDO0FBQ3RDOzs7O0FBSUE7SUFDSSxxREFBcUQ7QUFDekQ7O0FBRUE7O0lBRUksMkJBQTJCO0FBQy9COztBQUVBO0lBQ0ksOEJBQThCO0FBQ2xDOztBQUVBO0lBQ0ksYUFBYTtJQUNiLG1CQUFtQjtJQUNuQixzQkFBc0I7SUFDdEIsbUJBQW1CO0lBQ25CLGFBQWE7QUFDakI7Ozs7O0FBS0E7SUFDSSxxQkFBcUI7SUFDckIsbUJBQW1CO0FBQ3ZCOztBQUVBLG1DQUFtQztBQUNuQzs7OztJQUlJO1FBQ0ksZUFBZTtRQUNmLDREQUE0RDtJQUNoRTtBQUNKOztBQUVBLHVDQUF1QztBQUN2Qzs7OztJQUlJO1FBQ0ksZUFBZTtRQUNmLG1EQUFtRDtJQUN2RDtBQUNKXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIi8qKiBDU1MgcmVzZXQgKi9cXG5cXG4uYnV0dG9uLXJlc2V0IHtcXG4gICAgYm9yZGVyOiBub25lO1xcbiAgICBtYXJnaW46IDA7XFxuICAgIHBhZGRpbmc6IDA7XFxuICAgIHdpZHRoOiBhdXRvO1xcbiAgICBvdmVyZmxvdzogdmlzaWJsZTtcXG4gICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XFxuICAgIGNvbG9yOiBpbmhlcml0O1xcbiAgICBmb250OiBpbmhlcml0O1xcbiAgICBsaW5lLWhlaWdodDogbm9ybWFsO1xcbiAgICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBpbmhlcml0O1xcbiAgICAtbW96LW9zeC1mb250LXNtb290aGluZzogaW5oZXJpdDtcXG4gICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xcbn1cXG5cXG5cXG5cXG4vKiogYWRkIGJsb2NrICovXFxuLmFkZC1ibG9jayB7XFxuICAgIG1hcmdpbjogMDtcXG4gICAgcGFkZGluZzogMDtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XFxuICAgIGJvcmRlcjogMXB4IHNvbGlkICMwMDA7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xcbiAgICB0cmFuc2l0aW9uOiBhbGwgMC4zcyBlYXNlO1xcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcbiAgICBtYXJnaW4tbGVmdDogMS4zcmVtO1xcbn1cXG5cXG4uYWRkLWJsb2NrLXdyYXBwZXIge1xcbiAgICB3aWR0aDogMTAwJTtcXG4gICAgaGVpZ2h0OiAzLjEyNXJlbTtcXG59XFxuXFxuLmFkZC1ibG9jay13cmFwcGVyOmhvdmVyIC5hZGQtYmxvY2sge1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbn1cXG5cXG4vKiogYW5kIGFkZCBibG9jayAqL1xcblxcblxcblxcbi8qKiBMaXN0ICAqKi9cXG5vbC5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQsXFxudWwuam9oYW5uZXMtY29udGVudC1lbGVtZW50IHtcXG4gICAgcGFkZGluZy1sZWZ0OiAxcmVtICFpbXBvcnRhbnQ7XFxufVxcblxcblxcblxcbi5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQgbGk+YnV0dG9uIHtcXG4gICAgLyogZGlzcGxheTogbm9uZTsgKi9cXG4gICAgZGlzcGxheTogbm9uZTtcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgICBtYXJnaW4tbGVmdDogMTBweDtcXG4gICAgdG9wOiAwO1xcblxcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xcbiAgICBhbGlnbi1pdGVtczogc3RhcnQ7XFxuICAgIGp1c3RpZnktY29udGVudDogc3RhcnQ7XFxuXFxufVxcblxcbi5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQgbGkge1xcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XFxufVxcblxcbi5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQgbGk6OmJlZm9yZSB7XFxuICAgIG1hcmdpbi1sZWZ0OiAwLjMxMjVyZW07XFxufVxcblxcbi5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQgbGk6aG92ZXI+YnV0dG9uIHtcXG4gICAgLyogZGlzcGxheTogaW5saW5lLWJsb2NrOyAqL1xcbiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcXG5cXG59XFxuXFxucC5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQge1xcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxuICAgIGxpbmUtaGVpZ2h0OiAxO1xcbiAgICBtYXJnaW46IDA7XFxuICAgIHBhZGRpbmc6IDA7XFxufVxcblxcbi5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQgLmNoZWNrYm94LWxpc3Qge1xcbiAgICBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7XFxuICAgIHBhZGRpbmctbGVmdDogMCAhaW1wb3J0YW50O1xcbn1cXG5cXG5cXG4uam9oYW5uZXMtY29udGVudC1lbGVtZW50IC5jaGVja2JveC1saXN0IGxpIHtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcXG4gICAganVzdGlmeS1jb250ZW50OiBsZWZ0O1xcbn1cXG5cXG5cXG4uam9oYW5uZXMtY29udGVudC1lbGVtZW50IHVsLmNoZWNrYm94LWxpc3QgaW5wdXRbdHlwZT1cXFwiY2hlY2tib3hcXFwiXTpjaGVja2VkK3NwYW4ge1xcbiAgICB0ZXh0LWRlY29yYXRpb246IGxpbmUtdGhyb3VnaDtcXG59XFxuXFxudWwuam9oYW5uZXMtY29udGVudC1lbGVtZW50Om5vdCguY2hlY2tib3gtbGlzdCksXFxub2wuam9oYW5uZXMtY29udGVudC1lbGVtZW50Om5vdCguY2hlY2tib3gtbGlzdCkge1xcbiAgICBwYWRkaW5nLWxlZnQ6IDEuNXJlbSAhaW1wb3J0YW50O1xcbn1cXG5cXG4vKiogYW5kIGxpc3QgKiovXFxuXFxuXFxuXFxuLmJsb2NrPi5kcmFnLWhhbmRsZXIge1xcbiAgICBjb2xvcjogIzg0ODg4ZDtcXG4gICAgdmlzaWJpbGl0eTogaGlkZGVuO1xcbiAgICBjdXJzb3I6IGdyYWI7XFxuICAgIGFsaWduLXNlbGY6IHN0YXJ0O1xcblxcbiAgICAvKiBiYWNrZ3JvdW5kLWNvbG9yOiBwaW5rOyAqL1xcbiAgICBwYWRkaW5nLXRvcDogMC4zM3JlbTtcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcbn1cXG5cXG4uZHJhZy1oYW5kbGVyIHN2ZyB7XFxuICAgIC8qIGJhY2tncm91bmQtY29sb3I6IHJlZDsgKi9cXG59XFxuXFxuLmRyYWctaGFuZGxlciBzdmcgdXNlIHtcXG4gICAgLyogYmFja2dyb3VuZC1jb2xvcjogYmx1ZTsgKi9cXG59XFxuXFxuLmRyYWctaGFuZGxlcjphY3RpdmUge1xcbiAgICBjdXJzb3I6IGdyYWJiaW5nO1xcbn1cXG5cXG4uYmxvY2sge1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xcbiAgICBtYXJnaW4tYm90dG9tOiAxcmVtO1xcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XFxufVxcblxcbi5ibG9jaz4qOm5vdCguZHJhZy1oYW5kbGVyKSB7XFxuICAgIHBhZGRpbmctbGVmdDogMS4yNXJlbTtcXG59XFxuXFxuLmJsb2NrOmhvdmVyIC5kcmFnLWhhbmRsZXIge1xcbiAgICB2aXNpYmlsaXR5OiB2aXNpYmxlO1xcbiAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wO1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHN0YXJ0O1xcbn1cXG5cXG4uZHJvcC1saW5lIHtcXG4gICAgaGVpZ2h0OiAxcmVtO1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjODQ4ODhkO1xcbiAgICB3aWR0aDogMTAwJTtcXG59XFxuXFxuXFxuLnRpdGxlIGgxIHtcXG4gICAgbWFyZ2luLWxlZnQ6IDEuM3JlbTtcXG59XFxuXFxuaDFbZGF0YS1wbGFjZWhvbGRlcl06ZW1wdHk6YmVmb3JlIHtcXG4gICAgY29udGVudDogYXR0cihkYXRhLXBsYWNlaG9sZGVyKTtcXG4gICAgY29sb3I6ICM4NDg4OGQgIWltcG9ydGFudDtcXG4gICAgZGlzcGxheTogYmxvY2s7XFxufVxcblxcbmgxW2RhdGEtcGxhY2Vob2xkZXJdOmZvY3VzOmJlZm9yZSB7fVxcblxcblxcbipbY29udGVudGVkaXRhYmxlPVxcXCJ0cnVlXFxcIl06bm90KGgxKTplbXB0eTpiZWZvcmUge1xcbiAgICBjb250ZW50OiBhdHRyKGRhdGEtcGxhY2Vob2xkZXIpO1xcbiAgICBjb2xvcjogIzg0ODg4YWNkO1xcbiAgICBkaXNwbGF5OiBub25lO1xcbn1cXG5cXG4qW2NvbnRlbnRlZGl0YWJsZT1cXFwidHJ1ZVxcXCJdOm5vdChoMSk6ZW1wdHk6aG92ZXI6YmVmb3JlIHtcXG4gICAgZGlzcGxheTogYmxvY2s7XFxufVxcblxcbmNpdGVbY29udGVudGVkaXRhYmxlPVxcXCJ0cnVlXFxcIl06ZW1wdHk6YmVmb3JlIHtcXG4gICAgZGlzcGxheTogYmxvY2s7XFxufVxcblxcbipbY29udGVudGVkaXRhYmxlPVxcXCJ0cnVlXFxcIl06bm90KGgxKVtkYXRhLXBsYWNlaG9sZGVyXTplbXB0eTpmb2N1czpiZWZvcmUge1xcbiAgICBjb250ZW50OiBhdHRyKGRhdGEtcGxhY2Vob2xkZXIpO1xcbiAgICBjb2xvcjogIzg0ODg4YWNkICFpbXBvcnRhbnQ7XFxuICAgIGRpc3BsYXk6IGJsb2NrO1xcbn1cXG5cXG5cXG5cXG5oMSB7XFxuICAgIGZvbnQtc2l6ZTogMi41cmVtO1xcbiAgICBmb250LXdlaWdodDogYm9sZGVyICFpbXBvcnRhbnQ7XFxufVxcblxcbi5qb2hhbm5lcy1lZGl0b3Ige1xcbiAgICB3aWR0aDogMTAwJTtcXG5cXG59XFxuXFxuLmNvbnRlbnQge1xcbiAgICB3aWR0aDogMTAwJTtcXG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXG5cXG5cXG59XFxuXFxucHJlIHtcXG4gICAgd2lkdGg6IDEwMCU7XFxufVxcblxcbltjb250ZW50ZWRpdGFibGVdIHtcXG4gICAgb3V0bGluZTogbm9uZTtcXG59XFxuXFxuYm9keSB7XFxuICAgIGhlaWdodDogMjAwMHB4O1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjBmMGYxICFpbXBvcnRhbnQ7XFxuXFxuICAgIGZvbnQtZmFtaWx5OiBzeXN0ZW0tdWksIC1hcHBsZS1zeXN0ZW0sIFxcXCJTZWdvZSBVSVxcXCIsIFJvYm90bywgXFxcIkhlbHZldGljYSBOZXVlXFxcIiwgXFxcIk5vdG8gU2Fuc1xcXCIsIFxcXCJMaWJlcmF0aW9uIFNhbnNcXFwiLCBBcmlhbCwgc2Fucy1zZXJpZiwgXFxcIkFwcGxlIENvbG9yIEVtb2ppXFxcIiwgXFxcIlNlZ29lIFVJIEVtb2ppXFxcIiwgXFxcIlNlZ29lIFVJIFN5bWJvbFxcXCIsIFxcXCJOb3RvIENvbG9yIEVtb2ppXFxcIjtcXG59XFxuXFxuXFxuLmVkaXRvciB7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIG1hcmdpbi10b3A6IDgwcHg7XFxufVxcblxcbnAge1xcbiAgICBjb2xvcjogIzI0MjQyNDtcXG59XFxuXFxuXFxuLmJsb2NrLFxcbi5ibG9jayAqIHtcXG4gICAgdXNlci1zZWxlY3Q6IHRleHQ7XFxufVxcblxcblxcbi5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQge1xcbiAgICB3aWR0aDogMTAwJTtcXG4gICAgcGFkZGluZzogMDtcXG4gICAgbWFyZ2luOiAwO1xcbiAgICAvKiBiYWNrZ3JvdW5kLWNvbG9yOiBncmVlbjsgKi9cXG59XFxuXFxuXFxuI2pvaGFubmVzRWRpdG9yIHtcXG4gICAgd2lkdGg6IDYwJTtcXG4gICAgbWFyZ2luLWxlZnQ6IGF1dG87XFxuICAgIG1hcmdpbi1yaWdodDogYXV0bztcXG59XFxuXFxuLmpvaGFubmVzLWVkaXRvciBociB7XFxuICAgIHdpZHRoOiAxMDAlO1xcbiAgICBoZWlnaHQ6IDJweDtcXG4gICAgdmlzaWJpbGl0eTogdmlzaWJsZTtcXG4gICAgYm9yZGVyOiBub25lO1xcbiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgcmdiYSg1NSwgNTMsIDQ3LCAwLjE2KTtcXG59XFxuXFxuXFxuXFxuLmpvaGFubmVzLWVkaXRvciBibG9ja3F1b3RlIHtcXG4gICAgbWFyZ2luOiAwLjVyZW0gMDtcXG4gICAgcGFkZGluZy1sZWZ0OiAyMHB4O1xcbiAgICBib3JkZXItbGVmdDogNHB4IHNvbGlkIHJnYig1NSwgNTMsIDQ3KTtcXG4gICAgZm9udC1zdHlsZTogaXRhbGljXFxufVxcblxcbi5qb2hhbm5lcy1lZGl0b3IgY2l0ZSB7XFxuICAgIHBhZGRpbmctdG9wOiAxcmVtICFpbXBvcnRhbnQ7XFxuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG59XFxuXFxuXFxuLmpvaGFubmVzLWVkaXRvciBjaXRlOjpiZWZvcmUge1xcbiAgICBjb250ZW50OiAn4oCUICc7XFxufVxcblxcblxcblxcblxcblxcblxcblxcblxcblxcblxcblxcblxcblxcblxcblxcblxcblxcblxcblxcblxcblxcblxcblxcblxcblxcblxcblxcblxcblxcblxcblxcbiNsaW5rQm94IHtcXG4gICAgYm9yZGVyLXJhZGl1czogMnB4O1xcbiAgICBwYWRkaW5nOiAyMHB4O1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjlmOWY5O1xcblxcblxcbiAgICBib3gtc2hhZG93OlxcbiAgICAgICAgMCA0cHggNnB4IHJnYmEoMCwgMCwgMCwgMC4xKSxcXG4gICAgICAgIDAgLTJweCA0cHggcmdiYSgwLCAwLCAwLCAwLjAyKSxcXG4gICAgICAgIC0ycHggMCA0cHggcmdiYSgwLCAwLCAwLCAwLjAyKSxcXG4gICAgICAgIDJweCAwIDRweCByZ2JhKDAsIDAsIDAsIDAuMDIpO1xcblxcblxcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjZDBkMGQwO1xcbiAgICB3aWR0aDogZml0LWNvbnRlbnQ7XFxuICAgIHotaW5kZXg6IDk5OTk5OTtcXG4gICAgY29sb3I6IHJnYigxMjAsIDExOSwgMTE2KTtcXG4gICAgYm9yZGVyLXJhZGl1czogbm9uZTtcXG59XFxuXFxuXFxuI2xpbmtCb3ggaW5wdXQge1xcbiAgICB3aWR0aDogMzE2cHg7XFxuICAgIHBhZGRpbmc6IDhweCA0MHB4IDhweCAxNnB4O1xcbiAgICAvKiBib3JkZXItY29sb3I6ICNkMGQwZDA7ICovXFxuXFxuICAgIGJvcmRlcjogMXB4IHNvbGlkICM5NDk0OTQ7XFxuICAgIC8qIGJvcmRlci1yYWRpdXM6IDRweDsgKi9cXG4gICAgaGVpZ2h0OiAyNHB4O1xcblxcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG59XFxuXFxuXFxuI2xpbmtCb3ggaW5wdXQ6OnNlbGVjdGlvbixcXG4jbGlua0JveCBpbnB1dDpmb2N1cyB7XFxuICAgIGJvcmRlci1yYWRpdXM6IG5vbmU7XFxufVxcblxcblxcblxcblxcblxcblxcblxcblxcbi8qKiBUZXh0IGZvcm1hdHRpbmcgQmFyICoqL1xcblxcblxcblxcbiNmbG9hdGluZ1Rvb2xiYXIge1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XFxuICAgIHBhZGRpbmc6IDhweCAxNnB4O1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjlmOWY5O1xcbiAgICB3aWR0aDogZml0LWNvbnRlbnQ7XFxuICAgIHotaW5kZXg6IDk5OTk5OTtcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgICB1c2VyLXNlbGVjdDogbm9uZTtcXG59XFxuXFxuLyogVE9ETzogcmVtb3ZlIHRoaXMqL1xcbnNwYW4ge1xcbiAgICBmb250LWZhbWlseTogQXJpYWwsIHNhbnMtc2VyaWY7XFxufVxcblxcblxcbiNmbG9hdGluZ1Rvb2xiYXIgLml0ZW0ge1xcbiAgICBjb2xvcjogcmdiKDEyMCwgMTE5LCAxMTYpO1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xcbiAgICBnYXA6IDEwcHg7XFxufVxcblxcbiNmbG9hdGluZ1Rvb2xiYXIgLml0ZW0+YnV0dG9uIHtcXG5cXG4gICAgZGlzcGxheTogaW5saW5lLWZsZXg7XFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxufVxcblxcblxcbiNmbG9hdGluZ1Rvb2xiYXIgc2VsZWN0IHtcXG4gICAgY29sb3I6IHJnYigxMjAsIDExOSwgMTE2KTtcXG4gICAgYm9yZGVyOiBub25lO1xcbiAgICBmb250LXNpemU6IDAuODVyZW07XFxuICAgIGJhY2tncm91bmQtY29sb3I6IGluaGVyaXQ7XFxufVxcblxcbi5zZWxlY3Qtd3JhcHBlciB7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxufVxcblxcbi5zZWxlY3Qtd3JhcHBlciB1bCB7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgYmFja2dyb3VuZDogI2Y5ZjlmOTtcXG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcXG4gICAgd2lkdGg6IGZpdC1jb250ZW50O1xcbiAgICBwYWRkaW5nLWJvdHRvbTogMC41cmVtO1xcbiAgICBwYWRkaW5nLWxlZnQ6IDVweDtcXG4gICAgcGFkZGluZy1yaWdodDogNXB4O1xcbiAgICB0b3A6IDIuMnJlbTtcXG4gICAgY29sb3I6IHJnYig1NSwgNTMsIDQ3KTtcXG4gICAgcGFkZGluZy1yaWdodDogMC4zMTI1cmVtO1xcbn1cXG5cXG5cXG5cXG4uc2VsZWN0LXdyYXBwZXIgdWwgbGkge1xcbiAgICAvKiBkaXNwbGF5OiBmbGV4O1xcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93ICFpbXBvcnRhbnQ7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHllbGxvdzsgKi9cXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gICAgZ2FwOiAwLjYyNXJlbTtcXG4gICAgcGFkZGluZzogMC4xODc1cmVtIDAuMzEyNXJlbTtcXG4gICAgYm9yZGVyLXJhZGl1czogMC4xODc1cmVtO1xcbiAgICB1c2VyLXNlbGVjdDogbm9uZSAhaW1wb3J0YW50O1xcblxcbiAgICBmb250LXNpemU6IHNtYWxsICFpbXBvcnRhbnQ7XFxuICAgIGZvbnQtd2VpZ2h0OiA1MDA7XFxufVxcblxcbi5zZWxlY3Qtd3JhcHBlciB1bCBsaSBzcGFuIHtcXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbiAgICB3aWR0aDogbWF4LWNvbnRlbnQ7XFxufVxcblxcbi5zZWxlY3Qtd3JhcHBlciB1bCBsaSAub3B0aW9uLWltYWdlIHtcXG4gICAgd2lkdGg6IDEuMzc1cmVtO1xcbiAgICBoZWlnaHQ6IDEuMzc1cmVtO1xcbiAgICBjb2xvcjogIzI0MjQyNDtcXG4gICAgcGFkZGluZzogMCAhaW1wb3J0YW50O1xcbiAgICBtYXJnaW46IDAgIWltcG9ydGFudDtcXG59XFxuXFxuLnNlbGVjdC13cmFwcGVyIHVsIGxpIC5vcHRpb24taW1hZ2Ugc3ZnIHtcXG4gICAgY29sb3I6ICM0ZjRmNGY7XFxuICAgIHBhZGRpbmc6IDAgIWltcG9ydGFudDtcXG4gICAgbWFyZ2luOiAwICFpbXBvcnRhbnQ7XFxufVxcblxcbi50ZXh0LWZvcm1hdHRpbmctc2VsZWN0LWJ1dHRvbiB7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxufVxcblxcbiN0dXJuSW50b0J1dHRvbiBzcGFuIHtcXG4gICAgZGlzcGxheTogaW5saW5lLWZsZXg7XFxuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XFxuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xcbiAgICBmb250LXNpemU6IDAuOXJlbTtcXG5cXG59XFxuXFxuI3R1cm5JbnRvQnV0dG9uIHN2ZyB1c2Uge1xcbiAgICBtYXJnaW46IGF1dG87XFxufVxcblxcbi5zZWxlY3Qtd3JhcHBlciB7XFxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gICAgY29sb3I6IHJnYigxMjAsIDExOSwgMTE2KTtcXG59XFxuXFxuXFxuLnNlbGVjdC13cmFwcGVyID4gYnV0dG9uIHtcXG4gICAgY29sb3I6IHJnYmEoNTUsIDUzLCA0NywgMC44NSk7XFxufVxcblxcblxcblxcblxcblxcblxcblxcbmNvZGU6bm90KHByZSBjb2RlKSB7XFxuICAgIG1hcmdpbjogMDtcXG4gICAgcGFkZGluZzogMDtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2QwZDBkMDtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2Y2ZjVmNDtcXG4gICAgZm9udC1zaXplOiBpbmhlcml0O1xcbiAgICBmb250LXNpemU6IDFyZW0gIWltcG9ydGFudDtcXG4gICAgYm9yZGVyOiAxcHggc29saWQgIzAwMDAwMDFhO1xcbiAgICBwYWRkaW5nOiAwIDNweDtcXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XFxuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxufVxcblxcblxcblxcblxcbmE6bm90KFtocmVmXSkge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZDNlM2ZkO1xcbn1cXG5cXG4udGV4dC1mb3JtYXR0aW5nLWJ1dHRvbi1hY3RpdmUge1xcbiAgICBjb2xvcjogIzIzODJlMjtcXG59XFxuXFxuLnRleHQtZm9ybWF0dGluZy1jaXJjbGUtYWN0aXZlIHtcXG4gICAgYm9yZGVyLWNvbG9yOiAjMjM4MmUyICFpbXBvcnRhbnQ7XFxufVxcblxcblxcblxcbiNtb3JlVGV4dE9wdGlvblNlbGVjdCB7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG59XFxuXFxuLm1vcmVUZXh0T3B0aW9uV3JhcHBlciB7XFxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG59XFxuXFxuXFxuLnNlbGVjdC13cmFwcGVyIHVsIGxpPmgzIHtcXG4gICAgbWFyZ2luOiAwO1xcbiAgICBmb250LXNpemU6IHNtYWxsICFpbXBvcnRhbnQ7XFxuICAgIGNvbG9yOiAjMzczNTJmYTY7XFxuICAgIG1hcmdpbjogMDtcXG4gICAgcGFkZGluZzogMDtcXG4gICAgZm9udC13ZWlnaHQ6IDYwMCAhaW1wb3J0YW50O1xcbiAgICBtYXJnaW4tdG9wOiAwLjMxMjVyZW07XFxuICAgIG1hcmdpbi1ib3R0b206IDAuMzEyNXJlbTtcXG59XFxuXFxuXFxuLmJnYy1yZWQge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkRERURFO1xcbn1cXG5cXG4uYmdjLWdyZWVuIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI0Q3RjdEQztcXG59XFxuXFxuLmJnYy1ibHVlIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI0Q5RURGNjtcXG59XFxuXFxuLmJnYy15ZWxsb3cge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkFGNEQxO1xcbn1cXG5cXG4uYmdjLWdyZXkge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRTFFMEUwO1xcbn1cXG5cXG5wLFxcbm1hcmsge1xcbiAgICBsaW5lLWhlaWdodDogMTtcXG59XFxuXFxuI3R1cm5JbnRvU2VsZWN0IC5vcHRpb24taW1hZ2Uge1xcbiAgICAvKiBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7ICovXFxufVxcblxcbi5ib3JkZXItbGVzcy1pbWFnZSB7XFxuICAgIHdpZHRoOiAyNHB4O1xcbiAgICBoZWlnaHQ6IDI0cHg7XFxufVxcblxcblxcblxcblxcbi8qKiBCbG9jayBPcHRpb25zICoqL1xcbi5zb2Z0LWJveC1zaGFkb3cge1xcbiAgICBtYXJnaW46IDA7XFxuICAgIHBhZGRpbmc6IDA7XFxuICAgIGJvcmRlci1yYWRpdXM6IDJweDtcXG4gICAgYm94LXNoYWRvdzpcXG4gICAgICAgIDAgNHB4IDZweCByZ2JhKDAsIDAsIDAsIDAuMSksXFxuICAgICAgICAwIC0ycHggNHB4IHJnYmEoMjE2LCAxOTYsIDE5NiwgMC4wMiksXFxuICAgICAgICAtMnB4IDAgNHB4IHJnYmEoMCwgMCwgMCwgMC4wMiksXFxuICAgICAgICAycHggMCA0cHggcmdiYSgwLCAwLCAwLCAwLjAyKTtcXG5cXG4gICAgYm9yZGVyOiAxcHggc29saWQgI2QwZDBkMDtcXG59XFxuXFxuLmJsb2NrLW9wdGlvbnMtd3JhcHBlciB7XFxuICAgIHotaW5kZXg6IDk5OTk5OTtcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgICBkaXNwbGF5OiBub25lO1xcbn1cXG5cXG4uYmxvY2stb3B0aW9ucyB7XFxuICAgIHdpZHRoOiBmaXQtY29udGVudDtcXG4gICAgbWF4LWhlaWdodDogMTlyZW07XFxuICAgIG92ZXJmbG93LXk6IGF1dG87XFxufVxcblxcbi5ibG9jay1vcHRpb25zIHtcXG4gICAgcGFkZGluZzogMCAwLjYyNXJlbTtcXG4gICAgYmFja2dyb3VuZDogI2Y5ZjlmOTtcXG59XFxuXFxuLmJsb2NrLW9wdGlvbnMgc2VjdGlvbiBoMiB7XFxuICAgIGZvbnQtc2l6ZTogc21hbGwgIWltcG9ydGFudDtcXG4gICAgY29sb3I6ICMzNzM1MmZhNjtcXG4gICAgbWFyZ2luOiAwO1xcbiAgICBwYWRkaW5nOiAwO1xcbiAgICBmb250LXdlaWdodDogNjAwICFpbXBvcnRhbnQ7XFxuICAgIG1hcmdpbi10b3A6IDAuMzEyNXJlbTtcXG4gICAgbWFyZ2luLWJvdHRvbTogMC4zMTI1cmVtO1xcbiAgICBwYWRkaW5nLWxlZnQ6IDAuMzEyNXJlbTtcXG59XFxuXFxuLmJsb2NrLW9wdGlvbnMgLm9wdGlvbiB7XFxuICAgIHBhZGRpbmc6IDAuMzEyNXJlbSAwLjYyNXJlbTtcXG4gICAgbWFyZ2luOiAwLjMxMjVyZW0gMDtcXG4gICAgY3Vyc29yOiBwb2ludGVyO1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGxlZnQ7XFxuICAgIGdhcDogMC42cmVtO1xcbiAgICBib3JkZXItcmFkaXVzOiAzcHg7XFxufVxcblxcbi5ibG9jay1vcHRpb25zIC5vcHRpb246Zm9jdXMge1xcbiAgICBvdXRsaW5lOiBub25lO1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTllOWU5O1xcbiAgICBib3JkZXI6IGluaGVyaXQ7XFxufVxcblxcbi5vcHRpb24tZm9jdXNlZCB7XFxuICAgIG91dGxpbmU6IG5vbmU7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNlOWU5ZTk7XFxuICAgIGJvcmRlcjogbm9uZTtcXG59XFxuXFxuI2RlbGV0ZU9wdGlvbi5vcHRpb24tZm9jdXNlZCB7XFxuICAgIGNvbG9yOiAjRUI1NzU3ICFpbXBvcnRhbnQ7XFxufVxcblxcbiNkZWxldGVPcHRpb24ub3B0aW9uLWZvY3VzZWQgc3ZnIHtcXG4gICAgY29sb3I6ICNFQjU3NTcgIWltcG9ydGFudDtcXG59XFxuXFxuXFxuXFxuLmJsb2NrLW9wdGlvbnMgLm9wdGlvbjpmb2N1cy12aXNpYmxlIHtcXG4gICAgb3V0bGluZTogbm9uZTtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2U5ZTllOTtcXG4gICAgYm9yZGVyOiBpbmhlcml0O1xcbn1cXG5cXG4vKiAub3B0aW9uLWhvdmVyOmhvdmVyIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2U5ZTllOTtcXG4gICAgYm94LXNoYWRvdzogMHB4IDBweCAwcHggMnB4ICNlOWU5ZTk7XFxuICAgIGJvcmRlci1yYWRpdXM6IDFweDtcXG4gICAgdHJhbnNpdGlvbjogMC4xcyBlYXNlO1xcbn0gKi9cXG5cXG4vKiAuc2VsZWN0LXdyYXBwZXI+YnV0dG9uLCAqL1xcblxcbi8qICN0dXJuSW50b0J1dHRvbixcXG4jY29sb3JUZXh0QnV0dG9uIHtcXG4gICAgcGFkZGluZy1sZWZ0OiA0cHg7XFxufSAqL1xcblxcbiN0dXJuSW50b0J1dHRvbjpub3QoW2Rpc2FibGVkXSk6aG92ZXIsXFxuI2NvbG9yVGV4dEJ1dHRvbjpub3QoW2Rpc2FibGVkXSk6aG92ZXIsXFxuI21vcmVUZXh0T3B0aW9uQnV0dG9uOm5vdChbZGlzYWJsZWRdKTpob3ZlcixcXG4jZmxvYXRpbmdUb29sYmFyIC5pdGVtPmJ1dHRvbjpub3QoW2Rpc2FibGVkXSk6aG92ZXIge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTllOWU5O1xcbiAgICBib3gtc2hhZG93OiAwcHggMHB4IDBweCAycHggI2U5ZTllOTtcXG4gICAgYm9yZGVyLXJhZGl1czogMXB4O1xcbiAgICB0cmFuc2l0aW9uOiAwLjFzIGVhc2U7XFxufVxcblxcblxcblxcbi5vcHRpb25bZm9jdXNlZD1cXFwidHJ1ZVxcXCJdIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2JkZTRmZjtcXG59XFxuXFxuXFxuXFxuXFxuXFxuLm9wdGlvbi1pbWFnZSB7XFxuICAgIHdpZHRoOiAyLjg3NXJlbTtcXG4gICAgaGVpZ2h0OiAyLjg3NXJlbTtcXG4gICAgYm9yZGVyLXJhZGl1czogMC4xODc1cmVtO1xcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjY2NjO1xcbiAgICBjb2xvcjogIzRmNGY0ZjtcXG5cXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcXG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XFxuICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmO1xcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcbn1cXG5cXG4ub3B0aW9uLWltYWdlIGltZyB7XFxuICAgIG1heC13aWR0aDogMi44NzVyZW07XFxuICAgIG1heC1oZWlnaHQ6IDIuODc1cmVtO1xcbn1cXG5cXG4ub3B0aW9uLWltYWdlIHN2ZyB7XFxuICAgIG1hcmdpbjogMDtcXG4gICAgcGFkZGluZzogMDtcXG4gICAgcGFkZGluZzogMC42MjVyZW07XFxuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxuXFxufVxcblxcbi5vcHRpb24tdGV4dCAqIHtcXG4gICAgbWFyZ2luOiAwO1xcbiAgICBwYWRkaW5nOiAwO1xcblxcbn1cXG5cXG4ub3B0aW9uLXRleHQgLmJsb2NrLXRpdGxlIHtcXG4gICAgZm9udC1zaXplOiBzbWFsbCAhaW1wb3J0YW50O1xcbiAgICBmb250LXdlaWdodDogNTAwO1xcbn1cXG5cXG4ub3B0aW9uLXRleHQgLmJsb2NrLWRlc2NyaXB0aW9uIHtcXG4gICAgZm9udC1zaXplOiBzbWFsbCAhaW1wb3J0YW50O1xcbiAgICBjb2xvcjogcmdiYSg1NSwgNTMsIDQ3LCAwLjUpO1xcbn1cXG5cXG4vKiogRW5kIEJsb2NrIE9wdGlvbnMgKiovXFxuXFxuXFxuXFxuI2RlbGV0ZUJsb2NrQnV0dG9uOmhvdmVyIHN2ZyxcXG4jZGVsZXRlQmxvY2tCdXR0b246aG92ZXIge1xcbiAgICBjb2xvcjogcmdiKDIzNSwgODcsIDg3KSAhaW1wb3J0YW50O1xcbn1cXG5cXG5cXG5cXG4uam9oYW5uZXMtZWRpdG9yICo6OnNlbGVjdGlvbiB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMjExLCAyMjcsIDI1MywgMC41KSAhaW1wb3J0YW50O1xcbn1cXG5cXG4uam9oYW5uZXMtZWRpdG9yIG1hcmssXFxuLmpvaGFubmVzLWVkaXRvciAqIHtcXG4gICAgbGluZS1oZWlnaHQ6IDEuNSAhaW1wb3J0YW50O1xcbn1cXG5cXG4ub3B0aW9uIHtcXG4gICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xcbn1cXG5cXG4udGV4dC1vcHRpb24ge1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHN0YXJ0O1xcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xcbiAgICBnYXA6IDAuNjI1cmVtO1xcbn1cXG5cXG5cXG5cXG5cXG46cm9vdCB7XFxuICAgIC8qIGZvbnQtc2l6ZTogMTZweDsgKi9cXG4gICAgLyogVGFtYW5obyBwYWRyw6NvICovXFxufVxcblxcbi8qIFBhcmEgdGVsYXMgY29tIGRlbnNpZGFkZSBtw6lkaWEgKi9cXG5AbWVkaWEgb25seSBzY3JlZW4gYW5kICgtd2Via2l0LW1pbi1kZXZpY2UtcGl4ZWwtcmF0aW86IDIpLFxcbm9ubHkgc2NyZWVuIGFuZCAobWluLS1tb3otZGV2aWNlLXBpeGVsLXJhdGlvOiAyKSxcXG5vbmx5IHNjcmVlbiBhbmQgKG1pbi1yZXNvbHV0aW9uOiAxOTJkcGkpLFxcbm9ubHkgc2NyZWVuIGFuZCAobWluLXJlc29sdXRpb246IDJkcHB4KSB7XFxuICAgIDpyb290IHtcXG4gICAgICAgIGZvbnQtc2l6ZTogMThweDtcXG4gICAgICAgIC8qIEF1bWVudGEgbyB0YW1hbmhvIGRhIGZvbnRlIHBhcmEgdGVsYXMgZGUgYWx0YSBkZW5zaWRhZGUgKi9cXG4gICAgfVxcbn1cXG5cXG4vKiBQYXJhIHRlbGFzIGNvbSBhbHTDrXNzaW1hIGRlbnNpZGFkZSAqL1xcbkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKC13ZWJraXQtbWluLWRldmljZS1waXhlbC1yYXRpbzogMyksXFxub25seSBzY3JlZW4gYW5kIChtaW4tLW1vei1kZXZpY2UtcGl4ZWwtcmF0aW86IDMpLFxcbm9ubHkgc2NyZWVuIGFuZCAobWluLXJlc29sdXRpb246IDI4OGRwaSksXFxub25seSBzY3JlZW4gYW5kIChtaW4tcmVzb2x1dGlvbjogM2RwcHgpIHtcXG4gICAgOnJvb3Qge1xcbiAgICAgICAgZm9udC1zaXplOiAyMHB4O1xcbiAgICAgICAgLyogQWluZGEgbWFpb3IgcGFyYSB0ZWxhcyBkZSBkZW5zaWRhZGUgbXVpdG8gYWx0YSAqL1xcbiAgICB9XFxufVwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iLCJcInVzZSBzdHJpY3RcIjtcblxuLypcbiAgTUlUIExpY2Vuc2UgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHBcbiAgQXV0aG9yIFRvYmlhcyBLb3BwZXJzIEBzb2tyYVxuKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGNzc1dpdGhNYXBwaW5nVG9TdHJpbmcpIHtcbiAgdmFyIGxpc3QgPSBbXTtcblxuICAvLyByZXR1cm4gdGhlIGxpc3Qgb2YgbW9kdWxlcyBhcyBjc3Mgc3RyaW5nXG4gIGxpc3QudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgIHZhciBjb250ZW50ID0gXCJcIjtcbiAgICAgIHZhciBuZWVkTGF5ZXIgPSB0eXBlb2YgaXRlbVs1XSAhPT0gXCJ1bmRlZmluZWRcIjtcbiAgICAgIGlmIChpdGVtWzRdKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJAc3VwcG9ydHMgKFwiLmNvbmNhdChpdGVtWzRdLCBcIikge1wiKTtcbiAgICAgIH1cbiAgICAgIGlmIChpdGVtWzJdKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJAbWVkaWEgXCIuY29uY2F0KGl0ZW1bMl0sIFwiIHtcIik7XG4gICAgICB9XG4gICAgICBpZiAobmVlZExheWVyKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJAbGF5ZXJcIi5jb25jYXQoaXRlbVs1XS5sZW5ndGggPiAwID8gXCIgXCIuY29uY2F0KGl0ZW1bNV0pIDogXCJcIiwgXCIge1wiKTtcbiAgICAgIH1cbiAgICAgIGNvbnRlbnQgKz0gY3NzV2l0aE1hcHBpbmdUb1N0cmluZyhpdGVtKTtcbiAgICAgIGlmIChuZWVkTGF5ZXIpIHtcbiAgICAgICAgY29udGVudCArPSBcIn1cIjtcbiAgICAgIH1cbiAgICAgIGlmIChpdGVtWzJdKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJ9XCI7XG4gICAgICB9XG4gICAgICBpZiAoaXRlbVs0XSkge1xuICAgICAgICBjb250ZW50ICs9IFwifVwiO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNvbnRlbnQ7XG4gICAgfSkuam9pbihcIlwiKTtcbiAgfTtcblxuICAvLyBpbXBvcnQgYSBsaXN0IG9mIG1vZHVsZXMgaW50byB0aGUgbGlzdFxuICBsaXN0LmkgPSBmdW5jdGlvbiBpKG1vZHVsZXMsIG1lZGlhLCBkZWR1cGUsIHN1cHBvcnRzLCBsYXllcikge1xuICAgIGlmICh0eXBlb2YgbW9kdWxlcyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgbW9kdWxlcyA9IFtbbnVsbCwgbW9kdWxlcywgdW5kZWZpbmVkXV07XG4gICAgfVxuICAgIHZhciBhbHJlYWR5SW1wb3J0ZWRNb2R1bGVzID0ge307XG4gICAgaWYgKGRlZHVwZSkge1xuICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCB0aGlzLmxlbmd0aDsgaysrKSB7XG4gICAgICAgIHZhciBpZCA9IHRoaXNba11bMF07XG4gICAgICAgIGlmIChpZCAhPSBudWxsKSB7XG4gICAgICAgICAgYWxyZWFkeUltcG9ydGVkTW9kdWxlc1tpZF0gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAodmFyIF9rID0gMDsgX2sgPCBtb2R1bGVzLmxlbmd0aDsgX2srKykge1xuICAgICAgdmFyIGl0ZW0gPSBbXS5jb25jYXQobW9kdWxlc1tfa10pO1xuICAgICAgaWYgKGRlZHVwZSAmJiBhbHJlYWR5SW1wb3J0ZWRNb2R1bGVzW2l0ZW1bMF1dKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBsYXllciAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICBpZiAodHlwZW9mIGl0ZW1bNV0gPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICBpdGVtWzVdID0gbGF5ZXI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaXRlbVsxXSA9IFwiQGxheWVyXCIuY29uY2F0KGl0ZW1bNV0ubGVuZ3RoID4gMCA/IFwiIFwiLmNvbmNhdChpdGVtWzVdKSA6IFwiXCIsIFwiIHtcIikuY29uY2F0KGl0ZW1bMV0sIFwifVwiKTtcbiAgICAgICAgICBpdGVtWzVdID0gbGF5ZXI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChtZWRpYSkge1xuICAgICAgICBpZiAoIWl0ZW1bMl0pIHtcbiAgICAgICAgICBpdGVtWzJdID0gbWVkaWE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaXRlbVsxXSA9IFwiQG1lZGlhIFwiLmNvbmNhdChpdGVtWzJdLCBcIiB7XCIpLmNvbmNhdChpdGVtWzFdLCBcIn1cIik7XG4gICAgICAgICAgaXRlbVsyXSA9IG1lZGlhO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoc3VwcG9ydHMpIHtcbiAgICAgICAgaWYgKCFpdGVtWzRdKSB7XG4gICAgICAgICAgaXRlbVs0XSA9IFwiXCIuY29uY2F0KHN1cHBvcnRzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpdGVtWzFdID0gXCJAc3VwcG9ydHMgKFwiLmNvbmNhdChpdGVtWzRdLCBcIikge1wiKS5jb25jYXQoaXRlbVsxXSwgXCJ9XCIpO1xuICAgICAgICAgIGl0ZW1bNF0gPSBzdXBwb3J0cztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbGlzdC5wdXNoKGl0ZW0pO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIGxpc3Q7XG59OyIsIlwidXNlIHN0cmljdFwiO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdGVtKSB7XG4gIHZhciBjb250ZW50ID0gaXRlbVsxXTtcbiAgdmFyIGNzc01hcHBpbmcgPSBpdGVtWzNdO1xuICBpZiAoIWNzc01hcHBpbmcpIHtcbiAgICByZXR1cm4gY29udGVudDtcbiAgfVxuICBpZiAodHlwZW9mIGJ0b2EgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHZhciBiYXNlNjQgPSBidG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShjc3NNYXBwaW5nKSkpKTtcbiAgICB2YXIgZGF0YSA9IFwic291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsXCIuY29uY2F0KGJhc2U2NCk7XG4gICAgdmFyIHNvdXJjZU1hcHBpbmcgPSBcIi8qIyBcIi5jb25jYXQoZGF0YSwgXCIgKi9cIik7XG4gICAgcmV0dXJuIFtjb250ZW50XS5jb25jYXQoW3NvdXJjZU1hcHBpbmddKS5qb2luKFwiXFxuXCIpO1xuICB9XG4gIHJldHVybiBbY29udGVudF0uam9pbihcIlxcblwiKTtcbn07IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBzdHlsZXNJbkRPTSA9IFtdO1xuZnVuY3Rpb24gZ2V0SW5kZXhCeUlkZW50aWZpZXIoaWRlbnRpZmllcikge1xuICB2YXIgcmVzdWx0ID0gLTE7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3R5bGVzSW5ET00ubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoc3R5bGVzSW5ET01baV0uaWRlbnRpZmllciA9PT0gaWRlbnRpZmllcikge1xuICAgICAgcmVzdWx0ID0gaTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gbW9kdWxlc1RvRG9tKGxpc3QsIG9wdGlvbnMpIHtcbiAgdmFyIGlkQ291bnRNYXAgPSB7fTtcbiAgdmFyIGlkZW50aWZpZXJzID0gW107XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xuICAgIHZhciBpdGVtID0gbGlzdFtpXTtcbiAgICB2YXIgaWQgPSBvcHRpb25zLmJhc2UgPyBpdGVtWzBdICsgb3B0aW9ucy5iYXNlIDogaXRlbVswXTtcbiAgICB2YXIgY291bnQgPSBpZENvdW50TWFwW2lkXSB8fCAwO1xuICAgIHZhciBpZGVudGlmaWVyID0gXCJcIi5jb25jYXQoaWQsIFwiIFwiKS5jb25jYXQoY291bnQpO1xuICAgIGlkQ291bnRNYXBbaWRdID0gY291bnQgKyAxO1xuICAgIHZhciBpbmRleEJ5SWRlbnRpZmllciA9IGdldEluZGV4QnlJZGVudGlmaWVyKGlkZW50aWZpZXIpO1xuICAgIHZhciBvYmogPSB7XG4gICAgICBjc3M6IGl0ZW1bMV0sXG4gICAgICBtZWRpYTogaXRlbVsyXSxcbiAgICAgIHNvdXJjZU1hcDogaXRlbVszXSxcbiAgICAgIHN1cHBvcnRzOiBpdGVtWzRdLFxuICAgICAgbGF5ZXI6IGl0ZW1bNV1cbiAgICB9O1xuICAgIGlmIChpbmRleEJ5SWRlbnRpZmllciAhPT0gLTEpIHtcbiAgICAgIHN0eWxlc0luRE9NW2luZGV4QnlJZGVudGlmaWVyXS5yZWZlcmVuY2VzKys7XG4gICAgICBzdHlsZXNJbkRPTVtpbmRleEJ5SWRlbnRpZmllcl0udXBkYXRlcihvYmopO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgdXBkYXRlciA9IGFkZEVsZW1lbnRTdHlsZShvYmosIG9wdGlvbnMpO1xuICAgICAgb3B0aW9ucy5ieUluZGV4ID0gaTtcbiAgICAgIHN0eWxlc0luRE9NLnNwbGljZShpLCAwLCB7XG4gICAgICAgIGlkZW50aWZpZXI6IGlkZW50aWZpZXIsXG4gICAgICAgIHVwZGF0ZXI6IHVwZGF0ZXIsXG4gICAgICAgIHJlZmVyZW5jZXM6IDFcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZGVudGlmaWVycy5wdXNoKGlkZW50aWZpZXIpO1xuICB9XG4gIHJldHVybiBpZGVudGlmaWVycztcbn1cbmZ1bmN0aW9uIGFkZEVsZW1lbnRTdHlsZShvYmosIG9wdGlvbnMpIHtcbiAgdmFyIGFwaSA9IG9wdGlvbnMuZG9tQVBJKG9wdGlvbnMpO1xuICBhcGkudXBkYXRlKG9iaik7XG4gIHZhciB1cGRhdGVyID0gZnVuY3Rpb24gdXBkYXRlcihuZXdPYmopIHtcbiAgICBpZiAobmV3T2JqKSB7XG4gICAgICBpZiAobmV3T2JqLmNzcyA9PT0gb2JqLmNzcyAmJiBuZXdPYmoubWVkaWEgPT09IG9iai5tZWRpYSAmJiBuZXdPYmouc291cmNlTWFwID09PSBvYmouc291cmNlTWFwICYmIG5ld09iai5zdXBwb3J0cyA9PT0gb2JqLnN1cHBvcnRzICYmIG5ld09iai5sYXllciA9PT0gb2JqLmxheWVyKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGFwaS51cGRhdGUob2JqID0gbmV3T2JqKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXBpLnJlbW92ZSgpO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIHVwZGF0ZXI7XG59XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChsaXN0LCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBsaXN0ID0gbGlzdCB8fCBbXTtcbiAgdmFyIGxhc3RJZGVudGlmaWVycyA9IG1vZHVsZXNUb0RvbShsaXN0LCBvcHRpb25zKTtcbiAgcmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZShuZXdMaXN0KSB7XG4gICAgbmV3TGlzdCA9IG5ld0xpc3QgfHwgW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsYXN0SWRlbnRpZmllcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBpZGVudGlmaWVyID0gbGFzdElkZW50aWZpZXJzW2ldO1xuICAgICAgdmFyIGluZGV4ID0gZ2V0SW5kZXhCeUlkZW50aWZpZXIoaWRlbnRpZmllcik7XG4gICAgICBzdHlsZXNJbkRPTVtpbmRleF0ucmVmZXJlbmNlcy0tO1xuICAgIH1cbiAgICB2YXIgbmV3TGFzdElkZW50aWZpZXJzID0gbW9kdWxlc1RvRG9tKG5ld0xpc3QsIG9wdGlvbnMpO1xuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBsYXN0SWRlbnRpZmllcnMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICB2YXIgX2lkZW50aWZpZXIgPSBsYXN0SWRlbnRpZmllcnNbX2ldO1xuICAgICAgdmFyIF9pbmRleCA9IGdldEluZGV4QnlJZGVudGlmaWVyKF9pZGVudGlmaWVyKTtcbiAgICAgIGlmIChzdHlsZXNJbkRPTVtfaW5kZXhdLnJlZmVyZW5jZXMgPT09IDApIHtcbiAgICAgICAgc3R5bGVzSW5ET01bX2luZGV4XS51cGRhdGVyKCk7XG4gICAgICAgIHN0eWxlc0luRE9NLnNwbGljZShfaW5kZXgsIDEpO1xuICAgICAgfVxuICAgIH1cbiAgICBsYXN0SWRlbnRpZmllcnMgPSBuZXdMYXN0SWRlbnRpZmllcnM7XG4gIH07XG59OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgbWVtbyA9IHt9O1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIGdldFRhcmdldCh0YXJnZXQpIHtcbiAgaWYgKHR5cGVvZiBtZW1vW3RhcmdldF0gPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICB2YXIgc3R5bGVUYXJnZXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHRhcmdldCk7XG5cbiAgICAvLyBTcGVjaWFsIGNhc2UgdG8gcmV0dXJuIGhlYWQgb2YgaWZyYW1lIGluc3RlYWQgb2YgaWZyYW1lIGl0c2VsZlxuICAgIGlmICh3aW5kb3cuSFRNTElGcmFtZUVsZW1lbnQgJiYgc3R5bGVUYXJnZXQgaW5zdGFuY2VvZiB3aW5kb3cuSFRNTElGcmFtZUVsZW1lbnQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIFRoaXMgd2lsbCB0aHJvdyBhbiBleGNlcHRpb24gaWYgYWNjZXNzIHRvIGlmcmFtZSBpcyBibG9ja2VkXG4gICAgICAgIC8vIGR1ZSB0byBjcm9zcy1vcmlnaW4gcmVzdHJpY3Rpb25zXG4gICAgICAgIHN0eWxlVGFyZ2V0ID0gc3R5bGVUYXJnZXQuY29udGVudERvY3VtZW50LmhlYWQ7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIGlzdGFuYnVsIGlnbm9yZSBuZXh0XG4gICAgICAgIHN0eWxlVGFyZ2V0ID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gICAgbWVtb1t0YXJnZXRdID0gc3R5bGVUYXJnZXQ7XG4gIH1cbiAgcmV0dXJuIG1lbW9bdGFyZ2V0XTtcbn1cblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBpbnNlcnRCeVNlbGVjdG9yKGluc2VydCwgc3R5bGUpIHtcbiAgdmFyIHRhcmdldCA9IGdldFRhcmdldChpbnNlcnQpO1xuICBpZiAoIXRhcmdldCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkNvdWxkbid0IGZpbmQgYSBzdHlsZSB0YXJnZXQuIFRoaXMgcHJvYmFibHkgbWVhbnMgdGhhdCB0aGUgdmFsdWUgZm9yIHRoZSAnaW5zZXJ0JyBwYXJhbWV0ZXIgaXMgaW52YWxpZC5cIik7XG4gIH1cbiAgdGFyZ2V0LmFwcGVuZENoaWxkKHN0eWxlKTtcbn1cbm1vZHVsZS5leHBvcnRzID0gaW5zZXJ0QnlTZWxlY3RvcjsiLCJcInVzZSBzdHJpY3RcIjtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBpbnNlcnRTdHlsZUVsZW1lbnQob3B0aW9ucykge1xuICB2YXIgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzdHlsZVwiKTtcbiAgb3B0aW9ucy5zZXRBdHRyaWJ1dGVzKGVsZW1lbnQsIG9wdGlvbnMuYXR0cmlidXRlcyk7XG4gIG9wdGlvbnMuaW5zZXJ0KGVsZW1lbnQsIG9wdGlvbnMub3B0aW9ucyk7XG4gIHJldHVybiBlbGVtZW50O1xufVxubW9kdWxlLmV4cG9ydHMgPSBpbnNlcnRTdHlsZUVsZW1lbnQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzKHN0eWxlRWxlbWVudCkge1xuICB2YXIgbm9uY2UgPSB0eXBlb2YgX193ZWJwYWNrX25vbmNlX18gIT09IFwidW5kZWZpbmVkXCIgPyBfX3dlYnBhY2tfbm9uY2VfXyA6IG51bGw7XG4gIGlmIChub25jZSkge1xuICAgIHN0eWxlRWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJub25jZVwiLCBub25jZSk7XG4gIH1cbn1cbm1vZHVsZS5leHBvcnRzID0gc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzOyIsIlwidXNlIHN0cmljdFwiO1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIGFwcGx5KHN0eWxlRWxlbWVudCwgb3B0aW9ucywgb2JqKSB7XG4gIHZhciBjc3MgPSBcIlwiO1xuICBpZiAob2JqLnN1cHBvcnRzKSB7XG4gICAgY3NzICs9IFwiQHN1cHBvcnRzIChcIi5jb25jYXQob2JqLnN1cHBvcnRzLCBcIikge1wiKTtcbiAgfVxuICBpZiAob2JqLm1lZGlhKSB7XG4gICAgY3NzICs9IFwiQG1lZGlhIFwiLmNvbmNhdChvYmoubWVkaWEsIFwiIHtcIik7XG4gIH1cbiAgdmFyIG5lZWRMYXllciA9IHR5cGVvZiBvYmoubGF5ZXIgIT09IFwidW5kZWZpbmVkXCI7XG4gIGlmIChuZWVkTGF5ZXIpIHtcbiAgICBjc3MgKz0gXCJAbGF5ZXJcIi5jb25jYXQob2JqLmxheWVyLmxlbmd0aCA+IDAgPyBcIiBcIi5jb25jYXQob2JqLmxheWVyKSA6IFwiXCIsIFwiIHtcIik7XG4gIH1cbiAgY3NzICs9IG9iai5jc3M7XG4gIGlmIChuZWVkTGF5ZXIpIHtcbiAgICBjc3MgKz0gXCJ9XCI7XG4gIH1cbiAgaWYgKG9iai5tZWRpYSkge1xuICAgIGNzcyArPSBcIn1cIjtcbiAgfVxuICBpZiAob2JqLnN1cHBvcnRzKSB7XG4gICAgY3NzICs9IFwifVwiO1xuICB9XG4gIHZhciBzb3VyY2VNYXAgPSBvYmouc291cmNlTWFwO1xuICBpZiAoc291cmNlTWFwICYmIHR5cGVvZiBidG9hICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgY3NzICs9IFwiXFxuLyojIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2Jhc2U2NCxcIi5jb25jYXQoYnRvYSh1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoc291cmNlTWFwKSkpKSwgXCIgKi9cIik7XG4gIH1cblxuICAvLyBGb3Igb2xkIElFXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAgKi9cbiAgb3B0aW9ucy5zdHlsZVRhZ1RyYW5zZm9ybShjc3MsIHN0eWxlRWxlbWVudCwgb3B0aW9ucy5vcHRpb25zKTtcbn1cbmZ1bmN0aW9uIHJlbW92ZVN0eWxlRWxlbWVudChzdHlsZUVsZW1lbnQpIHtcbiAgLy8gaXN0YW5idWwgaWdub3JlIGlmXG4gIGlmIChzdHlsZUVsZW1lbnQucGFyZW50Tm9kZSA9PT0gbnVsbCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBzdHlsZUVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChzdHlsZUVsZW1lbnQpO1xufVxuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIGRvbUFQSShvcHRpb25zKSB7XG4gIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdXBkYXRlOiBmdW5jdGlvbiB1cGRhdGUoKSB7fSxcbiAgICAgIHJlbW92ZTogZnVuY3Rpb24gcmVtb3ZlKCkge31cbiAgICB9O1xuICB9XG4gIHZhciBzdHlsZUVsZW1lbnQgPSBvcHRpb25zLmluc2VydFN0eWxlRWxlbWVudChvcHRpb25zKTtcbiAgcmV0dXJuIHtcbiAgICB1cGRhdGU6IGZ1bmN0aW9uIHVwZGF0ZShvYmopIHtcbiAgICAgIGFwcGx5KHN0eWxlRWxlbWVudCwgb3B0aW9ucywgb2JqKTtcbiAgICB9LFxuICAgIHJlbW92ZTogZnVuY3Rpb24gcmVtb3ZlKCkge1xuICAgICAgcmVtb3ZlU3R5bGVFbGVtZW50KHN0eWxlRWxlbWVudCk7XG4gICAgfVxuICB9O1xufVxubW9kdWxlLmV4cG9ydHMgPSBkb21BUEk7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gc3R5bGVUYWdUcmFuc2Zvcm0oY3NzLCBzdHlsZUVsZW1lbnQpIHtcbiAgaWYgKHN0eWxlRWxlbWVudC5zdHlsZVNoZWV0KSB7XG4gICAgc3R5bGVFbGVtZW50LnN0eWxlU2hlZXQuY3NzVGV4dCA9IGNzcztcbiAgfSBlbHNlIHtcbiAgICB3aGlsZSAoc3R5bGVFbGVtZW50LmZpcnN0Q2hpbGQpIHtcbiAgICAgIHN0eWxlRWxlbWVudC5yZW1vdmVDaGlsZChzdHlsZUVsZW1lbnQuZmlyc3RDaGlsZCk7XG4gICAgfVxuICAgIHN0eWxlRWxlbWVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjc3MpKTtcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSBzdHlsZVRhZ1RyYW5zZm9ybTsiLCJkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGNvbnRlbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuam9oYW5uZXMtZWRpdG9yJyk7XG5cbiAgICBsZXQgZHJhZ2dlZEl0ZW0gPSBudWxsO1xuXG4gICAgbGV0IGRyb3BMaW5lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgZHJvcExpbmUuY2xhc3NMaXN0LmFkZCgnZHJvcC1saW5lJyk7XG4gICAgZHJvcExpbmUuc3R5bGUuaGVpZ2h0ID0gJzJweCc7XG4gICAgZHJvcExpbmUuc3R5bGUuZGlzcGxheSA9ICdub25lJztcblxuICAgIGNvbnRlbnQuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ3N0YXJ0JywgKGUpID0+IHtcbiAgICAgICAgaWYgKGUudGFyZ2V0LmNsYXNzTGlzdD8uY29udGFpbnMoJ2RyYWctaGFuZGxlcicpKSB7XG4gICAgICAgICAgICBkcmFnZ2VkSXRlbSA9IGUudGFyZ2V0LmNsb3Nlc3QoJy5ibG9jaycpO1xuICAgICAgICAgICAgZHJhZ2dlZEl0ZW0uc2V0QXR0cmlidXRlKCdkcmFnZ2FibGUnLCAndHJ1ZScpO1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgZHJhZ2dlZEl0ZW0uc3R5bGUub3BhY2l0eSA9ICcwLjUnO1xuICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnRlbnQuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ2VuZCcsICgpID0+IHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoZHJhZ2dlZEl0ZW0pIHtcbiAgICAgICAgICAgICAgICBkcmFnZ2VkSXRlbS5zdHlsZS5vcGFjaXR5ID0gJyc7XG4gICAgICAgICAgICAgICAgZHJhZ2dlZEl0ZW0ucmVtb3ZlQXR0cmlidXRlKCdkcmFnZ2FibGUnKTtcbiAgICAgICAgICAgICAgICBkcmFnZ2VkSXRlbSA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkcm9wTGluZS5yZW1vdmUoKTtcbiAgICAgICAgfSwgMCk7XG4gICAgfSk7XG5cbiAgICBjb250ZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdvdmVyJywgKGUpID0+IHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBsZXQgdGFyZ2V0ID0gZS50YXJnZXQuY2xvc2VzdCgnLmJsb2NrJyk7XG5cbiAgICAgICAgaWYgKHRhcmdldCAmJiB0YXJnZXQgIT09IGRyYWdnZWRJdGVtKSB7XG4gICAgICAgICAgICBsZXQgYm91bmRpbmcgPSB0YXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICBsZXQgb2Zmc2V0ID0gYm91bmRpbmcueSArIGJvdW5kaW5nLmhlaWdodCAvIDI7XG5cbiAgICAgICAgICAgIGlmIChlLmNsaWVudFkgPiBvZmZzZXQpIHtcbiAgICAgICAgICAgICAgICBpZiAodGFyZ2V0Lm5leHRFbGVtZW50U2libGluZyAhPT0gZHJvcExpbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0Lmluc2VydEFkamFjZW50RWxlbWVudCgnYWZ0ZXJlbmQnLCBkcm9wTGluZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAodGFyZ2V0LnByZXZpb3VzRWxlbWVudFNpYmxpbmcgIT09IGRyb3BMaW5lKSB7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldC5pbnNlcnRBZGphY2VudEVsZW1lbnQoJ2JlZm9yZWJlZ2luJywgZHJvcExpbmUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGRyb3BMaW5lLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgIH0pO1xuXG4gICAgY29udGVudC5hZGRFdmVudExpc3RlbmVyKCdkcm9wJywgKGUpID0+IHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBpZiAoZHJhZ2dlZEl0ZW0gJiYgZHJvcExpbmUgJiYgZHJvcExpbmUucGFyZW50RWxlbWVudCkge1xuICAgICAgICAgICAgZHJvcExpbmUucGFyZW50RWxlbWVudC5pbnNlcnRCZWZvcmUoZHJhZ2dlZEl0ZW0sIGRyb3BMaW5lKTtcbiAgICAgICAgICAgIGRyb3BMaW5lLnJlbW92ZSgpO1xuICAgICAgICB9XG4gICAgfSk7XG59KTsiLCIvLyBQaWxoYXMgcGFyYSB1bmRvIGUgcmVkb1xyXG5sZXQgdW5kb1N0YWNrID0gW107XHJcbmxldCByZWRvU3RhY2sgPSBbXTtcclxuXHJcblxyXG5cclxuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGZ1bmN0aW9uICgpIHtcclxuICAgIC8vIEVsZW1lbnRvIGRvIGVkaXRvclxyXG4gICAgY29uc3QgZWRpdG9yID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmNvbnRlbnQnKTtcclxuXHJcbiAgICBpZiAoZWRpdG9yKSB7XHJcbiAgICAgICAgLy8gRXZlbnRvIHBhcmEgZGV0ZWN0YXIgbXVkYW7Dp2FzIGUgc2FsdmFyIG8gZXN0YWRvIGFudGVzIGRlIG11ZGFyXHJcbiAgICAgICAgZWRpdG9yLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKCkgPT4ge1xyXG4gICAgICAgICAgICBzYXZlU3RhdGUoKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gRnVuw6fDo28gcGFyYSBzYWx2YXIgbyBlc3RhZG8gYXR1YWwgZG8gZWRpdG9yXHJcbiAgICAgICAgZnVuY3Rpb24gc2F2ZVN0YXRlKCkge1xyXG4gICAgICAgICAgICAvLyBDbG9uZSBkbyBjb250ZcO6ZG8gYXR1YWwgZG8gZWRpdG9yXHJcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRTdGF0ZSA9IGVkaXRvci5pbm5lckhUTUw7XHJcbiAgICAgICAgICAgIHVuZG9TdGFjay5wdXNoKGN1cnJlbnRTdGF0ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIEZ1bsOnw6NvIHBhcmEgZGVzZmF6ZXJcclxuICAgICAgICBmdW5jdGlvbiB1bmRvKCkge1xyXG4gICAgICAgICAgICBpZiAodW5kb1N0YWNrLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHN0YXRlVG9SZXN0b3JlID0gdW5kb1N0YWNrLnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgcmVkb1N0YWNrLnB1c2goZWRpdG9yLmlubmVySFRNTCk7XHJcbiAgICAgICAgICAgICAgICBlZGl0b3IuaW5uZXJIVE1MID0gc3RhdGVUb1Jlc3RvcmU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIEZ1bsOnw6NvIHBhcmEgcmVmYXplclxyXG4gICAgICAgIGZ1bmN0aW9uIHJlZG8oKSB7XHJcbiAgICAgICAgICAgIGlmIChyZWRvU3RhY2subGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhdGVUb0FwcGx5ID0gcmVkb1N0YWNrLnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgdW5kb1N0YWNrLnB1c2goZWRpdG9yLmlubmVySFRNTCk7XHJcbiAgICAgICAgICAgICAgICBlZGl0b3IuaW5uZXJIVE1MID0gc3RhdGVUb0FwcGx5O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBBZGljaW9uYW5kbyBldmVudG9zIGRlIHRlY2xhZG8gcGFyYSB1bmRvIGUgcmVkb1xyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZXZlbnQpID0+IHtcclxuICAgICAgICAgICAgaWYgKGV2ZW50LmN0cmxLZXkgJiYgZXZlbnQua2V5ID09PSAneicpIHtcclxuICAgICAgICAgICAgICAgIHVuZG8oKTtcclxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQuY3RybEtleSAmJiBldmVudC5rZXkgPT09ICd5Jykge1xyXG4gICAgICAgICAgICAgICAgcmVkbygpO1xyXG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBJbmljaWFsaXphciBvIGVzdGFkbyBkbyBlZGl0b3JcclxuICAgICAgICBzYXZlU3RhdGUoKTtcclxuICAgIH1cclxufSk7XHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcbiIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0aWQ6IG1vZHVsZUlkLFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0obW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4iLCIvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuX193ZWJwYWNrX3JlcXVpcmVfXy5uID0gKG1vZHVsZSkgPT4ge1xuXHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cblx0XHQoKSA9PiAobW9kdWxlWydkZWZhdWx0J10pIDpcblx0XHQoKSA9PiAobW9kdWxlKTtcblx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgeyBhOiBnZXR0ZXIgfSk7XG5cdHJldHVybiBnZXR0ZXI7XG59OyIsIi8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18ubyA9IChvYmosIHByb3ApID0+IChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm5jID0gdW5kZWZpbmVkOyIsImltcG9ydCB7IElFbGVtZW50RmFjdG9yeVNlcnZpY2UgfSBmcm9tIFwiLi9JRWxlbWVudEZhY3RvcnlTZXJ2aWNlXCI7XG5cbmludGVyZmFjZSBFbGVtZW50Q3JlYXRvciB7XG4gICAgKGNvbnRlbnQ6IHN0cmluZyB8IG51bGwpOiBIVE1MRWxlbWVudDtcbn1cblxuZXhwb3J0IGNsYXNzIEVsZW1lbnRGYWN0b3J5U2VydmljZSBpbXBsZW1lbnRzIElFbGVtZW50RmFjdG9yeVNlcnZpY2Uge1xuXG4gICAgcHJpdmF0ZSBjcmVhdG9yczogeyBbdHlwZTogc3RyaW5nXTogRWxlbWVudENyZWF0b3IgfTtcblxuICAgIHByaXZhdGUgc3RhdGljIF9pbnN0YW5jZTogRWxlbWVudEZhY3RvcnlTZXJ2aWNlO1xuXG4gICAgc3RhdGljIEVMRU1FTlRfVFlQRVMgPSB7XG4gICAgICAgIEJMT0NLX1BBUkFHUkFQSDogXCJibG9jay1wXCIsXG4gICAgICAgIFBBUkFHUkFQSDogXCJwXCIsXG4gICAgICAgIENIRUNLQk9YX0lURU06IFwiY2hlY2tib3hJdGVtXCIsXG4gICAgICAgIExJU1RfSVRFTTogXCJsaXN0SXRlbVwiLFxuICAgICAgICBDT0RFOiBcImNvZGVcIixcbiAgICAgICAgUVVPVEU6IFwiYmxvY2txdW90ZVwiLFxuICAgICAgICBCVUxMRVRFRF9MSVNUOiBcInVsXCIsXG4gICAgICAgIE5VTUJFUkVEX0xJU1Q6IFwib2xcIixcbiAgICAgICAgQ0hFQ0tfTElTVDogXCJjaGVja0xpc3RzXCIsXG4gICAgICAgIEhFQURFUl8xOiBcImgxXCIsXG4gICAgICAgIEhFQURFUl8yOiBcImgyXCIsXG4gICAgICAgIEhFQURFUl8zOiBcImgzXCIsXG4gICAgICAgIEhFQURFUl80OiBcImg0XCIsXG4gICAgICAgIEhFQURFUl81OiBcImg1XCIsXG4gICAgICAgIEhFQURFUl82OiBcImg2XCIsXG4gICAgICAgIERSQUdfSEFORExFX0JVVFRPTjogXCJkcmFnLWhhbmRsZS1idXR0b25cIlxuICAgIH1cblxuICAgIHByaXZhdGUgY29uc3RydWN0b3IoKSB7XG5cbiAgICAgICAgaWYgKEVsZW1lbnRGYWN0b3J5U2VydmljZS5faW5zdGFuY2UpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVzZSBFbGVtZW50RmFjdG9yeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKSB0byBnZXQgaW5zdGFuY2UuXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jcmVhdG9ycyA9IHt9O1xuXG4gICAgICAgIHRoaXMucmVnaXN0ZXIoRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuQkxPQ0tfUEFSQUdSQVBILCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuYmxvY2tQYXJhZ3JhcGhDcmVhdG9yKCkpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVyKEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLlBBUkFHUkFQSCwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLnBhcmFncmFwaENyZWF0b3IoKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXIoRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuQ0hFQ0tCT1hfSVRFTSwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmNoZWNrYm94SXRlbUNyZWF0b3IoKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXIoRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuTElTVF9JVEVNLCBFbGVtZW50RmFjdG9yeVNlcnZpY2UubGlzdEl0ZW1DcmVhdG9yKCkpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVyKEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkNPREUsIEVsZW1lbnRGYWN0b3J5U2VydmljZS5jb2RlQ3JlYXRvcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5RVU9URSwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLnF1b3RlQ3JlYXRvcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5DSEVDS19MSVNULCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuY2hlY2tMaXN0Q3JlYXRvcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5CVUxMRVRFRF9MSVNULCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuYnVsbGV0ZWRMaXN0Q3JlYXRvcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5OVU1CRVJFRF9MSVNULCBFbGVtZW50RmFjdG9yeVNlcnZpY2UubnVtYmVyZWRMaXN0Q3JlYXRvcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfMSwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmhlYWRpbmdDcmVhdG9yKDEpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfMiwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmhlYWRpbmdDcmVhdG9yKDIpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfMywgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmhlYWRpbmdDcmVhdG9yKDMpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfNCwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmhlYWRpbmdDcmVhdG9yKDQpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfNSwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmhlYWRpbmdDcmVhdG9yKDUpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfNiwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmhlYWRpbmdDcmVhdG9yKDYpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5EUkFHX0hBTkRMRV9CVVRUT04sIEVsZW1lbnRGYWN0b3J5U2VydmljZS5kcmFnSGFuZGxlQnV0dG9uQ3JlYXRvcigpKTtcblxuXG4gICAgICAgIEVsZW1lbnRGYWN0b3J5U2VydmljZS5faW5zdGFuY2UgPSB0aGlzO1xuICAgIH1cblxuICAgIHN0YXRpYyBnZXRJbnN0YW5jZSgpOiBFbGVtZW50RmFjdG9yeVNlcnZpY2Uge1xuXG4gICAgICAgIGlmICghdGhpcy5faW5zdGFuY2UpIHtcbiAgICAgICAgICAgIHRoaXMuX2luc3RhbmNlID0gbmV3IEVsZW1lbnRGYWN0b3J5U2VydmljZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2luc3RhbmNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVnaXN0ZXIodHlwZTogc3RyaW5nLCBjcmVhdG9yOiBFbGVtZW50Q3JlYXRvcik6IHZvaWQge1xuICAgICAgICB0aGlzLmNyZWF0b3JzW3R5cGVdID0gY3JlYXRvcjtcbiAgICB9XG5cbiAgICBjcmVhdGUodHlwZTogc3RyaW5nLCBjb250ZW50Pzogc3RyaW5nKTogSFRNTEVsZW1lbnQge1xuICAgICAgICBjb25zdCBjcmVhdG9yID0gdGhpcy5jcmVhdG9yc1t0eXBlXTtcblxuICAgICAgICBpZiAoIWNyZWF0b3IpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYE5vIGNyZWF0b3IgcmVnaXN0ZXJlZCBmb3IgdHlwZTogJHt0eXBlfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNyZWF0b3IoY29udGVudCB8fCBcIlwiKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBibG9ja1BhcmFncmFwaENyZWF0b3IoKTogRWxlbWVudENyZWF0b3Ige1xuICAgICAgICByZXR1cm4gY29udGVudCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmJsb2NrUGFyYWdyYXBoKGNvbnRlbnQpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIHBhcmFncmFwaENyZWF0b3IoKTogRWxlbWVudENyZWF0b3Ige1xuICAgICAgICByZXR1cm4gY29udGVudCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gRWxlbWVudEZhY3RvcnlTZXJ2aWNlLnBhcmFncmFwaChjb250ZW50KTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBoZWFkaW5nQ3JlYXRvcihsZXZlbDogbnVtYmVyKTogRWxlbWVudENyZWF0b3Ige1xuICAgICAgICByZXR1cm4gY29udGVudCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmhlYWRpbmcobGV2ZWwsIGNvbnRlbnQpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGNoZWNrYm94SXRlbUNyZWF0b3IoKTogRWxlbWVudENyZWF0b3Ige1xuICAgICAgICByZXR1cm4gY29udGVudCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmNoZWNrYm94SXRlbShjb250ZW50IHx8IFwiXCIpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGxpc3RJdGVtQ3JlYXRvcigpOiBFbGVtZW50Q3JlYXRvciB7XG5cbiAgICAgICAgcmV0dXJuIGNvbnRlbnQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIEVsZW1lbnRGYWN0b3J5U2VydmljZS5saXN0SXRlbV8yKGNvbnRlbnQpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGRyYWdIYW5kbGVCdXR0b25DcmVhdG9yKCk6IEVsZW1lbnRDcmVhdG9yIHtcblxuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIEVsZW1lbnRGYWN0b3J5U2VydmljZS5kcmFnSGFuZGxlQnV0dG9uKCk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgY29kZUNyZWF0b3IoKTogRWxlbWVudENyZWF0b3Ige1xuICAgICAgICByZXR1cm4gY29udGVudCA9PiB7XG4gICAgICAgICAgICBjb25zdCBwcmUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdwcmUnKTtcbiAgICAgICAgICAgIGNvbnN0IGNvZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjb2RlJyk7XG4gICAgICAgICAgICBjb2RlLnRleHRDb250ZW50ID0gY29udGVudCB8fCBcIlwiO1xuICAgICAgICAgICAgcHJlLmFwcGVuZENoaWxkKGNvZGUpO1xuXG4gICAgICAgICAgICBjb2RlLmNvbnRlbnRFZGl0YWJsZSA9IFwidHJ1ZVwiO1xuICAgICAgICAgICAgcHJlLmNsYXNzTGlzdC5hZGQoJ2pvaGFubmVzLWNvbnRlbnQtZWxlbWVudCcpO1xuICAgICAgICAgICAgY29kZS5jbGFzc0xpc3QuYWRkKCdqb2hhbm5lcy1jb2RlJyk7XG5cbiAgICAgICAgICAgIHJldHVybiBwcmU7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgcXVvdGVDcmVhdG9yKCk6IEVsZW1lbnRDcmVhdG9yIHtcbiAgICAgICAgcmV0dXJuIGNvbnRlbnQgPT4ge1xuICAgICAgICAgICAgY29uc3QgYmxvY2txdW90ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2Jsb2NrcXVvdGUnKTtcbiAgICAgICAgICAgIGJsb2NrcXVvdGUudGV4dENvbnRlbnQgPSBjb250ZW50IHx8IFwiXCI7XG4gICAgICAgICAgICBibG9ja3F1b3RlLmNvbnRlbnRFZGl0YWJsZSA9IFwidHJ1ZVwiO1xuICAgICAgICAgICAgYmxvY2txdW90ZS5jbGFzc0xpc3QuYWRkKCdqb2hhbm5lcy1jb250ZW50LWVsZW1lbnQnKTtcbiAgICAgICAgICAgIHJldHVybiBibG9ja3F1b3RlO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGNoZWNrTGlzdENyZWF0b3IoKTogRWxlbWVudENyZWF0b3Ige1xuICAgICAgICByZXR1cm4gY29udGVudCA9PiB7XG4gICAgICAgICAgICBjb25zdCB1bCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3VsJyk7XG4gICAgICAgICAgICB1bC5jb250ZW50RWRpdGFibGUgPSBcInRydWVcIjtcbiAgICAgICAgICAgIHVsLmNsYXNzTGlzdC5hZGQoJ2pvaGFubmVzLWNvbnRlbnQtZWxlbWVudCcpO1xuICAgICAgICAgICAgdWwuY2xhc3NMaXN0LmFkZCgnc3dpdHRhYmxlJyk7XG4gICAgICAgICAgICB1bC5jbGFzc0xpc3QuYWRkKCdsaXN0Jyk7XG4gICAgICAgICAgICB1bC5jbGFzc0xpc3QuYWRkKCdjaGVja2JveC1saXN0Jyk7XG5cbiAgICAgICAgICAgIGNvbnN0IGluaXRpYWxJdGVtID0gRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmNoZWNrYm94SXRlbShjb250ZW50IHx8IFwiXCIpO1xuXG4gICAgICAgICAgICB1bC5hcHBlbmRDaGlsZChpbml0aWFsSXRlbSk7XG5cbiAgICAgICAgICAgIHJldHVybiB1bDtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBidWxsZXRlZExpc3RDcmVhdG9yKCk6IEVsZW1lbnRDcmVhdG9yIHtcbiAgICAgICAgcmV0dXJuIGNvbnRlbnQgPT4ge1xuICAgICAgICAgICAgY29uc3QgdWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd1bCcpO1xuICAgICAgICAgICAgdWwuY29udGVudEVkaXRhYmxlID0gXCJ0cnVlXCI7XG4gICAgICAgICAgICB1bC5jbGFzc0xpc3QuYWRkKCdqb2hhbm5lcy1jb250ZW50LWVsZW1lbnQnKTtcbiAgICAgICAgICAgIHVsLmNsYXNzTGlzdC5hZGQoJ3N3aXR0YWJsZScpO1xuICAgICAgICAgICAgdWwuY2xhc3NMaXN0LmFkZCgnbGlzdCcpO1xuXG4gICAgICAgICAgICBjb25zdCBpbml0aWFsSXRlbSA9IEVsZW1lbnRGYWN0b3J5U2VydmljZS5saXN0SXRlbShjb250ZW50IHx8IFwiXCIpO1xuXG4gICAgICAgICAgICB1bC5hcHBlbmRDaGlsZChpbml0aWFsSXRlbSk7XG5cbiAgICAgICAgICAgIHJldHVybiB1bDtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBudW1iZXJlZExpc3RDcmVhdG9yKCk6IEVsZW1lbnRDcmVhdG9yIHtcbiAgICAgICAgcmV0dXJuIGNvbnRlbnQgPT4ge1xuICAgICAgICAgICAgY29uc3QgdWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdvbCcpO1xuICAgICAgICAgICAgdWwuY29udGVudEVkaXRhYmxlID0gXCJ0cnVlXCI7XG4gICAgICAgICAgICB1bC5jbGFzc0xpc3QuYWRkKCdqb2hhbm5lcy1jb250ZW50LWVsZW1lbnQnKTtcbiAgICAgICAgICAgIHVsLmNsYXNzTGlzdC5hZGQoJ3N3aXR0YWJsZScpO1xuICAgICAgICAgICAgdWwuY2xhc3NMaXN0LmFkZCgnbGlzdCcpO1xuXG4gICAgICAgICAgICBjb25zdCBpbml0aWFsSXRlbSA9IEVsZW1lbnRGYWN0b3J5U2VydmljZS5saXN0SXRlbShjb250ZW50IHx8IFwiXCIpO1xuXG4gICAgICAgICAgICB1bC5hcHBlbmRDaGlsZChpbml0aWFsSXRlbSk7XG5cbiAgICAgICAgICAgIHJldHVybiB1bDtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBwcml2YXRlIHN0YXRpYyBudW1iZXJlZExpc3RDcmVhdG9yKCk6IEVsZW1lbnRDcmVhdG9yIHtcbiAgICAvLyAgICAgcmV0dXJuICgpID0+IHtcbiAgICAvLyAgICAgICAgIGNvbnN0IG9sID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnb2wnKTtcbiAgICAvLyAgICAgICAgIG9sLmNvbnRlbnRFZGl0YWJsZSA9IFwidHJ1ZVwiO1xuICAgIC8vICAgICAgICAgb2wuY2xhc3NMaXN0LmFkZCgnam9oYW5uZXMtY29udGVudC1lbGVtZW50Jyk7XG4gICAgLy8gICAgICAgICByZXR1cm4gb2w7XG4gICAgLy8gICAgIH07XG4gICAgLy8gfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgcGFyYWdyYXBoKGNvbnRlbnQ6IHN0cmluZyB8IG51bGwgPSBudWxsKTogSFRNTEVsZW1lbnQge1xuICAgICAgICBjb25zdCBwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgncCcpO1xuXG4gICAgICAgIHAuaW5uZXJUZXh0ID0gY29udGVudCB8fCBcIlwiO1xuICAgICAgICBwLmNvbnRlbnRFZGl0YWJsZSA9IFwidHJ1ZVwiO1xuICAgICAgICBwLnNldEF0dHJpYnV0ZSgnZGF0YS10eXBlJywgJ3AnKTtcbiAgICAgICAgcC5jbGFzc0xpc3QuYWRkKCdqb2hhbm5lcy1jb250ZW50LWVsZW1lbnQnKTtcbiAgICAgICAgcC5jbGFzc0xpc3QuYWRkKCdzd2l0dGFibGUnKTtcbiAgICAgICAgcC5jbGFzc0xpc3QuYWRkKCdmb2N1c2FibGUnKTtcbiAgICAgICAgcC5jbGFzc0xpc3QuYWRkKCdrZXktdHJpZ2dlcicpO1xuICAgICAgICBwLnNldEF0dHJpYnV0ZSgnZGF0YS1wbGFjZWhvbGRlcicsICdXcml0ZSBzb21ldGhpbmcgb3IgdHlwZSAvIChzbGFzaCkgdG8gY2hvb3NlIGEgYmxvY2suLi4nKTtcblxuICAgICAgICByZXR1cm4gcDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBsaXN0SXRlbSh0ZXh0OiBzdHJpbmcpOiBIVE1MRWxlbWVudCB7XG5cbiAgICAgICAgbGV0IGluaXRpYWxJdGVtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGknKTtcblxuICAgICAgICBpbml0aWFsSXRlbS5jbGFzc0xpc3QuYWRkKCdmb2N1c2FibGUnKTtcbiAgICAgICAgaW5pdGlhbEl0ZW0uY2xhc3NMaXN0LmFkZCgnZGVsZXRhYmxlJyk7XG4gICAgICAgIGluaXRpYWxJdGVtLmNsYXNzTGlzdC5hZGQoJ2VkaXRhYmxlJyk7XG4gICAgICAgIGluaXRpYWxJdGVtLmNsYXNzTGlzdC5hZGQoJ2ZvY3VzJyk7XG4gICAgICAgIGluaXRpYWxJdGVtLmNsYXNzTGlzdC5hZGQoJ2tleS10cmlnZ2VyJyk7XG4gICAgICAgIGluaXRpYWxJdGVtLmNsYXNzTGlzdC5hZGQoJ2xpc3QtaXRlbScpO1xuXG4gICAgICAgIGluaXRpYWxJdGVtLmlubmVyVGV4dCA9IHRleHQ7XG5cbiAgICAgICAgaW5pdGlhbEl0ZW0uY29udGVudEVkaXRhYmxlID0gXCJ0cnVlXCI7XG4gICAgICAgIGluaXRpYWxJdGVtLnNldEF0dHJpYnV0ZSgnZGF0YS1wbGFjZWhvbGRlcicsICdJdGVtJyk7XG5cbiAgICAgICAgcmV0dXJuIGluaXRpYWxJdGVtO1xuXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgaGVhZGluZyhsZXZlbDogbnVtYmVyLCBjb250ZW50OiBzdHJpbmcgfCBudWxsID0gbnVsbCk6IEhUTUxFbGVtZW50IHtcbiAgICAgICAgY29uc3QgaCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoYGgke2xldmVsfWApO1xuXG4gICAgICAgIGguaW5uZXJUZXh0ID0gY29udGVudCB8fCBcIlwiO1xuICAgICAgICBoLmNvbnRlbnRFZGl0YWJsZSA9IFwidHJ1ZVwiO1xuICAgICAgICBoLnNldEF0dHJpYnV0ZSgnZGF0YS10eXBlJywgYGgke2xldmVsfWApO1xuICAgICAgICBoLmNsYXNzTGlzdC5hZGQoJ2pvaGFubmVzLWNvbnRlbnQtZWxlbWVudCcpO1xuICAgICAgICBoLmNsYXNzTGlzdC5hZGQoJ3N3aXR0YWJsZScpO1xuICAgICAgICBoLmNsYXNzTGlzdC5hZGQoJ2ZvY3VzYWJsZScpO1xuICAgICAgICBoLmNsYXNzTGlzdC5hZGQoJ2ZvY3VzJyk7XG4gICAgICAgIGguY2xhc3NMaXN0LmFkZCgna2V5LXRyaWdnZXInKTtcblxuICAgICAgICByZXR1cm4gaDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBjaGVja2JveEl0ZW0oY29udGVudDogc3RyaW5nKTogSFRNTEVsZW1lbnQge1xuICAgICAgICBsZXQgbGkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaScpO1xuICAgICAgICBsaS5jbGFzc0xpc3QuYWRkKCdkZWxldGFibGUnKTtcbiAgICAgICAgbGkuY2xhc3NMaXN0LmFkZCgnbGlzdC1pdGVtJyk7XG5cbiAgICAgICAgLy8gaW5pdGlhbEl0ZW0uY2xhc3NMaXN0LmFkZCgna2V5LXRyaWdnZXInKTtcblxuICAgICAgICBsZXQgY2hlY2tib3ggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO1xuICAgICAgICBjaGVja2JveC5zZXRBdHRyaWJ1dGUoJ3R5cGUnLCAnY2hlY2tib3gnKTtcblxuICAgICAgICBsZXQgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICAgICAgc3Bhbi50ZXh0Q29udGVudCA9IGNvbnRlbnQ7XG4gICAgICAgIHNwYW4uc2V0QXR0cmlidXRlKCdkYXRhLXBsYWNlaG9sZGVyJywgJ1RvLWRvJyk7XG4gICAgICAgIC8vIHNwYW4uY29udGVudEVkaXRhYmxlID0gdHJ1ZTtcbiAgICAgICAgc3Bhbi5zZXRBdHRyaWJ1dGUoXCJjb250ZW50RWRpdGFibGVcIiwgXCJ0cnVlXCIpO1xuXG4gICAgICAgIHNwYW4uY2xhc3NMaXN0LmFkZCgnZm9jdXNhYmxlJyk7XG4gICAgICAgIHNwYW4uY2xhc3NMaXN0LmFkZCgnZWRpdGFibGUnKTtcbiAgICAgICAgc3Bhbi5jbGFzc0xpc3QuYWRkKCdmb2N1cycpO1xuXG4gICAgICAgIGxpLmFwcGVuZENoaWxkKGNoZWNrYm94KTtcbiAgICAgICAgbGkuYXBwZW5kQ2hpbGQoc3Bhbik7XG5cbiAgICAgICAgcmV0dXJuIGxpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGxpc3RJdGVtXzIoY29udGVudDogc3RyaW5nIHwgbnVsbCA9IG51bGwpOiBIVE1MRWxlbWVudCB7XG5cbiAgICAgICAgbGV0IGluaXRpYWxJdGVtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGknKTtcblxuICAgICAgICBpbml0aWFsSXRlbS5jbGFzc0xpc3QuYWRkKCdmb2N1c2FibGUnKTtcbiAgICAgICAgaW5pdGlhbEl0ZW0uY2xhc3NMaXN0LmFkZCgnZGVsZXRhYmxlJyk7XG4gICAgICAgIGluaXRpYWxJdGVtLmNsYXNzTGlzdC5hZGQoJ2VkaXRhYmxlJyk7XG4gICAgICAgIGluaXRpYWxJdGVtLmNsYXNzTGlzdC5hZGQoJ2ZvY3VzJyk7XG4gICAgICAgIGluaXRpYWxJdGVtLmNsYXNzTGlzdC5hZGQoJ2tleS10cmlnZ2VyJyk7XG4gICAgICAgIGluaXRpYWxJdGVtLmNsYXNzTGlzdC5hZGQoJ2xpc3QtaXRlbScpO1xuXG4gICAgICAgIGluaXRpYWxJdGVtLmlubmVyVGV4dCA9IGNvbnRlbnQgfHwgXCJcIjtcblxuICAgICAgICAvLyBpbml0aWFsSXRlbS5jb250ZW50RWRpdGFibGUgPSB0cnVlO1xuICAgICAgICBpbml0aWFsSXRlbS5zZXRBdHRyaWJ1dGUoXCJjb250ZW50RWRpdGFibGVcIiwgXCJ0cnVlXCIpO1xuICAgICAgICBpbml0aWFsSXRlbS5zZXRBdHRyaWJ1dGUoJ2RhdGEtcGxhY2Vob2xkZXInLCAnSXRlbScpO1xuXG4gICAgICAgIHJldHVybiBpbml0aWFsSXRlbTtcbiAgICB9XG5cblxuICAgIHN0YXRpYyBibG9ja1BhcmFncmFwaChjb250ZW50OiBzdHJpbmcgfCBudWxsID0gbnVsbCkge1xuXG4gICAgICAgIGxldCBuZXdEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgbGV0IG5ld0VsZW1lbnQgPSBFbGVtZW50RmFjdG9yeVNlcnZpY2UucGFyYWdyYXBoKGNvbnRlbnQpO1xuXG4gICAgICAgIGxldCBuZXdCdXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcbiAgICAgICAgbmV3QnV0dG9uLmlubmVySFRNTCA9ICc8c3ZnIHdpZHRoPVwiMS4zNzVyZW1cIiBoZWlnaHQ9XCIxLjM3NXJlbVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIj48dXNlIGhyZWY9XCIjaWNvbi1tYXRlcmlhbC1kcmFnXCI+PC91c2U+PC9zdmc+JztcblxuICAgICAgICAvLyBuZXdEaXYuYXBwZW5kQ2hpbGQobmV3QnV0dG9uKTtcbiAgICAgICAgbmV3RGl2LmFwcGVuZENoaWxkKG5ld0VsZW1lbnQpO1xuXG4gICAgICAgIG5ld0Rpdi5jbGFzc0xpc3QuYWRkKCdibG9jaycpO1xuICAgICAgICBuZXdEaXYuY2xhc3NMaXN0LmFkZCgnZGVsZXRhYmxlJyk7XG4gICAgICAgIG5ld0J1dHRvbi5jbGFzc0xpc3QuYWRkKCdkcmFnLWhhbmRsZXInKTtcbiAgICAgICAgbmV3QnV0dG9uLmNsYXNzTGlzdC5hZGQoJ2J1dHRvbi1yZXNldCcpO1xuICAgICAgICBuZXdCdXR0b24uZHJhZ2dhYmxlID0gdHJ1ZTtcblxuICAgICAgICByZXR1cm4gbmV3RGl2O1xuICAgIH1cblxuICAgIHN0YXRpYyBkcmFnSGFuZGxlQnV0dG9uKCkge1xuXG4gICAgICAgIGxldCBidXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcbiAgICAgICAgYnV0dG9uLmlubmVySFRNTCA9ICc8c3ZnIHdpZHRoPVwiMS4zNzVyZW1cIiBoZWlnaHQ9XCIxLjM3NXJlbVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIj48dXNlIGhyZWY9XCIjaWNvbi1tYXRlcmlhbC1kcmFnXCI+PC91c2U+PC9zdmc+JztcblxuICAgICAgICBidXR0b24uY2xhc3NMaXN0LmFkZCgnZHJhZy1oYW5kbGVyJyk7XG4gICAgICAgIGJ1dHRvbi5jbGFzc0xpc3QuYWRkKCdidXR0b24tcmVzZXQnKTtcbiAgICAgICAgYnV0dG9uLmRyYWdnYWJsZSA9IHRydWU7XG5cbiAgICAgICAgcmV0dXJuIGJ1dHRvbjtcbiAgICB9XG5cbn0iLCJpbXBvcnQgeyBJQmxvY2tPcGVyYXRpb25zU2VydmljZSB9IGZyb20gXCIuL0lCbG9ja09wZXJhdGlvbnNTZXJ2aWNlXCI7XG5pbXBvcnQgeyBJRWxlbWVudEZhY3RvcnlTZXJ2aWNlIH0gZnJvbSBcIi4uL2VsZW1lbnQtZmFjdG9yeS9JRWxlbWVudEZhY3RvcnlTZXJ2aWNlXCI7XG5pbXBvcnQgeyBFbGVtZW50RmFjdG9yeVNlcnZpY2UgfSBmcm9tIFwiLi4vZWxlbWVudC1mYWN0b3J5L0VsZW1lbnRGYWN0b3J5U2VydmljZVwiO1xuXG5leHBvcnQgY2xhc3MgQmxvY2tPcGVyYXRpb25zU2VydmljZSBpbXBsZW1lbnRzIElCbG9ja09wZXJhdGlvbnNTZXJ2aWNlIHtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgZWxlbWVudEZhY3RvcnlTZXJ2aWNlOiBJRWxlbWVudEZhY3RvcnlTZXJ2aWNlO1xuICAgIHByaXZhdGUgc3RhdGljIGluc3RhbmNlOiBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlO1xuXG4gICAgc3RhdGljIEJMT0NLX09QRVJBVElPTlMgPSB7XG4gICAgICAgIFRVUk5fSU5UTzogXCJ0dXJuSW50b1wiLFxuICAgICAgICBDUkVBVEVfREVGQVVMVF9CTE9DSzogXCJDcmVhdGVEZWZhdWx0QmxvY2tcIixcbiAgICAgICAgREVMRVRFX0ZPQ1VTX09OX1BSRVZJT1VTOiBcIkRlbGV0ZUFuZEZvY3VzT25QcmV2aW91c1wiLFxuICAgICAgICBERUxFVEVfRk9DVVNfT05fTkVYVDogXCJEZWxldGVBbmRGb2N1c09uTmV4dFwiLFxuICAgICAgICBGT0NVU19PTl9GSVJTVDogXCJGb2N1c09uRmlyc3RcIixcbiAgICAgICAgRk9DVVNfT05fUFJFVklPVVM6IFwiRm9jdXNPblByZXZpb3VzXCIsXG4gICAgICAgIEZPQ1VTX09OX05FWFQ6IFwiRm9jdXNPbk5leHRcIixcbiAgICAgICAgREVMRVRFOiBcImRlbGV0ZVwiLFxuICAgICAgICBEVVBMSUNBVEU6IFwiZHVwbGljYXRlXCIsXG4gICAgICAgIENPUFk6IFwiY29weVwiLFxuICAgICAgICBQQVNURTogXCJwYXRlc1wiLFxuICAgICAgICBDVVQ6IFwiY3V0XCIsXG4gICAgICAgIFJFTU9WRV9GT1JNQVQ6IFwicmVtb3ZlRm9ybWF0XCIsXG4gICAgICAgIFRSQU5TRk9STV9CTE9DSzogXCJ0cmFuc2Zvcm1CbG9ja1wiXG4gICAgfTtcblxuICAgIHByaXZhdGUgY29uc3RydWN0b3IoZWxlbWVudEZhY3RvcnlTZXJ2aWNlOiBJRWxlbWVudEZhY3RvcnlTZXJ2aWNlKSB7XG5cbiAgICAgICAgaWYgKEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuaW5zdGFuY2UpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVzZSBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLmdldEluc3RhbmNlKCkgdG8gZ2V0IGluc3RhbmNlLlwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZWxlbWVudEZhY3RvcnlTZXJ2aWNlID0gZWxlbWVudEZhY3RvcnlTZXJ2aWNlO1xuXG4gICAgICAgIEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuaW5zdGFuY2UgPSB0aGlzO1xuICAgIH1cblxuICAgIGV4ZWNDb21tYW5kKGNvbW1hbmQ6IHN0cmluZywgc2hvd1VJOiBib29sZWFuLCB2YWx1ZTogc3RyaW5nIHwgbnVsbCA9IG51bGwpOiBib29sZWFuIHtcblxuICAgICAgICBpZiAoY29tbWFuZCA9PSBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLkJMT0NLX09QRVJBVElPTlMuQ09QWSkge1xuXG4gICAgICAgICAgICBpZiAoZG9jdW1lbnQuZ2V0U2VsZWN0aW9uICYmIG5hdmlnYXRvci5jbGlwYm9hcmQgJiYgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSBkb2N1bWVudC5nZXRTZWxlY3Rpb24oKTtcblxuICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rpb24gJiYgc2VsZWN0aW9uLnRvU3RyaW5nKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RlZFRleHQgPSBzZWxlY3Rpb24udG9TdHJpbmcoKTtcblxuICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dChzZWxlY3RlZFRleHQpLnRoZW4oKCkgPT4ge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb3BpZWRFdmVudCA9IG5ldyBDdXN0b21FdmVudCgnY29waWVkVGV4dCcsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbmNlbGFibGU6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KGNvcGllZEV2ZW50KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICAgICAgICAgICAgICAgICAgfSkuY2F0Y2goKGVycjogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciB3aGVuIGNvcHkgdGV4dCcsIGVycik7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbW1hbmQgPT0gQmxvY2tPcGVyYXRpb25zU2VydmljZS5CTE9DS19PUEVSQVRJT05TLkNVVCkge1xuXG4gICAgICAgICAgICBpZiAoZG9jdW1lbnQuZ2V0U2VsZWN0aW9uICYmIG5hdmlnYXRvci5jbGlwYm9hcmQgJiYgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSBkb2N1bWVudC5nZXRTZWxlY3Rpb24oKTtcblxuICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rpb24gJiYgc2VsZWN0aW9uLnRvU3RyaW5nKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RlZFRleHQgPSBzZWxlY3Rpb24udG9TdHJpbmcoKTtcblxuICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb24uZGVsZXRlRnJvbURvY3VtZW50KCk7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkZUV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KCdyZXF1ZXN0SGlkZUZsb2F0aW5nVG9vbGJhcicsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxhYmxlOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoaGlkZUV2ZW50KTtcblxuICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dChzZWxlY3RlZFRleHQpLnRoZW4oKCkgPT4ge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcblxuICAgICAgICAgICAgICAgICAgICB9KS5jYXRjaCgoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHdoZW4gY3V0IHRleHQ6ICcsIGVycik7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbW1hbmQgPT0gQmxvY2tPcGVyYXRpb25zU2VydmljZS5CTE9DS19PUEVSQVRJT05TLlBBU1RFKSB7XG4gICAgICAgICAgICBpZiAobmF2aWdhdG9yLmNsaXBib2FyZCAmJiBuYXZpZ2F0b3IuY2xpcGJvYXJkLnJlYWRUZXh0KSB7XG4gICAgICAgICAgICAgICAgbmF2aWdhdG9yLmNsaXBib2FyZC5yZWFkVGV4dCgpLnRoZW4oKHBhc3RlZFRleHQ6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSBkb2N1bWVudC5nZXRTZWxlY3Rpb24oKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0aW9uICYmIHNlbGVjdGlvbi5yYW5nZUNvdW50ID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlLmRlbGV0ZUNvbnRlbnRzKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByYW5nZS5pbnNlcnROb2RlKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHBhc3RlZFRleHQpKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0aW9uRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoJ3JlcXVlc3RVcGRhdGVGbG9hdGluZ1Rvb2xiYXInLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxhYmxlOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChzZWxlY3Rpb25FdmVudCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignTm8gdGV4dCBzZWxlY3RlZCBvciBjbGlwYm9hcmQgZW1wdHkuJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KS5jYXRjaCgoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3Igd2hlbiBwYXN0aW5nIHRleHQ6ICcsIGVycik7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG5cblxuXG4gICAgICAgIGlmIChjb21tYW5kID09IEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuQkxPQ0tfT1BFUkFUSU9OUy5UUkFOU0ZPUk1fQkxPQ0spIHtcblxuICAgICAgICAgICAgY29uc3QgYmxvY2sgPSB0aGlzLmdldEN1cnJlbnRTZWxlY3RlZEJsb2NrKCkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICBpZiAoYmxvY2sgJiYgdmFsdWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRyYW5zZm9ybUJsb2NrKGJsb2NrLCB2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29tbWFuZCA9PSBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLkJMT0NLX09QRVJBVElPTlMuUkVNT1ZFX0ZPUk1BVCkge1xuICAgICAgICAgICAgcmV0dXJuIGRvY3VtZW50LmV4ZWNDb21tYW5kKEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuQkxPQ0tfT1BFUkFUSU9OUy5SRU1PVkVfRk9STUFULCBmYWxzZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29tbWFuZCA9PSBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLkJMT0NLX09QRVJBVElPTlMuREVMRVRFKSB7XG5cbiAgICAgICAgICAgIHRoaXMuZGVsZXRlQW5kRm9jdXNPbk5leHQoKTtcblxuICAgICAgICAgICAgY29uc3QgaGlkZUV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KCdyZXF1ZXN0SGlkZUZsb2F0aW5nVG9vbGJhcicsIHtcbiAgICAgICAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgICAgICAgIGNhbmNlbGFibGU6IHRydWVcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KGhpZGVFdmVudCk7XG5cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbW1hbmQgPT0gQmxvY2tPcGVyYXRpb25zU2VydmljZS5CTE9DS19PUEVSQVRJT05TLkRVUExJQ0FURSkge1xuXG4gICAgICAgICAgICB0aGlzLmR1cGxpY2F0ZVNlbGVjdGVkQmxvY2soKTtcblxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29tbWFuZCA9PSBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLkJMT0NLX09QRVJBVElPTlMuQ1JFQVRFX0RFRkFVTFRfQkxPQ0spIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50IHx8IG51bGw7XG5cbiAgICAgICAgICAgIHRoaXMuY3JlYXRlRGVmYXVsdEJsb2NrKGVsZW1lbnQpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29tbWFuZCA9PSBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLkJMT0NLX09QRVJBVElPTlMuRk9DVVNfT05fRklSU1QpIHtcblxuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuZm9jdXNhYmxlXCIpO1xuXG4gICAgICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgICAgICAgIChlbGVtZW50IGFzIEhUTUxFbGVtZW50KS5mb2N1cygpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29tbWFuZCA9PSBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLkJMT0NLX09QRVJBVElPTlMuREVMRVRFX0ZPQ1VTX09OX1BSRVZJT1VTKSB7XG4gICAgICAgICAgICB0aGlzLmRlbGV0ZUFuZEZvY3VzT25QcmV2aW91cygpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29tbWFuZCA9PSBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLkJMT0NLX09QRVJBVElPTlMuREVMRVRFX0ZPQ1VTX09OX05FWFQpIHtcbiAgICAgICAgICAgIHRoaXMuZGVsZXRlQW5kRm9jdXNPbk5leHQoKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbW1hbmQgPT0gQmxvY2tPcGVyYXRpb25zU2VydmljZS5CTE9DS19PUEVSQVRJT05TLkZPQ1VTX09OX1BSRVZJT1VTKSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcblxuICAgICAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZvY3VzT25QcmV2aW91cyhlbGVtZW50KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb21tYW5kID09IEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuQkxPQ0tfT1BFUkFUSU9OUy5GT0NVU19PTl9ORVhUKSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcblxuICAgICAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZvY3VzT25OZXh0KGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbW1hbmQgPT0gQmxvY2tPcGVyYXRpb25zU2VydmljZS5CTE9DS19PUEVSQVRJT05TLlRVUk5fSU5UTykge1xuXG4gICAgICAgICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLmdldERyYWdnYWJsZUVsZW1lbnRGcm9tU2VsZWN0aW9uKCk7XG5cbiAgICAgICAgICAgIHRoaXMuZm9ybWF0QmxvY2soZWxlbWVudCwgdmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoJ3JlcXVlc3RIaWRlRmxvYXRpbmdUb29sYmFyJywge1xuICAgICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICAgIGNhbmNlbGFibGU6IHRydWVcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChzZWxlY3Rpb25FdmVudCk7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcXVlcnlDb21tYW5kU3RhdGUoKTogYm9vbGVhbiB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1ldGhvZCBub3QgaW1wbGVtZW50ZWQuXCIpO1xuICAgIH1cblxuICAgIHN0YXRpYyBnZXRJbnN0YW5jZShlbGVtZW50RmFjdG9yeVNlcnZpY2U6IElFbGVtZW50RmFjdG9yeVNlcnZpY2UgfCBudWxsID0gbnVsbCk6IEJsb2NrT3BlcmF0aW9uc1NlcnZpY2Uge1xuXG4gICAgICAgIGlmICghdGhpcy5pbnN0YW5jZSkge1xuICAgICAgICAgICAgdGhpcy5pbnN0YW5jZSA9IG5ldyBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlKGVsZW1lbnRGYWN0b3J5U2VydmljZSB8fCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5pbnN0YW5jZTtcbiAgICB9XG5cbiAgICBmb3JtYXRCbG9jayhlbGVtZW50OiBIVE1MRWxlbWVudCwgY29udGVudFR5cGU6IHN0cmluZyk6IHZvaWQge1xuXG4gICAgICAgIGxldCBjb250ZW50RWxlbWVudCA9IGVsZW1lbnQucXVlcnlTZWxlY3RvcignLnN3aXR0YWJsZScpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBsZXQgY29udGVudCA9IGNvbnRlbnRFbGVtZW50LmlubmVyVGV4dDtcblxuICAgICAgICBsZXQgbmV3Q29udGVudEJsb2NrID0gdGhpcy5lbGVtZW50RmFjdG9yeVNlcnZpY2UuY3JlYXRlKGNvbnRlbnRUeXBlLCBjb250ZW50KTtcblxuICAgICAgICBlbGVtZW50LnJlcGxhY2VDaGlsZChuZXdDb250ZW50QmxvY2ssIGNvbnRlbnRFbGVtZW50KTtcblxuICAgICAgICBjb25zdCBmb2N1c2FibGUgPSBuZXdDb250ZW50QmxvY2suY2xvc2VzdCgnLmZvY3VzYWJsZScpIHx8IGVsZW1lbnQucXVlcnlTZWxlY3RvcignLmZvY3VzYWJsZScpO1xuXG4gICAgICAgIC8vIGZvY3VzT25UaGVFbmRPZlRoZVRleHQoZm9jdXNhYmxlKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0RHJhZ2dhYmxlRWxlbWVudEZyb21TZWxlY3Rpb24oKTogSFRNTEVsZW1lbnQge1xuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG5cbiAgICAgICAgaWYgKHNlbGVjdGlvbiAmJiBzZWxlY3Rpb24ucmFuZ2VDb3VudCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XG4gICAgICAgICAgICBsZXQgZWxlbWVudDogTm9kZSB8IG51bGwgPSByYW5nZS5jb21tb25BbmNlc3RvckNvbnRhaW5lcjtcblxuICAgICAgICAgICAgaWYgKGVsZW1lbnQubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgd2hpbGUgKGVsZW1lbnQgJiYgIShlbGVtZW50IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZSBhcyBIVE1MRWxlbWVudCB8IG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZHJhZ2dhYmxlID0gZWxlbWVudC5jbG9zZXN0KCcuYmxvY2snKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgICAgICByZXR1cm4gZHJhZ2dhYmxlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmV0b3JuYXIgbnVsbCBzZSBuZW5odW1hIHNlbGXDp8OjbyB2w6FsaWRhIGZvciBlbmNvbnRyYWRhIG91IG5lbmh1bSBlbGVtZW50byBjb3JyZXNwb25kZW50ZVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoKTtcbiAgICB9XG5cbiAgICAvLyBzdGF0aWMgZ2V0VGFnTmFtZUJ5Q29tbWFuZE5hbWUoY29tbWFuZE5hbWU6IHN0cmluZykge1xuICAgIC8vICAgICBzd2l0Y2ggKGNvbW1hbmROYW1lKSB7XG4gICAgLy8gICAgICAgICBjYXNlIFwidHVybkludG9QYXJhZ3JhcGhcIjpcbiAgICAvLyAgICAgICAgICAgICByZXR1cm4gXCJwXCI7XG4gICAgLy8gICAgICAgICBjYXNlIFwidHVybkludG9IMVwiOlxuICAgIC8vICAgICAgICAgICAgIHJldHVybiBcImgxXCI7XG4gICAgLy8gICAgICAgICBjYXNlIFwidHVybkludG9IMlwiOlxuICAgIC8vICAgICAgICAgICAgIHJldHVybiBcImgyXCI7XG4gICAgLy8gICAgICAgICBjYXNlIFwidHVybkludG9IM1wiOlxuICAgIC8vICAgICAgICAgICAgIHJldHVybiBcImgzXCI7XG4gICAgLy8gICAgICAgICBjYXNlIFwidHVybkludG9INFwiOlxuICAgIC8vICAgICAgICAgICAgIHJldHVybiBcImg0XCI7XG4gICAgLy8gICAgICAgICBjYXNlIFwidHVybkludG9INVwiOlxuICAgIC8vICAgICAgICAgICAgIHJldHVybiBcImg1XCI7XG4gICAgLy8gICAgICAgICBjYXNlIFwidHVybkludG9INlwiOlxuICAgIC8vICAgICAgICAgICAgIHJldHVybiBcImg2XCI7XG5cbiAgICAvLyAgICAgICAgIGRlZmF1bHQ6XG4gICAgLy8gICAgICAgICAgICAgdGhyb3cgRXJyb3IoXCJFcnJvclwiKTtcbiAgICAvLyAgICAgfVxuICAgIC8vIH1cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gICAgLy8gYXBwbHlTZWxlY3RlZEJsb2NrVHlwZShkcmFnZ2FibGVCbG9jazogSFRNTEVsZW1lbnQsIG5ld0Jsb2NrVHlwZTogc3RyaW5nKSB7XG5cbiAgICAvLyAgICAgLy8gY29uc3QgZHJhZ2dhYmxlQmxvY2sgPSByZWFsRm9jdXNlZEVsZW1lbnQuY2xvc2VzdCgnLmJsb2NrJyk7XG4gICAgLy8gICAgIC8vIGNvbnN0IG5ld0Jsb2NrVHlwZSA9IGV2ZW50LnRhcmdldC5jbG9zZXN0KCcub3B0aW9uJykgP1xuICAgIC8vICAgICAvLyAgICAgZXZlbnQudGFyZ2V0LmNsb3Nlc3QoJy5vcHRpb24nKS5nZXRBdHRyaWJ1dGUoJ2RhdGEtdHlwZScpIDpcbiAgICAvLyAgICAgLy8gICAgIGN1cnJlbnRGYWtlRm9jdXNlZE9wdGlvbi5nZXRBdHRyaWJ1dGUoJ2RhdGEtdHlwZScpO1xuXG4gICAgLy8gICAgIGNvbnN0IGxhc3RTbGFzaEluZGV4ID0gcmVhbEZvY3VzZWRFbGVtZW50LmlubmVyVGV4dC5sYXN0SW5kZXhPZignLycpO1xuICAgIC8vICAgICByZWFsRm9jdXNlZEVsZW1lbnQuaW5uZXJUZXh0ID0gbGFzdFNsYXNoSW5kZXggIT09IC0xID8gcmVhbEZvY3VzZWRFbGVtZW50LmlubmVyVGV4dC5zbGljZSgwLCBsYXN0U2xhc2hJbmRleCkgOiByZWFsRm9jdXNlZEVsZW1lbnQuaW5uZXJUZXh0O1xuXG5cbiAgICAvLyAgICAgdHJhbnNmb3JtQmxvY2soZHJhZ2dhYmxlQmxvY2ssIG5ld0Jsb2NrVHlwZSk7XG5cbiAgICAvLyAgICAgaGlkZUFuZENsZWFyQmxvY2tPcHRpb25zKCk7XG4gICAgLy8gICAgIGhpZGVBbGxEZXBlbmRlbnRCb3goKTtcbiAgICAvLyAgICAgaGlkZWZsb2F0aW5nVG9vbGJhcigpO1xuICAgIC8vIH1cblxuICAgIHRyYW5zZm9ybUJsb2NrKGJsb2NrRWxlbWVudDogSFRNTEVsZW1lbnQsIHR5cGU6IHN0cmluZykge1xuXG4gICAgICAgIC8vYmxvY2tFbGVtZW50LCB0eXBlXG5cblxuICAgICAgICBsZXQgY29udGVudEVsZW1lbnQgPSBibG9ja0VsZW1lbnQucXVlcnlTZWxlY3RvcignLnN3aXR0YWJsZScpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBsZXQgY29udGVudCA9IGNvbnRlbnRFbGVtZW50Py5pbm5lclRleHQ7XG5cbiAgICAgICAgLy8gaWYgKGNvbnRlbnQuZW5kc1dpdGgoJy8nKSkge1xuICAgICAgICAvLyAgICAgY29udGVudCA9IGNvbnRlbnQuc2xpY2UoMCwgLTEpOyAvLyBSZW1vdmUgdGhlIGxhc3QgJy8nXG4gICAgICAgIC8vIH1cblxuICAgICAgICBsZXQgbmV3Q29udGVudEJsb2NrO1xuXG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgY2FzZSBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5QQVJBR1JBUEg6XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBuZXdDb250ZW50QmxvY2sgPSB0aGlzLmVsZW1lbnRGYWN0b3J5U2VydmljZS5jcmVhdGUoRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuUEFSQUdSQVBIKTtcbiAgICAgICAgICAgICAgICAgICAgbmV3Q29udGVudEJsb2NrLmlubmVyVGV4dCA9IGNvbnRlbnQ7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuSEVBREVSXzE6XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBuZXdDb250ZW50QmxvY2sgPSB0aGlzLmVsZW1lbnRGYWN0b3J5U2VydmljZS5jcmVhdGUoRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuSEVBREVSXzEpO1xuICAgICAgICAgICAgICAgICAgICBuZXdDb250ZW50QmxvY2suaW5uZXJUZXh0ID0gY29udGVudDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfMjpcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG5ld0NvbnRlbnRCbG9jayA9IHRoaXMuZWxlbWVudEZhY3RvcnlTZXJ2aWNlLmNyZWF0ZShFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfMik7XG4gICAgICAgICAgICAgICAgICAgIG5ld0NvbnRlbnRCbG9jay5pbm5lclRleHQgPSBjb250ZW50O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl8zOlxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3Q29udGVudEJsb2NrID0gdGhpcy5lbGVtZW50RmFjdG9yeVNlcnZpY2UuY3JlYXRlKEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl8zKTtcbiAgICAgICAgICAgICAgICAgICAgbmV3Q29udGVudEJsb2NrLmlubmVyVGV4dCA9IGNvbnRlbnQ7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuSEVBREVSXzQ6XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBuZXdDb250ZW50QmxvY2sgPSB0aGlzLmVsZW1lbnRGYWN0b3J5U2VydmljZS5jcmVhdGUoRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuSEVBREVSXzQpO1xuICAgICAgICAgICAgICAgICAgICBuZXdDb250ZW50QmxvY2suaW5uZXJUZXh0ID0gY29udGVudDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfNTpcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG5ld0NvbnRlbnRCbG9jayA9IHRoaXMuZWxlbWVudEZhY3RvcnlTZXJ2aWNlLmNyZWF0ZShFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfNSk7XG4gICAgICAgICAgICAgICAgICAgIG5ld0NvbnRlbnRCbG9jay5pbm5lclRleHQgPSBjb250ZW50O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl82OlxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3Q29udGVudEJsb2NrID0gdGhpcy5lbGVtZW50RmFjdG9yeVNlcnZpY2UuY3JlYXRlKEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl82KTtcbiAgICAgICAgICAgICAgICAgICAgbmV3Q29udGVudEJsb2NrLmlubmVyVGV4dCA9IGNvbnRlbnQ7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuQ09ERTpcbiAgICAgICAgICAgICAgICBuZXdDb250ZW50QmxvY2sgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdwcmUnKTtcbiAgICAgICAgICAgICAgICBjb25zdCBjb2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY29kZScpO1xuICAgICAgICAgICAgICAgIGNvZGUuaW5uZXJUZXh0ID0gY29udGVudDtcbiAgICAgICAgICAgICAgICBuZXdDb250ZW50QmxvY2suYXBwZW5kQ2hpbGQoY29kZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdpbWFnZSc6XG4gICAgICAgICAgICAgICAgbmV3Q29udGVudEJsb2NrID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7XG4gICAgICAgICAgICAgICAgbmV3Q29udGVudEJsb2NrLnNyYyA9IGNvbnRlbnQ7XG4gICAgICAgICAgICAgICAgbmV3Q29udGVudEJsb2NrLmFsdCA9IFwiRGVzY3JpcHRpdmUgdGV4dFwiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5RVU9URTpcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIC8vIG5ld0NvbnRlbnRCbG9jayA9IGZhY3RvcnkuY3JlYXRlTmV3UXVvdGVFbGVtZW50KGNvbnRlbnQpO1xuXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FzZSBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5CVUxMRVRFRF9MSVNUOlxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3Q29udGVudEJsb2NrID0gdGhpcy5lbGVtZW50RmFjdG9yeVNlcnZpY2UuY3JlYXRlKEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkJVTExFVEVEX0xJU1QsIGNvbnRlbnQpO1xuXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FzZSBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5OVU1CRVJFRF9MSVNUOlxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3Q29udGVudEJsb2NrID0gdGhpcy5lbGVtZW50RmFjdG9yeVNlcnZpY2UuY3JlYXRlKEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLk5VTUJFUkVEX0xJU1QsIGNvbnRlbnQpO1xuXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuQ0hFQ0tfTElTVDpcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG5ld0NvbnRlbnRCbG9jayA9IHRoaXMuZWxlbWVudEZhY3RvcnlTZXJ2aWNlLmNyZWF0ZShFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5DSEVDS19MSVNULCBjb250ZW50KTtcblxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNhc2UgJ3NlcGFyYXRvcic6XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAvLyBuZXdDb250ZW50QmxvY2sgPSBmYWN0b3J5LmNyZWF0ZU5ld1NlcGFyYXRvckVsZW1lbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1Vuc3VwcG9ydGVkIHR5cGUnKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIW5ld0NvbnRlbnRCbG9jaykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgYmxvY2tFbGVtZW50LnJlcGxhY2VDaGlsZChuZXdDb250ZW50QmxvY2ssIGNvbnRlbnRFbGVtZW50KTtcblxuICAgICAgICBjb25zdCBmb2N1c2FibGUgPSBuZXdDb250ZW50QmxvY2suY2xvc2VzdCgnLmZvY3VzYWJsZScpIHx8IGJsb2NrRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcuZm9jdXNhYmxlJyk7XG5cbiAgICAgICAgLy8gZm9jdXNPblRoZUVuZE9mVGhlVGV4dChmb2N1c2FibGUpO1xuICAgIH1cblxuXG5cbiAgICBjcmVhdGVOZXdFbGVtZW50KGV2ZW50OiBFdmVudCkge1xuXG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBldmVudC50YXJnZXQgYXMgRWxlbWVudDtcblxuICAgICAgICBjb25zdCBjb250ZW50RWxlbWVudCA9IGVsZW1lbnQuY2xvc2VzdCgnLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCcpIGFzIEhUTUxFbGVtZW50O1xuXG4gICAgICAgIGlmIChjb250ZW50RWxlbWVudCAmJiBjb250ZW50RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2xpc3QnKSkge1xuICAgICAgICAgICAgdGhpcy5jcmVhdGVMaXN0SXRlbShjb250ZW50RWxlbWVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZURlZmF1bHRCbG9jayhjb250ZW50RWxlbWVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjcmVhdGVMaXN0SXRlbShlbGVtZW50OiBIVE1MRWxlbWVudCk6IHZvaWQge1xuXG4gICAgICAgIGxldCBuZXdDb250ZW50RWxlbWVudCA9IG51bGw7XG5cbiAgICAgICAgbGV0IGFjdGl2ZUVsZW1lbnQgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICAgICAgICBsZXQgY29udGVudEVsZW1lbnQgPSBlbGVtZW50LmNsb3Nlc3QoJy5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQnKSBhcyBIVE1MRWxlbWVudDtcblxuICAgICAgICBpZiAoY29udGVudEVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdjaGVja2JveC1saXN0JykpIHtcbiAgICAgICAgICAgIG5ld0NvbnRlbnRFbGVtZW50ID0gdGhpcy5lbGVtZW50RmFjdG9yeVNlcnZpY2UuY3JlYXRlKFwiY2hlY2tib3hJdGVtXCIsIFwiXCIpO1xuICAgICAgICB9IGVsc2UgaWYgKGNvbnRlbnRFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnbGlzdCcpKSB7XG4gICAgICAgICAgICBuZXdDb250ZW50RWxlbWVudCA9IHRoaXMuZWxlbWVudEZhY3RvcnlTZXJ2aWNlLmNyZWF0ZShcImxpc3RJdGVtXCIsIFwiXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gbmV3Q29udGVudEVsZW1lbnQgPSBjcmVhdGVOZXdEcmFnZ2FibGVQYXJhZ3JhcGhFbGVtZW50KCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBsZXQgcGFyZW50QmxvY2sgPSBudWxsO1xuXG4gICAgICAgIC8vIGlmIChjb250ZW50RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2xpc3QnKSkge1xuXG4gICAgICAgIC8vICAgICBwYXJlbnRCbG9jayA9IGNvbnRlbnRFbGVtZW50O1xuXG4gICAgICAgIC8vICAgICBjb25zdCB0ZXh0Q29udGVudCA9IGFjdGl2ZUVsZW1lbnQudGV4dENvbnRlbnQudHJpbSgpO1xuXG4gICAgICAgIC8vICAgICBpZiAodGV4dENvbnRlbnQgPT09ICcnKSB7XG5cbiAgICAgICAgLy8gICAgICAgICBwYXJlbnRCbG9jayA9IGVsZW1lbnQuY2xvc2VzdCgnLmJsb2NrJyk7XG5cbiAgICAgICAgLy8gICAgICAgICBlbGVtZW50LmNsb3Nlc3QoJy5kZWxldGFibGUnKS5yZW1vdmUoKTtcblxuICAgICAgICAvLyAgICAgICAgIG5ld0NvbnRlbnRFbGVtZW50ID0gY3JlYXRlTmV3RHJhZ2dhYmxlUGFyYWdyYXBoRWxlbWVudCgpO1xuICAgICAgICAvLyAgICAgICAgIHBhcmVudEJsb2NrLmluc2VydEFkamFjZW50RWxlbWVudCgnYWZ0ZXJlbmQnLCBuZXdDb250ZW50RWxlbWVudCk7XG5cbiAgICAgICAgLy8gICAgIH0gZWxzZSB7XG4gICAgICAgIC8vICAgICAgICAgY29uc3QgYWN0aXZlRWxlbWVudCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQuY2xvc2VzdCgnLmxpc3QtaXRlbScpO1xuICAgICAgICAvLyAgICAgICAgIGFjdGl2ZUVsZW1lbnQuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCdhZnRlcmVuZCcsIG5ld0NvbnRlbnRFbGVtZW50KTtcbiAgICAgICAgLy8gICAgIH1cblxuICAgICAgICAvLyB9IGVsc2Uge1xuICAgICAgICAvLyAgICAgcGFyZW50QmxvY2sgPSBlbGVtZW50LmNsb3Nlc3QoJy5ibG9jaycpO1xuXG4gICAgICAgIC8vICAgICBpZiAocGFyZW50QmxvY2spIHtcbiAgICAgICAgLy8gICAgICAgICBpZiAocGFyZW50QmxvY2submV4dFNpYmxpbmcpIHtcbiAgICAgICAgLy8gICAgICAgICAgICAgcGFyZW50QmxvY2sucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobmV3Q29udGVudEVsZW1lbnQsIHBhcmVudEJsb2NrLm5leHRTaWJsaW5nKTtcbiAgICAgICAgLy8gICAgICAgICB9IGVsc2Uge1xuICAgICAgICAvLyAgICAgICAgICAgICBwYXJlbnRCbG9jay5wYXJlbnROb2RlLmFwcGVuZENoaWxkKG5ld0NvbnRlbnRFbGVtZW50KTtcbiAgICAgICAgLy8gICAgICAgICB9XG4gICAgICAgIC8vICAgICB9XG4gICAgICAgIC8vIH1cblxuICAgICAgICAvLyBmb2N1c09uVGhlRW5kT2ZUaGVUZXh0KG5ld0NvbnRlbnRFbGVtZW50KTtcbiAgICB9XG5cblxuICAgIGNyZWF0ZURlZmF1bHRCbG9jayhldmVudFBhcmFncmFwaDogRWxlbWVudCB8IG51bGwpOiB2b2lkIHtcblxuICAgICAgICBjb25zdCBuZXdCbG9jayA9IHRoaXMuZWxlbWVudEZhY3RvcnlTZXJ2aWNlLmNyZWF0ZShFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5CTE9DS19QQVJBR1JBUEgsIFwiXCIpO1xuXG4gICAgICAgIGlmIChldmVudFBhcmFncmFwaCAmJiBldmVudFBhcmFncmFwaC5jbG9zZXN0KCcuYmxvY2snKSkge1xuICAgICAgICAgICAgY29uc3Qgc2libGluZyA9IGV2ZW50UGFyYWdyYXBoLmNsb3Nlc3QoJy5ibG9jaycpITtcbiAgICAgICAgICAgIHNpYmxpbmcuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCdhZnRlcmVuZCcsIG5ld0Jsb2NrKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjam9oYW5uZXNFZGl0b3IgLmNvbnRlbnRcIikhLmFwcGVuZENoaWxkKG5ld0Jsb2NrKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZvY3VzYWJsZSA9IG5ld0Jsb2NrLnF1ZXJ5U2VsZWN0b3IoJy5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQnKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgZm9jdXNhYmxlLmZvY3VzKCk7XG5cbiAgICAgICAgLy8gZm9jdXNPblRoZUVuZE9mVGhlVGV4dChmb2N1c2FibGUpO1xuICAgIH1cblxuXG4gICAgcHJpdmF0ZSBkZWxldGVBbmRGb2N1c09uUHJldmlvdXMoKTogdm9pZCB7XG5cbiAgICAgICAgY29uc3QgY3VycmVudEFjdGl2ZUVsZW1lbnQgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50ITtcblxuICAgICAgICB0aGlzLmZvY3VzT25QcmV2aW91cyhjdXJyZW50QWN0aXZlRWxlbWVudCk7XG4gICAgICAgIHRoaXMuZGVsZXRlVGhlQ3VycmVudEVsZW1lbnRBbmRUaGVEcmFnZ2FibGVCbG9ja0lmRW1wdHkoY3VycmVudEFjdGl2ZUVsZW1lbnQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZGVsZXRlQW5kRm9jdXNPbk5leHQoKSB7XG5cbiAgICAgICAgbGV0IGN1cnJlbnRBY3RpdmVFbGVtZW50ID0gdGhpcy5nZXRDdXJyZW50U2VsZWN0ZWRCbG9jaygpIHx8IHRoaXMuZ2V0Q3VycmVudEFjdGl2ZUJsb2NrKCk7XG5cbiAgICAgICAgaWYgKCFjdXJyZW50QWN0aXZlRWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5mb2N1c09uTmV4dChjdXJyZW50QWN0aXZlRWxlbWVudCk7XG4gICAgICAgIHRoaXMuZGVsZXRlVGhlQ3VycmVudEVsZW1lbnRBbmRUaGVEcmFnZ2FibGVCbG9ja0lmRW1wdHkoY3VycmVudEFjdGl2ZUVsZW1lbnQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZm9jdXNPblByZXZpb3VzKGFjdHVhbEVsZW1lbnQ6IEVsZW1lbnQsIHBvc2l0aW9uOiBudW1iZXIgfCBudWxsID0gbnVsbCk6IHZvaWQge1xuXG4gICAgICAgIGxldCB0YWcgPSBhY3R1YWxFbGVtZW50LnRhZ05hbWUudG9VcHBlckNhc2UoKTtcbiAgICAgICAgbGV0IGZvY3VzZWRFbGVtZW50ID0gbnVsbDtcblxuICAgICAgICBpZiAodGFnID09PSAnTEknKSB7XG4gICAgICAgICAgICBsZXQgcHJldmlvdXNFbGVtZW50ID0gYWN0dWFsRWxlbWVudC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nO1xuXG4gICAgICAgICAgICBpZiAoIXByZXZpb3VzRWxlbWVudCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHByZXZpb3VzRWxlbWVudCAmJiBwcmV2aW91c0VsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdmb2N1c2FibGUnKSkge1xuICAgICAgICAgICAgICAgIGZvY3VzZWRFbGVtZW50ID0gcHJldmlvdXNFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcGx5Q3Vyc29yWEVuZFBvc2l0aW9uKGZvY3VzZWRFbGVtZW50LCBwb3NpdGlvbik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mb2N1c09uVGhlRW5kT2ZUaGVUZXh0KGZvY3VzZWRFbGVtZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gcmV0dXJuIGZvY3VzZWRFbGVtZW50O1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgoYWN0dWFsRWxlbWVudC5wYXJlbnROb2RlIGFzIEhUTUxFbGVtZW50KS50YWdOYW1lLnRvVXBwZXJDYXNlKCkgPT09ICdMSScgLyogZm9jdXNhYmxlIFNQQU4gaW5zaWRlIExJKi8pIHtcblxuICAgICAgICAgICAgbGV0IHByZXZpb3VzRWxlbWVudCA9IGFjdHVhbEVsZW1lbnQuY2xvc2VzdCgnbGknKT8ucHJldmlvdXNFbGVtZW50U2libGluZz8ucXVlcnlTZWxlY3RvcignLmZvY3VzYWJsZScpO1xuXG4gICAgICAgICAgICBpZiAocHJldmlvdXNFbGVtZW50ICYmIHByZXZpb3VzRWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2ZvY3VzYWJsZScpKSB7XG4gICAgICAgICAgICAgICAgZm9jdXNlZEVsZW1lbnQgPSBwcmV2aW91c0VsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwbHlDdXJzb3JYRW5kUG9zaXRpb24oZm9jdXNlZEVsZW1lbnQsIHBvc2l0aW9uKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZvY3VzT25UaGVFbmRPZlRoZVRleHQoZm9jdXNlZEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyByZXR1cm4gZm9jdXNlZEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBhcmVudCA9IGFjdHVhbEVsZW1lbnQuY2xvc2VzdCgnLmJsb2NrJyk7XG5cbiAgICAgICAgaWYgKCFwYXJlbnQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgc2libGluZyA9IHBhcmVudC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nO1xuXG4gICAgICAgIHdoaWxlIChzaWJsaW5nKSB7XG4gICAgICAgICAgICBsZXQgZm9jdXNhYmxlQ2FuZGlkYXRlcyA9IHNpYmxpbmcucXVlcnlTZWxlY3RvckFsbCgnLmZvY3VzYWJsZScpO1xuICAgICAgICAgICAgaWYgKGZvY3VzYWJsZUNhbmRpZGF0ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGZvY3VzZWRFbGVtZW50ID0gZm9jdXNhYmxlQ2FuZGlkYXRlc1tmb2N1c2FibGVDYW5kaWRhdGVzLmxlbmd0aCAtIDFdIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcGx5Q3Vyc29yWEVuZFBvc2l0aW9uKGZvY3VzZWRFbGVtZW50LCBwb3NpdGlvbik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mb2N1c09uVGhlRW5kT2ZUaGVUZXh0KGZvY3VzZWRFbGVtZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gcmV0dXJuIGZvY3VzZWRFbGVtZW50O1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc2libGluZyA9IHNpYmxpbmcucHJldmlvdXNFbGVtZW50U2libGluZztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHJldHVybiBmb2N1c2VkRWxlbWVudDtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHByaXZhdGUgZm9jdXNPbk5leHQoYWN0dWFsRWxlbWVudDogRWxlbWVudCwgcG9zaXRpb246IG51bWJlciB8IG51bGwgPSBudWxsKSB7XG4gICAgICAgIGxldCB0YWcgPSBhY3R1YWxFbGVtZW50LnRhZ05hbWUudG9VcHBlckNhc2UoKTtcbiAgICAgICAgbGV0IGZvY3VzZWRFbGVtZW50ID0gbnVsbDtcblxuICAgICAgICBpZiAodGFnID09PSAnTEknKSB7XG4gICAgICAgICAgICBsZXQgbmV4dEVsZW1lbnQgPSBhY3R1YWxFbGVtZW50Lm5leHRFbGVtZW50U2libGluZztcblxuICAgICAgICAgICAgaWYgKG5leHRFbGVtZW50ICYmIG5leHRFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnZm9jdXNhYmxlJykpIHtcbiAgICAgICAgICAgICAgICBmb2N1c2VkRWxlbWVudCA9IG5leHRFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xuXG4gICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwbHlDdXJzb3JYU3RhcnRQb3NpdGlvbihmb2N1c2VkRWxlbWVudCwgcG9zaXRpb24pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZm9jdXNPblRoZVN0YXJ0T2ZUaGVUZXh0KGZvY3VzZWRFbGVtZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZvY3VzZWRFbGVtZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKChhY3R1YWxFbGVtZW50LnBhcmVudE5vZGUgYXMgSFRNTEVsZW1lbnQpLnRhZ05hbWUudG9VcHBlckNhc2UoKSA9PT0gJ0xJJyAvKiBmb2N1c2FibGUgU1BBTiBpbnNpZGUgTEkqLykge1xuICAgICAgICAgICAgbGV0IG5leHRFbGVtZW50ID0gYWN0dWFsRWxlbWVudC5jbG9zZXN0KCdsaScpPy5uZXh0RWxlbWVudFNpYmxpbmc/LnF1ZXJ5U2VsZWN0b3IoJy5mb2N1c2FibGUnKTtcblxuICAgICAgICAgICAgaWYgKG5leHRFbGVtZW50ICYmIG5leHRFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnZm9jdXNhYmxlJykpIHtcbiAgICAgICAgICAgICAgICBmb2N1c2VkRWxlbWVudCA9IG5leHRFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcGx5Q3Vyc29yWFN0YXJ0UG9zaXRpb24oZm9jdXNlZEVsZW1lbnQsIHBvc2l0aW9uKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZvY3VzT25UaGVTdGFydE9mVGhlVGV4dChmb2N1c2VkRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBmb2N1c2VkRWxlbWVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBwYXJlbnQgPSBhY3R1YWxFbGVtZW50LmNsb3Nlc3QoJy5ibG9jaycpO1xuXG4gICAgICAgIGlmICghcGFyZW50KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgc2libGluZyA9IHBhcmVudC5uZXh0RWxlbWVudFNpYmxpbmc7XG5cbiAgICAgICAgd2hpbGUgKHNpYmxpbmcpIHtcbiAgICAgICAgICAgIGxldCBmb2N1c2FibGVDYW5kaWRhdGVzID0gc2libGluZy5xdWVyeVNlbGVjdG9yQWxsKCcuZm9jdXNhYmxlJyk7XG4gICAgICAgICAgICBpZiAoZm9jdXNhYmxlQ2FuZGlkYXRlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgZm9jdXNlZEVsZW1lbnQgPSBmb2N1c2FibGVDYW5kaWRhdGVzWzBdIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcGx5Q3Vyc29yWFN0YXJ0UG9zaXRpb24oZm9jdXNlZEVsZW1lbnQsIHBvc2l0aW9uKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZvY3VzT25UaGVTdGFydE9mVGhlVGV4dChmb2N1c2VkRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBmb2N1c2VkRWxlbWVudDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc2libGluZyA9IHNpYmxpbmcubmV4dEVsZW1lbnRTaWJsaW5nO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZvY3VzZWRFbGVtZW50O1xuICAgIH1cblxuXG5cbiAgICBkZWxldGVUaGVDdXJyZW50RWxlbWVudEFuZFRoZURyYWdnYWJsZUJsb2NrSWZFbXB0eShjdXJyZW50RWxlbWVudDogRWxlbWVudCkge1xuXG4gICAgICAgIGNvbnN0IHBhcmVudEJsb2NrID0gY3VycmVudEVsZW1lbnQuY2xvc2VzdCgnLmJsb2NrJyk7XG4gICAgICAgIGNvbnN0IGFjdHVhbCA9IGN1cnJlbnRFbGVtZW50LmNsb3Nlc3QoJy5kZWxldGFibGUnKTtcblxuICAgICAgICBhY3R1YWw/LnJlbW92ZSgpO1xuXG4gICAgICAgIGlmIChwYXJlbnRCbG9jayAmJiBwYXJlbnRCbG9jay5xdWVyeVNlbGVjdG9yQWxsKCcuZWRpdGFibGUnKS5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgcGFyZW50QmxvY2sucmVtb3ZlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cblxuXG5cbiAgICBhcHBseUN1cnNvclhFbmRQb3NpdGlvbihlbGVtZW50OiBIVE1MRWxlbWVudCwgeFBvc2l0aW9uOiBudW1iZXIpIHtcblxuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCkhO1xuICAgICAgICBjb25zdCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG5cbiAgICAgICAgbGV0IGN1cnJlbnROb2RlID0gZWxlbWVudC5sYXN0Q2hpbGQ7XG4gICAgICAgIGxldCByZXN1bHQgPSBudWxsO1xuXG4gICAgICAgIHdoaWxlIChjdXJyZW50Tm9kZSkge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnROb2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMuYWRqdXN0Q3Vyc29yT2Zmc2V0KGN1cnJlbnROb2RlLCB4UG9zaXRpb24pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50Tm9kZS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSAnQlInKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZS5wcmV2aW91c1NpYmxpbmc7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLnByZXZpb3VzU2libGluZztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXN1bHQgJiYgcmVzdWx0LmNsb3Nlc3ROb2RlKSB7XG4gICAgICAgICAgICByYW5nZS5zZXRTdGFydChyZXN1bHQuY2xvc2VzdE5vZGUsIHJlc3VsdC5jbG9zZXN0T2Zmc2V0KTtcbiAgICAgICAgICAgIHJhbmdlLmNvbGxhcHNlKHRydWUpO1xuICAgICAgICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgICAgICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKTtcbiAgICAgICAgICAgIGVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhlbGVtZW50KTtcbiAgICAgICAgICAgIHJhbmdlLmNvbGxhcHNlKGZhbHNlKTtcbiAgICAgICAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICAgICAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSk7XG4gICAgICAgICAgICBlbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhcHBseUN1cnNvclhTdGFydFBvc2l0aW9uKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCB4UG9zaXRpb246IG51bWJlcikge1xuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCkhO1xuICAgICAgICBjb25zdCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG5cbiAgICAgICAgbGV0IGN1cnJlbnROb2RlID0gZWxlbWVudC5maXJzdENoaWxkO1xuICAgICAgICBsZXQgcmVzdWx0ID0gbnVsbDtcblxuICAgICAgICB3aGlsZSAoY3VycmVudE5vZGUpIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50Tm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB0aGlzLmFkanVzdEN1cnNvck9mZnNldChjdXJyZW50Tm9kZSwgeFBvc2l0aW9uKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGN1cnJlbnROb2RlID0gY3VycmVudE5vZGUubmV4dFNpYmxpbmc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVzdWx0ICYmIHJlc3VsdC5jbG9zZXN0Tm9kZSkge1xuICAgICAgICAgICAgcmFuZ2Uuc2V0U3RhcnQocmVzdWx0LmNsb3Nlc3ROb2RlLCByZXN1bHQuY2xvc2VzdE9mZnNldCk7XG4gICAgICAgICAgICByYW5nZS5jb2xsYXBzZSh0cnVlKTtcbiAgICAgICAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICAgICAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSk7XG4gICAgICAgICAgICBlbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByYW5nZS5zZWxlY3ROb2RlQ29udGVudHMoZWxlbWVudCk7XG4gICAgICAgICAgICByYW5nZS5jb2xsYXBzZSh0cnVlKTtcbiAgICAgICAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICAgICAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSk7XG4gICAgICAgICAgICBlbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhZGp1c3RDdXJzb3JPZmZzZXQobm9kZTogTm9kZSwgeFBvc2l0aW9uOiBudW1iZXIpIHtcbiAgICAgICAgbGV0IHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcbiAgICAgICAgbGV0IGNsb3Nlc3ROb2RlID0gbm9kZTtcbiAgICAgICAgbGV0IGNsb3Nlc3RPZmZzZXQgPSAwO1xuICAgICAgICBsZXQgY2xvc2VzdERpZmYgPSBJbmZpbml0eTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUudGV4dENvbnRlbnQhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICByYW5nZS5zZXRTdGFydChub2RlLCBpKTtcbiAgICAgICAgICAgIHJhbmdlLnNldEVuZChub2RlLCBpICsgMSk7XG4gICAgICAgICAgICBjb25zdCByZWN0ID0gcmFuZ2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICBjb25zdCBsZWZ0RGlmZiA9IE1hdGguYWJzKHJlY3QubGVmdCAtIHhQb3NpdGlvbik7XG4gICAgICAgICAgICBjb25zdCByaWdodERpZmYgPSBNYXRoLmFicyhyZWN0LnJpZ2h0IC0geFBvc2l0aW9uKTtcblxuICAgICAgICAgICAgaWYgKGxlZnREaWZmIDwgY2xvc2VzdERpZmYgfHwgcmlnaHREaWZmIDwgY2xvc2VzdERpZmYpIHtcbiAgICAgICAgICAgICAgICBjbG9zZXN0RGlmZiA9IE1hdGgubWluKGxlZnREaWZmLCByaWdodERpZmYpO1xuICAgICAgICAgICAgICAgIGNsb3Nlc3RPZmZzZXQgPSBpICsgKHJpZ2h0RGlmZiA8IGxlZnREaWZmID8gMSA6IDApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHhQb3NpdGlvbiA+IHJhbmdlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnJpZ2h0KSB7XG4gICAgICAgICAgICBjbG9zZXN0T2Zmc2V0ID0gbm9kZS50ZXh0Q29udGVudCEubGVuZ3RoO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHsgY2xvc2VzdE5vZGUsIGNsb3Nlc3RPZmZzZXQgfTtcbiAgICB9XG5cblxuICAgIGZvY3VzT25UaGVFbmRPZlRoZVRleHQoY29udGVudEJsb2NrOiBIVE1MRWxlbWVudCkge1xuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuXG4gICAgICAgICAgICBjb25zdCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCkhO1xuXG4gICAgICAgICAgICByYW5nZS5zZWxlY3ROb2RlQ29udGVudHMoY29udGVudEJsb2NrKTtcblxuICAgICAgICAgICAgbGV0IGxhc3RDaGlsZCA9IGNvbnRlbnRCbG9jaztcblxuICAgICAgICAgICAgd2hpbGUgKGxhc3RDaGlsZC5sYXN0Q2hpbGQgJiYgbGFzdENoaWxkLmxhc3RDaGlsZC5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUpIHtcbiAgICAgICAgICAgICAgICBsYXN0Q2hpbGQgPSBsYXN0Q2hpbGQubGFzdENoaWxkIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGxhc3RDaGlsZC5sYXN0Q2hpbGQpIHtcbiAgICAgICAgICAgICAgICBsYXN0Q2hpbGQgPSBsYXN0Q2hpbGQubGFzdENoaWxkIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByYW5nZS5zZXRFbmQobGFzdENoaWxkLCBsYXN0Q2hpbGQudGV4dENvbnRlbnQhLmxlbmd0aCk7XG4gICAgICAgICAgICByYW5nZS5jb2xsYXBzZShmYWxzZSk7XG5cbiAgICAgICAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICAgICAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSk7XG5cbiAgICAgICAgICAgIGNvbnRlbnRCbG9jay5mb2N1cygpO1xuICAgICAgICB9LCAxMCk7XG4gICAgfVxuXG4gICAgZm9jdXNPblRoZVN0YXJ0T2ZUaGVUZXh0KGNvbnRlbnRCbG9jazogSFRNTEVsZW1lbnQpIHtcblxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKSE7XG5cbiAgICAgICAgICAgIHJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhjb250ZW50QmxvY2spO1xuICAgICAgICAgICAgcmFuZ2UuY29sbGFwc2UodHJ1ZSk7XG4gICAgICAgICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgICAgICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpO1xuXG4gICAgICAgICAgICBjb250ZW50QmxvY2suZm9jdXMoKTtcbiAgICAgICAgfSwgMTApO1xuICAgIH1cblxuXG5cbiAgICBnZXRDdXJyZW50U2VsZWN0ZWRGb2N1c2FibGUoKTogRWxlbWVudCB8IG51bGwge1xuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gICAgICAgIGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAwKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xuICAgICAgICBsZXQgY29udGFpbmVyOiBOb2RlIHwgbnVsbCA9IHJhbmdlLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyO1xuXG4gICAgICAgIGlmIChjb250YWluZXIubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgICAgICAgICBjb250YWluZXIgPSBjb250YWluZXIucGFyZW50Tm9kZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZvY3VzYWJsZVBhcmVudCA9IChjb250YWluZXIgYXMgSFRNTEVsZW1lbnQpLmNsb3Nlc3QoXCIuZm9jdXNhYmxlXCIpO1xuXG4gICAgICAgIHJldHVybiBmb2N1c2FibGVQYXJlbnQ7XG4gICAgfVxuXG4gICAgZ2V0Q3VycmVudFNlbGVjdGVkQmxvY2soKTogRWxlbWVudCB8IG51bGwge1xuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gICAgICAgIGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAwKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xuICAgICAgICBsZXQgY29udGFpbmVyOiBOb2RlIHwgbnVsbCA9IHJhbmdlLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyO1xuXG4gICAgICAgIGlmIChjb250YWluZXIubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgICAgICAgICBjb250YWluZXIgPSBjb250YWluZXIucGFyZW50Tm9kZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZvY3VzYWJsZVBhcmVudCA9IChjb250YWluZXIgYXMgSFRNTEVsZW1lbnQpLmNsb3Nlc3QoXCIuYmxvY2tcIik7XG5cbiAgICAgICAgcmV0dXJuIGZvY3VzYWJsZVBhcmVudDtcbiAgICB9XG5cbiAgICBnZXRDdXJyZW50QWN0aXZlQmxvY2soKTogRWxlbWVudCB8IG51bGwge1xuXG4gICAgICAgIGxldCBjb250YWluZXIgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuXG4gICAgICAgIGlmIChjb250YWluZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBjb250YWluZXIuY2xvc2VzdChcIi5ibG9ja1wiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuXG4gICAgZHVwbGljYXRlU2VsZWN0ZWRCbG9jaygpIHtcblxuICAgICAgICBsZXQgZWxlbWVudCA9IHRoaXMuZ2V0Q3VycmVudFNlbGVjdGVkQmxvY2soKSB8fCB0aGlzLmdldEN1cnJlbnRBY3RpdmVCbG9jaygpO1xuXG4gICAgICAgIGlmICghZWxlbWVudCB8fCAhZWxlbWVudC5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdPIGVsZW1lbnRvIGZvcm5lY2lkbyDDqSBpbnbDoWxpZG8gb3UgbsOjbyBlc3TDoSBubyBET00uJyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjbG9uZSA9IGVsZW1lbnQuY2xvbmVOb2RlKHRydWUpO1xuXG4gICAgICAgIGNvbnN0IG5leHRFbGVtZW50ID0gZWxlbWVudC5uZXh0U2libGluZztcblxuICAgICAgICBlbGVtZW50LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGNsb25lLCBuZXh0RWxlbWVudCk7XG4gICAgfVxuXG59IiwiZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VVSUNvbXBvbmVudDxUIGV4dGVuZHMgSFRNTEVsZW1lbnQgPSBIVE1MRWxlbWVudD4ge1xyXG5cclxuICAgIHByaXZhdGUgX2NhbkhpZGU6IGJvb2xlYW47XHJcblxyXG4gICAgcHJvcHM6IFJlY29yZDxzdHJpbmcsIGFueT47XHJcbiAgICBodG1sRWxlbWVudDogVDtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wczogUmVjb3JkPHN0cmluZywgYW55Pikge1xyXG5cclxuICAgICAgICB0aGlzLnByb3BzID0gcHJvcHM7XHJcblxyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQgPSB0aGlzLmluaXQoKSBhcyBUO1xyXG4gICAgICAgIHRoaXMuX2NhbkhpZGUgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGFic3RyYWN0IGluaXQoKTogSFRNTEVsZW1lbnQ7XHJcblxyXG4gICAgZ2V0IGRpc3BsYXkoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gJ2Jsb2NrJztcclxuICAgIH1cclxuXHJcbiAgICBkb2N1bWVudEFwcGVuZFRvKHBhcmVudDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcclxuICAgICAgICBwYXJlbnQuYXBwZW5kQ2hpbGQodGhpcy5odG1sRWxlbWVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGlzVmlzaWJsZSgpIHtcclxuICAgICAgICBsZXQgZWxlbWVudDogSFRNTEVsZW1lbnQgPSB0aGlzLmh0bWxFbGVtZW50O1xyXG5cclxuICAgICAgICBpZiAoZWxlbWVudC5zdHlsZS5kaXNwbGF5ID09PSAnbm9uZScgfHwgZWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID09PSAnaGlkZGVuJyB8fCAhZG9jdW1lbnQuY29udGFpbnMoZWxlbWVudCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgd2hpbGUgKGVsZW1lbnQpIHtcclxuICAgICAgICAgICAgY29uc3Qgc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KTtcclxuXHJcbiAgICAgICAgICAgIGlmIChzdHlsZS5kaXNwbGF5ID09PSAnbm9uZScgfHwgc3R5bGUudmlzaWJpbGl0eSA9PT0gJ2hpZGRlbicpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGVsZW1lbnQucGFyZW50RWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50RWxlbWVudDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBzaG93KCkge1xyXG4gICAgICAgIHRoaXMuX2NhbkhpZGUgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSB0aGlzLmRpc3BsYXk7XHJcblxyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLl9jYW5IaWRlID0gdHJ1ZTtcclxuICAgICAgICB9LCAxMDApO1xyXG4gICAgfVxyXG5cclxuICAgIGhpZGUoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9jYW5IaWRlKSB7XHJcblxyXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXCJBdHRlbXB0ZWQgdG8gaGlkZSB0aGUgZWxlbWVudCBiZWZvcmUgMTAwIG1pbGxpc2Vjb25kcyBoYXZlIHBhc3NlZCBzaW5jZSB0aGUgbGFzdCBkaXNwbGF5LlwiKTtcclxuICAgICAgICAgICAgLy8gcmV0dXJuO1xyXG4gICAgICAgICAgICAvLyB0aHJvdyBuZXcgRXJyb3IoXCJBdHRlbXB0ZWQgdG8gaGlkZSB0aGUgZWxlbWVudCBiZWZvcmUgMTAwIG1pbGxpc2Vjb25kcyBoYXZlIHBhc3NlZCBzaW5jZSB0aGUgbGFzdCBkaXNwbGF5LlwiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuICAgIH1cclxuXHJcbiAgICBnZXQgY2FuSGlkZSgpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fY2FuSGlkZSAmJiB0aGlzLmlzVmlzaWJsZTtcclxuICAgIH1cclxuXHJcbiAgICBzZXQgY2FuSGlkZSh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgICAgIHRoaXMuX2NhbkhpZGUgPSB2YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICBmb2N1cygpIHtcclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LmZvY3VzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgY2hhbmdlQ29sb3IodmFsdWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUuY29sb3IgPSB2YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICByZW1vdmVDb2xvcigpe1xyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUuY29sb3IgPSBcImluaGVyaXRcIjtcclxuICAgIH1cclxuXHJcbiAgICBjaGFuZ2VWaXNpYmlsaXR5VG9WaXNpYmxlKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9IFwidmlzaWJsZVwiO1xyXG4gICAgfVxyXG5cclxuICAgIGNoYW5nZVZpc2liaWxpdHlUb0hpZGRlbigpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSBcImhpZGRlblwiO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBkb2VzRWxlbWVudE92ZXJmbG93U2NyZWVuKCk6IGJvb2xlYW4ge1xyXG5cclxuICAgICAgICBjb25zdCBvcmlnaW5hbERpc3BsYXkgPSB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLmRpc3BsYXk7XHJcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxWaXNpYmlsaXR5ID0gdGhpcy5odG1sRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5O1xyXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsUG9zaXRpb24gPSB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLnBvc2l0aW9uO1xyXG5cclxuICAgICAgICBpZiAob3JpZ2luYWxEaXNwbGF5ID09PSAnbm9uZScpIHtcclxuICAgICAgICAgICAgdGhpcy5odG1sRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcclxuICAgICAgICAgICAgdGhpcy5odG1sRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XHJcbiAgICAgICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZWxlbWVudFJlY3QgPSB0aGlzLmh0bWxFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICAgIGNvbnN0IHNjcmVlbldpZHRoID0gd2luZG93LmlubmVyV2lkdGg7XHJcblxyXG4gICAgICAgIGlmIChvcmlnaW5hbERpc3BsYXkgPT09ICdub25lJykge1xyXG4gICAgICAgICAgICB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSBvcmlnaW5hbERpc3BsYXk7XHJcbiAgICAgICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9IG9yaWdpbmFsVmlzaWJpbGl0eTtcclxuICAgICAgICAgICAgdGhpcy5odG1sRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9IG9yaWdpbmFsUG9zaXRpb247XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBlbGVtZW50UmlnaHRFZGdlID0gZWxlbWVudFJlY3QucmlnaHQ7XHJcblxyXG4gICAgICAgIGlmIChlbGVtZW50UmlnaHRFZGdlID4gc2NyZWVuV2lkdGgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoZWxlbWVudFJlY3QubGVmdCA8IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBCYXNlVUlDb21wb25lbnQgfSBmcm9tICcuLi9jb21tb24vQmFzZVVJQ29tcG9uZW50JztcclxuXHJcbmV4cG9ydCBjbGFzcyBRdWlja01lbnVFbXB0eSBleHRlbmRzIEJhc2VVSUNvbXBvbmVudCB7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcblxyXG4gICAgICAgIHN1cGVyKHt9KTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0KCk6IEhUTUxFbGVtZW50IHtcclxuXHJcbiAgICAgICAgY29uc3QgaHRtbEVtcHR5SW5kaWNhdG9yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xyXG5cclxuICAgICAgICBodG1sRW1wdHlJbmRpY2F0b3IuaW5uZXJUZXh0ID0gJ05vIHJlc3VsdHMnO1xyXG4gICAgICAgIGh0bWxFbXB0eUluZGljYXRvci5jbGFzc0xpc3QuYWRkKCdlbXB0eS1ibG9jay1vcHRpb25zJyk7XHJcbiAgICAgICAgaHRtbEVtcHR5SW5kaWNhdG9yLnN0eWxlLnBhZGRpbmcgPSAnMTBweCc7XHJcbiAgICAgICAgaHRtbEVtcHR5SW5kaWNhdG9yLnN0eWxlLmNvbG9yID0gJ3JnYmEoNTUsIDUzLCA0NywgMC42NSknO1xyXG4gICAgICAgIGh0bWxFbXB0eUluZGljYXRvci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG5cclxuICAgICAgICByZXR1cm4gaHRtbEVtcHR5SW5kaWNhdG9yO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgSk5vZGUgfSBmcm9tIFwiLi9KTm9kZVwiO1xyXG5cclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VEb3VibHlMaW5rZWRMaXN0PFQ+IHtcclxuXHJcbiAgICBoZWFkOiBKTm9kZTxUPiB8IG51bGwgPSBudWxsO1xyXG4gICAgdGFpbDogSk5vZGU8VD4gfCBudWxsID0gbnVsbDtcclxuXHJcbiAgICBsZW5ndGg6IG51bWJlciA9IDA7XHJcblxyXG4gICAgYWJzdHJhY3QgYXBwZW5kKGVsZW1lbnQ6IFQpOiB2b2lkO1xyXG5cclxuICAgIGdldEZpcnN0KCk6IEpOb2RlPFQ+IHwgbnVsbCB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaGVhZDtcclxuICAgIH1cclxuXHJcbiAgICBnZXRMYXN0KCk6IEpOb2RlPFQ+IHwgbnVsbCB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudGFpbDtcclxuICAgIH1cclxuXHJcbiAgICAqW1N5bWJvbC5pdGVyYXRvcl0oKSB7XHJcbiAgICAgICAgbGV0IGN1cnJlbnQgPSB0aGlzLmhlYWQ7XHJcbiAgICAgICAgaWYgKCFjdXJyZW50KSByZXR1cm47XHJcbiAgICAgICAgZG8ge1xyXG4gICAgICAgICAgICB5aWVsZCBjdXJyZW50O1xyXG4gICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0Tm9kZTtcclxuICAgICAgICB9IHdoaWxlIChjdXJyZW50ICYmIGN1cnJlbnQgIT09IHRoaXMuaGVhZCk7XHJcbiAgICB9XHJcblxyXG4gICAgZm9yRWFjaChjYWxsYmFjazogKG5vZGU6IFQsIGluZGV4OiBudW1iZXIsIGxpc3Q6IEJhc2VEb3VibHlMaW5rZWRMaXN0PFQ+KSA9PiB2b2lkKTogdm9pZCB7XHJcbiAgICAgICAgbGV0IGluZGV4ID0gMDtcclxuICAgICAgICBmb3IgKGxldCBub2RlIG9mIHRoaXMpIHtcclxuICAgICAgICAgICAgY2FsbGJhY2sobm9kZS52YWx1ZSwgaW5kZXgsIHRoaXMpO1xyXG4gICAgICAgICAgICBpbmRleCsrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhbnkocHJlZGljYXRlOiAobm9kZTogVCkgPT4gYm9vbGVhbik6IGJvb2xlYW4ge1xyXG4gICAgICAgIGxldCBjdXJyZW50ID0gdGhpcy5oZWFkO1xyXG4gICAgICAgIHdoaWxlIChjdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGlmIChwcmVkaWNhdGUoY3VycmVudC52YWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHROb2RlO1xyXG4gICAgICAgICAgICBpZiAoY3VycmVudCA9PT0gdGhpcy5oZWFkKSBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGZpbmRGaXJzdChwcmVkaWNhdGU6IChub2RlOiBUKSA9PiBib29sZWFuKTogSk5vZGU8VD4gfCBudWxsIHtcclxuICAgICAgICBpZiAoIXRoaXMuaGVhZCkgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgICAgIGxldCBjdXJyZW50OiBudWxsIHwgSk5vZGU8VD4gPSB0aGlzLmhlYWQ7XHJcbiAgICAgICAgZG8ge1xyXG4gICAgICAgICAgICBpZiAocHJlZGljYXRlKGN1cnJlbnQudmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0Tm9kZTtcclxuICAgICAgICB9IHdoaWxlIChjdXJyZW50ICYmIGN1cnJlbnQgIT09IHRoaXMuaGVhZCk7XHJcblxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGZpbmRMYXN0KHByZWRpY2F0ZTogKG5vZGU6IFQpID0+IGJvb2xlYW4pOiBKTm9kZTxUPiB8IG51bGwge1xyXG4gICAgICAgIGlmICghdGhpcy50YWlsKSByZXR1cm4gbnVsbDtcclxuXHJcbiAgICAgICAgbGV0IGN1cnJlbnQ6IG51bGwgfCBKTm9kZTxUPiA9IHRoaXMudGFpbDtcclxuXHJcbiAgICAgICAgZG8ge1xyXG4gICAgICAgICAgICBpZiAocHJlZGljYXRlKGN1cnJlbnQudmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5wcmV2aW91c05vZGU7XHJcbiAgICAgICAgfSB3aGlsZSAoY3VycmVudCAmJiBjdXJyZW50ICE9PSB0aGlzLnRhaWwpO1xyXG5cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBmaW5kKGVsZW1lbnQ6IFQpOiBKTm9kZTxUPiB8IG51bGwge1xyXG5cclxuICAgICAgICBsZXQgY3VycmVudDogSk5vZGU8VD4gfCBudWxsID0gdGhpcy5oZWFkO1xyXG5cclxuICAgICAgICB3aGlsZSAoY3VycmVudCkge1xyXG4gICAgICAgICAgICBpZiAoY3VycmVudC52YWx1ZSA9PSBlbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dE5vZGU7XHJcbiAgICAgICAgICAgIGlmIChjdXJyZW50ID09PSB0aGlzLmhlYWQpIGJyZWFrO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBCYXNlRG91Ymx5TGlua2VkTGlzdCB9IGZyb20gXCIuL0Jhc2VEb3VibHlMaW5rZWRMaXN0XCI7XHJcblxyXG5leHBvcnQgY2xhc3MgSk5vZGU8VD4ge1xyXG5cclxuICAgIHBhcmVudExpc3Q6IEJhc2VEb3VibHlMaW5rZWRMaXN0PFQ+O1xyXG5cclxuICAgIHByZXZpb3VzTm9kZTogSk5vZGU8VD4gfCBudWxsO1xyXG4gICAgbmV4dE5vZGU6IEpOb2RlPFQ+IHwgbnVsbDtcclxuICAgIHZhbHVlOiBUO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHZhbHVlOiBULCBwYXJlbnRMaXN0OiBCYXNlRG91Ymx5TGlua2VkTGlzdDxUPikge1xyXG4gICAgICAgIHRoaXMucHJldmlvdXNOb2RlID0gbnVsbDtcclxuICAgICAgICB0aGlzLm5leHROb2RlID0gbnVsbDtcclxuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy5wYXJlbnRMaXN0ID0gcGFyZW50TGlzdDtcclxuICAgIH1cclxuXHJcbiAgICBzZXROZXh0KG5vZGU6IEpOb2RlPFQ+KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5uZXh0Tm9kZSA9IG5vZGU7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0UHJldmlvdXMobm9kZTogSk5vZGU8VD4pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnByZXZpb3VzTm9kZSA9IG5vZGU7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0TmV4dFNhdGlzZnlpbmcocHJlZGljYXRlOiAobm9kZTogVCkgPT4gYm9vbGVhbik6IEpOb2RlPFQ+IHwgbnVsbCB7XHJcbiAgICAgICAgbGV0IGN1cnJlbnQgPSB0aGlzLm5leHROb2RlO1xyXG4gICAgICAgIGNvbnN0IHN0YXJ0Tm9kZSA9IHRoaXM7XHJcbiAgICAgICAgd2hpbGUgKGN1cnJlbnQpIHtcclxuICAgICAgICAgICAgaWYgKHByZWRpY2F0ZShjdXJyZW50LnZhbHVlKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dE5vZGU7XHJcbiAgICAgICAgICAgIGlmIChjdXJyZW50ID09PSBzdGFydE5vZGUpIHtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFByZXZpb3VzU2F0aXNmeWluZyhwcmVkaWNhdGU6IChub2RlOiBUKSA9PiBib29sZWFuKTogSk5vZGU8VD4gfCBudWxsIHtcclxuICAgICAgICBsZXQgY3VycmVudCA9IHRoaXMucHJldmlvdXNOb2RlO1xyXG4gICAgICAgIGNvbnN0IHN0YXJ0Tm9kZSA9IHRoaXM7XHJcbiAgICAgICAgd2hpbGUgKGN1cnJlbnQgJiYgY3VycmVudCAhPT0gc3RhcnROb2RlKSB7XHJcbiAgICAgICAgICAgIGlmIChwcmVkaWNhdGUoY3VycmVudC52YWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LnByZXZpb3VzTm9kZTtcclxuICAgICAgICAgICAgaWYgKGN1cnJlbnQgPT09IHRoaXMpIHtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgQmFzZURvdWJseUxpbmtlZExpc3QgfSBmcm9tIFwiLi9CYXNlRG91Ymx5TGlua2VkTGlzdFwiO1xyXG5pbXBvcnQgeyBKTm9kZSB9IGZyb20gXCIuL0pOb2RlXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgQ2lyY3VsYXJEb3VibHlMaW5rZWRMaXN0PFQ+IGV4dGVuZHMgQmFzZURvdWJseUxpbmtlZExpc3Q8VD4ge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXBwZW5kKGVsZW1lbnQ6IFQpOiB2b2lkIHtcclxuXHJcbiAgICAgICAgY29uc3Qgbm9kZSA9IG5ldyBKTm9kZShlbGVtZW50LCB0aGlzKTtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLmhlYWQgfHwgIXRoaXMudGFpbCkge1xyXG5cclxuICAgICAgICAgICAgdGhpcy5oZWFkID0gbm9kZTtcclxuICAgICAgICAgICAgdGhpcy50YWlsID0gbm9kZTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuaGVhZC5zZXROZXh0KHRoaXMudGFpbCk7XHJcbiAgICAgICAgICAgIHRoaXMuaGVhZC5zZXRQcmV2aW91cyh0aGlzLnRhaWwpO1xyXG5cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBub2RlLnNldFByZXZpb3VzKHRoaXMudGFpbCk7XHJcbiAgICAgICAgICAgIG5vZGUuc2V0TmV4dCh0aGlzLmhlYWQpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy50YWlsLnNldE5leHQobm9kZSk7XHJcbiAgICAgICAgICAgIHRoaXMuaGVhZC5zZXRQcmV2aW91cyhub2RlKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMudGFpbCA9IG5vZGU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmxlbmd0aCsrO1xyXG4gICAgfVxyXG59IiwiZXhwb3J0IGNsYXNzIFNlcnZpY2VOb3RGb3VuZEV4Y2VwdGlvbiBleHRlbmRzIEVycm9yIHtcclxuICAgIGNvbnN0cnVjdG9yKHNlcnZpY2VLZXk6IHN0cmluZykge1xyXG4gICAgICAgIHN1cGVyKGBTZXJ2aWNlIG5vdCBmb3VuZDogJHtzZXJ2aWNlS2V5fWApO1xyXG4gICAgICAgIHRoaXMubmFtZSA9IFwiU2VydmljZU5vdEZvdW5kRXhjZXB0aW9uXCI7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBTZXJ2aWNlTm90Rm91bmRFeGNlcHRpb24gfSBmcm9tIFwiLi4vZXJyb3JzL1NlcnZpY2VOb3RGb3VuZEV4Y2VwdGlvblwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFNlcnZpY2VQcm92aWRlciB7XHJcbiAgICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZTogU2VydmljZVByb3ZpZGVyO1xyXG4gICAgcHJpdmF0ZSBzZXJ2aWNlczogTWFwPHN0cmluZywgYW55PiA9IG5ldyBNYXAoKTtcclxuXHJcbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKCkgeyB9XHJcblxyXG4gICAgc3RhdGljIGdldEluc3RhbmNlKCk6IFNlcnZpY2VQcm92aWRlciB7XHJcbiAgICAgICAgaWYgKCFTZXJ2aWNlUHJvdmlkZXIuaW5zdGFuY2UpIHtcclxuICAgICAgICAgICAgU2VydmljZVByb3ZpZGVyLmluc3RhbmNlID0gbmV3IFNlcnZpY2VQcm92aWRlcigpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gU2VydmljZVByb3ZpZGVyLmluc3RhbmNlO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEluc3RhbmNlT2Y8VD4oa2V5OiBzdHJpbmcpOiBUIHtcclxuICAgICAgICBjb25zdCBzZXJ2aWNlID0gdGhpcy5zZXJ2aWNlcy5nZXQoa2V5KTtcclxuICAgICAgICBpZiAoIXNlcnZpY2UpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZpY2VOb3RGb3VuZEV4Y2VwdGlvbihrZXkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gc2VydmljZSBhcyBUO1xyXG4gICAgfVxyXG5cclxuICAgIHJlZ2lzdGVyU2VydmljZTxUPihrZXk6IHN0cmluZywgaW5zdGFuY2U6IFQpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnNlcnZpY2VzLnNldChrZXksIGluc3RhbmNlKTtcclxuICAgIH1cclxuXHJcbiAgICByZWdpc3RlclNlcnZpY2VzKHNlcnZpY2VzOiBNYXA8c3RyaW5nLCBhbnk+KTogdm9pZCB7XHJcbiAgICAgICAgc2VydmljZXMuZm9yRWFjaCgoaW5zdGFuY2UsIGtleSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnJlZ2lzdGVyU2VydmljZShrZXksIGluc3RhbmNlKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICByZXNldCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnNlcnZpY2VzLmNsZWFyKCk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBRdWlja01lbnVTZWN0aW9uIH0gZnJvbSAnLi9RdWlja01lbnVTZWN0aW9uJztcbmltcG9ydCB7IFF1aWNrTWVudUVtcHR5IH0gZnJvbSAnLi9RdWlja01lbnVFbXB0eSc7XG5pbXBvcnQgeyBRdWlja01lbnVJdGVtIH0gZnJvbSAnLi9RdWlja01lbnVJdGVtJztcbmltcG9ydCB7IEJhc2VVSUNvbXBvbmVudCB9IGZyb20gJy4uL2NvbW1vbi9CYXNlVUlDb21wb25lbnQnO1xuaW1wb3J0IHsgQ2lyY3VsYXJEb3VibHlMaW5rZWRMaXN0IH0gZnJvbSAnLi4vLi4vY29tbW9uL0NpcmN1bGFyRG91Ymx5TGlua2VkTGlzdCc7XG5pbXBvcnQgeyBJQmxvY2tPcGVyYXRpb25zU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2Jsb2NrLW9wZXJhdGlvbnMvSUJsb2NrT3BlcmF0aW9uc1NlcnZpY2UnO1xuaW1wb3J0IHsgSk5vZGUgfSBmcm9tIFwiLi4vLi4vY29tbW9uL0pOb2RlXCI7XG5pbXBvcnQgeyBTZXJ2aWNlUHJvdmlkZXIgfSBmcm9tIFwiLi4vLi4vc2VydmljZXMvc2VydmljZS1wcm92aWRlci9TZXJ2aWNlUHJvdmlkZXJcIjtcblxuZXhwb3J0IGNsYXNzIFF1aWNrTWVudSBleHRlbmRzIEJhc2VVSUNvbXBvbmVudCB7XG5cbiAgICBzdGF0aWMgaWQgPSBcInF1aWNrTWVudVwiO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBibG9ja09wZXJhdGlvbnNTZXJ2aWNlOiBJQmxvY2tPcGVyYXRpb25zU2VydmljZTtcblxuICAgIHByaXZhdGUgY3VycmVudEZvY3VzZWRNZW51SXRlbTogSk5vZGU8UXVpY2tNZW51SXRlbT4gfCBudWxsO1xuICAgIHByaXZhdGUgaHRtbEZvY3VzZWRFbGVtZW50QmVmb3JlT3BlblF1aWNrTWVudTogSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgIHByaXZhdGUgbWVudVNlY3Rpb25zOiBDaXJjdWxhckRvdWJseUxpbmtlZExpc3Q8UXVpY2tNZW51U2VjdGlvbj47XG4gICAgcHJpdmF0ZSBxdWlja01lbnVFbXB0eTogUXVpY2tNZW51RW1wdHk7XG4gICAgcHJpdmF0ZSBmaWx0ZXJJbnB1dDogc3RyaW5nO1xuXG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IFF1aWNrTWVudSB8IG51bGw7XG5cbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge1xuXG4gICAgICAgIHN1cGVyKHt9KTtcblxuICAgICAgICB0aGlzLmJsb2NrT3BlcmF0aW9uc1NlcnZpY2UgPSBTZXJ2aWNlUHJvdmlkZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbnN0YW5jZU9mKFwiSUJsb2NrT3BlcmF0aW9uc1NlcnZpY2VcIik7XG4gICAgICAgIHRoaXMuY3VycmVudEZvY3VzZWRNZW51SXRlbSA9IG51bGw7XG4gICAgICAgIHRoaXMuaHRtbEZvY3VzZWRFbGVtZW50QmVmb3JlT3BlblF1aWNrTWVudSA9IG51bGw7XG4gICAgICAgIHRoaXMubWVudVNlY3Rpb25zID0gbmV3IENpcmN1bGFyRG91Ymx5TGlua2VkTGlzdDxRdWlja01lbnVTZWN0aW9uPigpO1xuICAgICAgICB0aGlzLnF1aWNrTWVudUVtcHR5ID0gbmV3IFF1aWNrTWVudUVtcHR5KCk7XG5cbiAgICAgICAgbGV0IGJsb2NrT3B0aW9ucyA9IHRoaXMuaHRtbEVsZW1lbnQucXVlcnlTZWxlY3RvcignLmJsb2NrLW9wdGlvbnMnKSBhcyBIVE1MRWxlbWVudDtcblxuICAgICAgICB0aGlzLnF1aWNrTWVudUVtcHR5LmRvY3VtZW50QXBwZW5kVG8oYmxvY2tPcHRpb25zKTtcbiAgICAgICAgdGhpcy5hdHRhY2hFdmVudHMoKTtcblxuICAgICAgICB0aGlzLmZpbHRlcklucHV0ID0gXCJcIjtcbiAgICB9XG5cbiAgICBpbml0KCk6IEhUTUxFbGVtZW50IHtcblxuICAgICAgICBjb25zdCBodG1sRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBodG1sRWxlbWVudC5pZCA9IFF1aWNrTWVudS5pZDtcblxuICAgICAgICBodG1sRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdibG9jay1vcHRpb25zLXdyYXBwZXInLCAnc29mdC1ib3gtc2hhZG93Jyk7XG4gICAgICAgIGh0bWxFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cbiAgICAgICAgY29uc3QgYmxvY2tPcHRpb25zID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIGJsb2NrT3B0aW9ucy5jbGFzc0xpc3QuYWRkKCdibG9jay1vcHRpb25zJyk7XG4gICAgICAgIGJsb2NrT3B0aW9ucy5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7XG5cbiAgICAgICAgaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQoYmxvY2tPcHRpb25zKTtcblxuICAgICAgICByZXR1cm4gaHRtbEVsZW1lbnQ7XG4gICAgfVxuXG4gICAgYXBwZW5kKG1lbnVJdGVtOiBRdWlja01lbnVTZWN0aW9uKTogdm9pZCB7XG4gICAgICAgIHRoaXMubWVudVNlY3Rpb25zLmFwcGVuZChtZW51SXRlbSk7XG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQucXVlcnlTZWxlY3RvcignLmJsb2NrLW9wdGlvbnMnKSEuYXBwZW5kQ2hpbGQobWVudUl0ZW0uaHRtbEVsZW1lbnQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0SW5zdGFuY2UoKTogUXVpY2tNZW51IHtcbiAgICAgICAgaWYgKCFRdWlja01lbnUuaW5zdGFuY2UpIHtcbiAgICAgICAgICAgIFF1aWNrTWVudS5pbnN0YW5jZSA9IG5ldyBRdWlja01lbnUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBRdWlja01lbnUuaW5zdGFuY2U7XG4gICAgfVxuXG4gICAgc3dpdGNoVmlzdWFsRm9jdXMoaXRlbTogSk5vZGU8UXVpY2tNZW51SXRlbT4pOiB2b2lkIHtcblxuICAgICAgICBpZiAodGhpcy5jdXJyZW50Rm9jdXNlZE1lbnVJdGVtID09IGl0ZW0pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRGb2N1c2VkTWVudUl0ZW0pIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudEZvY3VzZWRNZW51SXRlbS52YWx1ZS5yZW1vdmVGb2N1cygpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jdXJyZW50Rm9jdXNlZE1lbnVJdGVtID0gaXRlbTtcbiAgICAgICAgdGhpcy5jdXJyZW50Rm9jdXNlZE1lbnVJdGVtLnZhbHVlLmZvY3VzKCk7XG5cbiAgICAgICAgdGhpcy5odG1sRm9jdXNlZEVsZW1lbnRCZWZvcmVPcGVuUXVpY2tNZW51Py5mb2N1cygpO1xuICAgIH1cblxuICAgIGZvY3VzT25UaGVGaXJzdFZpc2libGVJdGVtKCk6IHZvaWQge1xuXG4gICAgICAgIGNvbnN0IGZpcnN0U2VjdGlvbk5vZGU6IEpOb2RlPFF1aWNrTWVudVNlY3Rpb24+IHwgbnVsbCA9IHRoaXMubWVudVNlY3Rpb25zLmdldEZpcnN0KCk7XG5cbiAgICAgICAgbGV0IGN1cnJlbnRTZWN0aW9uTm9kZTogSk5vZGU8UXVpY2tNZW51U2VjdGlvbj4gfCBudWxsID0gZmlyc3RTZWN0aW9uTm9kZTtcblxuICAgICAgICB3aGlsZSAoY3VycmVudFNlY3Rpb25Ob2RlKSB7XG5cbiAgICAgICAgICAgIGNvbnN0IGl0ZW1Ob2RlOiBKTm9kZTxRdWlja01lbnVJdGVtPiB8IG51bGwgPSBjdXJyZW50U2VjdGlvbk5vZGUudmFsdWUubWVudUl0ZW1zLmZpbmRGaXJzdChpdGVtID0+IGl0ZW0uaXNWaXNpYmxlKTtcblxuICAgICAgICAgICAgaWYgKGl0ZW1Ob2RlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zd2l0Y2hWaXN1YWxGb2N1cyhpdGVtTm9kZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjdXJyZW50U2VjdGlvbk5vZGUgPSBjdXJyZW50U2VjdGlvbk5vZGUubmV4dE5vZGU7XG5cbiAgICAgICAgICAgIGlmIChjdXJyZW50U2VjdGlvbk5vZGUgPT0gZmlyc3RTZWN0aW9uTm9kZSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZvY3VzUHJldmlvdXNWaXNpYmxlSXRlbSgpOiB2b2lkIHtcblxuICAgICAgICBsZXQgcHJldmlvdXNWaXNpYmxlSXRlbTogSk5vZGU8UXVpY2tNZW51SXRlbT4gfCBudWxsO1xuXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRGb2N1c2VkTWVudUl0ZW0pIHtcbiAgICAgICAgICAgIHByZXZpb3VzVmlzaWJsZUl0ZW0gPSB0aGlzLmN1cnJlbnRGb2N1c2VkTWVudUl0ZW0uZ2V0UHJldmlvdXNTYXRpc2Z5aW5nKGl0ZW0gPT4gaXRlbS5pc1Zpc2libGUpO1xuICAgICAgICAgICAgaWYgKCFwcmV2aW91c1Zpc2libGVJdGVtKSB7XG5cbiAgICAgICAgICAgICAgICBsZXQgcHJldmlvdXNWaXNpYmxlU2VjdGlvbk5vZGU6IEpOb2RlPFF1aWNrTWVudVNlY3Rpb24+IHwgbnVsbCA9IHRoaXMubWVudVNlY3Rpb25zLmZpbmQodGhpcy5jdXJyZW50Rm9jdXNlZE1lbnVJdGVtLnZhbHVlLnF1aWNrTWVudVNlY3Rpb25JbnN0YW5jZSkhLmdldFByZXZpb3VzU2F0aXNmeWluZyhzZWN0aW9uID0+IHNlY3Rpb24uaXNWaXNpYmxlKTtcblxuICAgICAgICAgICAgICAgIGlmICghcHJldmlvdXNWaXNpYmxlU2VjdGlvbk5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwcmV2aW91c1Zpc2libGVJdGVtID0gcHJldmlvdXNWaXNpYmxlU2VjdGlvbk5vZGUudmFsdWUubWVudUl0ZW1zLmZpbmRMYXN0KGl0ZW0gPT4gaXRlbS5pc1Zpc2libGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IGxhc3RWaXNpYmxlU2VjdGlvbk5vZGU6IEpOb2RlPFF1aWNrTWVudVNlY3Rpb24+IHwgbnVsbCA9IHRoaXMubWVudVNlY3Rpb25zLmZpbmRMYXN0KHNlY3Rpb24gPT4gc2VjdGlvbi5pc1Zpc2libGUpO1xuXG4gICAgICAgICAgICBpZiAoIWxhc3RWaXNpYmxlU2VjdGlvbk5vZGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwcmV2aW91c1Zpc2libGVJdGVtID0gbGFzdFZpc2libGVTZWN0aW9uTm9kZS52YWx1ZS5tZW51SXRlbXMuZmluZExhc3QoaXRlbSA9PiBpdGVtLmlzVmlzaWJsZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zd2l0Y2hWaXN1YWxGb2N1cyhwcmV2aW91c1Zpc2libGVJdGVtISk7XG4gICAgfVxuXG4gICAgZm9jdXNOZXh0VmlzaWJsZUl0ZW0oKTogdm9pZCB7XG5cbiAgICAgICAgbGV0IG5leHRWaXNpYmxlSXRlbTogSk5vZGU8UXVpY2tNZW51SXRlbT4gfCBudWxsO1xuXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRGb2N1c2VkTWVudUl0ZW0pIHtcbiAgICAgICAgICAgIG5leHRWaXNpYmxlSXRlbSA9IHRoaXMuY3VycmVudEZvY3VzZWRNZW51SXRlbS5nZXROZXh0U2F0aXNmeWluZyhpdGVtID0+IGl0ZW0uaXNWaXNpYmxlKTtcbiAgICAgICAgICAgIGlmICghbmV4dFZpc2libGVJdGVtKSB7XG5cbiAgICAgICAgICAgICAgICBsZXQgbmV4dFZpc2libGVTZWN0aW9uTm9kZTogSk5vZGU8UXVpY2tNZW51U2VjdGlvbj4gfCBudWxsID0gdGhpcy5tZW51U2VjdGlvbnMuZmluZCh0aGlzLmN1cnJlbnRGb2N1c2VkTWVudUl0ZW0udmFsdWUucXVpY2tNZW51U2VjdGlvbkluc3RhbmNlKSEuZ2V0TmV4dFNhdGlzZnlpbmcoc2VjdGlvbiA9PiBzZWN0aW9uLmlzVmlzaWJsZSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoIW5leHRWaXNpYmxlU2VjdGlvbk5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBuZXh0VmlzaWJsZUl0ZW0gPSBuZXh0VmlzaWJsZVNlY3Rpb25Ob2RlLnZhbHVlLm1lbnVJdGVtcy5maW5kRmlyc3QoaXRlbSA9PiBpdGVtLmlzVmlzaWJsZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBmaXJzdFZpc2libGVTZWN0aW9uTm9kZTogbnVsbCB8IEpOb2RlPFF1aWNrTWVudVNlY3Rpb24+ID0gdGhpcy5tZW51U2VjdGlvbnMuZmluZEZpcnN0KHNlY3Rpb24gPT4gc2VjdGlvbi5pc1Zpc2libGUpO1xuICAgICAgICAgICAgaWYgKCFmaXJzdFZpc2libGVTZWN0aW9uTm9kZSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5leHRWaXNpYmxlSXRlbSA9IGZpcnN0VmlzaWJsZVNlY3Rpb25Ob2RlLnZhbHVlLm1lbnVJdGVtcy5maW5kRmlyc3QoaXRlbSA9PiBpdGVtLmlzVmlzaWJsZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnN3aXRjaFZpc3VhbEZvY3VzKG5leHRWaXNpYmxlSXRlbSEpO1xuICAgIH1cblxuICAgIGZpbHRlckl0ZW1zKCk6IHZvaWQge1xuXG4gICAgICAgIHRoaXMubWVudVNlY3Rpb25zLmZvckVhY2goc2VjdGlvbiA9PiB7XG4gICAgICAgICAgICBzZWN0aW9uLmZpbHRlclNlY3Rpb24odGhpcy5maWx0ZXJJbnB1dCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICghdGhpcy5tZW51U2VjdGlvbnMuYW55KHNlY3Rpb24gPT4gc2VjdGlvbi5pc1Zpc2libGUpKSB7XG4gICAgICAgICAgICB0aGlzLnF1aWNrTWVudUVtcHR5LnNob3coKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucXVpY2tNZW51RW1wdHkuaGlkZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5mb2N1c09uVGhlRmlyc3RWaXNpYmxlSXRlbSgpO1xuICAgIH1cblxuICAgIHNob3coKSB7XG5cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG5cbiAgICAgICAgICAgIHRoaXMuaHRtbEZvY3VzZWRFbGVtZW50QmVmb3JlT3BlblF1aWNrTWVudSA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5odG1sRm9jdXNlZEVsZW1lbnRCZWZvcmVPcGVuUXVpY2tNZW51KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRmFpbGVkIHRvIGNhcHR1cmUgdGhlIGZvY3VzZWQgZWxlbWVudCBiZWZvcmUgZGlzcGxheWluZyB0aGUgUXVpY2tNZW51LiBFbnN1cmUgYW4gZWxlbWVudCBpcyBmb2N1c2VkLlwiKTtcbiAgICAgICAgICAgIH1cblxuXG4gICAgICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gICAgXG4gICAgICAgICAgICBpZiAoIXNlbGVjdGlvbiB8fCBzZWxlY3Rpb24ucmFuZ2VDb3VudCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTmVuaHVtYSBzZWxlw6fDo28gZW5jb250cmFkYScpO1xuICAgICAgICAgICAgfVxuICAgIFxuICAgICAgICAgICAgY29uc3QgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcbiAgICAgICAgICAgIGNvbnN0IHJlY3QgPSByYW5nZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBcbiAgICAgICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgICBcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRXaWR0aCA9IHRoaXMuaHRtbEVsZW1lbnQub2Zmc2V0V2lkdGg7XG4gICAgICAgICAgICBsZXQgbGVmdFBvc2l0aW9uID0gcmVjdC5sZWZ0ICsgd2luZG93LnNjcm9sbFg7XG4gICAgXG4gICAgICAgICAgICBpZiAobGVmdFBvc2l0aW9uICsgZWxlbWVudFdpZHRoID4gd2luZG93LmlubmVyV2lkdGgpIHtcbiAgICAgICAgICAgICAgICBsZWZ0UG9zaXRpb24gPSB3aW5kb3cuaW5uZXJXaWR0aCAtIGVsZW1lbnRXaWR0aCAtIDIwO1xuICAgICAgICAgICAgfVxuICAgIFxuICAgICAgICAgICAgY29uc3QgZWxlbWVudEhlaWdodCA9IHRoaXMuaHRtbEVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xuICAgICAgICAgICAgbGV0IHRvcFBvc2l0aW9uID0gcmVjdC50b3AgKyB3aW5kb3cuc2Nyb2xsWSAtIGVsZW1lbnRIZWlnaHQgLSAxMDtcbiAgICBcbiAgICAgICAgICAgIGlmICh0b3BQb3NpdGlvbiA8IDApIHtcbiAgICAgICAgICAgICAgICB0b3BQb3NpdGlvbiA9IHJlY3QuYm90dG9tICsgd2luZG93LnNjcm9sbFkgKyAxMDtcbiAgICAgICAgICAgIH1cbiAgICBcbiAgICAgICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUubGVmdCA9IGAke2xlZnRQb3NpdGlvbn1weGA7XG4gICAgICAgICAgICB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLnRvcCA9IGAke3RvcFBvc2l0aW9ufXB4YDtcblxuICAgICAgICAgICAgc3VwZXIuc2hvdygpO1xuXG4gICAgICAgICAgICB0aGlzLmZvY3VzT25UaGVGaXJzdFZpc2libGVJdGVtKCk7XG4gICAgICAgICAgICB0aGlzLmh0bWxGb2N1c2VkRWxlbWVudEJlZm9yZU9wZW5RdWlja01lbnUuZm9jdXMoKTtcblxuICAgICAgICB9LCAxMCk7XG5cbiAgICB9XG5cbiAgICByZXN0b3JlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmZpbHRlcklucHV0ID0gXCJcIjtcblxuICAgICAgICB0aGlzLm1lbnVTZWN0aW9ucy5mb3JFYWNoKHNlY3Rpb24gPT4ge1xuICAgICAgICAgICAgc2VjdGlvbi5yZXN0b3JlKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGhpZGUoKSB7XG5cbiAgICAgICAgdGhpcy5yZXN0b3JlKCk7XG4gICAgICAgIHRoaXMuaHRtbEZvY3VzZWRFbGVtZW50QmVmb3JlT3BlblF1aWNrTWVudT8uZm9jdXMoKTtcblxuICAgICAgICBzdXBlci5oaWRlKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhdHRhY2hFdmVudHMoKSB7XG5cbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChldmVudDogS2V5Ym9hcmRFdmVudCkgPT4ge1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNWaXNpYmxlICYmIGV2ZW50LmtleSA9PT0gJy8nICYmICFldmVudC5jdHJsS2V5ICYmICFldmVudC5zaGlmdEtleSAmJiAhZXZlbnQuYWx0S2V5KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zaG93KCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNWaXNpYmxlICYmIGV2ZW50LmtleSA9PT0gJ0Fycm93TGVmdCcgJiYgIWV2ZW50LmN0cmxLZXkgJiYgIWV2ZW50LnNoaWZ0S2V5ICYmICFldmVudC5hbHRLZXkpIHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzVmlzaWJsZSAmJiBldmVudC5rZXkgPT09ICdBcnJvd1JpZ2h0JyAmJiAhZXZlbnQuY3RybEtleSAmJiAhZXZlbnQuc2hpZnRLZXkgJiYgIWV2ZW50LmFsdEtleSkge1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLmlzVmlzaWJsZSAmJiBldmVudC5rZXkgPT09ICdBcnJvd0Rvd24nICYmICFldmVudC5jdHJsS2V5ICYmICFldmVudC5zaGlmdEtleSAmJiAhZXZlbnQuYWx0S2V5KSB7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmZvY3VzTmV4dFZpc2libGVJdGVtKCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNWaXNpYmxlICYmIGV2ZW50LmtleSA9PT0gJ0Fycm93VXAnICYmICFldmVudC5jdHJsS2V5ICYmICFldmVudC5zaGlmdEtleSAmJiAhZXZlbnQuYWx0S2V5KSB7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmZvY3VzUHJldmlvdXNWaXNpYmxlSXRlbSgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzVmlzaWJsZSAmJiAvXlthLXowLTkgXSQvaS50ZXN0KGV2ZW50LmtleSkgJiYgIWV2ZW50LmN0cmxLZXkgJiYgIWV2ZW50LnNoaWZ0S2V5ICYmICFldmVudC5hbHRLZXkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmNhdEZpbHRlcklucHV0KGV2ZW50LmtleSk7XG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJJdGVtcygpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzVmlzaWJsZSAmJiBldmVudC5rZXkgPT09ICdCYWNrc3BhY2UnKSB7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5maWx0ZXJJbnB1dCA9PSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlTGFzdEZpbHRlcklucHV0Q2hhcmFjdGVyKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVySXRlbXMoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNWaXNpYmxlICYmIGV2ZW50LmtleSA9PT0gJ0VzY2FwZScgJiYgIWV2ZW50LmN0cmxLZXkgJiYgIWV2ZW50LnNoaWZ0S2V5ICYmICFldmVudC5hbHRLZXkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhpZGUoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnRW50ZXInICYmIHRoaXMuaXNWaXNpYmxlICYmICFldmVudC5jdHJsS2V5ICYmICFldmVudC5zaGlmdEtleSAmJiAhZXZlbnQuYWx0S2V5KSB7XG5cbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgICAgICAgICAgICAgbGV0IGRhdGFUeXBlID0gdGhpcy5jdXJyZW50Rm9jdXNlZE1lbnVJdGVtIS52YWx1ZS5odG1sRWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtdHlwZScpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGRhdGFUeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHJhbnNmb3JtSHRtbEZvY3VzZWRFbGVtZW50QmVmb3JlT3BlblF1aWNrTWVudShkYXRhVHlwZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNWaXNpYmxlICYmICEoZXZlbnQudGFyZ2V0ISBhcyBIVE1MRWxlbWVudCkuY2xvc2VzdChgIyR7dGhpcy5odG1sRWxlbWVudC5pZH1gKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGV2ZW50KSA9PiB7XG5cbiAgICAgICAgICAgIGlmIChldmVudC5rZXkgPT09ICdFbnRlcicgJiYgdGhpcy5pc1Zpc2libGUpIHtcblxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBibG9ja1R5cGUgPSB0aGlzLmN1cnJlbnRGb2N1c2VkTWVudUl0ZW0/LnZhbHVlLmJsb2NrVHlwZTtcblxuICAgICAgICAgICAgICAgIGlmIChibG9ja1R5cGUpIHtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRyYW5zZm9ybUh0bWxGb2N1c2VkRWxlbWVudEJlZm9yZU9wZW5RdWlja01lbnUoYmxvY2tUeXBlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgdHJhbnNmb3JtSHRtbEZvY3VzZWRFbGVtZW50QmVmb3JlT3BlblF1aWNrTWVudShibG9ja1R5cGU6IHN0cmluZyk6IHZvaWQge1xuXG4gICAgICAgIGxldCBlbGVtZW50ID0gdGhpcy5odG1sRm9jdXNlZEVsZW1lbnRCZWZvcmVPcGVuUXVpY2tNZW51Py5jbG9zZXN0KCcuYmxvY2snKSBhcyBIVE1MRWxlbWVudDtcblxuICAgICAgICBpZiAoZWxlbWVudCAmJiBibG9ja1R5cGUpIHtcbiAgICAgICAgICAgIHRoaXMuYmxvY2tPcGVyYXRpb25zU2VydmljZS5mb3JtYXRCbG9jayhlbGVtZW50LCBibG9ja1R5cGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjb25jYXRGaWx0ZXJJbnB1dChzdGc6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLmZpbHRlcklucHV0ICs9IHN0Zy50b0xvd2VyQ2FzZSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVtb3ZlTGFzdEZpbHRlcklucHV0Q2hhcmFjdGVyKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5maWx0ZXJJbnB1dC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmZpbHRlcklucHV0ID0gdGhpcy5maWx0ZXJJbnB1dC5zbGljZSgwLCAtMSk7XG4gICAgICAgIH1cbiAgICB9XG59IiwiaW1wb3J0IHsgQmFzZURvdWJseUxpbmtlZExpc3QgfSBmcm9tICcuL0Jhc2VEb3VibHlMaW5rZWRMaXN0JztcclxuaW1wb3J0IHsgSk5vZGUgfSBmcm9tICcuL0pOb2RlJztcclxuXHJcbmV4cG9ydCBjbGFzcyBEb3VibHlMaW5rZWRMaXN0PFQ+IGV4dGVuZHMgQmFzZURvdWJseUxpbmtlZExpc3Q8VD4ge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXBwZW5kKGVsZW1lbnQ6IFQpOiB2b2lkIHtcclxuXHJcbiAgICAgICAgY29uc3Qgbm9kZSA9IG5ldyBKTm9kZShlbGVtZW50LCB0aGlzKTtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLmhlYWQgfHwgIXRoaXMudGFpbCkge1xyXG4gICAgICAgICAgICB0aGlzLmhlYWQgPSBub2RlO1xyXG4gICAgICAgICAgICB0aGlzLnRhaWwgPSBub2RlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMudGFpbC5zZXROZXh0KG5vZGUpO1xyXG4gICAgICAgICAgICBub2RlLnNldFByZXZpb3VzKHRoaXMudGFpbCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnRhaWwgPSBub2RlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5sZW5ndGgrKztcclxuICAgIH1cclxufSIsImltcG9ydCB7IFF1aWNrTWVudSB9IGZyb20gJy4vUXVpY2tNZW51JztcclxuaW1wb3J0IHsgUXVpY2tNZW51SXRlbSB9IGZyb20gXCIuL1F1aWNrTWVudUl0ZW1cIjtcclxuaW1wb3J0IHsgRG91Ymx5TGlua2VkTGlzdCB9IGZyb20gJy4uLy4uL2NvbW1vbi9Eb3VibHlMaW5rZWRMaXN0JztcclxuaW1wb3J0IHsgQmFzZVVJQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tbW9uL0Jhc2VVSUNvbXBvbmVudCc7XHJcblxyXG5leHBvcnQgY2xhc3MgUXVpY2tNZW51U2VjdGlvbiBleHRlbmRzIEJhc2VVSUNvbXBvbmVudCB7XHJcblxyXG4gICAgcXVpY2tNZW51SW5zdGFuY2U6IFF1aWNrTWVudTtcclxuXHJcbiAgICBtZW51SXRlbXMgPSBuZXcgRG91Ymx5TGlua2VkTGlzdDxRdWlja01lbnVJdGVtPigpO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFF1aWNrTWVudVNlY3Rpb25PcHRpb25zKSB7XHJcblxyXG4gICAgICAgIHN1cGVyKHtcclxuICAgICAgICAgICAgdGl0bGU6IG9wdGlvbnMudGl0bGUsXHJcbiAgICAgICAgICAgIGNsYXNzTGlzdDogb3B0aW9ucy5jbGFzc0xpc3RcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5xdWlja01lbnVJbnN0YW5jZSA9IG9wdGlvbnMucXVpY2tNZW51SW5zdGFuY2U7XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdCgpOiBIVE1MRWxlbWVudCB7XHJcblxyXG4gICAgICAgIGNvbnN0IGh0bWxFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2VjdGlvbicpO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LmNsYXNzTGlzdC5hZGQodGhpcy5wcm9wcy5jbGFzc0xpc3QpO1xyXG5cclxuICAgICAgICBjb25zdCBoZWFkaW5nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaDInKTtcclxuICAgICAgICBoZWFkaW5nLnRleHRDb250ZW50ID0gdGhpcy5wcm9wcy50aXRsZTtcclxuXHJcbiAgICAgICAgaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQoaGVhZGluZyk7XHJcblxyXG4gICAgICAgIHJldHVybiBodG1sRWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICBhcHBlbmRRdWlja01lbnVJdGVtcyhtZW51SXRlbXM6IFF1aWNrTWVudUl0ZW1bXSk6IHZvaWQge1xyXG5cclxuICAgICAgICBtZW51SXRlbXMuZm9yRWFjaChpdGVtID0+IHtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kUXVpY2tNZW51SXRlbShpdGVtKVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGFwcGVuZFF1aWNrTWVudUl0ZW0obWVudUl0ZW06IFF1aWNrTWVudUl0ZW0pOiB2b2lkIHtcclxuXHJcbiAgICAgICAgdGhpcy5tZW51SXRlbXMuYXBwZW5kKG1lbnVJdGVtKTtcclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LmFwcGVuZENoaWxkKG1lbnVJdGVtLmh0bWxFbGVtZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBmaWx0ZXJTZWN0aW9uKHRleHQ6IHN0cmluZyk6IHZvaWQge1xyXG5cclxuICAgICAgICB0aGlzLnJlc3RvcmUoKTtcclxuXHJcbiAgICAgICAgaWYgKHRleHQgIT09IFwiXCIpIHtcclxuICAgICAgICAgICAgdGhpcy5tZW51SXRlbXMuZm9yRWFjaChtZW51SXRlbSA9PiB7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKCEobWVudUl0ZW0uZmlsdGVyVmFsdWUudG9Mb2NhbGVMb3dlckNhc2UoKS5pbmNsdWRlcyh0ZXh0KSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBtZW51SXRlbS5oaWRlKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgbGV0IGF0TGVhZE9uZUl0ZW0gPSB0aGlzLm1lbnVJdGVtcy5hbnkoaXRlbSA9PiBpdGVtLmZpbHRlclZhbHVlLnRvTG9jYWxlTG93ZXJDYXNlKCkuaW5jbHVkZXModGV4dCkpO1xyXG5cclxuICAgICAgICAgICAgaWYgKCFhdExlYWRPbmVJdGVtKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhpZGUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXN0b3JlKCkge1xyXG4gICAgICAgIHRoaXMuc2hvdygpO1xyXG5cclxuICAgICAgICB0aGlzLm1lbnVJdGVtcy5mb3JFYWNoKG1lbnVJdGVtID0+IHtcclxuICAgICAgICAgICAgbWVudUl0ZW0uc2hvdygpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFF1aWNrTWVudVNlY3Rpb25PcHRpb25zIHtcclxuICAgIHF1aWNrTWVudUluc3RhbmNlOiBRdWlja01lbnU7XHJcbiAgICB0aXRsZTogc3RyaW5nO1xyXG4gICAgY2xhc3NMaXN0OiBzdHJpbmc7XHJcbn0iLCIvLyBpbXBvcnQgQmFzZVVJQ29tcG9uZW50IGZyb20gXCIuL0Jhc2VVSUNvbXBvbmVudFwiO1xyXG5cclxuaW1wb3J0IHsgQmFzZVVJQ29tcG9uZW50IH0gZnJvbSBcIi4vQmFzZVVJQ29tcG9uZW50XCI7XHJcblxyXG5leHBvcnQgY2xhc3MgU1ZHSWNvbiBleHRlbmRzIEJhc2VVSUNvbXBvbmVudCB7XHJcblxyXG4gICAgdXNlRWxlbWVudDogU1ZHVXNlRWxlbWVudDtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihocmVmVXNlSWQ6IHN0cmluZywgd2lkdGggPSBcIjFyZW1cIiwgaGVpZ2h0ID0gXCIxcmVtXCIpIHtcclxuXHJcbiAgICAgICAgc3VwZXIoe1xyXG4gICAgICAgICAgICBocmVmVXNlSWQ6IGhyZWZVc2VJZCxcclxuICAgICAgICAgICAgd2lkdGg6IHdpZHRoLFxyXG4gICAgICAgICAgICBoZWlnaHQ6IGhlaWdodCxcclxuXHJcbiAgICAgICAgfSlcclxuXHJcbiAgICAgICAgdGhpcy51c2VFbGVtZW50ID0gdGhpcy5odG1sRWxlbWVudC5xdWVyeVNlbGVjdG9yKCd1c2UnKSBhcyBTVkdVc2VFbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIGluaXQoKTogSFRNTEVsZW1lbnQge1xyXG5cclxuICAgICAgICBjb25zdCBodG1sRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsIFwic3ZnXCIpO1xyXG5cclxuICAgICAgICBodG1sRWxlbWVudC5zdHlsZS5jb2xvciA9IFwicmdiYSg1NSwgNTMsIDQ3LCAwLjg1KVwiO1xyXG5cclxuICAgICAgICBsZXQgdXNlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiwgXCJ1c2VcIik7XHJcbiAgICAgICAgdXNlLnNldEF0dHJpYnV0ZU5TKFwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiLCBcImhyZWZcIiwgYCMke3RoaXMucHJvcHMuaHJlZlVzZUlkfWApO1xyXG5cclxuICAgICAgICBodG1sRWxlbWVudC5hcHBlbmRDaGlsZCh1c2UpO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LnNldEF0dHJpYnV0ZSgnd2lkdGgnLCB0aGlzLnByb3BzLndpZHRoKTtcclxuICAgICAgICBodG1sRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsIHRoaXMucHJvcHMuaGVpZ2h0KTtcclxuICAgICAgICBodG1sRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2ZpbGwnLCAnY3VycmVudENvbG9yJyk7XHJcblxyXG4gICAgICAgIHJldHVybiBodG1sRWxlbWVudCBhcyB1bmtub3duIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIGNsb25lKCk6IFNWR0ljb24ge1xyXG4gICAgICAgIHJldHVybiBuZXcgU1ZHSWNvbih0aGlzLnByb3BzLmhyZWZVc2VJZCwgdGhpcy5wcm9wcy53aWR0aCwgdGhpcy5wcm9wcy5oZWlnaHQpO1xyXG4gICAgfVxyXG5cclxuICAgIHNldFVzZVRvKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnVzZUVsZW1lbnQuc2V0QXR0cmlidXRlTlMoXCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIsIFwiaHJlZlwiLCBgIyR7dmFsdWV9YCk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBTVkdJY29uIH0gZnJvbSAnLi4vY29tbW9uL1NWR0ljb24nO1xyXG5pbXBvcnQgeyBCYXNlVUlDb21wb25lbnQgfSBmcm9tICcuLi9jb21tb24vQmFzZVVJQ29tcG9uZW50JztcclxuaW1wb3J0IHsgSk5vZGUgfSBmcm9tIFwiLi4vLi4vY29tbW9uL0pOb2RlXCI7XHJcbmltcG9ydCB7IFF1aWNrTWVudVNlY3Rpb24gfSBmcm9tICcuL1F1aWNrTWVudVNlY3Rpb24nO1xyXG5cclxuZXhwb3J0IGNsYXNzIFF1aWNrTWVudUl0ZW0gZXh0ZW5kcyBCYXNlVUlDb21wb25lbnQge1xyXG5cclxuICAgIHJlYWRvbmx5IGJsb2NrVHlwZTogc3RyaW5nO1xyXG5cclxuICAgIHJlYWRvbmx5IHRpdGxlOiBzdHJpbmc7XHJcbiAgICByZWFkb25seSBmaWx0ZXJWYWx1ZTogc3RyaW5nO1xyXG4gICAgcmVhZG9ubHkgZGVzY3JpcHRpb246IHN0cmluZztcclxuXHJcbiAgICBxdWlja01lbnVTZWN0aW9uSW5zdGFuY2U6IFF1aWNrTWVudVNlY3Rpb247XHJcblxyXG4gICAgY29uc3RydWN0b3IocXVpY2tNZW51U2VjdGlvbkluc3RhbmNlOiBRdWlja01lbnVTZWN0aW9uLCB0aXRsZTogc3RyaW5nLCBkZXNjcmlwdGlvbjogc3RyaW5nLCBTVkdIcmVmVXNlSWQ6IHN0cmluZywgYmxvY2tUeXBlOiBzdHJpbmcsIGZpbHRlclZhbHVlOiBzdHJpbmcpIHtcclxuXHJcbiAgICAgICAgc3VwZXIoe1xyXG4gICAgICAgICAgICB0aXRsZTogdGl0bGUsXHJcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBkZXNjcmlwdGlvbixcclxuICAgICAgICAgICAgU1ZHSHJlZlVzZUlkOiBTVkdIcmVmVXNlSWRcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5ibG9ja1R5cGUgPSBibG9ja1R5cGU7XHJcbiAgICAgICAgdGhpcy50aXRsZSA9IHRpdGxlO1xyXG4gICAgICAgIHRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcclxuICAgICAgICB0aGlzLmZpbHRlclZhbHVlID0gZmlsdGVyVmFsdWU7XHJcblxyXG4gICAgICAgIHRoaXMucXVpY2tNZW51U2VjdGlvbkluc3RhbmNlID0gcXVpY2tNZW51U2VjdGlvbkluc3RhbmNlO1xyXG5cclxuICAgICAgICB0aGlzLmJsb2NrVHlwZSA9IGJsb2NrVHlwZTtcclxuXHJcbiAgICAgICAgdGhpcy5hdHRhY2hFdmVudHMoKTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0KCk6IEhUTUxFbGVtZW50IHtcclxuXHJcbiAgICAgICAgY29uc3QgaHRtbEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgICBodG1sRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdvcHRpb24nLCAnb3B0aW9uLWhvdmVyJywgJ2Jsb2NrLW9wZXJhdGlvbicpO1xyXG5cclxuICAgICAgICBodG1sRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2RhdGEtYmxvY2stb3BlcmF0aW9uJywgJ2FwcGx5LXNlbGVjdGVkLWJsb2NrLXR5cGUnKTtcclxuICAgICAgICBodG1sRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJzAnKTtcclxuICAgICAgICBodG1sRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCAnb3B0aW9uJyk7XHJcblxyXG5cclxuICAgICAgICBjb25zdCBvcHRpb25JbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgIG9wdGlvbkltYWdlLmNsYXNzTGlzdC5hZGQoJ29wdGlvbi1pbWFnZScpO1xyXG5cclxuICAgICAgICBjb25zdCBzdmcgPSBuZXcgU1ZHSWNvbih0aGlzLnByb3BzLlNWR0hyZWZVc2VJZCwgJzEwMCUnLCAnMTAwJScpO1xyXG5cclxuICAgICAgICBvcHRpb25JbWFnZS5hcHBlbmRDaGlsZChzdmcuaHRtbEVsZW1lbnQpO1xyXG5cclxuICAgICAgICBodG1sRWxlbWVudC5hcHBlbmRDaGlsZChvcHRpb25JbWFnZSk7XHJcblxyXG4gICAgICAgIGNvbnN0IG9wdGlvblRleHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgICBvcHRpb25UZXh0LmNsYXNzTGlzdC5hZGQoJ29wdGlvbi10ZXh0Jyk7XHJcblxyXG4gICAgICAgIGNvbnN0IGJsb2NrVGl0bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdwJyk7XHJcbiAgICAgICAgYmxvY2tUaXRsZS5jbGFzc0xpc3QuYWRkKCdibG9jay10aXRsZScpO1xyXG4gICAgICAgIGJsb2NrVGl0bGUuaW5uZXJUZXh0ID0gdGhpcy5wcm9wcy50aXRsZTtcclxuXHJcbiAgICAgICAgb3B0aW9uVGV4dC5hcHBlbmRDaGlsZChibG9ja1RpdGxlKTtcclxuXHJcbiAgICAgICAgY29uc3QgYmxvY2tEZXNjcmlwdGlvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3AnKTtcclxuICAgICAgICBibG9ja0Rlc2NyaXB0aW9uLmNsYXNzTGlzdC5hZGQoJ2Jsb2NrLWRlc2NyaXB0aW9uJyk7XHJcbiAgICAgICAgYmxvY2tEZXNjcmlwdGlvbi5pbm5lclRleHQgPSB0aGlzLnByb3BzLmRlc2NyaXB0aW9uO1xyXG5cclxuXHJcbiAgICAgICAgb3B0aW9uVGV4dC5hcHBlbmRDaGlsZChibG9ja0Rlc2NyaXB0aW9uKTtcclxuXHJcbiAgICAgICAgaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQob3B0aW9uVGV4dCk7XHJcblxyXG4gICAgICAgIHJldHVybiBodG1sRWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgZGlzcGxheSgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiAnZmxleCc7XHJcbiAgICB9XHJcblxyXG4gICAgZm9jdXMoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdvcHRpb24tZm9jdXNlZCcpO1xyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuZm9jdXMoKTtcclxuICAgIH1cclxuXHJcbiAgICByZW1vdmVGb2N1cygpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ29wdGlvbi1mb2N1c2VkJyk7XHJcbiAgICB9XHJcblxyXG4gICAgYXR0YWNoRXZlbnRzKCk6IHZvaWQge1xyXG5cclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsICgpID0+IHtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IG5vZGU6IEpOb2RlPFF1aWNrTWVudUl0ZW0+ID0gdGhpcy5xdWlja01lbnVTZWN0aW9uSW5zdGFuY2UubWVudUl0ZW1zLmZpbmQodGhpcykhO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5xdWlja01lbnVTZWN0aW9uSW5zdGFuY2UucXVpY2tNZW51SW5zdGFuY2Uuc3dpdGNoVmlzdWFsRm9jdXMobm9kZSEpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGV2ZW50KSA9PiB7XHJcblxyXG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIHRoaXMucXVpY2tNZW51U2VjdGlvbkluc3RhbmNlLnF1aWNrTWVudUluc3RhbmNlLnRyYW5zZm9ybUh0bWxGb2N1c2VkRWxlbWVudEJlZm9yZU9wZW5RdWlja01lbnUodGhpcy5ibG9ja1R5cGUpO1xyXG5cclxuICAgICAgICB9KTtcclxuICAgIH1cclxufSIsImltcG9ydCB7IFF1aWNrTWVudSB9IGZyb20gXCIuLi9jb21wb25lbnRzL3F1aWNrLW1lbnUvUXVpY2tNZW51XCI7XHJcbmltcG9ydCB7IFF1aWNrTWVudVNlY3Rpb24gfSBmcm9tIFwiLi4vY29tcG9uZW50cy9xdWljay1tZW51L1F1aWNrTWVudVNlY3Rpb25cIjtcclxuaW1wb3J0IHsgUXVpY2tNZW51SXRlbSB9IGZyb20gXCIuLi9jb21wb25lbnRzL3F1aWNrLW1lbnUvUXVpY2tNZW51SXRlbVwiO1xyXG5pbXBvcnQgeyBFbGVtZW50RmFjdG9yeVNlcnZpY2UgfSBmcm9tIFwiLi4vc2VydmljZXMvZWxlbWVudC1mYWN0b3J5L0VsZW1lbnRGYWN0b3J5U2VydmljZVwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFF1aWNrTWVudUJ1aWxkZXIge1xyXG5cclxuICAgIHN0YXRpYyBidWlsZCgpOiBRdWlja01lbnUge1xyXG5cclxuICAgICAgICBjb25zdCBxdWlja01lbnU6IFF1aWNrTWVudSA9IFF1aWNrTWVudS5nZXRJbnN0YW5jZSgpO1xyXG5cclxuICAgICAgICBjb25zdCBiYXNpY0Jsb2Nrc1NlY3Rpb246IFF1aWNrTWVudVNlY3Rpb24gPSBuZXcgUXVpY2tNZW51U2VjdGlvbih7IHF1aWNrTWVudUluc3RhbmNlOiBxdWlja01lbnUsIHRpdGxlOiAnQmFzaWMgYmxvY2tzJywgY2xhc3NMaXN0OiAnYmFzaWMtc2VjdGlvbicgfSk7XHJcblxyXG4gICAgICAgIGJhc2ljQmxvY2tzU2VjdGlvbi5hcHBlbmRRdWlja01lbnVJdGVtcyhbXHJcbiAgICAgICAgICAgIG5ldyBRdWlja01lbnVJdGVtKGJhc2ljQmxvY2tzU2VjdGlvbiwgJ1RleHQnLCAnU3RhcnQgd3JpdGluZyBpbiBwbGFpbiB0ZXh0LicsICdpY29uLW1hdGVyaWFsLWZvcm1hdCcsIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLlBBUkFHUkFQSCwgXCJwYXJhZ3JhcGggdGV4dCBwXCIpLFxyXG4gICAgICAgICAgICBuZXcgUXVpY2tNZW51SXRlbShiYXNpY0Jsb2Nrc1NlY3Rpb24sICdJbWFnZScsICdVcGxvYWQgaW1hZ2UuJywgJ2ljb24tbWF0ZXJpYWwtYXBlcnR1cmUnLCAnaW1hZ2UnLCBcImltYWdlIGZpZ3VyZSBwaG90byBpbGx1c3RyYXRpb24gcGljdHVyZSBcIiksXHJcbiAgICAgICAgICAgIG5ldyBRdWlja01lbnVJdGVtKGJhc2ljQmxvY2tzU2VjdGlvbiwgJ0J1bGxldGVkIGxpc3QnLCAnT3JnYW5pemUgaXRlbXMgd2l0aCBidWxsZXQgcG9pbnRzLicsICdpY29uLXdvcmRwcmVzcy1idWxsZXRlZC1saXN0JywgJ2J1bGxldGVkLWxpc3QnLCBcImJ1bGxldGVkIGxpc3QgdW5vcmRlcmVkIGxpc3QgdWxcIiksXHJcbiAgICAgICAgICAgIG5ldyBRdWlja01lbnVJdGVtKGJhc2ljQmxvY2tzU2VjdGlvbiwgJ051bWJlcmVkIGxpc3QnLCAnTGlzdCBpdGVtcyBpbiBhIG51bWJlcmVkIGZvcm1hdC4nLCAnaWNvbi13b3JkcHJlc3MtbnVtYmVyZWQtbGlzdCcsICdudW1iZXJlZC1saXN0JywgXCJudW1iZXJlZCBsaXN0IG51bWJlciBsaXN0IHNlcXVlbnRpYWwgbGlzdCBvbCBlbnVtZXJhdGVkIGxpc3Qgb3JkZXJlZCBsaXN0XCIpLFxyXG4gICAgICAgICAgICBuZXcgUXVpY2tNZW51SXRlbShiYXNpY0Jsb2Nrc1NlY3Rpb24sICdDb2RlJywgJ0luY2x1ZGUgY29kZSBzbmlwcGV0LicsICdpY29uLXdvcmRwcmVzcy1jb2RlLW1hcmsnLCAnY29kZScsIFwiY29kZSBzY3JpcHQgc291cmNlIG1hcmt1cFwiKSxcclxuICAgICAgICAgICAgbmV3IFF1aWNrTWVudUl0ZW0oYmFzaWNCbG9ja3NTZWN0aW9uLCAnUXVvdGUnLCAnSGlnaGxpZ2h0IHRleHQgYXMgYSBxdW90ZS4nLCAnaWNvbi13b3JkcHJlc3MtcXVvdGUnLCAncXVvdGUnLCBcInF1b3RlIGJsb2NrcXVvdGUgY2l0YXRpb24gcXVvdGF0aW9uXCIpLFxyXG4gICAgICAgICAgICBuZXcgUXVpY2tNZW51SXRlbShiYXNpY0Jsb2Nrc1NlY3Rpb24sICdIZWFkaW5nIDInLCAnTWVkaXVtIGhlYWRlciBmb3Igc2VjdGlvbnMuJywgJ2ljb24tanVsaWEtaGVhZC0yJywgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuSEVBREVSXzIsIFwiaGVhZGVyIDIgaGVhZGluZyAyIGgyXCIpLFxyXG4gICAgICAgICAgICBuZXcgUXVpY2tNZW51SXRlbShiYXNpY0Jsb2Nrc1NlY3Rpb24sICdIZWFkaW5nIDMnLCAnU21hbGwgaGVhZGVyIGZvciBzdWJzZWN0aW9ucy4nLCAnaWNvbi1qdWxpYS1oZWFkLTInLCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfMywgXCJoZWFkZXIgMyBoZWFkaW5nIDMgaDNcIiksXHJcbiAgICAgICAgICAgIG5ldyBRdWlja01lbnVJdGVtKGJhc2ljQmxvY2tzU2VjdGlvbiwgJ1NlcGFyYXRvcicsICdWaXN1YWxseSBkaXZpZGUgYmxvY2tzLicsICdpY29uLXdvcmRwcmVzcy1zZXBhcmF0b3InLCAnc2VwYXJhdG9yJywgXCJzZXBhcmF0b3IgZGl2aWRlciBydWxlIGxpbmVcIilcclxuICAgICAgICBdKTtcclxuXHJcbiAgICAgICAgcXVpY2tNZW51LmFwcGVuZChiYXNpY0Jsb2Nrc1NlY3Rpb24pO1xyXG5cclxuICAgICAgICBjb25zdCBoZWFkaW5nQmxvY2tzU2VjdGlvbiA9IG5ldyBRdWlja01lbnVTZWN0aW9uKHsgcXVpY2tNZW51SW5zdGFuY2U6IHF1aWNrTWVudSwgdGl0bGU6ICdIZWFkaW5nJywgY2xhc3NMaXN0OiAnaGVhZGluZy1zZWN0aW9uJyB9KTtcclxuXHJcbiAgICAgICAgaGVhZGluZ0Jsb2Nrc1NlY3Rpb24uYXBwZW5kUXVpY2tNZW51SXRlbXMoW1xyXG4gICAgICAgICAgICBuZXcgUXVpY2tNZW51SXRlbShoZWFkaW5nQmxvY2tzU2VjdGlvbiwgJ0hlYWRpbmcgMScsICdMYXJnZSBoZWFkZXIgZm9yIG1haW4gdG9waWNzLicsICdpY29uLWp1bGlhLWhlYWQtMScsIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl8xLCBcImhlYWRlciAxIGhlYWRpbmcgMSBoMVwiKSxcclxuICAgICAgICAgICAgbmV3IFF1aWNrTWVudUl0ZW0oaGVhZGluZ0Jsb2Nrc1NlY3Rpb24sICdIZWFkaW5nIDInLCAnTWVkaXVtIGhlYWRlciBmb3Igc2VjdGlvbnMuJywgJ2ljb24tanVsaWEtaGVhZC0yJywgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuSEVBREVSXzIsIFwiaGVhZGVyIDIgaGVhZGluZyAyIGgyXCIpLFxyXG4gICAgICAgICAgICBuZXcgUXVpY2tNZW51SXRlbShoZWFkaW5nQmxvY2tzU2VjdGlvbiwgJ0hlYWRpbmcgMycsICdTbWFsbCBoZWFkZXIgZm9yIHN1YnNlY3Rpb25zLicsICdpY29uLWp1bGlhLWhlYWQtMycsIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl8zLCBcImhlYWRlciAzIGhlYWRpbmcgMyBoM1wiKSxcclxuICAgICAgICAgICAgbmV3IFF1aWNrTWVudUl0ZW0oaGVhZGluZ0Jsb2Nrc1NlY3Rpb24sICdIZWFkaW5nIDQnLCAnRGV0YWlsZWQgaGVhZGVyIGZvciBzdWJ0b3BpY3MuJywgJ2ljb24tanVsaWEtaGVhZC00JywgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuSEVBREVSXzQsIFwiaGVhZGVyIDQgaGVhZGluZyA0IGg0XCIpLFxyXG4gICAgICAgICAgICBuZXcgUXVpY2tNZW51SXRlbShoZWFkaW5nQmxvY2tzU2VjdGlvbiwgJ0hlYWRpbmcgNScsICdNaW5vciBoZWFkZXIgZm9yIHNwZWNpZmljcy4nLCAnaWNvbi1qdWxpYS1oZWFkLTUnLCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfNSwgXCJoZWFkZXIgNSBoZWFkaW5nIDUgaDVcIiksXHJcbiAgICAgICAgICAgIG5ldyBRdWlja01lbnVJdGVtKGhlYWRpbmdCbG9ja3NTZWN0aW9uLCAnSGVhZGluZyA2JywgJ1NtYWxsZXN0IGhlYWRlciBmb3IgZmluZSBkZXRhaWxzLicsICdpY29uLWp1bGlhLWhlYWQtNicsIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl82LCBcImhlYWRlciA2IGhlYWRpbmcgNiBoNlwiKSxcclxuICAgICAgICBdKTtcclxuXHJcbiAgICAgICAgcXVpY2tNZW51LmFwcGVuZChoZWFkaW5nQmxvY2tzU2VjdGlvbik7XHJcblxyXG5cclxuICAgICAgICBjb25zdCBsaXN0QmxvY2tzU2VjdGlvbiA9IG5ldyBRdWlja01lbnVTZWN0aW9uKHsgcXVpY2tNZW51SW5zdGFuY2U6IHF1aWNrTWVudSwgdGl0bGU6ICdMaXN0JywgY2xhc3NMaXN0OiAnbGlzdC1zZWN0aW9uJyB9KTtcclxuXHJcbiAgICAgICAgbGlzdEJsb2Nrc1NlY3Rpb24uYXBwZW5kUXVpY2tNZW51SXRlbXMoW1xyXG4gICAgICAgICAgICBuZXcgUXVpY2tNZW51SXRlbShsaXN0QmxvY2tzU2VjdGlvbiwgJ1RvZG8gbGlzdCcsICdUcmFjayB0YXNrcyB3aXRoIGNoZWNrYm94ZXMuJywgJ2ljb24tbWF0ZXJpYWwtY2hlY2stbGlzdC0yJywgJ3RvZG8tbGlzdCcsIFwidG9kbyBsaXN0IHRhc2sgbGlzdCBjaGVja2xpc3RcIiksXHJcbiAgICAgICAgICAgIG5ldyBRdWlja01lbnVJdGVtKGxpc3RCbG9ja3NTZWN0aW9uLCAnQnVsbGV0ZWQgbGlzdCcsICdPcmdhbml6ZSBpdGVtcyB3aXRoIGJ1bGxldCBwb2ludHMuJywgJ2ljb24td29yZHByZXNzLWJ1bGxldGVkLWxpc3QnLCAnYnVsbGV0ZWQtbGlzdCcsIFwiYnVsbGV0ZWQgbGlzdCB1bm9yZGVyZWQgbGlzdCB1bFwiKSxcclxuICAgICAgICAgICAgbmV3IFF1aWNrTWVudUl0ZW0obGlzdEJsb2Nrc1NlY3Rpb24sICdOdW1iZXJlZCBsaXN0JywgJ0xpc3QgaXRlbXMgaW4gYSBudW1iZXJlZCBmb3JtYXQuJywgJ2ljb24td29yZHByZXNzLW51bWJlcmVkLWxpc3QnLCAnbnVtYmVyZWQtbGlzdCcsIFwibnVtYmVyZWQgbGlzdCBudW1iZXIgbGlzdCBzZXF1ZW50aWFsIGxpc3Qgb2wgZW51bWVyYXRlZCBsaXN0IG9yZGVyZWQgbGlzdFwiKVxyXG4gICAgICAgIF0pO1xyXG5cclxuICAgICAgICBxdWlja01lbnUuYXBwZW5kKGxpc3RCbG9ja3NTZWN0aW9uKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHF1aWNrTWVudTtcclxuICAgIH1cclxufSIsImltcG9ydCB7IEJhc2VVSUNvbXBvbmVudCB9IGZyb20gXCIuLi8uLi9jb21tb24vQmFzZVVJQ29tcG9uZW50XCI7XHJcbmltcG9ydCB7IERyb3Bkb3duTWVudUJ1dHRvbiB9IGZyb20gXCIuL0Ryb3Bkb3duTWVudUJ1dHRvblwiO1xyXG5pbXBvcnQgeyBEcm9wZG93bk1lbnVMaXN0IH0gZnJvbSBcIi4vRHJvcGRvd25NZW51TGlzdFwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIERyb3Bkb3duTWVudSBleHRlbmRzIEJhc2VVSUNvbXBvbmVudCB7XHJcblxyXG4gICAgZHJvcGRvd25CdXR0b246IERyb3Bkb3duTWVudUJ1dHRvbjtcclxuICAgIGRyb3Bkb3duTGlzdDogRHJvcGRvd25NZW51TGlzdDtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihidXR0b246IERyb3Bkb3duTWVudUJ1dHRvbiwgZHJvcGRvd25MaXN0OiBEcm9wZG93bk1lbnVMaXN0KSB7XHJcblxyXG4gICAgICAgIHN1cGVyKHt9KTtcclxuXHJcbiAgICAgICAgdGhpcy5kcm9wZG93bkJ1dHRvbiA9IGJ1dHRvbjtcclxuICAgICAgICB0aGlzLmRyb3Bkb3duTGlzdCA9IGRyb3Bkb3duTGlzdDtcclxuXHJcblxyXG4gICAgICAgIGJ1dHRvbi5kb2N1bWVudEFwcGVuZFRvKHRoaXMuaHRtbEVsZW1lbnQpO1xyXG4gICAgICAgIGRyb3Bkb3duTGlzdC5kb2N1bWVudEFwcGVuZFRvKHRoaXMuaHRtbEVsZW1lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXQoKTogSFRNTEVsZW1lbnQge1xyXG5cclxuICAgICAgICBjb25zdCBodG1sRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuY2xhc3NMaXN0LmFkZChcInNlbGVjdC13cmFwcGVyXCIpO1xyXG5cclxuICAgICAgICByZXR1cm4gaHRtbEVsZW1lbnQ7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBJVGV4dE9wZXJhdGlvblNlcnZpY2UgfSBmcm9tIFwiLi9JVGV4dE9wZXJhdGlvblNlcnZpY2VcIjtcblxudHlwZSBUYXJnZXROb2RlID0ge1xuICAgIG5vZGVUeXBlOiBzdHJpbmc7XG4gICAgY2xhc3Nlcz86IHN0cmluZ1tdO1xufTtcblxuZXhwb3J0IGNsYXNzIFRleHRPcGVyYXRpb25TZXJ2aWNlIGltcGxlbWVudHMgSVRleHRPcGVyYXRpb25TZXJ2aWNlIHtcblxuICAgIHByaXZhdGUgc3RhdGljIGluc3RhbmNlOiBUZXh0T3BlcmF0aW9uU2VydmljZTtcblxuICAgIHByaXZhdGUgY29uc3RydWN0b3IoKSB7XG5cbiAgICAgICAgaWYgKFRleHRPcGVyYXRpb25TZXJ2aWNlLmluc3RhbmNlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBnZXRJbnN0YW5jZSgpOiBUZXh0T3BlcmF0aW9uU2VydmljZSB7XG5cblxuICAgICAgICBpZiAoIXRoaXMuaW5zdGFuY2UpIHtcbiAgICAgICAgICAgIHRoaXMuaW5zdGFuY2UgPSBuZXcgVGV4dE9wZXJhdGlvblNlcnZpY2UoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmluc3RhbmNlO1xuICAgIH1cblxuICAgIGV4ZWNDb21tYW5kKGNvbW1hbmQ6IHN0cmluZywgc2hvd1VpOiBib29sZWFuLCB2YWx1ZTogc3RyaW5nIHwgbnVsbCk6IGJvb2xlYW4ge1xuXG4gICAgICAgIGlmIChjb21tYW5kID09IFRleHRPcGVyYXRpb25TZXJ2aWNlLlFVRVJZX1RFWFRfT1BFUkFUSU9OUy5JTkxJTkVfQ09ERSkge1xuICAgICAgICAgICAgdGhpcy50b2dnbGVDb2RlRXhlY0NvbW1hbmQoKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHY6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHZhbHVlIHx8IHVuZGVmaW5lZDtcblxuICAgICAgICBpZiAodiA9PSBcImluaXRpYWxcIikge1xuICAgICAgICAgICAgdiA9IHRoaXMuZ2V0SW5pdGlhbENvbG9yQXNIZXgoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb21tYW5kID09IFRleHRPcGVyYXRpb25TZXJ2aWNlLlFVRVJZX1RFWFRfT1BFUkFUSU9OUy5DUkVBVEVfTElOSykge1xuXG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gVGV4dE9wZXJhdGlvblNlcnZpY2UuZ2V0U2VsZWN0ZWRIVE1MRWxlbWVudCgpO1xuXG4gICAgICAgICAgICBpZiAoZWxlbWVudD8uY2xvc2VzdChcImFcIikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZG9jdW1lbnQuZXhlY0NvbW1hbmQoXCJ1bmxpbmtcIiwgZmFsc2UsIHYpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoc2hvd1VpKSB7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBzaG93SW5wdXRMaW5rQm94ID0gbmV3IEN1c3RvbUV2ZW50KCdzaG93SW5wdXRMaW5rQm94UmVxdWVzdGVkJywge1xuICAgICAgICAgICAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBjYW5jZWxhYmxlOiB0cnVlXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHNob3dJbnB1dExpbmtCb3gpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZihjb21tYW5kID09IFRleHRPcGVyYXRpb25TZXJ2aWNlLlFVRVJZX1RFWFRfT1BFUkFUSU9OUy5ISUxJVEVfQ09MT1IgfHwgXG4gICAgICAgICAgICBjb21tYW5kID09IFRleHRPcGVyYXRpb25TZXJ2aWNlLlFVRVJZX1RFWFRfT1BFUkFUSU9OUy5GT1JFX0NPTE9SKXtcblxuICAgICAgICAgICAgICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKGNvbW1hbmQsIGZhbHNlLCB2KTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHNob3dJbnB1dExpbmtCb3ggPSBuZXcgQ3VzdG9tRXZlbnQoJ2NvbG9yQ2hhbmdlJywge1xuICAgICAgICAgICAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBjYW5jZWxhYmxlOiB0cnVlXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHNob3dJbnB1dExpbmtCb3gpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRvY3VtZW50LmV4ZWNDb21tYW5kKGNvbW1hbmQsIGZhbHNlLCB2KTtcbiAgICB9XG5cblxuICAgIHN0YXRpYyBRVUVSWV9URVhUX09QRVJBVElPTlMgPSB7XG4gICAgICAgIEhJTElURV9DT0xPUjogXCJoaWxpdGVDb2xvclwiLFxuICAgICAgICBGT1JFX0NPTE9SOiBcImZvcmVDb2xvclwiLFxuICAgICAgICBJTkxJTkVfQ09ERTogXCJpbmxpbmVDb2RlXCIsXG4gICAgICAgIENSRUFURV9MSU5LOiBcImNyZWF0ZUxpbmtcIixcbiAgICAgICAgVU5ERVJMSU5FOiBcInVuZGVybGluZVwiXG4gICAgICAgIC8vIENSRUFURV9MSU5LOiBcImNyZWF0ZUxpbmtcIlxuXG4gICAgfTtcblxuICAgIHF1ZXJ5Q29tbWFuZFN0YXRlKGNvbW1hbmQ6IHN0cmluZywgdmFsdWU6IHN0cmluZyB8IG51bGwpOiBib29sZWFuIHtcblxuICAgICAgICBpZiAoY29tbWFuZCA9PT0gVGV4dE9wZXJhdGlvblNlcnZpY2UuUVVFUllfVEVYVF9PUEVSQVRJT05TLkNSRUFURV9MSU5LKSB7XG5cbiAgICAgICAgICAgIGlmIChUZXh0T3BlcmF0aW9uU2VydmljZS5nZXRTZWxlY3RlZEhUTUxFbGVtZW50KCk/LmNsb3Nlc3QoXCJhXCIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTs7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29tbWFuZCA9PT0gVGV4dE9wZXJhdGlvblNlcnZpY2UuUVVFUllfVEVYVF9PUEVSQVRJT05TLlVOREVSTElORSkge1xuXG4gICAgICAgICAgICBpZiAoVGV4dE9wZXJhdGlvblNlcnZpY2UuZ2V0U2VsZWN0ZWRIVE1MRWxlbWVudCgpPy5jbG9zZXN0KFwiYVwiKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb21tYW5kID09PSBUZXh0T3BlcmF0aW9uU2VydmljZS5RVUVSWV9URVhUX09QRVJBVElPTlMuSElMSVRFX0NPTE9SKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5xdWVyeUhpbGl0ZUNvbG9yKHZhbHVlISk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29tbWFuZCA9PT0gVGV4dE9wZXJhdGlvblNlcnZpY2UuUVVFUllfVEVYVF9PUEVSQVRJT05TLkZPUkVfQ09MT1IpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnF1ZXJ5Rm9yZUNvbG9yKHZhbHVlISk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlDb21tYW5kU3RhdGUoY29tbWFuZCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB0b2dnbGVDb2RlRXhlY0NvbW1hbmQoKSB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcbiAgICAgICAgaWYgKCFzZWxlY3Rpb24gfHwgc2VsZWN0aW9uLnJhbmdlQ291bnQgPT09IDApIHJldHVybjtcblxuICAgICAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xuICAgICAgICBsZXQgY29udGFpbmVyTm9kZTogTm9kZSB8IG51bGwgPSByYW5nZS5jb21tb25BbmNlc3RvckNvbnRhaW5lcjtcblxuICAgICAgICB3aGlsZSAoY29udGFpbmVyTm9kZSAmJiBjb250YWluZXJOb2RlLm5vZGVOYW1lICE9PSAnQ09ERScpIHtcbiAgICAgICAgICAgIGNvbnRhaW5lck5vZGUgPSBjb250YWluZXJOb2RlLnBhcmVudE5vZGU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29udGFpbmVyTm9kZSAmJiBjb250YWluZXJOb2RlLm5vZGVOYW1lID09PSAnQ09ERScpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvZGVFbGVtZW50ID0gY29udGFpbmVyTm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlT2ZDb2RlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcbiAgICAgICAgICAgIHJhbmdlT2ZDb2RlLnNlbGVjdE5vZGVDb250ZW50cyhjb2RlRWxlbWVudCk7XG5cbiAgICAgICAgICAgIGlmIChyYW5nZS50b1N0cmluZygpID09PSByYW5nZU9mQ29kZS50b1N0cmluZygpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyZW50OiBOb2RlIHwgbnVsbCA9IGNvZGVFbGVtZW50LnBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHBhcmVudCAmJiBjb2RlRWxlbWVudC5maXJzdENoaWxkKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUoY29kZUVsZW1lbnQuZmlyc3RDaGlsZCwgY29kZUVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwYXJlbnQ/LnJlbW92ZUNoaWxkKGNvZGVFbGVtZW50KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGV4dENvbnRlbnQgPSByYW5nZS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKCdpbnNlcnRIVE1MJywgZmFsc2UsIHRleHRDb250ZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRvY3VtZW50LmdldFNlbGVjdGlvbigpPy5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRBc1N0cmluZyA9IG5ldyBYTUxTZXJpYWxpemVyKCkuc2VyaWFsaXplVG9TdHJpbmcocmFuZ2UuY2xvbmVDb250ZW50cygpKTtcbiAgICAgICAgICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKCdpbnNlcnRIVE1MJywgZmFsc2UsIGA8Y29kZT4ke2NvbnRlbnRBc1N0cmluZ308L2NvZGU+YCk7XG4gICAgICAgIH1cbiAgICB9XG5cblxuXG5cblxuXG4gICAgcHJpdmF0ZSBxdWVyeUZvcmVDb2xvcihleHBlY3RlZENvbG9yOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuXG4gICAgICAgIGlmICghc2VsZWN0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzZWxlY3Rpb24ucmFuZ2VDb3VudCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGxldCBlbGVtZW50OiBOb2RlIHwgbnVsbCA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyO1xuXG4gICAgICAgIGlmIChlbGVtZW50Lm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xuICAgICAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZvbnRDb2xvciA9IChlbGVtZW50IGFzIEhUTUxFbGVtZW50KS5jbG9zZXN0KFwiZm9udFtjb2xvcl1cIik7XG4gICAgICAgIGlmICghZm9udENvbG9yKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgY29uc3Qgc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShmb250Q29sb3IpO1xuICAgICAgICBjb25zdCByZ2JDb2xvciA9IHN0eWxlLmNvbG9yO1xuXG4gICAgICAgIGNvbnN0IGhleENvbG9yID0gdGhpcy5yZ2JUb0hleChyZ2JDb2xvcik7XG5cbiAgICAgICAgcmV0dXJuIGhleENvbG9yLnRvVXBwZXJDYXNlKCkgPT09IGV4cGVjdGVkQ29sb3IudG9VcHBlckNhc2UoKTtcbiAgICB9XG5cblxuICAgIHByaXZhdGUgcXVlcnlIaWxpdGVDb2xvcihleHBlY3RlZENvbG9yOiBzdHJpbmcpIHtcblxuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG5cbiAgICAgICAgaWYgKCFzZWxlY3Rpb24pIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXNlbGVjdGlvbi5yYW5nZUNvdW50KSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgbGV0IGVsZW1lbnQ6IE5vZGUgfCBudWxsID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCkuY29tbW9uQW5jZXN0b3JDb250YWluZXI7XG5cbiAgICAgICAgaWYgKGVsZW1lbnQubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgICAgICAgICBlbGVtZW50ID0gZWxlbWVudC5wYXJlbnROb2RlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3BhbldpdGhCYWNrZ3JvdW5kID0gXG4gICAgICAgICAgICAoZWxlbWVudCBhcyBIVE1MRWxlbWVudCkuY2xvc2VzdChcInNwYW5bc3R5bGUqPSdiYWNrZ3JvdW5kLWNvbG9yJ11cIikgfHwgXG4gICAgICAgICAgICAoZWxlbWVudCBhcyBIVE1MRWxlbWVudCkuY2xvc2VzdChcImZvbnRbc3R5bGUqPSdiYWNrZ3JvdW5kLWNvbG9yJ11cIik7XG5cblxuICAgICAgICBpZiAoIXNwYW5XaXRoQmFja2dyb3VuZCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGNvbnN0IHN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoc3BhbldpdGhCYWNrZ3JvdW5kKTtcbiAgICAgICAgY29uc3QgcmdiQ29sb3IgPSBzdHlsZS5iYWNrZ3JvdW5kQ29sb3I7XG5cbiAgICAgICAgY29uc3QgaGV4Q29sb3IgPSB0aGlzLnJnYlRvSGV4KHJnYkNvbG9yKTtcblxuICAgICAgICByZXR1cm4gaGV4Q29sb3IudG9VcHBlckNhc2UoKSA9PT0gZXhwZWN0ZWRDb2xvci50b1VwcGVyQ2FzZSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmdiVG9IZXgocmdiOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCByZ2JBcnJheSA9IHJnYi5tYXRjaCgvXFxkKy9nKSEubWFwKE51bWJlcik7XG4gICAgICAgIHJldHVybiBcIiNcIiArIHJnYkFycmF5Lm1hcCh4ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGhleCA9IHgudG9TdHJpbmcoMTYpO1xuICAgICAgICAgICAgcmV0dXJuIGhleC5sZW5ndGggPT09IDEgPyBcIjBcIiArIGhleCA6IGhleDtcbiAgICAgICAgfSkuam9pbihcIlwiKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEluaXRpYWxDb2xvckFzSGV4KCkge1xuICAgICAgICBjb25zdCB0ZW1wRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGVtcEVsZW1lbnQpO1xuXG4gICAgICAgIHRlbXBFbGVtZW50LnN0eWxlLmNvbG9yID0gJ2luaXRpYWwnO1xuXG4gICAgICAgIGNvbnN0IGNvbXB1dGVkQ29sb3IgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0ZW1wRWxlbWVudCkuY29sb3I7XG5cbiAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0ZW1wRWxlbWVudCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMucmdiVG9IZXgoY29tcHV0ZWRDb2xvcik7XG4gICAgfVxuXG4gICAgZ2V0VGFyZ2V0RWxlbWVudE1hcChjb21tYW5kOiBzdHJpbmcpOiBrZXlvZiBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICAgICBzd2l0Y2ggKGNvbW1hbmQpIHtcblxuICAgICAgICAgICAgY2FzZSBcInN0cm9uZ1wiOlxuICAgICAgICAgICAgY2FzZSBcImJvbGRcIjpcbiAgICAgICAgICAgIGNhc2UgXCJiXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuICdzdHJvbmcnO1xuXG4gICAgICAgICAgICBjYXNlIFwiaXRhbGljXCI6XG4gICAgICAgICAgICBjYXNlIFwiaVwiOlxuICAgICAgICAgICAgY2FzZSBcImVtXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiZW1cIjtcblxuICAgICAgICAgICAgY2FzZSBcInVuZGVybGluZVwiOlxuICAgICAgICAgICAgY2FzZSBcInVcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJ1XCI7XG5cbiAgICAgICAgICAgIGNhc2UgXCJzdHJpa2V0aHJvdWdoXCI6XG4gICAgICAgICAgICBjYXNlIFwic1wiOlxuICAgICAgICAgICAgICAgIHJldHVybiAncyc7XG5cbiAgICAgICAgICAgIGNhc2UgXCJiYWNrZ3JvdW5kXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwic3BhblwiO1xuXG4gICAgICAgICAgICBjYXNlIFwiY29sb3JcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJzcGFuXCI7XG5cbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0U2VsZWN0ZWRIVE1MRWxlbWVudCgpOiBIVE1MRWxlbWVudCB8IG51bGwge1xuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG5cbiAgICAgICAgaWYgKHNlbGVjdGlvbiAmJiBzZWxlY3Rpb24ucmFuZ2VDb3VudCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XG4gICAgICAgICAgICBsZXQgZWxlbWVudDogTm9kZSB8IG51bGwgPSByYW5nZS5jb21tb25BbmNlc3RvckNvbnRhaW5lcjtcblxuICAgICAgICAgICAgaWYgKGVsZW1lbnQubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgd2hpbGUgKGVsZW1lbnQgJiYgIShlbGVtZW50IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZSBhcyBIVE1MRWxlbWVudCB8IG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cblxuICAgIGdldFNlbGVjdGVkVGV4dE5vZGVzKCk6IE5vZGVbXSB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcbiAgICAgICAgaWYgKCFzZWxlY3Rpb24gfHwgc2VsZWN0aW9uLnJhbmdlQ291bnQgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRleHROb2RlczogTm9kZVtdID0gW107XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWxlY3Rpb24ucmFuZ2VDb3VudDsgKytpKSB7XG4gICAgICAgICAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KGkpO1xuICAgICAgICAgICAgY29uc3Qgbm9kZUl0ZXJhdG9yID0gZG9jdW1lbnQuY3JlYXRlTm9kZUl0ZXJhdG9yKFxuICAgICAgICAgICAgICAgIHJhbmdlLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyLFxuICAgICAgICAgICAgICAgIE5vZGVGaWx0ZXIuU0hPV19URVhULFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgYWNjZXB0Tm9kZShub2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmFuZ2UuaW50ZXJzZWN0c05vZGUobm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTm9kZUZpbHRlci5GSUxURVJfQUNDRVBUO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5vZGVGaWx0ZXIuRklMVEVSX1JFSkVDVDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGxldCBub2RlO1xuICAgICAgICAgICAgd2hpbGUgKChub2RlID0gbm9kZUl0ZXJhdG9yLm5leHROb2RlKCkpKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vZGVSYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG4gICAgICAgICAgICAgICAgICAgIG5vZGVSYW5nZS5zZWxlY3ROb2RlQ29udGVudHMobm9kZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UuY29tcGFyZUJvdW5kYXJ5UG9pbnRzKFJhbmdlLkVORF9UT19TVEFSVCwgbm9kZVJhbmdlKSA9PT0gLTEgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlLmNvbXBhcmVCb3VuZGFyeVBvaW50cyhSYW5nZS5TVEFSVF9UT19FTkQsIG5vZGVSYW5nZSkgPT09IDFcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0Tm9kZXMucHVzaChub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0ZXh0Tm9kZXM7XG4gICAgfVxuXG4gICAgZmluZENsb3Nlc3RNYXRjaGluZ1BhcmVudChlbGVtZW50OiBOb2RlIHwgbnVsbCwgdGFyZ2V0OiBUYXJnZXROb2RlKTogRWxlbWVudCB8IG51bGwge1xuICAgICAgICBpZiAoZWxlbWVudCAmJiBlbGVtZW50Lm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xuICAgICAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50RWxlbWVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIHdoaWxlIChlbGVtZW50ICYmIGVsZW1lbnQgIT09IGRvY3VtZW50LmJvZHkpIHtcbiAgICAgICAgICAgIGlmIChlbGVtZW50Lm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW0gPSBlbGVtZW50IGFzIEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgaWYgKGVsZW0udGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSB0YXJnZXQubm9kZVR5cGUudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXRhcmdldC5jbGFzc2VzIHx8IHRhcmdldC5jbGFzc2VzLmV2ZXJ5KGNscyA9PiBlbGVtLmNsYXNzTGlzdC5jb250YWlucyhjbHMpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsZW07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbGVtZW50ID0gZWxlbWVudC5wYXJlbnRFbGVtZW50O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGV4dHJhY3RTZWxlY3RlZFRleHQodGV4dE5vZGU6IE5vZGUpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG5cbiAgICAgICAgaWYgKCFzZWxlY3Rpb24gfHwgc2VsZWN0aW9uLnJhbmdlQ291bnQgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcblxuICAgICAgICBpZiAodGV4dE5vZGUubm9kZVR5cGUgIT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRleHRDb250ZW50ID0gdGV4dE5vZGUudGV4dENvbnRlbnQgfHwgXCJcIjtcblxuICAgICAgICBsZXQgc3RhcnQgPSAwO1xuICAgICAgICBsZXQgZW5kID0gdGV4dENvbnRlbnQubGVuZ3RoO1xuXG4gICAgICAgIGlmICghcmFuZ2UuaW50ZXJzZWN0c05vZGUodGV4dE5vZGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyYW5nZS5zdGFydENvbnRhaW5lciA9PT0gdGV4dE5vZGUpIHtcbiAgICAgICAgICAgIHN0YXJ0ID0gcmFuZ2Uuc3RhcnRPZmZzZXQ7XG4gICAgICAgIH0gZWxzZSBpZiAocmFuZ2Uuc3RhcnRDb250YWluZXIuY29udGFpbnModGV4dE5vZGUpKSB7XG4gICAgICAgICAgICBzdGFydCA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmFuZ2UuZW5kQ29udGFpbmVyID09PSB0ZXh0Tm9kZSkge1xuICAgICAgICAgICAgZW5kID0gcmFuZ2UuZW5kT2Zmc2V0O1xuICAgICAgICB9IGVsc2UgaWYgKHJhbmdlLmVuZENvbnRhaW5lci5jb250YWlucyh0ZXh0Tm9kZSkpIHtcbiAgICAgICAgICAgIGVuZCA9IHRleHRDb250ZW50Lmxlbmd0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzdGFydCA8IGVuZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRleHRDb250ZW50LnN1YnN0cmluZyhzdGFydCwgZW5kKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IFRleHRPcGVyYXRpb25TZXJ2aWNlIH0gZnJvbSBcIkAvc2VydmljZXMvdGV4dC1vcGVyYXRpb25zL1RleHRPcGVyYXRpb25TZXJ2aWNlXCI7XHJcbmltcG9ydCB7IEJhc2VVSUNvbXBvbmVudCB9IGZyb20gXCIuLi8uLi9jb21tb24vQmFzZVVJQ29tcG9uZW50XCI7XHJcbmltcG9ydCB7IElucHV0TGlua0JveFdyYXBwZXIgfSBmcm9tIFwiLi9JbnB1dExpbmtCb3hXcmFwcGVyXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgSW5wdXRMaW5rQm94IGV4dGVuZHMgQmFzZVVJQ29tcG9uZW50IHtcclxuXHJcbiAgICBwYXJlbnRXcmFwcGVyPzogSW5wdXRMaW5rQm94V3JhcHBlcjtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuXHJcbiAgICAgICAgc3VwZXIoe30pXHJcbiAgICAgICAgdGhpcy5hdHRhY2hFdmVudCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXQoKTogSFRNTEVsZW1lbnQge1xyXG5cclxuICAgICAgICBjb25zdCBodG1sRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiKTtcclxuXHJcbiAgICAgICAgaHRtbEVsZW1lbnQuaWQgPSBcImxpbmtCb3hJbnB1dFwiO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LnR5cGUgPSBcInVybFwiO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LnBsYWNlaG9sZGVyID0gXCJQYXN0ZSBvciB0eXBlIGEgbGluay4uLlwiO1xyXG5cclxuICAgICAgICBodG1sRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9IFwicmVsYXRpdmVcIjtcclxuXHJcbiAgICAgICAgcmV0dXJuIGh0bWxFbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIHNldFBhcmVudFdyYXBwZXIocGFyZW50V3JhcHBlcjogSW5wdXRMaW5rQm94V3JhcHBlcik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMucGFyZW50V3JhcHBlciA9IHBhcmVudFdyYXBwZXI7XHJcbiAgICB9XHJcblxyXG4gICAgYXR0YWNoRXZlbnQoKTogdm9pZCB7XHJcblxyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIChldmVudCkgPT4ge1xyXG5cclxuICAgICAgICAgICAgaWYgKGV2ZW50LmtleSA9PSBcIkVudGVyXCIgJiYgdGhpcy5pc1Zpc2libGUpIHtcclxuXHJcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgdXJsID0gKHRoaXMuaHRtbEVsZW1lbnQgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWU7XHJcblxyXG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgVGV4dE9wZXJhdGlvblNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5leGVjQ29tbWFuZChUZXh0T3BlcmF0aW9uU2VydmljZS5RVUVSWV9URVhUX09QRVJBVElPTlMuQ1JFQVRFX0xJTkssIGZhbHNlLCB1cmwpO1xyXG4gICAgICAgICAgICAgICAgfSwgMTApO1xyXG5cclxuICAgICAgICAgICAgICAgICh0aGlzLmh0bWxFbGVtZW50IGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlID0gXCJcIjtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLnBhcmVudFdyYXBwZXI/LmhpZGUoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGV2ZW50LmtleSA9PSBcIkVzY2FwZVwiICYmIHRoaXMuaXNWaXNpYmxlKSB7XHJcbiAgICAgICAgICAgICAgICAodGhpcy5odG1sRWxlbWVudCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZSA9IFwiXCI7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnBhcmVudFdyYXBwZXI/LmhpZGUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChldmVudCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5jYW5IaWRlICYmICEoZXZlbnQudGFyZ2V0ISBhcyBIVE1MRWxlbWVudCkuY2xvc2VzdChgIyR7dGhpcy5odG1sRWxlbWVudC5pZH1gKSAmJiAhKGV2ZW50LnRhcmdldCEgYXMgSFRNTEVsZW1lbnQpLmNsb3Nlc3QoXCIjZmxvYXRpbmdUb29sYmFyXCIpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnBhcmVudFdyYXBwZXI/LmhpZGUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIChldmVudCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoZXZlbnQua2V5ID09IFwiL1wiKSB7XHJcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuXHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBUZXh0T3BlcmF0aW9uU2VydmljZSB9IGZyb20gXCJAL3NlcnZpY2VzL3RleHQtb3BlcmF0aW9ucy9UZXh0T3BlcmF0aW9uU2VydmljZVwiO1xyXG5pbXBvcnQgeyBCYXNlVUlDb21wb25lbnQgfSBmcm9tIFwiLi4vLi4vY29tbW9uL0Jhc2VVSUNvbXBvbmVudFwiO1xyXG5pbXBvcnQgeyBJbnB1dExpbmtCb3ggfSBmcm9tIFwiLi9JbnB1dExpbmtCb3hcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBJbnB1dExpbmtCb3hXcmFwcGVyIGV4dGVuZHMgQmFzZVVJQ29tcG9uZW50IHtcclxuXHJcbiAgICBpbnB1dExpbmtCb3g6IElucHV0TGlua0JveDtcclxuICAgIHJhbmdlPzogUmFuZ2U7XHJcbiAgICBoaWdobGlnaHRzOiBIVE1MRGl2RWxlbWVudFtdID0gW107XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgY29uc3QgaW5wdXRMaW5rQm94ID0gbmV3IElucHV0TGlua0JveCgpO1xyXG5cclxuICAgICAgICBzdXBlcih7XHJcbiAgICAgICAgICAgIGlucHV0TGlua0JveDogaW5wdXRMaW5rQm94XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuaW5wdXRMaW5rQm94ID0gaW5wdXRMaW5rQm94O1xyXG4gICAgICAgIHRoaXMuYXR0YWNoRXZlbnQoKTtcclxuICAgICAgICBpbnB1dExpbmtCb3guc2V0UGFyZW50V3JhcHBlcih0aGlzKTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgaW5pdCgpOiBIVE1MRWxlbWVudCB7XHJcbiAgICAgICAgY29uc3QgaHRtbEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG5cclxuICAgICAgICBodG1sRWxlbWVudC5pZCA9IFwibGlua0JveFwiO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcclxuICAgICAgICBodG1sRWxlbWVudC5jbGFzc0xpc3QuYWRkKFwiZGVwZW5kZW50LWJveFwiKTtcclxuICAgICAgICBodG1sRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9IFwiYWJzb2x1dGVcIjtcclxuXHJcbiAgICAgICAgaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5wcm9wcy5pbnB1dExpbmtCb3guaHRtbEVsZW1lbnQpO1xyXG5cclxuICAgICAgICByZXR1cm4gaHRtbEVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgYXR0YWNoRXZlbnQoKTogdm9pZCB7XHJcblxyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJzaG93SW5wdXRMaW5rQm94UmVxdWVzdGVkXCIsICgpID0+IHtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuc2hvdygpO1xyXG4gICAgICAgICAgICB0aGlzLmhpZ2hsaWdodFNlbGVjdGVkVGV4dCgpO1xyXG4gICAgICAgICAgICB0aGlzLmlucHV0TGlua0JveC5mb2N1cygpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBoaWRlKCk6IHZvaWQge1xyXG5cclxuICAgICAgICBzdXBlci5oaWRlKCk7XHJcbiAgICAgICAgdGhpcy5yZW1vdmVIaWdobGlnaHRzKCk7XHJcblxyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG5cclxuICAgICAgICAgICAgY29uc3Qgc2hvd0lucHV0TGlua0JveEZpbmlzaGVkID0gbmV3IEN1c3RvbUV2ZW50KCdzaG93SW5wdXRMaW5rQm94RmluaXNoZWQnLCB7XHJcbiAgICAgICAgICAgICAgICBidWJibGVzOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgY2FuY2VsYWJsZTogdHJ1ZVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoc2hvd0lucHV0TGlua0JveEZpbmlzaGVkKTtcclxuICAgICAgICB9LCAwKTtcclxuICAgIH1cclxuXHJcbiAgICBoaWdobGlnaHRTZWxlY3RlZFRleHQoKSB7XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG4gICAgICAgIGlmICghc2VsZWN0aW9uPy5yYW5nZUNvdW50KSByZXR1cm47XHJcblxyXG4gICAgICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XHJcbiAgICAgICAgY29uc3QgcmVjdHMgPSByYW5nZS5nZXRDbGllbnRSZWN0cygpO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlY3RzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlY3QgPSByZWN0c1tpXTtcclxuICAgICAgICAgICAgY29uc3QgaGlnaGxpZ2h0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgICAgIGhpZ2hsaWdodC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XHJcbiAgICAgICAgICAgIGhpZ2hsaWdodC5zdHlsZS5sZWZ0ID0gYCR7cmVjdC5sZWZ0fXB4YDtcclxuICAgICAgICAgICAgaGlnaGxpZ2h0LnN0eWxlLnRvcCA9IGAke3JlY3QudG9wfXB4YDtcclxuICAgICAgICAgICAgaGlnaGxpZ2h0LnN0eWxlLndpZHRoID0gYCR7cmVjdC53aWR0aH1weGA7XHJcbiAgICAgICAgICAgIGhpZ2hsaWdodC5zdHlsZS5oZWlnaHQgPSBgJHtyZWN0LmhlaWdodH1weGA7XHJcbiAgICAgICAgICAgIGhpZ2hsaWdodC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAnI2MyYzJjMic7XHJcbiAgICAgICAgICAgIGhpZ2hsaWdodC5zdHlsZS5vcGFjaXR5ID0gJzAuMyc7XHJcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoaGlnaGxpZ2h0KTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuaGlnaGxpZ2h0cy5wdXNoKGhpZ2hsaWdodCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVtb3ZlSGlnaGxpZ2h0cygpIHtcclxuICAgICAgICB0aGlzLmhpZ2hsaWdodHMuZm9yRWFjaChoaWdobGlnaHQgPT4ge1xyXG4gICAgICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGhpZ2hsaWdodCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5oaWdobGlnaHRzID0gW107XHJcbiAgICB9XHJcblxyXG59IiwiZXhwb3J0IGNsYXNzIFV0aWxzIHtcblxuICAgIHN0YXRpYyBpc1NlbGVjdGVkVGV4dERlc2NlbmRhbnRPZihwYXJlbnRTZWxlY3Rvcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IGRvY3VtZW50LmdldFNlbGVjdGlvbigpO1xuXG4gICAgICAgIGlmICghc2VsZWN0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXNlbGVjdGlvbi5yYW5nZUNvdW50KSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgY29uc3QgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcbiAgICAgICAgbGV0IGVsZW1lbnQ6IE5vZGUgfCBudWxsID0gcmFuZ2Uuc3RhcnRDb250YWluZXI7XG5cbiAgICAgICAgaWYgKGVsZW1lbnQubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgICAgICAgICBlbGVtZW50ID0gZWxlbWVudC5wYXJlbnROb2RlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKGVsZW1lbnQgYXMgRWxlbWVudCkuY2xvc2VzdChwYXJlbnRTZWxlY3RvcikgIT09IG51bGw7XG4gICAgfVxuXG59IiwiaW1wb3J0IHsgQmFzZVVJQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tbW9uL0Jhc2VVSUNvbXBvbmVudCc7XHJcbmltcG9ydCB7IERyb3Bkb3duTWVudSB9IGZyb20gJy4vZHJvcGRvd24tdG9vbC9Ecm9wZG93bk1lbnUnO1xyXG5pbXBvcnQgeyBGbG9hdGluZ1Rvb2xiYXJTZXBhcmF0b3IgfSBmcm9tICcuL3NlcGFyYXRvci9GbG9hdGluZ1Rvb2xiYXJTZXBhcmF0b3InO1xyXG5pbXBvcnQgeyBHcm91cEJ1dHRvbiB9IGZyb20gJy4vZ3JvdXAtYnV0dG9uL0dyb3VwQnV0dG9uJztcclxuaW1wb3J0IHsgSW5wdXRMaW5rQm94V3JhcHBlciB9IGZyb20gJy4vbGluay1ib3gvSW5wdXRMaW5rQm94V3JhcHBlcic7XHJcbmltcG9ydCB7IFV0aWxzIH0gZnJvbSBcIi4uLy4uL3V0aWxpdGllcy9VdGlsc1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIEZsb2F0aW5nVG9vbGJhciBleHRlbmRzIEJhc2VVSUNvbXBvbmVudCB7XHJcblxyXG4gICAgZHJvcGRvd25zOiBEcm9wZG93bk1lbnVbXTtcclxuICAgIGN1cnJlbnRTZWxlY3Rpb25SYW5nZTogUmFuZ2UgfCBudWxsO1xyXG4gICAgaW5wdXRMaW5rQm94V3JhcHBlcjogSW5wdXRMaW5rQm94V3JhcHBlcjtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuXHJcbiAgICAgICAgY29uc3QgaW5wdXRMaW5rQm94V3JhcHBlciA9IG5ldyBJbnB1dExpbmtCb3hXcmFwcGVyKCk7XHJcblxyXG4gICAgICAgIHN1cGVyKHtcclxuICAgICAgICAgICAgaW5wdXRMaW5rQm94V3JhcHBlcjogaW5wdXRMaW5rQm94V3JhcHBlclxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmlucHV0TGlua0JveFdyYXBwZXIgPSBpbnB1dExpbmtCb3hXcmFwcGVyO1xyXG4gICAgICAgIHRoaXMuYXR0YWNoRXZlbnRzKCk7XHJcbiAgICAgICAgdGhpcy5kcm9wZG93bnMgPSBbXTtcclxuICAgICAgICB0aGlzLmN1cnJlbnRTZWxlY3Rpb25SYW5nZSA9IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdCgpOiBIVE1MRWxlbWVudCB7XHJcblxyXG4gICAgICAgIGNvbnN0IGh0bWxFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcblxyXG4gICAgICAgIGh0bWxFbGVtZW50LmlkID0gJ2Zsb2F0aW5nVG9vbGJhcic7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuICAgICAgICBodG1sRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdzb2Z0LWJveC1zaGFkb3cnKTtcclxuXHJcbiAgICAgICAgY29uc3Qgc2VsZWN0V3JhcHBlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgIHNlbGVjdFdyYXBwZXIuY2xhc3NMaXN0LmFkZCgnc2VsZWN0LXdyYXBwZXInKTtcclxuXHJcbiAgICAgICAgaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQoc2VsZWN0V3JhcHBlcik7XHJcblxyXG4gICAgICAgIGNvbnN0IGVkaXRvciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiam9oYW5uZXNFZGl0b3JcIik7XHJcblxyXG4gICAgICAgIGVkaXRvcj8uYXBwZW5kQ2hpbGQodGhpcy5wcm9wcy5pbnB1dExpbmtCb3hXcmFwcGVyLmh0bWxFbGVtZW50KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGh0bWxFbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBkaXNwbGF5KCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuICdmbGV4JztcclxuICAgIH1cclxuXHJcbiAgICBzaG93KCk6IHZvaWQge1xyXG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcclxuXHJcbiAgICAgICAgICAgIGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05lbmh1bWEgc2VsZcOnw6NvIGVuY29udHJhZGEnKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50U2VsZWN0aW9uUmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlY3QgPSByYW5nZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRXaWR0aCA9IHRoaXMuaHRtbEVsZW1lbnQub2Zmc2V0V2lkdGg7XHJcbiAgICAgICAgICAgIGxldCBsZWZ0UG9zaXRpb24gPSByZWN0LmxlZnQgKyB3aW5kb3cuc2Nyb2xsWCAtIDUwO1xyXG5cclxuICAgICAgICAgICAgaWYgKGxlZnRQb3NpdGlvbiArIGVsZW1lbnRXaWR0aCA+IHdpbmRvdy5pbm5lcldpZHRoKSB7XHJcbiAgICAgICAgICAgICAgICBsZWZ0UG9zaXRpb24gPSB3aW5kb3cuaW5uZXJXaWR0aCAtIGVsZW1lbnRXaWR0aCAtIDIwO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCBlbGVtZW50SGVpZ2h0ID0gdGhpcy5odG1sRWxlbWVudC5vZmZzZXRIZWlnaHQ7XHJcbiAgICAgICAgICAgIGxldCB0b3BQb3NpdGlvbiA9IHJlY3QudG9wICsgd2luZG93LnNjcm9sbFkgLSBlbGVtZW50SGVpZ2h0IC0gMTA7XHJcblxyXG4gICAgICAgICAgICBpZiAodG9wUG9zaXRpb24gPCAwKSB7XHJcbiAgICAgICAgICAgICAgICB0b3BQb3NpdGlvbiA9IHJlY3QuYm90dG9tICsgd2luZG93LnNjcm9sbFkgKyAxMDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5odG1sRWxlbWVudC5zdHlsZS5sZWZ0ID0gYCR7bGVmdFBvc2l0aW9ufXB4YDtcclxuICAgICAgICAgICAgdGhpcy5odG1sRWxlbWVudC5zdHlsZS50b3AgPSBgJHt0b3BQb3NpdGlvbn1weGA7XHJcblxyXG4gICAgICAgICAgICBzdXBlci5zaG93KCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaGlkZSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmN1cnJlbnRTZWxlY3Rpb25SYW5nZSA9IG51bGw7XHJcbiAgICAgICAgc3VwZXIuaGlkZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGFwcGVuZERyb3Bkb3duKGRyb3Bkb3duOiBEcm9wZG93bk1lbnUpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmRyb3Bkb3ducy5wdXNoKGRyb3Bkb3duKVxyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQoZHJvcGRvd24uaHRtbEVsZW1lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIGFwcGVuZFNlcGFyYXRvcihzZXBhcmF0b3I6IEZsb2F0aW5nVG9vbGJhclNlcGFyYXRvcik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQoc2VwYXJhdG9yLmh0bWxFbGVtZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBhcHBlbmRUZXh0VG9vbGJhcihidXR0b246IEdyb3VwQnV0dG9uKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5hcHBlbmRDaGlsZChidXR0b24uaHRtbEVsZW1lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIGFueURyb3Bkb3duVmlzaWJsZSgpOiBib29sZWFuIHtcclxuICAgICAgICBmb3IgKGNvbnN0IGRyb3Bkb3duIG9mIHRoaXMuZHJvcGRvd25zKSB7XHJcbiAgICAgICAgICAgIGlmIChkcm9wZG93bi5kcm9wZG93bkxpc3QuaXNWaXNpYmxlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGhpZGVBbGxEcm9wZG93blZpc2libGUoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgZm9yIChjb25zdCBkcm9wZG93biBvZiB0aGlzLmRyb3Bkb3ducykge1xyXG4gICAgICAgICAgICBpZiAoZHJvcGRvd24uZHJvcGRvd25MaXN0LmNhbkhpZGUpIHtcclxuICAgICAgICAgICAgICAgIGRyb3Bkb3duLmRyb3Bkb3duTGlzdC5oaWRlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBhdHRhY2hFdmVudHMoKSB7XHJcblxyXG5cclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwic2hvd0lucHV0TGlua0JveFJlcXVlc3RlZFwiLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuY2FuSGlkZSA9IGZhbHNlO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwic2hvd0lucHV0TGlua0JveEZpbmlzaGVkXCIsICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5jYW5IaWRlID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5yZXN0b3JlUmFuZ2VTZWxlY3Rpb24oKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChldmVudCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5jYW5IaWRlICYmIChldmVudC5rZXkgPT09ICdFc2NhcGUnKSkge1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmFueURyb3Bkb3duVmlzaWJsZSgpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWRlQWxsRHJvcGRvd25WaXNpYmxlKCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGlmICh0aGlzLmNhbkhpZGUgJiYgKGV2ZW50LmtleSA9PT0gJ0Fycm93TGVmdCcgfHwgZXZlbnQua2V5ID09PSAnQXJyb3dSaWdodCcgfHwgZXZlbnQua2V5ID09PSAnQXJyb3dVcCcgfHwgZXZlbnQua2V5ID09PSAnQXJyb3dEb3duJykpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzU2VsZWN0aW9uRW1wdHkoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZXZlbnQpID0+IHtcclxuICAgICAgICAvLyAgICAgaWYgKChldmVudC5rZXkgPT09ICdFc2NhcGUnIHx8IGV2ZW50LmtleSA9PT0gJ0RlbGV0ZScpICYmIHRoaXMuaXNWaXNpYmxlKSB7XHJcbiAgICAgICAgLy8gICAgICAgICBpZih0aGlzLmNhbkhpZGUpe1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIHRoaXMuaGlkZUFsbERyb3Bkb3duVmlzaWJsZSgpO1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xyXG4gICAgICAgIC8vICAgICAgICAgfVxyXG4gICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgLy8gfSk7XHJcblxyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleXVwJywgKGV2ZW50KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChldmVudC5rZXkgPT09IFwiU2hpZnRcIiB8fCBldmVudC5rZXkgPT09IFwiQ29udHJvbFwiKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHdpbmRvdy5nZXRTZWxlY3Rpb24oKSEudG9TdHJpbmcoKS50cmltKCkgIT09ICcnKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChVdGlscy5pc1NlbGVjdGVkVGV4dERlc2NlbmRhbnRPZihcIi50aXRsZVwiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3coKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChldmVudCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5jYW5IaWRlICYmICEoZXZlbnQudGFyZ2V0ISBhcyBIVE1MRWxlbWVudCkuY2xvc2VzdChgIyR7dGhpcy5odG1sRWxlbWVudC5pZH1gKSAmJiAhdGhpcy5hbnlEcm9wZG93blZpc2libGUoKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5oaWRlKCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc1Zpc2libGUgJiYgIShldmVudC50YXJnZXQhIGFzIEhUTUxFbGVtZW50KS5jbG9zZXN0KGAjJHt0aGlzLmh0bWxFbGVtZW50LmlkfWApICYmICF0aGlzLmlucHV0TGlua0JveFdyYXBwZXIuaXNWaXNpYmxlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlc3RvcmVSYW5nZVNlbGVjdGlvbigpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCAoZXZlbnQpID0+IHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmlzVmlzaWJsZSkge1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIHdhaXQgdGhlIHNlbGVjdGlvbiB0byBiZSByZWZsZWN0ZWQgaW4gdGhlIERPTVxyXG4gICAgICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHdpbmRvdy5nZXRTZWxlY3Rpb24oKSEudG9TdHJpbmcoKS50cmltKCkgIT09ICcnKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoVXRpbHMuaXNTZWxlY3RlZFRleHREZXNjZW5kYW50T2YoXCIudGl0bGVcIikpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3coKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdzZWxlY3RlZEJsb2NrRGVsZXRlZCcsIChldmVudCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5jYW5IaWRlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhpZGUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdyZXF1ZXN0SGlkZUZsb2F0aW5nVG9vbGJhcicsICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuY2FuSGlkZSkge1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmFueURyb3Bkb3duVmlzaWJsZSgpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWRlQWxsRHJvcGRvd25WaXNpYmxlKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5oaWRlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgaXNTZWxlY3Rpb25FbXB0eSgpIHtcclxuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSBkb2N1bWVudC5nZXRTZWxlY3Rpb24oKTtcclxuICAgICAgICByZXR1cm4gIXNlbGVjdGlvbiB8fCBzZWxlY3Rpb24ucmFuZ2VDb3VudCA9PT0gMCB8fCBzZWxlY3Rpb24udG9TdHJpbmcoKS50cmltKCkgPT09ICcnO1xyXG4gICAgfVxyXG5cclxuICAgIHJlc3RvcmVSYW5nZVNlbGVjdGlvbigpOiB2b2lkIHtcclxuICAgICAgICBkb2N1bWVudC5nZXRTZWxlY3Rpb24oKT8ucmVtb3ZlQWxsUmFuZ2VzKCk7XHJcbiAgICAgICAgZG9jdW1lbnQuZ2V0U2VsZWN0aW9uKCk/LmFkZFJhbmdlKHRoaXMuY3VycmVudFNlbGVjdGlvblJhbmdlISk7XHJcbiAgICB9XHJcbn1cclxuXHJcblxyXG4iLCJpbXBvcnQgeyBJVGV4dE9wZXJhdGlvblNlcnZpY2UgfSBmcm9tIFwiQC9zZXJ2aWNlcy90ZXh0LW9wZXJhdGlvbnMvSVRleHRPcGVyYXRpb25TZXJ2aWNlXCI7XHJcbmltcG9ydCB7IEJhc2VVSUNvbXBvbmVudCB9IGZyb20gXCIuLi8uLi9jb21tb24vQmFzZVVJQ29tcG9uZW50XCI7XHJcbmltcG9ydCB7IERyb3Bkb3duTWVudUxpc3QgfSBmcm9tIFwiLi9Ecm9wZG93bk1lbnVMaXN0XCI7XHJcbmltcG9ydCB7IFNWR0ljb24gfSBmcm9tIFwiQC9jb21wb25lbnRzL2NvbW1vbi9TVkdJY29uXCI7XHJcbmltcG9ydCB7IFRleHRPcGVyYXRpb25TZXJ2aWNlIH0gZnJvbSBcIkAvc2VydmljZXMvdGV4dC1vcGVyYXRpb25zL1RleHRPcGVyYXRpb25TZXJ2aWNlXCI7XHJcbmltcG9ydCB7IElEcm9wZG93bk1lbnVJdGVtIH0gZnJvbSBcIi4vSURyb3Bkb3duTWVudUl0ZW1cIjtcclxuaW1wb3J0IHsgSk5vZGUgfSBmcm9tIFwiQC9jb21tb24vSk5vZGVcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBEcm9wZG93bk1lbnVMaXN0SXRlbSBleHRlbmRzIEJhc2VVSUNvbXBvbmVudCBpbXBsZW1lbnRzIElEcm9wZG93bk1lbnVJdGVtIHtcclxuXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRleHRPcGVyYXRpb25TZXJ2aWNlOiBJVGV4dE9wZXJhdGlvblNlcnZpY2U7XHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbW1hbmQ6IHN0cmluZztcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgdmFsdWU6IHN0cmluZyB8IG51bGw7XHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGFjdGl2ZUljb24/OiBTVkdJY29uO1xyXG5cclxuICAgIHBhcmVudERyb3Bkb3duTWVudUxpc3Q6IERyb3Bkb3duTWVudUxpc3Q7XHJcblxyXG4gICAgY29uc3RydWN0b3IoaWQ6IHN0cmluZywgcGFyZW50RHJvcGRvd25NZW51TGlzdDogRHJvcGRvd25NZW51TGlzdCwgdGV4dE9wZXJhdGlvbnNTZXJ2aWNlOiBJVGV4dE9wZXJhdGlvblNlcnZpY2UsIGNvbW1hbmQ6IHN0cmluZywgdmFsdWU6IHN0cmluZyB8IG51bGwsIGxlZnRJY29uOiBIVE1MRWxlbWVudCB8IFNWR0VsZW1lbnQsIHRpdGxlOiBzdHJpbmcsIHNob3J0Y3V0OiBzdHJpbmcgfCBudWxsID0gbnVsbCkge1xyXG5cclxuICAgICAgICBjb25zdCBpY29uID0gbmV3IFNWR0ljb24oXCJpY29uLW1hdGVyaWFsLXNtYWxsLWNoZWNrXCIpO1xyXG4gICAgICAgIGljb24uaHRtbEVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9IFwiaGlkZGVuXCI7XHJcblxyXG4gICAgICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICAgICAgICBsZWZ0SWNvbi5zdHlsZS5jb2xvciA9IHZhbHVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc3VwZXIoe1xyXG4gICAgICAgICAgICBpZDogaWQsXHJcbiAgICAgICAgICAgIGxlZnRJY29uOiBsZWZ0SWNvbixcclxuICAgICAgICAgICAgdGl0bGU6IHRpdGxlLFxyXG4gICAgICAgICAgICBpY29uOiBpY29uLFxyXG4gICAgICAgICAgICBzaG9ydGN1dDogc2hvcnRjdXRcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5jb21tYW5kID0gY29tbWFuZDtcclxuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy50ZXh0T3BlcmF0aW9uU2VydmljZSA9IHRleHRPcGVyYXRpb25zU2VydmljZTtcclxuICAgICAgICB0aGlzLnBhcmVudERyb3Bkb3duTWVudUxpc3QgPSBwYXJlbnREcm9wZG93bk1lbnVMaXN0O1xyXG4gICAgICAgIHRoaXMuYWN0aXZlSWNvbiA9IGljb247XHJcblxyXG4gICAgICAgIHRoaXMuYXR0YWNoRXZlbnQoKTtcclxuICAgIH1cclxuXHJcbiAgICBmb2N1cygpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ29wdGlvbi1mb2N1c2VkJyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVtb3ZlRm9jdXMoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdvcHRpb24tZm9jdXNlZCcpO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXQoKTogSFRNTEVsZW1lbnQge1xyXG5cclxuICAgICAgICBjb25zdCBodG1sRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpJyk7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuaWQgPSB0aGlzLnByb3BzLmlkO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ29wdGlvbicsICdvcHRpb24taG92ZXInLCAnYmxvY2stb3BlcmF0aW9uJyk7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQudGFiSW5kZXggPSAyO1xyXG5cclxuICAgICAgICBodG1sRWxlbWVudC5zdHlsZS5jb2xvciA9IFwiIzM3MzUyRlwiO1xyXG5cclxuICAgICAgICBjb25zdCB0ZXh0T3B0aW9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgdGV4dE9wdGlvbi5jbGFzc0xpc3QuYWRkKCd0ZXh0LW9wdGlvbicpO1xyXG5cclxuICAgICAgICB0ZXh0T3B0aW9uLmFwcGVuZENoaWxkKHRoaXMucHJvcHMubGVmdEljb24pO1xyXG5cclxuICAgICAgICBjb25zdCBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xyXG4gICAgICAgIHNwYW4uaW5uZXJUZXh0ID0gdGhpcy5wcm9wcy50aXRsZTtcclxuXHJcbiAgICAgICAgdGV4dE9wdGlvbi5hcHBlbmRDaGlsZChzcGFuKTtcclxuXHJcbiAgICAgICAgaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQodGV4dE9wdGlvbik7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5wcm9wcy5pY29uLmh0bWxFbGVtZW50KTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMucHJvcHMuc2hvcnRjdXQpIHtcclxuICAgICAgICAgICAgY29uc3Qgc2hvcnRDdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcclxuICAgICAgICAgICAgc2hvcnRDdXQuaW5uZXJUZXh0ID0gdGhpcy5wcm9wcy5zaG9ydGN1dDtcclxuICAgICAgICAgICAgc2hvcnRDdXQuc3R5bGUuY29sb3IgPSBcInJnYmEoNTUsIDUzLCA0NywgMC41KVwiXHJcblxyXG4gICAgICAgICAgICBodG1sRWxlbWVudC5hcHBlbmRDaGlsZChzaG9ydEN1dCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gaHRtbEVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgcGVyZm9ybUFjdGlvbigpOiB2b2lkIHtcclxuXHJcbiAgICAgICAgdGhpcy50ZXh0T3BlcmF0aW9uU2VydmljZS5leGVjQ29tbWFuZCh0aGlzLmNvbW1hbmQsIGZhbHNlLCB0aGlzLnZhbHVlKTtcclxuXHJcbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcclxuICAgICAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG4gICAgICAgICAgICBpZiAoIXNlbGVjdGlvbiB8fCBzZWxlY3Rpb24ucmFuZ2VDb3VudCA9PT0gMCkgcmV0dXJuO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcclxuICAgICAgICAgICAgbGV0IGNvbnRhaW5lcjogTm9kZSB8IG51bGwgPSByYW5nZS5jb21tb25BbmNlc3RvckNvbnRhaW5lcjtcclxuXHJcbiAgICAgICAgICAgIGlmIChjb250YWluZXI/Lm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyID0gY29udGFpbmVyLnBhcmVudE5vZGU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGZvY3VzYWJsZVBhcmVudCA9IChjb250YWluZXIgYXMgSFRNTEVsZW1lbnQpLmNsb3Nlc3QoXCIuZm9jdXNhYmxlXCIpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGZvY3VzYWJsZVBhcmVudCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ub3JtYWxpemVBbmRNZXJnZUVsZW1lbnRzKGZvY3VzYWJsZVBhcmVudCBhcyBIVE1MRWxlbWVudCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBhdHRhY2hFdmVudCgpOiB2b2lkIHtcclxuXHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCAoKSA9PiB7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBub2RlOiBKTm9kZTxJRHJvcGRvd25NZW51SXRlbT4gPSB0aGlzLnBhcmVudERyb3Bkb3duTWVudUxpc3QuZHJvcGRvd25JdGVtcy5maW5kKHRoaXMpITtcclxuXHJcbiAgICAgICAgICAgIHRoaXMucGFyZW50RHJvcGRvd25NZW51TGlzdC5zd2l0Y2hWaXN1YWxGb2N1cyhub2RlISk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5wZXJmb3JtQWN0aW9uKCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG5cclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwic2VsZWN0aW9uY2hhbmdlXCIsICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgdGhpcy5jb21tYW5kID09IFRleHRPcGVyYXRpb25TZXJ2aWNlLlFVRVJZX1RFWFRfT1BFUkFUSU9OUy5ISUxJVEVfQ09MT1IgfHxcclxuICAgICAgICAgICAgICAgIHRoaXMuY29tbWFuZCA9PSBUZXh0T3BlcmF0aW9uU2VydmljZS5RVUVSWV9URVhUX09QRVJBVElPTlMuRk9SRV9DT0xPUikge1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlQ2hlY2tJY29uVmlzaWJpbGl0eSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJjb2xvckNoYW5nZVwiLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgIHRoaXMuY29tbWFuZCA9PSBUZXh0T3BlcmF0aW9uU2VydmljZS5RVUVSWV9URVhUX09QRVJBVElPTlMuSElMSVRFX0NPTE9SIHx8XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbW1hbmQgPT0gVGV4dE9wZXJhdGlvblNlcnZpY2UuUVVFUllfVEVYVF9PUEVSQVRJT05TLkZPUkVfQ09MT1IpIHtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZUNoZWNrSWNvblZpc2liaWxpdHkoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBub3JtYWxpemVBbmRNZXJnZUVsZW1lbnRzKGVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgbnVsbCk6IHZvaWQge1xyXG4gICAgICAgIGlmICghZWxlbWVudCkgcmV0dXJuO1xyXG5cclxuICAgICAgICBsZXQgY2hpbGQgPSBlbGVtZW50LmZpcnN0Q2hpbGQ7XHJcbiAgICAgICAgd2hpbGUgKGNoaWxkKSB7XHJcbiAgICAgICAgICAgIGlmIChjaGlsZC5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubm9ybWFsaXplQW5kTWVyZ2VFbGVtZW50cyhjaGlsZCBhcyBIVE1MRWxlbWVudCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGxldCBuZXh0U2libGluZyA9IGNoaWxkLm5leHRTaWJsaW5nO1xyXG4gICAgICAgICAgICB3aGlsZSAobmV4dFNpYmxpbmcgJiYgdGhpcy5zaG91bGRNZXJnZShjaGlsZCwgbmV4dFNpYmxpbmcpKSB7XHJcbiAgICAgICAgICAgICAgICAoY2hpbGQgYXMgSFRNTEVsZW1lbnQpLmlubmVySFRNTCArPSAobmV4dFNpYmxpbmcgYXMgSFRNTEVsZW1lbnQpLmlubmVySFRNTDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG5leHQgPSBuZXh0U2libGluZy5uZXh0U2libGluZztcclxuICAgICAgICAgICAgICAgIG5leHRTaWJsaW5nLnBhcmVudE5vZGUhLnJlbW92ZUNoaWxkKG5leHRTaWJsaW5nKTtcclxuICAgICAgICAgICAgICAgIG5leHRTaWJsaW5nID0gbmV4dDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY2hpbGQgPSBjaGlsZC5uZXh0U2libGluZztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGVsZW1lbnQubm9ybWFsaXplKCk7XHJcbiAgICB9XHJcblxyXG4gICAgc2hvdWxkTWVyZ2Uobm9kZTE6IENoaWxkTm9kZSwgbm9kZTI6IENoaWxkTm9kZSk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGlmIChub2RlMT8ubm9kZVR5cGUgIT09IE5vZGUuRUxFTUVOVF9OT0RFIHx8IG5vZGUyPy5ub2RlVHlwZSAhPT0gTm9kZS5FTEVNRU5UX05PREUpIHJldHVybiBmYWxzZTtcclxuICAgICAgICBjb25zdCBlbGVtMSA9IG5vZGUxIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgIGNvbnN0IGVsZW0yID0gbm9kZTIgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgcmV0dXJuIGVsZW0xLnRhZ05hbWUgPT09IGVsZW0yLnRhZ05hbWUgJiZcclxuICAgICAgICAgICAgZWxlbTEuc3R5bGUuY3NzVGV4dCA9PT0gZWxlbTIuc3R5bGUuY3NzVGV4dCAmJlxyXG4gICAgICAgICAgICB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtMSkuY29sb3IgPT09IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsZW0yKS5jb2xvcjtcclxuICAgIH1cclxuXHJcblxyXG4gICAgY2hhbmdlQ2hlY2tJY29uVmlzaWJpbGl0eSgpOiB2b2lkIHtcclxuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodGhpcy50ZXh0T3BlcmF0aW9uU2VydmljZS5xdWVyeUNvbW1hbmRTdGF0ZSh0aGlzLmNvbW1hbmQsIHRoaXMudmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZUljb24/LmNoYW5nZVZpc2liaWxpdHlUb1Zpc2libGUoKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlSWNvbj8uY2hhbmdlVmlzaWJpbGl0eVRvSGlkZGVuKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxufSIsImltcG9ydCB7IEJhc2VVSUNvbXBvbmVudCB9IGZyb20gXCIuLi8uLi9jb21tb24vQmFzZVVJQ29tcG9uZW50XCI7XHJcbmltcG9ydCB7IENpcmN1bGFyRG91Ymx5TGlua2VkTGlzdCB9IGZyb20gXCIuLi8uLi8uLi9jb21tb24vQ2lyY3VsYXJEb3VibHlMaW5rZWRMaXN0XCI7XHJcbmltcG9ydCB7IERyb3Bkb3duTWVudUxpc3RJdGVtIH0gZnJvbSBcIi4vRHJvcGRvd25NZW51TGlzdEl0ZW1cIjtcclxuaW1wb3J0IHsgSURyb3Bkb3duTWVudUl0ZW0gfSBmcm9tIFwiLi9JRHJvcGRvd25NZW51SXRlbVwiO1xyXG5pbXBvcnQgeyBKTm9kZSB9IGZyb20gXCJAL2NvbW1vbi9KTm9kZVwiO1xyXG5pbXBvcnQgeyBEcm9wZG93bk1lbnVCdXR0b24gfSBmcm9tIFwiLi9Ecm9wZG93bk1lbnVCdXR0b25cIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBEcm9wZG93bk1lbnVMaXN0IGV4dGVuZHMgQmFzZVVJQ29tcG9uZW50IHtcclxuXHJcbiAgICBwcml2YXRlIHBhcmVudERyb3Bkb3duUGFyZW50QnV0dG9uPzogRHJvcGRvd25NZW51QnV0dG9uO1xyXG5cclxuICAgIGRyb3Bkb3duSXRlbXM6IENpcmN1bGFyRG91Ymx5TGlua2VkTGlzdDxJRHJvcGRvd25NZW51SXRlbT47XHJcbiAgICBjdXJyZW50Rm9jdXNlZE1lbnVJdGVtOiBKTm9kZTxJRHJvcGRvd25NZW51SXRlbT4gfCBudWxsO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGlkOiBzdHJpbmcpIHtcclxuICAgICAgICBzdXBlcih7XHJcbiAgICAgICAgICAgIGlkOiBpZFxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmRyb3Bkb3duSXRlbXMgPSBuZXcgQ2lyY3VsYXJEb3VibHlMaW5rZWRMaXN0PERyb3Bkb3duTWVudUxpc3RJdGVtPigpO1xyXG4gICAgICAgIHRoaXMuY3VycmVudEZvY3VzZWRNZW51SXRlbSA9IG51bGw7XHJcblxyXG4gICAgICAgIHRoaXMuYXR0YWNoRXZlbnRzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGRpc3BsYXkoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gJ2ZsZXgnO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXQoKTogSFRNTEVsZW1lbnQge1xyXG5cclxuICAgICAgICBjb25zdCBodG1sRWxlbWVudDogSFRNTFVMaXN0RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3VsJyk7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuaWQgPSB0aGlzLnByb3BzLmlkO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LnNldEF0dHJpYnV0ZSgnbmFtZScsICdibG9jay10eXBlJyk7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuICAgICAgICBodG1sRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdzb2Z0LWJveC1zaGFkb3cnLCAnZGVwZW5kZW50LWJveCcsICdjaGVja2FibGUtaXRlbXMnKTtcclxuICAgICAgICBodG1sRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9IFwiYWJzb2x1dGVcIjtcclxuICAgICAgICBodG1sRWxlbWVudC5zdHlsZS5tYXhIZWlnaHQgPSBcIjI1dm1heFwiO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LnN0eWxlLm92ZXJmbG93WSA9IFwiYXV0b1wiO1xyXG5cclxuICAgICAgICByZXR1cm4gaHRtbEVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgYXBwZW5kKGRyb3Bkb3duSXRlbTogSURyb3Bkb3duTWVudUl0ZW0pOiB2b2lkIHtcclxuXHJcbiAgICAgICAgdGhpcy5kcm9wZG93bkl0ZW1zLmFwcGVuZChkcm9wZG93bkl0ZW0pO1xyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQoZHJvcGRvd25JdGVtLmh0bWxFbGVtZW50KVxyXG4gICAgfVxyXG5cclxuICAgIHNldFBhcmVudERyb3Bkb3duTWVudUJ1dHRvbihkcm9wZG93blBhcmVudEJ1dHRvbjogRHJvcGRvd25NZW51QnV0dG9uKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5wYXJlbnREcm9wZG93blBhcmVudEJ1dHRvbiA9IGRyb3Bkb3duUGFyZW50QnV0dG9uO1xyXG4gICAgfVxyXG5cclxuICAgIGF0dGFjaEV2ZW50cygpOiB2b2lkIHtcclxuXHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChldmVudCkgPT4ge1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuaXNWaXNpYmxlICYmIHRoaXMuY3VycmVudEZvY3VzZWRNZW51SXRlbSAmJiBldmVudC5rZXkgPT09IFwiRW50ZXJcIikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Rm9jdXNlZE1lbnVJdGVtLnZhbHVlLnBlcmZvcm1BY3Rpb24oKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChldmVudCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5jbGlja2VkT3V0c2lkZVRoZURyb3Bkb3duV2hpbGVEcm9wZG93bklzVmlzaWJsZShldmVudCkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZXZlbnQpID0+IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMua2V5UHJlc3NlZE91dHNpZGVUaGVEcm9wZG93bldoaWxlRHJvcGRvd25Jc1Zpc2libGUoZXZlbnQpKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50LmtleSA9PSBcIkFycm93RG93blwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mb2N1c05leHRWaXNpYmxlSXRlbSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChldmVudC5rZXkgPT0gXCJBcnJvd1VwXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZm9jdXNQcmV2aW91c1Zpc2libGVJdGVtKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBzaG93KCk6IHZvaWQge1xyXG5cclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLmxlZnQgPSBcIjBcIjtcclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLnJpZ2h0ID0gXCJhdXRvXCI7XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYodGhpcy5kb2VzRWxlbWVudE92ZXJmbG93U2NyZWVuKXtcclxuICAgICAgICAgICAgdGhpcy5odG1sRWxlbWVudC5zdHlsZS5sZWZ0ID0gXCJhdXRvXCI7XHJcbiAgICAgICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUucmlnaHQgPSBcIjBcIjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMucGFyZW50RHJvcGRvd25QYXJlbnRCdXR0b24/LnN2Z0ljb24/LnNldFVzZVRvKFwiaWNvbi13b3JkcHJlc3MtY2hldnJvbi11cFwiKTtcclxuICAgICAgICBzdXBlci5zaG93KCk7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIGhpZGUoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5wYXJlbnREcm9wZG93blBhcmVudEJ1dHRvbj8uc3ZnSWNvbj8uc2V0VXNlVG8oXCJpY29uLXdvcmRwcmVzcy1jaGV2cm9uLWRvd25cIik7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50Rm9jdXNlZE1lbnVJdGVtPy52YWx1ZS5yZW1vdmVGb2N1cygpO1xyXG4gICAgICAgIHRoaXMuY3VycmVudEZvY3VzZWRNZW51SXRlbSA9IG51bGw7XHJcbiAgICAgICAgc3VwZXIuaGlkZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHN3aXRjaFZpc3VhbEZvY3VzKGl0ZW06IEpOb2RlPElEcm9wZG93bk1lbnVJdGVtPik6IHZvaWQge1xyXG5cclxuICAgICAgICBpZiAodGhpcy5jdXJyZW50Rm9jdXNlZE1lbnVJdGVtID09IGl0ZW0pIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudEZvY3VzZWRNZW51SXRlbSkge1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRGb2N1c2VkTWVudUl0ZW0udmFsdWUucmVtb3ZlRm9jdXMoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuY3VycmVudEZvY3VzZWRNZW51SXRlbSA9IGl0ZW07XHJcbiAgICAgICAgdGhpcy5jdXJyZW50Rm9jdXNlZE1lbnVJdGVtLnZhbHVlLmZvY3VzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBmb2N1c05leHRWaXNpYmxlSXRlbSgpOiB2b2lkIHtcclxuXHJcbiAgICAgICAgbGV0IG5leHRWaXNpYmxlSXRlbTogSk5vZGU8SURyb3Bkb3duTWVudUl0ZW0+IHwgbnVsbDtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudEZvY3VzZWRNZW51SXRlbSkge1xyXG4gICAgICAgICAgICBuZXh0VmlzaWJsZUl0ZW0gPSB0aGlzLmN1cnJlbnRGb2N1c2VkTWVudUl0ZW0uZ2V0TmV4dFNhdGlzZnlpbmcoaXRlbSA9PiBpdGVtIGluc3RhbmNlb2YgRHJvcGRvd25NZW51TGlzdEl0ZW0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIG5leHRWaXNpYmxlSXRlbSA9IHRoaXMuZHJvcGRvd25JdGVtcy5maW5kRmlyc3QoaXRlbSA9PiBpdGVtIGluc3RhbmNlb2YgRHJvcGRvd25NZW51TGlzdEl0ZW0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5zd2l0Y2hWaXN1YWxGb2N1cyhuZXh0VmlzaWJsZUl0ZW0hKTtcclxuICAgIH1cclxuXHJcbiAgICBmb2N1c1ByZXZpb3VzVmlzaWJsZUl0ZW0oKTogdm9pZCB7XHJcblxyXG4gICAgICAgIGxldCBwcmV2aW91c1Zpc2libGVJdGVtOiBKTm9kZTxJRHJvcGRvd25NZW51SXRlbT4gfCBudWxsO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5jdXJyZW50Rm9jdXNlZE1lbnVJdGVtKSB7XHJcbiAgICAgICAgICAgIHByZXZpb3VzVmlzaWJsZUl0ZW0gPSB0aGlzLmN1cnJlbnRGb2N1c2VkTWVudUl0ZW0uZ2V0UHJldmlvdXNTYXRpc2Z5aW5nKGl0ZW0gPT4gaXRlbSBpbnN0YW5jZW9mIERyb3Bkb3duTWVudUxpc3RJdGVtKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBwcmV2aW91c1Zpc2libGVJdGVtID0gdGhpcy5kcm9wZG93bkl0ZW1zLmZpbmRGaXJzdChpdGVtID0+IGl0ZW0gaW5zdGFuY2VvZiBEcm9wZG93bk1lbnVMaXN0SXRlbSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnN3aXRjaFZpc3VhbEZvY3VzKHByZXZpb3VzVmlzaWJsZUl0ZW0hKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNsaWNrZWRPdXRzaWRlVGhlRHJvcGRvd25XaGlsZURyb3Bkb3duSXNWaXNpYmxlKGV2ZW50OiBNb3VzZUV2ZW50KTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FuSGlkZSAmJiAhKGV2ZW50LnRhcmdldCEgYXMgSFRNTEVsZW1lbnQpLmNsb3Nlc3QoYCMke3RoaXMuaHRtbEVsZW1lbnQuaWR9YCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBrZXlQcmVzc2VkT3V0c2lkZVRoZURyb3Bkb3duV2hpbGVEcm9wZG93bklzVmlzaWJsZShldmVudDogS2V5Ym9hcmRFdmVudCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNhbkhpZGUgJiYgIShldmVudC50YXJnZXQhIGFzIEhUTUxFbGVtZW50KS5jbG9zZXN0KGAjJHt0aGlzLmh0bWxFbGVtZW50LmlkfWApO1xyXG4gICAgfVxyXG5cclxufSIsImltcG9ydCB7IEJhc2VVSUNvbXBvbmVudCB9IGZyb20gXCIuLi8uLi9jb21tb24vQmFzZVVJQ29tcG9uZW50XCI7XHJcblxyXG5leHBvcnQgY2xhc3MgRmxvYXRpbmdUb29sYmFyU2VwYXJhdG9yIGV4dGVuZHMgQmFzZVVJQ29tcG9uZW50IHtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBzdXBlcih7fSk7XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdCgpOiBIVE1MRWxlbWVudCB7XHJcblxyXG4gICAgICAgIGNvbnN0IGh0bWxFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuXHJcbiAgICAgICAgaHRtbEVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gXCIyNHB4XCI7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuc3R5bGUud2lkdGggPSBcIjFweFwiO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LnN0eWxlLmJvcmRlclJpZ2h0ID0gXCIxcHggc29saWQgI2QwZDBkMFwiO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LnN0eWxlLm1hcmdpbiA9IFwiYXV0byA2cHhcIjtcclxuXHJcbiAgICAgICAgcmV0dXJuIGh0bWxFbGVtZW50O1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgQmFzZVVJQ29tcG9uZW50IH0gZnJvbSBcIi4uLy4uL2NvbW1vbi9CYXNlVUlDb21wb25lbnRcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBHcm91cEJ1dHRvbiBleHRlbmRzIEJhc2VVSUNvbXBvbmVudCB7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcblxyXG4gICAgICAgIHN1cGVyKHt9KTtcclxuXHJcbiAgICAgICAgLy8gdGhpcy5hdHRhY2hFdmVudHMoKTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0KCk6IEhUTUxFbGVtZW50IHtcclxuXHJcbiAgICAgICAgY29uc3QgaHRtbEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJpdGVtXCIpO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LnN0eWxlLm1hcmdpbkxlZnQgPSBcIjEwcHhcIjtcclxuICAgICAgICBodG1sRWxlbWVudC5zdHlsZS5tYXJnaW5SaWdodCA9IFwiMTBweFwiO1xyXG5cclxuICAgICAgICByZXR1cm4gaHRtbEVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG59IiwiaW1wb3J0IHsgU1ZHSWNvbiB9IGZyb20gXCIuLi8uLi9jb21tb24vU1ZHSWNvblwiO1xuaW1wb3J0IHsgQmFzZVVJQ29tcG9uZW50IH0gZnJvbSBcIi4uLy4uL2NvbW1vbi9CYXNlVUlDb21wb25lbnRcIjtcbmltcG9ydCB7IElDb21tYW5kIH0gZnJvbSBcIi4uLy4uLy4uL3NlcnZpY2VzL2NvbW1vbi9JQ29tbWFuZFwiO1xuaW1wb3J0IHsgVGV4dE9wZXJhdGlvblNlcnZpY2UgfSBmcm9tIFwiQC9zZXJ2aWNlcy90ZXh0LW9wZXJhdGlvbnMvVGV4dE9wZXJhdGlvblNlcnZpY2VcIjtcblxuZXhwb3J0IGNsYXNzIEdyb3VwZWRCdXR0b24gZXh0ZW5kcyBCYXNlVUlDb21wb25lbnQge1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBjb21tYW5kU2VydmljZTogSUNvbW1hbmQ7XG4gICAgcHJpdmF0ZSByZWFkb25seSBjb21tYW5kOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSByZWFkb25seSBzaG93VUk6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSByZWFkb25seSBpY29uOiBTVkdJY29uO1xuXG4gICAgY29uc3RydWN0b3IoY29tbWFuZFNlcnZpY2U6IElDb21tYW5kLCBjb21tYW5kOiBzdHJpbmcsIHRpdGxlOiBzdHJpbmcsIHN2Z0ljb25JZDogc3RyaW5nKSB7XG5cbiAgICAgICAgY29uc3QgaWNvbiA9IG5ldyBTVkdJY29uKHN2Z0ljb25JZCwgXCIxLjI1cmVtXCIsIFwiMS4yNXJlbVwiKTtcblxuICAgICAgICBzdXBlcih7XG4gICAgICAgICAgICB0aXRsZTogdGl0bGUsXG4gICAgICAgICAgICBpY29uOiBpY29uXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuY29tbWFuZFNlcnZpY2UgPSBjb21tYW5kU2VydmljZTtcbiAgICAgICAgdGhpcy5jb21tYW5kID0gY29tbWFuZDtcbiAgICAgICAgdGhpcy5zaG93VUkgPSBjb21tYW5kID09IFRleHRPcGVyYXRpb25TZXJ2aWNlLlFVRVJZX1RFWFRfT1BFUkFUSU9OUy5DUkVBVEVfTElOSztcbiAgICAgICAgdGhpcy5pY29uID0gaWNvbjtcbiAgICAgICAgdGhpcy5hdHRhY2hFdmVudHMoKTtcbiAgICB9XG5cbiAgICBpbml0KCk6IEhUTUxFbGVtZW50IHtcblxuICAgICAgICBjb25zdCBodG1sRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIik7XG5cbiAgICAgICAgaHRtbEVsZW1lbnQucm9sZSA9IFwiYnV0dG9uXCI7XG4gICAgICAgIGh0bWxFbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJlbnRyeVwiLCBcImJ1dHRvbi1yZXNldFwiLCBcInRleHQtZm9ybWF0dGluZy1vcGVyYXRpb25cIiwgXCJvcHRpb24taG92ZXJcIik7XG4gICAgICAgIGh0bWxFbGVtZW50LnRpdGxlID0gdGhpcy5wcm9wcy50aXRsZTtcbiAgICAgICAgaHRtbEVsZW1lbnQudGFiSW5kZXggPSAxO1xuXG4gICAgICAgIGh0bWxFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMucHJvcHMuaWNvbi5odG1sRWxlbWVudCk7XG5cbiAgICAgICAgcmV0dXJuIGh0bWxFbGVtZW50O1xuICAgIH1cblxuXG4gICAgYXR0YWNoRXZlbnRzKCk6IHZvaWQge1xuXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIChldmVudCkgPT4ge1xuXG4gICAgICAgICAgICBjb25zdCBlZGl0YWJsZUVsZW1lbnQgPSB0aGlzLmdldFBhcmVudEVkaXRhYmxlKCk7XG5cbiAgICAgICAgICAgIHRoaXMuY29tbWFuZFNlcnZpY2UuZXhlY0NvbW1hbmQodGhpcy5jb21tYW5kLCB0aGlzLnNob3dVSSk7XG4gICAgICAgICAgICB0aGlzLmNoYW5nZUljb25Db2xvcigpO1xuXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICBlZGl0YWJsZUVsZW1lbnQ/Lm5vcm1hbGl6ZSgpO1xuICAgICAgICAgICAgfSwgMTApO1xuICAgICAgICB9KTtcblxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdzZWxlY3Rpb25jaGFuZ2UnLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcblxuICAgICAgICAgICAgaWYgKCFzZWxlY3Rpb24/LmlzQ29sbGFwc2VkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VJY29uQ29sb3IoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZ2V0UGFyZW50RWRpdGFibGUoKSB7XG5cbiAgICAgICAgbGV0IGN1cnJlbnRCbG9ja1JhbmdlID0gd2luZG93LmdldFNlbGVjdGlvbigpIS5nZXRSYW5nZUF0KDApO1xuXG4gICAgICAgIGxldCBjb21tb25BbmNlc3RvciA9IGN1cnJlbnRCbG9ja1JhbmdlLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyO1xuXG4gICAgICAgIGlmIChjb21tb25BbmNlc3Rvci5ub2RlVHlwZSA9PT0gMykge1xuICAgICAgICAgICAgY29tbW9uQW5jZXN0b3IgPSBjb21tb25BbmNlc3Rvci5wYXJlbnROb2RlITtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGN1cnJlbnRCbG9jayA9IChjb21tb25BbmNlc3RvciBhcyBIVE1MRWxlbWVudCkuY2xvc2VzdCgnLmVkaXRhYmxlJyk7XG5cbiAgICAgICAgcmV0dXJuIGN1cnJlbnRCbG9jaztcbiAgICB9XG5cbiAgICBjaGFuZ2VJY29uQ29sb3IoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmNvbW1hbmRTZXJ2aWNlLnF1ZXJ5Q29tbWFuZFN0YXRlKHRoaXMuY29tbWFuZCkpIHtcbiAgICAgICAgICAgIHRoaXMuaWNvbi5jaGFuZ2VDb2xvcihcIiMyMzgyZTJcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmljb24uY2hhbmdlQ29sb3IoXCJyZ2JhKDU1LCA1MywgNDcsIDAuODUpXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsImltcG9ydCB7IEJhc2VVSUNvbXBvbmVudCB9IGZyb20gXCIuLi8uLi9jb21tb24vQmFzZVVJQ29tcG9uZW50XCI7O1xyXG5cclxuZXhwb3J0IGNsYXNzIENvbG9ySWNvbiBleHRlbmRzIEJhc2VVSUNvbXBvbmVudCB7XHJcblxyXG4gICAgY29uc3RydWN0b3IoY29sb3I6IHN0cmluZykge1xyXG4gICAgICAgIHN1cGVyKHtcclxuICAgICAgICAgICAgY29sb3I6IGNvbG9yXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdCgpOiBIVE1MRWxlbWVudCB7XHJcblxyXG4gICAgICAgIGNvbnN0IGh0bWxFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuXHJcbiAgICAgICAgaHRtbEVsZW1lbnQuc3R5bGUud2lkdGggPSBcIjEuMjVyZW1cIjtcclxuICAgICAgICBodG1sRWxlbWVudC5zdHlsZS5oZWlnaHQgPSBcIjEuMjVyZW1cIjtcclxuICAgICAgICBodG1sRWxlbWVudC5zdHlsZS5ib3JkZXJSYWRpdXMgPSBcIjUwJVwiO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LnN0eWxlLmJhY2tncm91bmRDb2xvciA9IHRoaXMucHJvcHMuY29sb3I7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuc3R5bGUuYm9yZGVyID0gXCIxcHggc29saWQgI2QwZDBkMFwiO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LnN0eWxlLmJveFNpemluZyA9IFwiYm9yZGVyLWJveFwiO1xyXG5cclxuICAgICAgICByZXR1cm4gaHRtbEVsZW1lbnQ7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBTVkdJY29uIH0gZnJvbSBcIi4uLy4uL2NvbW1vbi9TVkdJY29uXCI7XHJcbmltcG9ydCB7IEJhc2VVSUNvbXBvbmVudCB9IGZyb20gXCIuLi8uLi9jb21tb24vQmFzZVVJQ29tcG9uZW50XCI7XHJcbmltcG9ydCB7IERyb3Bkb3duTWVudUxpc3QgfSBmcm9tIFwiLi9Ecm9wZG93bk1lbnVMaXN0XCI7XHJcblxyXG5leHBvcnQgY2xhc3MgRHJvcGRvd25NZW51QnV0dG9uIGV4dGVuZHMgQmFzZVVJQ29tcG9uZW50IHtcclxuXHJcbiAgICBkcm9wZG93bkxpc3Q6IERyb3Bkb3duTWVudUxpc3Q7XHJcbiAgICBzdmdJY29uPzogU1ZHSWNvbjtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihpZDogc3RyaW5nLCB0aXRsZTogc3RyaW5nIHwgSFRNTEVsZW1lbnQsIGRyb3Bkb3duTGlzdDogRHJvcGRvd25NZW51TGlzdCwgaW5jbHVkZUNoZXZyb25JY29uOiBib29sZWFuID0gdHJ1ZSkge1xyXG5cclxuICAgICAgICBjb25zdCBzdmdJY29uID0gbmV3IFNWR0ljb24oXCJpY29uLXdvcmRwcmVzcy1jaGV2cm9uLWRvd25cIik7XHJcblxyXG4gICAgICAgIHN1cGVyKHtcclxuICAgICAgICAgICAgaWQ6IGlkLFxyXG4gICAgICAgICAgICB0aXRsZTogdGl0bGUsXHJcbiAgICAgICAgICAgIGRyb3Bkb3duTGlzdDogZHJvcGRvd25MaXN0LFxyXG4gICAgICAgICAgICBzdmdJY29uOiBpbmNsdWRlQ2hldnJvbkljb24gPyBzdmdJY29uIDogbnVsbFxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmRyb3Bkb3duTGlzdCA9IGRyb3Bkb3duTGlzdDtcclxuICAgICAgICB0aGlzLnN2Z0ljb24gPSBzdmdJY29uO1xyXG4gICAgICAgIHRoaXMuYXR0YWNoRXZlbnRzKCk7XHJcblxyXG4gICAgICAgIGRyb3Bkb3duTGlzdC5zZXRQYXJlbnREcm9wZG93bk1lbnVCdXR0b24odGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdCgpOiBIVE1MRWxlbWVudCB7XHJcblxyXG4gICAgICAgIGNvbnN0IGh0bWxFbGVtZW50OiBIVE1MQnV0dG9uRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LmlkID0gdGhpcy5wcm9wcy5pZDtcclxuICAgICAgICAvLyBodG1sRWxlbWVudC50aXRsZSA9IHRoaXMucHJvcHMudGl0bGVcclxuICAgICAgICBodG1sRWxlbWVudC5yb2xlID0gXCJidXR0b25cIjtcclxuICAgICAgICBodG1sRWxlbWVudC5jbGFzc0xpc3QuYWRkKFwiYnV0dG9uLXJlc2V0XCIsIFwidGV4dC1mb3JtYXR0aW5nLXNlbGVjdC1idXR0b25cIiwgXCJ0ZXh0LWZvcm1hdHRpbmctb3BlcmF0aW9uXCIsIFwib3B0aW9uLWhvdmVyXCIpO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LnRhYkluZGV4ID0gMTtcclxuICAgICAgICBodG1sRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9IFwicmVsYXRpdmVcIjtcclxuICAgICAgICBodG1sRWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJhcmlhLWNvbnRyb2xzXCIsIHRoaXMucHJvcHMuZHJvcGRvd25MaXN0Lmh0bWxFbGVtZW50LmlkKTtcclxuXHJcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnByb3BzLnRpdGxlID09PSBcInN0cmluZ1wiKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XHJcbiAgICAgICAgICAgIHNwYW4udGV4dENvbnRlbnQgPSB0aGlzLnByb3BzLnRpdGxlO1xyXG4gICAgICAgICAgICBodG1sRWxlbWVudC5hcHBlbmRDaGlsZChzcGFuKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBodG1sRWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLnByb3BzLnRpdGxlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnByb3BzLnN2Z0ljb24pIHtcclxuICAgICAgICAgICAgaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5wcm9wcy5zdmdJY29uLmh0bWxFbGVtZW50KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBodG1sRWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICBhdHRhY2hFdmVudHMoKTogdm9pZCB7XHJcblxyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmRyb3Bkb3duTGlzdC5pc1Zpc2libGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZHJvcGRvd25MaXN0LnNob3coKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgIH1cclxufSIsImltcG9ydCB7IEJhc2VVSUNvbXBvbmVudCB9IGZyb20gXCIuLi8uLi9jb21tb24vQmFzZVVJQ29tcG9uZW50XCI7XHJcbmltcG9ydCB7IERyb3Bkb3duTWVudUxpc3QgfSBmcm9tIFwiLi9Ecm9wZG93bk1lbnVMaXN0XCI7XHJcbmltcG9ydCB7IElEcm9wZG93bk1lbnVJdGVtIH0gZnJvbSBcIi4vSURyb3Bkb3duTWVudUl0ZW1cIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBEcm9wZG93bk1lbnVMaXN0SXRlbVRpdGxlIGV4dGVuZHMgQmFzZVVJQ29tcG9uZW50IGltcGxlbWVudHMgSURyb3Bkb3duTWVudUl0ZW0ge1xyXG5cclxuXHJcbiAgICBwYXJlbnREcm9wZG93bk1lbnVMaXN0OiBEcm9wZG93bk1lbnVMaXN0O1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHBhcmVudERyb3Bkb3duTWVudUxpc3Q6IERyb3Bkb3duTWVudUxpc3QsIHRpdGxlOiBzdHJpbmcpIHtcclxuXHJcbiAgICAgICAgc3VwZXIoe1xyXG4gICAgICAgICAgICB0aXRsZTogdGl0bGVcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5wYXJlbnREcm9wZG93bk1lbnVMaXN0ID0gcGFyZW50RHJvcGRvd25NZW51TGlzdDtcclxuICAgIH1cclxuXHJcbiAgICBwZXJmb3JtQWN0aW9uKCk6IHZvaWQge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1ldGhvZCBub3QgaW1wbGVtZW50ZWQuXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbW92ZUZvY3VzKCk6IHZvaWQge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1ldGhvZCBub3QgaW1wbGVtZW50ZWQuXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIGZvY3VzKCk6IHZvaWQge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1ldGhvZCBub3QgaW1wbGVtZW50ZWQuXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXQoKTogSFRNTEVsZW1lbnQge1xyXG5cclxuICAgICAgICBjb25zdCBodG1sRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpJyk7XHJcblxyXG4gICAgICAgIGNvbnN0IHRpdGxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaDMnKTtcclxuICAgICAgICB0aXRsZS5pbm5lclRleHQgPSB0aGlzLnByb3BzLnRpdGxlO1xyXG5cclxuICAgICAgICBodG1sRWxlbWVudC5hcHBlbmRDaGlsZCh0aXRsZSk7XHJcblxyXG4gICAgICAgIHJldHVybiBodG1sRWxlbWVudDtcclxuICAgIH1cclxufSIsImltcG9ydCB7IERyb3Bkb3duTWVudSB9IGZyb20gXCIuLi9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvZHJvcGRvd24tdG9vbC9Ecm9wZG93bk1lbnVcIjtcclxuaW1wb3J0IHsgRmxvYXRpbmdUb29sYmFyIH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvZmxvYXRpbmctdG9vbGJhci9GbG9hdGluZ1Rvb2xiYXJcIjtcclxuaW1wb3J0IHsgRHJvcGRvd25NZW51TGlzdCB9IGZyb20gXCIuLi9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvZHJvcGRvd24tdG9vbC9Ecm9wZG93bk1lbnVMaXN0XCI7XHJcbmltcG9ydCB7IERyb3Bkb3duTWVudUxpc3RJdGVtIH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvZmxvYXRpbmctdG9vbGJhci9kcm9wZG93bi10b29sL0Ryb3Bkb3duTWVudUxpc3RJdGVtXCI7XHJcbmltcG9ydCB7IFNWR0ljb24gfSBmcm9tIFwiLi4vY29tcG9uZW50cy9jb21tb24vU1ZHSWNvblwiO1xyXG5pbXBvcnQgeyBGbG9hdGluZ1Rvb2xiYXJTZXBhcmF0b3IgfSBmcm9tIFwiLi4vY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL3NlcGFyYXRvci9GbG9hdGluZ1Rvb2xiYXJTZXBhcmF0b3JcIjtcclxuaW1wb3J0IHsgR3JvdXBCdXR0b24gfSBmcm9tIFwiLi4vY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL2dyb3VwLWJ1dHRvbi9Hcm91cEJ1dHRvblwiO1xyXG5pbXBvcnQgeyBHcm91cGVkQnV0dG9uIH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvZmxvYXRpbmctdG9vbGJhci9ncm91cC1idXR0b24vR3JvdXBlZEJ1dHRvblwiO1xyXG5pbXBvcnQgeyBDb2xvckljb24gfSBmcm9tIFwiLi4vY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL2Ryb3Bkb3duLXRvb2wvQ29sb3JJY29uXCI7XHJcbmltcG9ydCB7IFRleHRPcGVyYXRpb25TZXJ2aWNlIH0gZnJvbSBcIi4uL3NlcnZpY2VzL3RleHQtb3BlcmF0aW9ucy9UZXh0T3BlcmF0aW9uU2VydmljZVwiO1xyXG5pbXBvcnQgeyBEcm9wZG93bk1lbnVCdXR0b24gfSBmcm9tIFwiLi4vY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL2Ryb3Bkb3duLXRvb2wvRHJvcGRvd25NZW51QnV0dG9uXCI7XHJcbmltcG9ydCB7IEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UgfSBmcm9tIFwiLi4vc2VydmljZXMvYmxvY2stb3BlcmF0aW9ucy9CbG9ja09wZXJhdGlvbnNTZXJ2aWNlXCI7XHJcbmltcG9ydCB7IERyb3Bkb3duTWVudUxpc3RJdGVtVGl0bGUgfSBmcm9tIFwiQC9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvZHJvcGRvd24tdG9vbC9Ecm9wZG93bk1lbnVMaXN0SXRlbVRpdGxlXCI7XHJcbmltcG9ydCB7IEVsZW1lbnRGYWN0b3J5U2VydmljZSB9IGZyb20gXCJAL3NlcnZpY2VzL2VsZW1lbnQtZmFjdG9yeS9FbGVtZW50RmFjdG9yeVNlcnZpY2VcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBGbG9hdGluZ1Rvb2xiYXJCdWlsZGVyIHtcclxuXHJcbiAgICBzdGF0aWMgYnVpbGQoKTogRmxvYXRpbmdUb29sYmFyIHtcclxuXHJcbiAgICAgICAgY29uc3QgZmxvYXRpbmdCYXIgPSBuZXcgRmxvYXRpbmdUb29sYmFyKCk7XHJcblxyXG4gICAgICAgIGZsb2F0aW5nQmFyLmFwcGVuZERyb3Bkb3duKEZsb2F0aW5nVG9vbGJhckJ1aWxkZXIudHVybkludG9Ecm9wZG93bigpKTtcclxuICAgICAgICBmbG9hdGluZ0Jhci5hcHBlbmRTZXBhcmF0b3IoRmxvYXRpbmdUb29sYmFyQnVpbGRlci5zZXBhcmF0b3IoKSk7XHJcbiAgICAgICAgZmxvYXRpbmdCYXIuYXBwZW5kU2VwYXJhdG9yKEZsb2F0aW5nVG9vbGJhckJ1aWxkZXIuZ3JvdXBCdXR0b24oKSk7XHJcbiAgICAgICAgZmxvYXRpbmdCYXIuYXBwZW5kRHJvcGRvd24oRmxvYXRpbmdUb29sYmFyQnVpbGRlci5jb2xvckRyb3Bkb3duKCkpO1xyXG4gICAgICAgIGZsb2F0aW5nQmFyLmFwcGVuZFNlcGFyYXRvcihGbG9hdGluZ1Rvb2xiYXJCdWlsZGVyLnNlcGFyYXRvcigpKTtcclxuICAgICAgICBmbG9hdGluZ0Jhci5hcHBlbmREcm9wZG93bihGbG9hdGluZ1Rvb2xiYXJCdWlsZGVyLm1vcmVPcHRpb25zRHJvcGRvd24oKSk7XHJcblxyXG4gICAgICAgIHJldHVybiBmbG9hdGluZ0JhcjtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgdHVybkludG9Ecm9wZG93bigpOiBEcm9wZG93bk1lbnUge1xyXG5cclxuICAgICAgICBjb25zdCB0dXJuSW50b0Jhckxpc3QgPSBuZXcgRHJvcGRvd25NZW51TGlzdChcInR1cm5JbnRvU2VsZWN0XCIpO1xyXG4gICAgICAgIGNvbnN0IHR1cm5JbnRvQmFyQnV0dG9uID0gbmV3IERyb3Bkb3duTWVudUJ1dHRvbihcInR1cm5JbnRvQnV0dG9uXCIsIFwiVGV4dFwiLCB0dXJuSW50b0Jhckxpc3QpO1xyXG4gICAgICAgIGNvbnN0IHR1cm5JbnRvRHJvcGRvd24gPSBuZXcgRHJvcGRvd25NZW51KHR1cm5JbnRvQmFyQnV0dG9uLCB0dXJuSW50b0Jhckxpc3QpO1xyXG5cclxuICAgICAgICB0dXJuSW50b0Jhckxpc3QuYXBwZW5kKG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbVRpdGxlKHR1cm5JbnRvQmFyTGlzdCwgXCJUdXJuIGludG9cIikpO1xyXG5cclxuICAgICAgICB0dXJuSW50b0Jhckxpc3QuYXBwZW5kKG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcInR1cm5JbnRvT3B0aW9uVGV4dFwiLCB0dXJuSW50b0Jhckxpc3QsIEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuZ2V0SW5zdGFuY2UoKSwgQmxvY2tPcGVyYXRpb25zU2VydmljZS5CTE9DS19PUEVSQVRJT05TLlRSQU5TRk9STV9CTE9DSywgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuUEFSQUdSQVBILCBTVkdJY29ucy5wYXJhZ3JhcGguaHRtbEVsZW1lbnQsIFwiVGV4dFwiLCBcIkN0cmwrU2hpZnQrRW50ZXJcIikpO1xyXG4gICAgICAgIHR1cm5JbnRvQmFyTGlzdC5hcHBlbmQobmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwidHVybkludG9PcHRpb25Ub2RvTGlzdFwiLCB0dXJuSW50b0Jhckxpc3QsIEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuZ2V0SW5zdGFuY2UoKSwgQmxvY2tPcGVyYXRpb25zU2VydmljZS5CTE9DS19PUEVSQVRJT05TLlRSQU5TRk9STV9CTE9DSywgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuQ0hFQ0tfTElTVCwgU1ZHSWNvbnMudG9kb19saXN0Lmh0bWxFbGVtZW50LCBcIlRvZG8gbGlzdFwiLCBcIkN0cmwrMVwiKSk7XHJcbiAgICAgICAgdHVybkludG9CYXJMaXN0LmFwcGVuZChuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW0oXCJ0dXJuSW50b09wdGlvbkJ1bGxldGVkTGlzdFwiLCB0dXJuSW50b0Jhckxpc3QsIEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuZ2V0SW5zdGFuY2UoKSwgQmxvY2tPcGVyYXRpb25zU2VydmljZS5CTE9DS19PUEVSQVRJT05TLlRSQU5TRk9STV9CTE9DSywgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuQlVMTEVURURfTElTVCwgU1ZHSWNvbnMuYl9saXN0Lmh0bWxFbGVtZW50LCBcIkJ1bGxldGVkIGxpc3RcIiwgXCJDdHJsKy5cIikpO1xyXG4gICAgICAgIHR1cm5JbnRvQmFyTGlzdC5hcHBlbmQobmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwidHVybkludG9PcHRpb25OdW1iZXJlZExpc3RcIiwgdHVybkludG9CYXJMaXN0LCBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLmdldEluc3RhbmNlKCksIEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuQkxPQ0tfT1BFUkFUSU9OUy5UUkFOU0ZPUk1fQkxPQ0ssIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLk5VTUJFUkVEX0xJU1QsIFNWR0ljb25zLm5fbGlzdC5odG1sRWxlbWVudCwgXCJOdW1iZXJlZCBsaXN0XCIsIFwiQ3RybCsvXCIpKTtcclxuICAgICAgICB0dXJuSW50b0Jhckxpc3QuYXBwZW5kKG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcInR1cm5JbnRvT3B0aW9uQmxvY2tDb2RlXCIsIHR1cm5JbnRvQmFyTGlzdCwgQmxvY2tPcGVyYXRpb25zU2VydmljZS5nZXRJbnN0YW5jZSgpLCBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLkJMT0NLX09QRVJBVElPTlMuVFJBTlNGT1JNX0JMT0NLLCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5DT0RFLCBTVkdJY29ucy5jb2RlLmh0bWxFbGVtZW50LCBcIkJsb2NrIGNvZGVcIikpO1xyXG4gICAgICAgIHR1cm5JbnRvQmFyTGlzdC5hcHBlbmQobmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwidHVybkludG9PcHRpb25RdW90ZVwiLCB0dXJuSW50b0Jhckxpc3QsIEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuZ2V0SW5zdGFuY2UoKSwgQmxvY2tPcGVyYXRpb25zU2VydmljZS5CTE9DS19PUEVSQVRJT05TLlRSQU5TRk9STV9CTE9DSywgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuUVVPVEUsIFNWR0ljb25zLnF1b3RlLmh0bWxFbGVtZW50LCBcIlF1b3RlXCIpKTtcclxuICAgICAgICB0dXJuSW50b0Jhckxpc3QuYXBwZW5kKG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcInR1cm5JbnRvT3B0aW9uSGVhZGluZzFcIiwgdHVybkludG9CYXJMaXN0LCBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLmdldEluc3RhbmNlKCksIEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuQkxPQ0tfT1BFUkFUSU9OUy5UUkFOU0ZPUk1fQkxPQ0ssIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl8xLCBTVkdJY29ucy5oZWFkMS5odG1sRWxlbWVudCwgXCJIZWFkaW5nIDFcIiwgXCJDdHJsK0FsdCsxXCIpKTtcclxuICAgICAgICB0dXJuSW50b0Jhckxpc3QuYXBwZW5kKG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcInR1cm5JbnRvT3B0aW9uSGVhZGluZzJcIiwgdHVybkludG9CYXJMaXN0LCBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLmdldEluc3RhbmNlKCksIEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuQkxPQ0tfT1BFUkFUSU9OUy5UUkFOU0ZPUk1fQkxPQ0ssIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl8yLCBTVkdJY29ucy5oZWFkMi5odG1sRWxlbWVudCwgXCJIZWFkaW5nIDJcIiwgXCJDdHJsK0FsdCsyXCIpKTtcclxuICAgICAgICB0dXJuSW50b0Jhckxpc3QuYXBwZW5kKG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcInR1cm5JbnRvT3B0aW9uSGVhZGluZzNcIiwgdHVybkludG9CYXJMaXN0LCBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLmdldEluc3RhbmNlKCksIEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuQkxPQ0tfT1BFUkFUSU9OUy5UUkFOU0ZPUk1fQkxPQ0ssIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl8zLCBTVkdJY29ucy5oZWFkMy5odG1sRWxlbWVudCwgXCJIZWFkaW5nIDNcIiwgXCJDdHJsK0FsdCszXCIpKTtcclxuICAgICAgICB0dXJuSW50b0Jhckxpc3QuYXBwZW5kKG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcInR1cm5JbnRvT3B0aW9uSGVhZGluZzRcIiwgdHVybkludG9CYXJMaXN0LCBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLmdldEluc3RhbmNlKCksIEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuQkxPQ0tfT1BFUkFUSU9OUy5UUkFOU0ZPUk1fQkxPQ0ssIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl80LCBTVkdJY29ucy5oZWFkNC5odG1sRWxlbWVudCwgXCJIZWFkaW5nIDRcIiwgXCJDdHJsK0FsdCs0XCIpKTtcclxuICAgICAgICB0dXJuSW50b0Jhckxpc3QuYXBwZW5kKG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcInR1cm5JbnRvT3B0aW9uSGVhZGluZzVcIiwgdHVybkludG9CYXJMaXN0LCBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLmdldEluc3RhbmNlKCksIEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuQkxPQ0tfT1BFUkFUSU9OUy5UUkFOU0ZPUk1fQkxPQ0ssIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl81LCBTVkdJY29ucy5oZWFkNS5odG1sRWxlbWVudCwgXCJIZWFkaW5nIDVcIiwgXCJDdHJsK0FsdCs1XCIpKTtcclxuICAgICAgICB0dXJuSW50b0Jhckxpc3QuYXBwZW5kKG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcInR1cm5JbnRvT3B0aW9uSGVhZGluZzZcIiwgdHVybkludG9CYXJMaXN0LCBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLmdldEluc3RhbmNlKCksIEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuQkxPQ0tfT1BFUkFUSU9OUy5UUkFOU0ZPUk1fQkxPQ0ssIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl82LCBTVkdJY29ucy5oZWFkNi5odG1sRWxlbWVudCwgXCJIZWFkaW5nIDZcIiwgXCJDdHJsK0FsdCs2XCIpKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHR1cm5JbnRvRHJvcGRvd247XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIHNlcGFyYXRvcigpOiBGbG9hdGluZ1Rvb2xiYXJTZXBhcmF0b3Ige1xyXG4gICAgICAgIHJldHVybiBuZXcgRmxvYXRpbmdUb29sYmFyU2VwYXJhdG9yKCk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGdyb3VwQnV0dG9uKCk6IEdyb3VwQnV0dG9uIHtcclxuXHJcbiAgICAgICAgY29uc3QgZ3JvdXBCdXR0b24gPSBuZXcgR3JvdXBCdXR0b24oKTtcclxuXHJcbiAgICAgICAgbmV3IEdyb3VwZWRCdXR0b24oVGV4dE9wZXJhdGlvblNlcnZpY2UuZ2V0SW5zdGFuY2UoKSwgVGV4dE9wZXJhdGlvblNlcnZpY2UuUVVFUllfVEVYVF9PUEVSQVRJT05TLkNSRUFURV9MSU5LLCBcIkxpbmtcIiwgXCJpY29uLW1hdGVyaWFsLWxpbmtcIikuZG9jdW1lbnRBcHBlbmRUbyhncm91cEJ1dHRvbi5odG1sRWxlbWVudCk7XHJcbiAgICAgICAgbmV3IEdyb3VwZWRCdXR0b24oVGV4dE9wZXJhdGlvblNlcnZpY2UuZ2V0SW5zdGFuY2UoKSwgXCJib2xkXCIsIFwiQm9sZFwiLCBcImljb24td29yZHByZXNzLWJvbGRcIikuZG9jdW1lbnRBcHBlbmRUbyhncm91cEJ1dHRvbi5odG1sRWxlbWVudCk7XHJcbiAgICAgICAgbmV3IEdyb3VwZWRCdXR0b24oVGV4dE9wZXJhdGlvblNlcnZpY2UuZ2V0SW5zdGFuY2UoKSwgXCJpdGFsaWNcIiwgXCJJdGFsaWNcIiwgXCJpY29uLW1hdGVyaWFsLWl0YWxpY1wiKS5kb2N1bWVudEFwcGVuZFRvKGdyb3VwQnV0dG9uLmh0bWxFbGVtZW50KTtcclxuICAgICAgICBuZXcgR3JvdXBlZEJ1dHRvbihUZXh0T3BlcmF0aW9uU2VydmljZS5nZXRJbnN0YW5jZSgpLCBUZXh0T3BlcmF0aW9uU2VydmljZS5RVUVSWV9URVhUX09QRVJBVElPTlMuVU5ERVJMSU5FLCBcIlVuZGVybGluZVwiLCBcImljb24tbWF0ZXJpYWwtdW5kZXJsaW5lXCIpLmRvY3VtZW50QXBwZW5kVG8oZ3JvdXBCdXR0b24uaHRtbEVsZW1lbnQpO1xyXG4gICAgICAgIG5ldyBHcm91cGVkQnV0dG9uKFRleHRPcGVyYXRpb25TZXJ2aWNlLmdldEluc3RhbmNlKCksIFRleHRPcGVyYXRpb25TZXJ2aWNlLlFVRVJZX1RFWFRfT1BFUkFUSU9OUy5JTkxJTkVfQ09ERSwgXCJDb2RlXCIsIFwiaWNvbi1tYXRlcmlhbC1jb2RlLWlubGluZVwiKS5kb2N1bWVudEFwcGVuZFRvKGdyb3VwQnV0dG9uLmh0bWxFbGVtZW50KTtcclxuICAgICAgICBuZXcgR3JvdXBlZEJ1dHRvbihUZXh0T3BlcmF0aW9uU2VydmljZS5nZXRJbnN0YW5jZSgpLCBcInN0cmlrZVRocm91Z2hcIiwgXCJTdHJpa2UtdGhyb3VnaFwiLCBcImljb24td29yZHByZXNzLXN0cmlrZS10aHJvdWdoXCIpLmRvY3VtZW50QXBwZW5kVG8oZ3JvdXBCdXR0b24uaHRtbEVsZW1lbnQpO1xyXG4gICAgICAgIC8vIG5ldyBHcm91cGVkQnV0dG9uKFRleHRPcGVyYXRpb25TZXJ2aWNlLmdldEluc3RhbmNlKCksIFwiY29weVwiLCBcIkVxdWF0aW9uXCIsIFwiaWNvbi13b3JkcHJlc3MtZXF1YXRpb24tbWFya1wiKS5kb2N1bWVudEFwcGVuZFRvKGdyb3VwQnV0dG9uLmh0bWxFbGVtZW50KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGdyb3VwQnV0dG9uO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBjb2xvckRyb3Bkb3duKCk6IERyb3Bkb3duTWVudSB7XHJcblxyXG4gICAgICAgIGNvbnN0IGNvbG9yRHJvcGRvd25MaXN0ID0gbmV3IERyb3Bkb3duTWVudUxpc3QoXCJjb2xvclRleHRPcHRpb25TZWxlY3RcIik7XHJcbiAgICAgICAgY29uc3QgY29sb3JCdXR0b24gPSBuZXcgRHJvcGRvd25NZW51QnV0dG9uKFwiY29sb3JUZXh0QnV0dG9uXCIsIG5ldyBDb2xvckljb24oXCIjRkFGNEQxXCIpLmh0bWxFbGVtZW50LCBjb2xvckRyb3Bkb3duTGlzdCk7XHJcbiAgICAgICAgY29uc3QgY29sb3JEcm9wZG93biA9IG5ldyBEcm9wZG93bk1lbnUoY29sb3JCdXR0b24sIGNvbG9yRHJvcGRvd25MaXN0KTtcclxuXHJcbiAgICAgICAgY29sb3JEcm9wZG93bkxpc3QuYXBwZW5kKG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbVRpdGxlKGNvbG9yRHJvcGRvd25MaXN0LCBcIkJhY2tncm91bmRcIikpO1xyXG5cclxuICAgICAgICBjb25zdCB0ZXh0T3BlcmF0aW9uU2VydmljZSA9IFRleHRPcGVyYXRpb25TZXJ2aWNlLmdldEluc3RhbmNlKCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgY29sb3JEcm9wZG93bkxpc3QuYXBwZW5kKG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcImJhY2tncm91bmRPcHRpb25SZWRcIiwgY29sb3JEcm9wZG93bkxpc3QsIHRleHRPcGVyYXRpb25TZXJ2aWNlLCBUZXh0T3BlcmF0aW9uU2VydmljZS5RVUVSWV9URVhUX09QRVJBVElPTlMuSElMSVRFX0NPTE9SLCBcIiNGRERFREVcIiwgbmV3IENvbG9ySWNvbihcIiNGRERFREVcIikuaHRtbEVsZW1lbnQsIFwiUmVkXCIpKTtcclxuICAgICAgICBjb2xvckRyb3Bkb3duTGlzdC5hcHBlbmQobmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwiYmFja2dyb3VuZE9wdGlvbkdyZWVuXCIsIGNvbG9yRHJvcGRvd25MaXN0LCB0ZXh0T3BlcmF0aW9uU2VydmljZSwgVGV4dE9wZXJhdGlvblNlcnZpY2UuUVVFUllfVEVYVF9PUEVSQVRJT05TLkhJTElURV9DT0xPUiwgXCIjRDdGN0RDXCIsIG5ldyBDb2xvckljb24oXCIjRDdGN0RDXCIpLmh0bWxFbGVtZW50LCBcIkdyZWVuXCIpKTtcclxuICAgICAgICBjb2xvckRyb3Bkb3duTGlzdC5hcHBlbmQobmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwiYmFja2dyb3VuZE9wdGlvbkJsdWVcIiwgY29sb3JEcm9wZG93bkxpc3QsIHRleHRPcGVyYXRpb25TZXJ2aWNlLCBUZXh0T3BlcmF0aW9uU2VydmljZS5RVUVSWV9URVhUX09QRVJBVElPTlMuSElMSVRFX0NPTE9SLCBcIiNEOUVERjZcIiwgbmV3IENvbG9ySWNvbihcIiNEOUVERjZcIikuaHRtbEVsZW1lbnQsIFwiQmx1ZVwiKSk7XHJcbiAgICAgICAgY29sb3JEcm9wZG93bkxpc3QuYXBwZW5kKG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcImJhY2tncm91bmRPcHRpb25ZZWxsb3dcIiwgY29sb3JEcm9wZG93bkxpc3QsIHRleHRPcGVyYXRpb25TZXJ2aWNlLCBUZXh0T3BlcmF0aW9uU2VydmljZS5RVUVSWV9URVhUX09QRVJBVElPTlMuSElMSVRFX0NPTE9SLCBcIiNGQUY0RDFcIiwgbmV3IENvbG9ySWNvbihcIiNGQUY0RDFcIikuaHRtbEVsZW1lbnQsIFwiWWVsbG93XCIpKTtcclxuICAgICAgICBjb2xvckRyb3Bkb3duTGlzdC5hcHBlbmQobmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwiYmFja2dyb3VuZE9wdGlvbkdyZXlcIiwgY29sb3JEcm9wZG93bkxpc3QsIHRleHRPcGVyYXRpb25TZXJ2aWNlLCBUZXh0T3BlcmF0aW9uU2VydmljZS5RVUVSWV9URVhUX09QRVJBVElPTlMuSElMSVRFX0NPTE9SLCBcIiNFMUUwRTBcIiwgbmV3IENvbG9ySWNvbihcIiNFMUUwRTBcIikuaHRtbEVsZW1lbnQsIFwiR3JleVwiKSk7XHJcbiAgICAgICAgY29sb3JEcm9wZG93bkxpc3QuYXBwZW5kKG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcImJhY2tncm91bmRPcHRpb25Ob25lXCIsIGNvbG9yRHJvcGRvd25MaXN0LCB0ZXh0T3BlcmF0aW9uU2VydmljZSwgVGV4dE9wZXJhdGlvblNlcnZpY2UuUVVFUllfVEVYVF9PUEVSQVRJT05TLkhJTElURV9DT0xPUiwgXCJ0cmFuc3BhcmVudFwiLCBuZXcgQ29sb3JJY29uKFwidHJhbnNwYXJlbnRcIikuaHRtbEVsZW1lbnQsIFwiTm9uZVwiKSk7XHJcblxyXG4gICAgICAgIFxyXG4gICAgICAgIGNvbG9yRHJvcGRvd25MaXN0LmFwcGVuZChuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW1UaXRsZShjb2xvckRyb3Bkb3duTGlzdCwgXCJDb2xvclwiKSk7XHJcblxyXG4gICAgICAgIGNvbG9yRHJvcGRvd25MaXN0LmFwcGVuZChuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW0oXCJjb2xvck9wdGlvblJlZFwiLGNvbG9yRHJvcGRvd25MaXN0LCB0ZXh0T3BlcmF0aW9uU2VydmljZSwgVGV4dE9wZXJhdGlvblNlcnZpY2UuUVVFUllfVEVYVF9PUEVSQVRJT05TLkZPUkVfQ09MT1IsIFwiI0Q0NEM0N1wiLCBuZXcgU1ZHSWNvbihcImljb24tbWF0ZXJpYWwtZm9ybWF0XCIsIFwiMS4yNXJlbVwiLCBcIjEuMjVyZW1cIikuaHRtbEVsZW1lbnQsIFwiUmVkXCIpKTtcclxuICAgICAgICBjb2xvckRyb3Bkb3duTGlzdC5hcHBlbmQobmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwiY29sb3JPcHRpb25HcmVlblwiLCBjb2xvckRyb3Bkb3duTGlzdCwgdGV4dE9wZXJhdGlvblNlcnZpY2UsIFRleHRPcGVyYXRpb25TZXJ2aWNlLlFVRVJZX1RFWFRfT1BFUkFUSU9OUy5GT1JFX0NPTE9SLCBcIiM0NDgzNjFcIiwgbmV3IFNWR0ljb24oXCJpY29uLW1hdGVyaWFsLWZvcm1hdFwiLCBcIjEuMjVyZW1cIiwgXCIxLjI1cmVtXCIpLmh0bWxFbGVtZW50LCBcIkdyZWVuXCIpKTtcclxuICAgICAgICBjb2xvckRyb3Bkb3duTGlzdC5hcHBlbmQobmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwiY29sb3JPcHRpb25CbHVlXCIsIGNvbG9yRHJvcGRvd25MaXN0LCB0ZXh0T3BlcmF0aW9uU2VydmljZSwgVGV4dE9wZXJhdGlvblNlcnZpY2UuUVVFUllfVEVYVF9PUEVSQVRJT05TLkZPUkVfQ09MT1IsIFwiIzMzN0VBOVwiLCBuZXcgU1ZHSWNvbihcImljb24tbWF0ZXJpYWwtZm9ybWF0XCIsIFwiMS4yNXJlbVwiLCBcIjEuMjVyZW1cIikuaHRtbEVsZW1lbnQsIFwiQmx1ZVwiKSk7XHJcbiAgICAgICAgY29sb3JEcm9wZG93bkxpc3QuYXBwZW5kKG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcImNvbG9yT3B0aW9uWWVsbG93XCIsIGNvbG9yRHJvcGRvd25MaXN0LCB0ZXh0T3BlcmF0aW9uU2VydmljZSwgVGV4dE9wZXJhdGlvblNlcnZpY2UuUVVFUllfVEVYVF9PUEVSQVRJT05TLkZPUkVfQ09MT1IsIFwiI0NCOTEyRlwiLCBuZXcgU1ZHSWNvbihcImljb24tbWF0ZXJpYWwtZm9ybWF0XCIsIFwiMS4yNXJlbVwiLCBcIjEuMjVyZW1cIikuaHRtbEVsZW1lbnQsIFwiWWVsbG93XCIpKTtcclxuICAgICAgICBjb2xvckRyb3Bkb3duTGlzdC5hcHBlbmQobmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwiY29sb3JPcHRpb25HcmV5XCIsIGNvbG9yRHJvcGRvd25MaXN0LCB0ZXh0T3BlcmF0aW9uU2VydmljZSwgVGV4dE9wZXJhdGlvblNlcnZpY2UuUVVFUllfVEVYVF9PUEVSQVRJT05TLkZPUkVfQ09MT1IsIFwiIzc4Nzc3NFwiLCBuZXcgU1ZHSWNvbihcImljb24tbWF0ZXJpYWwtZm9ybWF0XCIsIFwiMS4yNXJlbVwiLCBcIjEuMjVyZW1cIikuaHRtbEVsZW1lbnQsIFwiR3JleVwiKSk7XHJcbiAgICAgICAgY29sb3JEcm9wZG93bkxpc3QuYXBwZW5kKG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcImNvbG9yT3B0aW9uTm9uZVwiLCBjb2xvckRyb3Bkb3duTGlzdCwgdGV4dE9wZXJhdGlvblNlcnZpY2UsIFRleHRPcGVyYXRpb25TZXJ2aWNlLlFVRVJZX1RFWFRfT1BFUkFUSU9OUy5GT1JFX0NPTE9SLCBcImluaXRpYWxcIiwgbmV3IFNWR0ljb24oXCJpY29uLW1hdGVyaWFsLWZvcm1hdFwiLCBcIjEuMjVyZW1cIiwgXCIxLjI1cmVtXCIpLmh0bWxFbGVtZW50LCBcIk5vbmVcIikpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIHJldHVybiBjb2xvckRyb3Bkb3duO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBtb3JlT3B0aW9uc0Ryb3Bkb3duKCk6IERyb3Bkb3duTWVudSB7XHJcblxyXG4gICAgICAgIGNvbnN0IGljb24gPSBuZXcgU1ZHSWNvbihcImljb24tbWF0ZXJpYWwtbW9yZVwiLCBcIjEuMjVyZW1cIiwgXCIxLjI1cmVtXCIpO1xyXG5cclxuICAgICAgICBjb25zdCBtb3JlT3B0aW9uc0xpc3QgPSBuZXcgRHJvcGRvd25NZW51TGlzdChcIm1vcmVUZXh0T3B0aW9uU2VsZWN0XCIpO1xyXG4gICAgICAgIGNvbnN0IG1vcmVPcHRpb25zQnV0dG9uID0gbmV3IERyb3Bkb3duTWVudUJ1dHRvbihcIm1vcmVUZXh0T3B0aW9uQnV0dG9uXCIsIGljb24uaHRtbEVsZW1lbnQsIG1vcmVPcHRpb25zTGlzdCwgZmFsc2UpO1xyXG4gICAgICAgIGNvbnN0IG1vcmVPcHRpb25zRHJvcGRvd24gPSBuZXcgRHJvcGRvd25NZW51KG1vcmVPcHRpb25zQnV0dG9uLCBtb3JlT3B0aW9uc0xpc3QpO1xyXG5cclxuICAgICAgICBtb3JlT3B0aW9uc0xpc3QuYXBwZW5kKG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbVRpdGxlKG1vcmVPcHRpb25zTGlzdCwgXCJNb3JlIG9wdGlvbnNcIikpO1xyXG5cclxuICAgICAgICBtb3JlT3B0aW9uc0xpc3QuYXBwZW5kKG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcImNvcHlPcHRpb25cIiwgbW9yZU9wdGlvbnNMaXN0LCBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLmdldEluc3RhbmNlKCksIEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuQkxPQ0tfT1BFUkFUSU9OUy5DT1BZLCBudWxsLCBTVkdJY29ucy5jb3B5Lmh0bWxFbGVtZW50LCBcIkNvcHlcIiwgXCJDdHJsK0NcIikpO1xyXG4gICAgICAgIG1vcmVPcHRpb25zTGlzdC5hcHBlbmQobmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwiY3V0T3B0aW9uXCIsIG1vcmVPcHRpb25zTGlzdCwgQmxvY2tPcGVyYXRpb25zU2VydmljZS5nZXRJbnN0YW5jZSgpLCBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLkJMT0NLX09QRVJBVElPTlMuQ1VULCBudWxsLCBTVkdJY29ucy5jdXQuaHRtbEVsZW1lbnQsIFwiQ3V0XCIsIFwiQ3RybCtYXCIpKTtcclxuICAgICAgICBtb3JlT3B0aW9uc0xpc3QuYXBwZW5kKG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcInBhc3RlT3B0aW9uXCIsIG1vcmVPcHRpb25zTGlzdCwgQmxvY2tPcGVyYXRpb25zU2VydmljZS5nZXRJbnN0YW5jZSgpLCBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLkJMT0NLX09QRVJBVElPTlMuUEFTVEUsIG51bGwsIFNWR0ljb25zLnBhc3RlLmh0bWxFbGVtZW50LCBcIlJlcGxhY2VcIiwgXCJDdHJsK1ZcIikpO1xyXG4gICAgICAgIG1vcmVPcHRpb25zTGlzdC5hcHBlbmQobmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwiZHVwbGljYXRlT3B0aW9uXCIsIG1vcmVPcHRpb25zTGlzdCwgQmxvY2tPcGVyYXRpb25zU2VydmljZS5nZXRJbnN0YW5jZSgpLCBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLkJMT0NLX09QRVJBVElPTlMuRFVQTElDQVRFLCBudWxsLCBTVkdJY29ucy5kdXBsaWNhdGUuaHRtbEVsZW1lbnQsIFwiQ2xvbmUgQmxvY2tcIiwgXCJDdHJsK0RcIikpO1xyXG4gICAgICAgIG1vcmVPcHRpb25zTGlzdC5hcHBlbmQobmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwicmVzZXRPcHRpb25cIiwgbW9yZU9wdGlvbnNMaXN0LCBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLmdldEluc3RhbmNlKCksIEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuQkxPQ0tfT1BFUkFUSU9OUy5SRU1PVkVfRk9STUFULCBudWxsLCBTVkdJY29ucy5lcmFzZXIuaHRtbEVsZW1lbnQsIFwiUmVzZXQgU3R5bGVcIiwgXCJDdHJsK1xcXFxcIikpO1xyXG4gICAgICAgIG1vcmVPcHRpb25zTGlzdC5hcHBlbmQobmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwiZGVsZXRlT3B0aW9uXCIsIG1vcmVPcHRpb25zTGlzdCwgQmxvY2tPcGVyYXRpb25zU2VydmljZS5nZXRJbnN0YW5jZSgpLCBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLkJMT0NLX09QRVJBVElPTlMuREVMRVRFLCBudWxsLCBTVkdJY29ucy5kZWxldGUuaHRtbEVsZW1lbnQsIFwiRGVsZXRlIEJsb2NrXCIsIFwiU2hpZnQrRGVsXCIpKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIG1vcmVPcHRpb25zRHJvcGRvd247XHJcbiAgICB9XHJcbn1cclxuXHJcbmNvbnN0IFNWR0ljb25zOiBhbnkgPSB7XHJcblxyXG4gICAgcGFyYWdyYXBoOiBuZXcgU1ZHSWNvbihcImljb24tbWF0ZXJpYWwtZm9ybWF0XCIsIFwiMS4yNXJlbVwiLCBcIjEuMjVyZW1cIiksXHJcbiAgICB0b2RvX2xpc3Q6IG5ldyBTVkdJY29uKFwiaWNvbi1tYXRlcmlhbC1jaGVjay1saXN0LTJcIiwgXCIxLjI1cmVtXCIsIFwiMS4yNXJlbVwiKSxcclxuICAgIGJfbGlzdDogbmV3IFNWR0ljb24oXCJpY29uLXdvcmRwcmVzcy1idWxsZXRlZC1saXN0XCIsIFwiMS4yNXJlbVwiLCBcIjEuMjVyZW1cIiksXHJcbiAgICBuX2xpc3Q6IG5ldyBTVkdJY29uKFwiaWNvbi13b3JkcHJlc3MtbnVtYmVyZWQtbGlzdFwiLCBcIjEuMjVyZW1cIiwgXCIxLjI1cmVtXCIpLFxyXG4gICAgY29kZTogbmV3IFNWR0ljb24oXCJpY29uLXdvcmRwcmVzcy1jb2RlLW1hcmtcIiwgXCIxLjI1cmVtXCIsIFwiMS4yNXJlbVwiKSxcclxuICAgIHF1b3RlOiBuZXcgU1ZHSWNvbihcImljb24td29yZHByZXNzLXF1b3RlXCIsIFwiMS4yNXJlbVwiLCBcIjEuMjVyZW1cIiksXHJcbiAgICBoZWFkMTogbmV3IFNWR0ljb24oXCJpY29uLWp1bGlhLWhlYWQtMVwiLCBcIjEuMjVyZW1cIiwgXCIxLjI1cmVtXCIpLFxyXG4gICAgaGVhZDI6IG5ldyBTVkdJY29uKFwiaWNvbi1qdWxpYS1oZWFkLTJcIiwgXCIxLjI1cmVtXCIsIFwiMS4yNXJlbVwiKSxcclxuICAgIGhlYWQzOiBuZXcgU1ZHSWNvbihcImljb24tanVsaWEtaGVhZC0zXCIsIFwiMS4yNXJlbVwiLCBcIjEuMjVyZW1cIiksXHJcbiAgICBoZWFkNDogbmV3IFNWR0ljb24oXCJpY29uLWp1bGlhLWhlYWQtNFwiLCBcIjEuMjVyZW1cIiwgXCIxLjI1cmVtXCIpLFxyXG4gICAgaGVhZDU6IG5ldyBTVkdJY29uKFwiaWNvbi1qdWxpYS1oZWFkLTVcIiwgXCIxLjI1cmVtXCIsIFwiMS4yNXJlbVwiKSxcclxuICAgIGhlYWQ2OiBuZXcgU1ZHSWNvbihcImljb24tanVsaWEtaGVhZC02XCIsIFwiMS4yNXJlbVwiLCBcIjEuMjVyZW1cIiksXHJcbiAgICBkdXBsaWNhdGU6IG5ldyBTVkdJY29uKFwiaWNvbi1tYXRlcmlhbC1kdXBsaWNhdGVcIiwgXCIxLjI1cmVtXCIsIFwiMS4yNXJlbVwiKSxcclxuICAgIGRlbGV0ZTogbmV3IFNWR0ljb24oXCJpY29uLW1hdGVyaWFsLXRyYXNoXCIsIFwiMS4yNXJlbVwiLCBcIjEuMjVyZW1cIiksXHJcbiAgICBlcmFzZXI6IG5ldyBTVkdJY29uKFwiaWNvbi1tYXRlcmlhbC1jbGVhclwiLCBcIjEuMjVyZW1cIiwgXCIxLjI1cmVtXCIpLFxyXG4gICAgY29weTogbmV3IFNWR0ljb24oXCJpY29uLW1hdGVyaWFsLWNvcHlcIiwgXCIxLjI1cmVtXCIsIFwiMS4yNXJlbVwiKSxcclxuICAgIGN1dDogbmV3IFNWR0ljb24oXCJpY29uLW1hdGVyaWFsLWN1dFwiLCBcIjEuMjVyZW1cIiwgXCIxLjI1cmVtXCIpLFxyXG4gICAgcGFzdGU6IG5ldyBTVkdJY29uKFwiaWNvbi1tYXRlcmlhbC1wYXN0ZVwiLCBcIjEuMjVyZW1cIiwgXCIxLjI1cmVtXCIpXHJcbn0iLCJpbXBvcnQgeyBCYXNlVUlDb21wb25lbnQgfSBmcm9tIFwiLi4vY29tbW9uL0Jhc2VVSUNvbXBvbmVudFwiO1xyXG5pbXBvcnQgeyBTVkdJY29uIH0gZnJvbSBcIi4uL2NvbW1vbi9TVkdJY29uXCI7XHJcbmltcG9ydCB7IEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UgfSBmcm9tIFwiLi4vLi4vc2VydmljZXMvYmxvY2stb3BlcmF0aW9ucy9CbG9ja09wZXJhdGlvbnNTZXJ2aWNlXCI7XHJcbmltcG9ydCB7IElCbG9ja09wZXJhdGlvbnNTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL3NlcnZpY2VzL2Jsb2NrLW9wZXJhdGlvbnMvSUJsb2NrT3BlcmF0aW9uc1NlcnZpY2VcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBBZGRCbG9ja0J1dHRvbiBleHRlbmRzIEJhc2VVSUNvbXBvbmVudCB7XHJcblxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBibG9ja09wZXJhdGlvbnNTZXJ2aWNlOiBJQmxvY2tPcGVyYXRpb25zU2VydmljZTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihibG9ja09wZXJhdGlvbnNTZXJ2aWNlOiBJQmxvY2tPcGVyYXRpb25zU2VydmljZSkge1xyXG5cclxuICAgICAgICBzdXBlcih7fSk7XHJcblxyXG4gICAgICAgIHRoaXMuYmxvY2tPcGVyYXRpb25zU2VydmljZSA9IGJsb2NrT3BlcmF0aW9uc1NlcnZpY2U7XHJcbiAgICAgICAgdGhpcy5hdHRhY2hFdmVudHMoKTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0KCk6IEhUTUxFbGVtZW50IHtcclxuXHJcbiAgICAgICAgY29uc3QgaHRtbEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIpO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LnRpdGxlID0gXCJBZGQgYSBuZXcgYmxvY2tcIjtcclxuXHJcbiAgICAgICAgaHRtbEVsZW1lbnQuY2xhc3NMaXN0LmFkZChcImFkZC1ibG9ja1wiLCBcImJsb2NrLW9wZXJhdGlvblwiKTtcclxuXHJcbiAgICAgICAgY29uc3Qgc3ZnID0gbmV3IFNWR0ljb24oXCJpY29uLWFkZC1ibG9ja1wiLCBcIjEuNXJlbVwiLCBcIjEuNXJlbVwiKTtcclxuXHJcbiAgICAgICAgaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQoc3ZnLmh0bWxFbGVtZW50KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGh0bWxFbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIGF0dGFjaEV2ZW50cygpOiB2b2lkIHtcclxuXHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuZXhlY0NvbW1hbmQoQmxvY2tPcGVyYXRpb25zU2VydmljZS5CTE9DS19PUEVSQVRJT05TLkNSRUFURV9ERUZBVUxUX0JMT0NLLCBmYWxzZSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBCYXNlVUlDb21wb25lbnQgfSBmcm9tIFwiLi4vY29tbW9uL0Jhc2VVSUNvbXBvbmVudFwiO1xyXG5pbXBvcnQgeyBBZGRCbG9ja0J1dHRvbiB9IGZyb20gXCIuL0FkZEJsb2NrQnV0dG9uXCI7XHJcbmltcG9ydCB7IElCbG9ja09wZXJhdGlvbnNTZXJ2aWNlIH0gZnJvbSBcIkAvc2VydmljZXMvYmxvY2stb3BlcmF0aW9ucy9JQmxvY2tPcGVyYXRpb25zU2VydmljZVwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIEFkZEJsb2NrIGV4dGVuZHMgQmFzZVVJQ29tcG9uZW50IHtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihibG9ja09wZXJhdGlvblNlcnZpY2U6IElCbG9ja09wZXJhdGlvbnNTZXJ2aWNlKSB7XHJcblxyXG4gICAgICAgIHN1cGVyKHtcclxuICAgICAgICAgICAgYmxvY2tPcGVyYXRpb25TZXJ2aWNlOiBibG9ja09wZXJhdGlvblNlcnZpY2VcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0KCk6IEhUTUxFbGVtZW50IHtcclxuXHJcbiAgICAgICAgY29uc3QgaHRtbEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG5cclxuICAgICAgICBodG1sRWxlbWVudC5jbGFzc0xpc3QuYWRkKFwiYWRkLWJsb2NrLXdyYXBwZXJcIik7XHJcblxyXG4gICAgICAgIGNvbnN0IGJ1dHRvbiA9IG5ldyBBZGRCbG9ja0J1dHRvbih0aGlzLnByb3BzLmJsb2NrT3BlcmF0aW9uU2VydmljZSk7XHJcblxyXG4gICAgICAgIGh0bWxFbGVtZW50LmFwcGVuZENoaWxkKGJ1dHRvbi5odG1sRWxlbWVudCk7XHJcblxyXG4gICAgICAgIHJldHVybiBodG1sRWxlbWVudDtcclxuICAgIH1cclxufSIsImltcG9ydCB7IElFbGVtZW50RmFjdG9yeVNlcnZpY2UgfSBmcm9tIFwiQC9zZXJ2aWNlcy9lbGVtZW50LWZhY3RvcnkvSUVsZW1lbnRGYWN0b3J5U2VydmljZVwiO1xyXG5pbXBvcnQgeyBFbGVtZW50RmFjdG9yeVNlcnZpY2UgfSBmcm9tIFwiQC9zZXJ2aWNlcy9lbGVtZW50LWZhY3RvcnkvRWxlbWVudEZhY3RvcnlTZXJ2aWNlXCI7XHJcbmltcG9ydCB7IEJhc2VVSUNvbXBvbmVudCB9IGZyb20gXCIuLi9jb21tb24vQmFzZVVJQ29tcG9uZW50XCI7XHJcbmltcG9ydCB7IElCbG9ja09wZXJhdGlvbnNTZXJ2aWNlIH0gZnJvbSBcIkAvc2VydmljZXMvYmxvY2stb3BlcmF0aW9ucy9JQmxvY2tPcGVyYXRpb25zU2VydmljZVwiO1xyXG5pbXBvcnQgeyBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlIH0gZnJvbSBcIkAvc2VydmljZXMvYmxvY2stb3BlcmF0aW9ucy9CbG9ja09wZXJhdGlvbnNTZXJ2aWNlXCI7XHJcbmltcG9ydCB7IFF1aWNrTWVudSB9IGZyb20gXCIuLi9xdWljay1tZW51L1F1aWNrTWVudVwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIENvbnRlbnQgZXh0ZW5kcyBCYXNlVUlDb21wb25lbnQge1xyXG5cclxuICAgIGJsb2NrT3BlcmF0aW9uc1NlcnZpY2U6IElCbG9ja09wZXJhdGlvbnNTZXJ2aWNlO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIGVsZW1lbnRGYWN0b3J5U2VydmljZTogSUVsZW1lbnRGYWN0b3J5U2VydmljZSxcclxuICAgICAgICBibG9ja09wZXJhdGlvbnNTZXJ2aWNlOiBJQmxvY2tPcGVyYXRpb25zU2VydmljZSkge1xyXG5cclxuICAgICAgICBzdXBlcih7XHJcbiAgICAgICAgICAgIGVsZW1lbnRGYWN0b3J5U2VydmljZTogZWxlbWVudEZhY3RvcnlTZXJ2aWNlLFxyXG4gICAgICAgICAgICBibG9ja09wZXJhdGlvbnNTZXJ2aWNlOiBibG9ja09wZXJhdGlvbnNTZXJ2aWNlXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuYmxvY2tPcGVyYXRpb25zU2VydmljZSA9IGJsb2NrT3BlcmF0aW9uc1NlcnZpY2U7XHJcblxyXG4gICAgICAgIHRoaXMuYXR0YWNoRXZlbnQoKTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0KCk6IEhUTUxFbGVtZW50IHtcclxuXHJcbiAgICAgICAgY29uc3QgaHRtbEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJjb250ZW50XCIpO1xyXG5cclxuICAgICAgICBpZiAod2luZG93LmVkaXRvckNvbmZpZz8uaW5jbHVkZUZpcnN0UGFyYWdyYXBoIHx8IHRydWUpIHtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGJsb2NrUGFyYWdyYXBoID0gdGhpcy5wcm9wcy5lbGVtZW50RmFjdG9yeVNlcnZpY2UuY3JlYXRlKEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkJMT0NLX1BBUkFHUkFQSCk7XHJcblxyXG4gICAgICAgICAgICBodG1sRWxlbWVudC5hcHBlbmQoYmxvY2tQYXJhZ3JhcGgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGh0bWxFbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIGF0dGFjaEV2ZW50KCk6IHZvaWQge1xyXG5cclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiY29waWVkVGV4dFwiLCAoKSA9PiB7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBjb3B5RWxlbWVudEl0ZW0gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiI2NvcHlPcHRpb24gLnRleHQtb3B0aW9uIHNwYW5cIikgYXMgSFRNTFNwYW5FbGVtZW50O1xyXG5cclxuICAgICAgICAgICAgaWYgKGNvcHlFbGVtZW50SXRlbSkge1xyXG5cclxuICAgICAgICAgICAgICAgIGNvcHlFbGVtZW50SXRlbS50ZXh0Q29udGVudCA9IFwiQ29waWVkIVwiO1xyXG5cclxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvcHlFbGVtZW50SXRlbS50ZXh0Q29udGVudCA9IFwiQ29weVwiO1xyXG4gICAgICAgICAgICAgICAgfSwgMTUwMCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy9TaG9ydGN1dHNcclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCAoZXZlbnQpID0+IHtcclxuXHJcblxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgS2V5OiAke2V2ZW50LmtleX0sIENvZGU6ICR7ZXZlbnQuY29kZX0sIEN0cmw6ICR7ZXZlbnQuY3RybEtleX0sIEFsdDogJHtldmVudC5hbHRLZXl9LCBBbHRHcjogJHtldmVudC5rZXkgPT09ICdBbHRHcmFwaCd9LCBOdW1Mb2NrOiAke2V2ZW50LmdldE1vZGlmaWVyU3RhdGUoJ051bUxvY2snKX1gKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGlzTnVtUGFkID0gZXZlbnQuY29kZS5zdGFydHNXaXRoKFwiTnVtcGFkXCIpO1xyXG4gICAgICAgICAgICBjb25zdCBudW1Mb2NrT24gPSBldmVudC5nZXRNb2RpZmllclN0YXRlKFwiTnVtTG9ja1wiKTtcclxuXHJcbiAgICAgICAgICAgIGlmICgoZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5KSAmJiBldmVudC5zaGlmdEtleSAmJiAoZXZlbnQua2V5ID09PSBcIkVudGVyXCIpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBDb252ZXJ0IHRvIGNoZWNrIGxpc3RcclxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuYmxvY2tPcGVyYXRpb25zU2VydmljZS5leGVjQ29tbWFuZChCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLkJMT0NLX09QRVJBVElPTlMuVFJBTlNGT1JNX0JMT0NLLCBmYWxzZSwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuUEFSQUdSQVBIKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICgoZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5KSAmJiAhZXZlbnQuc2hpZnRLZXkgJiYgKGV2ZW50LmNvZGUgPT09IFwiRGlnaXQxXCIgfHwgZXZlbnQuY29kZSA9PT0gXCJOdW1wYWQxXCIpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBDb252ZXJ0IHRvIGNoZWNrIGxpc3RcclxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuYmxvY2tPcGVyYXRpb25zU2VydmljZS5leGVjQ29tbWFuZChCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLkJMT0NLX09QRVJBVElPTlMuVFJBTlNGT1JNX0JMT0NLLCBmYWxzZSwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuQ0hFQ0tfTElTVCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoKGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQubWV0YUtleSkgJiYgIWV2ZW50LnNoaWZ0S2V5ICYmIGV2ZW50LmtleSA9PT0gXCIuXCIpIHtcclxuICAgICAgICAgICAgICAgIC8vIENvbnZlcnQgdG8gYnVsbGV0ZWRcclxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuYmxvY2tPcGVyYXRpb25zU2VydmljZS5leGVjQ29tbWFuZChCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLkJMT0NLX09QRVJBVElPTlMuVFJBTlNGT1JNX0JMT0NLLCBmYWxzZSwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuQlVMTEVURURfTElTVCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoKGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQubWV0YUtleSkgJiYgIWV2ZW50LnNoaWZ0S2V5ICYmIChldmVudC5rZXkgPT09IFwiL1wiKSkge1xyXG4gICAgICAgICAgICAgICAgLy8gQ29udmVydCB0byBudW1iZXJlZFxyXG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ibG9ja09wZXJhdGlvbnNTZXJ2aWNlLmV4ZWNDb21tYW5kKEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuQkxPQ0tfT1BFUkFUSU9OUy5UUkFOU0ZPUk1fQkxPQ0ssIGZhbHNlLCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5OVU1CRVJFRF9MSVNUKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICgoZXZlbnQuY3RybEtleSAmJiBldmVudC5hbHRLZXkgJiYgKChldmVudC5jb2RlID09PSBcIkRpZ2l0MVwiKSB8fCAoaXNOdW1QYWQgJiYgbnVtTG9ja09uICYmIGV2ZW50LmNvZGUgPT09IFwiTnVtcGFkMVwiKSkpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBDb252ZXJ0IHRvIGgxXHJcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuZXhlY0NvbW1hbmQoQmxvY2tPcGVyYXRpb25zU2VydmljZS5CTE9DS19PUEVSQVRJT05TLlRSQU5TRk9STV9CTE9DSywgZmFsc2UsIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl8xKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmICgoZXZlbnQuY3RybEtleSAmJiBldmVudC5hbHRLZXkgJiYgKChldmVudC5jb2RlID09PSBcIkRpZ2l0MlwiKSB8fCAoaXNOdW1QYWQgJiYgbnVtTG9ja09uICYmIGV2ZW50LmNvZGUgPT09IFwiTnVtcGFkMlwiKSkpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBDb252ZXJ0IHRvIGgyXHJcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuZXhlY0NvbW1hbmQoQmxvY2tPcGVyYXRpb25zU2VydmljZS5CTE9DS19PUEVSQVRJT05TLlRSQU5TRk9STV9CTE9DSywgZmFsc2UsIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl8yKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICgoZXZlbnQuY3RybEtleSAmJiBldmVudC5hbHRLZXkgJiYgKChldmVudC5jb2RlID09PSBcIkRpZ2l0M1wiKSB8fCAoaXNOdW1QYWQgJiYgbnVtTG9ja09uICYmIGV2ZW50LmNvZGUgPT09IFwiTnVtcGFkM1wiKSkpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBDb252ZXJ0IHRvIGgzXHJcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuZXhlY0NvbW1hbmQoQmxvY2tPcGVyYXRpb25zU2VydmljZS5CTE9DS19PUEVSQVRJT05TLlRSQU5TRk9STV9CTE9DSywgZmFsc2UsIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl8zKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICgoZXZlbnQuY3RybEtleSAmJiBldmVudC5hbHRLZXkgJiYgKChldmVudC5jb2RlID09PSBcIkRpZ2l0NFwiKSB8fCAoaXNOdW1QYWQgJiYgbnVtTG9ja09uICYmIGV2ZW50LmNvZGUgPT09IFwiTnVtcGFkNFwiKSkpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBDb252ZXJ0IHRvIGg0XHJcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuZXhlY0NvbW1hbmQoQmxvY2tPcGVyYXRpb25zU2VydmljZS5CTE9DS19PUEVSQVRJT05TLlRSQU5TRk9STV9CTE9DSywgZmFsc2UsIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl80KTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICgoZXZlbnQuY3RybEtleSAmJiBldmVudC5hbHRLZXkgJiYgKChldmVudC5jb2RlID09PSBcIkRpZ2l0NVwiKSB8fCAoaXNOdW1QYWQgJiYgbnVtTG9ja09uICYmIGV2ZW50LmNvZGUgPT09IFwiTnVtcGFkNVwiKSkpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBDb252ZXJ0IHRvIGg1XHJcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuZXhlY0NvbW1hbmQoQmxvY2tPcGVyYXRpb25zU2VydmljZS5CTE9DS19PUEVSQVRJT05TLlRSQU5TRk9STV9CTE9DSywgZmFsc2UsIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl81KTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICgoZXZlbnQuY3RybEtleSAmJiBldmVudC5hbHRLZXkgJiYgKChldmVudC5jb2RlID09PSBcIkRpZ2l0NlwiKSB8fCAoaXNOdW1QYWQgJiYgbnVtTG9ja09uICYmIGV2ZW50LmNvZGUgPT09IFwiTnVtcGFkNlwiKSkpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBDb252ZXJ0IHRvIGg2XHJcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuZXhlY0NvbW1hbmQoQmxvY2tPcGVyYXRpb25zU2VydmljZS5CTE9DS19PUEVSQVRJT05TLlRSQU5TRk9STV9CTE9DSywgZmFsc2UsIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl82KTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICgoZXZlbnQua2V5ID09PSBcIkRcIiB8fCBldmVudC5rZXkgPT09IFwiZFwiKSAmJiBldmVudC5jdHJsS2V5KSB7XHJcbiAgICAgICAgICAgICAgICAvLyBEdXBsaWNhdGUgYmxvY2sgc2hvcnRjdXRcclxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuYmxvY2tPcGVyYXRpb25zU2VydmljZS5leGVjQ29tbWFuZChCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLkJMT0NLX09QRVJBVElPTlMuRFVQTElDQVRFLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoKGV2ZW50LmtleSA9PT0gXCJEZWxldGVcIiB8fCBldmVudC5rZXkgPT09IFwiQmFja3NwYWNlXCIpICYmIGV2ZW50LnNoaWZ0S2V5KSB7XHJcbiAgICAgICAgICAgICAgICAvLyBEZWxldGUgYmxvY2sgc2hvcnRjdXRcclxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuYmxvY2tPcGVyYXRpb25zU2VydmljZS5leGVjQ29tbWFuZChCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLkJMT0NLX09QRVJBVElPTlMuREVMRVRFLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSBcIlxcXFxcIiAmJiAoZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5KSkge1xyXG4gICAgICAgICAgICAgICAgLy8gQ2xlYXIgZm9ybWF0dGluZ1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ibG9ja09wZXJhdGlvbnNTZXJ2aWNlLmV4ZWNDb21tYW5kKEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuQkxPQ0tfT1BFUkFUSU9OUy5SRU1PVkVfRk9STUFULCBmYWxzZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQuY3RybEtleSAmJiBldmVudC5hbHRLZXkgJiYgZXZlbnQuY29kZSA9PT0gXCJEaWdpdDFcIikge1xyXG4gICAgICAgICAgICAgICAgLy8gUHJldmVudCBjaGFyYWN0ZXIgaW5zZXJ0aW9uIHdoZW4gdXNpbmcgdG9wIHJvdyAnMSdcclxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcblxyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgYXN5bmMgKGV2ZW50KSA9PiB7XHJcblxyXG4gICAgICAgICAgICBpZiAoZXZlbnQuY3RybEtleSB8fCBldmVudC5zaGlmdEtleSB8fCBldmVudC5hbHRLZXkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgICAgIGlmIChldmVudC5rZXkgPT09ICdFbnRlcicgJiYgIVF1aWNrTWVudS5nZXRJbnN0YW5jZSgpLmlzVmlzaWJsZSkge1xyXG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuZXhlY0NvbW1hbmQoQmxvY2tPcGVyYXRpb25zU2VydmljZS5CTE9DS19PUEVSQVRJT05TLkNSRUFURV9ERUZBVUxUX0JMT0NLLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnQmFja3NwYWNlJykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCdqb2hhbm5lcy1jb250ZW50LWVsZW1lbnQnKSAmJiB0YXJnZXQudGV4dENvbnRlbnQ/LnRyaW0oKSA9PT0gJycpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuZXhlY0NvbW1hbmQoQmxvY2tPcGVyYXRpb25zU2VydmljZS5CTE9DS19PUEVSQVRJT05TLkRFTEVURV9GT0NVU19PTl9QUkVWSU9VUywgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCdqb2hhbm5lcy1jb250ZW50LWVsZW1lbnQnKSAmJiB0YXJnZXQudGV4dENvbnRlbnQ/LnRyaW0oKSAhPT0gJycpIHtcclxuICAgICAgICAgICAgICAgICAgICAvL1RPRE86IFJlcGxhY2UgdGhlIGRlbGV0ZSBhbmQgZm9jdXMgYnkgbWVyZ2VcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnRGVsZXRlJykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCdqb2hhbm5lcy1jb250ZW50LWVsZW1lbnQnKSAmJiB0YXJnZXQudGV4dENvbnRlbnQ/LnRyaW0oKSA9PT0gJycpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuZXhlY0NvbW1hbmQoQmxvY2tPcGVyYXRpb25zU2VydmljZS5CTE9DS19PUEVSQVRJT05TLkRFTEVURV9GT0NVU19PTl9ORVhULCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJ2pvaGFubmVzLWNvbnRlbnQtZWxlbWVudCcpICYmIHRhcmdldC50ZXh0Q29udGVudD8udHJpbSgpICE9PSAnJykge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vVE9ETzogUmVwbGFjZSB0aGUgZGVsZXRlIGFuZCBmb2N1cyBieSBtZXJnZVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJ0Fycm93UmlnaHQnICYmIENvbnRlbnQuaXNDdXJzb3JBdEVuZChldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuZXhlY0NvbW1hbmQoQmxvY2tPcGVyYXRpb25zU2VydmljZS5CTE9DS19PUEVSQVRJT05TLkZPQ1VTX09OX05FWFQsIGZhbHNlKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICdBcnJvd0xlZnQnICYmIENvbnRlbnQuaXNDdXJzb3JBdFN0YXJ0KGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYmxvY2tPcGVyYXRpb25zU2VydmljZS5leGVjQ29tbWFuZChCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLkJMT0NLX09QRVJBVElPTlMuRk9DVVNfT05fUFJFVklPVVMsIGZhbHNlKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICdBcnJvd0Rvd24nICYmIENvbnRlbnQuaXNDdXJzb3JPbkxhc3RMaW5lKCkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYmxvY2tPcGVyYXRpb25zU2VydmljZS5leGVjQ29tbWFuZChCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLkJMT0NLX09QRVJBVElPTlMuRk9DVVNfT05fTkVYVCwgZmFsc2UpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJ0Fycm93VXAnICYmIENvbnRlbnQuaXNDdXJzb3JPbkZpcnN0TGluZSgpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuZXhlY0NvbW1hbmQoQmxvY2tPcGVyYXRpb25zU2VydmljZS5CTE9DS19PUEVSQVRJT05TLkZPQ1VTX09OX1BSRVZJT1VTLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG5cclxuICAgIHN0YXRpYyBpc0N1cnNvckF0RW5kKHRhcmdldDogSFRNTEVsZW1lbnQpOiBib29sZWFuIHtcclxuICAgICAgICBjb25zdCBmb2N1c2FibGVQYXJlbnQgPSB0YXJnZXQuY2xvc2VzdCgnLmZvY3VzYWJsZScpO1xyXG4gICAgICAgIGlmICghZm9jdXNhYmxlUGFyZW50KSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKSE7XHJcbiAgICAgICAgaWYgKCFzZWxlY3Rpb24ucmFuZ2VDb3VudCkgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xyXG4gICAgICAgIGxldCBlbmROb2RlOiBOb2RlIHwgbnVsbCA9IHJhbmdlLmVuZENvbnRhaW5lcjtcclxuICAgICAgICBpZiAoZW5kTm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUpIHtcclxuICAgICAgICAgICAgZW5kTm9kZSA9IGVuZE5vZGUucGFyZW50Tm9kZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJhbmdlLmNvbGxhcHNlZCAmJiBlbmROb2RlID09PSBmb2N1c2FibGVQYXJlbnQgJiYgcmFuZ2UuZW5kT2Zmc2V0ID09PSAocmFuZ2UuZW5kQ29udGFpbmVyLnRleHRDb250ZW50IHx8ICcnKS5sZW5ndGg7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGlzQ3Vyc29yQXRTdGFydCh0YXJnZXQ6IEhUTUxFbGVtZW50KTogYm9vbGVhbiB7XHJcbiAgICAgICAgY29uc3QgZm9jdXNhYmxlUGFyZW50ID0gdGFyZ2V0LmNsb3Nlc3QoJy5mb2N1c2FibGUnKTtcclxuICAgICAgICBpZiAoIWZvY3VzYWJsZVBhcmVudCkgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCkhO1xyXG4gICAgICAgIGlmICghc2VsZWN0aW9uLnJhbmdlQ291bnQpIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgY29uc3QgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcclxuXHJcbiAgICAgICAgbGV0IHN0YXJ0Tm9kZTogTm9kZSB8IG51bGwgPSByYW5nZS5zdGFydENvbnRhaW5lcjtcclxuICAgICAgICBpZiAoc3RhcnROb2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xyXG4gICAgICAgICAgICBzdGFydE5vZGUgPSBzdGFydE5vZGUucGFyZW50Tm9kZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJhbmdlLmNvbGxhcHNlZCAmJiBzdGFydE5vZGUgPT09IGZvY3VzYWJsZVBhcmVudCAmJiByYW5nZS5zdGFydE9mZnNldCA9PT0gMDtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgaXNBdEZpcnN0VmlzaWJsZUxpbmUoZWxlbWVudDogSFRNTEVsZW1lbnQpIHtcclxuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCkhO1xyXG4gICAgICAgIGlmICghc2VsZWN0aW9uLnJhbmdlQ291bnQpIHJldHVybiBmYWxzZTtcclxuICAgICAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApLmNsb25lUmFuZ2UoKTtcclxuICAgICAgICByYW5nZS5jb2xsYXBzZSh0cnVlKTtcclxuICAgICAgICByYW5nZS5zZXRTdGFydChlbGVtZW50LCAwKTtcclxuICAgICAgICBjb25zdCByYW5nZVRvcCA9IHJhbmdlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcDtcclxuICAgICAgICBjb25zdCBlbGVtZW50VG9wID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3A7XHJcblxyXG4gICAgICAgIHJldHVybiByYW5nZVRvcCA9PT0gZWxlbWVudFRvcDtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgaXNBdExhc3RWaXNpYmxlTGluZShlbGVtZW50OiBIVE1MRWxlbWVudCkge1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKSE7XHJcbiAgICAgICAgaWYgKCFzZWxlY3Rpb24ucmFuZ2VDb3VudCkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCkuY2xvbmVSYW5nZSgpO1xyXG4gICAgICAgIHJhbmdlLmNvbGxhcHNlKGZhbHNlKTtcclxuICAgICAgICByYW5nZS5zZXRFbmQoZWxlbWVudCwgZWxlbWVudC5jaGlsZE5vZGVzLmxlbmd0aCk7XHJcbiAgICAgICAgY29uc3QgcmFuZ2VCb3R0b20gPSByYW5nZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5ib3R0b207XHJcbiAgICAgICAgY29uc3QgZWxlbWVudEJvdHRvbSA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuYm90dG9tO1xyXG5cclxuICAgICAgICByZXR1cm4gcmFuZ2VCb3R0b20gPT09IGVsZW1lbnRCb3R0b207XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHN0YXRpYyBkaWRDdXJzb3JNb3ZlKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpITtcclxuICAgICAgICBpZiAoIXNlbGVjdGlvbi5yYW5nZUNvdW50KSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcclxuXHJcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxSYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApLmNsb25lUmFuZ2UoKTtcclxuICAgICAgICBjb25zdCBvcmlnaW5hbFJlY3QgPSBvcmlnaW5hbFJhbmdlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG5cclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8Ym9vbGVhbj4ocmVzb2x2ZSA9PiB7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV3UmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKS5jbG9uZVJhbmdlKCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdSZWN0ID0gbmV3UmFuZ2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgZGlkTW92ZSA9ICEob3JpZ2luYWxSZWN0LnRvcCA9PT0gbmV3UmVjdC50b3AgJiYgb3JpZ2luYWxSZWN0LmxlZnQgPT09IG5ld1JlY3QubGVmdCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWRpZE1vdmUpIHtcclxuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZShkaWRNb3ZlKTtcclxuICAgICAgICAgICAgfSwgMCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgICBzdGF0aWMgaXNDdXJzb3JPbkZpcnN0TGluZSgpOiBib29sZWFuIHtcclxuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgICAgICAgaWYgKCFzZWxlY3Rpb24gfHwgIXNlbGVjdGlvbi5yYW5nZUNvdW50KSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XHJcblxyXG4gICAgICAgIHJldHVybiByYW5nZS5zdGFydE9mZnNldCA9PT0gMCAmJiByYW5nZS5zdGFydENvbnRhaW5lciA9PT0gcmFuZ2UuY29tbW9uQW5jZXN0b3JDb250YWluZXI7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGlzQ3Vyc29yT25MYXN0TGluZSgpOiBib29sZWFuIHtcclxuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgICAgICAgaWYgKCFzZWxlY3Rpb24gfHwgIXNlbGVjdGlvbi5yYW5nZUNvdW50KSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XHJcblxyXG4gICAgICAgIHJldHVybiByYW5nZS5lbmRPZmZzZXQgPT09IHJhbmdlLmVuZENvbnRhaW5lci50ZXh0Q29udGVudD8ubGVuZ3RoICYmIHJhbmdlLmVuZENvbnRhaW5lciA9PT0gcmFuZ2UuY29tbW9uQW5jZXN0b3JDb250YWluZXI7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlIH0gZnJvbSBcIkAvc2VydmljZXMvYmxvY2stb3BlcmF0aW9ucy9CbG9ja09wZXJhdGlvbnNTZXJ2aWNlXCI7XHJcbmltcG9ydCB7IEJhc2VVSUNvbXBvbmVudCB9IGZyb20gXCIuLi9jb21tb24vQmFzZVVJQ29tcG9uZW50XCI7XHJcbmltcG9ydCB7IElCbG9ja09wZXJhdGlvbnNTZXJ2aWNlIH0gZnJvbSBcIkAvc2VydmljZXMvYmxvY2stb3BlcmF0aW9ucy9JQmxvY2tPcGVyYXRpb25zU2VydmljZVwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFRpdGxlIGV4dGVuZHMgQmFzZVVJQ29tcG9uZW50IHtcclxuXHJcbiAgICBibG9ja09wZXJhdGlvbnNTZXJ2aWNlOiBJQmxvY2tPcGVyYXRpb25zU2VydmljZTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihibG9ja09wZXJhdGlvbnNTZXJ2aWNlOiBJQmxvY2tPcGVyYXRpb25zU2VydmljZSkge1xyXG5cclxuICAgICAgICBzdXBlcih7fSk7XHJcbiAgICAgICAgdGhpcy5ibG9ja09wZXJhdGlvbnNTZXJ2aWNlID0gYmxvY2tPcGVyYXRpb25zU2VydmljZTtcclxuICAgICAgICB0aGlzLmF0dGFjaEV2ZW50cygpO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXQoKTogSFRNTEVsZW1lbnQge1xyXG5cclxuICAgICAgICBjb25zdCBodG1sRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuY2xhc3NMaXN0LmFkZChcInRpdGxlXCIpO1xyXG5cclxuICAgICAgICBjb25zdCBoMSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJoMVwiKTtcclxuICAgICAgICBoMS5zZXRBdHRyaWJ1dGUoXCJjb250ZW50RWRpdGFibGVcIiwgXCJ0cnVlXCIpO1xyXG4gICAgICAgIGgxLnNldEF0dHJpYnV0ZShcImRhdGEtcGxhY2Vob2xkZXJcIiwgXCJVbnRpdGxlZFwiKTtcclxuXHJcbiAgICAgICAgaWYgKHdpbmRvdy5lZGl0b3JDb25maWc/LnRpdGxlKSB7XHJcbiAgICAgICAgICAgIGgxLnRleHRDb250ZW50ID0gd2luZG93LmVkaXRvckNvbmZpZz8udGl0bGVcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGh0bWxFbGVtZW50LmFwcGVuZENoaWxkKGgxKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGh0bWxFbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIGF0dGFjaEV2ZW50cygpIHtcclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIChldmVudCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoZXZlbnQua2V5ID09IFwiRW50ZXJcIikge1xyXG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuZXhlY0NvbW1hbmQoQmxvY2tPcGVyYXRpb25zU2VydmljZS5CTE9DS19PUEVSQVRJT05TLkZPQ1VTX09OX0ZJUlNULCBmYWxzZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxufSIsImltcG9ydCB7IEVsZW1lbnRGYWN0b3J5U2VydmljZSB9IGZyb20gXCIuLi8uLi9zZXJ2aWNlcy9lbGVtZW50LWZhY3RvcnkvRWxlbWVudEZhY3RvcnlTZXJ2aWNlXCI7XHJcbmltcG9ydCB7IEJhc2VVSUNvbXBvbmVudCB9IGZyb20gXCIuLi9jb21tb24vQmFzZVVJQ29tcG9uZW50XCI7XHJcbmltcG9ydCB7IElFbGVtZW50RmFjdG9yeVNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vc2VydmljZXMvZWxlbWVudC1mYWN0b3J5L0lFbGVtZW50RmFjdG9yeVNlcnZpY2VcIjtcclxuaW1wb3J0IHsgQ29udGVudCB9IGZyb20gXCIuLi9jb250ZW50L0NvbnRlbnRcIjtcclxuaW1wb3J0IHsgVGl0bGUgfSBmcm9tIFwiLi4vdGl0bGUvVGl0bGVcIjtcclxuaW1wb3J0IHsgSUJsb2NrT3BlcmF0aW9uc1NlcnZpY2UgfSBmcm9tIFwiQC9zZXJ2aWNlcy9ibG9jay1vcGVyYXRpb25zL0lCbG9ja09wZXJhdGlvbnNTZXJ2aWNlXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgRWRpdG9yIGV4dGVuZHMgQmFzZVVJQ29tcG9uZW50IHtcclxuXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGVsZW1lbnRGYWN0b3J5U2VydmljZTogSUVsZW1lbnRGYWN0b3J5U2VydmljZTtcclxuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IGVkaXRvcklkOiBzdHJpbmcgPSBcImpvaGFubmVzRWRpdG9yXCI7XHJcbiAgICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZTogRWRpdG9yO1xyXG5cclxuICAgIHByaXZhdGUgdGl0bGU/OiBUaXRsZTtcclxuICAgIHByaXZhdGUgY29udGVudD86IENvbnRlbnQ7XHJcblxyXG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihcclxuICAgICAgICBlbGVtZW50RmFjdG9yeVNlcnZpY2U6IElFbGVtZW50RmFjdG9yeVNlcnZpY2UsXHJcbiAgICAgICAgYmxvY2tPcGVyYXRpb25zU2VydmljZTogSUJsb2NrT3BlcmF0aW9uc1NlcnZpY2UpIHtcclxuXHJcbiAgICAgICAgc3VwZXIoe1xyXG4gICAgICAgICAgICBlbGVtZW50RmFjdG9yeVNlcnZpY2U6IGVsZW1lbnRGYWN0b3J5U2VydmljZSxcclxuICAgICAgICAgICAgYmxvY2tPcGVyYXRpb25zU2VydmljZTogYmxvY2tPcGVyYXRpb25zU2VydmljZVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpZiAoRWRpdG9yLmluc3RhbmNlKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVzZSBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLmdldEluc3RhbmNlKCkgdG8gZ2V0IGluc3RhbmNlLlwiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZWxlbWVudEZhY3RvcnlTZXJ2aWNlID0gZWxlbWVudEZhY3RvcnlTZXJ2aWNlO1xyXG5cclxuICAgICAgICB0aGlzLmF0dGFjaEV2ZW50cygpO1xyXG5cclxuICAgICAgICBFZGl0b3IuaW5zdGFuY2UgPSB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXQoKTogSFRNTEVsZW1lbnQge1xyXG5cclxuICAgICAgICBjb25zdCBodG1sRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKEVkaXRvci5lZGl0b3JJZCkgfHwgZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuXHJcbiAgICAgICAgaHRtbEVsZW1lbnQuY2xhc3NMaXN0LmFkZChcImpvaGFubmVzLWVkaXRvclwiKTtcclxuXHJcbiAgICAgICAgaWYgKHdpbmRvdy5lZGl0b3JDb25maWc/LmVuYWJsZVRpdGxlIHx8IHRydWUpIHtcclxuICAgICAgICAgICAgdGhpcy50aXRsZSA9IG5ldyBUaXRsZSh0aGlzLnByb3BzLmJsb2NrT3BlcmF0aW9uc1NlcnZpY2UpO1xyXG5cclxuICAgICAgICAgICAgaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy50aXRsZS5odG1sRWxlbWVudCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmNvbnRlbnQgPSBuZXcgQ29udGVudCh0aGlzLnByb3BzLmVsZW1lbnRGYWN0b3J5U2VydmljZSwgdGhpcy5wcm9wcy5ibG9ja09wZXJhdGlvbnNTZXJ2aWNlKTtcclxuXHJcbiAgICAgICAgaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5jb250ZW50Lmh0bWxFbGVtZW50KTtcclxuXHJcbiAgICAgICAgLy8gaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5wcm9wcy5jb250ZW50Lmh0bWxFbGVtZW50KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGh0bWxFbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBnZXRJbnN0YW5jZShlbGVtZW50RmFjdG9yeVNlcnZpY2U6IElFbGVtZW50RmFjdG9yeVNlcnZpY2UsIGJsb2NrT3BlcmF0aW9uc1NlcnZpY2U6IElCbG9ja09wZXJhdGlvbnNTZXJ2aWNlKSB7XHJcblxyXG4gICAgICAgIGlmICghRWRpdG9yLmluc3RhbmNlKSB7XHJcbiAgICAgICAgICAgIEVkaXRvci5pbnN0YW5jZSA9IG5ldyBFZGl0b3IoZWxlbWVudEZhY3RvcnlTZXJ2aWNlLCBibG9ja09wZXJhdGlvbnNTZXJ2aWNlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBFZGl0b3IuaW5zdGFuY2U7XHJcbiAgICB9XHJcblxyXG4gICAgYXR0YWNoRXZlbnRzKCkge1xyXG5cclxuICAgICAgICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChFZGl0b3IuZWRpdG9ySWQpO1xyXG5cclxuICAgICAgICBjb250YWluZXI/LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlb3ZlcicsIChldmVudCkgPT4ge1xyXG5cclxuICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xyXG5cclxuICAgICAgICAgICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIE5vZGUpIHtcclxuICAgICAgICAgICAgICAgIGxldCBlbGVtZW50ID0gdGFyZ2V0IGFzIE5vZGU7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50RWxlbWVudCBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEVsZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBibG9ja0VsZW1lbnQgPSBlbGVtZW50LmNsb3Nlc3QoJy5ibG9jaycpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoYmxvY2tFbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwZW5kRHJhZ0hhbmRsZXIoYmxvY2tFbGVtZW50KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0V2ZW50IHRhcmdldCBpcyBub3QgYW4gSFRNTEVsZW1lbnQgYW5kIGNhbm5vdCBoYW5kbGUgSFRNTEVsZW1lbnQgc3BlY2lmaWMgbWV0aG9kczonLCBlbGVtZW50KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0V2ZW50IHRhcmdldCBpcyBub3QgYSBOb2RlOicsIHRhcmdldCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy9Gb2N1cyBvbiB0aGUgZmlyc3QgcGFyYWdyYXBoXHJcbiAgICAgICAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICdsb2FkaW5nJykge1xyXG4gICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZmlyc3RQYXJhZ3JhcGggPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiI2pvaGFubmVzRWRpdG9yID4gLmNvbnRlbnQgLmJsb2NrIHBcIikgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgICAgICAgICBpZiAoZmlyc3RQYXJhZ3JhcGgpIHtcclxuICAgICAgICAgICAgICAgICAgICBmaXJzdFBhcmFncmFwaC5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBmaXJzdFBhcmFncmFwaCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjam9oYW5uZXNFZGl0b3IgPiAuY29udGVudCAuYmxvY2sgcFwiKSBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICAgICAgaWYgKGZpcnN0UGFyYWdyYXBoKSB7XHJcbiAgICAgICAgICAgICAgICBmaXJzdFBhcmFncmFwaC5mb2N1cygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdwYXN0ZScsIGZ1bmN0aW9uIChldmVudDogQ2xpcGJvYXJkRXZlbnQpIHtcclxuICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgICAgICBpZiAodGFyZ2V0LmdldEF0dHJpYnV0ZSgnY29udGVudGVkaXRhYmxlJykgPT09ICd0cnVlJykge1xyXG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBjbGlwYm9hcmREYXRhID0gZXZlbnQuY2xpcGJvYXJkRGF0YTtcclxuICAgICAgICAgICAgICAgIGlmIChjbGlwYm9hcmREYXRhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGV4dCA9IGNsaXBib2FyZERhdGEuZ2V0RGF0YSgndGV4dC9wbGFpbicpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBFZGl0b3IuaW5zZXJ0VGV4dEF0Q3Vyc29yKHRleHQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSwgdHJ1ZSk7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBpbnNlcnRUZXh0QXRDdXJzb3IodGV4dDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3Qgc2VsID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG5cclxuICAgICAgICBpZiAoc2VsKSB7XHJcbiAgICAgICAgICAgIGlmIChzZWwucmFuZ2VDb3VudCA+IDApIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gc2VsLmdldFJhbmdlQXQoMCk7XHJcbiAgICAgICAgICAgICAgICByYW5nZS5kZWxldGVDb250ZW50cygpO1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IHRleHROb2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGV4dCk7XHJcbiAgICAgICAgICAgICAgICByYW5nZS5pbnNlcnROb2RlKHRleHROb2RlKTtcclxuXHJcbiAgICAgICAgICAgICAgICByYW5nZS5zZXRTdGFydEFmdGVyKHRleHROb2RlKTtcclxuICAgICAgICAgICAgICAgIHJhbmdlLnNldEVuZEFmdGVyKHRleHROb2RlKTtcclxuICAgICAgICAgICAgICAgIHNlbC5yZW1vdmVBbGxSYW5nZXMoKTtcclxuICAgICAgICAgICAgICAgIHNlbC5hZGRSYW5nZShyYW5nZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXBwZW5kRHJhZ0hhbmRsZXIoZWxlbWVudDogTm9kZSk6IHZvaWQge1xyXG4gICAgICAgIGlmIChlbGVtZW50Lm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xyXG4gICAgICAgICAgICBlbGVtZW50ID0gZWxlbWVudC5wYXJlbnROb2RlIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdQcm92aWRlZCBlbGVtZW50IGlzIG5vdCBhbiBIVE1MRWxlbWVudDonLCBlbGVtZW50KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgcGFyZW50ID0gZWxlbWVudC5jbG9zZXN0KCcuYmxvY2snKTtcclxuICAgICAgICBsZXQgZHJhZ0hhbmRsZXIgPSBwYXJlbnQ/LnF1ZXJ5U2VsZWN0b3IoXCIuZHJhZy1oYW5kbGVyXCIpO1xyXG5cclxuICAgICAgICBpZiAoIWRyYWdIYW5kbGVyICYmIHBhcmVudCkge1xyXG4gICAgICAgICAgICBkcmFnSGFuZGxlciA9IHRoaXMuZWxlbWVudEZhY3RvcnlTZXJ2aWNlLmNyZWF0ZShFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5EUkFHX0hBTkRMRV9CVVRUT04pO1xyXG4gICAgICAgICAgICBwYXJlbnQucHJlcGVuZChkcmFnSGFuZGxlcik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJlbW92ZURyYWdIYW5kbGVyKGVsZW1lbnQ6IE5vZGUpOiB2b2lkIHtcclxuICAgICAgICBpZiAoZWxlbWVudC5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUpIHtcclxuICAgICAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZSBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcignUHJvdmlkZWQgZWxlbWVudCBpcyBub3QgYW4gSFRNTEVsZW1lbnQ6JywgZWxlbWVudCk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHBhcmVudCA9IGVsZW1lbnQuY2xvc2VzdCgnLmJsb2NrJyk7XHJcbiAgICAgICAgaWYgKHBhcmVudCkge1xyXG4gICAgICAgICAgICBjb25zdCBkcmFnSGFuZGxlciA9IHBhcmVudC5xdWVyeVNlbGVjdG9yKFwiLmRyYWctaGFuZGxlclwiKTtcclxuICAgICAgICAgICAgZHJhZ0hhbmRsZXI/LnJlbW92ZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBleHRyYWN0Q29udGVudCgpIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb3QgaW1wbGVtZW50ZWQgRXhjZXB0aW9uXCIpO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgRWRpdG9yIH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvZWRpdG9yL0VkaXRvclwiO1xyXG5pbXBvcnQgeyBFbGVtZW50RmFjdG9yeVNlcnZpY2UgfSBmcm9tIFwiLi4vc2VydmljZXMvZWxlbWVudC1mYWN0b3J5L0VsZW1lbnRGYWN0b3J5U2VydmljZVwiO1xyXG5pbXBvcnQgeyBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlIH0gZnJvbSBcIi4uL3NlcnZpY2VzL2Jsb2NrLW9wZXJhdGlvbnMvQmxvY2tPcGVyYXRpb25zU2VydmljZVwiO1xyXG5pbXBvcnQgeyBTZXJ2aWNlUHJvdmlkZXIgfSBmcm9tIFwiLi4vc2VydmljZXMvc2VydmljZS1wcm92aWRlci9TZXJ2aWNlUHJvdmlkZXJcIjtcclxuaW1wb3J0IHsgVGV4dE9wZXJhdGlvblNlcnZpY2UgfSBmcm9tIFwiLi4vc2VydmljZXMvdGV4dC1vcGVyYXRpb25zL1RleHRPcGVyYXRpb25TZXJ2aWNlXCI7XHJcbmltcG9ydCB7IFF1aWNrTWVudUJ1aWxkZXIgfSBmcm9tIFwiLi9RdWlja01lbnVCdWlsZGVyXCI7XHJcbmltcG9ydCB7IEZsb2F0aW5nVG9vbGJhckJ1aWxkZXIgfSBmcm9tIFwiLi9GbG9hdGluZ1Rvb2xiYXJCdWlsZGVyXCI7XHJcbmltcG9ydCB7IEZsb2F0aW5nVG9vbGJhciB9IGZyb20gXCIuLi9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvRmxvYXRpbmdUb29sYmFyXCI7XHJcbmltcG9ydCB7IFF1aWNrTWVudSB9IGZyb20gXCIuLi9jb21wb25lbnRzL3F1aWNrLW1lbnUvUXVpY2tNZW51XCI7XHJcbmltcG9ydCB7IEFkZEJsb2NrIH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvYWRkLWJsb2NrL0FkZEJsb2NrXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgVUlCdWlsZGVyIHtcclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZTogVUlCdWlsZGVyO1xyXG5cclxuICAgIHByaXZhdGUgZWRpdG9yOiBFZGl0b3I7XHJcbiAgICBwcml2YXRlIGFkZEJsb2NrOiBBZGRCbG9jaztcclxuICAgIHByaXZhdGUgZmxvYXRpbmdUb29sYmFyOiBGbG9hdGluZ1Rvb2xiYXI7XHJcbiAgICBwcml2YXRlIHF1aWNrTWVudTogUXVpY2tNZW51O1xyXG5cclxuICAgIHByaXZhdGUgY29uc3RydWN0b3IoXHJcblxyXG4gICAgICAgIGVkaXRvcjogRWRpdG9yLFxyXG4gICAgICAgIGFkZEJvY2s6IEFkZEJsb2NrLFxyXG4gICAgICAgIGZsb2F0aW5nVG9vbGJhcjogRmxvYXRpbmdUb29sYmFyLFxyXG4gICAgICAgIHF1aWNrTWVudTogUXVpY2tNZW51KSB7XHJcblxyXG4gICAgICAgIGlmIChVSUJ1aWxkZXIuaW5zdGFuY2UpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmVkaXRvciA9IGVkaXRvcjtcclxuICAgICAgICB0aGlzLmFkZEJsb2NrID0gYWRkQm9jaztcclxuICAgICAgICB0aGlzLmZsb2F0aW5nVG9vbGJhciA9IGZsb2F0aW5nVG9vbGJhcjtcclxuICAgICAgICB0aGlzLnF1aWNrTWVudSA9IHF1aWNrTWVudTtcclxuXHJcbiAgICAgICAgVUlCdWlsZGVyLmluc3RhbmNlID0gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgYnVpbGQoc2VydmljZXM/OiBNYXA8c3RyaW5nLCBhbnk+KTogVUlCdWlsZGVyIHtcclxuXHJcbiAgICAgICAgaWYgKFVJQnVpbGRlci5pbnN0YW5jZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gVUlCdWlsZGVyLmluc3RhbmNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3Qgc2VydmljZVByb3ZpZGVyID0gU2VydmljZVByb3ZpZGVyLmdldEluc3RhbmNlKCk7XHJcblxyXG4gICAgICAgIC8vIEluaXRpYWxpemVyIGFsbCBzZXJ2aWNlIGJlZm9yZSBhbnkgY29tcG9uZW50XHJcbiAgICAgICAgaWYgKHNlcnZpY2VzKSB7XHJcbiAgICAgICAgICAgIHNlcnZpY2VQcm92aWRlci5yZXNldCgpO1xyXG4gICAgICAgICAgICBzZXJ2aWNlUHJvdmlkZXIucmVnaXN0ZXJTZXJ2aWNlcyhzZXJ2aWNlcyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuXHJcbiAgICAgICAgICAgIC8vUmVnaXN0ZXJpbmcgYWxsIGF2YWlsYWJsZSBzZXJ2aWNlc1xyXG4gICAgICAgICAgICBzZXJ2aWNlUHJvdmlkZXIucmVnaXN0ZXJTZXJ2aWNlKFwiSUJsb2NrT3BlcmF0aW9uc1NlcnZpY2VcIiwgQmxvY2tPcGVyYXRpb25zU2VydmljZS5nZXRJbnN0YW5jZSgpKTtcclxuICAgICAgICAgICAgc2VydmljZVByb3ZpZGVyLnJlZ2lzdGVyU2VydmljZShcIklFbGVtZW50RmFjdG9yeVNlcnZpY2VcIiwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkpO1xyXG4gICAgICAgICAgICBzZXJ2aWNlUHJvdmlkZXIucmVnaXN0ZXJTZXJ2aWNlKFwiSVRleHRPcGVyYXRpb25TZXJ2aWNlXCIsIFRleHRPcGVyYXRpb25TZXJ2aWNlLmdldEluc3RhbmNlKCkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZWRpdG9yID0gRWRpdG9yLmdldEluc3RhbmNlKHNlcnZpY2VQcm92aWRlci5nZXRJbnN0YW5jZU9mKFwiSUVsZW1lbnRGYWN0b3J5U2VydmljZVwiKSwgc2VydmljZVByb3ZpZGVyLmdldEluc3RhbmNlT2YoXCJJQmxvY2tPcGVyYXRpb25zU2VydmljZVwiKSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGFkZEJsb2NrID0gbmV3IEFkZEJsb2NrKHNlcnZpY2VQcm92aWRlci5nZXRJbnN0YW5jZU9mKFwiSUJsb2NrT3BlcmF0aW9uc1NlcnZpY2VcIikpO1xyXG4gICAgICAgIGNvbnN0IGZsb2F0aW5nVG9vbGJhciA9IEZsb2F0aW5nVG9vbGJhckJ1aWxkZXIuYnVpbGQoKTtcclxuICAgICAgICBjb25zdCBxdWlja01lbnUgPSBRdWlja01lbnVCdWlsZGVyLmJ1aWxkKCk7XHJcblxyXG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgVUlCdWlsZGVyKGVkaXRvciwgYWRkQmxvY2ssIGZsb2F0aW5nVG9vbGJhciwgcXVpY2tNZW51KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGJ1aWxkZXI7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhcnQoKTogRWRpdG9yIHtcclxuXHJcbiAgICAgICAgLy8gaWYgKHdpbmRvdy5lZGl0b3JDb25maWc/LmVuYWJsZVRpdGxlKSB7XHJcbiAgICAgICAgLy8gICAgIHRoaXMuZWRpdG9yLmh0bWxFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMudGl0bGUuaHRtbEVsZW1lbnQpO1xyXG4gICAgICAgIC8vIH1cclxuXHJcbiAgICAgICAgaWYgKHdpbmRvdy5lZGl0b3JDb25maWc/LmVuYWJsZUFkZEJsb2NrIHx8IHRydWUpIHtcclxuICAgICAgICAgICAgdGhpcy5lZGl0b3IuaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5hZGRCbG9jay5odG1sRWxlbWVudCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAod2luZG93LmVkaXRvckNvbmZpZz8uZW5hYmxlRmxvYXRpbmdUb29sYmFyIHx8IHRydWUpIHtcclxuICAgICAgICAgICAgdGhpcy5lZGl0b3IuaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5mbG9hdGluZ1Rvb2xiYXIuaHRtbEVsZW1lbnQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHdpbmRvdy5lZGl0b3JDb25maWc/LmVuYWJsZVF1aWNrTWVudSB8fCB0cnVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZWRpdG9yLmh0bWxFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMucXVpY2tNZW51Lmh0bWxFbGVtZW50KTtcclxuICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5lZGl0b3I7XHJcbiAgICB9XHJcbn0iLCIvL1RPRE8gdXNlIGNvbW1hbmRzXG5pbXBvcnQgeyBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvYmxvY2stb3BlcmF0aW9ucy9CbG9ja09wZXJhdGlvbnNTZXJ2aWNlJztcbmltcG9ydCB7IEVsZW1lbnRGYWN0b3J5U2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2VsZW1lbnQtZmFjdG9yeS9FbGVtZW50RmFjdG9yeVNlcnZpY2UnO1xuaW1wb3J0IHsgUXVpY2tNZW51QnVpbGRlciB9IGZyb20gXCIuLi9idWlsZGVycy9RdWlja01lbnVCdWlsZGVyXCI7XG5pbXBvcnQgeyBGbG9hdGluZ1Rvb2xiYXJCdWlsZGVyIH0gZnJvbSBcIi4uL2J1aWxkZXJzL0Zsb2F0aW5nVG9vbGJhckJ1aWxkZXJcIjtcbmltcG9ydCB7IEFkZEJsb2NrIH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvYWRkLWJsb2NrL0FkZEJsb2NrXCI7XG5pbXBvcnQgaWNvbnNTVkcgZnJvbSAnLi4vYXNzZXRzL2ltZy9pY29ucy5zdmcnO1xuXG5pbXBvcnQgeyBVSUJ1aWxkZXIgfSBmcm9tIFwiLi4vYnVpbGRlcnMvVUlCdWlsZGVyXCI7XG5cblxuLy9Gb2N1cyBvbiBQIHdoZW4gbG9hZFxuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBlZGl0b3IgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuam9oYW5uZXMtZWRpdG9yJyk7XG5cbiAgICBpZiAoZWRpdG9yKSB7XG4gICAgICAgIGxldCBibG9ja3MgPSBlZGl0b3IucXVlcnlTZWxlY3RvckFsbCgnLmJsb2NrJyk7XG5cbiAgICAgICAgaWYgKGJsb2Nrcy5sZW5ndGggPT0gMSkge1xuXG4gICAgICAgICAgICBjb25zdCBwID0gYmxvY2tzWzBdLnF1ZXJ5U2VsZWN0b3IoJy5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQnKTtcbiAgICAgICAgICAgIGlmIChwLmlubmVyVGV4dCA9PSAnJykge1xuICAgICAgICAgICAgICAgIHAuZm9jdXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn0pO1xuXG5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgZnVuY3Rpb24gKCkge1xuICAgIFVJQnVpbGRlci5idWlsZCgpLnN0YXJ0KCk7XG59KTtcblxuXG5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHN2Z0NvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHN2Z0NvbnRhaW5lci5pbm5lckhUTUwgPSBpY29uc1NWRztcblxuICAgIHN2Z0NvbnRhaW5lci5jbGFzc05hbWUgPSAnc3ZnLWljb25zLWNvbnRhaW5lcic7XG5cbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHN2Z0NvbnRhaW5lcik7XG59KTsiLCIvL1RoZSBzdGFydCBwb2ludCBmb3Iga2V5IHByZXNzIGV2ZW50c1xyXG5pbXBvcnQgKiBhcyBjb21tYW5kRmFjdG9yeSBmcm9tICcuLi9jb21tYW5kcy9jb21tYW5kLWZhY3RvcnknO1xyXG5pbXBvcnQgeyBpc1Nob3dpbmdCbG9ja09wdGlvbnMgfSBmcm9tICcuLi9jb21wb25lbnRzL3F1aWNrLW1lbnUvcXVpY2staW5zZXJ0LW1lbnUnO1xyXG5pbXBvcnQgeyBpc1RyaWdnYWJsZSB9IGZyb20gJy4uL2hlbHBlcic7XHJcbmltcG9ydCB7IGNhbkhpZGVUZXh0Rm9ybWF0dGluZ0JhciwgaXNTaG93aW5nVGV4dEZvcm1hdHRpbmdCYXIgfSBmcm9tICcuLi9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvdGV4dC1mb3JtYXR0aW5nLWJhcic7XHJcbmltcG9ydCB7IGlzU2hvd2luZ1RleHRGb3JtYXR0aW5nU2VsZWN0YWJsZURlcGVuZGVudEJveCB9IGZyb20gJy4uL2NvbXBvbmVudHMvZmxvYXRpbmctdG9vbGJhci90ZXh0LWZvcm1hdHRpbmctYmFyJztcclxuXHJcblxyXG4vLyBCbG9jayBvcGVyYXRpb25zIGlzIG9wZXJhdGlvbnMgcmVsYXRlZCB0byB0aGUgYmxvY2sgaXQgc2VsZi4gQ3JlYXRlIGEgYmxvY2ssIGRlbGV0ZSBhIGJsb2NrLCBjaGFuZ2UgdGhlIGJsb2NrIHR5cGUsIGV0Yy4uLlxyXG5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgZnVuY3Rpb24gKCkge1xyXG5cclxuXHJcbiAgICAvLyBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgZnVuY3Rpb24gKGV2ZW50KSB7XHJcblxyXG4gICAgLy8gICAgIGlmIChpc1RyaWdnYWJsZShldmVudCkgJiYgIWlzU2hvd2luZ0Jsb2NrT3B0aW9ucygpKSB7XHJcblxyXG4gICAgLy8gICAgICAgICBpZiAoZXZlbnQua2V5ID09PSAnRW50ZXInICYmICFpc1Nob3dpbmdUZXh0Rm9ybWF0dGluZ1NlbGVjdGFibGVEZXBlbmRlbnRCb3goKSAmJiAhaXNTaG93aW5nVGV4dEZvcm1hdHRpbmdCYXIoKSAmJiAhZXZlbnQuY3RybEtleSAmJiAhZXZlbnQuc2hpZnRLZXkgJiYgIWV2ZW50LmFsdEtleSkge1xyXG5cclxuICAgIC8vICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAvLyAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHJcbiAgICAvLyAgICAgICAgICAgICAvL1RPRE86IHBhc3MgdGhlIGV2ZW50IG5vdCBldmVudC50YXJnZXQvaXRgcyBtb3JlIHNpbXBsZSB0byBkZWFsIHdpdGggZXZlbnQgd2hlbiBjcmVhdGUgYSBjbGljayBldmVudExpc3RlbmVyXHJcbiAgICAvLyAgICAgICAgICAgICBjb25zdCBjb21tYW5kID0gY29tbWFuZEZhY3RvcnkuY3JlYXRlQ29tbWFuZChjb21tYW5kRmFjdG9yeS5PUEVSQVRJT05TLkJMT0NLLkNSRUFURV9ORVdfRUxFTUVOVCwgW2V2ZW50XSk7XHJcbiAgICAvLyAgICAgICAgICAgICBjb21tYW5kLmV4ZWN1dGUoKTtcclxuXHJcbiAgICAvLyAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnQmFja3NwYWNlJyAmJiBpc0FjdGl2ZUNvbnRlbnRCbGFuayhldmVudCkgJiYgIWV2ZW50LmN0cmxLZXkgJiYgIWV2ZW50LnNoaWZ0S2V5ICYmICFldmVudC5hbHRLZXkpIHtcclxuXHJcbiAgICAvLyAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cclxuICAgIC8vICAgICAgICAgICAgIGNvbnN0IGNvbW1hbmQgPSBjb21tYW5kRmFjdG9yeS5jcmVhdGVDb21tYW5kKGNvbW1hbmRGYWN0b3J5Lk9QRVJBVElPTlMuQkxPQ0suREVMRVRFX0FORF9GT0NVU19PTl9QUkVWSU9VUyk7XHJcbiAgICAvLyAgICAgICAgICAgICBjb21tYW5kLmV4ZWN1dGUoKTtcclxuXHJcbiAgICAvLyAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnRGVsZXRlJyAmJiBpc0FjdGl2ZUNvbnRlbnRCbGFuaygpICYmICFldmVudC5jdHJsS2V5ICYmICFldmVudC5zaGlmdEtleSAmJiAhZXZlbnQuYWx0S2V5KSB7XHJcblxyXG4gICAgLy8gICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHJcbiAgICAvLyAgICAgICAgICAgICBjb25zdCBjb21tYW5kID0gY29tbWFuZEZhY3RvcnkuY3JlYXRlQ29tbWFuZChjb21tYW5kRmFjdG9yeS5PUEVSQVRJT05TLkJMT0NLLkRFTEVURV9BTkRfRk9DVVNfT05fTkVYVCk7XHJcbiAgICAvLyAgICAgICAgICAgICBjb21tYW5kLmV4ZWN1dGUoKTtcclxuXHJcbiAgICAvLyAgICAgICAgIH1cclxuICAgIC8vICAgICB9XHJcbiAgICAvLyB9KTtcclxuXHJcbiAgICAvLyBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXl1cCcsIGZ1bmN0aW9uIChldmVudCkge1xyXG5cclxuICAgIC8vICAgICBpZiAoaXNUcmlnZ2FibGUoZXZlbnQpICYmICFpc1Nob3dpbmdCbG9ja09wdGlvbnMoKSkge1xyXG4gICAgLy8gICAgICAgICBpZiAoZXZlbnQua2V5ID09PSAnRXNjYXBlJyAmJiBpc0FjdGl2ZUNvbnRlbnRCbGFuaygpICYmICFldmVudC5jdHJsS2V5ICYmICFldmVudC5zaGlmdEtleSAmJiAhZXZlbnQuYWx0S2V5KSB7XHJcblxyXG4gICAgLy8gICAgICAgICAgICAgLy9UT0RPOiB3cml0ZSB0aGUgY29kZSB0byBzZWxlY3QgdGhlIGFsbCB0ZXh0XHJcblxyXG4gICAgLy8gICAgICAgICB9XHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gfSk7XHJcbn0pO1xyXG5cclxuLy8gQmxvY2sgb3B0aW9ucyBvcGVyYXRpb25zIGlzIG9wZXJhdGlvbnMgcmVsYXRlZCB0byB0aGUgQmxvY2sgT3B0aW9ucy4gU2hvdyB0aGUgYmxvY2sgb3B0aW9ucywgaGlkZSB0aGUgYmxvY2sgb3B0aW9ucywgZmlsdGVyLCAuLi5cclxuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgZnVuY3Rpb24gKGV2ZW50KSB7XHJcblxyXG4gICAgICAgIC8vIGlmIChpc1Nob3dpbmdCbG9ja09wdGlvbnMoKSkge1xyXG5cclxuICAgICAgICAgICAgLy8gaWYgKGV2ZW50LmtleSA9PT0gJ0VzY2FwZScgJiYgIWV2ZW50LmN0cmxLZXkgJiYgIWV2ZW50LnNoaWZ0S2V5ICYmICFldmVudC5hbHRLZXkpIHtcclxuXHJcbiAgICAgICAgICAgIC8vICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cclxuICAgICAgICAgICAgLy8gICAgIGNvbnN0IGVsZW1lbnRUb0ZvY3VzQWZ0ZXJIaWRlID0gZXZlbnQudGFyZ2V0O1xyXG5cclxuICAgICAgICAgICAgLy8gICAgIC8vVE9ETzogcGFzcyB0aGUgZXZlbnQgbm90IGV2ZW50LnRhcmdldC9pdGBzIG1vcmUgc2ltcGxlIHRvIGRlYWwgd2l0aCBldmVudCB3aGVuIGNyZWF0ZSBhIGNsaWNrIGV2ZW50TGlzdGVuZXJcclxuICAgICAgICAgICAgLy8gICAgIGNvbnN0IGNvbW1hbmQgPSBjb21tYW5kRmFjdG9yeS5jcmVhdGVDb21tYW5kKGNvbW1hbmRGYWN0b3J5Lk9QRVJBVElPTlMuQkxPQ0tfT1BUSU9OUy5ISURFX0NMRUFSX0JMT0NLX09QVElPTlMsIFtlbGVtZW50VG9Gb2N1c0FmdGVySGlkZV0pO1xyXG4gICAgICAgICAgICAvLyAgICAgY29tbWFuZC5leGVjdXRlKCk7XHJcblxyXG4gICAgICAgICAgICAvLyB9XHJcblxyXG4gICAgICAgICAgICAvLyBlbHNlIGlmIChldmVudC5rZXkgPT09ICdFbnRlcicgJiYgIWV2ZW50LmN0cmxLZXkgJiYgIWV2ZW50LnNoaWZ0S2V5ICYmICFldmVudC5hbHRLZXkpIHtcclxuXHJcbiAgICAgICAgICAgIC8vICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAvLyAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgICAgICAgICAvLyAgICAgY29uc3QgY29tbWFuZCA9IGNvbW1hbmRGYWN0b3J5LmNyZWF0ZUNvbW1hbmQoY29tbWFuZEZhY3RvcnkuT1BFUkFUSU9OUy5CTE9DS19PUFRJT05TLkFQUExZX1NFTEVDVEVEX0JMT0NLX1RZUEUsIFtldmVudF0pO1xyXG4gICAgICAgICAgICAvLyAgICAgY29tbWFuZC5leGVjdXRlKCk7XHJcblxyXG4gICAgICAgICAgICAvLyB9IGVsc2UgaWYgKC9eW2EtejAtOV0kL2kudGVzdChldmVudC5rZXkpICYmICFldmVudC5jdHJsS2V5ICYmICFldmVudC5zaGlmdEtleSAmJiAhZXZlbnQuYWx0S2V5KSB7XHJcblxyXG4gICAgICAgICAgICAvLyAgICAgY29uc3QgY29tbWFuZCA9IGNvbW1hbmRGYWN0b3J5LmNyZWF0ZUNvbW1hbmQoY29tbWFuZEZhY3RvcnkuT1BFUkFUSU9OUy5CTE9DS19PUFRJT05TLkZJTFRFUl9DT05DQVQsIFtldmVudF0pO1xyXG4gICAgICAgICAgICAvLyAgICAgY29tbWFuZC5leGVjdXRlKCk7XHJcblxyXG4gICAgICAgICAgICAvLyB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJ0JhY2tzcGFjZScpIHtcclxuXHJcbiAgICAgICAgICAgIC8vICAgICBjb25zdCBjb21tYW5kID0gY29tbWFuZEZhY3RvcnkuY3JlYXRlQ29tbWFuZChjb21tYW5kRmFjdG9yeS5PUEVSQVRJT05TLkJMT0NLX09QVElPTlMuRklMVEVSX1JFTU9WRV9MQVNUKTtcclxuICAgICAgICAgICAgLy8gICAgIGNvbW1hbmQuZXhlY3V0ZSgpO1xyXG4gICAgICAgICAgICAvLyB9XHJcbiAgICAgICAgLy8gfVxyXG5cclxuXHJcbiAgICAgICAgLy8gaWYgKGlzU2hvd2luZ1RleHRGb3JtYXR0aW5nU2VsZWN0YWJsZURlcGVuZGVudEJveCgpKSB7XHJcblxyXG4gICAgICAgIC8vICAgICBpZiAoZXZlbnQua2V5ID09PSAnRXNjYXBlJyAmJiAhZXZlbnQuY3RybEtleSAmJiAhZXZlbnQuc2hpZnRLZXkgJiYgIWV2ZW50LmFsdEtleSkge1xyXG5cclxuICAgICAgICAvLyAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblxyXG4gICAgICAgIC8vICAgICAgICAgY29uc3QgY29tbWFuZCA9IGNvbW1hbmRGYWN0b3J5LmNyZWF0ZUNvbW1hbmQoY29tbWFuZEZhY3RvcnkuT1BFUkFUSU9OUy5CTE9DS19PUFRJT05TLkhJREVfVEVYVF9GT1JNQVRUSU5HX0JBUiwgW2V2ZW50XSk7XHJcbiAgICAgICAgLy8gICAgICAgICBjb21tYW5kLmV4ZWN1dGUoKTtcclxuXHJcbiAgICAgICAgLy8gICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dEb3duJyAmJiAhZXZlbnQuY3RybEtleSAmJiAhZXZlbnQuc2hpZnRLZXkgJiYgIWV2ZW50LmFsdEtleSkge1xyXG5cclxuICAgICAgICAvLyAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblxyXG4gICAgICAgIC8vICAgICAgICAgY29uc3QgY29tbWFuZCA9IGNvbW1hbmRGYWN0b3J5LmNyZWF0ZUNvbW1hbmQoY29tbWFuZEZhY3RvcnkuT1BFUkFUSU9OUy5CTE9DS19PUFRJT05TLk1PVkVfRkFLRV9GT0NVU19UT19ORVhUX09QVElPTik7XHJcbiAgICAgICAgLy8gICAgICAgICBjb21tYW5kLmV4ZWN1dGUoKTtcclxuXHJcbiAgICAgICAgLy8gICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dVcCcgJiYgIWV2ZW50LmN0cmxLZXkgJiYgIWV2ZW50LnNoaWZ0S2V5ICYmICFldmVudC5hbHRLZXkpIHtcclxuXHJcbiAgICAgICAgLy8gICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cclxuICAgICAgICAvLyAgICAgICAgIGNvbnN0IGNvbW1hbmQgPSBjb21tYW5kRmFjdG9yeS5jcmVhdGVDb21tYW5kKGNvbW1hbmRGYWN0b3J5Lk9QRVJBVElPTlMuQkxPQ0tfT1BUSU9OUy5NT1ZFX0ZBS0VfRk9DVVNfVE9fUFJFVklPVVNfT1BUSU9OKTtcclxuICAgICAgICAvLyAgICAgICAgIGNvbW1hbmQuZXhlY3V0ZSgpO1xyXG5cclxuICAgICAgICAvLyAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICdFbnRlcicgJiYgIWV2ZW50LmN0cmxLZXkgJiYgIWV2ZW50LnNoaWZ0S2V5ICYmICFldmVudC5hbHRLZXkpIHtcclxuXHJcbiAgICAgICAgLy8gICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIC8vICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgICAgIC8vICAgICAgICAgY29uc3QgY29tbWFuZCA9IGNvbW1hbmRGYWN0b3J5LmNyZWF0ZUNvbW1hbmQoY29tbWFuZEZhY3RvcnkuT1BFUkFUSU9OUy5CTE9DS19PUFRJT05TLkFQUExZX1NFTEVDVEVEX0JMT0NLX1RZUEUsIFtldmVudF0pO1xyXG4gICAgICAgIC8vICAgICAgICAgY29tbWFuZC5leGVjdXRlKCk7XHJcblxyXG4gICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgLy8gfVxyXG4gICAgfSk7XHJcbn0pO1xyXG5cclxuXHJcbi8vIFRleHQgZm9ybWF0dGluZyBiYXIgb3BlcmF0aW9ucyBpcyBvcGVyYXRpb25zIHJlbGF0ZWQgdG8gdGV4dCBwcmVzZW50YXRpb24sIGNvbG9yLCBzaG93IG9yIGhpZGUgdGV4dCBmb3JtYXR0aW5nIGRlcGVuZGVudCBib3hlcywuLi5cclxuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLCBmdW5jdGlvbiAoZXZlbnQpIHtcclxuICAgIC8vIGlmIChldmVudC5rZXkgPT09ICdTaGlmdCcgJiYgaXNUcmlnZ2FibGUoZXZlbnQpKSB7XHJcblxyXG4gICAgLy8gICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgLy8gICAgICAgICBpZiAod2luZG93LmdldFNlbGVjdGlvbigpLnRvU3RyaW5nKCkudHJpbSgpICE9PSAnJykge1xyXG4gICAgLy8gICAgICAgICAgICAgY29uc3QgY29tbWFuZCA9IGNvbW1hbmRGYWN0b3J5LmNyZWF0ZUNvbW1hbmQoY29tbWFuZEZhY3RvcnkuT1BFUkFUSU9OUy5GT1JNQVRUSU5HX0JBUi5TSE9XX1RFWFRfRk9STUFUVElOR19CQVIsIFtldmVudF0pO1xyXG4gICAgLy8gICAgICAgICAgICAgY29tbWFuZC5leGVjdXRlKCk7XHJcbiAgICAvLyAgICAgICAgIH1cclxuICAgIC8vICAgICB9LCAxMCk7XHJcblxyXG4gICAgLy8gfVxyXG59KTtcclxuXHJcbi8vIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBmdW5jdGlvbiAoZXZlbnQpIHtcclxuLy8gICAgIGlmIChldmVudC5jdHJsS2V5ICYmIGV2ZW50LmtleS50b0xvd2VyQ2FzZSgpID09PSAnYScgJiYgaXNUcmlnZ2FibGUoZXZlbnQpKSB7XHJcblxyXG4vLyAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4vLyAgICAgICAgICAgICBpZiAod2luZG93LmdldFNlbGVjdGlvbigpLnRvU3RyaW5nKCkudHJpbSgpICE9PSAnJykge1xyXG4vLyAgICAgICAgICAgICAgICAgY29uc3QgY29tbWFuZCA9IGNvbW1hbmRGYWN0b3J5LmNyZWF0ZUNvbW1hbmQoY29tbWFuZEZhY3RvcnkuT1BFUkFUSU9OUy5GT1JNQVRUSU5HX0JBUi5TSE9XX1RFWFRfRk9STUFUVElOR19CQVIsIFtldmVudF0pO1xyXG4vLyAgICAgICAgICAgICAgICAgY29tbWFuZC5leGVjdXRlKCk7XHJcbi8vICAgICAgICAgICAgIH1cclxuLy8gICAgICAgICB9LCAxMCk7XHJcblxyXG4vLyAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICdFc2NhcGUnICYmIGNhbkhpZGVUZXh0Rm9ybWF0dGluZ0JhcigpICYmIGlzU2hvd2luZ1RleHRGb3JtYXR0aW5nQmFyKCkpIHtcclxuXHJcbi8vICAgICAgICAgY29uc3QgY29tbWFuZCA9IGNvbW1hbmRGYWN0b3J5LmNyZWF0ZUNvbW1hbmQoY29tbWFuZEZhY3RvcnkuT1BFUkFUSU9OUy5GT1JNQVRUSU5HX0JBUi5ISURFX1RFWFRfRk9STUFUVElOR19CQVIsIFtldmVudF0pO1xyXG4vLyAgICAgICAgIGNvbW1hbmQuZXhlY3V0ZSgpO1xyXG4vLyAgICAgfVxyXG4vLyB9KTtcclxuXHJcblxyXG5cclxuZnVuY3Rpb24gaXNBY3RpdmVDb250ZW50QmxhbmsoKSB7XHJcbiAgICByZXR1cm4gZG9jdW1lbnQuYWN0aXZlRWxlbWVudC50ZXh0Q29udGVudC50cmltKCkgPT09ICcnO1xyXG59XHJcblxyXG5cclxuLy8gTGlzdGVuIGEgaW5wdXQgbGlua1xyXG4vLyBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgZnVuY3Rpb24gKCkge1xyXG4vLyAgICAgbGlua0JveElucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBmdW5jdGlvbiAoZXZlbnQpIHtcclxuLy8gICAgICAgICBpZiAoZXZlbnQua2V5ID09PSAnRW50ZXInKSB7XHJcblxyXG4vLyAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4vLyAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHJcbi8vICAgICAgICAgICAgIGNvbnN0IGNvbW1hbmQgPSBjb21tYW5kRmFjdG9yeS5jcmVhdGVDb21tYW5kKGNvbW1hbmRGYWN0b3J5Lk9QRVJBVElPTlMuRk9STUFUVElOR19CQVIuSU5QVVRfTElOS19VUkwpO1xyXG4vLyAgICAgICAgICAgICBjb21tYW5kLmV4ZWN1dGUoKTtcclxuLy8gICAgICAgICB9XHJcbi8vICAgICB9KTtcclxuLy8gfSk7XHJcblxyXG5cclxuLy8gTG9jayBsZWZ0IGFuZCByaWdodCBrZXkgd2hlbiBpcyBzaG93aW5nIHRoZSBkZXBlbmRlbnQgYm94XHJcbi8vIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBmdW5jdGlvbiAoZXZlbnQpIHtcclxuLy8gICAgIGlmIChpc1Nob3dpbmdUZXh0Rm9ybWF0dGluZ1NlbGVjdGFibGVEZXBlbmRlbnRCb3goKSAmJlxyXG4vLyAgICAgICAgIChldmVudC5rZXkgPT09ICdBcnJvd0xlZnQnIHx8IGV2ZW50LmtleSA9PT0gJ0Fycm93UmlnaHQnKSkge1xyXG5cclxuLy8gICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4vLyAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4vLyAgICAgfVxyXG4vLyB9KTtcclxuXHJcblxyXG4vLyBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXl1cCcsIGZ1bmN0aW9uIChldmVudCkge1xyXG4vLyAgICAgaWYgKGlzU2hvd2luZ1RleHRGb3JtYXR0aW5nQmFyKCkgJiYgY2FuSGlkZVRleHRGb3JtYXR0aW5nQmFyKCkgJiYgIWlzU2hvd2luZ1RleHRGb3JtYXR0aW5nU2VsZWN0YWJsZURlcGVuZGVudEJveCgpICYmXHJcbi8vICAgICAgICAgKGV2ZW50LmtleSA9PT0gJ0Fycm93TGVmdCcgfHwgZXZlbnQua2V5ID09PSAnQXJyb3dSaWdodCcgfHwgZXZlbnQua2V5ID09PSAnQXJyb3dVcCcgfHwgZXZlbnQua2V5ID09PSAnQXJyb3dEb3duJykpIHtcclxuXHJcbi8vICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbi8vICAgICAgICAgICAgIGlmICh3aW5kb3cuZ2V0U2VsZWN0aW9uKCkudG9TdHJpbmcoKS50cmltKCkgPT0gJycpIHtcclxuLy8gICAgICAgICAgICAgICAgIGNvbnN0IGNvbW1hbmQgPSBjb21tYW5kRmFjdG9yeS5jcmVhdGVDb21tYW5kKGNvbW1hbmRGYWN0b3J5Lk9QRVJBVElPTlMuRk9STUFUVElOR19CQVIuSElERV9URVhUX0ZPUk1BVFRJTkdfQkFSLCBbZXZlbnRdKTtcclxuLy8gICAgICAgICAgICAgICAgIGNvbW1hbmQuZXhlY3V0ZSgpO1xyXG4vLyAgICAgICAgICAgICB9XHJcbi8vICAgICAgICAgfSwgMTApO1xyXG4vLyAgICAgfVxyXG4vLyB9KTsiLCJcbiAgICAgIGltcG9ydCBBUEkgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgIGltcG9ydCBkb21BUEkgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZURvbUFQSS5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydEZuIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qc1wiO1xuICAgICAgaW1wb3J0IHNldEF0dHJpYnV0ZXMgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRTdHlsZUVsZW1lbnQgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanNcIjtcbiAgICAgIGltcG9ydCBzdHlsZVRhZ1RyYW5zZm9ybUZuIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanNcIjtcbiAgICAgIGltcG9ydCBjb250ZW50LCAqIGFzIG5hbWVkRXhwb3J0IGZyb20gXCIhIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vbWFpbi5jc3NcIjtcbiAgICAgIFxuICAgICAgXG5cbnZhciBvcHRpb25zID0ge307XG5cbm9wdGlvbnMuc3R5bGVUYWdUcmFuc2Zvcm0gPSBzdHlsZVRhZ1RyYW5zZm9ybUZuO1xub3B0aW9ucy5zZXRBdHRyaWJ1dGVzID0gc2V0QXR0cmlidXRlcztcbm9wdGlvbnMuaW5zZXJ0ID0gaW5zZXJ0Rm4uYmluZChudWxsLCBcImhlYWRcIik7XG5vcHRpb25zLmRvbUFQSSA9IGRvbUFQSTtcbm9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50ID0gaW5zZXJ0U3R5bGVFbGVtZW50O1xuXG52YXIgdXBkYXRlID0gQVBJKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0ICogZnJvbSBcIiEhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9tYWluLmNzc1wiO1xuICAgICAgIGV4cG9ydCBkZWZhdWx0IGNvbnRlbnQgJiYgY29udGVudC5sb2NhbHMgPyBjb250ZW50LmxvY2FscyA6IHVuZGVmaW5lZDtcbiJdLCJuYW1lcyI6WyJfX19DU1NfTE9BREVSX0VYUE9SVF9fXyIsInB1c2giLCJtb2R1bGUiLCJpZCIsImV4cG9ydHMiLCJjc3NXaXRoTWFwcGluZ1RvU3RyaW5nIiwibGlzdCIsInRvU3RyaW5nIiwidGhpcyIsIm1hcCIsIml0ZW0iLCJjb250ZW50IiwibmVlZExheWVyIiwiY29uY2F0IiwibGVuZ3RoIiwiam9pbiIsImkiLCJtb2R1bGVzIiwibWVkaWEiLCJkZWR1cGUiLCJzdXBwb3J0cyIsImxheWVyIiwidW5kZWZpbmVkIiwiYWxyZWFkeUltcG9ydGVkTW9kdWxlcyIsImsiLCJfayIsImNzc01hcHBpbmciLCJidG9hIiwiYmFzZTY0IiwidW5lc2NhcGUiLCJlbmNvZGVVUklDb21wb25lbnQiLCJKU09OIiwic3RyaW5naWZ5IiwiZGF0YSIsInNvdXJjZU1hcHBpbmciLCJzdHlsZXNJbkRPTSIsImdldEluZGV4QnlJZGVudGlmaWVyIiwiaWRlbnRpZmllciIsInJlc3VsdCIsIm1vZHVsZXNUb0RvbSIsIm9wdGlvbnMiLCJpZENvdW50TWFwIiwiaWRlbnRpZmllcnMiLCJiYXNlIiwiY291bnQiLCJpbmRleEJ5SWRlbnRpZmllciIsIm9iaiIsImNzcyIsInNvdXJjZU1hcCIsInJlZmVyZW5jZXMiLCJ1cGRhdGVyIiwiYWRkRWxlbWVudFN0eWxlIiwiYnlJbmRleCIsInNwbGljZSIsImFwaSIsImRvbUFQSSIsInVwZGF0ZSIsIm5ld09iaiIsInJlbW92ZSIsImxhc3RJZGVudGlmaWVycyIsIm5ld0xpc3QiLCJpbmRleCIsIm5ld0xhc3RJZGVudGlmaWVycyIsIl9pIiwiX2luZGV4IiwibWVtbyIsImluc2VydCIsInN0eWxlIiwidGFyZ2V0Iiwic3R5bGVUYXJnZXQiLCJkb2N1bWVudCIsInF1ZXJ5U2VsZWN0b3IiLCJ3aW5kb3ciLCJIVE1MSUZyYW1lRWxlbWVudCIsImNvbnRlbnREb2N1bWVudCIsImhlYWQiLCJlIiwiZ2V0VGFyZ2V0IiwiRXJyb3IiLCJhcHBlbmRDaGlsZCIsImVsZW1lbnQiLCJjcmVhdGVFbGVtZW50Iiwic2V0QXR0cmlidXRlcyIsImF0dHJpYnV0ZXMiLCJzdHlsZUVsZW1lbnQiLCJub25jZSIsInNldEF0dHJpYnV0ZSIsImluc2VydFN0eWxlRWxlbWVudCIsInN0eWxlVGFnVHJhbnNmb3JtIiwiYXBwbHkiLCJwYXJlbnROb2RlIiwicmVtb3ZlQ2hpbGQiLCJyZW1vdmVTdHlsZUVsZW1lbnQiLCJzdHlsZVNoZWV0IiwiY3NzVGV4dCIsImZpcnN0Q2hpbGQiLCJjcmVhdGVUZXh0Tm9kZSIsImFkZEV2ZW50TGlzdGVuZXIiLCJkcmFnZ2VkSXRlbSIsImRyb3BMaW5lIiwiY2xhc3NMaXN0IiwiYWRkIiwiaGVpZ2h0IiwiZGlzcGxheSIsImNvbnRhaW5zIiwiY2xvc2VzdCIsInNldFRpbWVvdXQiLCJvcGFjaXR5IiwicmVtb3ZlQXR0cmlidXRlIiwicHJldmVudERlZmF1bHQiLCJib3VuZGluZyIsImdldEJvdW5kaW5nQ2xpZW50UmVjdCIsIm9mZnNldCIsInkiLCJjbGllbnRZIiwibmV4dEVsZW1lbnRTaWJsaW5nIiwiaW5zZXJ0QWRqYWNlbnRFbGVtZW50IiwicHJldmlvdXNFbGVtZW50U2libGluZyIsInBhcmVudEVsZW1lbnQiLCJpbnNlcnRCZWZvcmUiLCJ1bmRvU3RhY2siLCJyZWRvU3RhY2siLCJlZGl0b3IiLCJzYXZlU3RhdGUiLCJjdXJyZW50U3RhdGUiLCJpbm5lckhUTUwiLCJldmVudCIsImN0cmxLZXkiLCJrZXkiLCJzdGF0ZVRvUmVzdG9yZSIsInBvcCIsInVuZG8iLCJzdGF0ZVRvQXBwbHkiLCJyZWRvIiwiX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fIiwiX193ZWJwYWNrX3JlcXVpcmVfXyIsIm1vZHVsZUlkIiwiY2FjaGVkTW9kdWxlIiwiX193ZWJwYWNrX21vZHVsZXNfXyIsIm4iLCJnZXR0ZXIiLCJfX2VzTW9kdWxlIiwiZCIsImEiLCJkZWZpbml0aW9uIiwibyIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZW51bWVyYWJsZSIsImdldCIsInByb3AiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJuYyIsIkVsZW1lbnRGYWN0b3J5U2VydmljZSIsImNyZWF0b3JzIiwic3RhdGljIiwiQkxPQ0tfUEFSQUdSQVBIIiwiUEFSQUdSQVBIIiwiQ0hFQ0tCT1hfSVRFTSIsIkxJU1RfSVRFTSIsIkNPREUiLCJRVU9URSIsIkJVTExFVEVEX0xJU1QiLCJOVU1CRVJFRF9MSVNUIiwiQ0hFQ0tfTElTVCIsIkhFQURFUl8xIiwiSEVBREVSXzIiLCJIRUFERVJfMyIsIkhFQURFUl80IiwiSEVBREVSXzUiLCJIRUFERVJfNiIsIkRSQUdfSEFORExFX0JVVFRPTiIsIl9pbnN0YW5jZSIsInJlZ2lzdGVyIiwiRUxFTUVOVF9UWVBFUyIsImJsb2NrUGFyYWdyYXBoQ3JlYXRvciIsInBhcmFncmFwaENyZWF0b3IiLCJjaGVja2JveEl0ZW1DcmVhdG9yIiwibGlzdEl0ZW1DcmVhdG9yIiwiY29kZUNyZWF0b3IiLCJxdW90ZUNyZWF0b3IiLCJjaGVja0xpc3RDcmVhdG9yIiwiYnVsbGV0ZWRMaXN0Q3JlYXRvciIsIm51bWJlcmVkTGlzdENyZWF0b3IiLCJoZWFkaW5nQ3JlYXRvciIsImRyYWdIYW5kbGVCdXR0b25DcmVhdG9yIiwiZ2V0SW5zdGFuY2UiLCJ0eXBlIiwiY3JlYXRvciIsImNyZWF0ZSIsIlR5cGVFcnJvciIsImJsb2NrUGFyYWdyYXBoIiwicGFyYWdyYXBoIiwibGV2ZWwiLCJoZWFkaW5nIiwiY2hlY2tib3hJdGVtIiwibGlzdEl0ZW1fMiIsImRyYWdIYW5kbGVCdXR0b24iLCJwcmUiLCJjb2RlIiwidGV4dENvbnRlbnQiLCJjb250ZW50RWRpdGFibGUiLCJibG9ja3F1b3RlIiwidWwiLCJpbml0aWFsSXRlbSIsImxpc3RJdGVtIiwicCIsImlubmVyVGV4dCIsInRleHQiLCJoIiwibGkiLCJjaGVja2JveCIsInNwYW4iLCJuZXdEaXYiLCJuZXdFbGVtZW50IiwibmV3QnV0dG9uIiwiZHJhZ2dhYmxlIiwiYnV0dG9uIiwiQmxvY2tPcGVyYXRpb25zU2VydmljZSIsImVsZW1lbnRGYWN0b3J5U2VydmljZSIsIlRVUk5fSU5UTyIsIkNSRUFURV9ERUZBVUxUX0JMT0NLIiwiREVMRVRFX0ZPQ1VTX09OX1BSRVZJT1VTIiwiREVMRVRFX0ZPQ1VTX09OX05FWFQiLCJGT0NVU19PTl9GSVJTVCIsIkZPQ1VTX09OX1BSRVZJT1VTIiwiRk9DVVNfT05fTkVYVCIsIkRFTEVURSIsIkRVUExJQ0FURSIsIkNPUFkiLCJQQVNURSIsIkNVVCIsIlJFTU9WRV9GT1JNQVQiLCJUUkFOU0ZPUk1fQkxPQ0siLCJpbnN0YW5jZSIsImV4ZWNDb21tYW5kIiwiY29tbWFuZCIsInNob3dVSSIsInZhbHVlIiwiQkxPQ0tfT1BFUkFUSU9OUyIsImdldFNlbGVjdGlvbiIsIm5hdmlnYXRvciIsImNsaXBib2FyZCIsIndyaXRlVGV4dCIsInNlbGVjdGlvbiIsInNlbGVjdGVkVGV4dCIsInRoZW4iLCJjb3BpZWRFdmVudCIsIkN1c3RvbUV2ZW50IiwiYnViYmxlcyIsImNhbmNlbGFibGUiLCJkaXNwYXRjaEV2ZW50IiwiY2F0Y2giLCJlcnIiLCJjb25zb2xlIiwiZXJyb3IiLCJkZWxldGVGcm9tRG9jdW1lbnQiLCJoaWRlRXZlbnQiLCJyZWFkVGV4dCIsInBhc3RlZFRleHQiLCJyYW5nZUNvdW50IiwicmFuZ2UiLCJnZXRSYW5nZUF0IiwiZGVsZXRlQ29udGVudHMiLCJpbnNlcnROb2RlIiwic2VsZWN0aW9uRXZlbnQiLCJibG9jayIsImdldEN1cnJlbnRTZWxlY3RlZEJsb2NrIiwidHJhbnNmb3JtQmxvY2siLCJkZWxldGVBbmRGb2N1c09uTmV4dCIsImR1cGxpY2F0ZVNlbGVjdGVkQmxvY2siLCJhY3RpdmVFbGVtZW50IiwiY3JlYXRlRGVmYXVsdEJsb2NrIiwiZm9jdXMiLCJkZWxldGVBbmRGb2N1c09uUHJldmlvdXMiLCJmb2N1c09uUHJldmlvdXMiLCJmb2N1c09uTmV4dCIsImdldERyYWdnYWJsZUVsZW1lbnRGcm9tU2VsZWN0aW9uIiwiZm9ybWF0QmxvY2siLCJxdWVyeUNvbW1hbmRTdGF0ZSIsImNvbnRlbnRUeXBlIiwiY29udGVudEVsZW1lbnQiLCJuZXdDb250ZW50QmxvY2siLCJyZXBsYWNlQ2hpbGQiLCJjb21tb25BbmNlc3RvckNvbnRhaW5lciIsIm5vZGVUeXBlIiwiTm9kZSIsIlRFWFRfTk9ERSIsIkhUTUxFbGVtZW50IiwiYmxvY2tFbGVtZW50Iiwic3JjIiwiYWx0IiwiY3JlYXRlTmV3RWxlbWVudCIsImNyZWF0ZUxpc3RJdGVtIiwibmV3Q29udGVudEVsZW1lbnQiLCJldmVudFBhcmFncmFwaCIsIm5ld0Jsb2NrIiwiY3VycmVudEFjdGl2ZUVsZW1lbnQiLCJkZWxldGVUaGVDdXJyZW50RWxlbWVudEFuZFRoZURyYWdnYWJsZUJsb2NrSWZFbXB0eSIsImdldEN1cnJlbnRBY3RpdmVCbG9jayIsImFjdHVhbEVsZW1lbnQiLCJwb3NpdGlvbiIsImZvY3VzZWRFbGVtZW50IiwidGFnTmFtZSIsInRvVXBwZXJDYXNlIiwicHJldmlvdXNFbGVtZW50IiwiYXBwbHlDdXJzb3JYRW5kUG9zaXRpb24iLCJmb2N1c09uVGhlRW5kT2ZUaGVUZXh0IiwicGFyZW50Iiwic2libGluZyIsImZvY3VzYWJsZUNhbmRpZGF0ZXMiLCJxdWVyeVNlbGVjdG9yQWxsIiwibmV4dEVsZW1lbnQiLCJhcHBseUN1cnNvclhTdGFydFBvc2l0aW9uIiwiZm9jdXNPblRoZVN0YXJ0T2ZUaGVUZXh0IiwiY3VycmVudEVsZW1lbnQiLCJwYXJlbnRCbG9jayIsImFjdHVhbCIsInhQb3NpdGlvbiIsImNyZWF0ZVJhbmdlIiwiY3VycmVudE5vZGUiLCJsYXN0Q2hpbGQiLCJhZGp1c3RDdXJzb3JPZmZzZXQiLCJub2RlTmFtZSIsInByZXZpb3VzU2libGluZyIsImNsb3Nlc3ROb2RlIiwic2V0U3RhcnQiLCJjbG9zZXN0T2Zmc2V0IiwiY29sbGFwc2UiLCJyZW1vdmVBbGxSYW5nZXMiLCJhZGRSYW5nZSIsInNlbGVjdE5vZGVDb250ZW50cyIsIm5leHRTaWJsaW5nIiwibm9kZSIsImNsb3Nlc3REaWZmIiwiSW5maW5pdHkiLCJzZXRFbmQiLCJyZWN0IiwibGVmdERpZmYiLCJNYXRoIiwiYWJzIiwibGVmdCIsInJpZ2h0RGlmZiIsInJpZ2h0IiwibWluIiwiY29udGVudEJsb2NrIiwiRUxFTUVOVF9OT0RFIiwiZ2V0Q3VycmVudFNlbGVjdGVkRm9jdXNhYmxlIiwiY29udGFpbmVyIiwiY2xvbmUiLCJjbG9uZU5vZGUiLCJCYXNlVUlDb21wb25lbnQiLCJfY2FuSGlkZSIsInByb3BzIiwiaHRtbEVsZW1lbnQiLCJjb25zdHJ1Y3RvciIsImluaXQiLCJkb2N1bWVudEFwcGVuZFRvIiwiaXNWaXNpYmxlIiwidmlzaWJpbGl0eSIsImdldENvbXB1dGVkU3R5bGUiLCJzaG93IiwiaGlkZSIsIndhcm4iLCJjYW5IaWRlIiwiY2hhbmdlQ29sb3IiLCJjb2xvciIsInJlbW92ZUNvbG9yIiwiY2hhbmdlVmlzaWJpbGl0eVRvVmlzaWJsZSIsImNoYW5nZVZpc2liaWxpdHlUb0hpZGRlbiIsImRvZXNFbGVtZW50T3ZlcmZsb3dTY3JlZW4iLCJvcmlnaW5hbERpc3BsYXkiLCJvcmlnaW5hbFZpc2liaWxpdHkiLCJvcmlnaW5hbFBvc2l0aW9uIiwiZWxlbWVudFJlY3QiLCJzY3JlZW5XaWR0aCIsImlubmVyV2lkdGgiLCJRdWlja01lbnVFbXB0eSIsInN1cGVyIiwiaHRtbEVtcHR5SW5kaWNhdG9yIiwicGFkZGluZyIsIkJhc2VEb3VibHlMaW5rZWRMaXN0IiwidGFpbCIsImdldEZpcnN0IiwiZ2V0TGFzdCIsIlN5bWJvbCIsIml0ZXJhdG9yIiwiY3VycmVudCIsIm5leHROb2RlIiwiZm9yRWFjaCIsImNhbGxiYWNrIiwiYW55IiwicHJlZGljYXRlIiwiZmluZEZpcnN0IiwiZmluZExhc3QiLCJwcmV2aW91c05vZGUiLCJmaW5kIiwiSk5vZGUiLCJwYXJlbnRMaXN0Iiwic2V0TmV4dCIsInNldFByZXZpb3VzIiwiZ2V0TmV4dFNhdGlzZnlpbmciLCJzdGFydE5vZGUiLCJnZXRQcmV2aW91c1NhdGlzZnlpbmciLCJDaXJjdWxhckRvdWJseUxpbmtlZExpc3QiLCJhcHBlbmQiLCJTZXJ2aWNlTm90Rm91bmRFeGNlcHRpb24iLCJzZXJ2aWNlS2V5IiwibmFtZSIsIlNlcnZpY2VQcm92aWRlciIsInNlcnZpY2VzIiwiTWFwIiwiZ2V0SW5zdGFuY2VPZiIsInNlcnZpY2UiLCJyZWdpc3RlclNlcnZpY2UiLCJzZXQiLCJyZWdpc3RlclNlcnZpY2VzIiwicmVzZXQiLCJjbGVhciIsIlF1aWNrTWVudSIsImJsb2NrT3BlcmF0aW9uc1NlcnZpY2UiLCJjdXJyZW50Rm9jdXNlZE1lbnVJdGVtIiwiaHRtbEZvY3VzZWRFbGVtZW50QmVmb3JlT3BlblF1aWNrTWVudSIsIm1lbnVTZWN0aW9ucyIsInF1aWNrTWVudUVtcHR5IiwiZmlsdGVySW5wdXQiLCJibG9ja09wdGlvbnMiLCJhdHRhY2hFdmVudHMiLCJtZW51SXRlbSIsInN3aXRjaFZpc3VhbEZvY3VzIiwicmVtb3ZlRm9jdXMiLCJmb2N1c09uVGhlRmlyc3RWaXNpYmxlSXRlbSIsImZpcnN0U2VjdGlvbk5vZGUiLCJjdXJyZW50U2VjdGlvbk5vZGUiLCJpdGVtTm9kZSIsIm1lbnVJdGVtcyIsImZvY3VzUHJldmlvdXNWaXNpYmxlSXRlbSIsInByZXZpb3VzVmlzaWJsZUl0ZW0iLCJwcmV2aW91c1Zpc2libGVTZWN0aW9uTm9kZSIsInF1aWNrTWVudVNlY3Rpb25JbnN0YW5jZSIsInNlY3Rpb24iLCJsYXN0VmlzaWJsZVNlY3Rpb25Ob2RlIiwiZm9jdXNOZXh0VmlzaWJsZUl0ZW0iLCJuZXh0VmlzaWJsZUl0ZW0iLCJuZXh0VmlzaWJsZVNlY3Rpb25Ob2RlIiwiZmlyc3RWaXNpYmxlU2VjdGlvbk5vZGUiLCJmaWx0ZXJJdGVtcyIsImZpbHRlclNlY3Rpb24iLCJlbGVtZW50V2lkdGgiLCJvZmZzZXRXaWR0aCIsImxlZnRQb3NpdGlvbiIsInNjcm9sbFgiLCJlbGVtZW50SGVpZ2h0Iiwib2Zmc2V0SGVpZ2h0IiwidG9wUG9zaXRpb24iLCJ0b3AiLCJzY3JvbGxZIiwiYm90dG9tIiwicmVzdG9yZSIsInNoaWZ0S2V5IiwiYWx0S2V5IiwidGVzdCIsInJlbW92ZUxhc3RGaWx0ZXJJbnB1dENoYXJhY3RlciIsInN0b3BQcm9wYWdhdGlvbiIsImRhdGFUeXBlIiwiZ2V0QXR0cmlidXRlIiwidHJhbnNmb3JtSHRtbEZvY3VzZWRFbGVtZW50QmVmb3JlT3BlblF1aWNrTWVudSIsImNvbmNhdEZpbHRlcklucHV0IiwiYmxvY2tUeXBlIiwic3RnIiwidG9Mb3dlckNhc2UiLCJzbGljZSIsIkRvdWJseUxpbmtlZExpc3QiLCJRdWlja01lbnVTZWN0aW9uIiwicXVpY2tNZW51SW5zdGFuY2UiLCJ0aXRsZSIsImFwcGVuZFF1aWNrTWVudUl0ZW1zIiwiYXBwZW5kUXVpY2tNZW51SXRlbSIsImZpbHRlclZhbHVlIiwidG9Mb2NhbGVMb3dlckNhc2UiLCJpbmNsdWRlcyIsIlNWR0ljb24iLCJ1c2VFbGVtZW50IiwiaHJlZlVzZUlkIiwid2lkdGgiLCJjcmVhdGVFbGVtZW50TlMiLCJ1c2UiLCJzZXRBdHRyaWJ1dGVOUyIsInNldFVzZVRvIiwiUXVpY2tNZW51SXRlbSIsImRlc2NyaXB0aW9uIiwiU1ZHSHJlZlVzZUlkIiwib3B0aW9uSW1hZ2UiLCJzdmciLCJvcHRpb25UZXh0IiwiYmxvY2tUaXRsZSIsImJsb2NrRGVzY3JpcHRpb24iLCJRdWlja01lbnVCdWlsZGVyIiwiYnVpbGQiLCJxdWlja01lbnUiLCJiYXNpY0Jsb2Nrc1NlY3Rpb24iLCJoZWFkaW5nQmxvY2tzU2VjdGlvbiIsImxpc3RCbG9ja3NTZWN0aW9uIiwiRHJvcGRvd25NZW51IiwiZHJvcGRvd25CdXR0b24iLCJkcm9wZG93bkxpc3QiLCJUZXh0T3BlcmF0aW9uU2VydmljZSIsInNob3dVaSIsIlFVRVJZX1RFWFRfT1BFUkFUSU9OUyIsIklOTElORV9DT0RFIiwidG9nZ2xlQ29kZUV4ZWNDb21tYW5kIiwidiIsImdldEluaXRpYWxDb2xvckFzSGV4IiwiQ1JFQVRFX0xJTksiLCJnZXRTZWxlY3RlZEhUTUxFbGVtZW50Iiwic2hvd0lucHV0TGlua0JveCIsIkhJTElURV9DT0xPUiIsIkZPUkVfQ09MT1IiLCJVTkRFUkxJTkUiLCJxdWVyeUhpbGl0ZUNvbG9yIiwicXVlcnlGb3JlQ29sb3IiLCJjb250YWluZXJOb2RlIiwiY29kZUVsZW1lbnQiLCJyYW5nZU9mQ29kZSIsImNvbnRlbnRBc1N0cmluZyIsIlhNTFNlcmlhbGl6ZXIiLCJzZXJpYWxpemVUb1N0cmluZyIsImNsb25lQ29udGVudHMiLCJleHBlY3RlZENvbG9yIiwiZm9udENvbG9yIiwicmdiQ29sb3IiLCJyZ2JUb0hleCIsInNwYW5XaXRoQmFja2dyb3VuZCIsImJhY2tncm91bmRDb2xvciIsInJnYiIsIm1hdGNoIiwiTnVtYmVyIiwieCIsImhleCIsInRlbXBFbGVtZW50IiwiYm9keSIsImNvbXB1dGVkQ29sb3IiLCJnZXRUYXJnZXRFbGVtZW50TWFwIiwiZ2V0U2VsZWN0ZWRUZXh0Tm9kZXMiLCJ0ZXh0Tm9kZXMiLCJub2RlSXRlcmF0b3IiLCJjcmVhdGVOb2RlSXRlcmF0b3IiLCJOb2RlRmlsdGVyIiwiU0hPV19URVhUIiwiYWNjZXB0Tm9kZSIsImludGVyc2VjdHNOb2RlIiwiRklMVEVSX0FDQ0VQVCIsIkZJTFRFUl9SRUpFQ1QiLCJub2RlUmFuZ2UiLCJjb21wYXJlQm91bmRhcnlQb2ludHMiLCJSYW5nZSIsIkVORF9UT19TVEFSVCIsIlNUQVJUX1RPX0VORCIsImZpbmRDbG9zZXN0TWF0Y2hpbmdQYXJlbnQiLCJlbGVtIiwiY2xhc3NlcyIsImV2ZXJ5IiwiY2xzIiwiZXh0cmFjdFNlbGVjdGVkVGV4dCIsInRleHROb2RlIiwic3RhcnQiLCJlbmQiLCJzdGFydENvbnRhaW5lciIsInN0YXJ0T2Zmc2V0IiwiZW5kQ29udGFpbmVyIiwiZW5kT2Zmc2V0Iiwic3Vic3RyaW5nIiwiSW5wdXRMaW5rQm94IiwicGFyZW50V3JhcHBlciIsImF0dGFjaEV2ZW50IiwicGxhY2Vob2xkZXIiLCJzZXRQYXJlbnRXcmFwcGVyIiwidXJsIiwiSW5wdXRMaW5rQm94V3JhcHBlciIsImlucHV0TGlua0JveCIsImhpZ2hsaWdodHMiLCJoaWdobGlnaHRTZWxlY3RlZFRleHQiLCJyZW1vdmVIaWdobGlnaHRzIiwic2hvd0lucHV0TGlua0JveEZpbmlzaGVkIiwicmVjdHMiLCJnZXRDbGllbnRSZWN0cyIsImhpZ2hsaWdodCIsIlV0aWxzIiwiaXNTZWxlY3RlZFRleHREZXNjZW5kYW50T2YiLCJwYXJlbnRTZWxlY3RvciIsIkZsb2F0aW5nVG9vbGJhciIsImRyb3Bkb3ducyIsImN1cnJlbnRTZWxlY3Rpb25SYW5nZSIsImlucHV0TGlua0JveFdyYXBwZXIiLCJzZWxlY3RXcmFwcGVyIiwiZ2V0RWxlbWVudEJ5SWQiLCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJhcHBlbmREcm9wZG93biIsImRyb3Bkb3duIiwiYXBwZW5kU2VwYXJhdG9yIiwic2VwYXJhdG9yIiwiYXBwZW5kVGV4dFRvb2xiYXIiLCJhbnlEcm9wZG93blZpc2libGUiLCJoaWRlQWxsRHJvcGRvd25WaXNpYmxlIiwicmVzdG9yZVJhbmdlU2VsZWN0aW9uIiwiaXNTZWxlY3Rpb25FbXB0eSIsInRyaW0iLCJEcm9wZG93bk1lbnVMaXN0SXRlbSIsInRleHRPcGVyYXRpb25TZXJ2aWNlIiwiYWN0aXZlSWNvbiIsInBhcmVudERyb3Bkb3duTWVudUxpc3QiLCJ0ZXh0T3BlcmF0aW9uc1NlcnZpY2UiLCJsZWZ0SWNvbiIsInNob3J0Y3V0IiwiaWNvbiIsInRhYkluZGV4IiwidGV4dE9wdGlvbiIsInNob3J0Q3V0IiwicGVyZm9ybUFjdGlvbiIsImZvY3VzYWJsZVBhcmVudCIsIm5vcm1hbGl6ZUFuZE1lcmdlRWxlbWVudHMiLCJkcm9wZG93bkl0ZW1zIiwiY2hhbmdlQ2hlY2tJY29uVmlzaWJpbGl0eSIsImNoaWxkIiwic2hvdWxkTWVyZ2UiLCJuZXh0Iiwibm9ybWFsaXplIiwibm9kZTEiLCJub2RlMiIsImVsZW0xIiwiZWxlbTIiLCJEcm9wZG93bk1lbnVMaXN0IiwicGFyZW50RHJvcGRvd25QYXJlbnRCdXR0b24iLCJtYXhIZWlnaHQiLCJvdmVyZmxvd1kiLCJkcm9wZG93bkl0ZW0iLCJzZXRQYXJlbnREcm9wZG93bk1lbnVCdXR0b24iLCJkcm9wZG93blBhcmVudEJ1dHRvbiIsImNsaWNrZWRPdXRzaWRlVGhlRHJvcGRvd25XaGlsZURyb3Bkb3duSXNWaXNpYmxlIiwia2V5UHJlc3NlZE91dHNpZGVUaGVEcm9wZG93bldoaWxlRHJvcGRvd25Jc1Zpc2libGUiLCJzdmdJY29uIiwiRmxvYXRpbmdUb29sYmFyU2VwYXJhdG9yIiwiYm9yZGVyUmlnaHQiLCJtYXJnaW4iLCJHcm91cEJ1dHRvbiIsIm1hcmdpbkxlZnQiLCJtYXJnaW5SaWdodCIsIkdyb3VwZWRCdXR0b24iLCJjb21tYW5kU2VydmljZSIsInN2Z0ljb25JZCIsInJvbGUiLCJlZGl0YWJsZUVsZW1lbnQiLCJnZXRQYXJlbnRFZGl0YWJsZSIsImNoYW5nZUljb25Db2xvciIsImlzQ29sbGFwc2VkIiwiY29tbW9uQW5jZXN0b3IiLCJDb2xvckljb24iLCJib3JkZXJSYWRpdXMiLCJib3JkZXIiLCJib3hTaXppbmciLCJEcm9wZG93bk1lbnVCdXR0b24iLCJpbmNsdWRlQ2hldnJvbkljb24iLCJEcm9wZG93bk1lbnVMaXN0SXRlbVRpdGxlIiwiRmxvYXRpbmdUb29sYmFyQnVpbGRlciIsImZsb2F0aW5nQmFyIiwidHVybkludG9Ecm9wZG93biIsImdyb3VwQnV0dG9uIiwiY29sb3JEcm9wZG93biIsIm1vcmVPcHRpb25zRHJvcGRvd24iLCJ0dXJuSW50b0Jhckxpc3QiLCJ0dXJuSW50b0JhckJ1dHRvbiIsIlNWR0ljb25zIiwidG9kb19saXN0IiwiYl9saXN0Iiwibl9saXN0IiwicXVvdGUiLCJoZWFkMSIsImhlYWQyIiwiaGVhZDMiLCJoZWFkNCIsImhlYWQ1IiwiaGVhZDYiLCJjb2xvckRyb3Bkb3duTGlzdCIsImNvbG9yQnV0dG9uIiwibW9yZU9wdGlvbnNMaXN0IiwibW9yZU9wdGlvbnNCdXR0b24iLCJjb3B5IiwiY3V0IiwicGFzdGUiLCJkdXBsaWNhdGUiLCJlcmFzZXIiLCJkZWxldGUiLCJBZGRCbG9ja0J1dHRvbiIsIkFkZEJsb2NrIiwiYmxvY2tPcGVyYXRpb25TZXJ2aWNlIiwiQ29udGVudCIsImVkaXRvckNvbmZpZyIsImNvcHlFbGVtZW50SXRlbSIsImxvZyIsImdldE1vZGlmaWVyU3RhdGUiLCJpc051bVBhZCIsInN0YXJ0c1dpdGgiLCJudW1Mb2NrT24iLCJtZXRhS2V5IiwiYXN5bmMiLCJpc0N1cnNvckF0RW5kIiwiaXNDdXJzb3JBdFN0YXJ0IiwiaXNDdXJzb3JPbkxhc3RMaW5lIiwiaXNDdXJzb3JPbkZpcnN0TGluZSIsImVuZE5vZGUiLCJjb2xsYXBzZWQiLCJpc0F0Rmlyc3RWaXNpYmxlTGluZSIsImNsb25lUmFuZ2UiLCJpc0F0TGFzdFZpc2libGVMaW5lIiwiY2hpbGROb2RlcyIsImRpZEN1cnNvck1vdmUiLCJQcm9taXNlIiwicmVzb2x2ZSIsIm9yaWdpbmFsUmVjdCIsIm5ld1JlY3QiLCJkaWRNb3ZlIiwiVGl0bGUiLCJoMSIsIkVkaXRvciIsImVkaXRvcklkIiwiRWxlbWVudCIsImFwcGVuZERyYWdIYW5kbGVyIiwicmVhZHlTdGF0ZSIsImZpcnN0UGFyYWdyYXBoIiwiY2xpcGJvYXJkRGF0YSIsImdldERhdGEiLCJpbnNlcnRUZXh0QXRDdXJzb3IiLCJzZWwiLCJzZXRTdGFydEFmdGVyIiwic2V0RW5kQWZ0ZXIiLCJkcmFnSGFuZGxlciIsInByZXBlbmQiLCJyZW1vdmVEcmFnSGFuZGxlciIsImV4dHJhY3RDb250ZW50IiwiVUlCdWlsZGVyIiwiYWRkQmxvY2siLCJmbG9hdGluZ1Rvb2xiYXIiLCJhZGRCb2NrIiwic2VydmljZVByb3ZpZGVyIiwiYmxvY2tzIiwic3ZnQ29udGFpbmVyIiwiY2xhc3NOYW1lIiwibG9jYWxzIl0sInNvdXJjZVJvb3QiOiIifQ== \ No newline at end of file +(()=>{"use strict";var e={282:(e,t,n)=>{n.d(t,{A:()=>l});var o=n(354),i=n.n(o),r=n(314),s=n.n(r)()(i());s.push([e.id,'/** cursor style */\n[contenteditable="true"] {\n cursor: text !important;\n}\n\n\n\n/** CSS reset */\n\n.button-reset {\n border: none;\n margin: 0;\n padding: 0;\n width: auto;\n overflow: visible;\n background: transparent;\n color: inherit;\n font: inherit;\n line-height: normal;\n -webkit-font-smoothing: inherit;\n -moz-osx-font-smoothing: inherit;\n -webkit-appearance: none;\n}\n\n\n\n/** add block */\n.add-block {\n margin: 0;\n padding: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n border: 1px solid #000;\n background-color: white;\n transition: all 0.3s ease;\n box-sizing: border-box;\n margin-left: 1.3rem;\n}\n\n.add-block-wrapper {\n width: 100%;\n height: 3.125rem;\n}\n\n.add-block-wrapper:hover .add-block {\n display: flex;\n}\n\n/** and add block */\n\n\n\n/** List **/\nol.johannes-content-element,\nul.johannes-content-element {\n padding-left: 1rem !important;\n}\n\n\n\n.johannes-content-element li>button {\n /* display: none; */\n display: none;\n position: absolute;\n margin-left: 10px;\n top: 0;\n\n flex-direction: row;\n align-items: start;\n justify-content: start;\n\n}\n\n.johannes-content-element li {\n position: relative;\n}\n\n.johannes-content-element li::before {\n margin-left: 0.3125rem;\n}\n\n.johannes-content-element li:hover>button {\n /* display: inline-block; */\n display: inline-flex;\n\n}\n\np.johannes-content-element {\n display: inline-block;\n line-height: 1;\n margin: 0;\n padding: 0;\n}\n\n.johannes-content-element .checkbox-list {\n list-style-type: none;\n padding-left: 0 !important;\n}\n\n\n.johannes-content-element .checkbox-list li {\n display: flex;\n flex-direction: row;\n justify-content: left;\n}\n\n\n.johannes-content-element ul.checkbox-list input[type="checkbox"]:checked+span {\n text-decoration: line-through;\n}\n\n/* ul.johannes-content-element:not(.checkbox-list),\nol.johannes-content-element:not(.checkbox-list) {\n padding-left: 1.5rem !important;\n} */\n\n/** Add line through text decoration to checked checkboxes text div */\n.block input[type="checkbox"]:checked+div {\n text-decoration: line-through;\n}\n\n/** Remove the default list style and replace by another that works with display flex */\n.block ol,\n.block ul {\n list-style: none;\n}\n\n.block ul .list-item,\n.block ol .list-item {\n display: flex;\n flex-direction: row;\n align-items: center;\n}\n\n.block ol li {\n counter-increment: item;\n}\n\n.block ol li::before {\n content: counter(item) ". ";\n margin-right: 0.3125rem;\n}\n\n.block ul li:not(.list-item-checkable)::before {\n content: "• ";\n margin-right: 0.3125rem;\n}\n\n\n\n/** and list **/\n\n\n\n.block>.drag-handler {\n color: #84888d;\n visibility: hidden;\n cursor: grab;\n align-self: start;\n\n /* background-color: pink; */\n padding-top: 0.33rem;\n position: absolute;\n}\n\n.drag-handler svg {\n /* background-color: red; */\n}\n\n.drag-handler svg use {\n /* background-color: blue; */\n}\n\n.drag-handler:active {\n cursor: grabbing;\n}\n\n.block {\n display: flex;\n flex-direction: row;\n margin-bottom: 1rem;\n position: relative;\n max-width: 100%;\n}\n\n.block>*:not(.drag-handler) {\n padding-left: 1.25rem !important;\n}\n\n.block:hover .drag-handler {\n visibility: visible;\n vertical-align: top;\n justify-content: start;\n}\n\n.drop-line {\n height: 1rem;\n background-color: #84888d;\n width: 100%;\n}\n\n\n.title h1 {\n margin-left: 1.3rem;\n}\n\n\n[contenteditable="true"]:empty:focus {\n content: attr(data-placeholder);\n color: #84888d;\n pointer-events: none;\n}\n\nh1[data-placeholder]:empty:before {\n content: attr(data-placeholder);\n color: #84888d !important;\n display: block;\n}\n\nh1[data-placeholder]:focus:before {}\n\n\n*[contenteditable="true"]:not(h1):empty:before {\n content: attr(data-placeholder);\n color: #84888acd;\n display: none;\n}\n\n*[contenteditable="true"]:not(h1):empty:hover:before {\n display: block;\n}\n\ncite[contenteditable="true"]:empty:before {\n display: block;\n}\n\n*[contenteditable="true"]:not(h1)[data-placeholder]:empty:focus:before {\n content: attr(data-placeholder);\n color: #84888acd !important;\n display: block;\n}\n\n\n\nh1 {\n font-size: 2.5rem;\n font-weight: bolder !important;\n}\n\n.johannes-editor {\n width: 100%;\n\n}\n\n.content {\n width: 100%;\n box-sizing: border-box;\n /* background-color: red; */\n}\n\n.content .block .table-wrapper {\n overflow-x: auto;\n overflow-y: hidden;\n}\n\n\npre {\n width: 100%;\n}\n\n[contenteditable] {\n outline: none;\n}\n\nbody {\n height: 2000px;\n background-color: #f0f0f1 !important;\n\n font-family: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";\n}\n\n\n.editor {\n display: flex;\n margin-top: 80px;\n}\n\np {\n color: #242424;\n}\n\n\n.block,\n.block * {\n user-select: text;\n}\n\n\n.johannes-content-element {\n width: 100%;\n padding: 0;\n margin: 0;\n /* background-color: green; */\n}\n\n\n#johannesEditor {\n width: 60%;\n margin-left: auto;\n margin-right: auto;\n}\n\n.johannes-editor hr {\n width: 100%;\n height: 2px;\n visibility: visible;\n border: none;\n border-bottom: 1px solid rgba(55, 53, 47, 0.16);\n}\n\n\n\n.johannes-editor blockquote {\n margin: 0.5rem 0;\n padding-left: 20px;\n border-left: 4px solid rgb(55, 53, 47);\n font-style: italic\n}\n\n.johannes-editor cite {\n padding-top: 1rem !important;\n display: inline-block;\n}\n\n\n.johannes-editor cite::before {\n content: \'— \';\n}\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n#linkBox {\n border-radius: 2px;\n padding: 20px;\n background-color: #f9f9f9;\n\n\n box-shadow:\n 0 4px 6px rgba(0, 0, 0, 0.1),\n 0 -2px 4px rgba(0, 0, 0, 0.02),\n -2px 0 4px rgba(0, 0, 0, 0.02),\n 2px 0 4px rgba(0, 0, 0, 0.02);\n\n\n border: 1px solid #d0d0d0;\n width: fit-content;\n z-index: 999999;\n color: rgb(120, 119, 116);\n border-radius: none;\n}\n\n\n#linkBox input {\n width: 316px;\n padding: 8px 40px 8px 16px;\n /* border-color: #d0d0d0; */\n\n border: 1px solid #949494;\n /* border-radius: 4px; */\n height: 24px;\n\n display: flex;\n flex-direction: row;\n justify-content: center;\n align-items: center;\n}\n\n\n#linkBox input::selection,\n#linkBox input:focus {\n border-radius: none;\n}\n\n/** soft-box-shadow class */\n.soft-box-shadow {\n margin: 0;\n padding: 0;\n border-radius: 2px;\n box-shadow:\n 0 4px 6px rgba(0, 0, 0, 0.1),\n 0 -2px 4px rgba(216, 196, 196, 0.02),\n -2px 0 4px rgba(0, 0, 0, 0.02),\n 2px 0 4px rgba(0, 0, 0, 0.02);\n\n border: 1px solid #d0d0d0;\n}\n\n/** and soft-box-shadow */\n\n\n/** selection-wrapper class */\n.select-wrapper {\n display: flex;\n flex-direction: row;\n align-items: center;\n}\n\n.select-wrapper ul {\n position: absolute;\n background: #f9f9f9;\n flex-direction: column;\n width: fit-content;\n padding-bottom: 0.5rem;\n padding-left: 5px;\n padding-right: 5px;\n top: 2.2rem;\n color: rgb(55, 53, 47);\n padding-right: 0.3125rem;\n}\n\n.select-wrapper ul li {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 0.625rem;\n padding: 0.1875rem 0.3125rem;\n border-radius: 0.1875rem;\n user-select: none !important;\n font-size: small !important;\n font-weight: 500;\n}\n\n.select-wrapper ul li span {\n display: inline-block;\n width: max-content;\n}\n\n.select-wrapper ul li .option-image {\n width: 1.375rem;\n height: 1.375rem;\n color: #242424;\n padding: 0 !important;\n margin: 0 !important;\n}\n\n.select-wrapper ul li .option-image svg {\n color: #4f4f4f;\n padding: 0 !important;\n margin: 0 !important;\n}\n\n.select-wrapper {\n position: relative;\n color: rgb(120, 119, 116);\n}\n\n.select-wrapper>button {\n color: rgba(55, 53, 47, 0.85);\n}\n\n.select-wrapper ul li>h3 {\n margin: 0;\n font-size: small !important;\n color: #37352fa6;\n margin: 0;\n padding: 0;\n font-weight: 600 !important;\n margin-top: 0.3125rem;\n margin-bottom: 0.3125rem;\n}\n\n/** end selection wrapper **/\n\n\n\n/** Text formatting Bar **/\n\n\n\n.floating-toolbar {\n justify-content: space-between;\n padding: 8px 16px;\n background-color: #f9f9f9;\n width: fit-content;\n z-index: 999999;\n position: absolute;\n user-select: none;\n}\n\n/* TODO: remove this*/\nspan {\n font-family: Arial, sans-serif;\n}\n\n\n.floating-toolbar .item {\n color: rgb(120, 119, 116);\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.floating-toolbar .item>button {\n\n display: inline-flex;\n align-items: center;\n}\n\n\n.floating-toolbar select {\n color: rgb(120, 119, 116);\n border: none;\n font-size: 0.85rem;\n background-color: inherit;\n}\n\n.text-formatting-select-button {\n display: flex;\n flex-direction: row;\n align-items: center;\n}\n\n#turnIntoButton span {\n display: inline-flex;\n flex-direction: row;\n justify-content: center;\n align-items: center;\n font-size: 0.9rem;\n\n}\n\n#turnIntoButton svg use {\n margin: auto;\n}\n\ncode:not(pre code) {\n margin: 0;\n padding: 0;\n background-color: #d0d0d0;\n background-color: #f6f5f4;\n font-size: inherit;\n font-size: 1rem !important;\n border: 1px solid #0000001a;\n padding: 0 3px;\n display: inline-block;\n border-radius: 4px;\n box-sizing: border-box;\n}\n\n\n\n\n/* a:not([href]) {\n background-color: #d3e3fd;\n} */\n\n.text-formatting-button-active {\n color: #2382e2;\n}\n\n.text-formatting-circle-active {\n border-color: #2382e2 !important;\n}\n\n\n\n#moreTextOptionSelect {\n position: absolute;\n}\n\n.moreTextOptionWrapper {\n position: relative;\n}\n\n\n.bgc-red {\n background-color: #FDDEDE;\n}\n\n.bgc-green {\n background-color: #D7F7DC;\n}\n\n.bgc-blue {\n background-color: #D9EDF6;\n}\n\n.bgc-yellow {\n background-color: #FAF4D1;\n}\n\n.bgc-grey {\n background-color: #E1E0E0;\n}\n\np,\nmark {\n line-height: 1;\n}\n\n#turnIntoSelect .option-image {\n /* display: none !important; */\n}\n\n.border-less-image {\n width: 24px;\n height: 24px;\n}\n\n\n\n\n/** Block Options **/\n\n.block-options-wrapper {\n z-index: 999999;\n position: absolute;\n display: none;\n}\n\n.block-options {\n width: fit-content;\n max-height: 19rem;\n overflow-y: auto;\n}\n\n.block-options {\n padding: 0 0.625rem;\n background: #f9f9f9;\n}\n\n.block-options section h2 {\n font-size: small !important;\n color: #37352fa6;\n margin: 0;\n padding: 0;\n font-weight: 600 !important;\n margin-top: 0.3125rem;\n margin-bottom: 0.3125rem;\n padding-left: 0.3125rem;\n}\n\n.block-options .option {\n padding: 0.3125rem 0.625rem;\n margin: 0.3125rem 0;\n cursor: pointer;\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: left;\n gap: 0.6rem;\n border-radius: 3px;\n}\n\n.block-options .option:focus {\n outline: none;\n background-color: #e9e9e9;\n border: inherit;\n}\n\n.option-focused {\n outline: none;\n background-color: #e9e9e9;\n border: none;\n}\n\n.danger-option.option-focused,\n.danger-option.option-focused svg {\n color: #EB5757 !important;\n}\n\n\n\n.block-options .option:focus-visible {\n outline: none;\n background-color: #e9e9e9;\n border: inherit;\n}\n\n/* .option-hover:hover {\n background-color: #e9e9e9;\n box-shadow: 0px 0px 0px 2px #e9e9e9;\n border-radius: 1px;\n transition: 0.1s ease;\n} */\n\n/* .select-wrapper>button, */\n\n/* #turnIntoButton,\n#colorTextButton {\n padding-left: 4px;\n} */\n\n#colorTextButton {\n margin-left: 0.625rem;\n}\n\n#turnIntoButton:not([disabled]):hover,\n#colorTextButton:not([disabled]):hover,\n#moreTextOptionButton:not([disabled]):hover,\n.floating-toolbar .item>button:not([disabled]):hover {\n background-color: #e9e9e9;\n box-shadow: 0px 0px 0px 2px #e9e9e9;\n border-radius: 1px;\n transition: 0.1s ease;\n}\n\n\n\n.option[focused="true"] {\n background-color: #bde4ff;\n}\n\n\n\n\n\n.option-image {\n width: 2.875rem;\n height: 2.875rem;\n border-radius: 0.1875rem;\n border: 1px solid #ccc;\n color: #4f4f4f;\n\n display: flex;\n flex-direction: row;\n justify-content: center;\n vertical-align: middle;\n align-items: center;\n background-color: #ffff;\n box-sizing: border-box;\n}\n\n.option-image img {\n max-width: 2.875rem;\n max-height: 2.875rem;\n}\n\n.option-image svg {\n margin: 0;\n padding: 0;\n padding: 0.625rem;\n box-sizing: border-box;\n\n}\n\n.option-text * {\n margin: 0;\n padding: 0;\n\n}\n\n.option-text .block-title {\n font-size: small !important;\n font-weight: 500;\n}\n\n.option-text .block-description {\n font-size: small !important;\n color: rgba(55, 53, 47, 0.5);\n}\n\n/** End Block Options **/\n\n\n\n#deleteBlockButton:hover svg,\n#deleteBlockButton:hover {\n color: rgb(235, 87, 87) !important;\n}\n\n\n\n.johannes-editor *::selection {\n /* background-color: rgba(211, 227, 253, 0.5) !important; */\n\n background-color: red;\n\n background-color: hsl(210 75% 50% / 1);\n color: white;\n}\n\n.johannes-editor mark,\n.johannes-editor * {\n line-height: 1.5 !important;\n}\n\n.option {\n justify-content: space-between;\n}\n\n.text-option {\n display: flex;\n flex-direction: row;\n justify-content: start;\n align-items: center;\n gap: 0.625rem;\n}\n\n\n\n\n:root {\n /* font-size: 16px; */\n /* Tamanho padrão */\n}\n\n/* Para telas com densidade média */\n@media only screen and (-webkit-min-device-pixel-ratio: 2),\nonly screen and (min--moz-device-pixel-ratio: 2),\nonly screen and (min-resolution: 192dpi),\nonly screen and (min-resolution: 2dppx) {\n :root {\n font-size: 18px;\n /* Aumenta o tamanho da fonte para telas de alta densidade */\n }\n}\n\n/* Para telas com altíssima densidade */\n@media only screen and (-webkit-min-device-pixel-ratio: 3),\nonly screen and (min--moz-device-pixel-ratio: 3),\nonly screen and (min-resolution: 288dpi),\nonly screen and (min-resolution: 3dppx) {\n :root {\n font-size: 20px;\n /* Ainda maior para telas de densidade muito alta */\n }\n}\n\n\n\n\n\n\n\n\n\n\n\ntable.johannes-content-element {\n border-collapse: collapse;\n max-width: inherit;\n width: auto;\n display: flex;\n box-sizing: border-box !important;\n}\n\ntable.johannes-content-element th,\ntable.johannes-content-element td {\n min-height: 20px;\n}\n\ntable.johannes-content-element th,\ntable.johannes-content-element td {\n border: 1px solid #84888d;\n padding: 8px;\n text-align: left;\n align-items: start;\n overflow-wrap: break-word;\n word-wrap: break-word;\n white-space: normal;\n vertical-align: top;\n min-width: 100px;\n max-width: 200px;\n /* box-sizing: border-box !important; */\n\n transition: border 100ms ease-out, box-shadow 100ms ease-out;\n\n}\n\ntable.johannes-content-element td.selected,\ntable.johannes-content-element td:focus {\n outline: none;\n box-shadow: 0 0 0 1px #74b6db inset;\n border: 1px double #74b6db;\n\n}\n\ntd {\n min-height: 1rem !important;\n line-height: 1rem;\n}\n\ntd::placeholder {\n display: block;\n}\n\ntd:empty:before {\n content: attr(data-placeholder);\n color: #84888acd;\n display: block !important;\n opacity: 0;\n}\n\n.table-wrapper {\n width: 100%;\n}\n\n.table-controller {\n position: relative;\n max-width: 100%;\n}\n\n.add-table-row {\n background-color: rgba(55, 53, 47, 0.06);\n width: 100%;\n padding: 0;\n margin: 0;\n margin-top: 0.375rem;\n display: flex;\n justify-content: center;\n align-items: center;\n text-align: center;\n height: 1rem;\n cursor: pointer;\n opacity: 0;\n user-select: none;\n}\n\n.add-table-column {\n position: absolute;\n right: -1.3125rem;\n background-color: rgba(55, 53, 47, 0.06);\n width: 1rem;\n padding: 0;\n margin: 0;\n display: flex;\n justify-content: center;\n align-items: center;\n text-align: center;\n height: 100%;\n top: 0;\n cursor: pointer;\n height: calc(100% - 1rem - 5px);\n opacity: 0;\n user-select: none;\n}\n\n.add-table-column:hover {\n opacity: 1;\n}\n\n.add-table-row:hover {\n opacity: 1;\n}\n\n.table-shell {\n max-width: 100%;\n}\n\n\n\n.table-option {\n background-color: white;\n width: fit-content;\n justify-content: space-between;\n padding: 8px 16px;\n background-color: #f9f9f9;\n width: fit-content;\n z-index: 999999;\n position: absolute;\n user-select: none;\n padding: 8px 16px;\n display: none;\n}\n\n\n\n\n/** Callout **/\n.callout:hover .options-button {\n display: block !important;\n}\n\n\n.no-selection {\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n}\n\n\n/** upload/embed **/\n\n.tab-container {\n font-size: 0.86rem;\n display: flex;\n flex-direction: column;\n transition: 0.1s ease;\n\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n\n transition: visibility 0.2s ease;\n\n}\n\n.nav-underline {\n margin: 0;\n padding: 0;\n border-bottom: 1px solid rgba(55, 53, 47, 0.16);\n padding: 10px 20px;\n}\n\n.nav-underline .nav-item {\n display: flex;\n margin-right: 15px;\n}\n\n.nav-underline .nav-link {\n cursor: pointer;\n text-decoration: none;\n color: rgb(55, 53, 47);\n color: rgba(55, 53, 47, 0.5);\n transition: 0.1s ease;\n}\n\n\n.nav-item.active .nav-link {\n color: #000;\n}\n\n.tab-content .content-data {\n display: none;\n padding: 20px;\n border-top: none;\n transition: 0.1s ease;\n}\n\n.tab-content .content-data.active {\n display: flex;\n flex-direction: column;\n text-align: center;\n gap: 1rem;\n}\n\n.tab-content .text-info {\n font-size: 0.75rem;\n color: rgba(55, 53, 47, 0.6);\n}\n\n.nav-underline .nav-item {\n display: inline;\n}\n\n\n.tab-container {\n width: fit-content;\n background-color: rgb(249, 249, 249);\n position: absolute;\n\n}\n\n.embed-content input {\n width: 20rem;\n border: 1px solid rgba(55, 53, 47, 0.16);\n height: 1.5rem;\n border-radius: 4px;\n padding-left: 10px;\n}\n\n\n.upload-content label {\n display: block;\n border: 1px solid rgba(55, 53, 47, 0.16);\n border-radius: 4px;\n width: 20rem;\n text-align: center;\n padding: 4px;\n color: rgb(55, 53, 47);\n background-color: #fff;\n /* transition: 0.1s ease; */\n}\n\n.upload-content label:hover {\n background-color: #eeeeee;\n}\n\n\n\n\n\n\n\n\n\n\n/* Estilo para as alças de redimensionamento */\n.resize-handle {\n position: absolute;\n width: 10px;\n height: 10px;\n background: rgba(0, 0, 0, 0.5);\n cursor: nwse-resize;\n /* Cursor de redimensionamento diagonal */\n}\n\n.resize-handle.se {\n bottom: 0;\n right: 0;\n}\n\n\n\n\n.embed-container {\n position: relative;\n width: 100%;\n padding-bottom: 56.25%;\n /* Proporção 16:9 */\n height: 0;\n overflow: hidden;\n}\n\n.embed-container iframe {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n}\n\n\n\n.video-container {\n position: relative;\n width: 100%;\n padding-bottom: 56.25%;\n /* Proporção 16:9 */\n height: 0;\n overflow: hidden;\n}\n\n.video-container iframe {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n}\n\n\n\n\n\n\n\n.resizable {\n resize: horizontal;\n overflow: auto;\n cursor: nesw-resize;\n}\n\n.background {\n background-color: #e7e6e3;\n}',"",{version:3,sources:["webpack://./src/assets/css/main.css"],names:[],mappings:"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",sourcesContent:['/** cursor style */\n[contenteditable="true"] {\n cursor: text !important;\n}\n\n\n\n/** CSS reset */\n\n.button-reset {\n border: none;\n margin: 0;\n padding: 0;\n width: auto;\n overflow: visible;\n background: transparent;\n color: inherit;\n font: inherit;\n line-height: normal;\n -webkit-font-smoothing: inherit;\n -moz-osx-font-smoothing: inherit;\n -webkit-appearance: none;\n}\n\n\n\n/** add block */\n.add-block {\n margin: 0;\n padding: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n border: 1px solid #000;\n background-color: white;\n transition: all 0.3s ease;\n box-sizing: border-box;\n margin-left: 1.3rem;\n}\n\n.add-block-wrapper {\n width: 100%;\n height: 3.125rem;\n}\n\n.add-block-wrapper:hover .add-block {\n display: flex;\n}\n\n/** and add block */\n\n\n\n/** List **/\nol.johannes-content-element,\nul.johannes-content-element {\n padding-left: 1rem !important;\n}\n\n\n\n.johannes-content-element li>button {\n /* display: none; */\n display: none;\n position: absolute;\n margin-left: 10px;\n top: 0;\n\n flex-direction: row;\n align-items: start;\n justify-content: start;\n\n}\n\n.johannes-content-element li {\n position: relative;\n}\n\n.johannes-content-element li::before {\n margin-left: 0.3125rem;\n}\n\n.johannes-content-element li:hover>button {\n /* display: inline-block; */\n display: inline-flex;\n\n}\n\np.johannes-content-element {\n display: inline-block;\n line-height: 1;\n margin: 0;\n padding: 0;\n}\n\n.johannes-content-element .checkbox-list {\n list-style-type: none;\n padding-left: 0 !important;\n}\n\n\n.johannes-content-element .checkbox-list li {\n display: flex;\n flex-direction: row;\n justify-content: left;\n}\n\n\n.johannes-content-element ul.checkbox-list input[type="checkbox"]:checked+span {\n text-decoration: line-through;\n}\n\n/* ul.johannes-content-element:not(.checkbox-list),\nol.johannes-content-element:not(.checkbox-list) {\n padding-left: 1.5rem !important;\n} */\n\n/** Add line through text decoration to checked checkboxes text div */\n.block input[type="checkbox"]:checked+div {\n text-decoration: line-through;\n}\n\n/** Remove the default list style and replace by another that works with display flex */\n.block ol,\n.block ul {\n list-style: none;\n}\n\n.block ul .list-item,\n.block ol .list-item {\n display: flex;\n flex-direction: row;\n align-items: center;\n}\n\n.block ol li {\n counter-increment: item;\n}\n\n.block ol li::before {\n content: counter(item) ". ";\n margin-right: 0.3125rem;\n}\n\n.block ul li:not(.list-item-checkable)::before {\n content: "• ";\n margin-right: 0.3125rem;\n}\n\n\n\n/** and list **/\n\n\n\n.block>.drag-handler {\n color: #84888d;\n visibility: hidden;\n cursor: grab;\n align-self: start;\n\n /* background-color: pink; */\n padding-top: 0.33rem;\n position: absolute;\n}\n\n.drag-handler svg {\n /* background-color: red; */\n}\n\n.drag-handler svg use {\n /* background-color: blue; */\n}\n\n.drag-handler:active {\n cursor: grabbing;\n}\n\n.block {\n display: flex;\n flex-direction: row;\n margin-bottom: 1rem;\n position: relative;\n max-width: 100%;\n}\n\n.block>*:not(.drag-handler) {\n padding-left: 1.25rem !important;\n}\n\n.block:hover .drag-handler {\n visibility: visible;\n vertical-align: top;\n justify-content: start;\n}\n\n.drop-line {\n height: 1rem;\n background-color: #84888d;\n width: 100%;\n}\n\n\n.title h1 {\n margin-left: 1.3rem;\n}\n\n\n[contenteditable="true"]:empty:focus {\n content: attr(data-placeholder);\n color: #84888d;\n pointer-events: none;\n}\n\nh1[data-placeholder]:empty:before {\n content: attr(data-placeholder);\n color: #84888d !important;\n display: block;\n}\n\nh1[data-placeholder]:focus:before {}\n\n\n*[contenteditable="true"]:not(h1):empty:before {\n content: attr(data-placeholder);\n color: #84888acd;\n display: none;\n}\n\n*[contenteditable="true"]:not(h1):empty:hover:before {\n display: block;\n}\n\ncite[contenteditable="true"]:empty:before {\n display: block;\n}\n\n*[contenteditable="true"]:not(h1)[data-placeholder]:empty:focus:before {\n content: attr(data-placeholder);\n color: #84888acd !important;\n display: block;\n}\n\n\n\nh1 {\n font-size: 2.5rem;\n font-weight: bolder !important;\n}\n\n.johannes-editor {\n width: 100%;\n\n}\n\n.content {\n width: 100%;\n box-sizing: border-box;\n /* background-color: red; */\n}\n\n.content .block .table-wrapper {\n overflow-x: auto;\n overflow-y: hidden;\n}\n\n\npre {\n width: 100%;\n}\n\n[contenteditable] {\n outline: none;\n}\n\nbody {\n height: 2000px;\n background-color: #f0f0f1 !important;\n\n font-family: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";\n}\n\n\n.editor {\n display: flex;\n margin-top: 80px;\n}\n\np {\n color: #242424;\n}\n\n\n.block,\n.block * {\n user-select: text;\n}\n\n\n.johannes-content-element {\n width: 100%;\n padding: 0;\n margin: 0;\n /* background-color: green; */\n}\n\n\n#johannesEditor {\n width: 60%;\n margin-left: auto;\n margin-right: auto;\n}\n\n.johannes-editor hr {\n width: 100%;\n height: 2px;\n visibility: visible;\n border: none;\n border-bottom: 1px solid rgba(55, 53, 47, 0.16);\n}\n\n\n\n.johannes-editor blockquote {\n margin: 0.5rem 0;\n padding-left: 20px;\n border-left: 4px solid rgb(55, 53, 47);\n font-style: italic\n}\n\n.johannes-editor cite {\n padding-top: 1rem !important;\n display: inline-block;\n}\n\n\n.johannes-editor cite::before {\n content: \'— \';\n}\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n#linkBox {\n border-radius: 2px;\n padding: 20px;\n background-color: #f9f9f9;\n\n\n box-shadow:\n 0 4px 6px rgba(0, 0, 0, 0.1),\n 0 -2px 4px rgba(0, 0, 0, 0.02),\n -2px 0 4px rgba(0, 0, 0, 0.02),\n 2px 0 4px rgba(0, 0, 0, 0.02);\n\n\n border: 1px solid #d0d0d0;\n width: fit-content;\n z-index: 999999;\n color: rgb(120, 119, 116);\n border-radius: none;\n}\n\n\n#linkBox input {\n width: 316px;\n padding: 8px 40px 8px 16px;\n /* border-color: #d0d0d0; */\n\n border: 1px solid #949494;\n /* border-radius: 4px; */\n height: 24px;\n\n display: flex;\n flex-direction: row;\n justify-content: center;\n align-items: center;\n}\n\n\n#linkBox input::selection,\n#linkBox input:focus {\n border-radius: none;\n}\n\n/** soft-box-shadow class */\n.soft-box-shadow {\n margin: 0;\n padding: 0;\n border-radius: 2px;\n box-shadow:\n 0 4px 6px rgba(0, 0, 0, 0.1),\n 0 -2px 4px rgba(216, 196, 196, 0.02),\n -2px 0 4px rgba(0, 0, 0, 0.02),\n 2px 0 4px rgba(0, 0, 0, 0.02);\n\n border: 1px solid #d0d0d0;\n}\n\n/** and soft-box-shadow */\n\n\n/** selection-wrapper class */\n.select-wrapper {\n display: flex;\n flex-direction: row;\n align-items: center;\n}\n\n.select-wrapper ul {\n position: absolute;\n background: #f9f9f9;\n flex-direction: column;\n width: fit-content;\n padding-bottom: 0.5rem;\n padding-left: 5px;\n padding-right: 5px;\n top: 2.2rem;\n color: rgb(55, 53, 47);\n padding-right: 0.3125rem;\n}\n\n.select-wrapper ul li {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 0.625rem;\n padding: 0.1875rem 0.3125rem;\n border-radius: 0.1875rem;\n user-select: none !important;\n font-size: small !important;\n font-weight: 500;\n}\n\n.select-wrapper ul li span {\n display: inline-block;\n width: max-content;\n}\n\n.select-wrapper ul li .option-image {\n width: 1.375rem;\n height: 1.375rem;\n color: #242424;\n padding: 0 !important;\n margin: 0 !important;\n}\n\n.select-wrapper ul li .option-image svg {\n color: #4f4f4f;\n padding: 0 !important;\n margin: 0 !important;\n}\n\n.select-wrapper {\n position: relative;\n color: rgb(120, 119, 116);\n}\n\n.select-wrapper>button {\n color: rgba(55, 53, 47, 0.85);\n}\n\n.select-wrapper ul li>h3 {\n margin: 0;\n font-size: small !important;\n color: #37352fa6;\n margin: 0;\n padding: 0;\n font-weight: 600 !important;\n margin-top: 0.3125rem;\n margin-bottom: 0.3125rem;\n}\n\n/** end selection wrapper **/\n\n\n\n/** Text formatting Bar **/\n\n\n\n.floating-toolbar {\n justify-content: space-between;\n padding: 8px 16px;\n background-color: #f9f9f9;\n width: fit-content;\n z-index: 999999;\n position: absolute;\n user-select: none;\n}\n\n/* TODO: remove this*/\nspan {\n font-family: Arial, sans-serif;\n}\n\n\n.floating-toolbar .item {\n color: rgb(120, 119, 116);\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.floating-toolbar .item>button {\n\n display: inline-flex;\n align-items: center;\n}\n\n\n.floating-toolbar select {\n color: rgb(120, 119, 116);\n border: none;\n font-size: 0.85rem;\n background-color: inherit;\n}\n\n.text-formatting-select-button {\n display: flex;\n flex-direction: row;\n align-items: center;\n}\n\n#turnIntoButton span {\n display: inline-flex;\n flex-direction: row;\n justify-content: center;\n align-items: center;\n font-size: 0.9rem;\n\n}\n\n#turnIntoButton svg use {\n margin: auto;\n}\n\ncode:not(pre code) {\n margin: 0;\n padding: 0;\n background-color: #d0d0d0;\n background-color: #f6f5f4;\n font-size: inherit;\n font-size: 1rem !important;\n border: 1px solid #0000001a;\n padding: 0 3px;\n display: inline-block;\n border-radius: 4px;\n box-sizing: border-box;\n}\n\n\n\n\n/* a:not([href]) {\n background-color: #d3e3fd;\n} */\n\n.text-formatting-button-active {\n color: #2382e2;\n}\n\n.text-formatting-circle-active {\n border-color: #2382e2 !important;\n}\n\n\n\n#moreTextOptionSelect {\n position: absolute;\n}\n\n.moreTextOptionWrapper {\n position: relative;\n}\n\n\n.bgc-red {\n background-color: #FDDEDE;\n}\n\n.bgc-green {\n background-color: #D7F7DC;\n}\n\n.bgc-blue {\n background-color: #D9EDF6;\n}\n\n.bgc-yellow {\n background-color: #FAF4D1;\n}\n\n.bgc-grey {\n background-color: #E1E0E0;\n}\n\np,\nmark {\n line-height: 1;\n}\n\n#turnIntoSelect .option-image {\n /* display: none !important; */\n}\n\n.border-less-image {\n width: 24px;\n height: 24px;\n}\n\n\n\n\n/** Block Options **/\n\n.block-options-wrapper {\n z-index: 999999;\n position: absolute;\n display: none;\n}\n\n.block-options {\n width: fit-content;\n max-height: 19rem;\n overflow-y: auto;\n}\n\n.block-options {\n padding: 0 0.625rem;\n background: #f9f9f9;\n}\n\n.block-options section h2 {\n font-size: small !important;\n color: #37352fa6;\n margin: 0;\n padding: 0;\n font-weight: 600 !important;\n margin-top: 0.3125rem;\n margin-bottom: 0.3125rem;\n padding-left: 0.3125rem;\n}\n\n.block-options .option {\n padding: 0.3125rem 0.625rem;\n margin: 0.3125rem 0;\n cursor: pointer;\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: left;\n gap: 0.6rem;\n border-radius: 3px;\n}\n\n.block-options .option:focus {\n outline: none;\n background-color: #e9e9e9;\n border: inherit;\n}\n\n.option-focused {\n outline: none;\n background-color: #e9e9e9;\n border: none;\n}\n\n.danger-option.option-focused,\n.danger-option.option-focused svg {\n color: #EB5757 !important;\n}\n\n\n\n.block-options .option:focus-visible {\n outline: none;\n background-color: #e9e9e9;\n border: inherit;\n}\n\n/* .option-hover:hover {\n background-color: #e9e9e9;\n box-shadow: 0px 0px 0px 2px #e9e9e9;\n border-radius: 1px;\n transition: 0.1s ease;\n} */\n\n/* .select-wrapper>button, */\n\n/* #turnIntoButton,\n#colorTextButton {\n padding-left: 4px;\n} */\n\n#colorTextButton {\n margin-left: 0.625rem;\n}\n\n#turnIntoButton:not([disabled]):hover,\n#colorTextButton:not([disabled]):hover,\n#moreTextOptionButton:not([disabled]):hover,\n.floating-toolbar .item>button:not([disabled]):hover {\n background-color: #e9e9e9;\n box-shadow: 0px 0px 0px 2px #e9e9e9;\n border-radius: 1px;\n transition: 0.1s ease;\n}\n\n\n\n.option[focused="true"] {\n background-color: #bde4ff;\n}\n\n\n\n\n\n.option-image {\n width: 2.875rem;\n height: 2.875rem;\n border-radius: 0.1875rem;\n border: 1px solid #ccc;\n color: #4f4f4f;\n\n display: flex;\n flex-direction: row;\n justify-content: center;\n vertical-align: middle;\n align-items: center;\n background-color: #ffff;\n box-sizing: border-box;\n}\n\n.option-image img {\n max-width: 2.875rem;\n max-height: 2.875rem;\n}\n\n.option-image svg {\n margin: 0;\n padding: 0;\n padding: 0.625rem;\n box-sizing: border-box;\n\n}\n\n.option-text * {\n margin: 0;\n padding: 0;\n\n}\n\n.option-text .block-title {\n font-size: small !important;\n font-weight: 500;\n}\n\n.option-text .block-description {\n font-size: small !important;\n color: rgba(55, 53, 47, 0.5);\n}\n\n/** End Block Options **/\n\n\n\n#deleteBlockButton:hover svg,\n#deleteBlockButton:hover {\n color: rgb(235, 87, 87) !important;\n}\n\n\n\n.johannes-editor *::selection {\n /* background-color: rgba(211, 227, 253, 0.5) !important; */\n\n background-color: red;\n\n background-color: hsl(210 75% 50% / 1);\n color: white;\n}\n\n.johannes-editor mark,\n.johannes-editor * {\n line-height: 1.5 !important;\n}\n\n.option {\n justify-content: space-between;\n}\n\n.text-option {\n display: flex;\n flex-direction: row;\n justify-content: start;\n align-items: center;\n gap: 0.625rem;\n}\n\n\n\n\n:root {\n /* font-size: 16px; */\n /* Tamanho padrão */\n}\n\n/* Para telas com densidade média */\n@media only screen and (-webkit-min-device-pixel-ratio: 2),\nonly screen and (min--moz-device-pixel-ratio: 2),\nonly screen and (min-resolution: 192dpi),\nonly screen and (min-resolution: 2dppx) {\n :root {\n font-size: 18px;\n /* Aumenta o tamanho da fonte para telas de alta densidade */\n }\n}\n\n/* Para telas com altíssima densidade */\n@media only screen and (-webkit-min-device-pixel-ratio: 3),\nonly screen and (min--moz-device-pixel-ratio: 3),\nonly screen and (min-resolution: 288dpi),\nonly screen and (min-resolution: 3dppx) {\n :root {\n font-size: 20px;\n /* Ainda maior para telas de densidade muito alta */\n }\n}\n\n\n\n\n\n\n\n\n\n\n\ntable.johannes-content-element {\n border-collapse: collapse;\n max-width: inherit;\n width: auto;\n display: flex;\n box-sizing: border-box !important;\n}\n\ntable.johannes-content-element th,\ntable.johannes-content-element td {\n min-height: 20px;\n}\n\ntable.johannes-content-element th,\ntable.johannes-content-element td {\n border: 1px solid #84888d;\n padding: 8px;\n text-align: left;\n align-items: start;\n overflow-wrap: break-word;\n word-wrap: break-word;\n white-space: normal;\n vertical-align: top;\n min-width: 100px;\n max-width: 200px;\n /* box-sizing: border-box !important; */\n\n transition: border 100ms ease-out, box-shadow 100ms ease-out;\n\n}\n\ntable.johannes-content-element td.selected,\ntable.johannes-content-element td:focus {\n outline: none;\n box-shadow: 0 0 0 1px #74b6db inset;\n border: 1px double #74b6db;\n\n}\n\ntd {\n min-height: 1rem !important;\n line-height: 1rem;\n}\n\ntd::placeholder {\n display: block;\n}\n\ntd:empty:before {\n content: attr(data-placeholder);\n color: #84888acd;\n display: block !important;\n opacity: 0;\n}\n\n.table-wrapper {\n width: 100%;\n}\n\n.table-controller {\n position: relative;\n max-width: 100%;\n}\n\n.add-table-row {\n background-color: rgba(55, 53, 47, 0.06);\n width: 100%;\n padding: 0;\n margin: 0;\n margin-top: 0.375rem;\n display: flex;\n justify-content: center;\n align-items: center;\n text-align: center;\n height: 1rem;\n cursor: pointer;\n opacity: 0;\n user-select: none;\n}\n\n.add-table-column {\n position: absolute;\n right: -1.3125rem;\n background-color: rgba(55, 53, 47, 0.06);\n width: 1rem;\n padding: 0;\n margin: 0;\n display: flex;\n justify-content: center;\n align-items: center;\n text-align: center;\n height: 100%;\n top: 0;\n cursor: pointer;\n height: calc(100% - 1rem - 5px);\n opacity: 0;\n user-select: none;\n}\n\n.add-table-column:hover {\n opacity: 1;\n}\n\n.add-table-row:hover {\n opacity: 1;\n}\n\n.table-shell {\n max-width: 100%;\n}\n\n\n\n.table-option {\n background-color: white;\n width: fit-content;\n justify-content: space-between;\n padding: 8px 16px;\n background-color: #f9f9f9;\n width: fit-content;\n z-index: 999999;\n position: absolute;\n user-select: none;\n padding: 8px 16px;\n display: none;\n}\n\n\n\n\n/** Callout **/\n.callout:hover .options-button {\n display: block !important;\n}\n\n\n.no-selection {\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n}\n\n\n/** upload/embed **/\n\n.tab-container {\n font-size: 0.86rem;\n display: flex;\n flex-direction: column;\n transition: 0.1s ease;\n\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n\n transition: visibility 0.2s ease;\n\n}\n\n.nav-underline {\n margin: 0;\n padding: 0;\n border-bottom: 1px solid rgba(55, 53, 47, 0.16);\n padding: 10px 20px;\n}\n\n.nav-underline .nav-item {\n display: flex;\n margin-right: 15px;\n}\n\n.nav-underline .nav-link {\n cursor: pointer;\n text-decoration: none;\n color: rgb(55, 53, 47);\n color: rgba(55, 53, 47, 0.5);\n transition: 0.1s ease;\n}\n\n\n.nav-item.active .nav-link {\n color: #000;\n}\n\n.tab-content .content-data {\n display: none;\n padding: 20px;\n border-top: none;\n transition: 0.1s ease;\n}\n\n.tab-content .content-data.active {\n display: flex;\n flex-direction: column;\n text-align: center;\n gap: 1rem;\n}\n\n.tab-content .text-info {\n font-size: 0.75rem;\n color: rgba(55, 53, 47, 0.6);\n}\n\n.nav-underline .nav-item {\n display: inline;\n}\n\n\n.tab-container {\n width: fit-content;\n background-color: rgb(249, 249, 249);\n position: absolute;\n\n}\n\n.embed-content input {\n width: 20rem;\n border: 1px solid rgba(55, 53, 47, 0.16);\n height: 1.5rem;\n border-radius: 4px;\n padding-left: 10px;\n}\n\n\n.upload-content label {\n display: block;\n border: 1px solid rgba(55, 53, 47, 0.16);\n border-radius: 4px;\n width: 20rem;\n text-align: center;\n padding: 4px;\n color: rgb(55, 53, 47);\n background-color: #fff;\n /* transition: 0.1s ease; */\n}\n\n.upload-content label:hover {\n background-color: #eeeeee;\n}\n\n\n\n\n\n\n\n\n\n\n/* Estilo para as alças de redimensionamento */\n.resize-handle {\n position: absolute;\n width: 10px;\n height: 10px;\n background: rgba(0, 0, 0, 0.5);\n cursor: nwse-resize;\n /* Cursor de redimensionamento diagonal */\n}\n\n.resize-handle.se {\n bottom: 0;\n right: 0;\n}\n\n\n\n\n.embed-container {\n position: relative;\n width: 100%;\n padding-bottom: 56.25%;\n /* Proporção 16:9 */\n height: 0;\n overflow: hidden;\n}\n\n.embed-container iframe {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n}\n\n\n\n.video-container {\n position: relative;\n width: 100%;\n padding-bottom: 56.25%;\n /* Proporção 16:9 */\n height: 0;\n overflow: hidden;\n}\n\n.video-container iframe {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n}\n\n\n\n\n\n\n\n.resizable {\n resize: horizontal;\n overflow: auto;\n cursor: nesw-resize;\n}\n\n.background {\n background-color: #e7e6e3;\n}'],sourceRoot:""}]);const l=s},314:e=>{e.exports=function(e){var t=[];return t.toString=function(){return this.map((function(t){var n="",o=void 0!==t[5];return t[4]&&(n+="@supports (".concat(t[4],") {")),t[2]&&(n+="@media ".concat(t[2]," {")),o&&(n+="@layer".concat(t[5].length>0?" ".concat(t[5]):""," {")),n+=e(t),o&&(n+="}"),t[2]&&(n+="}"),t[4]&&(n+="}"),n})).join("")},t.i=function(e,n,o,i,r){"string"==typeof e&&(e=[[null,e,void 0]]);var s={};if(o)for(var l=0;l0?" ".concat(d[5]):""," {").concat(d[1],"}")),d[5]=r),n&&(d[2]?(d[1]="@media ".concat(d[2]," {").concat(d[1],"}"),d[2]=n):d[2]=n),i&&(d[4]?(d[1]="@supports (".concat(d[4],") {").concat(d[1],"}"),d[4]=i):d[4]="".concat(i)),t.push(d))}},t}},354:e=>{e.exports=function(e){var t=e[1],n=e[3];if(!n)return t;if("function"==typeof btoa){var o=btoa(unescape(encodeURIComponent(JSON.stringify(n)))),i="sourceMappingURL=data:application/json;charset=utf-8;base64,".concat(o),r="/*# ".concat(i," */");return[t].concat([r]).join("\n")}return[t].join("\n")}},72:e=>{var t=[];function n(e){for(var n=-1,o=0;o{var t={};e.exports=function(e,n){var o=function(e){if(void 0===t[e]){var n=document.querySelector(e);if(window.HTMLIFrameElement&&n instanceof window.HTMLIFrameElement)try{n=n.contentDocument.head}catch(e){n=null}t[e]=n}return t[e]}(e);if(!o)throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");o.appendChild(n)}},540:e=>{e.exports=function(e){var t=document.createElement("style");return e.setAttributes(t,e.attributes),e.insert(t,e.options),t}},56:(e,t,n)=>{e.exports=function(e){var t=n.nc;t&&e.setAttribute("nonce",t)}},825:e=>{e.exports=function(e){if("undefined"==typeof document)return{update:function(){},remove:function(){}};var t=e.insertStyleElement(e);return{update:function(n){!function(e,t,n){var o="";n.supports&&(o+="@supports (".concat(n.supports,") {")),n.media&&(o+="@media ".concat(n.media," {"));var i=void 0!==n.layer;i&&(o+="@layer".concat(n.layer.length>0?" ".concat(n.layer):""," {")),o+=n.css,i&&(o+="}"),n.media&&(o+="}"),n.supports&&(o+="}");var r=n.sourceMap;r&&"undefined"!=typeof btoa&&(o+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(r))))," */")),t.styleTagTransform(o,e,t.options)}(t,e,n)},remove:function(){!function(e){if(null===e.parentNode)return!1;e.parentNode.removeChild(e)}(t)}}}},113:e=>{e.exports=function(e,t){if(t.styleSheet)t.styleSheet.cssText=e;else{for(;t.firstChild;)t.removeChild(t.firstChild);t.appendChild(document.createTextNode(e))}}}},t={};function n(o){var i=t[o];if(void 0!==i)return i.exports;var r=t[o]={id:o,exports:{}};return e[o](r,r.exports,n),r.exports}n.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return n.d(t,{a:t}),t},n.d=(e,t)=>{for(var o in t)n.o(t,o)&&!n.o(e,o)&&Object.defineProperty(e,o,{enumerable:!0,get:t[o]})},n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),n.nc=void 0;var o,i,r,s,l,a,c,d,u,m,h,A,p=n(72),C=n.n(p),g=n(825),E=n.n(g),b=n(659),B=n.n(b),f=n(56),w=n.n(f),v=n(540),I=n.n(v),y=n(113),k=n.n(y),x=n(282),T={};T.styleTagTransform=k(),T.setAttributes=w(),T.insert=B().bind(null,"head"),T.domAPI=E(),T.insertStyleElement=I(),C()(x.A,T),x.A&&x.A.locals&&x.A.locals,function(e){e.Paragraph="p",e.Heading_1="h1",e.Heading_2="h2",e.Heading_3="h3",e.Heading_4="h4",e.Heading_5="h5",e.Heading_6="h6",e.CheckList="checkList",e.BulletedList="bulletedList",e.NumberedList="numberedList",e.List="list",e.Table="table",e.Image="image"}(o||(o={}));class S{static generateUniqueId(){const e=Date.now().toString(36),t=new Uint32Array(1);return window.crypto.getRandomValues(t),e+t[0].toString(36)}static rgbToHex(e){return"#"+e.match(/\d+/g).map(Number).map((e=>{const t=e.toString(16);return 1===t.length?"0"+t:t})).join("")}}!function(e){e.Link="icon-material-link",e.Bold="icon-wordpress-bold",e.Italic="icon-material-italic",e.Underline="icon-material-underline",e.InlineCode="icon-material-code-inline",e.StrikeThrough="icon-wordpress-strike-through",e.Plus="icon-plus",e.ColumnRight="icon-material-column-right",e.ColumnLeft="icon-material-column-left",e.RowAbove="icon-material-row-above",e.RowBelow="icon-material-row-below",e.deleteSweep="icon-material-delete-sweep",e.Trash="icon-material-trash",e.CloseCircle="icon-ionic-close-circle",e.Empty="Empty",e.Callout="icon-material-callout",e.Image="icon-material-image",e.Video="icon-material-video"}(i||(i={}));class L{creators;static _instance;static ELEMENT_TYPES={BLOCK_PARAGRAPH:"block-p",PARAGRAPH:"p",CHECKBOX_ITEM:"checkboxItem",LIST_ITEM:"listItem",CODE:"code",QUOTE:"blockquote",BULLETED_LIST:"ul",NUMBERED_LIST:"ol",CHECK_LIST:"checkLists",HEADER_1:"h1",HEADER_2:"h2",HEADER_3:"h3",HEADER_4:"h4",HEADER_5:"h5",HEADER_6:"h6",DRAG_HANDLE_BUTTON:"drag-handle-button",TABLE:"table",IMAGE:"image",CALLOUT:"callout"};constructor(){if(L._instance)throw new Error("Use ElementFactoryService.getInstance() to get instance.");this.creators={},this.register(L.ELEMENT_TYPES.BLOCK_PARAGRAPH,L.blockParagraphCreator()),this.register(L.ELEMENT_TYPES.PARAGRAPH,L.paragraphCreator()),this.register(L.ELEMENT_TYPES.CHECKBOX_ITEM,L.checkboxItemCreator()),this.register(L.ELEMENT_TYPES.LIST_ITEM,L.listItemCreator()),this.register(L.ELEMENT_TYPES.CODE,L.codeCreator()),this.register(L.ELEMENT_TYPES.QUOTE,L.quoteCreator()),this.register(L.ELEMENT_TYPES.CHECK_LIST,L.checkListCreator()),this.register(L.ELEMENT_TYPES.BULLETED_LIST,L.bulletedListCreator()),this.register(L.ELEMENT_TYPES.NUMBERED_LIST,L.numberedListCreator()),this.register(L.ELEMENT_TYPES.HEADER_1,L.headingCreator(1)),this.register(L.ELEMENT_TYPES.HEADER_2,L.headingCreator(2)),this.register(L.ELEMENT_TYPES.HEADER_3,L.headingCreator(3)),this.register(L.ELEMENT_TYPES.HEADER_4,L.headingCreator(4)),this.register(L.ELEMENT_TYPES.HEADER_5,L.headingCreator(5)),this.register(L.ELEMENT_TYPES.HEADER_6,L.headingCreator(6)),this.register(L.ELEMENT_TYPES.DRAG_HANDLE_BUTTON,L.dragHandleButtonCreator()),this.register(L.ELEMENT_TYPES.TABLE,L.tableCreator()),this.register(L.ELEMENT_TYPES.IMAGE,L.imageCreator2()),this.register(L.ELEMENT_TYPES.CALLOUT,L.calloutCreator()),L._instance=this}static getInstance(){return this._instance||(this._instance=new L),this._instance}register(e,t){this.creators[e]=t}create(e,t){const n=this.creators[e];if(!n)throw new TypeError(`No creator registered for type: ${e}`);return n(t||"")}static blockParagraphCreator(){return e=>L.blockParagraph(e)}static paragraphCreator(){return e=>L.paragraph(e)}static headingCreator(e){return t=>L.heading(e,t)}static checkboxItemCreator(){return e=>L.checkboxItem(e||"")}static listItemCreator(){return e=>L.listItem_2(e)}static dragHandleButtonCreator(){return()=>L.dragHandleButton()}static codeCreator(){return e=>{const t=document.createElement("pre"),n=document.createElement("code");return n.textContent=e||"",t.appendChild(n),n.contentEditable="true",t.classList.add("johannes-content-element"),n.classList.add("johannes-code"),t}}static quoteCreator(){return e=>{const t=document.createElement("blockquote");return t.textContent=e||"",t.contentEditable="true",t.classList.add("johannes-content-element"),t}}static checkListCreator(){return e=>{const t=document.createElement("ul");t.classList.add("johannes-content-element"),t.classList.add("swittable"),t.classList.add("list"),t.classList.add("checkbox-list"),t.setAttribute("data-content-type",o.CheckList);const n=L.checkboxItem(e||"");return t.appendChild(n),t}}static bulletedListCreator(){return e=>{const t=document.createElement("ul");t.setAttribute("data-content-type",o.BulletedList),t.classList.add("johannes-content-element"),t.classList.add("swittable"),t.classList.add("list");const n=L.listItem_2(e||"");return t.appendChild(n),t}}static numberedListCreator(){return e=>{const t=document.createElement("ol");t.setAttribute("data-content-type",o.NumberedList),t.classList.add("johannes-content-element"),t.classList.add("swittable"),t.classList.add("list");const n=L.listItem_2(e||"");return t.appendChild(n),t}}static tableCreator(){return e=>{const t=document.createElement("div");t.classList.add("table-shell");const n=document.createElement("div");n.classList.add("table-controller");const i=document.createElement("div");i.classList.add("table-wrapper");const r=document.createElement("table");r.classList.add("johannes-content-element","swittable","table"),r.setAttribute("data-content-type",o.Table),t.appendChild(n),n.appendChild(i),i.appendChild(r);const s=document.createElement("tbody");r.appendChild(s);const l=e?e.split(","):[],a=document.createElement("tr");l.forEach((e=>{const t=document.createElement("td");t.classList.add("focusable"),t.setAttribute("data-placeholder","cell"),t.textContent=e,t.contentEditable="true",a.appendChild(t)})),s.appendChild(a);const c=document.createElement("div");c.classList.add("add-table-row"),c.innerHTML='';const d=document.createElement("div");return d.classList.add("add-table-column"),d.innerHTML='',n.appendChild(c),n.appendChild(d),t}}static imageCreator2(){return e=>{const t=document.createElement("div");t.classList.add("johannes-content-element","swittable","no-selection"),t.setAttribute("data-content-type",o.Image),t.ATTRIBUTE_NODE;const n=document.createElement("div");n.classList.add("editor-only","temp-image-replace"),n.style.padding="1rem",n.style.backgroundColor="#e7e6e3",t.appendChild(n),n.style.color="rgba(55, 53, 47, 0.5)",n.style.display="flex",n.style.gap="5px",n.style.alignItems="center";const r=this.icon(i.Image);r.style.display="flex",r.style.alignItems="center",n.appendChild(r);const s=document.createElement("span");s.classList.add("no-selection"),s.innerText="Add an image",n.appendChild(s);const l=this.moreOptionsButton();return l.classList.add("options-button","hide-on-blur"),l.style.position="absolute",l.style.top="10px",l.style.right="10px",l.style.border="none",l.style.background="transparent",l.style.cursor="pointer",l.setAttribute("aria-label","More options"),l.style.display="none",t.appendChild(l),t}}static imageCreator(){return e=>{const t=document.createElement("img");return t.src=e||"default-image-path.jpg",t.alt="Descrição da imagem",t.classList.add("johannes-content-element"),t.classList.add("swittable"),t.classList.add("focusable"),t.style.width="100%",t.style.height="auto",t.addEventListener("click",(()=>{console.log("Imagem clicada!")})),t}}static calloutCreator(){return e=>{const t=document.createElement("div");t.classList.add("callout","johannes-content-element","swittable");const n=document.createElement("div");n.setAttribute("data-placeholder","Type something..."),n.contentEditable="true",n.classList.add("callout-text","editable","focusable"),n.style.padding="1rem",n.style.backgroundColor="#fbecdd",t.appendChild(n);const o=this.moreOptionsButton();return o.classList.add("options-button","hide-on-blur"),o.style.position="absolute",o.style.top="10px",o.style.right="10px",o.style.border="none",o.style.background="transparent",o.style.cursor="pointer",o.setAttribute("aria-label","More options"),o.style.display="none",t.appendChild(o),t}}static paragraph(e=null){const t=document.createElement("p");return t.innerText=e||"",t.contentEditable="true",t.setAttribute("data-content-type",o.Paragraph),t.classList.add("johannes-content-element"),t.classList.add("swittable"),t.classList.add("focusable"),t.classList.add("key-trigger"),t.setAttribute("data-placeholder","Write something or type / (slash) to choose a block..."),t}static heading(e,t=null){const n=document.createElement(`h${e}`);return n.innerText=t||"",n.contentEditable="true",n.setAttribute("data-content-type",`h${e}`),n.classList.add("johannes-content-element"),n.classList.add("swittable"),n.classList.add("focusable"),n.classList.add("focus"),n.classList.add("key-trigger"),n.setAttribute("data-placeholder",`Heading ${e}`),n}static checkboxItem(e){const t=S.generateUniqueId();let n=document.createElement("li");n.classList.add("deletable"),n.classList.add("list-item"),n.classList.add("list-item-checkable");let o=document.createElement("input");o.id=t,o.setAttribute("type","checkbox");let i=document.createElement("div");return i.textContent=e,i.setAttribute("data-placeholder","To-do"),i.contentEditable="true",i.setAttribute("for",t),i.setAttribute("contentEditable","true"),i.classList.add("focusable"),i.classList.add("editable"),i.classList.add("focus"),n.appendChild(o),n.appendChild(i),n}static listItem_2(e=null){let t=document.createElement("li");t.classList.add("deletable"),t.classList.add("list-item");const n=document.createElement("div");return n.classList.add("focusable"),n.classList.add("editable"),n.classList.add("focus"),n.contentEditable="true",n.classList.add("key-trigger"),n.setAttribute("data-placeholder","Item"),t.appendChild(n),n.innerText=e||"",t}static blockParagraph(e=null){let t=document.createElement("div"),n=L.paragraph(e);return t.appendChild(n),t.classList.add("block"),t.classList.add("deletable"),t}static dragHandleButton(){let e=document.createElement("button");return e.innerHTML='',e.classList.add("editor-only","drag-handler","button-reset"),e.draggable=!0,e}static moreOptionsButton(){let e=document.createElement("button");return e.innerHTML='',e.classList.add("editor-only","drag-handler","button-reset"),e}static icon(e){let t=document.createElement("div");return t.innerHTML=``,t}}class O{_canHide;props;htmlElement;parent;constructor(e){this.props=e,this.htmlElement=this.init(),this._canHide=!0}get display(){return"block"}appendTo(e){this.parent=e,e.htmlElement.appendChild(this.htmlElement)}get isVisible(){let e=this.htmlElement;if("none"===e.style.display||"hidden"===e.style.visibility||!document.contains(e))return!1;for(;e;){const t=window.getComputedStyle(e);if("none"===t.display||"hidden"===t.visibility)return!1;if(!e.parentElement)break;e=e.parentElement}return!0}show(){this.htmlElement.style.display=this.display}hide(){this.htmlElement.style.display="none"}lockHide(){this._canHide=!1}unlockHide(){this._canHide=!0}get canHide(){return this._canHide&&this.isVisible}set canHide(e){this._canHide=e}focus(){this.htmlElement.focus()}changeColor(e){this.htmlElement.style.color=e}removeColor(){this.htmlElement.style.color="inherit"}changeVisibilityToVisible(){this.htmlElement.style.visibility="visible"}changeVisibilityToHidden(){this.htmlElement.style.visibility="hidden"}get doesElementOverflowScreen(){const e=this.htmlElement.style.display,t=this.htmlElement.style.visibility,n=this.htmlElement.style.position;"none"===e&&(this.htmlElement.style.display="block",this.htmlElement.style.visibility="hidden",this.htmlElement.style.position="absolute");const o=this.htmlElement.getBoundingClientRect(),i=window.innerWidth;return"none"===e&&(this.htmlElement.style.display=e,this.htmlElement.style.visibility=t,this.htmlElement.style.position=n),o.right>i||o.left<0}}class N{static instance=new N;dependencies={};constructor(){}static get Instance(){return N.instance}register(e,t){this.dependencies[e]=t}resolve(e){if(!this.dependencies[e])throw new Error(`Dependency ${e} not found.`);return this.dependencies[e]()}}class R extends O{elementFactoryService;static editorId="johannesEditor";static instance;memento;title;content;addBlock;textFloatingToolbar;quickMenu;tableContextToolbar;mediaInputter;constructor(e,t,n,o,i,r,s,l,a,c){if(super({elementFactoryService:e,blockOperationsService:t,title:o,content:i,addBlock:r,floatingToolbar:s,quickMenu:l,tableToolbar:a,mediaInputter:c}),R.instance)throw new Error("Use BlockOperationsService.getInstance() to get instance.");this.elementFactoryService=e,this.memento=n,this.addBlock=r,this.textFloatingToolbar=s,this.quickMenu=l,this.tableContextToolbar=a,this.mediaInputter=c,this.attachEvents(),R.instance=this,this.memento.saveState()}init(){const e=document.getElementById(R.editorId)||document.createElement("div");return e.classList.add("johannes-editor"),window.editorConfig,e.appendChild(this.props.title.htmlElement),e.appendChild(this.props.content.htmlElement),window.editorConfig,e.appendChild(this.props.addBlock.htmlElement),window.editorConfig,e.appendChild(this.props.floatingToolbar.htmlElement),window.editorConfig,e.appendChild(this.props.quickMenu.htmlElement),e.appendChild(this.props.tableToolbar.htmlElement),e.appendChild(this.props.mediaInputter.htmlElement),e}static getInstance(e,t,n,o,i,r,s){const l=N.Instance.resolve("IElementFactoryService"),a=N.Instance.resolve("IBlockOperationsService"),c=N.Instance.resolve("IMemento");return R.instance||(R.instance=new R(l,a,c,e,t,n,o,i,r,s)),R.instance}attachEvents(){const e=document.getElementById(R.editorId);if(e?.addEventListener("mouseover",(e=>{const t=e.target;if(t instanceof Node){let e=t;if(e.nodeType===Node.TEXT_NODE&&(e=e.parentElement),e instanceof Element){const t=e.closest(".block");t&&this.appendDragHandler(t)}else console.error("Event target is not an HTMLElement and cannot handle HTMLElement specific methods:",e)}else console.error("Event target is not a Node:",t)})),"loading"===document.readyState)document.addEventListener("DOMContentLoaded",(()=>{const e=document.querySelector("#johannesEditor > .content .block p");e&&e.focus()}));else{const e=document.querySelector("#johannesEditor > .content .block p");e&&e.focus()}document.addEventListener("paste",(function(e){if("true"===e.target.getAttribute("contenteditable")){e.preventDefault();const t=e.clipboardData;if(t){const e=t.getData("text/plain");R.insertTextAtCursor(e)}}}),!0),this.attachDragHandler()}static insertTextAtCursor(e){const t=window.getSelection();if(t&&t.rangeCount>0){const n=t.getRangeAt(0);n.deleteContents();const o=document.createTextNode(e);n.insertNode(o),n.setStartAfter(o),n.setEndAfter(o),t.removeAllRanges(),t.addRange(n)}}appendDragHandler(e){if(e.nodeType===Node.TEXT_NODE&&(e=e.parentNode),!(e instanceof HTMLElement))return void console.error("Provided element is not an HTMLElement:",e);const t=e.closest(".block");let n=t?.querySelector(".drag-handler");!n&&t&&(n=this.elementFactoryService.create(L.ELEMENT_TYPES.DRAG_HANDLE_BUTTON),t.prepend(n))}removeDragHandler(e){if(e.nodeType===Node.TEXT_NODE&&(e=e.parentNode),!(e instanceof HTMLElement))return void console.error("Provided element is not an HTMLElement:",e);const t=e.closest(".block");if(t){const e=t.querySelector(".drag-handler");e?.remove()}}extractContent(){throw new Error("Not implemented Exception")}attachDragHandler(){let e=null,t=document.createElement("div");t.classList.add("drop-line"),t.style.height="2px",t.style.display="none",this.htmlElement.addEventListener("dragstart",(t=>{t.target?.classList?.contains("drag-handler")&&(e=t.target?.closest(".block"),e.setAttribute("draggable","true"),setTimeout((()=>{e.style.opacity="0.5"}),0))})),this.htmlElement.addEventListener("dragend",(()=>{setTimeout((()=>{e&&(e.style.opacity="",e.removeAttribute("draggable"),e=null),t.remove()}),0)})),this.htmlElement.addEventListener("dragover",(n=>{n.preventDefault();let o=n.target?.closest(".block");if(o&&o!==e){let e=o.getBoundingClientRect(),i=e.y+e.height/2;n.clientY>i?o.nextElementSibling!==t&&o.insertAdjacentElement("afterend",t):o.previousElementSibling!==t&&o.insertAdjacentElement("beforebegin",t)}t.style.display="block"})),this.htmlElement.addEventListener("drop",(n=>{n.preventDefault(),e&&t&&t.parentElement&&(t.parentElement.insertBefore(e,t),t.remove())}))}}class M{static isSelectionInTableCell(){let e=window.getSelection();if(!e?.rangeCount)return!1;let t=e.anchorNode;for(;t;){if(t.nodeType===Node.ELEMENT_NODE&&("TD"===t.tagName||"TH"===t.tagName))return!0;t=t.parentNode}return!1}static getSelectionTextInfo(e){let t,n,o=!1,i=!1;if(""==e.textContent)return o=!0,i=!0,{atStart:o,atEnd:i};const r=window.getSelection();return r&&r.rangeCount>0&&(t=r.getRangeAt(0),n=document.createRange(),n.selectNodeContents(e),n.setEnd(t.startContainer,t.startOffset),o=""===n.toString(),n.selectNodeContents(e),n.setStart(t.endContainer,t.endOffset),i=""===n.toString()),{atStart:o,atEnd:i}}static insertAfter(e,t){t.parentNode&&t.parentNode.insertBefore(e,t.nextSibling)}static hasTextContent(e){return""!==e.textContent?.trim()||e.hasChildNodes()&&Array.from(e.childNodes).some((e=>this.hasTextContent(e)))}static cloneAndInsertAfter(e){const t=e.cloneNode(!0),n=e.parentNode;return n?(n.insertBefore(t,e.nextSibling),t):null}static findClosestAncestorOfActiveElementByClass(e){const t=document.activeElement;if(!t)return null;let n=t;for(;n;){if(n.nodeType===Node.ELEMENT_NODE&&n.classList.contains(e))return n;n=n.parentNode}return null}static findClosestAncestorOfSelectionByClass(e){const t=window.getSelection();if(!t||0===t.rangeCount)return null;let n=t.getRangeAt(0).commonAncestorContainer;for(n&&n.nodeType===Node.TEXT_NODE&&(n=n.parentNode);n;){if(n.nodeType===Node.ELEMENT_NODE&&n.classList.contains(e))return n;n=n.parentNode}return null}static rearrangeContentAfterSplit(e,t){const n=M.getCursorPosition(e),o=this.splitContentAtCursorSelection(e);if(document.getSelection()?.removeAllRanges(),document.getSelection()?.addRange(o[1]),document.getSelection()?.deleteFromDocument(),t&&n){this.setCursorPosition(t,n);const e=this.splitContentAtCursorSelection(t);document.getSelection()?.removeAllRanges(),document.getSelection()?.addRange(e[0]),document.getSelection()?.deleteFromDocument()}}static getCursorPosition(e){const t=window.getSelection();if(!t||!e)return null;const n=t.getRangeAt(0);if(!n.intersectsNode(e))return null;const o=document.createTreeWalker(e,NodeFilter.SHOW_TEXT,{acceptNode:e=>NodeFilter.FILTER_ACCEPT});let i=0,r=o.firstChild();for(;r;){if(r===n.startContainer){i+=n.startOffset;break}i+=r.textContent?.length||0,r=o.nextNode()}return i}static setCursorPosition(e,t){const n=window.getSelection();if(!n)return;n.removeAllRanges();const o=document.createRange(),i=document.createTreeWalker(e,NodeFilter.SHOW_TEXT,{acceptNode:()=>NodeFilter.FILTER_ACCEPT});let r=i.nextNode(),s=0;for(;r;){const e=r.textContent?.length||0;if(s+e>=t){o.setStart(r,t-s),o.collapse(!0);break}s+=e,r=i.nextNode()}n.addRange(o)}static getContentTypeFromActiveElement(){const e=M.getCurrentActiveBlock(),t=e?.querySelector(".johannes-content-element");return t&&t.getAttribute("data-content-type")||null}static splitContentAtCursorSelection(e){const t=[],n=window.getSelection();if(!n||0===n.rangeCount)return t;const o=n.getRangeAt(0),i=document.createRange();i.selectNodeContents(e),i.setEnd(o.startContainer,o.startOffset);const r=document.createRange();return r.selectNodeContents(e),r.setStart(o.endContainer,o.endOffset),e.lastChild&&r.setEndAfter(e.lastChild),t.push(i),t.push(r),t}static placeCursorAtStartOfEditableElement(e){if(e.isContentEditable){e.focus();const t=document.createRange();t.selectNodeContents(e),t.collapse(!0);const n=window.getSelection();n?.removeAllRanges(),n?.addRange(t)}else console.warn("The element is not editable.")}static placeCursorAtEndOfEditableElement(e){e.isContentEditable?requestAnimationFrame((()=>{e.focus();const t=document.createRange(),n=window.getSelection();t.selectNodeContents(e);let o=e;for(;o.lastChild;)o=o.lastChild;t.setEnd(o,o.nodeType===Node.TEXT_NODE?o.textContent.length:0),t.collapse(!1),n?.removeAllRanges(),n?.addRange(t)})):console.warn("The element is not editable.")}static getCurrentActiveBlock(){let e=document.activeElement;return e?e.closest(".block"):null}static isSelectedTextDescendantOf(e){const t=document.getSelection();if(!t)return!1;if(!t.rangeCount)return!1;let n=t.getRangeAt(0).startContainer;return n.nodeType===Node.TEXT_NODE&&(n=n.parentNode),!!n&&null!==n.closest(e)}static removeFilterText(){let e=null;const t=window.getSelection();if(t&&t.rangeCount>0){const n=t.getRangeAt(0),o=n.commonAncestorContainer;if(o.nodeType===Node.TEXT_NODE&&o.parentElement?.isContentEditable){let i=o,r=n.startOffset;for(;i&&r>0;){if(e=(i.textContent?.substring(0,r)||"").lastIndexOf("/"),-1!==e){n.setStart(i,e),n.deleteContents();break}r=i.parentNode?.textContent?.lastIndexOf("/")||-1,i=i.parentNode}t.removeAllRanges(),t.addRange(n)}else console.warn("The cursor is not within a contentEditable element or a text node.")}else console.warn("No active selection.");return e}static findClickedElementOrAncestorByDataContentType(e,t){let n=e.target;if(n.nodeType===Node.TEXT_NODE&&(n=n.parentElement),n.dataset.contentType===t)return n;let o=n.parentElement;for(;o;){if(o.dataset.contentType===t)return o;o=o.parentElement}return null}static findClickedElementOrAncestorById(e,t){let n=e.target;if(n.nodeType===Node.TEXT_NODE&&(n=n.parentElement),n.id===t)return n;let o=n.parentElement;for(;o;){if(o.id===t)return o;o=o.parentElement}return null}static findClickedElementOrAncestorByClass(e,t){let n=e.target;if(n.nodeType===Node.TEXT_NODE&&(n=n.parentElement),n.classList.contains(t))return n;let o=n.parentElement;for(;o;){if(o.classList.contains(t))return o;o=o.parentElement}return null}}!function(e){e.floatingToolbarDisplayed="floatingToolbarDisplayed",e.anchorButtonClicked="anchorButtonClicked",e.boldButtonClicked="boldButtonClicked",e.italicButtonClicked="italicButtonClicked",e.underlineButtonClicked="underlineButtonClicked",e.inlineCodeButtonClicked="inlineCodeButtonClicked",e.strikeThroughButtonClicked="strikeThroughButtonClicked",e.hiliteColorButtonClicked="hiliteColorButtonClicked",e.foreColorButtonClicked="foreColorButtonClicked",e.buttonGroupItemClicked="buttonGroupItemClicked",e.focusOnFirstRequested="focusOnFirstRequested",e.transformBlockRequested="transformBlockRequested",e.duplicateBlockRequested="duplicateBlockRequested",e.anchor="anchor",e.bold="bold",e.italic="italic",e.underline="underline",e.inlineCode="inlineCode",e.strikeThrough="strikeThrough",e.hiliteColor="hiliteColor",e.foreColor="foreColor",e.textFormatChanged="textFormatChanged",e.emittedCommand="emittedCommand",e.blockTypeChanged="blockTypeChanged",e.blockDeleted="blockDeleted",e.tableCellChanged="tableCellChanged"}(r||(r={})),function(e){e.HiliteColorRed="#FDDEDE",e.HiliteColorGreen="#D7F7DC",e.HiliteColorBlue="#D9EDF6",e.HiliteColorYellow="#FAF4D1",e.HiliteColorGrey="#E1E0E0",e.HiliteColorNone="transparent",e.ForeColorRed="#D44C47",e.ForeColorGreen="#448361",e.ForeColorBlue="#337EA9",e.ForeColorYellow="#CB912F",e.ForeColorGrey="#787774",e.ForeColorInitial="initial",e.BackgroundColorRed="#FDDEDE",e.BackgroundColorGreen="#D7F7DC",e.BackgroundColorBlue="#D9EDF6",e.BackgroundColorYellow="#FAF4D1",e.BackgroundColorGrey="#E1E0E0",e.BackgroundColorNone="transparent",e.IconActiveBlue="#2382e2",e.IconDefaultBlack="rgba(55, 53, 47, 0.85)",e.Red="red",e.Tomato="#EB5757",e.OriginalTableColor="#84888d"}(s||(s={})),function(e){e.toggleBold="bold",e.toggleItalic="italic",e.toggleHiliteColor="hiliteColor",e.toggleForeColor="foreColor",e.toggleInlineCode="inlineCode",e.toggleLink="createLink",e.toggleUnderline="underline",e.toggleStrikeThrough="strikeThrough",e.removeFormat="removeFormat",e.transformBlock="transformBlock",e.duplicateBlock="duplicateBlock",e.deleteBlock="deleteBlock",e.createDefaultBlock="createDefaultBlock",e.focusOnPreviousBlock="focusOnPreviousBlock",e.insertNew="insertNew",e.insertTableRowAbove="insertTableRowAbove",e.insertTableRowBelow="insertTableRowBelow",e.insertTableColumnLeft="insertTableColumnLeft",e.insertTableColumnRight="insertTableColumnRight",e.showInsertTableColumnElement="showInsertTableColumnElement",e.showInsertTableRowElement="showInsertTableRowElement",e.hideInsertTableColumnElement="hideInsertTableColumnElement",e.hideInsertTableRowElement="hideInsertTableRowElement",e.toggleCellHiliteColor="toggleCellHiliteColor",e.removeColumn="removeColumn",e.removeRow="removeRow",e.changeTableBorderColor="changeTableBorderColor"}(l||(l={}));class H{color;constructor(e){this.color=e}}!function(e){e.ColorChangeRequest="ColorChangeRequest",e.ShowHideActiveButton="ShowHideActiveButton",e.ResetActiveButtons="ResetActiveButtons",e.CloseElement="HideComponent",e.ShowElement="ShowElement"}(a||(a={}));class q{classKey;value;intention;constructor(e,t,n){this.classKey=e,this.value=t,this.intention=n}}class _{classKey;constructor(e){this.classKey=e}}class D{}class P{}class F{static emitShowElementEvent(e){const t=new CustomEvent(a.ShowElement,{detail:{targetId:e,action:new P}});document.dispatchEvent(t)}static emitCloseElementEvent(e){const t=new CustomEvent(a.CloseElement,{detail:{targetId:e,action:new D}});document.dispatchEvent(t)}static emitChangeComponentColorEvent(e,t){const n=new CustomEvent(a.ColorChangeRequest,{detail:{targetId:e,action:new H(t)}});document.dispatchEvent(n)}static emitShowHideActiveElementEvent(e,t,n){"hiliteColor"==e&&t==s.HiliteColorNone&&(n="hide"),"foreColor"==e&&t==s.ForeColorInitial&&(n="hide"),"backgroundColor"==e&&t==s.BackgroundColorNone&&(n="hide");const o=new CustomEvent(a.ShowHideActiveButton,{detail:{targetClass:e,action:new q(e,t,n)}});document.dispatchEvent(o)}static emitResetActiveButtonsElementEvent(e){const t=new CustomEvent(a.ResetActiveButtons,{detail:{targetClass:e,action:new _(e)}});document.dispatchEvent(t)}static emitChangeTableBorderColorEvent(e,t){const n=new CustomEvent(r.emittedCommand,{detail:{command:l.changeTableBorderColor,value:t,scope:e}});document.dispatchEvent(n)}}class V{static instance;elementFactoryService;memento;focusStack;static BLOCK_OPERATIONS={TURN_INTO:"turnInto",CREATE_DEFAULT_BLOCK:"CreateDefaultBlock",DELETE_FOCUS_ON_PREVIOUS:"DeleteAndFocusOnPrevious",DELETE_FOCUS_ON_NEXT:"DeleteAndFocusOnNext",FOCUS_ON_FIRST:"FocusOnFirst",FOCUS_ON_PREVIOUS:"FocusOnPrevious",FOCUS_ON_NEXT:"FocusOnNext",DELETE:"delete",DUPLICATE:"duplicate",COPY:"copy",PASTE:"pates",CUT:"cut",REMOVE_FORMAT:"removeFormat",TRANSFORM_BLOCK:"transformBlock"};constructor(e,t,n){if(V.instance)throw new Error("Use BlockOperationsService.getInstance() to get instance.");this.elementFactoryService=e,this.focusStack=t,this.memento=n,V.instance=this}execCommand(e,t,n=null){if(e==V.BLOCK_OPERATIONS.COPY){if(document.getSelection&&navigator.clipboard&&navigator.clipboard.writeText){const e=document.getSelection();if(e&&e.toString().length>0){const t=e.toString();navigator.clipboard.writeText(t).then((()=>{const e=new CustomEvent("copiedText",{bubbles:!0,cancelable:!0});return document.dispatchEvent(e),!0})).catch((e=>{console.error("Error when copy text",e)}))}}return!1}if(e==V.BLOCK_OPERATIONS.CUT){if(document.getSelection&&navigator.clipboard&&navigator.clipboard.writeText){const e=document.getSelection();if(e&&e.toString().length>0){const t=e.toString();e.deleteFromDocument(),navigator.clipboard.writeText(t).then((()=>!0)).catch((e=>{console.error("Error when cut text: ",e)}))}}return!1}if(e==V.BLOCK_OPERATIONS.PASTE)return navigator.clipboard&&navigator.clipboard.readText&&navigator.clipboard.readText().then((e=>{const t=document.getSelection();if(t&&t.rangeCount>0){const n=t.getRangeAt(0);n.deleteContents(),n.insertNode(document.createTextNode(e));const o=new CustomEvent("requestUpdateFloatingToolbar",{bubbles:!0,cancelable:!0});return document.dispatchEvent(o),!0}console.error("No text selected or clipboard empty.")})).catch((e=>{console.error("Error when pasting text: ",e)})),!1;if(e==V.BLOCK_OPERATIONS.TRANSFORM_BLOCK&&this.getCurrentSelectedBlock()&&n&&this.transformBlock(n),e==V.BLOCK_OPERATIONS.REMOVE_FORMAT)return document.execCommand(V.BLOCK_OPERATIONS.REMOVE_FORMAT,!1);if(e==V.BLOCK_OPERATIONS.DELETE){this.deleteAndFocusOnNext();const e=new CustomEvent(r.blockDeleted,{bubbles:!0,cancelable:!0});return document.dispatchEvent(e),!0}if(e==V.BLOCK_OPERATIONS.DUPLICATE)return this.duplicateSelectedBlock(),!0;if(e==V.BLOCK_OPERATIONS.CREATE_DEFAULT_BLOCK){const e=document.activeElement||null;return this.createDefaultBlock(e),!0}if(e==V.BLOCK_OPERATIONS.FOCUS_ON_FIRST){const e=document.querySelector(".focusable");return!!e&&(e.focus(),!0)}if(e==V.BLOCK_OPERATIONS.DELETE_FOCUS_ON_PREVIOUS)return this.deleteAndFocusOnPrevious(),!0;if(e==V.BLOCK_OPERATIONS.DELETE_FOCUS_ON_NEXT)return this.deleteAndFocusOnNext(),!0;if(e==V.BLOCK_OPERATIONS.FOCUS_ON_PREVIOUS){const e=document.activeElement;return!!e&&(this.focusOnPrevious(e),!0)}if(e==V.BLOCK_OPERATIONS.FOCUS_ON_NEXT){const e=document.activeElement;return!!e&&(this.focusOnNext(e),!0)}return!0}queryCommandState(){throw new Error("Method not implemented.")}static getInstance(){const e=N.Instance.resolve("IElementFactoryService"),t=N.Instance.resolve("IFocusStack"),n=N.Instance.resolve("IMemento");return this.instance||(this.instance=new V(e,t,n)),this.instance}static getDraggableElementFromSelection(){const e=window.getSelection();if(e&&e.rangeCount>0){let t=e.getRangeAt(0).commonAncestorContainer;for(t.nodeType===Node.TEXT_NODE&&(t=t.parentNode);t&&!(t instanceof HTMLElement);)t=t.parentNode;if(t)return t.closest(".block")}throw new Error}transformBlock(e,t){let n;n=t?t.closest(".block"):this.focusStack.peek()?.closest(".block")||null;let o=n.querySelector(".swittable");this.focusStack.peek()?.focus(),M.removeFilterText(),this.memento.saveState();let i,r=o?.innerText,s=null;switch(e){case L.ELEMENT_TYPES.PARAGRAPH:i=this.elementFactoryService.create(L.ELEMENT_TYPES.PARAGRAPH),i.innerText=r;break;case L.ELEMENT_TYPES.HEADER_1:i=this.elementFactoryService.create(L.ELEMENT_TYPES.HEADER_1),i.innerText=r;break;case L.ELEMENT_TYPES.HEADER_2:i=this.elementFactoryService.create(L.ELEMENT_TYPES.HEADER_2),i.innerText=r;break;case L.ELEMENT_TYPES.HEADER_3:i=this.elementFactoryService.create(L.ELEMENT_TYPES.HEADER_3),i.innerText=r;break;case L.ELEMENT_TYPES.HEADER_4:i=this.elementFactoryService.create(L.ELEMENT_TYPES.HEADER_4),i.innerText=r;break;case L.ELEMENT_TYPES.HEADER_5:i=this.elementFactoryService.create(L.ELEMENT_TYPES.HEADER_5),i.innerText=r;break;case L.ELEMENT_TYPES.HEADER_6:i=this.elementFactoryService.create(L.ELEMENT_TYPES.HEADER_6),i.innerText=r;break;case L.ELEMENT_TYPES.CODE:i=document.createElement("pre");const e=document.createElement("code");e.innerText=r,i.appendChild(e);break;case L.ELEMENT_TYPES.QUOTE:break;case L.ELEMENT_TYPES.BULLETED_LIST:i=this.elementFactoryService.create(L.ELEMENT_TYPES.BULLETED_LIST,r);break;case L.ELEMENT_TYPES.NUMBERED_LIST:i=this.elementFactoryService.create(L.ELEMENT_TYPES.NUMBERED_LIST,r);break;case L.ELEMENT_TYPES.CHECK_LIST:i=this.elementFactoryService.create(L.ELEMENT_TYPES.CHECK_LIST,r);break;case"separator":break;case L.ELEMENT_TYPES.TABLE:i=this.elementFactoryService.create(L.ELEMENT_TYPES.TABLE,",,");break;case L.ELEMENT_TYPES.IMAGE:i=this.elementFactoryService.create(L.ELEMENT_TYPES.IMAGE,r),s=i;break;case L.ELEMENT_TYPES.CALLOUT:i=this.elementFactoryService.create(L.ELEMENT_TYPES.CALLOUT,r);break;default:return void console.error("Unsupported type")}if(!i)return;n.replaceChild(i,o);const l=i.closest(".focusable")||n.querySelector(".focusable");l&&(l.focus(),M.placeCursorAtEndOfEditableElement(l)),s&&this.focusStack.push(s),"image"==e&&F.emitShowElementEvent("mediaInputter")}createNewElement(e){this.memento.saveState();const t=e.target.closest(".johannes-content-element");t&&t.classList.contains("list")?this.createListItem(t):this.createDefaultBlock(t)}createListItem(e){this.memento.saveState();let t=null,n=(document.activeElement,e.closest(".johannes-content-element"));n.classList.contains("checkbox-list")?t=this.elementFactoryService.create("checkboxItem",""):n.classList.contains("list")&&(t=this.elementFactoryService.create("listItem",""))}createNewElementAndSplitContent(){this.memento.saveState();const e=M.getContentTypeFromActiveElement();if(e==o.Table)return!1;if(e==o.CheckList||e==o.BulletedList||e==o.NumberedList){const e=M.findClosestAncestorOfActiveElementByClass("list-item");if(e&&M.hasTextContent(e)){const t=M.cloneAndInsertAfter(e);if(t){const n=e.querySelector(".focusable"),o=t.querySelector(".focusable");M.rearrangeContentAfterSplit(n,o)}}else if(e){const t=e.closest(".block");if(t){const n=t.querySelectorAll(".list-item").length,o=L.blockParagraph();M.insertAfter(o,t),e.remove(),1==n&&t.remove();const i=o.querySelector("p");M.placeCursorAtStartOfEditableElement(i)}}}else{const e=M.findClosestAncestorOfActiveElementByClass("block");if(e){const t=M.cloneAndInsertAfter(e);if(t){const n=e.querySelector(".focusable"),i=t.querySelector(".focusable");M.rearrangeContentAfterSplit(n,i),M.hasTextContent(t)||this.transformBlock(o.Paragraph,t)}const n=t.querySelector(".focusable");M.placeCursorAtStartOfEditableElement(n)}}return!0}createDefaultBlock(e){const t=this.elementFactoryService.create(L.ELEMENT_TYPES.BLOCK_PARAGRAPH,"");e&&e.closest(".block")?e.closest(".block").insertAdjacentElement("afterend",t):document.querySelector("#johannesEditor .content").appendChild(t),t.querySelector(".johannes-content-element").focus()}deleteAndFocusOnPrevious(){const e=document.activeElement;this.focusOnPrevious(e),this.deleteTheCurrentElementAndTheDraggableBlockIfEmpty(e)}deleteAndFocusOnNext(){let e=this.getCurrentSelectedBlock()||M.getCurrentActiveBlock();e&&(this.focusOnNext(e),this.deleteTheCurrentElementAndTheDraggableBlockIfEmpty(e))}focusOnPrevious(e,t=null){let n=null;if("LI"===e.tagName.toUpperCase()){let o=e.previousElementSibling;if(!o)return;if(o&&o.classList.contains("focusable"))return n=o,void(t?this.applyCursorXEndPosition(n,t):M.placeCursorAtEndOfEditableElement(n))}if("LI"===e.parentNode.tagName.toUpperCase()){let o=e.closest("li")?.previousElementSibling?.querySelector(".focusable");if(o&&o.classList.contains("focusable"))return n=o,void(t?this.applyCursorXEndPosition(n,t):M.placeCursorAtEndOfEditableElement(n))}let o=e.closest(".block");if(!o)return;let i=o.previousElementSibling;for(;i;){let e=i.querySelectorAll(".focusable");if(e.length>0)return n=e[e.length-1],void(t?this.applyCursorXEndPosition(n,t):M.placeCursorAtEndOfEditableElement(n));i=i.previousElementSibling}}focusOnNext(e,t=null){let n=null;if("LI"===e.tagName.toUpperCase()){let o=e.nextElementSibling;if(o&&o.classList.contains("focusable"))return n=o,t?this.applyCursorXStartPosition(n,t):M.placeCursorAtStartOfEditableElement(n),n}if("LI"===e.parentNode.tagName.toUpperCase()){let o=e.closest("li")?.nextElementSibling?.querySelector(".focusable");if(o&&o.classList.contains("focusable"))return n=o,t?this.applyCursorXStartPosition(n,t):M.placeCursorAtStartOfEditableElement(n),n}let o=e.closest(".block");if(!o)return;let i=o.nextElementSibling;for(;i;){let e=i.querySelectorAll(".focusable");if(e.length>0)return n=e[0],t?this.applyCursorXStartPosition(n,t):M.placeCursorAtStartOfEditableElement(n),n;i=i.nextElementSibling}return n}deleteTheCurrentElementAndTheDraggableBlockIfEmpty(e){const t=e.closest(".block"),n=e.closest(".deletable");n?.remove(),t&&0==t.querySelectorAll(".editable").length&&t.remove()}applyCursorXEndPosition(e,t){const n=window.getSelection(),o=document.createRange();let i=e.lastChild,r=null;for(;i;){if(i.nodeType===Node.TEXT_NODE){r=this.adjustCursorOffset(i,t);break}i=(i.nodeName.toUpperCase(),i.previousSibling)}r&&r.closestNode?(o.setStart(r.closestNode,r.closestOffset),o.collapse(!0),n.removeAllRanges(),n.addRange(o),e.focus()):(o.selectNodeContents(e),o.collapse(!1),n.removeAllRanges(),n.addRange(o),e.focus())}applyCursorXStartPosition(e,t){const n=window.getSelection(),o=document.createRange();let i=e.firstChild,r=null;for(;i;){if(i.nodeType===Node.TEXT_NODE){r=this.adjustCursorOffset(i,t);break}i=i.nextSibling}r&&r.closestNode?(o.setStart(r.closestNode,r.closestOffset),o.collapse(!0),n.removeAllRanges(),n.addRange(o),e.focus()):(o.selectNodeContents(e),o.collapse(!0),n.removeAllRanges(),n.addRange(o),e.focus())}adjustCursorOffset(e,t){let n=document.createRange(),o=e,i=0,r=1/0;for(let o=0;on.getBoundingClientRect().right&&(i=e.textContent.length),{closestNode:o,closestOffset:i}}getCurrentSelectedFocusable(){const e=window.getSelection();if(!e||0===e.rangeCount)return null;let t=e.getRangeAt(0).commonAncestorContainer;return t.nodeType===Node.TEXT_NODE&&(t=t.parentNode),t.closest(".focusable")}getCurrentSelectedBlock(){const e=window.getSelection();if(!e||0===e.rangeCount)return null;let t=e.getRangeAt(0).commonAncestorContainer;return t.nodeType===Node.TEXT_NODE&&(t=t.parentNode),t.closest(".block")}duplicateSelectedBlock(){let e=this.getCurrentSelectedBlock()||M.getCurrentActiveBlock();if(!e||!e.parentNode)return console.error("O elemento fornecido é inválido ou não está no DOM."),null;const t=e.cloneNode(!0),n=e.nextSibling;return e.parentNode.insertBefore(t,n),t}}class j extends O{blockOperationsService;icon;constructor(e,t){super({icon:t}),this.blockOperationsService=e,this.icon=t,this.attachEvents()}init(){const e=document.createElement("button");return e.title="Add a new block",e.classList.add("add-block","block-operation"),e.appendChild(this.props.icon.htmlElement),e}attachEvents(){this.htmlElement.addEventListener("click",(()=>{this.blockOperationsService.execCommand(V.BLOCK_OPERATIONS.CREATE_DEFAULT_BLOCK,!1)}))}static create(e){const t=N.Instance.resolve("IBlockOperationsService");return new j(t,e)}}class U extends O{button;constructor(e){super({button:e}),this.button=e}init(){const e=document.createElement("div");return e.classList.add("add-block-wrapper"),e.appendChild(this.props.button.htmlElement),e}static create(e){return new U(e)}}class Y{static medium="1rem";static large="1.25rem"}class K extends O{useElement;constructor(e,t){super({iconId:e,size:t}),this.useElement=this.htmlElement.querySelector("use")}init(){const e=document.createElementNS("http://www.w3.org/2000/svg","svg");e.style.color="red !important";let t=document.createElementNS("http://www.w3.org/2000/svg","use");return t.setAttributeNS("http://www.w3.org/1999/xlink","href",`#${this.props.iconId}`),t.style.color="red !important",e.appendChild(t),e.setAttribute("width",this.props.size),e.setAttribute("height",this.props.size),e.setAttribute("fill","currentColor"),e}clone(){return new K(this.props.iconId,this.props.sizes)}setUseTo(e){this.useElement.setAttributeNS("http://www.w3.org/1999/xlink","href",`#${e}`)}static create(e,t){return new K(e,t)}}class z{static build(){return U.create(j.create(K.create(i.Plus,Y.medium)))}}class G extends O{id;dropdownButton;dropdownList;constructor(e,t,n){super({id:e}),this.id=e,this.dropdownButton=t,this.dropdownList=n,t.appendTo(this),n.appendTo(this)}init(){const e=document.createElement("div");return e.id=this.props.id,e.classList.add("select-wrapper"),e}get display(){return"block"}}class Z{head=null;tail=null;length=0;getFirst(){return this.head}getLast(){return this.tail}*[Symbol.iterator](){let e=this.head;if(e)do{yield e,e=e.nextNode}while(e&&e!==this.head)}forEach(e){let t=0;for(let n of this)e(n.value,t,this),t++}any(e){let t=this.head;for(;t;){if(e(t.value))return!0;if(t=t.nextNode,t===this.head)break}return!1}findFirst(e){if(!this.head)return null;let t=this.head;do{if(e(t.value))return t;t=t.nextNode}while(t&&t!==this.head);return null}findLast(e){if(!this.tail)return null;let t=this.tail;do{if(e(t.value))return t;t=t.previousNode}while(t&&t!==this.tail);return null}find(e){let t=this.head;for(;t;){if(t.value==e)return t;if(t=t.nextNode,t===this.head)break}return null}}class W{parentList;previousNode;nextNode;value;constructor(e,t){this.previousNode=null,this.nextNode=null,this.value=e,this.parentList=t}setNext(e){this.nextNode=e}setPrevious(e){this.previousNode=e}getNextSatisfying(e){let t=this.nextNode;const n=this;for(;t;){if(e(t.value))return t;if(t=t.nextNode,t===n)break}return null}getPreviousSatisfying(e){let t=this.previousNode;const n=this;for(;t&&t!==n;){if(e(t.value))return t;if(t=t.previousNode,t===this)break}return null}}class X extends Z{constructor(){super()}append(e){const t=new W(e,this);this.head&&this.tail?(t.setPrevious(this.tail),t.setNext(this.head),this.tail.setNext(t),this.head.setPrevious(t),this.tail=t):(this.head=t,this.tail=t,this.head.setNext(this.tail),this.head.setPrevious(this.tail)),this.length++}}class Q extends O{id;command;value;activeIcon;leftIcon;classList;onFocusFunctionList=[];onLoseFocusFunctionList=[];parentDropdownMenuList;constructor(e,t,n,o,i,r,s=null){const l=["list-item","option","option-hover","block-operation"],a=new K("icon-material-small-check",Y.medium);a.htmlElement.style.visibility="hidden",o&&(i.style.color=o),super({id:e,classList:l,leftIcon:i,title:r,icon:a,shortcut:s}),this.id=e,this.classList=l,this.leftIcon=i,this.command=n,this.value=o,this.parentDropdownMenuList=t,this.activeIcon=a,this.attachEvent()}addClass(e){this.classList.push(e),this.htmlElement.classList.add(e)}attachOnFocus(e,...t){this.onFocusFunctionList.push((()=>e(...t)))}attachOnLoseFocus(e,...t){this.onLoseFocusFunctionList.push((()=>e(...t)))}focus(){this.htmlElement.classList.add("option-focused"),this.onFocusFunctionList.forEach((e=>e()))}removeFocus(){this.htmlElement.classList.remove("option-focused"),this.onLoseFocusFunctionList.forEach((e=>e()))}init(){const e=document.createElement("li");e.id=this.props.id;const t=this.props.classList;e.classList.add(...t),e.tabIndex=2,e.style.color="#37352F";const n=document.createElement("div");n.classList.add("text-option"),n.appendChild(this.props.leftIcon);const o=document.createElement("span");if(o.innerText=this.props.title,n.appendChild(o),e.appendChild(n),e.appendChild(this.props.icon.htmlElement),this.props.shortcut){const t=document.createElement("span");t.innerText=this.props.shortcut,t.style.color="rgba(55, 53, 47, 0.5)",e.appendChild(t)}return e}emitCommandEvent(){const e=new CustomEvent(r.emittedCommand,{detail:{command:this.command,value:this.value}});document.dispatchEvent(e)}addCssClass(...e){this.htmlElement.classList.add(...e)}attachEvent(){this.attachUIEvent(),this.htmlElement.addEventListener("click",(e=>{e.preventDefault()})),this.htmlElement.addEventListener("mousedown",(e=>{e.preventDefault()})),this.htmlElement.addEventListener("mousemove",(async()=>{const e=this.parentDropdownMenuList.dropdownItems.find(this);this.parentDropdownMenuList.switchVisualFocus(e)})),this.htmlElement.addEventListener("click",(()=>{this.emitCommandEvent()}))}attachUIEvent(){document.addEventListener(a.ShowHideActiveButton,this.handleShowHideActiveButtonEvent.bind(this)),document.addEventListener(a.ResetActiveButtons,this.handleResetActiveButtonsEvent.bind(this))}handleShowHideActiveButtonEvent(e){const t=e.detail;if(this.classList?.includes(t.targetClass)){const e=t.action,n=e.value;this.value?.toLowerCase()==n.toLowerCase()&&"show"==e.intention&&this.activeIcon?.changeVisibilityToVisible()}}handleResetActiveButtonsEvent(e){const t=e.detail;this.classList?.includes(t.targetClass)&&this.activeIcon?.changeVisibilityToHidden()}}class $ extends O{id;parentDropdownParentButton;dropdownItems;currentFocusedMenuItem;constructor(e){super({id:e}),this.id=e,this.dropdownItems=new X,this.currentFocusedMenuItem=null,this.attachEvents()}get display(){return"flex"}init(){const e=document.createElement("ul");return e.id=this.props.id,e.setAttribute("name","block-type"),e.style.display="none",e.classList.add("soft-box-shadow","dependent-box","checkable-items"),e.style.position="absolute",e.style.maxHeight="25vmax",e.style.overflowY="auto",e}append(e){this.dropdownItems.append(e),this.htmlElement.appendChild(e.htmlElement)}setParentDropdownMenuButton(e){this.parentDropdownParentButton=e}attachEvents(){document.addEventListener("keydown",(e=>{this.isVisible&&this.currentFocusedMenuItem&&"Enter"===e.key&&this.currentFocusedMenuItem.value.emitCommandEvent()})),document.addEventListener("click",(e=>{this.clickedOutsideTheDropdownWhileDropdownIsVisible(e)&&this.hide()})),document.addEventListener("keydown",(e=>{this.keyPressedOutsideTheDropdownWhileDropdownIsVisible(e)&&("ArrowDown"==e.key&&(e.preventDefault(),this.focusNextVisibleItem()),"ArrowUp"==e.key&&(e.preventDefault(),this.focusPreviousVisibleItem()))}))}show(){this.htmlElement.style.left="0",this.htmlElement.style.right="auto",this.doesElementOverflowScreen&&(this.htmlElement.style.left="auto",this.htmlElement.style.right="0"),this.parentDropdownParentButton?.svgIcon?.setUseTo("icon-wordpress-chevron-up"),super.show()}hide(){this.parentDropdownParentButton?.svgIcon?.setUseTo("icon-wordpress-chevron-down"),this.currentFocusedMenuItem?.value.removeFocus(),this.currentFocusedMenuItem=null,super.hide()}switchVisualFocus(e){this.currentFocusedMenuItem!=e&&(this.currentFocusedMenuItem&&this.currentFocusedMenuItem.value.removeFocus(),this.currentFocusedMenuItem=e,this.currentFocusedMenuItem.value.focus())}focusNextVisibleItem(){let e;e=this.currentFocusedMenuItem?this.currentFocusedMenuItem.getNextSatisfying((e=>e instanceof Q)):this.dropdownItems.findFirst((e=>e instanceof Q)),this.switchVisualFocus(e)}focusPreviousVisibleItem(){let e;e=this.currentFocusedMenuItem?this.currentFocusedMenuItem.getPreviousSatisfying((e=>e instanceof Q)):this.dropdownItems.findFirst((e=>e instanceof Q)),this.switchVisualFocus(e)}clickedOutsideTheDropdownWhileDropdownIsVisible(e){return this.canHide&&!e.target.closest(`#${this.htmlElement.id}`)&&!e.target.closest(`#${this.parentDropdownParentButton?.htmlElement.id}`)}keyPressedOutsideTheDropdownWhileDropdownIsVisible(e){return this.canHide&&!e.target.closest(`#${this.htmlElement.id}`)&&!e.target.closest(`#${this.parentDropdownParentButton?.htmlElement.id}`)}}class J extends O{id;constructor(e){super({id:e}),this.id=e}init(){const e=document.createElement("div");return e.id=this.props.id,e.style.height="24px",e.style.width="1px",e.style.borderRight="1px solid #d0d0d0",e.style.margin="auto 6px",e}}class ee extends O{constructor(){super({})}init(){const e=document.createElement("div");return e.classList.add("item"),e}}class te extends O{id;command;showUI;icon;constructor(e,t,n,o){super({id:e,title:n,icon:o}),this.id=e,this.command=t,this.showUI=t==l.toggleLink,this.icon=o,this.attachEvents()}init(){const e=document.createElement("button");return e.classList.add("entry","button-reset","text-formatting-operation","option-hover"),e.title=this.props.title,e.tabIndex=1,e.appendChild(this.props.icon.htmlElement),e}attachEvents(){this.htmlElement.addEventListener("click",(async()=>{document.dispatchEvent(new CustomEvent(r.emittedCommand,{detail:{command:this.command,showUI:this.showUI}}))})),document.addEventListener(a.ColorChangeRequest,(e=>{const t=e.detail;this.id==t.targetId&&this.icon.changeColor(t.action.color)}))}static create(e,t,n,o){return new te(e,t,n,o)}}class ne extends O{constructor(e){super({color:e})}init(){const e=document.createElement("div");return e.style.width="1.25rem",e.style.height="1.25rem",e.style.borderRadius="50%",e.style.backgroundColor=this.props.color,e.style.border="1px solid #d0d0d0",e.style.boxSizing="border-box",e}}class oe extends O{dropdownList;svgIcon;constructor(e,t,n,o=!0){const i=new K("icon-wordpress-chevron-down",Y.medium);super({id:e,title:t,dropdownList:n,svgIcon:o?i:null}),this.dropdownList=n,this.svgIcon=i,this.attachEvents(),n.setParentDropdownMenuButton(this)}init(){const e=document.createElement("button");if(e.id=this.props.id,e.role="button",e.classList.add("button-reset","text-formatting-select-button","text-formatting-operation","option-hover"),e.tabIndex=1,e.style.position="relative",e.setAttribute("aria-controls",this.props.dropdownList.htmlElement.id),"string"==typeof this.props.title){const t=document.createElement("span");t.textContent=this.props.title,e.appendChild(t)}else e.appendChild(this.props.title);return this.props.svgIcon&&e.appendChild(this.props.svgIcon.htmlElement),e}attachEvents(){this.htmlElement.addEventListener("click",(()=>{this.dropdownList.isVisible?this.dropdownList.hide():this.dropdownList.show()}))}get display(){return"block"}}class ie extends O{parentDropdownMenuList;constructor(e,t){super({title:t}),this.parentDropdownMenuList=e}changeActiveIconToVisible(){}getLeftIconBackgroundColor(){return null}resetActiveIcon(){}attachOnLoseFocus(e){throw new Error("Method not implemented.")}attachOnFocus(e){throw new Error("Method not implemented.")}emitCommandEvent(){throw new Error("Method not implemented.")}removeFocus(){throw new Error("Method not implemented.")}focus(){throw new Error("Method not implemented.")}init(){const e=document.createElement("li"),t=document.createElement("h3");return t.innerText=this.props.title,e.appendChild(t),e}}!function(e){e.Link="linkButton",e.Bold="boldButton",e.Italic="italicButton",e.Underline="underlineButton",e.InlineCode="inlineCodeButton",e.Strikethrough="strikethroughButton"}(c||(c={}));class re{static instance;memento;textOperationService;constructor(e){if(re.instance)throw new Error("Use TextOperationService.getInstance() to get instance.");this.memento=e,this.attachEvents()}attachEvents(){}static getInstance(){const e=N.Instance.resolve("IMemento");return this.instance||(this.instance=new re(e)),this.instance}execBold(){this.memento.saveState(),document.execCommand("bold")&&F.emitChangeComponentColorEvent(c.Bold,s.IconActiveBlue)}execItalic(){this.memento.saveState(),document.execCommand("italic")&&F.emitChangeComponentColorEvent(c.Italic,s.IconActiveBlue)}execStrikeThrough(){this.memento.saveState(),document.execCommand("strikeThrough")&&F.emitChangeComponentColorEvent(c.Strikethrough,s.IconActiveBlue)}execUnderline(){this.memento.saveState(),document.execCommand("underline")&&F.emitChangeComponentColorEvent(c.Underline,s.IconActiveBlue)}execHiliteColor(e){this.memento.saveState(),F.emitResetActiveButtonsElementEvent("hiliteColor"),document.execCommand("hiliteColor",!1,e)&&F.emitShowHideActiveElementEvent("hiliteColor",e,"show")}execForeColor(e){this.memento.saveState(),F.emitResetActiveButtonsElementEvent("foreColor"),document.execCommand("foreColor",!1,e)&&F.emitShowHideActiveElementEvent("foreColor",e,"show")}execCommand(e,t,n){return!1}queryCommandState(e,t){return new Promise(((n,o)=>{requestAnimationFrame((()=>{e!==l.toggleLink?e===l.toggleUnderline&&this.queryAnchor()?n(!1):e!==l.toggleHiliteColor?e!==l.toggleForeColor?n(document.queryCommandState(e)):n(this.queryForeColor(t)):n(this.queryHiliteColor(t)):n(this.queryAnchor())}))}))}queryCommandStateA(e,t){return e===l.toggleLink?this.queryAnchor():e===l.toggleUnderline&&this.queryAnchor()?!this.queryAnchor():e===l.toggleHiliteColor?this.queryHiliteColor(t):e===l.toggleForeColor?this.queryForeColor(t):document.queryCommandState(e)}toggleCodeExecCommand(){const e=window.getSelection();if(!e||0===e.rangeCount)return;const t=e.getRangeAt(0);let n=t.commonAncestorContainer;for(;n&&"CODE"!==n.nodeName;)n=n.parentNode;if(n&&"CODE"===n.nodeName){const e=n,o=document.createRange();if(o.selectNodeContents(e),t.toString()===o.toString()){const t=e.parentNode;for(;t&&e.firstChild;)t.insertBefore(e.firstChild,e);t?.removeChild(e)}else{const e=t.toString();document.execCommand("insertHTML",!1,e)}document.getSelection()?.removeAllRanges()}else{const e=(new XMLSerializer).serializeToString(t.cloneContents());document.execCommand("insertHTML",!1,`${e}`)}}queryForeColor(e){const t=window.getSelection();if(!t)return!1;if(!t.rangeCount)return!1;let n=t.getRangeAt(0).commonAncestorContainer;n.nodeType===Node.TEXT_NODE&&(n=n.parentNode);const o=n.closest("font[color]");if(!o)return!1;const i=window.getComputedStyle(o).color;return S.rgbToHex(i).toUpperCase()===e.toUpperCase()}queryAnchor(){const e=window.getSelection();if(!e||!e.rangeCount)return!1;let t=e.getRangeAt(0).commonAncestorContainer;for(t.nodeType===Node.TEXT_NODE&&(t=t.parentNode);t&&null!==t;){if(t.nodeType==Node.ELEMENT_NODE&&t.closest("a"))return!0;t=t.parentNode}return!1}queryHiliteColor(e){const t=window.getSelection();if(!t)return!1;if(!t.rangeCount)return!1;let n=t.getRangeAt(0).commonAncestorContainer;n.nodeType===Node.TEXT_NODE&&(n=n.parentNode);const o=n.closest("span[style*='background-color']")||n.closest("font[style*='background-color']");if(!o)return!1;const i=window.getComputedStyle(o).backgroundColor;return S.rgbToHex(i).toUpperCase()===e.toUpperCase()}getInitialColorAsHex(){const e=document.createElement("div");document.body.appendChild(e),e.style.color="initial";const t=window.getComputedStyle(e).color;return document.body.removeChild(e),S.rgbToHex(t)}getTargetElementMap(e){switch(e){case"strong":case"bold":case"b":return"strong";case"italic":case"i":case"em":return"em";case"underline":case"u":return"u";case"strikethrough":case"s":return"s";case"background":case"color":return"span";default:throw new Error}}static getSelectedHTMLElement(){const e=window.getSelection();if(e&&e.rangeCount>0){let t=e.getRangeAt(0).commonAncestorContainer;for(t.nodeType===Node.TEXT_NODE&&(t=t.parentNode);t&&!(t instanceof HTMLElement);)t=t.parentNode;if(t)return t}return null}getSelectedTextNodes(){const e=window.getSelection();if(!e||0===e.rangeCount)return[];const t=[];for(let n=0;no.intersectsNode(e)?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_REJECT});let r;for(;r=i.nextNode();)if(r.nodeType===Node.TEXT_NODE){const e=document.createRange();e.selectNodeContents(r),-1===o.compareBoundaryPoints(Range.END_TO_START,e)&&1===o.compareBoundaryPoints(Range.START_TO_END,e)&&t.push(r)}}return t}findClosestMatchingParent(e,t){for(e&&e.nodeType===Node.TEXT_NODE&&(e=e.parentElement);e&&e!==document.body;){if(e.nodeType===Node.ELEMENT_NODE){const n=e;if(n.tagName.toLowerCase()===t.nodeType.toLowerCase()&&(!t.classes||t.classes.every((e=>n.classList.contains(e)))))return n}e=e.parentElement}return null}extractSelectedText(e){const t=window.getSelection();if(!t||0===t.rangeCount)return"";const n=t.getRangeAt(0);if(e.nodeType!==Node.TEXT_NODE)return"";const o=e.textContent||"";let i=0,r=o.length;return n.intersectsNode(e)?(n.startContainer===e?i=n.startOffset:n.startContainer.contains(e)&&(i=0),n.endContainer===e?r=n.endOffset:n.endContainer.contains(e)&&(r=o.length),i{if("Enter"==e.key&&this.isVisible){e.preventDefault(),e.stopPropagation();const t=this.htmlElement.value;setTimeout((()=>{re.getInstance().execCommand(l.toggleLink,!1,t)}),10),this.htmlElement.value="",this.parentWrapper?.hide()}"Escape"==e.key&&this.isVisible&&(this.htmlElement.value="",this.parentWrapper?.hide())})),document.addEventListener("click",(e=>{!this.canHide||e.target.closest(`#${this.htmlElement.id}`)||e.target.closest("#textFloatingToolbar")||this.parentWrapper?.hide()})),this.htmlElement.addEventListener("keydown",(e=>{"/"==e.key&&e.stopPropagation()}))}}class le extends O{inputLinkBox;range;highlights=[];constructor(){const e=new se;super({inputLinkBox:e}),this.inputLinkBox=e,this.attachEvent(),e.setParentWrapper(this)}init(){const e=document.createElement("div");return e.id="linkBox",e.style.display="none",e.classList.add("dependent-box"),e.style.position="absolute",e.appendChild(this.props.inputLinkBox.htmlElement),e}attachEvent(){document.addEventListener("showInputLinkBoxRequested",(()=>{this.show(),this.highlightSelectedText(),this.inputLinkBox.focus()}))}hide(){super.hide(),this.removeHighlights(),setTimeout((()=>{const e=new CustomEvent("showInputLinkBoxFinished",{bubbles:!0,cancelable:!0});document.dispatchEvent(e)}),0)}highlightSelectedText(){const e=window.getSelection();if(!e?.rangeCount)return;const t=e.getRangeAt(0).getClientRects();for(let e=0;e{document.body.removeChild(e)})),this.highlights=[]}}class ae extends O{dropdowns;separators;currentSelectionRange;inputLinkBoxWrapper;htmlFocusedElementBeforeOpenQuickMenu;constructor(e){const t=new le;super({id:e,inputLinkBoxWrapper:t}),this.inputLinkBoxWrapper=t,this.dropdowns=[],this.separators=[],this.currentSelectionRange=null,this.htmlFocusedElementBeforeOpenQuickMenu=null}init(){const e=document.createElement("div");e.id=this.props.id,e.style.display="none",e.classList.add("floating-toolbar","select-wrapper","soft-box-shadow");const t=document.createElement("div");e.appendChild(t);const n=document.getElementById("johannesEditor");return n?.appendChild(this.props.inputLinkBoxWrapper.htmlElement),e}get display(){return"flex"}hide(){this.canHide&&(this.anyDropdownVisible()&&this.hideAllDropdownVisible(),this.currentSelectionRange=null,super.hide())}appendDropdown(e){this.dropdowns.push(e),this.htmlElement.appendChild(e.htmlElement)}appendButtonGroup(e){this.htmlElement.appendChild(e.htmlElement)}appendSeparator(e){this.separators.push(e),this.htmlElement.appendChild(e.htmlElement)}appendTextToolbar(e){this.htmlElement.appendChild(e.htmlElement)}anyDropdownVisible(){for(const e of this.dropdowns)if(e.dropdownList.isVisible)return!0;return!1}hideAllDropdownVisible(){for(const e of this.dropdowns)e.dropdownList.canHide&&e.dropdownList.hide();return!1}attachEvents(){this.htmlElement.addEventListener("click",(e=>{e.preventDefault()})),this.htmlElement.addEventListener("mousedown",(e=>{e.preventDefault()})),document.addEventListener("showInputLinkBoxRequested",(()=>{this.canHide=!1})),document.addEventListener("showInputLinkBoxFinished",(()=>{this.canHide=!0,this.restoreRangeSelection()})),document.addEventListener(r.blockDeleted,(()=>{this.hide()})),document.addEventListener(r.blockTypeChanged,(()=>{this.hide()}))}isSelectionEmpty(){const e=document.getSelection();return!e||0===e.rangeCount||""===e.toString().trim()}restoreRangeSelection(){document.getSelection()?.removeAllRanges(),document.getSelection()?.addRange(this.currentSelectionRange)}}!function(e){e.LowImportance="100",e.SlightlyImportant="200",e.Neutral="300",e.ModeratelyImportant="400",e.VeryImportant="500",e.ExtremelyImportant="600"}(d||(d={})),function(e){e.Mousedown="mousedown",e.Mousemove="mousemove",e.Mouseup="mouseup",e.Keyup="keyup",e.Keydown="keydown",e.Blur="blur",e.SelectStart="selectstart",e.SelectionChange="selectionchange",e.Click="click"}(u||(u={}));class ce extends ae{static id="textFloatingToolbar";static instance;textOperationsService;initialRect=null;constructor(e){if(ce.instance)throw new Error("Use TextContextFloatingToolbar.getInstance() to get instance.");super(ce.id),this.htmlElement.style.zIndex=d.VeryImportant,this.textOperationsService=e,this.attachEvents()}static getInstance(){const e=N.Instance.resolve("ITextOperationsService");return ce.instance||(ce.instance=new ce(e)),ce.instance}processSelectionChangeEffects(){const e=document.getSelection();if(!e||""===e?.toString().trim())return;F.emitResetActiveButtonsElementEvent("hiliteColor"),F.emitResetActiveButtonsElementEvent("foreColor");const t=this.textOperationsService.queryCommandStateA("bold"),n=this.textOperationsService.queryCommandStateA("italic"),o=this.textOperationsService.queryCommandStateA("underline"),i=this.textOperationsService.queryCommandStateA("strikeThrough"),r={};r[s.HiliteColorRed]=this.textOperationsService.queryHiliteColor(s.HiliteColorRed),r[s.HiliteColorGreen]=this.textOperationsService.queryHiliteColor(s.HiliteColorGreen),r[s.HiliteColorBlue]=this.textOperationsService.queryHiliteColor(s.HiliteColorBlue),r[s.HiliteColorYellow]=this.textOperationsService.queryHiliteColor(s.HiliteColorYellow),r[s.HiliteColorGrey]=this.textOperationsService.queryHiliteColor(s.HiliteColorGrey);const l={};l[s.ForeColorRed]=this.textOperationsService.queryForeColor(s.ForeColorRed),l[s.ForeColorGreen]=this.textOperationsService.queryForeColor(s.ForeColorGreen),l[s.ForeColorBlue]=this.textOperationsService.queryForeColor(s.ForeColorBlue),l[s.ForeColorYellow]=this.textOperationsService.queryForeColor(s.ForeColorYellow),l[s.ForeColorGrey]=this.textOperationsService.queryForeColor(s.ForeColorGrey),Object.entries(r).forEach((([e,t])=>{t&&F.emitShowHideActiveElementEvent("hiliteColor",e,"show")})),Object.entries(l).forEach((([e,t])=>{t&&F.emitShowHideActiveElementEvent("foreColor",e,"show")})),this.emitChangeComponentColorEvent(t,c.Bold),this.emitChangeComponentColorEvent(n,c.Italic),this.emitChangeComponentColorEvent(o,c.Underline),this.emitChangeComponentColorEvent(i,c.Strikethrough)}emitChangeComponentColorEvent(e,t){e?F.emitChangeComponentColorEvent(t,s.IconActiveBlue):F.emitChangeComponentColorEvent(t,s.IconDefaultBlack)}attachEvents(){document.addEventListener(u.SelectionChange,this.processSelectionChangeEffects.bind(this));let e=!1;this.htmlElement.addEventListener("mouseup",(e=>{e.preventDefault()})),document.addEventListener("keydown",(t=>{t.shiftKey&&(e=!0)})),document.addEventListener("keyup",(t=>{"Shift"===t.key&&(e=!1,this.showHide(e))})),document.addEventListener("mousedown",(()=>{e=!0})),document.addEventListener("mouseup",(t=>{e=!1,this.showHide(e)})),document.addEventListener(u.SelectionChange,(()=>{this.showHide(e)})),document.addEventListener("keydown",(e=>{setTimeout((()=>{this.canHide&&"Escape"===e.key&&(this.anyDropdownVisible()?this.hideAllDropdownVisible():this.hide())}),10)})),super.attachEvents()}shouldUpdatePosition(){const e=window.getSelection();if(!e||0===e.rangeCount)return!1;const t=e.getRangeAt(0).getBoundingClientRect();return!this.initialRect||(Math.abs(t.left-this.initialRect.left)>10||Math.abs(t.top-this.initialRect.top)>10)}showHide(e){const t=this.hasSelection();t?t&&!e&&(this.isVisible?this.shouldUpdatePosition()&&this.updatePosition():this.show()):(this.hide(),this.initialRect=null)}hasSelection(){const e=window.getSelection();return!!(e&&e.rangeCount>0&&""!==e.toString().trim())}changeToolbarPositionToBeClosedToSelection(){const e=window.getSelection();if(!e||0===e.rangeCount)return void console.error("No selection found");this.currentSelectionRange=e.getRangeAt(0);const t=this.currentSelectionRange.getBoundingClientRect();if(!this.initialRect){this.initialRect=t,this.htmlElement.style.display="flex";const e=this.htmlElement.offsetWidth;let n=t.left+window.scrollX-50;n+e>window.innerWidth&&(n=window.innerWidth-e-20);const o=this.htmlElement.offsetHeight;let i=t.top+window.scrollY-o-10;i<0&&(i=t.bottom+window.scrollY+10),this.htmlElement.style.left=`${n}px`,this.htmlElement.style.top=`${i}px`}}show(){const e=window.getSelection();e&&0!==e.rangeCount?M.findClosestAncestorOfActiveElementByClass("title")||(this.changeToolbarPositionToBeClosedToSelection(),this.hideTurnIntoDropdownIfInCell(),super.show()):console.error("No selection found")}hideTurnIntoDropdownIfInCell(){const e=M.isSelectionInTableCell();this.dropdowns.forEach((t=>{"turnIntoMenu"==t.id&&(t.htmlElement.style.display=e?"none":this.display)})),this.separators.forEach((t=>{"turnIntoSeparator"==t.id&&(t.htmlElement.style.display=e?"none":this.display)}))}updatePosition(){const e=window.getSelection();if(e&&e.rangeCount>0){const t=e.getRangeAt(0).getBoundingClientRect();this.setPosition(t)}}setPosition(e){const t=this.htmlElement.offsetWidth;let n=e.left+window.scrollX-50;n+t>window.innerWidth&&(n=window.innerWidth-t-20);const o=this.htmlElement.offsetHeight;let i=e.top+window.scrollY-o-10;i<0&&(i=e.bottom+window.scrollY+10),this.htmlElement.style.left=`${n}px`,this.htmlElement.style.top=`${i}px`}hide(){this.canHide&&(this.currentSelectionRange=null,super.hide())}}!function(e){e.BackgroundOptionRed="BackgroundOptionRed",e.BackgroundOptionGreen="BackgroundOptionRed",e.BackgroundOptionBlue="BackgroundOptionRed",e.BackgroundOptionYellow="BackgroundOptionRed",e.BackgroundOptionGrey="BackgroundOptionRed",e.BackgroundOptionNone="BackgroundOptionRed"}(m||(m={})),function(e){e.ColorTextOptionSelect="colorTextOptionSelect"}(h||(h={})),function(e){e.ColorTextOptionsMenu="colorTextOptionsMenu"}(A||(A={}));class de{static build(){const e=ce.getInstance();return e.appendDropdown(de.turnIntoDropdown()),e.appendSeparator(de.separator("turnIntoSeparator")),e.appendButtonGroup(de.buttonGroup()),e.appendDropdown(de.colorDropdown()),e.appendSeparator(de.separator("textOperationsSeparator")),e.appendDropdown(de.moreOptionsDropdown()),e}static turnIntoDropdown(){const e=new $("turnIntoSelect"),t=new oe("turnIntoButton","Text",e),n=new G("turnIntoMenu",t,e);return e.append(new ie(e,"Turn into")),e.append(new Q("turnIntoOptionText",e,V.BLOCK_OPERATIONS.TRANSFORM_BLOCK,L.ELEMENT_TYPES.PARAGRAPH,ue.paragraph.htmlElement,"Text","Ctrl+Shift+Enter")),e.append(new Q("turnIntoOptionTodoList",e,V.BLOCK_OPERATIONS.TRANSFORM_BLOCK,L.ELEMENT_TYPES.CHECK_LIST,ue.todo_list.htmlElement,"Todo list","Ctrl+1")),e.append(new Q("turnIntoOptionBulletedList",e,V.BLOCK_OPERATIONS.TRANSFORM_BLOCK,L.ELEMENT_TYPES.BULLETED_LIST,ue.b_list.htmlElement,"Bulleted list","Ctrl+.")),e.append(new Q("turnIntoOptionNumberedList",e,V.BLOCK_OPERATIONS.TRANSFORM_BLOCK,L.ELEMENT_TYPES.NUMBERED_LIST,ue.n_list.htmlElement,"Numbered list","Ctrl+/")),e.append(new Q("turnIntoOptionBlockCode",e,V.BLOCK_OPERATIONS.TRANSFORM_BLOCK,L.ELEMENT_TYPES.CODE,ue.code.htmlElement,"Block code")),e.append(new Q("turnIntoOptionQuote",e,V.BLOCK_OPERATIONS.TRANSFORM_BLOCK,L.ELEMENT_TYPES.QUOTE,ue.quote.htmlElement,"Quote")),e.append(new Q("turnIntoOptionHeading1",e,V.BLOCK_OPERATIONS.TRANSFORM_BLOCK,L.ELEMENT_TYPES.HEADER_1,ue.head1.htmlElement,"Heading 1","Ctrl+Alt+1")),e.append(new Q("turnIntoOptionHeading2",e,V.BLOCK_OPERATIONS.TRANSFORM_BLOCK,L.ELEMENT_TYPES.HEADER_2,ue.head2.htmlElement,"Heading 2","Ctrl+Alt+2")),e.append(new Q("turnIntoOptionHeading3",e,V.BLOCK_OPERATIONS.TRANSFORM_BLOCK,L.ELEMENT_TYPES.HEADER_3,ue.head3.htmlElement,"Heading 3","Ctrl+Alt+3")),e.append(new Q("turnIntoOptionHeading4",e,V.BLOCK_OPERATIONS.TRANSFORM_BLOCK,L.ELEMENT_TYPES.HEADER_4,ue.head4.htmlElement,"Heading 4","Ctrl+Alt+4")),e.append(new Q("turnIntoOptionHeading5",e,V.BLOCK_OPERATIONS.TRANSFORM_BLOCK,L.ELEMENT_TYPES.HEADER_5,ue.head5.htmlElement,"Heading 5","Ctrl+Alt+5")),e.append(new Q("turnIntoOptionHeading6",e,V.BLOCK_OPERATIONS.TRANSFORM_BLOCK,L.ELEMENT_TYPES.HEADER_6,ue.head6.htmlElement,"Heading 6","Ctrl+Alt+6")),n}static separator(e){return new J(e)}static buttonGroup(){const e=new ee;return te.create(c.Link,l.toggleLink,"Link",K.create(i.Link,Y.large)).appendTo(e),te.create(c.Bold,l.toggleBold,"Bold",K.create(i.Bold,Y.large)).appendTo(e),te.create(c.Italic,l.toggleItalic,"Italic",K.create(i.Italic,Y.large)).appendTo(e),te.create(c.Underline,l.toggleUnderline,"Underline",K.create(i.Underline,Y.large)).appendTo(e),te.create(c.InlineCode,l.toggleInlineCode,"Code",K.create(i.InlineCode,Y.large)).appendTo(e),te.create(c.Strikethrough,l.toggleStrikeThrough,"Strike-through",K.create(i.StrikeThrough,Y.large)).appendTo(e),e}static colorDropdown(){const e=new $(h.ColorTextOptionSelect),t=new oe("colorTextButton",new ne("#FAF4D1").htmlElement,e),n=new G(A.ColorTextOptionsMenu,t,e);e.append(new ie(e,"Background"));const o=new Q(m.BackgroundOptionRed,e,l.toggleHiliteColor,s.HiliteColorRed,new ne(s.HiliteColorRed).htmlElement,"Red");o.addClass("hiliteColor");const i=new Q(m.BackgroundOptionGreen,e,l.toggleHiliteColor,s.HiliteColorGreen,new ne(s.HiliteColorGreen).htmlElement,"Green");i.addClass("hiliteColor");const r=new Q(m.BackgroundOptionBlue,e,l.toggleHiliteColor,s.HiliteColorBlue,new ne(s.HiliteColorBlue).htmlElement,"Blue");r.addClass("hiliteColor");const a=new Q(m.BackgroundOptionYellow,e,l.toggleHiliteColor,s.HiliteColorYellow,new ne(s.HiliteColorYellow).htmlElement,"Yellow");a.addClass("hiliteColor");const c=new Q(m.BackgroundOptionGrey,e,l.toggleHiliteColor,s.HiliteColorGrey,new ne(s.HiliteColorGrey).htmlElement,"Grey");c.addClass("hiliteColor");const d=new Q(m.BackgroundOptionNone,e,l.toggleHiliteColor,s.HiliteColorNone,new ne(s.HiliteColorNone).htmlElement,"None");d.addClass("hiliteColor"),e.append(o),e.append(i),e.append(r),e.append(a),e.append(c),e.append(d),e.append(new ie(e,"Color"));const u=new Q("colorOptionRed",e,l.toggleForeColor,s.ForeColorRed,new K("icon-material-format",Y.large).htmlElement,"Red");u.addClass("foreColor");const p=new Q("colorOptionGreen",e,l.toggleForeColor,s.ForeColorGreen,new K("icon-material-format",Y.large).htmlElement,"Green");p.addClass("foreColor");const C=new Q("colorOptionBlue",e,l.toggleForeColor,s.ForeColorBlue,new K("icon-material-format",Y.large).htmlElement,"Blue");C.addClass("foreColor");const g=new Q("colorOptionYellow",e,l.toggleForeColor,s.ForeColorYellow,new K("icon-material-format",Y.large).htmlElement,"Yellow");g.addClass("foreColor");const E=new Q("colorOptionGrey",e,l.toggleForeColor,s.ForeColorGrey,new K("icon-material-format",Y.large).htmlElement,"Grey");E.addClass("foreColor");const b=new Q("colorOptionNone",e,l.toggleForeColor,s.ForeColorInitial,new K("icon-material-format",Y.large).htmlElement,"None");return b.addClass("foreColor"),e.append(u),e.append(p),e.append(C),e.append(g),e.append(E),e.append(b),n}static moreOptionsDropdown(){const e=new K("icon-material-more",Y.large),t=new $("moreTextOptionSelect"),n=new oe("moreTextOptionButton",e.htmlElement,t,!1),o=new G("moreTextOptionsMenu",n,t);t.append(new ie(t,"More options")),t.append(new Q("copyOption",t,V.BLOCK_OPERATIONS.COPY,null,ue.copy.htmlElement,"Copy","Ctrl+C")),t.append(new Q("cutOption",t,V.BLOCK_OPERATIONS.CUT,null,ue.cut.htmlElement,"Cut","Ctrl+X")),t.append(new Q("pasteOption",t,V.BLOCK_OPERATIONS.PASTE,null,ue.paste.htmlElement,"Replace","Ctrl+V")),t.append(new Q("duplicateOption",t,V.BLOCK_OPERATIONS.DUPLICATE,null,ue.duplicate.htmlElement,"Clone Block","Ctrl+D")),t.append(new Q("resetOption",t,V.BLOCK_OPERATIONS.REMOVE_FORMAT,null,ue.eraser.htmlElement,"Reset Style","Ctrl+\\"));const i=new Q("deleteOption",t,V.BLOCK_OPERATIONS.DELETE,null,ue.delete.htmlElement,"Delete Block","Shift+Del");return i.addCssClass("danger-option"),t.append(i),o}}const ue={paragraph:new K("icon-material-format","1.25rem"),todo_list:new K("icon-material-check-list-2",Y.large),b_list:new K("icon-wordpress-bulleted-list",Y.large),n_list:new K("icon-wordpress-numbered-list",Y.large),code:new K("icon-wordpress-code-mark",Y.large),quote:new K("icon-wordpress-quote",Y.large),head1:new K("icon-julia-head-1",Y.large),head2:new K("icon-julia-head-2",Y.large),head3:new K("icon-julia-head-3",Y.large),head4:new K("icon-julia-head-4",Y.large),head5:new K("icon-julia-head-5",Y.large),head6:new K("icon-julia-head-6",Y.large),duplicate:new K("icon-material-duplicate",Y.large),delete:new K("icon-material-trash",Y.large),eraser:new K("icon-material-clear",Y.large),copy:new K("icon-material-copy",Y.large),cut:new K("icon-material-cut",Y.large),paste:new K("icon-material-paste",Y.large)};class me extends O{constructor(){super({})}init(){const e=document.createElement("span");return e.innerText="No results",e.classList.add("empty-block-options"),e.style.padding="10px",e.style.color="rgba(55, 53, 47, 0.65)",e.style.display="none",e}}var he,Ae,pe,Ce,ge,Ee,be;!function(e){e.TD="td",e.TABLE="table"}(he||(he={}));class Be extends O{static id="quickMenu";blockOperationsService;currentFocusedMenuItem;menuSections;quickMenuEmpty;filterInput;static instance;focusStack;constructor(e,t){super({}),this.currentFocusedMenuItem=null,this.menuSections=new X,this.quickMenuEmpty=new me,this.blockOperationsService=e,this.focusStack=t,this.attachEvents(),this.filterInput=""}init(){const e=document.createElement("div");e.id=Be.id,e.classList.add("block-options-wrapper","soft-box-shadow"),e.style.display="none";const t=document.createElement("div");return t.classList.add("block-options"),t.style.position="relative",e.appendChild(t),e}append(e){this.menuSections.append(e),this.htmlElement.querySelector(".block-options").appendChild(e.htmlElement)}static getInstance(){const e=N.Instance.resolve("IBlockOperationsService"),t=N.Instance.resolve("IFocusStack");return Be.instance||(Be.instance=new Be(e,t)),Be.instance}switchVisualFocus(e){this.currentFocusedMenuItem!=e&&(this.currentFocusedMenuItem&&this.currentFocusedMenuItem.value.removeFocus(),this.currentFocusedMenuItem=e,this.currentFocusedMenuItem.value.focus(),this.focusStack.peek()?.focus())}focusOnTheFirstVisibleItem(){const e=this.menuSections.getFirst();let t=e;for(;t;){const n=t.value.menuItems.findFirst((e=>e.isVisible));if(n)return void this.switchVisualFocus(n);if(t=t.nextNode,t==e)return}}focusPreviousVisibleItem(){let e;if(this.currentFocusedMenuItem){if(e=this.currentFocusedMenuItem.getPreviousSatisfying((e=>e.isVisible)),!e){let t=this.menuSections.find(this.currentFocusedMenuItem.value.immediateParent).getPreviousSatisfying((e=>e.isVisible));if(!t)return;e=t.value.menuItems.findLast((e=>e.isVisible))}}else{let t=this.menuSections.findLast((e=>e.isVisible));if(!t)return;e=t.value.menuItems.findLast((e=>e.isVisible))}this.switchVisualFocus(e)}focusNextVisibleItem(){let e;if(this.currentFocusedMenuItem){if(e=this.currentFocusedMenuItem.getNextSatisfying((e=>e.isVisible)),!e){let t=this.menuSections.find(this.currentFocusedMenuItem.value.immediateParent).getNextSatisfying((e=>e.isVisible));if(!t)return;e=t.value.menuItems.findFirst((e=>e.isVisible))}}else{let t=this.menuSections.findFirst((e=>e.isVisible));if(!t)return;e=t.value.menuItems.findFirst((e=>e.isVisible))}this.switchVisualFocus(e)}filterItems(){this.menuSections.forEach((e=>{e.filterSection(this.filterInput)})),this.menuSections.any((e=>e.isVisible))?this.quickMenuEmpty.hide():this.quickMenuEmpty.show(),this.focusOnTheFirstVisibleItem()}show(){setTimeout((()=>{const e=document.activeElement;if(!e)return void console.error("Failed to display the quickMenu: no active element found. Please ensure an element is focused before attempting to display the quickMenu.");this.focusStack.push(e);const t=window.getSelection();if(!t||0===t.rangeCount)throw new Error("Nenhuma seleção encontrada");const n=t.getRangeAt(0).getBoundingClientRect();this.htmlElement.style.display="flex";const o=this.htmlElement.offsetWidth;let i=n.left+window.scrollX;i+o>window.innerWidth&&(i=window.innerWidth-o-20);const r=this.htmlElement.offsetHeight;let s=n.top+window.scrollY-r-10;s<0&&(s=n.bottom+window.scrollY+10),this.htmlElement.style.left=`${i}px`,this.htmlElement.style.top=`${s}px`,super.show(),this.focusOnTheFirstVisibleItem(),this.focusStack.peek()?.focus()}),10)}restore(){this.filterInput="",this.menuSections.forEach((e=>{e.restore()}))}hide(){this.restore(),this.focusStack.peek()?.focus(),super.hide()}attachEvents(){document.addEventListener(r.emittedCommand,(e=>{const{command:t}=e.detail;t==l.transformBlock&&this.hide()})),document.addEventListener("keydown",(e=>{const t=M.findClosestAncestorOfActiveElementByClass("block");if(this.isVisible||"/"!==e.key||e.ctrlKey||e.shiftKey||e.altKey||!t)(!this.isVisible||"ArrowLeft"!==e.key||e.ctrlKey||e.shiftKey||e.altKey)&&(!this.isVisible||"ArrowRight"!==e.key||e.ctrlKey||e.shiftKey||e.altKey)?!this.isVisible||"ArrowDown"!==e.key||e.ctrlKey||e.shiftKey||e.altKey?!this.isVisible||"ArrowUp"!==e.key||e.ctrlKey||e.shiftKey||e.altKey?!this.isVisible||!/^[a-z0-9 ]$/i.test(e.key)||e.ctrlKey||e.shiftKey||e.altKey?this.isVisible&&"Backspace"===e.key?""==this.filterInput?this.hide():(this.removeLastFilterInputCharacter(),this.filterItems()):!this.isVisible||"Escape"!==e.key||e.ctrlKey||e.shiftKey||e.altKey||this.hide():(this.concatFilterInput(e.key),this.filterItems()):(e.preventDefault(),this.focusPreviousVisibleItem()):(e.preventDefault(),this.focusNextVisibleItem()):(e.preventDefault(),e.stopPropagation());else{if(e.target.closest(he.TD))return;this.show()}})),document.addEventListener("click",(e=>{this.isVisible&&!e.target.closest(`#${this.htmlElement.id}`)&&this.hide()})),document.addEventListener("keydown",(e=>{if(this.isVisible&&"Enter"===e.key&&!e.ctrlKey&&!e.shiftKey&&!e.altKey){e.preventDefault(),e.stopPropagation();const t=this.currentFocusedMenuItem?.value.blockType;t&&this.transformHtmlFocusedElementBeforeOpenQuickMenu(t)}})),document.addEventListener(r.blockTypeChanged,(e=>{this.hide()}))}emitCommandEvent(e){const t=new CustomEvent(r.emittedCommand,{detail:{command:l.transformBlock,value:e}});document.dispatchEvent(t)}transformHtmlFocusedElementBeforeOpenQuickMenu(e){e&&this.emitCommandEvent(e)}concatFilterInput(e){this.filterInput+=e.toLowerCase()}removeLastFilterInputCharacter(){this.filterInput.length>0&&(this.filterInput=this.filterInput.slice(0,-1))}}class fe extends Z{constructor(){super()}append(e){const t=new W(e,this);this.head&&this.tail?(this.tail.setNext(t),t.setPrevious(this.tail),this.tail=t):(this.head=t,this.tail=t),this.length++}}class we extends O{immediateParent;menuItems=new fe;constructor(e){super({title:e.title,classList:e.classList}),this.immediateParent=e.quickMenuInstance}init(){const e=document.createElement("section");e.classList.add(this.props.classList);const t=document.createElement("h2");return t.textContent=this.props.title,e.appendChild(t),e}appendQuickMenuItems(e){e.forEach((e=>{this.appendQuickMenuItem(e)}))}appendQuickMenuItem(e){this.menuItems.append(e),this.htmlElement.appendChild(e.htmlElement)}filterSection(e){this.restore(),""!==e&&(this.menuItems.forEach((t=>{t.filterValue.toLocaleLowerCase().includes(e)||t.hide()})),this.menuItems.any((t=>t.filterValue.toLocaleLowerCase().includes(e)))||this.hide())}restore(){this.show(),this.menuItems.forEach((e=>{e.show()}))}}class ve extends O{_blockType;_filterValue;_immediateParent;constructor(e,t,n,o,i,r){super({title:t,description:n,iconId:o}),this._blockType=i,this._filterValue=r,this._immediateParent=e,this.attachEvents()}init(){const e=document.createElement("div");e.classList.add("option","option-hover","block-operation"),e.setAttribute("data-block-operation","apply-selected-block-type"),e.setAttribute("tabindex","0"),e.setAttribute("role","option");const t=document.createElement("div");t.classList.add("option-image");const n=new K(this.props.iconId,"100%");t.appendChild(n.htmlElement),e.appendChild(t);const o=document.createElement("div");o.classList.add("option-text");const i=document.createElement("p");i.classList.add("block-title"),i.innerText=this.props.title,o.appendChild(i);const r=document.createElement("p");return r.classList.add("block-description"),r.innerText=this.props.description,o.appendChild(r),e.appendChild(o),e}get display(){return"flex"}get filterValue(){return this._filterValue}get immediateParent(){return this._immediateParent}get blockType(){return this._blockType}focus(){this.htmlElement.classList.add("option-focused"),this.htmlElement.focus()}removeFocus(){this.htmlElement.classList.remove("option-focused")}emitCommandEvent(){const e=new CustomEvent(r.emittedCommand,{detail:{command:l.transformBlock,value:this.blockType}});document.dispatchEvent(e)}attachEvents(){this.htmlElement.addEventListener("mousemove",(()=>{const e=this._immediateParent.menuItems.find(this);this._immediateParent.immediateParent.switchVisualFocus(e)})),this.htmlElement.addEventListener("click",(e=>{e.preventDefault(),e.stopPropagation(),this.emitCommandEvent()}))}}class Ie{static build(){const e=Be.getInstance(),t=new we({quickMenuInstance:e,title:"Basic blocks",classList:"basic-section"});t.appendQuickMenuItems([new ve(t,"Text","Start writing in plain text.","icon-material-format",L.ELEMENT_TYPES.PARAGRAPH,"paragraph text p"),new ve(t,"Bulleted list","Organize items with bullet points.","icon-wordpress-bulleted-list","bulleted-list","bulleted list unordered list ul"),new ve(t,"Numbered list","List items in a numbered format.","icon-wordpress-numbered-list","numbered-list","numbered list number list sequential list ol enumerated list ordered list"),new ve(t,"Table","Organize data in rows and columns.","icon-material-table",L.ELEMENT_TYPES.TABLE,"table tr th"),new ve(t,"Callout","Emphasize key points with a callout box.",i.Callout,L.ELEMENT_TYPES.CALLOUT,"callout note spotlight"),new ve(t,"Code","Include code snippet.","icon-wordpress-code-mark","code","code script source markup"),new ve(t,"Quote","Highlight text as a quote.","icon-wordpress-quote","quote","quote blockquote citation quotation"),new ve(t,"Heading 2","Medium header for sections.","icon-julia-head-2",L.ELEMENT_TYPES.HEADER_2,"header 2 heading 2 h2"),new ve(t,"Heading 3","Small header for subsections.","icon-julia-head-2",L.ELEMENT_TYPES.HEADER_3,"header 3 heading 3 h3"),new ve(t,"Separator","Visually divide blocks.","icon-wordpress-separator","separator","separator divider rule line")]),e.append(t);const n=new we({quickMenuInstance:e,title:"Media",classList:"media-section"});n.appendQuickMenuItems([new ve(n,"Image","Upload image.",i.Image,L.ELEMENT_TYPES.IMAGE,"image figure photo illustration picture media upload"),new ve(n,"Video","Embed video.",i.Video,"video","video embed youtube vimeo clip film movie tape")]),e.append(n);const o=new we({quickMenuInstance:e,title:"Heading",classList:"heading-section"});o.appendQuickMenuItems([new ve(o,"Heading 1","Large header for main topics.","icon-julia-head-1",L.ELEMENT_TYPES.HEADER_1,"header 1 heading 1 h1"),new ve(o,"Heading 2","Medium header for sections.","icon-julia-head-2",L.ELEMENT_TYPES.HEADER_2,"header 2 heading 2 h2"),new ve(o,"Heading 3","Small header for subsections.","icon-julia-head-3",L.ELEMENT_TYPES.HEADER_3,"header 3 heading 3 h3"),new ve(o,"Heading 4","Detailed header for subtopics.","icon-julia-head-4",L.ELEMENT_TYPES.HEADER_4,"header 4 heading 4 h4"),new ve(o,"Heading 5","Minor header for specifics.","icon-julia-head-5",L.ELEMENT_TYPES.HEADER_5,"header 5 heading 5 h5"),new ve(o,"Heading 6","Smallest header for fine details.","icon-julia-head-6",L.ELEMENT_TYPES.HEADER_6,"header 6 heading 6 h6")]),e.append(o);const r=new we({quickMenuInstance:e,title:"List",classList:"list-section"});r.appendQuickMenuItems([new ve(r,"Todo list","Track tasks with checkboxes.","icon-material-check-list-2","todo-list","todo list task list checklist"),new ve(r,"Bulleted list","Organize items with bullet points.","icon-wordpress-bulleted-list","bulleted-list","bulleted list unordered list ul"),new ve(r,"Numbered list","List items in a numbered format.","icon-wordpress-numbered-list","numbered-list","numbered list number list sequential list ol enumerated list ordered list")]),e.append(r);const s=new we({quickMenuInstance:e,title:"Embed",classList:"embed-section"});return s.appendQuickMenuItems([new ve(s,"GitHub Gist","Track tasks with checkboxes.","icon-material-check-list-2","todo-list","todo list task list checklist"),new ve(s,"GitLab Snippet ","List items in a numbered format.","icon-wordpress-numbered-list","numbered-list","numbered list number list sequential list ol enumerated list ordered list"),new ve(s,"CodePen","Organize items with bullet points.","icon-wordpress-bulleted-list","bulleted-list","bulleted list unordered list ul"),new ve(s,"Google Maps","List items in a numbered format.","icon-wordpress-numbered-list","numbered-list","numbered list number list sequential list ol enumerated list ordered list")]),e.append(s),e}}class ye extends O{constructor(e){super({value:e}),this.attachEvents()}init(){const e=document.createElement("div");e.classList.add("title");const t=document.createElement("h1");return t.setAttribute("contentEditable","true"),t.setAttribute("data-placeholder","Untitled"),this.props.value&&(t.textContent=this.props.value),e.appendChild(t),e}attachEvents(){this.htmlElement.addEventListener("keydown",(e=>{"Enter"==e.key&&(e.preventDefault(),document.dispatchEvent(new CustomEvent(r.focusOnFirstRequested,{})))}))}static create(e){return new ye(e)}}class ke{static build(){return ye.create(window.editorConfig?.title)}}class xe extends O{constructor(){super({}),this.attachEvent()}init(){const e=document.createElement("div");return e.classList.add("content"),window.editorConfig,e.append(L.blockParagraph()),e}clearSelectionOnDrag(){document.addEventListener("mousedown",(e=>{const t=e.target;let n;t&&(n=t.nodeType==Node.TEXT_NODE?t.parentElement:t,n&&n.closest(".drag-handler")&&window.getSelection()?.removeAllRanges())}))}attachEvent(){this.clearSelectionOnDrag(),this.reRenderPlaceholder(),document.addEventListener("copiedText",(()=>{const e=document.querySelector("#copyOption .text-option span");e&&(e.textContent="Copied!",setTimeout((()=>{e.textContent="Copy"}),1500))})),document.addEventListener("DOMContentLoaded",(function(){const e=document.querySelector(".johannes-editor");if(e){let t=e.querySelectorAll(".block");if(1==t.length){const e=t[0].querySelector(".johannes-content-element");""==e.innerText&&e.focus()}}})),this.htmlElement.addEventListener("keydown",(async e=>{const t=N.Instance.resolve("IQuickMenu"),n=N.Instance.resolve("ITableContextFloatingToolbar");if(!(e.ctrlKey||e.shiftKey||e.altKey))if("Enter"!==e.key||t.isVisible||n.isVisible)if("Backspace"===e.key){const t=e.target;t.classList.contains("johannes-content-element")&&""===t.textContent?.trim()?(e.stopImmediatePropagation(),document.dispatchEvent(new CustomEvent(r.emittedCommand,{detail:{command:l.focusOnPreviousBlock}})),document.dispatchEvent(new CustomEvent(r.emittedCommand,{detail:{command:l.focusOnPreviousBlock}}))):t.classList.contains("johannes-content-element")&&t.textContent?.trim()}else if("Delete"===e.key){const t=e.target;t.classList.contains("johannes-content-element")&&""===t.textContent?.trim()||t.classList.contains("johannes-content-element")&&t.textContent?.trim()}else"ArrowRight"===e.key&&xe.isCursorAtEnd(e.target)||"ArrowLeft"===e.key&&xe.isCursorAtStart(e.target)||"ArrowDown"===e.key&&xe.isCursorOnLastLine()||"ArrowUp"===e.key&&xe.isCursorOnFirstLine();else e.preventDefault(),e.stopImmediatePropagation(),document.dispatchEvent(new CustomEvent(r.emittedCommand,{detail:{command:l.insertNew}}))}))}reRenderPlaceholder(){document.addEventListener("input",(function(e){if(e.target instanceof HTMLElement){const t=e.target;if(t.isContentEditable&&t.hasAttribute("data-placeholder")){const e=t.getAttribute("data-placeholder");""===t.textContent?.trim()&&(t.setAttribute("data-placeholder",e||""),t.textContent="")}}}))}static isCursorAtEnd(e){const t=e.closest(".focusable");if(!t)return!1;const n=window.getSelection();if(!n.rangeCount)return!1;const o=n.getRangeAt(0);let i=o.endContainer;return i.nodeType===Node.TEXT_NODE&&(i=i.parentNode),o.collapsed&&i===t&&o.endOffset===(o.endContainer.textContent||"").length}static isCursorAtStart(e){const t=e.closest(".focusable");if(!t)return!1;const n=window.getSelection();if(!n.rangeCount)return!1;const o=n.getRangeAt(0);let i=o.startContainer;return i.nodeType===Node.TEXT_NODE&&(i=i.parentNode),o.collapsed&&i===t&&0===o.startOffset}static isAtFirstVisibleLine(e){const t=window.getSelection();if(!t.rangeCount)return!1;const n=t.getRangeAt(0).cloneRange();return n.collapse(!0),n.setStart(e,0),n.getBoundingClientRect().top===e.getBoundingClientRect().top}static isAtLastVisibleLine(e){const t=window.getSelection();if(!t.rangeCount)return!1;const n=t.getRangeAt(0).cloneRange();return n.collapse(!1),n.setEnd(e,e.childNodes.length),n.getBoundingClientRect().bottom===e.getBoundingClientRect().bottom}static didCursorMove(e){const t=window.getSelection();if(!t.rangeCount)return Promise.resolve(!1);const n=t.getRangeAt(0).cloneRange().getBoundingClientRect();return new Promise((o=>{setTimeout((()=>{const i=t.getRangeAt(0).cloneRange().getBoundingClientRect(),r=!(n.top===i.top&&n.left===i.left);r||e.preventDefault(),o(r)}),0)}))}static isCursorOnFirstLine(){const e=window.getSelection();if(!e||!e.rangeCount)return!1;const t=e.getRangeAt(0);return 0===t.startOffset&&t.startContainer===t.commonAncestorContainer}static isCursorOnLastLine(){const e=window.getSelection();if(!e||!e.rangeCount)return!1;const t=e.getRangeAt(0);return t.endOffset===t.endContainer.textContent?.length&&t.endContainer===t.commonAncestorContainer}static getInstance(){return N.Instance.resolve("IShortcutListeners"),N.Instance.resolve("ITableListeners"),new xe}}class Te{static build(){return xe.getInstance()}}!function(e){e.ArrowUp="ArrowUp",e.ArrowDown="ArrowDown",e.ArrowLeft="ArrowLeft",e.ArrowRight="ArrowRight"}(Ae||(Ae={})),function(e){e.Column="Column",e.Row="Row",e.Cell="Cell",e.SelectedCells="SelectedCells"}(pe||(pe={}));class Se{static addRow(e,t=null){const n=null!==t&&t>=0&&t<=e.rows.length?t:e.rows.length,o=e.insertRow(n),i=Array.from(e.rows).reduce(((e,t)=>Math.max(e,t.cells.length)),0);let r=[];for(let e=0;e{r.forEach((e=>e.classList.remove("temporary-shadow")))}),700)}static addColumn(e,t=null){const n=null!==t?t:void 0;let o=[];for(let t=0;t{o.forEach((e=>e.classList.remove("temporary-shadow")))}),700)}static isLastColumn(e,t){if(!e.contains(t))return!1;const n=t.parentElement;return t===n.cells[n.cells.length-1]}static isLastRow(e,t){return!!e.contains(t)&&t.parentElement===e.rows[e.rows.length-1]}static removeColumnByCell(e){if("td"!==e.tagName.toLowerCase()&&"th"!==e.tagName.toLowerCase())throw new Error("The provided element is not a table cell.");const t=e.parentElement.parentElement,n=e.cellIndex;for(let e=0;e=0;t--){const n=e.rows[t];for(let e=n.cells.length-1;e>=0;e--){const t=n.cells[e];if(t.isContentEditable)return t}}return null}static getFirstTableCell(e){for(let t=0;t{e.style.border=`1px double ${n}`}))}}!function(e){e.Shift="Shift",e.Enter="Enter",e.Escape="Escape"}(Ce||(Ce={})),function(e){e.Text="Text",e.Cell="Cell",e.Block="Block"}(ge||(ge={}));class Le extends ae{static id="tableFloatingToolbar";static instance;focusStack;selectedCells=[];actualFocusedCell=null;tableOperationsService;controller;selectionMode=ge.Text;selectionFlag=!1;selectedText="";constructor(e,t){if(Le.instance)throw new Error("Use TableContextFloatingToolbar.getInstance() to get instance.");super(Le.id),this.clearAndHide=this.clearAndHide.bind(this),this.htmlElement.style.zIndex=d.ModeratelyImportant,this.controller=new AbortController,this.focusStack=e,this.tableOperationsService=t,this.attachEvents()}attachEvents(){document.addEventListener(u.Mousedown,this.handleMouseDown.bind(this)),document.addEventListener(u.Mousemove,this.handleMouseMove.bind(this)),document.addEventListener(u.Mouseup,this.handleMouseUp.bind(this)),document.addEventListener(u.Keydown,this.handleStartSelectionInCellKeyDown.bind(this)),document.addEventListener(u.Keydown,this.handleCellSelectionContinuationOnKeyDown.bind(this)),document.addEventListener(u.Keydown,this.handleKeyDown.bind(this)),document.addEventListener(u.Keyup,this.handleKeyUp.bind(this)),this.attachUIEvent(),super.attachEvents()}handleMouseDown(e){const t=e.target.closest(he.TD);t&&(console.log("MouseDown event on: ",e.target),e.stopImmediatePropagation(),this.controller.abort(),t!=this.actualFocusedCell&&this.hide(),this.clearAll(),this.addSelectedCell(t),this.selectionFlag=!0,this.selectionMode=ge.Text)}handleMouseMove(e){if(this.selectionFlag){const t=e.target.closest(he.TD);t&&(this.updateSelectionModeByMouseEvent(e),this.selectionMode==ge.Cell&&(e.stopImmediatePropagation(),e.preventDefault(),this.canHide&&this.hide(),this.addSelectedCell(t),document.getSelection()?.removeAllRanges()))}}handleMouseUp(e){this.selectedCells.length>0&&this.selectionFlag&&(this.resetSelectionState(),this.show())}handleKeyDown(e){e.target.closest(he.TD)&&(e.key!=Ce.Enter||e.shiftKey||e.ctrlKey||e.metaKey||e.altKey?e.key==Ce.Escape&&this.canHide&&!ce.getInstance().isVisible&&setTimeout((()=>{this.canHide&&(e.stopImmediatePropagation(),this.clearAll(),this.hide())}),10):e.stopImmediatePropagation())}handleStartSelectionInCellKeyDown(e){const t=e.target.closest(he.TD);t&&(e.repeat||e.key!==Ce.Shift||(e.stopImmediatePropagation(),this.controller.abort(),this.selectionFlag=!0,this.selectionMode=ge.Text,this.addSelectedCell(t)))}handleCellSelectionContinuationOnKeyDown(e){if(this.selectionFlag){const t=e.target.closest(he.TD);if(t&&this.selectionMode==ge.Cell&&e.shiftKey&&e.key.startsWith("Arrow")&&!e.repeat){e.stopImmediatePropagation(),e.preventDefault();const n=t.closest(he.TABLE),o=Se.getNeighborCell(n,t,e.key);this.addSelectedCell(t),o&&this.addSelectedCell(o)}}}normalizeText(e){return e.replace(/\s+/g," ").trim()}updateTheSelectionModeByCurrentSelectionState(e){if(this.selectionFlag){const t=document.getSelection();if(t){const n=this.normalizeText(t.toString().trim()),o=e.target.closest(he.TD),i=this.normalizeText((o.textContent||"").trim()),{atStart:r,atEnd:s}=M.getSelectionTextInfo(o);""===i||n===this.selectedText.trim()&&(r||s)?(this.selectionMode=ge.Cell,this.selectedText="",this.canHide&&this.hide()):n&&(this.selectedText=n)}}}updateSelectionModeByMouseEvent(e){if(this.selectionFlag&&this.actualFocusedCell){const t=this.actualFocusedCell.getBoundingClientRect(),n=e.clientX,o=e.clientY;n>=t.left&&n<=t.right&&o>=t.top&&o<=t.bottom||(this.selectionMode=ge.Cell,this.canHide&&this.hide())}}handleKeyUp(e){e.target.closest(he.TD)&&(e.stopImmediatePropagation(),this.updateTheSelectionModeByCurrentSelectionState(e),e.key===Ce.Shift&&(this.resetSelectionState(),this.selectedCells.length>0&&this.show()))}addSelectedCell(e){if(0===this.selectedCells.length)return this.selectedCells.push(e),e.classList.add("selected"),this.actualFocusedCell=e,void e.focus();this.selectedCells[this.selectedCells.length-1].closest("table")===e.closest("table")&&(-1===this.selectedCells.indexOf(e)?(this.selectedCells.push(e),e.classList.add("selected"),this.actualFocusedCell=e,e.focus()):(this.actualFocusedCell=e,e.focus()))}attachUIEvent(){document.addEventListener(a.CloseElement,this.handleCloseElementEvent.bind(this))}handleCloseElementEvent(e){const t=e.detail;Le.id==t.targetId&&this.clearAndHide()}show(){this.actualFocusedCell?(this.resetAbortController(),this.focusStack.push(this.actualFocusedCell),this.changeToolbarPositionToBeClosedTo(this.actualFocusedCell),this.processSelectionChangeEffects(),super.show(),this.actualFocusedCell.addEventListener(u.Blur,this.clearAndHide,{signal:this.controller.signal})):console.error("No focused cell found")}processSelectionChangeEffects(){F.emitResetActiveButtonsElementEvent("backgroundColor");const e={};e[s.BackgroundColorRed]=this.tableOperationsService.queryAllStateCellBackgroundColor(this.selectedCells,s.BackgroundColorRed),e[s.BackgroundColorGreen]=this.tableOperationsService.queryAllStateCellBackgroundColor(this.selectedCells,s.BackgroundColorGreen),e[s.BackgroundColorBlue]=this.tableOperationsService.queryAllStateCellBackgroundColor(this.selectedCells,s.BackgroundColorBlue),e[s.BackgroundColorYellow]=this.tableOperationsService.queryAllStateCellBackgroundColor(this.selectedCells,s.BackgroundColorYellow),e[s.BackgroundColorGrey]=this.tableOperationsService.queryAllStateCellBackgroundColor(this.selectedCells,s.BackgroundColorGrey),Object.entries(e).forEach((([e,t])=>{t&&F.emitShowHideActiveElementEvent("backgroundColor",e,"show")}))}changeToolbarPositionToBeClosedTo(e){const t=e.getBoundingClientRect();this.htmlElement.style.display="flex";const n=this.htmlElement.offsetWidth;let o=t.left+window.scrollX+0;o+n>window.innerWidth&&(o=window.innerWidth-n-20);const i=this.htmlElement.offsetHeight;let r=t.top+window.scrollY-i-10;r<0&&(r=t.bottom+window.scrollY+10),this.htmlElement.style.left=`${o}px`,this.htmlElement.style.top=`${r}px`}resetSelectionState(){this.selectionMode=ge.Text,this.selectionFlag=!1,this.selectedText=""}clearAll(){this.actualFocusedCell=null,document.querySelectorAll("td").forEach((e=>e.classList.remove("selected"))),this.selectedCells=[]}hide(){this.canHide&&super.hide()}clearAndHide(){this.clearAll(),this.hide()}resetAbortController(){this.controller=new AbortController}static getInstance(){const e=N.Instance.resolve("IFocusStack"),t=N.Instance.resolve("ITableOperationsService");return new Le(e,t)}}class Oe{static build(){const e=N.Instance.resolve("ITableOperationsService"),t=Le.getInstance();return t.appendDropdown(Oe.tableOptions(e)),t.appendSeparator(Oe.separator("tableOperationsSeparator")),t.appendDropdown(Oe.tableColorDropdown()),t}static tableOptions(e){const t=new $("tableOptionsSelect"),n=new oe("tableOptions","Options",t),o=new G("tableOptionsMenu",n,t);t.append(new ie(t,"Insert Column")),t.append(new Q("turnIntoOptionText",t,l.insertTableColumnLeft,L.ELEMENT_TYPES.PARAGRAPH,K.create(i.ColumnLeft,Y.medium).htmlElement,"Left")),t.append(new Q("turnIntoOptionText",t,l.insertTableColumnRight,L.ELEMENT_TYPES.PARAGRAPH,K.create(i.ColumnRight,Y.medium).htmlElement,"Right")),t.append(new ie(t,"Insert Row")),t.append(new Q("turnIntoOptionTodoList",t,l.insertTableRowAbove,L.ELEMENT_TYPES.CHECK_LIST,K.create(i.RowAbove,Y.medium).htmlElement,"Above")),t.append(new Q("turnIntoOptionTodoList",t,l.insertTableRowBelow,L.ELEMENT_TYPES.CHECK_LIST,K.create(i.RowBelow,Y.medium).htmlElement,"Below")),t.append(new ie(t,"Remove"));const r=new Q("turnIntoOptionText",t,l.removeColumn,L.ELEMENT_TYPES.PARAGRAPH,K.create(i.deleteSweep,Y.medium).htmlElement,"Column");r.addCssClass("danger-option"),t.append(r);const s=new Q("turnIntoOptionTodoList",t,l.removeRow,L.ELEMENT_TYPES.CHECK_LIST,K.create(i.deleteSweep,Y.medium).htmlElement,"Row");return s.addCssClass("danger-option"),t.append(s),o}static tableColorDropdown(){const e=new $("colorTableOptionSelect"),t=new oe("colorTableButton",new ne("#FAF4D1").htmlElement,e),n=new G("tableColorOptionsMenu",t,e);e.append(new ie(e,"Background"));const o=new Q("backgroundOptionRed",e,l.toggleCellHiliteColor,s.HiliteColorRed,new ne(s.HiliteColorRed).htmlElement,"Red");o.addClass("backgroundColor");const i=new Q("backgroundOptionGreen",e,l.toggleCellHiliteColor,s.HiliteColorGreen,new ne(s.HiliteColorGreen).htmlElement,"Green");i.addClass("backgroundColor");const r=new Q("backgroundOptionBlue",e,l.toggleCellHiliteColor,s.HiliteColorBlue,new ne(s.HiliteColorBlue).htmlElement,"Blue");r.addClass("backgroundColor");const a=new Q("backgroundOptionYellow",e,l.toggleCellHiliteColor,s.HiliteColorYellow,new ne(s.HiliteColorYellow).htmlElement,"Yellow");a.addClass("backgroundColor");const c=new Q("backgroundOptionGrey",e,l.toggleCellHiliteColor,s.HiliteColorGrey,new ne(s.HiliteColorGrey).htmlElement,"Grey");c.addClass("backgroundColor");const d=new Q("backgroundOptionNone",e,l.toggleCellHiliteColor,s.HiliteColorNone,new ne(s.HiliteColorNone).htmlElement,"None");return d.addClass("backgroundColor"),e.append(o),e.append(i),e.append(r),e.append(a),e.append(c),e.append(d),n}static separator(e){return new J(e)}}class Ne extends O{id;focusStack;constructor(){const e="mediaInputter";super({id:e}),this.id=e,this.focusStack=N.Instance.resolve("IFocusStack"),this.attachEvents()}init(){const e=document.createElement("div");e.id=this.props.id,e.classList.add("tab-container","soft-box-shadow"),e.style.display="none",e.style.zIndex=d.SlightlyImportant;const t=document.createElement("ul");t.classList.add("nav","nav-underline");const n=this.createNavItem("uploadTab","Upload",!0),o=this.createNavItem("embedTab","Embed link");t.appendChild(n),t.appendChild(o);const i=document.createElement("div");i.classList.add("tab-content");const r=this.createUploadContent(),s=this.createEmbedContent();return i.appendChild(r),i.appendChild(s),e.appendChild(t),e.appendChild(i),e}createNavItem(e,t,n=!1){const o=document.createElement("li");o.classList.add("nav-item"),n&&o.classList.add("active"),o.id=e;const i=document.createElement("a");return i.classList.add("nav-link"),i.innerText=t,o.appendChild(i),o}createUploadContent(){const e=document.createElement("div");e.id="uploadContent",e.classList.add("upload-content","content-data");const t=document.createElement("label");t.innerText="Upload file";const n=document.createElement("div");return n.classList.add("text-info"),n.innerText="Maximum file size: 5MB",e.appendChild(t),e.appendChild(n),e}createEmbedContent(){const e=document.createElement("div");e.id="embedContent",e.classList.add("content-data","embed-content");const t=document.createElement("input");t.type="text",t.setAttribute("placeholder","Paste URL here");const n=document.createElement("button");return n.innerText="Embed",n.addEventListener("click",(()=>this.embedGeneric(t.value))),e.appendChild(t),e.appendChild(n),e}embedGeneric(e){const t=new URL(e),n=t.hostname,o=t.pathname;switch(n){case"www.youtube.com":o.startsWith("/watch")?this.embedYouTubeVideo(t):o.startsWith("/playlist")&&this.embedYouTubePlaylist(t);break;case"open.spotify.com":o.startsWith("/track")?this.embedSpotifyTrack(t):o.startsWith("/playlist")&&this.embedSpotifyPlaylist(t);break;case"twitter.com":this.embedTweet(t);break;case"www.google.com":case"www.google.com.br":o.startsWith("/maps")&&this.embedGoogleMap(t);break;case"gist.github.com":this.embedGist(t,"github");break;case"gitlab.com":o.includes("/snippets")&&this.embedGist(t,"gitlab");break;case"codepen.io":this.embedCodepen(t);break;default:console.error("Unsupported URL for embedding")}}embedYouTubeVideo(e){const t=e.searchParams.get("v");if(t){const e=this.createEmbedContainer(),n=document.createElement("iframe");n.src=`https://www.youtube.com/embed/${t}`,n.frameBorder="0",n.allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture",n.allowFullscreen=!0,e.appendChild(n),this.finalizeEmbed(e)}else console.error("Invalid YouTube video URL")}embedYouTubePlaylist(e){const t=e.searchParams.get("list");if(t){const e=this.createEmbedContainer(),n=document.createElement("iframe");n.src=`https://www.youtube.com/embed/videoseries?list=${t}`,n.setAttribute("allowfullscreen","true"),e.appendChild(n),this.finalizeEmbed(e)}else console.error("Invalid YouTube playlist URL")}embedSpotifyTrack(e){const t=e.pathname.split("/").pop(),n=this.createEmbedContainer(),o=document.createElement("iframe");o.src=`https://open.spotify.com/embed/track/${t}`,o.frameBorder="0",o.width="auto",n.appendChild(o),this.finalizeEmbed(n)}embedSpotifyPlaylist(e){const t=e.pathname.split("/").pop(),n=this.createEmbedContainer(),o=document.createElement("iframe");o.src=`https://open.spotify.com/embed/playlist/${t}`,o.frameBorder="0",n.appendChild(o),this.finalizeEmbed(n)}embedTweet(e){e.pathname.split("/").pop();const t=document.createElement("script");t.setAttribute("src","https://platform.twitter.com/widgets.js");const n=this.createEmbedContainer(),o=document.createElement("blockquote");o.classList.add("twitter-tweet"),o.setAttribute("data-theme","light"),o.innerHTML=`Loading tweet...`,n.appendChild(o),n.appendChild(t),this.finalizeEmbed(n)}embedGoogleMap(e){const t=e.search.slice(1),n=this.createEmbedContainer(),o=document.createElement("iframe");o.src=`https://www.google.com/maps?${t}&output=embed`,o.style.maxWidth="100%",o.style.height="450px",n.appendChild(o),this.finalizeEmbed(n)}embedGist(e,t){const n=e.pathname.split("/").pop(),o=this.createEmbedContainer();let i;if(o.style.width="100%","github"===t)i=`https://gist.github.com/${n}.js`;else{if("gitlab"!==t)return void console.error("Unsupported service for embedding gists");i=`https://gitlab.com/snippets/${n}/raw`}const r=document.createElement("script");r.src=i,r.onload=()=>{console.log("Gist loaded successfully from "+t)},r.onerror=()=>{console.error("Failed to load the Gist from "+t)},o.appendChild(r),this.finalizeEmbed(o)}embedCodepen(e){const t=e.pathname.split("/"),n=t[1],o=t[3],i=this.createEmbedContainer(),r=document.createElement("iframe");r.src=`https://codepen.io/${n}/embed/${o}?height=265&theme-id=light&default-tab=js,result`,r.style.border="none",r.style.maxWidth="100%",i.appendChild(r),this.finalizeEmbed(i)}createEmbedContainer(){const e=document.createElement("div");return e.classList.add("embed-container","background"),e}finalizeEmbed(e){const t=this.focusStack.peek();if(t){for(t.classList.add("resizable");t.firstChild;)t.removeChild(t.firstChild);t.appendChild(e)}this.hide()}set inputValue(e){const t=this.htmlElement.querySelector("input");t&&(t.value=e)}get display(){return"flex"}attachUIEvent(){document.addEventListener(a.ShowElement,this.handleShowElementEvent.bind(this))}handleShowElementEvent(e){e.detail.targetId==this.id&&this.show()}attachEvents(){this.attachUIEvent();const e=this.htmlElement.querySelector("#uploadTab");e?.addEventListener("click",(()=>{this.setActiveTab("uploadTab","uploadContent")}));const t=this.htmlElement.querySelector("#embedTab");t?.addEventListener("click",(()=>{this.setActiveTab("embedTab","embedContent")})),document.addEventListener(u.Keydown,this.handlerEvent.bind(this)),document.addEventListener(u.Click,this.handlerAnotherEvent.bind(this))}handlerEvent(e){e.key==Ce.Escape&&this.canHide&&this.hide()}handlerAnotherEvent(e){if(M.findClickedElementOrAncestorById(e,"embedImage")){e.stopImmediatePropagation();const t=this.focusStack.peek();t&&this.embedImage(t)}if(M.findClickedElementOrAncestorById(e,"embedVideo")){e.stopImmediatePropagation();const t=this.focusStack.peek();t&&this.embedVideo(t)}if(!M.findClickedElementOrAncestorById(e,this.id)&&this.isVisible)return e.stopImmediatePropagation(),void this.hide();const t=M.findClickedElementOrAncestorByClass(e,"temp-image-replace");if(t)return e.stopImmediatePropagation(),this.focusStack.push(t),void this.show();const n=M.findClickedElementOrAncestorByClass(e,"temp-video-replace");return n?(e.stopImmediatePropagation(),this.focusStack.push(n),void this.show()):void 0}getTab(e){return document.getElementById(e)}getContent(e){return document.getElementById(e)}setActiveTab(e,t){document.querySelectorAll(".nav-item").forEach((e=>{e.classList.remove("active")})),document.querySelectorAll(".content-data").forEach((e=>{e.classList.remove("active")})),this.getTab(e)?.classList.add("active"),this.getContent(t)?.classList.add("active")}embedImage(e){const t=document.querySelector("#embedContent input[type=text]")?.value;console.log("Embedding image from URL:",t);const n=e.closest(".johannes-content-element");if(n){for(;n.firstChild;)n.removeChild(n.firstChild);const e=document.createElement("img");e.contentEditable="true",e.src=t,e.alt="Embedded Image",e.style.maxWidth="100%",e.style.width="auto",e.style.height="auto",n.classList.add("resizable"),e.classList.add("background"),n.appendChild(e)}else console.error('No content element found with data-content-type="image"');this.hide()}embedVideo(e){const t=document.querySelector("#videoContent input[type=text]")?.value;console.log("Embedding video from URL:",t);const n=e.closest(".johannes-content-element");if(n){for(;n.firstChild;)n.removeChild(n.firstChild);const e=new URL(t).searchParams.get("v");if(e){const t=document.createElement("div");t.classList.add("video-container");const o=document.createElement("iframe");o.src=`https://www.youtube.com/embed/${e}`,o.frameBorder="0",o.allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture",o.allowFullscreen=!0,t.appendChild(o),n.appendChild(t),n.classList.add("resizable"),o.classList.add("background")}else console.error("Invalid YouTube URL")}else console.error('No content element found with data-content-type="video"');this.hide()}show(){const e=this.focusStack.peek();e&&this.changeToolbarPositionToBeClosedTo(e),this.htmlElement.style.visibility="visible",super.show()}hide(){this.inputValue="",super.hide()}changeToolbarPositionToBeClosedTo(e){const t=e.getBoundingClientRect();this.htmlElement.style.display="flex",this.htmlElement.style.visibility="hidden";let n=t.left+window.scrollX+t.width/2-this.htmlElement.offsetWidth/2,o=t.bottom+window.scrollY+10;this.htmlElement.style.left=`${n}px`,this.htmlElement.style.top=`${o}px`}}class Re{static build(){return new Ne}}class Me{static build(){return R.getInstance(ke.build(),Te.build(),z.build(),de.build(),Ie.build(),Oe.build(),Re.build())}}class He{static instance;editor;constructor(e){if(He.instance)throw new Error;this.editor=e,He.instance=this}static build(){return He.instance?He.instance:new He(Me.build())}start(){return this.insertIcons(),this.editor}insertIcons(){if(!document.querySelector(".svg-icons-container")){const e=document.createElement("div");e.innerHTML='\r\n\r\n \r\n\r\n \r\n\r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n\r\n \x3c!-- tags --\x3e\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n\r\n \r\n\r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n\r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n\r\n \r\n \r\n \r\n\r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n',e.className="svg-icons-container",document.body.appendChild(e)}}}class qe{static instance=null;blockOperationsService;tableOperationsService;textOperationsService;constructor(e,t,n){if(qe.instance)throw new Error("Attempt to instantiate singleton `CommandDispatcher` more than once.");this.blockOperationsService=e,this.textOperationsService=t,this.tableOperationsService=n}static getInstance(){const e=N.Instance.resolve("IBlockOperationsService"),t=N.Instance.resolve("ITextOperationsService"),n=N.Instance.resolve("ITableOperationsService");return qe.instance||(qe.instance=new qe(e,t,n)),qe.instance}listen(){document.addEventListener(r.emittedCommand,this.handleCommandEvent),document.addEventListener(r.focusOnFirstRequested,this.handleFocusOnFirstRequestedEvent)}handleCommandEvent=e=>{const{command:t,showUI:n,value:o,targetBlockType:i,block:r,scope:s}=e.detail;switch(t){case l.toggleBold:this.textOperationsService.execBold();break;case l.toggleItalic:this.textOperationsService.execItalic();break;case l.toggleUnderline:this.textOperationsService.execUnderline();break;case l.toggleStrikeThrough:this.textOperationsService.execStrikeThrough();break;case l.toggleHiliteColor:if(!o)throw new Error(`${l.toggleHiliteColor} requires a color value`);this.textOperationsService.execHiliteColor(o);break;case l.toggleForeColor:if(!o)throw new Error(`${l.toggleForeColor} requires a color value`);this.textOperationsService.execForeColor(o);break;case l.transformBlock:if(!o)throw new Error(`${l.transformBlock} requires a value that represents the target element type.`);this.execTransformBlock(o);break;case l.duplicateBlock:this.execDuplicateBlock();break;case l.deleteBlock:this.execDeleteBlock();break;case l.removeFormat:this.execRemoveFormat();break;case l.createDefaultBlock:this.execCreateDefaultBlock();break;case l.insertNew:this.execInsertNew();break;case l.focusOnPreviousBlock:this.execFocusOnPreviousBlock();break;case l.insertTableColumnLeft:this.tableOperationsService.insertColumnLeft();break;case l.insertTableColumnRight:this.tableOperationsService.insertColumnRight(r||null);break;case l.insertTableRowAbove:this.tableOperationsService.insertRowAbove();break;case l.insertTableRowBelow:this.tableOperationsService.insertRowBelow(r||null);break;case l.toggleCellHiliteColor:if(!o)throw new Error(`${l.toggleCellHiliteColor} requires a value that represents the cell background color.`);this.tableOperationsService.execCellBackgroundColor(o);break;case l.removeColumn:this.tableOperationsService.removeColumn();break;case l.removeRow:case l.removeRow:this.tableOperationsService.removeRow();break;case l.changeTableBorderColor:this.tableOperationsService.changeTableBorderColor(s,o);break;default:console.error(`No action defined for command: ${t}`)}};execTransformBlock(e){return this.blockOperationsService.transformBlock(e),!0}execDuplicateBlock(){return this.blockOperationsService.execCommand(V.BLOCK_OPERATIONS.DUPLICATE,!1)}execDeleteBlock(){return this.blockOperationsService.execCommand(V.BLOCK_OPERATIONS.DELETE,!1)}execRemoveFormat(){return this.blockOperationsService.execCommand(V.BLOCK_OPERATIONS.REMOVE_FORMAT,!1)}execCreateDefaultBlock(){return this.blockOperationsService.execCommand(V.BLOCK_OPERATIONS.CREATE_DEFAULT_BLOCK,!1)}execInsertNew(){return this.blockOperationsService.createNewElementAndSplitContent()}execFocusOnPreviousBlock(){return this.blockOperationsService.execCommand(V.BLOCK_OPERATIONS.DELETE_FOCUS_ON_PREVIOUS,!1)}handleFocusOnFirstRequestedEvent=()=>{this.blockOperationsService.execCommand(V.BLOCK_OPERATIONS.FOCUS_ON_FIRST,!1)}}class _e{static instance=null;constructor(){if(_e.instance)throw new Error("Use ShortcutListeners.getInstance() to get instance.");this.listen()}startListen(){console.log("listening keyboard shortcuts")}static getInstance(){return _e.instance?_e.instance:new _e}listen(){document.addEventListener("keydown",(e=>{console.log(`Key: ${e.key}, Code: ${e.code}, Ctrl: ${e.ctrlKey}, Alt: ${e.altKey}, AltGr: ${"AltGraph"===e.key}, NumLock: ${e.getModifierState("NumLock")}`);const t=e.code.startsWith("Numpad"),n=e.getModifierState("NumLock");(e.ctrlKey||e.metaKey)&&e.shiftKey&&"Enter"===e.key?(e.preventDefault(),e.stopPropagation(),alert("converto para paragrafo"),document.dispatchEvent(new CustomEvent(r.emittedCommand,{detail:{command:l.transformBlock,targetBlockType:L.ELEMENT_TYPES.PARAGRAPH}}))):!e.ctrlKey&&!e.metaKey||e.altKey||"Digit1"!==e.code&&"Numpad1"!==e.code?!e.ctrlKey&&!e.metaKey||e.shiftKey||"."!==e.key?!e.ctrlKey&&!e.metaKey||e.shiftKey||"/"!==e.key?e.ctrlKey&&e.altKey&&("Digit1"===e.code||t&&n&&"Numpad1"===e.code)?(e.preventDefault(),e.stopPropagation(),document.dispatchEvent(new CustomEvent(r.emittedCommand,{detail:{command:l.transformBlock,targetBlockType:L.ELEMENT_TYPES.HEADER_1}}))):e.ctrlKey&&e.altKey&&("Digit2"===e.code||t&&n&&"Numpad2"===e.code)?(e.preventDefault(),e.stopPropagation(),document.dispatchEvent(new CustomEvent(r.emittedCommand,{detail:{command:l.transformBlock,targetBlockType:L.ELEMENT_TYPES.HEADER_2}}))):e.ctrlKey&&e.altKey&&("Digit3"===e.code||t&&n&&"Numpad3"===e.code)?(e.preventDefault(),e.stopPropagation(),document.dispatchEvent(new CustomEvent(r.emittedCommand,{detail:{command:l.transformBlock,targetBlockType:L.ELEMENT_TYPES.HEADER_3}}))):e.ctrlKey&&e.altKey&&("Digit4"===e.code||t&&n&&"Numpad4"===e.code)?(e.preventDefault(),e.stopPropagation(),document.dispatchEvent(new CustomEvent(r.emittedCommand,{detail:{command:l.transformBlock,targetBlockType:L.ELEMENT_TYPES.HEADER_4}}))):e.ctrlKey&&e.altKey&&("Digit5"===e.code||t&&n&&"Numpad5"===e.code)?(e.preventDefault(),e.stopPropagation(),document.dispatchEvent(new CustomEvent(r.emittedCommand,{detail:{command:l.transformBlock,targetBlockType:L.ELEMENT_TYPES.HEADER_5}}))):e.ctrlKey&&e.altKey&&("Digit6"===e.code||t&&n&&"Numpad6"===e.code)?(e.preventDefault(),e.stopPropagation(),document.dispatchEvent(new CustomEvent(r.emittedCommand,{detail:{command:l.transformBlock,targetBlockType:L.ELEMENT_TYPES.HEADER_6}}))):"D"!==e.key&&"d"!==e.key||!e.ctrlKey?"Delete"!==e.key&&"Backspace"!==e.key||!e.shiftKey?"\\"===e.key&&(e.ctrlKey||e.metaKey)?document.dispatchEvent(new CustomEvent(r.emittedCommand,{detail:{command:l.removeFormat}})):e.ctrlKey&&e.altKey&&"Digit1"===e.code&&e.preventDefault():(e.preventDefault(),e.stopPropagation(),document.dispatchEvent(new CustomEvent(r.emittedCommand,{detail:{command:l.deleteBlock}}))):(e.preventDefault(),e.stopPropagation(),document.dispatchEvent(new CustomEvent(r.emittedCommand,{detail:{command:l.duplicateBlock}}))):(e.preventDefault(),e.stopPropagation(),document.dispatchEvent(new CustomEvent(r.emittedCommand,{detail:{command:l.transformBlock,targetBlockType:L.ELEMENT_TYPES.NUMBERED_LIST}}))):(e.preventDefault(),e.stopPropagation(),document.dispatchEvent(new CustomEvent(r.emittedCommand,{detail:{command:l.transformBlock,targetBlockType:L.ELEMENT_TYPES.BULLETED_LIST}}))):(e.preventDefault(),e.stopPropagation(),document.dispatchEvent(new CustomEvent(r.emittedCommand,{detail:{command:l.transformBlock,targetBlockType:L.ELEMENT_TYPES.CHECK_LIST}})))}))}}class De{static instance=null;focusStack;shownElements=new Map;constructor(e){if(De.instance)throw new Error("Use TableEventListeners.getInstance() to get instance.");this.focusStack=e,this.listen()}startListen(){console.log("listening table clicks")}static getInstance(){const e=N.Instance.resolve("IFocusStack");return De.instance?De.instance:new De(e)}listen(){document.addEventListener("click",(e=>{let t=null;if(t=e.target.nodeType==Node.TEXT_NODE?e.target.parentElement:e.target,t?.closest(".add-table-column")){const e=new CustomEvent(r.emittedCommand,{detail:{command:l.insertTableColumnRight,block:t.closest(".block")}});document.dispatchEvent(e)}if(t?.closest(".add-table-row")){const e=new CustomEvent(r.emittedCommand,{detail:{command:l.insertTableRowBelow,block:t.closest(".block")}});document.dispatchEvent(e)}}))}}class Pe{static instance;stack;capacity=10;constructor(){this.stack=[]}static getInstance(){return Pe.instance||(Pe.instance=new Pe),Pe.instance}push(e){this.stack.length>=this.capacity&&this.stack.shift(),this.stack.push(e)}peek(){return this.stack[this.stack.length-1]}clear(){this.stack=[]}}!function(e){e.TableToolbar="tableFloatingToolbar",e.TextToolbar="textFloatingToolbar"}(Ee||(Ee={}));class Fe{static instance;focusStack;memento;constructor(e,t){if(Fe.instance)throw new Error("Use TableOperationsService.getInstance() to get instance.");this.focusStack=e,this.memento=t}isActiveCellBackgroundColor(e){throw new Error("Method not implemented.")}removeColumn(){this.memento.saveState();const e=this.focusStack.peek();e&&Se.removeColumnByCell(e),F.emitCloseElementEvent(Ee.TableToolbar)}removeRow(){this.memento.saveState();const e=this.focusStack.peek();e&&Se.removeRowByCell(e),F.emitCloseElementEvent(Ee.TableToolbar)}execCellBackgroundColor(e){this.memento.saveState(),F.emitResetActiveButtonsElementEvent("backgroundColor");const t=Se.getActiveTableCell();t?(t.closest("table").querySelectorAll("td.selected").forEach((t=>{t.style.backgroundColor=e})),F.emitShowHideActiveElementEvent("backgroundColor",e,"show")):console.error("cell not found")}static isCellBackgroundColor(e,t){if(!e||"TD"!==e.tagName||!e.hasAttribute("data-placeholder"))return!1;const n=window.getComputedStyle(e).getPropertyValue("background-color");return S.rgbToHex(n).toUpperCase()===t.toUpperCase()}queryStateCellBackgroundColor(e){const t=Se.getActiveTableCell();if(t){const n=window.getComputedStyle(t).getPropertyValue("background-color");return S.rgbToHex(n).toUpperCase()===e.toUpperCase()}return!1}queryAllStateCellBackgroundColor(e,t){let n=!0;return t!=s.BackgroundColorNone&&(e.forEach((e=>{const o=window.getComputedStyle(e).backgroundColor;S.rgbToHex(o).toLocaleLowerCase()!==t.toLocaleLowerCase()&&(n=!1)})),n)}static getInstance(){const e=N.Instance.resolve("IFocusStack"),t=N.Instance.resolve("IMemento");return this.instance||(this.instance=new Fe(e,t)),this.instance}insertRowAbove(){this.memento.saveState();const e=this.focusStack.peek();if(!e)return void console.error("No cell is focused");const t=e.parentElement;if(!t)return void console.error("No row is focused");const n=t.closest("table");if(!n)return void console.error("Table does not exist");const o=n.querySelector("tbody")||n,i=Array.from(o.children).indexOf(t);i<0?console.error("Row index not found"):(Se.addRow(n,i),F.emitCloseElementEvent(Ee.TableToolbar))}insertRowBelow(e){if(this.memento.saveState(),e){const t=e.querySelector("table");if(!t)return void console.error("Table does not exist");{const e=t.querySelector("tr:last-child");if(!e)return void console.error("No rows in the table");{const n=Array.from(t.children[0].children).indexOf(e)+1;Se.addRow(t,n)}}}else{const e=this.focusStack.peek();if(!e)return void console.error("No focused element available");const t=e.closest("td");if(!t)return void console.error("No cell is focused");const n=t.parentElement,o=t.closest("table");if(!o)return void console.error("Table does not exist");if(n){const e=Array.from(o.children[0].children).indexOf(n)+1;Se.addRow(o,e),F.emitCloseElementEvent(Ee.TableToolbar)}}}insertColumnLeft(){this.memento.saveState();const e=this.focusStack.peek();if(!e)return void console.error("No focused element available");const t=e.closest("td");if(!t)return void console.error("No cell is focused");const n=t.closest("table");if(!n)return void console.error("Table does not exist");const o=Array.from(t.parentElement.children).indexOf(t);Se.addColumn(n,o),F.emitCloseElementEvent(Ee.TableToolbar)}insertColumnRight(e){if(this.memento.saveState(),e){const t=e.querySelector("table");t&&Se.addColumn(t)}else{const e=this.focusStack.peek();if(!e)return void console.error("No focused element available");const t=e.closest("td");if(!t)return void console.error("No cell is focused");const n=t.closest("table");if(!n)return void console.error("Table does not exist");const o=Array.from(t.parentElement.children).indexOf(t);Se.addColumn(n,o+1),F.emitCloseElementEvent(Ee.TableToolbar)}}showInsertLineElement(e){e.querySelector(".add-table-row").style.visibility="visible"}showInsertColumnElement(e){e.querySelector(".add-table-column").style.visibility="visible"}hideInsertRowElement(e){e.querySelector(".add-table-row").style.visibility="hidden"}hideInsertColumnElement(e){e.querySelector(".add-table-column").style.visibility="hidden"}changeTableBorderColor(e,t){const n=this.focusStack.peek()?.closest(he.TABLE);n&&Se.changeCellBorderColor(n,e,t)}}class Ve{static query="#johannesEditor .content";static instance;undoStack=[];redoStack=[];get content(){return document.querySelector(Ve.query)}constructor(){if(Ve.instance)throw new Error("Use Memento.getInstance() to get instance.");this.attachEvents(),this.saveState()}saveState(){this.content&&(this.undoStack.push(this.content.innerHTML),this.redoStack=[])}undo(){if(this.undoStack.length>1&&this.content){this.redoStack.push(this.content.innerHTML);const e=this.undoStack.pop();this.content.innerHTML=e}}redo(){if(this.redoStack.length>0&&this.content){this.undoStack.push(this.content.innerHTML);const e=this.redoStack.pop();this.content.innerHTML=e}}attachEvents(){document.addEventListener("keydown",(e=>{e.ctrlKey&&"z"===e.key?(this.undo(),e.preventDefault()):e.ctrlKey&&"y"===e.key&&(this.redo(),e.preventDefault())}))}static getInstance(){return Ve.instance||(Ve.instance=new Ve),Ve.instance}}!function(e){e.First="First",e.Last="Last"}(be||(be={}));class je{static instance;quickMenu;constructor(e){document.addEventListener("keydown",this.handleArrowKeys.bind(this)),this.quickMenu=e}listen(){console.log("EditableNavigation is now listening for key events.")}static getInstance(){if(!je.instance){const e=N.Instance.resolve("IQuickMenu");je.instance=new je(e)}return je.instance}handleArrowKeys(e){if(!this.quickMenu.isVisible&&e.key.startsWith("Arrow")&&!e.altKey&&!e.ctrlKey&&!e.altKey&&!e.shiftKey&&!e.metaKey){const t=document.activeElement;if(t&&t.isContentEditable&&this.shouldSwitchEditable(t,e.key)){const n=this.findNextEditable(t,e.key);n&&(e.preventDefault(),e.stopImmediatePropagation(),e.key!=Ae.ArrowUp&&e.key!=Ae.ArrowDown||this.placeCaretInSimilarPosition(t,n),e.key==Ae.ArrowLeft&&M.placeCursorAtEndOfEditableElement(n),e.key==Ae.ArrowRight&&M.placeCursorAtStartOfEditableElement(n),n.focus())}}}shouldSwitchEditable(e,t){const n=window.getSelection();if(n&&n.rangeCount>0){let e=n.getRangeAt(0);if(e.endOffset!=e.startOffset)return!1}if(n&&n.rangeCount>0){const{atStart:n,atEnd:o}=M.getSelectionTextInfo(e),i=this.isAtLineBoundary(e,be.First),r=this.isAtLineBoundary(e,be.Last);return!!(t===Ae.ArrowLeft&&n||t===Ae.ArrowRight&&o||t===Ae.ArrowUp&&(n||i)||t===Ae.ArrowDown&&(o||r))}return!1}isAtLineBoundary(e,t){if(""===e.textContent?.trim())return!0;const n=window.getSelection();if(!n||0===n.rangeCount)return!1;const o=n.getRangeAt(0).getClientRects()[0];if(!o)return!0;const i=e.getBoundingClientRect();return t===be.First?Math.abs(o.top-i.top)<11:t===be.Last&&Math.abs(o.bottom-i.bottom)<11}findNextEditable(e,t){const n=Array.from(document.querySelectorAll('[contenteditable="true"]')),o=n.indexOf(e);if(e.closest("td")){const n=e.closest("table"),o=e.closest("td");if(n&&o){const e=Se.getNeighborCell(n,o,t);if(e)return e}}let i=-1;return i=t===Ae.ArrowLeft||t===Ae.ArrowRight?t===Ae.ArrowLeft?o-1:o+1:this.findVerticalEditable(e,n,t),i<0||i>=n.length?null:n[i]||null}findVerticalEditable(e,t,n){const o=t.indexOf(e),i=e.getBoundingClientRect();let r=-1,s=1/0;return t.forEach(((t,o)=>{if(t!==e){const e=t.getBoundingClientRect(),l=n===Ae.ArrowUp?i.top-e.bottom:e.top-i.bottom,a=Math.abs(i.left-e.left);l>0&&l+a0){const e=n.getRangeAt(0).getBoundingClientRect();n.removeAllRanges();const o=document.createRange(),i=document.createTreeWalker(t,NodeFilter.SHOW_TEXT);let r=i.nextNode(),s=r,l=0,a=1/0;if(s){do{if(r&&r.nodeValue){o.setStart(r,0),o.setEnd(r,r.nodeValue.length);for(let t=0;tVe.getInstance())),N.Instance.register("IShortcutListeners",(()=>_e.getInstance())),N.Instance.register("ITableListeners",(()=>De.getInstance())),N.Instance.register("IFocusStack",(()=>Pe.getInstance())),N.Instance.register("IElementFactoryService",(()=>L.getInstance())),N.Instance.register("ITextOperationsService",(()=>re.getInstance())),N.Instance.register("ITableOperationsService",(()=>Fe.getInstance())),N.Instance.register("IBlockOperationsService",(()=>V.getInstance())),N.Instance.register("IQuickMenu",(()=>Be.getInstance())),N.Instance.register("ITableContextFloatingToolbar",(()=>Le.getInstance())),N.Instance.register("IEditableNavigation",(()=>je.getInstance())),He.build().start(),qe.getInstance().listen(),je.getInstance().listen()}))})(); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QU02QyxTQUFTbzJCLEVBQVVDLEdBQ3pCbDVCLEVBQU15RixVQUFTLEdBQ2Y1RixFQUFJVyxTQUFTUixFQUNqQixNQUNJQSxFQUFNeUMsbUJBQW1CczJCLEdBQ3pCLzRCLEVBQU15RixVQUFTLEdBQ2Y1RixFQUFJVyxTQUFTUixFQUVyQixDQUNKLEVDM1BKblIsU0FBU3NMLGlCQUFpQixvQkFBb0IsV0FFMUMrQyxFQUFvQkUsU0FBU25JLFNBQVMsWUFBWSxJQUFNK2hDLEdBQVEvZ0MsZ0JBQ2hFaUgsRUFBb0JFLFNBQVNuSSxTQUFTLHNCQUFzQixJQUFNaWdDLEdBQWtCai9CLGdCQUNwRmlILEVBQW9CRSxTQUFTbkksU0FBUyxtQkFBbUIsSUFBTXVnQyxHQUFldi9CLGdCQUU5RWlILEVBQW9CRSxTQUFTbkksU0FBUyxlQUFlLElBQU0wZ0MsR0FBVzEvQixnQkFDdEVpSCxFQUFvQkUsU0FBU25JLFNBQVMsMEJBQTBCLElBQU12QixFQUFzQnVDLGdCQUM1RmlILEVBQW9CRSxTQUFTbkksU0FBUywwQkFBMEIsSUFBTXlnQixHQUFzQnpmLGdCQUM1RmlILEVBQW9CRSxTQUFTbkksU0FBUywyQkFBMkIsSUFBTStnQyxHQUF1Qi8vQixnQkFDOUZpSCxFQUFvQkUsU0FBU25JLFNBQVMsMkJBQTJCLElBQU1xVSxFQUF1QnJULGdCQUc5RmlILEVBQW9CRSxTQUFTbkksU0FBUyxjQUFjLElBQU11dEIsR0FBVXZzQixnQkFDcEVpSCxFQUFvQkUsU0FBU25JLFNBQVMsZ0NBQWdDLElBQU1rMUIsR0FBNEJsMEIsZ0JBQ3hHaUgsRUFBb0JFLFNBQVNuSSxTQUFTLHVCQUF1QixJQUFNdWlDLEdBQW1CdmhDLGdCQUV0RjA5QixHQUFVN2pCLFFBQVFxSixRQUNsQjJhLEdBQWtCNzlCLGNBQWM4OUIsU0FDaEN5RCxHQUFtQnZoQyxjQUFjODlCLFFBQ3JDLEciLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9hc3NldHMvY3NzL21haW4uY3NzIiwid2VicGFjazovL2pvaGFubmVzLy4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qcyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9zb3VyY2VNYXBzLmpzIiwid2VicGFjazovL2pvaGFubmVzLy4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzIiwid2VicGFjazovL2pvaGFubmVzLy4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qcyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydFN0eWxlRWxlbWVudC5qcyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3NldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlcy5qcyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlRG9tQVBJLmpzIiwid2VicGFjazovL2pvaGFubmVzLy4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvd2VicGFjay9ydW50aW1lL2NvbXBhdCBnZXQgZGVmYXVsdCBleHBvcnQiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovL2pvaGFubmVzL3dlYnBhY2svcnVudGltZS9oYXNPd25Qcm9wZXJ0eSBzaG9ydGhhbmQiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvd2VicGFjay9ydW50aW1lL25vbmNlIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbW1vbi9Db250ZW50VHlwZXMudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tbW9uL0ljb25zLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbW1vbi9DdXN0b21FdmVudHMudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tbW9uL0NvbG9ycy50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21tYW5kcy9Db21tYW5kcy50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21tb24vQ3VzdG9tVUlFdmVudHMudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29yZS9CdXR0b25JRHMudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tbW9uL1pJbmRleC50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21tb24vRGVmYXVsdEpTRXZlbnRzLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvcmUvRHJvcGRvd25JdGVtSURzLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvcmUvRHJvcGRvd25MaXN0SURzLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvcmUvRHJvcGRvd25NZW51SURzLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2Fzc2V0cy9jc3MvbWFpbi5jc3M/MWZiYSIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy91dGlsaXRpZXMvVXRpbHMudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvc2VydmljZXMvZWxlbWVudC1mYWN0b3J5L0VsZW1lbnRGYWN0b3J5U2VydmljZS50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21wb25lbnRzL2NvbW1vbi9CYXNlVUlDb21wb25lbnQudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29yZS9EZXBlbmRlbmN5Q29udGFpbmVyLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbXBvbmVudHMvZWRpdG9yL0VkaXRvci50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy91dGlsaXRpZXMvRE9NVXRpbHMudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tbWFuZHMvVUlBY3Rpb25zL0NoYW5nZUNvbG9yLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbW1hbmRzL1VJQWN0aW9ucy9TaG93SGlkZUFjdGl2ZUJ1dHRvbi50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21tYW5kcy9VSUFjdGlvbnMvUmVzZXRBY3RpdmVCdXR0b25zLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbW1hbmRzL1VJQWN0aW9ucy9DbG9zZUVsZW1lbnQudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tbWFuZHMvVUlBY3Rpb25zL1Nob3dFbGVtZW50LnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbW1hbmRzL0V2ZW50RW1pdHRlci50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9zZXJ2aWNlcy9ibG9jay1vcGVyYXRpb25zL0Jsb2NrT3BlcmF0aW9uc1NlcnZpY2UudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tcG9uZW50cy9hZGQtYmxvY2svQWRkQmxvY2tCdXR0b24udHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tcG9uZW50cy9hZGQtYmxvY2svQWRkQmxvY2tXcmFwcGVyLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbW1vbi9TaXplcy50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21wb25lbnRzL2NvbW1vbi9TVkdJY29uLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2J1aWxkZXJzL0FkZEJsb2NrQnVpbGRlci50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvZHJvcGRvd24tdG9vbC9Ecm9wZG93bk1lbnUudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tbW9uL0Jhc2VEb3VibHlMaW5rZWRMaXN0LnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbW1vbi9KTm9kZS50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21tb24vQ2lyY3VsYXJEb3VibHlMaW5rZWRMaXN0LnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbXBvbmVudHMvZmxvYXRpbmctdG9vbGJhci9kcm9wZG93bi10b29sL0Ryb3Bkb3duTWVudUxpc3RJdGVtLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbXBvbmVudHMvZmxvYXRpbmctdG9vbGJhci9kcm9wZG93bi10b29sL0Ryb3Bkb3duTWVudUxpc3QudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL3NlcGFyYXRvci9GbG9hdGluZ1Rvb2xiYXJTZXBhcmF0b3IudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL2J1dHRvbi1ncm91cC9CdXR0b25Hcm91cC50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvYnV0dG9uLWdyb3VwL0J1dHRvbkdyb3VwSXRlbS50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvZHJvcGRvd24tdG9vbC9Db2xvckljb24udHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL2Ryb3Bkb3duLXRvb2wvRHJvcGRvd25NZW51QnV0dG9uLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbXBvbmVudHMvZmxvYXRpbmctdG9vbGJhci9kcm9wZG93bi10b29sL0Ryb3Bkb3duTWVudUxpc3RJdGVtVGl0bGUudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvc2VydmljZXMvdGV4dC1vcGVyYXRpb25zL1RleHRPcGVyYXRpb25zU2VydmljZS50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvbGluay1ib3gvSW5wdXRMaW5rQm94LnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbXBvbmVudHMvZmxvYXRpbmctdG9vbGJhci9saW5rLWJveC9JbnB1dExpbmtCb3hXcmFwcGVyLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbXBvbmVudHMvZmxvYXRpbmctdG9vbGJhci9GbG9hdGluZ1Rvb2xiYXIudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL1RleHRDb250ZXh0RmxvYXRpbmdUb29sYmFyLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2J1aWxkZXJzL1RleHRDb250ZXh0RmxvYXRpbmdUb29sYmFyQnVpbGRlci50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21wb25lbnRzL3F1aWNrLW1lbnUvUXVpY2tNZW51RW1wdHkudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tbW9uL0RPTUVsZW1lbnRzLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbW1vbi9EaXJlY3Rpb25zLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL3NlcnZpY2VzL3RhYmxlLW9wZXJhdGlvbnMvVGFibGVTY29wZXMudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tbW9uL0tleWJvYXJkS2V5cy50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvU2VsZWN0aW9uTW9kZS50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb3JlL1Rvb2xiYXJJRHMudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tbW9uL0JvdW5kYXJpZXMudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tcG9uZW50cy9xdWljay1tZW51L1F1aWNrTWVudS50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21tb24vRG91Ymx5TGlua2VkTGlzdC50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21wb25lbnRzL3F1aWNrLW1lbnUvUXVpY2tNZW51U2VjdGlvbi50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21wb25lbnRzL3F1aWNrLW1lbnUvUXVpY2tNZW51SXRlbS50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9idWlsZGVycy9RdWlja01lbnVCdWlsZGVyLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbXBvbmVudHMvdGl0bGUvVGl0bGUudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvYnVpbGRlcnMvVGl0bGVCdWlsZGVyLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbXBvbmVudHMvY29udGVudC9Db250ZW50LnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2J1aWxkZXJzL0NvbnRlbnRCdWlsZGVyLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL3V0aWxpdGllcy9UYWJsZVV0aWxzLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbXBvbmVudHMvZmxvYXRpbmctdG9vbGJhci9UYWJsZUNvbnRleHRGbG9hdGluZ1Rvb2xiYXIudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvYnVpbGRlcnMvVGFibGVDb250ZXh0RmxvYXRpbmdUb29sYmFyQnVpbGRlci50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21wb25lbnRzL21lZGlhLWlucHV0dGVyL01lZGlhSW5wdXR0ZXIudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvYnVpbGRlcnMvTWVkaWFJbnB1dHRlckJ1aWxkZXIudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvYnVpbGRlcnMvRWRpdG9yQnVpbGRlci50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9idWlsZGVycy9VSUJ1aWxkZXIudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tbWFuZHMvQ29tbWFuZERpc3BhdGNoZXIudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29yZS9TaG9ydGN1dExpc3RlbmVycy50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb3JlL2xpc3RlbmVycy9UYWJsZUxpc3RlbmVycy50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb3JlL0ZvY3VzU3RhY2sudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvc2VydmljZXMvdGFibGUtb3BlcmF0aW9ucy9UYWJsZU9wZXJhdGlvbnNTZXJ2aWNlLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvcmUvTWVtZW50by50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb3JlL0VkaXRhYmxlTmF2aWdhdGlvbi50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBgLyoqIGN1cnNvciBzdHlsZSAqL1xuW2NvbnRlbnRlZGl0YWJsZT1cInRydWVcIl0ge1xuICAgIGN1cnNvcjogdGV4dCAhaW1wb3J0YW50O1xufVxuXG5cblxuLyoqIENTUyByZXNldCAqL1xuXG4uYnV0dG9uLXJlc2V0IHtcbiAgICBib3JkZXI6IG5vbmU7XG4gICAgbWFyZ2luOiAwO1xuICAgIHBhZGRpbmc6IDA7XG4gICAgd2lkdGg6IGF1dG87XG4gICAgb3ZlcmZsb3c6IHZpc2libGU7XG4gICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gICAgY29sb3I6IGluaGVyaXQ7XG4gICAgZm9udDogaW5oZXJpdDtcbiAgICBsaW5lLWhlaWdodDogbm9ybWFsO1xuICAgIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGluaGVyaXQ7XG4gICAgLW1vei1vc3gtZm9udC1zbW9vdGhpbmc6IGluaGVyaXQ7XG4gICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xufVxuXG5cblxuLyoqIGFkZCBibG9jayAqL1xuLmFkZC1ibG9jayB7XG4gICAgbWFyZ2luOiAwO1xuICAgIHBhZGRpbmc6IDA7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgIGJvcmRlcjogMXB4IHNvbGlkICMwMDA7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XG4gICAgdHJhbnNpdGlvbjogYWxsIDAuM3MgZWFzZTtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIG1hcmdpbi1sZWZ0OiAxLjNyZW07XG59XG5cbi5hZGQtYmxvY2std3JhcHBlciB7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiAzLjEyNXJlbTtcbn1cblxuLmFkZC1ibG9jay13cmFwcGVyOmhvdmVyIC5hZGQtYmxvY2sge1xuICAgIGRpc3BsYXk6IGZsZXg7XG59XG5cbi8qKiBhbmQgYWRkIGJsb2NrICovXG5cblxuXG4vKiogTGlzdCAgKiovXG5vbC5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQsXG51bC5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQge1xuICAgIHBhZGRpbmctbGVmdDogMXJlbSAhaW1wb3J0YW50O1xufVxuXG5cblxuLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCBsaT5idXR0b24ge1xuICAgIC8qIGRpc3BsYXk6IG5vbmU7ICovXG4gICAgZGlzcGxheTogbm9uZTtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgbWFyZ2luLWxlZnQ6IDEwcHg7XG4gICAgdG9wOiAwO1xuXG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICBhbGlnbi1pdGVtczogc3RhcnQ7XG4gICAganVzdGlmeS1jb250ZW50OiBzdGFydDtcblxufVxuXG4uam9oYW5uZXMtY29udGVudC1lbGVtZW50IGxpIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG5cbi5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQgbGk6OmJlZm9yZSB7XG4gICAgbWFyZ2luLWxlZnQ6IDAuMzEyNXJlbTtcbn1cblxuLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCBsaTpob3Zlcj5idXR0b24ge1xuICAgIC8qIGRpc3BsYXk6IGlubGluZS1ibG9jazsgKi9cbiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcblxufVxuXG5wLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIGxpbmUtaGVpZ2h0OiAxO1xuICAgIG1hcmdpbjogMDtcbiAgICBwYWRkaW5nOiAwO1xufVxuXG4uam9oYW5uZXMtY29udGVudC1lbGVtZW50IC5jaGVja2JveC1saXN0IHtcbiAgICBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7XG4gICAgcGFkZGluZy1sZWZ0OiAwICFpbXBvcnRhbnQ7XG59XG5cblxuLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCAuY2hlY2tib3gtbGlzdCBsaSB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIGp1c3RpZnktY29udGVudDogbGVmdDtcbn1cblxuXG4uam9oYW5uZXMtY29udGVudC1lbGVtZW50IHVsLmNoZWNrYm94LWxpc3QgaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdOmNoZWNrZWQrc3BhbiB7XG4gICAgdGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7XG59XG5cbi8qIHVsLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudDpub3QoLmNoZWNrYm94LWxpc3QpLFxub2wuam9oYW5uZXMtY29udGVudC1lbGVtZW50Om5vdCguY2hlY2tib3gtbGlzdCkge1xuICAgIHBhZGRpbmctbGVmdDogMS41cmVtICFpbXBvcnRhbnQ7XG59ICovXG5cbi8qKiBBZGQgbGluZSB0aHJvdWdoIHRleHQgZGVjb3JhdGlvbiB0byBjaGVja2VkIGNoZWNrYm94ZXMgdGV4dCBkaXYgKi9cbi5ibG9jayBpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl06Y2hlY2tlZCtkaXYge1xuICAgIHRleHQtZGVjb3JhdGlvbjogbGluZS10aHJvdWdoO1xufVxuXG4vKiogUmVtb3ZlIHRoZSBkZWZhdWx0IGxpc3Qgc3R5bGUgYW5kIHJlcGxhY2UgYnkgYW5vdGhlciB0aGF0IHdvcmtzIHdpdGggZGlzcGxheSBmbGV4ICovXG4uYmxvY2sgb2wsXG4uYmxvY2sgdWwge1xuICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG59XG5cbi5ibG9jayB1bCAubGlzdC1pdGVtLFxuLmJsb2NrIG9sIC5saXN0LWl0ZW0ge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xufVxuXG4uYmxvY2sgb2wgbGkge1xuICAgIGNvdW50ZXItaW5jcmVtZW50OiBpdGVtO1xufVxuXG4uYmxvY2sgb2wgbGk6OmJlZm9yZSB7XG4gICAgY29udGVudDogY291bnRlcihpdGVtKSBcIi4gXCI7XG4gICAgbWFyZ2luLXJpZ2h0OiAwLjMxMjVyZW07XG59XG5cbi5ibG9jayB1bCBsaTpub3QoLmxpc3QtaXRlbS1jaGVja2FibGUpOjpiZWZvcmUge1xuICAgIGNvbnRlbnQ6IFwi4oCiIFwiO1xuICAgIG1hcmdpbi1yaWdodDogMC4zMTI1cmVtO1xufVxuXG5cblxuLyoqIGFuZCBsaXN0ICoqL1xuXG5cblxuLmJsb2NrPi5kcmFnLWhhbmRsZXIge1xuICAgIGNvbG9yOiAjODQ4ODhkO1xuICAgIHZpc2liaWxpdHk6IGhpZGRlbjtcbiAgICBjdXJzb3I6IGdyYWI7XG4gICAgYWxpZ24tc2VsZjogc3RhcnQ7XG5cbiAgICAvKiBiYWNrZ3JvdW5kLWNvbG9yOiBwaW5rOyAqL1xuICAgIHBhZGRpbmctdG9wOiAwLjMzcmVtO1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbn1cblxuLmRyYWctaGFuZGxlciBzdmcge1xuICAgIC8qIGJhY2tncm91bmQtY29sb3I6IHJlZDsgKi9cbn1cblxuLmRyYWctaGFuZGxlciBzdmcgdXNlIHtcbiAgICAvKiBiYWNrZ3JvdW5kLWNvbG9yOiBibHVlOyAqL1xufVxuXG4uZHJhZy1oYW5kbGVyOmFjdGl2ZSB7XG4gICAgY3Vyc29yOiBncmFiYmluZztcbn1cblxuLmJsb2NrIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgbWFyZ2luLWJvdHRvbTogMXJlbTtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgbWF4LXdpZHRoOiAxMDAlO1xufVxuXG4uYmxvY2s+Kjpub3QoLmRyYWctaGFuZGxlcikge1xuICAgIHBhZGRpbmctbGVmdDogMS4yNXJlbSAhaW1wb3J0YW50O1xufVxuXG4uYmxvY2s6aG92ZXIgLmRyYWctaGFuZGxlciB7XG4gICAgdmlzaWJpbGl0eTogdmlzaWJsZTtcbiAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wO1xuICAgIGp1c3RpZnktY29udGVudDogc3RhcnQ7XG59XG5cbi5kcm9wLWxpbmUge1xuICAgIGhlaWdodDogMXJlbTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjODQ4ODhkO1xuICAgIHdpZHRoOiAxMDAlO1xufVxuXG5cbi50aXRsZSBoMSB7XG4gICAgbWFyZ2luLWxlZnQ6IDEuM3JlbTtcbn1cblxuXG5bY29udGVudGVkaXRhYmxlPVwidHJ1ZVwiXTplbXB0eTpmb2N1cyB7XG4gICAgY29udGVudDogYXR0cihkYXRhLXBsYWNlaG9sZGVyKTtcbiAgICBjb2xvcjogIzg0ODg4ZDtcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cblxuaDFbZGF0YS1wbGFjZWhvbGRlcl06ZW1wdHk6YmVmb3JlIHtcbiAgICBjb250ZW50OiBhdHRyKGRhdGEtcGxhY2Vob2xkZXIpO1xuICAgIGNvbG9yOiAjODQ4ODhkICFpbXBvcnRhbnQ7XG4gICAgZGlzcGxheTogYmxvY2s7XG59XG5cbmgxW2RhdGEtcGxhY2Vob2xkZXJdOmZvY3VzOmJlZm9yZSB7fVxuXG5cbipbY29udGVudGVkaXRhYmxlPVwidHJ1ZVwiXTpub3QoaDEpOmVtcHR5OmJlZm9yZSB7XG4gICAgY29udGVudDogYXR0cihkYXRhLXBsYWNlaG9sZGVyKTtcbiAgICBjb2xvcjogIzg0ODg4YWNkO1xuICAgIGRpc3BsYXk6IG5vbmU7XG59XG5cbipbY29udGVudGVkaXRhYmxlPVwidHJ1ZVwiXTpub3QoaDEpOmVtcHR5OmhvdmVyOmJlZm9yZSB7XG4gICAgZGlzcGxheTogYmxvY2s7XG59XG5cbmNpdGVbY29udGVudGVkaXRhYmxlPVwidHJ1ZVwiXTplbXB0eTpiZWZvcmUge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xufVxuXG4qW2NvbnRlbnRlZGl0YWJsZT1cInRydWVcIl06bm90KGgxKVtkYXRhLXBsYWNlaG9sZGVyXTplbXB0eTpmb2N1czpiZWZvcmUge1xuICAgIGNvbnRlbnQ6IGF0dHIoZGF0YS1wbGFjZWhvbGRlcik7XG4gICAgY29sb3I6ICM4NDg4OGFjZCAhaW1wb3J0YW50O1xuICAgIGRpc3BsYXk6IGJsb2NrO1xufVxuXG5cblxuaDEge1xuICAgIGZvbnQtc2l6ZTogMi41cmVtO1xuICAgIGZvbnQtd2VpZ2h0OiBib2xkZXIgIWltcG9ydGFudDtcbn1cblxuLmpvaGFubmVzLWVkaXRvciB7XG4gICAgd2lkdGg6IDEwMCU7XG5cbn1cblxuLmNvbnRlbnQge1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgLyogYmFja2dyb3VuZC1jb2xvcjogcmVkOyAqL1xufVxuXG4uY29udGVudCAuYmxvY2sgLnRhYmxlLXdyYXBwZXIge1xuICAgIG92ZXJmbG93LXg6IGF1dG87XG4gICAgb3ZlcmZsb3cteTogaGlkZGVuO1xufVxuXG5cbnByZSB7XG4gICAgd2lkdGg6IDEwMCU7XG59XG5cbltjb250ZW50ZWRpdGFibGVdIHtcbiAgICBvdXRsaW5lOiBub25lO1xufVxuXG5ib2R5IHtcbiAgICBoZWlnaHQ6IDIwMDBweDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjBmMGYxICFpbXBvcnRhbnQ7XG5cbiAgICBmb250LWZhbWlseTogc3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBcIlNlZ29lIFVJXCIsIFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBcIk5vdG8gU2Fuc1wiLCBcIkxpYmVyYXRpb24gU2Fuc1wiLCBBcmlhbCwgc2Fucy1zZXJpZiwgXCJBcHBsZSBDb2xvciBFbW9qaVwiLCBcIlNlZ29lIFVJIEVtb2ppXCIsIFwiU2Vnb2UgVUkgU3ltYm9sXCIsIFwiTm90byBDb2xvciBFbW9qaVwiO1xufVxuXG5cbi5lZGl0b3Ige1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgbWFyZ2luLXRvcDogODBweDtcbn1cblxucCB7XG4gICAgY29sb3I6ICMyNDI0MjQ7XG59XG5cblxuLmJsb2NrLFxuLmJsb2NrICoge1xuICAgIHVzZXItc2VsZWN0OiB0ZXh0O1xufVxuXG5cbi5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQge1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIHBhZGRpbmc6IDA7XG4gICAgbWFyZ2luOiAwO1xuICAgIC8qIGJhY2tncm91bmQtY29sb3I6IGdyZWVuOyAqL1xufVxuXG5cbiNqb2hhbm5lc0VkaXRvciB7XG4gICAgd2lkdGg6IDYwJTtcbiAgICBtYXJnaW4tbGVmdDogYXV0bztcbiAgICBtYXJnaW4tcmlnaHQ6IGF1dG87XG59XG5cbi5qb2hhbm5lcy1lZGl0b3IgaHIge1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGhlaWdodDogMnB4O1xuICAgIHZpc2liaWxpdHk6IHZpc2libGU7XG4gICAgYm9yZGVyOiBub25lO1xuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2JhKDU1LCA1MywgNDcsIDAuMTYpO1xufVxuXG5cblxuLmpvaGFubmVzLWVkaXRvciBibG9ja3F1b3RlIHtcbiAgICBtYXJnaW46IDAuNXJlbSAwO1xuICAgIHBhZGRpbmctbGVmdDogMjBweDtcbiAgICBib3JkZXItbGVmdDogNHB4IHNvbGlkIHJnYig1NSwgNTMsIDQ3KTtcbiAgICBmb250LXN0eWxlOiBpdGFsaWNcbn1cblxuLmpvaGFubmVzLWVkaXRvciBjaXRlIHtcbiAgICBwYWRkaW5nLXRvcDogMXJlbSAhaW1wb3J0YW50O1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbn1cblxuXG4uam9oYW5uZXMtZWRpdG9yIGNpdGU6OmJlZm9yZSB7XG4gICAgY29udGVudDogJ+KAlCAnO1xufVxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4jbGlua0JveCB7XG4gICAgYm9yZGVyLXJhZGl1czogMnB4O1xuICAgIHBhZGRpbmc6IDIwcHg7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2Y5ZjlmOTtcblxuXG4gICAgYm94LXNoYWRvdzpcbiAgICAgICAgMCA0cHggNnB4IHJnYmEoMCwgMCwgMCwgMC4xKSxcbiAgICAgICAgMCAtMnB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMDIpLFxuICAgICAgICAtMnB4IDAgNHB4IHJnYmEoMCwgMCwgMCwgMC4wMiksXG4gICAgICAgIDJweCAwIDRweCByZ2JhKDAsIDAsIDAsIDAuMDIpO1xuXG5cbiAgICBib3JkZXI6IDFweCBzb2xpZCAjZDBkMGQwO1xuICAgIHdpZHRoOiBmaXQtY29udGVudDtcbiAgICB6LWluZGV4OiA5OTk5OTk7XG4gICAgY29sb3I6IHJnYigxMjAsIDExOSwgMTE2KTtcbiAgICBib3JkZXItcmFkaXVzOiBub25lO1xufVxuXG5cbiNsaW5rQm94IGlucHV0IHtcbiAgICB3aWR0aDogMzE2cHg7XG4gICAgcGFkZGluZzogOHB4IDQwcHggOHB4IDE2cHg7XG4gICAgLyogYm9yZGVyLWNvbG9yOiAjZDBkMGQwOyAqL1xuXG4gICAgYm9yZGVyOiAxcHggc29saWQgIzk0OTQ5NDtcbiAgICAvKiBib3JkZXItcmFkaXVzOiA0cHg7ICovXG4gICAgaGVpZ2h0OiAyNHB4O1xuXG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG59XG5cblxuI2xpbmtCb3ggaW5wdXQ6OnNlbGVjdGlvbixcbiNsaW5rQm94IGlucHV0OmZvY3VzIHtcbiAgICBib3JkZXItcmFkaXVzOiBub25lO1xufVxuXG4vKiogc29mdC1ib3gtc2hhZG93IGNsYXNzICovXG4uc29mdC1ib3gtc2hhZG93IHtcbiAgICBtYXJnaW46IDA7XG4gICAgcGFkZGluZzogMDtcbiAgICBib3JkZXItcmFkaXVzOiAycHg7XG4gICAgYm94LXNoYWRvdzpcbiAgICAgICAgMCA0cHggNnB4IHJnYmEoMCwgMCwgMCwgMC4xKSxcbiAgICAgICAgMCAtMnB4IDRweCByZ2JhKDIxNiwgMTk2LCAxOTYsIDAuMDIpLFxuICAgICAgICAtMnB4IDAgNHB4IHJnYmEoMCwgMCwgMCwgMC4wMiksXG4gICAgICAgIDJweCAwIDRweCByZ2JhKDAsIDAsIDAsIDAuMDIpO1xuXG4gICAgYm9yZGVyOiAxcHggc29saWQgI2QwZDBkMDtcbn1cblxuLyoqIGFuZCBzb2Z0LWJveC1zaGFkb3cgKi9cblxuXG4vKiogc2VsZWN0aW9uLXdyYXBwZXIgY2xhc3MgKi9cbi5zZWxlY3Qtd3JhcHBlciB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG59XG5cbi5zZWxlY3Qtd3JhcHBlciB1bCB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIGJhY2tncm91bmQ6ICNmOWY5Zjk7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICB3aWR0aDogZml0LWNvbnRlbnQ7XG4gICAgcGFkZGluZy1ib3R0b206IDAuNXJlbTtcbiAgICBwYWRkaW5nLWxlZnQ6IDVweDtcbiAgICBwYWRkaW5nLXJpZ2h0OiA1cHg7XG4gICAgdG9wOiAyLjJyZW07XG4gICAgY29sb3I6IHJnYig1NSwgNTMsIDQ3KTtcbiAgICBwYWRkaW5nLXJpZ2h0OiAwLjMxMjVyZW07XG59XG5cbi5zZWxlY3Qtd3JhcHBlciB1bCBsaSB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgZ2FwOiAwLjYyNXJlbTtcbiAgICBwYWRkaW5nOiAwLjE4NzVyZW0gMC4zMTI1cmVtO1xuICAgIGJvcmRlci1yYWRpdXM6IDAuMTg3NXJlbTtcbiAgICB1c2VyLXNlbGVjdDogbm9uZSAhaW1wb3J0YW50O1xuICAgIGZvbnQtc2l6ZTogc21hbGwgIWltcG9ydGFudDtcbiAgICBmb250LXdlaWdodDogNTAwO1xufVxuXG4uc2VsZWN0LXdyYXBwZXIgdWwgbGkgc3BhbiB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIHdpZHRoOiBtYXgtY29udGVudDtcbn1cblxuLnNlbGVjdC13cmFwcGVyIHVsIGxpIC5vcHRpb24taW1hZ2Uge1xuICAgIHdpZHRoOiAxLjM3NXJlbTtcbiAgICBoZWlnaHQ6IDEuMzc1cmVtO1xuICAgIGNvbG9yOiAjMjQyNDI0O1xuICAgIHBhZGRpbmc6IDAgIWltcG9ydGFudDtcbiAgICBtYXJnaW46IDAgIWltcG9ydGFudDtcbn1cblxuLnNlbGVjdC13cmFwcGVyIHVsIGxpIC5vcHRpb24taW1hZ2Ugc3ZnIHtcbiAgICBjb2xvcjogIzRmNGY0ZjtcbiAgICBwYWRkaW5nOiAwICFpbXBvcnRhbnQ7XG4gICAgbWFyZ2luOiAwICFpbXBvcnRhbnQ7XG59XG5cbi5zZWxlY3Qtd3JhcHBlciB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIGNvbG9yOiByZ2IoMTIwLCAxMTksIDExNik7XG59XG5cbi5zZWxlY3Qtd3JhcHBlcj5idXR0b24ge1xuICAgIGNvbG9yOiByZ2JhKDU1LCA1MywgNDcsIDAuODUpO1xufVxuXG4uc2VsZWN0LXdyYXBwZXIgdWwgbGk+aDMge1xuICAgIG1hcmdpbjogMDtcbiAgICBmb250LXNpemU6IHNtYWxsICFpbXBvcnRhbnQ7XG4gICAgY29sb3I6ICMzNzM1MmZhNjtcbiAgICBtYXJnaW46IDA7XG4gICAgcGFkZGluZzogMDtcbiAgICBmb250LXdlaWdodDogNjAwICFpbXBvcnRhbnQ7XG4gICAgbWFyZ2luLXRvcDogMC4zMTI1cmVtO1xuICAgIG1hcmdpbi1ib3R0b206IDAuMzEyNXJlbTtcbn1cblxuLyoqIGVuZCBzZWxlY3Rpb24gd3JhcHBlciAqKi9cblxuXG5cbi8qKiBUZXh0IGZvcm1hdHRpbmcgQmFyICoqL1xuXG5cblxuLmZsb2F0aW5nLXRvb2xiYXIge1xuICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgICBwYWRkaW5nOiA4cHggMTZweDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjlmOWY5O1xuICAgIHdpZHRoOiBmaXQtY29udGVudDtcbiAgICB6LWluZGV4OiA5OTk5OTk7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHVzZXItc2VsZWN0OiBub25lO1xufVxuXG4vKiBUT0RPOiByZW1vdmUgdGhpcyovXG5zcGFuIHtcbiAgICBmb250LWZhbWlseTogQXJpYWwsIHNhbnMtc2VyaWY7XG59XG5cblxuLmZsb2F0aW5nLXRvb2xiYXIgLml0ZW0ge1xuICAgIGNvbG9yOiByZ2IoMTIwLCAxMTksIDExNik7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGdhcDogMTBweDtcbn1cblxuLmZsb2F0aW5nLXRvb2xiYXIgLml0ZW0+YnV0dG9uIHtcblxuICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG59XG5cblxuLmZsb2F0aW5nLXRvb2xiYXIgc2VsZWN0IHtcbiAgICBjb2xvcjogcmdiKDEyMCwgMTE5LCAxMTYpO1xuICAgIGJvcmRlcjogbm9uZTtcbiAgICBmb250LXNpemU6IDAuODVyZW07XG4gICAgYmFja2dyb3VuZC1jb2xvcjogaW5oZXJpdDtcbn1cblxuLnRleHQtZm9ybWF0dGluZy1zZWxlY3QtYnV0dG9uIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbn1cblxuI3R1cm5JbnRvQnV0dG9uIHNwYW4ge1xuICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBmb250LXNpemU6IDAuOXJlbTtcblxufVxuXG4jdHVybkludG9CdXR0b24gc3ZnIHVzZSB7XG4gICAgbWFyZ2luOiBhdXRvO1xufVxuXG5jb2RlOm5vdChwcmUgY29kZSkge1xuICAgIG1hcmdpbjogMDtcbiAgICBwYWRkaW5nOiAwO1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNkMGQwZDA7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2Y2ZjVmNDtcbiAgICBmb250LXNpemU6IGluaGVyaXQ7XG4gICAgZm9udC1zaXplOiAxcmVtICFpbXBvcnRhbnQ7XG4gICAgYm9yZGVyOiAxcHggc29saWQgIzAwMDAwMDFhO1xuICAgIHBhZGRpbmc6IDAgM3B4O1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbn1cblxuXG5cblxuLyogYTpub3QoW2hyZWZdKSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2QzZTNmZDtcbn0gKi9cblxuLnRleHQtZm9ybWF0dGluZy1idXR0b24tYWN0aXZlIHtcbiAgICBjb2xvcjogIzIzODJlMjtcbn1cblxuLnRleHQtZm9ybWF0dGluZy1jaXJjbGUtYWN0aXZlIHtcbiAgICBib3JkZXItY29sb3I6ICMyMzgyZTIgIWltcG9ydGFudDtcbn1cblxuXG5cbiNtb3JlVGV4dE9wdGlvblNlbGVjdCB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xufVxuXG4ubW9yZVRleHRPcHRpb25XcmFwcGVyIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG5cblxuLmJnYy1yZWQge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNGRERFREU7XG59XG5cbi5iZ2MtZ3JlZW4ge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNEN0Y3REM7XG59XG5cbi5iZ2MtYmx1ZSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI0Q5RURGNjtcbn1cblxuLmJnYy15ZWxsb3cge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNGQUY0RDE7XG59XG5cbi5iZ2MtZ3JleSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI0UxRTBFMDtcbn1cblxucCxcbm1hcmsge1xuICAgIGxpbmUtaGVpZ2h0OiAxO1xufVxuXG4jdHVybkludG9TZWxlY3QgLm9wdGlvbi1pbWFnZSB7XG4gICAgLyogZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OyAqL1xufVxuXG4uYm9yZGVyLWxlc3MtaW1hZ2Uge1xuICAgIHdpZHRoOiAyNHB4O1xuICAgIGhlaWdodDogMjRweDtcbn1cblxuXG5cblxuLyoqIEJsb2NrIE9wdGlvbnMgKiovXG5cbi5ibG9jay1vcHRpb25zLXdyYXBwZXIge1xuICAgIHotaW5kZXg6IDk5OTk5OTtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgZGlzcGxheTogbm9uZTtcbn1cblxuLmJsb2NrLW9wdGlvbnMge1xuICAgIHdpZHRoOiBmaXQtY29udGVudDtcbiAgICBtYXgtaGVpZ2h0OiAxOXJlbTtcbiAgICBvdmVyZmxvdy15OiBhdXRvO1xufVxuXG4uYmxvY2stb3B0aW9ucyB7XG4gICAgcGFkZGluZzogMCAwLjYyNXJlbTtcbiAgICBiYWNrZ3JvdW5kOiAjZjlmOWY5O1xufVxuXG4uYmxvY2stb3B0aW9ucyBzZWN0aW9uIGgyIHtcbiAgICBmb250LXNpemU6IHNtYWxsICFpbXBvcnRhbnQ7XG4gICAgY29sb3I6ICMzNzM1MmZhNjtcbiAgICBtYXJnaW46IDA7XG4gICAgcGFkZGluZzogMDtcbiAgICBmb250LXdlaWdodDogNjAwICFpbXBvcnRhbnQ7XG4gICAgbWFyZ2luLXRvcDogMC4zMTI1cmVtO1xuICAgIG1hcmdpbi1ib3R0b206IDAuMzEyNXJlbTtcbiAgICBwYWRkaW5nLWxlZnQ6IDAuMzEyNXJlbTtcbn1cblxuLmJsb2NrLW9wdGlvbnMgLm9wdGlvbiB7XG4gICAgcGFkZGluZzogMC4zMTI1cmVtIDAuNjI1cmVtO1xuICAgIG1hcmdpbjogMC4zMTI1cmVtIDA7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGp1c3RpZnktY29udGVudDogbGVmdDtcbiAgICBnYXA6IDAuNnJlbTtcbiAgICBib3JkZXItcmFkaXVzOiAzcHg7XG59XG5cbi5ibG9jay1vcHRpb25zIC5vcHRpb246Zm9jdXMge1xuICAgIG91dGxpbmU6IG5vbmU7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2U5ZTllOTtcbiAgICBib3JkZXI6IGluaGVyaXQ7XG59XG5cbi5vcHRpb24tZm9jdXNlZCB7XG4gICAgb3V0bGluZTogbm9uZTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTllOWU5O1xuICAgIGJvcmRlcjogbm9uZTtcbn1cblxuLmRhbmdlci1vcHRpb24ub3B0aW9uLWZvY3VzZWQsXG4uZGFuZ2VyLW9wdGlvbi5vcHRpb24tZm9jdXNlZCBzdmcge1xuICAgIGNvbG9yOiAjRUI1NzU3ICFpbXBvcnRhbnQ7XG59XG5cblxuXG4uYmxvY2stb3B0aW9ucyAub3B0aW9uOmZvY3VzLXZpc2libGUge1xuICAgIG91dGxpbmU6IG5vbmU7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2U5ZTllOTtcbiAgICBib3JkZXI6IGluaGVyaXQ7XG59XG5cbi8qIC5vcHRpb24taG92ZXI6aG92ZXIge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNlOWU5ZTk7XG4gICAgYm94LXNoYWRvdzogMHB4IDBweCAwcHggMnB4ICNlOWU5ZTk7XG4gICAgYm9yZGVyLXJhZGl1czogMXB4O1xuICAgIHRyYW5zaXRpb246IDAuMXMgZWFzZTtcbn0gKi9cblxuLyogLnNlbGVjdC13cmFwcGVyPmJ1dHRvbiwgKi9cblxuLyogI3R1cm5JbnRvQnV0dG9uLFxuI2NvbG9yVGV4dEJ1dHRvbiB7XG4gICAgcGFkZGluZy1sZWZ0OiA0cHg7XG59ICovXG5cbiNjb2xvclRleHRCdXR0b24ge1xuICAgIG1hcmdpbi1sZWZ0OiAwLjYyNXJlbTtcbn1cblxuI3R1cm5JbnRvQnV0dG9uOm5vdChbZGlzYWJsZWRdKTpob3ZlcixcbiNjb2xvclRleHRCdXR0b246bm90KFtkaXNhYmxlZF0pOmhvdmVyLFxuI21vcmVUZXh0T3B0aW9uQnV0dG9uOm5vdChbZGlzYWJsZWRdKTpob3Zlcixcbi5mbG9hdGluZy10b29sYmFyIC5pdGVtPmJ1dHRvbjpub3QoW2Rpc2FibGVkXSk6aG92ZXIge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNlOWU5ZTk7XG4gICAgYm94LXNoYWRvdzogMHB4IDBweCAwcHggMnB4ICNlOWU5ZTk7XG4gICAgYm9yZGVyLXJhZGl1czogMXB4O1xuICAgIHRyYW5zaXRpb246IDAuMXMgZWFzZTtcbn1cblxuXG5cbi5vcHRpb25bZm9jdXNlZD1cInRydWVcIl0ge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNiZGU0ZmY7XG59XG5cblxuXG5cblxuLm9wdGlvbi1pbWFnZSB7XG4gICAgd2lkdGg6IDIuODc1cmVtO1xuICAgIGhlaWdodDogMi44NzVyZW07XG4gICAgYm9yZGVyLXJhZGl1czogMC4xODc1cmVtO1xuICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7XG4gICAgY29sb3I6ICM0ZjRmNGY7XG5cbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmO1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG59XG5cbi5vcHRpb24taW1hZ2UgaW1nIHtcbiAgICBtYXgtd2lkdGg6IDIuODc1cmVtO1xuICAgIG1heC1oZWlnaHQ6IDIuODc1cmVtO1xufVxuXG4ub3B0aW9uLWltYWdlIHN2ZyB7XG4gICAgbWFyZ2luOiAwO1xuICAgIHBhZGRpbmc6IDA7XG4gICAgcGFkZGluZzogMC42MjVyZW07XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcblxufVxuXG4ub3B0aW9uLXRleHQgKiB7XG4gICAgbWFyZ2luOiAwO1xuICAgIHBhZGRpbmc6IDA7XG5cbn1cblxuLm9wdGlvbi10ZXh0IC5ibG9jay10aXRsZSB7XG4gICAgZm9udC1zaXplOiBzbWFsbCAhaW1wb3J0YW50O1xuICAgIGZvbnQtd2VpZ2h0OiA1MDA7XG59XG5cbi5vcHRpb24tdGV4dCAuYmxvY2stZGVzY3JpcHRpb24ge1xuICAgIGZvbnQtc2l6ZTogc21hbGwgIWltcG9ydGFudDtcbiAgICBjb2xvcjogcmdiYSg1NSwgNTMsIDQ3LCAwLjUpO1xufVxuXG4vKiogRW5kIEJsb2NrIE9wdGlvbnMgKiovXG5cblxuXG4jZGVsZXRlQmxvY2tCdXR0b246aG92ZXIgc3ZnLFxuI2RlbGV0ZUJsb2NrQnV0dG9uOmhvdmVyIHtcbiAgICBjb2xvcjogcmdiKDIzNSwgODcsIDg3KSAhaW1wb3J0YW50O1xufVxuXG5cblxuLmpvaGFubmVzLWVkaXRvciAqOjpzZWxlY3Rpb24ge1xuICAgIC8qIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMjExLCAyMjcsIDI1MywgMC41KSAhaW1wb3J0YW50OyAqL1xuXG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmVkO1xuXG4gICAgYmFja2dyb3VuZC1jb2xvcjogaHNsKDIxMCA3NSUgNTAlIC8gMSk7XG4gICAgY29sb3I6IHdoaXRlO1xufVxuXG4uam9oYW5uZXMtZWRpdG9yIG1hcmssXG4uam9oYW5uZXMtZWRpdG9yICoge1xuICAgIGxpbmUtaGVpZ2h0OiAxLjUgIWltcG9ydGFudDtcbn1cblxuLm9wdGlvbiB7XG4gICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xufVxuXG4udGV4dC1vcHRpb24ge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHN0YXJ0O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgZ2FwOiAwLjYyNXJlbTtcbn1cblxuXG5cblxuOnJvb3Qge1xuICAgIC8qIGZvbnQtc2l6ZTogMTZweDsgKi9cbiAgICAvKiBUYW1hbmhvIHBhZHLDo28gKi9cbn1cblxuLyogUGFyYSB0ZWxhcyBjb20gZGVuc2lkYWRlIG3DqWRpYSAqL1xuQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAoLXdlYmtpdC1taW4tZGV2aWNlLXBpeGVsLXJhdGlvOiAyKSxcbm9ubHkgc2NyZWVuIGFuZCAobWluLS1tb3otZGV2aWNlLXBpeGVsLXJhdGlvOiAyKSxcbm9ubHkgc2NyZWVuIGFuZCAobWluLXJlc29sdXRpb246IDE5MmRwaSksXG5vbmx5IHNjcmVlbiBhbmQgKG1pbi1yZXNvbHV0aW9uOiAyZHBweCkge1xuICAgIDpyb290IHtcbiAgICAgICAgZm9udC1zaXplOiAxOHB4O1xuICAgICAgICAvKiBBdW1lbnRhIG8gdGFtYW5obyBkYSBmb250ZSBwYXJhIHRlbGFzIGRlIGFsdGEgZGVuc2lkYWRlICovXG4gICAgfVxufVxuXG4vKiBQYXJhIHRlbGFzIGNvbSBhbHTDrXNzaW1hIGRlbnNpZGFkZSAqL1xuQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAoLXdlYmtpdC1taW4tZGV2aWNlLXBpeGVsLXJhdGlvOiAzKSxcbm9ubHkgc2NyZWVuIGFuZCAobWluLS1tb3otZGV2aWNlLXBpeGVsLXJhdGlvOiAzKSxcbm9ubHkgc2NyZWVuIGFuZCAobWluLXJlc29sdXRpb246IDI4OGRwaSksXG5vbmx5IHNjcmVlbiBhbmQgKG1pbi1yZXNvbHV0aW9uOiAzZHBweCkge1xuICAgIDpyb290IHtcbiAgICAgICAgZm9udC1zaXplOiAyMHB4O1xuICAgICAgICAvKiBBaW5kYSBtYWlvciBwYXJhIHRlbGFzIGRlIGRlbnNpZGFkZSBtdWl0byBhbHRhICovXG4gICAgfVxufVxuXG5cblxuXG5cblxuXG5cblxuXG5cbnRhYmxlLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCB7XG4gICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTtcbiAgICBtYXgtd2lkdGg6IGluaGVyaXQ7XG4gICAgd2lkdGg6IGF1dG87XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94ICFpbXBvcnRhbnQ7XG59XG5cbnRhYmxlLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCB0aCxcbnRhYmxlLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCB0ZCB7XG4gICAgbWluLWhlaWdodDogMjBweDtcbn1cblxudGFibGUuam9oYW5uZXMtY29udGVudC1lbGVtZW50IHRoLFxudGFibGUuam9oYW5uZXMtY29udGVudC1lbGVtZW50IHRkIHtcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjODQ4ODhkO1xuICAgIHBhZGRpbmc6IDhweDtcbiAgICB0ZXh0LWFsaWduOiBsZWZ0O1xuICAgIGFsaWduLWl0ZW1zOiBzdGFydDtcbiAgICBvdmVyZmxvdy13cmFwOiBicmVhay13b3JkO1xuICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDtcbiAgICB3aGl0ZS1zcGFjZTogbm9ybWFsO1xuICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7XG4gICAgbWluLXdpZHRoOiAxMDBweDtcbiAgICBtYXgtd2lkdGg6IDIwMHB4O1xuICAgIC8qIGJveC1zaXppbmc6IGJvcmRlci1ib3ggIWltcG9ydGFudDsgKi9cblxuICAgIHRyYW5zaXRpb246IGJvcmRlciAxMDBtcyBlYXNlLW91dCwgYm94LXNoYWRvdyAxMDBtcyBlYXNlLW91dDtcblxufVxuXG50YWJsZS5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQgdGQuc2VsZWN0ZWQsXG50YWJsZS5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQgdGQ6Zm9jdXMge1xuICAgIG91dGxpbmU6IG5vbmU7XG4gICAgYm94LXNoYWRvdzogMCAwIDAgMXB4ICM3NGI2ZGIgaW5zZXQ7XG4gICAgYm9yZGVyOiAxcHggZG91YmxlICM3NGI2ZGI7XG5cbn1cblxudGQge1xuICAgIG1pbi1oZWlnaHQ6IDFyZW0gIWltcG9ydGFudDtcbiAgICBsaW5lLWhlaWdodDogMXJlbTtcbn1cblxudGQ6OnBsYWNlaG9sZGVyIHtcbiAgICBkaXNwbGF5OiBibG9jaztcbn1cblxudGQ6ZW1wdHk6YmVmb3JlIHtcbiAgICBjb250ZW50OiBhdHRyKGRhdGEtcGxhY2Vob2xkZXIpO1xuICAgIGNvbG9yOiAjODQ4ODhhY2Q7XG4gICAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDtcbiAgICBvcGFjaXR5OiAwO1xufVxuXG4udGFibGUtd3JhcHBlciB7XG4gICAgd2lkdGg6IDEwMCU7XG59XG5cbi50YWJsZS1jb250cm9sbGVyIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgbWF4LXdpZHRoOiAxMDAlO1xufVxuXG4uYWRkLXRhYmxlLXJvdyB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSg1NSwgNTMsIDQ3LCAwLjA2KTtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBwYWRkaW5nOiAwO1xuICAgIG1hcmdpbjogMDtcbiAgICBtYXJnaW4tdG9wOiAwLjM3NXJlbTtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgIGhlaWdodDogMXJlbTtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgb3BhY2l0eTogMDtcbiAgICB1c2VyLXNlbGVjdDogbm9uZTtcbn1cblxuLmFkZC10YWJsZS1jb2x1bW4ge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICByaWdodDogLTEuMzEyNXJlbTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDU1LCA1MywgNDcsIDAuMDYpO1xuICAgIHdpZHRoOiAxcmVtO1xuICAgIHBhZGRpbmc6IDA7XG4gICAgbWFyZ2luOiAwO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgaGVpZ2h0OiAxMDAlO1xuICAgIHRvcDogMDtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgaGVpZ2h0OiBjYWxjKDEwMCUgLSAxcmVtIC0gNXB4KTtcbiAgICBvcGFjaXR5OiAwO1xuICAgIHVzZXItc2VsZWN0OiBub25lO1xufVxuXG4uYWRkLXRhYmxlLWNvbHVtbjpob3ZlciB7XG4gICAgb3BhY2l0eTogMTtcbn1cblxuLmFkZC10YWJsZS1yb3c6aG92ZXIge1xuICAgIG9wYWNpdHk6IDE7XG59XG5cbi50YWJsZS1zaGVsbCB7XG4gICAgbWF4LXdpZHRoOiAxMDAlO1xufVxuXG5cblxuLnRhYmxlLW9wdGlvbiB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XG4gICAgd2lkdGg6IGZpdC1jb250ZW50O1xuICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgICBwYWRkaW5nOiA4cHggMTZweDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjlmOWY5O1xuICAgIHdpZHRoOiBmaXQtY29udGVudDtcbiAgICB6LWluZGV4OiA5OTk5OTk7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgIHBhZGRpbmc6IDhweCAxNnB4O1xuICAgIGRpc3BsYXk6IG5vbmU7XG59XG5cblxuXG5cbi8qKiBDYWxsb3V0ICoqL1xuLmNhbGxvdXQ6aG92ZXIgLm9wdGlvbnMtYnV0dG9uIHtcbiAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50O1xufVxuXG5cbi5uby1zZWxlY3Rpb24ge1xuICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgLW1vei11c2VyLXNlbGVjdDogbm9uZTtcbiAgICB1c2VyLXNlbGVjdDogbm9uZTtcbn1cblxuXG4vKiogdXBsb2FkL2VtYmVkICoqL1xuXG4udGFiLWNvbnRhaW5lciB7XG4gICAgZm9udC1zaXplOiAwLjg2cmVtO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICB0cmFuc2l0aW9uOiAwLjFzIGVhc2U7XG5cbiAgICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lO1xuICAgIC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgdXNlci1zZWxlY3Q6IG5vbmU7XG5cbiAgICB0cmFuc2l0aW9uOiB2aXNpYmlsaXR5IDAuMnMgZWFzZTtcblxufVxuXG4ubmF2LXVuZGVybGluZSB7XG4gICAgbWFyZ2luOiAwO1xuICAgIHBhZGRpbmc6IDA7XG4gICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHJnYmEoNTUsIDUzLCA0NywgMC4xNik7XG4gICAgcGFkZGluZzogMTBweCAyMHB4O1xufVxuXG4ubmF2LXVuZGVybGluZSAubmF2LWl0ZW0ge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgbWFyZ2luLXJpZ2h0OiAxNXB4O1xufVxuXG4ubmF2LXVuZGVybGluZSAubmF2LWxpbmsge1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gICAgY29sb3I6IHJnYig1NSwgNTMsIDQ3KTtcbiAgICBjb2xvcjogcmdiYSg1NSwgNTMsIDQ3LCAwLjUpO1xuICAgIHRyYW5zaXRpb246IDAuMXMgZWFzZTtcbn1cblxuXG4ubmF2LWl0ZW0uYWN0aXZlIC5uYXYtbGluayB7XG4gICAgY29sb3I6ICMwMDA7XG59XG5cbi50YWItY29udGVudCAuY29udGVudC1kYXRhIHtcbiAgICBkaXNwbGF5OiBub25lO1xuICAgIHBhZGRpbmc6IDIwcHg7XG4gICAgYm9yZGVyLXRvcDogbm9uZTtcbiAgICB0cmFuc2l0aW9uOiAwLjFzIGVhc2U7XG59XG5cbi50YWItY29udGVudCAuY29udGVudC1kYXRhLmFjdGl2ZSB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICBnYXA6IDFyZW07XG59XG5cbi50YWItY29udGVudCAudGV4dC1pbmZvIHtcbiAgICBmb250LXNpemU6IDAuNzVyZW07XG4gICAgY29sb3I6IHJnYmEoNTUsIDUzLCA0NywgMC42KTtcbn1cblxuLm5hdi11bmRlcmxpbmUgLm5hdi1pdGVtIHtcbiAgICBkaXNwbGF5OiBpbmxpbmU7XG59XG5cblxuLnRhYi1jb250YWluZXIge1xuICAgIHdpZHRoOiBmaXQtY29udGVudDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjQ5LCAyNDksIDI0OSk7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuXG59XG5cbi5lbWJlZC1jb250ZW50IGlucHV0IHtcbiAgICB3aWR0aDogMjByZW07XG4gICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSg1NSwgNTMsIDQ3LCAwLjE2KTtcbiAgICBoZWlnaHQ6IDEuNXJlbTtcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgcGFkZGluZy1sZWZ0OiAxMHB4O1xufVxuXG5cbi51cGxvYWQtY29udGVudCBsYWJlbCB7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSg1NSwgNTMsIDQ3LCAwLjE2KTtcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgd2lkdGg6IDIwcmVtO1xuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICBwYWRkaW5nOiA0cHg7XG4gICAgY29sb3I6IHJnYig1NSwgNTMsIDQ3KTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICAgIC8qIHRyYW5zaXRpb246IDAuMXMgZWFzZTsgKi9cbn1cblxuLnVwbG9hZC1jb250ZW50IGxhYmVsOmhvdmVyIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWVlZWVlO1xufVxuXG5cblxuXG5cblxuXG5cblxuXG4vKiBFc3RpbG8gcGFyYSBhcyBhbMOnYXMgZGUgcmVkaW1lbnNpb25hbWVudG8gKi9cbi5yZXNpemUtaGFuZGxlIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgd2lkdGg6IDEwcHg7XG4gICAgaGVpZ2h0OiAxMHB4O1xuICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC41KTtcbiAgICBjdXJzb3I6IG53c2UtcmVzaXplO1xuICAgIC8qIEN1cnNvciBkZSByZWRpbWVuc2lvbmFtZW50byBkaWFnb25hbCAqL1xufVxuXG4ucmVzaXplLWhhbmRsZS5zZSB7XG4gICAgYm90dG9tOiAwO1xuICAgIHJpZ2h0OiAwO1xufVxuXG5cblxuXG4uZW1iZWQtY29udGFpbmVyIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgcGFkZGluZy1ib3R0b206IDU2LjI1JTtcbiAgICAvKiBQcm9wb3LDp8OjbyAxNjo5ICovXG4gICAgaGVpZ2h0OiAwO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG59XG5cbi5lbWJlZC1jb250YWluZXIgaWZyYW1lIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdG9wOiAwO1xuICAgIGxlZnQ6IDA7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiAxMDAlO1xufVxuXG5cblxuLnZpZGVvLWNvbnRhaW5lciB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIHBhZGRpbmctYm90dG9tOiA1Ni4yNSU7XG4gICAgLyogUHJvcG9yw6fDo28gMTY6OSAqL1xuICAgIGhlaWdodDogMDtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xufVxuXG4udmlkZW8tY29udGFpbmVyIGlmcmFtZSB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHRvcDogMDtcbiAgICBsZWZ0OiAwO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGhlaWdodDogMTAwJTtcbn1cblxuXG5cblxuXG5cblxuLnJlc2l6YWJsZSB7XG4gICAgcmVzaXplOiBob3Jpem9udGFsO1xuICAgIG92ZXJmbG93OiBhdXRvO1xuICAgIGN1cnNvcjogbmVzdy1yZXNpemU7XG59XG5cbi5iYWNrZ3JvdW5kIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTdlNmUzO1xufWAsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vc3JjL2Fzc2V0cy9jc3MvbWFpbi5jc3NcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIkFBQUEsa0JBQWtCO0FBQ2xCO0lBQ0ksdUJBQXVCO0FBQzNCOzs7O0FBSUEsZUFBZTs7QUFFZjtJQUNJLFlBQVk7SUFDWixTQUFTO0lBQ1QsVUFBVTtJQUNWLFdBQVc7SUFDWCxpQkFBaUI7SUFDakIsdUJBQXVCO0lBQ3ZCLGNBQWM7SUFDZCxhQUFhO0lBQ2IsbUJBQW1CO0lBQ25CLCtCQUErQjtJQUMv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QWU7QUFDbkI7OztBQUdBO0lBQ0ksa0JBQWtCO0lBQ2xCLG9DQUFvQztJQUNwQyxrQkFBa0I7O0FBRXRCOztBQUVBO0lBQ0ksWUFBWTtJQUNaLHdDQUF3QztJQUN4QyxjQUFjO0lBQ2Qsa0JBQWtCO0lBQ2xCLGtCQUFrQjtBQUN0Qjs7O0FBR0E7SUFDSSxjQUFjO0lBQ2Qsd0NBQXdDO0lBQ3hDLGtCQUFrQjtJQUNsQixZQUFZO0lBQ1osa0JBQWtCO0lBQ2xCLFlBQVk7SUFDWixzQkFBc0I7SUFDdEIsc0JBQXNCO0lBQ3RCLDJCQUEyQjtBQUMvQjs7QUFFQTtJQUNJLHlCQUF5QjtBQUM3Qjs7Ozs7Ozs7Ozs7QUFXQSw4Q0FBOEM7QUFDOUM7SUFDSSxrQkFBa0I7SUFDbEIsV0FBVztJQUNYLFlBQVk7SUFDWiw4QkFBOEI7SUFDOUIsbUJBQW1CO0lBQ25CLHlDQUF5QztBQUM3Qzs7QUFFQTtJQUNJLFNBQVM7SUFDVCxRQUFRO0FBQ1o7Ozs7O0FBS0E7SUFDSSxrQkFBa0I7SUFDbEIsV0FBVztJQUNYLHNCQUFzQjtJQUN0QixtQkFBbUI7SUFDbkIsU0FBUztJQUNULGdCQUFnQjtBQUNwQjs7QUFFQTtJQUNJLGtCQUFrQjtJQUNsQixNQUFNO0lBQ04sT0FBTztJQUNQLFdBQVc7SUFDWCxZQUFZO0FBQ2hCOzs7O0FBSUE7SUFDSSxrQkFBa0I7SUFDbEIsV0FBVztJQUNYLHNCQUFzQjtJQUN0QixtQkFBbUI7SUFDbkIsU0FBUztJQUNULGdCQUFnQjtBQUNwQjs7QUFFQTtJQUNJLGtCQUFrQjtJQUNsQixNQUFNO0lBQ04sT0FBTztJQUNQLFdBQVc7SUFDWCxZQUFZO0FBQ2hCOzs7Ozs7OztBQVFBO0lBQ0ksa0JBQWtCO0lBQ2xCLGNBQWM7SUFDZCxtQkFBbUI7QUFDdkI7O0FBRUE7SUFDSSx5QkFBeUI7QUFDN0JcIixcInNvdXJjZXNDb250ZW50XCI6W1wiLyoqIGN1cnNvciBzdHlsZSAqL1xcbltjb250ZW50ZWRpdGFibGU9XFxcInRydWVcXFwiXSB7XFxuICAgIGN1cnNvcjogdGV4dCAhaW1wb3J0YW50O1xcbn1cXG5cXG5cXG5cXG4vKiogQ1NTIHJlc2V0ICovXFxuXFxuLmJ1dHRvbi1yZXNldCB7XFxuICAgIGJvcmRlcjogbm9uZTtcXG4gICAgbWFyZ2luOiAwO1xcbiAgICBwYWRkaW5nOiAwO1xcbiAgICB3aWR0aDogYXV0bztcXG4gICAgb3ZlcmZsb3c6IHZpc2libGU7XFxuICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xcbiAgICBjb2xvcjogaW5oZXJpdDtcXG4gICAgZm9udDogaW5oZXJpdDtcXG4gICAgbGluZS1oZWlnaHQ6IG5vcm1hbDtcXG4gICAgLXdlYmtpdC1mb250LXNtb290aGluZzogaW5oZXJpdDtcXG4gICAgLW1vei1vc3gtZm9udC1zbW9vdGhpbmc6IGluaGVyaXQ7XFxuICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTtcXG59XFxuXFxuXFxuXFxuLyoqIGFkZCBibG9jayAqL1xcbi5hZGQtYmxvY2sge1xcbiAgICBtYXJnaW46IDA7XFxuICAgIHBhZGRpbmc6IDA7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjMDAwO1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcXG4gICAgdHJhbnNpdGlvbjogYWxsIDAuM3MgZWFzZTtcXG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXG4gICAgbWFyZ2luLWxlZnQ6IDEuM3JlbTtcXG59XFxuXFxuLmFkZC1ibG9jay13cmFwcGVyIHtcXG4gICAgd2lkdGg6IDEwMCU7XFxuICAgIGhlaWdodDogMy4xMjVyZW07XFxufVxcblxcbi5hZGQtYmxvY2std3JhcHBlcjpob3ZlciAuYWRkLWJsb2NrIHtcXG4gICAgZGlzcGxheTogZmxleDtcXG59XFxuXFxuLyoqIGFuZCBhZGQgYmxvY2sgKi9cXG5cXG5cXG5cXG4vKiogTGlzdCAgKiovXFxub2wuam9oYW5uZXMtY29udGVudC1lbGVtZW50LFxcbnVsLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCB7XFxuICAgIHBhZGRpbmctbGVmdDogMXJlbSAhaW1wb3J0YW50O1xcbn1cXG5cXG5cXG5cXG4uam9oYW5uZXMtY29udGVudC1lbGVtZW50IGxpPmJ1dHRvbiB7XFxuICAgIC8qIGRpc3BsYXk6IG5vbmU7ICovXFxuICAgIGRpc3BsYXk6IG5vbmU7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgbWFyZ2luLWxlZnQ6IDEwcHg7XFxuICAgIHRvcDogMDtcXG5cXG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcXG4gICAgYWxpZ24taXRlbXM6IHN0YXJ0O1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHN0YXJ0O1xcblxcbn1cXG5cXG4uam9oYW5uZXMtY29udGVudC1lbGVtZW50IGxpIHtcXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xcbn1cXG5cXG4uam9oYW5uZXMtY29udGVudC1lbGVtZW50IGxpOjpiZWZvcmUge1xcbiAgICBtYXJnaW4tbGVmdDogMC4zMTI1cmVtO1xcbn1cXG5cXG4uam9oYW5uZXMtY29udGVudC1lbGVtZW50IGxpOmhvdmVyPmJ1dHRvbiB7XFxuICAgIC8qIGRpc3BsYXk6IGlubGluZS1ibG9jazsgKi9cXG4gICAgZGlzcGxheTogaW5saW5lLWZsZXg7XFxuXFxufVxcblxcbnAuam9oYW5uZXMtY29udGVudC1lbGVtZW50IHtcXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbiAgICBsaW5lLWhlaWdodDogMTtcXG4gICAgbWFyZ2luOiAwO1xcbiAgICBwYWRkaW5nOiAwO1xcbn1cXG5cXG4uam9oYW5uZXMtY29udGVudC1lbGVtZW50IC5jaGVja2JveC1saXN0IHtcXG4gICAgbGlzdC1zdHlsZS10eXBlOiBub25lO1xcbiAgICBwYWRkaW5nLWxlZnQ6IDAgIWltcG9ydGFudDtcXG59XFxuXFxuXFxuLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCAuY2hlY2tib3gtbGlzdCBsaSB7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XFxuICAgIGp1c3RpZnktY29udGVudDogbGVmdDtcXG59XFxuXFxuXFxuLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCB1bC5jaGVja2JveC1saXN0IGlucHV0W3R5cGU9XFxcImNoZWNrYm94XFxcIl06Y2hlY2tlZCtzcGFuIHtcXG4gICAgdGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7XFxufVxcblxcbi8qIHVsLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudDpub3QoLmNoZWNrYm94LWxpc3QpLFxcbm9sLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudDpub3QoLmNoZWNrYm94LWxpc3QpIHtcXG4gICAgcGFkZGluZy1sZWZ0OiAxLjVyZW0gIWltcG9ydGFudDtcXG59ICovXFxuXFxuLyoqIEFkZCBsaW5lIHRocm91Z2ggdGV4dCBkZWNvcmF0aW9uIHRvIGNoZWNrZWQgY2hlY2tib3hlcyB0ZXh0IGRpdiAqL1xcbi5ibG9jayBpbnB1dFt0eXBlPVxcXCJjaGVja2JveFxcXCJdOmNoZWNrZWQrZGl2IHtcXG4gICAgdGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7XFxufVxcblxcbi8qKiBSZW1vdmUgdGhlIGRlZmF1bHQgbGlzdCBzdHlsZSBhbmQgcmVwbGFjZSBieSBhbm90aGVyIHRoYXQgd29ya3Mgd2l0aCBkaXNwbGF5IGZsZXggKi9cXG4uYmxvY2sgb2wsXFxuLmJsb2NrIHVsIHtcXG4gICAgbGlzdC1zdHlsZTogbm9uZTtcXG59XFxuXFxuLmJsb2NrIHVsIC5saXN0LWl0ZW0sXFxuLmJsb2NrIG9sIC5saXN0LWl0ZW0ge1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xcbn1cXG5cXG4uYmxvY2sgb2wgbGkge1xcbiAgICBjb3VudGVyLWluY3JlbWVudDogaXRlbTtcXG59XFxuXFxuLmJsb2NrIG9sIGxpOjpiZWZvcmUge1xcbiAgICBjb250ZW50OiBjb3VudGVyKGl0ZW0pIFxcXCIuIFxcXCI7XFxuICAgIG1hcmdpbi1yaWdodDogMC4zMTI1cmVtO1xcbn1cXG5cXG4uYmxvY2sgdWwgbGk6bm90KC5saXN0LWl0ZW0tY2hlY2thYmxlKTo6YmVmb3JlIHtcXG4gICAgY29udGVudDogXFxcIuKAoiBcXFwiO1xcbiAgICBtYXJnaW4tcmlnaHQ6IDAuMzEyNXJlbTtcXG59XFxuXFxuXFxuXFxuLyoqIGFuZCBsaXN0ICoqL1xcblxcblxcblxcbi5ibG9jaz4uZHJhZy1oYW5kbGVyIHtcXG4gICAgY29sb3I6ICM4NDg4OGQ7XFxuICAgIHZpc2liaWxpdHk6IGhpZGRlbjtcXG4gICAgY3Vyc29yOiBncmFiO1xcbiAgICBhbGlnbi1zZWxmOiBzdGFydDtcXG5cXG4gICAgLyogYmFja2dyb3VuZC1jb2xvcjogcGluazsgKi9cXG4gICAgcGFkZGluZy10b3A6IDAuMzNyZW07XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG59XFxuXFxuLmRyYWctaGFuZGxlciBzdmcge1xcbiAgICAvKiBiYWNrZ3JvdW5kLWNvbG9yOiByZWQ7ICovXFxufVxcblxcbi5kcmFnLWhhbmRsZXIgc3ZnIHVzZSB7XFxuICAgIC8qIGJhY2tncm91bmQtY29sb3I6IGJsdWU7ICovXFxufVxcblxcbi5kcmFnLWhhbmRsZXI6YWN0aXZlIHtcXG4gICAgY3Vyc29yOiBncmFiYmluZztcXG59XFxuXFxuLmJsb2NrIHtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcXG4gICAgbWFyZ2luLWJvdHRvbTogMXJlbTtcXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xcbiAgICBtYXgtd2lkdGg6IDEwMCU7XFxufVxcblxcbi5ibG9jaz4qOm5vdCguZHJhZy1oYW5kbGVyKSB7XFxuICAgIHBhZGRpbmctbGVmdDogMS4yNXJlbSAhaW1wb3J0YW50O1xcbn1cXG5cXG4uYmxvY2s6aG92ZXIgLmRyYWctaGFuZGxlciB7XFxuICAgIHZpc2liaWxpdHk6IHZpc2libGU7XFxuICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7XFxuICAgIGp1c3RpZnktY29udGVudDogc3RhcnQ7XFxufVxcblxcbi5kcm9wLWxpbmUge1xcbiAgICBoZWlnaHQ6IDFyZW07XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICM4NDg4OGQ7XFxuICAgIHdpZHRoOiAxMDAlO1xcbn1cXG5cXG5cXG4udGl0bGUgaDEge1xcbiAgICBtYXJnaW4tbGVmdDogMS4zcmVtO1xcbn1cXG5cXG5cXG5bY29udGVudGVkaXRhYmxlPVxcXCJ0cnVlXFxcIl06ZW1wdHk6Zm9jdXMge1xcbiAgICBjb250ZW50OiBhdHRyKGRhdGEtcGxhY2Vob2xkZXIpO1xcbiAgICBjb2xvcjogIzg0ODg4ZDtcXG4gICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XFxufVxcblxcbmgxW2RhdGEtcGxhY2Vob2xkZXJdOmVtcHR5OmJlZm9yZSB7XFxuICAgIGNvbnRlbnQ6IGF0dHIoZGF0YS1wbGFjZWhvbGRlcik7XFxuICAgIGNvbG9yOiAjODQ4ODhkICFpbXBvcnRhbnQ7XFxuICAgIGRpc3BsYXk6IGJsb2NrO1xcbn1cXG5cXG5oMVtkYXRhLXBsYWNlaG9sZGVyXTpmb2N1czpiZWZvcmUge31cXG5cXG5cXG4qW2NvbnRlbnRlZGl0YWJsZT1cXFwidHJ1ZVxcXCJdOm5vdChoMSk6ZW1wdHk6YmVmb3JlIHtcXG4gICAgY29udGVudDogYXR0cihkYXRhLXBsYWNlaG9sZGVyKTtcXG4gICAgY29sb3I6ICM4NDg4OGFjZDtcXG4gICAgZGlzcGxheTogbm9uZTtcXG59XFxuXFxuKltjb250ZW50ZWRpdGFibGU9XFxcInRydWVcXFwiXTpub3QoaDEpOmVtcHR5OmhvdmVyOmJlZm9yZSB7XFxuICAgIGRpc3BsYXk6IGJsb2NrO1xcbn1cXG5cXG5jaXRlW2NvbnRlbnRlZGl0YWJsZT1cXFwidHJ1ZVxcXCJdOmVtcHR5OmJlZm9yZSB7XFxuICAgIGRpc3BsYXk6IGJsb2NrO1xcbn1cXG5cXG4qW2NvbnRlbnRlZGl0YWJsZT1cXFwidHJ1ZVxcXCJdOm5vdChoMSlbZGF0YS1wbGFjZWhvbGRlcl06ZW1wdHk6Zm9jdXM6YmVmb3JlIHtcXG4gICAgY29udGVudDogYXR0cihkYXRhLXBsYWNlaG9sZGVyKTtcXG4gICAgY29sb3I6ICM4NDg4OGFjZCAhaW1wb3J0YW50O1xcbiAgICBkaXNwbGF5OiBibG9jaztcXG59XFxuXFxuXFxuXFxuaDEge1xcbiAgICBmb250LXNpemU6IDIuNXJlbTtcXG4gICAgZm9udC13ZWlnaHQ6IGJvbGRlciAhaW1wb3J0YW50O1xcbn1cXG5cXG4uam9oYW5uZXMtZWRpdG9yIHtcXG4gICAgd2lkdGg6IDEwMCU7XFxuXFxufVxcblxcbi5jb250ZW50IHtcXG4gICAgd2lkdGg6IDEwMCU7XFxuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxuICAgIC8qIGJhY2tncm91bmQtY29sb3I6IHJlZDsgKi9cXG59XFxuXFxuLmNvbnRlbnQgLmJsb2NrIC50YWJsZS13cmFwcGVyIHtcXG4gICAgb3ZlcmZsb3cteDogYXV0bztcXG4gICAgb3ZlcmZsb3cteTogaGlkZGVuO1xcbn1cXG5cXG5cXG5wcmUge1xcbiAgICB3aWR0aDogMTAwJTtcXG59XFxuXFxuW2NvbnRlbnRlZGl0YWJsZV0ge1xcbiAgICBvdXRsaW5lOiBub25lO1xcbn1cXG5cXG5ib2R5IHtcXG4gICAgaGVpZ2h0OiAyMDAwcHg7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNmMGYwZjEgIWltcG9ydGFudDtcXG5cXG4gICAgZm9udC1mYW1pbHk6IHN5c3RlbS11aSwgLWFwcGxlLXN5c3RlbSwgXFxcIlNlZ29lIFVJXFxcIiwgUm9ib3RvLCBcXFwiSGVsdmV0aWNhIE5ldWVcXFwiLCBcXFwiTm90byBTYW5zXFxcIiwgXFxcIkxpYmVyYXRpb24gU2Fuc1xcXCIsIEFyaWFsLCBzYW5zLXNlcmlmLCBcXFwiQXBwbGUgQ29sb3IgRW1vamlcXFwiLCBcXFwiU2Vnb2UgVUkgRW1vamlcXFwiLCBcXFwiU2Vnb2UgVUkgU3ltYm9sXFxcIiwgXFxcIk5vdG8gQ29sb3IgRW1vamlcXFwiO1xcbn1cXG5cXG5cXG4uZWRpdG9yIHtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgbWFyZ2luLXRvcDogODBweDtcXG59XFxuXFxucCB7XFxuICAgIGNvbG9yOiAjMjQyNDI0O1xcbn1cXG5cXG5cXG4uYmxvY2ssXFxuLmJsb2NrICoge1xcbiAgICB1c2VyLXNlbGVjdDogdGV4dDtcXG59XFxuXFxuXFxuLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCB7XFxuICAgIHdpZHRoOiAxMDAlO1xcbiAgICBwYWRkaW5nOiAwO1xcbiAgICBtYXJnaW46IDA7XFxuICAgIC8qIGJhY2tncm91bmQtY29sb3I6IGdyZWVuOyAqL1xcbn1cXG5cXG5cXG4jam9oYW5uZXNFZGl0b3Ige1xcbiAgICB3aWR0aDogNjAlO1xcbiAgICBtYXJnaW4tbGVmdDogYXV0bztcXG4gICAgbWFyZ2luLXJpZ2h0OiBhdXRvO1xcbn1cXG5cXG4uam9oYW5uZXMtZWRpdG9yIGhyIHtcXG4gICAgd2lkdGg6IDEwMCU7XFxuICAgIGhlaWdodDogMnB4O1xcbiAgICB2aXNpYmlsaXR5OiB2aXNpYmxlO1xcbiAgICBib3JkZXI6IG5vbmU7XFxuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2JhKDU1LCA1MywgNDcsIDAuMTYpO1xcbn1cXG5cXG5cXG5cXG4uam9oYW5uZXMtZWRpdG9yIGJsb2NrcXVvdGUge1xcbiAgICBtYXJnaW46IDAuNXJlbSAwO1xcbiAgICBwYWRkaW5nLWxlZnQ6IDIwcHg7XFxuICAgIGJvcmRlci1sZWZ0OiA0cHggc29saWQgcmdiKDU1LCA1MywgNDcpO1xcbiAgICBmb250LXN0eWxlOiBpdGFsaWNcXG59XFxuXFxuLmpvaGFubmVzLWVkaXRvciBjaXRlIHtcXG4gICAgcGFkZGluZy10b3A6IDFyZW0gIWltcG9ydGFudDtcXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbn1cXG5cXG5cXG4uam9oYW5uZXMtZWRpdG9yIGNpdGU6OmJlZm9yZSB7XFxuICAgIGNvbnRlbnQ6ICfigJQgJztcXG59XFxuXFxuXFxuXFxuXFxuXFxuXFxuXFxuXFxuXFxuXFxuXFxuXFxuXFxuXFxuXFxuXFxuXFxuXFxuXFxuXFxuXFxuXFxuXFxuXFxuXFxuXFxuXFxuXFxuXFxuXFxuXFxuI2xpbmtCb3gge1xcbiAgICBib3JkZXItcmFkaXVzOiAycHg7XFxuICAgIHBhZGRpbmc6IDIwcHg7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNmOWY5Zjk7XFxuXFxuXFxuICAgIGJveC1zaGFkb3c6XFxuICAgICAgICAwIDRweCA2cHggcmdiYSgwLCAwLCAwLCAwLjEpLFxcbiAgICAgICAgMCAtMnB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMDIpLFxcbiAgICAgICAgLTJweCAwIDRweCByZ2JhKDAsIDAsIDAsIDAuMDIpLFxcbiAgICAgICAgMnB4IDAgNHB4IHJnYmEoMCwgMCwgMCwgMC4wMik7XFxuXFxuXFxuICAgIGJvcmRlcjogMXB4IHNvbGlkICNkMGQwZDA7XFxuICAgIHdpZHRoOiBmaXQtY29udGVudDtcXG4gICAgei1pbmRleDogOTk5OTk5O1xcbiAgICBjb2xvcjogcmdiKDEyMCwgMTE5LCAxMTYpO1xcbiAgICBib3JkZXItcmFkaXVzOiBub25lO1xcbn1cXG5cXG5cXG4jbGlua0JveCBpbnB1dCB7XFxuICAgIHdpZHRoOiAzMTZweDtcXG4gICAgcGFkZGluZzogOHB4IDQwcHggOHB4IDE2cHg7XFxuICAgIC8qIGJvcmRlci1jb2xvcjogI2QwZDBkMDsgKi9cXG5cXG4gICAgYm9yZGVyOiAxcHggc29saWQgIzk0OTQ5NDtcXG4gICAgLyogYm9yZGVyLXJhZGl1czogNHB4OyAqL1xcbiAgICBoZWlnaHQ6IDI0cHg7XFxuXFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XFxuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xcbn1cXG5cXG5cXG4jbGlua0JveCBpbnB1dDo6c2VsZWN0aW9uLFxcbiNsaW5rQm94IGlucHV0OmZvY3VzIHtcXG4gICAgYm9yZGVyLXJhZGl1czogbm9uZTtcXG59XFxuXFxuLyoqIHNvZnQtYm94LXNoYWRvdyBjbGFzcyAqL1xcbi5zb2Z0LWJveC1zaGFkb3cge1xcbiAgICBtYXJnaW46IDA7XFxuICAgIHBhZGRpbmc6IDA7XFxuICAgIGJvcmRlci1yYWRpdXM6IDJweDtcXG4gICAgYm94LXNoYWRvdzpcXG4gICAgICAgIDAgNHB4IDZweCByZ2JhKDAsIDAsIDAsIDAuMSksXFxuICAgICAgICAwIC0ycHggNHB4IHJnYmEoMjE2LCAxOTYsIDE5NiwgMC4wMiksXFxuICAgICAgICAtMnB4IDAgNHB4IHJnYmEoMCwgMCwgMCwgMC4wMiksXFxuICAgICAgICAycHggMCA0cHggcmdiYSgwLCAwLCAwLCAwLjAyKTtcXG5cXG4gICAgYm9yZGVyOiAxcHggc29saWQgI2QwZDBkMDtcXG59XFxuXFxuLyoqIGFuZCBzb2Z0LWJveC1zaGFkb3cgKi9cXG5cXG5cXG4vKiogc2VsZWN0aW9uLXdyYXBwZXIgY2xhc3MgKi9cXG4uc2VsZWN0LXdyYXBwZXIge1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xcbn1cXG5cXG4uc2VsZWN0LXdyYXBwZXIgdWwge1xcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgIGJhY2tncm91bmQ6ICNmOWY5Zjk7XFxuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XFxuICAgIHdpZHRoOiBmaXQtY29udGVudDtcXG4gICAgcGFkZGluZy1ib3R0b206IDAuNXJlbTtcXG4gICAgcGFkZGluZy1sZWZ0OiA1cHg7XFxuICAgIHBhZGRpbmctcmlnaHQ6IDVweDtcXG4gICAgdG9wOiAyLjJyZW07XFxuICAgIGNvbG9yOiByZ2IoNTUsIDUzLCA0Nyk7XFxuICAgIHBhZGRpbmctcmlnaHQ6IDAuMzEyNXJlbTtcXG59XFxuXFxuLnNlbGVjdC13cmFwcGVyIHVsIGxpIHtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gICAgZ2FwOiAwLjYyNXJlbTtcXG4gICAgcGFkZGluZzogMC4xODc1cmVtIDAuMzEyNXJlbTtcXG4gICAgYm9yZGVyLXJhZGl1czogMC4xODc1cmVtO1xcbiAgICB1c2VyLXNlbGVjdDogbm9uZSAhaW1wb3J0YW50O1xcbiAgICBmb250LXNpemU6IHNtYWxsICFpbXBvcnRhbnQ7XFxuICAgIGZvbnQtd2VpZ2h0OiA1MDA7XFxufVxcblxcbi5zZWxlY3Qtd3JhcHBlciB1bCBsaSBzcGFuIHtcXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbiAgICB3aWR0aDogbWF4LWNvbnRlbnQ7XFxufVxcblxcbi5zZWxlY3Qtd3JhcHBlciB1bCBsaSAub3B0aW9uLWltYWdlIHtcXG4gICAgd2lkdGg6IDEuMzc1cmVtO1xcbiAgICBoZWlnaHQ6IDEuMzc1cmVtO1xcbiAgICBjb2xvcjogIzI0MjQyNDtcXG4gICAgcGFkZGluZzogMCAhaW1wb3J0YW50O1xcbiAgICBtYXJnaW46IDAgIWltcG9ydGFudDtcXG59XFxuXFxuLnNlbGVjdC13cmFwcGVyIHVsIGxpIC5vcHRpb24taW1hZ2Ugc3ZnIHtcXG4gICAgY29sb3I6ICM0ZjRmNGY7XFxuICAgIHBhZGRpbmc6IDAgIWltcG9ydGFudDtcXG4gICAgbWFyZ2luOiAwICFpbXBvcnRhbnQ7XFxufVxcblxcbi5zZWxlY3Qtd3JhcHBlciB7XFxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gICAgY29sb3I6IHJnYigxMjAsIDExOSwgMTE2KTtcXG59XFxuXFxuLnNlbGVjdC13cmFwcGVyPmJ1dHRvbiB7XFxuICAgIGNvbG9yOiByZ2JhKDU1LCA1MywgNDcsIDAuODUpO1xcbn1cXG5cXG4uc2VsZWN0LXdyYXBwZXIgdWwgbGk+aDMge1xcbiAgICBtYXJnaW46IDA7XFxuICAgIGZvbnQtc2l6ZTogc21hbGwgIWltcG9ydGFudDtcXG4gICAgY29sb3I6ICMzNzM1MmZhNjtcXG4gICAgbWFyZ2luOiAwO1xcbiAgICBwYWRkaW5nOiAwO1xcbiAgICBmb250LXdlaWdodDogNjAwICFpbXBvcnRhbnQ7XFxuICAgIG1hcmdpbi10b3A6IDAuMzEyNXJlbTtcXG4gICAgbWFyZ2luLWJvdHRvbTogMC4zMTI1cmVtO1xcbn1cXG5cXG4vKiogZW5kIHNlbGVjdGlvbiB3cmFwcGVyICoqL1xcblxcblxcblxcbi8qKiBUZXh0IGZvcm1hdHRpbmcgQmFyICoqL1xcblxcblxcblxcbi5mbG9hdGluZy10b29sYmFyIHtcXG4gICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xcbiAgICBwYWRkaW5nOiA4cHggMTZweDtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2Y5ZjlmOTtcXG4gICAgd2lkdGg6IGZpdC1jb250ZW50O1xcbiAgICB6LWluZGV4OiA5OTk5OTk7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgdXNlci1zZWxlY3Q6IG5vbmU7XFxufVxcblxcbi8qIFRPRE86IHJlbW92ZSB0aGlzKi9cXG5zcGFuIHtcXG4gICAgZm9udC1mYW1pbHk6IEFyaWFsLCBzYW5zLXNlcmlmO1xcbn1cXG5cXG5cXG4uZmxvYXRpbmctdG9vbGJhciAuaXRlbSB7XFxuICAgIGNvbG9yOiByZ2IoMTIwLCAxMTksIDExNik7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICAgIGdhcDogMTBweDtcXG59XFxuXFxuLmZsb2F0aW5nLXRvb2xiYXIgLml0ZW0+YnV0dG9uIHtcXG5cXG4gICAgZGlzcGxheTogaW5saW5lLWZsZXg7XFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxufVxcblxcblxcbi5mbG9hdGluZy10b29sYmFyIHNlbGVjdCB7XFxuICAgIGNvbG9yOiByZ2IoMTIwLCAxMTksIDExNik7XFxuICAgIGJvcmRlcjogbm9uZTtcXG4gICAgZm9udC1zaXplOiAwLjg1cmVtO1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBpbmhlcml0O1xcbn1cXG5cXG4udGV4dC1mb3JtYXR0aW5nLXNlbGVjdC1idXR0b24ge1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xcbn1cXG5cXG4jdHVybkludG9CdXR0b24gc3BhbiB7XFxuICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gICAgZm9udC1zaXplOiAwLjlyZW07XFxuXFxufVxcblxcbiN0dXJuSW50b0J1dHRvbiBzdmcgdXNlIHtcXG4gICAgbWFyZ2luOiBhdXRvO1xcbn1cXG5cXG5jb2RlOm5vdChwcmUgY29kZSkge1xcbiAgICBtYXJnaW46IDA7XFxuICAgIHBhZGRpbmc6IDA7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNkMGQwZDA7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNmNmY1ZjQ7XFxuICAgIGZvbnQtc2l6ZTogaW5oZXJpdDtcXG4gICAgZm9udC1zaXplOiAxcmVtICFpbXBvcnRhbnQ7XFxuICAgIGJvcmRlcjogMXB4IHNvbGlkICMwMDAwMDAxYTtcXG4gICAgcGFkZGluZzogMCAzcHg7XFxuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gICAgYm9yZGVyLXJhZGl1czogNHB4O1xcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcbn1cXG5cXG5cXG5cXG5cXG4vKiBhOm5vdChbaHJlZl0pIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2QzZTNmZDtcXG59ICovXFxuXFxuLnRleHQtZm9ybWF0dGluZy1idXR0b24tYWN0aXZlIHtcXG4gICAgY29sb3I6ICMyMzgyZTI7XFxufVxcblxcbi50ZXh0LWZvcm1hdHRpbmctY2lyY2xlLWFjdGl2ZSB7XFxuICAgIGJvcmRlci1jb2xvcjogIzIzODJlMiAhaW1wb3J0YW50O1xcbn1cXG5cXG5cXG5cXG4jbW9yZVRleHRPcHRpb25TZWxlY3Qge1xcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxufVxcblxcbi5tb3JlVGV4dE9wdGlvbldyYXBwZXIge1xcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XFxufVxcblxcblxcbi5iZ2MtcmVkIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI0ZEREVERTtcXG59XFxuXFxuLmJnYy1ncmVlbiB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNEN0Y3REM7XFxufVxcblxcbi5iZ2MtYmx1ZSB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNEOUVERjY7XFxufVxcblxcbi5iZ2MteWVsbG93IHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI0ZBRjREMTtcXG59XFxuXFxuLmJnYy1ncmV5IHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI0UxRTBFMDtcXG59XFxuXFxucCxcXG5tYXJrIHtcXG4gICAgbGluZS1oZWlnaHQ6IDE7XFxufVxcblxcbiN0dXJuSW50b1NlbGVjdCAub3B0aW9uLWltYWdlIHtcXG4gICAgLyogZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OyAqL1xcbn1cXG5cXG4uYm9yZGVyLWxlc3MtaW1hZ2Uge1xcbiAgICB3aWR0aDogMjRweDtcXG4gICAgaGVpZ2h0OiAyNHB4O1xcbn1cXG5cXG5cXG5cXG5cXG4vKiogQmxvY2sgT3B0aW9ucyAqKi9cXG5cXG4uYmxvY2stb3B0aW9ucy13cmFwcGVyIHtcXG4gICAgei1pbmRleDogOTk5OTk5O1xcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgIGRpc3BsYXk6IG5vbmU7XFxufVxcblxcbi5ibG9jay1vcHRpb25zIHtcXG4gICAgd2lkdGg6IGZpdC1jb250ZW50O1xcbiAgICBtYXgtaGVpZ2h0OiAxOXJlbTtcXG4gICAgb3ZlcmZsb3cteTogYXV0bztcXG59XFxuXFxuLmJsb2NrLW9wdGlvbnMge1xcbiAgICBwYWRkaW5nOiAwIDAuNjI1cmVtO1xcbiAgICBiYWNrZ3JvdW5kOiAjZjlmOWY5O1xcbn1cXG5cXG4uYmxvY2stb3B0aW9ucyBzZWN0aW9uIGgyIHtcXG4gICAgZm9udC1zaXplOiBzbWFsbCAhaW1wb3J0YW50O1xcbiAgICBjb2xvcjogIzM3MzUyZmE2O1xcbiAgICBtYXJnaW46IDA7XFxuICAgIHBhZGRpbmc6IDA7XFxuICAgIGZvbnQtd2VpZ2h0OiA2MDAgIWltcG9ydGFudDtcXG4gICAgbWFyZ2luLXRvcDogMC4zMTI1cmVtO1xcbiAgICBtYXJnaW4tYm90dG9tOiAwLjMxMjVyZW07XFxuICAgIHBhZGRpbmctbGVmdDogMC4zMTI1cmVtO1xcbn1cXG5cXG4uYmxvY2stb3B0aW9ucyAub3B0aW9uIHtcXG4gICAgcGFkZGluZzogMC4zMTI1cmVtIDAuNjI1cmVtO1xcbiAgICBtYXJnaW46IDAuMzEyNXJlbSAwO1xcbiAgICBjdXJzb3I6IHBvaW50ZXI7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICAgIGp1c3RpZnktY29udGVudDogbGVmdDtcXG4gICAgZ2FwOiAwLjZyZW07XFxuICAgIGJvcmRlci1yYWRpdXM6IDNweDtcXG59XFxuXFxuLmJsb2NrLW9wdGlvbnMgLm9wdGlvbjpmb2N1cyB7XFxuICAgIG91dGxpbmU6IG5vbmU7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNlOWU5ZTk7XFxuICAgIGJvcmRlcjogaW5oZXJpdDtcXG59XFxuXFxuLm9wdGlvbi1mb2N1c2VkIHtcXG4gICAgb3V0bGluZTogbm9uZTtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2U5ZTllOTtcXG4gICAgYm9yZGVyOiBub25lO1xcbn1cXG5cXG4uZGFuZ2VyLW9wdGlvbi5vcHRpb24tZm9jdXNlZCxcXG4uZGFuZ2VyLW9wdGlvbi5vcHRpb24tZm9jdXNlZCBzdmcge1xcbiAgICBjb2xvcjogI0VCNTc1NyAhaW1wb3J0YW50O1xcbn1cXG5cXG5cXG5cXG4uYmxvY2stb3B0aW9ucyAub3B0aW9uOmZvY3VzLXZpc2libGUge1xcbiAgICBvdXRsaW5lOiBub25lO1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTllOWU5O1xcbiAgICBib3JkZXI6IGluaGVyaXQ7XFxufVxcblxcbi8qIC5vcHRpb24taG92ZXI6aG92ZXIge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTllOWU5O1xcbiAgICBib3gtc2hhZG93OiAwcHggMHB4IDBweCAycHggI2U5ZTllOTtcXG4gICAgYm9yZGVyLXJhZGl1czogMXB4O1xcbiAgICB0cmFuc2l0aW9uOiAwLjFzIGVhc2U7XFxufSAqL1xcblxcbi8qIC5zZWxlY3Qtd3JhcHBlcj5idXR0b24sICovXFxuXFxuLyogI3R1cm5JbnRvQnV0dG9uLFxcbiNjb2xvclRleHRCdXR0b24ge1xcbiAgICBwYWRkaW5nLWxlZnQ6IDRweDtcXG59ICovXFxuXFxuI2NvbG9yVGV4dEJ1dHRvbiB7XFxuICAgIG1hcmdpbi1sZWZ0OiAwLjYyNXJlbTtcXG59XFxuXFxuI3R1cm5JbnRvQnV0dG9uOm5vdChbZGlzYWJsZWRdKTpob3ZlcixcXG4jY29sb3JUZXh0QnV0dG9uOm5vdChbZGlzYWJsZWRdKTpob3ZlcixcXG4jbW9yZVRleHRPcHRpb25CdXR0b246bm90KFtkaXNhYmxlZF0pOmhvdmVyLFxcbi5mbG9hdGluZy10b29sYmFyIC5pdGVtPmJ1dHRvbjpub3QoW2Rpc2FibGVkXSk6aG92ZXIge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTllOWU5O1xcbiAgICBib3gtc2hhZG93OiAwcHggMHB4IDBweCAycHggI2U5ZTllOTtcXG4gICAgYm9yZGVyLXJhZGl1czogMXB4O1xcbiAgICB0cmFuc2l0aW9uOiAwLjFzIGVhc2U7XFxufVxcblxcblxcblxcbi5vcHRpb25bZm9jdXNlZD1cXFwidHJ1ZVxcXCJdIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2JkZTRmZjtcXG59XFxuXFxuXFxuXFxuXFxuXFxuLm9wdGlvbi1pbWFnZSB7XFxuICAgIHdpZHRoOiAyLjg3NXJlbTtcXG4gICAgaGVpZ2h0OiAyLjg3NXJlbTtcXG4gICAgYm9yZGVyLXJhZGl1czogMC4xODc1cmVtO1xcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjY2NjO1xcbiAgICBjb2xvcjogIzRmNGY0ZjtcXG5cXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcXG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XFxuICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmO1xcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcbn1cXG5cXG4ub3B0aW9uLWltYWdlIGltZyB7XFxuICAgIG1heC13aWR0aDogMi44NzVyZW07XFxuICAgIG1heC1oZWlnaHQ6IDIuODc1cmVtO1xcbn1cXG5cXG4ub3B0aW9uLWltYWdlIHN2ZyB7XFxuICAgIG1hcmdpbjogMDtcXG4gICAgcGFkZGluZzogMDtcXG4gICAgcGFkZGluZzogMC42MjVyZW07XFxuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxuXFxufVxcblxcbi5vcHRpb24tdGV4dCAqIHtcXG4gICAgbWFyZ2luOiAwO1xcbiAgICBwYWRkaW5nOiAwO1xcblxcbn1cXG5cXG4ub3B0aW9uLXRleHQgLmJsb2NrLXRpdGxlIHtcXG4gICAgZm9udC1zaXplOiBzbWFsbCAhaW1wb3J0YW50O1xcbiAgICBmb250LXdlaWdodDogNTAwO1xcbn1cXG5cXG4ub3B0aW9uLXRleHQgLmJsb2NrLWRlc2NyaXB0aW9uIHtcXG4gICAgZm9udC1zaXplOiBzbWFsbCAhaW1wb3J0YW50O1xcbiAgICBjb2xvcjogcmdiYSg1NSwgNTMsIDQ3LCAwLjUpO1xcbn1cXG5cXG4vKiogRW5kIEJsb2NrIE9wdGlvbnMgKiovXFxuXFxuXFxuXFxuI2RlbGV0ZUJsb2NrQnV0dG9uOmhvdmVyIHN2ZyxcXG4jZGVsZXRlQmxvY2tCdXR0b246aG92ZXIge1xcbiAgICBjb2xvcjogcmdiKDIzNSwgODcsIDg3KSAhaW1wb3J0YW50O1xcbn1cXG5cXG5cXG5cXG4uam9oYW5uZXMtZWRpdG9yICo6OnNlbGVjdGlvbiB7XFxuICAgIC8qIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMjExLCAyMjcsIDI1MywgMC41KSAhaW1wb3J0YW50OyAqL1xcblxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZWQ7XFxuXFxuICAgIGJhY2tncm91bmQtY29sb3I6IGhzbCgyMTAgNzUlIDUwJSAvIDEpO1xcbiAgICBjb2xvcjogd2hpdGU7XFxufVxcblxcbi5qb2hhbm5lcy1lZGl0b3IgbWFyayxcXG4uam9oYW5uZXMtZWRpdG9yICoge1xcbiAgICBsaW5lLWhlaWdodDogMS41ICFpbXBvcnRhbnQ7XFxufVxcblxcbi5vcHRpb24ge1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XFxufVxcblxcbi50ZXh0LW9wdGlvbiB7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XFxuICAgIGp1c3RpZnktY29udGVudDogc3RhcnQ7XFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICAgIGdhcDogMC42MjVyZW07XFxufVxcblxcblxcblxcblxcbjpyb290IHtcXG4gICAgLyogZm9udC1zaXplOiAxNnB4OyAqL1xcbiAgICAvKiBUYW1hbmhvIHBhZHLDo28gKi9cXG59XFxuXFxuLyogUGFyYSB0ZWxhcyBjb20gZGVuc2lkYWRlIG3DqWRpYSAqL1xcbkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKC13ZWJraXQtbWluLWRldmljZS1waXhlbC1yYXRpbzogMiksXFxub25seSBzY3JlZW4gYW5kIChtaW4tLW1vei1kZXZpY2UtcGl4ZWwtcmF0aW86IDIpLFxcbm9ubHkgc2NyZWVuIGFuZCAobWluLXJlc29sdXRpb246IDE5MmRwaSksXFxub25seSBzY3JlZW4gYW5kIChtaW4tcmVzb2x1dGlvbjogMmRwcHgpIHtcXG4gICAgOnJvb3Qge1xcbiAgICAgICAgZm9udC1zaXplOiAxOHB4O1xcbiAgICAgICAgLyogQXVtZW50YSBvIHRhbWFuaG8gZGEgZm9udGUgcGFyYSB0ZWxhcyBkZSBhbHRhIGRlbnNpZGFkZSAqL1xcbiAgICB9XFxufVxcblxcbi8qIFBhcmEgdGVsYXMgY29tIGFsdMOtc3NpbWEgZGVuc2lkYWRlICovXFxuQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAoLXdlYmtpdC1taW4tZGV2aWNlLXBpeGVsLXJhdGlvOiAzKSxcXG5vbmx5IHNjcmVlbiBhbmQgKG1pbi0tbW96LWRldmljZS1waXhlbC1yYXRpbzogMyksXFxub25seSBzY3JlZW4gYW5kIChtaW4tcmVzb2x1dGlvbjogMjg4ZHBpKSxcXG5vbmx5IHNjcmVlbiBhbmQgKG1pbi1yZXNvbHV0aW9uOiAzZHBweCkge1xcbiAgICA6cm9vdCB7XFxuICAgICAgICBmb250LXNpemU6IDIwcHg7XFxuICAgICAgICAvKiBBaW5kYSBtYWlvciBwYXJhIHRlbGFzIGRlIGRlbnNpZGFkZSBtdWl0byBhbHRhICovXFxuICAgIH1cXG59XFxuXFxuXFxuXFxuXFxuXFxuXFxuXFxuXFxuXFxuXFxuXFxudGFibGUuam9oYW5uZXMtY29udGVudC1lbGVtZW50IHtcXG4gICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTtcXG4gICAgbWF4LXdpZHRoOiBpbmhlcml0O1xcbiAgICB3aWR0aDogYXV0bztcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveCAhaW1wb3J0YW50O1xcbn1cXG5cXG50YWJsZS5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQgdGgsXFxudGFibGUuam9oYW5uZXMtY29udGVudC1lbGVtZW50IHRkIHtcXG4gICAgbWluLWhlaWdodDogMjBweDtcXG59XFxuXFxudGFibGUuam9oYW5uZXMtY29udGVudC1lbGVtZW50IHRoLFxcbnRhYmxlLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCB0ZCB7XFxuICAgIGJvcmRlcjogMXB4IHNvbGlkICM4NDg4OGQ7XFxuICAgIHBhZGRpbmc6IDhweDtcXG4gICAgdGV4dC1hbGlnbjogbGVmdDtcXG4gICAgYWxpZ24taXRlbXM6IHN0YXJ0O1xcbiAgICBvdmVyZmxvdy13cmFwOiBicmVhay13b3JkO1xcbiAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7XFxuICAgIHdoaXRlLXNwYWNlOiBub3JtYWw7XFxuICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7XFxuICAgIG1pbi13aWR0aDogMTAwcHg7XFxuICAgIG1heC13aWR0aDogMjAwcHg7XFxuICAgIC8qIGJveC1zaXppbmc6IGJvcmRlci1ib3ggIWltcG9ydGFudDsgKi9cXG5cXG4gICAgdHJhbnNpdGlvbjogYm9yZGVyIDEwMG1zIGVhc2Utb3V0LCBib3gtc2hhZG93IDEwMG1zIGVhc2Utb3V0O1xcblxcbn1cXG5cXG50YWJsZS5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQgdGQuc2VsZWN0ZWQsXFxudGFibGUuam9oYW5uZXMtY29udGVudC1lbGVtZW50IHRkOmZvY3VzIHtcXG4gICAgb3V0bGluZTogbm9uZTtcXG4gICAgYm94LXNoYWRvdzogMCAwIDAgMXB4ICM3NGI2ZGIgaW5zZXQ7XFxuICAgIGJvcmRlcjogMXB4IGRvdWJsZSAjNzRiNmRiO1xcblxcbn1cXG5cXG50ZCB7XFxuICAgIG1pbi1oZWlnaHQ6IDFyZW0gIWltcG9ydGFudDtcXG4gICAgbGluZS1oZWlnaHQ6IDFyZW07XFxufVxcblxcbnRkOjpwbGFjZWhvbGRlciB7XFxuICAgIGRpc3BsYXk6IGJsb2NrO1xcbn1cXG5cXG50ZDplbXB0eTpiZWZvcmUge1xcbiAgICBjb250ZW50OiBhdHRyKGRhdGEtcGxhY2Vob2xkZXIpO1xcbiAgICBjb2xvcjogIzg0ODg4YWNkO1xcbiAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50O1xcbiAgICBvcGFjaXR5OiAwO1xcbn1cXG5cXG4udGFibGUtd3JhcHBlciB7XFxuICAgIHdpZHRoOiAxMDAlO1xcbn1cXG5cXG4udGFibGUtY29udHJvbGxlciB7XFxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gICAgbWF4LXdpZHRoOiAxMDAlO1xcbn1cXG5cXG4uYWRkLXRhYmxlLXJvdyB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoNTUsIDUzLCA0NywgMC4wNik7XFxuICAgIHdpZHRoOiAxMDAlO1xcbiAgICBwYWRkaW5nOiAwO1xcbiAgICBtYXJnaW46IDA7XFxuICAgIG1hcmdpbi10b3A6IDAuMzc1cmVtO1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xcbiAgICBoZWlnaHQ6IDFyZW07XFxuICAgIGN1cnNvcjogcG9pbnRlcjtcXG4gICAgb3BhY2l0eTogMDtcXG4gICAgdXNlci1zZWxlY3Q6IG5vbmU7XFxufVxcblxcbi5hZGQtdGFibGUtY29sdW1uIHtcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgICByaWdodDogLTEuMzEyNXJlbTtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSg1NSwgNTMsIDQ3LCAwLjA2KTtcXG4gICAgd2lkdGg6IDFyZW07XFxuICAgIHBhZGRpbmc6IDA7XFxuICAgIG1hcmdpbjogMDtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcXG4gICAgaGVpZ2h0OiAxMDAlO1xcbiAgICB0b3A6IDA7XFxuICAgIGN1cnNvcjogcG9pbnRlcjtcXG4gICAgaGVpZ2h0OiBjYWxjKDEwMCUgLSAxcmVtIC0gNXB4KTtcXG4gICAgb3BhY2l0eTogMDtcXG4gICAgdXNlci1zZWxlY3Q6IG5vbmU7XFxufVxcblxcbi5hZGQtdGFibGUtY29sdW1uOmhvdmVyIHtcXG4gICAgb3BhY2l0eTogMTtcXG59XFxuXFxuLmFkZC10YWJsZS1yb3c6aG92ZXIge1xcbiAgICBvcGFjaXR5OiAxO1xcbn1cXG5cXG4udGFibGUtc2hlbGwge1xcbiAgICBtYXgtd2lkdGg6IDEwMCU7XFxufVxcblxcblxcblxcbi50YWJsZS1vcHRpb24ge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcXG4gICAgd2lkdGg6IGZpdC1jb250ZW50O1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XFxuICAgIHBhZGRpbmc6IDhweCAxNnB4O1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjlmOWY5O1xcbiAgICB3aWR0aDogZml0LWNvbnRlbnQ7XFxuICAgIHotaW5kZXg6IDk5OTk5OTtcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgICB1c2VyLXNlbGVjdDogbm9uZTtcXG4gICAgcGFkZGluZzogOHB4IDE2cHg7XFxuICAgIGRpc3BsYXk6IG5vbmU7XFxufVxcblxcblxcblxcblxcbi8qKiBDYWxsb3V0ICoqL1xcbi5jYWxsb3V0OmhvdmVyIC5vcHRpb25zLWJ1dHRvbiB7XFxuICAgIGRpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7XFxufVxcblxcblxcbi5uby1zZWxlY3Rpb24ge1xcbiAgICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lO1xcbiAgICAtbW96LXVzZXItc2VsZWN0OiBub25lO1xcbiAgICB1c2VyLXNlbGVjdDogbm9uZTtcXG59XFxuXFxuXFxuLyoqIHVwbG9hZC9lbWJlZCAqKi9cXG5cXG4udGFiLWNvbnRhaW5lciB7XFxuICAgIGZvbnQtc2l6ZTogMC44NnJlbTtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcXG4gICAgdHJhbnNpdGlvbjogMC4xcyBlYXNlO1xcblxcbiAgICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lO1xcbiAgICAtbW96LXVzZXItc2VsZWN0OiBub25lO1xcbiAgICB1c2VyLXNlbGVjdDogbm9uZTtcXG5cXG4gICAgdHJhbnNpdGlvbjogdmlzaWJpbGl0eSAwLjJzIGVhc2U7XFxuXFxufVxcblxcbi5uYXYtdW5kZXJsaW5lIHtcXG4gICAgbWFyZ2luOiAwO1xcbiAgICBwYWRkaW5nOiAwO1xcbiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgcmdiYSg1NSwgNTMsIDQ3LCAwLjE2KTtcXG4gICAgcGFkZGluZzogMTBweCAyMHB4O1xcbn1cXG5cXG4ubmF2LXVuZGVybGluZSAubmF2LWl0ZW0ge1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBtYXJnaW4tcmlnaHQ6IDE1cHg7XFxufVxcblxcbi5uYXYtdW5kZXJsaW5lIC5uYXYtbGluayB7XFxuICAgIGN1cnNvcjogcG9pbnRlcjtcXG4gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xcbiAgICBjb2xvcjogcmdiKDU1LCA1MywgNDcpO1xcbiAgICBjb2xvcjogcmdiYSg1NSwgNTMsIDQ3LCAwLjUpO1xcbiAgICB0cmFuc2l0aW9uOiAwLjFzIGVhc2U7XFxufVxcblxcblxcbi5uYXYtaXRlbS5hY3RpdmUgLm5hdi1saW5rIHtcXG4gICAgY29sb3I6ICMwMDA7XFxufVxcblxcbi50YWItY29udGVudCAuY29udGVudC1kYXRhIHtcXG4gICAgZGlzcGxheTogbm9uZTtcXG4gICAgcGFkZGluZzogMjBweDtcXG4gICAgYm9yZGVyLXRvcDogbm9uZTtcXG4gICAgdHJhbnNpdGlvbjogMC4xcyBlYXNlO1xcbn1cXG5cXG4udGFiLWNvbnRlbnQgLmNvbnRlbnQtZGF0YS5hY3RpdmUge1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxuICAgIGdhcDogMXJlbTtcXG59XFxuXFxuLnRhYi1jb250ZW50IC50ZXh0LWluZm8ge1xcbiAgICBmb250LXNpemU6IDAuNzVyZW07XFxuICAgIGNvbG9yOiByZ2JhKDU1LCA1MywgNDcsIDAuNik7XFxufVxcblxcbi5uYXYtdW5kZXJsaW5lIC5uYXYtaXRlbSB7XFxuICAgIGRpc3BsYXk6IGlubGluZTtcXG59XFxuXFxuXFxuLnRhYi1jb250YWluZXIge1xcbiAgICB3aWR0aDogZml0LWNvbnRlbnQ7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYigyNDksIDI0OSwgMjQ5KTtcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcblxcbn1cXG5cXG4uZW1iZWQtY29udGVudCBpbnB1dCB7XFxuICAgIHdpZHRoOiAyMHJlbTtcXG4gICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSg1NSwgNTMsIDQ3LCAwLjE2KTtcXG4gICAgaGVpZ2h0OiAxLjVyZW07XFxuICAgIGJvcmRlci1yYWRpdXM6IDRweDtcXG4gICAgcGFkZGluZy1sZWZ0OiAxMHB4O1xcbn1cXG5cXG5cXG4udXBsb2FkLWNvbnRlbnQgbGFiZWwge1xcbiAgICBkaXNwbGF5OiBibG9jaztcXG4gICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSg1NSwgNTMsIDQ3LCAwLjE2KTtcXG4gICAgYm9yZGVyLXJhZGl1czogNHB4O1xcbiAgICB3aWR0aDogMjByZW07XFxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcXG4gICAgcGFkZGluZzogNHB4O1xcbiAgICBjb2xvcjogcmdiKDU1LCA1MywgNDcpO1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xcbiAgICAvKiB0cmFuc2l0aW9uOiAwLjFzIGVhc2U7ICovXFxufVxcblxcbi51cGxvYWQtY29udGVudCBsYWJlbDpob3ZlciB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNlZWVlZWU7XFxufVxcblxcblxcblxcblxcblxcblxcblxcblxcblxcblxcbi8qIEVzdGlsbyBwYXJhIGFzIGFsw6dhcyBkZSByZWRpbWVuc2lvbmFtZW50byAqL1xcbi5yZXNpemUtaGFuZGxlIHtcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgICB3aWR0aDogMTBweDtcXG4gICAgaGVpZ2h0OiAxMHB4O1xcbiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuNSk7XFxuICAgIGN1cnNvcjogbndzZS1yZXNpemU7XFxuICAgIC8qIEN1cnNvciBkZSByZWRpbWVuc2lvbmFtZW50byBkaWFnb25hbCAqL1xcbn1cXG5cXG4ucmVzaXplLWhhbmRsZS5zZSB7XFxuICAgIGJvdHRvbTogMDtcXG4gICAgcmlnaHQ6IDA7XFxufVxcblxcblxcblxcblxcbi5lbWJlZC1jb250YWluZXIge1xcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICAgIHdpZHRoOiAxMDAlO1xcbiAgICBwYWRkaW5nLWJvdHRvbTogNTYuMjUlO1xcbiAgICAvKiBQcm9wb3LDp8OjbyAxNjo5ICovXFxuICAgIGhlaWdodDogMDtcXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcXG59XFxuXFxuLmVtYmVkLWNvbnRhaW5lciBpZnJhbWUge1xcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgIHRvcDogMDtcXG4gICAgbGVmdDogMDtcXG4gICAgd2lkdGg6IDEwMCU7XFxuICAgIGhlaWdodDogMTAwJTtcXG59XFxuXFxuXFxuXFxuLnZpZGVvLWNvbnRhaW5lciB7XFxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gICAgd2lkdGg6IDEwMCU7XFxuICAgIHBhZGRpbmctYm90dG9tOiA1Ni4yNSU7XFxuICAgIC8qIFByb3BvcsOnw6NvIDE2OjkgKi9cXG4gICAgaGVpZ2h0OiAwO1xcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xcbn1cXG5cXG4udmlkZW8tY29udGFpbmVyIGlmcmFtZSB7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgdG9wOiAwO1xcbiAgICBsZWZ0OiAwO1xcbiAgICB3aWR0aDogMTAwJTtcXG4gICAgaGVpZ2h0OiAxMDAlO1xcbn1cXG5cXG5cXG5cXG5cXG5cXG5cXG5cXG4ucmVzaXphYmxlIHtcXG4gICAgcmVzaXplOiBob3Jpem9udGFsO1xcbiAgICBvdmVyZmxvdzogYXV0bztcXG4gICAgY3Vyc29yOiBuZXN3LXJlc2l6ZTtcXG59XFxuXFxuLmJhY2tncm91bmQge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTdlNmUzO1xcbn1cIl0sXCJzb3VyY2VSb290XCI6XCJcIn1dKTtcbi8vIEV4cG9ydHNcbmV4cG9ydCBkZWZhdWx0IF9fX0NTU19MT0FERVJfRVhQT1JUX19fO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qXG4gIE1JVCBMaWNlbnNlIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UucGhwXG4gIEF1dGhvciBUb2JpYXMgS29wcGVycyBAc29rcmFcbiovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChjc3NXaXRoTWFwcGluZ1RvU3RyaW5nKSB7XG4gIHZhciBsaXN0ID0gW107XG5cbiAgLy8gcmV0dXJuIHRoZSBsaXN0IG9mIG1vZHVsZXMgYXMgY3NzIHN0cmluZ1xuICBsaXN0LnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICB2YXIgY29udGVudCA9IFwiXCI7XG4gICAgICB2YXIgbmVlZExheWVyID0gdHlwZW9mIGl0ZW1bNV0gIT09IFwidW5kZWZpbmVkXCI7XG4gICAgICBpZiAoaXRlbVs0XSkge1xuICAgICAgICBjb250ZW50ICs9IFwiQHN1cHBvcnRzIChcIi5jb25jYXQoaXRlbVs0XSwgXCIpIHtcIik7XG4gICAgICB9XG4gICAgICBpZiAoaXRlbVsyXSkge1xuICAgICAgICBjb250ZW50ICs9IFwiQG1lZGlhIFwiLmNvbmNhdChpdGVtWzJdLCBcIiB7XCIpO1xuICAgICAgfVxuICAgICAgaWYgKG5lZWRMYXllcikge1xuICAgICAgICBjb250ZW50ICs9IFwiQGxheWVyXCIuY29uY2F0KGl0ZW1bNV0ubGVuZ3RoID4gMCA/IFwiIFwiLmNvbmNhdChpdGVtWzVdKSA6IFwiXCIsIFwiIHtcIik7XG4gICAgICB9XG4gICAgICBjb250ZW50ICs9IGNzc1dpdGhNYXBwaW5nVG9TdHJpbmcoaXRlbSk7XG4gICAgICBpZiAobmVlZExheWVyKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJ9XCI7XG4gICAgICB9XG4gICAgICBpZiAoaXRlbVsyXSkge1xuICAgICAgICBjb250ZW50ICs9IFwifVwiO1xuICAgICAgfVxuICAgICAgaWYgKGl0ZW1bNF0pIHtcbiAgICAgICAgY29udGVudCArPSBcIn1cIjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjb250ZW50O1xuICAgIH0pLmpvaW4oXCJcIik7XG4gIH07XG5cbiAgLy8gaW1wb3J0IGEgbGlzdCBvZiBtb2R1bGVzIGludG8gdGhlIGxpc3RcbiAgbGlzdC5pID0gZnVuY3Rpb24gaShtb2R1bGVzLCBtZWRpYSwgZGVkdXBlLCBzdXBwb3J0cywgbGF5ZXIpIHtcbiAgICBpZiAodHlwZW9mIG1vZHVsZXMgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIG1vZHVsZXMgPSBbW251bGwsIG1vZHVsZXMsIHVuZGVmaW5lZF1dO1xuICAgIH1cbiAgICB2YXIgYWxyZWFkeUltcG9ydGVkTW9kdWxlcyA9IHt9O1xuICAgIGlmIChkZWR1cGUpIHtcbiAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgdGhpcy5sZW5ndGg7IGsrKykge1xuICAgICAgICB2YXIgaWQgPSB0aGlzW2tdWzBdO1xuICAgICAgICBpZiAoaWQgIT0gbnVsbCkge1xuICAgICAgICAgIGFscmVhZHlJbXBvcnRlZE1vZHVsZXNbaWRdID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKHZhciBfayA9IDA7IF9rIDwgbW9kdWxlcy5sZW5ndGg7IF9rKyspIHtcbiAgICAgIHZhciBpdGVtID0gW10uY29uY2F0KG1vZHVsZXNbX2tdKTtcbiAgICAgIGlmIChkZWR1cGUgJiYgYWxyZWFkeUltcG9ydGVkTW9kdWxlc1tpdGVtWzBdXSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgbGF5ZXIgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBpdGVtWzVdID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgaXRlbVs1XSA9IGxheWVyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGl0ZW1bMV0gPSBcIkBsYXllclwiLmNvbmNhdChpdGVtWzVdLmxlbmd0aCA+IDAgPyBcIiBcIi5jb25jYXQoaXRlbVs1XSkgOiBcIlwiLCBcIiB7XCIpLmNvbmNhdChpdGVtWzFdLCBcIn1cIik7XG4gICAgICAgICAgaXRlbVs1XSA9IGxheWVyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAobWVkaWEpIHtcbiAgICAgICAgaWYgKCFpdGVtWzJdKSB7XG4gICAgICAgICAgaXRlbVsyXSA9IG1lZGlhO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGl0ZW1bMV0gPSBcIkBtZWRpYSBcIi5jb25jYXQoaXRlbVsyXSwgXCIge1wiKS5jb25jYXQoaXRlbVsxXSwgXCJ9XCIpO1xuICAgICAgICAgIGl0ZW1bMl0gPSBtZWRpYTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHN1cHBvcnRzKSB7XG4gICAgICAgIGlmICghaXRlbVs0XSkge1xuICAgICAgICAgIGl0ZW1bNF0gPSBcIlwiLmNvbmNhdChzdXBwb3J0cyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaXRlbVsxXSA9IFwiQHN1cHBvcnRzIChcIi5jb25jYXQoaXRlbVs0XSwgXCIpIHtcIikuY29uY2F0KGl0ZW1bMV0sIFwifVwiKTtcbiAgICAgICAgICBpdGVtWzRdID0gc3VwcG9ydHM7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGxpc3QucHVzaChpdGVtKTtcbiAgICB9XG4gIH07XG4gIHJldHVybiBsaXN0O1xufTsiLCJcInVzZSBzdHJpY3RcIjtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXRlbSkge1xuICB2YXIgY29udGVudCA9IGl0ZW1bMV07XG4gIHZhciBjc3NNYXBwaW5nID0gaXRlbVszXTtcbiAgaWYgKCFjc3NNYXBwaW5nKSB7XG4gICAgcmV0dXJuIGNvbnRlbnQ7XG4gIH1cbiAgaWYgKHR5cGVvZiBidG9hID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICB2YXIgYmFzZTY0ID0gYnRvYSh1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoY3NzTWFwcGluZykpKSk7XG4gICAgdmFyIGRhdGEgPSBcInNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LFwiLmNvbmNhdChiYXNlNjQpO1xuICAgIHZhciBzb3VyY2VNYXBwaW5nID0gXCIvKiMgXCIuY29uY2F0KGRhdGEsIFwiICovXCIpO1xuICAgIHJldHVybiBbY29udGVudF0uY29uY2F0KFtzb3VyY2VNYXBwaW5nXSkuam9pbihcIlxcblwiKTtcbiAgfVxuICByZXR1cm4gW2NvbnRlbnRdLmpvaW4oXCJcXG5cIik7XG59OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgc3R5bGVzSW5ET00gPSBbXTtcbmZ1bmN0aW9uIGdldEluZGV4QnlJZGVudGlmaWVyKGlkZW50aWZpZXIpIHtcbiAgdmFyIHJlc3VsdCA9IC0xO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0eWxlc0luRE9NLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKHN0eWxlc0luRE9NW2ldLmlkZW50aWZpZXIgPT09IGlkZW50aWZpZXIpIHtcbiAgICAgIHJlc3VsdCA9IGk7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIG1vZHVsZXNUb0RvbShsaXN0LCBvcHRpb25zKSB7XG4gIHZhciBpZENvdW50TWFwID0ge307XG4gIHZhciBpZGVudGlmaWVycyA9IFtdO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgaXRlbSA9IGxpc3RbaV07XG4gICAgdmFyIGlkID0gb3B0aW9ucy5iYXNlID8gaXRlbVswXSArIG9wdGlvbnMuYmFzZSA6IGl0ZW1bMF07XG4gICAgdmFyIGNvdW50ID0gaWRDb3VudE1hcFtpZF0gfHwgMDtcbiAgICB2YXIgaWRlbnRpZmllciA9IFwiXCIuY29uY2F0KGlkLCBcIiBcIikuY29uY2F0KGNvdW50KTtcbiAgICBpZENvdW50TWFwW2lkXSA9IGNvdW50ICsgMTtcbiAgICB2YXIgaW5kZXhCeUlkZW50aWZpZXIgPSBnZXRJbmRleEJ5SWRlbnRpZmllcihpZGVudGlmaWVyKTtcbiAgICB2YXIgb2JqID0ge1xuICAgICAgY3NzOiBpdGVtWzFdLFxuICAgICAgbWVkaWE6IGl0ZW1bMl0sXG4gICAgICBzb3VyY2VNYXA6IGl0ZW1bM10sXG4gICAgICBzdXBwb3J0czogaXRlbVs0XSxcbiAgICAgIGxheWVyOiBpdGVtWzVdXG4gICAgfTtcbiAgICBpZiAoaW5kZXhCeUlkZW50aWZpZXIgIT09IC0xKSB7XG4gICAgICBzdHlsZXNJbkRPTVtpbmRleEJ5SWRlbnRpZmllcl0ucmVmZXJlbmNlcysrO1xuICAgICAgc3R5bGVzSW5ET01baW5kZXhCeUlkZW50aWZpZXJdLnVwZGF0ZXIob2JqKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHVwZGF0ZXIgPSBhZGRFbGVtZW50U3R5bGUob2JqLCBvcHRpb25zKTtcbiAgICAgIG9wdGlvbnMuYnlJbmRleCA9IGk7XG4gICAgICBzdHlsZXNJbkRPTS5zcGxpY2UoaSwgMCwge1xuICAgICAgICBpZGVudGlmaWVyOiBpZGVudGlmaWVyLFxuICAgICAgICB1cGRhdGVyOiB1cGRhdGVyLFxuICAgICAgICByZWZlcmVuY2VzOiAxXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWRlbnRpZmllcnMucHVzaChpZGVudGlmaWVyKTtcbiAgfVxuICByZXR1cm4gaWRlbnRpZmllcnM7XG59XG5mdW5jdGlvbiBhZGRFbGVtZW50U3R5bGUob2JqLCBvcHRpb25zKSB7XG4gIHZhciBhcGkgPSBvcHRpb25zLmRvbUFQSShvcHRpb25zKTtcbiAgYXBpLnVwZGF0ZShvYmopO1xuICB2YXIgdXBkYXRlciA9IGZ1bmN0aW9uIHVwZGF0ZXIobmV3T2JqKSB7XG4gICAgaWYgKG5ld09iaikge1xuICAgICAgaWYgKG5ld09iai5jc3MgPT09IG9iai5jc3MgJiYgbmV3T2JqLm1lZGlhID09PSBvYmoubWVkaWEgJiYgbmV3T2JqLnNvdXJjZU1hcCA9PT0gb2JqLnNvdXJjZU1hcCAmJiBuZXdPYmouc3VwcG9ydHMgPT09IG9iai5zdXBwb3J0cyAmJiBuZXdPYmoubGF5ZXIgPT09IG9iai5sYXllcikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBhcGkudXBkYXRlKG9iaiA9IG5ld09iaik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFwaS5yZW1vdmUoKTtcbiAgICB9XG4gIH07XG4gIHJldHVybiB1cGRhdGVyO1xufVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAobGlzdCwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgbGlzdCA9IGxpc3QgfHwgW107XG4gIHZhciBsYXN0SWRlbnRpZmllcnMgPSBtb2R1bGVzVG9Eb20obGlzdCwgb3B0aW9ucyk7XG4gIHJldHVybiBmdW5jdGlvbiB1cGRhdGUobmV3TGlzdCkge1xuICAgIG5ld0xpc3QgPSBuZXdMaXN0IHx8IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGFzdElkZW50aWZpZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaWRlbnRpZmllciA9IGxhc3RJZGVudGlmaWVyc1tpXTtcbiAgICAgIHZhciBpbmRleCA9IGdldEluZGV4QnlJZGVudGlmaWVyKGlkZW50aWZpZXIpO1xuICAgICAgc3R5bGVzSW5ET01baW5kZXhdLnJlZmVyZW5jZXMtLTtcbiAgICB9XG4gICAgdmFyIG5ld0xhc3RJZGVudGlmaWVycyA9IG1vZHVsZXNUb0RvbShuZXdMaXN0LCBvcHRpb25zKTtcbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgbGFzdElkZW50aWZpZXJzLmxlbmd0aDsgX2krKykge1xuICAgICAgdmFyIF9pZGVudGlmaWVyID0gbGFzdElkZW50aWZpZXJzW19pXTtcbiAgICAgIHZhciBfaW5kZXggPSBnZXRJbmRleEJ5SWRlbnRpZmllcihfaWRlbnRpZmllcik7XG4gICAgICBpZiAoc3R5bGVzSW5ET01bX2luZGV4XS5yZWZlcmVuY2VzID09PSAwKSB7XG4gICAgICAgIHN0eWxlc0luRE9NW19pbmRleF0udXBkYXRlcigpO1xuICAgICAgICBzdHlsZXNJbkRPTS5zcGxpY2UoX2luZGV4LCAxKTtcbiAgICAgIH1cbiAgICB9XG4gICAgbGFzdElkZW50aWZpZXJzID0gbmV3TGFzdElkZW50aWZpZXJzO1xuICB9O1xufTsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIG1lbW8gPSB7fTtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBnZXRUYXJnZXQodGFyZ2V0KSB7XG4gIGlmICh0eXBlb2YgbWVtb1t0YXJnZXRdID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgdmFyIHN0eWxlVGFyZ2V0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0YXJnZXQpO1xuXG4gICAgLy8gU3BlY2lhbCBjYXNlIHRvIHJldHVybiBoZWFkIG9mIGlmcmFtZSBpbnN0ZWFkIG9mIGlmcmFtZSBpdHNlbGZcbiAgICBpZiAod2luZG93LkhUTUxJRnJhbWVFbGVtZW50ICYmIHN0eWxlVGFyZ2V0IGluc3RhbmNlb2Ygd2luZG93LkhUTUxJRnJhbWVFbGVtZW50KSB7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBUaGlzIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIGFjY2VzcyB0byBpZnJhbWUgaXMgYmxvY2tlZFxuICAgICAgICAvLyBkdWUgdG8gY3Jvc3Mtb3JpZ2luIHJlc3RyaWN0aW9uc1xuICAgICAgICBzdHlsZVRhcmdldCA9IHN0eWxlVGFyZ2V0LmNvbnRlbnREb2N1bWVudC5oZWFkO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBpc3RhbmJ1bCBpZ25vcmUgbmV4dFxuICAgICAgICBzdHlsZVRhcmdldCA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgIG1lbW9bdGFyZ2V0XSA9IHN0eWxlVGFyZ2V0O1xuICB9XG4gIHJldHVybiBtZW1vW3RhcmdldF07XG59XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gaW5zZXJ0QnlTZWxlY3RvcihpbnNlcnQsIHN0eWxlKSB7XG4gIHZhciB0YXJnZXQgPSBnZXRUYXJnZXQoaW5zZXJ0KTtcbiAgaWYgKCF0YXJnZXQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZG4ndCBmaW5kIGEgc3R5bGUgdGFyZ2V0LiBUaGlzIHByb2JhYmx5IG1lYW5zIHRoYXQgdGhlIHZhbHVlIGZvciB0aGUgJ2luc2VydCcgcGFyYW1ldGVyIGlzIGludmFsaWQuXCIpO1xuICB9XG4gIHRhcmdldC5hcHBlbmRDaGlsZChzdHlsZSk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IGluc2VydEJ5U2VsZWN0b3I7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gaW5zZXJ0U3R5bGVFbGVtZW50KG9wdGlvbnMpIHtcbiAgdmFyIGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3R5bGVcIik7XG4gIG9wdGlvbnMuc2V0QXR0cmlidXRlcyhlbGVtZW50LCBvcHRpb25zLmF0dHJpYnV0ZXMpO1xuICBvcHRpb25zLmluc2VydChlbGVtZW50LCBvcHRpb25zLm9wdGlvbnMpO1xuICByZXR1cm4gZWxlbWVudDtcbn1cbm1vZHVsZS5leHBvcnRzID0gaW5zZXJ0U3R5bGVFbGVtZW50OyIsIlwidXNlIHN0cmljdFwiO1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIHNldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlcyhzdHlsZUVsZW1lbnQpIHtcbiAgdmFyIG5vbmNlID0gdHlwZW9mIF9fd2VicGFja19ub25jZV9fICE9PSBcInVuZGVmaW5lZFwiID8gX193ZWJwYWNrX25vbmNlX18gOiBudWxsO1xuICBpZiAobm9uY2UpIHtcbiAgICBzdHlsZUVsZW1lbnQuc2V0QXR0cmlidXRlKFwibm9uY2VcIiwgbm9uY2UpO1xuICB9XG59XG5tb2R1bGUuZXhwb3J0cyA9IHNldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlczsiLCJcInVzZSBzdHJpY3RcIjtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBhcHBseShzdHlsZUVsZW1lbnQsIG9wdGlvbnMsIG9iaikge1xuICB2YXIgY3NzID0gXCJcIjtcbiAgaWYgKG9iai5zdXBwb3J0cykge1xuICAgIGNzcyArPSBcIkBzdXBwb3J0cyAoXCIuY29uY2F0KG9iai5zdXBwb3J0cywgXCIpIHtcIik7XG4gIH1cbiAgaWYgKG9iai5tZWRpYSkge1xuICAgIGNzcyArPSBcIkBtZWRpYSBcIi5jb25jYXQob2JqLm1lZGlhLCBcIiB7XCIpO1xuICB9XG4gIHZhciBuZWVkTGF5ZXIgPSB0eXBlb2Ygb2JqLmxheWVyICE9PSBcInVuZGVmaW5lZFwiO1xuICBpZiAobmVlZExheWVyKSB7XG4gICAgY3NzICs9IFwiQGxheWVyXCIuY29uY2F0KG9iai5sYXllci5sZW5ndGggPiAwID8gXCIgXCIuY29uY2F0KG9iai5sYXllcikgOiBcIlwiLCBcIiB7XCIpO1xuICB9XG4gIGNzcyArPSBvYmouY3NzO1xuICBpZiAobmVlZExheWVyKSB7XG4gICAgY3NzICs9IFwifVwiO1xuICB9XG4gIGlmIChvYmoubWVkaWEpIHtcbiAgICBjc3MgKz0gXCJ9XCI7XG4gIH1cbiAgaWYgKG9iai5zdXBwb3J0cykge1xuICAgIGNzcyArPSBcIn1cIjtcbiAgfVxuICB2YXIgc291cmNlTWFwID0gb2JqLnNvdXJjZU1hcDtcbiAgaWYgKHNvdXJjZU1hcCAmJiB0eXBlb2YgYnRvYSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgIGNzcyArPSBcIlxcbi8qIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtiYXNlNjQsXCIuY29uY2F0KGJ0b2EodW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KHNvdXJjZU1hcCkpKSksIFwiICovXCIpO1xuICB9XG5cbiAgLy8gRm9yIG9sZCBJRVxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgICovXG4gIG9wdGlvbnMuc3R5bGVUYWdUcmFuc2Zvcm0oY3NzLCBzdHlsZUVsZW1lbnQsIG9wdGlvbnMub3B0aW9ucyk7XG59XG5mdW5jdGlvbiByZW1vdmVTdHlsZUVsZW1lbnQoc3R5bGVFbGVtZW50KSB7XG4gIC8vIGlzdGFuYnVsIGlnbm9yZSBpZlxuICBpZiAoc3R5bGVFbGVtZW50LnBhcmVudE5vZGUgPT09IG51bGwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgc3R5bGVFbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoc3R5bGVFbGVtZW50KTtcbn1cblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBkb21BUEkob3B0aW9ucykge1xuICBpZiAodHlwZW9mIGRvY3VtZW50ID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHVwZGF0ZTogZnVuY3Rpb24gdXBkYXRlKCkge30sXG4gICAgICByZW1vdmU6IGZ1bmN0aW9uIHJlbW92ZSgpIHt9XG4gICAgfTtcbiAgfVxuICB2YXIgc3R5bGVFbGVtZW50ID0gb3B0aW9ucy5pbnNlcnRTdHlsZUVsZW1lbnQob3B0aW9ucyk7XG4gIHJldHVybiB7XG4gICAgdXBkYXRlOiBmdW5jdGlvbiB1cGRhdGUob2JqKSB7XG4gICAgICBhcHBseShzdHlsZUVsZW1lbnQsIG9wdGlvbnMsIG9iaik7XG4gICAgfSxcbiAgICByZW1vdmU6IGZ1bmN0aW9uIHJlbW92ZSgpIHtcbiAgICAgIHJlbW92ZVN0eWxlRWxlbWVudChzdHlsZUVsZW1lbnQpO1xuICAgIH1cbiAgfTtcbn1cbm1vZHVsZS5leHBvcnRzID0gZG9tQVBJOyIsIlwidXNlIHN0cmljdFwiO1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIHN0eWxlVGFnVHJhbnNmb3JtKGNzcywgc3R5bGVFbGVtZW50KSB7XG4gIGlmIChzdHlsZUVsZW1lbnQuc3R5bGVTaGVldCkge1xuICAgIHN0eWxlRWxlbWVudC5zdHlsZVNoZWV0LmNzc1RleHQgPSBjc3M7XG4gIH0gZWxzZSB7XG4gICAgd2hpbGUgKHN0eWxlRWxlbWVudC5maXJzdENoaWxkKSB7XG4gICAgICBzdHlsZUVsZW1lbnQucmVtb3ZlQ2hpbGQoc3R5bGVFbGVtZW50LmZpcnN0Q2hpbGQpO1xuICAgIH1cbiAgICBzdHlsZUVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY3NzKSk7XG4gIH1cbn1cbm1vZHVsZS5leHBvcnRzID0gc3R5bGVUYWdUcmFuc2Zvcm07IiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHRpZDogbW9kdWxlSWQsXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXShtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIi8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSAobW9kdWxlKSA9PiB7XG5cdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuXHRcdCgpID0+IChtb2R1bGVbJ2RlZmF1bHQnXSkgOlxuXHRcdCgpID0+IChtb2R1bGUpO1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCB7IGE6IGdldHRlciB9KTtcblx0cmV0dXJuIGdldHRlcjtcbn07IiwiLy8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5kID0gKGV4cG9ydHMsIGRlZmluaXRpb24pID0+IHtcblx0Zm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkge1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcblx0XHR9XG5cdH1cbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gKG9iaiwgcHJvcCkgPT4gKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApKSIsIl9fd2VicGFja19yZXF1aXJlX18ubmMgPSB1bmRlZmluZWQ7IiwiZXhwb3J0IGVudW0gQ29udGVudFR5cGVzIHtcclxuICAgIFBhcmFncmFwaCA9IFwicFwiLFxyXG4gICAgSGVhZGluZ18xID0gXCJoMVwiLFxyXG4gICAgSGVhZGluZ18yID0gXCJoMlwiLFxyXG4gICAgSGVhZGluZ18zID0gXCJoM1wiLFxyXG4gICAgSGVhZGluZ180ID0gXCJoNFwiLFxyXG4gICAgSGVhZGluZ181ID0gXCJoNVwiLFxyXG4gICAgSGVhZGluZ182ID0gXCJoNlwiLFxyXG4gICAgQ2hlY2tMaXN0ID0gXCJjaGVja0xpc3RcIixcclxuICAgIEJ1bGxldGVkTGlzdCA9IFwiYnVsbGV0ZWRMaXN0XCIsXHJcbiAgICBOdW1iZXJlZExpc3QgPSBcIm51bWJlcmVkTGlzdFwiLFxyXG4gICAgTGlzdCA9IFwibGlzdFwiLFxyXG4gICAgVGFibGUgPSBcInRhYmxlXCIsXHJcbiAgICBJbWFnZSA9IFwiaW1hZ2VcIlxyXG59IiwiZXhwb3J0IGVudW0gSWNvbnMge1xyXG4gICAgTGluayA9IFwiaWNvbi1tYXRlcmlhbC1saW5rXCIsXHJcbiAgICBCb2xkID0gXCJpY29uLXdvcmRwcmVzcy1ib2xkXCIsXHJcbiAgICBJdGFsaWMgPSBcImljb24tbWF0ZXJpYWwtaXRhbGljXCIsXHJcbiAgICBVbmRlcmxpbmUgPSBcImljb24tbWF0ZXJpYWwtdW5kZXJsaW5lXCIsXHJcbiAgICBJbmxpbmVDb2RlID0gXCJpY29uLW1hdGVyaWFsLWNvZGUtaW5saW5lXCIsXHJcbiAgICBTdHJpa2VUaHJvdWdoID0gXCJpY29uLXdvcmRwcmVzcy1zdHJpa2UtdGhyb3VnaFwiLFxyXG4gICAgUGx1cyA9IFwiaWNvbi1wbHVzXCIsXHJcbiAgICBDb2x1bW5SaWdodCA9IFwiaWNvbi1tYXRlcmlhbC1jb2x1bW4tcmlnaHRcIixcclxuICAgIENvbHVtbkxlZnQgPSBcImljb24tbWF0ZXJpYWwtY29sdW1uLWxlZnRcIixcclxuICAgIFJvd0Fib3ZlID0gXCJpY29uLW1hdGVyaWFsLXJvdy1hYm92ZVwiLFxyXG4gICAgUm93QmVsb3cgPSBcImljb24tbWF0ZXJpYWwtcm93LWJlbG93XCIsXHJcbiAgICBkZWxldGVTd2VlcCA9IFwiaWNvbi1tYXRlcmlhbC1kZWxldGUtc3dlZXBcIixcclxuICAgIFRyYXNoID0gXCJpY29uLW1hdGVyaWFsLXRyYXNoXCIsXHJcbiAgICBDbG9zZUNpcmNsZSA9IFwiaWNvbi1pb25pYy1jbG9zZS1jaXJjbGVcIixcclxuICAgIEVtcHR5ID0gXCJFbXB0eVwiLFxyXG4gICAgQ2FsbG91dCA9IFwiaWNvbi1tYXRlcmlhbC1jYWxsb3V0XCIsXHJcbiAgICBJbWFnZSA9IFwiaWNvbi1tYXRlcmlhbC1pbWFnZVwiLFxyXG4gICAgVmlkZW8gPSBcImljb24tbWF0ZXJpYWwtdmlkZW9cIlxyXG59IiwiZXhwb3J0IGVudW0gQ3VzdG9tRXZlbnRzIHtcclxuICAgIC8vQ29tcG9uZW50IGV2ZW50c1xyXG4gICAgZmxvYXRpbmdUb29sYmFyRGlzcGxheWVkID0gXCJmbG9hdGluZ1Rvb2xiYXJEaXNwbGF5ZWRcIixcclxuXHJcbiAgICAvL1RleHQgY2xpY2sgZWRpdCBldmVudHNcclxuICAgIGFuY2hvckJ1dHRvbkNsaWNrZWQgPSBcImFuY2hvckJ1dHRvbkNsaWNrZWRcIixcclxuICAgIGJvbGRCdXR0b25DbGlja2VkID0gXCJib2xkQnV0dG9uQ2xpY2tlZFwiLFxyXG4gICAgaXRhbGljQnV0dG9uQ2xpY2tlZCA9IFwiaXRhbGljQnV0dG9uQ2xpY2tlZFwiLFxyXG4gICAgdW5kZXJsaW5lQnV0dG9uQ2xpY2tlZCA9IFwidW5kZXJsaW5lQnV0dG9uQ2xpY2tlZFwiLFxyXG4gICAgaW5saW5lQ29kZUJ1dHRvbkNsaWNrZWQgPSBcImlubGluZUNvZGVCdXR0b25DbGlja2VkXCIsXHJcbiAgICBzdHJpa2VUaHJvdWdoQnV0dG9uQ2xpY2tlZCA9IFwic3RyaWtlVGhyb3VnaEJ1dHRvbkNsaWNrZWRcIixcclxuICAgIGhpbGl0ZUNvbG9yQnV0dG9uQ2xpY2tlZCA9IFwiaGlsaXRlQ29sb3JCdXR0b25DbGlja2VkXCIsXHJcbiAgICBmb3JlQ29sb3JCdXR0b25DbGlja2VkID0gXCJmb3JlQ29sb3JCdXR0b25DbGlja2VkXCIsXHJcbiAgICBcclxuICAgIGJ1dHRvbkdyb3VwSXRlbUNsaWNrZWQgPSBcImJ1dHRvbkdyb3VwSXRlbUNsaWNrZWRcIixcclxuICAgIGZvY3VzT25GaXJzdFJlcXVlc3RlZCA9IFwiZm9jdXNPbkZpcnN0UmVxdWVzdGVkXCIsXHJcbiAgICBcclxuICAgIHRyYW5zZm9ybUJsb2NrUmVxdWVzdGVkID0gXCJ0cmFuc2Zvcm1CbG9ja1JlcXVlc3RlZFwiLFxyXG4gICAgZHVwbGljYXRlQmxvY2tSZXF1ZXN0ZWQgPSBcImR1cGxpY2F0ZUJsb2NrUmVxdWVzdGVkXCIsXHJcblxyXG4gICAgLy9UZXh0IGVkaXQgZXZlbnRzXHJcbiAgICBhbmNob3IgPSBcImFuY2hvclwiLFxyXG4gICAgYm9sZCA9IFwiYm9sZFwiLFxyXG4gICAgaXRhbGljID0gXCJpdGFsaWNcIixcclxuICAgIHVuZGVybGluZSA9IFwidW5kZXJsaW5lXCIsXHJcbiAgICBpbmxpbmVDb2RlID0gXCJpbmxpbmVDb2RlXCIsXHJcbiAgICBzdHJpa2VUaHJvdWdoID0gXCJzdHJpa2VUaHJvdWdoXCIsXHJcbiAgICBoaWxpdGVDb2xvciA9IFwiaGlsaXRlQ29sb3JcIixcclxuICAgIGZvcmVDb2xvciA9IFwiZm9yZUNvbG9yXCIsXHJcblxyXG5cclxuICAgIHRleHRGb3JtYXRDaGFuZ2VkID0gXCJ0ZXh0Rm9ybWF0Q2hhbmdlZFwiLFxyXG4gICAgZW1pdHRlZENvbW1hbmQgPSBcImVtaXR0ZWRDb21tYW5kXCIsXHJcbiAgICBibG9ja1R5cGVDaGFuZ2VkID0gXCJibG9ja1R5cGVDaGFuZ2VkXCIsXHJcbiAgICBibG9ja0RlbGV0ZWQgPSBcImJsb2NrRGVsZXRlZFwiLFxyXG4gICAgdGFibGVDZWxsQ2hhbmdlZCA9IFwidGFibGVDZWxsQ2hhbmdlZFwiLFxyXG5cclxuXHJcblxyXG4gICAgLy9CbG9jayBjb21tYW5kc1xyXG4gICAgXHJcbn0iLCJleHBvcnQgZW51bSBDb2xvcnMge1xyXG5cclxuICAgIEhpbGl0ZUNvbG9yUmVkID0gXCIjRkRERURFXCIsXHJcbiAgICBIaWxpdGVDb2xvckdyZWVuID0gXCIjRDdGN0RDXCIsXHJcbiAgICBIaWxpdGVDb2xvckJsdWUgPSBcIiNEOUVERjZcIixcclxuICAgIEhpbGl0ZUNvbG9yWWVsbG93ID0gXCIjRkFGNEQxXCIsXHJcbiAgICBIaWxpdGVDb2xvckdyZXkgPSBcIiNFMUUwRTBcIixcclxuICAgIEhpbGl0ZUNvbG9yTm9uZSA9IFwidHJhbnNwYXJlbnRcIixcclxuXHJcbiAgICBGb3JlQ29sb3JSZWQgPSBcIiNENDRDNDdcIixcclxuICAgIEZvcmVDb2xvckdyZWVuID0gXCIjNDQ4MzYxXCIsXHJcbiAgICBGb3JlQ29sb3JCbHVlID0gXCIjMzM3RUE5XCIsXHJcbiAgICBGb3JlQ29sb3JZZWxsb3cgPSBcIiNDQjkxMkZcIixcclxuICAgIEZvcmVDb2xvckdyZXkgPSBcIiM3ODc3NzRcIixcclxuICAgIEZvcmVDb2xvckluaXRpYWwgPSBcImluaXRpYWxcIixcclxuXHJcbiAgICBCYWNrZ3JvdW5kQ29sb3JSZWQgPSBcIiNGRERFREVcIixcclxuICAgIEJhY2tncm91bmRDb2xvckdyZWVuID0gXCIjRDdGN0RDXCIsXHJcbiAgICBCYWNrZ3JvdW5kQ29sb3JCbHVlID0gXCIjRDlFREY2XCIsXHJcbiAgICBCYWNrZ3JvdW5kQ29sb3JZZWxsb3cgPSBcIiNGQUY0RDFcIixcclxuICAgIEJhY2tncm91bmRDb2xvckdyZXkgPSBcIiNFMUUwRTBcIixcclxuICAgIEJhY2tncm91bmRDb2xvck5vbmUgPSBcInRyYW5zcGFyZW50XCIsXHJcblxyXG4gICAgSWNvbkFjdGl2ZUJsdWUgPSBcIiMyMzgyZTJcIixcclxuICAgIEljb25EZWZhdWx0QmxhY2sgPSBcInJnYmEoNTUsIDUzLCA0NywgMC44NSlcIixcclxuICAgIFJlZCA9IFwicmVkXCIsXHJcbiAgICBUb21hdG8gPSBcIiNFQjU3NTdcIixcclxuICAgIE9yaWdpbmFsVGFibGVDb2xvciA9IFwiIzg0ODg4ZFwiXHJcblxyXG59IiwiZXhwb3J0IGVudW0gQ29tbWFuZHMge1xyXG4gICAgLyoqIFRleHQgb3BlcmF0aW9ucyBjb21tYW5kcyAqL1xyXG4gICAgdG9nZ2xlQm9sZCA9IFwiYm9sZFwiLFxyXG4gICAgdG9nZ2xlSXRhbGljID0gXCJpdGFsaWNcIixcclxuICAgIHRvZ2dsZUhpbGl0ZUNvbG9yID0gXCJoaWxpdGVDb2xvclwiLFxyXG4gICAgdG9nZ2xlRm9yZUNvbG9yID0gXCJmb3JlQ29sb3JcIixcclxuICAgIHRvZ2dsZUlubGluZUNvZGUgPSBcImlubGluZUNvZGVcIixcclxuICAgIHRvZ2dsZUxpbmsgPSBcImNyZWF0ZUxpbmtcIixcclxuICAgIHRvZ2dsZVVuZGVybGluZSA9IFwidW5kZXJsaW5lXCIsXHJcbiAgICB0b2dnbGVTdHJpa2VUaHJvdWdoID0gXCJzdHJpa2VUaHJvdWdoXCIsXHJcbiAgICByZW1vdmVGb3JtYXQgPSBcInJlbW92ZUZvcm1hdFwiLFxyXG5cclxuICAgIC8qKiBCbG9jayBvcGVyYXRpb25zIGNvbW1hbmRzICovXHJcbiAgICB0cmFuc2Zvcm1CbG9jayA9IFwidHJhbnNmb3JtQmxvY2tcIixcclxuICAgIGR1cGxpY2F0ZUJsb2NrID0gXCJkdXBsaWNhdGVCbG9ja1wiLFxyXG4gICAgZGVsZXRlQmxvY2sgPSBcImRlbGV0ZUJsb2NrXCIsXHJcbiAgICBjcmVhdGVEZWZhdWx0QmxvY2sgPSBcImNyZWF0ZURlZmF1bHRCbG9ja1wiLFxyXG4gICAgZm9jdXNPblByZXZpb3VzQmxvY2sgPSBcImZvY3VzT25QcmV2aW91c0Jsb2NrXCIsXHJcbiAgICBcclxuICAgIC8qKiB3aWxkY2FyZCBjb21tYW5kIGNvbnRleHQgYmFzZWQqL1xyXG4gICAgaW5zZXJ0TmV3ID0gXCJpbnNlcnROZXdcIixcclxuXHJcbiAgICAvKiogdGFibGUgY29tbWFuZHMgKi9cclxuICAgIGluc2VydFRhYmxlUm93QWJvdmUgPSBcImluc2VydFRhYmxlUm93QWJvdmVcIixcclxuICAgIGluc2VydFRhYmxlUm93QmVsb3cgPSBcImluc2VydFRhYmxlUm93QmVsb3dcIixcclxuICAgIGluc2VydFRhYmxlQ29sdW1uTGVmdCA9IFwiaW5zZXJ0VGFibGVDb2x1bW5MZWZ0XCIsXHJcbiAgICBpbnNlcnRUYWJsZUNvbHVtblJpZ2h0ID0gXCJpbnNlcnRUYWJsZUNvbHVtblJpZ2h0XCIsXHJcbiAgICBzaG93SW5zZXJ0VGFibGVDb2x1bW5FbGVtZW50ID0gXCJzaG93SW5zZXJ0VGFibGVDb2x1bW5FbGVtZW50XCIsXHJcbiAgICBzaG93SW5zZXJ0VGFibGVSb3dFbGVtZW50ID0gXCJzaG93SW5zZXJ0VGFibGVSb3dFbGVtZW50XCIsXHJcbiAgICBoaWRlSW5zZXJ0VGFibGVDb2x1bW5FbGVtZW50ID0gXCJoaWRlSW5zZXJ0VGFibGVDb2x1bW5FbGVtZW50XCIsXHJcbiAgICBoaWRlSW5zZXJ0VGFibGVSb3dFbGVtZW50ID0gXCJoaWRlSW5zZXJ0VGFibGVSb3dFbGVtZW50XCIsXHJcbiAgICB0b2dnbGVDZWxsSGlsaXRlQ29sb3IgPSBcInRvZ2dsZUNlbGxIaWxpdGVDb2xvclwiLFxyXG4gICAgcmVtb3ZlQ29sdW1uID0gXCJyZW1vdmVDb2x1bW5cIixcclxuICAgIHJlbW92ZVJvdyA9IFwicmVtb3ZlUm93XCIsXHJcbiAgICBjaGFuZ2VUYWJsZUJvcmRlckNvbG9yID0gXCJjaGFuZ2VUYWJsZUJvcmRlckNvbG9yXCJcclxufSIsImV4cG9ydCBlbnVtIEN1c3RvbVVJRXZlbnRzIHtcclxuICAgIFxyXG4gICAgQ29sb3JDaGFuZ2VSZXF1ZXN0ID0gXCJDb2xvckNoYW5nZVJlcXVlc3RcIixcclxuICAgIFNob3dIaWRlQWN0aXZlQnV0dG9uID0gXCJTaG93SGlkZUFjdGl2ZUJ1dHRvblwiLFxyXG4gICAgUmVzZXRBY3RpdmVCdXR0b25zID0gXCJSZXNldEFjdGl2ZUJ1dHRvbnNcIixcclxuICAgIENsb3NlRWxlbWVudCA9IFwiSGlkZUNvbXBvbmVudFwiLFxyXG4gICAgU2hvd0VsZW1lbnQgPSBcIlNob3dFbGVtZW50XCJcclxuICAgIFxyXG59IiwiZXhwb3J0IGVudW0gQnV0dG9uSURzIHtcclxuICAgIExpbmsgPSBcImxpbmtCdXR0b25cIixcclxuICAgIEJvbGQgPSBcImJvbGRCdXR0b25cIixcclxuICAgIEl0YWxpYyA9IFwiaXRhbGljQnV0dG9uXCIsXHJcbiAgICBVbmRlcmxpbmUgPSBcInVuZGVybGluZUJ1dHRvblwiLFxyXG4gICAgSW5saW5lQ29kZSA9IFwiaW5saW5lQ29kZUJ1dHRvblwiLFxyXG4gICAgU3RyaWtldGhyb3VnaCA9IFwic3RyaWtldGhyb3VnaEJ1dHRvblwiXHJcbn0iLCJleHBvcnQgZW51bSBaSW5kZXgge1xyXG4gICAgTG93SW1wb3J0YW5jZSA9IFwiMTAwXCIsIFxyXG4gICAgU2xpZ2h0bHlJbXBvcnRhbnQgPSBcIjIwMFwiLFxyXG4gICAgTmV1dHJhbCA9IFwiMzAwXCIsXHJcbiAgICBNb2RlcmF0ZWx5SW1wb3J0YW50ID0gXCI0MDBcIixcclxuICAgIFZlcnlJbXBvcnRhbnQgPSBcIjUwMFwiLCBcclxuICAgIEV4dHJlbWVseUltcG9ydGFudCA9IFwiNjAwXCJcclxufSIsIi8qKlxyXG4gKiBFbnVtIHJlcHJlc2VudGluZyB0aGUgZGVmYXVsdCBKYXZhU2NyaXB0IGV2ZW50cyBmb3IgbW91c2UsIGtleWJvYXJkLCBhbmQgZm9jdXMgYWN0aW9ucy5cclxuICogVGhpcyBlbnVtZXJhdGlvbiBwcm92aWRlcyBzdGFuZGFyZGl6ZWQgc3RyaW5ncyBmb3IgYXR0YWNoaW5nIGV2ZW50IGxpc3RlbmVycyB0byBET00gZWxlbWVudHMuXHJcbiAqIFVzZSB0aGVzZSBlbnVtIHZhbHVlcyB0byBlbnN1cmUgY29uc2lzdGVuY3kgYW5kIGF2b2lkIHR5cG9zIGluIGV2ZW50IG5hbWVzIHRocm91Z2hvdXQgeW91ciBhcHBsaWNhdGlvbi5cclxuICovXHJcbmV4cG9ydCBlbnVtIERlZmF1bHRKU0V2ZW50cyB7XHJcbiAgICAvKiogRXZlbnQgZmlyZWQgd2hlbiB0aGUgbW91c2UgYnV0dG9uIGlzIHByZXNzZWQgZG93bi4gKi9cclxuICAgIE1vdXNlZG93biA9IFwibW91c2Vkb3duXCIsXHJcbiAgICAvKiogRXZlbnQgZmlyZWQgd2hlbiB0aGUgbW91c2UgaXMgbW92ZWQgb3ZlciBhbiBlbGVtZW50LiAqL1xyXG4gICAgTW91c2Vtb3ZlID0gXCJtb3VzZW1vdmVcIixcclxuICAgIC8qKiBFdmVudCBmaXJlZCB3aGVuIHRoZSBtb3VzZSBidXR0b24gaXMgcmVsZWFzZWQuICovXHJcbiAgICBNb3VzZXVwID0gXCJtb3VzZXVwXCIsXHJcbiAgICAvKiogRXZlbnQgZmlyZWQgd2hlbiBhIGtleSBpcyByZWxlYXNlZCBvbiB0aGUga2V5Ym9hcmQuICovXHJcbiAgICBLZXl1cCA9IFwia2V5dXBcIixcclxuICAgIC8qKiBFdmVudCBmaXJlZCB3aGVuIGEga2V5IGlzIHByZXNzZWQgZG93biBvbiB0aGUga2V5Ym9hcmQuICovXHJcbiAgICBLZXlkb3duID0gXCJrZXlkb3duXCIsXHJcbiAgICAvKiogRXZlbnQgZmlyZWQgd2hlbiBhbiBlbGVtZW50IGxvc2VzIGZvY3VzLiAqL1xyXG4gICAgQmx1ciA9IFwiYmx1clwiLFxyXG4gICAgU2VsZWN0U3RhcnQgPSBcInNlbGVjdHN0YXJ0XCIsXHJcbiAgICBTZWxlY3Rpb25DaGFuZ2UgPSBcInNlbGVjdGlvbmNoYW5nZVwiLFxyXG4gICAgQ2xpY2sgPSBcImNsaWNrXCJcclxufSIsImV4cG9ydCBlbnVtIERyb3Bkb3duSXRlbUlEcyB7XHJcbiAgICBCYWNrZ3JvdW5kT3B0aW9uUmVkID0gXCJCYWNrZ3JvdW5kT3B0aW9uUmVkXCIsXHJcbiAgICBCYWNrZ3JvdW5kT3B0aW9uR3JlZW4gPSBcIkJhY2tncm91bmRPcHRpb25SZWRcIixcclxuICAgIEJhY2tncm91bmRPcHRpb25CbHVlID0gXCJCYWNrZ3JvdW5kT3B0aW9uUmVkXCIsXHJcbiAgICBCYWNrZ3JvdW5kT3B0aW9uWWVsbG93ID0gXCJCYWNrZ3JvdW5kT3B0aW9uUmVkXCIsXHJcbiAgICBCYWNrZ3JvdW5kT3B0aW9uR3JleSA9IFwiQmFja2dyb3VuZE9wdGlvblJlZFwiLFxyXG4gICAgQmFja2dyb3VuZE9wdGlvbk5vbmUgPSBcIkJhY2tncm91bmRPcHRpb25SZWRcIlxyXG59IiwiZXhwb3J0IGVudW0gRHJvcGRvd25MaXN0SURzIHtcclxuICAgIENvbG9yVGV4dE9wdGlvblNlbGVjdCA9IFwiY29sb3JUZXh0T3B0aW9uU2VsZWN0XCIsXHJcblxyXG59IiwiZXhwb3J0IGVudW0gRHJvcGRvd25NZW51SURzIHtcclxuICAgIENvbG9yVGV4dE9wdGlvbnNNZW51ID0gXCJjb2xvclRleHRPcHRpb25zTWVudVwiXHJcbn0iLCJcbiAgICAgIGltcG9ydCBBUEkgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgIGltcG9ydCBkb21BUEkgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZURvbUFQSS5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydEZuIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qc1wiO1xuICAgICAgaW1wb3J0IHNldEF0dHJpYnV0ZXMgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRTdHlsZUVsZW1lbnQgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanNcIjtcbiAgICAgIGltcG9ydCBzdHlsZVRhZ1RyYW5zZm9ybUZuIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanNcIjtcbiAgICAgIGltcG9ydCBjb250ZW50LCAqIGFzIG5hbWVkRXhwb3J0IGZyb20gXCIhIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vbWFpbi5jc3NcIjtcbiAgICAgIFxuICAgICAgXG5cbnZhciBvcHRpb25zID0ge307XG5cbm9wdGlvbnMuc3R5bGVUYWdUcmFuc2Zvcm0gPSBzdHlsZVRhZ1RyYW5zZm9ybUZuO1xub3B0aW9ucy5zZXRBdHRyaWJ1dGVzID0gc2V0QXR0cmlidXRlcztcbm9wdGlvbnMuaW5zZXJ0ID0gaW5zZXJ0Rm4uYmluZChudWxsLCBcImhlYWRcIik7XG5vcHRpb25zLmRvbUFQSSA9IGRvbUFQSTtcbm9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50ID0gaW5zZXJ0U3R5bGVFbGVtZW50O1xuXG52YXIgdXBkYXRlID0gQVBJKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0ICogZnJvbSBcIiEhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9tYWluLmNzc1wiO1xuICAgICAgIGV4cG9ydCBkZWZhdWx0IGNvbnRlbnQgJiYgY29udGVudC5sb2NhbHMgPyBjb250ZW50LmxvY2FscyA6IHVuZGVmaW5lZDtcbiIsImV4cG9ydCBjbGFzcyBVdGlscyB7XG4gICAgc3RhdGljIGdlbmVyYXRlVW5pcXVlSWQoKSB7XG4gICAgICAgIGNvbnN0IHRpbWVQYXJ0ID0gRGF0ZS5ub3coKS50b1N0cmluZygzNik7XG4gICAgICAgIGNvbnN0IHJhbmRvbUFycmF5ID0gbmV3IFVpbnQzMkFycmF5KDEpO1xuICAgICAgICB3aW5kb3cuY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhyYW5kb21BcnJheSk7XG4gICAgICAgIGNvbnN0IHJhbmRvbVBhcnQgPSByYW5kb21BcnJheVswXS50b1N0cmluZygzNik7XG4gICAgICAgIHJldHVybiB0aW1lUGFydCArIHJhbmRvbVBhcnQ7XG4gICAgfVxuXG4gICAgc3RhdGljIHJnYlRvSGV4KHJnYjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgcmdiQXJyYXkgPSByZ2IubWF0Y2goL1xcZCsvZykhLm1hcChOdW1iZXIpO1xuICAgICAgICByZXR1cm4gXCIjXCIgKyByZ2JBcnJheS5tYXAoeCA9PiB7XG4gICAgICAgICAgICBjb25zdCBoZXggPSB4LnRvU3RyaW5nKDE2KTtcbiAgICAgICAgICAgIHJldHVybiBoZXgubGVuZ3RoID09PSAxID8gXCIwXCIgKyBoZXggOiBoZXg7XG4gICAgICAgIH0pLmpvaW4oXCJcIik7XG4gICAgfVxufSIsImltcG9ydCB7IENvbnRlbnRUeXBlcyB9IGZyb20gXCJAL2NvbW1vbi9Db250ZW50VHlwZXNcIjtcbmltcG9ydCB7IElFbGVtZW50RmFjdG9yeVNlcnZpY2UgfSBmcm9tIFwiLi9JRWxlbWVudEZhY3RvcnlTZXJ2aWNlXCI7XG5pbXBvcnQgeyBVdGlscyB9IGZyb20gXCJAL3V0aWxpdGllcy9VdGlsc1wiO1xuaW1wb3J0IHsgSWNvbnMgfSBmcm9tIFwiQC9jb21tb24vSWNvbnNcIjtcblxuaW50ZXJmYWNlIEVsZW1lbnRDcmVhdG9yIHtcbiAgICAoY29udGVudDogc3RyaW5nIHwgbnVsbCk6IEhUTUxFbGVtZW50O1xufVxuXG5leHBvcnQgY2xhc3MgRWxlbWVudEZhY3RvcnlTZXJ2aWNlIGltcGxlbWVudHMgSUVsZW1lbnRGYWN0b3J5U2VydmljZSB7XG5cbiAgICBwcml2YXRlIGNyZWF0b3JzOiB7IFt0eXBlOiBzdHJpbmddOiBFbGVtZW50Q3JlYXRvciB9O1xuXG4gICAgcHJpdmF0ZSBzdGF0aWMgX2luc3RhbmNlOiBFbGVtZW50RmFjdG9yeVNlcnZpY2U7XG5cbiAgICBzdGF0aWMgRUxFTUVOVF9UWVBFUyA9IHtcbiAgICAgICAgQkxPQ0tfUEFSQUdSQVBIOiBcImJsb2NrLXBcIixcbiAgICAgICAgUEFSQUdSQVBIOiBcInBcIixcbiAgICAgICAgQ0hFQ0tCT1hfSVRFTTogXCJjaGVja2JveEl0ZW1cIixcbiAgICAgICAgTElTVF9JVEVNOiBcImxpc3RJdGVtXCIsXG4gICAgICAgIENPREU6IFwiY29kZVwiLFxuICAgICAgICBRVU9URTogXCJibG9ja3F1b3RlXCIsXG4gICAgICAgIEJVTExFVEVEX0xJU1Q6IFwidWxcIixcbiAgICAgICAgTlVNQkVSRURfTElTVDogXCJvbFwiLFxuICAgICAgICBDSEVDS19MSVNUOiBcImNoZWNrTGlzdHNcIixcbiAgICAgICAgSEVBREVSXzE6IFwiaDFcIixcbiAgICAgICAgSEVBREVSXzI6IFwiaDJcIixcbiAgICAgICAgSEVBREVSXzM6IFwiaDNcIixcbiAgICAgICAgSEVBREVSXzQ6IFwiaDRcIixcbiAgICAgICAgSEVBREVSXzU6IFwiaDVcIixcbiAgICAgICAgSEVBREVSXzY6IFwiaDZcIixcbiAgICAgICAgRFJBR19IQU5ETEVfQlVUVE9OOiBcImRyYWctaGFuZGxlLWJ1dHRvblwiLFxuICAgICAgICBUQUJMRTogXCJ0YWJsZVwiLFxuICAgICAgICBJTUFHRTogXCJpbWFnZVwiLFxuICAgICAgICBDQUxMT1VUOiBcImNhbGxvdXRcIlxuICAgIH1cblxuICAgIHByaXZhdGUgY29uc3RydWN0b3IoKSB7XG5cbiAgICAgICAgaWYgKEVsZW1lbnRGYWN0b3J5U2VydmljZS5faW5zdGFuY2UpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVzZSBFbGVtZW50RmFjdG9yeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKSB0byBnZXQgaW5zdGFuY2UuXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jcmVhdG9ycyA9IHt9O1xuXG4gICAgICAgIHRoaXMucmVnaXN0ZXIoRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuQkxPQ0tfUEFSQUdSQVBILCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuYmxvY2tQYXJhZ3JhcGhDcmVhdG9yKCkpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVyKEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLlBBUkFHUkFQSCwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLnBhcmFncmFwaENyZWF0b3IoKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXIoRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuQ0hFQ0tCT1hfSVRFTSwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmNoZWNrYm94SXRlbUNyZWF0b3IoKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXIoRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuTElTVF9JVEVNLCBFbGVtZW50RmFjdG9yeVNlcnZpY2UubGlzdEl0ZW1DcmVhdG9yKCkpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVyKEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkNPREUsIEVsZW1lbnRGYWN0b3J5U2VydmljZS5jb2RlQ3JlYXRvcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5RVU9URSwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLnF1b3RlQ3JlYXRvcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5DSEVDS19MSVNULCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuY2hlY2tMaXN0Q3JlYXRvcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5CVUxMRVRFRF9MSVNULCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuYnVsbGV0ZWRMaXN0Q3JlYXRvcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5OVU1CRVJFRF9MSVNULCBFbGVtZW50RmFjdG9yeVNlcnZpY2UubnVtYmVyZWRMaXN0Q3JlYXRvcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfMSwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmhlYWRpbmdDcmVhdG9yKDEpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfMiwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmhlYWRpbmdDcmVhdG9yKDIpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfMywgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmhlYWRpbmdDcmVhdG9yKDMpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfNCwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmhlYWRpbmdDcmVhdG9yKDQpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfNSwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmhlYWRpbmdDcmVhdG9yKDUpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfNiwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmhlYWRpbmdDcmVhdG9yKDYpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5EUkFHX0hBTkRMRV9CVVRUT04sIEVsZW1lbnRGYWN0b3J5U2VydmljZS5kcmFnSGFuZGxlQnV0dG9uQ3JlYXRvcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5UQUJMRSwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLnRhYmxlQ3JlYXRvcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5JTUFHRSwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmltYWdlQ3JlYXRvcjIoKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXIoRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuQ0FMTE9VVCwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmNhbGxvdXRDcmVhdG9yKCkpO1xuXG5cblxuICAgICAgICBFbGVtZW50RmFjdG9yeVNlcnZpY2UuX2luc3RhbmNlID0gdGhpcztcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0SW5zdGFuY2UoKTogRWxlbWVudEZhY3RvcnlTZXJ2aWNlIHtcblxuICAgICAgICBpZiAoIXRoaXMuX2luc3RhbmNlKSB7XG4gICAgICAgICAgICB0aGlzLl9pbnN0YW5jZSA9IG5ldyBFbGVtZW50RmFjdG9yeVNlcnZpY2UoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLl9pbnN0YW5jZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlZ2lzdGVyKHR5cGU6IHN0cmluZywgY3JlYXRvcjogRWxlbWVudENyZWF0b3IpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jcmVhdG9yc1t0eXBlXSA9IGNyZWF0b3I7XG4gICAgfVxuXG4gICAgY3JlYXRlKHR5cGU6IHN0cmluZywgY29udGVudD86IHN0cmluZyk6IEhUTUxFbGVtZW50IHtcbiAgICAgICAgY29uc3QgY3JlYXRvciA9IHRoaXMuY3JlYXRvcnNbdHlwZV07XG5cbiAgICAgICAgaWYgKCFjcmVhdG9yKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBObyBjcmVhdG9yIHJlZ2lzdGVyZWQgZm9yIHR5cGU6ICR7dHlwZX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjcmVhdG9yKGNvbnRlbnQgfHwgXCJcIik7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgYmxvY2tQYXJhZ3JhcGhDcmVhdG9yKCk6IEVsZW1lbnRDcmVhdG9yIHtcbiAgICAgICAgcmV0dXJuIGNvbnRlbnQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIEVsZW1lbnRGYWN0b3J5U2VydmljZS5ibG9ja1BhcmFncmFwaChjb250ZW50KTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBwYXJhZ3JhcGhDcmVhdG9yKCk6IEVsZW1lbnRDcmVhdG9yIHtcbiAgICAgICAgcmV0dXJuIGNvbnRlbnQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIEVsZW1lbnRGYWN0b3J5U2VydmljZS5wYXJhZ3JhcGgoY29udGVudCk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgaGVhZGluZ0NyZWF0b3IobGV2ZWw6IG51bWJlcik6IEVsZW1lbnRDcmVhdG9yIHtcbiAgICAgICAgcmV0dXJuIGNvbnRlbnQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIEVsZW1lbnRGYWN0b3J5U2VydmljZS5oZWFkaW5nKGxldmVsLCBjb250ZW50KTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBjaGVja2JveEl0ZW1DcmVhdG9yKCk6IEVsZW1lbnRDcmVhdG9yIHtcbiAgICAgICAgcmV0dXJuIGNvbnRlbnQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIEVsZW1lbnRGYWN0b3J5U2VydmljZS5jaGVja2JveEl0ZW0oY29udGVudCB8fCBcIlwiKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBsaXN0SXRlbUNyZWF0b3IoKTogRWxlbWVudENyZWF0b3Ige1xuXG4gICAgICAgIHJldHVybiBjb250ZW50ID0+IHtcbiAgICAgICAgICAgIHJldHVybiBFbGVtZW50RmFjdG9yeVNlcnZpY2UubGlzdEl0ZW1fMihjb250ZW50KTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBkcmFnSGFuZGxlQnV0dG9uQ3JlYXRvcigpOiBFbGVtZW50Q3JlYXRvciB7XG5cbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBFbGVtZW50RmFjdG9yeVNlcnZpY2UuZHJhZ0hhbmRsZUJ1dHRvbigpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGNvZGVDcmVhdG9yKCk6IEVsZW1lbnRDcmVhdG9yIHtcbiAgICAgICAgcmV0dXJuIGNvbnRlbnQgPT4ge1xuICAgICAgICAgICAgY29uc3QgcHJlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgncHJlJyk7XG4gICAgICAgICAgICBjb25zdCBjb2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY29kZScpO1xuICAgICAgICAgICAgY29kZS50ZXh0Q29udGVudCA9IGNvbnRlbnQgfHwgXCJcIjtcbiAgICAgICAgICAgIHByZS5hcHBlbmRDaGlsZChjb2RlKTtcblxuICAgICAgICAgICAgY29kZS5jb250ZW50RWRpdGFibGUgPSBcInRydWVcIjtcbiAgICAgICAgICAgIHByZS5jbGFzc0xpc3QuYWRkKCdqb2hhbm5lcy1jb250ZW50LWVsZW1lbnQnKTtcbiAgICAgICAgICAgIGNvZGUuY2xhc3NMaXN0LmFkZCgnam9oYW5uZXMtY29kZScpO1xuXG4gICAgICAgICAgICByZXR1cm4gcHJlO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIHF1b3RlQ3JlYXRvcigpOiBFbGVtZW50Q3JlYXRvciB7XG4gICAgICAgIHJldHVybiBjb250ZW50ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGJsb2NrcXVvdGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdibG9ja3F1b3RlJyk7XG4gICAgICAgICAgICBibG9ja3F1b3RlLnRleHRDb250ZW50ID0gY29udGVudCB8fCBcIlwiO1xuICAgICAgICAgICAgYmxvY2txdW90ZS5jb250ZW50RWRpdGFibGUgPSBcInRydWVcIjtcbiAgICAgICAgICAgIGJsb2NrcXVvdGUuY2xhc3NMaXN0LmFkZCgnam9oYW5uZXMtY29udGVudC1lbGVtZW50Jyk7XG4gICAgICAgICAgICByZXR1cm4gYmxvY2txdW90ZTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBjaGVja0xpc3RDcmVhdG9yKCk6IEVsZW1lbnRDcmVhdG9yIHtcbiAgICAgICAgcmV0dXJuIGNvbnRlbnQgPT4ge1xuICAgICAgICAgICAgY29uc3QgdWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd1bCcpO1xuICAgICAgICAgICAgLy8gdWwuY29udGVudEVkaXRhYmxlID0gXCJ0cnVlXCI7XG4gICAgICAgICAgICB1bC5jbGFzc0xpc3QuYWRkKCdqb2hhbm5lcy1jb250ZW50LWVsZW1lbnQnKTtcbiAgICAgICAgICAgIHVsLmNsYXNzTGlzdC5hZGQoJ3N3aXR0YWJsZScpO1xuICAgICAgICAgICAgdWwuY2xhc3NMaXN0LmFkZCgnbGlzdCcpO1xuICAgICAgICAgICAgdWwuY2xhc3NMaXN0LmFkZCgnY2hlY2tib3gtbGlzdCcpO1xuICAgICAgICAgICAgdWwuc2V0QXR0cmlidXRlKFwiZGF0YS1jb250ZW50LXR5cGVcIiwgQ29udGVudFR5cGVzLkNoZWNrTGlzdCk7XG5cbiAgICAgICAgICAgIGNvbnN0IGluaXRpYWxJdGVtID0gRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmNoZWNrYm94SXRlbShjb250ZW50IHx8IFwiXCIpO1xuXG4gICAgICAgICAgICB1bC5hcHBlbmRDaGlsZChpbml0aWFsSXRlbSk7XG5cbiAgICAgICAgICAgIHJldHVybiB1bDtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBidWxsZXRlZExpc3RDcmVhdG9yKCk6IEVsZW1lbnRDcmVhdG9yIHtcbiAgICAgICAgcmV0dXJuIGNvbnRlbnQgPT4ge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3VsJyk7XG4gICAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShcImRhdGEtY29udGVudC10eXBlXCIsIENvbnRlbnRUeXBlcy5CdWxsZXRlZExpc3QpO1xuICAgICAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdqb2hhbm5lcy1jb250ZW50LWVsZW1lbnQnKTtcbiAgICAgICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnc3dpdHRhYmxlJyk7XG4gICAgICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2xpc3QnKTtcblxuICAgICAgICAgICAgY29uc3QgaW5pdGlhbEl0ZW0gPSBFbGVtZW50RmFjdG9yeVNlcnZpY2UubGlzdEl0ZW1fMihjb250ZW50IHx8IFwiXCIpO1xuXG4gICAgICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKGluaXRpYWxJdGVtKTtcblxuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgbnVtYmVyZWRMaXN0Q3JlYXRvcigpOiBFbGVtZW50Q3JlYXRvciB7XG4gICAgICAgIHJldHVybiBjb250ZW50ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdvbCcpO1xuICAgICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJkYXRhLWNvbnRlbnQtdHlwZVwiLCBDb250ZW50VHlwZXMuTnVtYmVyZWRMaXN0KTtcbiAgICAgICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnam9oYW5uZXMtY29udGVudC1lbGVtZW50Jyk7XG4gICAgICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3N3aXR0YWJsZScpO1xuICAgICAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdsaXN0Jyk7XG5cbiAgICAgICAgICAgIGNvbnN0IGluaXRpYWxJdGVtID0gRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmxpc3RJdGVtXzIoY29udGVudCB8fCBcIlwiKTtcblxuICAgICAgICAgICAgZWxlbWVudC5hcHBlbmRDaGlsZChpbml0aWFsSXRlbSk7XG5cbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgICAgICB9O1xuICAgIH1cblxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgdGFibGVDcmVhdG9yKCk6IEVsZW1lbnRDcmVhdG9yIHtcbiAgICAgICAgcmV0dXJuIGNvbnRlbnQgPT4ge1xuXG4gICAgICAgICAgICBjb25zdCB0YWJsZVNoZWxsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgICAgIHRhYmxlU2hlbGwuY2xhc3NMaXN0LmFkZChcInRhYmxlLXNoZWxsXCIpO1xuXG4gICAgICAgICAgICBjb25zdCB0YWJsZUNvbnRyb2xsZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAgICAgdGFibGVDb250cm9sbGVyLmNsYXNzTGlzdC5hZGQoXCJ0YWJsZS1jb250cm9sbGVyXCIpO1xuXG4gICAgICAgICAgICBjb25zdCB0YWJsZVdyYXBwZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAgICAgdGFibGVXcmFwcGVyLmNsYXNzTGlzdC5hZGQoXCJ0YWJsZS13cmFwcGVyXCIpO1xuXG4gICAgICAgICAgICBjb25zdCB0YWJsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RhYmxlJyk7XG4gICAgICAgICAgICB0YWJsZS5jbGFzc0xpc3QuYWRkKCdqb2hhbm5lcy1jb250ZW50LWVsZW1lbnQnLCAnc3dpdHRhYmxlJywgJ3RhYmxlJyk7XG4gICAgICAgICAgICB0YWJsZS5zZXRBdHRyaWJ1dGUoXCJkYXRhLWNvbnRlbnQtdHlwZVwiLCBDb250ZW50VHlwZXMuVGFibGUpO1xuXG4gICAgICAgICAgICB0YWJsZVNoZWxsLmFwcGVuZENoaWxkKHRhYmxlQ29udHJvbGxlcik7XG4gICAgICAgICAgICB0YWJsZUNvbnRyb2xsZXIuYXBwZW5kQ2hpbGQodGFibGVXcmFwcGVyKTtcbiAgICAgICAgICAgIHRhYmxlV3JhcHBlci5hcHBlbmRDaGlsZCh0YWJsZSk7XG5cbiAgICAgICAgICAgIGNvbnN0IHRib2R5ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGJvZHknKTtcbiAgICAgICAgICAgIHRhYmxlLmFwcGVuZENoaWxkKHRib2R5KTtcblxuICAgICAgICAgICAgY29uc3Qgcm93RGF0YSA9IGNvbnRlbnQgPyBjb250ZW50LnNwbGl0KCcsJykgOiBbXTtcbiAgICAgICAgICAgIGNvbnN0IHJvdyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7XG4gICAgICAgICAgICByb3dEYXRhLmZvckVhY2goY2VsbENvbnRlbnQgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNlbGwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpO1xuICAgICAgICAgICAgICAgIGNlbGwuY2xhc3NMaXN0LmFkZChcImZvY3VzYWJsZVwiKTtcbiAgICAgICAgICAgICAgICBjZWxsLnNldEF0dHJpYnV0ZShcImRhdGEtcGxhY2Vob2xkZXJcIiwgXCJjZWxsXCIpO1xuICAgICAgICAgICAgICAgIGNlbGwudGV4dENvbnRlbnQgPSBjZWxsQ29udGVudDtcbiAgICAgICAgICAgICAgICBjZWxsLmNvbnRlbnRFZGl0YWJsZSA9ICd0cnVlJztcbiAgICAgICAgICAgICAgICByb3cuYXBwZW5kQ2hpbGQoY2VsbCk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdGJvZHkuYXBwZW5kQ2hpbGQocm93KTtcblxuICAgICAgICAgICAgY29uc3QgYWRkUm93ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgICAgIGFkZFJvdy5jbGFzc0xpc3QuYWRkKFwiYWRkLXRhYmxlLXJvd1wiKTtcbiAgICAgICAgICAgIGFkZFJvdy5pbm5lckhUTUwgPSBgPHN2ZyB3aWR0aD1cIjFyZW1cIiBoZWlnaHQ9XCIxcmVtXCIgZmlsbD1cImN1cnJlbnRDb2xvclwiPjx1c2UgeGxpbms6aHJlZj1cIiNpY29uLXBsdXNcIj48L3VzZT48L3N2Zz5gO1xuXG4gICAgICAgICAgICBjb25zdCBhZGRDb2x1bW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAgICAgYWRkQ29sdW1uLmNsYXNzTGlzdC5hZGQoXCJhZGQtdGFibGUtY29sdW1uXCIpO1xuICAgICAgICAgICAgYWRkQ29sdW1uLmlubmVySFRNTCA9IGA8c3ZnIHdpZHRoPVwiMXJlbVwiIGhlaWdodD1cIjFyZW1cIiBmaWxsPVwiY3VycmVudENvbG9yXCI+PHVzZSB4bGluazpocmVmPVwiI2ljb24tcGx1c1wiPjwvdXNlPjwvc3ZnPmA7XG4gICAgXG4gICAgICAgICAgICB0YWJsZUNvbnRyb2xsZXIuYXBwZW5kQ2hpbGQoYWRkUm93KTtcbiAgICAgICAgICAgIHRhYmxlQ29udHJvbGxlci5hcHBlbmRDaGlsZChhZGRDb2x1bW4pO1xuXG4gICAgICAgICAgICByZXR1cm4gdGFibGVTaGVsbDtcbiAgICAgICAgfTtcbiAgICB9XG5cblxuICAgIHByaXZhdGUgc3RhdGljIGltYWdlQ3JlYXRvcjIoKTogRWxlbWVudENyZWF0b3Ige1xuICAgICAgICByZXR1cm4gY29udGVudCA9PiB7XG4gICAgICAgICAgICBjb25zdCBpbWFnZUNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgaW1hZ2VDb250YWluZXIuY2xhc3NMaXN0LmFkZChcImpvaGFubmVzLWNvbnRlbnQtZWxlbWVudFwiLCBcInN3aXR0YWJsZVwiLCBcIm5vLXNlbGVjdGlvblwiKTtcbiAgICAgICAgICAgIGltYWdlQ29udGFpbmVyLnNldEF0dHJpYnV0ZShcImRhdGEtY29udGVudC10eXBlXCIsIENvbnRlbnRUeXBlcy5JbWFnZSk7XG5cbiAgICAgICAgICAgIGltYWdlQ29udGFpbmVyLkFUVFJJQlVURV9OT0RFXG4gICAgXG4gICAgICAgICAgICBjb25zdCB0ZXh0QXJlYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgdGV4dEFyZWEuY2xhc3NMaXN0LmFkZChcImVkaXRvci1vbmx5XCIsIFwidGVtcC1pbWFnZS1yZXBsYWNlXCIpO1xuICAgICAgICAgICAgdGV4dEFyZWEuc3R5bGUucGFkZGluZyA9IFwiMXJlbVwiO1xuICAgICAgICAgICAgdGV4dEFyZWEuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gXCIjZTdlNmUzXCI7XG4gICAgICAgICAgICBpbWFnZUNvbnRhaW5lci5hcHBlbmRDaGlsZCh0ZXh0QXJlYSk7XG4gICAgICAgICAgICB0ZXh0QXJlYS5zdHlsZS5jb2xvciA9IFwicmdiYSg1NSwgNTMsIDQ3LCAwLjUpXCJcblxuICAgICAgICAgICAgdGV4dEFyZWEuc3R5bGUuZGlzcGxheSA9IFwiZmxleFwiO1xuICAgICAgICAgICAgdGV4dEFyZWEuc3R5bGUuZ2FwID0gXCI1cHhcIjtcbiAgICAgICAgICAgIHRleHRBcmVhLnN0eWxlLmFsaWduSXRlbXMgPSBcImNlbnRlclwiO1xuXG4gICAgICAgICAgICBjb25zdCBpY29uID0gdGhpcy5pY29uKEljb25zLkltYWdlKTtcblxuICAgICAgICAgICAgaWNvbi5zdHlsZS5kaXNwbGF5ID0gXCJmbGV4XCI7XG4gICAgICAgICAgICBpY29uLnN0eWxlLmFsaWduSXRlbXMgPSBcImNlbnRlclwiO1xuXG4gICAgICAgICAgICB0ZXh0QXJlYS5hcHBlbmRDaGlsZChpY29uKTtcblxuICAgICAgICAgICAgY29uc3Qgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuICAgICAgICAgICAgc3Bhbi5jbGFzc0xpc3QuYWRkKFwibm8tc2VsZWN0aW9uXCIpO1xuICAgICAgICAgICAgc3Bhbi5pbm5lclRleHQgPSBcIkFkZCBhbiBpbWFnZVwiO1xuXG4gICAgICAgICAgICB0ZXh0QXJlYS5hcHBlbmRDaGlsZChzcGFuKTtcbiAgICBcbiAgICAgICAgICAgIC8vIENyaWFuZG8gbyBib3TDo28gZGUgbWFpcyBvcMOnw7Vlc1xuICAgICAgICAgICAgLy8gY29uc3Qgb3B0aW9uc0J1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xuICAgICAgICAgICAgY29uc3Qgb3B0aW9uc0J1dHRvbiA9IHRoaXMubW9yZU9wdGlvbnNCdXR0b24oKTtcbiAgICAgICAgICAgIC8vIG9wdGlvbnNCdXR0b24uaW5uZXJIVE1MID0gXCImIzgyMzA7XCI7IC8vIFVuaWNvZGUgcGFyYSBcIi4uLlwiXG4gICAgICAgICAgICBvcHRpb25zQnV0dG9uLmNsYXNzTGlzdC5hZGQoJ29wdGlvbnMtYnV0dG9uJywgJ2hpZGUtb24tYmx1cicpO1xuICAgICAgICAgICAgb3B0aW9uc0J1dHRvbi5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gICAgICAgICAgICBvcHRpb25zQnV0dG9uLnN0eWxlLnRvcCA9ICcxMHB4JztcbiAgICAgICAgICAgIG9wdGlvbnNCdXR0b24uc3R5bGUucmlnaHQgPSAnMTBweCc7XG4gICAgICAgICAgICBvcHRpb25zQnV0dG9uLnN0eWxlLmJvcmRlciA9ICdub25lJztcbiAgICAgICAgICAgIG9wdGlvbnNCdXR0b24uc3R5bGUuYmFja2dyb3VuZCA9ICd0cmFuc3BhcmVudCc7XG4gICAgICAgICAgICBvcHRpb25zQnV0dG9uLnN0eWxlLmN1cnNvciA9ICdwb2ludGVyJztcbiAgICAgICAgICAgIG9wdGlvbnNCdXR0b24uc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgJ01vcmUgb3B0aW9ucycpO1xuICAgICAgICAgICAgb3B0aW9uc0J1dHRvbi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOyAvLyBFc2NvbmRlIGluaWNpYWxtZW50ZSBvIGJvdMOjb1xuICAgIFxuICAgICAgICAgICAgaW1hZ2VDb250YWluZXIuYXBwZW5kQ2hpbGQob3B0aW9uc0J1dHRvbik7XG4gICAgXG4gICAgICAgICAgICByZXR1cm4gaW1hZ2VDb250YWluZXI7XG4gICAgICAgIH07XG4gICAgfVxuXG5cbiAgICBwcml2YXRlIHN0YXRpYyBpbWFnZUNyZWF0b3IoKTogRWxlbWVudENyZWF0b3Ige1xuICAgICAgICByZXR1cm4gY29udGVudCA9PiB7XG4gICAgICAgICAgICBjb25zdCBpbWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTtcbiAgICBcbiAgICAgICAgICAgIC8vIEFzc3VtZSAnY29udGVudCcgY29tbyB1bSBVUkwgZGEgaW1hZ2VtIG91IHRleHRvIGRlc2NyaXRpdm8gc2UgcXVpc2VyIG1hbmlwdWxhciBpc3NvLlxuICAgICAgICAgICAgaW1nLnNyYyA9IGNvbnRlbnQgfHwgXCJkZWZhdWx0LWltYWdlLXBhdGguanBnXCI7IC8vIENhbWluaG8gcGFkcsOjbyBzZSBuZW5odW0gY29udGXDumRvIGZvciBmb3JuZWNpZG9cbiAgICAgICAgICAgIGltZy5hbHQgPSBcIkRlc2NyacOnw6NvIGRhIGltYWdlbVwiOyAvLyBBbHRlcm5hdGl2YW1lbnRlLCBwb2RlLXNlIHBhc3NhciBvIGFsdCB0ZXh0IGNvbW8gcGFydGUgZG8gY29udGXDumRvXG4gICAgXG4gICAgICAgICAgICBpbWcuY2xhc3NMaXN0LmFkZCgnam9oYW5uZXMtY29udGVudC1lbGVtZW50Jyk7XG4gICAgICAgICAgICBpbWcuY2xhc3NMaXN0LmFkZCgnc3dpdHRhYmxlJyk7IC8vIEFwZW5hcyBzZSBxdWlzZXIgYXBsaWNhciBlc3RpbG9zIG91IGNvbXBvcnRhbWVudG9zIGVzcGVjw61maWNvc1xuICAgICAgICAgICAgaW1nLmNsYXNzTGlzdC5hZGQoJ2ZvY3VzYWJsZScpO1xuICAgIFxuICAgICAgICAgICAgLy8gVGFtYW5obyBwYWRyw6NvIG91IGRpbsOibWljbywgc2UgbmVjZXNzw6FyaW9cbiAgICAgICAgICAgIGltZy5zdHlsZS53aWR0aCA9IFwiMTAwJVwiOyAvLyBFeGVtcGxvIGRlIGVzdGlsbywgYWp1c3RhciBjb25mb3JtZSBuZWNlc3PDoXJpb1xuICAgICAgICAgICAgaW1nLnN0eWxlLmhlaWdodCA9IFwiYXV0b1wiO1xuICAgIFxuICAgICAgICAgICAgLy8gQWRpY2lvbmFyIG1hbmlwdWxhw6fDo28gZGUgZXZlbnRvcywgc2UgbmVjZXNzw6FyaW9cbiAgICAgICAgICAgIGltZy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkltYWdlbSBjbGljYWRhIVwiKTtcbiAgICAgICAgICAgIH0pO1xuICAgIFxuICAgICAgICAgICAgcmV0dXJuIGltZztcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBjYWxsb3V0Q3JlYXRvcigpOiBFbGVtZW50Q3JlYXRvciB7XG4gICAgICAgIHJldHVybiBjb250ZW50ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNhbGxvdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIGNhbGxvdXQuY2xhc3NMaXN0LmFkZCgnY2FsbG91dCcsICdqb2hhbm5lcy1jb250ZW50LWVsZW1lbnQnLCAnc3dpdHRhYmxlJyk7XG4gICAgXG4gICAgICAgICAgICBjb25zdCB0ZXh0QXJlYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgdGV4dEFyZWEuc2V0QXR0cmlidXRlKFwiZGF0YS1wbGFjZWhvbGRlclwiLCBcIlR5cGUgc29tZXRoaW5nLi4uXCIpO1xuICAgICAgICAgICAgdGV4dEFyZWEuY29udGVudEVkaXRhYmxlID0gXCJ0cnVlXCI7XG4gICAgICAgICAgICB0ZXh0QXJlYS5jbGFzc0xpc3QuYWRkKCdjYWxsb3V0LXRleHQnLCAnZWRpdGFibGUnLCAnZm9jdXNhYmxlJyk7XG4gICAgICAgICAgICB0ZXh0QXJlYS5zdHlsZS5wYWRkaW5nID0gXCIxcmVtXCI7XG4gICAgICAgICAgICB0ZXh0QXJlYS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBcIiNmYmVjZGRcIjtcbiAgICAgICAgICAgIGNhbGxvdXQuYXBwZW5kQ2hpbGQodGV4dEFyZWEpO1xuICAgIFxuICAgICAgICAgICAgLy8gQ3JpYW5kbyBvIGJvdMOjbyBkZSBtYWlzIG9ww6fDtWVzXG4gICAgICAgICAgICAvLyBjb25zdCBvcHRpb25zQnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XG4gICAgICAgICAgICBjb25zdCBvcHRpb25zQnV0dG9uID0gdGhpcy5tb3JlT3B0aW9uc0J1dHRvbigpO1xuICAgICAgICAgICAgLy8gb3B0aW9uc0J1dHRvbi5pbm5lckhUTUwgPSBcIiYjODIzMDtcIjsgLy8gVW5pY29kZSBwYXJhIFwiLi4uXCJcbiAgICAgICAgICAgIG9wdGlvbnNCdXR0b24uY2xhc3NMaXN0LmFkZCgnb3B0aW9ucy1idXR0b24nLCAnaGlkZS1vbi1ibHVyJyk7XG4gICAgICAgICAgICBvcHRpb25zQnV0dG9uLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgICAgICAgICAgIG9wdGlvbnNCdXR0b24uc3R5bGUudG9wID0gJzEwcHgnO1xuICAgICAgICAgICAgb3B0aW9uc0J1dHRvbi5zdHlsZS5yaWdodCA9ICcxMHB4JztcbiAgICAgICAgICAgIG9wdGlvbnNCdXR0b24uc3R5bGUuYm9yZGVyID0gJ25vbmUnO1xuICAgICAgICAgICAgb3B0aW9uc0J1dHRvbi5zdHlsZS5iYWNrZ3JvdW5kID0gJ3RyYW5zcGFyZW50JztcbiAgICAgICAgICAgIG9wdGlvbnNCdXR0b24uc3R5bGUuY3Vyc29yID0gJ3BvaW50ZXInO1xuICAgICAgICAgICAgb3B0aW9uc0J1dHRvbi5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCAnTW9yZSBvcHRpb25zJyk7XG4gICAgICAgICAgICBvcHRpb25zQnV0dG9uLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7IC8vIEVzY29uZGUgaW5pY2lhbG1lbnRlIG8gYm90w6NvXG4gICAgXG4gICAgICAgICAgICBjYWxsb3V0LmFwcGVuZENoaWxkKG9wdGlvbnNCdXR0b24pO1xuICAgIFxuICAgICAgICAgICAgcmV0dXJuIGNhbGxvdXQ7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gcHJpdmF0ZSBzdGF0aWMgbnVtYmVyZWRMaXN0Q3JlYXRvcigpOiBFbGVtZW50Q3JlYXRvciB7XG4gICAgLy8gICAgIHJldHVybiAoKSA9PiB7XG4gICAgLy8gICAgICAgICBjb25zdCBvbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ29sJyk7XG4gICAgLy8gICAgICAgICBvbC5jb250ZW50RWRpdGFibGUgPSBcInRydWVcIjtcbiAgICAvLyAgICAgICAgIG9sLmNsYXNzTGlzdC5hZGQoJ2pvaGFubmVzLWNvbnRlbnQtZWxlbWVudCcpO1xuICAgIC8vICAgICAgICAgcmV0dXJuIG9sO1xuICAgIC8vICAgICB9O1xuICAgIC8vIH1cblxuICAgIHN0YXRpYyBwYXJhZ3JhcGgoY29udGVudDogc3RyaW5nIHwgbnVsbCA9IG51bGwpOiBIVE1MRWxlbWVudCB7XG4gICAgICAgIGNvbnN0IHAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdwJyk7XG5cbiAgICAgICAgcC5pbm5lclRleHQgPSBjb250ZW50IHx8IFwiXCI7XG4gICAgICAgIHAuY29udGVudEVkaXRhYmxlID0gXCJ0cnVlXCI7XG4gICAgICAgIHAuc2V0QXR0cmlidXRlKCdkYXRhLWNvbnRlbnQtdHlwZScsIENvbnRlbnRUeXBlcy5QYXJhZ3JhcGgpO1xuICAgICAgICBwLmNsYXNzTGlzdC5hZGQoJ2pvaGFubmVzLWNvbnRlbnQtZWxlbWVudCcpO1xuICAgICAgICBwLmNsYXNzTGlzdC5hZGQoJ3N3aXR0YWJsZScpO1xuICAgICAgICBwLmNsYXNzTGlzdC5hZGQoJ2ZvY3VzYWJsZScpO1xuICAgICAgICBwLmNsYXNzTGlzdC5hZGQoJ2tleS10cmlnZ2VyJyk7XG4gICAgICAgIHAuc2V0QXR0cmlidXRlKCdkYXRhLXBsYWNlaG9sZGVyJywgJ1dyaXRlIHNvbWV0aGluZyBvciB0eXBlIC8gKHNsYXNoKSB0byBjaG9vc2UgYSBibG9jay4uLicpO1xuXG4gICAgICAgIHJldHVybiBwO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGhlYWRpbmcobGV2ZWw6IG51bWJlciwgY29udGVudDogc3RyaW5nIHwgbnVsbCA9IG51bGwpOiBIVE1MRWxlbWVudCB7XG4gICAgICAgIGNvbnN0IGggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGBoJHtsZXZlbH1gKTtcblxuICAgICAgICBoLmlubmVyVGV4dCA9IGNvbnRlbnQgfHwgXCJcIjtcbiAgICAgICAgaC5jb250ZW50RWRpdGFibGUgPSBcInRydWVcIjtcbiAgICAgICAgaC5zZXRBdHRyaWJ1dGUoJ2RhdGEtY29udGVudC10eXBlJywgYGgke2xldmVsfWApO1xuICAgICAgICBoLmNsYXNzTGlzdC5hZGQoJ2pvaGFubmVzLWNvbnRlbnQtZWxlbWVudCcpO1xuICAgICAgICBoLmNsYXNzTGlzdC5hZGQoJ3N3aXR0YWJsZScpO1xuICAgICAgICBoLmNsYXNzTGlzdC5hZGQoJ2ZvY3VzYWJsZScpO1xuICAgICAgICBoLmNsYXNzTGlzdC5hZGQoJ2ZvY3VzJyk7XG4gICAgICAgIGguY2xhc3NMaXN0LmFkZCgna2V5LXRyaWdnZXInKTtcbiAgICAgICAgaC5zZXRBdHRyaWJ1dGUoJ2RhdGEtcGxhY2Vob2xkZXInLCBgSGVhZGluZyAke2xldmVsfWApO1xuXG4gICAgICAgIHJldHVybiBoO1xuICAgIH1cblxuICAgIHN0YXRpYyBjaGVja2JveEl0ZW0oY29udGVudDogc3RyaW5nKTogSFRNTEVsZW1lbnQge1xuXG4gICAgICAgIGNvbnN0IGlkID0gVXRpbHMuZ2VuZXJhdGVVbmlxdWVJZCgpO1xuXG4gICAgICAgIGxldCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGknKTtcbiAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdkZWxldGFibGUnKTtcbiAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdsaXN0LWl0ZW0nKTtcbiAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdsaXN0LWl0ZW0tY2hlY2thYmxlJyk7XG5cbiAgICAgICAgLy8gaW5pdGlhbEl0ZW0uY2xhc3NMaXN0LmFkZCgna2V5LXRyaWdnZXInKTtcblxuICAgICAgICBsZXQgY2hlY2tib3ggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO1xuICAgICAgICBjaGVja2JveC5pZCA9IGlkO1xuICAgICAgICBjaGVja2JveC5zZXRBdHRyaWJ1dGUoJ3R5cGUnLCAnY2hlY2tib3gnKTtcbiAgICAgICAgLy8gY2hlY2tib3guY29udGVudEVkaXRhYmxlID0gXCJ0cnVlXCI7XG5cbiAgICAgICAgbGV0IHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgc3Bhbi50ZXh0Q29udGVudCA9IGNvbnRlbnQ7XG4gICAgICAgIHNwYW4uc2V0QXR0cmlidXRlKCdkYXRhLXBsYWNlaG9sZGVyJywgJ1RvLWRvJyk7XG4gICAgICAgIHNwYW4uY29udGVudEVkaXRhYmxlID0gXCJ0cnVlXCI7XG4gICAgICAgIHNwYW4uc2V0QXR0cmlidXRlKFwiZm9yXCIsIGlkKTtcbiAgICAgICAgc3Bhbi5zZXRBdHRyaWJ1dGUoXCJjb250ZW50RWRpdGFibGVcIiwgXCJ0cnVlXCIpO1xuXG4gICAgICAgIHNwYW4uY2xhc3NMaXN0LmFkZCgnZm9jdXNhYmxlJyk7XG4gICAgICAgIHNwYW4uY2xhc3NMaXN0LmFkZCgnZWRpdGFibGUnKTtcbiAgICAgICAgc3Bhbi5jbGFzc0xpc3QuYWRkKCdmb2N1cycpO1xuXG4gICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQoY2hlY2tib3gpO1xuICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKHNwYW4pO1xuXG4gICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgIH1cblxuICAgIC8vIHByaXZhdGUgc3RhdGljIGxpc3RJdGVtKHRleHQ6IHN0cmluZyk6IEhUTUxFbGVtZW50IHtcblxuICAgIC8vICAgICBsZXQgaW5pdGlhbEl0ZW0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaScpO1xuXG4gICAgLy8gICAgIGluaXRpYWxJdGVtLmNsYXNzTGlzdC5hZGQoJ2ZvY3VzYWJsZScpO1xuICAgIC8vICAgICBpbml0aWFsSXRlbS5jbGFzc0xpc3QuYWRkKCdkZWxldGFibGUnKTtcbiAgICAvLyAgICAgaW5pdGlhbEl0ZW0uY2xhc3NMaXN0LmFkZCgnZWRpdGFibGUnKTtcbiAgICAvLyAgICAgaW5pdGlhbEl0ZW0uY2xhc3NMaXN0LmFkZCgnZm9jdXMnKTtcbiAgICAvLyAgICAgaW5pdGlhbEl0ZW0uY2xhc3NMaXN0LmFkZCgna2V5LXRyaWdnZXInKTtcbiAgICAvLyAgICAgaW5pdGlhbEl0ZW0uY2xhc3NMaXN0LmFkZCgnbGlzdC1pdGVtJyk7XG5cbiAgICAvLyAgICAgaW5pdGlhbEl0ZW0uaW5uZXJUZXh0ID0gdGV4dDtcblxuICAgIC8vICAgICBpbml0aWFsSXRlbS5jb250ZW50RWRpdGFibGUgPSBcInRydWVcIjtcbiAgICAvLyAgICAgaW5pdGlhbEl0ZW0uc2V0QXR0cmlidXRlKCdkYXRhLXBsYWNlaG9sZGVyJywgJ0l0ZW0nKTtcblxuICAgIC8vICAgICByZXR1cm4gaW5pdGlhbEl0ZW07XG5cbiAgICAvLyB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBsaXN0SXRlbV8yKGNvbnRlbnQ6IHN0cmluZyB8IG51bGwgPSBudWxsKTogSFRNTEVsZW1lbnQge1xuXG4gICAgICAgIGxldCBpbml0aWFsSXRlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpJyk7XG5cbiAgICAgICAgaW5pdGlhbEl0ZW0uY2xhc3NMaXN0LmFkZCgnZGVsZXRhYmxlJyk7XG4gICAgICAgIGluaXRpYWxJdGVtLmNsYXNzTGlzdC5hZGQoJ2xpc3QtaXRlbScpO1xuXG4gICAgICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG5cbiAgICAgICAgZGl2LmNsYXNzTGlzdC5hZGQoJ2ZvY3VzYWJsZScpO1xuICAgICAgICBkaXYuY2xhc3NMaXN0LmFkZCgnZWRpdGFibGUnKTtcbiAgICAgICAgZGl2LmNsYXNzTGlzdC5hZGQoJ2ZvY3VzJyk7XG4gICAgICAgIGRpdi5jb250ZW50RWRpdGFibGUgPSBcInRydWVcIjtcbiAgICAgICAgZGl2LmNsYXNzTGlzdC5hZGQoJ2tleS10cmlnZ2VyJyk7XG4gICAgICAgIGRpdi5zZXRBdHRyaWJ1dGUoJ2RhdGEtcGxhY2Vob2xkZXInLCAnSXRlbScpO1xuXG4gICAgICAgIGluaXRpYWxJdGVtLmFwcGVuZENoaWxkKGRpdik7XG5cblxuICAgICAgICBkaXYuaW5uZXJUZXh0ID0gY29udGVudCB8fCBcIlwiO1xuXG4gICAgICAgIC8vIGluaXRpYWxJdGVtLmNvbnRlbnRFZGl0YWJsZSA9IHRydWU7XG5cbiAgICAgICAgcmV0dXJuIGluaXRpYWxJdGVtO1xuICAgIH1cblxuXG4gICAgc3RhdGljIGJsb2NrUGFyYWdyYXBoKGNvbnRlbnQ6IHN0cmluZyB8IG51bGwgPSBudWxsKSB7XG5cbiAgICAgICAgbGV0IG5ld0RpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBsZXQgbmV3RWxlbWVudCA9IEVsZW1lbnRGYWN0b3J5U2VydmljZS5wYXJhZ3JhcGgoY29udGVudCk7XG5cbiAgICAgICAgLy8gbGV0IGRyYWdIYW5kbGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XG4gICAgICAgIC8vIGRyYWdIYW5kbGVyLmlubmVySFRNTCA9ICc8c3ZnIHdpZHRoPVwiMS4zNzVyZW1cIiBoZWlnaHQ9XCIxLjM3NXJlbVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIj48dXNlIGhyZWY9XCIjaWNvbi1tYXRlcmlhbC1kcmFnXCI+PC91c2U+PC9zdmc+JztcblxuICAgICAgICAvLyBuZXdEaXYuYXBwZW5kQ2hpbGQobmV3QnV0dG9uKTtcbiAgICAgICAgbmV3RGl2LmFwcGVuZENoaWxkKG5ld0VsZW1lbnQpO1xuXG4gICAgICAgIG5ld0Rpdi5jbGFzc0xpc3QuYWRkKCdibG9jaycpO1xuICAgICAgICBuZXdEaXYuY2xhc3NMaXN0LmFkZCgnZGVsZXRhYmxlJyk7XG4gICAgICAgIC8vIGRyYWdIYW5kbGVyLmNsYXNzTGlzdC5hZGQoJ2RyYWctaGFuZGxlcicpO1xuICAgICAgICAvLyBkcmFnSGFuZGxlci5jbGFzc0xpc3QuYWRkKCdidXR0b24tcmVzZXQnKTtcbiAgICAgICAgLy8gZHJhZ0hhbmRsZXIuZHJhZ2dhYmxlID0gdHJ1ZTtcblxuICAgICAgICByZXR1cm4gbmV3RGl2O1xuICAgIH1cblxuICAgIHN0YXRpYyBkcmFnSGFuZGxlQnV0dG9uKCkge1xuXG4gICAgICAgIGxldCBidXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcbiAgICAgICAgYnV0dG9uLmlubmVySFRNTCA9ICc8c3ZnIHdpZHRoPVwiMS4zNzVyZW1cIiBoZWlnaHQ9XCIxLjM3NXJlbVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIj48dXNlIGhyZWY9XCIjaWNvbi1tYXRlcmlhbC1kcmFnXCI+PC91c2U+PC9zdmc+JztcblxuICAgICAgICBidXR0b24uY2xhc3NMaXN0LmFkZChcImVkaXRvci1vbmx5XCIsIFwiZHJhZy1oYW5kbGVyXCIsIFwiYnV0dG9uLXJlc2V0XCIpO1xuICAgICAgICBidXR0b24uZHJhZ2dhYmxlID0gdHJ1ZTtcblxuICAgICAgICByZXR1cm4gYnV0dG9uO1xuICAgIH1cblxuICAgIHN0YXRpYyBtb3JlT3B0aW9uc0J1dHRvbigpIHtcblxuICAgICAgICBsZXQgYnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XG4gICAgICAgIGJ1dHRvbi5pbm5lckhUTUwgPSAnPHN2ZyB3aWR0aD1cIjEuMzc1cmVtXCIgaGVpZ2h0PVwiMS4zNzVyZW1cIiBmaWxsPVwiY3VycmVudENvbG9yXCI+PHVzZSBocmVmPVwiI2ljb24tbWF0ZXJpYWwtbW9yZVwiPjwvdXNlPjwvc3ZnPic7XG5cbiAgICAgICAgYnV0dG9uLmNsYXNzTGlzdC5hZGQoXCJlZGl0b3Itb25seVwiLCBcImRyYWctaGFuZGxlclwiLCBcImJ1dHRvbi1yZXNldFwiKTtcblxuICAgICAgICByZXR1cm4gYnV0dG9uO1xuICAgIH1cblxuXG4gICAgc3RhdGljIGljb24oaWNvbklkOiBzdHJpbmcpIHtcblxuICAgICAgICBsZXQgYnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIGJ1dHRvbi5pbm5lckhUTUwgPSBgPHN2ZyB3aWR0aD1cIjEuMzc1cmVtXCIgaGVpZ2h0PVwiMS4zNzVyZW1cIiBmaWxsPVwiY3VycmVudENvbG9yXCI+PHVzZSBocmVmPVwiIyR7aWNvbklkfVwiPjwvdXNlPjwvc3ZnPmA7XG5cbiAgICAgICAgLy8gYnV0dG9uLmNsYXNzTGlzdC5hZGQoXCJlZGl0b3Itb25seVwiLCBcImRyYWctaGFuZGxlclwiLCBcImJ1dHRvbi1yZXNldFwiKTtcblxuICAgICAgICByZXR1cm4gYnV0dG9uO1xuICAgIH1cblxufSIsImV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlVUlDb21wb25lbnQ8VCBleHRlbmRzIEhUTUxFbGVtZW50ID0gSFRNTEVsZW1lbnQ+IHtcclxuXHJcbiAgICBwcml2YXRlIF9jYW5IaWRlOiBib29sZWFuO1xyXG5cclxuICAgIHByb3BzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xyXG4gICAgaHRtbEVsZW1lbnQ6IFQ7XHJcbiAgICBwYXJlbnQ/OiBCYXNlVUlDb21wb25lbnQ7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJvcHM6IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcclxuXHJcbiAgICAgICAgdGhpcy5wcm9wcyA9IHByb3BzO1xyXG5cclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50ID0gdGhpcy5pbml0KCkgYXMgVDtcclxuICAgICAgICB0aGlzLl9jYW5IaWRlID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICogSW5pdGlhbGl6ZXMgYW5kIHJldHVybnMgYW4gSFRNTEVsZW1lbnQgdXNpbmcgdGhlIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgQVBJLlxyXG4gICAgKiBUaGlzIGFic3RyYWN0IG1ldGhvZCBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IHN1YmNsYXNzZXMgdG8gc3BlY2lmeSB0aGUgdHlwZSBvZlxyXG4gICAgKiBIVE1MRWxlbWVudCB0byBiZSBjcmVhdGVkIGFuZCBwb3NzaWJseSBjb25maWd1cmUgaXRzIHByb3BlcnRpZXMgb3Igc3R5bGVzLlxyXG4gICAgKiBEZXBlbmRlbmNpZXMgbmVlZGVkIGJ5IHRoZSBzdWJjbGFzc2VzIGFyZSBwYXNzZWQgdGhyb3VnaCB0aGUgY29uc3RydWN0b3IgYW5kXHJcbiAgICAqIGFyZSB0eXBpY2FsbHkgbWFkZSBhdmFpbGFibGUgdmlhIHRoaXMucHJvcHMgZm9yIHVzZSB3aXRoaW4gdGhpcyBtZXRob2QuXHJcbiAgICAqXHJcbiAgICAqIEBhYnN0cmFjdFxyXG4gICAgKiBAZXhhbXBsZVxyXG4gICAgKiAvLyBFeGFtcGxlIHN1YmNsYXNzIHRoYXQgdXNlcyBhIGRlcGVuZGVuY3kgcGFzc2VkIHRocm91Z2ggdGhlIGNvbnN0cnVjdG9yLlxyXG4gICAgKiBjbGFzcyBUb29sYmFyIGV4dGVuZHMgQmFzZVVJQ29tcG9uZW50IHtcclxuICAgICogICAgIGNvbnN0cnVjdG9yKGRlcGVuZGVuY3kpIHtcclxuICAgICogICAgICAgICBzdXBlcih7ZGVwZW5kZW5jeTogZGVwZW5kZW5jeX0pO1xyXG4gICAgKiAgICAgICAgIHRoaXMuZGVwZW5kZW5jeSA9IGRlcGVuZGVuY3k7XHJcbiAgICAqICAgICB9XHJcbiAgICAqXHJcbiAgICAqICAgICBpbml0KCk6IEhUTUxFbGVtZW50IHtcclxuICAgICogICAgICAgICBjb25zdCB0b29sYmFyRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgKiAgICAgICAgIHRvb2xiYXJFbGVtZW50LmNsYXNzTmFtZSA9ICd0b29sYmFyJztcclxuICAgICogICAgICAgICAvLyBVc2luZyB0aGUgZGVwZW5kZW5jeVxyXG4gICAgKiAgICAgICAgIHRvb2xiYXJFbGVtZW50LmF0dHJpYnV0ZShcImN1c3RvbURlcGVuZGVuY3lCYXNlZFwiLCB0aGlzLmRlcGVuZGVuY3kuZGF0YSk7XHJcbiAgICAqICAgXHJcbiAgICAqICAgICAgICAgcmV0dXJuIHRvb2xiYXJFbGVtZW50O1xyXG4gICAgKiAgICAgfVxyXG4gICAgKiB9XHJcbiAgICAqXHJcbiAgICAqIEByZXR1cm5zIHtIVE1MRWxlbWVudH0gVGhlIG5ld2x5IGNyZWF0ZWQgYW5kIGNvbmZpZ3VyZWQgSFRNTEVsZW1lbnQuXHJcbiAgICAqL1xyXG4gICAgYWJzdHJhY3QgaW5pdCgpOiBIVE1MRWxlbWVudDtcclxuXHJcbiAgICBnZXQgZGlzcGxheSgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiAnYmxvY2snO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgKiBBcHBlbmRzIHRoaXMgY29tcG9uZW50J3MgSFRNTCBlbGVtZW50IHRvIHRoZSBzcGVjaWZpZWQgcGFyZW50IGNvbXBvbmVudCdzIEhUTUwgZWxlbWVudC5cclxuICAgICogVGhpcyBtZXRob2QgZXN0YWJsaXNoZXMgYSBwYXJlbnQtY2hpbGQgcmVsYXRpb25zaGlwIGluIHRoZSBET00gYnkgYXBwZW5kaW5nIHRoaXMgaW5zdGFuY2Unc1xyXG4gICAgKiBlbGVtZW50IGFzIGEgY2hpbGQgb2YgdGhlIGdpdmVuIHBhcmVudCdzIGVsZW1lbnQuIEl0IGFsc28gdXBkYXRlcyB0aGUgcGFyZW50IHByb3BlcnR5IG9mIHRoaXNcclxuICAgICogaW5zdGFuY2UgdG8gcmVmZXIgdG8gdGhlIHByb3ZpZGVkIHBhcmVudCBjb21wb25lbnQuXHJcbiAgICAqXHJcbiAgICAqIEBwYXJhbSB7QmFzZVVJQ29tcG9uZW50fSBwYXJlbnQgVGhlIHBhcmVudCBjb21wb25lbnQgdG8gd2hpY2ggdGhpcyBjb21wb25lbnQncyBlbGVtZW50IHdpbGwgYmUgYXBwZW5kZWQuXHJcbiAgICAqIFRoaXMgc2hvdWxkIGJlIGFuIGluc3RhbmNlIG9mIEJhc2VVSUNvbXBvbmVudCBvciBhbnkgb2YgaXRzIHN1YmNsYXNzZXMsIGVuc3VyaW5nIHRoYXQgaXQgaGFzIGFuIGh0bWxFbGVtZW50IHByb3BlcnR5LlxyXG4gICAgKi9cclxuICAgIGFwcGVuZFRvKHBhcmVudDogQmFzZVVJQ29tcG9uZW50KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XHJcbiAgICAgICAgcGFyZW50Lmh0bWxFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuaHRtbEVsZW1lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBpc1Zpc2libGUoKSA6IGJvb2xlYW57XHJcbiAgICAgICAgbGV0IGVsZW1lbnQ6IEhUTUxFbGVtZW50ID0gdGhpcy5odG1sRWxlbWVudDtcclxuXHJcbiAgICAgICAgaWYgKGVsZW1lbnQuc3R5bGUuZGlzcGxheSA9PT0gJ25vbmUnIHx8IGVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9PT0gJ2hpZGRlbicgfHwgIWRvY3VtZW50LmNvbnRhaW5zKGVsZW1lbnQpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHdoaWxlIChlbGVtZW50KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWxlbWVudCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoc3R5bGUuZGlzcGxheSA9PT0gJ25vbmUnIHx8IHN0eWxlLnZpc2liaWxpdHkgPT09ICdoaWRkZW4nKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChlbGVtZW50LnBhcmVudEVsZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBlbGVtZW50LnBhcmVudEVsZW1lbnQ7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgc2hvdygpIHtcclxuICAgICAgICAvLyB0aGlzLl9jYW5IaWRlID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gdGhpcy5kaXNwbGF5O1xyXG5cclxuICAgICAgICAvLyBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAvLyAgICAgdGhpcy5fY2FuSGlkZSA9IHRydWU7XHJcbiAgICAgICAgLy8gfSwgMTAwKTtcclxuICAgIH1cclxuXHJcbiAgICBoaWRlKCkge1xyXG4gICAgICAgIC8vIGlmICghdGhpcy5fY2FuSGlkZSkge1xyXG5cclxuICAgICAgICAvLyAgICAgY29uc29sZS53YXJuKFwiQXR0ZW1wdGVkIHRvIGhpZGUgdGhlIGVsZW1lbnQgYmVmb3JlIDEwMCBtaWxsaXNlY29uZHMgaGF2ZSBwYXNzZWQgc2luY2UgdGhlIGxhc3QgZGlzcGxheS5cIik7XHJcbiAgICAgICAgLy8gICAgIC8vIHJldHVybjtcclxuICAgICAgICAvLyAgICAgLy8gdGhyb3cgbmV3IEVycm9yKFwiQXR0ZW1wdGVkIHRvIGhpZGUgdGhlIGVsZW1lbnQgYmVmb3JlIDEwMCBtaWxsaXNlY29uZHMgaGF2ZSBwYXNzZWQgc2luY2UgdGhlIGxhc3QgZGlzcGxheS5cIik7XHJcbiAgICAgICAgLy8gfVxyXG5cclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbiAgICB9XHJcblxyXG4gICAgbG9ja0hpZGUoKXtcclxuICAgICAgICB0aGlzLl9jYW5IaWRlID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgdW5sb2NrSGlkZSgpe1xyXG4gICAgICAgIHRoaXMuX2NhbkhpZGUgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBjYW5IaWRlKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9jYW5IaWRlICYmIHRoaXMuaXNWaXNpYmxlO1xyXG4gICAgfVxyXG5cclxuICAgIHNldCBjYW5IaWRlKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICAgICAgdGhpcy5fY2FuSGlkZSA9IHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIGZvY3VzKCkge1xyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuZm9jdXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBjaGFuZ2VDb2xvcih2YWx1ZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5zdHlsZS5jb2xvciA9IHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbW92ZUNvbG9yKCkge1xyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUuY29sb3IgPSBcImluaGVyaXRcIjtcclxuICAgIH1cclxuXHJcbiAgICBjaGFuZ2VWaXNpYmlsaXR5VG9WaXNpYmxlKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9IFwidmlzaWJsZVwiO1xyXG4gICAgfVxyXG5cclxuICAgIGNoYW5nZVZpc2liaWxpdHlUb0hpZGRlbigpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSBcImhpZGRlblwiO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBkb2VzRWxlbWVudE92ZXJmbG93U2NyZWVuKCk6IGJvb2xlYW4ge1xyXG5cclxuICAgICAgICBjb25zdCBvcmlnaW5hbERpc3BsYXkgPSB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLmRpc3BsYXk7XHJcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxWaXNpYmlsaXR5ID0gdGhpcy5odG1sRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5O1xyXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsUG9zaXRpb24gPSB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLnBvc2l0aW9uO1xyXG5cclxuICAgICAgICBpZiAob3JpZ2luYWxEaXNwbGF5ID09PSAnbm9uZScpIHtcclxuICAgICAgICAgICAgdGhpcy5odG1sRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcclxuICAgICAgICAgICAgdGhpcy5odG1sRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XHJcbiAgICAgICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZWxlbWVudFJlY3QgPSB0aGlzLmh0bWxFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICAgIGNvbnN0IHNjcmVlbldpZHRoID0gd2luZG93LmlubmVyV2lkdGg7XHJcblxyXG4gICAgICAgIGlmIChvcmlnaW5hbERpc3BsYXkgPT09ICdub25lJykge1xyXG4gICAgICAgICAgICB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSBvcmlnaW5hbERpc3BsYXk7XHJcbiAgICAgICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9IG9yaWdpbmFsVmlzaWJpbGl0eTtcclxuICAgICAgICAgICAgdGhpcy5odG1sRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9IG9yaWdpbmFsUG9zaXRpb247XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBlbGVtZW50UmlnaHRFZGdlID0gZWxlbWVudFJlY3QucmlnaHQ7XHJcblxyXG4gICAgICAgIGlmIChlbGVtZW50UmlnaHRFZGdlID4gc2NyZWVuV2lkdGgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoZWxlbWVudFJlY3QubGVmdCA8IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbn0iLCJleHBvcnQgY2xhc3MgRGVwZW5kZW5jeUNvbnRhaW5lciB7XHJcbiAgICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZTogRGVwZW5kZW5jeUNvbnRhaW5lciA9IG5ldyBEZXBlbmRlbmN5Q29udGFpbmVyKCk7XHJcbiAgICBwcml2YXRlIGRlcGVuZGVuY2llczogeyBba2V5OiBzdHJpbmddOiBGdW5jdGlvbiB9ID0ge307XHJcblxyXG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHt9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXQgSW5zdGFuY2UoKTogRGVwZW5kZW5jeUNvbnRhaW5lciB7XHJcbiAgICAgICAgcmV0dXJuIERlcGVuZGVuY3lDb250YWluZXIuaW5zdGFuY2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHJlZ2lzdGVyKGtleTogc3RyaW5nLCBjb25zdHJ1Y3RvcjogRnVuY3Rpb24pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmRlcGVuZGVuY2llc1trZXldID0gY29uc3RydWN0b3I7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHJlc29sdmU8VD4oa2V5OiBzdHJpbmcpOiBUIHtcclxuICAgICAgICBpZiAoIXRoaXMuZGVwZW5kZW5jaWVzW2tleV0pIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBEZXBlbmRlbmN5ICR7a2V5fSBub3QgZm91bmQuYCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLmRlcGVuZGVuY2llc1trZXldKCk7XHJcbiAgICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgRWxlbWVudEZhY3RvcnlTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL3NlcnZpY2VzL2VsZW1lbnQtZmFjdG9yeS9FbGVtZW50RmFjdG9yeVNlcnZpY2VcIjtcclxuaW1wb3J0IHsgQmFzZVVJQ29tcG9uZW50IH0gZnJvbSBcIi4uL2NvbW1vbi9CYXNlVUlDb21wb25lbnRcIjtcclxuaW1wb3J0IHsgSUVsZW1lbnRGYWN0b3J5U2VydmljZSB9IGZyb20gXCIuLi8uLi9zZXJ2aWNlcy9lbGVtZW50LWZhY3RvcnkvSUVsZW1lbnRGYWN0b3J5U2VydmljZVwiO1xyXG5pbXBvcnQgeyBDb250ZW50IH0gZnJvbSBcIi4uL2NvbnRlbnQvQ29udGVudFwiO1xyXG5pbXBvcnQgeyBUaXRsZSB9IGZyb20gXCIuLi90aXRsZS9UaXRsZVwiO1xyXG5pbXBvcnQgeyBJQmxvY2tPcGVyYXRpb25zU2VydmljZSB9IGZyb20gXCJAL3NlcnZpY2VzL2Jsb2NrLW9wZXJhdGlvbnMvSUJsb2NrT3BlcmF0aW9uc1NlcnZpY2VcIjtcclxuaW1wb3J0IHsgQWRkQmxvY2tXcmFwcGVyIH0gZnJvbSBcIi4uL2FkZC1ibG9jay9BZGRCbG9ja1dyYXBwZXJcIjtcclxuaW1wb3J0IHsgUXVpY2tNZW51IH0gZnJvbSBcIi4uL3F1aWNrLW1lbnUvUXVpY2tNZW51XCI7XHJcbmltcG9ydCB7IFRhYmxlQ29udGV4dEZsb2F0aW5nVG9vbGJhciB9IGZyb20gXCIuLi9mbG9hdGluZy10b29sYmFyL1RhYmxlQ29udGV4dEZsb2F0aW5nVG9vbGJhclwiO1xyXG5pbXBvcnQgeyBUZXh0Q29udGV4dEZsb2F0aW5nVG9vbGJhciB9IGZyb20gXCIuLi9mbG9hdGluZy10b29sYmFyL1RleHRDb250ZXh0RmxvYXRpbmdUb29sYmFyXCI7XHJcbmltcG9ydCB7IElNZW1lbnRvIH0gZnJvbSBcIkAvY29yZS9JTWVtZW50b1wiO1xyXG5pbXBvcnQgeyBEZXBlbmRlbmN5Q29udGFpbmVyIH0gZnJvbSBcIkAvY29yZS9EZXBlbmRlbmN5Q29udGFpbmVyXCI7XHJcbmltcG9ydCB7IE1lZGlhSW5wdXR0ZXIgfSBmcm9tIFwiLi4vbWVkaWEtaW5wdXR0ZXIvTWVkaWFJbnB1dHRlclwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIEVkaXRvciBleHRlbmRzIEJhc2VVSUNvbXBvbmVudCB7XHJcblxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBlbGVtZW50RmFjdG9yeVNlcnZpY2U6IElFbGVtZW50RmFjdG9yeVNlcnZpY2U7XHJcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBlZGl0b3JJZDogc3RyaW5nID0gXCJqb2hhbm5lc0VkaXRvclwiO1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IEVkaXRvcjtcclxuICAgIHByaXZhdGUgbWVtZW50bzogSU1lbWVudG87XHJcblxyXG4gICAgcHJpdmF0ZSB0aXRsZT86IFRpdGxlO1xyXG4gICAgcHJpdmF0ZSBjb250ZW50PzogQ29udGVudDtcclxuICAgIHByaXZhdGUgYWRkQmxvY2s6IEFkZEJsb2NrV3JhcHBlcjtcclxuICAgIHByaXZhdGUgdGV4dEZsb2F0aW5nVG9vbGJhcjogVGV4dENvbnRleHRGbG9hdGluZ1Rvb2xiYXI7XHJcbiAgICBwcml2YXRlIHF1aWNrTWVudTogUXVpY2tNZW51O1xyXG4gICAgcHJpdmF0ZSB0YWJsZUNvbnRleHRUb29sYmFyOiBUYWJsZUNvbnRleHRGbG9hdGluZ1Rvb2xiYXI7XHJcbiAgICBwcml2YXRlIG1lZGlhSW5wdXR0ZXI6IE1lZGlhSW5wdXR0ZXI7XHJcblxyXG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihcclxuICAgICAgICBlbGVtZW50RmFjdG9yeVNlcnZpY2U6IElFbGVtZW50RmFjdG9yeVNlcnZpY2UsXHJcbiAgICAgICAgYmxvY2tPcGVyYXRpb25zU2VydmljZTogSUJsb2NrT3BlcmF0aW9uc1NlcnZpY2UsXHJcbiAgICAgICAgbWVtZW50bzogSU1lbWVudG8sXHJcbiAgICAgICAgdGl0bGU6IFRpdGxlLFxyXG4gICAgICAgIGNvbnRlbnQ6IENvbnRlbnQsXHJcbiAgICAgICAgYWRkQmxvY2s6IEFkZEJsb2NrV3JhcHBlcixcclxuICAgICAgICBmbG9hdGluZ1Rvb2xiYXI6IFRleHRDb250ZXh0RmxvYXRpbmdUb29sYmFyLFxyXG4gICAgICAgIHF1aWNrTWVudTogUXVpY2tNZW51LFxyXG4gICAgICAgIHRhYmxlVG9vbGJhcjogVGFibGVDb250ZXh0RmxvYXRpbmdUb29sYmFyLFxyXG4gICAgICAgIG1lZGlhSW5wdXR0ZXI6IE1lZGlhSW5wdXR0ZXJcclxuXHJcbiAgICApIHtcclxuXHJcbiAgICAgICAgc3VwZXIoe1xyXG4gICAgICAgICAgICBlbGVtZW50RmFjdG9yeVNlcnZpY2U6IGVsZW1lbnRGYWN0b3J5U2VydmljZSxcclxuICAgICAgICAgICAgYmxvY2tPcGVyYXRpb25zU2VydmljZTogYmxvY2tPcGVyYXRpb25zU2VydmljZSxcclxuICAgICAgICAgICAgdGl0bGU6IHRpdGxlLFxyXG4gICAgICAgICAgICBjb250ZW50OiBjb250ZW50LFxyXG4gICAgICAgICAgICBhZGRCbG9jazogYWRkQmxvY2ssXHJcbiAgICAgICAgICAgIGZsb2F0aW5nVG9vbGJhcjogZmxvYXRpbmdUb29sYmFyLFxyXG4gICAgICAgICAgICBxdWlja01lbnU6IHF1aWNrTWVudSxcclxuICAgICAgICAgICAgdGFibGVUb29sYmFyOiB0YWJsZVRvb2xiYXIsXHJcbiAgICAgICAgICAgIG1lZGlhSW5wdXR0ZXI6IG1lZGlhSW5wdXR0ZXJcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaWYgKEVkaXRvci5pbnN0YW5jZSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVc2UgQmxvY2tPcGVyYXRpb25zU2VydmljZS5nZXRJbnN0YW5jZSgpIHRvIGdldCBpbnN0YW5jZS5cIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmVsZW1lbnRGYWN0b3J5U2VydmljZSA9IGVsZW1lbnRGYWN0b3J5U2VydmljZTtcclxuICAgICAgICB0aGlzLm1lbWVudG8gPSBtZW1lbnRvO1xyXG4gICAgICAgIHRoaXMuYWRkQmxvY2sgPSBhZGRCbG9jaztcclxuICAgICAgICB0aGlzLnRleHRGbG9hdGluZ1Rvb2xiYXIgPSBmbG9hdGluZ1Rvb2xiYXI7XHJcbiAgICAgICAgdGhpcy5xdWlja01lbnUgPSBxdWlja01lbnU7XHJcbiAgICAgICAgdGhpcy50YWJsZUNvbnRleHRUb29sYmFyID0gdGFibGVUb29sYmFyO1xyXG4gICAgICAgIHRoaXMubWVkaWFJbnB1dHRlciA9IG1lZGlhSW5wdXR0ZXI7XHJcblxyXG4gICAgICAgIHRoaXMuYXR0YWNoRXZlbnRzKCk7XHJcblxyXG4gICAgICAgIEVkaXRvci5pbnN0YW5jZSA9IHRoaXM7XHJcblxyXG4gICAgICAgIHRoaXMubWVtZW50by5zYXZlU3RhdGUoKTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0KCk6IEhUTUxFbGVtZW50IHtcclxuXHJcbiAgICAgICAgY29uc3QgaHRtbEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChFZGl0b3IuZWRpdG9ySWQpIHx8IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcblxyXG4gICAgICAgIGh0bWxFbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJqb2hhbm5lcy1lZGl0b3JcIik7XHJcblxyXG4gICAgICAgIGlmICh3aW5kb3cuZWRpdG9yQ29uZmlnPy5lbmFibGVUaXRsZSB8fCB0cnVlKSB7XHJcbiAgICAgICAgICAgIGh0bWxFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMucHJvcHMudGl0bGUuaHRtbEVsZW1lbnQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gQ29udGVudCBpcyByZXF1aXJlZFxyXG4gICAgICAgIGh0bWxFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMucHJvcHMuY29udGVudC5odG1sRWxlbWVudCk7XHJcblxyXG4gICAgICAgIGlmICh3aW5kb3cuZWRpdG9yQ29uZmlnPy5lbmFibGVBZGRCbG9jayB8fCB0cnVlKSB7XHJcbiAgICAgICAgICAgIGh0bWxFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMucHJvcHMuYWRkQmxvY2suaHRtbEVsZW1lbnQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHdpbmRvdy5lZGl0b3JDb25maWc/LmVuYWJsZUZsb2F0aW5nVG9vbGJhciB8fCB0cnVlKSB7XHJcbiAgICAgICAgICAgIGh0bWxFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMucHJvcHMuZmxvYXRpbmdUb29sYmFyLmh0bWxFbGVtZW50KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh3aW5kb3cuZWRpdG9yQ29uZmlnPy5lbmFibGVRdWlja01lbnUgfHwgdHJ1ZSkge1xyXG4gICAgICAgICAgICBodG1sRWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLnByb3BzLnF1aWNrTWVudS5odG1sRWxlbWVudCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBodG1sRWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLnByb3BzLnRhYmxlVG9vbGJhci5odG1sRWxlbWVudCk7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5wcm9wcy5tZWRpYUlucHV0dGVyLmh0bWxFbGVtZW50KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGh0bWxFbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBnZXRJbnN0YW5jZShcclxuICAgICAgICB0aXRsZTogVGl0bGUsXHJcbiAgICAgICAgY29udGVudDogQ29udGVudCxcclxuICAgICAgICBhZGRCbG9jazogQWRkQmxvY2tXcmFwcGVyLFxyXG4gICAgICAgIHRleHRGbG9hdGluZ1Rvb2xiYXI6IFRleHRDb250ZXh0RmxvYXRpbmdUb29sYmFyLFxyXG4gICAgICAgIHF1aWNrTWVudTogUXVpY2tNZW51LFxyXG4gICAgICAgIHRhYmxlRmxvYXRpbmdUb29sYmFyOiBUYWJsZUNvbnRleHRGbG9hdGluZ1Rvb2xiYXIsXHJcbiAgICAgICAgbWVkaWFJbnB1dHRlcjogTWVkaWFJbnB1dHRlcikge1xyXG5cclxuICAgICAgICBjb25zdCBlbGVtZW50RmFjdG9yeVNlcnZpY2UgPSBEZXBlbmRlbmN5Q29udGFpbmVyLkluc3RhbmNlLnJlc29sdmU8SUVsZW1lbnRGYWN0b3J5U2VydmljZT4oXCJJRWxlbWVudEZhY3RvcnlTZXJ2aWNlXCIpO1xyXG4gICAgICAgIGNvbnN0IGJsb2NrT3BlcmF0aW9uc1NlcnZpY2UgPSBEZXBlbmRlbmN5Q29udGFpbmVyLkluc3RhbmNlLnJlc29sdmU8SUJsb2NrT3BlcmF0aW9uc1NlcnZpY2U+KFwiSUJsb2NrT3BlcmF0aW9uc1NlcnZpY2VcIik7XHJcbiAgICAgICAgY29uc3QgbWVtZW50byA9IERlcGVuZGVuY3lDb250YWluZXIuSW5zdGFuY2UucmVzb2x2ZTxJTWVtZW50bz4oXCJJTWVtZW50b1wiKTtcclxuXHJcbiAgICAgICAgaWYgKCFFZGl0b3IuaW5zdGFuY2UpIHtcclxuICAgICAgICAgICAgRWRpdG9yLmluc3RhbmNlID0gbmV3IEVkaXRvcihlbGVtZW50RmFjdG9yeVNlcnZpY2UsIGJsb2NrT3BlcmF0aW9uc1NlcnZpY2UsIG1lbWVudG8sIHRpdGxlLCBjb250ZW50LCBhZGRCbG9jaywgdGV4dEZsb2F0aW5nVG9vbGJhciwgcXVpY2tNZW51LCB0YWJsZUZsb2F0aW5nVG9vbGJhciwgbWVkaWFJbnB1dHRlcik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gRWRpdG9yLmluc3RhbmNlO1xyXG4gICAgfVxyXG5cclxuICAgIGF0dGFjaEV2ZW50cygpIHtcclxuXHJcbiAgICAgICAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoRWRpdG9yLmVkaXRvcklkKTtcclxuXHJcbiAgICAgICAgY29udGFpbmVyPy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW92ZXInLCAoZXZlbnQpID0+IHtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldDtcclxuXHJcbiAgICAgICAgICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBOb2RlKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgZWxlbWVudCA9IHRhcmdldCBhcyBOb2RlO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50Lm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBlbGVtZW50LnBhcmVudEVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBFbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYmxvY2tFbGVtZW50ID0gZWxlbWVudC5jbG9zZXN0KCcuYmxvY2snKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJsb2NrRWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcGVuZERyYWdIYW5kbGVyKGJsb2NrRWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFdmVudCB0YXJnZXQgaXMgbm90IGFuIEhUTUxFbGVtZW50IGFuZCBjYW5ub3QgaGFuZGxlIEhUTUxFbGVtZW50IHNwZWNpZmljIG1ldGhvZHM6JywgZWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFdmVudCB0YXJnZXQgaXMgbm90IGEgTm9kZTonLCB0YXJnZXQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vRm9jdXMgb24gdGhlIGZpcnN0IHBhcmFncmFwaFxyXG4gICAgICAgIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnbG9hZGluZycpIHtcclxuICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsICgpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGZpcnN0UGFyYWdyYXBoID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiNqb2hhbm5lc0VkaXRvciA+IC5jb250ZW50IC5ibG9jayBwXCIpIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgICAgICAgICAgaWYgKGZpcnN0UGFyYWdyYXBoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmlyc3RQYXJhZ3JhcGguZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgZmlyc3RQYXJhZ3JhcGggPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiI2pvaGFubmVzRWRpdG9yID4gLmNvbnRlbnQgLmJsb2NrIHBcIikgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgICAgIGlmIChmaXJzdFBhcmFncmFwaCkge1xyXG4gICAgICAgICAgICAgICAgZmlyc3RQYXJhZ3JhcGguZm9jdXMoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigncGFzdGUnLCBmdW5jdGlvbiAoZXZlbnQ6IENsaXBib2FyZEV2ZW50KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICAgICAgaWYgKHRhcmdldC5nZXRBdHRyaWJ1dGUoJ2NvbnRlbnRlZGl0YWJsZScpID09PSAndHJ1ZScpIHtcclxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgY2xpcGJvYXJkRGF0YSA9IGV2ZW50LmNsaXBib2FyZERhdGE7XHJcbiAgICAgICAgICAgICAgICBpZiAoY2xpcGJvYXJkRGF0YSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRleHQgPSBjbGlwYm9hcmREYXRhLmdldERhdGEoJ3RleHQvcGxhaW4nKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgRWRpdG9yLmluc2VydFRleHRBdEN1cnNvcih0ZXh0KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sIHRydWUpO1xyXG5cclxuXHJcbiAgICAgICAgdGhpcy5hdHRhY2hEcmFnSGFuZGxlcigpO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgaW5zZXJ0VGV4dEF0Q3Vyc29yKHRleHQ6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHNlbCA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcclxuXHJcbiAgICAgICAgaWYgKHNlbCkge1xyXG4gICAgICAgICAgICBpZiAoc2VsLnJhbmdlQ291bnQgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByYW5nZSA9IHNlbC5nZXRSYW5nZUF0KDApO1xyXG4gICAgICAgICAgICAgICAgcmFuZ2UuZGVsZXRlQ29udGVudHMoKTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCB0ZXh0Tm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRleHQpO1xyXG4gICAgICAgICAgICAgICAgcmFuZ2UuaW5zZXJ0Tm9kZSh0ZXh0Tm9kZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgcmFuZ2Uuc2V0U3RhcnRBZnRlcih0ZXh0Tm9kZSk7XHJcbiAgICAgICAgICAgICAgICByYW5nZS5zZXRFbmRBZnRlcih0ZXh0Tm9kZSk7XHJcbiAgICAgICAgICAgICAgICBzZWwucmVtb3ZlQWxsUmFuZ2VzKCk7XHJcbiAgICAgICAgICAgICAgICBzZWwuYWRkUmFuZ2UocmFuZ2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFwcGVuZERyYWdIYW5kbGVyKGVsZW1lbnQ6IE5vZGUpOiB2b2lkIHtcclxuICAgICAgICBpZiAoZWxlbWVudC5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUpIHtcclxuICAgICAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZSBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcignUHJvdmlkZWQgZWxlbWVudCBpcyBub3QgYW4gSFRNTEVsZW1lbnQ6JywgZWxlbWVudCk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHBhcmVudCA9IGVsZW1lbnQuY2xvc2VzdCgnLmJsb2NrJyk7XHJcbiAgICAgICAgbGV0IGRyYWdIYW5kbGVyID0gcGFyZW50Py5xdWVyeVNlbGVjdG9yKFwiLmRyYWctaGFuZGxlclwiKTtcclxuXHJcbiAgICAgICAgaWYgKCFkcmFnSGFuZGxlciAmJiBwYXJlbnQpIHtcclxuICAgICAgICAgICAgZHJhZ0hhbmRsZXIgPSB0aGlzLmVsZW1lbnRGYWN0b3J5U2VydmljZS5jcmVhdGUoRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuRFJBR19IQU5ETEVfQlVUVE9OKTtcclxuICAgICAgICAgICAgcGFyZW50LnByZXBlbmQoZHJhZ0hhbmRsZXIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZW1vdmVEcmFnSGFuZGxlcihlbGVtZW50OiBOb2RlKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKGVsZW1lbnQubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XHJcbiAgICAgICAgICAgIGVsZW1lbnQgPSBlbGVtZW50LnBhcmVudE5vZGUgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIShlbGVtZW50IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1Byb3ZpZGVkIGVsZW1lbnQgaXMgbm90IGFuIEhUTUxFbGVtZW50OicsIGVsZW1lbnQpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBwYXJlbnQgPSBlbGVtZW50LmNsb3Nlc3QoJy5ibG9jaycpO1xyXG4gICAgICAgIGlmIChwYXJlbnQpIHtcclxuICAgICAgICAgICAgY29uc3QgZHJhZ0hhbmRsZXIgPSBwYXJlbnQucXVlcnlTZWxlY3RvcihcIi5kcmFnLWhhbmRsZXJcIik7XHJcbiAgICAgICAgICAgIGRyYWdIYW5kbGVyPy5yZW1vdmUoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZXh0cmFjdENvbnRlbnQoKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm90IGltcGxlbWVudGVkIEV4Y2VwdGlvblwiKTtcclxuICAgIH1cclxuXHJcblxyXG5cclxuICAgIGF0dGFjaERyYWdIYW5kbGVyKCkge1xyXG4gICAgICAgIGxldCBkcmFnZ2VkSXRlbTogYW55ID0gbnVsbDtcclxuXHJcbiAgICAgICAgbGV0IGRyb3BMaW5lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgZHJvcExpbmUuY2xhc3NMaXN0LmFkZCgnZHJvcC1saW5lJyk7XHJcbiAgICAgICAgZHJvcExpbmUuc3R5bGUuaGVpZ2h0ID0gJzJweCc7XHJcbiAgICAgICAgZHJvcExpbmUuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuXHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdkcmFnc3RhcnQnLCAoZXZlbnQpID0+IHtcclxuICAgICAgICAgICAgaWYgKChldmVudC50YXJnZXQgYXMgRWxlbWVudCk/LmNsYXNzTGlzdD8uY29udGFpbnMoJ2RyYWctaGFuZGxlcicpKSB7XHJcbiAgICAgICAgICAgICAgICBkcmFnZ2VkSXRlbSA9IChldmVudC50YXJnZXQgYXMgRWxlbWVudCk/LmNsb3Nlc3QoJy5ibG9jaycpO1xyXG4gICAgICAgICAgICAgICAgZHJhZ2dlZEl0ZW0uc2V0QXR0cmlidXRlKCdkcmFnZ2FibGUnLCAndHJ1ZScpO1xyXG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgZHJhZ2dlZEl0ZW0uc3R5bGUub3BhY2l0eSA9ICcwLjUnO1xyXG4gICAgICAgICAgICAgICAgfSwgMCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdkcmFnZW5kJywgKCkgPT4ge1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChkcmFnZ2VkSXRlbSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGRyYWdnZWRJdGVtLnN0eWxlLm9wYWNpdHkgPSAnJztcclxuICAgICAgICAgICAgICAgICAgICBkcmFnZ2VkSXRlbS5yZW1vdmVBdHRyaWJ1dGUoJ2RyYWdnYWJsZScpO1xyXG4gICAgICAgICAgICAgICAgICAgIGRyYWdnZWRJdGVtID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGRyb3BMaW5lLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICB9LCAwKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdkcmFnb3ZlcicsIChldmVudCkgPT4ge1xyXG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICBsZXQgdGFyZ2V0ID0gKGV2ZW50LnRhcmdldCBhcyBFbGVtZW50KT8uY2xvc2VzdCgnLmJsb2NrJyk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGFyZ2V0ICYmIHRhcmdldCAhPT0gZHJhZ2dlZEl0ZW0pIHtcclxuICAgICAgICAgICAgICAgIGxldCBib3VuZGluZyA9IHRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgICAgICAgICAgIGxldCBvZmZzZXQgPSBib3VuZGluZy55ICsgYm91bmRpbmcuaGVpZ2h0IC8gMjtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoKGV2ZW50IGFzIE1vdXNlRXZlbnQpLmNsaWVudFkgPiBvZmZzZXQpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0Lm5leHRFbGVtZW50U2libGluZyAhPT0gZHJvcExpbmUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0Lmluc2VydEFkamFjZW50RWxlbWVudCgnYWZ0ZXJlbmQnLCBkcm9wTGluZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0LnByZXZpb3VzRWxlbWVudFNpYmxpbmcgIT09IGRyb3BMaW5lKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldC5pbnNlcnRBZGphY2VudEVsZW1lbnQoJ2JlZm9yZWJlZ2luJywgZHJvcExpbmUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZHJvcExpbmUuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZHJvcCcsIChldmVudCkgPT4ge1xyXG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICBpZiAoZHJhZ2dlZEl0ZW0gJiYgZHJvcExpbmUgJiYgZHJvcExpbmUucGFyZW50RWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgZHJvcExpbmUucGFyZW50RWxlbWVudC5pbnNlcnRCZWZvcmUoZHJhZ2dlZEl0ZW0sIGRyb3BMaW5lKTtcclxuICAgICAgICAgICAgICAgIGRyb3BMaW5lLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn0iLCJleHBvcnQgY2xhc3MgRE9NVXRpbHMge1xyXG5cclxuXHJcbiAgICBzdGF0aWMgaXNTZWxlY3Rpb25JblRhYmxlQ2VsbCgpIHtcclxuICAgICAgICBsZXQgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG4gICAgICAgIGlmICghc2VsZWN0aW9uPy5yYW5nZUNvdW50KSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgIGxldCBub2RlID0gc2VsZWN0aW9uLmFuY2hvck5vZGU7XHJcbiAgICAgICAgd2hpbGUgKG5vZGUpIHtcclxuICAgICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoKG5vZGUgYXMgRWxlbWVudCkudGFnTmFtZSA9PT0gJ1REJyB8fCAobm9kZSBhcyBFbGVtZW50KS50YWdOYW1lID09PSAnVEgnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7ICAvLyBUaGUgc2VsZWN0aW9uIHN0YXJ0cyBpbnNpZGUgYSB0YWJsZSBjZWxsXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTsgIC8vIE1vdmUgdXAgaW4gdGhlIERPTSB0cmVlXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTsgIC8vIFNlbGVjdGlvbiBpcyBub3QgaW5zaWRlIGEgdGFibGUgY2VsbFxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGlzIGF0IHRoZSBzdGFydCBvciBlbmQgb2YgYSBjb250ZW50ZWRpdGFibGUgZWxlbWVudC5cclxuICAgICogVGhpcyBmdW5jdGlvbiB3YXMgYWRhcHRlZCBmcm9tIGEgU3RhY2tPdmVyZmxvdyBhbnN3ZXIuXHJcbiAgICAqXHJcbiAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsIC0gVGhlIGNvbnRlbnRlZGl0YWJsZSBlbGVtZW50IHRvIGNoZWNrLlxyXG4gICAgKiBAcmV0dXJucyB7T2JqZWN0fSBBbiBvYmplY3QgY29udGFpbmluZyB0d28gYm9vbGVhbiBwcm9wZXJ0aWVzOiBgYXRTdGFydGAgYW5kIGBhdEVuZGAuXHJcbiAgICAqXHJcbiAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzc0NTE0NjgvY29udGVudGVkaXRhYmxlLWRpdi1ob3ctY2FuLWktZGV0ZXJtaW5lLWlmLXRoZS1jdXJzb3ItaXMtYXQtdGhlLXN0YXJ0LW9yLWVuZC1vI2Fuc3dlci03NDc4NDIwfFN0YWNrT3ZlcmZsb3cgUmVzcG9uc2V9XHJcbiAgICAqIEBleGFtcGxlXHJcbiAgICAqIC8vIFJldHVybnMgeyBhdFN0YXJ0OiB0cnVlLCBhdEVuZDogZmFsc2UgfSBpZiB0aGUgY3Vyc29yIGlzIGF0IHRoZSBzdGFydCBvZiB0aGUgZWxlbWVudCwgYnV0IG5vdCBhdCB0aGUgZW5kLlxyXG4gICAgKiBjb25zdCByZXN1bHQgPSBnZXRTZWxlY3Rpb25UZXh0SW5mbyhkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdGFibGUnKSk7XHJcbiAgICAqL1xyXG4gICAgc3RhdGljIGdldFNlbGVjdGlvblRleHRJbmZvKGVsOiBIVE1MRWxlbWVudCk6IHsgYXRTdGFydDogYm9vbGVhbjsgYXRFbmQ6IGJvb2xlYW4gfSB7XHJcblxyXG4gICAgICAgIGxldCBhdFN0YXJ0ID0gZmFsc2UsIGF0RW5kID0gZmFsc2U7XHJcblxyXG4gICAgICAgIGlmIChlbC50ZXh0Q29udGVudCA9PSBcIlwiKSB7XHJcbiAgICAgICAgICAgIGF0U3RhcnQgPSB0cnVlO1xyXG4gICAgICAgICAgICBhdEVuZCA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4geyBhdFN0YXJ0LCBhdEVuZCB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgc2VsUmFuZ2U6IFJhbmdlLCB0ZXN0UmFuZ2U6IFJhbmdlO1xyXG5cclxuICAgICAgICBjb25zdCBzZWwgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgICAgICAgaWYgKHNlbCAmJiBzZWwucmFuZ2VDb3VudCA+IDApIHtcclxuICAgICAgICAgICAgc2VsUmFuZ2UgPSBzZWwuZ2V0UmFuZ2VBdCgwKTtcclxuICAgICAgICAgICAgdGVzdFJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcclxuXHJcbiAgICAgICAgICAgIHRlc3RSYW5nZS5zZWxlY3ROb2RlQ29udGVudHMoZWwpO1xyXG4gICAgICAgICAgICB0ZXN0UmFuZ2Uuc2V0RW5kKHNlbFJhbmdlLnN0YXJ0Q29udGFpbmVyLCBzZWxSYW5nZS5zdGFydE9mZnNldCk7XHJcbiAgICAgICAgICAgIGF0U3RhcnQgPSB0ZXN0UmFuZ2UudG9TdHJpbmcoKSA9PT0gXCJcIjtcclxuXHJcbiAgICAgICAgICAgIHRlc3RSYW5nZS5zZWxlY3ROb2RlQ29udGVudHMoZWwpO1xyXG4gICAgICAgICAgICB0ZXN0UmFuZ2Uuc2V0U3RhcnQoc2VsUmFuZ2UuZW5kQ29udGFpbmVyLCBzZWxSYW5nZS5lbmRPZmZzZXQpO1xyXG4gICAgICAgICAgICBhdEVuZCA9IHRlc3RSYW5nZS50b1N0cmluZygpID09PSBcIlwiO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHsgYXRTdGFydCwgYXRFbmQgfTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICogSW5zZXJ0cyBhIG5ldyBub2RlIGludG8gdGhlIERPTSBpbW1lZGlhdGVseSBhZnRlciBhIHNwZWNpZmllZCByZWZlcmVuY2Ugbm9kZS5cclxuICAgICogVGhpcyBmdW5jdGlvbiBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsIGZvciBkeW5hbWljYWxseSBtb2RpZnlpbmcgdGhlIGRvY3VtZW50IHN0cnVjdHVyZSBieSBhZGRpbmcgbmV3IGNvbnRlbnRcclxuICAgICogb3IgY29tcG9uZW50cyBpbiByZWxhdGlvbiB0byBleGlzdGluZyBlbGVtZW50cy5cclxuICAgICpcclxuICAgICogQHBhcmFtIHtOb2RlfSBuZXdOb2RlIC0gVGhlIG5ldyBub2RlIHRvIGJlIGluc2VydGVkIGludG8gdGhlIERPTS5cclxuICAgICogQHBhcmFtIHtOb2RlfSByZWZlcmVuY2VOb2RlIC0gVGhlIG5vZGUgYWZ0ZXIgd2hpY2ggdGhlIG5ldyBub2RlIHNob3VsZCBiZSBpbnNlcnRlZC5cclxuICAgICogQHJldHVybnMge3ZvaWR9IFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcmV0dXJuIGEgdmFsdWU7IGl0IHBlcmZvcm1zIGEgRE9NIG1hbmlwdWxhdGlvbiBvcGVyYXRpb24uXHJcbiAgICAqXHJcbiAgICAqIEBleGFtcGxlXHJcbiAgICAqIC8vIFN1cHBvc2UgeW91IHdhbnQgdG8gaW5zZXJ0IGEgbmV3IHBhcmFncmFwaCBhZnRlciBhbiBleGlzdGluZyBkaXYgZWxlbWVudDpcclxuICAgICogY29uc3QgbmV3UGFyYWdyYXBoID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgncCcpO1xyXG4gICAgKiBuZXdQYXJhZ3JhcGgudGV4dENvbnRlbnQgPSAnSGVsbG8sIHdvcmxkISc7XHJcbiAgICAqIGNvbnN0IHJlZmVyZW5jZURpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdteURpdicpO1xyXG4gICAgKiBpbnNlcnRBZnRlcihuZXdQYXJhZ3JhcGgsIHJlZmVyZW5jZURpdik7XHJcbiAgICAqXHJcbiAgICAqIEBkZXNjcmlwdGlvblxyXG4gICAgKiBUaGlzIGZ1bmN0aW9uIGNoZWNrcyBpZiB0aGUgcmVmZXJlbmNlTm9kZSBoYXMgYSBwYXJlbnQgbm9kZS4gSWYgYSBwYXJlbnQgbm9kZSBleGlzdHMsIGl0IHVzZXNcclxuICAgICogYHBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKClgIHRvIGluc2VydCB0aGUgbmV3Tm9kZSBpbnRvIHRoZSBET00gcmlnaHQgYWZ0ZXIgdGhlIHJlZmVyZW5jZU5vZGUuXHJcbiAgICAqIFRoaXMgaXMgYWNoaWV2ZWQgYnkgc3BlY2lmeWluZyBgcmVmZXJlbmNlTm9kZS5uZXh0U2libGluZ2AgYXMgdGhlIHNlY29uZCBwYXJhbWV0ZXIgdG8gYGluc2VydEJlZm9yZSgpYCxcclxuICAgICogd2hpY2ggZWZmZWN0aXZlbHkgcGxhY2VzIHRoZSBuZXdOb2RlIGRpcmVjdGx5IGFmdGVyIHRoZSByZWZlcmVuY2VOb2RlIGluIHRoZSBkb2N1bWVudCdzIHN0cnVjdHVyZS5cclxuICAgICogSWYgdGhlIHJlZmVyZW5jZU5vZGUgaGFzIG5vIHBhcmVudCwgdGhlIGZ1bmN0aW9uIGRvZXMgbm90aGluZywgYXMgaW5zZXJ0aW9uIGlzIG5vdCBwb3NzaWJsZS5cclxuICAgICovXHJcbiAgICBzdGF0aWMgaW5zZXJ0QWZ0ZXIobmV3Tm9kZTogTm9kZSwgcmVmZXJlbmNlTm9kZTogTm9kZSkge1xyXG4gICAgICAgIGlmIChyZWZlcmVuY2VOb2RlLnBhcmVudE5vZGUpIHtcclxuICAgICAgICAgICAgcmVmZXJlbmNlTm9kZS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShuZXdOb2RlLCByZWZlcmVuY2VOb2RlLm5leHRTaWJsaW5nKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAqIENoZWNrcyBpZiBhIGdpdmVuIERPTSBOb2RlIGhhcyBhbnkgdmlzaWJsZSB0ZXh0IGNvbnRlbnQuIFRoZSBmdW5jdGlvbiBjb25zaWRlcnMgdGV4dCBjb250ZW50IGRpcmVjdGx5IHdpdGhpbiB0aGUgbm9kZVxyXG4gICAgKiBhcyB3ZWxsIGFzIHJlY3Vyc2l2ZWx5IGNoZWNraW5nIGFsbCBjaGlsZCBub2Rlcy4gVGhpcyBpcyB1c2VmdWwgZm9yIGRldGVybWluaW5nIGlmIGFuIGVsZW1lbnQgb3IgYW55IHBhcnQgb2YgYSBzdWJ0cmVlXHJcbiAgICAqIGhhcyB0ZXh0dWFsIHNpZ25pZmljYW5jZSwgd2hpY2ggbWlnaHQgYWZmZWN0IGRpc3BsYXkgbG9naWMsIHZhbGlkYXRpb24sIG9yIHByb2Nlc3NpbmcuXHJcbiAgICAqXHJcbiAgICAqIEBwYXJhbSB7Tm9kZX0gbm9kZSAtIFRoZSBET00gTm9kZSB0byBjaGVjayBmb3IgdGV4dCBjb250ZW50LlxyXG4gICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgbm9kZSBpdHNlbGYgb3IgYW55IG9mIGl0cyBjaGlsZHJlbiBoYXMgbm9uLWVtcHR5IHRleHQgY29udGVudCwgb3RoZXJ3aXNlIGZhbHNlLlxyXG4gICAgKlxyXG4gICAgKiBAZXhhbXBsZVxyXG4gICAgKiAvLyBTdXBwb3NlIHlvdSB3YW50IHRvIGNoZWNrIGlmIGEgcGFyYWdyYXBoIGVsZW1lbnQgaXMgZW1wdHkgb3Igbm90OlxyXG4gICAgKiBjb25zdCBwYXJhZ3JhcGggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhhbXBsZVBhcmFncmFwaCcpO1xyXG4gICAgKiBjb25zdCBoYXNDb250ZW50ID0gaGFzVGV4dENvbnRlbnQocGFyYWdyYXBoKTtcclxuICAgICogY29uc29sZS5sb2coJ0RvZXMgdGhlIHBhcmFncmFwaCBoYXZlIGNvbnRlbnQ/JywgaGFzQ29udGVudCk7XHJcbiAgICAqXHJcbiAgICAqIEBkZXNjcmlwdGlvblxyXG4gICAgKiBUaGlzIGZ1bmN0aW9uIGZpcnN0IGNoZWNrcyB0aGUgdGV4dCBjb250ZW50IG9mIHRoZSBub2RlIGl0c2VsZi4gSWYgdGhlIG5vZGUncyB0ZXh0Q29udGVudCwgd2hlbiB0cmltbWVkLCBpcyBub3QgYW4gZW1wdHkgc3RyaW5nLFxyXG4gICAgKiB0aGUgZnVuY3Rpb24gcmV0dXJucyB0cnVlLCBpbmRpY2F0aW5nIHRoZSBwcmVzZW5jZSBvZiB2aXNpYmxlIHRleHQuIElmIHRoZSBpbml0aWFsIGNoZWNrIGZhaWxzLCB0aGUgZnVuY3Rpb24gdGhlbiByZWN1cnNpdmVseVxyXG4gICAgKiBjaGVja3MgZWFjaCBjaGlsZCBub2RlIHRvIGRldGVybWluZSBpZiBhbnkgY2hpbGQgY29udGFpbnMgdmlzaWJsZSB0ZXh0LiBUaGlzIHJlY3Vyc2lvbiBlbnN1cmVzIHRoYXQgZXZlbiBkZWVwbHkgbmVzdGVkIHRleHQgbm9kZXNcclxuICAgICogdGhhdCBjb250cmlidXRlIHRvIHRoZSB2aXNpYmxlIGNvbnRlbnQgYXJlIGFjY291bnRlZCBmb3IuIFRoZSBmdW5jdGlvbiByZXR1cm5zIHRydWUgYXQgdGhlIGZpcnN0IGluc3RhbmNlIG9mIGZpbmRpbmcgdmlzaWJsZSB0ZXh0LFxyXG4gICAgKiBvcHRpbWl6aW5nIHRoZSBzZWFyY2ggcHJvY2VzcyB3aXRoaW4gcG90ZW50aWFsbHkgbGFyZ2UgRE9NIHN0cnVjdHVyZXMuXHJcbiAgICAqL1xyXG4gICAgc3RhdGljIGhhc1RleHRDb250ZW50KG5vZGU6IE5vZGUpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gbm9kZS50ZXh0Q29udGVudD8udHJpbSgpICE9PSAnJyB8fFxyXG4gICAgICAgICAgICAobm9kZS5oYXNDaGlsZE5vZGVzKCkgJiYgQXJyYXkuZnJvbShub2RlLmNoaWxkTm9kZXMpLnNvbWUoY2hpbGROb2RlID0+IHRoaXMuaGFzVGV4dENvbnRlbnQoY2hpbGROb2RlKSkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgKiBDbG9uZXMgYSBzcGVjaWZpZWQgSFRNTEVsZW1lbnQgYW5kIGluc2VydHMgdGhlIGNsb25lIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBvcmlnaW5hbCBlbGVtZW50IGluIHRoZSBET00uXHJcbiAgICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZnVsIGZvciBkdXBsaWNhdGluZyBpbnRlcmFjdGl2ZSBjb21wb25lbnRzIG9yIGNvbnRlbnQgYmxvY2tzIHdpdGhpbiBhIGR5bmFtaWMgaW50ZXJmYWNlLlxyXG4gICAgKlxyXG4gICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50IC0gVGhlIEhUTUxFbGVtZW50IHRvIGJlIGNsb25lZCBhbmQgcmVpbnNlcnRlZC5cclxuICAgICogQHJldHVybnMge0hUTUxFbGVtZW50IHwgbnVsbH0gVGhlIGNsb25lZCBIVE1MRWxlbWVudCBpZiB0aGUgb3BlcmF0aW9uIGlzIHN1Y2Nlc3NmdWwsIG9yIG51bGwgaWYgdGhlIG9yaWdpbmFsIGVsZW1lbnQgZG9lcyBub3QgaGF2ZSBhIHBhcmVudC5cclxuICAgICpcclxuICAgICogQGV4YW1wbGVcclxuICAgICogLy8gQXNzdW1lIHlvdSBoYXZlIGEgbGlzdCBpdGVtIHRoYXQgeW91IHdhbnQgdG8gZHVwbGljYXRlOlxyXG4gICAgKiBjb25zdCBsaXN0SXRlbSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2xpLm15LWl0ZW0nKTtcclxuICAgICogY29uc3QgbmV3TGlzdEl0ZW0gPSBjbG9uZUFuZEluc2VydEFmdGVyKGxpc3RJdGVtKTtcclxuICAgICogaWYgKG5ld0xpc3RJdGVtKSB7XHJcbiAgICAqICAgICBjb25zb2xlLmxvZygnSXRlbSB3YXMgY2xvbmVkIHN1Y2Nlc3NmdWxseS4nKTtcclxuICAgICogfVxyXG4gICAgKlxyXG4gICAgKiBAZGVzY3JpcHRpb25cclxuICAgICogVGhpcyBmdW5jdGlvbiBmaXJzdCBhdHRlbXB0cyB0byBjbG9uZSB0aGUgcHJvdmlkZWQgYGVsZW1lbnRgIHVzaW5nIGBjbG9uZU5vZGUodHJ1ZSlgLCB3aGljaCBlbnN1cmVzIHRoYXQgYWxsIGNoaWxkIG5vZGVzIGFuZCBhdHRyaWJ1dGVzIGFyZSBjb3BpZWQuXHJcbiAgICAqIFRoZSBmdW5jdGlvbiB0aGVuIGNoZWNrcyBpZiB0aGUgb3JpZ2luYWwgZWxlbWVudCBoYXMgYSBwYXJlbnQgbm9kZS4gSWYgaXQgZG9lcyBub3QsIHRoZSBmdW5jdGlvbiByZXR1cm5zIG51bGwgc2luY2UgaW5zZXJ0aW9uIGNhbm5vdCBwcm9jZWVkLlxyXG4gICAgKiBJZiBhIHBhcmVudCBub2RlIGV4aXN0cywgdGhlIGNsb25lZCBlbGVtZW50IGlzIGluc2VydGVkIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBvcmlnaW5hbCBlbGVtZW50IHVzaW5nIGBwYXJlbnROb2RlLmluc2VydEJlZm9yZSgpYC5cclxuICAgICogVGhpcyBhbGxvd3MgdGhlIGZ1bmN0aW9uIHRvIGVmZmVjdGl2ZWx5IGR1cGxpY2F0ZSBhbmQgcGxhY2UgdGhlIG5ldyBlbGVtZW50IGluIHRoZSBjb3JyZWN0IHBvc2l0aW9uIHdpdGhpbiB0aGUgRE9NIHRyZWUuXHJcbiAgICAqL1xyXG4gICAgc3RhdGljIGNsb25lQW5kSW5zZXJ0QWZ0ZXIoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBIVE1MRWxlbWVudCB8IG51bGwge1xyXG4gICAgICAgIGNvbnN0IGNsb25lZEVsZW1lbnQgPSBlbGVtZW50LmNsb25lTm9kZSh0cnVlKSBhcyBIVE1MRWxlbWVudDtcclxuXHJcbiAgICAgICAgY29uc3QgcGFyZW50RWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZTtcclxuXHJcbiAgICAgICAgaWYgKCFwYXJlbnRFbGVtZW50KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcGFyZW50RWxlbWVudC5pbnNlcnRCZWZvcmUoY2xvbmVkRWxlbWVudCwgZWxlbWVudC5uZXh0U2libGluZyk7XHJcblxyXG4gICAgICAgIHJldHVybiBjbG9uZWRFbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBcclxuICAgICogU2VhcmNoZXMgZm9yIHRoZSBjbG9zZXN0IGFuY2VzdG9yIGVsZW1lbnQgb2YgdGhlIGN1cnJlbnRseSBhY3RpdmUgZWxlbWVudCB0aGF0IGhhcyB0aGUgc3BlY2lmaWVkIENTUyBjbGFzcy5cclxuICAgICogVGhpcyBmdW5jdGlvbiB0cmF2ZXJzZXMgdXAgZnJvbSB0aGUgYWN0aXZlIGVsZW1lbnQgaW4gdGhlIERPTSB0cmVlIGFuZCBjaGVja3MgZWFjaCBhbmNlc3RvciB0byBzZWUgaWYgaXQgbWF0Y2hlc1xyXG4gICAgKiB0aGUgc3BlY2lmaWVkIGNsYXNzIG5hbWUuXHJcbiAgICAqXHJcbiAgICAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc05hbWUgLSBUaGUgY2xhc3MgbmFtZSB0byBtYXRjaCBhZ2FpbnN0IGFuY2VzdG9yIGVsZW1lbnRzLlxyXG4gICAgKiBAcmV0dXJucyB7SFRNTEVsZW1lbnQgfCBudWxsfSBUaGUgY2xvc2VzdCBhbmNlc3RvciBlbGVtZW50IHdpdGggdGhlIHNwZWNpZmllZCBjbGFzcywgb3IgbnVsbCBpZiBubyBzdWNoIGVsZW1lbnQgZXhpc3RzLlxyXG4gICAgKlxyXG4gICAgKiBAZXhhbXBsZVxyXG4gICAgKiAvLyBTdXBwb3NlIHlvdSB3YW50IHRvIGZpbmQgdGhlIGNsb3Nlc3QgZm9ybSBlbGVtZW50IHRoYXQgY29udGFpbnMgdGhlIGN1cnJlbnRseSBmb2N1c2VkIGlucHV0IGZpZWxkOlxyXG4gICAgKiBjb25zdCBjbG9zZXN0Rm9ybSA9IGZpbmRDbG9zZXN0QW5jZXN0b3JPZkFjdGl2ZUVsZW1lbnRCeUNsYXNzKCdteS1mb3JtLWNsYXNzJyk7XHJcbiAgICAqIGNvbnNvbGUubG9nKGNsb3Nlc3RGb3JtKTtcclxuICAgICpcclxuICAgICogQGRlc2NyaXB0aW9uXHJcbiAgICAqIFRoaXMgZnVuY3Rpb24gYmVnaW5zIGJ5IG9idGFpbmluZyBhIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudGx5IGFjdGl2ZSBlbGVtZW50IHVzaW5nIGBkb2N1bWVudC5hY3RpdmVFbGVtZW50YC5cclxuICAgICogSWYgdGhlcmUgaXMgbm8gYWN0aXZlIGVsZW1lbnQsIG9yIHRoZSBhY3RpdmUgZWxlbWVudCBkb2VzIG5vdCBoYXZlIGFueSBhbmNlc3RvciB3aXRoIHRoZSBzcGVjaWZpZWQgY2xhc3MsXHJcbiAgICAqIHRoZSBmdW5jdGlvbiByZXR1cm5zIG51bGwuIE90aGVyd2lzZSwgaXQgaXRlcmF0ZXMgdGhyb3VnaCB0aGUgYW5jZXN0b3JzIG9mIHRoZSBhY3RpdmUgZWxlbWVudCB1bnRpbCBpdCBmaW5kc1xyXG4gICAgKiBhbiBlbGVtZW50IHdpdGggdGhlIHNwZWNpZmllZCBjbGFzcyBvciByZWFjaGVzIHRoZSByb290IG9mIHRoZSBkb2N1bWVudC4gVGhpcyBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsIGluIGNvbXBsZXhcclxuICAgICogZm9ybXMgb3IgaW50ZXJhY3RpdmUgYXJlYXMgd2hlcmUgY29udGV4dC1iYXNlZCBhY3Rpb25zIGRlcGVuZCBvbiBzcGVjaWZpYyBwYXJ0cyBvZiB0aGUgRE9NIHN0cnVjdHVyZS5cclxuICAgICovXHJcbiAgICBzdGF0aWMgZmluZENsb3Nlc3RBbmNlc3Rvck9mQWN0aXZlRWxlbWVudEJ5Q2xhc3MoY2xhc3NOYW1lOiBzdHJpbmcpOiBIVE1MRWxlbWVudCB8IG51bGwge1xyXG4gICAgICAgIGNvbnN0IGFjdGl2ZUVsZW1lbnQgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xyXG5cclxuICAgICAgICBpZiAoIWFjdGl2ZUVsZW1lbnQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgY3VycmVudEVsZW1lbnQ6IE5vZGUgfCBudWxsID0gYWN0aXZlRWxlbWVudDtcclxuXHJcbiAgICAgICAgd2hpbGUgKGN1cnJlbnRFbGVtZW50KSB7XHJcbiAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50Lm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSAmJlxyXG4gICAgICAgICAgICAgICAgKGN1cnJlbnRFbGVtZW50IGFzIEhUTUxFbGVtZW50KS5jbGFzc0xpc3QuY29udGFpbnMoY2xhc3NOYW1lKVxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50RWxlbWVudCBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY3VycmVudEVsZW1lbnQgPSBjdXJyZW50RWxlbWVudC5wYXJlbnROb2RlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgKiBGaW5kcyB0aGUgY2xvc2VzdCBhbmNlc3RvciBlbGVtZW50IHdpdGggdGhlIHNwZWNpZmllZCBjbGFzcyBuYW1lIGZyb20gdGhlIGN1cnJlbnQgdGV4dCBzZWxlY3Rpb24uXHJcbiAgICAqIElmIHRoZSBzZWxlY3Rpb24gaXMgaW4gYSB0ZXh0IG5vZGUsIGl0IGNsaW1icyB1cCB0aGUgRE9NIHRyZWUgdG8gZmluZCB0aGUgY2xvc2VzdCBlbGVtZW50IHRoYXQgbWF0Y2hlcyB0aGUgc3BlY2lmaWVkIGNsYXNzLlxyXG4gICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWZ1bCBmb3IgY29udGV4dC1zZW5zaXRpdmUgb3BlcmF0aW9ucyBiYXNlZCBvbiB0aGUgY3VycmVudCBzZWxlY3Rpb24gaW4gZG9jdW1lbnQgZWRpdGluZyBvciBwcm9jZXNzaW5nIGVudmlyb25tZW50cy5cclxuICAgICpcclxuICAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzTmFtZSAtIFRoZSBjbGFzcyBuYW1lIHRvIHNlYXJjaCBmb3IgaW4gYW5jZXN0b3IgZWxlbWVudHMuXHJcbiAgICAqIEByZXR1cm5zIHtIVE1MRWxlbWVudCB8IG51bGx9IFRoZSBjbG9zZXN0IGFuY2VzdG9yIGVsZW1lbnQgd2l0aCB0aGUgc3BlY2lmaWVkIGNsYXNzLCBvciBudWxsIGlmIG5vIHN1Y2ggZWxlbWVudCBpcyBmb3VuZC5cclxuICAgICovXHJcbiAgICBzdGF0aWMgZmluZENsb3Nlc3RBbmNlc3Rvck9mU2VsZWN0aW9uQnlDbGFzcyhjbGFzc05hbWU6IHN0cmluZyk6IEhUTUxFbGVtZW50IHwgbnVsbCB7XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG5cclxuICAgICAgICAvLyBDaGVjayBpZiB0aGVyZSdzIGEgc2VsZWN0aW9uIGFuZCBpZiBpdCBoYXMgYXQgbGVhc3Qgb25lIHJhbmdlXHJcbiAgICAgICAgaWYgKCFzZWxlY3Rpb24gfHwgc2VsZWN0aW9uLnJhbmdlQ291bnQgPT09IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBHZXQgdGhlIHN0YXJ0aW5nIG5vZGUgb2YgdGhlIHNlbGVjdGlvblxyXG4gICAgICAgIGxldCBjdXJyZW50RWxlbWVudDogTm9kZSB8IG51bGwgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKS5jb21tb25BbmNlc3RvckNvbnRhaW5lcjtcclxuXHJcbiAgICAgICAgLy8gSWYgdGhlIGN1cnJlbnQgbm9kZSBpcyBhIHRleHQgbm9kZSwgc3RhcnQgZnJvbSBpdHMgcGFyZW50IGVsZW1lbnRcclxuICAgICAgICBpZiAoY3VycmVudEVsZW1lbnQgJiYgY3VycmVudEVsZW1lbnQubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XHJcbiAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50ID0gY3VycmVudEVsZW1lbnQucGFyZW50Tm9kZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIFRyYXZlcnNlIHVwIHRoZSBET00gdHJlZSB0byBmaW5kIHRoZSBjbG9zZXN0IGVsZW1lbnQgd2l0aCB0aGUgc3BlY2lmaWVkIGNsYXNzXHJcbiAgICAgICAgd2hpbGUgKGN1cnJlbnRFbGVtZW50KSB7XHJcbiAgICAgICAgICAgIGlmIChjdXJyZW50RWxlbWVudC5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUgJiYgKGN1cnJlbnRFbGVtZW50IGFzIEhUTUxFbGVtZW50KS5jbGFzc0xpc3QuY29udGFpbnMoY2xhc3NOYW1lKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50ID0gY3VycmVudEVsZW1lbnQucGFyZW50Tm9kZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgKiBSZWFycmFuZ2UgY29udGVudCBhcm91bmQgdGhlIHNwbGl0IHBvaW50IGJhc2VkIG9uIHRoZSBjdXJzb3IgcG9zaXRpb24uXHJcbiAgICAqIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyB0aGUgcHJvY2VzcyBvZiBzcGxpdHRpbmcgdGhlIGNvbnRlbnQgYXQgdGhlIGN1cnNvcixcclxuICAgICogdGhlbiByZWFycmFuZ2luZyB0aGUgY29udGVudCBieSBkZWxldGluZyBhcHByb3ByaWF0ZSBwYXJ0cyBpbiB0aGUgb3JpZ2luYWxcclxuICAgICogYW5kIGNsb25lZCBub2Rlcy4gSXQgZW5zdXJlcyB0aGF0IGFmdGVyIHRoZSBzcGxpdCwgdGhlIG9yaWdpbmFsIG5vZGUgY29udGFpbnNcclxuICAgICogb25seSB0aGUgY29udGVudCBiZWZvcmUgdGhlIGN1cnNvciBhbmQgdGhlIGNsb25lZCBub2RlIGNvbnRhaW5zIHRoZSBjb250ZW50IGFmdGVyIHRoZSBjdXJzb3IuXHJcbiAgICAqIEltcG9ydGFudGx5LCB0aGlzIGZ1bmN0aW9uIG1haW50YWlucyB0aGUgdmFsaWRpdHkgb2YgdGhlIERPTSBzdHJ1Y3R1cmUgYWZ0ZXIgbW9kaWZpY2F0aW9ucyxcclxuICAgICogcHJldmVudGluZyBhbnkgZGlzcnVwdGlvbnMgaW4gZG9jdW1lbnQgc3RydWN0dXJlIHRoYXQgY291bGQgYWZmZWN0IHJlbmRlcmluZyBvciBmdXJ0aGVyIHNjcmlwdGluZy5cclxuICAgICogXHJcbiAgICAqIEBwYXJhbSB7Tm9kZX0gY3VycmVudE5vZGUgLSBUaGUgbm9kZSBjb250YWluaW5nIHRoZSBvcmlnaW5hbCBjb250ZW50IGJlZm9yZSB0aGUgc3BsaXQuXHJcbiAgICAqIEBwYXJhbSB7Tm9kZX0gbmV3Tm9kZSAtIFRoZSBjbG9uZWQgbm9kZSB0aGF0IHdpbGwgY29udGFpbiB0aGUgY29udGVudCBhZnRlciB0aGUgc3BsaXQuXHJcbiAgICAqIEByZXR1cm5zIHt2b2lkfSBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHJldHVybiBhIHZhbHVlOyBpdCBtb2RpZmllcyBET00gbm9kZXMgZGlyZWN0bHkuXHJcbiAgICAqIFxyXG4gICAgKiBAZXhhbXBsZVxyXG4gICAgKiAvLyBBc3N1bWluZyBjdXJyZW50Tm9kZSBpcyBhbiBlbGVtZW50IHdpdGggdGV4dCBjb250ZW50IGFuZCBhIGN1cnNvciBwb3NpdGlvbiB3aXRoaW4gaXQsXHJcbiAgICAqIC8vIGFuZCBuZXdOb2RlIGlzIGl0cyBjbG9uZWQgY291bnRlcnBhcnQ6XHJcbiAgICAqIHJlYXJyYW5nZUNvbnRlbnRBZnRlclNwbGl0KGN1cnJlbnROb2RlLCBuZXdOb2RlKTtcclxuICAgICogXHJcbiAgICAqIEBkZXNjcmlwdGlvblxyXG4gICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGEgcGFydCBvZiBhbiBlZGl0aW5nIHN5c3RlbSB3aGVyZSBjb250ZW50IG5lZWRzIHRvIGJlIGR5bmFtaWNhbGx5XHJcbiAgICAqIHNwbGl0IGFuZCByZWFycmFuZ2VkLiBJdCB1c2VzIGEgY3Vyc29yLWJhc2VkIGFwcHJvYWNoIHRvIGRldGVybWluZSB0aGUgc3BsaXQgcG9pbnQsXHJcbiAgICAqIHJlbW92ZXMgY29udGVudCBmcm9tIHRoZSBvcmlnaW5hbCBhbmQgdGhlIGNsb25lIGJhc2VkIG9uIHRoZSBjdXJzb3IncyBwb3NpdGlvbixcclxuICAgICogYW5kIHNldHMgdXAgdGhlIG5vZGVzIGZvciBzdWJzZXF1ZW50IHVzZXIgaW50ZXJhY3Rpb25zLiBUaGUgRE9NIHJlbWFpbnMgdmFsaWQgYW5kIHdlbGwtZm9ybWVkLFxyXG4gICAgKiBlbnN1cmluZyB0aGF0IHN1YnNlcXVlbnQgb3BlcmF0aW9ucywgc3VjaCBhcyBmdXJ0aGVyIHNwbGl0cyBvciBzdHlsZSBjaGFuZ2VzLCBjYW4gYmUgcGVyZm9ybWVkXHJcbiAgICAqIHdpdGhvdXQgYWRkaXRpb25hbCBjaGVja3Mgb3IgY29ycmVjdGlvbnMuXHJcbiAgICAqL1xyXG4gICAgc3RhdGljIHJlYXJyYW5nZUNvbnRlbnRBZnRlclNwbGl0KGN1cnJlbnROb2RlOiBOb2RlLCBuZXdOb2RlOiBOb2RlKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgY3Vyc29yUG9zaXRpb24gPSBET01VdGlscy5nZXRDdXJzb3JQb3NpdGlvbihjdXJyZW50Tm9kZSBhcyBOb2RlKTtcclxuICAgICAgICBjb25zdCByYW5nZXMxID0gdGhpcy5zcGxpdENvbnRlbnRBdEN1cnNvclNlbGVjdGlvbihjdXJyZW50Tm9kZSBhcyBOb2RlKTtcclxuXHJcbiAgICAgICAgLy8gY2hhbmdlIHRoZSBvcmlnaW5hbFxyXG4gICAgICAgIGRvY3VtZW50LmdldFNlbGVjdGlvbigpPy5yZW1vdmVBbGxSYW5nZXMoKTtcclxuICAgICAgICBkb2N1bWVudC5nZXRTZWxlY3Rpb24oKT8uYWRkUmFuZ2UocmFuZ2VzMVsxXSk7XHJcbiAgICAgICAgZG9jdW1lbnQuZ2V0U2VsZWN0aW9uKCk/LmRlbGV0ZUZyb21Eb2N1bWVudCgpO1xyXG5cclxuICAgICAgICAvLyBjaGFuZ2UgdGhlIGNsb25lXHJcbiAgICAgICAgaWYgKG5ld05vZGUgJiYgY3Vyc29yUG9zaXRpb24pIHtcclxuICAgICAgICAgICAgdGhpcy5zZXRDdXJzb3JQb3NpdGlvbihuZXdOb2RlLCBjdXJzb3JQb3NpdGlvbik7XHJcblxyXG4gICAgICAgICAgICBjb25zdCByYW5nZXMyID0gdGhpcy5zcGxpdENvbnRlbnRBdEN1cnNvclNlbGVjdGlvbihuZXdOb2RlIGFzIE5vZGUpO1xyXG5cclxuICAgICAgICAgICAgZG9jdW1lbnQuZ2V0U2VsZWN0aW9uKCk/LnJlbW92ZUFsbFJhbmdlcygpO1xyXG4gICAgICAgICAgICBkb2N1bWVudC5nZXRTZWxlY3Rpb24oKT8uYWRkUmFuZ2UocmFuZ2VzMlswXSk7XHJcbiAgICAgICAgICAgIGRvY3VtZW50LmdldFNlbGVjdGlvbigpPy5kZWxldGVGcm9tRG9jdW1lbnQoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAqIENhbGN1bGF0ZXMgdGhlIGN1cnNvciBwb3NpdGlvbiB3aXRoaW4gdGhlIHNwZWNpZmllZCBub2RlLiBUaGUgcG9zaXRpb24gaXMgZGV0ZXJtaW5lZFxyXG4gICAgKiBieSBjb3VudGluZyBjaGFyYWN0ZXJzIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBub2RlIHRvIHRoZSBjdXJzb3IncyBsb2NhdGlvbiB3aXRoaW4gdGhlIG5vZGUuXHJcbiAgICAqIFRoaXMgZnVuY3Rpb24gaXMgZXNzZW50aWFsIGZvciBzY2VuYXJpb3Mgd2hlcmUgcHJlY2lzZSB0ZXh0IG1hbmlwdWxhdGlvbiBpcyByZXF1aXJlZCwgc3VjaCBhc1xyXG4gICAgKiB0ZXh0IGVkaXRvcnMgb3IgZHluYW1pY2FsbHkgZ2VuZXJhdGVkIGNvbnRlbnQgZmllbGRzLlxyXG4gICAgKiBcclxuICAgICogQHBhcmFtIHtOb2RlfSBub2RlIC0gVGhlIG5vZGUgd2l0aGluIHdoaWNoIHRvIGNhbGN1bGF0ZSB0aGUgY3Vyc29yIHBvc2l0aW9uLlxyXG4gICAgKiBAcmV0dXJucyB7bnVtYmVyIHwgbnVsbH0gVGhlIHplcm8tYmFzZWQgaW5kZXggcmVwcmVzZW50aW5nIHRoZSBjdXJzb3IncyBwb3NpdGlvbiB3aXRoaW4gdGhlIG5vZGUsXHJcbiAgICAqIG9yIG51bGwgaWYgdGhlIHNlbGVjdGlvbiBkb2VzIG5vdCBpbnRlcnNlY3Qgd2l0aCB0aGUgc3BlY2lmaWVkIG5vZGUgb3IgaWYgdGhlcmUgYXJlIGFueSBpc3N1ZXNcclxuICAgICogcmV0cmlldmluZyB0aGUgc2VsZWN0aW9uLlxyXG4gICAgKiBcclxuICAgICogQGV4YW1wbGVcclxuICAgICogLy8gQXNzdW1pbmcgdGhlcmUgaXMgYSBjb250ZW50ZWRpdGFibGUgZWxlbWVudCBhbmQgdGhlIGN1cnNvciBpcyBpbnNpZGUgaXQ6XHJcbiAgICAqIGNvbnN0IHBvc2l0aW9uID0gZ2V0Q3Vyc29yUG9zaXRpb24oZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ215LWVkaXRhYmxlLWRpdicpKTtcclxuICAgICogY29uc29sZS5sb2coJ0N1cnNvciBwb3NpdGlvbjonLCBwb3NpdGlvbik7XHJcbiAgICAqIFxyXG4gICAgKiBAZGVzY3JpcHRpb25cclxuICAgICogVGhpcyBmdW5jdGlvbiByZXRyaWV2ZXMgdGhlIGN1cnJlbnQgc2VsZWN0aW9uJ3MgcmFuZ2UgYW5kIGRldGVybWluZXMgaWYgaXQgaW50ZXJzZWN0cyB3aXRoIHRoZVxyXG4gICAgKiBnaXZlbiBub2RlLiBJZiBhbiBpbnRlcnNlY3Rpb24gaXMgZm91bmQsIGl0IHVzZXMgYSBUcmVlV2Fsa2VyIHRvIHRyYXZlcnNlIHRoZSB0ZXh0IG5vZGVzIHVuZGVyXHJcbiAgICAqIHRoZSBnaXZlbiBub2RlLCBjb3VudGluZyBjaGFyYWN0ZXJzIHVudGlsIGl0IHJlYWNoZXMgdGhlIHN0YXJ0IGNvbnRhaW5lciBvZiB0aGUgcmFuZ2UuXHJcbiAgICAqIFRoaXMgYWxsb3dzIHRoZSBmdW5jdGlvbiB0byByZXR1cm4gYW4gYWNjdXJhdGUgY2hhcmFjdGVyIGluZGV4IGV2ZW4gaW4gdGhlIHByZXNlbmNlIG9mIG5lc3RlZCBlbGVtZW50c1xyXG4gICAgKiBvciBtaXhlZCBjb250ZW50ICh0ZXh0IGNvbWJpbmVkIHdpdGggZWxlbWVudHMpLlxyXG4gICAgKi9cclxuICAgIHN0YXRpYyBnZXRDdXJzb3JQb3NpdGlvbihub2RlOiBOb2RlKTogbnVtYmVyIHwgbnVsbCB7XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG4gICAgICAgIGlmICghc2VsZWN0aW9uIHx8ICFub2RlKSByZXR1cm4gbnVsbDtcclxuXHJcbiAgICAgICAgY29uc3QgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcclxuXHJcbiAgICAgICAgaWYgKCFyYW5nZS5pbnRlcnNlY3RzTm9kZShub2RlKSkgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgICAgIGNvbnN0IHRyZWVXYWxrZXIgPSBkb2N1bWVudC5jcmVhdGVUcmVlV2Fsa2VyKFxyXG4gICAgICAgICAgICBub2RlLFxyXG4gICAgICAgICAgICBOb2RlRmlsdGVyLlNIT1dfVEVYVCxcclxuICAgICAgICAgICAgeyBhY2NlcHROb2RlOiBub2RlID0+IE5vZGVGaWx0ZXIuRklMVEVSX0FDQ0VQVCB9XHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgbGV0IGNoYXJDb3VudCA9IDA7XHJcbiAgICAgICAgbGV0IGN1cnJlbnROb2RlID0gdHJlZVdhbGtlci5maXJzdENoaWxkKCk7XHJcblxyXG4gICAgICAgIHdoaWxlIChjdXJyZW50Tm9kZSkge1xyXG4gICAgICAgICAgICBpZiAoY3VycmVudE5vZGUgPT09IHJhbmdlLnN0YXJ0Q29udGFpbmVyKSB7XHJcbiAgICAgICAgICAgICAgICBjaGFyQ291bnQgKz0gcmFuZ2Uuc3RhcnRPZmZzZXQ7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY2hhckNvdW50ICs9IGN1cnJlbnROb2RlLnRleHRDb250ZW50Py5sZW5ndGggfHwgMDtcclxuICAgICAgICAgICAgY3VycmVudE5vZGUgPSB0cmVlV2Fsa2VyLm5leHROb2RlKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gY2hhckNvdW50O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgKiBTZXRzIHRoZSBjdXJzb3IgcG9zaXRpb24gd2l0aGluIHRoZSBzcGVjaWZpZWQgZWxlbWVudCBiYXNlZCBvbiBhIGNoYXJhY3RlciBpbmRleC5cclxuICAgICogVGhpcyBmdW5jdGlvbiBjcmVhdGVzIGEgbmV3IHJhbmdlIGFuZCB1c2VzIGEgVHJlZVdhbGtlciB0byBuYXZpZ2F0ZSB0aHJvdWdoIHRoZSB0ZXh0IG5vZGVzXHJcbiAgICAqIHdpdGhpbiB0aGUgZWxlbWVudCB0byBmaW5kIHRoZSBleGFjdCBsb2NhdGlvbiB0byBzZXQgdGhlIGN1cnNvci4gVGhlIHBvc2l0aW9uIGlzIHNldFxyXG4gICAgKiBieSBjb3VudGluZyBjaGFyYWN0ZXJzIHVwIHRvIHRoZSBzcGVjaWZpZWQgaW5kZXguXHJcbiAgICAqIFxyXG4gICAgKiBAcGFyYW0ge05vZGV9IGVsZW1lbnQgLSBUaGUgZWxlbWVudCB3aXRoaW4gd2hpY2ggdG8gc2V0IHRoZSBjdXJzb3IgcG9zaXRpb24uXHJcbiAgICAqIEBwYXJhbSB7bnVtYmVyfSBwb3NpdGlvbiAtIFRoZSB6ZXJvLWJhc2VkIGNoYXJhY3RlciBpbmRleCB3aGVyZSB0aGUgY3Vyc29yIHNob3VsZCBiZSBwb3NpdGlvbmVkLlxyXG4gICAgKiBAcmV0dXJucyB7dm9pZH0gVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCByZXR1cm4gYSB2YWx1ZTsgaXQgZGlyZWN0bHkgbW9kaWZpZXMgdGhlIHNlbGVjdGlvbiB3aXRoaW4gdGhlIGRvY3VtZW50LlxyXG4gICAgKiBcclxuICAgICogQGV4YW1wbGVcclxuICAgICogLy8gQXNzdW1pbmcgdGhlcmUgaXMgYSBwYXJhZ3JhcGggZWxlbWVudCBhbmQgeW91IHdhbnQgdG8gc2V0IHRoZSBjdXJzb3IgYXQgdGhlIDEwdGggY2hhcmFjdGVyOlxyXG4gICAgKiBjb25zdCBwYXJhZ3JhcGggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbXktcGFyYWdyYXBoJyk7XHJcbiAgICAqIHNldEN1cnNvclBvc2l0aW9uKHBhcmFncmFwaCwgMTApO1xyXG4gICAgKiBcclxuICAgICogQGRlc2NyaXB0aW9uXHJcbiAgICAqIFRoZSBmdW5jdGlvbiBjbGVhcnMgYW55IGV4aXN0aW5nIHNlbGVjdGlvbnMsIGNhbGN1bGF0ZXMgdGhlIGNvcnJlY3QgdGV4dCBub2RlIGFuZCBvZmZzZXQgd2l0aGluIHRoYXQgbm9kZSxcclxuICAgICogYW5kIHRoZW4gc2V0cyBhIG5ldyByYW5nZSBhdCB0aGF0IHBvc2l0aW9uLiBJdCBlbnN1cmVzIHRoYXQgdGhlIGN1cnNvciBpcyBtb3ZlZCBhY2N1cmF0ZWx5LCBldmVuIHdpdGhpblxyXG4gICAgKiBjb21wbGV4IG5lc3RlZCBjb250ZW50IHN0cnVjdHVyZXMuIFRoaXMgaXMgcGFydGljdWxhcmx5IHVzZWZ1bCBmb3IgdGV4dCBlZGl0aW5nIGFwcGxpY2F0aW9ucyBhbmQgZHluYW1pY1xyXG4gICAgKiBjb250ZW50IG1hbmFnZW1lbnQgc3lzdGVtcyB3aGVyZSBwcmVjaXNlIGN1cnNvciBjb250cm9sIGlzIHJlcXVpcmVkLlxyXG4gICAgKi9cclxuICAgIHN0YXRpYyBzZXRDdXJzb3JQb3NpdGlvbihlbGVtZW50OiBOb2RlLCBwb3NpdGlvbjogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG4gICAgICAgIGlmICghc2VsZWN0aW9uKSByZXR1cm47XHJcblxyXG4gICAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcclxuXHJcbiAgICAgICAgY29uc3QgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xyXG4gICAgICAgIGNvbnN0IHRyZWVXYWxrZXIgPSBkb2N1bWVudC5jcmVhdGVUcmVlV2Fsa2VyKFxyXG4gICAgICAgICAgICBlbGVtZW50LFxyXG4gICAgICAgICAgICBOb2RlRmlsdGVyLlNIT1dfVEVYVCxcclxuICAgICAgICAgICAgeyBhY2NlcHROb2RlOiAoKSA9PiBOb2RlRmlsdGVyLkZJTFRFUl9BQ0NFUFQgfVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIGxldCBjdXJyZW50Tm9kZSA9IHRyZWVXYWxrZXIubmV4dE5vZGUoKTtcclxuICAgICAgICBsZXQgY3VycmVudFBvcyA9IDA7XHJcblxyXG4gICAgICAgIHdoaWxlIChjdXJyZW50Tm9kZSkge1xyXG4gICAgICAgICAgICBjb25zdCB0ZXh0TGVuZ3RoID0gY3VycmVudE5vZGUudGV4dENvbnRlbnQ/Lmxlbmd0aCB8fCAwO1xyXG4gICAgICAgICAgICBpZiAoY3VycmVudFBvcyArIHRleHRMZW5ndGggPj0gcG9zaXRpb24pIHtcclxuICAgICAgICAgICAgICAgIHJhbmdlLnNldFN0YXJ0KGN1cnJlbnROb2RlLCBwb3NpdGlvbiAtIGN1cnJlbnRQb3MpO1xyXG4gICAgICAgICAgICAgICAgcmFuZ2UuY29sbGFwc2UodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjdXJyZW50UG9zICs9IHRleHRMZW5ndGg7XHJcbiAgICAgICAgICAgIGN1cnJlbnROb2RlID0gdHJlZVdhbGtlci5uZXh0Tm9kZSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICogUmV0cmlldmVzIHRoZSBjb250ZW50IHR5cGUgYXR0cmlidXRlIGZyb20gdGhlIGN1cnJlbnRseSBhY3RpdmUgY29udGVudCBibG9jayBpbiB0aGUgZG9jdW1lbnQuXHJcbiAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcHJpbWFyaWx5IHVzZWQgaW4gY29udGV4dHMgd2hlcmUgZGlmZmVyZW50IGFjdGlvbnMgb3IgYmVoYXZpb3JzIGFyZSBjb25kaXRpb25lZFxyXG4gICAgKiB1cG9uIHRoZSB0eXBlIG9mIGNvbnRlbnQgdGhlIHVzZXIgaXMgaW50ZXJhY3Rpbmcgd2l0aC5cclxuICAgICpcclxuICAgICogQHJldHVybnMge3N0cmluZyB8IG51bGx9IFRoZSB2YWx1ZSBvZiB0aGUgJ2RhdGEtY29udGVudC10eXBlJyBhdHRyaWJ1dGUgaWYgaXQgZXhpc3RzIG9uIHRoZSBjb250ZW50IGVsZW1lbnQsXHJcbiAgICAqIG9yIG51bGwgaWYgdGhlIGF0dHJpYnV0ZSBpcyBub3QgZm91bmQgb3IgdGhlIGNvbnRlbnQgZWxlbWVudCBkb2VzIG5vdCBleGlzdC5cclxuICAgICpcclxuICAgICogQGV4YW1wbGVcclxuICAgICogLy8gSWYgeW91IG5lZWQgdG8gYXBwbHkgc3BlY2lmaWMgbG9naWMgYmFzZWQgb24gdGhlIHR5cGUgb2YgY29udGVudCBjdXJyZW50bHkgYmVpbmcgZWRpdGVkOlxyXG4gICAgKiBjb25zdCBjb250ZW50VHlwZSA9IGdldENvbnRlbnRUeXBlRnJvbUFjdGl2ZUVsZW1lbnQoKTtcclxuICAgICogaWYgKGNvbnRlbnRUeXBlID09PSAncCcpIHtcclxuICAgICogICAgIGNvbnNvbGUubG9nKCdFZGl0aW5nIGEgdGV4dCBibG9jaycpO1xyXG4gICAgKiB9IGVsc2UgaWYgKGNvbnRlbnRUeXBlID09PSAnaDEnKSB7XHJcbiAgICAqICAgICBjb25zb2xlLmxvZygnRWRpdGluZyBhbiBoZWFkaW5nJyk7XHJcbiAgICAqIH1cclxuICAgICpcclxuICAgICogQGRlc2NyaXB0aW9uXHJcbiAgICAqIFRoaXMgZnVuY3Rpb24gYmVnaW5zIGJ5IGNhbGxpbmcgYGdldEN1cnJlbnRBY3RpdmVCbG9jaygpYCwgd2hpY2ggc2hvdWxkIHJldHVybiB0aGUgY3VycmVudGx5IGFjdGl2ZSBibG9jayBlbGVtZW50XHJcbiAgICAqIGluIHRoZSBVSS4gSXQgdGhlbiBzZWFyY2hlcyBmb3IgYW4gZWxlbWVudCB3aXRoaW4gdGhpcyBibG9jayB3aXRoIHRoZSBjbGFzcyAnLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCcsXHJcbiAgICAqIHdoaWNoIGlzIGV4cGVjdGVkIHRvIGNhcnJ5IGEgJ2RhdGEtY29udGVudC10eXBlJyBhdHRyaWJ1dGUgc3BlY2lmeWluZyB0aGUgdHlwZSBvZiBjb250ZW50IChlLmcuLCAndGV4dCcsICdpbWFnZScsIGV0Yy4pLlxyXG4gICAgKiBUaGUgZnVuY3Rpb24gcmV0cmlldmVzIGFuZCByZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGlzIGF0dHJpYnV0ZSwgb3IgbnVsbCBpZiB0aGUgYXR0cmlidXRlIGlzIG5vdCBwcmVzZW50LlxyXG4gICAgKi9cclxuICAgIHN0YXRpYyBnZXRDb250ZW50VHlwZUZyb21BY3RpdmVFbGVtZW50KCk6IHN0cmluZyB8IG51bGwge1xyXG4gICAgICAgIGNvbnN0IGJsb2NrID0gRE9NVXRpbHMuZ2V0Q3VycmVudEFjdGl2ZUJsb2NrKCk7XHJcbiAgICAgICAgY29uc3QgY29udGVudEVsZW1lbnQgPSBibG9jaz8ucXVlcnlTZWxlY3RvcihcIi5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnRcIikgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgaWYgKCFjb250ZW50RWxlbWVudCkge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY29udGVudFR5cGUgPSBjb250ZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJkYXRhLWNvbnRlbnQtdHlwZVwiKTtcclxuICAgICAgICByZXR1cm4gY29udGVudFR5cGUgfHwgbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICogU3BsaXRzIHRoZSBjb250ZW50IG9mIHRoZSBzcGVjaWZpZWQgcm9vdCBub2RlIGludG8gdHdvIHJhbmdlcyBiYXNlZCBvbiB0aGUgY3VycmVudCBjdXJzb3IgcG9zaXRpb24uXHJcbiAgICAqIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyB0d28gcmFuZ2VzOiBvbmUgZm9yIHRoZSBjb250ZW50IGJlZm9yZSB0aGUgY3Vyc29yIGFuZCBvbmUgZm9yIHRoZSBjb250ZW50IGFmdGVyLlxyXG4gICAgKiBUaGUgb3BlcmF0aW9uIGlzIGxpbWl0ZWQgdG8gdGhlIGJvdW5kYXJpZXMgb2YgdGhlIHByb3ZpZGVkIHJvb3Qgbm9kZSwgZW5zdXJpbmcgdGhhdCB0aGUgZGl2aXNpb24gcmVzcGVjdHNcclxuICAgICogdGhlIHN0cnVjdHVyYWwgaW50ZWdyaXR5IG9mIHRoZSBjb250ZW50IHdpdGhpbiB0aGF0IG5vZGUuXHJcbiAgICAqIFxyXG4gICAgKiBAcGFyYW0ge05vZGV9IHJvb3ROb2RlIC0gVGhlIHJvb3Qgbm9kZSB3aXRoaW4gd2hpY2ggdGhlIGNvbnRlbnQgaXMgdG8gYmUgc3BsaXQuIFRoaXMgbm9kZSBzZXRzIHRoZSBib3VuZGFyeSBmb3IgdGhlIHNwbGl0IG9wZXJhdGlvbi5cclxuICAgICogQHJldHVybnMge1JhbmdlW119IEFuIGFycmF5IG9mIHR3byBgUmFuZ2VgIG9iamVjdHM6IHRoZSBmaXJzdCBjb250YWluaW5nIHRoZSBjb250ZW50IGJlZm9yZSB0aGUgY3Vyc29yLCBhbmQgdGhlIHNlY29uZCBjb250YWluaW5nIHRoZSBjb250ZW50IGFmdGVyIHRoZSBjdXJzb3IuXHJcbiAgICAqIFxyXG4gICAgKiBAZXhhbXBsZVxyXG4gICAgKiAvLyBBc3N1bWUgdGhlcmUgaXMgYSBkaXYgZWxlbWVudCB3aXRoIGNvbnRlbnQgYW5kIGEgY3Vyc29yIHBvc2l0aW9uIHNvbWV3aGVyZSBpbnNpZGUgaXQ6XHJcbiAgICAqIGNvbnN0IGNvbnRlbnREaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29udGVudERpdicpO1xyXG4gICAgKiBjb25zdCByYW5nZXMgPSBzcGxpdENvbnRlbnRBdEN1cnNvclNlbGVjdGlvbihjb250ZW50RGl2KTtcclxuICAgICogY29uc29sZS5sb2coJ0NvbnRlbnQgYmVmb3JlIGN1cnNvcjonLCByYW5nZXNbMF0uY2xvbmVDb250ZW50cygpLnRleHRDb250ZW50KTtcclxuICAgICogY29uc29sZS5sb2coJ0NvbnRlbnQgYWZ0ZXIgY3Vyc29yOicsIHJhbmdlc1sxXS5jbG9uZUNvbnRlbnRzKCkudGV4dENvbnRlbnQpO1xyXG4gICAgKiBcclxuICAgICogQGRlc2NyaXB0aW9uXHJcbiAgICAqIFRoaXMgZnVuY3Rpb24gcmV0cmlldmVzIHRoZSBjdXJyZW50IHNlbGVjdGlvbidzIHJhbmdlIGFuZCBjaGVja3MgaWYgaXQgaW50ZXJzZWN0cyB3aXRoIHRoZSBwcm92aWRlZCByb290Tm9kZS5cclxuICAgICogSWYgc28sIGl0IGNvbnN0cnVjdHMgdHdvIG5ldyByYW5nZXMgdXNpbmcgdGhlIHJvb3ROb2RlIGFzIHRoZSBjb250ZXh0OlxyXG4gICAgKiAtIFRoZSBmaXJzdCByYW5nZSBjYXB0dXJlcyBhbGwgY29udGVudCBmcm9tIHRoZSBzdGFydCBvZiByb290Tm9kZSB1cCB0byB0aGUgY3Vyc29yJ3Mgc3RhcnQuXHJcbiAgICAqIC0gVGhlIHNlY29uZCByYW5nZSBjYXB0dXJlcyBhbGwgY29udGVudCBmcm9tIHRoZSBjdXJzb3IncyBlbmQgdG8gdGhlIGVuZCBvZiByb290Tm9kZSwgb3B0aW9uYWxseSBleHRlbmRpbmcgdG8gdGhlIGxhc3QgY2hpbGQgb2Ygcm9vdE5vZGUgaWYgbmVjZXNzYXJ5LlxyXG4gICAgKiBUaGlzIGlzIHVzZWZ1bCBmb3IgYXBwbGljYXRpb25zIGludm9sdmluZyByaWNoIHRleHQgZWRpdGluZyBvciBhbnkgc2NlbmFyaW8gd2hlcmUgY29udGVudCBuZWVkcyB0byBiZSBzZWdtZW50ZWQgYXJvdW5kIGEgdXNlcidzIHBvaW50IG9mIGZvY3VzLlxyXG4gICAgKi9cclxuICAgIHN0YXRpYyBzcGxpdENvbnRlbnRBdEN1cnNvclNlbGVjdGlvbihyb290Tm9kZTogTm9kZSk6IFJhbmdlW10ge1xyXG4gICAgICAgIGNvbnN0IHJhbmdlczogUmFuZ2VbXSA9IFtdO1xyXG5cclxuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgICAgICAgaWYgKCFzZWxlY3Rpb24gfHwgc2VsZWN0aW9uLnJhbmdlQ291bnQgPT09IDApIHJldHVybiByYW5nZXM7XHJcblxyXG4gICAgICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XHJcblxyXG4gICAgICAgIGNvbnN0IHJhbmdlQmVmb3JlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcclxuICAgICAgICByYW5nZUJlZm9yZS5zZWxlY3ROb2RlQ29udGVudHMocm9vdE5vZGUpO1xyXG4gICAgICAgIHJhbmdlQmVmb3JlLnNldEVuZChyYW5nZS5zdGFydENvbnRhaW5lciwgcmFuZ2Uuc3RhcnRPZmZzZXQpO1xyXG5cclxuICAgICAgICBjb25zdCByYW5nZUFmdGVyID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcclxuICAgICAgICByYW5nZUFmdGVyLnNlbGVjdE5vZGVDb250ZW50cyhyb290Tm9kZSk7XHJcbiAgICAgICAgcmFuZ2VBZnRlci5zZXRTdGFydChyYW5nZS5lbmRDb250YWluZXIsIHJhbmdlLmVuZE9mZnNldCk7XHJcbiAgICAgICAgaWYgKHJvb3ROb2RlLmxhc3RDaGlsZCkge1xyXG4gICAgICAgICAgICByYW5nZUFmdGVyLnNldEVuZEFmdGVyKHJvb3ROb2RlLmxhc3RDaGlsZCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByYW5nZXMucHVzaChyYW5nZUJlZm9yZSk7XHJcbiAgICAgICAgcmFuZ2VzLnB1c2gocmFuZ2VBZnRlcik7XHJcblxyXG4gICAgICAgIHJldHVybiByYW5nZXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAqIFBsYWNlcyB0aGUgY3Vyc29yIGF0IHRoZSBzdGFydCBvZiBhIHNwZWNpZmllZCBlZGl0YWJsZSBIVE1MIGVsZW1lbnQuIFRoaXMgZnVuY3Rpb24gZW5zdXJlcyB0aGF0IGlmIHRoZSBlbGVtZW50IGlzIFxyXG4gICAgKiBjb250ZW50LWVkaXRhYmxlLCB0aGUgY3Vyc29yIGlzIHBvc2l0aW9uZWQgYXQgdGhlIHZlcnkgYmVnaW5uaW5nLiBUaGlzIGlzIGVzcGVjaWFsbHkgdXNlZnVsIGluIHVzZXIgaW50ZXJmYWNlc1xyXG4gICAgKiB3aGVyZSB0ZXh0IGVkaXRpbmcgY2FwYWJpbGl0aWVzIGFyZSBkeW5hbWljYWxseSBlbmFibGVkLCBhbmQgaW1tZWRpYXRlIHVzZXIgaW50ZXJhY3Rpb24gaXMgZXhwZWN0ZWQuXHJcbiAgICAqXHJcbiAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVkaXRhYmxlRWxlbWVudCAtIFRoZSBjb250ZW50LWVkaXRhYmxlIEhUTUwgZWxlbWVudCB3aGVyZSB0aGUgY3Vyc29yIHNob3VsZCBiZSBwbGFjZWQgYXQgdGhlIHN0YXJ0LlxyXG4gICAgKiBAcmV0dXJucyB7dm9pZH0gVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCByZXR1cm4gYSB2YWx1ZTsgaXQgZGlyZWN0bHkgbWFuaXB1bGF0ZXMgdGhlIERPTSBhbmQgc2VsZWN0aW9uIHN0YXRlLlxyXG4gICAgKlxyXG4gICAgKiBAZXhhbXBsZVxyXG4gICAgKiAvLyBBc3N1bWluZyB0aGVyZSBpcyBhIGNvbnRlbnQtZWRpdGFibGUgcGFyYWdyYXBoIGluIHRoZSBkb2N1bWVudDpcclxuICAgICogY29uc3QgZWRpdGFibGVQYXJhZ3JhcGggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdGFibGVQYXJhZ3JhcGgnKTtcclxuICAgICogcGxhY2VDdXJzb3JBdFN0YXJ0T2ZFZGl0YWJsZUVsZW1lbnQoZWRpdGFibGVQYXJhZ3JhcGgpO1xyXG4gICAgKlxyXG4gICAgKiBAZGVzY3JpcHRpb25cclxuICAgICogVGhpcyBmdW5jdGlvbiBmaXJzdCBjaGVja3MgaWYgdGhlIGBlZGl0YWJsZUVsZW1lbnRgIGlzIGNvbnRlbnQtZWRpdGFibGUuIElmIGl0IGlzIG5vdCwgYSB3YXJuaW5nIGlzIGxvZ2dlZCB0byB0aGUgY29uc29sZS5cclxuICAgICogSWYgdGhlIGVsZW1lbnQgaXMgZWRpdGFibGUsIGl0OlxyXG4gICAgKiAxLiBTZXRzIGZvY3VzIG9uIHRoZSBlbGVtZW50IHRvIGVuc3VyZSB0aGF0IGl0IGlzIHJlYWR5IGZvciB1c2VyIGlucHV0LlxyXG4gICAgKiAyLiBDcmVhdGVzIGEgbmV3IFJhbmdlIG9iamVjdCwgc2VsZWN0cyBhbGwgdGhlIGNvbnRlbnRzIG9mIHRoZSBlbGVtZW50LCBhbmQgY29sbGFwc2VzIHRoaXMgcmFuZ2UgdG8gdGhlIHN0YXJ0IG9mIHRoZSBlbGVtZW50LlxyXG4gICAgKiAzLiBDbGVhcnMgYW55IGV4aXN0aW5nIHNlbGVjdGlvbnMgYW5kIGFwcGxpZXMgdGhlIG5ldyByYW5nZSwgZWZmZWN0aXZlbHkgcG9zaXRpb25pbmcgdGhlIGN1cnNvciBhdCB0aGUgc3RhcnQgb2YgdGhlIGVsZW1lbnQuXHJcbiAgICAqIFRoaXMgYXBwcm9hY2ggaXMgY3J1Y2lhbCBmb3IgZWRpdGluZyBpbnRlcmZhY2VzLCBlbnN1cmluZyB0aGF0IHVzZXIgaW50ZXJhY3Rpb24gaXMgaW50dWl0aXZlIGFuZCBpbW1lZGlhdGVseSByZXNwb25zaXZlLlxyXG4gICAgKi9cclxuICAgIHN0YXRpYyBwbGFjZUN1cnNvckF0U3RhcnRPZkVkaXRhYmxlRWxlbWVudChlZGl0YWJsZUVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XHJcbiAgICAgICAgaWYgKGVkaXRhYmxlRWxlbWVudC5pc0NvbnRlbnRFZGl0YWJsZSkge1xyXG4gICAgICAgICAgICBlZGl0YWJsZUVsZW1lbnQuZm9jdXMoKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcclxuICAgICAgICAgICAgcmFuZ2Uuc2VsZWN0Tm9kZUNvbnRlbnRzKGVkaXRhYmxlRWxlbWVudCk7XHJcbiAgICAgICAgICAgIHJhbmdlLmNvbGxhcHNlKHRydWUpO1xyXG5cclxuICAgICAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG4gICAgICAgICAgICBzZWxlY3Rpb24/LnJlbW92ZUFsbFJhbmdlcygpO1xyXG4gICAgICAgICAgICBzZWxlY3Rpb24/LmFkZFJhbmdlKHJhbmdlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXCJUaGUgZWxlbWVudCBpcyBub3QgZWRpdGFibGUuXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICogU2V0cyB0aGUgZm9jdXMgYW5kIGN1cnNvciBwb3NpdGlvbiB0byB0aGUgZW5kIG9mIHRoZSB0ZXh0IHdpdGhpbiBhIHNwZWNpZmllZCBjb250ZW50LWVkaXRhYmxlIEhUTUwgZWxlbWVudC5cclxuICAgICogVGhpcyBtZXRob2QgaXMgc3BlY2lmaWNhbGx5IGRlc2lnbmVkIHRvIGhhbmRsZSBjb250ZW50LWVkaXRhYmxlIGVsZW1lbnRzIGJ5IHBvc2l0aW9uaW5nIHRoZSBjdXJzb3JcclxuICAgICogYXQgdGhlIHZlcnkgZW5kIG9mIHRoZSBlbGVtZW50J3MgY29udGVudCwgcmVnYXJkbGVzcyBvZiB0aGUgY29udGVudCdzIGNvbXBvc2l0aW9uICh0ZXh0LCBlbGVtZW50cywgZXRjLikuXHJcbiAgICAqXHJcbiAgICAqIFRoZSBmdW5jdGlvbiBjaGVja3MgaWYgdGhlIHByb3ZpZGVkIGVsZW1lbnQgaXMgY29udGVudC1lZGl0YWJsZS4gSWYgaXQgaXMsIGl0IHVzZXMgYHJlcXVlc3RBbmltYXRpb25GcmFtZWBcclxuICAgICogdG8gZW5zdXJlIHRoYXQgYWxsIERPTSB1cGRhdGVzIGhhdmUgY29tcGxldGVkIGJlZm9yZSBzZXR0aW5nIGZvY3VzIGFuZCBhZGp1c3RpbmcgdGhlIGN1cnNvciBwb3NpdGlvbi5cclxuICAgICogSXQgdGhlbiBjcmVhdGVzIGEgcmFuZ2Ugc3Bhbm5pbmcgdGhlIGNvbnRlbnQgb2YgdGhlIGVsZW1lbnQsIGZpbmRzIHRoZSBkZWVwZXN0IGxhc3Qgbm9kZSwgYW5kIHNldHMgdGhlXHJcbiAgICAqIGN1cnNvciBwb3NpdGlvbiBhdCB0aGUgZW5kIG9mIHRoaXMgbm9kZS4gVGhpcyBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsIGZvciByaWNoIHRleHQgZWRpdG9ycyBvciBhbnkgYXBwbGljYXRpb25cclxuICAgICogdGhhdCByZXF1aXJlcyBwcmVjaXNlIGNvbnRyb2wgb3ZlciBjdXJzb3IgcGxhY2VtZW50IGluIGVkaXRhYmxlIGNvbnRlbnQuXHJcbiAgICAqXHJcbiAgICAqIElmIHRoZSBlbGVtZW50IGlzIG5vdCBjb250ZW50LWVkaXRhYmxlLCBhIHdhcm5pbmcgaXMgbG9nZ2VkIHRvIHRoZSBjb25zb2xlIGluZGljYXRpbmcgdGhhdCB0aGUgZWxlbWVudCBjYW5ub3QgYmUgZWRpdGVkLlxyXG4gICAgKlxyXG4gICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBjb250ZW50QmxvY2sgLSBUaGUgY29udGVudC1lZGl0YWJsZSBIVE1MIGVsZW1lbnQgd2hlcmUgdGhlIGN1cnNvciB3aWxsIGJlIHBsYWNlZCBhdCB0aGUgZW5kLlxyXG4gICAgKi9cclxuICAgIHN0YXRpYyBwbGFjZUN1cnNvckF0RW5kT2ZFZGl0YWJsZUVsZW1lbnQoY29udGVudEJsb2NrOiBIVE1MRWxlbWVudCkge1xyXG4gICAgICAgIGlmIChjb250ZW50QmxvY2suaXNDb250ZW50RWRpdGFibGUpIHtcclxuICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnRlbnRCbG9jay5mb2N1cygpO1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcclxuXHJcbiAgICAgICAgICAgICAgICByYW5nZS5zZWxlY3ROb2RlQ29udGVudHMoY29udGVudEJsb2NrKTtcclxuXHJcbiAgICAgICAgICAgICAgICBsZXQgbGFzdE5vZGU6IE5vZGUgfCBudWxsID0gY29udGVudEJsb2NrO1xyXG4gICAgICAgICAgICAgICAgd2hpbGUgKGxhc3ROb2RlLmxhc3RDaGlsZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxhc3ROb2RlID0gbGFzdE5vZGUubGFzdENoaWxkO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHJhbmdlLnNldEVuZChsYXN0Tm9kZSwgbGFzdE5vZGUubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFID8gbGFzdE5vZGUudGV4dENvbnRlbnQhLmxlbmd0aCA6IDApO1xyXG4gICAgICAgICAgICAgICAgcmFuZ2UuY29sbGFwc2UoZmFsc2UpO1xyXG5cclxuICAgICAgICAgICAgICAgIHNlbGVjdGlvbj8ucmVtb3ZlQWxsUmFuZ2VzKCk7XHJcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb24/LmFkZFJhbmdlKHJhbmdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc29sZS53YXJuKFwiVGhlIGVsZW1lbnQgaXMgbm90IGVkaXRhYmxlLlwiKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGdldEN1cnJlbnRBY3RpdmVCbG9jaygpOiBFbGVtZW50IHwgbnVsbCB7XHJcblxyXG4gICAgICAgIGxldCBjb250YWluZXIgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xyXG5cclxuICAgICAgICBpZiAoY29udGFpbmVyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBjb250YWluZXIuY2xvc2VzdChcIi5ibG9ja1wiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBpc1NlbGVjdGVkVGV4dERlc2NlbmRhbnRPZihwYXJlbnRTZWxlY3Rvcjogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gZG9jdW1lbnQuZ2V0U2VsZWN0aW9uKCk7XHJcblxyXG4gICAgICAgIGlmICghc2VsZWN0aW9uKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghc2VsZWN0aW9uLnJhbmdlQ291bnQpIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgY29uc3QgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcclxuICAgICAgICBsZXQgZWxlbWVudDogTm9kZSB8IG51bGwgPSByYW5nZS5zdGFydENvbnRhaW5lcjtcclxuXHJcbiAgICAgICAgaWYgKGVsZW1lbnQubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XHJcbiAgICAgICAgICAgIGVsZW1lbnQgPSBlbGVtZW50LnBhcmVudE5vZGU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIWVsZW1lbnQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIChlbGVtZW50IGFzIEVsZW1lbnQpLmNsb3Nlc3QocGFyZW50U2VsZWN0b3IpICE9PSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyByZW1vdmVGaWx0ZXJUZXh0KCk6IG51bWJlciB8IG51bGwge1xyXG4gICAgICAgIGxldCBsYXN0U2xhc2hQb3NpdGlvbjogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG5cclxuICAgICAgICBpZiAoc2VsZWN0aW9uICYmIHNlbGVjdGlvbi5yYW5nZUNvdW50ID4gMCkge1xyXG4gICAgICAgICAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xyXG4gICAgICAgICAgICBjb25zdCBjb250YWluZXIgPSByYW5nZS5jb21tb25BbmNlc3RvckNvbnRhaW5lcjtcclxuXHJcbiAgICAgICAgICAgIGlmIChjb250YWluZXIubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFICYmIGNvbnRhaW5lci5wYXJlbnRFbGVtZW50Py5pc0NvbnRlbnRFZGl0YWJsZSkge1xyXG4gICAgICAgICAgICAgICAgbGV0IG5vZGU6IE5vZGUgfCBudWxsID0gY29udGFpbmVyO1xyXG4gICAgICAgICAgICAgICAgbGV0IG9mZnNldCA9IHJhbmdlLnN0YXJ0T2Zmc2V0O1xyXG5cclxuICAgICAgICAgICAgICAgIHdoaWxlIChub2RlICYmIG9mZnNldCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZXh0QmVmb3JlQ3Vyc29yID0gbm9kZS50ZXh0Q29udGVudD8uc3Vic3RyaW5nKDAsIG9mZnNldCkgfHwgXCJcIjtcclxuICAgICAgICAgICAgICAgICAgICBsYXN0U2xhc2hQb3NpdGlvbiA9IHRleHRCZWZvcmVDdXJzb3IubGFzdEluZGV4T2YoXCIvXCIpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAobGFzdFNsYXNoUG9zaXRpb24gIT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlLnNldFN0YXJ0KG5vZGUsIGxhc3RTbGFzaFBvc2l0aW9uKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UuZGVsZXRlQ29udGVudHMoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gbm9kZS5wYXJlbnROb2RlPy50ZXh0Q29udGVudD8ubGFzdEluZGV4T2YoXCIvXCIpIHx8IC0xO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XHJcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKFwiVGhlIGN1cnNvciBpcyBub3Qgd2l0aGluIGEgY29udGVudEVkaXRhYmxlIGVsZW1lbnQgb3IgYSB0ZXh0IG5vZGUuXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc29sZS53YXJuKFwiTm8gYWN0aXZlIHNlbGVjdGlvbi5cIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbGFzdFNsYXNoUG9zaXRpb247XHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgICBzdGF0aWMgZmluZENsaWNrZWRFbGVtZW50T3JBbmNlc3RvckJ5RGF0YUNvbnRlbnRUeXBlKGV2ZW50OiBNb3VzZUV2ZW50LCBkYXRhQ29udGVudFR5cGU6IHN0cmluZyk6IEhUTUxFbGVtZW50IHwgbnVsbCB7XHJcbiAgICAgICAgbGV0IGNsaWNrZWRFbGVtZW50ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG5cclxuICAgICAgICBpZiAoY2xpY2tlZEVsZW1lbnQubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XHJcbiAgICAgICAgICAgIGNsaWNrZWRFbGVtZW50ID0gY2xpY2tlZEVsZW1lbnQucGFyZW50RWxlbWVudCE7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoY2xpY2tlZEVsZW1lbnQuZGF0YXNldC5jb250ZW50VHlwZSA9PT0gZGF0YUNvbnRlbnRUeXBlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBjbGlja2VkRWxlbWVudDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBjdXJyZW50RWxlbWVudCA9IGNsaWNrZWRFbGVtZW50LnBhcmVudEVsZW1lbnQ7XHJcbiAgICAgICAgd2hpbGUgKGN1cnJlbnRFbGVtZW50KSB7XHJcbiAgICAgICAgICAgIGlmIChjdXJyZW50RWxlbWVudC5kYXRhc2V0LmNvbnRlbnRUeXBlID09PSBkYXRhQ29udGVudFR5cGUpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50RWxlbWVudDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjdXJyZW50RWxlbWVudCA9IGN1cnJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZmluZENsaWNrZWRFbGVtZW50T3JBbmNlc3RvckJ5SWQoZXZlbnQ6IE1vdXNlRXZlbnQsIGlkOiBzdHJpbmcpOiBIVE1MRWxlbWVudCB8IG51bGwge1xyXG4gICAgICAgIGxldCBjbGlja2VkRWxlbWVudCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuXHJcbiAgICAgICAgaWYgKGNsaWNrZWRFbGVtZW50Lm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xyXG4gICAgICAgICAgICBjbGlja2VkRWxlbWVudCA9IGNsaWNrZWRFbGVtZW50LnBhcmVudEVsZW1lbnQhO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGNsaWNrZWRFbGVtZW50LmlkID09PSBpZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gY2xpY2tlZEVsZW1lbnQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgY3VycmVudEVsZW1lbnQgPSBjbGlja2VkRWxlbWVudC5wYXJlbnRFbGVtZW50O1xyXG4gICAgICAgIHdoaWxlIChjdXJyZW50RWxlbWVudCkge1xyXG4gICAgICAgICAgICBpZiAoY3VycmVudEVsZW1lbnQuaWQgPT09IGlkKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudEVsZW1lbnQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY3VycmVudEVsZW1lbnQgPSBjdXJyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGZpbmRDbGlja2VkRWxlbWVudE9yQW5jZXN0b3JCeUNsYXNzKGV2ZW50OiBNb3VzZUV2ZW50LCBjbGFzc0tleTogc3RyaW5nKTogSFRNTEVsZW1lbnQgfCBudWxsIHtcclxuICAgICAgICBsZXQgY2xpY2tlZEVsZW1lbnQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcblxyXG4gICAgICAgIGlmIChjbGlja2VkRWxlbWVudC5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUpIHtcclxuICAgICAgICAgICAgY2xpY2tlZEVsZW1lbnQgPSBjbGlja2VkRWxlbWVudC5wYXJlbnRFbGVtZW50ITtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChjbGlja2VkRWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoY2xhc3NLZXkpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBjbGlja2VkRWxlbWVudDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBjdXJyZW50RWxlbWVudCA9IGNsaWNrZWRFbGVtZW50LnBhcmVudEVsZW1lbnQ7XHJcbiAgICAgICAgd2hpbGUgKGN1cnJlbnRFbGVtZW50KSB7XHJcbiAgICAgICAgICAgIGlmIChjdXJyZW50RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoY2xhc3NLZXkpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudEVsZW1lbnQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY3VycmVudEVsZW1lbnQgPSBjdXJyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG59IiwiaW1wb3J0IHsgQ29sb3JzIH0gZnJvbSBcIkAvY29tbW9uL0NvbG9yc1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIENoYW5nZUNvbG9yIHtcclxuXHJcbiAgICBjb2xvcjogQ29sb3JzO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGNvbG9yOiBDb2xvcnMpIHtcclxuICAgICAgICB0aGlzLmNvbG9yID0gY29sb3I7XHJcbiAgICB9XHJcbn0iLCJleHBvcnQgY2xhc3MgU2hvd0hpZGVBY3RpdmVCdXR0b24ge1xyXG5cclxuICAgIGNsYXNzS2V5OiBcImhpbGl0ZUNvbG9yXCIgfCBcImZvcmVDb2xvclwiIHwgXCJiYWNrZ3JvdW5kQ29sb3JcIjtcclxuICAgIHZhbHVlOiBzdHJpbmc7XHJcbiAgICBpbnRlbnRpb246IFwic2hvd1wiIHwgXCJoaWRlXCI7XHJcblxyXG4gICAgY29uc3RydWN0b3IoY2xhc3NLZXk6IFwiaGlsaXRlQ29sb3JcIiB8IFwiZm9yZUNvbG9yXCIgfCBcImJhY2tncm91bmRDb2xvclwiLCB2YWx1ZTogc3RyaW5nLCBpbnRlbnRpb246IFwic2hvd1wiIHwgXCJoaWRlXCIpIHtcclxuICAgICAgICB0aGlzLmNsYXNzS2V5ID0gY2xhc3NLZXk7XHJcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xyXG4gICAgICAgIHRoaXMuaW50ZW50aW9uID0gaW50ZW50aW9uO1xyXG4gICAgfVxyXG59IiwiZXhwb3J0IGNsYXNzIFJlc2V0QWN0aXZlQnV0dG9ucyB7XHJcblxyXG4gICAgY2xhc3NLZXk6IFwiaGlsaXRlQ29sb3JcIiB8IFwiZm9yZUNvbG9yXCIgfCBcImJhY2tncm91bmRDb2xvclwiO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGNsYXNzS2V5OiBcImhpbGl0ZUNvbG9yXCIgfCBcImZvcmVDb2xvclwiIHwgXCJiYWNrZ3JvdW5kQ29sb3JcIikge1xyXG4gICAgICAgIHRoaXMuY2xhc3NLZXkgPSBjbGFzc0tleTtcclxuICAgIH1cclxufSIsImltcG9ydCB7IElVSUFjdGlvbiB9IGZyb20gXCIuL0lVSUFjdGlvblwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIENsb3NlRWxlbWVudCBpbXBsZW1lbnRzIElVSUFjdGlvbiB7XHJcblxyXG59IiwiaW1wb3J0IHsgSVVJQWN0aW9uIH0gZnJvbSBcIi4vSVVJQWN0aW9uXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgU2hvd0VsZW1lbnQgaW1wbGVtZW50cyBJVUlBY3Rpb24ge1xyXG5cclxufSIsImltcG9ydCB7IENvbG9ycyB9IGZyb20gXCJAL2NvbW1vbi9Db2xvcnNcIjtcclxuaW1wb3J0IHsgVGFibGVTY29wZXMgfSBmcm9tIFwiQC9zZXJ2aWNlcy90YWJsZS1vcGVyYXRpb25zL1RhYmxlU2NvcGVzXCI7XHJcbmltcG9ydCB7IElDb21tYW5kRXZlbnREZXRhaWwgfSBmcm9tIFwiLi9JQ29tbWFuZEV2ZW50RGV0YWlsXCI7XHJcbmltcG9ydCB7IEN1c3RvbUV2ZW50cyB9IGZyb20gXCJAL2NvbW1vbi9DdXN0b21FdmVudHNcIjtcclxuaW1wb3J0IHsgQ29tbWFuZHMgfSBmcm9tIFwiLi9Db21tYW5kc1wiO1xyXG5pbXBvcnQgeyBJVUlFdmVudERldGFpbCB9IGZyb20gXCIuL0lVSUV2ZW50RGV0YWlsXCI7XHJcbmltcG9ydCB7IENoYW5nZUNvbG9yIH0gZnJvbSBcIi4vVUlBY3Rpb25zL0NoYW5nZUNvbG9yXCI7XHJcbmltcG9ydCB7IEN1c3RvbVVJRXZlbnRzIH0gZnJvbSBcIkAvY29tbW9uL0N1c3RvbVVJRXZlbnRzXCI7XHJcbmltcG9ydCB7IFNob3dIaWRlQWN0aXZlQnV0dG9uIH0gZnJvbSBcIi4vVUlBY3Rpb25zL1Nob3dIaWRlQWN0aXZlQnV0dG9uXCI7XHJcbmltcG9ydCB7IFJlc2V0QWN0aXZlQnV0dG9ucyB9IGZyb20gXCIuL1VJQWN0aW9ucy9SZXNldEFjdGl2ZUJ1dHRvbnNcIjtcclxuaW1wb3J0IHsgQ2xvc2VFbGVtZW50IH0gZnJvbSBcIi4vVUlBY3Rpb25zL0Nsb3NlRWxlbWVudFwiO1xyXG5pbXBvcnQgeyBTaG93RWxlbWVudCB9IGZyb20gXCIuL1VJQWN0aW9ucy9TaG93RWxlbWVudFwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIEV2ZW50RW1pdHRlciB7XHJcblxyXG4gICAgc3RhdGljIGVtaXRTaG93RWxlbWVudEV2ZW50KHRhcmdldElkOiBzdHJpbmcpIHtcclxuXHJcbiAgICAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQ8SVVJRXZlbnREZXRhaWw+KEN1c3RvbVVJRXZlbnRzLlNob3dFbGVtZW50LCB7XHJcbiAgICAgICAgICAgIGRldGFpbDoge1xyXG4gICAgICAgICAgICAgICAgdGFyZ2V0SWQ6IHRhcmdldElkLFxyXG4gICAgICAgICAgICAgICAgYWN0aW9uOiBuZXcgU2hvd0VsZW1lbnRcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KGN1c3RvbUV2ZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZW1pdENsb3NlRWxlbWVudEV2ZW50KHRhcmdldElkOiBzdHJpbmcpIHtcclxuXHJcbiAgICAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQ8SVVJRXZlbnREZXRhaWw+KEN1c3RvbVVJRXZlbnRzLkNsb3NlRWxlbWVudCwge1xyXG4gICAgICAgICAgICBkZXRhaWw6IHtcclxuICAgICAgICAgICAgICAgIHRhcmdldElkOiB0YXJnZXRJZCxcclxuICAgICAgICAgICAgICAgIGFjdGlvbjogbmV3IENsb3NlRWxlbWVudFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoY3VzdG9tRXZlbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBlbWl0Q2hhbmdlQ29tcG9uZW50Q29sb3JFdmVudCh0YXJnZXRJZDogc3RyaW5nLCBjb2xvcjogQ29sb3JzKSB7XHJcblxyXG4gICAgICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50PElVSUV2ZW50RGV0YWlsPihDdXN0b21VSUV2ZW50cy5Db2xvckNoYW5nZVJlcXVlc3QsIHtcclxuICAgICAgICAgICAgZGV0YWlsOiB7XHJcbiAgICAgICAgICAgICAgICB0YXJnZXRJZDogdGFyZ2V0SWQsXHJcbiAgICAgICAgICAgICAgICBhY3Rpb246IG5ldyBDaGFuZ2VDb2xvcihjb2xvcilcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KGN1c3RvbUV2ZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZW1pdFNob3dIaWRlQWN0aXZlRWxlbWVudEV2ZW50KHRhcmdldENsYXNzOiBcImhpbGl0ZUNvbG9yXCIgfCBcImZvcmVDb2xvclwiIHwgXCJiYWNrZ3JvdW5kQ29sb3JcIiwgdmFsdWU6IHN0cmluZywgaW50ZW5zaW9uOiBcInNob3dcIiB8IFwiaGlkZVwiKSB7XHJcblxyXG4gICAgICAgIGlmICh0YXJnZXRDbGFzcyA9PSBcImhpbGl0ZUNvbG9yXCIgJiYgdmFsdWUgPT0gQ29sb3JzLkhpbGl0ZUNvbG9yTm9uZSkge1xyXG4gICAgICAgICAgICBpbnRlbnNpb24gPSBcImhpZGVcIjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0YXJnZXRDbGFzcyA9PSBcImZvcmVDb2xvclwiICYmIHZhbHVlID09IENvbG9ycy5Gb3JlQ29sb3JJbml0aWFsKSB7XHJcbiAgICAgICAgICAgIGludGVuc2lvbiA9IFwiaGlkZVwiO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRhcmdldENsYXNzID09IFwiYmFja2dyb3VuZENvbG9yXCIgJiYgdmFsdWUgPT0gQ29sb3JzLkJhY2tncm91bmRDb2xvck5vbmUpIHtcclxuICAgICAgICAgICAgaW50ZW5zaW9uID0gXCJoaWRlXCI7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBjdXN0b21FdmVudCA9IG5ldyBDdXN0b21FdmVudDxJVUlFdmVudERldGFpbD4oQ3VzdG9tVUlFdmVudHMuU2hvd0hpZGVBY3RpdmVCdXR0b24sIHtcclxuXHJcbiAgICAgICAgICAgIGRldGFpbDoge1xyXG4gICAgICAgICAgICAgICAgdGFyZ2V0Q2xhc3M6IHRhcmdldENsYXNzLFxyXG4gICAgICAgICAgICAgICAgYWN0aW9uOiBuZXcgU2hvd0hpZGVBY3RpdmVCdXR0b24odGFyZ2V0Q2xhc3MsIHZhbHVlLCBpbnRlbnNpb24pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChjdXN0b21FdmVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGVtaXRSZXNldEFjdGl2ZUJ1dHRvbnNFbGVtZW50RXZlbnQodGFyZ2V0Q2xhc3M6IFwiaGlsaXRlQ29sb3JcIiB8IFwiZm9yZUNvbG9yXCIgfCBcImJhY2tncm91bmRDb2xvclwiKSB7XHJcblxyXG4gICAgICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50PElVSUV2ZW50RGV0YWlsPihDdXN0b21VSUV2ZW50cy5SZXNldEFjdGl2ZUJ1dHRvbnMsIHtcclxuXHJcbiAgICAgICAgICAgIGRldGFpbDoge1xyXG4gICAgICAgICAgICAgICAgdGFyZ2V0Q2xhc3M6IHRhcmdldENsYXNzLFxyXG4gICAgICAgICAgICAgICAgYWN0aW9uOiBuZXcgUmVzZXRBY3RpdmVCdXR0b25zKHRhcmdldENsYXNzKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoY3VzdG9tRXZlbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vVE9ETzogcmV3cml0ZSB0aGlzIGRvY1xyXG4gICAgLyoqXHJcbiAgICAqIEVtaXRzIGEgY3VzdG9tIGV2ZW50IHdpdGggdGhlIGN1cnJlbnQgZm9ybWF0dGluZyBzdGF0ZXMgaWYgdGhlcmUgaXMgYW4gYWN0aXZlIHRleHQgc2VsZWN0aW9uLlxyXG4gICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGNydWNpYWwgaW4gYSB0ZXh0IGVkaXRpbmcgZW52aXJvbm1lbnQgd2hlcmUgbXVsdGlwbGUgY29tcG9uZW50cyBtaWdodCBuZWVkIHRvXHJcbiAgICAqIHVwZGF0ZSB0aGVpciBzdGF0ZSBiYXNlZCBvbiBjaGFuZ2VzIGluIHRleHQgZm9ybWF0dGluZy4gVGhlIGVtaXR0ZWQgZXZlbnQgKGBDdXN0b21FdmVudHMudGV4dEZvcm1hdENoYW5nZWRgKVxyXG4gICAgKiBjYXJyaWVzIGZvcm1hdHRpbmcgc3RhdGUgZGF0YSwgd2hpY2ggY29tcG9uZW50cyBjYW4gdXNlIHRvIHN5bmNocm9uaXplIHRoZWlyIFVJIGVsZW1lbnRzIHdpdGggdGhlXHJcbiAgICAqIGN1cnJlbnQgdGV4dCBmb3JtYXR0aW5nIChlLmcuLCB1cGRhdGluZyBidXR0b24gc3RhdGVzLCBkaXNwbGF5aW5nIGFjdGl2ZSBmb3JtYXR0aW5nIG9wdGlvbnMpLlxyXG4gICAgKlxyXG4gICAgKiBUaGlzIGZ1bmN0aW9uIGZpcnN0IGNoZWNrcyBmb3IgYW4gYWN0aXZlIGFuZCBub24tZW1wdHkgdGV4dCBzZWxlY3Rpb24uXHJcbiAgICAqIElmIHRoZSBzZWxlY3Rpb24gaXMgZW1wdHksIHRoZSBmdW5jdGlvbiBleGl0cyBlYXJseSB0byBhdm9pZCBwcm9jZXNzaW5nIHVubmVjZXNzYXJ5IGV2ZW50cyxcclxuICAgICogZXNwZWNpYWxseSB0byBtaXRpZ2F0ZSBpc3N1ZXMgaW4gYnJvd3NlcnMgbGlrZSBGaXJlZm94IHdoZXJlIGBzZWxlY3Rpb25jaGFuZ2VgIG1pZ2h0IGZpcmUgZHVyaW5nIHR5cGluZ1xyXG4gICAgKiB3aXRob3V0IGFuIGFjdHVhbCBjaGFuZ2UgaW4gc2VsZWN0aW9uLlxyXG4gICAgKlxyXG4gICAgKiBAcHJpdmF0ZVxyXG4gICAgKiBAcmV0dXJucyB7dm9pZH0gTm8gcmV0dXJuIHZhbHVlIGFzIHRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gZW1pdCBldmVudHMgYmFzZWQgb24gdGhlIGZvcm1hdHRpbmcgc3RhdGUuXHJcbiAgICAqXHJcbiAgICAqIEBleGFtcGxlXHJcbiAgICAqIC8vIFRvIGludm9rZSB0aGlzIGZ1bmN0aW9uIHdpdGhpbiBhIGNsYXNzIHRoYXQgaGFuZGxlcyB0ZXh0IGZvcm1hdHRpbmc6XHJcbiAgICAqIHRoaXMuZW1pdEZvcm1hdENoYW5nZUV2ZW50cygpO1xyXG4gICAgKlxyXG4gICAgKiBAZGVzY3JpcHRpb25cclxuICAgICogSGVyZSdzIGhvdyB0aGUgZnVuY3Rpb24gd29ya3M6XHJcbiAgICAqIDEuIENoZWNrcyBmb3IgYW4gYWN0aXZlIGFuZCBub24tZW1wdHkgdGV4dCBzZWxlY3Rpb24uIElmIGVtcHR5LCByZXR1cm5zIGVhcmx5LlxyXG4gICAgKiAyLiBHYXRoZXJzIGN1cnJlbnQgc3RhdGUgb2YgdGV4dCBmb3JtYXR0aW5nIGNvbW1hbmRzIHN1Y2ggYXMgJ2JvbGQnLCAnaXRhbGljJywgJ3VuZGVybGluZScsIGFuZCAnc3RyaWtlVGhyb3VnaCcsXHJcbiAgICAqICAgIGFuZCBkeW5hbWljYWxseSBjb2xsZWN0cyB0aGUgc3RhdGUgb2YgdmFyaW91cyBoaWdobGlnaHQgY29sb3JzIHVzaW5nIGEgc2VydmljZS5cclxuICAgICogMy4gRGlzcGF0Y2hlcyBhIGN1c3RvbSBldmVudCAoYEN1c3RvbUV2ZW50cy50ZXh0Rm9ybWF0Q2hhbmdlZGApIHdpdGggdGhlc2UgZm9ybWF0dGluZyBzdGF0ZXMuXHJcbiAgICAqICAgIENvbXBvbmVudHMgdGhyb3VnaG91dCB0aGUgYXBwbGljYXRpb24gbGlzdGVuIHRvIHRoaXMgZXZlbnQgYW5kIHVwZGF0ZSB0aGVpciBzdGF0ZXMgYWNjb3JkaW5nbHksXHJcbiAgICAqICAgIGVuc3VyaW5nIHRoYXQgVUkgY29udHJvbHMgbGlrZSB0b29sYmFyIGJ1dHRvbnMgcmVmbGVjdCB0aGUgY3VycmVudCBmb3JtYXR0aW5nIG9mIHRoZSBzZWxlY3RlZCB0ZXh0LlxyXG4gICAgKi9cclxuICAgIC8vIHN0YXRpYyBlbWl0Rm9ybWF0Q2hhbmdlRXZlbnQgPSAoXHJcblxyXG4gICAgLy8gICAgIGJvbGQ6IGJvb2xlYW4sXHJcbiAgICAvLyAgICAgaXRhbGljOiBib29sZWFuLFxyXG4gICAgLy8gICAgIHVuZGVybGluZTogYm9vbGVhbixcclxuICAgIC8vICAgICBzdHJpa2VUaHJvdWdoOiBib29sZWFuLFxyXG4gICAgLy8gICAgIGhpbGl0ZUNvbG9yOiB7IFtrZXk6IHN0cmluZ10gOiBib29sZWFuIH0sIFxyXG4gICAgLy8gICAgIGZvcmVDb2xvcjogeyBba2V5OiBzdHJpbmddIDogYm9vbGVhbn0pOiB2b2lkID0+IHtcclxuXHJcbiAgICAvLyAgICAgLy8gVGhpcyBibG9jayBjaGVja3MgZm9yIGFuIGFjdGl2ZSBzZWxlY3Rpb24gYW5kIHdoZXRoZXIgaXQgY29udGFpbnMgYW55IGNvbnRlbnQuXHJcbiAgICAvLyAgICAgLy8gSW4gRmlyZWZveCwgdGhlIGBzZWxlY3Rpb25jaGFuZ2VgIGV2ZW50IG1heSBiZSBmaXJlZCBldmVuIHdoaWxlIHR5cGluZyxcclxuICAgIC8vICAgICAvLyB3aGljaCBpcyBub3QgdGhlIGludGVuZGVkIHRyaWdnZXIgc2luY2Ugd2Ugb25seSB3YW50IHRvIHJlYWN0IHRvIGFjdHVhbCBjaGFuZ2VzIGluIHNlbGVjdGlvbi5cclxuICAgIC8vICAgICAvLyBJZiB0aGUgc2VsZWN0aW9uIGlzIGVtcHR5IG9yIG51bGwsIHRoZSBmdW5jdGlvbiByZXR1cm5zIGVhcmx5LCBlZmZlY3RpdmVseSBpZ25vcmluZ1xyXG4gICAgLy8gICAgIC8vIHRoZXNlIHVud2FudGVkIGBzZWxlY3Rpb25jaGFuZ2VgIGV2ZW50cyBkdXJpbmcgdHlwaW5nLlxyXG4gICAgLy8gICAgIGNvbnN0IHNlbGVjdGlvbiA9IGRvY3VtZW50LmdldFNlbGVjdGlvbigpO1xyXG4gICAgLy8gICAgIGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbj8udG9TdHJpbmcoKS50cmltKCkgPT09ICcnKSB7XHJcbiAgICAvLyAgICAgICAgIHJldHVybjtcclxuICAgIC8vICAgICB9XHJcblxyXG4gICAgLy8gICAgIGNvbnN0IGNvbW1hbmRTdGF0ZXM6IElGb3JtYXRDb21tYW5kID0ge1xyXG4gICAgLy8gICAgICAgICBib2xkOiBib2xkLFxyXG4gICAgLy8gICAgICAgICBpdGFsaWM6IGl0YWxpYyxcclxuICAgIC8vICAgICAgICAgdW5kZXJsaW5lOiB1bmRlcmxpbmUsXHJcbiAgICAvLyAgICAgICAgIHN0cmlrZVRocm91Z2g6IHN0cmlrZVRocm91Z2gsXHJcbiAgICAvLyAgICAgICAgIGhpbGl0ZUNvbG9yOiBoaWxpdGVDb2xvcixcclxuICAgIC8vICAgICAgICAgZm9yZUNvbG9yOiBmb3JlQ29sb3IsXHJcbiAgICAvLyAgICAgICAgIGNlbGxIaWxpdGVDb2xvcjoge31cclxuICAgIC8vICAgICB9O1xyXG5cclxuICAgIC8vICAgICBjb25zdCBjdXN0b21FdmVudCA9IG5ldyBDdXN0b21FdmVudDxJRm9ybWF0Q29tbWFuZD4oQ3VzdG9tRXZlbnRzLnRleHRGb3JtYXRDaGFuZ2VkLCB7XHJcbiAgICAvLyAgICAgICAgIGRldGFpbDogY29tbWFuZFN0YXRlc1xyXG4gICAgLy8gICAgIH0pO1xyXG5cclxuICAgIC8vICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KGN1c3RvbUV2ZW50KTtcclxuICAgIC8vIH1cclxuXHJcbiAgICBzdGF0aWMgZW1pdENoYW5nZVRhYmxlQm9yZGVyQ29sb3JFdmVudChzY29wZTogVGFibGVTY29wZXMsIGNvbG9yOiBDb2xvcnMpOiB2b2lkIHtcclxuXHJcbiAgICAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQ8SUNvbW1hbmRFdmVudERldGFpbD4oQ3VzdG9tRXZlbnRzLmVtaXR0ZWRDb21tYW5kLCB7XHJcbiAgICAgICAgICAgIGRldGFpbDoge1xyXG4gICAgICAgICAgICAgICAgY29tbWFuZDogQ29tbWFuZHMuY2hhbmdlVGFibGVCb3JkZXJDb2xvcixcclxuICAgICAgICAgICAgICAgIHZhbHVlOiBjb2xvcixcclxuICAgICAgICAgICAgICAgIHNjb3BlOiBzY29wZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoY3VzdG9tRXZlbnQpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvLyBzdGF0aWMgZW1pdENlbGxDaGFuZ2VFdmVudCA9IChjZWxsOiBIVE1MVGFibGVDZWxsRWxlbWVudCk6IHZvaWQgPT4ge1xyXG5cclxuICAgIC8vICAgICBjb25zdCBjZWxsSGlsaXRlQ29sb3I6IHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9ID0ge307XHJcblxyXG4gICAgLy8gICAgIGNlbGxIaWxpdGVDb2xvcltDb2xvcnMuSGlsaXRlQ29sb3JSZWRdID0gVGFibGVVdGlscy5pc0NlbGxCYWNrZ3JvdW5kQ29sb3IoY2VsbCwgQ29sb3JzLkhpbGl0ZUNvbG9yUmVkKTtcclxuICAgIC8vICAgICBjZWxsSGlsaXRlQ29sb3JbQ29sb3JzLkhpbGl0ZUNvbG9yR3JlZW5dID0gVGFibGVVdGlscy5pc0NlbGxCYWNrZ3JvdW5kQ29sb3IoY2VsbCwgQ29sb3JzLkhpbGl0ZUNvbG9yR3JlZW4pO1xyXG4gICAgLy8gICAgIGNlbGxIaWxpdGVDb2xvcltDb2xvcnMuSGlsaXRlQ29sb3JCbHVlXSA9IFRhYmxlVXRpbHMuaXNDZWxsQmFja2dyb3VuZENvbG9yKGNlbGwsIENvbG9ycy5IaWxpdGVDb2xvckJsdWUpO1xyXG4gICAgLy8gICAgIGNlbGxIaWxpdGVDb2xvcltDb2xvcnMuSGlsaXRlQ29sb3JZZWxsb3ddID0gVGFibGVVdGlscy5pc0NlbGxCYWNrZ3JvdW5kQ29sb3IoY2VsbCwgQ29sb3JzLkhpbGl0ZUNvbG9yWWVsbG93KTtcclxuICAgIC8vICAgICBjZWxsSGlsaXRlQ29sb3JbQ29sb3JzLkhpbGl0ZUNvbG9yR3JleV0gPSBUYWJsZVV0aWxzLmlzQ2VsbEJhY2tncm91bmRDb2xvcihjZWxsLCBDb2xvcnMuSGlsaXRlQ29sb3JHcmV5KTtcclxuXHJcbiAgICAvLyAgICAgY29uc3QgY29tbWFuZFN0YXRlczogSUZvcm1hdENvbW1hbmQgPSB7XHJcbiAgICAvLyAgICAgICAgIGJvbGQ6IGZhbHNlLFxyXG4gICAgLy8gICAgICAgICBpdGFsaWM6IGZhbHNlLFxyXG4gICAgLy8gICAgICAgICB1bmRlcmxpbmU6IGZhbHNlLFxyXG4gICAgLy8gICAgICAgICBzdHJpa2VUaHJvdWdoOiBmYWxzZSxcclxuICAgIC8vICAgICAgICAgaGlsaXRlQ29sb3I6IHt9LFxyXG4gICAgLy8gICAgICAgICBmb3JlQ29sb3I6IHt9LFxyXG4gICAgLy8gICAgICAgICBjZWxsSGlsaXRlQ29sb3I6IGNlbGxIaWxpdGVDb2xvclxyXG4gICAgLy8gICAgIH07XHJcblxyXG4gICAgLy8gICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50PElGb3JtYXRDb21tYW5kPihDdXN0b21FdmVudHMudGV4dEZvcm1hdENoYW5nZWQsIHtcclxuICAgIC8vICAgICAgICAgZGV0YWlsOiBjb21tYW5kU3RhdGVzXHJcbiAgICAvLyAgICAgfSk7XHJcblxyXG4gICAgLy8gICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoY3VzdG9tRXZlbnQpO1xyXG4gICAgLy8gfVxyXG5cclxufSIsImltcG9ydCB7IElCbG9ja09wZXJhdGlvbnNTZXJ2aWNlIH0gZnJvbSBcIi4vSUJsb2NrT3BlcmF0aW9uc1NlcnZpY2VcIjtcbmltcG9ydCB7IElFbGVtZW50RmFjdG9yeVNlcnZpY2UgfSBmcm9tIFwiLi4vZWxlbWVudC1mYWN0b3J5L0lFbGVtZW50RmFjdG9yeVNlcnZpY2VcIjtcbmltcG9ydCB7IEVsZW1lbnRGYWN0b3J5U2VydmljZSB9IGZyb20gXCIuLi9lbGVtZW50LWZhY3RvcnkvRWxlbWVudEZhY3RvcnlTZXJ2aWNlXCI7XG5pbXBvcnQgeyBDb250ZW50VHlwZXMgfSBmcm9tIFwiQC9jb21tb24vQ29udGVudFR5cGVzXCI7XG5pbXBvcnQgeyBET01VdGlscyB9IGZyb20gXCJAL3V0aWxpdGllcy9ET01VdGlsc1wiO1xuaW1wb3J0IHsgQ3VzdG9tRXZlbnRzIH0gZnJvbSBcIkAvY29tbW9uL0N1c3RvbUV2ZW50c1wiO1xuaW1wb3J0IHsgRGVwZW5kZW5jeUNvbnRhaW5lciB9IGZyb20gXCJAL2NvcmUvRGVwZW5kZW5jeUNvbnRhaW5lclwiO1xuaW1wb3J0IHsgSUZvY3VzU3RhY2sgfSBmcm9tIFwiQC9jb3JlL0lGb2N1c1N0YWNrXCI7XG5pbXBvcnQgeyBJTWVtZW50byB9IGZyb20gXCJAL2NvcmUvSU1lbWVudG9cIjtcbmltcG9ydCB7IFV0aWxzIH0gZnJvbSBcIkAvdXRpbGl0aWVzL1V0aWxzXCI7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tIFwiQC9jb21tYW5kcy9FdmVudEVtaXR0ZXJcIjtcblxuZXhwb3J0IGNsYXNzIEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UgaW1wbGVtZW50cyBJQmxvY2tPcGVyYXRpb25zU2VydmljZSB7XG5cbiAgICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZTogQmxvY2tPcGVyYXRpb25zU2VydmljZTtcblxuICAgIHByaXZhdGUgZWxlbWVudEZhY3RvcnlTZXJ2aWNlOiBJRWxlbWVudEZhY3RvcnlTZXJ2aWNlO1xuICAgIHByaXZhdGUgbWVtZW50bzogSU1lbWVudG87XG4gICAgcHJpdmF0ZSBmb2N1c1N0YWNrOiBJRm9jdXNTdGFjaztcblxuICAgIHN0YXRpYyBCTE9DS19PUEVSQVRJT05TID0ge1xuICAgICAgICBUVVJOX0lOVE86IFwidHVybkludG9cIixcbiAgICAgICAgQ1JFQVRFX0RFRkFVTFRfQkxPQ0s6IFwiQ3JlYXRlRGVmYXVsdEJsb2NrXCIsXG4gICAgICAgIERFTEVURV9GT0NVU19PTl9QUkVWSU9VUzogXCJEZWxldGVBbmRGb2N1c09uUHJldmlvdXNcIixcbiAgICAgICAgREVMRVRFX0ZPQ1VTX09OX05FWFQ6IFwiRGVsZXRlQW5kRm9jdXNPbk5leHRcIixcbiAgICAgICAgRk9DVVNfT05fRklSU1Q6IFwiRm9jdXNPbkZpcnN0XCIsXG4gICAgICAgIEZPQ1VTX09OX1BSRVZJT1VTOiBcIkZvY3VzT25QcmV2aW91c1wiLFxuICAgICAgICBGT0NVU19PTl9ORVhUOiBcIkZvY3VzT25OZXh0XCIsXG4gICAgICAgIERFTEVURTogXCJkZWxldGVcIixcbiAgICAgICAgRFVQTElDQVRFOiBcImR1cGxpY2F0ZVwiLFxuICAgICAgICBDT1BZOiBcImNvcHlcIixcbiAgICAgICAgUEFTVEU6IFwicGF0ZXNcIixcbiAgICAgICAgQ1VUOiBcImN1dFwiLFxuICAgICAgICBSRU1PVkVfRk9STUFUOiBcInJlbW92ZUZvcm1hdFwiLFxuICAgICAgICBUUkFOU0ZPUk1fQkxPQ0s6IFwidHJhbnNmb3JtQmxvY2tcIlxuICAgIH07XG5cbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKFxuICAgICAgICBlbGVtZW50RmFjdG9yeVNlcnZpY2U6IElFbGVtZW50RmFjdG9yeVNlcnZpY2UsXG4gICAgICAgIGZvY3VzU3RhY2s6IElGb2N1c1N0YWNrLFxuICAgICAgICBtZW1lbnRvOiBJTWVtZW50bykge1xuXG4gICAgICAgIGlmIChCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLmluc3RhbmNlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVc2UgQmxvY2tPcGVyYXRpb25zU2VydmljZS5nZXRJbnN0YW5jZSgpIHRvIGdldCBpbnN0YW5jZS5cIik7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmVsZW1lbnRGYWN0b3J5U2VydmljZSA9IGVsZW1lbnRGYWN0b3J5U2VydmljZTtcbiAgICAgICAgdGhpcy5mb2N1c1N0YWNrID0gZm9jdXNTdGFjaztcbiAgICAgICAgdGhpcy5tZW1lbnRvID0gbWVtZW50bztcblxuICAgICAgICBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLmluc3RhbmNlID0gdGhpcztcbiAgICB9XG5cbiAgICBleGVjQ29tbWFuZChjb21tYW5kOiBzdHJpbmcsIHNob3dVSTogYm9vbGVhbiwgdmFsdWU6IHN0cmluZyB8IG51bGwgPSBudWxsKTogYm9vbGVhbiB7XG5cbiAgICAgICAgaWYgKGNvbW1hbmQgPT0gQmxvY2tPcGVyYXRpb25zU2VydmljZS5CTE9DS19PUEVSQVRJT05TLkNPUFkpIHtcblxuICAgICAgICAgICAgaWYgKGRvY3VtZW50LmdldFNlbGVjdGlvbiAmJiBuYXZpZ2F0b3IuY2xpcGJvYXJkICYmIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gZG9jdW1lbnQuZ2V0U2VsZWN0aW9uKCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0aW9uICYmIHNlbGVjdGlvbi50b1N0cmluZygpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRUZXh0ID0gc2VsZWN0aW9uLnRvU3RyaW5nKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQoc2VsZWN0ZWRUZXh0KS50aGVuKCgpID0+IHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29waWVkRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoJ2NvcGllZFRleHQnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxhYmxlOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChjb3BpZWRFdmVudCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKChlcnI6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3Igd2hlbiBjb3B5IHRleHQnLCBlcnIpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb21tYW5kID09IEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuQkxPQ0tfT1BFUkFUSU9OUy5DVVQpIHtcblxuICAgICAgICAgICAgaWYgKGRvY3VtZW50LmdldFNlbGVjdGlvbiAmJiBuYXZpZ2F0b3IuY2xpcGJvYXJkICYmIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gZG9jdW1lbnQuZ2V0U2VsZWN0aW9uKCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0aW9uICYmIHNlbGVjdGlvbi50b1N0cmluZygpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRUZXh0ID0gc2VsZWN0aW9uLnRvU3RyaW5nKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uLmRlbGV0ZUZyb21Eb2N1bWVudCgpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnN0IGhpZGVFdmVudCA9IG5ldyBDdXN0b21FdmVudCggJ3JlcXVlc3RIaWRlRmxvYXRpbmdUb29sYmFyJywge1xuICAgICAgICAgICAgICAgICAgICAvLyAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIGNhbmNlbGFibGU6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgLy8gfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChoaWRlRXZlbnQpO1xuXG4gICAgICAgICAgICAgICAgICAgIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KHNlbGVjdGVkVGV4dCkudGhlbigoKSA9PiB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKChlcnI6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3Igd2hlbiBjdXQgdGV4dDogJywgZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29tbWFuZCA9PSBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLkJMT0NLX09QRVJBVElPTlMuUEFTVEUpIHtcbiAgICAgICAgICAgIGlmIChuYXZpZ2F0b3IuY2xpcGJvYXJkICYmIG5hdmlnYXRvci5jbGlwYm9hcmQucmVhZFRleHQpIHtcbiAgICAgICAgICAgICAgICBuYXZpZ2F0b3IuY2xpcGJvYXJkLnJlYWRUZXh0KCkudGhlbigocGFzdGVkVGV4dDogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IGRvY3VtZW50LmdldFNlbGVjdGlvbigpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rpb24gJiYgc2VsZWN0aW9uLnJhbmdlQ291bnQgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UuZGVsZXRlQ29udGVudHMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlLmluc2VydE5vZGUoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUocGFzdGVkVGV4dCkpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3Rpb25FdmVudCA9IG5ldyBDdXN0b21FdmVudCgncmVxdWVzdFVwZGF0ZUZsb2F0aW5nVG9vbGJhcicsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbmNlbGFibGU6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHNlbGVjdGlvbkV2ZW50KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdObyB0ZXh0IHNlbGVjdGVkIG9yIGNsaXBib2FyZCBlbXB0eS4nKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pLmNhdGNoKChlcnI6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciB3aGVuIHBhc3RpbmcgdGV4dDogJywgZXJyKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbW1hbmQgPT0gQmxvY2tPcGVyYXRpb25zU2VydmljZS5CTE9DS19PUEVSQVRJT05TLlRSQU5TRk9STV9CTE9DSykge1xuXG4gICAgICAgICAgICBjb25zdCBibG9jayA9IHRoaXMuZ2V0Q3VycmVudFNlbGVjdGVkQmxvY2soKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgIGlmIChibG9jayAmJiB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMudHJhbnNmb3JtQmxvY2sodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbW1hbmQgPT0gQmxvY2tPcGVyYXRpb25zU2VydmljZS5CTE9DS19PUEVSQVRJT05TLlJFTU9WRV9GT1JNQVQpIHtcbiAgICAgICAgICAgIHJldHVybiBkb2N1bWVudC5leGVjQ29tbWFuZChCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLkJMT0NLX09QRVJBVElPTlMuUkVNT1ZFX0ZPUk1BVCwgZmFsc2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbW1hbmQgPT0gQmxvY2tPcGVyYXRpb25zU2VydmljZS5CTE9DS19PUEVSQVRJT05TLkRFTEVURSkge1xuXG4gICAgICAgICAgICB0aGlzLmRlbGV0ZUFuZEZvY3VzT25OZXh0KCk7XG5cbiAgICAgICAgICAgIGNvbnN0IGhpZGVFdmVudCA9IG5ldyBDdXN0b21FdmVudChDdXN0b21FdmVudHMuYmxvY2tEZWxldGVkLCB7XG4gICAgICAgICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICAgICAgICBjYW5jZWxhYmxlOiB0cnVlXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChoaWRlRXZlbnQpO1xuXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb21tYW5kID09IEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuQkxPQ0tfT1BFUkFUSU9OUy5EVVBMSUNBVEUpIHtcblxuICAgICAgICAgICAgdGhpcy5kdXBsaWNhdGVTZWxlY3RlZEJsb2NrKCk7XG5cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbW1hbmQgPT0gQmxvY2tPcGVyYXRpb25zU2VydmljZS5CTE9DS19PUEVSQVRJT05TLkNSRUFURV9ERUZBVUxUX0JMT0NLKSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCB8fCBudWxsO1xuXG4gICAgICAgICAgICB0aGlzLmNyZWF0ZURlZmF1bHRCbG9jayhlbGVtZW50KTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbW1hbmQgPT0gQmxvY2tPcGVyYXRpb25zU2VydmljZS5CTE9DS19PUEVSQVRJT05TLkZPQ1VTX09OX0ZJUlNUKSB7XG5cbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiLmZvY3VzYWJsZVwiKTtcblxuICAgICAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAoZWxlbWVudCBhcyBIVE1MRWxlbWVudCkuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbW1hbmQgPT0gQmxvY2tPcGVyYXRpb25zU2VydmljZS5CTE9DS19PUEVSQVRJT05TLkRFTEVURV9GT0NVU19PTl9QUkVWSU9VUykge1xuICAgICAgICAgICAgdGhpcy5kZWxldGVBbmRGb2N1c09uUHJldmlvdXMoKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbW1hbmQgPT0gQmxvY2tPcGVyYXRpb25zU2VydmljZS5CTE9DS19PUEVSQVRJT05TLkRFTEVURV9GT0NVU19PTl9ORVhUKSB7XG4gICAgICAgICAgICB0aGlzLmRlbGV0ZUFuZEZvY3VzT25OZXh0KCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb21tYW5kID09IEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuQkxPQ0tfT1BFUkFUSU9OUy5GT0NVU19PTl9QUkVWSU9VUykge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG5cbiAgICAgICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5mb2N1c09uUHJldmlvdXMoZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29tbWFuZCA9PSBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLkJMT0NLX09QRVJBVElPTlMuRk9DVVNfT05fTkVYVCkge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG5cbiAgICAgICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5mb2N1c09uTmV4dChlbGVtZW50KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGlmIChjb21tYW5kID09IEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuQkxPQ0tfT1BFUkFUSU9OUy5UVVJOX0lOVE8pIHtcblxuICAgICAgICAvLyAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICAvLyAgICAgICAgIHRocm93IG5ldyBFcnJvcigpO1xuICAgICAgICAvLyAgICAgfVxuXG4gICAgICAgIC8vICAgICBjb25zdCBlbGVtZW50ID0gQmxvY2tPcGVyYXRpb25zU2VydmljZS5nZXREcmFnZ2FibGVFbGVtZW50RnJvbVNlbGVjdGlvbigpO1xuXG4gICAgICAgIC8vICAgICB0aGlzLmZvcm1hdEJsb2NrKGVsZW1lbnQsIHZhbHVlKTtcbiAgICAgICAgLy8gfVxuXG4gICAgICAgIC8vIGNvbnN0IHNlbGVjdGlvbkV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KCdyZXF1ZXN0SGlkZUZsb2F0aW5nVG9vbGJhcicsIHtcbiAgICAgICAgLy8gICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIC8vICAgICBjYW5jZWxhYmxlOiB0cnVlXG4gICAgICAgIC8vIH0pO1xuXG4gICAgICAgIC8vIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoc2VsZWN0aW9uRXZlbnQpO1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHF1ZXJ5Q29tbWFuZFN0YXRlKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNZXRob2Qgbm90IGltcGxlbWVudGVkLlwiKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0SW5zdGFuY2UoKTogQmxvY2tPcGVyYXRpb25zU2VydmljZSB7XG5cbiAgICAgICAgY29uc3QgZWxlbWVudEZhY3RvcnlTZXJ2aWNlID0gRGVwZW5kZW5jeUNvbnRhaW5lci5JbnN0YW5jZS5yZXNvbHZlPElFbGVtZW50RmFjdG9yeVNlcnZpY2U+KFwiSUVsZW1lbnRGYWN0b3J5U2VydmljZVwiKTtcbiAgICAgICAgY29uc3QgZm9jdXNTdGFjayA9IERlcGVuZGVuY3lDb250YWluZXIuSW5zdGFuY2UucmVzb2x2ZTxJRm9jdXNTdGFjaz4oXCJJRm9jdXNTdGFja1wiKTtcbiAgICAgICAgY29uc3QgbWVtZW50byA9IERlcGVuZGVuY3lDb250YWluZXIuSW5zdGFuY2UucmVzb2x2ZTxJTWVtZW50bz4oXCJJTWVtZW50b1wiKTtcblxuICAgICAgICBpZiAoIXRoaXMuaW5zdGFuY2UpIHtcbiAgICAgICAgICAgIHRoaXMuaW5zdGFuY2UgPSBuZXcgQmxvY2tPcGVyYXRpb25zU2VydmljZShlbGVtZW50RmFjdG9yeVNlcnZpY2UsIGZvY3VzU3RhY2ssIG1lbWVudG8pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaW5zdGFuY2U7XG4gICAgfVxuXG4gICAgc3RhdGljIGdldERyYWdnYWJsZUVsZW1lbnRGcm9tU2VsZWN0aW9uKCk6IEhUTUxFbGVtZW50IHtcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuXG4gICAgICAgIGlmIChzZWxlY3Rpb24gJiYgc2VsZWN0aW9uLnJhbmdlQ291bnQgPiAwKSB7XG4gICAgICAgICAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xuICAgICAgICAgICAgbGV0IGVsZW1lbnQ6IE5vZGUgfCBudWxsID0gcmFuZ2UuY29tbW9uQW5jZXN0b3JDb250YWluZXI7XG5cbiAgICAgICAgICAgIGlmIChlbGVtZW50Lm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBlbGVtZW50LnBhcmVudE5vZGUgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHdoaWxlIChlbGVtZW50ICYmICEoZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSkge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBlbGVtZW50LnBhcmVudE5vZGUgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRyYWdnYWJsZSA9IGVsZW1lbnQuY2xvc2VzdCgnLmJsb2NrJykgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRyYWdnYWJsZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJldG9ybmFyIG51bGwgc2UgbmVuaHVtYSBzZWxlw6fDo28gdsOhbGlkYSBmb3IgZW5jb250cmFkYSBvdSBuZW5odW0gZWxlbWVudG8gY29ycmVzcG9uZGVudGVcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCk7XG4gICAgfVxuXG4gICAgLy8gc3RhdGljIGdldFRhZ05hbWVCeUNvbW1hbmROYW1lKGNvbW1hbmROYW1lOiBzdHJpbmcpIHtcbiAgICAvLyAgICAgc3dpdGNoIChjb21tYW5kTmFtZSkge1xuICAgIC8vICAgICAgICAgY2FzZSBcInR1cm5JbnRvUGFyYWdyYXBoXCI6XG4gICAgLy8gICAgICAgICAgICAgcmV0dXJuIFwicFwiO1xuICAgIC8vICAgICAgICAgY2FzZSBcInR1cm5JbnRvSDFcIjpcbiAgICAvLyAgICAgICAgICAgICByZXR1cm4gXCJoMVwiO1xuICAgIC8vICAgICAgICAgY2FzZSBcInR1cm5JbnRvSDJcIjpcbiAgICAvLyAgICAgICAgICAgICByZXR1cm4gXCJoMlwiO1xuICAgIC8vICAgICAgICAgY2FzZSBcInR1cm5JbnRvSDNcIjpcbiAgICAvLyAgICAgICAgICAgICByZXR1cm4gXCJoM1wiO1xuICAgIC8vICAgICAgICAgY2FzZSBcInR1cm5JbnRvSDRcIjpcbiAgICAvLyAgICAgICAgICAgICByZXR1cm4gXCJoNFwiO1xuICAgIC8vICAgICAgICAgY2FzZSBcInR1cm5JbnRvSDVcIjpcbiAgICAvLyAgICAgICAgICAgICByZXR1cm4gXCJoNVwiO1xuICAgIC8vICAgICAgICAgY2FzZSBcInR1cm5JbnRvSDZcIjpcbiAgICAvLyAgICAgICAgICAgICByZXR1cm4gXCJoNlwiO1xuXG4gICAgLy8gICAgICAgICBkZWZhdWx0OlxuICAgIC8vICAgICAgICAgICAgIHRocm93IEVycm9yKFwiRXJyb3JcIik7XG4gICAgLy8gICAgIH1cbiAgICAvLyB9XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICAgIC8vIGFwcGx5U2VsZWN0ZWRCbG9ja1R5cGUoZHJhZ2dhYmxlQmxvY2s6IEhUTUxFbGVtZW50LCBuZXdCbG9ja1R5cGU6IHN0cmluZykge1xuXG4gICAgLy8gICAgIC8vIGNvbnN0IGRyYWdnYWJsZUJsb2NrID0gcmVhbEZvY3VzZWRFbGVtZW50LmNsb3Nlc3QoJy5ibG9jaycpO1xuICAgIC8vICAgICAvLyBjb25zdCBuZXdCbG9ja1R5cGUgPSBldmVudC50YXJnZXQuY2xvc2VzdCgnLm9wdGlvbicpID9cbiAgICAvLyAgICAgLy8gICAgIGV2ZW50LnRhcmdldC5jbG9zZXN0KCcub3B0aW9uJykuZ2V0QXR0cmlidXRlKCdkYXRhLXR5cGUnKSA6XG4gICAgLy8gICAgIC8vICAgICBjdXJyZW50RmFrZUZvY3VzZWRPcHRpb24uZ2V0QXR0cmlidXRlKCdkYXRhLXR5cGUnKTtcblxuICAgIC8vICAgICBjb25zdCBsYXN0U2xhc2hJbmRleCA9IHJlYWxGb2N1c2VkRWxlbWVudC5pbm5lclRleHQubGFzdEluZGV4T2YoJy8nKTtcbiAgICAvLyAgICAgcmVhbEZvY3VzZWRFbGVtZW50LmlubmVyVGV4dCA9IGxhc3RTbGFzaEluZGV4ICE9PSAtMSA/IHJlYWxGb2N1c2VkRWxlbWVudC5pbm5lclRleHQuc2xpY2UoMCwgbGFzdFNsYXNoSW5kZXgpIDogcmVhbEZvY3VzZWRFbGVtZW50LmlubmVyVGV4dDtcblxuXG4gICAgLy8gICAgIHRyYW5zZm9ybUJsb2NrKGRyYWdnYWJsZUJsb2NrLCBuZXdCbG9ja1R5cGUpO1xuXG4gICAgLy8gICAgIGhpZGVBbmRDbGVhckJsb2NrT3B0aW9ucygpO1xuICAgIC8vICAgICBoaWRlQWxsRGVwZW5kZW50Qm94KCk7XG4gICAgLy8gICAgIGhpZGVmbG9hdGluZ1Rvb2xiYXIoKTtcbiAgICAvLyB9XG5cbiAgICAvLyBmb3JtYXRCbG9jayhlbGVtZW50OiBIVE1MRWxlbWVudCwgY29udGVudFR5cGU6IHN0cmluZylcbiAgICB0cmFuc2Zvcm1CbG9jayh0eXBlOiBzdHJpbmcsIGVsZW1lbnQ/OiBIVE1MRWxlbWVudCB8IG51bGwpIHtcblxuICAgICAgICBsZXQgYmxvY2tFbGVtZW50OiBFbGVtZW50IHwgbnVsbDtcblxuICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgICAgYmxvY2tFbGVtZW50ID0gZWxlbWVudC5jbG9zZXN0KFwiLmJsb2NrXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYmxvY2tFbGVtZW50ID0gdGhpcy5mb2N1c1N0YWNrLnBlZWsoKT8uY2xvc2VzdChcIi5ibG9ja1wiKSB8fCBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGNvbnRlbnRFbGVtZW50ID0gYmxvY2tFbGVtZW50IS5xdWVyeVNlbGVjdG9yKCcuc3dpdHRhYmxlJykgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICAgICAgdGhpcy5mb2N1c1N0YWNrLnBlZWsoKT8uZm9jdXMoKTtcblxuICAgICAgICBET01VdGlscy5yZW1vdmVGaWx0ZXJUZXh0KCk7XG5cbiAgICAgICAgdGhpcy5tZW1lbnRvLnNhdmVTdGF0ZSgpO1xuXG4gICAgICAgIGxldCBjb250ZW50ID0gY29udGVudEVsZW1lbnQ/LmlubmVyVGV4dDtcblxuICAgICAgICBsZXQgZm9jdXNTdGFja1RvQWRkOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuXG5cbiAgICAgICAgbGV0IG5ld0NvbnRlbnRCbG9jaztcblxuICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuUEFSQUdSQVBIOlxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3Q29udGVudEJsb2NrID0gdGhpcy5lbGVtZW50RmFjdG9yeVNlcnZpY2UuY3JlYXRlKEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLlBBUkFHUkFQSCk7XG4gICAgICAgICAgICAgICAgICAgIG5ld0NvbnRlbnRCbG9jay5pbm5lclRleHQgPSBjb250ZW50O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl8xOlxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3Q29udGVudEJsb2NrID0gdGhpcy5lbGVtZW50RmFjdG9yeVNlcnZpY2UuY3JlYXRlKEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl8xKTtcbiAgICAgICAgICAgICAgICAgICAgbmV3Q29udGVudEJsb2NrLmlubmVyVGV4dCA9IGNvbnRlbnQ7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuSEVBREVSXzI6XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBuZXdDb250ZW50QmxvY2sgPSB0aGlzLmVsZW1lbnRGYWN0b3J5U2VydmljZS5jcmVhdGUoRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuSEVBREVSXzIpO1xuICAgICAgICAgICAgICAgICAgICBuZXdDb250ZW50QmxvY2suaW5uZXJUZXh0ID0gY29udGVudDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfMzpcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG5ld0NvbnRlbnRCbG9jayA9IHRoaXMuZWxlbWVudEZhY3RvcnlTZXJ2aWNlLmNyZWF0ZShFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfMyk7XG4gICAgICAgICAgICAgICAgICAgIG5ld0NvbnRlbnRCbG9jay5pbm5lclRleHQgPSBjb250ZW50O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl80OlxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3Q29udGVudEJsb2NrID0gdGhpcy5lbGVtZW50RmFjdG9yeVNlcnZpY2UuY3JlYXRlKEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl80KTtcbiAgICAgICAgICAgICAgICAgICAgbmV3Q29udGVudEJsb2NrLmlubmVyVGV4dCA9IGNvbnRlbnQ7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuSEVBREVSXzU6XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBuZXdDb250ZW50QmxvY2sgPSB0aGlzLmVsZW1lbnRGYWN0b3J5U2VydmljZS5jcmVhdGUoRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuSEVBREVSXzUpO1xuICAgICAgICAgICAgICAgICAgICBuZXdDb250ZW50QmxvY2suaW5uZXJUZXh0ID0gY29udGVudDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfNjpcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG5ld0NvbnRlbnRCbG9jayA9IHRoaXMuZWxlbWVudEZhY3RvcnlTZXJ2aWNlLmNyZWF0ZShFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfNik7XG4gICAgICAgICAgICAgICAgICAgIG5ld0NvbnRlbnRCbG9jay5pbm5lclRleHQgPSBjb250ZW50O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkNPREU6XG4gICAgICAgICAgICAgICAgbmV3Q29udGVudEJsb2NrID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgncHJlJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgY29kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NvZGUnKTtcbiAgICAgICAgICAgICAgICBjb2RlLmlubmVyVGV4dCA9IGNvbnRlbnQ7XG4gICAgICAgICAgICAgICAgbmV3Q29udGVudEJsb2NrLmFwcGVuZENoaWxkKGNvZGUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgLy8gY2FzZSAnaW1hZ2UnOlxuICAgICAgICAgICAgLy8gICAgIG5ld0NvbnRlbnRCbG9jayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpO1xuICAgICAgICAgICAgLy8gICAgIG5ld0NvbnRlbnRCbG9jay5zcmMgPSBjb250ZW50O1xuICAgICAgICAgICAgLy8gICAgIG5ld0NvbnRlbnRCbG9jay5hbHQgPSBcIkRlc2NyaXB0aXZlIHRleHRcIjtcbiAgICAgICAgICAgIC8vICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuUVVPVEU6XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAvLyBuZXdDb250ZW50QmxvY2sgPSBmYWN0b3J5LmNyZWF0ZU5ld1F1b3RlRWxlbWVudChjb250ZW50KTtcblxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNhc2UgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuQlVMTEVURURfTElTVDpcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG5ld0NvbnRlbnRCbG9jayA9IHRoaXMuZWxlbWVudEZhY3RvcnlTZXJ2aWNlLmNyZWF0ZShFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5CVUxMRVRFRF9MSVNULCBjb250ZW50KTtcblxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNhc2UgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuTlVNQkVSRURfTElTVDpcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG5ld0NvbnRlbnRCbG9jayA9IHRoaXMuZWxlbWVudEZhY3RvcnlTZXJ2aWNlLmNyZWF0ZShFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5OVU1CRVJFRF9MSVNULCBjb250ZW50KTtcblxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkNIRUNLX0xJU1Q6XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBuZXdDb250ZW50QmxvY2sgPSB0aGlzLmVsZW1lbnRGYWN0b3J5U2VydmljZS5jcmVhdGUoRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuQ0hFQ0tfTElTVCwgY29udGVudCk7XG5cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjYXNlICdzZXBhcmF0b3InOlxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gbmV3Q29udGVudEJsb2NrID0gZmFjdG9yeS5jcmVhdGVOZXdTZXBhcmF0b3JFbGVtZW50KCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuVEFCTEU6XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBuZXdDb250ZW50QmxvY2sgPSB0aGlzLmVsZW1lbnRGYWN0b3J5U2VydmljZS5jcmVhdGUoRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuVEFCTEUsIFwiLCxcIik7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FzZSBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5JTUFHRTpcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG5ld0NvbnRlbnRCbG9jayA9IHRoaXMuZWxlbWVudEZhY3RvcnlTZXJ2aWNlLmNyZWF0ZShFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5JTUFHRSwgY29udGVudCk7XG4gICAgICAgICAgICAgICAgICAgIGZvY3VzU3RhY2tUb0FkZCA9IG5ld0NvbnRlbnRCbG9jaztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjYXNlIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkNBTExPVVQ6IHtcbiAgICAgICAgICAgICAgICBuZXdDb250ZW50QmxvY2sgPSB0aGlzLmVsZW1lbnRGYWN0b3J5U2VydmljZS5jcmVhdGUoRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuQ0FMTE9VVCwgY29udGVudCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignVW5zdXBwb3J0ZWQgdHlwZScpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghbmV3Q29udGVudEJsb2NrKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBibG9ja0VsZW1lbnQhLnJlcGxhY2VDaGlsZChuZXdDb250ZW50QmxvY2ssIGNvbnRlbnRFbGVtZW50KTtcblxuICAgICAgICBjb25zdCBmb2N1c2FibGUgPSAobmV3Q29udGVudEJsb2NrLmNsb3Nlc3QoJy5mb2N1c2FibGUnKSB8fCBibG9ja0VsZW1lbnQhLnF1ZXJ5U2VsZWN0b3IoJy5mb2N1c2FibGUnKSkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGlmIChmb2N1c2FibGUpIHtcbiAgICAgICAgICAgIGZvY3VzYWJsZS5mb2N1cygpO1xuICAgICAgICAgICAgRE9NVXRpbHMucGxhY2VDdXJzb3JBdEVuZE9mRWRpdGFibGVFbGVtZW50KGZvY3VzYWJsZSk7XG4gICAgICAgIH1cblxuXG4gICAgICAgIGlmKGZvY3VzU3RhY2tUb0FkZCl7XG4gICAgICAgICAgICB0aGlzLmZvY3VzU3RhY2sucHVzaCgoZm9jdXNTdGFja1RvQWRkIGFzIEhUTUxFbGVtZW50KSEpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYodHlwZSA9PSBcImltYWdlXCIpe1xuICAgICAgICAgICAgRXZlbnRFbWl0dGVyLmVtaXRTaG93RWxlbWVudEV2ZW50KFwibWVkaWFJbnB1dHRlclwiKTtcbiAgICAgICAgfVxuXG5cblxuICAgICAgICAvLydyZXF1ZXN0SGlkZUZsb2F0aW5nVG9vbGJhcidcbiAgICAgICAgLy8gY29uc3Qgc2VsZWN0aW9uRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoQ3VzdG9tRXZlbnRzLmJsb2NrVHlwZUNoYW5nZWQsIHtcbiAgICAgICAgLy8gICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIC8vICAgICBjYW5jZWxhYmxlOiB0cnVlXG4gICAgICAgIC8vIH0pO1xuXG4gICAgICAgIC8vIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoc2VsZWN0aW9uRXZlbnQpO1xuICAgIH1cblxuICAgIC8vTk9XIFRIRSBmb3JtYXRCbG9jayBBTkQgdHJhbnNmb3JtQmxvY2sgSVMgVEhFIFNBTUUuIGZvcm1hdEJsb2NrIElTIERFUFJFQ0VURUQgVVNFIHRyYW5zZm9ybUJsb2NrIElOU1RFRFxuICAgIC8vIGZvcm1hdEJsb2NrKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBjb250ZW50VHlwZTogc3RyaW5nKTogdm9pZCB7XG5cbiAgICAvLyAgICAgbGV0IGNvbnRlbnRFbGVtZW50ID0gZWxlbWVudC5xdWVyeVNlbGVjdG9yKCcuc3dpdHRhYmxlJykgYXMgSFRNTEVsZW1lbnQ7XG4gICAgLy8gICAgIGxldCBjb250ZW50ID0gY29udGVudEVsZW1lbnQuaW5uZXJUZXh0O1xuXG4gICAgLy8gICAgIGxldCBuZXdDb250ZW50QmxvY2sgPSB0aGlzLmVsZW1lbnRGYWN0b3J5U2VydmljZS5jcmVhdGUoY29udGVudFR5cGUsIGNvbnRlbnQpO1xuXG4gICAgLy8gICAgIGVsZW1lbnQucmVwbGFjZUNoaWxkKG5ld0NvbnRlbnRCbG9jaywgY29udGVudEVsZW1lbnQpO1xuXG4gICAgLy8gICAgIGNvbnN0IGZvY3VzYWJsZSA9IG5ld0NvbnRlbnRCbG9jay5jbG9zZXN0KCcuZm9jdXNhYmxlJykgfHwgZWxlbWVudC5xdWVyeVNlbGVjdG9yKCcuZm9jdXNhYmxlJyk7XG5cbiAgICAvLyAgICAgLy8gZm9jdXNPblRoZUVuZE9mVGhlVGV4dChmb2N1c2FibGUpO1xuICAgIC8vIH1cblxuXG5cbiAgICBjcmVhdGVOZXdFbGVtZW50KGV2ZW50OiBFdmVudCkge1xuXG4gICAgICAgIHRoaXMubWVtZW50by5zYXZlU3RhdGUoKTtcblxuICAgICAgICBjb25zdCBlbGVtZW50ID0gZXZlbnQudGFyZ2V0IGFzIEVsZW1lbnQ7XG5cbiAgICAgICAgY29uc3QgY29udGVudEVsZW1lbnQgPSBlbGVtZW50LmNsb3Nlc3QoJy5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQnKSBhcyBIVE1MRWxlbWVudDtcblxuICAgICAgICBpZiAoY29udGVudEVsZW1lbnQgJiYgY29udGVudEVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdsaXN0JykpIHtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlTGlzdEl0ZW0oY29udGVudEVsZW1lbnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jcmVhdGVEZWZhdWx0QmxvY2soY29udGVudEVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY3JlYXRlTGlzdEl0ZW0oZWxlbWVudDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcblxuICAgICAgICB0aGlzLm1lbWVudG8uc2F2ZVN0YXRlKCk7XG5cbiAgICAgICAgbGV0IG5ld0NvbnRlbnRFbGVtZW50ID0gbnVsbDtcblxuICAgICAgICBsZXQgYWN0aXZlRWxlbWVudCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gICAgICAgIGxldCBjb250ZW50RWxlbWVudCA9IGVsZW1lbnQuY2xvc2VzdCgnLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCcpIGFzIEhUTUxFbGVtZW50O1xuXG4gICAgICAgIGlmIChjb250ZW50RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2NoZWNrYm94LWxpc3QnKSkge1xuICAgICAgICAgICAgbmV3Q29udGVudEVsZW1lbnQgPSB0aGlzLmVsZW1lbnRGYWN0b3J5U2VydmljZS5jcmVhdGUoXCJjaGVja2JveEl0ZW1cIiwgXCJcIik7XG4gICAgICAgIH0gZWxzZSBpZiAoY29udGVudEVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdsaXN0JykpIHtcbiAgICAgICAgICAgIG5ld0NvbnRlbnRFbGVtZW50ID0gdGhpcy5lbGVtZW50RmFjdG9yeVNlcnZpY2UuY3JlYXRlKFwibGlzdEl0ZW1cIiwgXCJcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBuZXdDb250ZW50RWxlbWVudCA9IGNyZWF0ZU5ld0RyYWdnYWJsZVBhcmFncmFwaEVsZW1lbnQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGxldCBwYXJlbnRCbG9jayA9IG51bGw7XG5cbiAgICAgICAgLy8gaWYgKGNvbnRlbnRFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnbGlzdCcpKSB7XG5cbiAgICAgICAgLy8gICAgIHBhcmVudEJsb2NrID0gY29udGVudEVsZW1lbnQ7XG5cbiAgICAgICAgLy8gICAgIGNvbnN0IHRleHRDb250ZW50ID0gYWN0aXZlRWxlbWVudC50ZXh0Q29udGVudC50cmltKCk7XG5cbiAgICAgICAgLy8gICAgIGlmICh0ZXh0Q29udGVudCA9PT0gJycpIHtcblxuICAgICAgICAvLyAgICAgICAgIHBhcmVudEJsb2NrID0gZWxlbWVudC5jbG9zZXN0KCcuYmxvY2snKTtcblxuICAgICAgICAvLyAgICAgICAgIGVsZW1lbnQuY2xvc2VzdCgnLmRlbGV0YWJsZScpLnJlbW92ZSgpO1xuXG4gICAgICAgIC8vICAgICAgICAgbmV3Q29udGVudEVsZW1lbnQgPSBjcmVhdGVOZXdEcmFnZ2FibGVQYXJhZ3JhcGhFbGVtZW50KCk7XG4gICAgICAgIC8vICAgICAgICAgcGFyZW50QmxvY2suaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCdhZnRlcmVuZCcsIG5ld0NvbnRlbnRFbGVtZW50KTtcblxuICAgICAgICAvLyAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gICAgICAgICBjb25zdCBhY3RpdmVFbGVtZW50ID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudC5jbG9zZXN0KCcubGlzdC1pdGVtJyk7XG4gICAgICAgIC8vICAgICAgICAgYWN0aXZlRWxlbWVudC5pbnNlcnRBZGphY2VudEVsZW1lbnQoJ2FmdGVyZW5kJywgbmV3Q29udGVudEVsZW1lbnQpO1xuICAgICAgICAvLyAgICAgfVxuXG4gICAgICAgIC8vIH0gZWxzZSB7XG4gICAgICAgIC8vICAgICBwYXJlbnRCbG9jayA9IGVsZW1lbnQuY2xvc2VzdCgnLmJsb2NrJyk7XG5cbiAgICAgICAgLy8gICAgIGlmIChwYXJlbnRCbG9jaykge1xuICAgICAgICAvLyAgICAgICAgIGlmIChwYXJlbnRCbG9jay5uZXh0U2libGluZykge1xuICAgICAgICAvLyAgICAgICAgICAgICBwYXJlbnRCbG9jay5wYXJlbnROb2RlLmluc2VydEJlZm9yZShuZXdDb250ZW50RWxlbWVudCwgcGFyZW50QmxvY2submV4dFNpYmxpbmcpO1xuICAgICAgICAvLyAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vICAgICAgICAgICAgIHBhcmVudEJsb2NrLnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQobmV3Q29udGVudEVsZW1lbnQpO1xuICAgICAgICAvLyAgICAgICAgIH1cbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gfVxuXG4gICAgICAgIC8vIGZvY3VzT25UaGVFbmRPZlRoZVRleHQobmV3Q29udGVudEVsZW1lbnQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQ3JlYXRlcyBhIG5ldyBjb250ZW50IGVsZW1lbnQgKHBhcmFncmFwaCBvciBsaXN0IGl0ZW0pIGJhc2VkIG9uIHRoZSBjb250ZW50IHR5cGUgb2YgdGhlIGFjdGl2ZSBlbGVtZW50IGFuZCBzcGxpdHMgdGhlIGNvbnRlbnQgYWNjb3JkaW5nbHkuXG4gICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHRyaWdnZXJlZCBieSBwcmVzc2luZyAnRW50ZXInIGluIGFuIGVkaXRhYmxlIGNvbnRlbnQgYXJlYSwgZmFjaWxpdGF0aW5nIGR5bmFtaWMgY29udGVudCBjcmVhdGlvbiBhbmQgb3JnYW5pemF0aW9uXG4gICAgKiB3aXRoaW4gdGhlIGRvY3VtZW50LiBJdCBzdXBwb3J0cyBkaWZmZXJlbnQgY29udGVudCB0eXBlcyBpbmNsdWRpbmcgY2hlY2tsaXN0cywgYnVsbGV0ZWQgbGlzdHMsIG51bWJlcmVkIGxpc3RzLCBhbmQgZ2VuZXJhbCB0ZXh0IGJsb2Nrcy5cbiAgICAqXG4gICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gQWx3YXlzIHJldHVybnMgdHJ1ZSB0byBpbmRpY2F0ZSBzdWNjZXNzZnVsIGV4ZWN1dGlvbiwgcmVnYXJkbGVzcyBvZiB0aGUgcGF0aCB0YWtlbi5cbiAgICAqXG4gICAgKiBAZXhhbXBsZVxuICAgICogLy8gVHlwaWNhbGx5IGNhbGxlZCB3aXRoaW4gYW4gZXZlbnQgaGFuZGxlciBmb3Iga2V5cHJlc3MgZXZlbnRzXG4gICAgKiBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlwcmVzcycsIChldmVudCkgPT4ge1xuICAgICogICAgIGlmIChldmVudC5rZXkgPT09ICdFbnRlcicpIHtcbiAgICAqICAgICAgICAgY3JlYXRlTmV3RWxlbWVudEFuZFNwbGl0Q29udGVudCgpO1xuICAgICogICAgIH1cbiAgICAqIH0pO1xuICAgICpcbiAgICAqIEBkZXNjcmlwdGlvblxuICAgICogVGhlIGZ1bmN0aW9uIG9wZXJhdGVzIHVuZGVyIHNldmVyYWwgY29uZGl0aW9ucyBiYXNlZCBvbiB0aGUgY29udGVudCB0eXBlOlxuICAgICogLSBGb3IgbGlzdCBpdGVtcyAoY2hlY2tsaXN0LCBidWxsZXRlZCwgYW5kIG51bWJlcmVkKTpcbiAgICAqICAgMS4gRmluZHMgdGhlIGNsb3Nlc3QgbGlzdCBpdGVtIGFuY2VzdG9yIG9mIHRoZSBhY3RpdmUgZWxlbWVudC5cbiAgICAqICAgMi4gSWYgdGhlIGxpc3QgaXRlbSBjb250YWlucyB0ZXh0LCBpdCBjbG9uZXMgdGhpcyBpdGVtIGFuZCBzcGxpdHMgdGhlIGNvbnRlbnQgYmV0d2VlbiB0aGUgb3JpZ2luYWwgYW5kIHRoZSBjbG9uZS5cbiAgICAqICAgMy4gSWYgdGhlIGxpc3QgaXRlbSBpcyBlbXB0eSBhbmQgaXMgdGhlIG9ubHkgaXRlbSwgaXQgcmVtb3ZlcyB0aGUgZW50aXJlIGJsb2NrIGFmdGVyIGNyZWF0aW5nIGEgbmV3IHBhcmFncmFwaC5cbiAgICAqIC0gRm9yIG90aGVyIGJsb2NrcyAobGlrZSBwYXJhZ3JhcGhzKTpcbiAgICAqICAgMS4gQ2xvbmVzIHRoZSBjdXJyZW50IGJsb2NrIGFuZCByZWFycmFuZ2VzIGNvbnRlbnQgYmV0d2VlbiB0aGUgb3JpZ2luYWwgYW5kIHRoZSBuZXcgY2xvbmUuXG4gICAgKiAgIDIuIFNldHMgdGhlIGZvY3VzIHRvIHRoZSBzdGFydCBvZiB0aGUgbmV3IGVsZW1lbnQgdG8gY29udGludWUgZWRpdGluZy5cbiAgICAqXG4gICAgKiBUaGlzIG1ldGhvZCBlbnN1cmVzIHRoYXQgdGhlIGRvY3VtZW50IHN0cnVjdHVyZSByZW1haW5zIGNvaGVyZW50IHdoaWxlIHByb3ZpZGluZyBhIHNlYW1sZXNzIHVzZXIgZXhwZXJpZW5jZSBpbiB0ZXh0IGVkaXRpbmcgZW52aXJvbm1lbnRzLlxuICAgICovXG4gICAgY3JlYXRlTmV3RWxlbWVudEFuZFNwbGl0Q29udGVudCgpOiBib29sZWFuIHtcblxuICAgICAgICB0aGlzLm1lbWVudG8uc2F2ZVN0YXRlKCk7XG5cbiAgICAgICAgY29uc3QgY29udGVudFR5cGUgPSBET01VdGlscy5nZXRDb250ZW50VHlwZUZyb21BY3RpdmVFbGVtZW50KCk7XG5cbiAgICAgICAgaWYgKGNvbnRlbnRUeXBlID09IENvbnRlbnRUeXBlcy5UYWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgY29udGVudFR5cGUgPT0gQ29udGVudFR5cGVzLkNoZWNrTGlzdCB8fFxuICAgICAgICAgICAgY29udGVudFR5cGUgPT0gQ29udGVudFR5cGVzLkJ1bGxldGVkTGlzdCB8fFxuICAgICAgICAgICAgY29udGVudFR5cGUgPT0gQ29udGVudFR5cGVzLk51bWJlcmVkTGlzdCkge1xuXG4gICAgICAgICAgICBjb25zdCBjdXJyZW50SXRlbSA9IERPTVV0aWxzLmZpbmRDbG9zZXN0QW5jZXN0b3JPZkFjdGl2ZUVsZW1lbnRCeUNsYXNzKFwibGlzdC1pdGVtXCIpO1xuXG4gICAgICAgICAgICBpZiAoY3VycmVudEl0ZW0gJiYgRE9NVXRpbHMuaGFzVGV4dENvbnRlbnQoY3VycmVudEl0ZW0pKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2xvbmUgPSBET01VdGlscy5jbG9uZUFuZEluc2VydEFmdGVyKGN1cnJlbnRJdGVtKTtcbiAgICAgICAgICAgICAgICBpZiAoY2xvbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udGVudEN1cnJlbnQgPSBjdXJyZW50SXRlbS5xdWVyeVNlbGVjdG9yKFwiLmZvY3VzYWJsZVwiKSBhcyBOb2RlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50Q2xvbmUgPSBjbG9uZS5xdWVyeVNlbGVjdG9yKFwiLmZvY3VzYWJsZVwiKSBhcyBOb2RlO1xuICAgICAgICAgICAgICAgICAgICBET01VdGlscy5yZWFycmFuZ2VDb250ZW50QWZ0ZXJTcGxpdChjb250ZW50Q3VycmVudCwgY29udGVudENsb25lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRJdGVtKSB7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRCbG9jayA9IGN1cnJlbnRJdGVtLmNsb3Nlc3QoXCIuYmxvY2tcIik7XG5cbiAgICAgICAgICAgICAgICBpZiAocGFyZW50QmxvY2spIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY291bnRlciA9IHBhcmVudEJsb2NrLnF1ZXJ5U2VsZWN0b3JBbGwoXCIubGlzdC1pdGVtXCIpLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3UGFyYWdyYXBoID0gRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmJsb2NrUGFyYWdyYXBoKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgRE9NVXRpbHMuaW5zZXJ0QWZ0ZXIobmV3UGFyYWdyYXBoLCBwYXJlbnRCbG9jayk7XG5cbiAgICAgICAgICAgICAgICAgICAgY3VycmVudEl0ZW0ucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb3VudGVyID09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudEJsb2NrLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZm9jdXNhYmxlID0gKG5ld1BhcmFncmFwaCBhcyBIVE1MRWxlbWVudCkucXVlcnlTZWxlY3RvcihcInBcIikgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIERPTVV0aWxzLnBsYWNlQ3Vyc29yQXRTdGFydE9mRWRpdGFibGVFbGVtZW50KGZvY3VzYWJsZSBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50QmxvY2sgPSBET01VdGlscy5maW5kQ2xvc2VzdEFuY2VzdG9yT2ZBY3RpdmVFbGVtZW50QnlDbGFzcyhcImJsb2NrXCIpO1xuXG4gICAgICAgICAgICBpZiAoY3VycmVudEJsb2NrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2xvbmVkQmxvY2sgPSBET01VdGlscy5jbG9uZUFuZEluc2VydEFmdGVyKGN1cnJlbnRCbG9jayk7XG5cbiAgICAgICAgICAgICAgICBpZiAoY2xvbmVkQmxvY2spIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udGVudEN1cnJlbnQgPSBjdXJyZW50QmxvY2sucXVlcnlTZWxlY3RvcihcIi5mb2N1c2FibGVcIikgYXMgTm9kZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udGVudENsb25lID0gY2xvbmVkQmxvY2sucXVlcnlTZWxlY3RvcihcIi5mb2N1c2FibGVcIikgYXMgTm9kZTtcbiAgICAgICAgICAgICAgICAgICAgRE9NVXRpbHMucmVhcnJhbmdlQ29udGVudEFmdGVyU3BsaXQoY29udGVudEN1cnJlbnQsIGNvbnRlbnRDbG9uZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFET01VdGlscy5oYXNUZXh0Q29udGVudChjbG9uZWRCbG9jayEpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRyYW5zZm9ybUJsb2NrKENvbnRlbnRUeXBlcy5QYXJhZ3JhcGgsIGNsb25lZEJsb2NrKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGZvY3VzYWJsZSA9IChjbG9uZWRCbG9jayBhcyBIVE1MRWxlbWVudCkucXVlcnlTZWxlY3RvcihcIi5mb2N1c2FibGVcIikgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICAgICAgICAgICAgICBET01VdGlscy5wbGFjZUN1cnNvckF0U3RhcnRPZkVkaXRhYmxlRWxlbWVudChmb2N1c2FibGUgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAgICAvLyBzcGxpdENvbnRlbnRBdEN1cnNvcigpOiB2b2lkIHtcbiAgICAvLyAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICAgIC8vICAgICBpZiAoIXNlbGVjdGlvbiB8fCBzZWxlY3Rpb24ucmFuZ2VDb3VudCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgLy8gICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XG4gICAgLy8gICAgIGNvbnN0IGNvbnRhaW5lciA9IHJhbmdlLnN0YXJ0Q29udGFpbmVyO1xuXG4gICAgLy8gICAgIC8vIENyaWFuZG8gcmFuZ2UgcGFyYSBvIGNvbnRlw7pkbyBhbnRlcyBkbyBjdXJzb3JcbiAgICAvLyAgICAgY29uc3QgcmFuZ2VCZWZvcmUgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xuICAgIC8vICAgICByYW5nZUJlZm9yZS5zZWxlY3ROb2RlQ29udGVudHMoY29udGFpbmVyKTtcbiAgICAvLyAgICAgcmFuZ2VCZWZvcmUuc2V0RW5kKHJhbmdlLnN0YXJ0Q29udGFpbmVyLCByYW5nZS5zdGFydE9mZnNldCk7XG5cbiAgICAvLyAgICAgLy8gQ3JpYW5kbyByYW5nZSBwYXJhIG8gY29udGXDumRvIGRlcG9pcyBkbyBjdXJzb3JcbiAgICAvLyAgICAgY29uc3QgcmFuZ2VBZnRlciA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG4gICAgLy8gICAgIHJhbmdlQWZ0ZXIuc2VsZWN0Tm9kZUNvbnRlbnRzKGNvbnRhaW5lcik7XG4gICAgLy8gICAgIHJhbmdlQWZ0ZXIuc2V0U3RhcnQocmFuZ2UuZW5kQ29udGFpbmVyLCByYW5nZS5lbmRPZmZzZXQpO1xuXG4gICAgLy8gICAgIC8vIEV4ZW1wbG86IElzb2xhbmRvIG8gdGV4dG8gZGUgY2FkYSBwYXJ0ZVxuICAgIC8vICAgICBjb25zdCB0ZXh0QmVmb3JlID0gcmFuZ2VCZWZvcmUudG9TdHJpbmcoKTtcbiAgICAvLyAgICAgY29uc3QgdGV4dEFmdGVyID0gcmFuZ2VBZnRlci50b1N0cmluZygpO1xuXG4gICAgLy8gICAgIGNvbnNvbGUubG9nKCdUZXh0byBhbnRlcyBkbyBjdXJzb3I6JywgdGV4dEJlZm9yZSk7XG4gICAgLy8gICAgIGNvbnNvbGUubG9nKCdUZXh0byBkZXBvaXMgZG8gY3Vyc29yOicsIHRleHRBZnRlcik7XG5cbiAgICAvLyAgICAgLy8gQXF1aSB2b2PDqiBwb2RlIG1hbmlwdWxhciBvIERPTSBjb21vIG5lY2Vzc8OhcmlvLCBwb3IgZXhlbXBsbzpcbiAgICAvLyAgICAgLy8gaW5zZXJpciBub3ZvcyBlbGVtZW50b3MsIG1vZGlmaWNhciBvIHRleHRvLCBldGMuXG4gICAgLy8gfVxuXG5cbiAgICBjcmVhdGVEZWZhdWx0QmxvY2soZXZlbnRQYXJhZ3JhcGg6IEVsZW1lbnQgfCBudWxsKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG5ld0Jsb2NrID0gdGhpcy5lbGVtZW50RmFjdG9yeVNlcnZpY2UuY3JlYXRlKEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkJMT0NLX1BBUkFHUkFQSCwgXCJcIik7XG5cbiAgICAgICAgaWYgKGV2ZW50UGFyYWdyYXBoICYmIGV2ZW50UGFyYWdyYXBoLmNsb3Nlc3QoJy5ibG9jaycpKSB7XG4gICAgICAgICAgICBjb25zdCBzaWJsaW5nID0gZXZlbnRQYXJhZ3JhcGguY2xvc2VzdCgnLmJsb2NrJykhO1xuICAgICAgICAgICAgc2libGluZy5pbnNlcnRBZGphY2VudEVsZW1lbnQoJ2FmdGVyZW5kJywgbmV3QmxvY2spO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiNqb2hhbm5lc0VkaXRvciAuY29udGVudFwiKSEuYXBwZW5kQ2hpbGQobmV3QmxvY2spO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZm9jdXNhYmxlID0gbmV3QmxvY2sucXVlcnlTZWxlY3RvcignLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCcpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBmb2N1c2FibGUuZm9jdXMoKTtcblxuICAgICAgICAvLyBmb2N1c09uVGhlRW5kT2ZUaGVUZXh0KGZvY3VzYWJsZSk7XG4gICAgfVxuXG5cbiAgICBwcml2YXRlIGRlbGV0ZUFuZEZvY3VzT25QcmV2aW91cygpOiB2b2lkIHtcblxuICAgICAgICBjb25zdCBjdXJyZW50QWN0aXZlRWxlbWVudCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQhO1xuXG4gICAgICAgIHRoaXMuZm9jdXNPblByZXZpb3VzKGN1cnJlbnRBY3RpdmVFbGVtZW50KTtcbiAgICAgICAgdGhpcy5kZWxldGVUaGVDdXJyZW50RWxlbWVudEFuZFRoZURyYWdnYWJsZUJsb2NrSWZFbXB0eShjdXJyZW50QWN0aXZlRWxlbWVudCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkZWxldGVBbmRGb2N1c09uTmV4dCgpIHtcblxuICAgICAgICBsZXQgY3VycmVudEFjdGl2ZUVsZW1lbnQgPSB0aGlzLmdldEN1cnJlbnRTZWxlY3RlZEJsb2NrKCkgfHwgRE9NVXRpbHMuZ2V0Q3VycmVudEFjdGl2ZUJsb2NrKCk7XG5cbiAgICAgICAgaWYgKCFjdXJyZW50QWN0aXZlRWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5mb2N1c09uTmV4dChjdXJyZW50QWN0aXZlRWxlbWVudCk7XG4gICAgICAgIHRoaXMuZGVsZXRlVGhlQ3VycmVudEVsZW1lbnRBbmRUaGVEcmFnZ2FibGVCbG9ja0lmRW1wdHkoY3VycmVudEFjdGl2ZUVsZW1lbnQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZm9jdXNPblByZXZpb3VzKGFjdHVhbEVsZW1lbnQ6IEVsZW1lbnQsIHBvc2l0aW9uOiBudW1iZXIgfCBudWxsID0gbnVsbCk6IHZvaWQge1xuXG4gICAgICAgIGxldCB0YWcgPSBhY3R1YWxFbGVtZW50LnRhZ05hbWUudG9VcHBlckNhc2UoKTtcbiAgICAgICAgbGV0IGZvY3VzZWRFbGVtZW50ID0gbnVsbDtcblxuICAgICAgICBpZiAodGFnID09PSAnTEknKSB7XG4gICAgICAgICAgICBsZXQgcHJldmlvdXNFbGVtZW50ID0gYWN0dWFsRWxlbWVudC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nO1xuXG4gICAgICAgICAgICBpZiAoIXByZXZpb3VzRWxlbWVudCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHByZXZpb3VzRWxlbWVudCAmJiBwcmV2aW91c0VsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdmb2N1c2FibGUnKSkge1xuICAgICAgICAgICAgICAgIGZvY3VzZWRFbGVtZW50ID0gcHJldmlvdXNFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcGx5Q3Vyc29yWEVuZFBvc2l0aW9uKGZvY3VzZWRFbGVtZW50LCBwb3NpdGlvbik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgRE9NVXRpbHMucGxhY2VDdXJzb3JBdEVuZE9mRWRpdGFibGVFbGVtZW50KGZvY3VzZWRFbGVtZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gcmV0dXJuIGZvY3VzZWRFbGVtZW50O1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgoYWN0dWFsRWxlbWVudC5wYXJlbnROb2RlIGFzIEhUTUxFbGVtZW50KS50YWdOYW1lLnRvVXBwZXJDYXNlKCkgPT09ICdMSScgLyogZm9jdXNhYmxlIFNQQU4gaW5zaWRlIExJKi8pIHtcblxuICAgICAgICAgICAgbGV0IHByZXZpb3VzRWxlbWVudCA9IGFjdHVhbEVsZW1lbnQuY2xvc2VzdCgnbGknKT8ucHJldmlvdXNFbGVtZW50U2libGluZz8ucXVlcnlTZWxlY3RvcignLmZvY3VzYWJsZScpO1xuXG4gICAgICAgICAgICBpZiAocHJldmlvdXNFbGVtZW50ICYmIHByZXZpb3VzRWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2ZvY3VzYWJsZScpKSB7XG4gICAgICAgICAgICAgICAgZm9jdXNlZEVsZW1lbnQgPSBwcmV2aW91c0VsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwbHlDdXJzb3JYRW5kUG9zaXRpb24oZm9jdXNlZEVsZW1lbnQsIHBvc2l0aW9uKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBET01VdGlscy5wbGFjZUN1cnNvckF0RW5kT2ZFZGl0YWJsZUVsZW1lbnQoZm9jdXNlZEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyByZXR1cm4gZm9jdXNlZEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBhcmVudCA9IGFjdHVhbEVsZW1lbnQuY2xvc2VzdCgnLmJsb2NrJyk7XG5cbiAgICAgICAgaWYgKCFwYXJlbnQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgc2libGluZyA9IHBhcmVudC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nO1xuXG4gICAgICAgIHdoaWxlIChzaWJsaW5nKSB7XG4gICAgICAgICAgICBsZXQgZm9jdXNhYmxlQ2FuZGlkYXRlcyA9IHNpYmxpbmcucXVlcnlTZWxlY3RvckFsbCgnLmZvY3VzYWJsZScpO1xuICAgICAgICAgICAgaWYgKGZvY3VzYWJsZUNhbmRpZGF0ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGZvY3VzZWRFbGVtZW50ID0gZm9jdXNhYmxlQ2FuZGlkYXRlc1tmb2N1c2FibGVDYW5kaWRhdGVzLmxlbmd0aCAtIDFdIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcGx5Q3Vyc29yWEVuZFBvc2l0aW9uKGZvY3VzZWRFbGVtZW50LCBwb3NpdGlvbik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgRE9NVXRpbHMucGxhY2VDdXJzb3JBdEVuZE9mRWRpdGFibGVFbGVtZW50KGZvY3VzZWRFbGVtZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gcmV0dXJuIGZvY3VzZWRFbGVtZW50O1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc2libGluZyA9IHNpYmxpbmcucHJldmlvdXNFbGVtZW50U2libGluZztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHJldHVybiBmb2N1c2VkRWxlbWVudDtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHByaXZhdGUgZm9jdXNPbk5leHQoYWN0dWFsRWxlbWVudDogRWxlbWVudCwgcG9zaXRpb246IG51bWJlciB8IG51bGwgPSBudWxsKSB7XG4gICAgICAgIGxldCB0YWcgPSBhY3R1YWxFbGVtZW50LnRhZ05hbWUudG9VcHBlckNhc2UoKTtcbiAgICAgICAgbGV0IGZvY3VzZWRFbGVtZW50ID0gbnVsbDtcblxuICAgICAgICBpZiAodGFnID09PSAnTEknKSB7XG4gICAgICAgICAgICBsZXQgbmV4dEVsZW1lbnQgPSBhY3R1YWxFbGVtZW50Lm5leHRFbGVtZW50U2libGluZztcblxuICAgICAgICAgICAgaWYgKG5leHRFbGVtZW50ICYmIG5leHRFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnZm9jdXNhYmxlJykpIHtcbiAgICAgICAgICAgICAgICBmb2N1c2VkRWxlbWVudCA9IG5leHRFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xuXG4gICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwbHlDdXJzb3JYU3RhcnRQb3NpdGlvbihmb2N1c2VkRWxlbWVudCwgcG9zaXRpb24pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIERPTVV0aWxzLnBsYWNlQ3Vyc29yQXRTdGFydE9mRWRpdGFibGVFbGVtZW50KGZvY3VzZWRFbGVtZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZvY3VzZWRFbGVtZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKChhY3R1YWxFbGVtZW50LnBhcmVudE5vZGUgYXMgSFRNTEVsZW1lbnQpLnRhZ05hbWUudG9VcHBlckNhc2UoKSA9PT0gJ0xJJyAvKiBmb2N1c2FibGUgU1BBTiBpbnNpZGUgTEkqLykge1xuICAgICAgICAgICAgbGV0IG5leHRFbGVtZW50ID0gYWN0dWFsRWxlbWVudC5jbG9zZXN0KCdsaScpPy5uZXh0RWxlbWVudFNpYmxpbmc/LnF1ZXJ5U2VsZWN0b3IoJy5mb2N1c2FibGUnKTtcblxuICAgICAgICAgICAgaWYgKG5leHRFbGVtZW50ICYmIG5leHRFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnZm9jdXNhYmxlJykpIHtcbiAgICAgICAgICAgICAgICBmb2N1c2VkRWxlbWVudCA9IG5leHRFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcGx5Q3Vyc29yWFN0YXJ0UG9zaXRpb24oZm9jdXNlZEVsZW1lbnQsIHBvc2l0aW9uKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBET01VdGlscy5wbGFjZUN1cnNvckF0U3RhcnRPZkVkaXRhYmxlRWxlbWVudChmb2N1c2VkRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBmb2N1c2VkRWxlbWVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBwYXJlbnQgPSBhY3R1YWxFbGVtZW50LmNsb3Nlc3QoJy5ibG9jaycpO1xuXG4gICAgICAgIGlmICghcGFyZW50KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgc2libGluZyA9IHBhcmVudC5uZXh0RWxlbWVudFNpYmxpbmc7XG5cbiAgICAgICAgd2hpbGUgKHNpYmxpbmcpIHtcbiAgICAgICAgICAgIGxldCBmb2N1c2FibGVDYW5kaWRhdGVzID0gc2libGluZy5xdWVyeVNlbGVjdG9yQWxsKCcuZm9jdXNhYmxlJyk7XG4gICAgICAgICAgICBpZiAoZm9jdXNhYmxlQ2FuZGlkYXRlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgZm9jdXNlZEVsZW1lbnQgPSBmb2N1c2FibGVDYW5kaWRhdGVzWzBdIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcGx5Q3Vyc29yWFN0YXJ0UG9zaXRpb24oZm9jdXNlZEVsZW1lbnQsIHBvc2l0aW9uKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBET01VdGlscy5wbGFjZUN1cnNvckF0U3RhcnRPZkVkaXRhYmxlRWxlbWVudChmb2N1c2VkRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBmb2N1c2VkRWxlbWVudDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc2libGluZyA9IHNpYmxpbmcubmV4dEVsZW1lbnRTaWJsaW5nO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZvY3VzZWRFbGVtZW50O1xuICAgIH1cblxuXG5cbiAgICBkZWxldGVUaGVDdXJyZW50RWxlbWVudEFuZFRoZURyYWdnYWJsZUJsb2NrSWZFbXB0eShjdXJyZW50RWxlbWVudDogRWxlbWVudCkge1xuXG4gICAgICAgIGNvbnN0IHBhcmVudEJsb2NrID0gY3VycmVudEVsZW1lbnQuY2xvc2VzdCgnLmJsb2NrJyk7XG4gICAgICAgIGNvbnN0IGFjdHVhbCA9IGN1cnJlbnRFbGVtZW50LmNsb3Nlc3QoJy5kZWxldGFibGUnKTtcblxuICAgICAgICBhY3R1YWw/LnJlbW92ZSgpO1xuXG4gICAgICAgIGlmIChwYXJlbnRCbG9jayAmJiBwYXJlbnRCbG9jay5xdWVyeVNlbGVjdG9yQWxsKCcuZWRpdGFibGUnKS5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgcGFyZW50QmxvY2sucmVtb3ZlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cblxuXG5cbiAgICBhcHBseUN1cnNvclhFbmRQb3NpdGlvbihlbGVtZW50OiBIVE1MRWxlbWVudCwgeFBvc2l0aW9uOiBudW1iZXIpIHtcblxuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCkhO1xuICAgICAgICBjb25zdCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG5cbiAgICAgICAgbGV0IGN1cnJlbnROb2RlID0gZWxlbWVudC5sYXN0Q2hpbGQ7XG4gICAgICAgIGxldCByZXN1bHQgPSBudWxsO1xuXG4gICAgICAgIHdoaWxlIChjdXJyZW50Tm9kZSkge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnROb2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMuYWRqdXN0Q3Vyc29yT2Zmc2V0KGN1cnJlbnROb2RlLCB4UG9zaXRpb24pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50Tm9kZS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSAnQlInKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZS5wcmV2aW91c1NpYmxpbmc7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLnByZXZpb3VzU2libGluZztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXN1bHQgJiYgcmVzdWx0LmNsb3Nlc3ROb2RlKSB7XG4gICAgICAgICAgICByYW5nZS5zZXRTdGFydChyZXN1bHQuY2xvc2VzdE5vZGUsIHJlc3VsdC5jbG9zZXN0T2Zmc2V0KTtcbiAgICAgICAgICAgIHJhbmdlLmNvbGxhcHNlKHRydWUpO1xuICAgICAgICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgICAgICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKTtcbiAgICAgICAgICAgIGVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhlbGVtZW50KTtcbiAgICAgICAgICAgIHJhbmdlLmNvbGxhcHNlKGZhbHNlKTtcbiAgICAgICAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICAgICAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSk7XG4gICAgICAgICAgICBlbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhcHBseUN1cnNvclhTdGFydFBvc2l0aW9uKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCB4UG9zaXRpb246IG51bWJlcikge1xuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCkhO1xuICAgICAgICBjb25zdCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG5cbiAgICAgICAgbGV0IGN1cnJlbnROb2RlID0gZWxlbWVudC5maXJzdENoaWxkO1xuICAgICAgICBsZXQgcmVzdWx0ID0gbnVsbDtcblxuICAgICAgICB3aGlsZSAoY3VycmVudE5vZGUpIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50Tm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB0aGlzLmFkanVzdEN1cnNvck9mZnNldChjdXJyZW50Tm9kZSwgeFBvc2l0aW9uKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGN1cnJlbnROb2RlID0gY3VycmVudE5vZGUubmV4dFNpYmxpbmc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVzdWx0ICYmIHJlc3VsdC5jbG9zZXN0Tm9kZSkge1xuICAgICAgICAgICAgcmFuZ2Uuc2V0U3RhcnQocmVzdWx0LmNsb3Nlc3ROb2RlLCByZXN1bHQuY2xvc2VzdE9mZnNldCk7XG4gICAgICAgICAgICByYW5nZS5jb2xsYXBzZSh0cnVlKTtcbiAgICAgICAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICAgICAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSk7XG4gICAgICAgICAgICBlbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByYW5nZS5zZWxlY3ROb2RlQ29udGVudHMoZWxlbWVudCk7XG4gICAgICAgICAgICByYW5nZS5jb2xsYXBzZSh0cnVlKTtcbiAgICAgICAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICAgICAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSk7XG4gICAgICAgICAgICBlbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhZGp1c3RDdXJzb3JPZmZzZXQobm9kZTogTm9kZSwgeFBvc2l0aW9uOiBudW1iZXIpIHtcbiAgICAgICAgbGV0IHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcbiAgICAgICAgbGV0IGNsb3Nlc3ROb2RlID0gbm9kZTtcbiAgICAgICAgbGV0IGNsb3Nlc3RPZmZzZXQgPSAwO1xuICAgICAgICBsZXQgY2xvc2VzdERpZmYgPSBJbmZpbml0eTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUudGV4dENvbnRlbnQhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICByYW5nZS5zZXRTdGFydChub2RlLCBpKTtcbiAgICAgICAgICAgIHJhbmdlLnNldEVuZChub2RlLCBpICsgMSk7XG4gICAgICAgICAgICBjb25zdCByZWN0ID0gcmFuZ2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICBjb25zdCBsZWZ0RGlmZiA9IE1hdGguYWJzKHJlY3QubGVmdCAtIHhQb3NpdGlvbik7XG4gICAgICAgICAgICBjb25zdCByaWdodERpZmYgPSBNYXRoLmFicyhyZWN0LnJpZ2h0IC0geFBvc2l0aW9uKTtcblxuICAgICAgICAgICAgaWYgKGxlZnREaWZmIDwgY2xvc2VzdERpZmYgfHwgcmlnaHREaWZmIDwgY2xvc2VzdERpZmYpIHtcbiAgICAgICAgICAgICAgICBjbG9zZXN0RGlmZiA9IE1hdGgubWluKGxlZnREaWZmLCByaWdodERpZmYpO1xuICAgICAgICAgICAgICAgIGNsb3Nlc3RPZmZzZXQgPSBpICsgKHJpZ2h0RGlmZiA8IGxlZnREaWZmID8gMSA6IDApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHhQb3NpdGlvbiA+IHJhbmdlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnJpZ2h0KSB7XG4gICAgICAgICAgICBjbG9zZXN0T2Zmc2V0ID0gbm9kZS50ZXh0Q29udGVudCEubGVuZ3RoO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHsgY2xvc2VzdE5vZGUsIGNsb3Nlc3RPZmZzZXQgfTtcbiAgICB9XG5cblxuICAgIC8vIGZvY3VzT25UaGVFbmRPZlRoZVRleHQoY29udGVudEJsb2NrOiBIVE1MRWxlbWVudCkge1xuXG4gICAgLy8gICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG5cbiAgICAvLyAgICAgICAgIGNvbnN0IHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcbiAgICAvLyAgICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKSE7XG5cbiAgICAvLyAgICAgICAgIHJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhjb250ZW50QmxvY2spO1xuXG4gICAgLy8gICAgICAgICBsZXQgbGFzdENoaWxkID0gY29udGVudEJsb2NrO1xuXG4gICAgLy8gICAgICAgICB3aGlsZSAobGFzdENoaWxkLmxhc3RDaGlsZCAmJiBsYXN0Q2hpbGQubGFzdENoaWxkLm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSkge1xuICAgIC8vICAgICAgICAgICAgIGxhc3RDaGlsZCA9IGxhc3RDaGlsZC5sYXN0Q2hpbGQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgLy8gICAgICAgICB9XG4gICAgLy8gICAgICAgICBpZiAobGFzdENoaWxkLmxhc3RDaGlsZCkge1xuICAgIC8vICAgICAgICAgICAgIGxhc3RDaGlsZCA9IGxhc3RDaGlsZC5sYXN0Q2hpbGQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgLy8gICAgICAgICB9XG5cbiAgICAvLyAgICAgICAgIHJhbmdlLnNldEVuZChsYXN0Q2hpbGQsIGxhc3RDaGlsZC50ZXh0Q29udGVudCEubGVuZ3RoKTtcbiAgICAvLyAgICAgICAgIHJhbmdlLmNvbGxhcHNlKGZhbHNlKTtcblxuICAgIC8vICAgICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgIC8vICAgICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKTtcblxuICAgIC8vICAgICAgICAgY29udGVudEJsb2NrLmZvY3VzKCk7XG4gICAgLy8gICAgIH0pO1xuICAgIC8vIH1cblxuICAgIC8vIGZvY3VzT25UaGVTdGFydE9mVGhlVGV4dChjb250ZW50QmxvY2s6IEhUTUxFbGVtZW50KSB7XG5cbiAgICAvLyAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgLy8gICAgICAgICBjb25zdCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG4gICAgLy8gICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCkhO1xuXG4gICAgLy8gICAgICAgICByYW5nZS5zZWxlY3ROb2RlQ29udGVudHMoY29udGVudEJsb2NrKTtcbiAgICAvLyAgICAgICAgIHJhbmdlLmNvbGxhcHNlKHRydWUpO1xuICAgIC8vICAgICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgIC8vICAgICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKTtcblxuICAgIC8vICAgICAgICAgY29udGVudEJsb2NrLmZvY3VzKCk7XG4gICAgLy8gICAgIH0sIDEwKTtcbiAgICAvLyB9XG5cblxuXG5cbiAgICBnZXRDdXJyZW50U2VsZWN0ZWRGb2N1c2FibGUoKTogRWxlbWVudCB8IG51bGwge1xuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gICAgICAgIGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAwKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xuICAgICAgICBsZXQgY29udGFpbmVyOiBOb2RlIHwgbnVsbCA9IHJhbmdlLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyO1xuXG4gICAgICAgIGlmIChjb250YWluZXIubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgICAgICAgICBjb250YWluZXIgPSBjb250YWluZXIucGFyZW50Tm9kZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZvY3VzYWJsZVBhcmVudCA9IChjb250YWluZXIgYXMgSFRNTEVsZW1lbnQpLmNsb3Nlc3QoXCIuZm9jdXNhYmxlXCIpO1xuXG4gICAgICAgIHJldHVybiBmb2N1c2FibGVQYXJlbnQ7XG4gICAgfVxuXG4gICAgZ2V0Q3VycmVudFNlbGVjdGVkQmxvY2soKTogRWxlbWVudCB8IG51bGwge1xuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gICAgICAgIGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAwKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xuICAgICAgICBsZXQgY29udGFpbmVyOiBOb2RlIHwgbnVsbCA9IHJhbmdlLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyO1xuXG4gICAgICAgIGlmIChjb250YWluZXIubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgICAgICAgICBjb250YWluZXIgPSBjb250YWluZXIucGFyZW50Tm9kZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZvY3VzYWJsZVBhcmVudCA9IChjb250YWluZXIgYXMgSFRNTEVsZW1lbnQpLmNsb3Nlc3QoXCIuYmxvY2tcIik7XG5cbiAgICAgICAgcmV0dXJuIGZvY3VzYWJsZVBhcmVudDtcbiAgICB9XG5cblxuICAgIGR1cGxpY2F0ZVNlbGVjdGVkQmxvY2soKTogTm9kZSB8IG51bGwge1xuXG4gICAgICAgIGxldCBlbGVtZW50ID0gdGhpcy5nZXRDdXJyZW50U2VsZWN0ZWRCbG9jaygpIHx8IERPTVV0aWxzLmdldEN1cnJlbnRBY3RpdmVCbG9jaygpO1xuXG4gICAgICAgIGlmICghZWxlbWVudCB8fCAhZWxlbWVudC5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdPIGVsZW1lbnRvIGZvcm5lY2lkbyDDqSBpbnbDoWxpZG8gb3UgbsOjbyBlc3TDoSBubyBET00uJyk7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNsb25lID0gZWxlbWVudC5jbG9uZU5vZGUodHJ1ZSk7XG5cbiAgICAgICAgY29uc3QgbmV4dEVsZW1lbnQgPSBlbGVtZW50Lm5leHRTaWJsaW5nO1xuXG4gICAgICAgIGVsZW1lbnQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoY2xvbmUsIG5leHRFbGVtZW50KTtcblxuICAgICAgICByZXR1cm4gY2xvbmU7XG4gICAgfVxuXG59IiwiaW1wb3J0IHsgQmFzZVVJQ29tcG9uZW50IH0gZnJvbSBcIi4uL2NvbW1vbi9CYXNlVUlDb21wb25lbnRcIjtcclxuaW1wb3J0IHsgU1ZHSWNvbiB9IGZyb20gXCIuLi9jb21tb24vU1ZHSWNvblwiO1xyXG5pbXBvcnQgeyBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL3NlcnZpY2VzL2Jsb2NrLW9wZXJhdGlvbnMvQmxvY2tPcGVyYXRpb25zU2VydmljZVwiO1xyXG5pbXBvcnQgeyBJQmxvY2tPcGVyYXRpb25zU2VydmljZSB9IGZyb20gXCIuLi8uLi9zZXJ2aWNlcy9ibG9jay1vcGVyYXRpb25zL0lCbG9ja09wZXJhdGlvbnNTZXJ2aWNlXCI7XHJcbmltcG9ydCB7IERlcGVuZGVuY3lDb250YWluZXIgfSBmcm9tIFwiQC9jb3JlL0RlcGVuZGVuY3lDb250YWluZXJcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBBZGRCbG9ja0J1dHRvbiBleHRlbmRzIEJhc2VVSUNvbXBvbmVudCB7XHJcblxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBibG9ja09wZXJhdGlvbnNTZXJ2aWNlOiBJQmxvY2tPcGVyYXRpb25zU2VydmljZTtcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgaWNvbjogU1ZHSWNvbjtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihibG9ja09wZXJhdGlvbnNTZXJ2aWNlOiBJQmxvY2tPcGVyYXRpb25zU2VydmljZSwgaWNvbjogU1ZHSWNvbikge1xyXG5cclxuICAgICAgICBzdXBlcih7XHJcbiAgICAgICAgICAgIGljb246IGljb25cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5ibG9ja09wZXJhdGlvbnNTZXJ2aWNlID0gYmxvY2tPcGVyYXRpb25zU2VydmljZTtcclxuICAgICAgICB0aGlzLmljb24gPSBpY29uO1xyXG4gICAgICAgIHRoaXMuYXR0YWNoRXZlbnRzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdCgpOiBIVE1MRWxlbWVudCB7XHJcblxyXG4gICAgICAgIGNvbnN0IGh0bWxFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiKTtcclxuICAgICAgICBodG1sRWxlbWVudC50aXRsZSA9IFwiQWRkIGEgbmV3IGJsb2NrXCI7XHJcblxyXG4gICAgICAgIGh0bWxFbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJhZGQtYmxvY2tcIiwgXCJibG9jay1vcGVyYXRpb25cIik7XHJcblxyXG4gICAgICAgIGh0bWxFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMucHJvcHMuaWNvbi5odG1sRWxlbWVudCk7XHJcblxyXG4gICAgICAgIHJldHVybiBodG1sRWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICBhdHRhY2hFdmVudHMoKTogdm9pZCB7XHJcblxyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5ibG9ja09wZXJhdGlvbnNTZXJ2aWNlLmV4ZWNDb21tYW5kKEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuQkxPQ0tfT1BFUkFUSU9OUy5DUkVBVEVfREVGQVVMVF9CTE9DSywgZmFsc2UpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBjcmVhdGUoaWNvbjogU1ZHSWNvbik6IEFkZEJsb2NrQnV0dG9uIHtcclxuXHJcbiAgICAgICAgY29uc3QgYmxvY2tPcGVyYXRpb25zU2VydmljZSA9IERlcGVuZGVuY3lDb250YWluZXIuSW5zdGFuY2UucmVzb2x2ZTxJQmxvY2tPcGVyYXRpb25zU2VydmljZT4oXCJJQmxvY2tPcGVyYXRpb25zU2VydmljZVwiKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIG5ldyBBZGRCbG9ja0J1dHRvbihibG9ja09wZXJhdGlvbnNTZXJ2aWNlLCBpY29uKTtcclxuICAgIH1cclxufSIsImltcG9ydCB7IEJhc2VVSUNvbXBvbmVudCB9IGZyb20gXCIuLi9jb21tb24vQmFzZVVJQ29tcG9uZW50XCI7XHJcbmltcG9ydCB7IEFkZEJsb2NrQnV0dG9uIH0gZnJvbSBcIi4vQWRkQmxvY2tCdXR0b25cIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBBZGRCbG9ja1dyYXBwZXIgZXh0ZW5kcyBCYXNlVUlDb21wb25lbnQge1xyXG5cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgYnV0dG9uOiBBZGRCbG9ja0J1dHRvbjtcclxuXHJcbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKGJ1dHRvbjogQWRkQmxvY2tCdXR0b24pIHtcclxuXHJcbiAgICAgICAgc3VwZXIoe1xyXG4gICAgICAgICAgICBidXR0b246IGJ1dHRvblxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmJ1dHRvbiA9IGJ1dHRvbjtcclxuICAgIH1cclxuXHJcbiAgICBpbml0KCk6IEhUTUxFbGVtZW50IHtcclxuXHJcbiAgICAgICAgY29uc3QgaHRtbEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG5cclxuICAgICAgICBodG1sRWxlbWVudC5jbGFzc0xpc3QuYWRkKFwiYWRkLWJsb2NrLXdyYXBwZXJcIik7XHJcblxyXG4gICAgICAgIGh0bWxFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMucHJvcHMuYnV0dG9uLmh0bWxFbGVtZW50KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGh0bWxFbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBjcmVhdGUoYnV0dG9uOiBBZGRCbG9ja0J1dHRvbik6IEFkZEJsb2NrV3JhcHBlciB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBBZGRCbG9ja1dyYXBwZXIoYnV0dG9uKTtcclxuICAgIH1cclxufSIsImV4cG9ydCBjbGFzcyBTaXplcyB7XHJcbiAgICBcclxuICAgIHN0YXRpYyBtZWRpdW06IHN0cmluZyA9IFwiMXJlbVwiO1xyXG4gICAgc3RhdGljIGxhcmdlOiBzdHJpbmcgPSBcIjEuMjVyZW1cIjtcclxufSIsImltcG9ydCB7IEJhc2VVSUNvbXBvbmVudCB9IGZyb20gXCIuL0Jhc2VVSUNvbXBvbmVudFwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFNWR0ljb24gZXh0ZW5kcyBCYXNlVUlDb21wb25lbnQge1xyXG5cclxuICAgIHVzZUVsZW1lbnQ6IFNWR1VzZUVsZW1lbnQ7XHJcblxyXG4gICAgY29uc3RydWN0b3IoaWNvbklkOiBzdHJpbmcsIHNpemU6IHN0cmluZykge1xyXG5cclxuICAgICAgICBzdXBlcih7XHJcbiAgICAgICAgICAgIGljb25JZDogaWNvbklkLFxyXG4gICAgICAgICAgICBzaXplOiBzaXplXHJcbiAgICAgICAgfSlcclxuXHJcbiAgICAgICAgdGhpcy51c2VFbGVtZW50ID0gdGhpcy5odG1sRWxlbWVudC5xdWVyeVNlbGVjdG9yKCd1c2UnKSBhcyBTVkdVc2VFbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIGluaXQoKTogSFRNTEVsZW1lbnQge1xyXG5cclxuICAgICAgICBjb25zdCBodG1sRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsIFwic3ZnXCIpO1xyXG5cclxuICAgICAgICAvLyBodG1sRWxlbWVudC5zdHlsZS5jb2xvciA9IFwicmdiYSg1NSwgNTMsIDQ3LCAwLjg1KVwiO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LnN0eWxlLmNvbG9yID0gXCJyZWQgIWltcG9ydGFudFwiO1xyXG5cclxuICAgICAgICBsZXQgdXNlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiwgXCJ1c2VcIik7XHJcbiAgICAgICAgdXNlLnNldEF0dHJpYnV0ZU5TKFwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiLCBcImhyZWZcIiwgYCMke3RoaXMucHJvcHMuaWNvbklkfWApO1xyXG5cclxuICAgICAgICB1c2Uuc3R5bGUuY29sb3IgPSBcInJlZCAhaW1wb3J0YW50XCI7XHJcblxyXG4gICAgICAgIGh0bWxFbGVtZW50LmFwcGVuZENoaWxkKHVzZSk7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuc2V0QXR0cmlidXRlKCd3aWR0aCcsIHRoaXMucHJvcHMuc2l6ZSk7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuc2V0QXR0cmlidXRlKCdoZWlnaHQnLCB0aGlzLnByb3BzLnNpemUpO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LnNldEF0dHJpYnV0ZSgnZmlsbCcsICdjdXJyZW50Q29sb3InKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGh0bWxFbGVtZW50IGFzIHVua25vd24gYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgY2xvbmUoKTogU1ZHSWNvbiB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBTVkdJY29uKHRoaXMucHJvcHMuaWNvbklkLCB0aGlzLnByb3BzLnNpemVzKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRVc2VUbyh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy51c2VFbGVtZW50LnNldEF0dHJpYnV0ZU5TKFwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiLCBcImhyZWZcIiwgYCMke3ZhbHVlfWApO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBjcmVhdGUoaWNvbklkOiBzdHJpbmcsIHNpemU6IHN0cmluZyk6IFNWR0ljb24ge1xyXG4gICAgICAgIHJldHVybiBuZXcgU1ZHSWNvbihpY29uSWQsIHNpemUpO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgQWRkQmxvY2tCdXR0b24gfSBmcm9tIFwiQC9jb21wb25lbnRzL2FkZC1ibG9jay9BZGRCbG9ja0J1dHRvblwiO1xyXG5pbXBvcnQgeyBBZGRCbG9ja1dyYXBwZXIgfSBmcm9tIFwiQC9jb21wb25lbnRzL2FkZC1ibG9jay9BZGRCbG9ja1dyYXBwZXJcIjtcclxuaW1wb3J0IHsgU2l6ZXMgfSBmcm9tIFwiQC9jb21tb24vU2l6ZXNcIjtcclxuaW1wb3J0IHsgU1ZHSWNvbiB9IGZyb20gXCJAL2NvbXBvbmVudHMvY29tbW9uL1NWR0ljb25cIjtcclxuXHJcbmltcG9ydCB7IEljb25zIH0gZnJvbSBcIkAvY29tbW9uL0ljb25zXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgQWRkQmxvY2tCdWlsZGVyIHtcclxuXHJcbiAgICBcclxuICAgIHN0YXRpYyBidWlsZCgpOiBBZGRCbG9ja1dyYXBwZXIge1xyXG4gICAgICAgIHJldHVybiBBZGRCbG9ja1dyYXBwZXIuY3JlYXRlKEFkZEJsb2NrQnV0dG9uLmNyZWF0ZShTVkdJY29uLmNyZWF0ZShJY29ucy5QbHVzLCBTaXplcy5tZWRpdW0pKSk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBCYXNlVUlDb21wb25lbnQgfSBmcm9tIFwiLi4vLi4vY29tbW9uL0Jhc2VVSUNvbXBvbmVudFwiO1xyXG5pbXBvcnQgeyBEcm9wZG93bk1lbnVCdXR0b24gfSBmcm9tIFwiLi9Ecm9wZG93bk1lbnVCdXR0b25cIjtcclxuaW1wb3J0IHsgRHJvcGRvd25NZW51TGlzdCB9IGZyb20gXCIuL0Ryb3Bkb3duTWVudUxpc3RcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBEcm9wZG93bk1lbnUgZXh0ZW5kcyBCYXNlVUlDb21wb25lbnQge1xyXG5cclxuICAgIHJlYWRvbmx5IGlkOiBzdHJpbmc7XHJcbiAgICBkcm9wZG93bkJ1dHRvbjogRHJvcGRvd25NZW51QnV0dG9uO1xyXG4gICAgZHJvcGRvd25MaXN0OiBEcm9wZG93bk1lbnVMaXN0O1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGlkOiBzdHJpbmcsICBidXR0b246IERyb3Bkb3duTWVudUJ1dHRvbiwgZHJvcGRvd25MaXN0OiBEcm9wZG93bk1lbnVMaXN0KSB7XHJcblxyXG4gICAgICAgIHN1cGVyKHtcclxuICAgICAgICAgICAgaWQ6IGlkXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5pZCA9IGlkO1xyXG4gICAgICAgIHRoaXMuZHJvcGRvd25CdXR0b24gPSBidXR0b247XHJcbiAgICAgICAgdGhpcy5kcm9wZG93bkxpc3QgPSBkcm9wZG93bkxpc3Q7XHJcblxyXG5cclxuICAgICAgICBidXR0b24uYXBwZW5kVG8odGhpcyk7XHJcbiAgICAgICAgZHJvcGRvd25MaXN0LmFwcGVuZFRvKHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXQoKTogSFRNTEVsZW1lbnQge1xyXG5cclxuICAgICAgICBjb25zdCBodG1sRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuaWQgPSB0aGlzLnByb3BzLmlkO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJzZWxlY3Qtd3JhcHBlclwiKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGh0bWxFbGVtZW50O1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBnZXQgZGlzcGxheSgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiAnYmxvY2snO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgSk5vZGUgfSBmcm9tIFwiLi9KTm9kZVwiO1xyXG5cclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VEb3VibHlMaW5rZWRMaXN0PFQ+IHtcclxuXHJcbiAgICBoZWFkOiBKTm9kZTxUPiB8IG51bGwgPSBudWxsO1xyXG4gICAgdGFpbDogSk5vZGU8VD4gfCBudWxsID0gbnVsbDtcclxuXHJcbiAgICBsZW5ndGg6IG51bWJlciA9IDA7XHJcblxyXG4gICAgYWJzdHJhY3QgYXBwZW5kKGVsZW1lbnQ6IFQpOiB2b2lkO1xyXG5cclxuICAgIGdldEZpcnN0KCk6IEpOb2RlPFQ+IHwgbnVsbCB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaGVhZDtcclxuICAgIH1cclxuXHJcbiAgICBnZXRMYXN0KCk6IEpOb2RlPFQ+IHwgbnVsbCB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudGFpbDtcclxuICAgIH1cclxuXHJcbiAgICAqW1N5bWJvbC5pdGVyYXRvcl0oKSB7XHJcbiAgICAgICAgbGV0IGN1cnJlbnQgPSB0aGlzLmhlYWQ7XHJcbiAgICAgICAgaWYgKCFjdXJyZW50KSByZXR1cm47XHJcbiAgICAgICAgZG8ge1xyXG4gICAgICAgICAgICB5aWVsZCBjdXJyZW50O1xyXG4gICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0Tm9kZTtcclxuICAgICAgICB9IHdoaWxlIChjdXJyZW50ICYmIGN1cnJlbnQgIT09IHRoaXMuaGVhZCk7XHJcbiAgICB9XHJcblxyXG4gICAgZm9yRWFjaChjYWxsYmFjazogKG5vZGU6IFQsIGluZGV4OiBudW1iZXIsIGxpc3Q6IEJhc2VEb3VibHlMaW5rZWRMaXN0PFQ+KSA9PiB2b2lkKTogdm9pZCB7XHJcbiAgICAgICAgbGV0IGluZGV4ID0gMDtcclxuICAgICAgICBmb3IgKGxldCBub2RlIG9mIHRoaXMpIHtcclxuICAgICAgICAgICAgY2FsbGJhY2sobm9kZS52YWx1ZSwgaW5kZXgsIHRoaXMpO1xyXG4gICAgICAgICAgICBpbmRleCsrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhbnkocHJlZGljYXRlOiAobm9kZTogVCkgPT4gYm9vbGVhbik6IGJvb2xlYW4ge1xyXG4gICAgICAgIGxldCBjdXJyZW50ID0gdGhpcy5oZWFkO1xyXG4gICAgICAgIHdoaWxlIChjdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGlmIChwcmVkaWNhdGUoY3VycmVudC52YWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHROb2RlO1xyXG4gICAgICAgICAgICBpZiAoY3VycmVudCA9PT0gdGhpcy5oZWFkKSBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGZpbmRGaXJzdChwcmVkaWNhdGU6IChub2RlOiBUKSA9PiBib29sZWFuKTogSk5vZGU8VD4gfCBudWxsIHtcclxuICAgICAgICBpZiAoIXRoaXMuaGVhZCkgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgICAgIGxldCBjdXJyZW50OiBudWxsIHwgSk5vZGU8VD4gPSB0aGlzLmhlYWQ7XHJcbiAgICAgICAgZG8ge1xyXG4gICAgICAgICAgICBpZiAocHJlZGljYXRlKGN1cnJlbnQudmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0Tm9kZTtcclxuICAgICAgICB9IHdoaWxlIChjdXJyZW50ICYmIGN1cnJlbnQgIT09IHRoaXMuaGVhZCk7XHJcblxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGZpbmRMYXN0KHByZWRpY2F0ZTogKG5vZGU6IFQpID0+IGJvb2xlYW4pOiBKTm9kZTxUPiB8IG51bGwge1xyXG4gICAgICAgIGlmICghdGhpcy50YWlsKSByZXR1cm4gbnVsbDtcclxuXHJcbiAgICAgICAgbGV0IGN1cnJlbnQ6IG51bGwgfCBKTm9kZTxUPiA9IHRoaXMudGFpbDtcclxuXHJcbiAgICAgICAgZG8ge1xyXG4gICAgICAgICAgICBpZiAocHJlZGljYXRlKGN1cnJlbnQudmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5wcmV2aW91c05vZGU7XHJcbiAgICAgICAgfSB3aGlsZSAoY3VycmVudCAmJiBjdXJyZW50ICE9PSB0aGlzLnRhaWwpO1xyXG5cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBmaW5kKGVsZW1lbnQ6IFQpOiBKTm9kZTxUPiB8IG51bGwge1xyXG5cclxuICAgICAgICBsZXQgY3VycmVudDogSk5vZGU8VD4gfCBudWxsID0gdGhpcy5oZWFkO1xyXG5cclxuICAgICAgICB3aGlsZSAoY3VycmVudCkge1xyXG4gICAgICAgICAgICBpZiAoY3VycmVudC52YWx1ZSA9PSBlbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dE5vZGU7XHJcbiAgICAgICAgICAgIGlmIChjdXJyZW50ID09PSB0aGlzLmhlYWQpIGJyZWFrO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBCYXNlRG91Ymx5TGlua2VkTGlzdCB9IGZyb20gXCIuL0Jhc2VEb3VibHlMaW5rZWRMaXN0XCI7XHJcblxyXG5leHBvcnQgY2xhc3MgSk5vZGU8VD4ge1xyXG5cclxuICAgIHBhcmVudExpc3Q6IEJhc2VEb3VibHlMaW5rZWRMaXN0PFQ+O1xyXG5cclxuICAgIHByZXZpb3VzTm9kZTogSk5vZGU8VD4gfCBudWxsO1xyXG4gICAgbmV4dE5vZGU6IEpOb2RlPFQ+IHwgbnVsbDtcclxuICAgIHZhbHVlOiBUO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHZhbHVlOiBULCBwYXJlbnRMaXN0OiBCYXNlRG91Ymx5TGlua2VkTGlzdDxUPikge1xyXG4gICAgICAgIHRoaXMucHJldmlvdXNOb2RlID0gbnVsbDtcclxuICAgICAgICB0aGlzLm5leHROb2RlID0gbnVsbDtcclxuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy5wYXJlbnRMaXN0ID0gcGFyZW50TGlzdDtcclxuICAgIH1cclxuXHJcbiAgICBzZXROZXh0KG5vZGU6IEpOb2RlPFQ+KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5uZXh0Tm9kZSA9IG5vZGU7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0UHJldmlvdXMobm9kZTogSk5vZGU8VD4pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnByZXZpb3VzTm9kZSA9IG5vZGU7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0TmV4dFNhdGlzZnlpbmcocHJlZGljYXRlOiAobm9kZTogVCkgPT4gYm9vbGVhbik6IEpOb2RlPFQ+IHwgbnVsbCB7XHJcbiAgICAgICAgbGV0IGN1cnJlbnQgPSB0aGlzLm5leHROb2RlO1xyXG4gICAgICAgIGNvbnN0IHN0YXJ0Tm9kZSA9IHRoaXM7XHJcbiAgICAgICAgd2hpbGUgKGN1cnJlbnQpIHtcclxuICAgICAgICAgICAgaWYgKHByZWRpY2F0ZShjdXJyZW50LnZhbHVlKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dE5vZGU7XHJcbiAgICAgICAgICAgIGlmIChjdXJyZW50ID09PSBzdGFydE5vZGUpIHtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFByZXZpb3VzU2F0aXNmeWluZyhwcmVkaWNhdGU6IChub2RlOiBUKSA9PiBib29sZWFuKTogSk5vZGU8VD4gfCBudWxsIHtcclxuICAgICAgICBsZXQgY3VycmVudCA9IHRoaXMucHJldmlvdXNOb2RlO1xyXG4gICAgICAgIGNvbnN0IHN0YXJ0Tm9kZSA9IHRoaXM7XHJcbiAgICAgICAgd2hpbGUgKGN1cnJlbnQgJiYgY3VycmVudCAhPT0gc3RhcnROb2RlKSB7XHJcbiAgICAgICAgICAgIGlmIChwcmVkaWNhdGUoY3VycmVudC52YWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LnByZXZpb3VzTm9kZTtcclxuICAgICAgICAgICAgaWYgKGN1cnJlbnQgPT09IHRoaXMpIHtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgQmFzZURvdWJseUxpbmtlZExpc3QgfSBmcm9tIFwiLi9CYXNlRG91Ymx5TGlua2VkTGlzdFwiO1xyXG5pbXBvcnQgeyBKTm9kZSB9IGZyb20gXCIuL0pOb2RlXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgQ2lyY3VsYXJEb3VibHlMaW5rZWRMaXN0PFQ+IGV4dGVuZHMgQmFzZURvdWJseUxpbmtlZExpc3Q8VD4ge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXBwZW5kKGVsZW1lbnQ6IFQpOiB2b2lkIHtcclxuXHJcbiAgICAgICAgY29uc3Qgbm9kZSA9IG5ldyBKTm9kZShlbGVtZW50LCB0aGlzKTtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLmhlYWQgfHwgIXRoaXMudGFpbCkge1xyXG5cclxuICAgICAgICAgICAgdGhpcy5oZWFkID0gbm9kZTtcclxuICAgICAgICAgICAgdGhpcy50YWlsID0gbm9kZTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuaGVhZC5zZXROZXh0KHRoaXMudGFpbCk7XHJcbiAgICAgICAgICAgIHRoaXMuaGVhZC5zZXRQcmV2aW91cyh0aGlzLnRhaWwpO1xyXG5cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBub2RlLnNldFByZXZpb3VzKHRoaXMudGFpbCk7XHJcbiAgICAgICAgICAgIG5vZGUuc2V0TmV4dCh0aGlzLmhlYWQpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy50YWlsLnNldE5leHQobm9kZSk7XHJcbiAgICAgICAgICAgIHRoaXMuaGVhZC5zZXRQcmV2aW91cyhub2RlKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMudGFpbCA9IG5vZGU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmxlbmd0aCsrO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgQmFzZVVJQ29tcG9uZW50IH0gZnJvbSBcIi4uLy4uL2NvbW1vbi9CYXNlVUlDb21wb25lbnRcIjtcclxuaW1wb3J0IHsgRHJvcGRvd25NZW51TGlzdCB9IGZyb20gXCIuL0Ryb3Bkb3duTWVudUxpc3RcIjtcclxuaW1wb3J0IHsgU1ZHSWNvbiB9IGZyb20gXCJAL2NvbXBvbmVudHMvY29tbW9uL1NWR0ljb25cIjtcclxuaW1wb3J0IHsgSURyb3Bkb3duTWVudUl0ZW0gfSBmcm9tIFwiLi9JRHJvcGRvd25NZW51SXRlbVwiO1xyXG5pbXBvcnQgeyBKTm9kZSB9IGZyb20gXCJAL2NvbW1vbi9KTm9kZVwiO1xyXG5pbXBvcnQgeyBTaXplcyB9IGZyb20gXCJAL2NvbW1vbi9TaXplc1wiO1xyXG5pbXBvcnQgeyBJQ29tbWFuZEV2ZW50RGV0YWlsIH0gZnJvbSBcIkAvY29tbWFuZHMvSUNvbW1hbmRFdmVudERldGFpbFwiO1xyXG5pbXBvcnQgeyBDdXN0b21FdmVudHMgfSBmcm9tIFwiQC9jb21tb24vQ3VzdG9tRXZlbnRzXCI7XHJcbmltcG9ydCB7IEN1c3RvbVVJRXZlbnRzIH0gZnJvbSBcIkAvY29tbW9uL0N1c3RvbVVJRXZlbnRzXCI7XHJcbmltcG9ydCB7IElVSUV2ZW50RGV0YWlsIH0gZnJvbSBcIkAvY29tbWFuZHMvSVVJRXZlbnREZXRhaWxcIjtcclxuaW1wb3J0IHsgU2hvd0hpZGVBY3RpdmVCdXR0b24gfSBmcm9tIFwiQC9jb21tYW5kcy9VSUFjdGlvbnMvU2hvd0hpZGVBY3RpdmVCdXR0b25cIjtcclxuaW1wb3J0IHsgUmVzZXRBY3RpdmVCdXR0b25zIH0gZnJvbSBcIkAvY29tbWFuZHMvVUlBY3Rpb25zL1Jlc2V0QWN0aXZlQnV0dG9uc1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIERyb3Bkb3duTWVudUxpc3RJdGVtIGV4dGVuZHMgQmFzZVVJQ29tcG9uZW50IGltcGxlbWVudHMgSURyb3Bkb3duTWVudUl0ZW0ge1xyXG5cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgaWQ6IHN0cmluZztcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgY29tbWFuZDogc3RyaW5nO1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSB2YWx1ZTogc3RyaW5nIHwgbnVsbDtcclxuICAgIHJlYWRvbmx5IGFjdGl2ZUljb24/OiBTVkdJY29uO1xyXG4gICAgcHJpdmF0ZSBsZWZ0SWNvbj86IFNWR0VsZW1lbnQgfCBIVE1MRWxlbWVudDtcclxuICAgIHByaXZhdGUgY2xhc3NMaXN0OiBzdHJpbmdbXTtcclxuXHJcbiAgICBwcml2YXRlIG9uRm9jdXNGdW5jdGlvbkxpc3Q6ICgoKSA9PiB2b2lkKVtdID0gW107XHJcbiAgICBwcml2YXRlIG9uTG9zZUZvY3VzRnVuY3Rpb25MaXN0OiAoKCkgPT4gdm9pZClbXSA9IFtdO1xyXG5cclxuICAgIHBhcmVudERyb3Bkb3duTWVudUxpc3Q6IERyb3Bkb3duTWVudUxpc3Q7XHJcblxyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgaWQ6IHN0cmluZyxcclxuICAgICAgICBwYXJlbnREcm9wZG93bk1lbnVMaXN0OiBEcm9wZG93bk1lbnVMaXN0LFxyXG4gICAgICAgIGNvbW1hbmQ6IHN0cmluZyxcclxuICAgICAgICB2YWx1ZTogc3RyaW5nIHwgbnVsbCxcclxuICAgICAgICBsZWZ0SWNvbjogSFRNTEVsZW1lbnQgfCBTVkdFbGVtZW50LFxyXG4gICAgICAgIHRpdGxlOiBzdHJpbmcsXHJcbiAgICAgICAgc2hvcnRjdXQ6IHN0cmluZyB8IG51bGwgPSBudWxsKSB7XHJcblxyXG4gICAgICAgIGNvbnN0IGNsYXNzTGlzdCA9IFtcImxpc3QtaXRlbVwiLCBcIm9wdGlvblwiLCBcIm9wdGlvbi1ob3ZlclwiLCBcImJsb2NrLW9wZXJhdGlvblwiXTtcclxuXHJcbiAgICAgICAgY29uc3QgaWNvbiA9IG5ldyBTVkdJY29uKFwiaWNvbi1tYXRlcmlhbC1zbWFsbC1jaGVja1wiLCBTaXplcy5tZWRpdW0pO1xyXG4gICAgICAgIGljb24uaHRtbEVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9IFwiaGlkZGVuXCI7XHJcblxyXG4gICAgICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICAgICAgICBsZWZ0SWNvbi5zdHlsZS5jb2xvciA9IHZhbHVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc3VwZXIoe1xyXG4gICAgICAgICAgICBpZDogaWQsXHJcbiAgICAgICAgICAgIGNsYXNzTGlzdDogY2xhc3NMaXN0LFxyXG4gICAgICAgICAgICBsZWZ0SWNvbjogbGVmdEljb24sXHJcbiAgICAgICAgICAgIHRpdGxlOiB0aXRsZSxcclxuICAgICAgICAgICAgaWNvbjogaWNvbixcclxuICAgICAgICAgICAgc2hvcnRjdXQ6IHNob3J0Y3V0XHJcbiAgICAgICAgfSk7XHJcblxyXG5cclxuICAgICAgICB0aGlzLmlkID0gaWQ7XHJcbiAgICAgICAgdGhpcy5jbGFzc0xpc3QgPSBjbGFzc0xpc3Q7XHJcbiAgICAgICAgdGhpcy5sZWZ0SWNvbiA9IGxlZnRJY29uO1xyXG4gICAgICAgIHRoaXMuY29tbWFuZCA9IGNvbW1hbmQ7XHJcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xyXG4gICAgICAgIHRoaXMucGFyZW50RHJvcGRvd25NZW51TGlzdCA9IHBhcmVudERyb3Bkb3duTWVudUxpc3Q7XHJcbiAgICAgICAgdGhpcy5hY3RpdmVJY29uID0gaWNvbjtcclxuXHJcbiAgICAgICAgdGhpcy5hdHRhY2hFdmVudCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGF0dGFjaE9uRm9jdXMoZnVuYzogKCkgPT4gdm9pZCk6IHZvaWQge1xyXG4gICAgLy8gICAgIHRoaXMub25Gb2N1c0Z1bmN0aW9uTGlzdC5wdXNoKGZ1bmMpO1xyXG4gICAgLy8gfVxyXG5cclxuICAgIGFkZENsYXNzKGNsYXNzS2V5OiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLmNsYXNzTGlzdC5wdXNoKGNsYXNzS2V5KTtcclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LmNsYXNzTGlzdC5hZGQoY2xhc3NLZXkpO1xyXG4gICAgfVxyXG5cclxuICAgIGF0dGFjaE9uRm9jdXM8VCBleHRlbmRzIGFueVtdPihmdW5jOiAoLi4uYXJnczogVCkgPT4gdm9pZCwgLi4uYXJnczogVCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMub25Gb2N1c0Z1bmN0aW9uTGlzdC5wdXNoKCgpID0+IGZ1bmMoLi4uYXJncykpO1xyXG4gICAgfVxyXG5cclxuICAgIGF0dGFjaE9uTG9zZUZvY3VzPFQgZXh0ZW5kcyBhbnlbXT4oZnVuYzogKC4uLmFyZ3M6IFQpID0+IHZvaWQsIC4uLmFyZ3M6IFQpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLm9uTG9zZUZvY3VzRnVuY3Rpb25MaXN0LnB1c2goKCkgPT4gZnVuYyguLi5hcmdzKSk7XHJcbiAgICB9XHJcblxyXG4gICAgZm9jdXMoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdvcHRpb24tZm9jdXNlZCcpO1xyXG4gICAgICAgIHRoaXMub25Gb2N1c0Z1bmN0aW9uTGlzdC5mb3JFYWNoKGZ1bmMgPT4gZnVuYygpKTtcclxuICAgIH1cclxuXHJcbiAgICByZW1vdmVGb2N1cygpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ29wdGlvbi1mb2N1c2VkJyk7XHJcbiAgICAgICAgdGhpcy5vbkxvc2VGb2N1c0Z1bmN0aW9uTGlzdC5mb3JFYWNoKGZ1bmMgPT4gZnVuYygpKTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0KCk6IEhUTUxFbGVtZW50IHtcclxuXHJcbiAgICAgICAgY29uc3QgaHRtbEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaScpO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LmlkID0gdGhpcy5wcm9wcy5pZDtcclxuICAgICAgICBjb25zdCBjbGFzc0xpc3QgPSB0aGlzLnByb3BzLmNsYXNzTGlzdCBhcyBzdHJpbmdbXTtcclxuICAgICAgICBodG1sRWxlbWVudC5jbGFzc0xpc3QuYWRkKC4uLmNsYXNzTGlzdCk7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQudGFiSW5kZXggPSAyO1xyXG5cclxuICAgICAgICBodG1sRWxlbWVudC5zdHlsZS5jb2xvciA9IFwiIzM3MzUyRlwiO1xyXG5cclxuICAgICAgICBjb25zdCB0ZXh0T3B0aW9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgdGV4dE9wdGlvbi5jbGFzc0xpc3QuYWRkKCd0ZXh0LW9wdGlvbicpO1xyXG5cclxuICAgICAgICB0ZXh0T3B0aW9uLmFwcGVuZENoaWxkKHRoaXMucHJvcHMubGVmdEljb24pO1xyXG5cclxuICAgICAgICBjb25zdCBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xyXG4gICAgICAgIHNwYW4uaW5uZXJUZXh0ID0gdGhpcy5wcm9wcy50aXRsZTtcclxuXHJcbiAgICAgICAgdGV4dE9wdGlvbi5hcHBlbmRDaGlsZChzcGFuKTtcclxuXHJcbiAgICAgICAgaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQodGV4dE9wdGlvbik7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5wcm9wcy5pY29uLmh0bWxFbGVtZW50KTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMucHJvcHMuc2hvcnRjdXQpIHtcclxuICAgICAgICAgICAgY29uc3Qgc2hvcnRDdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcclxuICAgICAgICAgICAgc2hvcnRDdXQuaW5uZXJUZXh0ID0gdGhpcy5wcm9wcy5zaG9ydGN1dDtcclxuICAgICAgICAgICAgc2hvcnRDdXQuc3R5bGUuY29sb3IgPSBcInJnYmEoNTUsIDUzLCA0NywgMC41KVwiXHJcblxyXG4gICAgICAgICAgICBodG1sRWxlbWVudC5hcHBlbmRDaGlsZChzaG9ydEN1dCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gaHRtbEVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgZW1pdENvbW1hbmRFdmVudCgpOiB2b2lkIHtcclxuXHJcbiAgICAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQ8SUNvbW1hbmRFdmVudERldGFpbD4oQ3VzdG9tRXZlbnRzLmVtaXR0ZWRDb21tYW5kLCB7XHJcbiAgICAgICAgICAgIGRldGFpbDoge1xyXG4gICAgICAgICAgICAgICAgY29tbWFuZDogdGhpcy5jb21tYW5kLFxyXG4gICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMudmFsdWUsXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChjdXN0b21FdmVudCk7XHJcblxyXG5cclxuICAgICAgICAvLyByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xyXG4gICAgICAgIC8vICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgICAgICAgLy8gICAgIGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAwKSByZXR1cm47XHJcblxyXG4gICAgICAgIC8vICAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xyXG4gICAgICAgIC8vICAgICBsZXQgY29udGFpbmVyOiBOb2RlIHwgbnVsbCA9IHJhbmdlLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyO1xyXG5cclxuICAgICAgICAvLyAgICAgaWYgKGNvbnRhaW5lcj8ubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XHJcbiAgICAgICAgLy8gICAgICAgICBjb250YWluZXIgPSBjb250YWluZXIucGFyZW50Tm9kZTtcclxuICAgICAgICAvLyAgICAgfVxyXG5cclxuICAgICAgICAvLyAgICAgY29uc3QgZm9jdXNhYmxlUGFyZW50ID0gKGNvbnRhaW5lciBhcyBIVE1MRWxlbWVudCkuY2xvc2VzdChcIi5mb2N1c2FibGVcIik7XHJcblxyXG4gICAgICAgIC8vICAgICBpZiAoZm9jdXNhYmxlUGFyZW50KSB7XHJcbiAgICAgICAgLy8gICAgICAgICB0aGlzLm5vcm1hbGl6ZUFuZE1lcmdlRWxlbWVudHMoZm9jdXNhYmxlUGFyZW50IGFzIEhUTUxFbGVtZW50KTtcclxuICAgICAgICAvLyAgICAgfVxyXG4gICAgICAgIC8vIH0pO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBhZGRDc3NDbGFzcyguLi50b2tlbnM6IHN0cmluZ1tdKSB7XHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5jbGFzc0xpc3QuYWRkKC4uLnRva2Vucyk7XHJcbiAgICB9XHJcblxyXG4gICAgYXR0YWNoRXZlbnQoKTogdm9pZCB7XHJcblxyXG4gICAgICAgIHRoaXMuYXR0YWNoVUlFdmVudCgpO1xyXG5cclxuICAgICAgICAvLyBQcmV2ZW50IGZvY3VzIGNoYW5nZSB3aGVuIGNsaWNraW5nIG9uIHRoaXMgZWxlbWVudFxyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIChldmVudCkgPT4ge1xyXG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBQcmV2ZW50IGZvY3VzIGNoYW5nZSB3aGVuIGNsaWNraW5nIG9uIHRoaXMgZWxlbWVudFxyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlZG93blwiLCAoZXZlbnQpID0+IHtcclxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBhc3luYyAoKSA9PiB7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBub2RlOiBKTm9kZTxJRHJvcGRvd25NZW51SXRlbT4gPSB0aGlzLnBhcmVudERyb3Bkb3duTWVudUxpc3QuZHJvcGRvd25JdGVtcy5maW5kKHRoaXMpITtcclxuXHJcbiAgICAgICAgICAgIHRoaXMucGFyZW50RHJvcGRvd25NZW51TGlzdC5zd2l0Y2hWaXN1YWxGb2N1cyhub2RlISk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5lbWl0Q29tbWFuZEV2ZW50KCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG5cclxuICAgICAgICAvLyBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEN1c3RvbUV2ZW50cy50ZXh0Rm9ybWF0Q2hhbmdlZCwgKGV2ZW50OiBFdmVudCkgPT4ge1xyXG5cclxuICAgICAgICAvLyAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBldmVudCBhcyBDdXN0b21FdmVudDxJRm9ybWF0Q29tbWFuZD47XHJcbiAgICAgICAgLy8gICAgIGNvbnN0IHN0YXRlcyA9IGN1c3RvbUV2ZW50LmRldGFpbDtcclxuXHJcbiAgICAgICAgLy8gICAgIGlmICh0aGlzLmNvbW1hbmQgPT0gQ29tbWFuZHMudG9nZ2xlSGlsaXRlQ29sb3IpIHtcclxuXHJcbiAgICAgICAgLy8gICAgICAgICBpZiAoIXRoaXMudmFsdWUpIHtcclxuICAgICAgICAvLyAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbG9yIHZhbHVlIG11c3QgYmUgcHJvdmlkZWQgZm9yIHRoZSAnaGlsaXRlQ29sb3InIGNvbW1hbmQuIEVhY2ggJ0xpc3RNZW51SXRlbScgbXVzdCBzcGVjaWZ5IGEgY29sb3IgcmVwcmVzZW50aW5nIHRoZSB0ZXh0IGJhY2tncm91bmQgY29sb3IuXCIpO1xyXG4gICAgICAgIC8vICAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyAgICAgICAgIGlmIChzdGF0ZXMuaGlsaXRlQ29sb3JbdGhpcy52YWx1ZV0pIHtcclxuICAgICAgICAvLyAgICAgICAgICAgICB0aGlzLmFjdGl2ZUljb24/LmNoYW5nZVZpc2liaWxpdHlUb1Zpc2libGUoKTtcclxuICAgICAgICAvLyAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgdGhpcy5hY3RpdmVJY29uPy5jaGFuZ2VWaXNpYmlsaXR5VG9IaWRkZW4oKTtcclxuICAgICAgICAvLyAgICAgICAgIH1cclxuICAgICAgICAvLyAgICAgfVxyXG5cclxuICAgICAgICAvLyAgICAgaWYgKHRoaXMuY29tbWFuZCA9PSBDb21tYW5kcy50b2dnbGVGb3JlQ29sb3IpIHtcclxuXHJcbiAgICAgICAgLy8gICAgICAgICBpZiAoIXRoaXMudmFsdWUpIHtcclxuICAgICAgICAvLyAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbG9yIHZhbHVlIG11c3QgYmUgcHJvdmlkZWQgZm9yIHRoZSAnY29yZUNvbG9yJyBjb21tYW5kLiBFYWNoICdMaXN0TWVudUl0ZW0nIG11c3Qgc3BlY2lmeSBhIGNvbG9yIHJlcHJlc2VudGluZyB0aGUgdGV4dCBjb2xvci5cIik7XHJcbiAgICAgICAgLy8gICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vICAgICAgICAgaWYgKHN0YXRlcy5mb3JlQ29sb3JbdGhpcy52YWx1ZV0pIHtcclxuICAgICAgICAvLyAgICAgICAgICAgICB0aGlzLmFjdGl2ZUljb24/LmNoYW5nZVZpc2liaWxpdHlUb1Zpc2libGUoKTtcclxuICAgICAgICAvLyAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgdGhpcy5hY3RpdmVJY29uPy5jaGFuZ2VWaXNpYmlsaXR5VG9IaWRkZW4oKTtcclxuICAgICAgICAvLyAgICAgICAgIH1cclxuICAgICAgICAvLyAgICAgfVxyXG5cclxuICAgICAgICAvLyAgICAgaWYgKHRoaXMuY29tbWFuZCA9PSBDb21tYW5kcy50b2dnbGVDZWxsSGlsaXRlQ29sb3IpIHtcclxuXHJcbiAgICAgICAgLy8gICAgICAgICBpZiAoIXRoaXMudmFsdWUpIHtcclxuICAgICAgICAvLyAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbG9yIHZhbHVlIG11c3QgYmUgcHJvdmlkZWQgZm9yIHRoZSAnY29yZUNvbG9yJyBjb21tYW5kLiBFYWNoICdMaXN0TWVudUl0ZW0nIG11c3Qgc3BlY2lmeSBhIGNvbG9yIHJlcHJlc2VudGluZyB0aGUgdGV4dCBjb2xvci5cIik7XHJcbiAgICAgICAgLy8gICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vICAgICAgICAgaWYgKHN0YXRlcy5jZWxsSGlsaXRlQ29sb3JbdGhpcy52YWx1ZV0pIHtcclxuICAgICAgICAvLyAgICAgICAgICAgICB0aGlzLmFjdGl2ZUljb24/LmNoYW5nZVZpc2liaWxpdHlUb1Zpc2libGUoKTtcclxuICAgICAgICAvLyAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgdGhpcy5hY3RpdmVJY29uPy5jaGFuZ2VWaXNpYmlsaXR5VG9IaWRkZW4oKTtcclxuICAgICAgICAvLyAgICAgICAgIH1cclxuICAgICAgICAvLyAgICAgfVxyXG5cclxuICAgICAgICAvLyB9KTtcclxuXHJcbiAgICAgICAgLy8gZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihDdXN0b21FdmVudHMudGFibGVDZWxsQ2hhbmdlZCwgKGV2ZW50OiBFdmVudCkgPT4ge1xyXG5cclxuICAgICAgICAvLyAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBldmVudCBhcyBDdXN0b21FdmVudDxJRm9ybWF0Q29tbWFuZD47XHJcbiAgICAgICAgLy8gICAgIGNvbnN0IHN0YXRlcyA9IGN1c3RvbUV2ZW50LmRldGFpbDtcclxuXHJcblxyXG4gICAgICAgIC8vICAgICBpZiAodGhpcy5jb21tYW5kID09IENvbW1hbmRzLnRvZ2dsZUNlbGxIaWxpdGVDb2xvcikge1xyXG5cclxuICAgICAgICAvLyAgICAgICAgIGlmICghdGhpcy52YWx1ZSkge1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29sb3IgdmFsdWUgbXVzdCBiZSBwcm92aWRlZCBmb3IgdGhlICdjb3JlQ29sb3InIGNvbW1hbmQuIEVhY2ggJ0xpc3RNZW51SXRlbScgbXVzdCBzcGVjaWZ5IGEgY29sb3IgcmVwcmVzZW50aW5nIHRoZSB0ZXh0IGNvbG9yLlwiKTtcclxuICAgICAgICAvLyAgICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gICAgICAgICBpZiAoc3RhdGVzLmNlbGxIaWxpdGVDb2xvclt0aGlzLnZhbHVlXSkge1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIHRoaXMuYWN0aXZlSWNvbj8uY2hhbmdlVmlzaWJpbGl0eVRvVmlzaWJsZSgpO1xyXG4gICAgICAgIC8vICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyAgICAgICAgICAgICB0aGlzLmFjdGl2ZUljb24/LmNoYW5nZVZpc2liaWxpdHlUb0hpZGRlbigpO1xyXG4gICAgICAgIC8vICAgICAgICAgfVxyXG4gICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgLy8gfSk7XHJcblxyXG5cclxuICAgICAgICAvLyBwcml2YXRlIGhhbmRsZUNvbW1hbmRFdmVudCA9IChldmVudDogQ3VzdG9tRXZlbnQ8SUNvbW1hbmRFdmVudERldGFpbD4pOiB2b2lkID0+IHtcclxuICAgICAgICAvLyAgICAgY29uc3QgeyBjb21tYW5kLCBzaG93VUksIHZhbHVlLCB0YXJnZXRCbG9ja1R5cGUgfSA9IGV2ZW50LmRldGFpbDtcclxuXHJcblxyXG4gICAgICAgIC8vIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJzZWxlY3Rpb25jaGFuZ2VcIiwgYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgIC8vICAgICBpZiAoXHJcbiAgICAgICAgLy8gICAgICAgICB0aGlzLmNvbW1hbmQgPT0gVGV4dE9wZXJhdGlvblNlcnZpY2UuUVVFUllfVEVYVF9PUEVSQVRJT05TLkhJTElURV9DT0xPUiB8fFxyXG4gICAgICAgIC8vICAgICAgICAgdGhpcy5jb21tYW5kID09IFRleHRPcGVyYXRpb25TZXJ2aWNlLlFVRVJZX1RFWFRfT1BFUkFUSU9OUy5GT1JFX0NPTE9SKSB7XHJcblxyXG4gICAgICAgIC8vICAgICAgICAgYXdhaXQgdGhpcy5jaGFuZ2VDaGVja0ljb25WaXNpYmlsaXR5KCk7XHJcbiAgICAgICAgLy8gICAgIH1cclxuICAgICAgICAvLyB9KTtcclxuXHJcbiAgICAgICAgLy8gZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNvbG9yQ2hhbmdlXCIsIGFzeW5jICgpID0+IHtcclxuICAgICAgICAvLyAgICAgaWYgKFxyXG4gICAgICAgIC8vICAgICAgICAgdGhpcy5jb21tYW5kID09IFRleHRPcGVyYXRpb25TZXJ2aWNlLlFVRVJZX1RFWFRfT1BFUkFUSU9OUy5ISUxJVEVfQ09MT1IgfHxcclxuICAgICAgICAvLyAgICAgICAgIHRoaXMuY29tbWFuZCA9PSBUZXh0T3BlcmF0aW9uU2VydmljZS5RVUVSWV9URVhUX09QRVJBVElPTlMuRk9SRV9DT0xPUikge1xyXG5cclxuICAgICAgICAvLyAgICAgICAgIGF3YWl0IHRoaXMuY2hhbmdlQ2hlY2tJY29uVmlzaWJpbGl0eSgpO1xyXG4gICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgLy8gfSk7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8vIG5vcm1hbGl6ZUFuZE1lcmdlRWxlbWVudHMoZWxlbWVudDogSFRNTEVsZW1lbnQgfCBudWxsKTogdm9pZCB7XHJcbiAgICAvLyAgICAgaWYgKCFlbGVtZW50KSByZXR1cm47XHJcblxyXG4gICAgLy8gICAgIGxldCBjaGlsZCA9IGVsZW1lbnQuZmlyc3RDaGlsZDtcclxuICAgIC8vICAgICB3aGlsZSAoY2hpbGQpIHtcclxuICAgIC8vICAgICAgICAgaWYgKGNoaWxkLm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSkge1xyXG4gICAgLy8gICAgICAgICAgICAgdGhpcy5ub3JtYWxpemVBbmRNZXJnZUVsZW1lbnRzKGNoaWxkIGFzIEhUTUxFbGVtZW50KTtcclxuICAgIC8vICAgICAgICAgfVxyXG5cclxuICAgIC8vICAgICAgICAgbGV0IG5leHRTaWJsaW5nID0gY2hpbGQubmV4dFNpYmxpbmc7XHJcbiAgICAvLyAgICAgICAgIHdoaWxlIChuZXh0U2libGluZyAmJiB0aGlzLnNob3VsZE1lcmdlKGNoaWxkLCBuZXh0U2libGluZykpIHtcclxuICAgIC8vICAgICAgICAgICAgIChjaGlsZCBhcyBIVE1MRWxlbWVudCkuaW5uZXJIVE1MICs9IChuZXh0U2libGluZyBhcyBIVE1MRWxlbWVudCkuaW5uZXJIVE1MO1xyXG4gICAgLy8gICAgICAgICAgICAgY29uc3QgbmV4dCA9IG5leHRTaWJsaW5nLm5leHRTaWJsaW5nO1xyXG4gICAgLy8gICAgICAgICAgICAgbmV4dFNpYmxpbmcucGFyZW50Tm9kZSEucmVtb3ZlQ2hpbGQobmV4dFNpYmxpbmcpO1xyXG4gICAgLy8gICAgICAgICAgICAgbmV4dFNpYmxpbmcgPSBuZXh0O1xyXG4gICAgLy8gICAgICAgICB9XHJcblxyXG4gICAgLy8gICAgICAgICBjaGlsZCA9IGNoaWxkLm5leHRTaWJsaW5nO1xyXG4gICAgLy8gICAgIH1cclxuXHJcbiAgICAvLyAgICAgZWxlbWVudC5ub3JtYWxpemUoKTtcclxuICAgIC8vIH1cclxuXHJcbiAgICAvLyBzaG91bGRNZXJnZShub2RlMTogQ2hpbGROb2RlLCBub2RlMjogQ2hpbGROb2RlKTogYm9vbGVhbiB7XHJcbiAgICAvLyAgICAgaWYgKG5vZGUxPy5ub2RlVHlwZSAhPT0gTm9kZS5FTEVNRU5UX05PREUgfHwgbm9kZTI/Lm5vZGVUeXBlICE9PSBOb2RlLkVMRU1FTlRfTk9ERSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgLy8gICAgIGNvbnN0IGVsZW0xID0gbm9kZTEgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAvLyAgICAgY29uc3QgZWxlbTIgPSBub2RlMiBhcyBIVE1MRWxlbWVudDtcclxuICAgIC8vICAgICByZXR1cm4gZWxlbTEudGFnTmFtZSA9PT0gZWxlbTIudGFnTmFtZSAmJlxyXG4gICAgLy8gICAgICAgICBlbGVtMS5zdHlsZS5jc3NUZXh0ID09PSBlbGVtMi5zdHlsZS5jc3NUZXh0ICYmXHJcbiAgICAvLyAgICAgICAgIHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsZW0xKS5jb2xvciA9PT0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWxlbTIpLmNvbG9yO1xyXG4gICAgLy8gfVxyXG5cclxuXHJcbiAgICAvLyBhc3luYyBjaGFuZ2VDaGVja0ljb25WaXNpYmlsaXR5KCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgLy8gICAgIHRyeSB7XHJcbiAgICAvLyAgICAgICAgIGNvbnN0IGlzQWN0aXZlID0gYXdhaXQgdGhpcy50ZXh0T3BlcmF0aW9uU2VydmljZS5xdWVyeUNvbW1hbmRTdGF0ZSh0aGlzLmNvbW1hbmQsIHRoaXMudmFsdWUpO1xyXG4gICAgLy8gICAgICAgICBpZiAoaXNBY3RpdmUpIHtcclxuICAgIC8vICAgICAgICAgICAgIHRoaXMuYWN0aXZlSWNvbj8uY2hhbmdlVmlzaWJpbGl0eVRvVmlzaWJsZSgpO1xyXG4gICAgLy8gICAgICAgICB9IGVsc2Uge1xyXG4gICAgLy8gICAgICAgICAgICAgdGhpcy5hY3RpdmVJY29uPy5jaGFuZ2VWaXNpYmlsaXR5VG9IaWRkZW4oKTtcclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAvLyAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJGYWlsZWQgdG8gcXVlcnkgY29tbWFuZCBzdGF0ZTpcIiwgZXJyb3IpO1xyXG4gICAgLy8gICAgIH1cclxuICAgIC8vIH1cclxuXHJcblxyXG5cclxuICAgIGF0dGFjaFVJRXZlbnQoKSB7XHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihDdXN0b21VSUV2ZW50cy5TaG93SGlkZUFjdGl2ZUJ1dHRvbiwgdGhpcy5oYW5kbGVTaG93SGlkZUFjdGl2ZUJ1dHRvbkV2ZW50LmJpbmQodGhpcykpO1xyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoQ3VzdG9tVUlFdmVudHMuUmVzZXRBY3RpdmVCdXR0b25zLCB0aGlzLmhhbmRsZVJlc2V0QWN0aXZlQnV0dG9uc0V2ZW50LmJpbmQodGhpcykpO1xyXG4gICAgfVxyXG5cclxuICAgIGhhbmRsZVNob3dIaWRlQWN0aXZlQnV0dG9uRXZlbnQoZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBldmVudCBhcyBDdXN0b21FdmVudDxJVUlFdmVudERldGFpbD47XHJcbiAgICAgICAgY29uc3QgZGV0YWlscyA9IGN1c3RvbUV2ZW50LmRldGFpbDtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuY2xhc3NMaXN0Py5pbmNsdWRlcyhkZXRhaWxzLnRhcmdldENsYXNzISkpIHtcclxuXHJcbiAgICAgICAgICAgIC8vIGlmKCEoZGV0YWlscy5hY3Rpb24gaW5zdGFuY2VvZiBTaG93SGlkZUFjdGl2ZUJ1dHRvbikpe1xyXG4gICAgICAgICAgICAvLyAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAvLyB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCBldmVudFZhbHVlcyA9IChkZXRhaWxzLmFjdGlvbiBhcyBTaG93SGlkZUFjdGl2ZUJ1dHRvbik7XHJcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50Q29sb3IgPSBldmVudFZhbHVlcy52YWx1ZTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnZhbHVlPy50b0xvd2VyQ2FzZSgpID09IGV2ZW50Q29sb3IudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50VmFsdWVzLmludGVudGlvbiA9PSBcInNob3dcIikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlSWNvbj8uY2hhbmdlVmlzaWJpbGl0eVRvVmlzaWJsZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGhhbmRsZVJlc2V0QWN0aXZlQnV0dG9uc0V2ZW50KGV2ZW50OiBFdmVudCkge1xyXG4gICAgICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gZXZlbnQgYXMgQ3VzdG9tRXZlbnQ8SVVJRXZlbnREZXRhaWw+O1xyXG4gICAgICAgIGNvbnN0IGRldGFpbHMgPSBjdXN0b21FdmVudC5kZXRhaWw7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmNsYXNzTGlzdD8uaW5jbHVkZXMoZGV0YWlscy50YXJnZXRDbGFzcyEpKSB7XHJcblxyXG4gICAgICAgICAgICAvLyBpZighKGRldGFpbHMuYWN0aW9uIGluc3RhbmNlb2YgUmVzZXRBY3RpdmVCdXR0b25zKSl7XHJcbiAgICAgICAgICAgIC8vICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIC8vIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlSWNvbj8uY2hhbmdlVmlzaWJpbGl0eVRvSGlkZGVuKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIGdldExlZnRJY29uQmFja2dyb3VuZENvbG9yKCk6IHN0cmluZyB8IG51bGwge1xyXG5cclxuICAgIC8vICAgICBpZiAodGhpcy5sZWZ0SWNvbikge1xyXG5cclxuICAgIC8vICAgICAgICAgY29uc3Qgc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLmxlZnRJY29uKTtcclxuICAgIC8vICAgICAgICAgY29uc3QgcmdiQ29sb3IgPSBzdHlsZS5iYWNrZ3JvdW5kQ29sb3I7XHJcblxyXG4gICAgLy8gICAgICAgICBjb25zdCBoZXhDb2xvciA9IFV0aWxzLnJnYlRvSGV4KHJnYkNvbG9yKS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xyXG4gICAgLy8gICAgICAgICByZXR1cm4gaGV4Q29sb3I7XHJcbiAgICAvLyAgICAgfVxyXG5cclxuICAgIC8vICAgICByZXR1cm4gbnVsbDtcclxuICAgIC8vIH1cclxuXHJcbiAgICAvLyBnZXRMZWZ0SWNvbkNvbG9yKCk6IHN0cmluZyB8IG51bGwge1xyXG5cclxuICAgIC8vICAgICBpZiAodGhpcy5sZWZ0SWNvbikge1xyXG5cclxuICAgIC8vICAgICAgICAgY29uc3Qgc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLmxlZnRJY29uKTtcclxuICAgIC8vICAgICAgICAgY29uc3QgcmdiQ29sb3IgPSBzdHlsZS5iYWNrZ3JvdW5kQ29sb3I7XHJcblxyXG4gICAgLy8gICAgICAgICBjb25zdCBoZXhDb2xvciA9IFV0aWxzLnJnYlRvSGV4KHJnYkNvbG9yKS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xyXG4gICAgLy8gICAgICAgICByZXR1cm4gaGV4Q29sb3I7XHJcbiAgICAvLyAgICAgfVxyXG5cclxuICAgIC8vICAgICByZXR1cm4gbnVsbDtcclxuICAgIC8vIH1cclxuXHJcblxyXG4gICAgLy8gY2hhbmdlQWN0aXZlSWNvblRvVmlzaWJsZSgpOiB2b2lkIHtcclxuICAgIC8vICAgICB0aGlzLmFjdGl2ZUljb24/LmNoYW5nZVZpc2liaWxpdHlUb1Zpc2libGUoKTtcclxuICAgIC8vIH1cclxufSIsImltcG9ydCB7IEJhc2VVSUNvbXBvbmVudCB9IGZyb20gXCIuLi8uLi9jb21tb24vQmFzZVVJQ29tcG9uZW50XCI7XHJcbmltcG9ydCB7IENpcmN1bGFyRG91Ymx5TGlua2VkTGlzdCB9IGZyb20gXCIuLi8uLi8uLi9jb21tb24vQ2lyY3VsYXJEb3VibHlMaW5rZWRMaXN0XCI7XHJcbmltcG9ydCB7IERyb3Bkb3duTWVudUxpc3RJdGVtIH0gZnJvbSBcIi4vRHJvcGRvd25NZW51TGlzdEl0ZW1cIjtcclxuaW1wb3J0IHsgSURyb3Bkb3duTWVudUl0ZW0gfSBmcm9tIFwiLi9JRHJvcGRvd25NZW51SXRlbVwiO1xyXG5pbXBvcnQgeyBKTm9kZSB9IGZyb20gXCJAL2NvbW1vbi9KTm9kZVwiO1xyXG5pbXBvcnQgeyBEcm9wZG93bk1lbnVCdXR0b24gfSBmcm9tIFwiLi9Ecm9wZG93bk1lbnVCdXR0b25cIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBEcm9wZG93bk1lbnVMaXN0IGV4dGVuZHMgQmFzZVVJQ29tcG9uZW50IHtcclxuXHJcbiAgICByZWFkb25seSBpZDogc3RyaW5nO1xyXG4gICAgcHJpdmF0ZSBwYXJlbnREcm9wZG93blBhcmVudEJ1dHRvbj86IERyb3Bkb3duTWVudUJ1dHRvbjtcclxuXHJcbiAgICBkcm9wZG93bkl0ZW1zOiBDaXJjdWxhckRvdWJseUxpbmtlZExpc3Q8SURyb3Bkb3duTWVudUl0ZW0+O1xyXG4gICAgY3VycmVudEZvY3VzZWRNZW51SXRlbTogSk5vZGU8SURyb3Bkb3duTWVudUl0ZW0+IHwgbnVsbDtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihpZDogc3RyaW5nKSB7XHJcblxyXG4gICAgICAgIHN1cGVyKHtcclxuICAgICAgICAgICAgaWQ6IGlkXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuaWQgPSBpZDtcclxuICAgICAgICB0aGlzLmRyb3Bkb3duSXRlbXMgPSBuZXcgQ2lyY3VsYXJEb3VibHlMaW5rZWRMaXN0PERyb3Bkb3duTWVudUxpc3RJdGVtPigpO1xyXG4gICAgICAgIHRoaXMuY3VycmVudEZvY3VzZWRNZW51SXRlbSA9IG51bGw7XHJcblxyXG4gICAgICAgIHRoaXMuYXR0YWNoRXZlbnRzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGRpc3BsYXkoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gJ2ZsZXgnO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXQoKTogSFRNTEVsZW1lbnQge1xyXG5cclxuICAgICAgICBjb25zdCBodG1sRWxlbWVudDogSFRNTFVMaXN0RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3VsJyk7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuaWQgPSB0aGlzLnByb3BzLmlkO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LnNldEF0dHJpYnV0ZSgnbmFtZScsICdibG9jay10eXBlJyk7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuICAgICAgICBodG1sRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdzb2Z0LWJveC1zaGFkb3cnLCAnZGVwZW5kZW50LWJveCcsICdjaGVja2FibGUtaXRlbXMnKTtcclxuICAgICAgICBodG1sRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9IFwiYWJzb2x1dGVcIjtcclxuICAgICAgICBodG1sRWxlbWVudC5zdHlsZS5tYXhIZWlnaHQgPSBcIjI1dm1heFwiO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LnN0eWxlLm92ZXJmbG93WSA9IFwiYXV0b1wiO1xyXG5cclxuICAgICAgICByZXR1cm4gaHRtbEVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgYXBwZW5kKGRyb3Bkb3duSXRlbTogSURyb3Bkb3duTWVudUl0ZW0pOiB2b2lkIHtcclxuXHJcbiAgICAgICAgdGhpcy5kcm9wZG93bkl0ZW1zLmFwcGVuZChkcm9wZG93bkl0ZW0pO1xyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQoZHJvcGRvd25JdGVtLmh0bWxFbGVtZW50KVxyXG4gICAgfVxyXG5cclxuICAgIHNldFBhcmVudERyb3Bkb3duTWVudUJ1dHRvbihkcm9wZG93blBhcmVudEJ1dHRvbjogRHJvcGRvd25NZW51QnV0dG9uKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5wYXJlbnREcm9wZG93blBhcmVudEJ1dHRvbiA9IGRyb3Bkb3duUGFyZW50QnV0dG9uO1xyXG4gICAgfVxyXG5cclxuICAgIGF0dGFjaEV2ZW50cygpOiB2b2lkIHtcclxuXHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChldmVudCkgPT4ge1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuaXNWaXNpYmxlICYmIHRoaXMuY3VycmVudEZvY3VzZWRNZW51SXRlbSAmJiBldmVudC5rZXkgPT09IFwiRW50ZXJcIikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Rm9jdXNlZE1lbnVJdGVtLnZhbHVlLmVtaXRDb21tYW5kRXZlbnQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChldmVudCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5jbGlja2VkT3V0c2lkZVRoZURyb3Bkb3duV2hpbGVEcm9wZG93bklzVmlzaWJsZShldmVudCkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZXZlbnQpID0+IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMua2V5UHJlc3NlZE91dHNpZGVUaGVEcm9wZG93bldoaWxlRHJvcGRvd25Jc1Zpc2libGUoZXZlbnQpKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50LmtleSA9PSBcIkFycm93RG93blwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mb2N1c05leHRWaXNpYmxlSXRlbSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChldmVudC5rZXkgPT0gXCJBcnJvd1VwXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZm9jdXNQcmV2aW91c1Zpc2libGVJdGVtKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBzaG93KCk6IHZvaWQge1xyXG5cclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLmxlZnQgPSBcIjBcIjtcclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLnJpZ2h0ID0gXCJhdXRvXCI7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmRvZXNFbGVtZW50T3ZlcmZsb3dTY3JlZW4pIHtcclxuICAgICAgICAgICAgdGhpcy5odG1sRWxlbWVudC5zdHlsZS5sZWZ0ID0gXCJhdXRvXCI7XHJcbiAgICAgICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUucmlnaHQgPSBcIjBcIjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMucGFyZW50RHJvcGRvd25QYXJlbnRCdXR0b24/LnN2Z0ljb24/LnNldFVzZVRvKFwiaWNvbi13b3JkcHJlc3MtY2hldnJvbi11cFwiKTtcclxuICAgICAgICBzdXBlci5zaG93KCk7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIGhpZGUoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5wYXJlbnREcm9wZG93blBhcmVudEJ1dHRvbj8uc3ZnSWNvbj8uc2V0VXNlVG8oXCJpY29uLXdvcmRwcmVzcy1jaGV2cm9uLWRvd25cIik7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50Rm9jdXNlZE1lbnVJdGVtPy52YWx1ZS5yZW1vdmVGb2N1cygpO1xyXG4gICAgICAgIHRoaXMuY3VycmVudEZvY3VzZWRNZW51SXRlbSA9IG51bGw7XHJcbiAgICAgICAgc3VwZXIuaGlkZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHN3aXRjaFZpc3VhbEZvY3VzKGl0ZW06IEpOb2RlPElEcm9wZG93bk1lbnVJdGVtPik6IHZvaWQge1xyXG5cclxuICAgICAgICBpZiAodGhpcy5jdXJyZW50Rm9jdXNlZE1lbnVJdGVtID09IGl0ZW0pIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudEZvY3VzZWRNZW51SXRlbSkge1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRGb2N1c2VkTWVudUl0ZW0udmFsdWUucmVtb3ZlRm9jdXMoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuY3VycmVudEZvY3VzZWRNZW51SXRlbSA9IGl0ZW07XHJcbiAgICAgICAgdGhpcy5jdXJyZW50Rm9jdXNlZE1lbnVJdGVtLnZhbHVlLmZvY3VzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBmb2N1c05leHRWaXNpYmxlSXRlbSgpOiB2b2lkIHtcclxuXHJcbiAgICAgICAgbGV0IG5leHRWaXNpYmxlSXRlbTogSk5vZGU8SURyb3Bkb3duTWVudUl0ZW0+IHwgbnVsbDtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudEZvY3VzZWRNZW51SXRlbSkge1xyXG4gICAgICAgICAgICBuZXh0VmlzaWJsZUl0ZW0gPSB0aGlzLmN1cnJlbnRGb2N1c2VkTWVudUl0ZW0uZ2V0TmV4dFNhdGlzZnlpbmcoaXRlbSA9PiBpdGVtIGluc3RhbmNlb2YgRHJvcGRvd25NZW51TGlzdEl0ZW0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIG5leHRWaXNpYmxlSXRlbSA9IHRoaXMuZHJvcGRvd25JdGVtcy5maW5kRmlyc3QoaXRlbSA9PiBpdGVtIGluc3RhbmNlb2YgRHJvcGRvd25NZW51TGlzdEl0ZW0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5zd2l0Y2hWaXN1YWxGb2N1cyhuZXh0VmlzaWJsZUl0ZW0hKTtcclxuICAgIH1cclxuXHJcbiAgICBmb2N1c1ByZXZpb3VzVmlzaWJsZUl0ZW0oKTogdm9pZCB7XHJcblxyXG4gICAgICAgIGxldCBwcmV2aW91c1Zpc2libGVJdGVtOiBKTm9kZTxJRHJvcGRvd25NZW51SXRlbT4gfCBudWxsO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5jdXJyZW50Rm9jdXNlZE1lbnVJdGVtKSB7XHJcbiAgICAgICAgICAgIHByZXZpb3VzVmlzaWJsZUl0ZW0gPSB0aGlzLmN1cnJlbnRGb2N1c2VkTWVudUl0ZW0uZ2V0UHJldmlvdXNTYXRpc2Z5aW5nKGl0ZW0gPT4gaXRlbSBpbnN0YW5jZW9mIERyb3Bkb3duTWVudUxpc3RJdGVtKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBwcmV2aW91c1Zpc2libGVJdGVtID0gdGhpcy5kcm9wZG93bkl0ZW1zLmZpbmRGaXJzdChpdGVtID0+IGl0ZW0gaW5zdGFuY2VvZiBEcm9wZG93bk1lbnVMaXN0SXRlbSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnN3aXRjaFZpc3VhbEZvY3VzKHByZXZpb3VzVmlzaWJsZUl0ZW0hKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNsaWNrZWRPdXRzaWRlVGhlRHJvcGRvd25XaGlsZURyb3Bkb3duSXNWaXNpYmxlKGV2ZW50OiBNb3VzZUV2ZW50KTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FuSGlkZVxyXG4gICAgICAgICAgICAmJiAhKGV2ZW50LnRhcmdldCEgYXMgSFRNTEVsZW1lbnQpLmNsb3Nlc3QoYCMke3RoaXMuaHRtbEVsZW1lbnQuaWR9YClcclxuICAgICAgICAgICAgJiYgIShldmVudC50YXJnZXQhIGFzIEhUTUxFbGVtZW50KS5jbG9zZXN0KGAjJHt0aGlzLnBhcmVudERyb3Bkb3duUGFyZW50QnV0dG9uPy5odG1sRWxlbWVudC5pZH1gKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGtleVByZXNzZWRPdXRzaWRlVGhlRHJvcGRvd25XaGlsZURyb3Bkb3duSXNWaXNpYmxlKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FuSGlkZVxyXG4gICAgICAgICAgICAmJiAhKGV2ZW50LnRhcmdldCEgYXMgSFRNTEVsZW1lbnQpLmNsb3Nlc3QoYCMke3RoaXMuaHRtbEVsZW1lbnQuaWR9YClcclxuICAgICAgICAgICAgJiYgIShldmVudC50YXJnZXQhIGFzIEhUTUxFbGVtZW50KS5jbG9zZXN0KGAjJHt0aGlzLnBhcmVudERyb3Bkb3duUGFyZW50QnV0dG9uPy5odG1sRWxlbWVudC5pZH1gKTtcclxuICAgIH1cclxuXHJcbn0iLCJpbXBvcnQgeyBCYXNlVUlDb21wb25lbnQgfSBmcm9tIFwiLi4vLi4vY29tbW9uL0Jhc2VVSUNvbXBvbmVudFwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIEZsb2F0aW5nVG9vbGJhclNlcGFyYXRvciBleHRlbmRzIEJhc2VVSUNvbXBvbmVudCB7XHJcblxyXG4gICAgaWQ6IHN0cmluZztcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihpZDogc3RyaW5nKSB7XHJcbiAgICAgICAgc3VwZXIoe2lkOiBpZH0pO1xyXG5cclxuICAgICAgICB0aGlzLmlkID0gaWQ7XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdCgpOiBIVE1MRWxlbWVudCB7XHJcblxyXG4gICAgICAgIGNvbnN0IGh0bWxFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICBodG1sRWxlbWVudC5pZCA9IHRoaXMucHJvcHMuaWQ7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gXCIyNHB4XCI7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuc3R5bGUud2lkdGggPSBcIjFweFwiO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LnN0eWxlLmJvcmRlclJpZ2h0ID0gXCIxcHggc29saWQgI2QwZDBkMFwiO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LnN0eWxlLm1hcmdpbiA9IFwiYXV0byA2cHhcIjtcclxuXHJcbiAgICAgICAgcmV0dXJuIGh0bWxFbGVtZW50O1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgQmFzZVVJQ29tcG9uZW50IH0gZnJvbSBcIi4uLy4uL2NvbW1vbi9CYXNlVUlDb21wb25lbnRcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBCdXR0b25Hcm91cCBleHRlbmRzIEJhc2VVSUNvbXBvbmVudCB7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcblxyXG4gICAgICAgIHN1cGVyKHt9KTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0KCk6IEhUTUxFbGVtZW50IHtcclxuXHJcbiAgICAgICAgY29uc3QgaHRtbEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJpdGVtXCIpO1xyXG4gICAgICAgIC8vIGh0bWxFbGVtZW50LnN0eWxlLm1hcmdpbkxlZnQgPSBcIjEwcHhcIjtcclxuICAgICAgICAvLyBodG1sRWxlbWVudC5zdHlsZS5tYXJnaW5SaWdodCA9IFwiMTBweFwiO1xyXG5cclxuICAgICAgICByZXR1cm4gaHRtbEVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG59IiwiaW1wb3J0IHsgU1ZHSWNvbiB9IGZyb20gXCIuLi8uLi9jb21tb24vU1ZHSWNvblwiO1xuaW1wb3J0IHsgQmFzZVVJQ29tcG9uZW50IH0gZnJvbSBcIi4uLy4uL2NvbW1vbi9CYXNlVUlDb21wb25lbnRcIjtcbmltcG9ydCB7IENvbG9ycyB9IGZyb20gXCIuLi8uLi8uLi9jb21tb24vQ29sb3JzXCI7XG5pbXBvcnQgeyBDdXN0b21FdmVudHMgfSBmcm9tIFwiQC9jb21tb24vQ3VzdG9tRXZlbnRzXCI7XG5pbXBvcnQgeyBJQ29tbWFuZEV2ZW50RGV0YWlsIH0gZnJvbSBcIkAvY29tbWFuZHMvSUNvbW1hbmRFdmVudERldGFpbFwiO1xuaW1wb3J0IHsgQ29tbWFuZHMgfSBmcm9tIFwiQC9jb21tYW5kcy9Db21tYW5kc1wiO1xuaW1wb3J0IHsgQ3VzdG9tVUlFdmVudHMgfSBmcm9tIFwiQC9jb21tb24vQ3VzdG9tVUlFdmVudHNcIjtcbmltcG9ydCB7IElVSUV2ZW50RGV0YWlsIH0gZnJvbSBcIkAvY29tbWFuZHMvSVVJRXZlbnREZXRhaWxcIjtcbmltcG9ydCB7IENoYW5nZUNvbG9yIH0gZnJvbSBcIkAvY29tbWFuZHMvVUlBY3Rpb25zL0NoYW5nZUNvbG9yXCI7XG5cbmV4cG9ydCBjbGFzcyBCdXR0b25Hcm91cEl0ZW0gZXh0ZW5kcyBCYXNlVUlDb21wb25lbnQge1xuXG4gICAgcHJpdmF0ZSBpZDogc3RyaW5nO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgY29tbWFuZDogc3RyaW5nO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgc2hvd1VJOiBib29sZWFuO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgaWNvbjogU1ZHSWNvbjtcblxuICAgIGNvbnN0cnVjdG9yKGlkOiBzdHJpbmcsIGNvbW1hbmQ6IHN0cmluZywgdGl0bGU6IHN0cmluZywgaWNvbjogU1ZHSWNvbikge1xuXG4gICAgICAgIHN1cGVyKHtcbiAgICAgICAgICAgIGlkOiBpZCxcbiAgICAgICAgICAgIHRpdGxlOiB0aXRsZSxcbiAgICAgICAgICAgIGljb246IGljb25cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5pZCA9IGlkO1xuICAgICAgICB0aGlzLmNvbW1hbmQgPSBjb21tYW5kO1xuICAgICAgICB0aGlzLnNob3dVSSA9IGNvbW1hbmQgPT0gQ29tbWFuZHMudG9nZ2xlTGluaztcbiAgICAgICAgdGhpcy5pY29uID0gaWNvbjtcbiAgICAgICAgdGhpcy5hdHRhY2hFdmVudHMoKTtcbiAgICB9XG5cbiAgICBpbml0KCk6IEhUTUxFbGVtZW50IHtcblxuICAgICAgICBjb25zdCBodG1sRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIik7XG5cbiAgICAgICAgaHRtbEVsZW1lbnQuY2xhc3NMaXN0LmFkZChcImVudHJ5XCIsIFwiYnV0dG9uLXJlc2V0XCIsIFwidGV4dC1mb3JtYXR0aW5nLW9wZXJhdGlvblwiLCBcIm9wdGlvbi1ob3ZlclwiKTtcbiAgICAgICAgaHRtbEVsZW1lbnQudGl0bGUgPSB0aGlzLnByb3BzLnRpdGxlO1xuICAgICAgICBodG1sRWxlbWVudC50YWJJbmRleCA9IDE7XG5cbiAgICAgICAgaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5wcm9wcy5pY29uLmh0bWxFbGVtZW50KTtcblxuICAgICAgICByZXR1cm4gaHRtbEVsZW1lbnQ7XG4gICAgfVxuXG4gICAgYXR0YWNoRXZlbnRzKCk6IHZvaWQge1xuXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50PElDb21tYW5kRXZlbnREZXRhaWw+KEN1c3RvbUV2ZW50cy5lbWl0dGVkQ29tbWFuZCwge1xuICAgICAgICAgICAgICAgIGRldGFpbDoge1xuICAgICAgICAgICAgICAgICAgICBjb21tYW5kOiB0aGlzLmNvbW1hbmQsXG4gICAgICAgICAgICAgICAgICAgIHNob3dVSTogdGhpcy5zaG93VUksXG5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoQ3VzdG9tRXZlbnRzLnRleHRGb3JtYXRDaGFuZ2VkLCAoZXZlbnQ6IEV2ZW50KSA9PiB7XG5cbiAgICAgICAgLy8gICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gZXZlbnQgYXMgQ3VzdG9tRXZlbnQ8SUZvcm1hdENvbW1hbmQ+O1xuICAgICAgICAvLyAgICAgY29uc3Qgc3RhdGVzID0gY3VzdG9tRXZlbnQuZGV0YWlsO1xuXG4gICAgICAgIC8vICAgICBpZiAoc3RhdGVzW3RoaXMuY29tbWFuZCBhcyBrZXlvZiBJRm9ybWF0Q29tbWFuZF0pIHtcbiAgICAgICAgLy8gICAgICAgICB0aGlzLmljb24uY2hhbmdlQ29sb3IoQ29sb3JzLkljb25BY3RpdmVCbHVlKTtcbiAgICAgICAgLy8gICAgIH0gZWxzZSB7XG4gICAgICAgIC8vICAgICAgICAgdGhpcy5pY29uLmNoYW5nZUNvbG9yKENvbG9ycy5JY29uRGVmYXVsdEJsYWNrKTtcbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gfSk7XG5cbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihDdXN0b21VSUV2ZW50cy5Db2xvckNoYW5nZVJlcXVlc3QsIChldmVudDogRXZlbnQpID0+IHtcblxuICAgICAgICAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBldmVudCBhcyBDdXN0b21FdmVudDxJVUlFdmVudERldGFpbD47XG4gICAgICAgICAgICBjb25zdCBkZXRhaWxzID0gY3VzdG9tRXZlbnQuZGV0YWlsO1xuXG4gICAgICAgICAgICBpZih0aGlzLmlkID09IGRldGFpbHMudGFyZ2V0SWQpe1xuICAgICAgICAgICAgICAgIHRoaXMuaWNvbi5jaGFuZ2VDb2xvcigoZGV0YWlscy5hY3Rpb24gYXMgQ2hhbmdlQ29sb3IpLmNvbG9yKVxuXG4gICAgICAgICAgICAgICAgLy8gaWYgKGRldGFpbHNbdGhpcy5jb21tYW5kIGFzIGtleW9mIElGb3JtYXRDb21tYW5kXSkge1xuICAgICAgICAgICAgICAgIC8vICAgICB0aGlzLmljb24uY2hhbmdlQ29sb3IoQ29sb3JzLkljb25BY3RpdmVCbHVlKTtcbiAgICAgICAgICAgICAgICAvLyB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vICAgICB0aGlzLmljb24uY2hhbmdlQ29sb3IoQ29sb3JzLkljb25EZWZhdWx0QmxhY2spO1xuICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc3RhdGljIGNyZWF0ZShpZDogc3RyaW5nLCBjb21tYW5kOiBzdHJpbmcsIHRpdGxlOiBzdHJpbmcsIGljb246IFNWR0ljb24pOiBCdXR0b25Hcm91cEl0ZW0ge1xuICAgICAgICByZXR1cm4gbmV3IEJ1dHRvbkdyb3VwSXRlbShpZCwgY29tbWFuZCwgdGl0bGUsIGljb24pO1xuICAgIH1cbn0iLCJpbXBvcnQgeyBCYXNlVUlDb21wb25lbnQgfSBmcm9tIFwiLi4vLi4vY29tbW9uL0Jhc2VVSUNvbXBvbmVudFwiOztcclxuXHJcbmV4cG9ydCBjbGFzcyBDb2xvckljb24gZXh0ZW5kcyBCYXNlVUlDb21wb25lbnQge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGNvbG9yOiBzdHJpbmcpIHtcclxuICAgICAgICBzdXBlcih7XHJcbiAgICAgICAgICAgIGNvbG9yOiBjb2xvclxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXQoKTogSFRNTEVsZW1lbnQge1xyXG5cclxuICAgICAgICBjb25zdCBodG1sRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcblxyXG4gICAgICAgIGh0bWxFbGVtZW50LnN0eWxlLndpZHRoID0gXCIxLjI1cmVtXCI7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gXCIxLjI1cmVtXCI7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuc3R5bGUuYm9yZGVyUmFkaXVzID0gXCI1MCVcIjtcclxuICAgICAgICBodG1sRWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSB0aGlzLnByb3BzLmNvbG9yO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LnN0eWxlLmJvcmRlciA9IFwiMXB4IHNvbGlkICNkMGQwZDBcIjtcclxuICAgICAgICBodG1sRWxlbWVudC5zdHlsZS5ib3hTaXppbmcgPSBcImJvcmRlci1ib3hcIjtcclxuXHJcbiAgICAgICAgcmV0dXJuIGh0bWxFbGVtZW50O1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgU1ZHSWNvbiB9IGZyb20gXCIuLi8uLi9jb21tb24vU1ZHSWNvblwiO1xyXG5pbXBvcnQgeyBCYXNlVUlDb21wb25lbnQgfSBmcm9tIFwiLi4vLi4vY29tbW9uL0Jhc2VVSUNvbXBvbmVudFwiO1xyXG5pbXBvcnQgeyBEcm9wZG93bk1lbnVMaXN0IH0gZnJvbSBcIi4vRHJvcGRvd25NZW51TGlzdFwiO1xyXG5pbXBvcnQgeyBTaXplcyB9IGZyb20gXCJAL2NvbW1vbi9TaXplc1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIERyb3Bkb3duTWVudUJ1dHRvbiBleHRlbmRzIEJhc2VVSUNvbXBvbmVudCB7XHJcblxyXG4gICAgZHJvcGRvd25MaXN0OiBEcm9wZG93bk1lbnVMaXN0O1xyXG4gICAgc3ZnSWNvbj86IFNWR0ljb247XHJcblxyXG4gICAgY29uc3RydWN0b3IoaWQ6IHN0cmluZywgdGl0bGU6IHN0cmluZyB8IEhUTUxFbGVtZW50LCBkcm9wZG93bkxpc3Q6IERyb3Bkb3duTWVudUxpc3QsIGluY2x1ZGVDaGV2cm9uSWNvbjogYm9vbGVhbiA9IHRydWUpIHtcclxuXHJcbiAgICAgICAgY29uc3Qgc3ZnSWNvbiA9IG5ldyBTVkdJY29uKFwiaWNvbi13b3JkcHJlc3MtY2hldnJvbi1kb3duXCIsIFNpemVzLm1lZGl1bSk7XHJcblxyXG4gICAgICAgIHN1cGVyKHtcclxuICAgICAgICAgICAgaWQ6IGlkLFxyXG4gICAgICAgICAgICB0aXRsZTogdGl0bGUsXHJcbiAgICAgICAgICAgIGRyb3Bkb3duTGlzdDogZHJvcGRvd25MaXN0LFxyXG4gICAgICAgICAgICBzdmdJY29uOiBpbmNsdWRlQ2hldnJvbkljb24gPyBzdmdJY29uIDogbnVsbFxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmRyb3Bkb3duTGlzdCA9IGRyb3Bkb3duTGlzdDtcclxuICAgICAgICB0aGlzLnN2Z0ljb24gPSBzdmdJY29uO1xyXG4gICAgICAgIHRoaXMuYXR0YWNoRXZlbnRzKCk7XHJcblxyXG4gICAgICAgIGRyb3Bkb3duTGlzdC5zZXRQYXJlbnREcm9wZG93bk1lbnVCdXR0b24odGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdCgpOiBIVE1MRWxlbWVudCB7XHJcblxyXG4gICAgICAgIGNvbnN0IGh0bWxFbGVtZW50OiBIVE1MQnV0dG9uRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LmlkID0gdGhpcy5wcm9wcy5pZDtcclxuICAgICAgICAvLyBodG1sRWxlbWVudC50aXRsZSA9IHRoaXMucHJvcHMudGl0bGVcclxuICAgICAgICBodG1sRWxlbWVudC5yb2xlID0gXCJidXR0b25cIjtcclxuICAgICAgICBodG1sRWxlbWVudC5jbGFzc0xpc3QuYWRkKFwiYnV0dG9uLXJlc2V0XCIsIFwidGV4dC1mb3JtYXR0aW5nLXNlbGVjdC1idXR0b25cIiwgXCJ0ZXh0LWZvcm1hdHRpbmctb3BlcmF0aW9uXCIsIFwib3B0aW9uLWhvdmVyXCIpO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LnRhYkluZGV4ID0gMTtcclxuICAgICAgICBodG1sRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9IFwicmVsYXRpdmVcIjtcclxuICAgICAgICBodG1sRWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJhcmlhLWNvbnRyb2xzXCIsIHRoaXMucHJvcHMuZHJvcGRvd25MaXN0Lmh0bWxFbGVtZW50LmlkKTtcclxuXHJcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnByb3BzLnRpdGxlID09PSBcInN0cmluZ1wiKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XHJcbiAgICAgICAgICAgIHNwYW4udGV4dENvbnRlbnQgPSB0aGlzLnByb3BzLnRpdGxlO1xyXG4gICAgICAgICAgICBodG1sRWxlbWVudC5hcHBlbmRDaGlsZChzcGFuKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBodG1sRWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLnByb3BzLnRpdGxlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnByb3BzLnN2Z0ljb24pIHtcclxuICAgICAgICAgICAgaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5wcm9wcy5zdmdJY29uLmh0bWxFbGVtZW50KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBodG1sRWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICBhdHRhY2hFdmVudHMoKTogdm9pZCB7XHJcblxyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmRyb3Bkb3duTGlzdC5pc1Zpc2libGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZHJvcGRvd25MaXN0LnNob3coKTtcclxuICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRyb3Bkb3duTGlzdC5oaWRlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICB9XHJcblxyXG5cclxuICAgIGdldCBkaXNwbGF5KCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuICdibG9jayc7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBCYXNlVUlDb21wb25lbnQgfSBmcm9tIFwiLi4vLi4vY29tbW9uL0Jhc2VVSUNvbXBvbmVudFwiO1xyXG5pbXBvcnQgeyBEcm9wZG93bk1lbnVMaXN0IH0gZnJvbSBcIi4vRHJvcGRvd25NZW51TGlzdFwiO1xyXG5pbXBvcnQgeyBJRHJvcGRvd25NZW51SXRlbSB9IGZyb20gXCIuL0lEcm9wZG93bk1lbnVJdGVtXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgRHJvcGRvd25NZW51TGlzdEl0ZW1UaXRsZSBleHRlbmRzIEJhc2VVSUNvbXBvbmVudCBpbXBsZW1lbnRzIElEcm9wZG93bk1lbnVJdGVtIHtcclxuXHJcblxyXG4gICAgcGFyZW50RHJvcGRvd25NZW51TGlzdDogRHJvcGRvd25NZW51TGlzdDtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihwYXJlbnREcm9wZG93bk1lbnVMaXN0OiBEcm9wZG93bk1lbnVMaXN0LCB0aXRsZTogc3RyaW5nKSB7XHJcblxyXG4gICAgICAgIHN1cGVyKHtcclxuICAgICAgICAgICAgdGl0bGU6IHRpdGxlXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMucGFyZW50RHJvcGRvd25NZW51TGlzdCA9IHBhcmVudERyb3Bkb3duTWVudUxpc3Q7XHJcbiAgICB9XHJcbiAgICBjaGFuZ2VBY3RpdmVJY29uVG9WaXNpYmxlKCk6IHZvaWQge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGdldExlZnRJY29uQmFja2dyb3VuZENvbG9yKCk6IHN0cmluZyB8IG51bGwge1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHJlc2V0QWN0aXZlSWNvbigpOiB2b2lkIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBcclxuICAgIGF0dGFjaE9uTG9zZUZvY3VzKGZ1bmM6ICgpID0+IHZvaWQpOiB2b2lkIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNZXRob2Qgbm90IGltcGxlbWVudGVkLlwiKTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgYXR0YWNoT25Gb2N1cyhmdW5jOiAoKSA9PiB2b2lkKTogdm9pZCB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC5cIik7XHJcbiAgICB9XHJcblxyXG4gICAgZW1pdENvbW1hbmRFdmVudCgpOiB2b2lkIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNZXRob2Qgbm90IGltcGxlbWVudGVkLlwiKTtcclxuICAgIH1cclxuXHJcbiAgICByZW1vdmVGb2N1cygpOiB2b2lkIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNZXRob2Qgbm90IGltcGxlbWVudGVkLlwiKTtcclxuICAgIH1cclxuXHJcbiAgICBmb2N1cygpOiB2b2lkIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNZXRob2Qgbm90IGltcGxlbWVudGVkLlwiKTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0KCk6IEhUTUxFbGVtZW50IHtcclxuXHJcbiAgICAgICAgY29uc3QgaHRtbEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaScpO1xyXG5cclxuICAgICAgICBjb25zdCB0aXRsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2gzJyk7XHJcbiAgICAgICAgdGl0bGUuaW5uZXJUZXh0ID0gdGhpcy5wcm9wcy50aXRsZTtcclxuXHJcbiAgICAgICAgaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQodGl0bGUpO1xyXG5cclxuICAgICAgICByZXR1cm4gaHRtbEVsZW1lbnQ7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBDb21tYW5kcyB9IGZyb20gXCJAL2NvbW1hbmRzL0NvbW1hbmRzXCI7XG5pbXBvcnQgeyBJVGV4dE9wZXJhdGlvbnNTZXJ2aWNlIH0gZnJvbSBcIi4vSVRleHRPcGVyYXRpb25zU2VydmljZVwiO1xuaW1wb3J0IHsgVXRpbHMgfSBmcm9tIFwiQC91dGlsaXRpZXMvVXRpbHNcIjtcbmltcG9ydCB7IENvbG9ycyB9IGZyb20gXCJAL2NvbW1vbi9Db2xvcnNcIjtcbmltcG9ydCB7IElNZW1lbnRvIH0gZnJvbSBcIkAvY29yZS9JTWVtZW50b1wiO1xuaW1wb3J0IHsgRGVwZW5kZW5jeUNvbnRhaW5lciB9IGZyb20gXCJAL2NvcmUvRGVwZW5kZW5jeUNvbnRhaW5lclwiO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSBcIkAvY29tbWFuZHMvRXZlbnRFbWl0dGVyXCI7XG5pbXBvcnQgeyBCdXR0b25JRHMgfSBmcm9tIFwiQC9jb3JlL0J1dHRvbklEc1wiO1xuaW1wb3J0IHsgRHJvcGRvd25MaXN0SURzIH0gZnJvbSBcIkAvY29yZS9Ecm9wZG93bkxpc3RJRHNcIjtcblxudHlwZSBUYXJnZXROb2RlID0ge1xuICAgIG5vZGVUeXBlOiBzdHJpbmc7XG4gICAgY2xhc3Nlcz86IHN0cmluZ1tdO1xufTtcblxuZXhwb3J0IGNsYXNzIFRleHRPcGVyYXRpb25zU2VydmljZSBpbXBsZW1lbnRzIElUZXh0T3BlcmF0aW9uc1NlcnZpY2Uge1xuXG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IFRleHRPcGVyYXRpb25zU2VydmljZTtcblxuICAgIHByaXZhdGUgbWVtZW50bzogSU1lbWVudG87XG5cbiAgICB0ZXh0T3BlcmF0aW9uU2VydmljZTogYW55O1xuXG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihtZW1lbnRvOiBJTWVtZW50bykge1xuICAgICAgICBpZiAoVGV4dE9wZXJhdGlvbnNTZXJ2aWNlLmluc3RhbmNlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVc2UgVGV4dE9wZXJhdGlvblNlcnZpY2UuZ2V0SW5zdGFuY2UoKSB0byBnZXQgaW5zdGFuY2UuXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5tZW1lbnRvID0gbWVtZW50bztcbiAgICAgICAgdGhpcy5hdHRhY2hFdmVudHMoKTtcblxuICAgIH1cblxuICAgIC8vVE9ETzogbW92ZSB0aGlzIHRvIHRleHRDb250ZW50RmxvYXRpbmdUb29sYmFyXG4gICAgYXR0YWNoRXZlbnRzKCk6IHZvaWQge1xuICAgICAgICAvLyBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKERlZmF1bHRKU0V2ZW50cy5TZWxlY3Rpb25DaGFuZ2UsIHRoaXMuaGFuZGxlU2VsZWN0aW9uQ2hhbmdlLmJpbmQodGhpcykpO1xuICAgIH1cblxuICAgIC8vIGhhbmRsZVNlbGVjdGlvbkNoYW5nZSgpIHtcblxuICAgIC8vICAgICBjb25zdCBib2xkOiBib29sZWFuID0gZG9jdW1lbnQucXVlcnlDb21tYW5kU3RhdGUoJ2JvbGQnKTtcbiAgICAvLyAgICAgY29uc3QgaXRhbGljOiBib29sZWFuID0gZG9jdW1lbnQucXVlcnlDb21tYW5kU3RhdGUoJ2l0YWxpYycpO1xuICAgIC8vICAgICBjb25zdCB1bmRlcmxpbmU6IGJvb2xlYW4gPSBkb2N1bWVudC5xdWVyeUNvbW1hbmRTdGF0ZSgndW5kZXJsaW5lJyk7XG4gICAgLy8gICAgIGNvbnN0IHN0cmlrZVRocm91Z2g6IGJvb2xlYW4gPSBkb2N1bWVudC5xdWVyeUNvbW1hbmRTdGF0ZSgnc3RyaWtlVGhyb3VnaCcpO1xuXG4gICAgLy8gICAgIGNvbnN0IGhpbGl0ZUNvbG9yOiB7IFtrZXk6IHN0cmluZ106IGJvb2xlYW4gfSA9IHt9O1xuICAgIC8vICAgICBoaWxpdGVDb2xvcltDb2xvcnMuSGlsaXRlQ29sb3JSZWRdID0gdGhpcy5xdWVyeUhpbGl0ZUNvbG9yKENvbG9ycy5IaWxpdGVDb2xvclJlZCk7XG4gICAgLy8gICAgIGhpbGl0ZUNvbG9yW0NvbG9ycy5IaWxpdGVDb2xvckdyZWVuXSA9IHRoaXMucXVlcnlIaWxpdGVDb2xvcihDb2xvcnMuSGlsaXRlQ29sb3JHcmVlbik7XG4gICAgLy8gICAgIGhpbGl0ZUNvbG9yW0NvbG9ycy5IaWxpdGVDb2xvckJsdWVdID0gdGhpcy5xdWVyeUhpbGl0ZUNvbG9yKENvbG9ycy5IaWxpdGVDb2xvckJsdWUpO1xuICAgIC8vICAgICBoaWxpdGVDb2xvcltDb2xvcnMuSGlsaXRlQ29sb3JZZWxsb3ddID0gdGhpcy5xdWVyeUhpbGl0ZUNvbG9yKENvbG9ycy5IaWxpdGVDb2xvclllbGxvdyk7XG4gICAgLy8gICAgIGhpbGl0ZUNvbG9yW0NvbG9ycy5IaWxpdGVDb2xvckdyZXldID0gdGhpcy5xdWVyeUhpbGl0ZUNvbG9yKENvbG9ycy5IaWxpdGVDb2xvckdyZXkpO1xuXG4gICAgLy8gICAgIGNvbnN0IGZvcmVDb2xvcjogeyBba2V5OiBzdHJpbmddOiBib29sZWFuIH0gPSB7fTtcbiAgICAvLyAgICAgZm9yZUNvbG9yW0NvbG9ycy5Gb3JlQ29sb3JSZWRdID0gdGhpcy5xdWVyeUhpbGl0ZUNvbG9yKENvbG9ycy5Gb3JlQ29sb3JSZWQpO1xuICAgIC8vICAgICBmb3JlQ29sb3JbQ29sb3JzLkZvcmVDb2xvckdyZWVuXSA9IHRoaXMucXVlcnlIaWxpdGVDb2xvcihDb2xvcnMuRm9yZUNvbG9yR3JlZW4pO1xuICAgIC8vICAgICBmb3JlQ29sb3JbQ29sb3JzLkZvcmVDb2xvckJsdWVdID0gdGhpcy5xdWVyeUhpbGl0ZUNvbG9yKENvbG9ycy5Gb3JlQ29sb3JCbHVlKTtcbiAgICAvLyAgICAgZm9yZUNvbG9yW0NvbG9ycy5Gb3JlQ29sb3JZZWxsb3ddID0gdGhpcy5xdWVyeUhpbGl0ZUNvbG9yKENvbG9ycy5Gb3JlQ29sb3JZZWxsb3cpO1xuICAgIC8vICAgICBmb3JlQ29sb3JbQ29sb3JzLkZvcmVDb2xvckdyZXldID0gdGhpcy5xdWVyeUhpbGl0ZUNvbG9yKENvbG9ycy5Gb3JlQ29sb3JHcmV5KTtcblxuICAgIC8vICAgICAvLyBFdmVudEVtaXR0ZXIuZW1pdEZvcm1hdENoYW5nZUV2ZW50KGJvbGQsIGl0YWxpYywgdW5kZXJsaW5lLCBzdHJpa2VUaHJvdWdoLCBoaWxpdGVDb2xvciwgZm9yZUNvbG9yKTtcbiAgICAvLyB9XG5cbiAgICBzdGF0aWMgZ2V0SW5zdGFuY2UoKTogVGV4dE9wZXJhdGlvbnNTZXJ2aWNlIHtcblxuICAgICAgICBjb25zdCBtZW1lbnRvID0gRGVwZW5kZW5jeUNvbnRhaW5lci5JbnN0YW5jZS5yZXNvbHZlPElNZW1lbnRvPihcIklNZW1lbnRvXCIpO1xuXG4gICAgICAgIGlmICghdGhpcy5pbnN0YW5jZSkge1xuICAgICAgICAgICAgdGhpcy5pbnN0YW5jZSA9IG5ldyBUZXh0T3BlcmF0aW9uc1NlcnZpY2UobWVtZW50byk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5pbnN0YW5jZTtcbiAgICB9XG5cblxuXG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgdGhlICdib2xkJyBjb21tYW5kIGJ5IHRvZ2dsaW5nIGJvbGQgc3R5bGUgb24gdGhlIHNlbGVjdGVkIHRleHQuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIGNvbW1hbmQgd2FzIGV4ZWN1dGVkIHN1Y2Nlc3NmdWxseS5cbiAgICAgKi9cbiAgICBleGVjQm9sZCgpOiB2b2lkIHtcblxuICAgICAgICB0aGlzLm1lbWVudG8uc2F2ZVN0YXRlKCk7XG5cbiAgICAgICAgaWYgKGRvY3VtZW50LmV4ZWNDb21tYW5kKFwiYm9sZFwiKSkge1xuICAgICAgICAgICAgRXZlbnRFbWl0dGVyLmVtaXRDaGFuZ2VDb21wb25lbnRDb2xvckV2ZW50KEJ1dHRvbklEcy5Cb2xkLCBDb2xvcnMuSWNvbkFjdGl2ZUJsdWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZXhlY0l0YWxpYygpOiB2b2lkIHtcblxuICAgICAgICB0aGlzLm1lbWVudG8uc2F2ZVN0YXRlKCk7XG5cbiAgICAgICAgaWYgKGRvY3VtZW50LmV4ZWNDb21tYW5kKFwiaXRhbGljXCIpKSB7XG4gICAgICAgICAgICBFdmVudEVtaXR0ZXIuZW1pdENoYW5nZUNvbXBvbmVudENvbG9yRXZlbnQoQnV0dG9uSURzLkl0YWxpYywgQ29sb3JzLkljb25BY3RpdmVCbHVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGV4ZWNTdHJpa2VUaHJvdWdoKCk6IHZvaWQge1xuXG4gICAgICAgIHRoaXMubWVtZW50by5zYXZlU3RhdGUoKTtcblxuICAgICAgICBpZiAoZG9jdW1lbnQuZXhlY0NvbW1hbmQoXCJzdHJpa2VUaHJvdWdoXCIpKSB7XG4gICAgICAgICAgICBFdmVudEVtaXR0ZXIuZW1pdENoYW5nZUNvbXBvbmVudENvbG9yRXZlbnQoQnV0dG9uSURzLlN0cmlrZXRocm91Z2gsIENvbG9ycy5JY29uQWN0aXZlQmx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBleGVjVW5kZXJsaW5lKCk6IHZvaWQge1xuICAgICAgICB0aGlzLm1lbWVudG8uc2F2ZVN0YXRlKCk7XG5cbiAgICAgICAgaWYgKGRvY3VtZW50LmV4ZWNDb21tYW5kKFwidW5kZXJsaW5lXCIpKSB7XG4gICAgICAgICAgICBFdmVudEVtaXR0ZXIuZW1pdENoYW5nZUNvbXBvbmVudENvbG9yRXZlbnQoQnV0dG9uSURzLlVuZGVybGluZSwgQ29sb3JzLkljb25BY3RpdmVCbHVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGV4ZWNIaWxpdGVDb2xvcih2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG5cbiAgICAgICAgdGhpcy5tZW1lbnRvLnNhdmVTdGF0ZSgpO1xuXG4gICAgICAgIEV2ZW50RW1pdHRlci5lbWl0UmVzZXRBY3RpdmVCdXR0b25zRWxlbWVudEV2ZW50KFwiaGlsaXRlQ29sb3JcIik7XG5cbiAgICAgICAgaWYgKGRvY3VtZW50LmV4ZWNDb21tYW5kKFwiaGlsaXRlQ29sb3JcIiwgZmFsc2UsIHZhbHVlKSkge1xuICAgICAgICAgICAgRXZlbnRFbWl0dGVyLmVtaXRTaG93SGlkZUFjdGl2ZUVsZW1lbnRFdmVudChcImhpbGl0ZUNvbG9yXCIsIHZhbHVlLCBcInNob3dcIik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBleGVjRm9yZUNvbG9yKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcblxuICAgICAgICB0aGlzLm1lbWVudG8uc2F2ZVN0YXRlKCk7XG5cbiAgICAgICAgRXZlbnRFbWl0dGVyLmVtaXRSZXNldEFjdGl2ZUJ1dHRvbnNFbGVtZW50RXZlbnQoXCJmb3JlQ29sb3JcIik7XG5cbiAgICAgICAgaWYgKGRvY3VtZW50LmV4ZWNDb21tYW5kKFwiZm9yZUNvbG9yXCIsIGZhbHNlLCB2YWx1ZSkpIHtcbiAgICAgICAgICAgIEV2ZW50RW1pdHRlci5lbWl0U2hvd0hpZGVBY3RpdmVFbGVtZW50RXZlbnQoXCJmb3JlQ29sb3JcIiwgdmFsdWUsIFwic2hvd1wiKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGV4ZWNDb21tYW5kKGNvbW1hbmQ6IHN0cmluZywgc2hvd1VpOiBib29sZWFuLCB2YWx1ZTogc3RyaW5nIHwgbnVsbCk6IGJvb2xlYW4ge1xuXG4gICAgICAgIC8vIGlmIChjb21tYW5kID09IFRleHRPcGVyYXRpb25TZXJ2aWNlLlFVRVJZX1RFWFRfT1BFUkFUSU9OUy5JTkxJTkVfQ09ERSkge1xuICAgICAgICAvLyAgICAgdGhpcy50b2dnbGVDb2RlRXhlY0NvbW1hbmQoKTtcbiAgICAgICAgLy8gICAgIHJldHVybiB0cnVlO1xuICAgICAgICAvLyB9XG5cbiAgICAgICAgLy8gbGV0IHY6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHZhbHVlIHx8IHVuZGVmaW5lZDtcblxuICAgICAgICAvLyBpZiAodiA9PSBcImluaXRpYWxcIikge1xuICAgICAgICAvLyAgICAgdiA9IHRoaXMuZ2V0SW5pdGlhbENvbG9yQXNIZXgoKTtcbiAgICAgICAgLy8gfVxuXG4gICAgICAgIC8vIGlmIChjb21tYW5kID09IFRleHRPcGVyYXRpb25TZXJ2aWNlLlFVRVJZX1RFWFRfT1BFUkFUSU9OUy5DUkVBVEVfTElOSykge1xuXG4gICAgICAgIC8vICAgICBjb25zdCBlbGVtZW50ID0gVGV4dE9wZXJhdGlvblNlcnZpY2UuZ2V0U2VsZWN0ZWRIVE1MRWxlbWVudCgpO1xuXG4gICAgICAgIC8vICAgICBpZiAoZWxlbWVudD8uY2xvc2VzdChcImFcIikpIHtcbiAgICAgICAgLy8gICAgICAgICByZXR1cm4gZG9jdW1lbnQuZXhlY0NvbW1hbmQoXCJ1bmxpbmtcIiwgZmFsc2UsIHYpO1xuICAgICAgICAvLyAgICAgfVxuXG4gICAgICAgIC8vICAgICBpZiAoc2hvd1VpKSB7XG5cbiAgICAgICAgLy8gICAgICAgICBjb25zdCBzaG93SW5wdXRMaW5rQm94ID0gbmV3IEN1c3RvbUV2ZW50KCdzaG93SW5wdXRMaW5rQm94UmVxdWVzdGVkJywge1xuICAgICAgICAvLyAgICAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAvLyAgICAgICAgICAgICBjYW5jZWxhYmxlOiB0cnVlXG4gICAgICAgIC8vICAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHNob3dJbnB1dExpbmtCb3gpO1xuXG4gICAgICAgIC8vICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIC8vICAgICB9XG4gICAgICAgIC8vIH1cblxuICAgICAgICAvLyBpZiAoY29tbWFuZCA9PSBUZXh0T3BlcmF0aW9uU2VydmljZS5RVUVSWV9URVhUX09QRVJBVElPTlMuSElMSVRFX0NPTE9SIHx8XG4gICAgICAgIC8vICAgICBjb21tYW5kID09IFRleHRPcGVyYXRpb25TZXJ2aWNlLlFVRVJZX1RFWFRfT1BFUkFUSU9OUy5GT1JFX0NPTE9SKSB7XG5cbiAgICAgICAgLy8gICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKGNvbW1hbmQsIGZhbHNlLCB2KTtcblxuICAgICAgICAvLyAgICAgY29uc3Qgc2hvd0lucHV0TGlua0JveCA9IG5ldyBDdXN0b21FdmVudCgnY29sb3JDaGFuZ2UnLCB7XG4gICAgICAgIC8vICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgLy8gICAgICAgICBjYW5jZWxhYmxlOiB0cnVlXG4gICAgICAgIC8vICAgICB9KTtcblxuICAgICAgICAvLyAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChzaG93SW5wdXRMaW5rQm94KTtcbiAgICAgICAgLy8gfVxuXG4gICAgICAgIC8vIHJldHVybiBkb2N1bWVudC5leGVjQ29tbWFuZChjb21tYW5kLCBmYWxzZSwgdik7XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHF1ZXJ5Q29tbWFuZFN0YXRlKGNvbW1hbmQ6IHN0cmluZywgdmFsdWU6IHN0cmluZyB8IG51bGwpOiBQcm9taXNlPGJvb2xlYW4+IHtcblxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXG4gICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjb21tYW5kID09PSBDb21tYW5kcy50b2dnbGVMaW5rKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUodGhpcy5xdWVyeUFuY2hvcigpKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChjb21tYW5kID09PSBDb21tYW5kcy50b2dnbGVVbmRlcmxpbmUpIHtcblxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5xdWVyeUFuY2hvcigpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChjb21tYW5kID09PSBDb21tYW5kcy50b2dnbGVIaWxpdGVDb2xvcikge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRoaXMucXVlcnlIaWxpdGVDb2xvcih2YWx1ZSEpKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChjb21tYW5kID09PSBDb21tYW5kcy50b2dnbGVGb3JlQ29sb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh0aGlzLnF1ZXJ5Rm9yZUNvbG9yKHZhbHVlISkpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmVzb2x2ZShkb2N1bWVudC5xdWVyeUNvbW1hbmRTdGF0ZShjb21tYW5kKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuXG4gICAgcXVlcnlDb21tYW5kU3RhdGVBKGNvbW1hbmQ6IHN0cmluZywgdmFsdWU6IHN0cmluZyB8IG51bGwpOiBib29sZWFuIHtcblxuICAgICAgICBpZiAoY29tbWFuZCA9PT0gQ29tbWFuZHMudG9nZ2xlTGluaykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucXVlcnlBbmNob3IoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb21tYW5kID09PSBDb21tYW5kcy50b2dnbGVVbmRlcmxpbmUpIHtcblxuICAgICAgICAgICAgaWYgKHRoaXMucXVlcnlBbmNob3IoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAhdGhpcy5xdWVyeUFuY2hvcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbW1hbmQgPT09IENvbW1hbmRzLnRvZ2dsZUhpbGl0ZUNvbG9yKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5xdWVyeUhpbGl0ZUNvbG9yKHZhbHVlISk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29tbWFuZCA9PT0gQ29tbWFuZHMudG9nZ2xlRm9yZUNvbG9yKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5xdWVyeUZvcmVDb2xvcih2YWx1ZSEpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5Q29tbWFuZFN0YXRlKGNvbW1hbmQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgdG9nZ2xlQ29kZUV4ZWNDb21tYW5kKCkge1xuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gICAgICAgIGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAwKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcbiAgICAgICAgbGV0IGNvbnRhaW5lck5vZGU6IE5vZGUgfCBudWxsID0gcmFuZ2UuY29tbW9uQW5jZXN0b3JDb250YWluZXI7XG5cbiAgICAgICAgd2hpbGUgKGNvbnRhaW5lck5vZGUgJiYgY29udGFpbmVyTm9kZS5ub2RlTmFtZSAhPT0gJ0NPREUnKSB7XG4gICAgICAgICAgICBjb250YWluZXJOb2RlID0gY29udGFpbmVyTm9kZS5wYXJlbnROb2RlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbnRhaW5lck5vZGUgJiYgY29udGFpbmVyTm9kZS5ub2RlTmFtZSA9PT0gJ0NPREUnKSB7XG4gICAgICAgICAgICBjb25zdCBjb2RlRWxlbWVudCA9IGNvbnRhaW5lck5vZGUgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICBjb25zdCByYW5nZU9mQ29kZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG4gICAgICAgICAgICByYW5nZU9mQ29kZS5zZWxlY3ROb2RlQ29udGVudHMoY29kZUVsZW1lbnQpO1xuXG4gICAgICAgICAgICBpZiAocmFuZ2UudG9TdHJpbmcoKSA9PT0gcmFuZ2VPZkNvZGUudG9TdHJpbmcoKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudDogTm9kZSB8IG51bGwgPSBjb2RlRWxlbWVudC5wYXJlbnROb2RlO1xuICAgICAgICAgICAgICAgIHdoaWxlIChwYXJlbnQgJiYgY29kZUVsZW1lbnQuZmlyc3RDaGlsZCkge1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKGNvZGVFbGVtZW50LmZpcnN0Q2hpbGQsIGNvZGVFbGVtZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcGFyZW50Py5yZW1vdmVDaGlsZChjb2RlRWxlbWVudCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRleHRDb250ZW50ID0gcmFuZ2UudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5leGVjQ29tbWFuZCgnaW5zZXJ0SFRNTCcsIGZhbHNlLCB0ZXh0Q29udGVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkb2N1bWVudC5nZXRTZWxlY3Rpb24oKT8ucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50QXNTdHJpbmcgPSBuZXcgWE1MU2VyaWFsaXplcigpLnNlcmlhbGl6ZVRvU3RyaW5nKHJhbmdlLmNsb25lQ29udGVudHMoKSk7XG4gICAgICAgICAgICBkb2N1bWVudC5leGVjQ29tbWFuZCgnaW5zZXJ0SFRNTCcsIGZhbHNlLCBgPGNvZGU+JHtjb250ZW50QXNTdHJpbmd9PC9jb2RlPmApO1xuICAgICAgICB9XG4gICAgfVxuXG5cblxuXG5cbiAgICAvKipcbiAgICAqIENoZWNrcyBpZiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHRleHQgaGFzIHRoZSBzcGVjaWZpZWQgZm9yZWdyb3VuZCAodGV4dCkgY29sb3IuXG4gICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGNydWNpYWwgaW4gZW52aXJvbm1lbnRzIHdoZXJlIHRleHQgY29sb3IgZm9ybWF0dGluZyBpcyBtb25pdG9yZWQgb3IgbmVlZHMgdmVyaWZpY2F0aW9uLFxuICAgICogc3VjaCBhcyBpbiBhIHJpY2ggdGV4dCBlZGl0b3IuIEl0IGRldGVybWluZXMgd2hldGhlciB0aGUgc2VsZWN0ZWQgdGV4dCdzIGNvbG9yIG1hdGNoZXMgYW4gZXhwZWN0ZWQgaGV4YWRlY2ltYWwgY29sb3IgdmFsdWUuXG4gICAgKlxuICAgICogQHBhcmFtIHtzdHJpbmd9IGV4cGVjdGVkQ29sb3IgLSBUaGUgZXhwZWN0ZWQgdGV4dCBjb2xvciBpbiBoZXhhZGVjaW1hbCBmb3JtYXQgKGUuZy4sIFwiI0ZGRkZGRlwiKSB0byBjaGVjayBhZ2FpbnN0IHRoZSBzZWxlY3Rpb24uXG4gICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIHRoZSBzZWxlY3RlZCB0ZXh0J3MgY29sb3IgbWF0Y2hlcyB0aGUgZXhwZWN0ZWQgY29sb3IsIG90aGVyd2lzZSBmYWxzZS5cbiAgICAqXG4gICAgKiBAZXhhbXBsZVxuICAgICogLy8gVG8gdmVyaWZ5IGlmIHRoZSBzZWxlY3RlZCB0ZXh0IGhhcyBhIGJsdWUgdGV4dCBjb2xvcjpcbiAgICAqIGNvbnN0IGhhc0JsdWVUZXh0Q29sb3IgPSBxdWVyeUZvcmVDb2xvcihcIiMwMDAwRkZcIik7XG4gICAgKiBjb25zb2xlLmxvZygnU2VsZWN0ZWQgdGV4dCBoYXMgYmx1ZSB0ZXh0IGNvbG9yOicsIGhhc0JsdWVUZXh0Q29sb3IpO1xuICAgICpcbiAgICAqIEBkZXNjcmlwdGlvblxuICAgICogVGhlIGZ1bmN0aW9uIG9wZXJhdGVzIGFzIGZvbGxvd3M6XG4gICAgKiAxLiBSZXRyaWV2ZXMgdGhlIGN1cnJlbnQgdGV4dCBzZWxlY3Rpb24gdXNpbmcgYHdpbmRvdy5nZXRTZWxlY3Rpb24oKWAuXG4gICAgKiAyLiBWYWxpZGF0ZXMgdGhhdCB0aGVyZSBpcyBhIHNlbGVjdGlvbiBhbmQgdGhhdCBpdCBpbmNsdWRlcyBhdCBsZWFzdCBvbmUgcmFuZ2UuXG4gICAgKiAzLiBJZGVudGlmaWVzIHRoZSBtb3N0IGRlZXBseSBuZXN0ZWQgbm9kZSB0aGF0IGNvbnRhaW5zIHRoZSBzZWxlY3Rpb24sIGFkanVzdGluZyBmb3IgdGV4dCBub2RlcyBieSBtb3ZpbmcgdG8gdGhlaXIgcGFyZW50IG5vZGUuXG4gICAgKiA0LiBTZWFyY2hlcyBmb3IgdGhlIG5lYXJlc3QgYW5jZXN0b3IgYGZvbnRgIGVsZW1lbnQgd2l0aCBhbiBleHBsaWNpdCBgY29sb3JgIGF0dHJpYnV0ZSwgaW50ZW5kZWQgdG8gZGlyZWN0bHkgaW5mbHVlbmNlIHRoZSB0ZXh0IGNvbG9yLlxuICAgICogNS4gSWYgc3VjaCBhbiBlbGVtZW50IGlzIGZvdW5kLCBjb21wdXRlcyB0aGUgYWN0dWFsIGNvbG9yIGluIFJHQiBmb3JtYXQgdXNpbmcgY29tcHV0ZWQgc3R5bGVzIGFuZCBjb252ZXJ0cyBpdCB0byBoZXhhZGVjaW1hbC5cbiAgICAqIDYuIENvbXBhcmVzIHRoZSBjb252ZXJ0ZWQgaGV4YWRlY2ltYWwgY29sb3IgdG8gdGhlIGBleHBlY3RlZENvbG9yYCwgYWRqdXN0aW5nIGZvciBjYXNlIHNlbnNpdGl2aXR5LlxuICAgICogNy4gUmV0dXJucyB0cnVlIGlmIHRoZSBjb2xvcnMgbWF0Y2gsIGZhbHNlIG90aGVyd2lzZS5cbiAgICAqL1xuICAgIHF1ZXJ5Rm9yZUNvbG9yKGV4cGVjdGVkQ29sb3I6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG5cbiAgICAgICAgaWYgKCFzZWxlY3Rpb24pIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXNlbGVjdGlvbi5yYW5nZUNvdW50KSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgbGV0IGVsZW1lbnQ6IE5vZGUgfCBudWxsID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCkuY29tbW9uQW5jZXN0b3JDb250YWluZXI7XG5cbiAgICAgICAgaWYgKGVsZW1lbnQubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgICAgICAgICBlbGVtZW50ID0gZWxlbWVudC5wYXJlbnROb2RlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZm9udENvbG9yID0gKGVsZW1lbnQgYXMgSFRNTEVsZW1lbnQpLmNsb3Nlc3QoXCJmb250W2NvbG9yXVwiKTtcbiAgICAgICAgaWYgKCFmb250Q29sb3IpIHJldHVybiBmYWxzZTtcblxuICAgICAgICBjb25zdCBzdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGZvbnRDb2xvcik7XG4gICAgICAgIGNvbnN0IHJnYkNvbG9yID0gc3R5bGUuY29sb3I7XG5cbiAgICAgICAgY29uc3QgaGV4Q29sb3IgPSBVdGlscy5yZ2JUb0hleChyZ2JDb2xvcik7XG5cbiAgICAgICAgcmV0dXJuIGhleENvbG9yLnRvVXBwZXJDYXNlKCkgPT09IGV4cGVjdGVkQ29sb3IudG9VcHBlckNhc2UoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHF1ZXJ5QW5jaG9yKCk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gICAgICAgIGlmICghc2VsZWN0aW9uIHx8ICFzZWxlY3Rpb24ucmFuZ2VDb3VudCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGxldCBub2RlOiBOb2RlIHwgbnVsbCA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyO1xuXG4gICAgICAgIC8vIFNlIG8gbm9kZSDDqSB1bSBuw7MgZGUgdGV4dG8sIGNvbWXDp2Ftb3MgYSB2ZXJpZmljYXIgYSBwYXJ0aXIgZGUgc2V1IG7DsyBwYWkuXG4gICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xuICAgICAgICAgICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFZlcmlmaWNhIHNlIG8gbsOzIG91IHVtIGFzY2VuZGVudGUgYXTDqSBvIGVsZW1lbnRvIGVkaXTDoXZlbCDDqSB1bSBsaW5rLlxuICAgICAgICB3aGlsZSAobm9kZSAmJiBub2RlICE9PSBudWxsKSB7IC8vICd0aGlzLmVkaXRvckVsZW1lbnQnIGRldmUgc2VyIG8gZWxlbWVudG8gPHA+XG4gICAgICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PSBOb2RlLkVMRU1FTlRfTk9ERSAmJiAobm9kZSBhcyBIVE1MRWxlbWVudCkuY2xvc2VzdCgnYScpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgKiBDaGVja3MgaWYgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCB0ZXh0IGhhcyB0aGUgc3BlY2lmaWVkIGJhY2tncm91bmQgY29sb3IuXG4gICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGRlc2lnbmVkIHRvIHZlcmlmeSB0aGUgcHJlc2VuY2Ugb2YgYSBzcGVjaWZpYyBiYWNrZ3JvdW5kIGNvbG9yIGluIHRoZSB0ZXh0IHNlbGVjdGlvbixcbiAgICAqIHdoaWNoIGNhbiBiZSB1c2VmdWwgaW4gdGV4dCBlZGl0aW5nIGVudmlyb25tZW50cyB3aGVyZSBiYWNrZ3JvdW5kIGNvbG9yIGZvcm1hdHRpbmcgbmVlZHMgdG8gYmUgdHJhY2tlZCBvciB2ZXJpZmllZC5cbiAgICAqXG4gICAgKiBAcGFyYW0ge3N0cmluZ30gZXhwZWN0ZWRDb2xvciAtIFRoZSBleHBlY3RlZCBiYWNrZ3JvdW5kIGNvbG9yIGluIGhleGFkZWNpbWFsIGZvcm1hdCAoZS5nLiwgXCIjRkZGRkZGXCIpIHRvIGNoZWNrIGFnYWluc3QgdGhlIHNlbGVjdGlvbi5cbiAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIHRydWUgaWYgdGhlIHNlbGVjdGVkIHRleHQncyBiYWNrZ3JvdW5kIGNvbG9yIG1hdGNoZXMgdGhlIGV4cGVjdGVkIGNvbG9yLCBvdGhlcndpc2UgZmFsc2UuXG4gICAgKlxuICAgICogQGV4YW1wbGVcbiAgICAqIC8vIFRvIGNoZWNrIGlmIHRoZSBzZWxlY3RlZCB0ZXh0IGhhcyBhIHJlZCBiYWNrZ3JvdW5kIGNvbG9yOlxuICAgICogY29uc3QgaGFzUmVkQmFja2dyb3VuZCA9IHF1ZXJ5SGlsaXRlQ29sb3IoXCIjRkYwMDAwXCIpO1xuICAgICogY29uc29sZS5sb2coJ1NlbGVjdGVkIHRleHQgaGFzIHJlZCBiYWNrZ3JvdW5kOicsIGhhc1JlZEJhY2tncm91bmQpO1xuICAgICpcbiAgICAqIEBkZXNjcmlwdGlvblxuICAgICogVGhlIGZ1bmN0aW9uIG9wZXJhdGVzIGFzIGZvbGxvd3M6XG4gICAgKiAxLiBSZXRyaWV2ZXMgdGhlIGN1cnJlbnQgdGV4dCBzZWxlY3Rpb24gdXNpbmcgYHdpbmRvdy5nZXRTZWxlY3Rpb24oKWAuXG4gICAgKiAyLiBDaGVja3MgaWYgdGhlcmUgaXMgYSBzZWxlY3Rpb24gYW5kIGlmIGl0IGluY2x1ZGVzIGF0IGxlYXN0IG9uZSByYW5nZS5cbiAgICAqIDMuIElkZW50aWZpZXMgdGhlIG1vc3QgZGVlcGx5IG5lc3RlZCBub2RlIHRoYXQgY29udGFpbnMgdGhlIHNlbGVjdGlvbiwgYWRqdXN0aW5nIGZvciB0ZXh0IG5vZGVzIGJ5IHN0ZXBwaW5nIHVwIHRvIHRoZWlyIHBhcmVudCBub2RlLlxuICAgICogNC4gU2VhcmNoZXMgZm9yIHRoZSBuZWFyZXN0IGFuY2VzdG9yIGBzcGFuYCBvciBgZm9udGAgZWxlbWVudCB0aGF0IGV4cGxpY2l0bHkgaGFzIGEgYGJhY2tncm91bmQtY29sb3JgIHN0eWxlIGFwcGxpZWQuXG4gICAgKiA1LiBJZiBzdWNoIGFuIGVsZW1lbnQgaXMgZm91bmQsIGNvbXB1dGVzIHRoZSBhY3R1YWwgYmFja2dyb3VuZCBjb2xvciBpbiBSR0IgZm9ybWF0IGFuZCBjb252ZXJ0cyBpdCB0byBoZXhhZGVjaW1hbC5cbiAgICAqIDYuIENvbXBhcmVzIHRoZSBjb252ZXJ0ZWQgaGV4YWRlY2ltYWwgY29sb3IgdG8gdGhlIGBleHBlY3RlZENvbG9yYCwgYWRqdXN0aW5nIGZvciBjYXNlIHNlbnNpdGl2aXR5LlxuICAgICogNy4gUmV0dXJucyB0cnVlIGlmIHRoZSBjb2xvcnMgbWF0Y2gsIGZhbHNlIG90aGVyd2lzZS5cbiAgICAqL1xuICAgIHF1ZXJ5SGlsaXRlQ29sb3IoZXhwZWN0ZWRDb2xvcjogc3RyaW5nKTogYm9vbGVhbiB7XG5cbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuXG4gICAgICAgIGlmICghc2VsZWN0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzZWxlY3Rpb24ucmFuZ2VDb3VudCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGxldCBlbGVtZW50OiBOb2RlIHwgbnVsbCA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyO1xuXG4gICAgICAgIGlmIChlbGVtZW50Lm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xuICAgICAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNwYW5XaXRoQmFja2dyb3VuZCA9XG4gICAgICAgICAgICAoZWxlbWVudCBhcyBIVE1MRWxlbWVudCkuY2xvc2VzdChcInNwYW5bc3R5bGUqPSdiYWNrZ3JvdW5kLWNvbG9yJ11cIikgfHxcbiAgICAgICAgICAgIChlbGVtZW50IGFzIEhUTUxFbGVtZW50KS5jbG9zZXN0KFwiZm9udFtzdHlsZSo9J2JhY2tncm91bmQtY29sb3InXVwiKTtcblxuXG4gICAgICAgIGlmICghc3BhbldpdGhCYWNrZ3JvdW5kKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgY29uc3Qgc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShzcGFuV2l0aEJhY2tncm91bmQpO1xuICAgICAgICBjb25zdCByZ2JDb2xvciA9IHN0eWxlLmJhY2tncm91bmRDb2xvcjtcblxuICAgICAgICBjb25zdCBoZXhDb2xvciA9IFV0aWxzLnJnYlRvSGV4KHJnYkNvbG9yKTtcblxuICAgICAgICByZXR1cm4gaGV4Q29sb3IudG9VcHBlckNhc2UoKSA9PT0gZXhwZWN0ZWRDb2xvci50b1VwcGVyQ2FzZSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0SW5pdGlhbENvbG9yQXNIZXgoKSB7XG4gICAgICAgIGNvbnN0IHRlbXBFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0ZW1wRWxlbWVudCk7XG5cbiAgICAgICAgdGVtcEVsZW1lbnQuc3R5bGUuY29sb3IgPSAnaW5pdGlhbCc7XG5cbiAgICAgICAgY29uc3QgY29tcHV0ZWRDb2xvciA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRlbXBFbGVtZW50KS5jb2xvcjtcblxuICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHRlbXBFbGVtZW50KTtcblxuICAgICAgICByZXR1cm4gVXRpbHMucmdiVG9IZXgoY29tcHV0ZWRDb2xvcik7XG4gICAgfVxuXG4gICAgZ2V0VGFyZ2V0RWxlbWVudE1hcChjb21tYW5kOiBzdHJpbmcpOiBrZXlvZiBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICAgICBzd2l0Y2ggKGNvbW1hbmQpIHtcblxuICAgICAgICAgICAgY2FzZSBcInN0cm9uZ1wiOlxuICAgICAgICAgICAgY2FzZSBcImJvbGRcIjpcbiAgICAgICAgICAgIGNhc2UgXCJiXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuICdzdHJvbmcnO1xuXG4gICAgICAgICAgICBjYXNlIFwiaXRhbGljXCI6XG4gICAgICAgICAgICBjYXNlIFwiaVwiOlxuICAgICAgICAgICAgY2FzZSBcImVtXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiZW1cIjtcblxuICAgICAgICAgICAgY2FzZSBcInVuZGVybGluZVwiOlxuICAgICAgICAgICAgY2FzZSBcInVcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJ1XCI7XG5cbiAgICAgICAgICAgIGNhc2UgXCJzdHJpa2V0aHJvdWdoXCI6XG4gICAgICAgICAgICBjYXNlIFwic1wiOlxuICAgICAgICAgICAgICAgIHJldHVybiAncyc7XG5cbiAgICAgICAgICAgIGNhc2UgXCJiYWNrZ3JvdW5kXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwic3BhblwiO1xuXG4gICAgICAgICAgICBjYXNlIFwiY29sb3JcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJzcGFuXCI7XG5cbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0U2VsZWN0ZWRIVE1MRWxlbWVudCgpOiBIVE1MRWxlbWVudCB8IG51bGwge1xuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG5cbiAgICAgICAgaWYgKHNlbGVjdGlvbiAmJiBzZWxlY3Rpb24ucmFuZ2VDb3VudCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XG4gICAgICAgICAgICBsZXQgZWxlbWVudDogTm9kZSB8IG51bGwgPSByYW5nZS5jb21tb25BbmNlc3RvckNvbnRhaW5lcjtcblxuICAgICAgICAgICAgaWYgKGVsZW1lbnQubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgd2hpbGUgKGVsZW1lbnQgJiYgIShlbGVtZW50IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZSBhcyBIVE1MRWxlbWVudCB8IG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cblxuICAgIGdldFNlbGVjdGVkVGV4dE5vZGVzKCk6IE5vZGVbXSB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcbiAgICAgICAgaWYgKCFzZWxlY3Rpb24gfHwgc2VsZWN0aW9uLnJhbmdlQ291bnQgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRleHROb2RlczogTm9kZVtdID0gW107XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWxlY3Rpb24ucmFuZ2VDb3VudDsgKytpKSB7XG4gICAgICAgICAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KGkpO1xuICAgICAgICAgICAgY29uc3Qgbm9kZUl0ZXJhdG9yID0gZG9jdW1lbnQuY3JlYXRlTm9kZUl0ZXJhdG9yKFxuICAgICAgICAgICAgICAgIHJhbmdlLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyLFxuICAgICAgICAgICAgICAgIE5vZGVGaWx0ZXIuU0hPV19URVhULFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgYWNjZXB0Tm9kZShub2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmFuZ2UuaW50ZXJzZWN0c05vZGUobm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTm9kZUZpbHRlci5GSUxURVJfQUNDRVBUO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5vZGVGaWx0ZXIuRklMVEVSX1JFSkVDVDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGxldCBub2RlO1xuICAgICAgICAgICAgd2hpbGUgKChub2RlID0gbm9kZUl0ZXJhdG9yLm5leHROb2RlKCkpKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vZGVSYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG4gICAgICAgICAgICAgICAgICAgIG5vZGVSYW5nZS5zZWxlY3ROb2RlQ29udGVudHMobm9kZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UuY29tcGFyZUJvdW5kYXJ5UG9pbnRzKFJhbmdlLkVORF9UT19TVEFSVCwgbm9kZVJhbmdlKSA9PT0gLTEgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlLmNvbXBhcmVCb3VuZGFyeVBvaW50cyhSYW5nZS5TVEFSVF9UT19FTkQsIG5vZGVSYW5nZSkgPT09IDFcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0Tm9kZXMucHVzaChub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0ZXh0Tm9kZXM7XG4gICAgfVxuXG4gICAgZmluZENsb3Nlc3RNYXRjaGluZ1BhcmVudChlbGVtZW50OiBOb2RlIHwgbnVsbCwgdGFyZ2V0OiBUYXJnZXROb2RlKTogRWxlbWVudCB8IG51bGwge1xuICAgICAgICBpZiAoZWxlbWVudCAmJiBlbGVtZW50Lm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xuICAgICAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50RWxlbWVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIHdoaWxlIChlbGVtZW50ICYmIGVsZW1lbnQgIT09IGRvY3VtZW50LmJvZHkpIHtcbiAgICAgICAgICAgIGlmIChlbGVtZW50Lm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW0gPSBlbGVtZW50IGFzIEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgaWYgKGVsZW0udGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSB0YXJnZXQubm9kZVR5cGUudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXRhcmdldC5jbGFzc2VzIHx8IHRhcmdldC5jbGFzc2VzLmV2ZXJ5KGNscyA9PiBlbGVtLmNsYXNzTGlzdC5jb250YWlucyhjbHMpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsZW07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbGVtZW50ID0gZWxlbWVudC5wYXJlbnRFbGVtZW50O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGV4dHJhY3RTZWxlY3RlZFRleHQodGV4dE5vZGU6IE5vZGUpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG5cbiAgICAgICAgaWYgKCFzZWxlY3Rpb24gfHwgc2VsZWN0aW9uLnJhbmdlQ291bnQgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcblxuICAgICAgICBpZiAodGV4dE5vZGUubm9kZVR5cGUgIT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRleHRDb250ZW50ID0gdGV4dE5vZGUudGV4dENvbnRlbnQgfHwgXCJcIjtcblxuICAgICAgICBsZXQgc3RhcnQgPSAwO1xuICAgICAgICBsZXQgZW5kID0gdGV4dENvbnRlbnQubGVuZ3RoO1xuXG4gICAgICAgIGlmICghcmFuZ2UuaW50ZXJzZWN0c05vZGUodGV4dE5vZGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyYW5nZS5zdGFydENvbnRhaW5lciA9PT0gdGV4dE5vZGUpIHtcbiAgICAgICAgICAgIHN0YXJ0ID0gcmFuZ2Uuc3RhcnRPZmZzZXQ7XG4gICAgICAgIH0gZWxzZSBpZiAocmFuZ2Uuc3RhcnRDb250YWluZXIuY29udGFpbnModGV4dE5vZGUpKSB7XG4gICAgICAgICAgICBzdGFydCA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmFuZ2UuZW5kQ29udGFpbmVyID09PSB0ZXh0Tm9kZSkge1xuICAgICAgICAgICAgZW5kID0gcmFuZ2UuZW5kT2Zmc2V0O1xuICAgICAgICB9IGVsc2UgaWYgKHJhbmdlLmVuZENvbnRhaW5lci5jb250YWlucyh0ZXh0Tm9kZSkpIHtcbiAgICAgICAgICAgIGVuZCA9IHRleHRDb250ZW50Lmxlbmd0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzdGFydCA8IGVuZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRleHRDb250ZW50LnN1YnN0cmluZyhzdGFydCwgZW5kKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IFRleHRPcGVyYXRpb25zU2VydmljZSB9IGZyb20gXCJAL3NlcnZpY2VzL3RleHQtb3BlcmF0aW9ucy9UZXh0T3BlcmF0aW9uc1NlcnZpY2VcIjtcclxuaW1wb3J0IHsgQmFzZVVJQ29tcG9uZW50IH0gZnJvbSBcIi4uLy4uL2NvbW1vbi9CYXNlVUlDb21wb25lbnRcIjtcclxuaW1wb3J0IHsgSW5wdXRMaW5rQm94V3JhcHBlciB9IGZyb20gXCIuL0lucHV0TGlua0JveFdyYXBwZXJcIjtcclxuaW1wb3J0IHsgQ29tbWFuZHMgfSBmcm9tIFwiQC9jb21tYW5kcy9Db21tYW5kc1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIElucHV0TGlua0JveCBleHRlbmRzIEJhc2VVSUNvbXBvbmVudCB7XHJcblxyXG4gICAgcGFyZW50V3JhcHBlcj86IElucHV0TGlua0JveFdyYXBwZXI7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcblxyXG4gICAgICAgIHN1cGVyKHt9KVxyXG4gICAgICAgIHRoaXMuYXR0YWNoRXZlbnQoKTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0KCk6IEhUTUxFbGVtZW50IHtcclxuXHJcbiAgICAgICAgY29uc3QgaHRtbEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7XHJcblxyXG4gICAgICAgIGh0bWxFbGVtZW50LmlkID0gXCJsaW5rQm94SW5wdXRcIjtcclxuICAgICAgICBodG1sRWxlbWVudC50eXBlID0gXCJ1cmxcIjtcclxuICAgICAgICBodG1sRWxlbWVudC5wbGFjZWhvbGRlciA9IFwiUGFzdGUgb3IgdHlwZSBhIGxpbmsuLi5cIjtcclxuXHJcbiAgICAgICAgaHRtbEVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSBcInJlbGF0aXZlXCI7XHJcblxyXG4gICAgICAgIHJldHVybiBodG1sRWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICBzZXRQYXJlbnRXcmFwcGVyKHBhcmVudFdyYXBwZXI6IElucHV0TGlua0JveFdyYXBwZXIpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnBhcmVudFdyYXBwZXIgPSBwYXJlbnRXcmFwcGVyO1xyXG4gICAgfVxyXG5cclxuICAgIGF0dGFjaEV2ZW50KCk6IHZvaWQge1xyXG5cclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCAoZXZlbnQpID0+IHtcclxuXHJcbiAgICAgICAgICAgIGlmIChldmVudC5rZXkgPT0gXCJFbnRlclwiICYmIHRoaXMuaXNWaXNpYmxlKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IHVybCA9ICh0aGlzLmh0bWxFbGVtZW50IGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlO1xyXG5cclxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIFRleHRPcGVyYXRpb25zU2VydmljZS5nZXRJbnN0YW5jZSgpLmV4ZWNDb21tYW5kKENvbW1hbmRzLnRvZ2dsZUxpbmssIGZhbHNlLCB1cmwpO1xyXG4gICAgICAgICAgICAgICAgfSwgMTApO1xyXG5cclxuICAgICAgICAgICAgICAgICh0aGlzLmh0bWxFbGVtZW50IGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlID0gXCJcIjtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLnBhcmVudFdyYXBwZXI/LmhpZGUoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGV2ZW50LmtleSA9PSBcIkVzY2FwZVwiICYmIHRoaXMuaXNWaXNpYmxlKSB7XHJcbiAgICAgICAgICAgICAgICAodGhpcy5odG1sRWxlbWVudCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZSA9IFwiXCI7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnBhcmVudFdyYXBwZXI/LmhpZGUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvL1RPRE8gY2hlY2sgdGhlIGZsb2FyaW5nIGlkIGhlcmVcclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChldmVudCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5jYW5IaWRlICYmICEoZXZlbnQudGFyZ2V0ISBhcyBIVE1MRWxlbWVudCkuY2xvc2VzdChgIyR7dGhpcy5odG1sRWxlbWVudC5pZH1gKSAmJiAhKGV2ZW50LnRhcmdldCEgYXMgSFRNTEVsZW1lbnQpLmNsb3Nlc3QoXCIjdGV4dEZsb2F0aW5nVG9vbGJhclwiKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wYXJlbnRXcmFwcGVyPy5oaWRlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCAoZXZlbnQpID0+IHtcclxuICAgICAgICAgICAgaWYgKGV2ZW50LmtleSA9PSBcIi9cIikge1xyXG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxufSIsImltcG9ydCB7IFRleHRPcGVyYXRpb25zU2VydmljZSB9IGZyb20gXCJAL3NlcnZpY2VzL3RleHQtb3BlcmF0aW9ucy9UZXh0T3BlcmF0aW9uc1NlcnZpY2VcIjtcclxuaW1wb3J0IHsgQmFzZVVJQ29tcG9uZW50IH0gZnJvbSBcIi4uLy4uL2NvbW1vbi9CYXNlVUlDb21wb25lbnRcIjtcclxuaW1wb3J0IHsgSW5wdXRMaW5rQm94IH0gZnJvbSBcIi4vSW5wdXRMaW5rQm94XCI7XHJcblxyXG5leHBvcnQgY2xhc3MgSW5wdXRMaW5rQm94V3JhcHBlciBleHRlbmRzIEJhc2VVSUNvbXBvbmVudCB7XHJcblxyXG4gICAgaW5wdXRMaW5rQm94OiBJbnB1dExpbmtCb3g7XHJcbiAgICByYW5nZT86IFJhbmdlO1xyXG4gICAgaGlnaGxpZ2h0czogSFRNTERpdkVsZW1lbnRbXSA9IFtdO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIGNvbnN0IGlucHV0TGlua0JveCA9IG5ldyBJbnB1dExpbmtCb3goKTtcclxuXHJcbiAgICAgICAgc3VwZXIoe1xyXG4gICAgICAgICAgICBpbnB1dExpbmtCb3g6IGlucHV0TGlua0JveFxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmlucHV0TGlua0JveCA9IGlucHV0TGlua0JveDtcclxuICAgICAgICB0aGlzLmF0dGFjaEV2ZW50KCk7XHJcbiAgICAgICAgaW5wdXRMaW5rQm94LnNldFBhcmVudFdyYXBwZXIodGhpcyk7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIGluaXQoKTogSFRNTEVsZW1lbnQge1xyXG4gICAgICAgIGNvbnN0IGh0bWxFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuXHJcbiAgICAgICAgaHRtbEVsZW1lbnQuaWQgPSBcImxpbmtCb3hcIjtcclxuICAgICAgICBodG1sRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuY2xhc3NMaXN0LmFkZChcImRlcGVuZGVudC1ib3hcIik7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XHJcblxyXG4gICAgICAgIGh0bWxFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMucHJvcHMuaW5wdXRMaW5rQm94Lmh0bWxFbGVtZW50KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGh0bWxFbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIGF0dGFjaEV2ZW50KCk6IHZvaWQge1xyXG5cclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwic2hvd0lucHV0TGlua0JveFJlcXVlc3RlZFwiLCAoKSA9PiB7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnNob3coKTtcclxuICAgICAgICAgICAgdGhpcy5oaWdobGlnaHRTZWxlY3RlZFRleHQoKTtcclxuICAgICAgICAgICAgdGhpcy5pbnB1dExpbmtCb3guZm9jdXMoKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgaGlkZSgpOiB2b2lkIHtcclxuXHJcbiAgICAgICAgc3VwZXIuaGlkZSgpO1xyXG4gICAgICAgIHRoaXMucmVtb3ZlSGlnaGxpZ2h0cygpO1xyXG5cclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHNob3dJbnB1dExpbmtCb3hGaW5pc2hlZCA9IG5ldyBDdXN0b21FdmVudCgnc2hvd0lucHV0TGlua0JveEZpbmlzaGVkJywge1xyXG4gICAgICAgICAgICAgICAgYnViYmxlczogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIGNhbmNlbGFibGU6IHRydWVcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHNob3dJbnB1dExpbmtCb3hGaW5pc2hlZCk7XHJcbiAgICAgICAgfSwgMCk7XHJcbiAgICB9XHJcblxyXG4gICAgaGlnaGxpZ2h0U2VsZWN0ZWRUZXh0KCkge1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcclxuICAgICAgICBpZiAoIXNlbGVjdGlvbj8ucmFuZ2VDb3VudCkgcmV0dXJuO1xyXG5cclxuICAgICAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xyXG4gICAgICAgIGNvbnN0IHJlY3RzID0gcmFuZ2UuZ2V0Q2xpZW50UmVjdHMoKTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZWN0cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCByZWN0ID0gcmVjdHNbaV07XHJcbiAgICAgICAgICAgIGNvbnN0IGhpZ2hsaWdodCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgICAgICBoaWdobGlnaHQuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xyXG4gICAgICAgICAgICBoaWdobGlnaHQuc3R5bGUubGVmdCA9IGAke3JlY3QubGVmdH1weGA7XHJcbiAgICAgICAgICAgIGhpZ2hsaWdodC5zdHlsZS50b3AgPSBgJHtyZWN0LnRvcH1weGA7XHJcbiAgICAgICAgICAgIGhpZ2hsaWdodC5zdHlsZS53aWR0aCA9IGAke3JlY3Qud2lkdGh9cHhgO1xyXG4gICAgICAgICAgICBoaWdobGlnaHQuc3R5bGUuaGVpZ2h0ID0gYCR7cmVjdC5oZWlnaHR9cHhgO1xyXG4gICAgICAgICAgICBoaWdobGlnaHQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gJyNjMmMyYzInO1xyXG4gICAgICAgICAgICBoaWdobGlnaHQuc3R5bGUub3BhY2l0eSA9ICcwLjMnO1xyXG4gICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGhpZ2hsaWdodCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmhpZ2hsaWdodHMucHVzaChoaWdobGlnaHQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbW92ZUhpZ2hsaWdodHMoKSB7XHJcbiAgICAgICAgdGhpcy5oaWdobGlnaHRzLmZvckVhY2goaGlnaGxpZ2h0ID0+IHtcclxuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChoaWdobGlnaHQpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuaGlnaGxpZ2h0cyA9IFtdO1xyXG4gICAgfVxyXG5cclxufSIsImltcG9ydCB7IEJhc2VVSUNvbXBvbmVudCB9IGZyb20gJy4uL2NvbW1vbi9CYXNlVUlDb21wb25lbnQnO1xyXG5pbXBvcnQgeyBEcm9wZG93bk1lbnUgfSBmcm9tICcuL2Ryb3Bkb3duLXRvb2wvRHJvcGRvd25NZW51JztcclxuaW1wb3J0IHsgRmxvYXRpbmdUb29sYmFyU2VwYXJhdG9yIH0gZnJvbSAnLi9zZXBhcmF0b3IvRmxvYXRpbmdUb29sYmFyU2VwYXJhdG9yJztcclxuaW1wb3J0IHsgQnV0dG9uR3JvdXAgfSBmcm9tICcuL2J1dHRvbi1ncm91cC9CdXR0b25Hcm91cCc7XHJcbmltcG9ydCB7IElucHV0TGlua0JveFdyYXBwZXIgfSBmcm9tICcuL2xpbmstYm94L0lucHV0TGlua0JveFdyYXBwZXInO1xyXG5pbXBvcnQgeyBDdXN0b21FdmVudHMgfSBmcm9tICdAL2NvbW1vbi9DdXN0b21FdmVudHMnO1xyXG5cclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEZsb2F0aW5nVG9vbGJhciBleHRlbmRzIEJhc2VVSUNvbXBvbmVudCB7XHJcblxyXG4gICAgZHJvcGRvd25zOiBEcm9wZG93bk1lbnVbXTtcclxuICAgIHNlcGFyYXRvcnM6IEZsb2F0aW5nVG9vbGJhclNlcGFyYXRvcltdO1xyXG4gICAgY3VycmVudFNlbGVjdGlvblJhbmdlOiBSYW5nZSB8IG51bGw7XHJcbiAgICBpbnB1dExpbmtCb3hXcmFwcGVyOiBJbnB1dExpbmtCb3hXcmFwcGVyO1xyXG4gICAgaHRtbEZvY3VzZWRFbGVtZW50QmVmb3JlT3BlblF1aWNrTWVudTogSFRNTEVsZW1lbnQgfCBudWxsO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGlkOiBzdHJpbmcpIHtcclxuXHJcbiAgICAgICAgY29uc3QgaW5wdXRMaW5rQm94V3JhcHBlciA9IG5ldyBJbnB1dExpbmtCb3hXcmFwcGVyKCk7XHJcblxyXG4gICAgICAgIHN1cGVyKHtcclxuICAgICAgICAgICAgaWQ6IGlkLFxyXG4gICAgICAgICAgICBpbnB1dExpbmtCb3hXcmFwcGVyOiBpbnB1dExpbmtCb3hXcmFwcGVyXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuaW5wdXRMaW5rQm94V3JhcHBlciA9IGlucHV0TGlua0JveFdyYXBwZXI7XHJcbiAgICAgICAgdGhpcy5kcm9wZG93bnMgPSBbXTtcclxuICAgICAgICB0aGlzLnNlcGFyYXRvcnMgPSBbXTtcclxuICAgICAgICB0aGlzLmN1cnJlbnRTZWxlY3Rpb25SYW5nZSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5odG1sRm9jdXNlZEVsZW1lbnRCZWZvcmVPcGVuUXVpY2tNZW51ID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBpbml0KCk6IEhUTUxFbGVtZW50IHtcclxuXHJcbiAgICAgICAgY29uc3QgaHRtbEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG5cclxuICAgICAgICBodG1sRWxlbWVudC5pZCA9IHRoaXMucHJvcHMuaWQ7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJmbG9hdGluZy10b29sYmFyXCIsIFwic2VsZWN0LXdyYXBwZXJcIiwgXCJzb2Z0LWJveC1zaGFkb3dcIik7XHJcblxyXG4gICAgICAgIGNvbnN0IHNlbGVjdFdyYXBwZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG5cclxuICAgICAgICBodG1sRWxlbWVudC5hcHBlbmRDaGlsZChzZWxlY3RXcmFwcGVyKTtcclxuXHJcbiAgICAgICAgY29uc3QgZWRpdG9yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJqb2hhbm5lc0VkaXRvclwiKTtcclxuXHJcbiAgICAgICAgZWRpdG9yPy5hcHBlbmRDaGlsZCh0aGlzLnByb3BzLmlucHV0TGlua0JveFdyYXBwZXIuaHRtbEVsZW1lbnQpO1xyXG5cclxuICAgICAgICByZXR1cm4gaHRtbEVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGRpc3BsYXkoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gJ2ZsZXgnO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHNob3coKTogdm9pZCB7XHJcbiAgICAvLyAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcclxuXHJcbiAgICAvLyAgICAgICAgIHRoaXMuaHRtbEZvY3VzZWRFbGVtZW50QmVmb3JlT3BlblF1aWNrTWVudSA9IERPTVV0aWxzLmZpbmRDbG9zZXN0QW5jZXN0b3JPZkFjdGl2ZUVsZW1lbnRCeUNsYXNzKFwiLmZvY3VzYWJsZVwiKTtcclxuICAgIC8vICAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG5cclxuICAgIC8vICAgICAgICAgaWYgKCFzZWxlY3Rpb24gfHwgc2VsZWN0aW9uLnJhbmdlQ291bnQgPT09IDApIHtcclxuICAgIC8vICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ05vIHNlbGVjdGlvbiBmb3VuZCcpO1xyXG4gICAgLy8gICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgLy8gICAgICAgICB9XHJcblxyXG4gICAgLy8gICAgICAgICB0aGlzLmN1cnJlbnRTZWxlY3Rpb25SYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xyXG5cclxuICAgIC8vICAgICAgICAgY29uc3QgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcclxuICAgIC8vICAgICAgICAgY29uc3QgcmVjdCA9IHJhbmdlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG5cclxuICAgIC8vICAgICAgICAgdGhpcy5odG1sRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xyXG5cclxuICAgIC8vICAgICAgICAgY29uc3QgZWxlbWVudFdpZHRoID0gdGhpcy5odG1sRWxlbWVudC5vZmZzZXRXaWR0aDtcclxuICAgIC8vICAgICAgICAgbGV0IGxlZnRQb3NpdGlvbiA9IHJlY3QubGVmdCArIHdpbmRvdy5zY3JvbGxYIC0gNTA7XHJcblxyXG4gICAgLy8gICAgICAgICBpZiAobGVmdFBvc2l0aW9uICsgZWxlbWVudFdpZHRoID4gd2luZG93LmlubmVyV2lkdGgpIHtcclxuICAgIC8vICAgICAgICAgICAgIGxlZnRQb3NpdGlvbiA9IHdpbmRvdy5pbm5lcldpZHRoIC0gZWxlbWVudFdpZHRoIC0gMjA7XHJcbiAgICAvLyAgICAgICAgIH1cclxuXHJcbiAgICAvLyAgICAgICAgIGNvbnN0IGVsZW1lbnRIZWlnaHQgPSB0aGlzLmh0bWxFbGVtZW50Lm9mZnNldEhlaWdodDtcclxuICAgIC8vICAgICAgICAgbGV0IHRvcFBvc2l0aW9uID0gcmVjdC50b3AgKyB3aW5kb3cuc2Nyb2xsWSAtIGVsZW1lbnRIZWlnaHQgLSAxMDtcclxuXHJcbiAgICAvLyAgICAgICAgIGlmICh0b3BQb3NpdGlvbiA8IDApIHtcclxuICAgIC8vICAgICAgICAgICAgIHRvcFBvc2l0aW9uID0gcmVjdC5ib3R0b20gKyB3aW5kb3cuc2Nyb2xsWSArIDEwO1xyXG4gICAgLy8gICAgICAgICB9XHJcblxyXG4gICAgLy8gICAgICAgICB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLmxlZnQgPSBgJHtsZWZ0UG9zaXRpb259cHhgO1xyXG4gICAgLy8gICAgICAgICB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLnRvcCA9IGAke3RvcFBvc2l0aW9ufXB4YDtcclxuXHJcbiAgICAvLyAgICAgICAgIHN1cGVyLnNob3coKTtcclxuXHJcbiAgICAvLyAgICAgICAgIC8vIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KEN1c3RvbUV2ZW50cy5mbG9hdGluZ1Rvb2xiYXJEaXNwbGF5ZWQsIHtcclxuICAgIC8vICAgICAgICAgLy8gICAgIGJ1YmJsZXM6IHRydWUsXHJcbiAgICAvLyAgICAgICAgIC8vICAgICBjYW5jZWxhYmxlOiB0cnVlXHJcbiAgICAvLyAgICAgICAgIC8vIH0pKTtcclxuICAgIC8vICAgICB9KTtcclxuICAgIC8vIH1cclxuXHJcbiAgICBoaWRlKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLmNhbkhpZGUpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuYW55RHJvcGRvd25WaXNpYmxlKCkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaGlkZUFsbERyb3Bkb3duVmlzaWJsZSgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRTZWxlY3Rpb25SYW5nZSA9IG51bGw7XHJcbiAgICAgICAgICAgIHN1cGVyLmhpZGUoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXBwZW5kRHJvcGRvd24oZHJvcGRvd246IERyb3Bkb3duTWVudSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuZHJvcGRvd25zLnB1c2goZHJvcGRvd24pXHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5hcHBlbmRDaGlsZChkcm9wZG93bi5odG1sRWxlbWVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXBwZW5kQnV0dG9uR3JvdXAoYnV0dG9uR3JvdXA6IEJ1dHRvbkdyb3VwKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5hcHBlbmRDaGlsZChidXR0b25Hcm91cC5odG1sRWxlbWVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXBwZW5kU2VwYXJhdG9yKHNlcGFyYXRvcjogRmxvYXRpbmdUb29sYmFyU2VwYXJhdG9yKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zZXBhcmF0b3JzLnB1c2goc2VwYXJhdG9yKTtcclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LmFwcGVuZENoaWxkKHNlcGFyYXRvci5odG1sRWxlbWVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXBwZW5kVGV4dFRvb2xiYXIoYnV0dG9uOiBCdXR0b25Hcm91cCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQoYnV0dG9uLmh0bWxFbGVtZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBhbnlEcm9wZG93blZpc2libGUoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgZm9yIChjb25zdCBkcm9wZG93biBvZiB0aGlzLmRyb3Bkb3ducykge1xyXG4gICAgICAgICAgICBpZiAoZHJvcGRvd24uZHJvcGRvd25MaXN0LmlzVmlzaWJsZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBoaWRlQWxsRHJvcGRvd25WaXNpYmxlKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGZvciAoY29uc3QgZHJvcGRvd24gb2YgdGhpcy5kcm9wZG93bnMpIHtcclxuICAgICAgICAgICAgaWYgKGRyb3Bkb3duLmRyb3Bkb3duTGlzdC5jYW5IaWRlKSB7XHJcbiAgICAgICAgICAgICAgICBkcm9wZG93bi5kcm9wZG93bkxpc3QuaGlkZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgYXR0YWNoRXZlbnRzKCkge1xyXG5cclxuICAgICAgICAvLyBQcmV2ZW50IGZvY3VzIGNoYW5nZSB3aGVuIGNsaWNraW5nIG9uIHRoaXMgZWxlbWVudFxyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIChldmVudCkgPT4ge1xyXG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBQcmV2ZW50IGZvY3VzIGNoYW5nZSB3aGVuIGNsaWNraW5nIG9uIHRoaXMgZWxlbWVudFxyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlZG93blwiLCAoZXZlbnQpID0+IHtcclxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICB9KTtcclxuXHJcblxyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJzaG93SW5wdXRMaW5rQm94UmVxdWVzdGVkXCIsICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5jYW5IaWRlID0gZmFsc2U7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJzaG93SW5wdXRMaW5rQm94RmluaXNoZWRcIiwgKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmNhbkhpZGUgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLnJlc3RvcmVSYW5nZVNlbGVjdGlvbigpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGV2ZW50KSA9PiB7XHJcbiAgICAgICAgLy8gICAgIGlmICh0aGlzLmNhbkhpZGUgJiYgKGV2ZW50LmtleSA9PT0gJ0VzY2FwZScpKSB7XHJcblxyXG4gICAgICAgIC8vICAgICAgICAgaWYgKHRoaXMuYW55RHJvcGRvd25WaXNpYmxlKCkpIHtcclxuICAgICAgICAvLyAgICAgICAgICAgICB0aGlzLmhpZGVBbGxEcm9wZG93blZpc2libGUoKTtcclxuICAgICAgICAvLyAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgdGhpcy5oaWRlKCk7XHJcbiAgICAgICAgLy8gICAgICAgICB9XHJcbiAgICAgICAgLy8gICAgIH0gaWYgKHRoaXMuY2FuSGlkZSAmJiAoZXZlbnQua2V5ID09PSAnQXJyb3dMZWZ0JyB8fCBldmVudC5rZXkgPT09ICdBcnJvd1JpZ2h0JyB8fCBldmVudC5rZXkgPT09ICdBcnJvd1VwJyB8fCBldmVudC5rZXkgPT09ICdBcnJvd0Rvd24nKSkge1xyXG4gICAgICAgIC8vICAgICAgICAgaWYgKHRoaXMuaXNTZWxlY3Rpb25FbXB0eSgpKSB7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgdGhpcy5oaWRlKCk7XHJcbiAgICAgICAgLy8gICAgICAgICB9XHJcbiAgICAgICAgLy8gICAgIH1cclxuICAgICAgICAvLyB9KTtcclxuXHJcbiAgICAgICAgLy8gZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChldmVudCkgPT4ge1xyXG4gICAgICAgIC8vICAgICBpZiAoKGV2ZW50LmtleSA9PT0gJ0VzY2FwZScgfHwgZXZlbnQua2V5ID09PSAnRGVsZXRlJykgJiYgdGhpcy5pc1Zpc2libGUpIHtcclxuICAgICAgICAvLyAgICAgICAgIGlmICh0aGlzLmNhbkhpZGUpIHtcclxuICAgICAgICAvLyAgICAgICAgICAgICB0aGlzLmhpZGVBbGxEcm9wZG93blZpc2libGUoKTtcclxuICAgICAgICAvLyAgICAgICAgICAgICB0aGlzLmhpZGUoKTtcclxuICAgICAgICAvLyAgICAgICAgIH1cclxuICAgICAgICAvLyAgICAgfVxyXG4gICAgICAgIC8vIH0pO1xyXG5cclxuXHJcbiAgICAgICAgLy8gZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZXZlbnQpID0+IHtcclxuICAgICAgICAvLyAgICAgaWYgKHRoaXMuY2FuSGlkZSAmJiAhKGV2ZW50LnRhcmdldCEgYXMgSFRNTEVsZW1lbnQpLmNsb3Nlc3QoYCMke3RoaXMuaHRtbEVsZW1lbnQuaWR9YCkgJiYgIXRoaXMuYW55RHJvcGRvd25WaXNpYmxlKCkpIHtcclxuICAgICAgICAvLyAgICAgICAgIHRoaXMuaGlkZSgpO1xyXG4gICAgICAgIC8vICAgICB9IFxyXG4gICAgICAgIC8vICAgICAvLyBlbHNlIGlmICh0aGlzLmlzVmlzaWJsZSAmJiAhKGV2ZW50LnRhcmdldCEgYXMgSFRNTEVsZW1lbnQpLmNsb3Nlc3QoYCMke3RoaXMuaHRtbEVsZW1lbnQuaWR9YCkgJiYgIXRoaXMuaW5wdXRMaW5rQm94V3JhcHBlci5pc1Zpc2libGUpIHtcclxuICAgICAgICAvLyAgICAgLy8gICAgIHRoaXMucmVzdG9yZVJhbmdlU2VsZWN0aW9uKCk7XHJcbiAgICAgICAgLy8gICAgIC8vIH1cclxuICAgICAgICAvLyB9KTtcclxuXHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihDdXN0b21FdmVudHMuYmxvY2tEZWxldGVkLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEN1c3RvbUV2ZW50cy5ibG9ja1R5cGVDaGFuZ2VkLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGlzU2VsZWN0aW9uRW1wdHkoKSB7XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gZG9jdW1lbnQuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgICAgICAgcmV0dXJuICFzZWxlY3Rpb24gfHwgc2VsZWN0aW9uLnJhbmdlQ291bnQgPT09IDAgfHwgc2VsZWN0aW9uLnRvU3RyaW5nKCkudHJpbSgpID09PSAnJztcclxuICAgIH1cclxuXHJcbiAgICByZXN0b3JlUmFuZ2VTZWxlY3Rpb24oKTogdm9pZCB7XHJcbiAgICAgICAgZG9jdW1lbnQuZ2V0U2VsZWN0aW9uKCk/LnJlbW92ZUFsbFJhbmdlcygpO1xyXG4gICAgICAgIGRvY3VtZW50LmdldFNlbGVjdGlvbigpPy5hZGRSYW5nZSh0aGlzLmN1cnJlbnRTZWxlY3Rpb25SYW5nZSEpO1xyXG4gICAgfVxyXG59XHJcblxyXG5cclxuIiwiaW1wb3J0IHsgRE9NVXRpbHMgfSBmcm9tIFwiQC91dGlsaXRpZXMvRE9NVXRpbHNcIjtcclxuaW1wb3J0IHsgRmxvYXRpbmdUb29sYmFyIH0gZnJvbSBcIi4vRmxvYXRpbmdUb29sYmFyXCI7XHJcbmltcG9ydCB7IFpJbmRleCB9IGZyb20gXCJAL2NvbW1vbi9aSW5kZXhcIjtcclxuaW1wb3J0IHsgRGVmYXVsdEpTRXZlbnRzIH0gZnJvbSBcIkAvY29tbW9uL0RlZmF1bHRKU0V2ZW50c1wiO1xyXG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tIFwiQC9jb21tYW5kcy9FdmVudEVtaXR0ZXJcIjtcclxuaW1wb3J0IHsgSVRleHRPcGVyYXRpb25zU2VydmljZSB9IGZyb20gXCJAL3NlcnZpY2VzL3RleHQtb3BlcmF0aW9ucy9JVGV4dE9wZXJhdGlvbnNTZXJ2aWNlXCI7XHJcbmltcG9ydCB7IERlcGVuZGVuY3lDb250YWluZXIgfSBmcm9tIFwiQC9jb3JlL0RlcGVuZGVuY3lDb250YWluZXJcIjtcclxuaW1wb3J0IHsgQ29sb3JzIH0gZnJvbSBcIkAvY29tbW9uL0NvbG9yc1wiO1xyXG5pbXBvcnQgeyBCdXR0b25JRHMgfSBmcm9tIFwiQC9jb3JlL0J1dHRvbklEc1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFRleHRDb250ZXh0RmxvYXRpbmdUb29sYmFyIGV4dGVuZHMgRmxvYXRpbmdUb29sYmFyIHtcclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBpZDogc3RyaW5nID0gXCJ0ZXh0RmxvYXRpbmdUb29sYmFyXCI7XHJcbiAgICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZTogVGV4dENvbnRleHRGbG9hdGluZ1Rvb2xiYXI7XHJcbiAgICBwcml2YXRlIHRleHRPcGVyYXRpb25zU2VydmljZTogSVRleHRPcGVyYXRpb25zU2VydmljZTtcclxuICAgIHByaXZhdGUgaW5pdGlhbFJlY3Q6IERPTVJlY3QgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKHRleHRPcGVyYXRpb25zU2VydmljZTogSVRleHRPcGVyYXRpb25zU2VydmljZSkge1xyXG5cclxuICAgICAgICBpZiAoVGV4dENvbnRleHRGbG9hdGluZ1Rvb2xiYXIuaW5zdGFuY2UpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVXNlIFRleHRDb250ZXh0RmxvYXRpbmdUb29sYmFyLmdldEluc3RhbmNlKCkgdG8gZ2V0IGluc3RhbmNlLlwiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHN1cGVyKFRleHRDb250ZXh0RmxvYXRpbmdUb29sYmFyLmlkKTtcclxuXHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5zdHlsZS56SW5kZXggPSBaSW5kZXguVmVyeUltcG9ydGFudDtcclxuICAgICAgICB0aGlzLnRleHRPcGVyYXRpb25zU2VydmljZSA9IHRleHRPcGVyYXRpb25zU2VydmljZTtcclxuXHJcbiAgICAgICAgdGhpcy5hdHRhY2hFdmVudHMoKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZ2V0SW5zdGFuY2UoKTogVGV4dENvbnRleHRGbG9hdGluZ1Rvb2xiYXIge1xyXG5cclxuICAgICAgICBjb25zdCB0ZXh0T3BlcmF0aW9uc1NlcnZpY2UgPSBEZXBlbmRlbmN5Q29udGFpbmVyLkluc3RhbmNlLnJlc29sdmU8SVRleHRPcGVyYXRpb25zU2VydmljZT4oXCJJVGV4dE9wZXJhdGlvbnNTZXJ2aWNlXCIpOztcclxuXHJcbiAgICAgICAgaWYgKCFUZXh0Q29udGV4dEZsb2F0aW5nVG9vbGJhci5pbnN0YW5jZSkge1xyXG4gICAgICAgICAgICBUZXh0Q29udGV4dEZsb2F0aW5nVG9vbGJhci5pbnN0YW5jZSA9IG5ldyBUZXh0Q29udGV4dEZsb2F0aW5nVG9vbGJhcih0ZXh0T3BlcmF0aW9uc1NlcnZpY2UpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIFRleHRDb250ZXh0RmxvYXRpbmdUb29sYmFyLmluc3RhbmNlO1xyXG4gICAgfVxyXG5cclxuICAgIHByb2Nlc3NTZWxlY3Rpb25DaGFuZ2VFZmZlY3RzKCkge1xyXG5cclxuICAgICAgICAvL1RoaXMgYmxvY2sgY2hlY2tzIGZvciBhbiBhY3RpdmUgc2VsZWN0aW9uIGFuZCB3aGV0aGVyIGl0IGNvbnRhaW5zIGFueSBjb250ZW50LlxyXG4gICAgICAgIC8vIEluIEZpcmVmb3gsIHRoZSBgc2VsZWN0aW9uY2hhbmdlYCBldmVudCBtYXkgYmUgZmlyZWQgZXZlbiB3aGlsZSB0eXBpbmcsXHJcbiAgICAgICAgLy8gd2hpY2ggaXMgbm90IHRoZSBpbnRlbmRlZCB0cmlnZ2VyIHNpbmNlIHdlIG9ubHkgd2FudCB0byByZWFjdCB0byBhY3R1YWwgY2hhbmdlcyBpbiBzZWxlY3Rpb24uXHJcbiAgICAgICAgLy8gSWYgdGhlIHNlbGVjdGlvbiBpcyBlbXB0eSBvciBudWxsLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBlYXJseSwgZWZmZWN0aXZlbHkgaWdub3JpbmdcclxuICAgICAgICAvLyB0aGVzZSB1bndhbnRlZCBgc2VsZWN0aW9uY2hhbmdlYCBldmVudHMgZHVyaW5nIHR5cGluZy5cclxuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSBkb2N1bWVudC5nZXRTZWxlY3Rpb24oKTtcclxuICAgICAgICBpZiAoIXNlbGVjdGlvbiB8fCBzZWxlY3Rpb24/LnRvU3RyaW5nKCkudHJpbSgpID09PSAnJykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBFdmVudEVtaXR0ZXIuZW1pdFJlc2V0QWN0aXZlQnV0dG9uc0VsZW1lbnRFdmVudChcImhpbGl0ZUNvbG9yXCIpO1xyXG4gICAgICAgIEV2ZW50RW1pdHRlci5lbWl0UmVzZXRBY3RpdmVCdXR0b25zRWxlbWVudEV2ZW50KFwiZm9yZUNvbG9yXCIpO1xyXG5cclxuICAgICAgICBjb25zdCBpc0JvbGQ6IGJvb2xlYW4gPSB0aGlzLnRleHRPcGVyYXRpb25zU2VydmljZS5xdWVyeUNvbW1hbmRTdGF0ZUEoJ2JvbGQnKTtcclxuICAgICAgICBjb25zdCBpc0l0YWxpYzogYm9vbGVhbiA9IHRoaXMudGV4dE9wZXJhdGlvbnNTZXJ2aWNlLnF1ZXJ5Q29tbWFuZFN0YXRlQSgnaXRhbGljJyk7XHJcbiAgICAgICAgY29uc3QgaXNVbmRlcmxpbmU6IGJvb2xlYW4gPSB0aGlzLnRleHRPcGVyYXRpb25zU2VydmljZS5xdWVyeUNvbW1hbmRTdGF0ZUEoJ3VuZGVybGluZScpO1xyXG4gICAgICAgIGNvbnN0IGlzU3RyaWtlVGhyb3VnaDogYm9vbGVhbiA9IHRoaXMudGV4dE9wZXJhdGlvbnNTZXJ2aWNlLnF1ZXJ5Q29tbWFuZFN0YXRlQSgnc3RyaWtlVGhyb3VnaCcpO1xyXG5cclxuICAgICAgICBjb25zdCBoaWxpdGVDb2xvcnM6IHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9ID0ge307XHJcbiAgICAgICAgaGlsaXRlQ29sb3JzW0NvbG9ycy5IaWxpdGVDb2xvclJlZF0gPSB0aGlzLnRleHRPcGVyYXRpb25zU2VydmljZS5xdWVyeUhpbGl0ZUNvbG9yKENvbG9ycy5IaWxpdGVDb2xvclJlZCk7XHJcbiAgICAgICAgaGlsaXRlQ29sb3JzW0NvbG9ycy5IaWxpdGVDb2xvckdyZWVuXSA9IHRoaXMudGV4dE9wZXJhdGlvbnNTZXJ2aWNlLnF1ZXJ5SGlsaXRlQ29sb3IoQ29sb3JzLkhpbGl0ZUNvbG9yR3JlZW4pO1xyXG4gICAgICAgIGhpbGl0ZUNvbG9yc1tDb2xvcnMuSGlsaXRlQ29sb3JCbHVlXSA9IHRoaXMudGV4dE9wZXJhdGlvbnNTZXJ2aWNlLnF1ZXJ5SGlsaXRlQ29sb3IoQ29sb3JzLkhpbGl0ZUNvbG9yQmx1ZSk7XHJcbiAgICAgICAgaGlsaXRlQ29sb3JzW0NvbG9ycy5IaWxpdGVDb2xvclllbGxvd10gPSB0aGlzLnRleHRPcGVyYXRpb25zU2VydmljZS5xdWVyeUhpbGl0ZUNvbG9yKENvbG9ycy5IaWxpdGVDb2xvclllbGxvdyk7XHJcbiAgICAgICAgaGlsaXRlQ29sb3JzW0NvbG9ycy5IaWxpdGVDb2xvckdyZXldID0gdGhpcy50ZXh0T3BlcmF0aW9uc1NlcnZpY2UucXVlcnlIaWxpdGVDb2xvcihDb2xvcnMuSGlsaXRlQ29sb3JHcmV5KTtcclxuXHJcbiAgICAgICAgY29uc3QgZm9yZUNvbG9yczogeyBba2V5OiBzdHJpbmddOiBib29sZWFuIH0gPSB7fTtcclxuICAgICAgICBmb3JlQ29sb3JzW0NvbG9ycy5Gb3JlQ29sb3JSZWRdID0gdGhpcy50ZXh0T3BlcmF0aW9uc1NlcnZpY2UucXVlcnlGb3JlQ29sb3IoQ29sb3JzLkZvcmVDb2xvclJlZCk7XHJcbiAgICAgICAgZm9yZUNvbG9yc1tDb2xvcnMuRm9yZUNvbG9yR3JlZW5dID0gdGhpcy50ZXh0T3BlcmF0aW9uc1NlcnZpY2UucXVlcnlGb3JlQ29sb3IoQ29sb3JzLkZvcmVDb2xvckdyZWVuKTtcclxuICAgICAgICBmb3JlQ29sb3JzW0NvbG9ycy5Gb3JlQ29sb3JCbHVlXSA9IHRoaXMudGV4dE9wZXJhdGlvbnNTZXJ2aWNlLnF1ZXJ5Rm9yZUNvbG9yKENvbG9ycy5Gb3JlQ29sb3JCbHVlKTtcclxuICAgICAgICBmb3JlQ29sb3JzW0NvbG9ycy5Gb3JlQ29sb3JZZWxsb3ddID0gdGhpcy50ZXh0T3BlcmF0aW9uc1NlcnZpY2UucXVlcnlGb3JlQ29sb3IoQ29sb3JzLkZvcmVDb2xvclllbGxvdyk7XHJcbiAgICAgICAgZm9yZUNvbG9yc1tDb2xvcnMuRm9yZUNvbG9yR3JleV0gPSB0aGlzLnRleHRPcGVyYXRpb25zU2VydmljZS5xdWVyeUZvcmVDb2xvcihDb2xvcnMuRm9yZUNvbG9yR3JleSk7XHJcblxyXG5cclxuICAgICAgICBPYmplY3QuZW50cmllcyhoaWxpdGVDb2xvcnMpLmZvckVhY2goKFtjb2xvciwgYWN0aXZlXSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoYWN0aXZlKSB7XHJcbiAgICAgICAgICAgICAgICBFdmVudEVtaXR0ZXIuZW1pdFNob3dIaWRlQWN0aXZlRWxlbWVudEV2ZW50KFwiaGlsaXRlQ29sb3JcIiwgY29sb3IsIFwic2hvd1wiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBPYmplY3QuZW50cmllcyhmb3JlQ29sb3JzKS5mb3JFYWNoKChbY29sb3IsIGFjdGl2ZV0pID0+IHtcclxuICAgICAgICAgICAgaWYgKGFjdGl2ZSkge1xyXG4gICAgICAgICAgICAgICAgRXZlbnRFbWl0dGVyLmVtaXRTaG93SGlkZUFjdGl2ZUVsZW1lbnRFdmVudChcImZvcmVDb2xvclwiLCBjb2xvciwgXCJzaG93XCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuZW1pdENoYW5nZUNvbXBvbmVudENvbG9yRXZlbnQoaXNCb2xkLCBCdXR0b25JRHMuQm9sZCk7XHJcbiAgICAgICAgdGhpcy5lbWl0Q2hhbmdlQ29tcG9uZW50Q29sb3JFdmVudChpc0l0YWxpYywgQnV0dG9uSURzLkl0YWxpYyk7XHJcbiAgICAgICAgdGhpcy5lbWl0Q2hhbmdlQ29tcG9uZW50Q29sb3JFdmVudChpc1VuZGVybGluZSwgQnV0dG9uSURzLlVuZGVybGluZSk7XHJcbiAgICAgICAgdGhpcy5lbWl0Q2hhbmdlQ29tcG9uZW50Q29sb3JFdmVudChpc1N0cmlrZVRocm91Z2gsIEJ1dHRvbklEcy5TdHJpa2V0aHJvdWdoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGVtaXRDaGFuZ2VDb21wb25lbnRDb2xvckV2ZW50KGFjdGl2ZTogYm9vbGVhbiwgdGFyZ2V0SWQ6IHN0cmluZykge1xyXG4gICAgICAgIGlmIChhY3RpdmUpIHtcclxuICAgICAgICAgICAgRXZlbnRFbWl0dGVyLmVtaXRDaGFuZ2VDb21wb25lbnRDb2xvckV2ZW50KHRhcmdldElkLCBDb2xvcnMuSWNvbkFjdGl2ZUJsdWUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIEV2ZW50RW1pdHRlci5lbWl0Q2hhbmdlQ29tcG9uZW50Q29sb3JFdmVudCh0YXJnZXRJZCwgQ29sb3JzLkljb25EZWZhdWx0QmxhY2spO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhdHRhY2hFdmVudHMoKTogdm9pZCB7XHJcblxyXG5cclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKERlZmF1bHRKU0V2ZW50cy5TZWxlY3Rpb25DaGFuZ2UsIHRoaXMucHJvY2Vzc1NlbGVjdGlvbkNoYW5nZUVmZmVjdHMuYmluZCh0aGlzKSk7XHJcblxyXG4gICAgICAgIC8vIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleXVwJywgKGV2ZW50KSA9PiB7XHJcbiAgICAgICAgLy8gICAgIGlmIChldmVudC5rZXkgPT09IFwiU2hpZnRcIiB8fCBldmVudC5rZXkgPT09IFwiQ29udHJvbFwiKSB7XHJcblxyXG4gICAgICAgIC8vICAgICAgICAgaWYgKHdpbmRvdy5nZXRTZWxlY3Rpb24oKSEudG9TdHJpbmcoKS50cmltKCkgIT09ICcnKSB7XHJcblxyXG4gICAgICAgIC8vICAgICAgICAgICAgIGlmIChET01VdGlscy5pc1NlbGVjdGVkVGV4dERlc2NlbmRhbnRPZihcIi50aXRsZVwiKSkge1xyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgICAgICAvLyAgICAgICAgICAgICB0aGlzLnNob3coKTtcclxuICAgICAgICAvLyAgICAgICAgIH1cclxuICAgICAgICAvLyAgICAgfVxyXG4gICAgICAgIC8vIH0pO1xyXG5cclxuICAgICAgICAvLyBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgKGV2ZW50KSA9PiB7XHJcbiAgICAgICAgLy8gICAgIGlmICghdGhpcy5pc1Zpc2libGUpIHtcclxuXHJcbiAgICAgICAgLy8gICAgICAgICAvLyB3YWl0IHRoZSBzZWxlY3Rpb24gdG8gYmUgcmVmbGVjdGVkIGluIHRoZSBET01cclxuICAgICAgICAvLyAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XHJcblxyXG4gICAgICAgIC8vICAgICAgICAgICAgIGlmICh3aW5kb3cuZ2V0U2VsZWN0aW9uKCkhLnRvU3RyaW5nKCkudHJpbSgpICE9PSAnJykge1xyXG5cclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgaWYgKERPTVV0aWxzLmlzU2VsZWN0ZWRUZXh0RGVzY2VuZGFudE9mKFwiLnRpdGxlXCIpKSB7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgdGhpcy5zaG93KCk7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgfVxyXG4gICAgICAgIC8vICAgICAgICAgfSk7XHJcbiAgICAgICAgLy8gICAgIH1cclxuICAgICAgICAvLyB9KTtcclxuXHJcblxyXG4gICAgICAgIC8vIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ29uc2VsZWN0aW9uJywgKGV2ZW50KSA9PiB7XHJcbiAgICAgICAgLy8gICAgIGlmICghdGhpcy5pc1Zpc2libGUpIHtcclxuXHJcbiAgICAgICAgLy8gICAgICAgICAvLyB3YWl0IHRoZSBzZWxlY3Rpb24gdG8gYmUgcmVmbGVjdGVkIGluIHRoZSBET01cclxuICAgICAgICAvLyAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XHJcblxyXG4gICAgICAgIC8vICAgICAgICAgICAgIGlmICh3aW5kb3cuZ2V0U2VsZWN0aW9uKCkhLnRvU3RyaW5nKCkudHJpbSgpICE9PSAnJykge1xyXG5cclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgaWYgKERPTVV0aWxzLmlzU2VsZWN0ZWRUZXh0RGVzY2VuZGFudE9mKFwiLnRpdGxlXCIpKSB7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgdGhpcy5zaG93KCk7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgfVxyXG4gICAgICAgIC8vICAgICAgICAgfSk7XHJcbiAgICAgICAgLy8gICAgIH1cclxuICAgICAgICAvLyB9KTtcclxuXHJcbiAgICAgICAgbGV0IGlzU2VsZWN0aW5nID0gZmFsc2U7XHJcblxyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNldXBcIiwgKGV2ZW50KSA9PiB7IGV2ZW50LnByZXZlbnREZWZhdWx0KCk7IH0pO1xyXG5cclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCAoZXZlbnQpID0+IHtcclxuICAgICAgICAgICAgaWYgKGV2ZW50LnNoaWZ0S2V5KSB7XHJcbiAgICAgICAgICAgICAgICBpc1NlbGVjdGluZyA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImtleXVwXCIsIChldmVudCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoZXZlbnQua2V5ID09PSBcIlNoaWZ0XCIpIHtcclxuICAgICAgICAgICAgICAgIGlzU2VsZWN0aW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dIaWRlKGlzU2VsZWN0aW5nKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGlzU2VsZWN0aW5nID0gdHJ1ZTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIChldmVudCkgPT4ge1xyXG4gICAgICAgICAgICBpc1NlbGVjdGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLnNob3dIaWRlKGlzU2VsZWN0aW5nKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuU2VsZWN0aW9uQ2hhbmdlLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB0aGlzLnNob3dIaWRlKGlzU2VsZWN0aW5nKTtcclxuICAgICAgICB9KTtcclxuXHJcblxyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZXZlbnQpID0+IHtcclxuXHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY2FuSGlkZSAmJiAoZXZlbnQua2V5ID09PSAnRXNjYXBlJykpIHtcclxuXHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmFueURyb3Bkb3duVmlzaWJsZSgpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGlkZUFsbERyb3Bkb3duVmlzaWJsZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSwgMTApO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBzdXBlci5hdHRhY2hFdmVudHMoKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBzaG93SGlkZShpc1NlbGVjdGluZzogYm9vbGVhbikge1xyXG4gICAgLy8gICAgIGNvbnN0IGhhc0NvbnRlbnQgPSB0aGlzLmhhc1NlbGVjdGlvbigpO1xyXG5cclxuICAgIC8vICAgICBpZiAoIWhhc0NvbnRlbnQpIHtcclxuICAgIC8vICAgICAgICAgdGhpcy5oaWRlKCk7XHJcbiAgICAvLyAgICAgfSBlbHNlIGlmIChoYXNDb250ZW50ICYmICFpc1NlbGVjdGluZykge1xyXG4gICAgLy8gICAgICAgICB0aGlzLnNob3coKTtcclxuICAgIC8vICAgICB9XHJcbiAgICAvLyB9XHJcblxyXG4gICAgc2hvdWxkVXBkYXRlUG9zaXRpb24oKTogYm9vbGVhbiB7XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG4gICAgICAgIGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAwKSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgIGNvbnN0IGN1cnJlbnRSZWN0ID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgaWYgKCF0aGlzLmluaXRpYWxSZWN0KSByZXR1cm4gdHJ1ZTtcclxuXHJcbiAgICAgICAgY29uc3QgcG9zaXRpb25DaGFuZ2VkID0gTWF0aC5hYnMoY3VycmVudFJlY3QubGVmdCAtIHRoaXMuaW5pdGlhbFJlY3QubGVmdCkgPiAxMCB8fCBNYXRoLmFicyhjdXJyZW50UmVjdC50b3AgLSB0aGlzLmluaXRpYWxSZWN0LnRvcCkgPiAxMDtcclxuICAgICAgICByZXR1cm4gcG9zaXRpb25DaGFuZ2VkO1xyXG4gICAgfVxyXG5cclxuICAgIHNob3dIaWRlKGlzU2VsZWN0aW5nOiBib29sZWFuKSB7XHJcblxyXG4gICAgICAgIC8vVGhpcyBibG9jayBjaGVja3MgZm9yIGFuIGFjdGl2ZSBzZWxlY3Rpb24gYW5kIHdoZXRoZXIgaXQgY29udGFpbnMgYW55IGNvbnRlbnQuXHJcbiAgICAgICAgLy8gSW4gRmlyZWZveCwgdGhlIGBzZWxlY3Rpb25jaGFuZ2VgIGV2ZW50IG1heSBiZSBmaXJlZCBldmVuIHdoaWxlIHR5cGluZyxcclxuICAgICAgICAvLyB3aGljaCBpcyBub3QgdGhlIGludGVuZGVkIHRyaWdnZXIgc2luY2Ugd2Ugb25seSB3YW50IHRvIHJlYWN0IHRvIGFjdHVhbCBjaGFuZ2VzIGluIHNlbGVjdGlvbi5cclxuICAgICAgICAvLyBJZiB0aGUgc2VsZWN0aW9uIGlzIGVtcHR5IG9yIG51bGwsIHRoZSBmdW5jdGlvbiByZXR1cm5zIGVhcmx5LCBlZmZlY3RpdmVseSBpZ25vcmluZ1xyXG4gICAgICAgIC8vIHRoZXNlIHVud2FudGVkIGBzZWxlY3Rpb25jaGFuZ2VgIGV2ZW50cyBkdXJpbmcgdHlwaW5nLlxyXG4gICAgICAgIFxyXG4gICAgICAgIGNvbnN0IGhhc0NvbnRlbnQgPSB0aGlzLmhhc1NlbGVjdGlvbigpO1xyXG5cclxuICAgICAgICBpZiAoIWhhc0NvbnRlbnQpIHtcclxuICAgICAgICAgICAgdGhpcy5oaWRlKCk7XHJcbiAgICAgICAgICAgIHRoaXMuaW5pdGlhbFJlY3QgPSBudWxsO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoaGFzQ29udGVudCAmJiAhaXNTZWxlY3RpbmcpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmlzVmlzaWJsZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zaG93KCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5zaG91bGRVcGRhdGVQb3NpdGlvbigpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVBvc2l0aW9uKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaGFzU2VsZWN0aW9uKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcclxuICAgICAgICBpZiAoc2VsZWN0aW9uICYmIHNlbGVjdGlvbi5yYW5nZUNvdW50ID4gMCkge1xyXG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZFRleHQgPSBzZWxlY3Rpb24udG9TdHJpbmcoKS50cmltKCk7XHJcbiAgICAgICAgICAgIGlmIChzZWxlY3RlZFRleHQgIT09ICcnKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvLyBzaG93SGlkZSgpIHtcclxuICAgIC8vICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgICAvLyAgICAgaWYgKHNlbGVjdGlvbiAmJiBzZWxlY3Rpb24ucmFuZ2VDb3VudCA+IDApIHtcclxuICAgIC8vICAgICAgICAgY29uc3Qgc2VsZWN0ZWRUZXh0ID0gc2VsZWN0aW9uLnRvU3RyaW5nKCkudHJpbSgpO1xyXG4gICAgLy8gICAgICAgICBpZiAoc2VsZWN0ZWRUZXh0ICE9PSAnJykge1xyXG4gICAgLy8gICAgICAgICAgICAgYWxlcnQoXCJTZWxlY2lvbm91OiBcIiArIHNlbGVjdGVkVGV4dCk7XHJcblxyXG4gICAgLy8gICAgICAgICAgICAgdGhpcy5zaG93KCk7XHJcbiAgICAvLyAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAvLyAgICAgICAgICAgICB0aGlzLmhpZGUoKTtcclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgIH1cclxuICAgIC8vIH1cclxuXHJcblxyXG4gICAgY2hhbmdlVG9vbGJhclBvc2l0aW9uVG9CZUNsb3NlZFRvU2VsZWN0aW9uKCk6IHZvaWQge1xyXG5cclxuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcblxyXG4gICAgICAgIGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAwKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ05vIHNlbGVjdGlvbiBmb3VuZCcpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmN1cnJlbnRTZWxlY3Rpb25SYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xyXG4gICAgICAgIGNvbnN0IHJlY3QgPSB0aGlzLmN1cnJlbnRTZWxlY3Rpb25SYW5nZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLmluaXRpYWxSZWN0KSB7XHJcbiAgICAgICAgICAgIHRoaXMuaW5pdGlhbFJlY3QgPSByZWN0O1xyXG4gICAgICAgICAgICB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBlbGVtZW50V2lkdGggPSB0aGlzLmh0bWxFbGVtZW50Lm9mZnNldFdpZHRoO1xyXG4gICAgICAgICAgICBsZXQgbGVmdFBvc2l0aW9uID0gcmVjdC5sZWZ0ICsgd2luZG93LnNjcm9sbFggLSA1MDtcclxuXHJcbiAgICAgICAgICAgIGlmIChsZWZ0UG9zaXRpb24gKyBlbGVtZW50V2lkdGggPiB3aW5kb3cuaW5uZXJXaWR0aCkge1xyXG4gICAgICAgICAgICAgICAgbGVmdFBvc2l0aW9uID0gd2luZG93LmlubmVyV2lkdGggLSBlbGVtZW50V2lkdGggLSAyMDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3QgZWxlbWVudEhlaWdodCA9IHRoaXMuaHRtbEVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xyXG4gICAgICAgICAgICBsZXQgdG9wUG9zaXRpb24gPSByZWN0LnRvcCArIHdpbmRvdy5zY3JvbGxZIC0gZWxlbWVudEhlaWdodCAtIDEwO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRvcFBvc2l0aW9uIDwgMCkge1xyXG4gICAgICAgICAgICAgICAgdG9wUG9zaXRpb24gPSByZWN0LmJvdHRvbSArIHdpbmRvdy5zY3JvbGxZICsgMTA7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUubGVmdCA9IGAke2xlZnRQb3NpdGlvbn1weGA7XHJcbiAgICAgICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUudG9wID0gYCR7dG9wUG9zaXRpb259cHhgO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzaG93KCk6IHZvaWQge1xyXG5cclxuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcblxyXG4gICAgICAgIGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAwKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ05vIHNlbGVjdGlvbiBmb3VuZCcpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZihET01VdGlscy5maW5kQ2xvc2VzdEFuY2VzdG9yT2ZBY3RpdmVFbGVtZW50QnlDbGFzcyhcInRpdGxlXCIpKXtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHRoaXMuY2hhbmdlVG9vbGJhclBvc2l0aW9uVG9CZUNsb3NlZFRvU2VsZWN0aW9uKCk7XHJcbiAgICAgICAgdGhpcy5oaWRlVHVybkludG9Ecm9wZG93bklmSW5DZWxsKCk7XHJcbiAgICAgICAgc3VwZXIuc2hvdygpO1xyXG4gICAgfVxyXG5cclxuICAgIGhpZGVUdXJuSW50b0Ryb3Bkb3duSWZJbkNlbGwoKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgaXNDZWxsID0gRE9NVXRpbHMuaXNTZWxlY3Rpb25JblRhYmxlQ2VsbCgpO1xyXG5cclxuICAgICAgICB0aGlzLmRyb3Bkb3ducy5mb3JFYWNoKGRyb3Bkb3duID0+IHtcclxuICAgICAgICAgICAgaWYgKGRyb3Bkb3duLmlkID09IFwidHVybkludG9NZW51XCIpIHtcclxuICAgICAgICAgICAgICAgIGlmIChpc0NlbGwpIHtcclxuICAgICAgICAgICAgICAgICAgICBkcm9wZG93bi5odG1sRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGRyb3Bkb3duLmh0bWxFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSB0aGlzLmRpc3BsYXk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5zZXBhcmF0b3JzLmZvckVhY2goc2VwYXJhdG9yID0+IHtcclxuICAgICAgICAgICAgaWYgKHNlcGFyYXRvci5pZCA9PSBcInR1cm5JbnRvU2VwYXJhdG9yXCIpIHtcclxuICAgICAgICAgICAgICAgIGlmIChpc0NlbGwpIHtcclxuICAgICAgICAgICAgICAgICAgICBzZXBhcmF0b3IuaHRtbEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBzZXBhcmF0b3IuaHRtbEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9IHRoaXMuZGlzcGxheTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHVwZGF0ZVBvc2l0aW9uKCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcclxuICAgICAgICBpZiAoc2VsZWN0aW9uICYmIHNlbGVjdGlvbi5yYW5nZUNvdW50ID4gMCkge1xyXG4gICAgICAgICAgICBjb25zdCByZWN0ID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0UG9zaXRpb24ocmVjdCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHNldFBvc2l0aW9uKHJlY3Q6IERPTVJlY3QpIHtcclxuICAgICAgICBjb25zdCBlbGVtZW50V2lkdGggPSB0aGlzLmh0bWxFbGVtZW50Lm9mZnNldFdpZHRoO1xyXG4gICAgICAgIGxldCBsZWZ0UG9zaXRpb24gPSByZWN0LmxlZnQgKyB3aW5kb3cuc2Nyb2xsWCAtIDUwO1xyXG5cclxuICAgICAgICBpZiAobGVmdFBvc2l0aW9uICsgZWxlbWVudFdpZHRoID4gd2luZG93LmlubmVyV2lkdGgpIHtcclxuICAgICAgICAgICAgbGVmdFBvc2l0aW9uID0gd2luZG93LmlubmVyV2lkdGggLSBlbGVtZW50V2lkdGggLSAyMDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGVsZW1lbnRIZWlnaHQgPSB0aGlzLmh0bWxFbGVtZW50Lm9mZnNldEhlaWdodDtcclxuICAgICAgICBsZXQgdG9wUG9zaXRpb24gPSByZWN0LnRvcCArIHdpbmRvdy5zY3JvbGxZIC0gZWxlbWVudEhlaWdodCAtIDEwO1xyXG5cclxuICAgICAgICBpZiAodG9wUG9zaXRpb24gPCAwKSB7XHJcbiAgICAgICAgICAgIHRvcFBvc2l0aW9uID0gcmVjdC5ib3R0b20gKyB3aW5kb3cuc2Nyb2xsWSArIDEwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5zdHlsZS5sZWZ0ID0gYCR7bGVmdFBvc2l0aW9ufXB4YDtcclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLnRvcCA9IGAke3RvcFBvc2l0aW9ufXB4YDtcclxuICAgIH1cclxuXHJcbiAgICBoaWRlKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLmNhbkhpZGUpIHtcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50U2VsZWN0aW9uUmFuZ2UgPSBudWxsO1xyXG4gICAgICAgICAgICBzdXBlci5oaWRlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgRHJvcGRvd25NZW51IH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvZmxvYXRpbmctdG9vbGJhci9kcm9wZG93bi10b29sL0Ryb3Bkb3duTWVudVwiO1xyXG5pbXBvcnQgeyBEcm9wZG93bk1lbnVMaXN0IH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvZmxvYXRpbmctdG9vbGJhci9kcm9wZG93bi10b29sL0Ryb3Bkb3duTWVudUxpc3RcIjtcclxuaW1wb3J0IHsgRHJvcGRvd25NZW51TGlzdEl0ZW0gfSBmcm9tIFwiLi4vY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL2Ryb3Bkb3duLXRvb2wvRHJvcGRvd25NZW51TGlzdEl0ZW1cIjtcclxuaW1wb3J0IHsgU1ZHSWNvbiB9IGZyb20gXCIuLi9jb21wb25lbnRzL2NvbW1vbi9TVkdJY29uXCI7XHJcbmltcG9ydCB7IEZsb2F0aW5nVG9vbGJhclNlcGFyYXRvciB9IGZyb20gXCIuLi9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvc2VwYXJhdG9yL0Zsb2F0aW5nVG9vbGJhclNlcGFyYXRvclwiO1xyXG5pbXBvcnQgeyBCdXR0b25Hcm91cCB9IGZyb20gXCIuLi9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvYnV0dG9uLWdyb3VwL0J1dHRvbkdyb3VwXCI7XHJcbmltcG9ydCB7IEJ1dHRvbkdyb3VwSXRlbSB9IGZyb20gXCIuLi9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvYnV0dG9uLWdyb3VwL0J1dHRvbkdyb3VwSXRlbVwiO1xyXG5pbXBvcnQgeyBDb2xvckljb24gfSBmcm9tIFwiLi4vY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL2Ryb3Bkb3duLXRvb2wvQ29sb3JJY29uXCI7XHJcbmltcG9ydCB7IERyb3Bkb3duTWVudUJ1dHRvbiB9IGZyb20gXCIuLi9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvZHJvcGRvd24tdG9vbC9Ecm9wZG93bk1lbnVCdXR0b25cIjtcclxuaW1wb3J0IHsgQmxvY2tPcGVyYXRpb25zU2VydmljZSB9IGZyb20gXCIuLi9zZXJ2aWNlcy9ibG9jay1vcGVyYXRpb25zL0Jsb2NrT3BlcmF0aW9uc1NlcnZpY2VcIjtcclxuaW1wb3J0IHsgRHJvcGRvd25NZW51TGlzdEl0ZW1UaXRsZSB9IGZyb20gXCJAL2NvbXBvbmVudHMvZmxvYXRpbmctdG9vbGJhci9kcm9wZG93bi10b29sL0Ryb3Bkb3duTWVudUxpc3RJdGVtVGl0bGVcIjtcclxuaW1wb3J0IHsgRWxlbWVudEZhY3RvcnlTZXJ2aWNlIH0gZnJvbSBcIkAvc2VydmljZXMvZWxlbWVudC1mYWN0b3J5L0VsZW1lbnRGYWN0b3J5U2VydmljZVwiO1xyXG5pbXBvcnQgeyBDb21tYW5kcyB9IGZyb20gXCJAL2NvbW1hbmRzL0NvbW1hbmRzXCI7XHJcbmltcG9ydCB7IEljb25zIH0gZnJvbSBcIkAvY29tbW9uL0ljb25zXCI7XHJcbmltcG9ydCB7IFNpemVzIH0gZnJvbSBcIkAvY29tbW9uL1NpemVzXCI7XHJcbmltcG9ydCB7IENvbG9ycyB9IGZyb20gXCJAL2NvbW1vbi9Db2xvcnNcIjtcclxuaW1wb3J0IHsgVGV4dENvbnRleHRGbG9hdGluZ1Rvb2xiYXIgfSBmcm9tIFwiQC9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvVGV4dENvbnRleHRGbG9hdGluZ1Rvb2xiYXJcIjtcclxuaW1wb3J0IHsgQnV0dG9uSURzIH0gZnJvbSBcIkAvY29yZS9CdXR0b25JRHNcIjtcclxuaW1wb3J0IHsgRHJvcGRvd25JdGVtSURzIH0gZnJvbSBcIkAvY29yZS9Ecm9wZG93bkl0ZW1JRHNcIjtcclxuaW1wb3J0IHsgRHJvcGRvd25MaXN0SURzIH0gZnJvbSBcIkAvY29yZS9Ecm9wZG93bkxpc3RJRHNcIjtcclxuaW1wb3J0IHsgRHJvcGRvd25NZW51SURzIH0gZnJvbSBcIkAvY29yZS9Ecm9wZG93bk1lbnVJRHNcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBUZXh0Q29udGV4dEZsb2F0aW5nVG9vbGJhckJ1aWxkZXIge1xyXG5cclxuICAgIHN0YXRpYyBidWlsZCgpOiBUZXh0Q29udGV4dEZsb2F0aW5nVG9vbGJhciB7XHJcblxyXG4gICAgICAgIGNvbnN0IGlkID0gXCJcIlxyXG4gICAgICAgIGNvbnN0IGZsb2F0aW5nQmFyID0gVGV4dENvbnRleHRGbG9hdGluZ1Rvb2xiYXIuZ2V0SW5zdGFuY2UoKTtcclxuXHJcbiAgICAgICAgZmxvYXRpbmdCYXIuYXBwZW5kRHJvcGRvd24oVGV4dENvbnRleHRGbG9hdGluZ1Rvb2xiYXJCdWlsZGVyLnR1cm5JbnRvRHJvcGRvd24oKSk7XHJcbiAgICAgICAgZmxvYXRpbmdCYXIuYXBwZW5kU2VwYXJhdG9yKFRleHRDb250ZXh0RmxvYXRpbmdUb29sYmFyQnVpbGRlci5zZXBhcmF0b3IoXCJ0dXJuSW50b1NlcGFyYXRvclwiKSk7XHJcbiAgICAgICAgZmxvYXRpbmdCYXIuYXBwZW5kQnV0dG9uR3JvdXAoVGV4dENvbnRleHRGbG9hdGluZ1Rvb2xiYXJCdWlsZGVyLmJ1dHRvbkdyb3VwKCkpO1xyXG4gICAgICAgIGZsb2F0aW5nQmFyLmFwcGVuZERyb3Bkb3duKFRleHRDb250ZXh0RmxvYXRpbmdUb29sYmFyQnVpbGRlci5jb2xvckRyb3Bkb3duKCkpO1xyXG4gICAgICAgIGZsb2F0aW5nQmFyLmFwcGVuZFNlcGFyYXRvcihUZXh0Q29udGV4dEZsb2F0aW5nVG9vbGJhckJ1aWxkZXIuc2VwYXJhdG9yKFwidGV4dE9wZXJhdGlvbnNTZXBhcmF0b3JcIikpO1xyXG4gICAgICAgIGZsb2F0aW5nQmFyLmFwcGVuZERyb3Bkb3duKFRleHRDb250ZXh0RmxvYXRpbmdUb29sYmFyQnVpbGRlci5tb3JlT3B0aW9uc0Ryb3Bkb3duKCkpO1xyXG5cclxuICAgICAgICByZXR1cm4gZmxvYXRpbmdCYXI7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIHR1cm5JbnRvRHJvcGRvd24oKTogRHJvcGRvd25NZW51IHtcclxuXHJcbiAgICAgICAgY29uc3QgdHVybkludG9CYXJMaXN0ID0gbmV3IERyb3Bkb3duTWVudUxpc3QoXCJ0dXJuSW50b1NlbGVjdFwiKTtcclxuICAgICAgICBjb25zdCB0dXJuSW50b0JhckJ1dHRvbiA9IG5ldyBEcm9wZG93bk1lbnVCdXR0b24oXCJ0dXJuSW50b0J1dHRvblwiLCBcIlRleHRcIiwgdHVybkludG9CYXJMaXN0KTtcclxuICAgICAgICBjb25zdCB0dXJuSW50b0Ryb3Bkb3duID0gbmV3IERyb3Bkb3duTWVudShcInR1cm5JbnRvTWVudVwiLCB0dXJuSW50b0JhckJ1dHRvbiwgdHVybkludG9CYXJMaXN0KTtcclxuXHJcbiAgICAgICAgdHVybkludG9CYXJMaXN0LmFwcGVuZChuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW1UaXRsZSh0dXJuSW50b0Jhckxpc3QsIFwiVHVybiBpbnRvXCIpKTtcclxuXHJcbiAgICAgICAgdHVybkludG9CYXJMaXN0LmFwcGVuZChuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW0oXCJ0dXJuSW50b09wdGlvblRleHRcIiwgdHVybkludG9CYXJMaXN0LCBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLkJMT0NLX09QRVJBVElPTlMuVFJBTlNGT1JNX0JMT0NLLCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5QQVJBR1JBUEgsIFNWR0ljb25zLnBhcmFncmFwaC5odG1sRWxlbWVudCwgXCJUZXh0XCIsIFwiQ3RybCtTaGlmdCtFbnRlclwiKSk7XHJcbiAgICAgICAgdHVybkludG9CYXJMaXN0LmFwcGVuZChuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW0oXCJ0dXJuSW50b09wdGlvblRvZG9MaXN0XCIsIHR1cm5JbnRvQmFyTGlzdCwgQmxvY2tPcGVyYXRpb25zU2VydmljZS5CTE9DS19PUEVSQVRJT05TLlRSQU5TRk9STV9CTE9DSywgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuQ0hFQ0tfTElTVCwgU1ZHSWNvbnMudG9kb19saXN0Lmh0bWxFbGVtZW50LCBcIlRvZG8gbGlzdFwiLCBcIkN0cmwrMVwiKSk7XHJcbiAgICAgICAgdHVybkludG9CYXJMaXN0LmFwcGVuZChuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW0oXCJ0dXJuSW50b09wdGlvbkJ1bGxldGVkTGlzdFwiLCB0dXJuSW50b0Jhckxpc3QsIEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuQkxPQ0tfT1BFUkFUSU9OUy5UUkFOU0ZPUk1fQkxPQ0ssIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkJVTExFVEVEX0xJU1QsIFNWR0ljb25zLmJfbGlzdC5odG1sRWxlbWVudCwgXCJCdWxsZXRlZCBsaXN0XCIsIFwiQ3RybCsuXCIpKTtcclxuICAgICAgICB0dXJuSW50b0Jhckxpc3QuYXBwZW5kKG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcInR1cm5JbnRvT3B0aW9uTnVtYmVyZWRMaXN0XCIsIHR1cm5JbnRvQmFyTGlzdCwgQmxvY2tPcGVyYXRpb25zU2VydmljZS5CTE9DS19PUEVSQVRJT05TLlRSQU5TRk9STV9CTE9DSywgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuTlVNQkVSRURfTElTVCwgU1ZHSWNvbnMubl9saXN0Lmh0bWxFbGVtZW50LCBcIk51bWJlcmVkIGxpc3RcIiwgXCJDdHJsKy9cIikpO1xyXG4gICAgICAgIHR1cm5JbnRvQmFyTGlzdC5hcHBlbmQobmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwidHVybkludG9PcHRpb25CbG9ja0NvZGVcIiwgdHVybkludG9CYXJMaXN0LCBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLkJMT0NLX09QRVJBVElPTlMuVFJBTlNGT1JNX0JMT0NLLCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5DT0RFLCBTVkdJY29ucy5jb2RlLmh0bWxFbGVtZW50LCBcIkJsb2NrIGNvZGVcIikpO1xyXG4gICAgICAgIHR1cm5JbnRvQmFyTGlzdC5hcHBlbmQobmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwidHVybkludG9PcHRpb25RdW90ZVwiLCB0dXJuSW50b0Jhckxpc3QsIEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuQkxPQ0tfT1BFUkFUSU9OUy5UUkFOU0ZPUk1fQkxPQ0ssIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLlFVT1RFLCBTVkdJY29ucy5xdW90ZS5odG1sRWxlbWVudCwgXCJRdW90ZVwiKSk7XHJcbiAgICAgICAgdHVybkludG9CYXJMaXN0LmFwcGVuZChuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW0oXCJ0dXJuSW50b09wdGlvbkhlYWRpbmcxXCIsIHR1cm5JbnRvQmFyTGlzdCwgQmxvY2tPcGVyYXRpb25zU2VydmljZS5CTE9DS19PUEVSQVRJT05TLlRSQU5TRk9STV9CTE9DSywgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuSEVBREVSXzEsIFNWR0ljb25zLmhlYWQxLmh0bWxFbGVtZW50LCBcIkhlYWRpbmcgMVwiLCBcIkN0cmwrQWx0KzFcIikpO1xyXG4gICAgICAgIHR1cm5JbnRvQmFyTGlzdC5hcHBlbmQobmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwidHVybkludG9PcHRpb25IZWFkaW5nMlwiLCB0dXJuSW50b0Jhckxpc3QsIEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuQkxPQ0tfT1BFUkFUSU9OUy5UUkFOU0ZPUk1fQkxPQ0ssIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl8yLCBTVkdJY29ucy5oZWFkMi5odG1sRWxlbWVudCwgXCJIZWFkaW5nIDJcIiwgXCJDdHJsK0FsdCsyXCIpKTtcclxuICAgICAgICB0dXJuSW50b0Jhckxpc3QuYXBwZW5kKG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcInR1cm5JbnRvT3B0aW9uSGVhZGluZzNcIiwgdHVybkludG9CYXJMaXN0LCBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLkJMT0NLX09QRVJBVElPTlMuVFJBTlNGT1JNX0JMT0NLLCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfMywgU1ZHSWNvbnMuaGVhZDMuaHRtbEVsZW1lbnQsIFwiSGVhZGluZyAzXCIsIFwiQ3RybCtBbHQrM1wiKSk7XHJcbiAgICAgICAgdHVybkludG9CYXJMaXN0LmFwcGVuZChuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW0oXCJ0dXJuSW50b09wdGlvbkhlYWRpbmc0XCIsIHR1cm5JbnRvQmFyTGlzdCwgQmxvY2tPcGVyYXRpb25zU2VydmljZS5CTE9DS19PUEVSQVRJT05TLlRSQU5TRk9STV9CTE9DSywgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuSEVBREVSXzQsIFNWR0ljb25zLmhlYWQ0Lmh0bWxFbGVtZW50LCBcIkhlYWRpbmcgNFwiLCBcIkN0cmwrQWx0KzRcIikpO1xyXG4gICAgICAgIHR1cm5JbnRvQmFyTGlzdC5hcHBlbmQobmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwidHVybkludG9PcHRpb25IZWFkaW5nNVwiLCB0dXJuSW50b0Jhckxpc3QsIEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuQkxPQ0tfT1BFUkFUSU9OUy5UUkFOU0ZPUk1fQkxPQ0ssIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl81LCBTVkdJY29ucy5oZWFkNS5odG1sRWxlbWVudCwgXCJIZWFkaW5nIDVcIiwgXCJDdHJsK0FsdCs1XCIpKTtcclxuICAgICAgICB0dXJuSW50b0Jhckxpc3QuYXBwZW5kKG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcInR1cm5JbnRvT3B0aW9uSGVhZGluZzZcIiwgdHVybkludG9CYXJMaXN0LCBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLkJMT0NLX09QRVJBVElPTlMuVFJBTlNGT1JNX0JMT0NLLCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfNiwgU1ZHSWNvbnMuaGVhZDYuaHRtbEVsZW1lbnQsIFwiSGVhZGluZyA2XCIsIFwiQ3RybCtBbHQrNlwiKSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0dXJuSW50b0Ryb3Bkb3duO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBzZXBhcmF0b3IoaWQ6IHN0cmluZyk6IEZsb2F0aW5nVG9vbGJhclNlcGFyYXRvciB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBGbG9hdGluZ1Rvb2xiYXJTZXBhcmF0b3IoaWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBidXR0b25Hcm91cCgpOiBCdXR0b25Hcm91cCB7XHJcbiAgICAgICAgY29uc3QgZ3JvdXBCdXR0b24gPSBuZXcgQnV0dG9uR3JvdXAoKTtcclxuXHJcbiAgICAgICAgQnV0dG9uR3JvdXBJdGVtLmNyZWF0ZShCdXR0b25JRHMuTGluaywgQ29tbWFuZHMudG9nZ2xlTGluaywgXCJMaW5rXCIsIFNWR0ljb24uY3JlYXRlKEljb25zLkxpbmssIFNpemVzLmxhcmdlKSkuYXBwZW5kVG8oZ3JvdXBCdXR0b24pO1xyXG4gICAgICAgIEJ1dHRvbkdyb3VwSXRlbS5jcmVhdGUoQnV0dG9uSURzLkJvbGQsIENvbW1hbmRzLnRvZ2dsZUJvbGQsIFwiQm9sZFwiLCBTVkdJY29uLmNyZWF0ZShJY29ucy5Cb2xkLCBTaXplcy5sYXJnZSkpLmFwcGVuZFRvKGdyb3VwQnV0dG9uKTtcclxuICAgICAgICBCdXR0b25Hcm91cEl0ZW0uY3JlYXRlKEJ1dHRvbklEcy5JdGFsaWMsIENvbW1hbmRzLnRvZ2dsZUl0YWxpYywgXCJJdGFsaWNcIiwgU1ZHSWNvbi5jcmVhdGUoSWNvbnMuSXRhbGljLCBTaXplcy5sYXJnZSkpLmFwcGVuZFRvKGdyb3VwQnV0dG9uKTtcclxuICAgICAgICBCdXR0b25Hcm91cEl0ZW0uY3JlYXRlKEJ1dHRvbklEcy5VbmRlcmxpbmUsIENvbW1hbmRzLnRvZ2dsZVVuZGVybGluZSwgXCJVbmRlcmxpbmVcIiwgU1ZHSWNvbi5jcmVhdGUoSWNvbnMuVW5kZXJsaW5lLCBTaXplcy5sYXJnZSkpLmFwcGVuZFRvKGdyb3VwQnV0dG9uKTtcclxuICAgICAgICBCdXR0b25Hcm91cEl0ZW0uY3JlYXRlKEJ1dHRvbklEcy5JbmxpbmVDb2RlLCBDb21tYW5kcy50b2dnbGVJbmxpbmVDb2RlLCBcIkNvZGVcIiwgU1ZHSWNvbi5jcmVhdGUoSWNvbnMuSW5saW5lQ29kZSwgU2l6ZXMubGFyZ2UpKS5hcHBlbmRUbyhncm91cEJ1dHRvbik7XHJcbiAgICAgICAgQnV0dG9uR3JvdXBJdGVtLmNyZWF0ZShCdXR0b25JRHMuU3RyaWtldGhyb3VnaCwgQ29tbWFuZHMudG9nZ2xlU3RyaWtlVGhyb3VnaCwgXCJTdHJpa2UtdGhyb3VnaFwiLCBTVkdJY29uLmNyZWF0ZShJY29ucy5TdHJpa2VUaHJvdWdoLCBTaXplcy5sYXJnZSkpLmFwcGVuZFRvKGdyb3VwQnV0dG9uKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGdyb3VwQnV0dG9uO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBjb2xvckRyb3Bkb3duKCk6IERyb3Bkb3duTWVudSB7XHJcblxyXG4gICAgICAgIGNvbnN0IGNvbG9yRHJvcGRvd25MaXN0ID0gbmV3IERyb3Bkb3duTWVudUxpc3QoRHJvcGRvd25MaXN0SURzLkNvbG9yVGV4dE9wdGlvblNlbGVjdCk7XHJcbiAgICAgICAgY29uc3QgY29sb3JCdXR0b24gPSBuZXcgRHJvcGRvd25NZW51QnV0dG9uKFwiY29sb3JUZXh0QnV0dG9uXCIsIG5ldyBDb2xvckljb24oXCIjRkFGNEQxXCIpLmh0bWxFbGVtZW50LCBjb2xvckRyb3Bkb3duTGlzdCk7XHJcbiAgICAgICAgY29uc3QgY29sb3JEcm9wZG93biA9IG5ldyBEcm9wZG93bk1lbnUoRHJvcGRvd25NZW51SURzLkNvbG9yVGV4dE9wdGlvbnNNZW51LCBjb2xvckJ1dHRvbiwgY29sb3JEcm9wZG93bkxpc3QpO1xyXG5cclxuICAgICAgICBjb2xvckRyb3Bkb3duTGlzdC5hcHBlbmQobmV3IERyb3Bkb3duTWVudUxpc3RJdGVtVGl0bGUoY29sb3JEcm9wZG93bkxpc3QsIFwiQmFja2dyb3VuZFwiKSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGhpbGl0ZUNvbG9yUmVkID0gbmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKERyb3Bkb3duSXRlbUlEcy5CYWNrZ3JvdW5kT3B0aW9uUmVkLCBjb2xvckRyb3Bkb3duTGlzdCwgQ29tbWFuZHMudG9nZ2xlSGlsaXRlQ29sb3IsIENvbG9ycy5IaWxpdGVDb2xvclJlZCwgbmV3IENvbG9ySWNvbihDb2xvcnMuSGlsaXRlQ29sb3JSZWQpLmh0bWxFbGVtZW50LCBcIlJlZFwiKTtcclxuICAgICAgICBoaWxpdGVDb2xvclJlZC5hZGRDbGFzcyhcImhpbGl0ZUNvbG9yXCIpO1xyXG5cclxuICAgICAgICBjb25zdCBIaWxpdGVDb2xvckdyZWVuID0gbmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKERyb3Bkb3duSXRlbUlEcy5CYWNrZ3JvdW5kT3B0aW9uR3JlZW4sIGNvbG9yRHJvcGRvd25MaXN0LCBDb21tYW5kcy50b2dnbGVIaWxpdGVDb2xvciwgQ29sb3JzLkhpbGl0ZUNvbG9yR3JlZW4sIG5ldyBDb2xvckljb24oQ29sb3JzLkhpbGl0ZUNvbG9yR3JlZW4pLmh0bWxFbGVtZW50LCBcIkdyZWVuXCIpO1xyXG4gICAgICAgIEhpbGl0ZUNvbG9yR3JlZW4uYWRkQ2xhc3MoXCJoaWxpdGVDb2xvclwiKTtcclxuXHJcbiAgICAgICAgY29uc3QgaGlsaXRlQ29sb3JCbHVlID0gbmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKERyb3Bkb3duSXRlbUlEcy5CYWNrZ3JvdW5kT3B0aW9uQmx1ZSwgY29sb3JEcm9wZG93bkxpc3QsIENvbW1hbmRzLnRvZ2dsZUhpbGl0ZUNvbG9yLCBDb2xvcnMuSGlsaXRlQ29sb3JCbHVlLCBuZXcgQ29sb3JJY29uKENvbG9ycy5IaWxpdGVDb2xvckJsdWUpLmh0bWxFbGVtZW50LCBcIkJsdWVcIik7XHJcbiAgICAgICAgaGlsaXRlQ29sb3JCbHVlLmFkZENsYXNzKFwiaGlsaXRlQ29sb3JcIik7XHJcblxyXG4gICAgICAgIGNvbnN0IGhpbGl0ZUNvbG9yWWVsbG93ID0gbmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKERyb3Bkb3duSXRlbUlEcy5CYWNrZ3JvdW5kT3B0aW9uWWVsbG93LCBjb2xvckRyb3Bkb3duTGlzdCwgQ29tbWFuZHMudG9nZ2xlSGlsaXRlQ29sb3IsIENvbG9ycy5IaWxpdGVDb2xvclllbGxvdywgbmV3IENvbG9ySWNvbihDb2xvcnMuSGlsaXRlQ29sb3JZZWxsb3cpLmh0bWxFbGVtZW50LCBcIlllbGxvd1wiKTtcclxuICAgICAgICBoaWxpdGVDb2xvclllbGxvdy5hZGRDbGFzcyhcImhpbGl0ZUNvbG9yXCIpO1xyXG5cclxuICAgICAgICBjb25zdCBoaWxpdGVDb2xvckdyZXkgPSBuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW0oRHJvcGRvd25JdGVtSURzLkJhY2tncm91bmRPcHRpb25HcmV5LCBjb2xvckRyb3Bkb3duTGlzdCwgQ29tbWFuZHMudG9nZ2xlSGlsaXRlQ29sb3IsIENvbG9ycy5IaWxpdGVDb2xvckdyZXksIG5ldyBDb2xvckljb24oQ29sb3JzLkhpbGl0ZUNvbG9yR3JleSkuaHRtbEVsZW1lbnQsIFwiR3JleVwiKTtcclxuICAgICAgICBoaWxpdGVDb2xvckdyZXkuYWRkQ2xhc3MoXCJoaWxpdGVDb2xvclwiKTtcclxuXHJcbiAgICAgICAgY29uc3QgaGlsaXRlQ29sb3JOb25lID0gbmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKERyb3Bkb3duSXRlbUlEcy5CYWNrZ3JvdW5kT3B0aW9uTm9uZSwgY29sb3JEcm9wZG93bkxpc3QsIENvbW1hbmRzLnRvZ2dsZUhpbGl0ZUNvbG9yLCBDb2xvcnMuSGlsaXRlQ29sb3JOb25lLCBuZXcgQ29sb3JJY29uKENvbG9ycy5IaWxpdGVDb2xvck5vbmUpLmh0bWxFbGVtZW50LCBcIk5vbmVcIik7XHJcbiAgICAgICAgaGlsaXRlQ29sb3JOb25lLmFkZENsYXNzKFwiaGlsaXRlQ29sb3JcIik7XHJcblxyXG4gICAgICAgIGNvbG9yRHJvcGRvd25MaXN0LmFwcGVuZChoaWxpdGVDb2xvclJlZCk7XHJcbiAgICAgICAgY29sb3JEcm9wZG93bkxpc3QuYXBwZW5kKEhpbGl0ZUNvbG9yR3JlZW4pO1xyXG4gICAgICAgIGNvbG9yRHJvcGRvd25MaXN0LmFwcGVuZChoaWxpdGVDb2xvckJsdWUpO1xyXG4gICAgICAgIGNvbG9yRHJvcGRvd25MaXN0LmFwcGVuZChoaWxpdGVDb2xvclllbGxvdyk7XHJcbiAgICAgICAgY29sb3JEcm9wZG93bkxpc3QuYXBwZW5kKGhpbGl0ZUNvbG9yR3JleSk7XHJcbiAgICAgICAgY29sb3JEcm9wZG93bkxpc3QuYXBwZW5kKGhpbGl0ZUNvbG9yTm9uZSk7XHJcblxyXG4gICAgICAgIGNvbG9yRHJvcGRvd25MaXN0LmFwcGVuZChuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW1UaXRsZShjb2xvckRyb3Bkb3duTGlzdCwgXCJDb2xvclwiKSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGZvcmVDb2xvclJlZCA9IG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcImNvbG9yT3B0aW9uUmVkXCIsIGNvbG9yRHJvcGRvd25MaXN0LCBDb21tYW5kcy50b2dnbGVGb3JlQ29sb3IsIENvbG9ycy5Gb3JlQ29sb3JSZWQsIG5ldyBTVkdJY29uKFwiaWNvbi1tYXRlcmlhbC1mb3JtYXRcIiwgU2l6ZXMubGFyZ2UpLmh0bWxFbGVtZW50LCBcIlJlZFwiKTtcclxuICAgICAgICBmb3JlQ29sb3JSZWQuYWRkQ2xhc3MoXCJmb3JlQ29sb3JcIik7XHJcblxyXG4gICAgICAgIGNvbnN0IGZvcmVDb2xvckdyZWVuID0gbmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwiY29sb3JPcHRpb25HcmVlblwiLCBjb2xvckRyb3Bkb3duTGlzdCwgQ29tbWFuZHMudG9nZ2xlRm9yZUNvbG9yLCBDb2xvcnMuRm9yZUNvbG9yR3JlZW4sIG5ldyBTVkdJY29uKFwiaWNvbi1tYXRlcmlhbC1mb3JtYXRcIiwgU2l6ZXMubGFyZ2UpLmh0bWxFbGVtZW50LCBcIkdyZWVuXCIpO1xyXG4gICAgICAgIGZvcmVDb2xvckdyZWVuLmFkZENsYXNzKFwiZm9yZUNvbG9yXCIpO1xyXG5cclxuICAgICAgICBjb25zdCBmb3JlQ29sb3JCbHVlID0gbmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwiY29sb3JPcHRpb25CbHVlXCIsIGNvbG9yRHJvcGRvd25MaXN0LCBDb21tYW5kcy50b2dnbGVGb3JlQ29sb3IsIENvbG9ycy5Gb3JlQ29sb3JCbHVlLCBuZXcgU1ZHSWNvbihcImljb24tbWF0ZXJpYWwtZm9ybWF0XCIsIFNpemVzLmxhcmdlKS5odG1sRWxlbWVudCwgXCJCbHVlXCIpO1xyXG4gICAgICAgIGZvcmVDb2xvckJsdWUuYWRkQ2xhc3MoXCJmb3JlQ29sb3JcIik7XHJcblxyXG4gICAgICAgIGNvbnN0IGZvcmVDb2xvclllbGxvdyA9IG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcImNvbG9yT3B0aW9uWWVsbG93XCIsIGNvbG9yRHJvcGRvd25MaXN0LCBDb21tYW5kcy50b2dnbGVGb3JlQ29sb3IsIENvbG9ycy5Gb3JlQ29sb3JZZWxsb3csIG5ldyBTVkdJY29uKFwiaWNvbi1tYXRlcmlhbC1mb3JtYXRcIiwgU2l6ZXMubGFyZ2UpLmh0bWxFbGVtZW50LCBcIlllbGxvd1wiKTtcclxuICAgICAgICBmb3JlQ29sb3JZZWxsb3cuYWRkQ2xhc3MoXCJmb3JlQ29sb3JcIik7XHJcblxyXG4gICAgICAgIGNvbnN0IGZvcmVDb2xvckdyZXkgPSBuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW0oXCJjb2xvck9wdGlvbkdyZXlcIiwgY29sb3JEcm9wZG93bkxpc3QsIENvbW1hbmRzLnRvZ2dsZUZvcmVDb2xvciwgQ29sb3JzLkZvcmVDb2xvckdyZXksIG5ldyBTVkdJY29uKFwiaWNvbi1tYXRlcmlhbC1mb3JtYXRcIiwgU2l6ZXMubGFyZ2UpLmh0bWxFbGVtZW50LCBcIkdyZXlcIik7XHJcbiAgICAgICAgZm9yZUNvbG9yR3JleS5hZGRDbGFzcyhcImZvcmVDb2xvclwiKTtcclxuXHJcbiAgICAgICAgY29uc3QgZm9yZUNvbG9yTm9uZSA9IG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcImNvbG9yT3B0aW9uTm9uZVwiLCBjb2xvckRyb3Bkb3duTGlzdCwgQ29tbWFuZHMudG9nZ2xlRm9yZUNvbG9yLCBDb2xvcnMuRm9yZUNvbG9ySW5pdGlhbCwgbmV3IFNWR0ljb24oXCJpY29uLW1hdGVyaWFsLWZvcm1hdFwiLCBTaXplcy5sYXJnZSkuaHRtbEVsZW1lbnQsIFwiTm9uZVwiKTtcclxuICAgICAgICBmb3JlQ29sb3JOb25lLmFkZENsYXNzKFwiZm9yZUNvbG9yXCIpO1xyXG5cclxuICAgICAgICBjb2xvckRyb3Bkb3duTGlzdC5hcHBlbmQoZm9yZUNvbG9yUmVkKTtcclxuICAgICAgICBjb2xvckRyb3Bkb3duTGlzdC5hcHBlbmQoZm9yZUNvbG9yR3JlZW4pO1xyXG4gICAgICAgIGNvbG9yRHJvcGRvd25MaXN0LmFwcGVuZChmb3JlQ29sb3JCbHVlKTtcclxuICAgICAgICBjb2xvckRyb3Bkb3duTGlzdC5hcHBlbmQoZm9yZUNvbG9yWWVsbG93KTtcclxuICAgICAgICBjb2xvckRyb3Bkb3duTGlzdC5hcHBlbmQoZm9yZUNvbG9yR3JleSk7XHJcbiAgICAgICAgY29sb3JEcm9wZG93bkxpc3QuYXBwZW5kKGZvcmVDb2xvck5vbmUpO1xyXG5cclxuICAgICAgICByZXR1cm4gY29sb3JEcm9wZG93bjtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgbW9yZU9wdGlvbnNEcm9wZG93bigpOiBEcm9wZG93bk1lbnUge1xyXG5cclxuICAgICAgICBjb25zdCBpY29uID0gbmV3IFNWR0ljb24oXCJpY29uLW1hdGVyaWFsLW1vcmVcIiwgU2l6ZXMubGFyZ2UpO1xyXG5cclxuICAgICAgICBjb25zdCBtb3JlT3B0aW9uc0xpc3QgPSBuZXcgRHJvcGRvd25NZW51TGlzdChcIm1vcmVUZXh0T3B0aW9uU2VsZWN0XCIpO1xyXG4gICAgICAgIGNvbnN0IG1vcmVPcHRpb25zQnV0dG9uID0gbmV3IERyb3Bkb3duTWVudUJ1dHRvbihcIm1vcmVUZXh0T3B0aW9uQnV0dG9uXCIsIGljb24uaHRtbEVsZW1lbnQsIG1vcmVPcHRpb25zTGlzdCwgZmFsc2UpO1xyXG4gICAgICAgIGNvbnN0IG1vcmVPcHRpb25zRHJvcGRvd24gPSBuZXcgRHJvcGRvd25NZW51KFwibW9yZVRleHRPcHRpb25zTWVudVwiLCBtb3JlT3B0aW9uc0J1dHRvbiwgbW9yZU9wdGlvbnNMaXN0KTtcclxuXHJcbiAgICAgICAgbW9yZU9wdGlvbnNMaXN0LmFwcGVuZChuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW1UaXRsZShtb3JlT3B0aW9uc0xpc3QsIFwiTW9yZSBvcHRpb25zXCIpKTtcclxuXHJcbiAgICAgICAgbW9yZU9wdGlvbnNMaXN0LmFwcGVuZChuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW0oXCJjb3B5T3B0aW9uXCIsIG1vcmVPcHRpb25zTGlzdCwgQmxvY2tPcGVyYXRpb25zU2VydmljZS5CTE9DS19PUEVSQVRJT05TLkNPUFksIG51bGwsIFNWR0ljb25zLmNvcHkuaHRtbEVsZW1lbnQsIFwiQ29weVwiLCBcIkN0cmwrQ1wiKSk7XHJcbiAgICAgICAgbW9yZU9wdGlvbnNMaXN0LmFwcGVuZChuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW0oXCJjdXRPcHRpb25cIiwgbW9yZU9wdGlvbnNMaXN0LCBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLkJMT0NLX09QRVJBVElPTlMuQ1VULCBudWxsLCBTVkdJY29ucy5jdXQuaHRtbEVsZW1lbnQsIFwiQ3V0XCIsIFwiQ3RybCtYXCIpKTtcclxuICAgICAgICBtb3JlT3B0aW9uc0xpc3QuYXBwZW5kKG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcInBhc3RlT3B0aW9uXCIsIG1vcmVPcHRpb25zTGlzdCwgQmxvY2tPcGVyYXRpb25zU2VydmljZS5CTE9DS19PUEVSQVRJT05TLlBBU1RFLCBudWxsLCBTVkdJY29ucy5wYXN0ZS5odG1sRWxlbWVudCwgXCJSZXBsYWNlXCIsIFwiQ3RybCtWXCIpKTtcclxuICAgICAgICBtb3JlT3B0aW9uc0xpc3QuYXBwZW5kKG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcImR1cGxpY2F0ZU9wdGlvblwiLCBtb3JlT3B0aW9uc0xpc3QsIEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuQkxPQ0tfT1BFUkFUSU9OUy5EVVBMSUNBVEUsIG51bGwsIFNWR0ljb25zLmR1cGxpY2F0ZS5odG1sRWxlbWVudCwgXCJDbG9uZSBCbG9ja1wiLCBcIkN0cmwrRFwiKSk7XHJcbiAgICAgICAgbW9yZU9wdGlvbnNMaXN0LmFwcGVuZChuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW0oXCJyZXNldE9wdGlvblwiLCBtb3JlT3B0aW9uc0xpc3QsIEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuQkxPQ0tfT1BFUkFUSU9OUy5SRU1PVkVfRk9STUFULCBudWxsLCBTVkdJY29ucy5lcmFzZXIuaHRtbEVsZW1lbnQsIFwiUmVzZXQgU3R5bGVcIiwgXCJDdHJsK1xcXFxcIikpO1xyXG5cclxuICAgICAgICBjb25zdCBkZWxldGVJdGVtID0gbmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwiZGVsZXRlT3B0aW9uXCIsIG1vcmVPcHRpb25zTGlzdCwgQmxvY2tPcGVyYXRpb25zU2VydmljZS5CTE9DS19PUEVSQVRJT05TLkRFTEVURSwgbnVsbCwgU1ZHSWNvbnMuZGVsZXRlLmh0bWxFbGVtZW50LCBcIkRlbGV0ZSBCbG9ja1wiLCBcIlNoaWZ0K0RlbFwiKTtcclxuICAgICAgICBkZWxldGVJdGVtLmFkZENzc0NsYXNzKFwiZGFuZ2VyLW9wdGlvblwiKTtcclxuXHJcbiAgICAgICAgbW9yZU9wdGlvbnNMaXN0LmFwcGVuZChkZWxldGVJdGVtKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIG1vcmVPcHRpb25zRHJvcGRvd247XHJcbiAgICB9XHJcbn1cclxuXHJcbmNvbnN0IFNWR0ljb25zOiBhbnkgPSB7XHJcblxyXG4gICAgcGFyYWdyYXBoOiBuZXcgU1ZHSWNvbihcImljb24tbWF0ZXJpYWwtZm9ybWF0XCIsIFwiMS4yNXJlbVwiKSxcclxuICAgIHRvZG9fbGlzdDogbmV3IFNWR0ljb24oXCJpY29uLW1hdGVyaWFsLWNoZWNrLWxpc3QtMlwiLCBTaXplcy5sYXJnZSksXHJcbiAgICBiX2xpc3Q6IG5ldyBTVkdJY29uKFwiaWNvbi13b3JkcHJlc3MtYnVsbGV0ZWQtbGlzdFwiLCBTaXplcy5sYXJnZSksXHJcbiAgICBuX2xpc3Q6IG5ldyBTVkdJY29uKFwiaWNvbi13b3JkcHJlc3MtbnVtYmVyZWQtbGlzdFwiLCBTaXplcy5sYXJnZSksXHJcbiAgICBjb2RlOiBuZXcgU1ZHSWNvbihcImljb24td29yZHByZXNzLWNvZGUtbWFya1wiLCBTaXplcy5sYXJnZSksXHJcbiAgICBxdW90ZTogbmV3IFNWR0ljb24oXCJpY29uLXdvcmRwcmVzcy1xdW90ZVwiLCBTaXplcy5sYXJnZSksXHJcbiAgICBoZWFkMTogbmV3IFNWR0ljb24oXCJpY29uLWp1bGlhLWhlYWQtMVwiLCBTaXplcy5sYXJnZSksXHJcbiAgICBoZWFkMjogbmV3IFNWR0ljb24oXCJpY29uLWp1bGlhLWhlYWQtMlwiLCBTaXplcy5sYXJnZSksXHJcbiAgICBoZWFkMzogbmV3IFNWR0ljb24oXCJpY29uLWp1bGlhLWhlYWQtM1wiLCBTaXplcy5sYXJnZSksXHJcbiAgICBoZWFkNDogbmV3IFNWR0ljb24oXCJpY29uLWp1bGlhLWhlYWQtNFwiLCBTaXplcy5sYXJnZSksXHJcbiAgICBoZWFkNTogbmV3IFNWR0ljb24oXCJpY29uLWp1bGlhLWhlYWQtNVwiLCBTaXplcy5sYXJnZSksXHJcbiAgICBoZWFkNjogbmV3IFNWR0ljb24oXCJpY29uLWp1bGlhLWhlYWQtNlwiLCBTaXplcy5sYXJnZSksXHJcbiAgICBkdXBsaWNhdGU6IG5ldyBTVkdJY29uKFwiaWNvbi1tYXRlcmlhbC1kdXBsaWNhdGVcIiwgU2l6ZXMubGFyZ2UpLFxyXG4gICAgZGVsZXRlOiBuZXcgU1ZHSWNvbihcImljb24tbWF0ZXJpYWwtdHJhc2hcIiwgU2l6ZXMubGFyZ2UpLFxyXG4gICAgZXJhc2VyOiBuZXcgU1ZHSWNvbihcImljb24tbWF0ZXJpYWwtY2xlYXJcIiwgU2l6ZXMubGFyZ2UpLFxyXG4gICAgY29weTogbmV3IFNWR0ljb24oXCJpY29uLW1hdGVyaWFsLWNvcHlcIiwgU2l6ZXMubGFyZ2UpLFxyXG4gICAgY3V0OiBuZXcgU1ZHSWNvbihcImljb24tbWF0ZXJpYWwtY3V0XCIsIFNpemVzLmxhcmdlKSxcclxuICAgIHBhc3RlOiBuZXcgU1ZHSWNvbihcImljb24tbWF0ZXJpYWwtcGFzdGVcIiwgU2l6ZXMubGFyZ2UpXHJcbn0iLCJpbXBvcnQgeyBCYXNlVUlDb21wb25lbnQgfSBmcm9tICcuLi9jb21tb24vQmFzZVVJQ29tcG9uZW50JztcclxuXHJcbmV4cG9ydCBjbGFzcyBRdWlja01lbnVFbXB0eSBleHRlbmRzIEJhc2VVSUNvbXBvbmVudCB7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcblxyXG4gICAgICAgIHN1cGVyKHt9KTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0KCk6IEhUTUxFbGVtZW50IHtcclxuXHJcbiAgICAgICAgY29uc3QgaHRtbEVtcHR5SW5kaWNhdG9yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xyXG5cclxuICAgICAgICBodG1sRW1wdHlJbmRpY2F0b3IuaW5uZXJUZXh0ID0gJ05vIHJlc3VsdHMnO1xyXG4gICAgICAgIGh0bWxFbXB0eUluZGljYXRvci5jbGFzc0xpc3QuYWRkKCdlbXB0eS1ibG9jay1vcHRpb25zJyk7XHJcbiAgICAgICAgaHRtbEVtcHR5SW5kaWNhdG9yLnN0eWxlLnBhZGRpbmcgPSAnMTBweCc7XHJcbiAgICAgICAgaHRtbEVtcHR5SW5kaWNhdG9yLnN0eWxlLmNvbG9yID0gJ3JnYmEoNTUsIDUzLCA0NywgMC42NSknO1xyXG4gICAgICAgIGh0bWxFbXB0eUluZGljYXRvci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG5cclxuICAgICAgICByZXR1cm4gaHRtbEVtcHR5SW5kaWNhdG9yO1xyXG4gICAgfVxyXG59IiwiZXhwb3J0IGVudW0gRE9NRWxlbWVudHMge1xyXG4gICAgVEQgPSBcInRkXCIsXHJcbiAgICBUQUJMRSA9IFwidGFibGVcIlxyXG59IiwiLyoqXHJcbiAqIEVudW0gZm9yIGtleWJvYXJkIGFycm93IGRpcmVjdGlvbnMuXHJcbiAqIEBlbnVtIHtzdHJpbmd9XHJcbiAqL1xyXG5leHBvcnQgZW51bSBEaXJlY3Rpb25zIHtcclxuICAgIC8qKiBSZXByZXNlbnRzIHRoZSAnQXJyb3dVcCcga2V5LCB1c2VkIHRvIG5hdmlnYXRlIHVwd2FyZHMgaW4gdGhlIEVkaXRvci4gKi9cclxuICAgIEFycm93VXAgPSBcIkFycm93VXBcIixcclxuICAgIC8qKiBSZXByZXNlbnRzIHRoZSAnQXJyb3dEb3duJyBrZXksIHVzZWQgdG8gbmF2aWdhdGUgZG93bndhcmRzIGluIHRoZSBFZGl0b3IuICovXHJcbiAgICBBcnJvd0Rvd24gPSBcIkFycm93RG93blwiLFxyXG4gICAgLyoqIFJlcHJlc2VudHMgdGhlICdBcnJvd0xlZnQnIGtleSwgdXNlZCB0byBuYXZpZ2F0ZSBsZWZ0IGluIHRoZSBFZGl0b3IuICovXHJcbiAgICBBcnJvd0xlZnQgPSBcIkFycm93TGVmdFwiLFxyXG4gICAgLyoqIFJlcHJlc2VudHMgdGhlICdBcnJvd1JpZ2h0JyBrZXksIHVzZWQgdG8gbmF2aWdhdGUgcmlnaHQgaW4gdGhlIEVkaXRvci4gKi9cclxuICAgIEFycm93UmlnaHQgPSBcIkFycm93UmlnaHRcIixcclxufVxyXG4iLCJleHBvcnQgZW51bSBUYWJsZVNjb3BlcyB7XHJcbiAgICBDb2x1bW4gPSBcIkNvbHVtblwiLFxyXG4gICAgUm93ID0gXCJSb3dcIixcclxuICAgIENlbGwgPSBcIkNlbGxcIixcclxuICAgIFNlbGVjdGVkQ2VsbHMgPSBcIlNlbGVjdGVkQ2VsbHNcIlxyXG59IiwiZXhwb3J0IGVudW0gS2V5Ym9hcmRLZXlzIHtcclxuICAgIFNoaWZ0ID0gXCJTaGlmdFwiLFxyXG4gICAgRW50ZXIgPSBcIkVudGVyXCIsXHJcbiAgICBFc2NhcGUgPSBcIkVzY2FwZVwiXHJcbn0iLCJleHBvcnQgZW51bSBTZWxlY3Rpb25Nb2RlcyB7XHJcbiAgICBUZXh0ID0gXCJUZXh0XCIsXHJcbiAgICBDZWxsID0gXCJDZWxsXCIsXHJcbiAgICBCbG9jayA9IFwiQmxvY2tcIlxyXG59IiwiZXhwb3J0IGVudW0gVG9vbGJhcklEcyB7XHJcbiAgICBUYWJsZVRvb2xiYXIgPSBcInRhYmxlRmxvYXRpbmdUb29sYmFyXCIsXHJcbiAgICBUZXh0VG9vbGJhciA9IFwidGV4dEZsb2F0aW5nVG9vbGJhclwiXHJcbn0iLCIvKipcclxuICogRW51bSBmb3Igc3BlY2lmeWluZyBib3VuZGFyaWVzIHdpdGhpbiBhbiBlbGVtZW50LlxyXG4gKiBAZW51bSB7c3RyaW5nfVxyXG4gKi9cclxuZXhwb3J0IGVudW0gQm91bmRhcmllcyB7XHJcbiAgICAvKiogUmVwcmVzZW50cyB0aGUgZmlyc3QgbGluZSBvZiBhbiBlbGVtZW50LCBpbXBvcnRhbnQgZm9yIGRldGVybWluaW5nIGlmIHRoZSBjdXJzb3IgaXMgYXQgdGhlIHN0YXJ0aW5nIGJvdW5kYXJ5LiAqL1xyXG4gICAgRmlyc3QgPSBcIkZpcnN0XCIsXHJcbiAgICAvKiogUmVwcmVzZW50cyB0aGUgbGFzdCBsaW5lIG9mIGFuIGVsZW1lbnQsIGltcG9ydGFudCBmb3IgZGV0ZXJtaW5pbmcgaWYgdGhlIGN1cnNvciBpcyBhdCB0aGUgZW5kaW5nIGJvdW5kYXJ5LiAqL1xyXG4gICAgTGFzdCA9IFwiTGFzdFwiXHJcbn0iLCJpbXBvcnQgeyBRdWlja01lbnVTZWN0aW9uIH0gZnJvbSAnLi9RdWlja01lbnVTZWN0aW9uJztcbmltcG9ydCB7IFF1aWNrTWVudUVtcHR5IH0gZnJvbSAnLi9RdWlja01lbnVFbXB0eSc7XG5pbXBvcnQgeyBRdWlja01lbnVJdGVtIH0gZnJvbSAnLi9RdWlja01lbnVJdGVtJztcbmltcG9ydCB7IEJhc2VVSUNvbXBvbmVudCB9IGZyb20gJy4uL2NvbW1vbi9CYXNlVUlDb21wb25lbnQnO1xuaW1wb3J0IHsgQ2lyY3VsYXJEb3VibHlMaW5rZWRMaXN0IH0gZnJvbSAnLi4vLi4vY29tbW9uL0NpcmN1bGFyRG91Ymx5TGlua2VkTGlzdCc7XG5pbXBvcnQgeyBJQmxvY2tPcGVyYXRpb25zU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2Jsb2NrLW9wZXJhdGlvbnMvSUJsb2NrT3BlcmF0aW9uc1NlcnZpY2UnO1xuaW1wb3J0IHsgSk5vZGUgfSBmcm9tIFwiLi4vLi4vY29tbW9uL0pOb2RlXCI7XG5pbXBvcnQgeyBEZXBlbmRlbmN5Q29udGFpbmVyIH0gZnJvbSAnQC9jb3JlL0RlcGVuZGVuY3lDb250YWluZXInO1xuaW1wb3J0IHsgSUZvY3VzU3RhY2sgfSBmcm9tICdAL2NvcmUvSUZvY3VzU3RhY2snO1xuaW1wb3J0IHsgSVF1aWNrTWVudSB9IGZyb20gJy4vSVF1aWNrTWVudSc7XG5pbXBvcnQgeyBJQ29tbWFuZEV2ZW50RGV0YWlsIH0gZnJvbSAnQC9jb21tYW5kcy9JQ29tbWFuZEV2ZW50RGV0YWlsJztcbmltcG9ydCB7IEN1c3RvbUV2ZW50cyB9IGZyb20gJ0AvY29tbW9uL0N1c3RvbUV2ZW50cyc7XG5pbXBvcnQgeyBDb21tYW5kcyB9IGZyb20gJ0AvY29tbWFuZHMvQ29tbWFuZHMnO1xuaW1wb3J0IHsgRE9NVXRpbHMgfSBmcm9tICdAL3V0aWxpdGllcy9ET01VdGlscyc7XG5pbXBvcnQgeyBET01FbGVtZW50cyB9IGZyb20gJ0AvY29tbW9uL0RPTUVsZW1lbnRzJztcblxuZXhwb3J0IGNsYXNzIFF1aWNrTWVudSBleHRlbmRzIEJhc2VVSUNvbXBvbmVudCBpbXBsZW1lbnRzIElRdWlja01lbnUge1xuXG4gICAgc3RhdGljIGlkID0gXCJxdWlja01lbnVcIjtcblxuICAgIHByaXZhdGUgYmxvY2tPcGVyYXRpb25zU2VydmljZTogSUJsb2NrT3BlcmF0aW9uc1NlcnZpY2U7XG5cbiAgICBwcml2YXRlIGN1cnJlbnRGb2N1c2VkTWVudUl0ZW06IEpOb2RlPFF1aWNrTWVudUl0ZW0+IHwgbnVsbDtcblxuICAgIC8vIHByaXZhdGUgaHRtbEZvY3VzZWRFbGVtZW50QmVmb3JlT3BlblF1aWNrTWVudTogSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgIHByaXZhdGUgbWVudVNlY3Rpb25zOiBDaXJjdWxhckRvdWJseUxpbmtlZExpc3Q8UXVpY2tNZW51U2VjdGlvbj47XG4gICAgcHJpdmF0ZSBxdWlja01lbnVFbXB0eTogUXVpY2tNZW51RW1wdHk7XG4gICAgcHJpdmF0ZSBmaWx0ZXJJbnB1dDogc3RyaW5nO1xuXG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IFF1aWNrTWVudSB8IG51bGw7XG5cbiAgICBwcml2YXRlIGZvY3VzU3RhY2s6IElGb2N1c1N0YWNrO1xuXG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihibG9ja09wZXJhdGlvbnNTZXJ2aWNlOiBJQmxvY2tPcGVyYXRpb25zU2VydmljZSwgZm9jdXNTdGFjazogSUZvY3VzU3RhY2spIHtcblxuICAgICAgICBzdXBlcih7fSk7XG5cbiAgICAgICAgdGhpcy5jdXJyZW50Rm9jdXNlZE1lbnVJdGVtID0gbnVsbDtcbiAgICAgICAgLy8gdGhpcy5odG1sRm9jdXNlZEVsZW1lbnRCZWZvcmVPcGVuUXVpY2tNZW51ID0gbnVsbDtcbiAgICAgICAgdGhpcy5tZW51U2VjdGlvbnMgPSBuZXcgQ2lyY3VsYXJEb3VibHlMaW5rZWRMaXN0PFF1aWNrTWVudVNlY3Rpb24+KCk7XG4gICAgICAgIHRoaXMucXVpY2tNZW51RW1wdHkgPSBuZXcgUXVpY2tNZW51RW1wdHkoKTtcbiAgICAgICAgdGhpcy5ibG9ja09wZXJhdGlvbnNTZXJ2aWNlID0gYmxvY2tPcGVyYXRpb25zU2VydmljZTtcbiAgICAgICAgdGhpcy5mb2N1c1N0YWNrID0gZm9jdXNTdGFjaztcblxuICAgICAgICAvL1RPRE86IEdvIGJhY2sgaGVyZVxuICAgICAgICAvLyBsZXQgYmxvY2tPcHRpb25zID0gdGhpcy5odG1sRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcuYmxvY2stb3B0aW9ucycpIGFzIEhUTUxFbGVtZW50O1xuXG4gICAgICAgIC8vIHRoaXMucXVpY2tNZW51RW1wdHkuYXBwZW5kVG8oYmxvY2tPcHRpb25zKTtcbiAgICAgICAgdGhpcy5hdHRhY2hFdmVudHMoKTtcblxuICAgICAgICB0aGlzLmZpbHRlcklucHV0ID0gXCJcIjtcbiAgICB9XG5cbiAgICBpbml0KCk6IEhUTUxFbGVtZW50IHtcblxuICAgICAgICBjb25zdCBodG1sRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBodG1sRWxlbWVudC5pZCA9IFF1aWNrTWVudS5pZDtcblxuICAgICAgICBodG1sRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdibG9jay1vcHRpb25zLXdyYXBwZXInLCAnc29mdC1ib3gtc2hhZG93Jyk7XG4gICAgICAgIGh0bWxFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cbiAgICAgICAgY29uc3QgYmxvY2tPcHRpb25zID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIGJsb2NrT3B0aW9ucy5jbGFzc0xpc3QuYWRkKCdibG9jay1vcHRpb25zJyk7XG4gICAgICAgIGJsb2NrT3B0aW9ucy5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7XG5cbiAgICAgICAgaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQoYmxvY2tPcHRpb25zKTtcblxuICAgICAgICByZXR1cm4gaHRtbEVsZW1lbnQ7XG4gICAgfVxuXG4gICAgYXBwZW5kKG1lbnVJdGVtOiBRdWlja01lbnVTZWN0aW9uKTogdm9pZCB7XG4gICAgICAgIHRoaXMubWVudVNlY3Rpb25zLmFwcGVuZChtZW51SXRlbSk7XG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQucXVlcnlTZWxlY3RvcignLmJsb2NrLW9wdGlvbnMnKSEuYXBwZW5kQ2hpbGQobWVudUl0ZW0uaHRtbEVsZW1lbnQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0SW5zdGFuY2UoKTogUXVpY2tNZW51IHtcblxuICAgICAgICBjb25zdCBibG9ja09wZXJhdGlvblNlcnZpY2UgPSBEZXBlbmRlbmN5Q29udGFpbmVyLkluc3RhbmNlLnJlc29sdmU8SUJsb2NrT3BlcmF0aW9uc1NlcnZpY2U+KFwiSUJsb2NrT3BlcmF0aW9uc1NlcnZpY2VcIik7XG4gICAgICAgIGNvbnN0IGZvY3VzU3RhY2sgPSBEZXBlbmRlbmN5Q29udGFpbmVyLkluc3RhbmNlLnJlc29sdmU8SUZvY3VzU3RhY2s+KFwiSUZvY3VzU3RhY2tcIik7XG5cbiAgICAgICAgaWYgKCFRdWlja01lbnUuaW5zdGFuY2UpIHtcbiAgICAgICAgICAgIFF1aWNrTWVudS5pbnN0YW5jZSA9IG5ldyBRdWlja01lbnUoYmxvY2tPcGVyYXRpb25TZXJ2aWNlLCBmb2N1c1N0YWNrKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBRdWlja01lbnUuaW5zdGFuY2U7XG4gICAgfVxuXG4gICAgc3dpdGNoVmlzdWFsRm9jdXMoaXRlbTogSk5vZGU8UXVpY2tNZW51SXRlbT4pOiB2b2lkIHtcblxuICAgICAgICBpZiAodGhpcy5jdXJyZW50Rm9jdXNlZE1lbnVJdGVtID09IGl0ZW0pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRGb2N1c2VkTWVudUl0ZW0pIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudEZvY3VzZWRNZW51SXRlbS52YWx1ZS5yZW1vdmVGb2N1cygpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jdXJyZW50Rm9jdXNlZE1lbnVJdGVtID0gaXRlbTtcbiAgICAgICAgdGhpcy5jdXJyZW50Rm9jdXNlZE1lbnVJdGVtLnZhbHVlLmZvY3VzKCk7XG5cbiAgICAgICAgLy8gdGhpcy5odG1sRm9jdXNlZEVsZW1lbnRCZWZvcmVPcGVuUXVpY2tNZW51Py5mb2N1cygpO1xuICAgICAgICB0aGlzLmZvY3VzU3RhY2sucGVlaygpPy5mb2N1cygpO1xuICAgIH1cblxuICAgIGZvY3VzT25UaGVGaXJzdFZpc2libGVJdGVtKCk6IHZvaWQge1xuXG4gICAgICAgIGNvbnN0IGZpcnN0U2VjdGlvbk5vZGU6IEpOb2RlPFF1aWNrTWVudVNlY3Rpb24+IHwgbnVsbCA9IHRoaXMubWVudVNlY3Rpb25zLmdldEZpcnN0KCk7XG5cbiAgICAgICAgbGV0IGN1cnJlbnRTZWN0aW9uTm9kZTogSk5vZGU8UXVpY2tNZW51U2VjdGlvbj4gfCBudWxsID0gZmlyc3RTZWN0aW9uTm9kZTtcblxuICAgICAgICB3aGlsZSAoY3VycmVudFNlY3Rpb25Ob2RlKSB7XG5cbiAgICAgICAgICAgIGNvbnN0IGl0ZW1Ob2RlOiBKTm9kZTxRdWlja01lbnVJdGVtPiB8IG51bGwgPSBjdXJyZW50U2VjdGlvbk5vZGUudmFsdWUubWVudUl0ZW1zLmZpbmRGaXJzdChpdGVtID0+IGl0ZW0uaXNWaXNpYmxlKTtcblxuICAgICAgICAgICAgaWYgKGl0ZW1Ob2RlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zd2l0Y2hWaXN1YWxGb2N1cyhpdGVtTm9kZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjdXJyZW50U2VjdGlvbk5vZGUgPSBjdXJyZW50U2VjdGlvbk5vZGUubmV4dE5vZGU7XG5cbiAgICAgICAgICAgIGlmIChjdXJyZW50U2VjdGlvbk5vZGUgPT0gZmlyc3RTZWN0aW9uTm9kZSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZvY3VzUHJldmlvdXNWaXNpYmxlSXRlbSgpOiB2b2lkIHtcblxuICAgICAgICBsZXQgcHJldmlvdXNWaXNpYmxlSXRlbTogSk5vZGU8UXVpY2tNZW51SXRlbT4gfCBudWxsO1xuXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRGb2N1c2VkTWVudUl0ZW0pIHtcbiAgICAgICAgICAgIHByZXZpb3VzVmlzaWJsZUl0ZW0gPSB0aGlzLmN1cnJlbnRGb2N1c2VkTWVudUl0ZW0uZ2V0UHJldmlvdXNTYXRpc2Z5aW5nKGl0ZW0gPT4gaXRlbS5pc1Zpc2libGUpO1xuICAgICAgICAgICAgaWYgKCFwcmV2aW91c1Zpc2libGVJdGVtKSB7XG5cbiAgICAgICAgICAgICAgICBsZXQgcHJldmlvdXNWaXNpYmxlU2VjdGlvbk5vZGU6IEpOb2RlPFF1aWNrTWVudVNlY3Rpb24+IHwgbnVsbCA9IHRoaXMubWVudVNlY3Rpb25zLmZpbmQodGhpcy5jdXJyZW50Rm9jdXNlZE1lbnVJdGVtLnZhbHVlLmltbWVkaWF0ZVBhcmVudCkhLmdldFByZXZpb3VzU2F0aXNmeWluZyhzZWN0aW9uID0+IHNlY3Rpb24uaXNWaXNpYmxlKTtcblxuICAgICAgICAgICAgICAgIGlmICghcHJldmlvdXNWaXNpYmxlU2VjdGlvbk5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwcmV2aW91c1Zpc2libGVJdGVtID0gcHJldmlvdXNWaXNpYmxlU2VjdGlvbk5vZGUudmFsdWUubWVudUl0ZW1zLmZpbmRMYXN0KGl0ZW0gPT4gaXRlbS5pc1Zpc2libGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IGxhc3RWaXNpYmxlU2VjdGlvbk5vZGU6IEpOb2RlPFF1aWNrTWVudVNlY3Rpb24+IHwgbnVsbCA9IHRoaXMubWVudVNlY3Rpb25zLmZpbmRMYXN0KHNlY3Rpb24gPT4gc2VjdGlvbi5pc1Zpc2libGUpO1xuXG4gICAgICAgICAgICBpZiAoIWxhc3RWaXNpYmxlU2VjdGlvbk5vZGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwcmV2aW91c1Zpc2libGVJdGVtID0gbGFzdFZpc2libGVTZWN0aW9uTm9kZS52YWx1ZS5tZW51SXRlbXMuZmluZExhc3QoaXRlbSA9PiBpdGVtLmlzVmlzaWJsZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zd2l0Y2hWaXN1YWxGb2N1cyhwcmV2aW91c1Zpc2libGVJdGVtISk7XG4gICAgfVxuXG4gICAgZm9jdXNOZXh0VmlzaWJsZUl0ZW0oKTogdm9pZCB7XG5cbiAgICAgICAgbGV0IG5leHRWaXNpYmxlSXRlbTogSk5vZGU8UXVpY2tNZW51SXRlbT4gfCBudWxsO1xuXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRGb2N1c2VkTWVudUl0ZW0pIHtcbiAgICAgICAgICAgIG5leHRWaXNpYmxlSXRlbSA9IHRoaXMuY3VycmVudEZvY3VzZWRNZW51SXRlbS5nZXROZXh0U2F0aXNmeWluZyhpdGVtID0+IGl0ZW0uaXNWaXNpYmxlKTtcbiAgICAgICAgICAgIGlmICghbmV4dFZpc2libGVJdGVtKSB7XG5cbiAgICAgICAgICAgICAgICBsZXQgbmV4dFZpc2libGVTZWN0aW9uTm9kZTogSk5vZGU8UXVpY2tNZW51U2VjdGlvbj4gfCBudWxsID0gdGhpcy5tZW51U2VjdGlvbnMuZmluZCh0aGlzLmN1cnJlbnRGb2N1c2VkTWVudUl0ZW0udmFsdWUuaW1tZWRpYXRlUGFyZW50KSEuZ2V0TmV4dFNhdGlzZnlpbmcoc2VjdGlvbiA9PiBzZWN0aW9uLmlzVmlzaWJsZSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoIW5leHRWaXNpYmxlU2VjdGlvbk5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBuZXh0VmlzaWJsZUl0ZW0gPSBuZXh0VmlzaWJsZVNlY3Rpb25Ob2RlLnZhbHVlLm1lbnVJdGVtcy5maW5kRmlyc3QoaXRlbSA9PiBpdGVtLmlzVmlzaWJsZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBmaXJzdFZpc2libGVTZWN0aW9uTm9kZTogbnVsbCB8IEpOb2RlPFF1aWNrTWVudVNlY3Rpb24+ID0gdGhpcy5tZW51U2VjdGlvbnMuZmluZEZpcnN0KHNlY3Rpb24gPT4gc2VjdGlvbi5pc1Zpc2libGUpO1xuICAgICAgICAgICAgaWYgKCFmaXJzdFZpc2libGVTZWN0aW9uTm9kZSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5leHRWaXNpYmxlSXRlbSA9IGZpcnN0VmlzaWJsZVNlY3Rpb25Ob2RlLnZhbHVlLm1lbnVJdGVtcy5maW5kRmlyc3QoaXRlbSA9PiBpdGVtLmlzVmlzaWJsZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnN3aXRjaFZpc3VhbEZvY3VzKG5leHRWaXNpYmxlSXRlbSEpO1xuICAgIH1cblxuICAgIGZpbHRlckl0ZW1zKCk6IHZvaWQge1xuXG4gICAgICAgIHRoaXMubWVudVNlY3Rpb25zLmZvckVhY2goc2VjdGlvbiA9PiB7XG4gICAgICAgICAgICBzZWN0aW9uLmZpbHRlclNlY3Rpb24odGhpcy5maWx0ZXJJbnB1dCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICghdGhpcy5tZW51U2VjdGlvbnMuYW55KHNlY3Rpb24gPT4gc2VjdGlvbi5pc1Zpc2libGUpKSB7XG4gICAgICAgICAgICB0aGlzLnF1aWNrTWVudUVtcHR5LnNob3coKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucXVpY2tNZW51RW1wdHkuaGlkZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5mb2N1c09uVGhlRmlyc3RWaXNpYmxlSXRlbSgpO1xuICAgIH1cblxuICAgIHNob3coKSB7XG5cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG5cbiAgICAgICAgICAgIGNvbnN0IGFjdGl2ZUVsZW1lbnQgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuXG4gICAgICAgICAgICBpZiAoIWFjdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRmFpbGVkIHRvIGRpc3BsYXkgdGhlIHF1aWNrTWVudTogbm8gYWN0aXZlIGVsZW1lbnQgZm91bmQuIFBsZWFzZSBlbnN1cmUgYW4gZWxlbWVudCBpcyBmb2N1c2VkIGJlZm9yZSBhdHRlbXB0aW5nIHRvIGRpc3BsYXkgdGhlIHF1aWNrTWVudS5cIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmZvY3VzU3RhY2sucHVzaChhY3RpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50KVxuXG4gICAgICAgICAgICAvLyB0aGlzLmh0bWxGb2N1c2VkRWxlbWVudEJlZm9yZU9wZW5RdWlja01lbnUgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xuXG4gICAgICAgICAgICAvLyBpZiAoIXRoaXMuaHRtbEZvY3VzZWRFbGVtZW50QmVmb3JlT3BlblF1aWNrTWVudSkge1xuICAgICAgICAgICAgLy8gICAgIHRocm93IG5ldyBFcnJvcihcIkZhaWxlZCB0byBjYXB0dXJlIHRoZSBmb2N1c2VkIGVsZW1lbnQgYmVmb3JlIGRpc3BsYXlpbmcgdGhlIFF1aWNrTWVudS4gRW5zdXJlIGFuIGVsZW1lbnQgaXMgZm9jdXNlZC5cIik7XG4gICAgICAgICAgICAvLyB9XG5cblxuICAgICAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuXG4gICAgICAgICAgICBpZiAoIXNlbGVjdGlvbiB8fCBzZWxlY3Rpb24ucmFuZ2VDb3VudCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTmVuaHVtYSBzZWxlw6fDo28gZW5jb250cmFkYScpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xuICAgICAgICAgICAgY29uc3QgcmVjdCA9IHJhbmdlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICAgICAgICB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG5cbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRXaWR0aCA9IHRoaXMuaHRtbEVsZW1lbnQub2Zmc2V0V2lkdGg7XG4gICAgICAgICAgICBsZXQgbGVmdFBvc2l0aW9uID0gcmVjdC5sZWZ0ICsgd2luZG93LnNjcm9sbFg7XG5cbiAgICAgICAgICAgIGlmIChsZWZ0UG9zaXRpb24gKyBlbGVtZW50V2lkdGggPiB3aW5kb3cuaW5uZXJXaWR0aCkge1xuICAgICAgICAgICAgICAgIGxlZnRQb3NpdGlvbiA9IHdpbmRvdy5pbm5lcldpZHRoIC0gZWxlbWVudFdpZHRoIC0gMjA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRIZWlnaHQgPSB0aGlzLmh0bWxFbGVtZW50Lm9mZnNldEhlaWdodDtcbiAgICAgICAgICAgIGxldCB0b3BQb3NpdGlvbiA9IHJlY3QudG9wICsgd2luZG93LnNjcm9sbFkgLSBlbGVtZW50SGVpZ2h0IC0gMTA7XG5cbiAgICAgICAgICAgIGlmICh0b3BQb3NpdGlvbiA8IDApIHtcbiAgICAgICAgICAgICAgICB0b3BQb3NpdGlvbiA9IHJlY3QuYm90dG9tICsgd2luZG93LnNjcm9sbFkgKyAxMDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5odG1sRWxlbWVudC5zdHlsZS5sZWZ0ID0gYCR7bGVmdFBvc2l0aW9ufXB4YDtcbiAgICAgICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUudG9wID0gYCR7dG9wUG9zaXRpb259cHhgO1xuXG4gICAgICAgICAgICBzdXBlci5zaG93KCk7XG5cbiAgICAgICAgICAgIHRoaXMuZm9jdXNPblRoZUZpcnN0VmlzaWJsZUl0ZW0oKTtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNTdGFjay5wZWVrKCk/LmZvY3VzKCk7XG5cbiAgICAgICAgfSwgMTApO1xuXG4gICAgfVxuXG4gICAgcmVzdG9yZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5maWx0ZXJJbnB1dCA9IFwiXCI7XG5cbiAgICAgICAgdGhpcy5tZW51U2VjdGlvbnMuZm9yRWFjaChzZWN0aW9uID0+IHtcbiAgICAgICAgICAgIHNlY3Rpb24ucmVzdG9yZSgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBoaWRlKCkge1xuXG4gICAgICAgIHRoaXMucmVzdG9yZSgpO1xuICAgICAgICB0aGlzLmZvY3VzU3RhY2sucGVlaygpPy5mb2N1cygpO1xuICAgICAgICAvLyB0aGlzLmh0bWxGb2N1c2VkRWxlbWVudEJlZm9yZU9wZW5RdWlja01lbnU/LmZvY3VzKCk7XG5cbiAgICAgICAgc3VwZXIuaGlkZSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXR0YWNoRXZlbnRzKCkge1xuXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoQ3VzdG9tRXZlbnRzLmVtaXR0ZWRDb21tYW5kLCAoKGV2ZW50OiBDdXN0b21FdmVudDxJQ29tbWFuZEV2ZW50RGV0YWlsPikgPT4ge1xuICAgICAgICAgICAgY29uc3QgeyBjb21tYW5kIH0gPSBldmVudC5kZXRhaWw7XG5cbiAgICAgICAgICAgIGlmIChjb21tYW5kID09IENvbW1hbmRzLnRyYW5zZm9ybUJsb2NrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSkgYXMgRXZlbnRMaXN0ZW5lcik7XG5cbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChldmVudDogS2V5Ym9hcmRFdmVudCkgPT4ge1xuXG4gICAgICAgICAgICBjb25zdCBibG9jayA9IERPTVV0aWxzLmZpbmRDbG9zZXN0QW5jZXN0b3JPZkFjdGl2ZUVsZW1lbnRCeUNsYXNzKFwiYmxvY2tcIik7XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5pc1Zpc2libGUgJiYgZXZlbnQua2V5ID09PSAnLycgJiYgIWV2ZW50LmN0cmxLZXkgJiYgIWV2ZW50LnNoaWZ0S2V5ICYmICFldmVudC5hbHRLZXkgJiYgYmxvY2spIHtcblxuICAgICAgICAgICAgICAgIC8vUHJldmVudCBzaG93IHF1aWNrTWVudSBpbnNpZGUgYSB0YWJsZSBjZWxsXG4gICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRDZWxsID0gdGFyZ2V0LmNsb3Nlc3QoRE9NRWxlbWVudHMuVEQpIGFzIEhUTUxUYWJsZUNlbGxFbGVtZW50O1xuXG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRDZWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLnNob3coKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc1Zpc2libGUgJiYgZXZlbnQua2V5ID09PSAnQXJyb3dMZWZ0JyAmJiAhZXZlbnQuY3RybEtleSAmJiAhZXZlbnQuc2hpZnRLZXkgJiYgIWV2ZW50LmFsdEtleSkge1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNWaXNpYmxlICYmIGV2ZW50LmtleSA9PT0gJ0Fycm93UmlnaHQnICYmICFldmVudC5jdHJsS2V5ICYmICFldmVudC5zaGlmdEtleSAmJiAhZXZlbnQuYWx0S2V5KSB7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuaXNWaXNpYmxlICYmIGV2ZW50LmtleSA9PT0gJ0Fycm93RG93bicgJiYgIWV2ZW50LmN0cmxLZXkgJiYgIWV2ZW50LnNoaWZ0S2V5ICYmICFldmVudC5hbHRLZXkpIHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuZm9jdXNOZXh0VmlzaWJsZUl0ZW0oKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc1Zpc2libGUgJiYgZXZlbnQua2V5ID09PSAnQXJyb3dVcCcgJiYgIWV2ZW50LmN0cmxLZXkgJiYgIWV2ZW50LnNoaWZ0S2V5ICYmICFldmVudC5hbHRLZXkpIHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuZm9jdXNQcmV2aW91c1Zpc2libGVJdGVtKCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNWaXNpYmxlICYmIC9eW2EtejAtOSBdJC9pLnRlc3QoZXZlbnQua2V5KSAmJiAhZXZlbnQuY3RybEtleSAmJiAhZXZlbnQuc2hpZnRLZXkgJiYgIWV2ZW50LmFsdEtleSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29uY2F0RmlsdGVySW5wdXQoZXZlbnQua2V5KTtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlckl0ZW1zKCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNWaXNpYmxlICYmIGV2ZW50LmtleSA9PT0gJ0JhY2tzcGFjZScpIHtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmZpbHRlcklucHV0ID09IFwiXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVMYXN0RmlsdGVySW5wdXRDaGFyYWN0ZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJJdGVtcygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc1Zpc2libGUgJiYgZXZlbnQua2V5ID09PSAnRXNjYXBlJyAmJiAhZXZlbnQuY3RybEtleSAmJiAhZXZlbnQuc2hpZnRLZXkgJiYgIWV2ZW50LmFsdEtleSkge1xuICAgICAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNWaXNpYmxlICYmICEoZXZlbnQudGFyZ2V0ISBhcyBIVE1MRWxlbWVudCkuY2xvc2VzdChgIyR7dGhpcy5odG1sRWxlbWVudC5pZH1gKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGV2ZW50KSA9PiB7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmlzVmlzaWJsZSAmJiBldmVudC5rZXkgPT09ICdFbnRlcicgJiYgIWV2ZW50LmN0cmxLZXkgJiYgIWV2ZW50LnNoaWZ0S2V5ICYmICFldmVudC5hbHRLZXkpIHtcblxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBibG9ja1R5cGUgPSB0aGlzLmN1cnJlbnRGb2N1c2VkTWVudUl0ZW0/LnZhbHVlLmJsb2NrVHlwZTtcblxuICAgICAgICAgICAgICAgIGlmIChibG9ja1R5cGUpIHtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRyYW5zZm9ybUh0bWxGb2N1c2VkRWxlbWVudEJlZm9yZU9wZW5RdWlja01lbnUoYmxvY2tUeXBlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoQ3VzdG9tRXZlbnRzLmJsb2NrVHlwZUNoYW5nZWQsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuXG4gICAgZW1pdENvbW1hbmRFdmVudChibG9ja1R5cGU6IHN0cmluZyk6IHZvaWQge1xuXG4gICAgICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50PElDb21tYW5kRXZlbnREZXRhaWw+KEN1c3RvbUV2ZW50cy5lbWl0dGVkQ29tbWFuZCwge1xuICAgICAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgICAgICAgY29tbWFuZDogQ29tbWFuZHMudHJhbnNmb3JtQmxvY2ssXG4gICAgICAgICAgICAgICAgdmFsdWU6IGJsb2NrVHlwZVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KGN1c3RvbUV2ZW50KTtcbiAgICB9XG5cbiAgICB0cmFuc2Zvcm1IdG1sRm9jdXNlZEVsZW1lbnRCZWZvcmVPcGVuUXVpY2tNZW51KGJsb2NrVHlwZTogc3RyaW5nKTogdm9pZCB7XG5cbiAgICAgICAgaWYgKGJsb2NrVHlwZSkge1xuXG4gICAgICAgICAgICB0aGlzLmVtaXRDb21tYW5kRXZlbnQoYmxvY2tUeXBlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRoaXMuaGlkZSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgY29uY2F0RmlsdGVySW5wdXQoc3RnOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5maWx0ZXJJbnB1dCArPSBzdGcudG9Mb3dlckNhc2UoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlbW92ZUxhc3RGaWx0ZXJJbnB1dENoYXJhY3RlcigpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVySW5wdXQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJJbnB1dCA9IHRoaXMuZmlsdGVySW5wdXQuc2xpY2UoMCwgLTEpO1xuICAgICAgICB9XG4gICAgfVxufSIsImltcG9ydCB7IEJhc2VEb3VibHlMaW5rZWRMaXN0IH0gZnJvbSAnLi9CYXNlRG91Ymx5TGlua2VkTGlzdCc7XHJcbmltcG9ydCB7IEpOb2RlIH0gZnJvbSAnLi9KTm9kZSc7XHJcblxyXG5leHBvcnQgY2xhc3MgRG91Ymx5TGlua2VkTGlzdDxUPiBleHRlbmRzIEJhc2VEb3VibHlMaW5rZWRMaXN0PFQ+IHtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgfVxyXG5cclxuICAgIGFwcGVuZChlbGVtZW50OiBUKTogdm9pZCB7XHJcblxyXG4gICAgICAgIGNvbnN0IG5vZGUgPSBuZXcgSk5vZGUoZWxlbWVudCwgdGhpcyk7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5oZWFkIHx8ICF0aGlzLnRhaWwpIHtcclxuICAgICAgICAgICAgdGhpcy5oZWFkID0gbm9kZTtcclxuICAgICAgICAgICAgdGhpcy50YWlsID0gbm9kZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnRhaWwuc2V0TmV4dChub2RlKTtcclxuICAgICAgICAgICAgbm9kZS5zZXRQcmV2aW91cyh0aGlzLnRhaWwpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy50YWlsID0gbm9kZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMubGVuZ3RoKys7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBRdWlja01lbnUgfSBmcm9tICcuL1F1aWNrTWVudSc7XHJcbmltcG9ydCB7IFF1aWNrTWVudUl0ZW0gfSBmcm9tIFwiLi9RdWlja01lbnVJdGVtXCI7XHJcbmltcG9ydCB7IERvdWJseUxpbmtlZExpc3QgfSBmcm9tICcuLi8uLi9jb21tb24vRG91Ymx5TGlua2VkTGlzdCc7XHJcbmltcG9ydCB7IEJhc2VVSUNvbXBvbmVudCB9IGZyb20gJy4uL2NvbW1vbi9CYXNlVUlDb21wb25lbnQnO1xyXG5cclxuZXhwb3J0IGNsYXNzIFF1aWNrTWVudVNlY3Rpb24gZXh0ZW5kcyBCYXNlVUlDb21wb25lbnQge1xyXG5cclxuICAgIGltbWVkaWF0ZVBhcmVudDogUXVpY2tNZW51O1xyXG5cclxuICAgIG1lbnVJdGVtcyA9IG5ldyBEb3VibHlMaW5rZWRMaXN0PFF1aWNrTWVudUl0ZW0+KCk7XHJcblxyXG4gICAgY29uc3RydWN0b3Iob3B0aW9uczogUXVpY2tNZW51U2VjdGlvbk9wdGlvbnMpIHtcclxuXHJcbiAgICAgICAgc3VwZXIoe1xyXG4gICAgICAgICAgICB0aXRsZTogb3B0aW9ucy50aXRsZSxcclxuICAgICAgICAgICAgY2xhc3NMaXN0OiBvcHRpb25zLmNsYXNzTGlzdFxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmltbWVkaWF0ZVBhcmVudCA9IG9wdGlvbnMucXVpY2tNZW51SW5zdGFuY2U7XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdCgpOiBIVE1MRWxlbWVudCB7XHJcblxyXG4gICAgICAgIGNvbnN0IGh0bWxFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2VjdGlvbicpO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LmNsYXNzTGlzdC5hZGQodGhpcy5wcm9wcy5jbGFzc0xpc3QpO1xyXG5cclxuICAgICAgICBjb25zdCBoZWFkaW5nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaDInKTtcclxuICAgICAgICBoZWFkaW5nLnRleHRDb250ZW50ID0gdGhpcy5wcm9wcy50aXRsZTtcclxuXHJcbiAgICAgICAgaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQoaGVhZGluZyk7XHJcblxyXG4gICAgICAgIHJldHVybiBodG1sRWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICBhcHBlbmRRdWlja01lbnVJdGVtcyhtZW51SXRlbXM6IFF1aWNrTWVudUl0ZW1bXSk6IHZvaWQge1xyXG5cclxuICAgICAgICBtZW51SXRlbXMuZm9yRWFjaChpdGVtID0+IHtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kUXVpY2tNZW51SXRlbShpdGVtKVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGFwcGVuZFF1aWNrTWVudUl0ZW0obWVudUl0ZW06IFF1aWNrTWVudUl0ZW0pOiB2b2lkIHtcclxuXHJcbiAgICAgICAgdGhpcy5tZW51SXRlbXMuYXBwZW5kKG1lbnVJdGVtKTtcclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LmFwcGVuZENoaWxkKG1lbnVJdGVtLmh0bWxFbGVtZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBmaWx0ZXJTZWN0aW9uKHRleHQ6IHN0cmluZyk6IHZvaWQge1xyXG5cclxuICAgICAgICB0aGlzLnJlc3RvcmUoKTtcclxuXHJcbiAgICAgICAgaWYgKHRleHQgIT09IFwiXCIpIHtcclxuICAgICAgICAgICAgdGhpcy5tZW51SXRlbXMuZm9yRWFjaChtZW51SXRlbSA9PiB7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKCEobWVudUl0ZW0uZmlsdGVyVmFsdWUudG9Mb2NhbGVMb3dlckNhc2UoKS5pbmNsdWRlcyh0ZXh0KSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBtZW51SXRlbS5oaWRlKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgbGV0IGF0TGVhZE9uZUl0ZW0gPSB0aGlzLm1lbnVJdGVtcy5hbnkoaXRlbSA9PiBpdGVtLmZpbHRlclZhbHVlLnRvTG9jYWxlTG93ZXJDYXNlKCkuaW5jbHVkZXModGV4dCkpO1xyXG5cclxuICAgICAgICAgICAgaWYgKCFhdExlYWRPbmVJdGVtKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhpZGUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXN0b3JlKCkge1xyXG4gICAgICAgIHRoaXMuc2hvdygpO1xyXG5cclxuICAgICAgICB0aGlzLm1lbnVJdGVtcy5mb3JFYWNoKG1lbnVJdGVtID0+IHtcclxuICAgICAgICAgICAgbWVudUl0ZW0uc2hvdygpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFF1aWNrTWVudVNlY3Rpb25PcHRpb25zIHtcclxuICAgIHF1aWNrTWVudUluc3RhbmNlOiBRdWlja01lbnU7XHJcbiAgICB0aXRsZTogc3RyaW5nO1xyXG4gICAgY2xhc3NMaXN0OiBzdHJpbmc7XHJcbn0iLCJpbXBvcnQgeyBTVkdJY29uIH0gZnJvbSAnLi4vY29tbW9uL1NWR0ljb24nO1xyXG5pbXBvcnQgeyBCYXNlVUlDb21wb25lbnQgfSBmcm9tICcuLi9jb21tb24vQmFzZVVJQ29tcG9uZW50JztcclxuaW1wb3J0IHsgSk5vZGUgfSBmcm9tIFwiLi4vLi4vY29tbW9uL0pOb2RlXCI7XHJcbmltcG9ydCB7IFF1aWNrTWVudVNlY3Rpb24gfSBmcm9tICcuL1F1aWNrTWVudVNlY3Rpb24nO1xyXG5pbXBvcnQgeyBJQ29tbWFuZEV2ZW50RGV0YWlsIH0gZnJvbSAnQC9jb21tYW5kcy9JQ29tbWFuZEV2ZW50RGV0YWlsJztcclxuaW1wb3J0IHsgQ3VzdG9tRXZlbnRzIH0gZnJvbSAnQC9jb21tb24vQ3VzdG9tRXZlbnRzJztcclxuaW1wb3J0IHsgQ29tbWFuZHMgfSBmcm9tICdAL2NvbW1hbmRzL0NvbW1hbmRzJztcclxuXHJcbmV4cG9ydCBjbGFzcyBRdWlja01lbnVJdGVtIGV4dGVuZHMgQmFzZVVJQ29tcG9uZW50IHtcclxuXHJcbiAgICBwcml2YXRlIF9ibG9ja1R5cGU6IHN0cmluZztcclxuICAgIHByaXZhdGUgX2ZpbHRlclZhbHVlOiBzdHJpbmc7XHJcbiAgICBwcml2YXRlIF9pbW1lZGlhdGVQYXJlbnQ6IFF1aWNrTWVudVNlY3Rpb247XHJcblxyXG4gICAgY29uc3RydWN0b3IoaW1tZWRpYXRlUGFyZW50OiBRdWlja01lbnVTZWN0aW9uLCB0aXRsZTogc3RyaW5nLCBkZXNjcmlwdGlvbjogc3RyaW5nLCBpY29uSWQ6IHN0cmluZywgYmxvY2tUeXBlOiBzdHJpbmcsIGZpbHRlclZhbHVlOiBzdHJpbmcpIHtcclxuXHJcbiAgICAgICAgc3VwZXIoe1xyXG4gICAgICAgICAgICB0aXRsZTogdGl0bGUsXHJcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBkZXNjcmlwdGlvbixcclxuICAgICAgICAgICAgaWNvbklkOiBpY29uSWRcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5fYmxvY2tUeXBlID0gYmxvY2tUeXBlO1xyXG4gICAgICAgIHRoaXMuX2ZpbHRlclZhbHVlID0gZmlsdGVyVmFsdWU7XHJcbiAgICAgICAgdGhpcy5faW1tZWRpYXRlUGFyZW50ID0gaW1tZWRpYXRlUGFyZW50O1xyXG5cclxuICAgICAgICB0aGlzLmF0dGFjaEV2ZW50cygpO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXQoKTogSFRNTEVsZW1lbnQge1xyXG5cclxuICAgICAgICBjb25zdCBodG1sRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ29wdGlvbicsICdvcHRpb24taG92ZXInLCAnYmxvY2stb3BlcmF0aW9uJyk7XHJcblxyXG4gICAgICAgIGh0bWxFbGVtZW50LnNldEF0dHJpYnV0ZSgnZGF0YS1ibG9jay1vcGVyYXRpb24nLCAnYXBwbHktc2VsZWN0ZWQtYmxvY2stdHlwZScpO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLCAnMCcpO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LnNldEF0dHJpYnV0ZSgncm9sZScsICdvcHRpb24nKTtcclxuXHJcblxyXG4gICAgICAgIGNvbnN0IG9wdGlvbkltYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgb3B0aW9uSW1hZ2UuY2xhc3NMaXN0LmFkZCgnb3B0aW9uLWltYWdlJyk7XHJcblxyXG4gICAgICAgIGNvbnN0IHN2ZyA9IG5ldyBTVkdJY29uKHRoaXMucHJvcHMuaWNvbklkLCAnMTAwJScpO1xyXG5cclxuICAgICAgICBvcHRpb25JbWFnZS5hcHBlbmRDaGlsZChzdmcuaHRtbEVsZW1lbnQpO1xyXG5cclxuICAgICAgICBodG1sRWxlbWVudC5hcHBlbmRDaGlsZChvcHRpb25JbWFnZSk7XHJcblxyXG4gICAgICAgIGNvbnN0IG9wdGlvblRleHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgICBvcHRpb25UZXh0LmNsYXNzTGlzdC5hZGQoJ29wdGlvbi10ZXh0Jyk7XHJcblxyXG4gICAgICAgIGNvbnN0IGJsb2NrVGl0bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdwJyk7XHJcbiAgICAgICAgYmxvY2tUaXRsZS5jbGFzc0xpc3QuYWRkKCdibG9jay10aXRsZScpO1xyXG4gICAgICAgIGJsb2NrVGl0bGUuaW5uZXJUZXh0ID0gdGhpcy5wcm9wcy50aXRsZTtcclxuXHJcbiAgICAgICAgb3B0aW9uVGV4dC5hcHBlbmRDaGlsZChibG9ja1RpdGxlKTtcclxuXHJcbiAgICAgICAgY29uc3QgYmxvY2tEZXNjcmlwdGlvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3AnKTtcclxuICAgICAgICBibG9ja0Rlc2NyaXB0aW9uLmNsYXNzTGlzdC5hZGQoJ2Jsb2NrLWRlc2NyaXB0aW9uJyk7XHJcbiAgICAgICAgYmxvY2tEZXNjcmlwdGlvbi5pbm5lclRleHQgPSB0aGlzLnByb3BzLmRlc2NyaXB0aW9uO1xyXG5cclxuXHJcbiAgICAgICAgb3B0aW9uVGV4dC5hcHBlbmRDaGlsZChibG9ja0Rlc2NyaXB0aW9uKTtcclxuXHJcbiAgICAgICAgaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQob3B0aW9uVGV4dCk7XHJcblxyXG4gICAgICAgIHJldHVybiBodG1sRWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgZGlzcGxheSgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiAnZmxleCc7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGZpbHRlclZhbHVlKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbHRlclZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBpbW1lZGlhdGVQYXJlbnQgKCk6IFF1aWNrTWVudVNlY3Rpb24ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9pbW1lZGlhdGVQYXJlbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGJsb2NrVHlwZSgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9ibG9ja1R5cGU7XHJcbiAgICB9XHJcblxyXG4gICAgZm9jdXMoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdvcHRpb24tZm9jdXNlZCcpO1xyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuZm9jdXMoKTtcclxuICAgIH1cclxuXHJcbiAgICByZW1vdmVGb2N1cygpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ29wdGlvbi1mb2N1c2VkJyk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIGVtaXRDb21tYW5kRXZlbnQoKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQ8SUNvbW1hbmRFdmVudERldGFpbD4oQ3VzdG9tRXZlbnRzLmVtaXR0ZWRDb21tYW5kLCB7XHJcbiAgICAgICAgICAgIGRldGFpbDoge1xyXG4gICAgICAgICAgICAgICAgY29tbWFuZDogQ29tbWFuZHMudHJhbnNmb3JtQmxvY2ssXHJcbiAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5ibG9ja1R5cGVcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KGN1c3RvbUV2ZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBhdHRhY2hFdmVudHMoKTogdm9pZCB7XHJcblxyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgKCkgPT4ge1xyXG5cclxuICAgICAgICAgICAgY29uc3Qgbm9kZTogSk5vZGU8UXVpY2tNZW51SXRlbT4gPSB0aGlzLl9pbW1lZGlhdGVQYXJlbnQubWVudUl0ZW1zLmZpbmQodGhpcykhO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5faW1tZWRpYXRlUGFyZW50LmltbWVkaWF0ZVBhcmVudC5zd2l0Y2hWaXN1YWxGb2N1cyhub2RlISk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZXZlbnQpID0+IHtcclxuXHJcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5lbWl0Q29tbWFuZEV2ZW50KCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBRdWlja01lbnUgfSBmcm9tIFwiLi4vY29tcG9uZW50cy9xdWljay1tZW51L1F1aWNrTWVudVwiO1xyXG5pbXBvcnQgeyBRdWlja01lbnVTZWN0aW9uIH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvcXVpY2stbWVudS9RdWlja01lbnVTZWN0aW9uXCI7XHJcbmltcG9ydCB7IFF1aWNrTWVudUl0ZW0gfSBmcm9tIFwiLi4vY29tcG9uZW50cy9xdWljay1tZW51L1F1aWNrTWVudUl0ZW1cIjtcclxuaW1wb3J0IHsgRWxlbWVudEZhY3RvcnlTZXJ2aWNlIH0gZnJvbSBcIi4uL3NlcnZpY2VzL2VsZW1lbnQtZmFjdG9yeS9FbGVtZW50RmFjdG9yeVNlcnZpY2VcIjtcclxuaW1wb3J0IHsgSWNvbnMgfSBmcm9tIFwiQC9jb21tb24vSWNvbnNcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBRdWlja01lbnVCdWlsZGVyIHtcclxuXHJcbiAgICBzdGF0aWMgYnVpbGQoKTogUXVpY2tNZW51IHtcclxuXHJcbiAgICAgICAgY29uc3QgcXVpY2tNZW51OiBRdWlja01lbnUgPSBRdWlja01lbnUuZ2V0SW5zdGFuY2UoKTtcclxuXHJcbiAgICAgICAgY29uc3QgYmFzaWNCbG9ja3NTZWN0aW9uOiBRdWlja01lbnVTZWN0aW9uID0gbmV3IFF1aWNrTWVudVNlY3Rpb24oeyBxdWlja01lbnVJbnN0YW5jZTogcXVpY2tNZW51LCB0aXRsZTogJ0Jhc2ljIGJsb2NrcycsIGNsYXNzTGlzdDogJ2Jhc2ljLXNlY3Rpb24nIH0pO1xyXG5cclxuICAgICAgICBiYXNpY0Jsb2Nrc1NlY3Rpb24uYXBwZW5kUXVpY2tNZW51SXRlbXMoW1xyXG4gICAgICAgICAgICBuZXcgUXVpY2tNZW51SXRlbShiYXNpY0Jsb2Nrc1NlY3Rpb24sICdUZXh0JywgJ1N0YXJ0IHdyaXRpbmcgaW4gcGxhaW4gdGV4dC4nLCAnaWNvbi1tYXRlcmlhbC1mb3JtYXQnLCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5QQVJBR1JBUEgsIFwicGFyYWdyYXBoIHRleHQgcFwiKSxcclxuICAgICAgICAgICAgbmV3IFF1aWNrTWVudUl0ZW0oYmFzaWNCbG9ja3NTZWN0aW9uLCAnQnVsbGV0ZWQgbGlzdCcsICdPcmdhbml6ZSBpdGVtcyB3aXRoIGJ1bGxldCBwb2ludHMuJywgJ2ljb24td29yZHByZXNzLWJ1bGxldGVkLWxpc3QnLCAnYnVsbGV0ZWQtbGlzdCcsIFwiYnVsbGV0ZWQgbGlzdCB1bm9yZGVyZWQgbGlzdCB1bFwiKSxcclxuICAgICAgICAgICAgbmV3IFF1aWNrTWVudUl0ZW0oYmFzaWNCbG9ja3NTZWN0aW9uLCAnTnVtYmVyZWQgbGlzdCcsICdMaXN0IGl0ZW1zIGluIGEgbnVtYmVyZWQgZm9ybWF0LicsICdpY29uLXdvcmRwcmVzcy1udW1iZXJlZC1saXN0JywgJ251bWJlcmVkLWxpc3QnLCBcIm51bWJlcmVkIGxpc3QgbnVtYmVyIGxpc3Qgc2VxdWVudGlhbCBsaXN0IG9sIGVudW1lcmF0ZWQgbGlzdCBvcmRlcmVkIGxpc3RcIiksXHJcbiAgICAgICAgICAgIG5ldyBRdWlja01lbnVJdGVtKGJhc2ljQmxvY2tzU2VjdGlvbiwgJ1RhYmxlJywgJ09yZ2FuaXplIGRhdGEgaW4gcm93cyBhbmQgY29sdW1ucy4nLCAnaWNvbi1tYXRlcmlhbC10YWJsZScsIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLlRBQkxFLCBcInRhYmxlIHRyIHRoXCIpLFxyXG4gICAgICAgICAgICBuZXcgUXVpY2tNZW51SXRlbShiYXNpY0Jsb2Nrc1NlY3Rpb24sICdDYWxsb3V0JywgJ0VtcGhhc2l6ZSBrZXkgcG9pbnRzIHdpdGggYSBjYWxsb3V0IGJveC4nLCBJY29ucy5DYWxsb3V0LCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5DQUxMT1VULCBcImNhbGxvdXQgbm90ZSBzcG90bGlnaHRcIiksXHJcbiAgICAgICAgICAgIG5ldyBRdWlja01lbnVJdGVtKGJhc2ljQmxvY2tzU2VjdGlvbiwgJ0NvZGUnLCAnSW5jbHVkZSBjb2RlIHNuaXBwZXQuJywgJ2ljb24td29yZHByZXNzLWNvZGUtbWFyaycsICdjb2RlJywgXCJjb2RlIHNjcmlwdCBzb3VyY2UgbWFya3VwXCIpLFxyXG4gICAgICAgICAgICBuZXcgUXVpY2tNZW51SXRlbShiYXNpY0Jsb2Nrc1NlY3Rpb24sICdRdW90ZScsICdIaWdobGlnaHQgdGV4dCBhcyBhIHF1b3RlLicsICdpY29uLXdvcmRwcmVzcy1xdW90ZScsICdxdW90ZScsIFwicXVvdGUgYmxvY2txdW90ZSBjaXRhdGlvbiBxdW90YXRpb25cIiksXHJcbiAgICAgICAgICAgIG5ldyBRdWlja01lbnVJdGVtKGJhc2ljQmxvY2tzU2VjdGlvbiwgJ0hlYWRpbmcgMicsICdNZWRpdW0gaGVhZGVyIGZvciBzZWN0aW9ucy4nLCAnaWNvbi1qdWxpYS1oZWFkLTInLCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfMiwgXCJoZWFkZXIgMiBoZWFkaW5nIDIgaDJcIiksXHJcbiAgICAgICAgICAgIG5ldyBRdWlja01lbnVJdGVtKGJhc2ljQmxvY2tzU2VjdGlvbiwgJ0hlYWRpbmcgMycsICdTbWFsbCBoZWFkZXIgZm9yIHN1YnNlY3Rpb25zLicsICdpY29uLWp1bGlhLWhlYWQtMicsIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl8zLCBcImhlYWRlciAzIGhlYWRpbmcgMyBoM1wiKSxcclxuICAgICAgICAgICAgbmV3IFF1aWNrTWVudUl0ZW0oYmFzaWNCbG9ja3NTZWN0aW9uLCAnU2VwYXJhdG9yJywgJ1Zpc3VhbGx5IGRpdmlkZSBibG9ja3MuJywgJ2ljb24td29yZHByZXNzLXNlcGFyYXRvcicsICdzZXBhcmF0b3InLCBcInNlcGFyYXRvciBkaXZpZGVyIHJ1bGUgbGluZVwiKVxyXG4gICAgICAgIF0pO1xyXG5cclxuICAgICAgICBxdWlja01lbnUuYXBwZW5kKGJhc2ljQmxvY2tzU2VjdGlvbik7XHJcblxyXG4gICAgICAgIGNvbnN0IG1lZGlhQmxvY2tzU2VjdGlvbiA9IG5ldyBRdWlja01lbnVTZWN0aW9uKHsgcXVpY2tNZW51SW5zdGFuY2U6IHF1aWNrTWVudSwgdGl0bGU6ICdNZWRpYScsIGNsYXNzTGlzdDogJ21lZGlhLXNlY3Rpb24nIH0pO1xyXG5cclxuICAgICAgICBtZWRpYUJsb2Nrc1NlY3Rpb24uYXBwZW5kUXVpY2tNZW51SXRlbXMoW1xyXG4gICAgICAgICAgICBuZXcgUXVpY2tNZW51SXRlbShtZWRpYUJsb2Nrc1NlY3Rpb24sICdJbWFnZScsICdVcGxvYWQgaW1hZ2UuJywgSWNvbnMuSW1hZ2UsIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLklNQUdFLCBcImltYWdlIGZpZ3VyZSBwaG90byBpbGx1c3RyYXRpb24gcGljdHVyZSBtZWRpYSB1cGxvYWRcIiksXHJcbiAgICAgICAgICAgIG5ldyBRdWlja01lbnVJdGVtKG1lZGlhQmxvY2tzU2VjdGlvbiwgJ1ZpZGVvJywgJ0VtYmVkIHZpZGVvLicsIEljb25zLlZpZGVvLCAndmlkZW8nLCBcInZpZGVvIGVtYmVkIHlvdXR1YmUgdmltZW8gY2xpcCBmaWxtIG1vdmllIHRhcGVcIilcclxuICAgICAgICBdKTtcclxuXHJcbiAgICAgICAgcXVpY2tNZW51LmFwcGVuZChtZWRpYUJsb2Nrc1NlY3Rpb24pO1xyXG5cclxuICAgICAgICBjb25zdCBoZWFkaW5nQmxvY2tzU2VjdGlvbiA9IG5ldyBRdWlja01lbnVTZWN0aW9uKHsgcXVpY2tNZW51SW5zdGFuY2U6IHF1aWNrTWVudSwgdGl0bGU6ICdIZWFkaW5nJywgY2xhc3NMaXN0OiAnaGVhZGluZy1zZWN0aW9uJyB9KTtcclxuXHJcbiAgICAgICAgaGVhZGluZ0Jsb2Nrc1NlY3Rpb24uYXBwZW5kUXVpY2tNZW51SXRlbXMoW1xyXG4gICAgICAgICAgICBuZXcgUXVpY2tNZW51SXRlbShoZWFkaW5nQmxvY2tzU2VjdGlvbiwgJ0hlYWRpbmcgMScsICdMYXJnZSBoZWFkZXIgZm9yIG1haW4gdG9waWNzLicsICdpY29uLWp1bGlhLWhlYWQtMScsIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl8xLCBcImhlYWRlciAxIGhlYWRpbmcgMSBoMVwiKSxcclxuICAgICAgICAgICAgbmV3IFF1aWNrTWVudUl0ZW0oaGVhZGluZ0Jsb2Nrc1NlY3Rpb24sICdIZWFkaW5nIDInLCAnTWVkaXVtIGhlYWRlciBmb3Igc2VjdGlvbnMuJywgJ2ljb24tanVsaWEtaGVhZC0yJywgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuSEVBREVSXzIsIFwiaGVhZGVyIDIgaGVhZGluZyAyIGgyXCIpLFxyXG4gICAgICAgICAgICBuZXcgUXVpY2tNZW51SXRlbShoZWFkaW5nQmxvY2tzU2VjdGlvbiwgJ0hlYWRpbmcgMycsICdTbWFsbCBoZWFkZXIgZm9yIHN1YnNlY3Rpb25zLicsICdpY29uLWp1bGlhLWhlYWQtMycsIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl8zLCBcImhlYWRlciAzIGhlYWRpbmcgMyBoM1wiKSxcclxuICAgICAgICAgICAgbmV3IFF1aWNrTWVudUl0ZW0oaGVhZGluZ0Jsb2Nrc1NlY3Rpb24sICdIZWFkaW5nIDQnLCAnRGV0YWlsZWQgaGVhZGVyIGZvciBzdWJ0b3BpY3MuJywgJ2ljb24tanVsaWEtaGVhZC00JywgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuSEVBREVSXzQsIFwiaGVhZGVyIDQgaGVhZGluZyA0IGg0XCIpLFxyXG4gICAgICAgICAgICBuZXcgUXVpY2tNZW51SXRlbShoZWFkaW5nQmxvY2tzU2VjdGlvbiwgJ0hlYWRpbmcgNScsICdNaW5vciBoZWFkZXIgZm9yIHNwZWNpZmljcy4nLCAnaWNvbi1qdWxpYS1oZWFkLTUnLCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfNSwgXCJoZWFkZXIgNSBoZWFkaW5nIDUgaDVcIiksXHJcbiAgICAgICAgICAgIG5ldyBRdWlja01lbnVJdGVtKGhlYWRpbmdCbG9ja3NTZWN0aW9uLCAnSGVhZGluZyA2JywgJ1NtYWxsZXN0IGhlYWRlciBmb3IgZmluZSBkZXRhaWxzLicsICdpY29uLWp1bGlhLWhlYWQtNicsIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl82LCBcImhlYWRlciA2IGhlYWRpbmcgNiBoNlwiKSxcclxuICAgICAgICBdKTtcclxuXHJcbiAgICAgICAgcXVpY2tNZW51LmFwcGVuZChoZWFkaW5nQmxvY2tzU2VjdGlvbik7XHJcblxyXG5cclxuICAgICAgICBjb25zdCBsaXN0QmxvY2tzU2VjdGlvbiA9IG5ldyBRdWlja01lbnVTZWN0aW9uKHsgcXVpY2tNZW51SW5zdGFuY2U6IHF1aWNrTWVudSwgdGl0bGU6ICdMaXN0JywgY2xhc3NMaXN0OiAnbGlzdC1zZWN0aW9uJyB9KTtcclxuXHJcbiAgICAgICAgbGlzdEJsb2Nrc1NlY3Rpb24uYXBwZW5kUXVpY2tNZW51SXRlbXMoW1xyXG4gICAgICAgICAgICBuZXcgUXVpY2tNZW51SXRlbShsaXN0QmxvY2tzU2VjdGlvbiwgJ1RvZG8gbGlzdCcsICdUcmFjayB0YXNrcyB3aXRoIGNoZWNrYm94ZXMuJywgJ2ljb24tbWF0ZXJpYWwtY2hlY2stbGlzdC0yJywgJ3RvZG8tbGlzdCcsIFwidG9kbyBsaXN0IHRhc2sgbGlzdCBjaGVja2xpc3RcIiksXHJcbiAgICAgICAgICAgIG5ldyBRdWlja01lbnVJdGVtKGxpc3RCbG9ja3NTZWN0aW9uLCAnQnVsbGV0ZWQgbGlzdCcsICdPcmdhbml6ZSBpdGVtcyB3aXRoIGJ1bGxldCBwb2ludHMuJywgJ2ljb24td29yZHByZXNzLWJ1bGxldGVkLWxpc3QnLCAnYnVsbGV0ZWQtbGlzdCcsIFwiYnVsbGV0ZWQgbGlzdCB1bm9yZGVyZWQgbGlzdCB1bFwiKSxcclxuICAgICAgICAgICAgbmV3IFF1aWNrTWVudUl0ZW0obGlzdEJsb2Nrc1NlY3Rpb24sICdOdW1iZXJlZCBsaXN0JywgJ0xpc3QgaXRlbXMgaW4gYSBudW1iZXJlZCBmb3JtYXQuJywgJ2ljb24td29yZHByZXNzLW51bWJlcmVkLWxpc3QnLCAnbnVtYmVyZWQtbGlzdCcsIFwibnVtYmVyZWQgbGlzdCBudW1iZXIgbGlzdCBzZXF1ZW50aWFsIGxpc3Qgb2wgZW51bWVyYXRlZCBsaXN0IG9yZGVyZWQgbGlzdFwiKVxyXG4gICAgICAgIF0pO1xyXG5cclxuICAgICAgICBxdWlja01lbnUuYXBwZW5kKGxpc3RCbG9ja3NTZWN0aW9uKTtcclxuICAgICAgICBcclxuICAgICAgICBcclxuICAgICAgICBjb25zdCBlbWJlZFNlY3Rpb24gPSBuZXcgUXVpY2tNZW51U2VjdGlvbih7IHF1aWNrTWVudUluc3RhbmNlOiBxdWlja01lbnUsIHRpdGxlOiAnRW1iZWQnLCBjbGFzc0xpc3Q6ICdlbWJlZC1zZWN0aW9uJyB9KTtcclxuXHJcbiAgICAgICAgZW1iZWRTZWN0aW9uLmFwcGVuZFF1aWNrTWVudUl0ZW1zKFtcclxuICAgICAgICAgICAgbmV3IFF1aWNrTWVudUl0ZW0oZW1iZWRTZWN0aW9uLCAnR2l0SHViIEdpc3QnLCAnVHJhY2sgdGFza3Mgd2l0aCBjaGVja2JveGVzLicsICdpY29uLW1hdGVyaWFsLWNoZWNrLWxpc3QtMicsICd0b2RvLWxpc3QnLCBcInRvZG8gbGlzdCB0YXNrIGxpc3QgY2hlY2tsaXN0XCIpLFxyXG4gICAgICAgICAgICBuZXcgUXVpY2tNZW51SXRlbShlbWJlZFNlY3Rpb24sICdHaXRMYWIgU25pcHBldCAnLCAnTGlzdCBpdGVtcyBpbiBhIG51bWJlcmVkIGZvcm1hdC4nLCAnaWNvbi13b3JkcHJlc3MtbnVtYmVyZWQtbGlzdCcsICdudW1iZXJlZC1saXN0JywgXCJudW1iZXJlZCBsaXN0IG51bWJlciBsaXN0IHNlcXVlbnRpYWwgbGlzdCBvbCBlbnVtZXJhdGVkIGxpc3Qgb3JkZXJlZCBsaXN0XCIpLFxyXG4gICAgICAgICAgICBuZXcgUXVpY2tNZW51SXRlbShlbWJlZFNlY3Rpb24sICdDb2RlUGVuJywgJ09yZ2FuaXplIGl0ZW1zIHdpdGggYnVsbGV0IHBvaW50cy4nLCAnaWNvbi13b3JkcHJlc3MtYnVsbGV0ZWQtbGlzdCcsICdidWxsZXRlZC1saXN0JywgXCJidWxsZXRlZCBsaXN0IHVub3JkZXJlZCBsaXN0IHVsXCIpLFxyXG4gICAgICAgICAgICBuZXcgUXVpY2tNZW51SXRlbShlbWJlZFNlY3Rpb24sICdHb29nbGUgTWFwcycsICdMaXN0IGl0ZW1zIGluIGEgbnVtYmVyZWQgZm9ybWF0LicsICdpY29uLXdvcmRwcmVzcy1udW1iZXJlZC1saXN0JywgJ251bWJlcmVkLWxpc3QnLCBcIm51bWJlcmVkIGxpc3QgbnVtYmVyIGxpc3Qgc2VxdWVudGlhbCBsaXN0IG9sIGVudW1lcmF0ZWQgbGlzdCBvcmRlcmVkIGxpc3RcIiksXHJcbiAgICAgICAgXSk7XHJcblxyXG4gICAgICAgIHF1aWNrTWVudS5hcHBlbmQoZW1iZWRTZWN0aW9uKTsgICAgXHJcblxyXG4gICAgICAgIHJldHVybiBxdWlja01lbnU7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBCYXNlVUlDb21wb25lbnQgfSBmcm9tIFwiLi4vY29tbW9uL0Jhc2VVSUNvbXBvbmVudFwiO1xyXG5pbXBvcnQgeyBDdXN0b21FdmVudHMgfSBmcm9tIFwiQC9jb21tb24vQ3VzdG9tRXZlbnRzXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgVGl0bGUgZXh0ZW5kcyBCYXNlVUlDb21wb25lbnQge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcclxuXHJcbiAgICAgICAgc3VwZXIoe1xyXG4gICAgICAgICAgICB2YWx1ZTogdmFsdWVcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5hdHRhY2hFdmVudHMoKTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0KCk6IEhUTUxFbGVtZW50IHtcclxuXHJcbiAgICAgICAgY29uc3QgaHRtbEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJ0aXRsZVwiKTtcclxuXHJcbiAgICAgICAgY29uc3QgaDEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaDFcIik7XHJcbiAgICAgICAgaDEuc2V0QXR0cmlidXRlKFwiY29udGVudEVkaXRhYmxlXCIsIFwidHJ1ZVwiKTtcclxuICAgICAgICBoMS5zZXRBdHRyaWJ1dGUoXCJkYXRhLXBsYWNlaG9sZGVyXCIsIFwiVW50aXRsZWRcIik7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnByb3BzLnZhbHVlKSB7XHJcbiAgICAgICAgICAgIGgxLnRleHRDb250ZW50ID0gdGhpcy5wcm9wcy52YWx1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGh0bWxFbGVtZW50LmFwcGVuZENoaWxkKGgxKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGh0bWxFbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIGF0dGFjaEV2ZW50cygpIHtcclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIChldmVudCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoZXZlbnQua2V5ID09IFwiRW50ZXJcIikge1xyXG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KEN1c3RvbUV2ZW50cy5mb2N1c09uRmlyc3RSZXF1ZXN0ZWQsIHt9KSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgY3JlYXRlKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBUaXRsZSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBUaXRsZSh2YWx1ZSk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBUaXRsZSB9IGZyb20gXCJAL2NvbXBvbmVudHMvdGl0bGUvVGl0bGVcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBUaXRsZUJ1aWxkZXIge1xyXG4gICAgc3RhdGljIGJ1aWxkKCk6IFRpdGxlIHtcclxuICAgICAgICByZXR1cm4gVGl0bGUuY3JlYXRlKHdpbmRvdy5lZGl0b3JDb25maWc/LnRpdGxlKVxyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgRWxlbWVudEZhY3RvcnlTZXJ2aWNlIH0gZnJvbSBcIkAvc2VydmljZXMvZWxlbWVudC1mYWN0b3J5L0VsZW1lbnRGYWN0b3J5U2VydmljZVwiO1xyXG5pbXBvcnQgeyBCYXNlVUlDb21wb25lbnQgfSBmcm9tIFwiLi4vY29tbW9uL0Jhc2VVSUNvbXBvbmVudFwiO1xyXG5pbXBvcnQgeyBDdXN0b21FdmVudHMgfSBmcm9tIFwiQC9jb21tb24vQ3VzdG9tRXZlbnRzXCI7XHJcbmltcG9ydCB7IENvbW1hbmRzIH0gZnJvbSBcIkAvY29tbWFuZHMvQ29tbWFuZHNcIjtcclxuaW1wb3J0IHsgSUNvbW1hbmRFdmVudERldGFpbCB9IGZyb20gXCJAL2NvbW1hbmRzL0lDb21tYW5kRXZlbnREZXRhaWxcIjtcclxuaW1wb3J0IHsgRGVwZW5kZW5jeUNvbnRhaW5lciB9IGZyb20gXCJAL2NvcmUvRGVwZW5kZW5jeUNvbnRhaW5lclwiO1xyXG5pbXBvcnQgeyBJUXVpY2tNZW51IH0gZnJvbSBcIi4uL3F1aWNrLW1lbnUvSVF1aWNrTWVudVwiO1xyXG5pbXBvcnQgeyBJU2hvcnRjdXRMaXN0ZW5lcnMgfSBmcm9tIFwiQC9jb3JlL0lTaG9ydGN1dExpc3RlbmVyc1wiO1xyXG5pbXBvcnQgeyBJVGFibGVMaXN0ZW5lcnMgfSBmcm9tIFwiQC9jb3JlL2xpc3RlbmVycy9JVGFibGVMaXN0ZW5lcnNcIjtcclxuaW1wb3J0IHsgSVRhYmxlQ29udGV4dEZsb2F0aW5nVG9vbGJhciB9IGZyb20gXCIuLi9mbG9hdGluZy10b29sYmFyL0lUYWJsZUNvbnRleHRGbG9hdGluZ1Rvb2xiYXJcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBDb250ZW50IGV4dGVuZHMgQmFzZVVJQ29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG5cclxuICAgICAgICBzdXBlcih7fSk7XHJcblxyXG4gICAgICAgIHRoaXMuYXR0YWNoRXZlbnQoKTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0KCk6IEhUTUxFbGVtZW50IHtcclxuXHJcbiAgICAgICAgY29uc3QgaHRtbEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJjb250ZW50XCIpO1xyXG5cclxuICAgICAgICBpZiAod2luZG93LmVkaXRvckNvbmZpZz8uaW5jbHVkZUZpcnN0UGFyYWdyYXBoIHx8IHRydWUpIHtcclxuICAgICAgICAgICAgaHRtbEVsZW1lbnQuYXBwZW5kKEVsZW1lbnRGYWN0b3J5U2VydmljZS5ibG9ja1BhcmFncmFwaCgpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBodG1sRWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICogQ2xlYXJzIHRleHQgc2VsZWN0aW9uIHdoZW4gaW5pdGlhdGluZyBhIGRyYWcgZnJvbSBlbGVtZW50cyB3aXRoIHRoZSBgLmRyYWctaGFuZGxlcmAgY2xhc3MuXHJcbiAgICAqIFRoaXMgZnVuY3Rpb24gYXR0YWNoZXMgYSBgbW91c2Vkb3duYCBldmVudCBsaXN0ZW5lciB0byB0aGUgZW50aXJlIGRvY3VtZW50LiBXaGVuIGEgbW91c2Vkb3duXHJcbiAgICAqIGV2ZW50IG9jY3VycyBvbiBhbiBlbGVtZW50IHRoYXQgaXMgYSBjaGlsZCBvZiBhIGAuZHJhZy1oYW5kbGVyYCBvciBvbiB0aGUgYC5kcmFnLWhhbmRsZXJgIGl0c2VsZixcclxuICAgICogaXQgY2hlY2tzIGlmIHRoZSB0YXJnZXQgb3IgaXRzIHBhcmVudCBpcyBhIGRlc2lnbmF0ZWQgZHJhZyBoYW5kbGVyLiBJZiB0cnVlLCBpdCBjbGVhcnMgYW55IGN1cnJlbnQgdGV4dCBzZWxlY3Rpb25zLlxyXG4gICAgKiBUaGlzIHByZXZlbnRzIHRleHQgZnJvbSBiZWluZyBhY2NpZGVudGFsbHkgc2VsZWN0ZWQgZHVyaW5nIGRyYWctYW5kLWRyb3AgaW50ZXJhY3Rpb25zLCBlbmhhbmNpbmcgVVggaW4gZHJhZ2dhYmxlIGludGVyZmFjZXMuXHJcbiAgICAqIFxyXG4gICAgKiBAZnVuY3Rpb24gY2xlYXJTZWxlY3Rpb25PbkRyYWdcclxuICAgICovXHJcbiAgICBjbGVhclNlbGVjdGlvbk9uRHJhZygpIHtcclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vkb3duXCIsIChldmVudCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgICAgICBsZXQgcGFyZW50OiBFbGVtZW50IHwgbnVsbDtcclxuXHJcbiAgICAgICAgICAgIGlmIChlbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5ub2RlVHlwZSA9PSBOb2RlLlRFWFRfTk9ERSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudCA9IGVsZW1lbnQucGFyZW50RWxlbWVudDtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gZWxlbWVudDtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAocGFyZW50ICYmIHBhcmVudC5jbG9zZXN0KFwiLmRyYWctaGFuZGxlclwiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5nZXRTZWxlY3Rpb24oKT8ucmVtb3ZlQWxsUmFuZ2VzKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBhdHRhY2hFdmVudCgpOiB2b2lkIHtcclxuXHJcbiAgICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbk9uRHJhZygpO1xyXG4gICAgICAgIHRoaXMucmVSZW5kZXJQbGFjZWhvbGRlcigpO1xyXG5cclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiY29waWVkVGV4dFwiLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvcHlFbGVtZW50SXRlbSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjY29weU9wdGlvbiAudGV4dC1vcHRpb24gc3BhblwiKSBhcyBIVE1MU3BhbkVsZW1lbnQ7XHJcbiAgICAgICAgICAgIGlmIChjb3B5RWxlbWVudEl0ZW0pIHtcclxuXHJcbiAgICAgICAgICAgICAgICBjb3B5RWxlbWVudEl0ZW0udGV4dENvbnRlbnQgPSBcIkNvcGllZCFcIjtcclxuXHJcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb3B5RWxlbWVudEl0ZW0udGV4dENvbnRlbnQgPSBcIkNvcHlcIjtcclxuICAgICAgICAgICAgICAgIH0sIDE1MDApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vRm9jdXMgb24gUCB3aGVuIGxvYWRcclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBjb25zdCBlZGl0b3IgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuam9oYW5uZXMtZWRpdG9yJyk7XHJcblxyXG4gICAgICAgICAgICBpZiAoZWRpdG9yKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgYmxvY2tzID0gZWRpdG9yLnF1ZXJ5U2VsZWN0b3JBbGwoJy5ibG9jaycpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChibG9ja3MubGVuZ3RoID09IDEpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcCA9IGJsb2Nrc1swXS5xdWVyeVNlbGVjdG9yKCcuam9oYW5uZXMtY29udGVudC1lbGVtZW50JykgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHAuaW5uZXJUZXh0ID09ICcnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHAuZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcblxyXG5cclxuXHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCBhc3luYyAoZXZlbnQpID0+IHtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHF1aWNrTWVudSA9IERlcGVuZGVuY3lDb250YWluZXIuSW5zdGFuY2UucmVzb2x2ZTxJUXVpY2tNZW51PihcIklRdWlja01lbnVcIik7XHJcbiAgICAgICAgICAgIGNvbnN0IHRhYmxlVG9vbGJhciA9IERlcGVuZGVuY3lDb250YWluZXIuSW5zdGFuY2UucmVzb2x2ZTxJVGFibGVDb250ZXh0RmxvYXRpbmdUb29sYmFyPihcIklUYWJsZUNvbnRleHRGbG9hdGluZ1Rvb2xiYXJcIik7XHJcblxyXG4gICAgICAgICAgICBpZiAoZXZlbnQuY3RybEtleSB8fCBldmVudC5zaGlmdEtleSB8fCBldmVudC5hbHRLZXkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJ0VudGVyJyAmJiAhcXVpY2tNZW51LmlzVmlzaWJsZSAmJiAhdGFibGVUb29sYmFyLmlzVmlzaWJsZSkge1xyXG4gICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgZGVmYXVsdCBibG9jayB3aGVuIHByZXNzIEVudGVyXHJcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQ8SUNvbW1hbmRFdmVudERldGFpbD4oQ3VzdG9tRXZlbnRzLmVtaXR0ZWRDb21tYW5kLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGV0YWlsOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ6IENvbW1hbmRzLmluc2VydE5ldyxcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnQmFja3NwYWNlJykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCdqb2hhbm5lcy1jb250ZW50LWVsZW1lbnQnKSAmJiB0YXJnZXQudGV4dENvbnRlbnQ/LnRyaW0oKSA9PT0gJycpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50PElDb21tYW5kRXZlbnREZXRhaWw+KEN1c3RvbUV2ZW50cy5lbWl0dGVkQ29tbWFuZCwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ6IENvbW1hbmRzLmZvY3VzT25QcmV2aW91c0Jsb2NrLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudDxJQ29tbWFuZEV2ZW50RGV0YWlsPihDdXN0b21FdmVudHMuZW1pdHRlZENvbW1hbmQsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGV0YWlsOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kOiBDb21tYW5kcy5mb2N1c09uUHJldmlvdXNCbG9jayxcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygnam9oYW5uZXMtY29udGVudC1lbGVtZW50JykgJiYgdGFyZ2V0LnRleHRDb250ZW50Py50cmltKCkgIT09ICcnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9UT0RPOiBSZXBsYWNlIHRoZSBkZWxldGUgYW5kIGZvY3VzIGJ5IG1lcmdlXHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJ0RlbGV0ZScpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygnam9oYW5uZXMtY29udGVudC1lbGVtZW50JykgJiYgdGFyZ2V0LnRleHRDb250ZW50Py50cmltKCkgPT09ICcnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5ibG9ja09wZXJhdGlvbnNTZXJ2aWNlLmV4ZWNDb21tYW5kKEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuQkxPQ0tfT1BFUkFUSU9OUy5ERUxFVEVfRk9DVVNfT05fTkVYVCwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCdqb2hhbm5lcy1jb250ZW50LWVsZW1lbnQnKSAmJiB0YXJnZXQudGV4dENvbnRlbnQ/LnRyaW0oKSAhPT0gJycpIHtcclxuICAgICAgICAgICAgICAgICAgICAvL1RPRE86IFJlcGxhY2UgdGhlIGRlbGV0ZSBhbmQgZm9jdXMgYnkgbWVyZ2VcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICdBcnJvd1JpZ2h0JyAmJiBDb250ZW50LmlzQ3Vyc29yQXRFbmQoZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KSkge1xyXG4gICAgICAgICAgICAgICAgLy8gdGhpcy5ibG9ja09wZXJhdGlvbnNTZXJ2aWNlLmV4ZWNDb21tYW5kKEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuQkxPQ0tfT1BFUkFUSU9OUy5GT0NVU19PTl9ORVhULCBmYWxzZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dMZWZ0JyAmJiBDb250ZW50LmlzQ3Vyc29yQXRTdGFydChldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyB0aGlzLmJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuZXhlY0NvbW1hbmQoQmxvY2tPcGVyYXRpb25zU2VydmljZS5CTE9DS19PUEVSQVRJT05TLkZPQ1VTX09OX1BSRVZJT1VTLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dEb3duJyAmJiBDb250ZW50LmlzQ3Vyc29yT25MYXN0TGluZSgpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyB0aGlzLmJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuZXhlY0NvbW1hbmQoQmxvY2tPcGVyYXRpb25zU2VydmljZS5CTE9DS19PUEVSQVRJT05TLkZPQ1VTX09OX05FWFQsIGZhbHNlKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICdBcnJvd1VwJyAmJiBDb250ZW50LmlzQ3Vyc29yT25GaXJzdExpbmUoKSkge1xyXG4gICAgICAgICAgICAgICAgLy8gdGhpcy5ibG9ja09wZXJhdGlvbnNTZXJ2aWNlLmV4ZWNDb21tYW5kKEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuQkxPQ0tfT1BFUkFUSU9OUy5GT0NVU19PTl9QUkVWSU9VUywgZmFsc2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICogQWRkcyBhbiBpbnB1dCBldmVudCBsaXN0ZW5lciB0byB0aGUgZW50aXJlIGRvY3VtZW50IHRvIGhhbmRsZSBwbGFjZWhvbGRlciBiZWhhdmlvciBmb3IgY29udGVudEVkaXRhYmxlIGVsZW1lbnRzLlxyXG4gICAgKiBUaGlzIHdvcmthcm91bmQgaXMgc3BlY2lmaWNhbGx5IGRlc2lnbmVkIHRvIGFkZHJlc3MgYSBrbm93biBpc3N1ZSBpbiBGaXJlZm94IHdoZXJlIGNvbnRlbnRFZGl0YWJsZSBlbGVtZW50c1xyXG4gICAgKiBkbyBub3QgcHJvcGVybHkgcmVzZXQgdGhlaXIgcGxhY2Vob2xkZXJzIGFmdGVyIHRoZSBjb250ZW50IGlzIGRlbGV0ZWQgYnkgdGhlIHVzZXIuXHJcbiAgICAqIFxyXG4gICAgKiBUaGUgZXZlbnQgbGlzdGVuZXIgY2hlY2tzIGlmIHRoZSB0YXJnZXQgb2YgdGhlIGlucHV0IGV2ZW50IGlzIGEgY29udGVudEVkaXRhYmxlIGVsZW1lbnQgYW5kIHdoZXRoZXIgaXQgaGFzIGFcclxuICAgICogY3VzdG9tICdkYXRhLXBsYWNlaG9sZGVyJyBhdHRyaWJ1dGUuIElmIHRoZSBlbGVtZW50J3MgY29udGVudCBpcyBlbXB0eSAoaWdub3Jpbmcgd2hpdGUgc3BhY2VzKSwgdGhlIGZ1bmN0aW9uXHJcbiAgICAqIHJlc2V0cyB0aGUgJ2RhdGEtcGxhY2Vob2xkZXInIHRvIGVuc3VyZSBpdCBkaXNwbGF5cyBjb3JyZWN0bHksIGFuZCBjbGVhcnMgYW55IHJlc2lkdWFsIHRleHQgY29udGVudCB0aGF0IG1pZ2h0XHJcbiAgICAqIGludGVyZmVyZSB3aXRoIHRoZSBwbGFjZWhvbGRlciBkaXNwbGF5LlxyXG4gICAgKiBcclxuICAgICogQGV4YW1wbGVcclxuICAgICogLy8gVG8gdXRpbGl6ZSB0aGlzIHdvcmthcm91bmQsIGVuc3VyZSB5b3VyIGNvbnRlbnRFZGl0YWJsZSBlbGVtZW50cyBoYXZlIGEgJ2RhdGEtcGxhY2Vob2xkZXInIGF0dHJpYnV0ZS5cclxuICAgICogLy8gPGRpdiBjb250ZW50RWRpdGFibGU9XCJ0cnVlXCIgZGF0YS1wbGFjZWhvbGRlcj1cIkVudGVyIHRleHQgaGVyZS4uLlwiPjwvZGl2PlxyXG4gICAgKiBcclxuICAgICogQHBhcmFtIHtFdmVudH0gZXZlbnQgLSBUaGUgaW5wdXQgZXZlbnQgdHJpZ2dlcmVkIGJ5IHVzZXIgaW50ZXJhY3Rpb24gd2l0aCB0aGUgZG9jdW1lbnQncyBpbnB1dC1jYXBhYmxlIGVsZW1lbnRzLlxyXG4gICAgKi9cclxuICAgIHJlUmVuZGVyUGxhY2Vob2xkZXIoKSB7XHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCBmdW5jdGlvbiAoZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICAgICAgICAgIGlmIChldmVudC50YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZWRpdGFibGVFbGVtZW50ID0gZXZlbnQudGFyZ2V0O1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChlZGl0YWJsZUVsZW1lbnQuaXNDb250ZW50RWRpdGFibGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZWRpdGFibGVFbGVtZW50Lmhhc0F0dHJpYnV0ZSgnZGF0YS1wbGFjZWhvbGRlcicpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1c3RvbVBsYWNlaG9sZGVyID0gZWRpdGFibGVFbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1wbGFjZWhvbGRlcicpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVkaXRhYmxlRWxlbWVudC50ZXh0Q29udGVudD8udHJpbSgpID09PSAnJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWRpdGFibGVFbGVtZW50LnNldEF0dHJpYnV0ZSgnZGF0YS1wbGFjZWhvbGRlcicsIGN1c3RvbVBsYWNlaG9sZGVyIHx8ICcnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkaXRhYmxlRWxlbWVudC50ZXh0Q29udGVudCA9ICcnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGlzQ3Vyc29yQXRFbmQodGFyZ2V0OiBIVE1MRWxlbWVudCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGNvbnN0IGZvY3VzYWJsZVBhcmVudCA9IHRhcmdldC5jbG9zZXN0KCcuZm9jdXNhYmxlJyk7XHJcbiAgICAgICAgaWYgKCFmb2N1c2FibGVQYXJlbnQpIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpITtcclxuICAgICAgICBpZiAoIXNlbGVjdGlvbi5yYW5nZUNvdW50KSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XHJcbiAgICAgICAgbGV0IGVuZE5vZGU6IE5vZGUgfCBudWxsID0gcmFuZ2UuZW5kQ29udGFpbmVyO1xyXG4gICAgICAgIGlmIChlbmROb2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xyXG4gICAgICAgICAgICBlbmROb2RlID0gZW5kTm9kZS5wYXJlbnROb2RlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmFuZ2UuY29sbGFwc2VkICYmIGVuZE5vZGUgPT09IGZvY3VzYWJsZVBhcmVudCAmJiByYW5nZS5lbmRPZmZzZXQgPT09IChyYW5nZS5lbmRDb250YWluZXIudGV4dENvbnRlbnQgfHwgJycpLmxlbmd0aDtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgaXNDdXJzb3JBdFN0YXJ0KHRhcmdldDogSFRNTEVsZW1lbnQpOiBib29sZWFuIHtcclxuICAgICAgICBjb25zdCBmb2N1c2FibGVQYXJlbnQgPSB0YXJnZXQuY2xvc2VzdCgnLmZvY3VzYWJsZScpO1xyXG4gICAgICAgIGlmICghZm9jdXNhYmxlUGFyZW50KSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKSE7XHJcbiAgICAgICAgaWYgKCFzZWxlY3Rpb24ucmFuZ2VDb3VudCkgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xyXG5cclxuICAgICAgICBsZXQgc3RhcnROb2RlOiBOb2RlIHwgbnVsbCA9IHJhbmdlLnN0YXJ0Q29udGFpbmVyO1xyXG4gICAgICAgIGlmIChzdGFydE5vZGUubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XHJcbiAgICAgICAgICAgIHN0YXJ0Tm9kZSA9IHN0YXJ0Tm9kZS5wYXJlbnROb2RlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmFuZ2UuY29sbGFwc2VkICYmIHN0YXJ0Tm9kZSA9PT0gZm9jdXNhYmxlUGFyZW50ICYmIHJhbmdlLnN0YXJ0T2Zmc2V0ID09PSAwO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBpc0F0Rmlyc3RWaXNpYmxlTGluZShlbGVtZW50OiBIVE1MRWxlbWVudCkge1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKSE7XHJcbiAgICAgICAgaWYgKCFzZWxlY3Rpb24ucmFuZ2VDb3VudCkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCkuY2xvbmVSYW5nZSgpO1xyXG4gICAgICAgIHJhbmdlLmNvbGxhcHNlKHRydWUpO1xyXG4gICAgICAgIHJhbmdlLnNldFN0YXJ0KGVsZW1lbnQsIDApO1xyXG4gICAgICAgIGNvbnN0IHJhbmdlVG9wID0gcmFuZ2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wO1xyXG4gICAgICAgIGNvbnN0IGVsZW1lbnRUb3AgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcDtcclxuXHJcbiAgICAgICAgcmV0dXJuIHJhbmdlVG9wID09PSBlbGVtZW50VG9wO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBpc0F0TGFzdFZpc2libGVMaW5lKGVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpITtcclxuICAgICAgICBpZiAoIXNlbGVjdGlvbi5yYW5nZUNvdW50KSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgY29uc3QgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKS5jbG9uZVJhbmdlKCk7XHJcbiAgICAgICAgcmFuZ2UuY29sbGFwc2UoZmFsc2UpO1xyXG4gICAgICAgIHJhbmdlLnNldEVuZChlbGVtZW50LCBlbGVtZW50LmNoaWxkTm9kZXMubGVuZ3RoKTtcclxuICAgICAgICBjb25zdCByYW5nZUJvdHRvbSA9IHJhbmdlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmJvdHRvbTtcclxuICAgICAgICBjb25zdCBlbGVtZW50Qm90dG9tID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5ib3R0b207XHJcblxyXG4gICAgICAgIHJldHVybiByYW5nZUJvdHRvbSA9PT0gZWxlbWVudEJvdHRvbTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgc3RhdGljIGRpZEN1cnNvck1vdmUoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCkhO1xyXG4gICAgICAgIGlmICghc2VsZWN0aW9uLnJhbmdlQ291bnQpIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xyXG5cclxuICAgICAgICBjb25zdCBvcmlnaW5hbFJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCkuY2xvbmVSYW5nZSgpO1xyXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsUmVjdCA9IG9yaWdpbmFsUmFuZ2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcblxyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTxib29sZWFuPihyZXNvbHZlID0+IHtcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdSYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApLmNsb25lUmFuZ2UoKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG5ld1JlY3QgPSBuZXdSYW5nZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBkaWRNb3ZlID0gIShvcmlnaW5hbFJlY3QudG9wID09PSBuZXdSZWN0LnRvcCAmJiBvcmlnaW5hbFJlY3QubGVmdCA9PT0gbmV3UmVjdC5sZWZ0KTtcclxuICAgICAgICAgICAgICAgIGlmICghZGlkTW92ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKGRpZE1vdmUpO1xyXG4gICAgICAgICAgICB9LCAwKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgaXNDdXJzb3JPbkZpcnN0TGluZSgpOiBib29sZWFuIHtcclxuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgICAgICAgaWYgKCFzZWxlY3Rpb24gfHwgIXNlbGVjdGlvbi5yYW5nZUNvdW50KSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XHJcblxyXG4gICAgICAgIHJldHVybiByYW5nZS5zdGFydE9mZnNldCA9PT0gMCAmJiByYW5nZS5zdGFydENvbnRhaW5lciA9PT0gcmFuZ2UuY29tbW9uQW5jZXN0b3JDb250YWluZXI7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGlzQ3Vyc29yT25MYXN0TGluZSgpOiBib29sZWFuIHtcclxuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgICAgICAgaWYgKCFzZWxlY3Rpb24gfHwgIXNlbGVjdGlvbi5yYW5nZUNvdW50KSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XHJcblxyXG4gICAgICAgIHJldHVybiByYW5nZS5lbmRPZmZzZXQgPT09IHJhbmdlLmVuZENvbnRhaW5lci50ZXh0Q29udGVudD8ubGVuZ3RoICYmIHJhbmdlLmVuZENvbnRhaW5lciA9PT0gcmFuZ2UuY29tbW9uQW5jZXN0b3JDb250YWluZXI7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGdldEluc3RhbmNlKCk6IENvbnRlbnQge1xyXG5cclxuICAgICAgICBjb25zdCBzaG9ydGN1dExpc3RlbmVyID0gRGVwZW5kZW5jeUNvbnRhaW5lci5JbnN0YW5jZS5yZXNvbHZlPElTaG9ydGN1dExpc3RlbmVycz4oXCJJU2hvcnRjdXRMaXN0ZW5lcnNcIik7XHJcbiAgICAgICAgY29uc3QgdGFibGVMaXN0ZW5lcnMgPSBEZXBlbmRlbmN5Q29udGFpbmVyLkluc3RhbmNlLnJlc29sdmU8SVRhYmxlTGlzdGVuZXJzPihcIklUYWJsZUxpc3RlbmVyc1wiKTtcclxuICAgICAgICByZXR1cm4gbmV3IENvbnRlbnQoKTtcclxuICAgIH1cclxufSIsImltcG9ydCB7IENvbnRlbnQgfSBmcm9tIFwiQC9jb21wb25lbnRzL2NvbnRlbnQvQ29udGVudFwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIENvbnRlbnRCdWlsZGVyIHtcclxuICAgIHN0YXRpYyBidWlsZCgpOiBDb250ZW50IHtcclxuICAgICAgICByZXR1cm4gQ29udGVudC5nZXRJbnN0YW5jZSgpO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgRGlyZWN0aW9ucyB9IGZyb20gXCJAL2NvbW1vbi9EaXJlY3Rpb25zXCI7XHJcbmltcG9ydCB7IFRhYmxlU2NvcGVzIH0gZnJvbSBcIkAvc2VydmljZXMvdGFibGUtb3BlcmF0aW9ucy9UYWJsZVNjb3Blc1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFRhYmxlVXRpbHMge1xyXG5cclxuICAgIHN0YXRpYyBhZGRSb3codGFibGU6IEhUTUxUYWJsZUVsZW1lbnQsIHBvc2l0aW9uOiBudW1iZXIgfCBudWxsID0gbnVsbCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGluc2VydFBvc2l0aW9uID0gKHBvc2l0aW9uICE9PSBudWxsICYmIHBvc2l0aW9uID49IDAgJiYgcG9zaXRpb24gPD0gdGFibGUucm93cy5sZW5ndGgpID8gcG9zaXRpb24gOiB0YWJsZS5yb3dzLmxlbmd0aDtcclxuICAgICAgICBjb25zdCBuZXdSb3cgPSB0YWJsZS5pbnNlcnRSb3coaW5zZXJ0UG9zaXRpb24pO1xyXG5cclxuICAgICAgICBjb25zdCBudW1Db2x1bW5zID0gQXJyYXkuZnJvbSh0YWJsZS5yb3dzKS5yZWR1Y2UoKG1heCwgcm93KSA9PiBNYXRoLm1heChtYXgsIHJvdy5jZWxscy5sZW5ndGgpLCAwKTtcclxuICAgICAgICBsZXQgYWZmZWN0ZWRDZWxscyA9IFtdOyAgLy8gQXJyYXkgdG8gaG9sZCByZWZlcmVuY2VzIHRvIG5ldyBjZWxsc1xyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bUNvbHVtbnM7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBjZWxsID0gbmV3Um93Lmluc2VydENlbGwoKTtcclxuICAgICAgICAgICAgY2VsbC5jb250ZW50RWRpdGFibGUgPSBcInRydWVcIjtcclxuICAgICAgICAgICAgY2VsbC5zZXRBdHRyaWJ1dGUoXCJkYXRhLXBsYWNlaG9sZGVyXCIsIFwiRW50ZXIgdGV4dFwiKTtcclxuICAgICAgICAgICAgLy8gY2VsbC5jbGFzc0xpc3QuYWRkKFwidGVtcG9yYXJ5LXNoYWRvd1wiKTtcclxuICAgICAgICAgICAgYWZmZWN0ZWRDZWxscy5wdXNoKGNlbGwpOyAgLy8gQWRkIGNlbGwgcmVmZXJlbmNlIHRvIGFycmF5XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgYWZmZWN0ZWRDZWxscy5mb3JFYWNoKGNlbGwgPT4gY2VsbC5jbGFzc0xpc3QucmVtb3ZlKFwidGVtcG9yYXJ5LXNoYWRvd1wiKSk7XHJcbiAgICAgICAgfSwgNzAwKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgYWRkQ29sdW1uKHRhYmxlOiBIVE1MVGFibGVFbGVtZW50LCBwb3NpdGlvbjogbnVtYmVyIHwgbnVsbCA9IG51bGwpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBpbnNlcnRQb3NpdGlvbiA9IHBvc2l0aW9uICE9PSBudWxsID8gcG9zaXRpb24gOiB1bmRlZmluZWQ7XHJcbiAgICAgICAgbGV0IGFmZmVjdGVkQ2VsbHMgPSBbXTsgIC8vIEFycmF5IHRvIGhvbGQgcmVmZXJlbmNlcyB0byBuZXcgY2VsbHNcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YWJsZS5yb3dzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNlbGwgPSB0YWJsZS5yb3dzW2ldLmluc2VydENlbGwoaW5zZXJ0UG9zaXRpb24pO1xyXG4gICAgICAgICAgICBjZWxsLmNvbnRlbnRFZGl0YWJsZSA9IFwidHJ1ZVwiO1xyXG4gICAgICAgICAgICBjZWxsLnNldEF0dHJpYnV0ZShcImRhdGEtcGxhY2Vob2xkZXJcIiwgXCJjZWxsXCIpO1xyXG4gICAgICAgICAgICAvLyBjZWxsLmNsYXNzTGlzdC5hZGQoXCJ0ZW1wb3Jhcnktc2hhZG93XCIpO1xyXG4gICAgICAgICAgICBhZmZlY3RlZENlbGxzLnB1c2goY2VsbCk7ICAvLyBBZGQgY2VsbCByZWZlcmVuY2UgdG8gYXJyYXlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBhZmZlY3RlZENlbGxzLmZvckVhY2goY2VsbCA9PiBjZWxsLmNsYXNzTGlzdC5yZW1vdmUoXCJ0ZW1wb3Jhcnktc2hhZG93XCIpKTtcclxuICAgICAgICB9LCA3MDApO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBzdGF0aWMgaXNMYXN0Q29sdW1uKHRhYmxlOiBIVE1MVGFibGVFbGVtZW50LCBjZWxsOiBIVE1MVGFibGVDZWxsRWxlbWVudCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGlmICghdGFibGUuY29udGFpbnMoY2VsbCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgY2VsbFJvdyA9IGNlbGwucGFyZW50RWxlbWVudCBhcyBIVE1MVGFibGVSb3dFbGVtZW50O1xyXG4gICAgICAgIGNvbnN0IGxhc3RDZWxsSW5Sb3cgPSBjZWxsUm93LmNlbGxzW2NlbGxSb3cuY2VsbHMubGVuZ3RoIC0gMV07XHJcbiAgICAgICAgcmV0dXJuIGNlbGwgPT09IGxhc3RDZWxsSW5Sb3c7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGlzTGFzdFJvdyh0YWJsZTogSFRNTFRhYmxlRWxlbWVudCwgY2VsbDogSFRNTFRhYmxlQ2VsbEVsZW1lbnQpOiBib29sZWFuIHtcclxuICAgICAgICBpZiAoIXRhYmxlLmNvbnRhaW5zKGNlbGwpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGNlbGxSb3cgPSBjZWxsLnBhcmVudEVsZW1lbnQgYXMgSFRNTFRhYmxlUm93RWxlbWVudDtcclxuICAgICAgICBjb25zdCBsYXN0Um93SW5UYWJsZSA9IHRhYmxlLnJvd3NbdGFibGUucm93cy5sZW5ndGggLSAxXTtcclxuICAgICAgICByZXR1cm4gY2VsbFJvdyA9PT0gbGFzdFJvd0luVGFibGU7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIHJlbW92ZUNvbHVtbkJ5Q2VsbChjZWxsOiBIVE1MVGFibGVDZWxsRWxlbWVudCk6IHZvaWQge1xyXG4gICAgICAgIGlmIChjZWxsLnRhZ05hbWUudG9Mb3dlckNhc2UoKSAhPT0gXCJ0ZFwiICYmIGNlbGwudGFnTmFtZS50b0xvd2VyQ2FzZSgpICE9PSBcInRoXCIpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHByb3ZpZGVkIGVsZW1lbnQgaXMgbm90IGEgdGFibGUgY2VsbC5cIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCByb3cgPSBjZWxsLnBhcmVudEVsZW1lbnQgYXMgSFRNTFRhYmxlUm93RWxlbWVudDtcclxuICAgICAgICBjb25zdCB0YWJsZSA9IHJvdy5wYXJlbnRFbGVtZW50IGFzIEhUTUxUYWJsZUVsZW1lbnQ7XHJcbiAgICAgICAgY29uc3QgY29sdW1uSW5kZXggPSBjZWxsLmNlbGxJbmRleDtcclxuXHJcbiAgICAgICAgLy8gQWRkIGZhZGUtb3V0IGNsYXNzIHRvIGFsbCBjZWxscyBpbiB0aGUgY29sdW1uXHJcbiAgICAgICAgLy8gZm9yIChsZXQgaSA9IDA7IGkgPCB0YWJsZS5yb3dzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgLy8gICAgIGlmIChjb2x1bW5JbmRleCA8IHRhYmxlLnJvd3NbaV0uY2VsbHMubGVuZ3RoKSB7XHJcbiAgICAgICAgLy8gICAgICAgICB0YWJsZS5yb3dzW2ldLmNlbGxzW2NvbHVtbkluZGV4XS5jbGFzc0xpc3QuYWRkKFwiZmFkZS1vdXRcIik7XHJcbiAgICAgICAgLy8gICAgIH1cclxuICAgICAgICAvLyB9XHJcblxyXG4gICAgICAgIC8vIERlbGF5IHRoZSBjb2x1bW4gcmVtb3ZhbCBmb3IgMzAwIG1pbGxpc2Vjb25kc1xyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhYmxlLnJvd3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKGNvbHVtbkluZGV4IDwgdGFibGUucm93c1tpXS5jZWxscy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgIHRhYmxlLnJvd3NbaV0uZGVsZXRlQ2VsbChjb2x1bW5JbmRleCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIC8vICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhYmxlLnJvd3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAvLyAgICAgICAgIGlmIChjb2x1bW5JbmRleCA8IHRhYmxlLnJvd3NbaV0uY2VsbHMubGVuZ3RoKSB7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgdGFibGUucm93c1tpXS5kZWxldGVDZWxsKGNvbHVtbkluZGV4KTtcclxuICAgICAgICAvLyAgICAgICAgIH1cclxuICAgICAgICAvLyAgICAgfVxyXG4gICAgICAgIC8vIH0sIDkwMCk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIHJlbW92ZVJvd0J5Q2VsbChjZWxsOiBIVE1MVGFibGVDZWxsRWxlbWVudCk6IHZvaWQge1xyXG4gICAgICAgIGlmIChjZWxsLnRhZ05hbWUudG9Mb3dlckNhc2UoKSAhPT0gXCJ0ZFwiICYmIGNlbGwudGFnTmFtZS50b0xvd2VyQ2FzZSgpICE9PSBcInRoXCIpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHByb3ZpZGVkIGVsZW1lbnQgaXMgbm90IGEgdGFibGUgY2VsbC5cIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCByb3cgPSBjZWxsLnBhcmVudEVsZW1lbnQgYXMgSFRNTFRhYmxlUm93RWxlbWVudDtcclxuICAgICAgICBjb25zdCB0YWJsZSA9IHJvdy5wYXJlbnRFbGVtZW50IGFzIEhUTUxUYWJsZUVsZW1lbnQ7XHJcblxyXG4gICAgICAgIC8vIEFkZCBmYWRlLW91dCBjbGFzcyB0byBhbGwgY2VsbHMgaW4gdGhlIHJvd1xyXG4gICAgICAgIC8vIEFycmF5LmZyb20ocm93LmNlbGxzKS5mb3JFYWNoKGNlbGwgPT4ge1xyXG4gICAgICAgIC8vICAgICBjZWxsLmNsYXNzTGlzdC5hZGQoXCJmYWRlLW91dFwiKTtcclxuICAgICAgICAvLyB9KTtcclxuXHJcbiAgICAgICAgLy8gRGVsYXkgdGhlIHJvdyByZW1vdmFsIGZvciAzMDAgbWlsbGlzZWNvbmRzXHJcblxyXG4gICAgICAgIHRhYmxlLmRlbGV0ZVJvdyhyb3cucm93SW5kZXgpO1xyXG5cclxuICAgICAgICAvLyBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAvLyAgICAgdGFibGUuZGVsZXRlUm93KHJvdy5yb3dJbmRleCk7XHJcbiAgICAgICAgLy8gfSwgOTAwKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZ2V0QWN0aXZlVGFibGVDZWxsKCk6IEhUTUxUYWJsZUNlbGxFbGVtZW50IHwgbnVsbCB7XHJcbiAgICAgICAgY29uc3QgYWN0aXZlRWxlbWVudCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XHJcblxyXG4gICAgICAgIGlmIChhY3RpdmVFbGVtZW50Py50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICd0ZCcpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGFjdGl2ZUVsZW1lbnQgYXMgSFRNTFRhYmxlQ2VsbEVsZW1lbnQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gYWN0aXZlRWxlbWVudD8uY2xvc2VzdCgndGQnKSBhcyBIVE1MVGFibGVDZWxsRWxlbWVudCB8fCBudWxsO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvLyBzdGF0aWMgaXNBY3RpdmVDZWxsQmFja2dyb3VuZENvbG9yKHRhcmdldEhleENvbG9yOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIC8vICAgICBjb25zdCBhY3RpdmVDZWxsID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcclxuXHJcbiAgICAvLyAgICAgaWYgKCFhY3RpdmVDZWxsIHx8IGFjdGl2ZUNlbGwudGFnTmFtZSAhPT0gJ1REJyB8fCAhYWN0aXZlQ2VsbC5oYXNBdHRyaWJ1dGUoJ2RhdGEtcGxhY2Vob2xkZXInKSkge1xyXG4gICAgLy8gICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAvLyAgICAgfVxyXG5cclxuICAgIC8vICAgICBjb25zdCBjb21wdXRlZFN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoYWN0aXZlQ2VsbCk7XHJcbiAgICAvLyAgICAgY29uc3QgY3VycmVudEJhY2tncm91bmRDb2xvciA9IGNvbXB1dGVkU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgnYmFja2dyb3VuZC1jb2xvcicpO1xyXG5cclxuICAgIC8vICAgICBjb25zdCBoZXhCYWNrZ3JvdW5kQ29sb3IgPSBVdGlscy5yZ2JUb0hleChjdXJyZW50QmFja2dyb3VuZENvbG9yKTtcclxuXHJcbiAgICAvLyAgICAgcmV0dXJuIGhleEJhY2tncm91bmRDb2xvci50b1VwcGVyQ2FzZSgpID09PSB0YXJnZXRIZXhDb2xvci50b1VwcGVyQ2FzZSgpO1xyXG4gICAgLy8gfVxyXG5cclxuXHJcbiAgICBzdGF0aWMgZ2V0TGFzdFRhYmxlQ2VsbCh0YWJsZTogSFRNTFRhYmxlRWxlbWVudCk6IEhUTUxFbGVtZW50IHwgbnVsbCB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IHRhYmxlLnJvd3MubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICAgICAgY29uc3Qgcm93ID0gdGFibGUucm93c1tpXTtcclxuICAgICAgICAgICAgZm9yIChsZXQgaiA9IHJvdy5jZWxscy5sZW5ndGggLSAxOyBqID49IDA7IGotLSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY2VsbCA9IHJvdy5jZWxsc1tqXTtcclxuICAgICAgICAgICAgICAgIGlmIChjZWxsLmlzQ29udGVudEVkaXRhYmxlKSByZXR1cm4gY2VsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZ2V0Rmlyc3RUYWJsZUNlbGwodGFibGU6IEhUTUxUYWJsZUVsZW1lbnQpOiBIVE1MRWxlbWVudCB8IG51bGwge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFibGUucm93cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCByb3cgPSB0YWJsZS5yb3dzW2ldO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHJvdy5jZWxscy5sZW5ndGg7IGorKykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY2VsbCA9IHJvdy5jZWxsc1tqXTtcclxuICAgICAgICAgICAgICAgIGlmIChjZWxsLmlzQ29udGVudEVkaXRhYmxlKSByZXR1cm4gY2VsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZ2V0TmVpZ2hib3JDZWxsKHRhYmxlOiBIVE1MVGFibGVFbGVtZW50LCBjZWxsOiBIVE1MVGFibGVDZWxsRWxlbWVudCwgZGlyZWN0aW9uOiBEaXJlY3Rpb25zKTogSFRNTFRhYmxlQ2VsbEVsZW1lbnQgfCBudWxsIHtcclxuXHJcbiAgICAgICAgaWYgKCFjZWxsLnBhcmVudEVsZW1lbnQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCByb3dJbmRleCA9IChjZWxsLnBhcmVudEVsZW1lbnQgYXMgSFRNTFRhYmxlUm93RWxlbWVudCkucm93SW5kZXg7XHJcbiAgICAgICAgY29uc3QgY2VsbEluZGV4ID0gY2VsbC5jZWxsSW5kZXg7XHJcblxyXG4gICAgICAgIHN3aXRjaCAoZGlyZWN0aW9uKSB7XHJcbiAgICAgICAgICAgIGNhc2UgRGlyZWN0aW9ucy5BcnJvd1JpZ2h0OlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIChjZWxsLnBhcmVudEVsZW1lbnQgYXMgSFRNTFRhYmxlUm93RWxlbWVudCkuY2VsbHNbY2VsbEluZGV4ICsgMV0gPz8gbnVsbDtcclxuICAgICAgICAgICAgY2FzZSBEaXJlY3Rpb25zLkFycm93TGVmdDpcclxuICAgICAgICAgICAgICAgIHJldHVybiAoY2VsbC5wYXJlbnRFbGVtZW50IGFzIEhUTUxUYWJsZVJvd0VsZW1lbnQpLmNlbGxzW2NlbGxJbmRleCAtIDFdID8/IG51bGw7XHJcbiAgICAgICAgICAgIGNhc2UgRGlyZWN0aW9ucy5BcnJvd1VwOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRhYmxlLnJvd3Nbcm93SW5kZXggLSAxXT8uY2VsbHNbY2VsbEluZGV4XSA/PyBudWxsO1xyXG4gICAgICAgICAgICBjYXNlIERpcmVjdGlvbnMuQXJyb3dEb3duOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRhYmxlLnJvd3Nbcm93SW5kZXggKyAxXT8uY2VsbHNbY2VsbEluZGV4XSA/PyBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHN0YXRpYyBjaGFuZ2VDZWxsQm9yZGVyQ29sb3IoXHJcbiAgICAgICAgdGFibGU6IEhUTUxUYWJsZUVsZW1lbnQsXHJcbiAgICAgICAgc2NvcGU6IFRhYmxlU2NvcGVzLFxyXG4gICAgICAgIGNvbG9yOiBzdHJpbmdcclxuICAgICkge1xyXG4gICAgICAgIGxldCBjZWxsc1RvQ2hhbmdlOiBOb2RlTGlzdE9mPEhUTUxUYWJsZUNlbGxFbGVtZW50PiB8IEhUTUxDb2xsZWN0aW9uT2Y8SFRNTFRhYmxlQ2VsbEVsZW1lbnQ+IHwgbnVsbCA9IG51bGw7XHJcblxyXG4gICAgICAgIHN3aXRjaCAoc2NvcGUpIHtcclxuICAgICAgICAgICAgY2FzZSBUYWJsZVNjb3Blcy5Db2x1bW46XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb2x1bW5JbmRleCA9ICh0YWJsZS5xdWVyeVNlbGVjdG9yKFwidGQuc2VsZWN0ZWRcIikgYXMgSFRNTFRhYmxlQ2VsbEVsZW1lbnQpPy5jZWxsSW5kZXg7XHJcbiAgICAgICAgICAgICAgICBpZiAoY29sdW1uSW5kZXggIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNlbGxzVG9DaGFuZ2UgPSB0YWJsZS5xdWVyeVNlbGVjdG9yQWxsKGB0ZDpudGgtY2hpbGQoJHtjb2x1bW5JbmRleCArIDF9KWApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgVGFibGVTY29wZXMuUm93OlxyXG4gICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRDZWxsID0gdGFibGUucXVlcnlTZWxlY3RvcihcInRkLnNlbGVjdGVkXCIpIGFzIEhUTUxUYWJsZUNlbGxFbGVtZW50O1xyXG4gICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkQ2VsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJvdyA9IHNlbGVjdGVkQ2VsbC5wYXJlbnRFbGVtZW50IGFzIEhUTUxUYWJsZVJvd0VsZW1lbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgY2VsbHNUb0NoYW5nZSA9IHJvdy5jZWxscztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFRhYmxlU2NvcGVzLkNlbGw6XHJcbiAgICAgICAgICAgICAgICBjZWxsc1RvQ2hhbmdlID0gdGFibGUucXVlcnlTZWxlY3RvckFsbChcInRkLnNlbGVjdGVkXCIpIGFzIE5vZGVMaXN0T2Y8SFRNTFRhYmxlQ2VsbEVsZW1lbnQ+O1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgVGFibGVTY29wZXMuU2VsZWN0ZWRDZWxsczpcclxuICAgICAgICAgICAgICAgIGNlbGxzVG9DaGFuZ2UgPSB0YWJsZS5xdWVyeVNlbGVjdG9yQWxsKFwidGQuc2VsZWN0ZWRcIikgYXMgTm9kZUxpc3RPZjxIVE1MVGFibGVDZWxsRWxlbWVudD47XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgc2NvcGUuXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGNlbGxzVG9DaGFuZ2UpIHtcclxuXHJcblxyXG5cclxuICAgICAgICAgICAgQXJyYXkuZnJvbShjZWxsc1RvQ2hhbmdlKS5mb3JFYWNoKChjZWxsKSA9PiB7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gY2VsbC5zdHlsZS5ib3JkZXIgPSBgMXB4IGRvdWJsZSAke2NvbG9yfWA7XHJcbiAgICAgICAgICAgICAgICAvLyBjb25zdCBzdHlsZXMgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShjZWxsKTtcclxuXHJcblxyXG4gICAgICAgICAgICAgICAgY2VsbC5zdHlsZS5ib3JkZXIgPSBgMXB4IGRvdWJsZSAke2NvbG9yfWA7XHJcbiAgICAgICAgICAgICAgICAvLyBjZWxsLnN0eWxlLmJveFNoYWRvdyA9IGAwIDAgMCAxcHggJHtjb2xvcn0gaW5zZXRgO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIGNvbnN0IGJveFNoYWRvdyA9IHN0eWxlcy5nZXRQcm9wZXJ0eVZhbHVlKCdib3gtc2hhZG93Jyk7XHJcbiAgICAgICAgICAgICAgICAvLyBjb25zdCBib3JkZXIgPSBzdHlsZXMuZ2V0UHJvcGVydHlWYWx1ZSgnYm9yZGVyJyk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJiYmJcIik7XHJcbiAgICAgICAgICAgICAgICAvLyBjZWxsLnN0eWxlLmJvcmRlciA9IGJvcmRlcjtcclxuICAgICAgICAgICAgICAgIC8vIGNlbGwuc3R5bGUuYm94U2hhZG93ID0gYm94U2hhZG93O1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdCb3ggU2hhZG93OicsIGJveFNoYWRvdyk7XHJcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnQm9yZGVyOicsIGJvcmRlcik7XHJcblxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG59IiwiaW1wb3J0IHsgRmxvYXRpbmdUb29sYmFyIH0gZnJvbSBcIi4vRmxvYXRpbmdUb29sYmFyXCI7XHJcbmltcG9ydCB7IElGb2N1c1N0YWNrIH0gZnJvbSBcIkAvY29yZS9JRm9jdXNTdGFja1wiO1xyXG5pbXBvcnQgeyBEZXBlbmRlbmN5Q29udGFpbmVyIH0gZnJvbSBcIkAvY29yZS9EZXBlbmRlbmN5Q29udGFpbmVyXCI7XHJcbmltcG9ydCB7IElUYWJsZUNvbnRleHRGbG9hdGluZ1Rvb2xiYXIgfSBmcm9tIFwiLi9JVGFibGVDb250ZXh0RmxvYXRpbmdUb29sYmFyXCI7XHJcbmltcG9ydCB7IFpJbmRleCB9IGZyb20gXCJAL2NvbW1vbi9aSW5kZXhcIjtcclxuaW1wb3J0IHsgRGlyZWN0aW9ucyB9IGZyb20gXCIuLi8uLi9jb21tb24vRGlyZWN0aW9uc1wiO1xyXG5pbXBvcnQgeyBEZWZhdWx0SlNFdmVudHMgfSBmcm9tIFwiLi4vLi4vY29tbW9uL0RlZmF1bHRKU0V2ZW50c1wiO1xyXG5pbXBvcnQgeyBET01FbGVtZW50cyB9IGZyb20gXCIuLi8uLi9jb21tb24vRE9NRWxlbWVudHNcIjtcclxuaW1wb3J0IHsgVGFibGVVdGlscyB9IGZyb20gXCJAL3V0aWxpdGllcy9UYWJsZVV0aWxzXCI7XHJcbmltcG9ydCB7IEtleWJvYXJkS2V5cyB9IGZyb20gXCJAL2NvbW1vbi9LZXlib2FyZEtleXNcIjtcclxuaW1wb3J0IHsgVGV4dENvbnRleHRGbG9hdGluZ1Rvb2xiYXIgfSBmcm9tIFwiLi9UZXh0Q29udGV4dEZsb2F0aW5nVG9vbGJhclwiO1xyXG5pbXBvcnQgeyBTZWxlY3Rpb25Nb2RlcyB9IGZyb20gXCIuL1NlbGVjdGlvbk1vZGVcIjtcclxuaW1wb3J0IHsgQ29sb3JzIH0gZnJvbSBcIkAvY29tbW9uL0NvbG9yc1wiO1xyXG5pbXBvcnQgeyBET01VdGlscyB9IGZyb20gXCJAL3V0aWxpdGllcy9ET01VdGlsc1wiO1xyXG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tIFwiQC9jb21tYW5kcy9FdmVudEVtaXR0ZXJcIjtcclxuaW1wb3J0IHsgSVRhYmxlT3BlcmF0aW9uc1NlcnZpY2UgfSBmcm9tIFwiQC9zZXJ2aWNlcy90YWJsZS1vcGVyYXRpb25zL0lUYWJsZU9wZXJhdGlvbnNTZXJ2aWNlXCI7XHJcbmltcG9ydCB7IEN1c3RvbVVJRXZlbnRzIH0gZnJvbSBcIkAvY29tbW9uL0N1c3RvbVVJRXZlbnRzXCI7XHJcbmltcG9ydCB7IElVSUV2ZW50RGV0YWlsIH0gZnJvbSBcIkAvY29tbWFuZHMvSVVJRXZlbnREZXRhaWxcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBUYWJsZUNvbnRleHRGbG9hdGluZ1Rvb2xiYXIgZXh0ZW5kcyBGbG9hdGluZ1Rvb2xiYXIgaW1wbGVtZW50cyBJVGFibGVDb250ZXh0RmxvYXRpbmdUb29sYmFyIHtcclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBpZDogc3RyaW5nID0gXCJ0YWJsZUZsb2F0aW5nVG9vbGJhclwiO1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IFRhYmxlQ29udGV4dEZsb2F0aW5nVG9vbGJhcjtcclxuXHJcbiAgICBmb2N1c1N0YWNrOiBJRm9jdXNTdGFjaztcclxuICAgIHNlbGVjdGVkQ2VsbHM6IEhUTUxUYWJsZUNlbGxFbGVtZW50W10gPSBbXTtcclxuICAgIGFjdHVhbEZvY3VzZWRDZWxsOiBIVE1MVGFibGVDZWxsRWxlbWVudCB8IG51bGwgPSBudWxsO1xyXG5cclxuICAgIHRhYmxlT3BlcmF0aW9uc1NlcnZpY2U6IElUYWJsZU9wZXJhdGlvbnNTZXJ2aWNlO1xyXG5cclxuXHJcbiAgICBjb250cm9sbGVyOiBBYm9ydENvbnRyb2xsZXI7XHJcblxyXG5cclxuICAgIC8vIFRoZSBzZWxlY3Rpb24gbW9kZSBhbmQgc2VsZWN0aW9uQWN0aXZlRmxhZyB3b3JrIHRvZ2V0aGVyIHdoZW4gd2Ugc3RhcnQgc2VsZWN0aW5nIHRleHQgaW5zaWRlIGEgY2VsbCBvciBwcmVzcyBzaGlmdCB0byBhY3RpdmF0ZSB0aGUgc2VsZWN0aW9uQWN0aXZlRmxhZy5cclxuICAgIC8vIEFmdGVyIGFjdGl2YXRpbmcgdGhlIGZsYWcsIHdlIGNhbiBzZWxlY3QgdGV4dCBpbnNpZGUgYSBjZWxsLiBJZiB3ZSByZWFjaCB0aGUgZW5kIG9mIHRoZSB0ZXh0IGluc2lkZSB0aGUgY2VsbCB1c2luZyBzaGlmdCArIGRpcmVjdGlvbmFsIGtleXMgb3IgcGxhY2UgdGhlIGN1cnNvciBvdXRzaWRlXHJcbiAgICAvLyB0aGUgYWN0aXZlIGNlbGwsIGl0IGluZGljYXRlcyB0aGF0IHdlIHdhbnQgdG8gZW50ZXIgY2VsbCBzZWxlY3Rpb24gbW9kZS4gV2UgY2hhbmdlIHRoZSBzZWxlY3Rpb24gbW9kZSBpbiB0aGVzZSBjYXNlcy5cclxuICAgIHNlbGVjdGlvbk1vZGU6IFNlbGVjdGlvbk1vZGVzID0gU2VsZWN0aW9uTW9kZXMuVGV4dDsgLy8gVGhlIGRlZmF1bHQgc2VsZWN0aW9uIG1vZGVcclxuICAgIHNlbGVjdGlvbkZsYWc6IGJvb2xlYW4gPSBmYWxzZTsgLy8gRmxhZyB0byB0cmFjayB3aGV0aGVyIHRleHQgc2VsZWN0aW9uIGlzIGFjdGl2ZVxyXG4gICAgc2VsZWN0ZWRUZXh0OiBzdHJpbmcgPSBcIlwiOyAvLyBTdG9yYWdlIGZvciB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHRleHRcclxuXHJcbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKGZvY3VzU3RhY2s6IElGb2N1c1N0YWNrLCB0YWJsZU9wZXJhdGlvbnNTZXJ2aWNlOiBJVGFibGVPcGVyYXRpb25zU2VydmljZSkge1xyXG5cclxuICAgICAgICBpZiAoVGFibGVDb250ZXh0RmxvYXRpbmdUb29sYmFyLmluc3RhbmNlKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVzZSBUYWJsZUNvbnRleHRGbG9hdGluZ1Rvb2xiYXIuZ2V0SW5zdGFuY2UoKSB0byBnZXQgaW5zdGFuY2UuXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc3VwZXIoVGFibGVDb250ZXh0RmxvYXRpbmdUb29sYmFyLmlkKTtcclxuICAgICAgICB0aGlzLmNsZWFyQW5kSGlkZSA9IHRoaXMuY2xlYXJBbmRIaWRlLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5zdHlsZS56SW5kZXggPSBaSW5kZXguTW9kZXJhdGVseUltcG9ydGFudDtcclxuICAgICAgICB0aGlzLmNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XHJcbiAgICAgICAgdGhpcy5mb2N1c1N0YWNrID0gZm9jdXNTdGFjaztcclxuICAgICAgICB0aGlzLnRhYmxlT3BlcmF0aW9uc1NlcnZpY2UgPSB0YWJsZU9wZXJhdGlvbnNTZXJ2aWNlO1xyXG5cclxuICAgICAgICB0aGlzLmF0dGFjaEV2ZW50cygpO1xyXG4gICAgfVxyXG5cclxuICAgIGF0dGFjaEV2ZW50cygpOiB2b2lkIHtcclxuICAgICAgICAvLyBNb3VzZSBldmVudHNcclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKERlZmF1bHRKU0V2ZW50cy5Nb3VzZWRvd24sIHRoaXMuaGFuZGxlTW91c2VEb3duLmJpbmQodGhpcykpO1xyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRGVmYXVsdEpTRXZlbnRzLk1vdXNlbW92ZSwgdGhpcy5oYW5kbGVNb3VzZU1vdmUuYmluZCh0aGlzKSk7XHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuTW91c2V1cCwgdGhpcy5oYW5kbGVNb3VzZVVwLmJpbmQodGhpcykpO1xyXG5cclxuICAgICAgICAvLyBLZXlib2FyZCBldmVudHNcclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKERlZmF1bHRKU0V2ZW50cy5LZXlkb3duLCB0aGlzLmhhbmRsZVN0YXJ0U2VsZWN0aW9uSW5DZWxsS2V5RG93bi5iaW5kKHRoaXMpKTtcclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKERlZmF1bHRKU0V2ZW50cy5LZXlkb3duLCB0aGlzLmhhbmRsZUNlbGxTZWxlY3Rpb25Db250aW51YXRpb25PbktleURvd24uYmluZCh0aGlzKSk7XHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuS2V5ZG93biwgdGhpcy5oYW5kbGVLZXlEb3duLmJpbmQodGhpcykpO1xyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRGVmYXVsdEpTRXZlbnRzLktleXVwLCB0aGlzLmhhbmRsZUtleVVwLmJpbmQodGhpcykpO1xyXG5cclxuICAgICAgICB0aGlzLmF0dGFjaFVJRXZlbnQoKTtcclxuXHJcbiAgICAgICAgc3VwZXIuYXR0YWNoRXZlbnRzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBoYW5kbGVNb3VzZURvd24oZXZlbnQ6IE1vdXNlRXZlbnQpIHtcclxuXHJcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgIGNvbnN0IGNlbGwgPSB0YXJnZXQuY2xvc2VzdChET01FbGVtZW50cy5URCkgYXMgSFRNTFRhYmxlQ2VsbEVsZW1lbnQ7XHJcblxyXG4gICAgICAgIGlmIChjZWxsKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiTW91c2VEb3duIGV2ZW50IG9uOiBcIiwgZXZlbnQudGFyZ2V0KTtcclxuXHJcbiAgICAgICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLmFib3J0KCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoY2VsbCAhPSB0aGlzLmFjdHVhbEZvY3VzZWRDZWxsKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhpZGUoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5jbGVhckFsbCgpO1xyXG4gICAgICAgICAgICB0aGlzLmFkZFNlbGVjdGVkQ2VsbChjZWxsKTtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25GbGFnID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25Nb2RlID0gU2VsZWN0aW9uTW9kZXMuVGV4dDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBoYW5kbGVNb3VzZU1vdmUoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcclxuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25GbGFnKSB7XHJcblxyXG4gICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGNlbGwgPSB0YXJnZXQuY2xvc2VzdChET01FbGVtZW50cy5URCkgYXMgSFRNTFRhYmxlQ2VsbEVsZW1lbnQ7XHJcblxyXG4gICAgICAgICAgICBpZiAoY2VsbCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVTZWxlY3Rpb25Nb2RlQnlNb3VzZUV2ZW50KGV2ZW50KTtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT0gU2VsZWN0aW9uTW9kZXMuQ2VsbCkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jYW5IaWRlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRTZWxlY3RlZENlbGwoY2VsbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0U2VsZWN0aW9uKCk/LnJlbW92ZUFsbFJhbmdlcygpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaGFuZGxlTW91c2VVcChldmVudDogTW91c2VFdmVudCkge1xyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkQ2VsbHMubGVuZ3RoID4gMCAmJiB0aGlzLnNlbGVjdGlvbkZsYWcpIHtcclxuICAgICAgICAgICAgdGhpcy5yZXNldFNlbGVjdGlvblN0YXRlKCk7XHJcbiAgICAgICAgICAgIHRoaXMuc2hvdygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGhhbmRsZUtleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcclxuXHJcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgIGNvbnN0IGN1cnJlbnRDZWxsID0gdGFyZ2V0LmNsb3Nlc3QoRE9NRWxlbWVudHMuVEQpIGFzIEhUTUxUYWJsZUNlbGxFbGVtZW50O1xyXG5cclxuICAgICAgICBpZiAoY3VycmVudENlbGwpIHtcclxuXHJcbiAgICAgICAgICAgIGlmIChldmVudC5rZXkgPT0gS2V5Ym9hcmRLZXlzLkVudGVyICYmICFldmVudC5zaGlmdEtleSAmJiAhZXZlbnQuY3RybEtleSAmJiAhZXZlbnQubWV0YUtleSAmJiAhZXZlbnQuYWx0S2V5KSB7XHJcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgIC8vIGFsZXJ0KFwianVtcCB0byBuZXh0IGxpbmVcIik7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09IEtleWJvYXJkS2V5cy5Fc2NhcGUgJiYgdGhpcy5jYW5IaWRlICYmICFUZXh0Q29udGV4dEZsb2F0aW5nVG9vbGJhci5nZXRJbnN0YW5jZSgpLmlzVmlzaWJsZSkge1xyXG5cclxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNhbkhpZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJBbGwoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWRlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSwgMTApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaGFuZGxlU3RhcnRTZWxlY3Rpb25JbkNlbGxLZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XHJcblxyXG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICBjb25zdCBjdXJyZW50Q2VsbCA9IHRhcmdldC5jbG9zZXN0KERPTUVsZW1lbnRzLlREKSBhcyBIVE1MVGFibGVDZWxsRWxlbWVudDtcclxuXHJcbiAgICAgICAgaWYgKGN1cnJlbnRDZWxsKSB7XHJcbiAgICAgICAgICAgIGlmICghZXZlbnQucmVwZWF0ICYmIGV2ZW50LmtleSA9PT0gS2V5Ym9hcmRLZXlzLlNoaWZ0KSB7XHJcblxyXG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLmFib3J0KCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbkZsYWcgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25Nb2RlID0gU2VsZWN0aW9uTW9kZXMuVGV4dDtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWRkU2VsZWN0ZWRDZWxsKGN1cnJlbnRDZWxsKTtcclxuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBoYW5kbGVDZWxsU2VsZWN0aW9uQ29udGludWF0aW9uT25LZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XHJcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uRmxhZykge1xyXG4gICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRDZWxsID0gdGFyZ2V0LmNsb3Nlc3QoRE9NRWxlbWVudHMuVEQpIGFzIEhUTUxUYWJsZUNlbGxFbGVtZW50O1xyXG5cclxuICAgICAgICAgICAgaWYgKGN1cnJlbnRDZWxsKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlID09IFNlbGVjdGlvbk1vZGVzLkNlbGwgJiYgZXZlbnQuc2hpZnRLZXkgJiYgZXZlbnQua2V5LnN0YXJ0c1dpdGgoJ0Fycm93JykgJiYgIWV2ZW50LnJlcGVhdCkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB0YWJsZSA9IGN1cnJlbnRDZWxsLmNsb3Nlc3QoRE9NRWxlbWVudHMuVEFCTEUpITtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXh0Q2VsbCA9IFRhYmxlVXRpbHMuZ2V0TmVpZ2hib3JDZWxsKHRhYmxlLCBjdXJyZW50Q2VsbCwgZXZlbnQua2V5IGFzIERpcmVjdGlvbnMpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZFNlbGVjdGVkQ2VsbChjdXJyZW50Q2VsbCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXh0Q2VsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZFNlbGVjdGVkQ2VsbChuZXh0Q2VsbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG5vcm1hbGl6ZVRleHQodGV4dDogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRleHRcclxuICAgICAgICAgICAgLnJlcGxhY2UoL1xccysvZywgJyAnKVxyXG4gICAgICAgICAgICAudHJpbSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgKiBVcGRhdGVzIHRoZSBzZWxlY3Rpb24gbW9kZSBieSBjb21wYXJpbmcgdGhlIGN1cnJlbnQgdGV4dCBzZWxlY3Rpb24gZnJvbSB0aGUgZG9jdW1lbnRcclxuICAgICogd2l0aCB0aGUgc3RvcmVkIHNlbGVjdGVkIHRleHQuIElmIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBtYXRjaGVzIHRoZSBwcmV2aW91c2x5IHN0b3JlZFxyXG4gICAgKiBzZWxlY3Rpb24sIGl0IHN3aXRjaGVzIHRoZSBzZWxlY3Rpb24gbW9kZSB0byBjZWxsIHNlbGVjdGlvbiBhbmQgcmVzZXRzIHRoZSBzZWxlY3RlZCB0ZXh0LlxyXG4gICAgKiBJZiB0aGVyZSBpcyBhIG5ldyBzZWxlY3Rpb24gKGFjdHVhbFNlbGVjdGlvbiBpcyBub3QgZW1wdHkpLCBpdCB1cGRhdGVzIHRoZSBzdG9yZWQgc2VsZWN0ZWQgdGV4dFxyXG4gICAgKiB0byByZWZsZWN0IHRoZSBjdXJyZW50IHNlbGVjdGlvbi5cclxuICAgICpcclxuICAgICovXHJcbiAgICBwcml2YXRlIHVwZGF0ZVRoZVNlbGVjdGlvbk1vZGVCeUN1cnJlbnRTZWxlY3Rpb25TdGF0ZShldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbkZsYWcpIHtcclxuICAgICAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gZG9jdW1lbnQuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgICAgICAgICAgIGlmIChzZWxlY3Rpb24pIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGFjdHVhbFNlbGVjdGlvbiA9IHRoaXMubm9ybWFsaXplVGV4dChzZWxlY3Rpb24udG9TdHJpbmcoKS50cmltKCkpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudENlbGwgPSB0YXJnZXQuY2xvc2VzdChET01FbGVtZW50cy5URCkgYXMgSFRNTFRhYmxlQ2VsbEVsZW1lbnQ7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50Q2VsbFRleHQgPSB0aGlzLm5vcm1hbGl6ZVRleHQoKGN1cnJlbnRDZWxsLnRleHRDb250ZW50IHx8IFwiXCIpLnRyaW0oKSk7XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgeyBhdFN0YXJ0LCBhdEVuZCB9ID0gRE9NVXRpbHMuZ2V0U2VsZWN0aW9uVGV4dEluZm8oY3VycmVudENlbGwpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIFRoaXMgaW50ZXJhY3Rpb24ga2VlcHMgdGhlIG1lbnUgdmlzaWJsZSBhZnRlciBhbGwgdGV4dCBpcyBzZWxlY3RlZCwgZW5oYW5jaW5nIHVzZXIgZW5nYWdlbWVudC4gXHJcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgdXNlciBwcmVzc2VzIGEgZGlyZWN0aW9uYWwga2V5IGFnYWluIGJleW9uZCB0aGlzIHBvaW50LCB0aGUgbWVudSBpcyBoaWRkZW4gYW5kIGNlbGwgc2VsZWN0aW9uIG1vZGUgaXMgaW5pdGlhdGVkLCBcclxuICAgICAgICAgICAgICAgIC8vIHN0cmVhbWxpbmluZyB0aGUgaW50ZXJmYWNlIGFuZCBmb2N1c2luZyBvbiBzdWJzZXF1ZW50IHRhc2tzLlxyXG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRDZWxsVGV4dCA9PT0gXCJcIiB8fCAoYWN0dWFsU2VsZWN0aW9uID09PSB0aGlzLnNlbGVjdGVkVGV4dC50cmltKCkgJiYgKGF0U3RhcnQgfHwgYXRFbmQpKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uTW9kZSA9IFNlbGVjdGlvbk1vZGVzLkNlbGw7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFRleHQgPSBcIlwiO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNhbkhpZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWRlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhY3R1YWxTZWxlY3Rpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkVGV4dCA9IGFjdHVhbFNlbGVjdGlvbjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBwcml2YXRlIHVwZGF0ZVRoZVNlbGVjdGlvbk1vZGVCeUN1cnJlbnRTZWxlY3Rpb25TdGF0ZShldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xyXG4gICAgLy8gICAgIC8vIENoZWNrIGlmIHRoZSBzZWxlY3Rpb24gZmxhZyBpcyBzZXQsIGluZGljYXRpbmcgdGhhdCBzZWxlY3Rpb24gdXBkYXRlcyBzaG91bGQgYmUgbW9uaXRvcmVkXHJcbiAgICAvLyAgICAgaWYgKHRoaXMuc2VsZWN0aW9uRmxhZykge1xyXG4gICAgLy8gICAgICAgICAvLyBHZXQgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGZyb20gdGhlIGRvY3VtZW50XHJcbiAgICAvLyAgICAgICAgIGNvbnN0IGFjdHVhbFNlbGVjdGlvbiA9IHRoaXMubm9ybWFsaXplVGV4dChkb2N1bWVudC5nZXRTZWxlY3Rpb24oKT8udG9TdHJpbmcoKS50cmltKCkgfHwgXCJcIik7XHJcblxyXG4gICAgLy8gICAgICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAvLyAgICAgICAgIGNvbnN0IGN1cnJlbnRDZWxsID0gdGFyZ2V0LmNsb3Nlc3QoRE9NRWxlbWVudHMuVEQpIGFzIEhUTUxUYWJsZUNlbGxFbGVtZW50O1xyXG5cclxuICAgIC8vICAgICAgICAgY29uc3QgY3VycmVudENlbGxUZXh0ID0gdGhpcy5ub3JtYWxpemVUZXh0KChjdXJyZW50Q2VsbC50ZXh0Q29udGVudCB8fCBcIlwiKS50cmltKCkpO1xyXG5cclxuICAgIC8vICAgICAgICAgbGV0IGlzVGhlRW5kOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLy8gICAgICAgICBpZiAoYWN0dWFsU2VsZWN0aW9uKSB7XHJcbiAgICAvLyAgICAgICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSBkb2N1bWVudC5nZXRTZWxlY3Rpb24oKTtcclxuICAgIC8vICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGlvblJhbmdlID0gc2VsZWN0aW9uPy5nZXRSYW5nZUF0KDApO1xyXG5cclxuICAgIC8vICAgICAgICAgICAgIGlmIChzZWxlY3Rpb25SYW5nZSkge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGlvblN0YXJ0T2Zmc2V0ID0gc2VsZWN0aW9uUmFuZ2Uuc3RhcnRPZmZzZXQ7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0aW9uRW5kT2Zmc2V0ID0gc2VsZWN0aW9uUmFuZ2UuZW5kT2Zmc2V0O1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIGNvbnN0IGNlbGxUZXh0TGVuZ3RoID0gY3VycmVudENlbGxUZXh0Lmxlbmd0aDtcclxuXHJcbiAgICAvLyAgICAgICAgICAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gRGlyZWN0aW9ucy5BcnJvd1JpZ2h0IHx8IGV2ZW50LmtleSA9PT0gRGlyZWN0aW9ucy5BcnJvd0Rvd24pIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgLy8gQ29uc2lkZXIgdGhlIGNhcmV0IGJlaW5nIGF0IHRoZSBlbmQgb2YgdGhlIGNlbGwgdGV4dFxyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICBpc1RoZUVuZCA9IHNlbGVjdGlvbkVuZE9mZnNldCA+PSBjZWxsVGV4dExlbmd0aDtcclxuICAgIC8vICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gRGlyZWN0aW9ucy5BcnJvd0xlZnQgfHwgZXZlbnQua2V5ID09PSBEaXJlY3Rpb25zLkFycm93VXApIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgLy8gQ29uc2lkZXIgdGhlIGNhcmV0IGJlaW5nIGF0IHRoZSBzdGFydCBvZiB0aGUgY2VsbCB0ZXh0XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIGlzVGhlRW5kID0gc2VsZWN0aW9uU3RhcnRPZmZzZXQgPT09IDA7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICB9XHJcblxyXG4gICAgLy8gICAgICAgICAvLyBDaGVjayBpZiB0aGUgY3VycmVudCBzZWxlY3Rpb24gbWF0Y2hlcyB0aGUgc3RvcmVkIHNlbGVjdGVkIHRleHRcclxuICAgIC8vICAgICAgICAgaWYgKGN1cnJlbnRDZWxsVGV4dCA9PT0gXCJcIiB8fCAoYWN0dWFsU2VsZWN0aW9uID09PSB0aGlzLnNlbGVjdGVkVGV4dC50cmltKCkgJiYgaXNUaGVFbmQpKSB7XHJcbiAgICAvLyAgICAgICAgICAgICAvLyBJZiB0aGV5IGFyZSB0aGUgc2FtZSwgaXQgaW5kaWNhdGVzIHRoYXQgdGhlIHNlbGVjdGlvbiBoYXNuJ3QgY2hhbmdlZCxcclxuICAgIC8vICAgICAgICAgICAgIC8vIHNvIHN3aXRjaCB0byBjZWxsIHNlbGVjdGlvbiBtb2RlIGFuZCByZXNldCB0aGUgc3RvcmVkIHRleHRcclxuICAgIC8vICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uTW9kZSA9IFNlbGVjdGlvbk1vZGVzLkNlbGw7XHJcbiAgICAvLyAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkVGV4dCA9IFwiXCI7XHJcbiAgICAvLyAgICAgICAgIH0gZWxzZSBpZiAoYWN0dWFsU2VsZWN0aW9uKSB7XHJcbiAgICAvLyAgICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBhIG5ldyBzZWxlY3Rpb24sIHVwZGF0ZSB0aGUgc3RvcmVkIHNlbGVjdGVkIHRleHQgdG8gdGhlIG5ldyB2YWx1ZVxyXG4gICAgLy8gICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFRleHQgPSBhY3R1YWxTZWxlY3Rpb247XHJcbiAgICAvLyAgICAgICAgIH1cclxuICAgIC8vICAgICB9XHJcbiAgICAvLyB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAqIFVwZGF0ZXMgdGhlIHNlbGVjdGlvbiBtb2RlIGJhc2VkIG9uIHRoZSBjdXJyZW50IG1vdXNlIHBvc2l0aW9uIHJlbGF0aXZlIHRvIHRoZSBhY3R1YWwgZm9jdXNlZCBjZWxsLlxyXG4gICAgKiBUaGlzIGZ1bmN0aW9uIGNoZWNrcyBpZiB0aGUgbW91c2UgaXMgb3V0c2lkZSB0aGUgYm91bmRzIG9mIHRoZSBmb2N1c2VkIGNlbGwsIGFuZCBpZiBzbywgc3dpdGNoZXMgdGhlXHJcbiAgICAqIHNlbGVjdGlvbiBtb2RlIHRvIGNlbGwgc2VsZWN0aW9uIG1vZGUuXHJcbiAgICAqIFxyXG4gICAgKiBAcGFyYW0ge01vdXNlRXZlbnR9IGV2ZW50IC0gVGhlIG1vdXNlIGV2ZW50IHRoYXQgdHJpZ2dlcnMgdGhpcyBmdW5jdGlvbiwgdHlwaWNhbGx5IGludm9sdmluZyBtb3VzZSBtb3ZlbWVudC5cclxuICAgICovXHJcbiAgICBwcml2YXRlIHVwZGF0ZVNlbGVjdGlvbk1vZGVCeU1vdXNlRXZlbnQoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uRmxhZyAmJiB0aGlzLmFjdHVhbEZvY3VzZWRDZWxsKSB7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBjZWxsUmVjdCA9IHRoaXMuYWN0dWFsRm9jdXNlZENlbGwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBtb3VzZVggPSBldmVudC5jbGllbnRYO1xyXG4gICAgICAgICAgICBjb25zdCBtb3VzZVkgPSBldmVudC5jbGllbnRZO1xyXG5cclxuICAgICAgICAgICAgaWYgKCEobW91c2VYID49IGNlbGxSZWN0LmxlZnQgJiYgbW91c2VYIDw9IGNlbGxSZWN0LnJpZ2h0ICYmIG1vdXNlWSA+PSBjZWxsUmVjdC50b3AgJiYgbW91c2VZIDw9IGNlbGxSZWN0LmJvdHRvbSkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uTW9kZSA9IFNlbGVjdGlvbk1vZGVzLkNlbGw7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jYW5IaWRlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWRlKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBoYW5kbGVLZXlVcChldmVudDogS2V5Ym9hcmRFdmVudCkge1xyXG5cclxuICAgICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgY29uc3QgY3VycmVudENlbGwgPSB0YXJnZXQuY2xvc2VzdChET01FbGVtZW50cy5URCkgYXMgSFRNTFRhYmxlQ2VsbEVsZW1lbnQ7XHJcblxyXG4gICAgICAgIGlmIChjdXJyZW50Q2VsbCkge1xyXG5cclxuICAgICAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVRoZVNlbGVjdGlvbk1vZGVCeUN1cnJlbnRTZWxlY3Rpb25TdGF0ZShldmVudCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoZXZlbnQua2V5ID09PSBLZXlib2FyZEtleXMuU2hpZnQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVzZXRTZWxlY3Rpb25TdGF0ZSgpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGVkQ2VsbHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2hvdygpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYWRkU2VsZWN0ZWRDZWxsKGNlbGw6IEhUTUxUYWJsZUNlbGxFbGVtZW50KSB7XHJcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRDZWxscy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZENlbGxzLnB1c2goY2VsbCk7XHJcbiAgICAgICAgICAgIGNlbGwuY2xhc3NMaXN0LmFkZCgnc2VsZWN0ZWQnKTtcclxuXHJcbiAgICAgICAgICAgIC8vQ2hhbmdlIHRoZSBhY3R1YWwgZm9jdXNlZCBjZWxsIG9ubHkgaWYgYXQgc2FtZSB0YWJsZVxyXG4gICAgICAgICAgICB0aGlzLmFjdHVhbEZvY3VzZWRDZWxsID0gY2VsbDtcclxuICAgICAgICAgICAgY2VsbC5mb2N1cygpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgbGFzdFNlbGVjdGVkQ2VsbCA9IHRoaXMuc2VsZWN0ZWRDZWxsc1t0aGlzLnNlbGVjdGVkQ2VsbHMubGVuZ3RoIC0gMV07XHJcbiAgICAgICAgICAgIGNvbnN0IGxhc3RTZWxlY3RlZENlbGxUYWJsZSA9IGxhc3RTZWxlY3RlZENlbGwuY2xvc2VzdCgndGFibGUnKTtcclxuICAgICAgICAgICAgY29uc3QgY3VycmVudENlbGxUYWJsZSA9IGNlbGwuY2xvc2VzdCgndGFibGUnKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChsYXN0U2VsZWN0ZWRDZWxsVGFibGUgPT09IGN1cnJlbnRDZWxsVGFibGUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5zZWxlY3RlZENlbGxzLmluZGV4T2YoY2VsbCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZENlbGxzLnB1c2goY2VsbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY2VsbC5jbGFzc0xpc3QuYWRkKCdzZWxlY3RlZCcpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAvL0NoYW5nZSB0aGUgYWN0dWFsIGZvY3VzZWQgY2VsbCBvbmx5IGlmIGF0IHNhbWUgdGFibGVcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdHVhbEZvY3VzZWRDZWxsID0gY2VsbDtcclxuICAgICAgICAgICAgICAgICAgICBjZWxsLmZvY3VzKCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vQ2VsdWxhIGrDoSBmYXogcGFydGUgZGEgbGlzdGEgYXBlbmFzIGZvY2EgZSBjb250aW51YVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0dWFsRm9jdXNlZENlbGwgPSBjZWxsO1xyXG4gICAgICAgICAgICAgICAgICAgIGNlbGwuZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG5cclxuICAgIGF0dGFjaFVJRXZlbnQoKSB7XHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihDdXN0b21VSUV2ZW50cy5DbG9zZUVsZW1lbnQsIHRoaXMuaGFuZGxlQ2xvc2VFbGVtZW50RXZlbnQuYmluZCh0aGlzKSk7XHJcbiAgICB9XHJcblxyXG4gICAgaGFuZGxlQ2xvc2VFbGVtZW50RXZlbnQoZXZlbnQ6IEV2ZW50KSB7XHJcblxyXG4gICAgICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gZXZlbnQgYXMgQ3VzdG9tRXZlbnQ8SVVJRXZlbnREZXRhaWw+O1xyXG4gICAgICAgIGNvbnN0IGRldGFpbHMgPSBjdXN0b21FdmVudC5kZXRhaWw7XHJcblxyXG4gICAgICAgIGlmIChUYWJsZUNvbnRleHRGbG9hdGluZ1Rvb2xiYXIuaWQgPT0gZGV0YWlscy50YXJnZXRJZCEpIHtcclxuICAgICAgICAgICAgdGhpcy5jbGVhckFuZEhpZGUoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc2hvdygpOiB2b2lkIHtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLmFjdHVhbEZvY3VzZWRDZWxsKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ05vIGZvY3VzZWQgY2VsbCBmb3VuZCcpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnJlc2V0QWJvcnRDb250cm9sbGVyKCk7XHJcbiAgICAgICAgdGhpcy5mb2N1c1N0YWNrLnB1c2godGhpcy5hY3R1YWxGb2N1c2VkQ2VsbCk7XHJcbiAgICAgICAgdGhpcy5jaGFuZ2VUb29sYmFyUG9zaXRpb25Ub0JlQ2xvc2VkVG8odGhpcy5hY3R1YWxGb2N1c2VkQ2VsbCk7XHJcbiAgICAgICAgdGhpcy5wcm9jZXNzU2VsZWN0aW9uQ2hhbmdlRWZmZWN0cygpO1xyXG5cclxuICAgICAgICBzdXBlci5zaG93KCk7XHJcblxyXG4gICAgICAgIHRoaXMuYWN0dWFsRm9jdXNlZENlbGwuYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuQmx1ciwgdGhpcy5jbGVhckFuZEhpZGUsIHsgc2lnbmFsOiB0aGlzLmNvbnRyb2xsZXIuc2lnbmFsIH0pO1xyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gICAgLy8gZXhlY0NlbGxCYWNrZ3JvdW5kQ29sb3IodmFsdWU6IHN0cmluZyk6IHZvaWQge1xyXG5cclxuICAgIC8vICAgICB0aGlzLm1lbWVudG8uc2F2ZVN0YXRlKCk7XHJcblxyXG4gICAgLy8gICAgIEV2ZW50RW1pdHRlci5lbWl0UmVzZXRBY3RpdmVCdXR0b25zRWxlbWVudEV2ZW50KFwiYmFja2dyb3VuZENvbG9yXCIpO1xyXG5cclxuICAgIC8vICAgICBjb25zdCBhY3RpdmVDZWxsID0gVGFibGVVdGlscy5nZXRBY3RpdmVUYWJsZUNlbGwoKTtcclxuXHJcbiAgICAvLyAgICAgaWYgKGFjdGl2ZUNlbGwpIHtcclxuICAgIC8vICAgICAgICAgY29uc3QgdGFibGUgPSBhY3RpdmVDZWxsLmNsb3Nlc3QoJ3RhYmxlJykhO1xyXG5cclxuICAgIC8vICAgICAgICAgY29uc3Qgc2VsZWN0ZWRDZWxscyA9IHRhYmxlLnF1ZXJ5U2VsZWN0b3JBbGwoJ3RkLnNlbGVjdGVkJyk7XHJcblxyXG4gICAgLy8gICAgICAgICBzZWxlY3RlZENlbGxzLmZvckVhY2goY2VsbCA9PiB7XHJcbiAgICAvLyAgICAgICAgICAgICAoY2VsbCBhcyBIVE1MRWxlbWVudCkuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gdmFsdWU7XHJcbiAgICAvLyAgICAgICAgIH0pO1xyXG5cclxuICAgIC8vICAgICAgICAgRXZlbnRFbWl0dGVyLmVtaXRTaG93SGlkZUFjdGl2ZUVsZW1lbnRFdmVudChcImJhY2tncm91bmRDb2xvclwiLCB2YWx1ZSwgXCJzaG93XCIpO1xyXG5cclxuICAgIC8vICAgICB9IGVsc2Uge1xyXG4gICAgLy8gICAgICAgICBjb25zb2xlLmVycm9yKFwiY2VsbCBub3QgZm91bmRcIik7XHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gfVxyXG5cclxuICAgIHByb2Nlc3NTZWxlY3Rpb25DaGFuZ2VFZmZlY3RzKCkge1xyXG5cclxuICAgICAgICBFdmVudEVtaXR0ZXIuZW1pdFJlc2V0QWN0aXZlQnV0dG9uc0VsZW1lbnRFdmVudChcImJhY2tncm91bmRDb2xvclwiKTtcclxuXHJcbiAgICAgICAgY29uc3QgYmFja2dyb3VuZENvbG9yczogeyBba2V5OiBzdHJpbmddOiBib29sZWFuIH0gPSB7fTtcclxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3JzW0NvbG9ycy5CYWNrZ3JvdW5kQ29sb3JSZWRdID0gdGhpcy50YWJsZU9wZXJhdGlvbnNTZXJ2aWNlLnF1ZXJ5QWxsU3RhdGVDZWxsQmFja2dyb3VuZENvbG9yKHRoaXMuc2VsZWN0ZWRDZWxscywgQ29sb3JzLkJhY2tncm91bmRDb2xvclJlZCk7XHJcbiAgICAgICAgYmFja2dyb3VuZENvbG9yc1tDb2xvcnMuQmFja2dyb3VuZENvbG9yR3JlZW5dID0gdGhpcy50YWJsZU9wZXJhdGlvbnNTZXJ2aWNlLnF1ZXJ5QWxsU3RhdGVDZWxsQmFja2dyb3VuZENvbG9yKHRoaXMuc2VsZWN0ZWRDZWxscywgQ29sb3JzLkJhY2tncm91bmRDb2xvckdyZWVuKTtcclxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3JzW0NvbG9ycy5CYWNrZ3JvdW5kQ29sb3JCbHVlXSA9IHRoaXMudGFibGVPcGVyYXRpb25zU2VydmljZS5xdWVyeUFsbFN0YXRlQ2VsbEJhY2tncm91bmRDb2xvcih0aGlzLnNlbGVjdGVkQ2VsbHMsIENvbG9ycy5CYWNrZ3JvdW5kQ29sb3JCbHVlKTtcclxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3JzW0NvbG9ycy5CYWNrZ3JvdW5kQ29sb3JZZWxsb3ddID0gdGhpcy50YWJsZU9wZXJhdGlvbnNTZXJ2aWNlLnF1ZXJ5QWxsU3RhdGVDZWxsQmFja2dyb3VuZENvbG9yKHRoaXMuc2VsZWN0ZWRDZWxscywgQ29sb3JzLkJhY2tncm91bmRDb2xvclllbGxvdyk7XHJcbiAgICAgICAgYmFja2dyb3VuZENvbG9yc1tDb2xvcnMuQmFja2dyb3VuZENvbG9yR3JleV0gPSB0aGlzLnRhYmxlT3BlcmF0aW9uc1NlcnZpY2UucXVlcnlBbGxTdGF0ZUNlbGxCYWNrZ3JvdW5kQ29sb3IodGhpcy5zZWxlY3RlZENlbGxzLCBDb2xvcnMuQmFja2dyb3VuZENvbG9yR3JleSk7XHJcblxyXG4gICAgICAgIE9iamVjdC5lbnRyaWVzKGJhY2tncm91bmRDb2xvcnMpLmZvckVhY2goKFtjb2xvciwgYWN0aXZlXSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoYWN0aXZlKSB7XHJcbiAgICAgICAgICAgICAgICBFdmVudEVtaXR0ZXIuZW1pdFNob3dIaWRlQWN0aXZlRWxlbWVudEV2ZW50KFwiYmFja2dyb3VuZENvbG9yXCIsIGNvbG9yLCBcInNob3dcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy8gcmVzZXRDaGVja2VkQ29sb3IoKSB7XHJcblxyXG4gICAgLy8gICAgIGNvbnN0IGRyb3Bkb3duQ29sb3IgPSB0aGlzLmRyb3Bkb3ducy5maW5kKGUgPT4gZS5pZCA9PSBcInRhYmxlQ29sb3JPcHRpb25zTWVudVwiKSE7XHJcblxyXG4gICAgLy8gICAgIGRyb3Bkb3duQ29sb3IuZHJvcGRvd25MaXN0LmRyb3Bkb3duSXRlbXMuZm9yRWFjaChpdGVtID0+IHtcclxuXHJcbiAgICAvLyAgICAgICAgIGl0ZW0ucmVzZXRBY3RpdmVJY29uKCk7XHJcbiAgICAvLyAgICAgfSk7XHJcblxyXG4gICAgLy8gICAgIGRyb3Bkb3duQ29sb3IuZHJvcGRvd25MaXN0LmRyb3Bkb3duSXRlbXMuZm9yRWFjaChpdGVtID0+IHtcclxuXHJcbiAgICAvLyAgICAgICAgIGNvbnN0IGNvbG9yID0gaXRlbS5nZXRMZWZ0SWNvbkJhY2tncm91bmRDb2xvcigpO1xyXG5cclxuICAgIC8vICAgICAgICAgaWYgKGNvbG9yICYmIHRoaXMuYXJlQWxsU2VsZWN0ZWRDZWxsc1NhbWVCZ0NvbG9yKGNvbG9yKSAmJiBjb2xvciAhPSBcInRyYW5zcGFyZW50XCIpIHtcclxuICAgIC8vICAgICAgICAgICAgIGl0ZW0uY2hhbmdlQWN0aXZlSWNvblRvVmlzaWJsZSgpO1xyXG4gICAgLy8gICAgICAgICB9XHJcbiAgICAvLyAgICAgfSk7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgY2hhbmdlVG9vbGJhclBvc2l0aW9uVG9CZUNsb3NlZFRvKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgcmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcblxyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcclxuXHJcbiAgICAgICAgY29uc3QgZWxlbWVudFdpZHRoID0gdGhpcy5odG1sRWxlbWVudC5vZmZzZXRXaWR0aDtcclxuICAgICAgICBsZXQgbGVmdFBvc2l0aW9uID0gcmVjdC5sZWZ0ICsgd2luZG93LnNjcm9sbFggKyAwO1xyXG5cclxuICAgICAgICBpZiAobGVmdFBvc2l0aW9uICsgZWxlbWVudFdpZHRoID4gd2luZG93LmlubmVyV2lkdGgpIHtcclxuICAgICAgICAgICAgbGVmdFBvc2l0aW9uID0gd2luZG93LmlubmVyV2lkdGggLSBlbGVtZW50V2lkdGggLSAyMDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGVsZW1lbnRIZWlnaHQgPSB0aGlzLmh0bWxFbGVtZW50Lm9mZnNldEhlaWdodDtcclxuICAgICAgICBsZXQgdG9wUG9zaXRpb24gPSByZWN0LnRvcCArIHdpbmRvdy5zY3JvbGxZIC0gZWxlbWVudEhlaWdodCAtIDEwO1xyXG5cclxuICAgICAgICBpZiAodG9wUG9zaXRpb24gPCAwKSB7XHJcbiAgICAgICAgICAgIHRvcFBvc2l0aW9uID0gcmVjdC5ib3R0b20gKyB3aW5kb3cuc2Nyb2xsWSArIDEwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5zdHlsZS5sZWZ0ID0gYCR7bGVmdFBvc2l0aW9ufXB4YDtcclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLnRvcCA9IGAke3RvcFBvc2l0aW9ufXB4YDtcclxuICAgIH1cclxuXHJcbiAgICByZXNldFNlbGVjdGlvblN0YXRlKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uTW9kZSA9IFNlbGVjdGlvbk1vZGVzLlRleHQ7XHJcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25GbGFnID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZFRleHQgPSBcIlwiO1xyXG4gICAgfVxyXG5cclxuICAgIGNsZWFyQWxsKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuYWN0dWFsRm9jdXNlZENlbGwgPSBudWxsO1xyXG4gICAgICAgIGNvbnN0IGFsbFRhYmxlQ2VsbHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCd0ZCcpO1xyXG4gICAgICAgIGFsbFRhYmxlQ2VsbHMuZm9yRWFjaChjZWxsID0+IGNlbGwuY2xhc3NMaXN0LnJlbW92ZSgnc2VsZWN0ZWQnKSk7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZENlbGxzID0gW107XHJcbiAgICB9XHJcblxyXG4gICAgaGlkZSgpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5jYW5IaWRlKSB7XHJcbiAgICAgICAgICAgIHN1cGVyLmhpZGUoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY2xlYXJBbmRIaWRlKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuY2xlYXJBbGwoKTtcclxuICAgICAgICB0aGlzLmhpZGUoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHJlc2V0QWJvcnRDb250cm9sbGVyKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZ2V0SW5zdGFuY2UoKSB7XHJcbiAgICAgICAgY29uc3QgZm9jdXNTdGFjayA9IERlcGVuZGVuY3lDb250YWluZXIuSW5zdGFuY2UucmVzb2x2ZTxJRm9jdXNTdGFjaz4oXCJJRm9jdXNTdGFja1wiKTtcclxuICAgICAgICBjb25zdCB0YWJsZU9wZXJhdGlvbnNTZXJ2aWNlID0gRGVwZW5kZW5jeUNvbnRhaW5lci5JbnN0YW5jZS5yZXNvbHZlPElUYWJsZU9wZXJhdGlvbnNTZXJ2aWNlPihcIklUYWJsZU9wZXJhdGlvbnNTZXJ2aWNlXCIpO1xyXG4gICAgICAgIHJldHVybiBuZXcgVGFibGVDb250ZXh0RmxvYXRpbmdUb29sYmFyKGZvY3VzU3RhY2ssIHRhYmxlT3BlcmF0aW9uc1NlcnZpY2UpO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgQ29tbWFuZHMgfSBmcm9tIFwiQC9jb21tYW5kcy9Db21tYW5kc1wiO1xyXG5pbXBvcnQgeyBDb2xvcnMgfSBmcm9tIFwiQC9jb21tb24vQ29sb3JzXCI7XHJcbmltcG9ydCB7IFNpemVzIH0gZnJvbSBcIkAvY29tbW9uL1NpemVzXCI7XHJcbmltcG9ydCB7IFNWR0ljb24gfSBmcm9tIFwiQC9jb21wb25lbnRzL2NvbW1vbi9TVkdJY29uXCI7XHJcbmltcG9ydCB7IENvbG9ySWNvbiB9IGZyb20gXCJAL2NvbXBvbmVudHMvZmxvYXRpbmctdG9vbGJhci9kcm9wZG93bi10b29sL0NvbG9ySWNvblwiO1xyXG5pbXBvcnQgeyBEcm9wZG93bk1lbnUgfSBmcm9tIFwiQC9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvZHJvcGRvd24tdG9vbC9Ecm9wZG93bk1lbnVcIjtcclxuaW1wb3J0IHsgRHJvcGRvd25NZW51QnV0dG9uIH0gZnJvbSBcIkAvY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL2Ryb3Bkb3duLXRvb2wvRHJvcGRvd25NZW51QnV0dG9uXCI7XHJcbmltcG9ydCB7IERyb3Bkb3duTWVudUxpc3QgfSBmcm9tIFwiQC9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvZHJvcGRvd24tdG9vbC9Ecm9wZG93bk1lbnVMaXN0XCI7XHJcbmltcG9ydCB7IERyb3Bkb3duTWVudUxpc3RJdGVtIH0gZnJvbSBcIkAvY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL2Ryb3Bkb3duLXRvb2wvRHJvcGRvd25NZW51TGlzdEl0ZW1cIjtcclxuaW1wb3J0IHsgRHJvcGRvd25NZW51TGlzdEl0ZW1UaXRsZSB9IGZyb20gXCJAL2NvbXBvbmVudHMvZmxvYXRpbmctdG9vbGJhci9kcm9wZG93bi10b29sL0Ryb3Bkb3duTWVudUxpc3RJdGVtVGl0bGVcIjtcclxuaW1wb3J0IHsgRmxvYXRpbmdUb29sYmFyU2VwYXJhdG9yIH0gZnJvbSBcIkAvY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL3NlcGFyYXRvci9GbG9hdGluZ1Rvb2xiYXJTZXBhcmF0b3JcIjtcclxuaW1wb3J0IHsgVGFibGVDb250ZXh0RmxvYXRpbmdUb29sYmFyIH0gZnJvbSBcIkAvY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL1RhYmxlQ29udGV4dEZsb2F0aW5nVG9vbGJhclwiO1xyXG5pbXBvcnQgeyBEZXBlbmRlbmN5Q29udGFpbmVyIH0gZnJvbSBcIkAvY29yZS9EZXBlbmRlbmN5Q29udGFpbmVyXCI7XHJcbmltcG9ydCB7IEVsZW1lbnRGYWN0b3J5U2VydmljZSB9IGZyb20gXCJAL3NlcnZpY2VzL2VsZW1lbnQtZmFjdG9yeS9FbGVtZW50RmFjdG9yeVNlcnZpY2VcIjtcclxuaW1wb3J0IHsgSVRhYmxlT3BlcmF0aW9uc1NlcnZpY2UgfSBmcm9tIFwiQC9zZXJ2aWNlcy90YWJsZS1vcGVyYXRpb25zL0lUYWJsZU9wZXJhdGlvbnNTZXJ2aWNlXCI7XHJcbmltcG9ydCB7IEljb25zIH0gZnJvbSBcIkAvY29tbW9uL0ljb25zXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgVGFibGVDb250ZXh0RmxvYXRpbmdUb29sYmFyQnVpbGRlciB7XHJcblxyXG4gICAgc3RhdGljIGJ1aWxkKCk6IFRhYmxlQ29udGV4dEZsb2F0aW5nVG9vbGJhciB7XHJcblxyXG4gICAgICAgIGNvbnN0IHRhYmxlT3BlcmF0aW9uU2VydmljZSA9IERlcGVuZGVuY3lDb250YWluZXIuSW5zdGFuY2UucmVzb2x2ZTxJVGFibGVPcGVyYXRpb25zU2VydmljZT4oXCJJVGFibGVPcGVyYXRpb25zU2VydmljZVwiKTtcclxuXHJcbiAgICAgICAgY29uc3QgdGFibGVUb29sYmFyID0gVGFibGVDb250ZXh0RmxvYXRpbmdUb29sYmFyLmdldEluc3RhbmNlKCk7XHJcblxyXG4gICAgICAgIHRhYmxlVG9vbGJhci5hcHBlbmREcm9wZG93bihUYWJsZUNvbnRleHRGbG9hdGluZ1Rvb2xiYXJCdWlsZGVyLnRhYmxlT3B0aW9ucyh0YWJsZU9wZXJhdGlvblNlcnZpY2UpKTtcclxuICAgICAgICB0YWJsZVRvb2xiYXIuYXBwZW5kU2VwYXJhdG9yKFRhYmxlQ29udGV4dEZsb2F0aW5nVG9vbGJhckJ1aWxkZXIuc2VwYXJhdG9yKFwidGFibGVPcGVyYXRpb25zU2VwYXJhdG9yXCIpKTtcclxuICAgICAgICB0YWJsZVRvb2xiYXIuYXBwZW5kRHJvcGRvd24oVGFibGVDb250ZXh0RmxvYXRpbmdUb29sYmFyQnVpbGRlci50YWJsZUNvbG9yRHJvcGRvd24oKSk7XHJcblxyXG5cclxuICAgICAgICByZXR1cm4gdGFibGVUb29sYmFyO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyB0YWJsZU9wdGlvbnModGFibGVPcGVyYXRpb25zU2VydmljZTogSVRhYmxlT3BlcmF0aW9uc1NlcnZpY2UpOiBEcm9wZG93bk1lbnUge1xyXG5cclxuICAgICAgICBjb25zdCB0dXJuSW50b0Jhckxpc3QgPSBuZXcgRHJvcGRvd25NZW51TGlzdChcInRhYmxlT3B0aW9uc1NlbGVjdFwiKTtcclxuICAgICAgICBjb25zdCB0dXJuSW50b0JhckJ1dHRvbiA9IG5ldyBEcm9wZG93bk1lbnVCdXR0b24oXCJ0YWJsZU9wdGlvbnNcIiwgXCJPcHRpb25zXCIsIHR1cm5JbnRvQmFyTGlzdCk7XHJcbiAgICAgICAgY29uc3QgdHVybkludG9Ecm9wZG93biA9IG5ldyBEcm9wZG93bk1lbnUoXCJ0YWJsZU9wdGlvbnNNZW51XCIsIHR1cm5JbnRvQmFyQnV0dG9uLCB0dXJuSW50b0Jhckxpc3QpO1xyXG5cclxuICAgICAgICB0dXJuSW50b0Jhckxpc3QuYXBwZW5kKG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbVRpdGxlKHR1cm5JbnRvQmFyTGlzdCwgXCJJbnNlcnQgQ29sdW1uXCIpKTtcclxuXHJcbiAgICAgICAgdHVybkludG9CYXJMaXN0LmFwcGVuZChuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW0oXCJ0dXJuSW50b09wdGlvblRleHRcIiwgdHVybkludG9CYXJMaXN0LCBDb21tYW5kcy5pbnNlcnRUYWJsZUNvbHVtbkxlZnQsIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLlBBUkFHUkFQSCwgU1ZHSWNvbi5jcmVhdGUoSWNvbnMuQ29sdW1uTGVmdCwgU2l6ZXMubWVkaXVtKS5odG1sRWxlbWVudCwgXCJMZWZ0XCIpKTtcclxuICAgICAgICB0dXJuSW50b0Jhckxpc3QuYXBwZW5kKG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcInR1cm5JbnRvT3B0aW9uVGV4dFwiLCB0dXJuSW50b0Jhckxpc3QsIENvbW1hbmRzLmluc2VydFRhYmxlQ29sdW1uUmlnaHQsIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLlBBUkFHUkFQSCwgU1ZHSWNvbi5jcmVhdGUoSWNvbnMuQ29sdW1uUmlnaHQsIFNpemVzLm1lZGl1bSkuaHRtbEVsZW1lbnQsIFwiUmlnaHRcIikpO1xyXG5cclxuICAgICAgICB0dXJuSW50b0Jhckxpc3QuYXBwZW5kKG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbVRpdGxlKHR1cm5JbnRvQmFyTGlzdCwgXCJJbnNlcnQgUm93XCIpKTtcclxuICAgICAgICB0dXJuSW50b0Jhckxpc3QuYXBwZW5kKG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcInR1cm5JbnRvT3B0aW9uVG9kb0xpc3RcIiwgdHVybkludG9CYXJMaXN0LCBDb21tYW5kcy5pbnNlcnRUYWJsZVJvd0Fib3ZlLCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5DSEVDS19MSVNULCBTVkdJY29uLmNyZWF0ZShJY29ucy5Sb3dBYm92ZSwgU2l6ZXMubWVkaXVtKS5odG1sRWxlbWVudCwgXCJBYm92ZVwiKSk7XHJcbiAgICAgICAgdHVybkludG9CYXJMaXN0LmFwcGVuZChuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW0oXCJ0dXJuSW50b09wdGlvblRvZG9MaXN0XCIsIHR1cm5JbnRvQmFyTGlzdCwgQ29tbWFuZHMuaW5zZXJ0VGFibGVSb3dCZWxvdywgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuQ0hFQ0tfTElTVCwgU1ZHSWNvbi5jcmVhdGUoSWNvbnMuUm93QmVsb3csIFNpemVzLm1lZGl1bSkuaHRtbEVsZW1lbnQsIFwiQmVsb3dcIikpO1xyXG5cclxuXHJcbiAgICAgICAgdHVybkludG9CYXJMaXN0LmFwcGVuZChuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW1UaXRsZSh0dXJuSW50b0Jhckxpc3QsIFwiUmVtb3ZlXCIpKTtcclxuXHJcbiAgICAgICAgY29uc3QgZGVsZXRlQ29sdW1uSXRlbSA9IG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcInR1cm5JbnRvT3B0aW9uVGV4dFwiLCB0dXJuSW50b0Jhckxpc3QsIENvbW1hbmRzLnJlbW92ZUNvbHVtbiwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuUEFSQUdSQVBILCBTVkdJY29uLmNyZWF0ZShJY29ucy5kZWxldGVTd2VlcCwgU2l6ZXMubWVkaXVtKS5odG1sRWxlbWVudCwgXCJDb2x1bW5cIik7XHJcbiAgICAgICAgZGVsZXRlQ29sdW1uSXRlbS5hZGRDc3NDbGFzcyhcImRhbmdlci1vcHRpb25cIik7XHJcbiAgICAgICAgLy8gZGVsZXRlQ29sdW1uSXRlbS5hdHRhY2hPbkZvY3VzKHRhYmxlT3BlcmF0aW9uc1NlcnZpY2UuZW1pdENoYW5nZVRhYmxlQm9yZGVyQ29sb3JFdmVudCwgVGFibGVTY29wZXMuQ29sdW1uLCBDb2xvcnMuVG9tYXRvKTtcclxuICAgICAgICAvLyBkZWxldGVDb2x1bW5JdGVtLmF0dGFjaE9uTG9zZUZvY3VzKHRhYmxlT3BlcmF0aW9uc1NlcnZpY2UuZW1pdENoYW5nZVRhYmxlQm9yZGVyQ29sb3JFdmVudCwgVGFibGVTY29wZXMuQ29sdW1uLCBDb2xvcnMuT3JpZ2luYWxUYWJsZUNvbG9yKTtcclxuXHJcbiAgICAgICAgdHVybkludG9CYXJMaXN0LmFwcGVuZChkZWxldGVDb2x1bW5JdGVtKTtcclxuICAgICAgICBcclxuICAgICAgICBcclxuICAgICAgICBjb25zdCBkZWxldGVSb3dJdGVtID0gbmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwidHVybkludG9PcHRpb25Ub2RvTGlzdFwiLCB0dXJuSW50b0Jhckxpc3QsIENvbW1hbmRzLnJlbW92ZVJvdywgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuQ0hFQ0tfTElTVCwgU1ZHSWNvbi5jcmVhdGUoSWNvbnMuZGVsZXRlU3dlZXAsIFNpemVzLm1lZGl1bSkuaHRtbEVsZW1lbnQsIFwiUm93XCIpO1xyXG4gICAgICAgIGRlbGV0ZVJvd0l0ZW0uYWRkQ3NzQ2xhc3MoXCJkYW5nZXItb3B0aW9uXCIpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIGRlbGV0ZVJvd0l0ZW0uYXR0YWNoT25Gb2N1cyh0YWJsZU9wZXJhdGlvbnNTZXJ2aWNlLmVtaXRDaGFuZ2VUYWJsZUJvcmRlckNvbG9yRXZlbnQsIFRhYmxlU2NvcGVzLlJvdywgQ29sb3JzLlRvbWF0byk7XHJcbiAgICAgICAgLy8gZGVsZXRlUm93SXRlbS5hdHRhY2hPbkxvc2VGb2N1cyh0YWJsZU9wZXJhdGlvbnNTZXJ2aWNlLmVtaXRDaGFuZ2VUYWJsZUJvcmRlckNvbG9yRXZlbnQsIFRhYmxlU2NvcGVzLlJvdywgQ29sb3JzLk9yaWdpbmFsVGFibGVDb2xvcik7XHJcblxyXG4gICAgICAgIHR1cm5JbnRvQmFyTGlzdC5hcHBlbmQoZGVsZXRlUm93SXRlbSk7XHJcblxyXG5cclxuICAgICAgICByZXR1cm4gdHVybkludG9Ecm9wZG93bjtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgdGFibGVDb2xvckRyb3Bkb3duKCk6IERyb3Bkb3duTWVudSB7XHJcblxyXG4gICAgICAgIGNvbnN0IGNvbG9yRHJvcGRvd25MaXN0ID0gbmV3IERyb3Bkb3duTWVudUxpc3QoXCJjb2xvclRhYmxlT3B0aW9uU2VsZWN0XCIpO1xyXG4gICAgICAgIGNvbnN0IGNvbG9yQnV0dG9uID0gbmV3IERyb3Bkb3duTWVudUJ1dHRvbihcImNvbG9yVGFibGVCdXR0b25cIiwgbmV3IENvbG9ySWNvbihcIiNGQUY0RDFcIikuaHRtbEVsZW1lbnQsIGNvbG9yRHJvcGRvd25MaXN0KTtcclxuICAgICAgICBjb25zdCBjb2xvckRyb3Bkb3duID0gbmV3IERyb3Bkb3duTWVudShcInRhYmxlQ29sb3JPcHRpb25zTWVudVwiLCBjb2xvckJ1dHRvbiwgY29sb3JEcm9wZG93bkxpc3QpO1xyXG5cclxuICAgICAgICBjb2xvckRyb3Bkb3duTGlzdC5hcHBlbmQobmV3IERyb3Bkb3duTWVudUxpc3RJdGVtVGl0bGUoY29sb3JEcm9wZG93bkxpc3QsIFwiQmFja2dyb3VuZFwiKSk7XHJcblxyXG5cclxuICAgICAgICBjb25zdCBjZWxsQmFja2dyb3VuZENvbG9yUmVkID0gbmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwiYmFja2dyb3VuZE9wdGlvblJlZFwiLCBjb2xvckRyb3Bkb3duTGlzdCwgQ29tbWFuZHMudG9nZ2xlQ2VsbEhpbGl0ZUNvbG9yLCBDb2xvcnMuSGlsaXRlQ29sb3JSZWQsIG5ldyBDb2xvckljb24oQ29sb3JzLkhpbGl0ZUNvbG9yUmVkKS5odG1sRWxlbWVudCwgXCJSZWRcIik7XHJcbiAgICAgICAgY2VsbEJhY2tncm91bmRDb2xvclJlZC5hZGRDbGFzcyhcImJhY2tncm91bmRDb2xvclwiKTtcclxuICAgICAgICBcclxuICAgICAgICBjb25zdCBjZWxsQmFja2dyb3VuZENvbG9yR3JlZW4gPSBuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW0oXCJiYWNrZ3JvdW5kT3B0aW9uR3JlZW5cIiwgY29sb3JEcm9wZG93bkxpc3QsIENvbW1hbmRzLnRvZ2dsZUNlbGxIaWxpdGVDb2xvciwgQ29sb3JzLkhpbGl0ZUNvbG9yR3JlZW4sIG5ldyBDb2xvckljb24oQ29sb3JzLkhpbGl0ZUNvbG9yR3JlZW4pLmh0bWxFbGVtZW50LCBcIkdyZWVuXCIpO1xyXG4gICAgICAgIGNlbGxCYWNrZ3JvdW5kQ29sb3JHcmVlbi5hZGRDbGFzcyhcImJhY2tncm91bmRDb2xvclwiKTtcclxuICAgICAgICBcclxuICAgICAgICBcclxuICAgICAgICBjb25zdCBjZWxsQmFja2dyb3VuZENvbG9yQmx1ZSA9IG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcImJhY2tncm91bmRPcHRpb25CbHVlXCIsIGNvbG9yRHJvcGRvd25MaXN0LCBDb21tYW5kcy50b2dnbGVDZWxsSGlsaXRlQ29sb3IsIENvbG9ycy5IaWxpdGVDb2xvckJsdWUsIG5ldyBDb2xvckljb24oQ29sb3JzLkhpbGl0ZUNvbG9yQmx1ZSkuaHRtbEVsZW1lbnQsIFwiQmx1ZVwiKTtcclxuICAgICAgICBjZWxsQmFja2dyb3VuZENvbG9yQmx1ZS5hZGRDbGFzcyhcImJhY2tncm91bmRDb2xvclwiKTtcclxuICAgICAgICBcclxuICAgICAgICBcclxuICAgICAgICBjb25zdCBjZWxsQmFja2dyb3VuZENvbG9yWWVsbG93ID0gbmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwiYmFja2dyb3VuZE9wdGlvblllbGxvd1wiLCBjb2xvckRyb3Bkb3duTGlzdCwgQ29tbWFuZHMudG9nZ2xlQ2VsbEhpbGl0ZUNvbG9yLCBDb2xvcnMuSGlsaXRlQ29sb3JZZWxsb3csIG5ldyBDb2xvckljb24oQ29sb3JzLkhpbGl0ZUNvbG9yWWVsbG93KS5odG1sRWxlbWVudCwgXCJZZWxsb3dcIik7XHJcbiAgICAgICAgY2VsbEJhY2tncm91bmRDb2xvclllbGxvdy5hZGRDbGFzcyhcImJhY2tncm91bmRDb2xvclwiKTtcclxuICAgICAgICBcclxuICAgICAgICBcclxuICAgICAgICBjb25zdCBjZWxsQmFja2dyb3VuZENvbG9yR3JleSA9IG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcImJhY2tncm91bmRPcHRpb25HcmV5XCIsIGNvbG9yRHJvcGRvd25MaXN0LCBDb21tYW5kcy50b2dnbGVDZWxsSGlsaXRlQ29sb3IsIENvbG9ycy5IaWxpdGVDb2xvckdyZXksIG5ldyBDb2xvckljb24oQ29sb3JzLkhpbGl0ZUNvbG9yR3JleSkuaHRtbEVsZW1lbnQsIFwiR3JleVwiKTtcclxuICAgICAgICBjZWxsQmFja2dyb3VuZENvbG9yR3JleS5hZGRDbGFzcyhcImJhY2tncm91bmRDb2xvclwiKTtcclxuICAgICAgICBcclxuICAgICAgICBcclxuICAgICAgICBjb25zdCBjZWxsQmFja2dyb3VuZENvbG9yTm9uZSA9IG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcImJhY2tncm91bmRPcHRpb25Ob25lXCIsIGNvbG9yRHJvcGRvd25MaXN0LCBDb21tYW5kcy50b2dnbGVDZWxsSGlsaXRlQ29sb3IsIENvbG9ycy5IaWxpdGVDb2xvck5vbmUsIG5ldyBDb2xvckljb24oQ29sb3JzLkhpbGl0ZUNvbG9yTm9uZSkuaHRtbEVsZW1lbnQsIFwiTm9uZVwiKTtcclxuICAgICAgICBjZWxsQmFja2dyb3VuZENvbG9yTm9uZS5hZGRDbGFzcyhcImJhY2tncm91bmRDb2xvclwiKTtcclxuXHJcbiAgICAgICAgY29sb3JEcm9wZG93bkxpc3QuYXBwZW5kKGNlbGxCYWNrZ3JvdW5kQ29sb3JSZWQpO1xyXG4gICAgICAgIGNvbG9yRHJvcGRvd25MaXN0LmFwcGVuZChjZWxsQmFja2dyb3VuZENvbG9yR3JlZW4pO1xyXG4gICAgICAgIGNvbG9yRHJvcGRvd25MaXN0LmFwcGVuZChjZWxsQmFja2dyb3VuZENvbG9yQmx1ZSk7XHJcbiAgICAgICAgY29sb3JEcm9wZG93bkxpc3QuYXBwZW5kKGNlbGxCYWNrZ3JvdW5kQ29sb3JZZWxsb3cpO1xyXG4gICAgICAgIGNvbG9yRHJvcGRvd25MaXN0LmFwcGVuZChjZWxsQmFja2dyb3VuZENvbG9yR3JleSk7XHJcbiAgICAgICAgY29sb3JEcm9wZG93bkxpc3QuYXBwZW5kKGNlbGxCYWNrZ3JvdW5kQ29sb3JOb25lKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGNvbG9yRHJvcGRvd247XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIHNlcGFyYXRvcihpZDogc3RyaW5nKTogRmxvYXRpbmdUb29sYmFyU2VwYXJhdG9yIHtcclxuICAgICAgICByZXR1cm4gbmV3IEZsb2F0aW5nVG9vbGJhclNlcGFyYXRvcihpZCk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBCYXNlVUlDb21wb25lbnQgfSBmcm9tIFwiLi4vY29tbW9uL0Jhc2VVSUNvbXBvbmVudFwiO1xyXG5pbXBvcnQgeyBJRm9jdXNTdGFjayB9IGZyb20gXCJAL2NvcmUvSUZvY3VzU3RhY2tcIjtcclxuaW1wb3J0IHsgRGVwZW5kZW5jeUNvbnRhaW5lciB9IGZyb20gXCJAL2NvcmUvRGVwZW5kZW5jeUNvbnRhaW5lclwiO1xyXG5pbXBvcnQgeyBaSW5kZXggfSBmcm9tIFwiQC9jb21tb24vWkluZGV4XCI7XHJcbmltcG9ydCB7IEN1c3RvbVVJRXZlbnRzIH0gZnJvbSBcIkAvY29tbW9uL0N1c3RvbVVJRXZlbnRzXCI7XHJcbmltcG9ydCB7IElVSUV2ZW50RGV0YWlsIH0gZnJvbSBcIkAvY29tbWFuZHMvSVVJRXZlbnREZXRhaWxcIjtcclxuaW1wb3J0IHsgRGVmYXVsdEpTRXZlbnRzIH0gZnJvbSBcIkAvY29tbW9uL0RlZmF1bHRKU0V2ZW50c1wiO1xyXG5pbXBvcnQgeyBLZXlib2FyZEtleXMgfSBmcm9tIFwiQC9jb21tb24vS2V5Ym9hcmRLZXlzXCI7XHJcbmltcG9ydCB7IERPTVV0aWxzIH0gZnJvbSBcIkAvdXRpbGl0aWVzL0RPTVV0aWxzXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgTWVkaWFJbnB1dHRlciBleHRlbmRzIEJhc2VVSUNvbXBvbmVudCB7XHJcblxyXG4gICAgaWQ6IHN0cmluZztcclxuICAgIGZvY3VzU3RhY2s6IElGb2N1c1N0YWNrO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIGNvbnN0IGlkID0gXCJtZWRpYUlucHV0dGVyXCI7XHJcbiAgICAgICAgc3VwZXIoe1xyXG4gICAgICAgICAgICBpZDogaWRcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5pZCA9IGlkO1xyXG4gICAgICAgIHRoaXMuZm9jdXNTdGFjayA9IERlcGVuZGVuY3lDb250YWluZXIuSW5zdGFuY2UucmVzb2x2ZTxJRm9jdXNTdGFjaz4oXCJJRm9jdXNTdGFja1wiKTtcclxuXHJcbiAgICAgICAgdGhpcy5hdHRhY2hFdmVudHMoKTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0KCk6IEhUTUxFbGVtZW50IHtcclxuICAgICAgICBjb25zdCBodG1sRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuaWQgPSB0aGlzLnByb3BzLmlkO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJ0YWItY29udGFpbmVyXCIsIFwic29mdC1ib3gtc2hhZG93XCIpO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcclxuICAgICAgICBodG1sRWxlbWVudC5zdHlsZS56SW5kZXggPSBaSW5kZXguU2xpZ2h0bHlJbXBvcnRhbnQ7XHJcblxyXG4gICAgICAgIGNvbnN0IGhlYWQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidWxcIik7XHJcbiAgICAgICAgaGVhZC5jbGFzc0xpc3QuYWRkKFwibmF2XCIsIFwibmF2LXVuZGVybGluZVwiKTtcclxuXHJcbiAgICAgICAgY29uc3QgdXBsb2FkVGFiID0gdGhpcy5jcmVhdGVOYXZJdGVtKFwidXBsb2FkVGFiXCIsIFwiVXBsb2FkXCIsIHRydWUpO1xyXG5cclxuICAgICAgICBjb25zdCBlbWJlZFRhYiA9IHRoaXMuY3JlYXRlTmF2SXRlbShcImVtYmVkVGFiXCIsIFwiRW1iZWQgbGlua1wiKTtcclxuXHJcbiAgICAgICAgaGVhZC5hcHBlbmRDaGlsZCh1cGxvYWRUYWIpO1xyXG4gICAgICAgIGhlYWQuYXBwZW5kQ2hpbGQoZW1iZWRUYWIpO1xyXG5cclxuICAgICAgICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICBjb250ZW50LmNsYXNzTGlzdC5hZGQoXCJ0YWItY29udGVudFwiKTtcclxuXHJcbiAgICAgICAgY29uc3QgdXBsb2FkQ29udGVudCA9IHRoaXMuY3JlYXRlVXBsb2FkQ29udGVudCgpO1xyXG4gICAgICAgIGNvbnN0IGVtYmVkQ29udGVudCA9IHRoaXMuY3JlYXRlRW1iZWRDb250ZW50KCk7XHJcblxyXG4gICAgICAgIGNvbnRlbnQuYXBwZW5kQ2hpbGQodXBsb2FkQ29udGVudCk7XHJcbiAgICAgICAgY29udGVudC5hcHBlbmRDaGlsZChlbWJlZENvbnRlbnQpO1xyXG5cclxuICAgICAgICBodG1sRWxlbWVudC5hcHBlbmRDaGlsZChoZWFkKTtcclxuICAgICAgICBodG1sRWxlbWVudC5hcHBlbmRDaGlsZChjb250ZW50KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGh0bWxFbGVtZW50O1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBjcmVhdGVOYXZJdGVtKGlkOiBzdHJpbmcsIHRleHQ6IHN0cmluZywgYWN0aXZlOiBib29sZWFuID0gZmFsc2UpOiBIVE1MRWxlbWVudCB7XHJcbiAgICAgICAgY29uc3QgbGkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwibGlcIik7XHJcbiAgICAgICAgbGkuY2xhc3NMaXN0LmFkZChcIm5hdi1pdGVtXCIpO1xyXG4gICAgICAgIGlmIChhY3RpdmUpIGxpLmNsYXNzTGlzdC5hZGQoXCJhY3RpdmVcIik7XHJcbiAgICAgICAgbGkuaWQgPSBpZDtcclxuXHJcbiAgICAgICAgY29uc3QgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJhXCIpO1xyXG4gICAgICAgIGEuY2xhc3NMaXN0LmFkZChcIm5hdi1saW5rXCIpO1xyXG4gICAgICAgIGEuaW5uZXJUZXh0ID0gdGV4dDtcclxuICAgICAgICBsaS5hcHBlbmRDaGlsZChhKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGxpO1xyXG4gICAgfVxyXG5cclxuICAgIGNyZWF0ZVVwbG9hZENvbnRlbnQoKTogSFRNTEVsZW1lbnQge1xyXG4gICAgICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgZGl2LmlkID0gXCJ1cGxvYWRDb250ZW50XCI7XHJcbiAgICAgICAgZGl2LmNsYXNzTGlzdC5hZGQoXCJ1cGxvYWQtY29udGVudFwiLCBcImNvbnRlbnQtZGF0YVwiKTtcclxuICAgICAgICAvLyBpZiAodGhpcy5pZCA9PT0gXCJ1cGxvYWRDb250ZW50XCIpIGRpdi5jbGFzc0xpc3QuYWRkKFwiYWN0aXZlXCIpO1xyXG5cclxuICAgICAgICBjb25zdCBsYWJlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJsYWJlbFwiKTtcclxuICAgICAgICBsYWJlbC5pbm5lclRleHQgPSBcIlVwbG9hZCBmaWxlXCI7XHJcblxyXG4gICAgICAgIGNvbnN0IHRleHRJbmZvID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICB0ZXh0SW5mby5jbGFzc0xpc3QuYWRkKFwidGV4dC1pbmZvXCIpO1xyXG4gICAgICAgIHRleHRJbmZvLmlubmVyVGV4dCA9IFwiTWF4aW11bSBmaWxlIHNpemU6IDVNQlwiO1xyXG5cclxuICAgICAgICBkaXYuYXBwZW5kQ2hpbGQobGFiZWwpO1xyXG4gICAgICAgIGRpdi5hcHBlbmRDaGlsZCh0ZXh0SW5mbyk7XHJcblxyXG4gICAgICAgIHJldHVybiBkaXY7XHJcbiAgICB9XHJcblxyXG4gICAgY3JlYXRlRW1iZWRDb250ZW50KCk6IEhUTUxFbGVtZW50IHtcclxuICAgICAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgICAgIGRpdi5pZCA9IFwiZW1iZWRDb250ZW50XCI7XHJcbiAgICAgICAgZGl2LmNsYXNzTGlzdC5hZGQoXCJjb250ZW50LWRhdGFcIiwgXCJlbWJlZC1jb250ZW50XCIpO1xyXG4gICAgICAgIC8vIGlmICh0aGlzLmlkID09PSBcImVtYmVkQ29udGVudFwiKSBkaXYuY2xhc3NMaXN0LmFkZChcImFjdGl2ZVwiKTtcclxuXHJcbiAgICAgICAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7XHJcbiAgICAgICAgaW5wdXQudHlwZSA9IFwidGV4dFwiO1xyXG4gICAgICAgIGlucHV0LnNldEF0dHJpYnV0ZShcInBsYWNlaG9sZGVyXCIsIFwiUGFzdGUgVVJMIGhlcmVcIik7XHJcblxyXG4gICAgICAgIGNvbnN0IGJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIik7XHJcbiAgICAgICAgYnV0dG9uLmlubmVyVGV4dCA9IFwiRW1iZWRcIjtcclxuICAgICAgICBidXR0b24uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHRoaXMuZW1iZWRHZW5lcmljKGlucHV0LnZhbHVlKSk7XHJcblxyXG4gICAgICAgIGRpdi5hcHBlbmRDaGlsZChpbnB1dCk7XHJcbiAgICAgICAgZGl2LmFwcGVuZENoaWxkKGJ1dHRvbik7XHJcblxyXG4gICAgICAgIHJldHVybiBkaXY7XHJcbiAgICB9XHJcblxyXG4gICAgZW1iZWRHZW5lcmljKHVybDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgdXJsT2JqID0gbmV3IFVSTCh1cmwpO1xyXG4gICAgICAgIGNvbnN0IGRvbWFpbiA9IHVybE9iai5ob3N0bmFtZTtcclxuICAgICAgICBjb25zdCBwYXRoID0gdXJsT2JqLnBhdGhuYW1lO1xyXG5cclxuICAgICAgICBzd2l0Y2ggKGRvbWFpbikge1xyXG4gICAgICAgICAgICBjYXNlIFwid3d3LnlvdXR1YmUuY29tXCI6XHJcbiAgICAgICAgICAgICAgICBpZiAocGF0aC5zdGFydHNXaXRoKFwiL3dhdGNoXCIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWJlZFlvdVR1YmVWaWRlbyh1cmxPYmopO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXRoLnN0YXJ0c1dpdGgoXCIvcGxheWxpc3RcIikpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmVtYmVkWW91VHViZVBsYXlsaXN0KHVybE9iaik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcIm9wZW4uc3BvdGlmeS5jb21cIjpcclxuICAgICAgICAgICAgICAgIGlmIChwYXRoLnN0YXJ0c1dpdGgoXCIvdHJhY2tcIikpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmVtYmVkU3BvdGlmeVRyYWNrKHVybE9iaik7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhdGguc3RhcnRzV2l0aChcIi9wbGF5bGlzdFwiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZW1iZWRTcG90aWZ5UGxheWxpc3QodXJsT2JqKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwidHdpdHRlci5jb21cIjpcclxuICAgICAgICAgICAgICAgIHRoaXMuZW1iZWRUd2VldCh1cmxPYmopO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJ3d3cuZ29vZ2xlLmNvbVwiOlxyXG4gICAgICAgICAgICBjYXNlIFwid3d3Lmdvb2dsZS5jb20uYnJcIjogIC8vIEhhbmRsZSBtdWx0aXBsZSBHb29nbGUgZG9tYWlucyBpZiBuZWNlc3NhcnlcclxuICAgICAgICAgICAgICAgIGlmIChwYXRoLnN0YXJ0c1dpdGgoXCIvbWFwc1wiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZW1iZWRHb29nbGVNYXAodXJsT2JqKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwiZ2lzdC5naXRodWIuY29tXCI6XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVtYmVkR2lzdCh1cmxPYmosIFwiZ2l0aHViXCIpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJnaXRsYWIuY29tXCI6XHJcbiAgICAgICAgICAgICAgICBpZiAocGF0aC5pbmNsdWRlcyhcIi9zbmlwcGV0c1wiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZW1iZWRHaXN0KHVybE9iaiwgXCJnaXRsYWJcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcImNvZGVwZW4uaW9cIjpcclxuICAgICAgICAgICAgICAgIHRoaXMuZW1iZWRDb2RlcGVuKHVybE9iaik7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJVbnN1cHBvcnRlZCBVUkwgZm9yIGVtYmVkZGluZ1wiKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBBZGRlZCBicmVhayBmb3IgY29uc2lzdGVuY3lcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICB9XHJcblxyXG4gICAgZW1iZWRZb3VUdWJlVmlkZW8odXJsT2JqOiBVUkwpIHtcclxuICAgICAgICBjb25zdCB2aWRlb0lkID0gdXJsT2JqLnNlYXJjaFBhcmFtcy5nZXQoJ3YnKTtcclxuICAgICAgICBpZiAodmlkZW9JZCkge1xyXG5cclxuICAgICAgICAgICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5jcmVhdGVFbWJlZENvbnRhaW5lcigpO1xyXG4gICAgICAgICAgICBjb25zdCBpZnJhbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpZnJhbWUnKTtcclxuXHJcbiAgICAgICAgICAgIGlmcmFtZS5zcmMgPSBgaHR0cHM6Ly93d3cueW91dHViZS5jb20vZW1iZWQvJHt2aWRlb0lkfWA7XHJcbiAgICAgICAgICAgIC8vIGlmcmFtZS5zZXRBdHRyaWJ1dGUoXCJhbGxvd2Z1bGxzY3JlZW5cIiwgXCJ0cnVlXCIpO1xyXG4gICAgICAgICAgICAvLyBpZnJhbWUuc3R5bGUubWF4V2lkdGggPSBcIjEwMCVcIjtcclxuICAgICAgICAgICAgaWZyYW1lLmZyYW1lQm9yZGVyID0gXCIwXCI7XHJcbiAgICAgICAgICAgIGlmcmFtZS5hbGxvdyA9IFwiYWNjZWxlcm9tZXRlcjsgYXV0b3BsYXk7IGNsaXBib2FyZC13cml0ZTsgZW5jcnlwdGVkLW1lZGlhOyBneXJvc2NvcGU7IHBpY3R1cmUtaW4tcGljdHVyZVwiO1xyXG4gICAgICAgICAgICBpZnJhbWUuYWxsb3dGdWxsc2NyZWVuID0gdHJ1ZTtcclxuICAgICAgICAgICAgLy8gaWZyYW1lLnN0eWxlLmhlaWdodCA9IFwiNDUwcHhcIjsgLy8gU2V0IHRoaXMgYXMgcGVyIHlvdXIgbGF5b3V0IHJlcXVpcmVtZW50c1xyXG4gICAgICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoaWZyYW1lKTtcclxuICAgICAgICAgICAgdGhpcy5maW5hbGl6ZUVtYmVkKGNvbnRhaW5lcik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcignSW52YWxpZCBZb3VUdWJlIHZpZGVvIFVSTCcpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBlbWJlZFlvdVR1YmVQbGF5bGlzdCh1cmxPYmo6IFVSTCkge1xyXG4gICAgICAgIGNvbnN0IGxpc3RJZCA9IHVybE9iai5zZWFyY2hQYXJhbXMuZ2V0KCdsaXN0Jyk7XHJcbiAgICAgICAgaWYgKGxpc3RJZCkge1xyXG4gICAgICAgICAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLmNyZWF0ZUVtYmVkQ29udGFpbmVyKCk7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBjb25zdCBpZnJhbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpZnJhbWUnKTtcclxuICAgICAgICAgICAgaWZyYW1lLnNyYyA9IGBodHRwczovL3d3dy55b3V0dWJlLmNvbS9lbWJlZC92aWRlb3Nlcmllcz9saXN0PSR7bGlzdElkfWA7XHJcbiAgICAgICAgICAgIGlmcmFtZS5zZXRBdHRyaWJ1dGUoXCJhbGxvd2Z1bGxzY3JlZW5cIiwgXCJ0cnVlXCIpO1xyXG4gICAgICAgICAgICAvLyBpZnJhbWUuc3R5bGUubWF4V2lkdGggPSBcIjEwMCVcIjtcclxuICAgICAgICAgICAgLy8gaWZyYW1lLnN0eWxlLmhlaWdodCA9IFwiNDUwcHhcIjsgLy8gQWRqdXN0IGFjY29yZGluZyB0byB5b3VyIG5lZWRzXHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChpZnJhbWUpO1xyXG4gICAgICAgICAgICB0aGlzLmZpbmFsaXplRW1iZWQoY29udGFpbmVyKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdJbnZhbGlkIFlvdVR1YmUgcGxheWxpc3QgVVJMJyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGVtYmVkU3BvdGlmeVRyYWNrKHVybE9iajogVVJMKSB7XHJcbiAgICAgICAgY29uc3QgdHJhY2tJZCA9IHVybE9iai5wYXRobmFtZS5zcGxpdCgnLycpLnBvcCgpO1xyXG4gICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuY3JlYXRlRW1iZWRDb250YWluZXIoKTtcclxuICAgICAgICBjb25zdCBpZnJhbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpZnJhbWUnKTtcclxuICAgICAgICBpZnJhbWUuc3JjID0gYGh0dHBzOi8vb3Blbi5zcG90aWZ5LmNvbS9lbWJlZC90cmFjay8ke3RyYWNrSWR9YDtcclxuICAgICAgICBpZnJhbWUuZnJhbWVCb3JkZXIgPSBcIjBcIjtcclxuICAgICAgICAvLyBpZnJhbWUuc3R5bGUubWF4V2lkdGggPSBcIjEwMCVcIjtcclxuICAgICAgICAvLyBpZnJhbWUuc3R5bGUuaGVpZ2h0ID0gXCI4MHB4XCI7IC8vIFNwb3RpZnkgdHJhY2tzIGhhdmUgYSBmaXhlZCBoZWlnaHRcclxuICAgICAgICBpZnJhbWUud2lkdGggPSBcImF1dG9cIjtcclxuICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoaWZyYW1lKTtcclxuICAgICAgICB0aGlzLmZpbmFsaXplRW1iZWQoY29udGFpbmVyKTtcclxuICAgIH1cclxuXHJcbiAgICBlbWJlZFNwb3RpZnlQbGF5bGlzdCh1cmxPYmo6IFVSTCkge1xyXG4gICAgICAgIGNvbnN0IHBsYXlsaXN0SWQgPSB1cmxPYmoucGF0aG5hbWUuc3BsaXQoJy8nKS5wb3AoKTtcclxuICAgICAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLmNyZWF0ZUVtYmVkQ29udGFpbmVyKCk7XHJcbiAgICAgICAgY29uc3QgaWZyYW1lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaWZyYW1lJyk7XHJcbiAgICAgICAgaWZyYW1lLnNyYyA9IGBodHRwczovL29wZW4uc3BvdGlmeS5jb20vZW1iZWQvcGxheWxpc3QvJHtwbGF5bGlzdElkfWA7XHJcbiAgICAgICAgaWZyYW1lLmZyYW1lQm9yZGVyID0gXCIwXCI7XHJcblxyXG4gICAgICAgIC8vIGlmcmFtZS5zdHlsZS5tYXhXaWR0aCA9IFwiMTAwJVwiO1xyXG4gICAgICAgIC8vIGlmcmFtZS5zdHlsZS5oZWlnaHQgPSBcIjM4MHB4XCI7IC8vIFN0YW5kYXJkIFNwb3RpZnkgcGxheWxpc3QgaGVpZ2h0XHJcbiAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGlmcmFtZSk7XHJcbiAgICAgICAgdGhpcy5maW5hbGl6ZUVtYmVkKGNvbnRhaW5lcik7XHJcbiAgICB9XHJcblxyXG4gICAgZW1iZWRUd2VldCh1cmxPYmo6IFVSTCkge1xyXG4gICAgICAgIGNvbnN0IHR3ZWV0SWQgPSB1cmxPYmoucGF0aG5hbWUuc3BsaXQoJy8nKS5wb3AoKTtcclxuICAgICAgICBjb25zdCBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcclxuICAgICAgICBzY3JpcHQuc2V0QXR0cmlidXRlKCdzcmMnLCAnaHR0cHM6Ly9wbGF0Zm9ybS50d2l0dGVyLmNvbS93aWRnZXRzLmpzJyk7XHJcbiAgICAgICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5jcmVhdGVFbWJlZENvbnRhaW5lcigpO1xyXG4gICAgICAgIGNvbnN0IGJsb2NrcXVvdGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdibG9ja3F1b3RlJyk7XHJcbiAgICAgICAgYmxvY2txdW90ZS5jbGFzc0xpc3QuYWRkKFwidHdpdHRlci10d2VldFwiKTtcclxuICAgICAgICBibG9ja3F1b3RlLnNldEF0dHJpYnV0ZSgnZGF0YS10aGVtZScsICdsaWdodCcpOyAvLyBvciAnZGFyaydcclxuICAgICAgICBibG9ja3F1b3RlLmlubmVySFRNTCA9IGA8YSBocmVmPVwiJHt1cmxPYmoudG9TdHJpbmcoKX1cIj5Mb2FkaW5nIHR3ZWV0Li4uPC9hPmA7XHJcbiAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGJsb2NrcXVvdGUpO1xyXG4gICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChzY3JpcHQpO1xyXG4gICAgICAgIHRoaXMuZmluYWxpemVFbWJlZChjb250YWluZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIGVtYmVkR29vZ2xlTWFwKHVybE9iajogVVJMKSB7XHJcbiAgICAgICAgY29uc3QgcXVlcnlTdHJpbmcgPSB1cmxPYmouc2VhcmNoLnNsaWNlKDEpO1xyXG4gICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuY3JlYXRlRW1iZWRDb250YWluZXIoKTtcclxuICAgICAgICBjb25zdCBpZnJhbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpZnJhbWUnKTtcclxuICAgICAgICBpZnJhbWUuc3JjID0gYGh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vbWFwcz8ke3F1ZXJ5U3RyaW5nfSZvdXRwdXQ9ZW1iZWRgO1xyXG4gICAgICAgIGlmcmFtZS5zdHlsZS5tYXhXaWR0aCA9IFwiMTAwJVwiO1xyXG4gICAgICAgIGlmcmFtZS5zdHlsZS5oZWlnaHQgPSBcIjQ1MHB4XCI7XHJcbiAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGlmcmFtZSk7XHJcbiAgICAgICAgdGhpcy5maW5hbGl6ZUVtYmVkKGNvbnRhaW5lcik7XHJcbiAgICB9XHJcblxyXG4gICAgZW1iZWRHaXN0KHVybE9iajogVVJMLCBzZXJ2aWNlOiBzdHJpbmcpIHtcclxuICAgICAgICBjb25zdCBnaXN0SWQgPSB1cmxPYmoucGF0aG5hbWUuc3BsaXQoJy8nKS5wb3AoKTtcclxuICAgICAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLmNyZWF0ZUVtYmVkQ29udGFpbmVyKCk7XHJcbiAgICAgICAgY29udGFpbmVyLnN0eWxlLndpZHRoID0gXCIxMDAlXCI7ICAvLyBFbnN1cmVzIHRoZSBjb250YWluZXIgYWRhcHRzIHRvIHRoZSBjb250ZW50IG9mIHRoZSBHaXN0XHJcbiAgICBcclxuICAgICAgICAvLyBEaWZmZXJlbnRpYXRpbmcgdGhlIHNvdXJjZSBiYXNlZCBvbiB0aGUgc2VydmljZVxyXG4gICAgICAgIGxldCBzcmM7XHJcbiAgICAgICAgaWYgKHNlcnZpY2UgPT09IFwiZ2l0aHViXCIpIHtcclxuICAgICAgICAgICAgc3JjID0gYGh0dHBzOi8vZ2lzdC5naXRodWIuY29tLyR7Z2lzdElkfS5qc2A7XHJcbiAgICAgICAgfSBlbHNlIGlmIChzZXJ2aWNlID09PSBcImdpdGxhYlwiKSB7XHJcbiAgICAgICAgICAgIC8vIEFzc3VtaW5nIEdpdExhYiBnaXN0cyBjYW4gYmUgZW1iZWRkZWQgaW4gYSBzaW1pbGFyIHdheSwgYWRqdXN0IGlmIG5lY2Vzc2FyeVxyXG4gICAgICAgICAgICBzcmMgPSBgaHR0cHM6Ly9naXRsYWIuY29tL3NuaXBwZXRzLyR7Z2lzdElkfS9yYXdgO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJVbnN1cHBvcnRlZCBzZXJ2aWNlIGZvciBlbWJlZGRpbmcgZ2lzdHNcIik7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICBcclxuICAgICAgICBjb25zdCBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcclxuICAgICAgICBzY3JpcHQuc3JjID0gc3JjO1xyXG4gICAgXHJcbiAgICAgICAgLy8gSGFuZGxpbmcgZXZlbnRzIGZvciB3aGVuIHRoZSBzY3JpcHQgaXMgbG9hZGVkXHJcbiAgICAgICAgc2NyaXB0Lm9ubG9hZCA9ICgpID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJHaXN0IGxvYWRlZCBzdWNjZXNzZnVsbHkgZnJvbSBcIiArIHNlcnZpY2UpO1xyXG4gICAgICAgICAgICAvLyBPcHRpb25hbDogYWRkaXRpb25hbCBjb2RlIHRvIHJ1biBhZnRlciB0aGUgR2lzdCBpcyBsb2FkZWRcclxuICAgICAgICB9O1xyXG4gICAgXHJcbiAgICAgICAgLy8gSGFuZGxpbmcgZXJyb3JzXHJcbiAgICAgICAgc2NyaXB0Lm9uZXJyb3IgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJGYWlsZWQgdG8gbG9hZCB0aGUgR2lzdCBmcm9tIFwiICsgc2VydmljZSk7XHJcbiAgICAgICAgICAgIC8vIE9wdGlvbmFsOiBsb2dpYyB0byBoYW5kbGUgbG9hZGluZyBlcnJvcnNcclxuICAgICAgICB9O1xyXG4gICAgXHJcbiAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKHNjcmlwdCk7XHJcbiAgICAgICAgdGhpcy5maW5hbGl6ZUVtYmVkKGNvbnRhaW5lcik7XHJcbiAgICB9XHJcblxyXG4gICAgZW1iZWRDb2RlcGVuKHVybE9iajogVVJMKSB7XHJcbiAgICAgICAgY29uc3QgcGFydHMgPSB1cmxPYmoucGF0aG5hbWUuc3BsaXQoJy8nKTtcclxuICAgICAgICBjb25zdCB1c2VyID0gcGFydHNbMV07XHJcbiAgICAgICAgY29uc3QgcGVuID0gcGFydHNbM107XHJcbiAgICAgICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5jcmVhdGVFbWJlZENvbnRhaW5lcigpO1xyXG4gICAgICAgIGNvbnN0IGlmcmFtZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpO1xyXG4gICAgICAgIGlmcmFtZS5zcmMgPSBgaHR0cHM6Ly9jb2RlcGVuLmlvLyR7dXNlcn0vZW1iZWQvJHtwZW59P2hlaWdodD0yNjUmdGhlbWUtaWQ9bGlnaHQmZGVmYXVsdC10YWI9anMscmVzdWx0YDtcclxuICAgICAgICBpZnJhbWUuc3R5bGUuYm9yZGVyID0gXCJub25lXCI7XHJcbiAgICAgICAgLy8gaWZyYW1lLmZyYW1lQm9yZGVyID0gXCIwXCI7XHJcbiAgICAgICAgaWZyYW1lLnN0eWxlLm1heFdpZHRoID0gJzEwMCUnO1xyXG4gICAgICAgIC8vIGlmcmFtZS5zdHlsZS5oZWlnaHQgPSBcIjMwMHB4XCI7XHJcblxyXG4gICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChpZnJhbWUpO1xyXG4gICAgICAgIHRoaXMuZmluYWxpemVFbWJlZChjb250YWluZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIGNyZWF0ZUVtYmVkQ29udGFpbmVyKCk6IEhUTUxFbGVtZW50IHtcclxuICAgICAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgICBkaXYuY2xhc3NMaXN0LmFkZChcImVtYmVkLWNvbnRhaW5lclwiLCBcImJhY2tncm91bmRcIik7XHJcbiAgICAgICAgcmV0dXJuIGRpdjtcclxuICAgIH1cclxuXHJcbiAgICBmaW5hbGl6ZUVtYmVkKGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5mb2N1c1N0YWNrLnBlZWsoKTtcclxuICAgICAgICBpZiAoZWxlbWVudCkge1xyXG4gICAgICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJyZXNpemFibGVcIik7XHJcbiAgICAgICAgICAgIHdoaWxlIChlbGVtZW50LmZpcnN0Q2hpbGQpIHtcclxuICAgICAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlQ2hpbGQoZWxlbWVudC5maXJzdENoaWxkKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKGNvbnRhaW5lcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuaGlkZSgpO1xyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gICAgc2V0IGlucHV0VmFsdWUodmFsdWU6IHN0cmluZykge1xyXG4gICAgICAgIGNvbnN0IGlucHV0VGV4dCA9IHRoaXMuaHRtbEVsZW1lbnQucXVlcnlTZWxlY3RvcihcImlucHV0XCIpO1xyXG4gICAgICAgIGlmIChpbnB1dFRleHQpIHtcclxuICAgICAgICAgICAgaW5wdXRUZXh0LnZhbHVlID0gdmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBkaXNwbGF5KCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIFwiZmxleFwiO1xyXG4gICAgfVxyXG5cclxuICAgIGF0dGFjaFVJRXZlbnQoKSB7XHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihDdXN0b21VSUV2ZW50cy5TaG93RWxlbWVudCwgdGhpcy5oYW5kbGVTaG93RWxlbWVudEV2ZW50LmJpbmQodGhpcykpO1xyXG4gICAgfVxyXG5cclxuICAgIGhhbmRsZVNob3dFbGVtZW50RXZlbnQoZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBldmVudCBhcyBDdXN0b21FdmVudDxJVUlFdmVudERldGFpbD47XHJcbiAgICAgICAgY29uc3QgZGV0YWlscyA9IGN1c3RvbUV2ZW50LmRldGFpbDtcclxuXHJcbiAgICAgICAgaWYgKGRldGFpbHMudGFyZ2V0SWQgPT0gdGhpcy5pZCkge1xyXG4gICAgICAgICAgICB0aGlzLnNob3coKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXR0YWNoRXZlbnRzKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuYXR0YWNoVUlFdmVudCgpO1xyXG5cclxuICAgICAgICBjb25zdCB1cGxvYWRUYWIgPSB0aGlzLmh0bWxFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjdXBsb2FkVGFiXCIpO1xyXG4gICAgICAgIHVwbG9hZFRhYj8uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5zZXRBY3RpdmVUYWIoJ3VwbG9hZFRhYicsICd1cGxvYWRDb250ZW50Jyk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGVtYmVkVGFiID0gdGhpcy5odG1sRWxlbWVudC5xdWVyeVNlbGVjdG9yKFwiI2VtYmVkVGFiXCIpO1xyXG4gICAgICAgIGVtYmVkVGFiPy5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnNldEFjdGl2ZVRhYignZW1iZWRUYWInLCAnZW1iZWRDb250ZW50Jyk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIGNvbnN0IHZpZGVvVGFiID0gdGhpcy5odG1sRWxlbWVudC5xdWVyeVNlbGVjdG9yKFwiI3ZpZGVvVGFiXCIpO1xyXG4gICAgICAgIC8vIHZpZGVvVGFiPy5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xyXG4gICAgICAgIC8vICAgICB0aGlzLnNldEFjdGl2ZVRhYigndmlkZW9UYWInLCAndmlkZW9Db250ZW50Jyk7XHJcbiAgICAgICAgLy8gfSk7XHJcblxyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRGVmYXVsdEpTRXZlbnRzLktleWRvd24sIHRoaXMuaGFuZGxlckV2ZW50LmJpbmQodGhpcykpO1xyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRGVmYXVsdEpTRXZlbnRzLkNsaWNrLCB0aGlzLmhhbmRsZXJBbm90aGVyRXZlbnQuYmluZCh0aGlzKSk7XHJcbiAgICB9XHJcblxyXG4gICAgaGFuZGxlckV2ZW50KGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XHJcbiAgICAgICAgaWYgKGV2ZW50LmtleSA9PSBLZXlib2FyZEtleXMuRXNjYXBlKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmNhbkhpZGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGhhbmRsZXJBbm90aGVyRXZlbnQoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcclxuICAgICAgICBjb25zdCBpbWFnZVJlcGxhY2UgPSBET01VdGlscy5maW5kQ2xpY2tlZEVsZW1lbnRPckFuY2VzdG9yQnlJZChldmVudCwgXCJlbWJlZEltYWdlXCIpO1xyXG4gICAgICAgIGlmIChpbWFnZVJlcGxhY2UpIHtcclxuICAgICAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmZvY3VzU3RhY2sucGVlaygpO1xyXG4gICAgICAgICAgICBpZiAoZWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5lbWJlZEltYWdlKGVsZW1lbnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCB2aWRlb1JlcGxhY2UgPSBET01VdGlscy5maW5kQ2xpY2tlZEVsZW1lbnRPckFuY2VzdG9yQnlJZChldmVudCwgXCJlbWJlZFZpZGVvXCIpO1xyXG4gICAgICAgIGlmICh2aWRlb1JlcGxhY2UpIHtcclxuICAgICAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmZvY3VzU3RhY2sucGVlaygpO1xyXG4gICAgICAgICAgICBpZiAoZWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5lbWJlZFZpZGVvKGVsZW1lbnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBjbGlja2VkSW5zaWRlID0gRE9NVXRpbHMuZmluZENsaWNrZWRFbGVtZW50T3JBbmNlc3RvckJ5SWQoZXZlbnQsIHRoaXMuaWQpO1xyXG4gICAgICAgIGlmICghY2xpY2tlZEluc2lkZSAmJiB0aGlzLmlzVmlzaWJsZSkge1xyXG4gICAgICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgdGhpcy5oaWRlKCk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IERPTVV0aWxzLmZpbmRDbGlja2VkRWxlbWVudE9yQW5jZXN0b3JCeUNsYXNzKGV2ZW50LCBcInRlbXAtaW1hZ2UtcmVwbGFjZVwiKTtcclxuICAgICAgICBpZiAoY29udGFpbmVyKSB7XHJcbiAgICAgICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICB0aGlzLmZvY3VzU3RhY2sucHVzaChjb250YWluZXIpO1xyXG4gICAgICAgICAgICB0aGlzLnNob3coKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgdmlkZW9Db250YWluZXIgPSBET01VdGlscy5maW5kQ2xpY2tlZEVsZW1lbnRPckFuY2VzdG9yQnlDbGFzcyhldmVudCwgXCJ0ZW1wLXZpZGVvLXJlcGxhY2VcIik7XHJcbiAgICAgICAgaWYgKHZpZGVvQ29udGFpbmVyKSB7XHJcbiAgICAgICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICB0aGlzLmZvY3VzU3RhY2sucHVzaCh2aWRlb0NvbnRhaW5lcik7XHJcbiAgICAgICAgICAgIHRoaXMuc2hvdygpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICBnZXRUYWIodGFiSWQ6IHN0cmluZyk6IEhUTUxFbGVtZW50IHwgbnVsbCB7XHJcbiAgICAgICAgcmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRhYklkKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRDb250ZW50KGNvbnRlbnRJZDogc3RyaW5nKTogSFRNTEVsZW1lbnQgfCBudWxsIHtcclxuICAgICAgICByZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoY29udGVudElkKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRBY3RpdmVUYWIodGFiSWQ6IHN0cmluZywgY29udGVudElkOiBzdHJpbmcpIHtcclxuICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcubmF2LWl0ZW0nKS5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICBpdGVtLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5jb250ZW50LWRhdGEnKS5mb3JFYWNoKGNvbnRlbnQgPT4ge1xyXG4gICAgICAgICAgICBjb250ZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmdldFRhYih0YWJJZCk/LmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xyXG4gICAgICAgIHRoaXMuZ2V0Q29udGVudChjb250ZW50SWQpPy5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcclxuICAgIH1cclxuXHJcbiAgICBlbWJlZEltYWdlKGltYWdlUmVwbGFjZUVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XHJcbiAgICAgICAgY29uc3QgdXJsID0gKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNlbWJlZENvbnRlbnQgaW5wdXRbdHlwZT10ZXh0XScpIGFzIEhUTUxJbnB1dEVsZW1lbnQpPy52YWx1ZTtcclxuICAgICAgICBjb25zb2xlLmxvZygnRW1iZWRkaW5nIGltYWdlIGZyb20gVVJMOicsIHVybCk7XHJcblxyXG4gICAgICAgIGNvbnN0IGNvbnRlbnRFbGVtZW50ID0gaW1hZ2VSZXBsYWNlRWxlbWVudC5jbG9zZXN0KFwiLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudFwiKTtcclxuICAgICAgICBpZiAoY29udGVudEVsZW1lbnQpIHtcclxuICAgICAgICAgICAgd2hpbGUgKGNvbnRlbnRFbGVtZW50LmZpcnN0Q2hpbGQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGNvbnRlbnRFbGVtZW50LmZpcnN0Q2hpbGQpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCBpbWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTtcclxuICAgICAgICAgICAgaW1nLmNvbnRlbnRFZGl0YWJsZSA9IFwidHJ1ZVwiO1xyXG4gICAgICAgICAgICBpbWcuc3JjID0gdXJsO1xyXG4gICAgICAgICAgICBpbWcuYWx0ID0gJ0VtYmVkZGVkIEltYWdlJztcclxuICAgICAgICAgICAgaW1nLnN0eWxlLm1heFdpZHRoID0gJzEwMCUnO1xyXG4gICAgICAgICAgICBpbWcuc3R5bGUud2lkdGggPSAnYXV0byc7XHJcbiAgICAgICAgICAgIGltZy5zdHlsZS5oZWlnaHQgPSAnYXV0byc7XHJcblxyXG5cclxuICAgICAgICAgICAgY29udGVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZChcInJlc2l6YWJsZVwiKTtcclxuICAgICAgICAgICAgaW1nLmNsYXNzTGlzdC5hZGQoXCJiYWNrZ3JvdW5kXCIpO1xyXG5cclxuICAgICAgICAgICAgY29udGVudEVsZW1lbnQuYXBwZW5kQ2hpbGQoaW1nKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdObyBjb250ZW50IGVsZW1lbnQgZm91bmQgd2l0aCBkYXRhLWNvbnRlbnQtdHlwZT1cImltYWdlXCInKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuaGlkZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGVtYmVkVmlkZW8odmlkZW9SZXBsYWNlRWxlbWVudDogSFRNTEVsZW1lbnQpIHtcclxuICAgICAgICBjb25zdCB1cmwgPSAoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3ZpZGVvQ29udGVudCBpbnB1dFt0eXBlPXRleHRdJykgYXMgSFRNTElucHV0RWxlbWVudCk/LnZhbHVlO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCdFbWJlZGRpbmcgdmlkZW8gZnJvbSBVUkw6JywgdXJsKTtcclxuXHJcbiAgICAgICAgY29uc3QgY29udGVudEVsZW1lbnQgPSB2aWRlb1JlcGxhY2VFbGVtZW50LmNsb3Nlc3QoXCIuam9oYW5uZXMtY29udGVudC1lbGVtZW50XCIpO1xyXG4gICAgICAgIGlmIChjb250ZW50RWxlbWVudCkge1xyXG4gICAgICAgICAgICB3aGlsZSAoY29udGVudEVsZW1lbnQuZmlyc3RDaGlsZCkge1xyXG4gICAgICAgICAgICAgICAgY29udGVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoY29udGVudEVsZW1lbnQuZmlyc3RDaGlsZCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHZpZGVvSWQgPSBuZXcgVVJMKHVybCkuc2VhcmNoUGFyYW1zLmdldCgndicpO1xyXG4gICAgICAgICAgICBpZiAodmlkZW9JZCkge1xyXG4gICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgY29udGFpbmVyIGZvciB0aGUgaWZyYW1lXHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCd2aWRlby1jb250YWluZXInKTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBpZnJhbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpZnJhbWUnKTtcclxuICAgICAgICAgICAgICAgIGlmcmFtZS5zcmMgPSBgaHR0cHM6Ly93d3cueW91dHViZS5jb20vZW1iZWQvJHt2aWRlb0lkfWA7XHJcbiAgICAgICAgICAgICAgICBpZnJhbWUuZnJhbWVCb3JkZXIgPSBcIjBcIjtcclxuXHJcbiAgICAgICAgICAgICAgICBpZnJhbWUuYWxsb3cgPSBcImFjY2VsZXJvbWV0ZXI7IGF1dG9wbGF5OyBjbGlwYm9hcmQtd3JpdGU7IGVuY3J5cHRlZC1tZWRpYTsgZ3lyb3Njb3BlOyBwaWN0dXJlLWluLXBpY3R1cmVcIjtcclxuICAgICAgICAgICAgICAgIGlmcmFtZS5hbGxvd0Z1bGxzY3JlZW4gPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChpZnJhbWUpO1xyXG4gICAgICAgICAgICAgICAgY29udGVudEVsZW1lbnQuYXBwZW5kQ2hpbGQoY29udGFpbmVyKTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb250ZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKFwicmVzaXphYmxlXCIpO1xyXG4gICAgICAgICAgICAgICAgaWZyYW1lLmNsYXNzTGlzdC5hZGQoXCJiYWNrZ3JvdW5kXCIpO1xyXG5cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ludmFsaWQgWW91VHViZSBVUkwnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ05vIGNvbnRlbnQgZWxlbWVudCBmb3VuZCB3aXRoIGRhdGEtY29udGVudC10eXBlPVwidmlkZW9cIicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5oaWRlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgc2hvdygpOiB2b2lkIHtcclxuXHJcbiAgICAgICAgY29uc3QgbGFzdEZvY3VzZWQgPSB0aGlzLmZvY3VzU3RhY2sucGVlaygpO1xyXG4gICAgICAgIGlmIChsYXN0Rm9jdXNlZCkge1xyXG4gICAgICAgICAgICB0aGlzLmNoYW5nZVRvb2xiYXJQb3NpdGlvblRvQmVDbG9zZWRUbyhsYXN0Rm9jdXNlZCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSBcInZpc2libGVcIjtcclxuICAgICAgICBzdXBlci5zaG93KCk7XHJcbiAgICB9XHJcblxyXG4gICAgaGlkZSgpIHtcclxuICAgICAgICB0aGlzLmlucHV0VmFsdWUgPSBcIlwiO1xyXG4gICAgICAgIHN1cGVyLmhpZGUoKTtcclxuICAgIH1cclxuXHJcbiAgICBjaGFuZ2VUb29sYmFyUG9zaXRpb25Ub0JlQ2xvc2VkVG8oZWxlbWVudDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCByZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuXHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gXCJmbGV4XCI7XHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gXCJoaWRkZW5cIjtcclxuXHJcbiAgICAgICAgY29uc3QgdGFyZ2V0TWlkcG9pbnQgPSByZWN0LmxlZnQgKyB3aW5kb3cuc2Nyb2xsWCArIChyZWN0LndpZHRoIC8gMik7XHJcbiAgICAgICAgbGV0IGxlZnRQb3NpdGlvbiA9IHRhcmdldE1pZHBvaW50IC0gKHRoaXMuaHRtbEVsZW1lbnQub2Zmc2V0V2lkdGggLyAyKTtcclxuICAgICAgICBsZXQgdG9wUG9zaXRpb24gPSByZWN0LmJvdHRvbSArIHdpbmRvdy5zY3JvbGxZICsgMTA7XHJcblxyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUubGVmdCA9IGAke2xlZnRQb3NpdGlvbn1weGA7XHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5zdHlsZS50b3AgPSBgJHt0b3BQb3NpdGlvbn1weGA7XHJcbiAgICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgTWVkaWFJbnB1dHRlciB9IGZyb20gXCJAL2NvbXBvbmVudHMvbWVkaWEtaW5wdXR0ZXIvTWVkaWFJbnB1dHRlclwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIE1lZGlhSW5wdXR0ZXJCdWlsZGVyIHtcclxuICAgIHN0YXRpYyBidWlsZCgpOiBNZWRpYUlucHV0dGVyIHtcclxuXHJcbiAgICAgICAgY29uc3QgbWVkaWFJbnB1dHRlciA9IG5ldyBNZWRpYUlucHV0dGVyKCk7XHJcblxyXG4gICAgICAgIHJldHVybiBtZWRpYUlucHV0dGVyO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgRWRpdG9yIH0gZnJvbSBcIkAvY29tcG9uZW50cy9lZGl0b3IvRWRpdG9yXCI7XHJcbmltcG9ydCB7IEFkZEJsb2NrQnVpbGRlciB9IGZyb20gXCIuL0FkZEJsb2NrQnVpbGRlclwiO1xyXG5pbXBvcnQgeyBUZXh0Q29udGV4dEZsb2F0aW5nVG9vbGJhckJ1aWxkZXIgfSBmcm9tIFwiLi9UZXh0Q29udGV4dEZsb2F0aW5nVG9vbGJhckJ1aWxkZXJcIjtcclxuaW1wb3J0IHsgUXVpY2tNZW51QnVpbGRlciB9IGZyb20gXCIuL1F1aWNrTWVudUJ1aWxkZXJcIjtcclxuaW1wb3J0IHsgVGl0bGVCdWlsZGVyIH0gZnJvbSBcIi4vVGl0bGVCdWlsZGVyXCI7XHJcbmltcG9ydCB7IENvbnRlbnRCdWlsZGVyIH0gZnJvbSBcIi4vQ29udGVudEJ1aWxkZXJcIjtcclxuaW1wb3J0IHsgVGFibGVDb250ZXh0RmxvYXRpbmdUb29sYmFyQnVpbGRlciB9IGZyb20gXCIuL1RhYmxlQ29udGV4dEZsb2F0aW5nVG9vbGJhckJ1aWxkZXJcIjtcclxuaW1wb3J0IHsgTWVkaWFJbnB1dHRlckJ1aWxkZXIgfSBmcm9tIFwiLi9NZWRpYUlucHV0dGVyQnVpbGRlclwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIEVkaXRvckJ1aWxkZXIge1xyXG5cclxuICAgIHN0YXRpYyBidWlsZCgpOiBFZGl0b3Ige1xyXG5cclxuICAgICAgICBjb25zdCBlZGl0b3IgPSBFZGl0b3IuZ2V0SW5zdGFuY2UoXHJcbiAgICAgICAgICAgIFRpdGxlQnVpbGRlci5idWlsZCgpLFxyXG4gICAgICAgICAgICBDb250ZW50QnVpbGRlci5idWlsZCgpLFxyXG4gICAgICAgICAgICBBZGRCbG9ja0J1aWxkZXIuYnVpbGQoKSxcclxuICAgICAgICAgICAgVGV4dENvbnRleHRGbG9hdGluZ1Rvb2xiYXJCdWlsZGVyLmJ1aWxkKCksXHJcbiAgICAgICAgICAgIFF1aWNrTWVudUJ1aWxkZXIuYnVpbGQoKSxcclxuICAgICAgICAgICAgVGFibGVDb250ZXh0RmxvYXRpbmdUb29sYmFyQnVpbGRlci5idWlsZCgpLFxyXG4gICAgICAgICAgICBNZWRpYUlucHV0dGVyQnVpbGRlci5idWlsZCgpXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGVkaXRvcjtcclxuICAgIH1cclxufSIsImltcG9ydCB7IEVkaXRvciB9IGZyb20gXCIuLi9jb21wb25lbnRzL2VkaXRvci9FZGl0b3JcIjtcclxuaW1wb3J0IGljb25zIGZyb20gXCIuLi9hc3NldHMvaW1nL2ljb25zLnN2Z1wiO1xyXG5pbXBvcnQgeyBFZGl0b3JCdWlsZGVyIH0gZnJvbSBcIi4vRWRpdG9yQnVpbGRlclwiO1xyXG5cclxuLyoqXHJcbiAqIFNpbmdsZXRvbiBjbGFzcyByZXNwb25zaWJsZSBmb3IgYnVpbGRpbmcgYW5kIG1hbmFnaW5nIHRoZSB1c2VyIGludGVyZmFjZSBvZiB0aGUgZWRpdG9yLlxyXG4gKiBFbnN1cmVzIHRoYXQgb25seSBvbmUgaW5zdGFuY2Ugb2YgVUlCdWlsZGVyIGNhbiBleGlzdCwgbWFuYWdpbmcgdGhlIGNyZWF0aW9uIGFuZCBjb25maWd1cmF0aW9uIG9mIHRoZSBlZGl0b3IuXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgVUlCdWlsZGVyIHtcclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZTogVUlCdWlsZGVyO1xyXG5cclxuICAgIHByaXZhdGUgZWRpdG9yOiBFZGl0b3I7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcml2YXRlIGNvbnN0cnVjdG9yIGZvciBVSUJ1aWxkZXIgdG8gZW5mb3JjZSBzaW5nbGV0b24gcGF0dGVybi5cclxuICAgICAqIEluaXRpYWxpemVzIHRoZSBVSUJ1aWxkZXIgaW5zdGFuY2Ugd2l0aCBhIGdpdmVuIGVkaXRvci5cclxuICAgICAqIEBwYXJhbSB7RWRpdG9yfSBlZGl0b3IgVGhlIGVkaXRvciBpbnN0YW5jZSB0byBiZSBtYW5hZ2VkIGJ5IFVJQnVpbGRlci5cclxuICAgICAqIEB0aHJvd3Mge0Vycm9yfSBUaHJvd3MgYW4gZXJyb3IgaWYgYW4gaW5zdGFuY2Ugb2YgVUlCdWlsZGVyIGFscmVhZHkgZXhpc3RzLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKGVkaXRvcjogRWRpdG9yKSB7XHJcblxyXG4gICAgICAgIGlmIChVSUJ1aWxkZXIuaW5zdGFuY2UpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmVkaXRvciA9IGVkaXRvcjtcclxuXHJcbiAgICAgICAgVUlCdWlsZGVyLmluc3RhbmNlID0gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFN0YXRpYyBtZXRob2QgdG8gZ2V0IG9yIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiBVSUJ1aWxkZXIuXHJcbiAgICAgKiBUaGlzIG1ldGhvZCBpbXBsZW1lbnRzIHRoZSBzaW5nbGV0b24gcGF0dGVybiBhbmQgZW5zdXJlcyB0aGF0IFVJQnVpbGRlciBpcyBvbmx5IGluc3RhbnRpYXRlZCBvbmNlLlxyXG4gICAgICogQHJldHVybnMge1VJQnVpbGRlcn0gUmV0dXJucyB0aGUgZXhpc3Rpbmcgb3IgbmV3IFVJQnVpbGRlciBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgc3RhdGljIGJ1aWxkKCk6IFVJQnVpbGRlciB7XHJcblxyXG4gICAgICAgIGlmIChVSUJ1aWxkZXIuaW5zdGFuY2UpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFVJQnVpbGRlci5pbnN0YW5jZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgVUlCdWlsZGVyKEVkaXRvckJ1aWxkZXIuYnVpbGQoKSk7XHJcblxyXG4gICAgICAgIHJldHVybiBidWlsZGVyO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW5pdGlhbGl6ZXMgdGhlIGVkaXRvciBieSBpbnNlcnRpbmcgbmVjZXNzYXJ5IGljb25zIGFuZCByZXR1cm5pbmcgdGhlIGVkaXRvciBpbnN0YW5jZS5cclxuICAgICAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgdG8gc3RhcnQgdGhlIGVkaXRvciBhbmQgcHJlcGFyZSBhbGwgVUkgY29tcG9uZW50cy5cclxuICAgICAqIEByZXR1cm5zIHtFZGl0b3J9IFRoZSBpbml0aWFsaXplZCBlZGl0b3IgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIHN0YXJ0KCk6IEVkaXRvciB7XHJcblxyXG4gICAgICAgIHRoaXMuaW5zZXJ0SWNvbnMoKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZWRpdG9yO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgKiBJbnNlcnRzIGEgY29udGFpbmVyIHdpdGggU1ZHIGljb25zIGludG8gdGhlIGRvY3VtZW50IGJvZHkuIFRoaXMgbWV0aG9kIGVuc3VyZXMgdGhhdFxyXG4gICAgKiB0aGUgaWNvbnMgYXJlIG9ubHkgaW5zZXJ0ZWQgb25jZSB0byBwcmV2ZW50IGR1cGxpY2F0ZSBlbnRyaWVzLlxyXG4gICAgKi9cclxuICAgIGluc2VydEljb25zKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICghZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnN2Zy1pY29ucy1jb250YWluZXInKSkge1xyXG4gICAgICAgICAgICBjb25zdCBzdmdDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuXHJcbiAgICAgICAgICAgIHN2Z0NvbnRhaW5lci5pbm5lckhUTUwgPSBpY29ucztcclxuICAgICAgICAgICAgc3ZnQ29udGFpbmVyLmNsYXNzTmFtZSA9ICdzdmctaWNvbnMtY29udGFpbmVyJztcclxuXHJcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoc3ZnQ29udGFpbmVyKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBDdXN0b21FdmVudHMgfSBmcm9tIFwiQC9jb21tb24vQ3VzdG9tRXZlbnRzXCI7XHJcbmltcG9ydCB7IENvbW1hbmRzIH0gZnJvbSBcIi4vQ29tbWFuZHNcIjtcclxuaW1wb3J0IHsgQmxvY2tPcGVyYXRpb25zU2VydmljZSB9IGZyb20gXCJAL3NlcnZpY2VzL2Jsb2NrLW9wZXJhdGlvbnMvQmxvY2tPcGVyYXRpb25zU2VydmljZVwiO1xyXG5pbXBvcnQgeyBJQ29tbWFuZEV2ZW50RGV0YWlsIH0gZnJvbSBcIi4vSUNvbW1hbmRFdmVudERldGFpbFwiO1xyXG5pbXBvcnQgeyBEZXBlbmRlbmN5Q29udGFpbmVyIH0gZnJvbSBcIkAvY29yZS9EZXBlbmRlbmN5Q29udGFpbmVyXCI7XHJcbmltcG9ydCB7IElCbG9ja09wZXJhdGlvbnNTZXJ2aWNlIH0gZnJvbSBcIkAvc2VydmljZXMvYmxvY2stb3BlcmF0aW9ucy9JQmxvY2tPcGVyYXRpb25zU2VydmljZVwiO1xyXG5pbXBvcnQgeyBJVGFibGVPcGVyYXRpb25zU2VydmljZSB9IGZyb20gXCJAL3NlcnZpY2VzL3RhYmxlLW9wZXJhdGlvbnMvSVRhYmxlT3BlcmF0aW9uc1NlcnZpY2VcIjtcclxuaW1wb3J0IHsgSVRleHRPcGVyYXRpb25zU2VydmljZSB9IGZyb20gXCJAL3NlcnZpY2VzL3RleHQtb3BlcmF0aW9ucy9JVGV4dE9wZXJhdGlvbnNTZXJ2aWNlXCI7XHJcbmltcG9ydCB7IFRhYmxlU2NvcGVzIH0gZnJvbSBcIkAvc2VydmljZXMvdGFibGUtb3BlcmF0aW9ucy9UYWJsZVNjb3Blc1wiO1xyXG5pbXBvcnQgeyBDb2xvcnMgfSBmcm9tIFwiQC9jb21tb24vQ29sb3JzXCI7XHJcblxyXG4vKipcclxuICogQ2VudHJhbCBjb21tYW5kIGRpc3BhdGNoZXIgY2xhc3MgZm9yIGhhbmRsaW5nIHZhcmlvdXMgZWRpdG9yIGNvbW1hbmRzIHJlbGF0ZWQgdG8gdGV4dCBhbmQgYmxvY2sgbWFuaXB1bGF0aW9uLlxyXG4gKiBUaGlzIGNsYXNzIGVuY2Fwc3VsYXRlcyB0aGUgbG9naWMgbmVlZGVkIHRvIGV4ZWN1dGUgY29tbWFuZHMgc3VjaCBhcyBib2xkLCBpdGFsaWMsIHVuZGVybGluZSwgY29sb3IgY2hhbmdlcywgYW5kIHN0cnVjdHVyYWwgbW9kaWZpY2F0aW9ucyB0byBjb250ZW50IGJsb2NrcyB3aXRoaW4gYW4gZWRpdG9yLlxyXG4gKlxyXG4gKiBAY2xhc3NcclxuICogQHNpbmdsZXRvblxyXG4gKiBNZXRob2RzIGluIHRoaXMgY2xhc3MgYXJlIHRyaWdnZXJlZCBieSBldmVudCBsaXN0ZW5lcnMgdGhhdCBsaXN0ZW4gZm9yIGN1c3RvbSBldmVudHMgd2hpY2ggZGljdGF0ZSB0aGUgdHlwZSBvZiBjb21tYW5kIHRvIGJlIGV4ZWN1dGVkLlxyXG4gKlxyXG4gKiBFeGFtcGxlIHVzYWdlOlxyXG4gKiBgYGBqYXZhc2NyaXB0XHJcbiAqIGNvbnN0IGNvbW1hbmREaXNwYXRjaGVyID0gQ29tbWFuZERpc3BhdGNoZXIuZ2V0SW5zdGFuY2UoKTtcclxuICogY29tbWFuZERpc3BhdGNoZXIubGlzdGVuKCk7ICAvLyBTdGFydCBsaXN0ZW5pbmcgZm9yIGNvbW1hbmQgYW5kIHNlbGVjdGlvbiBjaGFuZ2UgZXZlbnRzLlxyXG4gKiBgYGBcclxuICovXHJcbmV4cG9ydCBjbGFzcyBDb21tYW5kRGlzcGF0Y2hlciB7XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IENvbW1hbmREaXNwYXRjaGVyIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gICAgcHJpdmF0ZSBibG9ja09wZXJhdGlvbnNTZXJ2aWNlOiBJQmxvY2tPcGVyYXRpb25zU2VydmljZTtcclxuICAgIHByaXZhdGUgdGFibGVPcGVyYXRpb25zU2VydmljZTogSVRhYmxlT3BlcmF0aW9uc1NlcnZpY2U7XHJcbiAgICBwcml2YXRlIHRleHRPcGVyYXRpb25zU2VydmljZTogSVRleHRPcGVyYXRpb25zU2VydmljZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFByaXZhdGUgY29uc3RydWN0b3IgdG8gZW5mb3JjZSBzaW5nbGV0b24gcGF0dGVybi5cclxuICAgICAqIFRocm93cyBhbiBlcnJvciBpZiBhdHRlbXB0ZWQgdG8gYmUgaW5zdGFudGlhdGVkIG1vcmUgdGhhbiBvbmNlLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIGJsb2NrT3BlcmF0aW9uc1NlcnZpY2U6IElCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLFxyXG4gICAgICAgIHRleHRPcGVyYXRpb25TZXJ2aWNlOiBJVGV4dE9wZXJhdGlvbnNTZXJ2aWNlLFxyXG4gICAgICAgIHRhYmxlT3BlcmF0aW9uc1NlcnZpY2U6IElUYWJsZU9wZXJhdGlvbnNTZXJ2aWNlKSB7XHJcblxyXG4gICAgICAgIGlmIChDb21tYW5kRGlzcGF0Y2hlci5pbnN0YW5jZSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBdHRlbXB0IHRvIGluc3RhbnRpYXRlIHNpbmdsZXRvbiBgQ29tbWFuZERpc3BhdGNoZXJgIG1vcmUgdGhhbiBvbmNlLlwiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuYmxvY2tPcGVyYXRpb25zU2VydmljZSA9IGJsb2NrT3BlcmF0aW9uc1NlcnZpY2U7XHJcbiAgICAgICAgdGhpcy50ZXh0T3BlcmF0aW9uc1NlcnZpY2UgPSB0ZXh0T3BlcmF0aW9uU2VydmljZTtcclxuICAgICAgICB0aGlzLnRhYmxlT3BlcmF0aW9uc1NlcnZpY2UgPSB0YWJsZU9wZXJhdGlvbnNTZXJ2aWNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0cmlldmVzIG9yIGNyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgQ29tbWFuZERpc3BhdGNoZXIuXHJcbiAgICAgKiBAcmV0dXJucyB7Q29tbWFuZERpc3BhdGNoZXJ9IFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIENvbW1hbmREaXNwYXRjaGVyLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldEluc3RhbmNlKCk6IENvbW1hbmREaXNwYXRjaGVyIHtcclxuXHJcbiAgICAgICAgY29uc3QgYmxvY2tPcGVyYXRpb25zU2VydmljZSA9IERlcGVuZGVuY3lDb250YWluZXIuSW5zdGFuY2UucmVzb2x2ZTxJQmxvY2tPcGVyYXRpb25zU2VydmljZT4oXCJJQmxvY2tPcGVyYXRpb25zU2VydmljZVwiKTtcclxuICAgICAgICBjb25zdCB0ZXh0T3BlcmF0aW9uU2VydmljZSA9IERlcGVuZGVuY3lDb250YWluZXIuSW5zdGFuY2UucmVzb2x2ZTxJVGV4dE9wZXJhdGlvbnNTZXJ2aWNlPihcIklUZXh0T3BlcmF0aW9uc1NlcnZpY2VcIik7XHJcbiAgICAgICAgY29uc3QgdGFibGVPcGVyYXRpb25zU2VydmljZSA9IERlcGVuZGVuY3lDb250YWluZXIuSW5zdGFuY2UucmVzb2x2ZTxJVGFibGVPcGVyYXRpb25zU2VydmljZT4oXCJJVGFibGVPcGVyYXRpb25zU2VydmljZVwiKTtcclxuXHJcbiAgICAgICAgaWYgKCFDb21tYW5kRGlzcGF0Y2hlci5pbnN0YW5jZSkge1xyXG4gICAgICAgICAgICBDb21tYW5kRGlzcGF0Y2hlci5pbnN0YW5jZSA9IG5ldyBDb21tYW5kRGlzcGF0Y2hlcihibG9ja09wZXJhdGlvbnNTZXJ2aWNlLCB0ZXh0T3BlcmF0aW9uU2VydmljZSwgdGFibGVPcGVyYXRpb25zU2VydmljZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBDb21tYW5kRGlzcGF0Y2hlci5pbnN0YW5jZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEluaXRpYWxpemVzIGxpc3RlbmVycyBmb3IgdmFyaW91cyBlZGl0b3ItcmVsYXRlZCBldmVudHMgc3VjaCBhcyBjb21tYW5kIHJlcXVlc3RzIGFuZCBzZWxlY3Rpb24gY2hhbmdlcy5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGxpc3RlbigpOiB2b2lkIHtcclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEN1c3RvbUV2ZW50cy5lbWl0dGVkQ29tbWFuZCwgdGhpcy5oYW5kbGVDb21tYW5kRXZlbnQgYXMgRXZlbnRMaXN0ZW5lcik7XHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihDdXN0b21FdmVudHMuZm9jdXNPbkZpcnN0UmVxdWVzdGVkLCB0aGlzLmhhbmRsZUZvY3VzT25GaXJzdFJlcXVlc3RlZEV2ZW50KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEhhbmRsZXMgY29tbWFuZCBldmVudHMgZGlzcGF0Y2hlZCBmcm9tIFVJIGNvbXBvbmVudHMgb3Igb3RoZXIgcGFydHMgb2YgdGhlIGFwcGxpY2F0aW9uLlxyXG4gICAgICogQHBhcmFtIHtDdXN0b21FdmVudDxJQ29tbWFuZEV2ZW50RGV0YWlsPn0gZXZlbnQgLSBUaGUgZXZlbnQgb2JqZWN0IGNvbnRhaW5pbmcgZGV0YWlscyBhYm91dCB0aGUgY29tbWFuZC5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBoYW5kbGVDb21tYW5kRXZlbnQgPSAoZXZlbnQ6IEN1c3RvbUV2ZW50PElDb21tYW5kRXZlbnREZXRhaWw+KTogdm9pZCA9PiB7XHJcbiAgICAgICAgY29uc3QgeyBjb21tYW5kLCBzaG93VUksIHZhbHVlLCB0YXJnZXRCbG9ja1R5cGUsIGJsb2NrLCBzY29wZSB9ID0gZXZlbnQuZGV0YWlsO1xyXG5cclxuICAgICAgICBzd2l0Y2ggKGNvbW1hbmQpIHtcclxuICAgICAgICAgICAgY2FzZSBDb21tYW5kcy50b2dnbGVCb2xkOlxyXG4gICAgICAgICAgICAgICAgdGhpcy50ZXh0T3BlcmF0aW9uc1NlcnZpY2UuZXhlY0JvbGQoKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIENvbW1hbmRzLnRvZ2dsZUl0YWxpYzpcclxuICAgICAgICAgICAgICAgIHRoaXMudGV4dE9wZXJhdGlvbnNTZXJ2aWNlLmV4ZWNJdGFsaWMoKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIENvbW1hbmRzLnRvZ2dsZVVuZGVybGluZTpcclxuICAgICAgICAgICAgICAgIHRoaXMudGV4dE9wZXJhdGlvbnNTZXJ2aWNlLmV4ZWNVbmRlcmxpbmUoKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIENvbW1hbmRzLnRvZ2dsZVN0cmlrZVRocm91Z2g6XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRleHRPcGVyYXRpb25zU2VydmljZS5leGVjU3RyaWtlVGhyb3VnaCgpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgQ29tbWFuZHMudG9nZ2xlSGlsaXRlQ29sb3I6XHJcbiAgICAgICAgICAgICAgICBpZiAoIXZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke0NvbW1hbmRzLnRvZ2dsZUhpbGl0ZUNvbG9yfSByZXF1aXJlcyBhIGNvbG9yIHZhbHVlYCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRleHRPcGVyYXRpb25zU2VydmljZS5leGVjSGlsaXRlQ29sb3IodmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgQ29tbWFuZHMudG9nZ2xlRm9yZUNvbG9yOlxyXG4gICAgICAgICAgICAgICAgaWYgKCF2YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtDb21tYW5kcy50b2dnbGVGb3JlQ29sb3J9IHJlcXVpcmVzIGEgY29sb3IgdmFsdWVgKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMudGV4dE9wZXJhdGlvbnNTZXJ2aWNlLmV4ZWNGb3JlQ29sb3IodmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgQ29tbWFuZHMudHJhbnNmb3JtQmxvY2s6XHJcbiAgICAgICAgICAgICAgICBpZiAoIXZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke0NvbW1hbmRzLnRyYW5zZm9ybUJsb2NrfSByZXF1aXJlcyBhIHZhbHVlIHRoYXQgcmVwcmVzZW50cyB0aGUgdGFyZ2V0IGVsZW1lbnQgdHlwZS5gKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuZXhlY1RyYW5zZm9ybUJsb2NrKHZhbHVlKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIENvbW1hbmRzLmR1cGxpY2F0ZUJsb2NrOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5leGVjRHVwbGljYXRlQmxvY2soKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIENvbW1hbmRzLmRlbGV0ZUJsb2NrOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5leGVjRGVsZXRlQmxvY2soKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIENvbW1hbmRzLnJlbW92ZUZvcm1hdDpcclxuICAgICAgICAgICAgICAgIHRoaXMuZXhlY1JlbW92ZUZvcm1hdCgpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgQ29tbWFuZHMuY3JlYXRlRGVmYXVsdEJsb2NrOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5leGVjQ3JlYXRlRGVmYXVsdEJsb2NrKCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBDb21tYW5kcy5pbnNlcnROZXc6XHJcbiAgICAgICAgICAgICAgICB0aGlzLmV4ZWNJbnNlcnROZXcoKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIENvbW1hbmRzLmZvY3VzT25QcmV2aW91c0Jsb2NrOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5leGVjRm9jdXNPblByZXZpb3VzQmxvY2soKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIENvbW1hbmRzLmluc2VydFRhYmxlQ29sdW1uTGVmdDpcclxuICAgICAgICAgICAgICAgIHRoaXMudGFibGVPcGVyYXRpb25zU2VydmljZS5pbnNlcnRDb2x1bW5MZWZ0KCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBDb21tYW5kcy5pbnNlcnRUYWJsZUNvbHVtblJpZ2h0OlxyXG4gICAgICAgICAgICAgICAgdGhpcy50YWJsZU9wZXJhdGlvbnNTZXJ2aWNlLmluc2VydENvbHVtblJpZ2h0KGJsb2NrIHx8IG51bGwpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgQ29tbWFuZHMuaW5zZXJ0VGFibGVSb3dBYm92ZTpcclxuICAgICAgICAgICAgICAgIHRoaXMudGFibGVPcGVyYXRpb25zU2VydmljZS5pbnNlcnRSb3dBYm92ZSgpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgQ29tbWFuZHMuaW5zZXJ0VGFibGVSb3dCZWxvdzpcclxuICAgICAgICAgICAgICAgIHRoaXMudGFibGVPcGVyYXRpb25zU2VydmljZS5pbnNlcnRSb3dCZWxvdyhibG9jayB8fCBudWxsKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIENvbW1hbmRzLnRvZ2dsZUNlbGxIaWxpdGVDb2xvcjpcclxuICAgICAgICAgICAgICAgIGlmICghdmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7Q29tbWFuZHMudG9nZ2xlQ2VsbEhpbGl0ZUNvbG9yfSByZXF1aXJlcyBhIHZhbHVlIHRoYXQgcmVwcmVzZW50cyB0aGUgY2VsbCBiYWNrZ3JvdW5kIGNvbG9yLmApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy50YWJsZU9wZXJhdGlvbnNTZXJ2aWNlLmV4ZWNDZWxsQmFja2dyb3VuZENvbG9yKHZhbHVlKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIENvbW1hbmRzLnJlbW92ZUNvbHVtbjpcclxuICAgICAgICAgICAgICAgIHRoaXMudGFibGVPcGVyYXRpb25zU2VydmljZS5yZW1vdmVDb2x1bW4oKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIENvbW1hbmRzLnJlbW92ZVJvdzpcclxuICAgICAgICAgICAgICAgIHRoaXMudGFibGVPcGVyYXRpb25zU2VydmljZS5yZW1vdmVSb3coKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIENvbW1hbmRzLnJlbW92ZVJvdzpcclxuICAgICAgICAgICAgICAgIHRoaXMudGFibGVPcGVyYXRpb25zU2VydmljZS5yZW1vdmVSb3coKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIENvbW1hbmRzLmNoYW5nZVRhYmxlQm9yZGVyQ29sb3I6XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRhYmxlT3BlcmF0aW9uc1NlcnZpY2UuY2hhbmdlVGFibGVCb3JkZXJDb2xvcihzY29wZSBhcyBUYWJsZVNjb3BlcywgdmFsdWUgYXMgQ29sb3JzKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAvLyBjYXNlIENvbW1hbmRzLnNob3dJbnNlcnRUYWJsZUNvbHVtbkVsZW1lbnQ6XHJcbiAgICAgICAgICAgIC8vICAgICBpZiAoIWJsb2NrKSB7XHJcbiAgICAgICAgICAgIC8vICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke0NvbW1hbmRzLmluc2VydFRhYmxlQ29sdW1ufSByZXF1aXJlcyBhIGJsb2NrIHdpdGggYSB0YXJnZXQgdGFibGUgaW5zaWRlLmApO1xyXG4gICAgICAgICAgICAvLyAgICAgfVxyXG4gICAgICAgICAgICAvLyAgICAgdGhpcy50YWJsZU9wZXJhdGlvbnNTZXJ2aWNlLnNob3dJbnNlcnRDb2x1bW5FbGVtZW50KGJsb2NrKTtcclxuICAgICAgICAgICAgLy8gICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAvLyBjYXNlIENvbW1hbmRzLnNob3dJbnNlcnRUYWJsZVJvd0VsZW1lbnQ6XHJcbiAgICAgICAgICAgIC8vICAgICBpZiAoIWJsb2NrKSB7XHJcbiAgICAgICAgICAgIC8vICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke0NvbW1hbmRzLmluc2VydFRhYmxlQ29sdW1ufSByZXF1aXJlcyBhIGJsb2NrIHdpdGggYSB0YXJnZXQgdGFibGUgaW5zaWRlLmApO1xyXG4gICAgICAgICAgICAvLyAgICAgfVxyXG4gICAgICAgICAgICAvLyAgICAgdGhpcy50YWJsZU9wZXJhdGlvbnNTZXJ2aWNlLnNob3dJbnNlcnRMaW5lRWxlbWVudChibG9jayk7XHJcbiAgICAgICAgICAgIC8vICAgICBicmVhaztcclxuICAgICAgICAgICAgLy8gY2FzZSBDb21tYW5kcy5oaWRlSW5zZXJ0VGFibGVDb2x1bW5FbGVtZW50OlxyXG4gICAgICAgICAgICAvLyAgICAgaWYgKCFibG9jaykge1xyXG4gICAgICAgICAgICAvLyAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtDb21tYW5kcy5pbnNlcnRUYWJsZUNvbHVtbn0gcmVxdWlyZXMgYSBibG9jayB3aXRoIGEgdGFyZ2V0IHRhYmxlIGluc2lkZS5gKTtcclxuICAgICAgICAgICAgLy8gICAgIH1cclxuICAgICAgICAgICAgLy8gICAgIHRoaXMudGFibGVPcGVyYXRpb25zU2VydmljZS5oaWRlSW5zZXJ0Q29sdW1uRWxlbWVudChibG9jayk7XHJcbiAgICAgICAgICAgIC8vICAgICBicmVhaztcclxuICAgICAgICAgICAgLy8gY2FzZSBDb21tYW5kcy5oaWRlSW5zZXJ0VGFibGVSb3dFbGVtZW50OlxyXG4gICAgICAgICAgICAvLyAgICAgaWYgKCFibG9jaykge1xyXG4gICAgICAgICAgICAvLyAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtDb21tYW5kcy5pbnNlcnRUYWJsZUNvbHVtbn0gcmVxdWlyZXMgYSBibG9jayB3aXRoIGEgdGFyZ2V0IHRhYmxlIGluc2lkZS5gKTtcclxuICAgICAgICAgICAgLy8gICAgIH1cclxuICAgICAgICAgICAgLy8gICAgIHRoaXMudGFibGVPcGVyYXRpb25zU2VydmljZS5oaWRlSW5zZXJ0Um93RWxlbWVudChibG9jayk7XHJcbiAgICAgICAgICAgIC8vICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYE5vIGFjdGlvbiBkZWZpbmVkIGZvciBjb21tYW5kOiAke2NvbW1hbmR9YCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZXhlY1RyYW5zZm9ybUJsb2NrKHRhcmdldEJsb2NrVHlwZTogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICAgICAgdGhpcy5ibG9ja09wZXJhdGlvbnNTZXJ2aWNlLnRyYW5zZm9ybUJsb2NrKHRhcmdldEJsb2NrVHlwZSk7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBleGVjRHVwbGljYXRlQmxvY2soKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYmxvY2tPcGVyYXRpb25zU2VydmljZS5leGVjQ29tbWFuZChCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLkJMT0NLX09QRVJBVElPTlMuRFVQTElDQVRFLCBmYWxzZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBleGVjRGVsZXRlQmxvY2soKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYmxvY2tPcGVyYXRpb25zU2VydmljZS5leGVjQ29tbWFuZChCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLkJMT0NLX09QRVJBVElPTlMuREVMRVRFLCBmYWxzZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBleGVjUmVtb3ZlRm9ybWF0KCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuZXhlY0NvbW1hbmQoQmxvY2tPcGVyYXRpb25zU2VydmljZS5CTE9DS19PUEVSQVRJT05TLlJFTU9WRV9GT1JNQVQsIGZhbHNlKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGV4ZWNDcmVhdGVEZWZhdWx0QmxvY2soKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYmxvY2tPcGVyYXRpb25zU2VydmljZS5leGVjQ29tbWFuZChCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLkJMT0NLX09QRVJBVElPTlMuQ1JFQVRFX0RFRkFVTFRfQkxPQ0ssIGZhbHNlKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGV4ZWNJbnNlcnROZXcoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYmxvY2tPcGVyYXRpb25zU2VydmljZS5jcmVhdGVOZXdFbGVtZW50QW5kU3BsaXRDb250ZW50KCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBleGVjRm9jdXNPblByZXZpb3VzQmxvY2soKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYmxvY2tPcGVyYXRpb25zU2VydmljZS5leGVjQ29tbWFuZChCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLkJMT0NLX09QRVJBVElPTlMuREVMRVRFX0ZPQ1VTX09OX1BSRVZJT1VTLCBmYWxzZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBoYW5kbGVGb2N1c09uRmlyc3RSZXF1ZXN0ZWRFdmVudCA9ICgpOiB2b2lkID0+IHtcclxuICAgICAgICAvLyBhbGVydChcImZvY3VzIG9uIGZpcnN0XCIpO1xyXG4gICAgICAgIHRoaXMuYmxvY2tPcGVyYXRpb25zU2VydmljZS5leGVjQ29tbWFuZChCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLkJMT0NLX09QRVJBVElPTlMuRk9DVVNfT05fRklSU1QsIGZhbHNlKTtcclxuICAgIH1cclxufVxyXG4iLCJpbXBvcnQgeyBDb21tYW5kcyB9IGZyb20gXCJAL2NvbW1hbmRzL0NvbW1hbmRzXCI7XHJcbmltcG9ydCB7IElDb21tYW5kRXZlbnREZXRhaWwgfSBmcm9tIFwiQC9jb21tYW5kcy9JQ29tbWFuZEV2ZW50RGV0YWlsXCI7XHJcbmltcG9ydCB7IEN1c3RvbUV2ZW50cyB9IGZyb20gXCJAL2NvbW1vbi9DdXN0b21FdmVudHNcIjtcclxuaW1wb3J0IHsgRWxlbWVudEZhY3RvcnlTZXJ2aWNlIH0gZnJvbSBcIkAvc2VydmljZXMvZWxlbWVudC1mYWN0b3J5L0VsZW1lbnRGYWN0b3J5U2VydmljZVwiO1xyXG5pbXBvcnQgeyBJU2hvcnRjdXRMaXN0ZW5lcnMgfSBmcm9tIFwiLi9JU2hvcnRjdXRMaXN0ZW5lcnNcIjtcclxuXHJcbi8qKlxyXG4gKiBNYW5hZ2VzIGtleWJvYXJkIHNob3J0Y3V0IGxpc3RlbmluZyBmb3IgYSB3ZWIgYXBwbGljYXRpb24uIFRoaXMgY2xhc3MgaXMgaW1wbGVtZW50ZWQgYXMgYSBzaW5nbGV0b24gdG8gZW5zdXJlXHJcbiAqIHRoYXQga2V5Ym9hcmQgZXZlbnQgaGFuZGxpbmcgaXMgY2VudHJhbGl6ZWQgYW5kIHRoYXQgbXVsdGlwbGUgaW5zdGFuY2VzIGRvIG5vdCBkdXBsaWNhdGUgZXZlbnQgbGlzdGVuZXJzLlxyXG4gKiBJdCBpbnRlcmNlcHRzIGtleWRvd24gZXZlbnRzIGFuZCBkaXNwYXRjaGVzIGNvbW1hbmRzIGJhc2VkIG9uIHNwZWNpZmljIGtleSBjb21iaW5hdGlvbnMsIGVuaGFuY2luZyB0ZXh0IGVkaXRpbmdcclxuICogY2FwYWJpbGl0aWVzIHdpdGhpbiB0aGUgYXBwbGljYXRpb24uXHJcbiAqIFxyXG4gKiBUaGUgY2xhc3MgaW5pdGlhbGl6ZXMgaXRzZWxmIHRoZSBmaXJzdCB0aW1lIGBnZXRJbnN0YW5jZWAgaXMgY2FsbGVkIGFuZCBzdWJzZXF1ZW50bHkgbWFuYWdlcyBhbGwga2V5Ym9hcmQgc2hvcnRjdXRzXHJcbiAqIHRocm91Z2ggYSBzaW5nbGUgaW5zdGFuY2UuXHJcbiAqIFxyXG4gKiBVc2FnZSBvZiB0aGlzIGNsYXNzIG91dHNpZGUgb2YgaXRzIHNpbmdsZXRvbiBwYXR0ZXJuIGlzIHJlc3RyaWN0ZWQgdG8gcHJldmVudCBtdWx0aXBsZSBpbnN0YW5jZXMsIHdoaWNoIGlzIGVuZm9yY2VkXHJcbiAqIGJ5IHRocm93aW5nIGFuIGVycm9yIGlmIHRoZSBjb25zdHJ1Y3RvciBpcyBjYWxsZWQgZGlyZWN0bHkgYWZ0ZXIgaW5pdGlhbGl6YXRpb24uXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgU2hvcnRjdXRMaXN0ZW5lcnMgaW1wbGVtZW50cyBJU2hvcnRjdXRMaXN0ZW5lcnMge1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSG9sZHMgdGhlIHNpbmdsZSBpbnN0YW5jZSBvZiBTaG9ydGN1dExpc3RlbmVycywgZW5zdXJpbmcgdGhlIHNpbmdsZXRvbiBwYXR0ZXJuLlxyXG4gICAgICogQHR5cGUge1Nob3J0Y3V0TGlzdGVuZXJzIHwgbnVsbH1cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgc3RhdGljIGluc3RhbmNlOiBTaG9ydGN1dExpc3RlbmVycyB8IG51bGwgPSBudWxsO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHJpdmF0ZSBjb25zdHJ1Y3RvciB0byBwcmV2ZW50IGluc3RhbnRpYXRpb24gb3V0c2lkZSBvZiB0aGUgc2luZ2xldG9uIGNvbnRleHQuIEluaXRpYWxpemVzIHRoZVxyXG4gICAgICogc2hvcnRjdXQgbGlzdGVuZXIgc2V0dXAgYnkgY2FsbGluZyB0aGUgYGxpc3RlbmAgbWV0aG9kLCBlbnN1cmluZyBpdCBpcyBjYWxsZWQgb25seSBvbmNlLlxyXG4gICAgICogQHRocm93cyB7RXJyb3J9IElmIGFuIGF0dGVtcHQgaXMgbWFkZSB0byBkaXJlY3RseSBpbnN0YW50aWF0ZSB0aGlzIGNsYXNzLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIGlmIChTaG9ydGN1dExpc3RlbmVycy5pbnN0YW5jZSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVc2UgU2hvcnRjdXRMaXN0ZW5lcnMuZ2V0SW5zdGFuY2UoKSB0byBnZXQgaW5zdGFuY2UuXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5saXN0ZW4oKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGFydExpc3RlbigpOiB2b2lkIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcImxpc3RlbmluZyBrZXlib2FyZCBzaG9ydGN1dHNcIik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcm92aWRlcyBhY2Nlc3MgdG8gdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgU2hvcnRjdXRMaXN0ZW5lcnMgY2xhc3MuIElmIHRoZSBpbnN0YW5jZSBkb2VzIG5vdFxyXG4gICAgICogZXhpc3QsIGl0IGNyZWF0ZXMgYW5kIHJldHVybnMgaXQsIGVuc3VyaW5nIHRoZXJlIGlzIG9ubHkgb25lIGluc3RhbmNlIHRocm91Z2hvdXQgdGhlIGFwcGxpY2F0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIHtTaG9ydGN1dExpc3RlbmVyc30gVGhlIHNpbmdsZSBzaGFyZWQgaW5zdGFuY2Ugb2YgdGhlIFNob3J0Y3V0TGlzdGVuZXJzIGNsYXNzLlxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgZ2V0SW5zdGFuY2UoKTogU2hvcnRjdXRMaXN0ZW5lcnMge1xyXG4gICAgICAgIGlmIChTaG9ydGN1dExpc3RlbmVycy5pbnN0YW5jZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gU2hvcnRjdXRMaXN0ZW5lcnMuaW5zdGFuY2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbmV3IFNob3J0Y3V0TGlzdGVuZXJzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAqIEF0dGFjaGVzIGEgZ2xvYmFsIGV2ZW50IGxpc3RlbmVyIHRvIHRoZSBkb2N1bWVudCB0byBpbnRlcmNlcHQga2V5ZG93biBldmVudHMgYW5kIHBlcmZvcm0gc3BlY2lmaWMgdGV4dCB0cmFuc2Zvcm1hdGlvblxyXG4gICAgKiBjb21tYW5kcyBiYXNlZCBvbiB0aGUgY29tYmluYXRpb24gb2Yga2V5cyBwcmVzc2VkLiBUaGlzIGZ1bmN0aW9uIGlzIGRlc2lnbmVkIHRvIGVuaGFuY2UgdGV4dCBlZGl0aW5nIGNhcGFiaWxpdGllc1xyXG4gICAgKiB3aXRoaW4gYSB3ZWIgYXBwbGljYXRpb24gYnkgcHJvdmlkaW5nIGtleWJvYXJkIHNob3J0Y3V0cyBmb3IgdmFyaW91cyB0ZXh0IGZvcm1hdHRpbmcgYW5kIGVkaXRpbmcgYWN0aW9ucy5cclxuICAgICpcclxuICAgICogVGhlIGZ1bmN0aW9uIHVzZXMgYSBjb21iaW5hdGlvbiBvZiBDdHJsLCBBbHQgKG9yIEFsdEdyYXBoKSwgU2hpZnQsIGFuZCBzcGVjaWZpYyBrZXlzIHRvIGRldGVybWluZSB0aGUgYWN0aW9uIHRvIGJlXHJcbiAgICAqIHRha2VuLiBJdCBoYW5kbGVzIHRyYW5zZm9ybWF0aW9uIGludG8gZGlmZmVyZW50IGJsb2NrIHR5cGVzIGxpa2UgcGFyYWdyYXBocywgY2hlY2tsaXN0cywgbnVtYmVyZWQgbGlzdHMsIGhlYWRlcnMsIGV0Yy4sXHJcbiAgICAqIGFzIHdlbGwgYXMgYmxvY2sgZHVwbGljYXRpb24gYW5kIGRlbGV0aW9uLlxyXG4gICAgKlxyXG4gICAgKiBQcmV2ZW50RGVmYXVsdCBhbmQgc3RvcFByb3BhZ2F0aW9uIGFyZSBjYWxsZWQgdG8gcHJldmVudCB0aGUgZGVmYXVsdCBrZXkgYWN0aW9ucyBhbmQgYnViYmxpbmcgb2YgZXZlbnRzLCBlbnN1cmluZyB0aGF0XHJcbiAgICAqIG9ubHkgdGhlIGludGVuZGVkIGFjdGlvbnMgYXJlIGV4ZWN1dGVkLlxyXG4gICAgKlxyXG4gICAgKiBTdXBwb3J0ZWQgU2hvcnRjdXRzOlxyXG4gICAgKiAtIEN0cmwrU2hpZnQrRW50ZXI6IFRyYW5zZm9ybXMgdGhlIGN1cnJlbnQgYmxvY2sgaW50byBhIHBhcmFncmFwaC5cclxuICAgICogLSBDdHJsK1NoaWZ0KzEgb3IgQ3RybCtTaGlmdCtOdW1wYWQxIChOdW1Mb2NrIG9uKTogVHJhbnNmb3JtcyB0aGUgY3VycmVudCBibG9jayBpbnRvIGEgY2hlY2tsaXN0LlxyXG4gICAgKiAtIEN0cmwrU2hpZnQrLiA6IFRyYW5zZm9ybXMgdGhlIGN1cnJlbnQgYmxvY2sgaW50byBhIGJ1bGxldGVkIGxpc3QuXHJcbiAgICAqIC0gQ3RybCtTaGlmdCsvIDogVHJhbnNmb3JtcyB0aGUgY3VycmVudCBibG9jayBpbnRvIGEgbnVtYmVyZWQgbGlzdC5cclxuICAgICogLSBDdHJsK0FsdCsxIHRocm91Z2ggQ3RybCtBbHQrNjogVHJhbnNmb3JtcyB0aGUgY3VycmVudCBibG9jayBpbnRvIGhlYWRlcnMgKEgxIHRocm91Z2ggSDYpLlxyXG4gICAgKiAtIEN0cmwrRDogRHVwbGljYXRlcyB0aGUgY3VycmVudCBibG9jay5cclxuICAgICogLSBTaGlmdCtEZWxldGUgb3IgU2hpZnQrQmFja3NwYWNlOiBEZWxldGVzIHRoZSBjdXJyZW50IGJsb2NrLlxyXG4gICAgKiAtIEN0cmwrXFwgOiBDbGVhcnMgZm9ybWF0dGluZyBvZiB0aGUgY3VycmVudCBibG9jay5cclxuICAgICogLSBDdHJsK0FsdCtEaWdpdDE6IFByZXZlbnRzIGNoYXJhY3RlciBpbnNlcnRpb24gd2hlbiB1c2luZyB0aGUgdG9wIHJvdyAnMScsIHNwZWNpZmljIHRvIGxheW91dCBjb25maWd1cmF0aW9ucy5cclxuICAgICpcclxuICAgICogRWFjaCBhY3Rpb24gZGlzcGF0Y2hlcyBhIGN1c3RvbSBldmVudCB3aXRoIGRldGFpbHMgYWJvdXQgdGhlIGNvbW1hbmQgdG8gYmUgZXhlY3V0ZWQsIHdoaWNoIHNob3VsZCBiZSBoYW5kbGVkIGJ5XHJcbiAgICAqIENvbW1hbmREaXNwYXRjaGVyLlxyXG4gICAgKlxyXG4gICAgKiBAZXhhbXBsZVxyXG4gICAgKiAvLyBJbml0aWFsaXplIGFuZCBhY3RpdmF0ZSB0aGUgc2hvcnRjdXRzIGFjcm9zcyB0aGUgZG9jdW1lbnQuXHJcbiAgICAqIGNvbnN0IHNob3J0Y3V0TGlzdGVuZXIgPSBTaG9ydGN1dExpc3RlbmVycy5nZXRJbnN0YW5jZSgpO1xyXG4gICAgKi9cclxuICAgIHByaXZhdGUgbGlzdGVuKCkge1xyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIChldmVudCkgPT4ge1xyXG5cclxuICAgICAgICAgICAgY29uc29sZS5sb2coYEtleTogJHtldmVudC5rZXl9LCBDb2RlOiAke2V2ZW50LmNvZGV9LCBDdHJsOiAke2V2ZW50LmN0cmxLZXl9LCBBbHQ6ICR7ZXZlbnQuYWx0S2V5fSwgQWx0R3I6ICR7ZXZlbnQua2V5ID09PSAnQWx0R3JhcGgnfSwgTnVtTG9jazogJHtldmVudC5nZXRNb2RpZmllclN0YXRlKCdOdW1Mb2NrJyl9YCk7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBpc051bVBhZCA9IGV2ZW50LmNvZGUuc3RhcnRzV2l0aChcIk51bXBhZFwiKTtcclxuICAgICAgICAgICAgY29uc3QgbnVtTG9ja09uID0gZXZlbnQuZ2V0TW9kaWZpZXJTdGF0ZShcIk51bUxvY2tcIik7XHJcblxyXG4gICAgICAgICAgICBpZiAoKGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQubWV0YUtleSkgJiYgZXZlbnQuc2hpZnRLZXkgJiYgKGV2ZW50LmtleSA9PT0gXCJFbnRlclwiKSkge1xyXG4gICAgICAgICAgICAgICAgLy8gQ29udmVydHMgdG8gcGFyYWdyYXBoIHdoZW4gcHJlc3NpbmcgQ3RybCtTaGlmdCtFbnRlclxyXG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgICAgICAgICAgICAgIGFsZXJ0KFwiY29udmVydG8gcGFyYSBwYXJhZ3JhZm9cIik7XHJcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudDxJQ29tbWFuZEV2ZW50RGV0YWlsPihDdXN0b21FdmVudHMuZW1pdHRlZENvbW1hbmQsIHtcclxuICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogQ29tbWFuZHMudHJhbnNmb3JtQmxvY2ssXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldEJsb2NrVHlwZTogRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuUEFSQUdSQVBIXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSkpO1xyXG5cclxuICAgICAgICAgICAgfSBlbHNlIGlmICgoZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5KSAmJiAhZXZlbnQuYWx0S2V5ICYmIChldmVudC5jb2RlID09PSBcIkRpZ2l0MVwiIHx8IGV2ZW50LmNvZGUgPT09IFwiTnVtcGFkMVwiKSkge1xyXG4gICAgICAgICAgICAgICAgLy8gQ29udmVydHMgdG8gY2hlY2tsaXN0IHdoZW4gcHJlc3NpbmcgIEN0cmwrU2hpZnQrMVxyXG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgICAgICAgICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50PElDb21tYW5kRXZlbnREZXRhaWw+KEN1c3RvbUV2ZW50cy5lbWl0dGVkQ29tbWFuZCwge1xyXG4gICAgICAgICAgICAgICAgICAgIGRldGFpbDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kOiBDb21tYW5kcy50cmFuc2Zvcm1CbG9jayxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0QmxvY2tUeXBlOiBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5DSEVDS19MSVNUXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSkpO1xyXG5cclxuICAgICAgICAgICAgfSBlbHNlIGlmICgoZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5KSAmJiAhZXZlbnQuc2hpZnRLZXkgJiYgZXZlbnQua2V5ID09PSBcIi5cIikge1xyXG4gICAgICAgICAgICAgICAgLy8gQ29udmVydHMgdG8gYnVsbGV0ZWQgbGlzdCB3aGVuIHByZXNzaW5nICBDdHJsK1NoaWZ0Ky5cclxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHJcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudDxJQ29tbWFuZEV2ZW50RGV0YWlsPihDdXN0b21FdmVudHMuZW1pdHRlZENvbW1hbmQsIHtcclxuICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogQ29tbWFuZHMudHJhbnNmb3JtQmxvY2ssXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldEJsb2NrVHlwZTogRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuQlVMTEVURURfTElTVFxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICgoZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5KSAmJiAhZXZlbnQuc2hpZnRLZXkgJiYgKGV2ZW50LmtleSA9PT0gXCIvXCIpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBDb252ZXJ0cyB0byBudW1iZXJlZCBsaXN0IHdoZW4gcHJlc3NpbmcgQ3RybCtTaGlmdCsvXHJcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQ8SUNvbW1hbmRFdmVudERldGFpbD4oQ3VzdG9tRXZlbnRzLmVtaXR0ZWRDb21tYW5kLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGV0YWlsOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ6IENvbW1hbmRzLnRyYW5zZm9ybUJsb2NrLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRCbG9ja1R5cGU6IEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLk5VTUJFUkVEX0xJU1RcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoKGV2ZW50LmN0cmxLZXkgJiYgZXZlbnQuYWx0S2V5ICYmICgoZXZlbnQuY29kZSA9PT0gXCJEaWdpdDFcIikgfHwgKGlzTnVtUGFkICYmIG51bUxvY2tPbiAmJiBldmVudC5jb2RlID09PSBcIk51bXBhZDFcIikpKSkge1xyXG4gICAgICAgICAgICAgICAgLy8gQ29udmVydHMgdG8gaDEgd2hlbiBwcmVzc2luZyBDdHJsK0FsdCsxXHJcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQ8SUNvbW1hbmRFdmVudERldGFpbD4oQ3VzdG9tRXZlbnRzLmVtaXR0ZWRDb21tYW5kLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGV0YWlsOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ6IENvbW1hbmRzLnRyYW5zZm9ybUJsb2NrLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRCbG9ja1R5cGU6IEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl8xXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKChldmVudC5jdHJsS2V5ICYmIGV2ZW50LmFsdEtleSAmJiAoKGV2ZW50LmNvZGUgPT09IFwiRGlnaXQyXCIpIHx8IChpc051bVBhZCAmJiBudW1Mb2NrT24gJiYgZXZlbnQuY29kZSA9PT0gXCJOdW1wYWQyXCIpKSkpIHtcclxuICAgICAgICAgICAgICAgIC8vIENvbnZlcnRzIHRvIGgyIHdoZW4gcHJlc3NpbmcgQ3RybCtBbHQrMlxyXG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgICAgICAgICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50PElDb21tYW5kRXZlbnREZXRhaWw+KEN1c3RvbUV2ZW50cy5lbWl0dGVkQ29tbWFuZCwge1xyXG4gICAgICAgICAgICAgICAgICAgIGRldGFpbDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kOiBDb21tYW5kcy50cmFuc2Zvcm1CbG9jayxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0QmxvY2tUeXBlOiBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfMlxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICgoZXZlbnQuY3RybEtleSAmJiBldmVudC5hbHRLZXkgJiYgKChldmVudC5jb2RlID09PSBcIkRpZ2l0M1wiKSB8fCAoaXNOdW1QYWQgJiYgbnVtTG9ja09uICYmIGV2ZW50LmNvZGUgPT09IFwiTnVtcGFkM1wiKSkpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBDb252ZXJ0cyB0byBoMyB3aGVuIHByZXNzaW5nIEN0cmwrQWx0KzNcclxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHJcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudDxJQ29tbWFuZEV2ZW50RGV0YWlsPihDdXN0b21FdmVudHMuZW1pdHRlZENvbW1hbmQsIHtcclxuICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogQ29tbWFuZHMudHJhbnNmb3JtQmxvY2ssXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldEJsb2NrVHlwZTogRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuSEVBREVSXzNcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoKGV2ZW50LmN0cmxLZXkgJiYgZXZlbnQuYWx0S2V5ICYmICgoZXZlbnQuY29kZSA9PT0gXCJEaWdpdDRcIikgfHwgKGlzTnVtUGFkICYmIG51bUxvY2tPbiAmJiBldmVudC5jb2RlID09PSBcIk51bXBhZDRcIikpKSkge1xyXG4gICAgICAgICAgICAgICAgLy8gQ29udmVydHMgdG8gaDQgd2hlbiBwcmVzc2luZyBDdHJsK0FsdCs0XHJcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQ8SUNvbW1hbmRFdmVudERldGFpbD4oQ3VzdG9tRXZlbnRzLmVtaXR0ZWRDb21tYW5kLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGV0YWlsOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ6IENvbW1hbmRzLnRyYW5zZm9ybUJsb2NrLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRCbG9ja1R5cGU6IEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl80XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKChldmVudC5jdHJsS2V5ICYmIGV2ZW50LmFsdEtleSAmJiAoKGV2ZW50LmNvZGUgPT09IFwiRGlnaXQ1XCIpIHx8IChpc051bVBhZCAmJiBudW1Mb2NrT24gJiYgZXZlbnQuY29kZSA9PT0gXCJOdW1wYWQ1XCIpKSkpIHtcclxuICAgICAgICAgICAgICAgIC8vIENvbnZlcnRzIHRvIGg1IHdoZW4gcHJlc3NpbmcgQ3RybCtBbHQrNVxyXG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgICAgICAgICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50PElDb21tYW5kRXZlbnREZXRhaWw+KEN1c3RvbUV2ZW50cy5lbWl0dGVkQ29tbWFuZCwge1xyXG4gICAgICAgICAgICAgICAgICAgIGRldGFpbDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kOiBDb21tYW5kcy50cmFuc2Zvcm1CbG9jayxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0QmxvY2tUeXBlOiBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfNVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICgoZXZlbnQuY3RybEtleSAmJiBldmVudC5hbHRLZXkgJiYgKChldmVudC5jb2RlID09PSBcIkRpZ2l0NlwiKSB8fCAoaXNOdW1QYWQgJiYgbnVtTG9ja09uICYmIGV2ZW50LmNvZGUgPT09IFwiTnVtcGFkNlwiKSkpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBDb252ZXJ0cyB0byBoNiB3aGVuIHByZXNzaW5nIEN0cmwrQWx0KzZcclxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHJcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudDxJQ29tbWFuZEV2ZW50RGV0YWlsPihDdXN0b21FdmVudHMuZW1pdHRlZENvbW1hbmQsIHtcclxuICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogQ29tbWFuZHMudHJhbnNmb3JtQmxvY2ssXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldEJsb2NrVHlwZTogRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuSEVBREVSXzZcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoKGV2ZW50LmtleSA9PT0gXCJEXCIgfHwgZXZlbnQua2V5ID09PSBcImRcIikgJiYgZXZlbnQuY3RybEtleSkge1xyXG4gICAgICAgICAgICAgICAgLy8gRHVwbGljYXRlIGJsb2NrIHdoZW4gcHJlc3NpbmcgQ3RybCtEXHJcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQ8SUNvbW1hbmRFdmVudERldGFpbD4oQ3VzdG9tRXZlbnRzLmVtaXR0ZWRDb21tYW5kLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGV0YWlsOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ6IENvbW1hbmRzLmR1cGxpY2F0ZUJsb2NrLFxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICgoZXZlbnQua2V5ID09PSBcIkRlbGV0ZVwiIHx8IGV2ZW50LmtleSA9PT0gXCJCYWNrc3BhY2VcIikgJiYgZXZlbnQuc2hpZnRLZXkpIHtcclxuICAgICAgICAgICAgICAgIC8vIERlbGV0ZSBibG9jayB3aGVuIHByZXNzaW5nIFNoaWZ0K0RlbGV0ZVxyXG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgICAgICAgICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50PElDb21tYW5kRXZlbnREZXRhaWw+KEN1c3RvbUV2ZW50cy5lbWl0dGVkQ29tbWFuZCwge1xyXG4gICAgICAgICAgICAgICAgICAgIGRldGFpbDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kOiBDb21tYW5kcy5kZWxldGVCbG9jayxcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSBcIlxcXFxcIiAmJiAoZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5KSkge1xyXG4gICAgICAgICAgICAgICAgLy8gQ2xlYXIgZm9ybWF0dGluZyB3aGVuIHByZXNzaW5nIEN0cmwrXFxcclxuICAgICAgICAgICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50PElDb21tYW5kRXZlbnREZXRhaWw+KEN1c3RvbUV2ZW50cy5lbWl0dGVkQ29tbWFuZCwge1xyXG4gICAgICAgICAgICAgICAgICAgIGRldGFpbDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kOiBDb21tYW5kcy5yZW1vdmVGb3JtYXQsXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmN0cmxLZXkgJiYgZXZlbnQuYWx0S2V5ICYmIGV2ZW50LmNvZGUgPT09IFwiRGlnaXQxXCIpIHtcclxuICAgICAgICAgICAgICAgIC8vIFByZXZlbnQgY2hhcmFjdGVyIGluc2VydGlvbiB3aGVuIHVzaW5nIHRvcCByb3cgJzEnXHJcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBJQ29tbWFuZEV2ZW50RGV0YWlsIH0gZnJvbSBcIkAvY29tbWFuZHMvSUNvbW1hbmRFdmVudERldGFpbFwiO1xyXG5pbXBvcnQgeyBJVGFibGVMaXN0ZW5lcnMgfSBmcm9tIFwiLi9JVGFibGVMaXN0ZW5lcnNcIjtcclxuaW1wb3J0IHsgQ3VzdG9tRXZlbnRzIH0gZnJvbSBcIkAvY29tbW9uL0N1c3RvbUV2ZW50c1wiO1xyXG5pbXBvcnQgeyBDb21tYW5kcyB9IGZyb20gXCJAL2NvbW1hbmRzL0NvbW1hbmRzXCI7XHJcbmltcG9ydCB7IERPTVV0aWxzIH0gZnJvbSBcIkAvdXRpbGl0aWVzL0RPTVV0aWxzXCI7XHJcbmltcG9ydCB7IFRhYmxlVXRpbHMgfSBmcm9tIFwiQC91dGlsaXRpZXMvVGFibGVVdGlsc1wiO1xyXG5pbXBvcnQgeyBGb2N1c1N0YWNrIH0gZnJvbSBcIi4uL0ZvY3VzU3RhY2tcIjtcclxuaW1wb3J0IHsgSUZvY3VzU3RhY2sgfSBmcm9tIFwiLi4vSUZvY3VzU3RhY2tcIjtcclxuaW1wb3J0IHsgRGVwZW5kZW5jeUNvbnRhaW5lciB9IGZyb20gXCIuLi9EZXBlbmRlbmN5Q29udGFpbmVyXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgVGFibGVMaXN0ZW5lcnMgaW1wbGVtZW50cyBJVGFibGVMaXN0ZW5lcnMge1xyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIGluc3RhbmNlOiBUYWJsZUxpc3RlbmVycyB8IG51bGwgPSBudWxsO1xyXG5cclxuICAgIGZvY3VzU3RhY2s6IElGb2N1c1N0YWNrO1xyXG5cclxuICAgIHNob3duRWxlbWVudHMgPSBuZXcgTWFwPEhUTUxUYWJsZUNlbGxFbGVtZW50LCBIVE1MRWxlbWVudD4oKTtcclxuXHJcbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIGZvY3VzU3RhY2s6IElGb2N1c1N0YWNrKSB7XHJcblxyXG4gICAgICAgIGlmIChUYWJsZUxpc3RlbmVycy5pbnN0YW5jZSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVc2UgVGFibGVFdmVudExpc3RlbmVycy5nZXRJbnN0YW5jZSgpIHRvIGdldCBpbnN0YW5jZS5cIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmZvY3VzU3RhY2sgPSBmb2N1c1N0YWNrO1xyXG5cclxuICAgICAgICB0aGlzLmxpc3RlbigpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXJ0TGlzdGVuKCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwibGlzdGVuaW5nIHRhYmxlIGNsaWNrc1wiKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZ2V0SW5zdGFuY2UoKTogVGFibGVMaXN0ZW5lcnMge1xyXG5cclxuICAgICAgICBjb25zdCBmb2N1c1N0YWNrID0gRGVwZW5kZW5jeUNvbnRhaW5lci5JbnN0YW5jZS5yZXNvbHZlPElGb2N1c1N0YWNrPihcIklGb2N1c1N0YWNrXCIpO1xyXG4gICAgICAgIGlmIChUYWJsZUxpc3RlbmVycy5pbnN0YW5jZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gVGFibGVMaXN0ZW5lcnMuaW5zdGFuY2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbmV3IFRhYmxlTGlzdGVuZXJzKGZvY3VzU3RhY2spO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgbGlzdGVuKCkge1xyXG5cclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKGV2ZW50KSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBwYXJlbnQ6IEVsZW1lbnQgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgICAgICAgICAgIGlmICgoZXZlbnQudGFyZ2V0IGFzIE5vZGUpLm5vZGVUeXBlID09IE5vZGUuVEVYVF9OT0RFKSB7XHJcbiAgICAgICAgICAgICAgICBwYXJlbnQgPSAoZXZlbnQudGFyZ2V0IGFzIE5vZGUpLnBhcmVudEVsZW1lbnQ7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBwYXJlbnQgPSAoZXZlbnQudGFyZ2V0IGFzIEVsZW1lbnQpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAocGFyZW50Py5jbG9zZXN0KFwiLmFkZC10YWJsZS1jb2x1bW5cIikpIHtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBjdXN0b21FdmVudCA9IG5ldyBDdXN0b21FdmVudDxJQ29tbWFuZEV2ZW50RGV0YWlsPihDdXN0b21FdmVudHMuZW1pdHRlZENvbW1hbmQsIHtcclxuICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogQ29tbWFuZHMuaW5zZXJ0VGFibGVDb2x1bW5SaWdodCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2s6IHBhcmVudC5jbG9zZXN0KFwiLmJsb2NrXCIpIGFzIEhUTUxFbGVtZW50XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChjdXN0b21FdmVudCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChwYXJlbnQ/LmNsb3Nlc3QoXCIuYWRkLXRhYmxlLXJvd1wiKSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQ8SUNvbW1hbmRFdmVudERldGFpbD4oQ3VzdG9tRXZlbnRzLmVtaXR0ZWRDb21tYW5kLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGV0YWlsOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ6IENvbW1hbmRzLmluc2VydFRhYmxlUm93QmVsb3csXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrOiBwYXJlbnQuY2xvc2VzdChcIi5ibG9ja1wiKSBhcyBIVE1MRWxlbWVudFxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoY3VzdG9tRXZlbnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG5cclxuXHJcbiAgICAgICAgLy8gZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlb3ZlclwiLCAoZXZlbnQpID0+IHtcclxuICAgICAgICAvLyAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG5cclxuICAgICAgICAvLyAgICAgLy8gRW5zdXJlIHRoZSB0YXJnZXQgaXMgYSB0YWJsZSBjZWxsICh0ZCkgYW5kIGEgY2hpbGQgb2YgYW4gZWxlbWVudCB3aXRoIGNsYXNzICdibG9jaydcclxuICAgICAgICAvLyAgICAgY29uc3QgY2VsbCA9IHRhcmdldC5jbG9zZXN0KFwidGRcIik7XHJcbiAgICAgICAgLy8gICAgIGlmICghY2VsbCB8fCAhY2VsbC5jbG9zZXN0KFwiLmJsb2NrXCIpKSByZXR1cm47IFxyXG5cclxuICAgICAgICAvLyAgICAgLy8gR2V0IHRoZSBhc3NvY2lhdGVkIHRhYmxlIChhc3N1bWluZyBhIHRhYmxlIGV4aXN0cylcclxuICAgICAgICAvLyAgICAgY29uc3QgdGFibGUgPSBjZWxsLmNsb3Nlc3QoXCJ0YWJsZVwiKSBhcyBIVE1MVGFibGVFbGVtZW50O1xyXG4gICAgICAgIC8vICAgICBpZiAoIXRhYmxlKSByZXR1cm47XHJcblxyXG4gICAgICAgIC8vICAgICAvLyBJZiBhbiBlbGVtZW50IGlzIGFscmVhZHkgc2hvd24gZm9yIHRoaXMgY2VsbCwgZG8gbm90aGluZ1xyXG4gICAgICAgIC8vICAgICBpZiAodGhpcy5zaG93bkVsZW1lbnRzLmhhcyhjZWxsKSkgcmV0dXJuOyAvLyBQcmV2ZW50IGZsaWNrZXJpbmdcclxuXHJcbiAgICAgICAgLy8gICAgIC8vIENoZWNrIGlmIGluIHRoZSBsYXN0IGNvbHVtbiBhbmQgZW1pdCBldmVudFxyXG4gICAgICAgIC8vICAgICBpZiAoVGFibGVVdGlscy5pc0xhc3RDb2x1bW4odGFibGUsIGNlbGwpKSB7XHJcbiAgICAgICAgLy8gICAgICAgICBjb25zdCBibG9jayA9IGNlbGwuY2xvc2VzdChcIi5ibG9ja1wiKSBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICAvLyAgICAgICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50PElDb21tYW5kRXZlbnREZXRhaWw+KEN1c3RvbUV2ZW50cy5lbWl0dGVkQ29tbWFuZCwge1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIGRldGFpbDogeyBjb21tYW5kOiBDb21tYW5kcy5zaG93SW5zZXJ0VGFibGVDb2x1bW5FbGVtZW50LCBibG9jayB9LFxyXG4gICAgICAgIC8vICAgICAgICAgfSk7XHJcbiAgICAgICAgLy8gICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KGN1c3RvbUV2ZW50KTtcclxuICAgICAgICAvLyAgICAgICAgIHRoaXMuc2hvd25FbGVtZW50cy5zZXQoY2VsbCwgYmxvY2spOyAvLyBUcmFjayB0aGUgc2hvd24gZWxlbWVudFxyXG4gICAgICAgIC8vICAgICB9XHJcblxyXG4gICAgICAgIC8vICAgICAvLyBDaGVjayBpZiBpbiB0aGUgbGFzdCByb3cgYW5kIGVtaXQgZXZlbnRcclxuICAgICAgICAvLyAgICAgaWYgKFRhYmxlVXRpbHMuaXNMYXN0Um93KHRhYmxlLCBjZWxsKSkge1xyXG4gICAgICAgIC8vICAgICAgICAgY29uc3QgYmxvY2sgPSBjZWxsLmNsb3Nlc3QoXCIuYmxvY2tcIikgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgLy8gICAgICAgICBjb25zdCBjdXN0b21FdmVudCA9IG5ldyBDdXN0b21FdmVudDxJQ29tbWFuZEV2ZW50RGV0YWlsPihDdXN0b21FdmVudHMuZW1pdHRlZENvbW1hbmQsIHtcclxuICAgICAgICAvLyAgICAgICAgICAgICBkZXRhaWw6IHsgY29tbWFuZDogQ29tbWFuZHMuc2hvd0luc2VydFRhYmxlUm93RWxlbWVudCwgYmxvY2sgfSxcclxuICAgICAgICAvLyAgICAgICAgIH0pO1xyXG4gICAgICAgIC8vICAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChjdXN0b21FdmVudCk7XHJcbiAgICAgICAgLy8gICAgICAgICB0aGlzLnNob3duRWxlbWVudHMuc2V0KGNlbGwsIGJsb2NrKTsgLy8gVHJhY2sgdGhlIHNob3duIGVsZW1lbnRcclxuICAgICAgICAvLyAgICAgfVxyXG4gICAgICAgIC8vIH0pO1xyXG5cclxuICAgICAgICAvLyBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2VvdXRcIiwgKGV2ZW50KSA9PiB7XHJcbiAgICAgICAgLy8gICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICAvLyAgICAgY29uc3QgcmVsYXRlZFRhcmdldCA9IGV2ZW50LnJlbGF0ZWRUYXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcblxyXG4gICAgICAgIC8vICAgICAvLyBFbnN1cmUgdGhlIHRhcmdldCBpcyBhIHRhYmxlIGNlbGwgKHRkKSBhbmQgYSBjaGlsZCBvZiBhbiBlbGVtZW50IHdpdGggY2xhc3MgJ2Jsb2NrJ1xyXG4gICAgICAgIC8vICAgICBjb25zdCBjZWxsID0gdGFyZ2V0LmNsb3Nlc3QoXCJ0ZFwiKTtcclxuICAgICAgICAvLyAgICAgaWYgKCFjZWxsIHx8ICFjZWxsLmNsb3Nlc3QoXCIuYmxvY2tcIikpIHJldHVybjtcclxuXHJcbiAgICAgICAgLy8gICAgIC8vIEdldCB0aGUgYXNzb2NpYXRlZCB0YWJsZSAoYXNzdW1pbmcgYSB0YWJsZSBleGlzdHMpXHJcbiAgICAgICAgLy8gICAgIGNvbnN0IHRhYmxlID0gY2VsbC5jbG9zZXN0KFwidGFibGVcIikgYXMgSFRNTFRhYmxlRWxlbWVudDtcclxuICAgICAgICAvLyAgICAgaWYgKCF0YWJsZSkgcmV0dXJuO1xyXG5cclxuICAgICAgICAvLyAgICAgLy8gQ2hlY2sgaWYgdGhlIG1vdXNlIGlzIGxlYXZpbmcgdGhlIGxhc3QgY29sdW1uIGNlbGwgYW5kIG5vdCBlbnRlcmluZyB0aGUgYWRkIGNvbHVtbiBidXR0b25cclxuICAgICAgICAvLyAgICAgaWYgKFRhYmxlVXRpbHMuaXNMYXN0Q29sdW1uKHRhYmxlLCBjZWxsKSAmJiAhcmVsYXRlZFRhcmdldD8uY2xhc3NMaXN0LmNvbnRhaW5zKFwiYWRkLXRhYmxlLWNvbHVtblwiKSkge1xyXG4gICAgICAgIC8vICAgICAgICAgY29uc3Qgc2hvd25FbGVtZW50ID0gdGhpcy5zaG93bkVsZW1lbnRzLmdldChjZWxsKTtcclxuICAgICAgICAvLyAgICAgICAgIGlmIChzaG93bkVsZW1lbnQpIHtcclxuICAgICAgICAvLyAgICAgICAgICAgICBjb25zdCBjdXN0b21FdmVudCA9IG5ldyBDdXN0b21FdmVudDxJQ29tbWFuZEV2ZW50RGV0YWlsPihDdXN0b21FdmVudHMuZW1pdHRlZENvbW1hbmQsIHtcclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgZGV0YWlsOiB7IGNvbW1hbmQ6IENvbW1hbmRzLmhpZGVJbnNlcnRUYWJsZUNvbHVtbkVsZW1lbnQsIGJsb2NrOiBzaG93bkVsZW1lbnQgfSxcclxuICAgICAgICAvLyAgICAgICAgICAgICB9KTtcclxuICAgICAgICAvLyAgICAgICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KGN1c3RvbUV2ZW50KTtcclxuICAgICAgICAvLyAgICAgICAgICAgICB0aGlzLnNob3duRWxlbWVudHMuZGVsZXRlKGNlbGwpO1xyXG4gICAgICAgIC8vICAgICAgICAgfVxyXG4gICAgICAgIC8vICAgICB9XHJcblxyXG4gICAgICAgIC8vICAgICAvLyBDaGVjayBpZiB0aGUgbW91c2UgaXMgbGVhdmluZyB0aGUgbGFzdCByb3cgY2VsbCBhbmQgbm90IGVudGVyaW5nIHRoZSBhZGQgcm93IGJ1dHRvblxyXG4gICAgICAgIC8vICAgICBpZiAoVGFibGVVdGlscy5pc0xhc3RSb3codGFibGUsIGNlbGwpICYmICFyZWxhdGVkVGFyZ2V0Py5jbGFzc0xpc3QuY29udGFpbnMoXCJhZGQtdGFibGUtcm93XCIpKSB7XHJcbiAgICAgICAgLy8gICAgICAgICBjb25zdCBzaG93bkVsZW1lbnQgPSB0aGlzLnNob3duRWxlbWVudHMuZ2V0KGNlbGwpO1xyXG4gICAgICAgIC8vICAgICAgICAgaWYgKHNob3duRWxlbWVudCkge1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50PElDb21tYW5kRXZlbnREZXRhaWw+KEN1c3RvbUV2ZW50cy5lbWl0dGVkQ29tbWFuZCwge1xyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICBkZXRhaWw6IHsgY29tbWFuZDogQ29tbWFuZHMuaGlkZUluc2VydFRhYmxlUm93RWxlbWVudCwgYmxvY2s6IHNob3duRWxlbWVudCB9LFxyXG4gICAgICAgIC8vICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoY3VzdG9tRXZlbnQpO1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIHRoaXMuc2hvd25FbGVtZW50cy5kZWxldGUoY2VsbCk7XHJcbiAgICAgICAgLy8gICAgICAgICB9XHJcbiAgICAgICAgLy8gICAgIH1cclxuICAgICAgICAvLyB9KTtcclxuICAgIH1cclxufSIsImltcG9ydCB7IElGb2N1c1N0YWNrIH0gZnJvbSBcIi4vSUZvY3VzU3RhY2tcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBGb2N1c1N0YWNrIGltcGxlbWVudHMgSUZvY3VzU3RhY2sge1xyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIGluc3RhbmNlOiBGb2N1c1N0YWNrO1xyXG4gICAgcHJpdmF0ZSBzdGFjazogSFRNTEVsZW1lbnRbXTtcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgY2FwYWNpdHk6IG51bWJlciA9IDEwO1xyXG5cclxuICAgIHByaXZhdGUgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy5zdGFjayA9IFtdO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0SW5zdGFuY2UoKTogRm9jdXNTdGFjayB7XHJcbiAgICAgICAgaWYgKCFGb2N1c1N0YWNrLmluc3RhbmNlKSB7XHJcbiAgICAgICAgICAgIEZvY3VzU3RhY2suaW5zdGFuY2UgPSBuZXcgRm9jdXNTdGFjaygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gRm9jdXNTdGFjay5pbnN0YW5jZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcHVzaChlbGVtZW50OiBIVE1MRWxlbWVudCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLnN0YWNrLmxlbmd0aCA+PSB0aGlzLmNhcGFjaXR5KSB7XHJcbiAgICAgICAgICAgIHRoaXMuc3RhY2suc2hpZnQoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5zdGFjay5wdXNoKGVsZW1lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBwZWVrKCk6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnN0YWNrID0gW107XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBUYWJsZVV0aWxzIH0gZnJvbSBcIkAvdXRpbGl0aWVzL1RhYmxlVXRpbHNcIjtcclxuaW1wb3J0IHsgSVRhYmxlT3BlcmF0aW9uc1NlcnZpY2UgfSBmcm9tIFwiLi9JVGFibGVPcGVyYXRpb25zU2VydmljZVwiO1xyXG5pbXBvcnQgeyBJRm9jdXNTdGFjayB9IGZyb20gXCJAL2NvcmUvSUZvY3VzU3RhY2tcIjtcclxuaW1wb3J0IHsgRGVwZW5kZW5jeUNvbnRhaW5lciB9IGZyb20gXCJAL2NvcmUvRGVwZW5kZW5jeUNvbnRhaW5lclwiO1xyXG5pbXBvcnQgeyBJTWVtZW50byB9IGZyb20gXCJAL2NvcmUvSU1lbWVudG9cIjtcclxuaW1wb3J0IHsgQ29sb3JzIH0gZnJvbSBcIkAvY29tbW9uL0NvbG9yc1wiO1xyXG5pbXBvcnQgeyBUYWJsZVNjb3BlcyB9IGZyb20gXCIuL1RhYmxlU2NvcGVzXCI7XHJcbmltcG9ydCB7IERPTUVsZW1lbnRzIH0gZnJvbSBcIkAvY29tbW9uL0RPTUVsZW1lbnRzXCI7XHJcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gXCJAL2NvbW1hbmRzL0V2ZW50RW1pdHRlclwiO1xyXG5pbXBvcnQgeyBET01VdGlscyB9IGZyb20gXCJAL3V0aWxpdGllcy9ET01VdGlsc1wiO1xyXG5pbXBvcnQgeyBVdGlscyB9IGZyb20gXCJAL3V0aWxpdGllcy9VdGlsc1wiO1xyXG5pbXBvcnQgeyBUYWJsZUNvbnRleHRGbG9hdGluZ1Rvb2xiYXIgfSBmcm9tIFwiQC9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvVGFibGVDb250ZXh0RmxvYXRpbmdUb29sYmFyXCI7XHJcbmltcG9ydCB7IFRvb2xiYXJJRHMgfSBmcm9tIFwiQC9jb3JlL1Rvb2xiYXJJRHNcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBUYWJsZU9wZXJhdGlvbnNTZXJ2aWNlIGltcGxlbWVudHMgSVRhYmxlT3BlcmF0aW9uc1NlcnZpY2Uge1xyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIGluc3RhbmNlOiBUYWJsZU9wZXJhdGlvbnNTZXJ2aWNlO1xyXG5cclxuICAgIHByaXZhdGUgZm9jdXNTdGFjazogSUZvY3VzU3RhY2s7XHJcbiAgICBwcml2YXRlIG1lbWVudG86IElNZW1lbnRvO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIGZvY3VzU3RhY2s6IElGb2N1c1N0YWNrLFxyXG4gICAgICAgIG1lbWVudG86IElNZW1lbnRvKSB7XHJcbiAgICAgICAgaWYgKFRhYmxlT3BlcmF0aW9uc1NlcnZpY2UuaW5zdGFuY2UpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVXNlIFRhYmxlT3BlcmF0aW9uc1NlcnZpY2UuZ2V0SW5zdGFuY2UoKSB0byBnZXQgaW5zdGFuY2UuXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5mb2N1c1N0YWNrID0gZm9jdXNTdGFjaztcclxuICAgICAgICB0aGlzLm1lbWVudG8gPSBtZW1lbnRvO1xyXG4gICAgfVxyXG5cclxuICAgIGlzQWN0aXZlQ2VsbEJhY2tncm91bmRDb2xvcih2YWx1ZTogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC5cIik7XHJcbiAgICB9XHJcblxyXG4gICAgcmVtb3ZlQ29sdW1uKCk6IHZvaWQge1xyXG5cclxuICAgICAgICB0aGlzLm1lbWVudG8uc2F2ZVN0YXRlKCk7XHJcblxyXG4gICAgICAgIGNvbnN0IGNlbGwgPSB0aGlzLmZvY3VzU3RhY2sucGVlaygpO1xyXG5cclxuICAgICAgICBpZiAoY2VsbCkge1xyXG4gICAgICAgICAgICBUYWJsZVV0aWxzLnJlbW92ZUNvbHVtbkJ5Q2VsbChjZWxsIGFzIEhUTUxUYWJsZUNlbGxFbGVtZW50KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIEV2ZW50RW1pdHRlci5lbWl0Q2xvc2VFbGVtZW50RXZlbnQoVG9vbGJhcklEcy5UYWJsZVRvb2xiYXIpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbW92ZVJvdygpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLm1lbWVudG8uc2F2ZVN0YXRlKCk7XHJcblxyXG4gICAgICAgIGNvbnN0IGNlbGwgPSB0aGlzLmZvY3VzU3RhY2sucGVlaygpO1xyXG5cclxuICAgICAgICBpZiAoY2VsbCkge1xyXG4gICAgICAgICAgICBUYWJsZVV0aWxzLnJlbW92ZVJvd0J5Q2VsbChjZWxsIGFzIEhUTUxUYWJsZUNlbGxFbGVtZW50KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIEV2ZW50RW1pdHRlci5lbWl0Q2xvc2VFbGVtZW50RXZlbnQoVG9vbGJhcklEcy5UYWJsZVRvb2xiYXIpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBleGVjQ2VsbEJhY2tncm91bmRDb2xvcih2YWx1ZTogc3RyaW5nKTogdm9pZCB7XHJcblxyXG4gICAgICAgIHRoaXMubWVtZW50by5zYXZlU3RhdGUoKTtcclxuXHJcbiAgICAgICAgRXZlbnRFbWl0dGVyLmVtaXRSZXNldEFjdGl2ZUJ1dHRvbnNFbGVtZW50RXZlbnQoXCJiYWNrZ3JvdW5kQ29sb3JcIik7XHJcblxyXG4gICAgICAgIGNvbnN0IGFjdGl2ZUNlbGwgPSBUYWJsZVV0aWxzLmdldEFjdGl2ZVRhYmxlQ2VsbCgpO1xyXG5cclxuICAgICAgICBpZiAoYWN0aXZlQ2VsbCkge1xyXG4gICAgICAgICAgICBjb25zdCB0YWJsZSA9IGFjdGl2ZUNlbGwuY2xvc2VzdCgndGFibGUnKSE7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZENlbGxzID0gdGFibGUucXVlcnlTZWxlY3RvckFsbCgndGQuc2VsZWN0ZWQnKTtcclxuXHJcbiAgICAgICAgICAgIHNlbGVjdGVkQ2VsbHMuZm9yRWFjaChjZWxsID0+IHtcclxuICAgICAgICAgICAgICAgIChjZWxsIGFzIEhUTUxFbGVtZW50KS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSB2YWx1ZTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBFdmVudEVtaXR0ZXIuZW1pdFNob3dIaWRlQWN0aXZlRWxlbWVudEV2ZW50KFwiYmFja2dyb3VuZENvbG9yXCIsIHZhbHVlLCBcInNob3dcIik7XHJcblxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJjZWxsIG5vdCBmb3VuZFwiKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgICBzdGF0aWMgaXNDZWxsQmFja2dyb3VuZENvbG9yKGNlbGw6IEhUTUxUYWJsZUNlbGxFbGVtZW50LCB0YXJnZXRIZXhDb2xvcjogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICAgICAgaWYgKCFjZWxsIHx8IGNlbGwudGFnTmFtZSAhPT0gJ1REJyB8fCAhY2VsbC5oYXNBdHRyaWJ1dGUoJ2RhdGEtcGxhY2Vob2xkZXInKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBjb21wdXRlZFN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoY2VsbCk7XHJcbiAgICAgICAgY29uc3QgY3VycmVudEJhY2tncm91bmRDb2xvciA9IGNvbXB1dGVkU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgnYmFja2dyb3VuZC1jb2xvcicpO1xyXG5cclxuICAgICAgICBjb25zdCBoZXhCYWNrZ3JvdW5kQ29sb3IgPSBVdGlscy5yZ2JUb0hleChjdXJyZW50QmFja2dyb3VuZENvbG9yKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGhleEJhY2tncm91bmRDb2xvci50b1VwcGVyQ2FzZSgpID09PSB0YXJnZXRIZXhDb2xvci50b1VwcGVyQ2FzZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHF1ZXJ5U3RhdGVDZWxsQmFja2dyb3VuZENvbG9yKHZhbHVlOiBzdHJpbmcpOiBib29sZWFuIHtcclxuXHJcbiAgICAgICAgY29uc3QgY2VsbCA9IFRhYmxlVXRpbHMuZ2V0QWN0aXZlVGFibGVDZWxsKCk7XHJcblxyXG4gICAgICAgIGlmIChjZWxsKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbXB1dGVkU3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShjZWxsKTtcclxuICAgICAgICAgICAgY29uc3QgY3VycmVudEJhY2tncm91bmRDb2xvciA9IGNvbXB1dGVkU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgnYmFja2dyb3VuZC1jb2xvcicpO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgaGV4QmFja2dyb3VuZENvbG9yID0gVXRpbHMucmdiVG9IZXgoY3VycmVudEJhY2tncm91bmRDb2xvcik7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gaGV4QmFja2dyb3VuZENvbG9yLnRvVXBwZXJDYXNlKCkgPT09IHZhbHVlLnRvVXBwZXJDYXNlKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgIC8vIGNvbnN0IGEgPSBET01VdGlscy5cclxuXHJcbiAgICAgICAgLy8gICAgIHRoaXMubWVtZW50by5zYXZlU3RhdGUoKTtcclxuXHJcbiAgICAgICAgLy8gRXZlbnRFbWl0dGVyLmVtaXRSZXNldEFjdGl2ZUJ1dHRvbnNFbGVtZW50RXZlbnQoXCJiYWNrZ3JvdW5kQ29sb3JcIik7XHJcblxyXG4gICAgICAgIC8vIGNvbnN0IGFjdGl2ZUNlbGwgPSBUYWJsZVV0aWxzLmdldEFjdGl2ZVRhYmxlQ2VsbCgpO1xyXG5cclxuICAgICAgICAvLyBpZiAoYWN0aXZlQ2VsbCkge1xyXG4gICAgICAgIC8vICAgICBjb25zdCB0YWJsZSA9IGFjdGl2ZUNlbGwuY2xvc2VzdCgndGFibGUnKSE7XHJcblxyXG4gICAgICAgIC8vICAgICBjb25zdCBzZWxlY3RlZENlbGxzID0gdGFibGUucXVlcnlTZWxlY3RvckFsbCgndGQuc2VsZWN0ZWQnKTtcclxuXHJcbiAgICAgICAgLy8gICAgIHNlbGVjdGVkQ2VsbHMuZm9yRWFjaChjZWxsID0+IHtcclxuICAgICAgICAvLyAgICAgICAgIChjZWxsIGFzIEhUTUxFbGVtZW50KS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSB2YWx1ZTtcclxuICAgICAgICAvLyAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vICAgICBFdmVudEVtaXR0ZXIuZW1pdFNob3dIaWRlQWN0aXZlRWxlbWVudEV2ZW50KFwiYmFja2dyb3VuZENvbG9yXCIsIHZhbHVlLCBcInNob3dcIik7XHJcblxyXG4gICAgICAgIC8vIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gICAgIGNvbnNvbGUuZXJyb3IoXCJjZWxsIG5vdCBmb3VuZFwiKTtcclxuICAgICAgICAvLyB9XHJcbiAgICB9XHJcblxyXG4gICAgcXVlcnlBbGxTdGF0ZUNlbGxCYWNrZ3JvdW5kQ29sb3IoZWxlbWVudHM6IEhUTUxUYWJsZUNlbGxFbGVtZW50W10sIGNvbG9yOiBDb2xvcnMpOiBib29sZWFuIHtcclxuXHJcbiAgICAgICAgbGV0IGlzOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgaWYgKGNvbG9yID09IENvbG9ycy5CYWNrZ3JvdW5kQ29sb3JOb25lKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGVsZW1lbnRzLmZvckVhY2goY2VsbCA9PiB7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBzdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGNlbGwpO1xyXG4gICAgICAgICAgICBjb25zdCByZ2JDb2xvciA9IHN0eWxlLmJhY2tncm91bmRDb2xvcjtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGhleENvbG9yID0gVXRpbHMucmdiVG9IZXgocmdiQ29sb3IpLnRvTG9jYWxlTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgICAgIGlmIChoZXhDb2xvciAhPT0gY29sb3IudG9Mb2NhbGVMb3dlckNhc2UoKSkge1xyXG4gICAgICAgICAgICAgICAgaXMgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gaXM7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vIGV4ZWNIaWxpdGVDb2xvcih2YWx1ZTogc3RyaW5nKTogdm9pZCB7XHJcblxyXG4gICAgLy8gICAgIHRoaXMubWVtZW50by5zYXZlU3RhdGUoKTtcclxuXHJcbiAgICAvLyAgICAgaWYgKGRvY3VtZW50LmV4ZWNDb21tYW5kKFwiaGlsaXRlQ29sb3JcIiwgZmFsc2UsIHZhbHVlKSkge1xyXG4gICAgLy8gICAgICAgICBFdmVudEVtaXR0ZXIuZW1pdFNob3dIaWRlQWN0aXZlRWxlbWVudEV2ZW50KFwiaGlsaXRlQ29sb3JcIiwgdmFsdWUsIFwic2hvd1wiKTtcclxuICAgIC8vICAgICB9ZWxzZXtcclxuICAgIC8vICAgICAgICAgRXZlbnRFbWl0dGVyLmVtaXRTaG93SGlkZUFjdGl2ZUVsZW1lbnRFdmVudChcImhpbGl0ZUNvbG9yXCIsIHZhbHVlLCBcImhpZGVcIik7XHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gfVxyXG5cclxuICAgIHN0YXRpYyBnZXRJbnN0YW5jZSgpOiBUYWJsZU9wZXJhdGlvbnNTZXJ2aWNlIHtcclxuXHJcbiAgICAgICAgY29uc3QgZm9jdXNTdGFjayA9IERlcGVuZGVuY3lDb250YWluZXIuSW5zdGFuY2UucmVzb2x2ZTxJRm9jdXNTdGFjaz4oXCJJRm9jdXNTdGFja1wiKTtcclxuICAgICAgICBjb25zdCBtZW1lbnRvID0gRGVwZW5kZW5jeUNvbnRhaW5lci5JbnN0YW5jZS5yZXNvbHZlPElNZW1lbnRvPihcIklNZW1lbnRvXCIpO1xyXG5cclxuICAgICAgICBpZiAoIXRoaXMuaW5zdGFuY2UpIHtcclxuICAgICAgICAgICAgdGhpcy5pbnN0YW5jZSA9IG5ldyBUYWJsZU9wZXJhdGlvbnNTZXJ2aWNlKGZvY3VzU3RhY2ssIG1lbWVudG8pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5zdGFuY2U7XHJcbiAgICB9XHJcblxyXG4gICAgaW5zZXJ0Um93QWJvdmUoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5tZW1lbnRvLnNhdmVTdGF0ZSgpO1xyXG5cclxuICAgICAgICBjb25zdCBjZWxsID0gdGhpcy5mb2N1c1N0YWNrLnBlZWsoKTsgLy8gQWdvcmEsIGBjZWxsYCDDqSBhIGB0ZGAgZGlyZXRhbWVudGVcclxuICAgICAgICBpZiAoIWNlbGwpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIk5vIGNlbGwgaXMgZm9jdXNlZFwiKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3Qgcm93ID0gY2VsbC5wYXJlbnRFbGVtZW50OyAvLyBPYnRlbSBhIGxpbmhhIChgdHJgKSBwYWkgZGEgY8OpbHVsYVxyXG4gICAgICAgIGlmICghcm93KSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJObyByb3cgaXMgZm9jdXNlZFwiKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgdGFibGUgPSByb3cuY2xvc2VzdChcInRhYmxlXCIpOyAvLyBFbmNvbnRyYSBhIHRhYmVsYSBxdWUgY29udMOpbSBhIGxpbmhhXHJcbiAgICAgICAgaWYgKCF0YWJsZSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiVGFibGUgZG9lcyBub3QgZXhpc3RcIik7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHRib2R5ID0gdGFibGUucXVlcnlTZWxlY3RvcigndGJvZHknKSB8fCB0YWJsZTsgLy8gQXNzdW1lIHRhYmxlIHNlIHRib2R5IG7Do28gZXhpc3RpclxyXG4gICAgICAgIGNvbnN0IHJvd0luZGV4ID0gQXJyYXkuZnJvbSh0Ym9keS5jaGlsZHJlbikuaW5kZXhPZihyb3cpOyAvLyBFbmNvbnRyYSBvIMOtbmRpY2UgZGEgbGluaGEgZGVudHJvIGRvIHRib2R5IG91IGRhIHRhYmVsYVxyXG5cclxuICAgICAgICBpZiAocm93SW5kZXggPCAwKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJSb3cgaW5kZXggbm90IGZvdW5kXCIpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBUYWJsZVV0aWxzLmFkZFJvdyh0YWJsZSwgcm93SW5kZXgpOyAvLyBJbnNlcmUgdW1hIG5vdmEgbGluaGEgbm8gw61uZGljZSBlbmNvbnRyYWRvXHJcbiAgICAgICAgRXZlbnRFbWl0dGVyLmVtaXRDbG9zZUVsZW1lbnRFdmVudChUb29sYmFySURzLlRhYmxlVG9vbGJhcik7XHJcbiAgICB9XHJcblxyXG4gICAgaW5zZXJ0Um93QmVsb3coYmxvY2s6IEhUTUxFbGVtZW50KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5tZW1lbnRvLnNhdmVTdGF0ZSgpO1xyXG5cclxuICAgICAgICBpZiAoYmxvY2spIHtcclxuICAgICAgICAgICAgY29uc3QgdGFibGUgPSBibG9jay5xdWVyeVNlbGVjdG9yKFwidGFibGVcIik7XHJcbiAgICAgICAgICAgIGlmICh0YWJsZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgcm93ID0gdGFibGUucXVlcnlTZWxlY3RvcihcInRyOmxhc3QtY2hpbGRcIik7XHJcbiAgICAgICAgICAgICAgICBpZiAocm93KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgcm93SW5kZXggPSBBcnJheS5mcm9tKHRhYmxlLmNoaWxkcmVuWzBdLmNoaWxkcmVuKS5pbmRleE9mKHJvdykgKyAxO1xyXG4gICAgICAgICAgICAgICAgICAgIFRhYmxlVXRpbHMuYWRkUm93KHRhYmxlLCByb3dJbmRleCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJObyByb3dzIGluIHRoZSB0YWJsZVwiKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiVGFibGUgZG9lcyBub3QgZXhpc3RcIik7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5mb2N1c1N0YWNrLnBlZWsoKTtcclxuICAgICAgICAgICAgaWYgKCFlbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiTm8gZm9jdXNlZCBlbGVtZW50IGF2YWlsYWJsZVwiKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3QgY2VsbCA9IGVsZW1lbnQuY2xvc2VzdChcInRkXCIpO1xyXG4gICAgICAgICAgICBpZiAoIWNlbGwpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJObyBjZWxsIGlzIGZvY3VzZWRcIik7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHJvdyA9IGNlbGwucGFyZW50RWxlbWVudDtcclxuICAgICAgICAgICAgY29uc3QgdGFibGUgPSBjZWxsLmNsb3Nlc3QoXCJ0YWJsZVwiKTtcclxuICAgICAgICAgICAgaWYgKCF0YWJsZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIlRhYmxlIGRvZXMgbm90IGV4aXN0XCIpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAocm93KSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByb3dJbmRleCA9IEFycmF5LmZyb20odGFibGUuY2hpbGRyZW5bMF0uY2hpbGRyZW4pLmluZGV4T2Yocm93KSArIDE7XHJcbiAgICAgICAgICAgICAgICBUYWJsZVV0aWxzLmFkZFJvdyh0YWJsZSwgcm93SW5kZXgpO1xyXG5cclxuICAgICAgICAgICAgICAgIEV2ZW50RW1pdHRlci5lbWl0Q2xvc2VFbGVtZW50RXZlbnQoVG9vbGJhcklEcy5UYWJsZVRvb2xiYXIpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBpbnNlcnRDb2x1bW4oZGlyZWN0aW9uOiAnbGVmdCcgfCAncmlnaHQnKTogdm9pZCB7XHJcbiAgICAvLyAgICAgdGhpcy5tZW1lbnRvLnNhdmVTdGF0ZSgpOyAgLy8gU2FsdmEgbyBlc3RhZG8gYXR1YWwgcGFyYSBwb3Nzw612ZWwgZGVzZmF6aW1lbnRvXHJcblxyXG4gICAgLy8gICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmZvY3VzU3RhY2sucGVlaygpOyAgLy8gUGVnYSBvIGVsZW1lbnRvIGF0dWFsbWVudGUgZm9jYWRvXHJcbiAgICAvLyAgICAgaWYgKCFlbGVtZW50KSB7XHJcbiAgICAvLyAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJObyBmb2N1c2VkIGVsZW1lbnQgYXZhaWxhYmxlXCIpO1xyXG4gICAgLy8gICAgICAgICByZXR1cm47XHJcbiAgICAvLyAgICAgfVxyXG5cclxuICAgIC8vICAgICBjb25zdCBjZWxsID0gZWxlbWVudC5jbG9zZXN0KFwidGRcIik7ICAvLyBFbmNvbnRyYSBhIGPDqWx1bGEgZm9jYWRhIGRlbnRybyBkYSB0YWJlbGFcclxuICAgIC8vICAgICBpZiAoIWNlbGwpIHtcclxuICAgIC8vICAgICAgICAgY29uc29sZS5lcnJvcihcIk5vIGNlbGwgaXMgZm9jdXNlZFwiKTtcclxuICAgIC8vICAgICAgICAgcmV0dXJuO1xyXG4gICAgLy8gICAgIH1cclxuXHJcbiAgICAvLyAgICAgY29uc3QgdGFibGUgPSBjZWxsLmNsb3Nlc3QoXCJ0YWJsZVwiKTsgIC8vIEVuY29udHJhIGEgdGFiZWxhIGNvbnRlbmRvIGEgY8OpbHVsYVxyXG4gICAgLy8gICAgIGlmICghdGFibGUpIHtcclxuICAgIC8vICAgICAgICAgY29uc29sZS5lcnJvcihcIlRhYmxlIGRvZXMgbm90IGV4aXN0XCIpO1xyXG4gICAgLy8gICAgICAgICByZXR1cm47XHJcbiAgICAvLyAgICAgfVxyXG5cclxuICAgIC8vICAgICBjb25zdCBjb2x1bW5JbmRleCA9IEFycmF5LmZyb20oY2VsbC5wYXJlbnRFbGVtZW50LmNoaWxkcmVuKS5pbmRleE9mKGNlbGwpOyAgLy8gRGV0ZXJtaW5hIG8gw61uZGljZSBkYSBjb2x1bmEgYXR1YWxcclxuICAgIC8vICAgICBpZiAoZGlyZWN0aW9uID09PSAnbGVmdCcpIHtcclxuICAgIC8vICAgICAgICAgVGFibGVVdGlscy5hZGRDb2x1bW4odGFibGUsIGNvbHVtbkluZGV4KTsgIC8vIEFkaWNpb25hIGNvbHVuYSDDoCBlc3F1ZXJkYVxyXG4gICAgLy8gICAgIH0gZWxzZSB7XHJcbiAgICAvLyAgICAgICAgIFRhYmxlVXRpbHMuYWRkQ29sdW1uKHRhYmxlLCBjb2x1bW5JbmRleCArIDEpOyAgLy8gQWRpY2lvbmEgY29sdW5hIMOgIGRpcmVpdGFcclxuICAgIC8vICAgICB9XHJcbiAgICAvLyB9XHJcblxyXG4gICAgaW5zZXJ0Q29sdW1uTGVmdCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLm1lbWVudG8uc2F2ZVN0YXRlKCk7XHJcblxyXG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmZvY3VzU3RhY2sucGVlaygpO1xyXG4gICAgICAgIGlmICghZWxlbWVudCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiTm8gZm9jdXNlZCBlbGVtZW50IGF2YWlsYWJsZVwiKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgY2VsbCA9IGVsZW1lbnQuY2xvc2VzdChcInRkXCIpO1xyXG4gICAgICAgIGlmICghY2VsbCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiTm8gY2VsbCBpcyBmb2N1c2VkXCIpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCB0YWJsZSA9IGNlbGwuY2xvc2VzdChcInRhYmxlXCIpO1xyXG4gICAgICAgIGlmICghdGFibGUpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIlRhYmxlIGRvZXMgbm90IGV4aXN0XCIpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBjb2x1bW5JbmRleCA9IEFycmF5LmZyb20oY2VsbC5wYXJlbnRFbGVtZW50IS5jaGlsZHJlbikuaW5kZXhPZihjZWxsKTtcclxuICAgICAgICBUYWJsZVV0aWxzLmFkZENvbHVtbih0YWJsZSwgY29sdW1uSW5kZXgpO1xyXG5cclxuICAgICAgICBFdmVudEVtaXR0ZXIuZW1pdENsb3NlRWxlbWVudEV2ZW50KFRvb2xiYXJJRHMuVGFibGVUb29sYmFyKTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgaW5zZXJ0Q29sdW1uUmlnaHQoYmxvY2s6IEhUTUxFbGVtZW50IHwgbnVsbCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMubWVtZW50by5zYXZlU3RhdGUoKTtcclxuXHJcbiAgICAgICAgaWYgKGJsb2NrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRhYmxlID0gYmxvY2sucXVlcnlTZWxlY3RvcihcInRhYmxlXCIpO1xyXG4gICAgICAgICAgICBpZiAodGFibGUpIHtcclxuICAgICAgICAgICAgICAgIFRhYmxlVXRpbHMuYWRkQ29sdW1uKHRhYmxlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmZvY3VzU3RhY2sucGVlaygpO1xyXG4gICAgICAgICAgICBpZiAoIWVsZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJObyBmb2N1c2VkIGVsZW1lbnQgYXZhaWxhYmxlXCIpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCBjZWxsID0gZWxlbWVudC5jbG9zZXN0KFwidGRcIik7XHJcbiAgICAgICAgICAgIGlmICghY2VsbCkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIk5vIGNlbGwgaXMgZm9jdXNlZFwiKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3QgdGFibGUgPSBjZWxsLmNsb3Nlc3QoXCJ0YWJsZVwiKTtcclxuICAgICAgICAgICAgaWYgKCF0YWJsZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIlRhYmxlIGRvZXMgbm90IGV4aXN0XCIpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCBjb2x1bW5JbmRleCA9IEFycmF5LmZyb20oY2VsbC5wYXJlbnRFbGVtZW50IS5jaGlsZHJlbikuaW5kZXhPZihjZWxsKTtcclxuICAgICAgICAgICAgVGFibGVVdGlscy5hZGRDb2x1bW4odGFibGUsIGNvbHVtbkluZGV4ICsgMSk7XHJcblxyXG4gICAgICAgICAgICBFdmVudEVtaXR0ZXIuZW1pdENsb3NlRWxlbWVudEV2ZW50KFRvb2xiYXJJRHMuVGFibGVUb29sYmFyKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc2hvd0luc2VydExpbmVFbGVtZW50KGJsb2NrOiBIVE1MRWxlbWVudCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGluc2VydExpbmUgPSBibG9jay5xdWVyeVNlbGVjdG9yKFwiLmFkZC10YWJsZS1yb3dcIikgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgaW5zZXJ0TGluZS5zdHlsZS52aXNpYmlsaXR5ID0gXCJ2aXNpYmxlXCI7XHJcbiAgICB9XHJcblxyXG4gICAgc2hvd0luc2VydENvbHVtbkVsZW1lbnQoYmxvY2s6IEhUTUxFbGVtZW50KTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgaW5zZXJ0TGluZSA9IGJsb2NrLnF1ZXJ5U2VsZWN0b3IoXCIuYWRkLXRhYmxlLWNvbHVtblwiKSBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICBpbnNlcnRMaW5lLnN0eWxlLnZpc2liaWxpdHkgPSBcInZpc2libGVcIjtcclxuICAgIH1cclxuXHJcbiAgICBoaWRlSW5zZXJ0Um93RWxlbWVudChibG9jazogSFRNTEVsZW1lbnQpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBpbnNlcnRMaW5lID0gYmxvY2sucXVlcnlTZWxlY3RvcihcIi5hZGQtdGFibGUtcm93XCIpIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgIGluc2VydExpbmUuc3R5bGUudmlzaWJpbGl0eSA9IFwiaGlkZGVuXCI7XHJcbiAgICB9XHJcblxyXG4gICAgaGlkZUluc2VydENvbHVtbkVsZW1lbnQoYmxvY2s6IEhUTUxFbGVtZW50KTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgaW5zZXJ0TGluZSA9IGJsb2NrLnF1ZXJ5U2VsZWN0b3IoXCIuYWRkLXRhYmxlLWNvbHVtblwiKSBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICBpbnNlcnRMaW5lLnN0eWxlLnZpc2liaWxpdHkgPSBcImhpZGRlblwiO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGlzQWN0aXZlQ2VsbEJhY2tncm91bmRDb2xvcih2YWx1ZTogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICAvLyAgICAgcmV0dXJuIFRhYmxlVXRpbHMuaXNBY3RpdmVDZWxsQmFja2dyb3VuZENvbG9yKHZhbHVlKTtcclxuICAgIC8vIH1cclxuXHJcbiAgICAvLyBlbWl0Q2hhbmdlVGFibGVCb3JkZXJDb2xvckV2ZW50ID0gKHNjb3BlOiBUYWJsZVNjb3BlcywgY29sb3I6IENvbG9ycyk6IHZvaWQgPT4ge1xyXG4gICAgLy8gICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KENvbW1hbmRzLiwge1xyXG4gICAgLy8gICAgICAgICBkZXRhaWw6IHsgc2NvcGU6IHNjb3BlIH1cclxuICAgIC8vICAgICB9KTtcclxuXHJcbiAgICAvLyAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChjdXN0b21FdmVudCk7XHJcbiAgICAvLyB9XHJcblxyXG5cclxuICAgIGNoYW5nZVRhYmxlQm9yZGVyQ29sb3Ioc2NvcGU6IFRhYmxlU2NvcGVzLCBjb2xvcjogQ29sb3JzKTogdm9pZCB7XHJcblxyXG4gICAgICAgIGNvbnN0IHRhYmxlID0gdGhpcy5mb2N1c1N0YWNrLnBlZWsoKT8uY2xvc2VzdChET01FbGVtZW50cy5UQUJMRSk7XHJcblxyXG4gICAgICAgIGlmICh0YWJsZSkge1xyXG4gICAgICAgICAgICBUYWJsZVV0aWxzLmNoYW5nZUNlbGxCb3JkZXJDb2xvcih0YWJsZSwgc2NvcGUsIGNvbG9yKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbn0iLCJpbXBvcnQgeyBJTWVtZW50byB9IGZyb20gXCIuL0lNZW1lbnRvXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgTWVtZW50byBpbXBsZW1lbnRzIElNZW1lbnRvIHtcclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgcXVlcnk6IHN0cmluZyA9IFwiI2pvaGFubmVzRWRpdG9yIC5jb250ZW50XCI7XHJcbiAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IE1lbWVudG87XHJcblxyXG4gIHByaXZhdGUgdW5kb1N0YWNrOiBzdHJpbmdbXSA9IFtdO1xyXG4gIHByaXZhdGUgcmVkb1N0YWNrOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuICBwcml2YXRlIGdldCBjb250ZW50KCkgOiBIVE1MRWxlbWVudHtcclxuICAgIHJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKE1lbWVudG8ucXVlcnkpITtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY29uc3RydWN0b3IoKSB7XHJcblxyXG4gICAgaWYgKE1lbWVudG8uaW5zdGFuY2UpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVXNlIE1lbWVudG8uZ2V0SW5zdGFuY2UoKSB0byBnZXQgaW5zdGFuY2UuXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuYXR0YWNoRXZlbnRzKCk7XHJcbiAgICB0aGlzLnNhdmVTdGF0ZSgpO1xyXG4gIH1cclxuXHJcbiAgc2F2ZVN0YXRlKCkge1xyXG4gICAgaWYgKHRoaXMuY29udGVudCkge1xyXG4gICAgICB0aGlzLnVuZG9TdGFjay5wdXNoKHRoaXMuY29udGVudC5pbm5lckhUTUwpO1xyXG4gICAgICB0aGlzLnJlZG9TdGFjayA9IFtdO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1bmRvKCkge1xyXG4gICAgaWYgKHRoaXMudW5kb1N0YWNrLmxlbmd0aCA+IDEgJiYgdGhpcy5jb250ZW50KSB7XHJcbiAgICAgIHRoaXMucmVkb1N0YWNrLnB1c2godGhpcy5jb250ZW50LmlubmVySFRNTCk7XHJcbiAgICAgIGNvbnN0IHN0YXRlVG9SZXN0b3JlID0gdGhpcy51bmRvU3RhY2sucG9wKCk7XHJcbiAgICAgIHRoaXMuY29udGVudC5pbm5lckhUTUwgPSBzdGF0ZVRvUmVzdG9yZSE7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlZG8oKSB7XHJcbiAgICBpZiAodGhpcy5yZWRvU3RhY2subGVuZ3RoID4gMCAmJiB0aGlzLmNvbnRlbnQpIHtcclxuICAgICAgdGhpcy51bmRvU3RhY2sucHVzaCh0aGlzLmNvbnRlbnQuaW5uZXJIVE1MKTtcclxuICAgICAgY29uc3Qgc3RhdGVUb0FwcGx5ID0gdGhpcy5yZWRvU3RhY2sucG9wKCk7XHJcbiAgICAgIHRoaXMuY29udGVudC5pbm5lckhUTUwgPSBzdGF0ZVRvQXBwbHkhO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIGF0dGFjaEV2ZW50cygpIHtcclxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIChldmVudCkgPT4ge1xyXG4gICAgICBpZiAoZXZlbnQuY3RybEtleSAmJiBldmVudC5rZXkgPT09ICd6Jykge1xyXG4gICAgICAgIHRoaXMudW5kbygpO1xyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgIH0gZWxzZSBpZiAoZXZlbnQuY3RybEtleSAmJiBldmVudC5rZXkgPT09ICd5Jykge1xyXG4gICAgICAgIHRoaXMucmVkbygpO1xyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy8gcHJpdmF0ZSBoYW5kbGVLZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XHJcbiAgLy8gICBpZiAoZXZlbnQuY3RybEtleSAmJiBldmVudC5rZXkgPT09ICd6Jykge1xyXG4gIC8vICAgICB0aGlzLnVuZG8oKTtcclxuICAvLyAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAvLyAgIH0gZWxzZSBpZiAoZXZlbnQuY3RybEtleSAmJiBldmVudC5rZXkgPT09ICd5Jykge1xyXG4gIC8vICAgICB0aGlzLnJlZG8oKTtcclxuICAvLyAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAvLyAgIH1cclxuICAvLyB9XHJcblxyXG4gIHN0YXRpYyBnZXRJbnN0YW5jZSgpOiBNZW1lbnRvIHtcclxuICAgIGlmICghTWVtZW50by5pbnN0YW5jZSkge1xyXG4gICAgICBNZW1lbnRvLmluc3RhbmNlID0gbmV3IE1lbWVudG8oKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gTWVtZW50by5pbnN0YW5jZTtcclxuICB9XHJcbn0iLCJpbXBvcnQgeyBET01VdGlscyB9IGZyb20gXCJAL3V0aWxpdGllcy9ET01VdGlsc1wiO1xuaW1wb3J0IHsgSUVkaXRhYmxlTmF2aWdhdGlvbiB9IGZyb20gXCIuL0lFZGl0YWJsZU5hdmlnYXRpb25cIjtcbmltcG9ydCB7IERpcmVjdGlvbnMgfSBmcm9tIFwiQC9jb21tb24vRGlyZWN0aW9uc1wiO1xuaW1wb3J0IHsgQm91bmRhcmllcyB9IGZyb20gXCJAL2NvbW1vbi9Cb3VuZGFyaWVzXCI7XG5pbXBvcnQgeyBUYWJsZVV0aWxzIH0gZnJvbSBcIkAvdXRpbGl0aWVzL1RhYmxlVXRpbHNcIjtcbmltcG9ydCB7IElRdWlja01lbnUgfSBmcm9tIFwiQC9jb21wb25lbnRzL3F1aWNrLW1lbnUvSVF1aWNrTWVudVwiO1xuaW1wb3J0IHsgRGVwZW5kZW5jeUNvbnRhaW5lciB9IGZyb20gXCIuL0RlcGVuZGVuY3lDb250YWluZXJcIjtcblxuLyoqXG4gKiBUaGlzIGNsYXNzIGhhbmRsZXMga2V5Ym9hcmQgZXZlbnRzIHRvIG5hdmlnYXRlIGJldHdlZW4gY29udGVudGVkaXRhYmxlIGVsZW1lbnRzIHVzaW5nIGFycm93IGtleXMsXG4gKiBhbmQgZW5zdXJlcyBmb2N1cyBtYW5hZ2VtZW50IGFuZCBjYXJldCBwbGFjZW1lbnQgd2l0aGluIHRoZXNlIGVsZW1lbnRzLlxuICogSXQgaW1wbGVtZW50cyB0aGUgYElFZGl0YWJsZU5hdmlnYXRpb25gIGludGVyZmFjZSBhbmQgdXNlcyBhIHNpbmdsZXRvbiBwYXR0ZXJuIHRvIG1hbmFnZSBpdHMgaW5zdGFuY2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBFZGl0YWJsZU5hdmlnYXRpb24gaW1wbGVtZW50cyBJRWRpdGFibGVOYXZpZ2F0aW9uIHtcblxuICAgIHByaXZhdGUgc3RhdGljIGluc3RhbmNlOiBFZGl0YWJsZU5hdmlnYXRpb247XG5cbiAgICBxdWlja01lbnU6IElRdWlja01lbnU7XG5cbiAgICAvKipcbiAgICAgKiBQcml2YXRlIGNvbnN0cnVjdG9yIHRvIHByZXZlbnQgZXh0ZXJuYWwgaW5zdGFudGlhdGlvbi5cbiAgICAgKiBJdCBiaW5kcyB0aGUgYGhhbmRsZUFycm93S2V5c2AgbWV0aG9kIHRvIGtleWJvYXJkIGV2ZW50cyBvbiB0aGUgZG9jdW1lbnQuXG4gICAgICovXG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihxdWlja01lbnU6IElRdWlja01lbnUpIHtcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMuaGFuZGxlQXJyb3dLZXlzLmJpbmQodGhpcykpO1xuXG4gICAgICAgIHRoaXMucXVpY2tNZW51ID0gcXVpY2tNZW51O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFjdHMgYXMgYSB0cmlnZ2VyIHdpdGhpbiB0aGUgZGVwZW5kZW5jeSBpbmplY3Rpb24gY29udGFpbmVyIHRvIGVuc3VyZSBpbnN0YW50aWF0aW9uIG9mIHRoaXMgc2luZ2xldG9uIGNsYXNzLlxuICAgICAqIFRoaXMgbWV0aG9kIGRvZXMgbm90IHBlcmZvcm0gYW55IG9wZXJhdGlvbnMgaXRzZWxmIGJ1dCBlbnN1cmVzIHRoYXQgYW4gaW5zdGFuY2Ugb2YgRWRpdGFibGVOYXZpZ2F0aW9uXG4gICAgICogaXMgY3JlYXRlZCBhbmQgcmVhZHkgdG8gbGlzdGVuIHRvIGtleWJvYXJkIGV2ZW50cy4gVGhpcyBpcyBjcnVjaWFsIGZvciBzZXR0aW5nIHVwIHRoZSBldmVudCBsaXN0ZW5lcnNcbiAgICAgKiB0aGF0IG1hbmFnZSBuYXZpZ2F0aW9uIHdpdGhpbiBlZGl0YWJsZSBjb250ZW50IGFyZWFzLCBhcyBpdCB0cmlnZ2VycyB0aGUgbmVjZXNzYXJ5IGJpbmRpbmdzIHVwb24gaW5zdGFudGlhdGlvbi5cbiAgICAgKi9cbiAgICBsaXN0ZW4oKTogdm9pZCB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiRWRpdGFibGVOYXZpZ2F0aW9uIGlzIG5vdyBsaXN0ZW5pbmcgZm9yIGtleSBldmVudHMuXCIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHJpZXZlcyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBFZGl0YWJsZU5hdmlnYXRpb24gY2xhc3MuXG4gICAgICogSWYgdGhlIGluc3RhbmNlIGRvZXMgbm90IGV4aXN0LCBpdCBjcmVhdGVzIGEgbmV3IG9uZS5cbiAgICAgKiBAcmV0dXJucyB7RWRpdGFibGVOYXZpZ2F0aW9ufSBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBFZGl0YWJsZU5hdmlnYXRpb24gY2xhc3MuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRJbnN0YW5jZSgpOiBFZGl0YWJsZU5hdmlnYXRpb24ge1xuXG4gICAgICAgIGlmICghRWRpdGFibGVOYXZpZ2F0aW9uLmluc3RhbmNlKSB7XG5cbiAgICAgICAgICAgIGNvbnN0IHF1aWNrTWVudSA9IERlcGVuZGVuY3lDb250YWluZXIuSW5zdGFuY2UucmVzb2x2ZTxJUXVpY2tNZW51PihcIklRdWlja01lbnVcIik7XG5cbiAgICAgICAgICAgIEVkaXRhYmxlTmF2aWdhdGlvbi5pbnN0YW5jZSA9IG5ldyBFZGl0YWJsZU5hdmlnYXRpb24ocXVpY2tNZW51KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gRWRpdGFibGVOYXZpZ2F0aW9uLmluc3RhbmNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgaGFuZGxlQXJyb3dLZXlzKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG5cbiAgICAgICAgaWYgKCF0aGlzLnF1aWNrTWVudS5pc1Zpc2libGUgJiYgZXZlbnQua2V5LnN0YXJ0c1dpdGgoJ0Fycm93JykgJiYgIWV2ZW50LmFsdEtleSAmJiAhZXZlbnQuY3RybEtleSAmJiAhZXZlbnQuYWx0S2V5ICYmICFldmVudC5zaGlmdEtleSAmJiAhZXZlbnQubWV0YUtleSkge1xuXG4gICAgICAgICAgICBjb25zdCBjdXJyZW50RWRpdGFibGUgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xuXG4gICAgICAgICAgICBpZiAoY3VycmVudEVkaXRhYmxlICYmIGN1cnJlbnRFZGl0YWJsZS5pc0NvbnRlbnRFZGl0YWJsZSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNob3VsZFN3aXRjaEVkaXRhYmxlKGN1cnJlbnRFZGl0YWJsZSwgZXZlbnQua2V5IGFzIERpcmVjdGlvbnMpKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV4dEVkaXRhYmxlID0gdGhpcy5maW5kTmV4dEVkaXRhYmxlKGN1cnJlbnRFZGl0YWJsZSwgZXZlbnQua2V5IGFzIERpcmVjdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobmV4dEVkaXRhYmxlKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50LmtleSA9PSBEaXJlY3Rpb25zLkFycm93VXAgfHwgZXZlbnQua2V5ID09IERpcmVjdGlvbnMuQXJyb3dEb3duKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbGFjZUNhcmV0SW5TaW1pbGFyUG9zaXRpb24oY3VycmVudEVkaXRhYmxlLCBuZXh0RWRpdGFibGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQua2V5ID09IERpcmVjdGlvbnMuQXJyb3dMZWZ0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRE9NVXRpbHMucGxhY2VDdXJzb3JBdEVuZE9mRWRpdGFibGVFbGVtZW50KG5leHRFZGl0YWJsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChldmVudC5rZXkgPT0gRGlyZWN0aW9ucy5BcnJvd1JpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRE9NVXRpbHMucGxhY2VDdXJzb3JBdFN0YXJ0T2ZFZGl0YWJsZUVsZW1lbnQobmV4dEVkaXRhYmxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEVkaXRhYmxlLmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAqIERldGVybWluZXMgaWYgbmF2aWdhdGlvbiBzaG91bGQgc3dpdGNoIGZyb20gdGhlIGN1cnJlbnQgZWRpdGFibGUgZWxlbWVudCBiYXNlZCBvbiB0aGUgYXJyb3cgZGlyZWN0aW9uIGFuZCBjYXJldCBwb3NpdGlvbi5cbiAgICAqIEl0IGNoZWNrcyBpZiB0aGUgY2FyZXQgaXMgYXQgdGhlIHN0YXJ0IG9yIGVuZCBvZiB0aGUgY29udGVudCBhbmQgZXZhbHVhdGVzIGJvdW5kYXJ5IGNvbmRpdGlvbnMgZm9yIHZlcnRpY2FsIG5hdmlnYXRpb24uXG4gICAgKiBcbiAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnQgLSBUaGUgY3VycmVudCBjb250ZW50ZWRpdGFibGUgZWxlbWVudCBiZWluZyBldmFsdWF0ZWQuXG4gICAgKiBAcGFyYW0ge0RpcmVjdGlvbnN9IGRpcmVjdGlvbiAtIFRoZSBuYXZpZ2F0aW9uIGRpcmVjdGlvbiBpbmRpY2F0ZWQgYnkgdGhlIGFycm93IGtleSBwcmVzcy5cbiAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIHRydWUgaWYgdGhlIG5hdmlnYXRpb24gc2hvdWxkIG1vdmUgdG8gYW5vdGhlciBlbGVtZW50LCBmYWxzZSBvdGhlcndpc2UuXG4gICAgKi9cbiAgICBwcml2YXRlIHNob3VsZFN3aXRjaEVkaXRhYmxlKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBkaXJlY3Rpb246IERpcmVjdGlvbnMpOiBib29sZWFuIHtcblxuICAgICAgICBjb25zdCBzZWwgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG5cbiAgICAgICAgLy8gSWYgaGFzIHNlbGVjdGlvbiBpZ25vcmUgbmF2aWdhdGlvbiBcbiAgICAgICAgaWYgKHNlbCAmJiBzZWwucmFuZ2VDb3VudCA+IDApIHtcbiAgICAgICAgICAgIGxldCByYW5nZSA9IHNlbC5nZXRSYW5nZUF0KDApO1xuICAgICAgICAgICAgaWYgKHJhbmdlLmVuZE9mZnNldCAhPSByYW5nZS5zdGFydE9mZnNldCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNlbCAmJiBzZWwucmFuZ2VDb3VudCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHsgYXRTdGFydCwgYXRFbmQgfSA9IERPTVV0aWxzLmdldFNlbGVjdGlvblRleHRJbmZvKGVsZW1lbnQpO1xuICAgICAgICAgICAgY29uc3QgaXNBdEZpcnN0TGluZSA9IHRoaXMuaXNBdExpbmVCb3VuZGFyeShlbGVtZW50LCBCb3VuZGFyaWVzLkZpcnN0KTtcbiAgICAgICAgICAgIGNvbnN0IGlzQXRMYXN0TGluZSA9IHRoaXMuaXNBdExpbmVCb3VuZGFyeShlbGVtZW50LCBCb3VuZGFyaWVzLkxhc3QpO1xuXG4gICAgICAgICAgICBpZiAoKGRpcmVjdGlvbiA9PT0gRGlyZWN0aW9ucy5BcnJvd0xlZnQgJiYgYXRTdGFydCkgfHwgKGRpcmVjdGlvbiA9PT0gRGlyZWN0aW9ucy5BcnJvd1JpZ2h0ICYmIGF0RW5kKSB8fFxuICAgICAgICAgICAgICAgIChkaXJlY3Rpb24gPT09IERpcmVjdGlvbnMuQXJyb3dVcCAmJiAoYXRTdGFydCB8fCBpc0F0Rmlyc3RMaW5lKSkgfHxcbiAgICAgICAgICAgICAgICAoZGlyZWN0aW9uID09PSBEaXJlY3Rpb25zLkFycm93RG93biAmJiAoYXRFbmQgfHwgaXNBdExhc3RMaW5lKSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNBdExpbmVCb3VuZGFyeShlbGVtZW50OiBIVE1MRWxlbWVudCwgYm91bmRhcnk6IEJvdW5kYXJpZXMpOiBib29sZWFuIHtcblxuICAgICAgICBjb25zdCBoYXNUZXh0Q29udGVudCA9IGVsZW1lbnQudGV4dENvbnRlbnQ/LnRyaW0oKSAhPT0gXCJcIjtcblxuICAgICAgICBpZiAoIWhhc1RleHRDb250ZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcbiAgICAgICAgaWYgKCFzZWxlY3Rpb24gfHwgc2VsZWN0aW9uLnJhbmdlQ291bnQgPT09IDApIHJldHVybiBmYWxzZTtcblxuICAgICAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xuICAgICAgICBjb25zdCByZWN0ID0gcmFuZ2UuZ2V0Q2xpZW50UmVjdHMoKVswXTtcblxuICAgICAgICBpZiAoIXJlY3QpIHJldHVybiB0cnVlO1xuXG4gICAgICAgIGNvbnN0IGVsZW1lbnRSZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgY29uc3QgdG9sZXJhbmNlID0gMTE7XG5cbiAgICAgICAgaWYgKGJvdW5kYXJ5ID09PSBCb3VuZGFyaWVzLkZpcnN0KSB7XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5hYnMocmVjdC50b3AgLSBlbGVtZW50UmVjdC50b3ApIDwgdG9sZXJhbmNlO1xuICAgICAgICB9IGVsc2UgaWYgKGJvdW5kYXJ5ID09PSBCb3VuZGFyaWVzLkxhc3QpIHtcbiAgICAgICAgICAgIHJldHVybiBNYXRoLmFicyhyZWN0LmJvdHRvbSAtIGVsZW1lbnRSZWN0LmJvdHRvbSkgPCB0b2xlcmFuY2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBMb2NhdGVzIHRoZSBuZXh0IGNvbnRlbnRlZGl0YWJsZSBlbGVtZW50IGluIHRoZSBzcGVjaWZpZWQgbmF2aWdhdGlvbiBkaXJlY3Rpb24uXG4gICAgKiBUaGlzIGZ1bmN0aW9uIHRha2VzIGludG8gYWNjb3VudCBib3RoIGhvcml6b250YWwgKGxlZnQvcmlnaHQpIGFuZCB2ZXJ0aWNhbCAodXAvZG93bikgZGlyZWN0aW9ucyBhbmQgaGFuZGxlcyB0YWJsZSBjZWxsIGJvdW5kYXJpZXMuXG4gICAgKiBcbiAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGN1cnJlbnQgLSBUaGUgY3VycmVudCBjb250ZW50ZWRpdGFibGUgZWxlbWVudC5cbiAgICAqIEBwYXJhbSB7RGlyZWN0aW9uc30gZGlyZWN0aW9uIC0gVGhlIGRpcmVjdGlvbiBvZiB0aGUgYXJyb3cga2V5IG5hdmlnYXRpb24uXG4gICAgKiBAcmV0dXJucyB7SFRNTEVsZW1lbnQgfCBudWxsfSBUaGUgbmV4dCBjb250ZW50ZWRpdGFibGUgZWxlbWVudCBpbiB0aGUgZGVzaXJlZCBkaXJlY3Rpb24gb3IgbnVsbCBpZiBubyBzdWl0YWJsZSBlbGVtZW50IGlzIGZvdW5kLlxuICAgICovXG4gICAgcHJpdmF0ZSBmaW5kTmV4dEVkaXRhYmxlKGN1cnJlbnQ6IEhUTUxFbGVtZW50LCBkaXJlY3Rpb246IERpcmVjdGlvbnMpOiBIVE1MRWxlbWVudCB8IG51bGwge1xuICAgICAgICBjb25zdCBhbGxFZGl0YWJsZXMgPSBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tjb250ZW50ZWRpdGFibGU9XCJ0cnVlXCJdJykpIGFzIEhUTUxFbGVtZW50W107XG4gICAgICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IGFsbEVkaXRhYmxlcy5pbmRleE9mKGN1cnJlbnQpO1xuXG4gICAgICAgIGlmIChjdXJyZW50LmNsb3Nlc3QoXCJ0ZFwiKSkge1xuICAgICAgICAgICAgY29uc3QgdGFibGUgPSBjdXJyZW50LmNsb3Nlc3QoXCJ0YWJsZVwiKTtcbiAgICAgICAgICAgIGNvbnN0IGNlbGwgPSBjdXJyZW50LmNsb3Nlc3QoXCJ0ZFwiKTtcbiAgICAgICAgICAgIGlmICh0YWJsZSAmJiBjZWxsKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmVpZ2hib3JDZWxsID0gVGFibGVVdGlscy5nZXROZWlnaGJvckNlbGwodGFibGUsIGNlbGwsIGRpcmVjdGlvbik7XG4gICAgICAgICAgICAgICAgaWYgKG5laWdoYm9yQ2VsbCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmVpZ2hib3JDZWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBuZXh0SW5kZXggPSAtMTtcbiAgICAgICAgaWYgKGRpcmVjdGlvbiA9PT0gRGlyZWN0aW9ucy5BcnJvd0xlZnQgfHwgZGlyZWN0aW9uID09PSBEaXJlY3Rpb25zLkFycm93UmlnaHQpIHtcbiAgICAgICAgICAgIG5leHRJbmRleCA9IGRpcmVjdGlvbiA9PT0gRGlyZWN0aW9ucy5BcnJvd0xlZnQgPyBjdXJyZW50SW5kZXggLSAxIDogY3VycmVudEluZGV4ICsgMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5leHRJbmRleCA9IHRoaXMuZmluZFZlcnRpY2FsRWRpdGFibGUoY3VycmVudCwgYWxsRWRpdGFibGVzLCBkaXJlY3Rpb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5leHRJbmRleCA8IDAgfHwgbmV4dEluZGV4ID49IGFsbEVkaXRhYmxlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsOyAvLyBQcmV2ZW50IHdyYXBhcm91bmRcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhbGxFZGl0YWJsZXNbbmV4dEluZGV4XSB8fCBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogRmluZHMgdGhlIG5leHQgY29udGVudGVkaXRhYmxlIGVsZW1lbnQgaW4gYSB2ZXJ0aWNhbCBkaXJlY3Rpb24gKHVwIG9yIGRvd24pIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IGVsZW1lbnQuXG4gICAgKiBJdCBjYWxjdWxhdGVzIHRoZSBjbG9zZXN0IGVkaXRhYmxlIGVsZW1lbnQgYmFzZWQgb24gdmVydGljYWwgZGlzdGFuY2UgYW5kIG1pbmltYWwgaG9yaXpvbnRhbCBzaGlmdCwgZmF2b3JpbmcgZWxlbWVudHMgZGlyZWN0bHkgYWJvdmUgb3IgYmVsb3cuXG4gICAgKiBcbiAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGN1cnJlbnQgLSBUaGUgY3VycmVudGx5IGZvY3VzZWQgY29udGVudGVkaXRhYmxlIGVsZW1lbnQuXG4gICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50W119IGFsbEVkaXRhYmxlcyAtIEFuIGFycmF5IG9mIGFsbCBjb250ZW50ZWRpdGFibGUgZWxlbWVudHMuXG4gICAgKiBAcGFyYW0ge0RpcmVjdGlvbnN9IGRpcmVjdGlvbiAtIFRoZSBkaXJlY3Rpb24gb2YgbmF2aWdhdGlvbiwgZWl0aGVyIHVwIG9yIGRvd24uXG4gICAgKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgaW5kZXggb2YgdGhlIGNsb3Nlc3QgdmVydGljYWwgZWRpdGFibGUgZWxlbWVudCBvciB0aGUgY3VycmVudCBpbmRleCBpZiBub25lIGFyZSBjbG9zZXIuXG4gICAgKi9cbiAgICBwcml2YXRlIGZpbmRWZXJ0aWNhbEVkaXRhYmxlKGN1cnJlbnQ6IEhUTUxFbGVtZW50LCBhbGxFZGl0YWJsZXM6IEhUTUxFbGVtZW50W10sIGRpcmVjdGlvbjogRGlyZWN0aW9ucyk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IGFsbEVkaXRhYmxlcy5pbmRleE9mKGN1cnJlbnQpO1xuICAgICAgICBjb25zdCBjdXJyZW50UmVjdCA9IGN1cnJlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGxldCBjbG9zZXN0SW5kZXggPSAtMTtcbiAgICAgICAgbGV0IGNsb3Nlc3REaXN0YW5jZSA9IEluZmluaXR5O1xuXG4gICAgICAgIGFsbEVkaXRhYmxlcy5mb3JFYWNoKChlZGl0YWJsZSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGlmIChlZGl0YWJsZSAhPT0gY3VycmVudCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlY3QgPSBlZGl0YWJsZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgICAgICBjb25zdCB2ZXJ0aWNhbERpc3RhbmNlID0gZGlyZWN0aW9uID09PSBEaXJlY3Rpb25zLkFycm93VXAgPyBjdXJyZW50UmVjdC50b3AgLSByZWN0LmJvdHRvbSA6IHJlY3QudG9wIC0gY3VycmVudFJlY3QuYm90dG9tO1xuICAgICAgICAgICAgICAgIGNvbnN0IGhvcml6b250YWxEaXN0YW5jZSA9IE1hdGguYWJzKGN1cnJlbnRSZWN0LmxlZnQgLSByZWN0LmxlZnQpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHZlcnRpY2FsRGlzdGFuY2UgPiAwICYmICh2ZXJ0aWNhbERpc3RhbmNlICsgaG9yaXpvbnRhbERpc3RhbmNlIDwgY2xvc2VzdERpc3RhbmNlKSkge1xuICAgICAgICAgICAgICAgICAgICBjbG9zZXN0RGlzdGFuY2UgPSB2ZXJ0aWNhbERpc3RhbmNlICsgaG9yaXpvbnRhbERpc3RhbmNlO1xuICAgICAgICAgICAgICAgICAgICBjbG9zZXN0SW5kZXggPSBpbmRleDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBjbG9zZXN0SW5kZXggPT09IC0xID8gY3VycmVudEluZGV4IDogY2xvc2VzdEluZGV4O1xuICAgIH1cblxuICAgIC8qKlxuICAgICogUGxhY2VzIHRoZSBjYXJldCBpbiBhIHBvc2l0aW9uIHdpdGhpbiB0aGUgbmV4dCBlbGVtZW50IHRoYXQgY2xvc2VseSBtYXRjaGVzIGl0cyBwb3NpdGlvbiBpbiB0aGUgY3VycmVudCBlbGVtZW50LlxuICAgICogVGhpcyBpcyB1c2VmdWwgd2hlbiBtb3ZpbmcgZm9jdXMgYmV0d2VlbiBjb250ZW50ZWRpdGFibGUgZWxlbWVudHMgdG8gbWFpbnRhaW4gYSBjb25zaXN0ZW50IHVzZXIgZXhwZXJpZW5jZS5cbiAgICAqIFxuICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gY3VycmVudCAtIFRoZSBjdXJyZW50IGNvbnRlbnRlZGl0YWJsZSBlbGVtZW50IHdoZXJlIHRoZSBjYXJldCBpcyBsb2NhdGVkLlxuICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gbmV4dCAtIFRoZSBuZXh0IGNvbnRlbnRlZGl0YWJsZSBlbGVtZW50IHRvIHdoaWNoIHRoZSBjYXJldCB3aWxsIG1vdmUuXG4gICAgKi9cbiAgICBwcml2YXRlIHBsYWNlQ2FyZXRJblNpbWlsYXJQb3NpdGlvbihjdXJyZW50OiBIVE1MRWxlbWVudCwgbmV4dDogSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgY29uc3Qgc2VsID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICAgICAgICBpZiAoc2VsICYmIHNlbC5yYW5nZUNvdW50ID4gMCkge1xuICAgICAgICAgICAgY29uc3QgY3VycmVudFJhbmdlID0gc2VsLmdldFJhbmdlQXQoMCk7XG4gICAgICAgICAgICBjb25zdCByZWN0ID0gY3VycmVudFJhbmdlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICAgICAgICBzZWwucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgICAgICAgICBjb25zdCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG5cbiAgICAgICAgICAgIGNvbnN0IHdhbGtlciA9IGRvY3VtZW50LmNyZWF0ZVRyZWVXYWxrZXIobmV4dCwgTm9kZUZpbHRlci5TSE9XX1RFWFQpO1xuICAgICAgICAgICAgbGV0IG5vZGUgPSB3YWxrZXIubmV4dE5vZGUoKTtcbiAgICAgICAgICAgIGxldCBiZXN0Tm9kZSA9IG5vZGU7XG4gICAgICAgICAgICBsZXQgYmVzdE9mZnNldCA9IDA7XG4gICAgICAgICAgICBsZXQgYmVzdERpc3RhbmNlID0gSW5maW5pdHk7XG5cbiAgICAgICAgICAgIGlmIChiZXN0Tm9kZSkge1xuICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFub2RlIHx8ICFub2RlLm5vZGVWYWx1ZSkgY29udGludWU7XG5cbiAgICAgICAgICAgICAgICAgICAgcmFuZ2Uuc2V0U3RhcnQobm9kZSwgMCk7XG4gICAgICAgICAgICAgICAgICAgIHJhbmdlLnNldEVuZChub2RlLCBub2RlLm5vZGVWYWx1ZS5sZW5ndGgpO1xuXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS5ub2RlVmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlLnNldFN0YXJ0KG5vZGUsIGkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UuY29sbGFwc2UodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZXN0UmVjdCA9IHJhbmdlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBob3Jpem9udGFsRGlzdGFuY2UgPSBNYXRoLmFicyh0ZXN0UmVjdC5sZWZ0IC0gcmVjdC5sZWZ0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChob3Jpem9udGFsRGlzdGFuY2UgPCBiZXN0RGlzdGFuY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZXN0RGlzdGFuY2UgPSBob3Jpem9udGFsRGlzdGFuY2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVzdE5vZGUgPSBub2RlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RPZmZzZXQgPSBpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSB3aGlsZSAobm9kZSA9IHdhbGtlci5uZXh0Tm9kZSgpKTtcblxuICAgICAgICAgICAgICAgIHJhbmdlLnNldFN0YXJ0KGJlc3ROb2RlLCBiZXN0T2Zmc2V0KTtcbiAgICAgICAgICAgICAgICByYW5nZS5jb2xsYXBzZSh0cnVlKTtcbiAgICAgICAgICAgICAgICBzZWwuYWRkUmFuZ2UocmFuZ2UpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByYW5nZS5zZWxlY3ROb2RlQ29udGVudHMobmV4dCk7XG4gICAgICAgICAgICAgICAgcmFuZ2UuY29sbGFwc2UodHJ1ZSk7XG4gICAgICAgICAgICAgICAgc2VsLmFkZFJhbmdlKHJhbmdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxufSIsImltcG9ydCAnLi9hc3NldHMvY3NzL21haW4uY3NzJztcclxuaW1wb3J0IHsgVUlCdWlsZGVyIH0gZnJvbSAnLi9idWlsZGVycy9VSUJ1aWxkZXInO1xyXG5pbXBvcnQgeyBDb21tYW5kRGlzcGF0Y2hlciB9IGZyb20gJy4vY29tbWFuZHMvQ29tbWFuZERpc3BhdGNoZXInO1xyXG5pbXBvcnQgeyBTaG9ydGN1dExpc3RlbmVycyB9IGZyb20gJy4vY29yZS9TaG9ydGN1dExpc3RlbmVycyc7XHJcbmltcG9ydCB7IFRhYmxlTGlzdGVuZXJzIH0gZnJvbSAnLi9jb3JlL2xpc3RlbmVycy9UYWJsZUxpc3RlbmVycyc7XHJcbmltcG9ydCB7IFF1aWNrTWVudSB9IGZyb20gJy4vY29tcG9uZW50cy9xdWljay1tZW51L1F1aWNrTWVudSc7XHJcbmltcG9ydCB7IERlcGVuZGVuY3lDb250YWluZXIgfSBmcm9tICcuL2NvcmUvRGVwZW5kZW5jeUNvbnRhaW5lcic7XHJcbmltcG9ydCB7IEZvY3VzU3RhY2sgfSBmcm9tICcuL2NvcmUvRm9jdXNTdGFjayc7XHJcbmltcG9ydCB7IEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL2Jsb2NrLW9wZXJhdGlvbnMvQmxvY2tPcGVyYXRpb25zU2VydmljZSc7XHJcbmltcG9ydCB7IEVsZW1lbnRGYWN0b3J5U2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvZWxlbWVudC1mYWN0b3J5L0VsZW1lbnRGYWN0b3J5U2VydmljZSc7XHJcbmltcG9ydCB7IFRleHRPcGVyYXRpb25zU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvdGV4dC1vcGVyYXRpb25zL1RleHRPcGVyYXRpb25zU2VydmljZSc7XHJcbmltcG9ydCB7IFRhYmxlT3BlcmF0aW9uc1NlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL3RhYmxlLW9wZXJhdGlvbnMvVGFibGVPcGVyYXRpb25zU2VydmljZSc7XHJcbmltcG9ydCB7IFRhYmxlQ29udGV4dEZsb2F0aW5nVG9vbGJhciB9IGZyb20gJy4vY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL1RhYmxlQ29udGV4dEZsb2F0aW5nVG9vbGJhcic7XHJcbmltcG9ydCB7IE1lbWVudG8gfSBmcm9tICcuL2NvcmUvTWVtZW50byc7XHJcbmltcG9ydCB7IEVkaXRhYmxlTmF2aWdhdGlvbiB9IGZyb20gJy4vY29yZS9FZGl0YWJsZU5hdmlnYXRpb24nO1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgc2NyaXB0IGluaXRpYWxpemVzIHRoZSBlZGl0b3IgYW5kIHNldHMgdXAgZXZlbnQgbGlzdGVuZXJzIG9uY2UgdGhlIERPTSBjb250ZW50IGhhcyBmdWxseSBsb2FkZWQuXHJcbiAqIEl0IGlzIHJlc3BvbnNpYmxlIGZvciBidWlsZGluZyB0aGUgdXNlciBpbnRlcmZhY2UgYW5kIHN0YXJ0aW5nIHRoZSBldmVudCBsaXN0ZW5pbmcgcHJvY2VzcyB0byBoYW5kbGUgY29tbWFuZHMuXHJcbiAqXHJcbiAqIFRoZSBgRE9NQ29udGVudExvYWRlZGAgZXZlbnQgZW5zdXJlcyB0aGF0IGFsbCB0aGUgRE9NIGNvbnRlbnQgaGFzIGJlZW4gZnVsbHkgcGFyc2VkIGFuZCBsb2FkZWQgYmVmb3JlIHRoZSBpbml0aWFsaXphdGlvbiBiZWdpbnMuXHJcbiAqIGBVSUJ1aWxkZXIuYnVpbGQoKS5zdGFydCgpO2AgaXMgdXNlZCB0byBjb25zdHJ1Y3QgYW5kIGFjdGl2YXRlIHRoZSB1c2VyIGludGVyZmFjZS5cclxuICogYENvbW1hbmREaXNwYXRjaGVyLmdldEluc3RhbmNlKCkubGlzdGVuKCk7YCByZXRyaWV2ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIENvbW1hbmREaXNwYXRjaGVyIGFuZCBzdGFydHMgbGlzdGVuaW5nIGZvciBldmVudHMuXHJcbiAqL1xyXG5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgZnVuY3Rpb24gKCkge1xyXG5cclxuICAgIERlcGVuZGVuY3lDb250YWluZXIuSW5zdGFuY2UucmVnaXN0ZXIoXCJJTWVtZW50b1wiLCAoKSA9PiBNZW1lbnRvLmdldEluc3RhbmNlKCkpO1xyXG4gICAgRGVwZW5kZW5jeUNvbnRhaW5lci5JbnN0YW5jZS5yZWdpc3RlcihcIklTaG9ydGN1dExpc3RlbmVyc1wiLCAoKSA9PiBTaG9ydGN1dExpc3RlbmVycy5nZXRJbnN0YW5jZSgpKTtcclxuICAgIERlcGVuZGVuY3lDb250YWluZXIuSW5zdGFuY2UucmVnaXN0ZXIoXCJJVGFibGVMaXN0ZW5lcnNcIiwgKCkgPT4gVGFibGVMaXN0ZW5lcnMuZ2V0SW5zdGFuY2UoKSk7XHJcblxyXG4gICAgRGVwZW5kZW5jeUNvbnRhaW5lci5JbnN0YW5jZS5yZWdpc3RlcihcIklGb2N1c1N0YWNrXCIsICgpID0+IEZvY3VzU3RhY2suZ2V0SW5zdGFuY2UoKSk7XHJcbiAgICBEZXBlbmRlbmN5Q29udGFpbmVyLkluc3RhbmNlLnJlZ2lzdGVyKFwiSUVsZW1lbnRGYWN0b3J5U2VydmljZVwiLCAoKSA9PiBFbGVtZW50RmFjdG9yeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKSk7XHJcbiAgICBEZXBlbmRlbmN5Q29udGFpbmVyLkluc3RhbmNlLnJlZ2lzdGVyKFwiSVRleHRPcGVyYXRpb25zU2VydmljZVwiLCAoKSA9PiBUZXh0T3BlcmF0aW9uc1NlcnZpY2UuZ2V0SW5zdGFuY2UoKSk7XHJcbiAgICBEZXBlbmRlbmN5Q29udGFpbmVyLkluc3RhbmNlLnJlZ2lzdGVyKFwiSVRhYmxlT3BlcmF0aW9uc1NlcnZpY2VcIiwgKCkgPT4gVGFibGVPcGVyYXRpb25zU2VydmljZS5nZXRJbnN0YW5jZSgpKTtcclxuICAgIERlcGVuZGVuY3lDb250YWluZXIuSW5zdGFuY2UucmVnaXN0ZXIoXCJJQmxvY2tPcGVyYXRpb25zU2VydmljZVwiLCAoKSA9PiBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLmdldEluc3RhbmNlKCkpO1xyXG5cclxuICAgIC8vVXNlckludGVyZmFjZVxyXG4gICAgRGVwZW5kZW5jeUNvbnRhaW5lci5JbnN0YW5jZS5yZWdpc3RlcihcIklRdWlja01lbnVcIiwgKCkgPT4gUXVpY2tNZW51LmdldEluc3RhbmNlKCkpO1xyXG4gICAgRGVwZW5kZW5jeUNvbnRhaW5lci5JbnN0YW5jZS5yZWdpc3RlcihcIklUYWJsZUNvbnRleHRGbG9hdGluZ1Rvb2xiYXJcIiwgKCkgPT4gVGFibGVDb250ZXh0RmxvYXRpbmdUb29sYmFyLmdldEluc3RhbmNlKCkpO1xyXG4gICAgRGVwZW5kZW5jeUNvbnRhaW5lci5JbnN0YW5jZS5yZWdpc3RlcihcIklFZGl0YWJsZU5hdmlnYXRpb25cIiwgKCkgPT4gRWRpdGFibGVOYXZpZ2F0aW9uLmdldEluc3RhbmNlKCkpO1xyXG5cclxuICAgIFVJQnVpbGRlci5idWlsZCgpLnN0YXJ0KCk7XHJcbiAgICBDb21tYW5kRGlzcGF0Y2hlci5nZXRJbnN0YW5jZSgpLmxpc3RlbigpO1xyXG4gICAgRWRpdGFibGVOYXZpZ2F0aW9uLmdldEluc3RhbmNlKCkubGlzdGVuKCk7XHJcbn0pOyJdLCJuYW1lcyI6WyJfX19DU1NfTE9BREVSX0VYUE9SVF9fXyIsInB1c2giLCJtb2R1bGUiLCJpZCIsImV4cG9ydHMiLCJjc3NXaXRoTWFwcGluZ1RvU3RyaW5nIiwibGlzdCIsInRvU3RyaW5nIiwidGhpcyIsIm1hcCIsIml0ZW0iLCJjb250ZW50IiwibmVlZExheWVyIiwiY29uY2F0IiwibGVuZ3RoIiwiam9pbiIsImkiLCJtb2R1bGVzIiwibWVkaWEiLCJkZWR1cGUiLCJzdXBwb3J0cyIsImxheWVyIiwidW5kZWZpbmVkIiwiYWxyZWFkeUltcG9ydGVkTW9kdWxlcyIsImsiLCJfayIsImNzc01hcHBpbmciLCJidG9hIiwiYmFzZTY0IiwidW5lc2NhcGUiLCJlbmNvZGVVUklDb21wb25lbnQiLCJKU09OIiwic3RyaW5naWZ5IiwiZGF0YSIsInNvdXJjZU1hcHBpbmciLCJzdHlsZXNJbkRPTSIsImdldEluZGV4QnlJZGVudGlmaWVyIiwiaWRlbnRpZmllciIsInJlc3VsdCIsIm1vZHVsZXNUb0RvbSIsIm9wdGlvbnMiLCJpZENvdW50TWFwIiwiaWRlbnRpZmllcnMiLCJiYXNlIiwiY291bnQiLCJpbmRleEJ5SWRlbnRpZmllciIsIm9iaiIsImNzcyIsInNvdXJjZU1hcCIsInJlZmVyZW5jZXMiLCJ1cGRhdGVyIiwiYWRkRWxlbWVudFN0eWxlIiwiYnlJbmRleCIsInNwbGljZSIsImFwaSIsImRvbUFQSSIsInVwZGF0ZSIsIm5ld09iaiIsInJlbW92ZSIsImxhc3RJZGVudGlmaWVycyIsIm5ld0xpc3QiLCJpbmRleCIsIm5ld0xhc3RJZGVudGlmaWVycyIsIl9pIiwiX2luZGV4IiwibWVtbyIsImluc2VydCIsInN0eWxlIiwidGFyZ2V0Iiwic3R5bGVUYXJnZXQiLCJkb2N1bWVudCIsInF1ZXJ5U2VsZWN0b3IiLCJ3aW5kb3ciLCJIVE1MSUZyYW1lRWxlbWVudCIsImNvbnRlbnREb2N1bWVudCIsImhlYWQiLCJlIiwiZ2V0VGFyZ2V0IiwiRXJyb3IiLCJhcHBlbmRDaGlsZCIsImVsZW1lbnQiLCJjcmVhdGVFbGVtZW50Iiwic2V0QXR0cmlidXRlcyIsImF0dHJpYnV0ZXMiLCJzdHlsZUVsZW1lbnQiLCJub25jZSIsInNldEF0dHJpYnV0ZSIsImluc2VydFN0eWxlRWxlbWVudCIsInN0eWxlVGFnVHJhbnNmb3JtIiwiYXBwbHkiLCJwYXJlbnROb2RlIiwicmVtb3ZlQ2hpbGQiLCJyZW1vdmVTdHlsZUVsZW1lbnQiLCJzdHlsZVNoZWV0IiwiY3NzVGV4dCIsImZpcnN0Q2hpbGQiLCJjcmVhdGVUZXh0Tm9kZSIsIl9fd2VicGFja19tb2R1bGVfY2FjaGVfXyIsIl9fd2VicGFja19yZXF1aXJlX18iLCJtb2R1bGVJZCIsImNhY2hlZE1vZHVsZSIsIl9fd2VicGFja19tb2R1bGVzX18iLCJuIiwiZ2V0dGVyIiwiX19lc01vZHVsZSIsImQiLCJhIiwiZGVmaW5pdGlvbiIsImtleSIsIm8iLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImVudW1lcmFibGUiLCJnZXQiLCJwcm9wIiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwibmMiLCJDb250ZW50VHlwZXMiLCJJY29ucyIsIkN1c3RvbUV2ZW50cyIsIkNvbG9ycyIsIkNvbW1hbmRzIiwiQ3VzdG9tVUlFdmVudHMiLCJCdXR0b25JRHMiLCJaSW5kZXgiLCJEZWZhdWx0SlNFdmVudHMiLCJEcm9wZG93bkl0ZW1JRHMiLCJEcm9wZG93bkxpc3RJRHMiLCJEcm9wZG93bk1lbnVJRHMiLCJsb2NhbHMiLCJVdGlscyIsImdlbmVyYXRlVW5pcXVlSWQiLCJ0aW1lUGFydCIsIkRhdGUiLCJub3ciLCJyYW5kb21BcnJheSIsIlVpbnQzMkFycmF5IiwiY3J5cHRvIiwiZ2V0UmFuZG9tVmFsdWVzIiwicmdiVG9IZXgiLCJyZ2IiLCJtYXRjaCIsIk51bWJlciIsIngiLCJoZXgiLCJFbGVtZW50RmFjdG9yeVNlcnZpY2UiLCJjcmVhdG9ycyIsInN0YXRpYyIsIkJMT0NLX1BBUkFHUkFQSCIsIlBBUkFHUkFQSCIsIkNIRUNLQk9YX0lURU0iLCJMSVNUX0lURU0iLCJDT0RFIiwiUVVPVEUiLCJCVUxMRVRFRF9MSVNUIiwiTlVNQkVSRURfTElTVCIsIkNIRUNLX0xJU1QiLCJIRUFERVJfMSIsIkhFQURFUl8yIiwiSEVBREVSXzMiLCJIRUFERVJfNCIsIkhFQURFUl81IiwiSEVBREVSXzYiLCJEUkFHX0hBTkRMRV9CVVRUT04iLCJUQUJMRSIsIklNQUdFIiwiQ0FMTE9VVCIsIl9pbnN0YW5jZSIsInJlZ2lzdGVyIiwiRUxFTUVOVF9UWVBFUyIsImJsb2NrUGFyYWdyYXBoQ3JlYXRvciIsInBhcmFncmFwaENyZWF0b3IiLCJjaGVja2JveEl0ZW1DcmVhdG9yIiwibGlzdEl0ZW1DcmVhdG9yIiwiY29kZUNyZWF0b3IiLCJxdW90ZUNyZWF0b3IiLCJjaGVja0xpc3RDcmVhdG9yIiwiYnVsbGV0ZWRMaXN0Q3JlYXRvciIsIm51bWJlcmVkTGlzdENyZWF0b3IiLCJoZWFkaW5nQ3JlYXRvciIsImRyYWdIYW5kbGVCdXR0b25DcmVhdG9yIiwidGFibGVDcmVhdG9yIiwiaW1hZ2VDcmVhdG9yMiIsImNhbGxvdXRDcmVhdG9yIiwiZ2V0SW5zdGFuY2UiLCJ0eXBlIiwiY3JlYXRvciIsImNyZWF0ZSIsIlR5cGVFcnJvciIsImJsb2NrUGFyYWdyYXBoIiwicGFyYWdyYXBoIiwibGV2ZWwiLCJoZWFkaW5nIiwiY2hlY2tib3hJdGVtIiwibGlzdEl0ZW1fMiIsImRyYWdIYW5kbGVCdXR0b24iLCJwcmUiLCJjb2RlIiwidGV4dENvbnRlbnQiLCJjb250ZW50RWRpdGFibGUiLCJjbGFzc0xpc3QiLCJhZGQiLCJibG9ja3F1b3RlIiwidWwiLCJDaGVja0xpc3QiLCJpbml0aWFsSXRlbSIsIkJ1bGxldGVkTGlzdCIsIk51bWJlcmVkTGlzdCIsInRhYmxlU2hlbGwiLCJ0YWJsZUNvbnRyb2xsZXIiLCJ0YWJsZVdyYXBwZXIiLCJ0YWJsZSIsIlRhYmxlIiwidGJvZHkiLCJyb3dEYXRhIiwic3BsaXQiLCJyb3ciLCJmb3JFYWNoIiwiY2VsbENvbnRlbnQiLCJjZWxsIiwiYWRkUm93IiwiaW5uZXJIVE1MIiwiYWRkQ29sdW1uIiwiaW1hZ2VDb250YWluZXIiLCJJbWFnZSIsIkFUVFJJQlVURV9OT0RFIiwidGV4dEFyZWEiLCJwYWRkaW5nIiwiYmFja2dyb3VuZENvbG9yIiwiY29sb3IiLCJkaXNwbGF5IiwiZ2FwIiwiYWxpZ25JdGVtcyIsImljb24iLCJzcGFuIiwiaW5uZXJUZXh0Iiwib3B0aW9uc0J1dHRvbiIsIm1vcmVPcHRpb25zQnV0dG9uIiwicG9zaXRpb24iLCJ0b3AiLCJyaWdodCIsImJvcmRlciIsImJhY2tncm91bmQiLCJjdXJzb3IiLCJpbWFnZUNyZWF0b3IiLCJpbWciLCJzcmMiLCJhbHQiLCJ3aWR0aCIsImhlaWdodCIsImFkZEV2ZW50TGlzdGVuZXIiLCJjb25zb2xlIiwibG9nIiwiY2FsbG91dCIsInAiLCJQYXJhZ3JhcGgiLCJoIiwiY2hlY2tib3giLCJkaXYiLCJuZXdEaXYiLCJuZXdFbGVtZW50IiwiYnV0dG9uIiwiZHJhZ2dhYmxlIiwiaWNvbklkIiwiQmFzZVVJQ29tcG9uZW50IiwiX2NhbkhpZGUiLCJwcm9wcyIsImh0bWxFbGVtZW50IiwicGFyZW50IiwiY29uc3RydWN0b3IiLCJpbml0IiwiYXBwZW5kVG8iLCJpc1Zpc2libGUiLCJ2aXNpYmlsaXR5IiwiY29udGFpbnMiLCJnZXRDb21wdXRlZFN0eWxlIiwicGFyZW50RWxlbWVudCIsInNob3ciLCJoaWRlIiwibG9ja0hpZGUiLCJ1bmxvY2tIaWRlIiwiY2FuSGlkZSIsInZhbHVlIiwiZm9jdXMiLCJjaGFuZ2VDb2xvciIsInJlbW92ZUNvbG9yIiwiY2hhbmdlVmlzaWJpbGl0eVRvVmlzaWJsZSIsImNoYW5nZVZpc2liaWxpdHlUb0hpZGRlbiIsImRvZXNFbGVtZW50T3ZlcmZsb3dTY3JlZW4iLCJvcmlnaW5hbERpc3BsYXkiLCJvcmlnaW5hbFZpc2liaWxpdHkiLCJvcmlnaW5hbFBvc2l0aW9uIiwiZWxlbWVudFJlY3QiLCJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLCJzY3JlZW5XaWR0aCIsImlubmVyV2lkdGgiLCJsZWZ0IiwiRGVwZW5kZW5jeUNvbnRhaW5lciIsImRlcGVuZGVuY2llcyIsIkluc3RhbmNlIiwiaW5zdGFuY2UiLCJyZXNvbHZlIiwiRWRpdG9yIiwiZWxlbWVudEZhY3RvcnlTZXJ2aWNlIiwibWVtZW50byIsInRpdGxlIiwiYWRkQmxvY2siLCJ0ZXh0RmxvYXRpbmdUb29sYmFyIiwicXVpY2tNZW51IiwidGFibGVDb250ZXh0VG9vbGJhciIsIm1lZGlhSW5wdXR0ZXIiLCJibG9ja09wZXJhdGlvbnNTZXJ2aWNlIiwiZmxvYXRpbmdUb29sYmFyIiwidGFibGVUb29sYmFyIiwic3VwZXIiLCJhdHRhY2hFdmVudHMiLCJzYXZlU3RhdGUiLCJnZXRFbGVtZW50QnlJZCIsImVkaXRvcklkIiwiZWRpdG9yQ29uZmlnIiwidGFibGVGbG9hdGluZ1Rvb2xiYXIiLCJjb250YWluZXIiLCJldmVudCIsIk5vZGUiLCJub2RlVHlwZSIsIlRFWFRfTk9ERSIsIkVsZW1lbnQiLCJibG9ja0VsZW1lbnQiLCJjbG9zZXN0IiwiYXBwZW5kRHJhZ0hhbmRsZXIiLCJlcnJvciIsInJlYWR5U3RhdGUiLCJmaXJzdFBhcmFncmFwaCIsImdldEF0dHJpYnV0ZSIsInByZXZlbnREZWZhdWx0IiwiY2xpcGJvYXJkRGF0YSIsInRleHQiLCJnZXREYXRhIiwiaW5zZXJ0VGV4dEF0Q3Vyc29yIiwiYXR0YWNoRHJhZ0hhbmRsZXIiLCJzZWwiLCJnZXRTZWxlY3Rpb24iLCJyYW5nZUNvdW50IiwicmFuZ2UiLCJnZXRSYW5nZUF0IiwiZGVsZXRlQ29udGVudHMiLCJ0ZXh0Tm9kZSIsImluc2VydE5vZGUiLCJzZXRTdGFydEFmdGVyIiwic2V0RW5kQWZ0ZXIiLCJyZW1vdmVBbGxSYW5nZXMiLCJhZGRSYW5nZSIsIkhUTUxFbGVtZW50IiwiZHJhZ0hhbmRsZXIiLCJwcmVwZW5kIiwicmVtb3ZlRHJhZ0hhbmRsZXIiLCJleHRyYWN0Q29udGVudCIsImRyYWdnZWRJdGVtIiwiZHJvcExpbmUiLCJzZXRUaW1lb3V0Iiwib3BhY2l0eSIsInJlbW92ZUF0dHJpYnV0ZSIsImJvdW5kaW5nIiwib2Zmc2V0IiwieSIsImNsaWVudFkiLCJuZXh0RWxlbWVudFNpYmxpbmciLCJpbnNlcnRBZGphY2VudEVsZW1lbnQiLCJwcmV2aW91c0VsZW1lbnRTaWJsaW5nIiwiaW5zZXJ0QmVmb3JlIiwiRE9NVXRpbHMiLCJpc1NlbGVjdGlvbkluVGFibGVDZWxsIiwic2VsZWN0aW9uIiwibm9kZSIsImFuY2hvck5vZGUiLCJFTEVNRU5UX05PREUiLCJ0YWdOYW1lIiwiZ2V0U2VsZWN0aW9uVGV4dEluZm8iLCJlbCIsInNlbFJhbmdlIiwidGVzdFJhbmdlIiwiYXRTdGFydCIsImF0RW5kIiwiY3JlYXRlUmFuZ2UiLCJzZWxlY3ROb2RlQ29udGVudHMiLCJzZXRFbmQiLCJzdGFydENvbnRhaW5lciIsInN0YXJ0T2Zmc2V0Iiwic2V0U3RhcnQiLCJlbmRDb250YWluZXIiLCJlbmRPZmZzZXQiLCJpbnNlcnRBZnRlciIsIm5ld05vZGUiLCJyZWZlcmVuY2VOb2RlIiwibmV4dFNpYmxpbmciLCJoYXNUZXh0Q29udGVudCIsInRyaW0iLCJoYXNDaGlsZE5vZGVzIiwiQXJyYXkiLCJmcm9tIiwiY2hpbGROb2RlcyIsInNvbWUiLCJjaGlsZE5vZGUiLCJjbG9uZUFuZEluc2VydEFmdGVyIiwiY2xvbmVkRWxlbWVudCIsImNsb25lTm9kZSIsImZpbmRDbG9zZXN0QW5jZXN0b3JPZkFjdGl2ZUVsZW1lbnRCeUNsYXNzIiwiY2xhc3NOYW1lIiwiYWN0aXZlRWxlbWVudCIsImN1cnJlbnRFbGVtZW50IiwiZmluZENsb3Nlc3RBbmNlc3Rvck9mU2VsZWN0aW9uQnlDbGFzcyIsImNvbW1vbkFuY2VzdG9yQ29udGFpbmVyIiwicmVhcnJhbmdlQ29udGVudEFmdGVyU3BsaXQiLCJjdXJyZW50Tm9kZSIsImN1cnNvclBvc2l0aW9uIiwiZ2V0Q3Vyc29yUG9zaXRpb24iLCJyYW5nZXMxIiwic3BsaXRDb250ZW50QXRDdXJzb3JTZWxlY3Rpb24iLCJkZWxldGVGcm9tRG9jdW1lbnQiLCJzZXRDdXJzb3JQb3NpdGlvbiIsInJhbmdlczIiLCJpbnRlcnNlY3RzTm9kZSIsInRyZWVXYWxrZXIiLCJjcmVhdGVUcmVlV2Fsa2VyIiwiTm9kZUZpbHRlciIsIlNIT1dfVEVYVCIsImFjY2VwdE5vZGUiLCJGSUxURVJfQUNDRVBUIiwiY2hhckNvdW50IiwibmV4dE5vZGUiLCJjdXJyZW50UG9zIiwidGV4dExlbmd0aCIsImNvbGxhcHNlIiwiZ2V0Q29udGVudFR5cGVGcm9tQWN0aXZlRWxlbWVudCIsImJsb2NrIiwiZ2V0Q3VycmVudEFjdGl2ZUJsb2NrIiwiY29udGVudEVsZW1lbnQiLCJyb290Tm9kZSIsInJhbmdlcyIsInJhbmdlQmVmb3JlIiwicmFuZ2VBZnRlciIsImxhc3RDaGlsZCIsInBsYWNlQ3Vyc29yQXRTdGFydE9mRWRpdGFibGVFbGVtZW50IiwiZWRpdGFibGVFbGVtZW50IiwiaXNDb250ZW50RWRpdGFibGUiLCJ3YXJuIiwicGxhY2VDdXJzb3JBdEVuZE9mRWRpdGFibGVFbGVtZW50IiwiY29udGVudEJsb2NrIiwicmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwibGFzdE5vZGUiLCJpc1NlbGVjdGVkVGV4dERlc2NlbmRhbnRPZiIsInBhcmVudFNlbGVjdG9yIiwicmVtb3ZlRmlsdGVyVGV4dCIsImxhc3RTbGFzaFBvc2l0aW9uIiwic3Vic3RyaW5nIiwibGFzdEluZGV4T2YiLCJmaW5kQ2xpY2tlZEVsZW1lbnRPckFuY2VzdG9yQnlEYXRhQ29udGVudFR5cGUiLCJkYXRhQ29udGVudFR5cGUiLCJjbGlja2VkRWxlbWVudCIsImRhdGFzZXQiLCJjb250ZW50VHlwZSIsImZpbmRDbGlja2VkRWxlbWVudE9yQW5jZXN0b3JCeUlkIiwiZmluZENsaWNrZWRFbGVtZW50T3JBbmNlc3RvckJ5Q2xhc3MiLCJjbGFzc0tleSIsIkNoYW5nZUNvbG9yIiwiU2hvd0hpZGVBY3RpdmVCdXR0b24iLCJpbnRlbnRpb24iLCJSZXNldEFjdGl2ZUJ1dHRvbnMiLCJDbG9zZUVsZW1lbnQiLCJTaG93RWxlbWVudCIsIkV2ZW50RW1pdHRlciIsImVtaXRTaG93RWxlbWVudEV2ZW50IiwidGFyZ2V0SWQiLCJjdXN0b21FdmVudCIsIkN1c3RvbUV2ZW50IiwiZGV0YWlsIiwiYWN0aW9uIiwiZGlzcGF0Y2hFdmVudCIsImVtaXRDbG9zZUVsZW1lbnRFdmVudCIsImVtaXRDaGFuZ2VDb21wb25lbnRDb2xvckV2ZW50IiwiQ29sb3JDaGFuZ2VSZXF1ZXN0IiwiZW1pdFNob3dIaWRlQWN0aXZlRWxlbWVudEV2ZW50IiwidGFyZ2V0Q2xhc3MiLCJpbnRlbnNpb24iLCJIaWxpdGVDb2xvck5vbmUiLCJGb3JlQ29sb3JJbml0aWFsIiwiQmFja2dyb3VuZENvbG9yTm9uZSIsImVtaXRSZXNldEFjdGl2ZUJ1dHRvbnNFbGVtZW50RXZlbnQiLCJlbWl0Q2hhbmdlVGFibGVCb3JkZXJDb2xvckV2ZW50Iiwic2NvcGUiLCJlbWl0dGVkQ29tbWFuZCIsImNvbW1hbmQiLCJjaGFuZ2VUYWJsZUJvcmRlckNvbG9yIiwiQmxvY2tPcGVyYXRpb25zU2VydmljZSIsImZvY3VzU3RhY2siLCJUVVJOX0lOVE8iLCJDUkVBVEVfREVGQVVMVF9CTE9DSyIsIkRFTEVURV9GT0NVU19PTl9QUkVWSU9VUyIsIkRFTEVURV9GT0NVU19PTl9ORVhUIiwiRk9DVVNfT05fRklSU1QiLCJGT0NVU19PTl9QUkVWSU9VUyIsIkZPQ1VTX09OX05FWFQiLCJERUxFVEUiLCJEVVBMSUNBVEUiLCJDT1BZIiwiUEFTVEUiLCJDVVQiLCJSRU1PVkVfRk9STUFUIiwiVFJBTlNGT1JNX0JMT0NLIiwiZXhlY0NvbW1hbmQiLCJzaG93VUkiLCJCTE9DS19PUEVSQVRJT05TIiwibmF2aWdhdG9yIiwiY2xpcGJvYXJkIiwid3JpdGVUZXh0Iiwic2VsZWN0ZWRUZXh0IiwidGhlbiIsImNvcGllZEV2ZW50IiwiYnViYmxlcyIsImNhbmNlbGFibGUiLCJjYXRjaCIsImVyciIsInJlYWRUZXh0IiwicGFzdGVkVGV4dCIsInNlbGVjdGlvbkV2ZW50IiwiZ2V0Q3VycmVudFNlbGVjdGVkQmxvY2siLCJ0cmFuc2Zvcm1CbG9jayIsImRlbGV0ZUFuZEZvY3VzT25OZXh0IiwiaGlkZUV2ZW50IiwiYmxvY2tEZWxldGVkIiwiZHVwbGljYXRlU2VsZWN0ZWRCbG9jayIsImNyZWF0ZURlZmF1bHRCbG9jayIsImRlbGV0ZUFuZEZvY3VzT25QcmV2aW91cyIsImZvY3VzT25QcmV2aW91cyIsImZvY3VzT25OZXh0IiwicXVlcnlDb21tYW5kU3RhdGUiLCJnZXREcmFnZ2FibGVFbGVtZW50RnJvbVNlbGVjdGlvbiIsInBlZWsiLCJuZXdDb250ZW50QmxvY2siLCJmb2N1c1N0YWNrVG9BZGQiLCJyZXBsYWNlQ2hpbGQiLCJmb2N1c2FibGUiLCJjcmVhdGVOZXdFbGVtZW50IiwiY3JlYXRlTGlzdEl0ZW0iLCJuZXdDb250ZW50RWxlbWVudCIsImNyZWF0ZU5ld0VsZW1lbnRBbmRTcGxpdENvbnRlbnQiLCJjdXJyZW50SXRlbSIsImNsb25lIiwiY29udGVudEN1cnJlbnQiLCJjb250ZW50Q2xvbmUiLCJwYXJlbnRCbG9jayIsImNvdW50ZXIiLCJxdWVyeVNlbGVjdG9yQWxsIiwibmV3UGFyYWdyYXBoIiwiY3VycmVudEJsb2NrIiwiY2xvbmVkQmxvY2siLCJldmVudFBhcmFncmFwaCIsIm5ld0Jsb2NrIiwiY3VycmVudEFjdGl2ZUVsZW1lbnQiLCJkZWxldGVUaGVDdXJyZW50RWxlbWVudEFuZFRoZURyYWdnYWJsZUJsb2NrSWZFbXB0eSIsImFjdHVhbEVsZW1lbnQiLCJmb2N1c2VkRWxlbWVudCIsInRvVXBwZXJDYXNlIiwicHJldmlvdXNFbGVtZW50IiwiYXBwbHlDdXJzb3JYRW5kUG9zaXRpb24iLCJzaWJsaW5nIiwiZm9jdXNhYmxlQ2FuZGlkYXRlcyIsIm5leHRFbGVtZW50IiwiYXBwbHlDdXJzb3JYU3RhcnRQb3NpdGlvbiIsImFjdHVhbCIsInhQb3NpdGlvbiIsImFkanVzdEN1cnNvck9mZnNldCIsIm5vZGVOYW1lIiwicHJldmlvdXNTaWJsaW5nIiwiY2xvc2VzdE5vZGUiLCJjbG9zZXN0T2Zmc2V0IiwiY2xvc2VzdERpZmYiLCJJbmZpbml0eSIsInJlY3QiLCJsZWZ0RGlmZiIsIk1hdGgiLCJhYnMiLCJyaWdodERpZmYiLCJtaW4iLCJnZXRDdXJyZW50U2VsZWN0ZWRGb2N1c2FibGUiLCJBZGRCbG9ja0J1dHRvbiIsIkFkZEJsb2NrV3JhcHBlciIsIlNpemVzIiwiU1ZHSWNvbiIsInVzZUVsZW1lbnQiLCJzaXplIiwiY3JlYXRlRWxlbWVudE5TIiwidXNlIiwic2V0QXR0cmlidXRlTlMiLCJzaXplcyIsInNldFVzZVRvIiwiQWRkQmxvY2tCdWlsZGVyIiwiYnVpbGQiLCJQbHVzIiwibWVkaXVtIiwiRHJvcGRvd25NZW51IiwiZHJvcGRvd25CdXR0b24iLCJkcm9wZG93bkxpc3QiLCJCYXNlRG91Ymx5TGlua2VkTGlzdCIsInRhaWwiLCJnZXRGaXJzdCIsImdldExhc3QiLCJTeW1ib2wiLCJpdGVyYXRvciIsImN1cnJlbnQiLCJjYWxsYmFjayIsImFueSIsInByZWRpY2F0ZSIsImZpbmRGaXJzdCIsImZpbmRMYXN0IiwicHJldmlvdXNOb2RlIiwiZmluZCIsIkpOb2RlIiwicGFyZW50TGlzdCIsInNldE5leHQiLCJzZXRQcmV2aW91cyIsImdldE5leHRTYXRpc2Z5aW5nIiwic3RhcnROb2RlIiwiZ2V0UHJldmlvdXNTYXRpc2Z5aW5nIiwiQ2lyY3VsYXJEb3VibHlMaW5rZWRMaXN0IiwiYXBwZW5kIiwiRHJvcGRvd25NZW51TGlzdEl0ZW0iLCJhY3RpdmVJY29uIiwibGVmdEljb24iLCJvbkZvY3VzRnVuY3Rpb25MaXN0Iiwib25Mb3NlRm9jdXNGdW5jdGlvbkxpc3QiLCJwYXJlbnREcm9wZG93bk1lbnVMaXN0Iiwic2hvcnRjdXQiLCJhdHRhY2hFdmVudCIsImFkZENsYXNzIiwiYXR0YWNoT25Gb2N1cyIsImZ1bmMiLCJhcmdzIiwiYXR0YWNoT25Mb3NlRm9jdXMiLCJyZW1vdmVGb2N1cyIsInRhYkluZGV4IiwidGV4dE9wdGlvbiIsInNob3J0Q3V0IiwiZW1pdENvbW1hbmRFdmVudCIsImFkZENzc0NsYXNzIiwidG9rZW5zIiwiYXR0YWNoVUlFdmVudCIsImFzeW5jIiwiZHJvcGRvd25JdGVtcyIsInN3aXRjaFZpc3VhbEZvY3VzIiwiaGFuZGxlU2hvd0hpZGVBY3RpdmVCdXR0b25FdmVudCIsImJpbmQiLCJoYW5kbGVSZXNldEFjdGl2ZUJ1dHRvbnNFdmVudCIsImRldGFpbHMiLCJpbmNsdWRlcyIsImV2ZW50VmFsdWVzIiwiZXZlbnRDb2xvciIsInRvTG93ZXJDYXNlIiwiRHJvcGRvd25NZW51TGlzdCIsInBhcmVudERyb3Bkb3duUGFyZW50QnV0dG9uIiwiY3VycmVudEZvY3VzZWRNZW51SXRlbSIsIm1heEhlaWdodCIsIm92ZXJmbG93WSIsImRyb3Bkb3duSXRlbSIsInNldFBhcmVudERyb3Bkb3duTWVudUJ1dHRvbiIsImRyb3Bkb3duUGFyZW50QnV0dG9uIiwiY2xpY2tlZE91dHNpZGVUaGVEcm9wZG93bldoaWxlRHJvcGRvd25Jc1Zpc2libGUiLCJrZXlQcmVzc2VkT3V0c2lkZVRoZURyb3Bkb3duV2hpbGVEcm9wZG93bklzVmlzaWJsZSIsImZvY3VzTmV4dFZpc2libGVJdGVtIiwiZm9jdXNQcmV2aW91c1Zpc2libGVJdGVtIiwic3ZnSWNvbiIsIm5leHRWaXNpYmxlSXRlbSIsInByZXZpb3VzVmlzaWJsZUl0ZW0iLCJGbG9hdGluZ1Rvb2xiYXJTZXBhcmF0b3IiLCJib3JkZXJSaWdodCIsIm1hcmdpbiIsIkJ1dHRvbkdyb3VwIiwiQnV0dG9uR3JvdXBJdGVtIiwidG9nZ2xlTGluayIsIkNvbG9ySWNvbiIsImJvcmRlclJhZGl1cyIsImJveFNpemluZyIsIkRyb3Bkb3duTWVudUJ1dHRvbiIsImluY2x1ZGVDaGV2cm9uSWNvbiIsInJvbGUiLCJEcm9wZG93bk1lbnVMaXN0SXRlbVRpdGxlIiwiY2hhbmdlQWN0aXZlSWNvblRvVmlzaWJsZSIsImdldExlZnRJY29uQmFja2dyb3VuZENvbG9yIiwicmVzZXRBY3RpdmVJY29uIiwiVGV4dE9wZXJhdGlvbnNTZXJ2aWNlIiwidGV4dE9wZXJhdGlvblNlcnZpY2UiLCJleGVjQm9sZCIsIkJvbGQiLCJJY29uQWN0aXZlQmx1ZSIsImV4ZWNJdGFsaWMiLCJJdGFsaWMiLCJleGVjU3RyaWtlVGhyb3VnaCIsIlN0cmlrZXRocm91Z2giLCJleGVjVW5kZXJsaW5lIiwiVW5kZXJsaW5lIiwiZXhlY0hpbGl0ZUNvbG9yIiwiZXhlY0ZvcmVDb2xvciIsInNob3dVaSIsIlByb21pc2UiLCJyZWplY3QiLCJ0b2dnbGVVbmRlcmxpbmUiLCJxdWVyeUFuY2hvciIsInRvZ2dsZUhpbGl0ZUNvbG9yIiwidG9nZ2xlRm9yZUNvbG9yIiwicXVlcnlGb3JlQ29sb3IiLCJxdWVyeUhpbGl0ZUNvbG9yIiwicXVlcnlDb21tYW5kU3RhdGVBIiwidG9nZ2xlQ29kZUV4ZWNDb21tYW5kIiwiY29udGFpbmVyTm9kZSIsImNvZGVFbGVtZW50IiwicmFuZ2VPZkNvZGUiLCJjb250ZW50QXNTdHJpbmciLCJYTUxTZXJpYWxpemVyIiwic2VyaWFsaXplVG9TdHJpbmciLCJjbG9uZUNvbnRlbnRzIiwiZXhwZWN0ZWRDb2xvciIsImZvbnRDb2xvciIsInJnYkNvbG9yIiwic3BhbldpdGhCYWNrZ3JvdW5kIiwiZ2V0SW5pdGlhbENvbG9yQXNIZXgiLCJ0ZW1wRWxlbWVudCIsImJvZHkiLCJjb21wdXRlZENvbG9yIiwiZ2V0VGFyZ2V0RWxlbWVudE1hcCIsImdldFNlbGVjdGVkSFRNTEVsZW1lbnQiLCJnZXRTZWxlY3RlZFRleHROb2RlcyIsInRleHROb2RlcyIsIm5vZGVJdGVyYXRvciIsImNyZWF0ZU5vZGVJdGVyYXRvciIsIkZJTFRFUl9SRUpFQ1QiLCJub2RlUmFuZ2UiLCJjb21wYXJlQm91bmRhcnlQb2ludHMiLCJSYW5nZSIsIkVORF9UT19TVEFSVCIsIlNUQVJUX1RPX0VORCIsImZpbmRDbG9zZXN0TWF0Y2hpbmdQYXJlbnQiLCJlbGVtIiwiY2xhc3NlcyIsImV2ZXJ5IiwiY2xzIiwiZXh0cmFjdFNlbGVjdGVkVGV4dCIsInN0YXJ0IiwiZW5kIiwiSW5wdXRMaW5rQm94IiwicGFyZW50V3JhcHBlciIsInBsYWNlaG9sZGVyIiwic2V0UGFyZW50V3JhcHBlciIsInN0b3BQcm9wYWdhdGlvbiIsInVybCIsIklucHV0TGlua0JveFdyYXBwZXIiLCJpbnB1dExpbmtCb3giLCJoaWdobGlnaHRzIiwiaGlnaGxpZ2h0U2VsZWN0ZWRUZXh0IiwicmVtb3ZlSGlnaGxpZ2h0cyIsInNob3dJbnB1dExpbmtCb3hGaW5pc2hlZCIsInJlY3RzIiwiZ2V0Q2xpZW50UmVjdHMiLCJoaWdobGlnaHQiLCJGbG9hdGluZ1Rvb2xiYXIiLCJkcm9wZG93bnMiLCJzZXBhcmF0b3JzIiwiY3VycmVudFNlbGVjdGlvblJhbmdlIiwiaW5wdXRMaW5rQm94V3JhcHBlciIsImh0bWxGb2N1c2VkRWxlbWVudEJlZm9yZU9wZW5RdWlja01lbnUiLCJzZWxlY3RXcmFwcGVyIiwiZWRpdG9yIiwiYW55RHJvcGRvd25WaXNpYmxlIiwiaGlkZUFsbERyb3Bkb3duVmlzaWJsZSIsImFwcGVuZERyb3Bkb3duIiwiZHJvcGRvd24iLCJhcHBlbmRCdXR0b25Hcm91cCIsImJ1dHRvbkdyb3VwIiwiYXBwZW5kU2VwYXJhdG9yIiwic2VwYXJhdG9yIiwiYXBwZW5kVGV4dFRvb2xiYXIiLCJyZXN0b3JlUmFuZ2VTZWxlY3Rpb24iLCJibG9ja1R5cGVDaGFuZ2VkIiwiaXNTZWxlY3Rpb25FbXB0eSIsIlRleHRDb250ZXh0RmxvYXRpbmdUb29sYmFyIiwidGV4dE9wZXJhdGlvbnNTZXJ2aWNlIiwiaW5pdGlhbFJlY3QiLCJ6SW5kZXgiLCJWZXJ5SW1wb3J0YW50IiwicHJvY2Vzc1NlbGVjdGlvbkNoYW5nZUVmZmVjdHMiLCJpc0JvbGQiLCJpc0l0YWxpYyIsImlzVW5kZXJsaW5lIiwiaXNTdHJpa2VUaHJvdWdoIiwiaGlsaXRlQ29sb3JzIiwiSGlsaXRlQ29sb3JSZWQiLCJIaWxpdGVDb2xvckdyZWVuIiwiSGlsaXRlQ29sb3JCbHVlIiwiSGlsaXRlQ29sb3JZZWxsb3ciLCJIaWxpdGVDb2xvckdyZXkiLCJmb3JlQ29sb3JzIiwiRm9yZUNvbG9yUmVkIiwiRm9yZUNvbG9yR3JlZW4iLCJGb3JlQ29sb3JCbHVlIiwiRm9yZUNvbG9yWWVsbG93IiwiRm9yZUNvbG9yR3JleSIsImVudHJpZXMiLCJhY3RpdmUiLCJJY29uRGVmYXVsdEJsYWNrIiwiU2VsZWN0aW9uQ2hhbmdlIiwiaXNTZWxlY3RpbmciLCJzaGlmdEtleSIsInNob3dIaWRlIiwic2hvdWxkVXBkYXRlUG9zaXRpb24iLCJjdXJyZW50UmVjdCIsImhhc0NvbnRlbnQiLCJoYXNTZWxlY3Rpb24iLCJ1cGRhdGVQb3NpdGlvbiIsImNoYW5nZVRvb2xiYXJQb3NpdGlvblRvQmVDbG9zZWRUb1NlbGVjdGlvbiIsImVsZW1lbnRXaWR0aCIsIm9mZnNldFdpZHRoIiwibGVmdFBvc2l0aW9uIiwic2Nyb2xsWCIsImVsZW1lbnRIZWlnaHQiLCJvZmZzZXRIZWlnaHQiLCJ0b3BQb3NpdGlvbiIsInNjcm9sbFkiLCJib3R0b20iLCJoaWRlVHVybkludG9Ecm9wZG93bklmSW5DZWxsIiwiaXNDZWxsIiwic2V0UG9zaXRpb24iLCJUZXh0Q29udGV4dEZsb2F0aW5nVG9vbGJhckJ1aWxkZXIiLCJmbG9hdGluZ0JhciIsInR1cm5JbnRvRHJvcGRvd24iLCJjb2xvckRyb3Bkb3duIiwibW9yZU9wdGlvbnNEcm9wZG93biIsInR1cm5JbnRvQmFyTGlzdCIsInR1cm5JbnRvQmFyQnV0dG9uIiwiU1ZHSWNvbnMiLCJ0b2RvX2xpc3QiLCJiX2xpc3QiLCJuX2xpc3QiLCJxdW90ZSIsImhlYWQxIiwiaGVhZDIiLCJoZWFkMyIsImhlYWQ0IiwiaGVhZDUiLCJoZWFkNiIsImdyb3VwQnV0dG9uIiwiTGluayIsImxhcmdlIiwidG9nZ2xlQm9sZCIsInRvZ2dsZUl0YWxpYyIsIklubGluZUNvZGUiLCJ0b2dnbGVJbmxpbmVDb2RlIiwidG9nZ2xlU3RyaWtlVGhyb3VnaCIsIlN0cmlrZVRocm91Z2giLCJjb2xvckRyb3Bkb3duTGlzdCIsIkNvbG9yVGV4dE9wdGlvblNlbGVjdCIsImNvbG9yQnV0dG9uIiwiQ29sb3JUZXh0T3B0aW9uc01lbnUiLCJoaWxpdGVDb2xvclJlZCIsIkJhY2tncm91bmRPcHRpb25SZWQiLCJCYWNrZ3JvdW5kT3B0aW9uR3JlZW4iLCJoaWxpdGVDb2xvckJsdWUiLCJCYWNrZ3JvdW5kT3B0aW9uQmx1ZSIsImhpbGl0ZUNvbG9yWWVsbG93IiwiQmFja2dyb3VuZE9wdGlvblllbGxvdyIsImhpbGl0ZUNvbG9yR3JleSIsIkJhY2tncm91bmRPcHRpb25HcmV5IiwiaGlsaXRlQ29sb3JOb25lIiwiQmFja2dyb3VuZE9wdGlvbk5vbmUiLCJmb3JlQ29sb3JSZWQiLCJmb3JlQ29sb3JHcmVlbiIsImZvcmVDb2xvckJsdWUiLCJmb3JlQ29sb3JZZWxsb3ciLCJmb3JlQ29sb3JHcmV5IiwiZm9yZUNvbG9yTm9uZSIsIm1vcmVPcHRpb25zTGlzdCIsImNvcHkiLCJjdXQiLCJwYXN0ZSIsImR1cGxpY2F0ZSIsImVyYXNlciIsImRlbGV0ZUl0ZW0iLCJkZWxldGUiLCJRdWlja01lbnVFbXB0eSIsImh0bWxFbXB0eUluZGljYXRvciIsIkRPTUVsZW1lbnRzIiwiRGlyZWN0aW9ucyIsIlRhYmxlU2NvcGVzIiwiS2V5Ym9hcmRLZXlzIiwiU2VsZWN0aW9uTW9kZXMiLCJUb29sYmFySURzIiwiQm91bmRhcmllcyIsIlF1aWNrTWVudSIsIm1lbnVTZWN0aW9ucyIsInF1aWNrTWVudUVtcHR5IiwiZmlsdGVySW5wdXQiLCJibG9ja09wdGlvbnMiLCJtZW51SXRlbSIsImJsb2NrT3BlcmF0aW9uU2VydmljZSIsImZvY3VzT25UaGVGaXJzdFZpc2libGVJdGVtIiwiZmlyc3RTZWN0aW9uTm9kZSIsImN1cnJlbnRTZWN0aW9uTm9kZSIsIml0ZW1Ob2RlIiwibWVudUl0ZW1zIiwicHJldmlvdXNWaXNpYmxlU2VjdGlvbk5vZGUiLCJpbW1lZGlhdGVQYXJlbnQiLCJzZWN0aW9uIiwibGFzdFZpc2libGVTZWN0aW9uTm9kZSIsIm5leHRWaXNpYmxlU2VjdGlvbk5vZGUiLCJmaXJzdFZpc2libGVTZWN0aW9uTm9kZSIsImZpbHRlckl0ZW1zIiwiZmlsdGVyU2VjdGlvbiIsInJlc3RvcmUiLCJjdHJsS2V5IiwiYWx0S2V5IiwidGVzdCIsInJlbW92ZUxhc3RGaWx0ZXJJbnB1dENoYXJhY3RlciIsImNvbmNhdEZpbHRlcklucHV0IiwiVEQiLCJibG9ja1R5cGUiLCJ0cmFuc2Zvcm1IdG1sRm9jdXNlZEVsZW1lbnRCZWZvcmVPcGVuUXVpY2tNZW51Iiwic3RnIiwic2xpY2UiLCJEb3VibHlMaW5rZWRMaXN0IiwiUXVpY2tNZW51U2VjdGlvbiIsInF1aWNrTWVudUluc3RhbmNlIiwiYXBwZW5kUXVpY2tNZW51SXRlbXMiLCJhcHBlbmRRdWlja01lbnVJdGVtIiwiZmlsdGVyVmFsdWUiLCJ0b0xvY2FsZUxvd2VyQ2FzZSIsIlF1aWNrTWVudUl0ZW0iLCJfYmxvY2tUeXBlIiwiX2ZpbHRlclZhbHVlIiwiX2ltbWVkaWF0ZVBhcmVudCIsImRlc2NyaXB0aW9uIiwib3B0aW9uSW1hZ2UiLCJzdmciLCJvcHRpb25UZXh0IiwiYmxvY2tUaXRsZSIsImJsb2NrRGVzY3JpcHRpb24iLCJRdWlja01lbnVCdWlsZGVyIiwiYmFzaWNCbG9ja3NTZWN0aW9uIiwiQ2FsbG91dCIsIm1lZGlhQmxvY2tzU2VjdGlvbiIsIlZpZGVvIiwiaGVhZGluZ0Jsb2Nrc1NlY3Rpb24iLCJsaXN0QmxvY2tzU2VjdGlvbiIsImVtYmVkU2VjdGlvbiIsIlRpdGxlIiwiaDEiLCJmb2N1c09uRmlyc3RSZXF1ZXN0ZWQiLCJUaXRsZUJ1aWxkZXIiLCJDb250ZW50IiwiY2xlYXJTZWxlY3Rpb25PbkRyYWciLCJyZVJlbmRlclBsYWNlaG9sZGVyIiwiY29weUVsZW1lbnRJdGVtIiwiYmxvY2tzIiwic3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uIiwiZm9jdXNPblByZXZpb3VzQmxvY2siLCJpc0N1cnNvckF0RW5kIiwiaXNDdXJzb3JBdFN0YXJ0IiwiaXNDdXJzb3JPbkxhc3RMaW5lIiwiaXNDdXJzb3JPbkZpcnN0TGluZSIsImluc2VydE5ldyIsImhhc0F0dHJpYnV0ZSIsImN1c3RvbVBsYWNlaG9sZGVyIiwiZm9jdXNhYmxlUGFyZW50IiwiZW5kTm9kZSIsImNvbGxhcHNlZCIsImlzQXRGaXJzdFZpc2libGVMaW5lIiwiY2xvbmVSYW5nZSIsImlzQXRMYXN0VmlzaWJsZUxpbmUiLCJkaWRDdXJzb3JNb3ZlIiwib3JpZ2luYWxSZWN0IiwibmV3UmVjdCIsImRpZE1vdmUiLCJDb250ZW50QnVpbGRlciIsIlRhYmxlVXRpbHMiLCJpbnNlcnRQb3NpdGlvbiIsInJvd3MiLCJuZXdSb3ciLCJpbnNlcnRSb3ciLCJudW1Db2x1bW5zIiwicmVkdWNlIiwibWF4IiwiY2VsbHMiLCJhZmZlY3RlZENlbGxzIiwiaW5zZXJ0Q2VsbCIsImlzTGFzdENvbHVtbiIsImNlbGxSb3ciLCJpc0xhc3RSb3ciLCJyZW1vdmVDb2x1bW5CeUNlbGwiLCJjb2x1bW5JbmRleCIsImNlbGxJbmRleCIsImRlbGV0ZUNlbGwiLCJyZW1vdmVSb3dCeUNlbGwiLCJkZWxldGVSb3ciLCJyb3dJbmRleCIsImdldEFjdGl2ZVRhYmxlQ2VsbCIsImdldExhc3RUYWJsZUNlbGwiLCJqIiwiZ2V0Rmlyc3RUYWJsZUNlbGwiLCJnZXROZWlnaGJvckNlbGwiLCJkaXJlY3Rpb24iLCJBcnJvd1JpZ2h0IiwiQXJyb3dMZWZ0IiwiQXJyb3dVcCIsIkFycm93RG93biIsImNoYW5nZUNlbGxCb3JkZXJDb2xvciIsImNlbGxzVG9DaGFuZ2UiLCJDb2x1bW4iLCJSb3ciLCJzZWxlY3RlZENlbGwiLCJDZWxsIiwiU2VsZWN0ZWRDZWxscyIsIlRhYmxlQ29udGV4dEZsb2F0aW5nVG9vbGJhciIsInNlbGVjdGVkQ2VsbHMiLCJhY3R1YWxGb2N1c2VkQ2VsbCIsInRhYmxlT3BlcmF0aW9uc1NlcnZpY2UiLCJjb250cm9sbGVyIiwic2VsZWN0aW9uTW9kZSIsIlRleHQiLCJzZWxlY3Rpb25GbGFnIiwiY2xlYXJBbmRIaWRlIiwiTW9kZXJhdGVseUltcG9ydGFudCIsIkFib3J0Q29udHJvbGxlciIsIk1vdXNlZG93biIsImhhbmRsZU1vdXNlRG93biIsIk1vdXNlbW92ZSIsImhhbmRsZU1vdXNlTW92ZSIsIk1vdXNldXAiLCJoYW5kbGVNb3VzZVVwIiwiS2V5ZG93biIsImhhbmRsZVN0YXJ0U2VsZWN0aW9uSW5DZWxsS2V5RG93biIsImhhbmRsZUNlbGxTZWxlY3Rpb25Db250aW51YXRpb25PbktleURvd24iLCJoYW5kbGVLZXlEb3duIiwiS2V5dXAiLCJoYW5kbGVLZXlVcCIsImFib3J0IiwiY2xlYXJBbGwiLCJhZGRTZWxlY3RlZENlbGwiLCJ1cGRhdGVTZWxlY3Rpb25Nb2RlQnlNb3VzZUV2ZW50IiwicmVzZXRTZWxlY3Rpb25TdGF0ZSIsIkVudGVyIiwibWV0YUtleSIsIkVzY2FwZSIsImN1cnJlbnRDZWxsIiwicmVwZWF0IiwiU2hpZnQiLCJzdGFydHNXaXRoIiwibmV4dENlbGwiLCJub3JtYWxpemVUZXh0IiwicmVwbGFjZSIsInVwZGF0ZVRoZVNlbGVjdGlvbk1vZGVCeUN1cnJlbnRTZWxlY3Rpb25TdGF0ZSIsImFjdHVhbFNlbGVjdGlvbiIsImN1cnJlbnRDZWxsVGV4dCIsImNlbGxSZWN0IiwibW91c2VYIiwiY2xpZW50WCIsIm1vdXNlWSIsImluZGV4T2YiLCJoYW5kbGVDbG9zZUVsZW1lbnRFdmVudCIsInJlc2V0QWJvcnRDb250cm9sbGVyIiwiY2hhbmdlVG9vbGJhclBvc2l0aW9uVG9CZUNsb3NlZFRvIiwiQmx1ciIsInNpZ25hbCIsImJhY2tncm91bmRDb2xvcnMiLCJCYWNrZ3JvdW5kQ29sb3JSZWQiLCJxdWVyeUFsbFN0YXRlQ2VsbEJhY2tncm91bmRDb2xvciIsIkJhY2tncm91bmRDb2xvckdyZWVuIiwiQmFja2dyb3VuZENvbG9yQmx1ZSIsIkJhY2tncm91bmRDb2xvclllbGxvdyIsIkJhY2tncm91bmRDb2xvckdyZXkiLCJUYWJsZUNvbnRleHRGbG9hdGluZ1Rvb2xiYXJCdWlsZGVyIiwidGFibGVPcGVyYXRpb25TZXJ2aWNlIiwidGFibGVPcHRpb25zIiwidGFibGVDb2xvckRyb3Bkb3duIiwiaW5zZXJ0VGFibGVDb2x1bW5MZWZ0IiwiQ29sdW1uTGVmdCIsImluc2VydFRhYmxlQ29sdW1uUmlnaHQiLCJDb2x1bW5SaWdodCIsImluc2VydFRhYmxlUm93QWJvdmUiLCJSb3dBYm92ZSIsImluc2VydFRhYmxlUm93QmVsb3ciLCJSb3dCZWxvdyIsImRlbGV0ZUNvbHVtbkl0ZW0iLCJyZW1vdmVDb2x1bW4iLCJkZWxldGVTd2VlcCIsImRlbGV0ZVJvd0l0ZW0iLCJyZW1vdmVSb3ciLCJjZWxsQmFja2dyb3VuZENvbG9yUmVkIiwidG9nZ2xlQ2VsbEhpbGl0ZUNvbG9yIiwiY2VsbEJhY2tncm91bmRDb2xvckdyZWVuIiwiY2VsbEJhY2tncm91bmRDb2xvckJsdWUiLCJjZWxsQmFja2dyb3VuZENvbG9yWWVsbG93IiwiY2VsbEJhY2tncm91bmRDb2xvckdyZXkiLCJjZWxsQmFja2dyb3VuZENvbG9yTm9uZSIsIk1lZGlhSW5wdXR0ZXIiLCJTbGlnaHRseUltcG9ydGFudCIsInVwbG9hZFRhYiIsImNyZWF0ZU5hdkl0ZW0iLCJlbWJlZFRhYiIsInVwbG9hZENvbnRlbnQiLCJjcmVhdGVVcGxvYWRDb250ZW50IiwiZW1iZWRDb250ZW50IiwiY3JlYXRlRW1iZWRDb250ZW50IiwibGkiLCJsYWJlbCIsInRleHRJbmZvIiwiaW5wdXQiLCJlbWJlZEdlbmVyaWMiLCJ1cmxPYmoiLCJVUkwiLCJkb21haW4iLCJob3N0bmFtZSIsInBhdGgiLCJwYXRobmFtZSIsImVtYmVkWW91VHViZVZpZGVvIiwiZW1iZWRZb3VUdWJlUGxheWxpc3QiLCJlbWJlZFNwb3RpZnlUcmFjayIsImVtYmVkU3BvdGlmeVBsYXlsaXN0IiwiZW1iZWRUd2VldCIsImVtYmVkR29vZ2xlTWFwIiwiZW1iZWRHaXN0IiwiZW1iZWRDb2RlcGVuIiwidmlkZW9JZCIsInNlYXJjaFBhcmFtcyIsImNyZWF0ZUVtYmVkQ29udGFpbmVyIiwiaWZyYW1lIiwiZnJhbWVCb3JkZXIiLCJhbGxvdyIsImFsbG93RnVsbHNjcmVlbiIsImZpbmFsaXplRW1iZWQiLCJsaXN0SWQiLCJ0cmFja0lkIiwicG9wIiwicGxheWxpc3RJZCIsInNjcmlwdCIsInF1ZXJ5U3RyaW5nIiwic2VhcmNoIiwibWF4V2lkdGgiLCJzZXJ2aWNlIiwiZ2lzdElkIiwib25sb2FkIiwib25lcnJvciIsInBhcnRzIiwidXNlciIsInBlbiIsImlucHV0VmFsdWUiLCJpbnB1dFRleHQiLCJoYW5kbGVTaG93RWxlbWVudEV2ZW50Iiwic2V0QWN0aXZlVGFiIiwiaGFuZGxlckV2ZW50IiwiQ2xpY2siLCJoYW5kbGVyQW5vdGhlckV2ZW50IiwiZW1iZWRJbWFnZSIsImVtYmVkVmlkZW8iLCJ2aWRlb0NvbnRhaW5lciIsImdldFRhYiIsInRhYklkIiwiZ2V0Q29udGVudCIsImNvbnRlbnRJZCIsImltYWdlUmVwbGFjZUVsZW1lbnQiLCJ2aWRlb1JlcGxhY2VFbGVtZW50IiwibGFzdEZvY3VzZWQiLCJNZWRpYUlucHV0dGVyQnVpbGRlciIsIkVkaXRvckJ1aWxkZXIiLCJVSUJ1aWxkZXIiLCJpbnNlcnRJY29ucyIsInN2Z0NvbnRhaW5lciIsIkNvbW1hbmREaXNwYXRjaGVyIiwibGlzdGVuIiwiaGFuZGxlQ29tbWFuZEV2ZW50IiwiaGFuZGxlRm9jdXNPbkZpcnN0UmVxdWVzdGVkRXZlbnQiLCJ0YXJnZXRCbG9ja1R5cGUiLCJleGVjVHJhbnNmb3JtQmxvY2siLCJkdXBsaWNhdGVCbG9jayIsImV4ZWNEdXBsaWNhdGVCbG9jayIsImRlbGV0ZUJsb2NrIiwiZXhlY0RlbGV0ZUJsb2NrIiwicmVtb3ZlRm9ybWF0IiwiZXhlY1JlbW92ZUZvcm1hdCIsImV4ZWNDcmVhdGVEZWZhdWx0QmxvY2siLCJleGVjSW5zZXJ0TmV3IiwiZXhlY0ZvY3VzT25QcmV2aW91c0Jsb2NrIiwiaW5zZXJ0Q29sdW1uTGVmdCIsImluc2VydENvbHVtblJpZ2h0IiwiaW5zZXJ0Um93QWJvdmUiLCJpbnNlcnRSb3dCZWxvdyIsImV4ZWNDZWxsQmFja2dyb3VuZENvbG9yIiwiU2hvcnRjdXRMaXN0ZW5lcnMiLCJzdGFydExpc3RlbiIsImdldE1vZGlmaWVyU3RhdGUiLCJpc051bVBhZCIsIm51bUxvY2tPbiIsImFsZXJ0IiwiVGFibGVMaXN0ZW5lcnMiLCJzaG93bkVsZW1lbnRzIiwiTWFwIiwiRm9jdXNTdGFjayIsInN0YWNrIiwiY2FwYWNpdHkiLCJzaGlmdCIsImNsZWFyIiwiVGFibGVPcGVyYXRpb25zU2VydmljZSIsImlzQWN0aXZlQ2VsbEJhY2tncm91bmRDb2xvciIsIlRhYmxlVG9vbGJhciIsImFjdGl2ZUNlbGwiLCJpc0NlbGxCYWNrZ3JvdW5kQ29sb3IiLCJ0YXJnZXRIZXhDb2xvciIsImN1cnJlbnRCYWNrZ3JvdW5kQ29sb3IiLCJnZXRQcm9wZXJ0eVZhbHVlIiwicXVlcnlTdGF0ZUNlbGxCYWNrZ3JvdW5kQ29sb3IiLCJlbGVtZW50cyIsImlzIiwiY2hpbGRyZW4iLCJzaG93SW5zZXJ0TGluZUVsZW1lbnQiLCJzaG93SW5zZXJ0Q29sdW1uRWxlbWVudCIsImhpZGVJbnNlcnRSb3dFbGVtZW50IiwiaGlkZUluc2VydENvbHVtbkVsZW1lbnQiLCJNZW1lbnRvIiwidW5kb1N0YWNrIiwicmVkb1N0YWNrIiwicXVlcnkiLCJ1bmRvIiwic3RhdGVUb1Jlc3RvcmUiLCJyZWRvIiwic3RhdGVUb0FwcGx5IiwiRWRpdGFibGVOYXZpZ2F0aW9uIiwiaGFuZGxlQXJyb3dLZXlzIiwiY3VycmVudEVkaXRhYmxlIiwic2hvdWxkU3dpdGNoRWRpdGFibGUiLCJuZXh0RWRpdGFibGUiLCJmaW5kTmV4dEVkaXRhYmxlIiwicGxhY2VDYXJldEluU2ltaWxhclBvc2l0aW9uIiwiaXNBdEZpcnN0TGluZSIsImlzQXRMaW5lQm91bmRhcnkiLCJGaXJzdCIsImlzQXRMYXN0TGluZSIsIkxhc3QiLCJib3VuZGFyeSIsImFsbEVkaXRhYmxlcyIsImN1cnJlbnRJbmRleCIsIm5laWdoYm9yQ2VsbCIsIm5leHRJbmRleCIsImZpbmRWZXJ0aWNhbEVkaXRhYmxlIiwiY2xvc2VzdEluZGV4IiwiY2xvc2VzdERpc3RhbmNlIiwiZWRpdGFibGUiLCJ2ZXJ0aWNhbERpc3RhbmNlIiwiaG9yaXpvbnRhbERpc3RhbmNlIiwibmV4dCIsIndhbGtlciIsImJlc3ROb2RlIiwiYmVzdE9mZnNldCIsImJlc3REaXN0YW5jZSIsIm5vZGVWYWx1ZSIsInRlc3RSZWN0Il0sInNvdXJjZVJvb3QiOiIifQ== \ No newline at end of file diff --git a/demo/bundle.js b/demo/bundle.js index a5203a3..cb23c15 100644 --- a/demo/bundle.js +++ b/demo/bundle.js @@ -1,2 +1,2 @@ -(()=>{var e={282:(e,n,t)=>{"use strict";t.d(n,{A:()=>l});var o=t(354),i=t.n(o),r=t(314),s=t.n(r)()(i());s.push([e.id,'/** CSS reset */\n\n.button-reset {\n border: none;\n margin: 0;\n padding: 0;\n width: auto;\n overflow: visible;\n background: transparent;\n color: inherit;\n font: inherit;\n line-height: normal;\n -webkit-font-smoothing: inherit;\n -moz-osx-font-smoothing: inherit;\n -webkit-appearance: none;\n}\n\n\n\n/** add block */\n.add-block {\n margin: 0;\n padding: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n border: 1px solid #000;\n background-color: white;\n transition: all 0.3s ease;\n box-sizing: border-box;\n margin-left: 1.3rem;\n}\n\n.add-block-wrapper {\n width: 100%;\n height: 3.125rem;\n}\n\n.add-block-wrapper:hover .add-block {\n display: flex;\n}\n\n/** and add block */\n\n\n\n/** List **/\nol.johannes-content-element,\nul.johannes-content-element {\n padding-left: 1rem !important;\n}\n\n\n\n.johannes-content-element li>button {\n /* display: none; */\n display: none;\n position: absolute;\n margin-left: 10px;\n top: 0;\n\n flex-direction: row;\n align-items: start;\n justify-content: start;\n\n}\n\n.johannes-content-element li {\n position: relative;\n}\n\n.johannes-content-element li::before {\n margin-left: 0.3125rem;\n}\n\n.johannes-content-element li:hover>button {\n /* display: inline-block; */\n display: inline-flex;\n\n}\n\np.johannes-content-element {\n display: inline-block;\n line-height: 1;\n margin: 0;\n padding: 0;\n}\n\n.johannes-content-element .checkbox-list {\n list-style-type: none;\n padding-left: 0 !important;\n}\n\n\n.johannes-content-element .checkbox-list li {\n display: flex;\n flex-direction: row;\n justify-content: left;\n}\n\n\n.johannes-content-element ul.checkbox-list input[type="checkbox"]:checked+span {\n text-decoration: line-through;\n}\n\nul.johannes-content-element:not(.checkbox-list),\nol.johannes-content-element:not(.checkbox-list) {\n padding-left: 1.5rem !important;\n}\n\n/** and list **/\n\n\n\n.block>.drag-handler {\n color: #84888d;\n visibility: hidden;\n cursor: grab;\n align-self: start;\n\n /* background-color: pink; */\n padding-top: 0.33rem;\n position: absolute;\n}\n\n.drag-handler svg {\n /* background-color: red; */\n}\n\n.drag-handler svg use {\n /* background-color: blue; */\n}\n\n.drag-handler:active {\n cursor: grabbing;\n}\n\n.block {\n display: flex;\n flex-direction: row;\n margin-bottom: 1rem;\n position: relative;\n}\n\n.block>*:not(.drag-handler) {\n padding-left: 1.25rem;\n}\n\n.block:hover .drag-handler {\n visibility: visible;\n vertical-align: top;\n justify-content: start;\n}\n\n.drop-line {\n height: 1rem;\n background-color: #84888d;\n width: 100%;\n}\n\n\n.title h1 {\n margin-left: 1.3rem;\n}\n\nh1[data-placeholder]:empty:before {\n content: attr(data-placeholder);\n color: #84888d !important;\n display: block;\n}\n\nh1[data-placeholder]:focus:before {}\n\n\n*[contenteditable="true"]:not(h1):empty:before {\n content: attr(data-placeholder);\n color: #84888acd;\n display: none;\n}\n\n*[contenteditable="true"]:not(h1):empty:hover:before {\n display: block;\n}\n\ncite[contenteditable="true"]:empty:before {\n display: block;\n}\n\n*[contenteditable="true"]:not(h1)[data-placeholder]:empty:focus:before {\n content: attr(data-placeholder);\n color: #84888acd !important;\n display: block;\n}\n\n\n\nh1 {\n font-size: 2.5rem;\n font-weight: bolder !important;\n}\n\n.johannes-editor {\n width: 100%;\n\n}\n\n.content {\n width: 100%;\n box-sizing: border-box;\n\n\n}\n\npre {\n width: 100%;\n}\n\n[contenteditable] {\n outline: none;\n}\n\nbody {\n height: 2000px;\n background-color: #f0f0f1 !important;\n\n font-family: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";\n}\n\n\n.editor {\n display: flex;\n margin-top: 80px;\n}\n\np {\n color: #242424;\n}\n\n\n.block,\n.block * {\n user-select: text;\n}\n\n\n.johannes-content-element {\n width: 100%;\n padding: 0;\n margin: 0;\n /* background-color: green; */\n}\n\n\n#johannesEditor {\n width: 60%;\n margin-left: auto;\n margin-right: auto;\n}\n\n.johannes-editor hr {\n width: 100%;\n height: 2px;\n visibility: visible;\n border: none;\n border-bottom: 1px solid rgba(55, 53, 47, 0.16);\n}\n\n\n\n.johannes-editor blockquote {\n margin: 0.5rem 0;\n padding-left: 20px;\n border-left: 4px solid rgb(55, 53, 47);\n font-style: italic\n}\n\n.johannes-editor cite {\n padding-top: 1rem !important;\n display: inline-block;\n}\n\n\n.johannes-editor cite::before {\n content: \'— \';\n}\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n#linkBox {\n border-radius: 2px;\n padding: 20px;\n background-color: #f9f9f9;\n\n\n box-shadow:\n 0 4px 6px rgba(0, 0, 0, 0.1),\n 0 -2px 4px rgba(0, 0, 0, 0.02),\n -2px 0 4px rgba(0, 0, 0, 0.02),\n 2px 0 4px rgba(0, 0, 0, 0.02);\n\n\n border: 1px solid #d0d0d0;\n width: fit-content;\n z-index: 999999;\n color: rgb(120, 119, 116);\n border-radius: none;\n}\n\n\n#linkBox input {\n width: 316px;\n padding: 8px 40px 8px 16px;\n /* border-color: #d0d0d0; */\n\n border: 1px solid #949494;\n /* border-radius: 4px; */\n height: 24px;\n\n display: flex;\n flex-direction: row;\n justify-content: center;\n align-items: center;\n}\n\n\n#linkBox input::selection,\n#linkBox input:focus {\n border-radius: none;\n}\n\n\n\n\n\n\n\n\n/** Text formatting Bar **/\n\n\n\n#floatingToolbar {\n justify-content: space-between;\n padding: 8px 16px;\n background-color: #f9f9f9;\n width: fit-content;\n z-index: 999999;\n position: absolute;\n user-select: none;\n}\n\n/* TODO: remove this*/\nspan {\n font-family: Arial, sans-serif;\n}\n\n\n#floatingToolbar .item {\n color: rgb(120, 119, 116);\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n#floatingToolbar .item>button {\n\n display: inline-flex;\n align-items: center;\n}\n\n\n#floatingToolbar select {\n color: rgb(120, 119, 116);\n border: none;\n font-size: 0.85rem;\n background-color: inherit;\n}\n\n.select-wrapper {\n display: flex;\n flex-direction: row;\n align-items: center;\n}\n\n.select-wrapper ul {\n position: absolute;\n background: #f9f9f9;\n flex-direction: column;\n width: fit-content;\n padding-bottom: 0.5rem;\n padding-left: 5px;\n padding-right: 5px;\n top: 2.2rem;\n color: rgb(55, 53, 47);\n padding-right: 0.3125rem;\n}\n\n\n\n.select-wrapper ul li {\n /* display: flex;\n flex-direction: row !important;\n background-color: yellow; */\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 0.625rem;\n padding: 0.1875rem 0.3125rem;\n border-radius: 0.1875rem;\n user-select: none !important;\n\n font-size: small !important;\n font-weight: 500;\n}\n\n.select-wrapper ul li span {\n display: inline-block;\n width: max-content;\n}\n\n.select-wrapper ul li .option-image {\n width: 1.375rem;\n height: 1.375rem;\n color: #242424;\n padding: 0 !important;\n margin: 0 !important;\n}\n\n.select-wrapper ul li .option-image svg {\n color: #4f4f4f;\n padding: 0 !important;\n margin: 0 !important;\n}\n\n.text-formatting-select-button {\n display: flex;\n flex-direction: row;\n align-items: center;\n}\n\n#turnIntoButton span {\n display: inline-flex;\n flex-direction: row;\n justify-content: center;\n align-items: center;\n font-size: 0.9rem;\n\n}\n\n#turnIntoButton svg use {\n margin: auto;\n}\n\n.select-wrapper {\n position: relative;\n color: rgb(120, 119, 116);\n}\n\n\n.select-wrapper > button {\n color: rgba(55, 53, 47, 0.85);\n}\n\n\n\n\n\n\n\ncode:not(pre code) {\n margin: 0;\n padding: 0;\n background-color: #d0d0d0;\n background-color: #f6f5f4;\n font-size: inherit;\n font-size: 1rem !important;\n border: 1px solid #0000001a;\n padding: 0 3px;\n display: inline-block;\n border-radius: 4px;\n box-sizing: border-box;\n}\n\n\n\n\na:not([href]) {\n background-color: #d3e3fd;\n}\n\n.text-formatting-button-active {\n color: #2382e2;\n}\n\n.text-formatting-circle-active {\n border-color: #2382e2 !important;\n}\n\n\n\n#moreTextOptionSelect {\n position: absolute;\n}\n\n.moreTextOptionWrapper {\n position: relative;\n}\n\n\n.select-wrapper ul li>h3 {\n margin: 0;\n font-size: small !important;\n color: #37352fa6;\n margin: 0;\n padding: 0;\n font-weight: 600 !important;\n margin-top: 0.3125rem;\n margin-bottom: 0.3125rem;\n}\n\n\n.bgc-red {\n background-color: #FDDEDE;\n}\n\n.bgc-green {\n background-color: #D7F7DC;\n}\n\n.bgc-blue {\n background-color: #D9EDF6;\n}\n\n.bgc-yellow {\n background-color: #FAF4D1;\n}\n\n.bgc-grey {\n background-color: #E1E0E0;\n}\n\np,\nmark {\n line-height: 1;\n}\n\n#turnIntoSelect .option-image {\n /* display: none !important; */\n}\n\n.border-less-image {\n width: 24px;\n height: 24px;\n}\n\n\n\n\n/** Block Options **/\n.soft-box-shadow {\n margin: 0;\n padding: 0;\n border-radius: 2px;\n box-shadow:\n 0 4px 6px rgba(0, 0, 0, 0.1),\n 0 -2px 4px rgba(216, 196, 196, 0.02),\n -2px 0 4px rgba(0, 0, 0, 0.02),\n 2px 0 4px rgba(0, 0, 0, 0.02);\n\n border: 1px solid #d0d0d0;\n}\n\n.block-options-wrapper {\n z-index: 999999;\n position: absolute;\n display: none;\n}\n\n.block-options {\n width: fit-content;\n max-height: 19rem;\n overflow-y: auto;\n}\n\n.block-options {\n padding: 0 0.625rem;\n background: #f9f9f9;\n}\n\n.block-options section h2 {\n font-size: small !important;\n color: #37352fa6;\n margin: 0;\n padding: 0;\n font-weight: 600 !important;\n margin-top: 0.3125rem;\n margin-bottom: 0.3125rem;\n padding-left: 0.3125rem;\n}\n\n.block-options .option {\n padding: 0.3125rem 0.625rem;\n margin: 0.3125rem 0;\n cursor: pointer;\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: left;\n gap: 0.6rem;\n border-radius: 3px;\n}\n\n.block-options .option:focus {\n outline: none;\n background-color: #e9e9e9;\n border: inherit;\n}\n\n.option-focused {\n outline: none;\n background-color: #e9e9e9;\n border: none;\n}\n\n#deleteOption.option-focused {\n color: #EB5757 !important;\n}\n\n#deleteOption.option-focused svg {\n color: #EB5757 !important;\n}\n\n\n\n.block-options .option:focus-visible {\n outline: none;\n background-color: #e9e9e9;\n border: inherit;\n}\n\n/* .option-hover:hover {\n background-color: #e9e9e9;\n box-shadow: 0px 0px 0px 2px #e9e9e9;\n border-radius: 1px;\n transition: 0.1s ease;\n} */\n\n/* .select-wrapper>button, */\n\n/* #turnIntoButton,\n#colorTextButton {\n padding-left: 4px;\n} */\n\n#turnIntoButton:not([disabled]):hover,\n#colorTextButton:not([disabled]):hover,\n#moreTextOptionButton:not([disabled]):hover,\n#floatingToolbar .item>button:not([disabled]):hover {\n background-color: #e9e9e9;\n box-shadow: 0px 0px 0px 2px #e9e9e9;\n border-radius: 1px;\n transition: 0.1s ease;\n}\n\n\n\n.option[focused="true"] {\n background-color: #bde4ff;\n}\n\n\n\n\n\n.option-image {\n width: 2.875rem;\n height: 2.875rem;\n border-radius: 0.1875rem;\n border: 1px solid #ccc;\n color: #4f4f4f;\n\n display: flex;\n flex-direction: row;\n justify-content: center;\n vertical-align: middle;\n align-items: center;\n background-color: #ffff;\n box-sizing: border-box;\n}\n\n.option-image img {\n max-width: 2.875rem;\n max-height: 2.875rem;\n}\n\n.option-image svg {\n margin: 0;\n padding: 0;\n padding: 0.625rem;\n box-sizing: border-box;\n\n}\n\n.option-text * {\n margin: 0;\n padding: 0;\n\n}\n\n.option-text .block-title {\n font-size: small !important;\n font-weight: 500;\n}\n\n.option-text .block-description {\n font-size: small !important;\n color: rgba(55, 53, 47, 0.5);\n}\n\n/** End Block Options **/\n\n\n\n#deleteBlockButton:hover svg,\n#deleteBlockButton:hover {\n color: rgb(235, 87, 87) !important;\n}\n\n\n\n.johannes-editor *::selection {\n background-color: rgba(211, 227, 253, 0.5) !important;\n}\n\n.johannes-editor mark,\n.johannes-editor * {\n line-height: 1.5 !important;\n}\n\n.option {\n justify-content: space-between;\n}\n\n.text-option {\n display: flex;\n flex-direction: row;\n justify-content: start;\n align-items: center;\n gap: 0.625rem;\n}\n\n\n\n\n:root {\n /* font-size: 16px; */\n /* Tamanho padrão */\n}\n\n/* Para telas com densidade média */\n@media only screen and (-webkit-min-device-pixel-ratio: 2),\nonly screen and (min--moz-device-pixel-ratio: 2),\nonly screen and (min-resolution: 192dpi),\nonly screen and (min-resolution: 2dppx) {\n :root {\n font-size: 18px;\n /* Aumenta o tamanho da fonte para telas de alta densidade */\n }\n}\n\n/* Para telas com altíssima densidade */\n@media only screen and (-webkit-min-device-pixel-ratio: 3),\nonly screen and (min--moz-device-pixel-ratio: 3),\nonly screen and (min-resolution: 288dpi),\nonly screen and (min-resolution: 3dppx) {\n :root {\n font-size: 20px;\n /* Ainda maior para telas de densidade muito alta */\n }\n}',"",{version:3,sources:["webpack://./src/assets/css/main.css"],names:[],mappings:"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",sourcesContent:['/** CSS reset */\n\n.button-reset {\n border: none;\n margin: 0;\n padding: 0;\n width: auto;\n overflow: visible;\n background: transparent;\n color: inherit;\n font: inherit;\n line-height: normal;\n -webkit-font-smoothing: inherit;\n -moz-osx-font-smoothing: inherit;\n -webkit-appearance: none;\n}\n\n\n\n/** add block */\n.add-block {\n margin: 0;\n padding: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n border: 1px solid #000;\n background-color: white;\n transition: all 0.3s ease;\n box-sizing: border-box;\n margin-left: 1.3rem;\n}\n\n.add-block-wrapper {\n width: 100%;\n height: 3.125rem;\n}\n\n.add-block-wrapper:hover .add-block {\n display: flex;\n}\n\n/** and add block */\n\n\n\n/** List **/\nol.johannes-content-element,\nul.johannes-content-element {\n padding-left: 1rem !important;\n}\n\n\n\n.johannes-content-element li>button {\n /* display: none; */\n display: none;\n position: absolute;\n margin-left: 10px;\n top: 0;\n\n flex-direction: row;\n align-items: start;\n justify-content: start;\n\n}\n\n.johannes-content-element li {\n position: relative;\n}\n\n.johannes-content-element li::before {\n margin-left: 0.3125rem;\n}\n\n.johannes-content-element li:hover>button {\n /* display: inline-block; */\n display: inline-flex;\n\n}\n\np.johannes-content-element {\n display: inline-block;\n line-height: 1;\n margin: 0;\n padding: 0;\n}\n\n.johannes-content-element .checkbox-list {\n list-style-type: none;\n padding-left: 0 !important;\n}\n\n\n.johannes-content-element .checkbox-list li {\n display: flex;\n flex-direction: row;\n justify-content: left;\n}\n\n\n.johannes-content-element ul.checkbox-list input[type="checkbox"]:checked+span {\n text-decoration: line-through;\n}\n\nul.johannes-content-element:not(.checkbox-list),\nol.johannes-content-element:not(.checkbox-list) {\n padding-left: 1.5rem !important;\n}\n\n/** and list **/\n\n\n\n.block>.drag-handler {\n color: #84888d;\n visibility: hidden;\n cursor: grab;\n align-self: start;\n\n /* background-color: pink; */\n padding-top: 0.33rem;\n position: absolute;\n}\n\n.drag-handler svg {\n /* background-color: red; */\n}\n\n.drag-handler svg use {\n /* background-color: blue; */\n}\n\n.drag-handler:active {\n cursor: grabbing;\n}\n\n.block {\n display: flex;\n flex-direction: row;\n margin-bottom: 1rem;\n position: relative;\n}\n\n.block>*:not(.drag-handler) {\n padding-left: 1.25rem;\n}\n\n.block:hover .drag-handler {\n visibility: visible;\n vertical-align: top;\n justify-content: start;\n}\n\n.drop-line {\n height: 1rem;\n background-color: #84888d;\n width: 100%;\n}\n\n\n.title h1 {\n margin-left: 1.3rem;\n}\n\nh1[data-placeholder]:empty:before {\n content: attr(data-placeholder);\n color: #84888d !important;\n display: block;\n}\n\nh1[data-placeholder]:focus:before {}\n\n\n*[contenteditable="true"]:not(h1):empty:before {\n content: attr(data-placeholder);\n color: #84888acd;\n display: none;\n}\n\n*[contenteditable="true"]:not(h1):empty:hover:before {\n display: block;\n}\n\ncite[contenteditable="true"]:empty:before {\n display: block;\n}\n\n*[contenteditable="true"]:not(h1)[data-placeholder]:empty:focus:before {\n content: attr(data-placeholder);\n color: #84888acd !important;\n display: block;\n}\n\n\n\nh1 {\n font-size: 2.5rem;\n font-weight: bolder !important;\n}\n\n.johannes-editor {\n width: 100%;\n\n}\n\n.content {\n width: 100%;\n box-sizing: border-box;\n\n\n}\n\npre {\n width: 100%;\n}\n\n[contenteditable] {\n outline: none;\n}\n\nbody {\n height: 2000px;\n background-color: #f0f0f1 !important;\n\n font-family: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";\n}\n\n\n.editor {\n display: flex;\n margin-top: 80px;\n}\n\np {\n color: #242424;\n}\n\n\n.block,\n.block * {\n user-select: text;\n}\n\n\n.johannes-content-element {\n width: 100%;\n padding: 0;\n margin: 0;\n /* background-color: green; */\n}\n\n\n#johannesEditor {\n width: 60%;\n margin-left: auto;\n margin-right: auto;\n}\n\n.johannes-editor hr {\n width: 100%;\n height: 2px;\n visibility: visible;\n border: none;\n border-bottom: 1px solid rgba(55, 53, 47, 0.16);\n}\n\n\n\n.johannes-editor blockquote {\n margin: 0.5rem 0;\n padding-left: 20px;\n border-left: 4px solid rgb(55, 53, 47);\n font-style: italic\n}\n\n.johannes-editor cite {\n padding-top: 1rem !important;\n display: inline-block;\n}\n\n\n.johannes-editor cite::before {\n content: \'— \';\n}\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n#linkBox {\n border-radius: 2px;\n padding: 20px;\n background-color: #f9f9f9;\n\n\n box-shadow:\n 0 4px 6px rgba(0, 0, 0, 0.1),\n 0 -2px 4px rgba(0, 0, 0, 0.02),\n -2px 0 4px rgba(0, 0, 0, 0.02),\n 2px 0 4px rgba(0, 0, 0, 0.02);\n\n\n border: 1px solid #d0d0d0;\n width: fit-content;\n z-index: 999999;\n color: rgb(120, 119, 116);\n border-radius: none;\n}\n\n\n#linkBox input {\n width: 316px;\n padding: 8px 40px 8px 16px;\n /* border-color: #d0d0d0; */\n\n border: 1px solid #949494;\n /* border-radius: 4px; */\n height: 24px;\n\n display: flex;\n flex-direction: row;\n justify-content: center;\n align-items: center;\n}\n\n\n#linkBox input::selection,\n#linkBox input:focus {\n border-radius: none;\n}\n\n\n\n\n\n\n\n\n/** Text formatting Bar **/\n\n\n\n#floatingToolbar {\n justify-content: space-between;\n padding: 8px 16px;\n background-color: #f9f9f9;\n width: fit-content;\n z-index: 999999;\n position: absolute;\n user-select: none;\n}\n\n/* TODO: remove this*/\nspan {\n font-family: Arial, sans-serif;\n}\n\n\n#floatingToolbar .item {\n color: rgb(120, 119, 116);\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n#floatingToolbar .item>button {\n\n display: inline-flex;\n align-items: center;\n}\n\n\n#floatingToolbar select {\n color: rgb(120, 119, 116);\n border: none;\n font-size: 0.85rem;\n background-color: inherit;\n}\n\n.select-wrapper {\n display: flex;\n flex-direction: row;\n align-items: center;\n}\n\n.select-wrapper ul {\n position: absolute;\n background: #f9f9f9;\n flex-direction: column;\n width: fit-content;\n padding-bottom: 0.5rem;\n padding-left: 5px;\n padding-right: 5px;\n top: 2.2rem;\n color: rgb(55, 53, 47);\n padding-right: 0.3125rem;\n}\n\n\n\n.select-wrapper ul li {\n /* display: flex;\n flex-direction: row !important;\n background-color: yellow; */\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 0.625rem;\n padding: 0.1875rem 0.3125rem;\n border-radius: 0.1875rem;\n user-select: none !important;\n\n font-size: small !important;\n font-weight: 500;\n}\n\n.select-wrapper ul li span {\n display: inline-block;\n width: max-content;\n}\n\n.select-wrapper ul li .option-image {\n width: 1.375rem;\n height: 1.375rem;\n color: #242424;\n padding: 0 !important;\n margin: 0 !important;\n}\n\n.select-wrapper ul li .option-image svg {\n color: #4f4f4f;\n padding: 0 !important;\n margin: 0 !important;\n}\n\n.text-formatting-select-button {\n display: flex;\n flex-direction: row;\n align-items: center;\n}\n\n#turnIntoButton span {\n display: inline-flex;\n flex-direction: row;\n justify-content: center;\n align-items: center;\n font-size: 0.9rem;\n\n}\n\n#turnIntoButton svg use {\n margin: auto;\n}\n\n.select-wrapper {\n position: relative;\n color: rgb(120, 119, 116);\n}\n\n\n.select-wrapper > button {\n color: rgba(55, 53, 47, 0.85);\n}\n\n\n\n\n\n\n\ncode:not(pre code) {\n margin: 0;\n padding: 0;\n background-color: #d0d0d0;\n background-color: #f6f5f4;\n font-size: inherit;\n font-size: 1rem !important;\n border: 1px solid #0000001a;\n padding: 0 3px;\n display: inline-block;\n border-radius: 4px;\n box-sizing: border-box;\n}\n\n\n\n\na:not([href]) {\n background-color: #d3e3fd;\n}\n\n.text-formatting-button-active {\n color: #2382e2;\n}\n\n.text-formatting-circle-active {\n border-color: #2382e2 !important;\n}\n\n\n\n#moreTextOptionSelect {\n position: absolute;\n}\n\n.moreTextOptionWrapper {\n position: relative;\n}\n\n\n.select-wrapper ul li>h3 {\n margin: 0;\n font-size: small !important;\n color: #37352fa6;\n margin: 0;\n padding: 0;\n font-weight: 600 !important;\n margin-top: 0.3125rem;\n margin-bottom: 0.3125rem;\n}\n\n\n.bgc-red {\n background-color: #FDDEDE;\n}\n\n.bgc-green {\n background-color: #D7F7DC;\n}\n\n.bgc-blue {\n background-color: #D9EDF6;\n}\n\n.bgc-yellow {\n background-color: #FAF4D1;\n}\n\n.bgc-grey {\n background-color: #E1E0E0;\n}\n\np,\nmark {\n line-height: 1;\n}\n\n#turnIntoSelect .option-image {\n /* display: none !important; */\n}\n\n.border-less-image {\n width: 24px;\n height: 24px;\n}\n\n\n\n\n/** Block Options **/\n.soft-box-shadow {\n margin: 0;\n padding: 0;\n border-radius: 2px;\n box-shadow:\n 0 4px 6px rgba(0, 0, 0, 0.1),\n 0 -2px 4px rgba(216, 196, 196, 0.02),\n -2px 0 4px rgba(0, 0, 0, 0.02),\n 2px 0 4px rgba(0, 0, 0, 0.02);\n\n border: 1px solid #d0d0d0;\n}\n\n.block-options-wrapper {\n z-index: 999999;\n position: absolute;\n display: none;\n}\n\n.block-options {\n width: fit-content;\n max-height: 19rem;\n overflow-y: auto;\n}\n\n.block-options {\n padding: 0 0.625rem;\n background: #f9f9f9;\n}\n\n.block-options section h2 {\n font-size: small !important;\n color: #37352fa6;\n margin: 0;\n padding: 0;\n font-weight: 600 !important;\n margin-top: 0.3125rem;\n margin-bottom: 0.3125rem;\n padding-left: 0.3125rem;\n}\n\n.block-options .option {\n padding: 0.3125rem 0.625rem;\n margin: 0.3125rem 0;\n cursor: pointer;\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: left;\n gap: 0.6rem;\n border-radius: 3px;\n}\n\n.block-options .option:focus {\n outline: none;\n background-color: #e9e9e9;\n border: inherit;\n}\n\n.option-focused {\n outline: none;\n background-color: #e9e9e9;\n border: none;\n}\n\n#deleteOption.option-focused {\n color: #EB5757 !important;\n}\n\n#deleteOption.option-focused svg {\n color: #EB5757 !important;\n}\n\n\n\n.block-options .option:focus-visible {\n outline: none;\n background-color: #e9e9e9;\n border: inherit;\n}\n\n/* .option-hover:hover {\n background-color: #e9e9e9;\n box-shadow: 0px 0px 0px 2px #e9e9e9;\n border-radius: 1px;\n transition: 0.1s ease;\n} */\n\n/* .select-wrapper>button, */\n\n/* #turnIntoButton,\n#colorTextButton {\n padding-left: 4px;\n} */\n\n#turnIntoButton:not([disabled]):hover,\n#colorTextButton:not([disabled]):hover,\n#moreTextOptionButton:not([disabled]):hover,\n#floatingToolbar .item>button:not([disabled]):hover {\n background-color: #e9e9e9;\n box-shadow: 0px 0px 0px 2px #e9e9e9;\n border-radius: 1px;\n transition: 0.1s ease;\n}\n\n\n\n.option[focused="true"] {\n background-color: #bde4ff;\n}\n\n\n\n\n\n.option-image {\n width: 2.875rem;\n height: 2.875rem;\n border-radius: 0.1875rem;\n border: 1px solid #ccc;\n color: #4f4f4f;\n\n display: flex;\n flex-direction: row;\n justify-content: center;\n vertical-align: middle;\n align-items: center;\n background-color: #ffff;\n box-sizing: border-box;\n}\n\n.option-image img {\n max-width: 2.875rem;\n max-height: 2.875rem;\n}\n\n.option-image svg {\n margin: 0;\n padding: 0;\n padding: 0.625rem;\n box-sizing: border-box;\n\n}\n\n.option-text * {\n margin: 0;\n padding: 0;\n\n}\n\n.option-text .block-title {\n font-size: small !important;\n font-weight: 500;\n}\n\n.option-text .block-description {\n font-size: small !important;\n color: rgba(55, 53, 47, 0.5);\n}\n\n/** End Block Options **/\n\n\n\n#deleteBlockButton:hover svg,\n#deleteBlockButton:hover {\n color: rgb(235, 87, 87) !important;\n}\n\n\n\n.johannes-editor *::selection {\n background-color: rgba(211, 227, 253, 0.5) !important;\n}\n\n.johannes-editor mark,\n.johannes-editor * {\n line-height: 1.5 !important;\n}\n\n.option {\n justify-content: space-between;\n}\n\n.text-option {\n display: flex;\n flex-direction: row;\n justify-content: start;\n align-items: center;\n gap: 0.625rem;\n}\n\n\n\n\n:root {\n /* font-size: 16px; */\n /* Tamanho padrão */\n}\n\n/* Para telas com densidade média */\n@media only screen and (-webkit-min-device-pixel-ratio: 2),\nonly screen and (min--moz-device-pixel-ratio: 2),\nonly screen and (min-resolution: 192dpi),\nonly screen and (min-resolution: 2dppx) {\n :root {\n font-size: 18px;\n /* Aumenta o tamanho da fonte para telas de alta densidade */\n }\n}\n\n/* Para telas com altíssima densidade */\n@media only screen and (-webkit-min-device-pixel-ratio: 3),\nonly screen and (min--moz-device-pixel-ratio: 3),\nonly screen and (min-resolution: 288dpi),\nonly screen and (min-resolution: 3dppx) {\n :root {\n font-size: 20px;\n /* Ainda maior para telas de densidade muito alta */\n }\n}'],sourceRoot:""}]);const l=s},314:e=>{"use strict";e.exports=function(e){var n=[];return n.toString=function(){return this.map((function(n){var t="",o=void 0!==n[5];return n[4]&&(t+="@supports (".concat(n[4],") {")),n[2]&&(t+="@media ".concat(n[2]," {")),o&&(t+="@layer".concat(n[5].length>0?" ".concat(n[5]):""," {")),t+=e(n),o&&(t+="}"),n[2]&&(t+="}"),n[4]&&(t+="}"),t})).join("")},n.i=function(e,t,o,i,r){"string"==typeof e&&(e=[[null,e,void 0]]);var s={};if(o)for(var l=0;l0?" ".concat(d[5]):""," {").concat(d[1],"}")),d[5]=r),t&&(d[2]?(d[1]="@media ".concat(d[2]," {").concat(d[1],"}"),d[2]=t):d[2]=t),i&&(d[4]?(d[1]="@supports (".concat(d[4],") {").concat(d[1],"}"),d[4]=i):d[4]="".concat(i)),n.push(d))}},n}},354:e=>{"use strict";e.exports=function(e){var n=e[1],t=e[3];if(!t)return n;if("function"==typeof btoa){var o=btoa(unescape(encodeURIComponent(JSON.stringify(t)))),i="sourceMappingURL=data:application/json;charset=utf-8;base64,".concat(o),r="/*# ".concat(i," */");return[n].concat([r]).join("\n")}return[n].join("\n")}},72:e=>{"use strict";var n=[];function t(e){for(var t=-1,o=0;o{"use strict";var n={};e.exports=function(e,t){var o=function(e){if(void 0===n[e]){var t=document.querySelector(e);if(window.HTMLIFrameElement&&t instanceof window.HTMLIFrameElement)try{t=t.contentDocument.head}catch(e){t=null}n[e]=t}return n[e]}(e);if(!o)throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");o.appendChild(t)}},540:e=>{"use strict";e.exports=function(e){var n=document.createElement("style");return e.setAttributes(n,e.attributes),e.insert(n,e.options),n}},56:(e,n,t)=>{"use strict";e.exports=function(e){var n=t.nc;n&&e.setAttribute("nonce",n)}},825:e=>{"use strict";e.exports=function(e){if("undefined"==typeof document)return{update:function(){},remove:function(){}};var n=e.insertStyleElement(e);return{update:function(t){!function(e,n,t){var o="";t.supports&&(o+="@supports (".concat(t.supports,") {")),t.media&&(o+="@media ".concat(t.media," {"));var i=void 0!==t.layer;i&&(o+="@layer".concat(t.layer.length>0?" ".concat(t.layer):""," {")),o+=t.css,i&&(o+="}"),t.media&&(o+="}"),t.supports&&(o+="}");var r=t.sourceMap;r&&"undefined"!=typeof btoa&&(o+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(r))))," */")),n.styleTagTransform(o,e,n.options)}(n,e,t)},remove:function(){!function(e){if(null===e.parentNode)return!1;e.parentNode.removeChild(e)}(n)}}}},113:e=>{"use strict";e.exports=function(e,n){if(n.styleSheet)n.styleSheet.cssText=e;else{for(;n.firstChild;)n.removeChild(n.firstChild);n.appendChild(document.createTextNode(e))}}},528:()=>{document.addEventListener("DOMContentLoaded",(function(){const e=document.querySelector(".johannes-editor");let n=null,t=document.createElement("div");t.classList.add("drop-line"),t.style.height="2px",t.style.display="none",e.addEventListener("dragstart",(e=>{e.target.classList?.contains("drag-handler")&&(n=e.target.closest(".block"),n.setAttribute("draggable","true"),setTimeout((()=>{n.style.opacity="0.5"}),0))})),e.addEventListener("dragend",(()=>{setTimeout((()=>{n&&(n.style.opacity="",n.removeAttribute("draggable"),n=null),t.remove()}),0)})),e.addEventListener("dragover",(e=>{e.preventDefault();let o=e.target.closest(".block");if(o&&o!==n){let n=o.getBoundingClientRect(),i=n.y+n.height/2;e.clientY>i?o.nextElementSibling!==t&&o.insertAdjacentElement("afterend",t):o.previousElementSibling!==t&&o.insertAdjacentElement("beforebegin",t)}t.style.display="block"})),e.addEventListener("drop",(e=>{e.preventDefault(),n&&t&&t.parentElement&&(t.parentElement.insertBefore(n,t),t.remove())}))}))},167:()=>{let e=[],n=[];document.addEventListener("DOMContentLoaded",(function(){const t=document.querySelector(".content");if(t){function o(){const n=t.innerHTML;e.push(n)}t.addEventListener("input",(()=>{o()})),document.addEventListener("keydown",(o=>{o.ctrlKey&&"z"===o.key?(function(){if(e.length>0){const o=e.pop();n.push(t.innerHTML),t.innerHTML=o}}(),o.preventDefault()):o.ctrlKey&&"y"===o.key&&(function(){if(n.length>0){const o=n.pop();e.push(t.innerHTML),t.innerHTML=o}}(),o.preventDefault())})),o()}}))}},n={};function t(o){var i=n[o];if(void 0!==i)return i.exports;var r=n[o]={id:o,exports:{}};return e[o](r,r.exports,t),r.exports}t.n=e=>{var n=e&&e.__esModule?()=>e.default:()=>e;return t.d(n,{a:n}),n},t.d=(e,n)=>{for(var o in n)t.o(n,o)&&!t.o(e,o)&&Object.defineProperty(e,o,{enumerable:!0,get:n[o]})},t.o=(e,n)=>Object.prototype.hasOwnProperty.call(e,n),t.nc=void 0,(()=>{"use strict";class e{creators;static _instance;static ELEMENT_TYPES={BLOCK_PARAGRAPH:"block-p",PARAGRAPH:"p",CHECKBOX_ITEM:"checkboxItem",LIST_ITEM:"listItem",CODE:"code",QUOTE:"blockquote",BULLETED_LIST:"ul",NUMBERED_LIST:"ol",CHECK_LIST:"checkLists",HEADER_1:"h1",HEADER_2:"h2",HEADER_3:"h3",HEADER_4:"h4",HEADER_5:"h5",HEADER_6:"h6",DRAG_HANDLE_BUTTON:"drag-handle-button"};constructor(){if(e._instance)throw new Error("Use ElementFactoryService.getInstance() to get instance.");this.creators={},this.register(e.ELEMENT_TYPES.BLOCK_PARAGRAPH,e.blockParagraphCreator()),this.register(e.ELEMENT_TYPES.PARAGRAPH,e.paragraphCreator()),this.register(e.ELEMENT_TYPES.CHECKBOX_ITEM,e.checkboxItemCreator()),this.register(e.ELEMENT_TYPES.LIST_ITEM,e.listItemCreator()),this.register(e.ELEMENT_TYPES.CODE,e.codeCreator()),this.register(e.ELEMENT_TYPES.QUOTE,e.quoteCreator()),this.register(e.ELEMENT_TYPES.CHECK_LIST,e.checkListCreator()),this.register(e.ELEMENT_TYPES.BULLETED_LIST,e.bulletedListCreator()),this.register(e.ELEMENT_TYPES.NUMBERED_LIST,e.numberedListCreator()),this.register(e.ELEMENT_TYPES.HEADER_1,e.headingCreator(1)),this.register(e.ELEMENT_TYPES.HEADER_2,e.headingCreator(2)),this.register(e.ELEMENT_TYPES.HEADER_3,e.headingCreator(3)),this.register(e.ELEMENT_TYPES.HEADER_4,e.headingCreator(4)),this.register(e.ELEMENT_TYPES.HEADER_5,e.headingCreator(5)),this.register(e.ELEMENT_TYPES.HEADER_6,e.headingCreator(6)),this.register(e.ELEMENT_TYPES.DRAG_HANDLE_BUTTON,e.dragHandleButtonCreator()),e._instance=this}static getInstance(){return this._instance||(this._instance=new e),this._instance}register(e,n){this.creators[e]=n}create(e,n){const t=this.creators[e];if(!t)throw new TypeError(`No creator registered for type: ${e}`);return t(n||"")}static blockParagraphCreator(){return n=>e.blockParagraph(n)}static paragraphCreator(){return n=>e.paragraph(n)}static headingCreator(n){return t=>e.heading(n,t)}static checkboxItemCreator(){return n=>e.checkboxItem(n||"")}static listItemCreator(){return n=>e.listItem_2(n)}static dragHandleButtonCreator(){return()=>e.dragHandleButton()}static codeCreator(){return e=>{const n=document.createElement("pre"),t=document.createElement("code");return t.textContent=e||"",n.appendChild(t),t.contentEditable="true",n.classList.add("johannes-content-element"),t.classList.add("johannes-code"),n}}static quoteCreator(){return e=>{const n=document.createElement("blockquote");return n.textContent=e||"",n.contentEditable="true",n.classList.add("johannes-content-element"),n}}static checkListCreator(){return n=>{const t=document.createElement("ul");t.contentEditable="true",t.classList.add("johannes-content-element"),t.classList.add("swittable"),t.classList.add("list"),t.classList.add("checkbox-list");const o=e.checkboxItem(n||"");return t.appendChild(o),t}}static bulletedListCreator(){return n=>{const t=document.createElement("ul");t.contentEditable="true",t.classList.add("johannes-content-element"),t.classList.add("swittable"),t.classList.add("list");const o=e.listItem(n||"");return t.appendChild(o),t}}static numberedListCreator(){return n=>{const t=document.createElement("ol");t.contentEditable="true",t.classList.add("johannes-content-element"),t.classList.add("swittable"),t.classList.add("list");const o=e.listItem(n||"");return t.appendChild(o),t}}static paragraph(e=null){const n=document.createElement("p");return n.innerText=e||"",n.contentEditable="true",n.setAttribute("data-type","p"),n.classList.add("johannes-content-element"),n.classList.add("swittable"),n.classList.add("focusable"),n.classList.add("key-trigger"),n.setAttribute("data-placeholder","Write something or type / (slash) to choose a block..."),n}static listItem(e){let n=document.createElement("li");return n.classList.add("focusable"),n.classList.add("deletable"),n.classList.add("editable"),n.classList.add("focus"),n.classList.add("key-trigger"),n.classList.add("list-item"),n.innerText=e,n.contentEditable="true",n.setAttribute("data-placeholder","Item"),n}static heading(e,n=null){const t=document.createElement(`h${e}`);return t.innerText=n||"",t.contentEditable="true",t.setAttribute("data-type",`h${e}`),t.classList.add("johannes-content-element"),t.classList.add("swittable"),t.classList.add("focusable"),t.classList.add("focus"),t.classList.add("key-trigger"),t}static checkboxItem(e){let n=document.createElement("li");n.classList.add("deletable"),n.classList.add("list-item");let t=document.createElement("input");t.setAttribute("type","checkbox");let o=document.createElement("span");return o.textContent=e,o.setAttribute("data-placeholder","To-do"),o.setAttribute("contentEditable","true"),o.classList.add("focusable"),o.classList.add("editable"),o.classList.add("focus"),n.appendChild(t),n.appendChild(o),n}static listItem_2(e=null){let n=document.createElement("li");return n.classList.add("focusable"),n.classList.add("deletable"),n.classList.add("editable"),n.classList.add("focus"),n.classList.add("key-trigger"),n.classList.add("list-item"),n.innerText=e||"",n.setAttribute("contentEditable","true"),n.setAttribute("data-placeholder","Item"),n}static blockParagraph(n=null){let t=document.createElement("div"),o=e.paragraph(n),i=document.createElement("button");return i.innerHTML='',t.appendChild(o),t.classList.add("block"),t.classList.add("deletable"),i.classList.add("drag-handler"),i.classList.add("button-reset"),i.draggable=!0,t}static dragHandleButton(){let e=document.createElement("button");return e.innerHTML='',e.classList.add("drag-handler"),e.classList.add("button-reset"),e.draggable=!0,e}}class n{elementFactoryService;static instance;static BLOCK_OPERATIONS={TURN_INTO:"turnInto",CREATE_DEFAULT_BLOCK:"CreateDefaultBlock",DELETE_FOCUS_ON_PREVIOUS:"DeleteAndFocusOnPrevious",DELETE_FOCUS_ON_NEXT:"DeleteAndFocusOnNext",FOCUS_ON_FIRST:"FocusOnFirst",FOCUS_ON_PREVIOUS:"FocusOnPrevious",FOCUS_ON_NEXT:"FocusOnNext",DELETE:"delete",DUPLICATE:"duplicate",COPY:"copy",PASTE:"pates",CUT:"cut",REMOVE_FORMAT:"removeFormat",TRANSFORM_BLOCK:"transformBlock"};constructor(e){if(n.instance)throw new Error("Use BlockOperationsService.getInstance() to get instance.");this.elementFactoryService=e,n.instance=this}execCommand(e,t,o=null){if(e==n.BLOCK_OPERATIONS.COPY){if(document.getSelection&&navigator.clipboard&&navigator.clipboard.writeText){const e=document.getSelection();if(e&&e.toString().length>0){const n=e.toString();navigator.clipboard.writeText(n).then((()=>{const e=new CustomEvent("copiedText",{bubbles:!0,cancelable:!0});return document.dispatchEvent(e),!0})).catch((e=>{console.error("Error when copy text",e)}))}}return!1}if(e==n.BLOCK_OPERATIONS.CUT){if(document.getSelection&&navigator.clipboard&&navigator.clipboard.writeText){const e=document.getSelection();if(e&&e.toString().length>0){const n=e.toString();e.deleteFromDocument();const t=new CustomEvent("requestHideFloatingToolbar",{bubbles:!0,cancelable:!0});document.dispatchEvent(t),navigator.clipboard.writeText(n).then((()=>!0)).catch((e=>{console.error("Error when cut text: ",e)}))}}return!1}if(e==n.BLOCK_OPERATIONS.PASTE)return navigator.clipboard&&navigator.clipboard.readText&&navigator.clipboard.readText().then((e=>{const n=document.getSelection();if(n&&n.rangeCount>0){const t=n.getRangeAt(0);t.deleteContents(),t.insertNode(document.createTextNode(e));const o=new CustomEvent("requestUpdateFloatingToolbar",{bubbles:!0,cancelable:!0});return document.dispatchEvent(o),!0}console.error("No text selected or clipboard empty.")})).catch((e=>{console.error("Error when pasting text: ",e)})),!1;if(e==n.BLOCK_OPERATIONS.TRANSFORM_BLOCK){const e=this.getCurrentSelectedBlock();e&&o&&this.transformBlock(e,o)}if(e==n.BLOCK_OPERATIONS.REMOVE_FORMAT)return document.execCommand(n.BLOCK_OPERATIONS.REMOVE_FORMAT,!1);if(e==n.BLOCK_OPERATIONS.DELETE){this.deleteAndFocusOnNext();const e=new CustomEvent("requestHideFloatingToolbar",{bubbles:!0,cancelable:!0});return document.dispatchEvent(e),!0}if(e==n.BLOCK_OPERATIONS.DUPLICATE)return this.duplicateSelectedBlock(),!0;if(e==n.BLOCK_OPERATIONS.CREATE_DEFAULT_BLOCK){const e=document.activeElement||null;return this.createDefaultBlock(e),!0}if(e==n.BLOCK_OPERATIONS.FOCUS_ON_FIRST){const e=document.querySelector(".focusable");return!!e&&(e.focus(),!0)}if(e==n.BLOCK_OPERATIONS.DELETE_FOCUS_ON_PREVIOUS)return this.deleteAndFocusOnPrevious(),!0;if(e==n.BLOCK_OPERATIONS.DELETE_FOCUS_ON_NEXT)return this.deleteAndFocusOnNext(),!0;if(e==n.BLOCK_OPERATIONS.FOCUS_ON_PREVIOUS){const e=document.activeElement;return!!e&&(this.focusOnPrevious(e),!0)}if(e==n.BLOCK_OPERATIONS.FOCUS_ON_NEXT){const e=document.activeElement;return!!e&&(this.focusOnNext(e),!0)}if(e==n.BLOCK_OPERATIONS.TURN_INTO){if(!o)throw new Error;const e=n.getDraggableElementFromSelection();this.formatBlock(e,o)}const i=new CustomEvent("requestHideFloatingToolbar",{bubbles:!0,cancelable:!0});return document.dispatchEvent(i),!0}queryCommandState(){throw new Error("Method not implemented.")}static getInstance(t=null){return this.instance||(this.instance=new n(t||e.getInstance())),this.instance}formatBlock(e,n){let t=e.querySelector(".swittable"),o=t.innerText,i=this.elementFactoryService.create(n,o);e.replaceChild(i,t),i.closest(".focusable")||e.querySelector(".focusable")}static getDraggableElementFromSelection(){const e=window.getSelection();if(e&&e.rangeCount>0){let n=e.getRangeAt(0).commonAncestorContainer;for(n.nodeType===Node.TEXT_NODE&&(n=n.parentNode);n&&!(n instanceof HTMLElement);)n=n.parentNode;if(n)return n.closest(".block")}throw new Error}transformBlock(n,t){let o,i=n.querySelector(".swittable"),r=i?.innerText;switch(t){case e.ELEMENT_TYPES.PARAGRAPH:o=this.elementFactoryService.create(e.ELEMENT_TYPES.PARAGRAPH),o.innerText=r;break;case e.ELEMENT_TYPES.HEADER_1:o=this.elementFactoryService.create(e.ELEMENT_TYPES.HEADER_1),o.innerText=r;break;case e.ELEMENT_TYPES.HEADER_2:o=this.elementFactoryService.create(e.ELEMENT_TYPES.HEADER_2),o.innerText=r;break;case e.ELEMENT_TYPES.HEADER_3:o=this.elementFactoryService.create(e.ELEMENT_TYPES.HEADER_3),o.innerText=r;break;case e.ELEMENT_TYPES.HEADER_4:o=this.elementFactoryService.create(e.ELEMENT_TYPES.HEADER_4),o.innerText=r;break;case e.ELEMENT_TYPES.HEADER_5:o=this.elementFactoryService.create(e.ELEMENT_TYPES.HEADER_5),o.innerText=r;break;case e.ELEMENT_TYPES.HEADER_6:o=this.elementFactoryService.create(e.ELEMENT_TYPES.HEADER_6),o.innerText=r;break;case e.ELEMENT_TYPES.CODE:o=document.createElement("pre");const n=document.createElement("code");n.innerText=r,o.appendChild(n);break;case"image":o=document.createElement("img"),o.src=r,o.alt="Descriptive text";break;case e.ELEMENT_TYPES.QUOTE:break;case e.ELEMENT_TYPES.BULLETED_LIST:o=this.elementFactoryService.create(e.ELEMENT_TYPES.BULLETED_LIST,r);break;case e.ELEMENT_TYPES.NUMBERED_LIST:o=this.elementFactoryService.create(e.ELEMENT_TYPES.NUMBERED_LIST,r);break;case e.ELEMENT_TYPES.CHECK_LIST:o=this.elementFactoryService.create(e.ELEMENT_TYPES.CHECK_LIST,r);break;case"separator":break;default:return void console.error("Unsupported type")}o&&(n.replaceChild(o,i),o.closest(".focusable")||n.querySelector(".focusable"))}createNewElement(e){const n=e.target.closest(".johannes-content-element");n&&n.classList.contains("list")?this.createListItem(n):this.createDefaultBlock(n)}createListItem(e){let n=null,t=(document.activeElement,e.closest(".johannes-content-element"));t.classList.contains("checkbox-list")?n=this.elementFactoryService.create("checkboxItem",""):t.classList.contains("list")&&(n=this.elementFactoryService.create("listItem",""))}createDefaultBlock(n){const t=this.elementFactoryService.create(e.ELEMENT_TYPES.BLOCK_PARAGRAPH,"");n&&n.closest(".block")?n.closest(".block").insertAdjacentElement("afterend",t):document.querySelector("#johannesEditor .content").appendChild(t),t.querySelector(".johannes-content-element").focus()}deleteAndFocusOnPrevious(){const e=document.activeElement;this.focusOnPrevious(e),this.deleteTheCurrentElementAndTheDraggableBlockIfEmpty(e)}deleteAndFocusOnNext(){let e=this.getCurrentSelectedBlock()||this.getCurrentActiveBlock();e&&(this.focusOnNext(e),this.deleteTheCurrentElementAndTheDraggableBlockIfEmpty(e))}focusOnPrevious(e,n=null){let t=null;if("LI"===e.tagName.toUpperCase()){let o=e.previousElementSibling;if(!o)return;if(o&&o.classList.contains("focusable"))return t=o,void(n?this.applyCursorXEndPosition(t,n):this.focusOnTheEndOfTheText(t))}if("LI"===e.parentNode.tagName.toUpperCase()){let o=e.closest("li")?.previousElementSibling?.querySelector(".focusable");if(o&&o.classList.contains("focusable"))return t=o,void(n?this.applyCursorXEndPosition(t,n):this.focusOnTheEndOfTheText(t))}let o=e.closest(".block");if(!o)return;let i=o.previousElementSibling;for(;i;){let e=i.querySelectorAll(".focusable");if(e.length>0)return t=e[e.length-1],void(n?this.applyCursorXEndPosition(t,n):this.focusOnTheEndOfTheText(t));i=i.previousElementSibling}}focusOnNext(e,n=null){let t=null;if("LI"===e.tagName.toUpperCase()){let o=e.nextElementSibling;if(o&&o.classList.contains("focusable"))return t=o,n?this.applyCursorXStartPosition(t,n):this.focusOnTheStartOfTheText(t),t}if("LI"===e.parentNode.tagName.toUpperCase()){let o=e.closest("li")?.nextElementSibling?.querySelector(".focusable");if(o&&o.classList.contains("focusable"))return t=o,n?this.applyCursorXStartPosition(t,n):this.focusOnTheStartOfTheText(t),t}let o=e.closest(".block");if(!o)return;let i=o.nextElementSibling;for(;i;){let e=i.querySelectorAll(".focusable");if(e.length>0)return t=e[0],n?this.applyCursorXStartPosition(t,n):this.focusOnTheStartOfTheText(t),t;i=i.nextElementSibling}return t}deleteTheCurrentElementAndTheDraggableBlockIfEmpty(e){const n=e.closest(".block"),t=e.closest(".deletable");t?.remove(),n&&0==n.querySelectorAll(".editable").length&&n.remove()}applyCursorXEndPosition(e,n){const t=window.getSelection(),o=document.createRange();let i=e.lastChild,r=null;for(;i;){if(i.nodeType===Node.TEXT_NODE){r=this.adjustCursorOffset(i,n);break}i=(i.nodeName.toUpperCase(),i.previousSibling)}r&&r.closestNode?(o.setStart(r.closestNode,r.closestOffset),o.collapse(!0),t.removeAllRanges(),t.addRange(o),e.focus()):(o.selectNodeContents(e),o.collapse(!1),t.removeAllRanges(),t.addRange(o),e.focus())}applyCursorXStartPosition(e,n){const t=window.getSelection(),o=document.createRange();let i=e.firstChild,r=null;for(;i;){if(i.nodeType===Node.TEXT_NODE){r=this.adjustCursorOffset(i,n);break}i=i.nextSibling}r&&r.closestNode?(o.setStart(r.closestNode,r.closestOffset),o.collapse(!0),t.removeAllRanges(),t.addRange(o),e.focus()):(o.selectNodeContents(e),o.collapse(!0),t.removeAllRanges(),t.addRange(o),e.focus())}adjustCursorOffset(e,n){let t=document.createRange(),o=e,i=0,r=1/0;for(let o=0;ot.getBoundingClientRect().right&&(i=e.textContent.length),{closestNode:o,closestOffset:i}}focusOnTheEndOfTheText(e){setTimeout((()=>{const n=document.createRange(),t=window.getSelection();n.selectNodeContents(e);let o=e;for(;o.lastChild&&o.lastChild.nodeType===Node.ELEMENT_NODE;)o=o.lastChild;o.lastChild&&(o=o.lastChild),n.setEnd(o,o.textContent.length),n.collapse(!1),t.removeAllRanges(),t.addRange(n),e.focus()}),10)}focusOnTheStartOfTheText(e){setTimeout((()=>{const n=document.createRange(),t=window.getSelection();n.selectNodeContents(e),n.collapse(!0),t.removeAllRanges(),t.addRange(n),e.focus()}),10)}getCurrentSelectedFocusable(){const e=window.getSelection();if(!e||0===e.rangeCount)return null;let n=e.getRangeAt(0).commonAncestorContainer;return n.nodeType===Node.TEXT_NODE&&(n=n.parentNode),n.closest(".focusable")}getCurrentSelectedBlock(){const e=window.getSelection();if(!e||0===e.rangeCount)return null;let n=e.getRangeAt(0).commonAncestorContainer;return n.nodeType===Node.TEXT_NODE&&(n=n.parentNode),n.closest(".block")}getCurrentActiveBlock(){let e=document.activeElement;return e?e.closest(".block"):null}duplicateSelectedBlock(){let e=this.getCurrentSelectedBlock()||this.getCurrentActiveBlock();if(!e||!e.parentNode)return void console.error("O elemento fornecido é inválido ou não está no DOM.");const n=e.cloneNode(!0),t=e.nextSibling;e.parentNode.insertBefore(n,t)}}class o{_canHide;props;htmlElement;constructor(e){this.props=e,this.htmlElement=this.init(),this._canHide=!0}get display(){return"block"}documentAppendTo(e){e.appendChild(this.htmlElement)}get isVisible(){let e=this.htmlElement;if("none"===e.style.display||"hidden"===e.style.visibility||!document.contains(e))return!1;for(;e;){const n=window.getComputedStyle(e);if("none"===n.display||"hidden"===n.visibility)return!1;if(!e.parentElement)break;e=e.parentElement}return!0}show(){this._canHide=!1,this.htmlElement.style.display=this.display,setTimeout((()=>{this._canHide=!0}),100)}hide(){this._canHide||console.warn("Attempted to hide the element before 100 milliseconds have passed since the last display."),this.htmlElement.style.display="none"}get canHide(){return this._canHide&&this.isVisible}set canHide(e){this._canHide=e}focus(){this.htmlElement.focus()}changeColor(e){this.htmlElement.style.color=e}removeColor(){this.htmlElement.style.color="inherit"}changeVisibilityToVisible(){this.htmlElement.style.visibility="visible"}changeVisibilityToHidden(){this.htmlElement.style.visibility="hidden"}get doesElementOverflowScreen(){const e=this.htmlElement.style.display,n=this.htmlElement.style.visibility,t=this.htmlElement.style.position;"none"===e&&(this.htmlElement.style.display="block",this.htmlElement.style.visibility="hidden",this.htmlElement.style.position="absolute");const o=this.htmlElement.getBoundingClientRect(),i=window.innerWidth;return"none"===e&&(this.htmlElement.style.display=e,this.htmlElement.style.visibility=n,this.htmlElement.style.position=t),o.right>i||o.left<0}}class i extends o{constructor(){super({})}init(){const e=document.createElement("span");return e.innerText="No results",e.classList.add("empty-block-options"),e.style.padding="10px",e.style.color="rgba(55, 53, 47, 0.65)",e.style.display="none",e}}class r{head=null;tail=null;length=0;getFirst(){return this.head}getLast(){return this.tail}*[Symbol.iterator](){let e=this.head;if(e)do{yield e,e=e.nextNode}while(e&&e!==this.head)}forEach(e){let n=0;for(let t of this)e(t.value,n,this),n++}any(e){let n=this.head;for(;n;){if(e(n.value))return!0;if(n=n.nextNode,n===this.head)break}return!1}findFirst(e){if(!this.head)return null;let n=this.head;do{if(e(n.value))return n;n=n.nextNode}while(n&&n!==this.head);return null}findLast(e){if(!this.tail)return null;let n=this.tail;do{if(e(n.value))return n;n=n.previousNode}while(n&&n!==this.tail);return null}find(e){let n=this.head;for(;n;){if(n.value==e)return n;if(n=n.nextNode,n===this.head)break}return null}}class s{parentList;previousNode;nextNode;value;constructor(e,n){this.previousNode=null,this.nextNode=null,this.value=e,this.parentList=n}setNext(e){this.nextNode=e}setPrevious(e){this.previousNode=e}getNextSatisfying(e){let n=this.nextNode;const t=this;for(;n;){if(e(n.value))return n;if(n=n.nextNode,n===t)break}return null}getPreviousSatisfying(e){let n=this.previousNode;const t=this;for(;n&&n!==t;){if(e(n.value))return n;if(n=n.previousNode,n===this)break}return null}}class l extends r{constructor(){super()}append(e){const n=new s(e,this);this.head&&this.tail?(n.setPrevious(this.tail),n.setNext(this.head),this.tail.setNext(n),this.head.setPrevious(n),this.tail=n):(this.head=n,this.tail=n,this.head.setNext(this.tail),this.head.setPrevious(this.tail)),this.length++}}class a extends Error{constructor(e){super(`Service not found: ${e}`),this.name="ServiceNotFoundException"}}class c{static instance;services=new Map;constructor(){}static getInstance(){return c.instance||(c.instance=new c),c.instance}getInstanceOf(e){const n=this.services.get(e);if(!n)throw new a(e);return n}registerService(e,n){this.services.set(e,n)}registerServices(e){e.forEach(((e,n)=>{this.registerService(n,e)}))}reset(){this.services.clear()}}class d extends o{static id="quickMenu";blockOperationsService;currentFocusedMenuItem;htmlFocusedElementBeforeOpenQuickMenu;menuSections;quickMenuEmpty;filterInput;static instance;constructor(){super({}),this.blockOperationsService=c.getInstance().getInstanceOf("IBlockOperationsService"),this.currentFocusedMenuItem=null,this.htmlFocusedElementBeforeOpenQuickMenu=null,this.menuSections=new l,this.quickMenuEmpty=new i;let e=this.htmlElement.querySelector(".block-options");this.quickMenuEmpty.documentAppendTo(e),this.attachEvents(),this.filterInput=""}init(){const e=document.createElement("div");e.id=d.id,e.classList.add("block-options-wrapper","soft-box-shadow"),e.style.display="none";const n=document.createElement("div");return n.classList.add("block-options"),n.style.position="relative",e.appendChild(n),e}append(e){this.menuSections.append(e),this.htmlElement.querySelector(".block-options").appendChild(e.htmlElement)}static getInstance(){return d.instance||(d.instance=new d),d.instance}switchVisualFocus(e){this.currentFocusedMenuItem!=e&&(this.currentFocusedMenuItem&&this.currentFocusedMenuItem.value.removeFocus(),this.currentFocusedMenuItem=e,this.currentFocusedMenuItem.value.focus(),this.htmlFocusedElementBeforeOpenQuickMenu?.focus())}focusOnTheFirstVisibleItem(){const e=this.menuSections.getFirst();let n=e;for(;n;){const t=n.value.menuItems.findFirst((e=>e.isVisible));if(t)return void this.switchVisualFocus(t);if(n=n.nextNode,n==e)return}}focusPreviousVisibleItem(){let e;if(this.currentFocusedMenuItem){if(e=this.currentFocusedMenuItem.getPreviousSatisfying((e=>e.isVisible)),!e){let n=this.menuSections.find(this.currentFocusedMenuItem.value.quickMenuSectionInstance).getPreviousSatisfying((e=>e.isVisible));if(!n)return;e=n.value.menuItems.findLast((e=>e.isVisible))}}else{let n=this.menuSections.findLast((e=>e.isVisible));if(!n)return;e=n.value.menuItems.findLast((e=>e.isVisible))}this.switchVisualFocus(e)}focusNextVisibleItem(){let e;if(this.currentFocusedMenuItem){if(e=this.currentFocusedMenuItem.getNextSatisfying((e=>e.isVisible)),!e){let n=this.menuSections.find(this.currentFocusedMenuItem.value.quickMenuSectionInstance).getNextSatisfying((e=>e.isVisible));if(!n)return;e=n.value.menuItems.findFirst((e=>e.isVisible))}}else{let n=this.menuSections.findFirst((e=>e.isVisible));if(!n)return;e=n.value.menuItems.findFirst((e=>e.isVisible))}this.switchVisualFocus(e)}filterItems(){this.menuSections.forEach((e=>{e.filterSection(this.filterInput)})),this.menuSections.any((e=>e.isVisible))?this.quickMenuEmpty.hide():this.quickMenuEmpty.show(),this.focusOnTheFirstVisibleItem()}show(){setTimeout((()=>{if(this.htmlFocusedElementBeforeOpenQuickMenu=document.activeElement,!this.htmlFocusedElementBeforeOpenQuickMenu)throw new Error("Failed to capture the focused element before displaying the QuickMenu. Ensure an element is focused.");const e=window.getSelection();if(!e||0===e.rangeCount)throw new Error("Nenhuma seleção encontrada");const n=e.getRangeAt(0).getBoundingClientRect();this.htmlElement.style.display="flex";const t=this.htmlElement.offsetWidth;let o=n.left+window.scrollX;o+t>window.innerWidth&&(o=window.innerWidth-t-20);const i=this.htmlElement.offsetHeight;let r=n.top+window.scrollY-i-10;r<0&&(r=n.bottom+window.scrollY+10),this.htmlElement.style.left=`${o}px`,this.htmlElement.style.top=`${r}px`,super.show(),this.focusOnTheFirstVisibleItem(),this.htmlFocusedElementBeforeOpenQuickMenu.focus()}),10)}restore(){this.filterInput="",this.menuSections.forEach((e=>{e.restore()}))}hide(){this.restore(),this.htmlFocusedElementBeforeOpenQuickMenu?.focus(),super.hide()}attachEvents(){document.addEventListener("keydown",(e=>{if(this.isVisible||"/"!==e.key||e.ctrlKey||e.shiftKey||e.altKey)if(!this.isVisible||"ArrowLeft"!==e.key||e.ctrlKey||e.shiftKey||e.altKey)if(!this.isVisible||"ArrowRight"!==e.key||e.ctrlKey||e.shiftKey||e.altKey)if(!this.isVisible||"ArrowDown"!==e.key||e.ctrlKey||e.shiftKey||e.altKey)if(!this.isVisible||"ArrowUp"!==e.key||e.ctrlKey||e.shiftKey||e.altKey)if(!this.isVisible||!/^[a-z0-9 ]$/i.test(e.key)||e.ctrlKey||e.shiftKey||e.altKey)if(this.isVisible&&"Backspace"===e.key)""==this.filterInput?this.hide():(this.removeLastFilterInputCharacter(),this.filterItems());else if(!this.isVisible||"Escape"!==e.key||e.ctrlKey||e.shiftKey||e.altKey){if("Enter"===e.key&&this.isVisible&&!e.ctrlKey&&!e.shiftKey&&!e.altKey){e.preventDefault(),e.stopPropagation();let n=this.currentFocusedMenuItem.value.htmlElement.getAttribute("data-type");n&&this.transformHtmlFocusedElementBeforeOpenQuickMenu(n)}}else this.hide();else this.concatFilterInput(e.key),this.filterItems();else e.preventDefault(),this.focusPreviousVisibleItem();else e.preventDefault(),this.focusNextVisibleItem();else e.preventDefault(),e.stopPropagation();else e.preventDefault(),e.stopPropagation();else this.show()})),document.addEventListener("click",(e=>{this.isVisible&&!e.target.closest(`#${this.htmlElement.id}`)&&this.hide()})),document.addEventListener("keydown",(e=>{if("Enter"===e.key&&this.isVisible){e.preventDefault(),e.stopPropagation();const n=this.currentFocusedMenuItem?.value.blockType;n&&this.transformHtmlFocusedElementBeforeOpenQuickMenu(n)}}))}transformHtmlFocusedElementBeforeOpenQuickMenu(e){let n=this.htmlFocusedElementBeforeOpenQuickMenu?.closest(".block");n&&e&&this.blockOperationsService.formatBlock(n,e),this.hide()}concatFilterInput(e){this.filterInput+=e.toLowerCase()}removeLastFilterInputCharacter(){this.filterInput.length>0&&(this.filterInput=this.filterInput.slice(0,-1))}}class A extends r{constructor(){super()}append(e){const n=new s(e,this);this.head&&this.tail?(this.tail.setNext(n),n.setPrevious(this.tail),this.tail=n):(this.head=n,this.tail=n),this.length++}}class u extends o{quickMenuInstance;menuItems=new A;constructor(e){super({title:e.title,classList:e.classList}),this.quickMenuInstance=e.quickMenuInstance}init(){const e=document.createElement("section");e.classList.add(this.props.classList);const n=document.createElement("h2");return n.textContent=this.props.title,e.appendChild(n),e}appendQuickMenuItems(e){e.forEach((e=>{this.appendQuickMenuItem(e)}))}appendQuickMenuItem(e){this.menuItems.append(e),this.htmlElement.appendChild(e.htmlElement)}filterSection(e){this.restore(),""!==e&&(this.menuItems.forEach((n=>{n.filterValue.toLocaleLowerCase().includes(e)||n.hide()})),this.menuItems.any((n=>n.filterValue.toLocaleLowerCase().includes(e)))||this.hide())}restore(){this.show(),this.menuItems.forEach((e=>{e.show()}))}}class p extends o{useElement;constructor(e,n="1rem",t="1rem"){super({hrefUseId:e,width:n,height:t}),this.useElement=this.htmlElement.querySelector("use")}init(){const e=document.createElementNS("http://www.w3.org/2000/svg","svg");e.style.color="rgba(55, 53, 47, 0.85)";let n=document.createElementNS("http://www.w3.org/2000/svg","use");return n.setAttributeNS("http://www.w3.org/1999/xlink","href",`#${this.props.hrefUseId}`),e.appendChild(n),e.setAttribute("width",this.props.width),e.setAttribute("height",this.props.height),e.setAttribute("fill","currentColor"),e}clone(){return new p(this.props.hrefUseId,this.props.width,this.props.height)}setUseTo(e){this.useElement.setAttributeNS("http://www.w3.org/1999/xlink","href",`#${e}`)}}class m extends o{blockType;title;filterValue;description;quickMenuSectionInstance;constructor(e,n,t,o,i,r){super({title:n,description:t,SVGHrefUseId:o}),this.blockType=i,this.title=n,this.description=t,this.filterValue=r,this.quickMenuSectionInstance=e,this.blockType=i,this.attachEvents()}init(){const e=document.createElement("div");e.classList.add("option","option-hover","block-operation"),e.setAttribute("data-block-operation","apply-selected-block-type"),e.setAttribute("tabindex","0"),e.setAttribute("role","option");const n=document.createElement("div");n.classList.add("option-image");const t=new p(this.props.SVGHrefUseId,"100%","100%");n.appendChild(t.htmlElement),e.appendChild(n);const o=document.createElement("div");o.classList.add("option-text");const i=document.createElement("p");i.classList.add("block-title"),i.innerText=this.props.title,o.appendChild(i);const r=document.createElement("p");return r.classList.add("block-description"),r.innerText=this.props.description,o.appendChild(r),e.appendChild(o),e}get display(){return"flex"}focus(){this.htmlElement.classList.add("option-focused"),this.htmlElement.focus()}removeFocus(){this.htmlElement.classList.remove("option-focused")}attachEvents(){this.htmlElement.addEventListener("mousemove",(()=>{const e=this.quickMenuSectionInstance.menuItems.find(this);this.quickMenuSectionInstance.quickMenuInstance.switchVisualFocus(e)})),this.htmlElement.addEventListener("click",(e=>{e.preventDefault(),e.stopPropagation(),this.quickMenuSectionInstance.quickMenuInstance.transformHtmlFocusedElementBeforeOpenQuickMenu(this.blockType)}))}}class h{static build(){const n=d.getInstance(),t=new u({quickMenuInstance:n,title:"Basic blocks",classList:"basic-section"});t.appendQuickMenuItems([new m(t,"Text","Start writing in plain text.","icon-material-format",e.ELEMENT_TYPES.PARAGRAPH,"paragraph text p"),new m(t,"Image","Upload image.","icon-material-aperture","image","image figure photo illustration picture "),new m(t,"Bulleted list","Organize items with bullet points.","icon-wordpress-bulleted-list","bulleted-list","bulleted list unordered list ul"),new m(t,"Numbered list","List items in a numbered format.","icon-wordpress-numbered-list","numbered-list","numbered list number list sequential list ol enumerated list ordered list"),new m(t,"Code","Include code snippet.","icon-wordpress-code-mark","code","code script source markup"),new m(t,"Quote","Highlight text as a quote.","icon-wordpress-quote","quote","quote blockquote citation quotation"),new m(t,"Heading 2","Medium header for sections.","icon-julia-head-2",e.ELEMENT_TYPES.HEADER_2,"header 2 heading 2 h2"),new m(t,"Heading 3","Small header for subsections.","icon-julia-head-2",e.ELEMENT_TYPES.HEADER_3,"header 3 heading 3 h3"),new m(t,"Separator","Visually divide blocks.","icon-wordpress-separator","separator","separator divider rule line")]),n.append(t);const o=new u({quickMenuInstance:n,title:"Heading",classList:"heading-section"});o.appendQuickMenuItems([new m(o,"Heading 1","Large header for main topics.","icon-julia-head-1",e.ELEMENT_TYPES.HEADER_1,"header 1 heading 1 h1"),new m(o,"Heading 2","Medium header for sections.","icon-julia-head-2",e.ELEMENT_TYPES.HEADER_2,"header 2 heading 2 h2"),new m(o,"Heading 3","Small header for subsections.","icon-julia-head-3",e.ELEMENT_TYPES.HEADER_3,"header 3 heading 3 h3"),new m(o,"Heading 4","Detailed header for subtopics.","icon-julia-head-4",e.ELEMENT_TYPES.HEADER_4,"header 4 heading 4 h4"),new m(o,"Heading 5","Minor header for specifics.","icon-julia-head-5",e.ELEMENT_TYPES.HEADER_5,"header 5 heading 5 h5"),new m(o,"Heading 6","Smallest header for fine details.","icon-julia-head-6",e.ELEMENT_TYPES.HEADER_6,"header 6 heading 6 h6")]),n.append(o);const i=new u({quickMenuInstance:n,title:"List",classList:"list-section"});return i.appendQuickMenuItems([new m(i,"Todo list","Track tasks with checkboxes.","icon-material-check-list-2","todo-list","todo list task list checklist"),new m(i,"Bulleted list","Organize items with bullet points.","icon-wordpress-bulleted-list","bulleted-list","bulleted list unordered list ul"),new m(i,"Numbered list","List items in a numbered format.","icon-wordpress-numbered-list","numbered-list","numbered list number list sequential list ol enumerated list ordered list")]),n.append(i),n}}class E extends o{dropdownButton;dropdownList;constructor(e,n){super({}),this.dropdownButton=e,this.dropdownList=n,e.documentAppendTo(this.htmlElement),n.documentAppendTo(this.htmlElement)}init(){const e=document.createElement("div");return e.classList.add("select-wrapper"),e}}class C{static instance;constructor(){if(C.instance)throw new Error}static getInstance(){return this.instance||(this.instance=new C),this.instance}execCommand(e,n,t){if(e==C.QUERY_TEXT_OPERATIONS.INLINE_CODE)return this.toggleCodeExecCommand(),!0;let o=t||void 0;if("initial"==o&&(o=this.getInitialColorAsHex()),e==C.QUERY_TEXT_OPERATIONS.CREATE_LINK){const e=C.getSelectedHTMLElement();if(e?.closest("a"))return document.execCommand("unlink",!1,o);if(n){const e=new CustomEvent("showInputLinkBoxRequested",{bubbles:!0,cancelable:!0});return document.dispatchEvent(e),!0}}if(e==C.QUERY_TEXT_OPERATIONS.HILITE_COLOR||e==C.QUERY_TEXT_OPERATIONS.FORE_COLOR){document.execCommand(e,!1,o);const n=new CustomEvent("colorChange",{bubbles:!0,cancelable:!0});document.dispatchEvent(n)}return document.execCommand(e,!1,o)}static QUERY_TEXT_OPERATIONS={HILITE_COLOR:"hiliteColor",FORE_COLOR:"foreColor",INLINE_CODE:"inlineCode",CREATE_LINK:"createLink",UNDERLINE:"underline"};queryCommandState(e,n){return e===C.QUERY_TEXT_OPERATIONS.CREATE_LINK?!!C.getSelectedHTMLElement()?.closest("a"):(e!==C.QUERY_TEXT_OPERATIONS.UNDERLINE||!C.getSelectedHTMLElement()?.closest("a"))&&(e===C.QUERY_TEXT_OPERATIONS.HILITE_COLOR?this.queryHiliteColor(n):e===C.QUERY_TEXT_OPERATIONS.FORE_COLOR?this.queryForeColor(n):document.queryCommandState(e))}toggleCodeExecCommand(){const e=window.getSelection();if(!e||0===e.rangeCount)return;const n=e.getRangeAt(0);let t=n.commonAncestorContainer;for(;t&&"CODE"!==t.nodeName;)t=t.parentNode;if(t&&"CODE"===t.nodeName){const e=t,o=document.createRange();if(o.selectNodeContents(e),n.toString()===o.toString()){const n=e.parentNode;for(;n&&e.firstChild;)n.insertBefore(e.firstChild,e);n?.removeChild(e)}else{const e=n.toString();document.execCommand("insertHTML",!1,e)}document.getSelection()?.removeAllRanges()}else{const e=(new XMLSerializer).serializeToString(n.cloneContents());document.execCommand("insertHTML",!1,`${e}`)}}queryForeColor(e){const n=window.getSelection();if(!n)return!1;if(!n.rangeCount)return!1;let t=n.getRangeAt(0).commonAncestorContainer;t.nodeType===Node.TEXT_NODE&&(t=t.parentNode);const o=t.closest("font[color]");if(!o)return!1;const i=window.getComputedStyle(o).color;return this.rgbToHex(i).toUpperCase()===e.toUpperCase()}queryHiliteColor(e){const n=window.getSelection();if(!n)return!1;if(!n.rangeCount)return!1;let t=n.getRangeAt(0).commonAncestorContainer;t.nodeType===Node.TEXT_NODE&&(t=t.parentNode);const o=t.closest("span[style*='background-color']")||t.closest("font[style*='background-color']");if(!o)return!1;const i=window.getComputedStyle(o).backgroundColor;return this.rgbToHex(i).toUpperCase()===e.toUpperCase()}rgbToHex(e){return"#"+e.match(/\d+/g).map(Number).map((e=>{const n=e.toString(16);return 1===n.length?"0"+n:n})).join("")}getInitialColorAsHex(){const e=document.createElement("div");document.body.appendChild(e),e.style.color="initial";const n=window.getComputedStyle(e).color;return document.body.removeChild(e),this.rgbToHex(n)}getTargetElementMap(e){switch(e){case"strong":case"bold":case"b":return"strong";case"italic":case"i":case"em":return"em";case"underline":case"u":return"u";case"strikethrough":case"s":return"s";case"background":case"color":return"span";default:throw new Error}}static getSelectedHTMLElement(){const e=window.getSelection();if(e&&e.rangeCount>0){let n=e.getRangeAt(0).commonAncestorContainer;for(n.nodeType===Node.TEXT_NODE&&(n=n.parentNode);n&&!(n instanceof HTMLElement);)n=n.parentNode;if(n)return n}return null}getSelectedTextNodes(){const e=window.getSelection();if(!e||0===e.rangeCount)return[];const n=[];for(let t=0;to.intersectsNode(e)?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_REJECT});let r;for(;r=i.nextNode();)if(r.nodeType===Node.TEXT_NODE){const e=document.createRange();e.selectNodeContents(r),-1===o.compareBoundaryPoints(Range.END_TO_START,e)&&1===o.compareBoundaryPoints(Range.START_TO_END,e)&&n.push(r)}}return n}findClosestMatchingParent(e,n){for(e&&e.nodeType===Node.TEXT_NODE&&(e=e.parentElement);e&&e!==document.body;){if(e.nodeType===Node.ELEMENT_NODE){const t=e;if(t.tagName.toLowerCase()===n.nodeType.toLowerCase()&&(!n.classes||n.classes.every((e=>t.classList.contains(e)))))return t}e=e.parentElement}return null}extractSelectedText(e){const n=window.getSelection();if(!n||0===n.rangeCount)return"";const t=n.getRangeAt(0);if(e.nodeType!==Node.TEXT_NODE)return"";const o=e.textContent||"";let i=0,r=o.length;return t.intersectsNode(e)?(t.startContainer===e?i=t.startOffset:t.startContainer.contains(e)&&(i=0),t.endContainer===e?r=t.endOffset:t.endContainer.contains(e)&&(r=o.length),i{if("Enter"==e.key&&this.isVisible){e.preventDefault(),e.stopPropagation();const n=this.htmlElement.value;setTimeout((()=>{C.getInstance().execCommand(C.QUERY_TEXT_OPERATIONS.CREATE_LINK,!1,n)}),10),this.htmlElement.value="",this.parentWrapper?.hide()}"Escape"==e.key&&this.isVisible&&(this.htmlElement.value="",this.parentWrapper?.hide())})),document.addEventListener("click",(e=>{!this.canHide||e.target.closest(`#${this.htmlElement.id}`)||e.target.closest("#floatingToolbar")||this.parentWrapper?.hide()})),this.htmlElement.addEventListener("keydown",(e=>{"/"==e.key&&e.stopPropagation()}))}}class b extends o{inputLinkBox;range;highlights=[];constructor(){const e=new g;super({inputLinkBox:e}),this.inputLinkBox=e,this.attachEvent(),e.setParentWrapper(this)}init(){const e=document.createElement("div");return e.id="linkBox",e.style.display="none",e.classList.add("dependent-box"),e.style.position="absolute",e.appendChild(this.props.inputLinkBox.htmlElement),e}attachEvent(){document.addEventListener("showInputLinkBoxRequested",(()=>{this.show(),this.highlightSelectedText(),this.inputLinkBox.focus()}))}hide(){super.hide(),this.removeHighlights(),setTimeout((()=>{const e=new CustomEvent("showInputLinkBoxFinished",{bubbles:!0,cancelable:!0});document.dispatchEvent(e)}),0)}highlightSelectedText(){const e=window.getSelection();if(!e?.rangeCount)return;const n=e.getRangeAt(0).getClientRects();for(let e=0;e{document.body.removeChild(e)})),this.highlights=[]}}class f{static isSelectedTextDescendantOf(e){const n=document.getSelection();if(!n)return!1;if(!n.rangeCount)return!1;let t=n.getRangeAt(0).startContainer;return t.nodeType===Node.TEXT_NODE&&(t=t.parentNode),!!t&&null!==t.closest(e)}}class B extends o{dropdowns;currentSelectionRange;inputLinkBoxWrapper;constructor(){const e=new b;super({inputLinkBoxWrapper:e}),this.inputLinkBoxWrapper=e,this.attachEvents(),this.dropdowns=[],this.currentSelectionRange=null}init(){const e=document.createElement("div");e.id="floatingToolbar",e.style.display="none",e.classList.add("soft-box-shadow");const n=document.createElement("div");n.classList.add("select-wrapper"),e.appendChild(n);const t=document.getElementById("johannesEditor");return t?.appendChild(this.props.inputLinkBoxWrapper.htmlElement),e}get display(){return"flex"}show(){requestAnimationFrame((()=>{const e=window.getSelection();if(!e||0===e.rangeCount)throw new Error("Nenhuma seleção encontrada");this.currentSelectionRange=e.getRangeAt(0);const n=e.getRangeAt(0).getBoundingClientRect();this.htmlElement.style.display="flex";const t=this.htmlElement.offsetWidth;let o=n.left+window.scrollX-50;o+t>window.innerWidth&&(o=window.innerWidth-t-20);const i=this.htmlElement.offsetHeight;let r=n.top+window.scrollY-i-10;r<0&&(r=n.bottom+window.scrollY+10),this.htmlElement.style.left=`${o}px`,this.htmlElement.style.top=`${r}px`,super.show()}))}hide(){this.currentSelectionRange=null,super.hide()}appendDropdown(e){this.dropdowns.push(e),this.htmlElement.appendChild(e.htmlElement)}appendSeparator(e){this.htmlElement.appendChild(e.htmlElement)}appendTextToolbar(e){this.htmlElement.appendChild(e.htmlElement)}anyDropdownVisible(){for(const e of this.dropdowns)if(e.dropdownList.isVisible)return!0;return!1}hideAllDropdownVisible(){for(const e of this.dropdowns)e.dropdownList.canHide&&e.dropdownList.hide();return!1}attachEvents(){document.addEventListener("showInputLinkBoxRequested",(()=>{this.canHide=!1})),document.addEventListener("showInputLinkBoxFinished",(()=>{this.canHide=!0,this.restoreRangeSelection()})),document.addEventListener("keydown",(e=>{this.canHide&&"Escape"===e.key&&(this.anyDropdownVisible()?this.hideAllDropdownVisible():this.hide()),!this.canHide||"ArrowLeft"!==e.key&&"ArrowRight"!==e.key&&"ArrowUp"!==e.key&&"ArrowDown"!==e.key||this.isSelectionEmpty()&&this.hide()})),document.addEventListener("keyup",(e=>{if(("Shift"===e.key||"Control"===e.key)&&""!==window.getSelection().toString().trim()){if(f.isSelectedTextDescendantOf(".title"))return;e.preventDefault(),e.stopPropagation(),this.show()}})),document.addEventListener("click",(e=>{!this.canHide||e.target.closest(`#${this.htmlElement.id}`)||this.anyDropdownVisible()?!this.isVisible||e.target.closest(`#${this.htmlElement.id}`)||this.inputLinkBoxWrapper.isVisible||this.restoreRangeSelection():this.hide()})),document.addEventListener("mouseup",(e=>{this.isVisible||requestAnimationFrame((()=>{if(""!==window.getSelection().toString().trim()){if(f.isSelectedTextDescendantOf(".title"))return;e.preventDefault(),e.stopPropagation(),this.show()}}))})),document.addEventListener("selectedBlockDeleted",(e=>{this.canHide&&this.hide()})),document.addEventListener("requestHideFloatingToolbar",(()=>{this.canHide&&(this.anyDropdownVisible()&&this.hideAllDropdownVisible(),this.hide())}))}isSelectionEmpty(){const e=document.getSelection();return!e||0===e.rangeCount||""===e.toString().trim()}restoreRangeSelection(){document.getSelection()?.removeAllRanges(),document.getSelection()?.addRange(this.currentSelectionRange)}}class I extends o{textOperationService;command;value;activeIcon;parentDropdownMenuList;constructor(e,n,t,o,i,r,s,l=null){const a=new p("icon-material-small-check");a.htmlElement.style.visibility="hidden",i&&(r.style.color=i),super({id:e,leftIcon:r,title:s,icon:a,shortcut:l}),this.command=o,this.value=i,this.textOperationService=t,this.parentDropdownMenuList=n,this.activeIcon=a,this.attachEvent()}focus(){this.htmlElement.classList.add("option-focused")}removeFocus(){this.htmlElement.classList.remove("option-focused")}init(){const e=document.createElement("li");e.id=this.props.id,e.classList.add("option","option-hover","block-operation"),e.tabIndex=2,e.style.color="#37352F";const n=document.createElement("div");n.classList.add("text-option"),n.appendChild(this.props.leftIcon);const t=document.createElement("span");if(t.innerText=this.props.title,n.appendChild(t),e.appendChild(n),e.appendChild(this.props.icon.htmlElement),this.props.shortcut){const n=document.createElement("span");n.innerText=this.props.shortcut,n.style.color="rgba(55, 53, 47, 0.5)",e.appendChild(n)}return e}performAction(){this.textOperationService.execCommand(this.command,!1,this.value),requestAnimationFrame((()=>{const e=window.getSelection();if(!e||0===e.rangeCount)return;let n=e.getRangeAt(0).commonAncestorContainer;n?.nodeType===Node.TEXT_NODE&&(n=n.parentNode);const t=n.closest(".focusable");t&&this.normalizeAndMergeElements(t)}))}attachEvent(){this.htmlElement.addEventListener("mousemove",(()=>{const e=this.parentDropdownMenuList.dropdownItems.find(this);this.parentDropdownMenuList.switchVisualFocus(e)})),this.htmlElement.addEventListener("click",(()=>{this.performAction()})),document.addEventListener("selectionchange",(()=>{this.command!=C.QUERY_TEXT_OPERATIONS.HILITE_COLOR&&this.command!=C.QUERY_TEXT_OPERATIONS.FORE_COLOR||this.changeCheckIconVisibility()})),document.addEventListener("colorChange",(()=>{this.command!=C.QUERY_TEXT_OPERATIONS.HILITE_COLOR&&this.command!=C.QUERY_TEXT_OPERATIONS.FORE_COLOR||this.changeCheckIconVisibility()}))}normalizeAndMergeElements(e){if(!e)return;let n=e.firstChild;for(;n;){n.nodeType===Node.ELEMENT_NODE&&this.normalizeAndMergeElements(n);let e=n.nextSibling;for(;e&&this.shouldMerge(n,e);){n.innerHTML+=e.innerHTML;const t=e.nextSibling;e.parentNode.removeChild(e),e=t}n=n.nextSibling}e.normalize()}shouldMerge(e,n){if(e?.nodeType!==Node.ELEMENT_NODE||n?.nodeType!==Node.ELEMENT_NODE)return!1;const t=e,o=n;return t.tagName===o.tagName&&t.style.cssText===o.style.cssText&&window.getComputedStyle(t).color===window.getComputedStyle(o).color}changeCheckIconVisibility(){requestAnimationFrame((()=>{this.textOperationService.queryCommandState(this.command,this.value)?this.activeIcon?.changeVisibilityToVisible():this.activeIcon?.changeVisibilityToHidden()}))}}class y extends o{parentDropdownParentButton;dropdownItems;currentFocusedMenuItem;constructor(e){super({id:e}),this.dropdownItems=new l,this.currentFocusedMenuItem=null,this.attachEvents()}get display(){return"flex"}init(){const e=document.createElement("ul");return e.id=this.props.id,e.setAttribute("name","block-type"),e.style.display="none",e.classList.add("soft-box-shadow","dependent-box","checkable-items"),e.style.position="absolute",e.style.maxHeight="25vmax",e.style.overflowY="auto",e}append(e){this.dropdownItems.append(e),this.htmlElement.appendChild(e.htmlElement)}setParentDropdownMenuButton(e){this.parentDropdownParentButton=e}attachEvents(){document.addEventListener("keydown",(e=>{this.isVisible&&this.currentFocusedMenuItem&&"Enter"===e.key&&this.currentFocusedMenuItem.value.performAction()})),document.addEventListener("click",(e=>{this.clickedOutsideTheDropdownWhileDropdownIsVisible(e)&&this.hide()})),document.addEventListener("keydown",(e=>{this.keyPressedOutsideTheDropdownWhileDropdownIsVisible(e)&&("ArrowDown"==e.key&&(e.preventDefault(),this.focusNextVisibleItem()),"ArrowUp"==e.key&&(e.preventDefault(),this.focusPreviousVisibleItem()))}))}show(){this.htmlElement.style.left="0",this.htmlElement.style.right="auto",this.doesElementOverflowScreen&&(this.htmlElement.style.left="auto",this.htmlElement.style.right="0"),this.parentDropdownParentButton?.svgIcon?.setUseTo("icon-wordpress-chevron-up"),super.show()}hide(){this.parentDropdownParentButton?.svgIcon?.setUseTo("icon-wordpress-chevron-down"),this.currentFocusedMenuItem?.value.removeFocus(),this.currentFocusedMenuItem=null,super.hide()}switchVisualFocus(e){this.currentFocusedMenuItem!=e&&(this.currentFocusedMenuItem&&this.currentFocusedMenuItem.value.removeFocus(),this.currentFocusedMenuItem=e,this.currentFocusedMenuItem.value.focus())}focusNextVisibleItem(){let e;e=this.currentFocusedMenuItem?this.currentFocusedMenuItem.getNextSatisfying((e=>e instanceof I)):this.dropdownItems.findFirst((e=>e instanceof I)),this.switchVisualFocus(e)}focusPreviousVisibleItem(){let e;e=this.currentFocusedMenuItem?this.currentFocusedMenuItem.getPreviousSatisfying((e=>e instanceof I)):this.dropdownItems.findFirst((e=>e instanceof I)),this.switchVisualFocus(e)}clickedOutsideTheDropdownWhileDropdownIsVisible(e){return this.canHide&&!e.target.closest(`#${this.htmlElement.id}`)}keyPressedOutsideTheDropdownWhileDropdownIsVisible(e){return this.canHide&&!e.target.closest(`#${this.htmlElement.id}`)}}class w extends o{constructor(){super({})}init(){const e=document.createElement("div");return e.style.height="24px",e.style.width="1px",e.style.borderRight="1px solid #d0d0d0",e.style.margin="auto 6px",e}}class T extends o{constructor(){super({})}init(){const e=document.createElement("div");return e.classList.add("item"),e.style.marginLeft="10px",e.style.marginRight="10px",e}}class k extends o{commandService;command;showUI;icon;constructor(e,n,t,o){const i=new p(o,"1.25rem","1.25rem");super({title:t,icon:i}),this.commandService=e,this.command=n,this.showUI=n==C.QUERY_TEXT_OPERATIONS.CREATE_LINK,this.icon=i,this.attachEvents()}init(){const e=document.createElement("button");return e.role="button",e.classList.add("entry","button-reset","text-formatting-operation","option-hover"),e.title=this.props.title,e.tabIndex=1,e.appendChild(this.props.icon.htmlElement),e}attachEvents(){this.htmlElement.addEventListener("click",(e=>{const n=this.getParentEditable();this.commandService.execCommand(this.command,this.showUI),this.changeIconColor(),setTimeout((()=>{n?.normalize()}),10)})),document.addEventListener("selectionchange",(e=>{const n=window.getSelection();n?.isCollapsed||this.changeIconColor()}))}getParentEditable(){let e=window.getSelection().getRangeAt(0).commonAncestorContainer;return 3===e.nodeType&&(e=e.parentNode),e.closest(".editable")}changeIconColor(){this.commandService.queryCommandState(this.command)?this.icon.changeColor("#2382e2"):this.icon.changeColor("rgba(55, 53, 47, 0.85)")}}class v extends o{constructor(e){super({color:e})}init(){const e=document.createElement("div");return e.style.width="1.25rem",e.style.height="1.25rem",e.style.borderRadius="50%",e.style.backgroundColor=this.props.color,e.style.border="1px solid #d0d0d0",e.style.boxSizing="border-box",e}}class x extends o{dropdownList;svgIcon;constructor(e,n,t,o=!0){const i=new p("icon-wordpress-chevron-down");super({id:e,title:n,dropdownList:t,svgIcon:o?i:null}),this.dropdownList=t,this.svgIcon=i,this.attachEvents(),t.setParentDropdownMenuButton(this)}init(){const e=document.createElement("button");if(e.id=this.props.id,e.role="button",e.classList.add("button-reset","text-formatting-select-button","text-formatting-operation","option-hover"),e.tabIndex=1,e.style.position="relative",e.setAttribute("aria-controls",this.props.dropdownList.htmlElement.id),"string"==typeof this.props.title){const n=document.createElement("span");n.textContent=this.props.title,e.appendChild(n)}else e.appendChild(this.props.title);return this.props.svgIcon&&e.appendChild(this.props.svgIcon.htmlElement),e}attachEvents(){this.htmlElement.addEventListener("click",(()=>{this.dropdownList.isVisible||this.dropdownList.show()}))}}class O extends o{parentDropdownMenuList;constructor(e,n){super({title:n}),this.parentDropdownMenuList=e}performAction(){throw new Error("Method not implemented.")}removeFocus(){throw new Error("Method not implemented.")}focus(){throw new Error("Method not implemented.")}init(){const e=document.createElement("li"),n=document.createElement("h3");return n.innerText=this.props.title,e.appendChild(n),e}}class L{static build(){const e=new B;return e.appendDropdown(L.turnIntoDropdown()),e.appendSeparator(L.separator()),e.appendSeparator(L.groupButton()),e.appendDropdown(L.colorDropdown()),e.appendSeparator(L.separator()),e.appendDropdown(L.moreOptionsDropdown()),e}static turnIntoDropdown(){const t=new y("turnIntoSelect"),o=new x("turnIntoButton","Text",t),i=new E(o,t);return t.append(new O(t,"Turn into")),t.append(new I("turnIntoOptionText",t,n.getInstance(),n.BLOCK_OPERATIONS.TRANSFORM_BLOCK,e.ELEMENT_TYPES.PARAGRAPH,S.paragraph.htmlElement,"Text","Ctrl+Shift+Enter")),t.append(new I("turnIntoOptionTodoList",t,n.getInstance(),n.BLOCK_OPERATIONS.TRANSFORM_BLOCK,e.ELEMENT_TYPES.CHECK_LIST,S.todo_list.htmlElement,"Todo list","Ctrl+1")),t.append(new I("turnIntoOptionBulletedList",t,n.getInstance(),n.BLOCK_OPERATIONS.TRANSFORM_BLOCK,e.ELEMENT_TYPES.BULLETED_LIST,S.b_list.htmlElement,"Bulleted list","Ctrl+.")),t.append(new I("turnIntoOptionNumberedList",t,n.getInstance(),n.BLOCK_OPERATIONS.TRANSFORM_BLOCK,e.ELEMENT_TYPES.NUMBERED_LIST,S.n_list.htmlElement,"Numbered list","Ctrl+/")),t.append(new I("turnIntoOptionBlockCode",t,n.getInstance(),n.BLOCK_OPERATIONS.TRANSFORM_BLOCK,e.ELEMENT_TYPES.CODE,S.code.htmlElement,"Block code")),t.append(new I("turnIntoOptionQuote",t,n.getInstance(),n.BLOCK_OPERATIONS.TRANSFORM_BLOCK,e.ELEMENT_TYPES.QUOTE,S.quote.htmlElement,"Quote")),t.append(new I("turnIntoOptionHeading1",t,n.getInstance(),n.BLOCK_OPERATIONS.TRANSFORM_BLOCK,e.ELEMENT_TYPES.HEADER_1,S.head1.htmlElement,"Heading 1","Ctrl+Alt+1")),t.append(new I("turnIntoOptionHeading2",t,n.getInstance(),n.BLOCK_OPERATIONS.TRANSFORM_BLOCK,e.ELEMENT_TYPES.HEADER_2,S.head2.htmlElement,"Heading 2","Ctrl+Alt+2")),t.append(new I("turnIntoOptionHeading3",t,n.getInstance(),n.BLOCK_OPERATIONS.TRANSFORM_BLOCK,e.ELEMENT_TYPES.HEADER_3,S.head3.htmlElement,"Heading 3","Ctrl+Alt+3")),t.append(new I("turnIntoOptionHeading4",t,n.getInstance(),n.BLOCK_OPERATIONS.TRANSFORM_BLOCK,e.ELEMENT_TYPES.HEADER_4,S.head4.htmlElement,"Heading 4","Ctrl+Alt+4")),t.append(new I("turnIntoOptionHeading5",t,n.getInstance(),n.BLOCK_OPERATIONS.TRANSFORM_BLOCK,e.ELEMENT_TYPES.HEADER_5,S.head5.htmlElement,"Heading 5","Ctrl+Alt+5")),t.append(new I("turnIntoOptionHeading6",t,n.getInstance(),n.BLOCK_OPERATIONS.TRANSFORM_BLOCK,e.ELEMENT_TYPES.HEADER_6,S.head6.htmlElement,"Heading 6","Ctrl+Alt+6")),i}static separator(){return new w}static groupButton(){const e=new T;return new k(C.getInstance(),C.QUERY_TEXT_OPERATIONS.CREATE_LINK,"Link","icon-material-link").documentAppendTo(e.htmlElement),new k(C.getInstance(),"bold","Bold","icon-wordpress-bold").documentAppendTo(e.htmlElement),new k(C.getInstance(),"italic","Italic","icon-material-italic").documentAppendTo(e.htmlElement),new k(C.getInstance(),C.QUERY_TEXT_OPERATIONS.UNDERLINE,"Underline","icon-material-underline").documentAppendTo(e.htmlElement),new k(C.getInstance(),C.QUERY_TEXT_OPERATIONS.INLINE_CODE,"Code","icon-material-code-inline").documentAppendTo(e.htmlElement),new k(C.getInstance(),"strikeThrough","Strike-through","icon-wordpress-strike-through").documentAppendTo(e.htmlElement),e}static colorDropdown(){const e=new y("colorTextOptionSelect"),n=new x("colorTextButton",new v("#FAF4D1").htmlElement,e),t=new E(n,e);e.append(new O(e,"Background"));const o=C.getInstance();return e.append(new I("backgroundOptionRed",e,o,C.QUERY_TEXT_OPERATIONS.HILITE_COLOR,"#FDDEDE",new v("#FDDEDE").htmlElement,"Red")),e.append(new I("backgroundOptionGreen",e,o,C.QUERY_TEXT_OPERATIONS.HILITE_COLOR,"#D7F7DC",new v("#D7F7DC").htmlElement,"Green")),e.append(new I("backgroundOptionBlue",e,o,C.QUERY_TEXT_OPERATIONS.HILITE_COLOR,"#D9EDF6",new v("#D9EDF6").htmlElement,"Blue")),e.append(new I("backgroundOptionYellow",e,o,C.QUERY_TEXT_OPERATIONS.HILITE_COLOR,"#FAF4D1",new v("#FAF4D1").htmlElement,"Yellow")),e.append(new I("backgroundOptionGrey",e,o,C.QUERY_TEXT_OPERATIONS.HILITE_COLOR,"#E1E0E0",new v("#E1E0E0").htmlElement,"Grey")),e.append(new I("backgroundOptionNone",e,o,C.QUERY_TEXT_OPERATIONS.HILITE_COLOR,"transparent",new v("transparent").htmlElement,"None")),e.append(new O(e,"Color")),e.append(new I("colorOptionRed",e,o,C.QUERY_TEXT_OPERATIONS.FORE_COLOR,"#D44C47",new p("icon-material-format","1.25rem","1.25rem").htmlElement,"Red")),e.append(new I("colorOptionGreen",e,o,C.QUERY_TEXT_OPERATIONS.FORE_COLOR,"#448361",new p("icon-material-format","1.25rem","1.25rem").htmlElement,"Green")),e.append(new I("colorOptionBlue",e,o,C.QUERY_TEXT_OPERATIONS.FORE_COLOR,"#337EA9",new p("icon-material-format","1.25rem","1.25rem").htmlElement,"Blue")),e.append(new I("colorOptionYellow",e,o,C.QUERY_TEXT_OPERATIONS.FORE_COLOR,"#CB912F",new p("icon-material-format","1.25rem","1.25rem").htmlElement,"Yellow")),e.append(new I("colorOptionGrey",e,o,C.QUERY_TEXT_OPERATIONS.FORE_COLOR,"#787774",new p("icon-material-format","1.25rem","1.25rem").htmlElement,"Grey")),e.append(new I("colorOptionNone",e,o,C.QUERY_TEXT_OPERATIONS.FORE_COLOR,"initial",new p("icon-material-format","1.25rem","1.25rem").htmlElement,"None")),t}static moreOptionsDropdown(){const e=new p("icon-material-more","1.25rem","1.25rem"),t=new y("moreTextOptionSelect"),o=new x("moreTextOptionButton",e.htmlElement,t,!1),i=new E(o,t);return t.append(new O(t,"More options")),t.append(new I("copyOption",t,n.getInstance(),n.BLOCK_OPERATIONS.COPY,null,S.copy.htmlElement,"Copy","Ctrl+C")),t.append(new I("cutOption",t,n.getInstance(),n.BLOCK_OPERATIONS.CUT,null,S.cut.htmlElement,"Cut","Ctrl+X")),t.append(new I("pasteOption",t,n.getInstance(),n.BLOCK_OPERATIONS.PASTE,null,S.paste.htmlElement,"Replace","Ctrl+V")),t.append(new I("duplicateOption",t,n.getInstance(),n.BLOCK_OPERATIONS.DUPLICATE,null,S.duplicate.htmlElement,"Clone Block","Ctrl+D")),t.append(new I("resetOption",t,n.getInstance(),n.BLOCK_OPERATIONS.REMOVE_FORMAT,null,S.eraser.htmlElement,"Reset Style","Ctrl+\\")),t.append(new I("deleteOption",t,n.getInstance(),n.BLOCK_OPERATIONS.DELETE,null,S.delete.htmlElement,"Delete Block","Shift+Del")),i}}const S={paragraph:new p("icon-material-format","1.25rem","1.25rem"),todo_list:new p("icon-material-check-list-2","1.25rem","1.25rem"),b_list:new p("icon-wordpress-bulleted-list","1.25rem","1.25rem"),n_list:new p("icon-wordpress-numbered-list","1.25rem","1.25rem"),code:new p("icon-wordpress-code-mark","1.25rem","1.25rem"),quote:new p("icon-wordpress-quote","1.25rem","1.25rem"),head1:new p("icon-julia-head-1","1.25rem","1.25rem"),head2:new p("icon-julia-head-2","1.25rem","1.25rem"),head3:new p("icon-julia-head-3","1.25rem","1.25rem"),head4:new p("icon-julia-head-4","1.25rem","1.25rem"),head5:new p("icon-julia-head-5","1.25rem","1.25rem"),head6:new p("icon-julia-head-6","1.25rem","1.25rem"),duplicate:new p("icon-material-duplicate","1.25rem","1.25rem"),delete:new p("icon-material-trash","1.25rem","1.25rem"),eraser:new p("icon-material-clear","1.25rem","1.25rem"),copy:new p("icon-material-copy","1.25rem","1.25rem"),cut:new p("icon-material-cut","1.25rem","1.25rem"),paste:new p("icon-material-paste","1.25rem","1.25rem")};class N extends o{blockOperationsService;constructor(e){super({}),this.blockOperationsService=e,this.attachEvents()}init(){const e=document.createElement("button");e.title="Add a new block",e.classList.add("add-block","block-operation");const n=new p("icon-add-block","1.5rem","1.5rem");return e.appendChild(n.htmlElement),e}attachEvents(){this.htmlElement.addEventListener("click",(()=>{this.blockOperationsService.execCommand(n.BLOCK_OPERATIONS.CREATE_DEFAULT_BLOCK,!1)}))}}class _ extends o{constructor(e){super({blockOperationService:e})}init(){const e=document.createElement("div");e.classList.add("add-block-wrapper");const n=new N(this.props.blockOperationService);return e.appendChild(n.htmlElement),e}}class R extends o{blockOperationsService;constructor(e,n){super({elementFactoryService:e,blockOperationsService:n}),this.blockOperationsService=n,this.attachEvent()}init(){const n=document.createElement("div");n.classList.add("content"),window.editorConfig;{const t=this.props.elementFactoryService.create(e.ELEMENT_TYPES.BLOCK_PARAGRAPH);n.append(t)}return n}attachEvent(){document.addEventListener("copiedText",(()=>{const e=document.querySelector("#copyOption .text-option span");e&&(e.textContent="Copied!",setTimeout((()=>{e.textContent="Copy"}),1500))})),document.addEventListener("keydown",(t=>{console.log(`Key: ${t.key}, Code: ${t.code}, Ctrl: ${t.ctrlKey}, Alt: ${t.altKey}, AltGr: ${"AltGraph"===t.key}, NumLock: ${t.getModifierState("NumLock")}`);const o=t.code.startsWith("Numpad"),i=t.getModifierState("NumLock");(t.ctrlKey||t.metaKey)&&t.shiftKey&&"Enter"===t.key?(t.preventDefault(),t.stopPropagation(),this.blockOperationsService.execCommand(n.BLOCK_OPERATIONS.TRANSFORM_BLOCK,!1,e.ELEMENT_TYPES.PARAGRAPH)):!t.ctrlKey&&!t.metaKey||t.shiftKey||"Digit1"!==t.code&&"Numpad1"!==t.code?!t.ctrlKey&&!t.metaKey||t.shiftKey||"."!==t.key?!t.ctrlKey&&!t.metaKey||t.shiftKey||"/"!==t.key?t.ctrlKey&&t.altKey&&("Digit1"===t.code||o&&i&&"Numpad1"===t.code)?(t.preventDefault(),t.stopPropagation(),this.blockOperationsService.execCommand(n.BLOCK_OPERATIONS.TRANSFORM_BLOCK,!1,e.ELEMENT_TYPES.HEADER_1)):t.ctrlKey&&t.altKey&&("Digit2"===t.code||o&&i&&"Numpad2"===t.code)?(t.preventDefault(),t.stopPropagation(),this.blockOperationsService.execCommand(n.BLOCK_OPERATIONS.TRANSFORM_BLOCK,!1,e.ELEMENT_TYPES.HEADER_2)):t.ctrlKey&&t.altKey&&("Digit3"===t.code||o&&i&&"Numpad3"===t.code)?(t.preventDefault(),t.stopPropagation(),this.blockOperationsService.execCommand(n.BLOCK_OPERATIONS.TRANSFORM_BLOCK,!1,e.ELEMENT_TYPES.HEADER_3)):t.ctrlKey&&t.altKey&&("Digit4"===t.code||o&&i&&"Numpad4"===t.code)?(t.preventDefault(),t.stopPropagation(),this.blockOperationsService.execCommand(n.BLOCK_OPERATIONS.TRANSFORM_BLOCK,!1,e.ELEMENT_TYPES.HEADER_4)):t.ctrlKey&&t.altKey&&("Digit5"===t.code||o&&i&&"Numpad5"===t.code)?(t.preventDefault(),t.stopPropagation(),this.blockOperationsService.execCommand(n.BLOCK_OPERATIONS.TRANSFORM_BLOCK,!1,e.ELEMENT_TYPES.HEADER_5)):t.ctrlKey&&t.altKey&&("Digit6"===t.code||o&&i&&"Numpad6"===t.code)?(t.preventDefault(),t.stopPropagation(),this.blockOperationsService.execCommand(n.BLOCK_OPERATIONS.TRANSFORM_BLOCK,!1,e.ELEMENT_TYPES.HEADER_6)):"D"!==t.key&&"d"!==t.key||!t.ctrlKey?"Delete"!==t.key&&"Backspace"!==t.key||!t.shiftKey?"\\"===t.key&&(t.ctrlKey||t.metaKey)?this.blockOperationsService.execCommand(n.BLOCK_OPERATIONS.REMOVE_FORMAT,!1):t.ctrlKey&&t.altKey&&"Digit1"===t.code&&t.preventDefault():(t.preventDefault(),t.stopPropagation(),this.blockOperationsService.execCommand(n.BLOCK_OPERATIONS.DELETE,!1)):(t.preventDefault(),t.stopPropagation(),this.blockOperationsService.execCommand(n.BLOCK_OPERATIONS.DUPLICATE,!1)):(t.preventDefault(),t.stopPropagation(),this.blockOperationsService.execCommand(n.BLOCK_OPERATIONS.TRANSFORM_BLOCK,!1,e.ELEMENT_TYPES.NUMBERED_LIST)):(t.preventDefault(),t.stopPropagation(),this.blockOperationsService.execCommand(n.BLOCK_OPERATIONS.TRANSFORM_BLOCK,!1,e.ELEMENT_TYPES.BULLETED_LIST)):(t.preventDefault(),t.stopPropagation(),this.blockOperationsService.execCommand(n.BLOCK_OPERATIONS.TRANSFORM_BLOCK,!1,e.ELEMENT_TYPES.CHECK_LIST))})),this.htmlElement.addEventListener("keydown",(async e=>{if(!(e.ctrlKey||e.shiftKey||e.altKey))if("Enter"!==e.key||d.getInstance().isVisible)if("Backspace"===e.key){const t=e.target;t.classList.contains("johannes-content-element")&&""===t.textContent?.trim()?this.blockOperationsService.execCommand(n.BLOCK_OPERATIONS.DELETE_FOCUS_ON_PREVIOUS,!1):t.classList.contains("johannes-content-element")&&t.textContent?.trim()}else if("Delete"===e.key){const t=e.target;t.classList.contains("johannes-content-element")&&""===t.textContent?.trim()?this.blockOperationsService.execCommand(n.BLOCK_OPERATIONS.DELETE_FOCUS_ON_NEXT,!1):t.classList.contains("johannes-content-element")&&t.textContent?.trim()}else"ArrowRight"===e.key&&R.isCursorAtEnd(e.target)?this.blockOperationsService.execCommand(n.BLOCK_OPERATIONS.FOCUS_ON_NEXT,!1):"ArrowLeft"===e.key&&R.isCursorAtStart(e.target)?this.blockOperationsService.execCommand(n.BLOCK_OPERATIONS.FOCUS_ON_PREVIOUS,!1):"ArrowDown"===e.key&&R.isCursorOnLastLine()?this.blockOperationsService.execCommand(n.BLOCK_OPERATIONS.FOCUS_ON_NEXT,!1):"ArrowUp"===e.key&&R.isCursorOnFirstLine()&&this.blockOperationsService.execCommand(n.BLOCK_OPERATIONS.FOCUS_ON_PREVIOUS,!1);else e.preventDefault(),this.blockOperationsService.execCommand(n.BLOCK_OPERATIONS.CREATE_DEFAULT_BLOCK,!1)}))}static isCursorAtEnd(e){const n=e.closest(".focusable");if(!n)return!1;const t=window.getSelection();if(!t.rangeCount)return!1;const o=t.getRangeAt(0);let i=o.endContainer;return i.nodeType===Node.TEXT_NODE&&(i=i.parentNode),o.collapsed&&i===n&&o.endOffset===(o.endContainer.textContent||"").length}static isCursorAtStart(e){const n=e.closest(".focusable");if(!n)return!1;const t=window.getSelection();if(!t.rangeCount)return!1;const o=t.getRangeAt(0);let i=o.startContainer;return i.nodeType===Node.TEXT_NODE&&(i=i.parentNode),o.collapsed&&i===n&&0===o.startOffset}static isAtFirstVisibleLine(e){const n=window.getSelection();if(!n.rangeCount)return!1;const t=n.getRangeAt(0).cloneRange();return t.collapse(!0),t.setStart(e,0),t.getBoundingClientRect().top===e.getBoundingClientRect().top}static isAtLastVisibleLine(e){const n=window.getSelection();if(!n.rangeCount)return!1;const t=n.getRangeAt(0).cloneRange();return t.collapse(!1),t.setEnd(e,e.childNodes.length),t.getBoundingClientRect().bottom===e.getBoundingClientRect().bottom}static didCursorMove(e){const n=window.getSelection();if(!n.rangeCount)return Promise.resolve(!1);const t=n.getRangeAt(0).cloneRange().getBoundingClientRect();return new Promise((o=>{setTimeout((()=>{const i=n.getRangeAt(0).cloneRange().getBoundingClientRect(),r=!(t.top===i.top&&t.left===i.left);r||e.preventDefault(),o(r)}),0)}))}static isCursorOnFirstLine(){const e=window.getSelection();if(!e||!e.rangeCount)return!1;const n=e.getRangeAt(0);return 0===n.startOffset&&n.startContainer===n.commonAncestorContainer}static isCursorOnLastLine(){const e=window.getSelection();if(!e||!e.rangeCount)return!1;const n=e.getRangeAt(0);return n.endOffset===n.endContainer.textContent?.length&&n.endContainer===n.commonAncestorContainer}}class M extends o{blockOperationsService;constructor(e){super({}),this.blockOperationsService=e,this.attachEvents()}init(){const e=document.createElement("div");e.classList.add("title");const n=document.createElement("h1");return n.setAttribute("contentEditable","true"),n.setAttribute("data-placeholder","Untitled"),window.editorConfig?.title&&(n.textContent=window.editorConfig?.title),e.appendChild(n),e}attachEvents(){this.htmlElement.addEventListener("keydown",(e=>{"Enter"==e.key&&(e.preventDefault(),this.blockOperationsService.execCommand(n.BLOCK_OPERATIONS.FOCUS_ON_FIRST,!1))}))}}class D extends o{elementFactoryService;static editorId="johannesEditor";static instance;title;content;constructor(e,n){if(super({elementFactoryService:e,blockOperationsService:n}),D.instance)throw new Error("Use BlockOperationsService.getInstance() to get instance.");this.elementFactoryService=e,this.attachEvents(),D.instance=this}init(){const e=document.getElementById(D.editorId)||document.createElement("div");return e.classList.add("johannes-editor"),window.editorConfig,this.title=new M(this.props.blockOperationsService),e.appendChild(this.title.htmlElement),this.content=new R(this.props.elementFactoryService,this.props.blockOperationsService),e.appendChild(this.content.htmlElement),e}static getInstance(e,n){return D.instance||(D.instance=new D(e,n)),D.instance}attachEvents(){const e=document.getElementById(D.editorId);if(e?.addEventListener("mouseover",(e=>{const n=e.target;if(n instanceof Node){let e=n;if(e.nodeType===Node.TEXT_NODE&&(e=e.parentElement),e instanceof Element){const n=e.closest(".block");n&&this.appendDragHandler(n)}else console.error("Event target is not an HTMLElement and cannot handle HTMLElement specific methods:",e)}else console.error("Event target is not a Node:",n)})),"loading"===document.readyState)document.addEventListener("DOMContentLoaded",(()=>{const e=document.querySelector("#johannesEditor > .content .block p");e&&e.focus()}));else{const e=document.querySelector("#johannesEditor > .content .block p");e&&e.focus()}document.addEventListener("paste",(function(e){if("true"===e.target.getAttribute("contenteditable")){e.preventDefault();const n=e.clipboardData;if(n){const e=n.getData("text/plain");D.insertTextAtCursor(e)}}}),!0)}static insertTextAtCursor(e){const n=window.getSelection();if(n&&n.rangeCount>0){const t=n.getRangeAt(0);t.deleteContents();const o=document.createTextNode(e);t.insertNode(o),t.setStartAfter(o),t.setEndAfter(o),n.removeAllRanges(),n.addRange(t)}}appendDragHandler(n){if(n.nodeType===Node.TEXT_NODE&&(n=n.parentNode),!(n instanceof HTMLElement))return void console.error("Provided element is not an HTMLElement:",n);const t=n.closest(".block");let o=t?.querySelector(".drag-handler");!o&&t&&(o=this.elementFactoryService.create(e.ELEMENT_TYPES.DRAG_HANDLE_BUTTON),t.prepend(o))}removeDragHandler(e){if(e.nodeType===Node.TEXT_NODE&&(e=e.parentNode),!(e instanceof HTMLElement))return void console.error("Provided element is not an HTMLElement:",e);const n=e.closest(".block");if(n){const e=n.querySelector(".drag-handler");e?.remove()}}extractContent(){throw new Error("Not implemented Exception")}}class H{static instance;editor;addBlock;floatingToolbar;quickMenu;constructor(e,n,t,o){if(H.instance)throw new Error;this.editor=e,this.addBlock=n,this.floatingToolbar=t,this.quickMenu=o,H.instance=this}static build(t){if(H.instance)return H.instance;const o=c.getInstance();t?(o.reset(),o.registerServices(t)):(o.registerService("IBlockOperationsService",n.getInstance()),o.registerService("IElementFactoryService",e.getInstance()),o.registerService("ITextOperationService",C.getInstance()));const i=D.getInstance(o.getInstanceOf("IElementFactoryService"),o.getInstanceOf("IBlockOperationsService")),r=new _(o.getInstanceOf("IBlockOperationsService")),s=L.build(),l=h.build();return new H(i,r,s,l)}start(){return window.editorConfig,this.editor.htmlElement.appendChild(this.addBlock.htmlElement),window.editorConfig,this.editor.htmlElement.appendChild(this.floatingToolbar.htmlElement),window.editorConfig,this.editor.htmlElement.appendChild(this.quickMenu.htmlElement),this.editor}}document.addEventListener("DOMContentLoaded",(function(){const e=document.querySelector(".johannes-editor");if(e){let n=e.querySelectorAll(".block");if(1==n.length){const e=n[0].querySelector(".johannes-content-element");""==e.innerText&&e.focus()}}})),document.addEventListener("DOMContentLoaded",(function(){H.build().start()})),document.addEventListener("DOMContentLoaded",(function(){const e=document.createElement("div");e.innerHTML='\r\n\r\n \r\n\r\n \r\n\r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n\r\n \x3c!-- tags --\x3e\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n\r\n \r\n\r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n\r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n\r\n \r\n \r\n \r\n\r\n\r\n \r\n \r\n \r\n\r\n',e.className="svg-icons-container",document.body.appendChild(e)})),document.addEventListener("DOMContentLoaded",(function(){})),document.addEventListener("DOMContentLoaded",(function(){document.addEventListener("keydown",(function(e){}))})),document.addEventListener("keyup",(function(e){})),t(528),t(167);var P=t(72),V=t.n(P),q=t(825),F=t.n(q),j=t(659),K=t.n(j),U=t(56),Y=t.n(U),z=t(540),X=t.n(z),Q=t(113),Z=t.n(Q),W=t(282),G={};G.styleTagTransform=Z(),G.setAttributes=Y(),G.insert=K().bind(null,"head"),G.domAPI=F(),G.insertStyleElement=X(),V()(W.A,G),W.A&&W.A.locals&&W.A.locals})()})(); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUMxQyxNQUFNMG9CLEVBQWVycUIsU0FBU1csY0FBYyxPQUM1QzBwQixFQUFhOW1CLFUsdzJoQ0FFYjhtQixFQUFhQyxVQUFZLHNCQUV6QnRxQixTQUFTd2QsS0FBSy9jLFlBQVk0cEIsRUFDOUIsSUMvQkFycUIsU0FBUzJCLGlCQUFpQixvQkFBb0IsV0E0QzlDLElBR0EzQixTQUFTMkIsaUJBQWlCLG9CQUFvQixXQUUxQzNCLFNBQVMyQixpQkFBaUIsV0FBVyxTQUFVNkIsR0FzRS9DLEdBQ0osSUFJQXhELFNBQVMyQixpQkFBaUIsU0FBUyxTQUFVNkIsR0FXN0MsSSxxSUNySUl0RixFQUFVLENBQUMsRUFFZkEsRUFBUWdELGtCQUFvQixJQUM1QmhELEVBQVEwQyxjQUFnQixJQUN4QjFDLEVBQVEwQixPQUFTLFNBQWMsS0FBTSxRQUNyQzFCLEVBQVFlLE9BQVMsSUFDakJmLEVBQVErQyxtQkFBcUIsSUFFaEIsSUFBSSxJQUFTL0MsR0FLSixLQUFXLElBQVFxc0IsUUFBUyxJQUFRQSxNIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvYXNzZXRzL2Nzcy9tYWluLmNzcyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvc291cmNlTWFwcy5qcyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qcyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydEJ5U2VsZWN0b3IuanMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMuanMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZURvbUFQSS5qcyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlVGFnVHJhbnNmb3JtLmpzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2RyYWctYW5kLWRyb3AuanMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvbWVtZW50by5qcyIsIndlYnBhY2s6Ly9qb2hhbm5lcy93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9qb2hhbm5lcy93ZWJwYWNrL3J1bnRpbWUvY29tcGF0IGdldCBkZWZhdWx0IGV4cG9ydCIsIndlYnBhY2s6Ly9qb2hhbm5lcy93ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly9qb2hhbm5lcy93ZWJwYWNrL3J1bnRpbWUvbm9uY2UiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvc2VydmljZXMvZWxlbWVudC1mYWN0b3J5L0VsZW1lbnRGYWN0b3J5U2VydmljZS50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9zZXJ2aWNlcy9ibG9jay1vcGVyYXRpb25zL0Jsb2NrT3BlcmF0aW9uc1NlcnZpY2UudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tcG9uZW50cy9jb21tb24vQmFzZVVJQ29tcG9uZW50LnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbXBvbmVudHMvcXVpY2stbWVudS9RdWlja01lbnVFbXB0eS50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21tb24vQmFzZURvdWJseUxpbmtlZExpc3QudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tbW9uL0pOb2RlLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbW1vbi9DaXJjdWxhckRvdWJseUxpbmtlZExpc3QudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvc2VydmljZXMvZXJyb3JzL1NlcnZpY2VOb3RGb3VuZEV4Y2VwdGlvbi50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9zZXJ2aWNlcy9zZXJ2aWNlLXByb3ZpZGVyL1NlcnZpY2VQcm92aWRlci50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21wb25lbnRzL3F1aWNrLW1lbnUvUXVpY2tNZW51LnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbW1vbi9Eb3VibHlMaW5rZWRMaXN0LnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbXBvbmVudHMvcXVpY2stbWVudS9RdWlja01lbnVTZWN0aW9uLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbXBvbmVudHMvY29tbW9uL1NWR0ljb24udHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tcG9uZW50cy9xdWljay1tZW51L1F1aWNrTWVudUl0ZW0udHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvYnVpbGRlcnMvUXVpY2tNZW51QnVpbGRlci50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvZHJvcGRvd24tdG9vbC9Ecm9wZG93bk1lbnUudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvc2VydmljZXMvdGV4dC1vcGVyYXRpb25zL1RleHRPcGVyYXRpb25TZXJ2aWNlLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbXBvbmVudHMvZmxvYXRpbmctdG9vbGJhci9saW5rLWJveC9JbnB1dExpbmtCb3gudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL2xpbmstYm94L0lucHV0TGlua0JveFdyYXBwZXIudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvdXRpbGl0aWVzL1V0aWxzLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbXBvbmVudHMvZmxvYXRpbmctdG9vbGJhci9GbG9hdGluZ1Rvb2xiYXIudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL2Ryb3Bkb3duLXRvb2wvRHJvcGRvd25NZW51TGlzdEl0ZW0udHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL2Ryb3Bkb3duLXRvb2wvRHJvcGRvd25NZW51TGlzdC50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvc2VwYXJhdG9yL0Zsb2F0aW5nVG9vbGJhclNlcGFyYXRvci50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvZ3JvdXAtYnV0dG9uL0dyb3VwQnV0dG9uLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbXBvbmVudHMvZmxvYXRpbmctdG9vbGJhci9ncm91cC1idXR0b24vR3JvdXBlZEJ1dHRvbi50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvZHJvcGRvd24tdG9vbC9Db2xvckljb24udHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL2Ryb3Bkb3duLXRvb2wvRHJvcGRvd25NZW51QnV0dG9uLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbXBvbmVudHMvZmxvYXRpbmctdG9vbGJhci9kcm9wZG93bi10b29sL0Ryb3Bkb3duTWVudUxpc3RJdGVtVGl0bGUudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvYnVpbGRlcnMvRmxvYXRpbmdUb29sYmFyQnVpbGRlci50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21wb25lbnRzL2FkZC1ibG9jay9BZGRCbG9ja0J1dHRvbi50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21wb25lbnRzL2FkZC1ibG9jay9BZGRCbG9jay50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21wb25lbnRzL2NvbnRlbnQvQ29udGVudC50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21wb25lbnRzL3RpdGxlL1RpdGxlLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbXBvbmVudHMvZWRpdG9yL0VkaXRvci50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9idWlsZGVycy9VSUJ1aWxkZXIudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvdHJpZ2dlcnMvbG9hZC1ldmVudHMuanMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvdHJpZ2dlcnMva2V5cHJlc3MtZXZlbnRzLmpzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2Fzc2V0cy9jc3MvbWFpbi5jc3M/MWZiYSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBgLyoqIENTUyByZXNldCAqL1xuXG4uYnV0dG9uLXJlc2V0IHtcbiAgICBib3JkZXI6IG5vbmU7XG4gICAgbWFyZ2luOiAwO1xuICAgIHBhZGRpbmc6IDA7XG4gICAgd2lkdGg6IGF1dG87XG4gICAgb3ZlcmZsb3c6IHZpc2libGU7XG4gICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gICAgY29sb3I6IGluaGVyaXQ7XG4gICAgZm9udDogaW5oZXJpdDtcbiAgICBsaW5lLWhlaWdodDogbm9ybWFsO1xuICAgIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGluaGVyaXQ7XG4gICAgLW1vei1vc3gtZm9udC1zbW9vdGhpbmc6IGluaGVyaXQ7XG4gICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xufVxuXG5cblxuLyoqIGFkZCBibG9jayAqL1xuLmFkZC1ibG9jayB7XG4gICAgbWFyZ2luOiAwO1xuICAgIHBhZGRpbmc6IDA7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgIGJvcmRlcjogMXB4IHNvbGlkICMwMDA7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XG4gICAgdHJhbnNpdGlvbjogYWxsIDAuM3MgZWFzZTtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIG1hcmdpbi1sZWZ0OiAxLjNyZW07XG59XG5cbi5hZGQtYmxvY2std3JhcHBlciB7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiAzLjEyNXJlbTtcbn1cblxuLmFkZC1ibG9jay13cmFwcGVyOmhvdmVyIC5hZGQtYmxvY2sge1xuICAgIGRpc3BsYXk6IGZsZXg7XG59XG5cbi8qKiBhbmQgYWRkIGJsb2NrICovXG5cblxuXG4vKiogTGlzdCAgKiovXG5vbC5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQsXG51bC5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQge1xuICAgIHBhZGRpbmctbGVmdDogMXJlbSAhaW1wb3J0YW50O1xufVxuXG5cblxuLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCBsaT5idXR0b24ge1xuICAgIC8qIGRpc3BsYXk6IG5vbmU7ICovXG4gICAgZGlzcGxheTogbm9uZTtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgbWFyZ2luLWxlZnQ6IDEwcHg7XG4gICAgdG9wOiAwO1xuXG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICBhbGlnbi1pdGVtczogc3RhcnQ7XG4gICAganVzdGlmeS1jb250ZW50OiBzdGFydDtcblxufVxuXG4uam9oYW5uZXMtY29udGVudC1lbGVtZW50IGxpIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG5cbi5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQgbGk6OmJlZm9yZSB7XG4gICAgbWFyZ2luLWxlZnQ6IDAuMzEyNXJlbTtcbn1cblxuLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCBsaTpob3Zlcj5idXR0b24ge1xuICAgIC8qIGRpc3BsYXk6IGlubGluZS1ibG9jazsgKi9cbiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcblxufVxuXG5wLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIGxpbmUtaGVpZ2h0OiAxO1xuICAgIG1hcmdpbjogMDtcbiAgICBwYWRkaW5nOiAwO1xufVxuXG4uam9oYW5uZXMtY29udGVudC1lbGVtZW50IC5jaGVja2JveC1saXN0IHtcbiAgICBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7XG4gICAgcGFkZGluZy1sZWZ0OiAwICFpbXBvcnRhbnQ7XG59XG5cblxuLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCAuY2hlY2tib3gtbGlzdCBsaSB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIGp1c3RpZnktY29udGVudDogbGVmdDtcbn1cblxuXG4uam9oYW5uZXMtY29udGVudC1lbGVtZW50IHVsLmNoZWNrYm94LWxpc3QgaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdOmNoZWNrZWQrc3BhbiB7XG4gICAgdGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7XG59XG5cbnVsLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudDpub3QoLmNoZWNrYm94LWxpc3QpLFxub2wuam9oYW5uZXMtY29udGVudC1lbGVtZW50Om5vdCguY2hlY2tib3gtbGlzdCkge1xuICAgIHBhZGRpbmctbGVmdDogMS41cmVtICFpbXBvcnRhbnQ7XG59XG5cbi8qKiBhbmQgbGlzdCAqKi9cblxuXG5cbi5ibG9jaz4uZHJhZy1oYW5kbGVyIHtcbiAgICBjb2xvcjogIzg0ODg4ZDtcbiAgICB2aXNpYmlsaXR5OiBoaWRkZW47XG4gICAgY3Vyc29yOiBncmFiO1xuICAgIGFsaWduLXNlbGY6IHN0YXJ0O1xuXG4gICAgLyogYmFja2dyb3VuZC1jb2xvcjogcGluazsgKi9cbiAgICBwYWRkaW5nLXRvcDogMC4zM3JlbTtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG59XG5cbi5kcmFnLWhhbmRsZXIgc3ZnIHtcbiAgICAvKiBiYWNrZ3JvdW5kLWNvbG9yOiByZWQ7ICovXG59XG5cbi5kcmFnLWhhbmRsZXIgc3ZnIHVzZSB7XG4gICAgLyogYmFja2dyb3VuZC1jb2xvcjogYmx1ZTsgKi9cbn1cblxuLmRyYWctaGFuZGxlcjphY3RpdmUge1xuICAgIGN1cnNvcjogZ3JhYmJpbmc7XG59XG5cbi5ibG9jayB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIG1hcmdpbi1ib3R0b206IDFyZW07XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xufVxuXG4uYmxvY2s+Kjpub3QoLmRyYWctaGFuZGxlcikge1xuICAgIHBhZGRpbmctbGVmdDogMS4yNXJlbTtcbn1cblxuLmJsb2NrOmhvdmVyIC5kcmFnLWhhbmRsZXIge1xuICAgIHZpc2liaWxpdHk6IHZpc2libGU7XG4gICAgdmVydGljYWwtYWxpZ246IHRvcDtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHN0YXJ0O1xufVxuXG4uZHJvcC1saW5lIHtcbiAgICBoZWlnaHQ6IDFyZW07XG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzg0ODg4ZDtcbiAgICB3aWR0aDogMTAwJTtcbn1cblxuXG4udGl0bGUgaDEge1xuICAgIG1hcmdpbi1sZWZ0OiAxLjNyZW07XG59XG5cbmgxW2RhdGEtcGxhY2Vob2xkZXJdOmVtcHR5OmJlZm9yZSB7XG4gICAgY29udGVudDogYXR0cihkYXRhLXBsYWNlaG9sZGVyKTtcbiAgICBjb2xvcjogIzg0ODg4ZCAhaW1wb3J0YW50O1xuICAgIGRpc3BsYXk6IGJsb2NrO1xufVxuXG5oMVtkYXRhLXBsYWNlaG9sZGVyXTpmb2N1czpiZWZvcmUge31cblxuXG4qW2NvbnRlbnRlZGl0YWJsZT1cInRydWVcIl06bm90KGgxKTplbXB0eTpiZWZvcmUge1xuICAgIGNvbnRlbnQ6IGF0dHIoZGF0YS1wbGFjZWhvbGRlcik7XG4gICAgY29sb3I6ICM4NDg4OGFjZDtcbiAgICBkaXNwbGF5OiBub25lO1xufVxuXG4qW2NvbnRlbnRlZGl0YWJsZT1cInRydWVcIl06bm90KGgxKTplbXB0eTpob3ZlcjpiZWZvcmUge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xufVxuXG5jaXRlW2NvbnRlbnRlZGl0YWJsZT1cInRydWVcIl06ZW1wdHk6YmVmb3JlIHtcbiAgICBkaXNwbGF5OiBibG9jaztcbn1cblxuKltjb250ZW50ZWRpdGFibGU9XCJ0cnVlXCJdOm5vdChoMSlbZGF0YS1wbGFjZWhvbGRlcl06ZW1wdHk6Zm9jdXM6YmVmb3JlIHtcbiAgICBjb250ZW50OiBhdHRyKGRhdGEtcGxhY2Vob2xkZXIpO1xuICAgIGNvbG9yOiAjODQ4ODhhY2QgIWltcG9ydGFudDtcbiAgICBkaXNwbGF5OiBibG9jaztcbn1cblxuXG5cbmgxIHtcbiAgICBmb250LXNpemU6IDIuNXJlbTtcbiAgICBmb250LXdlaWdodDogYm9sZGVyICFpbXBvcnRhbnQ7XG59XG5cbi5qb2hhbm5lcy1lZGl0b3Ige1xuICAgIHdpZHRoOiAxMDAlO1xuXG59XG5cbi5jb250ZW50IHtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuXG5cbn1cblxucHJlIHtcbiAgICB3aWR0aDogMTAwJTtcbn1cblxuW2NvbnRlbnRlZGl0YWJsZV0ge1xuICAgIG91dGxpbmU6IG5vbmU7XG59XG5cbmJvZHkge1xuICAgIGhlaWdodDogMjAwMHB4O1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNmMGYwZjEgIWltcG9ydGFudDtcblxuICAgIGZvbnQtZmFtaWx5OiBzeXN0ZW0tdWksIC1hcHBsZS1zeXN0ZW0sIFwiU2Vnb2UgVUlcIiwgUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIFwiTm90byBTYW5zXCIsIFwiTGliZXJhdGlvbiBTYW5zXCIsIEFyaWFsLCBzYW5zLXNlcmlmLCBcIkFwcGxlIENvbG9yIEVtb2ppXCIsIFwiU2Vnb2UgVUkgRW1vamlcIiwgXCJTZWdvZSBVSSBTeW1ib2xcIiwgXCJOb3RvIENvbG9yIEVtb2ppXCI7XG59XG5cblxuLmVkaXRvciB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBtYXJnaW4tdG9wOiA4MHB4O1xufVxuXG5wIHtcbiAgICBjb2xvcjogIzI0MjQyNDtcbn1cblxuXG4uYmxvY2ssXG4uYmxvY2sgKiB7XG4gICAgdXNlci1zZWxlY3Q6IHRleHQ7XG59XG5cblxuLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCB7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgcGFkZGluZzogMDtcbiAgICBtYXJnaW46IDA7XG4gICAgLyogYmFja2dyb3VuZC1jb2xvcjogZ3JlZW47ICovXG59XG5cblxuI2pvaGFubmVzRWRpdG9yIHtcbiAgICB3aWR0aDogNjAlO1xuICAgIG1hcmdpbi1sZWZ0OiBhdXRvO1xuICAgIG1hcmdpbi1yaWdodDogYXV0bztcbn1cblxuLmpvaGFubmVzLWVkaXRvciBociB7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiAycHg7XG4gICAgdmlzaWJpbGl0eTogdmlzaWJsZTtcbiAgICBib3JkZXI6IG5vbmU7XG4gICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHJnYmEoNTUsIDUzLCA0NywgMC4xNik7XG59XG5cblxuXG4uam9oYW5uZXMtZWRpdG9yIGJsb2NrcXVvdGUge1xuICAgIG1hcmdpbjogMC41cmVtIDA7XG4gICAgcGFkZGluZy1sZWZ0OiAyMHB4O1xuICAgIGJvcmRlci1sZWZ0OiA0cHggc29saWQgcmdiKDU1LCA1MywgNDcpO1xuICAgIGZvbnQtc3R5bGU6IGl0YWxpY1xufVxuXG4uam9oYW5uZXMtZWRpdG9yIGNpdGUge1xuICAgIHBhZGRpbmctdG9wOiAxcmVtICFpbXBvcnRhbnQ7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xufVxuXG5cbi5qb2hhbm5lcy1lZGl0b3IgY2l0ZTo6YmVmb3JlIHtcbiAgICBjb250ZW50OiAn4oCUICc7XG59XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiNsaW5rQm94IHtcbiAgICBib3JkZXItcmFkaXVzOiAycHg7XG4gICAgcGFkZGluZzogMjBweDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjlmOWY5O1xuXG5cbiAgICBib3gtc2hhZG93OlxuICAgICAgICAwIDRweCA2cHggcmdiYSgwLCAwLCAwLCAwLjEpLFxuICAgICAgICAwIC0ycHggNHB4IHJnYmEoMCwgMCwgMCwgMC4wMiksXG4gICAgICAgIC0ycHggMCA0cHggcmdiYSgwLCAwLCAwLCAwLjAyKSxcbiAgICAgICAgMnB4IDAgNHB4IHJnYmEoMCwgMCwgMCwgMC4wMik7XG5cblxuICAgIGJvcmRlcjogMXB4IHNvbGlkICNkMGQwZDA7XG4gICAgd2lkdGg6IGZpdC1jb250ZW50O1xuICAgIHotaW5kZXg6IDk5OTk5OTtcbiAgICBjb2xvcjogcmdiKDEyMCwgMTE5LCAxMTYpO1xuICAgIGJvcmRlci1yYWRpdXM6IG5vbmU7XG59XG5cblxuI2xpbmtCb3ggaW5wdXQge1xuICAgIHdpZHRoOiAzMTZweDtcbiAgICBwYWRkaW5nOiA4cHggNDBweCA4cHggMTZweDtcbiAgICAvKiBib3JkZXItY29sb3I6ICNkMGQwZDA7ICovXG5cbiAgICBib3JkZXI6IDFweCBzb2xpZCAjOTQ5NDk0O1xuICAgIC8qIGJvcmRlci1yYWRpdXM6IDRweDsgKi9cbiAgICBoZWlnaHQ6IDI0cHg7XG5cbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbn1cblxuXG4jbGlua0JveCBpbnB1dDo6c2VsZWN0aW9uLFxuI2xpbmtCb3ggaW5wdXQ6Zm9jdXMge1xuICAgIGJvcmRlci1yYWRpdXM6IG5vbmU7XG59XG5cblxuXG5cblxuXG5cblxuLyoqIFRleHQgZm9ybWF0dGluZyBCYXIgKiovXG5cblxuXG4jZmxvYXRpbmdUb29sYmFyIHtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gICAgcGFkZGluZzogOHB4IDE2cHg7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2Y5ZjlmOTtcbiAgICB3aWR0aDogZml0LWNvbnRlbnQ7XG4gICAgei1pbmRleDogOTk5OTk5O1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB1c2VyLXNlbGVjdDogbm9uZTtcbn1cblxuLyogVE9ETzogcmVtb3ZlIHRoaXMqL1xuc3BhbiB7XG4gICAgZm9udC1mYW1pbHk6IEFyaWFsLCBzYW5zLXNlcmlmO1xufVxuXG5cbiNmbG9hdGluZ1Rvb2xiYXIgLml0ZW0ge1xuICAgIGNvbG9yOiByZ2IoMTIwLCAxMTksIDExNik7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGdhcDogMTBweDtcbn1cblxuI2Zsb2F0aW5nVG9vbGJhciAuaXRlbT5idXR0b24ge1xuXG4gICAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbn1cblxuXG4jZmxvYXRpbmdUb29sYmFyIHNlbGVjdCB7XG4gICAgY29sb3I6IHJnYigxMjAsIDExOSwgMTE2KTtcbiAgICBib3JkZXI6IG5vbmU7XG4gICAgZm9udC1zaXplOiAwLjg1cmVtO1xuICAgIGJhY2tncm91bmQtY29sb3I6IGluaGVyaXQ7XG59XG5cbi5zZWxlY3Qtd3JhcHBlciB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG59XG5cbi5zZWxlY3Qtd3JhcHBlciB1bCB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIGJhY2tncm91bmQ6ICNmOWY5Zjk7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICB3aWR0aDogZml0LWNvbnRlbnQ7XG4gICAgcGFkZGluZy1ib3R0b206IDAuNXJlbTtcbiAgICBwYWRkaW5nLWxlZnQ6IDVweDtcbiAgICBwYWRkaW5nLXJpZ2h0OiA1cHg7XG4gICAgdG9wOiAyLjJyZW07XG4gICAgY29sb3I6IHJnYig1NSwgNTMsIDQ3KTtcbiAgICBwYWRkaW5nLXJpZ2h0OiAwLjMxMjVyZW07XG59XG5cblxuXG4uc2VsZWN0LXdyYXBwZXIgdWwgbGkge1xuICAgIC8qIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdyAhaW1wb3J0YW50O1xuICAgIGJhY2tncm91bmQtY29sb3I6IHllbGxvdzsgKi9cbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBnYXA6IDAuNjI1cmVtO1xuICAgIHBhZGRpbmc6IDAuMTg3NXJlbSAwLjMxMjVyZW07XG4gICAgYm9yZGVyLXJhZGl1czogMC4xODc1cmVtO1xuICAgIHVzZXItc2VsZWN0OiBub25lICFpbXBvcnRhbnQ7XG5cbiAgICBmb250LXNpemU6IHNtYWxsICFpbXBvcnRhbnQ7XG4gICAgZm9udC13ZWlnaHQ6IDUwMDtcbn1cblxuLnNlbGVjdC13cmFwcGVyIHVsIGxpIHNwYW4ge1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICB3aWR0aDogbWF4LWNvbnRlbnQ7XG59XG5cbi5zZWxlY3Qtd3JhcHBlciB1bCBsaSAub3B0aW9uLWltYWdlIHtcbiAgICB3aWR0aDogMS4zNzVyZW07XG4gICAgaGVpZ2h0OiAxLjM3NXJlbTtcbiAgICBjb2xvcjogIzI0MjQyNDtcbiAgICBwYWRkaW5nOiAwICFpbXBvcnRhbnQ7XG4gICAgbWFyZ2luOiAwICFpbXBvcnRhbnQ7XG59XG5cbi5zZWxlY3Qtd3JhcHBlciB1bCBsaSAub3B0aW9uLWltYWdlIHN2ZyB7XG4gICAgY29sb3I6ICM0ZjRmNGY7XG4gICAgcGFkZGluZzogMCAhaW1wb3J0YW50O1xuICAgIG1hcmdpbjogMCAhaW1wb3J0YW50O1xufVxuXG4udGV4dC1mb3JtYXR0aW5nLXNlbGVjdC1idXR0b24ge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xufVxuXG4jdHVybkludG9CdXR0b24gc3BhbiB7XG4gICAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGZvbnQtc2l6ZTogMC45cmVtO1xuXG59XG5cbiN0dXJuSW50b0J1dHRvbiBzdmcgdXNlIHtcbiAgICBtYXJnaW46IGF1dG87XG59XG5cbi5zZWxlY3Qtd3JhcHBlciB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIGNvbG9yOiByZ2IoMTIwLCAxMTksIDExNik7XG59XG5cblxuLnNlbGVjdC13cmFwcGVyID4gYnV0dG9uIHtcbiAgICBjb2xvcjogcmdiYSg1NSwgNTMsIDQ3LCAwLjg1KTtcbn1cblxuXG5cblxuXG5cblxuY29kZTpub3QocHJlIGNvZGUpIHtcbiAgICBtYXJnaW46IDA7XG4gICAgcGFkZGluZzogMDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZDBkMGQwO1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNmNmY1ZjQ7XG4gICAgZm9udC1zaXplOiBpbmhlcml0O1xuICAgIGZvbnQtc2l6ZTogMXJlbSAhaW1wb3J0YW50O1xuICAgIGJvcmRlcjogMXB4IHNvbGlkICMwMDAwMDAxYTtcbiAgICBwYWRkaW5nOiAwIDNweDtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgYm9yZGVyLXJhZGl1czogNHB4O1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG59XG5cblxuXG5cbmE6bm90KFtocmVmXSkge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNkM2UzZmQ7XG59XG5cbi50ZXh0LWZvcm1hdHRpbmctYnV0dG9uLWFjdGl2ZSB7XG4gICAgY29sb3I6ICMyMzgyZTI7XG59XG5cbi50ZXh0LWZvcm1hdHRpbmctY2lyY2xlLWFjdGl2ZSB7XG4gICAgYm9yZGVyLWNvbG9yOiAjMjM4MmUyICFpbXBvcnRhbnQ7XG59XG5cblxuXG4jbW9yZVRleHRPcHRpb25TZWxlY3Qge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbn1cblxuLm1vcmVUZXh0T3B0aW9uV3JhcHBlciB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xufVxuXG5cbi5zZWxlY3Qtd3JhcHBlciB1bCBsaT5oMyB7XG4gICAgbWFyZ2luOiAwO1xuICAgIGZvbnQtc2l6ZTogc21hbGwgIWltcG9ydGFudDtcbiAgICBjb2xvcjogIzM3MzUyZmE2O1xuICAgIG1hcmdpbjogMDtcbiAgICBwYWRkaW5nOiAwO1xuICAgIGZvbnQtd2VpZ2h0OiA2MDAgIWltcG9ydGFudDtcbiAgICBtYXJnaW4tdG9wOiAwLjMxMjVyZW07XG4gICAgbWFyZ2luLWJvdHRvbTogMC4zMTI1cmVtO1xufVxuXG5cbi5iZ2MtcmVkIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkRERURFO1xufVxuXG4uYmdjLWdyZWVuIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRDdGN0RDO1xufVxuXG4uYmdjLWJsdWUge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNEOUVERjY7XG59XG5cbi5iZ2MteWVsbG93IHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkFGNEQxO1xufVxuXG4uYmdjLWdyZXkge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNFMUUwRTA7XG59XG5cbnAsXG5tYXJrIHtcbiAgICBsaW5lLWhlaWdodDogMTtcbn1cblxuI3R1cm5JbnRvU2VsZWN0IC5vcHRpb24taW1hZ2Uge1xuICAgIC8qIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsgKi9cbn1cblxuLmJvcmRlci1sZXNzLWltYWdlIHtcbiAgICB3aWR0aDogMjRweDtcbiAgICBoZWlnaHQ6IDI0cHg7XG59XG5cblxuXG5cbi8qKiBCbG9jayBPcHRpb25zICoqL1xuLnNvZnQtYm94LXNoYWRvdyB7XG4gICAgbWFyZ2luOiAwO1xuICAgIHBhZGRpbmc6IDA7XG4gICAgYm9yZGVyLXJhZGl1czogMnB4O1xuICAgIGJveC1zaGFkb3c6XG4gICAgICAgIDAgNHB4IDZweCByZ2JhKDAsIDAsIDAsIDAuMSksXG4gICAgICAgIDAgLTJweCA0cHggcmdiYSgyMTYsIDE5NiwgMTk2LCAwLjAyKSxcbiAgICAgICAgLTJweCAwIDRweCByZ2JhKDAsIDAsIDAsIDAuMDIpLFxuICAgICAgICAycHggMCA0cHggcmdiYSgwLCAwLCAwLCAwLjAyKTtcblxuICAgIGJvcmRlcjogMXB4IHNvbGlkICNkMGQwZDA7XG59XG5cbi5ibG9jay1vcHRpb25zLXdyYXBwZXIge1xuICAgIHotaW5kZXg6IDk5OTk5OTtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgZGlzcGxheTogbm9uZTtcbn1cblxuLmJsb2NrLW9wdGlvbnMge1xuICAgIHdpZHRoOiBmaXQtY29udGVudDtcbiAgICBtYXgtaGVpZ2h0OiAxOXJlbTtcbiAgICBvdmVyZmxvdy15OiBhdXRvO1xufVxuXG4uYmxvY2stb3B0aW9ucyB7XG4gICAgcGFkZGluZzogMCAwLjYyNXJlbTtcbiAgICBiYWNrZ3JvdW5kOiAjZjlmOWY5O1xufVxuXG4uYmxvY2stb3B0aW9ucyBzZWN0aW9uIGgyIHtcbiAgICBmb250LXNpemU6IHNtYWxsICFpbXBvcnRhbnQ7XG4gICAgY29sb3I6ICMzNzM1MmZhNjtcbiAgICBtYXJnaW46IDA7XG4gICAgcGFkZGluZzogMDtcbiAgICBmb250LXdlaWdodDogNjAwICFpbXBvcnRhbnQ7XG4gICAgbWFyZ2luLXRvcDogMC4zMTI1cmVtO1xuICAgIG1hcmdpbi1ib3R0b206IDAuMzEyNXJlbTtcbiAgICBwYWRkaW5nLWxlZnQ6IDAuMzEyNXJlbTtcbn1cblxuLmJsb2NrLW9wdGlvbnMgLm9wdGlvbiB7XG4gICAgcGFkZGluZzogMC4zMTI1cmVtIDAuNjI1cmVtO1xuICAgIG1hcmdpbjogMC4zMTI1cmVtIDA7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGp1c3RpZnktY29udGVudDogbGVmdDtcbiAgICBnYXA6IDAuNnJlbTtcbiAgICBib3JkZXItcmFkaXVzOiAzcHg7XG59XG5cbi5ibG9jay1vcHRpb25zIC5vcHRpb246Zm9jdXMge1xuICAgIG91dGxpbmU6IG5vbmU7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2U5ZTllOTtcbiAgICBib3JkZXI6IGluaGVyaXQ7XG59XG5cbi5vcHRpb24tZm9jdXNlZCB7XG4gICAgb3V0bGluZTogbm9uZTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTllOWU5O1xuICAgIGJvcmRlcjogbm9uZTtcbn1cblxuI2RlbGV0ZU9wdGlvbi5vcHRpb24tZm9jdXNlZCB7XG4gICAgY29sb3I6ICNFQjU3NTcgIWltcG9ydGFudDtcbn1cblxuI2RlbGV0ZU9wdGlvbi5vcHRpb24tZm9jdXNlZCBzdmcge1xuICAgIGNvbG9yOiAjRUI1NzU3ICFpbXBvcnRhbnQ7XG59XG5cblxuXG4uYmxvY2stb3B0aW9ucyAub3B0aW9uOmZvY3VzLXZpc2libGUge1xuICAgIG91dGxpbmU6IG5vbmU7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2U5ZTllOTtcbiAgICBib3JkZXI6IGluaGVyaXQ7XG59XG5cbi8qIC5vcHRpb24taG92ZXI6aG92ZXIge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNlOWU5ZTk7XG4gICAgYm94LXNoYWRvdzogMHB4IDBweCAwcHggMnB4ICNlOWU5ZTk7XG4gICAgYm9yZGVyLXJhZGl1czogMXB4O1xuICAgIHRyYW5zaXRpb246IDAuMXMgZWFzZTtcbn0gKi9cblxuLyogLnNlbGVjdC13cmFwcGVyPmJ1dHRvbiwgKi9cblxuLyogI3R1cm5JbnRvQnV0dG9uLFxuI2NvbG9yVGV4dEJ1dHRvbiB7XG4gICAgcGFkZGluZy1sZWZ0OiA0cHg7XG59ICovXG5cbiN0dXJuSW50b0J1dHRvbjpub3QoW2Rpc2FibGVkXSk6aG92ZXIsXG4jY29sb3JUZXh0QnV0dG9uOm5vdChbZGlzYWJsZWRdKTpob3ZlcixcbiNtb3JlVGV4dE9wdGlvbkJ1dHRvbjpub3QoW2Rpc2FibGVkXSk6aG92ZXIsXG4jZmxvYXRpbmdUb29sYmFyIC5pdGVtPmJ1dHRvbjpub3QoW2Rpc2FibGVkXSk6aG92ZXIge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNlOWU5ZTk7XG4gICAgYm94LXNoYWRvdzogMHB4IDBweCAwcHggMnB4ICNlOWU5ZTk7XG4gICAgYm9yZGVyLXJhZGl1czogMXB4O1xuICAgIHRyYW5zaXRpb246IDAuMXMgZWFzZTtcbn1cblxuXG5cbi5vcHRpb25bZm9jdXNlZD1cInRydWVcIl0ge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNiZGU0ZmY7XG59XG5cblxuXG5cblxuLm9wdGlvbi1pbWFnZSB7XG4gICAgd2lkdGg6IDIuODc1cmVtO1xuICAgIGhlaWdodDogMi44NzVyZW07XG4gICAgYm9yZGVyLXJhZGl1czogMC4xODc1cmVtO1xuICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7XG4gICAgY29sb3I6ICM0ZjRmNGY7XG5cbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmO1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG59XG5cbi5vcHRpb24taW1hZ2UgaW1nIHtcbiAgICBtYXgtd2lkdGg6IDIuODc1cmVtO1xuICAgIG1heC1oZWlnaHQ6IDIuODc1cmVtO1xufVxuXG4ub3B0aW9uLWltYWdlIHN2ZyB7XG4gICAgbWFyZ2luOiAwO1xuICAgIHBhZGRpbmc6IDA7XG4gICAgcGFkZGluZzogMC42MjVyZW07XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcblxufVxuXG4ub3B0aW9uLXRleHQgKiB7XG4gICAgbWFyZ2luOiAwO1xuICAgIHBhZGRpbmc6IDA7XG5cbn1cblxuLm9wdGlvbi10ZXh0IC5ibG9jay10aXRsZSB7XG4gICAgZm9udC1zaXplOiBzbWFsbCAhaW1wb3J0YW50O1xuICAgIGZvbnQtd2VpZ2h0OiA1MDA7XG59XG5cbi5vcHRpb24tdGV4dCAuYmxvY2stZGVzY3JpcHRpb24ge1xuICAgIGZvbnQtc2l6ZTogc21hbGwgIWltcG9ydGFudDtcbiAgICBjb2xvcjogcmdiYSg1NSwgNTMsIDQ3LCAwLjUpO1xufVxuXG4vKiogRW5kIEJsb2NrIE9wdGlvbnMgKiovXG5cblxuXG4jZGVsZXRlQmxvY2tCdXR0b246aG92ZXIgc3ZnLFxuI2RlbGV0ZUJsb2NrQnV0dG9uOmhvdmVyIHtcbiAgICBjb2xvcjogcmdiKDIzNSwgODcsIDg3KSAhaW1wb3J0YW50O1xufVxuXG5cblxuLmpvaGFubmVzLWVkaXRvciAqOjpzZWxlY3Rpb24ge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMjExLCAyMjcsIDI1MywgMC41KSAhaW1wb3J0YW50O1xufVxuXG4uam9oYW5uZXMtZWRpdG9yIG1hcmssXG4uam9oYW5uZXMtZWRpdG9yICoge1xuICAgIGxpbmUtaGVpZ2h0OiAxLjUgIWltcG9ydGFudDtcbn1cblxuLm9wdGlvbiB7XG4gICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xufVxuXG4udGV4dC1vcHRpb24ge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHN0YXJ0O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgZ2FwOiAwLjYyNXJlbTtcbn1cblxuXG5cblxuOnJvb3Qge1xuICAgIC8qIGZvbnQtc2l6ZTogMTZweDsgKi9cbiAgICAvKiBUYW1hbmhvIHBhZHLDo28gKi9cbn1cblxuLyogUGFyYSB0ZWxhcyBjb20gZGVuc2lkYWRlIG3DqWRpYSAqL1xuQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAoLXdlYmtpdC1taW4tZGV2aWNlLXBpeGVsLXJhdGlvOiAyKSxcbm9ubHkgc2NyZWVuIGFuZCAobWluLS1tb3otZGV2aWNlLXBpeGVsLXJhdGlvOiAyKSxcbm9ubHkgc2NyZWVuIGFuZCAobWluLXJlc29sdXRpb246IDE5MmRwaSksXG5vbmx5IHNjcmVlbiBhbmQgKG1pbi1yZXNvbHV0aW9uOiAyZHBweCkge1xuICAgIDpyb290IHtcbiAgICAgICAgZm9udC1zaXplOiAxOHB4O1xuICAgICAgICAvKiBBdW1lbnRhIG8gdGFtYW5obyBkYSBmb250ZSBwYXJhIHRlbGFzIGRlIGFsdGEgZGVuc2lkYWRlICovXG4gICAgfVxufVxuXG4vKiBQYXJhIHRlbGFzIGNvbSBhbHTDrXNzaW1hIGRlbnNpZGFkZSAqL1xuQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAoLXdlYmtpdC1taW4tZGV2aWNlLXBpeGVsLXJhdGlvOiAzKSxcbm9ubHkgc2NyZWVuIGFuZCAobWluLS1tb3otZGV2aWNlLXBpeGVsLXJhdGlvOiAzKSxcbm9ubHkgc2NyZWVuIGFuZCAobWluLXJlc29sdXRpb246IDI4OGRwaSksXG5vbmx5IHNjcmVlbiBhbmQgKG1pbi1yZXNvbHV0aW9uOiAzZHBweCkge1xuICAgIDpyb290IHtcbiAgICAgICAgZm9udC1zaXplOiAyMHB4O1xuICAgICAgICAvKiBBaW5kYSBtYWlvciBwYXJhIHRlbGFzIGRlIGRlbnNpZGFkZSBtdWl0byBhbHRhICovXG4gICAgfVxufWAsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vc3JjL2Fzc2V0cy9jc3MvbWFpbi5jc3NcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIkFBQUEsZUFBZTs7QUFFZjtJQUNJLFlBQVk7SUFDWixTQUFTO0lBQ1QsVUFBVTtJQUNWLFdBQVc7SUFDWCxpQkFBaUI7SUFDakIsdUJBQXVCO0lBQ3ZCLGNBQWM7SUFDZCxhQUFhO0lBQ2IsbUJBQW1CO0lBQ25CLCtCQUErQjtJQUMvQixnQ0FBZ0M7SUFDaEMsd0JBQXdCO0FBQzVCOzs7O0FBSUEsZUFBZTtBQUNmO0lBQ0ksU0FBUztJQUNULFVBQVU7SUFDVixhQUFhO0lBQ2IsbUJBQW1CO0lBQ25CLHVCQUF1QjtJQUN2QixzQkFBc0I7SUFDdEIsdUJBQXVCO0lBQ3ZCLHlCQUF5QjtJQUN6QixzQkFBc0I7SUFDdEIsbUJBQW1CO0FBQ3ZCOztBQUVBO0lBQ0ksV0FBVztJQUNYLGdCQUFnQjtBQUNwQjs7QUFFQTtJQUNJLGFBQWE7QUFDakI7O0FBRUEsbUJBQW1COzs7O0FBSW5CLFlBQVk7QUFDWjs7SUFFSSw2QkFBNkI7QUFDakM7Ozs7QUFJQTtJQUNJLG1CQUFtQjtJQUNuQixhQUFhO0lBQ2Isa0JBQWtCO0lBQ2xCLGlCQUFpQjtJQUNqQixNQUFNOztJQUVOLG1CQUFt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QkFBd0I7Ozs7QUFJeEI7O0lBRUksa0NBQWtDO0FBQ3RDOzs7O0FBSUE7SUFDSSxxREFBcUQ7QUFDekQ7O0FBRUE7O0lBRUksMkJBQTJCO0FBQy9COztBQUVBO0lBQ0ksOEJBQThCO0FBQ2xDOztBQUVBO0lBQ0ksYUFBYTtJQUNiLG1CQUFtQjtJQUNuQixzQkFBc0I7SUFDdEIsbUJBQW1CO0lBQ25CLGFBQWE7QUFDakI7Ozs7O0FBS0E7SUFDSSxxQkFBcUI7SUFDckIsbUJBQW1CO0FBQ3ZCOztBQUVBLG1DQUFtQztBQUNuQzs7OztJQUlJO1FBQ0ksZUFBZTtRQUNmLDREQUE0RDtJQUNoRTtBQUNKOztBQUVBLHVDQUF1QztBQUN2Qzs7OztJQUlJO1FBQ0ksZUFBZTtRQUNmLG1EQUFtRDtJQUN2RDtBQUNKXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIi8qKiBDU1MgcmVzZXQgKi9cXG5cXG4uYnV0dG9uLXJlc2V0IHtcXG4gICAgYm9yZGVyOiBub25lO1xcbiAgICBtYXJnaW46IDA7XFxuICAgIHBhZGRpbmc6IDA7XFxuICAgIHdpZHRoOiBhdXRvO1xcbiAgICBvdmVyZmxvdzogdmlzaWJsZTtcXG4gICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XFxuICAgIGNvbG9yOiBpbmhlcml0O1xcbiAgICBmb250OiBpbmhlcml0O1xcbiAgICBsaW5lLWhlaWdodDogbm9ybWFsO1xcbiAgICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBpbmhlcml0O1xcbiAgICAtbW96LW9zeC1mb250LXNtb290aGluZzogaW5oZXJpdDtcXG4gICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xcbn1cXG5cXG5cXG5cXG4vKiogYWRkIGJsb2NrICovXFxuLmFkZC1ibG9jayB7XFxuICAgIG1hcmdpbjogMDtcXG4gICAgcGFkZGluZzogMDtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XFxuICAgIGJvcmRlcjogMXB4IHNvbGlkICMwMDA7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xcbiAgICB0cmFuc2l0aW9uOiBhbGwgMC4zcyBlYXNlO1xcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcbiAgICBtYXJnaW4tbGVmdDogMS4zcmVtO1xcbn1cXG5cXG4uYWRkLWJsb2NrLXdyYXBwZXIge1xcbiAgICB3aWR0aDogMTAwJTtcXG4gICAgaGVpZ2h0OiAzLjEyNXJlbTtcXG59XFxuXFxuLmFkZC1ibG9jay13cmFwcGVyOmhvdmVyIC5hZGQtYmxvY2sge1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbn1cXG5cXG4vKiogYW5kIGFkZCBibG9jayAqL1xcblxcblxcblxcbi8qKiBMaXN0ICAqKi9cXG5vbC5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQsXFxudWwuam9oYW5uZXMtY29udGVudC1lbGVtZW50IHtcXG4gICAgcGFkZGluZy1sZWZ0OiAxcmVtICFpbXBvcnRhbnQ7XFxufVxcblxcblxcblxcbi5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQgbGk+YnV0dG9uIHtcXG4gICAgLyogZGlzcGxheTogbm9uZTsgKi9cXG4gICAgZGlzcGxheTogbm9uZTtcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgICBtYXJnaW4tbGVmdDogMTBweDtcXG4gICAgdG9wOiAwO1xcblxcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xcbiAgICBhbGlnbi1pdGVtczogc3RhcnQ7XFxuICAgIGp1c3RpZnktY29udGVudDogc3RhcnQ7XFxuXFxufVxcblxcbi5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQgbGkge1xcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XFxufVxcblxcbi5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQgbGk6OmJlZm9yZSB7XFxuICAgIG1hcmdpbi1sZWZ0OiAwLjMxMjVyZW07XFxufVxcblxcbi5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQgbGk6aG92ZXI+YnV0dG9uIHtcXG4gICAgLyogZGlzcGxheTogaW5saW5lLWJsb2NrOyAqL1xcbiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcXG5cXG59XFxuXFxucC5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQge1xcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxuICAgIGxpbmUtaGVpZ2h0OiAxO1xcbiAgICBtYXJnaW46IDA7XFxuICAgIHBhZGRpbmc6IDA7XFxufVxcblxcbi5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQgLmNoZWNrYm94LWxpc3Qge1xcbiAgICBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7XFxuICAgIHBhZGRpbmctbGVmdDogMCAhaW1wb3J0YW50O1xcbn1cXG5cXG5cXG4uam9oYW5uZXMtY29udGVudC1lbGVtZW50IC5jaGVja2JveC1saXN0IGxpIHtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcXG4gICAganVzdGlmeS1jb250ZW50OiBsZWZ0O1xcbn1cXG5cXG5cXG4uam9oYW5uZXMtY29udGVudC1lbGVtZW50IHVsLmNoZWNrYm94LWxpc3QgaW5wdXRbdHlwZT1cXFwiY2hlY2tib3hcXFwiXTpjaGVja2VkK3NwYW4ge1xcbiAgICB0ZXh0LWRlY29yYXRpb246IGxpbmUtdGhyb3VnaDtcXG59XFxuXFxudWwuam9oYW5uZXMtY29udGVudC1lbGVtZW50Om5vdCguY2hlY2tib3gtbGlzdCksXFxub2wuam9oYW5uZXMtY29udGVudC1lbGVtZW50Om5vdCguY2hlY2tib3gtbGlzdCkge1xcbiAgICBwYWRkaW5nLWxlZnQ6IDEuNXJlbSAhaW1wb3J0YW50O1xcbn1cXG5cXG4vKiogYW5kIGxpc3QgKiovXFxuXFxuXFxuXFxuLmJsb2NrPi5kcmFnLWhhbmRsZXIge1xcbiAgICBjb2xvcjogIzg0ODg4ZDtcXG4gICAgdmlzaWJpbGl0eTogaGlkZGVuO1xcbiAgICBjdXJzb3I6IGdyYWI7XFxuICAgIGFsaWduLXNlbGY6IHN0YXJ0O1xcblxcbiAgICAvKiBiYWNrZ3JvdW5kLWNvbG9yOiBwaW5rOyAqL1xcbiAgICBwYWRkaW5nLXRvcDogMC4zM3JlbTtcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcbn1cXG5cXG4uZHJhZy1oYW5kbGVyIHN2ZyB7XFxuICAgIC8qIGJhY2tncm91bmQtY29sb3I6IHJlZDsgKi9cXG59XFxuXFxuLmRyYWctaGFuZGxlciBzdmcgdXNlIHtcXG4gICAgLyogYmFja2dyb3VuZC1jb2xvcjogYmx1ZTsgKi9cXG59XFxuXFxuLmRyYWctaGFuZGxlcjphY3RpdmUge1xcbiAgICBjdXJzb3I6IGdyYWJiaW5nO1xcbn1cXG5cXG4uYmxvY2sge1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xcbiAgICBtYXJnaW4tYm90dG9tOiAxcmVtO1xcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XFxufVxcblxcbi5ibG9jaz4qOm5vdCguZHJhZy1oYW5kbGVyKSB7XFxuICAgIHBhZGRpbmctbGVmdDogMS4yNXJlbTtcXG59XFxuXFxuLmJsb2NrOmhvdmVyIC5kcmFnLWhhbmRsZXIge1xcbiAgICB2aXNpYmlsaXR5OiB2aXNpYmxlO1xcbiAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wO1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHN0YXJ0O1xcbn1cXG5cXG4uZHJvcC1saW5lIHtcXG4gICAgaGVpZ2h0OiAxcmVtO1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjODQ4ODhkO1xcbiAgICB3aWR0aDogMTAwJTtcXG59XFxuXFxuXFxuLnRpdGxlIGgxIHtcXG4gICAgbWFyZ2luLWxlZnQ6IDEuM3JlbTtcXG59XFxuXFxuaDFbZGF0YS1wbGFjZWhvbGRlcl06ZW1wdHk6YmVmb3JlIHtcXG4gICAgY29udGVudDogYXR0cihkYXRhLXBsYWNlaG9sZGVyKTtcXG4gICAgY29sb3I6ICM4NDg4OGQgIWltcG9ydGFudDtcXG4gICAgZGlzcGxheTogYmxvY2s7XFxufVxcblxcbmgxW2RhdGEtcGxhY2Vob2xkZXJdOmZvY3VzOmJlZm9yZSB7fVxcblxcblxcbipbY29udGVudGVkaXRhYmxlPVxcXCJ0cnVlXFxcIl06bm90KGgxKTplbXB0eTpiZWZvcmUge1xcbiAgICBjb250ZW50OiBhdHRyKGRhdGEtcGxhY2Vob2xkZXIpO1xcbiAgICBjb2xvcjogIzg0ODg4YWNkO1xcbiAgICBkaXNwbGF5OiBub25lO1xcbn1cXG5cXG4qW2NvbnRlbnRlZGl0YWJsZT1cXFwidHJ1ZVxcXCJdOm5vdChoMSk6ZW1wdHk6aG92ZXI6YmVmb3JlIHtcXG4gICAgZGlzcGxheTogYmxvY2s7XFxufVxcblxcbmNpdGVbY29udGVudGVkaXRhYmxlPVxcXCJ0cnVlXFxcIl06ZW1wdHk6YmVmb3JlIHtcXG4gICAgZGlzcGxheTogYmxvY2s7XFxufVxcblxcbipbY29udGVudGVkaXRhYmxlPVxcXCJ0cnVlXFxcIl06bm90KGgxKVtkYXRhLXBsYWNlaG9sZGVyXTplbXB0eTpmb2N1czpiZWZvcmUge1xcbiAgICBjb250ZW50OiBhdHRyKGRhdGEtcGxhY2Vob2xkZXIpO1xcbiAgICBjb2xvcjogIzg0ODg4YWNkICFpbXBvcnRhbnQ7XFxuICAgIGRpc3BsYXk6IGJsb2NrO1xcbn1cXG5cXG5cXG5cXG5oMSB7XFxuICAgIGZvbnQtc2l6ZTogMi41cmVtO1xcbiAgICBmb250LXdlaWdodDogYm9sZGVyICFpbXBvcnRhbnQ7XFxufVxcblxcbi5qb2hhbm5lcy1lZGl0b3Ige1xcbiAgICB3aWR0aDogMTAwJTtcXG5cXG59XFxuXFxuLmNvbnRlbnQge1xcbiAgICB3aWR0aDogMTAwJTtcXG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXG5cXG5cXG59XFxuXFxucHJlIHtcXG4gICAgd2lkdGg6IDEwMCU7XFxufVxcblxcbltjb250ZW50ZWRpdGFibGVdIHtcXG4gICAgb3V0bGluZTogbm9uZTtcXG59XFxuXFxuYm9keSB7XFxuICAgIGhlaWdodDogMjAwMHB4O1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjBmMGYxICFpbXBvcnRhbnQ7XFxuXFxuICAgIGZvbnQtZmFtaWx5OiBzeXN0ZW0tdWksIC1hcHBsZS1zeXN0ZW0sIFxcXCJTZWdvZSBVSVxcXCIsIFJvYm90bywgXFxcIkhlbHZldGljYSBOZXVlXFxcIiwgXFxcIk5vdG8gU2Fuc1xcXCIsIFxcXCJMaWJlcmF0aW9uIFNhbnNcXFwiLCBBcmlhbCwgc2Fucy1zZXJpZiwgXFxcIkFwcGxlIENvbG9yIEVtb2ppXFxcIiwgXFxcIlNlZ29lIFVJIEVtb2ppXFxcIiwgXFxcIlNlZ29lIFVJIFN5bWJvbFxcXCIsIFxcXCJOb3RvIENvbG9yIEVtb2ppXFxcIjtcXG59XFxuXFxuXFxuLmVkaXRvciB7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIG1hcmdpbi10b3A6IDgwcHg7XFxufVxcblxcbnAge1xcbiAgICBjb2xvcjogIzI0MjQyNDtcXG59XFxuXFxuXFxuLmJsb2NrLFxcbi5ibG9jayAqIHtcXG4gICAgdXNlci1zZWxlY3Q6IHRleHQ7XFxufVxcblxcblxcbi5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQge1xcbiAgICB3aWR0aDogMTAwJTtcXG4gICAgcGFkZGluZzogMDtcXG4gICAgbWFyZ2luOiAwO1xcbiAgICAvKiBiYWNrZ3JvdW5kLWNvbG9yOiBncmVlbjsgKi9cXG59XFxuXFxuXFxuI2pvaGFubmVzRWRpdG9yIHtcXG4gICAgd2lkdGg6IDYwJTtcXG4gICAgbWFyZ2luLWxlZnQ6IGF1dG87XFxuICAgIG1hcmdpbi1yaWdodDogYXV0bztcXG59XFxuXFxuLmpvaGFubmVzLWVkaXRvciBociB7XFxuICAgIHdpZHRoOiAxMDAlO1xcbiAgICBoZWlnaHQ6IDJweDtcXG4gICAgdmlzaWJpbGl0eTogdmlzaWJsZTtcXG4gICAgYm9yZGVyOiBub25lO1xcbiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgcmdiYSg1NSwgNTMsIDQ3LCAwLjE2KTtcXG59XFxuXFxuXFxuXFxuLmpvaGFubmVzLWVkaXRvciBibG9ja3F1b3RlIHtcXG4gICAgbWFyZ2luOiAwLjVyZW0gMDtcXG4gICAgcGFkZGluZy1sZWZ0OiAyMHB4O1xcbiAgICBib3JkZXItbGVmdDogNHB4IHNvbGlkIHJnYig1NSwgNTMsIDQ3KTtcXG4gICAgZm9udC1zdHlsZTogaXRhbGljXFxufVxcblxcbi5qb2hhbm5lcy1lZGl0b3IgY2l0ZSB7XFxuICAgIHBhZGRpbmctdG9wOiAxcmVtICFpbXBvcnRhbnQ7XFxuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG59XFxuXFxuXFxuLmpvaGFubmVzLWVkaXRvciBjaXRlOjpiZWZvcmUge1xcbiAgICBjb250ZW50OiAn4oCUICc7XFxufVxcblxcblxcblxcblxcblxcblxcblxcblxcblxcblxcblxcblxcblxcblxcblxcblxcblxcblxcblxcblxcblxcblxcblxcblxcblxcblxcblxcblxcblxcblxcblxcbiNsaW5rQm94IHtcXG4gICAgYm9yZGVyLXJhZGl1czogMnB4O1xcbiAgICBwYWRkaW5nOiAyMHB4O1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjlmOWY5O1xcblxcblxcbiAgICBib3gtc2hhZG93OlxcbiAgICAgICAgMCA0cHggNnB4IHJnYmEoMCwgMCwgMCwgMC4xKSxcXG4gICAgICAgIDAgLTJweCA0cHggcmdiYSgwLCAwLCAwLCAwLjAyKSxcXG4gICAgICAgIC0ycHggMCA0cHggcmdiYSgwLCAwLCAwLCAwLjAyKSxcXG4gICAgICAgIDJweCAwIDRweCByZ2JhKDAsIDAsIDAsIDAuMDIpO1xcblxcblxcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjZDBkMGQwO1xcbiAgICB3aWR0aDogZml0LWNvbnRlbnQ7XFxuICAgIHotaW5kZXg6IDk5OTk5OTtcXG4gICAgY29sb3I6IHJnYigxMjAsIDExOSwgMTE2KTtcXG4gICAgYm9yZGVyLXJhZGl1czogbm9uZTtcXG59XFxuXFxuXFxuI2xpbmtCb3ggaW5wdXQge1xcbiAgICB3aWR0aDogMzE2cHg7XFxuICAgIHBhZGRpbmc6IDhweCA0MHB4IDhweCAxNnB4O1xcbiAgICAvKiBib3JkZXItY29sb3I6ICNkMGQwZDA7ICovXFxuXFxuICAgIGJvcmRlcjogMXB4IHNvbGlkICM5NDk0OTQ7XFxuICAgIC8qIGJvcmRlci1yYWRpdXM6IDRweDsgKi9cXG4gICAgaGVpZ2h0OiAyNHB4O1xcblxcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG59XFxuXFxuXFxuI2xpbmtCb3ggaW5wdXQ6OnNlbGVjdGlvbixcXG4jbGlua0JveCBpbnB1dDpmb2N1cyB7XFxuICAgIGJvcmRlci1yYWRpdXM6IG5vbmU7XFxufVxcblxcblxcblxcblxcblxcblxcblxcblxcbi8qKiBUZXh0IGZvcm1hdHRpbmcgQmFyICoqL1xcblxcblxcblxcbiNmbG9hdGluZ1Rvb2xiYXIge1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XFxuICAgIHBhZGRpbmc6IDhweCAxNnB4O1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjlmOWY5O1xcbiAgICB3aWR0aDogZml0LWNvbnRlbnQ7XFxuICAgIHotaW5kZXg6IDk5OTk5OTtcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgICB1c2VyLXNlbGVjdDogbm9uZTtcXG59XFxuXFxuLyogVE9ETzogcmVtb3ZlIHRoaXMqL1xcbnNwYW4ge1xcbiAgICBmb250LWZhbWlseTogQXJpYWwsIHNhbnMtc2VyaWY7XFxufVxcblxcblxcbiNmbG9hdGluZ1Rvb2xiYXIgLml0ZW0ge1xcbiAgICBjb2xvcjogcmdiKDEyMCwgMTE5LCAxMTYpO1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xcbiAgICBnYXA6IDEwcHg7XFxufVxcblxcbiNmbG9hdGluZ1Rvb2xiYXIgLml0ZW0+YnV0dG9uIHtcXG5cXG4gICAgZGlzcGxheTogaW5saW5lLWZsZXg7XFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxufVxcblxcblxcbiNmbG9hdGluZ1Rvb2xiYXIgc2VsZWN0IHtcXG4gICAgY29sb3I6IHJnYigxMjAsIDExOSwgMTE2KTtcXG4gICAgYm9yZGVyOiBub25lO1xcbiAgICBmb250LXNpemU6IDAuODVyZW07XFxuICAgIGJhY2tncm91bmQtY29sb3I6IGluaGVyaXQ7XFxufVxcblxcbi5zZWxlY3Qtd3JhcHBlciB7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxufVxcblxcbi5zZWxlY3Qtd3JhcHBlciB1bCB7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgYmFja2dyb3VuZDogI2Y5ZjlmOTtcXG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcXG4gICAgd2lkdGg6IGZpdC1jb250ZW50O1xcbiAgICBwYWRkaW5nLWJvdHRvbTogMC41cmVtO1xcbiAgICBwYWRkaW5nLWxlZnQ6IDVweDtcXG4gICAgcGFkZGluZy1yaWdodDogNXB4O1xcbiAgICB0b3A6IDIuMnJlbTtcXG4gICAgY29sb3I6IHJnYig1NSwgNTMsIDQ3KTtcXG4gICAgcGFkZGluZy1yaWdodDogMC4zMTI1cmVtO1xcbn1cXG5cXG5cXG5cXG4uc2VsZWN0LXdyYXBwZXIgdWwgbGkge1xcbiAgICAvKiBkaXNwbGF5OiBmbGV4O1xcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93ICFpbXBvcnRhbnQ7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHllbGxvdzsgKi9cXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gICAgZ2FwOiAwLjYyNXJlbTtcXG4gICAgcGFkZGluZzogMC4xODc1cmVtIDAuMzEyNXJlbTtcXG4gICAgYm9yZGVyLXJhZGl1czogMC4xODc1cmVtO1xcbiAgICB1c2VyLXNlbGVjdDogbm9uZSAhaW1wb3J0YW50O1xcblxcbiAgICBmb250LXNpemU6IHNtYWxsICFpbXBvcnRhbnQ7XFxuICAgIGZvbnQtd2VpZ2h0OiA1MDA7XFxufVxcblxcbi5zZWxlY3Qtd3JhcHBlciB1bCBsaSBzcGFuIHtcXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbiAgICB3aWR0aDogbWF4LWNvbnRlbnQ7XFxufVxcblxcbi5zZWxlY3Qtd3JhcHBlciB1bCBsaSAub3B0aW9uLWltYWdlIHtcXG4gICAgd2lkdGg6IDEuMzc1cmVtO1xcbiAgICBoZWlnaHQ6IDEuMzc1cmVtO1xcbiAgICBjb2xvcjogIzI0MjQyNDtcXG4gICAgcGFkZGluZzogMCAhaW1wb3J0YW50O1xcbiAgICBtYXJnaW46IDAgIWltcG9ydGFudDtcXG59XFxuXFxuLnNlbGVjdC13cmFwcGVyIHVsIGxpIC5vcHRpb24taW1hZ2Ugc3ZnIHtcXG4gICAgY29sb3I6ICM0ZjRmNGY7XFxuICAgIHBhZGRpbmc6IDAgIWltcG9ydGFudDtcXG4gICAgbWFyZ2luOiAwICFpbXBvcnRhbnQ7XFxufVxcblxcbi50ZXh0LWZvcm1hdHRpbmctc2VsZWN0LWJ1dHRvbiB7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxufVxcblxcbiN0dXJuSW50b0J1dHRvbiBzcGFuIHtcXG4gICAgZGlzcGxheTogaW5saW5lLWZsZXg7XFxuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XFxuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xcbiAgICBmb250LXNpemU6IDAuOXJlbTtcXG5cXG59XFxuXFxuI3R1cm5JbnRvQnV0dG9uIHN2ZyB1c2Uge1xcbiAgICBtYXJnaW46IGF1dG87XFxufVxcblxcbi5zZWxlY3Qtd3JhcHBlciB7XFxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gICAgY29sb3I6IHJnYigxMjAsIDExOSwgMTE2KTtcXG59XFxuXFxuXFxuLnNlbGVjdC13cmFwcGVyID4gYnV0dG9uIHtcXG4gICAgY29sb3I6IHJnYmEoNTUsIDUzLCA0NywgMC44NSk7XFxufVxcblxcblxcblxcblxcblxcblxcblxcbmNvZGU6bm90KHByZSBjb2RlKSB7XFxuICAgIG1hcmdpbjogMDtcXG4gICAgcGFkZGluZzogMDtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2QwZDBkMDtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2Y2ZjVmNDtcXG4gICAgZm9udC1zaXplOiBpbmhlcml0O1xcbiAgICBmb250LXNpemU6IDFyZW0gIWltcG9ydGFudDtcXG4gICAgYm9yZGVyOiAxcHggc29saWQgIzAwMDAwMDFhO1xcbiAgICBwYWRkaW5nOiAwIDNweDtcXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XFxuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxufVxcblxcblxcblxcblxcbmE6bm90KFtocmVmXSkge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZDNlM2ZkO1xcbn1cXG5cXG4udGV4dC1mb3JtYXR0aW5nLWJ1dHRvbi1hY3RpdmUge1xcbiAgICBjb2xvcjogIzIzODJlMjtcXG59XFxuXFxuLnRleHQtZm9ybWF0dGluZy1jaXJjbGUtYWN0aXZlIHtcXG4gICAgYm9yZGVyLWNvbG9yOiAjMjM4MmUyICFpbXBvcnRhbnQ7XFxufVxcblxcblxcblxcbiNtb3JlVGV4dE9wdGlvblNlbGVjdCB7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG59XFxuXFxuLm1vcmVUZXh0T3B0aW9uV3JhcHBlciB7XFxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG59XFxuXFxuXFxuLnNlbGVjdC13cmFwcGVyIHVsIGxpPmgzIHtcXG4gICAgbWFyZ2luOiAwO1xcbiAgICBmb250LXNpemU6IHNtYWxsICFpbXBvcnRhbnQ7XFxuICAgIGNvbG9yOiAjMzczNTJmYTY7XFxuICAgIG1hcmdpbjogMDtcXG4gICAgcGFkZGluZzogMDtcXG4gICAgZm9udC13ZWlnaHQ6IDYwMCAhaW1wb3J0YW50O1xcbiAgICBtYXJnaW4tdG9wOiAwLjMxMjVyZW07XFxuICAgIG1hcmdpbi1ib3R0b206IDAuMzEyNXJlbTtcXG59XFxuXFxuXFxuLmJnYy1yZWQge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkRERURFO1xcbn1cXG5cXG4uYmdjLWdyZWVuIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI0Q3RjdEQztcXG59XFxuXFxuLmJnYy1ibHVlIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI0Q5RURGNjtcXG59XFxuXFxuLmJnYy15ZWxsb3cge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkFGNEQxO1xcbn1cXG5cXG4uYmdjLWdyZXkge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRTFFMEUwO1xcbn1cXG5cXG5wLFxcbm1hcmsge1xcbiAgICBsaW5lLWhlaWdodDogMTtcXG59XFxuXFxuI3R1cm5JbnRvU2VsZWN0IC5vcHRpb24taW1hZ2Uge1xcbiAgICAvKiBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7ICovXFxufVxcblxcbi5ib3JkZXItbGVzcy1pbWFnZSB7XFxuICAgIHdpZHRoOiAyNHB4O1xcbiAgICBoZWlnaHQ6IDI0cHg7XFxufVxcblxcblxcblxcblxcbi8qKiBCbG9jayBPcHRpb25zICoqL1xcbi5zb2Z0LWJveC1zaGFkb3cge1xcbiAgICBtYXJnaW46IDA7XFxuICAgIHBhZGRpbmc6IDA7XFxuICAgIGJvcmRlci1yYWRpdXM6IDJweDtcXG4gICAgYm94LXNoYWRvdzpcXG4gICAgICAgIDAgNHB4IDZweCByZ2JhKDAsIDAsIDAsIDAuMSksXFxuICAgICAgICAwIC0ycHggNHB4IHJnYmEoMjE2LCAxOTYsIDE5NiwgMC4wMiksXFxuICAgICAgICAtMnB4IDAgNHB4IHJnYmEoMCwgMCwgMCwgMC4wMiksXFxuICAgICAgICAycHggMCA0cHggcmdiYSgwLCAwLCAwLCAwLjAyKTtcXG5cXG4gICAgYm9yZGVyOiAxcHggc29saWQgI2QwZDBkMDtcXG59XFxuXFxuLmJsb2NrLW9wdGlvbnMtd3JhcHBlciB7XFxuICAgIHotaW5kZXg6IDk5OTk5OTtcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgICBkaXNwbGF5OiBub25lO1xcbn1cXG5cXG4uYmxvY2stb3B0aW9ucyB7XFxuICAgIHdpZHRoOiBmaXQtY29udGVudDtcXG4gICAgbWF4LWhlaWdodDogMTlyZW07XFxuICAgIG92ZXJmbG93LXk6IGF1dG87XFxufVxcblxcbi5ibG9jay1vcHRpb25zIHtcXG4gICAgcGFkZGluZzogMCAwLjYyNXJlbTtcXG4gICAgYmFja2dyb3VuZDogI2Y5ZjlmOTtcXG59XFxuXFxuLmJsb2NrLW9wdGlvbnMgc2VjdGlvbiBoMiB7XFxuICAgIGZvbnQtc2l6ZTogc21hbGwgIWltcG9ydGFudDtcXG4gICAgY29sb3I6ICMzNzM1MmZhNjtcXG4gICAgbWFyZ2luOiAwO1xcbiAgICBwYWRkaW5nOiAwO1xcbiAgICBmb250LXdlaWdodDogNjAwICFpbXBvcnRhbnQ7XFxuICAgIG1hcmdpbi10b3A6IDAuMzEyNXJlbTtcXG4gICAgbWFyZ2luLWJvdHRvbTogMC4zMTI1cmVtO1xcbiAgICBwYWRkaW5nLWxlZnQ6IDAuMzEyNXJlbTtcXG59XFxuXFxuLmJsb2NrLW9wdGlvbnMgLm9wdGlvbiB7XFxuICAgIHBhZGRpbmc6IDAuMzEyNXJlbSAwLjYyNXJlbTtcXG4gICAgbWFyZ2luOiAwLjMxMjVyZW0gMDtcXG4gICAgY3Vyc29yOiBwb2ludGVyO1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGxlZnQ7XFxuICAgIGdhcDogMC42cmVtO1xcbiAgICBib3JkZXItcmFkaXVzOiAzcHg7XFxufVxcblxcbi5ibG9jay1vcHRpb25zIC5vcHRpb246Zm9jdXMge1xcbiAgICBvdXRsaW5lOiBub25lO1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTllOWU5O1xcbiAgICBib3JkZXI6IGluaGVyaXQ7XFxufVxcblxcbi5vcHRpb24tZm9jdXNlZCB7XFxuICAgIG91dGxpbmU6IG5vbmU7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNlOWU5ZTk7XFxuICAgIGJvcmRlcjogbm9uZTtcXG59XFxuXFxuI2RlbGV0ZU9wdGlvbi5vcHRpb24tZm9jdXNlZCB7XFxuICAgIGNvbG9yOiAjRUI1NzU3ICFpbXBvcnRhbnQ7XFxufVxcblxcbiNkZWxldGVPcHRpb24ub3B0aW9uLWZvY3VzZWQgc3ZnIHtcXG4gICAgY29sb3I6ICNFQjU3NTcgIWltcG9ydGFudDtcXG59XFxuXFxuXFxuXFxuLmJsb2NrLW9wdGlvbnMgLm9wdGlvbjpmb2N1cy12aXNpYmxlIHtcXG4gICAgb3V0bGluZTogbm9uZTtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2U5ZTllOTtcXG4gICAgYm9yZGVyOiBpbmhlcml0O1xcbn1cXG5cXG4vKiAub3B0aW9uLWhvdmVyOmhvdmVyIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2U5ZTllOTtcXG4gICAgYm94LXNoYWRvdzogMHB4IDBweCAwcHggMnB4ICNlOWU5ZTk7XFxuICAgIGJvcmRlci1yYWRpdXM6IDFweDtcXG4gICAgdHJhbnNpdGlvbjogMC4xcyBlYXNlO1xcbn0gKi9cXG5cXG4vKiAuc2VsZWN0LXdyYXBwZXI+YnV0dG9uLCAqL1xcblxcbi8qICN0dXJuSW50b0J1dHRvbixcXG4jY29sb3JUZXh0QnV0dG9uIHtcXG4gICAgcGFkZGluZy1sZWZ0OiA0cHg7XFxufSAqL1xcblxcbiN0dXJuSW50b0J1dHRvbjpub3QoW2Rpc2FibGVkXSk6aG92ZXIsXFxuI2NvbG9yVGV4dEJ1dHRvbjpub3QoW2Rpc2FibGVkXSk6aG92ZXIsXFxuI21vcmVUZXh0T3B0aW9uQnV0dG9uOm5vdChbZGlzYWJsZWRdKTpob3ZlcixcXG4jZmxvYXRpbmdUb29sYmFyIC5pdGVtPmJ1dHRvbjpub3QoW2Rpc2FibGVkXSk6aG92ZXIge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTllOWU5O1xcbiAgICBib3gtc2hhZG93OiAwcHggMHB4IDBweCAycHggI2U5ZTllOTtcXG4gICAgYm9yZGVyLXJhZGl1czogMXB4O1xcbiAgICB0cmFuc2l0aW9uOiAwLjFzIGVhc2U7XFxufVxcblxcblxcblxcbi5vcHRpb25bZm9jdXNlZD1cXFwidHJ1ZVxcXCJdIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2JkZTRmZjtcXG59XFxuXFxuXFxuXFxuXFxuXFxuLm9wdGlvbi1pbWFnZSB7XFxuICAgIHdpZHRoOiAyLjg3NXJlbTtcXG4gICAgaGVpZ2h0OiAyLjg3NXJlbTtcXG4gICAgYm9yZGVyLXJhZGl1czogMC4xODc1cmVtO1xcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjY2NjO1xcbiAgICBjb2xvcjogIzRmNGY0ZjtcXG5cXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcXG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XFxuICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmO1xcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcbn1cXG5cXG4ub3B0aW9uLWltYWdlIGltZyB7XFxuICAgIG1heC13aWR0aDogMi44NzVyZW07XFxuICAgIG1heC1oZWlnaHQ6IDIuODc1cmVtO1xcbn1cXG5cXG4ub3B0aW9uLWltYWdlIHN2ZyB7XFxuICAgIG1hcmdpbjogMDtcXG4gICAgcGFkZGluZzogMDtcXG4gICAgcGFkZGluZzogMC42MjVyZW07XFxuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxuXFxufVxcblxcbi5vcHRpb24tdGV4dCAqIHtcXG4gICAgbWFyZ2luOiAwO1xcbiAgICBwYWRkaW5nOiAwO1xcblxcbn1cXG5cXG4ub3B0aW9uLXRleHQgLmJsb2NrLXRpdGxlIHtcXG4gICAgZm9udC1zaXplOiBzbWFsbCAhaW1wb3J0YW50O1xcbiAgICBmb250LXdlaWdodDogNTAwO1xcbn1cXG5cXG4ub3B0aW9uLXRleHQgLmJsb2NrLWRlc2NyaXB0aW9uIHtcXG4gICAgZm9udC1zaXplOiBzbWFsbCAhaW1wb3J0YW50O1xcbiAgICBjb2xvcjogcmdiYSg1NSwgNTMsIDQ3LCAwLjUpO1xcbn1cXG5cXG4vKiogRW5kIEJsb2NrIE9wdGlvbnMgKiovXFxuXFxuXFxuXFxuI2RlbGV0ZUJsb2NrQnV0dG9uOmhvdmVyIHN2ZyxcXG4jZGVsZXRlQmxvY2tCdXR0b246aG92ZXIge1xcbiAgICBjb2xvcjogcmdiKDIzNSwgODcsIDg3KSAhaW1wb3J0YW50O1xcbn1cXG5cXG5cXG5cXG4uam9oYW5uZXMtZWRpdG9yICo6OnNlbGVjdGlvbiB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMjExLCAyMjcsIDI1MywgMC41KSAhaW1wb3J0YW50O1xcbn1cXG5cXG4uam9oYW5uZXMtZWRpdG9yIG1hcmssXFxuLmpvaGFubmVzLWVkaXRvciAqIHtcXG4gICAgbGluZS1oZWlnaHQ6IDEuNSAhaW1wb3J0YW50O1xcbn1cXG5cXG4ub3B0aW9uIHtcXG4gICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xcbn1cXG5cXG4udGV4dC1vcHRpb24ge1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHN0YXJ0O1xcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xcbiAgICBnYXA6IDAuNjI1cmVtO1xcbn1cXG5cXG5cXG5cXG5cXG46cm9vdCB7XFxuICAgIC8qIGZvbnQtc2l6ZTogMTZweDsgKi9cXG4gICAgLyogVGFtYW5obyBwYWRyw6NvICovXFxufVxcblxcbi8qIFBhcmEgdGVsYXMgY29tIGRlbnNpZGFkZSBtw6lkaWEgKi9cXG5AbWVkaWEgb25seSBzY3JlZW4gYW5kICgtd2Via2l0LW1pbi1kZXZpY2UtcGl4ZWwtcmF0aW86IDIpLFxcbm9ubHkgc2NyZWVuIGFuZCAobWluLS1tb3otZGV2aWNlLXBpeGVsLXJhdGlvOiAyKSxcXG5vbmx5IHNjcmVlbiBhbmQgKG1pbi1yZXNvbHV0aW9uOiAxOTJkcGkpLFxcbm9ubHkgc2NyZWVuIGFuZCAobWluLXJlc29sdXRpb246IDJkcHB4KSB7XFxuICAgIDpyb290IHtcXG4gICAgICAgIGZvbnQtc2l6ZTogMThweDtcXG4gICAgICAgIC8qIEF1bWVudGEgbyB0YW1hbmhvIGRhIGZvbnRlIHBhcmEgdGVsYXMgZGUgYWx0YSBkZW5zaWRhZGUgKi9cXG4gICAgfVxcbn1cXG5cXG4vKiBQYXJhIHRlbGFzIGNvbSBhbHTDrXNzaW1hIGRlbnNpZGFkZSAqL1xcbkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKC13ZWJraXQtbWluLWRldmljZS1waXhlbC1yYXRpbzogMyksXFxub25seSBzY3JlZW4gYW5kIChtaW4tLW1vei1kZXZpY2UtcGl4ZWwtcmF0aW86IDMpLFxcbm9ubHkgc2NyZWVuIGFuZCAobWluLXJlc29sdXRpb246IDI4OGRwaSksXFxub25seSBzY3JlZW4gYW5kIChtaW4tcmVzb2x1dGlvbjogM2RwcHgpIHtcXG4gICAgOnJvb3Qge1xcbiAgICAgICAgZm9udC1zaXplOiAyMHB4O1xcbiAgICAgICAgLyogQWluZGEgbWFpb3IgcGFyYSB0ZWxhcyBkZSBkZW5zaWRhZGUgbXVpdG8gYWx0YSAqL1xcbiAgICB9XFxufVwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iLCJcInVzZSBzdHJpY3RcIjtcblxuLypcbiAgTUlUIExpY2Vuc2UgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHBcbiAgQXV0aG9yIFRvYmlhcyBLb3BwZXJzIEBzb2tyYVxuKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGNzc1dpdGhNYXBwaW5nVG9TdHJpbmcpIHtcbiAgdmFyIGxpc3QgPSBbXTtcblxuICAvLyByZXR1cm4gdGhlIGxpc3Qgb2YgbW9kdWxlcyBhcyBjc3Mgc3RyaW5nXG4gIGxpc3QudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgIHZhciBjb250ZW50ID0gXCJcIjtcbiAgICAgIHZhciBuZWVkTGF5ZXIgPSB0eXBlb2YgaXRlbVs1XSAhPT0gXCJ1bmRlZmluZWRcIjtcbiAgICAgIGlmIChpdGVtWzRdKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJAc3VwcG9ydHMgKFwiLmNvbmNhdChpdGVtWzRdLCBcIikge1wiKTtcbiAgICAgIH1cbiAgICAgIGlmIChpdGVtWzJdKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJAbWVkaWEgXCIuY29uY2F0KGl0ZW1bMl0sIFwiIHtcIik7XG4gICAgICB9XG4gICAgICBpZiAobmVlZExheWVyKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJAbGF5ZXJcIi5jb25jYXQoaXRlbVs1XS5sZW5ndGggPiAwID8gXCIgXCIuY29uY2F0KGl0ZW1bNV0pIDogXCJcIiwgXCIge1wiKTtcbiAgICAgIH1cbiAgICAgIGNvbnRlbnQgKz0gY3NzV2l0aE1hcHBpbmdUb1N0cmluZyhpdGVtKTtcbiAgICAgIGlmIChuZWVkTGF5ZXIpIHtcbiAgICAgICAgY29udGVudCArPSBcIn1cIjtcbiAgICAgIH1cbiAgICAgIGlmIChpdGVtWzJdKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJ9XCI7XG4gICAgICB9XG4gICAgICBpZiAoaXRlbVs0XSkge1xuICAgICAgICBjb250ZW50ICs9IFwifVwiO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNvbnRlbnQ7XG4gICAgfSkuam9pbihcIlwiKTtcbiAgfTtcblxuICAvLyBpbXBvcnQgYSBsaXN0IG9mIG1vZHVsZXMgaW50byB0aGUgbGlzdFxuICBsaXN0LmkgPSBmdW5jdGlvbiBpKG1vZHVsZXMsIG1lZGlhLCBkZWR1cGUsIHN1cHBvcnRzLCBsYXllcikge1xuICAgIGlmICh0eXBlb2YgbW9kdWxlcyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgbW9kdWxlcyA9IFtbbnVsbCwgbW9kdWxlcywgdW5kZWZpbmVkXV07XG4gICAgfVxuICAgIHZhciBhbHJlYWR5SW1wb3J0ZWRNb2R1bGVzID0ge307XG4gICAgaWYgKGRlZHVwZSkge1xuICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCB0aGlzLmxlbmd0aDsgaysrKSB7XG4gICAgICAgIHZhciBpZCA9IHRoaXNba11bMF07XG4gICAgICAgIGlmIChpZCAhPSBudWxsKSB7XG4gICAgICAgICAgYWxyZWFkeUltcG9ydGVkTW9kdWxlc1tpZF0gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAodmFyIF9rID0gMDsgX2sgPCBtb2R1bGVzLmxlbmd0aDsgX2srKykge1xuICAgICAgdmFyIGl0ZW0gPSBbXS5jb25jYXQobW9kdWxlc1tfa10pO1xuICAgICAgaWYgKGRlZHVwZSAmJiBhbHJlYWR5SW1wb3J0ZWRNb2R1bGVzW2l0ZW1bMF1dKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBsYXllciAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICBpZiAodHlwZW9mIGl0ZW1bNV0gPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICBpdGVtWzVdID0gbGF5ZXI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaXRlbVsxXSA9IFwiQGxheWVyXCIuY29uY2F0KGl0ZW1bNV0ubGVuZ3RoID4gMCA/IFwiIFwiLmNvbmNhdChpdGVtWzVdKSA6IFwiXCIsIFwiIHtcIikuY29uY2F0KGl0ZW1bMV0sIFwifVwiKTtcbiAgICAgICAgICBpdGVtWzVdID0gbGF5ZXI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChtZWRpYSkge1xuICAgICAgICBpZiAoIWl0ZW1bMl0pIHtcbiAgICAgICAgICBpdGVtWzJdID0gbWVkaWE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaXRlbVsxXSA9IFwiQG1lZGlhIFwiLmNvbmNhdChpdGVtWzJdLCBcIiB7XCIpLmNvbmNhdChpdGVtWzFdLCBcIn1cIik7XG4gICAgICAgICAgaXRlbVsyXSA9IG1lZGlhO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoc3VwcG9ydHMpIHtcbiAgICAgICAgaWYgKCFpdGVtWzRdKSB7XG4gICAgICAgICAgaXRlbVs0XSA9IFwiXCIuY29uY2F0KHN1cHBvcnRzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpdGVtWzFdID0gXCJAc3VwcG9ydHMgKFwiLmNvbmNhdChpdGVtWzRdLCBcIikge1wiKS5jb25jYXQoaXRlbVsxXSwgXCJ9XCIpO1xuICAgICAgICAgIGl0ZW1bNF0gPSBzdXBwb3J0cztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbGlzdC5wdXNoKGl0ZW0pO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIGxpc3Q7XG59OyIsIlwidXNlIHN0cmljdFwiO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdGVtKSB7XG4gIHZhciBjb250ZW50ID0gaXRlbVsxXTtcbiAgdmFyIGNzc01hcHBpbmcgPSBpdGVtWzNdO1xuICBpZiAoIWNzc01hcHBpbmcpIHtcbiAgICByZXR1cm4gY29udGVudDtcbiAgfVxuICBpZiAodHlwZW9mIGJ0b2EgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHZhciBiYXNlNjQgPSBidG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShjc3NNYXBwaW5nKSkpKTtcbiAgICB2YXIgZGF0YSA9IFwic291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsXCIuY29uY2F0KGJhc2U2NCk7XG4gICAgdmFyIHNvdXJjZU1hcHBpbmcgPSBcIi8qIyBcIi5jb25jYXQoZGF0YSwgXCIgKi9cIik7XG4gICAgcmV0dXJuIFtjb250ZW50XS5jb25jYXQoW3NvdXJjZU1hcHBpbmddKS5qb2luKFwiXFxuXCIpO1xuICB9XG4gIHJldHVybiBbY29udGVudF0uam9pbihcIlxcblwiKTtcbn07IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBzdHlsZXNJbkRPTSA9IFtdO1xuZnVuY3Rpb24gZ2V0SW5kZXhCeUlkZW50aWZpZXIoaWRlbnRpZmllcikge1xuICB2YXIgcmVzdWx0ID0gLTE7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3R5bGVzSW5ET00ubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoc3R5bGVzSW5ET01baV0uaWRlbnRpZmllciA9PT0gaWRlbnRpZmllcikge1xuICAgICAgcmVzdWx0ID0gaTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gbW9kdWxlc1RvRG9tKGxpc3QsIG9wdGlvbnMpIHtcbiAgdmFyIGlkQ291bnRNYXAgPSB7fTtcbiAgdmFyIGlkZW50aWZpZXJzID0gW107XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xuICAgIHZhciBpdGVtID0gbGlzdFtpXTtcbiAgICB2YXIgaWQgPSBvcHRpb25zLmJhc2UgPyBpdGVtWzBdICsgb3B0aW9ucy5iYXNlIDogaXRlbVswXTtcbiAgICB2YXIgY291bnQgPSBpZENvdW50TWFwW2lkXSB8fCAwO1xuICAgIHZhciBpZGVudGlmaWVyID0gXCJcIi5jb25jYXQoaWQsIFwiIFwiKS5jb25jYXQoY291bnQpO1xuICAgIGlkQ291bnRNYXBbaWRdID0gY291bnQgKyAxO1xuICAgIHZhciBpbmRleEJ5SWRlbnRpZmllciA9IGdldEluZGV4QnlJZGVudGlmaWVyKGlkZW50aWZpZXIpO1xuICAgIHZhciBvYmogPSB7XG4gICAgICBjc3M6IGl0ZW1bMV0sXG4gICAgICBtZWRpYTogaXRlbVsyXSxcbiAgICAgIHNvdXJjZU1hcDogaXRlbVszXSxcbiAgICAgIHN1cHBvcnRzOiBpdGVtWzRdLFxuICAgICAgbGF5ZXI6IGl0ZW1bNV1cbiAgICB9O1xuICAgIGlmIChpbmRleEJ5SWRlbnRpZmllciAhPT0gLTEpIHtcbiAgICAgIHN0eWxlc0luRE9NW2luZGV4QnlJZGVudGlmaWVyXS5yZWZlcmVuY2VzKys7XG4gICAgICBzdHlsZXNJbkRPTVtpbmRleEJ5SWRlbnRpZmllcl0udXBkYXRlcihvYmopO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgdXBkYXRlciA9IGFkZEVsZW1lbnRTdHlsZShvYmosIG9wdGlvbnMpO1xuICAgICAgb3B0aW9ucy5ieUluZGV4ID0gaTtcbiAgICAgIHN0eWxlc0luRE9NLnNwbGljZShpLCAwLCB7XG4gICAgICAgIGlkZW50aWZpZXI6IGlkZW50aWZpZXIsXG4gICAgICAgIHVwZGF0ZXI6IHVwZGF0ZXIsXG4gICAgICAgIHJlZmVyZW5jZXM6IDFcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZGVudGlmaWVycy5wdXNoKGlkZW50aWZpZXIpO1xuICB9XG4gIHJldHVybiBpZGVudGlmaWVycztcbn1cbmZ1bmN0aW9uIGFkZEVsZW1lbnRTdHlsZShvYmosIG9wdGlvbnMpIHtcbiAgdmFyIGFwaSA9IG9wdGlvbnMuZG9tQVBJKG9wdGlvbnMpO1xuICBhcGkudXBkYXRlKG9iaik7XG4gIHZhciB1cGRhdGVyID0gZnVuY3Rpb24gdXBkYXRlcihuZXdPYmopIHtcbiAgICBpZiAobmV3T2JqKSB7XG4gICAgICBpZiAobmV3T2JqLmNzcyA9PT0gb2JqLmNzcyAmJiBuZXdPYmoubWVkaWEgPT09IG9iai5tZWRpYSAmJiBuZXdPYmouc291cmNlTWFwID09PSBvYmouc291cmNlTWFwICYmIG5ld09iai5zdXBwb3J0cyA9PT0gb2JqLnN1cHBvcnRzICYmIG5ld09iai5sYXllciA9PT0gb2JqLmxheWVyKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGFwaS51cGRhdGUob2JqID0gbmV3T2JqKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXBpLnJlbW92ZSgpO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIHVwZGF0ZXI7XG59XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChsaXN0LCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBsaXN0ID0gbGlzdCB8fCBbXTtcbiAgdmFyIGxhc3RJZGVudGlmaWVycyA9IG1vZHVsZXNUb0RvbShsaXN0LCBvcHRpb25zKTtcbiAgcmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZShuZXdMaXN0KSB7XG4gICAgbmV3TGlzdCA9IG5ld0xpc3QgfHwgW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsYXN0SWRlbnRpZmllcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBpZGVudGlmaWVyID0gbGFzdElkZW50aWZpZXJzW2ldO1xuICAgICAgdmFyIGluZGV4ID0gZ2V0SW5kZXhCeUlkZW50aWZpZXIoaWRlbnRpZmllcik7XG4gICAgICBzdHlsZXNJbkRPTVtpbmRleF0ucmVmZXJlbmNlcy0tO1xuICAgIH1cbiAgICB2YXIgbmV3TGFzdElkZW50aWZpZXJzID0gbW9kdWxlc1RvRG9tKG5ld0xpc3QsIG9wdGlvbnMpO1xuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBsYXN0SWRlbnRpZmllcnMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICB2YXIgX2lkZW50aWZpZXIgPSBsYXN0SWRlbnRpZmllcnNbX2ldO1xuICAgICAgdmFyIF9pbmRleCA9IGdldEluZGV4QnlJZGVudGlmaWVyKF9pZGVudGlmaWVyKTtcbiAgICAgIGlmIChzdHlsZXNJbkRPTVtfaW5kZXhdLnJlZmVyZW5jZXMgPT09IDApIHtcbiAgICAgICAgc3R5bGVzSW5ET01bX2luZGV4XS51cGRhdGVyKCk7XG4gICAgICAgIHN0eWxlc0luRE9NLnNwbGljZShfaW5kZXgsIDEpO1xuICAgICAgfVxuICAgIH1cbiAgICBsYXN0SWRlbnRpZmllcnMgPSBuZXdMYXN0SWRlbnRpZmllcnM7XG4gIH07XG59OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgbWVtbyA9IHt9O1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIGdldFRhcmdldCh0YXJnZXQpIHtcbiAgaWYgKHR5cGVvZiBtZW1vW3RhcmdldF0gPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICB2YXIgc3R5bGVUYXJnZXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHRhcmdldCk7XG5cbiAgICAvLyBTcGVjaWFsIGNhc2UgdG8gcmV0dXJuIGhlYWQgb2YgaWZyYW1lIGluc3RlYWQgb2YgaWZyYW1lIGl0c2VsZlxuICAgIGlmICh3aW5kb3cuSFRNTElGcmFtZUVsZW1lbnQgJiYgc3R5bGVUYXJnZXQgaW5zdGFuY2VvZiB3aW5kb3cuSFRNTElGcmFtZUVsZW1lbnQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIFRoaXMgd2lsbCB0aHJvdyBhbiBleGNlcHRpb24gaWYgYWNjZXNzIHRvIGlmcmFtZSBpcyBibG9ja2VkXG4gICAgICAgIC8vIGR1ZSB0byBjcm9zcy1vcmlnaW4gcmVzdHJpY3Rpb25zXG4gICAgICAgIHN0eWxlVGFyZ2V0ID0gc3R5bGVUYXJnZXQuY29udGVudERvY3VtZW50LmhlYWQ7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIGlzdGFuYnVsIGlnbm9yZSBuZXh0XG4gICAgICAgIHN0eWxlVGFyZ2V0ID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gICAgbWVtb1t0YXJnZXRdID0gc3R5bGVUYXJnZXQ7XG4gIH1cbiAgcmV0dXJuIG1lbW9bdGFyZ2V0XTtcbn1cblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBpbnNlcnRCeVNlbGVjdG9yKGluc2VydCwgc3R5bGUpIHtcbiAgdmFyIHRhcmdldCA9IGdldFRhcmdldChpbnNlcnQpO1xuICBpZiAoIXRhcmdldCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkNvdWxkbid0IGZpbmQgYSBzdHlsZSB0YXJnZXQuIFRoaXMgcHJvYmFibHkgbWVhbnMgdGhhdCB0aGUgdmFsdWUgZm9yIHRoZSAnaW5zZXJ0JyBwYXJhbWV0ZXIgaXMgaW52YWxpZC5cIik7XG4gIH1cbiAgdGFyZ2V0LmFwcGVuZENoaWxkKHN0eWxlKTtcbn1cbm1vZHVsZS5leHBvcnRzID0gaW5zZXJ0QnlTZWxlY3RvcjsiLCJcInVzZSBzdHJpY3RcIjtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBpbnNlcnRTdHlsZUVsZW1lbnQob3B0aW9ucykge1xuICB2YXIgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzdHlsZVwiKTtcbiAgb3B0aW9ucy5zZXRBdHRyaWJ1dGVzKGVsZW1lbnQsIG9wdGlvbnMuYXR0cmlidXRlcyk7XG4gIG9wdGlvbnMuaW5zZXJ0KGVsZW1lbnQsIG9wdGlvbnMub3B0aW9ucyk7XG4gIHJldHVybiBlbGVtZW50O1xufVxubW9kdWxlLmV4cG9ydHMgPSBpbnNlcnRTdHlsZUVsZW1lbnQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzKHN0eWxlRWxlbWVudCkge1xuICB2YXIgbm9uY2UgPSB0eXBlb2YgX193ZWJwYWNrX25vbmNlX18gIT09IFwidW5kZWZpbmVkXCIgPyBfX3dlYnBhY2tfbm9uY2VfXyA6IG51bGw7XG4gIGlmIChub25jZSkge1xuICAgIHN0eWxlRWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJub25jZVwiLCBub25jZSk7XG4gIH1cbn1cbm1vZHVsZS5leHBvcnRzID0gc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzOyIsIlwidXNlIHN0cmljdFwiO1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIGFwcGx5KHN0eWxlRWxlbWVudCwgb3B0aW9ucywgb2JqKSB7XG4gIHZhciBjc3MgPSBcIlwiO1xuICBpZiAob2JqLnN1cHBvcnRzKSB7XG4gICAgY3NzICs9IFwiQHN1cHBvcnRzIChcIi5jb25jYXQob2JqLnN1cHBvcnRzLCBcIikge1wiKTtcbiAgfVxuICBpZiAob2JqLm1lZGlhKSB7XG4gICAgY3NzICs9IFwiQG1lZGlhIFwiLmNvbmNhdChvYmoubWVkaWEsIFwiIHtcIik7XG4gIH1cbiAgdmFyIG5lZWRMYXllciA9IHR5cGVvZiBvYmoubGF5ZXIgIT09IFwidW5kZWZpbmVkXCI7XG4gIGlmIChuZWVkTGF5ZXIpIHtcbiAgICBjc3MgKz0gXCJAbGF5ZXJcIi5jb25jYXQob2JqLmxheWVyLmxlbmd0aCA+IDAgPyBcIiBcIi5jb25jYXQob2JqLmxheWVyKSA6IFwiXCIsIFwiIHtcIik7XG4gIH1cbiAgY3NzICs9IG9iai5jc3M7XG4gIGlmIChuZWVkTGF5ZXIpIHtcbiAgICBjc3MgKz0gXCJ9XCI7XG4gIH1cbiAgaWYgKG9iai5tZWRpYSkge1xuICAgIGNzcyArPSBcIn1cIjtcbiAgfVxuICBpZiAob2JqLnN1cHBvcnRzKSB7XG4gICAgY3NzICs9IFwifVwiO1xuICB9XG4gIHZhciBzb3VyY2VNYXAgPSBvYmouc291cmNlTWFwO1xuICBpZiAoc291cmNlTWFwICYmIHR5cGVvZiBidG9hICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgY3NzICs9IFwiXFxuLyojIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2Jhc2U2NCxcIi5jb25jYXQoYnRvYSh1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoc291cmNlTWFwKSkpKSwgXCIgKi9cIik7XG4gIH1cblxuICAvLyBGb3Igb2xkIElFXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAgKi9cbiAgb3B0aW9ucy5zdHlsZVRhZ1RyYW5zZm9ybShjc3MsIHN0eWxlRWxlbWVudCwgb3B0aW9ucy5vcHRpb25zKTtcbn1cbmZ1bmN0aW9uIHJlbW92ZVN0eWxlRWxlbWVudChzdHlsZUVsZW1lbnQpIHtcbiAgLy8gaXN0YW5idWwgaWdub3JlIGlmXG4gIGlmIChzdHlsZUVsZW1lbnQucGFyZW50Tm9kZSA9PT0gbnVsbCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBzdHlsZUVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChzdHlsZUVsZW1lbnQpO1xufVxuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIGRvbUFQSShvcHRpb25zKSB7XG4gIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdXBkYXRlOiBmdW5jdGlvbiB1cGRhdGUoKSB7fSxcbiAgICAgIHJlbW92ZTogZnVuY3Rpb24gcmVtb3ZlKCkge31cbiAgICB9O1xuICB9XG4gIHZhciBzdHlsZUVsZW1lbnQgPSBvcHRpb25zLmluc2VydFN0eWxlRWxlbWVudChvcHRpb25zKTtcbiAgcmV0dXJuIHtcbiAgICB1cGRhdGU6IGZ1bmN0aW9uIHVwZGF0ZShvYmopIHtcbiAgICAgIGFwcGx5KHN0eWxlRWxlbWVudCwgb3B0aW9ucywgb2JqKTtcbiAgICB9LFxuICAgIHJlbW92ZTogZnVuY3Rpb24gcmVtb3ZlKCkge1xuICAgICAgcmVtb3ZlU3R5bGVFbGVtZW50KHN0eWxlRWxlbWVudCk7XG4gICAgfVxuICB9O1xufVxubW9kdWxlLmV4cG9ydHMgPSBkb21BUEk7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gc3R5bGVUYWdUcmFuc2Zvcm0oY3NzLCBzdHlsZUVsZW1lbnQpIHtcbiAgaWYgKHN0eWxlRWxlbWVudC5zdHlsZVNoZWV0KSB7XG4gICAgc3R5bGVFbGVtZW50LnN0eWxlU2hlZXQuY3NzVGV4dCA9IGNzcztcbiAgfSBlbHNlIHtcbiAgICB3aGlsZSAoc3R5bGVFbGVtZW50LmZpcnN0Q2hpbGQpIHtcbiAgICAgIHN0eWxlRWxlbWVudC5yZW1vdmVDaGlsZChzdHlsZUVsZW1lbnQuZmlyc3RDaGlsZCk7XG4gICAgfVxuICAgIHN0eWxlRWxlbWVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjc3MpKTtcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSBzdHlsZVRhZ1RyYW5zZm9ybTsiLCJkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGNvbnRlbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuam9oYW5uZXMtZWRpdG9yJyk7XG5cbiAgICBsZXQgZHJhZ2dlZEl0ZW0gPSBudWxsO1xuXG4gICAgbGV0IGRyb3BMaW5lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgZHJvcExpbmUuY2xhc3NMaXN0LmFkZCgnZHJvcC1saW5lJyk7XG4gICAgZHJvcExpbmUuc3R5bGUuaGVpZ2h0ID0gJzJweCc7XG4gICAgZHJvcExpbmUuc3R5bGUuZGlzcGxheSA9ICdub25lJztcblxuICAgIGNvbnRlbnQuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ3N0YXJ0JywgKGUpID0+IHtcbiAgICAgICAgaWYgKGUudGFyZ2V0LmNsYXNzTGlzdD8uY29udGFpbnMoJ2RyYWctaGFuZGxlcicpKSB7XG4gICAgICAgICAgICBkcmFnZ2VkSXRlbSA9IGUudGFyZ2V0LmNsb3Nlc3QoJy5ibG9jaycpO1xuICAgICAgICAgICAgZHJhZ2dlZEl0ZW0uc2V0QXR0cmlidXRlKCdkcmFnZ2FibGUnLCAndHJ1ZScpO1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgZHJhZ2dlZEl0ZW0uc3R5bGUub3BhY2l0eSA9ICcwLjUnO1xuICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnRlbnQuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ2VuZCcsICgpID0+IHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoZHJhZ2dlZEl0ZW0pIHtcbiAgICAgICAgICAgICAgICBkcmFnZ2VkSXRlbS5zdHlsZS5vcGFjaXR5ID0gJyc7XG4gICAgICAgICAgICAgICAgZHJhZ2dlZEl0ZW0ucmVtb3ZlQXR0cmlidXRlKCdkcmFnZ2FibGUnKTtcbiAgICAgICAgICAgICAgICBkcmFnZ2VkSXRlbSA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkcm9wTGluZS5yZW1vdmUoKTtcbiAgICAgICAgfSwgMCk7XG4gICAgfSk7XG5cbiAgICBjb250ZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdvdmVyJywgKGUpID0+IHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBsZXQgdGFyZ2V0ID0gZS50YXJnZXQuY2xvc2VzdCgnLmJsb2NrJyk7XG5cbiAgICAgICAgaWYgKHRhcmdldCAmJiB0YXJnZXQgIT09IGRyYWdnZWRJdGVtKSB7XG4gICAgICAgICAgICBsZXQgYm91bmRpbmcgPSB0YXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICBsZXQgb2Zmc2V0ID0gYm91bmRpbmcueSArIGJvdW5kaW5nLmhlaWdodCAvIDI7XG5cbiAgICAgICAgICAgIGlmIChlLmNsaWVudFkgPiBvZmZzZXQpIHtcbiAgICAgICAgICAgICAgICBpZiAodGFyZ2V0Lm5leHRFbGVtZW50U2libGluZyAhPT0gZHJvcExpbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0Lmluc2VydEFkamFjZW50RWxlbWVudCgnYWZ0ZXJlbmQnLCBkcm9wTGluZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAodGFyZ2V0LnByZXZpb3VzRWxlbWVudFNpYmxpbmcgIT09IGRyb3BMaW5lKSB7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldC5pbnNlcnRBZGphY2VudEVsZW1lbnQoJ2JlZm9yZWJlZ2luJywgZHJvcExpbmUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGRyb3BMaW5lLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgIH0pO1xuXG4gICAgY29udGVudC5hZGRFdmVudExpc3RlbmVyKCdkcm9wJywgKGUpID0+IHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBpZiAoZHJhZ2dlZEl0ZW0gJiYgZHJvcExpbmUgJiYgZHJvcExpbmUucGFyZW50RWxlbWVudCkge1xuICAgICAgICAgICAgZHJvcExpbmUucGFyZW50RWxlbWVudC5pbnNlcnRCZWZvcmUoZHJhZ2dlZEl0ZW0sIGRyb3BMaW5lKTtcbiAgICAgICAgICAgIGRyb3BMaW5lLnJlbW92ZSgpO1xuICAgICAgICB9XG4gICAgfSk7XG59KTsiLCIvLyBQaWxoYXMgcGFyYSB1bmRvIGUgcmVkb1xyXG5sZXQgdW5kb1N0YWNrID0gW107XHJcbmxldCByZWRvU3RhY2sgPSBbXTtcclxuXHJcblxyXG5cclxuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGZ1bmN0aW9uICgpIHtcclxuICAgIC8vIEVsZW1lbnRvIGRvIGVkaXRvclxyXG4gICAgY29uc3QgZWRpdG9yID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmNvbnRlbnQnKTtcclxuXHJcbiAgICBpZiAoZWRpdG9yKSB7XHJcbiAgICAgICAgLy8gRXZlbnRvIHBhcmEgZGV0ZWN0YXIgbXVkYW7Dp2FzIGUgc2FsdmFyIG8gZXN0YWRvIGFudGVzIGRlIG11ZGFyXHJcbiAgICAgICAgZWRpdG9yLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKCkgPT4ge1xyXG4gICAgICAgICAgICBzYXZlU3RhdGUoKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gRnVuw6fDo28gcGFyYSBzYWx2YXIgbyBlc3RhZG8gYXR1YWwgZG8gZWRpdG9yXHJcbiAgICAgICAgZnVuY3Rpb24gc2F2ZVN0YXRlKCkge1xyXG4gICAgICAgICAgICAvLyBDbG9uZSBkbyBjb250ZcO6ZG8gYXR1YWwgZG8gZWRpdG9yXHJcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRTdGF0ZSA9IGVkaXRvci5pbm5lckhUTUw7XHJcbiAgICAgICAgICAgIHVuZG9TdGFjay5wdXNoKGN1cnJlbnRTdGF0ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIEZ1bsOnw6NvIHBhcmEgZGVzZmF6ZXJcclxuICAgICAgICBmdW5jdGlvbiB1bmRvKCkge1xyXG4gICAgICAgICAgICBpZiAodW5kb1N0YWNrLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHN0YXRlVG9SZXN0b3JlID0gdW5kb1N0YWNrLnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgcmVkb1N0YWNrLnB1c2goZWRpdG9yLmlubmVySFRNTCk7XHJcbiAgICAgICAgICAgICAgICBlZGl0b3IuaW5uZXJIVE1MID0gc3RhdGVUb1Jlc3RvcmU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIEZ1bsOnw6NvIHBhcmEgcmVmYXplclxyXG4gICAgICAgIGZ1bmN0aW9uIHJlZG8oKSB7XHJcbiAgICAgICAgICAgIGlmIChyZWRvU3RhY2subGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhdGVUb0FwcGx5ID0gcmVkb1N0YWNrLnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgdW5kb1N0YWNrLnB1c2goZWRpdG9yLmlubmVySFRNTCk7XHJcbiAgICAgICAgICAgICAgICBlZGl0b3IuaW5uZXJIVE1MID0gc3RhdGVUb0FwcGx5O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBBZGljaW9uYW5kbyBldmVudG9zIGRlIHRlY2xhZG8gcGFyYSB1bmRvIGUgcmVkb1xyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZXZlbnQpID0+IHtcclxuICAgICAgICAgICAgaWYgKGV2ZW50LmN0cmxLZXkgJiYgZXZlbnQua2V5ID09PSAneicpIHtcclxuICAgICAgICAgICAgICAgIHVuZG8oKTtcclxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQuY3RybEtleSAmJiBldmVudC5rZXkgPT09ICd5Jykge1xyXG4gICAgICAgICAgICAgICAgcmVkbygpO1xyXG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBJbmljaWFsaXphciBvIGVzdGFkbyBkbyBlZGl0b3JcclxuICAgICAgICBzYXZlU3RhdGUoKTtcclxuICAgIH1cclxufSk7XHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcbiIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0aWQ6IG1vZHVsZUlkLFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0obW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4iLCIvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuX193ZWJwYWNrX3JlcXVpcmVfXy5uID0gKG1vZHVsZSkgPT4ge1xuXHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cblx0XHQoKSA9PiAobW9kdWxlWydkZWZhdWx0J10pIDpcblx0XHQoKSA9PiAobW9kdWxlKTtcblx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgeyBhOiBnZXR0ZXIgfSk7XG5cdHJldHVybiBnZXR0ZXI7XG59OyIsIi8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18ubyA9IChvYmosIHByb3ApID0+IChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm5jID0gdW5kZWZpbmVkOyIsImltcG9ydCB7IElFbGVtZW50RmFjdG9yeVNlcnZpY2UgfSBmcm9tIFwiLi9JRWxlbWVudEZhY3RvcnlTZXJ2aWNlXCI7XG5cbmludGVyZmFjZSBFbGVtZW50Q3JlYXRvciB7XG4gICAgKGNvbnRlbnQ6IHN0cmluZyB8IG51bGwpOiBIVE1MRWxlbWVudDtcbn1cblxuZXhwb3J0IGNsYXNzIEVsZW1lbnRGYWN0b3J5U2VydmljZSBpbXBsZW1lbnRzIElFbGVtZW50RmFjdG9yeVNlcnZpY2Uge1xuXG4gICAgcHJpdmF0ZSBjcmVhdG9yczogeyBbdHlwZTogc3RyaW5nXTogRWxlbWVudENyZWF0b3IgfTtcblxuICAgIHByaXZhdGUgc3RhdGljIF9pbnN0YW5jZTogRWxlbWVudEZhY3RvcnlTZXJ2aWNlO1xuXG4gICAgc3RhdGljIEVMRU1FTlRfVFlQRVMgPSB7XG4gICAgICAgIEJMT0NLX1BBUkFHUkFQSDogXCJibG9jay1wXCIsXG4gICAgICAgIFBBUkFHUkFQSDogXCJwXCIsXG4gICAgICAgIENIRUNLQk9YX0lURU06IFwiY2hlY2tib3hJdGVtXCIsXG4gICAgICAgIExJU1RfSVRFTTogXCJsaXN0SXRlbVwiLFxuICAgICAgICBDT0RFOiBcImNvZGVcIixcbiAgICAgICAgUVVPVEU6IFwiYmxvY2txdW90ZVwiLFxuICAgICAgICBCVUxMRVRFRF9MSVNUOiBcInVsXCIsXG4gICAgICAgIE5VTUJFUkVEX0xJU1Q6IFwib2xcIixcbiAgICAgICAgQ0hFQ0tfTElTVDogXCJjaGVja0xpc3RzXCIsXG4gICAgICAgIEhFQURFUl8xOiBcImgxXCIsXG4gICAgICAgIEhFQURFUl8yOiBcImgyXCIsXG4gICAgICAgIEhFQURFUl8zOiBcImgzXCIsXG4gICAgICAgIEhFQURFUl80OiBcImg0XCIsXG4gICAgICAgIEhFQURFUl81OiBcImg1XCIsXG4gICAgICAgIEhFQURFUl82OiBcImg2XCIsXG4gICAgICAgIERSQUdfSEFORExFX0JVVFRPTjogXCJkcmFnLWhhbmRsZS1idXR0b25cIlxuICAgIH1cblxuICAgIHByaXZhdGUgY29uc3RydWN0b3IoKSB7XG5cbiAgICAgICAgaWYgKEVsZW1lbnRGYWN0b3J5U2VydmljZS5faW5zdGFuY2UpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVzZSBFbGVtZW50RmFjdG9yeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKSB0byBnZXQgaW5zdGFuY2UuXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jcmVhdG9ycyA9IHt9O1xuXG4gICAgICAgIHRoaXMucmVnaXN0ZXIoRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuQkxPQ0tfUEFSQUdSQVBILCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuYmxvY2tQYXJhZ3JhcGhDcmVhdG9yKCkpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVyKEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLlBBUkFHUkFQSCwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLnBhcmFncmFwaENyZWF0b3IoKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXIoRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuQ0hFQ0tCT1hfSVRFTSwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmNoZWNrYm94SXRlbUNyZWF0b3IoKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXIoRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuTElTVF9JVEVNLCBFbGVtZW50RmFjdG9yeVNlcnZpY2UubGlzdEl0ZW1DcmVhdG9yKCkpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVyKEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkNPREUsIEVsZW1lbnRGYWN0b3J5U2VydmljZS5jb2RlQ3JlYXRvcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5RVU9URSwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLnF1b3RlQ3JlYXRvcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5DSEVDS19MSVNULCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuY2hlY2tMaXN0Q3JlYXRvcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5CVUxMRVRFRF9MSVNULCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuYnVsbGV0ZWRMaXN0Q3JlYXRvcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5OVU1CRVJFRF9MSVNULCBFbGVtZW50RmFjdG9yeVNlcnZpY2UubnVtYmVyZWRMaXN0Q3JlYXRvcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfMSwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmhlYWRpbmdDcmVhdG9yKDEpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfMiwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmhlYWRpbmdDcmVhdG9yKDIpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfMywgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmhlYWRpbmdDcmVhdG9yKDMpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfNCwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmhlYWRpbmdDcmVhdG9yKDQpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfNSwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmhlYWRpbmdDcmVhdG9yKDUpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfNiwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmhlYWRpbmdDcmVhdG9yKDYpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5EUkFHX0hBTkRMRV9CVVRUT04sIEVsZW1lbnRGYWN0b3J5U2VydmljZS5kcmFnSGFuZGxlQnV0dG9uQ3JlYXRvcigpKTtcblxuXG4gICAgICAgIEVsZW1lbnRGYWN0b3J5U2VydmljZS5faW5zdGFuY2UgPSB0aGlzO1xuICAgIH1cblxuICAgIHN0YXRpYyBnZXRJbnN0YW5jZSgpOiBFbGVtZW50RmFjdG9yeVNlcnZpY2Uge1xuXG4gICAgICAgIGlmICghdGhpcy5faW5zdGFuY2UpIHtcbiAgICAgICAgICAgIHRoaXMuX2luc3RhbmNlID0gbmV3IEVsZW1lbnRGYWN0b3J5U2VydmljZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2luc3RhbmNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVnaXN0ZXIodHlwZTogc3RyaW5nLCBjcmVhdG9yOiBFbGVtZW50Q3JlYXRvcik6IHZvaWQge1xuICAgICAgICB0aGlzLmNyZWF0b3JzW3R5cGVdID0gY3JlYXRvcjtcbiAgICB9XG5cbiAgICBjcmVhdGUodHlwZTogc3RyaW5nLCBjb250ZW50Pzogc3RyaW5nKTogSFRNTEVsZW1lbnQge1xuICAgICAgICBjb25zdCBjcmVhdG9yID0gdGhpcy5jcmVhdG9yc1t0eXBlXTtcblxuICAgICAgICBpZiAoIWNyZWF0b3IpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYE5vIGNyZWF0b3IgcmVnaXN0ZXJlZCBmb3IgdHlwZTogJHt0eXBlfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNyZWF0b3IoY29udGVudCB8fCBcIlwiKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBibG9ja1BhcmFncmFwaENyZWF0b3IoKTogRWxlbWVudENyZWF0b3Ige1xuICAgICAgICByZXR1cm4gY29udGVudCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmJsb2NrUGFyYWdyYXBoKGNvbnRlbnQpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIHBhcmFncmFwaENyZWF0b3IoKTogRWxlbWVudENyZWF0b3Ige1xuICAgICAgICByZXR1cm4gY29udGVudCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gRWxlbWVudEZhY3RvcnlTZXJ2aWNlLnBhcmFncmFwaChjb250ZW50KTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBoZWFkaW5nQ3JlYXRvcihsZXZlbDogbnVtYmVyKTogRWxlbWVudENyZWF0b3Ige1xuICAgICAgICByZXR1cm4gY29udGVudCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmhlYWRpbmcobGV2ZWwsIGNvbnRlbnQpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGNoZWNrYm94SXRlbUNyZWF0b3IoKTogRWxlbWVudENyZWF0b3Ige1xuICAgICAgICByZXR1cm4gY29udGVudCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmNoZWNrYm94SXRlbShjb250ZW50IHx8IFwiXCIpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGxpc3RJdGVtQ3JlYXRvcigpOiBFbGVtZW50Q3JlYXRvciB7XG5cbiAgICAgICAgcmV0dXJuIGNvbnRlbnQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIEVsZW1lbnRGYWN0b3J5U2VydmljZS5saXN0SXRlbV8yKGNvbnRlbnQpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGRyYWdIYW5kbGVCdXR0b25DcmVhdG9yKCk6IEVsZW1lbnRDcmVhdG9yIHtcblxuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIEVsZW1lbnRGYWN0b3J5U2VydmljZS5kcmFnSGFuZGxlQnV0dG9uKCk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgY29kZUNyZWF0b3IoKTogRWxlbWVudENyZWF0b3Ige1xuICAgICAgICByZXR1cm4gY29udGVudCA9PiB7XG4gICAgICAgICAgICBjb25zdCBwcmUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdwcmUnKTtcbiAgICAgICAgICAgIGNvbnN0IGNvZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjb2RlJyk7XG4gICAgICAgICAgICBjb2RlLnRleHRDb250ZW50ID0gY29udGVudCB8fCBcIlwiO1xuICAgICAgICAgICAgcHJlLmFwcGVuZENoaWxkKGNvZGUpO1xuXG4gICAgICAgICAgICBjb2RlLmNvbnRlbnRFZGl0YWJsZSA9IFwidHJ1ZVwiO1xuICAgICAgICAgICAgcHJlLmNsYXNzTGlzdC5hZGQoJ2pvaGFubmVzLWNvbnRlbnQtZWxlbWVudCcpO1xuICAgICAgICAgICAgY29kZS5jbGFzc0xpc3QuYWRkKCdqb2hhbm5lcy1jb2RlJyk7XG5cbiAgICAgICAgICAgIHJldHVybiBwcmU7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgcXVvdGVDcmVhdG9yKCk6IEVsZW1lbnRDcmVhdG9yIHtcbiAgICAgICAgcmV0dXJuIGNvbnRlbnQgPT4ge1xuICAgICAgICAgICAgY29uc3QgYmxvY2txdW90ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2Jsb2NrcXVvdGUnKTtcbiAgICAgICAgICAgIGJsb2NrcXVvdGUudGV4dENvbnRlbnQgPSBjb250ZW50IHx8IFwiXCI7XG4gICAgICAgICAgICBibG9ja3F1b3RlLmNvbnRlbnRFZGl0YWJsZSA9IFwidHJ1ZVwiO1xuICAgICAgICAgICAgYmxvY2txdW90ZS5jbGFzc0xpc3QuYWRkKCdqb2hhbm5lcy1jb250ZW50LWVsZW1lbnQnKTtcbiAgICAgICAgICAgIHJldHVybiBibG9ja3F1b3RlO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGNoZWNrTGlzdENyZWF0b3IoKTogRWxlbWVudENyZWF0b3Ige1xuICAgICAgICByZXR1cm4gY29udGVudCA9PiB7XG4gICAgICAgICAgICBjb25zdCB1bCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3VsJyk7XG4gICAgICAgICAgICB1bC5jb250ZW50RWRpdGFibGUgPSBcInRydWVcIjtcbiAgICAgICAgICAgIHVsLmNsYXNzTGlzdC5hZGQoJ2pvaGFubmVzLWNvbnRlbnQtZWxlbWVudCcpO1xuICAgICAgICAgICAgdWwuY2xhc3NMaXN0LmFkZCgnc3dpdHRhYmxlJyk7XG4gICAgICAgICAgICB1bC5jbGFzc0xpc3QuYWRkKCdsaXN0Jyk7XG4gICAgICAgICAgICB1bC5jbGFzc0xpc3QuYWRkKCdjaGVja2JveC1saXN0Jyk7XG5cbiAgICAgICAgICAgIGNvbnN0IGluaXRpYWxJdGVtID0gRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmNoZWNrYm94SXRlbShjb250ZW50IHx8IFwiXCIpO1xuXG4gICAgICAgICAgICB1bC5hcHBlbmRDaGlsZChpbml0aWFsSXRlbSk7XG5cbiAgICAgICAgICAgIHJldHVybiB1bDtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBidWxsZXRlZExpc3RDcmVhdG9yKCk6IEVsZW1lbnRDcmVhdG9yIHtcbiAgICAgICAgcmV0dXJuIGNvbnRlbnQgPT4ge1xuICAgICAgICAgICAgY29uc3QgdWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd1bCcpO1xuICAgICAgICAgICAgdWwuY29udGVudEVkaXRhYmxlID0gXCJ0cnVlXCI7XG4gICAgICAgICAgICB1bC5jbGFzc0xpc3QuYWRkKCdqb2hhbm5lcy1jb250ZW50LWVsZW1lbnQnKTtcbiAgICAgICAgICAgIHVsLmNsYXNzTGlzdC5hZGQoJ3N3aXR0YWJsZScpO1xuICAgICAgICAgICAgdWwuY2xhc3NMaXN0LmFkZCgnbGlzdCcpO1xuXG4gICAgICAgICAgICBjb25zdCBpbml0aWFsSXRlbSA9IEVsZW1lbnRGYWN0b3J5U2VydmljZS5saXN0SXRlbShjb250ZW50IHx8IFwiXCIpO1xuXG4gICAgICAgICAgICB1bC5hcHBlbmRDaGlsZChpbml0aWFsSXRlbSk7XG5cbiAgICAgICAgICAgIHJldHVybiB1bDtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBudW1iZXJlZExpc3RDcmVhdG9yKCk6IEVsZW1lbnRDcmVhdG9yIHtcbiAgICAgICAgcmV0dXJuIGNvbnRlbnQgPT4ge1xuICAgICAgICAgICAgY29uc3QgdWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdvbCcpO1xuICAgICAgICAgICAgdWwuY29udGVudEVkaXRhYmxlID0gXCJ0cnVlXCI7XG4gICAgICAgICAgICB1bC5jbGFzc0xpc3QuYWRkKCdqb2hhbm5lcy1jb250ZW50LWVsZW1lbnQnKTtcbiAgICAgICAgICAgIHVsLmNsYXNzTGlzdC5hZGQoJ3N3aXR0YWJsZScpO1xuICAgICAgICAgICAgdWwuY2xhc3NMaXN0LmFkZCgnbGlzdCcpO1xuXG4gICAgICAgICAgICBjb25zdCBpbml0aWFsSXRlbSA9IEVsZW1lbnRGYWN0b3J5U2VydmljZS5saXN0SXRlbShjb250ZW50IHx8IFwiXCIpO1xuXG4gICAgICAgICAgICB1bC5hcHBlbmRDaGlsZChpbml0aWFsSXRlbSk7XG5cbiAgICAgICAgICAgIHJldHVybiB1bDtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBwcml2YXRlIHN0YXRpYyBudW1iZXJlZExpc3RDcmVhdG9yKCk6IEVsZW1lbnRDcmVhdG9yIHtcbiAgICAvLyAgICAgcmV0dXJuICgpID0+IHtcbiAgICAvLyAgICAgICAgIGNvbnN0IG9sID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnb2wnKTtcbiAgICAvLyAgICAgICAgIG9sLmNvbnRlbnRFZGl0YWJsZSA9IFwidHJ1ZVwiO1xuICAgIC8vICAgICAgICAgb2wuY2xhc3NMaXN0LmFkZCgnam9oYW5uZXMtY29udGVudC1lbGVtZW50Jyk7XG4gICAgLy8gICAgICAgICByZXR1cm4gb2w7XG4gICAgLy8gICAgIH07XG4gICAgLy8gfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgcGFyYWdyYXBoKGNvbnRlbnQ6IHN0cmluZyB8IG51bGwgPSBudWxsKTogSFRNTEVsZW1lbnQge1xuICAgICAgICBjb25zdCBwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgncCcpO1xuXG4gICAgICAgIHAuaW5uZXJUZXh0ID0gY29udGVudCB8fCBcIlwiO1xuICAgICAgICBwLmNvbnRlbnRFZGl0YWJsZSA9IFwidHJ1ZVwiO1xuICAgICAgICBwLnNldEF0dHJpYnV0ZSgnZGF0YS10eXBlJywgJ3AnKTtcbiAgICAgICAgcC5jbGFzc0xpc3QuYWRkKCdqb2hhbm5lcy1jb250ZW50LWVsZW1lbnQnKTtcbiAgICAgICAgcC5jbGFzc0xpc3QuYWRkKCdzd2l0dGFibGUnKTtcbiAgICAgICAgcC5jbGFzc0xpc3QuYWRkKCdmb2N1c2FibGUnKTtcbiAgICAgICAgcC5jbGFzc0xpc3QuYWRkKCdrZXktdHJpZ2dlcicpO1xuICAgICAgICBwLnNldEF0dHJpYnV0ZSgnZGF0YS1wbGFjZWhvbGRlcicsICdXcml0ZSBzb21ldGhpbmcgb3IgdHlwZSAvIChzbGFzaCkgdG8gY2hvb3NlIGEgYmxvY2suLi4nKTtcblxuICAgICAgICByZXR1cm4gcDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBsaXN0SXRlbSh0ZXh0OiBzdHJpbmcpOiBIVE1MRWxlbWVudCB7XG5cbiAgICAgICAgbGV0IGluaXRpYWxJdGVtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGknKTtcblxuICAgICAgICBpbml0aWFsSXRlbS5jbGFzc0xpc3QuYWRkKCdmb2N1c2FibGUnKTtcbiAgICAgICAgaW5pdGlhbEl0ZW0uY2xhc3NMaXN0LmFkZCgnZGVsZXRhYmxlJyk7XG4gICAgICAgIGluaXRpYWxJdGVtLmNsYXNzTGlzdC5hZGQoJ2VkaXRhYmxlJyk7XG4gICAgICAgIGluaXRpYWxJdGVtLmNsYXNzTGlzdC5hZGQoJ2ZvY3VzJyk7XG4gICAgICAgIGluaXRpYWxJdGVtLmNsYXNzTGlzdC5hZGQoJ2tleS10cmlnZ2VyJyk7XG4gICAgICAgIGluaXRpYWxJdGVtLmNsYXNzTGlzdC5hZGQoJ2xpc3QtaXRlbScpO1xuXG4gICAgICAgIGluaXRpYWxJdGVtLmlubmVyVGV4dCA9IHRleHQ7XG5cbiAgICAgICAgaW5pdGlhbEl0ZW0uY29udGVudEVkaXRhYmxlID0gXCJ0cnVlXCI7XG4gICAgICAgIGluaXRpYWxJdGVtLnNldEF0dHJpYnV0ZSgnZGF0YS1wbGFjZWhvbGRlcicsICdJdGVtJyk7XG5cbiAgICAgICAgcmV0dXJuIGluaXRpYWxJdGVtO1xuXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgaGVhZGluZyhsZXZlbDogbnVtYmVyLCBjb250ZW50OiBzdHJpbmcgfCBudWxsID0gbnVsbCk6IEhUTUxFbGVtZW50IHtcbiAgICAgICAgY29uc3QgaCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoYGgke2xldmVsfWApO1xuXG4gICAgICAgIGguaW5uZXJUZXh0ID0gY29udGVudCB8fCBcIlwiO1xuICAgICAgICBoLmNvbnRlbnRFZGl0YWJsZSA9IFwidHJ1ZVwiO1xuICAgICAgICBoLnNldEF0dHJpYnV0ZSgnZGF0YS10eXBlJywgYGgke2xldmVsfWApO1xuICAgICAgICBoLmNsYXNzTGlzdC5hZGQoJ2pvaGFubmVzLWNvbnRlbnQtZWxlbWVudCcpO1xuICAgICAgICBoLmNsYXNzTGlzdC5hZGQoJ3N3aXR0YWJsZScpO1xuICAgICAgICBoLmNsYXNzTGlzdC5hZGQoJ2ZvY3VzYWJsZScpO1xuICAgICAgICBoLmNsYXNzTGlzdC5hZGQoJ2ZvY3VzJyk7XG4gICAgICAgIGguY2xhc3NMaXN0LmFkZCgna2V5LXRyaWdnZXInKTtcblxuICAgICAgICByZXR1cm4gaDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBjaGVja2JveEl0ZW0oY29udGVudDogc3RyaW5nKTogSFRNTEVsZW1lbnQge1xuICAgICAgICBsZXQgbGkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaScpO1xuICAgICAgICBsaS5jbGFzc0xpc3QuYWRkKCdkZWxldGFibGUnKTtcbiAgICAgICAgbGkuY2xhc3NMaXN0LmFkZCgnbGlzdC1pdGVtJyk7XG5cbiAgICAgICAgLy8gaW5pdGlhbEl0ZW0uY2xhc3NMaXN0LmFkZCgna2V5LXRyaWdnZXInKTtcblxuICAgICAgICBsZXQgY2hlY2tib3ggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO1xuICAgICAgICBjaGVja2JveC5zZXRBdHRyaWJ1dGUoJ3R5cGUnLCAnY2hlY2tib3gnKTtcblxuICAgICAgICBsZXQgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICAgICAgc3Bhbi50ZXh0Q29udGVudCA9IGNvbnRlbnQ7XG4gICAgICAgIHNwYW4uc2V0QXR0cmlidXRlKCdkYXRhLXBsYWNlaG9sZGVyJywgJ1RvLWRvJyk7XG4gICAgICAgIC8vIHNwYW4uY29udGVudEVkaXRhYmxlID0gdHJ1ZTtcbiAgICAgICAgc3Bhbi5zZXRBdHRyaWJ1dGUoXCJjb250ZW50RWRpdGFibGVcIiwgXCJ0cnVlXCIpO1xuXG4gICAgICAgIHNwYW4uY2xhc3NMaXN0LmFkZCgnZm9jdXNhYmxlJyk7XG4gICAgICAgIHNwYW4uY2xhc3NMaXN0LmFkZCgnZWRpdGFibGUnKTtcbiAgICAgICAgc3Bhbi5jbGFzc0xpc3QuYWRkKCdmb2N1cycpO1xuXG4gICAgICAgIGxpLmFwcGVuZENoaWxkKGNoZWNrYm94KTtcbiAgICAgICAgbGkuYXBwZW5kQ2hpbGQoc3Bhbik7XG5cbiAgICAgICAgcmV0dXJuIGxpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGxpc3RJdGVtXzIoY29udGVudDogc3RyaW5nIHwgbnVsbCA9IG51bGwpOiBIVE1MRWxlbWVudCB7XG5cbiAgICAgICAgbGV0IGluaXRpYWxJdGVtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGknKTtcblxuICAgICAgICBpbml0aWFsSXRlbS5jbGFzc0xpc3QuYWRkKCdmb2N1c2FibGUnKTtcbiAgICAgICAgaW5pdGlhbEl0ZW0uY2xhc3NMaXN0LmFkZCgnZGVsZXRhYmxlJyk7XG4gICAgICAgIGluaXRpYWxJdGVtLmNsYXNzTGlzdC5hZGQoJ2VkaXRhYmxlJyk7XG4gICAgICAgIGluaXRpYWxJdGVtLmNsYXNzTGlzdC5hZGQoJ2ZvY3VzJyk7XG4gICAgICAgIGluaXRpYWxJdGVtLmNsYXNzTGlzdC5hZGQoJ2tleS10cmlnZ2VyJyk7XG4gICAgICAgIGluaXRpYWxJdGVtLmNsYXNzTGlzdC5hZGQoJ2xpc3QtaXRlbScpO1xuXG4gICAgICAgIGluaXRpYWxJdGVtLmlubmVyVGV4dCA9IGNvbnRlbnQgfHwgXCJcIjtcblxuICAgICAgICAvLyBpbml0aWFsSXRlbS5jb250ZW50RWRpdGFibGUgPSB0cnVlO1xuICAgICAgICBpbml0aWFsSXRlbS5zZXRBdHRyaWJ1dGUoXCJjb250ZW50RWRpdGFibGVcIiwgXCJ0cnVlXCIpO1xuICAgICAgICBpbml0aWFsSXRlbS5zZXRBdHRyaWJ1dGUoJ2RhdGEtcGxhY2Vob2xkZXInLCAnSXRlbScpO1xuXG4gICAgICAgIHJldHVybiBpbml0aWFsSXRlbTtcbiAgICB9XG5cblxuICAgIHN0YXRpYyBibG9ja1BhcmFncmFwaChjb250ZW50OiBzdHJpbmcgfCBudWxsID0gbnVsbCkge1xuXG4gICAgICAgIGxldCBuZXdEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgbGV0IG5ld0VsZW1lbnQgPSBFbGVtZW50RmFjdG9yeVNlcnZpY2UucGFyYWdyYXBoKGNvbnRlbnQpO1xuXG4gICAgICAgIGxldCBuZXdCdXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcbiAgICAgICAgbmV3QnV0dG9uLmlubmVySFRNTCA9ICc8c3ZnIHdpZHRoPVwiMS4zNzVyZW1cIiBoZWlnaHQ9XCIxLjM3NXJlbVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIj48dXNlIGhyZWY9XCIjaWNvbi1tYXRlcmlhbC1kcmFnXCI+PC91c2U+PC9zdmc+JztcblxuICAgICAgICAvLyBuZXdEaXYuYXBwZW5kQ2hpbGQobmV3QnV0dG9uKTtcbiAgICAgICAgbmV3RGl2LmFwcGVuZENoaWxkKG5ld0VsZW1lbnQpO1xuXG4gICAgICAgIG5ld0Rpdi5jbGFzc0xpc3QuYWRkKCdibG9jaycpO1xuICAgICAgICBuZXdEaXYuY2xhc3NMaXN0LmFkZCgnZGVsZXRhYmxlJyk7XG4gICAgICAgIG5ld0J1dHRvbi5jbGFzc0xpc3QuYWRkKCdkcmFnLWhhbmRsZXInKTtcbiAgICAgICAgbmV3QnV0dG9uLmNsYXNzTGlzdC5hZGQoJ2J1dHRvbi1yZXNldCcpO1xuICAgICAgICBuZXdCdXR0b24uZHJhZ2dhYmxlID0gdHJ1ZTtcblxuICAgICAgICByZXR1cm4gbmV3RGl2O1xuICAgIH1cblxuICAgIHN0YXRpYyBkcmFnSGFuZGxlQnV0dG9uKCkge1xuXG4gICAgICAgIGxldCBidXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcbiAgICAgICAgYnV0dG9uLmlubmVySFRNTCA9ICc8c3ZnIHdpZHRoPVwiMS4zNzVyZW1cIiBoZWlnaHQ9XCIxLjM3NXJlbVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIj48dXNlIGhyZWY9XCIjaWNvbi1tYXRlcmlhbC1kcmFnXCI+PC91c2U+PC9zdmc+JztcblxuICAgICAgICBidXR0b24uY2xhc3NMaXN0LmFkZCgnZHJhZy1oYW5kbGVyJyk7XG4gICAgICAgIGJ1dHRvbi5jbGFzc0xpc3QuYWRkKCdidXR0b24tcmVzZXQnKTtcbiAgICAgICAgYnV0dG9uLmRyYWdnYWJsZSA9IHRydWU7XG5cbiAgICAgICAgcmV0dXJuIGJ1dHRvbjtcbiAgICB9XG5cbn0iLCJpbXBvcnQgeyBJQmxvY2tPcGVyYXRpb25zU2VydmljZSB9IGZyb20gXCIuL0lCbG9ja09wZXJhdGlvbnNTZXJ2aWNlXCI7XG5pbXBvcnQgeyBJRWxlbWVudEZhY3RvcnlTZXJ2aWNlIH0gZnJvbSBcIi4uL2VsZW1lbnQtZmFjdG9yeS9JRWxlbWVudEZhY3RvcnlTZXJ2aWNlXCI7XG5pbXBvcnQgeyBFbGVtZW50RmFjdG9yeVNlcnZpY2UgfSBmcm9tIFwiLi4vZWxlbWVudC1mYWN0b3J5L0VsZW1lbnRGYWN0b3J5U2VydmljZVwiO1xuXG5leHBvcnQgY2xhc3MgQmxvY2tPcGVyYXRpb25zU2VydmljZSBpbXBsZW1lbnRzIElCbG9ja09wZXJhdGlvbnNTZXJ2aWNlIHtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgZWxlbWVudEZhY3RvcnlTZXJ2aWNlOiBJRWxlbWVudEZhY3RvcnlTZXJ2aWNlO1xuICAgIHByaXZhdGUgc3RhdGljIGluc3RhbmNlOiBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlO1xuXG4gICAgc3RhdGljIEJMT0NLX09QRVJBVElPTlMgPSB7XG4gICAgICAgIFRVUk5fSU5UTzogXCJ0dXJuSW50b1wiLFxuICAgICAgICBDUkVBVEVfREVGQVVMVF9CTE9DSzogXCJDcmVhdGVEZWZhdWx0QmxvY2tcIixcbiAgICAgICAgREVMRVRFX0ZPQ1VTX09OX1BSRVZJT1VTOiBcIkRlbGV0ZUFuZEZvY3VzT25QcmV2aW91c1wiLFxuICAgICAgICBERUxFVEVfRk9DVVNfT05fTkVYVDogXCJEZWxldGVBbmRGb2N1c09uTmV4dFwiLFxuICAgICAgICBGT0NVU19PTl9GSVJTVDogXCJGb2N1c09uRmlyc3RcIixcbiAgICAgICAgRk9DVVNfT05fUFJFVklPVVM6IFwiRm9jdXNPblByZXZpb3VzXCIsXG4gICAgICAgIEZPQ1VTX09OX05FWFQ6IFwiRm9jdXNPbk5leHRcIixcbiAgICAgICAgREVMRVRFOiBcImRlbGV0ZVwiLFxuICAgICAgICBEVVBMSUNBVEU6IFwiZHVwbGljYXRlXCIsXG4gICAgICAgIENPUFk6IFwiY29weVwiLFxuICAgICAgICBQQVNURTogXCJwYXRlc1wiLFxuICAgICAgICBDVVQ6IFwiY3V0XCIsXG4gICAgICAgIFJFTU9WRV9GT1JNQVQ6IFwicmVtb3ZlRm9ybWF0XCIsXG4gICAgICAgIFRSQU5TRk9STV9CTE9DSzogXCJ0cmFuc2Zvcm1CbG9ja1wiXG4gICAgfTtcblxuICAgIHByaXZhdGUgY29uc3RydWN0b3IoZWxlbWVudEZhY3RvcnlTZXJ2aWNlOiBJRWxlbWVudEZhY3RvcnlTZXJ2aWNlKSB7XG5cbiAgICAgICAgaWYgKEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuaW5zdGFuY2UpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVzZSBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLmdldEluc3RhbmNlKCkgdG8gZ2V0IGluc3RhbmNlLlwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZWxlbWVudEZhY3RvcnlTZXJ2aWNlID0gZWxlbWVudEZhY3RvcnlTZXJ2aWNlO1xuXG4gICAgICAgIEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuaW5zdGFuY2UgPSB0aGlzO1xuICAgIH1cblxuICAgIGV4ZWNDb21tYW5kKGNvbW1hbmQ6IHN0cmluZywgc2hvd1VJOiBib29sZWFuLCB2YWx1ZTogc3RyaW5nIHwgbnVsbCA9IG51bGwpOiBib29sZWFuIHtcblxuICAgICAgICBpZiAoY29tbWFuZCA9PSBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLkJMT0NLX09QRVJBVElPTlMuQ09QWSkge1xuXG4gICAgICAgICAgICBpZiAoZG9jdW1lbnQuZ2V0U2VsZWN0aW9uICYmIG5hdmlnYXRvci5jbGlwYm9hcmQgJiYgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSBkb2N1bWVudC5nZXRTZWxlY3Rpb24oKTtcblxuICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rpb24gJiYgc2VsZWN0aW9uLnRvU3RyaW5nKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RlZFRleHQgPSBzZWxlY3Rpb24udG9TdHJpbmcoKTtcblxuICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dChzZWxlY3RlZFRleHQpLnRoZW4oKCkgPT4ge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb3BpZWRFdmVudCA9IG5ldyBDdXN0b21FdmVudCgnY29waWVkVGV4dCcsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbmNlbGFibGU6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KGNvcGllZEV2ZW50KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICAgICAgICAgICAgICAgICAgfSkuY2F0Y2goKGVycjogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciB3aGVuIGNvcHkgdGV4dCcsIGVycik7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbW1hbmQgPT0gQmxvY2tPcGVyYXRpb25zU2VydmljZS5CTE9DS19PUEVSQVRJT05TLkNVVCkge1xuXG4gICAgICAgICAgICBpZiAoZG9jdW1lbnQuZ2V0U2VsZWN0aW9uICYmIG5hdmlnYXRvci5jbGlwYm9hcmQgJiYgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSBkb2N1bWVudC5nZXRTZWxlY3Rpb24oKTtcblxuICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rpb24gJiYgc2VsZWN0aW9uLnRvU3RyaW5nKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RlZFRleHQgPSBzZWxlY3Rpb24udG9TdHJpbmcoKTtcblxuICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb24uZGVsZXRlRnJvbURvY3VtZW50KCk7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkZUV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KCdyZXF1ZXN0SGlkZUZsb2F0aW5nVG9vbGJhcicsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxhYmxlOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoaGlkZUV2ZW50KTtcblxuICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dChzZWxlY3RlZFRleHQpLnRoZW4oKCkgPT4ge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcblxuICAgICAgICAgICAgICAgICAgICB9KS5jYXRjaCgoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHdoZW4gY3V0IHRleHQ6ICcsIGVycik7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbW1hbmQgPT0gQmxvY2tPcGVyYXRpb25zU2VydmljZS5CTE9DS19PUEVSQVRJT05TLlBBU1RFKSB7XG4gICAgICAgICAgICBpZiAobmF2aWdhdG9yLmNsaXBib2FyZCAmJiBuYXZpZ2F0b3IuY2xpcGJvYXJkLnJlYWRUZXh0KSB7XG4gICAgICAgICAgICAgICAgbmF2aWdhdG9yLmNsaXBib2FyZC5yZWFkVGV4dCgpLnRoZW4oKHBhc3RlZFRleHQ6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSBkb2N1bWVudC5nZXRTZWxlY3Rpb24oKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0aW9uICYmIHNlbGVjdGlvbi5yYW5nZUNvdW50ID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlLmRlbGV0ZUNvbnRlbnRzKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByYW5nZS5pbnNlcnROb2RlKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHBhc3RlZFRleHQpKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0aW9uRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoJ3JlcXVlc3RVcGRhdGVGbG9hdGluZ1Rvb2xiYXInLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxhYmxlOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChzZWxlY3Rpb25FdmVudCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignTm8gdGV4dCBzZWxlY3RlZCBvciBjbGlwYm9hcmQgZW1wdHkuJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KS5jYXRjaCgoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3Igd2hlbiBwYXN0aW5nIHRleHQ6ICcsIGVycik7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG5cblxuXG4gICAgICAgIGlmIChjb21tYW5kID09IEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuQkxPQ0tfT1BFUkFUSU9OUy5UUkFOU0ZPUk1fQkxPQ0spIHtcblxuICAgICAgICAgICAgY29uc3QgYmxvY2sgPSB0aGlzLmdldEN1cnJlbnRTZWxlY3RlZEJsb2NrKCkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICBpZiAoYmxvY2sgJiYgdmFsdWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRyYW5zZm9ybUJsb2NrKGJsb2NrLCB2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29tbWFuZCA9PSBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLkJMT0NLX09QRVJBVElPTlMuUkVNT1ZFX0ZPUk1BVCkge1xuICAgICAgICAgICAgcmV0dXJuIGRvY3VtZW50LmV4ZWNDb21tYW5kKEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuQkxPQ0tfT1BFUkFUSU9OUy5SRU1PVkVfRk9STUFULCBmYWxzZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29tbWFuZCA9PSBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLkJMT0NLX09QRVJBVElPTlMuREVMRVRFKSB7XG5cbiAgICAgICAgICAgIHRoaXMuZGVsZXRlQW5kRm9jdXNPbk5leHQoKTtcblxuICAgICAgICAgICAgY29uc3QgaGlkZUV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KCdyZXF1ZXN0SGlkZUZsb2F0aW5nVG9vbGJhcicsIHtcbiAgICAgICAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgICAgICAgIGNhbmNlbGFibGU6IHRydWVcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KGhpZGVFdmVudCk7XG5cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbW1hbmQgPT0gQmxvY2tPcGVyYXRpb25zU2VydmljZS5CTE9DS19PUEVSQVRJT05TLkRVUExJQ0FURSkge1xuXG4gICAgICAgICAgICB0aGlzLmR1cGxpY2F0ZVNlbGVjdGVkQmxvY2soKTtcblxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29tbWFuZCA9PSBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLkJMT0NLX09QRVJBVElPTlMuQ1JFQVRFX0RFRkFVTFRfQkxPQ0spIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50IHx8IG51bGw7XG5cbiAgICAgICAgICAgIHRoaXMuY3JlYXRlRGVmYXVsdEJsb2NrKGVsZW1lbnQpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29tbWFuZCA9PSBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLkJMT0NLX09QRVJBVElPTlMuRk9DVVNfT05fRklSU1QpIHtcblxuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuZm9jdXNhYmxlXCIpO1xuXG4gICAgICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgICAgICAgIChlbGVtZW50IGFzIEhUTUxFbGVtZW50KS5mb2N1cygpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29tbWFuZCA9PSBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLkJMT0NLX09QRVJBVElPTlMuREVMRVRFX0ZPQ1VTX09OX1BSRVZJT1VTKSB7XG4gICAgICAgICAgICB0aGlzLmRlbGV0ZUFuZEZvY3VzT25QcmV2aW91cygpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29tbWFuZCA9PSBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLkJMT0NLX09QRVJBVElPTlMuREVMRVRFX0ZPQ1VTX09OX05FWFQpIHtcbiAgICAgICAgICAgIHRoaXMuZGVsZXRlQW5kRm9jdXNPbk5leHQoKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbW1hbmQgPT0gQmxvY2tPcGVyYXRpb25zU2VydmljZS5CTE9DS19PUEVSQVRJT05TLkZPQ1VTX09OX1BSRVZJT1VTKSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcblxuICAgICAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZvY3VzT25QcmV2aW91cyhlbGVtZW50KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb21tYW5kID09IEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuQkxPQ0tfT1BFUkFUSU9OUy5GT0NVU19PTl9ORVhUKSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcblxuICAgICAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZvY3VzT25OZXh0KGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbW1hbmQgPT0gQmxvY2tPcGVyYXRpb25zU2VydmljZS5CTE9DS19PUEVSQVRJT05TLlRVUk5fSU5UTykge1xuXG4gICAgICAgICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLmdldERyYWdnYWJsZUVsZW1lbnRGcm9tU2VsZWN0aW9uKCk7XG5cbiAgICAgICAgICAgIHRoaXMuZm9ybWF0QmxvY2soZWxlbWVudCwgdmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoJ3JlcXVlc3RIaWRlRmxvYXRpbmdUb29sYmFyJywge1xuICAgICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICAgIGNhbmNlbGFibGU6IHRydWVcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChzZWxlY3Rpb25FdmVudCk7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcXVlcnlDb21tYW5kU3RhdGUoKTogYm9vbGVhbiB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1ldGhvZCBub3QgaW1wbGVtZW50ZWQuXCIpO1xuICAgIH1cblxuICAgIHN0YXRpYyBnZXRJbnN0YW5jZShlbGVtZW50RmFjdG9yeVNlcnZpY2U6IElFbGVtZW50RmFjdG9yeVNlcnZpY2UgfCBudWxsID0gbnVsbCk6IEJsb2NrT3BlcmF0aW9uc1NlcnZpY2Uge1xuXG4gICAgICAgIGlmICghdGhpcy5pbnN0YW5jZSkge1xuICAgICAgICAgICAgdGhpcy5pbnN0YW5jZSA9IG5ldyBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlKGVsZW1lbnRGYWN0b3J5U2VydmljZSB8fCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5pbnN0YW5jZTtcbiAgICB9XG5cbiAgICBmb3JtYXRCbG9jayhlbGVtZW50OiBIVE1MRWxlbWVudCwgY29udGVudFR5cGU6IHN0cmluZyk6IHZvaWQge1xuXG4gICAgICAgIGxldCBjb250ZW50RWxlbWVudCA9IGVsZW1lbnQucXVlcnlTZWxlY3RvcignLnN3aXR0YWJsZScpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBsZXQgY29udGVudCA9IGNvbnRlbnRFbGVtZW50LmlubmVyVGV4dDtcblxuICAgICAgICBsZXQgbmV3Q29udGVudEJsb2NrID0gdGhpcy5lbGVtZW50RmFjdG9yeVNlcnZpY2UuY3JlYXRlKGNvbnRlbnRUeXBlLCBjb250ZW50KTtcblxuICAgICAgICBlbGVtZW50LnJlcGxhY2VDaGlsZChuZXdDb250ZW50QmxvY2ssIGNvbnRlbnRFbGVtZW50KTtcblxuICAgICAgICBjb25zdCBmb2N1c2FibGUgPSBuZXdDb250ZW50QmxvY2suY2xvc2VzdCgnLmZvY3VzYWJsZScpIHx8IGVsZW1lbnQucXVlcnlTZWxlY3RvcignLmZvY3VzYWJsZScpO1xuXG4gICAgICAgIC8vIGZvY3VzT25UaGVFbmRPZlRoZVRleHQoZm9jdXNhYmxlKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0RHJhZ2dhYmxlRWxlbWVudEZyb21TZWxlY3Rpb24oKTogSFRNTEVsZW1lbnQge1xuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG5cbiAgICAgICAgaWYgKHNlbGVjdGlvbiAmJiBzZWxlY3Rpb24ucmFuZ2VDb3VudCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XG4gICAgICAgICAgICBsZXQgZWxlbWVudDogTm9kZSB8IG51bGwgPSByYW5nZS5jb21tb25BbmNlc3RvckNvbnRhaW5lcjtcblxuICAgICAgICAgICAgaWYgKGVsZW1lbnQubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgd2hpbGUgKGVsZW1lbnQgJiYgIShlbGVtZW50IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZSBhcyBIVE1MRWxlbWVudCB8IG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZHJhZ2dhYmxlID0gZWxlbWVudC5jbG9zZXN0KCcuYmxvY2snKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgICAgICByZXR1cm4gZHJhZ2dhYmxlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmV0b3JuYXIgbnVsbCBzZSBuZW5odW1hIHNlbGXDp8OjbyB2w6FsaWRhIGZvciBlbmNvbnRyYWRhIG91IG5lbmh1bSBlbGVtZW50byBjb3JyZXNwb25kZW50ZVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoKTtcbiAgICB9XG5cbiAgICAvLyBzdGF0aWMgZ2V0VGFnTmFtZUJ5Q29tbWFuZE5hbWUoY29tbWFuZE5hbWU6IHN0cmluZykge1xuICAgIC8vICAgICBzd2l0Y2ggKGNvbW1hbmROYW1lKSB7XG4gICAgLy8gICAgICAgICBjYXNlIFwidHVybkludG9QYXJhZ3JhcGhcIjpcbiAgICAvLyAgICAgICAgICAgICByZXR1cm4gXCJwXCI7XG4gICAgLy8gICAgICAgICBjYXNlIFwidHVybkludG9IMVwiOlxuICAgIC8vICAgICAgICAgICAgIHJldHVybiBcImgxXCI7XG4gICAgLy8gICAgICAgICBjYXNlIFwidHVybkludG9IMlwiOlxuICAgIC8vICAgICAgICAgICAgIHJldHVybiBcImgyXCI7XG4gICAgLy8gICAgICAgICBjYXNlIFwidHVybkludG9IM1wiOlxuICAgIC8vICAgICAgICAgICAgIHJldHVybiBcImgzXCI7XG4gICAgLy8gICAgICAgICBjYXNlIFwidHVybkludG9INFwiOlxuICAgIC8vICAgICAgICAgICAgIHJldHVybiBcImg0XCI7XG4gICAgLy8gICAgICAgICBjYXNlIFwidHVybkludG9INVwiOlxuICAgIC8vICAgICAgICAgICAgIHJldHVybiBcImg1XCI7XG4gICAgLy8gICAgICAgICBjYXNlIFwidHVybkludG9INlwiOlxuICAgIC8vICAgICAgICAgICAgIHJldHVybiBcImg2XCI7XG5cbiAgICAvLyAgICAgICAgIGRlZmF1bHQ6XG4gICAgLy8gICAgICAgICAgICAgdGhyb3cgRXJyb3IoXCJFcnJvclwiKTtcbiAgICAvLyAgICAgfVxuICAgIC8vIH1cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gICAgLy8gYXBwbHlTZWxlY3RlZEJsb2NrVHlwZShkcmFnZ2FibGVCbG9jazogSFRNTEVsZW1lbnQsIG5ld0Jsb2NrVHlwZTogc3RyaW5nKSB7XG5cbiAgICAvLyAgICAgLy8gY29uc3QgZHJhZ2dhYmxlQmxvY2sgPSByZWFsRm9jdXNlZEVsZW1lbnQuY2xvc2VzdCgnLmJsb2NrJyk7XG4gICAgLy8gICAgIC8vIGNvbnN0IG5ld0Jsb2NrVHlwZSA9IGV2ZW50LnRhcmdldC5jbG9zZXN0KCcub3B0aW9uJykgP1xuICAgIC8vICAgICAvLyAgICAgZXZlbnQudGFyZ2V0LmNsb3Nlc3QoJy5vcHRpb24nKS5nZXRBdHRyaWJ1dGUoJ2RhdGEtdHlwZScpIDpcbiAgICAvLyAgICAgLy8gICAgIGN1cnJlbnRGYWtlRm9jdXNlZE9wdGlvbi5nZXRBdHRyaWJ1dGUoJ2RhdGEtdHlwZScpO1xuXG4gICAgLy8gICAgIGNvbnN0IGxhc3RTbGFzaEluZGV4ID0gcmVhbEZvY3VzZWRFbGVtZW50LmlubmVyVGV4dC5sYXN0SW5kZXhPZignLycpO1xuICAgIC8vICAgICByZWFsRm9jdXNlZEVsZW1lbnQuaW5uZXJUZXh0ID0gbGFzdFNsYXNoSW5kZXggIT09IC0xID8gcmVhbEZvY3VzZWRFbGVtZW50LmlubmVyVGV4dC5zbGljZSgwLCBsYXN0U2xhc2hJbmRleCkgOiByZWFsRm9jdXNlZEVsZW1lbnQuaW5uZXJUZXh0O1xuXG5cbiAgICAvLyAgICAgdHJhbnNmb3JtQmxvY2soZHJhZ2dhYmxlQmxvY2ssIG5ld0Jsb2NrVHlwZSk7XG5cbiAgICAvLyAgICAgaGlkZUFuZENsZWFyQmxvY2tPcHRpb25zKCk7XG4gICAgLy8gICAgIGhpZGVBbGxEZXBlbmRlbnRCb3goKTtcbiAgICAvLyAgICAgaGlkZWZsb2F0aW5nVG9vbGJhcigpO1xuICAgIC8vIH1cblxuICAgIHRyYW5zZm9ybUJsb2NrKGJsb2NrRWxlbWVudDogSFRNTEVsZW1lbnQsIHR5cGU6IHN0cmluZykge1xuXG4gICAgICAgIC8vYmxvY2tFbGVtZW50LCB0eXBlXG5cblxuICAgICAgICBsZXQgY29udGVudEVsZW1lbnQgPSBibG9ja0VsZW1lbnQucXVlcnlTZWxlY3RvcignLnN3aXR0YWJsZScpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBsZXQgY29udGVudCA9IGNvbnRlbnRFbGVtZW50Py5pbm5lclRleHQ7XG5cbiAgICAgICAgLy8gaWYgKGNvbnRlbnQuZW5kc1dpdGgoJy8nKSkge1xuICAgICAgICAvLyAgICAgY29udGVudCA9IGNvbnRlbnQuc2xpY2UoMCwgLTEpOyAvLyBSZW1vdmUgdGhlIGxhc3QgJy8nXG4gICAgICAgIC8vIH1cblxuICAgICAgICBsZXQgbmV3Q29udGVudEJsb2NrO1xuXG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgY2FzZSBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5QQVJBR1JBUEg6XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBuZXdDb250ZW50QmxvY2sgPSB0aGlzLmVsZW1lbnRGYWN0b3J5U2VydmljZS5jcmVhdGUoRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuUEFSQUdSQVBIKTtcbiAgICAgICAgICAgICAgICAgICAgbmV3Q29udGVudEJsb2NrLmlubmVyVGV4dCA9IGNvbnRlbnQ7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuSEVBREVSXzE6XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBuZXdDb250ZW50QmxvY2sgPSB0aGlzLmVsZW1lbnRGYWN0b3J5U2VydmljZS5jcmVhdGUoRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuSEVBREVSXzEpO1xuICAgICAgICAgICAgICAgICAgICBuZXdDb250ZW50QmxvY2suaW5uZXJUZXh0ID0gY29udGVudDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfMjpcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG5ld0NvbnRlbnRCbG9jayA9IHRoaXMuZWxlbWVudEZhY3RvcnlTZXJ2aWNlLmNyZWF0ZShFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfMik7XG4gICAgICAgICAgICAgICAgICAgIG5ld0NvbnRlbnRCbG9jay5pbm5lclRleHQgPSBjb250ZW50O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl8zOlxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3Q29udGVudEJsb2NrID0gdGhpcy5lbGVtZW50RmFjdG9yeVNlcnZpY2UuY3JlYXRlKEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl8zKTtcbiAgICAgICAgICAgICAgICAgICAgbmV3Q29udGVudEJsb2NrLmlubmVyVGV4dCA9IGNvbnRlbnQ7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuSEVBREVSXzQ6XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBuZXdDb250ZW50QmxvY2sgPSB0aGlzLmVsZW1lbnRGYWN0b3J5U2VydmljZS5jcmVhdGUoRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuSEVBREVSXzQpO1xuICAgICAgICAgICAgICAgICAgICBuZXdDb250ZW50QmxvY2suaW5uZXJUZXh0ID0gY29udGVudDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfNTpcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG5ld0NvbnRlbnRCbG9jayA9IHRoaXMuZWxlbWVudEZhY3RvcnlTZXJ2aWNlLmNyZWF0ZShFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfNSk7XG4gICAgICAgICAgICAgICAgICAgIG5ld0NvbnRlbnRCbG9jay5pbm5lclRleHQgPSBjb250ZW50O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl82OlxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3Q29udGVudEJsb2NrID0gdGhpcy5lbGVtZW50RmFjdG9yeVNlcnZpY2UuY3JlYXRlKEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl82KTtcbiAgICAgICAgICAgICAgICAgICAgbmV3Q29udGVudEJsb2NrLmlubmVyVGV4dCA9IGNvbnRlbnQ7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuQ09ERTpcbiAgICAgICAgICAgICAgICBuZXdDb250ZW50QmxvY2sgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdwcmUnKTtcbiAgICAgICAgICAgICAgICBjb25zdCBjb2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY29kZScpO1xuICAgICAgICAgICAgICAgIGNvZGUuaW5uZXJUZXh0ID0gY29udGVudDtcbiAgICAgICAgICAgICAgICBuZXdDb250ZW50QmxvY2suYXBwZW5kQ2hpbGQoY29kZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdpbWFnZSc6XG4gICAgICAgICAgICAgICAgbmV3Q29udGVudEJsb2NrID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7XG4gICAgICAgICAgICAgICAgbmV3Q29udGVudEJsb2NrLnNyYyA9IGNvbnRlbnQ7XG4gICAgICAgICAgICAgICAgbmV3Q29udGVudEJsb2NrLmFsdCA9IFwiRGVzY3JpcHRpdmUgdGV4dFwiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5RVU9URTpcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIC8vIG5ld0NvbnRlbnRCbG9jayA9IGZhY3RvcnkuY3JlYXRlTmV3UXVvdGVFbGVtZW50KGNvbnRlbnQpO1xuXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FzZSBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5CVUxMRVRFRF9MSVNUOlxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3Q29udGVudEJsb2NrID0gdGhpcy5lbGVtZW50RmFjdG9yeVNlcnZpY2UuY3JlYXRlKEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkJVTExFVEVEX0xJU1QsIGNvbnRlbnQpO1xuXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FzZSBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5OVU1CRVJFRF9MSVNUOlxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3Q29udGVudEJsb2NrID0gdGhpcy5lbGVtZW50RmFjdG9yeVNlcnZpY2UuY3JlYXRlKEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLk5VTUJFUkVEX0xJU1QsIGNvbnRlbnQpO1xuXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuQ0hFQ0tfTElTVDpcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG5ld0NvbnRlbnRCbG9jayA9IHRoaXMuZWxlbWVudEZhY3RvcnlTZXJ2aWNlLmNyZWF0ZShFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5DSEVDS19MSVNULCBjb250ZW50KTtcblxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNhc2UgJ3NlcGFyYXRvcic6XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAvLyBuZXdDb250ZW50QmxvY2sgPSBmYWN0b3J5LmNyZWF0ZU5ld1NlcGFyYXRvckVsZW1lbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1Vuc3VwcG9ydGVkIHR5cGUnKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIW5ld0NvbnRlbnRCbG9jaykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgYmxvY2tFbGVtZW50LnJlcGxhY2VDaGlsZChuZXdDb250ZW50QmxvY2ssIGNvbnRlbnRFbGVtZW50KTtcblxuICAgICAgICBjb25zdCBmb2N1c2FibGUgPSBuZXdDb250ZW50QmxvY2suY2xvc2VzdCgnLmZvY3VzYWJsZScpIHx8IGJsb2NrRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcuZm9jdXNhYmxlJyk7XG5cbiAgICAgICAgLy8gZm9jdXNPblRoZUVuZE9mVGhlVGV4dChmb2N1c2FibGUpO1xuICAgIH1cblxuXG5cbiAgICBjcmVhdGVOZXdFbGVtZW50KGV2ZW50OiBFdmVudCkge1xuXG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBldmVudC50YXJnZXQgYXMgRWxlbWVudDtcblxuICAgICAgICBjb25zdCBjb250ZW50RWxlbWVudCA9IGVsZW1lbnQuY2xvc2VzdCgnLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCcpIGFzIEhUTUxFbGVtZW50O1xuXG4gICAgICAgIGlmIChjb250ZW50RWxlbWVudCAmJiBjb250ZW50RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2xpc3QnKSkge1xuICAgICAgICAgICAgdGhpcy5jcmVhdGVMaXN0SXRlbShjb250ZW50RWxlbWVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZURlZmF1bHRCbG9jayhjb250ZW50RWxlbWVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjcmVhdGVMaXN0SXRlbShlbGVtZW50OiBIVE1MRWxlbWVudCk6IHZvaWQge1xuXG4gICAgICAgIGxldCBuZXdDb250ZW50RWxlbWVudCA9IG51bGw7XG5cbiAgICAgICAgbGV0IGFjdGl2ZUVsZW1lbnQgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICAgICAgICBsZXQgY29udGVudEVsZW1lbnQgPSBlbGVtZW50LmNsb3Nlc3QoJy5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQnKSBhcyBIVE1MRWxlbWVudDtcblxuICAgICAgICBpZiAoY29udGVudEVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdjaGVja2JveC1saXN0JykpIHtcbiAgICAgICAgICAgIG5ld0NvbnRlbnRFbGVtZW50ID0gdGhpcy5lbGVtZW50RmFjdG9yeVNlcnZpY2UuY3JlYXRlKFwiY2hlY2tib3hJdGVtXCIsIFwiXCIpO1xuICAgICAgICB9IGVsc2UgaWYgKGNvbnRlbnRFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnbGlzdCcpKSB7XG4gICAgICAgICAgICBuZXdDb250ZW50RWxlbWVudCA9IHRoaXMuZWxlbWVudEZhY3RvcnlTZXJ2aWNlLmNyZWF0ZShcImxpc3RJdGVtXCIsIFwiXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gbmV3Q29udGVudEVsZW1lbnQgPSBjcmVhdGVOZXdEcmFnZ2FibGVQYXJhZ3JhcGhFbGVtZW50KCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBsZXQgcGFyZW50QmxvY2sgPSBudWxsO1xuXG4gICAgICAgIC8vIGlmIChjb250ZW50RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2xpc3QnKSkge1xuXG4gICAgICAgIC8vICAgICBwYXJlbnRCbG9jayA9IGNvbnRlbnRFbGVtZW50O1xuXG4gICAgICAgIC8vICAgICBjb25zdCB0ZXh0Q29udGVudCA9IGFjdGl2ZUVsZW1lbnQudGV4dENvbnRlbnQudHJpbSgpO1xuXG4gICAgICAgIC8vICAgICBpZiAodGV4dENvbnRlbnQgPT09ICcnKSB7XG5cbiAgICAgICAgLy8gICAgICAgICBwYXJlbnRCbG9jayA9IGVsZW1lbnQuY2xvc2VzdCgnLmJsb2NrJyk7XG5cbiAgICAgICAgLy8gICAgICAgICBlbGVtZW50LmNsb3Nlc3QoJy5kZWxldGFibGUnKS5yZW1vdmUoKTtcblxuICAgICAgICAvLyAgICAgICAgIG5ld0NvbnRlbnRFbGVtZW50ID0gY3JlYXRlTmV3RHJhZ2dhYmxlUGFyYWdyYXBoRWxlbWVudCgpO1xuICAgICAgICAvLyAgICAgICAgIHBhcmVudEJsb2NrLmluc2VydEFkamFjZW50RWxlbWVudCgnYWZ0ZXJlbmQnLCBuZXdDb250ZW50RWxlbWVudCk7XG5cbiAgICAgICAgLy8gICAgIH0gZWxzZSB7XG4gICAgICAgIC8vICAgICAgICAgY29uc3QgYWN0aXZlRWxlbWVudCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQuY2xvc2VzdCgnLmxpc3QtaXRlbScpO1xuICAgICAgICAvLyAgICAgICAgIGFjdGl2ZUVsZW1lbnQuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCdhZnRlcmVuZCcsIG5ld0NvbnRlbnRFbGVtZW50KTtcbiAgICAgICAgLy8gICAgIH1cblxuICAgICAgICAvLyB9IGVsc2Uge1xuICAgICAgICAvLyAgICAgcGFyZW50QmxvY2sgPSBlbGVtZW50LmNsb3Nlc3QoJy5ibG9jaycpO1xuXG4gICAgICAgIC8vICAgICBpZiAocGFyZW50QmxvY2spIHtcbiAgICAgICAgLy8gICAgICAgICBpZiAocGFyZW50QmxvY2submV4dFNpYmxpbmcpIHtcbiAgICAgICAgLy8gICAgICAgICAgICAgcGFyZW50QmxvY2sucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobmV3Q29udGVudEVsZW1lbnQsIHBhcmVudEJsb2NrLm5leHRTaWJsaW5nKTtcbiAgICAgICAgLy8gICAgICAgICB9IGVsc2Uge1xuICAgICAgICAvLyAgICAgICAgICAgICBwYXJlbnRCbG9jay5wYXJlbnROb2RlLmFwcGVuZENoaWxkKG5ld0NvbnRlbnRFbGVtZW50KTtcbiAgICAgICAgLy8gICAgICAgICB9XG4gICAgICAgIC8vICAgICB9XG4gICAgICAgIC8vIH1cblxuICAgICAgICAvLyBmb2N1c09uVGhlRW5kT2ZUaGVUZXh0KG5ld0NvbnRlbnRFbGVtZW50KTtcbiAgICB9XG5cblxuICAgIGNyZWF0ZURlZmF1bHRCbG9jayhldmVudFBhcmFncmFwaDogRWxlbWVudCB8IG51bGwpOiB2b2lkIHtcblxuICAgICAgICBjb25zdCBuZXdCbG9jayA9IHRoaXMuZWxlbWVudEZhY3RvcnlTZXJ2aWNlLmNyZWF0ZShFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5CTE9DS19QQVJBR1JBUEgsIFwiXCIpO1xuXG4gICAgICAgIGlmIChldmVudFBhcmFncmFwaCAmJiBldmVudFBhcmFncmFwaC5jbG9zZXN0KCcuYmxvY2snKSkge1xuICAgICAgICAgICAgY29uc3Qgc2libGluZyA9IGV2ZW50UGFyYWdyYXBoLmNsb3Nlc3QoJy5ibG9jaycpITtcbiAgICAgICAgICAgIHNpYmxpbmcuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCdhZnRlcmVuZCcsIG5ld0Jsb2NrKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjam9oYW5uZXNFZGl0b3IgLmNvbnRlbnRcIikhLmFwcGVuZENoaWxkKG5ld0Jsb2NrKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZvY3VzYWJsZSA9IG5ld0Jsb2NrLnF1ZXJ5U2VsZWN0b3IoJy5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQnKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgZm9jdXNhYmxlLmZvY3VzKCk7XG5cbiAgICAgICAgLy8gZm9jdXNPblRoZUVuZE9mVGhlVGV4dChmb2N1c2FibGUpO1xuICAgIH1cblxuXG4gICAgcHJpdmF0ZSBkZWxldGVBbmRGb2N1c09uUHJldmlvdXMoKTogdm9pZCB7XG5cbiAgICAgICAgY29uc3QgY3VycmVudEFjdGl2ZUVsZW1lbnQgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50ITtcblxuICAgICAgICB0aGlzLmZvY3VzT25QcmV2aW91cyhjdXJyZW50QWN0aXZlRWxlbWVudCk7XG4gICAgICAgIHRoaXMuZGVsZXRlVGhlQ3VycmVudEVsZW1lbnRBbmRUaGVEcmFnZ2FibGVCbG9ja0lmRW1wdHkoY3VycmVudEFjdGl2ZUVsZW1lbnQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZGVsZXRlQW5kRm9jdXNPbk5leHQoKSB7XG5cbiAgICAgICAgbGV0IGN1cnJlbnRBY3RpdmVFbGVtZW50ID0gdGhpcy5nZXRDdXJyZW50U2VsZWN0ZWRCbG9jaygpIHx8IHRoaXMuZ2V0Q3VycmVudEFjdGl2ZUJsb2NrKCk7XG5cbiAgICAgICAgaWYgKCFjdXJyZW50QWN0aXZlRWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5mb2N1c09uTmV4dChjdXJyZW50QWN0aXZlRWxlbWVudCk7XG4gICAgICAgIHRoaXMuZGVsZXRlVGhlQ3VycmVudEVsZW1lbnRBbmRUaGVEcmFnZ2FibGVCbG9ja0lmRW1wdHkoY3VycmVudEFjdGl2ZUVsZW1lbnQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZm9jdXNPblByZXZpb3VzKGFjdHVhbEVsZW1lbnQ6IEVsZW1lbnQsIHBvc2l0aW9uOiBudW1iZXIgfCBudWxsID0gbnVsbCk6IHZvaWQge1xuXG4gICAgICAgIGxldCB0YWcgPSBhY3R1YWxFbGVtZW50LnRhZ05hbWUudG9VcHBlckNhc2UoKTtcbiAgICAgICAgbGV0IGZvY3VzZWRFbGVtZW50ID0gbnVsbDtcblxuICAgICAgICBpZiAodGFnID09PSAnTEknKSB7XG4gICAgICAgICAgICBsZXQgcHJldmlvdXNFbGVtZW50ID0gYWN0dWFsRWxlbWVudC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nO1xuXG4gICAgICAgICAgICBpZiAoIXByZXZpb3VzRWxlbWVudCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHByZXZpb3VzRWxlbWVudCAmJiBwcmV2aW91c0VsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdmb2N1c2FibGUnKSkge1xuICAgICAgICAgICAgICAgIGZvY3VzZWRFbGVtZW50ID0gcHJldmlvdXNFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcGx5Q3Vyc29yWEVuZFBvc2l0aW9uKGZvY3VzZWRFbGVtZW50LCBwb3NpdGlvbik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mb2N1c09uVGhlRW5kT2ZUaGVUZXh0KGZvY3VzZWRFbGVtZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gcmV0dXJuIGZvY3VzZWRFbGVtZW50O1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgoYWN0dWFsRWxlbWVudC5wYXJlbnROb2RlIGFzIEhUTUxFbGVtZW50KS50YWdOYW1lLnRvVXBwZXJDYXNlKCkgPT09ICdMSScgLyogZm9jdXNhYmxlIFNQQU4gaW5zaWRlIExJKi8pIHtcblxuICAgICAgICAgICAgbGV0IHByZXZpb3VzRWxlbWVudCA9IGFjdHVhbEVsZW1lbnQuY2xvc2VzdCgnbGknKT8ucHJldmlvdXNFbGVtZW50U2libGluZz8ucXVlcnlTZWxlY3RvcignLmZvY3VzYWJsZScpO1xuXG4gICAgICAgICAgICBpZiAocHJldmlvdXNFbGVtZW50ICYmIHByZXZpb3VzRWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2ZvY3VzYWJsZScpKSB7XG4gICAgICAgICAgICAgICAgZm9jdXNlZEVsZW1lbnQgPSBwcmV2aW91c0VsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwbHlDdXJzb3JYRW5kUG9zaXRpb24oZm9jdXNlZEVsZW1lbnQsIHBvc2l0aW9uKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZvY3VzT25UaGVFbmRPZlRoZVRleHQoZm9jdXNlZEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyByZXR1cm4gZm9jdXNlZEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBhcmVudCA9IGFjdHVhbEVsZW1lbnQuY2xvc2VzdCgnLmJsb2NrJyk7XG5cbiAgICAgICAgaWYgKCFwYXJlbnQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgc2libGluZyA9IHBhcmVudC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nO1xuXG4gICAgICAgIHdoaWxlIChzaWJsaW5nKSB7XG4gICAgICAgICAgICBsZXQgZm9jdXNhYmxlQ2FuZGlkYXRlcyA9IHNpYmxpbmcucXVlcnlTZWxlY3RvckFsbCgnLmZvY3VzYWJsZScpO1xuICAgICAgICAgICAgaWYgKGZvY3VzYWJsZUNhbmRpZGF0ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGZvY3VzZWRFbGVtZW50ID0gZm9jdXNhYmxlQ2FuZGlkYXRlc1tmb2N1c2FibGVDYW5kaWRhdGVzLmxlbmd0aCAtIDFdIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcGx5Q3Vyc29yWEVuZFBvc2l0aW9uKGZvY3VzZWRFbGVtZW50LCBwb3NpdGlvbik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mb2N1c09uVGhlRW5kT2ZUaGVUZXh0KGZvY3VzZWRFbGVtZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gcmV0dXJuIGZvY3VzZWRFbGVtZW50O1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc2libGluZyA9IHNpYmxpbmcucHJldmlvdXNFbGVtZW50U2libGluZztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHJldHVybiBmb2N1c2VkRWxlbWVudDtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHByaXZhdGUgZm9jdXNPbk5leHQoYWN0dWFsRWxlbWVudDogRWxlbWVudCwgcG9zaXRpb246IG51bWJlciB8IG51bGwgPSBudWxsKSB7XG4gICAgICAgIGxldCB0YWcgPSBhY3R1YWxFbGVtZW50LnRhZ05hbWUudG9VcHBlckNhc2UoKTtcbiAgICAgICAgbGV0IGZvY3VzZWRFbGVtZW50ID0gbnVsbDtcblxuICAgICAgICBpZiAodGFnID09PSAnTEknKSB7XG4gICAgICAgICAgICBsZXQgbmV4dEVsZW1lbnQgPSBhY3R1YWxFbGVtZW50Lm5leHRFbGVtZW50U2libGluZztcblxuICAgICAgICAgICAgaWYgKG5leHRFbGVtZW50ICYmIG5leHRFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnZm9jdXNhYmxlJykpIHtcbiAgICAgICAgICAgICAgICBmb2N1c2VkRWxlbWVudCA9IG5leHRFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xuXG4gICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwbHlDdXJzb3JYU3RhcnRQb3NpdGlvbihmb2N1c2VkRWxlbWVudCwgcG9zaXRpb24pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZm9jdXNPblRoZVN0YXJ0T2ZUaGVUZXh0KGZvY3VzZWRFbGVtZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZvY3VzZWRFbGVtZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKChhY3R1YWxFbGVtZW50LnBhcmVudE5vZGUgYXMgSFRNTEVsZW1lbnQpLnRhZ05hbWUudG9VcHBlckNhc2UoKSA9PT0gJ0xJJyAvKiBmb2N1c2FibGUgU1BBTiBpbnNpZGUgTEkqLykge1xuICAgICAgICAgICAgbGV0IG5leHRFbGVtZW50ID0gYWN0dWFsRWxlbWVudC5jbG9zZXN0KCdsaScpPy5uZXh0RWxlbWVudFNpYmxpbmc/LnF1ZXJ5U2VsZWN0b3IoJy5mb2N1c2FibGUnKTtcblxuICAgICAgICAgICAgaWYgKG5leHRFbGVtZW50ICYmIG5leHRFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnZm9jdXNhYmxlJykpIHtcbiAgICAgICAgICAgICAgICBmb2N1c2VkRWxlbWVudCA9IG5leHRFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcGx5Q3Vyc29yWFN0YXJ0UG9zaXRpb24oZm9jdXNlZEVsZW1lbnQsIHBvc2l0aW9uKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZvY3VzT25UaGVTdGFydE9mVGhlVGV4dChmb2N1c2VkRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBmb2N1c2VkRWxlbWVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBwYXJlbnQgPSBhY3R1YWxFbGVtZW50LmNsb3Nlc3QoJy5ibG9jaycpO1xuXG4gICAgICAgIGlmICghcGFyZW50KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgc2libGluZyA9IHBhcmVudC5uZXh0RWxlbWVudFNpYmxpbmc7XG5cbiAgICAgICAgd2hpbGUgKHNpYmxpbmcpIHtcbiAgICAgICAgICAgIGxldCBmb2N1c2FibGVDYW5kaWRhdGVzID0gc2libGluZy5xdWVyeVNlbGVjdG9yQWxsKCcuZm9jdXNhYmxlJyk7XG4gICAgICAgICAgICBpZiAoZm9jdXNhYmxlQ2FuZGlkYXRlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgZm9jdXNlZEVsZW1lbnQgPSBmb2N1c2FibGVDYW5kaWRhdGVzWzBdIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcGx5Q3Vyc29yWFN0YXJ0UG9zaXRpb24oZm9jdXNlZEVsZW1lbnQsIHBvc2l0aW9uKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZvY3VzT25UaGVTdGFydE9mVGhlVGV4dChmb2N1c2VkRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBmb2N1c2VkRWxlbWVudDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc2libGluZyA9IHNpYmxpbmcubmV4dEVsZW1lbnRTaWJsaW5nO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZvY3VzZWRFbGVtZW50O1xuICAgIH1cblxuXG5cbiAgICBkZWxldGVUaGVDdXJyZW50RWxlbWVudEFuZFRoZURyYWdnYWJsZUJsb2NrSWZFbXB0eShjdXJyZW50RWxlbWVudDogRWxlbWVudCkge1xuXG4gICAgICAgIGNvbnN0IHBhcmVudEJsb2NrID0gY3VycmVudEVsZW1lbnQuY2xvc2VzdCgnLmJsb2NrJyk7XG4gICAgICAgIGNvbnN0IGFjdHVhbCA9IGN1cnJlbnRFbGVtZW50LmNsb3Nlc3QoJy5kZWxldGFibGUnKTtcblxuICAgICAgICBhY3R1YWw/LnJlbW92ZSgpO1xuXG4gICAgICAgIGlmIChwYXJlbnRCbG9jayAmJiBwYXJlbnRCbG9jay5xdWVyeVNlbGVjdG9yQWxsKCcuZWRpdGFibGUnKS5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgcGFyZW50QmxvY2sucmVtb3ZlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cblxuXG5cbiAgICBhcHBseUN1cnNvclhFbmRQb3NpdGlvbihlbGVtZW50OiBIVE1MRWxlbWVudCwgeFBvc2l0aW9uOiBudW1iZXIpIHtcblxuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCkhO1xuICAgICAgICBjb25zdCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG5cbiAgICAgICAgbGV0IGN1cnJlbnROb2RlID0gZWxlbWVudC5sYXN0Q2hpbGQ7XG4gICAgICAgIGxldCByZXN1bHQgPSBudWxsO1xuXG4gICAgICAgIHdoaWxlIChjdXJyZW50Tm9kZSkge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnROb2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMuYWRqdXN0Q3Vyc29yT2Zmc2V0KGN1cnJlbnROb2RlLCB4UG9zaXRpb24pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50Tm9kZS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSAnQlInKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZS5wcmV2aW91c1NpYmxpbmc7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLnByZXZpb3VzU2libGluZztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXN1bHQgJiYgcmVzdWx0LmNsb3Nlc3ROb2RlKSB7XG4gICAgICAgICAgICByYW5nZS5zZXRTdGFydChyZXN1bHQuY2xvc2VzdE5vZGUsIHJlc3VsdC5jbG9zZXN0T2Zmc2V0KTtcbiAgICAgICAgICAgIHJhbmdlLmNvbGxhcHNlKHRydWUpO1xuICAgICAgICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgICAgICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKTtcbiAgICAgICAgICAgIGVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhlbGVtZW50KTtcbiAgICAgICAgICAgIHJhbmdlLmNvbGxhcHNlKGZhbHNlKTtcbiAgICAgICAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICAgICAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSk7XG4gICAgICAgICAgICBlbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhcHBseUN1cnNvclhTdGFydFBvc2l0aW9uKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCB4UG9zaXRpb246IG51bWJlcikge1xuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCkhO1xuICAgICAgICBjb25zdCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG5cbiAgICAgICAgbGV0IGN1cnJlbnROb2RlID0gZWxlbWVudC5maXJzdENoaWxkO1xuICAgICAgICBsZXQgcmVzdWx0ID0gbnVsbDtcblxuICAgICAgICB3aGlsZSAoY3VycmVudE5vZGUpIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50Tm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB0aGlzLmFkanVzdEN1cnNvck9mZnNldChjdXJyZW50Tm9kZSwgeFBvc2l0aW9uKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGN1cnJlbnROb2RlID0gY3VycmVudE5vZGUubmV4dFNpYmxpbmc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVzdWx0ICYmIHJlc3VsdC5jbG9zZXN0Tm9kZSkge1xuICAgICAgICAgICAgcmFuZ2Uuc2V0U3RhcnQocmVzdWx0LmNsb3Nlc3ROb2RlLCByZXN1bHQuY2xvc2VzdE9mZnNldCk7XG4gICAgICAgICAgICByYW5nZS5jb2xsYXBzZSh0cnVlKTtcbiAgICAgICAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICAgICAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSk7XG4gICAgICAgICAgICBlbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByYW5nZS5zZWxlY3ROb2RlQ29udGVudHMoZWxlbWVudCk7XG4gICAgICAgICAgICByYW5nZS5jb2xsYXBzZSh0cnVlKTtcbiAgICAgICAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICAgICAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSk7XG4gICAgICAgICAgICBlbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhZGp1c3RDdXJzb3JPZmZzZXQobm9kZTogTm9kZSwgeFBvc2l0aW9uOiBudW1iZXIpIHtcbiAgICAgICAgbGV0IHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcbiAgICAgICAgbGV0IGNsb3Nlc3ROb2RlID0gbm9kZTtcbiAgICAgICAgbGV0IGNsb3Nlc3RPZmZzZXQgPSAwO1xuICAgICAgICBsZXQgY2xvc2VzdERpZmYgPSBJbmZpbml0eTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUudGV4dENvbnRlbnQhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICByYW5nZS5zZXRTdGFydChub2RlLCBpKTtcbiAgICAgICAgICAgIHJhbmdlLnNldEVuZChub2RlLCBpICsgMSk7XG4gICAgICAgICAgICBjb25zdCByZWN0ID0gcmFuZ2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICBjb25zdCBsZWZ0RGlmZiA9IE1hdGguYWJzKHJlY3QubGVmdCAtIHhQb3NpdGlvbik7XG4gICAgICAgICAgICBjb25zdCByaWdodERpZmYgPSBNYXRoLmFicyhyZWN0LnJpZ2h0IC0geFBvc2l0aW9uKTtcblxuICAgICAgICAgICAgaWYgKGxlZnREaWZmIDwgY2xvc2VzdERpZmYgfHwgcmlnaHREaWZmIDwgY2xvc2VzdERpZmYpIHtcbiAgICAgICAgICAgICAgICBjbG9zZXN0RGlmZiA9IE1hdGgubWluKGxlZnREaWZmLCByaWdodERpZmYpO1xuICAgICAgICAgICAgICAgIGNsb3Nlc3RPZmZzZXQgPSBpICsgKHJpZ2h0RGlmZiA8IGxlZnREaWZmID8gMSA6IDApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHhQb3NpdGlvbiA+IHJhbmdlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnJpZ2h0KSB7XG4gICAgICAgICAgICBjbG9zZXN0T2Zmc2V0ID0gbm9kZS50ZXh0Q29udGVudCEubGVuZ3RoO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHsgY2xvc2VzdE5vZGUsIGNsb3Nlc3RPZmZzZXQgfTtcbiAgICB9XG5cblxuICAgIGZvY3VzT25UaGVFbmRPZlRoZVRleHQoY29udGVudEJsb2NrOiBIVE1MRWxlbWVudCkge1xuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuXG4gICAgICAgICAgICBjb25zdCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCkhO1xuXG4gICAgICAgICAgICByYW5nZS5zZWxlY3ROb2RlQ29udGVudHMoY29udGVudEJsb2NrKTtcblxuICAgICAgICAgICAgbGV0IGxhc3RDaGlsZCA9IGNvbnRlbnRCbG9jaztcblxuICAgICAgICAgICAgd2hpbGUgKGxhc3RDaGlsZC5sYXN0Q2hpbGQgJiYgbGFzdENoaWxkLmxhc3RDaGlsZC5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUpIHtcbiAgICAgICAgICAgICAgICBsYXN0Q2hpbGQgPSBsYXN0Q2hpbGQubGFzdENoaWxkIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGxhc3RDaGlsZC5sYXN0Q2hpbGQpIHtcbiAgICAgICAgICAgICAgICBsYXN0Q2hpbGQgPSBsYXN0Q2hpbGQubGFzdENoaWxkIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByYW5nZS5zZXRFbmQobGFzdENoaWxkLCBsYXN0Q2hpbGQudGV4dENvbnRlbnQhLmxlbmd0aCk7XG4gICAgICAgICAgICByYW5nZS5jb2xsYXBzZShmYWxzZSk7XG5cbiAgICAgICAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICAgICAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSk7XG5cbiAgICAgICAgICAgIGNvbnRlbnRCbG9jay5mb2N1cygpO1xuICAgICAgICB9LCAxMCk7XG4gICAgfVxuXG4gICAgZm9jdXNPblRoZVN0YXJ0T2ZUaGVUZXh0KGNvbnRlbnRCbG9jazogSFRNTEVsZW1lbnQpIHtcblxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKSE7XG5cbiAgICAgICAgICAgIHJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhjb250ZW50QmxvY2spO1xuICAgICAgICAgICAgcmFuZ2UuY29sbGFwc2UodHJ1ZSk7XG4gICAgICAgICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgICAgICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpO1xuXG4gICAgICAgICAgICBjb250ZW50QmxvY2suZm9jdXMoKTtcbiAgICAgICAgfSwgMTApO1xuICAgIH1cblxuXG5cbiAgICBnZXRDdXJyZW50U2VsZWN0ZWRGb2N1c2FibGUoKTogRWxlbWVudCB8IG51bGwge1xuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gICAgICAgIGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAwKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xuICAgICAgICBsZXQgY29udGFpbmVyOiBOb2RlIHwgbnVsbCA9IHJhbmdlLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyO1xuXG4gICAgICAgIGlmIChjb250YWluZXIubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgICAgICAgICBjb250YWluZXIgPSBjb250YWluZXIucGFyZW50Tm9kZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZvY3VzYWJsZVBhcmVudCA9IChjb250YWluZXIgYXMgSFRNTEVsZW1lbnQpLmNsb3Nlc3QoXCIuZm9jdXNhYmxlXCIpO1xuXG4gICAgICAgIHJldHVybiBmb2N1c2FibGVQYXJlbnQ7XG4gICAgfVxuXG4gICAgZ2V0Q3VycmVudFNlbGVjdGVkQmxvY2soKTogRWxlbWVudCB8IG51bGwge1xuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gICAgICAgIGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAwKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xuICAgICAgICBsZXQgY29udGFpbmVyOiBOb2RlIHwgbnVsbCA9IHJhbmdlLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyO1xuXG4gICAgICAgIGlmIChjb250YWluZXIubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgICAgICAgICBjb250YWluZXIgPSBjb250YWluZXIucGFyZW50Tm9kZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZvY3VzYWJsZVBhcmVudCA9IChjb250YWluZXIgYXMgSFRNTEVsZW1lbnQpLmNsb3Nlc3QoXCIuYmxvY2tcIik7XG5cbiAgICAgICAgcmV0dXJuIGZvY3VzYWJsZVBhcmVudDtcbiAgICB9XG5cbiAgICBnZXRDdXJyZW50QWN0aXZlQmxvY2soKTogRWxlbWVudCB8IG51bGwge1xuXG4gICAgICAgIGxldCBjb250YWluZXIgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuXG4gICAgICAgIGlmIChjb250YWluZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBjb250YWluZXIuY2xvc2VzdChcIi5ibG9ja1wiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuXG4gICAgZHVwbGljYXRlU2VsZWN0ZWRCbG9jaygpIHtcblxuICAgICAgICBsZXQgZWxlbWVudCA9IHRoaXMuZ2V0Q3VycmVudFNlbGVjdGVkQmxvY2soKSB8fCB0aGlzLmdldEN1cnJlbnRBY3RpdmVCbG9jaygpO1xuXG4gICAgICAgIGlmICghZWxlbWVudCB8fCAhZWxlbWVudC5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdPIGVsZW1lbnRvIGZvcm5lY2lkbyDDqSBpbnbDoWxpZG8gb3UgbsOjbyBlc3TDoSBubyBET00uJyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjbG9uZSA9IGVsZW1lbnQuY2xvbmVOb2RlKHRydWUpO1xuXG4gICAgICAgIGNvbnN0IG5leHRFbGVtZW50ID0gZWxlbWVudC5uZXh0U2libGluZztcblxuICAgICAgICBlbGVtZW50LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGNsb25lLCBuZXh0RWxlbWVudCk7XG4gICAgfVxuXG59IiwiZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VVSUNvbXBvbmVudDxUIGV4dGVuZHMgSFRNTEVsZW1lbnQgPSBIVE1MRWxlbWVudD4ge1xyXG5cclxuICAgIHByaXZhdGUgX2NhbkhpZGU6IGJvb2xlYW47XHJcblxyXG4gICAgcHJvcHM6IFJlY29yZDxzdHJpbmcsIGFueT47XHJcbiAgICBodG1sRWxlbWVudDogVDtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wczogUmVjb3JkPHN0cmluZywgYW55Pikge1xyXG5cclxuICAgICAgICB0aGlzLnByb3BzID0gcHJvcHM7XHJcblxyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQgPSB0aGlzLmluaXQoKSBhcyBUO1xyXG4gICAgICAgIHRoaXMuX2NhbkhpZGUgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGFic3RyYWN0IGluaXQoKTogSFRNTEVsZW1lbnQ7XHJcblxyXG4gICAgZ2V0IGRpc3BsYXkoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gJ2Jsb2NrJztcclxuICAgIH1cclxuXHJcbiAgICBkb2N1bWVudEFwcGVuZFRvKHBhcmVudDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcclxuICAgICAgICBwYXJlbnQuYXBwZW5kQ2hpbGQodGhpcy5odG1sRWxlbWVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGlzVmlzaWJsZSgpIHtcclxuICAgICAgICBsZXQgZWxlbWVudDogSFRNTEVsZW1lbnQgPSB0aGlzLmh0bWxFbGVtZW50O1xyXG5cclxuICAgICAgICBpZiAoZWxlbWVudC5zdHlsZS5kaXNwbGF5ID09PSAnbm9uZScgfHwgZWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID09PSAnaGlkZGVuJyB8fCAhZG9jdW1lbnQuY29udGFpbnMoZWxlbWVudCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgd2hpbGUgKGVsZW1lbnQpIHtcclxuICAgICAgICAgICAgY29uc3Qgc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KTtcclxuXHJcbiAgICAgICAgICAgIGlmIChzdHlsZS5kaXNwbGF5ID09PSAnbm9uZScgfHwgc3R5bGUudmlzaWJpbGl0eSA9PT0gJ2hpZGRlbicpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGVsZW1lbnQucGFyZW50RWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50RWxlbWVudDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBzaG93KCkge1xyXG4gICAgICAgIHRoaXMuX2NhbkhpZGUgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSB0aGlzLmRpc3BsYXk7XHJcblxyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLl9jYW5IaWRlID0gdHJ1ZTtcclxuICAgICAgICB9LCAxMDApO1xyXG4gICAgfVxyXG5cclxuICAgIGhpZGUoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9jYW5IaWRlKSB7XHJcblxyXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXCJBdHRlbXB0ZWQgdG8gaGlkZSB0aGUgZWxlbWVudCBiZWZvcmUgMTAwIG1pbGxpc2Vjb25kcyBoYXZlIHBhc3NlZCBzaW5jZSB0aGUgbGFzdCBkaXNwbGF5LlwiKTtcclxuICAgICAgICAgICAgLy8gcmV0dXJuO1xyXG4gICAgICAgICAgICAvLyB0aHJvdyBuZXcgRXJyb3IoXCJBdHRlbXB0ZWQgdG8gaGlkZSB0aGUgZWxlbWVudCBiZWZvcmUgMTAwIG1pbGxpc2Vjb25kcyBoYXZlIHBhc3NlZCBzaW5jZSB0aGUgbGFzdCBkaXNwbGF5LlwiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuICAgIH1cclxuXHJcbiAgICBnZXQgY2FuSGlkZSgpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fY2FuSGlkZSAmJiB0aGlzLmlzVmlzaWJsZTtcclxuICAgIH1cclxuXHJcbiAgICBzZXQgY2FuSGlkZSh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgICAgIHRoaXMuX2NhbkhpZGUgPSB2YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICBmb2N1cygpIHtcclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LmZvY3VzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgY2hhbmdlQ29sb3IodmFsdWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUuY29sb3IgPSB2YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICByZW1vdmVDb2xvcigpe1xyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUuY29sb3IgPSBcImluaGVyaXRcIjtcclxuICAgIH1cclxuXHJcbiAgICBjaGFuZ2VWaXNpYmlsaXR5VG9WaXNpYmxlKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9IFwidmlzaWJsZVwiO1xyXG4gICAgfVxyXG5cclxuICAgIGNoYW5nZVZpc2liaWxpdHlUb0hpZGRlbigpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSBcImhpZGRlblwiO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBkb2VzRWxlbWVudE92ZXJmbG93U2NyZWVuKCk6IGJvb2xlYW4ge1xyXG5cclxuICAgICAgICBjb25zdCBvcmlnaW5hbERpc3BsYXkgPSB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLmRpc3BsYXk7XHJcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxWaXNpYmlsaXR5ID0gdGhpcy5odG1sRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5O1xyXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsUG9zaXRpb24gPSB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLnBvc2l0aW9uO1xyXG5cclxuICAgICAgICBpZiAob3JpZ2luYWxEaXNwbGF5ID09PSAnbm9uZScpIHtcclxuICAgICAgICAgICAgdGhpcy5odG1sRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcclxuICAgICAgICAgICAgdGhpcy5odG1sRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XHJcbiAgICAgICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZWxlbWVudFJlY3QgPSB0aGlzLmh0bWxFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICAgIGNvbnN0IHNjcmVlbldpZHRoID0gd2luZG93LmlubmVyV2lkdGg7XHJcblxyXG4gICAgICAgIGlmIChvcmlnaW5hbERpc3BsYXkgPT09ICdub25lJykge1xyXG4gICAgICAgICAgICB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSBvcmlnaW5hbERpc3BsYXk7XHJcbiAgICAgICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9IG9yaWdpbmFsVmlzaWJpbGl0eTtcclxuICAgICAgICAgICAgdGhpcy5odG1sRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9IG9yaWdpbmFsUG9zaXRpb247XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBlbGVtZW50UmlnaHRFZGdlID0gZWxlbWVudFJlY3QucmlnaHQ7XHJcblxyXG4gICAgICAgIGlmIChlbGVtZW50UmlnaHRFZGdlID4gc2NyZWVuV2lkdGgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoZWxlbWVudFJlY3QubGVmdCA8IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBCYXNlVUlDb21wb25lbnQgfSBmcm9tICcuLi9jb21tb24vQmFzZVVJQ29tcG9uZW50JztcclxuXHJcbmV4cG9ydCBjbGFzcyBRdWlja01lbnVFbXB0eSBleHRlbmRzIEJhc2VVSUNvbXBvbmVudCB7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcblxyXG4gICAgICAgIHN1cGVyKHt9KTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0KCk6IEhUTUxFbGVtZW50IHtcclxuXHJcbiAgICAgICAgY29uc3QgaHRtbEVtcHR5SW5kaWNhdG9yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xyXG5cclxuICAgICAgICBodG1sRW1wdHlJbmRpY2F0b3IuaW5uZXJUZXh0ID0gJ05vIHJlc3VsdHMnO1xyXG4gICAgICAgIGh0bWxFbXB0eUluZGljYXRvci5jbGFzc0xpc3QuYWRkKCdlbXB0eS1ibG9jay1vcHRpb25zJyk7XHJcbiAgICAgICAgaHRtbEVtcHR5SW5kaWNhdG9yLnN0eWxlLnBhZGRpbmcgPSAnMTBweCc7XHJcbiAgICAgICAgaHRtbEVtcHR5SW5kaWNhdG9yLnN0eWxlLmNvbG9yID0gJ3JnYmEoNTUsIDUzLCA0NywgMC42NSknO1xyXG4gICAgICAgIGh0bWxFbXB0eUluZGljYXRvci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG5cclxuICAgICAgICByZXR1cm4gaHRtbEVtcHR5SW5kaWNhdG9yO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgSk5vZGUgfSBmcm9tIFwiLi9KTm9kZVwiO1xyXG5cclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VEb3VibHlMaW5rZWRMaXN0PFQ+IHtcclxuXHJcbiAgICBoZWFkOiBKTm9kZTxUPiB8IG51bGwgPSBudWxsO1xyXG4gICAgdGFpbDogSk5vZGU8VD4gfCBudWxsID0gbnVsbDtcclxuXHJcbiAgICBsZW5ndGg6IG51bWJlciA9IDA7XHJcblxyXG4gICAgYWJzdHJhY3QgYXBwZW5kKGVsZW1lbnQ6IFQpOiB2b2lkO1xyXG5cclxuICAgIGdldEZpcnN0KCk6IEpOb2RlPFQ+IHwgbnVsbCB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaGVhZDtcclxuICAgIH1cclxuXHJcbiAgICBnZXRMYXN0KCk6IEpOb2RlPFQ+IHwgbnVsbCB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudGFpbDtcclxuICAgIH1cclxuXHJcbiAgICAqW1N5bWJvbC5pdGVyYXRvcl0oKSB7XHJcbiAgICAgICAgbGV0IGN1cnJlbnQgPSB0aGlzLmhlYWQ7XHJcbiAgICAgICAgaWYgKCFjdXJyZW50KSByZXR1cm47XHJcbiAgICAgICAgZG8ge1xyXG4gICAgICAgICAgICB5aWVsZCBjdXJyZW50O1xyXG4gICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0Tm9kZTtcclxuICAgICAgICB9IHdoaWxlIChjdXJyZW50ICYmIGN1cnJlbnQgIT09IHRoaXMuaGVhZCk7XHJcbiAgICB9XHJcblxyXG4gICAgZm9yRWFjaChjYWxsYmFjazogKG5vZGU6IFQsIGluZGV4OiBudW1iZXIsIGxpc3Q6IEJhc2VEb3VibHlMaW5rZWRMaXN0PFQ+KSA9PiB2b2lkKTogdm9pZCB7XHJcbiAgICAgICAgbGV0IGluZGV4ID0gMDtcclxuICAgICAgICBmb3IgKGxldCBub2RlIG9mIHRoaXMpIHtcclxuICAgICAgICAgICAgY2FsbGJhY2sobm9kZS52YWx1ZSwgaW5kZXgsIHRoaXMpO1xyXG4gICAgICAgICAgICBpbmRleCsrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhbnkocHJlZGljYXRlOiAobm9kZTogVCkgPT4gYm9vbGVhbik6IGJvb2xlYW4ge1xyXG4gICAgICAgIGxldCBjdXJyZW50ID0gdGhpcy5oZWFkO1xyXG4gICAgICAgIHdoaWxlIChjdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGlmIChwcmVkaWNhdGUoY3VycmVudC52YWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHROb2RlO1xyXG4gICAgICAgICAgICBpZiAoY3VycmVudCA9PT0gdGhpcy5oZWFkKSBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGZpbmRGaXJzdChwcmVkaWNhdGU6IChub2RlOiBUKSA9PiBib29sZWFuKTogSk5vZGU8VD4gfCBudWxsIHtcclxuICAgICAgICBpZiAoIXRoaXMuaGVhZCkgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgICAgIGxldCBjdXJyZW50OiBudWxsIHwgSk5vZGU8VD4gPSB0aGlzLmhlYWQ7XHJcbiAgICAgICAgZG8ge1xyXG4gICAgICAgICAgICBpZiAocHJlZGljYXRlKGN1cnJlbnQudmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0Tm9kZTtcclxuICAgICAgICB9IHdoaWxlIChjdXJyZW50ICYmIGN1cnJlbnQgIT09IHRoaXMuaGVhZCk7XHJcblxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGZpbmRMYXN0KHByZWRpY2F0ZTogKG5vZGU6IFQpID0+IGJvb2xlYW4pOiBKTm9kZTxUPiB8IG51bGwge1xyXG4gICAgICAgIGlmICghdGhpcy50YWlsKSByZXR1cm4gbnVsbDtcclxuXHJcbiAgICAgICAgbGV0IGN1cnJlbnQ6IG51bGwgfCBKTm9kZTxUPiA9IHRoaXMudGFpbDtcclxuXHJcbiAgICAgICAgZG8ge1xyXG4gICAgICAgICAgICBpZiAocHJlZGljYXRlKGN1cnJlbnQudmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5wcmV2aW91c05vZGU7XHJcbiAgICAgICAgfSB3aGlsZSAoY3VycmVudCAmJiBjdXJyZW50ICE9PSB0aGlzLnRhaWwpO1xyXG5cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBmaW5kKGVsZW1lbnQ6IFQpOiBKTm9kZTxUPiB8IG51bGwge1xyXG5cclxuICAgICAgICBsZXQgY3VycmVudDogSk5vZGU8VD4gfCBudWxsID0gdGhpcy5oZWFkO1xyXG5cclxuICAgICAgICB3aGlsZSAoY3VycmVudCkge1xyXG4gICAgICAgICAgICBpZiAoY3VycmVudC52YWx1ZSA9PSBlbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dE5vZGU7XHJcbiAgICAgICAgICAgIGlmIChjdXJyZW50ID09PSB0aGlzLmhlYWQpIGJyZWFrO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBCYXNlRG91Ymx5TGlua2VkTGlzdCB9IGZyb20gXCIuL0Jhc2VEb3VibHlMaW5rZWRMaXN0XCI7XHJcblxyXG5leHBvcnQgY2xhc3MgSk5vZGU8VD4ge1xyXG5cclxuICAgIHBhcmVudExpc3Q6IEJhc2VEb3VibHlMaW5rZWRMaXN0PFQ+O1xyXG5cclxuICAgIHByZXZpb3VzTm9kZTogSk5vZGU8VD4gfCBudWxsO1xyXG4gICAgbmV4dE5vZGU6IEpOb2RlPFQ+IHwgbnVsbDtcclxuICAgIHZhbHVlOiBUO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHZhbHVlOiBULCBwYXJlbnRMaXN0OiBCYXNlRG91Ymx5TGlua2VkTGlzdDxUPikge1xyXG4gICAgICAgIHRoaXMucHJldmlvdXNOb2RlID0gbnVsbDtcclxuICAgICAgICB0aGlzLm5leHROb2RlID0gbnVsbDtcclxuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy5wYXJlbnRMaXN0ID0gcGFyZW50TGlzdDtcclxuICAgIH1cclxuXHJcbiAgICBzZXROZXh0KG5vZGU6IEpOb2RlPFQ+KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5uZXh0Tm9kZSA9IG5vZGU7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0UHJldmlvdXMobm9kZTogSk5vZGU8VD4pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnByZXZpb3VzTm9kZSA9IG5vZGU7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0TmV4dFNhdGlzZnlpbmcocHJlZGljYXRlOiAobm9kZTogVCkgPT4gYm9vbGVhbik6IEpOb2RlPFQ+IHwgbnVsbCB7XHJcbiAgICAgICAgbGV0IGN1cnJlbnQgPSB0aGlzLm5leHROb2RlO1xyXG4gICAgICAgIGNvbnN0IHN0YXJ0Tm9kZSA9IHRoaXM7XHJcbiAgICAgICAgd2hpbGUgKGN1cnJlbnQpIHtcclxuICAgICAgICAgICAgaWYgKHByZWRpY2F0ZShjdXJyZW50LnZhbHVlKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dE5vZGU7XHJcbiAgICAgICAgICAgIGlmIChjdXJyZW50ID09PSBzdGFydE5vZGUpIHtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFByZXZpb3VzU2F0aXNmeWluZyhwcmVkaWNhdGU6IChub2RlOiBUKSA9PiBib29sZWFuKTogSk5vZGU8VD4gfCBudWxsIHtcclxuICAgICAgICBsZXQgY3VycmVudCA9IHRoaXMucHJldmlvdXNOb2RlO1xyXG4gICAgICAgIGNvbnN0IHN0YXJ0Tm9kZSA9IHRoaXM7XHJcbiAgICAgICAgd2hpbGUgKGN1cnJlbnQgJiYgY3VycmVudCAhPT0gc3RhcnROb2RlKSB7XHJcbiAgICAgICAgICAgIGlmIChwcmVkaWNhdGUoY3VycmVudC52YWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LnByZXZpb3VzTm9kZTtcclxuICAgICAgICAgICAgaWYgKGN1cnJlbnQgPT09IHRoaXMpIHtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgQmFzZURvdWJseUxpbmtlZExpc3QgfSBmcm9tIFwiLi9CYXNlRG91Ymx5TGlua2VkTGlzdFwiO1xyXG5pbXBvcnQgeyBKTm9kZSB9IGZyb20gXCIuL0pOb2RlXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgQ2lyY3VsYXJEb3VibHlMaW5rZWRMaXN0PFQ+IGV4dGVuZHMgQmFzZURvdWJseUxpbmtlZExpc3Q8VD4ge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXBwZW5kKGVsZW1lbnQ6IFQpOiB2b2lkIHtcclxuXHJcbiAgICAgICAgY29uc3Qgbm9kZSA9IG5ldyBKTm9kZShlbGVtZW50LCB0aGlzKTtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLmhlYWQgfHwgIXRoaXMudGFpbCkge1xyXG5cclxuICAgICAgICAgICAgdGhpcy5oZWFkID0gbm9kZTtcclxuICAgICAgICAgICAgdGhpcy50YWlsID0gbm9kZTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuaGVhZC5zZXROZXh0KHRoaXMudGFpbCk7XHJcbiAgICAgICAgICAgIHRoaXMuaGVhZC5zZXRQcmV2aW91cyh0aGlzLnRhaWwpO1xyXG5cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBub2RlLnNldFByZXZpb3VzKHRoaXMudGFpbCk7XHJcbiAgICAgICAgICAgIG5vZGUuc2V0TmV4dCh0aGlzLmhlYWQpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy50YWlsLnNldE5leHQobm9kZSk7XHJcbiAgICAgICAgICAgIHRoaXMuaGVhZC5zZXRQcmV2aW91cyhub2RlKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMudGFpbCA9IG5vZGU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmxlbmd0aCsrO1xyXG4gICAgfVxyXG59IiwiZXhwb3J0IGNsYXNzIFNlcnZpY2VOb3RGb3VuZEV4Y2VwdGlvbiBleHRlbmRzIEVycm9yIHtcclxuICAgIGNvbnN0cnVjdG9yKHNlcnZpY2VLZXk6IHN0cmluZykge1xyXG4gICAgICAgIHN1cGVyKGBTZXJ2aWNlIG5vdCBmb3VuZDogJHtzZXJ2aWNlS2V5fWApO1xyXG4gICAgICAgIHRoaXMubmFtZSA9IFwiU2VydmljZU5vdEZvdW5kRXhjZXB0aW9uXCI7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBTZXJ2aWNlTm90Rm91bmRFeGNlcHRpb24gfSBmcm9tIFwiLi4vZXJyb3JzL1NlcnZpY2VOb3RGb3VuZEV4Y2VwdGlvblwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFNlcnZpY2VQcm92aWRlciB7XHJcbiAgICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZTogU2VydmljZVByb3ZpZGVyO1xyXG4gICAgcHJpdmF0ZSBzZXJ2aWNlczogTWFwPHN0cmluZywgYW55PiA9IG5ldyBNYXAoKTtcclxuXHJcbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKCkgeyB9XHJcblxyXG4gICAgc3RhdGljIGdldEluc3RhbmNlKCk6IFNlcnZpY2VQcm92aWRlciB7XHJcbiAgICAgICAgaWYgKCFTZXJ2aWNlUHJvdmlkZXIuaW5zdGFuY2UpIHtcclxuICAgICAgICAgICAgU2VydmljZVByb3ZpZGVyLmluc3RhbmNlID0gbmV3IFNlcnZpY2VQcm92aWRlcigpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gU2VydmljZVByb3ZpZGVyLmluc3RhbmNlO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEluc3RhbmNlT2Y8VD4oa2V5OiBzdHJpbmcpOiBUIHtcclxuICAgICAgICBjb25zdCBzZXJ2aWNlID0gdGhpcy5zZXJ2aWNlcy5nZXQoa2V5KTtcclxuICAgICAgICBpZiAoIXNlcnZpY2UpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZpY2VOb3RGb3VuZEV4Y2VwdGlvbihrZXkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gc2VydmljZSBhcyBUO1xyXG4gICAgfVxyXG5cclxuICAgIHJlZ2lzdGVyU2VydmljZTxUPihrZXk6IHN0cmluZywgaW5zdGFuY2U6IFQpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnNlcnZpY2VzLnNldChrZXksIGluc3RhbmNlKTtcclxuICAgIH1cclxuXHJcbiAgICByZWdpc3RlclNlcnZpY2VzKHNlcnZpY2VzOiBNYXA8c3RyaW5nLCBhbnk+KTogdm9pZCB7XHJcbiAgICAgICAgc2VydmljZXMuZm9yRWFjaCgoaW5zdGFuY2UsIGtleSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnJlZ2lzdGVyU2VydmljZShrZXksIGluc3RhbmNlKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICByZXNldCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnNlcnZpY2VzLmNsZWFyKCk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBRdWlja01lbnVTZWN0aW9uIH0gZnJvbSAnLi9RdWlja01lbnVTZWN0aW9uJztcbmltcG9ydCB7IFF1aWNrTWVudUVtcHR5IH0gZnJvbSAnLi9RdWlja01lbnVFbXB0eSc7XG5pbXBvcnQgeyBRdWlja01lbnVJdGVtIH0gZnJvbSAnLi9RdWlja01lbnVJdGVtJztcbmltcG9ydCB7IEJhc2VVSUNvbXBvbmVudCB9IGZyb20gJy4uL2NvbW1vbi9CYXNlVUlDb21wb25lbnQnO1xuaW1wb3J0IHsgQ2lyY3VsYXJEb3VibHlMaW5rZWRMaXN0IH0gZnJvbSAnLi4vLi4vY29tbW9uL0NpcmN1bGFyRG91Ymx5TGlua2VkTGlzdCc7XG5pbXBvcnQgeyBJQmxvY2tPcGVyYXRpb25zU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2Jsb2NrLW9wZXJhdGlvbnMvSUJsb2NrT3BlcmF0aW9uc1NlcnZpY2UnO1xuaW1wb3J0IHsgSk5vZGUgfSBmcm9tIFwiLi4vLi4vY29tbW9uL0pOb2RlXCI7XG5pbXBvcnQgeyBTZXJ2aWNlUHJvdmlkZXIgfSBmcm9tIFwiLi4vLi4vc2VydmljZXMvc2VydmljZS1wcm92aWRlci9TZXJ2aWNlUHJvdmlkZXJcIjtcblxuZXhwb3J0IGNsYXNzIFF1aWNrTWVudSBleHRlbmRzIEJhc2VVSUNvbXBvbmVudCB7XG5cbiAgICBzdGF0aWMgaWQgPSBcInF1aWNrTWVudVwiO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBibG9ja09wZXJhdGlvbnNTZXJ2aWNlOiBJQmxvY2tPcGVyYXRpb25zU2VydmljZTtcblxuICAgIHByaXZhdGUgY3VycmVudEZvY3VzZWRNZW51SXRlbTogSk5vZGU8UXVpY2tNZW51SXRlbT4gfCBudWxsO1xuICAgIHByaXZhdGUgaHRtbEZvY3VzZWRFbGVtZW50QmVmb3JlT3BlblF1aWNrTWVudTogSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgIHByaXZhdGUgbWVudVNlY3Rpb25zOiBDaXJjdWxhckRvdWJseUxpbmtlZExpc3Q8UXVpY2tNZW51U2VjdGlvbj47XG4gICAgcHJpdmF0ZSBxdWlja01lbnVFbXB0eTogUXVpY2tNZW51RW1wdHk7XG4gICAgcHJpdmF0ZSBmaWx0ZXJJbnB1dDogc3RyaW5nO1xuXG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IFF1aWNrTWVudSB8IG51bGw7XG5cbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge1xuXG4gICAgICAgIHN1cGVyKHt9KTtcblxuICAgICAgICB0aGlzLmJsb2NrT3BlcmF0aW9uc1NlcnZpY2UgPSBTZXJ2aWNlUHJvdmlkZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbnN0YW5jZU9mKFwiSUJsb2NrT3BlcmF0aW9uc1NlcnZpY2VcIik7XG4gICAgICAgIHRoaXMuY3VycmVudEZvY3VzZWRNZW51SXRlbSA9IG51bGw7XG4gICAgICAgIHRoaXMuaHRtbEZvY3VzZWRFbGVtZW50QmVmb3JlT3BlblF1aWNrTWVudSA9IG51bGw7XG4gICAgICAgIHRoaXMubWVudVNlY3Rpb25zID0gbmV3IENpcmN1bGFyRG91Ymx5TGlua2VkTGlzdDxRdWlja01lbnVTZWN0aW9uPigpO1xuICAgICAgICB0aGlzLnF1aWNrTWVudUVtcHR5ID0gbmV3IFF1aWNrTWVudUVtcHR5KCk7XG5cbiAgICAgICAgbGV0IGJsb2NrT3B0aW9ucyA9IHRoaXMuaHRtbEVsZW1lbnQucXVlcnlTZWxlY3RvcignLmJsb2NrLW9wdGlvbnMnKSBhcyBIVE1MRWxlbWVudDtcblxuICAgICAgICB0aGlzLnF1aWNrTWVudUVtcHR5LmRvY3VtZW50QXBwZW5kVG8oYmxvY2tPcHRpb25zKTtcbiAgICAgICAgdGhpcy5hdHRhY2hFdmVudHMoKTtcblxuICAgICAgICB0aGlzLmZpbHRlcklucHV0ID0gXCJcIjtcbiAgICB9XG5cbiAgICBpbml0KCk6IEhUTUxFbGVtZW50IHtcblxuICAgICAgICBjb25zdCBodG1sRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBodG1sRWxlbWVudC5pZCA9IFF1aWNrTWVudS5pZDtcblxuICAgICAgICBodG1sRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdibG9jay1vcHRpb25zLXdyYXBwZXInLCAnc29mdC1ib3gtc2hhZG93Jyk7XG4gICAgICAgIGh0bWxFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cbiAgICAgICAgY29uc3QgYmxvY2tPcHRpb25zID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIGJsb2NrT3B0aW9ucy5jbGFzc0xpc3QuYWRkKCdibG9jay1vcHRpb25zJyk7XG4gICAgICAgIGJsb2NrT3B0aW9ucy5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7XG5cbiAgICAgICAgaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQoYmxvY2tPcHRpb25zKTtcblxuICAgICAgICByZXR1cm4gaHRtbEVsZW1lbnQ7XG4gICAgfVxuXG4gICAgYXBwZW5kKG1lbnVJdGVtOiBRdWlja01lbnVTZWN0aW9uKTogdm9pZCB7XG4gICAgICAgIHRoaXMubWVudVNlY3Rpb25zLmFwcGVuZChtZW51SXRlbSk7XG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQucXVlcnlTZWxlY3RvcignLmJsb2NrLW9wdGlvbnMnKSEuYXBwZW5kQ2hpbGQobWVudUl0ZW0uaHRtbEVsZW1lbnQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0SW5zdGFuY2UoKTogUXVpY2tNZW51IHtcbiAgICAgICAgaWYgKCFRdWlja01lbnUuaW5zdGFuY2UpIHtcbiAgICAgICAgICAgIFF1aWNrTWVudS5pbnN0YW5jZSA9IG5ldyBRdWlja01lbnUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBRdWlja01lbnUuaW5zdGFuY2U7XG4gICAgfVxuXG4gICAgc3dpdGNoVmlzdWFsRm9jdXMoaXRlbTogSk5vZGU8UXVpY2tNZW51SXRlbT4pOiB2b2lkIHtcblxuICAgICAgICBpZiAodGhpcy5jdXJyZW50Rm9jdXNlZE1lbnVJdGVtID09IGl0ZW0pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRGb2N1c2VkTWVudUl0ZW0pIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudEZvY3VzZWRNZW51SXRlbS52YWx1ZS5yZW1vdmVGb2N1cygpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jdXJyZW50Rm9jdXNlZE1lbnVJdGVtID0gaXRlbTtcbiAgICAgICAgdGhpcy5jdXJyZW50Rm9jdXNlZE1lbnVJdGVtLnZhbHVlLmZvY3VzKCk7XG5cbiAgICAgICAgdGhpcy5odG1sRm9jdXNlZEVsZW1lbnRCZWZvcmVPcGVuUXVpY2tNZW51Py5mb2N1cygpO1xuICAgIH1cblxuICAgIGZvY3VzT25UaGVGaXJzdFZpc2libGVJdGVtKCk6IHZvaWQge1xuXG4gICAgICAgIGNvbnN0IGZpcnN0U2VjdGlvbk5vZGU6IEpOb2RlPFF1aWNrTWVudVNlY3Rpb24+IHwgbnVsbCA9IHRoaXMubWVudVNlY3Rpb25zLmdldEZpcnN0KCk7XG5cbiAgICAgICAgbGV0IGN1cnJlbnRTZWN0aW9uTm9kZTogSk5vZGU8UXVpY2tNZW51U2VjdGlvbj4gfCBudWxsID0gZmlyc3RTZWN0aW9uTm9kZTtcblxuICAgICAgICB3aGlsZSAoY3VycmVudFNlY3Rpb25Ob2RlKSB7XG5cbiAgICAgICAgICAgIGNvbnN0IGl0ZW1Ob2RlOiBKTm9kZTxRdWlja01lbnVJdGVtPiB8IG51bGwgPSBjdXJyZW50U2VjdGlvbk5vZGUudmFsdWUubWVudUl0ZW1zLmZpbmRGaXJzdChpdGVtID0+IGl0ZW0uaXNWaXNpYmxlKTtcblxuICAgICAgICAgICAgaWYgKGl0ZW1Ob2RlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zd2l0Y2hWaXN1YWxGb2N1cyhpdGVtTm9kZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjdXJyZW50U2VjdGlvbk5vZGUgPSBjdXJyZW50U2VjdGlvbk5vZGUubmV4dE5vZGU7XG5cbiAgICAgICAgICAgIGlmIChjdXJyZW50U2VjdGlvbk5vZGUgPT0gZmlyc3RTZWN0aW9uTm9kZSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZvY3VzUHJldmlvdXNWaXNpYmxlSXRlbSgpOiB2b2lkIHtcblxuICAgICAgICBsZXQgcHJldmlvdXNWaXNpYmxlSXRlbTogSk5vZGU8UXVpY2tNZW51SXRlbT4gfCBudWxsO1xuXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRGb2N1c2VkTWVudUl0ZW0pIHtcbiAgICAgICAgICAgIHByZXZpb3VzVmlzaWJsZUl0ZW0gPSB0aGlzLmN1cnJlbnRGb2N1c2VkTWVudUl0ZW0uZ2V0UHJldmlvdXNTYXRpc2Z5aW5nKGl0ZW0gPT4gaXRlbS5pc1Zpc2libGUpO1xuICAgICAgICAgICAgaWYgKCFwcmV2aW91c1Zpc2libGVJdGVtKSB7XG5cbiAgICAgICAgICAgICAgICBsZXQgcHJldmlvdXNWaXNpYmxlU2VjdGlvbk5vZGU6IEpOb2RlPFF1aWNrTWVudVNlY3Rpb24+IHwgbnVsbCA9IHRoaXMubWVudVNlY3Rpb25zLmZpbmQodGhpcy5jdXJyZW50Rm9jdXNlZE1lbnVJdGVtLnZhbHVlLnF1aWNrTWVudVNlY3Rpb25JbnN0YW5jZSkhLmdldFByZXZpb3VzU2F0aXNmeWluZyhzZWN0aW9uID0+IHNlY3Rpb24uaXNWaXNpYmxlKTtcblxuICAgICAgICAgICAgICAgIGlmICghcHJldmlvdXNWaXNpYmxlU2VjdGlvbk5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwcmV2aW91c1Zpc2libGVJdGVtID0gcHJldmlvdXNWaXNpYmxlU2VjdGlvbk5vZGUudmFsdWUubWVudUl0ZW1zLmZpbmRMYXN0KGl0ZW0gPT4gaXRlbS5pc1Zpc2libGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IGxhc3RWaXNpYmxlU2VjdGlvbk5vZGU6IEpOb2RlPFF1aWNrTWVudVNlY3Rpb24+IHwgbnVsbCA9IHRoaXMubWVudVNlY3Rpb25zLmZpbmRMYXN0KHNlY3Rpb24gPT4gc2VjdGlvbi5pc1Zpc2libGUpO1xuXG4gICAgICAgICAgICBpZiAoIWxhc3RWaXNpYmxlU2VjdGlvbk5vZGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwcmV2aW91c1Zpc2libGVJdGVtID0gbGFzdFZpc2libGVTZWN0aW9uTm9kZS52YWx1ZS5tZW51SXRlbXMuZmluZExhc3QoaXRlbSA9PiBpdGVtLmlzVmlzaWJsZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zd2l0Y2hWaXN1YWxGb2N1cyhwcmV2aW91c1Zpc2libGVJdGVtISk7XG4gICAgfVxuXG4gICAgZm9jdXNOZXh0VmlzaWJsZUl0ZW0oKTogdm9pZCB7XG5cbiAgICAgICAgbGV0IG5leHRWaXNpYmxlSXRlbTogSk5vZGU8UXVpY2tNZW51SXRlbT4gfCBudWxsO1xuXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRGb2N1c2VkTWVudUl0ZW0pIHtcbiAgICAgICAgICAgIG5leHRWaXNpYmxlSXRlbSA9IHRoaXMuY3VycmVudEZvY3VzZWRNZW51SXRlbS5nZXROZXh0U2F0aXNmeWluZyhpdGVtID0+IGl0ZW0uaXNWaXNpYmxlKTtcbiAgICAgICAgICAgIGlmICghbmV4dFZpc2libGVJdGVtKSB7XG5cbiAgICAgICAgICAgICAgICBsZXQgbmV4dFZpc2libGVTZWN0aW9uTm9kZTogSk5vZGU8UXVpY2tNZW51U2VjdGlvbj4gfCBudWxsID0gdGhpcy5tZW51U2VjdGlvbnMuZmluZCh0aGlzLmN1cnJlbnRGb2N1c2VkTWVudUl0ZW0udmFsdWUucXVpY2tNZW51U2VjdGlvbkluc3RhbmNlKSEuZ2V0TmV4dFNhdGlzZnlpbmcoc2VjdGlvbiA9PiBzZWN0aW9uLmlzVmlzaWJsZSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoIW5leHRWaXNpYmxlU2VjdGlvbk5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBuZXh0VmlzaWJsZUl0ZW0gPSBuZXh0VmlzaWJsZVNlY3Rpb25Ob2RlLnZhbHVlLm1lbnVJdGVtcy5maW5kRmlyc3QoaXRlbSA9PiBpdGVtLmlzVmlzaWJsZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBmaXJzdFZpc2libGVTZWN0aW9uTm9kZTogbnVsbCB8IEpOb2RlPFF1aWNrTWVudVNlY3Rpb24+ID0gdGhpcy5tZW51U2VjdGlvbnMuZmluZEZpcnN0KHNlY3Rpb24gPT4gc2VjdGlvbi5pc1Zpc2libGUpO1xuICAgICAgICAgICAgaWYgKCFmaXJzdFZpc2libGVTZWN0aW9uTm9kZSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5leHRWaXNpYmxlSXRlbSA9IGZpcnN0VmlzaWJsZVNlY3Rpb25Ob2RlLnZhbHVlLm1lbnVJdGVtcy5maW5kRmlyc3QoaXRlbSA9PiBpdGVtLmlzVmlzaWJsZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnN3aXRjaFZpc3VhbEZvY3VzKG5leHRWaXNpYmxlSXRlbSEpO1xuICAgIH1cblxuICAgIGZpbHRlckl0ZW1zKCk6IHZvaWQge1xuXG4gICAgICAgIHRoaXMubWVudVNlY3Rpb25zLmZvckVhY2goc2VjdGlvbiA9PiB7XG4gICAgICAgICAgICBzZWN0aW9uLmZpbHRlclNlY3Rpb24odGhpcy5maWx0ZXJJbnB1dCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICghdGhpcy5tZW51U2VjdGlvbnMuYW55KHNlY3Rpb24gPT4gc2VjdGlvbi5pc1Zpc2libGUpKSB7XG4gICAgICAgICAgICB0aGlzLnF1aWNrTWVudUVtcHR5LnNob3coKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucXVpY2tNZW51RW1wdHkuaGlkZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5mb2N1c09uVGhlRmlyc3RWaXNpYmxlSXRlbSgpO1xuICAgIH1cblxuICAgIHNob3coKSB7XG5cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG5cbiAgICAgICAgICAgIHRoaXMuaHRtbEZvY3VzZWRFbGVtZW50QmVmb3JlT3BlblF1aWNrTWVudSA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5odG1sRm9jdXNlZEVsZW1lbnRCZWZvcmVPcGVuUXVpY2tNZW51KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRmFpbGVkIHRvIGNhcHR1cmUgdGhlIGZvY3VzZWQgZWxlbWVudCBiZWZvcmUgZGlzcGxheWluZyB0aGUgUXVpY2tNZW51LiBFbnN1cmUgYW4gZWxlbWVudCBpcyBmb2N1c2VkLlwiKTtcbiAgICAgICAgICAgIH1cblxuXG4gICAgICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gICAgXG4gICAgICAgICAgICBpZiAoIXNlbGVjdGlvbiB8fCBzZWxlY3Rpb24ucmFuZ2VDb3VudCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTmVuaHVtYSBzZWxlw6fDo28gZW5jb250cmFkYScpO1xuICAgICAgICAgICAgfVxuICAgIFxuICAgICAgICAgICAgY29uc3QgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcbiAgICAgICAgICAgIGNvbnN0IHJlY3QgPSByYW5nZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBcbiAgICAgICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgICBcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRXaWR0aCA9IHRoaXMuaHRtbEVsZW1lbnQub2Zmc2V0V2lkdGg7XG4gICAgICAgICAgICBsZXQgbGVmdFBvc2l0aW9uID0gcmVjdC5sZWZ0ICsgd2luZG93LnNjcm9sbFg7XG4gICAgXG4gICAgICAgICAgICBpZiAobGVmdFBvc2l0aW9uICsgZWxlbWVudFdpZHRoID4gd2luZG93LmlubmVyV2lkdGgpIHtcbiAgICAgICAgICAgICAgICBsZWZ0UG9zaXRpb24gPSB3aW5kb3cuaW5uZXJXaWR0aCAtIGVsZW1lbnRXaWR0aCAtIDIwO1xuICAgICAgICAgICAgfVxuICAgIFxuICAgICAgICAgICAgY29uc3QgZWxlbWVudEhlaWdodCA9IHRoaXMuaHRtbEVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xuICAgICAgICAgICAgbGV0IHRvcFBvc2l0aW9uID0gcmVjdC50b3AgKyB3aW5kb3cuc2Nyb2xsWSAtIGVsZW1lbnRIZWlnaHQgLSAxMDtcbiAgICBcbiAgICAgICAgICAgIGlmICh0b3BQb3NpdGlvbiA8IDApIHtcbiAgICAgICAgICAgICAgICB0b3BQb3NpdGlvbiA9IHJlY3QuYm90dG9tICsgd2luZG93LnNjcm9sbFkgKyAxMDtcbiAgICAgICAgICAgIH1cbiAgICBcbiAgICAgICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUubGVmdCA9IGAke2xlZnRQb3NpdGlvbn1weGA7XG4gICAgICAgICAgICB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLnRvcCA9IGAke3RvcFBvc2l0aW9ufXB4YDtcblxuICAgICAgICAgICAgc3VwZXIuc2hvdygpO1xuXG4gICAgICAgICAgICB0aGlzLmZvY3VzT25UaGVGaXJzdFZpc2libGVJdGVtKCk7XG4gICAgICAgICAgICB0aGlzLmh0bWxGb2N1c2VkRWxlbWVudEJlZm9yZU9wZW5RdWlja01lbnUuZm9jdXMoKTtcblxuICAgICAgICB9LCAxMCk7XG5cbiAgICB9XG5cbiAgICByZXN0b3JlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmZpbHRlcklucHV0ID0gXCJcIjtcblxuICAgICAgICB0aGlzLm1lbnVTZWN0aW9ucy5mb3JFYWNoKHNlY3Rpb24gPT4ge1xuICAgICAgICAgICAgc2VjdGlvbi5yZXN0b3JlKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGhpZGUoKSB7XG5cbiAgICAgICAgdGhpcy5yZXN0b3JlKCk7XG4gICAgICAgIHRoaXMuaHRtbEZvY3VzZWRFbGVtZW50QmVmb3JlT3BlblF1aWNrTWVudT8uZm9jdXMoKTtcblxuICAgICAgICBzdXBlci5oaWRlKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhdHRhY2hFdmVudHMoKSB7XG5cbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChldmVudDogS2V5Ym9hcmRFdmVudCkgPT4ge1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNWaXNpYmxlICYmIGV2ZW50LmtleSA9PT0gJy8nICYmICFldmVudC5jdHJsS2V5ICYmICFldmVudC5zaGlmdEtleSAmJiAhZXZlbnQuYWx0S2V5KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zaG93KCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNWaXNpYmxlICYmIGV2ZW50LmtleSA9PT0gJ0Fycm93TGVmdCcgJiYgIWV2ZW50LmN0cmxLZXkgJiYgIWV2ZW50LnNoaWZ0S2V5ICYmICFldmVudC5hbHRLZXkpIHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzVmlzaWJsZSAmJiBldmVudC5rZXkgPT09ICdBcnJvd1JpZ2h0JyAmJiAhZXZlbnQuY3RybEtleSAmJiAhZXZlbnQuc2hpZnRLZXkgJiYgIWV2ZW50LmFsdEtleSkge1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLmlzVmlzaWJsZSAmJiBldmVudC5rZXkgPT09ICdBcnJvd0Rvd24nICYmICFldmVudC5jdHJsS2V5ICYmICFldmVudC5zaGlmdEtleSAmJiAhZXZlbnQuYWx0S2V5KSB7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmZvY3VzTmV4dFZpc2libGVJdGVtKCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNWaXNpYmxlICYmIGV2ZW50LmtleSA9PT0gJ0Fycm93VXAnICYmICFldmVudC5jdHJsS2V5ICYmICFldmVudC5zaGlmdEtleSAmJiAhZXZlbnQuYWx0S2V5KSB7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmZvY3VzUHJldmlvdXNWaXNpYmxlSXRlbSgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzVmlzaWJsZSAmJiAvXlthLXowLTkgXSQvaS50ZXN0KGV2ZW50LmtleSkgJiYgIWV2ZW50LmN0cmxLZXkgJiYgIWV2ZW50LnNoaWZ0S2V5ICYmICFldmVudC5hbHRLZXkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmNhdEZpbHRlcklucHV0KGV2ZW50LmtleSk7XG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJJdGVtcygpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzVmlzaWJsZSAmJiBldmVudC5rZXkgPT09ICdCYWNrc3BhY2UnKSB7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5maWx0ZXJJbnB1dCA9PSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlTGFzdEZpbHRlcklucHV0Q2hhcmFjdGVyKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVySXRlbXMoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNWaXNpYmxlICYmIGV2ZW50LmtleSA9PT0gJ0VzY2FwZScgJiYgIWV2ZW50LmN0cmxLZXkgJiYgIWV2ZW50LnNoaWZ0S2V5ICYmICFldmVudC5hbHRLZXkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhpZGUoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnRW50ZXInICYmIHRoaXMuaXNWaXNpYmxlICYmICFldmVudC5jdHJsS2V5ICYmICFldmVudC5zaGlmdEtleSAmJiAhZXZlbnQuYWx0S2V5KSB7XG5cbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgICAgICAgICAgICAgbGV0IGRhdGFUeXBlID0gdGhpcy5jdXJyZW50Rm9jdXNlZE1lbnVJdGVtIS52YWx1ZS5odG1sRWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtdHlwZScpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGRhdGFUeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHJhbnNmb3JtSHRtbEZvY3VzZWRFbGVtZW50QmVmb3JlT3BlblF1aWNrTWVudShkYXRhVHlwZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNWaXNpYmxlICYmICEoZXZlbnQudGFyZ2V0ISBhcyBIVE1MRWxlbWVudCkuY2xvc2VzdChgIyR7dGhpcy5odG1sRWxlbWVudC5pZH1gKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGV2ZW50KSA9PiB7XG5cbiAgICAgICAgICAgIGlmIChldmVudC5rZXkgPT09ICdFbnRlcicgJiYgdGhpcy5pc1Zpc2libGUpIHtcblxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBibG9ja1R5cGUgPSB0aGlzLmN1cnJlbnRGb2N1c2VkTWVudUl0ZW0/LnZhbHVlLmJsb2NrVHlwZTtcblxuICAgICAgICAgICAgICAgIGlmIChibG9ja1R5cGUpIHtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRyYW5zZm9ybUh0bWxGb2N1c2VkRWxlbWVudEJlZm9yZU9wZW5RdWlja01lbnUoYmxvY2tUeXBlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgdHJhbnNmb3JtSHRtbEZvY3VzZWRFbGVtZW50QmVmb3JlT3BlblF1aWNrTWVudShibG9ja1R5cGU6IHN0cmluZyk6IHZvaWQge1xuXG4gICAgICAgIGxldCBlbGVtZW50ID0gdGhpcy5odG1sRm9jdXNlZEVsZW1lbnRCZWZvcmVPcGVuUXVpY2tNZW51Py5jbG9zZXN0KCcuYmxvY2snKSBhcyBIVE1MRWxlbWVudDtcblxuICAgICAgICBpZiAoZWxlbWVudCAmJiBibG9ja1R5cGUpIHtcbiAgICAgICAgICAgIHRoaXMuYmxvY2tPcGVyYXRpb25zU2VydmljZS5mb3JtYXRCbG9jayhlbGVtZW50LCBibG9ja1R5cGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjb25jYXRGaWx0ZXJJbnB1dChzdGc6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLmZpbHRlcklucHV0ICs9IHN0Zy50b0xvd2VyQ2FzZSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVtb3ZlTGFzdEZpbHRlcklucHV0Q2hhcmFjdGVyKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5maWx0ZXJJbnB1dC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmZpbHRlcklucHV0ID0gdGhpcy5maWx0ZXJJbnB1dC5zbGljZSgwLCAtMSk7XG4gICAgICAgIH1cbiAgICB9XG59IiwiaW1wb3J0IHsgQmFzZURvdWJseUxpbmtlZExpc3QgfSBmcm9tICcuL0Jhc2VEb3VibHlMaW5rZWRMaXN0JztcclxuaW1wb3J0IHsgSk5vZGUgfSBmcm9tICcuL0pOb2RlJztcclxuXHJcbmV4cG9ydCBjbGFzcyBEb3VibHlMaW5rZWRMaXN0PFQ+IGV4dGVuZHMgQmFzZURvdWJseUxpbmtlZExpc3Q8VD4ge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXBwZW5kKGVsZW1lbnQ6IFQpOiB2b2lkIHtcclxuXHJcbiAgICAgICAgY29uc3Qgbm9kZSA9IG5ldyBKTm9kZShlbGVtZW50LCB0aGlzKTtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLmhlYWQgfHwgIXRoaXMudGFpbCkge1xyXG4gICAgICAgICAgICB0aGlzLmhlYWQgPSBub2RlO1xyXG4gICAgICAgICAgICB0aGlzLnRhaWwgPSBub2RlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMudGFpbC5zZXROZXh0KG5vZGUpO1xyXG4gICAgICAgICAgICBub2RlLnNldFByZXZpb3VzKHRoaXMudGFpbCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnRhaWwgPSBub2RlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5sZW5ndGgrKztcclxuICAgIH1cclxufSIsImltcG9ydCB7IFF1aWNrTWVudSB9IGZyb20gJy4vUXVpY2tNZW51JztcclxuaW1wb3J0IHsgUXVpY2tNZW51SXRlbSB9IGZyb20gXCIuL1F1aWNrTWVudUl0ZW1cIjtcclxuaW1wb3J0IHsgRG91Ymx5TGlua2VkTGlzdCB9IGZyb20gJy4uLy4uL2NvbW1vbi9Eb3VibHlMaW5rZWRMaXN0JztcclxuaW1wb3J0IHsgQmFzZVVJQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tbW9uL0Jhc2VVSUNvbXBvbmVudCc7XHJcblxyXG5leHBvcnQgY2xhc3MgUXVpY2tNZW51U2VjdGlvbiBleHRlbmRzIEJhc2VVSUNvbXBvbmVudCB7XHJcblxyXG4gICAgcXVpY2tNZW51SW5zdGFuY2U6IFF1aWNrTWVudTtcclxuXHJcbiAgICBtZW51SXRlbXMgPSBuZXcgRG91Ymx5TGlua2VkTGlzdDxRdWlja01lbnVJdGVtPigpO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFF1aWNrTWVudVNlY3Rpb25PcHRpb25zKSB7XHJcblxyXG4gICAgICAgIHN1cGVyKHtcclxuICAgICAgICAgICAgdGl0bGU6IG9wdGlvbnMudGl0bGUsXHJcbiAgICAgICAgICAgIGNsYXNzTGlzdDogb3B0aW9ucy5jbGFzc0xpc3RcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5xdWlja01lbnVJbnN0YW5jZSA9IG9wdGlvbnMucXVpY2tNZW51SW5zdGFuY2U7XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdCgpOiBIVE1MRWxlbWVudCB7XHJcblxyXG4gICAgICAgIGNvbnN0IGh0bWxFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2VjdGlvbicpO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LmNsYXNzTGlzdC5hZGQodGhpcy5wcm9wcy5jbGFzc0xpc3QpO1xyXG5cclxuICAgICAgICBjb25zdCBoZWFkaW5nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaDInKTtcclxuICAgICAgICBoZWFkaW5nLnRleHRDb250ZW50ID0gdGhpcy5wcm9wcy50aXRsZTtcclxuXHJcbiAgICAgICAgaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQoaGVhZGluZyk7XHJcblxyXG4gICAgICAgIHJldHVybiBodG1sRWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICBhcHBlbmRRdWlja01lbnVJdGVtcyhtZW51SXRlbXM6IFF1aWNrTWVudUl0ZW1bXSk6IHZvaWQge1xyXG5cclxuICAgICAgICBtZW51SXRlbXMuZm9yRWFjaChpdGVtID0+IHtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kUXVpY2tNZW51SXRlbShpdGVtKVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGFwcGVuZFF1aWNrTWVudUl0ZW0obWVudUl0ZW06IFF1aWNrTWVudUl0ZW0pOiB2b2lkIHtcclxuXHJcbiAgICAgICAgdGhpcy5tZW51SXRlbXMuYXBwZW5kKG1lbnVJdGVtKTtcclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LmFwcGVuZENoaWxkKG1lbnVJdGVtLmh0bWxFbGVtZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBmaWx0ZXJTZWN0aW9uKHRleHQ6IHN0cmluZyk6IHZvaWQge1xyXG5cclxuICAgICAgICB0aGlzLnJlc3RvcmUoKTtcclxuXHJcbiAgICAgICAgaWYgKHRleHQgIT09IFwiXCIpIHtcclxuICAgICAgICAgICAgdGhpcy5tZW51SXRlbXMuZm9yRWFjaChtZW51SXRlbSA9PiB7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKCEobWVudUl0ZW0uZmlsdGVyVmFsdWUudG9Mb2NhbGVMb3dlckNhc2UoKS5pbmNsdWRlcyh0ZXh0KSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBtZW51SXRlbS5oaWRlKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgbGV0IGF0TGVhZE9uZUl0ZW0gPSB0aGlzLm1lbnVJdGVtcy5hbnkoaXRlbSA9PiBpdGVtLmZpbHRlclZhbHVlLnRvTG9jYWxlTG93ZXJDYXNlKCkuaW5jbHVkZXModGV4dCkpO1xyXG5cclxuICAgICAgICAgICAgaWYgKCFhdExlYWRPbmVJdGVtKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhpZGUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXN0b3JlKCkge1xyXG4gICAgICAgIHRoaXMuc2hvdygpO1xyXG5cclxuICAgICAgICB0aGlzLm1lbnVJdGVtcy5mb3JFYWNoKG1lbnVJdGVtID0+IHtcclxuICAgICAgICAgICAgbWVudUl0ZW0uc2hvdygpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFF1aWNrTWVudVNlY3Rpb25PcHRpb25zIHtcclxuICAgIHF1aWNrTWVudUluc3RhbmNlOiBRdWlja01lbnU7XHJcbiAgICB0aXRsZTogc3RyaW5nO1xyXG4gICAgY2xhc3NMaXN0OiBzdHJpbmc7XHJcbn0iLCIvLyBpbXBvcnQgQmFzZVVJQ29tcG9uZW50IGZyb20gXCIuL0Jhc2VVSUNvbXBvbmVudFwiO1xyXG5cclxuaW1wb3J0IHsgQmFzZVVJQ29tcG9uZW50IH0gZnJvbSBcIi4vQmFzZVVJQ29tcG9uZW50XCI7XHJcblxyXG5leHBvcnQgY2xhc3MgU1ZHSWNvbiBleHRlbmRzIEJhc2VVSUNvbXBvbmVudCB7XHJcblxyXG4gICAgdXNlRWxlbWVudDogU1ZHVXNlRWxlbWVudDtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihocmVmVXNlSWQ6IHN0cmluZywgd2lkdGggPSBcIjFyZW1cIiwgaGVpZ2h0ID0gXCIxcmVtXCIpIHtcclxuXHJcbiAgICAgICAgc3VwZXIoe1xyXG4gICAgICAgICAgICBocmVmVXNlSWQ6IGhyZWZVc2VJZCxcclxuICAgICAgICAgICAgd2lkdGg6IHdpZHRoLFxyXG4gICAgICAgICAgICBoZWlnaHQ6IGhlaWdodCxcclxuXHJcbiAgICAgICAgfSlcclxuXHJcbiAgICAgICAgdGhpcy51c2VFbGVtZW50ID0gdGhpcy5odG1sRWxlbWVudC5xdWVyeVNlbGVjdG9yKCd1c2UnKSBhcyBTVkdVc2VFbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIGluaXQoKTogSFRNTEVsZW1lbnQge1xyXG5cclxuICAgICAgICBjb25zdCBodG1sRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsIFwic3ZnXCIpO1xyXG5cclxuICAgICAgICBodG1sRWxlbWVudC5zdHlsZS5jb2xvciA9IFwicmdiYSg1NSwgNTMsIDQ3LCAwLjg1KVwiO1xyXG5cclxuICAgICAgICBsZXQgdXNlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiwgXCJ1c2VcIik7XHJcbiAgICAgICAgdXNlLnNldEF0dHJpYnV0ZU5TKFwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiLCBcImhyZWZcIiwgYCMke3RoaXMucHJvcHMuaHJlZlVzZUlkfWApO1xyXG5cclxuICAgICAgICBodG1sRWxlbWVudC5hcHBlbmRDaGlsZCh1c2UpO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LnNldEF0dHJpYnV0ZSgnd2lkdGgnLCB0aGlzLnByb3BzLndpZHRoKTtcclxuICAgICAgICBodG1sRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsIHRoaXMucHJvcHMuaGVpZ2h0KTtcclxuICAgICAgICBodG1sRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2ZpbGwnLCAnY3VycmVudENvbG9yJyk7XHJcblxyXG4gICAgICAgIHJldHVybiBodG1sRWxlbWVudCBhcyB1bmtub3duIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIGNsb25lKCk6IFNWR0ljb24ge1xyXG4gICAgICAgIHJldHVybiBuZXcgU1ZHSWNvbih0aGlzLnByb3BzLmhyZWZVc2VJZCwgdGhpcy5wcm9wcy53aWR0aCwgdGhpcy5wcm9wcy5oZWlnaHQpO1xyXG4gICAgfVxyXG5cclxuICAgIHNldFVzZVRvKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnVzZUVsZW1lbnQuc2V0QXR0cmlidXRlTlMoXCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIsIFwiaHJlZlwiLCBgIyR7dmFsdWV9YCk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBTVkdJY29uIH0gZnJvbSAnLi4vY29tbW9uL1NWR0ljb24nO1xyXG5pbXBvcnQgeyBCYXNlVUlDb21wb25lbnQgfSBmcm9tICcuLi9jb21tb24vQmFzZVVJQ29tcG9uZW50JztcclxuaW1wb3J0IHsgSk5vZGUgfSBmcm9tIFwiLi4vLi4vY29tbW9uL0pOb2RlXCI7XHJcbmltcG9ydCB7IFF1aWNrTWVudVNlY3Rpb24gfSBmcm9tICcuL1F1aWNrTWVudVNlY3Rpb24nO1xyXG5cclxuZXhwb3J0IGNsYXNzIFF1aWNrTWVudUl0ZW0gZXh0ZW5kcyBCYXNlVUlDb21wb25lbnQge1xyXG5cclxuICAgIHJlYWRvbmx5IGJsb2NrVHlwZTogc3RyaW5nO1xyXG5cclxuICAgIHJlYWRvbmx5IHRpdGxlOiBzdHJpbmc7XHJcbiAgICByZWFkb25seSBmaWx0ZXJWYWx1ZTogc3RyaW5nO1xyXG4gICAgcmVhZG9ubHkgZGVzY3JpcHRpb246IHN0cmluZztcclxuXHJcbiAgICBxdWlja01lbnVTZWN0aW9uSW5zdGFuY2U6IFF1aWNrTWVudVNlY3Rpb247XHJcblxyXG4gICAgY29uc3RydWN0b3IocXVpY2tNZW51U2VjdGlvbkluc3RhbmNlOiBRdWlja01lbnVTZWN0aW9uLCB0aXRsZTogc3RyaW5nLCBkZXNjcmlwdGlvbjogc3RyaW5nLCBTVkdIcmVmVXNlSWQ6IHN0cmluZywgYmxvY2tUeXBlOiBzdHJpbmcsIGZpbHRlclZhbHVlOiBzdHJpbmcpIHtcclxuXHJcbiAgICAgICAgc3VwZXIoe1xyXG4gICAgICAgICAgICB0aXRsZTogdGl0bGUsXHJcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBkZXNjcmlwdGlvbixcclxuICAgICAgICAgICAgU1ZHSHJlZlVzZUlkOiBTVkdIcmVmVXNlSWRcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5ibG9ja1R5cGUgPSBibG9ja1R5cGU7XHJcbiAgICAgICAgdGhpcy50aXRsZSA9IHRpdGxlO1xyXG4gICAgICAgIHRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcclxuICAgICAgICB0aGlzLmZpbHRlclZhbHVlID0gZmlsdGVyVmFsdWU7XHJcblxyXG4gICAgICAgIHRoaXMucXVpY2tNZW51U2VjdGlvbkluc3RhbmNlID0gcXVpY2tNZW51U2VjdGlvbkluc3RhbmNlO1xyXG5cclxuICAgICAgICB0aGlzLmJsb2NrVHlwZSA9IGJsb2NrVHlwZTtcclxuXHJcbiAgICAgICAgdGhpcy5hdHRhY2hFdmVudHMoKTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0KCk6IEhUTUxFbGVtZW50IHtcclxuXHJcbiAgICAgICAgY29uc3QgaHRtbEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgICBodG1sRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdvcHRpb24nLCAnb3B0aW9uLWhvdmVyJywgJ2Jsb2NrLW9wZXJhdGlvbicpO1xyXG5cclxuICAgICAgICBodG1sRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2RhdGEtYmxvY2stb3BlcmF0aW9uJywgJ2FwcGx5LXNlbGVjdGVkLWJsb2NrLXR5cGUnKTtcclxuICAgICAgICBodG1sRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJzAnKTtcclxuICAgICAgICBodG1sRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCAnb3B0aW9uJyk7XHJcblxyXG5cclxuICAgICAgICBjb25zdCBvcHRpb25JbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgIG9wdGlvbkltYWdlLmNsYXNzTGlzdC5hZGQoJ29wdGlvbi1pbWFnZScpO1xyXG5cclxuICAgICAgICBjb25zdCBzdmcgPSBuZXcgU1ZHSWNvbih0aGlzLnByb3BzLlNWR0hyZWZVc2VJZCwgJzEwMCUnLCAnMTAwJScpO1xyXG5cclxuICAgICAgICBvcHRpb25JbWFnZS5hcHBlbmRDaGlsZChzdmcuaHRtbEVsZW1lbnQpO1xyXG5cclxuICAgICAgICBodG1sRWxlbWVudC5hcHBlbmRDaGlsZChvcHRpb25JbWFnZSk7XHJcblxyXG4gICAgICAgIGNvbnN0IG9wdGlvblRleHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgICBvcHRpb25UZXh0LmNsYXNzTGlzdC5hZGQoJ29wdGlvbi10ZXh0Jyk7XHJcblxyXG4gICAgICAgIGNvbnN0IGJsb2NrVGl0bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdwJyk7XHJcbiAgICAgICAgYmxvY2tUaXRsZS5jbGFzc0xpc3QuYWRkKCdibG9jay10aXRsZScpO1xyXG4gICAgICAgIGJsb2NrVGl0bGUuaW5uZXJUZXh0ID0gdGhpcy5wcm9wcy50aXRsZTtcclxuXHJcbiAgICAgICAgb3B0aW9uVGV4dC5hcHBlbmRDaGlsZChibG9ja1RpdGxlKTtcclxuXHJcbiAgICAgICAgY29uc3QgYmxvY2tEZXNjcmlwdGlvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3AnKTtcclxuICAgICAgICBibG9ja0Rlc2NyaXB0aW9uLmNsYXNzTGlzdC5hZGQoJ2Jsb2NrLWRlc2NyaXB0aW9uJyk7XHJcbiAgICAgICAgYmxvY2tEZXNjcmlwdGlvbi5pbm5lclRleHQgPSB0aGlzLnByb3BzLmRlc2NyaXB0aW9uO1xyXG5cclxuXHJcbiAgICAgICAgb3B0aW9uVGV4dC5hcHBlbmRDaGlsZChibG9ja0Rlc2NyaXB0aW9uKTtcclxuXHJcbiAgICAgICAgaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQob3B0aW9uVGV4dCk7XHJcblxyXG4gICAgICAgIHJldHVybiBodG1sRWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgZGlzcGxheSgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiAnZmxleCc7XHJcbiAgICB9XHJcblxyXG4gICAgZm9jdXMoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdvcHRpb24tZm9jdXNlZCcpO1xyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuZm9jdXMoKTtcclxuICAgIH1cclxuXHJcbiAgICByZW1vdmVGb2N1cygpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ29wdGlvbi1mb2N1c2VkJyk7XHJcbiAgICB9XHJcblxyXG4gICAgYXR0YWNoRXZlbnRzKCk6IHZvaWQge1xyXG5cclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsICgpID0+IHtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IG5vZGU6IEpOb2RlPFF1aWNrTWVudUl0ZW0+ID0gdGhpcy5xdWlja01lbnVTZWN0aW9uSW5zdGFuY2UubWVudUl0ZW1zLmZpbmQodGhpcykhO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5xdWlja01lbnVTZWN0aW9uSW5zdGFuY2UucXVpY2tNZW51SW5zdGFuY2Uuc3dpdGNoVmlzdWFsRm9jdXMobm9kZSEpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGV2ZW50KSA9PiB7XHJcblxyXG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIHRoaXMucXVpY2tNZW51U2VjdGlvbkluc3RhbmNlLnF1aWNrTWVudUluc3RhbmNlLnRyYW5zZm9ybUh0bWxGb2N1c2VkRWxlbWVudEJlZm9yZU9wZW5RdWlja01lbnUodGhpcy5ibG9ja1R5cGUpO1xyXG5cclxuICAgICAgICB9KTtcclxuICAgIH1cclxufSIsImltcG9ydCB7IFF1aWNrTWVudSB9IGZyb20gXCIuLi9jb21wb25lbnRzL3F1aWNrLW1lbnUvUXVpY2tNZW51XCI7XHJcbmltcG9ydCB7IFF1aWNrTWVudVNlY3Rpb24gfSBmcm9tIFwiLi4vY29tcG9uZW50cy9xdWljay1tZW51L1F1aWNrTWVudVNlY3Rpb25cIjtcclxuaW1wb3J0IHsgUXVpY2tNZW51SXRlbSB9IGZyb20gXCIuLi9jb21wb25lbnRzL3F1aWNrLW1lbnUvUXVpY2tNZW51SXRlbVwiO1xyXG5pbXBvcnQgeyBFbGVtZW50RmFjdG9yeVNlcnZpY2UgfSBmcm9tIFwiLi4vc2VydmljZXMvZWxlbWVudC1mYWN0b3J5L0VsZW1lbnRGYWN0b3J5U2VydmljZVwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFF1aWNrTWVudUJ1aWxkZXIge1xyXG5cclxuICAgIHN0YXRpYyBidWlsZCgpOiBRdWlja01lbnUge1xyXG5cclxuICAgICAgICBjb25zdCBxdWlja01lbnU6IFF1aWNrTWVudSA9IFF1aWNrTWVudS5nZXRJbnN0YW5jZSgpO1xyXG5cclxuICAgICAgICBjb25zdCBiYXNpY0Jsb2Nrc1NlY3Rpb246IFF1aWNrTWVudVNlY3Rpb24gPSBuZXcgUXVpY2tNZW51U2VjdGlvbih7IHF1aWNrTWVudUluc3RhbmNlOiBxdWlja01lbnUsIHRpdGxlOiAnQmFzaWMgYmxvY2tzJywgY2xhc3NMaXN0OiAnYmFzaWMtc2VjdGlvbicgfSk7XHJcblxyXG4gICAgICAgIGJhc2ljQmxvY2tzU2VjdGlvbi5hcHBlbmRRdWlja01lbnVJdGVtcyhbXHJcbiAgICAgICAgICAgIG5ldyBRdWlja01lbnVJdGVtKGJhc2ljQmxvY2tzU2VjdGlvbiwgJ1RleHQnLCAnU3RhcnQgd3JpdGluZyBpbiBwbGFpbiB0ZXh0LicsICdpY29uLW1hdGVyaWFsLWZvcm1hdCcsIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLlBBUkFHUkFQSCwgXCJwYXJhZ3JhcGggdGV4dCBwXCIpLFxyXG4gICAgICAgICAgICBuZXcgUXVpY2tNZW51SXRlbShiYXNpY0Jsb2Nrc1NlY3Rpb24sICdJbWFnZScsICdVcGxvYWQgaW1hZ2UuJywgJ2ljb24tbWF0ZXJpYWwtYXBlcnR1cmUnLCAnaW1hZ2UnLCBcImltYWdlIGZpZ3VyZSBwaG90byBpbGx1c3RyYXRpb24gcGljdHVyZSBcIiksXHJcbiAgICAgICAgICAgIG5ldyBRdWlja01lbnVJdGVtKGJhc2ljQmxvY2tzU2VjdGlvbiwgJ0J1bGxldGVkIGxpc3QnLCAnT3JnYW5pemUgaXRlbXMgd2l0aCBidWxsZXQgcG9pbnRzLicsICdpY29uLXdvcmRwcmVzcy1idWxsZXRlZC1saXN0JywgJ2J1bGxldGVkLWxpc3QnLCBcImJ1bGxldGVkIGxpc3QgdW5vcmRlcmVkIGxpc3QgdWxcIiksXHJcbiAgICAgICAgICAgIG5ldyBRdWlja01lbnVJdGVtKGJhc2ljQmxvY2tzU2VjdGlvbiwgJ051bWJlcmVkIGxpc3QnLCAnTGlzdCBpdGVtcyBpbiBhIG51bWJlcmVkIGZvcm1hdC4nLCAnaWNvbi13b3JkcHJlc3MtbnVtYmVyZWQtbGlzdCcsICdudW1iZXJlZC1saXN0JywgXCJudW1iZXJlZCBsaXN0IG51bWJlciBsaXN0IHNlcXVlbnRpYWwgbGlzdCBvbCBlbnVtZXJhdGVkIGxpc3Qgb3JkZXJlZCBsaXN0XCIpLFxyXG4gICAgICAgICAgICBuZXcgUXVpY2tNZW51SXRlbShiYXNpY0Jsb2Nrc1NlY3Rpb24sICdDb2RlJywgJ0luY2x1ZGUgY29kZSBzbmlwcGV0LicsICdpY29uLXdvcmRwcmVzcy1jb2RlLW1hcmsnLCAnY29kZScsIFwiY29kZSBzY3JpcHQgc291cmNlIG1hcmt1cFwiKSxcclxuICAgICAgICAgICAgbmV3IFF1aWNrTWVudUl0ZW0oYmFzaWNCbG9ja3NTZWN0aW9uLCAnUXVvdGUnLCAnSGlnaGxpZ2h0IHRleHQgYXMgYSBxdW90ZS4nLCAnaWNvbi13b3JkcHJlc3MtcXVvdGUnLCAncXVvdGUnLCBcInF1b3RlIGJsb2NrcXVvdGUgY2l0YXRpb24gcXVvdGF0aW9uXCIpLFxyXG4gICAgICAgICAgICBuZXcgUXVpY2tNZW51SXRlbShiYXNpY0Jsb2Nrc1NlY3Rpb24sICdIZWFkaW5nIDInLCAnTWVkaXVtIGhlYWRlciBmb3Igc2VjdGlvbnMuJywgJ2ljb24tanVsaWEtaGVhZC0yJywgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuSEVBREVSXzIsIFwiaGVhZGVyIDIgaGVhZGluZyAyIGgyXCIpLFxyXG4gICAgICAgICAgICBuZXcgUXVpY2tNZW51SXRlbShiYXNpY0Jsb2Nrc1NlY3Rpb24sICdIZWFkaW5nIDMnLCAnU21hbGwgaGVhZGVyIGZvciBzdWJzZWN0aW9ucy4nLCAnaWNvbi1qdWxpYS1oZWFkLTInLCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfMywgXCJoZWFkZXIgMyBoZWFkaW5nIDMgaDNcIiksXHJcbiAgICAgICAgICAgIG5ldyBRdWlja01lbnVJdGVtKGJhc2ljQmxvY2tzU2VjdGlvbiwgJ1NlcGFyYXRvcicsICdWaXN1YWxseSBkaXZpZGUgYmxvY2tzLicsICdpY29uLXdvcmRwcmVzcy1zZXBhcmF0b3InLCAnc2VwYXJhdG9yJywgXCJzZXBhcmF0b3IgZGl2aWRlciBydWxlIGxpbmVcIilcclxuICAgICAgICBdKTtcclxuXHJcbiAgICAgICAgcXVpY2tNZW51LmFwcGVuZChiYXNpY0Jsb2Nrc1NlY3Rpb24pO1xyXG5cclxuICAgICAgICBjb25zdCBoZWFkaW5nQmxvY2tzU2VjdGlvbiA9IG5ldyBRdWlja01lbnVTZWN0aW9uKHsgcXVpY2tNZW51SW5zdGFuY2U6IHF1aWNrTWVudSwgdGl0bGU6ICdIZWFkaW5nJywgY2xhc3NMaXN0OiAnaGVhZGluZy1zZWN0aW9uJyB9KTtcclxuXHJcbiAgICAgICAgaGVhZGluZ0Jsb2Nrc1NlY3Rpb24uYXBwZW5kUXVpY2tNZW51SXRlbXMoW1xyXG4gICAgICAgICAgICBuZXcgUXVpY2tNZW51SXRlbShoZWFkaW5nQmxvY2tzU2VjdGlvbiwgJ0hlYWRpbmcgMScsICdMYXJnZSBoZWFkZXIgZm9yIG1haW4gdG9waWNzLicsICdpY29uLWp1bGlhLWhlYWQtMScsIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl8xLCBcImhlYWRlciAxIGhlYWRpbmcgMSBoMVwiKSxcclxuICAgICAgICAgICAgbmV3IFF1aWNrTWVudUl0ZW0oaGVhZGluZ0Jsb2Nrc1NlY3Rpb24sICdIZWFkaW5nIDInLCAnTWVkaXVtIGhlYWRlciBmb3Igc2VjdGlvbnMuJywgJ2ljb24tanVsaWEtaGVhZC0yJywgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuSEVBREVSXzIsIFwiaGVhZGVyIDIgaGVhZGluZyAyIGgyXCIpLFxyXG4gICAgICAgICAgICBuZXcgUXVpY2tNZW51SXRlbShoZWFkaW5nQmxvY2tzU2VjdGlvbiwgJ0hlYWRpbmcgMycsICdTbWFsbCBoZWFkZXIgZm9yIHN1YnNlY3Rpb25zLicsICdpY29uLWp1bGlhLWhlYWQtMycsIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl8zLCBcImhlYWRlciAzIGhlYWRpbmcgMyBoM1wiKSxcclxuICAgICAgICAgICAgbmV3IFF1aWNrTWVudUl0ZW0oaGVhZGluZ0Jsb2Nrc1NlY3Rpb24sICdIZWFkaW5nIDQnLCAnRGV0YWlsZWQgaGVhZGVyIGZvciBzdWJ0b3BpY3MuJywgJ2ljb24tanVsaWEtaGVhZC00JywgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuSEVBREVSXzQsIFwiaGVhZGVyIDQgaGVhZGluZyA0IGg0XCIpLFxyXG4gICAgICAgICAgICBuZXcgUXVpY2tNZW51SXRlbShoZWFkaW5nQmxvY2tzU2VjdGlvbiwgJ0hlYWRpbmcgNScsICdNaW5vciBoZWFkZXIgZm9yIHNwZWNpZmljcy4nLCAnaWNvbi1qdWxpYS1oZWFkLTUnLCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfNSwgXCJoZWFkZXIgNSBoZWFkaW5nIDUgaDVcIiksXHJcbiAgICAgICAgICAgIG5ldyBRdWlja01lbnVJdGVtKGhlYWRpbmdCbG9ja3NTZWN0aW9uLCAnSGVhZGluZyA2JywgJ1NtYWxsZXN0IGhlYWRlciBmb3IgZmluZSBkZXRhaWxzLicsICdpY29uLWp1bGlhLWhlYWQtNicsIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl82LCBcImhlYWRlciA2IGhlYWRpbmcgNiBoNlwiKSxcclxuICAgICAgICBdKTtcclxuXHJcbiAgICAgICAgcXVpY2tNZW51LmFwcGVuZChoZWFkaW5nQmxvY2tzU2VjdGlvbik7XHJcblxyXG5cclxuICAgICAgICBjb25zdCBsaXN0QmxvY2tzU2VjdGlvbiA9IG5ldyBRdWlja01lbnVTZWN0aW9uKHsgcXVpY2tNZW51SW5zdGFuY2U6IHF1aWNrTWVudSwgdGl0bGU6ICdMaXN0JywgY2xhc3NMaXN0OiAnbGlzdC1zZWN0aW9uJyB9KTtcclxuXHJcbiAgICAgICAgbGlzdEJsb2Nrc1NlY3Rpb24uYXBwZW5kUXVpY2tNZW51SXRlbXMoW1xyXG4gICAgICAgICAgICBuZXcgUXVpY2tNZW51SXRlbShsaXN0QmxvY2tzU2VjdGlvbiwgJ1RvZG8gbGlzdCcsICdUcmFjayB0YXNrcyB3aXRoIGNoZWNrYm94ZXMuJywgJ2ljb24tbWF0ZXJpYWwtY2hlY2stbGlzdC0yJywgJ3RvZG8tbGlzdCcsIFwidG9kbyBsaXN0IHRhc2sgbGlzdCBjaGVja2xpc3RcIiksXHJcbiAgICAgICAgICAgIG5ldyBRdWlja01lbnVJdGVtKGxpc3RCbG9ja3NTZWN0aW9uLCAnQnVsbGV0ZWQgbGlzdCcsICdPcmdhbml6ZSBpdGVtcyB3aXRoIGJ1bGxldCBwb2ludHMuJywgJ2ljb24td29yZHByZXNzLWJ1bGxldGVkLWxpc3QnLCAnYnVsbGV0ZWQtbGlzdCcsIFwiYnVsbGV0ZWQgbGlzdCB1bm9yZGVyZWQgbGlzdCB1bFwiKSxcclxuICAgICAgICAgICAgbmV3IFF1aWNrTWVudUl0ZW0obGlzdEJsb2Nrc1NlY3Rpb24sICdOdW1iZXJlZCBsaXN0JywgJ0xpc3QgaXRlbXMgaW4gYSBudW1iZXJlZCBmb3JtYXQuJywgJ2ljb24td29yZHByZXNzLW51bWJlcmVkLWxpc3QnLCAnbnVtYmVyZWQtbGlzdCcsIFwibnVtYmVyZWQgbGlzdCBudW1iZXIgbGlzdCBzZXF1ZW50aWFsIGxpc3Qgb2wgZW51bWVyYXRlZCBsaXN0IG9yZGVyZWQgbGlzdFwiKVxyXG4gICAgICAgIF0pO1xyXG5cclxuICAgICAgICBxdWlja01lbnUuYXBwZW5kKGxpc3RCbG9ja3NTZWN0aW9uKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHF1aWNrTWVudTtcclxuICAgIH1cclxufSIsImltcG9ydCB7IEJhc2VVSUNvbXBvbmVudCB9IGZyb20gXCIuLi8uLi9jb21tb24vQmFzZVVJQ29tcG9uZW50XCI7XHJcbmltcG9ydCB7IERyb3Bkb3duTWVudUJ1dHRvbiB9IGZyb20gXCIuL0Ryb3Bkb3duTWVudUJ1dHRvblwiO1xyXG5pbXBvcnQgeyBEcm9wZG93bk1lbnVMaXN0IH0gZnJvbSBcIi4vRHJvcGRvd25NZW51TGlzdFwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIERyb3Bkb3duTWVudSBleHRlbmRzIEJhc2VVSUNvbXBvbmVudCB7XHJcblxyXG4gICAgZHJvcGRvd25CdXR0b246IERyb3Bkb3duTWVudUJ1dHRvbjtcclxuICAgIGRyb3Bkb3duTGlzdDogRHJvcGRvd25NZW51TGlzdDtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihidXR0b246IERyb3Bkb3duTWVudUJ1dHRvbiwgZHJvcGRvd25MaXN0OiBEcm9wZG93bk1lbnVMaXN0KSB7XHJcblxyXG4gICAgICAgIHN1cGVyKHt9KTtcclxuXHJcbiAgICAgICAgdGhpcy5kcm9wZG93bkJ1dHRvbiA9IGJ1dHRvbjtcclxuICAgICAgICB0aGlzLmRyb3Bkb3duTGlzdCA9IGRyb3Bkb3duTGlzdDtcclxuXHJcblxyXG4gICAgICAgIGJ1dHRvbi5kb2N1bWVudEFwcGVuZFRvKHRoaXMuaHRtbEVsZW1lbnQpO1xyXG4gICAgICAgIGRyb3Bkb3duTGlzdC5kb2N1bWVudEFwcGVuZFRvKHRoaXMuaHRtbEVsZW1lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXQoKTogSFRNTEVsZW1lbnQge1xyXG5cclxuICAgICAgICBjb25zdCBodG1sRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuY2xhc3NMaXN0LmFkZChcInNlbGVjdC13cmFwcGVyXCIpO1xyXG5cclxuICAgICAgICByZXR1cm4gaHRtbEVsZW1lbnQ7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBJVGV4dE9wZXJhdGlvblNlcnZpY2UgfSBmcm9tIFwiLi9JVGV4dE9wZXJhdGlvblNlcnZpY2VcIjtcblxudHlwZSBUYXJnZXROb2RlID0ge1xuICAgIG5vZGVUeXBlOiBzdHJpbmc7XG4gICAgY2xhc3Nlcz86IHN0cmluZ1tdO1xufTtcblxuZXhwb3J0IGNsYXNzIFRleHRPcGVyYXRpb25TZXJ2aWNlIGltcGxlbWVudHMgSVRleHRPcGVyYXRpb25TZXJ2aWNlIHtcblxuICAgIHByaXZhdGUgc3RhdGljIGluc3RhbmNlOiBUZXh0T3BlcmF0aW9uU2VydmljZTtcblxuICAgIHByaXZhdGUgY29uc3RydWN0b3IoKSB7XG5cbiAgICAgICAgaWYgKFRleHRPcGVyYXRpb25TZXJ2aWNlLmluc3RhbmNlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBnZXRJbnN0YW5jZSgpOiBUZXh0T3BlcmF0aW9uU2VydmljZSB7XG5cblxuICAgICAgICBpZiAoIXRoaXMuaW5zdGFuY2UpIHtcbiAgICAgICAgICAgIHRoaXMuaW5zdGFuY2UgPSBuZXcgVGV4dE9wZXJhdGlvblNlcnZpY2UoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmluc3RhbmNlO1xuICAgIH1cblxuICAgIGV4ZWNDb21tYW5kKGNvbW1hbmQ6IHN0cmluZywgc2hvd1VpOiBib29sZWFuLCB2YWx1ZTogc3RyaW5nIHwgbnVsbCk6IGJvb2xlYW4ge1xuXG4gICAgICAgIGlmIChjb21tYW5kID09IFRleHRPcGVyYXRpb25TZXJ2aWNlLlFVRVJZX1RFWFRfT1BFUkFUSU9OUy5JTkxJTkVfQ09ERSkge1xuICAgICAgICAgICAgdGhpcy50b2dnbGVDb2RlRXhlY0NvbW1hbmQoKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHY6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHZhbHVlIHx8IHVuZGVmaW5lZDtcblxuICAgICAgICBpZiAodiA9PSBcImluaXRpYWxcIikge1xuICAgICAgICAgICAgdiA9IHRoaXMuZ2V0SW5pdGlhbENvbG9yQXNIZXgoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb21tYW5kID09IFRleHRPcGVyYXRpb25TZXJ2aWNlLlFVRVJZX1RFWFRfT1BFUkFUSU9OUy5DUkVBVEVfTElOSykge1xuXG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gVGV4dE9wZXJhdGlvblNlcnZpY2UuZ2V0U2VsZWN0ZWRIVE1MRWxlbWVudCgpO1xuXG4gICAgICAgICAgICBpZiAoZWxlbWVudD8uY2xvc2VzdChcImFcIikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZG9jdW1lbnQuZXhlY0NvbW1hbmQoXCJ1bmxpbmtcIiwgZmFsc2UsIHYpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoc2hvd1VpKSB7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBzaG93SW5wdXRMaW5rQm94ID0gbmV3IEN1c3RvbUV2ZW50KCdzaG93SW5wdXRMaW5rQm94UmVxdWVzdGVkJywge1xuICAgICAgICAgICAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBjYW5jZWxhYmxlOiB0cnVlXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHNob3dJbnB1dExpbmtCb3gpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZihjb21tYW5kID09IFRleHRPcGVyYXRpb25TZXJ2aWNlLlFVRVJZX1RFWFRfT1BFUkFUSU9OUy5ISUxJVEVfQ09MT1IgfHwgXG4gICAgICAgICAgICBjb21tYW5kID09IFRleHRPcGVyYXRpb25TZXJ2aWNlLlFVRVJZX1RFWFRfT1BFUkFUSU9OUy5GT1JFX0NPTE9SKXtcblxuICAgICAgICAgICAgICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKGNvbW1hbmQsIGZhbHNlLCB2KTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHNob3dJbnB1dExpbmtCb3ggPSBuZXcgQ3VzdG9tRXZlbnQoJ2NvbG9yQ2hhbmdlJywge1xuICAgICAgICAgICAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBjYW5jZWxhYmxlOiB0cnVlXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHNob3dJbnB1dExpbmtCb3gpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRvY3VtZW50LmV4ZWNDb21tYW5kKGNvbW1hbmQsIGZhbHNlLCB2KTtcbiAgICB9XG5cblxuICAgIHN0YXRpYyBRVUVSWV9URVhUX09QRVJBVElPTlMgPSB7XG4gICAgICAgIEhJTElURV9DT0xPUjogXCJoaWxpdGVDb2xvclwiLFxuICAgICAgICBGT1JFX0NPTE9SOiBcImZvcmVDb2xvclwiLFxuICAgICAgICBJTkxJTkVfQ09ERTogXCJpbmxpbmVDb2RlXCIsXG4gICAgICAgIENSRUFURV9MSU5LOiBcImNyZWF0ZUxpbmtcIixcbiAgICAgICAgVU5ERVJMSU5FOiBcInVuZGVybGluZVwiXG4gICAgICAgIC8vIENSRUFURV9MSU5LOiBcImNyZWF0ZUxpbmtcIlxuXG4gICAgfTtcblxuICAgIHF1ZXJ5Q29tbWFuZFN0YXRlKGNvbW1hbmQ6IHN0cmluZywgdmFsdWU6IHN0cmluZyB8IG51bGwpOiBib29sZWFuIHtcblxuICAgICAgICBpZiAoY29tbWFuZCA9PT0gVGV4dE9wZXJhdGlvblNlcnZpY2UuUVVFUllfVEVYVF9PUEVSQVRJT05TLkNSRUFURV9MSU5LKSB7XG5cbiAgICAgICAgICAgIGlmIChUZXh0T3BlcmF0aW9uU2VydmljZS5nZXRTZWxlY3RlZEhUTUxFbGVtZW50KCk/LmNsb3Nlc3QoXCJhXCIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTs7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29tbWFuZCA9PT0gVGV4dE9wZXJhdGlvblNlcnZpY2UuUVVFUllfVEVYVF9PUEVSQVRJT05TLlVOREVSTElORSkge1xuXG4gICAgICAgICAgICBpZiAoVGV4dE9wZXJhdGlvblNlcnZpY2UuZ2V0U2VsZWN0ZWRIVE1MRWxlbWVudCgpPy5jbG9zZXN0KFwiYVwiKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb21tYW5kID09PSBUZXh0T3BlcmF0aW9uU2VydmljZS5RVUVSWV9URVhUX09QRVJBVElPTlMuSElMSVRFX0NPTE9SKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5xdWVyeUhpbGl0ZUNvbG9yKHZhbHVlISk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29tbWFuZCA9PT0gVGV4dE9wZXJhdGlvblNlcnZpY2UuUVVFUllfVEVYVF9PUEVSQVRJT05TLkZPUkVfQ09MT1IpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnF1ZXJ5Rm9yZUNvbG9yKHZhbHVlISk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlDb21tYW5kU3RhdGUoY29tbWFuZCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB0b2dnbGVDb2RlRXhlY0NvbW1hbmQoKSB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcbiAgICAgICAgaWYgKCFzZWxlY3Rpb24gfHwgc2VsZWN0aW9uLnJhbmdlQ291bnQgPT09IDApIHJldHVybjtcblxuICAgICAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xuICAgICAgICBsZXQgY29udGFpbmVyTm9kZTogTm9kZSB8IG51bGwgPSByYW5nZS5jb21tb25BbmNlc3RvckNvbnRhaW5lcjtcblxuICAgICAgICB3aGlsZSAoY29udGFpbmVyTm9kZSAmJiBjb250YWluZXJOb2RlLm5vZGVOYW1lICE9PSAnQ09ERScpIHtcbiAgICAgICAgICAgIGNvbnRhaW5lck5vZGUgPSBjb250YWluZXJOb2RlLnBhcmVudE5vZGU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29udGFpbmVyTm9kZSAmJiBjb250YWluZXJOb2RlLm5vZGVOYW1lID09PSAnQ09ERScpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvZGVFbGVtZW50ID0gY29udGFpbmVyTm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlT2ZDb2RlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcbiAgICAgICAgICAgIHJhbmdlT2ZDb2RlLnNlbGVjdE5vZGVDb250ZW50cyhjb2RlRWxlbWVudCk7XG5cbiAgICAgICAgICAgIGlmIChyYW5nZS50b1N0cmluZygpID09PSByYW5nZU9mQ29kZS50b1N0cmluZygpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyZW50OiBOb2RlIHwgbnVsbCA9IGNvZGVFbGVtZW50LnBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHBhcmVudCAmJiBjb2RlRWxlbWVudC5maXJzdENoaWxkKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUoY29kZUVsZW1lbnQuZmlyc3RDaGlsZCwgY29kZUVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwYXJlbnQ/LnJlbW92ZUNoaWxkKGNvZGVFbGVtZW50KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGV4dENvbnRlbnQgPSByYW5nZS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKCdpbnNlcnRIVE1MJywgZmFsc2UsIHRleHRDb250ZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRvY3VtZW50LmdldFNlbGVjdGlvbigpPy5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRBc1N0cmluZyA9IG5ldyBYTUxTZXJpYWxpemVyKCkuc2VyaWFsaXplVG9TdHJpbmcocmFuZ2UuY2xvbmVDb250ZW50cygpKTtcbiAgICAgICAgICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKCdpbnNlcnRIVE1MJywgZmFsc2UsIGA8Y29kZT4ke2NvbnRlbnRBc1N0cmluZ308L2NvZGU+YCk7XG4gICAgICAgIH1cbiAgICB9XG5cblxuXG5cblxuXG4gICAgcHJpdmF0ZSBxdWVyeUZvcmVDb2xvcihleHBlY3RlZENvbG9yOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuXG4gICAgICAgIGlmICghc2VsZWN0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzZWxlY3Rpb24ucmFuZ2VDb3VudCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGxldCBlbGVtZW50OiBOb2RlIHwgbnVsbCA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyO1xuXG4gICAgICAgIGlmIChlbGVtZW50Lm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xuICAgICAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZvbnRDb2xvciA9IChlbGVtZW50IGFzIEhUTUxFbGVtZW50KS5jbG9zZXN0KFwiZm9udFtjb2xvcl1cIik7XG4gICAgICAgIGlmICghZm9udENvbG9yKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgY29uc3Qgc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShmb250Q29sb3IpO1xuICAgICAgICBjb25zdCByZ2JDb2xvciA9IHN0eWxlLmNvbG9yO1xuXG4gICAgICAgIGNvbnN0IGhleENvbG9yID0gdGhpcy5yZ2JUb0hleChyZ2JDb2xvcik7XG5cbiAgICAgICAgcmV0dXJuIGhleENvbG9yLnRvVXBwZXJDYXNlKCkgPT09IGV4cGVjdGVkQ29sb3IudG9VcHBlckNhc2UoKTtcbiAgICB9XG5cblxuICAgIHByaXZhdGUgcXVlcnlIaWxpdGVDb2xvcihleHBlY3RlZENvbG9yOiBzdHJpbmcpIHtcblxuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG5cbiAgICAgICAgaWYgKCFzZWxlY3Rpb24pIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXNlbGVjdGlvbi5yYW5nZUNvdW50KSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgbGV0IGVsZW1lbnQ6IE5vZGUgfCBudWxsID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCkuY29tbW9uQW5jZXN0b3JDb250YWluZXI7XG5cbiAgICAgICAgaWYgKGVsZW1lbnQubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgICAgICAgICBlbGVtZW50ID0gZWxlbWVudC5wYXJlbnROb2RlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3BhbldpdGhCYWNrZ3JvdW5kID0gXG4gICAgICAgICAgICAoZWxlbWVudCBhcyBIVE1MRWxlbWVudCkuY2xvc2VzdChcInNwYW5bc3R5bGUqPSdiYWNrZ3JvdW5kLWNvbG9yJ11cIikgfHwgXG4gICAgICAgICAgICAoZWxlbWVudCBhcyBIVE1MRWxlbWVudCkuY2xvc2VzdChcImZvbnRbc3R5bGUqPSdiYWNrZ3JvdW5kLWNvbG9yJ11cIik7XG5cblxuICAgICAgICBpZiAoIXNwYW5XaXRoQmFja2dyb3VuZCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGNvbnN0IHN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoc3BhbldpdGhCYWNrZ3JvdW5kKTtcbiAgICAgICAgY29uc3QgcmdiQ29sb3IgPSBzdHlsZS5iYWNrZ3JvdW5kQ29sb3I7XG5cbiAgICAgICAgY29uc3QgaGV4Q29sb3IgPSB0aGlzLnJnYlRvSGV4KHJnYkNvbG9yKTtcblxuICAgICAgICByZXR1cm4gaGV4Q29sb3IudG9VcHBlckNhc2UoKSA9PT0gZXhwZWN0ZWRDb2xvci50b1VwcGVyQ2FzZSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmdiVG9IZXgocmdiOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCByZ2JBcnJheSA9IHJnYi5tYXRjaCgvXFxkKy9nKSEubWFwKE51bWJlcik7XG4gICAgICAgIHJldHVybiBcIiNcIiArIHJnYkFycmF5Lm1hcCh4ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGhleCA9IHgudG9TdHJpbmcoMTYpO1xuICAgICAgICAgICAgcmV0dXJuIGhleC5sZW5ndGggPT09IDEgPyBcIjBcIiArIGhleCA6IGhleDtcbiAgICAgICAgfSkuam9pbihcIlwiKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEluaXRpYWxDb2xvckFzSGV4KCkge1xuICAgICAgICBjb25zdCB0ZW1wRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGVtcEVsZW1lbnQpO1xuXG4gICAgICAgIHRlbXBFbGVtZW50LnN0eWxlLmNvbG9yID0gJ2luaXRpYWwnO1xuXG4gICAgICAgIGNvbnN0IGNvbXB1dGVkQ29sb3IgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0ZW1wRWxlbWVudCkuY29sb3I7XG5cbiAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0ZW1wRWxlbWVudCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMucmdiVG9IZXgoY29tcHV0ZWRDb2xvcik7XG4gICAgfVxuXG4gICAgZ2V0VGFyZ2V0RWxlbWVudE1hcChjb21tYW5kOiBzdHJpbmcpOiBrZXlvZiBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICAgICBzd2l0Y2ggKGNvbW1hbmQpIHtcblxuICAgICAgICAgICAgY2FzZSBcInN0cm9uZ1wiOlxuICAgICAgICAgICAgY2FzZSBcImJvbGRcIjpcbiAgICAgICAgICAgIGNhc2UgXCJiXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuICdzdHJvbmcnO1xuXG4gICAgICAgICAgICBjYXNlIFwiaXRhbGljXCI6XG4gICAgICAgICAgICBjYXNlIFwiaVwiOlxuICAgICAgICAgICAgY2FzZSBcImVtXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiZW1cIjtcblxuICAgICAgICAgICAgY2FzZSBcInVuZGVybGluZVwiOlxuICAgICAgICAgICAgY2FzZSBcInVcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJ1XCI7XG5cbiAgICAgICAgICAgIGNhc2UgXCJzdHJpa2V0aHJvdWdoXCI6XG4gICAgICAgICAgICBjYXNlIFwic1wiOlxuICAgICAgICAgICAgICAgIHJldHVybiAncyc7XG5cbiAgICAgICAgICAgIGNhc2UgXCJiYWNrZ3JvdW5kXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwic3BhblwiO1xuXG4gICAgICAgICAgICBjYXNlIFwiY29sb3JcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJzcGFuXCI7XG5cbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0U2VsZWN0ZWRIVE1MRWxlbWVudCgpOiBIVE1MRWxlbWVudCB8IG51bGwge1xuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG5cbiAgICAgICAgaWYgKHNlbGVjdGlvbiAmJiBzZWxlY3Rpb24ucmFuZ2VDb3VudCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XG4gICAgICAgICAgICBsZXQgZWxlbWVudDogTm9kZSB8IG51bGwgPSByYW5nZS5jb21tb25BbmNlc3RvckNvbnRhaW5lcjtcblxuICAgICAgICAgICAgaWYgKGVsZW1lbnQubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgd2hpbGUgKGVsZW1lbnQgJiYgIShlbGVtZW50IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZSBhcyBIVE1MRWxlbWVudCB8IG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cblxuICAgIGdldFNlbGVjdGVkVGV4dE5vZGVzKCk6IE5vZGVbXSB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcbiAgICAgICAgaWYgKCFzZWxlY3Rpb24gfHwgc2VsZWN0aW9uLnJhbmdlQ291bnQgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRleHROb2RlczogTm9kZVtdID0gW107XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWxlY3Rpb24ucmFuZ2VDb3VudDsgKytpKSB7XG4gICAgICAgICAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KGkpO1xuICAgICAgICAgICAgY29uc3Qgbm9kZUl0ZXJhdG9yID0gZG9jdW1lbnQuY3JlYXRlTm9kZUl0ZXJhdG9yKFxuICAgICAgICAgICAgICAgIHJhbmdlLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyLFxuICAgICAgICAgICAgICAgIE5vZGVGaWx0ZXIuU0hPV19URVhULFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgYWNjZXB0Tm9kZShub2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmFuZ2UuaW50ZXJzZWN0c05vZGUobm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTm9kZUZpbHRlci5GSUxURVJfQUNDRVBUO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5vZGVGaWx0ZXIuRklMVEVSX1JFSkVDVDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGxldCBub2RlO1xuICAgICAgICAgICAgd2hpbGUgKChub2RlID0gbm9kZUl0ZXJhdG9yLm5leHROb2RlKCkpKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vZGVSYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG4gICAgICAgICAgICAgICAgICAgIG5vZGVSYW5nZS5zZWxlY3ROb2RlQ29udGVudHMobm9kZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UuY29tcGFyZUJvdW5kYXJ5UG9pbnRzKFJhbmdlLkVORF9UT19TVEFSVCwgbm9kZVJhbmdlKSA9PT0gLTEgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlLmNvbXBhcmVCb3VuZGFyeVBvaW50cyhSYW5nZS5TVEFSVF9UT19FTkQsIG5vZGVSYW5nZSkgPT09IDFcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0Tm9kZXMucHVzaChub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0ZXh0Tm9kZXM7XG4gICAgfVxuXG4gICAgZmluZENsb3Nlc3RNYXRjaGluZ1BhcmVudChlbGVtZW50OiBOb2RlIHwgbnVsbCwgdGFyZ2V0OiBUYXJnZXROb2RlKTogRWxlbWVudCB8IG51bGwge1xuICAgICAgICBpZiAoZWxlbWVudCAmJiBlbGVtZW50Lm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xuICAgICAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50RWxlbWVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIHdoaWxlIChlbGVtZW50ICYmIGVsZW1lbnQgIT09IGRvY3VtZW50LmJvZHkpIHtcbiAgICAgICAgICAgIGlmIChlbGVtZW50Lm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW0gPSBlbGVtZW50IGFzIEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgaWYgKGVsZW0udGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSB0YXJnZXQubm9kZVR5cGUudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXRhcmdldC5jbGFzc2VzIHx8IHRhcmdldC5jbGFzc2VzLmV2ZXJ5KGNscyA9PiBlbGVtLmNsYXNzTGlzdC5jb250YWlucyhjbHMpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsZW07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbGVtZW50ID0gZWxlbWVudC5wYXJlbnRFbGVtZW50O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGV4dHJhY3RTZWxlY3RlZFRleHQodGV4dE5vZGU6IE5vZGUpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG5cbiAgICAgICAgaWYgKCFzZWxlY3Rpb24gfHwgc2VsZWN0aW9uLnJhbmdlQ291bnQgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcblxuICAgICAgICBpZiAodGV4dE5vZGUubm9kZVR5cGUgIT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRleHRDb250ZW50ID0gdGV4dE5vZGUudGV4dENvbnRlbnQgfHwgXCJcIjtcblxuICAgICAgICBsZXQgc3RhcnQgPSAwO1xuICAgICAgICBsZXQgZW5kID0gdGV4dENvbnRlbnQubGVuZ3RoO1xuXG4gICAgICAgIGlmICghcmFuZ2UuaW50ZXJzZWN0c05vZGUodGV4dE5vZGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyYW5nZS5zdGFydENvbnRhaW5lciA9PT0gdGV4dE5vZGUpIHtcbiAgICAgICAgICAgIHN0YXJ0ID0gcmFuZ2Uuc3RhcnRPZmZzZXQ7XG4gICAgICAgIH0gZWxzZSBpZiAocmFuZ2Uuc3RhcnRDb250YWluZXIuY29udGFpbnModGV4dE5vZGUpKSB7XG4gICAgICAgICAgICBzdGFydCA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmFuZ2UuZW5kQ29udGFpbmVyID09PSB0ZXh0Tm9kZSkge1xuICAgICAgICAgICAgZW5kID0gcmFuZ2UuZW5kT2Zmc2V0O1xuICAgICAgICB9IGVsc2UgaWYgKHJhbmdlLmVuZENvbnRhaW5lci5jb250YWlucyh0ZXh0Tm9kZSkpIHtcbiAgICAgICAgICAgIGVuZCA9IHRleHRDb250ZW50Lmxlbmd0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzdGFydCA8IGVuZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRleHRDb250ZW50LnN1YnN0cmluZyhzdGFydCwgZW5kKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IFRleHRPcGVyYXRpb25TZXJ2aWNlIH0gZnJvbSBcIkAvc2VydmljZXMvdGV4dC1vcGVyYXRpb25zL1RleHRPcGVyYXRpb25TZXJ2aWNlXCI7XHJcbmltcG9ydCB7IEJhc2VVSUNvbXBvbmVudCB9IGZyb20gXCIuLi8uLi9jb21tb24vQmFzZVVJQ29tcG9uZW50XCI7XHJcbmltcG9ydCB7IElucHV0TGlua0JveFdyYXBwZXIgfSBmcm9tIFwiLi9JbnB1dExpbmtCb3hXcmFwcGVyXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgSW5wdXRMaW5rQm94IGV4dGVuZHMgQmFzZVVJQ29tcG9uZW50IHtcclxuXHJcbiAgICBwYXJlbnRXcmFwcGVyPzogSW5wdXRMaW5rQm94V3JhcHBlcjtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuXHJcbiAgICAgICAgc3VwZXIoe30pXHJcbiAgICAgICAgdGhpcy5hdHRhY2hFdmVudCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXQoKTogSFRNTEVsZW1lbnQge1xyXG5cclxuICAgICAgICBjb25zdCBodG1sRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiKTtcclxuXHJcbiAgICAgICAgaHRtbEVsZW1lbnQuaWQgPSBcImxpbmtCb3hJbnB1dFwiO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LnR5cGUgPSBcInVybFwiO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LnBsYWNlaG9sZGVyID0gXCJQYXN0ZSBvciB0eXBlIGEgbGluay4uLlwiO1xyXG5cclxuICAgICAgICBodG1sRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9IFwicmVsYXRpdmVcIjtcclxuXHJcbiAgICAgICAgcmV0dXJuIGh0bWxFbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIHNldFBhcmVudFdyYXBwZXIocGFyZW50V3JhcHBlcjogSW5wdXRMaW5rQm94V3JhcHBlcik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMucGFyZW50V3JhcHBlciA9IHBhcmVudFdyYXBwZXI7XHJcbiAgICB9XHJcblxyXG4gICAgYXR0YWNoRXZlbnQoKTogdm9pZCB7XHJcblxyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIChldmVudCkgPT4ge1xyXG5cclxuICAgICAgICAgICAgaWYgKGV2ZW50LmtleSA9PSBcIkVudGVyXCIgJiYgdGhpcy5pc1Zpc2libGUpIHtcclxuXHJcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgdXJsID0gKHRoaXMuaHRtbEVsZW1lbnQgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWU7XHJcblxyXG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgVGV4dE9wZXJhdGlvblNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5leGVjQ29tbWFuZChUZXh0T3BlcmF0aW9uU2VydmljZS5RVUVSWV9URVhUX09QRVJBVElPTlMuQ1JFQVRFX0xJTkssIGZhbHNlLCB1cmwpO1xyXG4gICAgICAgICAgICAgICAgfSwgMTApO1xyXG5cclxuICAgICAgICAgICAgICAgICh0aGlzLmh0bWxFbGVtZW50IGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlID0gXCJcIjtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLnBhcmVudFdyYXBwZXI/LmhpZGUoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGV2ZW50LmtleSA9PSBcIkVzY2FwZVwiICYmIHRoaXMuaXNWaXNpYmxlKSB7XHJcbiAgICAgICAgICAgICAgICAodGhpcy5odG1sRWxlbWVudCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZSA9IFwiXCI7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnBhcmVudFdyYXBwZXI/LmhpZGUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChldmVudCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5jYW5IaWRlICYmICEoZXZlbnQudGFyZ2V0ISBhcyBIVE1MRWxlbWVudCkuY2xvc2VzdChgIyR7dGhpcy5odG1sRWxlbWVudC5pZH1gKSAmJiAhKGV2ZW50LnRhcmdldCEgYXMgSFRNTEVsZW1lbnQpLmNsb3Nlc3QoXCIjZmxvYXRpbmdUb29sYmFyXCIpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnBhcmVudFdyYXBwZXI/LmhpZGUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIChldmVudCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoZXZlbnQua2V5ID09IFwiL1wiKSB7XHJcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuXHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBUZXh0T3BlcmF0aW9uU2VydmljZSB9IGZyb20gXCJAL3NlcnZpY2VzL3RleHQtb3BlcmF0aW9ucy9UZXh0T3BlcmF0aW9uU2VydmljZVwiO1xyXG5pbXBvcnQgeyBCYXNlVUlDb21wb25lbnQgfSBmcm9tIFwiLi4vLi4vY29tbW9uL0Jhc2VVSUNvbXBvbmVudFwiO1xyXG5pbXBvcnQgeyBJbnB1dExpbmtCb3ggfSBmcm9tIFwiLi9JbnB1dExpbmtCb3hcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBJbnB1dExpbmtCb3hXcmFwcGVyIGV4dGVuZHMgQmFzZVVJQ29tcG9uZW50IHtcclxuXHJcbiAgICBpbnB1dExpbmtCb3g6IElucHV0TGlua0JveDtcclxuICAgIHJhbmdlPzogUmFuZ2U7XHJcbiAgICBoaWdobGlnaHRzOiBIVE1MRGl2RWxlbWVudFtdID0gW107XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgY29uc3QgaW5wdXRMaW5rQm94ID0gbmV3IElucHV0TGlua0JveCgpO1xyXG5cclxuICAgICAgICBzdXBlcih7XHJcbiAgICAgICAgICAgIGlucHV0TGlua0JveDogaW5wdXRMaW5rQm94XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuaW5wdXRMaW5rQm94ID0gaW5wdXRMaW5rQm94O1xyXG4gICAgICAgIHRoaXMuYXR0YWNoRXZlbnQoKTtcclxuICAgICAgICBpbnB1dExpbmtCb3guc2V0UGFyZW50V3JhcHBlcih0aGlzKTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgaW5pdCgpOiBIVE1MRWxlbWVudCB7XHJcbiAgICAgICAgY29uc3QgaHRtbEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG5cclxuICAgICAgICBodG1sRWxlbWVudC5pZCA9IFwibGlua0JveFwiO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcclxuICAgICAgICBodG1sRWxlbWVudC5jbGFzc0xpc3QuYWRkKFwiZGVwZW5kZW50LWJveFwiKTtcclxuICAgICAgICBodG1sRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9IFwiYWJzb2x1dGVcIjtcclxuXHJcbiAgICAgICAgaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5wcm9wcy5pbnB1dExpbmtCb3guaHRtbEVsZW1lbnQpO1xyXG5cclxuICAgICAgICByZXR1cm4gaHRtbEVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgYXR0YWNoRXZlbnQoKTogdm9pZCB7XHJcblxyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJzaG93SW5wdXRMaW5rQm94UmVxdWVzdGVkXCIsICgpID0+IHtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuc2hvdygpO1xyXG4gICAgICAgICAgICB0aGlzLmhpZ2hsaWdodFNlbGVjdGVkVGV4dCgpO1xyXG4gICAgICAgICAgICB0aGlzLmlucHV0TGlua0JveC5mb2N1cygpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBoaWRlKCk6IHZvaWQge1xyXG5cclxuICAgICAgICBzdXBlci5oaWRlKCk7XHJcbiAgICAgICAgdGhpcy5yZW1vdmVIaWdobGlnaHRzKCk7XHJcblxyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG5cclxuICAgICAgICAgICAgY29uc3Qgc2hvd0lucHV0TGlua0JveEZpbmlzaGVkID0gbmV3IEN1c3RvbUV2ZW50KCdzaG93SW5wdXRMaW5rQm94RmluaXNoZWQnLCB7XHJcbiAgICAgICAgICAgICAgICBidWJibGVzOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgY2FuY2VsYWJsZTogdHJ1ZVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoc2hvd0lucHV0TGlua0JveEZpbmlzaGVkKTtcclxuICAgICAgICB9LCAwKTtcclxuICAgIH1cclxuXHJcbiAgICBoaWdobGlnaHRTZWxlY3RlZFRleHQoKSB7XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG4gICAgICAgIGlmICghc2VsZWN0aW9uPy5yYW5nZUNvdW50KSByZXR1cm47XHJcblxyXG4gICAgICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XHJcbiAgICAgICAgY29uc3QgcmVjdHMgPSByYW5nZS5nZXRDbGllbnRSZWN0cygpO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlY3RzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlY3QgPSByZWN0c1tpXTtcclxuICAgICAgICAgICAgY29uc3QgaGlnaGxpZ2h0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgICAgIGhpZ2hsaWdodC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XHJcbiAgICAgICAgICAgIGhpZ2hsaWdodC5zdHlsZS5sZWZ0ID0gYCR7cmVjdC5sZWZ0fXB4YDtcclxuICAgICAgICAgICAgaGlnaGxpZ2h0LnN0eWxlLnRvcCA9IGAke3JlY3QudG9wfXB4YDtcclxuICAgICAgICAgICAgaGlnaGxpZ2h0LnN0eWxlLndpZHRoID0gYCR7cmVjdC53aWR0aH1weGA7XHJcbiAgICAgICAgICAgIGhpZ2hsaWdodC5zdHlsZS5oZWlnaHQgPSBgJHtyZWN0LmhlaWdodH1weGA7XHJcbiAgICAgICAgICAgIGhpZ2hsaWdodC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAnI2MyYzJjMic7XHJcbiAgICAgICAgICAgIGhpZ2hsaWdodC5zdHlsZS5vcGFjaXR5ID0gJzAuMyc7XHJcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoaGlnaGxpZ2h0KTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuaGlnaGxpZ2h0cy5wdXNoKGhpZ2hsaWdodCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVtb3ZlSGlnaGxpZ2h0cygpIHtcclxuICAgICAgICB0aGlzLmhpZ2hsaWdodHMuZm9yRWFjaChoaWdobGlnaHQgPT4ge1xyXG4gICAgICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGhpZ2hsaWdodCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5oaWdobGlnaHRzID0gW107XHJcbiAgICB9XHJcblxyXG59IiwiZXhwb3J0IGNsYXNzIFV0aWxzIHtcblxuICAgIHN0YXRpYyBpc1NlbGVjdGVkVGV4dERlc2NlbmRhbnRPZihwYXJlbnRTZWxlY3Rvcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IGRvY3VtZW50LmdldFNlbGVjdGlvbigpO1xuXG4gICAgICAgIGlmICghc2VsZWN0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXNlbGVjdGlvbi5yYW5nZUNvdW50KSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgY29uc3QgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcbiAgICAgICAgbGV0IGVsZW1lbnQ6IE5vZGUgfCBudWxsID0gcmFuZ2Uuc3RhcnRDb250YWluZXI7XG5cbiAgICAgICAgaWYgKGVsZW1lbnQubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgICAgICAgICBlbGVtZW50ID0gZWxlbWVudC5wYXJlbnROb2RlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKGVsZW1lbnQgYXMgRWxlbWVudCkuY2xvc2VzdChwYXJlbnRTZWxlY3RvcikgIT09IG51bGw7XG4gICAgfVxuXG59IiwiaW1wb3J0IHsgQmFzZVVJQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tbW9uL0Jhc2VVSUNvbXBvbmVudCc7XHJcbmltcG9ydCB7IERyb3Bkb3duTWVudSB9IGZyb20gJy4vZHJvcGRvd24tdG9vbC9Ecm9wZG93bk1lbnUnO1xyXG5pbXBvcnQgeyBGbG9hdGluZ1Rvb2xiYXJTZXBhcmF0b3IgfSBmcm9tICcuL3NlcGFyYXRvci9GbG9hdGluZ1Rvb2xiYXJTZXBhcmF0b3InO1xyXG5pbXBvcnQgeyBHcm91cEJ1dHRvbiB9IGZyb20gJy4vZ3JvdXAtYnV0dG9uL0dyb3VwQnV0dG9uJztcclxuaW1wb3J0IHsgSW5wdXRMaW5rQm94V3JhcHBlciB9IGZyb20gJy4vbGluay1ib3gvSW5wdXRMaW5rQm94V3JhcHBlcic7XHJcbmltcG9ydCB7IFV0aWxzIH0gZnJvbSBcIi4uLy4uL3V0aWxpdGllcy9VdGlsc1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIEZsb2F0aW5nVG9vbGJhciBleHRlbmRzIEJhc2VVSUNvbXBvbmVudCB7XHJcblxyXG4gICAgZHJvcGRvd25zOiBEcm9wZG93bk1lbnVbXTtcclxuICAgIGN1cnJlbnRTZWxlY3Rpb25SYW5nZTogUmFuZ2UgfCBudWxsO1xyXG4gICAgaW5wdXRMaW5rQm94V3JhcHBlcjogSW5wdXRMaW5rQm94V3JhcHBlcjtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuXHJcbiAgICAgICAgY29uc3QgaW5wdXRMaW5rQm94V3JhcHBlciA9IG5ldyBJbnB1dExpbmtCb3hXcmFwcGVyKCk7XHJcblxyXG4gICAgICAgIHN1cGVyKHtcclxuICAgICAgICAgICAgaW5wdXRMaW5rQm94V3JhcHBlcjogaW5wdXRMaW5rQm94V3JhcHBlclxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmlucHV0TGlua0JveFdyYXBwZXIgPSBpbnB1dExpbmtCb3hXcmFwcGVyO1xyXG4gICAgICAgIHRoaXMuYXR0YWNoRXZlbnRzKCk7XHJcbiAgICAgICAgdGhpcy5kcm9wZG93bnMgPSBbXTtcclxuICAgICAgICB0aGlzLmN1cnJlbnRTZWxlY3Rpb25SYW5nZSA9IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdCgpOiBIVE1MRWxlbWVudCB7XHJcblxyXG4gICAgICAgIGNvbnN0IGh0bWxFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcblxyXG4gICAgICAgIGh0bWxFbGVtZW50LmlkID0gJ2Zsb2F0aW5nVG9vbGJhcic7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuICAgICAgICBodG1sRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdzb2Z0LWJveC1zaGFkb3cnKTtcclxuXHJcbiAgICAgICAgY29uc3Qgc2VsZWN0V3JhcHBlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgIHNlbGVjdFdyYXBwZXIuY2xhc3NMaXN0LmFkZCgnc2VsZWN0LXdyYXBwZXInKTtcclxuXHJcbiAgICAgICAgaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQoc2VsZWN0V3JhcHBlcik7XHJcblxyXG4gICAgICAgIGNvbnN0IGVkaXRvciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiam9oYW5uZXNFZGl0b3JcIik7XHJcblxyXG4gICAgICAgIGVkaXRvcj8uYXBwZW5kQ2hpbGQodGhpcy5wcm9wcy5pbnB1dExpbmtCb3hXcmFwcGVyLmh0bWxFbGVtZW50KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGh0bWxFbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBkaXNwbGF5KCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuICdmbGV4JztcclxuICAgIH1cclxuXHJcbiAgICBzaG93KCk6IHZvaWQge1xyXG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcclxuXHJcbiAgICAgICAgICAgIGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05lbmh1bWEgc2VsZcOnw6NvIGVuY29udHJhZGEnKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50U2VsZWN0aW9uUmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlY3QgPSByYW5nZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRXaWR0aCA9IHRoaXMuaHRtbEVsZW1lbnQub2Zmc2V0V2lkdGg7XHJcbiAgICAgICAgICAgIGxldCBsZWZ0UG9zaXRpb24gPSByZWN0LmxlZnQgKyB3aW5kb3cuc2Nyb2xsWCAtIDUwO1xyXG5cclxuICAgICAgICAgICAgaWYgKGxlZnRQb3NpdGlvbiArIGVsZW1lbnRXaWR0aCA+IHdpbmRvdy5pbm5lcldpZHRoKSB7XHJcbiAgICAgICAgICAgICAgICBsZWZ0UG9zaXRpb24gPSB3aW5kb3cuaW5uZXJXaWR0aCAtIGVsZW1lbnRXaWR0aCAtIDIwO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCBlbGVtZW50SGVpZ2h0ID0gdGhpcy5odG1sRWxlbWVudC5vZmZzZXRIZWlnaHQ7XHJcbiAgICAgICAgICAgIGxldCB0b3BQb3NpdGlvbiA9IHJlY3QudG9wICsgd2luZG93LnNjcm9sbFkgLSBlbGVtZW50SGVpZ2h0IC0gMTA7XHJcblxyXG4gICAgICAgICAgICBpZiAodG9wUG9zaXRpb24gPCAwKSB7XHJcbiAgICAgICAgICAgICAgICB0b3BQb3NpdGlvbiA9IHJlY3QuYm90dG9tICsgd2luZG93LnNjcm9sbFkgKyAxMDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5odG1sRWxlbWVudC5zdHlsZS5sZWZ0ID0gYCR7bGVmdFBvc2l0aW9ufXB4YDtcclxuICAgICAgICAgICAgdGhpcy5odG1sRWxlbWVudC5zdHlsZS50b3AgPSBgJHt0b3BQb3NpdGlvbn1weGA7XHJcblxyXG4gICAgICAgICAgICBzdXBlci5zaG93KCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaGlkZSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmN1cnJlbnRTZWxlY3Rpb25SYW5nZSA9IG51bGw7XHJcbiAgICAgICAgc3VwZXIuaGlkZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGFwcGVuZERyb3Bkb3duKGRyb3Bkb3duOiBEcm9wZG93bk1lbnUpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmRyb3Bkb3ducy5wdXNoKGRyb3Bkb3duKVxyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQoZHJvcGRvd24uaHRtbEVsZW1lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIGFwcGVuZFNlcGFyYXRvcihzZXBhcmF0b3I6IEZsb2F0aW5nVG9vbGJhclNlcGFyYXRvcik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQoc2VwYXJhdG9yLmh0bWxFbGVtZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBhcHBlbmRUZXh0VG9vbGJhcihidXR0b246IEdyb3VwQnV0dG9uKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5hcHBlbmRDaGlsZChidXR0b24uaHRtbEVsZW1lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIGFueURyb3Bkb3duVmlzaWJsZSgpOiBib29sZWFuIHtcclxuICAgICAgICBmb3IgKGNvbnN0IGRyb3Bkb3duIG9mIHRoaXMuZHJvcGRvd25zKSB7XHJcbiAgICAgICAgICAgIGlmIChkcm9wZG93bi5kcm9wZG93bkxpc3QuaXNWaXNpYmxlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGhpZGVBbGxEcm9wZG93blZpc2libGUoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgZm9yIChjb25zdCBkcm9wZG93biBvZiB0aGlzLmRyb3Bkb3ducykge1xyXG4gICAgICAgICAgICBpZiAoZHJvcGRvd24uZHJvcGRvd25MaXN0LmNhbkhpZGUpIHtcclxuICAgICAgICAgICAgICAgIGRyb3Bkb3duLmRyb3Bkb3duTGlzdC5oaWRlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBhdHRhY2hFdmVudHMoKSB7XHJcblxyXG5cclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwic2hvd0lucHV0TGlua0JveFJlcXVlc3RlZFwiLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuY2FuSGlkZSA9IGZhbHNlO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwic2hvd0lucHV0TGlua0JveEZpbmlzaGVkXCIsICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5jYW5IaWRlID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5yZXN0b3JlUmFuZ2VTZWxlY3Rpb24oKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChldmVudCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5jYW5IaWRlICYmIChldmVudC5rZXkgPT09ICdFc2NhcGUnKSkge1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmFueURyb3Bkb3duVmlzaWJsZSgpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWRlQWxsRHJvcGRvd25WaXNpYmxlKCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGlmICh0aGlzLmNhbkhpZGUgJiYgKGV2ZW50LmtleSA9PT0gJ0Fycm93TGVmdCcgfHwgZXZlbnQua2V5ID09PSAnQXJyb3dSaWdodCcgfHwgZXZlbnQua2V5ID09PSAnQXJyb3dVcCcgfHwgZXZlbnQua2V5ID09PSAnQXJyb3dEb3duJykpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzU2VsZWN0aW9uRW1wdHkoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZXZlbnQpID0+IHtcclxuICAgICAgICAvLyAgICAgaWYgKChldmVudC5rZXkgPT09ICdFc2NhcGUnIHx8IGV2ZW50LmtleSA9PT0gJ0RlbGV0ZScpICYmIHRoaXMuaXNWaXNpYmxlKSB7XHJcbiAgICAgICAgLy8gICAgICAgICBpZih0aGlzLmNhbkhpZGUpe1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIHRoaXMuaGlkZUFsbERyb3Bkb3duVmlzaWJsZSgpO1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xyXG4gICAgICAgIC8vICAgICAgICAgfVxyXG4gICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgLy8gfSk7XHJcblxyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleXVwJywgKGV2ZW50KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChldmVudC5rZXkgPT09IFwiU2hpZnRcIiB8fCBldmVudC5rZXkgPT09IFwiQ29udHJvbFwiKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHdpbmRvdy5nZXRTZWxlY3Rpb24oKSEudG9TdHJpbmcoKS50cmltKCkgIT09ICcnKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChVdGlscy5pc1NlbGVjdGVkVGV4dERlc2NlbmRhbnRPZihcIi50aXRsZVwiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3coKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChldmVudCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5jYW5IaWRlICYmICEoZXZlbnQudGFyZ2V0ISBhcyBIVE1MRWxlbWVudCkuY2xvc2VzdChgIyR7dGhpcy5odG1sRWxlbWVudC5pZH1gKSAmJiAhdGhpcy5hbnlEcm9wZG93blZpc2libGUoKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5oaWRlKCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc1Zpc2libGUgJiYgIShldmVudC50YXJnZXQhIGFzIEhUTUxFbGVtZW50KS5jbG9zZXN0KGAjJHt0aGlzLmh0bWxFbGVtZW50LmlkfWApICYmICF0aGlzLmlucHV0TGlua0JveFdyYXBwZXIuaXNWaXNpYmxlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlc3RvcmVSYW5nZVNlbGVjdGlvbigpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCAoZXZlbnQpID0+IHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmlzVmlzaWJsZSkge1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIHdhaXQgdGhlIHNlbGVjdGlvbiB0byBiZSByZWZsZWN0ZWQgaW4gdGhlIERPTVxyXG4gICAgICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHdpbmRvdy5nZXRTZWxlY3Rpb24oKSEudG9TdHJpbmcoKS50cmltKCkgIT09ICcnKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoVXRpbHMuaXNTZWxlY3RlZFRleHREZXNjZW5kYW50T2YoXCIudGl0bGVcIikpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3coKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdzZWxlY3RlZEJsb2NrRGVsZXRlZCcsIChldmVudCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5jYW5IaWRlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhpZGUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdyZXF1ZXN0SGlkZUZsb2F0aW5nVG9vbGJhcicsICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuY2FuSGlkZSkge1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmFueURyb3Bkb3duVmlzaWJsZSgpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWRlQWxsRHJvcGRvd25WaXNpYmxlKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5oaWRlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgaXNTZWxlY3Rpb25FbXB0eSgpIHtcclxuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSBkb2N1bWVudC5nZXRTZWxlY3Rpb24oKTtcclxuICAgICAgICByZXR1cm4gIXNlbGVjdGlvbiB8fCBzZWxlY3Rpb24ucmFuZ2VDb3VudCA9PT0gMCB8fCBzZWxlY3Rpb24udG9TdHJpbmcoKS50cmltKCkgPT09ICcnO1xyXG4gICAgfVxyXG5cclxuICAgIHJlc3RvcmVSYW5nZVNlbGVjdGlvbigpOiB2b2lkIHtcclxuICAgICAgICBkb2N1bWVudC5nZXRTZWxlY3Rpb24oKT8ucmVtb3ZlQWxsUmFuZ2VzKCk7XHJcbiAgICAgICAgZG9jdW1lbnQuZ2V0U2VsZWN0aW9uKCk/LmFkZFJhbmdlKHRoaXMuY3VycmVudFNlbGVjdGlvblJhbmdlISk7XHJcbiAgICB9XHJcbn1cclxuXHJcblxyXG4iLCJpbXBvcnQgeyBJVGV4dE9wZXJhdGlvblNlcnZpY2UgfSBmcm9tIFwiQC9zZXJ2aWNlcy90ZXh0LW9wZXJhdGlvbnMvSVRleHRPcGVyYXRpb25TZXJ2aWNlXCI7XHJcbmltcG9ydCB7IEJhc2VVSUNvbXBvbmVudCB9IGZyb20gXCIuLi8uLi9jb21tb24vQmFzZVVJQ29tcG9uZW50XCI7XHJcbmltcG9ydCB7IERyb3Bkb3duTWVudUxpc3QgfSBmcm9tIFwiLi9Ecm9wZG93bk1lbnVMaXN0XCI7XHJcbmltcG9ydCB7IFNWR0ljb24gfSBmcm9tIFwiQC9jb21wb25lbnRzL2NvbW1vbi9TVkdJY29uXCI7XHJcbmltcG9ydCB7IFRleHRPcGVyYXRpb25TZXJ2aWNlIH0gZnJvbSBcIkAvc2VydmljZXMvdGV4dC1vcGVyYXRpb25zL1RleHRPcGVyYXRpb25TZXJ2aWNlXCI7XHJcbmltcG9ydCB7IElEcm9wZG93bk1lbnVJdGVtIH0gZnJvbSBcIi4vSURyb3Bkb3duTWVudUl0ZW1cIjtcclxuaW1wb3J0IHsgSk5vZGUgfSBmcm9tIFwiQC9jb21tb24vSk5vZGVcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBEcm9wZG93bk1lbnVMaXN0SXRlbSBleHRlbmRzIEJhc2VVSUNvbXBvbmVudCBpbXBsZW1lbnRzIElEcm9wZG93bk1lbnVJdGVtIHtcclxuXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRleHRPcGVyYXRpb25TZXJ2aWNlOiBJVGV4dE9wZXJhdGlvblNlcnZpY2U7XHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbW1hbmQ6IHN0cmluZztcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgdmFsdWU6IHN0cmluZyB8IG51bGw7XHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGFjdGl2ZUljb24/OiBTVkdJY29uO1xyXG5cclxuICAgIHBhcmVudERyb3Bkb3duTWVudUxpc3Q6IERyb3Bkb3duTWVudUxpc3Q7XHJcblxyXG4gICAgY29uc3RydWN0b3IoaWQ6IHN0cmluZywgcGFyZW50RHJvcGRvd25NZW51TGlzdDogRHJvcGRvd25NZW51TGlzdCwgdGV4dE9wZXJhdGlvbnNTZXJ2aWNlOiBJVGV4dE9wZXJhdGlvblNlcnZpY2UsIGNvbW1hbmQ6IHN0cmluZywgdmFsdWU6IHN0cmluZyB8IG51bGwsIGxlZnRJY29uOiBIVE1MRWxlbWVudCB8IFNWR0VsZW1lbnQsIHRpdGxlOiBzdHJpbmcsIHNob3J0Y3V0OiBzdHJpbmcgfCBudWxsID0gbnVsbCkge1xyXG5cclxuICAgICAgICBjb25zdCBpY29uID0gbmV3IFNWR0ljb24oXCJpY29uLW1hdGVyaWFsLXNtYWxsLWNoZWNrXCIpO1xyXG4gICAgICAgIGljb24uaHRtbEVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9IFwiaGlkZGVuXCI7XHJcblxyXG4gICAgICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICAgICAgICBsZWZ0SWNvbi5zdHlsZS5jb2xvciA9IHZhbHVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc3VwZXIoe1xyXG4gICAgICAgICAgICBpZDogaWQsXHJcbiAgICAgICAgICAgIGxlZnRJY29uOiBsZWZ0SWNvbixcclxuICAgICAgICAgICAgdGl0bGU6IHRpdGxlLFxyXG4gICAgICAgICAgICBpY29uOiBpY29uLFxyXG4gICAgICAgICAgICBzaG9ydGN1dDogc2hvcnRjdXRcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5jb21tYW5kID0gY29tbWFuZDtcclxuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy50ZXh0T3BlcmF0aW9uU2VydmljZSA9IHRleHRPcGVyYXRpb25zU2VydmljZTtcclxuICAgICAgICB0aGlzLnBhcmVudERyb3Bkb3duTWVudUxpc3QgPSBwYXJlbnREcm9wZG93bk1lbnVMaXN0O1xyXG4gICAgICAgIHRoaXMuYWN0aXZlSWNvbiA9IGljb247XHJcblxyXG4gICAgICAgIHRoaXMuYXR0YWNoRXZlbnQoKTtcclxuICAgIH1cclxuXHJcbiAgICBmb2N1cygpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ29wdGlvbi1mb2N1c2VkJyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVtb3ZlRm9jdXMoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdvcHRpb24tZm9jdXNlZCcpO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXQoKTogSFRNTEVsZW1lbnQge1xyXG5cclxuICAgICAgICBjb25zdCBodG1sRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpJyk7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuaWQgPSB0aGlzLnByb3BzLmlkO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ29wdGlvbicsICdvcHRpb24taG92ZXInLCAnYmxvY2stb3BlcmF0aW9uJyk7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQudGFiSW5kZXggPSAyO1xyXG5cclxuICAgICAgICBodG1sRWxlbWVudC5zdHlsZS5jb2xvciA9IFwiIzM3MzUyRlwiO1xyXG5cclxuICAgICAgICBjb25zdCB0ZXh0T3B0aW9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgdGV4dE9wdGlvbi5jbGFzc0xpc3QuYWRkKCd0ZXh0LW9wdGlvbicpO1xyXG5cclxuICAgICAgICB0ZXh0T3B0aW9uLmFwcGVuZENoaWxkKHRoaXMucHJvcHMubGVmdEljb24pO1xyXG5cclxuICAgICAgICBjb25zdCBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xyXG4gICAgICAgIHNwYW4uaW5uZXJUZXh0ID0gdGhpcy5wcm9wcy50aXRsZTtcclxuXHJcbiAgICAgICAgdGV4dE9wdGlvbi5hcHBlbmRDaGlsZChzcGFuKTtcclxuXHJcbiAgICAgICAgaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQodGV4dE9wdGlvbik7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5wcm9wcy5pY29uLmh0bWxFbGVtZW50KTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMucHJvcHMuc2hvcnRjdXQpIHtcclxuICAgICAgICAgICAgY29uc3Qgc2hvcnRDdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcclxuICAgICAgICAgICAgc2hvcnRDdXQuaW5uZXJUZXh0ID0gdGhpcy5wcm9wcy5zaG9ydGN1dDtcclxuICAgICAgICAgICAgc2hvcnRDdXQuc3R5bGUuY29sb3IgPSBcInJnYmEoNTUsIDUzLCA0NywgMC41KVwiXHJcblxyXG4gICAgICAgICAgICBodG1sRWxlbWVudC5hcHBlbmRDaGlsZChzaG9ydEN1dCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gaHRtbEVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgcGVyZm9ybUFjdGlvbigpOiB2b2lkIHtcclxuXHJcbiAgICAgICAgdGhpcy50ZXh0T3BlcmF0aW9uU2VydmljZS5leGVjQ29tbWFuZCh0aGlzLmNvbW1hbmQsIGZhbHNlLCB0aGlzLnZhbHVlKTtcclxuXHJcbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcclxuICAgICAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG4gICAgICAgICAgICBpZiAoIXNlbGVjdGlvbiB8fCBzZWxlY3Rpb24ucmFuZ2VDb3VudCA9PT0gMCkgcmV0dXJuO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcclxuICAgICAgICAgICAgbGV0IGNvbnRhaW5lcjogTm9kZSB8IG51bGwgPSByYW5nZS5jb21tb25BbmNlc3RvckNvbnRhaW5lcjtcclxuXHJcbiAgICAgICAgICAgIGlmIChjb250YWluZXI/Lm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyID0gY29udGFpbmVyLnBhcmVudE5vZGU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGZvY3VzYWJsZVBhcmVudCA9IChjb250YWluZXIgYXMgSFRNTEVsZW1lbnQpLmNsb3Nlc3QoXCIuZm9jdXNhYmxlXCIpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGZvY3VzYWJsZVBhcmVudCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ub3JtYWxpemVBbmRNZXJnZUVsZW1lbnRzKGZvY3VzYWJsZVBhcmVudCBhcyBIVE1MRWxlbWVudCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBhdHRhY2hFdmVudCgpOiB2b2lkIHtcclxuXHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCAoKSA9PiB7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBub2RlOiBKTm9kZTxJRHJvcGRvd25NZW51SXRlbT4gPSB0aGlzLnBhcmVudERyb3Bkb3duTWVudUxpc3QuZHJvcGRvd25JdGVtcy5maW5kKHRoaXMpITtcclxuXHJcbiAgICAgICAgICAgIHRoaXMucGFyZW50RHJvcGRvd25NZW51TGlzdC5zd2l0Y2hWaXN1YWxGb2N1cyhub2RlISk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5wZXJmb3JtQWN0aW9uKCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG5cclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwic2VsZWN0aW9uY2hhbmdlXCIsICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgdGhpcy5jb21tYW5kID09IFRleHRPcGVyYXRpb25TZXJ2aWNlLlFVRVJZX1RFWFRfT1BFUkFUSU9OUy5ISUxJVEVfQ09MT1IgfHxcclxuICAgICAgICAgICAgICAgIHRoaXMuY29tbWFuZCA9PSBUZXh0T3BlcmF0aW9uU2VydmljZS5RVUVSWV9URVhUX09QRVJBVElPTlMuRk9SRV9DT0xPUikge1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlQ2hlY2tJY29uVmlzaWJpbGl0eSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJjb2xvckNoYW5nZVwiLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgIHRoaXMuY29tbWFuZCA9PSBUZXh0T3BlcmF0aW9uU2VydmljZS5RVUVSWV9URVhUX09QRVJBVElPTlMuSElMSVRFX0NPTE9SIHx8XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbW1hbmQgPT0gVGV4dE9wZXJhdGlvblNlcnZpY2UuUVVFUllfVEVYVF9PUEVSQVRJT05TLkZPUkVfQ09MT1IpIHtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZUNoZWNrSWNvblZpc2liaWxpdHkoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBub3JtYWxpemVBbmRNZXJnZUVsZW1lbnRzKGVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgbnVsbCk6IHZvaWQge1xyXG4gICAgICAgIGlmICghZWxlbWVudCkgcmV0dXJuO1xyXG5cclxuICAgICAgICBsZXQgY2hpbGQgPSBlbGVtZW50LmZpcnN0Q2hpbGQ7XHJcbiAgICAgICAgd2hpbGUgKGNoaWxkKSB7XHJcbiAgICAgICAgICAgIGlmIChjaGlsZC5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubm9ybWFsaXplQW5kTWVyZ2VFbGVtZW50cyhjaGlsZCBhcyBIVE1MRWxlbWVudCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGxldCBuZXh0U2libGluZyA9IGNoaWxkLm5leHRTaWJsaW5nO1xyXG4gICAgICAgICAgICB3aGlsZSAobmV4dFNpYmxpbmcgJiYgdGhpcy5zaG91bGRNZXJnZShjaGlsZCwgbmV4dFNpYmxpbmcpKSB7XHJcbiAgICAgICAgICAgICAgICAoY2hpbGQgYXMgSFRNTEVsZW1lbnQpLmlubmVySFRNTCArPSAobmV4dFNpYmxpbmcgYXMgSFRNTEVsZW1lbnQpLmlubmVySFRNTDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG5leHQgPSBuZXh0U2libGluZy5uZXh0U2libGluZztcclxuICAgICAgICAgICAgICAgIG5leHRTaWJsaW5nLnBhcmVudE5vZGUhLnJlbW92ZUNoaWxkKG5leHRTaWJsaW5nKTtcclxuICAgICAgICAgICAgICAgIG5leHRTaWJsaW5nID0gbmV4dDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY2hpbGQgPSBjaGlsZC5uZXh0U2libGluZztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGVsZW1lbnQubm9ybWFsaXplKCk7XHJcbiAgICB9XHJcblxyXG4gICAgc2hvdWxkTWVyZ2Uobm9kZTE6IENoaWxkTm9kZSwgbm9kZTI6IENoaWxkTm9kZSk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGlmIChub2RlMT8ubm9kZVR5cGUgIT09IE5vZGUuRUxFTUVOVF9OT0RFIHx8IG5vZGUyPy5ub2RlVHlwZSAhPT0gTm9kZS5FTEVNRU5UX05PREUpIHJldHVybiBmYWxzZTtcclxuICAgICAgICBjb25zdCBlbGVtMSA9IG5vZGUxIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgIGNvbnN0IGVsZW0yID0gbm9kZTIgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgcmV0dXJuIGVsZW0xLnRhZ05hbWUgPT09IGVsZW0yLnRhZ05hbWUgJiZcclxuICAgICAgICAgICAgZWxlbTEuc3R5bGUuY3NzVGV4dCA9PT0gZWxlbTIuc3R5bGUuY3NzVGV4dCAmJlxyXG4gICAgICAgICAgICB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtMSkuY29sb3IgPT09IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsZW0yKS5jb2xvcjtcclxuICAgIH1cclxuXHJcblxyXG4gICAgY2hhbmdlQ2hlY2tJY29uVmlzaWJpbGl0eSgpOiB2b2lkIHtcclxuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodGhpcy50ZXh0T3BlcmF0aW9uU2VydmljZS5xdWVyeUNvbW1hbmRTdGF0ZSh0aGlzLmNvbW1hbmQsIHRoaXMudmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZUljb24/LmNoYW5nZVZpc2liaWxpdHlUb1Zpc2libGUoKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlSWNvbj8uY2hhbmdlVmlzaWJpbGl0eVRvSGlkZGVuKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxufSIsImltcG9ydCB7IEJhc2VVSUNvbXBvbmVudCB9IGZyb20gXCIuLi8uLi9jb21tb24vQmFzZVVJQ29tcG9uZW50XCI7XHJcbmltcG9ydCB7IENpcmN1bGFyRG91Ymx5TGlua2VkTGlzdCB9IGZyb20gXCIuLi8uLi8uLi9jb21tb24vQ2lyY3VsYXJEb3VibHlMaW5rZWRMaXN0XCI7XHJcbmltcG9ydCB7IERyb3Bkb3duTWVudUxpc3RJdGVtIH0gZnJvbSBcIi4vRHJvcGRvd25NZW51TGlzdEl0ZW1cIjtcclxuaW1wb3J0IHsgSURyb3Bkb3duTWVudUl0ZW0gfSBmcm9tIFwiLi9JRHJvcGRvd25NZW51SXRlbVwiO1xyXG5pbXBvcnQgeyBKTm9kZSB9IGZyb20gXCJAL2NvbW1vbi9KTm9kZVwiO1xyXG5pbXBvcnQgeyBEcm9wZG93bk1lbnVCdXR0b24gfSBmcm9tIFwiLi9Ecm9wZG93bk1lbnVCdXR0b25cIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBEcm9wZG93bk1lbnVMaXN0IGV4dGVuZHMgQmFzZVVJQ29tcG9uZW50IHtcclxuXHJcbiAgICBwcml2YXRlIHBhcmVudERyb3Bkb3duUGFyZW50QnV0dG9uPzogRHJvcGRvd25NZW51QnV0dG9uO1xyXG5cclxuICAgIGRyb3Bkb3duSXRlbXM6IENpcmN1bGFyRG91Ymx5TGlua2VkTGlzdDxJRHJvcGRvd25NZW51SXRlbT47XHJcbiAgICBjdXJyZW50Rm9jdXNlZE1lbnVJdGVtOiBKTm9kZTxJRHJvcGRvd25NZW51SXRlbT4gfCBudWxsO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGlkOiBzdHJpbmcpIHtcclxuICAgICAgICBzdXBlcih7XHJcbiAgICAgICAgICAgIGlkOiBpZFxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmRyb3Bkb3duSXRlbXMgPSBuZXcgQ2lyY3VsYXJEb3VibHlMaW5rZWRMaXN0PERyb3Bkb3duTWVudUxpc3RJdGVtPigpO1xyXG4gICAgICAgIHRoaXMuY3VycmVudEZvY3VzZWRNZW51SXRlbSA9IG51bGw7XHJcblxyXG4gICAgICAgIHRoaXMuYXR0YWNoRXZlbnRzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGRpc3BsYXkoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gJ2ZsZXgnO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXQoKTogSFRNTEVsZW1lbnQge1xyXG5cclxuICAgICAgICBjb25zdCBodG1sRWxlbWVudDogSFRNTFVMaXN0RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3VsJyk7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuaWQgPSB0aGlzLnByb3BzLmlkO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LnNldEF0dHJpYnV0ZSgnbmFtZScsICdibG9jay10eXBlJyk7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuICAgICAgICBodG1sRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdzb2Z0LWJveC1zaGFkb3cnLCAnZGVwZW5kZW50LWJveCcsICdjaGVja2FibGUtaXRlbXMnKTtcclxuICAgICAgICBodG1sRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9IFwiYWJzb2x1dGVcIjtcclxuICAgICAgICBodG1sRWxlbWVudC5zdHlsZS5tYXhIZWlnaHQgPSBcIjI1dm1heFwiO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LnN0eWxlLm92ZXJmbG93WSA9IFwiYXV0b1wiO1xyXG5cclxuICAgICAgICByZXR1cm4gaHRtbEVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgYXBwZW5kKGRyb3Bkb3duSXRlbTogSURyb3Bkb3duTWVudUl0ZW0pOiB2b2lkIHtcclxuXHJcbiAgICAgICAgdGhpcy5kcm9wZG93bkl0ZW1zLmFwcGVuZChkcm9wZG93bkl0ZW0pO1xyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQoZHJvcGRvd25JdGVtLmh0bWxFbGVtZW50KVxyXG4gICAgfVxyXG5cclxuICAgIHNldFBhcmVudERyb3Bkb3duTWVudUJ1dHRvbihkcm9wZG93blBhcmVudEJ1dHRvbjogRHJvcGRvd25NZW51QnV0dG9uKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5wYXJlbnREcm9wZG93blBhcmVudEJ1dHRvbiA9IGRyb3Bkb3duUGFyZW50QnV0dG9uO1xyXG4gICAgfVxyXG5cclxuICAgIGF0dGFjaEV2ZW50cygpOiB2b2lkIHtcclxuXHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChldmVudCkgPT4ge1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuaXNWaXNpYmxlICYmIHRoaXMuY3VycmVudEZvY3VzZWRNZW51SXRlbSAmJiBldmVudC5rZXkgPT09IFwiRW50ZXJcIikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Rm9jdXNlZE1lbnVJdGVtLnZhbHVlLnBlcmZvcm1BY3Rpb24oKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChldmVudCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5jbGlja2VkT3V0c2lkZVRoZURyb3Bkb3duV2hpbGVEcm9wZG93bklzVmlzaWJsZShldmVudCkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZXZlbnQpID0+IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMua2V5UHJlc3NlZE91dHNpZGVUaGVEcm9wZG93bldoaWxlRHJvcGRvd25Jc1Zpc2libGUoZXZlbnQpKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50LmtleSA9PSBcIkFycm93RG93blwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mb2N1c05leHRWaXNpYmxlSXRlbSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChldmVudC5rZXkgPT0gXCJBcnJvd1VwXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZm9jdXNQcmV2aW91c1Zpc2libGVJdGVtKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBzaG93KCk6IHZvaWQge1xyXG5cclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLmxlZnQgPSBcIjBcIjtcclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLnJpZ2h0ID0gXCJhdXRvXCI7XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYodGhpcy5kb2VzRWxlbWVudE92ZXJmbG93U2NyZWVuKXtcclxuICAgICAgICAgICAgdGhpcy5odG1sRWxlbWVudC5zdHlsZS5sZWZ0ID0gXCJhdXRvXCI7XHJcbiAgICAgICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUucmlnaHQgPSBcIjBcIjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMucGFyZW50RHJvcGRvd25QYXJlbnRCdXR0b24/LnN2Z0ljb24/LnNldFVzZVRvKFwiaWNvbi13b3JkcHJlc3MtY2hldnJvbi11cFwiKTtcclxuICAgICAgICBzdXBlci5zaG93KCk7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIGhpZGUoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5wYXJlbnREcm9wZG93blBhcmVudEJ1dHRvbj8uc3ZnSWNvbj8uc2V0VXNlVG8oXCJpY29uLXdvcmRwcmVzcy1jaGV2cm9uLWRvd25cIik7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50Rm9jdXNlZE1lbnVJdGVtPy52YWx1ZS5yZW1vdmVGb2N1cygpO1xyXG4gICAgICAgIHRoaXMuY3VycmVudEZvY3VzZWRNZW51SXRlbSA9IG51bGw7XHJcbiAgICAgICAgc3VwZXIuaGlkZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHN3aXRjaFZpc3VhbEZvY3VzKGl0ZW06IEpOb2RlPElEcm9wZG93bk1lbnVJdGVtPik6IHZvaWQge1xyXG5cclxuICAgICAgICBpZiAodGhpcy5jdXJyZW50Rm9jdXNlZE1lbnVJdGVtID09IGl0ZW0pIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudEZvY3VzZWRNZW51SXRlbSkge1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRGb2N1c2VkTWVudUl0ZW0udmFsdWUucmVtb3ZlRm9jdXMoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuY3VycmVudEZvY3VzZWRNZW51SXRlbSA9IGl0ZW07XHJcbiAgICAgICAgdGhpcy5jdXJyZW50Rm9jdXNlZE1lbnVJdGVtLnZhbHVlLmZvY3VzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBmb2N1c05leHRWaXNpYmxlSXRlbSgpOiB2b2lkIHtcclxuXHJcbiAgICAgICAgbGV0IG5leHRWaXNpYmxlSXRlbTogSk5vZGU8SURyb3Bkb3duTWVudUl0ZW0+IHwgbnVsbDtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudEZvY3VzZWRNZW51SXRlbSkge1xyXG4gICAgICAgICAgICBuZXh0VmlzaWJsZUl0ZW0gPSB0aGlzLmN1cnJlbnRGb2N1c2VkTWVudUl0ZW0uZ2V0TmV4dFNhdGlzZnlpbmcoaXRlbSA9PiBpdGVtIGluc3RhbmNlb2YgRHJvcGRvd25NZW51TGlzdEl0ZW0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIG5leHRWaXNpYmxlSXRlbSA9IHRoaXMuZHJvcGRvd25JdGVtcy5maW5kRmlyc3QoaXRlbSA9PiBpdGVtIGluc3RhbmNlb2YgRHJvcGRvd25NZW51TGlzdEl0ZW0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5zd2l0Y2hWaXN1YWxGb2N1cyhuZXh0VmlzaWJsZUl0ZW0hKTtcclxuICAgIH1cclxuXHJcbiAgICBmb2N1c1ByZXZpb3VzVmlzaWJsZUl0ZW0oKTogdm9pZCB7XHJcblxyXG4gICAgICAgIGxldCBwcmV2aW91c1Zpc2libGVJdGVtOiBKTm9kZTxJRHJvcGRvd25NZW51SXRlbT4gfCBudWxsO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5jdXJyZW50Rm9jdXNlZE1lbnVJdGVtKSB7XHJcbiAgICAgICAgICAgIHByZXZpb3VzVmlzaWJsZUl0ZW0gPSB0aGlzLmN1cnJlbnRGb2N1c2VkTWVudUl0ZW0uZ2V0UHJldmlvdXNTYXRpc2Z5aW5nKGl0ZW0gPT4gaXRlbSBpbnN0YW5jZW9mIERyb3Bkb3duTWVudUxpc3RJdGVtKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBwcmV2aW91c1Zpc2libGVJdGVtID0gdGhpcy5kcm9wZG93bkl0ZW1zLmZpbmRGaXJzdChpdGVtID0+IGl0ZW0gaW5zdGFuY2VvZiBEcm9wZG93bk1lbnVMaXN0SXRlbSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnN3aXRjaFZpc3VhbEZvY3VzKHByZXZpb3VzVmlzaWJsZUl0ZW0hKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNsaWNrZWRPdXRzaWRlVGhlRHJvcGRvd25XaGlsZURyb3Bkb3duSXNWaXNpYmxlKGV2ZW50OiBNb3VzZUV2ZW50KTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FuSGlkZSAmJiAhKGV2ZW50LnRhcmdldCEgYXMgSFRNTEVsZW1lbnQpLmNsb3Nlc3QoYCMke3RoaXMuaHRtbEVsZW1lbnQuaWR9YCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBrZXlQcmVzc2VkT3V0c2lkZVRoZURyb3Bkb3duV2hpbGVEcm9wZG93bklzVmlzaWJsZShldmVudDogS2V5Ym9hcmRFdmVudCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNhbkhpZGUgJiYgIShldmVudC50YXJnZXQhIGFzIEhUTUxFbGVtZW50KS5jbG9zZXN0KGAjJHt0aGlzLmh0bWxFbGVtZW50LmlkfWApO1xyXG4gICAgfVxyXG5cclxufSIsImltcG9ydCB7IEJhc2VVSUNvbXBvbmVudCB9IGZyb20gXCIuLi8uLi9jb21tb24vQmFzZVVJQ29tcG9uZW50XCI7XHJcblxyXG5leHBvcnQgY2xhc3MgRmxvYXRpbmdUb29sYmFyU2VwYXJhdG9yIGV4dGVuZHMgQmFzZVVJQ29tcG9uZW50IHtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBzdXBlcih7fSk7XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdCgpOiBIVE1MRWxlbWVudCB7XHJcblxyXG4gICAgICAgIGNvbnN0IGh0bWxFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuXHJcbiAgICAgICAgaHRtbEVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gXCIyNHB4XCI7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuc3R5bGUud2lkdGggPSBcIjFweFwiO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LnN0eWxlLmJvcmRlclJpZ2h0ID0gXCIxcHggc29saWQgI2QwZDBkMFwiO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LnN0eWxlLm1hcmdpbiA9IFwiYXV0byA2cHhcIjtcclxuXHJcbiAgICAgICAgcmV0dXJuIGh0bWxFbGVtZW50O1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgQmFzZVVJQ29tcG9uZW50IH0gZnJvbSBcIi4uLy4uL2NvbW1vbi9CYXNlVUlDb21wb25lbnRcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBHcm91cEJ1dHRvbiBleHRlbmRzIEJhc2VVSUNvbXBvbmVudCB7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcblxyXG4gICAgICAgIHN1cGVyKHt9KTtcclxuXHJcbiAgICAgICAgLy8gdGhpcy5hdHRhY2hFdmVudHMoKTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0KCk6IEhUTUxFbGVtZW50IHtcclxuXHJcbiAgICAgICAgY29uc3QgaHRtbEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJpdGVtXCIpO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LnN0eWxlLm1hcmdpbkxlZnQgPSBcIjEwcHhcIjtcclxuICAgICAgICBodG1sRWxlbWVudC5zdHlsZS5tYXJnaW5SaWdodCA9IFwiMTBweFwiO1xyXG5cclxuICAgICAgICByZXR1cm4gaHRtbEVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG59IiwiaW1wb3J0IHsgU1ZHSWNvbiB9IGZyb20gXCIuLi8uLi9jb21tb24vU1ZHSWNvblwiO1xuaW1wb3J0IHsgQmFzZVVJQ29tcG9uZW50IH0gZnJvbSBcIi4uLy4uL2NvbW1vbi9CYXNlVUlDb21wb25lbnRcIjtcbmltcG9ydCB7IElDb21tYW5kIH0gZnJvbSBcIi4uLy4uLy4uL3NlcnZpY2VzL2NvbW1vbi9JQ29tbWFuZFwiO1xuaW1wb3J0IHsgVGV4dE9wZXJhdGlvblNlcnZpY2UgfSBmcm9tIFwiQC9zZXJ2aWNlcy90ZXh0LW9wZXJhdGlvbnMvVGV4dE9wZXJhdGlvblNlcnZpY2VcIjtcblxuZXhwb3J0IGNsYXNzIEdyb3VwZWRCdXR0b24gZXh0ZW5kcyBCYXNlVUlDb21wb25lbnQge1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBjb21tYW5kU2VydmljZTogSUNvbW1hbmQ7XG4gICAgcHJpdmF0ZSByZWFkb25seSBjb21tYW5kOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSByZWFkb25seSBzaG93VUk6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSByZWFkb25seSBpY29uOiBTVkdJY29uO1xuXG4gICAgY29uc3RydWN0b3IoY29tbWFuZFNlcnZpY2U6IElDb21tYW5kLCBjb21tYW5kOiBzdHJpbmcsIHRpdGxlOiBzdHJpbmcsIHN2Z0ljb25JZDogc3RyaW5nKSB7XG5cbiAgICAgICAgY29uc3QgaWNvbiA9IG5ldyBTVkdJY29uKHN2Z0ljb25JZCwgXCIxLjI1cmVtXCIsIFwiMS4yNXJlbVwiKTtcblxuICAgICAgICBzdXBlcih7XG4gICAgICAgICAgICB0aXRsZTogdGl0bGUsXG4gICAgICAgICAgICBpY29uOiBpY29uXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuY29tbWFuZFNlcnZpY2UgPSBjb21tYW5kU2VydmljZTtcbiAgICAgICAgdGhpcy5jb21tYW5kID0gY29tbWFuZDtcbiAgICAgICAgdGhpcy5zaG93VUkgPSBjb21tYW5kID09IFRleHRPcGVyYXRpb25TZXJ2aWNlLlFVRVJZX1RFWFRfT1BFUkFUSU9OUy5DUkVBVEVfTElOSztcbiAgICAgICAgdGhpcy5pY29uID0gaWNvbjtcbiAgICAgICAgdGhpcy5hdHRhY2hFdmVudHMoKTtcbiAgICB9XG5cbiAgICBpbml0KCk6IEhUTUxFbGVtZW50IHtcblxuICAgICAgICBjb25zdCBodG1sRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIik7XG5cbiAgICAgICAgaHRtbEVsZW1lbnQucm9sZSA9IFwiYnV0dG9uXCI7XG4gICAgICAgIGh0bWxFbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJlbnRyeVwiLCBcImJ1dHRvbi1yZXNldFwiLCBcInRleHQtZm9ybWF0dGluZy1vcGVyYXRpb25cIiwgXCJvcHRpb24taG92ZXJcIik7XG4gICAgICAgIGh0bWxFbGVtZW50LnRpdGxlID0gdGhpcy5wcm9wcy50aXRsZTtcbiAgICAgICAgaHRtbEVsZW1lbnQudGFiSW5kZXggPSAxO1xuXG4gICAgICAgIGh0bWxFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMucHJvcHMuaWNvbi5odG1sRWxlbWVudCk7XG5cbiAgICAgICAgcmV0dXJuIGh0bWxFbGVtZW50O1xuICAgIH1cblxuXG4gICAgYXR0YWNoRXZlbnRzKCk6IHZvaWQge1xuXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIChldmVudCkgPT4ge1xuXG4gICAgICAgICAgICBjb25zdCBlZGl0YWJsZUVsZW1lbnQgPSB0aGlzLmdldFBhcmVudEVkaXRhYmxlKCk7XG5cbiAgICAgICAgICAgIHRoaXMuY29tbWFuZFNlcnZpY2UuZXhlY0NvbW1hbmQodGhpcy5jb21tYW5kLCB0aGlzLnNob3dVSSk7XG4gICAgICAgICAgICB0aGlzLmNoYW5nZUljb25Db2xvcigpO1xuXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICBlZGl0YWJsZUVsZW1lbnQ/Lm5vcm1hbGl6ZSgpO1xuICAgICAgICAgICAgfSwgMTApO1xuICAgICAgICB9KTtcblxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdzZWxlY3Rpb25jaGFuZ2UnLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcblxuICAgICAgICAgICAgaWYgKCFzZWxlY3Rpb24/LmlzQ29sbGFwc2VkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VJY29uQ29sb3IoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZ2V0UGFyZW50RWRpdGFibGUoKSB7XG5cbiAgICAgICAgbGV0IGN1cnJlbnRCbG9ja1JhbmdlID0gd2luZG93LmdldFNlbGVjdGlvbigpIS5nZXRSYW5nZUF0KDApO1xuXG4gICAgICAgIGxldCBjb21tb25BbmNlc3RvciA9IGN1cnJlbnRCbG9ja1JhbmdlLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyO1xuXG4gICAgICAgIGlmIChjb21tb25BbmNlc3Rvci5ub2RlVHlwZSA9PT0gMykge1xuICAgICAgICAgICAgY29tbW9uQW5jZXN0b3IgPSBjb21tb25BbmNlc3Rvci5wYXJlbnROb2RlITtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGN1cnJlbnRCbG9jayA9IChjb21tb25BbmNlc3RvciBhcyBIVE1MRWxlbWVudCkuY2xvc2VzdCgnLmVkaXRhYmxlJyk7XG5cbiAgICAgICAgcmV0dXJuIGN1cnJlbnRCbG9jaztcbiAgICB9XG5cbiAgICBjaGFuZ2VJY29uQ29sb3IoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmNvbW1hbmRTZXJ2aWNlLnF1ZXJ5Q29tbWFuZFN0YXRlKHRoaXMuY29tbWFuZCkpIHtcbiAgICAgICAgICAgIHRoaXMuaWNvbi5jaGFuZ2VDb2xvcihcIiMyMzgyZTJcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmljb24uY2hhbmdlQ29sb3IoXCJyZ2JhKDU1LCA1MywgNDcsIDAuODUpXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsImltcG9ydCB7IEJhc2VVSUNvbXBvbmVudCB9IGZyb20gXCIuLi8uLi9jb21tb24vQmFzZVVJQ29tcG9uZW50XCI7O1xyXG5cclxuZXhwb3J0IGNsYXNzIENvbG9ySWNvbiBleHRlbmRzIEJhc2VVSUNvbXBvbmVudCB7XHJcblxyXG4gICAgY29uc3RydWN0b3IoY29sb3I6IHN0cmluZykge1xyXG4gICAgICAgIHN1cGVyKHtcclxuICAgICAgICAgICAgY29sb3I6IGNvbG9yXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdCgpOiBIVE1MRWxlbWVudCB7XHJcblxyXG4gICAgICAgIGNvbnN0IGh0bWxFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuXHJcbiAgICAgICAgaHRtbEVsZW1lbnQuc3R5bGUud2lkdGggPSBcIjEuMjVyZW1cIjtcclxuICAgICAgICBodG1sRWxlbWVudC5zdHlsZS5oZWlnaHQgPSBcIjEuMjVyZW1cIjtcclxuICAgICAgICBodG1sRWxlbWVudC5zdHlsZS5ib3JkZXJSYWRpdXMgPSBcIjUwJVwiO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LnN0eWxlLmJhY2tncm91bmRDb2xvciA9IHRoaXMucHJvcHMuY29sb3I7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuc3R5bGUuYm9yZGVyID0gXCIxcHggc29saWQgI2QwZDBkMFwiO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LnN0eWxlLmJveFNpemluZyA9IFwiYm9yZGVyLWJveFwiO1xyXG5cclxuICAgICAgICByZXR1cm4gaHRtbEVsZW1lbnQ7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBTVkdJY29uIH0gZnJvbSBcIi4uLy4uL2NvbW1vbi9TVkdJY29uXCI7XHJcbmltcG9ydCB7IEJhc2VVSUNvbXBvbmVudCB9IGZyb20gXCIuLi8uLi9jb21tb24vQmFzZVVJQ29tcG9uZW50XCI7XHJcbmltcG9ydCB7IERyb3Bkb3duTWVudUxpc3QgfSBmcm9tIFwiLi9Ecm9wZG93bk1lbnVMaXN0XCI7XHJcblxyXG5leHBvcnQgY2xhc3MgRHJvcGRvd25NZW51QnV0dG9uIGV4dGVuZHMgQmFzZVVJQ29tcG9uZW50IHtcclxuXHJcbiAgICBkcm9wZG93bkxpc3Q6IERyb3Bkb3duTWVudUxpc3Q7XHJcbiAgICBzdmdJY29uPzogU1ZHSWNvbjtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihpZDogc3RyaW5nLCB0aXRsZTogc3RyaW5nIHwgSFRNTEVsZW1lbnQsIGRyb3Bkb3duTGlzdDogRHJvcGRvd25NZW51TGlzdCwgaW5jbHVkZUNoZXZyb25JY29uOiBib29sZWFuID0gdHJ1ZSkge1xyXG5cclxuICAgICAgICBjb25zdCBzdmdJY29uID0gbmV3IFNWR0ljb24oXCJpY29uLXdvcmRwcmVzcy1jaGV2cm9uLWRvd25cIik7XHJcblxyXG4gICAgICAgIHN1cGVyKHtcclxuICAgICAgICAgICAgaWQ6IGlkLFxyXG4gICAgICAgICAgICB0aXRsZTogdGl0bGUsXHJcbiAgICAgICAgICAgIGRyb3Bkb3duTGlzdDogZHJvcGRvd25MaXN0LFxyXG4gICAgICAgICAgICBzdmdJY29uOiBpbmNsdWRlQ2hldnJvbkljb24gPyBzdmdJY29uIDogbnVsbFxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmRyb3Bkb3duTGlzdCA9IGRyb3Bkb3duTGlzdDtcclxuICAgICAgICB0aGlzLnN2Z0ljb24gPSBzdmdJY29uO1xyXG4gICAgICAgIHRoaXMuYXR0YWNoRXZlbnRzKCk7XHJcblxyXG4gICAgICAgIGRyb3Bkb3duTGlzdC5zZXRQYXJlbnREcm9wZG93bk1lbnVCdXR0b24odGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdCgpOiBIVE1MRWxlbWVudCB7XHJcblxyXG4gICAgICAgIGNvbnN0IGh0bWxFbGVtZW50OiBIVE1MQnV0dG9uRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LmlkID0gdGhpcy5wcm9wcy5pZDtcclxuICAgICAgICAvLyBodG1sRWxlbWVudC50aXRsZSA9IHRoaXMucHJvcHMudGl0bGVcclxuICAgICAgICBodG1sRWxlbWVudC5yb2xlID0gXCJidXR0b25cIjtcclxuICAgICAgICBodG1sRWxlbWVudC5jbGFzc0xpc3QuYWRkKFwiYnV0dG9uLXJlc2V0XCIsIFwidGV4dC1mb3JtYXR0aW5nLXNlbGVjdC1idXR0b25cIiwgXCJ0ZXh0LWZvcm1hdHRpbmctb3BlcmF0aW9uXCIsIFwib3B0aW9uLWhvdmVyXCIpO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LnRhYkluZGV4ID0gMTtcclxuICAgICAgICBodG1sRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9IFwicmVsYXRpdmVcIjtcclxuICAgICAgICBodG1sRWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJhcmlhLWNvbnRyb2xzXCIsIHRoaXMucHJvcHMuZHJvcGRvd25MaXN0Lmh0bWxFbGVtZW50LmlkKTtcclxuXHJcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnByb3BzLnRpdGxlID09PSBcInN0cmluZ1wiKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XHJcbiAgICAgICAgICAgIHNwYW4udGV4dENvbnRlbnQgPSB0aGlzLnByb3BzLnRpdGxlO1xyXG4gICAgICAgICAgICBodG1sRWxlbWVudC5hcHBlbmRDaGlsZChzcGFuKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBodG1sRWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLnByb3BzLnRpdGxlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnByb3BzLnN2Z0ljb24pIHtcclxuICAgICAgICAgICAgaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5wcm9wcy5zdmdJY29uLmh0bWxFbGVtZW50KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBodG1sRWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICBhdHRhY2hFdmVudHMoKTogdm9pZCB7XHJcblxyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmRyb3Bkb3duTGlzdC5pc1Zpc2libGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZHJvcGRvd25MaXN0LnNob3coKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgIH1cclxufSIsImltcG9ydCB7IEJhc2VVSUNvbXBvbmVudCB9IGZyb20gXCIuLi8uLi9jb21tb24vQmFzZVVJQ29tcG9uZW50XCI7XHJcbmltcG9ydCB7IERyb3Bkb3duTWVudUxpc3QgfSBmcm9tIFwiLi9Ecm9wZG93bk1lbnVMaXN0XCI7XHJcbmltcG9ydCB7IElEcm9wZG93bk1lbnVJdGVtIH0gZnJvbSBcIi4vSURyb3Bkb3duTWVudUl0ZW1cIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBEcm9wZG93bk1lbnVMaXN0SXRlbVRpdGxlIGV4dGVuZHMgQmFzZVVJQ29tcG9uZW50IGltcGxlbWVudHMgSURyb3Bkb3duTWVudUl0ZW0ge1xyXG5cclxuXHJcbiAgICBwYXJlbnREcm9wZG93bk1lbnVMaXN0OiBEcm9wZG93bk1lbnVMaXN0O1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHBhcmVudERyb3Bkb3duTWVudUxpc3Q6IERyb3Bkb3duTWVudUxpc3QsIHRpdGxlOiBzdHJpbmcpIHtcclxuXHJcbiAgICAgICAgc3VwZXIoe1xyXG4gICAgICAgICAgICB0aXRsZTogdGl0bGVcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5wYXJlbnREcm9wZG93bk1lbnVMaXN0ID0gcGFyZW50RHJvcGRvd25NZW51TGlzdDtcclxuICAgIH1cclxuXHJcbiAgICBwZXJmb3JtQWN0aW9uKCk6IHZvaWQge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1ldGhvZCBub3QgaW1wbGVtZW50ZWQuXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbW92ZUZvY3VzKCk6IHZvaWQge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1ldGhvZCBub3QgaW1wbGVtZW50ZWQuXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIGZvY3VzKCk6IHZvaWQge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1ldGhvZCBub3QgaW1wbGVtZW50ZWQuXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXQoKTogSFRNTEVsZW1lbnQge1xyXG5cclxuICAgICAgICBjb25zdCBodG1sRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpJyk7XHJcblxyXG4gICAgICAgIGNvbnN0IHRpdGxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaDMnKTtcclxuICAgICAgICB0aXRsZS5pbm5lclRleHQgPSB0aGlzLnByb3BzLnRpdGxlO1xyXG5cclxuICAgICAgICBodG1sRWxlbWVudC5hcHBlbmRDaGlsZCh0aXRsZSk7XHJcblxyXG4gICAgICAgIHJldHVybiBodG1sRWxlbWVudDtcclxuICAgIH1cclxufSIsImltcG9ydCB7IERyb3Bkb3duTWVudSB9IGZyb20gXCIuLi9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvZHJvcGRvd24tdG9vbC9Ecm9wZG93bk1lbnVcIjtcclxuaW1wb3J0IHsgRmxvYXRpbmdUb29sYmFyIH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvZmxvYXRpbmctdG9vbGJhci9GbG9hdGluZ1Rvb2xiYXJcIjtcclxuaW1wb3J0IHsgRHJvcGRvd25NZW51TGlzdCB9IGZyb20gXCIuLi9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvZHJvcGRvd24tdG9vbC9Ecm9wZG93bk1lbnVMaXN0XCI7XHJcbmltcG9ydCB7IERyb3Bkb3duTWVudUxpc3RJdGVtIH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvZmxvYXRpbmctdG9vbGJhci9kcm9wZG93bi10b29sL0Ryb3Bkb3duTWVudUxpc3RJdGVtXCI7XHJcbmltcG9ydCB7IFNWR0ljb24gfSBmcm9tIFwiLi4vY29tcG9uZW50cy9jb21tb24vU1ZHSWNvblwiO1xyXG5pbXBvcnQgeyBGbG9hdGluZ1Rvb2xiYXJTZXBhcmF0b3IgfSBmcm9tIFwiLi4vY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL3NlcGFyYXRvci9GbG9hdGluZ1Rvb2xiYXJTZXBhcmF0b3JcIjtcclxuaW1wb3J0IHsgR3JvdXBCdXR0b24gfSBmcm9tIFwiLi4vY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL2dyb3VwLWJ1dHRvbi9Hcm91cEJ1dHRvblwiO1xyXG5pbXBvcnQgeyBHcm91cGVkQnV0dG9uIH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvZmxvYXRpbmctdG9vbGJhci9ncm91cC1idXR0b24vR3JvdXBlZEJ1dHRvblwiO1xyXG5pbXBvcnQgeyBDb2xvckljb24gfSBmcm9tIFwiLi4vY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL2Ryb3Bkb3duLXRvb2wvQ29sb3JJY29uXCI7XHJcbmltcG9ydCB7IFRleHRPcGVyYXRpb25TZXJ2aWNlIH0gZnJvbSBcIi4uL3NlcnZpY2VzL3RleHQtb3BlcmF0aW9ucy9UZXh0T3BlcmF0aW9uU2VydmljZVwiO1xyXG5pbXBvcnQgeyBEcm9wZG93bk1lbnVCdXR0b24gfSBmcm9tIFwiLi4vY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL2Ryb3Bkb3duLXRvb2wvRHJvcGRvd25NZW51QnV0dG9uXCI7XHJcbmltcG9ydCB7IEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UgfSBmcm9tIFwiLi4vc2VydmljZXMvYmxvY2stb3BlcmF0aW9ucy9CbG9ja09wZXJhdGlvbnNTZXJ2aWNlXCI7XHJcbmltcG9ydCB7IERyb3Bkb3duTWVudUxpc3RJdGVtVGl0bGUgfSBmcm9tIFwiQC9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvZHJvcGRvd24tdG9vbC9Ecm9wZG93bk1lbnVMaXN0SXRlbVRpdGxlXCI7XHJcbmltcG9ydCB7IEVsZW1lbnRGYWN0b3J5U2VydmljZSB9IGZyb20gXCJAL3NlcnZpY2VzL2VsZW1lbnQtZmFjdG9yeS9FbGVtZW50RmFjdG9yeVNlcnZpY2VcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBGbG9hdGluZ1Rvb2xiYXJCdWlsZGVyIHtcclxuXHJcbiAgICBzdGF0aWMgYnVpbGQoKTogRmxvYXRpbmdUb29sYmFyIHtcclxuXHJcbiAgICAgICAgY29uc3QgZmxvYXRpbmdCYXIgPSBuZXcgRmxvYXRpbmdUb29sYmFyKCk7XHJcblxyXG4gICAgICAgIGZsb2F0aW5nQmFyLmFwcGVuZERyb3Bkb3duKEZsb2F0aW5nVG9vbGJhckJ1aWxkZXIudHVybkludG9Ecm9wZG93bigpKTtcclxuICAgICAgICBmbG9hdGluZ0Jhci5hcHBlbmRTZXBhcmF0b3IoRmxvYXRpbmdUb29sYmFyQnVpbGRlci5zZXBhcmF0b3IoKSk7XHJcbiAgICAgICAgZmxvYXRpbmdCYXIuYXBwZW5kU2VwYXJhdG9yKEZsb2F0aW5nVG9vbGJhckJ1aWxkZXIuZ3JvdXBCdXR0b24oKSk7XHJcbiAgICAgICAgZmxvYXRpbmdCYXIuYXBwZW5kRHJvcGRvd24oRmxvYXRpbmdUb29sYmFyQnVpbGRlci5jb2xvckRyb3Bkb3duKCkpO1xyXG4gICAgICAgIGZsb2F0aW5nQmFyLmFwcGVuZFNlcGFyYXRvcihGbG9hdGluZ1Rvb2xiYXJCdWlsZGVyLnNlcGFyYXRvcigpKTtcclxuICAgICAgICBmbG9hdGluZ0Jhci5hcHBlbmREcm9wZG93bihGbG9hdGluZ1Rvb2xiYXJCdWlsZGVyLm1vcmVPcHRpb25zRHJvcGRvd24oKSk7XHJcblxyXG4gICAgICAgIHJldHVybiBmbG9hdGluZ0JhcjtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgdHVybkludG9Ecm9wZG93bigpOiBEcm9wZG93bk1lbnUge1xyXG5cclxuICAgICAgICBjb25zdCB0dXJuSW50b0Jhckxpc3QgPSBuZXcgRHJvcGRvd25NZW51TGlzdChcInR1cm5JbnRvU2VsZWN0XCIpO1xyXG4gICAgICAgIGNvbnN0IHR1cm5JbnRvQmFyQnV0dG9uID0gbmV3IERyb3Bkb3duTWVudUJ1dHRvbihcInR1cm5JbnRvQnV0dG9uXCIsIFwiVGV4dFwiLCB0dXJuSW50b0Jhckxpc3QpO1xyXG4gICAgICAgIGNvbnN0IHR1cm5JbnRvRHJvcGRvd24gPSBuZXcgRHJvcGRvd25NZW51KHR1cm5JbnRvQmFyQnV0dG9uLCB0dXJuSW50b0Jhckxpc3QpO1xyXG5cclxuICAgICAgICB0dXJuSW50b0Jhckxpc3QuYXBwZW5kKG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbVRpdGxlKHR1cm5JbnRvQmFyTGlzdCwgXCJUdXJuIGludG9cIikpO1xyXG5cclxuICAgICAgICB0dXJuSW50b0Jhckxpc3QuYXBwZW5kKG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcInR1cm5JbnRvT3B0aW9uVGV4dFwiLCB0dXJuSW50b0Jhckxpc3QsIEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuZ2V0SW5zdGFuY2UoKSwgQmxvY2tPcGVyYXRpb25zU2VydmljZS5CTE9DS19PUEVSQVRJT05TLlRSQU5TRk9STV9CTE9DSywgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuUEFSQUdSQVBILCBTVkdJY29ucy5wYXJhZ3JhcGguaHRtbEVsZW1lbnQsIFwiVGV4dFwiLCBcIkN0cmwrU2hpZnQrRW50ZXJcIikpO1xyXG4gICAgICAgIHR1cm5JbnRvQmFyTGlzdC5hcHBlbmQobmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwidHVybkludG9PcHRpb25Ub2RvTGlzdFwiLCB0dXJuSW50b0Jhckxpc3QsIEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuZ2V0SW5zdGFuY2UoKSwgQmxvY2tPcGVyYXRpb25zU2VydmljZS5CTE9DS19PUEVSQVRJT05TLlRSQU5TRk9STV9CTE9DSywgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuQ0hFQ0tfTElTVCwgU1ZHSWNvbnMudG9kb19saXN0Lmh0bWxFbGVtZW50LCBcIlRvZG8gbGlzdFwiLCBcIkN0cmwrMVwiKSk7XHJcbiAgICAgICAgdHVybkludG9CYXJMaXN0LmFwcGVuZChuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW0oXCJ0dXJuSW50b09wdGlvbkJ1bGxldGVkTGlzdFwiLCB0dXJuSW50b0Jhckxpc3QsIEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuZ2V0SW5zdGFuY2UoKSwgQmxvY2tPcGVyYXRpb25zU2VydmljZS5CTE9DS19PUEVSQVRJT05TLlRSQU5TRk9STV9CTE9DSywgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuQlVMTEVURURfTElTVCwgU1ZHSWNvbnMuYl9saXN0Lmh0bWxFbGVtZW50LCBcIkJ1bGxldGVkIGxpc3RcIiwgXCJDdHJsKy5cIikpO1xyXG4gICAgICAgIHR1cm5JbnRvQmFyTGlzdC5hcHBlbmQobmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwidHVybkludG9PcHRpb25OdW1iZXJlZExpc3RcIiwgdHVybkludG9CYXJMaXN0LCBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLmdldEluc3RhbmNlKCksIEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuQkxPQ0tfT1BFUkFUSU9OUy5UUkFOU0ZPUk1fQkxPQ0ssIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLk5VTUJFUkVEX0xJU1QsIFNWR0ljb25zLm5fbGlzdC5odG1sRWxlbWVudCwgXCJOdW1iZXJlZCBsaXN0XCIsIFwiQ3RybCsvXCIpKTtcclxuICAgICAgICB0dXJuSW50b0Jhckxpc3QuYXBwZW5kKG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcInR1cm5JbnRvT3B0aW9uQmxvY2tDb2RlXCIsIHR1cm5JbnRvQmFyTGlzdCwgQmxvY2tPcGVyYXRpb25zU2VydmljZS5nZXRJbnN0YW5jZSgpLCBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLkJMT0NLX09QRVJBVElPTlMuVFJBTlNGT1JNX0JMT0NLLCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5DT0RFLCBTVkdJY29ucy5jb2RlLmh0bWxFbGVtZW50LCBcIkJsb2NrIGNvZGVcIikpO1xyXG4gICAgICAgIHR1cm5JbnRvQmFyTGlzdC5hcHBlbmQobmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwidHVybkludG9PcHRpb25RdW90ZVwiLCB0dXJuSW50b0Jhckxpc3QsIEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuZ2V0SW5zdGFuY2UoKSwgQmxvY2tPcGVyYXRpb25zU2VydmljZS5CTE9DS19PUEVSQVRJT05TLlRSQU5TRk9STV9CTE9DSywgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuUVVPVEUsIFNWR0ljb25zLnF1b3RlLmh0bWxFbGVtZW50LCBcIlF1b3RlXCIpKTtcclxuICAgICAgICB0dXJuSW50b0Jhckxpc3QuYXBwZW5kKG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcInR1cm5JbnRvT3B0aW9uSGVhZGluZzFcIiwgdHVybkludG9CYXJMaXN0LCBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLmdldEluc3RhbmNlKCksIEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuQkxPQ0tfT1BFUkFUSU9OUy5UUkFOU0ZPUk1fQkxPQ0ssIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl8xLCBTVkdJY29ucy5oZWFkMS5odG1sRWxlbWVudCwgXCJIZWFkaW5nIDFcIiwgXCJDdHJsK0FsdCsxXCIpKTtcclxuICAgICAgICB0dXJuSW50b0Jhckxpc3QuYXBwZW5kKG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcInR1cm5JbnRvT3B0aW9uSGVhZGluZzJcIiwgdHVybkludG9CYXJMaXN0LCBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLmdldEluc3RhbmNlKCksIEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuQkxPQ0tfT1BFUkFUSU9OUy5UUkFOU0ZPUk1fQkxPQ0ssIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl8yLCBTVkdJY29ucy5oZWFkMi5odG1sRWxlbWVudCwgXCJIZWFkaW5nIDJcIiwgXCJDdHJsK0FsdCsyXCIpKTtcclxuICAgICAgICB0dXJuSW50b0Jhckxpc3QuYXBwZW5kKG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcInR1cm5JbnRvT3B0aW9uSGVhZGluZzNcIiwgdHVybkludG9CYXJMaXN0LCBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLmdldEluc3RhbmNlKCksIEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuQkxPQ0tfT1BFUkFUSU9OUy5UUkFOU0ZPUk1fQkxPQ0ssIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl8zLCBTVkdJY29ucy5oZWFkMy5odG1sRWxlbWVudCwgXCJIZWFkaW5nIDNcIiwgXCJDdHJsK0FsdCszXCIpKTtcclxuICAgICAgICB0dXJuSW50b0Jhckxpc3QuYXBwZW5kKG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcInR1cm5JbnRvT3B0aW9uSGVhZGluZzRcIiwgdHVybkludG9CYXJMaXN0LCBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLmdldEluc3RhbmNlKCksIEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuQkxPQ0tfT1BFUkFUSU9OUy5UUkFOU0ZPUk1fQkxPQ0ssIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl80LCBTVkdJY29ucy5oZWFkNC5odG1sRWxlbWVudCwgXCJIZWFkaW5nIDRcIiwgXCJDdHJsK0FsdCs0XCIpKTtcclxuICAgICAgICB0dXJuSW50b0Jhckxpc3QuYXBwZW5kKG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcInR1cm5JbnRvT3B0aW9uSGVhZGluZzVcIiwgdHVybkludG9CYXJMaXN0LCBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLmdldEluc3RhbmNlKCksIEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuQkxPQ0tfT1BFUkFUSU9OUy5UUkFOU0ZPUk1fQkxPQ0ssIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl81LCBTVkdJY29ucy5oZWFkNS5odG1sRWxlbWVudCwgXCJIZWFkaW5nIDVcIiwgXCJDdHJsK0FsdCs1XCIpKTtcclxuICAgICAgICB0dXJuSW50b0Jhckxpc3QuYXBwZW5kKG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcInR1cm5JbnRvT3B0aW9uSGVhZGluZzZcIiwgdHVybkludG9CYXJMaXN0LCBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLmdldEluc3RhbmNlKCksIEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuQkxPQ0tfT1BFUkFUSU9OUy5UUkFOU0ZPUk1fQkxPQ0ssIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl82LCBTVkdJY29ucy5oZWFkNi5odG1sRWxlbWVudCwgXCJIZWFkaW5nIDZcIiwgXCJDdHJsK0FsdCs2XCIpKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHR1cm5JbnRvRHJvcGRvd247XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIHNlcGFyYXRvcigpOiBGbG9hdGluZ1Rvb2xiYXJTZXBhcmF0b3Ige1xyXG4gICAgICAgIHJldHVybiBuZXcgRmxvYXRpbmdUb29sYmFyU2VwYXJhdG9yKCk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGdyb3VwQnV0dG9uKCk6IEdyb3VwQnV0dG9uIHtcclxuXHJcbiAgICAgICAgY29uc3QgZ3JvdXBCdXR0b24gPSBuZXcgR3JvdXBCdXR0b24oKTtcclxuXHJcbiAgICAgICAgbmV3IEdyb3VwZWRCdXR0b24oVGV4dE9wZXJhdGlvblNlcnZpY2UuZ2V0SW5zdGFuY2UoKSwgVGV4dE9wZXJhdGlvblNlcnZpY2UuUVVFUllfVEVYVF9PUEVSQVRJT05TLkNSRUFURV9MSU5LLCBcIkxpbmtcIiwgXCJpY29uLW1hdGVyaWFsLWxpbmtcIikuZG9jdW1lbnRBcHBlbmRUbyhncm91cEJ1dHRvbi5odG1sRWxlbWVudCk7XHJcbiAgICAgICAgbmV3IEdyb3VwZWRCdXR0b24oVGV4dE9wZXJhdGlvblNlcnZpY2UuZ2V0SW5zdGFuY2UoKSwgXCJib2xkXCIsIFwiQm9sZFwiLCBcImljb24td29yZHByZXNzLWJvbGRcIikuZG9jdW1lbnRBcHBlbmRUbyhncm91cEJ1dHRvbi5odG1sRWxlbWVudCk7XHJcbiAgICAgICAgbmV3IEdyb3VwZWRCdXR0b24oVGV4dE9wZXJhdGlvblNlcnZpY2UuZ2V0SW5zdGFuY2UoKSwgXCJpdGFsaWNcIiwgXCJJdGFsaWNcIiwgXCJpY29uLW1hdGVyaWFsLWl0YWxpY1wiKS5kb2N1bWVudEFwcGVuZFRvKGdyb3VwQnV0dG9uLmh0bWxFbGVtZW50KTtcclxuICAgICAgICBuZXcgR3JvdXBlZEJ1dHRvbihUZXh0T3BlcmF0aW9uU2VydmljZS5nZXRJbnN0YW5jZSgpLCBUZXh0T3BlcmF0aW9uU2VydmljZS5RVUVSWV9URVhUX09QRVJBVElPTlMuVU5ERVJMSU5FLCBcIlVuZGVybGluZVwiLCBcImljb24tbWF0ZXJpYWwtdW5kZXJsaW5lXCIpLmRvY3VtZW50QXBwZW5kVG8oZ3JvdXBCdXR0b24uaHRtbEVsZW1lbnQpO1xyXG4gICAgICAgIG5ldyBHcm91cGVkQnV0dG9uKFRleHRPcGVyYXRpb25TZXJ2aWNlLmdldEluc3RhbmNlKCksIFRleHRPcGVyYXRpb25TZXJ2aWNlLlFVRVJZX1RFWFRfT1BFUkFUSU9OUy5JTkxJTkVfQ09ERSwgXCJDb2RlXCIsIFwiaWNvbi1tYXRlcmlhbC1jb2RlLWlubGluZVwiKS5kb2N1bWVudEFwcGVuZFRvKGdyb3VwQnV0dG9uLmh0bWxFbGVtZW50KTtcclxuICAgICAgICBuZXcgR3JvdXBlZEJ1dHRvbihUZXh0T3BlcmF0aW9uU2VydmljZS5nZXRJbnN0YW5jZSgpLCBcInN0cmlrZVRocm91Z2hcIiwgXCJTdHJpa2UtdGhyb3VnaFwiLCBcImljb24td29yZHByZXNzLXN0cmlrZS10aHJvdWdoXCIpLmRvY3VtZW50QXBwZW5kVG8oZ3JvdXBCdXR0b24uaHRtbEVsZW1lbnQpO1xyXG4gICAgICAgIC8vIG5ldyBHcm91cGVkQnV0dG9uKFRleHRPcGVyYXRpb25TZXJ2aWNlLmdldEluc3RhbmNlKCksIFwiY29weVwiLCBcIkVxdWF0aW9uXCIsIFwiaWNvbi13b3JkcHJlc3MtZXF1YXRpb24tbWFya1wiKS5kb2N1bWVudEFwcGVuZFRvKGdyb3VwQnV0dG9uLmh0bWxFbGVtZW50KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGdyb3VwQnV0dG9uO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBjb2xvckRyb3Bkb3duKCk6IERyb3Bkb3duTWVudSB7XHJcblxyXG4gICAgICAgIGNvbnN0IGNvbG9yRHJvcGRvd25MaXN0ID0gbmV3IERyb3Bkb3duTWVudUxpc3QoXCJjb2xvclRleHRPcHRpb25TZWxlY3RcIik7XHJcbiAgICAgICAgY29uc3QgY29sb3JCdXR0b24gPSBuZXcgRHJvcGRvd25NZW51QnV0dG9uKFwiY29sb3JUZXh0QnV0dG9uXCIsIG5ldyBDb2xvckljb24oXCIjRkFGNEQxXCIpLmh0bWxFbGVtZW50LCBjb2xvckRyb3Bkb3duTGlzdCk7XHJcbiAgICAgICAgY29uc3QgY29sb3JEcm9wZG93biA9IG5ldyBEcm9wZG93bk1lbnUoY29sb3JCdXR0b24sIGNvbG9yRHJvcGRvd25MaXN0KTtcclxuXHJcbiAgICAgICAgY29sb3JEcm9wZG93bkxpc3QuYXBwZW5kKG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbVRpdGxlKGNvbG9yRHJvcGRvd25MaXN0LCBcIkJhY2tncm91bmRcIikpO1xyXG5cclxuICAgICAgICBjb25zdCB0ZXh0T3BlcmF0aW9uU2VydmljZSA9IFRleHRPcGVyYXRpb25TZXJ2aWNlLmdldEluc3RhbmNlKCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgY29sb3JEcm9wZG93bkxpc3QuYXBwZW5kKG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcImJhY2tncm91bmRPcHRpb25SZWRcIiwgY29sb3JEcm9wZG93bkxpc3QsIHRleHRPcGVyYXRpb25TZXJ2aWNlLCBUZXh0T3BlcmF0aW9uU2VydmljZS5RVUVSWV9URVhUX09QRVJBVElPTlMuSElMSVRFX0NPTE9SLCBcIiNGRERFREVcIiwgbmV3IENvbG9ySWNvbihcIiNGRERFREVcIikuaHRtbEVsZW1lbnQsIFwiUmVkXCIpKTtcclxuICAgICAgICBjb2xvckRyb3Bkb3duTGlzdC5hcHBlbmQobmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwiYmFja2dyb3VuZE9wdGlvbkdyZWVuXCIsIGNvbG9yRHJvcGRvd25MaXN0LCB0ZXh0T3BlcmF0aW9uU2VydmljZSwgVGV4dE9wZXJhdGlvblNlcnZpY2UuUVVFUllfVEVYVF9PUEVSQVRJT05TLkhJTElURV9DT0xPUiwgXCIjRDdGN0RDXCIsIG5ldyBDb2xvckljb24oXCIjRDdGN0RDXCIpLmh0bWxFbGVtZW50LCBcIkdyZWVuXCIpKTtcclxuICAgICAgICBjb2xvckRyb3Bkb3duTGlzdC5hcHBlbmQobmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwiYmFja2dyb3VuZE9wdGlvbkJsdWVcIiwgY29sb3JEcm9wZG93bkxpc3QsIHRleHRPcGVyYXRpb25TZXJ2aWNlLCBUZXh0T3BlcmF0aW9uU2VydmljZS5RVUVSWV9URVhUX09QRVJBVElPTlMuSElMSVRFX0NPTE9SLCBcIiNEOUVERjZcIiwgbmV3IENvbG9ySWNvbihcIiNEOUVERjZcIikuaHRtbEVsZW1lbnQsIFwiQmx1ZVwiKSk7XHJcbiAgICAgICAgY29sb3JEcm9wZG93bkxpc3QuYXBwZW5kKG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcImJhY2tncm91bmRPcHRpb25ZZWxsb3dcIiwgY29sb3JEcm9wZG93bkxpc3QsIHRleHRPcGVyYXRpb25TZXJ2aWNlLCBUZXh0T3BlcmF0aW9uU2VydmljZS5RVUVSWV9URVhUX09QRVJBVElPTlMuSElMSVRFX0NPTE9SLCBcIiNGQUY0RDFcIiwgbmV3IENvbG9ySWNvbihcIiNGQUY0RDFcIikuaHRtbEVsZW1lbnQsIFwiWWVsbG93XCIpKTtcclxuICAgICAgICBjb2xvckRyb3Bkb3duTGlzdC5hcHBlbmQobmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwiYmFja2dyb3VuZE9wdGlvbkdyZXlcIiwgY29sb3JEcm9wZG93bkxpc3QsIHRleHRPcGVyYXRpb25TZXJ2aWNlLCBUZXh0T3BlcmF0aW9uU2VydmljZS5RVUVSWV9URVhUX09QRVJBVElPTlMuSElMSVRFX0NPTE9SLCBcIiNFMUUwRTBcIiwgbmV3IENvbG9ySWNvbihcIiNFMUUwRTBcIikuaHRtbEVsZW1lbnQsIFwiR3JleVwiKSk7XHJcbiAgICAgICAgY29sb3JEcm9wZG93bkxpc3QuYXBwZW5kKG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcImJhY2tncm91bmRPcHRpb25Ob25lXCIsIGNvbG9yRHJvcGRvd25MaXN0LCB0ZXh0T3BlcmF0aW9uU2VydmljZSwgVGV4dE9wZXJhdGlvblNlcnZpY2UuUVVFUllfVEVYVF9PUEVSQVRJT05TLkhJTElURV9DT0xPUiwgXCJ0cmFuc3BhcmVudFwiLCBuZXcgQ29sb3JJY29uKFwidHJhbnNwYXJlbnRcIikuaHRtbEVsZW1lbnQsIFwiTm9uZVwiKSk7XHJcblxyXG4gICAgICAgIFxyXG4gICAgICAgIGNvbG9yRHJvcGRvd25MaXN0LmFwcGVuZChuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW1UaXRsZShjb2xvckRyb3Bkb3duTGlzdCwgXCJDb2xvclwiKSk7XHJcblxyXG4gICAgICAgIGNvbG9yRHJvcGRvd25MaXN0LmFwcGVuZChuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW0oXCJjb2xvck9wdGlvblJlZFwiLGNvbG9yRHJvcGRvd25MaXN0LCB0ZXh0T3BlcmF0aW9uU2VydmljZSwgVGV4dE9wZXJhdGlvblNlcnZpY2UuUVVFUllfVEVYVF9PUEVSQVRJT05TLkZPUkVfQ09MT1IsIFwiI0Q0NEM0N1wiLCBuZXcgU1ZHSWNvbihcImljb24tbWF0ZXJpYWwtZm9ybWF0XCIsIFwiMS4yNXJlbVwiLCBcIjEuMjVyZW1cIikuaHRtbEVsZW1lbnQsIFwiUmVkXCIpKTtcclxuICAgICAgICBjb2xvckRyb3Bkb3duTGlzdC5hcHBlbmQobmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwiY29sb3JPcHRpb25HcmVlblwiLCBjb2xvckRyb3Bkb3duTGlzdCwgdGV4dE9wZXJhdGlvblNlcnZpY2UsIFRleHRPcGVyYXRpb25TZXJ2aWNlLlFVRVJZX1RFWFRfT1BFUkFUSU9OUy5GT1JFX0NPTE9SLCBcIiM0NDgzNjFcIiwgbmV3IFNWR0ljb24oXCJpY29uLW1hdGVyaWFsLWZvcm1hdFwiLCBcIjEuMjVyZW1cIiwgXCIxLjI1cmVtXCIpLmh0bWxFbGVtZW50LCBcIkdyZWVuXCIpKTtcclxuICAgICAgICBjb2xvckRyb3Bkb3duTGlzdC5hcHBlbmQobmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwiY29sb3JPcHRpb25CbHVlXCIsIGNvbG9yRHJvcGRvd25MaXN0LCB0ZXh0T3BlcmF0aW9uU2VydmljZSwgVGV4dE9wZXJhdGlvblNlcnZpY2UuUVVFUllfVEVYVF9PUEVSQVRJT05TLkZPUkVfQ09MT1IsIFwiIzMzN0VBOVwiLCBuZXcgU1ZHSWNvbihcImljb24tbWF0ZXJpYWwtZm9ybWF0XCIsIFwiMS4yNXJlbVwiLCBcIjEuMjVyZW1cIikuaHRtbEVsZW1lbnQsIFwiQmx1ZVwiKSk7XHJcbiAgICAgICAgY29sb3JEcm9wZG93bkxpc3QuYXBwZW5kKG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcImNvbG9yT3B0aW9uWWVsbG93XCIsIGNvbG9yRHJvcGRvd25MaXN0LCB0ZXh0T3BlcmF0aW9uU2VydmljZSwgVGV4dE9wZXJhdGlvblNlcnZpY2UuUVVFUllfVEVYVF9PUEVSQVRJT05TLkZPUkVfQ09MT1IsIFwiI0NCOTEyRlwiLCBuZXcgU1ZHSWNvbihcImljb24tbWF0ZXJpYWwtZm9ybWF0XCIsIFwiMS4yNXJlbVwiLCBcIjEuMjVyZW1cIikuaHRtbEVsZW1lbnQsIFwiWWVsbG93XCIpKTtcclxuICAgICAgICBjb2xvckRyb3Bkb3duTGlzdC5hcHBlbmQobmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwiY29sb3JPcHRpb25HcmV5XCIsIGNvbG9yRHJvcGRvd25MaXN0LCB0ZXh0T3BlcmF0aW9uU2VydmljZSwgVGV4dE9wZXJhdGlvblNlcnZpY2UuUVVFUllfVEVYVF9PUEVSQVRJT05TLkZPUkVfQ09MT1IsIFwiIzc4Nzc3NFwiLCBuZXcgU1ZHSWNvbihcImljb24tbWF0ZXJpYWwtZm9ybWF0XCIsIFwiMS4yNXJlbVwiLCBcIjEuMjVyZW1cIikuaHRtbEVsZW1lbnQsIFwiR3JleVwiKSk7XHJcbiAgICAgICAgY29sb3JEcm9wZG93bkxpc3QuYXBwZW5kKG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcImNvbG9yT3B0aW9uTm9uZVwiLCBjb2xvckRyb3Bkb3duTGlzdCwgdGV4dE9wZXJhdGlvblNlcnZpY2UsIFRleHRPcGVyYXRpb25TZXJ2aWNlLlFVRVJZX1RFWFRfT1BFUkFUSU9OUy5GT1JFX0NPTE9SLCBcImluaXRpYWxcIiwgbmV3IFNWR0ljb24oXCJpY29uLW1hdGVyaWFsLWZvcm1hdFwiLCBcIjEuMjVyZW1cIiwgXCIxLjI1cmVtXCIpLmh0bWxFbGVtZW50LCBcIk5vbmVcIikpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIHJldHVybiBjb2xvckRyb3Bkb3duO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBtb3JlT3B0aW9uc0Ryb3Bkb3duKCk6IERyb3Bkb3duTWVudSB7XHJcblxyXG4gICAgICAgIGNvbnN0IGljb24gPSBuZXcgU1ZHSWNvbihcImljb24tbWF0ZXJpYWwtbW9yZVwiLCBcIjEuMjVyZW1cIiwgXCIxLjI1cmVtXCIpO1xyXG5cclxuICAgICAgICBjb25zdCBtb3JlT3B0aW9uc0xpc3QgPSBuZXcgRHJvcGRvd25NZW51TGlzdChcIm1vcmVUZXh0T3B0aW9uU2VsZWN0XCIpO1xyXG4gICAgICAgIGNvbnN0IG1vcmVPcHRpb25zQnV0dG9uID0gbmV3IERyb3Bkb3duTWVudUJ1dHRvbihcIm1vcmVUZXh0T3B0aW9uQnV0dG9uXCIsIGljb24uaHRtbEVsZW1lbnQsIG1vcmVPcHRpb25zTGlzdCwgZmFsc2UpO1xyXG4gICAgICAgIGNvbnN0IG1vcmVPcHRpb25zRHJvcGRvd24gPSBuZXcgRHJvcGRvd25NZW51KG1vcmVPcHRpb25zQnV0dG9uLCBtb3JlT3B0aW9uc0xpc3QpO1xyXG5cclxuICAgICAgICBtb3JlT3B0aW9uc0xpc3QuYXBwZW5kKG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbVRpdGxlKG1vcmVPcHRpb25zTGlzdCwgXCJNb3JlIG9wdGlvbnNcIikpO1xyXG5cclxuICAgICAgICBtb3JlT3B0aW9uc0xpc3QuYXBwZW5kKG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcImNvcHlPcHRpb25cIiwgbW9yZU9wdGlvbnNMaXN0LCBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLmdldEluc3RhbmNlKCksIEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuQkxPQ0tfT1BFUkFUSU9OUy5DT1BZLCBudWxsLCBTVkdJY29ucy5jb3B5Lmh0bWxFbGVtZW50LCBcIkNvcHlcIiwgXCJDdHJsK0NcIikpO1xyXG4gICAgICAgIG1vcmVPcHRpb25zTGlzdC5hcHBlbmQobmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwiY3V0T3B0aW9uXCIsIG1vcmVPcHRpb25zTGlzdCwgQmxvY2tPcGVyYXRpb25zU2VydmljZS5nZXRJbnN0YW5jZSgpLCBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLkJMT0NLX09QRVJBVElPTlMuQ1VULCBudWxsLCBTVkdJY29ucy5jdXQuaHRtbEVsZW1lbnQsIFwiQ3V0XCIsIFwiQ3RybCtYXCIpKTtcclxuICAgICAgICBtb3JlT3B0aW9uc0xpc3QuYXBwZW5kKG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcInBhc3RlT3B0aW9uXCIsIG1vcmVPcHRpb25zTGlzdCwgQmxvY2tPcGVyYXRpb25zU2VydmljZS5nZXRJbnN0YW5jZSgpLCBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLkJMT0NLX09QRVJBVElPTlMuUEFTVEUsIG51bGwsIFNWR0ljb25zLnBhc3RlLmh0bWxFbGVtZW50LCBcIlJlcGxhY2VcIiwgXCJDdHJsK1ZcIikpO1xyXG4gICAgICAgIG1vcmVPcHRpb25zTGlzdC5hcHBlbmQobmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwiZHVwbGljYXRlT3B0aW9uXCIsIG1vcmVPcHRpb25zTGlzdCwgQmxvY2tPcGVyYXRpb25zU2VydmljZS5nZXRJbnN0YW5jZSgpLCBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLkJMT0NLX09QRVJBVElPTlMuRFVQTElDQVRFLCBudWxsLCBTVkdJY29ucy5kdXBsaWNhdGUuaHRtbEVsZW1lbnQsIFwiQ2xvbmUgQmxvY2tcIiwgXCJDdHJsK0RcIikpO1xyXG4gICAgICAgIG1vcmVPcHRpb25zTGlzdC5hcHBlbmQobmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwicmVzZXRPcHRpb25cIiwgbW9yZU9wdGlvbnNMaXN0LCBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLmdldEluc3RhbmNlKCksIEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuQkxPQ0tfT1BFUkFUSU9OUy5SRU1PVkVfRk9STUFULCBudWxsLCBTVkdJY29ucy5lcmFzZXIuaHRtbEVsZW1lbnQsIFwiUmVzZXQgU3R5bGVcIiwgXCJDdHJsK1xcXFxcIikpO1xyXG4gICAgICAgIG1vcmVPcHRpb25zTGlzdC5hcHBlbmQobmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwiZGVsZXRlT3B0aW9uXCIsIG1vcmVPcHRpb25zTGlzdCwgQmxvY2tPcGVyYXRpb25zU2VydmljZS5nZXRJbnN0YW5jZSgpLCBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLkJMT0NLX09QRVJBVElPTlMuREVMRVRFLCBudWxsLCBTVkdJY29ucy5kZWxldGUuaHRtbEVsZW1lbnQsIFwiRGVsZXRlIEJsb2NrXCIsIFwiU2hpZnQrRGVsXCIpKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIG1vcmVPcHRpb25zRHJvcGRvd247XHJcbiAgICB9XHJcbn1cclxuXHJcbmNvbnN0IFNWR0ljb25zOiBhbnkgPSB7XHJcblxyXG4gICAgcGFyYWdyYXBoOiBuZXcgU1ZHSWNvbihcImljb24tbWF0ZXJpYWwtZm9ybWF0XCIsIFwiMS4yNXJlbVwiLCBcIjEuMjVyZW1cIiksXHJcbiAgICB0b2RvX2xpc3Q6IG5ldyBTVkdJY29uKFwiaWNvbi1tYXRlcmlhbC1jaGVjay1saXN0LTJcIiwgXCIxLjI1cmVtXCIsIFwiMS4yNXJlbVwiKSxcclxuICAgIGJfbGlzdDogbmV3IFNWR0ljb24oXCJpY29uLXdvcmRwcmVzcy1idWxsZXRlZC1saXN0XCIsIFwiMS4yNXJlbVwiLCBcIjEuMjVyZW1cIiksXHJcbiAgICBuX2xpc3Q6IG5ldyBTVkdJY29uKFwiaWNvbi13b3JkcHJlc3MtbnVtYmVyZWQtbGlzdFwiLCBcIjEuMjVyZW1cIiwgXCIxLjI1cmVtXCIpLFxyXG4gICAgY29kZTogbmV3IFNWR0ljb24oXCJpY29uLXdvcmRwcmVzcy1jb2RlLW1hcmtcIiwgXCIxLjI1cmVtXCIsIFwiMS4yNXJlbVwiKSxcclxuICAgIHF1b3RlOiBuZXcgU1ZHSWNvbihcImljb24td29yZHByZXNzLXF1b3RlXCIsIFwiMS4yNXJlbVwiLCBcIjEuMjVyZW1cIiksXHJcbiAgICBoZWFkMTogbmV3IFNWR0ljb24oXCJpY29uLWp1bGlhLWhlYWQtMVwiLCBcIjEuMjVyZW1cIiwgXCIxLjI1cmVtXCIpLFxyXG4gICAgaGVhZDI6IG5ldyBTVkdJY29uKFwiaWNvbi1qdWxpYS1oZWFkLTJcIiwgXCIxLjI1cmVtXCIsIFwiMS4yNXJlbVwiKSxcclxuICAgIGhlYWQzOiBuZXcgU1ZHSWNvbihcImljb24tanVsaWEtaGVhZC0zXCIsIFwiMS4yNXJlbVwiLCBcIjEuMjVyZW1cIiksXHJcbiAgICBoZWFkNDogbmV3IFNWR0ljb24oXCJpY29uLWp1bGlhLWhlYWQtNFwiLCBcIjEuMjVyZW1cIiwgXCIxLjI1cmVtXCIpLFxyXG4gICAgaGVhZDU6IG5ldyBTVkdJY29uKFwiaWNvbi1qdWxpYS1oZWFkLTVcIiwgXCIxLjI1cmVtXCIsIFwiMS4yNXJlbVwiKSxcclxuICAgIGhlYWQ2OiBuZXcgU1ZHSWNvbihcImljb24tanVsaWEtaGVhZC02XCIsIFwiMS4yNXJlbVwiLCBcIjEuMjVyZW1cIiksXHJcbiAgICBkdXBsaWNhdGU6IG5ldyBTVkdJY29uKFwiaWNvbi1tYXRlcmlhbC1kdXBsaWNhdGVcIiwgXCIxLjI1cmVtXCIsIFwiMS4yNXJlbVwiKSxcclxuICAgIGRlbGV0ZTogbmV3IFNWR0ljb24oXCJpY29uLW1hdGVyaWFsLXRyYXNoXCIsIFwiMS4yNXJlbVwiLCBcIjEuMjVyZW1cIiksXHJcbiAgICBlcmFzZXI6IG5ldyBTVkdJY29uKFwiaWNvbi1tYXRlcmlhbC1jbGVhclwiLCBcIjEuMjVyZW1cIiwgXCIxLjI1cmVtXCIpLFxyXG4gICAgY29weTogbmV3IFNWR0ljb24oXCJpY29uLW1hdGVyaWFsLWNvcHlcIiwgXCIxLjI1cmVtXCIsIFwiMS4yNXJlbVwiKSxcclxuICAgIGN1dDogbmV3IFNWR0ljb24oXCJpY29uLW1hdGVyaWFsLWN1dFwiLCBcIjEuMjVyZW1cIiwgXCIxLjI1cmVtXCIpLFxyXG4gICAgcGFzdGU6IG5ldyBTVkdJY29uKFwiaWNvbi1tYXRlcmlhbC1wYXN0ZVwiLCBcIjEuMjVyZW1cIiwgXCIxLjI1cmVtXCIpXHJcbn0iLCJpbXBvcnQgeyBCYXNlVUlDb21wb25lbnQgfSBmcm9tIFwiLi4vY29tbW9uL0Jhc2VVSUNvbXBvbmVudFwiO1xyXG5pbXBvcnQgeyBTVkdJY29uIH0gZnJvbSBcIi4uL2NvbW1vbi9TVkdJY29uXCI7XHJcbmltcG9ydCB7IEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UgfSBmcm9tIFwiLi4vLi4vc2VydmljZXMvYmxvY2stb3BlcmF0aW9ucy9CbG9ja09wZXJhdGlvbnNTZXJ2aWNlXCI7XHJcbmltcG9ydCB7IElCbG9ja09wZXJhdGlvbnNTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL3NlcnZpY2VzL2Jsb2NrLW9wZXJhdGlvbnMvSUJsb2NrT3BlcmF0aW9uc1NlcnZpY2VcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBBZGRCbG9ja0J1dHRvbiBleHRlbmRzIEJhc2VVSUNvbXBvbmVudCB7XHJcblxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBibG9ja09wZXJhdGlvbnNTZXJ2aWNlOiBJQmxvY2tPcGVyYXRpb25zU2VydmljZTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihibG9ja09wZXJhdGlvbnNTZXJ2aWNlOiBJQmxvY2tPcGVyYXRpb25zU2VydmljZSkge1xyXG5cclxuICAgICAgICBzdXBlcih7fSk7XHJcblxyXG4gICAgICAgIHRoaXMuYmxvY2tPcGVyYXRpb25zU2VydmljZSA9IGJsb2NrT3BlcmF0aW9uc1NlcnZpY2U7XHJcbiAgICAgICAgdGhpcy5hdHRhY2hFdmVudHMoKTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0KCk6IEhUTUxFbGVtZW50IHtcclxuXHJcbiAgICAgICAgY29uc3QgaHRtbEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIpO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LnRpdGxlID0gXCJBZGQgYSBuZXcgYmxvY2tcIjtcclxuXHJcbiAgICAgICAgaHRtbEVsZW1lbnQuY2xhc3NMaXN0LmFkZChcImFkZC1ibG9ja1wiLCBcImJsb2NrLW9wZXJhdGlvblwiKTtcclxuXHJcbiAgICAgICAgY29uc3Qgc3ZnID0gbmV3IFNWR0ljb24oXCJpY29uLWFkZC1ibG9ja1wiLCBcIjEuNXJlbVwiLCBcIjEuNXJlbVwiKTtcclxuXHJcbiAgICAgICAgaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQoc3ZnLmh0bWxFbGVtZW50KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGh0bWxFbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIGF0dGFjaEV2ZW50cygpOiB2b2lkIHtcclxuXHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuZXhlY0NvbW1hbmQoQmxvY2tPcGVyYXRpb25zU2VydmljZS5CTE9DS19PUEVSQVRJT05TLkNSRUFURV9ERUZBVUxUX0JMT0NLLCBmYWxzZSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBCYXNlVUlDb21wb25lbnQgfSBmcm9tIFwiLi4vY29tbW9uL0Jhc2VVSUNvbXBvbmVudFwiO1xyXG5pbXBvcnQgeyBBZGRCbG9ja0J1dHRvbiB9IGZyb20gXCIuL0FkZEJsb2NrQnV0dG9uXCI7XHJcbmltcG9ydCB7IElCbG9ja09wZXJhdGlvbnNTZXJ2aWNlIH0gZnJvbSBcIkAvc2VydmljZXMvYmxvY2stb3BlcmF0aW9ucy9JQmxvY2tPcGVyYXRpb25zU2VydmljZVwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIEFkZEJsb2NrIGV4dGVuZHMgQmFzZVVJQ29tcG9uZW50IHtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihibG9ja09wZXJhdGlvblNlcnZpY2U6IElCbG9ja09wZXJhdGlvbnNTZXJ2aWNlKSB7XHJcblxyXG4gICAgICAgIHN1cGVyKHtcclxuICAgICAgICAgICAgYmxvY2tPcGVyYXRpb25TZXJ2aWNlOiBibG9ja09wZXJhdGlvblNlcnZpY2VcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0KCk6IEhUTUxFbGVtZW50IHtcclxuXHJcbiAgICAgICAgY29uc3QgaHRtbEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG5cclxuICAgICAgICBodG1sRWxlbWVudC5jbGFzc0xpc3QuYWRkKFwiYWRkLWJsb2NrLXdyYXBwZXJcIik7XHJcblxyXG4gICAgICAgIGNvbnN0IGJ1dHRvbiA9IG5ldyBBZGRCbG9ja0J1dHRvbih0aGlzLnByb3BzLmJsb2NrT3BlcmF0aW9uU2VydmljZSk7XHJcblxyXG4gICAgICAgIGh0bWxFbGVtZW50LmFwcGVuZENoaWxkKGJ1dHRvbi5odG1sRWxlbWVudCk7XHJcblxyXG4gICAgICAgIHJldHVybiBodG1sRWxlbWVudDtcclxuICAgIH1cclxufSIsImltcG9ydCB7IElFbGVtZW50RmFjdG9yeVNlcnZpY2UgfSBmcm9tIFwiQC9zZXJ2aWNlcy9lbGVtZW50LWZhY3RvcnkvSUVsZW1lbnRGYWN0b3J5U2VydmljZVwiO1xyXG5pbXBvcnQgeyBFbGVtZW50RmFjdG9yeVNlcnZpY2UgfSBmcm9tIFwiQC9zZXJ2aWNlcy9lbGVtZW50LWZhY3RvcnkvRWxlbWVudEZhY3RvcnlTZXJ2aWNlXCI7XHJcbmltcG9ydCB7IEJhc2VVSUNvbXBvbmVudCB9IGZyb20gXCIuLi9jb21tb24vQmFzZVVJQ29tcG9uZW50XCI7XHJcbmltcG9ydCB7IElCbG9ja09wZXJhdGlvbnNTZXJ2aWNlIH0gZnJvbSBcIkAvc2VydmljZXMvYmxvY2stb3BlcmF0aW9ucy9JQmxvY2tPcGVyYXRpb25zU2VydmljZVwiO1xyXG5pbXBvcnQgeyBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlIH0gZnJvbSBcIkAvc2VydmljZXMvYmxvY2stb3BlcmF0aW9ucy9CbG9ja09wZXJhdGlvbnNTZXJ2aWNlXCI7XHJcbmltcG9ydCB7IFF1aWNrTWVudSB9IGZyb20gXCIuLi9xdWljay1tZW51L1F1aWNrTWVudVwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIENvbnRlbnQgZXh0ZW5kcyBCYXNlVUlDb21wb25lbnQge1xyXG5cclxuICAgIGJsb2NrT3BlcmF0aW9uc1NlcnZpY2U6IElCbG9ja09wZXJhdGlvbnNTZXJ2aWNlO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIGVsZW1lbnRGYWN0b3J5U2VydmljZTogSUVsZW1lbnRGYWN0b3J5U2VydmljZSxcclxuICAgICAgICBibG9ja09wZXJhdGlvbnNTZXJ2aWNlOiBJQmxvY2tPcGVyYXRpb25zU2VydmljZSkge1xyXG5cclxuICAgICAgICBzdXBlcih7XHJcbiAgICAgICAgICAgIGVsZW1lbnRGYWN0b3J5U2VydmljZTogZWxlbWVudEZhY3RvcnlTZXJ2aWNlLFxyXG4gICAgICAgICAgICBibG9ja09wZXJhdGlvbnNTZXJ2aWNlOiBibG9ja09wZXJhdGlvbnNTZXJ2aWNlXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuYmxvY2tPcGVyYXRpb25zU2VydmljZSA9IGJsb2NrT3BlcmF0aW9uc1NlcnZpY2U7XHJcblxyXG4gICAgICAgIHRoaXMuYXR0YWNoRXZlbnQoKTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0KCk6IEhUTUxFbGVtZW50IHtcclxuXHJcbiAgICAgICAgY29uc3QgaHRtbEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJjb250ZW50XCIpO1xyXG5cclxuICAgICAgICBpZiAod2luZG93LmVkaXRvckNvbmZpZz8uaW5jbHVkZUZpcnN0UGFyYWdyYXBoIHx8IHRydWUpIHtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGJsb2NrUGFyYWdyYXBoID0gdGhpcy5wcm9wcy5lbGVtZW50RmFjdG9yeVNlcnZpY2UuY3JlYXRlKEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkJMT0NLX1BBUkFHUkFQSCk7XHJcblxyXG4gICAgICAgICAgICBodG1sRWxlbWVudC5hcHBlbmQoYmxvY2tQYXJhZ3JhcGgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGh0bWxFbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIGF0dGFjaEV2ZW50KCk6IHZvaWQge1xyXG5cclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiY29waWVkVGV4dFwiLCAoKSA9PiB7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBjb3B5RWxlbWVudEl0ZW0gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiI2NvcHlPcHRpb24gLnRleHQtb3B0aW9uIHNwYW5cIikgYXMgSFRNTFNwYW5FbGVtZW50O1xyXG5cclxuICAgICAgICAgICAgaWYgKGNvcHlFbGVtZW50SXRlbSkge1xyXG5cclxuICAgICAgICAgICAgICAgIGNvcHlFbGVtZW50SXRlbS50ZXh0Q29udGVudCA9IFwiQ29waWVkIVwiO1xyXG5cclxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvcHlFbGVtZW50SXRlbS50ZXh0Q29udGVudCA9IFwiQ29weVwiO1xyXG4gICAgICAgICAgICAgICAgfSwgMTUwMCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy9TaG9ydGN1dHNcclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCAoZXZlbnQpID0+IHtcclxuXHJcblxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgS2V5OiAke2V2ZW50LmtleX0sIENvZGU6ICR7ZXZlbnQuY29kZX0sIEN0cmw6ICR7ZXZlbnQuY3RybEtleX0sIEFsdDogJHtldmVudC5hbHRLZXl9LCBBbHRHcjogJHtldmVudC5rZXkgPT09ICdBbHRHcmFwaCd9LCBOdW1Mb2NrOiAke2V2ZW50LmdldE1vZGlmaWVyU3RhdGUoJ051bUxvY2snKX1gKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGlzTnVtUGFkID0gZXZlbnQuY29kZS5zdGFydHNXaXRoKFwiTnVtcGFkXCIpO1xyXG4gICAgICAgICAgICBjb25zdCBudW1Mb2NrT24gPSBldmVudC5nZXRNb2RpZmllclN0YXRlKFwiTnVtTG9ja1wiKTtcclxuXHJcbiAgICAgICAgICAgIGlmICgoZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5KSAmJiBldmVudC5zaGlmdEtleSAmJiAoZXZlbnQua2V5ID09PSBcIkVudGVyXCIpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBDb252ZXJ0IHRvIGNoZWNrIGxpc3RcclxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuYmxvY2tPcGVyYXRpb25zU2VydmljZS5leGVjQ29tbWFuZChCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLkJMT0NLX09QRVJBVElPTlMuVFJBTlNGT1JNX0JMT0NLLCBmYWxzZSwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuUEFSQUdSQVBIKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICgoZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5KSAmJiAhZXZlbnQuc2hpZnRLZXkgJiYgKGV2ZW50LmNvZGUgPT09IFwiRGlnaXQxXCIgfHwgZXZlbnQuY29kZSA9PT0gXCJOdW1wYWQxXCIpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBDb252ZXJ0IHRvIGNoZWNrIGxpc3RcclxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuYmxvY2tPcGVyYXRpb25zU2VydmljZS5leGVjQ29tbWFuZChCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLkJMT0NLX09QRVJBVElPTlMuVFJBTlNGT1JNX0JMT0NLLCBmYWxzZSwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuQ0hFQ0tfTElTVCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoKGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQubWV0YUtleSkgJiYgIWV2ZW50LnNoaWZ0S2V5ICYmIGV2ZW50LmtleSA9PT0gXCIuXCIpIHtcclxuICAgICAgICAgICAgICAgIC8vIENvbnZlcnQgdG8gYnVsbGV0ZWRcclxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuYmxvY2tPcGVyYXRpb25zU2VydmljZS5leGVjQ29tbWFuZChCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLkJMT0NLX09QRVJBVElPTlMuVFJBTlNGT1JNX0JMT0NLLCBmYWxzZSwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuQlVMTEVURURfTElTVCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoKGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQubWV0YUtleSkgJiYgIWV2ZW50LnNoaWZ0S2V5ICYmIChldmVudC5rZXkgPT09IFwiL1wiKSkge1xyXG4gICAgICAgICAgICAgICAgLy8gQ29udmVydCB0byBudW1iZXJlZFxyXG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ibG9ja09wZXJhdGlvbnNTZXJ2aWNlLmV4ZWNDb21tYW5kKEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuQkxPQ0tfT1BFUkFUSU9OUy5UUkFOU0ZPUk1fQkxPQ0ssIGZhbHNlLCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5OVU1CRVJFRF9MSVNUKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICgoZXZlbnQuY3RybEtleSAmJiBldmVudC5hbHRLZXkgJiYgKChldmVudC5jb2RlID09PSBcIkRpZ2l0MVwiKSB8fCAoaXNOdW1QYWQgJiYgbnVtTG9ja09uICYmIGV2ZW50LmNvZGUgPT09IFwiTnVtcGFkMVwiKSkpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBDb252ZXJ0IHRvIGgxXHJcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuZXhlY0NvbW1hbmQoQmxvY2tPcGVyYXRpb25zU2VydmljZS5CTE9DS19PUEVSQVRJT05TLlRSQU5TRk9STV9CTE9DSywgZmFsc2UsIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl8xKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmICgoZXZlbnQuY3RybEtleSAmJiBldmVudC5hbHRLZXkgJiYgKChldmVudC5jb2RlID09PSBcIkRpZ2l0MlwiKSB8fCAoaXNOdW1QYWQgJiYgbnVtTG9ja09uICYmIGV2ZW50LmNvZGUgPT09IFwiTnVtcGFkMlwiKSkpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBDb252ZXJ0IHRvIGgyXHJcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuZXhlY0NvbW1hbmQoQmxvY2tPcGVyYXRpb25zU2VydmljZS5CTE9DS19PUEVSQVRJT05TLlRSQU5TRk9STV9CTE9DSywgZmFsc2UsIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl8yKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICgoZXZlbnQuY3RybEtleSAmJiBldmVudC5hbHRLZXkgJiYgKChldmVudC5jb2RlID09PSBcIkRpZ2l0M1wiKSB8fCAoaXNOdW1QYWQgJiYgbnVtTG9ja09uICYmIGV2ZW50LmNvZGUgPT09IFwiTnVtcGFkM1wiKSkpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBDb252ZXJ0IHRvIGgzXHJcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuZXhlY0NvbW1hbmQoQmxvY2tPcGVyYXRpb25zU2VydmljZS5CTE9DS19PUEVSQVRJT05TLlRSQU5TRk9STV9CTE9DSywgZmFsc2UsIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl8zKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICgoZXZlbnQuY3RybEtleSAmJiBldmVudC5hbHRLZXkgJiYgKChldmVudC5jb2RlID09PSBcIkRpZ2l0NFwiKSB8fCAoaXNOdW1QYWQgJiYgbnVtTG9ja09uICYmIGV2ZW50LmNvZGUgPT09IFwiTnVtcGFkNFwiKSkpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBDb252ZXJ0IHRvIGg0XHJcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuZXhlY0NvbW1hbmQoQmxvY2tPcGVyYXRpb25zU2VydmljZS5CTE9DS19PUEVSQVRJT05TLlRSQU5TRk9STV9CTE9DSywgZmFsc2UsIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl80KTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICgoZXZlbnQuY3RybEtleSAmJiBldmVudC5hbHRLZXkgJiYgKChldmVudC5jb2RlID09PSBcIkRpZ2l0NVwiKSB8fCAoaXNOdW1QYWQgJiYgbnVtTG9ja09uICYmIGV2ZW50LmNvZGUgPT09IFwiTnVtcGFkNVwiKSkpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBDb252ZXJ0IHRvIGg1XHJcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuZXhlY0NvbW1hbmQoQmxvY2tPcGVyYXRpb25zU2VydmljZS5CTE9DS19PUEVSQVRJT05TLlRSQU5TRk9STV9CTE9DSywgZmFsc2UsIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl81KTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICgoZXZlbnQuY3RybEtleSAmJiBldmVudC5hbHRLZXkgJiYgKChldmVudC5jb2RlID09PSBcIkRpZ2l0NlwiKSB8fCAoaXNOdW1QYWQgJiYgbnVtTG9ja09uICYmIGV2ZW50LmNvZGUgPT09IFwiTnVtcGFkNlwiKSkpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBDb252ZXJ0IHRvIGg2XHJcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuZXhlY0NvbW1hbmQoQmxvY2tPcGVyYXRpb25zU2VydmljZS5CTE9DS19PUEVSQVRJT05TLlRSQU5TRk9STV9CTE9DSywgZmFsc2UsIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl82KTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICgoZXZlbnQua2V5ID09PSBcIkRcIiB8fCBldmVudC5rZXkgPT09IFwiZFwiKSAmJiBldmVudC5jdHJsS2V5KSB7XHJcbiAgICAgICAgICAgICAgICAvLyBEdXBsaWNhdGUgYmxvY2sgc2hvcnRjdXRcclxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuYmxvY2tPcGVyYXRpb25zU2VydmljZS5leGVjQ29tbWFuZChCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLkJMT0NLX09QRVJBVElPTlMuRFVQTElDQVRFLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoKGV2ZW50LmtleSA9PT0gXCJEZWxldGVcIiB8fCBldmVudC5rZXkgPT09IFwiQmFja3NwYWNlXCIpICYmIGV2ZW50LnNoaWZ0S2V5KSB7XHJcbiAgICAgICAgICAgICAgICAvLyBEZWxldGUgYmxvY2sgc2hvcnRjdXRcclxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuYmxvY2tPcGVyYXRpb25zU2VydmljZS5leGVjQ29tbWFuZChCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLkJMT0NLX09QRVJBVElPTlMuREVMRVRFLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSBcIlxcXFxcIiAmJiAoZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5KSkge1xyXG4gICAgICAgICAgICAgICAgLy8gQ2xlYXIgZm9ybWF0dGluZ1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ibG9ja09wZXJhdGlvbnNTZXJ2aWNlLmV4ZWNDb21tYW5kKEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuQkxPQ0tfT1BFUkFUSU9OUy5SRU1PVkVfRk9STUFULCBmYWxzZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQuY3RybEtleSAmJiBldmVudC5hbHRLZXkgJiYgZXZlbnQuY29kZSA9PT0gXCJEaWdpdDFcIikge1xyXG4gICAgICAgICAgICAgICAgLy8gUHJldmVudCBjaGFyYWN0ZXIgaW5zZXJ0aW9uIHdoZW4gdXNpbmcgdG9wIHJvdyAnMSdcclxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcblxyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgYXN5bmMgKGV2ZW50KSA9PiB7XHJcblxyXG4gICAgICAgICAgICBpZiAoZXZlbnQuY3RybEtleSB8fCBldmVudC5zaGlmdEtleSB8fCBldmVudC5hbHRLZXkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgICAgIGlmIChldmVudC5rZXkgPT09ICdFbnRlcicgJiYgIVF1aWNrTWVudS5nZXRJbnN0YW5jZSgpLmlzVmlzaWJsZSkge1xyXG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuZXhlY0NvbW1hbmQoQmxvY2tPcGVyYXRpb25zU2VydmljZS5CTE9DS19PUEVSQVRJT05TLkNSRUFURV9ERUZBVUxUX0JMT0NLLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnQmFja3NwYWNlJykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCdqb2hhbm5lcy1jb250ZW50LWVsZW1lbnQnKSAmJiB0YXJnZXQudGV4dENvbnRlbnQ/LnRyaW0oKSA9PT0gJycpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuZXhlY0NvbW1hbmQoQmxvY2tPcGVyYXRpb25zU2VydmljZS5CTE9DS19PUEVSQVRJT05TLkRFTEVURV9GT0NVU19PTl9QUkVWSU9VUywgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCdqb2hhbm5lcy1jb250ZW50LWVsZW1lbnQnKSAmJiB0YXJnZXQudGV4dENvbnRlbnQ/LnRyaW0oKSAhPT0gJycpIHtcclxuICAgICAgICAgICAgICAgICAgICAvL1RPRE86IFJlcGxhY2UgdGhlIGRlbGV0ZSBhbmQgZm9jdXMgYnkgbWVyZ2VcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnRGVsZXRlJykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCdqb2hhbm5lcy1jb250ZW50LWVsZW1lbnQnKSAmJiB0YXJnZXQudGV4dENvbnRlbnQ/LnRyaW0oKSA9PT0gJycpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuZXhlY0NvbW1hbmQoQmxvY2tPcGVyYXRpb25zU2VydmljZS5CTE9DS19PUEVSQVRJT05TLkRFTEVURV9GT0NVU19PTl9ORVhULCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJ2pvaGFubmVzLWNvbnRlbnQtZWxlbWVudCcpICYmIHRhcmdldC50ZXh0Q29udGVudD8udHJpbSgpICE9PSAnJykge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vVE9ETzogUmVwbGFjZSB0aGUgZGVsZXRlIGFuZCBmb2N1cyBieSBtZXJnZVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJ0Fycm93UmlnaHQnICYmIENvbnRlbnQuaXNDdXJzb3JBdEVuZChldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuZXhlY0NvbW1hbmQoQmxvY2tPcGVyYXRpb25zU2VydmljZS5CTE9DS19PUEVSQVRJT05TLkZPQ1VTX09OX05FWFQsIGZhbHNlKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICdBcnJvd0xlZnQnICYmIENvbnRlbnQuaXNDdXJzb3JBdFN0YXJ0KGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYmxvY2tPcGVyYXRpb25zU2VydmljZS5leGVjQ29tbWFuZChCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLkJMT0NLX09QRVJBVElPTlMuRk9DVVNfT05fUFJFVklPVVMsIGZhbHNlKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICdBcnJvd0Rvd24nICYmIENvbnRlbnQuaXNDdXJzb3JPbkxhc3RMaW5lKCkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYmxvY2tPcGVyYXRpb25zU2VydmljZS5leGVjQ29tbWFuZChCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLkJMT0NLX09QRVJBVElPTlMuRk9DVVNfT05fTkVYVCwgZmFsc2UpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJ0Fycm93VXAnICYmIENvbnRlbnQuaXNDdXJzb3JPbkZpcnN0TGluZSgpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuZXhlY0NvbW1hbmQoQmxvY2tPcGVyYXRpb25zU2VydmljZS5CTE9DS19PUEVSQVRJT05TLkZPQ1VTX09OX1BSRVZJT1VTLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG5cclxuICAgIHN0YXRpYyBpc0N1cnNvckF0RW5kKHRhcmdldDogSFRNTEVsZW1lbnQpOiBib29sZWFuIHtcclxuICAgICAgICBjb25zdCBmb2N1c2FibGVQYXJlbnQgPSB0YXJnZXQuY2xvc2VzdCgnLmZvY3VzYWJsZScpO1xyXG4gICAgICAgIGlmICghZm9jdXNhYmxlUGFyZW50KSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKSE7XHJcbiAgICAgICAgaWYgKCFzZWxlY3Rpb24ucmFuZ2VDb3VudCkgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xyXG4gICAgICAgIGxldCBlbmROb2RlOiBOb2RlIHwgbnVsbCA9IHJhbmdlLmVuZENvbnRhaW5lcjtcclxuICAgICAgICBpZiAoZW5kTm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUpIHtcclxuICAgICAgICAgICAgZW5kTm9kZSA9IGVuZE5vZGUucGFyZW50Tm9kZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJhbmdlLmNvbGxhcHNlZCAmJiBlbmROb2RlID09PSBmb2N1c2FibGVQYXJlbnQgJiYgcmFuZ2UuZW5kT2Zmc2V0ID09PSAocmFuZ2UuZW5kQ29udGFpbmVyLnRleHRDb250ZW50IHx8ICcnKS5sZW5ndGg7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGlzQ3Vyc29yQXRTdGFydCh0YXJnZXQ6IEhUTUxFbGVtZW50KTogYm9vbGVhbiB7XHJcbiAgICAgICAgY29uc3QgZm9jdXNhYmxlUGFyZW50ID0gdGFyZ2V0LmNsb3Nlc3QoJy5mb2N1c2FibGUnKTtcclxuICAgICAgICBpZiAoIWZvY3VzYWJsZVBhcmVudCkgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCkhO1xyXG4gICAgICAgIGlmICghc2VsZWN0aW9uLnJhbmdlQ291bnQpIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgY29uc3QgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcclxuXHJcbiAgICAgICAgbGV0IHN0YXJ0Tm9kZTogTm9kZSB8IG51bGwgPSByYW5nZS5zdGFydENvbnRhaW5lcjtcclxuICAgICAgICBpZiAoc3RhcnROb2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xyXG4gICAgICAgICAgICBzdGFydE5vZGUgPSBzdGFydE5vZGUucGFyZW50Tm9kZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJhbmdlLmNvbGxhcHNlZCAmJiBzdGFydE5vZGUgPT09IGZvY3VzYWJsZVBhcmVudCAmJiByYW5nZS5zdGFydE9mZnNldCA9PT0gMDtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgaXNBdEZpcnN0VmlzaWJsZUxpbmUoZWxlbWVudDogSFRNTEVsZW1lbnQpIHtcclxuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCkhO1xyXG4gICAgICAgIGlmICghc2VsZWN0aW9uLnJhbmdlQ291bnQpIHJldHVybiBmYWxzZTtcclxuICAgICAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApLmNsb25lUmFuZ2UoKTtcclxuICAgICAgICByYW5nZS5jb2xsYXBzZSh0cnVlKTtcclxuICAgICAgICByYW5nZS5zZXRTdGFydChlbGVtZW50LCAwKTtcclxuICAgICAgICBjb25zdCByYW5nZVRvcCA9IHJhbmdlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcDtcclxuICAgICAgICBjb25zdCBlbGVtZW50VG9wID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3A7XHJcblxyXG4gICAgICAgIHJldHVybiByYW5nZVRvcCA9PT0gZWxlbWVudFRvcDtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgaXNBdExhc3RWaXNpYmxlTGluZShlbGVtZW50OiBIVE1MRWxlbWVudCkge1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKSE7XHJcbiAgICAgICAgaWYgKCFzZWxlY3Rpb24ucmFuZ2VDb3VudCkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCkuY2xvbmVSYW5nZSgpO1xyXG4gICAgICAgIHJhbmdlLmNvbGxhcHNlKGZhbHNlKTtcclxuICAgICAgICByYW5nZS5zZXRFbmQoZWxlbWVudCwgZWxlbWVudC5jaGlsZE5vZGVzLmxlbmd0aCk7XHJcbiAgICAgICAgY29uc3QgcmFuZ2VCb3R0b20gPSByYW5nZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5ib3R0b207XHJcbiAgICAgICAgY29uc3QgZWxlbWVudEJvdHRvbSA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuYm90dG9tO1xyXG5cclxuICAgICAgICByZXR1cm4gcmFuZ2VCb3R0b20gPT09IGVsZW1lbnRCb3R0b207XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHN0YXRpYyBkaWRDdXJzb3JNb3ZlKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpITtcclxuICAgICAgICBpZiAoIXNlbGVjdGlvbi5yYW5nZUNvdW50KSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcclxuXHJcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxSYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApLmNsb25lUmFuZ2UoKTtcclxuICAgICAgICBjb25zdCBvcmlnaW5hbFJlY3QgPSBvcmlnaW5hbFJhbmdlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG5cclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8Ym9vbGVhbj4ocmVzb2x2ZSA9PiB7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV3UmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKS5jbG9uZVJhbmdlKCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdSZWN0ID0gbmV3UmFuZ2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgZGlkTW92ZSA9ICEob3JpZ2luYWxSZWN0LnRvcCA9PT0gbmV3UmVjdC50b3AgJiYgb3JpZ2luYWxSZWN0LmxlZnQgPT09IG5ld1JlY3QubGVmdCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWRpZE1vdmUpIHtcclxuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZShkaWRNb3ZlKTtcclxuICAgICAgICAgICAgfSwgMCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgICBzdGF0aWMgaXNDdXJzb3JPbkZpcnN0TGluZSgpOiBib29sZWFuIHtcclxuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgICAgICAgaWYgKCFzZWxlY3Rpb24gfHwgIXNlbGVjdGlvbi5yYW5nZUNvdW50KSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XHJcblxyXG4gICAgICAgIHJldHVybiByYW5nZS5zdGFydE9mZnNldCA9PT0gMCAmJiByYW5nZS5zdGFydENvbnRhaW5lciA9PT0gcmFuZ2UuY29tbW9uQW5jZXN0b3JDb250YWluZXI7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGlzQ3Vyc29yT25MYXN0TGluZSgpOiBib29sZWFuIHtcclxuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgICAgICAgaWYgKCFzZWxlY3Rpb24gfHwgIXNlbGVjdGlvbi5yYW5nZUNvdW50KSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XHJcblxyXG4gICAgICAgIHJldHVybiByYW5nZS5lbmRPZmZzZXQgPT09IHJhbmdlLmVuZENvbnRhaW5lci50ZXh0Q29udGVudD8ubGVuZ3RoICYmIHJhbmdlLmVuZENvbnRhaW5lciA9PT0gcmFuZ2UuY29tbW9uQW5jZXN0b3JDb250YWluZXI7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlIH0gZnJvbSBcIkAvc2VydmljZXMvYmxvY2stb3BlcmF0aW9ucy9CbG9ja09wZXJhdGlvbnNTZXJ2aWNlXCI7XHJcbmltcG9ydCB7IEJhc2VVSUNvbXBvbmVudCB9IGZyb20gXCIuLi9jb21tb24vQmFzZVVJQ29tcG9uZW50XCI7XHJcbmltcG9ydCB7IElCbG9ja09wZXJhdGlvbnNTZXJ2aWNlIH0gZnJvbSBcIkAvc2VydmljZXMvYmxvY2stb3BlcmF0aW9ucy9JQmxvY2tPcGVyYXRpb25zU2VydmljZVwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFRpdGxlIGV4dGVuZHMgQmFzZVVJQ29tcG9uZW50IHtcclxuXHJcbiAgICBibG9ja09wZXJhdGlvbnNTZXJ2aWNlOiBJQmxvY2tPcGVyYXRpb25zU2VydmljZTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihibG9ja09wZXJhdGlvbnNTZXJ2aWNlOiBJQmxvY2tPcGVyYXRpb25zU2VydmljZSkge1xyXG5cclxuICAgICAgICBzdXBlcih7fSk7XHJcbiAgICAgICAgdGhpcy5ibG9ja09wZXJhdGlvbnNTZXJ2aWNlID0gYmxvY2tPcGVyYXRpb25zU2VydmljZTtcclxuICAgICAgICB0aGlzLmF0dGFjaEV2ZW50cygpO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXQoKTogSFRNTEVsZW1lbnQge1xyXG5cclxuICAgICAgICBjb25zdCBodG1sRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuY2xhc3NMaXN0LmFkZChcInRpdGxlXCIpO1xyXG5cclxuICAgICAgICBjb25zdCBoMSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJoMVwiKTtcclxuICAgICAgICBoMS5zZXRBdHRyaWJ1dGUoXCJjb250ZW50RWRpdGFibGVcIiwgXCJ0cnVlXCIpO1xyXG4gICAgICAgIGgxLnNldEF0dHJpYnV0ZShcImRhdGEtcGxhY2Vob2xkZXJcIiwgXCJVbnRpdGxlZFwiKTtcclxuXHJcbiAgICAgICAgaWYgKHdpbmRvdy5lZGl0b3JDb25maWc/LnRpdGxlKSB7XHJcbiAgICAgICAgICAgIGgxLnRleHRDb250ZW50ID0gd2luZG93LmVkaXRvckNvbmZpZz8udGl0bGVcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGh0bWxFbGVtZW50LmFwcGVuZENoaWxkKGgxKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGh0bWxFbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIGF0dGFjaEV2ZW50cygpIHtcclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIChldmVudCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoZXZlbnQua2V5ID09IFwiRW50ZXJcIikge1xyXG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuZXhlY0NvbW1hbmQoQmxvY2tPcGVyYXRpb25zU2VydmljZS5CTE9DS19PUEVSQVRJT05TLkZPQ1VTX09OX0ZJUlNULCBmYWxzZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxufSIsImltcG9ydCB7IEVsZW1lbnRGYWN0b3J5U2VydmljZSB9IGZyb20gXCIuLi8uLi9zZXJ2aWNlcy9lbGVtZW50LWZhY3RvcnkvRWxlbWVudEZhY3RvcnlTZXJ2aWNlXCI7XHJcbmltcG9ydCB7IEJhc2VVSUNvbXBvbmVudCB9IGZyb20gXCIuLi9jb21tb24vQmFzZVVJQ29tcG9uZW50XCI7XHJcbmltcG9ydCB7IElFbGVtZW50RmFjdG9yeVNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vc2VydmljZXMvZWxlbWVudC1mYWN0b3J5L0lFbGVtZW50RmFjdG9yeVNlcnZpY2VcIjtcclxuaW1wb3J0IHsgQ29udGVudCB9IGZyb20gXCIuLi9jb250ZW50L0NvbnRlbnRcIjtcclxuaW1wb3J0IHsgVGl0bGUgfSBmcm9tIFwiLi4vdGl0bGUvVGl0bGVcIjtcclxuaW1wb3J0IHsgSUJsb2NrT3BlcmF0aW9uc1NlcnZpY2UgfSBmcm9tIFwiQC9zZXJ2aWNlcy9ibG9jay1vcGVyYXRpb25zL0lCbG9ja09wZXJhdGlvbnNTZXJ2aWNlXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgRWRpdG9yIGV4dGVuZHMgQmFzZVVJQ29tcG9uZW50IHtcclxuXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGVsZW1lbnRGYWN0b3J5U2VydmljZTogSUVsZW1lbnRGYWN0b3J5U2VydmljZTtcclxuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IGVkaXRvcklkOiBzdHJpbmcgPSBcImpvaGFubmVzRWRpdG9yXCI7XHJcbiAgICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZTogRWRpdG9yO1xyXG5cclxuICAgIHByaXZhdGUgdGl0bGU/OiBUaXRsZTtcclxuICAgIHByaXZhdGUgY29udGVudD86IENvbnRlbnQ7XHJcblxyXG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihcclxuICAgICAgICBlbGVtZW50RmFjdG9yeVNlcnZpY2U6IElFbGVtZW50RmFjdG9yeVNlcnZpY2UsXHJcbiAgICAgICAgYmxvY2tPcGVyYXRpb25zU2VydmljZTogSUJsb2NrT3BlcmF0aW9uc1NlcnZpY2UpIHtcclxuXHJcbiAgICAgICAgc3VwZXIoe1xyXG4gICAgICAgICAgICBlbGVtZW50RmFjdG9yeVNlcnZpY2U6IGVsZW1lbnRGYWN0b3J5U2VydmljZSxcclxuICAgICAgICAgICAgYmxvY2tPcGVyYXRpb25zU2VydmljZTogYmxvY2tPcGVyYXRpb25zU2VydmljZVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpZiAoRWRpdG9yLmluc3RhbmNlKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVzZSBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLmdldEluc3RhbmNlKCkgdG8gZ2V0IGluc3RhbmNlLlwiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZWxlbWVudEZhY3RvcnlTZXJ2aWNlID0gZWxlbWVudEZhY3RvcnlTZXJ2aWNlO1xyXG5cclxuICAgICAgICB0aGlzLmF0dGFjaEV2ZW50cygpO1xyXG5cclxuICAgICAgICBFZGl0b3IuaW5zdGFuY2UgPSB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXQoKTogSFRNTEVsZW1lbnQge1xyXG5cclxuICAgICAgICBjb25zdCBodG1sRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKEVkaXRvci5lZGl0b3JJZCkgfHwgZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuXHJcbiAgICAgICAgaHRtbEVsZW1lbnQuY2xhc3NMaXN0LmFkZChcImpvaGFubmVzLWVkaXRvclwiKTtcclxuXHJcbiAgICAgICAgaWYgKHdpbmRvdy5lZGl0b3JDb25maWc/LmVuYWJsZVRpdGxlIHx8IHRydWUpIHtcclxuICAgICAgICAgICAgdGhpcy50aXRsZSA9IG5ldyBUaXRsZSh0aGlzLnByb3BzLmJsb2NrT3BlcmF0aW9uc1NlcnZpY2UpO1xyXG5cclxuICAgICAgICAgICAgaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy50aXRsZS5odG1sRWxlbWVudCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmNvbnRlbnQgPSBuZXcgQ29udGVudCh0aGlzLnByb3BzLmVsZW1lbnRGYWN0b3J5U2VydmljZSwgdGhpcy5wcm9wcy5ibG9ja09wZXJhdGlvbnNTZXJ2aWNlKTtcclxuXHJcbiAgICAgICAgaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5jb250ZW50Lmh0bWxFbGVtZW50KTtcclxuXHJcbiAgICAgICAgLy8gaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5wcm9wcy5jb250ZW50Lmh0bWxFbGVtZW50KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGh0bWxFbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBnZXRJbnN0YW5jZShlbGVtZW50RmFjdG9yeVNlcnZpY2U6IElFbGVtZW50RmFjdG9yeVNlcnZpY2UsIGJsb2NrT3BlcmF0aW9uc1NlcnZpY2U6IElCbG9ja09wZXJhdGlvbnNTZXJ2aWNlKSB7XHJcblxyXG4gICAgICAgIGlmICghRWRpdG9yLmluc3RhbmNlKSB7XHJcbiAgICAgICAgICAgIEVkaXRvci5pbnN0YW5jZSA9IG5ldyBFZGl0b3IoZWxlbWVudEZhY3RvcnlTZXJ2aWNlLCBibG9ja09wZXJhdGlvbnNTZXJ2aWNlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBFZGl0b3IuaW5zdGFuY2U7XHJcbiAgICB9XHJcblxyXG4gICAgYXR0YWNoRXZlbnRzKCkge1xyXG5cclxuICAgICAgICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChFZGl0b3IuZWRpdG9ySWQpO1xyXG5cclxuICAgICAgICBjb250YWluZXI/LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlb3ZlcicsIChldmVudCkgPT4ge1xyXG5cclxuICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xyXG5cclxuICAgICAgICAgICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIE5vZGUpIHtcclxuICAgICAgICAgICAgICAgIGxldCBlbGVtZW50ID0gdGFyZ2V0IGFzIE5vZGU7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50RWxlbWVudCBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEVsZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBibG9ja0VsZW1lbnQgPSBlbGVtZW50LmNsb3Nlc3QoJy5ibG9jaycpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoYmxvY2tFbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwZW5kRHJhZ0hhbmRsZXIoYmxvY2tFbGVtZW50KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0V2ZW50IHRhcmdldCBpcyBub3QgYW4gSFRNTEVsZW1lbnQgYW5kIGNhbm5vdCBoYW5kbGUgSFRNTEVsZW1lbnQgc3BlY2lmaWMgbWV0aG9kczonLCBlbGVtZW50KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0V2ZW50IHRhcmdldCBpcyBub3QgYSBOb2RlOicsIHRhcmdldCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy9Gb2N1cyBvbiB0aGUgZmlyc3QgcGFyYWdyYXBoXHJcbiAgICAgICAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICdsb2FkaW5nJykge1xyXG4gICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZmlyc3RQYXJhZ3JhcGggPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiI2pvaGFubmVzRWRpdG9yID4gLmNvbnRlbnQgLmJsb2NrIHBcIikgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgICAgICAgICBpZiAoZmlyc3RQYXJhZ3JhcGgpIHtcclxuICAgICAgICAgICAgICAgICAgICBmaXJzdFBhcmFncmFwaC5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBmaXJzdFBhcmFncmFwaCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjam9oYW5uZXNFZGl0b3IgPiAuY29udGVudCAuYmxvY2sgcFwiKSBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICAgICAgaWYgKGZpcnN0UGFyYWdyYXBoKSB7XHJcbiAgICAgICAgICAgICAgICBmaXJzdFBhcmFncmFwaC5mb2N1cygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdwYXN0ZScsIGZ1bmN0aW9uIChldmVudDogQ2xpcGJvYXJkRXZlbnQpIHtcclxuICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgICAgICBpZiAodGFyZ2V0LmdldEF0dHJpYnV0ZSgnY29udGVudGVkaXRhYmxlJykgPT09ICd0cnVlJykge1xyXG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBjbGlwYm9hcmREYXRhID0gZXZlbnQuY2xpcGJvYXJkRGF0YTtcclxuICAgICAgICAgICAgICAgIGlmIChjbGlwYm9hcmREYXRhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGV4dCA9IGNsaXBib2FyZERhdGEuZ2V0RGF0YSgndGV4dC9wbGFpbicpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBFZGl0b3IuaW5zZXJ0VGV4dEF0Q3Vyc29yKHRleHQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSwgdHJ1ZSk7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBpbnNlcnRUZXh0QXRDdXJzb3IodGV4dDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3Qgc2VsID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG5cclxuICAgICAgICBpZiAoc2VsKSB7XHJcbiAgICAgICAgICAgIGlmIChzZWwucmFuZ2VDb3VudCA+IDApIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gc2VsLmdldFJhbmdlQXQoMCk7XHJcbiAgICAgICAgICAgICAgICByYW5nZS5kZWxldGVDb250ZW50cygpO1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IHRleHROb2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGV4dCk7XHJcbiAgICAgICAgICAgICAgICByYW5nZS5pbnNlcnROb2RlKHRleHROb2RlKTtcclxuXHJcbiAgICAgICAgICAgICAgICByYW5nZS5zZXRTdGFydEFmdGVyKHRleHROb2RlKTtcclxuICAgICAgICAgICAgICAgIHJhbmdlLnNldEVuZEFmdGVyKHRleHROb2RlKTtcclxuICAgICAgICAgICAgICAgIHNlbC5yZW1vdmVBbGxSYW5nZXMoKTtcclxuICAgICAgICAgICAgICAgIHNlbC5hZGRSYW5nZShyYW5nZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXBwZW5kRHJhZ0hhbmRsZXIoZWxlbWVudDogTm9kZSk6IHZvaWQge1xyXG4gICAgICAgIGlmIChlbGVtZW50Lm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xyXG4gICAgICAgICAgICBlbGVtZW50ID0gZWxlbWVudC5wYXJlbnROb2RlIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdQcm92aWRlZCBlbGVtZW50IGlzIG5vdCBhbiBIVE1MRWxlbWVudDonLCBlbGVtZW50KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgcGFyZW50ID0gZWxlbWVudC5jbG9zZXN0KCcuYmxvY2snKTtcclxuICAgICAgICBsZXQgZHJhZ0hhbmRsZXIgPSBwYXJlbnQ/LnF1ZXJ5U2VsZWN0b3IoXCIuZHJhZy1oYW5kbGVyXCIpO1xyXG5cclxuICAgICAgICBpZiAoIWRyYWdIYW5kbGVyICYmIHBhcmVudCkge1xyXG4gICAgICAgICAgICBkcmFnSGFuZGxlciA9IHRoaXMuZWxlbWVudEZhY3RvcnlTZXJ2aWNlLmNyZWF0ZShFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5EUkFHX0hBTkRMRV9CVVRUT04pO1xyXG4gICAgICAgICAgICBwYXJlbnQucHJlcGVuZChkcmFnSGFuZGxlcik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJlbW92ZURyYWdIYW5kbGVyKGVsZW1lbnQ6IE5vZGUpOiB2b2lkIHtcclxuICAgICAgICBpZiAoZWxlbWVudC5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUpIHtcclxuICAgICAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZSBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcignUHJvdmlkZWQgZWxlbWVudCBpcyBub3QgYW4gSFRNTEVsZW1lbnQ6JywgZWxlbWVudCk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHBhcmVudCA9IGVsZW1lbnQuY2xvc2VzdCgnLmJsb2NrJyk7XHJcbiAgICAgICAgaWYgKHBhcmVudCkge1xyXG4gICAgICAgICAgICBjb25zdCBkcmFnSGFuZGxlciA9IHBhcmVudC5xdWVyeVNlbGVjdG9yKFwiLmRyYWctaGFuZGxlclwiKTtcclxuICAgICAgICAgICAgZHJhZ0hhbmRsZXI/LnJlbW92ZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBleHRyYWN0Q29udGVudCgpIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb3QgaW1wbGVtZW50ZWQgRXhjZXB0aW9uXCIpO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgRWRpdG9yIH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvZWRpdG9yL0VkaXRvclwiO1xyXG5pbXBvcnQgeyBFbGVtZW50RmFjdG9yeVNlcnZpY2UgfSBmcm9tIFwiLi4vc2VydmljZXMvZWxlbWVudC1mYWN0b3J5L0VsZW1lbnRGYWN0b3J5U2VydmljZVwiO1xyXG5pbXBvcnQgeyBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlIH0gZnJvbSBcIi4uL3NlcnZpY2VzL2Jsb2NrLW9wZXJhdGlvbnMvQmxvY2tPcGVyYXRpb25zU2VydmljZVwiO1xyXG5pbXBvcnQgeyBTZXJ2aWNlUHJvdmlkZXIgfSBmcm9tIFwiLi4vc2VydmljZXMvc2VydmljZS1wcm92aWRlci9TZXJ2aWNlUHJvdmlkZXJcIjtcclxuaW1wb3J0IHsgVGV4dE9wZXJhdGlvblNlcnZpY2UgfSBmcm9tIFwiLi4vc2VydmljZXMvdGV4dC1vcGVyYXRpb25zL1RleHRPcGVyYXRpb25TZXJ2aWNlXCI7XHJcbmltcG9ydCB7IFF1aWNrTWVudUJ1aWxkZXIgfSBmcm9tIFwiLi9RdWlja01lbnVCdWlsZGVyXCI7XHJcbmltcG9ydCB7IEZsb2F0aW5nVG9vbGJhckJ1aWxkZXIgfSBmcm9tIFwiLi9GbG9hdGluZ1Rvb2xiYXJCdWlsZGVyXCI7XHJcbmltcG9ydCB7IEZsb2F0aW5nVG9vbGJhciB9IGZyb20gXCIuLi9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvRmxvYXRpbmdUb29sYmFyXCI7XHJcbmltcG9ydCB7IFF1aWNrTWVudSB9IGZyb20gXCIuLi9jb21wb25lbnRzL3F1aWNrLW1lbnUvUXVpY2tNZW51XCI7XHJcbmltcG9ydCB7IEFkZEJsb2NrIH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvYWRkLWJsb2NrL0FkZEJsb2NrXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgVUlCdWlsZGVyIHtcclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZTogVUlCdWlsZGVyO1xyXG5cclxuICAgIHByaXZhdGUgZWRpdG9yOiBFZGl0b3I7XHJcbiAgICBwcml2YXRlIGFkZEJsb2NrOiBBZGRCbG9jaztcclxuICAgIHByaXZhdGUgZmxvYXRpbmdUb29sYmFyOiBGbG9hdGluZ1Rvb2xiYXI7XHJcbiAgICBwcml2YXRlIHF1aWNrTWVudTogUXVpY2tNZW51O1xyXG5cclxuICAgIHByaXZhdGUgY29uc3RydWN0b3IoXHJcblxyXG4gICAgICAgIGVkaXRvcjogRWRpdG9yLFxyXG4gICAgICAgIGFkZEJvY2s6IEFkZEJsb2NrLFxyXG4gICAgICAgIGZsb2F0aW5nVG9vbGJhcjogRmxvYXRpbmdUb29sYmFyLFxyXG4gICAgICAgIHF1aWNrTWVudTogUXVpY2tNZW51KSB7XHJcblxyXG4gICAgICAgIGlmIChVSUJ1aWxkZXIuaW5zdGFuY2UpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmVkaXRvciA9IGVkaXRvcjtcclxuICAgICAgICB0aGlzLmFkZEJsb2NrID0gYWRkQm9jaztcclxuICAgICAgICB0aGlzLmZsb2F0aW5nVG9vbGJhciA9IGZsb2F0aW5nVG9vbGJhcjtcclxuICAgICAgICB0aGlzLnF1aWNrTWVudSA9IHF1aWNrTWVudTtcclxuXHJcbiAgICAgICAgVUlCdWlsZGVyLmluc3RhbmNlID0gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgYnVpbGQoc2VydmljZXM/OiBNYXA8c3RyaW5nLCBhbnk+KTogVUlCdWlsZGVyIHtcclxuXHJcbiAgICAgICAgaWYgKFVJQnVpbGRlci5pbnN0YW5jZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gVUlCdWlsZGVyLmluc3RhbmNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3Qgc2VydmljZVByb3ZpZGVyID0gU2VydmljZVByb3ZpZGVyLmdldEluc3RhbmNlKCk7XHJcblxyXG4gICAgICAgIC8vIEluaXRpYWxpemVyIGFsbCBzZXJ2aWNlIGJlZm9yZSBhbnkgY29tcG9uZW50XHJcbiAgICAgICAgaWYgKHNlcnZpY2VzKSB7XHJcbiAgICAgICAgICAgIHNlcnZpY2VQcm92aWRlci5yZXNldCgpO1xyXG4gICAgICAgICAgICBzZXJ2aWNlUHJvdmlkZXIucmVnaXN0ZXJTZXJ2aWNlcyhzZXJ2aWNlcyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuXHJcbiAgICAgICAgICAgIC8vUmVnaXN0ZXJpbmcgYWxsIGF2YWlsYWJsZSBzZXJ2aWNlc1xyXG4gICAgICAgICAgICBzZXJ2aWNlUHJvdmlkZXIucmVnaXN0ZXJTZXJ2aWNlKFwiSUJsb2NrT3BlcmF0aW9uc1NlcnZpY2VcIiwgQmxvY2tPcGVyYXRpb25zU2VydmljZS5nZXRJbnN0YW5jZSgpKTtcclxuICAgICAgICAgICAgc2VydmljZVByb3ZpZGVyLnJlZ2lzdGVyU2VydmljZShcIklFbGVtZW50RmFjdG9yeVNlcnZpY2VcIiwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkpO1xyXG4gICAgICAgICAgICBzZXJ2aWNlUHJvdmlkZXIucmVnaXN0ZXJTZXJ2aWNlKFwiSVRleHRPcGVyYXRpb25TZXJ2aWNlXCIsIFRleHRPcGVyYXRpb25TZXJ2aWNlLmdldEluc3RhbmNlKCkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZWRpdG9yID0gRWRpdG9yLmdldEluc3RhbmNlKHNlcnZpY2VQcm92aWRlci5nZXRJbnN0YW5jZU9mKFwiSUVsZW1lbnRGYWN0b3J5U2VydmljZVwiKSwgc2VydmljZVByb3ZpZGVyLmdldEluc3RhbmNlT2YoXCJJQmxvY2tPcGVyYXRpb25zU2VydmljZVwiKSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGFkZEJsb2NrID0gbmV3IEFkZEJsb2NrKHNlcnZpY2VQcm92aWRlci5nZXRJbnN0YW5jZU9mKFwiSUJsb2NrT3BlcmF0aW9uc1NlcnZpY2VcIikpO1xyXG4gICAgICAgIGNvbnN0IGZsb2F0aW5nVG9vbGJhciA9IEZsb2F0aW5nVG9vbGJhckJ1aWxkZXIuYnVpbGQoKTtcclxuICAgICAgICBjb25zdCBxdWlja01lbnUgPSBRdWlja01lbnVCdWlsZGVyLmJ1aWxkKCk7XHJcblxyXG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgVUlCdWlsZGVyKGVkaXRvciwgYWRkQmxvY2ssIGZsb2F0aW5nVG9vbGJhciwgcXVpY2tNZW51KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGJ1aWxkZXI7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhcnQoKTogRWRpdG9yIHtcclxuXHJcbiAgICAgICAgLy8gaWYgKHdpbmRvdy5lZGl0b3JDb25maWc/LmVuYWJsZVRpdGxlKSB7XHJcbiAgICAgICAgLy8gICAgIHRoaXMuZWRpdG9yLmh0bWxFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMudGl0bGUuaHRtbEVsZW1lbnQpO1xyXG4gICAgICAgIC8vIH1cclxuXHJcbiAgICAgICAgaWYgKHdpbmRvdy5lZGl0b3JDb25maWc/LmVuYWJsZUFkZEJsb2NrIHx8IHRydWUpIHtcclxuICAgICAgICAgICAgdGhpcy5lZGl0b3IuaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5hZGRCbG9jay5odG1sRWxlbWVudCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAod2luZG93LmVkaXRvckNvbmZpZz8uZW5hYmxlRmxvYXRpbmdUb29sYmFyIHx8IHRydWUpIHtcclxuICAgICAgICAgICAgdGhpcy5lZGl0b3IuaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5mbG9hdGluZ1Rvb2xiYXIuaHRtbEVsZW1lbnQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHdpbmRvdy5lZGl0b3JDb25maWc/LmVuYWJsZVF1aWNrTWVudSB8fCB0cnVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZWRpdG9yLmh0bWxFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMucXVpY2tNZW51Lmh0bWxFbGVtZW50KTtcclxuICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5lZGl0b3I7XHJcbiAgICB9XHJcbn0iLCIvL1RPRE8gdXNlIGNvbW1hbmRzXG5pbXBvcnQgeyBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvYmxvY2stb3BlcmF0aW9ucy9CbG9ja09wZXJhdGlvbnNTZXJ2aWNlJztcbmltcG9ydCB7IEVsZW1lbnRGYWN0b3J5U2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2VsZW1lbnQtZmFjdG9yeS9FbGVtZW50RmFjdG9yeVNlcnZpY2UnO1xuaW1wb3J0IHsgUXVpY2tNZW51QnVpbGRlciB9IGZyb20gXCIuLi9idWlsZGVycy9RdWlja01lbnVCdWlsZGVyXCI7XG5pbXBvcnQgeyBGbG9hdGluZ1Rvb2xiYXJCdWlsZGVyIH0gZnJvbSBcIi4uL2J1aWxkZXJzL0Zsb2F0aW5nVG9vbGJhckJ1aWxkZXJcIjtcbmltcG9ydCB7IEFkZEJsb2NrIH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvYWRkLWJsb2NrL0FkZEJsb2NrXCI7XG5pbXBvcnQgaWNvbnNTVkcgZnJvbSAnLi4vYXNzZXRzL2ltZy9pY29ucy5zdmcnO1xuXG5pbXBvcnQgeyBVSUJ1aWxkZXIgfSBmcm9tIFwiLi4vYnVpbGRlcnMvVUlCdWlsZGVyXCI7XG5cblxuLy9Gb2N1cyBvbiBQIHdoZW4gbG9hZFxuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBlZGl0b3IgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuam9oYW5uZXMtZWRpdG9yJyk7XG5cbiAgICBpZiAoZWRpdG9yKSB7XG4gICAgICAgIGxldCBibG9ja3MgPSBlZGl0b3IucXVlcnlTZWxlY3RvckFsbCgnLmJsb2NrJyk7XG5cbiAgICAgICAgaWYgKGJsb2Nrcy5sZW5ndGggPT0gMSkge1xuXG4gICAgICAgICAgICBjb25zdCBwID0gYmxvY2tzWzBdLnF1ZXJ5U2VsZWN0b3IoJy5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQnKTtcbiAgICAgICAgICAgIGlmIChwLmlubmVyVGV4dCA9PSAnJykge1xuICAgICAgICAgICAgICAgIHAuZm9jdXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn0pO1xuXG5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgZnVuY3Rpb24gKCkge1xuICAgIFVJQnVpbGRlci5idWlsZCgpLnN0YXJ0KCk7XG59KTtcblxuXG5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHN2Z0NvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHN2Z0NvbnRhaW5lci5pbm5lckhUTUwgPSBpY29uc1NWRztcblxuICAgIHN2Z0NvbnRhaW5lci5jbGFzc05hbWUgPSAnc3ZnLWljb25zLWNvbnRhaW5lcic7XG5cbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHN2Z0NvbnRhaW5lcik7XG59KTsiLCIvL1RoZSBzdGFydCBwb2ludCBmb3Iga2V5IHByZXNzIGV2ZW50c1xyXG5pbXBvcnQgKiBhcyBjb21tYW5kRmFjdG9yeSBmcm9tICcuLi9jb21tYW5kcy9jb21tYW5kLWZhY3RvcnknO1xyXG5pbXBvcnQgeyBpc1Nob3dpbmdCbG9ja09wdGlvbnMgfSBmcm9tICcuLi9jb21wb25lbnRzL3F1aWNrLW1lbnUvcXVpY2staW5zZXJ0LW1lbnUnO1xyXG5pbXBvcnQgeyBpc1RyaWdnYWJsZSB9IGZyb20gJy4uL2hlbHBlcic7XHJcbmltcG9ydCB7IGNhbkhpZGVUZXh0Rm9ybWF0dGluZ0JhciwgaXNTaG93aW5nVGV4dEZvcm1hdHRpbmdCYXIgfSBmcm9tICcuLi9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvdGV4dC1mb3JtYXR0aW5nLWJhcic7XHJcbmltcG9ydCB7IGlzU2hvd2luZ1RleHRGb3JtYXR0aW5nU2VsZWN0YWJsZURlcGVuZGVudEJveCB9IGZyb20gJy4uL2NvbXBvbmVudHMvZmxvYXRpbmctdG9vbGJhci90ZXh0LWZvcm1hdHRpbmctYmFyJztcclxuXHJcblxyXG4vLyBCbG9jayBvcGVyYXRpb25zIGlzIG9wZXJhdGlvbnMgcmVsYXRlZCB0byB0aGUgYmxvY2sgaXQgc2VsZi4gQ3JlYXRlIGEgYmxvY2ssIGRlbGV0ZSBhIGJsb2NrLCBjaGFuZ2UgdGhlIGJsb2NrIHR5cGUsIGV0Yy4uLlxyXG5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgZnVuY3Rpb24gKCkge1xyXG5cclxuXHJcbiAgICAvLyBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgZnVuY3Rpb24gKGV2ZW50KSB7XHJcblxyXG4gICAgLy8gICAgIGlmIChpc1RyaWdnYWJsZShldmVudCkgJiYgIWlzU2hvd2luZ0Jsb2NrT3B0aW9ucygpKSB7XHJcblxyXG4gICAgLy8gICAgICAgICBpZiAoZXZlbnQua2V5ID09PSAnRW50ZXInICYmICFpc1Nob3dpbmdUZXh0Rm9ybWF0dGluZ1NlbGVjdGFibGVEZXBlbmRlbnRCb3goKSAmJiAhaXNTaG93aW5nVGV4dEZvcm1hdHRpbmdCYXIoKSAmJiAhZXZlbnQuY3RybEtleSAmJiAhZXZlbnQuc2hpZnRLZXkgJiYgIWV2ZW50LmFsdEtleSkge1xyXG5cclxuICAgIC8vICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAvLyAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHJcbiAgICAvLyAgICAgICAgICAgICAvL1RPRE86IHBhc3MgdGhlIGV2ZW50IG5vdCBldmVudC50YXJnZXQvaXRgcyBtb3JlIHNpbXBsZSB0byBkZWFsIHdpdGggZXZlbnQgd2hlbiBjcmVhdGUgYSBjbGljayBldmVudExpc3RlbmVyXHJcbiAgICAvLyAgICAgICAgICAgICBjb25zdCBjb21tYW5kID0gY29tbWFuZEZhY3RvcnkuY3JlYXRlQ29tbWFuZChjb21tYW5kRmFjdG9yeS5PUEVSQVRJT05TLkJMT0NLLkNSRUFURV9ORVdfRUxFTUVOVCwgW2V2ZW50XSk7XHJcbiAgICAvLyAgICAgICAgICAgICBjb21tYW5kLmV4ZWN1dGUoKTtcclxuXHJcbiAgICAvLyAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnQmFja3NwYWNlJyAmJiBpc0FjdGl2ZUNvbnRlbnRCbGFuayhldmVudCkgJiYgIWV2ZW50LmN0cmxLZXkgJiYgIWV2ZW50LnNoaWZ0S2V5ICYmICFldmVudC5hbHRLZXkpIHtcclxuXHJcbiAgICAvLyAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cclxuICAgIC8vICAgICAgICAgICAgIGNvbnN0IGNvbW1hbmQgPSBjb21tYW5kRmFjdG9yeS5jcmVhdGVDb21tYW5kKGNvbW1hbmRGYWN0b3J5Lk9QRVJBVElPTlMuQkxPQ0suREVMRVRFX0FORF9GT0NVU19PTl9QUkVWSU9VUyk7XHJcbiAgICAvLyAgICAgICAgICAgICBjb21tYW5kLmV4ZWN1dGUoKTtcclxuXHJcbiAgICAvLyAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnRGVsZXRlJyAmJiBpc0FjdGl2ZUNvbnRlbnRCbGFuaygpICYmICFldmVudC5jdHJsS2V5ICYmICFldmVudC5zaGlmdEtleSAmJiAhZXZlbnQuYWx0S2V5KSB7XHJcblxyXG4gICAgLy8gICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHJcbiAgICAvLyAgICAgICAgICAgICBjb25zdCBjb21tYW5kID0gY29tbWFuZEZhY3RvcnkuY3JlYXRlQ29tbWFuZChjb21tYW5kRmFjdG9yeS5PUEVSQVRJT05TLkJMT0NLLkRFTEVURV9BTkRfRk9DVVNfT05fTkVYVCk7XHJcbiAgICAvLyAgICAgICAgICAgICBjb21tYW5kLmV4ZWN1dGUoKTtcclxuXHJcbiAgICAvLyAgICAgICAgIH1cclxuICAgIC8vICAgICB9XHJcbiAgICAvLyB9KTtcclxuXHJcbiAgICAvLyBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXl1cCcsIGZ1bmN0aW9uIChldmVudCkge1xyXG5cclxuICAgIC8vICAgICBpZiAoaXNUcmlnZ2FibGUoZXZlbnQpICYmICFpc1Nob3dpbmdCbG9ja09wdGlvbnMoKSkge1xyXG4gICAgLy8gICAgICAgICBpZiAoZXZlbnQua2V5ID09PSAnRXNjYXBlJyAmJiBpc0FjdGl2ZUNvbnRlbnRCbGFuaygpICYmICFldmVudC5jdHJsS2V5ICYmICFldmVudC5zaGlmdEtleSAmJiAhZXZlbnQuYWx0S2V5KSB7XHJcblxyXG4gICAgLy8gICAgICAgICAgICAgLy9UT0RPOiB3cml0ZSB0aGUgY29kZSB0byBzZWxlY3QgdGhlIGFsbCB0ZXh0XHJcblxyXG4gICAgLy8gICAgICAgICB9XHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gfSk7XHJcbn0pO1xyXG5cclxuLy8gQmxvY2sgb3B0aW9ucyBvcGVyYXRpb25zIGlzIG9wZXJhdGlvbnMgcmVsYXRlZCB0byB0aGUgQmxvY2sgT3B0aW9ucy4gU2hvdyB0aGUgYmxvY2sgb3B0aW9ucywgaGlkZSB0aGUgYmxvY2sgb3B0aW9ucywgZmlsdGVyLCAuLi5cclxuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgZnVuY3Rpb24gKGV2ZW50KSB7XHJcblxyXG4gICAgICAgIC8vIGlmIChpc1Nob3dpbmdCbG9ja09wdGlvbnMoKSkge1xyXG5cclxuICAgICAgICAgICAgLy8gaWYgKGV2ZW50LmtleSA9PT0gJ0VzY2FwZScgJiYgIWV2ZW50LmN0cmxLZXkgJiYgIWV2ZW50LnNoaWZ0S2V5ICYmICFldmVudC5hbHRLZXkpIHtcclxuXHJcbiAgICAgICAgICAgIC8vICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cclxuICAgICAgICAgICAgLy8gICAgIGNvbnN0IGVsZW1lbnRUb0ZvY3VzQWZ0ZXJIaWRlID0gZXZlbnQudGFyZ2V0O1xyXG5cclxuICAgICAgICAgICAgLy8gICAgIC8vVE9ETzogcGFzcyB0aGUgZXZlbnQgbm90IGV2ZW50LnRhcmdldC9pdGBzIG1vcmUgc2ltcGxlIHRvIGRlYWwgd2l0aCBldmVudCB3aGVuIGNyZWF0ZSBhIGNsaWNrIGV2ZW50TGlzdGVuZXJcclxuICAgICAgICAgICAgLy8gICAgIGNvbnN0IGNvbW1hbmQgPSBjb21tYW5kRmFjdG9yeS5jcmVhdGVDb21tYW5kKGNvbW1hbmRGYWN0b3J5Lk9QRVJBVElPTlMuQkxPQ0tfT1BUSU9OUy5ISURFX0NMRUFSX0JMT0NLX09QVElPTlMsIFtlbGVtZW50VG9Gb2N1c0FmdGVySGlkZV0pO1xyXG4gICAgICAgICAgICAvLyAgICAgY29tbWFuZC5leGVjdXRlKCk7XHJcblxyXG4gICAgICAgICAgICAvLyB9XHJcblxyXG4gICAgICAgICAgICAvLyBlbHNlIGlmIChldmVudC5rZXkgPT09ICdFbnRlcicgJiYgIWV2ZW50LmN0cmxLZXkgJiYgIWV2ZW50LnNoaWZ0S2V5ICYmICFldmVudC5hbHRLZXkpIHtcclxuXHJcbiAgICAgICAgICAgIC8vICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAvLyAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgICAgICAgICAvLyAgICAgY29uc3QgY29tbWFuZCA9IGNvbW1hbmRGYWN0b3J5LmNyZWF0ZUNvbW1hbmQoY29tbWFuZEZhY3RvcnkuT1BFUkFUSU9OUy5CTE9DS19PUFRJT05TLkFQUExZX1NFTEVDVEVEX0JMT0NLX1RZUEUsIFtldmVudF0pO1xyXG4gICAgICAgICAgICAvLyAgICAgY29tbWFuZC5leGVjdXRlKCk7XHJcblxyXG4gICAgICAgICAgICAvLyB9IGVsc2UgaWYgKC9eW2EtejAtOV0kL2kudGVzdChldmVudC5rZXkpICYmICFldmVudC5jdHJsS2V5ICYmICFldmVudC5zaGlmdEtleSAmJiAhZXZlbnQuYWx0S2V5KSB7XHJcblxyXG4gICAgICAgICAgICAvLyAgICAgY29uc3QgY29tbWFuZCA9IGNvbW1hbmRGYWN0b3J5LmNyZWF0ZUNvbW1hbmQoY29tbWFuZEZhY3RvcnkuT1BFUkFUSU9OUy5CTE9DS19PUFRJT05TLkZJTFRFUl9DT05DQVQsIFtldmVudF0pO1xyXG4gICAgICAgICAgICAvLyAgICAgY29tbWFuZC5leGVjdXRlKCk7XHJcblxyXG4gICAgICAgICAgICAvLyB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJ0JhY2tzcGFjZScpIHtcclxuXHJcbiAgICAgICAgICAgIC8vICAgICBjb25zdCBjb21tYW5kID0gY29tbWFuZEZhY3RvcnkuY3JlYXRlQ29tbWFuZChjb21tYW5kRmFjdG9yeS5PUEVSQVRJT05TLkJMT0NLX09QVElPTlMuRklMVEVSX1JFTU9WRV9MQVNUKTtcclxuICAgICAgICAgICAgLy8gICAgIGNvbW1hbmQuZXhlY3V0ZSgpO1xyXG4gICAgICAgICAgICAvLyB9XHJcbiAgICAgICAgLy8gfVxyXG5cclxuXHJcbiAgICAgICAgLy8gaWYgKGlzU2hvd2luZ1RleHRGb3JtYXR0aW5nU2VsZWN0YWJsZURlcGVuZGVudEJveCgpKSB7XHJcblxyXG4gICAgICAgIC8vICAgICBpZiAoZXZlbnQua2V5ID09PSAnRXNjYXBlJyAmJiAhZXZlbnQuY3RybEtleSAmJiAhZXZlbnQuc2hpZnRLZXkgJiYgIWV2ZW50LmFsdEtleSkge1xyXG5cclxuICAgICAgICAvLyAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblxyXG4gICAgICAgIC8vICAgICAgICAgY29uc3QgY29tbWFuZCA9IGNvbW1hbmRGYWN0b3J5LmNyZWF0ZUNvbW1hbmQoY29tbWFuZEZhY3RvcnkuT1BFUkFUSU9OUy5CTE9DS19PUFRJT05TLkhJREVfVEVYVF9GT1JNQVRUSU5HX0JBUiwgW2V2ZW50XSk7XHJcbiAgICAgICAgLy8gICAgICAgICBjb21tYW5kLmV4ZWN1dGUoKTtcclxuXHJcbiAgICAgICAgLy8gICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dEb3duJyAmJiAhZXZlbnQuY3RybEtleSAmJiAhZXZlbnQuc2hpZnRLZXkgJiYgIWV2ZW50LmFsdEtleSkge1xyXG5cclxuICAgICAgICAvLyAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblxyXG4gICAgICAgIC8vICAgICAgICAgY29uc3QgY29tbWFuZCA9IGNvbW1hbmRGYWN0b3J5LmNyZWF0ZUNvbW1hbmQoY29tbWFuZEZhY3RvcnkuT1BFUkFUSU9OUy5CTE9DS19PUFRJT05TLk1PVkVfRkFLRV9GT0NVU19UT19ORVhUX09QVElPTik7XHJcbiAgICAgICAgLy8gICAgICAgICBjb21tYW5kLmV4ZWN1dGUoKTtcclxuXHJcbiAgICAgICAgLy8gICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dVcCcgJiYgIWV2ZW50LmN0cmxLZXkgJiYgIWV2ZW50LnNoaWZ0S2V5ICYmICFldmVudC5hbHRLZXkpIHtcclxuXHJcbiAgICAgICAgLy8gICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cclxuICAgICAgICAvLyAgICAgICAgIGNvbnN0IGNvbW1hbmQgPSBjb21tYW5kRmFjdG9yeS5jcmVhdGVDb21tYW5kKGNvbW1hbmRGYWN0b3J5Lk9QRVJBVElPTlMuQkxPQ0tfT1BUSU9OUy5NT1ZFX0ZBS0VfRk9DVVNfVE9fUFJFVklPVVNfT1BUSU9OKTtcclxuICAgICAgICAvLyAgICAgICAgIGNvbW1hbmQuZXhlY3V0ZSgpO1xyXG5cclxuICAgICAgICAvLyAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICdFbnRlcicgJiYgIWV2ZW50LmN0cmxLZXkgJiYgIWV2ZW50LnNoaWZ0S2V5ICYmICFldmVudC5hbHRLZXkpIHtcclxuXHJcbiAgICAgICAgLy8gICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIC8vICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgICAgIC8vICAgICAgICAgY29uc3QgY29tbWFuZCA9IGNvbW1hbmRGYWN0b3J5LmNyZWF0ZUNvbW1hbmQoY29tbWFuZEZhY3RvcnkuT1BFUkFUSU9OUy5CTE9DS19PUFRJT05TLkFQUExZX1NFTEVDVEVEX0JMT0NLX1RZUEUsIFtldmVudF0pO1xyXG4gICAgICAgIC8vICAgICAgICAgY29tbWFuZC5leGVjdXRlKCk7XHJcblxyXG4gICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgLy8gfVxyXG4gICAgfSk7XHJcbn0pO1xyXG5cclxuXHJcbi8vIFRleHQgZm9ybWF0dGluZyBiYXIgb3BlcmF0aW9ucyBpcyBvcGVyYXRpb25zIHJlbGF0ZWQgdG8gdGV4dCBwcmVzZW50YXRpb24sIGNvbG9yLCBzaG93IG9yIGhpZGUgdGV4dCBmb3JtYXR0aW5nIGRlcGVuZGVudCBib3hlcywuLi5cclxuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLCBmdW5jdGlvbiAoZXZlbnQpIHtcclxuICAgIC8vIGlmIChldmVudC5rZXkgPT09ICdTaGlmdCcgJiYgaXNUcmlnZ2FibGUoZXZlbnQpKSB7XHJcblxyXG4gICAgLy8gICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgLy8gICAgICAgICBpZiAod2luZG93LmdldFNlbGVjdGlvbigpLnRvU3RyaW5nKCkudHJpbSgpICE9PSAnJykge1xyXG4gICAgLy8gICAgICAgICAgICAgY29uc3QgY29tbWFuZCA9IGNvbW1hbmRGYWN0b3J5LmNyZWF0ZUNvbW1hbmQoY29tbWFuZEZhY3RvcnkuT1BFUkFUSU9OUy5GT1JNQVRUSU5HX0JBUi5TSE9XX1RFWFRfRk9STUFUVElOR19CQVIsIFtldmVudF0pO1xyXG4gICAgLy8gICAgICAgICAgICAgY29tbWFuZC5leGVjdXRlKCk7XHJcbiAgICAvLyAgICAgICAgIH1cclxuICAgIC8vICAgICB9LCAxMCk7XHJcblxyXG4gICAgLy8gfVxyXG59KTtcclxuXHJcbi8vIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBmdW5jdGlvbiAoZXZlbnQpIHtcclxuLy8gICAgIGlmIChldmVudC5jdHJsS2V5ICYmIGV2ZW50LmtleS50b0xvd2VyQ2FzZSgpID09PSAnYScgJiYgaXNUcmlnZ2FibGUoZXZlbnQpKSB7XHJcblxyXG4vLyAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4vLyAgICAgICAgICAgICBpZiAod2luZG93LmdldFNlbGVjdGlvbigpLnRvU3RyaW5nKCkudHJpbSgpICE9PSAnJykge1xyXG4vLyAgICAgICAgICAgICAgICAgY29uc3QgY29tbWFuZCA9IGNvbW1hbmRGYWN0b3J5LmNyZWF0ZUNvbW1hbmQoY29tbWFuZEZhY3RvcnkuT1BFUkFUSU9OUy5GT1JNQVRUSU5HX0JBUi5TSE9XX1RFWFRfRk9STUFUVElOR19CQVIsIFtldmVudF0pO1xyXG4vLyAgICAgICAgICAgICAgICAgY29tbWFuZC5leGVjdXRlKCk7XHJcbi8vICAgICAgICAgICAgIH1cclxuLy8gICAgICAgICB9LCAxMCk7XHJcblxyXG4vLyAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICdFc2NhcGUnICYmIGNhbkhpZGVUZXh0Rm9ybWF0dGluZ0JhcigpICYmIGlzU2hvd2luZ1RleHRGb3JtYXR0aW5nQmFyKCkpIHtcclxuXHJcbi8vICAgICAgICAgY29uc3QgY29tbWFuZCA9IGNvbW1hbmRGYWN0b3J5LmNyZWF0ZUNvbW1hbmQoY29tbWFuZEZhY3RvcnkuT1BFUkFUSU9OUy5GT1JNQVRUSU5HX0JBUi5ISURFX1RFWFRfRk9STUFUVElOR19CQVIsIFtldmVudF0pO1xyXG4vLyAgICAgICAgIGNvbW1hbmQuZXhlY3V0ZSgpO1xyXG4vLyAgICAgfVxyXG4vLyB9KTtcclxuXHJcblxyXG5cclxuZnVuY3Rpb24gaXNBY3RpdmVDb250ZW50QmxhbmsoKSB7XHJcbiAgICByZXR1cm4gZG9jdW1lbnQuYWN0aXZlRWxlbWVudC50ZXh0Q29udGVudC50cmltKCkgPT09ICcnO1xyXG59XHJcblxyXG5cclxuLy8gTGlzdGVuIGEgaW5wdXQgbGlua1xyXG4vLyBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgZnVuY3Rpb24gKCkge1xyXG4vLyAgICAgbGlua0JveElucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBmdW5jdGlvbiAoZXZlbnQpIHtcclxuLy8gICAgICAgICBpZiAoZXZlbnQua2V5ID09PSAnRW50ZXInKSB7XHJcblxyXG4vLyAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4vLyAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHJcbi8vICAgICAgICAgICAgIGNvbnN0IGNvbW1hbmQgPSBjb21tYW5kRmFjdG9yeS5jcmVhdGVDb21tYW5kKGNvbW1hbmRGYWN0b3J5Lk9QRVJBVElPTlMuRk9STUFUVElOR19CQVIuSU5QVVRfTElOS19VUkwpO1xyXG4vLyAgICAgICAgICAgICBjb21tYW5kLmV4ZWN1dGUoKTtcclxuLy8gICAgICAgICB9XHJcbi8vICAgICB9KTtcclxuLy8gfSk7XHJcblxyXG5cclxuLy8gTG9jayBsZWZ0IGFuZCByaWdodCBrZXkgd2hlbiBpcyBzaG93aW5nIHRoZSBkZXBlbmRlbnQgYm94XHJcbi8vIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBmdW5jdGlvbiAoZXZlbnQpIHtcclxuLy8gICAgIGlmIChpc1Nob3dpbmdUZXh0Rm9ybWF0dGluZ1NlbGVjdGFibGVEZXBlbmRlbnRCb3goKSAmJlxyXG4vLyAgICAgICAgIChldmVudC5rZXkgPT09ICdBcnJvd0xlZnQnIHx8IGV2ZW50LmtleSA9PT0gJ0Fycm93UmlnaHQnKSkge1xyXG5cclxuLy8gICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4vLyAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4vLyAgICAgfVxyXG4vLyB9KTtcclxuXHJcblxyXG4vLyBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXl1cCcsIGZ1bmN0aW9uIChldmVudCkge1xyXG4vLyAgICAgaWYgKGlzU2hvd2luZ1RleHRGb3JtYXR0aW5nQmFyKCkgJiYgY2FuSGlkZVRleHRGb3JtYXR0aW5nQmFyKCkgJiYgIWlzU2hvd2luZ1RleHRGb3JtYXR0aW5nU2VsZWN0YWJsZURlcGVuZGVudEJveCgpICYmXHJcbi8vICAgICAgICAgKGV2ZW50LmtleSA9PT0gJ0Fycm93TGVmdCcgfHwgZXZlbnQua2V5ID09PSAnQXJyb3dSaWdodCcgfHwgZXZlbnQua2V5ID09PSAnQXJyb3dVcCcgfHwgZXZlbnQua2V5ID09PSAnQXJyb3dEb3duJykpIHtcclxuXHJcbi8vICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbi8vICAgICAgICAgICAgIGlmICh3aW5kb3cuZ2V0U2VsZWN0aW9uKCkudG9TdHJpbmcoKS50cmltKCkgPT0gJycpIHtcclxuLy8gICAgICAgICAgICAgICAgIGNvbnN0IGNvbW1hbmQgPSBjb21tYW5kRmFjdG9yeS5jcmVhdGVDb21tYW5kKGNvbW1hbmRGYWN0b3J5Lk9QRVJBVElPTlMuRk9STUFUVElOR19CQVIuSElERV9URVhUX0ZPUk1BVFRJTkdfQkFSLCBbZXZlbnRdKTtcclxuLy8gICAgICAgICAgICAgICAgIGNvbW1hbmQuZXhlY3V0ZSgpO1xyXG4vLyAgICAgICAgICAgICB9XHJcbi8vICAgICAgICAgfSwgMTApO1xyXG4vLyAgICAgfVxyXG4vLyB9KTsiLCJcbiAgICAgIGltcG9ydCBBUEkgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgIGltcG9ydCBkb21BUEkgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZURvbUFQSS5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydEZuIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qc1wiO1xuICAgICAgaW1wb3J0IHNldEF0dHJpYnV0ZXMgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRTdHlsZUVsZW1lbnQgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanNcIjtcbiAgICAgIGltcG9ydCBzdHlsZVRhZ1RyYW5zZm9ybUZuIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanNcIjtcbiAgICAgIGltcG9ydCBjb250ZW50LCAqIGFzIG5hbWVkRXhwb3J0IGZyb20gXCIhIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vbWFpbi5jc3NcIjtcbiAgICAgIFxuICAgICAgXG5cbnZhciBvcHRpb25zID0ge307XG5cbm9wdGlvbnMuc3R5bGVUYWdUcmFuc2Zvcm0gPSBzdHlsZVRhZ1RyYW5zZm9ybUZuO1xub3B0aW9ucy5zZXRBdHRyaWJ1dGVzID0gc2V0QXR0cmlidXRlcztcbm9wdGlvbnMuaW5zZXJ0ID0gaW5zZXJ0Rm4uYmluZChudWxsLCBcImhlYWRcIik7XG5vcHRpb25zLmRvbUFQSSA9IGRvbUFQSTtcbm9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50ID0gaW5zZXJ0U3R5bGVFbGVtZW50O1xuXG52YXIgdXBkYXRlID0gQVBJKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0ICogZnJvbSBcIiEhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9tYWluLmNzc1wiO1xuICAgICAgIGV4cG9ydCBkZWZhdWx0IGNvbnRlbnQgJiYgY29udGVudC5sb2NhbHMgPyBjb250ZW50LmxvY2FscyA6IHVuZGVmaW5lZDtcbiJdLCJuYW1lcyI6WyJfX19DU1NfTE9BREVSX0VYUE9SVF9fXyIsInB1c2giLCJtb2R1bGUiLCJpZCIsImV4cG9ydHMiLCJjc3NXaXRoTWFwcGluZ1RvU3RyaW5nIiwibGlzdCIsInRvU3RyaW5nIiwidGhpcyIsIm1hcCIsIml0ZW0iLCJjb250ZW50IiwibmVlZExheWVyIiwiY29uY2F0IiwibGVuZ3RoIiwiam9pbiIsImkiLCJtb2R1bGVzIiwibWVkaWEiLCJkZWR1cGUiLCJzdXBwb3J0cyIsImxheWVyIiwidW5kZWZpbmVkIiwiYWxyZWFkeUltcG9ydGVkTW9kdWxlcyIsImsiLCJfayIsImNzc01hcHBpbmciLCJidG9hIiwiYmFzZTY0IiwidW5lc2NhcGUiLCJlbmNvZGVVUklDb21wb25lbnQiLCJKU09OIiwic3RyaW5naWZ5IiwiZGF0YSIsInNvdXJjZU1hcHBpbmciLCJzdHlsZXNJbkRPTSIsImdldEluZGV4QnlJZGVudGlmaWVyIiwiaWRlbnRpZmllciIsInJlc3VsdCIsIm1vZHVsZXNUb0RvbSIsIm9wdGlvbnMiLCJpZENvdW50TWFwIiwiaWRlbnRpZmllcnMiLCJiYXNlIiwiY291bnQiLCJpbmRleEJ5SWRlbnRpZmllciIsIm9iaiIsImNzcyIsInNvdXJjZU1hcCIsInJlZmVyZW5jZXMiLCJ1cGRhdGVyIiwiYWRkRWxlbWVudFN0eWxlIiwiYnlJbmRleCIsInNwbGljZSIsImFwaSIsImRvbUFQSSIsInVwZGF0ZSIsIm5ld09iaiIsInJlbW92ZSIsImxhc3RJZGVudGlmaWVycyIsIm5ld0xpc3QiLCJpbmRleCIsIm5ld0xhc3RJZGVudGlmaWVycyIsIl9pIiwiX2luZGV4IiwibWVtbyIsImluc2VydCIsInN0eWxlIiwidGFyZ2V0Iiwic3R5bGVUYXJnZXQiLCJkb2N1bWVudCIsInF1ZXJ5U2VsZWN0b3IiLCJ3aW5kb3ciLCJIVE1MSUZyYW1lRWxlbWVudCIsImNvbnRlbnREb2N1bWVudCIsImhlYWQiLCJlIiwiZ2V0VGFyZ2V0IiwiRXJyb3IiLCJhcHBlbmRDaGlsZCIsImVsZW1lbnQiLCJjcmVhdGVFbGVtZW50Iiwic2V0QXR0cmlidXRlcyIsImF0dHJpYnV0ZXMiLCJzdHlsZUVsZW1lbnQiLCJub25jZSIsInNldEF0dHJpYnV0ZSIsImluc2VydFN0eWxlRWxlbWVudCIsInN0eWxlVGFnVHJhbnNmb3JtIiwiYXBwbHkiLCJwYXJlbnROb2RlIiwicmVtb3ZlQ2hpbGQiLCJyZW1vdmVTdHlsZUVsZW1lbnQiLCJzdHlsZVNoZWV0IiwiY3NzVGV4dCIsImZpcnN0Q2hpbGQiLCJjcmVhdGVUZXh0Tm9kZSIsImFkZEV2ZW50TGlzdGVuZXIiLCJkcmFnZ2VkSXRlbSIsImRyb3BMaW5lIiwiY2xhc3NMaXN0IiwiYWRkIiwiaGVpZ2h0IiwiZGlzcGxheSIsImNvbnRhaW5zIiwiY2xvc2VzdCIsInNldFRpbWVvdXQiLCJvcGFjaXR5IiwicmVtb3ZlQXR0cmlidXRlIiwicHJldmVudERlZmF1bHQiLCJib3VuZGluZyIsImdldEJvdW5kaW5nQ2xpZW50UmVjdCIsIm9mZnNldCIsInkiLCJjbGllbnRZIiwibmV4dEVsZW1lbnRTaWJsaW5nIiwiaW5zZXJ0QWRqYWNlbnRFbGVtZW50IiwicHJldmlvdXNFbGVtZW50U2libGluZyIsInBhcmVudEVsZW1lbnQiLCJpbnNlcnRCZWZvcmUiLCJ1bmRvU3RhY2siLCJyZWRvU3RhY2siLCJlZGl0b3IiLCJzYXZlU3RhdGUiLCJjdXJyZW50U3RhdGUiLCJpbm5lckhUTUwiLCJldmVudCIsImN0cmxLZXkiLCJrZXkiLCJzdGF0ZVRvUmVzdG9yZSIsInBvcCIsInVuZG8iLCJzdGF0ZVRvQXBwbHkiLCJyZWRvIiwiX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fIiwiX193ZWJwYWNrX3JlcXVpcmVfXyIsIm1vZHVsZUlkIiwiY2FjaGVkTW9kdWxlIiwiX193ZWJwYWNrX21vZHVsZXNfXyIsIm4iLCJnZXR0ZXIiLCJfX2VzTW9kdWxlIiwiZCIsImEiLCJkZWZpbml0aW9uIiwibyIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZW51bWVyYWJsZSIsImdldCIsInByb3AiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJuYyIsIkVsZW1lbnRGYWN0b3J5U2VydmljZSIsImNyZWF0b3JzIiwic3RhdGljIiwiQkxPQ0tfUEFSQUdSQVBIIiwiUEFSQUdSQVBIIiwiQ0hFQ0tCT1hfSVRFTSIsIkxJU1RfSVRFTSIsIkNPREUiLCJRVU9URSIsIkJVTExFVEVEX0xJU1QiLCJOVU1CRVJFRF9MSVNUIiwiQ0hFQ0tfTElTVCIsIkhFQURFUl8xIiwiSEVBREVSXzIiLCJIRUFERVJfMyIsIkhFQURFUl80IiwiSEVBREVSXzUiLCJIRUFERVJfNiIsIkRSQUdfSEFORExFX0JVVFRPTiIsIl9pbnN0YW5jZSIsInJlZ2lzdGVyIiwiRUxFTUVOVF9UWVBFUyIsImJsb2NrUGFyYWdyYXBoQ3JlYXRvciIsInBhcmFncmFwaENyZWF0b3IiLCJjaGVja2JveEl0ZW1DcmVhdG9yIiwibGlzdEl0ZW1DcmVhdG9yIiwiY29kZUNyZWF0b3IiLCJxdW90ZUNyZWF0b3IiLCJjaGVja0xpc3RDcmVhdG9yIiwiYnVsbGV0ZWRMaXN0Q3JlYXRvciIsIm51bWJlcmVkTGlzdENyZWF0b3IiLCJoZWFkaW5nQ3JlYXRvciIsImRyYWdIYW5kbGVCdXR0b25DcmVhdG9yIiwiZ2V0SW5zdGFuY2UiLCJ0eXBlIiwiY3JlYXRvciIsImNyZWF0ZSIsIlR5cGVFcnJvciIsImJsb2NrUGFyYWdyYXBoIiwicGFyYWdyYXBoIiwibGV2ZWwiLCJoZWFkaW5nIiwiY2hlY2tib3hJdGVtIiwibGlzdEl0ZW1fMiIsImRyYWdIYW5kbGVCdXR0b24iLCJwcmUiLCJjb2RlIiwidGV4dENvbnRlbnQiLCJjb250ZW50RWRpdGFibGUiLCJibG9ja3F1b3RlIiwidWwiLCJpbml0aWFsSXRlbSIsImxpc3RJdGVtIiwicCIsImlubmVyVGV4dCIsInRleHQiLCJoIiwibGkiLCJjaGVja2JveCIsInNwYW4iLCJuZXdEaXYiLCJuZXdFbGVtZW50IiwibmV3QnV0dG9uIiwiZHJhZ2dhYmxlIiwiYnV0dG9uIiwiQmxvY2tPcGVyYXRpb25zU2VydmljZSIsImVsZW1lbnRGYWN0b3J5U2VydmljZSIsIlRVUk5fSU5UTyIsIkNSRUFURV9ERUZBVUxUX0JMT0NLIiwiREVMRVRFX0ZPQ1VTX09OX1BSRVZJT1VTIiwiREVMRVRFX0ZPQ1VTX09OX05FWFQiLCJGT0NVU19PTl9GSVJTVCIsIkZPQ1VTX09OX1BSRVZJT1VTIiwiRk9DVVNfT05fTkVYVCIsIkRFTEVURSIsIkRVUExJQ0FURSIsIkNPUFkiLCJQQVNURSIsIkNVVCIsIlJFTU9WRV9GT1JNQVQiLCJUUkFOU0ZPUk1fQkxPQ0siLCJpbnN0YW5jZSIsImV4ZWNDb21tYW5kIiwiY29tbWFuZCIsInNob3dVSSIsInZhbHVlIiwiQkxPQ0tfT1BFUkFUSU9OUyIsImdldFNlbGVjdGlvbiIsIm5hdmlnYXRvciIsImNsaXBib2FyZCIsIndyaXRlVGV4dCIsInNlbGVjdGlvbiIsInNlbGVjdGVkVGV4dCIsInRoZW4iLCJjb3BpZWRFdmVudCIsIkN1c3RvbUV2ZW50IiwiYnViYmxlcyIsImNhbmNlbGFibGUiLCJkaXNwYXRjaEV2ZW50IiwiY2F0Y2giLCJlcnIiLCJjb25zb2xlIiwiZXJyb3IiLCJkZWxldGVGcm9tRG9jdW1lbnQiLCJoaWRlRXZlbnQiLCJyZWFkVGV4dCIsInBhc3RlZFRleHQiLCJyYW5nZUNvdW50IiwicmFuZ2UiLCJnZXRSYW5nZUF0IiwiZGVsZXRlQ29udGVudHMiLCJpbnNlcnROb2RlIiwic2VsZWN0aW9uRXZlbnQiLCJibG9jayIsImdldEN1cnJlbnRTZWxlY3RlZEJsb2NrIiwidHJhbnNmb3JtQmxvY2siLCJkZWxldGVBbmRGb2N1c09uTmV4dCIsImR1cGxpY2F0ZVNlbGVjdGVkQmxvY2siLCJhY3RpdmVFbGVtZW50IiwiY3JlYXRlRGVmYXVsdEJsb2NrIiwiZm9jdXMiLCJkZWxldGVBbmRGb2N1c09uUHJldmlvdXMiLCJmb2N1c09uUHJldmlvdXMiLCJmb2N1c09uTmV4dCIsImdldERyYWdnYWJsZUVsZW1lbnRGcm9tU2VsZWN0aW9uIiwiZm9ybWF0QmxvY2siLCJxdWVyeUNvbW1hbmRTdGF0ZSIsImNvbnRlbnRUeXBlIiwiY29udGVudEVsZW1lbnQiLCJuZXdDb250ZW50QmxvY2siLCJyZXBsYWNlQ2hpbGQiLCJjb21tb25BbmNlc3RvckNvbnRhaW5lciIsIm5vZGVUeXBlIiwiTm9kZSIsIlRFWFRfTk9ERSIsIkhUTUxFbGVtZW50IiwiYmxvY2tFbGVtZW50Iiwic3JjIiwiYWx0IiwiY3JlYXRlTmV3RWxlbWVudCIsImNyZWF0ZUxpc3RJdGVtIiwibmV3Q29udGVudEVsZW1lbnQiLCJldmVudFBhcmFncmFwaCIsIm5ld0Jsb2NrIiwiY3VycmVudEFjdGl2ZUVsZW1lbnQiLCJkZWxldGVUaGVDdXJyZW50RWxlbWVudEFuZFRoZURyYWdnYWJsZUJsb2NrSWZFbXB0eSIsImdldEN1cnJlbnRBY3RpdmVCbG9jayIsImFjdHVhbEVsZW1lbnQiLCJwb3NpdGlvbiIsImZvY3VzZWRFbGVtZW50IiwidGFnTmFtZSIsInRvVXBwZXJDYXNlIiwicHJldmlvdXNFbGVtZW50IiwiYXBwbHlDdXJzb3JYRW5kUG9zaXRpb24iLCJmb2N1c09uVGhlRW5kT2ZUaGVUZXh0IiwicGFyZW50Iiwic2libGluZyIsImZvY3VzYWJsZUNhbmRpZGF0ZXMiLCJxdWVyeVNlbGVjdG9yQWxsIiwibmV4dEVsZW1lbnQiLCJhcHBseUN1cnNvclhTdGFydFBvc2l0aW9uIiwiZm9jdXNPblRoZVN0YXJ0T2ZUaGVUZXh0IiwiY3VycmVudEVsZW1lbnQiLCJwYXJlbnRCbG9jayIsImFjdHVhbCIsInhQb3NpdGlvbiIsImNyZWF0ZVJhbmdlIiwiY3VycmVudE5vZGUiLCJsYXN0Q2hpbGQiLCJhZGp1c3RDdXJzb3JPZmZzZXQiLCJub2RlTmFtZSIsInByZXZpb3VzU2libGluZyIsImNsb3Nlc3ROb2RlIiwic2V0U3RhcnQiLCJjbG9zZXN0T2Zmc2V0IiwiY29sbGFwc2UiLCJyZW1vdmVBbGxSYW5nZXMiLCJhZGRSYW5nZSIsInNlbGVjdE5vZGVDb250ZW50cyIsIm5leHRTaWJsaW5nIiwibm9kZSIsImNsb3Nlc3REaWZmIiwiSW5maW5pdHkiLCJzZXRFbmQiLCJyZWN0IiwibGVmdERpZmYiLCJNYXRoIiwiYWJzIiwibGVmdCIsInJpZ2h0RGlmZiIsInJpZ2h0IiwibWluIiwiY29udGVudEJsb2NrIiwiRUxFTUVOVF9OT0RFIiwiZ2V0Q3VycmVudFNlbGVjdGVkRm9jdXNhYmxlIiwiY29udGFpbmVyIiwiY2xvbmUiLCJjbG9uZU5vZGUiLCJCYXNlVUlDb21wb25lbnQiLCJfY2FuSGlkZSIsInByb3BzIiwiaHRtbEVsZW1lbnQiLCJjb25zdHJ1Y3RvciIsImluaXQiLCJkb2N1bWVudEFwcGVuZFRvIiwiaXNWaXNpYmxlIiwidmlzaWJpbGl0eSIsImdldENvbXB1dGVkU3R5bGUiLCJzaG93IiwiaGlkZSIsIndhcm4iLCJjYW5IaWRlIiwiY2hhbmdlQ29sb3IiLCJjb2xvciIsInJlbW92ZUNvbG9yIiwiY2hhbmdlVmlzaWJpbGl0eVRvVmlzaWJsZSIsImNoYW5nZVZpc2liaWxpdHlUb0hpZGRlbiIsImRvZXNFbGVtZW50T3ZlcmZsb3dTY3JlZW4iLCJvcmlnaW5hbERpc3BsYXkiLCJvcmlnaW5hbFZpc2liaWxpdHkiLCJvcmlnaW5hbFBvc2l0aW9uIiwiZWxlbWVudFJlY3QiLCJzY3JlZW5XaWR0aCIsImlubmVyV2lkdGgiLCJRdWlja01lbnVFbXB0eSIsInN1cGVyIiwiaHRtbEVtcHR5SW5kaWNhdG9yIiwicGFkZGluZyIsIkJhc2VEb3VibHlMaW5rZWRMaXN0IiwidGFpbCIsImdldEZpcnN0IiwiZ2V0TGFzdCIsIlN5bWJvbCIsIml0ZXJhdG9yIiwiY3VycmVudCIsIm5leHROb2RlIiwiZm9yRWFjaCIsImNhbGxiYWNrIiwiYW55IiwicHJlZGljYXRlIiwiZmluZEZpcnN0IiwiZmluZExhc3QiLCJwcmV2aW91c05vZGUiLCJmaW5kIiwiSk5vZGUiLCJwYXJlbnRMaXN0Iiwic2V0TmV4dCIsInNldFByZXZpb3VzIiwiZ2V0TmV4dFNhdGlzZnlpbmciLCJzdGFydE5vZGUiLCJnZXRQcmV2aW91c1NhdGlzZnlpbmciLCJDaXJjdWxhckRvdWJseUxpbmtlZExpc3QiLCJhcHBlbmQiLCJTZXJ2aWNlTm90Rm91bmRFeGNlcHRpb24iLCJzZXJ2aWNlS2V5IiwibmFtZSIsIlNlcnZpY2VQcm92aWRlciIsInNlcnZpY2VzIiwiTWFwIiwiZ2V0SW5zdGFuY2VPZiIsInNlcnZpY2UiLCJyZWdpc3RlclNlcnZpY2UiLCJzZXQiLCJyZWdpc3RlclNlcnZpY2VzIiwicmVzZXQiLCJjbGVhciIsIlF1aWNrTWVudSIsImJsb2NrT3BlcmF0aW9uc1NlcnZpY2UiLCJjdXJyZW50Rm9jdXNlZE1lbnVJdGVtIiwiaHRtbEZvY3VzZWRFbGVtZW50QmVmb3JlT3BlblF1aWNrTWVudSIsIm1lbnVTZWN0aW9ucyIsInF1aWNrTWVudUVtcHR5IiwiZmlsdGVySW5wdXQiLCJibG9ja09wdGlvbnMiLCJhdHRhY2hFdmVudHMiLCJtZW51SXRlbSIsInN3aXRjaFZpc3VhbEZvY3VzIiwicmVtb3ZlRm9jdXMiLCJmb2N1c09uVGhlRmlyc3RWaXNpYmxlSXRlbSIsImZpcnN0U2VjdGlvbk5vZGUiLCJjdXJyZW50U2VjdGlvbk5vZGUiLCJpdGVtTm9kZSIsIm1lbnVJdGVtcyIsImZvY3VzUHJldmlvdXNWaXNpYmxlSXRlbSIsInByZXZpb3VzVmlzaWJsZUl0ZW0iLCJwcmV2aW91c1Zpc2libGVTZWN0aW9uTm9kZSIsInF1aWNrTWVudVNlY3Rpb25JbnN0YW5jZSIsInNlY3Rpb24iLCJsYXN0VmlzaWJsZVNlY3Rpb25Ob2RlIiwiZm9jdXNOZXh0VmlzaWJsZUl0ZW0iLCJuZXh0VmlzaWJsZUl0ZW0iLCJuZXh0VmlzaWJsZVNlY3Rpb25Ob2RlIiwiZmlyc3RWaXNpYmxlU2VjdGlvbk5vZGUiLCJmaWx0ZXJJdGVtcyIsImZpbHRlclNlY3Rpb24iLCJlbGVtZW50V2lkdGgiLCJvZmZzZXRXaWR0aCIsImxlZnRQb3NpdGlvbiIsInNjcm9sbFgiLCJlbGVtZW50SGVpZ2h0Iiwib2Zmc2V0SGVpZ2h0IiwidG9wUG9zaXRpb24iLCJ0b3AiLCJzY3JvbGxZIiwiYm90dG9tIiwicmVzdG9yZSIsInNoaWZ0S2V5IiwiYWx0S2V5IiwidGVzdCIsInJlbW92ZUxhc3RGaWx0ZXJJbnB1dENoYXJhY3RlciIsInN0b3BQcm9wYWdhdGlvbiIsImRhdGFUeXBlIiwiZ2V0QXR0cmlidXRlIiwidHJhbnNmb3JtSHRtbEZvY3VzZWRFbGVtZW50QmVmb3JlT3BlblF1aWNrTWVudSIsImNvbmNhdEZpbHRlcklucHV0IiwiYmxvY2tUeXBlIiwic3RnIiwidG9Mb3dlckNhc2UiLCJzbGljZSIsIkRvdWJseUxpbmtlZExpc3QiLCJRdWlja01lbnVTZWN0aW9uIiwicXVpY2tNZW51SW5zdGFuY2UiLCJ0aXRsZSIsImFwcGVuZFF1aWNrTWVudUl0ZW1zIiwiYXBwZW5kUXVpY2tNZW51SXRlbSIsImZpbHRlclZhbHVlIiwidG9Mb2NhbGVMb3dlckNhc2UiLCJpbmNsdWRlcyIsIlNWR0ljb24iLCJ1c2VFbGVtZW50IiwiaHJlZlVzZUlkIiwid2lkdGgiLCJjcmVhdGVFbGVtZW50TlMiLCJ1c2UiLCJzZXRBdHRyaWJ1dGVOUyIsInNldFVzZVRvIiwiUXVpY2tNZW51SXRlbSIsImRlc2NyaXB0aW9uIiwiU1ZHSHJlZlVzZUlkIiwib3B0aW9uSW1hZ2UiLCJzdmciLCJvcHRpb25UZXh0IiwiYmxvY2tUaXRsZSIsImJsb2NrRGVzY3JpcHRpb24iLCJRdWlja01lbnVCdWlsZGVyIiwiYnVpbGQiLCJxdWlja01lbnUiLCJiYXNpY0Jsb2Nrc1NlY3Rpb24iLCJoZWFkaW5nQmxvY2tzU2VjdGlvbiIsImxpc3RCbG9ja3NTZWN0aW9uIiwiRHJvcGRvd25NZW51IiwiZHJvcGRvd25CdXR0b24iLCJkcm9wZG93bkxpc3QiLCJUZXh0T3BlcmF0aW9uU2VydmljZSIsInNob3dVaSIsIlFVRVJZX1RFWFRfT1BFUkFUSU9OUyIsIklOTElORV9DT0RFIiwidG9nZ2xlQ29kZUV4ZWNDb21tYW5kIiwidiIsImdldEluaXRpYWxDb2xvckFzSGV4IiwiQ1JFQVRFX0xJTksiLCJnZXRTZWxlY3RlZEhUTUxFbGVtZW50Iiwic2hvd0lucHV0TGlua0JveCIsIkhJTElURV9DT0xPUiIsIkZPUkVfQ09MT1IiLCJVTkRFUkxJTkUiLCJxdWVyeUhpbGl0ZUNvbG9yIiwicXVlcnlGb3JlQ29sb3IiLCJjb250YWluZXJOb2RlIiwiY29kZUVsZW1lbnQiLCJyYW5nZU9mQ29kZSIsImNvbnRlbnRBc1N0cmluZyIsIlhNTFNlcmlhbGl6ZXIiLCJzZXJpYWxpemVUb1N0cmluZyIsImNsb25lQ29udGVudHMiLCJleHBlY3RlZENvbG9yIiwiZm9udENvbG9yIiwicmdiQ29sb3IiLCJyZ2JUb0hleCIsInNwYW5XaXRoQmFja2dyb3VuZCIsImJhY2tncm91bmRDb2xvciIsInJnYiIsIm1hdGNoIiwiTnVtYmVyIiwieCIsImhleCIsInRlbXBFbGVtZW50IiwiYm9keSIsImNvbXB1dGVkQ29sb3IiLCJnZXRUYXJnZXRFbGVtZW50TWFwIiwiZ2V0U2VsZWN0ZWRUZXh0Tm9kZXMiLCJ0ZXh0Tm9kZXMiLCJub2RlSXRlcmF0b3IiLCJjcmVhdGVOb2RlSXRlcmF0b3IiLCJOb2RlRmlsdGVyIiwiU0hPV19URVhUIiwiYWNjZXB0Tm9kZSIsImludGVyc2VjdHNOb2RlIiwiRklMVEVSX0FDQ0VQVCIsIkZJTFRFUl9SRUpFQ1QiLCJub2RlUmFuZ2UiLCJjb21wYXJlQm91bmRhcnlQb2ludHMiLCJSYW5nZSIsIkVORF9UT19TVEFSVCIsIlNUQVJUX1RPX0VORCIsImZpbmRDbG9zZXN0TWF0Y2hpbmdQYXJlbnQiLCJlbGVtIiwiY2xhc3NlcyIsImV2ZXJ5IiwiY2xzIiwiZXh0cmFjdFNlbGVjdGVkVGV4dCIsInRleHROb2RlIiwic3RhcnQiLCJlbmQiLCJzdGFydENvbnRhaW5lciIsInN0YXJ0T2Zmc2V0IiwiZW5kQ29udGFpbmVyIiwiZW5kT2Zmc2V0Iiwic3Vic3RyaW5nIiwiSW5wdXRMaW5rQm94IiwicGFyZW50V3JhcHBlciIsImF0dGFjaEV2ZW50IiwicGxhY2Vob2xkZXIiLCJzZXRQYXJlbnRXcmFwcGVyIiwidXJsIiwiSW5wdXRMaW5rQm94V3JhcHBlciIsImlucHV0TGlua0JveCIsImhpZ2hsaWdodHMiLCJoaWdobGlnaHRTZWxlY3RlZFRleHQiLCJyZW1vdmVIaWdobGlnaHRzIiwic2hvd0lucHV0TGlua0JveEZpbmlzaGVkIiwicmVjdHMiLCJnZXRDbGllbnRSZWN0cyIsImhpZ2hsaWdodCIsIlV0aWxzIiwiaXNTZWxlY3RlZFRleHREZXNjZW5kYW50T2YiLCJwYXJlbnRTZWxlY3RvciIsIkZsb2F0aW5nVG9vbGJhciIsImRyb3Bkb3ducyIsImN1cnJlbnRTZWxlY3Rpb25SYW5nZSIsImlucHV0TGlua0JveFdyYXBwZXIiLCJzZWxlY3RXcmFwcGVyIiwiZ2V0RWxlbWVudEJ5SWQiLCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJhcHBlbmREcm9wZG93biIsImRyb3Bkb3duIiwiYXBwZW5kU2VwYXJhdG9yIiwic2VwYXJhdG9yIiwiYXBwZW5kVGV4dFRvb2xiYXIiLCJhbnlEcm9wZG93blZpc2libGUiLCJoaWRlQWxsRHJvcGRvd25WaXNpYmxlIiwicmVzdG9yZVJhbmdlU2VsZWN0aW9uIiwiaXNTZWxlY3Rpb25FbXB0eSIsInRyaW0iLCJEcm9wZG93bk1lbnVMaXN0SXRlbSIsInRleHRPcGVyYXRpb25TZXJ2aWNlIiwiYWN0aXZlSWNvbiIsInBhcmVudERyb3Bkb3duTWVudUxpc3QiLCJ0ZXh0T3BlcmF0aW9uc1NlcnZpY2UiLCJsZWZ0SWNvbiIsInNob3J0Y3V0IiwiaWNvbiIsInRhYkluZGV4IiwidGV4dE9wdGlvbiIsInNob3J0Q3V0IiwicGVyZm9ybUFjdGlvbiIsImZvY3VzYWJsZVBhcmVudCIsIm5vcm1hbGl6ZUFuZE1lcmdlRWxlbWVudHMiLCJkcm9wZG93bkl0ZW1zIiwiY2hhbmdlQ2hlY2tJY29uVmlzaWJpbGl0eSIsImNoaWxkIiwic2hvdWxkTWVyZ2UiLCJuZXh0Iiwibm9ybWFsaXplIiwibm9kZTEiLCJub2RlMiIsImVsZW0xIiwiZWxlbTIiLCJEcm9wZG93bk1lbnVMaXN0IiwicGFyZW50RHJvcGRvd25QYXJlbnRCdXR0b24iLCJtYXhIZWlnaHQiLCJvdmVyZmxvd1kiLCJkcm9wZG93bkl0ZW0iLCJzZXRQYXJlbnREcm9wZG93bk1lbnVCdXR0b24iLCJkcm9wZG93blBhcmVudEJ1dHRvbiIsImNsaWNrZWRPdXRzaWRlVGhlRHJvcGRvd25XaGlsZURyb3Bkb3duSXNWaXNpYmxlIiwia2V5UHJlc3NlZE91dHNpZGVUaGVEcm9wZG93bldoaWxlRHJvcGRvd25Jc1Zpc2libGUiLCJzdmdJY29uIiwiRmxvYXRpbmdUb29sYmFyU2VwYXJhdG9yIiwiYm9yZGVyUmlnaHQiLCJtYXJnaW4iLCJHcm91cEJ1dHRvbiIsIm1hcmdpbkxlZnQiLCJtYXJnaW5SaWdodCIsIkdyb3VwZWRCdXR0b24iLCJjb21tYW5kU2VydmljZSIsInN2Z0ljb25JZCIsInJvbGUiLCJlZGl0YWJsZUVsZW1lbnQiLCJnZXRQYXJlbnRFZGl0YWJsZSIsImNoYW5nZUljb25Db2xvciIsImlzQ29sbGFwc2VkIiwiY29tbW9uQW5jZXN0b3IiLCJDb2xvckljb24iLCJib3JkZXJSYWRpdXMiLCJib3JkZXIiLCJib3hTaXppbmciLCJEcm9wZG93bk1lbnVCdXR0b24iLCJpbmNsdWRlQ2hldnJvbkljb24iLCJEcm9wZG93bk1lbnVMaXN0SXRlbVRpdGxlIiwiRmxvYXRpbmdUb29sYmFyQnVpbGRlciIsImZsb2F0aW5nQmFyIiwidHVybkludG9Ecm9wZG93biIsImdyb3VwQnV0dG9uIiwiY29sb3JEcm9wZG93biIsIm1vcmVPcHRpb25zRHJvcGRvd24iLCJ0dXJuSW50b0Jhckxpc3QiLCJ0dXJuSW50b0JhckJ1dHRvbiIsIlNWR0ljb25zIiwidG9kb19saXN0IiwiYl9saXN0Iiwibl9saXN0IiwicXVvdGUiLCJoZWFkMSIsImhlYWQyIiwiaGVhZDMiLCJoZWFkNCIsImhlYWQ1IiwiaGVhZDYiLCJjb2xvckRyb3Bkb3duTGlzdCIsImNvbG9yQnV0dG9uIiwibW9yZU9wdGlvbnNMaXN0IiwibW9yZU9wdGlvbnNCdXR0b24iLCJjb3B5IiwiY3V0IiwicGFzdGUiLCJkdXBsaWNhdGUiLCJlcmFzZXIiLCJkZWxldGUiLCJBZGRCbG9ja0J1dHRvbiIsIkFkZEJsb2NrIiwiYmxvY2tPcGVyYXRpb25TZXJ2aWNlIiwiQ29udGVudCIsImVkaXRvckNvbmZpZyIsImNvcHlFbGVtZW50SXRlbSIsImxvZyIsImdldE1vZGlmaWVyU3RhdGUiLCJpc051bVBhZCIsInN0YXJ0c1dpdGgiLCJudW1Mb2NrT24iLCJtZXRhS2V5IiwiYXN5bmMiLCJpc0N1cnNvckF0RW5kIiwiaXNDdXJzb3JBdFN0YXJ0IiwiaXNDdXJzb3JPbkxhc3RMaW5lIiwiaXNDdXJzb3JPbkZpcnN0TGluZSIsImVuZE5vZGUiLCJjb2xsYXBzZWQiLCJpc0F0Rmlyc3RWaXNpYmxlTGluZSIsImNsb25lUmFuZ2UiLCJpc0F0TGFzdFZpc2libGVMaW5lIiwiY2hpbGROb2RlcyIsImRpZEN1cnNvck1vdmUiLCJQcm9taXNlIiwicmVzb2x2ZSIsIm9yaWdpbmFsUmVjdCIsIm5ld1JlY3QiLCJkaWRNb3ZlIiwiVGl0bGUiLCJoMSIsIkVkaXRvciIsImVkaXRvcklkIiwiRWxlbWVudCIsImFwcGVuZERyYWdIYW5kbGVyIiwicmVhZHlTdGF0ZSIsImZpcnN0UGFyYWdyYXBoIiwiY2xpcGJvYXJkRGF0YSIsImdldERhdGEiLCJpbnNlcnRUZXh0QXRDdXJzb3IiLCJzZWwiLCJzZXRTdGFydEFmdGVyIiwic2V0RW5kQWZ0ZXIiLCJkcmFnSGFuZGxlciIsInByZXBlbmQiLCJyZW1vdmVEcmFnSGFuZGxlciIsImV4dHJhY3RDb250ZW50IiwiVUlCdWlsZGVyIiwiYWRkQmxvY2siLCJmbG9hdGluZ1Rvb2xiYXIiLCJhZGRCb2NrIiwic2VydmljZVByb3ZpZGVyIiwiYmxvY2tzIiwic3ZnQ29udGFpbmVyIiwiY2xhc3NOYW1lIiwibG9jYWxzIl0sInNvdXJjZVJvb3QiOiIifQ== \ No newline at end of file +(()=>{"use strict";var e={282:(e,t,n)=>{n.d(t,{A:()=>l});var o=n(354),i=n.n(o),r=n(314),s=n.n(r)()(i());s.push([e.id,'/** cursor style */\n[contenteditable="true"] {\n cursor: text !important;\n}\n\n\n\n/** CSS reset */\n\n.button-reset {\n border: none;\n margin: 0;\n padding: 0;\n width: auto;\n overflow: visible;\n background: transparent;\n color: inherit;\n font: inherit;\n line-height: normal;\n -webkit-font-smoothing: inherit;\n -moz-osx-font-smoothing: inherit;\n -webkit-appearance: none;\n}\n\n\n\n/** add block */\n.add-block {\n margin: 0;\n padding: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n border: 1px solid #000;\n background-color: white;\n transition: all 0.3s ease;\n box-sizing: border-box;\n margin-left: 1.3rem;\n}\n\n.add-block-wrapper {\n width: 100%;\n height: 3.125rem;\n}\n\n.add-block-wrapper:hover .add-block {\n display: flex;\n}\n\n/** and add block */\n\n\n\n/** List **/\nol.johannes-content-element,\nul.johannes-content-element {\n padding-left: 1rem !important;\n}\n\n\n\n.johannes-content-element li>button {\n /* display: none; */\n display: none;\n position: absolute;\n margin-left: 10px;\n top: 0;\n\n flex-direction: row;\n align-items: start;\n justify-content: start;\n\n}\n\n.johannes-content-element li {\n position: relative;\n}\n\n.johannes-content-element li::before {\n margin-left: 0.3125rem;\n}\n\n.johannes-content-element li:hover>button {\n /* display: inline-block; */\n display: inline-flex;\n\n}\n\np.johannes-content-element {\n display: inline-block;\n line-height: 1;\n margin: 0;\n padding: 0;\n}\n\n.johannes-content-element .checkbox-list {\n list-style-type: none;\n padding-left: 0 !important;\n}\n\n\n.johannes-content-element .checkbox-list li {\n display: flex;\n flex-direction: row;\n justify-content: left;\n}\n\n\n.johannes-content-element ul.checkbox-list input[type="checkbox"]:checked+span {\n text-decoration: line-through;\n}\n\n/* ul.johannes-content-element:not(.checkbox-list),\nol.johannes-content-element:not(.checkbox-list) {\n padding-left: 1.5rem !important;\n} */\n\n/** Add line through text decoration to checked checkboxes text div */\n.block input[type="checkbox"]:checked+div {\n text-decoration: line-through;\n}\n\n/** Remove the default list style and replace by another that works with display flex */\n.block ol,\n.block ul {\n list-style: none;\n}\n\n.block ul .list-item,\n.block ol .list-item {\n display: flex;\n flex-direction: row;\n align-items: center;\n}\n\n.block ol li {\n counter-increment: item;\n}\n\n.block ol li::before {\n content: counter(item) ". ";\n margin-right: 0.3125rem;\n}\n\n.block ul li:not(.list-item-checkable)::before {\n content: "• ";\n margin-right: 0.3125rem;\n}\n\n\n\n/** and list **/\n\n\n\n.block>.drag-handler {\n color: #84888d;\n visibility: hidden;\n cursor: grab;\n align-self: start;\n\n /* background-color: pink; */\n padding-top: 0.33rem;\n position: absolute;\n}\n\n.drag-handler svg {\n /* background-color: red; */\n}\n\n.drag-handler svg use {\n /* background-color: blue; */\n}\n\n.drag-handler:active {\n cursor: grabbing;\n}\n\n.block {\n display: flex;\n flex-direction: row;\n margin-bottom: 1rem;\n position: relative;\n max-width: 100%;\n}\n\n.block>*:not(.drag-handler) {\n padding-left: 1.25rem !important;\n}\n\n.block:hover .drag-handler {\n visibility: visible;\n vertical-align: top;\n justify-content: start;\n}\n\n.drop-line {\n height: 1rem;\n background-color: #84888d;\n width: 100%;\n}\n\n\n.title h1 {\n margin-left: 1.3rem;\n}\n\n\n[contenteditable="true"]:empty:focus {\n content: attr(data-placeholder);\n color: #84888d;\n pointer-events: none;\n}\n\nh1[data-placeholder]:empty:before {\n content: attr(data-placeholder);\n color: #84888d !important;\n display: block;\n}\n\nh1[data-placeholder]:focus:before {}\n\n\n*[contenteditable="true"]:not(h1):empty:before {\n content: attr(data-placeholder);\n color: #84888acd;\n display: none;\n}\n\n*[contenteditable="true"]:not(h1):empty:hover:before {\n display: block;\n}\n\ncite[contenteditable="true"]:empty:before {\n display: block;\n}\n\n*[contenteditable="true"]:not(h1)[data-placeholder]:empty:focus:before {\n content: attr(data-placeholder);\n color: #84888acd !important;\n display: block;\n}\n\n\n\nh1 {\n font-size: 2.5rem;\n font-weight: bolder !important;\n}\n\n.johannes-editor {\n width: 100%;\n\n}\n\n.content {\n width: 100%;\n box-sizing: border-box;\n /* background-color: red; */\n}\n\n.content .block .table-wrapper {\n overflow-x: auto;\n overflow-y: hidden;\n}\n\n\npre {\n width: 100%;\n}\n\n[contenteditable] {\n outline: none;\n}\n\nbody {\n height: 2000px;\n background-color: #f0f0f1 !important;\n\n font-family: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";\n}\n\n\n.editor {\n display: flex;\n margin-top: 80px;\n}\n\np {\n color: #242424;\n}\n\n\n.block,\n.block * {\n user-select: text;\n}\n\n\n.johannes-content-element {\n width: 100%;\n padding: 0;\n margin: 0;\n /* background-color: green; */\n}\n\n\n#johannesEditor {\n width: 60%;\n margin-left: auto;\n margin-right: auto;\n}\n\n.johannes-editor hr {\n width: 100%;\n height: 2px;\n visibility: visible;\n border: none;\n border-bottom: 1px solid rgba(55, 53, 47, 0.16);\n}\n\n\n\n.johannes-editor blockquote {\n margin: 0.5rem 0;\n padding-left: 20px;\n border-left: 4px solid rgb(55, 53, 47);\n font-style: italic\n}\n\n.johannes-editor cite {\n padding-top: 1rem !important;\n display: inline-block;\n}\n\n\n.johannes-editor cite::before {\n content: \'— \';\n}\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n#linkBox {\n border-radius: 2px;\n padding: 20px;\n background-color: #f9f9f9;\n\n\n box-shadow:\n 0 4px 6px rgba(0, 0, 0, 0.1),\n 0 -2px 4px rgba(0, 0, 0, 0.02),\n -2px 0 4px rgba(0, 0, 0, 0.02),\n 2px 0 4px rgba(0, 0, 0, 0.02);\n\n\n border: 1px solid #d0d0d0;\n width: fit-content;\n z-index: 999999;\n color: rgb(120, 119, 116);\n border-radius: none;\n}\n\n\n#linkBox input {\n width: 316px;\n padding: 8px 40px 8px 16px;\n /* border-color: #d0d0d0; */\n\n border: 1px solid #949494;\n /* border-radius: 4px; */\n height: 24px;\n\n display: flex;\n flex-direction: row;\n justify-content: center;\n align-items: center;\n}\n\n\n#linkBox input::selection,\n#linkBox input:focus {\n border-radius: none;\n}\n\n/** soft-box-shadow class */\n.soft-box-shadow {\n margin: 0;\n padding: 0;\n border-radius: 2px;\n box-shadow:\n 0 4px 6px rgba(0, 0, 0, 0.1),\n 0 -2px 4px rgba(216, 196, 196, 0.02),\n -2px 0 4px rgba(0, 0, 0, 0.02),\n 2px 0 4px rgba(0, 0, 0, 0.02);\n\n border: 1px solid #d0d0d0;\n}\n\n/** and soft-box-shadow */\n\n\n/** selection-wrapper class */\n.select-wrapper {\n display: flex;\n flex-direction: row;\n align-items: center;\n}\n\n.select-wrapper ul {\n position: absolute;\n background: #f9f9f9;\n flex-direction: column;\n width: fit-content;\n padding-bottom: 0.5rem;\n padding-left: 5px;\n padding-right: 5px;\n top: 2.2rem;\n color: rgb(55, 53, 47);\n padding-right: 0.3125rem;\n}\n\n.select-wrapper ul li {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 0.625rem;\n padding: 0.1875rem 0.3125rem;\n border-radius: 0.1875rem;\n user-select: none !important;\n font-size: small !important;\n font-weight: 500;\n}\n\n.select-wrapper ul li span {\n display: inline-block;\n width: max-content;\n}\n\n.select-wrapper ul li .option-image {\n width: 1.375rem;\n height: 1.375rem;\n color: #242424;\n padding: 0 !important;\n margin: 0 !important;\n}\n\n.select-wrapper ul li .option-image svg {\n color: #4f4f4f;\n padding: 0 !important;\n margin: 0 !important;\n}\n\n.select-wrapper {\n position: relative;\n color: rgb(120, 119, 116);\n}\n\n.select-wrapper>button {\n color: rgba(55, 53, 47, 0.85);\n}\n\n.select-wrapper ul li>h3 {\n margin: 0;\n font-size: small !important;\n color: #37352fa6;\n margin: 0;\n padding: 0;\n font-weight: 600 !important;\n margin-top: 0.3125rem;\n margin-bottom: 0.3125rem;\n}\n\n/** end selection wrapper **/\n\n\n\n/** Text formatting Bar **/\n\n\n\n.floating-toolbar {\n justify-content: space-between;\n padding: 8px 16px;\n background-color: #f9f9f9;\n width: fit-content;\n z-index: 999999;\n position: absolute;\n user-select: none;\n}\n\n/* TODO: remove this*/\nspan {\n font-family: Arial, sans-serif;\n}\n\n\n.floating-toolbar .item {\n color: rgb(120, 119, 116);\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.floating-toolbar .item>button {\n\n display: inline-flex;\n align-items: center;\n}\n\n\n.floating-toolbar select {\n color: rgb(120, 119, 116);\n border: none;\n font-size: 0.85rem;\n background-color: inherit;\n}\n\n.text-formatting-select-button {\n display: flex;\n flex-direction: row;\n align-items: center;\n}\n\n#turnIntoButton span {\n display: inline-flex;\n flex-direction: row;\n justify-content: center;\n align-items: center;\n font-size: 0.9rem;\n\n}\n\n#turnIntoButton svg use {\n margin: auto;\n}\n\ncode:not(pre code) {\n margin: 0;\n padding: 0;\n background-color: #d0d0d0;\n background-color: #f6f5f4;\n font-size: inherit;\n font-size: 1rem !important;\n border: 1px solid #0000001a;\n padding: 0 3px;\n display: inline-block;\n border-radius: 4px;\n box-sizing: border-box;\n}\n\n\n\n\n/* a:not([href]) {\n background-color: #d3e3fd;\n} */\n\n.text-formatting-button-active {\n color: #2382e2;\n}\n\n.text-formatting-circle-active {\n border-color: #2382e2 !important;\n}\n\n\n\n#moreTextOptionSelect {\n position: absolute;\n}\n\n.moreTextOptionWrapper {\n position: relative;\n}\n\n\n.bgc-red {\n background-color: #FDDEDE;\n}\n\n.bgc-green {\n background-color: #D7F7DC;\n}\n\n.bgc-blue {\n background-color: #D9EDF6;\n}\n\n.bgc-yellow {\n background-color: #FAF4D1;\n}\n\n.bgc-grey {\n background-color: #E1E0E0;\n}\n\np,\nmark {\n line-height: 1;\n}\n\n#turnIntoSelect .option-image {\n /* display: none !important; */\n}\n\n.border-less-image {\n width: 24px;\n height: 24px;\n}\n\n\n\n\n/** Block Options **/\n\n.block-options-wrapper {\n z-index: 999999;\n position: absolute;\n display: none;\n}\n\n.block-options {\n width: fit-content;\n max-height: 19rem;\n overflow-y: auto;\n}\n\n.block-options {\n padding: 0 0.625rem;\n background: #f9f9f9;\n}\n\n.block-options section h2 {\n font-size: small !important;\n color: #37352fa6;\n margin: 0;\n padding: 0;\n font-weight: 600 !important;\n margin-top: 0.3125rem;\n margin-bottom: 0.3125rem;\n padding-left: 0.3125rem;\n}\n\n.block-options .option {\n padding: 0.3125rem 0.625rem;\n margin: 0.3125rem 0;\n cursor: pointer;\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: left;\n gap: 0.6rem;\n border-radius: 3px;\n}\n\n.block-options .option:focus {\n outline: none;\n background-color: #e9e9e9;\n border: inherit;\n}\n\n.option-focused {\n outline: none;\n background-color: #e9e9e9;\n border: none;\n}\n\n.danger-option.option-focused,\n.danger-option.option-focused svg {\n color: #EB5757 !important;\n}\n\n\n\n.block-options .option:focus-visible {\n outline: none;\n background-color: #e9e9e9;\n border: inherit;\n}\n\n/* .option-hover:hover {\n background-color: #e9e9e9;\n box-shadow: 0px 0px 0px 2px #e9e9e9;\n border-radius: 1px;\n transition: 0.1s ease;\n} */\n\n/* .select-wrapper>button, */\n\n/* #turnIntoButton,\n#colorTextButton {\n padding-left: 4px;\n} */\n\n#colorTextButton {\n margin-left: 0.625rem;\n}\n\n#turnIntoButton:not([disabled]):hover,\n#colorTextButton:not([disabled]):hover,\n#moreTextOptionButton:not([disabled]):hover,\n.floating-toolbar .item>button:not([disabled]):hover {\n background-color: #e9e9e9;\n box-shadow: 0px 0px 0px 2px #e9e9e9;\n border-radius: 1px;\n transition: 0.1s ease;\n}\n\n\n\n.option[focused="true"] {\n background-color: #bde4ff;\n}\n\n\n\n\n\n.option-image {\n width: 2.875rem;\n height: 2.875rem;\n border-radius: 0.1875rem;\n border: 1px solid #ccc;\n color: #4f4f4f;\n\n display: flex;\n flex-direction: row;\n justify-content: center;\n vertical-align: middle;\n align-items: center;\n background-color: #ffff;\n box-sizing: border-box;\n}\n\n.option-image img {\n max-width: 2.875rem;\n max-height: 2.875rem;\n}\n\n.option-image svg {\n margin: 0;\n padding: 0;\n padding: 0.625rem;\n box-sizing: border-box;\n\n}\n\n.option-text * {\n margin: 0;\n padding: 0;\n\n}\n\n.option-text .block-title {\n font-size: small !important;\n font-weight: 500;\n}\n\n.option-text .block-description {\n font-size: small !important;\n color: rgba(55, 53, 47, 0.5);\n}\n\n/** End Block Options **/\n\n\n\n#deleteBlockButton:hover svg,\n#deleteBlockButton:hover {\n color: rgb(235, 87, 87) !important;\n}\n\n\n\n.johannes-editor *::selection {\n /* background-color: rgba(211, 227, 253, 0.5) !important; */\n\n background-color: red;\n\n background-color: hsl(210 75% 50% / 1);\n color: white;\n}\n\n.johannes-editor mark,\n.johannes-editor * {\n line-height: 1.5 !important;\n}\n\n.option {\n justify-content: space-between;\n}\n\n.text-option {\n display: flex;\n flex-direction: row;\n justify-content: start;\n align-items: center;\n gap: 0.625rem;\n}\n\n\n\n\n:root {\n /* font-size: 16px; */\n /* Tamanho padrão */\n}\n\n/* Para telas com densidade média */\n@media only screen and (-webkit-min-device-pixel-ratio: 2),\nonly screen and (min--moz-device-pixel-ratio: 2),\nonly screen and (min-resolution: 192dpi),\nonly screen and (min-resolution: 2dppx) {\n :root {\n font-size: 18px;\n /* Aumenta o tamanho da fonte para telas de alta densidade */\n }\n}\n\n/* Para telas com altíssima densidade */\n@media only screen and (-webkit-min-device-pixel-ratio: 3),\nonly screen and (min--moz-device-pixel-ratio: 3),\nonly screen and (min-resolution: 288dpi),\nonly screen and (min-resolution: 3dppx) {\n :root {\n font-size: 20px;\n /* Ainda maior para telas de densidade muito alta */\n }\n}\n\n\n\n\n\n\n\n\n\n\n\ntable.johannes-content-element {\n border-collapse: collapse;\n max-width: inherit;\n width: auto;\n display: flex;\n box-sizing: border-box !important;\n}\n\ntable.johannes-content-element th,\ntable.johannes-content-element td {\n min-height: 20px;\n}\n\ntable.johannes-content-element th,\ntable.johannes-content-element td {\n border: 1px solid #84888d;\n padding: 8px;\n text-align: left;\n align-items: start;\n overflow-wrap: break-word;\n word-wrap: break-word;\n white-space: normal;\n vertical-align: top;\n min-width: 100px;\n max-width: 200px;\n /* box-sizing: border-box !important; */\n\n transition: border 100ms ease-out, box-shadow 100ms ease-out;\n\n}\n\ntable.johannes-content-element td.selected,\ntable.johannes-content-element td:focus {\n outline: none;\n box-shadow: 0 0 0 1px #74b6db inset;\n border: 1px double #74b6db;\n\n}\n\ntd {\n min-height: 1rem !important;\n line-height: 1rem;\n}\n\ntd::placeholder {\n display: block;\n}\n\ntd:empty:before {\n content: attr(data-placeholder);\n color: #84888acd;\n display: block !important;\n opacity: 0;\n}\n\n.table-wrapper {\n width: 100%;\n}\n\n.table-controller {\n position: relative;\n max-width: 100%;\n}\n\n.add-table-row {\n background-color: rgba(55, 53, 47, 0.06);\n width: 100%;\n padding: 0;\n margin: 0;\n margin-top: 0.375rem;\n display: flex;\n justify-content: center;\n align-items: center;\n text-align: center;\n height: 1rem;\n cursor: pointer;\n opacity: 0;\n user-select: none;\n}\n\n.add-table-column {\n position: absolute;\n right: -1.3125rem;\n background-color: rgba(55, 53, 47, 0.06);\n width: 1rem;\n padding: 0;\n margin: 0;\n display: flex;\n justify-content: center;\n align-items: center;\n text-align: center;\n height: 100%;\n top: 0;\n cursor: pointer;\n height: calc(100% - 1rem - 5px);\n opacity: 0;\n user-select: none;\n}\n\n.add-table-column:hover {\n opacity: 1;\n}\n\n.add-table-row:hover {\n opacity: 1;\n}\n\n.table-shell {\n max-width: 100%;\n}\n\n\n\n.table-option {\n background-color: white;\n width: fit-content;\n justify-content: space-between;\n padding: 8px 16px;\n background-color: #f9f9f9;\n width: fit-content;\n z-index: 999999;\n position: absolute;\n user-select: none;\n padding: 8px 16px;\n display: none;\n}\n\n\n\n\n/** Callout **/\n.callout:hover .options-button {\n display: block !important;\n}\n\n\n.no-selection {\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n}\n\n\n/** upload/embed **/\n\n.tab-container {\n font-size: 0.86rem;\n display: flex;\n flex-direction: column;\n transition: 0.1s ease;\n\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n\n transition: visibility 0.2s ease;\n\n}\n\n.nav-underline {\n margin: 0;\n padding: 0;\n border-bottom: 1px solid rgba(55, 53, 47, 0.16);\n padding: 10px 20px;\n}\n\n.nav-underline .nav-item {\n display: flex;\n margin-right: 15px;\n}\n\n.nav-underline .nav-link {\n cursor: pointer;\n text-decoration: none;\n color: rgb(55, 53, 47);\n color: rgba(55, 53, 47, 0.5);\n transition: 0.1s ease;\n}\n\n\n.nav-item.active .nav-link {\n color: #000;\n}\n\n.tab-content .content-data {\n display: none;\n padding: 20px;\n border-top: none;\n transition: 0.1s ease;\n}\n\n.tab-content .content-data.active {\n display: flex;\n flex-direction: column;\n text-align: center;\n gap: 1rem;\n}\n\n.tab-content .text-info {\n font-size: 0.75rem;\n color: rgba(55, 53, 47, 0.6);\n}\n\n.nav-underline .nav-item {\n display: inline;\n}\n\n\n.tab-container {\n width: fit-content;\n background-color: rgb(249, 249, 249);\n position: absolute;\n\n}\n\n.embed-content input {\n width: 20rem;\n border: 1px solid rgba(55, 53, 47, 0.16);\n height: 1.5rem;\n border-radius: 4px;\n padding-left: 10px;\n}\n\n\n.upload-content label {\n display: block;\n border: 1px solid rgba(55, 53, 47, 0.16);\n border-radius: 4px;\n width: 20rem;\n text-align: center;\n padding: 4px;\n color: rgb(55, 53, 47);\n background-color: #fff;\n /* transition: 0.1s ease; */\n}\n\n.upload-content label:hover {\n background-color: #eeeeee;\n}\n\n\n\n\n\n\n\n\n\n\n/* Estilo para as alças de redimensionamento */\n.resize-handle {\n position: absolute;\n width: 10px;\n height: 10px;\n background: rgba(0, 0, 0, 0.5);\n cursor: nwse-resize;\n /* Cursor de redimensionamento diagonal */\n}\n\n.resize-handle.se {\n bottom: 0;\n right: 0;\n}\n\n\n\n\n.embed-container {\n position: relative;\n width: 100%;\n padding-bottom: 56.25%;\n /* Proporção 16:9 */\n height: 0;\n overflow: hidden;\n}\n\n.embed-container iframe {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n}\n\n\n\n.video-container {\n position: relative;\n width: 100%;\n padding-bottom: 56.25%;\n /* Proporção 16:9 */\n height: 0;\n overflow: hidden;\n}\n\n.video-container iframe {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n}\n\n\n\n\n\n\n\n.resizable {\n resize: horizontal;\n overflow: auto;\n cursor: nesw-resize;\n}\n\n.background {\n background-color: #e7e6e3;\n}',"",{version:3,sources:["webpack://./src/assets/css/main.css"],names:[],mappings:"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",sourcesContent:['/** cursor style */\n[contenteditable="true"] {\n cursor: text !important;\n}\n\n\n\n/** CSS reset */\n\n.button-reset {\n border: none;\n margin: 0;\n padding: 0;\n width: auto;\n overflow: visible;\n background: transparent;\n color: inherit;\n font: inherit;\n line-height: normal;\n -webkit-font-smoothing: inherit;\n -moz-osx-font-smoothing: inherit;\n -webkit-appearance: none;\n}\n\n\n\n/** add block */\n.add-block {\n margin: 0;\n padding: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n border: 1px solid #000;\n background-color: white;\n transition: all 0.3s ease;\n box-sizing: border-box;\n margin-left: 1.3rem;\n}\n\n.add-block-wrapper {\n width: 100%;\n height: 3.125rem;\n}\n\n.add-block-wrapper:hover .add-block {\n display: flex;\n}\n\n/** and add block */\n\n\n\n/** List **/\nol.johannes-content-element,\nul.johannes-content-element {\n padding-left: 1rem !important;\n}\n\n\n\n.johannes-content-element li>button {\n /* display: none; */\n display: none;\n position: absolute;\n margin-left: 10px;\n top: 0;\n\n flex-direction: row;\n align-items: start;\n justify-content: start;\n\n}\n\n.johannes-content-element li {\n position: relative;\n}\n\n.johannes-content-element li::before {\n margin-left: 0.3125rem;\n}\n\n.johannes-content-element li:hover>button {\n /* display: inline-block; */\n display: inline-flex;\n\n}\n\np.johannes-content-element {\n display: inline-block;\n line-height: 1;\n margin: 0;\n padding: 0;\n}\n\n.johannes-content-element .checkbox-list {\n list-style-type: none;\n padding-left: 0 !important;\n}\n\n\n.johannes-content-element .checkbox-list li {\n display: flex;\n flex-direction: row;\n justify-content: left;\n}\n\n\n.johannes-content-element ul.checkbox-list input[type="checkbox"]:checked+span {\n text-decoration: line-through;\n}\n\n/* ul.johannes-content-element:not(.checkbox-list),\nol.johannes-content-element:not(.checkbox-list) {\n padding-left: 1.5rem !important;\n} */\n\n/** Add line through text decoration to checked checkboxes text div */\n.block input[type="checkbox"]:checked+div {\n text-decoration: line-through;\n}\n\n/** Remove the default list style and replace by another that works with display flex */\n.block ol,\n.block ul {\n list-style: none;\n}\n\n.block ul .list-item,\n.block ol .list-item {\n display: flex;\n flex-direction: row;\n align-items: center;\n}\n\n.block ol li {\n counter-increment: item;\n}\n\n.block ol li::before {\n content: counter(item) ". ";\n margin-right: 0.3125rem;\n}\n\n.block ul li:not(.list-item-checkable)::before {\n content: "• ";\n margin-right: 0.3125rem;\n}\n\n\n\n/** and list **/\n\n\n\n.block>.drag-handler {\n color: #84888d;\n visibility: hidden;\n cursor: grab;\n align-self: start;\n\n /* background-color: pink; */\n padding-top: 0.33rem;\n position: absolute;\n}\n\n.drag-handler svg {\n /* background-color: red; */\n}\n\n.drag-handler svg use {\n /* background-color: blue; */\n}\n\n.drag-handler:active {\n cursor: grabbing;\n}\n\n.block {\n display: flex;\n flex-direction: row;\n margin-bottom: 1rem;\n position: relative;\n max-width: 100%;\n}\n\n.block>*:not(.drag-handler) {\n padding-left: 1.25rem !important;\n}\n\n.block:hover .drag-handler {\n visibility: visible;\n vertical-align: top;\n justify-content: start;\n}\n\n.drop-line {\n height: 1rem;\n background-color: #84888d;\n width: 100%;\n}\n\n\n.title h1 {\n margin-left: 1.3rem;\n}\n\n\n[contenteditable="true"]:empty:focus {\n content: attr(data-placeholder);\n color: #84888d;\n pointer-events: none;\n}\n\nh1[data-placeholder]:empty:before {\n content: attr(data-placeholder);\n color: #84888d !important;\n display: block;\n}\n\nh1[data-placeholder]:focus:before {}\n\n\n*[contenteditable="true"]:not(h1):empty:before {\n content: attr(data-placeholder);\n color: #84888acd;\n display: none;\n}\n\n*[contenteditable="true"]:not(h1):empty:hover:before {\n display: block;\n}\n\ncite[contenteditable="true"]:empty:before {\n display: block;\n}\n\n*[contenteditable="true"]:not(h1)[data-placeholder]:empty:focus:before {\n content: attr(data-placeholder);\n color: #84888acd !important;\n display: block;\n}\n\n\n\nh1 {\n font-size: 2.5rem;\n font-weight: bolder !important;\n}\n\n.johannes-editor {\n width: 100%;\n\n}\n\n.content {\n width: 100%;\n box-sizing: border-box;\n /* background-color: red; */\n}\n\n.content .block .table-wrapper {\n overflow-x: auto;\n overflow-y: hidden;\n}\n\n\npre {\n width: 100%;\n}\n\n[contenteditable] {\n outline: none;\n}\n\nbody {\n height: 2000px;\n background-color: #f0f0f1 !important;\n\n font-family: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";\n}\n\n\n.editor {\n display: flex;\n margin-top: 80px;\n}\n\np {\n color: #242424;\n}\n\n\n.block,\n.block * {\n user-select: text;\n}\n\n\n.johannes-content-element {\n width: 100%;\n padding: 0;\n margin: 0;\n /* background-color: green; */\n}\n\n\n#johannesEditor {\n width: 60%;\n margin-left: auto;\n margin-right: auto;\n}\n\n.johannes-editor hr {\n width: 100%;\n height: 2px;\n visibility: visible;\n border: none;\n border-bottom: 1px solid rgba(55, 53, 47, 0.16);\n}\n\n\n\n.johannes-editor blockquote {\n margin: 0.5rem 0;\n padding-left: 20px;\n border-left: 4px solid rgb(55, 53, 47);\n font-style: italic\n}\n\n.johannes-editor cite {\n padding-top: 1rem !important;\n display: inline-block;\n}\n\n\n.johannes-editor cite::before {\n content: \'— \';\n}\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n#linkBox {\n border-radius: 2px;\n padding: 20px;\n background-color: #f9f9f9;\n\n\n box-shadow:\n 0 4px 6px rgba(0, 0, 0, 0.1),\n 0 -2px 4px rgba(0, 0, 0, 0.02),\n -2px 0 4px rgba(0, 0, 0, 0.02),\n 2px 0 4px rgba(0, 0, 0, 0.02);\n\n\n border: 1px solid #d0d0d0;\n width: fit-content;\n z-index: 999999;\n color: rgb(120, 119, 116);\n border-radius: none;\n}\n\n\n#linkBox input {\n width: 316px;\n padding: 8px 40px 8px 16px;\n /* border-color: #d0d0d0; */\n\n border: 1px solid #949494;\n /* border-radius: 4px; */\n height: 24px;\n\n display: flex;\n flex-direction: row;\n justify-content: center;\n align-items: center;\n}\n\n\n#linkBox input::selection,\n#linkBox input:focus {\n border-radius: none;\n}\n\n/** soft-box-shadow class */\n.soft-box-shadow {\n margin: 0;\n padding: 0;\n border-radius: 2px;\n box-shadow:\n 0 4px 6px rgba(0, 0, 0, 0.1),\n 0 -2px 4px rgba(216, 196, 196, 0.02),\n -2px 0 4px rgba(0, 0, 0, 0.02),\n 2px 0 4px rgba(0, 0, 0, 0.02);\n\n border: 1px solid #d0d0d0;\n}\n\n/** and soft-box-shadow */\n\n\n/** selection-wrapper class */\n.select-wrapper {\n display: flex;\n flex-direction: row;\n align-items: center;\n}\n\n.select-wrapper ul {\n position: absolute;\n background: #f9f9f9;\n flex-direction: column;\n width: fit-content;\n padding-bottom: 0.5rem;\n padding-left: 5px;\n padding-right: 5px;\n top: 2.2rem;\n color: rgb(55, 53, 47);\n padding-right: 0.3125rem;\n}\n\n.select-wrapper ul li {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 0.625rem;\n padding: 0.1875rem 0.3125rem;\n border-radius: 0.1875rem;\n user-select: none !important;\n font-size: small !important;\n font-weight: 500;\n}\n\n.select-wrapper ul li span {\n display: inline-block;\n width: max-content;\n}\n\n.select-wrapper ul li .option-image {\n width: 1.375rem;\n height: 1.375rem;\n color: #242424;\n padding: 0 !important;\n margin: 0 !important;\n}\n\n.select-wrapper ul li .option-image svg {\n color: #4f4f4f;\n padding: 0 !important;\n margin: 0 !important;\n}\n\n.select-wrapper {\n position: relative;\n color: rgb(120, 119, 116);\n}\n\n.select-wrapper>button {\n color: rgba(55, 53, 47, 0.85);\n}\n\n.select-wrapper ul li>h3 {\n margin: 0;\n font-size: small !important;\n color: #37352fa6;\n margin: 0;\n padding: 0;\n font-weight: 600 !important;\n margin-top: 0.3125rem;\n margin-bottom: 0.3125rem;\n}\n\n/** end selection wrapper **/\n\n\n\n/** Text formatting Bar **/\n\n\n\n.floating-toolbar {\n justify-content: space-between;\n padding: 8px 16px;\n background-color: #f9f9f9;\n width: fit-content;\n z-index: 999999;\n position: absolute;\n user-select: none;\n}\n\n/* TODO: remove this*/\nspan {\n font-family: Arial, sans-serif;\n}\n\n\n.floating-toolbar .item {\n color: rgb(120, 119, 116);\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.floating-toolbar .item>button {\n\n display: inline-flex;\n align-items: center;\n}\n\n\n.floating-toolbar select {\n color: rgb(120, 119, 116);\n border: none;\n font-size: 0.85rem;\n background-color: inherit;\n}\n\n.text-formatting-select-button {\n display: flex;\n flex-direction: row;\n align-items: center;\n}\n\n#turnIntoButton span {\n display: inline-flex;\n flex-direction: row;\n justify-content: center;\n align-items: center;\n font-size: 0.9rem;\n\n}\n\n#turnIntoButton svg use {\n margin: auto;\n}\n\ncode:not(pre code) {\n margin: 0;\n padding: 0;\n background-color: #d0d0d0;\n background-color: #f6f5f4;\n font-size: inherit;\n font-size: 1rem !important;\n border: 1px solid #0000001a;\n padding: 0 3px;\n display: inline-block;\n border-radius: 4px;\n box-sizing: border-box;\n}\n\n\n\n\n/* a:not([href]) {\n background-color: #d3e3fd;\n} */\n\n.text-formatting-button-active {\n color: #2382e2;\n}\n\n.text-formatting-circle-active {\n border-color: #2382e2 !important;\n}\n\n\n\n#moreTextOptionSelect {\n position: absolute;\n}\n\n.moreTextOptionWrapper {\n position: relative;\n}\n\n\n.bgc-red {\n background-color: #FDDEDE;\n}\n\n.bgc-green {\n background-color: #D7F7DC;\n}\n\n.bgc-blue {\n background-color: #D9EDF6;\n}\n\n.bgc-yellow {\n background-color: #FAF4D1;\n}\n\n.bgc-grey {\n background-color: #E1E0E0;\n}\n\np,\nmark {\n line-height: 1;\n}\n\n#turnIntoSelect .option-image {\n /* display: none !important; */\n}\n\n.border-less-image {\n width: 24px;\n height: 24px;\n}\n\n\n\n\n/** Block Options **/\n\n.block-options-wrapper {\n z-index: 999999;\n position: absolute;\n display: none;\n}\n\n.block-options {\n width: fit-content;\n max-height: 19rem;\n overflow-y: auto;\n}\n\n.block-options {\n padding: 0 0.625rem;\n background: #f9f9f9;\n}\n\n.block-options section h2 {\n font-size: small !important;\n color: #37352fa6;\n margin: 0;\n padding: 0;\n font-weight: 600 !important;\n margin-top: 0.3125rem;\n margin-bottom: 0.3125rem;\n padding-left: 0.3125rem;\n}\n\n.block-options .option {\n padding: 0.3125rem 0.625rem;\n margin: 0.3125rem 0;\n cursor: pointer;\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: left;\n gap: 0.6rem;\n border-radius: 3px;\n}\n\n.block-options .option:focus {\n outline: none;\n background-color: #e9e9e9;\n border: inherit;\n}\n\n.option-focused {\n outline: none;\n background-color: #e9e9e9;\n border: none;\n}\n\n.danger-option.option-focused,\n.danger-option.option-focused svg {\n color: #EB5757 !important;\n}\n\n\n\n.block-options .option:focus-visible {\n outline: none;\n background-color: #e9e9e9;\n border: inherit;\n}\n\n/* .option-hover:hover {\n background-color: #e9e9e9;\n box-shadow: 0px 0px 0px 2px #e9e9e9;\n border-radius: 1px;\n transition: 0.1s ease;\n} */\n\n/* .select-wrapper>button, */\n\n/* #turnIntoButton,\n#colorTextButton {\n padding-left: 4px;\n} */\n\n#colorTextButton {\n margin-left: 0.625rem;\n}\n\n#turnIntoButton:not([disabled]):hover,\n#colorTextButton:not([disabled]):hover,\n#moreTextOptionButton:not([disabled]):hover,\n.floating-toolbar .item>button:not([disabled]):hover {\n background-color: #e9e9e9;\n box-shadow: 0px 0px 0px 2px #e9e9e9;\n border-radius: 1px;\n transition: 0.1s ease;\n}\n\n\n\n.option[focused="true"] {\n background-color: #bde4ff;\n}\n\n\n\n\n\n.option-image {\n width: 2.875rem;\n height: 2.875rem;\n border-radius: 0.1875rem;\n border: 1px solid #ccc;\n color: #4f4f4f;\n\n display: flex;\n flex-direction: row;\n justify-content: center;\n vertical-align: middle;\n align-items: center;\n background-color: #ffff;\n box-sizing: border-box;\n}\n\n.option-image img {\n max-width: 2.875rem;\n max-height: 2.875rem;\n}\n\n.option-image svg {\n margin: 0;\n padding: 0;\n padding: 0.625rem;\n box-sizing: border-box;\n\n}\n\n.option-text * {\n margin: 0;\n padding: 0;\n\n}\n\n.option-text .block-title {\n font-size: small !important;\n font-weight: 500;\n}\n\n.option-text .block-description {\n font-size: small !important;\n color: rgba(55, 53, 47, 0.5);\n}\n\n/** End Block Options **/\n\n\n\n#deleteBlockButton:hover svg,\n#deleteBlockButton:hover {\n color: rgb(235, 87, 87) !important;\n}\n\n\n\n.johannes-editor *::selection {\n /* background-color: rgba(211, 227, 253, 0.5) !important; */\n\n background-color: red;\n\n background-color: hsl(210 75% 50% / 1);\n color: white;\n}\n\n.johannes-editor mark,\n.johannes-editor * {\n line-height: 1.5 !important;\n}\n\n.option {\n justify-content: space-between;\n}\n\n.text-option {\n display: flex;\n flex-direction: row;\n justify-content: start;\n align-items: center;\n gap: 0.625rem;\n}\n\n\n\n\n:root {\n /* font-size: 16px; */\n /* Tamanho padrão */\n}\n\n/* Para telas com densidade média */\n@media only screen and (-webkit-min-device-pixel-ratio: 2),\nonly screen and (min--moz-device-pixel-ratio: 2),\nonly screen and (min-resolution: 192dpi),\nonly screen and (min-resolution: 2dppx) {\n :root {\n font-size: 18px;\n /* Aumenta o tamanho da fonte para telas de alta densidade */\n }\n}\n\n/* Para telas com altíssima densidade */\n@media only screen and (-webkit-min-device-pixel-ratio: 3),\nonly screen and (min--moz-device-pixel-ratio: 3),\nonly screen and (min-resolution: 288dpi),\nonly screen and (min-resolution: 3dppx) {\n :root {\n font-size: 20px;\n /* Ainda maior para telas de densidade muito alta */\n }\n}\n\n\n\n\n\n\n\n\n\n\n\ntable.johannes-content-element {\n border-collapse: collapse;\n max-width: inherit;\n width: auto;\n display: flex;\n box-sizing: border-box !important;\n}\n\ntable.johannes-content-element th,\ntable.johannes-content-element td {\n min-height: 20px;\n}\n\ntable.johannes-content-element th,\ntable.johannes-content-element td {\n border: 1px solid #84888d;\n padding: 8px;\n text-align: left;\n align-items: start;\n overflow-wrap: break-word;\n word-wrap: break-word;\n white-space: normal;\n vertical-align: top;\n min-width: 100px;\n max-width: 200px;\n /* box-sizing: border-box !important; */\n\n transition: border 100ms ease-out, box-shadow 100ms ease-out;\n\n}\n\ntable.johannes-content-element td.selected,\ntable.johannes-content-element td:focus {\n outline: none;\n box-shadow: 0 0 0 1px #74b6db inset;\n border: 1px double #74b6db;\n\n}\n\ntd {\n min-height: 1rem !important;\n line-height: 1rem;\n}\n\ntd::placeholder {\n display: block;\n}\n\ntd:empty:before {\n content: attr(data-placeholder);\n color: #84888acd;\n display: block !important;\n opacity: 0;\n}\n\n.table-wrapper {\n width: 100%;\n}\n\n.table-controller {\n position: relative;\n max-width: 100%;\n}\n\n.add-table-row {\n background-color: rgba(55, 53, 47, 0.06);\n width: 100%;\n padding: 0;\n margin: 0;\n margin-top: 0.375rem;\n display: flex;\n justify-content: center;\n align-items: center;\n text-align: center;\n height: 1rem;\n cursor: pointer;\n opacity: 0;\n user-select: none;\n}\n\n.add-table-column {\n position: absolute;\n right: -1.3125rem;\n background-color: rgba(55, 53, 47, 0.06);\n width: 1rem;\n padding: 0;\n margin: 0;\n display: flex;\n justify-content: center;\n align-items: center;\n text-align: center;\n height: 100%;\n top: 0;\n cursor: pointer;\n height: calc(100% - 1rem - 5px);\n opacity: 0;\n user-select: none;\n}\n\n.add-table-column:hover {\n opacity: 1;\n}\n\n.add-table-row:hover {\n opacity: 1;\n}\n\n.table-shell {\n max-width: 100%;\n}\n\n\n\n.table-option {\n background-color: white;\n width: fit-content;\n justify-content: space-between;\n padding: 8px 16px;\n background-color: #f9f9f9;\n width: fit-content;\n z-index: 999999;\n position: absolute;\n user-select: none;\n padding: 8px 16px;\n display: none;\n}\n\n\n\n\n/** Callout **/\n.callout:hover .options-button {\n display: block !important;\n}\n\n\n.no-selection {\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n}\n\n\n/** upload/embed **/\n\n.tab-container {\n font-size: 0.86rem;\n display: flex;\n flex-direction: column;\n transition: 0.1s ease;\n\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n\n transition: visibility 0.2s ease;\n\n}\n\n.nav-underline {\n margin: 0;\n padding: 0;\n border-bottom: 1px solid rgba(55, 53, 47, 0.16);\n padding: 10px 20px;\n}\n\n.nav-underline .nav-item {\n display: flex;\n margin-right: 15px;\n}\n\n.nav-underline .nav-link {\n cursor: pointer;\n text-decoration: none;\n color: rgb(55, 53, 47);\n color: rgba(55, 53, 47, 0.5);\n transition: 0.1s ease;\n}\n\n\n.nav-item.active .nav-link {\n color: #000;\n}\n\n.tab-content .content-data {\n display: none;\n padding: 20px;\n border-top: none;\n transition: 0.1s ease;\n}\n\n.tab-content .content-data.active {\n display: flex;\n flex-direction: column;\n text-align: center;\n gap: 1rem;\n}\n\n.tab-content .text-info {\n font-size: 0.75rem;\n color: rgba(55, 53, 47, 0.6);\n}\n\n.nav-underline .nav-item {\n display: inline;\n}\n\n\n.tab-container {\n width: fit-content;\n background-color: rgb(249, 249, 249);\n position: absolute;\n\n}\n\n.embed-content input {\n width: 20rem;\n border: 1px solid rgba(55, 53, 47, 0.16);\n height: 1.5rem;\n border-radius: 4px;\n padding-left: 10px;\n}\n\n\n.upload-content label {\n display: block;\n border: 1px solid rgba(55, 53, 47, 0.16);\n border-radius: 4px;\n width: 20rem;\n text-align: center;\n padding: 4px;\n color: rgb(55, 53, 47);\n background-color: #fff;\n /* transition: 0.1s ease; */\n}\n\n.upload-content label:hover {\n background-color: #eeeeee;\n}\n\n\n\n\n\n\n\n\n\n\n/* Estilo para as alças de redimensionamento */\n.resize-handle {\n position: absolute;\n width: 10px;\n height: 10px;\n background: rgba(0, 0, 0, 0.5);\n cursor: nwse-resize;\n /* Cursor de redimensionamento diagonal */\n}\n\n.resize-handle.se {\n bottom: 0;\n right: 0;\n}\n\n\n\n\n.embed-container {\n position: relative;\n width: 100%;\n padding-bottom: 56.25%;\n /* Proporção 16:9 */\n height: 0;\n overflow: hidden;\n}\n\n.embed-container iframe {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n}\n\n\n\n.video-container {\n position: relative;\n width: 100%;\n padding-bottom: 56.25%;\n /* Proporção 16:9 */\n height: 0;\n overflow: hidden;\n}\n\n.video-container iframe {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n}\n\n\n\n\n\n\n\n.resizable {\n resize: horizontal;\n overflow: auto;\n cursor: nesw-resize;\n}\n\n.background {\n background-color: #e7e6e3;\n}'],sourceRoot:""}]);const l=s},314:e=>{e.exports=function(e){var t=[];return t.toString=function(){return this.map((function(t){var n="",o=void 0!==t[5];return t[4]&&(n+="@supports (".concat(t[4],") {")),t[2]&&(n+="@media ".concat(t[2]," {")),o&&(n+="@layer".concat(t[5].length>0?" ".concat(t[5]):""," {")),n+=e(t),o&&(n+="}"),t[2]&&(n+="}"),t[4]&&(n+="}"),n})).join("")},t.i=function(e,n,o,i,r){"string"==typeof e&&(e=[[null,e,void 0]]);var s={};if(o)for(var l=0;l0?" ".concat(d[5]):""," {").concat(d[1],"}")),d[5]=r),n&&(d[2]?(d[1]="@media ".concat(d[2]," {").concat(d[1],"}"),d[2]=n):d[2]=n),i&&(d[4]?(d[1]="@supports (".concat(d[4],") {").concat(d[1],"}"),d[4]=i):d[4]="".concat(i)),t.push(d))}},t}},354:e=>{e.exports=function(e){var t=e[1],n=e[3];if(!n)return t;if("function"==typeof btoa){var o=btoa(unescape(encodeURIComponent(JSON.stringify(n)))),i="sourceMappingURL=data:application/json;charset=utf-8;base64,".concat(o),r="/*# ".concat(i," */");return[t].concat([r]).join("\n")}return[t].join("\n")}},72:e=>{var t=[];function n(e){for(var n=-1,o=0;o{var t={};e.exports=function(e,n){var o=function(e){if(void 0===t[e]){var n=document.querySelector(e);if(window.HTMLIFrameElement&&n instanceof window.HTMLIFrameElement)try{n=n.contentDocument.head}catch(e){n=null}t[e]=n}return t[e]}(e);if(!o)throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");o.appendChild(n)}},540:e=>{e.exports=function(e){var t=document.createElement("style");return e.setAttributes(t,e.attributes),e.insert(t,e.options),t}},56:(e,t,n)=>{e.exports=function(e){var t=n.nc;t&&e.setAttribute("nonce",t)}},825:e=>{e.exports=function(e){if("undefined"==typeof document)return{update:function(){},remove:function(){}};var t=e.insertStyleElement(e);return{update:function(n){!function(e,t,n){var o="";n.supports&&(o+="@supports (".concat(n.supports,") {")),n.media&&(o+="@media ".concat(n.media," {"));var i=void 0!==n.layer;i&&(o+="@layer".concat(n.layer.length>0?" ".concat(n.layer):""," {")),o+=n.css,i&&(o+="}"),n.media&&(o+="}"),n.supports&&(o+="}");var r=n.sourceMap;r&&"undefined"!=typeof btoa&&(o+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(r))))," */")),t.styleTagTransform(o,e,t.options)}(t,e,n)},remove:function(){!function(e){if(null===e.parentNode)return!1;e.parentNode.removeChild(e)}(t)}}}},113:e=>{e.exports=function(e,t){if(t.styleSheet)t.styleSheet.cssText=e;else{for(;t.firstChild;)t.removeChild(t.firstChild);t.appendChild(document.createTextNode(e))}}}},t={};function n(o){var i=t[o];if(void 0!==i)return i.exports;var r=t[o]={id:o,exports:{}};return e[o](r,r.exports,n),r.exports}n.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return n.d(t,{a:t}),t},n.d=(e,t)=>{for(var o in t)n.o(t,o)&&!n.o(e,o)&&Object.defineProperty(e,o,{enumerable:!0,get:t[o]})},n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),n.nc=void 0;var o,i,r,s,l,a,c,d,u,m,h,A,p=n(72),C=n.n(p),g=n(825),E=n.n(g),b=n(659),B=n.n(b),f=n(56),w=n.n(f),v=n(540),I=n.n(v),y=n(113),k=n.n(y),x=n(282),T={};T.styleTagTransform=k(),T.setAttributes=w(),T.insert=B().bind(null,"head"),T.domAPI=E(),T.insertStyleElement=I(),C()(x.A,T),x.A&&x.A.locals&&x.A.locals,function(e){e.Paragraph="p",e.Heading_1="h1",e.Heading_2="h2",e.Heading_3="h3",e.Heading_4="h4",e.Heading_5="h5",e.Heading_6="h6",e.CheckList="checkList",e.BulletedList="bulletedList",e.NumberedList="numberedList",e.List="list",e.Table="table",e.Image="image"}(o||(o={}));class S{static generateUniqueId(){const e=Date.now().toString(36),t=new Uint32Array(1);return window.crypto.getRandomValues(t),e+t[0].toString(36)}static rgbToHex(e){return"#"+e.match(/\d+/g).map(Number).map((e=>{const t=e.toString(16);return 1===t.length?"0"+t:t})).join("")}}!function(e){e.Link="icon-material-link",e.Bold="icon-wordpress-bold",e.Italic="icon-material-italic",e.Underline="icon-material-underline",e.InlineCode="icon-material-code-inline",e.StrikeThrough="icon-wordpress-strike-through",e.Plus="icon-plus",e.ColumnRight="icon-material-column-right",e.ColumnLeft="icon-material-column-left",e.RowAbove="icon-material-row-above",e.RowBelow="icon-material-row-below",e.deleteSweep="icon-material-delete-sweep",e.Trash="icon-material-trash",e.CloseCircle="icon-ionic-close-circle",e.Empty="Empty",e.Callout="icon-material-callout",e.Image="icon-material-image",e.Video="icon-material-video"}(i||(i={}));class L{creators;static _instance;static ELEMENT_TYPES={BLOCK_PARAGRAPH:"block-p",PARAGRAPH:"p",CHECKBOX_ITEM:"checkboxItem",LIST_ITEM:"listItem",CODE:"code",QUOTE:"blockquote",BULLETED_LIST:"ul",NUMBERED_LIST:"ol",CHECK_LIST:"checkLists",HEADER_1:"h1",HEADER_2:"h2",HEADER_3:"h3",HEADER_4:"h4",HEADER_5:"h5",HEADER_6:"h6",DRAG_HANDLE_BUTTON:"drag-handle-button",TABLE:"table",IMAGE:"image",CALLOUT:"callout"};constructor(){if(L._instance)throw new Error("Use ElementFactoryService.getInstance() to get instance.");this.creators={},this.register(L.ELEMENT_TYPES.BLOCK_PARAGRAPH,L.blockParagraphCreator()),this.register(L.ELEMENT_TYPES.PARAGRAPH,L.paragraphCreator()),this.register(L.ELEMENT_TYPES.CHECKBOX_ITEM,L.checkboxItemCreator()),this.register(L.ELEMENT_TYPES.LIST_ITEM,L.listItemCreator()),this.register(L.ELEMENT_TYPES.CODE,L.codeCreator()),this.register(L.ELEMENT_TYPES.QUOTE,L.quoteCreator()),this.register(L.ELEMENT_TYPES.CHECK_LIST,L.checkListCreator()),this.register(L.ELEMENT_TYPES.BULLETED_LIST,L.bulletedListCreator()),this.register(L.ELEMENT_TYPES.NUMBERED_LIST,L.numberedListCreator()),this.register(L.ELEMENT_TYPES.HEADER_1,L.headingCreator(1)),this.register(L.ELEMENT_TYPES.HEADER_2,L.headingCreator(2)),this.register(L.ELEMENT_TYPES.HEADER_3,L.headingCreator(3)),this.register(L.ELEMENT_TYPES.HEADER_4,L.headingCreator(4)),this.register(L.ELEMENT_TYPES.HEADER_5,L.headingCreator(5)),this.register(L.ELEMENT_TYPES.HEADER_6,L.headingCreator(6)),this.register(L.ELEMENT_TYPES.DRAG_HANDLE_BUTTON,L.dragHandleButtonCreator()),this.register(L.ELEMENT_TYPES.TABLE,L.tableCreator()),this.register(L.ELEMENT_TYPES.IMAGE,L.imageCreator2()),this.register(L.ELEMENT_TYPES.CALLOUT,L.calloutCreator()),L._instance=this}static getInstance(){return this._instance||(this._instance=new L),this._instance}register(e,t){this.creators[e]=t}create(e,t){const n=this.creators[e];if(!n)throw new TypeError(`No creator registered for type: ${e}`);return n(t||"")}static blockParagraphCreator(){return e=>L.blockParagraph(e)}static paragraphCreator(){return e=>L.paragraph(e)}static headingCreator(e){return t=>L.heading(e,t)}static checkboxItemCreator(){return e=>L.checkboxItem(e||"")}static listItemCreator(){return e=>L.listItem_2(e)}static dragHandleButtonCreator(){return()=>L.dragHandleButton()}static codeCreator(){return e=>{const t=document.createElement("pre"),n=document.createElement("code");return n.textContent=e||"",t.appendChild(n),n.contentEditable="true",t.classList.add("johannes-content-element"),n.classList.add("johannes-code"),t}}static quoteCreator(){return e=>{const t=document.createElement("blockquote");return t.textContent=e||"",t.contentEditable="true",t.classList.add("johannes-content-element"),t}}static checkListCreator(){return e=>{const t=document.createElement("ul");t.classList.add("johannes-content-element"),t.classList.add("swittable"),t.classList.add("list"),t.classList.add("checkbox-list"),t.setAttribute("data-content-type",o.CheckList);const n=L.checkboxItem(e||"");return t.appendChild(n),t}}static bulletedListCreator(){return e=>{const t=document.createElement("ul");t.setAttribute("data-content-type",o.BulletedList),t.classList.add("johannes-content-element"),t.classList.add("swittable"),t.classList.add("list");const n=L.listItem_2(e||"");return t.appendChild(n),t}}static numberedListCreator(){return e=>{const t=document.createElement("ol");t.setAttribute("data-content-type",o.NumberedList),t.classList.add("johannes-content-element"),t.classList.add("swittable"),t.classList.add("list");const n=L.listItem_2(e||"");return t.appendChild(n),t}}static tableCreator(){return e=>{const t=document.createElement("div");t.classList.add("table-shell");const n=document.createElement("div");n.classList.add("table-controller");const i=document.createElement("div");i.classList.add("table-wrapper");const r=document.createElement("table");r.classList.add("johannes-content-element","swittable","table"),r.setAttribute("data-content-type",o.Table),t.appendChild(n),n.appendChild(i),i.appendChild(r);const s=document.createElement("tbody");r.appendChild(s);const l=e?e.split(","):[],a=document.createElement("tr");l.forEach((e=>{const t=document.createElement("td");t.classList.add("focusable"),t.setAttribute("data-placeholder","cell"),t.textContent=e,t.contentEditable="true",a.appendChild(t)})),s.appendChild(a);const c=document.createElement("div");c.classList.add("add-table-row"),c.innerHTML='';const d=document.createElement("div");return d.classList.add("add-table-column"),d.innerHTML='',n.appendChild(c),n.appendChild(d),t}}static imageCreator2(){return e=>{const t=document.createElement("div");t.classList.add("johannes-content-element","swittable","no-selection"),t.setAttribute("data-content-type",o.Image),t.ATTRIBUTE_NODE;const n=document.createElement("div");n.classList.add("editor-only","temp-image-replace"),n.style.padding="1rem",n.style.backgroundColor="#e7e6e3",t.appendChild(n),n.style.color="rgba(55, 53, 47, 0.5)",n.style.display="flex",n.style.gap="5px",n.style.alignItems="center";const r=this.icon(i.Image);r.style.display="flex",r.style.alignItems="center",n.appendChild(r);const s=document.createElement("span");s.classList.add("no-selection"),s.innerText="Add an image",n.appendChild(s);const l=this.moreOptionsButton();return l.classList.add("options-button","hide-on-blur"),l.style.position="absolute",l.style.top="10px",l.style.right="10px",l.style.border="none",l.style.background="transparent",l.style.cursor="pointer",l.setAttribute("aria-label","More options"),l.style.display="none",t.appendChild(l),t}}static imageCreator(){return e=>{const t=document.createElement("img");return t.src=e||"default-image-path.jpg",t.alt="Descrição da imagem",t.classList.add("johannes-content-element"),t.classList.add("swittable"),t.classList.add("focusable"),t.style.width="100%",t.style.height="auto",t.addEventListener("click",(()=>{console.log("Imagem clicada!")})),t}}static calloutCreator(){return e=>{const t=document.createElement("div");t.classList.add("callout","johannes-content-element","swittable");const n=document.createElement("div");n.setAttribute("data-placeholder","Type something..."),n.contentEditable="true",n.classList.add("callout-text","editable","focusable"),n.style.padding="1rem",n.style.backgroundColor="#fbecdd",t.appendChild(n);const o=this.moreOptionsButton();return o.classList.add("options-button","hide-on-blur"),o.style.position="absolute",o.style.top="10px",o.style.right="10px",o.style.border="none",o.style.background="transparent",o.style.cursor="pointer",o.setAttribute("aria-label","More options"),o.style.display="none",t.appendChild(o),t}}static paragraph(e=null){const t=document.createElement("p");return t.innerText=e||"",t.contentEditable="true",t.setAttribute("data-content-type",o.Paragraph),t.classList.add("johannes-content-element"),t.classList.add("swittable"),t.classList.add("focusable"),t.classList.add("key-trigger"),t.setAttribute("data-placeholder","Write something or type / (slash) to choose a block..."),t}static heading(e,t=null){const n=document.createElement(`h${e}`);return n.innerText=t||"",n.contentEditable="true",n.setAttribute("data-content-type",`h${e}`),n.classList.add("johannes-content-element"),n.classList.add("swittable"),n.classList.add("focusable"),n.classList.add("focus"),n.classList.add("key-trigger"),n.setAttribute("data-placeholder",`Heading ${e}`),n}static checkboxItem(e){const t=S.generateUniqueId();let n=document.createElement("li");n.classList.add("deletable"),n.classList.add("list-item"),n.classList.add("list-item-checkable");let o=document.createElement("input");o.id=t,o.setAttribute("type","checkbox");let i=document.createElement("div");return i.textContent=e,i.setAttribute("data-placeholder","To-do"),i.contentEditable="true",i.setAttribute("for",t),i.setAttribute("contentEditable","true"),i.classList.add("focusable"),i.classList.add("editable"),i.classList.add("focus"),n.appendChild(o),n.appendChild(i),n}static listItem_2(e=null){let t=document.createElement("li");t.classList.add("deletable"),t.classList.add("list-item");const n=document.createElement("div");return n.classList.add("focusable"),n.classList.add("editable"),n.classList.add("focus"),n.contentEditable="true",n.classList.add("key-trigger"),n.setAttribute("data-placeholder","Item"),t.appendChild(n),n.innerText=e||"",t}static blockParagraph(e=null){let t=document.createElement("div"),n=L.paragraph(e);return t.appendChild(n),t.classList.add("block"),t.classList.add("deletable"),t}static dragHandleButton(){let e=document.createElement("button");return e.innerHTML='',e.classList.add("editor-only","drag-handler","button-reset"),e.draggable=!0,e}static moreOptionsButton(){let e=document.createElement("button");return e.innerHTML='',e.classList.add("editor-only","drag-handler","button-reset"),e}static icon(e){let t=document.createElement("div");return t.innerHTML=``,t}}class O{_canHide;props;htmlElement;parent;constructor(e){this.props=e,this.htmlElement=this.init(),this._canHide=!0}get display(){return"block"}appendTo(e){this.parent=e,e.htmlElement.appendChild(this.htmlElement)}get isVisible(){let e=this.htmlElement;if("none"===e.style.display||"hidden"===e.style.visibility||!document.contains(e))return!1;for(;e;){const t=window.getComputedStyle(e);if("none"===t.display||"hidden"===t.visibility)return!1;if(!e.parentElement)break;e=e.parentElement}return!0}show(){this.htmlElement.style.display=this.display}hide(){this.htmlElement.style.display="none"}lockHide(){this._canHide=!1}unlockHide(){this._canHide=!0}get canHide(){return this._canHide&&this.isVisible}set canHide(e){this._canHide=e}focus(){this.htmlElement.focus()}changeColor(e){this.htmlElement.style.color=e}removeColor(){this.htmlElement.style.color="inherit"}changeVisibilityToVisible(){this.htmlElement.style.visibility="visible"}changeVisibilityToHidden(){this.htmlElement.style.visibility="hidden"}get doesElementOverflowScreen(){const e=this.htmlElement.style.display,t=this.htmlElement.style.visibility,n=this.htmlElement.style.position;"none"===e&&(this.htmlElement.style.display="block",this.htmlElement.style.visibility="hidden",this.htmlElement.style.position="absolute");const o=this.htmlElement.getBoundingClientRect(),i=window.innerWidth;return"none"===e&&(this.htmlElement.style.display=e,this.htmlElement.style.visibility=t,this.htmlElement.style.position=n),o.right>i||o.left<0}}class N{static instance=new N;dependencies={};constructor(){}static get Instance(){return N.instance}register(e,t){this.dependencies[e]=t}resolve(e){if(!this.dependencies[e])throw new Error(`Dependency ${e} not found.`);return this.dependencies[e]()}}class R extends O{elementFactoryService;static editorId="johannesEditor";static instance;memento;title;content;addBlock;textFloatingToolbar;quickMenu;tableContextToolbar;mediaInputter;constructor(e,t,n,o,i,r,s,l,a,c){if(super({elementFactoryService:e,blockOperationsService:t,title:o,content:i,addBlock:r,floatingToolbar:s,quickMenu:l,tableToolbar:a,mediaInputter:c}),R.instance)throw new Error("Use BlockOperationsService.getInstance() to get instance.");this.elementFactoryService=e,this.memento=n,this.addBlock=r,this.textFloatingToolbar=s,this.quickMenu=l,this.tableContextToolbar=a,this.mediaInputter=c,this.attachEvents(),R.instance=this,this.memento.saveState()}init(){const e=document.getElementById(R.editorId)||document.createElement("div");return e.classList.add("johannes-editor"),window.editorConfig,e.appendChild(this.props.title.htmlElement),e.appendChild(this.props.content.htmlElement),window.editorConfig,e.appendChild(this.props.addBlock.htmlElement),window.editorConfig,e.appendChild(this.props.floatingToolbar.htmlElement),window.editorConfig,e.appendChild(this.props.quickMenu.htmlElement),e.appendChild(this.props.tableToolbar.htmlElement),e.appendChild(this.props.mediaInputter.htmlElement),e}static getInstance(e,t,n,o,i,r,s){const l=N.Instance.resolve("IElementFactoryService"),a=N.Instance.resolve("IBlockOperationsService"),c=N.Instance.resolve("IMemento");return R.instance||(R.instance=new R(l,a,c,e,t,n,o,i,r,s)),R.instance}attachEvents(){const e=document.getElementById(R.editorId);if(e?.addEventListener("mouseover",(e=>{const t=e.target;if(t instanceof Node){let e=t;if(e.nodeType===Node.TEXT_NODE&&(e=e.parentElement),e instanceof Element){const t=e.closest(".block");t&&this.appendDragHandler(t)}else console.error("Event target is not an HTMLElement and cannot handle HTMLElement specific methods:",e)}else console.error("Event target is not a Node:",t)})),"loading"===document.readyState)document.addEventListener("DOMContentLoaded",(()=>{const e=document.querySelector("#johannesEditor > .content .block p");e&&e.focus()}));else{const e=document.querySelector("#johannesEditor > .content .block p");e&&e.focus()}document.addEventListener("paste",(function(e){if("true"===e.target.getAttribute("contenteditable")){e.preventDefault();const t=e.clipboardData;if(t){const e=t.getData("text/plain");R.insertTextAtCursor(e)}}}),!0),this.attachDragHandler()}static insertTextAtCursor(e){const t=window.getSelection();if(t&&t.rangeCount>0){const n=t.getRangeAt(0);n.deleteContents();const o=document.createTextNode(e);n.insertNode(o),n.setStartAfter(o),n.setEndAfter(o),t.removeAllRanges(),t.addRange(n)}}appendDragHandler(e){if(e.nodeType===Node.TEXT_NODE&&(e=e.parentNode),!(e instanceof HTMLElement))return void console.error("Provided element is not an HTMLElement:",e);const t=e.closest(".block");let n=t?.querySelector(".drag-handler");!n&&t&&(n=this.elementFactoryService.create(L.ELEMENT_TYPES.DRAG_HANDLE_BUTTON),t.prepend(n))}removeDragHandler(e){if(e.nodeType===Node.TEXT_NODE&&(e=e.parentNode),!(e instanceof HTMLElement))return void console.error("Provided element is not an HTMLElement:",e);const t=e.closest(".block");if(t){const e=t.querySelector(".drag-handler");e?.remove()}}extractContent(){throw new Error("Not implemented Exception")}attachDragHandler(){let e=null,t=document.createElement("div");t.classList.add("drop-line"),t.style.height="2px",t.style.display="none",this.htmlElement.addEventListener("dragstart",(t=>{t.target?.classList?.contains("drag-handler")&&(e=t.target?.closest(".block"),e.setAttribute("draggable","true"),setTimeout((()=>{e.style.opacity="0.5"}),0))})),this.htmlElement.addEventListener("dragend",(()=>{setTimeout((()=>{e&&(e.style.opacity="",e.removeAttribute("draggable"),e=null),t.remove()}),0)})),this.htmlElement.addEventListener("dragover",(n=>{n.preventDefault();let o=n.target?.closest(".block");if(o&&o!==e){let e=o.getBoundingClientRect(),i=e.y+e.height/2;n.clientY>i?o.nextElementSibling!==t&&o.insertAdjacentElement("afterend",t):o.previousElementSibling!==t&&o.insertAdjacentElement("beforebegin",t)}t.style.display="block"})),this.htmlElement.addEventListener("drop",(n=>{n.preventDefault(),e&&t&&t.parentElement&&(t.parentElement.insertBefore(e,t),t.remove())}))}}class M{static isSelectionInTableCell(){let e=window.getSelection();if(!e?.rangeCount)return!1;let t=e.anchorNode;for(;t;){if(t.nodeType===Node.ELEMENT_NODE&&("TD"===t.tagName||"TH"===t.tagName))return!0;t=t.parentNode}return!1}static getSelectionTextInfo(e){let t,n,o=!1,i=!1;if(""==e.textContent)return o=!0,i=!0,{atStart:o,atEnd:i};const r=window.getSelection();return r&&r.rangeCount>0&&(t=r.getRangeAt(0),n=document.createRange(),n.selectNodeContents(e),n.setEnd(t.startContainer,t.startOffset),o=""===n.toString(),n.selectNodeContents(e),n.setStart(t.endContainer,t.endOffset),i=""===n.toString()),{atStart:o,atEnd:i}}static insertAfter(e,t){t.parentNode&&t.parentNode.insertBefore(e,t.nextSibling)}static hasTextContent(e){return""!==e.textContent?.trim()||e.hasChildNodes()&&Array.from(e.childNodes).some((e=>this.hasTextContent(e)))}static cloneAndInsertAfter(e){const t=e.cloneNode(!0),n=e.parentNode;return n?(n.insertBefore(t,e.nextSibling),t):null}static findClosestAncestorOfActiveElementByClass(e){const t=document.activeElement;if(!t)return null;let n=t;for(;n;){if(n.nodeType===Node.ELEMENT_NODE&&n.classList.contains(e))return n;n=n.parentNode}return null}static findClosestAncestorOfSelectionByClass(e){const t=window.getSelection();if(!t||0===t.rangeCount)return null;let n=t.getRangeAt(0).commonAncestorContainer;for(n&&n.nodeType===Node.TEXT_NODE&&(n=n.parentNode);n;){if(n.nodeType===Node.ELEMENT_NODE&&n.classList.contains(e))return n;n=n.parentNode}return null}static rearrangeContentAfterSplit(e,t){const n=M.getCursorPosition(e),o=this.splitContentAtCursorSelection(e);if(document.getSelection()?.removeAllRanges(),document.getSelection()?.addRange(o[1]),document.getSelection()?.deleteFromDocument(),t&&n){this.setCursorPosition(t,n);const e=this.splitContentAtCursorSelection(t);document.getSelection()?.removeAllRanges(),document.getSelection()?.addRange(e[0]),document.getSelection()?.deleteFromDocument()}}static getCursorPosition(e){const t=window.getSelection();if(!t||!e)return null;const n=t.getRangeAt(0);if(!n.intersectsNode(e))return null;const o=document.createTreeWalker(e,NodeFilter.SHOW_TEXT,{acceptNode:e=>NodeFilter.FILTER_ACCEPT});let i=0,r=o.firstChild();for(;r;){if(r===n.startContainer){i+=n.startOffset;break}i+=r.textContent?.length||0,r=o.nextNode()}return i}static setCursorPosition(e,t){const n=window.getSelection();if(!n)return;n.removeAllRanges();const o=document.createRange(),i=document.createTreeWalker(e,NodeFilter.SHOW_TEXT,{acceptNode:()=>NodeFilter.FILTER_ACCEPT});let r=i.nextNode(),s=0;for(;r;){const e=r.textContent?.length||0;if(s+e>=t){o.setStart(r,t-s),o.collapse(!0);break}s+=e,r=i.nextNode()}n.addRange(o)}static getContentTypeFromActiveElement(){const e=M.getCurrentActiveBlock(),t=e?.querySelector(".johannes-content-element");return t&&t.getAttribute("data-content-type")||null}static splitContentAtCursorSelection(e){const t=[],n=window.getSelection();if(!n||0===n.rangeCount)return t;const o=n.getRangeAt(0),i=document.createRange();i.selectNodeContents(e),i.setEnd(o.startContainer,o.startOffset);const r=document.createRange();return r.selectNodeContents(e),r.setStart(o.endContainer,o.endOffset),e.lastChild&&r.setEndAfter(e.lastChild),t.push(i),t.push(r),t}static placeCursorAtStartOfEditableElement(e){if(e.isContentEditable){e.focus();const t=document.createRange();t.selectNodeContents(e),t.collapse(!0);const n=window.getSelection();n?.removeAllRanges(),n?.addRange(t)}else console.warn("The element is not editable.")}static placeCursorAtEndOfEditableElement(e){e.isContentEditable?requestAnimationFrame((()=>{e.focus();const t=document.createRange(),n=window.getSelection();t.selectNodeContents(e);let o=e;for(;o.lastChild;)o=o.lastChild;t.setEnd(o,o.nodeType===Node.TEXT_NODE?o.textContent.length:0),t.collapse(!1),n?.removeAllRanges(),n?.addRange(t)})):console.warn("The element is not editable.")}static getCurrentActiveBlock(){let e=document.activeElement;return e?e.closest(".block"):null}static isSelectedTextDescendantOf(e){const t=document.getSelection();if(!t)return!1;if(!t.rangeCount)return!1;let n=t.getRangeAt(0).startContainer;return n.nodeType===Node.TEXT_NODE&&(n=n.parentNode),!!n&&null!==n.closest(e)}static removeFilterText(){let e=null;const t=window.getSelection();if(t&&t.rangeCount>0){const n=t.getRangeAt(0),o=n.commonAncestorContainer;if(o.nodeType===Node.TEXT_NODE&&o.parentElement?.isContentEditable){let i=o,r=n.startOffset;for(;i&&r>0;){if(e=(i.textContent?.substring(0,r)||"").lastIndexOf("/"),-1!==e){n.setStart(i,e),n.deleteContents();break}r=i.parentNode?.textContent?.lastIndexOf("/")||-1,i=i.parentNode}t.removeAllRanges(),t.addRange(n)}else console.warn("The cursor is not within a contentEditable element or a text node.")}else console.warn("No active selection.");return e}static findClickedElementOrAncestorByDataContentType(e,t){let n=e.target;if(n.nodeType===Node.TEXT_NODE&&(n=n.parentElement),n.dataset.contentType===t)return n;let o=n.parentElement;for(;o;){if(o.dataset.contentType===t)return o;o=o.parentElement}return null}static findClickedElementOrAncestorById(e,t){let n=e.target;if(n.nodeType===Node.TEXT_NODE&&(n=n.parentElement),n.id===t)return n;let o=n.parentElement;for(;o;){if(o.id===t)return o;o=o.parentElement}return null}static findClickedElementOrAncestorByClass(e,t){let n=e.target;if(n.nodeType===Node.TEXT_NODE&&(n=n.parentElement),n.classList.contains(t))return n;let o=n.parentElement;for(;o;){if(o.classList.contains(t))return o;o=o.parentElement}return null}}!function(e){e.floatingToolbarDisplayed="floatingToolbarDisplayed",e.anchorButtonClicked="anchorButtonClicked",e.boldButtonClicked="boldButtonClicked",e.italicButtonClicked="italicButtonClicked",e.underlineButtonClicked="underlineButtonClicked",e.inlineCodeButtonClicked="inlineCodeButtonClicked",e.strikeThroughButtonClicked="strikeThroughButtonClicked",e.hiliteColorButtonClicked="hiliteColorButtonClicked",e.foreColorButtonClicked="foreColorButtonClicked",e.buttonGroupItemClicked="buttonGroupItemClicked",e.focusOnFirstRequested="focusOnFirstRequested",e.transformBlockRequested="transformBlockRequested",e.duplicateBlockRequested="duplicateBlockRequested",e.anchor="anchor",e.bold="bold",e.italic="italic",e.underline="underline",e.inlineCode="inlineCode",e.strikeThrough="strikeThrough",e.hiliteColor="hiliteColor",e.foreColor="foreColor",e.textFormatChanged="textFormatChanged",e.emittedCommand="emittedCommand",e.blockTypeChanged="blockTypeChanged",e.blockDeleted="blockDeleted",e.tableCellChanged="tableCellChanged"}(r||(r={})),function(e){e.HiliteColorRed="#FDDEDE",e.HiliteColorGreen="#D7F7DC",e.HiliteColorBlue="#D9EDF6",e.HiliteColorYellow="#FAF4D1",e.HiliteColorGrey="#E1E0E0",e.HiliteColorNone="transparent",e.ForeColorRed="#D44C47",e.ForeColorGreen="#448361",e.ForeColorBlue="#337EA9",e.ForeColorYellow="#CB912F",e.ForeColorGrey="#787774",e.ForeColorInitial="initial",e.BackgroundColorRed="#FDDEDE",e.BackgroundColorGreen="#D7F7DC",e.BackgroundColorBlue="#D9EDF6",e.BackgroundColorYellow="#FAF4D1",e.BackgroundColorGrey="#E1E0E0",e.BackgroundColorNone="transparent",e.IconActiveBlue="#2382e2",e.IconDefaultBlack="rgba(55, 53, 47, 0.85)",e.Red="red",e.Tomato="#EB5757",e.OriginalTableColor="#84888d"}(s||(s={})),function(e){e.toggleBold="bold",e.toggleItalic="italic",e.toggleHiliteColor="hiliteColor",e.toggleForeColor="foreColor",e.toggleInlineCode="inlineCode",e.toggleLink="createLink",e.toggleUnderline="underline",e.toggleStrikeThrough="strikeThrough",e.removeFormat="removeFormat",e.transformBlock="transformBlock",e.duplicateBlock="duplicateBlock",e.deleteBlock="deleteBlock",e.createDefaultBlock="createDefaultBlock",e.focusOnPreviousBlock="focusOnPreviousBlock",e.insertNew="insertNew",e.insertTableRowAbove="insertTableRowAbove",e.insertTableRowBelow="insertTableRowBelow",e.insertTableColumnLeft="insertTableColumnLeft",e.insertTableColumnRight="insertTableColumnRight",e.showInsertTableColumnElement="showInsertTableColumnElement",e.showInsertTableRowElement="showInsertTableRowElement",e.hideInsertTableColumnElement="hideInsertTableColumnElement",e.hideInsertTableRowElement="hideInsertTableRowElement",e.toggleCellHiliteColor="toggleCellHiliteColor",e.removeColumn="removeColumn",e.removeRow="removeRow",e.changeTableBorderColor="changeTableBorderColor"}(l||(l={}));class H{color;constructor(e){this.color=e}}!function(e){e.ColorChangeRequest="ColorChangeRequest",e.ShowHideActiveButton="ShowHideActiveButton",e.ResetActiveButtons="ResetActiveButtons",e.CloseElement="HideComponent",e.ShowElement="ShowElement"}(a||(a={}));class q{classKey;value;intention;constructor(e,t,n){this.classKey=e,this.value=t,this.intention=n}}class _{classKey;constructor(e){this.classKey=e}}class D{}class P{}class F{static emitShowElementEvent(e){const t=new CustomEvent(a.ShowElement,{detail:{targetId:e,action:new P}});document.dispatchEvent(t)}static emitCloseElementEvent(e){const t=new CustomEvent(a.CloseElement,{detail:{targetId:e,action:new D}});document.dispatchEvent(t)}static emitChangeComponentColorEvent(e,t){const n=new CustomEvent(a.ColorChangeRequest,{detail:{targetId:e,action:new H(t)}});document.dispatchEvent(n)}static emitShowHideActiveElementEvent(e,t,n){"hiliteColor"==e&&t==s.HiliteColorNone&&(n="hide"),"foreColor"==e&&t==s.ForeColorInitial&&(n="hide"),"backgroundColor"==e&&t==s.BackgroundColorNone&&(n="hide");const o=new CustomEvent(a.ShowHideActiveButton,{detail:{targetClass:e,action:new q(e,t,n)}});document.dispatchEvent(o)}static emitResetActiveButtonsElementEvent(e){const t=new CustomEvent(a.ResetActiveButtons,{detail:{targetClass:e,action:new _(e)}});document.dispatchEvent(t)}static emitChangeTableBorderColorEvent(e,t){const n=new CustomEvent(r.emittedCommand,{detail:{command:l.changeTableBorderColor,value:t,scope:e}});document.dispatchEvent(n)}}class V{static instance;elementFactoryService;memento;focusStack;static BLOCK_OPERATIONS={TURN_INTO:"turnInto",CREATE_DEFAULT_BLOCK:"CreateDefaultBlock",DELETE_FOCUS_ON_PREVIOUS:"DeleteAndFocusOnPrevious",DELETE_FOCUS_ON_NEXT:"DeleteAndFocusOnNext",FOCUS_ON_FIRST:"FocusOnFirst",FOCUS_ON_PREVIOUS:"FocusOnPrevious",FOCUS_ON_NEXT:"FocusOnNext",DELETE:"delete",DUPLICATE:"duplicate",COPY:"copy",PASTE:"pates",CUT:"cut",REMOVE_FORMAT:"removeFormat",TRANSFORM_BLOCK:"transformBlock"};constructor(e,t,n){if(V.instance)throw new Error("Use BlockOperationsService.getInstance() to get instance.");this.elementFactoryService=e,this.focusStack=t,this.memento=n,V.instance=this}execCommand(e,t,n=null){if(e==V.BLOCK_OPERATIONS.COPY){if(document.getSelection&&navigator.clipboard&&navigator.clipboard.writeText){const e=document.getSelection();if(e&&e.toString().length>0){const t=e.toString();navigator.clipboard.writeText(t).then((()=>{const e=new CustomEvent("copiedText",{bubbles:!0,cancelable:!0});return document.dispatchEvent(e),!0})).catch((e=>{console.error("Error when copy text",e)}))}}return!1}if(e==V.BLOCK_OPERATIONS.CUT){if(document.getSelection&&navigator.clipboard&&navigator.clipboard.writeText){const e=document.getSelection();if(e&&e.toString().length>0){const t=e.toString();e.deleteFromDocument(),navigator.clipboard.writeText(t).then((()=>!0)).catch((e=>{console.error("Error when cut text: ",e)}))}}return!1}if(e==V.BLOCK_OPERATIONS.PASTE)return navigator.clipboard&&navigator.clipboard.readText&&navigator.clipboard.readText().then((e=>{const t=document.getSelection();if(t&&t.rangeCount>0){const n=t.getRangeAt(0);n.deleteContents(),n.insertNode(document.createTextNode(e));const o=new CustomEvent("requestUpdateFloatingToolbar",{bubbles:!0,cancelable:!0});return document.dispatchEvent(o),!0}console.error("No text selected or clipboard empty.")})).catch((e=>{console.error("Error when pasting text: ",e)})),!1;if(e==V.BLOCK_OPERATIONS.TRANSFORM_BLOCK&&this.getCurrentSelectedBlock()&&n&&this.transformBlock(n),e==V.BLOCK_OPERATIONS.REMOVE_FORMAT)return document.execCommand(V.BLOCK_OPERATIONS.REMOVE_FORMAT,!1);if(e==V.BLOCK_OPERATIONS.DELETE){this.deleteAndFocusOnNext();const e=new CustomEvent(r.blockDeleted,{bubbles:!0,cancelable:!0});return document.dispatchEvent(e),!0}if(e==V.BLOCK_OPERATIONS.DUPLICATE)return this.duplicateSelectedBlock(),!0;if(e==V.BLOCK_OPERATIONS.CREATE_DEFAULT_BLOCK){const e=document.activeElement||null;return this.createDefaultBlock(e),!0}if(e==V.BLOCK_OPERATIONS.FOCUS_ON_FIRST){const e=document.querySelector(".focusable");return!!e&&(e.focus(),!0)}if(e==V.BLOCK_OPERATIONS.DELETE_FOCUS_ON_PREVIOUS)return this.deleteAndFocusOnPrevious(),!0;if(e==V.BLOCK_OPERATIONS.DELETE_FOCUS_ON_NEXT)return this.deleteAndFocusOnNext(),!0;if(e==V.BLOCK_OPERATIONS.FOCUS_ON_PREVIOUS){const e=document.activeElement;return!!e&&(this.focusOnPrevious(e),!0)}if(e==V.BLOCK_OPERATIONS.FOCUS_ON_NEXT){const e=document.activeElement;return!!e&&(this.focusOnNext(e),!0)}return!0}queryCommandState(){throw new Error("Method not implemented.")}static getInstance(){const e=N.Instance.resolve("IElementFactoryService"),t=N.Instance.resolve("IFocusStack"),n=N.Instance.resolve("IMemento");return this.instance||(this.instance=new V(e,t,n)),this.instance}static getDraggableElementFromSelection(){const e=window.getSelection();if(e&&e.rangeCount>0){let t=e.getRangeAt(0).commonAncestorContainer;for(t.nodeType===Node.TEXT_NODE&&(t=t.parentNode);t&&!(t instanceof HTMLElement);)t=t.parentNode;if(t)return t.closest(".block")}throw new Error}transformBlock(e,t){let n;n=t?t.closest(".block"):this.focusStack.peek()?.closest(".block")||null;let o=n.querySelector(".swittable");this.focusStack.peek()?.focus(),M.removeFilterText(),this.memento.saveState();let i,r=o?.innerText,s=null;switch(e){case L.ELEMENT_TYPES.PARAGRAPH:i=this.elementFactoryService.create(L.ELEMENT_TYPES.PARAGRAPH),i.innerText=r;break;case L.ELEMENT_TYPES.HEADER_1:i=this.elementFactoryService.create(L.ELEMENT_TYPES.HEADER_1),i.innerText=r;break;case L.ELEMENT_TYPES.HEADER_2:i=this.elementFactoryService.create(L.ELEMENT_TYPES.HEADER_2),i.innerText=r;break;case L.ELEMENT_TYPES.HEADER_3:i=this.elementFactoryService.create(L.ELEMENT_TYPES.HEADER_3),i.innerText=r;break;case L.ELEMENT_TYPES.HEADER_4:i=this.elementFactoryService.create(L.ELEMENT_TYPES.HEADER_4),i.innerText=r;break;case L.ELEMENT_TYPES.HEADER_5:i=this.elementFactoryService.create(L.ELEMENT_TYPES.HEADER_5),i.innerText=r;break;case L.ELEMENT_TYPES.HEADER_6:i=this.elementFactoryService.create(L.ELEMENT_TYPES.HEADER_6),i.innerText=r;break;case L.ELEMENT_TYPES.CODE:i=document.createElement("pre");const e=document.createElement("code");e.innerText=r,i.appendChild(e);break;case L.ELEMENT_TYPES.QUOTE:break;case L.ELEMENT_TYPES.BULLETED_LIST:i=this.elementFactoryService.create(L.ELEMENT_TYPES.BULLETED_LIST,r);break;case L.ELEMENT_TYPES.NUMBERED_LIST:i=this.elementFactoryService.create(L.ELEMENT_TYPES.NUMBERED_LIST,r);break;case L.ELEMENT_TYPES.CHECK_LIST:i=this.elementFactoryService.create(L.ELEMENT_TYPES.CHECK_LIST,r);break;case"separator":break;case L.ELEMENT_TYPES.TABLE:i=this.elementFactoryService.create(L.ELEMENT_TYPES.TABLE,",,");break;case L.ELEMENT_TYPES.IMAGE:i=this.elementFactoryService.create(L.ELEMENT_TYPES.IMAGE,r),s=i;break;case L.ELEMENT_TYPES.CALLOUT:i=this.elementFactoryService.create(L.ELEMENT_TYPES.CALLOUT,r);break;default:return void console.error("Unsupported type")}if(!i)return;n.replaceChild(i,o);const l=i.closest(".focusable")||n.querySelector(".focusable");l&&(l.focus(),M.placeCursorAtEndOfEditableElement(l)),s&&this.focusStack.push(s),"image"==e&&F.emitShowElementEvent("mediaInputter")}createNewElement(e){this.memento.saveState();const t=e.target.closest(".johannes-content-element");t&&t.classList.contains("list")?this.createListItem(t):this.createDefaultBlock(t)}createListItem(e){this.memento.saveState();let t=null,n=(document.activeElement,e.closest(".johannes-content-element"));n.classList.contains("checkbox-list")?t=this.elementFactoryService.create("checkboxItem",""):n.classList.contains("list")&&(t=this.elementFactoryService.create("listItem",""))}createNewElementAndSplitContent(){this.memento.saveState();const e=M.getContentTypeFromActiveElement();if(e==o.Table)return!1;if(e==o.CheckList||e==o.BulletedList||e==o.NumberedList){const e=M.findClosestAncestorOfActiveElementByClass("list-item");if(e&&M.hasTextContent(e)){const t=M.cloneAndInsertAfter(e);if(t){const n=e.querySelector(".focusable"),o=t.querySelector(".focusable");M.rearrangeContentAfterSplit(n,o)}}else if(e){const t=e.closest(".block");if(t){const n=t.querySelectorAll(".list-item").length,o=L.blockParagraph();M.insertAfter(o,t),e.remove(),1==n&&t.remove();const i=o.querySelector("p");M.placeCursorAtStartOfEditableElement(i)}}}else{const e=M.findClosestAncestorOfActiveElementByClass("block");if(e){const t=M.cloneAndInsertAfter(e);if(t){const n=e.querySelector(".focusable"),i=t.querySelector(".focusable");M.rearrangeContentAfterSplit(n,i),M.hasTextContent(t)||this.transformBlock(o.Paragraph,t)}const n=t.querySelector(".focusable");M.placeCursorAtStartOfEditableElement(n)}}return!0}createDefaultBlock(e){const t=this.elementFactoryService.create(L.ELEMENT_TYPES.BLOCK_PARAGRAPH,"");e&&e.closest(".block")?e.closest(".block").insertAdjacentElement("afterend",t):document.querySelector("#johannesEditor .content").appendChild(t),t.querySelector(".johannes-content-element").focus()}deleteAndFocusOnPrevious(){const e=document.activeElement;this.focusOnPrevious(e),this.deleteTheCurrentElementAndTheDraggableBlockIfEmpty(e)}deleteAndFocusOnNext(){let e=this.getCurrentSelectedBlock()||M.getCurrentActiveBlock();e&&(this.focusOnNext(e),this.deleteTheCurrentElementAndTheDraggableBlockIfEmpty(e))}focusOnPrevious(e,t=null){let n=null;if("LI"===e.tagName.toUpperCase()){let o=e.previousElementSibling;if(!o)return;if(o&&o.classList.contains("focusable"))return n=o,void(t?this.applyCursorXEndPosition(n,t):M.placeCursorAtEndOfEditableElement(n))}if("LI"===e.parentNode.tagName.toUpperCase()){let o=e.closest("li")?.previousElementSibling?.querySelector(".focusable");if(o&&o.classList.contains("focusable"))return n=o,void(t?this.applyCursorXEndPosition(n,t):M.placeCursorAtEndOfEditableElement(n))}let o=e.closest(".block");if(!o)return;let i=o.previousElementSibling;for(;i;){let e=i.querySelectorAll(".focusable");if(e.length>0)return n=e[e.length-1],void(t?this.applyCursorXEndPosition(n,t):M.placeCursorAtEndOfEditableElement(n));i=i.previousElementSibling}}focusOnNext(e,t=null){let n=null;if("LI"===e.tagName.toUpperCase()){let o=e.nextElementSibling;if(o&&o.classList.contains("focusable"))return n=o,t?this.applyCursorXStartPosition(n,t):M.placeCursorAtStartOfEditableElement(n),n}if("LI"===e.parentNode.tagName.toUpperCase()){let o=e.closest("li")?.nextElementSibling?.querySelector(".focusable");if(o&&o.classList.contains("focusable"))return n=o,t?this.applyCursorXStartPosition(n,t):M.placeCursorAtStartOfEditableElement(n),n}let o=e.closest(".block");if(!o)return;let i=o.nextElementSibling;for(;i;){let e=i.querySelectorAll(".focusable");if(e.length>0)return n=e[0],t?this.applyCursorXStartPosition(n,t):M.placeCursorAtStartOfEditableElement(n),n;i=i.nextElementSibling}return n}deleteTheCurrentElementAndTheDraggableBlockIfEmpty(e){const t=e.closest(".block"),n=e.closest(".deletable");n?.remove(),t&&0==t.querySelectorAll(".editable").length&&t.remove()}applyCursorXEndPosition(e,t){const n=window.getSelection(),o=document.createRange();let i=e.lastChild,r=null;for(;i;){if(i.nodeType===Node.TEXT_NODE){r=this.adjustCursorOffset(i,t);break}i=(i.nodeName.toUpperCase(),i.previousSibling)}r&&r.closestNode?(o.setStart(r.closestNode,r.closestOffset),o.collapse(!0),n.removeAllRanges(),n.addRange(o),e.focus()):(o.selectNodeContents(e),o.collapse(!1),n.removeAllRanges(),n.addRange(o),e.focus())}applyCursorXStartPosition(e,t){const n=window.getSelection(),o=document.createRange();let i=e.firstChild,r=null;for(;i;){if(i.nodeType===Node.TEXT_NODE){r=this.adjustCursorOffset(i,t);break}i=i.nextSibling}r&&r.closestNode?(o.setStart(r.closestNode,r.closestOffset),o.collapse(!0),n.removeAllRanges(),n.addRange(o),e.focus()):(o.selectNodeContents(e),o.collapse(!0),n.removeAllRanges(),n.addRange(o),e.focus())}adjustCursorOffset(e,t){let n=document.createRange(),o=e,i=0,r=1/0;for(let o=0;on.getBoundingClientRect().right&&(i=e.textContent.length),{closestNode:o,closestOffset:i}}getCurrentSelectedFocusable(){const e=window.getSelection();if(!e||0===e.rangeCount)return null;let t=e.getRangeAt(0).commonAncestorContainer;return t.nodeType===Node.TEXT_NODE&&(t=t.parentNode),t.closest(".focusable")}getCurrentSelectedBlock(){const e=window.getSelection();if(!e||0===e.rangeCount)return null;let t=e.getRangeAt(0).commonAncestorContainer;return t.nodeType===Node.TEXT_NODE&&(t=t.parentNode),t.closest(".block")}duplicateSelectedBlock(){let e=this.getCurrentSelectedBlock()||M.getCurrentActiveBlock();if(!e||!e.parentNode)return console.error("O elemento fornecido é inválido ou não está no DOM."),null;const t=e.cloneNode(!0),n=e.nextSibling;return e.parentNode.insertBefore(t,n),t}}class j extends O{blockOperationsService;icon;constructor(e,t){super({icon:t}),this.blockOperationsService=e,this.icon=t,this.attachEvents()}init(){const e=document.createElement("button");return e.title="Add a new block",e.classList.add("add-block","block-operation"),e.appendChild(this.props.icon.htmlElement),e}attachEvents(){this.htmlElement.addEventListener("click",(()=>{this.blockOperationsService.execCommand(V.BLOCK_OPERATIONS.CREATE_DEFAULT_BLOCK,!1)}))}static create(e){const t=N.Instance.resolve("IBlockOperationsService");return new j(t,e)}}class U extends O{button;constructor(e){super({button:e}),this.button=e}init(){const e=document.createElement("div");return e.classList.add("add-block-wrapper"),e.appendChild(this.props.button.htmlElement),e}static create(e){return new U(e)}}class Y{static medium="1rem";static large="1.25rem"}class K extends O{useElement;constructor(e,t){super({iconId:e,size:t}),this.useElement=this.htmlElement.querySelector("use")}init(){const e=document.createElementNS("http://www.w3.org/2000/svg","svg");e.style.color="red !important";let t=document.createElementNS("http://www.w3.org/2000/svg","use");return t.setAttributeNS("http://www.w3.org/1999/xlink","href",`#${this.props.iconId}`),t.style.color="red !important",e.appendChild(t),e.setAttribute("width",this.props.size),e.setAttribute("height",this.props.size),e.setAttribute("fill","currentColor"),e}clone(){return new K(this.props.iconId,this.props.sizes)}setUseTo(e){this.useElement.setAttributeNS("http://www.w3.org/1999/xlink","href",`#${e}`)}static create(e,t){return new K(e,t)}}class z{static build(){return U.create(j.create(K.create(i.Plus,Y.medium)))}}class G extends O{id;dropdownButton;dropdownList;constructor(e,t,n){super({id:e}),this.id=e,this.dropdownButton=t,this.dropdownList=n,t.appendTo(this),n.appendTo(this)}init(){const e=document.createElement("div");return e.id=this.props.id,e.classList.add("select-wrapper"),e}get display(){return"block"}}class Z{head=null;tail=null;length=0;getFirst(){return this.head}getLast(){return this.tail}*[Symbol.iterator](){let e=this.head;if(e)do{yield e,e=e.nextNode}while(e&&e!==this.head)}forEach(e){let t=0;for(let n of this)e(n.value,t,this),t++}any(e){let t=this.head;for(;t;){if(e(t.value))return!0;if(t=t.nextNode,t===this.head)break}return!1}findFirst(e){if(!this.head)return null;let t=this.head;do{if(e(t.value))return t;t=t.nextNode}while(t&&t!==this.head);return null}findLast(e){if(!this.tail)return null;let t=this.tail;do{if(e(t.value))return t;t=t.previousNode}while(t&&t!==this.tail);return null}find(e){let t=this.head;for(;t;){if(t.value==e)return t;if(t=t.nextNode,t===this.head)break}return null}}class W{parentList;previousNode;nextNode;value;constructor(e,t){this.previousNode=null,this.nextNode=null,this.value=e,this.parentList=t}setNext(e){this.nextNode=e}setPrevious(e){this.previousNode=e}getNextSatisfying(e){let t=this.nextNode;const n=this;for(;t;){if(e(t.value))return t;if(t=t.nextNode,t===n)break}return null}getPreviousSatisfying(e){let t=this.previousNode;const n=this;for(;t&&t!==n;){if(e(t.value))return t;if(t=t.previousNode,t===this)break}return null}}class X extends Z{constructor(){super()}append(e){const t=new W(e,this);this.head&&this.tail?(t.setPrevious(this.tail),t.setNext(this.head),this.tail.setNext(t),this.head.setPrevious(t),this.tail=t):(this.head=t,this.tail=t,this.head.setNext(this.tail),this.head.setPrevious(this.tail)),this.length++}}class Q extends O{id;command;value;activeIcon;leftIcon;classList;onFocusFunctionList=[];onLoseFocusFunctionList=[];parentDropdownMenuList;constructor(e,t,n,o,i,r,s=null){const l=["list-item","option","option-hover","block-operation"],a=new K("icon-material-small-check",Y.medium);a.htmlElement.style.visibility="hidden",o&&(i.style.color=o),super({id:e,classList:l,leftIcon:i,title:r,icon:a,shortcut:s}),this.id=e,this.classList=l,this.leftIcon=i,this.command=n,this.value=o,this.parentDropdownMenuList=t,this.activeIcon=a,this.attachEvent()}addClass(e){this.classList.push(e),this.htmlElement.classList.add(e)}attachOnFocus(e,...t){this.onFocusFunctionList.push((()=>e(...t)))}attachOnLoseFocus(e,...t){this.onLoseFocusFunctionList.push((()=>e(...t)))}focus(){this.htmlElement.classList.add("option-focused"),this.onFocusFunctionList.forEach((e=>e()))}removeFocus(){this.htmlElement.classList.remove("option-focused"),this.onLoseFocusFunctionList.forEach((e=>e()))}init(){const e=document.createElement("li");e.id=this.props.id;const t=this.props.classList;e.classList.add(...t),e.tabIndex=2,e.style.color="#37352F";const n=document.createElement("div");n.classList.add("text-option"),n.appendChild(this.props.leftIcon);const o=document.createElement("span");if(o.innerText=this.props.title,n.appendChild(o),e.appendChild(n),e.appendChild(this.props.icon.htmlElement),this.props.shortcut){const t=document.createElement("span");t.innerText=this.props.shortcut,t.style.color="rgba(55, 53, 47, 0.5)",e.appendChild(t)}return e}emitCommandEvent(){const e=new CustomEvent(r.emittedCommand,{detail:{command:this.command,value:this.value}});document.dispatchEvent(e)}addCssClass(...e){this.htmlElement.classList.add(...e)}attachEvent(){this.attachUIEvent(),this.htmlElement.addEventListener("click",(e=>{e.preventDefault()})),this.htmlElement.addEventListener("mousedown",(e=>{e.preventDefault()})),this.htmlElement.addEventListener("mousemove",(async()=>{const e=this.parentDropdownMenuList.dropdownItems.find(this);this.parentDropdownMenuList.switchVisualFocus(e)})),this.htmlElement.addEventListener("click",(()=>{this.emitCommandEvent()}))}attachUIEvent(){document.addEventListener(a.ShowHideActiveButton,this.handleShowHideActiveButtonEvent.bind(this)),document.addEventListener(a.ResetActiveButtons,this.handleResetActiveButtonsEvent.bind(this))}handleShowHideActiveButtonEvent(e){const t=e.detail;if(this.classList?.includes(t.targetClass)){const e=t.action,n=e.value;this.value?.toLowerCase()==n.toLowerCase()&&"show"==e.intention&&this.activeIcon?.changeVisibilityToVisible()}}handleResetActiveButtonsEvent(e){const t=e.detail;this.classList?.includes(t.targetClass)&&this.activeIcon?.changeVisibilityToHidden()}}class $ extends O{id;parentDropdownParentButton;dropdownItems;currentFocusedMenuItem;constructor(e){super({id:e}),this.id=e,this.dropdownItems=new X,this.currentFocusedMenuItem=null,this.attachEvents()}get display(){return"flex"}init(){const e=document.createElement("ul");return e.id=this.props.id,e.setAttribute("name","block-type"),e.style.display="none",e.classList.add("soft-box-shadow","dependent-box","checkable-items"),e.style.position="absolute",e.style.maxHeight="25vmax",e.style.overflowY="auto",e}append(e){this.dropdownItems.append(e),this.htmlElement.appendChild(e.htmlElement)}setParentDropdownMenuButton(e){this.parentDropdownParentButton=e}attachEvents(){document.addEventListener("keydown",(e=>{this.isVisible&&this.currentFocusedMenuItem&&"Enter"===e.key&&this.currentFocusedMenuItem.value.emitCommandEvent()})),document.addEventListener("click",(e=>{this.clickedOutsideTheDropdownWhileDropdownIsVisible(e)&&this.hide()})),document.addEventListener("keydown",(e=>{this.keyPressedOutsideTheDropdownWhileDropdownIsVisible(e)&&("ArrowDown"==e.key&&(e.preventDefault(),this.focusNextVisibleItem()),"ArrowUp"==e.key&&(e.preventDefault(),this.focusPreviousVisibleItem()))}))}show(){this.htmlElement.style.left="0",this.htmlElement.style.right="auto",this.doesElementOverflowScreen&&(this.htmlElement.style.left="auto",this.htmlElement.style.right="0"),this.parentDropdownParentButton?.svgIcon?.setUseTo("icon-wordpress-chevron-up"),super.show()}hide(){this.parentDropdownParentButton?.svgIcon?.setUseTo("icon-wordpress-chevron-down"),this.currentFocusedMenuItem?.value.removeFocus(),this.currentFocusedMenuItem=null,super.hide()}switchVisualFocus(e){this.currentFocusedMenuItem!=e&&(this.currentFocusedMenuItem&&this.currentFocusedMenuItem.value.removeFocus(),this.currentFocusedMenuItem=e,this.currentFocusedMenuItem.value.focus())}focusNextVisibleItem(){let e;e=this.currentFocusedMenuItem?this.currentFocusedMenuItem.getNextSatisfying((e=>e instanceof Q)):this.dropdownItems.findFirst((e=>e instanceof Q)),this.switchVisualFocus(e)}focusPreviousVisibleItem(){let e;e=this.currentFocusedMenuItem?this.currentFocusedMenuItem.getPreviousSatisfying((e=>e instanceof Q)):this.dropdownItems.findFirst((e=>e instanceof Q)),this.switchVisualFocus(e)}clickedOutsideTheDropdownWhileDropdownIsVisible(e){return this.canHide&&!e.target.closest(`#${this.htmlElement.id}`)&&!e.target.closest(`#${this.parentDropdownParentButton?.htmlElement.id}`)}keyPressedOutsideTheDropdownWhileDropdownIsVisible(e){return this.canHide&&!e.target.closest(`#${this.htmlElement.id}`)&&!e.target.closest(`#${this.parentDropdownParentButton?.htmlElement.id}`)}}class J extends O{id;constructor(e){super({id:e}),this.id=e}init(){const e=document.createElement("div");return e.id=this.props.id,e.style.height="24px",e.style.width="1px",e.style.borderRight="1px solid #d0d0d0",e.style.margin="auto 6px",e}}class ee extends O{constructor(){super({})}init(){const e=document.createElement("div");return e.classList.add("item"),e}}class te extends O{id;command;showUI;icon;constructor(e,t,n,o){super({id:e,title:n,icon:o}),this.id=e,this.command=t,this.showUI=t==l.toggleLink,this.icon=o,this.attachEvents()}init(){const e=document.createElement("button");return e.classList.add("entry","button-reset","text-formatting-operation","option-hover"),e.title=this.props.title,e.tabIndex=1,e.appendChild(this.props.icon.htmlElement),e}attachEvents(){this.htmlElement.addEventListener("click",(async()=>{document.dispatchEvent(new CustomEvent(r.emittedCommand,{detail:{command:this.command,showUI:this.showUI}}))})),document.addEventListener(a.ColorChangeRequest,(e=>{const t=e.detail;this.id==t.targetId&&this.icon.changeColor(t.action.color)}))}static create(e,t,n,o){return new te(e,t,n,o)}}class ne extends O{constructor(e){super({color:e})}init(){const e=document.createElement("div");return e.style.width="1.25rem",e.style.height="1.25rem",e.style.borderRadius="50%",e.style.backgroundColor=this.props.color,e.style.border="1px solid #d0d0d0",e.style.boxSizing="border-box",e}}class oe extends O{dropdownList;svgIcon;constructor(e,t,n,o=!0){const i=new K("icon-wordpress-chevron-down",Y.medium);super({id:e,title:t,dropdownList:n,svgIcon:o?i:null}),this.dropdownList=n,this.svgIcon=i,this.attachEvents(),n.setParentDropdownMenuButton(this)}init(){const e=document.createElement("button");if(e.id=this.props.id,e.role="button",e.classList.add("button-reset","text-formatting-select-button","text-formatting-operation","option-hover"),e.tabIndex=1,e.style.position="relative",e.setAttribute("aria-controls",this.props.dropdownList.htmlElement.id),"string"==typeof this.props.title){const t=document.createElement("span");t.textContent=this.props.title,e.appendChild(t)}else e.appendChild(this.props.title);return this.props.svgIcon&&e.appendChild(this.props.svgIcon.htmlElement),e}attachEvents(){this.htmlElement.addEventListener("click",(()=>{this.dropdownList.isVisible?this.dropdownList.hide():this.dropdownList.show()}))}get display(){return"block"}}class ie extends O{parentDropdownMenuList;constructor(e,t){super({title:t}),this.parentDropdownMenuList=e}changeActiveIconToVisible(){}getLeftIconBackgroundColor(){return null}resetActiveIcon(){}attachOnLoseFocus(e){throw new Error("Method not implemented.")}attachOnFocus(e){throw new Error("Method not implemented.")}emitCommandEvent(){throw new Error("Method not implemented.")}removeFocus(){throw new Error("Method not implemented.")}focus(){throw new Error("Method not implemented.")}init(){const e=document.createElement("li"),t=document.createElement("h3");return t.innerText=this.props.title,e.appendChild(t),e}}!function(e){e.Link="linkButton",e.Bold="boldButton",e.Italic="italicButton",e.Underline="underlineButton",e.InlineCode="inlineCodeButton",e.Strikethrough="strikethroughButton"}(c||(c={}));class re{static instance;memento;textOperationService;constructor(e){if(re.instance)throw new Error("Use TextOperationService.getInstance() to get instance.");this.memento=e,this.attachEvents()}attachEvents(){}static getInstance(){const e=N.Instance.resolve("IMemento");return this.instance||(this.instance=new re(e)),this.instance}execBold(){this.memento.saveState(),document.execCommand("bold")&&F.emitChangeComponentColorEvent(c.Bold,s.IconActiveBlue)}execItalic(){this.memento.saveState(),document.execCommand("italic")&&F.emitChangeComponentColorEvent(c.Italic,s.IconActiveBlue)}execStrikeThrough(){this.memento.saveState(),document.execCommand("strikeThrough")&&F.emitChangeComponentColorEvent(c.Strikethrough,s.IconActiveBlue)}execUnderline(){this.memento.saveState(),document.execCommand("underline")&&F.emitChangeComponentColorEvent(c.Underline,s.IconActiveBlue)}execHiliteColor(e){this.memento.saveState(),F.emitResetActiveButtonsElementEvent("hiliteColor"),document.execCommand("hiliteColor",!1,e)&&F.emitShowHideActiveElementEvent("hiliteColor",e,"show")}execForeColor(e){this.memento.saveState(),F.emitResetActiveButtonsElementEvent("foreColor"),document.execCommand("foreColor",!1,e)&&F.emitShowHideActiveElementEvent("foreColor",e,"show")}execCommand(e,t,n){return!1}queryCommandState(e,t){return new Promise(((n,o)=>{requestAnimationFrame((()=>{e!==l.toggleLink?e===l.toggleUnderline&&this.queryAnchor()?n(!1):e!==l.toggleHiliteColor?e!==l.toggleForeColor?n(document.queryCommandState(e)):n(this.queryForeColor(t)):n(this.queryHiliteColor(t)):n(this.queryAnchor())}))}))}queryCommandStateA(e,t){return e===l.toggleLink?this.queryAnchor():e===l.toggleUnderline&&this.queryAnchor()?!this.queryAnchor():e===l.toggleHiliteColor?this.queryHiliteColor(t):e===l.toggleForeColor?this.queryForeColor(t):document.queryCommandState(e)}toggleCodeExecCommand(){const e=window.getSelection();if(!e||0===e.rangeCount)return;const t=e.getRangeAt(0);let n=t.commonAncestorContainer;for(;n&&"CODE"!==n.nodeName;)n=n.parentNode;if(n&&"CODE"===n.nodeName){const e=n,o=document.createRange();if(o.selectNodeContents(e),t.toString()===o.toString()){const t=e.parentNode;for(;t&&e.firstChild;)t.insertBefore(e.firstChild,e);t?.removeChild(e)}else{const e=t.toString();document.execCommand("insertHTML",!1,e)}document.getSelection()?.removeAllRanges()}else{const e=(new XMLSerializer).serializeToString(t.cloneContents());document.execCommand("insertHTML",!1,`${e}`)}}queryForeColor(e){const t=window.getSelection();if(!t)return!1;if(!t.rangeCount)return!1;let n=t.getRangeAt(0).commonAncestorContainer;n.nodeType===Node.TEXT_NODE&&(n=n.parentNode);const o=n.closest("font[color]");if(!o)return!1;const i=window.getComputedStyle(o).color;return S.rgbToHex(i).toUpperCase()===e.toUpperCase()}queryAnchor(){const e=window.getSelection();if(!e||!e.rangeCount)return!1;let t=e.getRangeAt(0).commonAncestorContainer;for(t.nodeType===Node.TEXT_NODE&&(t=t.parentNode);t&&null!==t;){if(t.nodeType==Node.ELEMENT_NODE&&t.closest("a"))return!0;t=t.parentNode}return!1}queryHiliteColor(e){const t=window.getSelection();if(!t)return!1;if(!t.rangeCount)return!1;let n=t.getRangeAt(0).commonAncestorContainer;n.nodeType===Node.TEXT_NODE&&(n=n.parentNode);const o=n.closest("span[style*='background-color']")||n.closest("font[style*='background-color']");if(!o)return!1;const i=window.getComputedStyle(o).backgroundColor;return S.rgbToHex(i).toUpperCase()===e.toUpperCase()}getInitialColorAsHex(){const e=document.createElement("div");document.body.appendChild(e),e.style.color="initial";const t=window.getComputedStyle(e).color;return document.body.removeChild(e),S.rgbToHex(t)}getTargetElementMap(e){switch(e){case"strong":case"bold":case"b":return"strong";case"italic":case"i":case"em":return"em";case"underline":case"u":return"u";case"strikethrough":case"s":return"s";case"background":case"color":return"span";default:throw new Error}}static getSelectedHTMLElement(){const e=window.getSelection();if(e&&e.rangeCount>0){let t=e.getRangeAt(0).commonAncestorContainer;for(t.nodeType===Node.TEXT_NODE&&(t=t.parentNode);t&&!(t instanceof HTMLElement);)t=t.parentNode;if(t)return t}return null}getSelectedTextNodes(){const e=window.getSelection();if(!e||0===e.rangeCount)return[];const t=[];for(let n=0;no.intersectsNode(e)?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_REJECT});let r;for(;r=i.nextNode();)if(r.nodeType===Node.TEXT_NODE){const e=document.createRange();e.selectNodeContents(r),-1===o.compareBoundaryPoints(Range.END_TO_START,e)&&1===o.compareBoundaryPoints(Range.START_TO_END,e)&&t.push(r)}}return t}findClosestMatchingParent(e,t){for(e&&e.nodeType===Node.TEXT_NODE&&(e=e.parentElement);e&&e!==document.body;){if(e.nodeType===Node.ELEMENT_NODE){const n=e;if(n.tagName.toLowerCase()===t.nodeType.toLowerCase()&&(!t.classes||t.classes.every((e=>n.classList.contains(e)))))return n}e=e.parentElement}return null}extractSelectedText(e){const t=window.getSelection();if(!t||0===t.rangeCount)return"";const n=t.getRangeAt(0);if(e.nodeType!==Node.TEXT_NODE)return"";const o=e.textContent||"";let i=0,r=o.length;return n.intersectsNode(e)?(n.startContainer===e?i=n.startOffset:n.startContainer.contains(e)&&(i=0),n.endContainer===e?r=n.endOffset:n.endContainer.contains(e)&&(r=o.length),i{if("Enter"==e.key&&this.isVisible){e.preventDefault(),e.stopPropagation();const t=this.htmlElement.value;setTimeout((()=>{re.getInstance().execCommand(l.toggleLink,!1,t)}),10),this.htmlElement.value="",this.parentWrapper?.hide()}"Escape"==e.key&&this.isVisible&&(this.htmlElement.value="",this.parentWrapper?.hide())})),document.addEventListener("click",(e=>{!this.canHide||e.target.closest(`#${this.htmlElement.id}`)||e.target.closest("#textFloatingToolbar")||this.parentWrapper?.hide()})),this.htmlElement.addEventListener("keydown",(e=>{"/"==e.key&&e.stopPropagation()}))}}class le extends O{inputLinkBox;range;highlights=[];constructor(){const e=new se;super({inputLinkBox:e}),this.inputLinkBox=e,this.attachEvent(),e.setParentWrapper(this)}init(){const e=document.createElement("div");return e.id="linkBox",e.style.display="none",e.classList.add("dependent-box"),e.style.position="absolute",e.appendChild(this.props.inputLinkBox.htmlElement),e}attachEvent(){document.addEventListener("showInputLinkBoxRequested",(()=>{this.show(),this.highlightSelectedText(),this.inputLinkBox.focus()}))}hide(){super.hide(),this.removeHighlights(),setTimeout((()=>{const e=new CustomEvent("showInputLinkBoxFinished",{bubbles:!0,cancelable:!0});document.dispatchEvent(e)}),0)}highlightSelectedText(){const e=window.getSelection();if(!e?.rangeCount)return;const t=e.getRangeAt(0).getClientRects();for(let e=0;e{document.body.removeChild(e)})),this.highlights=[]}}class ae extends O{dropdowns;separators;currentSelectionRange;inputLinkBoxWrapper;htmlFocusedElementBeforeOpenQuickMenu;constructor(e){const t=new le;super({id:e,inputLinkBoxWrapper:t}),this.inputLinkBoxWrapper=t,this.dropdowns=[],this.separators=[],this.currentSelectionRange=null,this.htmlFocusedElementBeforeOpenQuickMenu=null}init(){const e=document.createElement("div");e.id=this.props.id,e.style.display="none",e.classList.add("floating-toolbar","select-wrapper","soft-box-shadow");const t=document.createElement("div");e.appendChild(t);const n=document.getElementById("johannesEditor");return n?.appendChild(this.props.inputLinkBoxWrapper.htmlElement),e}get display(){return"flex"}hide(){this.canHide&&(this.anyDropdownVisible()&&this.hideAllDropdownVisible(),this.currentSelectionRange=null,super.hide())}appendDropdown(e){this.dropdowns.push(e),this.htmlElement.appendChild(e.htmlElement)}appendButtonGroup(e){this.htmlElement.appendChild(e.htmlElement)}appendSeparator(e){this.separators.push(e),this.htmlElement.appendChild(e.htmlElement)}appendTextToolbar(e){this.htmlElement.appendChild(e.htmlElement)}anyDropdownVisible(){for(const e of this.dropdowns)if(e.dropdownList.isVisible)return!0;return!1}hideAllDropdownVisible(){for(const e of this.dropdowns)e.dropdownList.canHide&&e.dropdownList.hide();return!1}attachEvents(){this.htmlElement.addEventListener("click",(e=>{e.preventDefault()})),this.htmlElement.addEventListener("mousedown",(e=>{e.preventDefault()})),document.addEventListener("showInputLinkBoxRequested",(()=>{this.canHide=!1})),document.addEventListener("showInputLinkBoxFinished",(()=>{this.canHide=!0,this.restoreRangeSelection()})),document.addEventListener(r.blockDeleted,(()=>{this.hide()})),document.addEventListener(r.blockTypeChanged,(()=>{this.hide()}))}isSelectionEmpty(){const e=document.getSelection();return!e||0===e.rangeCount||""===e.toString().trim()}restoreRangeSelection(){document.getSelection()?.removeAllRanges(),document.getSelection()?.addRange(this.currentSelectionRange)}}!function(e){e.LowImportance="100",e.SlightlyImportant="200",e.Neutral="300",e.ModeratelyImportant="400",e.VeryImportant="500",e.ExtremelyImportant="600"}(d||(d={})),function(e){e.Mousedown="mousedown",e.Mousemove="mousemove",e.Mouseup="mouseup",e.Keyup="keyup",e.Keydown="keydown",e.Blur="blur",e.SelectStart="selectstart",e.SelectionChange="selectionchange",e.Click="click"}(u||(u={}));class ce extends ae{static id="textFloatingToolbar";static instance;textOperationsService;initialRect=null;constructor(e){if(ce.instance)throw new Error("Use TextContextFloatingToolbar.getInstance() to get instance.");super(ce.id),this.htmlElement.style.zIndex=d.VeryImportant,this.textOperationsService=e,this.attachEvents()}static getInstance(){const e=N.Instance.resolve("ITextOperationsService");return ce.instance||(ce.instance=new ce(e)),ce.instance}processSelectionChangeEffects(){const e=document.getSelection();if(!e||""===e?.toString().trim())return;F.emitResetActiveButtonsElementEvent("hiliteColor"),F.emitResetActiveButtonsElementEvent("foreColor");const t=this.textOperationsService.queryCommandStateA("bold"),n=this.textOperationsService.queryCommandStateA("italic"),o=this.textOperationsService.queryCommandStateA("underline"),i=this.textOperationsService.queryCommandStateA("strikeThrough"),r={};r[s.HiliteColorRed]=this.textOperationsService.queryHiliteColor(s.HiliteColorRed),r[s.HiliteColorGreen]=this.textOperationsService.queryHiliteColor(s.HiliteColorGreen),r[s.HiliteColorBlue]=this.textOperationsService.queryHiliteColor(s.HiliteColorBlue),r[s.HiliteColorYellow]=this.textOperationsService.queryHiliteColor(s.HiliteColorYellow),r[s.HiliteColorGrey]=this.textOperationsService.queryHiliteColor(s.HiliteColorGrey);const l={};l[s.ForeColorRed]=this.textOperationsService.queryForeColor(s.ForeColorRed),l[s.ForeColorGreen]=this.textOperationsService.queryForeColor(s.ForeColorGreen),l[s.ForeColorBlue]=this.textOperationsService.queryForeColor(s.ForeColorBlue),l[s.ForeColorYellow]=this.textOperationsService.queryForeColor(s.ForeColorYellow),l[s.ForeColorGrey]=this.textOperationsService.queryForeColor(s.ForeColorGrey),Object.entries(r).forEach((([e,t])=>{t&&F.emitShowHideActiveElementEvent("hiliteColor",e,"show")})),Object.entries(l).forEach((([e,t])=>{t&&F.emitShowHideActiveElementEvent("foreColor",e,"show")})),this.emitChangeComponentColorEvent(t,c.Bold),this.emitChangeComponentColorEvent(n,c.Italic),this.emitChangeComponentColorEvent(o,c.Underline),this.emitChangeComponentColorEvent(i,c.Strikethrough)}emitChangeComponentColorEvent(e,t){e?F.emitChangeComponentColorEvent(t,s.IconActiveBlue):F.emitChangeComponentColorEvent(t,s.IconDefaultBlack)}attachEvents(){document.addEventListener(u.SelectionChange,this.processSelectionChangeEffects.bind(this));let e=!1;this.htmlElement.addEventListener("mouseup",(e=>{e.preventDefault()})),document.addEventListener("keydown",(t=>{t.shiftKey&&(e=!0)})),document.addEventListener("keyup",(t=>{"Shift"===t.key&&(e=!1,this.showHide(e))})),document.addEventListener("mousedown",(()=>{e=!0})),document.addEventListener("mouseup",(t=>{e=!1,this.showHide(e)})),document.addEventListener(u.SelectionChange,(()=>{this.showHide(e)})),document.addEventListener("keydown",(e=>{setTimeout((()=>{this.canHide&&"Escape"===e.key&&(this.anyDropdownVisible()?this.hideAllDropdownVisible():this.hide())}),10)})),super.attachEvents()}shouldUpdatePosition(){const e=window.getSelection();if(!e||0===e.rangeCount)return!1;const t=e.getRangeAt(0).getBoundingClientRect();return!this.initialRect||(Math.abs(t.left-this.initialRect.left)>10||Math.abs(t.top-this.initialRect.top)>10)}showHide(e){const t=this.hasSelection();t?t&&!e&&(this.isVisible?this.shouldUpdatePosition()&&this.updatePosition():this.show()):(this.hide(),this.initialRect=null)}hasSelection(){const e=window.getSelection();return!!(e&&e.rangeCount>0&&""!==e.toString().trim())}changeToolbarPositionToBeClosedToSelection(){const e=window.getSelection();if(!e||0===e.rangeCount)return void console.error("No selection found");this.currentSelectionRange=e.getRangeAt(0);const t=this.currentSelectionRange.getBoundingClientRect();if(!this.initialRect){this.initialRect=t,this.htmlElement.style.display="flex";const e=this.htmlElement.offsetWidth;let n=t.left+window.scrollX-50;n+e>window.innerWidth&&(n=window.innerWidth-e-20);const o=this.htmlElement.offsetHeight;let i=t.top+window.scrollY-o-10;i<0&&(i=t.bottom+window.scrollY+10),this.htmlElement.style.left=`${n}px`,this.htmlElement.style.top=`${i}px`}}show(){const e=window.getSelection();e&&0!==e.rangeCount?M.findClosestAncestorOfActiveElementByClass("title")||(this.changeToolbarPositionToBeClosedToSelection(),this.hideTurnIntoDropdownIfInCell(),super.show()):console.error("No selection found")}hideTurnIntoDropdownIfInCell(){const e=M.isSelectionInTableCell();this.dropdowns.forEach((t=>{"turnIntoMenu"==t.id&&(t.htmlElement.style.display=e?"none":this.display)})),this.separators.forEach((t=>{"turnIntoSeparator"==t.id&&(t.htmlElement.style.display=e?"none":this.display)}))}updatePosition(){const e=window.getSelection();if(e&&e.rangeCount>0){const t=e.getRangeAt(0).getBoundingClientRect();this.setPosition(t)}}setPosition(e){const t=this.htmlElement.offsetWidth;let n=e.left+window.scrollX-50;n+t>window.innerWidth&&(n=window.innerWidth-t-20);const o=this.htmlElement.offsetHeight;let i=e.top+window.scrollY-o-10;i<0&&(i=e.bottom+window.scrollY+10),this.htmlElement.style.left=`${n}px`,this.htmlElement.style.top=`${i}px`}hide(){this.canHide&&(this.currentSelectionRange=null,super.hide())}}!function(e){e.BackgroundOptionRed="BackgroundOptionRed",e.BackgroundOptionGreen="BackgroundOptionRed",e.BackgroundOptionBlue="BackgroundOptionRed",e.BackgroundOptionYellow="BackgroundOptionRed",e.BackgroundOptionGrey="BackgroundOptionRed",e.BackgroundOptionNone="BackgroundOptionRed"}(m||(m={})),function(e){e.ColorTextOptionSelect="colorTextOptionSelect"}(h||(h={})),function(e){e.ColorTextOptionsMenu="colorTextOptionsMenu"}(A||(A={}));class de{static build(){const e=ce.getInstance();return e.appendDropdown(de.turnIntoDropdown()),e.appendSeparator(de.separator("turnIntoSeparator")),e.appendButtonGroup(de.buttonGroup()),e.appendDropdown(de.colorDropdown()),e.appendSeparator(de.separator("textOperationsSeparator")),e.appendDropdown(de.moreOptionsDropdown()),e}static turnIntoDropdown(){const e=new $("turnIntoSelect"),t=new oe("turnIntoButton","Text",e),n=new G("turnIntoMenu",t,e);return e.append(new ie(e,"Turn into")),e.append(new Q("turnIntoOptionText",e,V.BLOCK_OPERATIONS.TRANSFORM_BLOCK,L.ELEMENT_TYPES.PARAGRAPH,ue.paragraph.htmlElement,"Text","Ctrl+Shift+Enter")),e.append(new Q("turnIntoOptionTodoList",e,V.BLOCK_OPERATIONS.TRANSFORM_BLOCK,L.ELEMENT_TYPES.CHECK_LIST,ue.todo_list.htmlElement,"Todo list","Ctrl+1")),e.append(new Q("turnIntoOptionBulletedList",e,V.BLOCK_OPERATIONS.TRANSFORM_BLOCK,L.ELEMENT_TYPES.BULLETED_LIST,ue.b_list.htmlElement,"Bulleted list","Ctrl+.")),e.append(new Q("turnIntoOptionNumberedList",e,V.BLOCK_OPERATIONS.TRANSFORM_BLOCK,L.ELEMENT_TYPES.NUMBERED_LIST,ue.n_list.htmlElement,"Numbered list","Ctrl+/")),e.append(new Q("turnIntoOptionBlockCode",e,V.BLOCK_OPERATIONS.TRANSFORM_BLOCK,L.ELEMENT_TYPES.CODE,ue.code.htmlElement,"Block code")),e.append(new Q("turnIntoOptionQuote",e,V.BLOCK_OPERATIONS.TRANSFORM_BLOCK,L.ELEMENT_TYPES.QUOTE,ue.quote.htmlElement,"Quote")),e.append(new Q("turnIntoOptionHeading1",e,V.BLOCK_OPERATIONS.TRANSFORM_BLOCK,L.ELEMENT_TYPES.HEADER_1,ue.head1.htmlElement,"Heading 1","Ctrl+Alt+1")),e.append(new Q("turnIntoOptionHeading2",e,V.BLOCK_OPERATIONS.TRANSFORM_BLOCK,L.ELEMENT_TYPES.HEADER_2,ue.head2.htmlElement,"Heading 2","Ctrl+Alt+2")),e.append(new Q("turnIntoOptionHeading3",e,V.BLOCK_OPERATIONS.TRANSFORM_BLOCK,L.ELEMENT_TYPES.HEADER_3,ue.head3.htmlElement,"Heading 3","Ctrl+Alt+3")),e.append(new Q("turnIntoOptionHeading4",e,V.BLOCK_OPERATIONS.TRANSFORM_BLOCK,L.ELEMENT_TYPES.HEADER_4,ue.head4.htmlElement,"Heading 4","Ctrl+Alt+4")),e.append(new Q("turnIntoOptionHeading5",e,V.BLOCK_OPERATIONS.TRANSFORM_BLOCK,L.ELEMENT_TYPES.HEADER_5,ue.head5.htmlElement,"Heading 5","Ctrl+Alt+5")),e.append(new Q("turnIntoOptionHeading6",e,V.BLOCK_OPERATIONS.TRANSFORM_BLOCK,L.ELEMENT_TYPES.HEADER_6,ue.head6.htmlElement,"Heading 6","Ctrl+Alt+6")),n}static separator(e){return new J(e)}static buttonGroup(){const e=new ee;return te.create(c.Link,l.toggleLink,"Link",K.create(i.Link,Y.large)).appendTo(e),te.create(c.Bold,l.toggleBold,"Bold",K.create(i.Bold,Y.large)).appendTo(e),te.create(c.Italic,l.toggleItalic,"Italic",K.create(i.Italic,Y.large)).appendTo(e),te.create(c.Underline,l.toggleUnderline,"Underline",K.create(i.Underline,Y.large)).appendTo(e),te.create(c.InlineCode,l.toggleInlineCode,"Code",K.create(i.InlineCode,Y.large)).appendTo(e),te.create(c.Strikethrough,l.toggleStrikeThrough,"Strike-through",K.create(i.StrikeThrough,Y.large)).appendTo(e),e}static colorDropdown(){const e=new $(h.ColorTextOptionSelect),t=new oe("colorTextButton",new ne("#FAF4D1").htmlElement,e),n=new G(A.ColorTextOptionsMenu,t,e);e.append(new ie(e,"Background"));const o=new Q(m.BackgroundOptionRed,e,l.toggleHiliteColor,s.HiliteColorRed,new ne(s.HiliteColorRed).htmlElement,"Red");o.addClass("hiliteColor");const i=new Q(m.BackgroundOptionGreen,e,l.toggleHiliteColor,s.HiliteColorGreen,new ne(s.HiliteColorGreen).htmlElement,"Green");i.addClass("hiliteColor");const r=new Q(m.BackgroundOptionBlue,e,l.toggleHiliteColor,s.HiliteColorBlue,new ne(s.HiliteColorBlue).htmlElement,"Blue");r.addClass("hiliteColor");const a=new Q(m.BackgroundOptionYellow,e,l.toggleHiliteColor,s.HiliteColorYellow,new ne(s.HiliteColorYellow).htmlElement,"Yellow");a.addClass("hiliteColor");const c=new Q(m.BackgroundOptionGrey,e,l.toggleHiliteColor,s.HiliteColorGrey,new ne(s.HiliteColorGrey).htmlElement,"Grey");c.addClass("hiliteColor");const d=new Q(m.BackgroundOptionNone,e,l.toggleHiliteColor,s.HiliteColorNone,new ne(s.HiliteColorNone).htmlElement,"None");d.addClass("hiliteColor"),e.append(o),e.append(i),e.append(r),e.append(a),e.append(c),e.append(d),e.append(new ie(e,"Color"));const u=new Q("colorOptionRed",e,l.toggleForeColor,s.ForeColorRed,new K("icon-material-format",Y.large).htmlElement,"Red");u.addClass("foreColor");const p=new Q("colorOptionGreen",e,l.toggleForeColor,s.ForeColorGreen,new K("icon-material-format",Y.large).htmlElement,"Green");p.addClass("foreColor");const C=new Q("colorOptionBlue",e,l.toggleForeColor,s.ForeColorBlue,new K("icon-material-format",Y.large).htmlElement,"Blue");C.addClass("foreColor");const g=new Q("colorOptionYellow",e,l.toggleForeColor,s.ForeColorYellow,new K("icon-material-format",Y.large).htmlElement,"Yellow");g.addClass("foreColor");const E=new Q("colorOptionGrey",e,l.toggleForeColor,s.ForeColorGrey,new K("icon-material-format",Y.large).htmlElement,"Grey");E.addClass("foreColor");const b=new Q("colorOptionNone",e,l.toggleForeColor,s.ForeColorInitial,new K("icon-material-format",Y.large).htmlElement,"None");return b.addClass("foreColor"),e.append(u),e.append(p),e.append(C),e.append(g),e.append(E),e.append(b),n}static moreOptionsDropdown(){const e=new K("icon-material-more",Y.large),t=new $("moreTextOptionSelect"),n=new oe("moreTextOptionButton",e.htmlElement,t,!1),o=new G("moreTextOptionsMenu",n,t);t.append(new ie(t,"More options")),t.append(new Q("copyOption",t,V.BLOCK_OPERATIONS.COPY,null,ue.copy.htmlElement,"Copy","Ctrl+C")),t.append(new Q("cutOption",t,V.BLOCK_OPERATIONS.CUT,null,ue.cut.htmlElement,"Cut","Ctrl+X")),t.append(new Q("pasteOption",t,V.BLOCK_OPERATIONS.PASTE,null,ue.paste.htmlElement,"Replace","Ctrl+V")),t.append(new Q("duplicateOption",t,V.BLOCK_OPERATIONS.DUPLICATE,null,ue.duplicate.htmlElement,"Clone Block","Ctrl+D")),t.append(new Q("resetOption",t,V.BLOCK_OPERATIONS.REMOVE_FORMAT,null,ue.eraser.htmlElement,"Reset Style","Ctrl+\\"));const i=new Q("deleteOption",t,V.BLOCK_OPERATIONS.DELETE,null,ue.delete.htmlElement,"Delete Block","Shift+Del");return i.addCssClass("danger-option"),t.append(i),o}}const ue={paragraph:new K("icon-material-format","1.25rem"),todo_list:new K("icon-material-check-list-2",Y.large),b_list:new K("icon-wordpress-bulleted-list",Y.large),n_list:new K("icon-wordpress-numbered-list",Y.large),code:new K("icon-wordpress-code-mark",Y.large),quote:new K("icon-wordpress-quote",Y.large),head1:new K("icon-julia-head-1",Y.large),head2:new K("icon-julia-head-2",Y.large),head3:new K("icon-julia-head-3",Y.large),head4:new K("icon-julia-head-4",Y.large),head5:new K("icon-julia-head-5",Y.large),head6:new K("icon-julia-head-6",Y.large),duplicate:new K("icon-material-duplicate",Y.large),delete:new K("icon-material-trash",Y.large),eraser:new K("icon-material-clear",Y.large),copy:new K("icon-material-copy",Y.large),cut:new K("icon-material-cut",Y.large),paste:new K("icon-material-paste",Y.large)};class me extends O{constructor(){super({})}init(){const e=document.createElement("span");return e.innerText="No results",e.classList.add("empty-block-options"),e.style.padding="10px",e.style.color="rgba(55, 53, 47, 0.65)",e.style.display="none",e}}var he,Ae,pe,Ce,ge,Ee,be;!function(e){e.TD="td",e.TABLE="table"}(he||(he={}));class Be extends O{static id="quickMenu";blockOperationsService;currentFocusedMenuItem;menuSections;quickMenuEmpty;filterInput;static instance;focusStack;constructor(e,t){super({}),this.currentFocusedMenuItem=null,this.menuSections=new X,this.quickMenuEmpty=new me,this.blockOperationsService=e,this.focusStack=t,this.attachEvents(),this.filterInput=""}init(){const e=document.createElement("div");e.id=Be.id,e.classList.add("block-options-wrapper","soft-box-shadow"),e.style.display="none";const t=document.createElement("div");return t.classList.add("block-options"),t.style.position="relative",e.appendChild(t),e}append(e){this.menuSections.append(e),this.htmlElement.querySelector(".block-options").appendChild(e.htmlElement)}static getInstance(){const e=N.Instance.resolve("IBlockOperationsService"),t=N.Instance.resolve("IFocusStack");return Be.instance||(Be.instance=new Be(e,t)),Be.instance}switchVisualFocus(e){this.currentFocusedMenuItem!=e&&(this.currentFocusedMenuItem&&this.currentFocusedMenuItem.value.removeFocus(),this.currentFocusedMenuItem=e,this.currentFocusedMenuItem.value.focus(),this.focusStack.peek()?.focus())}focusOnTheFirstVisibleItem(){const e=this.menuSections.getFirst();let t=e;for(;t;){const n=t.value.menuItems.findFirst((e=>e.isVisible));if(n)return void this.switchVisualFocus(n);if(t=t.nextNode,t==e)return}}focusPreviousVisibleItem(){let e;if(this.currentFocusedMenuItem){if(e=this.currentFocusedMenuItem.getPreviousSatisfying((e=>e.isVisible)),!e){let t=this.menuSections.find(this.currentFocusedMenuItem.value.immediateParent).getPreviousSatisfying((e=>e.isVisible));if(!t)return;e=t.value.menuItems.findLast((e=>e.isVisible))}}else{let t=this.menuSections.findLast((e=>e.isVisible));if(!t)return;e=t.value.menuItems.findLast((e=>e.isVisible))}this.switchVisualFocus(e)}focusNextVisibleItem(){let e;if(this.currentFocusedMenuItem){if(e=this.currentFocusedMenuItem.getNextSatisfying((e=>e.isVisible)),!e){let t=this.menuSections.find(this.currentFocusedMenuItem.value.immediateParent).getNextSatisfying((e=>e.isVisible));if(!t)return;e=t.value.menuItems.findFirst((e=>e.isVisible))}}else{let t=this.menuSections.findFirst((e=>e.isVisible));if(!t)return;e=t.value.menuItems.findFirst((e=>e.isVisible))}this.switchVisualFocus(e)}filterItems(){this.menuSections.forEach((e=>{e.filterSection(this.filterInput)})),this.menuSections.any((e=>e.isVisible))?this.quickMenuEmpty.hide():this.quickMenuEmpty.show(),this.focusOnTheFirstVisibleItem()}show(){setTimeout((()=>{const e=document.activeElement;if(!e)return void console.error("Failed to display the quickMenu: no active element found. Please ensure an element is focused before attempting to display the quickMenu.");this.focusStack.push(e);const t=window.getSelection();if(!t||0===t.rangeCount)throw new Error("Nenhuma seleção encontrada");const n=t.getRangeAt(0).getBoundingClientRect();this.htmlElement.style.display="flex";const o=this.htmlElement.offsetWidth;let i=n.left+window.scrollX;i+o>window.innerWidth&&(i=window.innerWidth-o-20);const r=this.htmlElement.offsetHeight;let s=n.top+window.scrollY-r-10;s<0&&(s=n.bottom+window.scrollY+10),this.htmlElement.style.left=`${i}px`,this.htmlElement.style.top=`${s}px`,super.show(),this.focusOnTheFirstVisibleItem(),this.focusStack.peek()?.focus()}),10)}restore(){this.filterInput="",this.menuSections.forEach((e=>{e.restore()}))}hide(){this.restore(),this.focusStack.peek()?.focus(),super.hide()}attachEvents(){document.addEventListener(r.emittedCommand,(e=>{const{command:t}=e.detail;t==l.transformBlock&&this.hide()})),document.addEventListener("keydown",(e=>{const t=M.findClosestAncestorOfActiveElementByClass("block");if(this.isVisible||"/"!==e.key||e.ctrlKey||e.shiftKey||e.altKey||!t)(!this.isVisible||"ArrowLeft"!==e.key||e.ctrlKey||e.shiftKey||e.altKey)&&(!this.isVisible||"ArrowRight"!==e.key||e.ctrlKey||e.shiftKey||e.altKey)?!this.isVisible||"ArrowDown"!==e.key||e.ctrlKey||e.shiftKey||e.altKey?!this.isVisible||"ArrowUp"!==e.key||e.ctrlKey||e.shiftKey||e.altKey?!this.isVisible||!/^[a-z0-9 ]$/i.test(e.key)||e.ctrlKey||e.shiftKey||e.altKey?this.isVisible&&"Backspace"===e.key?""==this.filterInput?this.hide():(this.removeLastFilterInputCharacter(),this.filterItems()):!this.isVisible||"Escape"!==e.key||e.ctrlKey||e.shiftKey||e.altKey||this.hide():(this.concatFilterInput(e.key),this.filterItems()):(e.preventDefault(),this.focusPreviousVisibleItem()):(e.preventDefault(),this.focusNextVisibleItem()):(e.preventDefault(),e.stopPropagation());else{if(e.target.closest(he.TD))return;this.show()}})),document.addEventListener("click",(e=>{this.isVisible&&!e.target.closest(`#${this.htmlElement.id}`)&&this.hide()})),document.addEventListener("keydown",(e=>{if(this.isVisible&&"Enter"===e.key&&!e.ctrlKey&&!e.shiftKey&&!e.altKey){e.preventDefault(),e.stopPropagation();const t=this.currentFocusedMenuItem?.value.blockType;t&&this.transformHtmlFocusedElementBeforeOpenQuickMenu(t)}})),document.addEventListener(r.blockTypeChanged,(e=>{this.hide()}))}emitCommandEvent(e){const t=new CustomEvent(r.emittedCommand,{detail:{command:l.transformBlock,value:e}});document.dispatchEvent(t)}transformHtmlFocusedElementBeforeOpenQuickMenu(e){e&&this.emitCommandEvent(e)}concatFilterInput(e){this.filterInput+=e.toLowerCase()}removeLastFilterInputCharacter(){this.filterInput.length>0&&(this.filterInput=this.filterInput.slice(0,-1))}}class fe extends Z{constructor(){super()}append(e){const t=new W(e,this);this.head&&this.tail?(this.tail.setNext(t),t.setPrevious(this.tail),this.tail=t):(this.head=t,this.tail=t),this.length++}}class we extends O{immediateParent;menuItems=new fe;constructor(e){super({title:e.title,classList:e.classList}),this.immediateParent=e.quickMenuInstance}init(){const e=document.createElement("section");e.classList.add(this.props.classList);const t=document.createElement("h2");return t.textContent=this.props.title,e.appendChild(t),e}appendQuickMenuItems(e){e.forEach((e=>{this.appendQuickMenuItem(e)}))}appendQuickMenuItem(e){this.menuItems.append(e),this.htmlElement.appendChild(e.htmlElement)}filterSection(e){this.restore(),""!==e&&(this.menuItems.forEach((t=>{t.filterValue.toLocaleLowerCase().includes(e)||t.hide()})),this.menuItems.any((t=>t.filterValue.toLocaleLowerCase().includes(e)))||this.hide())}restore(){this.show(),this.menuItems.forEach((e=>{e.show()}))}}class ve extends O{_blockType;_filterValue;_immediateParent;constructor(e,t,n,o,i,r){super({title:t,description:n,iconId:o}),this._blockType=i,this._filterValue=r,this._immediateParent=e,this.attachEvents()}init(){const e=document.createElement("div");e.classList.add("option","option-hover","block-operation"),e.setAttribute("data-block-operation","apply-selected-block-type"),e.setAttribute("tabindex","0"),e.setAttribute("role","option");const t=document.createElement("div");t.classList.add("option-image");const n=new K(this.props.iconId,"100%");t.appendChild(n.htmlElement),e.appendChild(t);const o=document.createElement("div");o.classList.add("option-text");const i=document.createElement("p");i.classList.add("block-title"),i.innerText=this.props.title,o.appendChild(i);const r=document.createElement("p");return r.classList.add("block-description"),r.innerText=this.props.description,o.appendChild(r),e.appendChild(o),e}get display(){return"flex"}get filterValue(){return this._filterValue}get immediateParent(){return this._immediateParent}get blockType(){return this._blockType}focus(){this.htmlElement.classList.add("option-focused"),this.htmlElement.focus()}removeFocus(){this.htmlElement.classList.remove("option-focused")}emitCommandEvent(){const e=new CustomEvent(r.emittedCommand,{detail:{command:l.transformBlock,value:this.blockType}});document.dispatchEvent(e)}attachEvents(){this.htmlElement.addEventListener("mousemove",(()=>{const e=this._immediateParent.menuItems.find(this);this._immediateParent.immediateParent.switchVisualFocus(e)})),this.htmlElement.addEventListener("click",(e=>{e.preventDefault(),e.stopPropagation(),this.emitCommandEvent()}))}}class Ie{static build(){const e=Be.getInstance(),t=new we({quickMenuInstance:e,title:"Basic blocks",classList:"basic-section"});t.appendQuickMenuItems([new ve(t,"Text","Start writing in plain text.","icon-material-format",L.ELEMENT_TYPES.PARAGRAPH,"paragraph text p"),new ve(t,"Bulleted list","Organize items with bullet points.","icon-wordpress-bulleted-list","bulleted-list","bulleted list unordered list ul"),new ve(t,"Numbered list","List items in a numbered format.","icon-wordpress-numbered-list","numbered-list","numbered list number list sequential list ol enumerated list ordered list"),new ve(t,"Table","Organize data in rows and columns.","icon-material-table",L.ELEMENT_TYPES.TABLE,"table tr th"),new ve(t,"Callout","Emphasize key points with a callout box.",i.Callout,L.ELEMENT_TYPES.CALLOUT,"callout note spotlight"),new ve(t,"Code","Include code snippet.","icon-wordpress-code-mark","code","code script source markup"),new ve(t,"Quote","Highlight text as a quote.","icon-wordpress-quote","quote","quote blockquote citation quotation"),new ve(t,"Heading 2","Medium header for sections.","icon-julia-head-2",L.ELEMENT_TYPES.HEADER_2,"header 2 heading 2 h2"),new ve(t,"Heading 3","Small header for subsections.","icon-julia-head-2",L.ELEMENT_TYPES.HEADER_3,"header 3 heading 3 h3"),new ve(t,"Separator","Visually divide blocks.","icon-wordpress-separator","separator","separator divider rule line")]),e.append(t);const n=new we({quickMenuInstance:e,title:"Media",classList:"media-section"});n.appendQuickMenuItems([new ve(n,"Image","Upload image.",i.Image,L.ELEMENT_TYPES.IMAGE,"image figure photo illustration picture media upload"),new ve(n,"Video","Embed video.",i.Video,"video","video embed youtube vimeo clip film movie tape")]),e.append(n);const o=new we({quickMenuInstance:e,title:"Heading",classList:"heading-section"});o.appendQuickMenuItems([new ve(o,"Heading 1","Large header for main topics.","icon-julia-head-1",L.ELEMENT_TYPES.HEADER_1,"header 1 heading 1 h1"),new ve(o,"Heading 2","Medium header for sections.","icon-julia-head-2",L.ELEMENT_TYPES.HEADER_2,"header 2 heading 2 h2"),new ve(o,"Heading 3","Small header for subsections.","icon-julia-head-3",L.ELEMENT_TYPES.HEADER_3,"header 3 heading 3 h3"),new ve(o,"Heading 4","Detailed header for subtopics.","icon-julia-head-4",L.ELEMENT_TYPES.HEADER_4,"header 4 heading 4 h4"),new ve(o,"Heading 5","Minor header for specifics.","icon-julia-head-5",L.ELEMENT_TYPES.HEADER_5,"header 5 heading 5 h5"),new ve(o,"Heading 6","Smallest header for fine details.","icon-julia-head-6",L.ELEMENT_TYPES.HEADER_6,"header 6 heading 6 h6")]),e.append(o);const r=new we({quickMenuInstance:e,title:"List",classList:"list-section"});r.appendQuickMenuItems([new ve(r,"Todo list","Track tasks with checkboxes.","icon-material-check-list-2","todo-list","todo list task list checklist"),new ve(r,"Bulleted list","Organize items with bullet points.","icon-wordpress-bulleted-list","bulleted-list","bulleted list unordered list ul"),new ve(r,"Numbered list","List items in a numbered format.","icon-wordpress-numbered-list","numbered-list","numbered list number list sequential list ol enumerated list ordered list")]),e.append(r);const s=new we({quickMenuInstance:e,title:"Embed",classList:"embed-section"});return s.appendQuickMenuItems([new ve(s,"GitHub Gist","Track tasks with checkboxes.","icon-material-check-list-2","todo-list","todo list task list checklist"),new ve(s,"GitLab Snippet ","List items in a numbered format.","icon-wordpress-numbered-list","numbered-list","numbered list number list sequential list ol enumerated list ordered list"),new ve(s,"CodePen","Organize items with bullet points.","icon-wordpress-bulleted-list","bulleted-list","bulleted list unordered list ul"),new ve(s,"Google Maps","List items in a numbered format.","icon-wordpress-numbered-list","numbered-list","numbered list number list sequential list ol enumerated list ordered list")]),e.append(s),e}}class ye extends O{constructor(e){super({value:e}),this.attachEvents()}init(){const e=document.createElement("div");e.classList.add("title");const t=document.createElement("h1");return t.setAttribute("contentEditable","true"),t.setAttribute("data-placeholder","Untitled"),this.props.value&&(t.textContent=this.props.value),e.appendChild(t),e}attachEvents(){this.htmlElement.addEventListener("keydown",(e=>{"Enter"==e.key&&(e.preventDefault(),document.dispatchEvent(new CustomEvent(r.focusOnFirstRequested,{})))}))}static create(e){return new ye(e)}}class ke{static build(){return ye.create(window.editorConfig?.title)}}class xe extends O{constructor(){super({}),this.attachEvent()}init(){const e=document.createElement("div");return e.classList.add("content"),window.editorConfig,e.append(L.blockParagraph()),e}clearSelectionOnDrag(){document.addEventListener("mousedown",(e=>{const t=e.target;let n;t&&(n=t.nodeType==Node.TEXT_NODE?t.parentElement:t,n&&n.closest(".drag-handler")&&window.getSelection()?.removeAllRanges())}))}attachEvent(){this.clearSelectionOnDrag(),this.reRenderPlaceholder(),document.addEventListener("copiedText",(()=>{const e=document.querySelector("#copyOption .text-option span");e&&(e.textContent="Copied!",setTimeout((()=>{e.textContent="Copy"}),1500))})),document.addEventListener("DOMContentLoaded",(function(){const e=document.querySelector(".johannes-editor");if(e){let t=e.querySelectorAll(".block");if(1==t.length){const e=t[0].querySelector(".johannes-content-element");""==e.innerText&&e.focus()}}})),this.htmlElement.addEventListener("keydown",(async e=>{const t=N.Instance.resolve("IQuickMenu"),n=N.Instance.resolve("ITableContextFloatingToolbar");if(!(e.ctrlKey||e.shiftKey||e.altKey))if("Enter"!==e.key||t.isVisible||n.isVisible)if("Backspace"===e.key){const t=e.target;t.classList.contains("johannes-content-element")&&""===t.textContent?.trim()?(e.stopImmediatePropagation(),document.dispatchEvent(new CustomEvent(r.emittedCommand,{detail:{command:l.focusOnPreviousBlock}})),document.dispatchEvent(new CustomEvent(r.emittedCommand,{detail:{command:l.focusOnPreviousBlock}}))):t.classList.contains("johannes-content-element")&&t.textContent?.trim()}else if("Delete"===e.key){const t=e.target;t.classList.contains("johannes-content-element")&&""===t.textContent?.trim()||t.classList.contains("johannes-content-element")&&t.textContent?.trim()}else"ArrowRight"===e.key&&xe.isCursorAtEnd(e.target)||"ArrowLeft"===e.key&&xe.isCursorAtStart(e.target)||"ArrowDown"===e.key&&xe.isCursorOnLastLine()||"ArrowUp"===e.key&&xe.isCursorOnFirstLine();else e.preventDefault(),e.stopImmediatePropagation(),document.dispatchEvent(new CustomEvent(r.emittedCommand,{detail:{command:l.insertNew}}))}))}reRenderPlaceholder(){document.addEventListener("input",(function(e){if(e.target instanceof HTMLElement){const t=e.target;if(t.isContentEditable&&t.hasAttribute("data-placeholder")){const e=t.getAttribute("data-placeholder");""===t.textContent?.trim()&&(t.setAttribute("data-placeholder",e||""),t.textContent="")}}}))}static isCursorAtEnd(e){const t=e.closest(".focusable");if(!t)return!1;const n=window.getSelection();if(!n.rangeCount)return!1;const o=n.getRangeAt(0);let i=o.endContainer;return i.nodeType===Node.TEXT_NODE&&(i=i.parentNode),o.collapsed&&i===t&&o.endOffset===(o.endContainer.textContent||"").length}static isCursorAtStart(e){const t=e.closest(".focusable");if(!t)return!1;const n=window.getSelection();if(!n.rangeCount)return!1;const o=n.getRangeAt(0);let i=o.startContainer;return i.nodeType===Node.TEXT_NODE&&(i=i.parentNode),o.collapsed&&i===t&&0===o.startOffset}static isAtFirstVisibleLine(e){const t=window.getSelection();if(!t.rangeCount)return!1;const n=t.getRangeAt(0).cloneRange();return n.collapse(!0),n.setStart(e,0),n.getBoundingClientRect().top===e.getBoundingClientRect().top}static isAtLastVisibleLine(e){const t=window.getSelection();if(!t.rangeCount)return!1;const n=t.getRangeAt(0).cloneRange();return n.collapse(!1),n.setEnd(e,e.childNodes.length),n.getBoundingClientRect().bottom===e.getBoundingClientRect().bottom}static didCursorMove(e){const t=window.getSelection();if(!t.rangeCount)return Promise.resolve(!1);const n=t.getRangeAt(0).cloneRange().getBoundingClientRect();return new Promise((o=>{setTimeout((()=>{const i=t.getRangeAt(0).cloneRange().getBoundingClientRect(),r=!(n.top===i.top&&n.left===i.left);r||e.preventDefault(),o(r)}),0)}))}static isCursorOnFirstLine(){const e=window.getSelection();if(!e||!e.rangeCount)return!1;const t=e.getRangeAt(0);return 0===t.startOffset&&t.startContainer===t.commonAncestorContainer}static isCursorOnLastLine(){const e=window.getSelection();if(!e||!e.rangeCount)return!1;const t=e.getRangeAt(0);return t.endOffset===t.endContainer.textContent?.length&&t.endContainer===t.commonAncestorContainer}static getInstance(){return N.Instance.resolve("IShortcutListeners"),N.Instance.resolve("ITableListeners"),new xe}}class Te{static build(){return xe.getInstance()}}!function(e){e.ArrowUp="ArrowUp",e.ArrowDown="ArrowDown",e.ArrowLeft="ArrowLeft",e.ArrowRight="ArrowRight"}(Ae||(Ae={})),function(e){e.Column="Column",e.Row="Row",e.Cell="Cell",e.SelectedCells="SelectedCells"}(pe||(pe={}));class Se{static addRow(e,t=null){const n=null!==t&&t>=0&&t<=e.rows.length?t:e.rows.length,o=e.insertRow(n),i=Array.from(e.rows).reduce(((e,t)=>Math.max(e,t.cells.length)),0);let r=[];for(let e=0;e{r.forEach((e=>e.classList.remove("temporary-shadow")))}),700)}static addColumn(e,t=null){const n=null!==t?t:void 0;let o=[];for(let t=0;t{o.forEach((e=>e.classList.remove("temporary-shadow")))}),700)}static isLastColumn(e,t){if(!e.contains(t))return!1;const n=t.parentElement;return t===n.cells[n.cells.length-1]}static isLastRow(e,t){return!!e.contains(t)&&t.parentElement===e.rows[e.rows.length-1]}static removeColumnByCell(e){if("td"!==e.tagName.toLowerCase()&&"th"!==e.tagName.toLowerCase())throw new Error("The provided element is not a table cell.");const t=e.parentElement.parentElement,n=e.cellIndex;for(let e=0;e=0;t--){const n=e.rows[t];for(let e=n.cells.length-1;e>=0;e--){const t=n.cells[e];if(t.isContentEditable)return t}}return null}static getFirstTableCell(e){for(let t=0;t{e.style.border=`1px double ${n}`}))}}!function(e){e.Shift="Shift",e.Enter="Enter",e.Escape="Escape"}(Ce||(Ce={})),function(e){e.Text="Text",e.Cell="Cell",e.Block="Block"}(ge||(ge={}));class Le extends ae{static id="tableFloatingToolbar";static instance;focusStack;selectedCells=[];actualFocusedCell=null;tableOperationsService;controller;selectionMode=ge.Text;selectionFlag=!1;selectedText="";constructor(e,t){if(Le.instance)throw new Error("Use TableContextFloatingToolbar.getInstance() to get instance.");super(Le.id),this.clearAndHide=this.clearAndHide.bind(this),this.htmlElement.style.zIndex=d.ModeratelyImportant,this.controller=new AbortController,this.focusStack=e,this.tableOperationsService=t,this.attachEvents()}attachEvents(){document.addEventListener(u.Mousedown,this.handleMouseDown.bind(this)),document.addEventListener(u.Mousemove,this.handleMouseMove.bind(this)),document.addEventListener(u.Mouseup,this.handleMouseUp.bind(this)),document.addEventListener(u.Keydown,this.handleStartSelectionInCellKeyDown.bind(this)),document.addEventListener(u.Keydown,this.handleCellSelectionContinuationOnKeyDown.bind(this)),document.addEventListener(u.Keydown,this.handleKeyDown.bind(this)),document.addEventListener(u.Keyup,this.handleKeyUp.bind(this)),this.attachUIEvent(),super.attachEvents()}handleMouseDown(e){const t=e.target.closest(he.TD);t&&(console.log("MouseDown event on: ",e.target),e.stopImmediatePropagation(),this.controller.abort(),t!=this.actualFocusedCell&&this.hide(),this.clearAll(),this.addSelectedCell(t),this.selectionFlag=!0,this.selectionMode=ge.Text)}handleMouseMove(e){if(this.selectionFlag){const t=e.target.closest(he.TD);t&&(this.updateSelectionModeByMouseEvent(e),this.selectionMode==ge.Cell&&(e.stopImmediatePropagation(),e.preventDefault(),this.canHide&&this.hide(),this.addSelectedCell(t),document.getSelection()?.removeAllRanges()))}}handleMouseUp(e){this.selectedCells.length>0&&this.selectionFlag&&(this.resetSelectionState(),this.show())}handleKeyDown(e){e.target.closest(he.TD)&&(e.key!=Ce.Enter||e.shiftKey||e.ctrlKey||e.metaKey||e.altKey?e.key==Ce.Escape&&this.canHide&&!ce.getInstance().isVisible&&setTimeout((()=>{this.canHide&&(e.stopImmediatePropagation(),this.clearAll(),this.hide())}),10):e.stopImmediatePropagation())}handleStartSelectionInCellKeyDown(e){const t=e.target.closest(he.TD);t&&(e.repeat||e.key!==Ce.Shift||(e.stopImmediatePropagation(),this.controller.abort(),this.selectionFlag=!0,this.selectionMode=ge.Text,this.addSelectedCell(t)))}handleCellSelectionContinuationOnKeyDown(e){if(this.selectionFlag){const t=e.target.closest(he.TD);if(t&&this.selectionMode==ge.Cell&&e.shiftKey&&e.key.startsWith("Arrow")&&!e.repeat){e.stopImmediatePropagation(),e.preventDefault();const n=t.closest(he.TABLE),o=Se.getNeighborCell(n,t,e.key);this.addSelectedCell(t),o&&this.addSelectedCell(o)}}}normalizeText(e){return e.replace(/\s+/g," ").trim()}updateTheSelectionModeByCurrentSelectionState(e){if(this.selectionFlag){const t=document.getSelection();if(t){const n=this.normalizeText(t.toString().trim()),o=e.target.closest(he.TD),i=this.normalizeText((o.textContent||"").trim()),{atStart:r,atEnd:s}=M.getSelectionTextInfo(o);""===i||n===this.selectedText.trim()&&(r||s)?(this.selectionMode=ge.Cell,this.selectedText="",this.canHide&&this.hide()):n&&(this.selectedText=n)}}}updateSelectionModeByMouseEvent(e){if(this.selectionFlag&&this.actualFocusedCell){const t=this.actualFocusedCell.getBoundingClientRect(),n=e.clientX,o=e.clientY;n>=t.left&&n<=t.right&&o>=t.top&&o<=t.bottom||(this.selectionMode=ge.Cell,this.canHide&&this.hide())}}handleKeyUp(e){e.target.closest(he.TD)&&(e.stopImmediatePropagation(),this.updateTheSelectionModeByCurrentSelectionState(e),e.key===Ce.Shift&&(this.resetSelectionState(),this.selectedCells.length>0&&this.show()))}addSelectedCell(e){if(0===this.selectedCells.length)return this.selectedCells.push(e),e.classList.add("selected"),this.actualFocusedCell=e,void e.focus();this.selectedCells[this.selectedCells.length-1].closest("table")===e.closest("table")&&(-1===this.selectedCells.indexOf(e)?(this.selectedCells.push(e),e.classList.add("selected"),this.actualFocusedCell=e,e.focus()):(this.actualFocusedCell=e,e.focus()))}attachUIEvent(){document.addEventListener(a.CloseElement,this.handleCloseElementEvent.bind(this))}handleCloseElementEvent(e){const t=e.detail;Le.id==t.targetId&&this.clearAndHide()}show(){this.actualFocusedCell?(this.resetAbortController(),this.focusStack.push(this.actualFocusedCell),this.changeToolbarPositionToBeClosedTo(this.actualFocusedCell),this.processSelectionChangeEffects(),super.show(),this.actualFocusedCell.addEventListener(u.Blur,this.clearAndHide,{signal:this.controller.signal})):console.error("No focused cell found")}processSelectionChangeEffects(){F.emitResetActiveButtonsElementEvent("backgroundColor");const e={};e[s.BackgroundColorRed]=this.tableOperationsService.queryAllStateCellBackgroundColor(this.selectedCells,s.BackgroundColorRed),e[s.BackgroundColorGreen]=this.tableOperationsService.queryAllStateCellBackgroundColor(this.selectedCells,s.BackgroundColorGreen),e[s.BackgroundColorBlue]=this.tableOperationsService.queryAllStateCellBackgroundColor(this.selectedCells,s.BackgroundColorBlue),e[s.BackgroundColorYellow]=this.tableOperationsService.queryAllStateCellBackgroundColor(this.selectedCells,s.BackgroundColorYellow),e[s.BackgroundColorGrey]=this.tableOperationsService.queryAllStateCellBackgroundColor(this.selectedCells,s.BackgroundColorGrey),Object.entries(e).forEach((([e,t])=>{t&&F.emitShowHideActiveElementEvent("backgroundColor",e,"show")}))}changeToolbarPositionToBeClosedTo(e){const t=e.getBoundingClientRect();this.htmlElement.style.display="flex";const n=this.htmlElement.offsetWidth;let o=t.left+window.scrollX+0;o+n>window.innerWidth&&(o=window.innerWidth-n-20);const i=this.htmlElement.offsetHeight;let r=t.top+window.scrollY-i-10;r<0&&(r=t.bottom+window.scrollY+10),this.htmlElement.style.left=`${o}px`,this.htmlElement.style.top=`${r}px`}resetSelectionState(){this.selectionMode=ge.Text,this.selectionFlag=!1,this.selectedText=""}clearAll(){this.actualFocusedCell=null,document.querySelectorAll("td").forEach((e=>e.classList.remove("selected"))),this.selectedCells=[]}hide(){this.canHide&&super.hide()}clearAndHide(){this.clearAll(),this.hide()}resetAbortController(){this.controller=new AbortController}static getInstance(){const e=N.Instance.resolve("IFocusStack"),t=N.Instance.resolve("ITableOperationsService");return new Le(e,t)}}class Oe{static build(){const e=N.Instance.resolve("ITableOperationsService"),t=Le.getInstance();return t.appendDropdown(Oe.tableOptions(e)),t.appendSeparator(Oe.separator("tableOperationsSeparator")),t.appendDropdown(Oe.tableColorDropdown()),t}static tableOptions(e){const t=new $("tableOptionsSelect"),n=new oe("tableOptions","Options",t),o=new G("tableOptionsMenu",n,t);t.append(new ie(t,"Insert Column")),t.append(new Q("turnIntoOptionText",t,l.insertTableColumnLeft,L.ELEMENT_TYPES.PARAGRAPH,K.create(i.ColumnLeft,Y.medium).htmlElement,"Left")),t.append(new Q("turnIntoOptionText",t,l.insertTableColumnRight,L.ELEMENT_TYPES.PARAGRAPH,K.create(i.ColumnRight,Y.medium).htmlElement,"Right")),t.append(new ie(t,"Insert Row")),t.append(new Q("turnIntoOptionTodoList",t,l.insertTableRowAbove,L.ELEMENT_TYPES.CHECK_LIST,K.create(i.RowAbove,Y.medium).htmlElement,"Above")),t.append(new Q("turnIntoOptionTodoList",t,l.insertTableRowBelow,L.ELEMENT_TYPES.CHECK_LIST,K.create(i.RowBelow,Y.medium).htmlElement,"Below")),t.append(new ie(t,"Remove"));const r=new Q("turnIntoOptionText",t,l.removeColumn,L.ELEMENT_TYPES.PARAGRAPH,K.create(i.deleteSweep,Y.medium).htmlElement,"Column");r.addCssClass("danger-option"),t.append(r);const s=new Q("turnIntoOptionTodoList",t,l.removeRow,L.ELEMENT_TYPES.CHECK_LIST,K.create(i.deleteSweep,Y.medium).htmlElement,"Row");return s.addCssClass("danger-option"),t.append(s),o}static tableColorDropdown(){const e=new $("colorTableOptionSelect"),t=new oe("colorTableButton",new ne("#FAF4D1").htmlElement,e),n=new G("tableColorOptionsMenu",t,e);e.append(new ie(e,"Background"));const o=new Q("backgroundOptionRed",e,l.toggleCellHiliteColor,s.HiliteColorRed,new ne(s.HiliteColorRed).htmlElement,"Red");o.addClass("backgroundColor");const i=new Q("backgroundOptionGreen",e,l.toggleCellHiliteColor,s.HiliteColorGreen,new ne(s.HiliteColorGreen).htmlElement,"Green");i.addClass("backgroundColor");const r=new Q("backgroundOptionBlue",e,l.toggleCellHiliteColor,s.HiliteColorBlue,new ne(s.HiliteColorBlue).htmlElement,"Blue");r.addClass("backgroundColor");const a=new Q("backgroundOptionYellow",e,l.toggleCellHiliteColor,s.HiliteColorYellow,new ne(s.HiliteColorYellow).htmlElement,"Yellow");a.addClass("backgroundColor");const c=new Q("backgroundOptionGrey",e,l.toggleCellHiliteColor,s.HiliteColorGrey,new ne(s.HiliteColorGrey).htmlElement,"Grey");c.addClass("backgroundColor");const d=new Q("backgroundOptionNone",e,l.toggleCellHiliteColor,s.HiliteColorNone,new ne(s.HiliteColorNone).htmlElement,"None");return d.addClass("backgroundColor"),e.append(o),e.append(i),e.append(r),e.append(a),e.append(c),e.append(d),n}static separator(e){return new J(e)}}class Ne extends O{id;focusStack;constructor(){const e="mediaInputter";super({id:e}),this.id=e,this.focusStack=N.Instance.resolve("IFocusStack"),this.attachEvents()}init(){const e=document.createElement("div");e.id=this.props.id,e.classList.add("tab-container","soft-box-shadow"),e.style.display="none",e.style.zIndex=d.SlightlyImportant;const t=document.createElement("ul");t.classList.add("nav","nav-underline");const n=this.createNavItem("uploadTab","Upload",!0),o=this.createNavItem("embedTab","Embed link");t.appendChild(n),t.appendChild(o);const i=document.createElement("div");i.classList.add("tab-content");const r=this.createUploadContent(),s=this.createEmbedContent();return i.appendChild(r),i.appendChild(s),e.appendChild(t),e.appendChild(i),e}createNavItem(e,t,n=!1){const o=document.createElement("li");o.classList.add("nav-item"),n&&o.classList.add("active"),o.id=e;const i=document.createElement("a");return i.classList.add("nav-link"),i.innerText=t,o.appendChild(i),o}createUploadContent(){const e=document.createElement("div");e.id="uploadContent",e.classList.add("upload-content","content-data");const t=document.createElement("label");t.innerText="Upload file";const n=document.createElement("div");return n.classList.add("text-info"),n.innerText="Maximum file size: 5MB",e.appendChild(t),e.appendChild(n),e}createEmbedContent(){const e=document.createElement("div");e.id="embedContent",e.classList.add("content-data","embed-content");const t=document.createElement("input");t.type="text",t.setAttribute("placeholder","Paste URL here");const n=document.createElement("button");return n.innerText="Embed",n.addEventListener("click",(()=>this.embedGeneric(t.value))),e.appendChild(t),e.appendChild(n),e}embedGeneric(e){const t=new URL(e),n=t.hostname,o=t.pathname;switch(n){case"www.youtube.com":o.startsWith("/watch")?this.embedYouTubeVideo(t):o.startsWith("/playlist")&&this.embedYouTubePlaylist(t);break;case"open.spotify.com":o.startsWith("/track")?this.embedSpotifyTrack(t):o.startsWith("/playlist")&&this.embedSpotifyPlaylist(t);break;case"twitter.com":this.embedTweet(t);break;case"www.google.com":case"www.google.com.br":o.startsWith("/maps")&&this.embedGoogleMap(t);break;case"gist.github.com":this.embedGist(t,"github");break;case"gitlab.com":o.includes("/snippets")&&this.embedGist(t,"gitlab");break;case"codepen.io":this.embedCodepen(t);break;default:console.error("Unsupported URL for embedding")}}embedYouTubeVideo(e){const t=e.searchParams.get("v");if(t){const e=this.createEmbedContainer(),n=document.createElement("iframe");n.src=`https://www.youtube.com/embed/${t}`,n.frameBorder="0",n.allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture",n.allowFullscreen=!0,e.appendChild(n),this.finalizeEmbed(e)}else console.error("Invalid YouTube video URL")}embedYouTubePlaylist(e){const t=e.searchParams.get("list");if(t){const e=this.createEmbedContainer(),n=document.createElement("iframe");n.src=`https://www.youtube.com/embed/videoseries?list=${t}`,n.setAttribute("allowfullscreen","true"),e.appendChild(n),this.finalizeEmbed(e)}else console.error("Invalid YouTube playlist URL")}embedSpotifyTrack(e){const t=e.pathname.split("/").pop(),n=this.createEmbedContainer(),o=document.createElement("iframe");o.src=`https://open.spotify.com/embed/track/${t}`,o.frameBorder="0",o.width="auto",n.appendChild(o),this.finalizeEmbed(n)}embedSpotifyPlaylist(e){const t=e.pathname.split("/").pop(),n=this.createEmbedContainer(),o=document.createElement("iframe");o.src=`https://open.spotify.com/embed/playlist/${t}`,o.frameBorder="0",n.appendChild(o),this.finalizeEmbed(n)}embedTweet(e){e.pathname.split("/").pop();const t=document.createElement("script");t.setAttribute("src","https://platform.twitter.com/widgets.js");const n=this.createEmbedContainer(),o=document.createElement("blockquote");o.classList.add("twitter-tweet"),o.setAttribute("data-theme","light"),o.innerHTML=`Loading tweet...`,n.appendChild(o),n.appendChild(t),this.finalizeEmbed(n)}embedGoogleMap(e){const t=e.search.slice(1),n=this.createEmbedContainer(),o=document.createElement("iframe");o.src=`https://www.google.com/maps?${t}&output=embed`,o.style.maxWidth="100%",o.style.height="450px",n.appendChild(o),this.finalizeEmbed(n)}embedGist(e,t){const n=e.pathname.split("/").pop(),o=this.createEmbedContainer();let i;if(o.style.width="100%","github"===t)i=`https://gist.github.com/${n}.js`;else{if("gitlab"!==t)return void console.error("Unsupported service for embedding gists");i=`https://gitlab.com/snippets/${n}/raw`}const r=document.createElement("script");r.src=i,r.onload=()=>{console.log("Gist loaded successfully from "+t)},r.onerror=()=>{console.error("Failed to load the Gist from "+t)},o.appendChild(r),this.finalizeEmbed(o)}embedCodepen(e){const t=e.pathname.split("/"),n=t[1],o=t[3],i=this.createEmbedContainer(),r=document.createElement("iframe");r.src=`https://codepen.io/${n}/embed/${o}?height=265&theme-id=light&default-tab=js,result`,r.style.border="none",r.style.maxWidth="100%",i.appendChild(r),this.finalizeEmbed(i)}createEmbedContainer(){const e=document.createElement("div");return e.classList.add("embed-container","background"),e}finalizeEmbed(e){const t=this.focusStack.peek();if(t){for(t.classList.add("resizable");t.firstChild;)t.removeChild(t.firstChild);t.appendChild(e)}this.hide()}set inputValue(e){const t=this.htmlElement.querySelector("input");t&&(t.value=e)}get display(){return"flex"}attachUIEvent(){document.addEventListener(a.ShowElement,this.handleShowElementEvent.bind(this))}handleShowElementEvent(e){e.detail.targetId==this.id&&this.show()}attachEvents(){this.attachUIEvent();const e=this.htmlElement.querySelector("#uploadTab");e?.addEventListener("click",(()=>{this.setActiveTab("uploadTab","uploadContent")}));const t=this.htmlElement.querySelector("#embedTab");t?.addEventListener("click",(()=>{this.setActiveTab("embedTab","embedContent")})),document.addEventListener(u.Keydown,this.handlerEvent.bind(this)),document.addEventListener(u.Click,this.handlerAnotherEvent.bind(this))}handlerEvent(e){e.key==Ce.Escape&&this.canHide&&this.hide()}handlerAnotherEvent(e){if(M.findClickedElementOrAncestorById(e,"embedImage")){e.stopImmediatePropagation();const t=this.focusStack.peek();t&&this.embedImage(t)}if(M.findClickedElementOrAncestorById(e,"embedVideo")){e.stopImmediatePropagation();const t=this.focusStack.peek();t&&this.embedVideo(t)}if(!M.findClickedElementOrAncestorById(e,this.id)&&this.isVisible)return e.stopImmediatePropagation(),void this.hide();const t=M.findClickedElementOrAncestorByClass(e,"temp-image-replace");if(t)return e.stopImmediatePropagation(),this.focusStack.push(t),void this.show();const n=M.findClickedElementOrAncestorByClass(e,"temp-video-replace");return n?(e.stopImmediatePropagation(),this.focusStack.push(n),void this.show()):void 0}getTab(e){return document.getElementById(e)}getContent(e){return document.getElementById(e)}setActiveTab(e,t){document.querySelectorAll(".nav-item").forEach((e=>{e.classList.remove("active")})),document.querySelectorAll(".content-data").forEach((e=>{e.classList.remove("active")})),this.getTab(e)?.classList.add("active"),this.getContent(t)?.classList.add("active")}embedImage(e){const t=document.querySelector("#embedContent input[type=text]")?.value;console.log("Embedding image from URL:",t);const n=e.closest(".johannes-content-element");if(n){for(;n.firstChild;)n.removeChild(n.firstChild);const e=document.createElement("img");e.contentEditable="true",e.src=t,e.alt="Embedded Image",e.style.maxWidth="100%",e.style.width="auto",e.style.height="auto",n.classList.add("resizable"),e.classList.add("background"),n.appendChild(e)}else console.error('No content element found with data-content-type="image"');this.hide()}embedVideo(e){const t=document.querySelector("#videoContent input[type=text]")?.value;console.log("Embedding video from URL:",t);const n=e.closest(".johannes-content-element");if(n){for(;n.firstChild;)n.removeChild(n.firstChild);const e=new URL(t).searchParams.get("v");if(e){const t=document.createElement("div");t.classList.add("video-container");const o=document.createElement("iframe");o.src=`https://www.youtube.com/embed/${e}`,o.frameBorder="0",o.allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture",o.allowFullscreen=!0,t.appendChild(o),n.appendChild(t),n.classList.add("resizable"),o.classList.add("background")}else console.error("Invalid YouTube URL")}else console.error('No content element found with data-content-type="video"');this.hide()}show(){const e=this.focusStack.peek();e&&this.changeToolbarPositionToBeClosedTo(e),this.htmlElement.style.visibility="visible",super.show()}hide(){this.inputValue="",super.hide()}changeToolbarPositionToBeClosedTo(e){const t=e.getBoundingClientRect();this.htmlElement.style.display="flex",this.htmlElement.style.visibility="hidden";let n=t.left+window.scrollX+t.width/2-this.htmlElement.offsetWidth/2,o=t.bottom+window.scrollY+10;this.htmlElement.style.left=`${n}px`,this.htmlElement.style.top=`${o}px`}}class Re{static build(){return new Ne}}class Me{static build(){return R.getInstance(ke.build(),Te.build(),z.build(),de.build(),Ie.build(),Oe.build(),Re.build())}}class He{static instance;editor;constructor(e){if(He.instance)throw new Error;this.editor=e,He.instance=this}static build(){return He.instance?He.instance:new He(Me.build())}start(){return this.insertIcons(),this.editor}insertIcons(){if(!document.querySelector(".svg-icons-container")){const e=document.createElement("div");e.innerHTML='\r\n\r\n \r\n\r\n \r\n\r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n\r\n \x3c!-- tags --\x3e\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n\r\n \r\n\r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n\r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n\r\n \r\n \r\n \r\n\r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n',e.className="svg-icons-container",document.body.appendChild(e)}}}class qe{static instance=null;blockOperationsService;tableOperationsService;textOperationsService;constructor(e,t,n){if(qe.instance)throw new Error("Attempt to instantiate singleton `CommandDispatcher` more than once.");this.blockOperationsService=e,this.textOperationsService=t,this.tableOperationsService=n}static getInstance(){const e=N.Instance.resolve("IBlockOperationsService"),t=N.Instance.resolve("ITextOperationsService"),n=N.Instance.resolve("ITableOperationsService");return qe.instance||(qe.instance=new qe(e,t,n)),qe.instance}listen(){document.addEventListener(r.emittedCommand,this.handleCommandEvent),document.addEventListener(r.focusOnFirstRequested,this.handleFocusOnFirstRequestedEvent)}handleCommandEvent=e=>{const{command:t,showUI:n,value:o,targetBlockType:i,block:r,scope:s}=e.detail;switch(t){case l.toggleBold:this.textOperationsService.execBold();break;case l.toggleItalic:this.textOperationsService.execItalic();break;case l.toggleUnderline:this.textOperationsService.execUnderline();break;case l.toggleStrikeThrough:this.textOperationsService.execStrikeThrough();break;case l.toggleHiliteColor:if(!o)throw new Error(`${l.toggleHiliteColor} requires a color value`);this.textOperationsService.execHiliteColor(o);break;case l.toggleForeColor:if(!o)throw new Error(`${l.toggleForeColor} requires a color value`);this.textOperationsService.execForeColor(o);break;case l.transformBlock:if(!o)throw new Error(`${l.transformBlock} requires a value that represents the target element type.`);this.execTransformBlock(o);break;case l.duplicateBlock:this.execDuplicateBlock();break;case l.deleteBlock:this.execDeleteBlock();break;case l.removeFormat:this.execRemoveFormat();break;case l.createDefaultBlock:this.execCreateDefaultBlock();break;case l.insertNew:this.execInsertNew();break;case l.focusOnPreviousBlock:this.execFocusOnPreviousBlock();break;case l.insertTableColumnLeft:this.tableOperationsService.insertColumnLeft();break;case l.insertTableColumnRight:this.tableOperationsService.insertColumnRight(r||null);break;case l.insertTableRowAbove:this.tableOperationsService.insertRowAbove();break;case l.insertTableRowBelow:this.tableOperationsService.insertRowBelow(r||null);break;case l.toggleCellHiliteColor:if(!o)throw new Error(`${l.toggleCellHiliteColor} requires a value that represents the cell background color.`);this.tableOperationsService.execCellBackgroundColor(o);break;case l.removeColumn:this.tableOperationsService.removeColumn();break;case l.removeRow:case l.removeRow:this.tableOperationsService.removeRow();break;case l.changeTableBorderColor:this.tableOperationsService.changeTableBorderColor(s,o);break;default:console.error(`No action defined for command: ${t}`)}};execTransformBlock(e){return this.blockOperationsService.transformBlock(e),!0}execDuplicateBlock(){return this.blockOperationsService.execCommand(V.BLOCK_OPERATIONS.DUPLICATE,!1)}execDeleteBlock(){return this.blockOperationsService.execCommand(V.BLOCK_OPERATIONS.DELETE,!1)}execRemoveFormat(){return this.blockOperationsService.execCommand(V.BLOCK_OPERATIONS.REMOVE_FORMAT,!1)}execCreateDefaultBlock(){return this.blockOperationsService.execCommand(V.BLOCK_OPERATIONS.CREATE_DEFAULT_BLOCK,!1)}execInsertNew(){return this.blockOperationsService.createNewElementAndSplitContent()}execFocusOnPreviousBlock(){return this.blockOperationsService.execCommand(V.BLOCK_OPERATIONS.DELETE_FOCUS_ON_PREVIOUS,!1)}handleFocusOnFirstRequestedEvent=()=>{this.blockOperationsService.execCommand(V.BLOCK_OPERATIONS.FOCUS_ON_FIRST,!1)}}class _e{static instance=null;constructor(){if(_e.instance)throw new Error("Use ShortcutListeners.getInstance() to get instance.");this.listen()}startListen(){console.log("listening keyboard shortcuts")}static getInstance(){return _e.instance?_e.instance:new _e}listen(){document.addEventListener("keydown",(e=>{console.log(`Key: ${e.key}, Code: ${e.code}, Ctrl: ${e.ctrlKey}, Alt: ${e.altKey}, AltGr: ${"AltGraph"===e.key}, NumLock: ${e.getModifierState("NumLock")}`);const t=e.code.startsWith("Numpad"),n=e.getModifierState("NumLock");(e.ctrlKey||e.metaKey)&&e.shiftKey&&"Enter"===e.key?(e.preventDefault(),e.stopPropagation(),alert("converto para paragrafo"),document.dispatchEvent(new CustomEvent(r.emittedCommand,{detail:{command:l.transformBlock,targetBlockType:L.ELEMENT_TYPES.PARAGRAPH}}))):!e.ctrlKey&&!e.metaKey||e.altKey||"Digit1"!==e.code&&"Numpad1"!==e.code?!e.ctrlKey&&!e.metaKey||e.shiftKey||"."!==e.key?!e.ctrlKey&&!e.metaKey||e.shiftKey||"/"!==e.key?e.ctrlKey&&e.altKey&&("Digit1"===e.code||t&&n&&"Numpad1"===e.code)?(e.preventDefault(),e.stopPropagation(),document.dispatchEvent(new CustomEvent(r.emittedCommand,{detail:{command:l.transformBlock,targetBlockType:L.ELEMENT_TYPES.HEADER_1}}))):e.ctrlKey&&e.altKey&&("Digit2"===e.code||t&&n&&"Numpad2"===e.code)?(e.preventDefault(),e.stopPropagation(),document.dispatchEvent(new CustomEvent(r.emittedCommand,{detail:{command:l.transformBlock,targetBlockType:L.ELEMENT_TYPES.HEADER_2}}))):e.ctrlKey&&e.altKey&&("Digit3"===e.code||t&&n&&"Numpad3"===e.code)?(e.preventDefault(),e.stopPropagation(),document.dispatchEvent(new CustomEvent(r.emittedCommand,{detail:{command:l.transformBlock,targetBlockType:L.ELEMENT_TYPES.HEADER_3}}))):e.ctrlKey&&e.altKey&&("Digit4"===e.code||t&&n&&"Numpad4"===e.code)?(e.preventDefault(),e.stopPropagation(),document.dispatchEvent(new CustomEvent(r.emittedCommand,{detail:{command:l.transformBlock,targetBlockType:L.ELEMENT_TYPES.HEADER_4}}))):e.ctrlKey&&e.altKey&&("Digit5"===e.code||t&&n&&"Numpad5"===e.code)?(e.preventDefault(),e.stopPropagation(),document.dispatchEvent(new CustomEvent(r.emittedCommand,{detail:{command:l.transformBlock,targetBlockType:L.ELEMENT_TYPES.HEADER_5}}))):e.ctrlKey&&e.altKey&&("Digit6"===e.code||t&&n&&"Numpad6"===e.code)?(e.preventDefault(),e.stopPropagation(),document.dispatchEvent(new CustomEvent(r.emittedCommand,{detail:{command:l.transformBlock,targetBlockType:L.ELEMENT_TYPES.HEADER_6}}))):"D"!==e.key&&"d"!==e.key||!e.ctrlKey?"Delete"!==e.key&&"Backspace"!==e.key||!e.shiftKey?"\\"===e.key&&(e.ctrlKey||e.metaKey)?document.dispatchEvent(new CustomEvent(r.emittedCommand,{detail:{command:l.removeFormat}})):e.ctrlKey&&e.altKey&&"Digit1"===e.code&&e.preventDefault():(e.preventDefault(),e.stopPropagation(),document.dispatchEvent(new CustomEvent(r.emittedCommand,{detail:{command:l.deleteBlock}}))):(e.preventDefault(),e.stopPropagation(),document.dispatchEvent(new CustomEvent(r.emittedCommand,{detail:{command:l.duplicateBlock}}))):(e.preventDefault(),e.stopPropagation(),document.dispatchEvent(new CustomEvent(r.emittedCommand,{detail:{command:l.transformBlock,targetBlockType:L.ELEMENT_TYPES.NUMBERED_LIST}}))):(e.preventDefault(),e.stopPropagation(),document.dispatchEvent(new CustomEvent(r.emittedCommand,{detail:{command:l.transformBlock,targetBlockType:L.ELEMENT_TYPES.BULLETED_LIST}}))):(e.preventDefault(),e.stopPropagation(),document.dispatchEvent(new CustomEvent(r.emittedCommand,{detail:{command:l.transformBlock,targetBlockType:L.ELEMENT_TYPES.CHECK_LIST}})))}))}}class De{static instance=null;focusStack;shownElements=new Map;constructor(e){if(De.instance)throw new Error("Use TableEventListeners.getInstance() to get instance.");this.focusStack=e,this.listen()}startListen(){console.log("listening table clicks")}static getInstance(){const e=N.Instance.resolve("IFocusStack");return De.instance?De.instance:new De(e)}listen(){document.addEventListener("click",(e=>{let t=null;if(t=e.target.nodeType==Node.TEXT_NODE?e.target.parentElement:e.target,t?.closest(".add-table-column")){const e=new CustomEvent(r.emittedCommand,{detail:{command:l.insertTableColumnRight,block:t.closest(".block")}});document.dispatchEvent(e)}if(t?.closest(".add-table-row")){const e=new CustomEvent(r.emittedCommand,{detail:{command:l.insertTableRowBelow,block:t.closest(".block")}});document.dispatchEvent(e)}}))}}class Pe{static instance;stack;capacity=10;constructor(){this.stack=[]}static getInstance(){return Pe.instance||(Pe.instance=new Pe),Pe.instance}push(e){this.stack.length>=this.capacity&&this.stack.shift(),this.stack.push(e)}peek(){return this.stack[this.stack.length-1]}clear(){this.stack=[]}}!function(e){e.TableToolbar="tableFloatingToolbar",e.TextToolbar="textFloatingToolbar"}(Ee||(Ee={}));class Fe{static instance;focusStack;memento;constructor(e,t){if(Fe.instance)throw new Error("Use TableOperationsService.getInstance() to get instance.");this.focusStack=e,this.memento=t}isActiveCellBackgroundColor(e){throw new Error("Method not implemented.")}removeColumn(){this.memento.saveState();const e=this.focusStack.peek();e&&Se.removeColumnByCell(e),F.emitCloseElementEvent(Ee.TableToolbar)}removeRow(){this.memento.saveState();const e=this.focusStack.peek();e&&Se.removeRowByCell(e),F.emitCloseElementEvent(Ee.TableToolbar)}execCellBackgroundColor(e){this.memento.saveState(),F.emitResetActiveButtonsElementEvent("backgroundColor");const t=Se.getActiveTableCell();t?(t.closest("table").querySelectorAll("td.selected").forEach((t=>{t.style.backgroundColor=e})),F.emitShowHideActiveElementEvent("backgroundColor",e,"show")):console.error("cell not found")}static isCellBackgroundColor(e,t){if(!e||"TD"!==e.tagName||!e.hasAttribute("data-placeholder"))return!1;const n=window.getComputedStyle(e).getPropertyValue("background-color");return S.rgbToHex(n).toUpperCase()===t.toUpperCase()}queryStateCellBackgroundColor(e){const t=Se.getActiveTableCell();if(t){const n=window.getComputedStyle(t).getPropertyValue("background-color");return S.rgbToHex(n).toUpperCase()===e.toUpperCase()}return!1}queryAllStateCellBackgroundColor(e,t){let n=!0;return t!=s.BackgroundColorNone&&(e.forEach((e=>{const o=window.getComputedStyle(e).backgroundColor;S.rgbToHex(o).toLocaleLowerCase()!==t.toLocaleLowerCase()&&(n=!1)})),n)}static getInstance(){const e=N.Instance.resolve("IFocusStack"),t=N.Instance.resolve("IMemento");return this.instance||(this.instance=new Fe(e,t)),this.instance}insertRowAbove(){this.memento.saveState();const e=this.focusStack.peek();if(!e)return void console.error("No cell is focused");const t=e.parentElement;if(!t)return void console.error("No row is focused");const n=t.closest("table");if(!n)return void console.error("Table does not exist");const o=n.querySelector("tbody")||n,i=Array.from(o.children).indexOf(t);i<0?console.error("Row index not found"):(Se.addRow(n,i),F.emitCloseElementEvent(Ee.TableToolbar))}insertRowBelow(e){if(this.memento.saveState(),e){const t=e.querySelector("table");if(!t)return void console.error("Table does not exist");{const e=t.querySelector("tr:last-child");if(!e)return void console.error("No rows in the table");{const n=Array.from(t.children[0].children).indexOf(e)+1;Se.addRow(t,n)}}}else{const e=this.focusStack.peek();if(!e)return void console.error("No focused element available");const t=e.closest("td");if(!t)return void console.error("No cell is focused");const n=t.parentElement,o=t.closest("table");if(!o)return void console.error("Table does not exist");if(n){const e=Array.from(o.children[0].children).indexOf(n)+1;Se.addRow(o,e),F.emitCloseElementEvent(Ee.TableToolbar)}}}insertColumnLeft(){this.memento.saveState();const e=this.focusStack.peek();if(!e)return void console.error("No focused element available");const t=e.closest("td");if(!t)return void console.error("No cell is focused");const n=t.closest("table");if(!n)return void console.error("Table does not exist");const o=Array.from(t.parentElement.children).indexOf(t);Se.addColumn(n,o),F.emitCloseElementEvent(Ee.TableToolbar)}insertColumnRight(e){if(this.memento.saveState(),e){const t=e.querySelector("table");t&&Se.addColumn(t)}else{const e=this.focusStack.peek();if(!e)return void console.error("No focused element available");const t=e.closest("td");if(!t)return void console.error("No cell is focused");const n=t.closest("table");if(!n)return void console.error("Table does not exist");const o=Array.from(t.parentElement.children).indexOf(t);Se.addColumn(n,o+1),F.emitCloseElementEvent(Ee.TableToolbar)}}showInsertLineElement(e){e.querySelector(".add-table-row").style.visibility="visible"}showInsertColumnElement(e){e.querySelector(".add-table-column").style.visibility="visible"}hideInsertRowElement(e){e.querySelector(".add-table-row").style.visibility="hidden"}hideInsertColumnElement(e){e.querySelector(".add-table-column").style.visibility="hidden"}changeTableBorderColor(e,t){const n=this.focusStack.peek()?.closest(he.TABLE);n&&Se.changeCellBorderColor(n,e,t)}}class Ve{static query="#johannesEditor .content";static instance;undoStack=[];redoStack=[];get content(){return document.querySelector(Ve.query)}constructor(){if(Ve.instance)throw new Error("Use Memento.getInstance() to get instance.");this.attachEvents(),this.saveState()}saveState(){this.content&&(this.undoStack.push(this.content.innerHTML),this.redoStack=[])}undo(){if(this.undoStack.length>1&&this.content){this.redoStack.push(this.content.innerHTML);const e=this.undoStack.pop();this.content.innerHTML=e}}redo(){if(this.redoStack.length>0&&this.content){this.undoStack.push(this.content.innerHTML);const e=this.redoStack.pop();this.content.innerHTML=e}}attachEvents(){document.addEventListener("keydown",(e=>{e.ctrlKey&&"z"===e.key?(this.undo(),e.preventDefault()):e.ctrlKey&&"y"===e.key&&(this.redo(),e.preventDefault())}))}static getInstance(){return Ve.instance||(Ve.instance=new Ve),Ve.instance}}!function(e){e.First="First",e.Last="Last"}(be||(be={}));class je{static instance;quickMenu;constructor(e){document.addEventListener("keydown",this.handleArrowKeys.bind(this)),this.quickMenu=e}listen(){console.log("EditableNavigation is now listening for key events.")}static getInstance(){if(!je.instance){const e=N.Instance.resolve("IQuickMenu");je.instance=new je(e)}return je.instance}handleArrowKeys(e){if(!this.quickMenu.isVisible&&e.key.startsWith("Arrow")&&!e.altKey&&!e.ctrlKey&&!e.altKey&&!e.shiftKey&&!e.metaKey){const t=document.activeElement;if(t&&t.isContentEditable&&this.shouldSwitchEditable(t,e.key)){const n=this.findNextEditable(t,e.key);n&&(e.preventDefault(),e.stopImmediatePropagation(),e.key!=Ae.ArrowUp&&e.key!=Ae.ArrowDown||this.placeCaretInSimilarPosition(t,n),e.key==Ae.ArrowLeft&&M.placeCursorAtEndOfEditableElement(n),e.key==Ae.ArrowRight&&M.placeCursorAtStartOfEditableElement(n),n.focus())}}}shouldSwitchEditable(e,t){const n=window.getSelection();if(n&&n.rangeCount>0){let e=n.getRangeAt(0);if(e.endOffset!=e.startOffset)return!1}if(n&&n.rangeCount>0){const{atStart:n,atEnd:o}=M.getSelectionTextInfo(e),i=this.isAtLineBoundary(e,be.First),r=this.isAtLineBoundary(e,be.Last);return!!(t===Ae.ArrowLeft&&n||t===Ae.ArrowRight&&o||t===Ae.ArrowUp&&(n||i)||t===Ae.ArrowDown&&(o||r))}return!1}isAtLineBoundary(e,t){if(""===e.textContent?.trim())return!0;const n=window.getSelection();if(!n||0===n.rangeCount)return!1;const o=n.getRangeAt(0).getClientRects()[0];if(!o)return!0;const i=e.getBoundingClientRect();return t===be.First?Math.abs(o.top-i.top)<11:t===be.Last&&Math.abs(o.bottom-i.bottom)<11}findNextEditable(e,t){const n=Array.from(document.querySelectorAll('[contenteditable="true"]')),o=n.indexOf(e);if(e.closest("td")){const n=e.closest("table"),o=e.closest("td");if(n&&o){const e=Se.getNeighborCell(n,o,t);if(e)return e}}let i=-1;return i=t===Ae.ArrowLeft||t===Ae.ArrowRight?t===Ae.ArrowLeft?o-1:o+1:this.findVerticalEditable(e,n,t),i<0||i>=n.length?null:n[i]||null}findVerticalEditable(e,t,n){const o=t.indexOf(e),i=e.getBoundingClientRect();let r=-1,s=1/0;return t.forEach(((t,o)=>{if(t!==e){const e=t.getBoundingClientRect(),l=n===Ae.ArrowUp?i.top-e.bottom:e.top-i.bottom,a=Math.abs(i.left-e.left);l>0&&l+a0){const e=n.getRangeAt(0).getBoundingClientRect();n.removeAllRanges();const o=document.createRange(),i=document.createTreeWalker(t,NodeFilter.SHOW_TEXT);let r=i.nextNode(),s=r,l=0,a=1/0;if(s){do{if(r&&r.nodeValue){o.setStart(r,0),o.setEnd(r,r.nodeValue.length);for(let t=0;tVe.getInstance())),N.Instance.register("IShortcutListeners",(()=>_e.getInstance())),N.Instance.register("ITableListeners",(()=>De.getInstance())),N.Instance.register("IFocusStack",(()=>Pe.getInstance())),N.Instance.register("IElementFactoryService",(()=>L.getInstance())),N.Instance.register("ITextOperationsService",(()=>re.getInstance())),N.Instance.register("ITableOperationsService",(()=>Fe.getInstance())),N.Instance.register("IBlockOperationsService",(()=>V.getInstance())),N.Instance.register("IQuickMenu",(()=>Be.getInstance())),N.Instance.register("ITableContextFloatingToolbar",(()=>Le.getInstance())),N.Instance.register("IEditableNavigation",(()=>je.getInstance())),He.build().start(),qe.getInstance().listen(),je.getInstance().listen()}))})(); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVuZGxlLmpzIiwibWFwcGluZ3MiOiJ3RkFHSUEsRSxNQUEwQixHQUE0QixLQUUxREEsRUFBd0JDLEtBQUssQ0FBQ0MsRUFBT0MsR0FBSSx3Nm5CQWlxQ3JDLEdBQUcsQ0FBQyxRQUFVLEVBQUUsUUFBVSxDQUFDLHVDQUF1QyxNQUFRLEdBQUcsU0FBVyxpK1BBQWkrUCxlQUFpQixDQUFDLHk2bkJBQTY4bkIsV0FBYSxNQUV6aTRCLFMsVUNscUNBRCxFQUFPRSxRQUFVLFNBQVVDLEdBQ3pCLElBQUlDLEVBQU8sR0E0RVgsT0F6RUFBLEVBQUtDLFNBQVcsV0FDZCxPQUFPQyxLQUFLQyxLQUFJLFNBQVVDLEdBQ3hCLElBQUlDLEVBQVUsR0FDVkMsT0FBK0IsSUFBWkYsRUFBSyxHQW9CNUIsT0FuQklBLEVBQUssS0FDUEMsR0FBVyxjQUFjRSxPQUFPSCxFQUFLLEdBQUksUUFFdkNBLEVBQUssS0FDUEMsR0FBVyxVQUFVRSxPQUFPSCxFQUFLLEdBQUksT0FFbkNFLElBQ0ZELEdBQVcsU0FBU0UsT0FBT0gsRUFBSyxHQUFHSSxPQUFTLEVBQUksSUFBSUQsT0FBT0gsRUFBSyxJQUFNLEdBQUksT0FFNUVDLEdBQVdOLEVBQXVCSyxHQUM5QkUsSUFDRkQsR0FBVyxLQUVURCxFQUFLLEtBQ1BDLEdBQVcsS0FFVEQsRUFBSyxLQUNQQyxHQUFXLEtBRU5BLENBQ1QsSUFBR0ksS0FBSyxHQUNWLEVBR0FULEVBQUtVLEVBQUksU0FBV0MsRUFBU0MsRUFBT0MsRUFBUUMsRUFBVUMsR0FDN0IsaUJBQVpKLElBQ1RBLEVBQVUsQ0FBQyxDQUFDLEtBQU1BLE9BQVNLLEtBRTdCLElBQUlDLEVBQXlCLENBQUMsRUFDOUIsR0FBSUosRUFDRixJQUFLLElBQUlLLEVBQUksRUFBR0EsRUFBSWhCLEtBQUtNLE9BQVFVLElBQUssQ0FDcEMsSUFBSXJCLEVBQUtLLEtBQUtnQixHQUFHLEdBQ1AsTUFBTnJCLElBQ0ZvQixFQUF1QnBCLElBQU0sRUFFakMsQ0FFRixJQUFLLElBQUlzQixFQUFLLEVBQUdBLEVBQUtSLEVBQVFILE9BQVFXLElBQU0sQ0FDMUMsSUFBSWYsRUFBTyxHQUFHRyxPQUFPSSxFQUFRUSxJQUN6Qk4sR0FBVUksRUFBdUJiLEVBQUssV0FHckIsSUFBVlcsU0FDYyxJQUFaWCxFQUFLLEtBR2RBLEVBQUssR0FBSyxTQUFTRyxPQUFPSCxFQUFLLEdBQUdJLE9BQVMsRUFBSSxJQUFJRCxPQUFPSCxFQUFLLElBQU0sR0FBSSxNQUFNRyxPQUFPSCxFQUFLLEdBQUksTUFGL0ZBLEVBQUssR0FBS1csR0FNVkgsSUFDR1IsRUFBSyxJQUdSQSxFQUFLLEdBQUssVUFBVUcsT0FBT0gsRUFBSyxHQUFJLE1BQU1HLE9BQU9ILEVBQUssR0FBSSxLQUMxREEsRUFBSyxHQUFLUSxHQUhWUixFQUFLLEdBQUtRLEdBTVZFLElBQ0dWLEVBQUssSUFHUkEsRUFBSyxHQUFLLGNBQWNHLE9BQU9ILEVBQUssR0FBSSxPQUFPRyxPQUFPSCxFQUFLLEdBQUksS0FDL0RBLEVBQUssR0FBS1UsR0FIVlYsRUFBSyxHQUFLLEdBQUdHLE9BQU9PLElBTXhCZCxFQUFLTCxLQUFLUyxHQUNaLENBQ0YsRUFDT0osQ0FDVCxDLFVDbEZBSixFQUFPRSxRQUFVLFNBQVVNLEdBQ3pCLElBQUlDLEVBQVVELEVBQUssR0FDZmdCLEVBQWFoQixFQUFLLEdBQ3RCLElBQUtnQixFQUNILE9BQU9mLEVBRVQsR0FBb0IsbUJBQVRnQixLQUFxQixDQUM5QixJQUFJQyxFQUFTRCxLQUFLRSxTQUFTQyxtQkFBbUJDLEtBQUtDLFVBQVVOLE1BQ3pETyxFQUFPLCtEQUErRHBCLE9BQU9lLEdBQzdFTSxFQUFnQixPQUFPckIsT0FBT29CLEVBQU0sT0FDeEMsTUFBTyxDQUFDdEIsR0FBU0UsT0FBTyxDQUFDcUIsSUFBZ0JuQixLQUFLLEtBQ2hELENBQ0EsTUFBTyxDQUFDSixHQUFTSSxLQUFLLEtBQ3hCLEMsU0NiQSxJQUFJb0IsRUFBYyxHQUNsQixTQUFTQyxFQUFxQkMsR0FFNUIsSUFEQSxJQUFJQyxHQUFVLEVBQ0x0QixFQUFJLEVBQUdBLEVBQUltQixFQUFZckIsT0FBUUUsSUFDdEMsR0FBSW1CLEVBQVluQixHQUFHcUIsYUFBZUEsRUFBWSxDQUM1Q0MsRUFBU3RCLEVBQ1QsS0FDRixDQUVGLE9BQU9zQixDQUNULENBQ0EsU0FBU0MsRUFBYWpDLEVBQU1rQyxHQUcxQixJQUZBLElBQUlDLEVBQWEsQ0FBQyxFQUNkQyxFQUFjLEdBQ1QxQixFQUFJLEVBQUdBLEVBQUlWLEVBQUtRLE9BQVFFLElBQUssQ0FDcEMsSUFBSU4sRUFBT0osRUFBS1UsR0FDWmIsRUFBS3FDLEVBQVFHLEtBQU9qQyxFQUFLLEdBQUs4QixFQUFRRyxLQUFPakMsRUFBSyxHQUNsRGtDLEVBQVFILEVBQVd0QyxJQUFPLEVBQzFCa0MsRUFBYSxHQUFHeEIsT0FBT1YsRUFBSSxLQUFLVSxPQUFPK0IsR0FDM0NILEVBQVd0QyxHQUFNeUMsRUFBUSxFQUN6QixJQUFJQyxFQUFvQlQsRUFBcUJDLEdBQ3pDUyxFQUFNLENBQ1JDLElBQUtyQyxFQUFLLEdBQ1ZRLE1BQU9SLEVBQUssR0FDWnNDLFVBQVd0QyxFQUFLLEdBQ2hCVSxTQUFVVixFQUFLLEdBQ2ZXLE1BQU9YLEVBQUssSUFFZCxJQUEyQixJQUF2Qm1DLEVBQ0ZWLEVBQVlVLEdBQW1CSSxhQUMvQmQsRUFBWVUsR0FBbUJLLFFBQVFKLE9BQ2xDLENBQ0wsSUFBSUksRUFBVUMsRUFBZ0JMLEVBQUtOLEdBQ25DQSxFQUFRWSxRQUFVcEMsRUFDbEJtQixFQUFZa0IsT0FBT3JDLEVBQUcsRUFBRyxDQUN2QnFCLFdBQVlBLEVBQ1phLFFBQVNBLEVBQ1RELFdBQVksR0FFaEIsQ0FDQVAsRUFBWXpDLEtBQUtvQyxFQUNuQixDQUNBLE9BQU9LLENBQ1QsQ0FDQSxTQUFTUyxFQUFnQkwsRUFBS04sR0FDNUIsSUFBSWMsRUFBTWQsRUFBUWUsT0FBT2YsR0FZekIsT0FYQWMsRUFBSUUsT0FBT1YsR0FDRyxTQUFpQlcsR0FDN0IsR0FBSUEsRUFBUSxDQUNWLEdBQUlBLEVBQU9WLE1BQVFELEVBQUlDLEtBQU9VLEVBQU92QyxRQUFVNEIsRUFBSTVCLE9BQVN1QyxFQUFPVCxZQUFjRixFQUFJRSxXQUFhUyxFQUFPckMsV0FBYTBCLEVBQUkxQixVQUFZcUMsRUFBT3BDLFFBQVV5QixFQUFJekIsTUFDekosT0FFRmlDLEVBQUlFLE9BQU9WLEVBQU1XLEVBQ25CLE1BQ0VILEVBQUlJLFFBRVIsQ0FFRixDQUNBeEQsRUFBT0UsUUFBVSxTQUFVRSxFQUFNa0MsR0FHL0IsSUFBSW1CLEVBQWtCcEIsRUFEdEJqQyxFQUFPQSxHQUFRLEdBRGZrQyxFQUFVQSxHQUFXLENBQUMsR0FHdEIsT0FBTyxTQUFnQm9CLEdBQ3JCQSxFQUFVQSxHQUFXLEdBQ3JCLElBQUssSUFBSTVDLEVBQUksRUFBR0EsRUFBSTJDLEVBQWdCN0MsT0FBUUUsSUFBSyxDQUMvQyxJQUNJNkMsRUFBUXpCLEVBREt1QixFQUFnQjNDLElBRWpDbUIsRUFBWTBCLEdBQU9aLFlBQ3JCLENBRUEsSUFEQSxJQUFJYSxFQUFxQnZCLEVBQWFxQixFQUFTcEIsR0FDdEN1QixFQUFLLEVBQUdBLEVBQUtKLEVBQWdCN0MsT0FBUWlELElBQU0sQ0FDbEQsSUFDSUMsRUFBUzVCLEVBREt1QixFQUFnQkksSUFFSyxJQUFuQzVCLEVBQVk2QixHQUFRZixhQUN0QmQsRUFBWTZCLEdBQVFkLFVBQ3BCZixFQUFZa0IsT0FBT1csRUFBUSxHQUUvQixDQUNBTCxFQUFrQkcsQ0FDcEIsQ0FDRixDLFVDakZBLElBQUlHLEVBQU8sQ0FBQyxFQStCWi9ELEVBQU9FLFFBUFAsU0FBMEI4RCxFQUFRQyxHQUNoQyxJQUFJQyxFQXRCTixTQUFtQkEsR0FDakIsUUFBNEIsSUFBakJILEVBQUtHLEdBQXlCLENBQ3ZDLElBQUlDLEVBQWNDLFNBQVNDLGNBQWNILEdBR3pDLEdBQUlJLE9BQU9DLG1CQUFxQkosYUFBdUJHLE9BQU9DLGtCQUM1RCxJQUdFSixFQUFjQSxFQUFZSyxnQkFBZ0JDLElBQzVDLENBQUUsTUFBT0MsR0FFUFAsRUFBYyxJQUNoQixDQUVGSixFQUFLRyxHQUFVQyxDQUNqQixDQUNBLE9BQU9KLEVBQUtHLEVBQ2QsQ0FJZVMsQ0FBVVgsR0FDdkIsSUFBS0UsRUFDSCxNQUFNLElBQUlVLE1BQU0sMkdBRWxCVixFQUFPVyxZQUFZWixFQUNyQixDLFVDdkJBakUsRUFBT0UsUUFOUCxTQUE0Qm9DLEdBQzFCLElBQUl3QyxFQUFVVixTQUFTVyxjQUFjLFNBR3JDLE9BRkF6QyxFQUFRMEMsY0FBY0YsRUFBU3hDLEVBQVEyQyxZQUN2QzNDLEVBQVEwQixPQUFPYyxFQUFTeEMsRUFBUUEsU0FDekJ3QyxDQUNULEMsZUNDQTlFLEVBQU9FLFFBTlAsU0FBd0NnRixHQUN0QyxJQUFJQyxFQUFtRCxLQUNuREEsR0FDRkQsRUFBYUUsYUFBYSxRQUFTRCxFQUV2QyxDLFVDb0RBbkYsRUFBT0UsUUFqQlAsU0FBZ0JvQyxHQUNkLEdBQXdCLG9CQUFiOEIsU0FDVCxNQUFPLENBQ0xkLE9BQVEsV0FBbUIsRUFDM0JFLE9BQVEsV0FBbUIsR0FHL0IsSUFBSTBCLEVBQWU1QyxFQUFRK0MsbUJBQW1CL0MsR0FDOUMsTUFBTyxDQUNMZ0IsT0FBUSxTQUFnQlYsSUFqRDVCLFNBQWVzQyxFQUFjNUMsRUFBU00sR0FDcEMsSUFBSUMsRUFBTSxHQUNORCxFQUFJMUIsV0FDTjJCLEdBQU8sY0FBY2xDLE9BQU9pQyxFQUFJMUIsU0FBVSxRQUV4QzBCLEVBQUk1QixRQUNONkIsR0FBTyxVQUFVbEMsT0FBT2lDLEVBQUk1QixNQUFPLE9BRXJDLElBQUlOLE9BQWlDLElBQWRrQyxFQUFJekIsTUFDdkJULElBQ0ZtQyxHQUFPLFNBQVNsQyxPQUFPaUMsRUFBSXpCLE1BQU1QLE9BQVMsRUFBSSxJQUFJRCxPQUFPaUMsRUFBSXpCLE9BQVMsR0FBSSxPQUU1RTBCLEdBQU9ELEVBQUlDLElBQ1BuQyxJQUNGbUMsR0FBTyxLQUVMRCxFQUFJNUIsUUFDTjZCLEdBQU8sS0FFTEQsRUFBSTFCLFdBQ04yQixHQUFPLEtBRVQsSUFBSUMsRUFBWUYsRUFBSUUsVUFDaEJBLEdBQTZCLG9CQUFUckIsT0FDdEJvQixHQUFPLHVEQUF1RGxDLE9BQU9jLEtBQUtFLFNBQVNDLG1CQUFtQkMsS0FBS0MsVUFBVWdCLE1BQWUsUUFLdElSLEVBQVFnRCxrQkFBa0J6QyxFQUFLcUMsRUFBYzVDLEVBQVFBLFFBQ3ZELENBb0JNaUQsQ0FBTUwsRUFBYzVDLEVBQVNNLEVBQy9CLEVBQ0FZLE9BQVEsWUFyQlosU0FBNEIwQixHQUUxQixHQUFnQyxPQUE1QkEsRUFBYU0sV0FDZixPQUFPLEVBRVROLEVBQWFNLFdBQVdDLFlBQVlQLEVBQ3RDLENBZ0JNUSxDQUFtQlIsRUFDckIsRUFFSixDLFVDOUNBbEYsRUFBT0UsUUFWUCxTQUEyQjJDLEVBQUtxQyxHQUM5QixHQUFJQSxFQUFhUyxXQUNmVCxFQUFhUyxXQUFXQyxRQUFVL0MsTUFDN0IsQ0FDTCxLQUFPcUMsRUFBYVcsWUFDbEJYLEVBQWFPLFlBQVlQLEVBQWFXLFlBRXhDWCxFQUFhTCxZQUFZVCxTQUFTMEIsZUFBZWpELEdBQ25ELENBQ0YsQyxHQ1hJa0QsRUFBMkIsQ0FBQyxFQUdoQyxTQUFTQyxFQUFvQkMsR0FFNUIsSUFBSUMsRUFBZUgsRUFBeUJFLEdBQzVDLFFBQXFCN0UsSUFBakI4RSxFQUNILE9BQU9BLEVBQWFoRyxRQUdyQixJQUFJRixFQUFTK0YsRUFBeUJFLEdBQVksQ0FDakRoRyxHQUFJZ0csRUFFSi9GLFFBQVMsQ0FBQyxHQU9YLE9BSEFpRyxFQUFvQkYsR0FBVWpHLEVBQVFBLEVBQU9FLFFBQVM4RixHQUcvQ2hHLEVBQU9FLE9BQ2YsQ0NyQkE4RixFQUFvQkksRUFBS3BHLElBQ3hCLElBQUlxRyxFQUFTckcsR0FBVUEsRUFBT3NHLFdBQzdCLElBQU90RyxFQUFpQixRQUN4QixJQUFNLEVBRVAsT0FEQWdHLEVBQW9CTyxFQUFFRixFQUFRLENBQUVHLEVBQUdILElBQzVCQSxDQUFNLEVDTGRMLEVBQW9CTyxFQUFJLENBQUNyRyxFQUFTdUcsS0FDakMsSUFBSSxJQUFJQyxLQUFPRCxFQUNYVCxFQUFvQlcsRUFBRUYsRUFBWUMsS0FBU1YsRUFBb0JXLEVBQUV6RyxFQUFTd0csSUFDNUVFLE9BQU9DLGVBQWUzRyxFQUFTd0csRUFBSyxDQUFFSSxZQUFZLEVBQU1DLElBQUtOLEVBQVdDLElBRTFFLEVDTkRWLEVBQW9CVyxFQUFJLENBQUMvRCxFQUFLb0UsSUFBVUosT0FBT0ssVUFBVUMsZUFBZUMsS0FBS3ZFLEVBQUtvRSxHQ0FsRmhCLEVBQW9Cb0IsUUFBS2hHLEUsSUNBYmlHLEVDQUFDLEVDQUFDLEVDQUFDLEVDQUFDLEVDQUFDLEVDQUFDLEVDQUFDLEVDS0FDLEVDTEFDLEVDQUFDLEVDQUFDLEUsbUhDV1IxRixFQUFVLENBQUMsRUFFZkEsRUFBUWdELGtCQUFvQixJQUM1QmhELEVBQVEwQyxjQUFnQixJQUN4QjFDLEVBQVEwQixPQUFTLFNBQWMsS0FBTSxRQUNyQzFCLEVBQVFlLE9BQVMsSUFDakJmLEVBQVErQyxtQkFBcUIsSUFFaEIsSUFBSSxJQUFTL0MsR0FLSixLQUFXLElBQVEyRixRQUFTLElBQVFBLE9aeEIxRCxTQUFZWixHQUNSLGdCQUNBLGlCQUNBLGlCQUNBLGlCQUNBLGlCQUNBLGlCQUNBLGlCQUNBLHdCQUNBLDhCQUNBLDhCQUNBLGNBQ0EsZ0JBQ0EsZUFDSCxDQWRELENBQVlBLElBQUFBLEVBQVksS2FBakIsTUFBTWEsRUFDVCx1QkFBT0MsR0FDSCxNQUFNQyxFQUFXQyxLQUFLQyxNQUFNakksU0FBUyxJQUMvQmtJLEVBQWMsSUFBSUMsWUFBWSxHQUdwQyxPQUZBbEUsT0FBT21FLE9BQU9DLGdCQUFnQkgsR0FFdkJILEVBRFlHLEVBQVksR0FBR2xJLFNBQVMsR0FFL0MsQ0FFQSxlQUFPc0ksQ0FBU0MsR0FFWixNQUFPLElBRFVBLEVBQUlDLE1BQU0sUUFBU3RJLElBQUl1SSxRQUNsQnZJLEtBQUl3SSxJQUN0QixNQUFNQyxFQUFNRCxFQUFFMUksU0FBUyxJQUN2QixPQUFzQixJQUFmMkksRUFBSXBJLE9BQWUsSUFBTW9JLEVBQU1BLENBQUcsSUFDMUNuSSxLQUFLLEdBQ1osR1pmSixTQUFZeUcsR0FDUiw0QkFDQSw2QkFDQSxnQ0FDQSxzQ0FDQSx5Q0FDQSxnREFDQSxtQkFDQSwyQ0FDQSx5Q0FDQSxxQ0FDQSxxQ0FDQSwyQ0FDQSw4QkFDQSx3Q0FDQSxnQkFDQSxrQ0FDQSw4QkFDQSw2QkFDSCxDQW5CRCxDQUFZQSxJQUFBQSxFQUFLLEthU1YsTUFBTTJCLEVBRURDLFNBRUFDLGlCQUVSQSxxQkFBdUIsQ0FDbkJDLGdCQUFpQixVQUNqQkMsVUFBVyxJQUNYQyxjQUFlLGVBQ2ZDLFVBQVcsV0FDWEMsS0FBTSxPQUNOQyxNQUFPLGFBQ1BDLGNBQWUsS0FDZkMsY0FBZSxLQUNmQyxXQUFZLGFBQ1pDLFNBQVUsS0FDVkMsU0FBVSxLQUNWQyxTQUFVLEtBQ1ZDLFNBQVUsS0FDVkMsU0FBVSxLQUNWQyxTQUFVLEtBQ1ZDLG1CQUFvQixxQkFDcEJDLE1BQU8sUUFDUEMsTUFBTyxRQUNQQyxRQUFTLFdBR2IsY0FFSSxHQUFJckIsRUFBc0JzQixVQUN0QixNQUFNLElBQUkzRixNQUFNLDREQUdwQnRFLEtBQUs0SSxTQUFXLENBQUMsRUFFakI1SSxLQUFLa0ssU0FBU3ZCLEVBQXNCd0IsY0FBY3JCLGdCQUFpQkgsRUFBc0J5Qix5QkFDekZwSyxLQUFLa0ssU0FBU3ZCLEVBQXNCd0IsY0FBY3BCLFVBQVdKLEVBQXNCMEIsb0JBQ25GckssS0FBS2tLLFNBQVN2QixFQUFzQndCLGNBQWNuQixjQUFlTCxFQUFzQjJCLHVCQUN2RnRLLEtBQUtrSyxTQUFTdkIsRUFBc0J3QixjQUFjbEIsVUFBV04sRUFBc0I0QixtQkFDbkZ2SyxLQUFLa0ssU0FBU3ZCLEVBQXNCd0IsY0FBY2pCLEtBQU1QLEVBQXNCNkIsZUFDOUV4SyxLQUFLa0ssU0FBU3ZCLEVBQXNCd0IsY0FBY2hCLE1BQU9SLEVBQXNCOEIsZ0JBQy9FekssS0FBS2tLLFNBQVN2QixFQUFzQndCLGNBQWNiLFdBQVlYLEVBQXNCK0Isb0JBQ3BGMUssS0FBS2tLLFNBQVN2QixFQUFzQndCLGNBQWNmLGNBQWVULEVBQXNCZ0MsdUJBQ3ZGM0ssS0FBS2tLLFNBQVN2QixFQUFzQndCLGNBQWNkLGNBQWVWLEVBQXNCaUMsdUJBQ3ZGNUssS0FBS2tLLFNBQVN2QixFQUFzQndCLGNBQWNaLFNBQVVaLEVBQXNCa0MsZUFBZSxJQUNqRzdLLEtBQUtrSyxTQUFTdkIsRUFBc0J3QixjQUFjWCxTQUFVYixFQUFzQmtDLGVBQWUsSUFDakc3SyxLQUFLa0ssU0FBU3ZCLEVBQXNCd0IsY0FBY1YsU0FBVWQsRUFBc0JrQyxlQUFlLElBQ2pHN0ssS0FBS2tLLFNBQVN2QixFQUFzQndCLGNBQWNULFNBQVVmLEVBQXNCa0MsZUFBZSxJQUNqRzdLLEtBQUtrSyxTQUFTdkIsRUFBc0J3QixjQUFjUixTQUFVaEIsRUFBc0JrQyxlQUFlLElBQ2pHN0ssS0FBS2tLLFNBQVN2QixFQUFzQndCLGNBQWNQLFNBQVVqQixFQUFzQmtDLGVBQWUsSUFDakc3SyxLQUFLa0ssU0FBU3ZCLEVBQXNCd0IsY0FBY04sbUJBQW9CbEIsRUFBc0JtQywyQkFDNUY5SyxLQUFLa0ssU0FBU3ZCLEVBQXNCd0IsY0FBY0wsTUFBT25CLEVBQXNCb0MsZ0JBQy9FL0ssS0FBS2tLLFNBQVN2QixFQUFzQndCLGNBQWNKLE1BQU9wQixFQUFzQnFDLGlCQUMvRWhMLEtBQUtrSyxTQUFTdkIsRUFBc0J3QixjQUFjSCxRQUFTckIsRUFBc0JzQyxrQkFJakZ0QyxFQUFzQnNCLFVBQVlqSyxJQUN0QyxDQUVBLGtCQUFPa0wsR0FNSCxPQUpLbEwsS0FBS2lLLFlBQ05qSyxLQUFLaUssVUFBWSxJQUFJdEIsR0FHbEIzSSxLQUFLaUssU0FDaEIsQ0FFUSxRQUFBQyxDQUFTaUIsRUFBY0MsR0FDM0JwTCxLQUFLNEksU0FBU3VDLEdBQVFDLENBQzFCLENBRUEsTUFBQUMsQ0FBT0YsRUFBY2hMLEdBQ2pCLE1BQU1pTCxFQUFVcEwsS0FBSzRJLFNBQVN1QyxHQUU5QixJQUFLQyxFQUNELE1BQU0sSUFBSUUsVUFBVSxtQ0FBbUNILEtBRzNELE9BQU9DLEVBQVFqTCxHQUFXLEdBQzlCLENBRVEsNEJBQU9pSyxHQUNYLE9BQU9qSyxHQUNJd0ksRUFBc0I0QyxlQUFlcEwsRUFFcEQsQ0FFUSx1QkFBT2tLLEdBQ1gsT0FBT2xLLEdBQ0l3SSxFQUFzQjZDLFVBQVVyTCxFQUUvQyxDQUVRLHFCQUFPMEssQ0FBZVksR0FDMUIsT0FBT3RMLEdBQ0l3SSxFQUFzQitDLFFBQVFELEVBQU90TCxFQUVwRCxDQUVRLDBCQUFPbUssR0FDWCxPQUFPbkssR0FDSXdJLEVBQXNCZ0QsYUFBYXhMLEdBQVcsR0FFN0QsQ0FFUSxzQkFBT29LLEdBRVgsT0FBT3BLLEdBQ0l3SSxFQUFzQmlELFdBQVd6TCxFQUVoRCxDQUVRLDhCQUFPMkssR0FFWCxNQUFPLElBQ0luQyxFQUFzQmtELGtCQUVyQyxDQUVRLGtCQUFPckIsR0FDWCxPQUFPckssSUFDSCxNQUFNMkwsRUFBTWhJLFNBQVNXLGNBQWMsT0FDN0JzSCxFQUFPakksU0FBU1csY0FBYyxRQVFwQyxPQVBBc0gsRUFBS0MsWUFBYzdMLEdBQVcsR0FDOUIyTCxFQUFJdkgsWUFBWXdILEdBRWhCQSxFQUFLRSxnQkFBa0IsT0FDdkJILEVBQUlJLFVBQVVDLElBQUksNEJBQ2xCSixFQUFLRyxVQUFVQyxJQUFJLGlCQUVaTCxDQUFHLENBRWxCLENBRVEsbUJBQU9yQixHQUNYLE9BQU90SyxJQUNILE1BQU1pTSxFQUFhdEksU0FBU1csY0FBYyxjQUkxQyxPQUhBMkgsRUFBV0osWUFBYzdMLEdBQVcsR0FDcENpTSxFQUFXSCxnQkFBa0IsT0FDN0JHLEVBQVdGLFVBQVVDLElBQUksNEJBQ2xCQyxDQUFVLENBRXpCLENBRVEsdUJBQU8xQixHQUNYLE9BQU92SyxJQUNILE1BQU1rTSxFQUFLdkksU0FBU1csY0FBYyxNQUVsQzRILEVBQUdILFVBQVVDLElBQUksNEJBQ2pCRSxFQUFHSCxVQUFVQyxJQUFJLGFBQ2pCRSxFQUFHSCxVQUFVQyxJQUFJLFFBQ2pCRSxFQUFHSCxVQUFVQyxJQUFJLGlCQUNqQkUsRUFBR3ZILGFBQWEsb0JBQXFCaUMsRUFBYXVGLFdBRWxELE1BQU1DLEVBQWM1RCxFQUFzQmdELGFBQWF4TCxHQUFXLElBSWxFLE9BRkFrTSxFQUFHOUgsWUFBWWdJLEdBRVJGLENBQUUsQ0FFakIsQ0FFUSwwQkFBTzFCLEdBQ1gsT0FBT3hLLElBQ0gsTUFBTXFFLEVBQVVWLFNBQVNXLGNBQWMsTUFDdkNELEVBQVFNLGFBQWEsb0JBQXFCaUMsRUFBYXlGLGNBQ3ZEaEksRUFBUTBILFVBQVVDLElBQUksNEJBQ3RCM0gsRUFBUTBILFVBQVVDLElBQUksYUFDdEIzSCxFQUFRMEgsVUFBVUMsSUFBSSxRQUV0QixNQUFNSSxFQUFjNUQsRUFBc0JpRCxXQUFXekwsR0FBVyxJQUloRSxPQUZBcUUsRUFBUUQsWUFBWWdJLEdBRWIvSCxDQUFPLENBRXRCLENBRVEsMEJBQU9vRyxHQUNYLE9BQU96SyxJQUNILE1BQU1xRSxFQUFVVixTQUFTVyxjQUFjLE1BQ3ZDRCxFQUFRTSxhQUFhLG9CQUFxQmlDLEVBQWEwRixjQUN2RGpJLEVBQVEwSCxVQUFVQyxJQUFJLDRCQUN0QjNILEVBQVEwSCxVQUFVQyxJQUFJLGFBQ3RCM0gsRUFBUTBILFVBQVVDLElBQUksUUFFdEIsTUFBTUksRUFBYzVELEVBQXNCaUQsV0FBV3pMLEdBQVcsSUFJaEUsT0FGQXFFLEVBQVFELFlBQVlnSSxHQUViL0gsQ0FBTyxDQUV0QixDQUdRLG1CQUFPdUcsR0FDWCxPQUFPNUssSUFFSCxNQUFNdU0sRUFBYTVJLFNBQVNXLGNBQWMsT0FDMUNpSSxFQUFXUixVQUFVQyxJQUFJLGVBRXpCLE1BQU1RLEVBQWtCN0ksU0FBU1csY0FBYyxPQUMvQ2tJLEVBQWdCVCxVQUFVQyxJQUFJLG9CQUU5QixNQUFNUyxFQUFlOUksU0FBU1csY0FBYyxPQUM1Q21JLEVBQWFWLFVBQVVDLElBQUksaUJBRTNCLE1BQU1VLEVBQVEvSSxTQUFTVyxjQUFjLFNBQ3JDb0ksRUFBTVgsVUFBVUMsSUFBSSwyQkFBNEIsWUFBYSxTQUM3RFUsRUFBTS9ILGFBQWEsb0JBQXFCaUMsRUFBYStGLE9BRXJESixFQUFXbkksWUFBWW9JLEdBQ3ZCQSxFQUFnQnBJLFlBQVlxSSxHQUM1QkEsRUFBYXJJLFlBQVlzSSxHQUV6QixNQUFNRSxFQUFRakosU0FBU1csY0FBYyxTQUNyQ29JLEVBQU10SSxZQUFZd0ksR0FFbEIsTUFBTUMsRUFBVTdNLEVBQVVBLEVBQVE4TSxNQUFNLEtBQU8sR0FDekNDLEVBQU1wSixTQUFTVyxjQUFjLE1BQ25DdUksRUFBUUcsU0FBUUMsSUFDWixNQUFNQyxFQUFPdkosU0FBU1csY0FBYyxNQUNwQzRJLEVBQUtuQixVQUFVQyxJQUFJLGFBQ25Ca0IsRUFBS3ZJLGFBQWEsbUJBQW9CLFFBQ3RDdUksRUFBS3JCLFlBQWNvQixFQUNuQkMsRUFBS3BCLGdCQUFrQixPQUN2QmlCLEVBQUkzSSxZQUFZOEksRUFBSyxJQUd6Qk4sRUFBTXhJLFlBQVkySSxHQUVsQixNQUFNSSxFQUFTeEosU0FBU1csY0FBYyxPQUN0QzZJLEVBQU9wQixVQUFVQyxJQUFJLGlCQUNyQm1CLEVBQU9DLFVBQVksZ0dBRW5CLE1BQU1DLEVBQVkxSixTQUFTVyxjQUFjLE9BT3pDLE9BTkErSSxFQUFVdEIsVUFBVUMsSUFBSSxvQkFDeEJxQixFQUFVRCxVQUFZLGdHQUV0QlosRUFBZ0JwSSxZQUFZK0ksR0FDNUJYLEVBQWdCcEksWUFBWWlKLEdBRXJCZCxDQUFVLENBRXpCLENBR1Esb0JBQU8xQixHQUNYLE9BQU83SyxJQUNILE1BQU1zTixFQUFpQjNKLFNBQVNXLGNBQWMsT0FDOUNnSixFQUFldkIsVUFBVUMsSUFBSSwyQkFBNEIsWUFBYSxnQkFDdEVzQixFQUFlM0ksYUFBYSxvQkFBcUJpQyxFQUFhMkcsT0FFOURELEVBQWVFLGVBRWYsTUFBTUMsRUFBVzlKLFNBQVNXLGNBQWMsT0FDeENtSixFQUFTMUIsVUFBVUMsSUFBSSxjQUFlLHNCQUN0Q3lCLEVBQVNqSyxNQUFNa0ssUUFBVSxPQUN6QkQsRUFBU2pLLE1BQU1tSyxnQkFBa0IsVUFDakNMLEVBQWVsSixZQUFZcUosR0FDM0JBLEVBQVNqSyxNQUFNb0ssTUFBUSx3QkFFdkJILEVBQVNqSyxNQUFNcUssUUFBVSxPQUN6QkosRUFBU2pLLE1BQU1zSyxJQUFNLE1BQ3JCTCxFQUFTakssTUFBTXVLLFdBQWEsU0FFNUIsTUFBTUMsRUFBT25PLEtBQUttTyxLQUFLbkgsRUFBTTBHLE9BRTdCUyxFQUFLeEssTUFBTXFLLFFBQVUsT0FDckJHLEVBQUt4SyxNQUFNdUssV0FBYSxTQUV4Qk4sRUFBU3JKLFlBQVk0SixHQUVyQixNQUFNQyxFQUFPdEssU0FBU1csY0FBYyxRQUNwQzJKLEVBQUtsQyxVQUFVQyxJQUFJLGdCQUNuQmlDLEVBQUtDLFVBQVksZUFFakJULEVBQVNySixZQUFZNkosR0FJckIsTUFBTUUsRUFBZ0J0TyxLQUFLdU8sb0JBYzNCLE9BWkFELEVBQWNwQyxVQUFVQyxJQUFJLGlCQUFrQixnQkFDOUNtQyxFQUFjM0ssTUFBTTZLLFNBQVcsV0FDL0JGLEVBQWMzSyxNQUFNOEssSUFBTSxPQUMxQkgsRUFBYzNLLE1BQU0rSyxNQUFRLE9BQzVCSixFQUFjM0ssTUFBTWdMLE9BQVMsT0FDN0JMLEVBQWMzSyxNQUFNaUwsV0FBYSxjQUNqQ04sRUFBYzNLLE1BQU1rTCxPQUFTLFVBQzdCUCxFQUFjeEosYUFBYSxhQUFjLGdCQUN6Q3dKLEVBQWMzSyxNQUFNcUssUUFBVSxPQUU5QlAsRUFBZWxKLFlBQVkrSixHQUVwQmIsQ0FBYyxDQUU3QixDQUdRLG1CQUFPcUIsR0FDWCxPQUFPM08sSUFDSCxNQUFNNE8sRUFBTWpMLFNBQVNXLGNBQWMsT0FtQm5DLE9BaEJBc0ssRUFBSUMsSUFBTTdPLEdBQVcseUJBQ3JCNE8sRUFBSUUsSUFBTSxzQkFFVkYsRUFBSTdDLFVBQVVDLElBQUksNEJBQ2xCNEMsRUFBSTdDLFVBQVVDLElBQUksYUFDbEI0QyxFQUFJN0MsVUFBVUMsSUFBSSxhQUdsQjRDLEVBQUlwTCxNQUFNdUwsTUFBUSxPQUNsQkgsRUFBSXBMLE1BQU13TCxPQUFTLE9BR25CSixFQUFJSyxpQkFBaUIsU0FBUyxLQUMxQkMsUUFBUUMsSUFBSSxrQkFBa0IsSUFHM0JQLENBQUcsQ0FFbEIsQ0FFUSxxQkFBTzlELEdBQ1gsT0FBTzlLLElBQ0gsTUFBTW9QLEVBQVV6TCxTQUFTVyxjQUFjLE9BQ3ZDOEssRUFBUXJELFVBQVVDLElBQUksVUFBVywyQkFBNEIsYUFFN0QsTUFBTXlCLEVBQVc5SixTQUFTVyxjQUFjLE9BQ3hDbUosRUFBUzlJLGFBQWEsbUJBQW9CLHFCQUMxQzhJLEVBQVMzQixnQkFBa0IsT0FDM0IyQixFQUFTMUIsVUFBVUMsSUFBSSxlQUFnQixXQUFZLGFBQ25EeUIsRUFBU2pLLE1BQU1rSyxRQUFVLE9BQ3pCRCxFQUFTakssTUFBTW1LLGdCQUFrQixVQUNqQ3lCLEVBQVFoTCxZQUFZcUosR0FJcEIsTUFBTVUsRUFBZ0J0TyxLQUFLdU8sb0JBYzNCLE9BWkFELEVBQWNwQyxVQUFVQyxJQUFJLGlCQUFrQixnQkFDOUNtQyxFQUFjM0ssTUFBTTZLLFNBQVcsV0FDL0JGLEVBQWMzSyxNQUFNOEssSUFBTSxPQUMxQkgsRUFBYzNLLE1BQU0rSyxNQUFRLE9BQzVCSixFQUFjM0ssTUFBTWdMLE9BQVMsT0FDN0JMLEVBQWMzSyxNQUFNaUwsV0FBYSxjQUNqQ04sRUFBYzNLLE1BQU1rTCxPQUFTLFVBQzdCUCxFQUFjeEosYUFBYSxhQUFjLGdCQUN6Q3dKLEVBQWMzSyxNQUFNcUssUUFBVSxPQUU5QnVCLEVBQVFoTCxZQUFZK0osR0FFYmlCLENBQU8sQ0FFdEIsQ0FXQSxnQkFBTy9ELENBQVVyTCxFQUF5QixNQUN0QyxNQUFNcVAsRUFBSTFMLFNBQVNXLGNBQWMsS0FXakMsT0FUQStLLEVBQUVuQixVQUFZbE8sR0FBVyxHQUN6QnFQLEVBQUV2RCxnQkFBa0IsT0FDcEJ1RCxFQUFFMUssYUFBYSxvQkFBcUJpQyxFQUFhMEksV0FDakRELEVBQUV0RCxVQUFVQyxJQUFJLDRCQUNoQnFELEVBQUV0RCxVQUFVQyxJQUFJLGFBQ2hCcUQsRUFBRXRELFVBQVVDLElBQUksYUFDaEJxRCxFQUFFdEQsVUFBVUMsSUFBSSxlQUNoQnFELEVBQUUxSyxhQUFhLG1CQUFvQiwwREFFNUIwSyxDQUNYLENBRVEsY0FBTzlELENBQVFELEVBQWV0TCxFQUF5QixNQUMzRCxNQUFNdVAsRUFBSTVMLFNBQVNXLGNBQWMsSUFBSWdILEtBWXJDLE9BVkFpRSxFQUFFckIsVUFBWWxPLEdBQVcsR0FDekJ1UCxFQUFFekQsZ0JBQWtCLE9BQ3BCeUQsRUFBRTVLLGFBQWEsb0JBQXFCLElBQUkyRyxLQUN4Q2lFLEVBQUV4RCxVQUFVQyxJQUFJLDRCQUNoQnVELEVBQUV4RCxVQUFVQyxJQUFJLGFBQ2hCdUQsRUFBRXhELFVBQVVDLElBQUksYUFDaEJ1RCxFQUFFeEQsVUFBVUMsSUFBSSxTQUNoQnVELEVBQUV4RCxVQUFVQyxJQUFJLGVBQ2hCdUQsRUFBRTVLLGFBQWEsbUJBQW9CLFdBQVcyRyxLQUV2Q2lFLENBQ1gsQ0FFQSxtQkFBTy9ELENBQWF4TCxHQUVoQixNQUFNUixFQUFLaUksRUFBTUMsbUJBRWpCLElBQUlyRCxFQUFVVixTQUFTVyxjQUFjLE1BQ3JDRCxFQUFRMEgsVUFBVUMsSUFBSSxhQUN0QjNILEVBQVEwSCxVQUFVQyxJQUFJLGFBQ3RCM0gsRUFBUTBILFVBQVVDLElBQUksdUJBSXRCLElBQUl3RCxFQUFXN0wsU0FBU1csY0FBYyxTQUN0Q2tMLEVBQVNoUSxHQUFLQSxFQUNkZ1EsRUFBUzdLLGFBQWEsT0FBUSxZQUc5QixJQUFJc0osRUFBT3RLLFNBQVNXLGNBQWMsT0FjbEMsT0FiQTJKLEVBQUtwQyxZQUFjN0wsRUFDbkJpTyxFQUFLdEosYUFBYSxtQkFBb0IsU0FDdENzSixFQUFLbkMsZ0JBQWtCLE9BQ3ZCbUMsRUFBS3RKLGFBQWEsTUFBT25GLEdBQ3pCeU8sRUFBS3RKLGFBQWEsa0JBQW1CLFFBRXJDc0osRUFBS2xDLFVBQVVDLElBQUksYUFDbkJpQyxFQUFLbEMsVUFBVUMsSUFBSSxZQUNuQmlDLEVBQUtsQyxVQUFVQyxJQUFJLFNBRW5CM0gsRUFBUUQsWUFBWW9MLEdBQ3BCbkwsRUFBUUQsWUFBWTZKLEdBRWI1SixDQUNYLENBc0JRLGlCQUFPb0gsQ0FBV3pMLEVBQXlCLE1BRS9DLElBQUlvTSxFQUFjekksU0FBU1csY0FBYyxNQUV6QzhILEVBQVlMLFVBQVVDLElBQUksYUFDMUJJLEVBQVlMLFVBQVVDLElBQUksYUFFMUIsTUFBTXlELEVBQU05TCxTQUFTVyxjQUFjLE9BZ0JuQyxPQWRBbUwsRUFBSTFELFVBQVVDLElBQUksYUFDbEJ5RCxFQUFJMUQsVUFBVUMsSUFBSSxZQUNsQnlELEVBQUkxRCxVQUFVQyxJQUFJLFNBQ2xCeUQsRUFBSTNELGdCQUFrQixPQUN0QjJELEVBQUkxRCxVQUFVQyxJQUFJLGVBQ2xCeUQsRUFBSTlLLGFBQWEsbUJBQW9CLFFBRXJDeUgsRUFBWWhJLFlBQVlxTCxHQUd4QkEsRUFBSXZCLFVBQVlsTyxHQUFXLEdBSXBCb00sQ0FDWCxDQUdBLHFCQUFPaEIsQ0FBZXBMLEVBQXlCLE1BRTNDLElBQUkwUCxFQUFTL0wsU0FBU1csY0FBYyxPQUNoQ3FMLEVBQWFuSCxFQUFzQjZDLFVBQVVyTCxHQWNqRCxPQVJBMFAsRUFBT3RMLFlBQVl1TCxHQUVuQkQsRUFBTzNELFVBQVVDLElBQUksU0FDckIwRCxFQUFPM0QsVUFBVUMsSUFBSSxhQUtkMEQsQ0FDWCxDQUVBLHVCQUFPaEUsR0FFSCxJQUFJa0UsRUFBU2pNLFNBQVNXLGNBQWMsVUFNcEMsT0FMQXNMLEVBQU94QyxVQUFZLDJHQUVuQndDLEVBQU83RCxVQUFVQyxJQUFJLGNBQWUsZUFBZ0IsZ0JBQ3BENEQsRUFBT0MsV0FBWSxFQUVaRCxDQUNYLENBRUEsd0JBQU94QixHQUVILElBQUl3QixFQUFTak0sU0FBU1csY0FBYyxVQUtwQyxPQUpBc0wsRUFBT3hDLFVBQVksMkdBRW5Cd0MsRUFBTzdELFVBQVVDLElBQUksY0FBZSxlQUFnQixnQkFFN0M0RCxDQUNYLENBR0EsV0FBTzVCLENBQUs4QixHQUVSLElBQUlGLEVBQVNqTSxTQUFTVyxjQUFjLE9BS3BDLE9BSkFzTCxFQUFPeEMsVUFBWSwyRUFBMkUwQyxrQkFJdkZGLENBQ1gsRUM1aEJHLE1BQWVHLEVBRVZDLFNBRVJDLE1BQ0FDLFlBQ0FDLE9BRUEsV0FBQUMsQ0FBWUgsR0FFUnBRLEtBQUtvUSxNQUFRQSxFQUVicFEsS0FBS3FRLFlBQWNyUSxLQUFLd1EsT0FDeEJ4USxLQUFLbVEsVUFBVyxDQUNwQixDQWdDQSxXQUFJbkMsR0FDQSxNQUFPLE9BQ1gsQ0FXQSxRQUFBeUMsQ0FBU0gsR0FDTHRRLEtBQUtzUSxPQUFTQSxFQUNkQSxFQUFPRCxZQUFZOUwsWUFBWXZFLEtBQUtxUSxZQUN4QyxDQUVBLGFBQUlLLEdBQ0EsSUFBSWxNLEVBQXVCeEUsS0FBS3FRLFlBRWhDLEdBQThCLFNBQTFCN0wsRUFBUWIsTUFBTXFLLFNBQW1ELFdBQTdCeEosRUFBUWIsTUFBTWdOLGFBQTRCN00sU0FBUzhNLFNBQVNwTSxHQUNoRyxPQUFPLEVBR1gsS0FBT0EsR0FBUyxDQUNaLE1BQU1iLEVBQVFLLE9BQU82TSxpQkFBaUJyTSxHQUV0QyxHQUFzQixTQUFsQmIsRUFBTXFLLFNBQTJDLFdBQXJCckssRUFBTWdOLFdBQ2xDLE9BQU8sRUFHWCxJQUFJbk0sRUFBUXNNLGNBR1IsTUFGQXRNLEVBQVVBLEVBQVFzTSxhQUkxQixDQUVBLE9BQU8sQ0FDWCxDQUVBLElBQUFDLEdBRUkvUSxLQUFLcVEsWUFBWTFNLE1BQU1xSyxRQUFVaE8sS0FBS2dPLE9BSzFDLENBRUEsSUFBQWdELEdBUUloUixLQUFLcVEsWUFBWTFNLE1BQU1xSyxRQUFVLE1BQ3JDLENBRUEsUUFBQWlELEdBQ0lqUixLQUFLbVEsVUFBVyxDQUNwQixDQUVBLFVBQUFlLEdBQ0lsUixLQUFLbVEsVUFBVyxDQUNwQixDQUVBLFdBQUlnQixHQUNBLE9BQU9uUixLQUFLbVEsVUFBWW5RLEtBQUswUSxTQUNqQyxDQUVBLFdBQUlTLENBQVFDLEdBQ1JwUixLQUFLbVEsU0FBV2lCLENBQ3BCLENBRUEsS0FBQUMsR0FDSXJSLEtBQUtxUSxZQUFZZ0IsT0FDckIsQ0FFQSxXQUFBQyxDQUFZRixHQUNScFIsS0FBS3FRLFlBQVkxTSxNQUFNb0ssTUFBUXFELENBQ25DLENBRUEsV0FBQUcsR0FDSXZSLEtBQUtxUSxZQUFZMU0sTUFBTW9LLE1BQVEsU0FDbkMsQ0FFQSx5QkFBQXlELEdBQ0l4UixLQUFLcVEsWUFBWTFNLE1BQU1nTixXQUFhLFNBQ3hDLENBRUEsd0JBQUFjLEdBQ0l6UixLQUFLcVEsWUFBWTFNLE1BQU1nTixXQUFhLFFBQ3hDLENBRUEsNkJBQUllLEdBRUEsTUFBTUMsRUFBa0IzUixLQUFLcVEsWUFBWTFNLE1BQU1xSyxRQUN6QzRELEVBQXFCNVIsS0FBS3FRLFlBQVkxTSxNQUFNZ04sV0FDNUNrQixFQUFtQjdSLEtBQUtxUSxZQUFZMU0sTUFBTTZLLFNBRXhCLFNBQXBCbUQsSUFDQTNSLEtBQUtxUSxZQUFZMU0sTUFBTXFLLFFBQVUsUUFDakNoTyxLQUFLcVEsWUFBWTFNLE1BQU1nTixXQUFhLFNBQ3BDM1EsS0FBS3FRLFlBQVkxTSxNQUFNNkssU0FBVyxZQUd0QyxNQUFNc0QsRUFBYzlSLEtBQUtxUSxZQUFZMEIsd0JBQy9CQyxFQUFjaE8sT0FBT2lPLFdBVTNCLE1BUndCLFNBQXBCTixJQUNBM1IsS0FBS3FRLFlBQVkxTSxNQUFNcUssUUFBVTJELEVBQ2pDM1IsS0FBS3FRLFlBQVkxTSxNQUFNZ04sV0FBYWlCLEVBQ3BDNVIsS0FBS3FRLFlBQVkxTSxNQUFNNkssU0FBV3FELEdBR2JDLEVBQVlwRCxNQUVkc0QsR0FJbkJGLEVBQVlJLEtBQU8sQ0FLM0IsRUNoTEcsTUFBTUMsRUFDRHRKLGdCQUF1QyxJQUFJc0osRUFDM0NDLGFBQTRDLENBQUMsRUFFckQsY0FBdUIsQ0FFaEIsbUJBQVdDLEdBQ2QsT0FBT0YsRUFBb0JHLFFBQy9CLENBRU8sUUFBQXBJLENBQVM5RCxFQUFhbUssR0FDekJ2USxLQUFLb1MsYUFBYWhNLEdBQU9tSyxDQUM3QixDQUVPLE9BQUFnQyxDQUFXbk0sR0FDZCxJQUFLcEcsS0FBS29TLGFBQWFoTSxHQUNuQixNQUFNLElBQUk5QixNQUFNLGNBQWM4QixnQkFFbEMsT0FBT3BHLEtBQUtvUyxhQUFhaE0sSUFDN0IsRUNMRyxNQUFNb00sVUFBZXRDLEVBRVB1QyxzQkFDVDVKLGdCQUFtQyxpQkFDbkNBLGdCQUNBNkosUUFFQUMsTUFDQXhTLFFBQ0F5UyxTQUNBQyxvQkFDQUMsVUFDQUMsb0JBQ0FDLGNBRVIsWUFDSVAsRUFDQVEsRUFDQVAsRUFDQUMsRUFDQXhTLEVBQ0F5UyxFQUNBTSxFQUNBSixFQUNBSyxFQUNBSCxHQWdCQSxHQVpBSSxNQUFNLENBQ0ZYLHNCQUF1QkEsRUFDdkJRLHVCQUF3QkEsRUFDeEJOLE1BQU9BLEVBQ1B4UyxRQUFTQSxFQUNUeVMsU0FBVUEsRUFDVk0sZ0JBQWlCQSxFQUNqQkosVUFBV0EsRUFDWEssYUFBY0EsRUFDZEgsY0FBZUEsSUFHZlIsRUFBT0YsU0FDUCxNQUFNLElBQUloTyxNQUFNLDZEQUdwQnRFLEtBQUt5UyxzQkFBd0JBLEVBQzdCelMsS0FBSzBTLFFBQVVBLEVBQ2YxUyxLQUFLNFMsU0FBV0EsRUFDaEI1UyxLQUFLNlMsb0JBQXNCSyxFQUMzQmxULEtBQUs4UyxVQUFZQSxFQUNqQjlTLEtBQUsrUyxvQkFBc0JJLEVBQzNCblQsS0FBS2dULGNBQWdCQSxFQUVyQmhULEtBQUtxVCxlQUVMYixFQUFPRixTQUFXdFMsS0FFbEJBLEtBQUswUyxRQUFRWSxXQUNqQixDQUVBLElBQUE5QyxHQUVJLE1BQU1ILEVBQWN2TSxTQUFTeVAsZUFBZWYsRUFBT2dCLFdBQWExUCxTQUFTVyxjQUFjLE9BMEJ2RixPQXhCQTRMLEVBQVluRSxVQUFVQyxJQUFJLG1CQUV0Qm5JLE9BQU95UCxhQUNQcEQsRUFBWTlMLFlBQVl2RSxLQUFLb1EsTUFBTXVDLE1BQU10QyxhQUk3Q0EsRUFBWTlMLFlBQVl2RSxLQUFLb1EsTUFBTWpRLFFBQVFrUSxhQUV2Q3JNLE9BQU95UCxhQUNQcEQsRUFBWTlMLFlBQVl2RSxLQUFLb1EsTUFBTXdDLFNBQVN2QyxhQUc1Q3JNLE9BQU95UCxhQUNQcEQsRUFBWTlMLFlBQVl2RSxLQUFLb1EsTUFBTThDLGdCQUFnQjdDLGFBR25Eck0sT0FBT3lQLGFBQ1BwRCxFQUFZOUwsWUFBWXZFLEtBQUtvUSxNQUFNMEMsVUFBVXpDLGFBR2pEQSxFQUFZOUwsWUFBWXZFLEtBQUtvUSxNQUFNK0MsYUFBYTlDLGFBQ2hEQSxFQUFZOUwsWUFBWXZFLEtBQUtvUSxNQUFNNEMsY0FBYzNDLGFBRTFDQSxDQUNYLENBRUEsa0JBQU9uRixDQUNIeUgsRUFDQXhTLEVBQ0F5UyxFQUNBQyxFQUNBQyxFQUNBWSxFQUNBVixHQUVBLE1BQU1QLEVBQXdCTixFQUFvQkUsU0FBU0UsUUFBZ0MsMEJBQ3JGVSxFQUF5QmQsRUFBb0JFLFNBQVNFLFFBQWlDLDJCQUN2RkcsRUFBVVAsRUFBb0JFLFNBQVNFLFFBQWtCLFlBTS9ELE9BSktDLEVBQU9GLFdBQ1JFLEVBQU9GLFNBQVcsSUFBSUUsRUFBT0MsRUFBdUJRLEVBQXdCUCxFQUFTQyxFQUFPeFMsRUFBU3lTLEVBQVVDLEVBQXFCQyxFQUFXWSxFQUFzQlYsSUFHbEtSLEVBQU9GLFFBQ2xCLENBRUEsWUFBQWUsR0FFSSxNQUFNTSxFQUFZN1AsU0FBU3lQLGVBQWVmLEVBQU9nQixVQTRCakQsR0ExQkFHLEdBQVd2RSxpQkFBaUIsYUFBY3dFLElBRXRDLE1BQU1oUSxFQUFTZ1EsRUFBTWhRLE9BRXJCLEdBQUlBLGFBQWtCaVEsS0FBTSxDQUN4QixJQUFJclAsRUFBVVosRUFNZCxHQUpJWSxFQUFRc1AsV0FBYUQsS0FBS0UsWUFDMUJ2UCxFQUFVQSxFQUFRc00sZUFHbEJ0TSxhQUFtQndQLFFBQVMsQ0FDNUIsTUFBTUMsRUFBZXpQLEVBQVEwUCxRQUFRLFVBRWpDRCxHQUNBalUsS0FBS21VLGtCQUFrQkYsRUFFL0IsTUFDSTVFLFFBQVErRSxNQUFNLHFGQUFzRjVQLEVBRTVHLE1BQ0k2SyxRQUFRK0UsTUFBTSw4QkFBK0J4USxFQUNqRCxJQUl3QixZQUF4QkUsU0FBU3VRLFdBQ1R2USxTQUFTc0wsaUJBQWlCLG9CQUFvQixLQUMxQyxNQUFNa0YsRUFBaUJ4USxTQUFTQyxjQUFjLHVDQUMxQ3VRLEdBQ0FBLEVBQWVqRCxPQUNuQixRQUVELENBQ0gsTUFBTWlELEVBQWlCeFEsU0FBU0MsY0FBYyx1Q0FDMUN1USxHQUNBQSxFQUFlakQsT0FFdkIsQ0FFQXZOLFNBQVNzTCxpQkFBaUIsU0FBUyxTQUFVd0UsR0FFekMsR0FBK0MsU0FEaENBLEVBQU1oUSxPQUNWMlEsYUFBYSxtQkFBK0IsQ0FDbkRYLEVBQU1ZLGlCQUVOLE1BQU1DLEVBQWdCYixFQUFNYSxjQUM1QixHQUFJQSxFQUFlLENBQ2YsTUFBTUMsRUFBT0QsRUFBY0UsUUFBUSxjQUVuQ25DLEVBQU9vQyxtQkFBbUJGLEVBQzlCLENBQ0osQ0FDSixJQUFHLEdBR0gxVSxLQUFLNlUsbUJBRVQsQ0FFQSx5QkFBT0QsQ0FBbUJGLEdBQ3RCLE1BQU1JLEVBQU05USxPQUFPK1EsZUFFbkIsR0FBSUQsR0FDSUEsRUFBSUUsV0FBYSxFQUFHLENBQ3BCLE1BQU1DLEVBQVFILEVBQUlJLFdBQVcsR0FDN0JELEVBQU1FLGlCQUVOLE1BQU1DLEVBQVd0UixTQUFTMEIsZUFBZWtQLEdBQ3pDTyxFQUFNSSxXQUFXRCxHQUVqQkgsRUFBTUssY0FBY0YsR0FDcEJILEVBQU1NLFlBQVlILEdBQ2xCTixFQUFJVSxrQkFDSlYsRUFBSVcsU0FBU1IsRUFDakIsQ0FFUixDQUVBLGlCQUFBZCxDQUFrQjNQLEdBS2QsR0FKSUEsRUFBUXNQLFdBQWFELEtBQUtFLFlBQzFCdlAsRUFBVUEsRUFBUVUsY0FHaEJWLGFBQW1Ca1IsYUFFckIsWUFEQXJHLFFBQVErRSxNQUFNLDBDQUEyQzVQLEdBSTdELE1BQU04TCxFQUFTOUwsRUFBUTBQLFFBQVEsVUFDL0IsSUFBSXlCLEVBQWNyRixHQUFRdk0sY0FBYyxrQkFFbkM0UixHQUFlckYsSUFDaEJxRixFQUFjM1YsS0FBS3lTLHNCQUFzQnBILE9BQU8xQyxFQUFzQndCLGNBQWNOLG9CQUNwRnlHLEVBQU9zRixRQUFRRCxHQUV2QixDQUVBLGlCQUFBRSxDQUFrQnJSLEdBS2QsR0FKSUEsRUFBUXNQLFdBQWFELEtBQUtFLFlBQzFCdlAsRUFBVUEsRUFBUVUsY0FHaEJWLGFBQW1Ca1IsYUFFckIsWUFEQXJHLFFBQVErRSxNQUFNLDBDQUEyQzVQLEdBSTdELE1BQU04TCxFQUFTOUwsRUFBUTBQLFFBQVEsVUFDL0IsR0FBSTVELEVBQVEsQ0FDUixNQUFNcUYsRUFBY3JGLEVBQU92TSxjQUFjLGlCQUN6QzRSLEdBQWF6UyxRQUNqQixDQUNKLENBRUEsY0FBQTRTLEdBQ0ksTUFBTSxJQUFJeFIsTUFBTSw0QkFDcEIsQ0FJQSxpQkFBQXVRLEdBQ0ksSUFBSWtCLEVBQW1CLEtBRW5CQyxFQUFXbFMsU0FBU1csY0FBYyxPQUN0Q3VSLEVBQVM5SixVQUFVQyxJQUFJLGFBQ3ZCNkosRUFBU3JTLE1BQU13TCxPQUFTLE1BQ3hCNkcsRUFBU3JTLE1BQU1xSyxRQUFVLE9BRXpCaE8sS0FBS3FRLFlBQVlqQixpQkFBaUIsYUFBY3dFLElBQ3ZDQSxFQUFNaFEsUUFBb0JzSSxXQUFXMEUsU0FBUyxrQkFDL0NtRixFQUFlbkMsRUFBTWhRLFFBQW9Cc1EsUUFBUSxVQUNqRDZCLEVBQVlqUixhQUFhLFlBQWEsUUFDdENtUixZQUFXLEtBQ1BGLEVBQVlwUyxNQUFNdVMsUUFBVSxLQUFLLEdBQ2xDLEdBQ1AsSUFHSmxXLEtBQUtxUSxZQUFZakIsaUJBQWlCLFdBQVcsS0FDekM2RyxZQUFXLEtBQ0hGLElBQ0FBLEVBQVlwUyxNQUFNdVMsUUFBVSxHQUM1QkgsRUFBWUksZ0JBQWdCLGFBQzVCSixFQUFjLE1BRWxCQyxFQUFTOVMsUUFBUSxHQUNsQixFQUFFLElBR1RsRCxLQUFLcVEsWUFBWWpCLGlCQUFpQixZQUFhd0UsSUFDM0NBLEVBQU1ZLGlCQUNOLElBQUk1USxFQUFVZ1EsRUFBTWhRLFFBQW9Cc1EsUUFBUSxVQUVoRCxHQUFJdFEsR0FBVUEsSUFBV21TLEVBQWEsQ0FDbEMsSUFBSUssRUFBV3hTLEVBQU9tTyx3QkFDbEJzRSxFQUFTRCxFQUFTRSxFQUFJRixFQUFTakgsT0FBUyxFQUV2Q3lFLEVBQXFCMkMsUUFBVUYsRUFDNUJ6UyxFQUFPNFMscUJBQXVCUixHQUM5QnBTLEVBQU82UyxzQkFBc0IsV0FBWVQsR0FHekNwUyxFQUFPOFMseUJBQTJCVixHQUNsQ3BTLEVBQU82UyxzQkFBc0IsY0FBZVQsRUFHeEQsQ0FFQUEsRUFBU3JTLE1BQU1xSyxRQUFVLE9BQU8sSUFHcENoTyxLQUFLcVEsWUFBWWpCLGlCQUFpQixRQUFTd0UsSUFDdkNBLEVBQU1ZLGlCQUNGdUIsR0FBZUMsR0FBWUEsRUFBU2xGLGdCQUNwQ2tGLEVBQVNsRixjQUFjNkYsYUFBYVosRUFBYUMsR0FDakRBLEVBQVM5UyxTQUNiLEdBRVIsRUNuVEcsTUFBTTBULEVBR1QsNkJBQU9DLEdBQ0gsSUFBSUMsRUFBWTlTLE9BQU8rUSxlQUN2QixJQUFLK0IsR0FBVzlCLFdBQVksT0FBTyxFQUVuQyxJQUFJK0IsRUFBT0QsRUFBVUUsV0FDckIsS0FBT0QsR0FBTSxDQUNULEdBQUlBLEVBQUtqRCxXQUFhRCxLQUFLb0QsZUFDVyxPQUE3QkYsRUFBaUJHLFNBQWtELE9BQTdCSCxFQUFpQkcsU0FDeEQsT0FBTyxFQUdmSCxFQUFPQSxFQUFLN1IsVUFDaEIsQ0FDQSxPQUFPLENBQ1gsQ0FjQSwyQkFBT2lTLENBQXFCQyxHQUV4QixJQVNJQyxFQUFpQkMsRUFUakJDLEdBQVUsRUFBT0MsR0FBUSxFQUU3QixHQUFzQixJQUFsQkosRUFBR3BMLFlBSUgsT0FIQXVMLEdBQVUsRUFDVkMsR0FBUSxFQUVELENBQUVELFVBQVNDLFNBS3RCLE1BQU0xQyxFQUFNOVEsT0FBTytRLGVBY25CLE9BYklELEdBQU9BLEVBQUlFLFdBQWEsSUFDeEJxQyxFQUFXdkMsRUFBSUksV0FBVyxHQUMxQm9DLEVBQVl4VCxTQUFTMlQsY0FFckJILEVBQVVJLG1CQUFtQk4sR0FDN0JFLEVBQVVLLE9BQU9OLEVBQVNPLGVBQWdCUCxFQUFTUSxhQUNuRE4sRUFBbUMsS0FBekJELEVBQVV2WCxXQUVwQnVYLEVBQVVJLG1CQUFtQk4sR0FDN0JFLEVBQVVRLFNBQVNULEVBQVNVLGFBQWNWLEVBQVNXLFdBQ25EUixFQUFpQyxLQUF6QkYsRUFBVXZYLFlBR2YsQ0FBRXdYLFVBQVNDLFFBQ3RCLENBeUJBLGtCQUFPUyxDQUFZQyxFQUFlQyxHQUMxQkEsRUFBY2pULFlBQ2RpVCxFQUFjalQsV0FBV3lSLGFBQWF1QixFQUFTQyxFQUFjQyxZQUVyRSxDQXVCQSxxQkFBT0MsQ0FBZXRCLEdBQ2xCLE1BQW9DLEtBQTdCQSxFQUFLL0ssYUFBYXNNLFFBQ3BCdkIsRUFBS3dCLGlCQUFtQkMsTUFBTUMsS0FBSzFCLEVBQUsyQixZQUFZQyxNQUFLQyxHQUFhNVksS0FBS3FZLGVBQWVPLElBQ25HLENBdUJBLDBCQUFPQyxDQUFvQnJVLEdBQ3ZCLE1BQU1zVSxFQUFnQnRVLEVBQVF1VSxXQUFVLEdBRWxDakksRUFBZ0J0TSxFQUFRVSxXQUU5QixPQUFLNEwsR0FJTEEsRUFBYzZGLGFBQWFtQyxFQUFldFUsRUFBUTRULGFBRTNDVSxHQUxJLElBTWYsQ0FzQkEsZ0RBQU9FLENBQTBDQyxHQUM3QyxNQUFNQyxFQUFnQnBWLFNBQVNvVixjQUUvQixJQUFLQSxFQUNELE9BQU8sS0FHWCxJQUFJQyxFQUE4QkQsRUFFbEMsS0FBT0MsR0FBZ0IsQ0FDbkIsR0FDSUEsRUFBZXJGLFdBQWFELEtBQUtvRCxjQUNoQ2tDLEVBQStCak4sVUFBVTBFLFNBQVNxSSxHQUVuRCxPQUFPRSxFQUdYQSxFQUFpQkEsRUFBZWpVLFVBQ3BDLENBRUEsT0FBTyxJQUNYLENBV0EsNENBQU9rVSxDQUFzQ0gsR0FDekMsTUFBTW5DLEVBQVk5UyxPQUFPK1EsZUFHekIsSUFBSytCLEdBQXNDLElBQXpCQSxFQUFVOUIsV0FDeEIsT0FBTyxLQUlYLElBQUltRSxFQUE4QnJDLEVBQVU1QixXQUFXLEdBQUdtRSx3QkFRMUQsSUFMSUYsR0FBa0JBLEVBQWVyRixXQUFhRCxLQUFLRSxZQUNuRG9GLEVBQWlCQSxFQUFlalUsWUFJN0JpVSxHQUFnQixDQUNuQixHQUFJQSxFQUFlckYsV0FBYUQsS0FBS29ELGNBQWlCa0MsRUFBK0JqTixVQUFVMEUsU0FBU3FJLEdBQ3BHLE9BQU9FLEVBRVhBLEVBQWlCQSxFQUFlalUsVUFDcEMsQ0FFQSxPQUFPLElBQ1gsQ0E0QkEsaUNBQU9vVSxDQUEyQkMsRUFBbUJyQixHQUNqRCxNQUFNc0IsRUFBaUI1QyxFQUFTNkMsa0JBQWtCRixHQUM1Q0csRUFBVTFaLEtBQUsyWiw4QkFBOEJKLEdBUW5ELEdBTEF6VixTQUFTaVIsZ0JBQWdCUyxrQkFDekIxUixTQUFTaVIsZ0JBQWdCVSxTQUFTaUUsRUFBUSxJQUMxQzVWLFNBQVNpUixnQkFBZ0I2RSxxQkFHckIxQixHQUFXc0IsRUFBZ0IsQ0FDM0J4WixLQUFLNlosa0JBQWtCM0IsRUFBU3NCLEdBRWhDLE1BQU1NLEVBQVU5WixLQUFLMlosOEJBQThCekIsR0FFbkRwVSxTQUFTaVIsZ0JBQWdCUyxrQkFDekIxUixTQUFTaVIsZ0JBQWdCVSxTQUFTcUUsRUFBUSxJQUMxQ2hXLFNBQVNpUixnQkFBZ0I2RSxvQkFDN0IsQ0FDSixDQXlCQSx3QkFBT0gsQ0FBa0IxQyxHQUNyQixNQUFNRCxFQUFZOVMsT0FBTytRLGVBQ3pCLElBQUsrQixJQUFjQyxFQUFNLE9BQU8sS0FFaEMsTUFBTTlCLEVBQVE2QixFQUFVNUIsV0FBVyxHQUVuQyxJQUFLRCxFQUFNOEUsZUFBZWhELEdBQU8sT0FBTyxLQUV4QyxNQUFNaUQsRUFBYWxXLFNBQVNtVyxpQkFDeEJsRCxFQUNBbUQsV0FBV0MsVUFDWCxDQUFFQyxXQUFZckQsR0FBUW1ELFdBQVdHLGdCQUdyQyxJQUFJQyxFQUFZLEVBQ1pmLEVBQWNTLEVBQVd6VSxhQUU3QixLQUFPZ1UsR0FBYSxDQUNoQixHQUFJQSxJQUFnQnRFLEVBQU0yQyxlQUFnQixDQUN0QzBDLEdBQWFyRixFQUFNNEMsWUFDbkIsS0FDSixDQUVBeUMsR0FBYWYsRUFBWXZOLGFBQWExTCxRQUFVLEVBQ2hEaVosRUFBY1MsRUFBV08sVUFDN0IsQ0FFQSxPQUFPRCxDQUNYLENBdUJBLHdCQUFPVCxDQUFrQnJWLEVBQWVnSyxHQUNwQyxNQUFNc0ksRUFBWTlTLE9BQU8rUSxlQUN6QixJQUFLK0IsRUFBVyxPQUVoQkEsRUFBVXRCLGtCQUVWLE1BQU1QLEVBQVFuUixTQUFTMlQsY0FDakJ1QyxFQUFhbFcsU0FBU21XLGlCQUN4QnpWLEVBQ0EwVixXQUFXQyxVQUNYLENBQUVDLFdBQVksSUFBTUYsV0FBV0csZ0JBR25DLElBQUlkLEVBQWNTLEVBQVdPLFdBQ3pCQyxFQUFhLEVBRWpCLEtBQU9qQixHQUFhLENBQ2hCLE1BQU1rQixFQUFhbEIsRUFBWXZOLGFBQWExTCxRQUFVLEVBQ3RELEdBQUlrYSxFQUFhQyxHQUFjak0sRUFBVSxDQUNyQ3lHLEVBQU02QyxTQUFTeUIsRUFBYS9LLEVBQVdnTSxHQUN2Q3ZGLEVBQU15RixVQUFTLEdBQ2YsS0FDSixDQUNBRixHQUFjQyxFQUNkbEIsRUFBY1MsRUFBV08sVUFDN0IsQ0FFQXpELEVBQVVyQixTQUFTUixFQUN2QixDQXlCQSxzQ0FBTzBGLEdBQ0gsTUFBTUMsRUFBUWhFLEVBQVNpRSx3QkFDakJDLEVBQWlCRixHQUFPN1csY0FBYyw2QkFDNUMsT0FBSytXLEdBR2VBLEVBQWV2RyxhQUFhLHNCQUZyQyxJQUlmLENBeUJBLG9DQUFPb0YsQ0FBOEJvQixHQUNqQyxNQUFNQyxFQUFrQixHQUVsQmxFLEVBQVk5UyxPQUFPK1EsZUFDekIsSUFBSytCLEdBQXNDLElBQXpCQSxFQUFVOUIsV0FBa0IsT0FBT2dHLEVBRXJELE1BQU0vRixFQUFRNkIsRUFBVTVCLFdBQVcsR0FFN0IrRixFQUFjblgsU0FBUzJULGNBQzdCd0QsRUFBWXZELG1CQUFtQnFELEdBQy9CRSxFQUFZdEQsT0FBTzFDLEVBQU0yQyxlQUFnQjNDLEVBQU00QyxhQUUvQyxNQUFNcUQsRUFBYXBYLFNBQVMyVCxjQVU1QixPQVRBeUQsRUFBV3hELG1CQUFtQnFELEdBQzlCRyxFQUFXcEQsU0FBUzdDLEVBQU04QyxhQUFjOUMsRUFBTStDLFdBQzFDK0MsRUFBU0ksV0FDVEQsRUFBVzNGLFlBQVl3RixFQUFTSSxXQUdwQ0gsRUFBT3ZiLEtBQUt3YixHQUNaRCxFQUFPdmIsS0FBS3liLEdBRUxGLENBQ1gsQ0F1QkEsMENBQU9JLENBQW9DQyxHQUN2QyxHQUFJQSxFQUFnQkMsa0JBQW1CLENBQ25DRCxFQUFnQmhLLFFBRWhCLE1BQU00RCxFQUFRblIsU0FBUzJULGNBQ3ZCeEMsRUFBTXlDLG1CQUFtQjJELEdBQ3pCcEcsRUFBTXlGLFVBQVMsR0FFZixNQUFNNUQsRUFBWTlTLE9BQU8rUSxlQUN6QitCLEdBQVd0QixrQkFDWHNCLEdBQVdyQixTQUFTUixFQUN4QixNQUNJNUYsUUFBUWtNLEtBQUssK0JBRXJCLENBaUJBLHdDQUFPQyxDQUFrQ0MsR0FDakNBLEVBQWFILGtCQUNiSSx1QkFBc0IsS0FDbEJELEVBQWFwSyxRQUViLE1BQU00RCxFQUFRblIsU0FBUzJULGNBQ2pCWCxFQUFZOVMsT0FBTytRLGVBRXpCRSxFQUFNeUMsbUJBQW1CK0QsR0FFekIsSUFBSUUsRUFBd0JGLEVBQzVCLEtBQU9FLEVBQVNSLFdBQ1pRLEVBQVdBLEVBQVNSLFVBR3hCbEcsRUFBTTBDLE9BQU9nRSxFQUFVQSxFQUFTN0gsV0FBYUQsS0FBS0UsVUFBWTRILEVBQVMzUCxZQUFhMUwsT0FBUyxHQUM3RjJVLEVBQU15RixVQUFTLEdBRWY1RCxHQUFXdEIsa0JBQ1hzQixHQUFXckIsU0FBU1IsRUFBTSxJQUc5QjVGLFFBQVFrTSxLQUFLLCtCQUVyQixDQUVBLDRCQUFPVixHQUVILElBQUlsSCxFQUFZN1AsU0FBU29WLGNBRXpCLE9BQUl2RixFQUNPQSxFQUFVTyxRQUFRLFVBR3RCLElBQ1gsQ0FFQSxpQ0FBTzBILENBQTJCQyxHQUM5QixNQUFNL0UsRUFBWWhULFNBQVNpUixlQUUzQixJQUFLK0IsRUFDRCxPQUFPLEVBR1gsSUFBS0EsRUFBVTlCLFdBQVksT0FBTyxFQUdsQyxJQUFJeFEsRUFEVXNTLEVBQVU1QixXQUFXLEdBQ0YwQyxlQU1qQyxPQUpJcFQsRUFBUXNQLFdBQWFELEtBQUtFLFlBQzFCdlAsRUFBVUEsRUFBUVUsY0FHakJWLEdBSW1ELE9BQWhEQSxFQUFvQjBQLFFBQVEySCxFQUN4QyxDQUVBLHVCQUFPQyxHQUNILElBQUlDLEVBQW1DLEtBQ3ZDLE1BQU1qRixFQUFZOVMsT0FBTytRLGVBRXpCLEdBQUkrQixHQUFhQSxFQUFVOUIsV0FBYSxFQUFHLENBQ3ZDLE1BQU1DLEVBQVE2QixFQUFVNUIsV0FBVyxHQUM3QnZCLEVBQVlzQixFQUFNb0Usd0JBRXhCLEdBQUkxRixFQUFVRyxXQUFhRCxLQUFLRSxXQUFhSixFQUFVN0MsZUFBZXdLLGtCQUFtQixDQUNyRixJQUFJdkUsRUFBb0JwRCxFQUNwQjBDLEVBQVNwQixFQUFNNEMsWUFFbkIsS0FBT2QsR0FBUVYsRUFBUyxHQUFHLENBSXZCLEdBRkEwRixHQUR5QmhGLEVBQUsvSyxhQUFhZ1EsVUFBVSxFQUFHM0YsSUFBVyxJQUM5QjRGLFlBQVksTUFFdEIsSUFBdkJGLEVBQTBCLENBQzFCOUcsRUFBTTZDLFNBQVNmLEVBQU1nRixHQUNyQjlHLEVBQU1FLGlCQUNOLEtBQ0osQ0FDSWtCLEVBQVNVLEVBQUs3UixZQUFZOEcsYUFBYWlRLFlBQVksT0FBUyxFQUM1RGxGLEVBQU9BLEVBQUs3UixVQUVwQixDQUVBNFIsRUFBVXRCLGtCQUNWc0IsRUFBVXJCLFNBQVNSLEVBQ3ZCLE1BQ0k1RixRQUFRa00sS0FBSyxxRUFFckIsTUFDSWxNLFFBQVFrTSxLQUFLLHdCQUdqQixPQUFPUSxDQUNYLENBSUEsb0RBQU9HLENBQThDdEksRUFBbUJ1SSxHQUNwRSxJQUFJQyxFQUFpQnhJLEVBQU1oUSxPQU0zQixHQUpJd1ksRUFBZXRJLFdBQWFELEtBQUtFLFlBQ2pDcUksRUFBaUJBLEVBQWV0TCxlQUdoQ3NMLEVBQWVDLFFBQVFDLGNBQWdCSCxFQUN2QyxPQUFPQyxFQUdYLElBQUlqRCxFQUFpQmlELEVBQWV0TCxjQUNwQyxLQUFPcUksR0FBZ0IsQ0FDbkIsR0FBSUEsRUFBZWtELFFBQVFDLGNBQWdCSCxFQUN2QyxPQUFPaEQsRUFFWEEsRUFBaUJBLEVBQWVySSxhQUNwQyxDQUVBLE9BQU8sSUFDWCxDQUVBLHVDQUFPeUwsQ0FBaUMzSSxFQUFtQmpVLEdBQ3ZELElBQUl5YyxFQUFpQnhJLEVBQU1oUSxPQU0zQixHQUpJd1ksRUFBZXRJLFdBQWFELEtBQUtFLFlBQ2pDcUksRUFBaUJBLEVBQWV0TCxlQUdoQ3NMLEVBQWV6YyxLQUFPQSxFQUN0QixPQUFPeWMsRUFHWCxJQUFJakQsRUFBaUJpRCxFQUFldEwsY0FDcEMsS0FBT3FJLEdBQWdCLENBQ25CLEdBQUlBLEVBQWV4WixLQUFPQSxFQUN0QixPQUFPd1osRUFFWEEsRUFBaUJBLEVBQWVySSxhQUNwQyxDQUVBLE9BQU8sSUFDWCxDQUVBLDBDQUFPMEwsQ0FBb0M1SSxFQUFtQjZJLEdBQzFELElBQUlMLEVBQWlCeEksRUFBTWhRLE9BTTNCLEdBSkl3WSxFQUFldEksV0FBYUQsS0FBS0UsWUFDakNxSSxFQUFpQkEsRUFBZXRMLGVBR2hDc0wsRUFBZWxRLFVBQVUwRSxTQUFTNkwsR0FDbEMsT0FBT0wsRUFHWCxJQUFJakQsRUFBaUJpRCxFQUFldEwsY0FDcEMsS0FBT3FJLEdBQWdCLENBQ25CLEdBQUlBLEVBQWVqTixVQUFVMEUsU0FBUzZMLEdBQ2xDLE9BQU90RCxFQUVYQSxFQUFpQkEsRUFBZXJJLGFBQ3BDLENBRUEsT0FBTyxJQUNYLEdoQnRxQkosU0FBWTdKLEdBRVIsc0RBR0EsNENBQ0Esd0NBQ0EsNENBQ0Esa0RBQ0Esb0RBQ0EsMERBQ0Esc0RBQ0Esa0RBRUEsa0RBQ0EsZ0RBRUEsb0RBQ0Esb0RBR0Esa0JBQ0EsY0FDQSxrQkFDQSx3QkFDQSwwQkFDQSxnQ0FDQSw0QkFDQSx3QkFHQSx3Q0FDQSxrQ0FDQSxzQ0FDQSw4QkFDQSxxQ0FNSCxDQXpDRCxDQUFZQSxJQUFBQSxFQUFZLEtDQXhCLFNBQVlDLEdBRVIsMkJBQ0EsNkJBQ0EsNEJBQ0EsOEJBQ0EsNEJBQ0EsZ0NBRUEseUJBQ0EsMkJBQ0EsMEJBQ0EsNEJBQ0EsMEJBQ0EsNkJBRUEsK0JBQ0EsaUNBQ0EsZ0NBQ0Esa0NBQ0EsZ0NBQ0Esb0NBRUEsMkJBQ0EsNENBQ0EsWUFDQSxtQkFDQSw4QkFFSCxDQTdCRCxDQUFZQSxJQUFBQSxFQUFNLEtDQWxCLFNBQVlDLEdBRVIsb0JBQ0Esd0JBQ0Esa0NBQ0EsOEJBQ0EsZ0NBQ0EsMEJBQ0EsOEJBQ0Esc0NBQ0EsOEJBR0Esa0NBQ0Esa0NBQ0EsNEJBQ0EsMENBQ0EsOENBR0Esd0JBR0EsNENBQ0EsNENBQ0EsZ0RBQ0Esa0RBQ0EsOERBQ0Esd0RBQ0EsOERBQ0Esd0RBQ0EsZ0RBQ0EsOEJBQ0Esd0JBQ0EsaURBQ0gsQ0FuQ0QsQ0FBWUEsSUFBQUEsRUFBUSxLZUViLE1BQU11VixFQUVUM08sTUFFQSxXQUFBd0MsQ0FBWXhDLEdBQ1IvTixLQUFLK04sTUFBUUEsQ0FDakIsR2RSSixTQUFZM0csR0FFUiwwQ0FDQSw4Q0FDQSwwQ0FDQSwrQkFDQSwyQkFFSCxDQVJELENBQVlBLElBQUFBLEVBQWMsS2VBbkIsTUFBTXVWLEVBRVRGLFNBQ0FyTCxNQUNBd0wsVUFFQSxXQUFBck0sQ0FBWWtNLEVBQTJEckwsRUFBZXdMLEdBQ2xGNWMsS0FBS3ljLFNBQVdBLEVBQ2hCemMsS0FBS29SLE1BQVFBLEVBQ2JwUixLQUFLNGMsVUFBWUEsQ0FDckIsRUNWRyxNQUFNQyxFQUVUSixTQUVBLFdBQUFsTSxDQUFZa00sR0FDUnpjLEtBQUt5YyxTQUFXQSxDQUNwQixFQ0pHLE1BQU1LLEdDQU4sTUFBTUMsR0NXTixNQUFNQyxFQUVULDJCQUFPQyxDQUFxQkMsR0FFeEIsTUFBTUMsRUFBYyxJQUFJQyxZQUE0QmhXLEVBQWUyVixZQUFhLENBQzVFTSxPQUFRLENBQ0pILFNBQVVBLEVBQ1ZJLE9BQVEsSUFBSVAsS0FJcEJqWixTQUFTeVosY0FBY0osRUFDM0IsQ0FFQSw0QkFBT0ssQ0FBc0JOLEdBRXpCLE1BQU1DLEVBQWMsSUFBSUMsWUFBNEJoVyxFQUFlMFYsYUFBYyxDQUM3RU8sT0FBUSxDQUNKSCxTQUFVQSxFQUNWSSxPQUFRLElBQUlSLEtBSXBCaFosU0FBU3laLGNBQWNKLEVBQzNCLENBRUEsb0NBQU9NLENBQThCUCxFQUFrQm5QLEdBRW5ELE1BQU1vUCxFQUFjLElBQUlDLFlBQTRCaFcsRUFBZXNXLG1CQUFvQixDQUNuRkwsT0FBUSxDQUNKSCxTQUFVQSxFQUNWSSxPQUFRLElBQUlaLEVBQVkzTyxNQUloQ2pLLFNBQVN5WixjQUFjSixFQUMzQixDQUVBLHFDQUFPUSxDQUErQkMsRUFBOER4TSxFQUFleU0sR0FFNUYsZUFBZkQsR0FBZ0N4TSxHQUFTbEssRUFBTzRXLGtCQUNoREQsRUFBWSxRQUdHLGFBQWZELEdBQThCeE0sR0FBU2xLLEVBQU82VyxtQkFDOUNGLEVBQVksUUFHRyxtQkFBZkQsR0FBb0N4TSxHQUFTbEssRUFBTzhXLHNCQUNwREgsRUFBWSxRQUdoQixNQUFNVixFQUFjLElBQUlDLFlBQTRCaFcsRUFBZXVWLHFCQUFzQixDQUVyRlUsT0FBUSxDQUNKTyxZQUFhQSxFQUNiTixPQUFRLElBQUlYLEVBQXFCaUIsRUFBYXhNLEVBQU95TSxNQUk3RC9aLFNBQVN5WixjQUFjSixFQUMzQixDQUVBLHlDQUFPYyxDQUFtQ0wsR0FFdEMsTUFBTVQsRUFBYyxJQUFJQyxZQUE0QmhXLEVBQWV5VixtQkFBb0IsQ0FFbkZRLE9BQVEsQ0FDSk8sWUFBYUEsRUFDYk4sT0FBUSxJQUFJVCxFQUFtQmUsTUFJdkM5WixTQUFTeVosY0FBY0osRUFDM0IsQ0FtRUEsc0NBQU9lLENBQWdDQyxFQUFvQnBRLEdBRXZELE1BQU1vUCxFQUFjLElBQUlDLFlBQWlDblcsRUFBYW1YLGVBQWdCLENBQ2xGZixPQUFRLENBQ0pnQixRQUFTbFgsRUFBU21YLHVCQUNsQmxOLE1BQU9yRCxFQUNQb1EsTUFBT0EsS0FJZnJhLFNBQVN5WixjQUFjSixFQUMzQixFQ3pKRyxNQUFNb0IsRUFFRDFWLGdCQUVBNEosc0JBQ0FDLFFBQ0E4TCxXQUVSM1Ysd0JBQTBCLENBQ3RCNFYsVUFBVyxXQUNYQyxxQkFBc0IscUJBQ3RCQyx5QkFBMEIsMkJBQzFCQyxxQkFBc0IsdUJBQ3RCQyxlQUFnQixlQUNoQkMsa0JBQW1CLGtCQUNuQkMsY0FBZSxjQUNmQyxPQUFRLFNBQ1JDLFVBQVcsWUFDWEMsS0FBTSxPQUNOQyxNQUFPLFFBQ1BDLElBQUssTUFDTEMsY0FBZSxlQUNmQyxnQkFBaUIsa0JBR3JCLFlBQ0k3TSxFQUNBK0wsRUFDQTlMLEdBRUEsR0FBSTZMLEVBQXVCak0sU0FDdkIsTUFBTSxJQUFJaE8sTUFBTSw2REFHcEJ0RSxLQUFLeVMsc0JBQXdCQSxFQUM3QnpTLEtBQUt3ZSxXQUFhQSxFQUNsQnhlLEtBQUswUyxRQUFVQSxFQUVmNkwsRUFBdUJqTSxTQUFXdFMsSUFDdEMsQ0FFQSxXQUFBdWYsQ0FBWWxCLEVBQWlCbUIsRUFBaUJwTyxFQUF1QixNQUVqRSxHQUFJaU4sR0FBV0UsRUFBdUJrQixpQkFBaUJQLEtBQU0sQ0FFekQsR0FBSXBiLFNBQVNpUixjQUFnQjJLLFVBQVVDLFdBQWFELFVBQVVDLFVBQVVDLFVBQVcsQ0FDL0UsTUFBTTlJLEVBQVloVCxTQUFTaVIsZUFFM0IsR0FBSStCLEdBQWFBLEVBQVUvVyxXQUFXTyxPQUFTLEVBQUcsQ0FDOUMsTUFBTXVmLEVBQWUvSSxFQUFVL1csV0FFL0IyZixVQUFVQyxVQUFVQyxVQUFVQyxHQUFjQyxNQUFLLEtBRTdDLE1BQU1DLEVBQWMsSUFBSTNDLFlBQVksYUFBYyxDQUM5QzRDLFNBQVMsRUFDVEMsWUFBWSxJQUtoQixPQUZBbmMsU0FBU3laLGNBQWN3QyxJQUVoQixDQUFJLElBRVpHLE9BQU9DLElBQ045USxRQUFRK0UsTUFBTSx1QkFBd0IrTCxFQUFJLEdBRWxELENBQ0osQ0FFQSxPQUFPLENBQ1gsQ0FFQSxHQUFJOUIsR0FBV0UsRUFBdUJrQixpQkFBaUJMLElBQUssQ0FFeEQsR0FBSXRiLFNBQVNpUixjQUFnQjJLLFVBQVVDLFdBQWFELFVBQVVDLFVBQVVDLFVBQVcsQ0FDL0UsTUFBTTlJLEVBQVloVCxTQUFTaVIsZUFFM0IsR0FBSStCLEdBQWFBLEVBQVUvVyxXQUFXTyxPQUFTLEVBQUcsQ0FDOUMsTUFBTXVmLEVBQWUvSSxFQUFVL1csV0FFL0IrVyxFQUFVOEMscUJBU1Y4RixVQUFVQyxVQUFVQyxVQUFVQyxHQUFjQyxNQUFLLEtBRXRDLElBRVJJLE9BQU9DLElBQ045USxRQUFRK0UsTUFBTSx3QkFBeUIrTCxFQUFJLEdBRW5ELENBQ0osQ0FFQSxPQUFPLENBQ1gsQ0FFQSxHQUFJOUIsR0FBV0UsRUFBdUJrQixpQkFBaUJOLE1BMEJuRCxPQXpCSU8sVUFBVUMsV0FBYUQsVUFBVUMsVUFBVVMsVUFDM0NWLFVBQVVDLFVBQVVTLFdBQVdOLE1BQU1PLElBQ2pDLE1BQU12SixFQUFZaFQsU0FBU2lSLGVBRTNCLEdBQUkrQixHQUFhQSxFQUFVOUIsV0FBYSxFQUFHLENBQ3ZDLE1BQU1DLEVBQVE2QixFQUFVNUIsV0FBVyxHQUNuQ0QsRUFBTUUsaUJBQ05GLEVBQU1JLFdBQVd2UixTQUFTMEIsZUFBZTZhLElBRXpDLE1BQU1DLEVBQWlCLElBQUlsRCxZQUFZLCtCQUFnQyxDQUNuRTRDLFNBQVMsRUFDVEMsWUFBWSxJQUtoQixPQUZBbmMsU0FBU3laLGNBQWMrQyxJQUVoQixDQUNYLENBQ0lqUixRQUFRK0UsTUFBTSx1Q0FDbEIsSUFDRDhMLE9BQU9DLElBQ045USxRQUFRK0UsTUFBTSw0QkFBNkIrTCxFQUFJLEtBSWhELEVBV1gsR0FSSTlCLEdBQVdFLEVBQXVCa0IsaUJBQWlCSCxpQkFFckN0ZixLQUFLdWdCLDJCQUNOblAsR0FDVHBSLEtBQUt3Z0IsZUFBZXBQLEdBSXhCaU4sR0FBV0UsRUFBdUJrQixpQkFBaUJKLGNBQ25ELE9BQU92YixTQUFTeWIsWUFBWWhCLEVBQXVCa0IsaUJBQWlCSixlQUFlLEdBR3ZGLEdBQUloQixHQUFXRSxFQUF1QmtCLGlCQUFpQlQsT0FBUSxDQUUzRGhmLEtBQUt5Z0IsdUJBRUwsTUFBTUMsRUFBWSxJQUFJdEQsWUFBWW5XLEVBQWEwWixhQUFjLENBQ3pEWCxTQUFTLEVBQ1RDLFlBQVksSUFLaEIsT0FGQW5jLFNBQVN5WixjQUFjbUQsSUFFaEIsQ0FDWCxDQUVBLEdBQUlyQyxHQUFXRSxFQUF1QmtCLGlCQUFpQlIsVUFJbkQsT0FGQWpmLEtBQUs0Z0IsMEJBRUUsRUFHWCxHQUFJdkMsR0FBV0UsRUFBdUJrQixpQkFBaUJmLHFCQUFzQixDQUN6RSxNQUFNbGEsRUFBVVYsU0FBU29WLGVBQWlCLEtBRzFDLE9BREFsWixLQUFLNmdCLG1CQUFtQnJjLElBQ2pCLENBQ1gsQ0FFQSxHQUFJNlosR0FBV0UsRUFBdUJrQixpQkFBaUJaLGVBQWdCLENBRW5FLE1BQU1yYSxFQUFVVixTQUFTQyxjQUFjLGNBRXZDLFFBQUlTLElBQ0NBLEVBQXdCNk0sU0FDbEIsRUFJZixDQUVBLEdBQUlnTixHQUFXRSxFQUF1QmtCLGlCQUFpQmQseUJBRW5ELE9BREEzZSxLQUFLOGdCLDRCQUNFLEVBR1gsR0FBSXpDLEdBQVdFLEVBQXVCa0IsaUJBQWlCYixxQkFFbkQsT0FEQTVlLEtBQUt5Z0Isd0JBQ0UsRUFHWCxHQUFJcEMsR0FBV0UsRUFBdUJrQixpQkFBaUJYLGtCQUFtQixDQUN0RSxNQUFNdGEsRUFBVVYsU0FBU29WLGNBRXpCLFFBQUkxVSxJQUNBeEUsS0FBSytnQixnQkFBZ0J2YyxJQUNkLEVBR2YsQ0FFQSxHQUFJNlosR0FBV0UsRUFBdUJrQixpQkFBaUJWLGNBQWUsQ0FDbEUsTUFBTXZhLEVBQVVWLFNBQVNvVixjQUV6QixRQUFJMVUsSUFDQXhFLEtBQUtnaEIsWUFBWXhjLElBQ1YsRUFHZixDQW9CQSxPQUFPLENBQ1gsQ0FFQSxpQkFBQXljLEdBQ0ksTUFBTSxJQUFJM2MsTUFBTSwwQkFDcEIsQ0FFQSxrQkFBTzRHLEdBRUgsTUFBTXVILEVBQXdCTixFQUFvQkUsU0FBU0UsUUFBZ0MsMEJBQ3JGaU0sRUFBYXJNLEVBQW9CRSxTQUFTRSxRQUFxQixlQUMvREcsRUFBVVAsRUFBb0JFLFNBQVNFLFFBQWtCLFlBTS9ELE9BSkt2UyxLQUFLc1MsV0FDTnRTLEtBQUtzUyxTQUFXLElBQUlpTSxFQUF1QjlMLEVBQXVCK0wsRUFBWTlMLElBRzNFMVMsS0FBS3NTLFFBQ2hCLENBRUEsdUNBQU80TyxHQUNILE1BQU1wSyxFQUFZOVMsT0FBTytRLGVBRXpCLEdBQUkrQixHQUFhQSxFQUFVOUIsV0FBYSxFQUFHLENBRXZDLElBQUl4USxFQURVc1MsRUFBVTVCLFdBQVcsR0FDRm1FLHdCQU1qQyxJQUpJN1UsRUFBUXNQLFdBQWFELEtBQUtFLFlBQzFCdlAsRUFBVUEsRUFBUVUsWUFHZlYsS0FBYUEsYUFBbUJrUixjQUNuQ2xSLEVBQVVBLEVBQVFVLFdBR3RCLEdBQUlWLEVBRUEsT0FEa0JBLEVBQVEwUCxRQUFRLFNBRzFDLENBR0EsTUFBTSxJQUFJNVAsS0FDZCxDQTJEQSxjQUFBa2MsQ0FBZXJWLEVBQWMzRyxHQUV6QixJQUFJeVAsRUFHQUEsRUFEQXpQLEVBQ2VBLEVBQVEwUCxRQUFRLFVBRWhCbFUsS0FBS3dlLFdBQVcyQyxRQUFRak4sUUFBUSxXQUFhLEtBR2hFLElBQUk0RyxFQUFpQjdHLEVBQWNsUSxjQUFjLGNBRWpEL0QsS0FBS3dlLFdBQVcyQyxRQUFROVAsUUFFeEJ1RixFQUFTa0YsbUJBRVQ5YixLQUFLMFMsUUFBUVksWUFFYixJQUtJOE4sRUFMQWpoQixFQUFVMmEsR0FBZ0J6TSxVQUUxQmdULEVBQXNDLEtBSzFDLE9BQVFsVyxHQUNKLEtBQUt4QyxFQUFzQndCLGNBQWNwQixVQUVqQ3FZLEVBQWtCcGhCLEtBQUt5UyxzQkFBc0JwSCxPQUFPMUMsRUFBc0J3QixjQUFjcEIsV0FDeEZxWSxFQUFnQi9TLFVBQVlsTyxFQUM1QixNQUVSLEtBQUt3SSxFQUFzQndCLGNBQWNaLFNBRWpDNlgsRUFBa0JwaEIsS0FBS3lTLHNCQUFzQnBILE9BQU8xQyxFQUFzQndCLGNBQWNaLFVBQ3hGNlgsRUFBZ0IvUyxVQUFZbE8sRUFDNUIsTUFFUixLQUFLd0ksRUFBc0J3QixjQUFjWCxTQUVqQzRYLEVBQWtCcGhCLEtBQUt5UyxzQkFBc0JwSCxPQUFPMUMsRUFBc0J3QixjQUFjWCxVQUN4RjRYLEVBQWdCL1MsVUFBWWxPLEVBQzVCLE1BRVIsS0FBS3dJLEVBQXNCd0IsY0FBY1YsU0FFakMyWCxFQUFrQnBoQixLQUFLeVMsc0JBQXNCcEgsT0FBTzFDLEVBQXNCd0IsY0FBY1YsVUFDeEYyWCxFQUFnQi9TLFVBQVlsTyxFQUM1QixNQUVSLEtBQUt3SSxFQUFzQndCLGNBQWNULFNBRWpDMFgsRUFBa0JwaEIsS0FBS3lTLHNCQUFzQnBILE9BQU8xQyxFQUFzQndCLGNBQWNULFVBQ3hGMFgsRUFBZ0IvUyxVQUFZbE8sRUFDNUIsTUFFUixLQUFLd0ksRUFBc0J3QixjQUFjUixTQUVqQ3lYLEVBQWtCcGhCLEtBQUt5UyxzQkFBc0JwSCxPQUFPMUMsRUFBc0J3QixjQUFjUixVQUN4RnlYLEVBQWdCL1MsVUFBWWxPLEVBQzVCLE1BRVIsS0FBS3dJLEVBQXNCd0IsY0FBY1AsU0FFakN3WCxFQUFrQnBoQixLQUFLeVMsc0JBQXNCcEgsT0FBTzFDLEVBQXNCd0IsY0FBY1AsVUFDeEZ3WCxFQUFnQi9TLFVBQVlsTyxFQUM1QixNQUVSLEtBQUt3SSxFQUFzQndCLGNBQWNqQixLQUNyQ2tZLEVBQWtCdGQsU0FBU1csY0FBYyxPQUN6QyxNQUFNc0gsRUFBT2pJLFNBQVNXLGNBQWMsUUFDcENzSCxFQUFLc0MsVUFBWWxPLEVBQ2pCaWhCLEVBQWdCN2MsWUFBWXdILEdBQzVCLE1BTUosS0FBS3BELEVBQXNCd0IsY0FBY2hCLE1BSWpDLE1BR1IsS0FBS1IsRUFBc0J3QixjQUFjZixjQUVqQ2dZLEVBQWtCcGhCLEtBQUt5UyxzQkFBc0JwSCxPQUFPMUMsRUFBc0J3QixjQUFjZixjQUFlakosR0FFdkcsTUFHUixLQUFLd0ksRUFBc0J3QixjQUFjZCxjQUVqQytYLEVBQWtCcGhCLEtBQUt5UyxzQkFBc0JwSCxPQUFPMUMsRUFBc0J3QixjQUFjZCxjQUFlbEosR0FFdkcsTUFFUixLQUFLd0ksRUFBc0J3QixjQUFjYixXQUVqQzhYLEVBQWtCcGhCLEtBQUt5UyxzQkFBc0JwSCxPQUFPMUMsRUFBc0J3QixjQUFjYixXQUFZbkosR0FFcEcsTUFHUixJQUFLLFlBR0csTUFFUixLQUFLd0ksRUFBc0J3QixjQUFjTCxNQUVqQ3NYLEVBQWtCcGhCLEtBQUt5UyxzQkFBc0JwSCxPQUFPMUMsRUFBc0J3QixjQUFjTCxNQUFPLE1BQy9GLE1BR1IsS0FBS25CLEVBQXNCd0IsY0FBY0osTUFFakNxWCxFQUFrQnBoQixLQUFLeVMsc0JBQXNCcEgsT0FBTzFDLEVBQXNCd0IsY0FBY0osTUFBTzVKLEdBQy9Ga2hCLEVBQWtCRCxFQUNsQixNQUdSLEtBQUt6WSxFQUFzQndCLGNBQWNILFFBQ3JDb1gsRUFBa0JwaEIsS0FBS3lTLHNCQUFzQnBILE9BQU8xQyxFQUFzQndCLGNBQWNILFFBQVM3SixHQUNqRyxNQUdKLFFBRUksWUFEQWtQLFFBQVErRSxNQUFNLG9CQUl0QixJQUFLZ04sRUFDRCxPQUdKbk4sRUFBY3FOLGFBQWFGLEVBQWlCdEcsR0FFNUMsTUFBTXlHLEVBQWFILEVBQWdCbE4sUUFBUSxlQUFpQkQsRUFBY2xRLGNBQWMsY0FDcEZ3ZCxJQUNBQSxFQUFVbFEsUUFDVnVGLEVBQVM0RSxrQ0FBa0MrRixJQUk1Q0YsR0FDQ3JoQixLQUFLd2UsV0FBVy9lLEtBQU00aEIsR0FHZixTQUFSbFcsR0FDQzZSLEVBQWFDLHFCQUFxQixnQkFZMUMsQ0FtQkEsZ0JBQUF1RSxDQUFpQjVOLEdBRWI1VCxLQUFLMFMsUUFBUVksWUFFYixNQUVNd0gsRUFGVWxILEVBQU1oUSxPQUVTc1EsUUFBUSw2QkFFbkM0RyxHQUFrQkEsRUFBZTVPLFVBQVUwRSxTQUFTLFFBQ3BENVEsS0FBS3loQixlQUFlM0csR0FFcEI5YSxLQUFLNmdCLG1CQUFtQi9GLEVBRWhDLENBRUEsY0FBQTJHLENBQWVqZCxHQUVYeEUsS0FBSzBTLFFBQVFZLFlBRWIsSUFBSW9PLEVBQW9CLEtBR3BCNUcsR0FEZ0JoWCxTQUFTb1YsY0FDUjFVLEVBQVEwUCxRQUFRLDhCQUVqQzRHLEVBQWU1TyxVQUFVMEUsU0FBUyxpQkFDbEM4USxFQUFvQjFoQixLQUFLeVMsc0JBQXNCcEgsT0FBTyxlQUFnQixJQUMvRHlQLEVBQWU1TyxVQUFVMEUsU0FBUyxVQUN6QzhRLEVBQW9CMWhCLEtBQUt5UyxzQkFBc0JwSCxPQUFPLFdBQVksSUF3QzFFLENBNkJBLCtCQUFBc1csR0FFSTNoQixLQUFLMFMsUUFBUVksWUFFYixNQUFNZ0osRUFBYzFGLEVBQVMrRCxrQ0FFN0IsR0FBSTJCLEdBQWV2VixFQUFhK0YsTUFDNUIsT0FBTyxFQUNKLEdBQ0h3UCxHQUFldlYsRUFBYXVGLFdBQzVCZ1EsR0FBZXZWLEVBQWF5RixjQUM1QjhQLEdBQWV2VixFQUFhMEYsYUFBYyxDQUUxQyxNQUFNbVYsRUFBY2hMLEVBQVNvQywwQ0FBMEMsYUFFdkUsR0FBSTRJLEdBQWVoTCxFQUFTeUIsZUFBZXVKLEdBQWMsQ0FDckQsTUFBTUMsRUFBUWpMLEVBQVNpQyxvQkFBb0IrSSxHQUMzQyxHQUFJQyxFQUFPLENBQ1AsTUFBTUMsRUFBaUJGLEVBQVk3ZCxjQUFjLGNBQzNDZ2UsRUFBZUYsRUFBTTlkLGNBQWMsY0FDekM2UyxFQUFTMEMsMkJBQTJCd0ksRUFBZ0JDLEVBQ3hELENBQ0osTUFBTyxHQUFJSCxFQUFhLENBRXBCLE1BQU1JLEVBQWNKLEVBQVkxTixRQUFRLFVBRXhDLEdBQUk4TixFQUFhLENBQ2IsTUFBTUMsRUFBVUQsRUFBWUUsaUJBQWlCLGNBQWM1aEIsT0FDckQ2aEIsRUFBZXhaLEVBQXNCNEMsaUJBRTNDcUwsRUFBU3FCLFlBQVlrSyxFQUFjSCxHQUVuQ0osRUFBWTFlLFNBQ0csR0FBWCtlLEdBQ0FELEVBQVk5ZSxTQUdoQixNQUFNcWUsRUFBYVksRUFBNkJwZSxjQUFjLEtBQzlENlMsRUFBU3dFLG9DQUFvQ21HLEVBQ2pELENBQ0osQ0FFSixLQUFPLENBQ0gsTUFBTWEsRUFBZXhMLEVBQVNvQywwQ0FBMEMsU0FFeEUsR0FBSW9KLEVBQWMsQ0FDZCxNQUFNQyxFQUFjekwsRUFBU2lDLG9CQUFvQnVKLEdBRWpELEdBQUlDLEVBQWEsQ0FDYixNQUFNUCxFQUFpQk0sRUFBYXJlLGNBQWMsY0FDNUNnZSxFQUFlTSxFQUFZdGUsY0FBYyxjQUMvQzZTLEVBQVMwQywyQkFBMkJ3SSxFQUFnQkMsR0FFL0NuTCxFQUFTeUIsZUFBZWdLLElBQ3pCcmlCLEtBQUt3Z0IsZUFBZXpaLEVBQWEwSSxVQUFXNFMsRUFFcEQsQ0FFQSxNQUFNZCxFQUFhYyxFQUE0QnRlLGNBQWMsY0FFN0Q2UyxFQUFTd0Usb0NBQW9DbUcsRUFDakQsQ0FDSixDQUVBLE9BQU8sQ0FDWCxDQStDQSxrQkFBQVYsQ0FBbUJ5QixHQUNmLE1BQU1DLEVBQVd2aUIsS0FBS3lTLHNCQUFzQnBILE9BQU8xQyxFQUFzQndCLGNBQWNyQixnQkFBaUIsSUFFcEd3WixHQUFrQkEsRUFBZXBPLFFBQVEsVUFDekJvTyxFQUFlcE8sUUFBUSxVQUMvQnVDLHNCQUFzQixXQUFZOEwsR0FFMUN6ZSxTQUFTQyxjQUFjLDRCQUE2QlEsWUFBWWdlLEdBR2xEQSxFQUFTeGUsY0FBYyw2QkFDL0JzTixPQUdkLENBR1Esd0JBQUF5UCxHQUVKLE1BQU0wQixFQUF1QjFlLFNBQVNvVixjQUV0Q2xaLEtBQUsrZ0IsZ0JBQWdCeUIsR0FDckJ4aUIsS0FBS3lpQixtREFBbURELEVBQzVELENBRVEsb0JBQUEvQixHQUVKLElBQUkrQixFQUF1QnhpQixLQUFLdWdCLDJCQUE2QjNKLEVBQVNpRSx3QkFFakUySCxJQUlMeGlCLEtBQUtnaEIsWUFBWXdCLEdBQ2pCeGlCLEtBQUt5aUIsbURBQW1ERCxHQUM1RCxDQUVRLGVBQUF6QixDQUFnQjJCLEVBQXdCbFUsRUFBMEIsTUFFdEUsSUFDSW1VLEVBQWlCLEtBRXJCLEdBQVksT0FIRkQsRUFBY3hMLFFBQVEwTCxjQUdkLENBQ2QsSUFBSUMsRUFBa0JILEVBQWNoTSx1QkFFcEMsSUFBS21NLEVBQ0QsT0FHSixHQUFJQSxHQUFtQkEsRUFBZ0IzVyxVQUFVMEUsU0FBUyxhQVF0RCxPQVBBK1IsRUFBaUJFLE9BQ2JyVSxFQUNBeE8sS0FBSzhpQix3QkFBd0JILEVBQWdCblUsR0FFN0NvSSxFQUFTNEUsa0NBQWtDbUgsR0FLdkQsQ0FFQSxHQUF3RSxPQUFuRUQsRUFBY3hkLFdBQTJCZ1MsUUFBUTBMLGNBQXNELENBRXhHLElBQUlDLEVBQWtCSCxFQUFjeE8sUUFBUSxPQUFPd0Msd0JBQXdCM1MsY0FBYyxjQUV6RixHQUFJOGUsR0FBbUJBLEVBQWdCM1csVUFBVTBFLFNBQVMsYUFRdEQsT0FQQStSLEVBQWlCRSxPQUNiclUsRUFDQXhPLEtBQUs4aUIsd0JBQXdCSCxFQUFnQm5VLEdBRTdDb0ksRUFBUzRFLGtDQUFrQ21ILEdBS3ZELENBRUEsSUFBSXJTLEVBQVNvUyxFQUFjeE8sUUFBUSxVQUVuQyxJQUFLNUQsRUFDRCxPQUVKLElBQUl5UyxFQUFVelMsRUFBT29HLHVCQUVyQixLQUFPcU0sR0FBUyxDQUNaLElBQUlDLEVBQXNCRCxFQUFRYixpQkFBaUIsY0FDbkQsR0FBSWMsRUFBb0IxaUIsT0FBUyxFQVE3QixPQVBBcWlCLEVBQWlCSyxFQUFvQkEsRUFBb0IxaUIsT0FBUyxRQUM5RGtPLEVBQ0F4TyxLQUFLOGlCLHdCQUF3QkgsRUFBZ0JuVSxHQUU3Q29JLEVBQVM0RSxrQ0FBa0NtSCxJQU1uREksRUFBVUEsRUFBUXJNLHNCQUN0QixDQUlKLENBRVEsV0FBQXNLLENBQVkwQixFQUF3QmxVLEVBQTBCLE1BQ2xFLElBQ0ltVSxFQUFpQixLQUVyQixHQUFZLE9BSEZELEVBQWN4TCxRQUFRMEwsY0FHZCxDQUNkLElBQUlLLEVBQWNQLEVBQWNsTSxtQkFFaEMsR0FBSXlNLEdBQWVBLEVBQVkvVyxVQUFVMEUsU0FBUyxhQVE5QyxPQVBBK1IsRUFBaUJNLEVBRWJ6VSxFQUNBeE8sS0FBS2tqQiwwQkFBMEJQLEVBQWdCblUsR0FFL0NvSSxFQUFTd0Usb0NBQW9DdUgsR0FFMUNBLENBRWYsQ0FFQSxHQUF3RSxPQUFuRUQsRUFBY3hkLFdBQTJCZ1MsUUFBUTBMLGNBQXNELENBQ3hHLElBQUlLLEVBQWNQLEVBQWN4TyxRQUFRLE9BQU9zQyxvQkFBb0J6UyxjQUFjLGNBRWpGLEdBQUlrZixHQUFlQSxFQUFZL1csVUFBVTBFLFNBQVMsYUFPOUMsT0FOQStSLEVBQWlCTSxFQUNielUsRUFDQXhPLEtBQUtrakIsMEJBQTBCUCxFQUFnQm5VLEdBRS9Db0ksRUFBU3dFLG9DQUFvQ3VILEdBRTFDQSxDQUVmLENBRUEsSUFBSXJTLEVBQVNvUyxFQUFjeE8sUUFBUSxVQUVuQyxJQUFLNUQsRUFDRCxPQUdKLElBQUl5UyxFQUFVelMsRUFBT2tHLG1CQUVyQixLQUFPdU0sR0FBUyxDQUNaLElBQUlDLEVBQXNCRCxFQUFRYixpQkFBaUIsY0FDbkQsR0FBSWMsRUFBb0IxaUIsT0FBUyxFQU83QixPQU5BcWlCLEVBQWlCSyxFQUFvQixHQUNqQ3hVLEVBQ0F4TyxLQUFLa2pCLDBCQUEwQlAsRUFBZ0JuVSxHQUUvQ29JLEVBQVN3RSxvQ0FBb0N1SCxHQUUxQ0EsRUFHWEksRUFBVUEsRUFBUXZNLGtCQUN0QixDQUVBLE9BQU9tTSxDQUNYLENBSUEsa0RBQUFGLENBQW1EdEosR0FFL0MsTUFBTTZJLEVBQWM3SSxFQUFlakYsUUFBUSxVQUNyQ2lQLEVBQVNoSyxFQUFlakYsUUFBUSxjQUV0Q2lQLEdBQVFqZ0IsU0FFSjhlLEdBQW1FLEdBQXBEQSxFQUFZRSxpQkFBaUIsYUFBYTVoQixRQUN6RDBoQixFQUFZOWUsUUFFcEIsQ0FLQSx1QkFBQTRmLENBQXdCdGUsRUFBc0I0ZSxHQUUxQyxNQUFNdE0sRUFBWTlTLE9BQU8rUSxlQUNuQkUsRUFBUW5SLFNBQVMyVCxjQUV2QixJQUFJOEIsRUFBYy9VLEVBQVEyVyxVQUN0QnJaLEVBQVMsS0FFYixLQUFPeVgsR0FBYSxDQUNoQixHQUFJQSxFQUFZekYsV0FBYUQsS0FBS0UsVUFBVyxDQUN6Q2pTLEVBQVM5QixLQUFLcWpCLG1CQUFtQjlKLEVBQWE2SixHQUM5QyxLQUNKLENBSUE3SixHQUpXQSxFQUFZK0osU0FBU1YsY0FJbEJySixFQUFZZ0ssZ0JBQzlCLENBRUl6aEIsR0FBVUEsRUFBTzBoQixhQUNqQnZPLEVBQU02QyxTQUFTaFcsRUFBTzBoQixZQUFhMWhCLEVBQU8yaEIsZUFDMUN4TyxFQUFNeUYsVUFBUyxHQUNmNUQsRUFBVXRCLGtCQUNWc0IsRUFBVXJCLFNBQVNSLEdBQ25CelEsRUFBUTZNLFVBRVI0RCxFQUFNeUMsbUJBQW1CbFQsR0FDekJ5USxFQUFNeUYsVUFBUyxHQUNmNUQsRUFBVXRCLGtCQUNWc0IsRUFBVXJCLFNBQVNSLEdBQ25CelEsRUFBUTZNLFFBRWhCLENBRUEseUJBQUE2UixDQUEwQjFlLEVBQXNCNGUsR0FDNUMsTUFBTXRNLEVBQVk5UyxPQUFPK1EsZUFDbkJFLEVBQVFuUixTQUFTMlQsY0FFdkIsSUFBSThCLEVBQWMvVSxFQUFRZSxXQUN0QnpELEVBQVMsS0FFYixLQUFPeVgsR0FBYSxDQUNoQixHQUFJQSxFQUFZekYsV0FBYUQsS0FBS0UsVUFBVyxDQUN6Q2pTLEVBQVM5QixLQUFLcWpCLG1CQUFtQjlKLEVBQWE2SixHQUM5QyxLQUNKLENBQ0E3SixFQUFjQSxFQUFZbkIsV0FDOUIsQ0FFSXRXLEdBQVVBLEVBQU8waEIsYUFDakJ2TyxFQUFNNkMsU0FBU2hXLEVBQU8waEIsWUFBYTFoQixFQUFPMmhCLGVBQzFDeE8sRUFBTXlGLFVBQVMsR0FDZjVELEVBQVV0QixrQkFDVnNCLEVBQVVyQixTQUFTUixHQUNuQnpRLEVBQVE2TSxVQUVSNEQsRUFBTXlDLG1CQUFtQmxULEdBQ3pCeVEsRUFBTXlGLFVBQVMsR0FDZjVELEVBQVV0QixrQkFDVnNCLEVBQVVyQixTQUFTUixHQUNuQnpRLEVBQVE2TSxRQUVoQixDQUVBLGtCQUFBZ1MsQ0FBbUJ0TSxFQUFZcU0sR0FDM0IsSUFBSW5PLEVBQVFuUixTQUFTMlQsY0FDakIrTCxFQUFjek0sRUFDZDBNLEVBQWdCLEVBQ2hCQyxFQUFjQyxJQUVsQixJQUFLLElBQUluakIsRUFBSSxFQUFHQSxFQUFJdVcsRUFBSy9LLFlBQWExTCxPQUFRRSxJQUFLLENBQy9DeVUsRUFBTTZDLFNBQVNmLEVBQU12VyxHQUNyQnlVLEVBQU0wQyxPQUFPWixFQUFNdlcsRUFBSSxHQUN2QixNQUFNb2pCLEVBQU8zTyxFQUFNbEQsd0JBQ2I4UixFQUFXQyxLQUFLQyxJQUFJSCxFQUFLMVIsS0FBT2tSLEdBQ2hDWSxFQUFZRixLQUFLQyxJQUFJSCxFQUFLbFYsTUFBUTBVLElBRXBDUyxFQUFXSCxHQUFlTSxFQUFZTixLQUN0Q0EsRUFBY0ksS0FBS0csSUFBSUosRUFBVUcsR0FDakNQLEVBQWdCampCLEdBQUt3akIsRUFBWUgsRUFBVyxFQUFJLEdBRXhELENBTUEsT0FKSVQsRUFBWW5PLEVBQU1sRCx3QkFBd0JyRCxRQUMxQytVLEVBQWdCMU0sRUFBSy9LLFlBQWExTCxRQUcvQixDQUFFa2pCLGNBQWFDLGdCQUMxQixDQWlEQSwyQkFBQVMsR0FDSSxNQUFNcE4sRUFBWTlTLE9BQU8rUSxlQUN6QixJQUFLK0IsR0FBc0MsSUFBekJBLEVBQVU5QixXQUFrQixPQUFPLEtBR3JELElBQUlyQixFQURVbUQsRUFBVTVCLFdBQVcsR0FDQW1FLHdCQVFuQyxPQU5JMUYsRUFBVUcsV0FBYUQsS0FBS0UsWUFDNUJKLEVBQVlBLEVBQVV6TyxZQUdEeU8sRUFBMEJPLFFBQVEsYUFHL0QsQ0FFQSx1QkFBQXFNLEdBQ0ksTUFBTXpKLEVBQVk5UyxPQUFPK1EsZUFDekIsSUFBSytCLEdBQXNDLElBQXpCQSxFQUFVOUIsV0FBa0IsT0FBTyxLQUdyRCxJQUFJckIsRUFEVW1ELEVBQVU1QixXQUFXLEdBQ0FtRSx3QkFRbkMsT0FOSTFGLEVBQVVHLFdBQWFELEtBQUtFLFlBQzVCSixFQUFZQSxFQUFVek8sWUFHRHlPLEVBQTBCTyxRQUFRLFNBRy9ELENBR0Esc0JBQUEwTSxHQUVJLElBQUlwYyxFQUFVeEUsS0FBS3VnQiwyQkFBNkIzSixFQUFTaUUsd0JBRXpELElBQUtyVyxJQUFZQSxFQUFRVSxXQUVyQixPQURBbUssUUFBUStFLE1BQU0sdURBQ1AsS0FHWCxNQUFNeU4sRUFBUXJkLEVBQVF1VSxXQUFVLEdBRTFCa0ssRUFBY3plLEVBQVE0VCxZQUk1QixPQUZBNVQsRUFBUVUsV0FBV3lSLGFBQWFrTCxFQUFPb0IsR0FFaENwQixDQUNYLEVDdmtDRyxNQUFNc0MsVUFBdUJqVSxFQUVmK0MsdUJBQ0E5RSxLQUVqQixXQUFBb0MsQ0FBWTBDLEVBQWlEOUUsR0FFekRpRixNQUFNLENBQ0ZqRixLQUFNQSxJQUdWbk8sS0FBS2lULHVCQUF5QkEsRUFDOUJqVCxLQUFLbU8sS0FBT0EsRUFDWm5PLEtBQUtxVCxjQUNULENBRUEsSUFBQTdDLEdBRUksTUFBTUgsRUFBY3ZNLFNBQVNXLGNBQWMsVUFPM0MsT0FOQTRMLEVBQVlzQyxNQUFRLGtCQUVwQnRDLEVBQVluRSxVQUFVQyxJQUFJLFlBQWEsbUJBRXZDa0UsRUFBWTlMLFlBQVl2RSxLQUFLb1EsTUFBTWpDLEtBQUtrQyxhQUVqQ0EsQ0FDWCxDQUVBLFlBQUFnRCxHQUVJclQsS0FBS3FRLFlBQVlqQixpQkFBaUIsU0FBUyxLQUN2Q3BQLEtBQUtpVCx1QkFBdUJzTSxZQUFZaEIsRUFBdUJrQixpQkFBaUJmLHNCQUFzQixFQUFNLEdBRXBILENBRUEsYUFBT3JULENBQU84QyxHQUVWLE1BQU04RSxFQUF5QmQsRUFBb0JFLFNBQVNFLFFBQWlDLDJCQUU3RixPQUFPLElBQUk0UixFQUFlbFIsRUFBd0I5RSxFQUN0RCxFQzNDRyxNQUFNaVcsVUFBd0JsVSxFQUVoQkgsT0FFakIsWUFBb0JBLEdBRWhCcUQsTUFBTSxDQUNGckQsT0FBUUEsSUFHWi9QLEtBQUsrUCxPQUFTQSxDQUNsQixDQUVBLElBQUFTLEdBRUksTUFBTUgsRUFBY3ZNLFNBQVNXLGNBQWMsT0FNM0MsT0FKQTRMLEVBQVluRSxVQUFVQyxJQUFJLHFCQUUxQmtFLEVBQVk5TCxZQUFZdkUsS0FBS29RLE1BQU1MLE9BQU9NLGFBRW5DQSxDQUNYLENBRUEsYUFBT2hGLENBQU8wRSxHQUNWLE9BQU8sSUFBSXFVLEVBQWdCclUsRUFDL0IsRUM3QkcsTUFBTXNVLEVBRVR4YixjQUF3QixPQUN4QkEsYUFBdUIsVUNEcEIsTUFBTXliLFVBQWdCcFUsRUFFekJxVSxXQUVBLFdBQUFoVSxDQUFZTixFQUFnQnVVLEdBRXhCcFIsTUFBTSxDQUNGbkQsT0FBUUEsRUFDUnVVLEtBQU1BLElBR1Z4a0IsS0FBS3VrQixXQUFhdmtCLEtBQUtxUSxZQUFZdE0sY0FBYyxNQUNyRCxDQUVBLElBQUF5TSxHQUVJLE1BQU1ILEVBQWN2TSxTQUFTMmdCLGdCQUFnQiw2QkFBOEIsT0FHM0VwVSxFQUFZMU0sTUFBTW9LLE1BQVEsaUJBRTFCLElBQUkyVyxFQUFNNWdCLFNBQVMyZ0IsZ0JBQWdCLDZCQUE4QixPQVVqRSxPQVRBQyxFQUFJQyxlQUFlLCtCQUFnQyxPQUFRLElBQUkza0IsS0FBS29RLE1BQU1ILFVBRTFFeVUsRUFBSS9nQixNQUFNb0ssTUFBUSxpQkFFbEJzQyxFQUFZOUwsWUFBWW1nQixHQUN4QnJVLEVBQVl2TCxhQUFhLFFBQVM5RSxLQUFLb1EsTUFBTW9VLE1BQzdDblUsRUFBWXZMLGFBQWEsU0FBVTlFLEtBQUtvUSxNQUFNb1UsTUFDOUNuVSxFQUFZdkwsYUFBYSxPQUFRLGdCQUUxQnVMLENBQ1gsQ0FFQSxLQUFBd1IsR0FDSSxPQUFPLElBQUl5QyxFQUFRdGtCLEtBQUtvUSxNQUFNSCxPQUFRalEsS0FBS29RLE1BQU13VSxNQUNyRCxDQUVBLFFBQUFDLENBQVN6VCxHQUNMcFIsS0FBS3VrQixXQUFXSSxlQUFlLCtCQUFnQyxPQUFRLElBQUl2VCxJQUMvRSxDQUVBLGFBQU8vRixDQUFPNEUsRUFBZ0J1VSxHQUMxQixPQUFPLElBQUlGLEVBQVFyVSxFQUFRdVUsRUFDL0IsRUN2Q0csTUFBTU0sRUFHVCxZQUFPQyxHQUNILE9BQU9YLEVBQWdCL1ksT0FBTzhZLEVBQWU5WSxPQUFPaVosRUFBUWpaLE9BQU9yRSxFQUFNZ2UsS0FBTVgsRUFBTVksU0FDekYsRUNSRyxNQUFNQyxVQUFxQmhWLEVBRXJCdlEsR0FDVHdsQixlQUNBQyxhQUVBLFdBQUE3VSxDQUFZNVEsRUFBYW9RLEVBQTRCcVYsR0FFakRoUyxNQUFNLENBQ0Z6VCxHQUFJQSxJQUVSSyxLQUFLTCxHQUFLQSxFQUNWSyxLQUFLbWxCLGVBQWlCcFYsRUFDdEIvUCxLQUFLb2xCLGFBQWVBLEVBR3BCclYsRUFBT1UsU0FBU3pRLE1BQ2hCb2xCLEVBQWEzVSxTQUFTelEsS0FDMUIsQ0FFQSxJQUFBd1EsR0FFSSxNQUFNSCxFQUFjdk0sU0FBU1csY0FBYyxPQUkzQyxPQUhBNEwsRUFBWTFRLEdBQUtLLEtBQUtvUSxNQUFNelEsR0FDNUIwUSxFQUFZbkUsVUFBVUMsSUFBSSxrQkFFbkJrRSxDQUNYLENBR0EsV0FBSXJDLEdBQ0EsTUFBTyxPQUNYLEVDbENHLE1BQWVxWCxFQUVsQmxoQixLQUF3QixLQUN4Qm1oQixLQUF3QixLQUV4QmhsQixPQUFpQixFQUlqQixRQUFBaWxCLEdBQ0ksT0FBT3ZsQixLQUFLbUUsSUFDaEIsQ0FFQSxPQUFBcWhCLEdBQ0ksT0FBT3hsQixLQUFLc2xCLElBQ2hCLENBRUEsRUFBRUcsT0FBT0MsWUFDTCxJQUFJQyxFQUFVM2xCLEtBQUttRSxLQUNuQixHQUFLd2hCLEVBQ0wsU0FDVUEsRUFDTkEsRUFBVUEsRUFBUXBMLGVBQ2JvTCxHQUFXQSxJQUFZM2xCLEtBQUttRSxLQUN6QyxDQUVBLE9BQUFnSixDQUFReVksR0FDSixJQUFJdmlCLEVBQVEsRUFDWixJQUFLLElBQUkwVCxLQUFRL1csS0FDYjRsQixFQUFTN08sRUFBSzNGLE1BQU8vTixFQUFPckQsTUFDNUJxRCxHQUVSLENBRUEsR0FBQXdpQixDQUFJQyxHQUNBLElBQUlILEVBQVUzbEIsS0FBS21FLEtBQ25CLEtBQU93aEIsR0FBUyxDQUNaLEdBQUlHLEVBQVVILEVBQVF2VSxPQUNsQixPQUFPLEVBR1gsR0FEQXVVLEVBQVVBLEVBQVFwTCxTQUNkb0wsSUFBWTNsQixLQUFLbUUsS0FBTSxLQUMvQixDQUNBLE9BQU8sQ0FDWCxDQUVBLFNBQUE0aEIsQ0FBVUQsR0FDTixJQUFLOWxCLEtBQUttRSxLQUFNLE9BQU8sS0FFdkIsSUFBSXdoQixFQUEyQjNsQixLQUFLbUUsS0FDcEMsRUFBRyxDQUNDLEdBQUkyaEIsRUFBVUgsRUFBUXZVLE9BQ2xCLE9BQU91VSxFQUVYQSxFQUFVQSxFQUFRcEwsUUFDdEIsT0FBU29MLEdBQVdBLElBQVkzbEIsS0FBS21FLE1BRXJDLE9BQU8sSUFDWCxDQUVBLFFBQUE2aEIsQ0FBU0YsR0FDTCxJQUFLOWxCLEtBQUtzbEIsS0FBTSxPQUFPLEtBRXZCLElBQUlLLEVBQTJCM2xCLEtBQUtzbEIsS0FFcEMsRUFBRyxDQUNDLEdBQUlRLEVBQVVILEVBQVF2VSxPQUNsQixPQUFPdVUsRUFFWEEsRUFBVUEsRUFBUU0sWUFDdEIsT0FBU04sR0FBV0EsSUFBWTNsQixLQUFLc2xCLE1BRXJDLE9BQU8sSUFDWCxDQUVBLElBQUFZLENBQUsxaEIsR0FFRCxJQUFJbWhCLEVBQTJCM2xCLEtBQUttRSxLQUVwQyxLQUFPd2hCLEdBQVMsQ0FDWixHQUFJQSxFQUFRdlUsT0FBUzVNLEVBQ2pCLE9BQU9taEIsRUFJWCxHQURBQSxFQUFVQSxFQUFRcEwsU0FDZG9MLElBQVkzbEIsS0FBS21FLEtBQU0sS0FDL0IsQ0FFQSxPQUFPLElBQ1gsRUN6RkcsTUFBTWdpQixFQUVUQyxXQUVBSCxhQUNBMUwsU0FDQW5KLE1BRUEsV0FBQWIsQ0FBWWEsRUFBVWdWLEdBQ2xCcG1CLEtBQUtpbUIsYUFBZSxLQUNwQmptQixLQUFLdWEsU0FBVyxLQUNoQnZhLEtBQUtvUixNQUFRQSxFQUNicFIsS0FBS29tQixXQUFhQSxDQUN0QixDQUVBLE9BQUFDLENBQVF0UCxHQUNKL1csS0FBS3VhLFNBQVd4RCxDQUNwQixDQUVBLFdBQUF1UCxDQUFZdlAsR0FDUi9XLEtBQUtpbUIsYUFBZWxQLENBQ3hCLENBRUEsaUJBQUF3UCxDQUFrQlQsR0FDZCxJQUFJSCxFQUFVM2xCLEtBQUt1YSxTQUNuQixNQUFNaU0sRUFBWXhtQixLQUNsQixLQUFPMmxCLEdBQVMsQ0FDWixHQUFJRyxFQUFVSCxFQUFRdlUsT0FDbEIsT0FBT3VVLEVBR1gsR0FEQUEsRUFBVUEsRUFBUXBMLFNBQ2RvTCxJQUFZYSxFQUNaLEtBRVIsQ0FDQSxPQUFPLElBQ1gsQ0FFQSxxQkFBQUMsQ0FBc0JYLEdBQ2xCLElBQUlILEVBQVUzbEIsS0FBS2ltQixhQUNuQixNQUFNTyxFQUFZeG1CLEtBQ2xCLEtBQU8ybEIsR0FBV0EsSUFBWWEsR0FBVyxDQUNyQyxHQUFJVixFQUFVSCxFQUFRdlUsT0FDbEIsT0FBT3VVLEVBR1gsR0FEQUEsRUFBVUEsRUFBUU0sYUFDZE4sSUFBWTNsQixLQUNaLEtBRVIsQ0FDQSxPQUFPLElBQ1gsRUNsREcsTUFBTTBtQixVQUFvQ3JCLEVBRTdDLFdBQUE5VSxHQUNJNkMsT0FDSixDQUVBLE1BQUF1VCxDQUFPbmlCLEdBRUgsTUFBTXVTLEVBQU8sSUFBSW9QLEVBQU0zaEIsRUFBU3hFLE1BRTNCQSxLQUFLbUUsTUFBU25FLEtBQUtzbEIsTUFTcEJ2TyxFQUFLdVAsWUFBWXRtQixLQUFLc2xCLE1BQ3RCdk8sRUFBS3NQLFFBQVFybUIsS0FBS21FLE1BRWxCbkUsS0FBS3NsQixLQUFLZSxRQUFRdFAsR0FDbEIvVyxLQUFLbUUsS0FBS21pQixZQUFZdlAsR0FFdEIvVyxLQUFLc2xCLEtBQU92TyxJQWJaL1csS0FBS21FLEtBQU80UyxFQUNaL1csS0FBS3NsQixLQUFPdk8sRUFFWi9XLEtBQUttRSxLQUFLa2lCLFFBQVFybUIsS0FBS3NsQixNQUN2QnRsQixLQUFLbUUsS0FBS21pQixZQUFZdG1CLEtBQUtzbEIsT0FZL0J0bEIsS0FBS00sUUFDVCxFQ25CRyxNQUFNc21CLFVBQTZCMVcsRUFFckJ2USxHQUNBMGUsUUFDQWpOLE1BQ1J5VixXQUNEQyxTQUNBNWEsVUFFQTZhLG9CQUFzQyxHQUN0Q0Msd0JBQTBDLEdBRWxEQyx1QkFFQSxXQUFBMVcsQ0FDSTVRLEVBQ0FzbkIsRUFDQTVJLEVBQ0FqTixFQUNBMFYsRUFDQW5VLEVBQ0F1VSxFQUEwQixNQUUxQixNQUFNaGIsRUFBWSxDQUFDLFlBQWEsU0FBVSxlQUFnQixtQkFFcERpQyxFQUFPLElBQUltVyxFQUFRLDRCQUE2QkQsRUFBTVksUUFDNUQ5VyxFQUFLa0MsWUFBWTFNLE1BQU1nTixXQUFhLFNBRWhDUyxJQUNBMFYsRUFBU25qQixNQUFNb0ssTUFBUXFELEdBRzNCZ0MsTUFBTSxDQUNGelQsR0FBSUEsRUFDSnVNLFVBQVdBLEVBQ1g0YSxTQUFVQSxFQUNWblUsTUFBT0EsRUFDUHhFLEtBQU1BLEVBQ04rWSxTQUFVQSxJQUlkbG5CLEtBQUtMLEdBQUtBLEVBQ1ZLLEtBQUtrTSxVQUFZQSxFQUNqQmxNLEtBQUs4bUIsU0FBV0EsRUFDaEI5bUIsS0FBS3FlLFFBQVVBLEVBQ2ZyZSxLQUFLb1IsTUFBUUEsRUFDYnBSLEtBQUtpbkIsdUJBQXlCQSxFQUM5QmpuQixLQUFLNm1CLFdBQWExWSxFQUVsQm5PLEtBQUttbkIsYUFDVCxDQU1BLFFBQUFDLENBQVMzSyxHQUNMemMsS0FBS2tNLFVBQVV6TSxLQUFLZ2QsR0FDcEJ6YyxLQUFLcVEsWUFBWW5FLFVBQVVDLElBQUlzUSxFQUNuQyxDQUVBLGFBQUE0SyxDQUErQkMsS0FBK0JDLEdBQzFEdm5CLEtBQUsrbUIsb0JBQW9CdG5CLE1BQUssSUFBTTZuQixLQUFRQyxJQUNoRCxDQUVBLGlCQUFBQyxDQUFtQ0YsS0FBK0JDLEdBQzlEdm5CLEtBQUtnbkIsd0JBQXdCdm5CLE1BQUssSUFBTTZuQixLQUFRQyxJQUNwRCxDQUVBLEtBQUFsVyxHQUNJclIsS0FBS3FRLFlBQVluRSxVQUFVQyxJQUFJLGtCQUMvQm5NLEtBQUsrbUIsb0JBQW9CNVosU0FBUW1hLEdBQVFBLEtBQzdDLENBRUEsV0FBQUcsR0FDSXpuQixLQUFLcVEsWUFBWW5FLFVBQVVoSixPQUFPLGtCQUNsQ2xELEtBQUtnbkIsd0JBQXdCN1osU0FBUW1hLEdBQVFBLEtBQ2pELENBRUEsSUFBQTlXLEdBRUksTUFBTUgsRUFBY3ZNLFNBQVNXLGNBQWMsTUFDM0M0TCxFQUFZMVEsR0FBS0ssS0FBS29RLE1BQU16USxHQUM1QixNQUFNdU0sRUFBWWxNLEtBQUtvUSxNQUFNbEUsVUFDN0JtRSxFQUFZbkUsVUFBVUMsT0FBT0QsR0FDN0JtRSxFQUFZcVgsU0FBVyxFQUV2QnJYLEVBQVkxTSxNQUFNb0ssTUFBUSxVQUUxQixNQUFNNFosRUFBYTdqQixTQUFTVyxjQUFjLE9BQzFDa2pCLEVBQVd6YixVQUFVQyxJQUFJLGVBRXpCd2IsRUFBV3BqQixZQUFZdkUsS0FBS29RLE1BQU0wVyxVQUVsQyxNQUFNMVksRUFBT3RLLFNBQVNXLGNBQWMsUUFRcEMsR0FQQTJKLEVBQUtDLFVBQVlyTyxLQUFLb1EsTUFBTXVDLE1BRTVCZ1YsRUFBV3BqQixZQUFZNkosR0FFdkJpQyxFQUFZOUwsWUFBWW9qQixHQUN4QnRYLEVBQVk5TCxZQUFZdkUsS0FBS29RLE1BQU1qQyxLQUFLa0MsYUFFcENyUSxLQUFLb1EsTUFBTThXLFNBQVUsQ0FDckIsTUFBTVUsRUFBVzlqQixTQUFTVyxjQUFjLFFBQ3hDbWpCLEVBQVN2WixVQUFZck8sS0FBS29RLE1BQU04VyxTQUNoQ1UsRUFBU2prQixNQUFNb0ssTUFBUSx3QkFFdkJzQyxFQUFZOUwsWUFBWXFqQixFQUM1QixDQUVBLE9BQU92WCxDQUNYLENBRUEsZ0JBQUF3WCxHQUVJLE1BQU0xSyxFQUFjLElBQUlDLFlBQWlDblcsRUFBYW1YLGVBQWdCLENBQ2xGZixPQUFRLENBQ0pnQixRQUFTcmUsS0FBS3FlLFFBQ2RqTixNQUFPcFIsS0FBS29SLFNBSXBCdE4sU0FBU3laLGNBQWNKLEVBb0IzQixDQUdBLFdBQUEySyxJQUFlQyxHQUNYL25CLEtBQUtxUSxZQUFZbkUsVUFBVUMsT0FBTzRiLEVBQ3RDLENBRUEsV0FBQVosR0FFSW5uQixLQUFLZ29CLGdCQUdMaG9CLEtBQUtxUSxZQUFZakIsaUJBQWlCLFNBQVV3RSxJQUN4Q0EsRUFBTVksZ0JBQWdCLElBSTFCeFUsS0FBS3FRLFlBQVlqQixpQkFBaUIsYUFBY3dFLElBQzVDQSxFQUFNWSxnQkFBZ0IsSUFHMUJ4VSxLQUFLcVEsWUFBWWpCLGlCQUFpQixhQUFhNlksVUFFM0MsTUFBTWxSLEVBQWlDL1csS0FBS2luQix1QkFBdUJpQixjQUFjaEMsS0FBS2xtQixNQUV0RkEsS0FBS2luQix1QkFBdUJrQixrQkFBa0JwUixFQUFNLElBR3hEL1csS0FBS3FRLFlBQVlqQixpQkFBaUIsU0FBUyxLQUN2Q3BQLEtBQUs2bkIsa0JBQWtCLEdBNkYvQixDQWtEQSxhQUFBRyxHQUNJbGtCLFNBQVNzTCxpQkFBaUJoSSxFQUFldVYscUJBQXNCM2MsS0FBS29vQixnQ0FBZ0NDLEtBQUtyb0IsT0FDekc4RCxTQUFTc0wsaUJBQWlCaEksRUFBZXlWLG1CQUFvQjdjLEtBQUtzb0IsOEJBQThCRCxLQUFLcm9CLE1BQ3pHLENBRUEsK0JBQUFvb0IsQ0FBZ0N4VSxHQUM1QixNQUNNMlUsRUFEYzNVLEVBQ1F5SixPQUU1QixHQUFJcmQsS0FBS2tNLFdBQVdzYyxTQUFTRCxFQUFRM0ssYUFBZSxDQU1oRCxNQUFNNkssRUFBZUYsRUFBUWpMLE9BQ3ZCb0wsRUFBYUQsRUFBWXJYLE1BRTNCcFIsS0FBS29SLE9BQU91WCxlQUFpQkQsRUFBV0MsZUFDWCxRQUF6QkYsRUFBWTdMLFdBQ1o1YyxLQUFLNm1CLFlBQVlyViwyQkFHN0IsQ0FDSixDQUVBLDZCQUFBOFcsQ0FBOEIxVSxHQUMxQixNQUNNMlUsRUFEYzNVLEVBQ1F5SixPQUV4QnJkLEtBQUtrTSxXQUFXc2MsU0FBU0QsRUFBUTNLLGNBTWpDNWQsS0FBSzZtQixZQUFZcFYsMEJBRXpCLEVDdldHLE1BQU1tWCxVQUF5QjFZLEVBRXpCdlEsR0FDRGtwQiwyQkFFUlgsY0FDQVksdUJBRUEsV0FBQXZZLENBQVk1USxHQUVSeVQsTUFBTSxDQUNGelQsR0FBSUEsSUFHUkssS0FBS0wsR0FBS0EsRUFDVkssS0FBS2tvQixjQUFnQixJQUFJeEIsRUFDekIxbUIsS0FBSzhvQix1QkFBeUIsS0FFOUI5b0IsS0FBS3FULGNBQ1QsQ0FFQSxXQUFJckYsR0FDQSxNQUFPLE1BQ1gsQ0FFQSxJQUFBd0MsR0FFSSxNQUFNSCxFQUFnQ3ZNLFNBQVNXLGNBQWMsTUFTN0QsT0FSQTRMLEVBQVkxUSxHQUFLSyxLQUFLb1EsTUFBTXpRLEdBQzVCMFEsRUFBWXZMLGFBQWEsT0FBUSxjQUNqQ3VMLEVBQVkxTSxNQUFNcUssUUFBVSxPQUM1QnFDLEVBQVluRSxVQUFVQyxJQUFJLGtCQUFtQixnQkFBaUIsbUJBQzlEa0UsRUFBWTFNLE1BQU02SyxTQUFXLFdBQzdCNkIsRUFBWTFNLE1BQU1vbEIsVUFBWSxTQUM5QjFZLEVBQVkxTSxNQUFNcWxCLFVBQVksT0FFdkIzWSxDQUNYLENBRUEsTUFBQXNXLENBQU9zQyxHQUVIanBCLEtBQUtrb0IsY0FBY3ZCLE9BQU9zQyxHQUMxQmpwQixLQUFLcVEsWUFBWTlMLFlBQVkwa0IsRUFBYTVZLFlBQzlDLENBRUEsMkJBQUE2WSxDQUE0QkMsR0FDeEJucEIsS0FBSzZvQiwyQkFBNkJNLENBQ3RDLENBRUEsWUFBQTlWLEdBRUl2UCxTQUFTc0wsaUJBQWlCLFdBQVl3RSxJQUU5QjVULEtBQUswUSxXQUFhMVEsS0FBSzhvQix3QkFBd0MsVUFBZGxWLEVBQU14TixLQUN2RHBHLEtBQUs4b0IsdUJBQXVCMVgsTUFBTXlXLGtCQUN0QyxJQUdKL2pCLFNBQVNzTCxpQkFBaUIsU0FBVXdFLElBQzVCNVQsS0FBS29wQixnREFBZ0R4VixJQUNyRDVULEtBQUtnUixNQUNULElBR0psTixTQUFTc0wsaUJBQWlCLFdBQVl3RSxJQUM5QjVULEtBQUtxcEIsbURBQW1EelYsS0FFdkMsYUFBYkEsRUFBTXhOLE1BQ053TixFQUFNWSxpQkFFTnhVLEtBQUtzcEIsd0JBR1EsV0FBYjFWLEVBQU14TixNQUNOd04sRUFBTVksaUJBQ054VSxLQUFLdXBCLDRCQUViLEdBRVIsQ0FFQSxJQUFBeFksR0FFSS9RLEtBQUtxUSxZQUFZMU0sTUFBTXVPLEtBQU8sSUFDOUJsUyxLQUFLcVEsWUFBWTFNLE1BQU0rSyxNQUFRLE9BRTNCMU8sS0FBSzBSLDRCQUNMMVIsS0FBS3FRLFlBQVkxTSxNQUFNdU8sS0FBTyxPQUM5QmxTLEtBQUtxUSxZQUFZMU0sTUFBTStLLE1BQVEsS0FHbkMxTyxLQUFLNm9CLDRCQUE0QlcsU0FBUzNFLFNBQVMsNkJBQ25EelIsTUFBTXJDLE1BRVYsQ0FFQSxJQUFBQyxHQUNJaFIsS0FBSzZvQiw0QkFBNEJXLFNBQVMzRSxTQUFTLCtCQUNuRDdrQixLQUFLOG9CLHdCQUF3QjFYLE1BQU1xVyxjQUNuQ3puQixLQUFLOG9CLHVCQUF5QixLQUM5QjFWLE1BQU1wQyxNQUNWLENBRUEsaUJBQUFtWCxDQUFrQmpvQixHQUVWRixLQUFLOG9CLHdCQUEwQjVvQixJQUkvQkYsS0FBSzhvQix3QkFDTDlvQixLQUFLOG9CLHVCQUF1QjFYLE1BQU1xVyxjQUd0Q3puQixLQUFLOG9CLHVCQUF5QjVvQixFQUM5QkYsS0FBSzhvQix1QkFBdUIxWCxNQUFNQyxRQUN0QyxDQUVRLG9CQUFBaVksR0FFSixJQUFJRyxFQUdBQSxFQURBenBCLEtBQUs4b0IsdUJBQ2E5b0IsS0FBSzhvQix1QkFBdUJ2QyxtQkFBa0JybUIsR0FBUUEsYUFBZ0IwbUIsSUFFdEU1bUIsS0FBS2tvQixjQUFjbkMsV0FBVTdsQixHQUFRQSxhQUFnQjBtQixJQUczRTVtQixLQUFLbW9CLGtCQUFrQnNCLEVBQzNCLENBRUEsd0JBQUFGLEdBRUksSUFBSUcsRUFHQUEsRUFEQTFwQixLQUFLOG9CLHVCQUNpQjlvQixLQUFLOG9CLHVCQUF1QnJDLHVCQUFzQnZtQixHQUFRQSxhQUFnQjBtQixJQUUxRTVtQixLQUFLa29CLGNBQWNuQyxXQUFVN2xCLEdBQVFBLGFBQWdCMG1CLElBRy9FNW1CLEtBQUttb0Isa0JBQWtCdUIsRUFDM0IsQ0FFUSwrQ0FBQU4sQ0FBZ0R4VixHQUNwRCxPQUFPNVQsS0FBS21SLFVBQ0h5QyxFQUFNaFEsT0FBd0JzUSxRQUFRLElBQUlsVSxLQUFLcVEsWUFBWTFRLFFBQzNEaVUsRUFBTWhRLE9BQXdCc1EsUUFBUSxJQUFJbFUsS0FBSzZvQiw0QkFBNEJ4WSxZQUFZMVEsS0FDcEcsQ0FFUSxrREFBQTBwQixDQUFtRHpWLEdBQ3ZELE9BQU81VCxLQUFLbVIsVUFDSHlDLEVBQU1oUSxPQUF3QnNRLFFBQVEsSUFBSWxVLEtBQUtxUSxZQUFZMVEsUUFDM0RpVSxFQUFNaFEsT0FBd0JzUSxRQUFRLElBQUlsVSxLQUFLNm9CLDRCQUE0QnhZLFlBQVkxUSxLQUNwRyxFQzlKRyxNQUFNZ3FCLFVBQWlDelosRUFFMUN2USxHQUVBLFdBQUE0USxDQUFZNVEsR0FDUnlULE1BQU0sQ0FBQ3pULEdBQUlBLElBRVhLLEtBQUtMLEdBQUtBLENBQ2QsQ0FFQSxJQUFBNlEsR0FFSSxNQUFNSCxFQUFjdk0sU0FBU1csY0FBYyxPQU8zQyxPQU5BNEwsRUFBWTFRLEdBQUtLLEtBQUtvUSxNQUFNelEsR0FDNUIwUSxFQUFZMU0sTUFBTXdMLE9BQVMsT0FDM0JrQixFQUFZMU0sTUFBTXVMLE1BQVEsTUFDMUJtQixFQUFZMU0sTUFBTWltQixZQUFjLG9CQUNoQ3ZaLEVBQVkxTSxNQUFNa21CLE9BQVMsV0FFcEJ4WixDQUNYLEVDcEJHLE1BQU15WixXQUFvQjVaLEVBRTdCLFdBQUFLLEdBRUk2QyxNQUFNLENBQUMsRUFDWCxDQUVBLElBQUE1QyxHQUVJLE1BQU1ILEVBQWN2TSxTQUFTVyxjQUFjLE9BSzNDLE9BSkE0TCxFQUFZbkUsVUFBVUMsSUFBSSxRQUluQmtFLENBQ1gsRUNQRyxNQUFNMFosV0FBd0I3WixFQUV6QnZRLEdBQ1MwZSxRQUNBbUIsT0FDQXJSLEtBRWpCLFdBQUFvQyxDQUFZNVEsRUFBWTBlLEVBQWlCMUwsRUFBZXhFLEdBRXBEaUYsTUFBTSxDQUNGelQsR0FBSUEsRUFDSmdULE1BQU9BLEVBQ1B4RSxLQUFNQSxJQUdWbk8sS0FBS0wsR0FBS0EsRUFDVkssS0FBS3FlLFFBQVVBLEVBQ2ZyZSxLQUFLd2YsT0FBU25CLEdBQVdsWCxFQUFTNmlCLFdBQ2xDaHFCLEtBQUttTyxLQUFPQSxFQUNabk8sS0FBS3FULGNBQ1QsQ0FFQSxJQUFBN0MsR0FFSSxNQUFNSCxFQUFjdk0sU0FBU1csY0FBYyxVQVEzQyxPQU5BNEwsRUFBWW5FLFVBQVVDLElBQUksUUFBUyxlQUFnQiw0QkFBNkIsZ0JBQ2hGa0UsRUFBWXNDLE1BQVEzUyxLQUFLb1EsTUFBTXVDLE1BQy9CdEMsRUFBWXFYLFNBQVcsRUFFdkJyWCxFQUFZOUwsWUFBWXZFLEtBQUtvUSxNQUFNakMsS0FBS2tDLGFBRWpDQSxDQUNYLENBRUEsWUFBQWdELEdBRUlyVCxLQUFLcVEsWUFBWWpCLGlCQUFpQixTQUFTNlksVUFDdkNua0IsU0FBU3laLGNBQWMsSUFBSUgsWUFBaUNuVyxFQUFhbVgsZUFBZ0IsQ0FDckZmLE9BQVEsQ0FDSmdCLFFBQVNyZSxLQUFLcWUsUUFDZG1CLE9BQVF4ZixLQUFLd2YsVUFHbEIsSUFlUDFiLFNBQVNzTCxpQkFBaUJoSSxFQUFlc1csb0JBQXFCOUosSUFFMUQsTUFDTTJVLEVBRGMzVSxFQUNReUosT0FFekJyZCxLQUFLTCxJQUFNNG9CLEVBQVFyTCxVQUNsQmxkLEtBQUttTyxLQUFLbUQsWUFBYWlYLEVBQVFqTCxPQUF1QnZQLE1BTzFELEdBRVIsQ0FFQSxhQUFPMUMsQ0FBTzFMLEVBQVkwZSxFQUFpQjFMLEVBQWV4RSxHQUN0RCxPQUFPLElBQUk0YixHQUFnQnBxQixFQUFJMGUsRUFBUzFMLEVBQU94RSxFQUNuRCxFQ3RGRyxNQUFNOGIsV0FBa0IvWixFQUUzQixXQUFBSyxDQUFZeEMsR0FDUnFGLE1BQU0sQ0FDRnJGLE1BQU9BLEdBRWYsQ0FFQSxJQUFBeUMsR0FFSSxNQUFNSCxFQUFjdk0sU0FBU1csY0FBYyxPQVMzQyxPQVBBNEwsRUFBWTFNLE1BQU11TCxNQUFRLFVBQzFCbUIsRUFBWTFNLE1BQU13TCxPQUFTLFVBQzNCa0IsRUFBWTFNLE1BQU11bUIsYUFBZSxNQUNqQzdaLEVBQVkxTSxNQUFNbUssZ0JBQWtCOU4sS0FBS29RLE1BQU1yQyxNQUMvQ3NDLEVBQVkxTSxNQUFNZ0wsT0FBUyxvQkFDM0IwQixFQUFZMU0sTUFBTXdtQixVQUFZLGFBRXZCOVosQ0FDWCxFQ2pCRyxNQUFNK1osV0FBMkJsYSxFQUVwQ2tWLGFBQ0FvRSxRQUVBLFdBQUFqWixDQUFZNVEsRUFBWWdULEVBQTZCeVMsRUFBZ0NpRixHQUE4QixHQUUvRyxNQUFNYixFQUFVLElBQUlsRixFQUFRLDhCQUErQkQsRUFBTVksUUFFakU3UixNQUFNLENBQ0Z6VCxHQUFJQSxFQUNKZ1QsTUFBT0EsRUFDUHlTLGFBQWNBLEVBQ2RvRSxRQUFTYSxFQUFxQmIsRUFBVSxPQUc1Q3hwQixLQUFLb2xCLGFBQWVBLEVBQ3BCcGxCLEtBQUt3cEIsUUFBVUEsRUFDZnhwQixLQUFLcVQsZUFFTCtSLEVBQWE4RCw0QkFBNEJscEIsS0FDN0MsQ0FFQSxJQUFBd1EsR0FFSSxNQUFNSCxFQUFpQ3ZNLFNBQVNXLGNBQWMsVUFTOUQsR0FSQTRMLEVBQVkxUSxHQUFLSyxLQUFLb1EsTUFBTXpRLEdBRTVCMFEsRUFBWWlhLEtBQU8sU0FDbkJqYSxFQUFZbkUsVUFBVUMsSUFBSSxlQUFnQixnQ0FBaUMsNEJBQTZCLGdCQUN4R2tFLEVBQVlxWCxTQUFXLEVBQ3ZCclgsRUFBWTFNLE1BQU02SyxTQUFXLFdBQzdCNkIsRUFBWXZMLGFBQWEsZ0JBQWlCOUUsS0FBS29RLE1BQU1nVixhQUFhL1UsWUFBWTFRLElBRTlDLGlCQUFyQkssS0FBS29RLE1BQU11QyxNQUFvQixDQUN0QyxNQUFNdkUsRUFBT3RLLFNBQVNXLGNBQWMsUUFDcEMySixFQUFLcEMsWUFBY2hNLEtBQUtvUSxNQUFNdUMsTUFDOUJ0QyxFQUFZOUwsWUFBWTZKLEVBQzVCLE1BQ0lpQyxFQUFZOUwsWUFBWXZFLEtBQUtvUSxNQUFNdUMsT0FPdkMsT0FKSTNTLEtBQUtvUSxNQUFNb1osU0FDWG5aLEVBQVk5TCxZQUFZdkUsS0FBS29RLE1BQU1vWixRQUFRblosYUFHeENBLENBQ1gsQ0FFQSxZQUFBZ0QsR0FFSXJULEtBQUtxUSxZQUFZakIsaUJBQWlCLFNBQVMsS0FDbENwUCxLQUFLb2xCLGFBQWExVSxVQUduQjFRLEtBQUtvbEIsYUFBYXBVLE9BRmxCaFIsS0FBS29sQixhQUFhclUsTUFHdEIsR0FHUixDQUdBLFdBQUkvQyxHQUNBLE1BQU8sT0FDWCxFQ2pFRyxNQUFNdWMsV0FBa0NyYSxFQUczQytXLHVCQUVBLFdBQUExVyxDQUFZMFcsRUFBMEN0VSxHQUVsRFMsTUFBTSxDQUNGVCxNQUFPQSxJQUdYM1MsS0FBS2luQix1QkFBeUJBLENBQ2xDLENBQ0EseUJBQUF1RCxHQUVBLENBQ0EsMEJBQUFDLEdBQ0ksT0FBTyxJQUNYLENBRUEsZUFBQUMsR0FFQSxDQUVBLGlCQUFBbEQsQ0FBa0JGLEdBQ2QsTUFBTSxJQUFJaGpCLE1BQU0sMEJBQ3BCLENBRUEsYUFBQStpQixDQUFjQyxHQUNWLE1BQU0sSUFBSWhqQixNQUFNLDBCQUNwQixDQUVBLGdCQUFBdWpCLEdBQ0ksTUFBTSxJQUFJdmpCLE1BQU0sMEJBQ3BCLENBRUEsV0FBQW1qQixHQUNJLE1BQU0sSUFBSW5qQixNQUFNLDBCQUNwQixDQUVBLEtBQUErTSxHQUNJLE1BQU0sSUFBSS9NLE1BQU0sMEJBQ3BCLENBRUEsSUFBQWtNLEdBRUksTUFBTUgsRUFBY3ZNLFNBQVNXLGNBQWMsTUFFckNrTyxFQUFRN08sU0FBU1csY0FBYyxNQUtyQyxPQUpBa08sRUFBTXRFLFVBQVlyTyxLQUFLb1EsTUFBTXVDLE1BRTdCdEMsRUFBWTlMLFlBQVlvTyxHQUVqQnRDLENBQ1gsR3BDMURKLFNBQVloSixHQUNSLG9CQUNBLG9CQUNBLHdCQUNBLDhCQUNBLGdDQUNBLHFDQUNILENBUEQsQ0FBWUEsSUFBQUEsRUFBUyxLcUNlZCxNQUFNc2pCLEdBRUQ5aEIsZ0JBRUE2SixRQUVSa1kscUJBRUEsWUFBb0JsWSxHQUNoQixHQUFJaVksR0FBc0JyWSxTQUN0QixNQUFNLElBQUloTyxNQUFNLDJEQUdwQnRFLEtBQUswUyxRQUFVQSxFQUNmMVMsS0FBS3FULGNBRVQsQ0FHQSxZQUFBQSxHQUVBLENBMEJBLGtCQUFPbkksR0FFSCxNQUFNd0gsRUFBVVAsRUFBb0JFLFNBQVNFLFFBQWtCLFlBTS9ELE9BSkt2UyxLQUFLc1MsV0FDTnRTLEtBQUtzUyxTQUFXLElBQUlxWSxHQUFzQmpZLElBR3ZDMVMsS0FBS3NTLFFBQ2hCLENBUUEsUUFBQXVZLEdBRUk3cUIsS0FBSzBTLFFBQVFZLFlBRVR4UCxTQUFTeWIsWUFBWSxTQUNyQnZDLEVBQWFTLDhCQUE4QnBXLEVBQVV5akIsS0FBTTVqQixFQUFPNmpCLGVBRTFFLENBRUEsVUFBQUMsR0FFSWhyQixLQUFLMFMsUUFBUVksWUFFVHhQLFNBQVN5YixZQUFZLFdBQ3JCdkMsRUFBYVMsOEJBQThCcFcsRUFBVTRqQixPQUFRL2pCLEVBQU82akIsZUFFNUUsQ0FFQSxpQkFBQUcsR0FFSWxyQixLQUFLMFMsUUFBUVksWUFFVHhQLFNBQVN5YixZQUFZLGtCQUNyQnZDLEVBQWFTLDhCQUE4QnBXLEVBQVU4akIsY0FBZWprQixFQUFPNmpCLGVBRW5GLENBRUEsYUFBQUssR0FDSXByQixLQUFLMFMsUUFBUVksWUFFVHhQLFNBQVN5YixZQUFZLGNBQ3JCdkMsRUFBYVMsOEJBQThCcFcsRUFBVWdrQixVQUFXbmtCLEVBQU82akIsZUFFL0UsQ0FFQSxlQUFBTyxDQUFnQmxhLEdBRVpwUixLQUFLMFMsUUFBUVksWUFFYjBKLEVBQWFpQixtQ0FBbUMsZUFFNUNuYSxTQUFTeWIsWUFBWSxlQUFlLEVBQU9uTyxJQUMzQzRMLEVBQWFXLCtCQUErQixjQUFldk0sRUFBTyxPQUUxRSxDQUVBLGFBQUFtYSxDQUFjbmEsR0FFVnBSLEtBQUswUyxRQUFRWSxZQUViMEosRUFBYWlCLG1DQUFtQyxhQUU1Q25hLFNBQVN5YixZQUFZLGFBQWEsRUFBT25PLElBQ3pDNEwsRUFBYVcsK0JBQStCLFlBQWF2TSxFQUFPLE9BRXhFLENBRUEsV0FBQW1PLENBQVlsQixFQUFpQm1OLEVBQWlCcGEsR0FpRDFDLE9BQU8sQ0FDWCxDQUVBLGlCQUFBNlAsQ0FBa0I1QyxFQUFpQmpOLEdBRS9CLE9BQU8sSUFBSXFhLFNBQVEsQ0FBQ2xaLEVBQVNtWixLQUV6QmhRLHVCQUFzQixLQUNkMkMsSUFBWWxYLEVBQVM2aUIsV0FLckIzTCxJQUFZbFgsRUFBU3drQixpQkFFakIzckIsS0FBSzRyQixjQUNMclosR0FBUSxHQUtaOEwsSUFBWWxYLEVBQVMwa0Isa0JBS3JCeE4sSUFBWWxYLEVBQVMya0IsZ0JBS3pCdlosRUFBUXpPLFNBQVNtZCxrQkFBa0I1QyxJQUovQjlMLEVBQVF2UyxLQUFLK3JCLGVBQWUzYSxJQUw1Qm1CLEVBQVF2UyxLQUFLZ3NCLGlCQUFpQjVhLElBYjlCbUIsRUFBUXZTLEtBQUs0ckIsY0F1QlgsR0FDUixHQUVWLENBR0Esa0JBQUFLLENBQW1CNU4sRUFBaUJqTixHQUVoQyxPQUFJaU4sSUFBWWxYLEVBQVM2aUIsV0FDZGhxQixLQUFLNHJCLGNBR1p2TixJQUFZbFgsRUFBU3drQixpQkFFakIzckIsS0FBSzRyQixlQUNHNXJCLEtBQUs0ckIsY0FJakJ2TixJQUFZbFgsRUFBUzBrQixrQkFDZDdyQixLQUFLZ3NCLGlCQUFpQjVhLEdBRzdCaU4sSUFBWWxYLEVBQVMya0IsZ0JBQ2Q5ckIsS0FBSytyQixlQUFlM2EsR0FHeEJ0TixTQUFTbWQsa0JBQWtCNUMsRUFDdEMsQ0FFUSxxQkFBQTZOLEdBQ0osTUFBTXBWLEVBQVk5UyxPQUFPK1EsZUFDekIsSUFBSytCLEdBQXNDLElBQXpCQSxFQUFVOUIsV0FBa0IsT0FFOUMsTUFBTUMsRUFBUTZCLEVBQVU1QixXQUFXLEdBQ25DLElBQUlpWCxFQUE2QmxYLEVBQU1vRSx3QkFFdkMsS0FBTzhTLEdBQTRDLFNBQTNCQSxFQUFjN0ksVUFDbEM2SSxFQUFnQkEsRUFBY2puQixXQUdsQyxHQUFJaW5CLEdBQTRDLFNBQTNCQSxFQUFjN0ksU0FBcUIsQ0FDcEQsTUFBTThJLEVBQWNELEVBQ2RFLEVBQWN2b0IsU0FBUzJULGNBRzdCLEdBRkE0VSxFQUFZM1UsbUJBQW1CMFUsR0FFM0JuWCxFQUFNbFYsYUFBZXNzQixFQUFZdHNCLFdBQVksQ0FDN0MsTUFBTXVRLEVBQXNCOGIsRUFBWWxuQixXQUN4QyxLQUFPb0wsR0FBVThiLEVBQVk3bUIsWUFDekIrSyxFQUFPcUcsYUFBYXlWLEVBQVk3bUIsV0FBWTZtQixHQUVoRDliLEdBQVFuTCxZQUFZaW5CLEVBQ3hCLEtBQU8sQ0FDSCxNQUFNcGdCLEVBQWNpSixFQUFNbFYsV0FDMUIrRCxTQUFTeWIsWUFBWSxjQUFjLEVBQU92VCxFQUM5QyxDQUNBbEksU0FBU2lSLGdCQUFnQlMsaUJBQzdCLEtBQU8sQ0FDSCxNQUFNOFcsR0FBa0IsSUFBSUMsZUFBZ0JDLGtCQUFrQnZYLEVBQU13WCxpQkFDcEUzb0IsU0FBU3liLFlBQVksY0FBYyxFQUFPLFNBQVMrTSxXQUN2RCxDQUNKLENBNkJBLGNBQUFQLENBQWVXLEdBQ1gsTUFBTTVWLEVBQVk5UyxPQUFPK1EsZUFFekIsSUFBSytCLEVBQ0QsT0FBTyxFQUVYLElBQUtBLEVBQVU5QixXQUFZLE9BQU8sRUFFbEMsSUFBSXhRLEVBQXVCc1MsRUFBVTVCLFdBQVcsR0FBR21FLHdCQUUvQzdVLEVBQVFzUCxXQUFhRCxLQUFLRSxZQUMxQnZQLEVBQVVBLEVBQVFVLFlBR3RCLE1BQU15bkIsRUFBYW5vQixFQUF3QjBQLFFBQVEsZUFDbkQsSUFBS3lZLEVBQVcsT0FBTyxFQUV2QixNQUNNQyxFQURRNW9CLE9BQU82TSxpQkFBaUI4YixHQUNmNWUsTUFJdkIsT0FGaUJuRyxFQUFNUyxTQUFTdWtCLEdBRWhCaEssZ0JBQWtCOEosRUFBYzlKLGFBQ3BELENBRVEsV0FBQWdKLEdBQ0osTUFBTTlVLEVBQVk5UyxPQUFPK1EsZUFDekIsSUFBSytCLElBQWNBLEVBQVU5QixXQUFZLE9BQU8sRUFFaEQsSUFBSStCLEVBQW9CRCxFQUFVNUIsV0FBVyxHQUFHbUUsd0JBUWhELElBTEl0QyxFQUFLakQsV0FBYUQsS0FBS0UsWUFDdkJnRCxFQUFPQSxFQUFLN1IsWUFJVDZSLEdBQWlCLE9BQVRBLEdBQWUsQ0FDMUIsR0FBSUEsRUFBS2pELFVBQVlELEtBQUtvRCxjQUFpQkYsRUFBcUI3QyxRQUFRLEtBQ3BFLE9BQU8sRUFFWDZDLEVBQU9BLEVBQUs3UixVQUNoQixDQUVBLE9BQU8sQ0FDWCxDQTBCQSxnQkFBQThtQixDQUFpQlUsR0FFYixNQUFNNVYsRUFBWTlTLE9BQU8rUSxlQUV6QixJQUFLK0IsRUFDRCxPQUFPLEVBRVgsSUFBS0EsRUFBVTlCLFdBQVksT0FBTyxFQUVsQyxJQUFJeFEsRUFBdUJzUyxFQUFVNUIsV0FBVyxHQUFHbUUsd0JBRS9DN1UsRUFBUXNQLFdBQWFELEtBQUtFLFlBQzFCdlAsRUFBVUEsRUFBUVUsWUFHdEIsTUFBTTJuQixFQUNEcm9CLEVBQXdCMFAsUUFBUSxvQ0FDaEMxUCxFQUF3QjBQLFFBQVEsbUNBR3JDLElBQUsyWSxFQUFvQixPQUFPLEVBRWhDLE1BQ01ELEVBRFE1b0IsT0FBTzZNLGlCQUFpQmdjLEdBQ2YvZSxnQkFJdkIsT0FGaUJsRyxFQUFNUyxTQUFTdWtCLEdBRWhCaEssZ0JBQWtCOEosRUFBYzlKLGFBQ3BELENBRVEsb0JBQUFrSyxHQUNKLE1BQU1DLEVBQWNqcEIsU0FBU1csY0FBYyxPQUMzQ1gsU0FBU2twQixLQUFLem9CLFlBQVl3b0IsR0FFMUJBLEVBQVlwcEIsTUFBTW9LLE1BQVEsVUFFMUIsTUFBTWtmLEVBQWdCanBCLE9BQU82TSxpQkFBaUJrYyxHQUFhaGYsTUFJM0QsT0FGQWpLLFNBQVNrcEIsS0FBSzduQixZQUFZNG5CLEdBRW5CbmxCLEVBQU1TLFNBQVM0a0IsRUFDMUIsQ0FFQSxtQkFBQUMsQ0FBb0I3TyxHQUNoQixPQUFRQSxHQUVKLElBQUssU0FDTCxJQUFLLE9BQ0wsSUFBSyxJQUNELE1BQU8sU0FFWCxJQUFLLFNBQ0wsSUFBSyxJQUNMLElBQUssS0FDRCxNQUFPLEtBRVgsSUFBSyxZQUNMLElBQUssSUFDRCxNQUFPLElBRVgsSUFBSyxnQkFDTCxJQUFLLElBQ0QsTUFBTyxJQUVYLElBQUssYUFHTCxJQUFLLFFBQ0QsTUFBTyxPQUVYLFFBQ0ksTUFBTSxJQUFJL1osTUFFdEIsQ0FFQSw2QkFBTzZvQixHQUNILE1BQU1yVyxFQUFZOVMsT0FBTytRLGVBRXpCLEdBQUkrQixHQUFhQSxFQUFVOUIsV0FBYSxFQUFHLENBRXZDLElBQUl4USxFQURVc1MsRUFBVTVCLFdBQVcsR0FDRm1FLHdCQU1qQyxJQUpJN1UsRUFBUXNQLFdBQWFELEtBQUtFLFlBQzFCdlAsRUFBVUEsRUFBUVUsWUFHZlYsS0FBYUEsYUFBbUJrUixjQUNuQ2xSLEVBQVVBLEVBQVFVLFdBR3RCLEdBQUlWLEVBQ0EsT0FBT0EsQ0FFZixDQUVBLE9BQU8sSUFDWCxDQUdBLG9CQUFBNG9CLEdBQ0ksTUFBTXRXLEVBQVk5UyxPQUFPK1EsZUFDekIsSUFBSytCLEdBQXNDLElBQXpCQSxFQUFVOUIsV0FDeEIsTUFBTyxHQUdYLE1BQU1xWSxFQUFvQixHQUUxQixJQUFLLElBQUk3c0IsRUFBSSxFQUFHQSxFQUFJc1csRUFBVTlCLGFBQWN4VSxFQUFHLENBQzNDLE1BQU15VSxFQUFRNkIsRUFBVTVCLFdBQVcxVSxHQUM3QjhzQixFQUFleHBCLFNBQVN5cEIsbUJBQzFCdFksRUFBTW9FLHdCQUNOYSxXQUFXQyxVQUNYLENBQ0lDLFdBQVdyRCxHQUNIOUIsRUFBTThFLGVBQWVoRCxHQUNkbUQsV0FBV0csY0FFZkgsV0FBV3NULGdCQUs5QixJQUFJelcsRUFDSixLQUFRQSxFQUFPdVcsRUFBYS9TLFlBQ3hCLEdBQUl4RCxFQUFLakQsV0FBYUQsS0FBS0UsVUFBVyxDQUNsQyxNQUFNMFosRUFBWTNwQixTQUFTMlQsY0FDM0JnVyxFQUFVL1YsbUJBQW1CWCxJQUd1QyxJQUFoRTlCLEVBQU15WSxzQkFBc0JDLE1BQU1DLGFBQWNILElBQ2UsSUFBL0R4WSxFQUFNeVksc0JBQXNCQyxNQUFNRSxhQUFjSixJQUVoREosRUFBVTV0QixLQUFLc1gsRUFFdkIsQ0FFUixDQUVBLE9BQU9zVyxDQUNYLENBRUEseUJBQUFTLENBQTBCdHBCLEVBQXNCWixHQUs1QyxJQUpJWSxHQUFXQSxFQUFRc1AsV0FBYUQsS0FBS0UsWUFDckN2UCxFQUFVQSxFQUFRc00sZUFHZnRNLEdBQVdBLElBQVlWLFNBQVNrcEIsTUFBTSxDQUN6QyxHQUFJeG9CLEVBQVFzUCxXQUFhRCxLQUFLb0QsYUFBYyxDQUN4QyxNQUFNOFcsRUFBT3ZwQixFQUNiLEdBQUl1cEIsRUFBSzdXLFFBQVF5UixnQkFBa0Iva0IsRUFBT2tRLFNBQVM2VSxpQkFDMUMva0IsRUFBT29xQixTQUFXcHFCLEVBQU9vcUIsUUFBUUMsT0FBTUMsR0FBT0gsRUFBSzdoQixVQUFVMEUsU0FBU3NkLE1BQ3ZFLE9BQU9ILENBR25CLENBQ0F2cEIsRUFBVUEsRUFBUXNNLGFBQ3RCLENBQ0EsT0FBTyxJQUNYLENBRUEsbUJBQUFxZCxDQUFvQi9ZLEdBQ2hCLE1BQU0wQixFQUFZOVMsT0FBTytRLGVBRXpCLElBQUsrQixHQUFzQyxJQUF6QkEsRUFBVTlCLFdBQ3hCLE1BQU8sR0FHWCxNQUFNQyxFQUFRNkIsRUFBVTVCLFdBQVcsR0FFbkMsR0FBSUUsRUFBU3RCLFdBQWFELEtBQUtFLFVBQzNCLE1BQU8sR0FHWCxNQUFNL0gsRUFBY29KLEVBQVNwSixhQUFlLEdBRTVDLElBQUlvaUIsRUFBUSxFQUNSQyxFQUFNcmlCLEVBQVkxTCxPQUV0QixPQUFLMlUsRUFBTThFLGVBQWUzRSxJQUl0QkgsRUFBTTJDLGlCQUFtQnhDLEVBQ3pCZ1osRUFBUW5aLEVBQU00QyxZQUNQNUMsRUFBTTJDLGVBQWVoSCxTQUFTd0UsS0FDckNnWixFQUFRLEdBR1JuWixFQUFNOEMsZUFBaUIzQyxFQUN2QmlaLEVBQU1wWixFQUFNK0MsVUFDTC9DLEVBQU04QyxhQUFhbkgsU0FBU3dFLEtBQ25DaVosRUFBTXJpQixFQUFZMUwsUUFHbEI4dEIsRUFBUUMsRUFDRHJpQixFQUFZZ1EsVUFBVW9TLEVBQU9DLEdBR2pDLElBbkJJLEVBb0JmLEVDNWpCRyxNQUFNQyxXQUFxQnBlLEVBRTlCcWUsY0FFQSxXQUFBaGUsR0FFSTZDLE1BQU0sQ0FBQyxHQUNQcFQsS0FBS21uQixhQUNULENBRUEsSUFBQTNXLEdBRUksTUFBTUgsRUFBY3ZNLFNBQVNXLGNBQWMsU0FRM0MsT0FOQTRMLEVBQVkxUSxHQUFLLGVBQ2pCMFEsRUFBWWxGLEtBQU8sTUFDbkJrRixFQUFZbWUsWUFBYywwQkFFMUJuZSxFQUFZMU0sTUFBTTZLLFNBQVcsV0FFdEI2QixDQUNYLENBRUEsZ0JBQUFvZSxDQUFpQkYsR0FDYnZ1QixLQUFLdXVCLGNBQWdCQSxDQUN6QixDQUVBLFdBQUFwSCxHQUVJcmpCLFNBQVNzTCxpQkFBaUIsV0FBWXdFLElBRWxDLEdBQWlCLFNBQWJBLEVBQU14TixLQUFrQnBHLEtBQUswUSxVQUFXLENBRXhDa0QsRUFBTVksaUJBQ05aLEVBQU04YSxrQkFFTixNQUFNQyxFQUFPM3VCLEtBQUtxUSxZQUFpQ2UsTUFFbkQ2RSxZQUFXLEtBQ1AwVSxHQUFzQnpmLGNBQWNxVSxZQUFZcFksRUFBUzZpQixZQUFZLEVBQU8yRSxFQUFJLEdBQ2pGLElBRUYzdUIsS0FBS3FRLFlBQWlDZSxNQUFRLEdBRS9DcFIsS0FBS3V1QixlQUFldmQsTUFDeEIsQ0FFaUIsVUFBYjRDLEVBQU14TixLQUFtQnBHLEtBQUswUSxZQUM3QjFRLEtBQUtxUSxZQUFpQ2UsTUFBUSxHQUMvQ3BSLEtBQUt1dUIsZUFBZXZkLE9BQ3hCLElBSUpsTixTQUFTc0wsaUJBQWlCLFNBQVV3RSxLQUM1QjVULEtBQUttUixTQUFheUMsRUFBTWhRLE9BQXdCc1EsUUFBUSxJQUFJbFUsS0FBS3FRLFlBQVkxUSxPQUFXaVUsRUFBTWhRLE9BQXdCc1EsUUFBUSx5QkFDOUhsVSxLQUFLdXVCLGVBQWV2ZCxNQUN4QixJQUdKaFIsS0FBS3FRLFlBQVlqQixpQkFBaUIsV0FBWXdFLElBQ3pCLEtBQWJBLEVBQU14TixLQUNOd04sRUFBTThhLGlCQUNWLEdBRVIsRUNsRUcsTUFBTUUsV0FBNEIxZSxFQUVyQzJlLGFBQ0E1WixNQUNBNlosV0FBK0IsR0FFL0IsV0FBQXZlLEdBQ0ksTUFBTXNlLEVBQWUsSUFBSVAsR0FFekJsYixNQUFNLENBQ0Z5YixhQUFjQSxJQUdsQjd1QixLQUFLNnVCLGFBQWVBLEVBQ3BCN3VCLEtBQUttbkIsY0FDTDBILEVBQWFKLGlCQUFpQnp1QixLQUVsQyxDQUVBLElBQUF3USxHQUNJLE1BQU1ILEVBQWN2TSxTQUFTVyxjQUFjLE9BUzNDLE9BUEE0TCxFQUFZMVEsR0FBSyxVQUNqQjBRLEVBQVkxTSxNQUFNcUssUUFBVSxPQUM1QnFDLEVBQVluRSxVQUFVQyxJQUFJLGlCQUMxQmtFLEVBQVkxTSxNQUFNNkssU0FBVyxXQUU3QjZCLEVBQVk5TCxZQUFZdkUsS0FBS29RLE1BQU15ZSxhQUFheGUsYUFFekNBLENBQ1gsQ0FFQSxXQUFBOFcsR0FFSXJqQixTQUFTc0wsaUJBQWlCLDZCQUE2QixLQUVuRHBQLEtBQUsrUSxPQUNML1EsS0FBSyt1Qix3QkFDTC91QixLQUFLNnVCLGFBQWF4ZCxPQUFPLEdBRWpDLENBR0EsSUFBQUwsR0FFSW9DLE1BQU1wQyxPQUNOaFIsS0FBS2d2QixtQkFFTC9ZLFlBQVcsS0FFUCxNQUFNZ1osRUFBMkIsSUFBSTdSLFlBQVksMkJBQTRCLENBQ3pFNEMsU0FBUyxFQUNUQyxZQUFZLElBR2hCbmMsU0FBU3laLGNBQWMwUixFQUF5QixHQUNqRCxFQUNQLENBRUEscUJBQUFGLEdBQ0ksTUFBTWpZLEVBQVk5UyxPQUFPK1EsZUFDekIsSUFBSytCLEdBQVc5QixXQUFZLE9BRTVCLE1BQ01rYSxFQURRcFksRUFBVTVCLFdBQVcsR0FDZmlhLGlCQUVwQixJQUFLLElBQUkzdUIsRUFBSSxFQUFHQSxFQUFJMHVCLEVBQU01dUIsT0FBUUUsSUFBSyxDQUNuQyxNQUFNb2pCLEVBQU9zTCxFQUFNMXVCLEdBQ2I0dUIsRUFBWXRyQixTQUFTVyxjQUFjLE9BQ3pDMnFCLEVBQVV6ckIsTUFBTTZLLFNBQVcsV0FDM0I0Z0IsRUFBVXpyQixNQUFNdU8sS0FBTyxHQUFHMFIsRUFBSzFSLFNBQy9Ca2QsRUFBVXpyQixNQUFNOEssSUFBTSxHQUFHbVYsRUFBS25WLFFBQzlCMmdCLEVBQVV6ckIsTUFBTXVMLE1BQVEsR0FBRzBVLEVBQUsxVSxVQUNoQ2tnQixFQUFVenJCLE1BQU13TCxPQUFTLEdBQUd5VSxFQUFLelUsV0FDakNpZ0IsRUFBVXpyQixNQUFNbUssZ0JBQWtCLFVBQ2xDc2hCLEVBQVV6ckIsTUFBTXVTLFFBQVUsTUFDMUJwUyxTQUFTa3BCLEtBQUt6b0IsWUFBWTZxQixHQUUxQnB2QixLQUFLOHVCLFdBQVdydkIsS0FBSzJ2QixFQUN6QixDQUVBdFksRUFBVXRCLGlCQUNkLENBRUEsZ0JBQUF3WixHQUNJaHZCLEtBQUs4dUIsV0FBVzNoQixTQUFRaWlCLElBQ3BCdHJCLFNBQVNrcEIsS0FBSzduQixZQUFZaXFCLEVBQVUsSUFFeENwdkIsS0FBSzh1QixXQUFhLEVBQ3RCLEVDdEZHLE1BQWVPLFdBQXdCbmYsRUFFMUNvZixVQUNBQyxXQUNBQyxzQkFDQUMsb0JBQ0FDLHNDQUVBLFdBQUFuZixDQUFZNVEsR0FFUixNQUFNOHZCLEVBQXNCLElBQUliLEdBRWhDeGIsTUFBTSxDQUNGelQsR0FBSUEsRUFDSjh2QixvQkFBcUJBLElBR3pCenZCLEtBQUt5dkIsb0JBQXNCQSxFQUMzQnp2QixLQUFLc3ZCLFVBQVksR0FDakJ0dkIsS0FBS3V2QixXQUFhLEdBQ2xCdnZCLEtBQUt3dkIsc0JBQXdCLEtBQzdCeHZCLEtBQUswdkIsc0NBQXdDLElBQ2pELENBRUEsSUFBQWxmLEdBRUksTUFBTUgsRUFBY3ZNLFNBQVNXLGNBQWMsT0FFM0M0TCxFQUFZMVEsR0FBS0ssS0FBS29RLE1BQU16USxHQUM1QjBRLEVBQVkxTSxNQUFNcUssUUFBVSxPQUM1QnFDLEVBQVluRSxVQUFVQyxJQUFJLG1CQUFvQixpQkFBa0IsbUJBRWhFLE1BQU13akIsRUFBZ0I3ckIsU0FBU1csY0FBYyxPQUU3QzRMLEVBQVk5TCxZQUFZb3JCLEdBRXhCLE1BQU1DLEVBQVM5ckIsU0FBU3lQLGVBQWUsa0JBSXZDLE9BRkFxYyxHQUFRcnJCLFlBQVl2RSxLQUFLb1EsTUFBTXFmLG9CQUFvQnBmLGFBRTVDQSxDQUNYLENBRUEsV0FBSXJDLEdBQ0EsTUFBTyxNQUNYLENBOENBLElBQUFnRCxHQUNRaFIsS0FBS21SLFVBQ0RuUixLQUFLNnZCLHNCQUNMN3ZCLEtBQUs4dkIseUJBR1Q5dkIsS0FBS3d2QixzQkFBd0IsS0FDN0JwYyxNQUFNcEMsT0FFZCxDQUVBLGNBQUErZSxDQUFlQyxHQUNYaHdCLEtBQUtzdkIsVUFBVTd2QixLQUFLdXdCLEdBQ3BCaHdCLEtBQUtxUSxZQUFZOUwsWUFBWXlyQixFQUFTM2YsWUFDMUMsQ0FFQSxpQkFBQTRmLENBQWtCQyxHQUNkbHdCLEtBQUtxUSxZQUFZOUwsWUFBWTJyQixFQUFZN2YsWUFDN0MsQ0FFQSxlQUFBOGYsQ0FBZ0JDLEdBQ1pwd0IsS0FBS3V2QixXQUFXOXZCLEtBQUsyd0IsR0FDckJwd0IsS0FBS3FRLFlBQVk5TCxZQUFZNnJCLEVBQVUvZixZQUMzQyxDQUVBLGlCQUFBZ2dCLENBQWtCdGdCLEdBQ2QvUCxLQUFLcVEsWUFBWTlMLFlBQVl3TCxFQUFPTSxZQUN4QyxDQUVBLGtCQUFBd2YsR0FDSSxJQUFLLE1BQU1HLEtBQVlod0IsS0FBS3N2QixVQUN4QixHQUFJVSxFQUFTNUssYUFBYTFVLFVBQ3RCLE9BQU8sRUFJZixPQUFPLENBQ1gsQ0FFQSxzQkFBQW9mLEdBQ0ksSUFBSyxNQUFNRSxLQUFZaHdCLEtBQUtzdkIsVUFDcEJVLEVBQVM1SyxhQUFhalUsU0FDdEI2ZSxFQUFTNUssYUFBYXBVLE9BSTlCLE9BQU8sQ0FDWCxDQUVBLFlBQUFxQyxHQUdJclQsS0FBS3FRLFlBQVlqQixpQkFBaUIsU0FBVXdFLElBQ3hDQSxFQUFNWSxnQkFBZ0IsSUFJMUJ4VSxLQUFLcVEsWUFBWWpCLGlCQUFpQixhQUFjd0UsSUFDNUNBLEVBQU1ZLGdCQUFnQixJQUkxQjFRLFNBQVNzTCxpQkFBaUIsNkJBQTZCLEtBQ25EcFAsS0FBS21SLFNBQVUsQ0FBSyxJQUd4QnJOLFNBQVNzTCxpQkFBaUIsNEJBQTRCLEtBQ2xEcFAsS0FBS21SLFNBQVUsRUFDZm5SLEtBQUtzd0IsdUJBQXVCLElBcUNoQ3hzQixTQUFTc0wsaUJBQWlCbkksRUFBYTBaLGNBQWMsS0FDakQzZ0IsS0FBS2dSLE1BQU0sSUFHZmxOLFNBQVNzTCxpQkFBaUJuSSxFQUFhc3BCLGtCQUFrQixLQUNyRHZ3QixLQUFLZ1IsTUFBTSxHQUVuQixDQUVBLGdCQUFBd2YsR0FDSSxNQUFNMVosRUFBWWhULFNBQVNpUixlQUMzQixPQUFRK0IsR0FBc0MsSUFBekJBLEVBQVU5QixZQUFvRCxLQUFoQzhCLEVBQVUvVyxXQUFXdVksTUFDNUUsQ0FFQSxxQkFBQWdZLEdBQ0l4c0IsU0FBU2lSLGdCQUFnQlMsa0JBQ3pCMVIsU0FBU2lSLGdCQUFnQlUsU0FBU3pWLEtBQUt3dkIsc0JBQzNDLEd2QzVOSixTQUFZbG9CLEdBQ1Isc0JBQ0EsMEJBQ0EsZ0JBQ0EsNEJBQ0Esc0JBQ0EsMEJBQ0gsQ0FQRCxDQUFZQSxJQUFBQSxFQUFNLEtDS2xCLFNBQVlDLEdBRVIsd0JBRUEsd0JBRUEsb0JBRUEsZ0JBRUEsb0JBRUEsY0FDQSw0QkFDQSxvQ0FDQSxlQUNILENBaEJELENBQVlBLElBQUFBLEVBQWUsS3VDS3BCLE1BQU1rcEIsV0FBbUNwQixHQUVwQ3htQixVQUFvQixzQkFDcEJBLGdCQUNBNm5CLHNCQUNBQyxZQUE4QixLQUV0QyxZQUFvQkQsR0FFaEIsR0FBSUQsR0FBMkJuZSxTQUMzQixNQUFNLElBQUloTyxNQUFNLGlFQUdwQjhPLE1BQU1xZCxHQUEyQjl3QixJQUVqQ0ssS0FBS3FRLFlBQVkxTSxNQUFNaXRCLE9BQVN0cEIsRUFBT3VwQixjQUN2Qzd3QixLQUFLMHdCLHNCQUF3QkEsRUFFN0Ixd0IsS0FBS3FULGNBQ1QsQ0FFQSxrQkFBT25JLEdBRUgsTUFBTXdsQixFQUF3QnZlLEVBQW9CRSxTQUFTRSxRQUFnQywwQkFNM0YsT0FKS2tlLEdBQTJCbmUsV0FDNUJtZSxHQUEyQm5lLFNBQVcsSUFBSW1lLEdBQTJCQyxJQUdsRUQsR0FBMkJuZSxRQUN0QyxDQUVBLDZCQUFBd2UsR0FPSSxNQUFNaGEsRUFBWWhULFNBQVNpUixlQUMzQixJQUFLK0IsR0FBOEMsS0FBakNBLEdBQVcvVyxXQUFXdVksT0FDcEMsT0FHSjBFLEVBQWFpQixtQ0FBbUMsZUFDaERqQixFQUFhaUIsbUNBQW1DLGFBRWhELE1BQU04UyxFQUFrQi93QixLQUFLMHdCLHNCQUFzQnpFLG1CQUFtQixRQUNoRStFLEVBQW9CaHhCLEtBQUswd0Isc0JBQXNCekUsbUJBQW1CLFVBQ2xFZ0YsRUFBdUJqeEIsS0FBSzB3QixzQkFBc0J6RSxtQkFBbUIsYUFDckVpRixFQUEyQmx4QixLQUFLMHdCLHNCQUFzQnpFLG1CQUFtQixpQkFFekVrRixFQUEyQyxDQUFDLEVBQ2xEQSxFQUFhanFCLEVBQU9rcUIsZ0JBQWtCcHhCLEtBQUswd0Isc0JBQXNCMUUsaUJBQWlCOWtCLEVBQU9rcUIsZ0JBQ3pGRCxFQUFhanFCLEVBQU9tcUIsa0JBQW9CcnhCLEtBQUswd0Isc0JBQXNCMUUsaUJBQWlCOWtCLEVBQU9tcUIsa0JBQzNGRixFQUFhanFCLEVBQU9vcUIsaUJBQW1CdHhCLEtBQUswd0Isc0JBQXNCMUUsaUJBQWlCOWtCLEVBQU9vcUIsaUJBQzFGSCxFQUFhanFCLEVBQU9xcUIsbUJBQXFCdnhCLEtBQUswd0Isc0JBQXNCMUUsaUJBQWlCOWtCLEVBQU9xcUIsbUJBQzVGSixFQUFhanFCLEVBQU9zcUIsaUJBQW1CeHhCLEtBQUswd0Isc0JBQXNCMUUsaUJBQWlCOWtCLEVBQU9zcUIsaUJBRTFGLE1BQU1DLEVBQXlDLENBQUMsRUFDaERBLEVBQVd2cUIsRUFBT3dxQixjQUFnQjF4QixLQUFLMHdCLHNCQUFzQjNFLGVBQWU3a0IsRUFBT3dxQixjQUNuRkQsRUFBV3ZxQixFQUFPeXFCLGdCQUFrQjN4QixLQUFLMHdCLHNCQUFzQjNFLGVBQWU3a0IsRUFBT3lxQixnQkFDckZGLEVBQVd2cUIsRUFBTzBxQixlQUFpQjV4QixLQUFLMHdCLHNCQUFzQjNFLGVBQWU3a0IsRUFBTzBxQixlQUNwRkgsRUFBV3ZxQixFQUFPMnFCLGlCQUFtQjd4QixLQUFLMHdCLHNCQUFzQjNFLGVBQWU3a0IsRUFBTzJxQixpQkFDdEZKLEVBQVd2cUIsRUFBTzRxQixlQUFpQjl4QixLQUFLMHdCLHNCQUFzQjNFLGVBQWU3a0IsRUFBTzRxQixlQUdwRnhyQixPQUFPeXJCLFFBQVFaLEdBQWNoa0IsU0FBUSxFQUFFWSxFQUFPaWtCLE1BQ3RDQSxHQUNBaFYsRUFBYVcsK0JBQStCLGNBQWU1UCxFQUFPLE9BQ3RFLElBR0p6SCxPQUFPeXJCLFFBQVFOLEdBQVl0a0IsU0FBUSxFQUFFWSxFQUFPaWtCLE1BQ3BDQSxHQUNBaFYsRUFBYVcsK0JBQStCLFlBQWE1UCxFQUFPLE9BQ3BFLElBR0ovTixLQUFLeWQsOEJBQThCc1QsRUFBUTFwQixFQUFVeWpCLE1BQ3JEOXFCLEtBQUt5ZCw4QkFBOEJ1VCxFQUFVM3BCLEVBQVU0akIsUUFDdkRqckIsS0FBS3lkLDhCQUE4QndULEVBQWE1cEIsRUFBVWdrQixXQUMxRHJyQixLQUFLeWQsOEJBQThCeVQsRUFBaUI3cEIsRUFBVThqQixjQUNsRSxDQUVRLDZCQUFBMU4sQ0FBOEJ1VSxFQUFpQjlVLEdBQy9DOFUsRUFDQWhWLEVBQWFTLDhCQUE4QlAsRUFBVWhXLEVBQU82akIsZ0JBRTVEL04sRUFBYVMsOEJBQThCUCxFQUFVaFcsRUFBTytxQixpQkFFcEUsQ0FFQSxZQUFBNWUsR0FHSXZQLFNBQVNzTCxpQkFBaUI3SCxFQUFnQjJxQixnQkFBaUJseUIsS0FBSzh3Qiw4QkFBOEJ6SSxLQUFLcm9CLE9BOERuRyxJQUFJbXlCLEdBQWMsRUFFbEJueUIsS0FBS3FRLFlBQVlqQixpQkFBaUIsV0FBWXdFLElBQVlBLEVBQU1ZLGdCQUFnQixJQUVoRjFRLFNBQVNzTCxpQkFBaUIsV0FBWXdFLElBQzlCQSxFQUFNd2UsV0FDTkQsR0FBYyxFQUNsQixJQUdKcnVCLFNBQVNzTCxpQkFBaUIsU0FBVXdFLElBQ2QsVUFBZEEsRUFBTXhOLE1BQ04rckIsR0FBYyxFQUNkbnlCLEtBQUtxeUIsU0FBU0YsR0FDbEIsSUFHSnJ1QixTQUFTc0wsaUJBQWlCLGFBQWEsS0FDbkMraUIsR0FBYyxDQUFJLElBR3RCcnVCLFNBQVNzTCxpQkFBaUIsV0FBWXdFLElBQ2xDdWUsR0FBYyxFQUNkbnlCLEtBQUtxeUIsU0FBU0YsRUFBWSxJQUc5QnJ1QixTQUFTc0wsaUJBQWlCN0gsRUFBZ0IycUIsaUJBQWlCLEtBRXZEbHlCLEtBQUtxeUIsU0FBU0YsRUFBWSxJQUk5QnJ1QixTQUFTc0wsaUJBQWlCLFdBQVl3RSxJQUVsQ3FDLFlBQVcsS0FDSGpXLEtBQUttUixTQUEwQixXQUFkeUMsRUFBTXhOLE1BR25CcEcsS0FBSzZ2QixxQkFDTDd2QixLQUFLOHZCLHlCQUVMOXZCLEtBQUtnUixPQUViLEdBQ0QsR0FBRyxJQUdWb0MsTUFBTUMsY0FDVixDQVlBLG9CQUFBaWYsR0FDSSxNQUFNeGIsRUFBWTlTLE9BQU8rUSxlQUN6QixJQUFLK0IsR0FBc0MsSUFBekJBLEVBQVU5QixXQUFrQixPQUFPLEVBRXJELE1BQU11ZCxFQUFjemIsRUFBVTVCLFdBQVcsR0FBR25ELHdCQUM1QyxPQUFLL1IsS0FBSzJ3QixjQUVjN00sS0FBS0MsSUFBSXdPLEVBQVlyZ0IsS0FBT2xTLEtBQUsyd0IsWUFBWXplLE1BQVEsSUFBTTRSLEtBQUtDLElBQUl3TyxFQUFZOWpCLElBQU16TyxLQUFLMndCLFlBQVlsaUIsS0FBTyxHQUUxSSxDQUVBLFFBQUE0akIsQ0FBU0YsR0FRTCxNQUFNSyxFQUFheHlCLEtBQUt5eUIsZUFFbkJELEVBR01BLElBQWVMLElBQ2pCbnlCLEtBQUswUSxVQUVDMVEsS0FBS3N5Qix3QkFDWnR5QixLQUFLMHlCLGlCQUZMMXlCLEtBQUsrUSxTQUpUL1EsS0FBS2dSLE9BQ0xoUixLQUFLMndCLFlBQWMsS0FRM0IsQ0FFQSxZQUFBOEIsR0FDSSxNQUFNM2IsRUFBWTlTLE9BQU8rUSxlQUN6QixTQUFJK0IsR0FBYUEsRUFBVTlCLFdBQWEsR0FFZixLQURBOEIsRUFBVS9XLFdBQVd1WSxPQU9sRCxDQWtCQSwwQ0FBQXFhLEdBRUksTUFBTTdiLEVBQVk5UyxPQUFPK1EsZUFFekIsSUFBSytCLEdBQXNDLElBQXpCQSxFQUFVOUIsV0FFeEIsWUFEQTNGLFFBQVErRSxNQUFNLHNCQUlsQnBVLEtBQUt3dkIsc0JBQXdCMVksRUFBVTVCLFdBQVcsR0FDbEQsTUFBTTBPLEVBQU81akIsS0FBS3d2QixzQkFBc0J6ZCx3QkFFeEMsSUFBSy9SLEtBQUsyd0IsWUFBYSxDQUNuQjN3QixLQUFLMndCLFlBQWMvTSxFQUNuQjVqQixLQUFLcVEsWUFBWTFNLE1BQU1xSyxRQUFVLE9BRWpDLE1BQU00a0IsRUFBZTV5QixLQUFLcVEsWUFBWXdpQixZQUN0QyxJQUFJQyxFQUFlbFAsRUFBSzFSLEtBQU9sTyxPQUFPK3VCLFFBQVUsR0FFNUNELEVBQWVGLEVBQWU1dUIsT0FBT2lPLGFBQ3JDNmdCLEVBQWU5dUIsT0FBT2lPLFdBQWEyZ0IsRUFBZSxJQUd0RCxNQUFNSSxFQUFnQmh6QixLQUFLcVEsWUFBWTRpQixhQUN2QyxJQUFJQyxFQUFjdFAsRUFBS25WLElBQU16SyxPQUFPbXZCLFFBQVVILEVBQWdCLEdBRTFERSxFQUFjLElBQ2RBLEVBQWN0UCxFQUFLd1AsT0FBU3B2QixPQUFPbXZCLFFBQVUsSUFHakRuekIsS0FBS3FRLFlBQVkxTSxNQUFNdU8sS0FBTyxHQUFHNGdCLE1BQ2pDOXlCLEtBQUtxUSxZQUFZMU0sTUFBTThLLElBQU0sR0FBR3lrQixLQUNwQyxDQUNKLENBRUEsSUFBQW5pQixHQUVJLE1BQU0rRixFQUFZOVMsT0FBTytRLGVBRXBCK0IsR0FBc0MsSUFBekJBLEVBQVU5QixXQUt6QjRCLEVBQVNvQywwQ0FBMEMsV0FJdERoWixLQUFLMnlCLDZDQUNMM3lCLEtBQUtxekIsK0JBQ0xqZ0IsTUFBTXJDLFFBVkYxQixRQUFRK0UsTUFBTSxxQkFXdEIsQ0FFQSw0QkFBQWlmLEdBQ0ksTUFBTUMsRUFBUzFjLEVBQVNDLHlCQUV4QjdXLEtBQUtzdkIsVUFBVW5pQixTQUFRNmlCLElBQ0EsZ0JBQWZBLEVBQVNyd0IsS0FFTHF3QixFQUFTM2YsWUFBWTFNLE1BQU1xSyxRQUQzQnNsQixFQUNxQyxPQUVBdHpCLEtBQUtnTyxRQUVsRCxJQUdKaE8sS0FBS3V2QixXQUFXcGlCLFNBQVFpakIsSUFDQSxxQkFBaEJBLEVBQVV6d0IsS0FFTnl3QixFQUFVL2YsWUFBWTFNLE1BQU1xSyxRQUQ1QnNsQixFQUNzQyxPQUVBdHpCLEtBQUtnTyxRQUVuRCxHQUVSLENBRUEsY0FBQTBrQixHQUNJLE1BQU01YixFQUFZOVMsT0FBTytRLGVBQ3pCLEdBQUkrQixHQUFhQSxFQUFVOUIsV0FBYSxFQUFHLENBQ3ZDLE1BQU00TyxFQUFPOU0sRUFBVTVCLFdBQVcsR0FBR25ELHdCQUNyQy9SLEtBQUt1ekIsWUFBWTNQLEVBQ3JCLENBQ0osQ0FFQSxXQUFBMlAsQ0FBWTNQLEdBQ1IsTUFBTWdQLEVBQWU1eUIsS0FBS3FRLFlBQVl3aUIsWUFDdEMsSUFBSUMsRUFBZWxQLEVBQUsxUixLQUFPbE8sT0FBTyt1QixRQUFVLEdBRTVDRCxFQUFlRixFQUFlNXVCLE9BQU9pTyxhQUNyQzZnQixFQUFlOXVCLE9BQU9pTyxXQUFhMmdCLEVBQWUsSUFHdEQsTUFBTUksRUFBZ0JoekIsS0FBS3FRLFlBQVk0aUIsYUFDdkMsSUFBSUMsRUFBY3RQLEVBQUtuVixJQUFNekssT0FBT212QixRQUFVSCxFQUFnQixHQUUxREUsRUFBYyxJQUNkQSxFQUFjdFAsRUFBS3dQLE9BQVNwdkIsT0FBT212QixRQUFVLElBR2pEbnpCLEtBQUtxUSxZQUFZMU0sTUFBTXVPLEtBQU8sR0FBRzRnQixNQUNqQzl5QixLQUFLcVEsWUFBWTFNLE1BQU04SyxJQUFNLEdBQUd5a0IsS0FDcEMsQ0FFQSxJQUFBbGlCLEdBQ1FoUixLQUFLbVIsVUFDTG5SLEtBQUt3dkIsc0JBQXdCLEtBQzdCcGMsTUFBTXBDLE9BRWQsR3RDOVlKLFNBQVl4SixHQUNSLDRDQUNBLDhDQUNBLDZDQUNBLCtDQUNBLDZDQUNBLDRDQUNILENBUEQsQ0FBWUEsSUFBQUEsRUFBZSxLQ0EzQixTQUFZQyxHQUNSLCtDQUVILENBSEQsQ0FBWUEsSUFBQUEsRUFBZSxLQ0EzQixTQUFZQyxHQUNSLDZDQUNILENBRkQsQ0FBWUEsSUFBQUEsRUFBZSxLcUNzQnBCLE1BQU04ckIsR0FFVCxZQUFPek8sR0FFSCxNQUNNME8sRUFBY2hELEdBQTJCdmxCLGNBUy9DLE9BUEF1b0IsRUFBWTFELGVBQWV5RCxHQUFrQ0Usb0JBQzdERCxFQUFZdEQsZ0JBQWdCcUQsR0FBa0NwRCxVQUFVLHNCQUN4RXFELEVBQVl4RCxrQkFBa0J1RCxHQUFrQ3RELGVBQ2hFdUQsRUFBWTFELGVBQWV5RCxHQUFrQ0csaUJBQzdERixFQUFZdEQsZ0JBQWdCcUQsR0FBa0NwRCxVQUFVLDRCQUN4RXFELEVBQVkxRCxlQUFleUQsR0FBa0NJLHVCQUV0REgsQ0FDWCxDQUVBLHVCQUFPQyxHQUVILE1BQU1HLEVBQWtCLElBQUlqTCxFQUFpQixrQkFDdkNrTCxFQUFvQixJQUFJMUosR0FBbUIsaUJBQWtCLE9BQVF5SixHQUNyRUgsRUFBbUIsSUFBSXhPLEVBQWEsZUFBZ0I0TyxFQUFtQkQsR0FpQjdFLE9BZkFBLEVBQWdCbE4sT0FBTyxJQUFJNEQsR0FBMEJzSixFQUFpQixjQUV0RUEsRUFBZ0JsTixPQUFPLElBQUlDLEVBQXFCLHFCQUFzQmlOLEVBQWlCdFYsRUFBdUJrQixpQkFBaUJILGdCQUFpQjNXLEVBQXNCd0IsY0FBY3BCLFVBQVdnckIsR0FBU3ZvQixVQUFVNkUsWUFBYSxPQUFRLHFCQUN2T3dqQixFQUFnQmxOLE9BQU8sSUFBSUMsRUFBcUIseUJBQTBCaU4sRUFBaUJ0VixFQUF1QmtCLGlCQUFpQkgsZ0JBQWlCM1csRUFBc0J3QixjQUFjYixXQUFZeXFCLEdBQVNDLFVBQVUzakIsWUFBYSxZQUFhLFdBQ2pQd2pCLEVBQWdCbE4sT0FBTyxJQUFJQyxFQUFxQiw2QkFBOEJpTixFQUFpQnRWLEVBQXVCa0IsaUJBQWlCSCxnQkFBaUIzVyxFQUFzQndCLGNBQWNmLGNBQWUycUIsR0FBU0UsT0FBTzVqQixZQUFhLGdCQUFpQixXQUN6UHdqQixFQUFnQmxOLE9BQU8sSUFBSUMsRUFBcUIsNkJBQThCaU4sRUFBaUJ0VixFQUF1QmtCLGlCQUFpQkgsZ0JBQWlCM1csRUFBc0J3QixjQUFjZCxjQUFlMHFCLEdBQVNHLE9BQU83akIsWUFBYSxnQkFBaUIsV0FDelB3akIsRUFBZ0JsTixPQUFPLElBQUlDLEVBQXFCLDBCQUEyQmlOLEVBQWlCdFYsRUFBdUJrQixpQkFBaUJILGdCQUFpQjNXLEVBQXNCd0IsY0FBY2pCLEtBQU02cUIsR0FBU2hvQixLQUFLc0UsWUFBYSxlQUMxTndqQixFQUFnQmxOLE9BQU8sSUFBSUMsRUFBcUIsc0JBQXVCaU4sRUFBaUJ0VixFQUF1QmtCLGlCQUFpQkgsZ0JBQWlCM1csRUFBc0J3QixjQUFjaEIsTUFBTzRxQixHQUFTSSxNQUFNOWpCLFlBQWEsVUFDeE53akIsRUFBZ0JsTixPQUFPLElBQUlDLEVBQXFCLHlCQUEwQmlOLEVBQWlCdFYsRUFBdUJrQixpQkFBaUJILGdCQUFpQjNXLEVBQXNCd0IsY0FBY1osU0FBVXdxQixHQUFTSyxNQUFNL2pCLFlBQWEsWUFBYSxlQUMzT3dqQixFQUFnQmxOLE9BQU8sSUFBSUMsRUFBcUIseUJBQTBCaU4sRUFBaUJ0VixFQUF1QmtCLGlCQUFpQkgsZ0JBQWlCM1csRUFBc0J3QixjQUFjWCxTQUFVdXFCLEdBQVNNLE1BQU1oa0IsWUFBYSxZQUFhLGVBQzNPd2pCLEVBQWdCbE4sT0FBTyxJQUFJQyxFQUFxQix5QkFBMEJpTixFQUFpQnRWLEVBQXVCa0IsaUJBQWlCSCxnQkFBaUIzVyxFQUFzQndCLGNBQWNWLFNBQVVzcUIsR0FBU08sTUFBTWprQixZQUFhLFlBQWEsZUFDM093akIsRUFBZ0JsTixPQUFPLElBQUlDLEVBQXFCLHlCQUEwQmlOLEVBQWlCdFYsRUFBdUJrQixpQkFBaUJILGdCQUFpQjNXLEVBQXNCd0IsY0FBY1QsU0FBVXFxQixHQUFTUSxNQUFNbGtCLFlBQWEsWUFBYSxlQUMzT3dqQixFQUFnQmxOLE9BQU8sSUFBSUMsRUFBcUIseUJBQTBCaU4sRUFBaUJ0VixFQUF1QmtCLGlCQUFpQkgsZ0JBQWlCM1csRUFBc0J3QixjQUFjUixTQUFVb3FCLEdBQVNTLE1BQU1ua0IsWUFBYSxZQUFhLGVBQzNPd2pCLEVBQWdCbE4sT0FBTyxJQUFJQyxFQUFxQix5QkFBMEJpTixFQUFpQnRWLEVBQXVCa0IsaUJBQWlCSCxnQkFBaUIzVyxFQUFzQndCLGNBQWNQLFNBQVVtcUIsR0FBU1UsTUFBTXBrQixZQUFhLFlBQWEsZUFFcE9xakIsQ0FDWCxDQUVBLGdCQUFPdEQsQ0FBVXp3QixHQUNiLE9BQU8sSUFBSWdxQixFQUF5QmhxQixFQUN4QyxDQUVBLGtCQUFPdXdCLEdBQ0gsTUFBTXdFLEVBQWMsSUFBSTVLLEdBU3hCLE9BUEFDLEdBQWdCMWUsT0FBT2hFLEVBQVVzdEIsS0FBTXh0QixFQUFTNmlCLFdBQVksT0FBUTFGLEVBQVFqWixPQUFPckUsRUFBTTJ0QixLQUFNdFEsRUFBTXVRLFFBQVFua0IsU0FBU2lrQixHQUN0SDNLLEdBQWdCMWUsT0FBT2hFLEVBQVV5akIsS0FBTTNqQixFQUFTMHRCLFdBQVksT0FBUXZRLEVBQVFqWixPQUFPckUsRUFBTThqQixLQUFNekcsRUFBTXVRLFFBQVFua0IsU0FBU2lrQixHQUN0SDNLLEdBQWdCMWUsT0FBT2hFLEVBQVU0akIsT0FBUTlqQixFQUFTMnRCLGFBQWMsU0FBVXhRLEVBQVFqWixPQUFPckUsRUFBTWlrQixPQUFRNUcsRUFBTXVRLFFBQVFua0IsU0FBU2lrQixHQUM5SDNLLEdBQWdCMWUsT0FBT2hFLEVBQVVna0IsVUFBV2xrQixFQUFTd2tCLGdCQUFpQixZQUFhckgsRUFBUWpaLE9BQU9yRSxFQUFNcWtCLFVBQVdoSCxFQUFNdVEsUUFBUW5rQixTQUFTaWtCLEdBQzFJM0ssR0FBZ0IxZSxPQUFPaEUsRUFBVTB0QixXQUFZNXRCLEVBQVM2dEIsaUJBQWtCLE9BQVExUSxFQUFRalosT0FBT3JFLEVBQU0rdEIsV0FBWTFRLEVBQU11USxRQUFRbmtCLFNBQVNpa0IsR0FDeEkzSyxHQUFnQjFlLE9BQU9oRSxFQUFVOGpCLGNBQWVoa0IsRUFBUzh0QixvQkFBcUIsaUJBQWtCM1EsRUFBUWpaLE9BQU9yRSxFQUFNa3VCLGNBQWU3USxFQUFNdVEsUUFBUW5rQixTQUFTaWtCLEdBRXBKQSxDQUNYLENBRUEsb0JBQU9mLEdBRUgsTUFBTXdCLEVBQW9CLElBQUl2TSxFQUFpQm5oQixFQUFnQjJ0Qix1QkFDekRDLEVBQWMsSUFBSWpMLEdBQW1CLGtCQUFtQixJQUFJSCxHQUFVLFdBQVc1WixZQUFhOGtCLEdBQzlGeEIsRUFBZ0IsSUFBSXpPLEVBQWF4ZCxFQUFnQjR0QixxQkFBc0JELEVBQWFGLEdBRTFGQSxFQUFrQnhPLE9BQU8sSUFBSTRELEdBQTBCNEssRUFBbUIsZUFFMUUsTUFBTUksRUFBaUIsSUFBSTNPLEVBQXFCcGYsRUFBZ0JndUIsb0JBQXFCTCxFQUFtQmh1QixFQUFTMGtCLGtCQUFtQjNrQixFQUFPa3FCLGVBQWdCLElBQUluSCxHQUFVL2lCLEVBQU9rcUIsZ0JBQWdCL2dCLFlBQWEsT0FDN01rbEIsRUFBZW5PLFNBQVMsZUFFeEIsTUFBTWlLLEVBQW1CLElBQUl6SyxFQUFxQnBmLEVBQWdCaXVCLHNCQUF1Qk4sRUFBbUJodUIsRUFBUzBrQixrQkFBbUIza0IsRUFBT21xQixpQkFBa0IsSUFBSXBILEdBQVUvaUIsRUFBT21xQixrQkFBa0JoaEIsWUFBYSxTQUNyTmdoQixFQUFpQmpLLFNBQVMsZUFFMUIsTUFBTXNPLEVBQWtCLElBQUk5TyxFQUFxQnBmLEVBQWdCbXVCLHFCQUFzQlIsRUFBbUJodUIsRUFBUzBrQixrQkFBbUIza0IsRUFBT29xQixnQkFBaUIsSUFBSXJILEdBQVUvaUIsRUFBT29xQixpQkFBaUJqaEIsWUFBYSxRQUNqTnFsQixFQUFnQnRPLFNBQVMsZUFFekIsTUFBTXdPLEVBQW9CLElBQUloUCxFQUFxQnBmLEVBQWdCcXVCLHVCQUF3QlYsRUFBbUJodUIsRUFBUzBrQixrQkFBbUIza0IsRUFBT3FxQixrQkFBbUIsSUFBSXRILEdBQVUvaUIsRUFBT3FxQixtQkFBbUJsaEIsWUFBYSxVQUN6TnVsQixFQUFrQnhPLFNBQVMsZUFFM0IsTUFBTTBPLEVBQWtCLElBQUlsUCxFQUFxQnBmLEVBQWdCdXVCLHFCQUFzQlosRUFBbUJodUIsRUFBUzBrQixrQkFBbUIza0IsRUFBT3NxQixnQkFBaUIsSUFBSXZILEdBQVUvaUIsRUFBT3NxQixpQkFBaUJuaEIsWUFBYSxRQUNqTnlsQixFQUFnQjFPLFNBQVMsZUFFekIsTUFBTTRPLEVBQWtCLElBQUlwUCxFQUFxQnBmLEVBQWdCeXVCLHFCQUFzQmQsRUFBbUJodUIsRUFBUzBrQixrQkFBbUIza0IsRUFBTzRXLGdCQUFpQixJQUFJbU0sR0FBVS9pQixFQUFPNFcsaUJBQWlCek4sWUFBYSxRQUNqTjJsQixFQUFnQjVPLFNBQVMsZUFFekIrTixFQUFrQnhPLE9BQU80TyxHQUN6QkosRUFBa0J4TyxPQUFPMEssR0FDekI4RCxFQUFrQnhPLE9BQU8rTyxHQUN6QlAsRUFBa0J4TyxPQUFPaVAsR0FDekJULEVBQWtCeE8sT0FBT21QLEdBQ3pCWCxFQUFrQnhPLE9BQU9xUCxHQUV6QmIsRUFBa0J4TyxPQUFPLElBQUk0RCxHQUEwQjRLLEVBQW1CLFVBRTFFLE1BQU1lLEVBQWUsSUFBSXRQLEVBQXFCLGlCQUFrQnVPLEVBQW1CaHVCLEVBQVMya0IsZ0JBQWlCNWtCLEVBQU93cUIsYUFBYyxJQUFJcE4sRUFBUSx1QkFBd0JELEVBQU11USxPQUFPdmtCLFlBQWEsT0FDaE02bEIsRUFBYTlPLFNBQVMsYUFFdEIsTUFBTStPLEVBQWlCLElBQUl2UCxFQUFxQixtQkFBb0J1TyxFQUFtQmh1QixFQUFTMmtCLGdCQUFpQjVrQixFQUFPeXFCLGVBQWdCLElBQUlyTixFQUFRLHVCQUF3QkQsRUFBTXVRLE9BQU92a0IsWUFBYSxTQUN0TThsQixFQUFlL08sU0FBUyxhQUV4QixNQUFNZ1AsRUFBZ0IsSUFBSXhQLEVBQXFCLGtCQUFtQnVPLEVBQW1CaHVCLEVBQVMya0IsZ0JBQWlCNWtCLEVBQU8wcUIsY0FBZSxJQUFJdE4sRUFBUSx1QkFBd0JELEVBQU11USxPQUFPdmtCLFlBQWEsUUFDbk0rbEIsRUFBY2hQLFNBQVMsYUFFdkIsTUFBTWlQLEVBQWtCLElBQUl6UCxFQUFxQixvQkFBcUJ1TyxFQUFtQmh1QixFQUFTMmtCLGdCQUFpQjVrQixFQUFPMnFCLGdCQUFpQixJQUFJdk4sRUFBUSx1QkFBd0JELEVBQU11USxPQUFPdmtCLFlBQWEsVUFDek1nbUIsRUFBZ0JqUCxTQUFTLGFBRXpCLE1BQU1rUCxFQUFnQixJQUFJMVAsRUFBcUIsa0JBQW1CdU8sRUFBbUJodUIsRUFBUzJrQixnQkFBaUI1a0IsRUFBTzRxQixjQUFlLElBQUl4TixFQUFRLHVCQUF3QkQsRUFBTXVRLE9BQU92a0IsWUFBYSxRQUNuTWltQixFQUFjbFAsU0FBUyxhQUV2QixNQUFNbVAsRUFBZ0IsSUFBSTNQLEVBQXFCLGtCQUFtQnVPLEVBQW1CaHVCLEVBQVMya0IsZ0JBQWlCNWtCLEVBQU82VyxpQkFBa0IsSUFBSXVHLEVBQVEsdUJBQXdCRCxFQUFNdVEsT0FBT3ZrQixZQUFhLFFBVXRNLE9BVEFrbUIsRUFBY25QLFNBQVMsYUFFdkIrTixFQUFrQnhPLE9BQU91UCxHQUN6QmYsRUFBa0J4TyxPQUFPd1AsR0FDekJoQixFQUFrQnhPLE9BQU95UCxHQUN6QmpCLEVBQWtCeE8sT0FBTzBQLEdBQ3pCbEIsRUFBa0J4TyxPQUFPMlAsR0FDekJuQixFQUFrQnhPLE9BQU80UCxHQUVsQjVDLENBQ1gsQ0FFQSwwQkFBT0MsR0FFSCxNQUFNemxCLEVBQU8sSUFBSW1XLEVBQVEscUJBQXNCRCxFQUFNdVEsT0FFL0M0QixFQUFrQixJQUFJNU4sRUFBaUIsd0JBQ3ZDcmEsRUFBb0IsSUFBSTZiLEdBQW1CLHVCQUF3QmpjLEVBQUtrQyxZQUFhbW1CLEdBQWlCLEdBQ3RHNUMsRUFBc0IsSUFBSTFPLEVBQWEsc0JBQXVCM1csRUFBbUJpb0IsR0FFdkZBLEVBQWdCN1AsT0FBTyxJQUFJNEQsR0FBMEJpTSxFQUFpQixpQkFFdEVBLEVBQWdCN1AsT0FBTyxJQUFJQyxFQUFxQixhQUFjNFAsRUFBaUJqWSxFQUF1QmtCLGlCQUFpQlAsS0FBTSxLQUFNNlUsR0FBUzBDLEtBQUtwbUIsWUFBYSxPQUFRLFdBQ3RLbW1CLEVBQWdCN1AsT0FBTyxJQUFJQyxFQUFxQixZQUFhNFAsRUFBaUJqWSxFQUF1QmtCLGlCQUFpQkwsSUFBSyxLQUFNMlUsR0FBUzJDLElBQUlybUIsWUFBYSxNQUFPLFdBQ2xLbW1CLEVBQWdCN1AsT0FBTyxJQUFJQyxFQUFxQixjQUFlNFAsRUFBaUJqWSxFQUF1QmtCLGlCQUFpQk4sTUFBTyxLQUFNNFUsR0FBUzRDLE1BQU10bUIsWUFBYSxVQUFXLFdBQzVLbW1CLEVBQWdCN1AsT0FBTyxJQUFJQyxFQUFxQixrQkFBbUI0UCxFQUFpQmpZLEVBQXVCa0IsaUJBQWlCUixVQUFXLEtBQU04VSxHQUFTNkMsVUFBVXZtQixZQUFhLGNBQWUsV0FDNUxtbUIsRUFBZ0I3UCxPQUFPLElBQUlDLEVBQXFCLGNBQWU0UCxFQUFpQmpZLEVBQXVCa0IsaUJBQWlCSixjQUFlLEtBQU0wVSxHQUFTOEMsT0FBT3htQixZQUFhLGNBQWUsWUFFekwsTUFBTXltQixFQUFhLElBQUlsUSxFQUFxQixlQUFnQjRQLEVBQWlCalksRUFBdUJrQixpQkFBaUJULE9BQVEsS0FBTStVLEdBQVNnRCxPQUFPMW1CLFlBQWEsZUFBZ0IsYUFLaEwsT0FKQXltQixFQUFXaFAsWUFBWSxpQkFFdkIwTyxFQUFnQjdQLE9BQU9tUSxHQUVoQmxELENBQ1gsRUFHSixNQUFNRyxHQUFnQixDQUVsQnZvQixVQUFXLElBQUk4WSxFQUFRLHVCQUF3QixXQUMvQzBQLFVBQVcsSUFBSTFQLEVBQVEsNkJBQThCRCxFQUFNdVEsT0FDM0RYLE9BQVEsSUFBSTNQLEVBQVEsK0JBQWdDRCxFQUFNdVEsT0FDMURWLE9BQVEsSUFBSTVQLEVBQVEsK0JBQWdDRCxFQUFNdVEsT0FDMUQ3b0IsS0FBTSxJQUFJdVksRUFBUSwyQkFBNEJELEVBQU11USxPQUNwRFQsTUFBTyxJQUFJN1AsRUFBUSx1QkFBd0JELEVBQU11USxPQUNqRFIsTUFBTyxJQUFJOVAsRUFBUSxvQkFBcUJELEVBQU11USxPQUM5Q1AsTUFBTyxJQUFJL1AsRUFBUSxvQkFBcUJELEVBQU11USxPQUM5Q04sTUFBTyxJQUFJaFEsRUFBUSxvQkFBcUJELEVBQU11USxPQUM5Q0wsTUFBTyxJQUFJalEsRUFBUSxvQkFBcUJELEVBQU11USxPQUM5Q0osTUFBTyxJQUFJbFEsRUFBUSxvQkFBcUJELEVBQU11USxPQUM5Q0gsTUFBTyxJQUFJblEsRUFBUSxvQkFBcUJELEVBQU11USxPQUM5Q2dDLFVBQVcsSUFBSXRTLEVBQVEsMEJBQTJCRCxFQUFNdVEsT0FDeERtQyxPQUFRLElBQUl6UyxFQUFRLHNCQUF1QkQsRUFBTXVRLE9BQ2pEaUMsT0FBUSxJQUFJdlMsRUFBUSxzQkFBdUJELEVBQU11USxPQUNqRDZCLEtBQU0sSUFBSW5TLEVBQVEscUJBQXNCRCxFQUFNdVEsT0FDOUM4QixJQUFLLElBQUlwUyxFQUFRLG9CQUFxQkQsRUFBTXVRLE9BQzVDK0IsTUFBTyxJQUFJclMsRUFBUSxzQkFBdUJELEVBQU11USxRQ3pMN0MsTUFBTW9DLFdBQXVCOW1CLEVBRWhDLFdBQUFLLEdBRUk2QyxNQUFNLENBQUMsRUFDWCxDQUVBLElBQUE1QyxHQUVJLE1BQU15bUIsRUFBcUJuekIsU0FBU1csY0FBYyxRQVFsRCxPQU5Bd3lCLEVBQW1CNW9CLFVBQVksYUFDL0I0b0IsRUFBbUIvcUIsVUFBVUMsSUFBSSx1QkFDakM4cUIsRUFBbUJ0ekIsTUFBTWtLLFFBQVUsT0FDbkNvcEIsRUFBbUJ0ekIsTUFBTW9LLE1BQVEseUJBQ2pDa3BCLEVBQW1CdHpCLE1BQU1xSyxRQUFVLE9BRTVCaXBCLENBQ1gsRUNwQkosSUFBWUMsR0NJQUMsR0NKQUMsR0NBQUMsR0NBQUMsR0NBQUMsR0NJQUMsSU5KWixTQUFZTixHQUNSLFVBQ0EsZUFDSCxDQUhELENBQVlBLEtBQUFBLEdBQVcsS09nQmhCLE1BQU1PLFdBQWtCdm5CLEVBRTNCckgsVUFBWSxZQUVKb0ssdUJBRUE2Vix1QkFHQTRPLGFBQ0FDLGVBQ0FDLFlBRUEvdUIsZ0JBRUEyVixXQUVSLFlBQW9CdkwsRUFBaUR1TCxHQUVqRXBMLE1BQU0sQ0FBQyxHQUVQcFQsS0FBSzhvQix1QkFBeUIsS0FFOUI5b0IsS0FBSzAzQixhQUFlLElBQUloUixFQUN4QjFtQixLQUFLMjNCLGVBQWlCLElBQUlYLEdBQzFCaDNCLEtBQUtpVCx1QkFBeUJBLEVBQzlCalQsS0FBS3dlLFdBQWFBLEVBTWxCeGUsS0FBS3FULGVBRUxyVCxLQUFLNDNCLFlBQWMsRUFDdkIsQ0FFQSxJQUFBcG5CLEdBRUksTUFBTUgsRUFBY3ZNLFNBQVNXLGNBQWMsT0FDM0M0TCxFQUFZMVEsR0FBSzgzQixHQUFVOTNCLEdBRTNCMFEsRUFBWW5FLFVBQVVDLElBQUksd0JBQXlCLG1CQUNuRGtFLEVBQVkxTSxNQUFNcUssUUFBVSxPQUU1QixNQUFNNnBCLEVBQWUvekIsU0FBU1csY0FBYyxPQU01QyxPQUxBb3pCLEVBQWEzckIsVUFBVUMsSUFBSSxpQkFDM0IwckIsRUFBYWwwQixNQUFNNkssU0FBVyxXQUU5QjZCLEVBQVk5TCxZQUFZc3pCLEdBRWpCeG5CLENBQ1gsQ0FFQSxNQUFBc1csQ0FBT21SLEdBQ0g5M0IsS0FBSzAzQixhQUFhL1EsT0FBT21SLEdBQ3pCOTNCLEtBQUtxUSxZQUFZdE0sY0FBYyxrQkFBbUJRLFlBQVl1ekIsRUFBU3puQixZQUMzRSxDQUVPLGtCQUFPbkYsR0FFVixNQUFNNnNCLEVBQXdCNWxCLEVBQW9CRSxTQUFTRSxRQUFpQywyQkFDdEZpTSxFQUFhck0sRUFBb0JFLFNBQVNFLFFBQXFCLGVBTXJFLE9BSktrbEIsR0FBVW5sQixXQUNYbWxCLEdBQVVubEIsU0FBVyxJQUFJbWxCLEdBQVVNLEVBQXVCdlosSUFHdkRpWixHQUFVbmxCLFFBQ3JCLENBRUEsaUJBQUE2VixDQUFrQmpvQixHQUVWRixLQUFLOG9CLHdCQUEwQjVvQixJQUkvQkYsS0FBSzhvQix3QkFDTDlvQixLQUFLOG9CLHVCQUF1QjFYLE1BQU1xVyxjQUd0Q3puQixLQUFLOG9CLHVCQUF5QjVvQixFQUM5QkYsS0FBSzhvQix1QkFBdUIxWCxNQUFNQyxRQUdsQ3JSLEtBQUt3ZSxXQUFXMkMsUUFBUTlQLFFBQzVCLENBRUEsMEJBQUEybUIsR0FFSSxNQUFNQyxFQUFtRGo0QixLQUFLMDNCLGFBQWFuUyxXQUUzRSxJQUFJMlMsRUFBcURELEVBRXpELEtBQU9DLEdBQW9CLENBRXZCLE1BQU1DLEVBQXdDRCxFQUFtQjltQixNQUFNZ25CLFVBQVVyUyxXQUFVN2xCLEdBQVFBLEVBQUt3USxZQUV4RyxHQUFJeW5CLEVBRUEsWUFEQW40QixLQUFLbW9CLGtCQUFrQmdRLEdBTTNCLEdBRkFELEVBQXFCQSxFQUFtQjNkLFNBRXBDMmQsR0FBc0JELEVBQ3RCLE1BRVIsQ0FDSixDQUVBLHdCQUFBMU8sR0FFSSxJQUFJRyxFQUVKLEdBQUkxcEIsS0FBSzhvQix3QkFFTCxHQURBWSxFQUFzQjFwQixLQUFLOG9CLHVCQUF1QnJDLHVCQUFzQnZtQixHQUFRQSxFQUFLd1EsYUFDaEZnWixFQUFxQixDQUV0QixJQUFJMk8sRUFBNkRyNEIsS0FBSzAzQixhQUFheFIsS0FBS2xtQixLQUFLOG9CLHVCQUF1QjFYLE1BQU1rbkIsaUJBQWtCN1IsdUJBQXNCOFIsR0FBV0EsRUFBUTduQixZQUVyTCxJQUFLMm5CLEVBQ0QsT0FFSjNPLEVBQXNCMk8sRUFBMkJqbkIsTUFBTWduQixVQUFVcFMsVUFBUzlsQixHQUFRQSxFQUFLd1EsV0FDM0YsTUFDRyxDQUNILElBQUk4bkIsRUFBeUR4NEIsS0FBSzAzQixhQUFhMVIsVUFBU3VTLEdBQVdBLEVBQVE3bkIsWUFFM0csSUFBSzhuQixFQUNELE9BRUo5TyxFQUFzQjhPLEVBQXVCcG5CLE1BQU1nbkIsVUFBVXBTLFVBQVM5bEIsR0FBUUEsRUFBS3dRLFdBQ3ZGLENBQ0ExUSxLQUFLbW9CLGtCQUFrQnVCLEVBQzNCLENBRUEsb0JBQUFKLEdBRUksSUFBSUcsRUFFSixHQUFJenBCLEtBQUs4b0Isd0JBRUwsR0FEQVcsRUFBa0J6cEIsS0FBSzhvQix1QkFBdUJ2QyxtQkFBa0JybUIsR0FBUUEsRUFBS3dRLGFBQ3hFK1ksRUFBaUIsQ0FFbEIsSUFBSWdQLEVBQXlEejRCLEtBQUswM0IsYUFBYXhSLEtBQUtsbUIsS0FBSzhvQix1QkFBdUIxWCxNQUFNa25CLGlCQUFrQi9SLG1CQUFrQmdTLEdBQVdBLEVBQVE3bkIsWUFFN0ssSUFBSytuQixFQUNELE9BRUpoUCxFQUFrQmdQLEVBQXVCcm5CLE1BQU1nbkIsVUFBVXJTLFdBQVU3bEIsR0FBUUEsRUFBS3dRLFdBQ3BGLE1BRUcsQ0FDSCxJQUFJZ29CLEVBQTBEMTRCLEtBQUswM0IsYUFBYTNSLFdBQVV3UyxHQUFXQSxFQUFRN25CLFlBQzdHLElBQUtnb0IsRUFDRCxPQUVKalAsRUFBa0JpUCxFQUF3QnRuQixNQUFNZ25CLFVBQVVyUyxXQUFVN2xCLEdBQVFBLEVBQUt3USxXQUNyRixDQUVBMVEsS0FBS21vQixrQkFBa0JzQixFQUMzQixDQUVBLFdBQUFrUCxHQUVJMzRCLEtBQUswM0IsYUFBYXZxQixTQUFRb3JCLElBQ3RCQSxFQUFRSyxjQUFjNTRCLEtBQUs0M0IsWUFBWSxJQUd0QzUzQixLQUFLMDNCLGFBQWE3UixLQUFJMFMsR0FBV0EsRUFBUTduQixZQUcxQzFRLEtBQUsyM0IsZUFBZTNtQixPQUZwQmhSLEtBQUsyM0IsZUFBZTVtQixPQUt4Qi9RLEtBQUtnNEIsNEJBQ1QsQ0FFQSxJQUFBam5CLEdBRUlrRixZQUFXLEtBRVAsTUFBTWlELEVBQWdCcFYsU0FBU29WLGNBRS9CLElBQUtBLEVBRUQsWUFEQTdKLFFBQVErRSxNQUFNLDZJQUlsQnBVLEtBQUt3ZSxXQUFXL2UsS0FBS3laLEdBU3JCLE1BQU1wQyxFQUFZOVMsT0FBTytRLGVBRXpCLElBQUsrQixHQUFzQyxJQUF6QkEsRUFBVTlCLFdBQ3hCLE1BQU0sSUFBSTFRLE1BQU0sOEJBR3BCLE1BQ01zZixFQURROU0sRUFBVTVCLFdBQVcsR0FDaEJuRCx3QkFFbkIvUixLQUFLcVEsWUFBWTFNLE1BQU1xSyxRQUFVLE9BRWpDLE1BQU00a0IsRUFBZTV5QixLQUFLcVEsWUFBWXdpQixZQUN0QyxJQUFJQyxFQUFlbFAsRUFBSzFSLEtBQU9sTyxPQUFPK3VCLFFBRWxDRCxFQUFlRixFQUFlNXVCLE9BQU9pTyxhQUNyQzZnQixFQUFlOXVCLE9BQU9pTyxXQUFhMmdCLEVBQWUsSUFHdEQsTUFBTUksRUFBZ0JoekIsS0FBS3FRLFlBQVk0aUIsYUFDdkMsSUFBSUMsRUFBY3RQLEVBQUtuVixJQUFNekssT0FBT212QixRQUFVSCxFQUFnQixHQUUxREUsRUFBYyxJQUNkQSxFQUFjdFAsRUFBS3dQLE9BQVNwdkIsT0FBT212QixRQUFVLElBR2pEbnpCLEtBQUtxUSxZQUFZMU0sTUFBTXVPLEtBQU8sR0FBRzRnQixNQUNqQzl5QixLQUFLcVEsWUFBWTFNLE1BQU04SyxJQUFNLEdBQUd5a0IsTUFFaEM5ZixNQUFNckMsT0FFTi9RLEtBQUtnNEIsNkJBQ0xoNEIsS0FBS3dlLFdBQVcyQyxRQUFROVAsT0FBTyxHQUVoQyxHQUVQLENBRUEsT0FBQXduQixHQUNJNzRCLEtBQUs0M0IsWUFBYyxHQUVuQjUzQixLQUFLMDNCLGFBQWF2cUIsU0FBUW9yQixJQUN0QkEsRUFBUU0sU0FBUyxHQUV6QixDQUVBLElBQUE3bkIsR0FFSWhSLEtBQUs2NEIsVUFDTDc0QixLQUFLd2UsV0FBVzJDLFFBQVE5UCxRQUd4QitCLE1BQU1wQyxNQUNWLENBRVEsWUFBQXFDLEdBRUp2UCxTQUFTc0wsaUJBQWlCbkksRUFBYW1YLGdCQUFrQnhLLElBQ3JELE1BQU0sUUFBRXlLLEdBQVl6SyxFQUFNeUosT0FFdEJnQixHQUFXbFgsRUFBU3FaLGdCQUNwQnhnQixLQUFLZ1IsTUFHWixJQUVEbE4sU0FBU3NMLGlCQUFpQixXQUFZd0UsSUFFbEMsTUFBTWdILEVBQVFoRSxFQUFTb0MsMENBQTBDLFNBRWpFLEdBQUtoWixLQUFLMFEsV0FBMkIsTUFBZGtELEVBQU14TixLQUFnQndOLEVBQU1rbEIsU0FBWWxsQixFQUFNd2UsVUFBYXhlLEVBQU1tbEIsU0FBVW5lLElBV3ZGNWEsS0FBSzBRLFdBQTJCLGNBQWRrRCxFQUFNeE4sS0FBd0J3TixFQUFNa2xCLFNBQVlsbEIsRUFBTXdlLFVBQWF4ZSxFQUFNbWxCLFdBRzNGLzRCLEtBQUswUSxXQUEyQixlQUFka0QsRUFBTXhOLEtBQXlCd04sRUFBTWtsQixTQUFZbGxCLEVBQU13ZSxVQUFheGUsRUFBTW1sQixTQUk5Ri80QixLQUFLMFEsV0FBMkIsY0FBZGtELEVBQU14TixLQUF3QndOLEVBQU1rbEIsU0FBWWxsQixFQUFNd2UsVUFBYXhlLEVBQU1tbEIsUUFHekYvNEIsS0FBSzBRLFdBQTJCLFlBQWRrRCxFQUFNeE4sS0FBc0J3TixFQUFNa2xCLFNBQVlsbEIsRUFBTXdlLFVBQWF4ZSxFQUFNbWxCLFFBR3pGLzRCLEtBQUswUSxZQUFhLGVBQWVzb0IsS0FBS3BsQixFQUFNeE4sTUFBU3dOLEVBQU1rbEIsU0FBWWxsQixFQUFNd2UsVUFBYXhlLEVBQU1tbEIsT0FHaEcvNEIsS0FBSzBRLFdBQTJCLGNBQWRrRCxFQUFNeE4sSUFFUCxJQUFwQnBHLEtBQUs0M0IsWUFDTDUzQixLQUFLZ1IsUUFFTGhSLEtBQUtpNUIsaUNBQ0xqNUIsS0FBSzI0QixnQkFFRjM0QixLQUFLMFEsV0FBMkIsV0FBZGtELEVBQU14TixLQUFxQndOLEVBQU1rbEIsU0FBWWxsQixFQUFNd2UsVUFBYXhlLEVBQU1tbEIsUUFDL0YvNEIsS0FBS2dSLFFBWExoUixLQUFLazVCLGtCQUFrQnRsQixFQUFNeE4sS0FDN0JwRyxLQUFLMjRCLGdCQUpML2tCLEVBQU1ZLGlCQUNOeFUsS0FBS3VwQiw2QkFKTDNWLEVBQU1ZLGlCQUNOeFUsS0FBS3NwQix5QkFSTDFWLEVBQU1ZLGlCQUNOWixFQUFNOGEsdUJBYitGLENBTXJHLEdBSGU5YSxFQUFNaFEsT0FDTXNRLFFBQVFnakIsR0FBWWlDLElBRzNDLE9BR0puNUIsS0FBSytRLE1BQ1QsQ0EwQkEsSUFHSmpOLFNBQVNzTCxpQkFBaUIsU0FBVXdFLElBQzVCNVQsS0FBSzBRLFlBQWVrRCxFQUFNaFEsT0FBd0JzUSxRQUFRLElBQUlsVSxLQUFLcVEsWUFBWTFRLE9BQy9FSyxLQUFLZ1IsTUFDVCxJQUdKbE4sU0FBU3NMLGlCQUFpQixXQUFZd0UsSUFFbEMsR0FBSTVULEtBQUswUSxXQUEyQixVQUFka0QsRUFBTXhOLE1BQW9Cd04sRUFBTWtsQixVQUFZbGxCLEVBQU13ZSxXQUFheGUsRUFBTW1sQixPQUFRLENBRS9GbmxCLEVBQU1ZLGlCQUNOWixFQUFNOGEsa0JBRU4sTUFBTTBLLEVBQVlwNUIsS0FBSzhvQix3QkFBd0IxWCxNQUFNZ29CLFVBRWpEQSxHQUVBcDVCLEtBQUtxNUIsK0NBQStDRCxFQUU1RCxLQUdKdDFCLFNBQVNzTCxpQkFBaUJuSSxFQUFhc3BCLGtCQUFtQjNjLElBQ3RENVQsS0FBS2dSLE1BQU0sR0FFbkIsQ0FHQSxnQkFBQTZXLENBQWlCdVIsR0FFYixNQUFNamMsRUFBYyxJQUFJQyxZQUFpQ25XLEVBQWFtWCxlQUFnQixDQUNsRmYsT0FBUSxDQUNKZ0IsUUFBU2xYLEVBQVNxWixlQUNsQnBQLE1BQU9nb0IsS0FJZnQxQixTQUFTeVosY0FBY0osRUFDM0IsQ0FFQSw4Q0FBQWtjLENBQStDRCxHQUV2Q0EsR0FFQXA1QixLQUFLNm5CLGlCQUFpQnVSLEVBSTlCLENBRVEsaUJBQUFGLENBQWtCSSxHQUN0QnQ1QixLQUFLNDNCLGFBQWUwQixFQUFJM1EsYUFDNUIsQ0FFUSw4QkFBQXNRLEdBQ0FqNUIsS0FBSzQzQixZQUFZdDNCLE9BQVMsSUFDMUJOLEtBQUs0M0IsWUFBYzUzQixLQUFLNDNCLFlBQVkyQixNQUFNLEdBQUksR0FFdEQsRUMzWEcsTUFBTUMsV0FBNEJuVSxFQUVyQyxXQUFBOVUsR0FDSTZDLE9BQ0osQ0FFQSxNQUFBdVQsQ0FBT25pQixHQUVILE1BQU11UyxFQUFPLElBQUlvUCxFQUFNM2hCLEVBQVN4RSxNQUUzQkEsS0FBS21FLE1BQVNuRSxLQUFLc2xCLE1BSXBCdGxCLEtBQUtzbEIsS0FBS2UsUUFBUXRQLEdBQ2xCQSxFQUFLdVAsWUFBWXRtQixLQUFLc2xCLE1BRXRCdGxCLEtBQUtzbEIsS0FBT3ZPLElBTlovVyxLQUFLbUUsS0FBTzRTLEVBQ1ovVyxLQUFLc2xCLEtBQU92TyxHQVFoQi9XLEtBQUtNLFFBQ1QsRUNuQkcsTUFBTW01QixXQUF5QnZwQixFQUVsQ29vQixnQkFFQUYsVUFBWSxJQUFJb0IsR0FFaEIsV0FBQWpwQixDQUFZdk8sR0FFUm9SLE1BQU0sQ0FDRlQsTUFBTzNRLEVBQVEyUSxNQUNmekcsVUFBV2xLLEVBQVFrSyxZQUd2QmxNLEtBQUtzNEIsZ0JBQWtCdDJCLEVBQVEwM0IsaUJBQ25DLENBRUEsSUFBQWxwQixHQUVJLE1BQU1ILEVBQWN2TSxTQUFTVyxjQUFjLFdBQzNDNEwsRUFBWW5FLFVBQVVDLElBQUluTSxLQUFLb1EsTUFBTWxFLFdBRXJDLE1BQU1SLEVBQVU1SCxTQUFTVyxjQUFjLE1BS3ZDLE9BSkFpSCxFQUFRTSxZQUFjaE0sS0FBS29RLE1BQU11QyxNQUVqQ3RDLEVBQVk5TCxZQUFZbUgsR0FFakIyRSxDQUNYLENBRUEsb0JBQUFzcEIsQ0FBcUJ2QixHQUVqQkEsRUFBVWpyQixTQUFRak4sSUFFZEYsS0FBSzQ1QixvQkFBb0IxNUIsRUFBSyxHQUV0QyxDQUVBLG1CQUFBMDVCLENBQW9COUIsR0FFaEI5M0IsS0FBS280QixVQUFVelIsT0FBT21SLEdBQ3RCOTNCLEtBQUtxUSxZQUFZOUwsWUFBWXV6QixFQUFTem5CLFlBQzFDLENBRUEsYUFBQXVvQixDQUFjbGtCLEdBRVYxVSxLQUFLNjRCLFVBRVEsS0FBVG5rQixJQUNBMVUsS0FBS280QixVQUFVanJCLFNBQVEycUIsSUFFYkEsRUFBUytCLFlBQVlDLG9CQUFvQnRSLFNBQVM5VCxJQUNwRG9qQixFQUFTOW1CLE1BQ2IsSUFHZ0JoUixLQUFLbzRCLFVBQVV2UyxLQUFJM2xCLEdBQVFBLEVBQUsyNUIsWUFBWUMsb0JBQW9CdFIsU0FBUzlULE1BR3pGMVUsS0FBS2dSLE9BR2pCLENBRUEsT0FBQTZuQixHQUNJNzRCLEtBQUsrUSxPQUVML1EsS0FBS280QixVQUFVanJCLFNBQVEycUIsSUFDbkJBLEVBQVMvbUIsTUFBTSxHQUV2QixFQ2xFRyxNQUFNZ3BCLFdBQXNCN3BCLEVBRXZCOHBCLFdBQ0FDLGFBQ0FDLGlCQUVSLFdBQUEzcEIsQ0FBWStuQixFQUFtQzNsQixFQUFld25CLEVBQXFCbHFCLEVBQWdCbXBCLEVBQW1CUyxHQUVsSHptQixNQUFNLENBQ0ZULE1BQU9BLEVBQ1B3bkIsWUFBYUEsRUFDYmxxQixPQUFRQSxJQUdaalEsS0FBS2c2QixXQUFhWixFQUNsQnA1QixLQUFLaTZCLGFBQWVKLEVBQ3BCNzVCLEtBQUtrNkIsaUJBQW1CNUIsRUFFeEJ0NEIsS0FBS3FULGNBQ1QsQ0FFQSxJQUFBN0MsR0FFSSxNQUFNSCxFQUFjdk0sU0FBU1csY0FBYyxPQUMzQzRMLEVBQVluRSxVQUFVQyxJQUFJLFNBQVUsZUFBZ0IsbUJBRXBEa0UsRUFBWXZMLGFBQWEsdUJBQXdCLDZCQUNqRHVMLEVBQVl2TCxhQUFhLFdBQVksS0FDckN1TCxFQUFZdkwsYUFBYSxPQUFRLFVBR2pDLE1BQU1zMUIsRUFBY3QyQixTQUFTVyxjQUFjLE9BQzNDMjFCLEVBQVlsdUIsVUFBVUMsSUFBSSxnQkFFMUIsTUFBTWt1QixFQUFNLElBQUkvVixFQUFRdGtCLEtBQUtvUSxNQUFNSCxPQUFRLFFBRTNDbXFCLEVBQVk3MUIsWUFBWTgxQixFQUFJaHFCLGFBRTVCQSxFQUFZOUwsWUFBWTYxQixHQUV4QixNQUFNRSxFQUFheDJCLFNBQVNXLGNBQWMsT0FDMUM2MUIsRUFBV3B1QixVQUFVQyxJQUFJLGVBRXpCLE1BQU1vdUIsRUFBYXoyQixTQUFTVyxjQUFjLEtBQzFDODFCLEVBQVdydUIsVUFBVUMsSUFBSSxlQUN6Qm91QixFQUFXbHNCLFVBQVlyTyxLQUFLb1EsTUFBTXVDLE1BRWxDMm5CLEVBQVcvMUIsWUFBWWcyQixHQUV2QixNQUFNQyxFQUFtQjEyQixTQUFTVyxjQUFjLEtBU2hELE9BUkErMUIsRUFBaUJ0dUIsVUFBVUMsSUFBSSxxQkFDL0JxdUIsRUFBaUJuc0IsVUFBWXJPLEtBQUtvUSxNQUFNK3BCLFlBR3hDRyxFQUFXLzFCLFlBQVlpMkIsR0FFdkJucUIsRUFBWTlMLFlBQVkrMUIsR0FFakJqcUIsQ0FDWCxDQUVBLFdBQUlyQyxHQUNBLE1BQU8sTUFDWCxDQUVBLGVBQUk2ckIsR0FDQSxPQUFPNzVCLEtBQUtpNkIsWUFDaEIsQ0FFQSxtQkFBSTNCLEdBQ0EsT0FBT3Q0QixLQUFLazZCLGdCQUNoQixDQUVBLGFBQUlkLEdBQ0EsT0FBT3A1QixLQUFLZzZCLFVBQ2hCLENBRUEsS0FBQTNvQixHQUNJclIsS0FBS3FRLFlBQVluRSxVQUFVQyxJQUFJLGtCQUMvQm5NLEtBQUtxUSxZQUFZZ0IsT0FDckIsQ0FFQSxXQUFBb1csR0FDSXpuQixLQUFLcVEsWUFBWW5FLFVBQVVoSixPQUFPLGlCQUN0QyxDQUdBLGdCQUFBMmtCLEdBQ0ksTUFBTTFLLEVBQWMsSUFBSUMsWUFBaUNuVyxFQUFhbVgsZUFBZ0IsQ0FDbEZmLE9BQVEsQ0FDSmdCLFFBQVNsWCxFQUFTcVosZUFDbEJwUCxNQUFPcFIsS0FBS281QixhQUlwQnQxQixTQUFTeVosY0FBY0osRUFDM0IsQ0FFQSxZQUFBOUosR0FFSXJULEtBQUtxUSxZQUFZakIsaUJBQWlCLGFBQWEsS0FFM0MsTUFBTTJILEVBQTZCL1csS0FBS2s2QixpQkFBaUI5QixVQUFVbFMsS0FBS2xtQixNQUV4RUEsS0FBS2s2QixpQkFBaUI1QixnQkFBZ0JuUSxrQkFBa0JwUixFQUFNLElBR2xFL1csS0FBS3FRLFlBQVlqQixpQkFBaUIsU0FBVXdFLElBRXhDQSxFQUFNWSxpQkFDTlosRUFBTThhLGtCQUVOMXVCLEtBQUs2bkIsa0JBQWtCLEdBRS9CLEVDcEhHLE1BQU00UyxHQUVULFlBQU8xVixHQUVILE1BQU1qUyxFQUF1QjJrQixHQUFVdnNCLGNBRWpDd3ZCLEVBQXVDLElBQUlqQixHQUFpQixDQUFFQyxrQkFBbUI1bUIsRUFBV0gsTUFBTyxlQUFnQnpHLFVBQVcsa0JBRXBJd3VCLEVBQW1CZixxQkFBcUIsQ0FDcEMsSUFBSUksR0FBY1csRUFBb0IsT0FBUSwrQkFBZ0MsdUJBQXdCL3hCLEVBQXNCd0IsY0FBY3BCLFVBQVcsb0JBQ3JKLElBQUlneEIsR0FBY1csRUFBb0IsZ0JBQWlCLHFDQUFzQywrQkFBZ0MsZ0JBQWlCLG1DQUM5SSxJQUFJWCxHQUFjVyxFQUFvQixnQkFBaUIsbUNBQW9DLCtCQUFnQyxnQkFBaUIsNkVBQzVJLElBQUlYLEdBQWNXLEVBQW9CLFFBQVMscUNBQXNDLHNCQUF1Qi94QixFQUFzQndCLGNBQWNMLE1BQU8sZUFDdkosSUFBSWl3QixHQUFjVyxFQUFvQixVQUFXLDJDQUE0QzF6QixFQUFNMnpCLFFBQVNoeUIsRUFBc0J3QixjQUFjSCxRQUFTLDBCQUN6SixJQUFJK3ZCLEdBQWNXLEVBQW9CLE9BQVEsd0JBQXlCLDJCQUE0QixPQUFRLDZCQUMzRyxJQUFJWCxHQUFjVyxFQUFvQixRQUFTLDZCQUE4Qix1QkFBd0IsUUFBUyx1Q0FDOUcsSUFBSVgsR0FBY1csRUFBb0IsWUFBYSw4QkFBK0Isb0JBQXFCL3hCLEVBQXNCd0IsY0FBY1gsU0FBVSx5QkFDckosSUFBSXV3QixHQUFjVyxFQUFvQixZQUFhLGdDQUFpQyxvQkFBcUIveEIsRUFBc0J3QixjQUFjVixTQUFVLHlCQUN2SixJQUFJc3dCLEdBQWNXLEVBQW9CLFlBQWEsMEJBQTJCLDJCQUE0QixZQUFhLGlDQUczSDVuQixFQUFVNlQsT0FBTytULEdBRWpCLE1BQU1FLEVBQXFCLElBQUluQixHQUFpQixDQUFFQyxrQkFBbUI1bUIsRUFBV0gsTUFBTyxRQUFTekcsVUFBVyxrQkFFM0cwdUIsRUFBbUJqQixxQkFBcUIsQ0FDcEMsSUFBSUksR0FBY2EsRUFBb0IsUUFBUyxnQkFBaUI1ekIsRUFBTTBHLE1BQU8vRSxFQUFzQndCLGNBQWNKLE1BQU8sd0RBQ3hILElBQUlnd0IsR0FBY2EsRUFBb0IsUUFBUyxlQUFnQjV6QixFQUFNNnpCLE1BQU8sUUFBUyxvREFHekYvbkIsRUFBVTZULE9BQU9pVSxHQUVqQixNQUFNRSxFQUF1QixJQUFJckIsR0FBaUIsQ0FBRUMsa0JBQW1CNW1CLEVBQVdILE1BQU8sVUFBV3pHLFVBQVcsb0JBRS9HNHVCLEVBQXFCbkIscUJBQXFCLENBQ3RDLElBQUlJLEdBQWNlLEVBQXNCLFlBQWEsZ0NBQWlDLG9CQUFxQm55QixFQUFzQndCLGNBQWNaLFNBQVUseUJBQ3pKLElBQUl3d0IsR0FBY2UsRUFBc0IsWUFBYSw4QkFBK0Isb0JBQXFCbnlCLEVBQXNCd0IsY0FBY1gsU0FBVSx5QkFDdkosSUFBSXV3QixHQUFjZSxFQUFzQixZQUFhLGdDQUFpQyxvQkFBcUJueUIsRUFBc0J3QixjQUFjVixTQUFVLHlCQUN6SixJQUFJc3dCLEdBQWNlLEVBQXNCLFlBQWEsaUNBQWtDLG9CQUFxQm55QixFQUFzQndCLGNBQWNULFNBQVUseUJBQzFKLElBQUlxd0IsR0FBY2UsRUFBc0IsWUFBYSw4QkFBK0Isb0JBQXFCbnlCLEVBQXNCd0IsY0FBY1IsU0FBVSx5QkFDdkosSUFBSW93QixHQUFjZSxFQUFzQixZQUFhLG9DQUFxQyxvQkFBcUJueUIsRUFBc0J3QixjQUFjUCxTQUFVLDJCQUdqS2tKLEVBQVU2VCxPQUFPbVUsR0FHakIsTUFBTUMsRUFBb0IsSUFBSXRCLEdBQWlCLENBQUVDLGtCQUFtQjVtQixFQUFXSCxNQUFPLE9BQVF6RyxVQUFXLGlCQUV6RzZ1QixFQUFrQnBCLHFCQUFxQixDQUNuQyxJQUFJSSxHQUFjZ0IsRUFBbUIsWUFBYSwrQkFBZ0MsNkJBQThCLFlBQWEsaUNBQzdILElBQUloQixHQUFjZ0IsRUFBbUIsZ0JBQWlCLHFDQUFzQywrQkFBZ0MsZ0JBQWlCLG1DQUM3SSxJQUFJaEIsR0FBY2dCLEVBQW1CLGdCQUFpQixtQ0FBb0MsK0JBQWdDLGdCQUFpQiwrRUFHL0lqb0IsRUFBVTZULE9BQU9vVSxHQUdqQixNQUFNQyxFQUFlLElBQUl2QixHQUFpQixDQUFFQyxrQkFBbUI1bUIsRUFBV0gsTUFBTyxRQUFTekcsVUFBVyxrQkFXckcsT0FUQTh1QixFQUFhckIscUJBQXFCLENBQzlCLElBQUlJLEdBQWNpQixFQUFjLGNBQWUsK0JBQWdDLDZCQUE4QixZQUFhLGlDQUMxSCxJQUFJakIsR0FBY2lCLEVBQWMsa0JBQW1CLG1DQUFvQywrQkFBZ0MsZ0JBQWlCLDZFQUN4SSxJQUFJakIsR0FBY2lCLEVBQWMsVUFBVyxxQ0FBc0MsK0JBQWdDLGdCQUFpQixtQ0FDbEksSUFBSWpCLEdBQWNpQixFQUFjLGNBQWUsbUNBQW9DLCtCQUFnQyxnQkFBaUIsK0VBR3hJbG9CLEVBQVU2VCxPQUFPcVUsR0FFVmxvQixDQUNYLEVDeEVHLE1BQU1tb0IsV0FBYy9xQixFQUV2QixXQUFBSyxDQUFZYSxHQUVSZ0MsTUFBTSxDQUNGaEMsTUFBT0EsSUFHWHBSLEtBQUtxVCxjQUNULENBRUEsSUFBQTdDLEdBRUksTUFBTUgsRUFBY3ZNLFNBQVNXLGNBQWMsT0FDM0M0TCxFQUFZbkUsVUFBVUMsSUFBSSxTQUUxQixNQUFNK3VCLEVBQUtwM0IsU0FBU1csY0FBYyxNQVVsQyxPQVRBeTJCLEVBQUdwMkIsYUFBYSxrQkFBbUIsUUFDbkNvMkIsRUFBR3AyQixhQUFhLG1CQUFvQixZQUVoQzlFLEtBQUtvUSxNQUFNZ0IsUUFDWDhwQixFQUFHbHZCLFlBQWNoTSxLQUFLb1EsTUFBTWdCLE9BR2hDZixFQUFZOUwsWUFBWTIyQixHQUVqQjdxQixDQUNYLENBRUEsWUFBQWdELEdBQ0lyVCxLQUFLcVEsWUFBWWpCLGlCQUFpQixXQUFZd0UsSUFDekIsU0FBYkEsRUFBTXhOLE1BQ053TixFQUFNWSxpQkFDTjFRLFNBQVN5WixjQUFjLElBQUlILFlBQVluVyxFQUFhazBCLHNCQUF1QixDQUFDLElBQ2hGLEdBRVIsQ0FFQSxhQUFPOXZCLENBQU8rRixHQUNWLE9BQU8sSUFBSTZwQixHQUFNN3BCLEVBQ3JCLEVDekNHLE1BQU1ncUIsR0FDVCxZQUFPclcsR0FDSCxPQUFPa1csR0FBTTV2QixPQUFPckgsT0FBT3lQLGNBQWNkLE1BQzdDLEVDTUcsTUFBTTBvQixXQUFnQm5yQixFQUN6QixXQUFBSyxHQUVJNkMsTUFBTSxDQUFDLEdBRVBwVCxLQUFLbW5CLGFBQ1QsQ0FFQSxJQUFBM1csR0FFSSxNQUFNSCxFQUFjdk0sU0FBU1csY0FBYyxPQU8zQyxPQU5BNEwsRUFBWW5FLFVBQVVDLElBQUksV0FFdEJuSSxPQUFPeVAsYUFDUHBELEVBQVlzVyxPQUFPaGUsRUFBc0I0QyxrQkFHdEM4RSxDQUNYLENBV0Esb0JBQUFpckIsR0FDSXgzQixTQUFTc0wsaUJBQWlCLGFBQWN3RSxJQUNwQyxNQUFNcFAsRUFBVW9QLEVBQU1oUSxPQUN0QixJQUFJME0sRUFFQTlMLElBRUk4TCxFQURBOUwsRUFBUXNQLFVBQVlELEtBQUtFLFVBQ2hCdlAsRUFBUXNNLGNBRVJ0TSxFQUdUOEwsR0FBVUEsRUFBTzRELFFBQVEsa0JBQ3pCbFEsT0FBTytRLGdCQUFnQlMsa0JBRS9CLEdBRVIsQ0FFQSxXQUFBMlIsR0FFSW5uQixLQUFLczdCLHVCQUNMdDdCLEtBQUt1N0Isc0JBRUx6M0IsU0FBU3NMLGlCQUFpQixjQUFjLEtBQ3BDLE1BQU1vc0IsRUFBa0IxM0IsU0FBU0MsY0FBYyxpQ0FDM0N5M0IsSUFFQUEsRUFBZ0J4dkIsWUFBYyxVQUU5QmlLLFlBQVcsS0FDUHVsQixFQUFnQnh2QixZQUFjLE1BQU0sR0FDckMsTUFDUCxJQUlKbEksU0FBU3NMLGlCQUFpQixvQkFBb0IsV0FDMUMsTUFBTXdnQixFQUFTOXJCLFNBQVNDLGNBQWMsb0JBRXRDLEdBQUk2ckIsRUFBUSxDQUNSLElBQUk2TCxFQUFTN0wsRUFBTzFOLGlCQUFpQixVQUVyQyxHQUFxQixHQUFqQnVaLEVBQU9uN0IsT0FBYSxDQUVwQixNQUFNa1AsRUFBSWlzQixFQUFPLEdBQUcxM0IsY0FBYyw2QkFDZixJQUFmeUwsRUFBRW5CLFdBQ0ZtQixFQUFFNkIsT0FFVixDQUNKLENBQ0osSUFLQXJSLEtBQUtxUSxZQUFZakIsaUJBQWlCLFdBQVc2WSxNQUFPclUsSUFFaEQsTUFBTWQsRUFBWVgsRUFBb0JFLFNBQVNFLFFBQW9CLGNBQzdEWSxFQUFlaEIsRUFBb0JFLFNBQVNFLFFBQXNDLGdDQUV4RixLQUFJcUIsRUFBTWtsQixTQUFXbGxCLEVBQU13ZSxVQUFZeGUsRUFBTW1sQixRQUk3QyxHQUFrQixVQUFkbmxCLEVBQU14TixLQUFvQjBNLEVBQVVwQyxXQUFjeUMsRUFBYXpDLFVBVTVELEdBQWtCLGNBQWRrRCxFQUFNeE4sSUFBcUIsQ0FDbEMsTUFBTXhDLEVBQVNnUSxFQUFNaFEsT0FFakJBLEVBQU9zSSxVQUFVMEUsU0FBUyw2QkFBOEQsS0FBL0JoTixFQUFPb0ksYUFBYXNNLFFBRTdFMUUsRUFBTThuQiwyQkFFTjUzQixTQUFTeVosY0FBYyxJQUFJSCxZQUFpQ25XLEVBQWFtWCxlQUFnQixDQUNyRmYsT0FBUSxDQUNKZ0IsUUFBU2xYLEVBQVN3MEIseUJBSTFCNzNCLFNBQVN5WixjQUFjLElBQUlILFlBQWlDblcsRUFBYW1YLGVBQWdCLENBQ3JGZixPQUFRLENBQ0pnQixRQUFTbFgsRUFBU3cwQiwwQkFHbkIvM0IsRUFBT3NJLFVBQVUwRSxTQUFTLDZCQUErQmhOLEVBQU9vSSxhQUFhc00sTUFJNUYsTUFBTyxHQUFrQixXQUFkMUUsRUFBTXhOLElBQWtCLENBQy9CLE1BQU14QyxFQUFTZ1EsRUFBTWhRLE9BRWpCQSxFQUFPc0ksVUFBVTBFLFNBQVMsNkJBQThELEtBQS9CaE4sRUFBT29JLGFBQWFzTSxRQUV0RTFVLEVBQU9zSSxVQUFVMEUsU0FBUyw2QkFBK0JoTixFQUFPb0ksYUFBYXNNLE1BRzVGLEtBQXlCLGVBQWQxRSxFQUFNeE4sS0FBd0JpMUIsR0FBUU8sY0FBY2hvQixFQUFNaFEsU0FFNUMsY0FBZGdRLEVBQU14TixLQUF1QmkxQixHQUFRUSxnQkFBZ0Jqb0IsRUFBTWhRLFNBRTdDLGNBQWRnUSxFQUFNeE4sS0FBdUJpMUIsR0FBUVMsc0JBRXZCLFlBQWRsb0IsRUFBTXhOLEtBQXFCaTFCLEdBQVFVLDJCQTVDMUNub0IsRUFBTVksaUJBQ05aLEVBQU04bkIsMkJBRU41M0IsU0FBU3laLGNBQWMsSUFBSUgsWUFBaUNuVyxFQUFhbVgsZUFBZ0IsQ0FDckZmLE9BQVEsQ0FDSmdCLFFBQVNsWCxFQUFTNjBCLGFBeUM5QixHQUVSLENBb0JBLG1CQUFBVCxHQUNJejNCLFNBQVNzTCxpQkFBaUIsU0FBUyxTQUFVd0UsR0FDekMsR0FBSUEsRUFBTWhRLGtCQUFrQjhSLFlBQWEsQ0FDckMsTUFBTTJGLEVBQWtCekgsRUFBTWhRLE9BRTlCLEdBQUl5WCxFQUFnQkMsbUJBQ1pELEVBQWdCNGdCLGFBQWEsb0JBQXFCLENBQ2xELE1BQU1DLEVBQW9CN2dCLEVBQWdCOUcsYUFBYSxvQkFFWCxLQUF4QzhHLEVBQWdCclAsYUFBYXNNLFNBQzdCK0MsRUFBZ0J2VyxhQUFhLG1CQUFvQm8zQixHQUFxQixJQUN0RTdnQixFQUFnQnJQLFlBQWMsR0FFdEMsQ0FFUixDQUNKLEdBQ0osQ0FFQSxvQkFBTzR2QixDQUFjaDRCLEdBQ2pCLE1BQU11NEIsRUFBa0J2NEIsRUFBT3NRLFFBQVEsY0FDdkMsSUFBS2lvQixFQUFpQixPQUFPLEVBRTdCLE1BQU1ybEIsRUFBWTlTLE9BQU8rUSxlQUN6QixJQUFLK0IsRUFBVTlCLFdBQVksT0FBTyxFQUVsQyxNQUFNQyxFQUFRNkIsRUFBVTVCLFdBQVcsR0FDbkMsSUFBSWtuQixFQUF1Qm5uQixFQUFNOEMsYUFJakMsT0FISXFrQixFQUFRdG9CLFdBQWFELEtBQUtFLFlBQzFCcW9CLEVBQVVBLEVBQVFsM0IsWUFFZitQLEVBQU1vbkIsV0FBYUQsSUFBWUQsR0FBbUJsbkIsRUFBTStDLGFBQWUvQyxFQUFNOEMsYUFBYS9MLGFBQWUsSUFBSTFMLE1BQ3hILENBRUEsc0JBQU91N0IsQ0FBZ0JqNEIsR0FDbkIsTUFBTXU0QixFQUFrQnY0QixFQUFPc1EsUUFBUSxjQUN2QyxJQUFLaW9CLEVBQWlCLE9BQU8sRUFFN0IsTUFBTXJsQixFQUFZOVMsT0FBTytRLGVBQ3pCLElBQUsrQixFQUFVOUIsV0FBWSxPQUFPLEVBRWxDLE1BQU1DLEVBQVE2QixFQUFVNUIsV0FBVyxHQUVuQyxJQUFJc1IsRUFBeUJ2UixFQUFNMkMsZUFJbkMsT0FISTRPLEVBQVUxUyxXQUFhRCxLQUFLRSxZQUM1QnlTLEVBQVlBLEVBQVV0aEIsWUFFbkIrUCxFQUFNb25CLFdBQWE3VixJQUFjMlYsR0FBeUMsSUFBdEJsbkIsRUFBTTRDLFdBQ3JFLENBRUEsMkJBQU95a0IsQ0FBcUI5M0IsR0FDeEIsTUFBTXNTLEVBQVk5UyxPQUFPK1EsZUFDekIsSUFBSytCLEVBQVU5QixXQUFZLE9BQU8sRUFDbEMsTUFBTUMsRUFBUTZCLEVBQVU1QixXQUFXLEdBQUdxbkIsYUFNdEMsT0FMQXRuQixFQUFNeUYsVUFBUyxHQUNmekYsRUFBTTZDLFNBQVN0VCxFQUFTLEdBQ1B5USxFQUFNbEQsd0JBQXdCdEQsTUFDNUJqSyxFQUFRdU4sd0JBQXdCdEQsR0FHdkQsQ0FFQSwwQkFBTyt0QixDQUFvQmg0QixHQUN2QixNQUFNc1MsRUFBWTlTLE9BQU8rUSxlQUN6QixJQUFLK0IsRUFBVTlCLFdBQVksT0FBTyxFQUNsQyxNQUFNQyxFQUFRNkIsRUFBVTVCLFdBQVcsR0FBR3FuQixhQU10QyxPQUxBdG5CLEVBQU15RixVQUFTLEdBQ2Z6RixFQUFNMEMsT0FBT25ULEVBQVNBLEVBQVFrVSxXQUFXcFksUUFDckIyVSxFQUFNbEQsd0JBQXdCcWhCLFNBQzVCNXVCLEVBQVF1Tix3QkFBd0JxaEIsTUFHMUQsQ0FHQSxvQkFBT3FKLENBQWM3b0IsR0FDakIsTUFBTWtELEVBQVk5UyxPQUFPK1EsZUFDekIsSUFBSytCLEVBQVU5QixXQUFZLE9BQU95VyxRQUFRbFosU0FBUSxHQUVsRCxNQUNNbXFCLEVBRGdCNWxCLEVBQVU1QixXQUFXLEdBQUdxbkIsYUFDWHhxQix3QkFFbkMsT0FBTyxJQUFJMFosU0FBaUJsWixJQUN4QjBELFlBQVcsS0FDUCxNQUNNMG1CLEVBRFc3bEIsRUFBVTVCLFdBQVcsR0FBR3FuQixhQUNoQnhxQix3QkFFbkI2cUIsSUFBWUYsRUFBYWp1QixNQUFRa3VCLEVBQVFsdUIsS0FBT2l1QixFQUFheHFCLE9BQVN5cUIsRUFBUXpxQixNQUMvRTBxQixHQUNEaHBCLEVBQU1ZLGlCQUVWakMsRUFBUXFxQixFQUFRLEdBQ2pCLEVBQUUsR0FFYixDQUVBLDBCQUFPYixHQUNILE1BQU1qbEIsRUFBWTlTLE9BQU8rUSxlQUN6QixJQUFLK0IsSUFBY0EsRUFBVTlCLFdBQVksT0FBTyxFQUVoRCxNQUFNQyxFQUFRNkIsRUFBVTVCLFdBQVcsR0FFbkMsT0FBNkIsSUFBdEJELEVBQU00QyxhQUFxQjVDLEVBQU0yQyxpQkFBbUIzQyxFQUFNb0UsdUJBQ3JFLENBRUEseUJBQU95aUIsR0FDSCxNQUFNaGxCLEVBQVk5UyxPQUFPK1EsZUFDekIsSUFBSytCLElBQWNBLEVBQVU5QixXQUFZLE9BQU8sRUFFaEQsTUFBTUMsRUFBUTZCLEVBQVU1QixXQUFXLEdBRW5DLE9BQU9ELEVBQU0rQyxZQUFjL0MsRUFBTThDLGFBQWEvTCxhQUFhMUwsUUFBVTJVLEVBQU04QyxlQUFpQjlDLEVBQU1vRSx1QkFDdEcsQ0FFQSxrQkFBT25PLEdBSUgsT0FGeUJpSCxFQUFvQkUsU0FBU0UsUUFBNEIsc0JBQzNESixFQUFvQkUsU0FBU0UsUUFBeUIsbUJBQ3RFLElBQUk4b0IsRUFDZixFQ3BTRyxNQUFNd0IsR0FDVCxZQUFPOVgsR0FDSCxPQUFPc1csR0FBUW53QixhQUNuQixHZERKLFNBQVlpc0IsR0FFUixvQkFFQSx3QkFFQSx3QkFFQSx5QkFDSCxDQVRELENBQVlBLEtBQUFBLEdBQVUsS0NKdEIsU0FBWUMsR0FDUixrQkFDQSxZQUNBLGNBQ0EsK0JBQ0gsQ0FMRCxDQUFZQSxLQUFBQSxHQUFXLEtjR2hCLE1BQU0wRixHQUVULGFBQU94dkIsQ0FBT1QsRUFBeUIyQixFQUEwQixNQUM3RCxNQUFNdXVCLEVBQStCLE9BQWJ2dUIsR0FBcUJBLEdBQVksR0FBS0EsR0FBWTNCLEVBQU1td0IsS0FBSzE4QixPQUFVa08sRUFBVzNCLEVBQU1td0IsS0FBSzE4QixPQUMvRzI4QixFQUFTcHdCLEVBQU1xd0IsVUFBVUgsR0FFekJJLEVBQWEza0IsTUFBTUMsS0FBSzVMLEVBQU1td0IsTUFBTUksUUFBTyxDQUFDQyxFQUFLbndCLElBQVE0VyxLQUFLdVosSUFBSUEsRUFBS253QixFQUFJb3dCLE1BQU1oOUIsU0FBUyxHQUNoRyxJQUFJaTlCLEVBQWdCLEdBRXBCLElBQUssSUFBSS84QixFQUFJLEVBQUdBLEVBQUkyOEIsRUFBWTM4QixJQUFLLENBQ2pDLE1BQU02TSxFQUFPNHZCLEVBQU9PLGFBQ3BCbndCLEVBQUtwQixnQkFBa0IsT0FDdkJvQixFQUFLdkksYUFBYSxtQkFBb0IsY0FFdEN5NEIsRUFBYzk5QixLQUFLNE4sRUFDdkIsQ0FFQTRJLFlBQVcsS0FDUHNuQixFQUFjcHdCLFNBQVFFLEdBQVFBLEVBQUtuQixVQUFVaEosT0FBTyxxQkFBb0IsR0FDekUsSUFDUCxDQUVBLGdCQUFPc0ssQ0FBVVgsRUFBeUIyQixFQUEwQixNQUNoRSxNQUFNdXVCLEVBQThCLE9BQWJ2dUIsRUFBb0JBLE9BQVcxTixFQUN0RCxJQUFJeThCLEVBQWdCLEdBRXBCLElBQUssSUFBSS84QixFQUFJLEVBQUdBLEVBQUlxTSxFQUFNbXdCLEtBQUsxOEIsT0FBUUUsSUFBSyxDQUN4QyxNQUFNNk0sRUFBT1IsRUFBTW13QixLQUFLeDhCLEdBQUdnOUIsV0FBV1QsR0FDdEMxdkIsRUFBS3BCLGdCQUFrQixPQUN2Qm9CLEVBQUt2SSxhQUFhLG1CQUFvQixRQUV0Q3k0QixFQUFjOTlCLEtBQUs0TixFQUN2QixDQUVBNEksWUFBVyxLQUNQc25CLEVBQWNwd0IsU0FBUUUsR0FBUUEsRUFBS25CLFVBQVVoSixPQUFPLHFCQUFvQixHQUN6RSxJQUNQLENBR0EsbUJBQU91NkIsQ0FBYTV3QixFQUF5QlEsR0FDekMsSUFBS1IsRUFBTStELFNBQVN2RCxHQUNoQixPQUFPLEVBR1gsTUFBTXF3QixFQUFVcndCLEVBQUt5RCxjQUVyQixPQUFPekQsSUFEZXF3QixFQUFRSixNQUFNSSxFQUFRSixNQUFNaDlCLE9BQVMsRUFFL0QsQ0FFQSxnQkFBT3E5QixDQUFVOXdCLEVBQXlCUSxHQUN0QyxRQUFLUixFQUFNK0QsU0FBU3ZELElBSUpBLEVBQUt5RCxnQkFDRWpFLEVBQU1td0IsS0FBS253QixFQUFNbXdCLEtBQUsxOEIsT0FBUyxFQUUxRCxDQUVBLHlCQUFPczlCLENBQW1CdndCLEdBQ3RCLEdBQW1DLE9BQS9CQSxFQUFLNkosUUFBUXlSLGVBQXlELE9BQS9CdGIsRUFBSzZKLFFBQVF5UixjQUNwRCxNQUFNLElBQUlya0IsTUFBTSw2Q0FHcEIsTUFDTXVJLEVBRE1RLEVBQUt5RCxjQUNDQSxjQUNaK3NCLEVBQWN4d0IsRUFBS3l3QixVQVd6QixJQUFLLElBQUl0OUIsRUFBSSxFQUFHQSxFQUFJcU0sRUFBTW13QixLQUFLMThCLE9BQVFFLElBQy9CcTlCLEVBQWNoeEIsRUFBTW13QixLQUFLeDhCLEdBQUc4OEIsTUFBTWg5QixRQUNsQ3VNLEVBQU1td0IsS0FBS3g4QixHQUFHdTlCLFdBQVdGLEVBV3JDLENBRUEsc0JBQU9HLENBQWdCM3dCLEdBQ25CLEdBQW1DLE9BQS9CQSxFQUFLNkosUUFBUXlSLGVBQXlELE9BQS9CdGIsRUFBSzZKLFFBQVF5UixjQUNwRCxNQUFNLElBQUlya0IsTUFBTSw2Q0FHcEIsTUFBTTRJLEVBQU1HLEVBQUt5RCxjQUNINUQsRUFBSTRELGNBU1ptdEIsVUFBVS93QixFQUFJZ3hCLFNBS3hCLENBRUEseUJBQU9DLEdBQ0gsTUFBTWpsQixFQUFnQnBWLFNBQVNvVixjQUUvQixNQUE2QyxPQUF6Q0EsR0FBZWhDLFFBQVF5UixjQUNoQnpQLEVBR0pBLEdBQWVoRixRQUFRLE9BQWlDLElBQ25FLENBbUJBLHVCQUFPa3FCLENBQWlCdnhCLEdBQ3BCLElBQUssSUFBSXJNLEVBQUlxTSxFQUFNbXdCLEtBQUsxOEIsT0FBUyxFQUFHRSxHQUFLLEVBQUdBLElBQUssQ0FDN0MsTUFBTTBNLEVBQU1MLEVBQU1td0IsS0FBS3g4QixHQUN2QixJQUFLLElBQUk2OUIsRUFBSW54QixFQUFJb3dCLE1BQU1oOUIsT0FBUyxFQUFHKzlCLEdBQUssRUFBR0EsSUFBSyxDQUM1QyxNQUFNaHhCLEVBQU9ILEVBQUlvd0IsTUFBTWUsR0FDdkIsR0FBSWh4QixFQUFLaU8sa0JBQW1CLE9BQU9qTyxDQUN2QyxDQUNKLENBQ0EsT0FBTyxJQUNYLENBRUEsd0JBQU9peEIsQ0FBa0J6eEIsR0FDckIsSUFBSyxJQUFJck0sRUFBSSxFQUFHQSxFQUFJcU0sRUFBTW13QixLQUFLMThCLE9BQVFFLElBQUssQ0FDeEMsTUFBTTBNLEVBQU1MLEVBQU1td0IsS0FBS3g4QixHQUN2QixJQUFLLElBQUk2OUIsRUFBSSxFQUFHQSxFQUFJbnhCLEVBQUlvd0IsTUFBTWg5QixPQUFRKzlCLElBQUssQ0FDdkMsTUFBTWh4QixFQUFPSCxFQUFJb3dCLE1BQU1lLEdBQ3ZCLEdBQUloeEIsRUFBS2lPLGtCQUFtQixPQUFPak8sQ0FDdkMsQ0FDSixDQUNBLE9BQU8sSUFDWCxDQUVBLHNCQUFPa3hCLENBQWdCMXhCLEVBQXlCUSxFQUE0Qm14QixHQUV4RSxJQUFLbnhCLEVBQUt5RCxjQUNOLE9BQU8sS0FHWCxNQUFNb3RCLEVBQVk3d0IsRUFBS3lELGNBQXNDb3RCLFNBQ3ZESixFQUFZendCLEVBQUt5d0IsVUFFdkIsT0FBUVUsR0FDSixLQUFLckgsR0FBV3NILFdBQ1osT0FBUXB4QixFQUFLeUQsY0FBc0N3c0IsTUFBTVEsRUFBWSxJQUFNLEtBQy9FLEtBQUszRyxHQUFXdUgsVUFDWixPQUFRcnhCLEVBQUt5RCxjQUFzQ3dzQixNQUFNUSxFQUFZLElBQU0sS0FDL0UsS0FBSzNHLEdBQVd3SCxRQUNaLE9BQU85eEIsRUFBTW13QixLQUFLa0IsRUFBVyxJQUFJWixNQUFNUSxJQUFjLEtBQ3pELEtBQUszRyxHQUFXeUgsVUFDWixPQUFPL3hCLEVBQU1td0IsS0FBS2tCLEVBQVcsSUFBSVosTUFBTVEsSUFBYyxLQUc3RCxPQUFPLElBQ1gsQ0FHQSw0QkFBT2UsQ0FDSGh5QixFQUNBc1IsRUFDQXBRLEdBRUEsSUFBSSt3QixFQUFrRyxLQUV0RyxPQUFRM2dCLEdBQ0osS0FBS2laLEdBQVkySCxPQUNiLE1BQU1sQixFQUFlaHhCLEVBQU05SSxjQUFjLGdCQUF5Qys1QixlQUM5RGg5QixJQUFoQis4QixJQUNBaUIsRUFBZ0JqeUIsRUFBTXFWLGlCQUFpQixnQkFBZ0IyYixFQUFjLE9BRXpFLE1BQ0osS0FBS3pHLEdBQVk0SCxJQUNiLE1BQU1DLEVBQWVweUIsRUFBTTlJLGNBQWMsZUFDckNrN0IsSUFFQUgsRUFEWUcsRUFBYW51QixjQUNMd3NCLE9BRXhCLE1BQ0osS0FBS2xHLEdBQVk4SCxLQUdqQixLQUFLOUgsR0FBWStILGNBQ2JMLEVBQWdCanlCLEVBQU1xVixpQkFBaUIsZUFDdkMsTUFDSixRQUNJLE1BQU0sSUFBSTVkLE1BQU0sa0JBR3BCdzZCLEdBSUF0bUIsTUFBTUMsS0FBS3FtQixHQUFlM3hCLFNBQVNFLElBTS9CQSxFQUFLMUosTUFBTWdMLE9BQVMsY0FBY1osR0FBTyxHQWVyRCxHYnZQSixTQUFZc3BCLEdBQ1IsZ0JBQ0EsZ0JBQ0EsaUJBQ0gsQ0FKRCxDQUFZQSxLQUFBQSxHQUFZLEtDQXhCLFNBQVlDLEdBQ1IsY0FDQSxjQUNBLGVBQ0gsQ0FKRCxDQUFZQSxLQUFBQSxHQUFjLEthbUJuQixNQUFNOEgsV0FBb0MvUCxHQUVyQ3htQixVQUFvQix1QkFDcEJBLGdCQUVSMlYsV0FDQTZnQixjQUF3QyxHQUN4Q0Msa0JBQWlELEtBRWpEQyx1QkFHQUMsV0FNQUMsY0FBZ0NuSSxHQUFlb0ksS0FDL0NDLGVBQXlCLEVBQ3pCOWYsYUFBdUIsR0FFdkIsWUFBb0JyQixFQUF5QitnQixHQUV6QyxHQUFJSCxHQUE0QjlzQixTQUM1QixNQUFNLElBQUloTyxNQUFNLGtFQUdwQjhPLE1BQU1nc0IsR0FBNEJ6L0IsSUFDbENLLEtBQUs0L0IsYUFBZTUvQixLQUFLNC9CLGFBQWF2WCxLQUFLcm9CLE1BQzNDQSxLQUFLcVEsWUFBWTFNLE1BQU1pdEIsT0FBU3RwQixFQUFPdTRCLG9CQUN2QzcvQixLQUFLdy9CLFdBQWEsSUFBSU0sZ0JBQ3RCOS9CLEtBQUt3ZSxXQUFhQSxFQUNsQnhlLEtBQUt1L0IsdUJBQXlCQSxFQUU5QnYvQixLQUFLcVQsY0FDVCxDQUVBLFlBQUFBLEdBRUl2UCxTQUFTc0wsaUJBQWlCN0gsRUFBZ0J3NEIsVUFBVy8vQixLQUFLZ2dDLGdCQUFnQjNYLEtBQUtyb0IsT0FDL0U4RCxTQUFTc0wsaUJBQWlCN0gsRUFBZ0IwNEIsVUFBV2pnQyxLQUFLa2dDLGdCQUFnQjdYLEtBQUtyb0IsT0FDL0U4RCxTQUFTc0wsaUJBQWlCN0gsRUFBZ0I0NEIsUUFBU25nQyxLQUFLb2dDLGNBQWMvWCxLQUFLcm9CLE9BRzNFOEQsU0FBU3NMLGlCQUFpQjdILEVBQWdCODRCLFFBQVNyZ0MsS0FBS3NnQyxrQ0FBa0NqWSxLQUFLcm9CLE9BQy9GOEQsU0FBU3NMLGlCQUFpQjdILEVBQWdCODRCLFFBQVNyZ0MsS0FBS3VnQyx5Q0FBeUNsWSxLQUFLcm9CLE9BQ3RHOEQsU0FBU3NMLGlCQUFpQjdILEVBQWdCODRCLFFBQVNyZ0MsS0FBS3dnQyxjQUFjblksS0FBS3JvQixPQUMzRThELFNBQVNzTCxpQkFBaUI3SCxFQUFnQms1QixNQUFPemdDLEtBQUswZ0MsWUFBWXJZLEtBQUtyb0IsT0FFdkVBLEtBQUtnb0IsZ0JBRUw1VSxNQUFNQyxjQUNWLENBRVEsZUFBQTJzQixDQUFnQnBzQixHQUVwQixNQUNNdkcsRUFEU3VHLEVBQU1oUSxPQUNEc1EsUUFBUWdqQixHQUFZaUMsSUFFcEM5ckIsSUFDQWdDLFFBQVFDLElBQUksdUJBQXdCc0UsRUFBTWhRLFFBRTFDZ1EsRUFBTThuQiwyQkFFTjE3QixLQUFLdy9CLFdBQVdtQixRQUVadHpCLEdBQVFyTixLQUFLcy9CLG1CQUNidC9CLEtBQUtnUixPQUdUaFIsS0FBSzRnQyxXQUNMNWdDLEtBQUs2Z0MsZ0JBQWdCeHpCLEdBQ3JCck4sS0FBSzIvQixlQUFnQixFQUNyQjMvQixLQUFLeS9CLGNBQWdCbkksR0FBZW9JLEtBRTVDLENBRVEsZUFBQVEsQ0FBZ0J0c0IsR0FDcEIsR0FBSTVULEtBQUsyL0IsY0FBZSxDQUVwQixNQUNNdHlCLEVBRFN1RyxFQUFNaFEsT0FDRHNRLFFBQVFnakIsR0FBWWlDLElBRXBDOXJCLElBQ0FyTixLQUFLOGdDLGdDQUFnQ2x0QixHQUNqQzVULEtBQUt5L0IsZUFBaUJuSSxHQUFlNEgsT0FFckN0ckIsRUFBTThuQiwyQkFDTjluQixFQUFNWSxpQkFFRnhVLEtBQUttUixTQUNMblIsS0FBS2dSLE9BR1RoUixLQUFLNmdDLGdCQUFnQnh6QixHQUNyQnZKLFNBQVNpUixnQkFBZ0JTLG1CQUdyQyxDQUNKLENBRVEsYUFBQTRxQixDQUFjeHNCLEdBQ2Q1VCxLQUFLcS9CLGNBQWMvK0IsT0FBUyxHQUFLTixLQUFLMi9CLGdCQUN0QzMvQixLQUFLK2dDLHNCQUNML2dDLEtBQUsrUSxPQUViLENBRVEsYUFBQXl2QixDQUFjNXNCLEdBRUhBLEVBQU1oUSxPQUNNc1EsUUFBUWdqQixHQUFZaUMsTUFJdkN2bEIsRUFBTXhOLEtBQU9peEIsR0FBYTJKLE9BQVVwdEIsRUFBTXdlLFVBQWF4ZSxFQUFNa2xCLFNBQVlsbEIsRUFBTXF0QixTQUFZcnRCLEVBQU1tbEIsT0FHMUZubEIsRUFBTXhOLEtBQU9peEIsR0FBYTZKLFFBQVVsaEMsS0FBS21SLFVBQVlzZixHQUEyQnZsQixjQUFjd0YsV0FFckd1RixZQUFXLEtBQ0hqVyxLQUFLbVIsVUFDTHlDLEVBQU04bkIsMkJBQ04xN0IsS0FBSzRnQyxXQUNMNWdDLEtBQUtnUixPQUNULEdBQ0QsSUFWSDRDLEVBQU04bkIsMkJBYWxCLENBRVEsaUNBQUE0RSxDQUFrQzFzQixHQUV0QyxNQUNNdXRCLEVBRFN2dEIsRUFBTWhRLE9BQ01zUSxRQUFRZ2pCLEdBQVlpQyxJQUUzQ2dJLElBQ0t2dEIsRUFBTXd0QixRQUFVeHRCLEVBQU14TixNQUFRaXhCLEdBQWFnSyxRQUU1Q3p0QixFQUFNOG5CLDJCQUVOMTdCLEtBQUt3L0IsV0FBV21CLFFBQ2hCM2dDLEtBQUsyL0IsZUFBZ0IsRUFDckIzL0IsS0FBS3kvQixjQUFnQm5JLEdBQWVvSSxLQUNwQzEvQixLQUFLNmdDLGdCQUFnQk0sSUFJakMsQ0FFUSx3Q0FBQVosQ0FBeUMzc0IsR0FDN0MsR0FBSTVULEtBQUsyL0IsY0FBZSxDQUNwQixNQUNNd0IsRUFEU3Z0QixFQUFNaFEsT0FDTXNRLFFBQVFnakIsR0FBWWlDLElBRS9DLEdBQUlnSSxHQUNJbmhDLEtBQUt5L0IsZUFBaUJuSSxHQUFlNEgsTUFBUXRyQixFQUFNd2UsVUFBWXhlLEVBQU14TixJQUFJazdCLFdBQVcsV0FBYTF0QixFQUFNd3RCLE9BQVEsQ0FFL0d4dEIsRUFBTThuQiwyQkFDTjluQixFQUFNWSxpQkFFTixNQUFNM0gsRUFBUXMwQixFQUFZanRCLFFBQVFnakIsR0FBWXB0QixPQUN4Q3kzQixFQUFXekUsR0FBV3lCLGdCQUFnQjF4QixFQUFPczBCLEVBQWF2dEIsRUFBTXhOLEtBRXRFcEcsS0FBSzZnQyxnQkFBZ0JNLEdBRWpCSSxHQUNBdmhDLEtBQUs2Z0MsZ0JBQWdCVSxFQUU3QixDQUVSLENBQ0osQ0FFQSxhQUFBQyxDQUFjOXNCLEdBQ1YsT0FBT0EsRUFDRitzQixRQUFRLE9BQVEsS0FDaEJucEIsTUFDVCxDQVVRLDZDQUFBb3BCLENBQThDOXRCLEdBQ2xELEdBQUk1VCxLQUFLMi9CLGNBQWUsQ0FDcEIsTUFBTTdvQixFQUFZaFQsU0FBU2lSLGVBQzNCLEdBQUkrQixFQUFXLENBQ1gsTUFBTTZxQixFQUFrQjNoQyxLQUFLd2hDLGNBQWMxcUIsRUFBVS9XLFdBQVd1WSxRQUUxRDZvQixFQURTdnRCLEVBQU1oUSxPQUNNc1EsUUFBUWdqQixHQUFZaUMsSUFDekN5SSxFQUFrQjVoQyxLQUFLd2hDLGVBQWVMLEVBQVluMUIsYUFBZSxJQUFJc00sU0FFckUsUUFBRWYsRUFBTyxNQUFFQyxHQUFVWixFQUFTTyxxQkFBcUJncUIsR0FLakMsS0FBcEJTLEdBQTJCRCxJQUFvQjNoQyxLQUFLNmYsYUFBYXZILFNBQVdmLEdBQVdDLElBQ3ZGeFgsS0FBS3kvQixjQUFnQm5JLEdBQWU0SCxLQUNwQ2wvQixLQUFLNmYsYUFBZSxHQUNoQjdmLEtBQUttUixTQUNMblIsS0FBS2dSLFFBRUYyd0IsSUFDUDNoQyxLQUFLNmYsYUFBZThoQixFQUU1QixDQUNKLENBQ0osQ0FzRFEsK0JBQUFiLENBQWdDbHRCLEdBRXBDLEdBQUk1VCxLQUFLMi9CLGVBQWlCMy9CLEtBQUtzL0Isa0JBQW1CLENBRTlDLE1BQU11QyxFQUFXN2hDLEtBQUtzL0Isa0JBQWtCdnRCLHdCQUVsQyt2QixFQUFTbHVCLEVBQU1tdUIsUUFDZkMsRUFBU3B1QixFQUFNMkMsUUFFZnVyQixHQUFVRCxFQUFTM3ZCLE1BQVE0dkIsR0FBVUQsRUFBU256QixPQUFTc3pCLEdBQVVILEVBQVNwekIsS0FBT3V6QixHQUFVSCxFQUFTek8sU0FDdEdwekIsS0FBS3kvQixjQUFnQm5JLEdBQWU0SCxLQUNoQ2wvQixLQUFLbVIsU0FDTG5SLEtBQUtnUixPQUdqQixDQUNKLENBRVEsV0FBQTB2QixDQUFZOXNCLEdBRURBLEVBQU1oUSxPQUNNc1EsUUFBUWdqQixHQUFZaUMsTUFJM0N2bEIsRUFBTThuQiwyQkFFTjE3QixLQUFLMGhDLDhDQUE4Qzl0QixHQUUvQ0EsRUFBTXhOLE1BQVFpeEIsR0FBYWdLLFFBQzNCcmhDLEtBQUsrZ0Msc0JBRUQvZ0MsS0FBS3EvQixjQUFjLytCLE9BQVMsR0FDNUJOLEtBQUsrUSxRQUlyQixDQUVRLGVBQUE4dkIsQ0FBZ0J4ekIsR0FDcEIsR0FBa0MsSUFBOUJyTixLQUFLcS9CLGNBQWMvK0IsT0FPbkIsT0FOQU4sS0FBS3EvQixjQUFjNS9CLEtBQUs0TixHQUN4QkEsRUFBS25CLFVBQVVDLElBQUksWUFHbkJuTSxLQUFLcy9CLGtCQUFvQmp5QixPQUN6QkEsRUFBS2dFLFFBR29CclIsS0FBS3EvQixjQUFjci9CLEtBQUtxL0IsY0FBYy8rQixPQUFTLEdBQ3pCNFQsUUFBUSxXQUM5QjdHLEVBQUs2RyxRQUFRLFlBSW5CLElBRERsVSxLQUFLcS9CLGNBQWM0QyxRQUFRNTBCLElBRXJDck4sS0FBS3EvQixjQUFjNS9CLEtBQUs0TixHQUN4QkEsRUFBS25CLFVBQVVDLElBQUksWUFHbkJuTSxLQUFLcy9CLGtCQUFvQmp5QixFQUN6QkEsRUFBS2dFLFVBR0xyUixLQUFLcy9CLGtCQUFvQmp5QixFQUN6QkEsRUFBS2dFLFNBS3JCLENBR0EsYUFBQTJXLEdBQ0lsa0IsU0FBU3NMLGlCQUFpQmhJLEVBQWUwVixhQUFjOWMsS0FBS2tpQyx3QkFBd0I3WixLQUFLcm9CLE1BQzdGLENBRUEsdUJBQUFraUMsQ0FBd0J0dUIsR0FFcEIsTUFDTTJVLEVBRGMzVSxFQUNReUosT0FFeEIraEIsR0FBNEJ6L0IsSUFBTTRvQixFQUFRckwsVUFDMUNsZCxLQUFLNC9CLGNBRWIsQ0FFQSxJQUFBN3VCLEdBRVMvUSxLQUFLcy9CLG1CQUtWdC9CLEtBQUttaUMsdUJBQ0xuaUMsS0FBS3dlLFdBQVcvZSxLQUFLTyxLQUFLcy9CLG1CQUMxQnQvQixLQUFLb2lDLGtDQUFrQ3BpQyxLQUFLcy9CLG1CQUM1Q3QvQixLQUFLOHdCLGdDQUVMMWQsTUFBTXJDLE9BRU4vUSxLQUFLcy9CLGtCQUFrQmx3QixpQkFBaUI3SCxFQUFnQjg2QixLQUFNcmlDLEtBQUs0L0IsYUFBYyxDQUFFMEMsT0FBUXRpQyxLQUFLdy9CLFdBQVc4QyxVQVh2R2p6QixRQUFRK0UsTUFBTSx3QkFZdEIsQ0E0QkEsNkJBQUEwYyxHQUVJOVQsRUFBYWlCLG1DQUFtQyxtQkFFaEQsTUFBTXNrQixFQUErQyxDQUFDLEVBQ3REQSxFQUFpQnI3QixFQUFPczdCLG9CQUFzQnhpQyxLQUFLdS9CLHVCQUF1QmtELGlDQUFpQ3ppQyxLQUFLcS9CLGNBQWVuNEIsRUFBT3M3QixvQkFDdElELEVBQWlCcjdCLEVBQU93N0Isc0JBQXdCMWlDLEtBQUt1L0IsdUJBQXVCa0QsaUNBQWlDemlDLEtBQUtxL0IsY0FBZW40QixFQUFPdzdCLHNCQUN4SUgsRUFBaUJyN0IsRUFBT3k3QixxQkFBdUIzaUMsS0FBS3UvQix1QkFBdUJrRCxpQ0FBaUN6aUMsS0FBS3EvQixjQUFlbjRCLEVBQU95N0IscUJBQ3ZJSixFQUFpQnI3QixFQUFPMDdCLHVCQUF5QjVpQyxLQUFLdS9CLHVCQUF1QmtELGlDQUFpQ3ppQyxLQUFLcS9CLGNBQWVuNEIsRUFBTzA3Qix1QkFDeklMLEVBQWlCcjdCLEVBQU8yN0IscUJBQXVCN2lDLEtBQUt1L0IsdUJBQXVCa0QsaUNBQWlDemlDLEtBQUtxL0IsY0FBZW40QixFQUFPMjdCLHFCQUV2SXY4QixPQUFPeXJCLFFBQVF3USxHQUFrQnAxQixTQUFRLEVBQUVZLEVBQU9pa0IsTUFDMUNBLEdBQ0FoVixFQUFhVywrQkFBK0Isa0JBQW1CNVAsRUFBTyxPQUMxRSxHQUVSLENBc0JBLGlDQUFBcTBCLENBQWtDNTlCLEdBQzlCLE1BQU1vZixFQUFPcGYsRUFBUXVOLHdCQUVyQi9SLEtBQUtxUSxZQUFZMU0sTUFBTXFLLFFBQVUsT0FFakMsTUFBTTRrQixFQUFlNXlCLEtBQUtxUSxZQUFZd2lCLFlBQ3RDLElBQUlDLEVBQWVsUCxFQUFLMVIsS0FBT2xPLE9BQU8rdUIsUUFBVSxFQUU1Q0QsRUFBZUYsRUFBZTV1QixPQUFPaU8sYUFDckM2Z0IsRUFBZTl1QixPQUFPaU8sV0FBYTJnQixFQUFlLElBR3RELE1BQU1JLEVBQWdCaHpCLEtBQUtxUSxZQUFZNGlCLGFBQ3ZDLElBQUlDLEVBQWN0UCxFQUFLblYsSUFBTXpLLE9BQU9tdkIsUUFBVUgsRUFBZ0IsR0FFMURFLEVBQWMsSUFDZEEsRUFBY3RQLEVBQUt3UCxPQUFTcHZCLE9BQU9tdkIsUUFBVSxJQUdqRG56QixLQUFLcVEsWUFBWTFNLE1BQU11TyxLQUFPLEdBQUc0Z0IsTUFDakM5eUIsS0FBS3FRLFlBQVkxTSxNQUFNOEssSUFBTSxHQUFHeWtCLEtBQ3BDLENBRUEsbUJBQUE2TixHQUNJL2dDLEtBQUt5L0IsY0FBZ0JuSSxHQUFlb0ksS0FDcEMxL0IsS0FBSzIvQixlQUFnQixFQUNyQjMvQixLQUFLNmYsYUFBZSxFQUN4QixDQUVBLFFBQUErZ0IsR0FDSTVnQyxLQUFLcy9CLGtCQUFvQixLQUNIeDdCLFNBQVNvZSxpQkFBaUIsTUFDbEMvVSxTQUFRRSxHQUFRQSxFQUFLbkIsVUFBVWhKLE9BQU8sY0FDcERsRCxLQUFLcS9CLGNBQWdCLEVBQ3pCLENBRUEsSUFBQXJ1QixHQUNRaFIsS0FBS21SLFNBQ0xpQyxNQUFNcEMsTUFFZCxDQUVBLFlBQUE0dUIsR0FDSTUvQixLQUFLNGdDLFdBQ0w1Z0MsS0FBS2dSLE1BQ1QsQ0FFUSxvQkFBQW14QixHQUNKbmlDLEtBQUt3L0IsV0FBYSxJQUFJTSxlQUMxQixDQUVBLGtCQUFPNTBCLEdBQ0gsTUFBTXNULEVBQWFyTSxFQUFvQkUsU0FBU0UsUUFBcUIsZUFDL0RndEIsRUFBeUJwdEIsRUFBb0JFLFNBQVNFLFFBQWlDLDJCQUM3RixPQUFPLElBQUk2c0IsR0FBNEI1Z0IsRUFBWStnQixFQUN2RCxFQzdlRyxNQUFNdUQsR0FFVCxZQUFPL2QsR0FFSCxNQUFNZ2UsRUFBd0I1d0IsRUFBb0JFLFNBQVNFLFFBQWlDLDJCQUV0RlksRUFBZWlzQixHQUE0QmwwQixjQU9qRCxPQUxBaUksRUFBYTRjLGVBQWUrUyxHQUFtQ0UsYUFBYUQsSUFDNUU1dkIsRUFBYWdkLGdCQUFnQjJTLEdBQW1DMVMsVUFBVSw2QkFDMUVqZCxFQUFhNGMsZUFBZStTLEdBQW1DRyxzQkFHeEQ5dkIsQ0FDWCxDQUVBLG1CQUFPNnZCLENBQWF6RCxHQUVoQixNQUFNMUwsRUFBa0IsSUFBSWpMLEVBQWlCLHNCQUN2Q2tMLEVBQW9CLElBQUkxSixHQUFtQixlQUFnQixVQUFXeUosR0FDdEVILEVBQW1CLElBQUl4TyxFQUFhLG1CQUFvQjRPLEVBQW1CRCxHQUVqRkEsRUFBZ0JsTixPQUFPLElBQUk0RCxHQUEwQnNKLEVBQWlCLGtCQUV0RUEsRUFBZ0JsTixPQUFPLElBQUlDLEVBQXFCLHFCQUFzQmlOLEVBQWlCMXNCLEVBQVMrN0Isc0JBQXVCdjZCLEVBQXNCd0IsY0FBY3BCLFVBQVd1YixFQUFRalosT0FBT3JFLEVBQU1tOEIsV0FBWTllLEVBQU1ZLFFBQVE1VSxZQUFhLFNBQ2xPd2pCLEVBQWdCbE4sT0FBTyxJQUFJQyxFQUFxQixxQkFBc0JpTixFQUFpQjFzQixFQUFTaThCLHVCQUF3Qno2QixFQUFzQndCLGNBQWNwQixVQUFXdWIsRUFBUWpaLE9BQU9yRSxFQUFNcThCLFlBQWFoZixFQUFNWSxRQUFRNVUsWUFBYSxVQUVwT3dqQixFQUFnQmxOLE9BQU8sSUFBSTRELEdBQTBCc0osRUFBaUIsZUFDdEVBLEVBQWdCbE4sT0FBTyxJQUFJQyxFQUFxQix5QkFBMEJpTixFQUFpQjFzQixFQUFTbThCLG9CQUFxQjM2QixFQUFzQndCLGNBQWNiLFdBQVlnYixFQUFRalosT0FBT3JFLEVBQU11OEIsU0FBVWxmLEVBQU1ZLFFBQVE1VSxZQUFhLFVBQ25Pd2pCLEVBQWdCbE4sT0FBTyxJQUFJQyxFQUFxQix5QkFBMEJpTixFQUFpQjFzQixFQUFTcThCLG9CQUFxQjc2QixFQUFzQndCLGNBQWNiLFdBQVlnYixFQUFRalosT0FBT3JFLEVBQU15OEIsU0FBVXBmLEVBQU1ZLFFBQVE1VSxZQUFhLFVBR25Pd2pCLEVBQWdCbE4sT0FBTyxJQUFJNEQsR0FBMEJzSixFQUFpQixXQUV0RSxNQUFNNlAsRUFBbUIsSUFBSTljLEVBQXFCLHFCQUFzQmlOLEVBQWlCMXNCLEVBQVN3OEIsYUFBY2g3QixFQUFzQndCLGNBQWNwQixVQUFXdWIsRUFBUWpaLE9BQU9yRSxFQUFNNDhCLFlBQWF2ZixFQUFNWSxRQUFRNVUsWUFBYSxVQUM1TnF6QixFQUFpQjViLFlBQVksaUJBSTdCK0wsRUFBZ0JsTixPQUFPK2MsR0FHdkIsTUFBTUcsRUFBZ0IsSUFBSWpkLEVBQXFCLHlCQUEwQmlOLEVBQWlCMXNCLEVBQVMyOEIsVUFBV243QixFQUFzQndCLGNBQWNiLFdBQVlnYixFQUFRalosT0FBT3JFLEVBQU00OEIsWUFBYXZmLEVBQU1ZLFFBQVE1VSxZQUFhLE9BUzNOLE9BUkF3ekIsRUFBYy9iLFlBQVksaUJBSzFCK0wsRUFBZ0JsTixPQUFPa2QsR0FHaEJuUSxDQUNYLENBRUEseUJBQU91UCxHQUVILE1BQU05TixFQUFvQixJQUFJdk0sRUFBaUIsMEJBQ3pDeU0sRUFBYyxJQUFJakwsR0FBbUIsbUJBQW9CLElBQUlILEdBQVUsV0FBVzVaLFlBQWE4a0IsR0FDL0Z4QixFQUFnQixJQUFJek8sRUFBYSx3QkFBeUJtUSxFQUFhRixHQUU3RUEsRUFBa0J4TyxPQUFPLElBQUk0RCxHQUEwQjRLLEVBQW1CLGVBRzFFLE1BQU00TyxFQUF5QixJQUFJbmQsRUFBcUIsc0JBQXVCdU8sRUFBbUJodUIsRUFBUzY4QixzQkFBdUI5OEIsRUFBT2txQixlQUFnQixJQUFJbkgsR0FBVS9pQixFQUFPa3FCLGdCQUFnQi9nQixZQUFhLE9BQzNNMHpCLEVBQXVCM2MsU0FBUyxtQkFFaEMsTUFBTTZjLEVBQTJCLElBQUlyZCxFQUFxQix3QkFBeUJ1TyxFQUFtQmh1QixFQUFTNjhCLHNCQUF1Qjk4QixFQUFPbXFCLGlCQUFrQixJQUFJcEgsR0FBVS9pQixFQUFPbXFCLGtCQUFrQmhoQixZQUFhLFNBQ25ONHpCLEVBQXlCN2MsU0FBUyxtQkFHbEMsTUFBTThjLEVBQTBCLElBQUl0ZCxFQUFxQix1QkFBd0J1TyxFQUFtQmh1QixFQUFTNjhCLHNCQUF1Qjk4QixFQUFPb3FCLGdCQUFpQixJQUFJckgsR0FBVS9pQixFQUFPb3FCLGlCQUFpQmpoQixZQUFhLFFBQy9NNnpCLEVBQXdCOWMsU0FBUyxtQkFHakMsTUFBTStjLEVBQTRCLElBQUl2ZCxFQUFxQix5QkFBMEJ1TyxFQUFtQmh1QixFQUFTNjhCLHNCQUF1Qjk4QixFQUFPcXFCLGtCQUFtQixJQUFJdEgsR0FBVS9pQixFQUFPcXFCLG1CQUFtQmxoQixZQUFhLFVBQ3ZOOHpCLEVBQTBCL2MsU0FBUyxtQkFHbkMsTUFBTWdkLEVBQTBCLElBQUl4ZCxFQUFxQix1QkFBd0J1TyxFQUFtQmh1QixFQUFTNjhCLHNCQUF1Qjk4QixFQUFPc3FCLGdCQUFpQixJQUFJdkgsR0FBVS9pQixFQUFPc3FCLGlCQUFpQm5oQixZQUFhLFFBQy9NK3pCLEVBQXdCaGQsU0FBUyxtQkFHakMsTUFBTWlkLEVBQTBCLElBQUl6ZCxFQUFxQix1QkFBd0J1TyxFQUFtQmh1QixFQUFTNjhCLHNCQUF1Qjk4QixFQUFPNFcsZ0JBQWlCLElBQUltTSxHQUFVL2lCLEVBQU80VyxpQkFBaUJ6TixZQUFhLFFBVS9NLE9BVEFnMEIsRUFBd0JqZCxTQUFTLG1CQUVqQytOLEVBQWtCeE8sT0FBT29kLEdBQ3pCNU8sRUFBa0J4TyxPQUFPc2QsR0FDekI5TyxFQUFrQnhPLE9BQU91ZCxHQUN6Qi9PLEVBQWtCeE8sT0FBT3dkLEdBQ3pCaFAsRUFBa0J4TyxPQUFPeWQsR0FDekJqUCxFQUFrQnhPLE9BQU8wZCxHQUVsQjFRLENBQ1gsQ0FFQSxnQkFBT3ZELENBQVV6d0IsR0FDYixPQUFPLElBQUlncUIsRUFBeUJocUIsRUFDeEMsRUN4R0csTUFBTTJrQyxXQUFzQnAwQixFQUUvQnZRLEdBQ0E2ZSxXQUVBLFdBQUFqTyxHQUNJLE1BQU01USxFQUFLLGdCQUNYeVQsTUFBTSxDQUNGelQsR0FBSUEsSUFHUkssS0FBS0wsR0FBS0EsRUFDVkssS0FBS3dlLFdBQWFyTSxFQUFvQkUsU0FBU0UsUUFBcUIsZUFFcEV2UyxLQUFLcVQsY0FDVCxDQUVBLElBQUE3QyxHQUNJLE1BQU1ILEVBQWN2TSxTQUFTVyxjQUFjLE9BQzNDNEwsRUFBWTFRLEdBQUtLLEtBQUtvUSxNQUFNelEsR0FDNUIwUSxFQUFZbkUsVUFBVUMsSUFBSSxnQkFBaUIsbUJBQzNDa0UsRUFBWTFNLE1BQU1xSyxRQUFVLE9BQzVCcUMsRUFBWTFNLE1BQU1pdEIsT0FBU3RwQixFQUFPaTlCLGtCQUVsQyxNQUFNcGdDLEVBQU9MLFNBQVNXLGNBQWMsTUFDcENOLEVBQUsrSCxVQUFVQyxJQUFJLE1BQU8saUJBRTFCLE1BQU1xNEIsRUFBWXhrQyxLQUFLeWtDLGNBQWMsWUFBYSxVQUFVLEdBRXREQyxFQUFXMWtDLEtBQUt5a0MsY0FBYyxXQUFZLGNBRWhEdGdDLEVBQUtJLFlBQVlpZ0MsR0FDakJyZ0MsRUFBS0ksWUFBWW1nQyxHQUVqQixNQUFNdmtDLEVBQVUyRCxTQUFTVyxjQUFjLE9BQ3ZDdEUsRUFBUStMLFVBQVVDLElBQUksZUFFdEIsTUFBTXc0QixFQUFnQjNrQyxLQUFLNGtDLHNCQUNyQkMsRUFBZTdrQyxLQUFLOGtDLHFCQVExQixPQU5BM2tDLEVBQVFvRSxZQUFZb2dDLEdBQ3BCeGtDLEVBQVFvRSxZQUFZc2dDLEdBRXBCeDBCLEVBQVk5TCxZQUFZSixHQUN4QmtNLEVBQVk5TCxZQUFZcEUsR0FFakJrUSxDQUNYLENBR0EsYUFBQW8wQixDQUFjOWtDLEVBQVkrVSxFQUFjc2QsR0FBa0IsR0FDdEQsTUFBTStTLEVBQUtqaEMsU0FBU1csY0FBYyxNQUNsQ3NnQyxFQUFHNzRCLFVBQVVDLElBQUksWUFDYjZsQixHQUFRK1MsRUFBRzc0QixVQUFVQyxJQUFJLFVBQzdCNDRCLEVBQUdwbEMsR0FBS0EsRUFFUixNQUFNdUcsRUFBSXBDLFNBQVNXLGNBQWMsS0FLakMsT0FKQXlCLEVBQUVnRyxVQUFVQyxJQUFJLFlBQ2hCakcsRUFBRW1JLFVBQVlxRyxFQUNkcXdCLEVBQUd4Z0MsWUFBWTJCLEdBRVI2K0IsQ0FDWCxDQUVBLG1CQUFBSCxHQUNJLE1BQU1oMUIsRUFBTTlMLFNBQVNXLGNBQWMsT0FDbkNtTCxFQUFJalEsR0FBSyxnQkFDVGlRLEVBQUkxRCxVQUFVQyxJQUFJLGlCQUFrQixnQkFHcEMsTUFBTTY0QixFQUFRbGhDLFNBQVNXLGNBQWMsU0FDckN1Z0MsRUFBTTMyQixVQUFZLGNBRWxCLE1BQU00MkIsRUFBV25oQyxTQUFTVyxjQUFjLE9BT3hDLE9BTkF3Z0MsRUFBUy80QixVQUFVQyxJQUFJLGFBQ3ZCODRCLEVBQVM1MkIsVUFBWSx5QkFFckJ1QixFQUFJckwsWUFBWXlnQyxHQUNoQnAxQixFQUFJckwsWUFBWTBnQyxHQUVUcjFCLENBQ1gsQ0FFQSxrQkFBQWsxQixHQUNJLE1BQU1sMUIsRUFBTTlMLFNBQVNXLGNBQWMsT0FDbkNtTCxFQUFJalEsR0FBSyxlQUNUaVEsRUFBSTFELFVBQVVDLElBQUksZUFBZ0IsaUJBR2xDLE1BQU0rNEIsRUFBUXBoQyxTQUFTVyxjQUFjLFNBQ3JDeWdDLEVBQU0vNUIsS0FBTyxPQUNiKzVCLEVBQU1wZ0MsYUFBYSxjQUFlLGtCQUVsQyxNQUFNaUwsRUFBU2pNLFNBQVNXLGNBQWMsVUFPdEMsT0FOQXNMLEVBQU8xQixVQUFZLFFBQ25CMEIsRUFBT1gsaUJBQWlCLFNBQVMsSUFBTXBQLEtBQUttbEMsYUFBYUQsRUFBTTl6QixTQUUvRHhCLEVBQUlyTCxZQUFZMmdDLEdBQ2hCdDFCLEVBQUlyTCxZQUFZd0wsR0FFVEgsQ0FDWCxDQUVBLFlBQUF1MUIsQ0FBYXhXLEdBQ1QsTUFBTXlXLEVBQVMsSUFBSUMsSUFBSTFXLEdBQ2pCMlcsRUFBU0YsRUFBT0csU0FDaEJDLEVBQU9KLEVBQU9LLFNBRXBCLE9BQVFILEdBQ0osSUFBSyxrQkFDR0UsRUFBS2xFLFdBQVcsVUFDaEJ0aEMsS0FBSzBsQyxrQkFBa0JOLEdBQ2hCSSxFQUFLbEUsV0FBVyxjQUN2QnRoQyxLQUFLMmxDLHFCQUFxQlAsR0FFOUIsTUFDSixJQUFLLG1CQUNHSSxFQUFLbEUsV0FBVyxVQUNoQnRoQyxLQUFLNGxDLGtCQUFrQlIsR0FDaEJJLEVBQUtsRSxXQUFXLGNBQ3ZCdGhDLEtBQUs2bEMscUJBQXFCVCxHQUU5QixNQUNKLElBQUssY0FDRHBsQyxLQUFLOGxDLFdBQVdWLEdBQ2hCLE1BQ0osSUFBSyxpQkFDTCxJQUFLLG9CQUNHSSxFQUFLbEUsV0FBVyxVQUNoQnRoQyxLQUFLK2xDLGVBQWVYLEdBRXhCLE1BQ0osSUFBSyxrQkFDRHBsQyxLQUFLZ21DLFVBQVVaLEVBQVEsVUFDdkIsTUFDSixJQUFLLGFBQ0dJLEVBQUtoZCxTQUFTLGNBQ2R4b0IsS0FBS2dtQyxVQUFVWixFQUFRLFVBRTNCLE1BQ0osSUFBSyxhQUNEcGxDLEtBQUtpbUMsYUFBYWIsR0FDbEIsTUFDSixRQUNJLzFCLFFBQVErRSxNQUFNLGlDQUkxQixDQUVBLGlCQUFBc3hCLENBQWtCTixHQUNkLE1BQU1jLEVBQVVkLEVBQU9lLGFBQWExL0IsSUFBSSxLQUN4QyxHQUFJeS9CLEVBQVMsQ0FFVCxNQUFNdnlCLEVBQVkzVCxLQUFLb21DLHVCQUNqQkMsRUFBU3ZpQyxTQUFTVyxjQUFjLFVBRXRDNGhDLEVBQU9yM0IsSUFBTSxpQ0FBaUNrM0IsSUFHOUNHLEVBQU9DLFlBQWMsSUFDckJELEVBQU9FLE1BQVEsMkZBQ2ZGLEVBQU9HLGlCQUFrQixFQUV6Qjd5QixFQUFVcFAsWUFBWThoQyxHQUN0QnJtQyxLQUFLeW1DLGNBQWM5eUIsRUFDdkIsTUFDSXRFLFFBQVErRSxNQUFNLDRCQUV0QixDQUVBLG9CQUFBdXhCLENBQXFCUCxHQUNqQixNQUFNc0IsRUFBU3RCLEVBQU9lLGFBQWExL0IsSUFBSSxRQUN2QyxHQUFJaWdDLEVBQVEsQ0FDUixNQUFNL3lCLEVBQVkzVCxLQUFLb21DLHVCQUVqQkMsRUFBU3ZpQyxTQUFTVyxjQUFjLFVBQ3RDNGhDLEVBQU9yM0IsSUFBTSxrREFBa0QwM0IsSUFDL0RMLEVBQU92aEMsYUFBYSxrQkFBbUIsUUFHdkM2TyxFQUFVcFAsWUFBWThoQyxHQUN0QnJtQyxLQUFLeW1DLGNBQWM5eUIsRUFDdkIsTUFDSXRFLFFBQVErRSxNQUFNLCtCQUV0QixDQUVBLGlCQUFBd3hCLENBQWtCUixHQUNkLE1BQU11QixFQUFVdkIsRUFBT0ssU0FBU3g0QixNQUFNLEtBQUsyNUIsTUFDckNqekIsRUFBWTNULEtBQUtvbUMsdUJBQ2pCQyxFQUFTdmlDLFNBQVNXLGNBQWMsVUFDdEM0aEMsRUFBT3IzQixJQUFNLHdDQUF3QzIzQixJQUNyRE4sRUFBT0MsWUFBYyxJQUdyQkQsRUFBT24zQixNQUFRLE9BQ2Z5RSxFQUFVcFAsWUFBWThoQyxHQUN0QnJtQyxLQUFLeW1DLGNBQWM5eUIsRUFDdkIsQ0FFQSxvQkFBQWt5QixDQUFxQlQsR0FDakIsTUFBTXlCLEVBQWF6QixFQUFPSyxTQUFTeDRCLE1BQU0sS0FBSzI1QixNQUN4Q2p6QixFQUFZM1QsS0FBS29tQyx1QkFDakJDLEVBQVN2aUMsU0FBU1csY0FBYyxVQUN0QzRoQyxFQUFPcjNCLElBQU0sMkNBQTJDNjNCLElBQ3hEUixFQUFPQyxZQUFjLElBSXJCM3lCLEVBQVVwUCxZQUFZOGhDLEdBQ3RCcm1DLEtBQUt5bUMsY0FBYzl5QixFQUN2QixDQUVBLFVBQUFteUIsQ0FBV1YsR0FDU0EsRUFBT0ssU0FBU3g0QixNQUFNLEtBQUsyNUIsTUFBM0MsTUFDTUUsRUFBU2hqQyxTQUFTVyxjQUFjLFVBQ3RDcWlDLEVBQU9oaUMsYUFBYSxNQUFPLDJDQUMzQixNQUFNNk8sRUFBWTNULEtBQUtvbUMsdUJBQ2pCaDZCLEVBQWF0SSxTQUFTVyxjQUFjLGNBQzFDMkgsRUFBV0YsVUFBVUMsSUFBSSxpQkFDekJDLEVBQVd0SCxhQUFhLGFBQWMsU0FDdENzSCxFQUFXbUIsVUFBWSxZQUFZNjNCLEVBQU9ybEMsbUNBQzFDNFQsRUFBVXBQLFlBQVk2SCxHQUN0QnVILEVBQVVwUCxZQUFZdWlDLEdBQ3RCOW1DLEtBQUt5bUMsY0FBYzl5QixFQUN2QixDQUVBLGNBQUFveUIsQ0FBZVgsR0FDWCxNQUFNMkIsRUFBYzNCLEVBQU80QixPQUFPek4sTUFBTSxHQUNsQzVsQixFQUFZM1QsS0FBS29tQyx1QkFDakJDLEVBQVN2aUMsU0FBU1csY0FBYyxVQUN0QzRoQyxFQUFPcjNCLElBQU0sK0JBQStCKzNCLGlCQUM1Q1YsRUFBTzFpQyxNQUFNc2pDLFNBQVcsT0FDeEJaLEVBQU8xaUMsTUFBTXdMLE9BQVMsUUFDdEJ3RSxFQUFVcFAsWUFBWThoQyxHQUN0QnJtQyxLQUFLeW1DLGNBQWM5eUIsRUFDdkIsQ0FFQSxTQUFBcXlCLENBQVVaLEVBQWE4QixHQUNuQixNQUFNQyxFQUFTL0IsRUFBT0ssU0FBU3g0QixNQUFNLEtBQUsyNUIsTUFDcENqekIsRUFBWTNULEtBQUtvbUMsdUJBSXZCLElBQUlwM0IsRUFDSixHQUpBMkUsRUFBVWhRLE1BQU11TCxNQUFRLE9BSVIsV0FBWmc0QixFQUNBbDRCLEVBQU0sMkJBQTJCbTRCLFdBQzlCLElBQWdCLFdBQVpELEVBS1AsWUFEQTczQixRQUFRK0UsTUFBTSwyQ0FGZHBGLEVBQU0sK0JBQStCbTRCLE9BSXpDLENBRUEsTUFBTUwsRUFBU2hqQyxTQUFTVyxjQUFjLFVBQ3RDcWlDLEVBQU85M0IsSUFBTUEsRUFHYjgzQixFQUFPTSxPQUFTLEtBQ1ovM0IsUUFBUUMsSUFBSSxpQ0FBbUM0M0IsRUFBUSxFQUszREosRUFBT08sUUFBVSxLQUNiaDRCLFFBQVErRSxNQUFNLGdDQUFrQzh5QixFQUFRLEVBSTVEdnpCLEVBQVVwUCxZQUFZdWlDLEdBQ3RCOW1DLEtBQUt5bUMsY0FBYzl5QixFQUN2QixDQUVBLFlBQUFzeUIsQ0FBYWIsR0FDVCxNQUFNa0MsRUFBUWxDLEVBQU9LLFNBQVN4NEIsTUFBTSxLQUM5QnM2QixFQUFPRCxFQUFNLEdBQ2JFLEVBQU1GLEVBQU0sR0FDWjN6QixFQUFZM1QsS0FBS29tQyx1QkFDakJDLEVBQVN2aUMsU0FBU1csY0FBYyxVQUN0QzRoQyxFQUFPcjNCLElBQU0sc0JBQXNCdTRCLFdBQWNDLG9EQUNqRG5CLEVBQU8xaUMsTUFBTWdMLE9BQVMsT0FFdEIwM0IsRUFBTzFpQyxNQUFNc2pDLFNBQVcsT0FHeEJ0ekIsRUFBVXBQLFlBQVk4aEMsR0FDdEJybUMsS0FBS3ltQyxjQUFjOXlCLEVBQ3ZCLENBRUEsb0JBQUF5eUIsR0FDSSxNQUFNeDJCLEVBQU05TCxTQUFTVyxjQUFjLE9BRW5DLE9BREFtTCxFQUFJMUQsVUFBVUMsSUFBSSxrQkFBbUIsY0FDOUJ5RCxDQUNYLENBRUEsYUFBQTYyQixDQUFjOXlCLEdBQ1YsTUFBTW5QLEVBQVV4RSxLQUFLd2UsV0FBVzJDLE9BQ2hDLEdBQUkzYyxFQUFTLENBRVQsSUFEQUEsRUFBUTBILFVBQVVDLElBQUksYUFDZjNILEVBQVFlLFlBQ1hmLEVBQVFXLFlBQVlYLEVBQVFlLFlBRWhDZixFQUFRRCxZQUFZb1AsRUFDeEIsQ0FDQTNULEtBQUtnUixNQUNULENBSUEsY0FBSXkyQixDQUFXcjJCLEdBQ1gsTUFBTXMyQixFQUFZMW5DLEtBQUtxUSxZQUFZdE0sY0FBYyxTQUM3QzJqQyxJQUNBQSxFQUFVdDJCLE1BQVFBLEVBRTFCLENBRUEsV0FBSXBELEdBQ0EsTUFBTyxNQUNYLENBRUEsYUFBQWdhLEdBQ0lsa0IsU0FBU3NMLGlCQUFpQmhJLEVBQWUyVixZQUFhL2MsS0FBSzJuQyx1QkFBdUJ0ZixLQUFLcm9CLE1BQzNGLENBRUEsc0JBQUEybkMsQ0FBdUIvekIsR0FDQ0EsRUFDUXlKLE9BRWhCSCxVQUFZbGQsS0FBS0wsSUFDekJLLEtBQUsrUSxNQUViLENBRUEsWUFBQXNDLEdBQ0lyVCxLQUFLZ29CLGdCQUVMLE1BQU13YyxFQUFZeGtDLEtBQUtxUSxZQUFZdE0sY0FBYyxjQUNqRHlnQyxHQUFXcDFCLGlCQUFpQixTQUFTLEtBQ2pDcFAsS0FBSzRuQyxhQUFhLFlBQWEsZ0JBQWdCLElBR25ELE1BQU1sRCxFQUFXMWtDLEtBQUtxUSxZQUFZdE0sY0FBYyxhQUNoRDJnQyxHQUFVdDFCLGlCQUFpQixTQUFTLEtBQ2hDcFAsS0FBSzRuQyxhQUFhLFdBQVksZUFBZSxJQVFqRDlqQyxTQUFTc0wsaUJBQWlCN0gsRUFBZ0I4NEIsUUFBU3JnQyxLQUFLNm5DLGFBQWF4ZixLQUFLcm9CLE9BQzFFOEQsU0FBU3NMLGlCQUFpQjdILEVBQWdCdWdDLE1BQU85bkMsS0FBSytuQyxvQkFBb0IxZixLQUFLcm9CLE1BQ25GLENBRUEsWUFBQTZuQyxDQUFhajBCLEdBQ0xBLEVBQU14TixLQUFPaXhCLEdBQWE2SixRQUN0QmxoQyxLQUFLbVIsU0FDTG5SLEtBQUtnUixNQUdqQixDQUVBLG1CQUFBKzJCLENBQW9CbjBCLEdBRWhCLEdBRHFCZ0QsRUFBUzJGLGlDQUFpQzNJLEVBQU8sY0FDcEQsQ0FDZEEsRUFBTThuQiwyQkFDTixNQUFNbDNCLEVBQVV4RSxLQUFLd2UsV0FBVzJDLE9BQzVCM2MsR0FDQXhFLEtBQUtnb0MsV0FBV3hqQyxFQUV4QixDQUdBLEdBRHFCb1MsRUFBUzJGLGlDQUFpQzNJLEVBQU8sY0FDcEQsQ0FDZEEsRUFBTThuQiwyQkFDTixNQUFNbDNCLEVBQVV4RSxLQUFLd2UsV0FBVzJDLE9BQzVCM2MsR0FDQXhFLEtBQUtpb0MsV0FBV3pqQyxFQUV4QixDQUdBLElBRHNCb1MsRUFBUzJGLGlDQUFpQzNJLEVBQU81VCxLQUFLTCxLQUN0REssS0FBSzBRLFVBR3ZCLE9BRkFrRCxFQUFNOG5CLGdDQUNOMTdCLEtBQUtnUixPQUlULE1BQU0yQyxFQUFZaUQsRUFBUzRGLG9DQUFvQzVJLEVBQU8sc0JBQ3RFLEdBQUlELEVBSUEsT0FIQUMsRUFBTThuQiwyQkFDTjE3QixLQUFLd2UsV0FBVy9lLEtBQUtrVSxRQUNyQjNULEtBQUsrUSxPQUlULE1BQU1tM0IsRUFBaUJ0eEIsRUFBUzRGLG9DQUFvQzVJLEVBQU8sc0JBQzNFLE9BQUlzMEIsR0FDQXQwQixFQUFNOG5CLDJCQUNOMTdCLEtBQUt3ZSxXQUFXL2UsS0FBS3lvQyxRQUNyQmxvQyxLQUFLK1EsYUFIVCxDQU1KLENBR0EsTUFBQW8zQixDQUFPQyxHQUNILE9BQU90a0MsU0FBU3lQLGVBQWU2MEIsRUFDbkMsQ0FFQSxVQUFBQyxDQUFXQyxHQUNQLE9BQU94a0MsU0FBU3lQLGVBQWUrMEIsRUFDbkMsQ0FFQSxZQUFBVixDQUFhUSxFQUFlRSxHQUN4QnhrQyxTQUFTb2UsaUJBQWlCLGFBQWEvVSxTQUFRak4sSUFDM0NBLEVBQUtnTSxVQUFVaEosT0FBTyxTQUFTLElBRW5DWSxTQUFTb2UsaUJBQWlCLGlCQUFpQi9VLFNBQVFoTixJQUMvQ0EsRUFBUStMLFVBQVVoSixPQUFPLFNBQVMsSUFHdENsRCxLQUFLbW9DLE9BQU9DLElBQVFsOEIsVUFBVUMsSUFBSSxVQUNsQ25NLEtBQUtxb0MsV0FBV0MsSUFBWXA4QixVQUFVQyxJQUFJLFNBQzlDLENBRUEsVUFBQTY3QixDQUFXTyxHQUNQLE1BQU01WixFQUFPN3FCLFNBQVNDLGNBQWMsbUNBQXdEcU4sTUFDNUYvQixRQUFRQyxJQUFJLDRCQUE2QnFmLEdBRXpDLE1BQU03VCxFQUFpQnl0QixFQUFvQnIwQixRQUFRLDZCQUNuRCxHQUFJNEcsRUFBZ0IsQ0FDaEIsS0FBT0EsRUFBZXZWLFlBQ2xCdVYsRUFBZTNWLFlBQVkyVixFQUFldlYsWUFHOUMsTUFBTXdKLEVBQU1qTCxTQUFTVyxjQUFjLE9BQ25Dc0ssRUFBSTlDLGdCQUFrQixPQUN0QjhDLEVBQUlDLElBQU0yZixFQUNWNWYsRUFBSUUsSUFBTSxpQkFDVkYsRUFBSXBMLE1BQU1zakMsU0FBVyxPQUNyQmw0QixFQUFJcEwsTUFBTXVMLE1BQVEsT0FDbEJILEVBQUlwTCxNQUFNd0wsT0FBUyxPQUduQjJMLEVBQWU1TyxVQUFVQyxJQUFJLGFBQzdCNEMsRUFBSTdDLFVBQVVDLElBQUksY0FFbEIyTyxFQUFldlcsWUFBWXdLLEVBQy9CLE1BQ0lNLFFBQVErRSxNQUFNLDJEQUdsQnBVLEtBQUtnUixNQUNULENBRUEsVUFBQWkzQixDQUFXTyxHQUNQLE1BQU03WixFQUFPN3FCLFNBQVNDLGNBQWMsbUNBQXdEcU4sTUFDNUYvQixRQUFRQyxJQUFJLDRCQUE2QnFmLEdBRXpDLE1BQU03VCxFQUFpQjB0QixFQUFvQnQwQixRQUFRLDZCQUNuRCxHQUFJNEcsRUFBZ0IsQ0FDaEIsS0FBT0EsRUFBZXZWLFlBQ2xCdVYsRUFBZTNWLFlBQVkyVixFQUFldlYsWUFHOUMsTUFBTTJnQyxFQUFVLElBQUliLElBQUkxVyxHQUFLd1gsYUFBYTEvQixJQUFJLEtBQzlDLEdBQUl5L0IsRUFBUyxDQUVULE1BQU12eUIsRUFBWTdQLFNBQVNXLGNBQWMsT0FDekNrUCxFQUFVekgsVUFBVUMsSUFBSSxtQkFFeEIsTUFBTWs2QixFQUFTdmlDLFNBQVNXLGNBQWMsVUFDdEM0aEMsRUFBT3IzQixJQUFNLGlDQUFpQ2szQixJQUM5Q0csRUFBT0MsWUFBYyxJQUVyQkQsRUFBT0UsTUFBUSwyRkFDZkYsRUFBT0csaUJBQWtCLEVBRXpCN3lCLEVBQVVwUCxZQUFZOGhDLEdBQ3RCdnJCLEVBQWV2VyxZQUFZb1AsR0FFM0JtSCxFQUFlNU8sVUFBVUMsSUFBSSxhQUM3Qms2QixFQUFPbjZCLFVBQVVDLElBQUksYUFFekIsTUFDSWtELFFBQVErRSxNQUFNLHNCQUV0QixNQUNJL0UsUUFBUStFLE1BQU0sMkRBR2xCcFUsS0FBS2dSLE1BQ1QsQ0FFQSxJQUFBRCxHQUVJLE1BQU0wM0IsRUFBY3pvQyxLQUFLd2UsV0FBVzJDLE9BQ2hDc25CLEdBQ0F6b0MsS0FBS29pQyxrQ0FBa0NxRyxHQUczQ3pvQyxLQUFLcVEsWUFBWTFNLE1BQU1nTixXQUFhLFVBQ3BDeUMsTUFBTXJDLE1BQ1YsQ0FFQSxJQUFBQyxHQUNJaFIsS0FBS3luQyxXQUFhLEdBQ2xCcjBCLE1BQU1wQyxNQUNWLENBRUEsaUNBQUFveEIsQ0FBa0M1OUIsR0FDOUIsTUFBTW9mLEVBQU9wZixFQUFRdU4sd0JBRXJCL1IsS0FBS3FRLFlBQVkxTSxNQUFNcUssUUFBVSxPQUNqQ2hPLEtBQUtxUSxZQUFZMU0sTUFBTWdOLFdBQWEsU0FHcEMsSUFBSW1pQixFQURtQmxQLEVBQUsxUixLQUFPbE8sT0FBTyt1QixRQUFXblAsRUFBSzFVLE1BQVEsRUFDN0JsUCxLQUFLcVEsWUFBWXdpQixZQUFjLEVBQ2hFSyxFQUFjdFAsRUFBS3dQLE9BQVNwdkIsT0FBT212QixRQUFVLEdBRWpEbnpCLEtBQUtxUSxZQUFZMU0sTUFBTXVPLEtBQU8sR0FBRzRnQixNQUNqQzl5QixLQUFLcVEsWUFBWTFNLE1BQU04SyxJQUFNLEdBQUd5a0IsS0FDcEMsRUN0aEJHLE1BQU13VixHQUNULFlBQU8zakIsR0FJSCxPQUZzQixJQUFJdWYsRUFHOUIsRUNDRyxNQUFNcUUsR0FFVCxZQUFPNWpCLEdBWUgsT0FWZXZTLEVBQU90SCxZQUNsQmt3QixHQUFhclcsUUFDYjhYLEdBQWU5WCxRQUNmRCxFQUFnQkMsUUFDaEJ5TyxHQUFrQ3pPLFFBQ2xDMFYsR0FBaUIxVixRQUNqQitkLEdBQW1DL2QsUUFDbkMyakIsR0FBcUIzakIsUUFJN0IsRUNoQkcsTUFBTTZqQixHQUVELy9CLGdCQUVBK21CLE9BUVIsWUFBb0JBLEdBRWhCLEdBQUlnWixHQUFVdDJCLFNBQ1YsTUFBTSxJQUFJaE8sTUFHZHRFLEtBQUs0dkIsT0FBU0EsRUFFZGdaLEdBQVV0MkIsU0FBV3RTLElBQ3pCLENBT0EsWUFBTytrQixHQUVILE9BQUk2akIsR0FBVXQyQixTQUNIczJCLEdBQVV0MkIsU0FHTCxJQUFJczJCLEdBQVVELEdBQWM1akIsUUFHaEQsQ0FPQSxLQUFBcUosR0FJSSxPQUZBcHVCLEtBQUs2b0MsY0FFRTdvQyxLQUFLNHZCLE1BQ2hCLENBTUEsV0FBQWlaLEdBQ0ksSUFBSy9rQyxTQUFTQyxjQUFjLHdCQUF5QixDQUNqRCxNQUFNK2tDLEVBQWVobEMsU0FBU1csY0FBYyxPQUU1Q3FrQyxFQUFhdjdCLFUseTdzQ0FDYnU3QixFQUFhN3ZCLFVBQVksc0JBRXpCblYsU0FBU2twQixLQUFLem9CLFlBQVl1a0MsRUFDOUIsQ0FDSixFQy9DRyxNQUFNQyxHQUVEbGdDLGdCQUE0QyxLQUU1Q29LLHVCQUNBc3NCLHVCQUNBN08sc0JBTVIsWUFDSXpkLEVBQ0EyWCxFQUNBMlUsR0FFQSxHQUFJd0osR0FBa0J6MkIsU0FDbEIsTUFBTSxJQUFJaE8sTUFBTSx3RUFHcEJ0RSxLQUFLaVQsdUJBQXlCQSxFQUM5QmpULEtBQUswd0Isc0JBQXdCOUYsRUFDN0I1cUIsS0FBS3UvQix1QkFBeUJBLENBQ2xDLENBTU8sa0JBQU9yMEIsR0FFVixNQUFNK0gsRUFBeUJkLEVBQW9CRSxTQUFTRSxRQUFpQywyQkFDdkZxWSxFQUF1QnpZLEVBQW9CRSxTQUFTRSxRQUFnQywwQkFDcEZndEIsRUFBeUJwdEIsRUFBb0JFLFNBQVNFLFFBQWlDLDJCQUs3RixPQUhLdzJCLEdBQWtCejJCLFdBQ25CeTJCLEdBQWtCejJCLFNBQVcsSUFBSXkyQixHQUFrQjkxQixFQUF3QjJYLEVBQXNCMlUsSUFFOUZ3SixHQUFrQnoyQixRQUM3QixDQUtPLE1BQUEwMkIsR0FDSGxsQyxTQUFTc0wsaUJBQWlCbkksRUFBYW1YLGVBQWdCcGUsS0FBS2lwQyxvQkFDNURubEMsU0FBU3NMLGlCQUFpQm5JLEVBQWFrMEIsc0JBQXVCbjdCLEtBQUtrcEMsaUNBQ3ZFLENBTVFELG1CQUFzQnIxQixJQUMxQixNQUFNLFFBQUV5SyxFQUFPLE9BQUVtQixFQUFNLE1BQUVwTyxFQUFLLGdCQUFFKzNCLEVBQWUsTUFBRXZ1QixFQUFLLE1BQUV1RCxHQUFVdkssRUFBTXlKLE9BRXhFLE9BQVFnQixHQUNKLEtBQUtsWCxFQUFTMHRCLFdBQ1Y3MEIsS0FBSzB3QixzQkFBc0I3RixXQUMzQixNQUNKLEtBQUsxakIsRUFBUzJ0QixhQUNWOTBCLEtBQUswd0Isc0JBQXNCMUYsYUFDM0IsTUFDSixLQUFLN2pCLEVBQVN3a0IsZ0JBQ1YzckIsS0FBSzB3QixzQkFBc0J0RixnQkFDM0IsTUFDSixLQUFLamtCLEVBQVM4dEIsb0JBQ1ZqMUIsS0FBSzB3QixzQkFBc0J4RixvQkFDM0IsTUFDSixLQUFLL2pCLEVBQVMwa0Isa0JBQ1YsSUFBS3phLEVBQ0QsTUFBTSxJQUFJOU0sTUFBTSxHQUFHNkMsRUFBUzBrQiw0Q0FFaEM3ckIsS0FBSzB3QixzQkFBc0JwRixnQkFBZ0JsYSxHQUMzQyxNQUNKLEtBQUtqSyxFQUFTMmtCLGdCQUNWLElBQUsxYSxFQUNELE1BQU0sSUFBSTlNLE1BQU0sR0FBRzZDLEVBQVMya0IsMENBRWhDOXJCLEtBQUswd0Isc0JBQXNCbkYsY0FBY25hLEdBQ3pDLE1BQ0osS0FBS2pLLEVBQVNxWixlQUNWLElBQUtwUCxFQUNELE1BQU0sSUFBSTlNLE1BQU0sR0FBRzZDLEVBQVNxWiw0RUFFaEN4Z0IsS0FBS29wQyxtQkFBbUJoNEIsR0FDeEIsTUFDSixLQUFLakssRUFBU2tpQyxlQUNWcnBDLEtBQUtzcEMscUJBQ0wsTUFDSixLQUFLbmlDLEVBQVNvaUMsWUFDVnZwQyxLQUFLd3BDLGtCQUNMLE1BQ0osS0FBS3JpQyxFQUFTc2lDLGFBQ1Z6cEMsS0FBSzBwQyxtQkFDTCxNQUNKLEtBQUt2aUMsRUFBUzBaLG1CQUNWN2dCLEtBQUsycEMseUJBQ0wsTUFDSixLQUFLeGlDLEVBQVM2MEIsVUFDVmg4QixLQUFLNHBDLGdCQUNMLE1BQ0osS0FBS3ppQyxFQUFTdzBCLHFCQUNWMzdCLEtBQUs2cEMsMkJBQ0wsTUFDSixLQUFLMWlDLEVBQVMrN0Isc0JBQ1ZsakMsS0FBS3UvQix1QkFBdUJ1SyxtQkFDNUIsTUFDSixLQUFLM2lDLEVBQVNpOEIsdUJBQ1ZwakMsS0FBS3UvQix1QkFBdUJ3SyxrQkFBa0JudkIsR0FBUyxNQUN2RCxNQUNKLEtBQUt6VCxFQUFTbThCLG9CQUNWdGpDLEtBQUt1L0IsdUJBQXVCeUssaUJBQzVCLE1BQ0osS0FBSzdpQyxFQUFTcThCLG9CQUNWeGpDLEtBQUt1L0IsdUJBQXVCMEssZUFBZXJ2QixHQUFTLE1BQ3BELE1BQ0osS0FBS3pULEVBQVM2OEIsc0JBQ1YsSUFBSzV5QixFQUNELE1BQU0sSUFBSTlNLE1BQU0sR0FBRzZDLEVBQVM2OEIscUZBRWhDaGtDLEtBQUt1L0IsdUJBQXVCMkssd0JBQXdCOTRCLEdBQ3BELE1BQ0osS0FBS2pLLEVBQVN3OEIsYUFDVjNqQyxLQUFLdS9CLHVCQUF1Qm9FLGVBQzVCLE1BQ0osS0FBS3g4QixFQUFTMjhCLFVBR2QsS0FBSzM4QixFQUFTMjhCLFVBQ1Y5akMsS0FBS3UvQix1QkFBdUJ1RSxZQUM1QixNQUNKLEtBQUszOEIsRUFBU21YLHVCQUNWdGUsS0FBS3UvQix1QkFBdUJqaEIsdUJBQXVCSCxFQUFzQi9NLEdBQ3pFLE1BeUJKLFFBQ0kvQixRQUFRK0UsTUFBTSxrQ0FBa0NpSyxLQUN4RCxFQUdJLGtCQUFBK3FCLENBQW1CRCxHQUV2QixPQURBbnBDLEtBQUtpVCx1QkFBdUJ1TixlQUFlMm9CLElBQ3BDLENBQ1gsQ0FFUSxrQkFBQUcsR0FDSixPQUFPdHBDLEtBQUtpVCx1QkFBdUJzTSxZQUFZaEIsRUFBdUJrQixpQkFBaUJSLFdBQVcsRUFDdEcsQ0FFUSxlQUFBdXFCLEdBQ0osT0FBT3hwQyxLQUFLaVQsdUJBQXVCc00sWUFBWWhCLEVBQXVCa0IsaUJBQWlCVCxRQUFRLEVBQ25HLENBRVEsZ0JBQUEwcUIsR0FDSixPQUFPMXBDLEtBQUtpVCx1QkFBdUJzTSxZQUFZaEIsRUFBdUJrQixpQkFBaUJKLGVBQWUsRUFDMUcsQ0FFUSxzQkFBQXNxQixHQUNKLE9BQU8zcEMsS0FBS2lULHVCQUF1QnNNLFlBQVloQixFQUF1QmtCLGlCQUFpQmYsc0JBQXNCLEVBQ2pILENBRVEsYUFBQWtyQixHQUNKLE9BQU81cEMsS0FBS2lULHVCQUF1QjBPLGlDQUN2QyxDQUVRLHdCQUFBa29CLEdBQ0osT0FBTzdwQyxLQUFLaVQsdUJBQXVCc00sWUFBWWhCLEVBQXVCa0IsaUJBQWlCZCwwQkFBMEIsRUFDckgsQ0FFUXVxQixpQ0FBbUMsS0FFdkNscEMsS0FBS2lULHVCQUF1QnNNLFlBQVloQixFQUF1QmtCLGlCQUFpQlosZ0JBQWdCLEVBQU0sRUMzTXZHLE1BQU1zckIsR0FPRHRoQyxnQkFBNEMsS0FPcEQsY0FDSSxHQUFJc2hDLEdBQWtCNzNCLFNBQ2xCLE1BQU0sSUFBSWhPLE1BQU0sd0RBR3BCdEUsS0FBS2dwQyxRQUNULENBRUEsV0FBQW9CLEdBQ0kvNkIsUUFBUUMsSUFBSSwrQkFDaEIsQ0FRQSxrQkFBT3BFLEdBQ0gsT0FBSWkvQixHQUFrQjczQixTQUNYNjNCLEdBQWtCNzNCLFNBR3RCLElBQUk2M0IsRUFDZixDQWdDUSxNQUFBbkIsR0FDSmxsQyxTQUFTc0wsaUJBQWlCLFdBQVl3RSxJQUVsQ3ZFLFFBQVFDLElBQUksUUFBUXNFLEVBQU14TixjQUFjd04sRUFBTTdILGVBQWU2SCxFQUFNa2xCLGlCQUFpQmxsQixFQUFNbWxCLGtCQUFnQyxhQUFkbmxCLEVBQU14TixpQkFBZ0N3TixFQUFNeTJCLGlCQUFpQixjQUV6SyxNQUFNQyxFQUFXMTJCLEVBQU03SCxLQUFLdTFCLFdBQVcsVUFDakNpSixFQUFZMzJCLEVBQU15MkIsaUJBQWlCLFlBRXBDejJCLEVBQU1rbEIsU0FBV2xsQixFQUFNcXRCLFVBQVlydEIsRUFBTXdlLFVBQTJCLFVBQWR4ZSxFQUFNeE4sS0FFN0R3TixFQUFNWSxpQkFDTlosRUFBTThhLGtCQUVOOGIsTUFBTSwyQkFDTjFtQyxTQUFTeVosY0FBYyxJQUFJSCxZQUFpQ25XLEVBQWFtWCxlQUFnQixDQUNyRmYsT0FBUSxDQUNKZ0IsUUFBU2xYLEVBQVNxWixlQUNsQjJvQixnQkFBaUJ4Z0MsRUFBc0J3QixjQUFjcEIsZ0JBSXJENkssRUFBTWtsQixVQUFXbGxCLEVBQU1xdEIsU0FBYXJ0QixFQUFNbWxCLFFBQTBCLFdBQWZubEIsRUFBTTdILE1BQW9DLFlBQWY2SCxFQUFNN0gsTUFZdEY2SCxFQUFNa2xCLFVBQVdsbEIsRUFBTXF0QixTQUFhcnRCLEVBQU13ZSxVQUEwQixNQUFkeGUsRUFBTXhOLEtBVzVEd04sRUFBTWtsQixVQUFXbGxCLEVBQU1xdEIsU0FBYXJ0QixFQUFNd2UsVUFBMkIsTUFBZHhlLEVBQU14TixJQVc3RHdOLEVBQU1rbEIsU0FBV2xsQixFQUFNbWxCLFNBQTJCLFdBQWZubEIsRUFBTTdILE1BQXVCdStCLEdBQVlDLEdBQTRCLFlBQWYzMkIsRUFBTTdILE9BRXZHNkgsRUFBTVksaUJBQ05aLEVBQU04YSxrQkFFTjVxQixTQUFTeVosY0FBYyxJQUFJSCxZQUFpQ25XLEVBQWFtWCxlQUFnQixDQUNyRmYsT0FBUSxDQUNKZ0IsUUFBU2xYLEVBQVNxWixlQUNsQjJvQixnQkFBaUJ4Z0MsRUFBc0J3QixjQUFjWixjQUdyRHFLLEVBQU1rbEIsU0FBV2xsQixFQUFNbWxCLFNBQTJCLFdBQWZubEIsRUFBTTdILE1BQXVCdStCLEdBQVlDLEdBQTRCLFlBQWYzMkIsRUFBTTdILE9BRXZHNkgsRUFBTVksaUJBQ05aLEVBQU04YSxrQkFFTjVxQixTQUFTeVosY0FBYyxJQUFJSCxZQUFpQ25XLEVBQWFtWCxlQUFnQixDQUNyRmYsT0FBUSxDQUNKZ0IsUUFBU2xYLEVBQVNxWixlQUNsQjJvQixnQkFBaUJ4Z0MsRUFBc0J3QixjQUFjWCxjQUdyRG9LLEVBQU1rbEIsU0FBV2xsQixFQUFNbWxCLFNBQTJCLFdBQWZubEIsRUFBTTdILE1BQXVCdStCLEdBQVlDLEdBQTRCLFlBQWYzMkIsRUFBTTdILE9BRXZHNkgsRUFBTVksaUJBQ05aLEVBQU04YSxrQkFFTjVxQixTQUFTeVosY0FBYyxJQUFJSCxZQUFpQ25XLEVBQWFtWCxlQUFnQixDQUNyRmYsT0FBUSxDQUNKZ0IsUUFBU2xYLEVBQVNxWixlQUNsQjJvQixnQkFBaUJ4Z0MsRUFBc0J3QixjQUFjVixjQUdyRG1LLEVBQU1rbEIsU0FBV2xsQixFQUFNbWxCLFNBQTJCLFdBQWZubEIsRUFBTTdILE1BQXVCdStCLEdBQVlDLEdBQTRCLFlBQWYzMkIsRUFBTTdILE9BRXZHNkgsRUFBTVksaUJBQ05aLEVBQU04YSxrQkFFTjVxQixTQUFTeVosY0FBYyxJQUFJSCxZQUFpQ25XLEVBQWFtWCxlQUFnQixDQUNyRmYsT0FBUSxDQUNKZ0IsUUFBU2xYLEVBQVNxWixlQUNsQjJvQixnQkFBaUJ4Z0MsRUFBc0J3QixjQUFjVCxjQUdyRGtLLEVBQU1rbEIsU0FBV2xsQixFQUFNbWxCLFNBQTJCLFdBQWZubEIsRUFBTTdILE1BQXVCdStCLEdBQVlDLEdBQTRCLFlBQWYzMkIsRUFBTTdILE9BRXZHNkgsRUFBTVksaUJBQ05aLEVBQU04YSxrQkFFTjVxQixTQUFTeVosY0FBYyxJQUFJSCxZQUFpQ25XLEVBQWFtWCxlQUFnQixDQUNyRmYsT0FBUSxDQUNKZ0IsUUFBU2xYLEVBQVNxWixlQUNsQjJvQixnQkFBaUJ4Z0MsRUFBc0J3QixjQUFjUixjQUdyRGlLLEVBQU1rbEIsU0FBV2xsQixFQUFNbWxCLFNBQTJCLFdBQWZubEIsRUFBTTdILE1BQXVCdStCLEdBQVlDLEdBQTRCLFlBQWYzMkIsRUFBTTdILE9BRXZHNkgsRUFBTVksaUJBQ05aLEVBQU04YSxrQkFFTjVxQixTQUFTeVosY0FBYyxJQUFJSCxZQUFpQ25XLEVBQWFtWCxlQUFnQixDQUNyRmYsT0FBUSxDQUNKZ0IsUUFBU2xYLEVBQVNxWixlQUNsQjJvQixnQkFBaUJ4Z0MsRUFBc0J3QixjQUFjUCxjQUd2QyxNQUFkZ0ssRUFBTXhOLEtBQTZCLE1BQWR3TixFQUFNeE4sTUFBZ0J3TixFQUFNa2xCLFFBVW5DLFdBQWRsbEIsRUFBTXhOLEtBQWtDLGNBQWR3TixFQUFNeE4sTUFBd0J3TixFQUFNd2UsU0FVakQsT0FBZHhlLEVBQU14TixNQUFpQndOLEVBQU1rbEIsU0FBV2xsQixFQUFNcXRCLFNBRXJEbjlCLFNBQVN5WixjQUFjLElBQUlILFlBQWlDblcsRUFBYW1YLGVBQWdCLENBQ3JGZixPQUFRLENBQ0pnQixRQUFTbFgsRUFBU3NpQyxpQkFHbkI3MUIsRUFBTWtsQixTQUFXbGxCLEVBQU1tbEIsUUFBeUIsV0FBZm5sQixFQUFNN0gsTUFFOUM2SCxFQUFNWSxrQkFqQk5aLEVBQU1ZLGlCQUNOWixFQUFNOGEsa0JBRU41cUIsU0FBU3laLGNBQWMsSUFBSUgsWUFBaUNuVyxFQUFhbVgsZUFBZ0IsQ0FDckZmLE9BQVEsQ0FDSmdCLFFBQVNsWCxFQUFTb2lDLGtCQWYxQjMxQixFQUFNWSxpQkFDTlosRUFBTThhLGtCQUVONXFCLFNBQVN5WixjQUFjLElBQUlILFlBQWlDblcsRUFBYW1YLGVBQWdCLENBQ3JGZixPQUFRLENBQ0pnQixRQUFTbFgsRUFBU2tpQyxxQkFsRjFCejFCLEVBQU1ZLGlCQUNOWixFQUFNOGEsa0JBRU41cUIsU0FBU3laLGNBQWMsSUFBSUgsWUFBaUNuVyxFQUFhbVgsZUFBZ0IsQ0FDckZmLE9BQVEsQ0FDSmdCLFFBQVNsWCxFQUFTcVosZUFDbEIyb0IsZ0JBQWlCeGdDLEVBQXNCd0IsY0FBY2Qsb0JBakI3RHVLLEVBQU1ZLGlCQUNOWixFQUFNOGEsa0JBRU41cUIsU0FBU3laLGNBQWMsSUFBSUgsWUFBaUNuVyxFQUFhbVgsZUFBZ0IsQ0FDckZmLE9BQVEsQ0FDSmdCLFFBQVNsWCxFQUFTcVosZUFDbEIyb0IsZ0JBQWlCeGdDLEVBQXNCd0IsY0FBY2Ysb0JBbEI3RHdLLEVBQU1ZLGlCQUNOWixFQUFNOGEsa0JBRU41cUIsU0FBU3laLGNBQWMsSUFBSUgsWUFBaUNuVyxFQUFhbVgsZUFBZ0IsQ0FDckZmLE9BQVEsQ0FDSmdCLFFBQVNsWCxFQUFTcVosZUFDbEIyb0IsZ0JBQWlCeGdDLEVBQXNCd0IsY0FBY2IsZUEwSGpFLEdBRVIsRUN2T0csTUFBTW1oQyxHQUVENWhDLGdCQUF5QyxLQUVqRDJWLFdBRUFrc0IsY0FBZ0IsSUFBSUMsSUFFcEIsWUFDSW5zQixHQUVBLEdBQUlpc0IsR0FBZW40QixTQUNmLE1BQU0sSUFBSWhPLE1BQU0sMERBR3BCdEUsS0FBS3dlLFdBQWFBLEVBRWxCeGUsS0FBS2dwQyxRQUNULENBRUEsV0FBQW9CLEdBQ0kvNkIsUUFBUUMsSUFBSSx5QkFDaEIsQ0FFQSxrQkFBT3BFLEdBRUgsTUFBTXNULEVBQWFyTSxFQUFvQkUsU0FBU0UsUUFBcUIsZUFDckUsT0FBSWs0QixHQUFlbjRCLFNBQ1JtNEIsR0FBZW40QixTQUduQixJQUFJbTRCLEdBQWVqc0IsRUFDOUIsQ0FFUSxNQUFBd3FCLEdBRUpsbEMsU0FBU3NMLGlCQUFpQixTQUFVd0UsSUFDaEMsSUFBSXRELEVBQXlCLEtBUTdCLEdBTElBLEVBRENzRCxFQUFNaFEsT0FBZ0JrUSxVQUFZRCxLQUFLRSxVQUM5QkgsRUFBTWhRLE9BQWdCa04sY0FFdEI4QyxFQUFNaFEsT0FHaEIwTSxHQUFRNEQsUUFBUSxxQkFBc0IsQ0FFdEMsTUFBTWlKLEVBQWMsSUFBSUMsWUFBaUNuVyxFQUFhbVgsZUFBZ0IsQ0FDbEZmLE9BQVEsQ0FDSmdCLFFBQVNsWCxFQUFTaThCLHVCQUNsQnhvQixNQUFPdEssRUFBTzRELFFBQVEsYUFJOUJwUSxTQUFTeVosY0FBY0osRUFDM0IsQ0FFQSxHQUFJN00sR0FBUTRELFFBQVEsa0JBQW1CLENBQ25DLE1BQU1pSixFQUFjLElBQUlDLFlBQWlDblcsRUFBYW1YLGVBQWdCLENBQ2xGZixPQUFRLENBQ0pnQixRQUFTbFgsRUFBU3E4QixvQkFDbEI1b0IsTUFBT3RLLEVBQU80RCxRQUFRLGFBSTlCcFEsU0FBU3laLGNBQWNKLEVBQzNCLElBNEVSLEVDdEpHLE1BQU15dEIsR0FFRC9oQyxnQkFDQWdpQyxNQUNTQyxTQUFtQixHQUVwQyxjQUNJOXFDLEtBQUs2cUMsTUFBUSxFQUNqQixDQUVPLGtCQUFPMy9CLEdBSVYsT0FISzAvQixHQUFXdDRCLFdBQ1pzNEIsR0FBV3Q0QixTQUFXLElBQUlzNEIsSUFFdkJBLEdBQVd0NEIsUUFDdEIsQ0FFTyxJQUFBN1MsQ0FBSytFLEdBQ0p4RSxLQUFLNnFDLE1BQU12cUMsUUFBVU4sS0FBSzhxQyxVQUMxQjlxQyxLQUFLNnFDLE1BQU1FLFFBRWYvcUMsS0FBSzZxQyxNQUFNcHJDLEtBQUsrRSxFQUNwQixDQUVPLElBQUEyYyxHQUNILE9BQU9uaEIsS0FBSzZxQyxNQUFNN3FDLEtBQUs2cUMsTUFBTXZxQyxPQUFTLEVBQzFDLENBRU8sS0FBQTBxQyxHQUNIaHJDLEtBQUs2cUMsTUFBUSxFQUNqQixHckJoQ0osU0FBWXRULEdBQ1Isc0NBQ0EsbUNBQ0gsQ0FIRCxDQUFZQSxLQUFBQSxHQUFVLEtzQmNmLE1BQU0wVCxHQUVEcGlDLGdCQUVBMlYsV0FDQTlMLFFBRVIsV0FBQW5DLENBQ0lpTyxFQUNBOUwsR0FDQSxHQUFJdTRCLEdBQXVCMzRCLFNBQ3ZCLE1BQU0sSUFBSWhPLE1BQU0sNkRBR3BCdEUsS0FBS3dlLFdBQWFBLEVBQ2xCeGUsS0FBSzBTLFFBQVVBLENBQ25CLENBRUEsMkJBQUF3NEIsQ0FBNEI5NUIsR0FDeEIsTUFBTSxJQUFJOU0sTUFBTSwwQkFDcEIsQ0FFQSxZQUFBcS9CLEdBRUkzakMsS0FBSzBTLFFBQVFZLFlBRWIsTUFBTWpHLEVBQU9yTixLQUFLd2UsV0FBVzJDLE9BRXpCOVQsR0FDQXl2QixHQUFXYyxtQkFBbUJ2d0IsR0FHbEMyUCxFQUFhUSxzQkFBc0IrWixHQUFXNFQsYUFDbEQsQ0FFQSxTQUFBckgsR0FDSTlqQyxLQUFLMFMsUUFBUVksWUFFYixNQUFNakcsRUFBT3JOLEtBQUt3ZSxXQUFXMkMsT0FFekI5VCxHQUNBeXZCLEdBQVdrQixnQkFBZ0Izd0IsR0FHL0IyUCxFQUFhUSxzQkFBc0IrWixHQUFXNFQsYUFDbEQsQ0FHQSx1QkFBQWpCLENBQXdCOTRCLEdBRXBCcFIsS0FBSzBTLFFBQVFZLFlBRWIwSixFQUFhaUIsbUNBQW1DLG1CQUVoRCxNQUFNbXRCLEVBQWF0TyxHQUFXcUIscUJBRTFCaU4sR0FDY0EsRUFBV2wzQixRQUFRLFNBRUxnTyxpQkFBaUIsZUFFL0IvVSxTQUFRRSxJQUNqQkEsRUFBcUIxSixNQUFNbUssZ0JBQWtCc0QsQ0FBSyxJQUd2RDRMLEVBQWFXLCtCQUErQixrQkFBbUJ2TSxFQUFPLFNBR3RFL0IsUUFBUStFLE1BQU0saUJBRXRCLENBSUEsNEJBQU9pM0IsQ0FBc0JoK0IsRUFBNEJpK0IsR0FDckQsSUFBS2orQixHQUF5QixPQUFqQkEsRUFBSzZKLFVBQXFCN0osRUFBSzR1QixhQUFhLG9CQUNyRCxPQUFPLEVBR1gsTUFDTXNQLEVBRGdCdm5DLE9BQU82TSxpQkFBaUJ4RCxHQUNEbStCLGlCQUFpQixvQkFJOUQsT0FGMkI1akMsRUFBTVMsU0FBU2tqQyxHQUVoQjNvQixnQkFBa0Iwb0IsRUFBZTFvQixhQUMvRCxDQUVBLDZCQUFBNm9CLENBQThCcjZCLEdBRTFCLE1BQU0vRCxFQUFPeXZCLEdBQVdxQixxQkFFeEIsR0FBSTl3QixFQUFNLENBQ04sTUFDTWsrQixFQURnQnZuQyxPQUFPNk0saUJBQWlCeEQsR0FDRG0rQixpQkFBaUIsb0JBSTlELE9BRjJCNWpDLEVBQU1TLFNBQVNrakMsR0FFaEIzb0IsZ0JBQWtCeFIsRUFBTXdSLGFBQ3RELENBRUEsT0FBTyxDQXdCWCxDQUVBLGdDQUFBNmYsQ0FBaUNpSixFQUFrQzM5QixHQUUvRCxJQUFJNDlCLEdBQWMsRUFFbEIsT0FBSTU5QixHQUFTN0csRUFBTzhXLHNCQUlwQjB0QixFQUFTditCLFNBQVFFLElBRWIsTUFDTXVmLEVBRFE1b0IsT0FBTzZNLGlCQUFpQnhELEdBQ2ZTLGdCQUVObEcsRUFBTVMsU0FBU3VrQixHQUFVa04sc0JBQ3pCL3JCLEVBQU0rckIsc0JBQ25CNlIsR0FBSyxFQUNULElBR0dBLEVBQ1gsQ0FjQSxrQkFBT3pnQyxHQUVILE1BQU1zVCxFQUFhck0sRUFBb0JFLFNBQVNFLFFBQXFCLGVBQy9ERyxFQUFVUCxFQUFvQkUsU0FBU0UsUUFBa0IsWUFNL0QsT0FKS3ZTLEtBQUtzUyxXQUNOdFMsS0FBS3NTLFNBQVcsSUFBSTI0QixHQUF1QnpzQixFQUFZOUwsSUFHcEQxUyxLQUFLc1MsUUFDaEIsQ0FFQSxjQUFBMDNCLEdBQ0locUMsS0FBSzBTLFFBQVFZLFlBRWIsTUFBTWpHLEVBQU9yTixLQUFLd2UsV0FBVzJDLE9BQzdCLElBQUs5VCxFQUVELFlBREFnQyxRQUFRK0UsTUFBTSxzQkFJbEIsTUFBTWxILEVBQU1HLEVBQUt5RCxjQUNqQixJQUFLNUQsRUFFRCxZQURBbUMsUUFBUStFLE1BQU0scUJBSWxCLE1BQU12SCxFQUFRSyxFQUFJZ0gsUUFBUSxTQUMxQixJQUFLckgsRUFFRCxZQURBd0MsUUFBUStFLE1BQU0sd0JBSWxCLE1BQU1ySCxFQUFRRixFQUFNOUksY0FBYyxVQUFZOEksRUFDeENxeEIsRUFBVzFsQixNQUFNQyxLQUFLMUwsRUFBTTYrQixVQUFVM0osUUFBUS8wQixHQUVoRGd4QixFQUFXLEVBQ1g3dUIsUUFBUStFLE1BQU0sd0JBSWxCMG9CLEdBQVd4dkIsT0FBT1QsRUFBT3F4QixHQUN6QmxoQixFQUFhUSxzQkFBc0IrWixHQUFXNFQsY0FDbEQsQ0FFQSxjQUFBbEIsQ0FBZXJ2QixHQUdYLEdBRkE1YSxLQUFLMFMsUUFBUVksWUFFVHNILEVBQU8sQ0FDUCxNQUFNL04sRUFBUStOLEVBQU03VyxjQUFjLFNBQ2xDLElBQUk4SSxFQVdBLFlBREF3QyxRQUFRK0UsTUFBTSx3QkFWUCxDQUNQLE1BQU1sSCxFQUFNTCxFQUFNOUksY0FBYyxpQkFDaEMsSUFBSW1KLEVBS0EsWUFEQW1DLFFBQVErRSxNQUFNLHdCQUpULENBQ0wsTUFBTThwQixFQUFXMWxCLE1BQU1DLEtBQUs1TCxFQUFNKytCLFNBQVMsR0FBR0EsVUFBVTNKLFFBQVEvMEIsR0FBTyxFQUN2RTR2QixHQUFXeHZCLE9BQU9ULEVBQU9xeEIsRUFDN0IsQ0FJSixDQUlKLEtBQU8sQ0FDSCxNQUFNMTVCLEVBQVV4RSxLQUFLd2UsV0FBVzJDLE9BQ2hDLElBQUszYyxFQUVELFlBREE2SyxRQUFRK0UsTUFBTSxnQ0FJbEIsTUFBTS9HLEVBQU83SSxFQUFRMFAsUUFBUSxNQUM3QixJQUFLN0csRUFFRCxZQURBZ0MsUUFBUStFLE1BQU0sc0JBSWxCLE1BQU1sSCxFQUFNRyxFQUFLeUQsY0FDWGpFLEVBQVFRLEVBQUs2RyxRQUFRLFNBQzNCLElBQUtySCxFQUVELFlBREF3QyxRQUFRK0UsTUFBTSx3QkFJbEIsR0FBSWxILEVBQUssQ0FDTCxNQUFNZ3hCLEVBQVcxbEIsTUFBTUMsS0FBSzVMLEVBQU0rK0IsU0FBUyxHQUFHQSxVQUFVM0osUUFBUS8wQixHQUFPLEVBQ3ZFNHZCLEdBQVd4dkIsT0FBT1QsRUFBT3F4QixHQUV6QmxoQixFQUFhUSxzQkFBc0IrWixHQUFXNFQsYUFDbEQsQ0FFSixDQUNKLENBK0JBLGdCQUFBckIsR0FDSTlwQyxLQUFLMFMsUUFBUVksWUFFYixNQUFNOU8sRUFBVXhFLEtBQUt3ZSxXQUFXMkMsT0FDaEMsSUFBSzNjLEVBRUQsWUFEQTZLLFFBQVErRSxNQUFNLGdDQUlsQixNQUFNL0csRUFBTzdJLEVBQVEwUCxRQUFRLE1BQzdCLElBQUs3RyxFQUVELFlBREFnQyxRQUFRK0UsTUFBTSxzQkFJbEIsTUFBTXZILEVBQVFRLEVBQUs2RyxRQUFRLFNBQzNCLElBQUtySCxFQUVELFlBREF3QyxRQUFRK0UsTUFBTSx3QkFJbEIsTUFBTXlwQixFQUFjcmxCLE1BQU1DLEtBQUtwTCxFQUFLeUQsY0FBZTg2QixVQUFVM0osUUFBUTUwQixHQUNyRXl2QixHQUFXdHZCLFVBQVVYLEVBQU9neEIsR0FFNUI3Z0IsRUFBYVEsc0JBQXNCK1osR0FBVzRULGFBRWxELENBRUEsaUJBQUFwQixDQUFrQm52QixHQUdkLEdBRkE1YSxLQUFLMFMsUUFBUVksWUFFVHNILEVBQU8sQ0FDUCxNQUFNL04sRUFBUStOLEVBQU03VyxjQUFjLFNBQzlCOEksR0FDQWl3QixHQUFXdHZCLFVBQVVYLEVBRTdCLEtBQU8sQ0FDSCxNQUFNckksRUFBVXhFLEtBQUt3ZSxXQUFXMkMsT0FDaEMsSUFBSzNjLEVBRUQsWUFEQTZLLFFBQVErRSxNQUFNLGdDQUlsQixNQUFNL0csRUFBTzdJLEVBQVEwUCxRQUFRLE1BQzdCLElBQUs3RyxFQUVELFlBREFnQyxRQUFRK0UsTUFBTSxzQkFJbEIsTUFBTXZILEVBQVFRLEVBQUs2RyxRQUFRLFNBQzNCLElBQUtySCxFQUVELFlBREF3QyxRQUFRK0UsTUFBTSx3QkFJbEIsTUFBTXlwQixFQUFjcmxCLE1BQU1DLEtBQUtwTCxFQUFLeUQsY0FBZTg2QixVQUFVM0osUUFBUTUwQixHQUNyRXl2QixHQUFXdHZCLFVBQVVYLEVBQU9neEIsRUFBYyxHQUUxQzdnQixFQUFhUSxzQkFBc0IrWixHQUFXNFQsYUFDbEQsQ0FDSixDQUVBLHFCQUFBVSxDQUFzQmp4QixHQUNDQSxFQUFNN1csY0FBYyxrQkFDNUJKLE1BQU1nTixXQUFhLFNBQ2xDLENBRUEsdUJBQUFtN0IsQ0FBd0JseEIsR0FDREEsRUFBTTdXLGNBQWMscUJBQzVCSixNQUFNZ04sV0FBYSxTQUNsQyxDQUVBLG9CQUFBbzdCLENBQXFCbnhCLEdBQ0VBLEVBQU03VyxjQUFjLGtCQUM1QkosTUFBTWdOLFdBQWEsUUFDbEMsQ0FFQSx1QkFBQXE3QixDQUF3QnB4QixHQUNEQSxFQUFNN1csY0FBYyxxQkFDNUJKLE1BQU1nTixXQUFhLFFBQ2xDLENBZUEsc0JBQUEyTixDQUF1QkgsRUFBb0JwUSxHQUV2QyxNQUFNbEIsRUFBUTdNLEtBQUt3ZSxXQUFXMkMsUUFBUWpOLFFBQVFnakIsR0FBWXB0QixPQUV0RCtDLEdBQ0Fpd0IsR0FBVytCLHNCQUFzQmh5QixFQUFPc1IsRUFBT3BRLEVBRXZELEVDNVlHLE1BQU1rK0IsR0FFSHBqQyxhQUF1QiwyQkFDdkJBLGdCQUVBcWpDLFVBQXNCLEdBQ3RCQyxVQUFzQixHQUU5QixXQUFZaHNDLEdBQ1YsT0FBTzJELFNBQVNDLGNBQWNrb0MsR0FBUUcsTUFDeEMsQ0FFQSxjQUVFLEdBQUlILEdBQVEzNUIsU0FDVixNQUFNLElBQUloTyxNQUFNLDhDQUdsQnRFLEtBQUtxVCxlQUNMclQsS0FBS3NULFdBQ1AsQ0FFQSxTQUFBQSxHQUNNdFQsS0FBS0csVUFDUEgsS0FBS2tzQyxVQUFVenNDLEtBQUtPLEtBQUtHLFFBQVFvTixXQUNqQ3ZOLEtBQUttc0MsVUFBWSxHQUVyQixDQUVRLElBQUFFLEdBQ04sR0FBSXJzQyxLQUFLa3NDLFVBQVU1ckMsT0FBUyxHQUFLTixLQUFLRyxRQUFTLENBQzdDSCxLQUFLbXNDLFVBQVUxc0MsS0FBS08sS0FBS0csUUFBUW9OLFdBQ2pDLE1BQU0rK0IsRUFBaUJ0c0MsS0FBS2tzQyxVQUFVdEYsTUFDdEM1bUMsS0FBS0csUUFBUW9OLFVBQVkrK0IsQ0FDM0IsQ0FDRixDQUVRLElBQUFDLEdBQ04sR0FBSXZzQyxLQUFLbXNDLFVBQVU3ckMsT0FBUyxHQUFLTixLQUFLRyxRQUFTLENBQzdDSCxLQUFLa3NDLFVBQVV6c0MsS0FBS08sS0FBS0csUUFBUW9OLFdBQ2pDLE1BQU1pL0IsRUFBZXhzQyxLQUFLbXNDLFVBQVV2RixNQUNwQzVtQyxLQUFLRyxRQUFRb04sVUFBWWkvQixDQUMzQixDQUNGLENBR0EsWUFBQW41QixHQUNFdlAsU0FBU3NMLGlCQUFpQixXQUFZd0UsSUFDaENBLEVBQU1rbEIsU0FBeUIsTUFBZGxsQixFQUFNeE4sS0FDekJwRyxLQUFLcXNDLE9BQ0x6NEIsRUFBTVksa0JBQ0daLEVBQU1rbEIsU0FBeUIsTUFBZGxsQixFQUFNeE4sTUFDaENwRyxLQUFLdXNDLE9BQ0wzNEIsRUFBTVksaUJBQ1IsR0FFSixDQVlBLGtCQUFPdEosR0FLTCxPQUpLK2dDLEdBQVEzNUIsV0FDWDI1QixHQUFRMzVCLFNBQVcsSUFBSTI1QixJQUdsQkEsR0FBUTM1QixRQUNqQixHdEJ4RUYsU0FBWWtsQixHQUVSLGdCQUVBLGFBQ0gsQ0FMRCxDQUFZQSxLQUFBQSxHQUFVLEt1QlNmLE1BQU1pVixHQUVENWpDLGdCQUVSaUssVUFNQSxZQUFvQkEsR0FDaEJoUCxTQUFTc0wsaUJBQWlCLFVBQVdwUCxLQUFLMHNDLGdCQUFnQnJrQixLQUFLcm9CLE9BRS9EQSxLQUFLOFMsVUFBWUEsQ0FDckIsQ0FRQSxNQUFBazJCLEdBQ0kzNUIsUUFBUUMsSUFBSSxzREFDaEIsQ0FPTyxrQkFBT3BFLEdBRVYsSUFBS3VoQyxHQUFtQm42QixTQUFVLENBRTlCLE1BQU1RLEVBQVlYLEVBQW9CRSxTQUFTRSxRQUFvQixjQUVuRWs2QixHQUFtQm42QixTQUFXLElBQUltNkIsR0FBbUIzNUIsRUFDekQsQ0FDQSxPQUFPMjVCLEdBQW1CbjZCLFFBQzlCLENBRVEsZUFBQW82QixDQUFnQjk0QixHQUVwQixJQUFLNVQsS0FBSzhTLFVBQVVwQyxXQUFha0QsRUFBTXhOLElBQUlrN0IsV0FBVyxXQUFhMXRCLEVBQU1tbEIsU0FBV25sQixFQUFNa2xCLFVBQVlsbEIsRUFBTW1sQixTQUFXbmxCLEVBQU13ZSxXQUFheGUsRUFBTXF0QixRQUFTLENBRXJKLE1BQU0wTCxFQUFrQjdvQyxTQUFTb1YsY0FFakMsR0FBSXl6QixHQUFtQkEsRUFBZ0JyeEIsbUJBQy9CdGIsS0FBSzRzQyxxQkFBcUJELEVBQWlCLzRCLEVBQU14TixLQUFvQixDQUVyRSxNQUFNeW1DLEVBQWU3c0MsS0FBSzhzQyxpQkFBaUJILEVBQWlCLzRCLEVBQU14TixLQUM5RHltQyxJQUVBajVCLEVBQU1ZLGlCQUNOWixFQUFNOG5CLDJCQUVGOW5CLEVBQU14TixLQUFPK3dCLEdBQVd3SCxTQUFXL3FCLEVBQU14TixLQUFPK3dCLEdBQVd5SCxXQUMzRDUrQixLQUFLK3NDLDRCQUE0QkosRUFBaUJFLEdBR2xEajVCLEVBQU14TixLQUFPK3dCLEdBQVd1SCxXQUN4QjluQixFQUFTNEUsa0NBQWtDcXhCLEdBRzNDajVCLEVBQU14TixLQUFPK3dCLEdBQVdzSCxZQUN4QjduQixFQUFTd0Usb0NBQW9DeXhCLEdBR2pEQSxFQUFheDdCLFFBRXJCLENBRVIsQ0FDSixDQVVRLG9CQUFBdTdCLENBQXFCcG9DLEVBQXNCZzZCLEdBRS9DLE1BQU0xcEIsRUFBTTlRLE9BQU8rUSxlQUduQixHQUFJRCxHQUFPQSxFQUFJRSxXQUFhLEVBQUcsQ0FDM0IsSUFBSUMsRUFBUUgsRUFBSUksV0FBVyxHQUMzQixHQUFJRCxFQUFNK0MsV0FBYS9DLEVBQU00QyxZQUN6QixPQUFPLENBR2YsQ0FFQSxHQUFJL0MsR0FBT0EsRUFBSUUsV0FBYSxFQUFHLENBQzNCLE1BQU0sUUFBRXVDLEVBQU8sTUFBRUMsR0FBVVosRUFBU08scUJBQXFCM1MsR0FDbkR3b0MsRUFBZ0JodEMsS0FBS2l0QyxpQkFBaUJ6b0MsRUFBU2d6QixHQUFXMFYsT0FDMURDLEVBQWVudEMsS0FBS2l0QyxpQkFBaUJ6b0MsRUFBU2d6QixHQUFXNFYsTUFFL0QsU0FBSzVPLElBQWNySCxHQUFXdUgsV0FBYW5uQixHQUFhaW5CLElBQWNySCxHQUFXc0gsWUFBY2puQixHQUMxRmduQixJQUFjckgsR0FBV3dILFVBQVlwbkIsR0FBV3kxQixJQUNoRHhPLElBQWNySCxHQUFXeUgsWUFBY3BuQixHQUFTMjFCLEdBS3pELENBRUEsT0FBTyxDQUNYLENBRVEsZ0JBQUFGLENBQWlCem9DLEVBQXNCNm9DLEdBSTNDLEdBRnVELEtBQWhDN29DLEVBQVF3SCxhQUFhc00sT0FHeEMsT0FBTyxFQUdYLE1BQU14QixFQUFZOVMsT0FBTytRLGVBQ3pCLElBQUsrQixHQUFzQyxJQUF6QkEsRUFBVTlCLFdBQWtCLE9BQU8sRUFFckQsTUFDTTRPLEVBRFE5TSxFQUFVNUIsV0FBVyxHQUNoQmlhLGlCQUFpQixHQUVwQyxJQUFLdkwsRUFBTSxPQUFPLEVBRWxCLE1BQU05UixFQUFjdE4sRUFBUXVOLHdCQUc1QixPQUFJczdCLElBQWE3VixHQUFXMFYsTUFDakJwcEIsS0FBS0MsSUFBSUgsRUFBS25WLElBQU1xRCxFQUFZckQsS0FIekIsR0FJUDQrQixJQUFhN1YsR0FBVzRWLE1BQ3hCdHBCLEtBQUtDLElBQUlILEVBQUt3UCxPQUFTdGhCLEVBQVlzaEIsUUFMNUIsRUFTdEIsQ0FVUSxnQkFBQTBaLENBQWlCbm5CLEVBQXNCNlksR0FDM0MsTUFBTThPLEVBQWU5MEIsTUFBTUMsS0FBSzNVLFNBQVNvZSxpQkFBaUIsNkJBQ3BEcXJCLEVBQWVELEVBQWFyTCxRQUFRdGMsR0FFMUMsR0FBSUEsRUFBUXpSLFFBQVEsTUFBTyxDQUN2QixNQUFNckgsRUFBUThZLEVBQVF6UixRQUFRLFNBQ3hCN0csRUFBT3NZLEVBQVF6UixRQUFRLE1BQzdCLEdBQUlySCxHQUFTUSxFQUFNLENBQ2YsTUFBTW1nQyxFQUFlMVEsR0FBV3lCLGdCQUFnQjF4QixFQUFPUSxFQUFNbXhCLEdBQzdELEdBQUlnUCxFQUNBLE9BQU9BLENBRWYsQ0FDSixDQUVBLElBQUlDLEdBQWEsRUFPakIsT0FMSUEsRUFEQWpQLElBQWNySCxHQUFXdUgsV0FBYUYsSUFBY3JILEdBQVdzSCxXQUNuREQsSUFBY3JILEdBQVd1SCxVQUFZNk8sRUFBZSxFQUFJQSxFQUFlLEVBRXZFdnRDLEtBQUswdEMscUJBQXFCL25CLEVBQVMybkIsRUFBYzlPLEdBRzdEaVAsRUFBWSxHQUFLQSxHQUFhSCxFQUFhaHRDLE9BQ3BDLEtBR0pndEMsRUFBYUcsSUFBYyxJQUN0QyxDQVdRLG9CQUFBQyxDQUFxQi9uQixFQUFzQjJuQixFQUE2QjlPLEdBQzVFLE1BQU0rTyxFQUFlRCxFQUFhckwsUUFBUXRjLEdBQ3BDNE0sRUFBYzVNLEVBQVE1VCx3QkFDNUIsSUFBSTQ3QixHQUFnQixFQUNoQkMsRUFBa0JqcUIsSUFldEIsT0FiQTJwQixFQUFhbmdDLFNBQVEsQ0FBQzBnQyxFQUFVeHFDLEtBQzVCLEdBQUl3cUMsSUFBYWxvQixFQUFTLENBQ3RCLE1BQU0vQixFQUFPaXFCLEVBQVM5N0Isd0JBQ2hCKzdCLEVBQW1CdFAsSUFBY3JILEdBQVd3SCxRQUFVcE0sRUFBWTlqQixJQUFNbVYsRUFBS3dQLE9BQVN4UCxFQUFLblYsSUFBTThqQixFQUFZYSxPQUM3RzJhLEVBQXFCanFCLEtBQUtDLElBQUl3TyxFQUFZcmdCLEtBQU8wUixFQUFLMVIsTUFFeEQ0N0IsRUFBbUIsR0FBTUEsRUFBbUJDLEVBQXFCSCxJQUNqRUEsRUFBa0JFLEVBQW1CQyxFQUNyQ0osRUFBZXRxQyxFQUV2QixNQUdxQixJQUFsQnNxQyxFQUFzQkosRUFBZUksQ0FDaEQsQ0FTUSwyQkFBQVosQ0FBNEJwbkIsRUFBc0Jxb0IsR0FDdEQsTUFBTWw1QixFQUFNOVEsT0FBTytRLGVBQ25CLEdBQUlELEdBQU9BLEVBQUlFLFdBQWEsRUFBRyxDQUMzQixNQUNNNE8sRUFEZTlPLEVBQUlJLFdBQVcsR0FDVm5ELHdCQUUxQitDLEVBQUlVLGtCQUNKLE1BQU1QLEVBQVFuUixTQUFTMlQsY0FFakJ3MkIsRUFBU25xQyxTQUFTbVcsaUJBQWlCK3pCLEVBQU05ekIsV0FBV0MsV0FDMUQsSUFBSXBELEVBQU9rM0IsRUFBTzF6QixXQUNkMnpCLEVBQVduM0IsRUFDWG8zQixFQUFhLEVBQ2JDLEVBQWV6cUIsSUFFbkIsR0FBSXVxQixFQUFVLENBQ1YsR0FDSSxHQUFLbjNCLEdBQVNBLEVBQUtzM0IsVUFBbkIsQ0FFQXA1QixFQUFNNkMsU0FBU2YsRUFBTSxHQUNyQjlCLEVBQU0wQyxPQUFPWixFQUFNQSxFQUFLczNCLFVBQVUvdEMsUUFFbEMsSUFBSyxJQUFJRSxFQUFJLEVBQUdBLEVBQUl1VyxFQUFLczNCLFVBQVUvdEMsT0FBUUUsSUFBSyxDQUM1Q3lVLEVBQU02QyxTQUFTZixFQUFNdlcsR0FDckJ5VSxFQUFNeUYsVUFBUyxHQUNmLE1BQU00ekIsRUFBV3I1QixFQUFNbEQsd0JBRWpCZzhCLEVBQXFCanFCLEtBQUtDLElBQUl1cUIsRUFBU3A4QixLQUFPMFIsRUFBSzFSLE1BQ3JENjdCLEVBQXFCSyxJQUNyQkEsRUFBZUwsRUFDZkcsRUFBV24zQixFQUNYbzNCLEVBQWEzdEMsRUFFckIsQ0FoQnNDLFFBaUJqQ3VXLEVBQU9rM0IsRUFBTzF6QixZQUV2QnRGLEVBQU02QyxTQUFTbzJCLEVBQVVDLEdBQ3pCbDVCLEVBQU15RixVQUFTLEdBQ2Y1RixFQUFJVyxTQUFTUixFQUNqQixNQUNJQSxFQUFNeUMsbUJBQW1CczJCLEdBQ3pCLzRCLEVBQU15RixVQUFTLEdBQ2Y1RixFQUFJVyxTQUFTUixFQUVyQixDQUNKLEVDM1BKblIsU0FBU3NMLGlCQUFpQixvQkFBb0IsV0FFMUMrQyxFQUFvQkUsU0FBU25JLFNBQVMsWUFBWSxJQUFNK2hDLEdBQVEvZ0MsZ0JBQ2hFaUgsRUFBb0JFLFNBQVNuSSxTQUFTLHNCQUFzQixJQUFNaWdDLEdBQWtCai9CLGdCQUNwRmlILEVBQW9CRSxTQUFTbkksU0FBUyxtQkFBbUIsSUFBTXVnQyxHQUFldi9CLGdCQUU5RWlILEVBQW9CRSxTQUFTbkksU0FBUyxlQUFlLElBQU0wZ0MsR0FBVzEvQixnQkFDdEVpSCxFQUFvQkUsU0FBU25JLFNBQVMsMEJBQTBCLElBQU12QixFQUFzQnVDLGdCQUM1RmlILEVBQW9CRSxTQUFTbkksU0FBUywwQkFBMEIsSUFBTXlnQixHQUFzQnpmLGdCQUM1RmlILEVBQW9CRSxTQUFTbkksU0FBUywyQkFBMkIsSUFBTStnQyxHQUF1Qi8vQixnQkFDOUZpSCxFQUFvQkUsU0FBU25JLFNBQVMsMkJBQTJCLElBQU1xVSxFQUF1QnJULGdCQUc5RmlILEVBQW9CRSxTQUFTbkksU0FBUyxjQUFjLElBQU11dEIsR0FBVXZzQixnQkFDcEVpSCxFQUFvQkUsU0FBU25JLFNBQVMsZ0NBQWdDLElBQU1rMUIsR0FBNEJsMEIsZ0JBQ3hHaUgsRUFBb0JFLFNBQVNuSSxTQUFTLHVCQUF1QixJQUFNdWlDLEdBQW1CdmhDLGdCQUV0RjA5QixHQUFVN2pCLFFBQVFxSixRQUNsQjJhLEdBQWtCNzlCLGNBQWM4OUIsU0FDaEN5RCxHQUFtQnZoQyxjQUFjODlCLFFBQ3JDLEciLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9hc3NldHMvY3NzL21haW4uY3NzIiwid2VicGFjazovL2pvaGFubmVzLy4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qcyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9zb3VyY2VNYXBzLmpzIiwid2VicGFjazovL2pvaGFubmVzLy4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzIiwid2VicGFjazovL2pvaGFubmVzLy4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qcyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydFN0eWxlRWxlbWVudC5qcyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3NldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlcy5qcyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlRG9tQVBJLmpzIiwid2VicGFjazovL2pvaGFubmVzLy4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvd2VicGFjay9ydW50aW1lL2NvbXBhdCBnZXQgZGVmYXVsdCBleHBvcnQiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovL2pvaGFubmVzL3dlYnBhY2svcnVudGltZS9oYXNPd25Qcm9wZXJ0eSBzaG9ydGhhbmQiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvd2VicGFjay9ydW50aW1lL25vbmNlIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbW1vbi9Db250ZW50VHlwZXMudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tbW9uL0ljb25zLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbW1vbi9DdXN0b21FdmVudHMudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tbW9uL0NvbG9ycy50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21tYW5kcy9Db21tYW5kcy50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21tb24vQ3VzdG9tVUlFdmVudHMudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29yZS9CdXR0b25JRHMudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tbW9uL1pJbmRleC50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21tb24vRGVmYXVsdEpTRXZlbnRzLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvcmUvRHJvcGRvd25JdGVtSURzLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvcmUvRHJvcGRvd25MaXN0SURzLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvcmUvRHJvcGRvd25NZW51SURzLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2Fzc2V0cy9jc3MvbWFpbi5jc3M/MWZiYSIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy91dGlsaXRpZXMvVXRpbHMudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvc2VydmljZXMvZWxlbWVudC1mYWN0b3J5L0VsZW1lbnRGYWN0b3J5U2VydmljZS50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21wb25lbnRzL2NvbW1vbi9CYXNlVUlDb21wb25lbnQudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29yZS9EZXBlbmRlbmN5Q29udGFpbmVyLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbXBvbmVudHMvZWRpdG9yL0VkaXRvci50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy91dGlsaXRpZXMvRE9NVXRpbHMudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tbWFuZHMvVUlBY3Rpb25zL0NoYW5nZUNvbG9yLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbW1hbmRzL1VJQWN0aW9ucy9TaG93SGlkZUFjdGl2ZUJ1dHRvbi50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21tYW5kcy9VSUFjdGlvbnMvUmVzZXRBY3RpdmVCdXR0b25zLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbW1hbmRzL1VJQWN0aW9ucy9DbG9zZUVsZW1lbnQudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tbWFuZHMvVUlBY3Rpb25zL1Nob3dFbGVtZW50LnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbW1hbmRzL0V2ZW50RW1pdHRlci50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9zZXJ2aWNlcy9ibG9jay1vcGVyYXRpb25zL0Jsb2NrT3BlcmF0aW9uc1NlcnZpY2UudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tcG9uZW50cy9hZGQtYmxvY2svQWRkQmxvY2tCdXR0b24udHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tcG9uZW50cy9hZGQtYmxvY2svQWRkQmxvY2tXcmFwcGVyLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbW1vbi9TaXplcy50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21wb25lbnRzL2NvbW1vbi9TVkdJY29uLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2J1aWxkZXJzL0FkZEJsb2NrQnVpbGRlci50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvZHJvcGRvd24tdG9vbC9Ecm9wZG93bk1lbnUudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tbW9uL0Jhc2VEb3VibHlMaW5rZWRMaXN0LnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbW1vbi9KTm9kZS50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21tb24vQ2lyY3VsYXJEb3VibHlMaW5rZWRMaXN0LnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbXBvbmVudHMvZmxvYXRpbmctdG9vbGJhci9kcm9wZG93bi10b29sL0Ryb3Bkb3duTWVudUxpc3RJdGVtLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbXBvbmVudHMvZmxvYXRpbmctdG9vbGJhci9kcm9wZG93bi10b29sL0Ryb3Bkb3duTWVudUxpc3QudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL3NlcGFyYXRvci9GbG9hdGluZ1Rvb2xiYXJTZXBhcmF0b3IudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL2J1dHRvbi1ncm91cC9CdXR0b25Hcm91cC50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvYnV0dG9uLWdyb3VwL0J1dHRvbkdyb3VwSXRlbS50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvZHJvcGRvd24tdG9vbC9Db2xvckljb24udHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL2Ryb3Bkb3duLXRvb2wvRHJvcGRvd25NZW51QnV0dG9uLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbXBvbmVudHMvZmxvYXRpbmctdG9vbGJhci9kcm9wZG93bi10b29sL0Ryb3Bkb3duTWVudUxpc3RJdGVtVGl0bGUudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvc2VydmljZXMvdGV4dC1vcGVyYXRpb25zL1RleHRPcGVyYXRpb25zU2VydmljZS50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvbGluay1ib3gvSW5wdXRMaW5rQm94LnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbXBvbmVudHMvZmxvYXRpbmctdG9vbGJhci9saW5rLWJveC9JbnB1dExpbmtCb3hXcmFwcGVyLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbXBvbmVudHMvZmxvYXRpbmctdG9vbGJhci9GbG9hdGluZ1Rvb2xiYXIudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL1RleHRDb250ZXh0RmxvYXRpbmdUb29sYmFyLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2J1aWxkZXJzL1RleHRDb250ZXh0RmxvYXRpbmdUb29sYmFyQnVpbGRlci50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21wb25lbnRzL3F1aWNrLW1lbnUvUXVpY2tNZW51RW1wdHkudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tbW9uL0RPTUVsZW1lbnRzLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbW1vbi9EaXJlY3Rpb25zLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL3NlcnZpY2VzL3RhYmxlLW9wZXJhdGlvbnMvVGFibGVTY29wZXMudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tbW9uL0tleWJvYXJkS2V5cy50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvU2VsZWN0aW9uTW9kZS50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb3JlL1Rvb2xiYXJJRHMudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tbW9uL0JvdW5kYXJpZXMudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tcG9uZW50cy9xdWljay1tZW51L1F1aWNrTWVudS50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21tb24vRG91Ymx5TGlua2VkTGlzdC50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21wb25lbnRzL3F1aWNrLW1lbnUvUXVpY2tNZW51U2VjdGlvbi50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21wb25lbnRzL3F1aWNrLW1lbnUvUXVpY2tNZW51SXRlbS50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9idWlsZGVycy9RdWlja01lbnVCdWlsZGVyLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbXBvbmVudHMvdGl0bGUvVGl0bGUudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvYnVpbGRlcnMvVGl0bGVCdWlsZGVyLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbXBvbmVudHMvY29udGVudC9Db250ZW50LnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2J1aWxkZXJzL0NvbnRlbnRCdWlsZGVyLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL3V0aWxpdGllcy9UYWJsZVV0aWxzLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbXBvbmVudHMvZmxvYXRpbmctdG9vbGJhci9UYWJsZUNvbnRleHRGbG9hdGluZ1Rvb2xiYXIudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvYnVpbGRlcnMvVGFibGVDb250ZXh0RmxvYXRpbmdUb29sYmFyQnVpbGRlci50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21wb25lbnRzL21lZGlhLWlucHV0dGVyL01lZGlhSW5wdXR0ZXIudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvYnVpbGRlcnMvTWVkaWFJbnB1dHRlckJ1aWxkZXIudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvYnVpbGRlcnMvRWRpdG9yQnVpbGRlci50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9idWlsZGVycy9VSUJ1aWxkZXIudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tbWFuZHMvQ29tbWFuZERpc3BhdGNoZXIudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29yZS9TaG9ydGN1dExpc3RlbmVycy50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb3JlL2xpc3RlbmVycy9UYWJsZUxpc3RlbmVycy50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb3JlL0ZvY3VzU3RhY2sudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvc2VydmljZXMvdGFibGUtb3BlcmF0aW9ucy9UYWJsZU9wZXJhdGlvbnNTZXJ2aWNlLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvcmUvTWVtZW50by50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb3JlL0VkaXRhYmxlTmF2aWdhdGlvbi50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBgLyoqIGN1cnNvciBzdHlsZSAqL1xuW2NvbnRlbnRlZGl0YWJsZT1cInRydWVcIl0ge1xuICAgIGN1cnNvcjogdGV4dCAhaW1wb3J0YW50O1xufVxuXG5cblxuLyoqIENTUyByZXNldCAqL1xuXG4uYnV0dG9uLXJlc2V0IHtcbiAgICBib3JkZXI6IG5vbmU7XG4gICAgbWFyZ2luOiAwO1xuICAgIHBhZGRpbmc6IDA7XG4gICAgd2lkdGg6IGF1dG87XG4gICAgb3ZlcmZsb3c6IHZpc2libGU7XG4gICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gICAgY29sb3I6IGluaGVyaXQ7XG4gICAgZm9udDogaW5oZXJpdDtcbiAgICBsaW5lLWhlaWdodDogbm9ybWFsO1xuICAgIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGluaGVyaXQ7XG4gICAgLW1vei1vc3gtZm9udC1zbW9vdGhpbmc6IGluaGVyaXQ7XG4gICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xufVxuXG5cblxuLyoqIGFkZCBibG9jayAqL1xuLmFkZC1ibG9jayB7XG4gICAgbWFyZ2luOiAwO1xuICAgIHBhZGRpbmc6IDA7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgIGJvcmRlcjogMXB4IHNvbGlkICMwMDA7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XG4gICAgdHJhbnNpdGlvbjogYWxsIDAuM3MgZWFzZTtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIG1hcmdpbi1sZWZ0OiAxLjNyZW07XG59XG5cbi5hZGQtYmxvY2std3JhcHBlciB7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiAzLjEyNXJlbTtcbn1cblxuLmFkZC1ibG9jay13cmFwcGVyOmhvdmVyIC5hZGQtYmxvY2sge1xuICAgIGRpc3BsYXk6IGZsZXg7XG59XG5cbi8qKiBhbmQgYWRkIGJsb2NrICovXG5cblxuXG4vKiogTGlzdCAgKiovXG5vbC5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQsXG51bC5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQge1xuICAgIHBhZGRpbmctbGVmdDogMXJlbSAhaW1wb3J0YW50O1xufVxuXG5cblxuLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCBsaT5idXR0b24ge1xuICAgIC8qIGRpc3BsYXk6IG5vbmU7ICovXG4gICAgZGlzcGxheTogbm9uZTtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgbWFyZ2luLWxlZnQ6IDEwcHg7XG4gICAgdG9wOiAwO1xuXG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICBhbGlnbi1pdGVtczogc3RhcnQ7XG4gICAganVzdGlmeS1jb250ZW50OiBzdGFydDtcblxufVxuXG4uam9oYW5uZXMtY29udGVudC1lbGVtZW50IGxpIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG5cbi5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQgbGk6OmJlZm9yZSB7XG4gICAgbWFyZ2luLWxlZnQ6IDAuMzEyNXJlbTtcbn1cblxuLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCBsaTpob3Zlcj5idXR0b24ge1xuICAgIC8qIGRpc3BsYXk6IGlubGluZS1ibG9jazsgKi9cbiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcblxufVxuXG5wLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIGxpbmUtaGVpZ2h0OiAxO1xuICAgIG1hcmdpbjogMDtcbiAgICBwYWRkaW5nOiAwO1xufVxuXG4uam9oYW5uZXMtY29udGVudC1lbGVtZW50IC5jaGVja2JveC1saXN0IHtcbiAgICBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7XG4gICAgcGFkZGluZy1sZWZ0OiAwICFpbXBvcnRhbnQ7XG59XG5cblxuLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCAuY2hlY2tib3gtbGlzdCBsaSB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIGp1c3RpZnktY29udGVudDogbGVmdDtcbn1cblxuXG4uam9oYW5uZXMtY29udGVudC1lbGVtZW50IHVsLmNoZWNrYm94LWxpc3QgaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdOmNoZWNrZWQrc3BhbiB7XG4gICAgdGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7XG59XG5cbi8qIHVsLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudDpub3QoLmNoZWNrYm94LWxpc3QpLFxub2wuam9oYW5uZXMtY29udGVudC1lbGVtZW50Om5vdCguY2hlY2tib3gtbGlzdCkge1xuICAgIHBhZGRpbmctbGVmdDogMS41cmVtICFpbXBvcnRhbnQ7XG59ICovXG5cbi8qKiBBZGQgbGluZSB0aHJvdWdoIHRleHQgZGVjb3JhdGlvbiB0byBjaGVja2VkIGNoZWNrYm94ZXMgdGV4dCBkaXYgKi9cbi5ibG9jayBpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl06Y2hlY2tlZCtkaXYge1xuICAgIHRleHQtZGVjb3JhdGlvbjogbGluZS10aHJvdWdoO1xufVxuXG4vKiogUmVtb3ZlIHRoZSBkZWZhdWx0IGxpc3Qgc3R5bGUgYW5kIHJlcGxhY2UgYnkgYW5vdGhlciB0aGF0IHdvcmtzIHdpdGggZGlzcGxheSBmbGV4ICovXG4uYmxvY2sgb2wsXG4uYmxvY2sgdWwge1xuICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG59XG5cbi5ibG9jayB1bCAubGlzdC1pdGVtLFxuLmJsb2NrIG9sIC5saXN0LWl0ZW0ge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xufVxuXG4uYmxvY2sgb2wgbGkge1xuICAgIGNvdW50ZXItaW5jcmVtZW50OiBpdGVtO1xufVxuXG4uYmxvY2sgb2wgbGk6OmJlZm9yZSB7XG4gICAgY29udGVudDogY291bnRlcihpdGVtKSBcIi4gXCI7XG4gICAgbWFyZ2luLXJpZ2h0OiAwLjMxMjVyZW07XG59XG5cbi5ibG9jayB1bCBsaTpub3QoLmxpc3QtaXRlbS1jaGVja2FibGUpOjpiZWZvcmUge1xuICAgIGNvbnRlbnQ6IFwi4oCiIFwiO1xuICAgIG1hcmdpbi1yaWdodDogMC4zMTI1cmVtO1xufVxuXG5cblxuLyoqIGFuZCBsaXN0ICoqL1xuXG5cblxuLmJsb2NrPi5kcmFnLWhhbmRsZXIge1xuICAgIGNvbG9yOiAjODQ4ODhkO1xuICAgIHZpc2liaWxpdHk6IGhpZGRlbjtcbiAgICBjdXJzb3I6IGdyYWI7XG4gICAgYWxpZ24tc2VsZjogc3RhcnQ7XG5cbiAgICAvKiBiYWNrZ3JvdW5kLWNvbG9yOiBwaW5rOyAqL1xuICAgIHBhZGRpbmctdG9wOiAwLjMzcmVtO1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbn1cblxuLmRyYWctaGFuZGxlciBzdmcge1xuICAgIC8qIGJhY2tncm91bmQtY29sb3I6IHJlZDsgKi9cbn1cblxuLmRyYWctaGFuZGxlciBzdmcgdXNlIHtcbiAgICAvKiBiYWNrZ3JvdW5kLWNvbG9yOiBibHVlOyAqL1xufVxuXG4uZHJhZy1oYW5kbGVyOmFjdGl2ZSB7XG4gICAgY3Vyc29yOiBncmFiYmluZztcbn1cblxuLmJsb2NrIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgbWFyZ2luLWJvdHRvbTogMXJlbTtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgbWF4LXdpZHRoOiAxMDAlO1xufVxuXG4uYmxvY2s+Kjpub3QoLmRyYWctaGFuZGxlcikge1xuICAgIHBhZGRpbmctbGVmdDogMS4yNXJlbSAhaW1wb3J0YW50O1xufVxuXG4uYmxvY2s6aG92ZXIgLmRyYWctaGFuZGxlciB7XG4gICAgdmlzaWJpbGl0eTogdmlzaWJsZTtcbiAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wO1xuICAgIGp1c3RpZnktY29udGVudDogc3RhcnQ7XG59XG5cbi5kcm9wLWxpbmUge1xuICAgIGhlaWdodDogMXJlbTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjODQ4ODhkO1xuICAgIHdpZHRoOiAxMDAlO1xufVxuXG5cbi50aXRsZSBoMSB7XG4gICAgbWFyZ2luLWxlZnQ6IDEuM3JlbTtcbn1cblxuXG5bY29udGVudGVkaXRhYmxlPVwidHJ1ZVwiXTplbXB0eTpmb2N1cyB7XG4gICAgY29udGVudDogYXR0cihkYXRhLXBsYWNlaG9sZGVyKTtcbiAgICBjb2xvcjogIzg0ODg4ZDtcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cblxuaDFbZGF0YS1wbGFjZWhvbGRlcl06ZW1wdHk6YmVmb3JlIHtcbiAgICBjb250ZW50OiBhdHRyKGRhdGEtcGxhY2Vob2xkZXIpO1xuICAgIGNvbG9yOiAjODQ4ODhkICFpbXBvcnRhbnQ7XG4gICAgZGlzcGxheTogYmxvY2s7XG59XG5cbmgxW2RhdGEtcGxhY2Vob2xkZXJdOmZvY3VzOmJlZm9yZSB7fVxuXG5cbipbY29udGVudGVkaXRhYmxlPVwidHJ1ZVwiXTpub3QoaDEpOmVtcHR5OmJlZm9yZSB7XG4gICAgY29udGVudDogYXR0cihkYXRhLXBsYWNlaG9sZGVyKTtcbiAgICBjb2xvcjogIzg0ODg4YWNkO1xuICAgIGRpc3BsYXk6IG5vbmU7XG59XG5cbipbY29udGVudGVkaXRhYmxlPVwidHJ1ZVwiXTpub3QoaDEpOmVtcHR5OmhvdmVyOmJlZm9yZSB7XG4gICAgZGlzcGxheTogYmxvY2s7XG59XG5cbmNpdGVbY29udGVudGVkaXRhYmxlPVwidHJ1ZVwiXTplbXB0eTpiZWZvcmUge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xufVxuXG4qW2NvbnRlbnRlZGl0YWJsZT1cInRydWVcIl06bm90KGgxKVtkYXRhLXBsYWNlaG9sZGVyXTplbXB0eTpmb2N1czpiZWZvcmUge1xuICAgIGNvbnRlbnQ6IGF0dHIoZGF0YS1wbGFjZWhvbGRlcik7XG4gICAgY29sb3I6ICM4NDg4OGFjZCAhaW1wb3J0YW50O1xuICAgIGRpc3BsYXk6IGJsb2NrO1xufVxuXG5cblxuaDEge1xuICAgIGZvbnQtc2l6ZTogMi41cmVtO1xuICAgIGZvbnQtd2VpZ2h0OiBib2xkZXIgIWltcG9ydGFudDtcbn1cblxuLmpvaGFubmVzLWVkaXRvciB7XG4gICAgd2lkdGg6IDEwMCU7XG5cbn1cblxuLmNvbnRlbnQge1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgLyogYmFja2dyb3VuZC1jb2xvcjogcmVkOyAqL1xufVxuXG4uY29udGVudCAuYmxvY2sgLnRhYmxlLXdyYXBwZXIge1xuICAgIG92ZXJmbG93LXg6IGF1dG87XG4gICAgb3ZlcmZsb3cteTogaGlkZGVuO1xufVxuXG5cbnByZSB7XG4gICAgd2lkdGg6IDEwMCU7XG59XG5cbltjb250ZW50ZWRpdGFibGVdIHtcbiAgICBvdXRsaW5lOiBub25lO1xufVxuXG5ib2R5IHtcbiAgICBoZWlnaHQ6IDIwMDBweDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjBmMGYxICFpbXBvcnRhbnQ7XG5cbiAgICBmb250LWZhbWlseTogc3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBcIlNlZ29lIFVJXCIsIFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBcIk5vdG8gU2Fuc1wiLCBcIkxpYmVyYXRpb24gU2Fuc1wiLCBBcmlhbCwgc2Fucy1zZXJpZiwgXCJBcHBsZSBDb2xvciBFbW9qaVwiLCBcIlNlZ29lIFVJIEVtb2ppXCIsIFwiU2Vnb2UgVUkgU3ltYm9sXCIsIFwiTm90byBDb2xvciBFbW9qaVwiO1xufVxuXG5cbi5lZGl0b3Ige1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgbWFyZ2luLXRvcDogODBweDtcbn1cblxucCB7XG4gICAgY29sb3I6ICMyNDI0MjQ7XG59XG5cblxuLmJsb2NrLFxuLmJsb2NrICoge1xuICAgIHVzZXItc2VsZWN0OiB0ZXh0O1xufVxuXG5cbi5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQge1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIHBhZGRpbmc6IDA7XG4gICAgbWFyZ2luOiAwO1xuICAgIC8qIGJhY2tncm91bmQtY29sb3I6IGdyZWVuOyAqL1xufVxuXG5cbiNqb2hhbm5lc0VkaXRvciB7XG4gICAgd2lkdGg6IDYwJTtcbiAgICBtYXJnaW4tbGVmdDogYXV0bztcbiAgICBtYXJnaW4tcmlnaHQ6IGF1dG87XG59XG5cbi5qb2hhbm5lcy1lZGl0b3IgaHIge1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGhlaWdodDogMnB4O1xuICAgIHZpc2liaWxpdHk6IHZpc2libGU7XG4gICAgYm9yZGVyOiBub25lO1xuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2JhKDU1LCA1MywgNDcsIDAuMTYpO1xufVxuXG5cblxuLmpvaGFubmVzLWVkaXRvciBibG9ja3F1b3RlIHtcbiAgICBtYXJnaW46IDAuNXJlbSAwO1xuICAgIHBhZGRpbmctbGVmdDogMjBweDtcbiAgICBib3JkZXItbGVmdDogNHB4IHNvbGlkIHJnYig1NSwgNTMsIDQ3KTtcbiAgICBmb250LXN0eWxlOiBpdGFsaWNcbn1cblxuLmpvaGFubmVzLWVkaXRvciBjaXRlIHtcbiAgICBwYWRkaW5nLXRvcDogMXJlbSAhaW1wb3J0YW50O1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbn1cblxuXG4uam9oYW5uZXMtZWRpdG9yIGNpdGU6OmJlZm9yZSB7XG4gICAgY29udGVudDogJ+KAlCAnO1xufVxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4jbGlua0JveCB7XG4gICAgYm9yZGVyLXJhZGl1czogMnB4O1xuICAgIHBhZGRpbmc6IDIwcHg7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2Y5ZjlmOTtcblxuXG4gICAgYm94LXNoYWRvdzpcbiAgICAgICAgMCA0cHggNnB4IHJnYmEoMCwgMCwgMCwgMC4xKSxcbiAgICAgICAgMCAtMnB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMDIpLFxuICAgICAgICAtMnB4IDAgNHB4IHJnYmEoMCwgMCwgMCwgMC4wMiksXG4gICAgICAgIDJweCAwIDRweCByZ2JhKDAsIDAsIDAsIDAuMDIpO1xuXG5cbiAgICBib3JkZXI6IDFweCBzb2xpZCAjZDBkMGQwO1xuICAgIHdpZHRoOiBmaXQtY29udGVudDtcbiAgICB6LWluZGV4OiA5OTk5OTk7XG4gICAgY29sb3I6IHJnYigxMjAsIDExOSwgMTE2KTtcbiAgICBib3JkZXItcmFkaXVzOiBub25lO1xufVxuXG5cbiNsaW5rQm94IGlucHV0IHtcbiAgICB3aWR0aDogMzE2cHg7XG4gICAgcGFkZGluZzogOHB4IDQwcHggOHB4IDE2cHg7XG4gICAgLyogYm9yZGVyLWNvbG9yOiAjZDBkMGQwOyAqL1xuXG4gICAgYm9yZGVyOiAxcHggc29saWQgIzk0OTQ5NDtcbiAgICAvKiBib3JkZXItcmFkaXVzOiA0cHg7ICovXG4gICAgaGVpZ2h0OiAyNHB4O1xuXG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG59XG5cblxuI2xpbmtCb3ggaW5wdXQ6OnNlbGVjdGlvbixcbiNsaW5rQm94IGlucHV0OmZvY3VzIHtcbiAgICBib3JkZXItcmFkaXVzOiBub25lO1xufVxuXG4vKiogc29mdC1ib3gtc2hhZG93IGNsYXNzICovXG4uc29mdC1ib3gtc2hhZG93IHtcbiAgICBtYXJnaW46IDA7XG4gICAgcGFkZGluZzogMDtcbiAgICBib3JkZXItcmFkaXVzOiAycHg7XG4gICAgYm94LXNoYWRvdzpcbiAgICAgICAgMCA0cHggNnB4IHJnYmEoMCwgMCwgMCwgMC4xKSxcbiAgICAgICAgMCAtMnB4IDRweCByZ2JhKDIxNiwgMTk2LCAxOTYsIDAuMDIpLFxuICAgICAgICAtMnB4IDAgNHB4IHJnYmEoMCwgMCwgMCwgMC4wMiksXG4gICAgICAgIDJweCAwIDRweCByZ2JhKDAsIDAsIDAsIDAuMDIpO1xuXG4gICAgYm9yZGVyOiAxcHggc29saWQgI2QwZDBkMDtcbn1cblxuLyoqIGFuZCBzb2Z0LWJveC1zaGFkb3cgKi9cblxuXG4vKiogc2VsZWN0aW9uLXdyYXBwZXIgY2xhc3MgKi9cbi5zZWxlY3Qtd3JhcHBlciB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG59XG5cbi5zZWxlY3Qtd3JhcHBlciB1bCB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIGJhY2tncm91bmQ6ICNmOWY5Zjk7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICB3aWR0aDogZml0LWNvbnRlbnQ7XG4gICAgcGFkZGluZy1ib3R0b206IDAuNXJlbTtcbiAgICBwYWRkaW5nLWxlZnQ6IDVweDtcbiAgICBwYWRkaW5nLXJpZ2h0OiA1cHg7XG4gICAgdG9wOiAyLjJyZW07XG4gICAgY29sb3I6IHJnYig1NSwgNTMsIDQ3KTtcbiAgICBwYWRkaW5nLXJpZ2h0OiAwLjMxMjVyZW07XG59XG5cbi5zZWxlY3Qtd3JhcHBlciB1bCBsaSB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgZ2FwOiAwLjYyNXJlbTtcbiAgICBwYWRkaW5nOiAwLjE4NzVyZW0gMC4zMTI1cmVtO1xuICAgIGJvcmRlci1yYWRpdXM6IDAuMTg3NXJlbTtcbiAgICB1c2VyLXNlbGVjdDogbm9uZSAhaW1wb3J0YW50O1xuICAgIGZvbnQtc2l6ZTogc21hbGwgIWltcG9ydGFudDtcbiAgICBmb250LXdlaWdodDogNTAwO1xufVxuXG4uc2VsZWN0LXdyYXBwZXIgdWwgbGkgc3BhbiB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIHdpZHRoOiBtYXgtY29udGVudDtcbn1cblxuLnNlbGVjdC13cmFwcGVyIHVsIGxpIC5vcHRpb24taW1hZ2Uge1xuICAgIHdpZHRoOiAxLjM3NXJlbTtcbiAgICBoZWlnaHQ6IDEuMzc1cmVtO1xuICAgIGNvbG9yOiAjMjQyNDI0O1xuICAgIHBhZGRpbmc6IDAgIWltcG9ydGFudDtcbiAgICBtYXJnaW46IDAgIWltcG9ydGFudDtcbn1cblxuLnNlbGVjdC13cmFwcGVyIHVsIGxpIC5vcHRpb24taW1hZ2Ugc3ZnIHtcbiAgICBjb2xvcjogIzRmNGY0ZjtcbiAgICBwYWRkaW5nOiAwICFpbXBvcnRhbnQ7XG4gICAgbWFyZ2luOiAwICFpbXBvcnRhbnQ7XG59XG5cbi5zZWxlY3Qtd3JhcHBlciB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIGNvbG9yOiByZ2IoMTIwLCAxMTksIDExNik7XG59XG5cbi5zZWxlY3Qtd3JhcHBlcj5idXR0b24ge1xuICAgIGNvbG9yOiByZ2JhKDU1LCA1MywgNDcsIDAuODUpO1xufVxuXG4uc2VsZWN0LXdyYXBwZXIgdWwgbGk+aDMge1xuICAgIG1hcmdpbjogMDtcbiAgICBmb250LXNpemU6IHNtYWxsICFpbXBvcnRhbnQ7XG4gICAgY29sb3I6ICMzNzM1MmZhNjtcbiAgICBtYXJnaW46IDA7XG4gICAgcGFkZGluZzogMDtcbiAgICBmb250LXdlaWdodDogNjAwICFpbXBvcnRhbnQ7XG4gICAgbWFyZ2luLXRvcDogMC4zMTI1cmVtO1xuICAgIG1hcmdpbi1ib3R0b206IDAuMzEyNXJlbTtcbn1cblxuLyoqIGVuZCBzZWxlY3Rpb24gd3JhcHBlciAqKi9cblxuXG5cbi8qKiBUZXh0IGZvcm1hdHRpbmcgQmFyICoqL1xuXG5cblxuLmZsb2F0aW5nLXRvb2xiYXIge1xuICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgICBwYWRkaW5nOiA4cHggMTZweDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjlmOWY5O1xuICAgIHdpZHRoOiBmaXQtY29udGVudDtcbiAgICB6LWluZGV4OiA5OTk5OTk7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHVzZXItc2VsZWN0OiBub25lO1xufVxuXG4vKiBUT0RPOiByZW1vdmUgdGhpcyovXG5zcGFuIHtcbiAgICBmb250LWZhbWlseTogQXJpYWwsIHNhbnMtc2VyaWY7XG59XG5cblxuLmZsb2F0aW5nLXRvb2xiYXIgLml0ZW0ge1xuICAgIGNvbG9yOiByZ2IoMTIwLCAxMTksIDExNik7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGdhcDogMTBweDtcbn1cblxuLmZsb2F0aW5nLXRvb2xiYXIgLml0ZW0+YnV0dG9uIHtcblxuICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG59XG5cblxuLmZsb2F0aW5nLXRvb2xiYXIgc2VsZWN0IHtcbiAgICBjb2xvcjogcmdiKDEyMCwgMTE5LCAxMTYpO1xuICAgIGJvcmRlcjogbm9uZTtcbiAgICBmb250LXNpemU6IDAuODVyZW07XG4gICAgYmFja2dyb3VuZC1jb2xvcjogaW5oZXJpdDtcbn1cblxuLnRleHQtZm9ybWF0dGluZy1zZWxlY3QtYnV0dG9uIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbn1cblxuI3R1cm5JbnRvQnV0dG9uIHNwYW4ge1xuICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBmb250LXNpemU6IDAuOXJlbTtcblxufVxuXG4jdHVybkludG9CdXR0b24gc3ZnIHVzZSB7XG4gICAgbWFyZ2luOiBhdXRvO1xufVxuXG5jb2RlOm5vdChwcmUgY29kZSkge1xuICAgIG1hcmdpbjogMDtcbiAgICBwYWRkaW5nOiAwO1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNkMGQwZDA7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2Y2ZjVmNDtcbiAgICBmb250LXNpemU6IGluaGVyaXQ7XG4gICAgZm9udC1zaXplOiAxcmVtICFpbXBvcnRhbnQ7XG4gICAgYm9yZGVyOiAxcHggc29saWQgIzAwMDAwMDFhO1xuICAgIHBhZGRpbmc6IDAgM3B4O1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbn1cblxuXG5cblxuLyogYTpub3QoW2hyZWZdKSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2QzZTNmZDtcbn0gKi9cblxuLnRleHQtZm9ybWF0dGluZy1idXR0b24tYWN0aXZlIHtcbiAgICBjb2xvcjogIzIzODJlMjtcbn1cblxuLnRleHQtZm9ybWF0dGluZy1jaXJjbGUtYWN0aXZlIHtcbiAgICBib3JkZXItY29sb3I6ICMyMzgyZTIgIWltcG9ydGFudDtcbn1cblxuXG5cbiNtb3JlVGV4dE9wdGlvblNlbGVjdCB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xufVxuXG4ubW9yZVRleHRPcHRpb25XcmFwcGVyIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG5cblxuLmJnYy1yZWQge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNGRERFREU7XG59XG5cbi5iZ2MtZ3JlZW4ge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNEN0Y3REM7XG59XG5cbi5iZ2MtYmx1ZSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI0Q5RURGNjtcbn1cblxuLmJnYy15ZWxsb3cge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNGQUY0RDE7XG59XG5cbi5iZ2MtZ3JleSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI0UxRTBFMDtcbn1cblxucCxcbm1hcmsge1xuICAgIGxpbmUtaGVpZ2h0OiAxO1xufVxuXG4jdHVybkludG9TZWxlY3QgLm9wdGlvbi1pbWFnZSB7XG4gICAgLyogZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OyAqL1xufVxuXG4uYm9yZGVyLWxlc3MtaW1hZ2Uge1xuICAgIHdpZHRoOiAyNHB4O1xuICAgIGhlaWdodDogMjRweDtcbn1cblxuXG5cblxuLyoqIEJsb2NrIE9wdGlvbnMgKiovXG5cbi5ibG9jay1vcHRpb25zLXdyYXBwZXIge1xuICAgIHotaW5kZXg6IDk5OTk5OTtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgZGlzcGxheTogbm9uZTtcbn1cblxuLmJsb2NrLW9wdGlvbnMge1xuICAgIHdpZHRoOiBmaXQtY29udGVudDtcbiAgICBtYXgtaGVpZ2h0OiAxOXJlbTtcbiAgICBvdmVyZmxvdy15OiBhdXRvO1xufVxuXG4uYmxvY2stb3B0aW9ucyB7XG4gICAgcGFkZGluZzogMCAwLjYyNXJlbTtcbiAgICBiYWNrZ3JvdW5kOiAjZjlmOWY5O1xufVxuXG4uYmxvY2stb3B0aW9ucyBzZWN0aW9uIGgyIHtcbiAgICBmb250LXNpemU6IHNtYWxsICFpbXBvcnRhbnQ7XG4gICAgY29sb3I6ICMzNzM1MmZhNjtcbiAgICBtYXJnaW46IDA7XG4gICAgcGFkZGluZzogMDtcbiAgICBmb250LXdlaWdodDogNjAwICFpbXBvcnRhbnQ7XG4gICAgbWFyZ2luLXRvcDogMC4zMTI1cmVtO1xuICAgIG1hcmdpbi1ib3R0b206IDAuMzEyNXJlbTtcbiAgICBwYWRkaW5nLWxlZnQ6IDAuMzEyNXJlbTtcbn1cblxuLmJsb2NrLW9wdGlvbnMgLm9wdGlvbiB7XG4gICAgcGFkZGluZzogMC4zMTI1cmVtIDAuNjI1cmVtO1xuICAgIG1hcmdpbjogMC4zMTI1cmVtIDA7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGp1c3RpZnktY29udGVudDogbGVmdDtcbiAgICBnYXA6IDAuNnJlbTtcbiAgICBib3JkZXItcmFkaXVzOiAzcHg7XG59XG5cbi5ibG9jay1vcHRpb25zIC5vcHRpb246Zm9jdXMge1xuICAgIG91dGxpbmU6IG5vbmU7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2U5ZTllOTtcbiAgICBib3JkZXI6IGluaGVyaXQ7XG59XG5cbi5vcHRpb24tZm9jdXNlZCB7XG4gICAgb3V0bGluZTogbm9uZTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTllOWU5O1xuICAgIGJvcmRlcjogbm9uZTtcbn1cblxuLmRhbmdlci1vcHRpb24ub3B0aW9uLWZvY3VzZWQsXG4uZGFuZ2VyLW9wdGlvbi5vcHRpb24tZm9jdXNlZCBzdmcge1xuICAgIGNvbG9yOiAjRUI1NzU3ICFpbXBvcnRhbnQ7XG59XG5cblxuXG4uYmxvY2stb3B0aW9ucyAub3B0aW9uOmZvY3VzLXZpc2libGUge1xuICAgIG91dGxpbmU6IG5vbmU7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2U5ZTllOTtcbiAgICBib3JkZXI6IGluaGVyaXQ7XG59XG5cbi8qIC5vcHRpb24taG92ZXI6aG92ZXIge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNlOWU5ZTk7XG4gICAgYm94LXNoYWRvdzogMHB4IDBweCAwcHggMnB4ICNlOWU5ZTk7XG4gICAgYm9yZGVyLXJhZGl1czogMXB4O1xuICAgIHRyYW5zaXRpb246IDAuMXMgZWFzZTtcbn0gKi9cblxuLyogLnNlbGVjdC13cmFwcGVyPmJ1dHRvbiwgKi9cblxuLyogI3R1cm5JbnRvQnV0dG9uLFxuI2NvbG9yVGV4dEJ1dHRvbiB7XG4gICAgcGFkZGluZy1sZWZ0OiA0cHg7XG59ICovXG5cbiNjb2xvclRleHRCdXR0b24ge1xuICAgIG1hcmdpbi1sZWZ0OiAwLjYyNXJlbTtcbn1cblxuI3R1cm5JbnRvQnV0dG9uOm5vdChbZGlzYWJsZWRdKTpob3ZlcixcbiNjb2xvclRleHRCdXR0b246bm90KFtkaXNhYmxlZF0pOmhvdmVyLFxuI21vcmVUZXh0T3B0aW9uQnV0dG9uOm5vdChbZGlzYWJsZWRdKTpob3Zlcixcbi5mbG9hdGluZy10b29sYmFyIC5pdGVtPmJ1dHRvbjpub3QoW2Rpc2FibGVkXSk6aG92ZXIge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNlOWU5ZTk7XG4gICAgYm94LXNoYWRvdzogMHB4IDBweCAwcHggMnB4ICNlOWU5ZTk7XG4gICAgYm9yZGVyLXJhZGl1czogMXB4O1xuICAgIHRyYW5zaXRpb246IDAuMXMgZWFzZTtcbn1cblxuXG5cbi5vcHRpb25bZm9jdXNlZD1cInRydWVcIl0ge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNiZGU0ZmY7XG59XG5cblxuXG5cblxuLm9wdGlvbi1pbWFnZSB7XG4gICAgd2lkdGg6IDIuODc1cmVtO1xuICAgIGhlaWdodDogMi44NzVyZW07XG4gICAgYm9yZGVyLXJhZGl1czogMC4xODc1cmVtO1xuICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7XG4gICAgY29sb3I6ICM0ZjRmNGY7XG5cbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmO1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG59XG5cbi5vcHRpb24taW1hZ2UgaW1nIHtcbiAgICBtYXgtd2lkdGg6IDIuODc1cmVtO1xuICAgIG1heC1oZWlnaHQ6IDIuODc1cmVtO1xufVxuXG4ub3B0aW9uLWltYWdlIHN2ZyB7XG4gICAgbWFyZ2luOiAwO1xuICAgIHBhZGRpbmc6IDA7XG4gICAgcGFkZGluZzogMC42MjVyZW07XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcblxufVxuXG4ub3B0aW9uLXRleHQgKiB7XG4gICAgbWFyZ2luOiAwO1xuICAgIHBhZGRpbmc6IDA7XG5cbn1cblxuLm9wdGlvbi10ZXh0IC5ibG9jay10aXRsZSB7XG4gICAgZm9udC1zaXplOiBzbWFsbCAhaW1wb3J0YW50O1xuICAgIGZvbnQtd2VpZ2h0OiA1MDA7XG59XG5cbi5vcHRpb24tdGV4dCAuYmxvY2stZGVzY3JpcHRpb24ge1xuICAgIGZvbnQtc2l6ZTogc21hbGwgIWltcG9ydGFudDtcbiAgICBjb2xvcjogcmdiYSg1NSwgNTMsIDQ3LCAwLjUpO1xufVxuXG4vKiogRW5kIEJsb2NrIE9wdGlvbnMgKiovXG5cblxuXG4jZGVsZXRlQmxvY2tCdXR0b246aG92ZXIgc3ZnLFxuI2RlbGV0ZUJsb2NrQnV0dG9uOmhvdmVyIHtcbiAgICBjb2xvcjogcmdiKDIzNSwgODcsIDg3KSAhaW1wb3J0YW50O1xufVxuXG5cblxuLmpvaGFubmVzLWVkaXRvciAqOjpzZWxlY3Rpb24ge1xuICAgIC8qIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMjExLCAyMjcsIDI1MywgMC41KSAhaW1wb3J0YW50OyAqL1xuXG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmVkO1xuXG4gICAgYmFja2dyb3VuZC1jb2xvcjogaHNsKDIxMCA3NSUgNTAlIC8gMSk7XG4gICAgY29sb3I6IHdoaXRlO1xufVxuXG4uam9oYW5uZXMtZWRpdG9yIG1hcmssXG4uam9oYW5uZXMtZWRpdG9yICoge1xuICAgIGxpbmUtaGVpZ2h0OiAxLjUgIWltcG9ydGFudDtcbn1cblxuLm9wdGlvbiB7XG4gICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xufVxuXG4udGV4dC1vcHRpb24ge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHN0YXJ0O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgZ2FwOiAwLjYyNXJlbTtcbn1cblxuXG5cblxuOnJvb3Qge1xuICAgIC8qIGZvbnQtc2l6ZTogMTZweDsgKi9cbiAgICAvKiBUYW1hbmhvIHBhZHLDo28gKi9cbn1cblxuLyogUGFyYSB0ZWxhcyBjb20gZGVuc2lkYWRlIG3DqWRpYSAqL1xuQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAoLXdlYmtpdC1taW4tZGV2aWNlLXBpeGVsLXJhdGlvOiAyKSxcbm9ubHkgc2NyZWVuIGFuZCAobWluLS1tb3otZGV2aWNlLXBpeGVsLXJhdGlvOiAyKSxcbm9ubHkgc2NyZWVuIGFuZCAobWluLXJlc29sdXRpb246IDE5MmRwaSksXG5vbmx5IHNjcmVlbiBhbmQgKG1pbi1yZXNvbHV0aW9uOiAyZHBweCkge1xuICAgIDpyb290IHtcbiAgICAgICAgZm9udC1zaXplOiAxOHB4O1xuICAgICAgICAvKiBBdW1lbnRhIG8gdGFtYW5obyBkYSBmb250ZSBwYXJhIHRlbGFzIGRlIGFsdGEgZGVuc2lkYWRlICovXG4gICAgfVxufVxuXG4vKiBQYXJhIHRlbGFzIGNvbSBhbHTDrXNzaW1hIGRlbnNpZGFkZSAqL1xuQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAoLXdlYmtpdC1taW4tZGV2aWNlLXBpeGVsLXJhdGlvOiAzKSxcbm9ubHkgc2NyZWVuIGFuZCAobWluLS1tb3otZGV2aWNlLXBpeGVsLXJhdGlvOiAzKSxcbm9ubHkgc2NyZWVuIGFuZCAobWluLXJlc29sdXRpb246IDI4OGRwaSksXG5vbmx5IHNjcmVlbiBhbmQgKG1pbi1yZXNvbHV0aW9uOiAzZHBweCkge1xuICAgIDpyb290IHtcbiAgICAgICAgZm9udC1zaXplOiAyMHB4O1xuICAgICAgICAvKiBBaW5kYSBtYWlvciBwYXJhIHRlbGFzIGRlIGRlbnNpZGFkZSBtdWl0byBhbHRhICovXG4gICAgfVxufVxuXG5cblxuXG5cblxuXG5cblxuXG5cbnRhYmxlLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCB7XG4gICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTtcbiAgICBtYXgtd2lkdGg6IGluaGVyaXQ7XG4gICAgd2lkdGg6IGF1dG87XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94ICFpbXBvcnRhbnQ7XG59XG5cbnRhYmxlLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCB0aCxcbnRhYmxlLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCB0ZCB7XG4gICAgbWluLWhlaWdodDogMjBweDtcbn1cblxudGFibGUuam9oYW5uZXMtY29udGVudC1lbGVtZW50IHRoLFxudGFibGUuam9oYW5uZXMtY29udGVudC1lbGVtZW50IHRkIHtcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjODQ4ODhkO1xuICAgIHBhZGRpbmc6IDhweDtcbiAgICB0ZXh0LWFsaWduOiBsZWZ0O1xuICAgIGFsaWduLWl0ZW1zOiBzdGFydDtcbiAgICBvdmVyZmxvdy13cmFwOiBicmVhay13b3JkO1xuICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDtcbiAgICB3aGl0ZS1zcGFjZTogbm9ybWFsO1xuICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7XG4gICAgbWluLXdpZHRoOiAxMDBweDtcbiAgICBtYXgtd2lkdGg6IDIwMHB4O1xuICAgIC8qIGJveC1zaXppbmc6IGJvcmRlci1ib3ggIWltcG9ydGFudDsgKi9cblxuICAgIHRyYW5zaXRpb246IGJvcmRlciAxMDBtcyBlYXNlLW91dCwgYm94LXNoYWRvdyAxMDBtcyBlYXNlLW91dDtcblxufVxuXG50YWJsZS5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQgdGQuc2VsZWN0ZWQsXG50YWJsZS5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQgdGQ6Zm9jdXMge1xuICAgIG91dGxpbmU6IG5vbmU7XG4gICAgYm94LXNoYWRvdzogMCAwIDAgMXB4ICM3NGI2ZGIgaW5zZXQ7XG4gICAgYm9yZGVyOiAxcHggZG91YmxlICM3NGI2ZGI7XG5cbn1cblxudGQge1xuICAgIG1pbi1oZWlnaHQ6IDFyZW0gIWltcG9ydGFudDtcbiAgICBsaW5lLWhlaWdodDogMXJlbTtcbn1cblxudGQ6OnBsYWNlaG9sZGVyIHtcbiAgICBkaXNwbGF5OiBibG9jaztcbn1cblxudGQ6ZW1wdHk6YmVmb3JlIHtcbiAgICBjb250ZW50OiBhdHRyKGRhdGEtcGxhY2Vob2xkZXIpO1xuICAgIGNvbG9yOiAjODQ4ODhhY2Q7XG4gICAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDtcbiAgICBvcGFjaXR5OiAwO1xufVxuXG4udGFibGUtd3JhcHBlciB7XG4gICAgd2lkdGg6IDEwMCU7XG59XG5cbi50YWJsZS1jb250cm9sbGVyIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgbWF4LXdpZHRoOiAxMDAlO1xufVxuXG4uYWRkLXRhYmxlLXJvdyB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSg1NSwgNTMsIDQ3LCAwLjA2KTtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBwYWRkaW5nOiAwO1xuICAgIG1hcmdpbjogMDtcbiAgICBtYXJnaW4tdG9wOiAwLjM3NXJlbTtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgIGhlaWdodDogMXJlbTtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgb3BhY2l0eTogMDtcbiAgICB1c2VyLXNlbGVjdDogbm9uZTtcbn1cblxuLmFkZC10YWJsZS1jb2x1bW4ge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICByaWdodDogLTEuMzEyNXJlbTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDU1LCA1MywgNDcsIDAuMDYpO1xuICAgIHdpZHRoOiAxcmVtO1xuICAgIHBhZGRpbmc6IDA7XG4gICAgbWFyZ2luOiAwO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgaGVpZ2h0OiAxMDAlO1xuICAgIHRvcDogMDtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgaGVpZ2h0OiBjYWxjKDEwMCUgLSAxcmVtIC0gNXB4KTtcbiAgICBvcGFjaXR5OiAwO1xuICAgIHVzZXItc2VsZWN0OiBub25lO1xufVxuXG4uYWRkLXRhYmxlLWNvbHVtbjpob3ZlciB7XG4gICAgb3BhY2l0eTogMTtcbn1cblxuLmFkZC10YWJsZS1yb3c6aG92ZXIge1xuICAgIG9wYWNpdHk6IDE7XG59XG5cbi50YWJsZS1zaGVsbCB7XG4gICAgbWF4LXdpZHRoOiAxMDAlO1xufVxuXG5cblxuLnRhYmxlLW9wdGlvbiB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XG4gICAgd2lkdGg6IGZpdC1jb250ZW50O1xuICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgICBwYWRkaW5nOiA4cHggMTZweDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjlmOWY5O1xuICAgIHdpZHRoOiBmaXQtY29udGVudDtcbiAgICB6LWluZGV4OiA5OTk5OTk7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgIHBhZGRpbmc6IDhweCAxNnB4O1xuICAgIGRpc3BsYXk6IG5vbmU7XG59XG5cblxuXG5cbi8qKiBDYWxsb3V0ICoqL1xuLmNhbGxvdXQ6aG92ZXIgLm9wdGlvbnMtYnV0dG9uIHtcbiAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50O1xufVxuXG5cbi5uby1zZWxlY3Rpb24ge1xuICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgLW1vei11c2VyLXNlbGVjdDogbm9uZTtcbiAgICB1c2VyLXNlbGVjdDogbm9uZTtcbn1cblxuXG4vKiogdXBsb2FkL2VtYmVkICoqL1xuXG4udGFiLWNvbnRhaW5lciB7XG4gICAgZm9udC1zaXplOiAwLjg2cmVtO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICB0cmFuc2l0aW9uOiAwLjFzIGVhc2U7XG5cbiAgICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lO1xuICAgIC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgdXNlci1zZWxlY3Q6IG5vbmU7XG5cbiAgICB0cmFuc2l0aW9uOiB2aXNpYmlsaXR5IDAuMnMgZWFzZTtcblxufVxuXG4ubmF2LXVuZGVybGluZSB7XG4gICAgbWFyZ2luOiAwO1xuICAgIHBhZGRpbmc6IDA7XG4gICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHJnYmEoNTUsIDUzLCA0NywgMC4xNik7XG4gICAgcGFkZGluZzogMTBweCAyMHB4O1xufVxuXG4ubmF2LXVuZGVybGluZSAubmF2LWl0ZW0ge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgbWFyZ2luLXJpZ2h0OiAxNXB4O1xufVxuXG4ubmF2LXVuZGVybGluZSAubmF2LWxpbmsge1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gICAgY29sb3I6IHJnYig1NSwgNTMsIDQ3KTtcbiAgICBjb2xvcjogcmdiYSg1NSwgNTMsIDQ3LCAwLjUpO1xuICAgIHRyYW5zaXRpb246IDAuMXMgZWFzZTtcbn1cblxuXG4ubmF2LWl0ZW0uYWN0aXZlIC5uYXYtbGluayB7XG4gICAgY29sb3I6ICMwMDA7XG59XG5cbi50YWItY29udGVudCAuY29udGVudC1kYXRhIHtcbiAgICBkaXNwbGF5OiBub25lO1xuICAgIHBhZGRpbmc6IDIwcHg7XG4gICAgYm9yZGVyLXRvcDogbm9uZTtcbiAgICB0cmFuc2l0aW9uOiAwLjFzIGVhc2U7XG59XG5cbi50YWItY29udGVudCAuY29udGVudC1kYXRhLmFjdGl2ZSB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICBnYXA6IDFyZW07XG59XG5cbi50YWItY29udGVudCAudGV4dC1pbmZvIHtcbiAgICBmb250LXNpemU6IDAuNzVyZW07XG4gICAgY29sb3I6IHJnYmEoNTUsIDUzLCA0NywgMC42KTtcbn1cblxuLm5hdi11bmRlcmxpbmUgLm5hdi1pdGVtIHtcbiAgICBkaXNwbGF5OiBpbmxpbmU7XG59XG5cblxuLnRhYi1jb250YWluZXIge1xuICAgIHdpZHRoOiBmaXQtY29udGVudDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjQ5LCAyNDksIDI0OSk7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuXG59XG5cbi5lbWJlZC1jb250ZW50IGlucHV0IHtcbiAgICB3aWR0aDogMjByZW07XG4gICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSg1NSwgNTMsIDQ3LCAwLjE2KTtcbiAgICBoZWlnaHQ6IDEuNXJlbTtcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgcGFkZGluZy1sZWZ0OiAxMHB4O1xufVxuXG5cbi51cGxvYWQtY29udGVudCBsYWJlbCB7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSg1NSwgNTMsIDQ3LCAwLjE2KTtcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgd2lkdGg6IDIwcmVtO1xuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICBwYWRkaW5nOiA0cHg7XG4gICAgY29sb3I6IHJnYig1NSwgNTMsIDQ3KTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICAgIC8qIHRyYW5zaXRpb246IDAuMXMgZWFzZTsgKi9cbn1cblxuLnVwbG9hZC1jb250ZW50IGxhYmVsOmhvdmVyIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWVlZWVlO1xufVxuXG5cblxuXG5cblxuXG5cblxuXG4vKiBFc3RpbG8gcGFyYSBhcyBhbMOnYXMgZGUgcmVkaW1lbnNpb25hbWVudG8gKi9cbi5yZXNpemUtaGFuZGxlIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgd2lkdGg6IDEwcHg7XG4gICAgaGVpZ2h0OiAxMHB4O1xuICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC41KTtcbiAgICBjdXJzb3I6IG53c2UtcmVzaXplO1xuICAgIC8qIEN1cnNvciBkZSByZWRpbWVuc2lvbmFtZW50byBkaWFnb25hbCAqL1xufVxuXG4ucmVzaXplLWhhbmRsZS5zZSB7XG4gICAgYm90dG9tOiAwO1xuICAgIHJpZ2h0OiAwO1xufVxuXG5cblxuXG4uZW1iZWQtY29udGFpbmVyIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgcGFkZGluZy1ib3R0b206IDU2LjI1JTtcbiAgICAvKiBQcm9wb3LDp8OjbyAxNjo5ICovXG4gICAgaGVpZ2h0OiAwO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG59XG5cbi5lbWJlZC1jb250YWluZXIgaWZyYW1lIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdG9wOiAwO1xuICAgIGxlZnQ6IDA7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiAxMDAlO1xufVxuXG5cblxuLnZpZGVvLWNvbnRhaW5lciB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIHBhZGRpbmctYm90dG9tOiA1Ni4yNSU7XG4gICAgLyogUHJvcG9yw6fDo28gMTY6OSAqL1xuICAgIGhlaWdodDogMDtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xufVxuXG4udmlkZW8tY29udGFpbmVyIGlmcmFtZSB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHRvcDogMDtcbiAgICBsZWZ0OiAwO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGhlaWdodDogMTAwJTtcbn1cblxuXG5cblxuXG5cblxuLnJlc2l6YWJsZSB7XG4gICAgcmVzaXplOiBob3Jpem9udGFsO1xuICAgIG92ZXJmbG93OiBhdXRvO1xuICAgIGN1cnNvcjogbmVzdy1yZXNpemU7XG59XG5cbi5iYWNrZ3JvdW5kIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTdlNmUzO1xufWAsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vc3JjL2Fzc2V0cy9jc3MvbWFpbi5jc3NcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIkFBQUEsa0JBQWtCO0FBQ2xCO0lBQ0ksdUJBQXVCO0FBQzNCOzs7O0FBSUEsZUFBZTs7QUFFZjtJQUNJLFlBQVk7SUFDWixTQUFTO0lBQ1QsVUFBVTtJQUNWLFdBQVc7SUFDWCxpQkFBaUI7SUFDakIsdUJBQXVCO0lBQ3ZCLGNBQWM7SUFDZCxhQUFhO0lBQ2IsbUJBQW1CO0lBQ25CLCtCQUErQjtJQUMv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QWU7QUFDbkI7OztBQUdBO0lBQ0ksa0JBQWtCO0lBQ2xCLG9DQUFvQztJQUNwQyxrQkFBa0I7O0FBRXRCOztBQUVBO0lBQ0ksWUFBWTtJQUNaLHdDQUF3QztJQUN4QyxjQUFjO0lBQ2Qsa0JBQWtCO0lBQ2xCLGtCQUFrQjtBQUN0Qjs7O0FBR0E7SUFDSSxjQUFjO0lBQ2Qsd0NBQXdDO0lBQ3hDLGtCQUFrQjtJQUNsQixZQUFZO0lBQ1osa0JBQWtCO0lBQ2xCLFlBQVk7SUFDWixzQkFBc0I7SUFDdEIsc0JBQXNCO0lBQ3RCLDJCQUEyQjtBQUMvQjs7QUFFQTtJQUNJLHlCQUF5QjtBQUM3Qjs7Ozs7Ozs7Ozs7QUFXQSw4Q0FBOEM7QUFDOUM7SUFDSSxrQkFBa0I7SUFDbEIsV0FBVztJQUNYLFlBQVk7SUFDWiw4QkFBOEI7SUFDOUIsbUJBQW1CO0lBQ25CLHlDQUF5QztBQUM3Qzs7QUFFQTtJQUNJLFNBQVM7SUFDVCxRQUFRO0FBQ1o7Ozs7O0FBS0E7SUFDSSxrQkFBa0I7SUFDbEIsV0FBVztJQUNYLHNCQUFzQjtJQUN0QixtQkFBbUI7SUFDbkIsU0FBUztJQUNULGdCQUFnQjtBQUNwQjs7QUFFQTtJQUNJLGtCQUFrQjtJQUNsQixNQUFNO0lBQ04sT0FBTztJQUNQLFdBQVc7SUFDWCxZQUFZO0FBQ2hCOzs7O0FBSUE7SUFDSSxrQkFBa0I7SUFDbEIsV0FBVztJQUNYLHNCQUFzQjtJQUN0QixtQkFBbUI7SUFDbkIsU0FBUztJQUNULGdCQUFnQjtBQUNwQjs7QUFFQTtJQUNJLGtCQUFrQjtJQUNsQixNQUFNO0lBQ04sT0FBTztJQUNQLFdBQVc7SUFDWCxZQUFZO0FBQ2hCOzs7Ozs7OztBQVFBO0lBQ0ksa0JBQWtCO0lBQ2xCLGNBQWM7SUFDZCxtQkFBbUI7QUFDdkI7O0FBRUE7SUFDSSx5QkFBeUI7QUFDN0JcIixcInNvdXJjZXNDb250ZW50XCI6W1wiLyoqIGN1cnNvciBzdHlsZSAqL1xcbltjb250ZW50ZWRpdGFibGU9XFxcInRydWVcXFwiXSB7XFxuICAgIGN1cnNvcjogdGV4dCAhaW1wb3J0YW50O1xcbn1cXG5cXG5cXG5cXG4vKiogQ1NTIHJlc2V0ICovXFxuXFxuLmJ1dHRvbi1yZXNldCB7XFxuICAgIGJvcmRlcjogbm9uZTtcXG4gICAgbWFyZ2luOiAwO1xcbiAgICBwYWRkaW5nOiAwO1xcbiAgICB3aWR0aDogYXV0bztcXG4gICAgb3ZlcmZsb3c6IHZpc2libGU7XFxuICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xcbiAgICBjb2xvcjogaW5oZXJpdDtcXG4gICAgZm9udDogaW5oZXJpdDtcXG4gICAgbGluZS1oZWlnaHQ6IG5vcm1hbDtcXG4gICAgLXdlYmtpdC1mb250LXNtb290aGluZzogaW5oZXJpdDtcXG4gICAgLW1vei1vc3gtZm9udC1zbW9vdGhpbmc6IGluaGVyaXQ7XFxuICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTtcXG59XFxuXFxuXFxuXFxuLyoqIGFkZCBibG9jayAqL1xcbi5hZGQtYmxvY2sge1xcbiAgICBtYXJnaW46IDA7XFxuICAgIHBhZGRpbmc6IDA7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjMDAwO1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcXG4gICAgdHJhbnNpdGlvbjogYWxsIDAuM3MgZWFzZTtcXG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXG4gICAgbWFyZ2luLWxlZnQ6IDEuM3JlbTtcXG59XFxuXFxuLmFkZC1ibG9jay13cmFwcGVyIHtcXG4gICAgd2lkdGg6IDEwMCU7XFxuICAgIGhlaWdodDogMy4xMjVyZW07XFxufVxcblxcbi5hZGQtYmxvY2std3JhcHBlcjpob3ZlciAuYWRkLWJsb2NrIHtcXG4gICAgZGlzcGxheTogZmxleDtcXG59XFxuXFxuLyoqIGFuZCBhZGQgYmxvY2sgKi9cXG5cXG5cXG5cXG4vKiogTGlzdCAgKiovXFxub2wuam9oYW5uZXMtY29udGVudC1lbGVtZW50LFxcbnVsLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCB7XFxuICAgIHBhZGRpbmctbGVmdDogMXJlbSAhaW1wb3J0YW50O1xcbn1cXG5cXG5cXG5cXG4uam9oYW5uZXMtY29udGVudC1lbGVtZW50IGxpPmJ1dHRvbiB7XFxuICAgIC8qIGRpc3BsYXk6IG5vbmU7ICovXFxuICAgIGRpc3BsYXk6IG5vbmU7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgbWFyZ2luLWxlZnQ6IDEwcHg7XFxuICAgIHRvcDogMDtcXG5cXG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcXG4gICAgYWxpZ24taXRlbXM6IHN0YXJ0O1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHN0YXJ0O1xcblxcbn1cXG5cXG4uam9oYW5uZXMtY29udGVudC1lbGVtZW50IGxpIHtcXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xcbn1cXG5cXG4uam9oYW5uZXMtY29udGVudC1lbGVtZW50IGxpOjpiZWZvcmUge1xcbiAgICBtYXJnaW4tbGVmdDogMC4zMTI1cmVtO1xcbn1cXG5cXG4uam9oYW5uZXMtY29udGVudC1lbGVtZW50IGxpOmhvdmVyPmJ1dHRvbiB7XFxuICAgIC8qIGRpc3BsYXk6IGlubGluZS1ibG9jazsgKi9cXG4gICAgZGlzcGxheTogaW5saW5lLWZsZXg7XFxuXFxufVxcblxcbnAuam9oYW5uZXMtY29udGVudC1lbGVtZW50IHtcXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbiAgICBsaW5lLWhlaWdodDogMTtcXG4gICAgbWFyZ2luOiAwO1xcbiAgICBwYWRkaW5nOiAwO1xcbn1cXG5cXG4uam9oYW5uZXMtY29udGVudC1lbGVtZW50IC5jaGVja2JveC1saXN0IHtcXG4gICAgbGlzdC1zdHlsZS10eXBlOiBub25lO1xcbiAgICBwYWRkaW5nLWxlZnQ6IDAgIWltcG9ydGFudDtcXG59XFxuXFxuXFxuLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCAuY2hlY2tib3gtbGlzdCBsaSB7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XFxuICAgIGp1c3RpZnktY29udGVudDogbGVmdDtcXG59XFxuXFxuXFxuLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCB1bC5jaGVja2JveC1saXN0IGlucHV0W3R5cGU9XFxcImNoZWNrYm94XFxcIl06Y2hlY2tlZCtzcGFuIHtcXG4gICAgdGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7XFxufVxcblxcbi8qIHVsLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudDpub3QoLmNoZWNrYm94LWxpc3QpLFxcbm9sLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudDpub3QoLmNoZWNrYm94LWxpc3QpIHtcXG4gICAgcGFkZGluZy1sZWZ0OiAxLjVyZW0gIWltcG9ydGFudDtcXG59ICovXFxuXFxuLyoqIEFkZCBsaW5lIHRocm91Z2ggdGV4dCBkZWNvcmF0aW9uIHRvIGNoZWNrZWQgY2hlY2tib3hlcyB0ZXh0IGRpdiAqL1xcbi5ibG9jayBpbnB1dFt0eXBlPVxcXCJjaGVja2JveFxcXCJdOmNoZWNrZWQrZGl2IHtcXG4gICAgdGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7XFxufVxcblxcbi8qKiBSZW1vdmUgdGhlIGRlZmF1bHQgbGlzdCBzdHlsZSBhbmQgcmVwbGFjZSBieSBhbm90aGVyIHRoYXQgd29ya3Mgd2l0aCBkaXNwbGF5IGZsZXggKi9cXG4uYmxvY2sgb2wsXFxuLmJsb2NrIHVsIHtcXG4gICAgbGlzdC1zdHlsZTogbm9uZTtcXG59XFxuXFxuLmJsb2NrIHVsIC5saXN0LWl0ZW0sXFxuLmJsb2NrIG9sIC5saXN0LWl0ZW0ge1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xcbn1cXG5cXG4uYmxvY2sgb2wgbGkge1xcbiAgICBjb3VudGVyLWluY3JlbWVudDogaXRlbTtcXG59XFxuXFxuLmJsb2NrIG9sIGxpOjpiZWZvcmUge1xcbiAgICBjb250ZW50OiBjb3VudGVyKGl0ZW0pIFxcXCIuIFxcXCI7XFxuICAgIG1hcmdpbi1yaWdodDogMC4zMTI1cmVtO1xcbn1cXG5cXG4uYmxvY2sgdWwgbGk6bm90KC5saXN0LWl0ZW0tY2hlY2thYmxlKTo6YmVmb3JlIHtcXG4gICAgY29udGVudDogXFxcIuKAoiBcXFwiO1xcbiAgICBtYXJnaW4tcmlnaHQ6IDAuMzEyNXJlbTtcXG59XFxuXFxuXFxuXFxuLyoqIGFuZCBsaXN0ICoqL1xcblxcblxcblxcbi5ibG9jaz4uZHJhZy1oYW5kbGVyIHtcXG4gICAgY29sb3I6ICM4NDg4OGQ7XFxuICAgIHZpc2liaWxpdHk6IGhpZGRlbjtcXG4gICAgY3Vyc29yOiBncmFiO1xcbiAgICBhbGlnbi1zZWxmOiBzdGFydDtcXG5cXG4gICAgLyogYmFja2dyb3VuZC1jb2xvcjogcGluazsgKi9cXG4gICAgcGFkZGluZy10b3A6IDAuMzNyZW07XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG59XFxuXFxuLmRyYWctaGFuZGxlciBzdmcge1xcbiAgICAvKiBiYWNrZ3JvdW5kLWNvbG9yOiByZWQ7ICovXFxufVxcblxcbi5kcmFnLWhhbmRsZXIgc3ZnIHVzZSB7XFxuICAgIC8qIGJhY2tncm91bmQtY29sb3I6IGJsdWU7ICovXFxufVxcblxcbi5kcmFnLWhhbmRsZXI6YWN0aXZlIHtcXG4gICAgY3Vyc29yOiBncmFiYmluZztcXG59XFxuXFxuLmJsb2NrIHtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcXG4gICAgbWFyZ2luLWJvdHRvbTogMXJlbTtcXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xcbiAgICBtYXgtd2lkdGg6IDEwMCU7XFxufVxcblxcbi5ibG9jaz4qOm5vdCguZHJhZy1oYW5kbGVyKSB7XFxuICAgIHBhZGRpbmctbGVmdDogMS4yNXJlbSAhaW1wb3J0YW50O1xcbn1cXG5cXG4uYmxvY2s6aG92ZXIgLmRyYWctaGFuZGxlciB7XFxuICAgIHZpc2liaWxpdHk6IHZpc2libGU7XFxuICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7XFxuICAgIGp1c3RpZnktY29udGVudDogc3RhcnQ7XFxufVxcblxcbi5kcm9wLWxpbmUge1xcbiAgICBoZWlnaHQ6IDFyZW07XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICM4NDg4OGQ7XFxuICAgIHdpZHRoOiAxMDAlO1xcbn1cXG5cXG5cXG4udGl0bGUgaDEge1xcbiAgICBtYXJnaW4tbGVmdDogMS4zcmVtO1xcbn1cXG5cXG5cXG5bY29udGVudGVkaXRhYmxlPVxcXCJ0cnVlXFxcIl06ZW1wdHk6Zm9jdXMge1xcbiAgICBjb250ZW50OiBhdHRyKGRhdGEtcGxhY2Vob2xkZXIpO1xcbiAgICBjb2xvcjogIzg0ODg4ZDtcXG4gICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XFxufVxcblxcbmgxW2RhdGEtcGxhY2Vob2xkZXJdOmVtcHR5OmJlZm9yZSB7XFxuICAgIGNvbnRlbnQ6IGF0dHIoZGF0YS1wbGFjZWhvbGRlcik7XFxuICAgIGNvbG9yOiAjODQ4ODhkICFpbXBvcnRhbnQ7XFxuICAgIGRpc3BsYXk6IGJsb2NrO1xcbn1cXG5cXG5oMVtkYXRhLXBsYWNlaG9sZGVyXTpmb2N1czpiZWZvcmUge31cXG5cXG5cXG4qW2NvbnRlbnRlZGl0YWJsZT1cXFwidHJ1ZVxcXCJdOm5vdChoMSk6ZW1wdHk6YmVmb3JlIHtcXG4gICAgY29udGVudDogYXR0cihkYXRhLXBsYWNlaG9sZGVyKTtcXG4gICAgY29sb3I6ICM4NDg4OGFjZDtcXG4gICAgZGlzcGxheTogbm9uZTtcXG59XFxuXFxuKltjb250ZW50ZWRpdGFibGU9XFxcInRydWVcXFwiXTpub3QoaDEpOmVtcHR5OmhvdmVyOmJlZm9yZSB7XFxuICAgIGRpc3BsYXk6IGJsb2NrO1xcbn1cXG5cXG5jaXRlW2NvbnRlbnRlZGl0YWJsZT1cXFwidHJ1ZVxcXCJdOmVtcHR5OmJlZm9yZSB7XFxuICAgIGRpc3BsYXk6IGJsb2NrO1xcbn1cXG5cXG4qW2NvbnRlbnRlZGl0YWJsZT1cXFwidHJ1ZVxcXCJdOm5vdChoMSlbZGF0YS1wbGFjZWhvbGRlcl06ZW1wdHk6Zm9jdXM6YmVmb3JlIHtcXG4gICAgY29udGVudDogYXR0cihkYXRhLXBsYWNlaG9sZGVyKTtcXG4gICAgY29sb3I6ICM4NDg4OGFjZCAhaW1wb3J0YW50O1xcbiAgICBkaXNwbGF5OiBibG9jaztcXG59XFxuXFxuXFxuXFxuaDEge1xcbiAgICBmb250LXNpemU6IDIuNXJlbTtcXG4gICAgZm9udC13ZWlnaHQ6IGJvbGRlciAhaW1wb3J0YW50O1xcbn1cXG5cXG4uam9oYW5uZXMtZWRpdG9yIHtcXG4gICAgd2lkdGg6IDEwMCU7XFxuXFxufVxcblxcbi5jb250ZW50IHtcXG4gICAgd2lkdGg6IDEwMCU7XFxuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxuICAgIC8qIGJhY2tncm91bmQtY29sb3I6IHJlZDsgKi9cXG59XFxuXFxuLmNvbnRlbnQgLmJsb2NrIC50YWJsZS13cmFwcGVyIHtcXG4gICAgb3ZlcmZsb3cteDogYXV0bztcXG4gICAgb3ZlcmZsb3cteTogaGlkZGVuO1xcbn1cXG5cXG5cXG5wcmUge1xcbiAgICB3aWR0aDogMTAwJTtcXG59XFxuXFxuW2NvbnRlbnRlZGl0YWJsZV0ge1xcbiAgICBvdXRsaW5lOiBub25lO1xcbn1cXG5cXG5ib2R5IHtcXG4gICAgaGVpZ2h0OiAyMDAwcHg7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNmMGYwZjEgIWltcG9ydGFudDtcXG5cXG4gICAgZm9udC1mYW1pbHk6IHN5c3RlbS11aSwgLWFwcGxlLXN5c3RlbSwgXFxcIlNlZ29lIFVJXFxcIiwgUm9ib3RvLCBcXFwiSGVsdmV0aWNhIE5ldWVcXFwiLCBcXFwiTm90byBTYW5zXFxcIiwgXFxcIkxpYmVyYXRpb24gU2Fuc1xcXCIsIEFyaWFsLCBzYW5zLXNlcmlmLCBcXFwiQXBwbGUgQ29sb3IgRW1vamlcXFwiLCBcXFwiU2Vnb2UgVUkgRW1vamlcXFwiLCBcXFwiU2Vnb2UgVUkgU3ltYm9sXFxcIiwgXFxcIk5vdG8gQ29sb3IgRW1vamlcXFwiO1xcbn1cXG5cXG5cXG4uZWRpdG9yIHtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgbWFyZ2luLXRvcDogODBweDtcXG59XFxuXFxucCB7XFxuICAgIGNvbG9yOiAjMjQyNDI0O1xcbn1cXG5cXG5cXG4uYmxvY2ssXFxuLmJsb2NrICoge1xcbiAgICB1c2VyLXNlbGVjdDogdGV4dDtcXG59XFxuXFxuXFxuLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCB7XFxuICAgIHdpZHRoOiAxMDAlO1xcbiAgICBwYWRkaW5nOiAwO1xcbiAgICBtYXJnaW46IDA7XFxuICAgIC8qIGJhY2tncm91bmQtY29sb3I6IGdyZWVuOyAqL1xcbn1cXG5cXG5cXG4jam9oYW5uZXNFZGl0b3Ige1xcbiAgICB3aWR0aDogNjAlO1xcbiAgICBtYXJnaW4tbGVmdDogYXV0bztcXG4gICAgbWFyZ2luLXJpZ2h0OiBhdXRvO1xcbn1cXG5cXG4uam9oYW5uZXMtZWRpdG9yIGhyIHtcXG4gICAgd2lkdGg6IDEwMCU7XFxuICAgIGhlaWdodDogMnB4O1xcbiAgICB2aXNpYmlsaXR5OiB2aXNpYmxlO1xcbiAgICBib3JkZXI6IG5vbmU7XFxuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2JhKDU1LCA1MywgNDcsIDAuMTYpO1xcbn1cXG5cXG5cXG5cXG4uam9oYW5uZXMtZWRpdG9yIGJsb2NrcXVvdGUge1xcbiAgICBtYXJnaW46IDAuNXJlbSAwO1xcbiAgICBwYWRkaW5nLWxlZnQ6IDIwcHg7XFxuICAgIGJvcmRlci1sZWZ0OiA0cHggc29saWQgcmdiKDU1LCA1MywgNDcpO1xcbiAgICBmb250LXN0eWxlOiBpdGFsaWNcXG59XFxuXFxuLmpvaGFubmVzLWVkaXRvciBjaXRlIHtcXG4gICAgcGFkZGluZy10b3A6IDFyZW0gIWltcG9ydGFudDtcXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbn1cXG5cXG5cXG4uam9oYW5uZXMtZWRpdG9yIGNpdGU6OmJlZm9yZSB7XFxuICAgIGNvbnRlbnQ6ICfigJQgJztcXG59XFxuXFxuXFxuXFxuXFxuXFxuXFxuXFxuXFxuXFxuXFxuXFxuXFxuXFxuXFxuXFxuXFxuXFxuXFxuXFxuXFxuXFxuXFxuXFxuXFxuXFxuXFxuXFxuXFxuXFxuXFxuXFxuI2xpbmtCb3gge1xcbiAgICBib3JkZXItcmFkaXVzOiAycHg7XFxuICAgIHBhZGRpbmc6IDIwcHg7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNmOWY5Zjk7XFxuXFxuXFxuICAgIGJveC1zaGFkb3c6XFxuICAgICAgICAwIDRweCA2cHggcmdiYSgwLCAwLCAwLCAwLjEpLFxcbiAgICAgICAgMCAtMnB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMDIpLFxcbiAgICAgICAgLTJweCAwIDRweCByZ2JhKDAsIDAsIDAsIDAuMDIpLFxcbiAgICAgICAgMnB4IDAgNHB4IHJnYmEoMCwgMCwgMCwgMC4wMik7XFxuXFxuXFxuICAgIGJvcmRlcjogMXB4IHNvbGlkICNkMGQwZDA7XFxuICAgIHdpZHRoOiBmaXQtY29udGVudDtcXG4gICAgei1pbmRleDogOTk5OTk5O1xcbiAgICBjb2xvcjogcmdiKDEyMCwgMTE5LCAxMTYpO1xcbiAgICBib3JkZXItcmFkaXVzOiBub25lO1xcbn1cXG5cXG5cXG4jbGlua0JveCBpbnB1dCB7XFxuICAgIHdpZHRoOiAzMTZweDtcXG4gICAgcGFkZGluZzogOHB4IDQwcHggOHB4IDE2cHg7XFxuICAgIC8qIGJvcmRlci1jb2xvcjogI2QwZDBkMDsgKi9cXG5cXG4gICAgYm9yZGVyOiAxcHggc29saWQgIzk0OTQ5NDtcXG4gICAgLyogYm9yZGVyLXJhZGl1czogNHB4OyAqL1xcbiAgICBoZWlnaHQ6IDI0cHg7XFxuXFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XFxuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xcbn1cXG5cXG5cXG4jbGlua0JveCBpbnB1dDo6c2VsZWN0aW9uLFxcbiNsaW5rQm94IGlucHV0OmZvY3VzIHtcXG4gICAgYm9yZGVyLXJhZGl1czogbm9uZTtcXG59XFxuXFxuLyoqIHNvZnQtYm94LXNoYWRvdyBjbGFzcyAqL1xcbi5zb2Z0LWJveC1zaGFkb3cge1xcbiAgICBtYXJnaW46IDA7XFxuICAgIHBhZGRpbmc6IDA7XFxuICAgIGJvcmRlci1yYWRpdXM6IDJweDtcXG4gICAgYm94LXNoYWRvdzpcXG4gICAgICAgIDAgNHB4IDZweCByZ2JhKDAsIDAsIDAsIDAuMSksXFxuICAgICAgICAwIC0ycHggNHB4IHJnYmEoMjE2LCAxOTYsIDE5NiwgMC4wMiksXFxuICAgICAgICAtMnB4IDAgNHB4IHJnYmEoMCwgMCwgMCwgMC4wMiksXFxuICAgICAgICAycHggMCA0cHggcmdiYSgwLCAwLCAwLCAwLjAyKTtcXG5cXG4gICAgYm9yZGVyOiAxcHggc29saWQgI2QwZDBkMDtcXG59XFxuXFxuLyoqIGFuZCBzb2Z0LWJveC1zaGFkb3cgKi9cXG5cXG5cXG4vKiogc2VsZWN0aW9uLXdyYXBwZXIgY2xhc3MgKi9cXG4uc2VsZWN0LXdyYXBwZXIge1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xcbn1cXG5cXG4uc2VsZWN0LXdyYXBwZXIgdWwge1xcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgIGJhY2tncm91bmQ6ICNmOWY5Zjk7XFxuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XFxuICAgIHdpZHRoOiBmaXQtY29udGVudDtcXG4gICAgcGFkZGluZy1ib3R0b206IDAuNXJlbTtcXG4gICAgcGFkZGluZy1sZWZ0OiA1cHg7XFxuICAgIHBhZGRpbmctcmlnaHQ6IDVweDtcXG4gICAgdG9wOiAyLjJyZW07XFxuICAgIGNvbG9yOiByZ2IoNTUsIDUzLCA0Nyk7XFxuICAgIHBhZGRpbmctcmlnaHQ6IDAuMzEyNXJlbTtcXG59XFxuXFxuLnNlbGVjdC13cmFwcGVyIHVsIGxpIHtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gICAgZ2FwOiAwLjYyNXJlbTtcXG4gICAgcGFkZGluZzogMC4xODc1cmVtIDAuMzEyNXJlbTtcXG4gICAgYm9yZGVyLXJhZGl1czogMC4xODc1cmVtO1xcbiAgICB1c2VyLXNlbGVjdDogbm9uZSAhaW1wb3J0YW50O1xcbiAgICBmb250LXNpemU6IHNtYWxsICFpbXBvcnRhbnQ7XFxuICAgIGZvbnQtd2VpZ2h0OiA1MDA7XFxufVxcblxcbi5zZWxlY3Qtd3JhcHBlciB1bCBsaSBzcGFuIHtcXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbiAgICB3aWR0aDogbWF4LWNvbnRlbnQ7XFxufVxcblxcbi5zZWxlY3Qtd3JhcHBlciB1bCBsaSAub3B0aW9uLWltYWdlIHtcXG4gICAgd2lkdGg6IDEuMzc1cmVtO1xcbiAgICBoZWlnaHQ6IDEuMzc1cmVtO1xcbiAgICBjb2xvcjogIzI0MjQyNDtcXG4gICAgcGFkZGluZzogMCAhaW1wb3J0YW50O1xcbiAgICBtYXJnaW46IDAgIWltcG9ydGFudDtcXG59XFxuXFxuLnNlbGVjdC13cmFwcGVyIHVsIGxpIC5vcHRpb24taW1hZ2Ugc3ZnIHtcXG4gICAgY29sb3I6ICM0ZjRmNGY7XFxuICAgIHBhZGRpbmc6IDAgIWltcG9ydGFudDtcXG4gICAgbWFyZ2luOiAwICFpbXBvcnRhbnQ7XFxufVxcblxcbi5zZWxlY3Qtd3JhcHBlciB7XFxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gICAgY29sb3I6IHJnYigxMjAsIDExOSwgMTE2KTtcXG59XFxuXFxuLnNlbGVjdC13cmFwcGVyPmJ1dHRvbiB7XFxuICAgIGNvbG9yOiByZ2JhKDU1LCA1MywgNDcsIDAuODUpO1xcbn1cXG5cXG4uc2VsZWN0LXdyYXBwZXIgdWwgbGk+aDMge1xcbiAgICBtYXJnaW46IDA7XFxuICAgIGZvbnQtc2l6ZTogc21hbGwgIWltcG9ydGFudDtcXG4gICAgY29sb3I6ICMzNzM1MmZhNjtcXG4gICAgbWFyZ2luOiAwO1xcbiAgICBwYWRkaW5nOiAwO1xcbiAgICBmb250LXdlaWdodDogNjAwICFpbXBvcnRhbnQ7XFxuICAgIG1hcmdpbi10b3A6IDAuMzEyNXJlbTtcXG4gICAgbWFyZ2luLWJvdHRvbTogMC4zMTI1cmVtO1xcbn1cXG5cXG4vKiogZW5kIHNlbGVjdGlvbiB3cmFwcGVyICoqL1xcblxcblxcblxcbi8qKiBUZXh0IGZvcm1hdHRpbmcgQmFyICoqL1xcblxcblxcblxcbi5mbG9hdGluZy10b29sYmFyIHtcXG4gICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xcbiAgICBwYWRkaW5nOiA4cHggMTZweDtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2Y5ZjlmOTtcXG4gICAgd2lkdGg6IGZpdC1jb250ZW50O1xcbiAgICB6LWluZGV4OiA5OTk5OTk7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgdXNlci1zZWxlY3Q6IG5vbmU7XFxufVxcblxcbi8qIFRPRE86IHJlbW92ZSB0aGlzKi9cXG5zcGFuIHtcXG4gICAgZm9udC1mYW1pbHk6IEFyaWFsLCBzYW5zLXNlcmlmO1xcbn1cXG5cXG5cXG4uZmxvYXRpbmctdG9vbGJhciAuaXRlbSB7XFxuICAgIGNvbG9yOiByZ2IoMTIwLCAxMTksIDExNik7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICAgIGdhcDogMTBweDtcXG59XFxuXFxuLmZsb2F0aW5nLXRvb2xiYXIgLml0ZW0+YnV0dG9uIHtcXG5cXG4gICAgZGlzcGxheTogaW5saW5lLWZsZXg7XFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxufVxcblxcblxcbi5mbG9hdGluZy10b29sYmFyIHNlbGVjdCB7XFxuICAgIGNvbG9yOiByZ2IoMTIwLCAxMTksIDExNik7XFxuICAgIGJvcmRlcjogbm9uZTtcXG4gICAgZm9udC1zaXplOiAwLjg1cmVtO1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBpbmhlcml0O1xcbn1cXG5cXG4udGV4dC1mb3JtYXR0aW5nLXNlbGVjdC1idXR0b24ge1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xcbn1cXG5cXG4jdHVybkludG9CdXR0b24gc3BhbiB7XFxuICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gICAgZm9udC1zaXplOiAwLjlyZW07XFxuXFxufVxcblxcbiN0dXJuSW50b0J1dHRvbiBzdmcgdXNlIHtcXG4gICAgbWFyZ2luOiBhdXRvO1xcbn1cXG5cXG5jb2RlOm5vdChwcmUgY29kZSkge1xcbiAgICBtYXJnaW46IDA7XFxuICAgIHBhZGRpbmc6IDA7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNkMGQwZDA7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNmNmY1ZjQ7XFxuICAgIGZvbnQtc2l6ZTogaW5oZXJpdDtcXG4gICAgZm9udC1zaXplOiAxcmVtICFpbXBvcnRhbnQ7XFxuICAgIGJvcmRlcjogMXB4IHNvbGlkICMwMDAwMDAxYTtcXG4gICAgcGFkZGluZzogMCAzcHg7XFxuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gICAgYm9yZGVyLXJhZGl1czogNHB4O1xcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcbn1cXG5cXG5cXG5cXG5cXG4vKiBhOm5vdChbaHJlZl0pIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2QzZTNmZDtcXG59ICovXFxuXFxuLnRleHQtZm9ybWF0dGluZy1idXR0b24tYWN0aXZlIHtcXG4gICAgY29sb3I6ICMyMzgyZTI7XFxufVxcblxcbi50ZXh0LWZvcm1hdHRpbmctY2lyY2xlLWFjdGl2ZSB7XFxuICAgIGJvcmRlci1jb2xvcjogIzIzODJlMiAhaW1wb3J0YW50O1xcbn1cXG5cXG5cXG5cXG4jbW9yZVRleHRPcHRpb25TZWxlY3Qge1xcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxufVxcblxcbi5tb3JlVGV4dE9wdGlvbldyYXBwZXIge1xcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XFxufVxcblxcblxcbi5iZ2MtcmVkIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI0ZEREVERTtcXG59XFxuXFxuLmJnYy1ncmVlbiB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNEN0Y3REM7XFxufVxcblxcbi5iZ2MtYmx1ZSB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNEOUVERjY7XFxufVxcblxcbi5iZ2MteWVsbG93IHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI0ZBRjREMTtcXG59XFxuXFxuLmJnYy1ncmV5IHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI0UxRTBFMDtcXG59XFxuXFxucCxcXG5tYXJrIHtcXG4gICAgbGluZS1oZWlnaHQ6IDE7XFxufVxcblxcbiN0dXJuSW50b1NlbGVjdCAub3B0aW9uLWltYWdlIHtcXG4gICAgLyogZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OyAqL1xcbn1cXG5cXG4uYm9yZGVyLWxlc3MtaW1hZ2Uge1xcbiAgICB3aWR0aDogMjRweDtcXG4gICAgaGVpZ2h0OiAyNHB4O1xcbn1cXG5cXG5cXG5cXG5cXG4vKiogQmxvY2sgT3B0aW9ucyAqKi9cXG5cXG4uYmxvY2stb3B0aW9ucy13cmFwcGVyIHtcXG4gICAgei1pbmRleDogOTk5OTk5O1xcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgIGRpc3BsYXk6IG5vbmU7XFxufVxcblxcbi5ibG9jay1vcHRpb25zIHtcXG4gICAgd2lkdGg6IGZpdC1jb250ZW50O1xcbiAgICBtYXgtaGVpZ2h0OiAxOXJlbTtcXG4gICAgb3ZlcmZsb3cteTogYXV0bztcXG59XFxuXFxuLmJsb2NrLW9wdGlvbnMge1xcbiAgICBwYWRkaW5nOiAwIDAuNjI1cmVtO1xcbiAgICBiYWNrZ3JvdW5kOiAjZjlmOWY5O1xcbn1cXG5cXG4uYmxvY2stb3B0aW9ucyBzZWN0aW9uIGgyIHtcXG4gICAgZm9udC1zaXplOiBzbWFsbCAhaW1wb3J0YW50O1xcbiAgICBjb2xvcjogIzM3MzUyZmE2O1xcbiAgICBtYXJnaW46IDA7XFxuICAgIHBhZGRpbmc6IDA7XFxuICAgIGZvbnQtd2VpZ2h0OiA2MDAgIWltcG9ydGFudDtcXG4gICAgbWFyZ2luLXRvcDogMC4zMTI1cmVtO1xcbiAgICBtYXJnaW4tYm90dG9tOiAwLjMxMjVyZW07XFxuICAgIHBhZGRpbmctbGVmdDogMC4zMTI1cmVtO1xcbn1cXG5cXG4uYmxvY2stb3B0aW9ucyAub3B0aW9uIHtcXG4gICAgcGFkZGluZzogMC4zMTI1cmVtIDAuNjI1cmVtO1xcbiAgICBtYXJnaW46IDAuMzEyNXJlbSAwO1xcbiAgICBjdXJzb3I6IHBvaW50ZXI7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICAgIGp1c3RpZnktY29udGVudDogbGVmdDtcXG4gICAgZ2FwOiAwLjZyZW07XFxuICAgIGJvcmRlci1yYWRpdXM6IDNweDtcXG59XFxuXFxuLmJsb2NrLW9wdGlvbnMgLm9wdGlvbjpmb2N1cyB7XFxuICAgIG91dGxpbmU6IG5vbmU7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNlOWU5ZTk7XFxuICAgIGJvcmRlcjogaW5oZXJpdDtcXG59XFxuXFxuLm9wdGlvbi1mb2N1c2VkIHtcXG4gICAgb3V0bGluZTogbm9uZTtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2U5ZTllOTtcXG4gICAgYm9yZGVyOiBub25lO1xcbn1cXG5cXG4uZGFuZ2VyLW9wdGlvbi5vcHRpb24tZm9jdXNlZCxcXG4uZGFuZ2VyLW9wdGlvbi5vcHRpb24tZm9jdXNlZCBzdmcge1xcbiAgICBjb2xvcjogI0VCNTc1NyAhaW1wb3J0YW50O1xcbn1cXG5cXG5cXG5cXG4uYmxvY2stb3B0aW9ucyAub3B0aW9uOmZvY3VzLXZpc2libGUge1xcbiAgICBvdXRsaW5lOiBub25lO1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTllOWU5O1xcbiAgICBib3JkZXI6IGluaGVyaXQ7XFxufVxcblxcbi8qIC5vcHRpb24taG92ZXI6aG92ZXIge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTllOWU5O1xcbiAgICBib3gtc2hhZG93OiAwcHggMHB4IDBweCAycHggI2U5ZTllOTtcXG4gICAgYm9yZGVyLXJhZGl1czogMXB4O1xcbiAgICB0cmFuc2l0aW9uOiAwLjFzIGVhc2U7XFxufSAqL1xcblxcbi8qIC5zZWxlY3Qtd3JhcHBlcj5idXR0b24sICovXFxuXFxuLyogI3R1cm5JbnRvQnV0dG9uLFxcbiNjb2xvclRleHRCdXR0b24ge1xcbiAgICBwYWRkaW5nLWxlZnQ6IDRweDtcXG59ICovXFxuXFxuI2NvbG9yVGV4dEJ1dHRvbiB7XFxuICAgIG1hcmdpbi1sZWZ0OiAwLjYyNXJlbTtcXG59XFxuXFxuI3R1cm5JbnRvQnV0dG9uOm5vdChbZGlzYWJsZWRdKTpob3ZlcixcXG4jY29sb3JUZXh0QnV0dG9uOm5vdChbZGlzYWJsZWRdKTpob3ZlcixcXG4jbW9yZVRleHRPcHRpb25CdXR0b246bm90KFtkaXNhYmxlZF0pOmhvdmVyLFxcbi5mbG9hdGluZy10b29sYmFyIC5pdGVtPmJ1dHRvbjpub3QoW2Rpc2FibGVkXSk6aG92ZXIge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTllOWU5O1xcbiAgICBib3gtc2hhZG93OiAwcHggMHB4IDBweCAycHggI2U5ZTllOTtcXG4gICAgYm9yZGVyLXJhZGl1czogMXB4O1xcbiAgICB0cmFuc2l0aW9uOiAwLjFzIGVhc2U7XFxufVxcblxcblxcblxcbi5vcHRpb25bZm9jdXNlZD1cXFwidHJ1ZVxcXCJdIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2JkZTRmZjtcXG59XFxuXFxuXFxuXFxuXFxuXFxuLm9wdGlvbi1pbWFnZSB7XFxuICAgIHdpZHRoOiAyLjg3NXJlbTtcXG4gICAgaGVpZ2h0OiAyLjg3NXJlbTtcXG4gICAgYm9yZGVyLXJhZGl1czogMC4xODc1cmVtO1xcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjY2NjO1xcbiAgICBjb2xvcjogIzRmNGY0ZjtcXG5cXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcXG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XFxuICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmO1xcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcbn1cXG5cXG4ub3B0aW9uLWltYWdlIGltZyB7XFxuICAgIG1heC13aWR0aDogMi44NzVyZW07XFxuICAgIG1heC1oZWlnaHQ6IDIuODc1cmVtO1xcbn1cXG5cXG4ub3B0aW9uLWltYWdlIHN2ZyB7XFxuICAgIG1hcmdpbjogMDtcXG4gICAgcGFkZGluZzogMDtcXG4gICAgcGFkZGluZzogMC42MjVyZW07XFxuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxuXFxufVxcblxcbi5vcHRpb24tdGV4dCAqIHtcXG4gICAgbWFyZ2luOiAwO1xcbiAgICBwYWRkaW5nOiAwO1xcblxcbn1cXG5cXG4ub3B0aW9uLXRleHQgLmJsb2NrLXRpdGxlIHtcXG4gICAgZm9udC1zaXplOiBzbWFsbCAhaW1wb3J0YW50O1xcbiAgICBmb250LXdlaWdodDogNTAwO1xcbn1cXG5cXG4ub3B0aW9uLXRleHQgLmJsb2NrLWRlc2NyaXB0aW9uIHtcXG4gICAgZm9udC1zaXplOiBzbWFsbCAhaW1wb3J0YW50O1xcbiAgICBjb2xvcjogcmdiYSg1NSwgNTMsIDQ3LCAwLjUpO1xcbn1cXG5cXG4vKiogRW5kIEJsb2NrIE9wdGlvbnMgKiovXFxuXFxuXFxuXFxuI2RlbGV0ZUJsb2NrQnV0dG9uOmhvdmVyIHN2ZyxcXG4jZGVsZXRlQmxvY2tCdXR0b246aG92ZXIge1xcbiAgICBjb2xvcjogcmdiKDIzNSwgODcsIDg3KSAhaW1wb3J0YW50O1xcbn1cXG5cXG5cXG5cXG4uam9oYW5uZXMtZWRpdG9yICo6OnNlbGVjdGlvbiB7XFxuICAgIC8qIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMjExLCAyMjcsIDI1MywgMC41KSAhaW1wb3J0YW50OyAqL1xcblxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZWQ7XFxuXFxuICAgIGJhY2tncm91bmQtY29sb3I6IGhzbCgyMTAgNzUlIDUwJSAvIDEpO1xcbiAgICBjb2xvcjogd2hpdGU7XFxufVxcblxcbi5qb2hhbm5lcy1lZGl0b3IgbWFyayxcXG4uam9oYW5uZXMtZWRpdG9yICoge1xcbiAgICBsaW5lLWhlaWdodDogMS41ICFpbXBvcnRhbnQ7XFxufVxcblxcbi5vcHRpb24ge1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XFxufVxcblxcbi50ZXh0LW9wdGlvbiB7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XFxuICAgIGp1c3RpZnktY29udGVudDogc3RhcnQ7XFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICAgIGdhcDogMC42MjVyZW07XFxufVxcblxcblxcblxcblxcbjpyb290IHtcXG4gICAgLyogZm9udC1zaXplOiAxNnB4OyAqL1xcbiAgICAvKiBUYW1hbmhvIHBhZHLDo28gKi9cXG59XFxuXFxuLyogUGFyYSB0ZWxhcyBjb20gZGVuc2lkYWRlIG3DqWRpYSAqL1xcbkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKC13ZWJraXQtbWluLWRldmljZS1waXhlbC1yYXRpbzogMiksXFxub25seSBzY3JlZW4gYW5kIChtaW4tLW1vei1kZXZpY2UtcGl4ZWwtcmF0aW86IDIpLFxcbm9ubHkgc2NyZWVuIGFuZCAobWluLXJlc29sdXRpb246IDE5MmRwaSksXFxub25seSBzY3JlZW4gYW5kIChtaW4tcmVzb2x1dGlvbjogMmRwcHgpIHtcXG4gICAgOnJvb3Qge1xcbiAgICAgICAgZm9udC1zaXplOiAxOHB4O1xcbiAgICAgICAgLyogQXVtZW50YSBvIHRhbWFuaG8gZGEgZm9udGUgcGFyYSB0ZWxhcyBkZSBhbHRhIGRlbnNpZGFkZSAqL1xcbiAgICB9XFxufVxcblxcbi8qIFBhcmEgdGVsYXMgY29tIGFsdMOtc3NpbWEgZGVuc2lkYWRlICovXFxuQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAoLXdlYmtpdC1taW4tZGV2aWNlLXBpeGVsLXJhdGlvOiAzKSxcXG5vbmx5IHNjcmVlbiBhbmQgKG1pbi0tbW96LWRldmljZS1waXhlbC1yYXRpbzogMyksXFxub25seSBzY3JlZW4gYW5kIChtaW4tcmVzb2x1dGlvbjogMjg4ZHBpKSxcXG5vbmx5IHNjcmVlbiBhbmQgKG1pbi1yZXNvbHV0aW9uOiAzZHBweCkge1xcbiAgICA6cm9vdCB7XFxuICAgICAgICBmb250LXNpemU6IDIwcHg7XFxuICAgICAgICAvKiBBaW5kYSBtYWlvciBwYXJhIHRlbGFzIGRlIGRlbnNpZGFkZSBtdWl0byBhbHRhICovXFxuICAgIH1cXG59XFxuXFxuXFxuXFxuXFxuXFxuXFxuXFxuXFxuXFxuXFxuXFxudGFibGUuam9oYW5uZXMtY29udGVudC1lbGVtZW50IHtcXG4gICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTtcXG4gICAgbWF4LXdpZHRoOiBpbmhlcml0O1xcbiAgICB3aWR0aDogYXV0bztcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveCAhaW1wb3J0YW50O1xcbn1cXG5cXG50YWJsZS5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQgdGgsXFxudGFibGUuam9oYW5uZXMtY29udGVudC1lbGVtZW50IHRkIHtcXG4gICAgbWluLWhlaWdodDogMjBweDtcXG59XFxuXFxudGFibGUuam9oYW5uZXMtY29udGVudC1lbGVtZW50IHRoLFxcbnRhYmxlLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCB0ZCB7XFxuICAgIGJvcmRlcjogMXB4IHNvbGlkICM4NDg4OGQ7XFxuICAgIHBhZGRpbmc6IDhweDtcXG4gICAgdGV4dC1hbGlnbjogbGVmdDtcXG4gICAgYWxpZ24taXRlbXM6IHN0YXJ0O1xcbiAgICBvdmVyZmxvdy13cmFwOiBicmVhay13b3JkO1xcbiAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7XFxuICAgIHdoaXRlLXNwYWNlOiBub3JtYWw7XFxuICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7XFxuICAgIG1pbi13aWR0aDogMTAwcHg7XFxuICAgIG1heC13aWR0aDogMjAwcHg7XFxuICAgIC8qIGJveC1zaXppbmc6IGJvcmRlci1ib3ggIWltcG9ydGFudDsgKi9cXG5cXG4gICAgdHJhbnNpdGlvbjogYm9yZGVyIDEwMG1zIGVhc2Utb3V0LCBib3gtc2hhZG93IDEwMG1zIGVhc2Utb3V0O1xcblxcbn1cXG5cXG50YWJsZS5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQgdGQuc2VsZWN0ZWQsXFxudGFibGUuam9oYW5uZXMtY29udGVudC1lbGVtZW50IHRkOmZvY3VzIHtcXG4gICAgb3V0bGluZTogbm9uZTtcXG4gICAgYm94LXNoYWRvdzogMCAwIDAgMXB4ICM3NGI2ZGIgaW5zZXQ7XFxuICAgIGJvcmRlcjogMXB4IGRvdWJsZSAjNzRiNmRiO1xcblxcbn1cXG5cXG50ZCB7XFxuICAgIG1pbi1oZWlnaHQ6IDFyZW0gIWltcG9ydGFudDtcXG4gICAgbGluZS1oZWlnaHQ6IDFyZW07XFxufVxcblxcbnRkOjpwbGFjZWhvbGRlciB7XFxuICAgIGRpc3BsYXk6IGJsb2NrO1xcbn1cXG5cXG50ZDplbXB0eTpiZWZvcmUge1xcbiAgICBjb250ZW50OiBhdHRyKGRhdGEtcGxhY2Vob2xkZXIpO1xcbiAgICBjb2xvcjogIzg0ODg4YWNkO1xcbiAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50O1xcbiAgICBvcGFjaXR5OiAwO1xcbn1cXG5cXG4udGFibGUtd3JhcHBlciB7XFxuICAgIHdpZHRoOiAxMDAlO1xcbn1cXG5cXG4udGFibGUtY29udHJvbGxlciB7XFxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gICAgbWF4LXdpZHRoOiAxMDAlO1xcbn1cXG5cXG4uYWRkLXRhYmxlLXJvdyB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoNTUsIDUzLCA0NywgMC4wNik7XFxuICAgIHdpZHRoOiAxMDAlO1xcbiAgICBwYWRkaW5nOiAwO1xcbiAgICBtYXJnaW46IDA7XFxuICAgIG1hcmdpbi10b3A6IDAuMzc1cmVtO1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xcbiAgICBoZWlnaHQ6IDFyZW07XFxuICAgIGN1cnNvcjogcG9pbnRlcjtcXG4gICAgb3BhY2l0eTogMDtcXG4gICAgdXNlci1zZWxlY3Q6IG5vbmU7XFxufVxcblxcbi5hZGQtdGFibGUtY29sdW1uIHtcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgICByaWdodDogLTEuMzEyNXJlbTtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSg1NSwgNTMsIDQ3LCAwLjA2KTtcXG4gICAgd2lkdGg6IDFyZW07XFxuICAgIHBhZGRpbmc6IDA7XFxuICAgIG1hcmdpbjogMDtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcXG4gICAgaGVpZ2h0OiAxMDAlO1xcbiAgICB0b3A6IDA7XFxuICAgIGN1cnNvcjogcG9pbnRlcjtcXG4gICAgaGVpZ2h0OiBjYWxjKDEwMCUgLSAxcmVtIC0gNXB4KTtcXG4gICAgb3BhY2l0eTogMDtcXG4gICAgdXNlci1zZWxlY3Q6IG5vbmU7XFxufVxcblxcbi5hZGQtdGFibGUtY29sdW1uOmhvdmVyIHtcXG4gICAgb3BhY2l0eTogMTtcXG59XFxuXFxuLmFkZC10YWJsZS1yb3c6aG92ZXIge1xcbiAgICBvcGFjaXR5OiAxO1xcbn1cXG5cXG4udGFibGUtc2hlbGwge1xcbiAgICBtYXgtd2lkdGg6IDEwMCU7XFxufVxcblxcblxcblxcbi50YWJsZS1vcHRpb24ge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcXG4gICAgd2lkdGg6IGZpdC1jb250ZW50O1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XFxuICAgIHBhZGRpbmc6IDhweCAxNnB4O1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjlmOWY5O1xcbiAgICB3aWR0aDogZml0LWNvbnRlbnQ7XFxuICAgIHotaW5kZXg6IDk5OTk5OTtcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgICB1c2VyLXNlbGVjdDogbm9uZTtcXG4gICAgcGFkZGluZzogOHB4IDE2cHg7XFxuICAgIGRpc3BsYXk6IG5vbmU7XFxufVxcblxcblxcblxcblxcbi8qKiBDYWxsb3V0ICoqL1xcbi5jYWxsb3V0OmhvdmVyIC5vcHRpb25zLWJ1dHRvbiB7XFxuICAgIGRpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7XFxufVxcblxcblxcbi5uby1zZWxlY3Rpb24ge1xcbiAgICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lO1xcbiAgICAtbW96LXVzZXItc2VsZWN0OiBub25lO1xcbiAgICB1c2VyLXNlbGVjdDogbm9uZTtcXG59XFxuXFxuXFxuLyoqIHVwbG9hZC9lbWJlZCAqKi9cXG5cXG4udGFiLWNvbnRhaW5lciB7XFxuICAgIGZvbnQtc2l6ZTogMC44NnJlbTtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcXG4gICAgdHJhbnNpdGlvbjogMC4xcyBlYXNlO1xcblxcbiAgICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lO1xcbiAgICAtbW96LXVzZXItc2VsZWN0OiBub25lO1xcbiAgICB1c2VyLXNlbGVjdDogbm9uZTtcXG5cXG4gICAgdHJhbnNpdGlvbjogdmlzaWJpbGl0eSAwLjJzIGVhc2U7XFxuXFxufVxcblxcbi5uYXYtdW5kZXJsaW5lIHtcXG4gICAgbWFyZ2luOiAwO1xcbiAgICBwYWRkaW5nOiAwO1xcbiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgcmdiYSg1NSwgNTMsIDQ3LCAwLjE2KTtcXG4gICAgcGFkZGluZzogMTBweCAyMHB4O1xcbn1cXG5cXG4ubmF2LXVuZGVybGluZSAubmF2LWl0ZW0ge1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBtYXJnaW4tcmlnaHQ6IDE1cHg7XFxufVxcblxcbi5uYXYtdW5kZXJsaW5lIC5uYXYtbGluayB7XFxuICAgIGN1cnNvcjogcG9pbnRlcjtcXG4gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xcbiAgICBjb2xvcjogcmdiKDU1LCA1MywgNDcpO1xcbiAgICBjb2xvcjogcmdiYSg1NSwgNTMsIDQ3LCAwLjUpO1xcbiAgICB0cmFuc2l0aW9uOiAwLjFzIGVhc2U7XFxufVxcblxcblxcbi5uYXYtaXRlbS5hY3RpdmUgLm5hdi1saW5rIHtcXG4gICAgY29sb3I6ICMwMDA7XFxufVxcblxcbi50YWItY29udGVudCAuY29udGVudC1kYXRhIHtcXG4gICAgZGlzcGxheTogbm9uZTtcXG4gICAgcGFkZGluZzogMjBweDtcXG4gICAgYm9yZGVyLXRvcDogbm9uZTtcXG4gICAgdHJhbnNpdGlvbjogMC4xcyBlYXNlO1xcbn1cXG5cXG4udGFiLWNvbnRlbnQgLmNvbnRlbnQtZGF0YS5hY3RpdmUge1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxuICAgIGdhcDogMXJlbTtcXG59XFxuXFxuLnRhYi1jb250ZW50IC50ZXh0LWluZm8ge1xcbiAgICBmb250LXNpemU6IDAuNzVyZW07XFxuICAgIGNvbG9yOiByZ2JhKDU1LCA1MywgNDcsIDAuNik7XFxufVxcblxcbi5uYXYtdW5kZXJsaW5lIC5uYXYtaXRlbSB7XFxuICAgIGRpc3BsYXk6IGlubGluZTtcXG59XFxuXFxuXFxuLnRhYi1jb250YWluZXIge1xcbiAgICB3aWR0aDogZml0LWNvbnRlbnQ7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYigyNDksIDI0OSwgMjQ5KTtcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcblxcbn1cXG5cXG4uZW1iZWQtY29udGVudCBpbnB1dCB7XFxuICAgIHdpZHRoOiAyMHJlbTtcXG4gICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSg1NSwgNTMsIDQ3LCAwLjE2KTtcXG4gICAgaGVpZ2h0OiAxLjVyZW07XFxuICAgIGJvcmRlci1yYWRpdXM6IDRweDtcXG4gICAgcGFkZGluZy1sZWZ0OiAxMHB4O1xcbn1cXG5cXG5cXG4udXBsb2FkLWNvbnRlbnQgbGFiZWwge1xcbiAgICBkaXNwbGF5OiBibG9jaztcXG4gICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSg1NSwgNTMsIDQ3LCAwLjE2KTtcXG4gICAgYm9yZGVyLXJhZGl1czogNHB4O1xcbiAgICB3aWR0aDogMjByZW07XFxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcXG4gICAgcGFkZGluZzogNHB4O1xcbiAgICBjb2xvcjogcmdiKDU1LCA1MywgNDcpO1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xcbiAgICAvKiB0cmFuc2l0aW9uOiAwLjFzIGVhc2U7ICovXFxufVxcblxcbi51cGxvYWQtY29udGVudCBsYWJlbDpob3ZlciB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNlZWVlZWU7XFxufVxcblxcblxcblxcblxcblxcblxcblxcblxcblxcblxcbi8qIEVzdGlsbyBwYXJhIGFzIGFsw6dhcyBkZSByZWRpbWVuc2lvbmFtZW50byAqL1xcbi5yZXNpemUtaGFuZGxlIHtcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgICB3aWR0aDogMTBweDtcXG4gICAgaGVpZ2h0OiAxMHB4O1xcbiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuNSk7XFxuICAgIGN1cnNvcjogbndzZS1yZXNpemU7XFxuICAgIC8qIEN1cnNvciBkZSByZWRpbWVuc2lvbmFtZW50byBkaWFnb25hbCAqL1xcbn1cXG5cXG4ucmVzaXplLWhhbmRsZS5zZSB7XFxuICAgIGJvdHRvbTogMDtcXG4gICAgcmlnaHQ6IDA7XFxufVxcblxcblxcblxcblxcbi5lbWJlZC1jb250YWluZXIge1xcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICAgIHdpZHRoOiAxMDAlO1xcbiAgICBwYWRkaW5nLWJvdHRvbTogNTYuMjUlO1xcbiAgICAvKiBQcm9wb3LDp8OjbyAxNjo5ICovXFxuICAgIGhlaWdodDogMDtcXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcXG59XFxuXFxuLmVtYmVkLWNvbnRhaW5lciBpZnJhbWUge1xcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgIHRvcDogMDtcXG4gICAgbGVmdDogMDtcXG4gICAgd2lkdGg6IDEwMCU7XFxuICAgIGhlaWdodDogMTAwJTtcXG59XFxuXFxuXFxuXFxuLnZpZGVvLWNvbnRhaW5lciB7XFxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gICAgd2lkdGg6IDEwMCU7XFxuICAgIHBhZGRpbmctYm90dG9tOiA1Ni4yNSU7XFxuICAgIC8qIFByb3BvcsOnw6NvIDE2OjkgKi9cXG4gICAgaGVpZ2h0OiAwO1xcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xcbn1cXG5cXG4udmlkZW8tY29udGFpbmVyIGlmcmFtZSB7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgdG9wOiAwO1xcbiAgICBsZWZ0OiAwO1xcbiAgICB3aWR0aDogMTAwJTtcXG4gICAgaGVpZ2h0OiAxMDAlO1xcbn1cXG5cXG5cXG5cXG5cXG5cXG5cXG5cXG4ucmVzaXphYmxlIHtcXG4gICAgcmVzaXplOiBob3Jpem9udGFsO1xcbiAgICBvdmVyZmxvdzogYXV0bztcXG4gICAgY3Vyc29yOiBuZXN3LXJlc2l6ZTtcXG59XFxuXFxuLmJhY2tncm91bmQge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTdlNmUzO1xcbn1cIl0sXCJzb3VyY2VSb290XCI6XCJcIn1dKTtcbi8vIEV4cG9ydHNcbmV4cG9ydCBkZWZhdWx0IF9fX0NTU19MT0FERVJfRVhQT1JUX19fO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qXG4gIE1JVCBMaWNlbnNlIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UucGhwXG4gIEF1dGhvciBUb2JpYXMgS29wcGVycyBAc29rcmFcbiovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChjc3NXaXRoTWFwcGluZ1RvU3RyaW5nKSB7XG4gIHZhciBsaXN0ID0gW107XG5cbiAgLy8gcmV0dXJuIHRoZSBsaXN0IG9mIG1vZHVsZXMgYXMgY3NzIHN0cmluZ1xuICBsaXN0LnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICB2YXIgY29udGVudCA9IFwiXCI7XG4gICAgICB2YXIgbmVlZExheWVyID0gdHlwZW9mIGl0ZW1bNV0gIT09IFwidW5kZWZpbmVkXCI7XG4gICAgICBpZiAoaXRlbVs0XSkge1xuICAgICAgICBjb250ZW50ICs9IFwiQHN1cHBvcnRzIChcIi5jb25jYXQoaXRlbVs0XSwgXCIpIHtcIik7XG4gICAgICB9XG4gICAgICBpZiAoaXRlbVsyXSkge1xuICAgICAgICBjb250ZW50ICs9IFwiQG1lZGlhIFwiLmNvbmNhdChpdGVtWzJdLCBcIiB7XCIpO1xuICAgICAgfVxuICAgICAgaWYgKG5lZWRMYXllcikge1xuICAgICAgICBjb250ZW50ICs9IFwiQGxheWVyXCIuY29uY2F0KGl0ZW1bNV0ubGVuZ3RoID4gMCA/IFwiIFwiLmNvbmNhdChpdGVtWzVdKSA6IFwiXCIsIFwiIHtcIik7XG4gICAgICB9XG4gICAgICBjb250ZW50ICs9IGNzc1dpdGhNYXBwaW5nVG9TdHJpbmcoaXRlbSk7XG4gICAgICBpZiAobmVlZExheWVyKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJ9XCI7XG4gICAgICB9XG4gICAgICBpZiAoaXRlbVsyXSkge1xuICAgICAgICBjb250ZW50ICs9IFwifVwiO1xuICAgICAgfVxuICAgICAgaWYgKGl0ZW1bNF0pIHtcbiAgICAgICAgY29udGVudCArPSBcIn1cIjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjb250ZW50O1xuICAgIH0pLmpvaW4oXCJcIik7XG4gIH07XG5cbiAgLy8gaW1wb3J0IGEgbGlzdCBvZiBtb2R1bGVzIGludG8gdGhlIGxpc3RcbiAgbGlzdC5pID0gZnVuY3Rpb24gaShtb2R1bGVzLCBtZWRpYSwgZGVkdXBlLCBzdXBwb3J0cywgbGF5ZXIpIHtcbiAgICBpZiAodHlwZW9mIG1vZHVsZXMgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIG1vZHVsZXMgPSBbW251bGwsIG1vZHVsZXMsIHVuZGVmaW5lZF1dO1xuICAgIH1cbiAgICB2YXIgYWxyZWFkeUltcG9ydGVkTW9kdWxlcyA9IHt9O1xuICAgIGlmIChkZWR1cGUpIHtcbiAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgdGhpcy5sZW5ndGg7IGsrKykge1xuICAgICAgICB2YXIgaWQgPSB0aGlzW2tdWzBdO1xuICAgICAgICBpZiAoaWQgIT0gbnVsbCkge1xuICAgICAgICAgIGFscmVhZHlJbXBvcnRlZE1vZHVsZXNbaWRdID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKHZhciBfayA9IDA7IF9rIDwgbW9kdWxlcy5sZW5ndGg7IF9rKyspIHtcbiAgICAgIHZhciBpdGVtID0gW10uY29uY2F0KG1vZHVsZXNbX2tdKTtcbiAgICAgIGlmIChkZWR1cGUgJiYgYWxyZWFkeUltcG9ydGVkTW9kdWxlc1tpdGVtWzBdXSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgbGF5ZXIgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBpdGVtWzVdID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgaXRlbVs1XSA9IGxheWVyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGl0ZW1bMV0gPSBcIkBsYXllclwiLmNvbmNhdChpdGVtWzVdLmxlbmd0aCA+IDAgPyBcIiBcIi5jb25jYXQoaXRlbVs1XSkgOiBcIlwiLCBcIiB7XCIpLmNvbmNhdChpdGVtWzFdLCBcIn1cIik7XG4gICAgICAgICAgaXRlbVs1XSA9IGxheWVyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAobWVkaWEpIHtcbiAgICAgICAgaWYgKCFpdGVtWzJdKSB7XG4gICAgICAgICAgaXRlbVsyXSA9IG1lZGlhO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGl0ZW1bMV0gPSBcIkBtZWRpYSBcIi5jb25jYXQoaXRlbVsyXSwgXCIge1wiKS5jb25jYXQoaXRlbVsxXSwgXCJ9XCIpO1xuICAgICAgICAgIGl0ZW1bMl0gPSBtZWRpYTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHN1cHBvcnRzKSB7XG4gICAgICAgIGlmICghaXRlbVs0XSkge1xuICAgICAgICAgIGl0ZW1bNF0gPSBcIlwiLmNvbmNhdChzdXBwb3J0cyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaXRlbVsxXSA9IFwiQHN1cHBvcnRzIChcIi5jb25jYXQoaXRlbVs0XSwgXCIpIHtcIikuY29uY2F0KGl0ZW1bMV0sIFwifVwiKTtcbiAgICAgICAgICBpdGVtWzRdID0gc3VwcG9ydHM7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGxpc3QucHVzaChpdGVtKTtcbiAgICB9XG4gIH07XG4gIHJldHVybiBsaXN0O1xufTsiLCJcInVzZSBzdHJpY3RcIjtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXRlbSkge1xuICB2YXIgY29udGVudCA9IGl0ZW1bMV07XG4gIHZhciBjc3NNYXBwaW5nID0gaXRlbVszXTtcbiAgaWYgKCFjc3NNYXBwaW5nKSB7XG4gICAgcmV0dXJuIGNvbnRlbnQ7XG4gIH1cbiAgaWYgKHR5cGVvZiBidG9hID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICB2YXIgYmFzZTY0ID0gYnRvYSh1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoY3NzTWFwcGluZykpKSk7XG4gICAgdmFyIGRhdGEgPSBcInNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LFwiLmNvbmNhdChiYXNlNjQpO1xuICAgIHZhciBzb3VyY2VNYXBwaW5nID0gXCIvKiMgXCIuY29uY2F0KGRhdGEsIFwiICovXCIpO1xuICAgIHJldHVybiBbY29udGVudF0uY29uY2F0KFtzb3VyY2VNYXBwaW5nXSkuam9pbihcIlxcblwiKTtcbiAgfVxuICByZXR1cm4gW2NvbnRlbnRdLmpvaW4oXCJcXG5cIik7XG59OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgc3R5bGVzSW5ET00gPSBbXTtcbmZ1bmN0aW9uIGdldEluZGV4QnlJZGVudGlmaWVyKGlkZW50aWZpZXIpIHtcbiAgdmFyIHJlc3VsdCA9IC0xO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0eWxlc0luRE9NLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKHN0eWxlc0luRE9NW2ldLmlkZW50aWZpZXIgPT09IGlkZW50aWZpZXIpIHtcbiAgICAgIHJlc3VsdCA9IGk7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIG1vZHVsZXNUb0RvbShsaXN0LCBvcHRpb25zKSB7XG4gIHZhciBpZENvdW50TWFwID0ge307XG4gIHZhciBpZGVudGlmaWVycyA9IFtdO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgaXRlbSA9IGxpc3RbaV07XG4gICAgdmFyIGlkID0gb3B0aW9ucy5iYXNlID8gaXRlbVswXSArIG9wdGlvbnMuYmFzZSA6IGl0ZW1bMF07XG4gICAgdmFyIGNvdW50ID0gaWRDb3VudE1hcFtpZF0gfHwgMDtcbiAgICB2YXIgaWRlbnRpZmllciA9IFwiXCIuY29uY2F0KGlkLCBcIiBcIikuY29uY2F0KGNvdW50KTtcbiAgICBpZENvdW50TWFwW2lkXSA9IGNvdW50ICsgMTtcbiAgICB2YXIgaW5kZXhCeUlkZW50aWZpZXIgPSBnZXRJbmRleEJ5SWRlbnRpZmllcihpZGVudGlmaWVyKTtcbiAgICB2YXIgb2JqID0ge1xuICAgICAgY3NzOiBpdGVtWzFdLFxuICAgICAgbWVkaWE6IGl0ZW1bMl0sXG4gICAgICBzb3VyY2VNYXA6IGl0ZW1bM10sXG4gICAgICBzdXBwb3J0czogaXRlbVs0XSxcbiAgICAgIGxheWVyOiBpdGVtWzVdXG4gICAgfTtcbiAgICBpZiAoaW5kZXhCeUlkZW50aWZpZXIgIT09IC0xKSB7XG4gICAgICBzdHlsZXNJbkRPTVtpbmRleEJ5SWRlbnRpZmllcl0ucmVmZXJlbmNlcysrO1xuICAgICAgc3R5bGVzSW5ET01baW5kZXhCeUlkZW50aWZpZXJdLnVwZGF0ZXIob2JqKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHVwZGF0ZXIgPSBhZGRFbGVtZW50U3R5bGUob2JqLCBvcHRpb25zKTtcbiAgICAgIG9wdGlvbnMuYnlJbmRleCA9IGk7XG4gICAgICBzdHlsZXNJbkRPTS5zcGxpY2UoaSwgMCwge1xuICAgICAgICBpZGVudGlmaWVyOiBpZGVudGlmaWVyLFxuICAgICAgICB1cGRhdGVyOiB1cGRhdGVyLFxuICAgICAgICByZWZlcmVuY2VzOiAxXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWRlbnRpZmllcnMucHVzaChpZGVudGlmaWVyKTtcbiAgfVxuICByZXR1cm4gaWRlbnRpZmllcnM7XG59XG5mdW5jdGlvbiBhZGRFbGVtZW50U3R5bGUob2JqLCBvcHRpb25zKSB7XG4gIHZhciBhcGkgPSBvcHRpb25zLmRvbUFQSShvcHRpb25zKTtcbiAgYXBpLnVwZGF0ZShvYmopO1xuICB2YXIgdXBkYXRlciA9IGZ1bmN0aW9uIHVwZGF0ZXIobmV3T2JqKSB7XG4gICAgaWYgKG5ld09iaikge1xuICAgICAgaWYgKG5ld09iai5jc3MgPT09IG9iai5jc3MgJiYgbmV3T2JqLm1lZGlhID09PSBvYmoubWVkaWEgJiYgbmV3T2JqLnNvdXJjZU1hcCA9PT0gb2JqLnNvdXJjZU1hcCAmJiBuZXdPYmouc3VwcG9ydHMgPT09IG9iai5zdXBwb3J0cyAmJiBuZXdPYmoubGF5ZXIgPT09IG9iai5sYXllcikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBhcGkudXBkYXRlKG9iaiA9IG5ld09iaik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFwaS5yZW1vdmUoKTtcbiAgICB9XG4gIH07XG4gIHJldHVybiB1cGRhdGVyO1xufVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAobGlzdCwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgbGlzdCA9IGxpc3QgfHwgW107XG4gIHZhciBsYXN0SWRlbnRpZmllcnMgPSBtb2R1bGVzVG9Eb20obGlzdCwgb3B0aW9ucyk7XG4gIHJldHVybiBmdW5jdGlvbiB1cGRhdGUobmV3TGlzdCkge1xuICAgIG5ld0xpc3QgPSBuZXdMaXN0IHx8IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGFzdElkZW50aWZpZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaWRlbnRpZmllciA9IGxhc3RJZGVudGlmaWVyc1tpXTtcbiAgICAgIHZhciBpbmRleCA9IGdldEluZGV4QnlJZGVudGlmaWVyKGlkZW50aWZpZXIpO1xuICAgICAgc3R5bGVzSW5ET01baW5kZXhdLnJlZmVyZW5jZXMtLTtcbiAgICB9XG4gICAgdmFyIG5ld0xhc3RJZGVudGlmaWVycyA9IG1vZHVsZXNUb0RvbShuZXdMaXN0LCBvcHRpb25zKTtcbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgbGFzdElkZW50aWZpZXJzLmxlbmd0aDsgX2krKykge1xuICAgICAgdmFyIF9pZGVudGlmaWVyID0gbGFzdElkZW50aWZpZXJzW19pXTtcbiAgICAgIHZhciBfaW5kZXggPSBnZXRJbmRleEJ5SWRlbnRpZmllcihfaWRlbnRpZmllcik7XG4gICAgICBpZiAoc3R5bGVzSW5ET01bX2luZGV4XS5yZWZlcmVuY2VzID09PSAwKSB7XG4gICAgICAgIHN0eWxlc0luRE9NW19pbmRleF0udXBkYXRlcigpO1xuICAgICAgICBzdHlsZXNJbkRPTS5zcGxpY2UoX2luZGV4LCAxKTtcbiAgICAgIH1cbiAgICB9XG4gICAgbGFzdElkZW50aWZpZXJzID0gbmV3TGFzdElkZW50aWZpZXJzO1xuICB9O1xufTsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIG1lbW8gPSB7fTtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBnZXRUYXJnZXQodGFyZ2V0KSB7XG4gIGlmICh0eXBlb2YgbWVtb1t0YXJnZXRdID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgdmFyIHN0eWxlVGFyZ2V0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0YXJnZXQpO1xuXG4gICAgLy8gU3BlY2lhbCBjYXNlIHRvIHJldHVybiBoZWFkIG9mIGlmcmFtZSBpbnN0ZWFkIG9mIGlmcmFtZSBpdHNlbGZcbiAgICBpZiAod2luZG93LkhUTUxJRnJhbWVFbGVtZW50ICYmIHN0eWxlVGFyZ2V0IGluc3RhbmNlb2Ygd2luZG93LkhUTUxJRnJhbWVFbGVtZW50KSB7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBUaGlzIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIGFjY2VzcyB0byBpZnJhbWUgaXMgYmxvY2tlZFxuICAgICAgICAvLyBkdWUgdG8gY3Jvc3Mtb3JpZ2luIHJlc3RyaWN0aW9uc1xuICAgICAgICBzdHlsZVRhcmdldCA9IHN0eWxlVGFyZ2V0LmNvbnRlbnREb2N1bWVudC5oZWFkO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBpc3RhbmJ1bCBpZ25vcmUgbmV4dFxuICAgICAgICBzdHlsZVRhcmdldCA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgIG1lbW9bdGFyZ2V0XSA9IHN0eWxlVGFyZ2V0O1xuICB9XG4gIHJldHVybiBtZW1vW3RhcmdldF07XG59XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gaW5zZXJ0QnlTZWxlY3RvcihpbnNlcnQsIHN0eWxlKSB7XG4gIHZhciB0YXJnZXQgPSBnZXRUYXJnZXQoaW5zZXJ0KTtcbiAgaWYgKCF0YXJnZXQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZG4ndCBmaW5kIGEgc3R5bGUgdGFyZ2V0LiBUaGlzIHByb2JhYmx5IG1lYW5zIHRoYXQgdGhlIHZhbHVlIGZvciB0aGUgJ2luc2VydCcgcGFyYW1ldGVyIGlzIGludmFsaWQuXCIpO1xuICB9XG4gIHRhcmdldC5hcHBlbmRDaGlsZChzdHlsZSk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IGluc2VydEJ5U2VsZWN0b3I7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gaW5zZXJ0U3R5bGVFbGVtZW50KG9wdGlvbnMpIHtcbiAgdmFyIGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3R5bGVcIik7XG4gIG9wdGlvbnMuc2V0QXR0cmlidXRlcyhlbGVtZW50LCBvcHRpb25zLmF0dHJpYnV0ZXMpO1xuICBvcHRpb25zLmluc2VydChlbGVtZW50LCBvcHRpb25zLm9wdGlvbnMpO1xuICByZXR1cm4gZWxlbWVudDtcbn1cbm1vZHVsZS5leHBvcnRzID0gaW5zZXJ0U3R5bGVFbGVtZW50OyIsIlwidXNlIHN0cmljdFwiO1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIHNldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlcyhzdHlsZUVsZW1lbnQpIHtcbiAgdmFyIG5vbmNlID0gdHlwZW9mIF9fd2VicGFja19ub25jZV9fICE9PSBcInVuZGVmaW5lZFwiID8gX193ZWJwYWNrX25vbmNlX18gOiBudWxsO1xuICBpZiAobm9uY2UpIHtcbiAgICBzdHlsZUVsZW1lbnQuc2V0QXR0cmlidXRlKFwibm9uY2VcIiwgbm9uY2UpO1xuICB9XG59XG5tb2R1bGUuZXhwb3J0cyA9IHNldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlczsiLCJcInVzZSBzdHJpY3RcIjtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBhcHBseShzdHlsZUVsZW1lbnQsIG9wdGlvbnMsIG9iaikge1xuICB2YXIgY3NzID0gXCJcIjtcbiAgaWYgKG9iai5zdXBwb3J0cykge1xuICAgIGNzcyArPSBcIkBzdXBwb3J0cyAoXCIuY29uY2F0KG9iai5zdXBwb3J0cywgXCIpIHtcIik7XG4gIH1cbiAgaWYgKG9iai5tZWRpYSkge1xuICAgIGNzcyArPSBcIkBtZWRpYSBcIi5jb25jYXQob2JqLm1lZGlhLCBcIiB7XCIpO1xuICB9XG4gIHZhciBuZWVkTGF5ZXIgPSB0eXBlb2Ygb2JqLmxheWVyICE9PSBcInVuZGVmaW5lZFwiO1xuICBpZiAobmVlZExheWVyKSB7XG4gICAgY3NzICs9IFwiQGxheWVyXCIuY29uY2F0KG9iai5sYXllci5sZW5ndGggPiAwID8gXCIgXCIuY29uY2F0KG9iai5sYXllcikgOiBcIlwiLCBcIiB7XCIpO1xuICB9XG4gIGNzcyArPSBvYmouY3NzO1xuICBpZiAobmVlZExheWVyKSB7XG4gICAgY3NzICs9IFwifVwiO1xuICB9XG4gIGlmIChvYmoubWVkaWEpIHtcbiAgICBjc3MgKz0gXCJ9XCI7XG4gIH1cbiAgaWYgKG9iai5zdXBwb3J0cykge1xuICAgIGNzcyArPSBcIn1cIjtcbiAgfVxuICB2YXIgc291cmNlTWFwID0gb2JqLnNvdXJjZU1hcDtcbiAgaWYgKHNvdXJjZU1hcCAmJiB0eXBlb2YgYnRvYSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgIGNzcyArPSBcIlxcbi8qIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtiYXNlNjQsXCIuY29uY2F0KGJ0b2EodW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KHNvdXJjZU1hcCkpKSksIFwiICovXCIpO1xuICB9XG5cbiAgLy8gRm9yIG9sZCBJRVxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgICovXG4gIG9wdGlvbnMuc3R5bGVUYWdUcmFuc2Zvcm0oY3NzLCBzdHlsZUVsZW1lbnQsIG9wdGlvbnMub3B0aW9ucyk7XG59XG5mdW5jdGlvbiByZW1vdmVTdHlsZUVsZW1lbnQoc3R5bGVFbGVtZW50KSB7XG4gIC8vIGlzdGFuYnVsIGlnbm9yZSBpZlxuICBpZiAoc3R5bGVFbGVtZW50LnBhcmVudE5vZGUgPT09IG51bGwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgc3R5bGVFbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoc3R5bGVFbGVtZW50KTtcbn1cblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBkb21BUEkob3B0aW9ucykge1xuICBpZiAodHlwZW9mIGRvY3VtZW50ID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHVwZGF0ZTogZnVuY3Rpb24gdXBkYXRlKCkge30sXG4gICAgICByZW1vdmU6IGZ1bmN0aW9uIHJlbW92ZSgpIHt9XG4gICAgfTtcbiAgfVxuICB2YXIgc3R5bGVFbGVtZW50ID0gb3B0aW9ucy5pbnNlcnRTdHlsZUVsZW1lbnQob3B0aW9ucyk7XG4gIHJldHVybiB7XG4gICAgdXBkYXRlOiBmdW5jdGlvbiB1cGRhdGUob2JqKSB7XG4gICAgICBhcHBseShzdHlsZUVsZW1lbnQsIG9wdGlvbnMsIG9iaik7XG4gICAgfSxcbiAgICByZW1vdmU6IGZ1bmN0aW9uIHJlbW92ZSgpIHtcbiAgICAgIHJlbW92ZVN0eWxlRWxlbWVudChzdHlsZUVsZW1lbnQpO1xuICAgIH1cbiAgfTtcbn1cbm1vZHVsZS5leHBvcnRzID0gZG9tQVBJOyIsIlwidXNlIHN0cmljdFwiO1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIHN0eWxlVGFnVHJhbnNmb3JtKGNzcywgc3R5bGVFbGVtZW50KSB7XG4gIGlmIChzdHlsZUVsZW1lbnQuc3R5bGVTaGVldCkge1xuICAgIHN0eWxlRWxlbWVudC5zdHlsZVNoZWV0LmNzc1RleHQgPSBjc3M7XG4gIH0gZWxzZSB7XG4gICAgd2hpbGUgKHN0eWxlRWxlbWVudC5maXJzdENoaWxkKSB7XG4gICAgICBzdHlsZUVsZW1lbnQucmVtb3ZlQ2hpbGQoc3R5bGVFbGVtZW50LmZpcnN0Q2hpbGQpO1xuICAgIH1cbiAgICBzdHlsZUVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY3NzKSk7XG4gIH1cbn1cbm1vZHVsZS5leHBvcnRzID0gc3R5bGVUYWdUcmFuc2Zvcm07IiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHRpZDogbW9kdWxlSWQsXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXShtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIi8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSAobW9kdWxlKSA9PiB7XG5cdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuXHRcdCgpID0+IChtb2R1bGVbJ2RlZmF1bHQnXSkgOlxuXHRcdCgpID0+IChtb2R1bGUpO1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCB7IGE6IGdldHRlciB9KTtcblx0cmV0dXJuIGdldHRlcjtcbn07IiwiLy8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5kID0gKGV4cG9ydHMsIGRlZmluaXRpb24pID0+IHtcblx0Zm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkge1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcblx0XHR9XG5cdH1cbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gKG9iaiwgcHJvcCkgPT4gKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApKSIsIl9fd2VicGFja19yZXF1aXJlX18ubmMgPSB1bmRlZmluZWQ7IiwiZXhwb3J0IGVudW0gQ29udGVudFR5cGVzIHtcclxuICAgIFBhcmFncmFwaCA9IFwicFwiLFxyXG4gICAgSGVhZGluZ18xID0gXCJoMVwiLFxyXG4gICAgSGVhZGluZ18yID0gXCJoMlwiLFxyXG4gICAgSGVhZGluZ18zID0gXCJoM1wiLFxyXG4gICAgSGVhZGluZ180ID0gXCJoNFwiLFxyXG4gICAgSGVhZGluZ181ID0gXCJoNVwiLFxyXG4gICAgSGVhZGluZ182ID0gXCJoNlwiLFxyXG4gICAgQ2hlY2tMaXN0ID0gXCJjaGVja0xpc3RcIixcclxuICAgIEJ1bGxldGVkTGlzdCA9IFwiYnVsbGV0ZWRMaXN0XCIsXHJcbiAgICBOdW1iZXJlZExpc3QgPSBcIm51bWJlcmVkTGlzdFwiLFxyXG4gICAgTGlzdCA9IFwibGlzdFwiLFxyXG4gICAgVGFibGUgPSBcInRhYmxlXCIsXHJcbiAgICBJbWFnZSA9IFwiaW1hZ2VcIlxyXG59IiwiZXhwb3J0IGVudW0gSWNvbnMge1xyXG4gICAgTGluayA9IFwiaWNvbi1tYXRlcmlhbC1saW5rXCIsXHJcbiAgICBCb2xkID0gXCJpY29uLXdvcmRwcmVzcy1ib2xkXCIsXHJcbiAgICBJdGFsaWMgPSBcImljb24tbWF0ZXJpYWwtaXRhbGljXCIsXHJcbiAgICBVbmRlcmxpbmUgPSBcImljb24tbWF0ZXJpYWwtdW5kZXJsaW5lXCIsXHJcbiAgICBJbmxpbmVDb2RlID0gXCJpY29uLW1hdGVyaWFsLWNvZGUtaW5saW5lXCIsXHJcbiAgICBTdHJpa2VUaHJvdWdoID0gXCJpY29uLXdvcmRwcmVzcy1zdHJpa2UtdGhyb3VnaFwiLFxyXG4gICAgUGx1cyA9IFwiaWNvbi1wbHVzXCIsXHJcbiAgICBDb2x1bW5SaWdodCA9IFwiaWNvbi1tYXRlcmlhbC1jb2x1bW4tcmlnaHRcIixcclxuICAgIENvbHVtbkxlZnQgPSBcImljb24tbWF0ZXJpYWwtY29sdW1uLWxlZnRcIixcclxuICAgIFJvd0Fib3ZlID0gXCJpY29uLW1hdGVyaWFsLXJvdy1hYm92ZVwiLFxyXG4gICAgUm93QmVsb3cgPSBcImljb24tbWF0ZXJpYWwtcm93LWJlbG93XCIsXHJcbiAgICBkZWxldGVTd2VlcCA9IFwiaWNvbi1tYXRlcmlhbC1kZWxldGUtc3dlZXBcIixcclxuICAgIFRyYXNoID0gXCJpY29uLW1hdGVyaWFsLXRyYXNoXCIsXHJcbiAgICBDbG9zZUNpcmNsZSA9IFwiaWNvbi1pb25pYy1jbG9zZS1jaXJjbGVcIixcclxuICAgIEVtcHR5ID0gXCJFbXB0eVwiLFxyXG4gICAgQ2FsbG91dCA9IFwiaWNvbi1tYXRlcmlhbC1jYWxsb3V0XCIsXHJcbiAgICBJbWFnZSA9IFwiaWNvbi1tYXRlcmlhbC1pbWFnZVwiLFxyXG4gICAgVmlkZW8gPSBcImljb24tbWF0ZXJpYWwtdmlkZW9cIlxyXG59IiwiZXhwb3J0IGVudW0gQ3VzdG9tRXZlbnRzIHtcclxuICAgIC8vQ29tcG9uZW50IGV2ZW50c1xyXG4gICAgZmxvYXRpbmdUb29sYmFyRGlzcGxheWVkID0gXCJmbG9hdGluZ1Rvb2xiYXJEaXNwbGF5ZWRcIixcclxuXHJcbiAgICAvL1RleHQgY2xpY2sgZWRpdCBldmVudHNcclxuICAgIGFuY2hvckJ1dHRvbkNsaWNrZWQgPSBcImFuY2hvckJ1dHRvbkNsaWNrZWRcIixcclxuICAgIGJvbGRCdXR0b25DbGlja2VkID0gXCJib2xkQnV0dG9uQ2xpY2tlZFwiLFxyXG4gICAgaXRhbGljQnV0dG9uQ2xpY2tlZCA9IFwiaXRhbGljQnV0dG9uQ2xpY2tlZFwiLFxyXG4gICAgdW5kZXJsaW5lQnV0dG9uQ2xpY2tlZCA9IFwidW5kZXJsaW5lQnV0dG9uQ2xpY2tlZFwiLFxyXG4gICAgaW5saW5lQ29kZUJ1dHRvbkNsaWNrZWQgPSBcImlubGluZUNvZGVCdXR0b25DbGlja2VkXCIsXHJcbiAgICBzdHJpa2VUaHJvdWdoQnV0dG9uQ2xpY2tlZCA9IFwic3RyaWtlVGhyb3VnaEJ1dHRvbkNsaWNrZWRcIixcclxuICAgIGhpbGl0ZUNvbG9yQnV0dG9uQ2xpY2tlZCA9IFwiaGlsaXRlQ29sb3JCdXR0b25DbGlja2VkXCIsXHJcbiAgICBmb3JlQ29sb3JCdXR0b25DbGlja2VkID0gXCJmb3JlQ29sb3JCdXR0b25DbGlja2VkXCIsXHJcbiAgICBcclxuICAgIGJ1dHRvbkdyb3VwSXRlbUNsaWNrZWQgPSBcImJ1dHRvbkdyb3VwSXRlbUNsaWNrZWRcIixcclxuICAgIGZvY3VzT25GaXJzdFJlcXVlc3RlZCA9IFwiZm9jdXNPbkZpcnN0UmVxdWVzdGVkXCIsXHJcbiAgICBcclxuICAgIHRyYW5zZm9ybUJsb2NrUmVxdWVzdGVkID0gXCJ0cmFuc2Zvcm1CbG9ja1JlcXVlc3RlZFwiLFxyXG4gICAgZHVwbGljYXRlQmxvY2tSZXF1ZXN0ZWQgPSBcImR1cGxpY2F0ZUJsb2NrUmVxdWVzdGVkXCIsXHJcblxyXG4gICAgLy9UZXh0IGVkaXQgZXZlbnRzXHJcbiAgICBhbmNob3IgPSBcImFuY2hvclwiLFxyXG4gICAgYm9sZCA9IFwiYm9sZFwiLFxyXG4gICAgaXRhbGljID0gXCJpdGFsaWNcIixcclxuICAgIHVuZGVybGluZSA9IFwidW5kZXJsaW5lXCIsXHJcbiAgICBpbmxpbmVDb2RlID0gXCJpbmxpbmVDb2RlXCIsXHJcbiAgICBzdHJpa2VUaHJvdWdoID0gXCJzdHJpa2VUaHJvdWdoXCIsXHJcbiAgICBoaWxpdGVDb2xvciA9IFwiaGlsaXRlQ29sb3JcIixcclxuICAgIGZvcmVDb2xvciA9IFwiZm9yZUNvbG9yXCIsXHJcblxyXG5cclxuICAgIHRleHRGb3JtYXRDaGFuZ2VkID0gXCJ0ZXh0Rm9ybWF0Q2hhbmdlZFwiLFxyXG4gICAgZW1pdHRlZENvbW1hbmQgPSBcImVtaXR0ZWRDb21tYW5kXCIsXHJcbiAgICBibG9ja1R5cGVDaGFuZ2VkID0gXCJibG9ja1R5cGVDaGFuZ2VkXCIsXHJcbiAgICBibG9ja0RlbGV0ZWQgPSBcImJsb2NrRGVsZXRlZFwiLFxyXG4gICAgdGFibGVDZWxsQ2hhbmdlZCA9IFwidGFibGVDZWxsQ2hhbmdlZFwiLFxyXG5cclxuXHJcblxyXG4gICAgLy9CbG9jayBjb21tYW5kc1xyXG4gICAgXHJcbn0iLCJleHBvcnQgZW51bSBDb2xvcnMge1xyXG5cclxuICAgIEhpbGl0ZUNvbG9yUmVkID0gXCIjRkRERURFXCIsXHJcbiAgICBIaWxpdGVDb2xvckdyZWVuID0gXCIjRDdGN0RDXCIsXHJcbiAgICBIaWxpdGVDb2xvckJsdWUgPSBcIiNEOUVERjZcIixcclxuICAgIEhpbGl0ZUNvbG9yWWVsbG93ID0gXCIjRkFGNEQxXCIsXHJcbiAgICBIaWxpdGVDb2xvckdyZXkgPSBcIiNFMUUwRTBcIixcclxuICAgIEhpbGl0ZUNvbG9yTm9uZSA9IFwidHJhbnNwYXJlbnRcIixcclxuXHJcbiAgICBGb3JlQ29sb3JSZWQgPSBcIiNENDRDNDdcIixcclxuICAgIEZvcmVDb2xvckdyZWVuID0gXCIjNDQ4MzYxXCIsXHJcbiAgICBGb3JlQ29sb3JCbHVlID0gXCIjMzM3RUE5XCIsXHJcbiAgICBGb3JlQ29sb3JZZWxsb3cgPSBcIiNDQjkxMkZcIixcclxuICAgIEZvcmVDb2xvckdyZXkgPSBcIiM3ODc3NzRcIixcclxuICAgIEZvcmVDb2xvckluaXRpYWwgPSBcImluaXRpYWxcIixcclxuXHJcbiAgICBCYWNrZ3JvdW5kQ29sb3JSZWQgPSBcIiNGRERFREVcIixcclxuICAgIEJhY2tncm91bmRDb2xvckdyZWVuID0gXCIjRDdGN0RDXCIsXHJcbiAgICBCYWNrZ3JvdW5kQ29sb3JCbHVlID0gXCIjRDlFREY2XCIsXHJcbiAgICBCYWNrZ3JvdW5kQ29sb3JZZWxsb3cgPSBcIiNGQUY0RDFcIixcclxuICAgIEJhY2tncm91bmRDb2xvckdyZXkgPSBcIiNFMUUwRTBcIixcclxuICAgIEJhY2tncm91bmRDb2xvck5vbmUgPSBcInRyYW5zcGFyZW50XCIsXHJcblxyXG4gICAgSWNvbkFjdGl2ZUJsdWUgPSBcIiMyMzgyZTJcIixcclxuICAgIEljb25EZWZhdWx0QmxhY2sgPSBcInJnYmEoNTUsIDUzLCA0NywgMC44NSlcIixcclxuICAgIFJlZCA9IFwicmVkXCIsXHJcbiAgICBUb21hdG8gPSBcIiNFQjU3NTdcIixcclxuICAgIE9yaWdpbmFsVGFibGVDb2xvciA9IFwiIzg0ODg4ZFwiXHJcblxyXG59IiwiZXhwb3J0IGVudW0gQ29tbWFuZHMge1xyXG4gICAgLyoqIFRleHQgb3BlcmF0aW9ucyBjb21tYW5kcyAqL1xyXG4gICAgdG9nZ2xlQm9sZCA9IFwiYm9sZFwiLFxyXG4gICAgdG9nZ2xlSXRhbGljID0gXCJpdGFsaWNcIixcclxuICAgIHRvZ2dsZUhpbGl0ZUNvbG9yID0gXCJoaWxpdGVDb2xvclwiLFxyXG4gICAgdG9nZ2xlRm9yZUNvbG9yID0gXCJmb3JlQ29sb3JcIixcclxuICAgIHRvZ2dsZUlubGluZUNvZGUgPSBcImlubGluZUNvZGVcIixcclxuICAgIHRvZ2dsZUxpbmsgPSBcImNyZWF0ZUxpbmtcIixcclxuICAgIHRvZ2dsZVVuZGVybGluZSA9IFwidW5kZXJsaW5lXCIsXHJcbiAgICB0b2dnbGVTdHJpa2VUaHJvdWdoID0gXCJzdHJpa2VUaHJvdWdoXCIsXHJcbiAgICByZW1vdmVGb3JtYXQgPSBcInJlbW92ZUZvcm1hdFwiLFxyXG5cclxuICAgIC8qKiBCbG9jayBvcGVyYXRpb25zIGNvbW1hbmRzICovXHJcbiAgICB0cmFuc2Zvcm1CbG9jayA9IFwidHJhbnNmb3JtQmxvY2tcIixcclxuICAgIGR1cGxpY2F0ZUJsb2NrID0gXCJkdXBsaWNhdGVCbG9ja1wiLFxyXG4gICAgZGVsZXRlQmxvY2sgPSBcImRlbGV0ZUJsb2NrXCIsXHJcbiAgICBjcmVhdGVEZWZhdWx0QmxvY2sgPSBcImNyZWF0ZURlZmF1bHRCbG9ja1wiLFxyXG4gICAgZm9jdXNPblByZXZpb3VzQmxvY2sgPSBcImZvY3VzT25QcmV2aW91c0Jsb2NrXCIsXHJcbiAgICBcclxuICAgIC8qKiB3aWxkY2FyZCBjb21tYW5kIGNvbnRleHQgYmFzZWQqL1xyXG4gICAgaW5zZXJ0TmV3ID0gXCJpbnNlcnROZXdcIixcclxuXHJcbiAgICAvKiogdGFibGUgY29tbWFuZHMgKi9cclxuICAgIGluc2VydFRhYmxlUm93QWJvdmUgPSBcImluc2VydFRhYmxlUm93QWJvdmVcIixcclxuICAgIGluc2VydFRhYmxlUm93QmVsb3cgPSBcImluc2VydFRhYmxlUm93QmVsb3dcIixcclxuICAgIGluc2VydFRhYmxlQ29sdW1uTGVmdCA9IFwiaW5zZXJ0VGFibGVDb2x1bW5MZWZ0XCIsXHJcbiAgICBpbnNlcnRUYWJsZUNvbHVtblJpZ2h0ID0gXCJpbnNlcnRUYWJsZUNvbHVtblJpZ2h0XCIsXHJcbiAgICBzaG93SW5zZXJ0VGFibGVDb2x1bW5FbGVtZW50ID0gXCJzaG93SW5zZXJ0VGFibGVDb2x1bW5FbGVtZW50XCIsXHJcbiAgICBzaG93SW5zZXJ0VGFibGVSb3dFbGVtZW50ID0gXCJzaG93SW5zZXJ0VGFibGVSb3dFbGVtZW50XCIsXHJcbiAgICBoaWRlSW5zZXJ0VGFibGVDb2x1bW5FbGVtZW50ID0gXCJoaWRlSW5zZXJ0VGFibGVDb2x1bW5FbGVtZW50XCIsXHJcbiAgICBoaWRlSW5zZXJ0VGFibGVSb3dFbGVtZW50ID0gXCJoaWRlSW5zZXJ0VGFibGVSb3dFbGVtZW50XCIsXHJcbiAgICB0b2dnbGVDZWxsSGlsaXRlQ29sb3IgPSBcInRvZ2dsZUNlbGxIaWxpdGVDb2xvclwiLFxyXG4gICAgcmVtb3ZlQ29sdW1uID0gXCJyZW1vdmVDb2x1bW5cIixcclxuICAgIHJlbW92ZVJvdyA9IFwicmVtb3ZlUm93XCIsXHJcbiAgICBjaGFuZ2VUYWJsZUJvcmRlckNvbG9yID0gXCJjaGFuZ2VUYWJsZUJvcmRlckNvbG9yXCJcclxufSIsImV4cG9ydCBlbnVtIEN1c3RvbVVJRXZlbnRzIHtcclxuICAgIFxyXG4gICAgQ29sb3JDaGFuZ2VSZXF1ZXN0ID0gXCJDb2xvckNoYW5nZVJlcXVlc3RcIixcclxuICAgIFNob3dIaWRlQWN0aXZlQnV0dG9uID0gXCJTaG93SGlkZUFjdGl2ZUJ1dHRvblwiLFxyXG4gICAgUmVzZXRBY3RpdmVCdXR0b25zID0gXCJSZXNldEFjdGl2ZUJ1dHRvbnNcIixcclxuICAgIENsb3NlRWxlbWVudCA9IFwiSGlkZUNvbXBvbmVudFwiLFxyXG4gICAgU2hvd0VsZW1lbnQgPSBcIlNob3dFbGVtZW50XCJcclxuICAgIFxyXG59IiwiZXhwb3J0IGVudW0gQnV0dG9uSURzIHtcclxuICAgIExpbmsgPSBcImxpbmtCdXR0b25cIixcclxuICAgIEJvbGQgPSBcImJvbGRCdXR0b25cIixcclxuICAgIEl0YWxpYyA9IFwiaXRhbGljQnV0dG9uXCIsXHJcbiAgICBVbmRlcmxpbmUgPSBcInVuZGVybGluZUJ1dHRvblwiLFxyXG4gICAgSW5saW5lQ29kZSA9IFwiaW5saW5lQ29kZUJ1dHRvblwiLFxyXG4gICAgU3RyaWtldGhyb3VnaCA9IFwic3RyaWtldGhyb3VnaEJ1dHRvblwiXHJcbn0iLCJleHBvcnQgZW51bSBaSW5kZXgge1xyXG4gICAgTG93SW1wb3J0YW5jZSA9IFwiMTAwXCIsIFxyXG4gICAgU2xpZ2h0bHlJbXBvcnRhbnQgPSBcIjIwMFwiLFxyXG4gICAgTmV1dHJhbCA9IFwiMzAwXCIsXHJcbiAgICBNb2RlcmF0ZWx5SW1wb3J0YW50ID0gXCI0MDBcIixcclxuICAgIFZlcnlJbXBvcnRhbnQgPSBcIjUwMFwiLCBcclxuICAgIEV4dHJlbWVseUltcG9ydGFudCA9IFwiNjAwXCJcclxufSIsIi8qKlxyXG4gKiBFbnVtIHJlcHJlc2VudGluZyB0aGUgZGVmYXVsdCBKYXZhU2NyaXB0IGV2ZW50cyBmb3IgbW91c2UsIGtleWJvYXJkLCBhbmQgZm9jdXMgYWN0aW9ucy5cclxuICogVGhpcyBlbnVtZXJhdGlvbiBwcm92aWRlcyBzdGFuZGFyZGl6ZWQgc3RyaW5ncyBmb3IgYXR0YWNoaW5nIGV2ZW50IGxpc3RlbmVycyB0byBET00gZWxlbWVudHMuXHJcbiAqIFVzZSB0aGVzZSBlbnVtIHZhbHVlcyB0byBlbnN1cmUgY29uc2lzdGVuY3kgYW5kIGF2b2lkIHR5cG9zIGluIGV2ZW50IG5hbWVzIHRocm91Z2hvdXQgeW91ciBhcHBsaWNhdGlvbi5cclxuICovXHJcbmV4cG9ydCBlbnVtIERlZmF1bHRKU0V2ZW50cyB7XHJcbiAgICAvKiogRXZlbnQgZmlyZWQgd2hlbiB0aGUgbW91c2UgYnV0dG9uIGlzIHByZXNzZWQgZG93bi4gKi9cclxuICAgIE1vdXNlZG93biA9IFwibW91c2Vkb3duXCIsXHJcbiAgICAvKiogRXZlbnQgZmlyZWQgd2hlbiB0aGUgbW91c2UgaXMgbW92ZWQgb3ZlciBhbiBlbGVtZW50LiAqL1xyXG4gICAgTW91c2Vtb3ZlID0gXCJtb3VzZW1vdmVcIixcclxuICAgIC8qKiBFdmVudCBmaXJlZCB3aGVuIHRoZSBtb3VzZSBidXR0b24gaXMgcmVsZWFzZWQuICovXHJcbiAgICBNb3VzZXVwID0gXCJtb3VzZXVwXCIsXHJcbiAgICAvKiogRXZlbnQgZmlyZWQgd2hlbiBhIGtleSBpcyByZWxlYXNlZCBvbiB0aGUga2V5Ym9hcmQuICovXHJcbiAgICBLZXl1cCA9IFwia2V5dXBcIixcclxuICAgIC8qKiBFdmVudCBmaXJlZCB3aGVuIGEga2V5IGlzIHByZXNzZWQgZG93biBvbiB0aGUga2V5Ym9hcmQuICovXHJcbiAgICBLZXlkb3duID0gXCJrZXlkb3duXCIsXHJcbiAgICAvKiogRXZlbnQgZmlyZWQgd2hlbiBhbiBlbGVtZW50IGxvc2VzIGZvY3VzLiAqL1xyXG4gICAgQmx1ciA9IFwiYmx1clwiLFxyXG4gICAgU2VsZWN0U3RhcnQgPSBcInNlbGVjdHN0YXJ0XCIsXHJcbiAgICBTZWxlY3Rpb25DaGFuZ2UgPSBcInNlbGVjdGlvbmNoYW5nZVwiLFxyXG4gICAgQ2xpY2sgPSBcImNsaWNrXCJcclxufSIsImV4cG9ydCBlbnVtIERyb3Bkb3duSXRlbUlEcyB7XHJcbiAgICBCYWNrZ3JvdW5kT3B0aW9uUmVkID0gXCJCYWNrZ3JvdW5kT3B0aW9uUmVkXCIsXHJcbiAgICBCYWNrZ3JvdW5kT3B0aW9uR3JlZW4gPSBcIkJhY2tncm91bmRPcHRpb25SZWRcIixcclxuICAgIEJhY2tncm91bmRPcHRpb25CbHVlID0gXCJCYWNrZ3JvdW5kT3B0aW9uUmVkXCIsXHJcbiAgICBCYWNrZ3JvdW5kT3B0aW9uWWVsbG93ID0gXCJCYWNrZ3JvdW5kT3B0aW9uUmVkXCIsXHJcbiAgICBCYWNrZ3JvdW5kT3B0aW9uR3JleSA9IFwiQmFja2dyb3VuZE9wdGlvblJlZFwiLFxyXG4gICAgQmFja2dyb3VuZE9wdGlvbk5vbmUgPSBcIkJhY2tncm91bmRPcHRpb25SZWRcIlxyXG59IiwiZXhwb3J0IGVudW0gRHJvcGRvd25MaXN0SURzIHtcclxuICAgIENvbG9yVGV4dE9wdGlvblNlbGVjdCA9IFwiY29sb3JUZXh0T3B0aW9uU2VsZWN0XCIsXHJcblxyXG59IiwiZXhwb3J0IGVudW0gRHJvcGRvd25NZW51SURzIHtcclxuICAgIENvbG9yVGV4dE9wdGlvbnNNZW51ID0gXCJjb2xvclRleHRPcHRpb25zTWVudVwiXHJcbn0iLCJcbiAgICAgIGltcG9ydCBBUEkgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgIGltcG9ydCBkb21BUEkgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZURvbUFQSS5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydEZuIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qc1wiO1xuICAgICAgaW1wb3J0IHNldEF0dHJpYnV0ZXMgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRTdHlsZUVsZW1lbnQgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanNcIjtcbiAgICAgIGltcG9ydCBzdHlsZVRhZ1RyYW5zZm9ybUZuIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanNcIjtcbiAgICAgIGltcG9ydCBjb250ZW50LCAqIGFzIG5hbWVkRXhwb3J0IGZyb20gXCIhIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vbWFpbi5jc3NcIjtcbiAgICAgIFxuICAgICAgXG5cbnZhciBvcHRpb25zID0ge307XG5cbm9wdGlvbnMuc3R5bGVUYWdUcmFuc2Zvcm0gPSBzdHlsZVRhZ1RyYW5zZm9ybUZuO1xub3B0aW9ucy5zZXRBdHRyaWJ1dGVzID0gc2V0QXR0cmlidXRlcztcbm9wdGlvbnMuaW5zZXJ0ID0gaW5zZXJ0Rm4uYmluZChudWxsLCBcImhlYWRcIik7XG5vcHRpb25zLmRvbUFQSSA9IGRvbUFQSTtcbm9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50ID0gaW5zZXJ0U3R5bGVFbGVtZW50O1xuXG52YXIgdXBkYXRlID0gQVBJKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0ICogZnJvbSBcIiEhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9tYWluLmNzc1wiO1xuICAgICAgIGV4cG9ydCBkZWZhdWx0IGNvbnRlbnQgJiYgY29udGVudC5sb2NhbHMgPyBjb250ZW50LmxvY2FscyA6IHVuZGVmaW5lZDtcbiIsImV4cG9ydCBjbGFzcyBVdGlscyB7XG4gICAgc3RhdGljIGdlbmVyYXRlVW5pcXVlSWQoKSB7XG4gICAgICAgIGNvbnN0IHRpbWVQYXJ0ID0gRGF0ZS5ub3coKS50b1N0cmluZygzNik7XG4gICAgICAgIGNvbnN0IHJhbmRvbUFycmF5ID0gbmV3IFVpbnQzMkFycmF5KDEpO1xuICAgICAgICB3aW5kb3cuY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhyYW5kb21BcnJheSk7XG4gICAgICAgIGNvbnN0IHJhbmRvbVBhcnQgPSByYW5kb21BcnJheVswXS50b1N0cmluZygzNik7XG4gICAgICAgIHJldHVybiB0aW1lUGFydCArIHJhbmRvbVBhcnQ7XG4gICAgfVxuXG4gICAgc3RhdGljIHJnYlRvSGV4KHJnYjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgcmdiQXJyYXkgPSByZ2IubWF0Y2goL1xcZCsvZykhLm1hcChOdW1iZXIpO1xuICAgICAgICByZXR1cm4gXCIjXCIgKyByZ2JBcnJheS5tYXAoeCA9PiB7XG4gICAgICAgICAgICBjb25zdCBoZXggPSB4LnRvU3RyaW5nKDE2KTtcbiAgICAgICAgICAgIHJldHVybiBoZXgubGVuZ3RoID09PSAxID8gXCIwXCIgKyBoZXggOiBoZXg7XG4gICAgICAgIH0pLmpvaW4oXCJcIik7XG4gICAgfVxufSIsImltcG9ydCB7IENvbnRlbnRUeXBlcyB9IGZyb20gXCJAL2NvbW1vbi9Db250ZW50VHlwZXNcIjtcbmltcG9ydCB7IElFbGVtZW50RmFjdG9yeVNlcnZpY2UgfSBmcm9tIFwiLi9JRWxlbWVudEZhY3RvcnlTZXJ2aWNlXCI7XG5pbXBvcnQgeyBVdGlscyB9IGZyb20gXCJAL3V0aWxpdGllcy9VdGlsc1wiO1xuaW1wb3J0IHsgSWNvbnMgfSBmcm9tIFwiQC9jb21tb24vSWNvbnNcIjtcblxuaW50ZXJmYWNlIEVsZW1lbnRDcmVhdG9yIHtcbiAgICAoY29udGVudDogc3RyaW5nIHwgbnVsbCk6IEhUTUxFbGVtZW50O1xufVxuXG5leHBvcnQgY2xhc3MgRWxlbWVudEZhY3RvcnlTZXJ2aWNlIGltcGxlbWVudHMgSUVsZW1lbnRGYWN0b3J5U2VydmljZSB7XG5cbiAgICBwcml2YXRlIGNyZWF0b3JzOiB7IFt0eXBlOiBzdHJpbmddOiBFbGVtZW50Q3JlYXRvciB9O1xuXG4gICAgcHJpdmF0ZSBzdGF0aWMgX2luc3RhbmNlOiBFbGVtZW50RmFjdG9yeVNlcnZpY2U7XG5cbiAgICBzdGF0aWMgRUxFTUVOVF9UWVBFUyA9IHtcbiAgICAgICAgQkxPQ0tfUEFSQUdSQVBIOiBcImJsb2NrLXBcIixcbiAgICAgICAgUEFSQUdSQVBIOiBcInBcIixcbiAgICAgICAgQ0hFQ0tCT1hfSVRFTTogXCJjaGVja2JveEl0ZW1cIixcbiAgICAgICAgTElTVF9JVEVNOiBcImxpc3RJdGVtXCIsXG4gICAgICAgIENPREU6IFwiY29kZVwiLFxuICAgICAgICBRVU9URTogXCJibG9ja3F1b3RlXCIsXG4gICAgICAgIEJVTExFVEVEX0xJU1Q6IFwidWxcIixcbiAgICAgICAgTlVNQkVSRURfTElTVDogXCJvbFwiLFxuICAgICAgICBDSEVDS19MSVNUOiBcImNoZWNrTGlzdHNcIixcbiAgICAgICAgSEVBREVSXzE6IFwiaDFcIixcbiAgICAgICAgSEVBREVSXzI6IFwiaDJcIixcbiAgICAgICAgSEVBREVSXzM6IFwiaDNcIixcbiAgICAgICAgSEVBREVSXzQ6IFwiaDRcIixcbiAgICAgICAgSEVBREVSXzU6IFwiaDVcIixcbiAgICAgICAgSEVBREVSXzY6IFwiaDZcIixcbiAgICAgICAgRFJBR19IQU5ETEVfQlVUVE9OOiBcImRyYWctaGFuZGxlLWJ1dHRvblwiLFxuICAgICAgICBUQUJMRTogXCJ0YWJsZVwiLFxuICAgICAgICBJTUFHRTogXCJpbWFnZVwiLFxuICAgICAgICBDQUxMT1VUOiBcImNhbGxvdXRcIlxuICAgIH1cblxuICAgIHByaXZhdGUgY29uc3RydWN0b3IoKSB7XG5cbiAgICAgICAgaWYgKEVsZW1lbnRGYWN0b3J5U2VydmljZS5faW5zdGFuY2UpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVzZSBFbGVtZW50RmFjdG9yeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKSB0byBnZXQgaW5zdGFuY2UuXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jcmVhdG9ycyA9IHt9O1xuXG4gICAgICAgIHRoaXMucmVnaXN0ZXIoRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuQkxPQ0tfUEFSQUdSQVBILCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuYmxvY2tQYXJhZ3JhcGhDcmVhdG9yKCkpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVyKEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLlBBUkFHUkFQSCwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLnBhcmFncmFwaENyZWF0b3IoKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXIoRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuQ0hFQ0tCT1hfSVRFTSwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmNoZWNrYm94SXRlbUNyZWF0b3IoKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXIoRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuTElTVF9JVEVNLCBFbGVtZW50RmFjdG9yeVNlcnZpY2UubGlzdEl0ZW1DcmVhdG9yKCkpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVyKEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkNPREUsIEVsZW1lbnRGYWN0b3J5U2VydmljZS5jb2RlQ3JlYXRvcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5RVU9URSwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLnF1b3RlQ3JlYXRvcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5DSEVDS19MSVNULCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuY2hlY2tMaXN0Q3JlYXRvcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5CVUxMRVRFRF9MSVNULCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuYnVsbGV0ZWRMaXN0Q3JlYXRvcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5OVU1CRVJFRF9MSVNULCBFbGVtZW50RmFjdG9yeVNlcnZpY2UubnVtYmVyZWRMaXN0Q3JlYXRvcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfMSwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmhlYWRpbmdDcmVhdG9yKDEpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfMiwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmhlYWRpbmdDcmVhdG9yKDIpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfMywgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmhlYWRpbmdDcmVhdG9yKDMpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfNCwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmhlYWRpbmdDcmVhdG9yKDQpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfNSwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmhlYWRpbmdDcmVhdG9yKDUpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfNiwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmhlYWRpbmdDcmVhdG9yKDYpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5EUkFHX0hBTkRMRV9CVVRUT04sIEVsZW1lbnRGYWN0b3J5U2VydmljZS5kcmFnSGFuZGxlQnV0dG9uQ3JlYXRvcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5UQUJMRSwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLnRhYmxlQ3JlYXRvcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5JTUFHRSwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmltYWdlQ3JlYXRvcjIoKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXIoRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuQ0FMTE9VVCwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmNhbGxvdXRDcmVhdG9yKCkpO1xuXG5cblxuICAgICAgICBFbGVtZW50RmFjdG9yeVNlcnZpY2UuX2luc3RhbmNlID0gdGhpcztcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0SW5zdGFuY2UoKTogRWxlbWVudEZhY3RvcnlTZXJ2aWNlIHtcblxuICAgICAgICBpZiAoIXRoaXMuX2luc3RhbmNlKSB7XG4gICAgICAgICAgICB0aGlzLl9pbnN0YW5jZSA9IG5ldyBFbGVtZW50RmFjdG9yeVNlcnZpY2UoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLl9pbnN0YW5jZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlZ2lzdGVyKHR5cGU6IHN0cmluZywgY3JlYXRvcjogRWxlbWVudENyZWF0b3IpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jcmVhdG9yc1t0eXBlXSA9IGNyZWF0b3I7XG4gICAgfVxuXG4gICAgY3JlYXRlKHR5cGU6IHN0cmluZywgY29udGVudD86IHN0cmluZyk6IEhUTUxFbGVtZW50IHtcbiAgICAgICAgY29uc3QgY3JlYXRvciA9IHRoaXMuY3JlYXRvcnNbdHlwZV07XG5cbiAgICAgICAgaWYgKCFjcmVhdG9yKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBObyBjcmVhdG9yIHJlZ2lzdGVyZWQgZm9yIHR5cGU6ICR7dHlwZX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjcmVhdG9yKGNvbnRlbnQgfHwgXCJcIik7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgYmxvY2tQYXJhZ3JhcGhDcmVhdG9yKCk6IEVsZW1lbnRDcmVhdG9yIHtcbiAgICAgICAgcmV0dXJuIGNvbnRlbnQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIEVsZW1lbnRGYWN0b3J5U2VydmljZS5ibG9ja1BhcmFncmFwaChjb250ZW50KTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBwYXJhZ3JhcGhDcmVhdG9yKCk6IEVsZW1lbnRDcmVhdG9yIHtcbiAgICAgICAgcmV0dXJuIGNvbnRlbnQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIEVsZW1lbnRGYWN0b3J5U2VydmljZS5wYXJhZ3JhcGgoY29udGVudCk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgaGVhZGluZ0NyZWF0b3IobGV2ZWw6IG51bWJlcik6IEVsZW1lbnRDcmVhdG9yIHtcbiAgICAgICAgcmV0dXJuIGNvbnRlbnQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIEVsZW1lbnRGYWN0b3J5U2VydmljZS5oZWFkaW5nKGxldmVsLCBjb250ZW50KTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBjaGVja2JveEl0ZW1DcmVhdG9yKCk6IEVsZW1lbnRDcmVhdG9yIHtcbiAgICAgICAgcmV0dXJuIGNvbnRlbnQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIEVsZW1lbnRGYWN0b3J5U2VydmljZS5jaGVja2JveEl0ZW0oY29udGVudCB8fCBcIlwiKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBsaXN0SXRlbUNyZWF0b3IoKTogRWxlbWVudENyZWF0b3Ige1xuXG4gICAgICAgIHJldHVybiBjb250ZW50ID0+IHtcbiAgICAgICAgICAgIHJldHVybiBFbGVtZW50RmFjdG9yeVNlcnZpY2UubGlzdEl0ZW1fMihjb250ZW50KTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBkcmFnSGFuZGxlQnV0dG9uQ3JlYXRvcigpOiBFbGVtZW50Q3JlYXRvciB7XG5cbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBFbGVtZW50RmFjdG9yeVNlcnZpY2UuZHJhZ0hhbmRsZUJ1dHRvbigpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGNvZGVDcmVhdG9yKCk6IEVsZW1lbnRDcmVhdG9yIHtcbiAgICAgICAgcmV0dXJuIGNvbnRlbnQgPT4ge1xuICAgICAgICAgICAgY29uc3QgcHJlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgncHJlJyk7XG4gICAgICAgICAgICBjb25zdCBjb2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY29kZScpO1xuICAgICAgICAgICAgY29kZS50ZXh0Q29udGVudCA9IGNvbnRlbnQgfHwgXCJcIjtcbiAgICAgICAgICAgIHByZS5hcHBlbmRDaGlsZChjb2RlKTtcblxuICAgICAgICAgICAgY29kZS5jb250ZW50RWRpdGFibGUgPSBcInRydWVcIjtcbiAgICAgICAgICAgIHByZS5jbGFzc0xpc3QuYWRkKCdqb2hhbm5lcy1jb250ZW50LWVsZW1lbnQnKTtcbiAgICAgICAgICAgIGNvZGUuY2xhc3NMaXN0LmFkZCgnam9oYW5uZXMtY29kZScpO1xuXG4gICAgICAgICAgICByZXR1cm4gcHJlO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIHF1b3RlQ3JlYXRvcigpOiBFbGVtZW50Q3JlYXRvciB7XG4gICAgICAgIHJldHVybiBjb250ZW50ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGJsb2NrcXVvdGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdibG9ja3F1b3RlJyk7XG4gICAgICAgICAgICBibG9ja3F1b3RlLnRleHRDb250ZW50ID0gY29udGVudCB8fCBcIlwiO1xuICAgICAgICAgICAgYmxvY2txdW90ZS5jb250ZW50RWRpdGFibGUgPSBcInRydWVcIjtcbiAgICAgICAgICAgIGJsb2NrcXVvdGUuY2xhc3NMaXN0LmFkZCgnam9oYW5uZXMtY29udGVudC1lbGVtZW50Jyk7XG4gICAgICAgICAgICByZXR1cm4gYmxvY2txdW90ZTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBjaGVja0xpc3RDcmVhdG9yKCk6IEVsZW1lbnRDcmVhdG9yIHtcbiAgICAgICAgcmV0dXJuIGNvbnRlbnQgPT4ge1xuICAgICAgICAgICAgY29uc3QgdWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd1bCcpO1xuICAgICAgICAgICAgLy8gdWwuY29udGVudEVkaXRhYmxlID0gXCJ0cnVlXCI7XG4gICAgICAgICAgICB1bC5jbGFzc0xpc3QuYWRkKCdqb2hhbm5lcy1jb250ZW50LWVsZW1lbnQnKTtcbiAgICAgICAgICAgIHVsLmNsYXNzTGlzdC5hZGQoJ3N3aXR0YWJsZScpO1xuICAgICAgICAgICAgdWwuY2xhc3NMaXN0LmFkZCgnbGlzdCcpO1xuICAgICAgICAgICAgdWwuY2xhc3NMaXN0LmFkZCgnY2hlY2tib3gtbGlzdCcpO1xuICAgICAgICAgICAgdWwuc2V0QXR0cmlidXRlKFwiZGF0YS1jb250ZW50LXR5cGVcIiwgQ29udGVudFR5cGVzLkNoZWNrTGlzdCk7XG5cbiAgICAgICAgICAgIGNvbnN0IGluaXRpYWxJdGVtID0gRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmNoZWNrYm94SXRlbShjb250ZW50IHx8IFwiXCIpO1xuXG4gICAgICAgICAgICB1bC5hcHBlbmRDaGlsZChpbml0aWFsSXRlbSk7XG5cbiAgICAgICAgICAgIHJldHVybiB1bDtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBidWxsZXRlZExpc3RDcmVhdG9yKCk6IEVsZW1lbnRDcmVhdG9yIHtcbiAgICAgICAgcmV0dXJuIGNvbnRlbnQgPT4ge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3VsJyk7XG4gICAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShcImRhdGEtY29udGVudC10eXBlXCIsIENvbnRlbnRUeXBlcy5CdWxsZXRlZExpc3QpO1xuICAgICAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdqb2hhbm5lcy1jb250ZW50LWVsZW1lbnQnKTtcbiAgICAgICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnc3dpdHRhYmxlJyk7XG4gICAgICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2xpc3QnKTtcblxuICAgICAgICAgICAgY29uc3QgaW5pdGlhbEl0ZW0gPSBFbGVtZW50RmFjdG9yeVNlcnZpY2UubGlzdEl0ZW1fMihjb250ZW50IHx8IFwiXCIpO1xuXG4gICAgICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKGluaXRpYWxJdGVtKTtcblxuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgbnVtYmVyZWRMaXN0Q3JlYXRvcigpOiBFbGVtZW50Q3JlYXRvciB7XG4gICAgICAgIHJldHVybiBjb250ZW50ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdvbCcpO1xuICAgICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJkYXRhLWNvbnRlbnQtdHlwZVwiLCBDb250ZW50VHlwZXMuTnVtYmVyZWRMaXN0KTtcbiAgICAgICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnam9oYW5uZXMtY29udGVudC1lbGVtZW50Jyk7XG4gICAgICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3N3aXR0YWJsZScpO1xuICAgICAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdsaXN0Jyk7XG5cbiAgICAgICAgICAgIGNvbnN0IGluaXRpYWxJdGVtID0gRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmxpc3RJdGVtXzIoY29udGVudCB8fCBcIlwiKTtcblxuICAgICAgICAgICAgZWxlbWVudC5hcHBlbmRDaGlsZChpbml0aWFsSXRlbSk7XG5cbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgICAgICB9O1xuICAgIH1cblxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgdGFibGVDcmVhdG9yKCk6IEVsZW1lbnRDcmVhdG9yIHtcbiAgICAgICAgcmV0dXJuIGNvbnRlbnQgPT4ge1xuXG4gICAgICAgICAgICBjb25zdCB0YWJsZVNoZWxsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgICAgIHRhYmxlU2hlbGwuY2xhc3NMaXN0LmFkZChcInRhYmxlLXNoZWxsXCIpO1xuXG4gICAgICAgICAgICBjb25zdCB0YWJsZUNvbnRyb2xsZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAgICAgdGFibGVDb250cm9sbGVyLmNsYXNzTGlzdC5hZGQoXCJ0YWJsZS1jb250cm9sbGVyXCIpO1xuXG4gICAgICAgICAgICBjb25zdCB0YWJsZVdyYXBwZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAgICAgdGFibGVXcmFwcGVyLmNsYXNzTGlzdC5hZGQoXCJ0YWJsZS13cmFwcGVyXCIpO1xuXG4gICAgICAgICAgICBjb25zdCB0YWJsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RhYmxlJyk7XG4gICAgICAgICAgICB0YWJsZS5jbGFzc0xpc3QuYWRkKCdqb2hhbm5lcy1jb250ZW50LWVsZW1lbnQnLCAnc3dpdHRhYmxlJywgJ3RhYmxlJyk7XG4gICAgICAgICAgICB0YWJsZS5zZXRBdHRyaWJ1dGUoXCJkYXRhLWNvbnRlbnQtdHlwZVwiLCBDb250ZW50VHlwZXMuVGFibGUpO1xuXG4gICAgICAgICAgICB0YWJsZVNoZWxsLmFwcGVuZENoaWxkKHRhYmxlQ29udHJvbGxlcik7XG4gICAgICAgICAgICB0YWJsZUNvbnRyb2xsZXIuYXBwZW5kQ2hpbGQodGFibGVXcmFwcGVyKTtcbiAgICAgICAgICAgIHRhYmxlV3JhcHBlci5hcHBlbmRDaGlsZCh0YWJsZSk7XG5cbiAgICAgICAgICAgIGNvbnN0IHRib2R5ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGJvZHknKTtcbiAgICAgICAgICAgIHRhYmxlLmFwcGVuZENoaWxkKHRib2R5KTtcblxuICAgICAgICAgICAgY29uc3Qgcm93RGF0YSA9IGNvbnRlbnQgPyBjb250ZW50LnNwbGl0KCcsJykgOiBbXTtcbiAgICAgICAgICAgIGNvbnN0IHJvdyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7XG4gICAgICAgICAgICByb3dEYXRhLmZvckVhY2goY2VsbENvbnRlbnQgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNlbGwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpO1xuICAgICAgICAgICAgICAgIGNlbGwuY2xhc3NMaXN0LmFkZChcImZvY3VzYWJsZVwiKTtcbiAgICAgICAgICAgICAgICBjZWxsLnNldEF0dHJpYnV0ZShcImRhdGEtcGxhY2Vob2xkZXJcIiwgXCJjZWxsXCIpO1xuICAgICAgICAgICAgICAgIGNlbGwudGV4dENvbnRlbnQgPSBjZWxsQ29udGVudDtcbiAgICAgICAgICAgICAgICBjZWxsLmNvbnRlbnRFZGl0YWJsZSA9ICd0cnVlJztcbiAgICAgICAgICAgICAgICByb3cuYXBwZW5kQ2hpbGQoY2VsbCk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdGJvZHkuYXBwZW5kQ2hpbGQocm93KTtcblxuICAgICAgICAgICAgY29uc3QgYWRkUm93ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgICAgIGFkZFJvdy5jbGFzc0xpc3QuYWRkKFwiYWRkLXRhYmxlLXJvd1wiKTtcbiAgICAgICAgICAgIGFkZFJvdy5pbm5lckhUTUwgPSBgPHN2ZyB3aWR0aD1cIjFyZW1cIiBoZWlnaHQ9XCIxcmVtXCIgZmlsbD1cImN1cnJlbnRDb2xvclwiPjx1c2UgeGxpbms6aHJlZj1cIiNpY29uLXBsdXNcIj48L3VzZT48L3N2Zz5gO1xuXG4gICAgICAgICAgICBjb25zdCBhZGRDb2x1bW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAgICAgYWRkQ29sdW1uLmNsYXNzTGlzdC5hZGQoXCJhZGQtdGFibGUtY29sdW1uXCIpO1xuICAgICAgICAgICAgYWRkQ29sdW1uLmlubmVySFRNTCA9IGA8c3ZnIHdpZHRoPVwiMXJlbVwiIGhlaWdodD1cIjFyZW1cIiBmaWxsPVwiY3VycmVudENvbG9yXCI+PHVzZSB4bGluazpocmVmPVwiI2ljb24tcGx1c1wiPjwvdXNlPjwvc3ZnPmA7XG4gICAgXG4gICAgICAgICAgICB0YWJsZUNvbnRyb2xsZXIuYXBwZW5kQ2hpbGQoYWRkUm93KTtcbiAgICAgICAgICAgIHRhYmxlQ29udHJvbGxlci5hcHBlbmRDaGlsZChhZGRDb2x1bW4pO1xuXG4gICAgICAgICAgICByZXR1cm4gdGFibGVTaGVsbDtcbiAgICAgICAgfTtcbiAgICB9XG5cblxuICAgIHByaXZhdGUgc3RhdGljIGltYWdlQ3JlYXRvcjIoKTogRWxlbWVudENyZWF0b3Ige1xuICAgICAgICByZXR1cm4gY29udGVudCA9PiB7XG4gICAgICAgICAgICBjb25zdCBpbWFnZUNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgaW1hZ2VDb250YWluZXIuY2xhc3NMaXN0LmFkZChcImpvaGFubmVzLWNvbnRlbnQtZWxlbWVudFwiLCBcInN3aXR0YWJsZVwiLCBcIm5vLXNlbGVjdGlvblwiKTtcbiAgICAgICAgICAgIGltYWdlQ29udGFpbmVyLnNldEF0dHJpYnV0ZShcImRhdGEtY29udGVudC10eXBlXCIsIENvbnRlbnRUeXBlcy5JbWFnZSk7XG5cbiAgICAgICAgICAgIGltYWdlQ29udGFpbmVyLkFUVFJJQlVURV9OT0RFXG4gICAgXG4gICAgICAgICAgICBjb25zdCB0ZXh0QXJlYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgdGV4dEFyZWEuY2xhc3NMaXN0LmFkZChcImVkaXRvci1vbmx5XCIsIFwidGVtcC1pbWFnZS1yZXBsYWNlXCIpO1xuICAgICAgICAgICAgdGV4dEFyZWEuc3R5bGUucGFkZGluZyA9IFwiMXJlbVwiO1xuICAgICAgICAgICAgdGV4dEFyZWEuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gXCIjZTdlNmUzXCI7XG4gICAgICAgICAgICBpbWFnZUNvbnRhaW5lci5hcHBlbmRDaGlsZCh0ZXh0QXJlYSk7XG4gICAgICAgICAgICB0ZXh0QXJlYS5zdHlsZS5jb2xvciA9IFwicmdiYSg1NSwgNTMsIDQ3LCAwLjUpXCJcblxuICAgICAgICAgICAgdGV4dEFyZWEuc3R5bGUuZGlzcGxheSA9IFwiZmxleFwiO1xuICAgICAgICAgICAgdGV4dEFyZWEuc3R5bGUuZ2FwID0gXCI1cHhcIjtcbiAgICAgICAgICAgIHRleHRBcmVhLnN0eWxlLmFsaWduSXRlbXMgPSBcImNlbnRlclwiO1xuXG4gICAgICAgICAgICBjb25zdCBpY29uID0gdGhpcy5pY29uKEljb25zLkltYWdlKTtcblxuICAgICAgICAgICAgaWNvbi5zdHlsZS5kaXNwbGF5ID0gXCJmbGV4XCI7XG4gICAgICAgICAgICBpY29uLnN0eWxlLmFsaWduSXRlbXMgPSBcImNlbnRlclwiO1xuXG4gICAgICAgICAgICB0ZXh0QXJlYS5hcHBlbmRDaGlsZChpY29uKTtcblxuICAgICAgICAgICAgY29uc3Qgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuICAgICAgICAgICAgc3Bhbi5jbGFzc0xpc3QuYWRkKFwibm8tc2VsZWN0aW9uXCIpO1xuICAgICAgICAgICAgc3Bhbi5pbm5lclRleHQgPSBcIkFkZCBhbiBpbWFnZVwiO1xuXG4gICAgICAgICAgICB0ZXh0QXJlYS5hcHBlbmRDaGlsZChzcGFuKTtcbiAgICBcbiAgICAgICAgICAgIC8vIENyaWFuZG8gbyBib3TDo28gZGUgbWFpcyBvcMOnw7Vlc1xuICAgICAgICAgICAgLy8gY29uc3Qgb3B0aW9uc0J1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xuICAgICAgICAgICAgY29uc3Qgb3B0aW9uc0J1dHRvbiA9IHRoaXMubW9yZU9wdGlvbnNCdXR0b24oKTtcbiAgICAgICAgICAgIC8vIG9wdGlvbnNCdXR0b24uaW5uZXJIVE1MID0gXCImIzgyMzA7XCI7IC8vIFVuaWNvZGUgcGFyYSBcIi4uLlwiXG4gICAgICAgICAgICBvcHRpb25zQnV0dG9uLmNsYXNzTGlzdC5hZGQoJ29wdGlvbnMtYnV0dG9uJywgJ2hpZGUtb24tYmx1cicpO1xuICAgICAgICAgICAgb3B0aW9uc0J1dHRvbi5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gICAgICAgICAgICBvcHRpb25zQnV0dG9uLnN0eWxlLnRvcCA9ICcxMHB4JztcbiAgICAgICAgICAgIG9wdGlvbnNCdXR0b24uc3R5bGUucmlnaHQgPSAnMTBweCc7XG4gICAgICAgICAgICBvcHRpb25zQnV0dG9uLnN0eWxlLmJvcmRlciA9ICdub25lJztcbiAgICAgICAgICAgIG9wdGlvbnNCdXR0b24uc3R5bGUuYmFja2dyb3VuZCA9ICd0cmFuc3BhcmVudCc7XG4gICAgICAgICAgICBvcHRpb25zQnV0dG9uLnN0eWxlLmN1cnNvciA9ICdwb2ludGVyJztcbiAgICAgICAgICAgIG9wdGlvbnNCdXR0b24uc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgJ01vcmUgb3B0aW9ucycpO1xuICAgICAgICAgICAgb3B0aW9uc0J1dHRvbi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOyAvLyBFc2NvbmRlIGluaWNpYWxtZW50ZSBvIGJvdMOjb1xuICAgIFxuICAgICAgICAgICAgaW1hZ2VDb250YWluZXIuYXBwZW5kQ2hpbGQob3B0aW9uc0J1dHRvbik7XG4gICAgXG4gICAgICAgICAgICByZXR1cm4gaW1hZ2VDb250YWluZXI7XG4gICAgICAgIH07XG4gICAgfVxuXG5cbiAgICBwcml2YXRlIHN0YXRpYyBpbWFnZUNyZWF0b3IoKTogRWxlbWVudENyZWF0b3Ige1xuICAgICAgICByZXR1cm4gY29udGVudCA9PiB7XG4gICAgICAgICAgICBjb25zdCBpbWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTtcbiAgICBcbiAgICAgICAgICAgIC8vIEFzc3VtZSAnY29udGVudCcgY29tbyB1bSBVUkwgZGEgaW1hZ2VtIG91IHRleHRvIGRlc2NyaXRpdm8gc2UgcXVpc2VyIG1hbmlwdWxhciBpc3NvLlxuICAgICAgICAgICAgaW1nLnNyYyA9IGNvbnRlbnQgfHwgXCJkZWZhdWx0LWltYWdlLXBhdGguanBnXCI7IC8vIENhbWluaG8gcGFkcsOjbyBzZSBuZW5odW0gY29udGXDumRvIGZvciBmb3JuZWNpZG9cbiAgICAgICAgICAgIGltZy5hbHQgPSBcIkRlc2NyacOnw6NvIGRhIGltYWdlbVwiOyAvLyBBbHRlcm5hdGl2YW1lbnRlLCBwb2RlLXNlIHBhc3NhciBvIGFsdCB0ZXh0IGNvbW8gcGFydGUgZG8gY29udGXDumRvXG4gICAgXG4gICAgICAgICAgICBpbWcuY2xhc3NMaXN0LmFkZCgnam9oYW5uZXMtY29udGVudC1lbGVtZW50Jyk7XG4gICAgICAgICAgICBpbWcuY2xhc3NMaXN0LmFkZCgnc3dpdHRhYmxlJyk7IC8vIEFwZW5hcyBzZSBxdWlzZXIgYXBsaWNhciBlc3RpbG9zIG91IGNvbXBvcnRhbWVudG9zIGVzcGVjw61maWNvc1xuICAgICAgICAgICAgaW1nLmNsYXNzTGlzdC5hZGQoJ2ZvY3VzYWJsZScpO1xuICAgIFxuICAgICAgICAgICAgLy8gVGFtYW5obyBwYWRyw6NvIG91IGRpbsOibWljbywgc2UgbmVjZXNzw6FyaW9cbiAgICAgICAgICAgIGltZy5zdHlsZS53aWR0aCA9IFwiMTAwJVwiOyAvLyBFeGVtcGxvIGRlIGVzdGlsbywgYWp1c3RhciBjb25mb3JtZSBuZWNlc3PDoXJpb1xuICAgICAgICAgICAgaW1nLnN0eWxlLmhlaWdodCA9IFwiYXV0b1wiO1xuICAgIFxuICAgICAgICAgICAgLy8gQWRpY2lvbmFyIG1hbmlwdWxhw6fDo28gZGUgZXZlbnRvcywgc2UgbmVjZXNzw6FyaW9cbiAgICAgICAgICAgIGltZy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkltYWdlbSBjbGljYWRhIVwiKTtcbiAgICAgICAgICAgIH0pO1xuICAgIFxuICAgICAgICAgICAgcmV0dXJuIGltZztcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBjYWxsb3V0Q3JlYXRvcigpOiBFbGVtZW50Q3JlYXRvciB7XG4gICAgICAgIHJldHVybiBjb250ZW50ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNhbGxvdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIGNhbGxvdXQuY2xhc3NMaXN0LmFkZCgnY2FsbG91dCcsICdqb2hhbm5lcy1jb250ZW50LWVsZW1lbnQnLCAnc3dpdHRhYmxlJyk7XG4gICAgXG4gICAgICAgICAgICBjb25zdCB0ZXh0QXJlYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgdGV4dEFyZWEuc2V0QXR0cmlidXRlKFwiZGF0YS1wbGFjZWhvbGRlclwiLCBcIlR5cGUgc29tZXRoaW5nLi4uXCIpO1xuICAgICAgICAgICAgdGV4dEFyZWEuY29udGVudEVkaXRhYmxlID0gXCJ0cnVlXCI7XG4gICAgICAgICAgICB0ZXh0QXJlYS5jbGFzc0xpc3QuYWRkKCdjYWxsb3V0LXRleHQnLCAnZWRpdGFibGUnLCAnZm9jdXNhYmxlJyk7XG4gICAgICAgICAgICB0ZXh0QXJlYS5zdHlsZS5wYWRkaW5nID0gXCIxcmVtXCI7XG4gICAgICAgICAgICB0ZXh0QXJlYS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBcIiNmYmVjZGRcIjtcbiAgICAgICAgICAgIGNhbGxvdXQuYXBwZW5kQ2hpbGQodGV4dEFyZWEpO1xuICAgIFxuICAgICAgICAgICAgLy8gQ3JpYW5kbyBvIGJvdMOjbyBkZSBtYWlzIG9ww6fDtWVzXG4gICAgICAgICAgICAvLyBjb25zdCBvcHRpb25zQnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XG4gICAgICAgICAgICBjb25zdCBvcHRpb25zQnV0dG9uID0gdGhpcy5tb3JlT3B0aW9uc0J1dHRvbigpO1xuICAgICAgICAgICAgLy8gb3B0aW9uc0J1dHRvbi5pbm5lckhUTUwgPSBcIiYjODIzMDtcIjsgLy8gVW5pY29kZSBwYXJhIFwiLi4uXCJcbiAgICAgICAgICAgIG9wdGlvbnNCdXR0b24uY2xhc3NMaXN0LmFkZCgnb3B0aW9ucy1idXR0b24nLCAnaGlkZS1vbi1ibHVyJyk7XG4gICAgICAgICAgICBvcHRpb25zQnV0dG9uLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgICAgICAgICAgIG9wdGlvbnNCdXR0b24uc3R5bGUudG9wID0gJzEwcHgnO1xuICAgICAgICAgICAgb3B0aW9uc0J1dHRvbi5zdHlsZS5yaWdodCA9ICcxMHB4JztcbiAgICAgICAgICAgIG9wdGlvbnNCdXR0b24uc3R5bGUuYm9yZGVyID0gJ25vbmUnO1xuICAgICAgICAgICAgb3B0aW9uc0J1dHRvbi5zdHlsZS5iYWNrZ3JvdW5kID0gJ3RyYW5zcGFyZW50JztcbiAgICAgICAgICAgIG9wdGlvbnNCdXR0b24uc3R5bGUuY3Vyc29yID0gJ3BvaW50ZXInO1xuICAgICAgICAgICAgb3B0aW9uc0J1dHRvbi5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCAnTW9yZSBvcHRpb25zJyk7XG4gICAgICAgICAgICBvcHRpb25zQnV0dG9uLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7IC8vIEVzY29uZGUgaW5pY2lhbG1lbnRlIG8gYm90w6NvXG4gICAgXG4gICAgICAgICAgICBjYWxsb3V0LmFwcGVuZENoaWxkKG9wdGlvbnNCdXR0b24pO1xuICAgIFxuICAgICAgICAgICAgcmV0dXJuIGNhbGxvdXQ7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gcHJpdmF0ZSBzdGF0aWMgbnVtYmVyZWRMaXN0Q3JlYXRvcigpOiBFbGVtZW50Q3JlYXRvciB7XG4gICAgLy8gICAgIHJldHVybiAoKSA9PiB7XG4gICAgLy8gICAgICAgICBjb25zdCBvbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ29sJyk7XG4gICAgLy8gICAgICAgICBvbC5jb250ZW50RWRpdGFibGUgPSBcInRydWVcIjtcbiAgICAvLyAgICAgICAgIG9sLmNsYXNzTGlzdC5hZGQoJ2pvaGFubmVzLWNvbnRlbnQtZWxlbWVudCcpO1xuICAgIC8vICAgICAgICAgcmV0dXJuIG9sO1xuICAgIC8vICAgICB9O1xuICAgIC8vIH1cblxuICAgIHN0YXRpYyBwYXJhZ3JhcGgoY29udGVudDogc3RyaW5nIHwgbnVsbCA9IG51bGwpOiBIVE1MRWxlbWVudCB7XG4gICAgICAgIGNvbnN0IHAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdwJyk7XG5cbiAgICAgICAgcC5pbm5lclRleHQgPSBjb250ZW50IHx8IFwiXCI7XG4gICAgICAgIHAuY29udGVudEVkaXRhYmxlID0gXCJ0cnVlXCI7XG4gICAgICAgIHAuc2V0QXR0cmlidXRlKCdkYXRhLWNvbnRlbnQtdHlwZScsIENvbnRlbnRUeXBlcy5QYXJhZ3JhcGgpO1xuICAgICAgICBwLmNsYXNzTGlzdC5hZGQoJ2pvaGFubmVzLWNvbnRlbnQtZWxlbWVudCcpO1xuICAgICAgICBwLmNsYXNzTGlzdC5hZGQoJ3N3aXR0YWJsZScpO1xuICAgICAgICBwLmNsYXNzTGlzdC5hZGQoJ2ZvY3VzYWJsZScpO1xuICAgICAgICBwLmNsYXNzTGlzdC5hZGQoJ2tleS10cmlnZ2VyJyk7XG4gICAgICAgIHAuc2V0QXR0cmlidXRlKCdkYXRhLXBsYWNlaG9sZGVyJywgJ1dyaXRlIHNvbWV0aGluZyBvciB0eXBlIC8gKHNsYXNoKSB0byBjaG9vc2UgYSBibG9jay4uLicpO1xuXG4gICAgICAgIHJldHVybiBwO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGhlYWRpbmcobGV2ZWw6IG51bWJlciwgY29udGVudDogc3RyaW5nIHwgbnVsbCA9IG51bGwpOiBIVE1MRWxlbWVudCB7XG4gICAgICAgIGNvbnN0IGggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGBoJHtsZXZlbH1gKTtcblxuICAgICAgICBoLmlubmVyVGV4dCA9IGNvbnRlbnQgfHwgXCJcIjtcbiAgICAgICAgaC5jb250ZW50RWRpdGFibGUgPSBcInRydWVcIjtcbiAgICAgICAgaC5zZXRBdHRyaWJ1dGUoJ2RhdGEtY29udGVudC10eXBlJywgYGgke2xldmVsfWApO1xuICAgICAgICBoLmNsYXNzTGlzdC5hZGQoJ2pvaGFubmVzLWNvbnRlbnQtZWxlbWVudCcpO1xuICAgICAgICBoLmNsYXNzTGlzdC5hZGQoJ3N3aXR0YWJsZScpO1xuICAgICAgICBoLmNsYXNzTGlzdC5hZGQoJ2ZvY3VzYWJsZScpO1xuICAgICAgICBoLmNsYXNzTGlzdC5hZGQoJ2ZvY3VzJyk7XG4gICAgICAgIGguY2xhc3NMaXN0LmFkZCgna2V5LXRyaWdnZXInKTtcbiAgICAgICAgaC5zZXRBdHRyaWJ1dGUoJ2RhdGEtcGxhY2Vob2xkZXInLCBgSGVhZGluZyAke2xldmVsfWApO1xuXG4gICAgICAgIHJldHVybiBoO1xuICAgIH1cblxuICAgIHN0YXRpYyBjaGVja2JveEl0ZW0oY29udGVudDogc3RyaW5nKTogSFRNTEVsZW1lbnQge1xuXG4gICAgICAgIGNvbnN0IGlkID0gVXRpbHMuZ2VuZXJhdGVVbmlxdWVJZCgpO1xuXG4gICAgICAgIGxldCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGknKTtcbiAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdkZWxldGFibGUnKTtcbiAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdsaXN0LWl0ZW0nKTtcbiAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdsaXN0LWl0ZW0tY2hlY2thYmxlJyk7XG5cbiAgICAgICAgLy8gaW5pdGlhbEl0ZW0uY2xhc3NMaXN0LmFkZCgna2V5LXRyaWdnZXInKTtcblxuICAgICAgICBsZXQgY2hlY2tib3ggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO1xuICAgICAgICBjaGVja2JveC5pZCA9IGlkO1xuICAgICAgICBjaGVja2JveC5zZXRBdHRyaWJ1dGUoJ3R5cGUnLCAnY2hlY2tib3gnKTtcbiAgICAgICAgLy8gY2hlY2tib3guY29udGVudEVkaXRhYmxlID0gXCJ0cnVlXCI7XG5cbiAgICAgICAgbGV0IHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgc3Bhbi50ZXh0Q29udGVudCA9IGNvbnRlbnQ7XG4gICAgICAgIHNwYW4uc2V0QXR0cmlidXRlKCdkYXRhLXBsYWNlaG9sZGVyJywgJ1RvLWRvJyk7XG4gICAgICAgIHNwYW4uY29udGVudEVkaXRhYmxlID0gXCJ0cnVlXCI7XG4gICAgICAgIHNwYW4uc2V0QXR0cmlidXRlKFwiZm9yXCIsIGlkKTtcbiAgICAgICAgc3Bhbi5zZXRBdHRyaWJ1dGUoXCJjb250ZW50RWRpdGFibGVcIiwgXCJ0cnVlXCIpO1xuXG4gICAgICAgIHNwYW4uY2xhc3NMaXN0LmFkZCgnZm9jdXNhYmxlJyk7XG4gICAgICAgIHNwYW4uY2xhc3NMaXN0LmFkZCgnZWRpdGFibGUnKTtcbiAgICAgICAgc3Bhbi5jbGFzc0xpc3QuYWRkKCdmb2N1cycpO1xuXG4gICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQoY2hlY2tib3gpO1xuICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKHNwYW4pO1xuXG4gICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgIH1cblxuICAgIC8vIHByaXZhdGUgc3RhdGljIGxpc3RJdGVtKHRleHQ6IHN0cmluZyk6IEhUTUxFbGVtZW50IHtcblxuICAgIC8vICAgICBsZXQgaW5pdGlhbEl0ZW0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaScpO1xuXG4gICAgLy8gICAgIGluaXRpYWxJdGVtLmNsYXNzTGlzdC5hZGQoJ2ZvY3VzYWJsZScpO1xuICAgIC8vICAgICBpbml0aWFsSXRlbS5jbGFzc0xpc3QuYWRkKCdkZWxldGFibGUnKTtcbiAgICAvLyAgICAgaW5pdGlhbEl0ZW0uY2xhc3NMaXN0LmFkZCgnZWRpdGFibGUnKTtcbiAgICAvLyAgICAgaW5pdGlhbEl0ZW0uY2xhc3NMaXN0LmFkZCgnZm9jdXMnKTtcbiAgICAvLyAgICAgaW5pdGlhbEl0ZW0uY2xhc3NMaXN0LmFkZCgna2V5LXRyaWdnZXInKTtcbiAgICAvLyAgICAgaW5pdGlhbEl0ZW0uY2xhc3NMaXN0LmFkZCgnbGlzdC1pdGVtJyk7XG5cbiAgICAvLyAgICAgaW5pdGlhbEl0ZW0uaW5uZXJUZXh0ID0gdGV4dDtcblxuICAgIC8vICAgICBpbml0aWFsSXRlbS5jb250ZW50RWRpdGFibGUgPSBcInRydWVcIjtcbiAgICAvLyAgICAgaW5pdGlhbEl0ZW0uc2V0QXR0cmlidXRlKCdkYXRhLXBsYWNlaG9sZGVyJywgJ0l0ZW0nKTtcblxuICAgIC8vICAgICByZXR1cm4gaW5pdGlhbEl0ZW07XG5cbiAgICAvLyB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBsaXN0SXRlbV8yKGNvbnRlbnQ6IHN0cmluZyB8IG51bGwgPSBudWxsKTogSFRNTEVsZW1lbnQge1xuXG4gICAgICAgIGxldCBpbml0aWFsSXRlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpJyk7XG5cbiAgICAgICAgaW5pdGlhbEl0ZW0uY2xhc3NMaXN0LmFkZCgnZGVsZXRhYmxlJyk7XG4gICAgICAgIGluaXRpYWxJdGVtLmNsYXNzTGlzdC5hZGQoJ2xpc3QtaXRlbScpO1xuXG4gICAgICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG5cbiAgICAgICAgZGl2LmNsYXNzTGlzdC5hZGQoJ2ZvY3VzYWJsZScpO1xuICAgICAgICBkaXYuY2xhc3NMaXN0LmFkZCgnZWRpdGFibGUnKTtcbiAgICAgICAgZGl2LmNsYXNzTGlzdC5hZGQoJ2ZvY3VzJyk7XG4gICAgICAgIGRpdi5jb250ZW50RWRpdGFibGUgPSBcInRydWVcIjtcbiAgICAgICAgZGl2LmNsYXNzTGlzdC5hZGQoJ2tleS10cmlnZ2VyJyk7XG4gICAgICAgIGRpdi5zZXRBdHRyaWJ1dGUoJ2RhdGEtcGxhY2Vob2xkZXInLCAnSXRlbScpO1xuXG4gICAgICAgIGluaXRpYWxJdGVtLmFwcGVuZENoaWxkKGRpdik7XG5cblxuICAgICAgICBkaXYuaW5uZXJUZXh0ID0gY29udGVudCB8fCBcIlwiO1xuXG4gICAgICAgIC8vIGluaXRpYWxJdGVtLmNvbnRlbnRFZGl0YWJsZSA9IHRydWU7XG5cbiAgICAgICAgcmV0dXJuIGluaXRpYWxJdGVtO1xuICAgIH1cblxuXG4gICAgc3RhdGljIGJsb2NrUGFyYWdyYXBoKGNvbnRlbnQ6IHN0cmluZyB8IG51bGwgPSBudWxsKSB7XG5cbiAgICAgICAgbGV0IG5ld0RpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBsZXQgbmV3RWxlbWVudCA9IEVsZW1lbnRGYWN0b3J5U2VydmljZS5wYXJhZ3JhcGgoY29udGVudCk7XG5cbiAgICAgICAgLy8gbGV0IGRyYWdIYW5kbGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XG4gICAgICAgIC8vIGRyYWdIYW5kbGVyLmlubmVySFRNTCA9ICc8c3ZnIHdpZHRoPVwiMS4zNzVyZW1cIiBoZWlnaHQ9XCIxLjM3NXJlbVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIj48dXNlIGhyZWY9XCIjaWNvbi1tYXRlcmlhbC1kcmFnXCI+PC91c2U+PC9zdmc+JztcblxuICAgICAgICAvLyBuZXdEaXYuYXBwZW5kQ2hpbGQobmV3QnV0dG9uKTtcbiAgICAgICAgbmV3RGl2LmFwcGVuZENoaWxkKG5ld0VsZW1lbnQpO1xuXG4gICAgICAgIG5ld0Rpdi5jbGFzc0xpc3QuYWRkKCdibG9jaycpO1xuICAgICAgICBuZXdEaXYuY2xhc3NMaXN0LmFkZCgnZGVsZXRhYmxlJyk7XG4gICAgICAgIC8vIGRyYWdIYW5kbGVyLmNsYXNzTGlzdC5hZGQoJ2RyYWctaGFuZGxlcicpO1xuICAgICAgICAvLyBkcmFnSGFuZGxlci5jbGFzc0xpc3QuYWRkKCdidXR0b24tcmVzZXQnKTtcbiAgICAgICAgLy8gZHJhZ0hhbmRsZXIuZHJhZ2dhYmxlID0gdHJ1ZTtcblxuICAgICAgICByZXR1cm4gbmV3RGl2O1xuICAgIH1cblxuICAgIHN0YXRpYyBkcmFnSGFuZGxlQnV0dG9uKCkge1xuXG4gICAgICAgIGxldCBidXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcbiAgICAgICAgYnV0dG9uLmlubmVySFRNTCA9ICc8c3ZnIHdpZHRoPVwiMS4zNzVyZW1cIiBoZWlnaHQ9XCIxLjM3NXJlbVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIj48dXNlIGhyZWY9XCIjaWNvbi1tYXRlcmlhbC1kcmFnXCI+PC91c2U+PC9zdmc+JztcblxuICAgICAgICBidXR0b24uY2xhc3NMaXN0LmFkZChcImVkaXRvci1vbmx5XCIsIFwiZHJhZy1oYW5kbGVyXCIsIFwiYnV0dG9uLXJlc2V0XCIpO1xuICAgICAgICBidXR0b24uZHJhZ2dhYmxlID0gdHJ1ZTtcblxuICAgICAgICByZXR1cm4gYnV0dG9uO1xuICAgIH1cblxuICAgIHN0YXRpYyBtb3JlT3B0aW9uc0J1dHRvbigpIHtcblxuICAgICAgICBsZXQgYnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XG4gICAgICAgIGJ1dHRvbi5pbm5lckhUTUwgPSAnPHN2ZyB3aWR0aD1cIjEuMzc1cmVtXCIgaGVpZ2h0PVwiMS4zNzVyZW1cIiBmaWxsPVwiY3VycmVudENvbG9yXCI+PHVzZSBocmVmPVwiI2ljb24tbWF0ZXJpYWwtbW9yZVwiPjwvdXNlPjwvc3ZnPic7XG5cbiAgICAgICAgYnV0dG9uLmNsYXNzTGlzdC5hZGQoXCJlZGl0b3Itb25seVwiLCBcImRyYWctaGFuZGxlclwiLCBcImJ1dHRvbi1yZXNldFwiKTtcblxuICAgICAgICByZXR1cm4gYnV0dG9uO1xuICAgIH1cblxuXG4gICAgc3RhdGljIGljb24oaWNvbklkOiBzdHJpbmcpIHtcblxuICAgICAgICBsZXQgYnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIGJ1dHRvbi5pbm5lckhUTUwgPSBgPHN2ZyB3aWR0aD1cIjEuMzc1cmVtXCIgaGVpZ2h0PVwiMS4zNzVyZW1cIiBmaWxsPVwiY3VycmVudENvbG9yXCI+PHVzZSBocmVmPVwiIyR7aWNvbklkfVwiPjwvdXNlPjwvc3ZnPmA7XG5cbiAgICAgICAgLy8gYnV0dG9uLmNsYXNzTGlzdC5hZGQoXCJlZGl0b3Itb25seVwiLCBcImRyYWctaGFuZGxlclwiLCBcImJ1dHRvbi1yZXNldFwiKTtcblxuICAgICAgICByZXR1cm4gYnV0dG9uO1xuICAgIH1cblxufSIsImV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlVUlDb21wb25lbnQ8VCBleHRlbmRzIEhUTUxFbGVtZW50ID0gSFRNTEVsZW1lbnQ+IHtcclxuXHJcbiAgICBwcml2YXRlIF9jYW5IaWRlOiBib29sZWFuO1xyXG5cclxuICAgIHByb3BzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xyXG4gICAgaHRtbEVsZW1lbnQ6IFQ7XHJcbiAgICBwYXJlbnQ/OiBCYXNlVUlDb21wb25lbnQ7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJvcHM6IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcclxuXHJcbiAgICAgICAgdGhpcy5wcm9wcyA9IHByb3BzO1xyXG5cclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50ID0gdGhpcy5pbml0KCkgYXMgVDtcclxuICAgICAgICB0aGlzLl9jYW5IaWRlID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICogSW5pdGlhbGl6ZXMgYW5kIHJldHVybnMgYW4gSFRNTEVsZW1lbnQgdXNpbmcgdGhlIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgQVBJLlxyXG4gICAgKiBUaGlzIGFic3RyYWN0IG1ldGhvZCBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IHN1YmNsYXNzZXMgdG8gc3BlY2lmeSB0aGUgdHlwZSBvZlxyXG4gICAgKiBIVE1MRWxlbWVudCB0byBiZSBjcmVhdGVkIGFuZCBwb3NzaWJseSBjb25maWd1cmUgaXRzIHByb3BlcnRpZXMgb3Igc3R5bGVzLlxyXG4gICAgKiBEZXBlbmRlbmNpZXMgbmVlZGVkIGJ5IHRoZSBzdWJjbGFzc2VzIGFyZSBwYXNzZWQgdGhyb3VnaCB0aGUgY29uc3RydWN0b3IgYW5kXHJcbiAgICAqIGFyZSB0eXBpY2FsbHkgbWFkZSBhdmFpbGFibGUgdmlhIHRoaXMucHJvcHMgZm9yIHVzZSB3aXRoaW4gdGhpcyBtZXRob2QuXHJcbiAgICAqXHJcbiAgICAqIEBhYnN0cmFjdFxyXG4gICAgKiBAZXhhbXBsZVxyXG4gICAgKiAvLyBFeGFtcGxlIHN1YmNsYXNzIHRoYXQgdXNlcyBhIGRlcGVuZGVuY3kgcGFzc2VkIHRocm91Z2ggdGhlIGNvbnN0cnVjdG9yLlxyXG4gICAgKiBjbGFzcyBUb29sYmFyIGV4dGVuZHMgQmFzZVVJQ29tcG9uZW50IHtcclxuICAgICogICAgIGNvbnN0cnVjdG9yKGRlcGVuZGVuY3kpIHtcclxuICAgICogICAgICAgICBzdXBlcih7ZGVwZW5kZW5jeTogZGVwZW5kZW5jeX0pO1xyXG4gICAgKiAgICAgICAgIHRoaXMuZGVwZW5kZW5jeSA9IGRlcGVuZGVuY3k7XHJcbiAgICAqICAgICB9XHJcbiAgICAqXHJcbiAgICAqICAgICBpbml0KCk6IEhUTUxFbGVtZW50IHtcclxuICAgICogICAgICAgICBjb25zdCB0b29sYmFyRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgKiAgICAgICAgIHRvb2xiYXJFbGVtZW50LmNsYXNzTmFtZSA9ICd0b29sYmFyJztcclxuICAgICogICAgICAgICAvLyBVc2luZyB0aGUgZGVwZW5kZW5jeVxyXG4gICAgKiAgICAgICAgIHRvb2xiYXJFbGVtZW50LmF0dHJpYnV0ZShcImN1c3RvbURlcGVuZGVuY3lCYXNlZFwiLCB0aGlzLmRlcGVuZGVuY3kuZGF0YSk7XHJcbiAgICAqICAgXHJcbiAgICAqICAgICAgICAgcmV0dXJuIHRvb2xiYXJFbGVtZW50O1xyXG4gICAgKiAgICAgfVxyXG4gICAgKiB9XHJcbiAgICAqXHJcbiAgICAqIEByZXR1cm5zIHtIVE1MRWxlbWVudH0gVGhlIG5ld2x5IGNyZWF0ZWQgYW5kIGNvbmZpZ3VyZWQgSFRNTEVsZW1lbnQuXHJcbiAgICAqL1xyXG4gICAgYWJzdHJhY3QgaW5pdCgpOiBIVE1MRWxlbWVudDtcclxuXHJcbiAgICBnZXQgZGlzcGxheSgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiAnYmxvY2snO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgKiBBcHBlbmRzIHRoaXMgY29tcG9uZW50J3MgSFRNTCBlbGVtZW50IHRvIHRoZSBzcGVjaWZpZWQgcGFyZW50IGNvbXBvbmVudCdzIEhUTUwgZWxlbWVudC5cclxuICAgICogVGhpcyBtZXRob2QgZXN0YWJsaXNoZXMgYSBwYXJlbnQtY2hpbGQgcmVsYXRpb25zaGlwIGluIHRoZSBET00gYnkgYXBwZW5kaW5nIHRoaXMgaW5zdGFuY2Unc1xyXG4gICAgKiBlbGVtZW50IGFzIGEgY2hpbGQgb2YgdGhlIGdpdmVuIHBhcmVudCdzIGVsZW1lbnQuIEl0IGFsc28gdXBkYXRlcyB0aGUgcGFyZW50IHByb3BlcnR5IG9mIHRoaXNcclxuICAgICogaW5zdGFuY2UgdG8gcmVmZXIgdG8gdGhlIHByb3ZpZGVkIHBhcmVudCBjb21wb25lbnQuXHJcbiAgICAqXHJcbiAgICAqIEBwYXJhbSB7QmFzZVVJQ29tcG9uZW50fSBwYXJlbnQgVGhlIHBhcmVudCBjb21wb25lbnQgdG8gd2hpY2ggdGhpcyBjb21wb25lbnQncyBlbGVtZW50IHdpbGwgYmUgYXBwZW5kZWQuXHJcbiAgICAqIFRoaXMgc2hvdWxkIGJlIGFuIGluc3RhbmNlIG9mIEJhc2VVSUNvbXBvbmVudCBvciBhbnkgb2YgaXRzIHN1YmNsYXNzZXMsIGVuc3VyaW5nIHRoYXQgaXQgaGFzIGFuIGh0bWxFbGVtZW50IHByb3BlcnR5LlxyXG4gICAgKi9cclxuICAgIGFwcGVuZFRvKHBhcmVudDogQmFzZVVJQ29tcG9uZW50KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XHJcbiAgICAgICAgcGFyZW50Lmh0bWxFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuaHRtbEVsZW1lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBpc1Zpc2libGUoKSA6IGJvb2xlYW57XHJcbiAgICAgICAgbGV0IGVsZW1lbnQ6IEhUTUxFbGVtZW50ID0gdGhpcy5odG1sRWxlbWVudDtcclxuXHJcbiAgICAgICAgaWYgKGVsZW1lbnQuc3R5bGUuZGlzcGxheSA9PT0gJ25vbmUnIHx8IGVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9PT0gJ2hpZGRlbicgfHwgIWRvY3VtZW50LmNvbnRhaW5zKGVsZW1lbnQpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHdoaWxlIChlbGVtZW50KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWxlbWVudCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoc3R5bGUuZGlzcGxheSA9PT0gJ25vbmUnIHx8IHN0eWxlLnZpc2liaWxpdHkgPT09ICdoaWRkZW4nKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChlbGVtZW50LnBhcmVudEVsZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBlbGVtZW50LnBhcmVudEVsZW1lbnQ7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgc2hvdygpIHtcclxuICAgICAgICAvLyB0aGlzLl9jYW5IaWRlID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gdGhpcy5kaXNwbGF5O1xyXG5cclxuICAgICAgICAvLyBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAvLyAgICAgdGhpcy5fY2FuSGlkZSA9IHRydWU7XHJcbiAgICAgICAgLy8gfSwgMTAwKTtcclxuICAgIH1cclxuXHJcbiAgICBoaWRlKCkge1xyXG4gICAgICAgIC8vIGlmICghdGhpcy5fY2FuSGlkZSkge1xyXG5cclxuICAgICAgICAvLyAgICAgY29uc29sZS53YXJuKFwiQXR0ZW1wdGVkIHRvIGhpZGUgdGhlIGVsZW1lbnQgYmVmb3JlIDEwMCBtaWxsaXNlY29uZHMgaGF2ZSBwYXNzZWQgc2luY2UgdGhlIGxhc3QgZGlzcGxheS5cIik7XHJcbiAgICAgICAgLy8gICAgIC8vIHJldHVybjtcclxuICAgICAgICAvLyAgICAgLy8gdGhyb3cgbmV3IEVycm9yKFwiQXR0ZW1wdGVkIHRvIGhpZGUgdGhlIGVsZW1lbnQgYmVmb3JlIDEwMCBtaWxsaXNlY29uZHMgaGF2ZSBwYXNzZWQgc2luY2UgdGhlIGxhc3QgZGlzcGxheS5cIik7XHJcbiAgICAgICAgLy8gfVxyXG5cclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbiAgICB9XHJcblxyXG4gICAgbG9ja0hpZGUoKXtcclxuICAgICAgICB0aGlzLl9jYW5IaWRlID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgdW5sb2NrSGlkZSgpe1xyXG4gICAgICAgIHRoaXMuX2NhbkhpZGUgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBjYW5IaWRlKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9jYW5IaWRlICYmIHRoaXMuaXNWaXNpYmxlO1xyXG4gICAgfVxyXG5cclxuICAgIHNldCBjYW5IaWRlKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICAgICAgdGhpcy5fY2FuSGlkZSA9IHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIGZvY3VzKCkge1xyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuZm9jdXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBjaGFuZ2VDb2xvcih2YWx1ZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5zdHlsZS5jb2xvciA9IHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbW92ZUNvbG9yKCkge1xyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUuY29sb3IgPSBcImluaGVyaXRcIjtcclxuICAgIH1cclxuXHJcbiAgICBjaGFuZ2VWaXNpYmlsaXR5VG9WaXNpYmxlKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9IFwidmlzaWJsZVwiO1xyXG4gICAgfVxyXG5cclxuICAgIGNoYW5nZVZpc2liaWxpdHlUb0hpZGRlbigpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSBcImhpZGRlblwiO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBkb2VzRWxlbWVudE92ZXJmbG93U2NyZWVuKCk6IGJvb2xlYW4ge1xyXG5cclxuICAgICAgICBjb25zdCBvcmlnaW5hbERpc3BsYXkgPSB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLmRpc3BsYXk7XHJcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxWaXNpYmlsaXR5ID0gdGhpcy5odG1sRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5O1xyXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsUG9zaXRpb24gPSB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLnBvc2l0aW9uO1xyXG5cclxuICAgICAgICBpZiAob3JpZ2luYWxEaXNwbGF5ID09PSAnbm9uZScpIHtcclxuICAgICAgICAgICAgdGhpcy5odG1sRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcclxuICAgICAgICAgICAgdGhpcy5odG1sRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XHJcbiAgICAgICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZWxlbWVudFJlY3QgPSB0aGlzLmh0bWxFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICAgIGNvbnN0IHNjcmVlbldpZHRoID0gd2luZG93LmlubmVyV2lkdGg7XHJcblxyXG4gICAgICAgIGlmIChvcmlnaW5hbERpc3BsYXkgPT09ICdub25lJykge1xyXG4gICAgICAgICAgICB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSBvcmlnaW5hbERpc3BsYXk7XHJcbiAgICAgICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9IG9yaWdpbmFsVmlzaWJpbGl0eTtcclxuICAgICAgICAgICAgdGhpcy5odG1sRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9IG9yaWdpbmFsUG9zaXRpb247XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBlbGVtZW50UmlnaHRFZGdlID0gZWxlbWVudFJlY3QucmlnaHQ7XHJcblxyXG4gICAgICAgIGlmIChlbGVtZW50UmlnaHRFZGdlID4gc2NyZWVuV2lkdGgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoZWxlbWVudFJlY3QubGVmdCA8IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbn0iLCJleHBvcnQgY2xhc3MgRGVwZW5kZW5jeUNvbnRhaW5lciB7XHJcbiAgICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZTogRGVwZW5kZW5jeUNvbnRhaW5lciA9IG5ldyBEZXBlbmRlbmN5Q29udGFpbmVyKCk7XHJcbiAgICBwcml2YXRlIGRlcGVuZGVuY2llczogeyBba2V5OiBzdHJpbmddOiBGdW5jdGlvbiB9ID0ge307XHJcblxyXG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHt9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXQgSW5zdGFuY2UoKTogRGVwZW5kZW5jeUNvbnRhaW5lciB7XHJcbiAgICAgICAgcmV0dXJuIERlcGVuZGVuY3lDb250YWluZXIuaW5zdGFuY2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHJlZ2lzdGVyKGtleTogc3RyaW5nLCBjb25zdHJ1Y3RvcjogRnVuY3Rpb24pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmRlcGVuZGVuY2llc1trZXldID0gY29uc3RydWN0b3I7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHJlc29sdmU8VD4oa2V5OiBzdHJpbmcpOiBUIHtcclxuICAgICAgICBpZiAoIXRoaXMuZGVwZW5kZW5jaWVzW2tleV0pIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBEZXBlbmRlbmN5ICR7a2V5fSBub3QgZm91bmQuYCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLmRlcGVuZGVuY2llc1trZXldKCk7XHJcbiAgICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgRWxlbWVudEZhY3RvcnlTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL3NlcnZpY2VzL2VsZW1lbnQtZmFjdG9yeS9FbGVtZW50RmFjdG9yeVNlcnZpY2VcIjtcclxuaW1wb3J0IHsgQmFzZVVJQ29tcG9uZW50IH0gZnJvbSBcIi4uL2NvbW1vbi9CYXNlVUlDb21wb25lbnRcIjtcclxuaW1wb3J0IHsgSUVsZW1lbnRGYWN0b3J5U2VydmljZSB9IGZyb20gXCIuLi8uLi9zZXJ2aWNlcy9lbGVtZW50LWZhY3RvcnkvSUVsZW1lbnRGYWN0b3J5U2VydmljZVwiO1xyXG5pbXBvcnQgeyBDb250ZW50IH0gZnJvbSBcIi4uL2NvbnRlbnQvQ29udGVudFwiO1xyXG5pbXBvcnQgeyBUaXRsZSB9IGZyb20gXCIuLi90aXRsZS9UaXRsZVwiO1xyXG5pbXBvcnQgeyBJQmxvY2tPcGVyYXRpb25zU2VydmljZSB9IGZyb20gXCJAL3NlcnZpY2VzL2Jsb2NrLW9wZXJhdGlvbnMvSUJsb2NrT3BlcmF0aW9uc1NlcnZpY2VcIjtcclxuaW1wb3J0IHsgQWRkQmxvY2tXcmFwcGVyIH0gZnJvbSBcIi4uL2FkZC1ibG9jay9BZGRCbG9ja1dyYXBwZXJcIjtcclxuaW1wb3J0IHsgUXVpY2tNZW51IH0gZnJvbSBcIi4uL3F1aWNrLW1lbnUvUXVpY2tNZW51XCI7XHJcbmltcG9ydCB7IFRhYmxlQ29udGV4dEZsb2F0aW5nVG9vbGJhciB9IGZyb20gXCIuLi9mbG9hdGluZy10b29sYmFyL1RhYmxlQ29udGV4dEZsb2F0aW5nVG9vbGJhclwiO1xyXG5pbXBvcnQgeyBUZXh0Q29udGV4dEZsb2F0aW5nVG9vbGJhciB9IGZyb20gXCIuLi9mbG9hdGluZy10b29sYmFyL1RleHRDb250ZXh0RmxvYXRpbmdUb29sYmFyXCI7XHJcbmltcG9ydCB7IElNZW1lbnRvIH0gZnJvbSBcIkAvY29yZS9JTWVtZW50b1wiO1xyXG5pbXBvcnQgeyBEZXBlbmRlbmN5Q29udGFpbmVyIH0gZnJvbSBcIkAvY29yZS9EZXBlbmRlbmN5Q29udGFpbmVyXCI7XHJcbmltcG9ydCB7IE1lZGlhSW5wdXR0ZXIgfSBmcm9tIFwiLi4vbWVkaWEtaW5wdXR0ZXIvTWVkaWFJbnB1dHRlclwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIEVkaXRvciBleHRlbmRzIEJhc2VVSUNvbXBvbmVudCB7XHJcblxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBlbGVtZW50RmFjdG9yeVNlcnZpY2U6IElFbGVtZW50RmFjdG9yeVNlcnZpY2U7XHJcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBlZGl0b3JJZDogc3RyaW5nID0gXCJqb2hhbm5lc0VkaXRvclwiO1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IEVkaXRvcjtcclxuICAgIHByaXZhdGUgbWVtZW50bzogSU1lbWVudG87XHJcblxyXG4gICAgcHJpdmF0ZSB0aXRsZT86IFRpdGxlO1xyXG4gICAgcHJpdmF0ZSBjb250ZW50PzogQ29udGVudDtcclxuICAgIHByaXZhdGUgYWRkQmxvY2s6IEFkZEJsb2NrV3JhcHBlcjtcclxuICAgIHByaXZhdGUgdGV4dEZsb2F0aW5nVG9vbGJhcjogVGV4dENvbnRleHRGbG9hdGluZ1Rvb2xiYXI7XHJcbiAgICBwcml2YXRlIHF1aWNrTWVudTogUXVpY2tNZW51O1xyXG4gICAgcHJpdmF0ZSB0YWJsZUNvbnRleHRUb29sYmFyOiBUYWJsZUNvbnRleHRGbG9hdGluZ1Rvb2xiYXI7XHJcbiAgICBwcml2YXRlIG1lZGlhSW5wdXR0ZXI6IE1lZGlhSW5wdXR0ZXI7XHJcblxyXG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihcclxuICAgICAgICBlbGVtZW50RmFjdG9yeVNlcnZpY2U6IElFbGVtZW50RmFjdG9yeVNlcnZpY2UsXHJcbiAgICAgICAgYmxvY2tPcGVyYXRpb25zU2VydmljZTogSUJsb2NrT3BlcmF0aW9uc1NlcnZpY2UsXHJcbiAgICAgICAgbWVtZW50bzogSU1lbWVudG8sXHJcbiAgICAgICAgdGl0bGU6IFRpdGxlLFxyXG4gICAgICAgIGNvbnRlbnQ6IENvbnRlbnQsXHJcbiAgICAgICAgYWRkQmxvY2s6IEFkZEJsb2NrV3JhcHBlcixcclxuICAgICAgICBmbG9hdGluZ1Rvb2xiYXI6IFRleHRDb250ZXh0RmxvYXRpbmdUb29sYmFyLFxyXG4gICAgICAgIHF1aWNrTWVudTogUXVpY2tNZW51LFxyXG4gICAgICAgIHRhYmxlVG9vbGJhcjogVGFibGVDb250ZXh0RmxvYXRpbmdUb29sYmFyLFxyXG4gICAgICAgIG1lZGlhSW5wdXR0ZXI6IE1lZGlhSW5wdXR0ZXJcclxuXHJcbiAgICApIHtcclxuXHJcbiAgICAgICAgc3VwZXIoe1xyXG4gICAgICAgICAgICBlbGVtZW50RmFjdG9yeVNlcnZpY2U6IGVsZW1lbnRGYWN0b3J5U2VydmljZSxcclxuICAgICAgICAgICAgYmxvY2tPcGVyYXRpb25zU2VydmljZTogYmxvY2tPcGVyYXRpb25zU2VydmljZSxcclxuICAgICAgICAgICAgdGl0bGU6IHRpdGxlLFxyXG4gICAgICAgICAgICBjb250ZW50OiBjb250ZW50LFxyXG4gICAgICAgICAgICBhZGRCbG9jazogYWRkQmxvY2ssXHJcbiAgICAgICAgICAgIGZsb2F0aW5nVG9vbGJhcjogZmxvYXRpbmdUb29sYmFyLFxyXG4gICAgICAgICAgICBxdWlja01lbnU6IHF1aWNrTWVudSxcclxuICAgICAgICAgICAgdGFibGVUb29sYmFyOiB0YWJsZVRvb2xiYXIsXHJcbiAgICAgICAgICAgIG1lZGlhSW5wdXR0ZXI6IG1lZGlhSW5wdXR0ZXJcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaWYgKEVkaXRvci5pbnN0YW5jZSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVc2UgQmxvY2tPcGVyYXRpb25zU2VydmljZS5nZXRJbnN0YW5jZSgpIHRvIGdldCBpbnN0YW5jZS5cIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmVsZW1lbnRGYWN0b3J5U2VydmljZSA9IGVsZW1lbnRGYWN0b3J5U2VydmljZTtcclxuICAgICAgICB0aGlzLm1lbWVudG8gPSBtZW1lbnRvO1xyXG4gICAgICAgIHRoaXMuYWRkQmxvY2sgPSBhZGRCbG9jaztcclxuICAgICAgICB0aGlzLnRleHRGbG9hdGluZ1Rvb2xiYXIgPSBmbG9hdGluZ1Rvb2xiYXI7XHJcbiAgICAgICAgdGhpcy5xdWlja01lbnUgPSBxdWlja01lbnU7XHJcbiAgICAgICAgdGhpcy50YWJsZUNvbnRleHRUb29sYmFyID0gdGFibGVUb29sYmFyO1xyXG4gICAgICAgIHRoaXMubWVkaWFJbnB1dHRlciA9IG1lZGlhSW5wdXR0ZXI7XHJcblxyXG4gICAgICAgIHRoaXMuYXR0YWNoRXZlbnRzKCk7XHJcblxyXG4gICAgICAgIEVkaXRvci5pbnN0YW5jZSA9IHRoaXM7XHJcblxyXG4gICAgICAgIHRoaXMubWVtZW50by5zYXZlU3RhdGUoKTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0KCk6IEhUTUxFbGVtZW50IHtcclxuXHJcbiAgICAgICAgY29uc3QgaHRtbEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChFZGl0b3IuZWRpdG9ySWQpIHx8IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcblxyXG4gICAgICAgIGh0bWxFbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJqb2hhbm5lcy1lZGl0b3JcIik7XHJcblxyXG4gICAgICAgIGlmICh3aW5kb3cuZWRpdG9yQ29uZmlnPy5lbmFibGVUaXRsZSB8fCB0cnVlKSB7XHJcbiAgICAgICAgICAgIGh0bWxFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMucHJvcHMudGl0bGUuaHRtbEVsZW1lbnQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gQ29udGVudCBpcyByZXF1aXJlZFxyXG4gICAgICAgIGh0bWxFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMucHJvcHMuY29udGVudC5odG1sRWxlbWVudCk7XHJcblxyXG4gICAgICAgIGlmICh3aW5kb3cuZWRpdG9yQ29uZmlnPy5lbmFibGVBZGRCbG9jayB8fCB0cnVlKSB7XHJcbiAgICAgICAgICAgIGh0bWxFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMucHJvcHMuYWRkQmxvY2suaHRtbEVsZW1lbnQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHdpbmRvdy5lZGl0b3JDb25maWc/LmVuYWJsZUZsb2F0aW5nVG9vbGJhciB8fCB0cnVlKSB7XHJcbiAgICAgICAgICAgIGh0bWxFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMucHJvcHMuZmxvYXRpbmdUb29sYmFyLmh0bWxFbGVtZW50KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh3aW5kb3cuZWRpdG9yQ29uZmlnPy5lbmFibGVRdWlja01lbnUgfHwgdHJ1ZSkge1xyXG4gICAgICAgICAgICBodG1sRWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLnByb3BzLnF1aWNrTWVudS5odG1sRWxlbWVudCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBodG1sRWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLnByb3BzLnRhYmxlVG9vbGJhci5odG1sRWxlbWVudCk7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5wcm9wcy5tZWRpYUlucHV0dGVyLmh0bWxFbGVtZW50KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGh0bWxFbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBnZXRJbnN0YW5jZShcclxuICAgICAgICB0aXRsZTogVGl0bGUsXHJcbiAgICAgICAgY29udGVudDogQ29udGVudCxcclxuICAgICAgICBhZGRCbG9jazogQWRkQmxvY2tXcmFwcGVyLFxyXG4gICAgICAgIHRleHRGbG9hdGluZ1Rvb2xiYXI6IFRleHRDb250ZXh0RmxvYXRpbmdUb29sYmFyLFxyXG4gICAgICAgIHF1aWNrTWVudTogUXVpY2tNZW51LFxyXG4gICAgICAgIHRhYmxlRmxvYXRpbmdUb29sYmFyOiBUYWJsZUNvbnRleHRGbG9hdGluZ1Rvb2xiYXIsXHJcbiAgICAgICAgbWVkaWFJbnB1dHRlcjogTWVkaWFJbnB1dHRlcikge1xyXG5cclxuICAgICAgICBjb25zdCBlbGVtZW50RmFjdG9yeVNlcnZpY2UgPSBEZXBlbmRlbmN5Q29udGFpbmVyLkluc3RhbmNlLnJlc29sdmU8SUVsZW1lbnRGYWN0b3J5U2VydmljZT4oXCJJRWxlbWVudEZhY3RvcnlTZXJ2aWNlXCIpO1xyXG4gICAgICAgIGNvbnN0IGJsb2NrT3BlcmF0aW9uc1NlcnZpY2UgPSBEZXBlbmRlbmN5Q29udGFpbmVyLkluc3RhbmNlLnJlc29sdmU8SUJsb2NrT3BlcmF0aW9uc1NlcnZpY2U+KFwiSUJsb2NrT3BlcmF0aW9uc1NlcnZpY2VcIik7XHJcbiAgICAgICAgY29uc3QgbWVtZW50byA9IERlcGVuZGVuY3lDb250YWluZXIuSW5zdGFuY2UucmVzb2x2ZTxJTWVtZW50bz4oXCJJTWVtZW50b1wiKTtcclxuXHJcbiAgICAgICAgaWYgKCFFZGl0b3IuaW5zdGFuY2UpIHtcclxuICAgICAgICAgICAgRWRpdG9yLmluc3RhbmNlID0gbmV3IEVkaXRvcihlbGVtZW50RmFjdG9yeVNlcnZpY2UsIGJsb2NrT3BlcmF0aW9uc1NlcnZpY2UsIG1lbWVudG8sIHRpdGxlLCBjb250ZW50LCBhZGRCbG9jaywgdGV4dEZsb2F0aW5nVG9vbGJhciwgcXVpY2tNZW51LCB0YWJsZUZsb2F0aW5nVG9vbGJhciwgbWVkaWFJbnB1dHRlcik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gRWRpdG9yLmluc3RhbmNlO1xyXG4gICAgfVxyXG5cclxuICAgIGF0dGFjaEV2ZW50cygpIHtcclxuXHJcbiAgICAgICAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoRWRpdG9yLmVkaXRvcklkKTtcclxuXHJcbiAgICAgICAgY29udGFpbmVyPy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW92ZXInLCAoZXZlbnQpID0+IHtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldDtcclxuXHJcbiAgICAgICAgICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBOb2RlKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgZWxlbWVudCA9IHRhcmdldCBhcyBOb2RlO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50Lm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBlbGVtZW50LnBhcmVudEVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBFbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYmxvY2tFbGVtZW50ID0gZWxlbWVudC5jbG9zZXN0KCcuYmxvY2snKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJsb2NrRWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcGVuZERyYWdIYW5kbGVyKGJsb2NrRWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFdmVudCB0YXJnZXQgaXMgbm90IGFuIEhUTUxFbGVtZW50IGFuZCBjYW5ub3QgaGFuZGxlIEhUTUxFbGVtZW50IHNwZWNpZmljIG1ldGhvZHM6JywgZWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFdmVudCB0YXJnZXQgaXMgbm90IGEgTm9kZTonLCB0YXJnZXQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vRm9jdXMgb24gdGhlIGZpcnN0IHBhcmFncmFwaFxyXG4gICAgICAgIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnbG9hZGluZycpIHtcclxuICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsICgpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGZpcnN0UGFyYWdyYXBoID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiNqb2hhbm5lc0VkaXRvciA+IC5jb250ZW50IC5ibG9jayBwXCIpIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgICAgICAgICAgaWYgKGZpcnN0UGFyYWdyYXBoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmlyc3RQYXJhZ3JhcGguZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgZmlyc3RQYXJhZ3JhcGggPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiI2pvaGFubmVzRWRpdG9yID4gLmNvbnRlbnQgLmJsb2NrIHBcIikgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgICAgIGlmIChmaXJzdFBhcmFncmFwaCkge1xyXG4gICAgICAgICAgICAgICAgZmlyc3RQYXJhZ3JhcGguZm9jdXMoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigncGFzdGUnLCBmdW5jdGlvbiAoZXZlbnQ6IENsaXBib2FyZEV2ZW50KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICAgICAgaWYgKHRhcmdldC5nZXRBdHRyaWJ1dGUoJ2NvbnRlbnRlZGl0YWJsZScpID09PSAndHJ1ZScpIHtcclxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgY2xpcGJvYXJkRGF0YSA9IGV2ZW50LmNsaXBib2FyZERhdGE7XHJcbiAgICAgICAgICAgICAgICBpZiAoY2xpcGJvYXJkRGF0YSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRleHQgPSBjbGlwYm9hcmREYXRhLmdldERhdGEoJ3RleHQvcGxhaW4nKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgRWRpdG9yLmluc2VydFRleHRBdEN1cnNvcih0ZXh0KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sIHRydWUpO1xyXG5cclxuXHJcbiAgICAgICAgdGhpcy5hdHRhY2hEcmFnSGFuZGxlcigpO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgaW5zZXJ0VGV4dEF0Q3Vyc29yKHRleHQ6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHNlbCA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcclxuXHJcbiAgICAgICAgaWYgKHNlbCkge1xyXG4gICAgICAgICAgICBpZiAoc2VsLnJhbmdlQ291bnQgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByYW5nZSA9IHNlbC5nZXRSYW5nZUF0KDApO1xyXG4gICAgICAgICAgICAgICAgcmFuZ2UuZGVsZXRlQ29udGVudHMoKTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCB0ZXh0Tm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRleHQpO1xyXG4gICAgICAgICAgICAgICAgcmFuZ2UuaW5zZXJ0Tm9kZSh0ZXh0Tm9kZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgcmFuZ2Uuc2V0U3RhcnRBZnRlcih0ZXh0Tm9kZSk7XHJcbiAgICAgICAgICAgICAgICByYW5nZS5zZXRFbmRBZnRlcih0ZXh0Tm9kZSk7XHJcbiAgICAgICAgICAgICAgICBzZWwucmVtb3ZlQWxsUmFuZ2VzKCk7XHJcbiAgICAgICAgICAgICAgICBzZWwuYWRkUmFuZ2UocmFuZ2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFwcGVuZERyYWdIYW5kbGVyKGVsZW1lbnQ6IE5vZGUpOiB2b2lkIHtcclxuICAgICAgICBpZiAoZWxlbWVudC5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUpIHtcclxuICAgICAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZSBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcignUHJvdmlkZWQgZWxlbWVudCBpcyBub3QgYW4gSFRNTEVsZW1lbnQ6JywgZWxlbWVudCk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHBhcmVudCA9IGVsZW1lbnQuY2xvc2VzdCgnLmJsb2NrJyk7XHJcbiAgICAgICAgbGV0IGRyYWdIYW5kbGVyID0gcGFyZW50Py5xdWVyeVNlbGVjdG9yKFwiLmRyYWctaGFuZGxlclwiKTtcclxuXHJcbiAgICAgICAgaWYgKCFkcmFnSGFuZGxlciAmJiBwYXJlbnQpIHtcclxuICAgICAgICAgICAgZHJhZ0hhbmRsZXIgPSB0aGlzLmVsZW1lbnRGYWN0b3J5U2VydmljZS5jcmVhdGUoRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuRFJBR19IQU5ETEVfQlVUVE9OKTtcclxuICAgICAgICAgICAgcGFyZW50LnByZXBlbmQoZHJhZ0hhbmRsZXIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZW1vdmVEcmFnSGFuZGxlcihlbGVtZW50OiBOb2RlKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKGVsZW1lbnQubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XHJcbiAgICAgICAgICAgIGVsZW1lbnQgPSBlbGVtZW50LnBhcmVudE5vZGUgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIShlbGVtZW50IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1Byb3ZpZGVkIGVsZW1lbnQgaXMgbm90IGFuIEhUTUxFbGVtZW50OicsIGVsZW1lbnQpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBwYXJlbnQgPSBlbGVtZW50LmNsb3Nlc3QoJy5ibG9jaycpO1xyXG4gICAgICAgIGlmIChwYXJlbnQpIHtcclxuICAgICAgICAgICAgY29uc3QgZHJhZ0hhbmRsZXIgPSBwYXJlbnQucXVlcnlTZWxlY3RvcihcIi5kcmFnLWhhbmRsZXJcIik7XHJcbiAgICAgICAgICAgIGRyYWdIYW5kbGVyPy5yZW1vdmUoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZXh0cmFjdENvbnRlbnQoKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm90IGltcGxlbWVudGVkIEV4Y2VwdGlvblwiKTtcclxuICAgIH1cclxuXHJcblxyXG5cclxuICAgIGF0dGFjaERyYWdIYW5kbGVyKCkge1xyXG4gICAgICAgIGxldCBkcmFnZ2VkSXRlbTogYW55ID0gbnVsbDtcclxuXHJcbiAgICAgICAgbGV0IGRyb3BMaW5lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgZHJvcExpbmUuY2xhc3NMaXN0LmFkZCgnZHJvcC1saW5lJyk7XHJcbiAgICAgICAgZHJvcExpbmUuc3R5bGUuaGVpZ2h0ID0gJzJweCc7XHJcbiAgICAgICAgZHJvcExpbmUuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuXHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdkcmFnc3RhcnQnLCAoZXZlbnQpID0+IHtcclxuICAgICAgICAgICAgaWYgKChldmVudC50YXJnZXQgYXMgRWxlbWVudCk/LmNsYXNzTGlzdD8uY29udGFpbnMoJ2RyYWctaGFuZGxlcicpKSB7XHJcbiAgICAgICAgICAgICAgICBkcmFnZ2VkSXRlbSA9IChldmVudC50YXJnZXQgYXMgRWxlbWVudCk/LmNsb3Nlc3QoJy5ibG9jaycpO1xyXG4gICAgICAgICAgICAgICAgZHJhZ2dlZEl0ZW0uc2V0QXR0cmlidXRlKCdkcmFnZ2FibGUnLCAndHJ1ZScpO1xyXG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgZHJhZ2dlZEl0ZW0uc3R5bGUub3BhY2l0eSA9ICcwLjUnO1xyXG4gICAgICAgICAgICAgICAgfSwgMCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdkcmFnZW5kJywgKCkgPT4ge1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChkcmFnZ2VkSXRlbSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGRyYWdnZWRJdGVtLnN0eWxlLm9wYWNpdHkgPSAnJztcclxuICAgICAgICAgICAgICAgICAgICBkcmFnZ2VkSXRlbS5yZW1vdmVBdHRyaWJ1dGUoJ2RyYWdnYWJsZScpO1xyXG4gICAgICAgICAgICAgICAgICAgIGRyYWdnZWRJdGVtID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGRyb3BMaW5lLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICB9LCAwKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdkcmFnb3ZlcicsIChldmVudCkgPT4ge1xyXG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICBsZXQgdGFyZ2V0ID0gKGV2ZW50LnRhcmdldCBhcyBFbGVtZW50KT8uY2xvc2VzdCgnLmJsb2NrJyk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGFyZ2V0ICYmIHRhcmdldCAhPT0gZHJhZ2dlZEl0ZW0pIHtcclxuICAgICAgICAgICAgICAgIGxldCBib3VuZGluZyA9IHRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgICAgICAgICAgIGxldCBvZmZzZXQgPSBib3VuZGluZy55ICsgYm91bmRpbmcuaGVpZ2h0IC8gMjtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoKGV2ZW50IGFzIE1vdXNlRXZlbnQpLmNsaWVudFkgPiBvZmZzZXQpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0Lm5leHRFbGVtZW50U2libGluZyAhPT0gZHJvcExpbmUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0Lmluc2VydEFkamFjZW50RWxlbWVudCgnYWZ0ZXJlbmQnLCBkcm9wTGluZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0LnByZXZpb3VzRWxlbWVudFNpYmxpbmcgIT09IGRyb3BMaW5lKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldC5pbnNlcnRBZGphY2VudEVsZW1lbnQoJ2JlZm9yZWJlZ2luJywgZHJvcExpbmUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZHJvcExpbmUuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZHJvcCcsIChldmVudCkgPT4ge1xyXG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICBpZiAoZHJhZ2dlZEl0ZW0gJiYgZHJvcExpbmUgJiYgZHJvcExpbmUucGFyZW50RWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgZHJvcExpbmUucGFyZW50RWxlbWVudC5pbnNlcnRCZWZvcmUoZHJhZ2dlZEl0ZW0sIGRyb3BMaW5lKTtcclxuICAgICAgICAgICAgICAgIGRyb3BMaW5lLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn0iLCJleHBvcnQgY2xhc3MgRE9NVXRpbHMge1xyXG5cclxuXHJcbiAgICBzdGF0aWMgaXNTZWxlY3Rpb25JblRhYmxlQ2VsbCgpIHtcclxuICAgICAgICBsZXQgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG4gICAgICAgIGlmICghc2VsZWN0aW9uPy5yYW5nZUNvdW50KSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgIGxldCBub2RlID0gc2VsZWN0aW9uLmFuY2hvck5vZGU7XHJcbiAgICAgICAgd2hpbGUgKG5vZGUpIHtcclxuICAgICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoKG5vZGUgYXMgRWxlbWVudCkudGFnTmFtZSA9PT0gJ1REJyB8fCAobm9kZSBhcyBFbGVtZW50KS50YWdOYW1lID09PSAnVEgnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7ICAvLyBUaGUgc2VsZWN0aW9uIHN0YXJ0cyBpbnNpZGUgYSB0YWJsZSBjZWxsXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTsgIC8vIE1vdmUgdXAgaW4gdGhlIERPTSB0cmVlXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTsgIC8vIFNlbGVjdGlvbiBpcyBub3QgaW5zaWRlIGEgdGFibGUgY2VsbFxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGlzIGF0IHRoZSBzdGFydCBvciBlbmQgb2YgYSBjb250ZW50ZWRpdGFibGUgZWxlbWVudC5cclxuICAgICogVGhpcyBmdW5jdGlvbiB3YXMgYWRhcHRlZCBmcm9tIGEgU3RhY2tPdmVyZmxvdyBhbnN3ZXIuXHJcbiAgICAqXHJcbiAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsIC0gVGhlIGNvbnRlbnRlZGl0YWJsZSBlbGVtZW50IHRvIGNoZWNrLlxyXG4gICAgKiBAcmV0dXJucyB7T2JqZWN0fSBBbiBvYmplY3QgY29udGFpbmluZyB0d28gYm9vbGVhbiBwcm9wZXJ0aWVzOiBgYXRTdGFydGAgYW5kIGBhdEVuZGAuXHJcbiAgICAqXHJcbiAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzc0NTE0NjgvY29udGVudGVkaXRhYmxlLWRpdi1ob3ctY2FuLWktZGV0ZXJtaW5lLWlmLXRoZS1jdXJzb3ItaXMtYXQtdGhlLXN0YXJ0LW9yLWVuZC1vI2Fuc3dlci03NDc4NDIwfFN0YWNrT3ZlcmZsb3cgUmVzcG9uc2V9XHJcbiAgICAqIEBleGFtcGxlXHJcbiAgICAqIC8vIFJldHVybnMgeyBhdFN0YXJ0OiB0cnVlLCBhdEVuZDogZmFsc2UgfSBpZiB0aGUgY3Vyc29yIGlzIGF0IHRoZSBzdGFydCBvZiB0aGUgZWxlbWVudCwgYnV0IG5vdCBhdCB0aGUgZW5kLlxyXG4gICAgKiBjb25zdCByZXN1bHQgPSBnZXRTZWxlY3Rpb25UZXh0SW5mbyhkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdGFibGUnKSk7XHJcbiAgICAqL1xyXG4gICAgc3RhdGljIGdldFNlbGVjdGlvblRleHRJbmZvKGVsOiBIVE1MRWxlbWVudCk6IHsgYXRTdGFydDogYm9vbGVhbjsgYXRFbmQ6IGJvb2xlYW4gfSB7XHJcblxyXG4gICAgICAgIGxldCBhdFN0YXJ0ID0gZmFsc2UsIGF0RW5kID0gZmFsc2U7XHJcblxyXG4gICAgICAgIGlmIChlbC50ZXh0Q29udGVudCA9PSBcIlwiKSB7XHJcbiAgICAgICAgICAgIGF0U3RhcnQgPSB0cnVlO1xyXG4gICAgICAgICAgICBhdEVuZCA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4geyBhdFN0YXJ0LCBhdEVuZCB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgc2VsUmFuZ2U6IFJhbmdlLCB0ZXN0UmFuZ2U6IFJhbmdlO1xyXG5cclxuICAgICAgICBjb25zdCBzZWwgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgICAgICAgaWYgKHNlbCAmJiBzZWwucmFuZ2VDb3VudCA+IDApIHtcclxuICAgICAgICAgICAgc2VsUmFuZ2UgPSBzZWwuZ2V0UmFuZ2VBdCgwKTtcclxuICAgICAgICAgICAgdGVzdFJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcclxuXHJcbiAgICAgICAgICAgIHRlc3RSYW5nZS5zZWxlY3ROb2RlQ29udGVudHMoZWwpO1xyXG4gICAgICAgICAgICB0ZXN0UmFuZ2Uuc2V0RW5kKHNlbFJhbmdlLnN0YXJ0Q29udGFpbmVyLCBzZWxSYW5nZS5zdGFydE9mZnNldCk7XHJcbiAgICAgICAgICAgIGF0U3RhcnQgPSB0ZXN0UmFuZ2UudG9TdHJpbmcoKSA9PT0gXCJcIjtcclxuXHJcbiAgICAgICAgICAgIHRlc3RSYW5nZS5zZWxlY3ROb2RlQ29udGVudHMoZWwpO1xyXG4gICAgICAgICAgICB0ZXN0UmFuZ2Uuc2V0U3RhcnQoc2VsUmFuZ2UuZW5kQ29udGFpbmVyLCBzZWxSYW5nZS5lbmRPZmZzZXQpO1xyXG4gICAgICAgICAgICBhdEVuZCA9IHRlc3RSYW5nZS50b1N0cmluZygpID09PSBcIlwiO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHsgYXRTdGFydCwgYXRFbmQgfTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICogSW5zZXJ0cyBhIG5ldyBub2RlIGludG8gdGhlIERPTSBpbW1lZGlhdGVseSBhZnRlciBhIHNwZWNpZmllZCByZWZlcmVuY2Ugbm9kZS5cclxuICAgICogVGhpcyBmdW5jdGlvbiBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsIGZvciBkeW5hbWljYWxseSBtb2RpZnlpbmcgdGhlIGRvY3VtZW50IHN0cnVjdHVyZSBieSBhZGRpbmcgbmV3IGNvbnRlbnRcclxuICAgICogb3IgY29tcG9uZW50cyBpbiByZWxhdGlvbiB0byBleGlzdGluZyBlbGVtZW50cy5cclxuICAgICpcclxuICAgICogQHBhcmFtIHtOb2RlfSBuZXdOb2RlIC0gVGhlIG5ldyBub2RlIHRvIGJlIGluc2VydGVkIGludG8gdGhlIERPTS5cclxuICAgICogQHBhcmFtIHtOb2RlfSByZWZlcmVuY2VOb2RlIC0gVGhlIG5vZGUgYWZ0ZXIgd2hpY2ggdGhlIG5ldyBub2RlIHNob3VsZCBiZSBpbnNlcnRlZC5cclxuICAgICogQHJldHVybnMge3ZvaWR9IFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcmV0dXJuIGEgdmFsdWU7IGl0IHBlcmZvcm1zIGEgRE9NIG1hbmlwdWxhdGlvbiBvcGVyYXRpb24uXHJcbiAgICAqXHJcbiAgICAqIEBleGFtcGxlXHJcbiAgICAqIC8vIFN1cHBvc2UgeW91IHdhbnQgdG8gaW5zZXJ0IGEgbmV3IHBhcmFncmFwaCBhZnRlciBhbiBleGlzdGluZyBkaXYgZWxlbWVudDpcclxuICAgICogY29uc3QgbmV3UGFyYWdyYXBoID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgncCcpO1xyXG4gICAgKiBuZXdQYXJhZ3JhcGgudGV4dENvbnRlbnQgPSAnSGVsbG8sIHdvcmxkISc7XHJcbiAgICAqIGNvbnN0IHJlZmVyZW5jZURpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdteURpdicpO1xyXG4gICAgKiBpbnNlcnRBZnRlcihuZXdQYXJhZ3JhcGgsIHJlZmVyZW5jZURpdik7XHJcbiAgICAqXHJcbiAgICAqIEBkZXNjcmlwdGlvblxyXG4gICAgKiBUaGlzIGZ1bmN0aW9uIGNoZWNrcyBpZiB0aGUgcmVmZXJlbmNlTm9kZSBoYXMgYSBwYXJlbnQgbm9kZS4gSWYgYSBwYXJlbnQgbm9kZSBleGlzdHMsIGl0IHVzZXNcclxuICAgICogYHBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKClgIHRvIGluc2VydCB0aGUgbmV3Tm9kZSBpbnRvIHRoZSBET00gcmlnaHQgYWZ0ZXIgdGhlIHJlZmVyZW5jZU5vZGUuXHJcbiAgICAqIFRoaXMgaXMgYWNoaWV2ZWQgYnkgc3BlY2lmeWluZyBgcmVmZXJlbmNlTm9kZS5uZXh0U2libGluZ2AgYXMgdGhlIHNlY29uZCBwYXJhbWV0ZXIgdG8gYGluc2VydEJlZm9yZSgpYCxcclxuICAgICogd2hpY2ggZWZmZWN0aXZlbHkgcGxhY2VzIHRoZSBuZXdOb2RlIGRpcmVjdGx5IGFmdGVyIHRoZSByZWZlcmVuY2VOb2RlIGluIHRoZSBkb2N1bWVudCdzIHN0cnVjdHVyZS5cclxuICAgICogSWYgdGhlIHJlZmVyZW5jZU5vZGUgaGFzIG5vIHBhcmVudCwgdGhlIGZ1bmN0aW9uIGRvZXMgbm90aGluZywgYXMgaW5zZXJ0aW9uIGlzIG5vdCBwb3NzaWJsZS5cclxuICAgICovXHJcbiAgICBzdGF0aWMgaW5zZXJ0QWZ0ZXIobmV3Tm9kZTogTm9kZSwgcmVmZXJlbmNlTm9kZTogTm9kZSkge1xyXG4gICAgICAgIGlmIChyZWZlcmVuY2VOb2RlLnBhcmVudE5vZGUpIHtcclxuICAgICAgICAgICAgcmVmZXJlbmNlTm9kZS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShuZXdOb2RlLCByZWZlcmVuY2VOb2RlLm5leHRTaWJsaW5nKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAqIENoZWNrcyBpZiBhIGdpdmVuIERPTSBOb2RlIGhhcyBhbnkgdmlzaWJsZSB0ZXh0IGNvbnRlbnQuIFRoZSBmdW5jdGlvbiBjb25zaWRlcnMgdGV4dCBjb250ZW50IGRpcmVjdGx5IHdpdGhpbiB0aGUgbm9kZVxyXG4gICAgKiBhcyB3ZWxsIGFzIHJlY3Vyc2l2ZWx5IGNoZWNraW5nIGFsbCBjaGlsZCBub2Rlcy4gVGhpcyBpcyB1c2VmdWwgZm9yIGRldGVybWluaW5nIGlmIGFuIGVsZW1lbnQgb3IgYW55IHBhcnQgb2YgYSBzdWJ0cmVlXHJcbiAgICAqIGhhcyB0ZXh0dWFsIHNpZ25pZmljYW5jZSwgd2hpY2ggbWlnaHQgYWZmZWN0IGRpc3BsYXkgbG9naWMsIHZhbGlkYXRpb24sIG9yIHByb2Nlc3NpbmcuXHJcbiAgICAqXHJcbiAgICAqIEBwYXJhbSB7Tm9kZX0gbm9kZSAtIFRoZSBET00gTm9kZSB0byBjaGVjayBmb3IgdGV4dCBjb250ZW50LlxyXG4gICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgbm9kZSBpdHNlbGYgb3IgYW55IG9mIGl0cyBjaGlsZHJlbiBoYXMgbm9uLWVtcHR5IHRleHQgY29udGVudCwgb3RoZXJ3aXNlIGZhbHNlLlxyXG4gICAgKlxyXG4gICAgKiBAZXhhbXBsZVxyXG4gICAgKiAvLyBTdXBwb3NlIHlvdSB3YW50IHRvIGNoZWNrIGlmIGEgcGFyYWdyYXBoIGVsZW1lbnQgaXMgZW1wdHkgb3Igbm90OlxyXG4gICAgKiBjb25zdCBwYXJhZ3JhcGggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhhbXBsZVBhcmFncmFwaCcpO1xyXG4gICAgKiBjb25zdCBoYXNDb250ZW50ID0gaGFzVGV4dENvbnRlbnQocGFyYWdyYXBoKTtcclxuICAgICogY29uc29sZS5sb2coJ0RvZXMgdGhlIHBhcmFncmFwaCBoYXZlIGNvbnRlbnQ/JywgaGFzQ29udGVudCk7XHJcbiAgICAqXHJcbiAgICAqIEBkZXNjcmlwdGlvblxyXG4gICAgKiBUaGlzIGZ1bmN0aW9uIGZpcnN0IGNoZWNrcyB0aGUgdGV4dCBjb250ZW50IG9mIHRoZSBub2RlIGl0c2VsZi4gSWYgdGhlIG5vZGUncyB0ZXh0Q29udGVudCwgd2hlbiB0cmltbWVkLCBpcyBub3QgYW4gZW1wdHkgc3RyaW5nLFxyXG4gICAgKiB0aGUgZnVuY3Rpb24gcmV0dXJucyB0cnVlLCBpbmRpY2F0aW5nIHRoZSBwcmVzZW5jZSBvZiB2aXNpYmxlIHRleHQuIElmIHRoZSBpbml0aWFsIGNoZWNrIGZhaWxzLCB0aGUgZnVuY3Rpb24gdGhlbiByZWN1cnNpdmVseVxyXG4gICAgKiBjaGVja3MgZWFjaCBjaGlsZCBub2RlIHRvIGRldGVybWluZSBpZiBhbnkgY2hpbGQgY29udGFpbnMgdmlzaWJsZSB0ZXh0LiBUaGlzIHJlY3Vyc2lvbiBlbnN1cmVzIHRoYXQgZXZlbiBkZWVwbHkgbmVzdGVkIHRleHQgbm9kZXNcclxuICAgICogdGhhdCBjb250cmlidXRlIHRvIHRoZSB2aXNpYmxlIGNvbnRlbnQgYXJlIGFjY291bnRlZCBmb3IuIFRoZSBmdW5jdGlvbiByZXR1cm5zIHRydWUgYXQgdGhlIGZpcnN0IGluc3RhbmNlIG9mIGZpbmRpbmcgdmlzaWJsZSB0ZXh0LFxyXG4gICAgKiBvcHRpbWl6aW5nIHRoZSBzZWFyY2ggcHJvY2VzcyB3aXRoaW4gcG90ZW50aWFsbHkgbGFyZ2UgRE9NIHN0cnVjdHVyZXMuXHJcbiAgICAqL1xyXG4gICAgc3RhdGljIGhhc1RleHRDb250ZW50KG5vZGU6IE5vZGUpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gbm9kZS50ZXh0Q29udGVudD8udHJpbSgpICE9PSAnJyB8fFxyXG4gICAgICAgICAgICAobm9kZS5oYXNDaGlsZE5vZGVzKCkgJiYgQXJyYXkuZnJvbShub2RlLmNoaWxkTm9kZXMpLnNvbWUoY2hpbGROb2RlID0+IHRoaXMuaGFzVGV4dENvbnRlbnQoY2hpbGROb2RlKSkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgKiBDbG9uZXMgYSBzcGVjaWZpZWQgSFRNTEVsZW1lbnQgYW5kIGluc2VydHMgdGhlIGNsb25lIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBvcmlnaW5hbCBlbGVtZW50IGluIHRoZSBET00uXHJcbiAgICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZnVsIGZvciBkdXBsaWNhdGluZyBpbnRlcmFjdGl2ZSBjb21wb25lbnRzIG9yIGNvbnRlbnQgYmxvY2tzIHdpdGhpbiBhIGR5bmFtaWMgaW50ZXJmYWNlLlxyXG4gICAgKlxyXG4gICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50IC0gVGhlIEhUTUxFbGVtZW50IHRvIGJlIGNsb25lZCBhbmQgcmVpbnNlcnRlZC5cclxuICAgICogQHJldHVybnMge0hUTUxFbGVtZW50IHwgbnVsbH0gVGhlIGNsb25lZCBIVE1MRWxlbWVudCBpZiB0aGUgb3BlcmF0aW9uIGlzIHN1Y2Nlc3NmdWwsIG9yIG51bGwgaWYgdGhlIG9yaWdpbmFsIGVsZW1lbnQgZG9lcyBub3QgaGF2ZSBhIHBhcmVudC5cclxuICAgICpcclxuICAgICogQGV4YW1wbGVcclxuICAgICogLy8gQXNzdW1lIHlvdSBoYXZlIGEgbGlzdCBpdGVtIHRoYXQgeW91IHdhbnQgdG8gZHVwbGljYXRlOlxyXG4gICAgKiBjb25zdCBsaXN0SXRlbSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2xpLm15LWl0ZW0nKTtcclxuICAgICogY29uc3QgbmV3TGlzdEl0ZW0gPSBjbG9uZUFuZEluc2VydEFmdGVyKGxpc3RJdGVtKTtcclxuICAgICogaWYgKG5ld0xpc3RJdGVtKSB7XHJcbiAgICAqICAgICBjb25zb2xlLmxvZygnSXRlbSB3YXMgY2xvbmVkIHN1Y2Nlc3NmdWxseS4nKTtcclxuICAgICogfVxyXG4gICAgKlxyXG4gICAgKiBAZGVzY3JpcHRpb25cclxuICAgICogVGhpcyBmdW5jdGlvbiBmaXJzdCBhdHRlbXB0cyB0byBjbG9uZSB0aGUgcHJvdmlkZWQgYGVsZW1lbnRgIHVzaW5nIGBjbG9uZU5vZGUodHJ1ZSlgLCB3aGljaCBlbnN1cmVzIHRoYXQgYWxsIGNoaWxkIG5vZGVzIGFuZCBhdHRyaWJ1dGVzIGFyZSBjb3BpZWQuXHJcbiAgICAqIFRoZSBmdW5jdGlvbiB0aGVuIGNoZWNrcyBpZiB0aGUgb3JpZ2luYWwgZWxlbWVudCBoYXMgYSBwYXJlbnQgbm9kZS4gSWYgaXQgZG9lcyBub3QsIHRoZSBmdW5jdGlvbiByZXR1cm5zIG51bGwgc2luY2UgaW5zZXJ0aW9uIGNhbm5vdCBwcm9jZWVkLlxyXG4gICAgKiBJZiBhIHBhcmVudCBub2RlIGV4aXN0cywgdGhlIGNsb25lZCBlbGVtZW50IGlzIGluc2VydGVkIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBvcmlnaW5hbCBlbGVtZW50IHVzaW5nIGBwYXJlbnROb2RlLmluc2VydEJlZm9yZSgpYC5cclxuICAgICogVGhpcyBhbGxvd3MgdGhlIGZ1bmN0aW9uIHRvIGVmZmVjdGl2ZWx5IGR1cGxpY2F0ZSBhbmQgcGxhY2UgdGhlIG5ldyBlbGVtZW50IGluIHRoZSBjb3JyZWN0IHBvc2l0aW9uIHdpdGhpbiB0aGUgRE9NIHRyZWUuXHJcbiAgICAqL1xyXG4gICAgc3RhdGljIGNsb25lQW5kSW5zZXJ0QWZ0ZXIoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBIVE1MRWxlbWVudCB8IG51bGwge1xyXG4gICAgICAgIGNvbnN0IGNsb25lZEVsZW1lbnQgPSBlbGVtZW50LmNsb25lTm9kZSh0cnVlKSBhcyBIVE1MRWxlbWVudDtcclxuXHJcbiAgICAgICAgY29uc3QgcGFyZW50RWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZTtcclxuXHJcbiAgICAgICAgaWYgKCFwYXJlbnRFbGVtZW50KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcGFyZW50RWxlbWVudC5pbnNlcnRCZWZvcmUoY2xvbmVkRWxlbWVudCwgZWxlbWVudC5uZXh0U2libGluZyk7XHJcblxyXG4gICAgICAgIHJldHVybiBjbG9uZWRFbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBcclxuICAgICogU2VhcmNoZXMgZm9yIHRoZSBjbG9zZXN0IGFuY2VzdG9yIGVsZW1lbnQgb2YgdGhlIGN1cnJlbnRseSBhY3RpdmUgZWxlbWVudCB0aGF0IGhhcyB0aGUgc3BlY2lmaWVkIENTUyBjbGFzcy5cclxuICAgICogVGhpcyBmdW5jdGlvbiB0cmF2ZXJzZXMgdXAgZnJvbSB0aGUgYWN0aXZlIGVsZW1lbnQgaW4gdGhlIERPTSB0cmVlIGFuZCBjaGVja3MgZWFjaCBhbmNlc3RvciB0byBzZWUgaWYgaXQgbWF0Y2hlc1xyXG4gICAgKiB0aGUgc3BlY2lmaWVkIGNsYXNzIG5hbWUuXHJcbiAgICAqXHJcbiAgICAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc05hbWUgLSBUaGUgY2xhc3MgbmFtZSB0byBtYXRjaCBhZ2FpbnN0IGFuY2VzdG9yIGVsZW1lbnRzLlxyXG4gICAgKiBAcmV0dXJucyB7SFRNTEVsZW1lbnQgfCBudWxsfSBUaGUgY2xvc2VzdCBhbmNlc3RvciBlbGVtZW50IHdpdGggdGhlIHNwZWNpZmllZCBjbGFzcywgb3IgbnVsbCBpZiBubyBzdWNoIGVsZW1lbnQgZXhpc3RzLlxyXG4gICAgKlxyXG4gICAgKiBAZXhhbXBsZVxyXG4gICAgKiAvLyBTdXBwb3NlIHlvdSB3YW50IHRvIGZpbmQgdGhlIGNsb3Nlc3QgZm9ybSBlbGVtZW50IHRoYXQgY29udGFpbnMgdGhlIGN1cnJlbnRseSBmb2N1c2VkIGlucHV0IGZpZWxkOlxyXG4gICAgKiBjb25zdCBjbG9zZXN0Rm9ybSA9IGZpbmRDbG9zZXN0QW5jZXN0b3JPZkFjdGl2ZUVsZW1lbnRCeUNsYXNzKCdteS1mb3JtLWNsYXNzJyk7XHJcbiAgICAqIGNvbnNvbGUubG9nKGNsb3Nlc3RGb3JtKTtcclxuICAgICpcclxuICAgICogQGRlc2NyaXB0aW9uXHJcbiAgICAqIFRoaXMgZnVuY3Rpb24gYmVnaW5zIGJ5IG9idGFpbmluZyBhIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudGx5IGFjdGl2ZSBlbGVtZW50IHVzaW5nIGBkb2N1bWVudC5hY3RpdmVFbGVtZW50YC5cclxuICAgICogSWYgdGhlcmUgaXMgbm8gYWN0aXZlIGVsZW1lbnQsIG9yIHRoZSBhY3RpdmUgZWxlbWVudCBkb2VzIG5vdCBoYXZlIGFueSBhbmNlc3RvciB3aXRoIHRoZSBzcGVjaWZpZWQgY2xhc3MsXHJcbiAgICAqIHRoZSBmdW5jdGlvbiByZXR1cm5zIG51bGwuIE90aGVyd2lzZSwgaXQgaXRlcmF0ZXMgdGhyb3VnaCB0aGUgYW5jZXN0b3JzIG9mIHRoZSBhY3RpdmUgZWxlbWVudCB1bnRpbCBpdCBmaW5kc1xyXG4gICAgKiBhbiBlbGVtZW50IHdpdGggdGhlIHNwZWNpZmllZCBjbGFzcyBvciByZWFjaGVzIHRoZSByb290IG9mIHRoZSBkb2N1bWVudC4gVGhpcyBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsIGluIGNvbXBsZXhcclxuICAgICogZm9ybXMgb3IgaW50ZXJhY3RpdmUgYXJlYXMgd2hlcmUgY29udGV4dC1iYXNlZCBhY3Rpb25zIGRlcGVuZCBvbiBzcGVjaWZpYyBwYXJ0cyBvZiB0aGUgRE9NIHN0cnVjdHVyZS5cclxuICAgICovXHJcbiAgICBzdGF0aWMgZmluZENsb3Nlc3RBbmNlc3Rvck9mQWN0aXZlRWxlbWVudEJ5Q2xhc3MoY2xhc3NOYW1lOiBzdHJpbmcpOiBIVE1MRWxlbWVudCB8IG51bGwge1xyXG4gICAgICAgIGNvbnN0IGFjdGl2ZUVsZW1lbnQgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xyXG5cclxuICAgICAgICBpZiAoIWFjdGl2ZUVsZW1lbnQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgY3VycmVudEVsZW1lbnQ6IE5vZGUgfCBudWxsID0gYWN0aXZlRWxlbWVudDtcclxuXHJcbiAgICAgICAgd2hpbGUgKGN1cnJlbnRFbGVtZW50KSB7XHJcbiAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50Lm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSAmJlxyXG4gICAgICAgICAgICAgICAgKGN1cnJlbnRFbGVtZW50IGFzIEhUTUxFbGVtZW50KS5jbGFzc0xpc3QuY29udGFpbnMoY2xhc3NOYW1lKVxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50RWxlbWVudCBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY3VycmVudEVsZW1lbnQgPSBjdXJyZW50RWxlbWVudC5wYXJlbnROb2RlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgKiBGaW5kcyB0aGUgY2xvc2VzdCBhbmNlc3RvciBlbGVtZW50IHdpdGggdGhlIHNwZWNpZmllZCBjbGFzcyBuYW1lIGZyb20gdGhlIGN1cnJlbnQgdGV4dCBzZWxlY3Rpb24uXHJcbiAgICAqIElmIHRoZSBzZWxlY3Rpb24gaXMgaW4gYSB0ZXh0IG5vZGUsIGl0IGNsaW1icyB1cCB0aGUgRE9NIHRyZWUgdG8gZmluZCB0aGUgY2xvc2VzdCBlbGVtZW50IHRoYXQgbWF0Y2hlcyB0aGUgc3BlY2lmaWVkIGNsYXNzLlxyXG4gICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWZ1bCBmb3IgY29udGV4dC1zZW5zaXRpdmUgb3BlcmF0aW9ucyBiYXNlZCBvbiB0aGUgY3VycmVudCBzZWxlY3Rpb24gaW4gZG9jdW1lbnQgZWRpdGluZyBvciBwcm9jZXNzaW5nIGVudmlyb25tZW50cy5cclxuICAgICpcclxuICAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzTmFtZSAtIFRoZSBjbGFzcyBuYW1lIHRvIHNlYXJjaCBmb3IgaW4gYW5jZXN0b3IgZWxlbWVudHMuXHJcbiAgICAqIEByZXR1cm5zIHtIVE1MRWxlbWVudCB8IG51bGx9IFRoZSBjbG9zZXN0IGFuY2VzdG9yIGVsZW1lbnQgd2l0aCB0aGUgc3BlY2lmaWVkIGNsYXNzLCBvciBudWxsIGlmIG5vIHN1Y2ggZWxlbWVudCBpcyBmb3VuZC5cclxuICAgICovXHJcbiAgICBzdGF0aWMgZmluZENsb3Nlc3RBbmNlc3Rvck9mU2VsZWN0aW9uQnlDbGFzcyhjbGFzc05hbWU6IHN0cmluZyk6IEhUTUxFbGVtZW50IHwgbnVsbCB7XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG5cclxuICAgICAgICAvLyBDaGVjayBpZiB0aGVyZSdzIGEgc2VsZWN0aW9uIGFuZCBpZiBpdCBoYXMgYXQgbGVhc3Qgb25lIHJhbmdlXHJcbiAgICAgICAgaWYgKCFzZWxlY3Rpb24gfHwgc2VsZWN0aW9uLnJhbmdlQ291bnQgPT09IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBHZXQgdGhlIHN0YXJ0aW5nIG5vZGUgb2YgdGhlIHNlbGVjdGlvblxyXG4gICAgICAgIGxldCBjdXJyZW50RWxlbWVudDogTm9kZSB8IG51bGwgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKS5jb21tb25BbmNlc3RvckNvbnRhaW5lcjtcclxuXHJcbiAgICAgICAgLy8gSWYgdGhlIGN1cnJlbnQgbm9kZSBpcyBhIHRleHQgbm9kZSwgc3RhcnQgZnJvbSBpdHMgcGFyZW50IGVsZW1lbnRcclxuICAgICAgICBpZiAoY3VycmVudEVsZW1lbnQgJiYgY3VycmVudEVsZW1lbnQubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XHJcbiAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50ID0gY3VycmVudEVsZW1lbnQucGFyZW50Tm9kZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIFRyYXZlcnNlIHVwIHRoZSBET00gdHJlZSB0byBmaW5kIHRoZSBjbG9zZXN0IGVsZW1lbnQgd2l0aCB0aGUgc3BlY2lmaWVkIGNsYXNzXHJcbiAgICAgICAgd2hpbGUgKGN1cnJlbnRFbGVtZW50KSB7XHJcbiAgICAgICAgICAgIGlmIChjdXJyZW50RWxlbWVudC5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUgJiYgKGN1cnJlbnRFbGVtZW50IGFzIEhUTUxFbGVtZW50KS5jbGFzc0xpc3QuY29udGFpbnMoY2xhc3NOYW1lKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50ID0gY3VycmVudEVsZW1lbnQucGFyZW50Tm9kZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgKiBSZWFycmFuZ2UgY29udGVudCBhcm91bmQgdGhlIHNwbGl0IHBvaW50IGJhc2VkIG9uIHRoZSBjdXJzb3IgcG9zaXRpb24uXHJcbiAgICAqIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyB0aGUgcHJvY2VzcyBvZiBzcGxpdHRpbmcgdGhlIGNvbnRlbnQgYXQgdGhlIGN1cnNvcixcclxuICAgICogdGhlbiByZWFycmFuZ2luZyB0aGUgY29udGVudCBieSBkZWxldGluZyBhcHByb3ByaWF0ZSBwYXJ0cyBpbiB0aGUgb3JpZ2luYWxcclxuICAgICogYW5kIGNsb25lZCBub2Rlcy4gSXQgZW5zdXJlcyB0aGF0IGFmdGVyIHRoZSBzcGxpdCwgdGhlIG9yaWdpbmFsIG5vZGUgY29udGFpbnNcclxuICAgICogb25seSB0aGUgY29udGVudCBiZWZvcmUgdGhlIGN1cnNvciBhbmQgdGhlIGNsb25lZCBub2RlIGNvbnRhaW5zIHRoZSBjb250ZW50IGFmdGVyIHRoZSBjdXJzb3IuXHJcbiAgICAqIEltcG9ydGFudGx5LCB0aGlzIGZ1bmN0aW9uIG1haW50YWlucyB0aGUgdmFsaWRpdHkgb2YgdGhlIERPTSBzdHJ1Y3R1cmUgYWZ0ZXIgbW9kaWZpY2F0aW9ucyxcclxuICAgICogcHJldmVudGluZyBhbnkgZGlzcnVwdGlvbnMgaW4gZG9jdW1lbnQgc3RydWN0dXJlIHRoYXQgY291bGQgYWZmZWN0IHJlbmRlcmluZyBvciBmdXJ0aGVyIHNjcmlwdGluZy5cclxuICAgICogXHJcbiAgICAqIEBwYXJhbSB7Tm9kZX0gY3VycmVudE5vZGUgLSBUaGUgbm9kZSBjb250YWluaW5nIHRoZSBvcmlnaW5hbCBjb250ZW50IGJlZm9yZSB0aGUgc3BsaXQuXHJcbiAgICAqIEBwYXJhbSB7Tm9kZX0gbmV3Tm9kZSAtIFRoZSBjbG9uZWQgbm9kZSB0aGF0IHdpbGwgY29udGFpbiB0aGUgY29udGVudCBhZnRlciB0aGUgc3BsaXQuXHJcbiAgICAqIEByZXR1cm5zIHt2b2lkfSBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHJldHVybiBhIHZhbHVlOyBpdCBtb2RpZmllcyBET00gbm9kZXMgZGlyZWN0bHkuXHJcbiAgICAqIFxyXG4gICAgKiBAZXhhbXBsZVxyXG4gICAgKiAvLyBBc3N1bWluZyBjdXJyZW50Tm9kZSBpcyBhbiBlbGVtZW50IHdpdGggdGV4dCBjb250ZW50IGFuZCBhIGN1cnNvciBwb3NpdGlvbiB3aXRoaW4gaXQsXHJcbiAgICAqIC8vIGFuZCBuZXdOb2RlIGlzIGl0cyBjbG9uZWQgY291bnRlcnBhcnQ6XHJcbiAgICAqIHJlYXJyYW5nZUNvbnRlbnRBZnRlclNwbGl0KGN1cnJlbnROb2RlLCBuZXdOb2RlKTtcclxuICAgICogXHJcbiAgICAqIEBkZXNjcmlwdGlvblxyXG4gICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGEgcGFydCBvZiBhbiBlZGl0aW5nIHN5c3RlbSB3aGVyZSBjb250ZW50IG5lZWRzIHRvIGJlIGR5bmFtaWNhbGx5XHJcbiAgICAqIHNwbGl0IGFuZCByZWFycmFuZ2VkLiBJdCB1c2VzIGEgY3Vyc29yLWJhc2VkIGFwcHJvYWNoIHRvIGRldGVybWluZSB0aGUgc3BsaXQgcG9pbnQsXHJcbiAgICAqIHJlbW92ZXMgY29udGVudCBmcm9tIHRoZSBvcmlnaW5hbCBhbmQgdGhlIGNsb25lIGJhc2VkIG9uIHRoZSBjdXJzb3IncyBwb3NpdGlvbixcclxuICAgICogYW5kIHNldHMgdXAgdGhlIG5vZGVzIGZvciBzdWJzZXF1ZW50IHVzZXIgaW50ZXJhY3Rpb25zLiBUaGUgRE9NIHJlbWFpbnMgdmFsaWQgYW5kIHdlbGwtZm9ybWVkLFxyXG4gICAgKiBlbnN1cmluZyB0aGF0IHN1YnNlcXVlbnQgb3BlcmF0aW9ucywgc3VjaCBhcyBmdXJ0aGVyIHNwbGl0cyBvciBzdHlsZSBjaGFuZ2VzLCBjYW4gYmUgcGVyZm9ybWVkXHJcbiAgICAqIHdpdGhvdXQgYWRkaXRpb25hbCBjaGVja3Mgb3IgY29ycmVjdGlvbnMuXHJcbiAgICAqL1xyXG4gICAgc3RhdGljIHJlYXJyYW5nZUNvbnRlbnRBZnRlclNwbGl0KGN1cnJlbnROb2RlOiBOb2RlLCBuZXdOb2RlOiBOb2RlKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgY3Vyc29yUG9zaXRpb24gPSBET01VdGlscy5nZXRDdXJzb3JQb3NpdGlvbihjdXJyZW50Tm9kZSBhcyBOb2RlKTtcclxuICAgICAgICBjb25zdCByYW5nZXMxID0gdGhpcy5zcGxpdENvbnRlbnRBdEN1cnNvclNlbGVjdGlvbihjdXJyZW50Tm9kZSBhcyBOb2RlKTtcclxuXHJcbiAgICAgICAgLy8gY2hhbmdlIHRoZSBvcmlnaW5hbFxyXG4gICAgICAgIGRvY3VtZW50LmdldFNlbGVjdGlvbigpPy5yZW1vdmVBbGxSYW5nZXMoKTtcclxuICAgICAgICBkb2N1bWVudC5nZXRTZWxlY3Rpb24oKT8uYWRkUmFuZ2UocmFuZ2VzMVsxXSk7XHJcbiAgICAgICAgZG9jdW1lbnQuZ2V0U2VsZWN0aW9uKCk/LmRlbGV0ZUZyb21Eb2N1bWVudCgpO1xyXG5cclxuICAgICAgICAvLyBjaGFuZ2UgdGhlIGNsb25lXHJcbiAgICAgICAgaWYgKG5ld05vZGUgJiYgY3Vyc29yUG9zaXRpb24pIHtcclxuICAgICAgICAgICAgdGhpcy5zZXRDdXJzb3JQb3NpdGlvbihuZXdOb2RlLCBjdXJzb3JQb3NpdGlvbik7XHJcblxyXG4gICAgICAgICAgICBjb25zdCByYW5nZXMyID0gdGhpcy5zcGxpdENvbnRlbnRBdEN1cnNvclNlbGVjdGlvbihuZXdOb2RlIGFzIE5vZGUpO1xyXG5cclxuICAgICAgICAgICAgZG9jdW1lbnQuZ2V0U2VsZWN0aW9uKCk/LnJlbW92ZUFsbFJhbmdlcygpO1xyXG4gICAgICAgICAgICBkb2N1bWVudC5nZXRTZWxlY3Rpb24oKT8uYWRkUmFuZ2UocmFuZ2VzMlswXSk7XHJcbiAgICAgICAgICAgIGRvY3VtZW50LmdldFNlbGVjdGlvbigpPy5kZWxldGVGcm9tRG9jdW1lbnQoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAqIENhbGN1bGF0ZXMgdGhlIGN1cnNvciBwb3NpdGlvbiB3aXRoaW4gdGhlIHNwZWNpZmllZCBub2RlLiBUaGUgcG9zaXRpb24gaXMgZGV0ZXJtaW5lZFxyXG4gICAgKiBieSBjb3VudGluZyBjaGFyYWN0ZXJzIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBub2RlIHRvIHRoZSBjdXJzb3IncyBsb2NhdGlvbiB3aXRoaW4gdGhlIG5vZGUuXHJcbiAgICAqIFRoaXMgZnVuY3Rpb24gaXMgZXNzZW50aWFsIGZvciBzY2VuYXJpb3Mgd2hlcmUgcHJlY2lzZSB0ZXh0IG1hbmlwdWxhdGlvbiBpcyByZXF1aXJlZCwgc3VjaCBhc1xyXG4gICAgKiB0ZXh0IGVkaXRvcnMgb3IgZHluYW1pY2FsbHkgZ2VuZXJhdGVkIGNvbnRlbnQgZmllbGRzLlxyXG4gICAgKiBcclxuICAgICogQHBhcmFtIHtOb2RlfSBub2RlIC0gVGhlIG5vZGUgd2l0aGluIHdoaWNoIHRvIGNhbGN1bGF0ZSB0aGUgY3Vyc29yIHBvc2l0aW9uLlxyXG4gICAgKiBAcmV0dXJucyB7bnVtYmVyIHwgbnVsbH0gVGhlIHplcm8tYmFzZWQgaW5kZXggcmVwcmVzZW50aW5nIHRoZSBjdXJzb3IncyBwb3NpdGlvbiB3aXRoaW4gdGhlIG5vZGUsXHJcbiAgICAqIG9yIG51bGwgaWYgdGhlIHNlbGVjdGlvbiBkb2VzIG5vdCBpbnRlcnNlY3Qgd2l0aCB0aGUgc3BlY2lmaWVkIG5vZGUgb3IgaWYgdGhlcmUgYXJlIGFueSBpc3N1ZXNcclxuICAgICogcmV0cmlldmluZyB0aGUgc2VsZWN0aW9uLlxyXG4gICAgKiBcclxuICAgICogQGV4YW1wbGVcclxuICAgICogLy8gQXNzdW1pbmcgdGhlcmUgaXMgYSBjb250ZW50ZWRpdGFibGUgZWxlbWVudCBhbmQgdGhlIGN1cnNvciBpcyBpbnNpZGUgaXQ6XHJcbiAgICAqIGNvbnN0IHBvc2l0aW9uID0gZ2V0Q3Vyc29yUG9zaXRpb24oZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ215LWVkaXRhYmxlLWRpdicpKTtcclxuICAgICogY29uc29sZS5sb2coJ0N1cnNvciBwb3NpdGlvbjonLCBwb3NpdGlvbik7XHJcbiAgICAqIFxyXG4gICAgKiBAZGVzY3JpcHRpb25cclxuICAgICogVGhpcyBmdW5jdGlvbiByZXRyaWV2ZXMgdGhlIGN1cnJlbnQgc2VsZWN0aW9uJ3MgcmFuZ2UgYW5kIGRldGVybWluZXMgaWYgaXQgaW50ZXJzZWN0cyB3aXRoIHRoZVxyXG4gICAgKiBnaXZlbiBub2RlLiBJZiBhbiBpbnRlcnNlY3Rpb24gaXMgZm91bmQsIGl0IHVzZXMgYSBUcmVlV2Fsa2VyIHRvIHRyYXZlcnNlIHRoZSB0ZXh0IG5vZGVzIHVuZGVyXHJcbiAgICAqIHRoZSBnaXZlbiBub2RlLCBjb3VudGluZyBjaGFyYWN0ZXJzIHVudGlsIGl0IHJlYWNoZXMgdGhlIHN0YXJ0IGNvbnRhaW5lciBvZiB0aGUgcmFuZ2UuXHJcbiAgICAqIFRoaXMgYWxsb3dzIHRoZSBmdW5jdGlvbiB0byByZXR1cm4gYW4gYWNjdXJhdGUgY2hhcmFjdGVyIGluZGV4IGV2ZW4gaW4gdGhlIHByZXNlbmNlIG9mIG5lc3RlZCBlbGVtZW50c1xyXG4gICAgKiBvciBtaXhlZCBjb250ZW50ICh0ZXh0IGNvbWJpbmVkIHdpdGggZWxlbWVudHMpLlxyXG4gICAgKi9cclxuICAgIHN0YXRpYyBnZXRDdXJzb3JQb3NpdGlvbihub2RlOiBOb2RlKTogbnVtYmVyIHwgbnVsbCB7XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG4gICAgICAgIGlmICghc2VsZWN0aW9uIHx8ICFub2RlKSByZXR1cm4gbnVsbDtcclxuXHJcbiAgICAgICAgY29uc3QgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcclxuXHJcbiAgICAgICAgaWYgKCFyYW5nZS5pbnRlcnNlY3RzTm9kZShub2RlKSkgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgICAgIGNvbnN0IHRyZWVXYWxrZXIgPSBkb2N1bWVudC5jcmVhdGVUcmVlV2Fsa2VyKFxyXG4gICAgICAgICAgICBub2RlLFxyXG4gICAgICAgICAgICBOb2RlRmlsdGVyLlNIT1dfVEVYVCxcclxuICAgICAgICAgICAgeyBhY2NlcHROb2RlOiBub2RlID0+IE5vZGVGaWx0ZXIuRklMVEVSX0FDQ0VQVCB9XHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgbGV0IGNoYXJDb3VudCA9IDA7XHJcbiAgICAgICAgbGV0IGN1cnJlbnROb2RlID0gdHJlZVdhbGtlci5maXJzdENoaWxkKCk7XHJcblxyXG4gICAgICAgIHdoaWxlIChjdXJyZW50Tm9kZSkge1xyXG4gICAgICAgICAgICBpZiAoY3VycmVudE5vZGUgPT09IHJhbmdlLnN0YXJ0Q29udGFpbmVyKSB7XHJcbiAgICAgICAgICAgICAgICBjaGFyQ291bnQgKz0gcmFuZ2Uuc3RhcnRPZmZzZXQ7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY2hhckNvdW50ICs9IGN1cnJlbnROb2RlLnRleHRDb250ZW50Py5sZW5ndGggfHwgMDtcclxuICAgICAgICAgICAgY3VycmVudE5vZGUgPSB0cmVlV2Fsa2VyLm5leHROb2RlKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gY2hhckNvdW50O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgKiBTZXRzIHRoZSBjdXJzb3IgcG9zaXRpb24gd2l0aGluIHRoZSBzcGVjaWZpZWQgZWxlbWVudCBiYXNlZCBvbiBhIGNoYXJhY3RlciBpbmRleC5cclxuICAgICogVGhpcyBmdW5jdGlvbiBjcmVhdGVzIGEgbmV3IHJhbmdlIGFuZCB1c2VzIGEgVHJlZVdhbGtlciB0byBuYXZpZ2F0ZSB0aHJvdWdoIHRoZSB0ZXh0IG5vZGVzXHJcbiAgICAqIHdpdGhpbiB0aGUgZWxlbWVudCB0byBmaW5kIHRoZSBleGFjdCBsb2NhdGlvbiB0byBzZXQgdGhlIGN1cnNvci4gVGhlIHBvc2l0aW9uIGlzIHNldFxyXG4gICAgKiBieSBjb3VudGluZyBjaGFyYWN0ZXJzIHVwIHRvIHRoZSBzcGVjaWZpZWQgaW5kZXguXHJcbiAgICAqIFxyXG4gICAgKiBAcGFyYW0ge05vZGV9IGVsZW1lbnQgLSBUaGUgZWxlbWVudCB3aXRoaW4gd2hpY2ggdG8gc2V0IHRoZSBjdXJzb3IgcG9zaXRpb24uXHJcbiAgICAqIEBwYXJhbSB7bnVtYmVyfSBwb3NpdGlvbiAtIFRoZSB6ZXJvLWJhc2VkIGNoYXJhY3RlciBpbmRleCB3aGVyZSB0aGUgY3Vyc29yIHNob3VsZCBiZSBwb3NpdGlvbmVkLlxyXG4gICAgKiBAcmV0dXJucyB7dm9pZH0gVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCByZXR1cm4gYSB2YWx1ZTsgaXQgZGlyZWN0bHkgbW9kaWZpZXMgdGhlIHNlbGVjdGlvbiB3aXRoaW4gdGhlIGRvY3VtZW50LlxyXG4gICAgKiBcclxuICAgICogQGV4YW1wbGVcclxuICAgICogLy8gQXNzdW1pbmcgdGhlcmUgaXMgYSBwYXJhZ3JhcGggZWxlbWVudCBhbmQgeW91IHdhbnQgdG8gc2V0IHRoZSBjdXJzb3IgYXQgdGhlIDEwdGggY2hhcmFjdGVyOlxyXG4gICAgKiBjb25zdCBwYXJhZ3JhcGggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbXktcGFyYWdyYXBoJyk7XHJcbiAgICAqIHNldEN1cnNvclBvc2l0aW9uKHBhcmFncmFwaCwgMTApO1xyXG4gICAgKiBcclxuICAgICogQGRlc2NyaXB0aW9uXHJcbiAgICAqIFRoZSBmdW5jdGlvbiBjbGVhcnMgYW55IGV4aXN0aW5nIHNlbGVjdGlvbnMsIGNhbGN1bGF0ZXMgdGhlIGNvcnJlY3QgdGV4dCBub2RlIGFuZCBvZmZzZXQgd2l0aGluIHRoYXQgbm9kZSxcclxuICAgICogYW5kIHRoZW4gc2V0cyBhIG5ldyByYW5nZSBhdCB0aGF0IHBvc2l0aW9uLiBJdCBlbnN1cmVzIHRoYXQgdGhlIGN1cnNvciBpcyBtb3ZlZCBhY2N1cmF0ZWx5LCBldmVuIHdpdGhpblxyXG4gICAgKiBjb21wbGV4IG5lc3RlZCBjb250ZW50IHN0cnVjdHVyZXMuIFRoaXMgaXMgcGFydGljdWxhcmx5IHVzZWZ1bCBmb3IgdGV4dCBlZGl0aW5nIGFwcGxpY2F0aW9ucyBhbmQgZHluYW1pY1xyXG4gICAgKiBjb250ZW50IG1hbmFnZW1lbnQgc3lzdGVtcyB3aGVyZSBwcmVjaXNlIGN1cnNvciBjb250cm9sIGlzIHJlcXVpcmVkLlxyXG4gICAgKi9cclxuICAgIHN0YXRpYyBzZXRDdXJzb3JQb3NpdGlvbihlbGVtZW50OiBOb2RlLCBwb3NpdGlvbjogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG4gICAgICAgIGlmICghc2VsZWN0aW9uKSByZXR1cm47XHJcblxyXG4gICAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcclxuXHJcbiAgICAgICAgY29uc3QgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xyXG4gICAgICAgIGNvbnN0IHRyZWVXYWxrZXIgPSBkb2N1bWVudC5jcmVhdGVUcmVlV2Fsa2VyKFxyXG4gICAgICAgICAgICBlbGVtZW50LFxyXG4gICAgICAgICAgICBOb2RlRmlsdGVyLlNIT1dfVEVYVCxcclxuICAgICAgICAgICAgeyBhY2NlcHROb2RlOiAoKSA9PiBOb2RlRmlsdGVyLkZJTFRFUl9BQ0NFUFQgfVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIGxldCBjdXJyZW50Tm9kZSA9IHRyZWVXYWxrZXIubmV4dE5vZGUoKTtcclxuICAgICAgICBsZXQgY3VycmVudFBvcyA9IDA7XHJcblxyXG4gICAgICAgIHdoaWxlIChjdXJyZW50Tm9kZSkge1xyXG4gICAgICAgICAgICBjb25zdCB0ZXh0TGVuZ3RoID0gY3VycmVudE5vZGUudGV4dENvbnRlbnQ/Lmxlbmd0aCB8fCAwO1xyXG4gICAgICAgICAgICBpZiAoY3VycmVudFBvcyArIHRleHRMZW5ndGggPj0gcG9zaXRpb24pIHtcclxuICAgICAgICAgICAgICAgIHJhbmdlLnNldFN0YXJ0KGN1cnJlbnROb2RlLCBwb3NpdGlvbiAtIGN1cnJlbnRQb3MpO1xyXG4gICAgICAgICAgICAgICAgcmFuZ2UuY29sbGFwc2UodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjdXJyZW50UG9zICs9IHRleHRMZW5ndGg7XHJcbiAgICAgICAgICAgIGN1cnJlbnROb2RlID0gdHJlZVdhbGtlci5uZXh0Tm9kZSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICogUmV0cmlldmVzIHRoZSBjb250ZW50IHR5cGUgYXR0cmlidXRlIGZyb20gdGhlIGN1cnJlbnRseSBhY3RpdmUgY29udGVudCBibG9jayBpbiB0aGUgZG9jdW1lbnQuXHJcbiAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcHJpbWFyaWx5IHVzZWQgaW4gY29udGV4dHMgd2hlcmUgZGlmZmVyZW50IGFjdGlvbnMgb3IgYmVoYXZpb3JzIGFyZSBjb25kaXRpb25lZFxyXG4gICAgKiB1cG9uIHRoZSB0eXBlIG9mIGNvbnRlbnQgdGhlIHVzZXIgaXMgaW50ZXJhY3Rpbmcgd2l0aC5cclxuICAgICpcclxuICAgICogQHJldHVybnMge3N0cmluZyB8IG51bGx9IFRoZSB2YWx1ZSBvZiB0aGUgJ2RhdGEtY29udGVudC10eXBlJyBhdHRyaWJ1dGUgaWYgaXQgZXhpc3RzIG9uIHRoZSBjb250ZW50IGVsZW1lbnQsXHJcbiAgICAqIG9yIG51bGwgaWYgdGhlIGF0dHJpYnV0ZSBpcyBub3QgZm91bmQgb3IgdGhlIGNvbnRlbnQgZWxlbWVudCBkb2VzIG5vdCBleGlzdC5cclxuICAgICpcclxuICAgICogQGV4YW1wbGVcclxuICAgICogLy8gSWYgeW91IG5lZWQgdG8gYXBwbHkgc3BlY2lmaWMgbG9naWMgYmFzZWQgb24gdGhlIHR5cGUgb2YgY29udGVudCBjdXJyZW50bHkgYmVpbmcgZWRpdGVkOlxyXG4gICAgKiBjb25zdCBjb250ZW50VHlwZSA9IGdldENvbnRlbnRUeXBlRnJvbUFjdGl2ZUVsZW1lbnQoKTtcclxuICAgICogaWYgKGNvbnRlbnRUeXBlID09PSAncCcpIHtcclxuICAgICogICAgIGNvbnNvbGUubG9nKCdFZGl0aW5nIGEgdGV4dCBibG9jaycpO1xyXG4gICAgKiB9IGVsc2UgaWYgKGNvbnRlbnRUeXBlID09PSAnaDEnKSB7XHJcbiAgICAqICAgICBjb25zb2xlLmxvZygnRWRpdGluZyBhbiBoZWFkaW5nJyk7XHJcbiAgICAqIH1cclxuICAgICpcclxuICAgICogQGRlc2NyaXB0aW9uXHJcbiAgICAqIFRoaXMgZnVuY3Rpb24gYmVnaW5zIGJ5IGNhbGxpbmcgYGdldEN1cnJlbnRBY3RpdmVCbG9jaygpYCwgd2hpY2ggc2hvdWxkIHJldHVybiB0aGUgY3VycmVudGx5IGFjdGl2ZSBibG9jayBlbGVtZW50XHJcbiAgICAqIGluIHRoZSBVSS4gSXQgdGhlbiBzZWFyY2hlcyBmb3IgYW4gZWxlbWVudCB3aXRoaW4gdGhpcyBibG9jayB3aXRoIHRoZSBjbGFzcyAnLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCcsXHJcbiAgICAqIHdoaWNoIGlzIGV4cGVjdGVkIHRvIGNhcnJ5IGEgJ2RhdGEtY29udGVudC10eXBlJyBhdHRyaWJ1dGUgc3BlY2lmeWluZyB0aGUgdHlwZSBvZiBjb250ZW50IChlLmcuLCAndGV4dCcsICdpbWFnZScsIGV0Yy4pLlxyXG4gICAgKiBUaGUgZnVuY3Rpb24gcmV0cmlldmVzIGFuZCByZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGlzIGF0dHJpYnV0ZSwgb3IgbnVsbCBpZiB0aGUgYXR0cmlidXRlIGlzIG5vdCBwcmVzZW50LlxyXG4gICAgKi9cclxuICAgIHN0YXRpYyBnZXRDb250ZW50VHlwZUZyb21BY3RpdmVFbGVtZW50KCk6IHN0cmluZyB8IG51bGwge1xyXG4gICAgICAgIGNvbnN0IGJsb2NrID0gRE9NVXRpbHMuZ2V0Q3VycmVudEFjdGl2ZUJsb2NrKCk7XHJcbiAgICAgICAgY29uc3QgY29udGVudEVsZW1lbnQgPSBibG9jaz8ucXVlcnlTZWxlY3RvcihcIi5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnRcIikgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgaWYgKCFjb250ZW50RWxlbWVudCkge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY29udGVudFR5cGUgPSBjb250ZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJkYXRhLWNvbnRlbnQtdHlwZVwiKTtcclxuICAgICAgICByZXR1cm4gY29udGVudFR5cGUgfHwgbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICogU3BsaXRzIHRoZSBjb250ZW50IG9mIHRoZSBzcGVjaWZpZWQgcm9vdCBub2RlIGludG8gdHdvIHJhbmdlcyBiYXNlZCBvbiB0aGUgY3VycmVudCBjdXJzb3IgcG9zaXRpb24uXHJcbiAgICAqIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyB0d28gcmFuZ2VzOiBvbmUgZm9yIHRoZSBjb250ZW50IGJlZm9yZSB0aGUgY3Vyc29yIGFuZCBvbmUgZm9yIHRoZSBjb250ZW50IGFmdGVyLlxyXG4gICAgKiBUaGUgb3BlcmF0aW9uIGlzIGxpbWl0ZWQgdG8gdGhlIGJvdW5kYXJpZXMgb2YgdGhlIHByb3ZpZGVkIHJvb3Qgbm9kZSwgZW5zdXJpbmcgdGhhdCB0aGUgZGl2aXNpb24gcmVzcGVjdHNcclxuICAgICogdGhlIHN0cnVjdHVyYWwgaW50ZWdyaXR5IG9mIHRoZSBjb250ZW50IHdpdGhpbiB0aGF0IG5vZGUuXHJcbiAgICAqIFxyXG4gICAgKiBAcGFyYW0ge05vZGV9IHJvb3ROb2RlIC0gVGhlIHJvb3Qgbm9kZSB3aXRoaW4gd2hpY2ggdGhlIGNvbnRlbnQgaXMgdG8gYmUgc3BsaXQuIFRoaXMgbm9kZSBzZXRzIHRoZSBib3VuZGFyeSBmb3IgdGhlIHNwbGl0IG9wZXJhdGlvbi5cclxuICAgICogQHJldHVybnMge1JhbmdlW119IEFuIGFycmF5IG9mIHR3byBgUmFuZ2VgIG9iamVjdHM6IHRoZSBmaXJzdCBjb250YWluaW5nIHRoZSBjb250ZW50IGJlZm9yZSB0aGUgY3Vyc29yLCBhbmQgdGhlIHNlY29uZCBjb250YWluaW5nIHRoZSBjb250ZW50IGFmdGVyIHRoZSBjdXJzb3IuXHJcbiAgICAqIFxyXG4gICAgKiBAZXhhbXBsZVxyXG4gICAgKiAvLyBBc3N1bWUgdGhlcmUgaXMgYSBkaXYgZWxlbWVudCB3aXRoIGNvbnRlbnQgYW5kIGEgY3Vyc29yIHBvc2l0aW9uIHNvbWV3aGVyZSBpbnNpZGUgaXQ6XHJcbiAgICAqIGNvbnN0IGNvbnRlbnREaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29udGVudERpdicpO1xyXG4gICAgKiBjb25zdCByYW5nZXMgPSBzcGxpdENvbnRlbnRBdEN1cnNvclNlbGVjdGlvbihjb250ZW50RGl2KTtcclxuICAgICogY29uc29sZS5sb2coJ0NvbnRlbnQgYmVmb3JlIGN1cnNvcjonLCByYW5nZXNbMF0uY2xvbmVDb250ZW50cygpLnRleHRDb250ZW50KTtcclxuICAgICogY29uc29sZS5sb2coJ0NvbnRlbnQgYWZ0ZXIgY3Vyc29yOicsIHJhbmdlc1sxXS5jbG9uZUNvbnRlbnRzKCkudGV4dENvbnRlbnQpO1xyXG4gICAgKiBcclxuICAgICogQGRlc2NyaXB0aW9uXHJcbiAgICAqIFRoaXMgZnVuY3Rpb24gcmV0cmlldmVzIHRoZSBjdXJyZW50IHNlbGVjdGlvbidzIHJhbmdlIGFuZCBjaGVja3MgaWYgaXQgaW50ZXJzZWN0cyB3aXRoIHRoZSBwcm92aWRlZCByb290Tm9kZS5cclxuICAgICogSWYgc28sIGl0IGNvbnN0cnVjdHMgdHdvIG5ldyByYW5nZXMgdXNpbmcgdGhlIHJvb3ROb2RlIGFzIHRoZSBjb250ZXh0OlxyXG4gICAgKiAtIFRoZSBmaXJzdCByYW5nZSBjYXB0dXJlcyBhbGwgY29udGVudCBmcm9tIHRoZSBzdGFydCBvZiByb290Tm9kZSB1cCB0byB0aGUgY3Vyc29yJ3Mgc3RhcnQuXHJcbiAgICAqIC0gVGhlIHNlY29uZCByYW5nZSBjYXB0dXJlcyBhbGwgY29udGVudCBmcm9tIHRoZSBjdXJzb3IncyBlbmQgdG8gdGhlIGVuZCBvZiByb290Tm9kZSwgb3B0aW9uYWxseSBleHRlbmRpbmcgdG8gdGhlIGxhc3QgY2hpbGQgb2Ygcm9vdE5vZGUgaWYgbmVjZXNzYXJ5LlxyXG4gICAgKiBUaGlzIGlzIHVzZWZ1bCBmb3IgYXBwbGljYXRpb25zIGludm9sdmluZyByaWNoIHRleHQgZWRpdGluZyBvciBhbnkgc2NlbmFyaW8gd2hlcmUgY29udGVudCBuZWVkcyB0byBiZSBzZWdtZW50ZWQgYXJvdW5kIGEgdXNlcidzIHBvaW50IG9mIGZvY3VzLlxyXG4gICAgKi9cclxuICAgIHN0YXRpYyBzcGxpdENvbnRlbnRBdEN1cnNvclNlbGVjdGlvbihyb290Tm9kZTogTm9kZSk6IFJhbmdlW10ge1xyXG4gICAgICAgIGNvbnN0IHJhbmdlczogUmFuZ2VbXSA9IFtdO1xyXG5cclxuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgICAgICAgaWYgKCFzZWxlY3Rpb24gfHwgc2VsZWN0aW9uLnJhbmdlQ291bnQgPT09IDApIHJldHVybiByYW5nZXM7XHJcblxyXG4gICAgICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XHJcblxyXG4gICAgICAgIGNvbnN0IHJhbmdlQmVmb3JlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcclxuICAgICAgICByYW5nZUJlZm9yZS5zZWxlY3ROb2RlQ29udGVudHMocm9vdE5vZGUpO1xyXG4gICAgICAgIHJhbmdlQmVmb3JlLnNldEVuZChyYW5nZS5zdGFydENvbnRhaW5lciwgcmFuZ2Uuc3RhcnRPZmZzZXQpO1xyXG5cclxuICAgICAgICBjb25zdCByYW5nZUFmdGVyID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcclxuICAgICAgICByYW5nZUFmdGVyLnNlbGVjdE5vZGVDb250ZW50cyhyb290Tm9kZSk7XHJcbiAgICAgICAgcmFuZ2VBZnRlci5zZXRTdGFydChyYW5nZS5lbmRDb250YWluZXIsIHJhbmdlLmVuZE9mZnNldCk7XHJcbiAgICAgICAgaWYgKHJvb3ROb2RlLmxhc3RDaGlsZCkge1xyXG4gICAgICAgICAgICByYW5nZUFmdGVyLnNldEVuZEFmdGVyKHJvb3ROb2RlLmxhc3RDaGlsZCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByYW5nZXMucHVzaChyYW5nZUJlZm9yZSk7XHJcbiAgICAgICAgcmFuZ2VzLnB1c2gocmFuZ2VBZnRlcik7XHJcblxyXG4gICAgICAgIHJldHVybiByYW5nZXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAqIFBsYWNlcyB0aGUgY3Vyc29yIGF0IHRoZSBzdGFydCBvZiBhIHNwZWNpZmllZCBlZGl0YWJsZSBIVE1MIGVsZW1lbnQuIFRoaXMgZnVuY3Rpb24gZW5zdXJlcyB0aGF0IGlmIHRoZSBlbGVtZW50IGlzIFxyXG4gICAgKiBjb250ZW50LWVkaXRhYmxlLCB0aGUgY3Vyc29yIGlzIHBvc2l0aW9uZWQgYXQgdGhlIHZlcnkgYmVnaW5uaW5nLiBUaGlzIGlzIGVzcGVjaWFsbHkgdXNlZnVsIGluIHVzZXIgaW50ZXJmYWNlc1xyXG4gICAgKiB3aGVyZSB0ZXh0IGVkaXRpbmcgY2FwYWJpbGl0aWVzIGFyZSBkeW5hbWljYWxseSBlbmFibGVkLCBhbmQgaW1tZWRpYXRlIHVzZXIgaW50ZXJhY3Rpb24gaXMgZXhwZWN0ZWQuXHJcbiAgICAqXHJcbiAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVkaXRhYmxlRWxlbWVudCAtIFRoZSBjb250ZW50LWVkaXRhYmxlIEhUTUwgZWxlbWVudCB3aGVyZSB0aGUgY3Vyc29yIHNob3VsZCBiZSBwbGFjZWQgYXQgdGhlIHN0YXJ0LlxyXG4gICAgKiBAcmV0dXJucyB7dm9pZH0gVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCByZXR1cm4gYSB2YWx1ZTsgaXQgZGlyZWN0bHkgbWFuaXB1bGF0ZXMgdGhlIERPTSBhbmQgc2VsZWN0aW9uIHN0YXRlLlxyXG4gICAgKlxyXG4gICAgKiBAZXhhbXBsZVxyXG4gICAgKiAvLyBBc3N1bWluZyB0aGVyZSBpcyBhIGNvbnRlbnQtZWRpdGFibGUgcGFyYWdyYXBoIGluIHRoZSBkb2N1bWVudDpcclxuICAgICogY29uc3QgZWRpdGFibGVQYXJhZ3JhcGggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdGFibGVQYXJhZ3JhcGgnKTtcclxuICAgICogcGxhY2VDdXJzb3JBdFN0YXJ0T2ZFZGl0YWJsZUVsZW1lbnQoZWRpdGFibGVQYXJhZ3JhcGgpO1xyXG4gICAgKlxyXG4gICAgKiBAZGVzY3JpcHRpb25cclxuICAgICogVGhpcyBmdW5jdGlvbiBmaXJzdCBjaGVja3MgaWYgdGhlIGBlZGl0YWJsZUVsZW1lbnRgIGlzIGNvbnRlbnQtZWRpdGFibGUuIElmIGl0IGlzIG5vdCwgYSB3YXJuaW5nIGlzIGxvZ2dlZCB0byB0aGUgY29uc29sZS5cclxuICAgICogSWYgdGhlIGVsZW1lbnQgaXMgZWRpdGFibGUsIGl0OlxyXG4gICAgKiAxLiBTZXRzIGZvY3VzIG9uIHRoZSBlbGVtZW50IHRvIGVuc3VyZSB0aGF0IGl0IGlzIHJlYWR5IGZvciB1c2VyIGlucHV0LlxyXG4gICAgKiAyLiBDcmVhdGVzIGEgbmV3IFJhbmdlIG9iamVjdCwgc2VsZWN0cyBhbGwgdGhlIGNvbnRlbnRzIG9mIHRoZSBlbGVtZW50LCBhbmQgY29sbGFwc2VzIHRoaXMgcmFuZ2UgdG8gdGhlIHN0YXJ0IG9mIHRoZSBlbGVtZW50LlxyXG4gICAgKiAzLiBDbGVhcnMgYW55IGV4aXN0aW5nIHNlbGVjdGlvbnMgYW5kIGFwcGxpZXMgdGhlIG5ldyByYW5nZSwgZWZmZWN0aXZlbHkgcG9zaXRpb25pbmcgdGhlIGN1cnNvciBhdCB0aGUgc3RhcnQgb2YgdGhlIGVsZW1lbnQuXHJcbiAgICAqIFRoaXMgYXBwcm9hY2ggaXMgY3J1Y2lhbCBmb3IgZWRpdGluZyBpbnRlcmZhY2VzLCBlbnN1cmluZyB0aGF0IHVzZXIgaW50ZXJhY3Rpb24gaXMgaW50dWl0aXZlIGFuZCBpbW1lZGlhdGVseSByZXNwb25zaXZlLlxyXG4gICAgKi9cclxuICAgIHN0YXRpYyBwbGFjZUN1cnNvckF0U3RhcnRPZkVkaXRhYmxlRWxlbWVudChlZGl0YWJsZUVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XHJcbiAgICAgICAgaWYgKGVkaXRhYmxlRWxlbWVudC5pc0NvbnRlbnRFZGl0YWJsZSkge1xyXG4gICAgICAgICAgICBlZGl0YWJsZUVsZW1lbnQuZm9jdXMoKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcclxuICAgICAgICAgICAgcmFuZ2Uuc2VsZWN0Tm9kZUNvbnRlbnRzKGVkaXRhYmxlRWxlbWVudCk7XHJcbiAgICAgICAgICAgIHJhbmdlLmNvbGxhcHNlKHRydWUpO1xyXG5cclxuICAgICAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG4gICAgICAgICAgICBzZWxlY3Rpb24/LnJlbW92ZUFsbFJhbmdlcygpO1xyXG4gICAgICAgICAgICBzZWxlY3Rpb24/LmFkZFJhbmdlKHJhbmdlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXCJUaGUgZWxlbWVudCBpcyBub3QgZWRpdGFibGUuXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICogU2V0cyB0aGUgZm9jdXMgYW5kIGN1cnNvciBwb3NpdGlvbiB0byB0aGUgZW5kIG9mIHRoZSB0ZXh0IHdpdGhpbiBhIHNwZWNpZmllZCBjb250ZW50LWVkaXRhYmxlIEhUTUwgZWxlbWVudC5cclxuICAgICogVGhpcyBtZXRob2QgaXMgc3BlY2lmaWNhbGx5IGRlc2lnbmVkIHRvIGhhbmRsZSBjb250ZW50LWVkaXRhYmxlIGVsZW1lbnRzIGJ5IHBvc2l0aW9uaW5nIHRoZSBjdXJzb3JcclxuICAgICogYXQgdGhlIHZlcnkgZW5kIG9mIHRoZSBlbGVtZW50J3MgY29udGVudCwgcmVnYXJkbGVzcyBvZiB0aGUgY29udGVudCdzIGNvbXBvc2l0aW9uICh0ZXh0LCBlbGVtZW50cywgZXRjLikuXHJcbiAgICAqXHJcbiAgICAqIFRoZSBmdW5jdGlvbiBjaGVja3MgaWYgdGhlIHByb3ZpZGVkIGVsZW1lbnQgaXMgY29udGVudC1lZGl0YWJsZS4gSWYgaXQgaXMsIGl0IHVzZXMgYHJlcXVlc3RBbmltYXRpb25GcmFtZWBcclxuICAgICogdG8gZW5zdXJlIHRoYXQgYWxsIERPTSB1cGRhdGVzIGhhdmUgY29tcGxldGVkIGJlZm9yZSBzZXR0aW5nIGZvY3VzIGFuZCBhZGp1c3RpbmcgdGhlIGN1cnNvciBwb3NpdGlvbi5cclxuICAgICogSXQgdGhlbiBjcmVhdGVzIGEgcmFuZ2Ugc3Bhbm5pbmcgdGhlIGNvbnRlbnQgb2YgdGhlIGVsZW1lbnQsIGZpbmRzIHRoZSBkZWVwZXN0IGxhc3Qgbm9kZSwgYW5kIHNldHMgdGhlXHJcbiAgICAqIGN1cnNvciBwb3NpdGlvbiBhdCB0aGUgZW5kIG9mIHRoaXMgbm9kZS4gVGhpcyBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsIGZvciByaWNoIHRleHQgZWRpdG9ycyBvciBhbnkgYXBwbGljYXRpb25cclxuICAgICogdGhhdCByZXF1aXJlcyBwcmVjaXNlIGNvbnRyb2wgb3ZlciBjdXJzb3IgcGxhY2VtZW50IGluIGVkaXRhYmxlIGNvbnRlbnQuXHJcbiAgICAqXHJcbiAgICAqIElmIHRoZSBlbGVtZW50IGlzIG5vdCBjb250ZW50LWVkaXRhYmxlLCBhIHdhcm5pbmcgaXMgbG9nZ2VkIHRvIHRoZSBjb25zb2xlIGluZGljYXRpbmcgdGhhdCB0aGUgZWxlbWVudCBjYW5ub3QgYmUgZWRpdGVkLlxyXG4gICAgKlxyXG4gICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBjb250ZW50QmxvY2sgLSBUaGUgY29udGVudC1lZGl0YWJsZSBIVE1MIGVsZW1lbnQgd2hlcmUgdGhlIGN1cnNvciB3aWxsIGJlIHBsYWNlZCBhdCB0aGUgZW5kLlxyXG4gICAgKi9cclxuICAgIHN0YXRpYyBwbGFjZUN1cnNvckF0RW5kT2ZFZGl0YWJsZUVsZW1lbnQoY29udGVudEJsb2NrOiBIVE1MRWxlbWVudCkge1xyXG4gICAgICAgIGlmIChjb250ZW50QmxvY2suaXNDb250ZW50RWRpdGFibGUpIHtcclxuICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnRlbnRCbG9jay5mb2N1cygpO1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcclxuXHJcbiAgICAgICAgICAgICAgICByYW5nZS5zZWxlY3ROb2RlQ29udGVudHMoY29udGVudEJsb2NrKTtcclxuXHJcbiAgICAgICAgICAgICAgICBsZXQgbGFzdE5vZGU6IE5vZGUgfCBudWxsID0gY29udGVudEJsb2NrO1xyXG4gICAgICAgICAgICAgICAgd2hpbGUgKGxhc3ROb2RlLmxhc3RDaGlsZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxhc3ROb2RlID0gbGFzdE5vZGUubGFzdENoaWxkO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHJhbmdlLnNldEVuZChsYXN0Tm9kZSwgbGFzdE5vZGUubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFID8gbGFzdE5vZGUudGV4dENvbnRlbnQhLmxlbmd0aCA6IDApO1xyXG4gICAgICAgICAgICAgICAgcmFuZ2UuY29sbGFwc2UoZmFsc2UpO1xyXG5cclxuICAgICAgICAgICAgICAgIHNlbGVjdGlvbj8ucmVtb3ZlQWxsUmFuZ2VzKCk7XHJcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb24/LmFkZFJhbmdlKHJhbmdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc29sZS53YXJuKFwiVGhlIGVsZW1lbnQgaXMgbm90IGVkaXRhYmxlLlwiKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGdldEN1cnJlbnRBY3RpdmVCbG9jaygpOiBFbGVtZW50IHwgbnVsbCB7XHJcblxyXG4gICAgICAgIGxldCBjb250YWluZXIgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xyXG5cclxuICAgICAgICBpZiAoY29udGFpbmVyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBjb250YWluZXIuY2xvc2VzdChcIi5ibG9ja1wiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBpc1NlbGVjdGVkVGV4dERlc2NlbmRhbnRPZihwYXJlbnRTZWxlY3Rvcjogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gZG9jdW1lbnQuZ2V0U2VsZWN0aW9uKCk7XHJcblxyXG4gICAgICAgIGlmICghc2VsZWN0aW9uKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghc2VsZWN0aW9uLnJhbmdlQ291bnQpIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgY29uc3QgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcclxuICAgICAgICBsZXQgZWxlbWVudDogTm9kZSB8IG51bGwgPSByYW5nZS5zdGFydENvbnRhaW5lcjtcclxuXHJcbiAgICAgICAgaWYgKGVsZW1lbnQubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XHJcbiAgICAgICAgICAgIGVsZW1lbnQgPSBlbGVtZW50LnBhcmVudE5vZGU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIWVsZW1lbnQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIChlbGVtZW50IGFzIEVsZW1lbnQpLmNsb3Nlc3QocGFyZW50U2VsZWN0b3IpICE9PSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyByZW1vdmVGaWx0ZXJUZXh0KCk6IG51bWJlciB8IG51bGwge1xyXG4gICAgICAgIGxldCBsYXN0U2xhc2hQb3NpdGlvbjogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG5cclxuICAgICAgICBpZiAoc2VsZWN0aW9uICYmIHNlbGVjdGlvbi5yYW5nZUNvdW50ID4gMCkge1xyXG4gICAgICAgICAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xyXG4gICAgICAgICAgICBjb25zdCBjb250YWluZXIgPSByYW5nZS5jb21tb25BbmNlc3RvckNvbnRhaW5lcjtcclxuXHJcbiAgICAgICAgICAgIGlmIChjb250YWluZXIubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFICYmIGNvbnRhaW5lci5wYXJlbnRFbGVtZW50Py5pc0NvbnRlbnRFZGl0YWJsZSkge1xyXG4gICAgICAgICAgICAgICAgbGV0IG5vZGU6IE5vZGUgfCBudWxsID0gY29udGFpbmVyO1xyXG4gICAgICAgICAgICAgICAgbGV0IG9mZnNldCA9IHJhbmdlLnN0YXJ0T2Zmc2V0O1xyXG5cclxuICAgICAgICAgICAgICAgIHdoaWxlIChub2RlICYmIG9mZnNldCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZXh0QmVmb3JlQ3Vyc29yID0gbm9kZS50ZXh0Q29udGVudD8uc3Vic3RyaW5nKDAsIG9mZnNldCkgfHwgXCJcIjtcclxuICAgICAgICAgICAgICAgICAgICBsYXN0U2xhc2hQb3NpdGlvbiA9IHRleHRCZWZvcmVDdXJzb3IubGFzdEluZGV4T2YoXCIvXCIpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAobGFzdFNsYXNoUG9zaXRpb24gIT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlLnNldFN0YXJ0KG5vZGUsIGxhc3RTbGFzaFBvc2l0aW9uKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UuZGVsZXRlQ29udGVudHMoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gbm9kZS5wYXJlbnROb2RlPy50ZXh0Q29udGVudD8ubGFzdEluZGV4T2YoXCIvXCIpIHx8IC0xO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XHJcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKFwiVGhlIGN1cnNvciBpcyBub3Qgd2l0aGluIGEgY29udGVudEVkaXRhYmxlIGVsZW1lbnQgb3IgYSB0ZXh0IG5vZGUuXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc29sZS53YXJuKFwiTm8gYWN0aXZlIHNlbGVjdGlvbi5cIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbGFzdFNsYXNoUG9zaXRpb247XHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgICBzdGF0aWMgZmluZENsaWNrZWRFbGVtZW50T3JBbmNlc3RvckJ5RGF0YUNvbnRlbnRUeXBlKGV2ZW50OiBNb3VzZUV2ZW50LCBkYXRhQ29udGVudFR5cGU6IHN0cmluZyk6IEhUTUxFbGVtZW50IHwgbnVsbCB7XHJcbiAgICAgICAgbGV0IGNsaWNrZWRFbGVtZW50ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG5cclxuICAgICAgICBpZiAoY2xpY2tlZEVsZW1lbnQubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XHJcbiAgICAgICAgICAgIGNsaWNrZWRFbGVtZW50ID0gY2xpY2tlZEVsZW1lbnQucGFyZW50RWxlbWVudCE7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoY2xpY2tlZEVsZW1lbnQuZGF0YXNldC5jb250ZW50VHlwZSA9PT0gZGF0YUNvbnRlbnRUeXBlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBjbGlja2VkRWxlbWVudDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBjdXJyZW50RWxlbWVudCA9IGNsaWNrZWRFbGVtZW50LnBhcmVudEVsZW1lbnQ7XHJcbiAgICAgICAgd2hpbGUgKGN1cnJlbnRFbGVtZW50KSB7XHJcbiAgICAgICAgICAgIGlmIChjdXJyZW50RWxlbWVudC5kYXRhc2V0LmNvbnRlbnRUeXBlID09PSBkYXRhQ29udGVudFR5cGUpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50RWxlbWVudDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjdXJyZW50RWxlbWVudCA9IGN1cnJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZmluZENsaWNrZWRFbGVtZW50T3JBbmNlc3RvckJ5SWQoZXZlbnQ6IE1vdXNlRXZlbnQsIGlkOiBzdHJpbmcpOiBIVE1MRWxlbWVudCB8IG51bGwge1xyXG4gICAgICAgIGxldCBjbGlja2VkRWxlbWVudCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuXHJcbiAgICAgICAgaWYgKGNsaWNrZWRFbGVtZW50Lm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xyXG4gICAgICAgICAgICBjbGlja2VkRWxlbWVudCA9IGNsaWNrZWRFbGVtZW50LnBhcmVudEVsZW1lbnQhO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGNsaWNrZWRFbGVtZW50LmlkID09PSBpZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gY2xpY2tlZEVsZW1lbnQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgY3VycmVudEVsZW1lbnQgPSBjbGlja2VkRWxlbWVudC5wYXJlbnRFbGVtZW50O1xyXG4gICAgICAgIHdoaWxlIChjdXJyZW50RWxlbWVudCkge1xyXG4gICAgICAgICAgICBpZiAoY3VycmVudEVsZW1lbnQuaWQgPT09IGlkKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudEVsZW1lbnQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY3VycmVudEVsZW1lbnQgPSBjdXJyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGZpbmRDbGlja2VkRWxlbWVudE9yQW5jZXN0b3JCeUNsYXNzKGV2ZW50OiBNb3VzZUV2ZW50LCBjbGFzc0tleTogc3RyaW5nKTogSFRNTEVsZW1lbnQgfCBudWxsIHtcclxuICAgICAgICBsZXQgY2xpY2tlZEVsZW1lbnQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcblxyXG4gICAgICAgIGlmIChjbGlja2VkRWxlbWVudC5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUpIHtcclxuICAgICAgICAgICAgY2xpY2tlZEVsZW1lbnQgPSBjbGlja2VkRWxlbWVudC5wYXJlbnRFbGVtZW50ITtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChjbGlja2VkRWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoY2xhc3NLZXkpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBjbGlja2VkRWxlbWVudDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBjdXJyZW50RWxlbWVudCA9IGNsaWNrZWRFbGVtZW50LnBhcmVudEVsZW1lbnQ7XHJcbiAgICAgICAgd2hpbGUgKGN1cnJlbnRFbGVtZW50KSB7XHJcbiAgICAgICAgICAgIGlmIChjdXJyZW50RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoY2xhc3NLZXkpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudEVsZW1lbnQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY3VycmVudEVsZW1lbnQgPSBjdXJyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG59IiwiaW1wb3J0IHsgQ29sb3JzIH0gZnJvbSBcIkAvY29tbW9uL0NvbG9yc1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIENoYW5nZUNvbG9yIHtcclxuXHJcbiAgICBjb2xvcjogQ29sb3JzO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGNvbG9yOiBDb2xvcnMpIHtcclxuICAgICAgICB0aGlzLmNvbG9yID0gY29sb3I7XHJcbiAgICB9XHJcbn0iLCJleHBvcnQgY2xhc3MgU2hvd0hpZGVBY3RpdmVCdXR0b24ge1xyXG5cclxuICAgIGNsYXNzS2V5OiBcImhpbGl0ZUNvbG9yXCIgfCBcImZvcmVDb2xvclwiIHwgXCJiYWNrZ3JvdW5kQ29sb3JcIjtcclxuICAgIHZhbHVlOiBzdHJpbmc7XHJcbiAgICBpbnRlbnRpb246IFwic2hvd1wiIHwgXCJoaWRlXCI7XHJcblxyXG4gICAgY29uc3RydWN0b3IoY2xhc3NLZXk6IFwiaGlsaXRlQ29sb3JcIiB8IFwiZm9yZUNvbG9yXCIgfCBcImJhY2tncm91bmRDb2xvclwiLCB2YWx1ZTogc3RyaW5nLCBpbnRlbnRpb246IFwic2hvd1wiIHwgXCJoaWRlXCIpIHtcclxuICAgICAgICB0aGlzLmNsYXNzS2V5ID0gY2xhc3NLZXk7XHJcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xyXG4gICAgICAgIHRoaXMuaW50ZW50aW9uID0gaW50ZW50aW9uO1xyXG4gICAgfVxyXG59IiwiZXhwb3J0IGNsYXNzIFJlc2V0QWN0aXZlQnV0dG9ucyB7XHJcblxyXG4gICAgY2xhc3NLZXk6IFwiaGlsaXRlQ29sb3JcIiB8IFwiZm9yZUNvbG9yXCIgfCBcImJhY2tncm91bmRDb2xvclwiO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGNsYXNzS2V5OiBcImhpbGl0ZUNvbG9yXCIgfCBcImZvcmVDb2xvclwiIHwgXCJiYWNrZ3JvdW5kQ29sb3JcIikge1xyXG4gICAgICAgIHRoaXMuY2xhc3NLZXkgPSBjbGFzc0tleTtcclxuICAgIH1cclxufSIsImltcG9ydCB7IElVSUFjdGlvbiB9IGZyb20gXCIuL0lVSUFjdGlvblwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIENsb3NlRWxlbWVudCBpbXBsZW1lbnRzIElVSUFjdGlvbiB7XHJcblxyXG59IiwiaW1wb3J0IHsgSVVJQWN0aW9uIH0gZnJvbSBcIi4vSVVJQWN0aW9uXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgU2hvd0VsZW1lbnQgaW1wbGVtZW50cyBJVUlBY3Rpb24ge1xyXG5cclxufSIsImltcG9ydCB7IENvbG9ycyB9IGZyb20gXCJAL2NvbW1vbi9Db2xvcnNcIjtcclxuaW1wb3J0IHsgVGFibGVTY29wZXMgfSBmcm9tIFwiQC9zZXJ2aWNlcy90YWJsZS1vcGVyYXRpb25zL1RhYmxlU2NvcGVzXCI7XHJcbmltcG9ydCB7IElDb21tYW5kRXZlbnREZXRhaWwgfSBmcm9tIFwiLi9JQ29tbWFuZEV2ZW50RGV0YWlsXCI7XHJcbmltcG9ydCB7IEN1c3RvbUV2ZW50cyB9IGZyb20gXCJAL2NvbW1vbi9DdXN0b21FdmVudHNcIjtcclxuaW1wb3J0IHsgQ29tbWFuZHMgfSBmcm9tIFwiLi9Db21tYW5kc1wiO1xyXG5pbXBvcnQgeyBJVUlFdmVudERldGFpbCB9IGZyb20gXCIuL0lVSUV2ZW50RGV0YWlsXCI7XHJcbmltcG9ydCB7IENoYW5nZUNvbG9yIH0gZnJvbSBcIi4vVUlBY3Rpb25zL0NoYW5nZUNvbG9yXCI7XHJcbmltcG9ydCB7IEN1c3RvbVVJRXZlbnRzIH0gZnJvbSBcIkAvY29tbW9uL0N1c3RvbVVJRXZlbnRzXCI7XHJcbmltcG9ydCB7IFNob3dIaWRlQWN0aXZlQnV0dG9uIH0gZnJvbSBcIi4vVUlBY3Rpb25zL1Nob3dIaWRlQWN0aXZlQnV0dG9uXCI7XHJcbmltcG9ydCB7IFJlc2V0QWN0aXZlQnV0dG9ucyB9IGZyb20gXCIuL1VJQWN0aW9ucy9SZXNldEFjdGl2ZUJ1dHRvbnNcIjtcclxuaW1wb3J0IHsgQ2xvc2VFbGVtZW50IH0gZnJvbSBcIi4vVUlBY3Rpb25zL0Nsb3NlRWxlbWVudFwiO1xyXG5pbXBvcnQgeyBTaG93RWxlbWVudCB9IGZyb20gXCIuL1VJQWN0aW9ucy9TaG93RWxlbWVudFwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIEV2ZW50RW1pdHRlciB7XHJcblxyXG4gICAgc3RhdGljIGVtaXRTaG93RWxlbWVudEV2ZW50KHRhcmdldElkOiBzdHJpbmcpIHtcclxuXHJcbiAgICAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQ8SVVJRXZlbnREZXRhaWw+KEN1c3RvbVVJRXZlbnRzLlNob3dFbGVtZW50LCB7XHJcbiAgICAgICAgICAgIGRldGFpbDoge1xyXG4gICAgICAgICAgICAgICAgdGFyZ2V0SWQ6IHRhcmdldElkLFxyXG4gICAgICAgICAgICAgICAgYWN0aW9uOiBuZXcgU2hvd0VsZW1lbnRcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KGN1c3RvbUV2ZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZW1pdENsb3NlRWxlbWVudEV2ZW50KHRhcmdldElkOiBzdHJpbmcpIHtcclxuXHJcbiAgICAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQ8SVVJRXZlbnREZXRhaWw+KEN1c3RvbVVJRXZlbnRzLkNsb3NlRWxlbWVudCwge1xyXG4gICAgICAgICAgICBkZXRhaWw6IHtcclxuICAgICAgICAgICAgICAgIHRhcmdldElkOiB0YXJnZXRJZCxcclxuICAgICAgICAgICAgICAgIGFjdGlvbjogbmV3IENsb3NlRWxlbWVudFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoY3VzdG9tRXZlbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBlbWl0Q2hhbmdlQ29tcG9uZW50Q29sb3JFdmVudCh0YXJnZXRJZDogc3RyaW5nLCBjb2xvcjogQ29sb3JzKSB7XHJcblxyXG4gICAgICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50PElVSUV2ZW50RGV0YWlsPihDdXN0b21VSUV2ZW50cy5Db2xvckNoYW5nZVJlcXVlc3QsIHtcclxuICAgICAgICAgICAgZGV0YWlsOiB7XHJcbiAgICAgICAgICAgICAgICB0YXJnZXRJZDogdGFyZ2V0SWQsXHJcbiAgICAgICAgICAgICAgICBhY3Rpb246IG5ldyBDaGFuZ2VDb2xvcihjb2xvcilcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KGN1c3RvbUV2ZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZW1pdFNob3dIaWRlQWN0aXZlRWxlbWVudEV2ZW50KHRhcmdldENsYXNzOiBcImhpbGl0ZUNvbG9yXCIgfCBcImZvcmVDb2xvclwiIHwgXCJiYWNrZ3JvdW5kQ29sb3JcIiwgdmFsdWU6IHN0cmluZywgaW50ZW5zaW9uOiBcInNob3dcIiB8IFwiaGlkZVwiKSB7XHJcblxyXG4gICAgICAgIGlmICh0YXJnZXRDbGFzcyA9PSBcImhpbGl0ZUNvbG9yXCIgJiYgdmFsdWUgPT0gQ29sb3JzLkhpbGl0ZUNvbG9yTm9uZSkge1xyXG4gICAgICAgICAgICBpbnRlbnNpb24gPSBcImhpZGVcIjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0YXJnZXRDbGFzcyA9PSBcImZvcmVDb2xvclwiICYmIHZhbHVlID09IENvbG9ycy5Gb3JlQ29sb3JJbml0aWFsKSB7XHJcbiAgICAgICAgICAgIGludGVuc2lvbiA9IFwiaGlkZVwiO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRhcmdldENsYXNzID09IFwiYmFja2dyb3VuZENvbG9yXCIgJiYgdmFsdWUgPT0gQ29sb3JzLkJhY2tncm91bmRDb2xvck5vbmUpIHtcclxuICAgICAgICAgICAgaW50ZW5zaW9uID0gXCJoaWRlXCI7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBjdXN0b21FdmVudCA9IG5ldyBDdXN0b21FdmVudDxJVUlFdmVudERldGFpbD4oQ3VzdG9tVUlFdmVudHMuU2hvd0hpZGVBY3RpdmVCdXR0b24sIHtcclxuXHJcbiAgICAgICAgICAgIGRldGFpbDoge1xyXG4gICAgICAgICAgICAgICAgdGFyZ2V0Q2xhc3M6IHRhcmdldENsYXNzLFxyXG4gICAgICAgICAgICAgICAgYWN0aW9uOiBuZXcgU2hvd0hpZGVBY3RpdmVCdXR0b24odGFyZ2V0Q2xhc3MsIHZhbHVlLCBpbnRlbnNpb24pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChjdXN0b21FdmVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGVtaXRSZXNldEFjdGl2ZUJ1dHRvbnNFbGVtZW50RXZlbnQodGFyZ2V0Q2xhc3M6IFwiaGlsaXRlQ29sb3JcIiB8IFwiZm9yZUNvbG9yXCIgfCBcImJhY2tncm91bmRDb2xvclwiKSB7XHJcblxyXG4gICAgICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50PElVSUV2ZW50RGV0YWlsPihDdXN0b21VSUV2ZW50cy5SZXNldEFjdGl2ZUJ1dHRvbnMsIHtcclxuXHJcbiAgICAgICAgICAgIGRldGFpbDoge1xyXG4gICAgICAgICAgICAgICAgdGFyZ2V0Q2xhc3M6IHRhcmdldENsYXNzLFxyXG4gICAgICAgICAgICAgICAgYWN0aW9uOiBuZXcgUmVzZXRBY3RpdmVCdXR0b25zKHRhcmdldENsYXNzKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoY3VzdG9tRXZlbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vVE9ETzogcmV3cml0ZSB0aGlzIGRvY1xyXG4gICAgLyoqXHJcbiAgICAqIEVtaXRzIGEgY3VzdG9tIGV2ZW50IHdpdGggdGhlIGN1cnJlbnQgZm9ybWF0dGluZyBzdGF0ZXMgaWYgdGhlcmUgaXMgYW4gYWN0aXZlIHRleHQgc2VsZWN0aW9uLlxyXG4gICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGNydWNpYWwgaW4gYSB0ZXh0IGVkaXRpbmcgZW52aXJvbm1lbnQgd2hlcmUgbXVsdGlwbGUgY29tcG9uZW50cyBtaWdodCBuZWVkIHRvXHJcbiAgICAqIHVwZGF0ZSB0aGVpciBzdGF0ZSBiYXNlZCBvbiBjaGFuZ2VzIGluIHRleHQgZm9ybWF0dGluZy4gVGhlIGVtaXR0ZWQgZXZlbnQgKGBDdXN0b21FdmVudHMudGV4dEZvcm1hdENoYW5nZWRgKVxyXG4gICAgKiBjYXJyaWVzIGZvcm1hdHRpbmcgc3RhdGUgZGF0YSwgd2hpY2ggY29tcG9uZW50cyBjYW4gdXNlIHRvIHN5bmNocm9uaXplIHRoZWlyIFVJIGVsZW1lbnRzIHdpdGggdGhlXHJcbiAgICAqIGN1cnJlbnQgdGV4dCBmb3JtYXR0aW5nIChlLmcuLCB1cGRhdGluZyBidXR0b24gc3RhdGVzLCBkaXNwbGF5aW5nIGFjdGl2ZSBmb3JtYXR0aW5nIG9wdGlvbnMpLlxyXG4gICAgKlxyXG4gICAgKiBUaGlzIGZ1bmN0aW9uIGZpcnN0IGNoZWNrcyBmb3IgYW4gYWN0aXZlIGFuZCBub24tZW1wdHkgdGV4dCBzZWxlY3Rpb24uXHJcbiAgICAqIElmIHRoZSBzZWxlY3Rpb24gaXMgZW1wdHksIHRoZSBmdW5jdGlvbiBleGl0cyBlYXJseSB0byBhdm9pZCBwcm9jZXNzaW5nIHVubmVjZXNzYXJ5IGV2ZW50cyxcclxuICAgICogZXNwZWNpYWxseSB0byBtaXRpZ2F0ZSBpc3N1ZXMgaW4gYnJvd3NlcnMgbGlrZSBGaXJlZm94IHdoZXJlIGBzZWxlY3Rpb25jaGFuZ2VgIG1pZ2h0IGZpcmUgZHVyaW5nIHR5cGluZ1xyXG4gICAgKiB3aXRob3V0IGFuIGFjdHVhbCBjaGFuZ2UgaW4gc2VsZWN0aW9uLlxyXG4gICAgKlxyXG4gICAgKiBAcHJpdmF0ZVxyXG4gICAgKiBAcmV0dXJucyB7dm9pZH0gTm8gcmV0dXJuIHZhbHVlIGFzIHRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gZW1pdCBldmVudHMgYmFzZWQgb24gdGhlIGZvcm1hdHRpbmcgc3RhdGUuXHJcbiAgICAqXHJcbiAgICAqIEBleGFtcGxlXHJcbiAgICAqIC8vIFRvIGludm9rZSB0aGlzIGZ1bmN0aW9uIHdpdGhpbiBhIGNsYXNzIHRoYXQgaGFuZGxlcyB0ZXh0IGZvcm1hdHRpbmc6XHJcbiAgICAqIHRoaXMuZW1pdEZvcm1hdENoYW5nZUV2ZW50cygpO1xyXG4gICAgKlxyXG4gICAgKiBAZGVzY3JpcHRpb25cclxuICAgICogSGVyZSdzIGhvdyB0aGUgZnVuY3Rpb24gd29ya3M6XHJcbiAgICAqIDEuIENoZWNrcyBmb3IgYW4gYWN0aXZlIGFuZCBub24tZW1wdHkgdGV4dCBzZWxlY3Rpb24uIElmIGVtcHR5LCByZXR1cm5zIGVhcmx5LlxyXG4gICAgKiAyLiBHYXRoZXJzIGN1cnJlbnQgc3RhdGUgb2YgdGV4dCBmb3JtYXR0aW5nIGNvbW1hbmRzIHN1Y2ggYXMgJ2JvbGQnLCAnaXRhbGljJywgJ3VuZGVybGluZScsIGFuZCAnc3RyaWtlVGhyb3VnaCcsXHJcbiAgICAqICAgIGFuZCBkeW5hbWljYWxseSBjb2xsZWN0cyB0aGUgc3RhdGUgb2YgdmFyaW91cyBoaWdobGlnaHQgY29sb3JzIHVzaW5nIGEgc2VydmljZS5cclxuICAgICogMy4gRGlzcGF0Y2hlcyBhIGN1c3RvbSBldmVudCAoYEN1c3RvbUV2ZW50cy50ZXh0Rm9ybWF0Q2hhbmdlZGApIHdpdGggdGhlc2UgZm9ybWF0dGluZyBzdGF0ZXMuXHJcbiAgICAqICAgIENvbXBvbmVudHMgdGhyb3VnaG91dCB0aGUgYXBwbGljYXRpb24gbGlzdGVuIHRvIHRoaXMgZXZlbnQgYW5kIHVwZGF0ZSB0aGVpciBzdGF0ZXMgYWNjb3JkaW5nbHksXHJcbiAgICAqICAgIGVuc3VyaW5nIHRoYXQgVUkgY29udHJvbHMgbGlrZSB0b29sYmFyIGJ1dHRvbnMgcmVmbGVjdCB0aGUgY3VycmVudCBmb3JtYXR0aW5nIG9mIHRoZSBzZWxlY3RlZCB0ZXh0LlxyXG4gICAgKi9cclxuICAgIC8vIHN0YXRpYyBlbWl0Rm9ybWF0Q2hhbmdlRXZlbnQgPSAoXHJcblxyXG4gICAgLy8gICAgIGJvbGQ6IGJvb2xlYW4sXHJcbiAgICAvLyAgICAgaXRhbGljOiBib29sZWFuLFxyXG4gICAgLy8gICAgIHVuZGVybGluZTogYm9vbGVhbixcclxuICAgIC8vICAgICBzdHJpa2VUaHJvdWdoOiBib29sZWFuLFxyXG4gICAgLy8gICAgIGhpbGl0ZUNvbG9yOiB7IFtrZXk6IHN0cmluZ10gOiBib29sZWFuIH0sIFxyXG4gICAgLy8gICAgIGZvcmVDb2xvcjogeyBba2V5OiBzdHJpbmddIDogYm9vbGVhbn0pOiB2b2lkID0+IHtcclxuXHJcbiAgICAvLyAgICAgLy8gVGhpcyBibG9jayBjaGVja3MgZm9yIGFuIGFjdGl2ZSBzZWxlY3Rpb24gYW5kIHdoZXRoZXIgaXQgY29udGFpbnMgYW55IGNvbnRlbnQuXHJcbiAgICAvLyAgICAgLy8gSW4gRmlyZWZveCwgdGhlIGBzZWxlY3Rpb25jaGFuZ2VgIGV2ZW50IG1heSBiZSBmaXJlZCBldmVuIHdoaWxlIHR5cGluZyxcclxuICAgIC8vICAgICAvLyB3aGljaCBpcyBub3QgdGhlIGludGVuZGVkIHRyaWdnZXIgc2luY2Ugd2Ugb25seSB3YW50IHRvIHJlYWN0IHRvIGFjdHVhbCBjaGFuZ2VzIGluIHNlbGVjdGlvbi5cclxuICAgIC8vICAgICAvLyBJZiB0aGUgc2VsZWN0aW9uIGlzIGVtcHR5IG9yIG51bGwsIHRoZSBmdW5jdGlvbiByZXR1cm5zIGVhcmx5LCBlZmZlY3RpdmVseSBpZ25vcmluZ1xyXG4gICAgLy8gICAgIC8vIHRoZXNlIHVud2FudGVkIGBzZWxlY3Rpb25jaGFuZ2VgIGV2ZW50cyBkdXJpbmcgdHlwaW5nLlxyXG4gICAgLy8gICAgIGNvbnN0IHNlbGVjdGlvbiA9IGRvY3VtZW50LmdldFNlbGVjdGlvbigpO1xyXG4gICAgLy8gICAgIGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbj8udG9TdHJpbmcoKS50cmltKCkgPT09ICcnKSB7XHJcbiAgICAvLyAgICAgICAgIHJldHVybjtcclxuICAgIC8vICAgICB9XHJcblxyXG4gICAgLy8gICAgIGNvbnN0IGNvbW1hbmRTdGF0ZXM6IElGb3JtYXRDb21tYW5kID0ge1xyXG4gICAgLy8gICAgICAgICBib2xkOiBib2xkLFxyXG4gICAgLy8gICAgICAgICBpdGFsaWM6IGl0YWxpYyxcclxuICAgIC8vICAgICAgICAgdW5kZXJsaW5lOiB1bmRlcmxpbmUsXHJcbiAgICAvLyAgICAgICAgIHN0cmlrZVRocm91Z2g6IHN0cmlrZVRocm91Z2gsXHJcbiAgICAvLyAgICAgICAgIGhpbGl0ZUNvbG9yOiBoaWxpdGVDb2xvcixcclxuICAgIC8vICAgICAgICAgZm9yZUNvbG9yOiBmb3JlQ29sb3IsXHJcbiAgICAvLyAgICAgICAgIGNlbGxIaWxpdGVDb2xvcjoge31cclxuICAgIC8vICAgICB9O1xyXG5cclxuICAgIC8vICAgICBjb25zdCBjdXN0b21FdmVudCA9IG5ldyBDdXN0b21FdmVudDxJRm9ybWF0Q29tbWFuZD4oQ3VzdG9tRXZlbnRzLnRleHRGb3JtYXRDaGFuZ2VkLCB7XHJcbiAgICAvLyAgICAgICAgIGRldGFpbDogY29tbWFuZFN0YXRlc1xyXG4gICAgLy8gICAgIH0pO1xyXG5cclxuICAgIC8vICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KGN1c3RvbUV2ZW50KTtcclxuICAgIC8vIH1cclxuXHJcbiAgICBzdGF0aWMgZW1pdENoYW5nZVRhYmxlQm9yZGVyQ29sb3JFdmVudChzY29wZTogVGFibGVTY29wZXMsIGNvbG9yOiBDb2xvcnMpOiB2b2lkIHtcclxuXHJcbiAgICAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQ8SUNvbW1hbmRFdmVudERldGFpbD4oQ3VzdG9tRXZlbnRzLmVtaXR0ZWRDb21tYW5kLCB7XHJcbiAgICAgICAgICAgIGRldGFpbDoge1xyXG4gICAgICAgICAgICAgICAgY29tbWFuZDogQ29tbWFuZHMuY2hhbmdlVGFibGVCb3JkZXJDb2xvcixcclxuICAgICAgICAgICAgICAgIHZhbHVlOiBjb2xvcixcclxuICAgICAgICAgICAgICAgIHNjb3BlOiBzY29wZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoY3VzdG9tRXZlbnQpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvLyBzdGF0aWMgZW1pdENlbGxDaGFuZ2VFdmVudCA9IChjZWxsOiBIVE1MVGFibGVDZWxsRWxlbWVudCk6IHZvaWQgPT4ge1xyXG5cclxuICAgIC8vICAgICBjb25zdCBjZWxsSGlsaXRlQ29sb3I6IHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9ID0ge307XHJcblxyXG4gICAgLy8gICAgIGNlbGxIaWxpdGVDb2xvcltDb2xvcnMuSGlsaXRlQ29sb3JSZWRdID0gVGFibGVVdGlscy5pc0NlbGxCYWNrZ3JvdW5kQ29sb3IoY2VsbCwgQ29sb3JzLkhpbGl0ZUNvbG9yUmVkKTtcclxuICAgIC8vICAgICBjZWxsSGlsaXRlQ29sb3JbQ29sb3JzLkhpbGl0ZUNvbG9yR3JlZW5dID0gVGFibGVVdGlscy5pc0NlbGxCYWNrZ3JvdW5kQ29sb3IoY2VsbCwgQ29sb3JzLkhpbGl0ZUNvbG9yR3JlZW4pO1xyXG4gICAgLy8gICAgIGNlbGxIaWxpdGVDb2xvcltDb2xvcnMuSGlsaXRlQ29sb3JCbHVlXSA9IFRhYmxlVXRpbHMuaXNDZWxsQmFja2dyb3VuZENvbG9yKGNlbGwsIENvbG9ycy5IaWxpdGVDb2xvckJsdWUpO1xyXG4gICAgLy8gICAgIGNlbGxIaWxpdGVDb2xvcltDb2xvcnMuSGlsaXRlQ29sb3JZZWxsb3ddID0gVGFibGVVdGlscy5pc0NlbGxCYWNrZ3JvdW5kQ29sb3IoY2VsbCwgQ29sb3JzLkhpbGl0ZUNvbG9yWWVsbG93KTtcclxuICAgIC8vICAgICBjZWxsSGlsaXRlQ29sb3JbQ29sb3JzLkhpbGl0ZUNvbG9yR3JleV0gPSBUYWJsZVV0aWxzLmlzQ2VsbEJhY2tncm91bmRDb2xvcihjZWxsLCBDb2xvcnMuSGlsaXRlQ29sb3JHcmV5KTtcclxuXHJcbiAgICAvLyAgICAgY29uc3QgY29tbWFuZFN0YXRlczogSUZvcm1hdENvbW1hbmQgPSB7XHJcbiAgICAvLyAgICAgICAgIGJvbGQ6IGZhbHNlLFxyXG4gICAgLy8gICAgICAgICBpdGFsaWM6IGZhbHNlLFxyXG4gICAgLy8gICAgICAgICB1bmRlcmxpbmU6IGZhbHNlLFxyXG4gICAgLy8gICAgICAgICBzdHJpa2VUaHJvdWdoOiBmYWxzZSxcclxuICAgIC8vICAgICAgICAgaGlsaXRlQ29sb3I6IHt9LFxyXG4gICAgLy8gICAgICAgICBmb3JlQ29sb3I6IHt9LFxyXG4gICAgLy8gICAgICAgICBjZWxsSGlsaXRlQ29sb3I6IGNlbGxIaWxpdGVDb2xvclxyXG4gICAgLy8gICAgIH07XHJcblxyXG4gICAgLy8gICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50PElGb3JtYXRDb21tYW5kPihDdXN0b21FdmVudHMudGV4dEZvcm1hdENoYW5nZWQsIHtcclxuICAgIC8vICAgICAgICAgZGV0YWlsOiBjb21tYW5kU3RhdGVzXHJcbiAgICAvLyAgICAgfSk7XHJcblxyXG4gICAgLy8gICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoY3VzdG9tRXZlbnQpO1xyXG4gICAgLy8gfVxyXG5cclxufSIsImltcG9ydCB7IElCbG9ja09wZXJhdGlvbnNTZXJ2aWNlIH0gZnJvbSBcIi4vSUJsb2NrT3BlcmF0aW9uc1NlcnZpY2VcIjtcbmltcG9ydCB7IElFbGVtZW50RmFjdG9yeVNlcnZpY2UgfSBmcm9tIFwiLi4vZWxlbWVudC1mYWN0b3J5L0lFbGVtZW50RmFjdG9yeVNlcnZpY2VcIjtcbmltcG9ydCB7IEVsZW1lbnRGYWN0b3J5U2VydmljZSB9IGZyb20gXCIuLi9lbGVtZW50LWZhY3RvcnkvRWxlbWVudEZhY3RvcnlTZXJ2aWNlXCI7XG5pbXBvcnQgeyBDb250ZW50VHlwZXMgfSBmcm9tIFwiQC9jb21tb24vQ29udGVudFR5cGVzXCI7XG5pbXBvcnQgeyBET01VdGlscyB9IGZyb20gXCJAL3V0aWxpdGllcy9ET01VdGlsc1wiO1xuaW1wb3J0IHsgQ3VzdG9tRXZlbnRzIH0gZnJvbSBcIkAvY29tbW9uL0N1c3RvbUV2ZW50c1wiO1xuaW1wb3J0IHsgRGVwZW5kZW5jeUNvbnRhaW5lciB9IGZyb20gXCJAL2NvcmUvRGVwZW5kZW5jeUNvbnRhaW5lclwiO1xuaW1wb3J0IHsgSUZvY3VzU3RhY2sgfSBmcm9tIFwiQC9jb3JlL0lGb2N1c1N0YWNrXCI7XG5pbXBvcnQgeyBJTWVtZW50byB9IGZyb20gXCJAL2NvcmUvSU1lbWVudG9cIjtcbmltcG9ydCB7IFV0aWxzIH0gZnJvbSBcIkAvdXRpbGl0aWVzL1V0aWxzXCI7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tIFwiQC9jb21tYW5kcy9FdmVudEVtaXR0ZXJcIjtcblxuZXhwb3J0IGNsYXNzIEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UgaW1wbGVtZW50cyBJQmxvY2tPcGVyYXRpb25zU2VydmljZSB7XG5cbiAgICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZTogQmxvY2tPcGVyYXRpb25zU2VydmljZTtcblxuICAgIHByaXZhdGUgZWxlbWVudEZhY3RvcnlTZXJ2aWNlOiBJRWxlbWVudEZhY3RvcnlTZXJ2aWNlO1xuICAgIHByaXZhdGUgbWVtZW50bzogSU1lbWVudG87XG4gICAgcHJpdmF0ZSBmb2N1c1N0YWNrOiBJRm9jdXNTdGFjaztcblxuICAgIHN0YXRpYyBCTE9DS19PUEVSQVRJT05TID0ge1xuICAgICAgICBUVVJOX0lOVE86IFwidHVybkludG9cIixcbiAgICAgICAgQ1JFQVRFX0RFRkFVTFRfQkxPQ0s6IFwiQ3JlYXRlRGVmYXVsdEJsb2NrXCIsXG4gICAgICAgIERFTEVURV9GT0NVU19PTl9QUkVWSU9VUzogXCJEZWxldGVBbmRGb2N1c09uUHJldmlvdXNcIixcbiAgICAgICAgREVMRVRFX0ZPQ1VTX09OX05FWFQ6IFwiRGVsZXRlQW5kRm9jdXNPbk5leHRcIixcbiAgICAgICAgRk9DVVNfT05fRklSU1Q6IFwiRm9jdXNPbkZpcnN0XCIsXG4gICAgICAgIEZPQ1VTX09OX1BSRVZJT1VTOiBcIkZvY3VzT25QcmV2aW91c1wiLFxuICAgICAgICBGT0NVU19PTl9ORVhUOiBcIkZvY3VzT25OZXh0XCIsXG4gICAgICAgIERFTEVURTogXCJkZWxldGVcIixcbiAgICAgICAgRFVQTElDQVRFOiBcImR1cGxpY2F0ZVwiLFxuICAgICAgICBDT1BZOiBcImNvcHlcIixcbiAgICAgICAgUEFTVEU6IFwicGF0ZXNcIixcbiAgICAgICAgQ1VUOiBcImN1dFwiLFxuICAgICAgICBSRU1PVkVfRk9STUFUOiBcInJlbW92ZUZvcm1hdFwiLFxuICAgICAgICBUUkFOU0ZPUk1fQkxPQ0s6IFwidHJhbnNmb3JtQmxvY2tcIlxuICAgIH07XG5cbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKFxuICAgICAgICBlbGVtZW50RmFjdG9yeVNlcnZpY2U6IElFbGVtZW50RmFjdG9yeVNlcnZpY2UsXG4gICAgICAgIGZvY3VzU3RhY2s6IElGb2N1c1N0YWNrLFxuICAgICAgICBtZW1lbnRvOiBJTWVtZW50bykge1xuXG4gICAgICAgIGlmIChCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLmluc3RhbmNlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVc2UgQmxvY2tPcGVyYXRpb25zU2VydmljZS5nZXRJbnN0YW5jZSgpIHRvIGdldCBpbnN0YW5jZS5cIik7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmVsZW1lbnRGYWN0b3J5U2VydmljZSA9IGVsZW1lbnRGYWN0b3J5U2VydmljZTtcbiAgICAgICAgdGhpcy5mb2N1c1N0YWNrID0gZm9jdXNTdGFjaztcbiAgICAgICAgdGhpcy5tZW1lbnRvID0gbWVtZW50bztcblxuICAgICAgICBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLmluc3RhbmNlID0gdGhpcztcbiAgICB9XG5cbiAgICBleGVjQ29tbWFuZChjb21tYW5kOiBzdHJpbmcsIHNob3dVSTogYm9vbGVhbiwgdmFsdWU6IHN0cmluZyB8IG51bGwgPSBudWxsKTogYm9vbGVhbiB7XG5cbiAgICAgICAgaWYgKGNvbW1hbmQgPT0gQmxvY2tPcGVyYXRpb25zU2VydmljZS5CTE9DS19PUEVSQVRJT05TLkNPUFkpIHtcblxuICAgICAgICAgICAgaWYgKGRvY3VtZW50LmdldFNlbGVjdGlvbiAmJiBuYXZpZ2F0b3IuY2xpcGJvYXJkICYmIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gZG9jdW1lbnQuZ2V0U2VsZWN0aW9uKCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0aW9uICYmIHNlbGVjdGlvbi50b1N0cmluZygpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRUZXh0ID0gc2VsZWN0aW9uLnRvU3RyaW5nKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQoc2VsZWN0ZWRUZXh0KS50aGVuKCgpID0+IHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29waWVkRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoJ2NvcGllZFRleHQnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxhYmxlOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChjb3BpZWRFdmVudCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKChlcnI6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3Igd2hlbiBjb3B5IHRleHQnLCBlcnIpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb21tYW5kID09IEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuQkxPQ0tfT1BFUkFUSU9OUy5DVVQpIHtcblxuICAgICAgICAgICAgaWYgKGRvY3VtZW50LmdldFNlbGVjdGlvbiAmJiBuYXZpZ2F0b3IuY2xpcGJvYXJkICYmIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gZG9jdW1lbnQuZ2V0U2VsZWN0aW9uKCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0aW9uICYmIHNlbGVjdGlvbi50b1N0cmluZygpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRUZXh0ID0gc2VsZWN0aW9uLnRvU3RyaW5nKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uLmRlbGV0ZUZyb21Eb2N1bWVudCgpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnN0IGhpZGVFdmVudCA9IG5ldyBDdXN0b21FdmVudCggJ3JlcXVlc3RIaWRlRmxvYXRpbmdUb29sYmFyJywge1xuICAgICAgICAgICAgICAgICAgICAvLyAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIGNhbmNlbGFibGU6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgLy8gfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChoaWRlRXZlbnQpO1xuXG4gICAgICAgICAgICAgICAgICAgIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KHNlbGVjdGVkVGV4dCkudGhlbigoKSA9PiB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKChlcnI6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3Igd2hlbiBjdXQgdGV4dDogJywgZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29tbWFuZCA9PSBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLkJMT0NLX09QRVJBVElPTlMuUEFTVEUpIHtcbiAgICAgICAgICAgIGlmIChuYXZpZ2F0b3IuY2xpcGJvYXJkICYmIG5hdmlnYXRvci5jbGlwYm9hcmQucmVhZFRleHQpIHtcbiAgICAgICAgICAgICAgICBuYXZpZ2F0b3IuY2xpcGJvYXJkLnJlYWRUZXh0KCkudGhlbigocGFzdGVkVGV4dDogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IGRvY3VtZW50LmdldFNlbGVjdGlvbigpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rpb24gJiYgc2VsZWN0aW9uLnJhbmdlQ291bnQgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UuZGVsZXRlQ29udGVudHMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlLmluc2VydE5vZGUoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUocGFzdGVkVGV4dCkpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3Rpb25FdmVudCA9IG5ldyBDdXN0b21FdmVudCgncmVxdWVzdFVwZGF0ZUZsb2F0aW5nVG9vbGJhcicsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbmNlbGFibGU6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHNlbGVjdGlvbkV2ZW50KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdObyB0ZXh0IHNlbGVjdGVkIG9yIGNsaXBib2FyZCBlbXB0eS4nKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pLmNhdGNoKChlcnI6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciB3aGVuIHBhc3RpbmcgdGV4dDogJywgZXJyKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbW1hbmQgPT0gQmxvY2tPcGVyYXRpb25zU2VydmljZS5CTE9DS19PUEVSQVRJT05TLlRSQU5TRk9STV9CTE9DSykge1xuXG4gICAgICAgICAgICBjb25zdCBibG9jayA9IHRoaXMuZ2V0Q3VycmVudFNlbGVjdGVkQmxvY2soKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgIGlmIChibG9jayAmJiB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMudHJhbnNmb3JtQmxvY2sodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbW1hbmQgPT0gQmxvY2tPcGVyYXRpb25zU2VydmljZS5CTE9DS19PUEVSQVRJT05TLlJFTU9WRV9GT1JNQVQpIHtcbiAgICAgICAgICAgIHJldHVybiBkb2N1bWVudC5leGVjQ29tbWFuZChCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLkJMT0NLX09QRVJBVElPTlMuUkVNT1ZFX0ZPUk1BVCwgZmFsc2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbW1hbmQgPT0gQmxvY2tPcGVyYXRpb25zU2VydmljZS5CTE9DS19PUEVSQVRJT05TLkRFTEVURSkge1xuXG4gICAgICAgICAgICB0aGlzLmRlbGV0ZUFuZEZvY3VzT25OZXh0KCk7XG5cbiAgICAgICAgICAgIGNvbnN0IGhpZGVFdmVudCA9IG5ldyBDdXN0b21FdmVudChDdXN0b21FdmVudHMuYmxvY2tEZWxldGVkLCB7XG4gICAgICAgICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICAgICAgICBjYW5jZWxhYmxlOiB0cnVlXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChoaWRlRXZlbnQpO1xuXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb21tYW5kID09IEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuQkxPQ0tfT1BFUkFUSU9OUy5EVVBMSUNBVEUpIHtcblxuICAgICAgICAgICAgdGhpcy5kdXBsaWNhdGVTZWxlY3RlZEJsb2NrKCk7XG5cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbW1hbmQgPT0gQmxvY2tPcGVyYXRpb25zU2VydmljZS5CTE9DS19PUEVSQVRJT05TLkNSRUFURV9ERUZBVUxUX0JMT0NLKSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCB8fCBudWxsO1xuXG4gICAgICAgICAgICB0aGlzLmNyZWF0ZURlZmF1bHRCbG9jayhlbGVtZW50KTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbW1hbmQgPT0gQmxvY2tPcGVyYXRpb25zU2VydmljZS5CTE9DS19PUEVSQVRJT05TLkZPQ1VTX09OX0ZJUlNUKSB7XG5cbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiLmZvY3VzYWJsZVwiKTtcblxuICAgICAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAoZWxlbWVudCBhcyBIVE1MRWxlbWVudCkuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbW1hbmQgPT0gQmxvY2tPcGVyYXRpb25zU2VydmljZS5CTE9DS19PUEVSQVRJT05TLkRFTEVURV9GT0NVU19PTl9QUkVWSU9VUykge1xuICAgICAgICAgICAgdGhpcy5kZWxldGVBbmRGb2N1c09uUHJldmlvdXMoKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbW1hbmQgPT0gQmxvY2tPcGVyYXRpb25zU2VydmljZS5CTE9DS19PUEVSQVRJT05TLkRFTEVURV9GT0NVU19PTl9ORVhUKSB7XG4gICAgICAgICAgICB0aGlzLmRlbGV0ZUFuZEZvY3VzT25OZXh0KCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb21tYW5kID09IEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuQkxPQ0tfT1BFUkFUSU9OUy5GT0NVU19PTl9QUkVWSU9VUykge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG5cbiAgICAgICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5mb2N1c09uUHJldmlvdXMoZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29tbWFuZCA9PSBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLkJMT0NLX09QRVJBVElPTlMuRk9DVVNfT05fTkVYVCkge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG5cbiAgICAgICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5mb2N1c09uTmV4dChlbGVtZW50KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGlmIChjb21tYW5kID09IEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuQkxPQ0tfT1BFUkFUSU9OUy5UVVJOX0lOVE8pIHtcblxuICAgICAgICAvLyAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICAvLyAgICAgICAgIHRocm93IG5ldyBFcnJvcigpO1xuICAgICAgICAvLyAgICAgfVxuXG4gICAgICAgIC8vICAgICBjb25zdCBlbGVtZW50ID0gQmxvY2tPcGVyYXRpb25zU2VydmljZS5nZXREcmFnZ2FibGVFbGVtZW50RnJvbVNlbGVjdGlvbigpO1xuXG4gICAgICAgIC8vICAgICB0aGlzLmZvcm1hdEJsb2NrKGVsZW1lbnQsIHZhbHVlKTtcbiAgICAgICAgLy8gfVxuXG4gICAgICAgIC8vIGNvbnN0IHNlbGVjdGlvbkV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KCdyZXF1ZXN0SGlkZUZsb2F0aW5nVG9vbGJhcicsIHtcbiAgICAgICAgLy8gICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIC8vICAgICBjYW5jZWxhYmxlOiB0cnVlXG4gICAgICAgIC8vIH0pO1xuXG4gICAgICAgIC8vIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoc2VsZWN0aW9uRXZlbnQpO1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHF1ZXJ5Q29tbWFuZFN0YXRlKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNZXRob2Qgbm90IGltcGxlbWVudGVkLlwiKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0SW5zdGFuY2UoKTogQmxvY2tPcGVyYXRpb25zU2VydmljZSB7XG5cbiAgICAgICAgY29uc3QgZWxlbWVudEZhY3RvcnlTZXJ2aWNlID0gRGVwZW5kZW5jeUNvbnRhaW5lci5JbnN0YW5jZS5yZXNvbHZlPElFbGVtZW50RmFjdG9yeVNlcnZpY2U+KFwiSUVsZW1lbnRGYWN0b3J5U2VydmljZVwiKTtcbiAgICAgICAgY29uc3QgZm9jdXNTdGFjayA9IERlcGVuZGVuY3lDb250YWluZXIuSW5zdGFuY2UucmVzb2x2ZTxJRm9jdXNTdGFjaz4oXCJJRm9jdXNTdGFja1wiKTtcbiAgICAgICAgY29uc3QgbWVtZW50byA9IERlcGVuZGVuY3lDb250YWluZXIuSW5zdGFuY2UucmVzb2x2ZTxJTWVtZW50bz4oXCJJTWVtZW50b1wiKTtcblxuICAgICAgICBpZiAoIXRoaXMuaW5zdGFuY2UpIHtcbiAgICAgICAgICAgIHRoaXMuaW5zdGFuY2UgPSBuZXcgQmxvY2tPcGVyYXRpb25zU2VydmljZShlbGVtZW50RmFjdG9yeVNlcnZpY2UsIGZvY3VzU3RhY2ssIG1lbWVudG8pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaW5zdGFuY2U7XG4gICAgfVxuXG4gICAgc3RhdGljIGdldERyYWdnYWJsZUVsZW1lbnRGcm9tU2VsZWN0aW9uKCk6IEhUTUxFbGVtZW50IHtcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuXG4gICAgICAgIGlmIChzZWxlY3Rpb24gJiYgc2VsZWN0aW9uLnJhbmdlQ291bnQgPiAwKSB7XG4gICAgICAgICAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xuICAgICAgICAgICAgbGV0IGVsZW1lbnQ6IE5vZGUgfCBudWxsID0gcmFuZ2UuY29tbW9uQW5jZXN0b3JDb250YWluZXI7XG5cbiAgICAgICAgICAgIGlmIChlbGVtZW50Lm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBlbGVtZW50LnBhcmVudE5vZGUgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHdoaWxlIChlbGVtZW50ICYmICEoZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSkge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBlbGVtZW50LnBhcmVudE5vZGUgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRyYWdnYWJsZSA9IGVsZW1lbnQuY2xvc2VzdCgnLmJsb2NrJykgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRyYWdnYWJsZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJldG9ybmFyIG51bGwgc2UgbmVuaHVtYSBzZWxlw6fDo28gdsOhbGlkYSBmb3IgZW5jb250cmFkYSBvdSBuZW5odW0gZWxlbWVudG8gY29ycmVzcG9uZGVudGVcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCk7XG4gICAgfVxuXG4gICAgLy8gc3RhdGljIGdldFRhZ05hbWVCeUNvbW1hbmROYW1lKGNvbW1hbmROYW1lOiBzdHJpbmcpIHtcbiAgICAvLyAgICAgc3dpdGNoIChjb21tYW5kTmFtZSkge1xuICAgIC8vICAgICAgICAgY2FzZSBcInR1cm5JbnRvUGFyYWdyYXBoXCI6XG4gICAgLy8gICAgICAgICAgICAgcmV0dXJuIFwicFwiO1xuICAgIC8vICAgICAgICAgY2FzZSBcInR1cm5JbnRvSDFcIjpcbiAgICAvLyAgICAgICAgICAgICByZXR1cm4gXCJoMVwiO1xuICAgIC8vICAgICAgICAgY2FzZSBcInR1cm5JbnRvSDJcIjpcbiAgICAvLyAgICAgICAgICAgICByZXR1cm4gXCJoMlwiO1xuICAgIC8vICAgICAgICAgY2FzZSBcInR1cm5JbnRvSDNcIjpcbiAgICAvLyAgICAgICAgICAgICByZXR1cm4gXCJoM1wiO1xuICAgIC8vICAgICAgICAgY2FzZSBcInR1cm5JbnRvSDRcIjpcbiAgICAvLyAgICAgICAgICAgICByZXR1cm4gXCJoNFwiO1xuICAgIC8vICAgICAgICAgY2FzZSBcInR1cm5JbnRvSDVcIjpcbiAgICAvLyAgICAgICAgICAgICByZXR1cm4gXCJoNVwiO1xuICAgIC8vICAgICAgICAgY2FzZSBcInR1cm5JbnRvSDZcIjpcbiAgICAvLyAgICAgICAgICAgICByZXR1cm4gXCJoNlwiO1xuXG4gICAgLy8gICAgICAgICBkZWZhdWx0OlxuICAgIC8vICAgICAgICAgICAgIHRocm93IEVycm9yKFwiRXJyb3JcIik7XG4gICAgLy8gICAgIH1cbiAgICAvLyB9XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICAgIC8vIGFwcGx5U2VsZWN0ZWRCbG9ja1R5cGUoZHJhZ2dhYmxlQmxvY2s6IEhUTUxFbGVtZW50LCBuZXdCbG9ja1R5cGU6IHN0cmluZykge1xuXG4gICAgLy8gICAgIC8vIGNvbnN0IGRyYWdnYWJsZUJsb2NrID0gcmVhbEZvY3VzZWRFbGVtZW50LmNsb3Nlc3QoJy5ibG9jaycpO1xuICAgIC8vICAgICAvLyBjb25zdCBuZXdCbG9ja1R5cGUgPSBldmVudC50YXJnZXQuY2xvc2VzdCgnLm9wdGlvbicpID9cbiAgICAvLyAgICAgLy8gICAgIGV2ZW50LnRhcmdldC5jbG9zZXN0KCcub3B0aW9uJykuZ2V0QXR0cmlidXRlKCdkYXRhLXR5cGUnKSA6XG4gICAgLy8gICAgIC8vICAgICBjdXJyZW50RmFrZUZvY3VzZWRPcHRpb24uZ2V0QXR0cmlidXRlKCdkYXRhLXR5cGUnKTtcblxuICAgIC8vICAgICBjb25zdCBsYXN0U2xhc2hJbmRleCA9IHJlYWxGb2N1c2VkRWxlbWVudC5pbm5lclRleHQubGFzdEluZGV4T2YoJy8nKTtcbiAgICAvLyAgICAgcmVhbEZvY3VzZWRFbGVtZW50LmlubmVyVGV4dCA9IGxhc3RTbGFzaEluZGV4ICE9PSAtMSA/IHJlYWxGb2N1c2VkRWxlbWVudC5pbm5lclRleHQuc2xpY2UoMCwgbGFzdFNsYXNoSW5kZXgpIDogcmVhbEZvY3VzZWRFbGVtZW50LmlubmVyVGV4dDtcblxuXG4gICAgLy8gICAgIHRyYW5zZm9ybUJsb2NrKGRyYWdnYWJsZUJsb2NrLCBuZXdCbG9ja1R5cGUpO1xuXG4gICAgLy8gICAgIGhpZGVBbmRDbGVhckJsb2NrT3B0aW9ucygpO1xuICAgIC8vICAgICBoaWRlQWxsRGVwZW5kZW50Qm94KCk7XG4gICAgLy8gICAgIGhpZGVmbG9hdGluZ1Rvb2xiYXIoKTtcbiAgICAvLyB9XG5cbiAgICAvLyBmb3JtYXRCbG9jayhlbGVtZW50OiBIVE1MRWxlbWVudCwgY29udGVudFR5cGU6IHN0cmluZylcbiAgICB0cmFuc2Zvcm1CbG9jayh0eXBlOiBzdHJpbmcsIGVsZW1lbnQ/OiBIVE1MRWxlbWVudCB8IG51bGwpIHtcblxuICAgICAgICBsZXQgYmxvY2tFbGVtZW50OiBFbGVtZW50IHwgbnVsbDtcblxuICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgICAgYmxvY2tFbGVtZW50ID0gZWxlbWVudC5jbG9zZXN0KFwiLmJsb2NrXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYmxvY2tFbGVtZW50ID0gdGhpcy5mb2N1c1N0YWNrLnBlZWsoKT8uY2xvc2VzdChcIi5ibG9ja1wiKSB8fCBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGNvbnRlbnRFbGVtZW50ID0gYmxvY2tFbGVtZW50IS5xdWVyeVNlbGVjdG9yKCcuc3dpdHRhYmxlJykgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICAgICAgdGhpcy5mb2N1c1N0YWNrLnBlZWsoKT8uZm9jdXMoKTtcblxuICAgICAgICBET01VdGlscy5yZW1vdmVGaWx0ZXJUZXh0KCk7XG5cbiAgICAgICAgdGhpcy5tZW1lbnRvLnNhdmVTdGF0ZSgpO1xuXG4gICAgICAgIGxldCBjb250ZW50ID0gY29udGVudEVsZW1lbnQ/LmlubmVyVGV4dDtcblxuICAgICAgICBsZXQgZm9jdXNTdGFja1RvQWRkOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuXG5cbiAgICAgICAgbGV0IG5ld0NvbnRlbnRCbG9jaztcblxuICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuUEFSQUdSQVBIOlxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3Q29udGVudEJsb2NrID0gdGhpcy5lbGVtZW50RmFjdG9yeVNlcnZpY2UuY3JlYXRlKEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLlBBUkFHUkFQSCk7XG4gICAgICAgICAgICAgICAgICAgIG5ld0NvbnRlbnRCbG9jay5pbm5lclRleHQgPSBjb250ZW50O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl8xOlxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3Q29udGVudEJsb2NrID0gdGhpcy5lbGVtZW50RmFjdG9yeVNlcnZpY2UuY3JlYXRlKEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl8xKTtcbiAgICAgICAgICAgICAgICAgICAgbmV3Q29udGVudEJsb2NrLmlubmVyVGV4dCA9IGNvbnRlbnQ7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuSEVBREVSXzI6XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBuZXdDb250ZW50QmxvY2sgPSB0aGlzLmVsZW1lbnRGYWN0b3J5U2VydmljZS5jcmVhdGUoRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuSEVBREVSXzIpO1xuICAgICAgICAgICAgICAgICAgICBuZXdDb250ZW50QmxvY2suaW5uZXJUZXh0ID0gY29udGVudDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfMzpcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG5ld0NvbnRlbnRCbG9jayA9IHRoaXMuZWxlbWVudEZhY3RvcnlTZXJ2aWNlLmNyZWF0ZShFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfMyk7XG4gICAgICAgICAgICAgICAgICAgIG5ld0NvbnRlbnRCbG9jay5pbm5lclRleHQgPSBjb250ZW50O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl80OlxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3Q29udGVudEJsb2NrID0gdGhpcy5lbGVtZW50RmFjdG9yeVNlcnZpY2UuY3JlYXRlKEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl80KTtcbiAgICAgICAgICAgICAgICAgICAgbmV3Q29udGVudEJsb2NrLmlubmVyVGV4dCA9IGNvbnRlbnQ7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuSEVBREVSXzU6XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBuZXdDb250ZW50QmxvY2sgPSB0aGlzLmVsZW1lbnRGYWN0b3J5U2VydmljZS5jcmVhdGUoRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuSEVBREVSXzUpO1xuICAgICAgICAgICAgICAgICAgICBuZXdDb250ZW50QmxvY2suaW5uZXJUZXh0ID0gY29udGVudDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfNjpcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG5ld0NvbnRlbnRCbG9jayA9IHRoaXMuZWxlbWVudEZhY3RvcnlTZXJ2aWNlLmNyZWF0ZShFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfNik7XG4gICAgICAgICAgICAgICAgICAgIG5ld0NvbnRlbnRCbG9jay5pbm5lclRleHQgPSBjb250ZW50O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkNPREU6XG4gICAgICAgICAgICAgICAgbmV3Q29udGVudEJsb2NrID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgncHJlJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgY29kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NvZGUnKTtcbiAgICAgICAgICAgICAgICBjb2RlLmlubmVyVGV4dCA9IGNvbnRlbnQ7XG4gICAgICAgICAgICAgICAgbmV3Q29udGVudEJsb2NrLmFwcGVuZENoaWxkKGNvZGUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgLy8gY2FzZSAnaW1hZ2UnOlxuICAgICAgICAgICAgLy8gICAgIG5ld0NvbnRlbnRCbG9jayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpO1xuICAgICAgICAgICAgLy8gICAgIG5ld0NvbnRlbnRCbG9jay5zcmMgPSBjb250ZW50O1xuICAgICAgICAgICAgLy8gICAgIG5ld0NvbnRlbnRCbG9jay5hbHQgPSBcIkRlc2NyaXB0aXZlIHRleHRcIjtcbiAgICAgICAgICAgIC8vICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuUVVPVEU6XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAvLyBuZXdDb250ZW50QmxvY2sgPSBmYWN0b3J5LmNyZWF0ZU5ld1F1b3RlRWxlbWVudChjb250ZW50KTtcblxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNhc2UgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuQlVMTEVURURfTElTVDpcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG5ld0NvbnRlbnRCbG9jayA9IHRoaXMuZWxlbWVudEZhY3RvcnlTZXJ2aWNlLmNyZWF0ZShFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5CVUxMRVRFRF9MSVNULCBjb250ZW50KTtcblxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNhc2UgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuTlVNQkVSRURfTElTVDpcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG5ld0NvbnRlbnRCbG9jayA9IHRoaXMuZWxlbWVudEZhY3RvcnlTZXJ2aWNlLmNyZWF0ZShFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5OVU1CRVJFRF9MSVNULCBjb250ZW50KTtcblxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkNIRUNLX0xJU1Q6XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBuZXdDb250ZW50QmxvY2sgPSB0aGlzLmVsZW1lbnRGYWN0b3J5U2VydmljZS5jcmVhdGUoRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuQ0hFQ0tfTElTVCwgY29udGVudCk7XG5cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjYXNlICdzZXBhcmF0b3InOlxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gbmV3Q29udGVudEJsb2NrID0gZmFjdG9yeS5jcmVhdGVOZXdTZXBhcmF0b3JFbGVtZW50KCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuVEFCTEU6XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBuZXdDb250ZW50QmxvY2sgPSB0aGlzLmVsZW1lbnRGYWN0b3J5U2VydmljZS5jcmVhdGUoRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuVEFCTEUsIFwiLCxcIik7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FzZSBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5JTUFHRTpcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG5ld0NvbnRlbnRCbG9jayA9IHRoaXMuZWxlbWVudEZhY3RvcnlTZXJ2aWNlLmNyZWF0ZShFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5JTUFHRSwgY29udGVudCk7XG4gICAgICAgICAgICAgICAgICAgIGZvY3VzU3RhY2tUb0FkZCA9IG5ld0NvbnRlbnRCbG9jaztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjYXNlIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkNBTExPVVQ6IHtcbiAgICAgICAgICAgICAgICBuZXdDb250ZW50QmxvY2sgPSB0aGlzLmVsZW1lbnRGYWN0b3J5U2VydmljZS5jcmVhdGUoRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuQ0FMTE9VVCwgY29udGVudCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignVW5zdXBwb3J0ZWQgdHlwZScpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghbmV3Q29udGVudEJsb2NrKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBibG9ja0VsZW1lbnQhLnJlcGxhY2VDaGlsZChuZXdDb250ZW50QmxvY2ssIGNvbnRlbnRFbGVtZW50KTtcblxuICAgICAgICBjb25zdCBmb2N1c2FibGUgPSAobmV3Q29udGVudEJsb2NrLmNsb3Nlc3QoJy5mb2N1c2FibGUnKSB8fCBibG9ja0VsZW1lbnQhLnF1ZXJ5U2VsZWN0b3IoJy5mb2N1c2FibGUnKSkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGlmIChmb2N1c2FibGUpIHtcbiAgICAgICAgICAgIGZvY3VzYWJsZS5mb2N1cygpO1xuICAgICAgICAgICAgRE9NVXRpbHMucGxhY2VDdXJzb3JBdEVuZE9mRWRpdGFibGVFbGVtZW50KGZvY3VzYWJsZSk7XG4gICAgICAgIH1cblxuXG4gICAgICAgIGlmKGZvY3VzU3RhY2tUb0FkZCl7XG4gICAgICAgICAgICB0aGlzLmZvY3VzU3RhY2sucHVzaCgoZm9jdXNTdGFja1RvQWRkIGFzIEhUTUxFbGVtZW50KSEpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYodHlwZSA9PSBcImltYWdlXCIpe1xuICAgICAgICAgICAgRXZlbnRFbWl0dGVyLmVtaXRTaG93RWxlbWVudEV2ZW50KFwibWVkaWFJbnB1dHRlclwiKTtcbiAgICAgICAgfVxuXG5cblxuICAgICAgICAvLydyZXF1ZXN0SGlkZUZsb2F0aW5nVG9vbGJhcidcbiAgICAgICAgLy8gY29uc3Qgc2VsZWN0aW9uRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoQ3VzdG9tRXZlbnRzLmJsb2NrVHlwZUNoYW5nZWQsIHtcbiAgICAgICAgLy8gICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIC8vICAgICBjYW5jZWxhYmxlOiB0cnVlXG4gICAgICAgIC8vIH0pO1xuXG4gICAgICAgIC8vIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoc2VsZWN0aW9uRXZlbnQpO1xuICAgIH1cblxuICAgIC8vTk9XIFRIRSBmb3JtYXRCbG9jayBBTkQgdHJhbnNmb3JtQmxvY2sgSVMgVEhFIFNBTUUuIGZvcm1hdEJsb2NrIElTIERFUFJFQ0VURUQgVVNFIHRyYW5zZm9ybUJsb2NrIElOU1RFRFxuICAgIC8vIGZvcm1hdEJsb2NrKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBjb250ZW50VHlwZTogc3RyaW5nKTogdm9pZCB7XG5cbiAgICAvLyAgICAgbGV0IGNvbnRlbnRFbGVtZW50ID0gZWxlbWVudC5xdWVyeVNlbGVjdG9yKCcuc3dpdHRhYmxlJykgYXMgSFRNTEVsZW1lbnQ7XG4gICAgLy8gICAgIGxldCBjb250ZW50ID0gY29udGVudEVsZW1lbnQuaW5uZXJUZXh0O1xuXG4gICAgLy8gICAgIGxldCBuZXdDb250ZW50QmxvY2sgPSB0aGlzLmVsZW1lbnRGYWN0b3J5U2VydmljZS5jcmVhdGUoY29udGVudFR5cGUsIGNvbnRlbnQpO1xuXG4gICAgLy8gICAgIGVsZW1lbnQucmVwbGFjZUNoaWxkKG5ld0NvbnRlbnRCbG9jaywgY29udGVudEVsZW1lbnQpO1xuXG4gICAgLy8gICAgIGNvbnN0IGZvY3VzYWJsZSA9IG5ld0NvbnRlbnRCbG9jay5jbG9zZXN0KCcuZm9jdXNhYmxlJykgfHwgZWxlbWVudC5xdWVyeVNlbGVjdG9yKCcuZm9jdXNhYmxlJyk7XG5cbiAgICAvLyAgICAgLy8gZm9jdXNPblRoZUVuZE9mVGhlVGV4dChmb2N1c2FibGUpO1xuICAgIC8vIH1cblxuXG5cbiAgICBjcmVhdGVOZXdFbGVtZW50KGV2ZW50OiBFdmVudCkge1xuXG4gICAgICAgIHRoaXMubWVtZW50by5zYXZlU3RhdGUoKTtcblxuICAgICAgICBjb25zdCBlbGVtZW50ID0gZXZlbnQudGFyZ2V0IGFzIEVsZW1lbnQ7XG5cbiAgICAgICAgY29uc3QgY29udGVudEVsZW1lbnQgPSBlbGVtZW50LmNsb3Nlc3QoJy5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQnKSBhcyBIVE1MRWxlbWVudDtcblxuICAgICAgICBpZiAoY29udGVudEVsZW1lbnQgJiYgY29udGVudEVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdsaXN0JykpIHtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlTGlzdEl0ZW0oY29udGVudEVsZW1lbnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jcmVhdGVEZWZhdWx0QmxvY2soY29udGVudEVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY3JlYXRlTGlzdEl0ZW0oZWxlbWVudDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcblxuICAgICAgICB0aGlzLm1lbWVudG8uc2F2ZVN0YXRlKCk7XG5cbiAgICAgICAgbGV0IG5ld0NvbnRlbnRFbGVtZW50ID0gbnVsbDtcblxuICAgICAgICBsZXQgYWN0aXZlRWxlbWVudCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gICAgICAgIGxldCBjb250ZW50RWxlbWVudCA9IGVsZW1lbnQuY2xvc2VzdCgnLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCcpIGFzIEhUTUxFbGVtZW50O1xuXG4gICAgICAgIGlmIChjb250ZW50RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2NoZWNrYm94LWxpc3QnKSkge1xuICAgICAgICAgICAgbmV3Q29udGVudEVsZW1lbnQgPSB0aGlzLmVsZW1lbnRGYWN0b3J5U2VydmljZS5jcmVhdGUoXCJjaGVja2JveEl0ZW1cIiwgXCJcIik7XG4gICAgICAgIH0gZWxzZSBpZiAoY29udGVudEVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdsaXN0JykpIHtcbiAgICAgICAgICAgIG5ld0NvbnRlbnRFbGVtZW50ID0gdGhpcy5lbGVtZW50RmFjdG9yeVNlcnZpY2UuY3JlYXRlKFwibGlzdEl0ZW1cIiwgXCJcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBuZXdDb250ZW50RWxlbWVudCA9IGNyZWF0ZU5ld0RyYWdnYWJsZVBhcmFncmFwaEVsZW1lbnQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGxldCBwYXJlbnRCbG9jayA9IG51bGw7XG5cbiAgICAgICAgLy8gaWYgKGNvbnRlbnRFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnbGlzdCcpKSB7XG5cbiAgICAgICAgLy8gICAgIHBhcmVudEJsb2NrID0gY29udGVudEVsZW1lbnQ7XG5cbiAgICAgICAgLy8gICAgIGNvbnN0IHRleHRDb250ZW50ID0gYWN0aXZlRWxlbWVudC50ZXh0Q29udGVudC50cmltKCk7XG5cbiAgICAgICAgLy8gICAgIGlmICh0ZXh0Q29udGVudCA9PT0gJycpIHtcblxuICAgICAgICAvLyAgICAgICAgIHBhcmVudEJsb2NrID0gZWxlbWVudC5jbG9zZXN0KCcuYmxvY2snKTtcblxuICAgICAgICAvLyAgICAgICAgIGVsZW1lbnQuY2xvc2VzdCgnLmRlbGV0YWJsZScpLnJlbW92ZSgpO1xuXG4gICAgICAgIC8vICAgICAgICAgbmV3Q29udGVudEVsZW1lbnQgPSBjcmVhdGVOZXdEcmFnZ2FibGVQYXJhZ3JhcGhFbGVtZW50KCk7XG4gICAgICAgIC8vICAgICAgICAgcGFyZW50QmxvY2suaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCdhZnRlcmVuZCcsIG5ld0NvbnRlbnRFbGVtZW50KTtcblxuICAgICAgICAvLyAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gICAgICAgICBjb25zdCBhY3RpdmVFbGVtZW50ID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudC5jbG9zZXN0KCcubGlzdC1pdGVtJyk7XG4gICAgICAgIC8vICAgICAgICAgYWN0aXZlRWxlbWVudC5pbnNlcnRBZGphY2VudEVsZW1lbnQoJ2FmdGVyZW5kJywgbmV3Q29udGVudEVsZW1lbnQpO1xuICAgICAgICAvLyAgICAgfVxuXG4gICAgICAgIC8vIH0gZWxzZSB7XG4gICAgICAgIC8vICAgICBwYXJlbnRCbG9jayA9IGVsZW1lbnQuY2xvc2VzdCgnLmJsb2NrJyk7XG5cbiAgICAgICAgLy8gICAgIGlmIChwYXJlbnRCbG9jaykge1xuICAgICAgICAvLyAgICAgICAgIGlmIChwYXJlbnRCbG9jay5uZXh0U2libGluZykge1xuICAgICAgICAvLyAgICAgICAgICAgICBwYXJlbnRCbG9jay5wYXJlbnROb2RlLmluc2VydEJlZm9yZShuZXdDb250ZW50RWxlbWVudCwgcGFyZW50QmxvY2submV4dFNpYmxpbmcpO1xuICAgICAgICAvLyAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vICAgICAgICAgICAgIHBhcmVudEJsb2NrLnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQobmV3Q29udGVudEVsZW1lbnQpO1xuICAgICAgICAvLyAgICAgICAgIH1cbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gfVxuXG4gICAgICAgIC8vIGZvY3VzT25UaGVFbmRPZlRoZVRleHQobmV3Q29udGVudEVsZW1lbnQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQ3JlYXRlcyBhIG5ldyBjb250ZW50IGVsZW1lbnQgKHBhcmFncmFwaCBvciBsaXN0IGl0ZW0pIGJhc2VkIG9uIHRoZSBjb250ZW50IHR5cGUgb2YgdGhlIGFjdGl2ZSBlbGVtZW50IGFuZCBzcGxpdHMgdGhlIGNvbnRlbnQgYWNjb3JkaW5nbHkuXG4gICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHRyaWdnZXJlZCBieSBwcmVzc2luZyAnRW50ZXInIGluIGFuIGVkaXRhYmxlIGNvbnRlbnQgYXJlYSwgZmFjaWxpdGF0aW5nIGR5bmFtaWMgY29udGVudCBjcmVhdGlvbiBhbmQgb3JnYW5pemF0aW9uXG4gICAgKiB3aXRoaW4gdGhlIGRvY3VtZW50LiBJdCBzdXBwb3J0cyBkaWZmZXJlbnQgY29udGVudCB0eXBlcyBpbmNsdWRpbmcgY2hlY2tsaXN0cywgYnVsbGV0ZWQgbGlzdHMsIG51bWJlcmVkIGxpc3RzLCBhbmQgZ2VuZXJhbCB0ZXh0IGJsb2Nrcy5cbiAgICAqXG4gICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gQWx3YXlzIHJldHVybnMgdHJ1ZSB0byBpbmRpY2F0ZSBzdWNjZXNzZnVsIGV4ZWN1dGlvbiwgcmVnYXJkbGVzcyBvZiB0aGUgcGF0aCB0YWtlbi5cbiAgICAqXG4gICAgKiBAZXhhbXBsZVxuICAgICogLy8gVHlwaWNhbGx5IGNhbGxlZCB3aXRoaW4gYW4gZXZlbnQgaGFuZGxlciBmb3Iga2V5cHJlc3MgZXZlbnRzXG4gICAgKiBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlwcmVzcycsIChldmVudCkgPT4ge1xuICAgICogICAgIGlmIChldmVudC5rZXkgPT09ICdFbnRlcicpIHtcbiAgICAqICAgICAgICAgY3JlYXRlTmV3RWxlbWVudEFuZFNwbGl0Q29udGVudCgpO1xuICAgICogICAgIH1cbiAgICAqIH0pO1xuICAgICpcbiAgICAqIEBkZXNjcmlwdGlvblxuICAgICogVGhlIGZ1bmN0aW9uIG9wZXJhdGVzIHVuZGVyIHNldmVyYWwgY29uZGl0aW9ucyBiYXNlZCBvbiB0aGUgY29udGVudCB0eXBlOlxuICAgICogLSBGb3IgbGlzdCBpdGVtcyAoY2hlY2tsaXN0LCBidWxsZXRlZCwgYW5kIG51bWJlcmVkKTpcbiAgICAqICAgMS4gRmluZHMgdGhlIGNsb3Nlc3QgbGlzdCBpdGVtIGFuY2VzdG9yIG9mIHRoZSBhY3RpdmUgZWxlbWVudC5cbiAgICAqICAgMi4gSWYgdGhlIGxpc3QgaXRlbSBjb250YWlucyB0ZXh0LCBpdCBjbG9uZXMgdGhpcyBpdGVtIGFuZCBzcGxpdHMgdGhlIGNvbnRlbnQgYmV0d2VlbiB0aGUgb3JpZ2luYWwgYW5kIHRoZSBjbG9uZS5cbiAgICAqICAgMy4gSWYgdGhlIGxpc3QgaXRlbSBpcyBlbXB0eSBhbmQgaXMgdGhlIG9ubHkgaXRlbSwgaXQgcmVtb3ZlcyB0aGUgZW50aXJlIGJsb2NrIGFmdGVyIGNyZWF0aW5nIGEgbmV3IHBhcmFncmFwaC5cbiAgICAqIC0gRm9yIG90aGVyIGJsb2NrcyAobGlrZSBwYXJhZ3JhcGhzKTpcbiAgICAqICAgMS4gQ2xvbmVzIHRoZSBjdXJyZW50IGJsb2NrIGFuZCByZWFycmFuZ2VzIGNvbnRlbnQgYmV0d2VlbiB0aGUgb3JpZ2luYWwgYW5kIHRoZSBuZXcgY2xvbmUuXG4gICAgKiAgIDIuIFNldHMgdGhlIGZvY3VzIHRvIHRoZSBzdGFydCBvZiB0aGUgbmV3IGVsZW1lbnQgdG8gY29udGludWUgZWRpdGluZy5cbiAgICAqXG4gICAgKiBUaGlzIG1ldGhvZCBlbnN1cmVzIHRoYXQgdGhlIGRvY3VtZW50IHN0cnVjdHVyZSByZW1haW5zIGNvaGVyZW50IHdoaWxlIHByb3ZpZGluZyBhIHNlYW1sZXNzIHVzZXIgZXhwZXJpZW5jZSBpbiB0ZXh0IGVkaXRpbmcgZW52aXJvbm1lbnRzLlxuICAgICovXG4gICAgY3JlYXRlTmV3RWxlbWVudEFuZFNwbGl0Q29udGVudCgpOiBib29sZWFuIHtcblxuICAgICAgICB0aGlzLm1lbWVudG8uc2F2ZVN0YXRlKCk7XG5cbiAgICAgICAgY29uc3QgY29udGVudFR5cGUgPSBET01VdGlscy5nZXRDb250ZW50VHlwZUZyb21BY3RpdmVFbGVtZW50KCk7XG5cbiAgICAgICAgaWYgKGNvbnRlbnRUeXBlID09IENvbnRlbnRUeXBlcy5UYWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgY29udGVudFR5cGUgPT0gQ29udGVudFR5cGVzLkNoZWNrTGlzdCB8fFxuICAgICAgICAgICAgY29udGVudFR5cGUgPT0gQ29udGVudFR5cGVzLkJ1bGxldGVkTGlzdCB8fFxuICAgICAgICAgICAgY29udGVudFR5cGUgPT0gQ29udGVudFR5cGVzLk51bWJlcmVkTGlzdCkge1xuXG4gICAgICAgICAgICBjb25zdCBjdXJyZW50SXRlbSA9IERPTVV0aWxzLmZpbmRDbG9zZXN0QW5jZXN0b3JPZkFjdGl2ZUVsZW1lbnRCeUNsYXNzKFwibGlzdC1pdGVtXCIpO1xuXG4gICAgICAgICAgICBpZiAoY3VycmVudEl0ZW0gJiYgRE9NVXRpbHMuaGFzVGV4dENvbnRlbnQoY3VycmVudEl0ZW0pKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2xvbmUgPSBET01VdGlscy5jbG9uZUFuZEluc2VydEFmdGVyKGN1cnJlbnRJdGVtKTtcbiAgICAgICAgICAgICAgICBpZiAoY2xvbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udGVudEN1cnJlbnQgPSBjdXJyZW50SXRlbS5xdWVyeVNlbGVjdG9yKFwiLmZvY3VzYWJsZVwiKSBhcyBOb2RlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50Q2xvbmUgPSBjbG9uZS5xdWVyeVNlbGVjdG9yKFwiLmZvY3VzYWJsZVwiKSBhcyBOb2RlO1xuICAgICAgICAgICAgICAgICAgICBET01VdGlscy5yZWFycmFuZ2VDb250ZW50QWZ0ZXJTcGxpdChjb250ZW50Q3VycmVudCwgY29udGVudENsb25lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRJdGVtKSB7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRCbG9jayA9IGN1cnJlbnRJdGVtLmNsb3Nlc3QoXCIuYmxvY2tcIik7XG5cbiAgICAgICAgICAgICAgICBpZiAocGFyZW50QmxvY2spIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY291bnRlciA9IHBhcmVudEJsb2NrLnF1ZXJ5U2VsZWN0b3JBbGwoXCIubGlzdC1pdGVtXCIpLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3UGFyYWdyYXBoID0gRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmJsb2NrUGFyYWdyYXBoKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgRE9NVXRpbHMuaW5zZXJ0QWZ0ZXIobmV3UGFyYWdyYXBoLCBwYXJlbnRCbG9jayk7XG5cbiAgICAgICAgICAgICAgICAgICAgY3VycmVudEl0ZW0ucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb3VudGVyID09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudEJsb2NrLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZm9jdXNhYmxlID0gKG5ld1BhcmFncmFwaCBhcyBIVE1MRWxlbWVudCkucXVlcnlTZWxlY3RvcihcInBcIikgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIERPTVV0aWxzLnBsYWNlQ3Vyc29yQXRTdGFydE9mRWRpdGFibGVFbGVtZW50KGZvY3VzYWJsZSBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50QmxvY2sgPSBET01VdGlscy5maW5kQ2xvc2VzdEFuY2VzdG9yT2ZBY3RpdmVFbGVtZW50QnlDbGFzcyhcImJsb2NrXCIpO1xuXG4gICAgICAgICAgICBpZiAoY3VycmVudEJsb2NrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2xvbmVkQmxvY2sgPSBET01VdGlscy5jbG9uZUFuZEluc2VydEFmdGVyKGN1cnJlbnRCbG9jayk7XG5cbiAgICAgICAgICAgICAgICBpZiAoY2xvbmVkQmxvY2spIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udGVudEN1cnJlbnQgPSBjdXJyZW50QmxvY2sucXVlcnlTZWxlY3RvcihcIi5mb2N1c2FibGVcIikgYXMgTm9kZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udGVudENsb25lID0gY2xvbmVkQmxvY2sucXVlcnlTZWxlY3RvcihcIi5mb2N1c2FibGVcIikgYXMgTm9kZTtcbiAgICAgICAgICAgICAgICAgICAgRE9NVXRpbHMucmVhcnJhbmdlQ29udGVudEFmdGVyU3BsaXQoY29udGVudEN1cnJlbnQsIGNvbnRlbnRDbG9uZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFET01VdGlscy5oYXNUZXh0Q29udGVudChjbG9uZWRCbG9jayEpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRyYW5zZm9ybUJsb2NrKENvbnRlbnRUeXBlcy5QYXJhZ3JhcGgsIGNsb25lZEJsb2NrKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGZvY3VzYWJsZSA9IChjbG9uZWRCbG9jayBhcyBIVE1MRWxlbWVudCkucXVlcnlTZWxlY3RvcihcIi5mb2N1c2FibGVcIikgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICAgICAgICAgICAgICBET01VdGlscy5wbGFjZUN1cnNvckF0U3RhcnRPZkVkaXRhYmxlRWxlbWVudChmb2N1c2FibGUgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAgICAvLyBzcGxpdENvbnRlbnRBdEN1cnNvcigpOiB2b2lkIHtcbiAgICAvLyAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICAgIC8vICAgICBpZiAoIXNlbGVjdGlvbiB8fCBzZWxlY3Rpb24ucmFuZ2VDb3VudCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgLy8gICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XG4gICAgLy8gICAgIGNvbnN0IGNvbnRhaW5lciA9IHJhbmdlLnN0YXJ0Q29udGFpbmVyO1xuXG4gICAgLy8gICAgIC8vIENyaWFuZG8gcmFuZ2UgcGFyYSBvIGNvbnRlw7pkbyBhbnRlcyBkbyBjdXJzb3JcbiAgICAvLyAgICAgY29uc3QgcmFuZ2VCZWZvcmUgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xuICAgIC8vICAgICByYW5nZUJlZm9yZS5zZWxlY3ROb2RlQ29udGVudHMoY29udGFpbmVyKTtcbiAgICAvLyAgICAgcmFuZ2VCZWZvcmUuc2V0RW5kKHJhbmdlLnN0YXJ0Q29udGFpbmVyLCByYW5nZS5zdGFydE9mZnNldCk7XG5cbiAgICAvLyAgICAgLy8gQ3JpYW5kbyByYW5nZSBwYXJhIG8gY29udGXDumRvIGRlcG9pcyBkbyBjdXJzb3JcbiAgICAvLyAgICAgY29uc3QgcmFuZ2VBZnRlciA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG4gICAgLy8gICAgIHJhbmdlQWZ0ZXIuc2VsZWN0Tm9kZUNvbnRlbnRzKGNvbnRhaW5lcik7XG4gICAgLy8gICAgIHJhbmdlQWZ0ZXIuc2V0U3RhcnQocmFuZ2UuZW5kQ29udGFpbmVyLCByYW5nZS5lbmRPZmZzZXQpO1xuXG4gICAgLy8gICAgIC8vIEV4ZW1wbG86IElzb2xhbmRvIG8gdGV4dG8gZGUgY2FkYSBwYXJ0ZVxuICAgIC8vICAgICBjb25zdCB0ZXh0QmVmb3JlID0gcmFuZ2VCZWZvcmUudG9TdHJpbmcoKTtcbiAgICAvLyAgICAgY29uc3QgdGV4dEFmdGVyID0gcmFuZ2VBZnRlci50b1N0cmluZygpO1xuXG4gICAgLy8gICAgIGNvbnNvbGUubG9nKCdUZXh0byBhbnRlcyBkbyBjdXJzb3I6JywgdGV4dEJlZm9yZSk7XG4gICAgLy8gICAgIGNvbnNvbGUubG9nKCdUZXh0byBkZXBvaXMgZG8gY3Vyc29yOicsIHRleHRBZnRlcik7XG5cbiAgICAvLyAgICAgLy8gQXF1aSB2b2PDqiBwb2RlIG1hbmlwdWxhciBvIERPTSBjb21vIG5lY2Vzc8OhcmlvLCBwb3IgZXhlbXBsbzpcbiAgICAvLyAgICAgLy8gaW5zZXJpciBub3ZvcyBlbGVtZW50b3MsIG1vZGlmaWNhciBvIHRleHRvLCBldGMuXG4gICAgLy8gfVxuXG5cbiAgICBjcmVhdGVEZWZhdWx0QmxvY2soZXZlbnRQYXJhZ3JhcGg6IEVsZW1lbnQgfCBudWxsKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG5ld0Jsb2NrID0gdGhpcy5lbGVtZW50RmFjdG9yeVNlcnZpY2UuY3JlYXRlKEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkJMT0NLX1BBUkFHUkFQSCwgXCJcIik7XG5cbiAgICAgICAgaWYgKGV2ZW50UGFyYWdyYXBoICYmIGV2ZW50UGFyYWdyYXBoLmNsb3Nlc3QoJy5ibG9jaycpKSB7XG4gICAgICAgICAgICBjb25zdCBzaWJsaW5nID0gZXZlbnRQYXJhZ3JhcGguY2xvc2VzdCgnLmJsb2NrJykhO1xuICAgICAgICAgICAgc2libGluZy5pbnNlcnRBZGphY2VudEVsZW1lbnQoJ2FmdGVyZW5kJywgbmV3QmxvY2spO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiNqb2hhbm5lc0VkaXRvciAuY29udGVudFwiKSEuYXBwZW5kQ2hpbGQobmV3QmxvY2spO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZm9jdXNhYmxlID0gbmV3QmxvY2sucXVlcnlTZWxlY3RvcignLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCcpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBmb2N1c2FibGUuZm9jdXMoKTtcblxuICAgICAgICAvLyBmb2N1c09uVGhlRW5kT2ZUaGVUZXh0KGZvY3VzYWJsZSk7XG4gICAgfVxuXG5cbiAgICBwcml2YXRlIGRlbGV0ZUFuZEZvY3VzT25QcmV2aW91cygpOiB2b2lkIHtcblxuICAgICAgICBjb25zdCBjdXJyZW50QWN0aXZlRWxlbWVudCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQhO1xuXG4gICAgICAgIHRoaXMuZm9jdXNPblByZXZpb3VzKGN1cnJlbnRBY3RpdmVFbGVtZW50KTtcbiAgICAgICAgdGhpcy5kZWxldGVUaGVDdXJyZW50RWxlbWVudEFuZFRoZURyYWdnYWJsZUJsb2NrSWZFbXB0eShjdXJyZW50QWN0aXZlRWxlbWVudCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkZWxldGVBbmRGb2N1c09uTmV4dCgpIHtcblxuICAgICAgICBsZXQgY3VycmVudEFjdGl2ZUVsZW1lbnQgPSB0aGlzLmdldEN1cnJlbnRTZWxlY3RlZEJsb2NrKCkgfHwgRE9NVXRpbHMuZ2V0Q3VycmVudEFjdGl2ZUJsb2NrKCk7XG5cbiAgICAgICAgaWYgKCFjdXJyZW50QWN0aXZlRWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5mb2N1c09uTmV4dChjdXJyZW50QWN0aXZlRWxlbWVudCk7XG4gICAgICAgIHRoaXMuZGVsZXRlVGhlQ3VycmVudEVsZW1lbnRBbmRUaGVEcmFnZ2FibGVCbG9ja0lmRW1wdHkoY3VycmVudEFjdGl2ZUVsZW1lbnQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZm9jdXNPblByZXZpb3VzKGFjdHVhbEVsZW1lbnQ6IEVsZW1lbnQsIHBvc2l0aW9uOiBudW1iZXIgfCBudWxsID0gbnVsbCk6IHZvaWQge1xuXG4gICAgICAgIGxldCB0YWcgPSBhY3R1YWxFbGVtZW50LnRhZ05hbWUudG9VcHBlckNhc2UoKTtcbiAgICAgICAgbGV0IGZvY3VzZWRFbGVtZW50ID0gbnVsbDtcblxuICAgICAgICBpZiAodGFnID09PSAnTEknKSB7XG4gICAgICAgICAgICBsZXQgcHJldmlvdXNFbGVtZW50ID0gYWN0dWFsRWxlbWVudC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nO1xuXG4gICAgICAgICAgICBpZiAoIXByZXZpb3VzRWxlbWVudCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHByZXZpb3VzRWxlbWVudCAmJiBwcmV2aW91c0VsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdmb2N1c2FibGUnKSkge1xuICAgICAgICAgICAgICAgIGZvY3VzZWRFbGVtZW50ID0gcHJldmlvdXNFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcGx5Q3Vyc29yWEVuZFBvc2l0aW9uKGZvY3VzZWRFbGVtZW50LCBwb3NpdGlvbik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgRE9NVXRpbHMucGxhY2VDdXJzb3JBdEVuZE9mRWRpdGFibGVFbGVtZW50KGZvY3VzZWRFbGVtZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gcmV0dXJuIGZvY3VzZWRFbGVtZW50O1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgoYWN0dWFsRWxlbWVudC5wYXJlbnROb2RlIGFzIEhUTUxFbGVtZW50KS50YWdOYW1lLnRvVXBwZXJDYXNlKCkgPT09ICdMSScgLyogZm9jdXNhYmxlIFNQQU4gaW5zaWRlIExJKi8pIHtcblxuICAgICAgICAgICAgbGV0IHByZXZpb3VzRWxlbWVudCA9IGFjdHVhbEVsZW1lbnQuY2xvc2VzdCgnbGknKT8ucHJldmlvdXNFbGVtZW50U2libGluZz8ucXVlcnlTZWxlY3RvcignLmZvY3VzYWJsZScpO1xuXG4gICAgICAgICAgICBpZiAocHJldmlvdXNFbGVtZW50ICYmIHByZXZpb3VzRWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2ZvY3VzYWJsZScpKSB7XG4gICAgICAgICAgICAgICAgZm9jdXNlZEVsZW1lbnQgPSBwcmV2aW91c0VsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwbHlDdXJzb3JYRW5kUG9zaXRpb24oZm9jdXNlZEVsZW1lbnQsIHBvc2l0aW9uKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBET01VdGlscy5wbGFjZUN1cnNvckF0RW5kT2ZFZGl0YWJsZUVsZW1lbnQoZm9jdXNlZEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyByZXR1cm4gZm9jdXNlZEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBhcmVudCA9IGFjdHVhbEVsZW1lbnQuY2xvc2VzdCgnLmJsb2NrJyk7XG5cbiAgICAgICAgaWYgKCFwYXJlbnQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgc2libGluZyA9IHBhcmVudC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nO1xuXG4gICAgICAgIHdoaWxlIChzaWJsaW5nKSB7XG4gICAgICAgICAgICBsZXQgZm9jdXNhYmxlQ2FuZGlkYXRlcyA9IHNpYmxpbmcucXVlcnlTZWxlY3RvckFsbCgnLmZvY3VzYWJsZScpO1xuICAgICAgICAgICAgaWYgKGZvY3VzYWJsZUNhbmRpZGF0ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGZvY3VzZWRFbGVtZW50ID0gZm9jdXNhYmxlQ2FuZGlkYXRlc1tmb2N1c2FibGVDYW5kaWRhdGVzLmxlbmd0aCAtIDFdIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcGx5Q3Vyc29yWEVuZFBvc2l0aW9uKGZvY3VzZWRFbGVtZW50LCBwb3NpdGlvbik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgRE9NVXRpbHMucGxhY2VDdXJzb3JBdEVuZE9mRWRpdGFibGVFbGVtZW50KGZvY3VzZWRFbGVtZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gcmV0dXJuIGZvY3VzZWRFbGVtZW50O1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc2libGluZyA9IHNpYmxpbmcucHJldmlvdXNFbGVtZW50U2libGluZztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHJldHVybiBmb2N1c2VkRWxlbWVudDtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHByaXZhdGUgZm9jdXNPbk5leHQoYWN0dWFsRWxlbWVudDogRWxlbWVudCwgcG9zaXRpb246IG51bWJlciB8IG51bGwgPSBudWxsKSB7XG4gICAgICAgIGxldCB0YWcgPSBhY3R1YWxFbGVtZW50LnRhZ05hbWUudG9VcHBlckNhc2UoKTtcbiAgICAgICAgbGV0IGZvY3VzZWRFbGVtZW50ID0gbnVsbDtcblxuICAgICAgICBpZiAodGFnID09PSAnTEknKSB7XG4gICAgICAgICAgICBsZXQgbmV4dEVsZW1lbnQgPSBhY3R1YWxFbGVtZW50Lm5leHRFbGVtZW50U2libGluZztcblxuICAgICAgICAgICAgaWYgKG5leHRFbGVtZW50ICYmIG5leHRFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnZm9jdXNhYmxlJykpIHtcbiAgICAgICAgICAgICAgICBmb2N1c2VkRWxlbWVudCA9IG5leHRFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xuXG4gICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwbHlDdXJzb3JYU3RhcnRQb3NpdGlvbihmb2N1c2VkRWxlbWVudCwgcG9zaXRpb24pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIERPTVV0aWxzLnBsYWNlQ3Vyc29yQXRTdGFydE9mRWRpdGFibGVFbGVtZW50KGZvY3VzZWRFbGVtZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZvY3VzZWRFbGVtZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKChhY3R1YWxFbGVtZW50LnBhcmVudE5vZGUgYXMgSFRNTEVsZW1lbnQpLnRhZ05hbWUudG9VcHBlckNhc2UoKSA9PT0gJ0xJJyAvKiBmb2N1c2FibGUgU1BBTiBpbnNpZGUgTEkqLykge1xuICAgICAgICAgICAgbGV0IG5leHRFbGVtZW50ID0gYWN0dWFsRWxlbWVudC5jbG9zZXN0KCdsaScpPy5uZXh0RWxlbWVudFNpYmxpbmc/LnF1ZXJ5U2VsZWN0b3IoJy5mb2N1c2FibGUnKTtcblxuICAgICAgICAgICAgaWYgKG5leHRFbGVtZW50ICYmIG5leHRFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnZm9jdXNhYmxlJykpIHtcbiAgICAgICAgICAgICAgICBmb2N1c2VkRWxlbWVudCA9IG5leHRFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcGx5Q3Vyc29yWFN0YXJ0UG9zaXRpb24oZm9jdXNlZEVsZW1lbnQsIHBvc2l0aW9uKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBET01VdGlscy5wbGFjZUN1cnNvckF0U3RhcnRPZkVkaXRhYmxlRWxlbWVudChmb2N1c2VkRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBmb2N1c2VkRWxlbWVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBwYXJlbnQgPSBhY3R1YWxFbGVtZW50LmNsb3Nlc3QoJy5ibG9jaycpO1xuXG4gICAgICAgIGlmICghcGFyZW50KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgc2libGluZyA9IHBhcmVudC5uZXh0RWxlbWVudFNpYmxpbmc7XG5cbiAgICAgICAgd2hpbGUgKHNpYmxpbmcpIHtcbiAgICAgICAgICAgIGxldCBmb2N1c2FibGVDYW5kaWRhdGVzID0gc2libGluZy5xdWVyeVNlbGVjdG9yQWxsKCcuZm9jdXNhYmxlJyk7XG4gICAgICAgICAgICBpZiAoZm9jdXNhYmxlQ2FuZGlkYXRlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgZm9jdXNlZEVsZW1lbnQgPSBmb2N1c2FibGVDYW5kaWRhdGVzWzBdIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcGx5Q3Vyc29yWFN0YXJ0UG9zaXRpb24oZm9jdXNlZEVsZW1lbnQsIHBvc2l0aW9uKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBET01VdGlscy5wbGFjZUN1cnNvckF0U3RhcnRPZkVkaXRhYmxlRWxlbWVudChmb2N1c2VkRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBmb2N1c2VkRWxlbWVudDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc2libGluZyA9IHNpYmxpbmcubmV4dEVsZW1lbnRTaWJsaW5nO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZvY3VzZWRFbGVtZW50O1xuICAgIH1cblxuXG5cbiAgICBkZWxldGVUaGVDdXJyZW50RWxlbWVudEFuZFRoZURyYWdnYWJsZUJsb2NrSWZFbXB0eShjdXJyZW50RWxlbWVudDogRWxlbWVudCkge1xuXG4gICAgICAgIGNvbnN0IHBhcmVudEJsb2NrID0gY3VycmVudEVsZW1lbnQuY2xvc2VzdCgnLmJsb2NrJyk7XG4gICAgICAgIGNvbnN0IGFjdHVhbCA9IGN1cnJlbnRFbGVtZW50LmNsb3Nlc3QoJy5kZWxldGFibGUnKTtcblxuICAgICAgICBhY3R1YWw/LnJlbW92ZSgpO1xuXG4gICAgICAgIGlmIChwYXJlbnRCbG9jayAmJiBwYXJlbnRCbG9jay5xdWVyeVNlbGVjdG9yQWxsKCcuZWRpdGFibGUnKS5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgcGFyZW50QmxvY2sucmVtb3ZlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cblxuXG5cbiAgICBhcHBseUN1cnNvclhFbmRQb3NpdGlvbihlbGVtZW50OiBIVE1MRWxlbWVudCwgeFBvc2l0aW9uOiBudW1iZXIpIHtcblxuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCkhO1xuICAgICAgICBjb25zdCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG5cbiAgICAgICAgbGV0IGN1cnJlbnROb2RlID0gZWxlbWVudC5sYXN0Q2hpbGQ7XG4gICAgICAgIGxldCByZXN1bHQgPSBudWxsO1xuXG4gICAgICAgIHdoaWxlIChjdXJyZW50Tm9kZSkge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnROb2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMuYWRqdXN0Q3Vyc29yT2Zmc2V0KGN1cnJlbnROb2RlLCB4UG9zaXRpb24pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50Tm9kZS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSAnQlInKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZS5wcmV2aW91c1NpYmxpbmc7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLnByZXZpb3VzU2libGluZztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXN1bHQgJiYgcmVzdWx0LmNsb3Nlc3ROb2RlKSB7XG4gICAgICAgICAgICByYW5nZS5zZXRTdGFydChyZXN1bHQuY2xvc2VzdE5vZGUsIHJlc3VsdC5jbG9zZXN0T2Zmc2V0KTtcbiAgICAgICAgICAgIHJhbmdlLmNvbGxhcHNlKHRydWUpO1xuICAgICAgICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgICAgICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKTtcbiAgICAgICAgICAgIGVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhlbGVtZW50KTtcbiAgICAgICAgICAgIHJhbmdlLmNvbGxhcHNlKGZhbHNlKTtcbiAgICAgICAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICAgICAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSk7XG4gICAgICAgICAgICBlbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhcHBseUN1cnNvclhTdGFydFBvc2l0aW9uKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCB4UG9zaXRpb246IG51bWJlcikge1xuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCkhO1xuICAgICAgICBjb25zdCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG5cbiAgICAgICAgbGV0IGN1cnJlbnROb2RlID0gZWxlbWVudC5maXJzdENoaWxkO1xuICAgICAgICBsZXQgcmVzdWx0ID0gbnVsbDtcblxuICAgICAgICB3aGlsZSAoY3VycmVudE5vZGUpIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50Tm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB0aGlzLmFkanVzdEN1cnNvck9mZnNldChjdXJyZW50Tm9kZSwgeFBvc2l0aW9uKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGN1cnJlbnROb2RlID0gY3VycmVudE5vZGUubmV4dFNpYmxpbmc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVzdWx0ICYmIHJlc3VsdC5jbG9zZXN0Tm9kZSkge1xuICAgICAgICAgICAgcmFuZ2Uuc2V0U3RhcnQocmVzdWx0LmNsb3Nlc3ROb2RlLCByZXN1bHQuY2xvc2VzdE9mZnNldCk7XG4gICAgICAgICAgICByYW5nZS5jb2xsYXBzZSh0cnVlKTtcbiAgICAgICAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICAgICAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSk7XG4gICAgICAgICAgICBlbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByYW5nZS5zZWxlY3ROb2RlQ29udGVudHMoZWxlbWVudCk7XG4gICAgICAgICAgICByYW5nZS5jb2xsYXBzZSh0cnVlKTtcbiAgICAgICAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICAgICAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSk7XG4gICAgICAgICAgICBlbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhZGp1c3RDdXJzb3JPZmZzZXQobm9kZTogTm9kZSwgeFBvc2l0aW9uOiBudW1iZXIpIHtcbiAgICAgICAgbGV0IHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcbiAgICAgICAgbGV0IGNsb3Nlc3ROb2RlID0gbm9kZTtcbiAgICAgICAgbGV0IGNsb3Nlc3RPZmZzZXQgPSAwO1xuICAgICAgICBsZXQgY2xvc2VzdERpZmYgPSBJbmZpbml0eTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUudGV4dENvbnRlbnQhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICByYW5nZS5zZXRTdGFydChub2RlLCBpKTtcbiAgICAgICAgICAgIHJhbmdlLnNldEVuZChub2RlLCBpICsgMSk7XG4gICAgICAgICAgICBjb25zdCByZWN0ID0gcmFuZ2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICBjb25zdCBsZWZ0RGlmZiA9IE1hdGguYWJzKHJlY3QubGVmdCAtIHhQb3NpdGlvbik7XG4gICAgICAgICAgICBjb25zdCByaWdodERpZmYgPSBNYXRoLmFicyhyZWN0LnJpZ2h0IC0geFBvc2l0aW9uKTtcblxuICAgICAgICAgICAgaWYgKGxlZnREaWZmIDwgY2xvc2VzdERpZmYgfHwgcmlnaHREaWZmIDwgY2xvc2VzdERpZmYpIHtcbiAgICAgICAgICAgICAgICBjbG9zZXN0RGlmZiA9IE1hdGgubWluKGxlZnREaWZmLCByaWdodERpZmYpO1xuICAgICAgICAgICAgICAgIGNsb3Nlc3RPZmZzZXQgPSBpICsgKHJpZ2h0RGlmZiA8IGxlZnREaWZmID8gMSA6IDApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHhQb3NpdGlvbiA+IHJhbmdlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnJpZ2h0KSB7XG4gICAgICAgICAgICBjbG9zZXN0T2Zmc2V0ID0gbm9kZS50ZXh0Q29udGVudCEubGVuZ3RoO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHsgY2xvc2VzdE5vZGUsIGNsb3Nlc3RPZmZzZXQgfTtcbiAgICB9XG5cblxuICAgIC8vIGZvY3VzT25UaGVFbmRPZlRoZVRleHQoY29udGVudEJsb2NrOiBIVE1MRWxlbWVudCkge1xuXG4gICAgLy8gICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG5cbiAgICAvLyAgICAgICAgIGNvbnN0IHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcbiAgICAvLyAgICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKSE7XG5cbiAgICAvLyAgICAgICAgIHJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhjb250ZW50QmxvY2spO1xuXG4gICAgLy8gICAgICAgICBsZXQgbGFzdENoaWxkID0gY29udGVudEJsb2NrO1xuXG4gICAgLy8gICAgICAgICB3aGlsZSAobGFzdENoaWxkLmxhc3RDaGlsZCAmJiBsYXN0Q2hpbGQubGFzdENoaWxkLm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSkge1xuICAgIC8vICAgICAgICAgICAgIGxhc3RDaGlsZCA9IGxhc3RDaGlsZC5sYXN0Q2hpbGQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgLy8gICAgICAgICB9XG4gICAgLy8gICAgICAgICBpZiAobGFzdENoaWxkLmxhc3RDaGlsZCkge1xuICAgIC8vICAgICAgICAgICAgIGxhc3RDaGlsZCA9IGxhc3RDaGlsZC5sYXN0Q2hpbGQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgLy8gICAgICAgICB9XG5cbiAgICAvLyAgICAgICAgIHJhbmdlLnNldEVuZChsYXN0Q2hpbGQsIGxhc3RDaGlsZC50ZXh0Q29udGVudCEubGVuZ3RoKTtcbiAgICAvLyAgICAgICAgIHJhbmdlLmNvbGxhcHNlKGZhbHNlKTtcblxuICAgIC8vICAgICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgIC8vICAgICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKTtcblxuICAgIC8vICAgICAgICAgY29udGVudEJsb2NrLmZvY3VzKCk7XG4gICAgLy8gICAgIH0pO1xuICAgIC8vIH1cblxuICAgIC8vIGZvY3VzT25UaGVTdGFydE9mVGhlVGV4dChjb250ZW50QmxvY2s6IEhUTUxFbGVtZW50KSB7XG5cbiAgICAvLyAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgLy8gICAgICAgICBjb25zdCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG4gICAgLy8gICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCkhO1xuXG4gICAgLy8gICAgICAgICByYW5nZS5zZWxlY3ROb2RlQ29udGVudHMoY29udGVudEJsb2NrKTtcbiAgICAvLyAgICAgICAgIHJhbmdlLmNvbGxhcHNlKHRydWUpO1xuICAgIC8vICAgICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgIC8vICAgICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKTtcblxuICAgIC8vICAgICAgICAgY29udGVudEJsb2NrLmZvY3VzKCk7XG4gICAgLy8gICAgIH0sIDEwKTtcbiAgICAvLyB9XG5cblxuXG5cbiAgICBnZXRDdXJyZW50U2VsZWN0ZWRGb2N1c2FibGUoKTogRWxlbWVudCB8IG51bGwge1xuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gICAgICAgIGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAwKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xuICAgICAgICBsZXQgY29udGFpbmVyOiBOb2RlIHwgbnVsbCA9IHJhbmdlLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyO1xuXG4gICAgICAgIGlmIChjb250YWluZXIubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgICAgICAgICBjb250YWluZXIgPSBjb250YWluZXIucGFyZW50Tm9kZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZvY3VzYWJsZVBhcmVudCA9IChjb250YWluZXIgYXMgSFRNTEVsZW1lbnQpLmNsb3Nlc3QoXCIuZm9jdXNhYmxlXCIpO1xuXG4gICAgICAgIHJldHVybiBmb2N1c2FibGVQYXJlbnQ7XG4gICAgfVxuXG4gICAgZ2V0Q3VycmVudFNlbGVjdGVkQmxvY2soKTogRWxlbWVudCB8IG51bGwge1xuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gICAgICAgIGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAwKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xuICAgICAgICBsZXQgY29udGFpbmVyOiBOb2RlIHwgbnVsbCA9IHJhbmdlLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyO1xuXG4gICAgICAgIGlmIChjb250YWluZXIubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgICAgICAgICBjb250YWluZXIgPSBjb250YWluZXIucGFyZW50Tm9kZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZvY3VzYWJsZVBhcmVudCA9IChjb250YWluZXIgYXMgSFRNTEVsZW1lbnQpLmNsb3Nlc3QoXCIuYmxvY2tcIik7XG5cbiAgICAgICAgcmV0dXJuIGZvY3VzYWJsZVBhcmVudDtcbiAgICB9XG5cblxuICAgIGR1cGxpY2F0ZVNlbGVjdGVkQmxvY2soKTogTm9kZSB8IG51bGwge1xuXG4gICAgICAgIGxldCBlbGVtZW50ID0gdGhpcy5nZXRDdXJyZW50U2VsZWN0ZWRCbG9jaygpIHx8IERPTVV0aWxzLmdldEN1cnJlbnRBY3RpdmVCbG9jaygpO1xuXG4gICAgICAgIGlmICghZWxlbWVudCB8fCAhZWxlbWVudC5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdPIGVsZW1lbnRvIGZvcm5lY2lkbyDDqSBpbnbDoWxpZG8gb3UgbsOjbyBlc3TDoSBubyBET00uJyk7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNsb25lID0gZWxlbWVudC5jbG9uZU5vZGUodHJ1ZSk7XG5cbiAgICAgICAgY29uc3QgbmV4dEVsZW1lbnQgPSBlbGVtZW50Lm5leHRTaWJsaW5nO1xuXG4gICAgICAgIGVsZW1lbnQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoY2xvbmUsIG5leHRFbGVtZW50KTtcblxuICAgICAgICByZXR1cm4gY2xvbmU7XG4gICAgfVxuXG59IiwiaW1wb3J0IHsgQmFzZVVJQ29tcG9uZW50IH0gZnJvbSBcIi4uL2NvbW1vbi9CYXNlVUlDb21wb25lbnRcIjtcclxuaW1wb3J0IHsgU1ZHSWNvbiB9IGZyb20gXCIuLi9jb21tb24vU1ZHSWNvblwiO1xyXG5pbXBvcnQgeyBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL3NlcnZpY2VzL2Jsb2NrLW9wZXJhdGlvbnMvQmxvY2tPcGVyYXRpb25zU2VydmljZVwiO1xyXG5pbXBvcnQgeyBJQmxvY2tPcGVyYXRpb25zU2VydmljZSB9IGZyb20gXCIuLi8uLi9zZXJ2aWNlcy9ibG9jay1vcGVyYXRpb25zL0lCbG9ja09wZXJhdGlvbnNTZXJ2aWNlXCI7XHJcbmltcG9ydCB7IERlcGVuZGVuY3lDb250YWluZXIgfSBmcm9tIFwiQC9jb3JlL0RlcGVuZGVuY3lDb250YWluZXJcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBBZGRCbG9ja0J1dHRvbiBleHRlbmRzIEJhc2VVSUNvbXBvbmVudCB7XHJcblxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBibG9ja09wZXJhdGlvbnNTZXJ2aWNlOiBJQmxvY2tPcGVyYXRpb25zU2VydmljZTtcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgaWNvbjogU1ZHSWNvbjtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihibG9ja09wZXJhdGlvbnNTZXJ2aWNlOiBJQmxvY2tPcGVyYXRpb25zU2VydmljZSwgaWNvbjogU1ZHSWNvbikge1xyXG5cclxuICAgICAgICBzdXBlcih7XHJcbiAgICAgICAgICAgIGljb246IGljb25cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5ibG9ja09wZXJhdGlvbnNTZXJ2aWNlID0gYmxvY2tPcGVyYXRpb25zU2VydmljZTtcclxuICAgICAgICB0aGlzLmljb24gPSBpY29uO1xyXG4gICAgICAgIHRoaXMuYXR0YWNoRXZlbnRzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdCgpOiBIVE1MRWxlbWVudCB7XHJcblxyXG4gICAgICAgIGNvbnN0IGh0bWxFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiKTtcclxuICAgICAgICBodG1sRWxlbWVudC50aXRsZSA9IFwiQWRkIGEgbmV3IGJsb2NrXCI7XHJcblxyXG4gICAgICAgIGh0bWxFbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJhZGQtYmxvY2tcIiwgXCJibG9jay1vcGVyYXRpb25cIik7XHJcblxyXG4gICAgICAgIGh0bWxFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMucHJvcHMuaWNvbi5odG1sRWxlbWVudCk7XHJcblxyXG4gICAgICAgIHJldHVybiBodG1sRWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICBhdHRhY2hFdmVudHMoKTogdm9pZCB7XHJcblxyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5ibG9ja09wZXJhdGlvbnNTZXJ2aWNlLmV4ZWNDb21tYW5kKEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuQkxPQ0tfT1BFUkFUSU9OUy5DUkVBVEVfREVGQVVMVF9CTE9DSywgZmFsc2UpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBjcmVhdGUoaWNvbjogU1ZHSWNvbik6IEFkZEJsb2NrQnV0dG9uIHtcclxuXHJcbiAgICAgICAgY29uc3QgYmxvY2tPcGVyYXRpb25zU2VydmljZSA9IERlcGVuZGVuY3lDb250YWluZXIuSW5zdGFuY2UucmVzb2x2ZTxJQmxvY2tPcGVyYXRpb25zU2VydmljZT4oXCJJQmxvY2tPcGVyYXRpb25zU2VydmljZVwiKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIG5ldyBBZGRCbG9ja0J1dHRvbihibG9ja09wZXJhdGlvbnNTZXJ2aWNlLCBpY29uKTtcclxuICAgIH1cclxufSIsImltcG9ydCB7IEJhc2VVSUNvbXBvbmVudCB9IGZyb20gXCIuLi9jb21tb24vQmFzZVVJQ29tcG9uZW50XCI7XHJcbmltcG9ydCB7IEFkZEJsb2NrQnV0dG9uIH0gZnJvbSBcIi4vQWRkQmxvY2tCdXR0b25cIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBBZGRCbG9ja1dyYXBwZXIgZXh0ZW5kcyBCYXNlVUlDb21wb25lbnQge1xyXG5cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgYnV0dG9uOiBBZGRCbG9ja0J1dHRvbjtcclxuXHJcbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKGJ1dHRvbjogQWRkQmxvY2tCdXR0b24pIHtcclxuXHJcbiAgICAgICAgc3VwZXIoe1xyXG4gICAgICAgICAgICBidXR0b246IGJ1dHRvblxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmJ1dHRvbiA9IGJ1dHRvbjtcclxuICAgIH1cclxuXHJcbiAgICBpbml0KCk6IEhUTUxFbGVtZW50IHtcclxuXHJcbiAgICAgICAgY29uc3QgaHRtbEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG5cclxuICAgICAgICBodG1sRWxlbWVudC5jbGFzc0xpc3QuYWRkKFwiYWRkLWJsb2NrLXdyYXBwZXJcIik7XHJcblxyXG4gICAgICAgIGh0bWxFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMucHJvcHMuYnV0dG9uLmh0bWxFbGVtZW50KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGh0bWxFbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBjcmVhdGUoYnV0dG9uOiBBZGRCbG9ja0J1dHRvbik6IEFkZEJsb2NrV3JhcHBlciB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBBZGRCbG9ja1dyYXBwZXIoYnV0dG9uKTtcclxuICAgIH1cclxufSIsImV4cG9ydCBjbGFzcyBTaXplcyB7XHJcbiAgICBcclxuICAgIHN0YXRpYyBtZWRpdW06IHN0cmluZyA9IFwiMXJlbVwiO1xyXG4gICAgc3RhdGljIGxhcmdlOiBzdHJpbmcgPSBcIjEuMjVyZW1cIjtcclxufSIsImltcG9ydCB7IEJhc2VVSUNvbXBvbmVudCB9IGZyb20gXCIuL0Jhc2VVSUNvbXBvbmVudFwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFNWR0ljb24gZXh0ZW5kcyBCYXNlVUlDb21wb25lbnQge1xyXG5cclxuICAgIHVzZUVsZW1lbnQ6IFNWR1VzZUVsZW1lbnQ7XHJcblxyXG4gICAgY29uc3RydWN0b3IoaWNvbklkOiBzdHJpbmcsIHNpemU6IHN0cmluZykge1xyXG5cclxuICAgICAgICBzdXBlcih7XHJcbiAgICAgICAgICAgIGljb25JZDogaWNvbklkLFxyXG4gICAgICAgICAgICBzaXplOiBzaXplXHJcbiAgICAgICAgfSlcclxuXHJcbiAgICAgICAgdGhpcy51c2VFbGVtZW50ID0gdGhpcy5odG1sRWxlbWVudC5xdWVyeVNlbGVjdG9yKCd1c2UnKSBhcyBTVkdVc2VFbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIGluaXQoKTogSFRNTEVsZW1lbnQge1xyXG5cclxuICAgICAgICBjb25zdCBodG1sRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsIFwic3ZnXCIpO1xyXG5cclxuICAgICAgICAvLyBodG1sRWxlbWVudC5zdHlsZS5jb2xvciA9IFwicmdiYSg1NSwgNTMsIDQ3LCAwLjg1KVwiO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LnN0eWxlLmNvbG9yID0gXCJyZWQgIWltcG9ydGFudFwiO1xyXG5cclxuICAgICAgICBsZXQgdXNlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiwgXCJ1c2VcIik7XHJcbiAgICAgICAgdXNlLnNldEF0dHJpYnV0ZU5TKFwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiLCBcImhyZWZcIiwgYCMke3RoaXMucHJvcHMuaWNvbklkfWApO1xyXG5cclxuICAgICAgICB1c2Uuc3R5bGUuY29sb3IgPSBcInJlZCAhaW1wb3J0YW50XCI7XHJcblxyXG4gICAgICAgIGh0bWxFbGVtZW50LmFwcGVuZENoaWxkKHVzZSk7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuc2V0QXR0cmlidXRlKCd3aWR0aCcsIHRoaXMucHJvcHMuc2l6ZSk7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuc2V0QXR0cmlidXRlKCdoZWlnaHQnLCB0aGlzLnByb3BzLnNpemUpO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LnNldEF0dHJpYnV0ZSgnZmlsbCcsICdjdXJyZW50Q29sb3InKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGh0bWxFbGVtZW50IGFzIHVua25vd24gYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgY2xvbmUoKTogU1ZHSWNvbiB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBTVkdJY29uKHRoaXMucHJvcHMuaWNvbklkLCB0aGlzLnByb3BzLnNpemVzKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRVc2VUbyh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy51c2VFbGVtZW50LnNldEF0dHJpYnV0ZU5TKFwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiLCBcImhyZWZcIiwgYCMke3ZhbHVlfWApO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBjcmVhdGUoaWNvbklkOiBzdHJpbmcsIHNpemU6IHN0cmluZyk6IFNWR0ljb24ge1xyXG4gICAgICAgIHJldHVybiBuZXcgU1ZHSWNvbihpY29uSWQsIHNpemUpO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgQWRkQmxvY2tCdXR0b24gfSBmcm9tIFwiQC9jb21wb25lbnRzL2FkZC1ibG9jay9BZGRCbG9ja0J1dHRvblwiO1xyXG5pbXBvcnQgeyBBZGRCbG9ja1dyYXBwZXIgfSBmcm9tIFwiQC9jb21wb25lbnRzL2FkZC1ibG9jay9BZGRCbG9ja1dyYXBwZXJcIjtcclxuaW1wb3J0IHsgU2l6ZXMgfSBmcm9tIFwiQC9jb21tb24vU2l6ZXNcIjtcclxuaW1wb3J0IHsgU1ZHSWNvbiB9IGZyb20gXCJAL2NvbXBvbmVudHMvY29tbW9uL1NWR0ljb25cIjtcclxuXHJcbmltcG9ydCB7IEljb25zIH0gZnJvbSBcIkAvY29tbW9uL0ljb25zXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgQWRkQmxvY2tCdWlsZGVyIHtcclxuXHJcbiAgICBcclxuICAgIHN0YXRpYyBidWlsZCgpOiBBZGRCbG9ja1dyYXBwZXIge1xyXG4gICAgICAgIHJldHVybiBBZGRCbG9ja1dyYXBwZXIuY3JlYXRlKEFkZEJsb2NrQnV0dG9uLmNyZWF0ZShTVkdJY29uLmNyZWF0ZShJY29ucy5QbHVzLCBTaXplcy5tZWRpdW0pKSk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBCYXNlVUlDb21wb25lbnQgfSBmcm9tIFwiLi4vLi4vY29tbW9uL0Jhc2VVSUNvbXBvbmVudFwiO1xyXG5pbXBvcnQgeyBEcm9wZG93bk1lbnVCdXR0b24gfSBmcm9tIFwiLi9Ecm9wZG93bk1lbnVCdXR0b25cIjtcclxuaW1wb3J0IHsgRHJvcGRvd25NZW51TGlzdCB9IGZyb20gXCIuL0Ryb3Bkb3duTWVudUxpc3RcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBEcm9wZG93bk1lbnUgZXh0ZW5kcyBCYXNlVUlDb21wb25lbnQge1xyXG5cclxuICAgIHJlYWRvbmx5IGlkOiBzdHJpbmc7XHJcbiAgICBkcm9wZG93bkJ1dHRvbjogRHJvcGRvd25NZW51QnV0dG9uO1xyXG4gICAgZHJvcGRvd25MaXN0OiBEcm9wZG93bk1lbnVMaXN0O1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGlkOiBzdHJpbmcsICBidXR0b246IERyb3Bkb3duTWVudUJ1dHRvbiwgZHJvcGRvd25MaXN0OiBEcm9wZG93bk1lbnVMaXN0KSB7XHJcblxyXG4gICAgICAgIHN1cGVyKHtcclxuICAgICAgICAgICAgaWQ6IGlkXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5pZCA9IGlkO1xyXG4gICAgICAgIHRoaXMuZHJvcGRvd25CdXR0b24gPSBidXR0b247XHJcbiAgICAgICAgdGhpcy5kcm9wZG93bkxpc3QgPSBkcm9wZG93bkxpc3Q7XHJcblxyXG5cclxuICAgICAgICBidXR0b24uYXBwZW5kVG8odGhpcyk7XHJcbiAgICAgICAgZHJvcGRvd25MaXN0LmFwcGVuZFRvKHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXQoKTogSFRNTEVsZW1lbnQge1xyXG5cclxuICAgICAgICBjb25zdCBodG1sRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuaWQgPSB0aGlzLnByb3BzLmlkO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJzZWxlY3Qtd3JhcHBlclwiKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGh0bWxFbGVtZW50O1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBnZXQgZGlzcGxheSgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiAnYmxvY2snO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgSk5vZGUgfSBmcm9tIFwiLi9KTm9kZVwiO1xyXG5cclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VEb3VibHlMaW5rZWRMaXN0PFQ+IHtcclxuXHJcbiAgICBoZWFkOiBKTm9kZTxUPiB8IG51bGwgPSBudWxsO1xyXG4gICAgdGFpbDogSk5vZGU8VD4gfCBudWxsID0gbnVsbDtcclxuXHJcbiAgICBsZW5ndGg6IG51bWJlciA9IDA7XHJcblxyXG4gICAgYWJzdHJhY3QgYXBwZW5kKGVsZW1lbnQ6IFQpOiB2b2lkO1xyXG5cclxuICAgIGdldEZpcnN0KCk6IEpOb2RlPFQ+IHwgbnVsbCB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaGVhZDtcclxuICAgIH1cclxuXHJcbiAgICBnZXRMYXN0KCk6IEpOb2RlPFQ+IHwgbnVsbCB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudGFpbDtcclxuICAgIH1cclxuXHJcbiAgICAqW1N5bWJvbC5pdGVyYXRvcl0oKSB7XHJcbiAgICAgICAgbGV0IGN1cnJlbnQgPSB0aGlzLmhlYWQ7XHJcbiAgICAgICAgaWYgKCFjdXJyZW50KSByZXR1cm47XHJcbiAgICAgICAgZG8ge1xyXG4gICAgICAgICAgICB5aWVsZCBjdXJyZW50O1xyXG4gICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0Tm9kZTtcclxuICAgICAgICB9IHdoaWxlIChjdXJyZW50ICYmIGN1cnJlbnQgIT09IHRoaXMuaGVhZCk7XHJcbiAgICB9XHJcblxyXG4gICAgZm9yRWFjaChjYWxsYmFjazogKG5vZGU6IFQsIGluZGV4OiBudW1iZXIsIGxpc3Q6IEJhc2VEb3VibHlMaW5rZWRMaXN0PFQ+KSA9PiB2b2lkKTogdm9pZCB7XHJcbiAgICAgICAgbGV0IGluZGV4ID0gMDtcclxuICAgICAgICBmb3IgKGxldCBub2RlIG9mIHRoaXMpIHtcclxuICAgICAgICAgICAgY2FsbGJhY2sobm9kZS52YWx1ZSwgaW5kZXgsIHRoaXMpO1xyXG4gICAgICAgICAgICBpbmRleCsrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhbnkocHJlZGljYXRlOiAobm9kZTogVCkgPT4gYm9vbGVhbik6IGJvb2xlYW4ge1xyXG4gICAgICAgIGxldCBjdXJyZW50ID0gdGhpcy5oZWFkO1xyXG4gICAgICAgIHdoaWxlIChjdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGlmIChwcmVkaWNhdGUoY3VycmVudC52YWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHROb2RlO1xyXG4gICAgICAgICAgICBpZiAoY3VycmVudCA9PT0gdGhpcy5oZWFkKSBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGZpbmRGaXJzdChwcmVkaWNhdGU6IChub2RlOiBUKSA9PiBib29sZWFuKTogSk5vZGU8VD4gfCBudWxsIHtcclxuICAgICAgICBpZiAoIXRoaXMuaGVhZCkgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgICAgIGxldCBjdXJyZW50OiBudWxsIHwgSk5vZGU8VD4gPSB0aGlzLmhlYWQ7XHJcbiAgICAgICAgZG8ge1xyXG4gICAgICAgICAgICBpZiAocHJlZGljYXRlKGN1cnJlbnQudmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0Tm9kZTtcclxuICAgICAgICB9IHdoaWxlIChjdXJyZW50ICYmIGN1cnJlbnQgIT09IHRoaXMuaGVhZCk7XHJcblxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGZpbmRMYXN0KHByZWRpY2F0ZTogKG5vZGU6IFQpID0+IGJvb2xlYW4pOiBKTm9kZTxUPiB8IG51bGwge1xyXG4gICAgICAgIGlmICghdGhpcy50YWlsKSByZXR1cm4gbnVsbDtcclxuXHJcbiAgICAgICAgbGV0IGN1cnJlbnQ6IG51bGwgfCBKTm9kZTxUPiA9IHRoaXMudGFpbDtcclxuXHJcbiAgICAgICAgZG8ge1xyXG4gICAgICAgICAgICBpZiAocHJlZGljYXRlKGN1cnJlbnQudmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5wcmV2aW91c05vZGU7XHJcbiAgICAgICAgfSB3aGlsZSAoY3VycmVudCAmJiBjdXJyZW50ICE9PSB0aGlzLnRhaWwpO1xyXG5cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBmaW5kKGVsZW1lbnQ6IFQpOiBKTm9kZTxUPiB8IG51bGwge1xyXG5cclxuICAgICAgICBsZXQgY3VycmVudDogSk5vZGU8VD4gfCBudWxsID0gdGhpcy5oZWFkO1xyXG5cclxuICAgICAgICB3aGlsZSAoY3VycmVudCkge1xyXG4gICAgICAgICAgICBpZiAoY3VycmVudC52YWx1ZSA9PSBlbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dE5vZGU7XHJcbiAgICAgICAgICAgIGlmIChjdXJyZW50ID09PSB0aGlzLmhlYWQpIGJyZWFrO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBCYXNlRG91Ymx5TGlua2VkTGlzdCB9IGZyb20gXCIuL0Jhc2VEb3VibHlMaW5rZWRMaXN0XCI7XHJcblxyXG5leHBvcnQgY2xhc3MgSk5vZGU8VD4ge1xyXG5cclxuICAgIHBhcmVudExpc3Q6IEJhc2VEb3VibHlMaW5rZWRMaXN0PFQ+O1xyXG5cclxuICAgIHByZXZpb3VzTm9kZTogSk5vZGU8VD4gfCBudWxsO1xyXG4gICAgbmV4dE5vZGU6IEpOb2RlPFQ+IHwgbnVsbDtcclxuICAgIHZhbHVlOiBUO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHZhbHVlOiBULCBwYXJlbnRMaXN0OiBCYXNlRG91Ymx5TGlua2VkTGlzdDxUPikge1xyXG4gICAgICAgIHRoaXMucHJldmlvdXNOb2RlID0gbnVsbDtcclxuICAgICAgICB0aGlzLm5leHROb2RlID0gbnVsbDtcclxuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy5wYXJlbnRMaXN0ID0gcGFyZW50TGlzdDtcclxuICAgIH1cclxuXHJcbiAgICBzZXROZXh0KG5vZGU6IEpOb2RlPFQ+KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5uZXh0Tm9kZSA9IG5vZGU7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0UHJldmlvdXMobm9kZTogSk5vZGU8VD4pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnByZXZpb3VzTm9kZSA9IG5vZGU7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0TmV4dFNhdGlzZnlpbmcocHJlZGljYXRlOiAobm9kZTogVCkgPT4gYm9vbGVhbik6IEpOb2RlPFQ+IHwgbnVsbCB7XHJcbiAgICAgICAgbGV0IGN1cnJlbnQgPSB0aGlzLm5leHROb2RlO1xyXG4gICAgICAgIGNvbnN0IHN0YXJ0Tm9kZSA9IHRoaXM7XHJcbiAgICAgICAgd2hpbGUgKGN1cnJlbnQpIHtcclxuICAgICAgICAgICAgaWYgKHByZWRpY2F0ZShjdXJyZW50LnZhbHVlKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dE5vZGU7XHJcbiAgICAgICAgICAgIGlmIChjdXJyZW50ID09PSBzdGFydE5vZGUpIHtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFByZXZpb3VzU2F0aXNmeWluZyhwcmVkaWNhdGU6IChub2RlOiBUKSA9PiBib29sZWFuKTogSk5vZGU8VD4gfCBudWxsIHtcclxuICAgICAgICBsZXQgY3VycmVudCA9IHRoaXMucHJldmlvdXNOb2RlO1xyXG4gICAgICAgIGNvbnN0IHN0YXJ0Tm9kZSA9IHRoaXM7XHJcbiAgICAgICAgd2hpbGUgKGN1cnJlbnQgJiYgY3VycmVudCAhPT0gc3RhcnROb2RlKSB7XHJcbiAgICAgICAgICAgIGlmIChwcmVkaWNhdGUoY3VycmVudC52YWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LnByZXZpb3VzTm9kZTtcclxuICAgICAgICAgICAgaWYgKGN1cnJlbnQgPT09IHRoaXMpIHtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgQmFzZURvdWJseUxpbmtlZExpc3QgfSBmcm9tIFwiLi9CYXNlRG91Ymx5TGlua2VkTGlzdFwiO1xyXG5pbXBvcnQgeyBKTm9kZSB9IGZyb20gXCIuL0pOb2RlXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgQ2lyY3VsYXJEb3VibHlMaW5rZWRMaXN0PFQ+IGV4dGVuZHMgQmFzZURvdWJseUxpbmtlZExpc3Q8VD4ge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXBwZW5kKGVsZW1lbnQ6IFQpOiB2b2lkIHtcclxuXHJcbiAgICAgICAgY29uc3Qgbm9kZSA9IG5ldyBKTm9kZShlbGVtZW50LCB0aGlzKTtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLmhlYWQgfHwgIXRoaXMudGFpbCkge1xyXG5cclxuICAgICAgICAgICAgdGhpcy5oZWFkID0gbm9kZTtcclxuICAgICAgICAgICAgdGhpcy50YWlsID0gbm9kZTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuaGVhZC5zZXROZXh0KHRoaXMudGFpbCk7XHJcbiAgICAgICAgICAgIHRoaXMuaGVhZC5zZXRQcmV2aW91cyh0aGlzLnRhaWwpO1xyXG5cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBub2RlLnNldFByZXZpb3VzKHRoaXMudGFpbCk7XHJcbiAgICAgICAgICAgIG5vZGUuc2V0TmV4dCh0aGlzLmhlYWQpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy50YWlsLnNldE5leHQobm9kZSk7XHJcbiAgICAgICAgICAgIHRoaXMuaGVhZC5zZXRQcmV2aW91cyhub2RlKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMudGFpbCA9IG5vZGU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmxlbmd0aCsrO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgQmFzZVVJQ29tcG9uZW50IH0gZnJvbSBcIi4uLy4uL2NvbW1vbi9CYXNlVUlDb21wb25lbnRcIjtcclxuaW1wb3J0IHsgRHJvcGRvd25NZW51TGlzdCB9IGZyb20gXCIuL0Ryb3Bkb3duTWVudUxpc3RcIjtcclxuaW1wb3J0IHsgU1ZHSWNvbiB9IGZyb20gXCJAL2NvbXBvbmVudHMvY29tbW9uL1NWR0ljb25cIjtcclxuaW1wb3J0IHsgSURyb3Bkb3duTWVudUl0ZW0gfSBmcm9tIFwiLi9JRHJvcGRvd25NZW51SXRlbVwiO1xyXG5pbXBvcnQgeyBKTm9kZSB9IGZyb20gXCJAL2NvbW1vbi9KTm9kZVwiO1xyXG5pbXBvcnQgeyBTaXplcyB9IGZyb20gXCJAL2NvbW1vbi9TaXplc1wiO1xyXG5pbXBvcnQgeyBJQ29tbWFuZEV2ZW50RGV0YWlsIH0gZnJvbSBcIkAvY29tbWFuZHMvSUNvbW1hbmRFdmVudERldGFpbFwiO1xyXG5pbXBvcnQgeyBDdXN0b21FdmVudHMgfSBmcm9tIFwiQC9jb21tb24vQ3VzdG9tRXZlbnRzXCI7XHJcbmltcG9ydCB7IEN1c3RvbVVJRXZlbnRzIH0gZnJvbSBcIkAvY29tbW9uL0N1c3RvbVVJRXZlbnRzXCI7XHJcbmltcG9ydCB7IElVSUV2ZW50RGV0YWlsIH0gZnJvbSBcIkAvY29tbWFuZHMvSVVJRXZlbnREZXRhaWxcIjtcclxuaW1wb3J0IHsgU2hvd0hpZGVBY3RpdmVCdXR0b24gfSBmcm9tIFwiQC9jb21tYW5kcy9VSUFjdGlvbnMvU2hvd0hpZGVBY3RpdmVCdXR0b25cIjtcclxuaW1wb3J0IHsgUmVzZXRBY3RpdmVCdXR0b25zIH0gZnJvbSBcIkAvY29tbWFuZHMvVUlBY3Rpb25zL1Jlc2V0QWN0aXZlQnV0dG9uc1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIERyb3Bkb3duTWVudUxpc3RJdGVtIGV4dGVuZHMgQmFzZVVJQ29tcG9uZW50IGltcGxlbWVudHMgSURyb3Bkb3duTWVudUl0ZW0ge1xyXG5cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgaWQ6IHN0cmluZztcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgY29tbWFuZDogc3RyaW5nO1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSB2YWx1ZTogc3RyaW5nIHwgbnVsbDtcclxuICAgIHJlYWRvbmx5IGFjdGl2ZUljb24/OiBTVkdJY29uO1xyXG4gICAgcHJpdmF0ZSBsZWZ0SWNvbj86IFNWR0VsZW1lbnQgfCBIVE1MRWxlbWVudDtcclxuICAgIHByaXZhdGUgY2xhc3NMaXN0OiBzdHJpbmdbXTtcclxuXHJcbiAgICBwcml2YXRlIG9uRm9jdXNGdW5jdGlvbkxpc3Q6ICgoKSA9PiB2b2lkKVtdID0gW107XHJcbiAgICBwcml2YXRlIG9uTG9zZUZvY3VzRnVuY3Rpb25MaXN0OiAoKCkgPT4gdm9pZClbXSA9IFtdO1xyXG5cclxuICAgIHBhcmVudERyb3Bkb3duTWVudUxpc3Q6IERyb3Bkb3duTWVudUxpc3Q7XHJcblxyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgaWQ6IHN0cmluZyxcclxuICAgICAgICBwYXJlbnREcm9wZG93bk1lbnVMaXN0OiBEcm9wZG93bk1lbnVMaXN0LFxyXG4gICAgICAgIGNvbW1hbmQ6IHN0cmluZyxcclxuICAgICAgICB2YWx1ZTogc3RyaW5nIHwgbnVsbCxcclxuICAgICAgICBsZWZ0SWNvbjogSFRNTEVsZW1lbnQgfCBTVkdFbGVtZW50LFxyXG4gICAgICAgIHRpdGxlOiBzdHJpbmcsXHJcbiAgICAgICAgc2hvcnRjdXQ6IHN0cmluZyB8IG51bGwgPSBudWxsKSB7XHJcblxyXG4gICAgICAgIGNvbnN0IGNsYXNzTGlzdCA9IFtcImxpc3QtaXRlbVwiLCBcIm9wdGlvblwiLCBcIm9wdGlvbi1ob3ZlclwiLCBcImJsb2NrLW9wZXJhdGlvblwiXTtcclxuXHJcbiAgICAgICAgY29uc3QgaWNvbiA9IG5ldyBTVkdJY29uKFwiaWNvbi1tYXRlcmlhbC1zbWFsbC1jaGVja1wiLCBTaXplcy5tZWRpdW0pO1xyXG4gICAgICAgIGljb24uaHRtbEVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9IFwiaGlkZGVuXCI7XHJcblxyXG4gICAgICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICAgICAgICBsZWZ0SWNvbi5zdHlsZS5jb2xvciA9IHZhbHVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc3VwZXIoe1xyXG4gICAgICAgICAgICBpZDogaWQsXHJcbiAgICAgICAgICAgIGNsYXNzTGlzdDogY2xhc3NMaXN0LFxyXG4gICAgICAgICAgICBsZWZ0SWNvbjogbGVmdEljb24sXHJcbiAgICAgICAgICAgIHRpdGxlOiB0aXRsZSxcclxuICAgICAgICAgICAgaWNvbjogaWNvbixcclxuICAgICAgICAgICAgc2hvcnRjdXQ6IHNob3J0Y3V0XHJcbiAgICAgICAgfSk7XHJcblxyXG5cclxuICAgICAgICB0aGlzLmlkID0gaWQ7XHJcbiAgICAgICAgdGhpcy5jbGFzc0xpc3QgPSBjbGFzc0xpc3Q7XHJcbiAgICAgICAgdGhpcy5sZWZ0SWNvbiA9IGxlZnRJY29uO1xyXG4gICAgICAgIHRoaXMuY29tbWFuZCA9IGNvbW1hbmQ7XHJcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xyXG4gICAgICAgIHRoaXMucGFyZW50RHJvcGRvd25NZW51TGlzdCA9IHBhcmVudERyb3Bkb3duTWVudUxpc3Q7XHJcbiAgICAgICAgdGhpcy5hY3RpdmVJY29uID0gaWNvbjtcclxuXHJcbiAgICAgICAgdGhpcy5hdHRhY2hFdmVudCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGF0dGFjaE9uRm9jdXMoZnVuYzogKCkgPT4gdm9pZCk6IHZvaWQge1xyXG4gICAgLy8gICAgIHRoaXMub25Gb2N1c0Z1bmN0aW9uTGlzdC5wdXNoKGZ1bmMpO1xyXG4gICAgLy8gfVxyXG5cclxuICAgIGFkZENsYXNzKGNsYXNzS2V5OiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLmNsYXNzTGlzdC5wdXNoKGNsYXNzS2V5KTtcclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LmNsYXNzTGlzdC5hZGQoY2xhc3NLZXkpO1xyXG4gICAgfVxyXG5cclxuICAgIGF0dGFjaE9uRm9jdXM8VCBleHRlbmRzIGFueVtdPihmdW5jOiAoLi4uYXJnczogVCkgPT4gdm9pZCwgLi4uYXJnczogVCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMub25Gb2N1c0Z1bmN0aW9uTGlzdC5wdXNoKCgpID0+IGZ1bmMoLi4uYXJncykpO1xyXG4gICAgfVxyXG5cclxuICAgIGF0dGFjaE9uTG9zZUZvY3VzPFQgZXh0ZW5kcyBhbnlbXT4oZnVuYzogKC4uLmFyZ3M6IFQpID0+IHZvaWQsIC4uLmFyZ3M6IFQpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLm9uTG9zZUZvY3VzRnVuY3Rpb25MaXN0LnB1c2goKCkgPT4gZnVuYyguLi5hcmdzKSk7XHJcbiAgICB9XHJcblxyXG4gICAgZm9jdXMoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdvcHRpb24tZm9jdXNlZCcpO1xyXG4gICAgICAgIHRoaXMub25Gb2N1c0Z1bmN0aW9uTGlzdC5mb3JFYWNoKGZ1bmMgPT4gZnVuYygpKTtcclxuICAgIH1cclxuXHJcbiAgICByZW1vdmVGb2N1cygpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ29wdGlvbi1mb2N1c2VkJyk7XHJcbiAgICAgICAgdGhpcy5vbkxvc2VGb2N1c0Z1bmN0aW9uTGlzdC5mb3JFYWNoKGZ1bmMgPT4gZnVuYygpKTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0KCk6IEhUTUxFbGVtZW50IHtcclxuXHJcbiAgICAgICAgY29uc3QgaHRtbEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaScpO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LmlkID0gdGhpcy5wcm9wcy5pZDtcclxuICAgICAgICBjb25zdCBjbGFzc0xpc3QgPSB0aGlzLnByb3BzLmNsYXNzTGlzdCBhcyBzdHJpbmdbXTtcclxuICAgICAgICBodG1sRWxlbWVudC5jbGFzc0xpc3QuYWRkKC4uLmNsYXNzTGlzdCk7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQudGFiSW5kZXggPSAyO1xyXG5cclxuICAgICAgICBodG1sRWxlbWVudC5zdHlsZS5jb2xvciA9IFwiIzM3MzUyRlwiO1xyXG5cclxuICAgICAgICBjb25zdCB0ZXh0T3B0aW9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgdGV4dE9wdGlvbi5jbGFzc0xpc3QuYWRkKCd0ZXh0LW9wdGlvbicpO1xyXG5cclxuICAgICAgICB0ZXh0T3B0aW9uLmFwcGVuZENoaWxkKHRoaXMucHJvcHMubGVmdEljb24pO1xyXG5cclxuICAgICAgICBjb25zdCBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xyXG4gICAgICAgIHNwYW4uaW5uZXJUZXh0ID0gdGhpcy5wcm9wcy50aXRsZTtcclxuXHJcbiAgICAgICAgdGV4dE9wdGlvbi5hcHBlbmRDaGlsZChzcGFuKTtcclxuXHJcbiAgICAgICAgaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQodGV4dE9wdGlvbik7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5wcm9wcy5pY29uLmh0bWxFbGVtZW50KTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMucHJvcHMuc2hvcnRjdXQpIHtcclxuICAgICAgICAgICAgY29uc3Qgc2hvcnRDdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcclxuICAgICAgICAgICAgc2hvcnRDdXQuaW5uZXJUZXh0ID0gdGhpcy5wcm9wcy5zaG9ydGN1dDtcclxuICAgICAgICAgICAgc2hvcnRDdXQuc3R5bGUuY29sb3IgPSBcInJnYmEoNTUsIDUzLCA0NywgMC41KVwiXHJcblxyXG4gICAgICAgICAgICBodG1sRWxlbWVudC5hcHBlbmRDaGlsZChzaG9ydEN1dCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gaHRtbEVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgZW1pdENvbW1hbmRFdmVudCgpOiB2b2lkIHtcclxuXHJcbiAgICAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQ8SUNvbW1hbmRFdmVudERldGFpbD4oQ3VzdG9tRXZlbnRzLmVtaXR0ZWRDb21tYW5kLCB7XHJcbiAgICAgICAgICAgIGRldGFpbDoge1xyXG4gICAgICAgICAgICAgICAgY29tbWFuZDogdGhpcy5jb21tYW5kLFxyXG4gICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMudmFsdWUsXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChjdXN0b21FdmVudCk7XHJcblxyXG5cclxuICAgICAgICAvLyByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xyXG4gICAgICAgIC8vICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgICAgICAgLy8gICAgIGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAwKSByZXR1cm47XHJcblxyXG4gICAgICAgIC8vICAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xyXG4gICAgICAgIC8vICAgICBsZXQgY29udGFpbmVyOiBOb2RlIHwgbnVsbCA9IHJhbmdlLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyO1xyXG5cclxuICAgICAgICAvLyAgICAgaWYgKGNvbnRhaW5lcj8ubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XHJcbiAgICAgICAgLy8gICAgICAgICBjb250YWluZXIgPSBjb250YWluZXIucGFyZW50Tm9kZTtcclxuICAgICAgICAvLyAgICAgfVxyXG5cclxuICAgICAgICAvLyAgICAgY29uc3QgZm9jdXNhYmxlUGFyZW50ID0gKGNvbnRhaW5lciBhcyBIVE1MRWxlbWVudCkuY2xvc2VzdChcIi5mb2N1c2FibGVcIik7XHJcblxyXG4gICAgICAgIC8vICAgICBpZiAoZm9jdXNhYmxlUGFyZW50KSB7XHJcbiAgICAgICAgLy8gICAgICAgICB0aGlzLm5vcm1hbGl6ZUFuZE1lcmdlRWxlbWVudHMoZm9jdXNhYmxlUGFyZW50IGFzIEhUTUxFbGVtZW50KTtcclxuICAgICAgICAvLyAgICAgfVxyXG4gICAgICAgIC8vIH0pO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBhZGRDc3NDbGFzcyguLi50b2tlbnM6IHN0cmluZ1tdKSB7XHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5jbGFzc0xpc3QuYWRkKC4uLnRva2Vucyk7XHJcbiAgICB9XHJcblxyXG4gICAgYXR0YWNoRXZlbnQoKTogdm9pZCB7XHJcblxyXG4gICAgICAgIHRoaXMuYXR0YWNoVUlFdmVudCgpO1xyXG5cclxuICAgICAgICAvLyBQcmV2ZW50IGZvY3VzIGNoYW5nZSB3aGVuIGNsaWNraW5nIG9uIHRoaXMgZWxlbWVudFxyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIChldmVudCkgPT4ge1xyXG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBQcmV2ZW50IGZvY3VzIGNoYW5nZSB3aGVuIGNsaWNraW5nIG9uIHRoaXMgZWxlbWVudFxyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlZG93blwiLCAoZXZlbnQpID0+IHtcclxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBhc3luYyAoKSA9PiB7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBub2RlOiBKTm9kZTxJRHJvcGRvd25NZW51SXRlbT4gPSB0aGlzLnBhcmVudERyb3Bkb3duTWVudUxpc3QuZHJvcGRvd25JdGVtcy5maW5kKHRoaXMpITtcclxuXHJcbiAgICAgICAgICAgIHRoaXMucGFyZW50RHJvcGRvd25NZW51TGlzdC5zd2l0Y2hWaXN1YWxGb2N1cyhub2RlISk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5lbWl0Q29tbWFuZEV2ZW50KCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG5cclxuICAgICAgICAvLyBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEN1c3RvbUV2ZW50cy50ZXh0Rm9ybWF0Q2hhbmdlZCwgKGV2ZW50OiBFdmVudCkgPT4ge1xyXG5cclxuICAgICAgICAvLyAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBldmVudCBhcyBDdXN0b21FdmVudDxJRm9ybWF0Q29tbWFuZD47XHJcbiAgICAgICAgLy8gICAgIGNvbnN0IHN0YXRlcyA9IGN1c3RvbUV2ZW50LmRldGFpbDtcclxuXHJcbiAgICAgICAgLy8gICAgIGlmICh0aGlzLmNvbW1hbmQgPT0gQ29tbWFuZHMudG9nZ2xlSGlsaXRlQ29sb3IpIHtcclxuXHJcbiAgICAgICAgLy8gICAgICAgICBpZiAoIXRoaXMudmFsdWUpIHtcclxuICAgICAgICAvLyAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbG9yIHZhbHVlIG11c3QgYmUgcHJvdmlkZWQgZm9yIHRoZSAnaGlsaXRlQ29sb3InIGNvbW1hbmQuIEVhY2ggJ0xpc3RNZW51SXRlbScgbXVzdCBzcGVjaWZ5IGEgY29sb3IgcmVwcmVzZW50aW5nIHRoZSB0ZXh0IGJhY2tncm91bmQgY29sb3IuXCIpO1xyXG4gICAgICAgIC8vICAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyAgICAgICAgIGlmIChzdGF0ZXMuaGlsaXRlQ29sb3JbdGhpcy52YWx1ZV0pIHtcclxuICAgICAgICAvLyAgICAgICAgICAgICB0aGlzLmFjdGl2ZUljb24/LmNoYW5nZVZpc2liaWxpdHlUb1Zpc2libGUoKTtcclxuICAgICAgICAvLyAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgdGhpcy5hY3RpdmVJY29uPy5jaGFuZ2VWaXNpYmlsaXR5VG9IaWRkZW4oKTtcclxuICAgICAgICAvLyAgICAgICAgIH1cclxuICAgICAgICAvLyAgICAgfVxyXG5cclxuICAgICAgICAvLyAgICAgaWYgKHRoaXMuY29tbWFuZCA9PSBDb21tYW5kcy50b2dnbGVGb3JlQ29sb3IpIHtcclxuXHJcbiAgICAgICAgLy8gICAgICAgICBpZiAoIXRoaXMudmFsdWUpIHtcclxuICAgICAgICAvLyAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbG9yIHZhbHVlIG11c3QgYmUgcHJvdmlkZWQgZm9yIHRoZSAnY29yZUNvbG9yJyBjb21tYW5kLiBFYWNoICdMaXN0TWVudUl0ZW0nIG11c3Qgc3BlY2lmeSBhIGNvbG9yIHJlcHJlc2VudGluZyB0aGUgdGV4dCBjb2xvci5cIik7XHJcbiAgICAgICAgLy8gICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vICAgICAgICAgaWYgKHN0YXRlcy5mb3JlQ29sb3JbdGhpcy52YWx1ZV0pIHtcclxuICAgICAgICAvLyAgICAgICAgICAgICB0aGlzLmFjdGl2ZUljb24/LmNoYW5nZVZpc2liaWxpdHlUb1Zpc2libGUoKTtcclxuICAgICAgICAvLyAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgdGhpcy5hY3RpdmVJY29uPy5jaGFuZ2VWaXNpYmlsaXR5VG9IaWRkZW4oKTtcclxuICAgICAgICAvLyAgICAgICAgIH1cclxuICAgICAgICAvLyAgICAgfVxyXG5cclxuICAgICAgICAvLyAgICAgaWYgKHRoaXMuY29tbWFuZCA9PSBDb21tYW5kcy50b2dnbGVDZWxsSGlsaXRlQ29sb3IpIHtcclxuXHJcbiAgICAgICAgLy8gICAgICAgICBpZiAoIXRoaXMudmFsdWUpIHtcclxuICAgICAgICAvLyAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbG9yIHZhbHVlIG11c3QgYmUgcHJvdmlkZWQgZm9yIHRoZSAnY29yZUNvbG9yJyBjb21tYW5kLiBFYWNoICdMaXN0TWVudUl0ZW0nIG11c3Qgc3BlY2lmeSBhIGNvbG9yIHJlcHJlc2VudGluZyB0aGUgdGV4dCBjb2xvci5cIik7XHJcbiAgICAgICAgLy8gICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vICAgICAgICAgaWYgKHN0YXRlcy5jZWxsSGlsaXRlQ29sb3JbdGhpcy52YWx1ZV0pIHtcclxuICAgICAgICAvLyAgICAgICAgICAgICB0aGlzLmFjdGl2ZUljb24/LmNoYW5nZVZpc2liaWxpdHlUb1Zpc2libGUoKTtcclxuICAgICAgICAvLyAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgdGhpcy5hY3RpdmVJY29uPy5jaGFuZ2VWaXNpYmlsaXR5VG9IaWRkZW4oKTtcclxuICAgICAgICAvLyAgICAgICAgIH1cclxuICAgICAgICAvLyAgICAgfVxyXG5cclxuICAgICAgICAvLyB9KTtcclxuXHJcbiAgICAgICAgLy8gZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihDdXN0b21FdmVudHMudGFibGVDZWxsQ2hhbmdlZCwgKGV2ZW50OiBFdmVudCkgPT4ge1xyXG5cclxuICAgICAgICAvLyAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBldmVudCBhcyBDdXN0b21FdmVudDxJRm9ybWF0Q29tbWFuZD47XHJcbiAgICAgICAgLy8gICAgIGNvbnN0IHN0YXRlcyA9IGN1c3RvbUV2ZW50LmRldGFpbDtcclxuXHJcblxyXG4gICAgICAgIC8vICAgICBpZiAodGhpcy5jb21tYW5kID09IENvbW1hbmRzLnRvZ2dsZUNlbGxIaWxpdGVDb2xvcikge1xyXG5cclxuICAgICAgICAvLyAgICAgICAgIGlmICghdGhpcy52YWx1ZSkge1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29sb3IgdmFsdWUgbXVzdCBiZSBwcm92aWRlZCBmb3IgdGhlICdjb3JlQ29sb3InIGNvbW1hbmQuIEVhY2ggJ0xpc3RNZW51SXRlbScgbXVzdCBzcGVjaWZ5IGEgY29sb3IgcmVwcmVzZW50aW5nIHRoZSB0ZXh0IGNvbG9yLlwiKTtcclxuICAgICAgICAvLyAgICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gICAgICAgICBpZiAoc3RhdGVzLmNlbGxIaWxpdGVDb2xvclt0aGlzLnZhbHVlXSkge1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIHRoaXMuYWN0aXZlSWNvbj8uY2hhbmdlVmlzaWJpbGl0eVRvVmlzaWJsZSgpO1xyXG4gICAgICAgIC8vICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyAgICAgICAgICAgICB0aGlzLmFjdGl2ZUljb24/LmNoYW5nZVZpc2liaWxpdHlUb0hpZGRlbigpO1xyXG4gICAgICAgIC8vICAgICAgICAgfVxyXG4gICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgLy8gfSk7XHJcblxyXG5cclxuICAgICAgICAvLyBwcml2YXRlIGhhbmRsZUNvbW1hbmRFdmVudCA9IChldmVudDogQ3VzdG9tRXZlbnQ8SUNvbW1hbmRFdmVudERldGFpbD4pOiB2b2lkID0+IHtcclxuICAgICAgICAvLyAgICAgY29uc3QgeyBjb21tYW5kLCBzaG93VUksIHZhbHVlLCB0YXJnZXRCbG9ja1R5cGUgfSA9IGV2ZW50LmRldGFpbDtcclxuXHJcblxyXG4gICAgICAgIC8vIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJzZWxlY3Rpb25jaGFuZ2VcIiwgYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgIC8vICAgICBpZiAoXHJcbiAgICAgICAgLy8gICAgICAgICB0aGlzLmNvbW1hbmQgPT0gVGV4dE9wZXJhdGlvblNlcnZpY2UuUVVFUllfVEVYVF9PUEVSQVRJT05TLkhJTElURV9DT0xPUiB8fFxyXG4gICAgICAgIC8vICAgICAgICAgdGhpcy5jb21tYW5kID09IFRleHRPcGVyYXRpb25TZXJ2aWNlLlFVRVJZX1RFWFRfT1BFUkFUSU9OUy5GT1JFX0NPTE9SKSB7XHJcblxyXG4gICAgICAgIC8vICAgICAgICAgYXdhaXQgdGhpcy5jaGFuZ2VDaGVja0ljb25WaXNpYmlsaXR5KCk7XHJcbiAgICAgICAgLy8gICAgIH1cclxuICAgICAgICAvLyB9KTtcclxuXHJcbiAgICAgICAgLy8gZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNvbG9yQ2hhbmdlXCIsIGFzeW5jICgpID0+IHtcclxuICAgICAgICAvLyAgICAgaWYgKFxyXG4gICAgICAgIC8vICAgICAgICAgdGhpcy5jb21tYW5kID09IFRleHRPcGVyYXRpb25TZXJ2aWNlLlFVRVJZX1RFWFRfT1BFUkFUSU9OUy5ISUxJVEVfQ09MT1IgfHxcclxuICAgICAgICAvLyAgICAgICAgIHRoaXMuY29tbWFuZCA9PSBUZXh0T3BlcmF0aW9uU2VydmljZS5RVUVSWV9URVhUX09QRVJBVElPTlMuRk9SRV9DT0xPUikge1xyXG5cclxuICAgICAgICAvLyAgICAgICAgIGF3YWl0IHRoaXMuY2hhbmdlQ2hlY2tJY29uVmlzaWJpbGl0eSgpO1xyXG4gICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgLy8gfSk7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8vIG5vcm1hbGl6ZUFuZE1lcmdlRWxlbWVudHMoZWxlbWVudDogSFRNTEVsZW1lbnQgfCBudWxsKTogdm9pZCB7XHJcbiAgICAvLyAgICAgaWYgKCFlbGVtZW50KSByZXR1cm47XHJcblxyXG4gICAgLy8gICAgIGxldCBjaGlsZCA9IGVsZW1lbnQuZmlyc3RDaGlsZDtcclxuICAgIC8vICAgICB3aGlsZSAoY2hpbGQpIHtcclxuICAgIC8vICAgICAgICAgaWYgKGNoaWxkLm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSkge1xyXG4gICAgLy8gICAgICAgICAgICAgdGhpcy5ub3JtYWxpemVBbmRNZXJnZUVsZW1lbnRzKGNoaWxkIGFzIEhUTUxFbGVtZW50KTtcclxuICAgIC8vICAgICAgICAgfVxyXG5cclxuICAgIC8vICAgICAgICAgbGV0IG5leHRTaWJsaW5nID0gY2hpbGQubmV4dFNpYmxpbmc7XHJcbiAgICAvLyAgICAgICAgIHdoaWxlIChuZXh0U2libGluZyAmJiB0aGlzLnNob3VsZE1lcmdlKGNoaWxkLCBuZXh0U2libGluZykpIHtcclxuICAgIC8vICAgICAgICAgICAgIChjaGlsZCBhcyBIVE1MRWxlbWVudCkuaW5uZXJIVE1MICs9IChuZXh0U2libGluZyBhcyBIVE1MRWxlbWVudCkuaW5uZXJIVE1MO1xyXG4gICAgLy8gICAgICAgICAgICAgY29uc3QgbmV4dCA9IG5leHRTaWJsaW5nLm5leHRTaWJsaW5nO1xyXG4gICAgLy8gICAgICAgICAgICAgbmV4dFNpYmxpbmcucGFyZW50Tm9kZSEucmVtb3ZlQ2hpbGQobmV4dFNpYmxpbmcpO1xyXG4gICAgLy8gICAgICAgICAgICAgbmV4dFNpYmxpbmcgPSBuZXh0O1xyXG4gICAgLy8gICAgICAgICB9XHJcblxyXG4gICAgLy8gICAgICAgICBjaGlsZCA9IGNoaWxkLm5leHRTaWJsaW5nO1xyXG4gICAgLy8gICAgIH1cclxuXHJcbiAgICAvLyAgICAgZWxlbWVudC5ub3JtYWxpemUoKTtcclxuICAgIC8vIH1cclxuXHJcbiAgICAvLyBzaG91bGRNZXJnZShub2RlMTogQ2hpbGROb2RlLCBub2RlMjogQ2hpbGROb2RlKTogYm9vbGVhbiB7XHJcbiAgICAvLyAgICAgaWYgKG5vZGUxPy5ub2RlVHlwZSAhPT0gTm9kZS5FTEVNRU5UX05PREUgfHwgbm9kZTI/Lm5vZGVUeXBlICE9PSBOb2RlLkVMRU1FTlRfTk9ERSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgLy8gICAgIGNvbnN0IGVsZW0xID0gbm9kZTEgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAvLyAgICAgY29uc3QgZWxlbTIgPSBub2RlMiBhcyBIVE1MRWxlbWVudDtcclxuICAgIC8vICAgICByZXR1cm4gZWxlbTEudGFnTmFtZSA9PT0gZWxlbTIudGFnTmFtZSAmJlxyXG4gICAgLy8gICAgICAgICBlbGVtMS5zdHlsZS5jc3NUZXh0ID09PSBlbGVtMi5zdHlsZS5jc3NUZXh0ICYmXHJcbiAgICAvLyAgICAgICAgIHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsZW0xKS5jb2xvciA9PT0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWxlbTIpLmNvbG9yO1xyXG4gICAgLy8gfVxyXG5cclxuXHJcbiAgICAvLyBhc3luYyBjaGFuZ2VDaGVja0ljb25WaXNpYmlsaXR5KCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgLy8gICAgIHRyeSB7XHJcbiAgICAvLyAgICAgICAgIGNvbnN0IGlzQWN0aXZlID0gYXdhaXQgdGhpcy50ZXh0T3BlcmF0aW9uU2VydmljZS5xdWVyeUNvbW1hbmRTdGF0ZSh0aGlzLmNvbW1hbmQsIHRoaXMudmFsdWUpO1xyXG4gICAgLy8gICAgICAgICBpZiAoaXNBY3RpdmUpIHtcclxuICAgIC8vICAgICAgICAgICAgIHRoaXMuYWN0aXZlSWNvbj8uY2hhbmdlVmlzaWJpbGl0eVRvVmlzaWJsZSgpO1xyXG4gICAgLy8gICAgICAgICB9IGVsc2Uge1xyXG4gICAgLy8gICAgICAgICAgICAgdGhpcy5hY3RpdmVJY29uPy5jaGFuZ2VWaXNpYmlsaXR5VG9IaWRkZW4oKTtcclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAvLyAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJGYWlsZWQgdG8gcXVlcnkgY29tbWFuZCBzdGF0ZTpcIiwgZXJyb3IpO1xyXG4gICAgLy8gICAgIH1cclxuICAgIC8vIH1cclxuXHJcblxyXG5cclxuICAgIGF0dGFjaFVJRXZlbnQoKSB7XHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihDdXN0b21VSUV2ZW50cy5TaG93SGlkZUFjdGl2ZUJ1dHRvbiwgdGhpcy5oYW5kbGVTaG93SGlkZUFjdGl2ZUJ1dHRvbkV2ZW50LmJpbmQodGhpcykpO1xyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoQ3VzdG9tVUlFdmVudHMuUmVzZXRBY3RpdmVCdXR0b25zLCB0aGlzLmhhbmRsZVJlc2V0QWN0aXZlQnV0dG9uc0V2ZW50LmJpbmQodGhpcykpO1xyXG4gICAgfVxyXG5cclxuICAgIGhhbmRsZVNob3dIaWRlQWN0aXZlQnV0dG9uRXZlbnQoZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBldmVudCBhcyBDdXN0b21FdmVudDxJVUlFdmVudERldGFpbD47XHJcbiAgICAgICAgY29uc3QgZGV0YWlscyA9IGN1c3RvbUV2ZW50LmRldGFpbDtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuY2xhc3NMaXN0Py5pbmNsdWRlcyhkZXRhaWxzLnRhcmdldENsYXNzISkpIHtcclxuXHJcbiAgICAgICAgICAgIC8vIGlmKCEoZGV0YWlscy5hY3Rpb24gaW5zdGFuY2VvZiBTaG93SGlkZUFjdGl2ZUJ1dHRvbikpe1xyXG4gICAgICAgICAgICAvLyAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAvLyB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCBldmVudFZhbHVlcyA9IChkZXRhaWxzLmFjdGlvbiBhcyBTaG93SGlkZUFjdGl2ZUJ1dHRvbik7XHJcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50Q29sb3IgPSBldmVudFZhbHVlcy52YWx1ZTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnZhbHVlPy50b0xvd2VyQ2FzZSgpID09IGV2ZW50Q29sb3IudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50VmFsdWVzLmludGVudGlvbiA9PSBcInNob3dcIikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlSWNvbj8uY2hhbmdlVmlzaWJpbGl0eVRvVmlzaWJsZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGhhbmRsZVJlc2V0QWN0aXZlQnV0dG9uc0V2ZW50KGV2ZW50OiBFdmVudCkge1xyXG4gICAgICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gZXZlbnQgYXMgQ3VzdG9tRXZlbnQ8SVVJRXZlbnREZXRhaWw+O1xyXG4gICAgICAgIGNvbnN0IGRldGFpbHMgPSBjdXN0b21FdmVudC5kZXRhaWw7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmNsYXNzTGlzdD8uaW5jbHVkZXMoZGV0YWlscy50YXJnZXRDbGFzcyEpKSB7XHJcblxyXG4gICAgICAgICAgICAvLyBpZighKGRldGFpbHMuYWN0aW9uIGluc3RhbmNlb2YgUmVzZXRBY3RpdmVCdXR0b25zKSl7XHJcbiAgICAgICAgICAgIC8vICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIC8vIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlSWNvbj8uY2hhbmdlVmlzaWJpbGl0eVRvSGlkZGVuKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIGdldExlZnRJY29uQmFja2dyb3VuZENvbG9yKCk6IHN0cmluZyB8IG51bGwge1xyXG5cclxuICAgIC8vICAgICBpZiAodGhpcy5sZWZ0SWNvbikge1xyXG5cclxuICAgIC8vICAgICAgICAgY29uc3Qgc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLmxlZnRJY29uKTtcclxuICAgIC8vICAgICAgICAgY29uc3QgcmdiQ29sb3IgPSBzdHlsZS5iYWNrZ3JvdW5kQ29sb3I7XHJcblxyXG4gICAgLy8gICAgICAgICBjb25zdCBoZXhDb2xvciA9IFV0aWxzLnJnYlRvSGV4KHJnYkNvbG9yKS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xyXG4gICAgLy8gICAgICAgICByZXR1cm4gaGV4Q29sb3I7XHJcbiAgICAvLyAgICAgfVxyXG5cclxuICAgIC8vICAgICByZXR1cm4gbnVsbDtcclxuICAgIC8vIH1cclxuXHJcbiAgICAvLyBnZXRMZWZ0SWNvbkNvbG9yKCk6IHN0cmluZyB8IG51bGwge1xyXG5cclxuICAgIC8vICAgICBpZiAodGhpcy5sZWZ0SWNvbikge1xyXG5cclxuICAgIC8vICAgICAgICAgY29uc3Qgc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLmxlZnRJY29uKTtcclxuICAgIC8vICAgICAgICAgY29uc3QgcmdiQ29sb3IgPSBzdHlsZS5iYWNrZ3JvdW5kQ29sb3I7XHJcblxyXG4gICAgLy8gICAgICAgICBjb25zdCBoZXhDb2xvciA9IFV0aWxzLnJnYlRvSGV4KHJnYkNvbG9yKS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xyXG4gICAgLy8gICAgICAgICByZXR1cm4gaGV4Q29sb3I7XHJcbiAgICAvLyAgICAgfVxyXG5cclxuICAgIC8vICAgICByZXR1cm4gbnVsbDtcclxuICAgIC8vIH1cclxuXHJcblxyXG4gICAgLy8gY2hhbmdlQWN0aXZlSWNvblRvVmlzaWJsZSgpOiB2b2lkIHtcclxuICAgIC8vICAgICB0aGlzLmFjdGl2ZUljb24/LmNoYW5nZVZpc2liaWxpdHlUb1Zpc2libGUoKTtcclxuICAgIC8vIH1cclxufSIsImltcG9ydCB7IEJhc2VVSUNvbXBvbmVudCB9IGZyb20gXCIuLi8uLi9jb21tb24vQmFzZVVJQ29tcG9uZW50XCI7XHJcbmltcG9ydCB7IENpcmN1bGFyRG91Ymx5TGlua2VkTGlzdCB9IGZyb20gXCIuLi8uLi8uLi9jb21tb24vQ2lyY3VsYXJEb3VibHlMaW5rZWRMaXN0XCI7XHJcbmltcG9ydCB7IERyb3Bkb3duTWVudUxpc3RJdGVtIH0gZnJvbSBcIi4vRHJvcGRvd25NZW51TGlzdEl0ZW1cIjtcclxuaW1wb3J0IHsgSURyb3Bkb3duTWVudUl0ZW0gfSBmcm9tIFwiLi9JRHJvcGRvd25NZW51SXRlbVwiO1xyXG5pbXBvcnQgeyBKTm9kZSB9IGZyb20gXCJAL2NvbW1vbi9KTm9kZVwiO1xyXG5pbXBvcnQgeyBEcm9wZG93bk1lbnVCdXR0b24gfSBmcm9tIFwiLi9Ecm9wZG93bk1lbnVCdXR0b25cIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBEcm9wZG93bk1lbnVMaXN0IGV4dGVuZHMgQmFzZVVJQ29tcG9uZW50IHtcclxuXHJcbiAgICByZWFkb25seSBpZDogc3RyaW5nO1xyXG4gICAgcHJpdmF0ZSBwYXJlbnREcm9wZG93blBhcmVudEJ1dHRvbj86IERyb3Bkb3duTWVudUJ1dHRvbjtcclxuXHJcbiAgICBkcm9wZG93bkl0ZW1zOiBDaXJjdWxhckRvdWJseUxpbmtlZExpc3Q8SURyb3Bkb3duTWVudUl0ZW0+O1xyXG4gICAgY3VycmVudEZvY3VzZWRNZW51SXRlbTogSk5vZGU8SURyb3Bkb3duTWVudUl0ZW0+IHwgbnVsbDtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihpZDogc3RyaW5nKSB7XHJcblxyXG4gICAgICAgIHN1cGVyKHtcclxuICAgICAgICAgICAgaWQ6IGlkXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuaWQgPSBpZDtcclxuICAgICAgICB0aGlzLmRyb3Bkb3duSXRlbXMgPSBuZXcgQ2lyY3VsYXJEb3VibHlMaW5rZWRMaXN0PERyb3Bkb3duTWVudUxpc3RJdGVtPigpO1xyXG4gICAgICAgIHRoaXMuY3VycmVudEZvY3VzZWRNZW51SXRlbSA9IG51bGw7XHJcblxyXG4gICAgICAgIHRoaXMuYXR0YWNoRXZlbnRzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGRpc3BsYXkoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gJ2ZsZXgnO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXQoKTogSFRNTEVsZW1lbnQge1xyXG5cclxuICAgICAgICBjb25zdCBodG1sRWxlbWVudDogSFRNTFVMaXN0RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3VsJyk7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuaWQgPSB0aGlzLnByb3BzLmlkO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LnNldEF0dHJpYnV0ZSgnbmFtZScsICdibG9jay10eXBlJyk7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuICAgICAgICBodG1sRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdzb2Z0LWJveC1zaGFkb3cnLCAnZGVwZW5kZW50LWJveCcsICdjaGVja2FibGUtaXRlbXMnKTtcclxuICAgICAgICBodG1sRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9IFwiYWJzb2x1dGVcIjtcclxuICAgICAgICBodG1sRWxlbWVudC5zdHlsZS5tYXhIZWlnaHQgPSBcIjI1dm1heFwiO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LnN0eWxlLm92ZXJmbG93WSA9IFwiYXV0b1wiO1xyXG5cclxuICAgICAgICByZXR1cm4gaHRtbEVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgYXBwZW5kKGRyb3Bkb3duSXRlbTogSURyb3Bkb3duTWVudUl0ZW0pOiB2b2lkIHtcclxuXHJcbiAgICAgICAgdGhpcy5kcm9wZG93bkl0ZW1zLmFwcGVuZChkcm9wZG93bkl0ZW0pO1xyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQoZHJvcGRvd25JdGVtLmh0bWxFbGVtZW50KVxyXG4gICAgfVxyXG5cclxuICAgIHNldFBhcmVudERyb3Bkb3duTWVudUJ1dHRvbihkcm9wZG93blBhcmVudEJ1dHRvbjogRHJvcGRvd25NZW51QnV0dG9uKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5wYXJlbnREcm9wZG93blBhcmVudEJ1dHRvbiA9IGRyb3Bkb3duUGFyZW50QnV0dG9uO1xyXG4gICAgfVxyXG5cclxuICAgIGF0dGFjaEV2ZW50cygpOiB2b2lkIHtcclxuXHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChldmVudCkgPT4ge1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuaXNWaXNpYmxlICYmIHRoaXMuY3VycmVudEZvY3VzZWRNZW51SXRlbSAmJiBldmVudC5rZXkgPT09IFwiRW50ZXJcIikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Rm9jdXNlZE1lbnVJdGVtLnZhbHVlLmVtaXRDb21tYW5kRXZlbnQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChldmVudCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5jbGlja2VkT3V0c2lkZVRoZURyb3Bkb3duV2hpbGVEcm9wZG93bklzVmlzaWJsZShldmVudCkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZXZlbnQpID0+IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMua2V5UHJlc3NlZE91dHNpZGVUaGVEcm9wZG93bldoaWxlRHJvcGRvd25Jc1Zpc2libGUoZXZlbnQpKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50LmtleSA9PSBcIkFycm93RG93blwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mb2N1c05leHRWaXNpYmxlSXRlbSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChldmVudC5rZXkgPT0gXCJBcnJvd1VwXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZm9jdXNQcmV2aW91c1Zpc2libGVJdGVtKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBzaG93KCk6IHZvaWQge1xyXG5cclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLmxlZnQgPSBcIjBcIjtcclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLnJpZ2h0ID0gXCJhdXRvXCI7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmRvZXNFbGVtZW50T3ZlcmZsb3dTY3JlZW4pIHtcclxuICAgICAgICAgICAgdGhpcy5odG1sRWxlbWVudC5zdHlsZS5sZWZ0ID0gXCJhdXRvXCI7XHJcbiAgICAgICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUucmlnaHQgPSBcIjBcIjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMucGFyZW50RHJvcGRvd25QYXJlbnRCdXR0b24/LnN2Z0ljb24/LnNldFVzZVRvKFwiaWNvbi13b3JkcHJlc3MtY2hldnJvbi11cFwiKTtcclxuICAgICAgICBzdXBlci5zaG93KCk7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIGhpZGUoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5wYXJlbnREcm9wZG93blBhcmVudEJ1dHRvbj8uc3ZnSWNvbj8uc2V0VXNlVG8oXCJpY29uLXdvcmRwcmVzcy1jaGV2cm9uLWRvd25cIik7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50Rm9jdXNlZE1lbnVJdGVtPy52YWx1ZS5yZW1vdmVGb2N1cygpO1xyXG4gICAgICAgIHRoaXMuY3VycmVudEZvY3VzZWRNZW51SXRlbSA9IG51bGw7XHJcbiAgICAgICAgc3VwZXIuaGlkZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHN3aXRjaFZpc3VhbEZvY3VzKGl0ZW06IEpOb2RlPElEcm9wZG93bk1lbnVJdGVtPik6IHZvaWQge1xyXG5cclxuICAgICAgICBpZiAodGhpcy5jdXJyZW50Rm9jdXNlZE1lbnVJdGVtID09IGl0ZW0pIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudEZvY3VzZWRNZW51SXRlbSkge1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRGb2N1c2VkTWVudUl0ZW0udmFsdWUucmVtb3ZlRm9jdXMoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuY3VycmVudEZvY3VzZWRNZW51SXRlbSA9IGl0ZW07XHJcbiAgICAgICAgdGhpcy5jdXJyZW50Rm9jdXNlZE1lbnVJdGVtLnZhbHVlLmZvY3VzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBmb2N1c05leHRWaXNpYmxlSXRlbSgpOiB2b2lkIHtcclxuXHJcbiAgICAgICAgbGV0IG5leHRWaXNpYmxlSXRlbTogSk5vZGU8SURyb3Bkb3duTWVudUl0ZW0+IHwgbnVsbDtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudEZvY3VzZWRNZW51SXRlbSkge1xyXG4gICAgICAgICAgICBuZXh0VmlzaWJsZUl0ZW0gPSB0aGlzLmN1cnJlbnRGb2N1c2VkTWVudUl0ZW0uZ2V0TmV4dFNhdGlzZnlpbmcoaXRlbSA9PiBpdGVtIGluc3RhbmNlb2YgRHJvcGRvd25NZW51TGlzdEl0ZW0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIG5leHRWaXNpYmxlSXRlbSA9IHRoaXMuZHJvcGRvd25JdGVtcy5maW5kRmlyc3QoaXRlbSA9PiBpdGVtIGluc3RhbmNlb2YgRHJvcGRvd25NZW51TGlzdEl0ZW0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5zd2l0Y2hWaXN1YWxGb2N1cyhuZXh0VmlzaWJsZUl0ZW0hKTtcclxuICAgIH1cclxuXHJcbiAgICBmb2N1c1ByZXZpb3VzVmlzaWJsZUl0ZW0oKTogdm9pZCB7XHJcblxyXG4gICAgICAgIGxldCBwcmV2aW91c1Zpc2libGVJdGVtOiBKTm9kZTxJRHJvcGRvd25NZW51SXRlbT4gfCBudWxsO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5jdXJyZW50Rm9jdXNlZE1lbnVJdGVtKSB7XHJcbiAgICAgICAgICAgIHByZXZpb3VzVmlzaWJsZUl0ZW0gPSB0aGlzLmN1cnJlbnRGb2N1c2VkTWVudUl0ZW0uZ2V0UHJldmlvdXNTYXRpc2Z5aW5nKGl0ZW0gPT4gaXRlbSBpbnN0YW5jZW9mIERyb3Bkb3duTWVudUxpc3RJdGVtKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBwcmV2aW91c1Zpc2libGVJdGVtID0gdGhpcy5kcm9wZG93bkl0ZW1zLmZpbmRGaXJzdChpdGVtID0+IGl0ZW0gaW5zdGFuY2VvZiBEcm9wZG93bk1lbnVMaXN0SXRlbSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnN3aXRjaFZpc3VhbEZvY3VzKHByZXZpb3VzVmlzaWJsZUl0ZW0hKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNsaWNrZWRPdXRzaWRlVGhlRHJvcGRvd25XaGlsZURyb3Bkb3duSXNWaXNpYmxlKGV2ZW50OiBNb3VzZUV2ZW50KTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FuSGlkZVxyXG4gICAgICAgICAgICAmJiAhKGV2ZW50LnRhcmdldCEgYXMgSFRNTEVsZW1lbnQpLmNsb3Nlc3QoYCMke3RoaXMuaHRtbEVsZW1lbnQuaWR9YClcclxuICAgICAgICAgICAgJiYgIShldmVudC50YXJnZXQhIGFzIEhUTUxFbGVtZW50KS5jbG9zZXN0KGAjJHt0aGlzLnBhcmVudERyb3Bkb3duUGFyZW50QnV0dG9uPy5odG1sRWxlbWVudC5pZH1gKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGtleVByZXNzZWRPdXRzaWRlVGhlRHJvcGRvd25XaGlsZURyb3Bkb3duSXNWaXNpYmxlKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FuSGlkZVxyXG4gICAgICAgICAgICAmJiAhKGV2ZW50LnRhcmdldCEgYXMgSFRNTEVsZW1lbnQpLmNsb3Nlc3QoYCMke3RoaXMuaHRtbEVsZW1lbnQuaWR9YClcclxuICAgICAgICAgICAgJiYgIShldmVudC50YXJnZXQhIGFzIEhUTUxFbGVtZW50KS5jbG9zZXN0KGAjJHt0aGlzLnBhcmVudERyb3Bkb3duUGFyZW50QnV0dG9uPy5odG1sRWxlbWVudC5pZH1gKTtcclxuICAgIH1cclxuXHJcbn0iLCJpbXBvcnQgeyBCYXNlVUlDb21wb25lbnQgfSBmcm9tIFwiLi4vLi4vY29tbW9uL0Jhc2VVSUNvbXBvbmVudFwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIEZsb2F0aW5nVG9vbGJhclNlcGFyYXRvciBleHRlbmRzIEJhc2VVSUNvbXBvbmVudCB7XHJcblxyXG4gICAgaWQ6IHN0cmluZztcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihpZDogc3RyaW5nKSB7XHJcbiAgICAgICAgc3VwZXIoe2lkOiBpZH0pO1xyXG5cclxuICAgICAgICB0aGlzLmlkID0gaWQ7XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdCgpOiBIVE1MRWxlbWVudCB7XHJcblxyXG4gICAgICAgIGNvbnN0IGh0bWxFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICBodG1sRWxlbWVudC5pZCA9IHRoaXMucHJvcHMuaWQ7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gXCIyNHB4XCI7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuc3R5bGUud2lkdGggPSBcIjFweFwiO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LnN0eWxlLmJvcmRlclJpZ2h0ID0gXCIxcHggc29saWQgI2QwZDBkMFwiO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LnN0eWxlLm1hcmdpbiA9IFwiYXV0byA2cHhcIjtcclxuXHJcbiAgICAgICAgcmV0dXJuIGh0bWxFbGVtZW50O1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgQmFzZVVJQ29tcG9uZW50IH0gZnJvbSBcIi4uLy4uL2NvbW1vbi9CYXNlVUlDb21wb25lbnRcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBCdXR0b25Hcm91cCBleHRlbmRzIEJhc2VVSUNvbXBvbmVudCB7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcblxyXG4gICAgICAgIHN1cGVyKHt9KTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0KCk6IEhUTUxFbGVtZW50IHtcclxuXHJcbiAgICAgICAgY29uc3QgaHRtbEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJpdGVtXCIpO1xyXG4gICAgICAgIC8vIGh0bWxFbGVtZW50LnN0eWxlLm1hcmdpbkxlZnQgPSBcIjEwcHhcIjtcclxuICAgICAgICAvLyBodG1sRWxlbWVudC5zdHlsZS5tYXJnaW5SaWdodCA9IFwiMTBweFwiO1xyXG5cclxuICAgICAgICByZXR1cm4gaHRtbEVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG59IiwiaW1wb3J0IHsgU1ZHSWNvbiB9IGZyb20gXCIuLi8uLi9jb21tb24vU1ZHSWNvblwiO1xuaW1wb3J0IHsgQmFzZVVJQ29tcG9uZW50IH0gZnJvbSBcIi4uLy4uL2NvbW1vbi9CYXNlVUlDb21wb25lbnRcIjtcbmltcG9ydCB7IENvbG9ycyB9IGZyb20gXCIuLi8uLi8uLi9jb21tb24vQ29sb3JzXCI7XG5pbXBvcnQgeyBDdXN0b21FdmVudHMgfSBmcm9tIFwiQC9jb21tb24vQ3VzdG9tRXZlbnRzXCI7XG5pbXBvcnQgeyBJQ29tbWFuZEV2ZW50RGV0YWlsIH0gZnJvbSBcIkAvY29tbWFuZHMvSUNvbW1hbmRFdmVudERldGFpbFwiO1xuaW1wb3J0IHsgQ29tbWFuZHMgfSBmcm9tIFwiQC9jb21tYW5kcy9Db21tYW5kc1wiO1xuaW1wb3J0IHsgQ3VzdG9tVUlFdmVudHMgfSBmcm9tIFwiQC9jb21tb24vQ3VzdG9tVUlFdmVudHNcIjtcbmltcG9ydCB7IElVSUV2ZW50RGV0YWlsIH0gZnJvbSBcIkAvY29tbWFuZHMvSVVJRXZlbnREZXRhaWxcIjtcbmltcG9ydCB7IENoYW5nZUNvbG9yIH0gZnJvbSBcIkAvY29tbWFuZHMvVUlBY3Rpb25zL0NoYW5nZUNvbG9yXCI7XG5cbmV4cG9ydCBjbGFzcyBCdXR0b25Hcm91cEl0ZW0gZXh0ZW5kcyBCYXNlVUlDb21wb25lbnQge1xuXG4gICAgcHJpdmF0ZSBpZDogc3RyaW5nO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgY29tbWFuZDogc3RyaW5nO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgc2hvd1VJOiBib29sZWFuO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgaWNvbjogU1ZHSWNvbjtcblxuICAgIGNvbnN0cnVjdG9yKGlkOiBzdHJpbmcsIGNvbW1hbmQ6IHN0cmluZywgdGl0bGU6IHN0cmluZywgaWNvbjogU1ZHSWNvbikge1xuXG4gICAgICAgIHN1cGVyKHtcbiAgICAgICAgICAgIGlkOiBpZCxcbiAgICAgICAgICAgIHRpdGxlOiB0aXRsZSxcbiAgICAgICAgICAgIGljb246IGljb25cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5pZCA9IGlkO1xuICAgICAgICB0aGlzLmNvbW1hbmQgPSBjb21tYW5kO1xuICAgICAgICB0aGlzLnNob3dVSSA9IGNvbW1hbmQgPT0gQ29tbWFuZHMudG9nZ2xlTGluaztcbiAgICAgICAgdGhpcy5pY29uID0gaWNvbjtcbiAgICAgICAgdGhpcy5hdHRhY2hFdmVudHMoKTtcbiAgICB9XG5cbiAgICBpbml0KCk6IEhUTUxFbGVtZW50IHtcblxuICAgICAgICBjb25zdCBodG1sRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIik7XG5cbiAgICAgICAgaHRtbEVsZW1lbnQuY2xhc3NMaXN0LmFkZChcImVudHJ5XCIsIFwiYnV0dG9uLXJlc2V0XCIsIFwidGV4dC1mb3JtYXR0aW5nLW9wZXJhdGlvblwiLCBcIm9wdGlvbi1ob3ZlclwiKTtcbiAgICAgICAgaHRtbEVsZW1lbnQudGl0bGUgPSB0aGlzLnByb3BzLnRpdGxlO1xuICAgICAgICBodG1sRWxlbWVudC50YWJJbmRleCA9IDE7XG5cbiAgICAgICAgaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5wcm9wcy5pY29uLmh0bWxFbGVtZW50KTtcblxuICAgICAgICByZXR1cm4gaHRtbEVsZW1lbnQ7XG4gICAgfVxuXG4gICAgYXR0YWNoRXZlbnRzKCk6IHZvaWQge1xuXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50PElDb21tYW5kRXZlbnREZXRhaWw+KEN1c3RvbUV2ZW50cy5lbWl0dGVkQ29tbWFuZCwge1xuICAgICAgICAgICAgICAgIGRldGFpbDoge1xuICAgICAgICAgICAgICAgICAgICBjb21tYW5kOiB0aGlzLmNvbW1hbmQsXG4gICAgICAgICAgICAgICAgICAgIHNob3dVSTogdGhpcy5zaG93VUksXG5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoQ3VzdG9tRXZlbnRzLnRleHRGb3JtYXRDaGFuZ2VkLCAoZXZlbnQ6IEV2ZW50KSA9PiB7XG5cbiAgICAgICAgLy8gICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gZXZlbnQgYXMgQ3VzdG9tRXZlbnQ8SUZvcm1hdENvbW1hbmQ+O1xuICAgICAgICAvLyAgICAgY29uc3Qgc3RhdGVzID0gY3VzdG9tRXZlbnQuZGV0YWlsO1xuXG4gICAgICAgIC8vICAgICBpZiAoc3RhdGVzW3RoaXMuY29tbWFuZCBhcyBrZXlvZiBJRm9ybWF0Q29tbWFuZF0pIHtcbiAgICAgICAgLy8gICAgICAgICB0aGlzLmljb24uY2hhbmdlQ29sb3IoQ29sb3JzLkljb25BY3RpdmVCbHVlKTtcbiAgICAgICAgLy8gICAgIH0gZWxzZSB7XG4gICAgICAgIC8vICAgICAgICAgdGhpcy5pY29uLmNoYW5nZUNvbG9yKENvbG9ycy5JY29uRGVmYXVsdEJsYWNrKTtcbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gfSk7XG5cbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihDdXN0b21VSUV2ZW50cy5Db2xvckNoYW5nZVJlcXVlc3QsIChldmVudDogRXZlbnQpID0+IHtcblxuICAgICAgICAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBldmVudCBhcyBDdXN0b21FdmVudDxJVUlFdmVudERldGFpbD47XG4gICAgICAgICAgICBjb25zdCBkZXRhaWxzID0gY3VzdG9tRXZlbnQuZGV0YWlsO1xuXG4gICAgICAgICAgICBpZih0aGlzLmlkID09IGRldGFpbHMudGFyZ2V0SWQpe1xuICAgICAgICAgICAgICAgIHRoaXMuaWNvbi5jaGFuZ2VDb2xvcigoZGV0YWlscy5hY3Rpb24gYXMgQ2hhbmdlQ29sb3IpLmNvbG9yKVxuXG4gICAgICAgICAgICAgICAgLy8gaWYgKGRldGFpbHNbdGhpcy5jb21tYW5kIGFzIGtleW9mIElGb3JtYXRDb21tYW5kXSkge1xuICAgICAgICAgICAgICAgIC8vICAgICB0aGlzLmljb24uY2hhbmdlQ29sb3IoQ29sb3JzLkljb25BY3RpdmVCbHVlKTtcbiAgICAgICAgICAgICAgICAvLyB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vICAgICB0aGlzLmljb24uY2hhbmdlQ29sb3IoQ29sb3JzLkljb25EZWZhdWx0QmxhY2spO1xuICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc3RhdGljIGNyZWF0ZShpZDogc3RyaW5nLCBjb21tYW5kOiBzdHJpbmcsIHRpdGxlOiBzdHJpbmcsIGljb246IFNWR0ljb24pOiBCdXR0b25Hcm91cEl0ZW0ge1xuICAgICAgICByZXR1cm4gbmV3IEJ1dHRvbkdyb3VwSXRlbShpZCwgY29tbWFuZCwgdGl0bGUsIGljb24pO1xuICAgIH1cbn0iLCJpbXBvcnQgeyBCYXNlVUlDb21wb25lbnQgfSBmcm9tIFwiLi4vLi4vY29tbW9uL0Jhc2VVSUNvbXBvbmVudFwiOztcclxuXHJcbmV4cG9ydCBjbGFzcyBDb2xvckljb24gZXh0ZW5kcyBCYXNlVUlDb21wb25lbnQge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGNvbG9yOiBzdHJpbmcpIHtcclxuICAgICAgICBzdXBlcih7XHJcbiAgICAgICAgICAgIGNvbG9yOiBjb2xvclxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXQoKTogSFRNTEVsZW1lbnQge1xyXG5cclxuICAgICAgICBjb25zdCBodG1sRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcblxyXG4gICAgICAgIGh0bWxFbGVtZW50LnN0eWxlLndpZHRoID0gXCIxLjI1cmVtXCI7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gXCIxLjI1cmVtXCI7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuc3R5bGUuYm9yZGVyUmFkaXVzID0gXCI1MCVcIjtcclxuICAgICAgICBodG1sRWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSB0aGlzLnByb3BzLmNvbG9yO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LnN0eWxlLmJvcmRlciA9IFwiMXB4IHNvbGlkICNkMGQwZDBcIjtcclxuICAgICAgICBodG1sRWxlbWVudC5zdHlsZS5ib3hTaXppbmcgPSBcImJvcmRlci1ib3hcIjtcclxuXHJcbiAgICAgICAgcmV0dXJuIGh0bWxFbGVtZW50O1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgU1ZHSWNvbiB9IGZyb20gXCIuLi8uLi9jb21tb24vU1ZHSWNvblwiO1xyXG5pbXBvcnQgeyBCYXNlVUlDb21wb25lbnQgfSBmcm9tIFwiLi4vLi4vY29tbW9uL0Jhc2VVSUNvbXBvbmVudFwiO1xyXG5pbXBvcnQgeyBEcm9wZG93bk1lbnVMaXN0IH0gZnJvbSBcIi4vRHJvcGRvd25NZW51TGlzdFwiO1xyXG5pbXBvcnQgeyBTaXplcyB9IGZyb20gXCJAL2NvbW1vbi9TaXplc1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIERyb3Bkb3duTWVudUJ1dHRvbiBleHRlbmRzIEJhc2VVSUNvbXBvbmVudCB7XHJcblxyXG4gICAgZHJvcGRvd25MaXN0OiBEcm9wZG93bk1lbnVMaXN0O1xyXG4gICAgc3ZnSWNvbj86IFNWR0ljb247XHJcblxyXG4gICAgY29uc3RydWN0b3IoaWQ6IHN0cmluZywgdGl0bGU6IHN0cmluZyB8IEhUTUxFbGVtZW50LCBkcm9wZG93bkxpc3Q6IERyb3Bkb3duTWVudUxpc3QsIGluY2x1ZGVDaGV2cm9uSWNvbjogYm9vbGVhbiA9IHRydWUpIHtcclxuXHJcbiAgICAgICAgY29uc3Qgc3ZnSWNvbiA9IG5ldyBTVkdJY29uKFwiaWNvbi13b3JkcHJlc3MtY2hldnJvbi1kb3duXCIsIFNpemVzLm1lZGl1bSk7XHJcblxyXG4gICAgICAgIHN1cGVyKHtcclxuICAgICAgICAgICAgaWQ6IGlkLFxyXG4gICAgICAgICAgICB0aXRsZTogdGl0bGUsXHJcbiAgICAgICAgICAgIGRyb3Bkb3duTGlzdDogZHJvcGRvd25MaXN0LFxyXG4gICAgICAgICAgICBzdmdJY29uOiBpbmNsdWRlQ2hldnJvbkljb24gPyBzdmdJY29uIDogbnVsbFxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmRyb3Bkb3duTGlzdCA9IGRyb3Bkb3duTGlzdDtcclxuICAgICAgICB0aGlzLnN2Z0ljb24gPSBzdmdJY29uO1xyXG4gICAgICAgIHRoaXMuYXR0YWNoRXZlbnRzKCk7XHJcblxyXG4gICAgICAgIGRyb3Bkb3duTGlzdC5zZXRQYXJlbnREcm9wZG93bk1lbnVCdXR0b24odGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdCgpOiBIVE1MRWxlbWVudCB7XHJcblxyXG4gICAgICAgIGNvbnN0IGh0bWxFbGVtZW50OiBIVE1MQnV0dG9uRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LmlkID0gdGhpcy5wcm9wcy5pZDtcclxuICAgICAgICAvLyBodG1sRWxlbWVudC50aXRsZSA9IHRoaXMucHJvcHMudGl0bGVcclxuICAgICAgICBodG1sRWxlbWVudC5yb2xlID0gXCJidXR0b25cIjtcclxuICAgICAgICBodG1sRWxlbWVudC5jbGFzc0xpc3QuYWRkKFwiYnV0dG9uLXJlc2V0XCIsIFwidGV4dC1mb3JtYXR0aW5nLXNlbGVjdC1idXR0b25cIiwgXCJ0ZXh0LWZvcm1hdHRpbmctb3BlcmF0aW9uXCIsIFwib3B0aW9uLWhvdmVyXCIpO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LnRhYkluZGV4ID0gMTtcclxuICAgICAgICBodG1sRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9IFwicmVsYXRpdmVcIjtcclxuICAgICAgICBodG1sRWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJhcmlhLWNvbnRyb2xzXCIsIHRoaXMucHJvcHMuZHJvcGRvd25MaXN0Lmh0bWxFbGVtZW50LmlkKTtcclxuXHJcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnByb3BzLnRpdGxlID09PSBcInN0cmluZ1wiKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XHJcbiAgICAgICAgICAgIHNwYW4udGV4dENvbnRlbnQgPSB0aGlzLnByb3BzLnRpdGxlO1xyXG4gICAgICAgICAgICBodG1sRWxlbWVudC5hcHBlbmRDaGlsZChzcGFuKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBodG1sRWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLnByb3BzLnRpdGxlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnByb3BzLnN2Z0ljb24pIHtcclxuICAgICAgICAgICAgaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5wcm9wcy5zdmdJY29uLmh0bWxFbGVtZW50KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBodG1sRWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICBhdHRhY2hFdmVudHMoKTogdm9pZCB7XHJcblxyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmRyb3Bkb3duTGlzdC5pc1Zpc2libGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZHJvcGRvd25MaXN0LnNob3coKTtcclxuICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRyb3Bkb3duTGlzdC5oaWRlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICB9XHJcblxyXG5cclxuICAgIGdldCBkaXNwbGF5KCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuICdibG9jayc7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBCYXNlVUlDb21wb25lbnQgfSBmcm9tIFwiLi4vLi4vY29tbW9uL0Jhc2VVSUNvbXBvbmVudFwiO1xyXG5pbXBvcnQgeyBEcm9wZG93bk1lbnVMaXN0IH0gZnJvbSBcIi4vRHJvcGRvd25NZW51TGlzdFwiO1xyXG5pbXBvcnQgeyBJRHJvcGRvd25NZW51SXRlbSB9IGZyb20gXCIuL0lEcm9wZG93bk1lbnVJdGVtXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgRHJvcGRvd25NZW51TGlzdEl0ZW1UaXRsZSBleHRlbmRzIEJhc2VVSUNvbXBvbmVudCBpbXBsZW1lbnRzIElEcm9wZG93bk1lbnVJdGVtIHtcclxuXHJcblxyXG4gICAgcGFyZW50RHJvcGRvd25NZW51TGlzdDogRHJvcGRvd25NZW51TGlzdDtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihwYXJlbnREcm9wZG93bk1lbnVMaXN0OiBEcm9wZG93bk1lbnVMaXN0LCB0aXRsZTogc3RyaW5nKSB7XHJcblxyXG4gICAgICAgIHN1cGVyKHtcclxuICAgICAgICAgICAgdGl0bGU6IHRpdGxlXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMucGFyZW50RHJvcGRvd25NZW51TGlzdCA9IHBhcmVudERyb3Bkb3duTWVudUxpc3Q7XHJcbiAgICB9XHJcbiAgICBjaGFuZ2VBY3RpdmVJY29uVG9WaXNpYmxlKCk6IHZvaWQge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGdldExlZnRJY29uQmFja2dyb3VuZENvbG9yKCk6IHN0cmluZyB8IG51bGwge1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHJlc2V0QWN0aXZlSWNvbigpOiB2b2lkIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBcclxuICAgIGF0dGFjaE9uTG9zZUZvY3VzKGZ1bmM6ICgpID0+IHZvaWQpOiB2b2lkIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNZXRob2Qgbm90IGltcGxlbWVudGVkLlwiKTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgYXR0YWNoT25Gb2N1cyhmdW5jOiAoKSA9PiB2b2lkKTogdm9pZCB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC5cIik7XHJcbiAgICB9XHJcblxyXG4gICAgZW1pdENvbW1hbmRFdmVudCgpOiB2b2lkIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNZXRob2Qgbm90IGltcGxlbWVudGVkLlwiKTtcclxuICAgIH1cclxuXHJcbiAgICByZW1vdmVGb2N1cygpOiB2b2lkIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNZXRob2Qgbm90IGltcGxlbWVudGVkLlwiKTtcclxuICAgIH1cclxuXHJcbiAgICBmb2N1cygpOiB2b2lkIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNZXRob2Qgbm90IGltcGxlbWVudGVkLlwiKTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0KCk6IEhUTUxFbGVtZW50IHtcclxuXHJcbiAgICAgICAgY29uc3QgaHRtbEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaScpO1xyXG5cclxuICAgICAgICBjb25zdCB0aXRsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2gzJyk7XHJcbiAgICAgICAgdGl0bGUuaW5uZXJUZXh0ID0gdGhpcy5wcm9wcy50aXRsZTtcclxuXHJcbiAgICAgICAgaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQodGl0bGUpO1xyXG5cclxuICAgICAgICByZXR1cm4gaHRtbEVsZW1lbnQ7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBDb21tYW5kcyB9IGZyb20gXCJAL2NvbW1hbmRzL0NvbW1hbmRzXCI7XG5pbXBvcnQgeyBJVGV4dE9wZXJhdGlvbnNTZXJ2aWNlIH0gZnJvbSBcIi4vSVRleHRPcGVyYXRpb25zU2VydmljZVwiO1xuaW1wb3J0IHsgVXRpbHMgfSBmcm9tIFwiQC91dGlsaXRpZXMvVXRpbHNcIjtcbmltcG9ydCB7IENvbG9ycyB9IGZyb20gXCJAL2NvbW1vbi9Db2xvcnNcIjtcbmltcG9ydCB7IElNZW1lbnRvIH0gZnJvbSBcIkAvY29yZS9JTWVtZW50b1wiO1xuaW1wb3J0IHsgRGVwZW5kZW5jeUNvbnRhaW5lciB9IGZyb20gXCJAL2NvcmUvRGVwZW5kZW5jeUNvbnRhaW5lclwiO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSBcIkAvY29tbWFuZHMvRXZlbnRFbWl0dGVyXCI7XG5pbXBvcnQgeyBCdXR0b25JRHMgfSBmcm9tIFwiQC9jb3JlL0J1dHRvbklEc1wiO1xuaW1wb3J0IHsgRHJvcGRvd25MaXN0SURzIH0gZnJvbSBcIkAvY29yZS9Ecm9wZG93bkxpc3RJRHNcIjtcblxudHlwZSBUYXJnZXROb2RlID0ge1xuICAgIG5vZGVUeXBlOiBzdHJpbmc7XG4gICAgY2xhc3Nlcz86IHN0cmluZ1tdO1xufTtcblxuZXhwb3J0IGNsYXNzIFRleHRPcGVyYXRpb25zU2VydmljZSBpbXBsZW1lbnRzIElUZXh0T3BlcmF0aW9uc1NlcnZpY2Uge1xuXG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IFRleHRPcGVyYXRpb25zU2VydmljZTtcblxuICAgIHByaXZhdGUgbWVtZW50bzogSU1lbWVudG87XG5cbiAgICB0ZXh0T3BlcmF0aW9uU2VydmljZTogYW55O1xuXG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihtZW1lbnRvOiBJTWVtZW50bykge1xuICAgICAgICBpZiAoVGV4dE9wZXJhdGlvbnNTZXJ2aWNlLmluc3RhbmNlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVc2UgVGV4dE9wZXJhdGlvblNlcnZpY2UuZ2V0SW5zdGFuY2UoKSB0byBnZXQgaW5zdGFuY2UuXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5tZW1lbnRvID0gbWVtZW50bztcbiAgICAgICAgdGhpcy5hdHRhY2hFdmVudHMoKTtcblxuICAgIH1cblxuICAgIC8vVE9ETzogbW92ZSB0aGlzIHRvIHRleHRDb250ZW50RmxvYXRpbmdUb29sYmFyXG4gICAgYXR0YWNoRXZlbnRzKCk6IHZvaWQge1xuICAgICAgICAvLyBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKERlZmF1bHRKU0V2ZW50cy5TZWxlY3Rpb25DaGFuZ2UsIHRoaXMuaGFuZGxlU2VsZWN0aW9uQ2hhbmdlLmJpbmQodGhpcykpO1xuICAgIH1cblxuICAgIC8vIGhhbmRsZVNlbGVjdGlvbkNoYW5nZSgpIHtcblxuICAgIC8vICAgICBjb25zdCBib2xkOiBib29sZWFuID0gZG9jdW1lbnQucXVlcnlDb21tYW5kU3RhdGUoJ2JvbGQnKTtcbiAgICAvLyAgICAgY29uc3QgaXRhbGljOiBib29sZWFuID0gZG9jdW1lbnQucXVlcnlDb21tYW5kU3RhdGUoJ2l0YWxpYycpO1xuICAgIC8vICAgICBjb25zdCB1bmRlcmxpbmU6IGJvb2xlYW4gPSBkb2N1bWVudC5xdWVyeUNvbW1hbmRTdGF0ZSgndW5kZXJsaW5lJyk7XG4gICAgLy8gICAgIGNvbnN0IHN0cmlrZVRocm91Z2g6IGJvb2xlYW4gPSBkb2N1bWVudC5xdWVyeUNvbW1hbmRTdGF0ZSgnc3RyaWtlVGhyb3VnaCcpO1xuXG4gICAgLy8gICAgIGNvbnN0IGhpbGl0ZUNvbG9yOiB7IFtrZXk6IHN0cmluZ106IGJvb2xlYW4gfSA9IHt9O1xuICAgIC8vICAgICBoaWxpdGVDb2xvcltDb2xvcnMuSGlsaXRlQ29sb3JSZWRdID0gdGhpcy5xdWVyeUhpbGl0ZUNvbG9yKENvbG9ycy5IaWxpdGVDb2xvclJlZCk7XG4gICAgLy8gICAgIGhpbGl0ZUNvbG9yW0NvbG9ycy5IaWxpdGVDb2xvckdyZWVuXSA9IHRoaXMucXVlcnlIaWxpdGVDb2xvcihDb2xvcnMuSGlsaXRlQ29sb3JHcmVlbik7XG4gICAgLy8gICAgIGhpbGl0ZUNvbG9yW0NvbG9ycy5IaWxpdGVDb2xvckJsdWVdID0gdGhpcy5xdWVyeUhpbGl0ZUNvbG9yKENvbG9ycy5IaWxpdGVDb2xvckJsdWUpO1xuICAgIC8vICAgICBoaWxpdGVDb2xvcltDb2xvcnMuSGlsaXRlQ29sb3JZZWxsb3ddID0gdGhpcy5xdWVyeUhpbGl0ZUNvbG9yKENvbG9ycy5IaWxpdGVDb2xvclllbGxvdyk7XG4gICAgLy8gICAgIGhpbGl0ZUNvbG9yW0NvbG9ycy5IaWxpdGVDb2xvckdyZXldID0gdGhpcy5xdWVyeUhpbGl0ZUNvbG9yKENvbG9ycy5IaWxpdGVDb2xvckdyZXkpO1xuXG4gICAgLy8gICAgIGNvbnN0IGZvcmVDb2xvcjogeyBba2V5OiBzdHJpbmddOiBib29sZWFuIH0gPSB7fTtcbiAgICAvLyAgICAgZm9yZUNvbG9yW0NvbG9ycy5Gb3JlQ29sb3JSZWRdID0gdGhpcy5xdWVyeUhpbGl0ZUNvbG9yKENvbG9ycy5Gb3JlQ29sb3JSZWQpO1xuICAgIC8vICAgICBmb3JlQ29sb3JbQ29sb3JzLkZvcmVDb2xvckdyZWVuXSA9IHRoaXMucXVlcnlIaWxpdGVDb2xvcihDb2xvcnMuRm9yZUNvbG9yR3JlZW4pO1xuICAgIC8vICAgICBmb3JlQ29sb3JbQ29sb3JzLkZvcmVDb2xvckJsdWVdID0gdGhpcy5xdWVyeUhpbGl0ZUNvbG9yKENvbG9ycy5Gb3JlQ29sb3JCbHVlKTtcbiAgICAvLyAgICAgZm9yZUNvbG9yW0NvbG9ycy5Gb3JlQ29sb3JZZWxsb3ddID0gdGhpcy5xdWVyeUhpbGl0ZUNvbG9yKENvbG9ycy5Gb3JlQ29sb3JZZWxsb3cpO1xuICAgIC8vICAgICBmb3JlQ29sb3JbQ29sb3JzLkZvcmVDb2xvckdyZXldID0gdGhpcy5xdWVyeUhpbGl0ZUNvbG9yKENvbG9ycy5Gb3JlQ29sb3JHcmV5KTtcblxuICAgIC8vICAgICAvLyBFdmVudEVtaXR0ZXIuZW1pdEZvcm1hdENoYW5nZUV2ZW50KGJvbGQsIGl0YWxpYywgdW5kZXJsaW5lLCBzdHJpa2VUaHJvdWdoLCBoaWxpdGVDb2xvciwgZm9yZUNvbG9yKTtcbiAgICAvLyB9XG5cbiAgICBzdGF0aWMgZ2V0SW5zdGFuY2UoKTogVGV4dE9wZXJhdGlvbnNTZXJ2aWNlIHtcblxuICAgICAgICBjb25zdCBtZW1lbnRvID0gRGVwZW5kZW5jeUNvbnRhaW5lci5JbnN0YW5jZS5yZXNvbHZlPElNZW1lbnRvPihcIklNZW1lbnRvXCIpO1xuXG4gICAgICAgIGlmICghdGhpcy5pbnN0YW5jZSkge1xuICAgICAgICAgICAgdGhpcy5pbnN0YW5jZSA9IG5ldyBUZXh0T3BlcmF0aW9uc1NlcnZpY2UobWVtZW50byk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5pbnN0YW5jZTtcbiAgICB9XG5cblxuXG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgdGhlICdib2xkJyBjb21tYW5kIGJ5IHRvZ2dsaW5nIGJvbGQgc3R5bGUgb24gdGhlIHNlbGVjdGVkIHRleHQuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIGNvbW1hbmQgd2FzIGV4ZWN1dGVkIHN1Y2Nlc3NmdWxseS5cbiAgICAgKi9cbiAgICBleGVjQm9sZCgpOiB2b2lkIHtcblxuICAgICAgICB0aGlzLm1lbWVudG8uc2F2ZVN0YXRlKCk7XG5cbiAgICAgICAgaWYgKGRvY3VtZW50LmV4ZWNDb21tYW5kKFwiYm9sZFwiKSkge1xuICAgICAgICAgICAgRXZlbnRFbWl0dGVyLmVtaXRDaGFuZ2VDb21wb25lbnRDb2xvckV2ZW50KEJ1dHRvbklEcy5Cb2xkLCBDb2xvcnMuSWNvbkFjdGl2ZUJsdWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZXhlY0l0YWxpYygpOiB2b2lkIHtcblxuICAgICAgICB0aGlzLm1lbWVudG8uc2F2ZVN0YXRlKCk7XG5cbiAgICAgICAgaWYgKGRvY3VtZW50LmV4ZWNDb21tYW5kKFwiaXRhbGljXCIpKSB7XG4gICAgICAgICAgICBFdmVudEVtaXR0ZXIuZW1pdENoYW5nZUNvbXBvbmVudENvbG9yRXZlbnQoQnV0dG9uSURzLkl0YWxpYywgQ29sb3JzLkljb25BY3RpdmVCbHVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGV4ZWNTdHJpa2VUaHJvdWdoKCk6IHZvaWQge1xuXG4gICAgICAgIHRoaXMubWVtZW50by5zYXZlU3RhdGUoKTtcblxuICAgICAgICBpZiAoZG9jdW1lbnQuZXhlY0NvbW1hbmQoXCJzdHJpa2VUaHJvdWdoXCIpKSB7XG4gICAgICAgICAgICBFdmVudEVtaXR0ZXIuZW1pdENoYW5nZUNvbXBvbmVudENvbG9yRXZlbnQoQnV0dG9uSURzLlN0cmlrZXRocm91Z2gsIENvbG9ycy5JY29uQWN0aXZlQmx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBleGVjVW5kZXJsaW5lKCk6IHZvaWQge1xuICAgICAgICB0aGlzLm1lbWVudG8uc2F2ZVN0YXRlKCk7XG5cbiAgICAgICAgaWYgKGRvY3VtZW50LmV4ZWNDb21tYW5kKFwidW5kZXJsaW5lXCIpKSB7XG4gICAgICAgICAgICBFdmVudEVtaXR0ZXIuZW1pdENoYW5nZUNvbXBvbmVudENvbG9yRXZlbnQoQnV0dG9uSURzLlVuZGVybGluZSwgQ29sb3JzLkljb25BY3RpdmVCbHVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGV4ZWNIaWxpdGVDb2xvcih2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG5cbiAgICAgICAgdGhpcy5tZW1lbnRvLnNhdmVTdGF0ZSgpO1xuXG4gICAgICAgIEV2ZW50RW1pdHRlci5lbWl0UmVzZXRBY3RpdmVCdXR0b25zRWxlbWVudEV2ZW50KFwiaGlsaXRlQ29sb3JcIik7XG5cbiAgICAgICAgaWYgKGRvY3VtZW50LmV4ZWNDb21tYW5kKFwiaGlsaXRlQ29sb3JcIiwgZmFsc2UsIHZhbHVlKSkge1xuICAgICAgICAgICAgRXZlbnRFbWl0dGVyLmVtaXRTaG93SGlkZUFjdGl2ZUVsZW1lbnRFdmVudChcImhpbGl0ZUNvbG9yXCIsIHZhbHVlLCBcInNob3dcIik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBleGVjRm9yZUNvbG9yKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcblxuICAgICAgICB0aGlzLm1lbWVudG8uc2F2ZVN0YXRlKCk7XG5cbiAgICAgICAgRXZlbnRFbWl0dGVyLmVtaXRSZXNldEFjdGl2ZUJ1dHRvbnNFbGVtZW50RXZlbnQoXCJmb3JlQ29sb3JcIik7XG5cbiAgICAgICAgaWYgKGRvY3VtZW50LmV4ZWNDb21tYW5kKFwiZm9yZUNvbG9yXCIsIGZhbHNlLCB2YWx1ZSkpIHtcbiAgICAgICAgICAgIEV2ZW50RW1pdHRlci5lbWl0U2hvd0hpZGVBY3RpdmVFbGVtZW50RXZlbnQoXCJmb3JlQ29sb3JcIiwgdmFsdWUsIFwic2hvd1wiKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGV4ZWNDb21tYW5kKGNvbW1hbmQ6IHN0cmluZywgc2hvd1VpOiBib29sZWFuLCB2YWx1ZTogc3RyaW5nIHwgbnVsbCk6IGJvb2xlYW4ge1xuXG4gICAgICAgIC8vIGlmIChjb21tYW5kID09IFRleHRPcGVyYXRpb25TZXJ2aWNlLlFVRVJZX1RFWFRfT1BFUkFUSU9OUy5JTkxJTkVfQ09ERSkge1xuICAgICAgICAvLyAgICAgdGhpcy50b2dnbGVDb2RlRXhlY0NvbW1hbmQoKTtcbiAgICAgICAgLy8gICAgIHJldHVybiB0cnVlO1xuICAgICAgICAvLyB9XG5cbiAgICAgICAgLy8gbGV0IHY6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHZhbHVlIHx8IHVuZGVmaW5lZDtcblxuICAgICAgICAvLyBpZiAodiA9PSBcImluaXRpYWxcIikge1xuICAgICAgICAvLyAgICAgdiA9IHRoaXMuZ2V0SW5pdGlhbENvbG9yQXNIZXgoKTtcbiAgICAgICAgLy8gfVxuXG4gICAgICAgIC8vIGlmIChjb21tYW5kID09IFRleHRPcGVyYXRpb25TZXJ2aWNlLlFVRVJZX1RFWFRfT1BFUkFUSU9OUy5DUkVBVEVfTElOSykge1xuXG4gICAgICAgIC8vICAgICBjb25zdCBlbGVtZW50ID0gVGV4dE9wZXJhdGlvblNlcnZpY2UuZ2V0U2VsZWN0ZWRIVE1MRWxlbWVudCgpO1xuXG4gICAgICAgIC8vICAgICBpZiAoZWxlbWVudD8uY2xvc2VzdChcImFcIikpIHtcbiAgICAgICAgLy8gICAgICAgICByZXR1cm4gZG9jdW1lbnQuZXhlY0NvbW1hbmQoXCJ1bmxpbmtcIiwgZmFsc2UsIHYpO1xuICAgICAgICAvLyAgICAgfVxuXG4gICAgICAgIC8vICAgICBpZiAoc2hvd1VpKSB7XG5cbiAgICAgICAgLy8gICAgICAgICBjb25zdCBzaG93SW5wdXRMaW5rQm94ID0gbmV3IEN1c3RvbUV2ZW50KCdzaG93SW5wdXRMaW5rQm94UmVxdWVzdGVkJywge1xuICAgICAgICAvLyAgICAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAvLyAgICAgICAgICAgICBjYW5jZWxhYmxlOiB0cnVlXG4gICAgICAgIC8vICAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHNob3dJbnB1dExpbmtCb3gpO1xuXG4gICAgICAgIC8vICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIC8vICAgICB9XG4gICAgICAgIC8vIH1cblxuICAgICAgICAvLyBpZiAoY29tbWFuZCA9PSBUZXh0T3BlcmF0aW9uU2VydmljZS5RVUVSWV9URVhUX09QRVJBVElPTlMuSElMSVRFX0NPTE9SIHx8XG4gICAgICAgIC8vICAgICBjb21tYW5kID09IFRleHRPcGVyYXRpb25TZXJ2aWNlLlFVRVJZX1RFWFRfT1BFUkFUSU9OUy5GT1JFX0NPTE9SKSB7XG5cbiAgICAgICAgLy8gICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKGNvbW1hbmQsIGZhbHNlLCB2KTtcblxuICAgICAgICAvLyAgICAgY29uc3Qgc2hvd0lucHV0TGlua0JveCA9IG5ldyBDdXN0b21FdmVudCgnY29sb3JDaGFuZ2UnLCB7XG4gICAgICAgIC8vICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgLy8gICAgICAgICBjYW5jZWxhYmxlOiB0cnVlXG4gICAgICAgIC8vICAgICB9KTtcblxuICAgICAgICAvLyAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChzaG93SW5wdXRMaW5rQm94KTtcbiAgICAgICAgLy8gfVxuXG4gICAgICAgIC8vIHJldHVybiBkb2N1bWVudC5leGVjQ29tbWFuZChjb21tYW5kLCBmYWxzZSwgdik7XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHF1ZXJ5Q29tbWFuZFN0YXRlKGNvbW1hbmQ6IHN0cmluZywgdmFsdWU6IHN0cmluZyB8IG51bGwpOiBQcm9taXNlPGJvb2xlYW4+IHtcblxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXG4gICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjb21tYW5kID09PSBDb21tYW5kcy50b2dnbGVMaW5rKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUodGhpcy5xdWVyeUFuY2hvcigpKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChjb21tYW5kID09PSBDb21tYW5kcy50b2dnbGVVbmRlcmxpbmUpIHtcblxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5xdWVyeUFuY2hvcigpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChjb21tYW5kID09PSBDb21tYW5kcy50b2dnbGVIaWxpdGVDb2xvcikge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRoaXMucXVlcnlIaWxpdGVDb2xvcih2YWx1ZSEpKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChjb21tYW5kID09PSBDb21tYW5kcy50b2dnbGVGb3JlQ29sb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh0aGlzLnF1ZXJ5Rm9yZUNvbG9yKHZhbHVlISkpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmVzb2x2ZShkb2N1bWVudC5xdWVyeUNvbW1hbmRTdGF0ZShjb21tYW5kKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuXG4gICAgcXVlcnlDb21tYW5kU3RhdGVBKGNvbW1hbmQ6IHN0cmluZywgdmFsdWU6IHN0cmluZyB8IG51bGwpOiBib29sZWFuIHtcblxuICAgICAgICBpZiAoY29tbWFuZCA9PT0gQ29tbWFuZHMudG9nZ2xlTGluaykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucXVlcnlBbmNob3IoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb21tYW5kID09PSBDb21tYW5kcy50b2dnbGVVbmRlcmxpbmUpIHtcblxuICAgICAgICAgICAgaWYgKHRoaXMucXVlcnlBbmNob3IoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAhdGhpcy5xdWVyeUFuY2hvcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbW1hbmQgPT09IENvbW1hbmRzLnRvZ2dsZUhpbGl0ZUNvbG9yKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5xdWVyeUhpbGl0ZUNvbG9yKHZhbHVlISk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29tbWFuZCA9PT0gQ29tbWFuZHMudG9nZ2xlRm9yZUNvbG9yKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5xdWVyeUZvcmVDb2xvcih2YWx1ZSEpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5Q29tbWFuZFN0YXRlKGNvbW1hbmQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgdG9nZ2xlQ29kZUV4ZWNDb21tYW5kKCkge1xuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gICAgICAgIGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAwKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcbiAgICAgICAgbGV0IGNvbnRhaW5lck5vZGU6IE5vZGUgfCBudWxsID0gcmFuZ2UuY29tbW9uQW5jZXN0b3JDb250YWluZXI7XG5cbiAgICAgICAgd2hpbGUgKGNvbnRhaW5lck5vZGUgJiYgY29udGFpbmVyTm9kZS5ub2RlTmFtZSAhPT0gJ0NPREUnKSB7XG4gICAgICAgICAgICBjb250YWluZXJOb2RlID0gY29udGFpbmVyTm9kZS5wYXJlbnROb2RlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbnRhaW5lck5vZGUgJiYgY29udGFpbmVyTm9kZS5ub2RlTmFtZSA9PT0gJ0NPREUnKSB7XG4gICAgICAgICAgICBjb25zdCBjb2RlRWxlbWVudCA9IGNvbnRhaW5lck5vZGUgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICBjb25zdCByYW5nZU9mQ29kZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG4gICAgICAgICAgICByYW5nZU9mQ29kZS5zZWxlY3ROb2RlQ29udGVudHMoY29kZUVsZW1lbnQpO1xuXG4gICAgICAgICAgICBpZiAocmFuZ2UudG9TdHJpbmcoKSA9PT0gcmFuZ2VPZkNvZGUudG9TdHJpbmcoKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudDogTm9kZSB8IG51bGwgPSBjb2RlRWxlbWVudC5wYXJlbnROb2RlO1xuICAgICAgICAgICAgICAgIHdoaWxlIChwYXJlbnQgJiYgY29kZUVsZW1lbnQuZmlyc3RDaGlsZCkge1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKGNvZGVFbGVtZW50LmZpcnN0Q2hpbGQsIGNvZGVFbGVtZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcGFyZW50Py5yZW1vdmVDaGlsZChjb2RlRWxlbWVudCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRleHRDb250ZW50ID0gcmFuZ2UudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5leGVjQ29tbWFuZCgnaW5zZXJ0SFRNTCcsIGZhbHNlLCB0ZXh0Q29udGVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkb2N1bWVudC5nZXRTZWxlY3Rpb24oKT8ucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50QXNTdHJpbmcgPSBuZXcgWE1MU2VyaWFsaXplcigpLnNlcmlhbGl6ZVRvU3RyaW5nKHJhbmdlLmNsb25lQ29udGVudHMoKSk7XG4gICAgICAgICAgICBkb2N1bWVudC5leGVjQ29tbWFuZCgnaW5zZXJ0SFRNTCcsIGZhbHNlLCBgPGNvZGU+JHtjb250ZW50QXNTdHJpbmd9PC9jb2RlPmApO1xuICAgICAgICB9XG4gICAgfVxuXG5cblxuXG5cbiAgICAvKipcbiAgICAqIENoZWNrcyBpZiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHRleHQgaGFzIHRoZSBzcGVjaWZpZWQgZm9yZWdyb3VuZCAodGV4dCkgY29sb3IuXG4gICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGNydWNpYWwgaW4gZW52aXJvbm1lbnRzIHdoZXJlIHRleHQgY29sb3IgZm9ybWF0dGluZyBpcyBtb25pdG9yZWQgb3IgbmVlZHMgdmVyaWZpY2F0aW9uLFxuICAgICogc3VjaCBhcyBpbiBhIHJpY2ggdGV4dCBlZGl0b3IuIEl0IGRldGVybWluZXMgd2hldGhlciB0aGUgc2VsZWN0ZWQgdGV4dCdzIGNvbG9yIG1hdGNoZXMgYW4gZXhwZWN0ZWQgaGV4YWRlY2ltYWwgY29sb3IgdmFsdWUuXG4gICAgKlxuICAgICogQHBhcmFtIHtzdHJpbmd9IGV4cGVjdGVkQ29sb3IgLSBUaGUgZXhwZWN0ZWQgdGV4dCBjb2xvciBpbiBoZXhhZGVjaW1hbCBmb3JtYXQgKGUuZy4sIFwiI0ZGRkZGRlwiKSB0byBjaGVjayBhZ2FpbnN0IHRoZSBzZWxlY3Rpb24uXG4gICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIHRoZSBzZWxlY3RlZCB0ZXh0J3MgY29sb3IgbWF0Y2hlcyB0aGUgZXhwZWN0ZWQgY29sb3IsIG90aGVyd2lzZSBmYWxzZS5cbiAgICAqXG4gICAgKiBAZXhhbXBsZVxuICAgICogLy8gVG8gdmVyaWZ5IGlmIHRoZSBzZWxlY3RlZCB0ZXh0IGhhcyBhIGJsdWUgdGV4dCBjb2xvcjpcbiAgICAqIGNvbnN0IGhhc0JsdWVUZXh0Q29sb3IgPSBxdWVyeUZvcmVDb2xvcihcIiMwMDAwRkZcIik7XG4gICAgKiBjb25zb2xlLmxvZygnU2VsZWN0ZWQgdGV4dCBoYXMgYmx1ZSB0ZXh0IGNvbG9yOicsIGhhc0JsdWVUZXh0Q29sb3IpO1xuICAgICpcbiAgICAqIEBkZXNjcmlwdGlvblxuICAgICogVGhlIGZ1bmN0aW9uIG9wZXJhdGVzIGFzIGZvbGxvd3M6XG4gICAgKiAxLiBSZXRyaWV2ZXMgdGhlIGN1cnJlbnQgdGV4dCBzZWxlY3Rpb24gdXNpbmcgYHdpbmRvdy5nZXRTZWxlY3Rpb24oKWAuXG4gICAgKiAyLiBWYWxpZGF0ZXMgdGhhdCB0aGVyZSBpcyBhIHNlbGVjdGlvbiBhbmQgdGhhdCBpdCBpbmNsdWRlcyBhdCBsZWFzdCBvbmUgcmFuZ2UuXG4gICAgKiAzLiBJZGVudGlmaWVzIHRoZSBtb3N0IGRlZXBseSBuZXN0ZWQgbm9kZSB0aGF0IGNvbnRhaW5zIHRoZSBzZWxlY3Rpb24sIGFkanVzdGluZyBmb3IgdGV4dCBub2RlcyBieSBtb3ZpbmcgdG8gdGhlaXIgcGFyZW50IG5vZGUuXG4gICAgKiA0LiBTZWFyY2hlcyBmb3IgdGhlIG5lYXJlc3QgYW5jZXN0b3IgYGZvbnRgIGVsZW1lbnQgd2l0aCBhbiBleHBsaWNpdCBgY29sb3JgIGF0dHJpYnV0ZSwgaW50ZW5kZWQgdG8gZGlyZWN0bHkgaW5mbHVlbmNlIHRoZSB0ZXh0IGNvbG9yLlxuICAgICogNS4gSWYgc3VjaCBhbiBlbGVtZW50IGlzIGZvdW5kLCBjb21wdXRlcyB0aGUgYWN0dWFsIGNvbG9yIGluIFJHQiBmb3JtYXQgdXNpbmcgY29tcHV0ZWQgc3R5bGVzIGFuZCBjb252ZXJ0cyBpdCB0byBoZXhhZGVjaW1hbC5cbiAgICAqIDYuIENvbXBhcmVzIHRoZSBjb252ZXJ0ZWQgaGV4YWRlY2ltYWwgY29sb3IgdG8gdGhlIGBleHBlY3RlZENvbG9yYCwgYWRqdXN0aW5nIGZvciBjYXNlIHNlbnNpdGl2aXR5LlxuICAgICogNy4gUmV0dXJucyB0cnVlIGlmIHRoZSBjb2xvcnMgbWF0Y2gsIGZhbHNlIG90aGVyd2lzZS5cbiAgICAqL1xuICAgIHF1ZXJ5Rm9yZUNvbG9yKGV4cGVjdGVkQ29sb3I6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG5cbiAgICAgICAgaWYgKCFzZWxlY3Rpb24pIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXNlbGVjdGlvbi5yYW5nZUNvdW50KSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgbGV0IGVsZW1lbnQ6IE5vZGUgfCBudWxsID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCkuY29tbW9uQW5jZXN0b3JDb250YWluZXI7XG5cbiAgICAgICAgaWYgKGVsZW1lbnQubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgICAgICAgICBlbGVtZW50ID0gZWxlbWVudC5wYXJlbnROb2RlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZm9udENvbG9yID0gKGVsZW1lbnQgYXMgSFRNTEVsZW1lbnQpLmNsb3Nlc3QoXCJmb250W2NvbG9yXVwiKTtcbiAgICAgICAgaWYgKCFmb250Q29sb3IpIHJldHVybiBmYWxzZTtcblxuICAgICAgICBjb25zdCBzdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGZvbnRDb2xvcik7XG4gICAgICAgIGNvbnN0IHJnYkNvbG9yID0gc3R5bGUuY29sb3I7XG5cbiAgICAgICAgY29uc3QgaGV4Q29sb3IgPSBVdGlscy5yZ2JUb0hleChyZ2JDb2xvcik7XG5cbiAgICAgICAgcmV0dXJuIGhleENvbG9yLnRvVXBwZXJDYXNlKCkgPT09IGV4cGVjdGVkQ29sb3IudG9VcHBlckNhc2UoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHF1ZXJ5QW5jaG9yKCk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gICAgICAgIGlmICghc2VsZWN0aW9uIHx8ICFzZWxlY3Rpb24ucmFuZ2VDb3VudCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGxldCBub2RlOiBOb2RlIHwgbnVsbCA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyO1xuXG4gICAgICAgIC8vIFNlIG8gbm9kZSDDqSB1bSBuw7MgZGUgdGV4dG8sIGNvbWXDp2Ftb3MgYSB2ZXJpZmljYXIgYSBwYXJ0aXIgZGUgc2V1IG7DsyBwYWkuXG4gICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xuICAgICAgICAgICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFZlcmlmaWNhIHNlIG8gbsOzIG91IHVtIGFzY2VuZGVudGUgYXTDqSBvIGVsZW1lbnRvIGVkaXTDoXZlbCDDqSB1bSBsaW5rLlxuICAgICAgICB3aGlsZSAobm9kZSAmJiBub2RlICE9PSBudWxsKSB7IC8vICd0aGlzLmVkaXRvckVsZW1lbnQnIGRldmUgc2VyIG8gZWxlbWVudG8gPHA+XG4gICAgICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PSBOb2RlLkVMRU1FTlRfTk9ERSAmJiAobm9kZSBhcyBIVE1MRWxlbWVudCkuY2xvc2VzdCgnYScpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgKiBDaGVja3MgaWYgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCB0ZXh0IGhhcyB0aGUgc3BlY2lmaWVkIGJhY2tncm91bmQgY29sb3IuXG4gICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGRlc2lnbmVkIHRvIHZlcmlmeSB0aGUgcHJlc2VuY2Ugb2YgYSBzcGVjaWZpYyBiYWNrZ3JvdW5kIGNvbG9yIGluIHRoZSB0ZXh0IHNlbGVjdGlvbixcbiAgICAqIHdoaWNoIGNhbiBiZSB1c2VmdWwgaW4gdGV4dCBlZGl0aW5nIGVudmlyb25tZW50cyB3aGVyZSBiYWNrZ3JvdW5kIGNvbG9yIGZvcm1hdHRpbmcgbmVlZHMgdG8gYmUgdHJhY2tlZCBvciB2ZXJpZmllZC5cbiAgICAqXG4gICAgKiBAcGFyYW0ge3N0cmluZ30gZXhwZWN0ZWRDb2xvciAtIFRoZSBleHBlY3RlZCBiYWNrZ3JvdW5kIGNvbG9yIGluIGhleGFkZWNpbWFsIGZvcm1hdCAoZS5nLiwgXCIjRkZGRkZGXCIpIHRvIGNoZWNrIGFnYWluc3QgdGhlIHNlbGVjdGlvbi5cbiAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIHRydWUgaWYgdGhlIHNlbGVjdGVkIHRleHQncyBiYWNrZ3JvdW5kIGNvbG9yIG1hdGNoZXMgdGhlIGV4cGVjdGVkIGNvbG9yLCBvdGhlcndpc2UgZmFsc2UuXG4gICAgKlxuICAgICogQGV4YW1wbGVcbiAgICAqIC8vIFRvIGNoZWNrIGlmIHRoZSBzZWxlY3RlZCB0ZXh0IGhhcyBhIHJlZCBiYWNrZ3JvdW5kIGNvbG9yOlxuICAgICogY29uc3QgaGFzUmVkQmFja2dyb3VuZCA9IHF1ZXJ5SGlsaXRlQ29sb3IoXCIjRkYwMDAwXCIpO1xuICAgICogY29uc29sZS5sb2coJ1NlbGVjdGVkIHRleHQgaGFzIHJlZCBiYWNrZ3JvdW5kOicsIGhhc1JlZEJhY2tncm91bmQpO1xuICAgICpcbiAgICAqIEBkZXNjcmlwdGlvblxuICAgICogVGhlIGZ1bmN0aW9uIG9wZXJhdGVzIGFzIGZvbGxvd3M6XG4gICAgKiAxLiBSZXRyaWV2ZXMgdGhlIGN1cnJlbnQgdGV4dCBzZWxlY3Rpb24gdXNpbmcgYHdpbmRvdy5nZXRTZWxlY3Rpb24oKWAuXG4gICAgKiAyLiBDaGVja3MgaWYgdGhlcmUgaXMgYSBzZWxlY3Rpb24gYW5kIGlmIGl0IGluY2x1ZGVzIGF0IGxlYXN0IG9uZSByYW5nZS5cbiAgICAqIDMuIElkZW50aWZpZXMgdGhlIG1vc3QgZGVlcGx5IG5lc3RlZCBub2RlIHRoYXQgY29udGFpbnMgdGhlIHNlbGVjdGlvbiwgYWRqdXN0aW5nIGZvciB0ZXh0IG5vZGVzIGJ5IHN0ZXBwaW5nIHVwIHRvIHRoZWlyIHBhcmVudCBub2RlLlxuICAgICogNC4gU2VhcmNoZXMgZm9yIHRoZSBuZWFyZXN0IGFuY2VzdG9yIGBzcGFuYCBvciBgZm9udGAgZWxlbWVudCB0aGF0IGV4cGxpY2l0bHkgaGFzIGEgYGJhY2tncm91bmQtY29sb3JgIHN0eWxlIGFwcGxpZWQuXG4gICAgKiA1LiBJZiBzdWNoIGFuIGVsZW1lbnQgaXMgZm91bmQsIGNvbXB1dGVzIHRoZSBhY3R1YWwgYmFja2dyb3VuZCBjb2xvciBpbiBSR0IgZm9ybWF0IGFuZCBjb252ZXJ0cyBpdCB0byBoZXhhZGVjaW1hbC5cbiAgICAqIDYuIENvbXBhcmVzIHRoZSBjb252ZXJ0ZWQgaGV4YWRlY2ltYWwgY29sb3IgdG8gdGhlIGBleHBlY3RlZENvbG9yYCwgYWRqdXN0aW5nIGZvciBjYXNlIHNlbnNpdGl2aXR5LlxuICAgICogNy4gUmV0dXJucyB0cnVlIGlmIHRoZSBjb2xvcnMgbWF0Y2gsIGZhbHNlIG90aGVyd2lzZS5cbiAgICAqL1xuICAgIHF1ZXJ5SGlsaXRlQ29sb3IoZXhwZWN0ZWRDb2xvcjogc3RyaW5nKTogYm9vbGVhbiB7XG5cbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuXG4gICAgICAgIGlmICghc2VsZWN0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzZWxlY3Rpb24ucmFuZ2VDb3VudCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGxldCBlbGVtZW50OiBOb2RlIHwgbnVsbCA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyO1xuXG4gICAgICAgIGlmIChlbGVtZW50Lm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xuICAgICAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNwYW5XaXRoQmFja2dyb3VuZCA9XG4gICAgICAgICAgICAoZWxlbWVudCBhcyBIVE1MRWxlbWVudCkuY2xvc2VzdChcInNwYW5bc3R5bGUqPSdiYWNrZ3JvdW5kLWNvbG9yJ11cIikgfHxcbiAgICAgICAgICAgIChlbGVtZW50IGFzIEhUTUxFbGVtZW50KS5jbG9zZXN0KFwiZm9udFtzdHlsZSo9J2JhY2tncm91bmQtY29sb3InXVwiKTtcblxuXG4gICAgICAgIGlmICghc3BhbldpdGhCYWNrZ3JvdW5kKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgY29uc3Qgc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShzcGFuV2l0aEJhY2tncm91bmQpO1xuICAgICAgICBjb25zdCByZ2JDb2xvciA9IHN0eWxlLmJhY2tncm91bmRDb2xvcjtcblxuICAgICAgICBjb25zdCBoZXhDb2xvciA9IFV0aWxzLnJnYlRvSGV4KHJnYkNvbG9yKTtcblxuICAgICAgICByZXR1cm4gaGV4Q29sb3IudG9VcHBlckNhc2UoKSA9PT0gZXhwZWN0ZWRDb2xvci50b1VwcGVyQ2FzZSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0SW5pdGlhbENvbG9yQXNIZXgoKSB7XG4gICAgICAgIGNvbnN0IHRlbXBFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0ZW1wRWxlbWVudCk7XG5cbiAgICAgICAgdGVtcEVsZW1lbnQuc3R5bGUuY29sb3IgPSAnaW5pdGlhbCc7XG5cbiAgICAgICAgY29uc3QgY29tcHV0ZWRDb2xvciA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRlbXBFbGVtZW50KS5jb2xvcjtcblxuICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHRlbXBFbGVtZW50KTtcblxuICAgICAgICByZXR1cm4gVXRpbHMucmdiVG9IZXgoY29tcHV0ZWRDb2xvcik7XG4gICAgfVxuXG4gICAgZ2V0VGFyZ2V0RWxlbWVudE1hcChjb21tYW5kOiBzdHJpbmcpOiBrZXlvZiBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICAgICBzd2l0Y2ggKGNvbW1hbmQpIHtcblxuICAgICAgICAgICAgY2FzZSBcInN0cm9uZ1wiOlxuICAgICAgICAgICAgY2FzZSBcImJvbGRcIjpcbiAgICAgICAgICAgIGNhc2UgXCJiXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuICdzdHJvbmcnO1xuXG4gICAgICAgICAgICBjYXNlIFwiaXRhbGljXCI6XG4gICAgICAgICAgICBjYXNlIFwiaVwiOlxuICAgICAgICAgICAgY2FzZSBcImVtXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiZW1cIjtcblxuICAgICAgICAgICAgY2FzZSBcInVuZGVybGluZVwiOlxuICAgICAgICAgICAgY2FzZSBcInVcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJ1XCI7XG5cbiAgICAgICAgICAgIGNhc2UgXCJzdHJpa2V0aHJvdWdoXCI6XG4gICAgICAgICAgICBjYXNlIFwic1wiOlxuICAgICAgICAgICAgICAgIHJldHVybiAncyc7XG5cbiAgICAgICAgICAgIGNhc2UgXCJiYWNrZ3JvdW5kXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwic3BhblwiO1xuXG4gICAgICAgICAgICBjYXNlIFwiY29sb3JcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJzcGFuXCI7XG5cbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0U2VsZWN0ZWRIVE1MRWxlbWVudCgpOiBIVE1MRWxlbWVudCB8IG51bGwge1xuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG5cbiAgICAgICAgaWYgKHNlbGVjdGlvbiAmJiBzZWxlY3Rpb24ucmFuZ2VDb3VudCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XG4gICAgICAgICAgICBsZXQgZWxlbWVudDogTm9kZSB8IG51bGwgPSByYW5nZS5jb21tb25BbmNlc3RvckNvbnRhaW5lcjtcblxuICAgICAgICAgICAgaWYgKGVsZW1lbnQubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgd2hpbGUgKGVsZW1lbnQgJiYgIShlbGVtZW50IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZSBhcyBIVE1MRWxlbWVudCB8IG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cblxuICAgIGdldFNlbGVjdGVkVGV4dE5vZGVzKCk6IE5vZGVbXSB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcbiAgICAgICAgaWYgKCFzZWxlY3Rpb24gfHwgc2VsZWN0aW9uLnJhbmdlQ291bnQgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRleHROb2RlczogTm9kZVtdID0gW107XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWxlY3Rpb24ucmFuZ2VDb3VudDsgKytpKSB7XG4gICAgICAgICAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KGkpO1xuICAgICAgICAgICAgY29uc3Qgbm9kZUl0ZXJhdG9yID0gZG9jdW1lbnQuY3JlYXRlTm9kZUl0ZXJhdG9yKFxuICAgICAgICAgICAgICAgIHJhbmdlLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyLFxuICAgICAgICAgICAgICAgIE5vZGVGaWx0ZXIuU0hPV19URVhULFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgYWNjZXB0Tm9kZShub2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmFuZ2UuaW50ZXJzZWN0c05vZGUobm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTm9kZUZpbHRlci5GSUxURVJfQUNDRVBUO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5vZGVGaWx0ZXIuRklMVEVSX1JFSkVDVDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGxldCBub2RlO1xuICAgICAgICAgICAgd2hpbGUgKChub2RlID0gbm9kZUl0ZXJhdG9yLm5leHROb2RlKCkpKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vZGVSYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG4gICAgICAgICAgICAgICAgICAgIG5vZGVSYW5nZS5zZWxlY3ROb2RlQ29udGVudHMobm9kZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UuY29tcGFyZUJvdW5kYXJ5UG9pbnRzKFJhbmdlLkVORF9UT19TVEFSVCwgbm9kZVJhbmdlKSA9PT0gLTEgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlLmNvbXBhcmVCb3VuZGFyeVBvaW50cyhSYW5nZS5TVEFSVF9UT19FTkQsIG5vZGVSYW5nZSkgPT09IDFcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0Tm9kZXMucHVzaChub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0ZXh0Tm9kZXM7XG4gICAgfVxuXG4gICAgZmluZENsb3Nlc3RNYXRjaGluZ1BhcmVudChlbGVtZW50OiBOb2RlIHwgbnVsbCwgdGFyZ2V0OiBUYXJnZXROb2RlKTogRWxlbWVudCB8IG51bGwge1xuICAgICAgICBpZiAoZWxlbWVudCAmJiBlbGVtZW50Lm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xuICAgICAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50RWxlbWVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIHdoaWxlIChlbGVtZW50ICYmIGVsZW1lbnQgIT09IGRvY3VtZW50LmJvZHkpIHtcbiAgICAgICAgICAgIGlmIChlbGVtZW50Lm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW0gPSBlbGVtZW50IGFzIEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgaWYgKGVsZW0udGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSB0YXJnZXQubm9kZVR5cGUudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXRhcmdldC5jbGFzc2VzIHx8IHRhcmdldC5jbGFzc2VzLmV2ZXJ5KGNscyA9PiBlbGVtLmNsYXNzTGlzdC5jb250YWlucyhjbHMpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsZW07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbGVtZW50ID0gZWxlbWVudC5wYXJlbnRFbGVtZW50O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGV4dHJhY3RTZWxlY3RlZFRleHQodGV4dE5vZGU6IE5vZGUpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG5cbiAgICAgICAgaWYgKCFzZWxlY3Rpb24gfHwgc2VsZWN0aW9uLnJhbmdlQ291bnQgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcblxuICAgICAgICBpZiAodGV4dE5vZGUubm9kZVR5cGUgIT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRleHRDb250ZW50ID0gdGV4dE5vZGUudGV4dENvbnRlbnQgfHwgXCJcIjtcblxuICAgICAgICBsZXQgc3RhcnQgPSAwO1xuICAgICAgICBsZXQgZW5kID0gdGV4dENvbnRlbnQubGVuZ3RoO1xuXG4gICAgICAgIGlmICghcmFuZ2UuaW50ZXJzZWN0c05vZGUodGV4dE5vZGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyYW5nZS5zdGFydENvbnRhaW5lciA9PT0gdGV4dE5vZGUpIHtcbiAgICAgICAgICAgIHN0YXJ0ID0gcmFuZ2Uuc3RhcnRPZmZzZXQ7XG4gICAgICAgIH0gZWxzZSBpZiAocmFuZ2Uuc3RhcnRDb250YWluZXIuY29udGFpbnModGV4dE5vZGUpKSB7XG4gICAgICAgICAgICBzdGFydCA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmFuZ2UuZW5kQ29udGFpbmVyID09PSB0ZXh0Tm9kZSkge1xuICAgICAgICAgICAgZW5kID0gcmFuZ2UuZW5kT2Zmc2V0O1xuICAgICAgICB9IGVsc2UgaWYgKHJhbmdlLmVuZENvbnRhaW5lci5jb250YWlucyh0ZXh0Tm9kZSkpIHtcbiAgICAgICAgICAgIGVuZCA9IHRleHRDb250ZW50Lmxlbmd0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzdGFydCA8IGVuZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRleHRDb250ZW50LnN1YnN0cmluZyhzdGFydCwgZW5kKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IFRleHRPcGVyYXRpb25zU2VydmljZSB9IGZyb20gXCJAL3NlcnZpY2VzL3RleHQtb3BlcmF0aW9ucy9UZXh0T3BlcmF0aW9uc1NlcnZpY2VcIjtcclxuaW1wb3J0IHsgQmFzZVVJQ29tcG9uZW50IH0gZnJvbSBcIi4uLy4uL2NvbW1vbi9CYXNlVUlDb21wb25lbnRcIjtcclxuaW1wb3J0IHsgSW5wdXRMaW5rQm94V3JhcHBlciB9IGZyb20gXCIuL0lucHV0TGlua0JveFdyYXBwZXJcIjtcclxuaW1wb3J0IHsgQ29tbWFuZHMgfSBmcm9tIFwiQC9jb21tYW5kcy9Db21tYW5kc1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIElucHV0TGlua0JveCBleHRlbmRzIEJhc2VVSUNvbXBvbmVudCB7XHJcblxyXG4gICAgcGFyZW50V3JhcHBlcj86IElucHV0TGlua0JveFdyYXBwZXI7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcblxyXG4gICAgICAgIHN1cGVyKHt9KVxyXG4gICAgICAgIHRoaXMuYXR0YWNoRXZlbnQoKTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0KCk6IEhUTUxFbGVtZW50IHtcclxuXHJcbiAgICAgICAgY29uc3QgaHRtbEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7XHJcblxyXG4gICAgICAgIGh0bWxFbGVtZW50LmlkID0gXCJsaW5rQm94SW5wdXRcIjtcclxuICAgICAgICBodG1sRWxlbWVudC50eXBlID0gXCJ1cmxcIjtcclxuICAgICAgICBodG1sRWxlbWVudC5wbGFjZWhvbGRlciA9IFwiUGFzdGUgb3IgdHlwZSBhIGxpbmsuLi5cIjtcclxuXHJcbiAgICAgICAgaHRtbEVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSBcInJlbGF0aXZlXCI7XHJcblxyXG4gICAgICAgIHJldHVybiBodG1sRWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICBzZXRQYXJlbnRXcmFwcGVyKHBhcmVudFdyYXBwZXI6IElucHV0TGlua0JveFdyYXBwZXIpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnBhcmVudFdyYXBwZXIgPSBwYXJlbnRXcmFwcGVyO1xyXG4gICAgfVxyXG5cclxuICAgIGF0dGFjaEV2ZW50KCk6IHZvaWQge1xyXG5cclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCAoZXZlbnQpID0+IHtcclxuXHJcbiAgICAgICAgICAgIGlmIChldmVudC5rZXkgPT0gXCJFbnRlclwiICYmIHRoaXMuaXNWaXNpYmxlKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IHVybCA9ICh0aGlzLmh0bWxFbGVtZW50IGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlO1xyXG5cclxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIFRleHRPcGVyYXRpb25zU2VydmljZS5nZXRJbnN0YW5jZSgpLmV4ZWNDb21tYW5kKENvbW1hbmRzLnRvZ2dsZUxpbmssIGZhbHNlLCB1cmwpO1xyXG4gICAgICAgICAgICAgICAgfSwgMTApO1xyXG5cclxuICAgICAgICAgICAgICAgICh0aGlzLmh0bWxFbGVtZW50IGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlID0gXCJcIjtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLnBhcmVudFdyYXBwZXI/LmhpZGUoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGV2ZW50LmtleSA9PSBcIkVzY2FwZVwiICYmIHRoaXMuaXNWaXNpYmxlKSB7XHJcbiAgICAgICAgICAgICAgICAodGhpcy5odG1sRWxlbWVudCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZSA9IFwiXCI7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnBhcmVudFdyYXBwZXI/LmhpZGUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvL1RPRE8gY2hlY2sgdGhlIGZsb2FyaW5nIGlkIGhlcmVcclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChldmVudCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5jYW5IaWRlICYmICEoZXZlbnQudGFyZ2V0ISBhcyBIVE1MRWxlbWVudCkuY2xvc2VzdChgIyR7dGhpcy5odG1sRWxlbWVudC5pZH1gKSAmJiAhKGV2ZW50LnRhcmdldCEgYXMgSFRNTEVsZW1lbnQpLmNsb3Nlc3QoXCIjdGV4dEZsb2F0aW5nVG9vbGJhclwiKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wYXJlbnRXcmFwcGVyPy5oaWRlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCAoZXZlbnQpID0+IHtcclxuICAgICAgICAgICAgaWYgKGV2ZW50LmtleSA9PSBcIi9cIikge1xyXG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxufSIsImltcG9ydCB7IFRleHRPcGVyYXRpb25zU2VydmljZSB9IGZyb20gXCJAL3NlcnZpY2VzL3RleHQtb3BlcmF0aW9ucy9UZXh0T3BlcmF0aW9uc1NlcnZpY2VcIjtcclxuaW1wb3J0IHsgQmFzZVVJQ29tcG9uZW50IH0gZnJvbSBcIi4uLy4uL2NvbW1vbi9CYXNlVUlDb21wb25lbnRcIjtcclxuaW1wb3J0IHsgSW5wdXRMaW5rQm94IH0gZnJvbSBcIi4vSW5wdXRMaW5rQm94XCI7XHJcblxyXG5leHBvcnQgY2xhc3MgSW5wdXRMaW5rQm94V3JhcHBlciBleHRlbmRzIEJhc2VVSUNvbXBvbmVudCB7XHJcblxyXG4gICAgaW5wdXRMaW5rQm94OiBJbnB1dExpbmtCb3g7XHJcbiAgICByYW5nZT86IFJhbmdlO1xyXG4gICAgaGlnaGxpZ2h0czogSFRNTERpdkVsZW1lbnRbXSA9IFtdO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIGNvbnN0IGlucHV0TGlua0JveCA9IG5ldyBJbnB1dExpbmtCb3goKTtcclxuXHJcbiAgICAgICAgc3VwZXIoe1xyXG4gICAgICAgICAgICBpbnB1dExpbmtCb3g6IGlucHV0TGlua0JveFxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmlucHV0TGlua0JveCA9IGlucHV0TGlua0JveDtcclxuICAgICAgICB0aGlzLmF0dGFjaEV2ZW50KCk7XHJcbiAgICAgICAgaW5wdXRMaW5rQm94LnNldFBhcmVudFdyYXBwZXIodGhpcyk7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIGluaXQoKTogSFRNTEVsZW1lbnQge1xyXG4gICAgICAgIGNvbnN0IGh0bWxFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuXHJcbiAgICAgICAgaHRtbEVsZW1lbnQuaWQgPSBcImxpbmtCb3hcIjtcclxuICAgICAgICBodG1sRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuY2xhc3NMaXN0LmFkZChcImRlcGVuZGVudC1ib3hcIik7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XHJcblxyXG4gICAgICAgIGh0bWxFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMucHJvcHMuaW5wdXRMaW5rQm94Lmh0bWxFbGVtZW50KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGh0bWxFbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIGF0dGFjaEV2ZW50KCk6IHZvaWQge1xyXG5cclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwic2hvd0lucHV0TGlua0JveFJlcXVlc3RlZFwiLCAoKSA9PiB7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnNob3coKTtcclxuICAgICAgICAgICAgdGhpcy5oaWdobGlnaHRTZWxlY3RlZFRleHQoKTtcclxuICAgICAgICAgICAgdGhpcy5pbnB1dExpbmtCb3guZm9jdXMoKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgaGlkZSgpOiB2b2lkIHtcclxuXHJcbiAgICAgICAgc3VwZXIuaGlkZSgpO1xyXG4gICAgICAgIHRoaXMucmVtb3ZlSGlnaGxpZ2h0cygpO1xyXG5cclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHNob3dJbnB1dExpbmtCb3hGaW5pc2hlZCA9IG5ldyBDdXN0b21FdmVudCgnc2hvd0lucHV0TGlua0JveEZpbmlzaGVkJywge1xyXG4gICAgICAgICAgICAgICAgYnViYmxlczogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIGNhbmNlbGFibGU6IHRydWVcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHNob3dJbnB1dExpbmtCb3hGaW5pc2hlZCk7XHJcbiAgICAgICAgfSwgMCk7XHJcbiAgICB9XHJcblxyXG4gICAgaGlnaGxpZ2h0U2VsZWN0ZWRUZXh0KCkge1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcclxuICAgICAgICBpZiAoIXNlbGVjdGlvbj8ucmFuZ2VDb3VudCkgcmV0dXJuO1xyXG5cclxuICAgICAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xyXG4gICAgICAgIGNvbnN0IHJlY3RzID0gcmFuZ2UuZ2V0Q2xpZW50UmVjdHMoKTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZWN0cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCByZWN0ID0gcmVjdHNbaV07XHJcbiAgICAgICAgICAgIGNvbnN0IGhpZ2hsaWdodCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgICAgICBoaWdobGlnaHQuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xyXG4gICAgICAgICAgICBoaWdobGlnaHQuc3R5bGUubGVmdCA9IGAke3JlY3QubGVmdH1weGA7XHJcbiAgICAgICAgICAgIGhpZ2hsaWdodC5zdHlsZS50b3AgPSBgJHtyZWN0LnRvcH1weGA7XHJcbiAgICAgICAgICAgIGhpZ2hsaWdodC5zdHlsZS53aWR0aCA9IGAke3JlY3Qud2lkdGh9cHhgO1xyXG4gICAgICAgICAgICBoaWdobGlnaHQuc3R5bGUuaGVpZ2h0ID0gYCR7cmVjdC5oZWlnaHR9cHhgO1xyXG4gICAgICAgICAgICBoaWdobGlnaHQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gJyNjMmMyYzInO1xyXG4gICAgICAgICAgICBoaWdobGlnaHQuc3R5bGUub3BhY2l0eSA9ICcwLjMnO1xyXG4gICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGhpZ2hsaWdodCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmhpZ2hsaWdodHMucHVzaChoaWdobGlnaHQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbW92ZUhpZ2hsaWdodHMoKSB7XHJcbiAgICAgICAgdGhpcy5oaWdobGlnaHRzLmZvckVhY2goaGlnaGxpZ2h0ID0+IHtcclxuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChoaWdobGlnaHQpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuaGlnaGxpZ2h0cyA9IFtdO1xyXG4gICAgfVxyXG5cclxufSIsImltcG9ydCB7IEJhc2VVSUNvbXBvbmVudCB9IGZyb20gJy4uL2NvbW1vbi9CYXNlVUlDb21wb25lbnQnO1xyXG5pbXBvcnQgeyBEcm9wZG93bk1lbnUgfSBmcm9tICcuL2Ryb3Bkb3duLXRvb2wvRHJvcGRvd25NZW51JztcclxuaW1wb3J0IHsgRmxvYXRpbmdUb29sYmFyU2VwYXJhdG9yIH0gZnJvbSAnLi9zZXBhcmF0b3IvRmxvYXRpbmdUb29sYmFyU2VwYXJhdG9yJztcclxuaW1wb3J0IHsgQnV0dG9uR3JvdXAgfSBmcm9tICcuL2J1dHRvbi1ncm91cC9CdXR0b25Hcm91cCc7XHJcbmltcG9ydCB7IElucHV0TGlua0JveFdyYXBwZXIgfSBmcm9tICcuL2xpbmstYm94L0lucHV0TGlua0JveFdyYXBwZXInO1xyXG5pbXBvcnQgeyBDdXN0b21FdmVudHMgfSBmcm9tICdAL2NvbW1vbi9DdXN0b21FdmVudHMnO1xyXG5cclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEZsb2F0aW5nVG9vbGJhciBleHRlbmRzIEJhc2VVSUNvbXBvbmVudCB7XHJcblxyXG4gICAgZHJvcGRvd25zOiBEcm9wZG93bk1lbnVbXTtcclxuICAgIHNlcGFyYXRvcnM6IEZsb2F0aW5nVG9vbGJhclNlcGFyYXRvcltdO1xyXG4gICAgY3VycmVudFNlbGVjdGlvblJhbmdlOiBSYW5nZSB8IG51bGw7XHJcbiAgICBpbnB1dExpbmtCb3hXcmFwcGVyOiBJbnB1dExpbmtCb3hXcmFwcGVyO1xyXG4gICAgaHRtbEZvY3VzZWRFbGVtZW50QmVmb3JlT3BlblF1aWNrTWVudTogSFRNTEVsZW1lbnQgfCBudWxsO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGlkOiBzdHJpbmcpIHtcclxuXHJcbiAgICAgICAgY29uc3QgaW5wdXRMaW5rQm94V3JhcHBlciA9IG5ldyBJbnB1dExpbmtCb3hXcmFwcGVyKCk7XHJcblxyXG4gICAgICAgIHN1cGVyKHtcclxuICAgICAgICAgICAgaWQ6IGlkLFxyXG4gICAgICAgICAgICBpbnB1dExpbmtCb3hXcmFwcGVyOiBpbnB1dExpbmtCb3hXcmFwcGVyXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuaW5wdXRMaW5rQm94V3JhcHBlciA9IGlucHV0TGlua0JveFdyYXBwZXI7XHJcbiAgICAgICAgdGhpcy5kcm9wZG93bnMgPSBbXTtcclxuICAgICAgICB0aGlzLnNlcGFyYXRvcnMgPSBbXTtcclxuICAgICAgICB0aGlzLmN1cnJlbnRTZWxlY3Rpb25SYW5nZSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5odG1sRm9jdXNlZEVsZW1lbnRCZWZvcmVPcGVuUXVpY2tNZW51ID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBpbml0KCk6IEhUTUxFbGVtZW50IHtcclxuXHJcbiAgICAgICAgY29uc3QgaHRtbEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG5cclxuICAgICAgICBodG1sRWxlbWVudC5pZCA9IHRoaXMucHJvcHMuaWQ7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJmbG9hdGluZy10b29sYmFyXCIsIFwic2VsZWN0LXdyYXBwZXJcIiwgXCJzb2Z0LWJveC1zaGFkb3dcIik7XHJcblxyXG4gICAgICAgIGNvbnN0IHNlbGVjdFdyYXBwZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG5cclxuICAgICAgICBodG1sRWxlbWVudC5hcHBlbmRDaGlsZChzZWxlY3RXcmFwcGVyKTtcclxuXHJcbiAgICAgICAgY29uc3QgZWRpdG9yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJqb2hhbm5lc0VkaXRvclwiKTtcclxuXHJcbiAgICAgICAgZWRpdG9yPy5hcHBlbmRDaGlsZCh0aGlzLnByb3BzLmlucHV0TGlua0JveFdyYXBwZXIuaHRtbEVsZW1lbnQpO1xyXG5cclxuICAgICAgICByZXR1cm4gaHRtbEVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGRpc3BsYXkoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gJ2ZsZXgnO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHNob3coKTogdm9pZCB7XHJcbiAgICAvLyAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcclxuXHJcbiAgICAvLyAgICAgICAgIHRoaXMuaHRtbEZvY3VzZWRFbGVtZW50QmVmb3JlT3BlblF1aWNrTWVudSA9IERPTVV0aWxzLmZpbmRDbG9zZXN0QW5jZXN0b3JPZkFjdGl2ZUVsZW1lbnRCeUNsYXNzKFwiLmZvY3VzYWJsZVwiKTtcclxuICAgIC8vICAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG5cclxuICAgIC8vICAgICAgICAgaWYgKCFzZWxlY3Rpb24gfHwgc2VsZWN0aW9uLnJhbmdlQ291bnQgPT09IDApIHtcclxuICAgIC8vICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ05vIHNlbGVjdGlvbiBmb3VuZCcpO1xyXG4gICAgLy8gICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgLy8gICAgICAgICB9XHJcblxyXG4gICAgLy8gICAgICAgICB0aGlzLmN1cnJlbnRTZWxlY3Rpb25SYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xyXG5cclxuICAgIC8vICAgICAgICAgY29uc3QgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcclxuICAgIC8vICAgICAgICAgY29uc3QgcmVjdCA9IHJhbmdlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG5cclxuICAgIC8vICAgICAgICAgdGhpcy5odG1sRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xyXG5cclxuICAgIC8vICAgICAgICAgY29uc3QgZWxlbWVudFdpZHRoID0gdGhpcy5odG1sRWxlbWVudC5vZmZzZXRXaWR0aDtcclxuICAgIC8vICAgICAgICAgbGV0IGxlZnRQb3NpdGlvbiA9IHJlY3QubGVmdCArIHdpbmRvdy5zY3JvbGxYIC0gNTA7XHJcblxyXG4gICAgLy8gICAgICAgICBpZiAobGVmdFBvc2l0aW9uICsgZWxlbWVudFdpZHRoID4gd2luZG93LmlubmVyV2lkdGgpIHtcclxuICAgIC8vICAgICAgICAgICAgIGxlZnRQb3NpdGlvbiA9IHdpbmRvdy5pbm5lcldpZHRoIC0gZWxlbWVudFdpZHRoIC0gMjA7XHJcbiAgICAvLyAgICAgICAgIH1cclxuXHJcbiAgICAvLyAgICAgICAgIGNvbnN0IGVsZW1lbnRIZWlnaHQgPSB0aGlzLmh0bWxFbGVtZW50Lm9mZnNldEhlaWdodDtcclxuICAgIC8vICAgICAgICAgbGV0IHRvcFBvc2l0aW9uID0gcmVjdC50b3AgKyB3aW5kb3cuc2Nyb2xsWSAtIGVsZW1lbnRIZWlnaHQgLSAxMDtcclxuXHJcbiAgICAvLyAgICAgICAgIGlmICh0b3BQb3NpdGlvbiA8IDApIHtcclxuICAgIC8vICAgICAgICAgICAgIHRvcFBvc2l0aW9uID0gcmVjdC5ib3R0b20gKyB3aW5kb3cuc2Nyb2xsWSArIDEwO1xyXG4gICAgLy8gICAgICAgICB9XHJcblxyXG4gICAgLy8gICAgICAgICB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLmxlZnQgPSBgJHtsZWZ0UG9zaXRpb259cHhgO1xyXG4gICAgLy8gICAgICAgICB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLnRvcCA9IGAke3RvcFBvc2l0aW9ufXB4YDtcclxuXHJcbiAgICAvLyAgICAgICAgIHN1cGVyLnNob3coKTtcclxuXHJcbiAgICAvLyAgICAgICAgIC8vIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KEN1c3RvbUV2ZW50cy5mbG9hdGluZ1Rvb2xiYXJEaXNwbGF5ZWQsIHtcclxuICAgIC8vICAgICAgICAgLy8gICAgIGJ1YmJsZXM6IHRydWUsXHJcbiAgICAvLyAgICAgICAgIC8vICAgICBjYW5jZWxhYmxlOiB0cnVlXHJcbiAgICAvLyAgICAgICAgIC8vIH0pKTtcclxuICAgIC8vICAgICB9KTtcclxuICAgIC8vIH1cclxuXHJcbiAgICBoaWRlKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLmNhbkhpZGUpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuYW55RHJvcGRvd25WaXNpYmxlKCkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaGlkZUFsbERyb3Bkb3duVmlzaWJsZSgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRTZWxlY3Rpb25SYW5nZSA9IG51bGw7XHJcbiAgICAgICAgICAgIHN1cGVyLmhpZGUoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXBwZW5kRHJvcGRvd24oZHJvcGRvd246IERyb3Bkb3duTWVudSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuZHJvcGRvd25zLnB1c2goZHJvcGRvd24pXHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5hcHBlbmRDaGlsZChkcm9wZG93bi5odG1sRWxlbWVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXBwZW5kQnV0dG9uR3JvdXAoYnV0dG9uR3JvdXA6IEJ1dHRvbkdyb3VwKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5hcHBlbmRDaGlsZChidXR0b25Hcm91cC5odG1sRWxlbWVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXBwZW5kU2VwYXJhdG9yKHNlcGFyYXRvcjogRmxvYXRpbmdUb29sYmFyU2VwYXJhdG9yKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zZXBhcmF0b3JzLnB1c2goc2VwYXJhdG9yKTtcclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LmFwcGVuZENoaWxkKHNlcGFyYXRvci5odG1sRWxlbWVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXBwZW5kVGV4dFRvb2xiYXIoYnV0dG9uOiBCdXR0b25Hcm91cCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQoYnV0dG9uLmh0bWxFbGVtZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBhbnlEcm9wZG93blZpc2libGUoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgZm9yIChjb25zdCBkcm9wZG93biBvZiB0aGlzLmRyb3Bkb3ducykge1xyXG4gICAgICAgICAgICBpZiAoZHJvcGRvd24uZHJvcGRvd25MaXN0LmlzVmlzaWJsZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBoaWRlQWxsRHJvcGRvd25WaXNpYmxlKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGZvciAoY29uc3QgZHJvcGRvd24gb2YgdGhpcy5kcm9wZG93bnMpIHtcclxuICAgICAgICAgICAgaWYgKGRyb3Bkb3duLmRyb3Bkb3duTGlzdC5jYW5IaWRlKSB7XHJcbiAgICAgICAgICAgICAgICBkcm9wZG93bi5kcm9wZG93bkxpc3QuaGlkZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgYXR0YWNoRXZlbnRzKCkge1xyXG5cclxuICAgICAgICAvLyBQcmV2ZW50IGZvY3VzIGNoYW5nZSB3aGVuIGNsaWNraW5nIG9uIHRoaXMgZWxlbWVudFxyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIChldmVudCkgPT4ge1xyXG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBQcmV2ZW50IGZvY3VzIGNoYW5nZSB3aGVuIGNsaWNraW5nIG9uIHRoaXMgZWxlbWVudFxyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlZG93blwiLCAoZXZlbnQpID0+IHtcclxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICB9KTtcclxuXHJcblxyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJzaG93SW5wdXRMaW5rQm94UmVxdWVzdGVkXCIsICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5jYW5IaWRlID0gZmFsc2U7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJzaG93SW5wdXRMaW5rQm94RmluaXNoZWRcIiwgKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmNhbkhpZGUgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLnJlc3RvcmVSYW5nZVNlbGVjdGlvbigpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGV2ZW50KSA9PiB7XHJcbiAgICAgICAgLy8gICAgIGlmICh0aGlzLmNhbkhpZGUgJiYgKGV2ZW50LmtleSA9PT0gJ0VzY2FwZScpKSB7XHJcblxyXG4gICAgICAgIC8vICAgICAgICAgaWYgKHRoaXMuYW55RHJvcGRvd25WaXNpYmxlKCkpIHtcclxuICAgICAgICAvLyAgICAgICAgICAgICB0aGlzLmhpZGVBbGxEcm9wZG93blZpc2libGUoKTtcclxuICAgICAgICAvLyAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgdGhpcy5oaWRlKCk7XHJcbiAgICAgICAgLy8gICAgICAgICB9XHJcbiAgICAgICAgLy8gICAgIH0gaWYgKHRoaXMuY2FuSGlkZSAmJiAoZXZlbnQua2V5ID09PSAnQXJyb3dMZWZ0JyB8fCBldmVudC5rZXkgPT09ICdBcnJvd1JpZ2h0JyB8fCBldmVudC5rZXkgPT09ICdBcnJvd1VwJyB8fCBldmVudC5rZXkgPT09ICdBcnJvd0Rvd24nKSkge1xyXG4gICAgICAgIC8vICAgICAgICAgaWYgKHRoaXMuaXNTZWxlY3Rpb25FbXB0eSgpKSB7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgdGhpcy5oaWRlKCk7XHJcbiAgICAgICAgLy8gICAgICAgICB9XHJcbiAgICAgICAgLy8gICAgIH1cclxuICAgICAgICAvLyB9KTtcclxuXHJcbiAgICAgICAgLy8gZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChldmVudCkgPT4ge1xyXG4gICAgICAgIC8vICAgICBpZiAoKGV2ZW50LmtleSA9PT0gJ0VzY2FwZScgfHwgZXZlbnQua2V5ID09PSAnRGVsZXRlJykgJiYgdGhpcy5pc1Zpc2libGUpIHtcclxuICAgICAgICAvLyAgICAgICAgIGlmICh0aGlzLmNhbkhpZGUpIHtcclxuICAgICAgICAvLyAgICAgICAgICAgICB0aGlzLmhpZGVBbGxEcm9wZG93blZpc2libGUoKTtcclxuICAgICAgICAvLyAgICAgICAgICAgICB0aGlzLmhpZGUoKTtcclxuICAgICAgICAvLyAgICAgICAgIH1cclxuICAgICAgICAvLyAgICAgfVxyXG4gICAgICAgIC8vIH0pO1xyXG5cclxuXHJcbiAgICAgICAgLy8gZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZXZlbnQpID0+IHtcclxuICAgICAgICAvLyAgICAgaWYgKHRoaXMuY2FuSGlkZSAmJiAhKGV2ZW50LnRhcmdldCEgYXMgSFRNTEVsZW1lbnQpLmNsb3Nlc3QoYCMke3RoaXMuaHRtbEVsZW1lbnQuaWR9YCkgJiYgIXRoaXMuYW55RHJvcGRvd25WaXNpYmxlKCkpIHtcclxuICAgICAgICAvLyAgICAgICAgIHRoaXMuaGlkZSgpO1xyXG4gICAgICAgIC8vICAgICB9IFxyXG4gICAgICAgIC8vICAgICAvLyBlbHNlIGlmICh0aGlzLmlzVmlzaWJsZSAmJiAhKGV2ZW50LnRhcmdldCEgYXMgSFRNTEVsZW1lbnQpLmNsb3Nlc3QoYCMke3RoaXMuaHRtbEVsZW1lbnQuaWR9YCkgJiYgIXRoaXMuaW5wdXRMaW5rQm94V3JhcHBlci5pc1Zpc2libGUpIHtcclxuICAgICAgICAvLyAgICAgLy8gICAgIHRoaXMucmVzdG9yZVJhbmdlU2VsZWN0aW9uKCk7XHJcbiAgICAgICAgLy8gICAgIC8vIH1cclxuICAgICAgICAvLyB9KTtcclxuXHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihDdXN0b21FdmVudHMuYmxvY2tEZWxldGVkLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEN1c3RvbUV2ZW50cy5ibG9ja1R5cGVDaGFuZ2VkLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGlzU2VsZWN0aW9uRW1wdHkoKSB7XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gZG9jdW1lbnQuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgICAgICAgcmV0dXJuICFzZWxlY3Rpb24gfHwgc2VsZWN0aW9uLnJhbmdlQ291bnQgPT09IDAgfHwgc2VsZWN0aW9uLnRvU3RyaW5nKCkudHJpbSgpID09PSAnJztcclxuICAgIH1cclxuXHJcbiAgICByZXN0b3JlUmFuZ2VTZWxlY3Rpb24oKTogdm9pZCB7XHJcbiAgICAgICAgZG9jdW1lbnQuZ2V0U2VsZWN0aW9uKCk/LnJlbW92ZUFsbFJhbmdlcygpO1xyXG4gICAgICAgIGRvY3VtZW50LmdldFNlbGVjdGlvbigpPy5hZGRSYW5nZSh0aGlzLmN1cnJlbnRTZWxlY3Rpb25SYW5nZSEpO1xyXG4gICAgfVxyXG59XHJcblxyXG5cclxuIiwiaW1wb3J0IHsgRE9NVXRpbHMgfSBmcm9tIFwiQC91dGlsaXRpZXMvRE9NVXRpbHNcIjtcclxuaW1wb3J0IHsgRmxvYXRpbmdUb29sYmFyIH0gZnJvbSBcIi4vRmxvYXRpbmdUb29sYmFyXCI7XHJcbmltcG9ydCB7IFpJbmRleCB9IGZyb20gXCJAL2NvbW1vbi9aSW5kZXhcIjtcclxuaW1wb3J0IHsgRGVmYXVsdEpTRXZlbnRzIH0gZnJvbSBcIkAvY29tbW9uL0RlZmF1bHRKU0V2ZW50c1wiO1xyXG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tIFwiQC9jb21tYW5kcy9FdmVudEVtaXR0ZXJcIjtcclxuaW1wb3J0IHsgSVRleHRPcGVyYXRpb25zU2VydmljZSB9IGZyb20gXCJAL3NlcnZpY2VzL3RleHQtb3BlcmF0aW9ucy9JVGV4dE9wZXJhdGlvbnNTZXJ2aWNlXCI7XHJcbmltcG9ydCB7IERlcGVuZGVuY3lDb250YWluZXIgfSBmcm9tIFwiQC9jb3JlL0RlcGVuZGVuY3lDb250YWluZXJcIjtcclxuaW1wb3J0IHsgQ29sb3JzIH0gZnJvbSBcIkAvY29tbW9uL0NvbG9yc1wiO1xyXG5pbXBvcnQgeyBCdXR0b25JRHMgfSBmcm9tIFwiQC9jb3JlL0J1dHRvbklEc1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFRleHRDb250ZXh0RmxvYXRpbmdUb29sYmFyIGV4dGVuZHMgRmxvYXRpbmdUb29sYmFyIHtcclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBpZDogc3RyaW5nID0gXCJ0ZXh0RmxvYXRpbmdUb29sYmFyXCI7XHJcbiAgICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZTogVGV4dENvbnRleHRGbG9hdGluZ1Rvb2xiYXI7XHJcbiAgICBwcml2YXRlIHRleHRPcGVyYXRpb25zU2VydmljZTogSVRleHRPcGVyYXRpb25zU2VydmljZTtcclxuICAgIHByaXZhdGUgaW5pdGlhbFJlY3Q6IERPTVJlY3QgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKHRleHRPcGVyYXRpb25zU2VydmljZTogSVRleHRPcGVyYXRpb25zU2VydmljZSkge1xyXG5cclxuICAgICAgICBpZiAoVGV4dENvbnRleHRGbG9hdGluZ1Rvb2xiYXIuaW5zdGFuY2UpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVXNlIFRleHRDb250ZXh0RmxvYXRpbmdUb29sYmFyLmdldEluc3RhbmNlKCkgdG8gZ2V0IGluc3RhbmNlLlwiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHN1cGVyKFRleHRDb250ZXh0RmxvYXRpbmdUb29sYmFyLmlkKTtcclxuXHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5zdHlsZS56SW5kZXggPSBaSW5kZXguVmVyeUltcG9ydGFudDtcclxuICAgICAgICB0aGlzLnRleHRPcGVyYXRpb25zU2VydmljZSA9IHRleHRPcGVyYXRpb25zU2VydmljZTtcclxuXHJcbiAgICAgICAgdGhpcy5hdHRhY2hFdmVudHMoKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZ2V0SW5zdGFuY2UoKTogVGV4dENvbnRleHRGbG9hdGluZ1Rvb2xiYXIge1xyXG5cclxuICAgICAgICBjb25zdCB0ZXh0T3BlcmF0aW9uc1NlcnZpY2UgPSBEZXBlbmRlbmN5Q29udGFpbmVyLkluc3RhbmNlLnJlc29sdmU8SVRleHRPcGVyYXRpb25zU2VydmljZT4oXCJJVGV4dE9wZXJhdGlvbnNTZXJ2aWNlXCIpOztcclxuXHJcbiAgICAgICAgaWYgKCFUZXh0Q29udGV4dEZsb2F0aW5nVG9vbGJhci5pbnN0YW5jZSkge1xyXG4gICAgICAgICAgICBUZXh0Q29udGV4dEZsb2F0aW5nVG9vbGJhci5pbnN0YW5jZSA9IG5ldyBUZXh0Q29udGV4dEZsb2F0aW5nVG9vbGJhcih0ZXh0T3BlcmF0aW9uc1NlcnZpY2UpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIFRleHRDb250ZXh0RmxvYXRpbmdUb29sYmFyLmluc3RhbmNlO1xyXG4gICAgfVxyXG5cclxuICAgIHByb2Nlc3NTZWxlY3Rpb25DaGFuZ2VFZmZlY3RzKCkge1xyXG5cclxuICAgICAgICAvL1RoaXMgYmxvY2sgY2hlY2tzIGZvciBhbiBhY3RpdmUgc2VsZWN0aW9uIGFuZCB3aGV0aGVyIGl0IGNvbnRhaW5zIGFueSBjb250ZW50LlxyXG4gICAgICAgIC8vIEluIEZpcmVmb3gsIHRoZSBgc2VsZWN0aW9uY2hhbmdlYCBldmVudCBtYXkgYmUgZmlyZWQgZXZlbiB3aGlsZSB0eXBpbmcsXHJcbiAgICAgICAgLy8gd2hpY2ggaXMgbm90IHRoZSBpbnRlbmRlZCB0cmlnZ2VyIHNpbmNlIHdlIG9ubHkgd2FudCB0byByZWFjdCB0byBhY3R1YWwgY2hhbmdlcyBpbiBzZWxlY3Rpb24uXHJcbiAgICAgICAgLy8gSWYgdGhlIHNlbGVjdGlvbiBpcyBlbXB0eSBvciBudWxsLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBlYXJseSwgZWZmZWN0aXZlbHkgaWdub3JpbmdcclxuICAgICAgICAvLyB0aGVzZSB1bndhbnRlZCBgc2VsZWN0aW9uY2hhbmdlYCBldmVudHMgZHVyaW5nIHR5cGluZy5cclxuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSBkb2N1bWVudC5nZXRTZWxlY3Rpb24oKTtcclxuICAgICAgICBpZiAoIXNlbGVjdGlvbiB8fCBzZWxlY3Rpb24/LnRvU3RyaW5nKCkudHJpbSgpID09PSAnJykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBFdmVudEVtaXR0ZXIuZW1pdFJlc2V0QWN0aXZlQnV0dG9uc0VsZW1lbnRFdmVudChcImhpbGl0ZUNvbG9yXCIpO1xyXG4gICAgICAgIEV2ZW50RW1pdHRlci5lbWl0UmVzZXRBY3RpdmVCdXR0b25zRWxlbWVudEV2ZW50KFwiZm9yZUNvbG9yXCIpO1xyXG5cclxuICAgICAgICBjb25zdCBpc0JvbGQ6IGJvb2xlYW4gPSB0aGlzLnRleHRPcGVyYXRpb25zU2VydmljZS5xdWVyeUNvbW1hbmRTdGF0ZUEoJ2JvbGQnKTtcclxuICAgICAgICBjb25zdCBpc0l0YWxpYzogYm9vbGVhbiA9IHRoaXMudGV4dE9wZXJhdGlvbnNTZXJ2aWNlLnF1ZXJ5Q29tbWFuZFN0YXRlQSgnaXRhbGljJyk7XHJcbiAgICAgICAgY29uc3QgaXNVbmRlcmxpbmU6IGJvb2xlYW4gPSB0aGlzLnRleHRPcGVyYXRpb25zU2VydmljZS5xdWVyeUNvbW1hbmRTdGF0ZUEoJ3VuZGVybGluZScpO1xyXG4gICAgICAgIGNvbnN0IGlzU3RyaWtlVGhyb3VnaDogYm9vbGVhbiA9IHRoaXMudGV4dE9wZXJhdGlvbnNTZXJ2aWNlLnF1ZXJ5Q29tbWFuZFN0YXRlQSgnc3RyaWtlVGhyb3VnaCcpO1xyXG5cclxuICAgICAgICBjb25zdCBoaWxpdGVDb2xvcnM6IHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9ID0ge307XHJcbiAgICAgICAgaGlsaXRlQ29sb3JzW0NvbG9ycy5IaWxpdGVDb2xvclJlZF0gPSB0aGlzLnRleHRPcGVyYXRpb25zU2VydmljZS5xdWVyeUhpbGl0ZUNvbG9yKENvbG9ycy5IaWxpdGVDb2xvclJlZCk7XHJcbiAgICAgICAgaGlsaXRlQ29sb3JzW0NvbG9ycy5IaWxpdGVDb2xvckdyZWVuXSA9IHRoaXMudGV4dE9wZXJhdGlvbnNTZXJ2aWNlLnF1ZXJ5SGlsaXRlQ29sb3IoQ29sb3JzLkhpbGl0ZUNvbG9yR3JlZW4pO1xyXG4gICAgICAgIGhpbGl0ZUNvbG9yc1tDb2xvcnMuSGlsaXRlQ29sb3JCbHVlXSA9IHRoaXMudGV4dE9wZXJhdGlvbnNTZXJ2aWNlLnF1ZXJ5SGlsaXRlQ29sb3IoQ29sb3JzLkhpbGl0ZUNvbG9yQmx1ZSk7XHJcbiAgICAgICAgaGlsaXRlQ29sb3JzW0NvbG9ycy5IaWxpdGVDb2xvclllbGxvd10gPSB0aGlzLnRleHRPcGVyYXRpb25zU2VydmljZS5xdWVyeUhpbGl0ZUNvbG9yKENvbG9ycy5IaWxpdGVDb2xvclllbGxvdyk7XHJcbiAgICAgICAgaGlsaXRlQ29sb3JzW0NvbG9ycy5IaWxpdGVDb2xvckdyZXldID0gdGhpcy50ZXh0T3BlcmF0aW9uc1NlcnZpY2UucXVlcnlIaWxpdGVDb2xvcihDb2xvcnMuSGlsaXRlQ29sb3JHcmV5KTtcclxuXHJcbiAgICAgICAgY29uc3QgZm9yZUNvbG9yczogeyBba2V5OiBzdHJpbmddOiBib29sZWFuIH0gPSB7fTtcclxuICAgICAgICBmb3JlQ29sb3JzW0NvbG9ycy5Gb3JlQ29sb3JSZWRdID0gdGhpcy50ZXh0T3BlcmF0aW9uc1NlcnZpY2UucXVlcnlGb3JlQ29sb3IoQ29sb3JzLkZvcmVDb2xvclJlZCk7XHJcbiAgICAgICAgZm9yZUNvbG9yc1tDb2xvcnMuRm9yZUNvbG9yR3JlZW5dID0gdGhpcy50ZXh0T3BlcmF0aW9uc1NlcnZpY2UucXVlcnlGb3JlQ29sb3IoQ29sb3JzLkZvcmVDb2xvckdyZWVuKTtcclxuICAgICAgICBmb3JlQ29sb3JzW0NvbG9ycy5Gb3JlQ29sb3JCbHVlXSA9IHRoaXMudGV4dE9wZXJhdGlvbnNTZXJ2aWNlLnF1ZXJ5Rm9yZUNvbG9yKENvbG9ycy5Gb3JlQ29sb3JCbHVlKTtcclxuICAgICAgICBmb3JlQ29sb3JzW0NvbG9ycy5Gb3JlQ29sb3JZZWxsb3ddID0gdGhpcy50ZXh0T3BlcmF0aW9uc1NlcnZpY2UucXVlcnlGb3JlQ29sb3IoQ29sb3JzLkZvcmVDb2xvclllbGxvdyk7XHJcbiAgICAgICAgZm9yZUNvbG9yc1tDb2xvcnMuRm9yZUNvbG9yR3JleV0gPSB0aGlzLnRleHRPcGVyYXRpb25zU2VydmljZS5xdWVyeUZvcmVDb2xvcihDb2xvcnMuRm9yZUNvbG9yR3JleSk7XHJcblxyXG5cclxuICAgICAgICBPYmplY3QuZW50cmllcyhoaWxpdGVDb2xvcnMpLmZvckVhY2goKFtjb2xvciwgYWN0aXZlXSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoYWN0aXZlKSB7XHJcbiAgICAgICAgICAgICAgICBFdmVudEVtaXR0ZXIuZW1pdFNob3dIaWRlQWN0aXZlRWxlbWVudEV2ZW50KFwiaGlsaXRlQ29sb3JcIiwgY29sb3IsIFwic2hvd1wiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBPYmplY3QuZW50cmllcyhmb3JlQ29sb3JzKS5mb3JFYWNoKChbY29sb3IsIGFjdGl2ZV0pID0+IHtcclxuICAgICAgICAgICAgaWYgKGFjdGl2ZSkge1xyXG4gICAgICAgICAgICAgICAgRXZlbnRFbWl0dGVyLmVtaXRTaG93SGlkZUFjdGl2ZUVsZW1lbnRFdmVudChcImZvcmVDb2xvclwiLCBjb2xvciwgXCJzaG93XCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuZW1pdENoYW5nZUNvbXBvbmVudENvbG9yRXZlbnQoaXNCb2xkLCBCdXR0b25JRHMuQm9sZCk7XHJcbiAgICAgICAgdGhpcy5lbWl0Q2hhbmdlQ29tcG9uZW50Q29sb3JFdmVudChpc0l0YWxpYywgQnV0dG9uSURzLkl0YWxpYyk7XHJcbiAgICAgICAgdGhpcy5lbWl0Q2hhbmdlQ29tcG9uZW50Q29sb3JFdmVudChpc1VuZGVybGluZSwgQnV0dG9uSURzLlVuZGVybGluZSk7XHJcbiAgICAgICAgdGhpcy5lbWl0Q2hhbmdlQ29tcG9uZW50Q29sb3JFdmVudChpc1N0cmlrZVRocm91Z2gsIEJ1dHRvbklEcy5TdHJpa2V0aHJvdWdoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGVtaXRDaGFuZ2VDb21wb25lbnRDb2xvckV2ZW50KGFjdGl2ZTogYm9vbGVhbiwgdGFyZ2V0SWQ6IHN0cmluZykge1xyXG4gICAgICAgIGlmIChhY3RpdmUpIHtcclxuICAgICAgICAgICAgRXZlbnRFbWl0dGVyLmVtaXRDaGFuZ2VDb21wb25lbnRDb2xvckV2ZW50KHRhcmdldElkLCBDb2xvcnMuSWNvbkFjdGl2ZUJsdWUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIEV2ZW50RW1pdHRlci5lbWl0Q2hhbmdlQ29tcG9uZW50Q29sb3JFdmVudCh0YXJnZXRJZCwgQ29sb3JzLkljb25EZWZhdWx0QmxhY2spO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhdHRhY2hFdmVudHMoKTogdm9pZCB7XHJcblxyXG5cclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKERlZmF1bHRKU0V2ZW50cy5TZWxlY3Rpb25DaGFuZ2UsIHRoaXMucHJvY2Vzc1NlbGVjdGlvbkNoYW5nZUVmZmVjdHMuYmluZCh0aGlzKSk7XHJcblxyXG4gICAgICAgIC8vIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleXVwJywgKGV2ZW50KSA9PiB7XHJcbiAgICAgICAgLy8gICAgIGlmIChldmVudC5rZXkgPT09IFwiU2hpZnRcIiB8fCBldmVudC5rZXkgPT09IFwiQ29udHJvbFwiKSB7XHJcblxyXG4gICAgICAgIC8vICAgICAgICAgaWYgKHdpbmRvdy5nZXRTZWxlY3Rpb24oKSEudG9TdHJpbmcoKS50cmltKCkgIT09ICcnKSB7XHJcblxyXG4gICAgICAgIC8vICAgICAgICAgICAgIGlmIChET01VdGlscy5pc1NlbGVjdGVkVGV4dERlc2NlbmRhbnRPZihcIi50aXRsZVwiKSkge1xyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgICAgICAvLyAgICAgICAgICAgICB0aGlzLnNob3coKTtcclxuICAgICAgICAvLyAgICAgICAgIH1cclxuICAgICAgICAvLyAgICAgfVxyXG4gICAgICAgIC8vIH0pO1xyXG5cclxuICAgICAgICAvLyBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgKGV2ZW50KSA9PiB7XHJcbiAgICAgICAgLy8gICAgIGlmICghdGhpcy5pc1Zpc2libGUpIHtcclxuXHJcbiAgICAgICAgLy8gICAgICAgICAvLyB3YWl0IHRoZSBzZWxlY3Rpb24gdG8gYmUgcmVmbGVjdGVkIGluIHRoZSBET01cclxuICAgICAgICAvLyAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XHJcblxyXG4gICAgICAgIC8vICAgICAgICAgICAgIGlmICh3aW5kb3cuZ2V0U2VsZWN0aW9uKCkhLnRvU3RyaW5nKCkudHJpbSgpICE9PSAnJykge1xyXG5cclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgaWYgKERPTVV0aWxzLmlzU2VsZWN0ZWRUZXh0RGVzY2VuZGFudE9mKFwiLnRpdGxlXCIpKSB7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgdGhpcy5zaG93KCk7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgfVxyXG4gICAgICAgIC8vICAgICAgICAgfSk7XHJcbiAgICAgICAgLy8gICAgIH1cclxuICAgICAgICAvLyB9KTtcclxuXHJcblxyXG4gICAgICAgIC8vIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ29uc2VsZWN0aW9uJywgKGV2ZW50KSA9PiB7XHJcbiAgICAgICAgLy8gICAgIGlmICghdGhpcy5pc1Zpc2libGUpIHtcclxuXHJcbiAgICAgICAgLy8gICAgICAgICAvLyB3YWl0IHRoZSBzZWxlY3Rpb24gdG8gYmUgcmVmbGVjdGVkIGluIHRoZSBET01cclxuICAgICAgICAvLyAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XHJcblxyXG4gICAgICAgIC8vICAgICAgICAgICAgIGlmICh3aW5kb3cuZ2V0U2VsZWN0aW9uKCkhLnRvU3RyaW5nKCkudHJpbSgpICE9PSAnJykge1xyXG5cclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgaWYgKERPTVV0aWxzLmlzU2VsZWN0ZWRUZXh0RGVzY2VuZGFudE9mKFwiLnRpdGxlXCIpKSB7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgdGhpcy5zaG93KCk7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgfVxyXG4gICAgICAgIC8vICAgICAgICAgfSk7XHJcbiAgICAgICAgLy8gICAgIH1cclxuICAgICAgICAvLyB9KTtcclxuXHJcbiAgICAgICAgbGV0IGlzU2VsZWN0aW5nID0gZmFsc2U7XHJcblxyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNldXBcIiwgKGV2ZW50KSA9PiB7IGV2ZW50LnByZXZlbnREZWZhdWx0KCk7IH0pO1xyXG5cclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCAoZXZlbnQpID0+IHtcclxuICAgICAgICAgICAgaWYgKGV2ZW50LnNoaWZ0S2V5KSB7XHJcbiAgICAgICAgICAgICAgICBpc1NlbGVjdGluZyA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImtleXVwXCIsIChldmVudCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoZXZlbnQua2V5ID09PSBcIlNoaWZ0XCIpIHtcclxuICAgICAgICAgICAgICAgIGlzU2VsZWN0aW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dIaWRlKGlzU2VsZWN0aW5nKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGlzU2VsZWN0aW5nID0gdHJ1ZTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIChldmVudCkgPT4ge1xyXG4gICAgICAgICAgICBpc1NlbGVjdGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLnNob3dIaWRlKGlzU2VsZWN0aW5nKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuU2VsZWN0aW9uQ2hhbmdlLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB0aGlzLnNob3dIaWRlKGlzU2VsZWN0aW5nKTtcclxuICAgICAgICB9KTtcclxuXHJcblxyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZXZlbnQpID0+IHtcclxuXHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY2FuSGlkZSAmJiAoZXZlbnQua2V5ID09PSAnRXNjYXBlJykpIHtcclxuXHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmFueURyb3Bkb3duVmlzaWJsZSgpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGlkZUFsbERyb3Bkb3duVmlzaWJsZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSwgMTApO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBzdXBlci5hdHRhY2hFdmVudHMoKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBzaG93SGlkZShpc1NlbGVjdGluZzogYm9vbGVhbikge1xyXG4gICAgLy8gICAgIGNvbnN0IGhhc0NvbnRlbnQgPSB0aGlzLmhhc1NlbGVjdGlvbigpO1xyXG5cclxuICAgIC8vICAgICBpZiAoIWhhc0NvbnRlbnQpIHtcclxuICAgIC8vICAgICAgICAgdGhpcy5oaWRlKCk7XHJcbiAgICAvLyAgICAgfSBlbHNlIGlmIChoYXNDb250ZW50ICYmICFpc1NlbGVjdGluZykge1xyXG4gICAgLy8gICAgICAgICB0aGlzLnNob3coKTtcclxuICAgIC8vICAgICB9XHJcbiAgICAvLyB9XHJcblxyXG4gICAgc2hvdWxkVXBkYXRlUG9zaXRpb24oKTogYm9vbGVhbiB7XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG4gICAgICAgIGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAwKSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgIGNvbnN0IGN1cnJlbnRSZWN0ID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgaWYgKCF0aGlzLmluaXRpYWxSZWN0KSByZXR1cm4gdHJ1ZTtcclxuXHJcbiAgICAgICAgY29uc3QgcG9zaXRpb25DaGFuZ2VkID0gTWF0aC5hYnMoY3VycmVudFJlY3QubGVmdCAtIHRoaXMuaW5pdGlhbFJlY3QubGVmdCkgPiAxMCB8fCBNYXRoLmFicyhjdXJyZW50UmVjdC50b3AgLSB0aGlzLmluaXRpYWxSZWN0LnRvcCkgPiAxMDtcclxuICAgICAgICByZXR1cm4gcG9zaXRpb25DaGFuZ2VkO1xyXG4gICAgfVxyXG5cclxuICAgIHNob3dIaWRlKGlzU2VsZWN0aW5nOiBib29sZWFuKSB7XHJcblxyXG4gICAgICAgIC8vVGhpcyBibG9jayBjaGVja3MgZm9yIGFuIGFjdGl2ZSBzZWxlY3Rpb24gYW5kIHdoZXRoZXIgaXQgY29udGFpbnMgYW55IGNvbnRlbnQuXHJcbiAgICAgICAgLy8gSW4gRmlyZWZveCwgdGhlIGBzZWxlY3Rpb25jaGFuZ2VgIGV2ZW50IG1heSBiZSBmaXJlZCBldmVuIHdoaWxlIHR5cGluZyxcclxuICAgICAgICAvLyB3aGljaCBpcyBub3QgdGhlIGludGVuZGVkIHRyaWdnZXIgc2luY2Ugd2Ugb25seSB3YW50IHRvIHJlYWN0IHRvIGFjdHVhbCBjaGFuZ2VzIGluIHNlbGVjdGlvbi5cclxuICAgICAgICAvLyBJZiB0aGUgc2VsZWN0aW9uIGlzIGVtcHR5IG9yIG51bGwsIHRoZSBmdW5jdGlvbiByZXR1cm5zIGVhcmx5LCBlZmZlY3RpdmVseSBpZ25vcmluZ1xyXG4gICAgICAgIC8vIHRoZXNlIHVud2FudGVkIGBzZWxlY3Rpb25jaGFuZ2VgIGV2ZW50cyBkdXJpbmcgdHlwaW5nLlxyXG4gICAgICAgIFxyXG4gICAgICAgIGNvbnN0IGhhc0NvbnRlbnQgPSB0aGlzLmhhc1NlbGVjdGlvbigpO1xyXG5cclxuICAgICAgICBpZiAoIWhhc0NvbnRlbnQpIHtcclxuICAgICAgICAgICAgdGhpcy5oaWRlKCk7XHJcbiAgICAgICAgICAgIHRoaXMuaW5pdGlhbFJlY3QgPSBudWxsO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoaGFzQ29udGVudCAmJiAhaXNTZWxlY3RpbmcpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmlzVmlzaWJsZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zaG93KCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5zaG91bGRVcGRhdGVQb3NpdGlvbigpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVBvc2l0aW9uKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaGFzU2VsZWN0aW9uKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcclxuICAgICAgICBpZiAoc2VsZWN0aW9uICYmIHNlbGVjdGlvbi5yYW5nZUNvdW50ID4gMCkge1xyXG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZFRleHQgPSBzZWxlY3Rpb24udG9TdHJpbmcoKS50cmltKCk7XHJcbiAgICAgICAgICAgIGlmIChzZWxlY3RlZFRleHQgIT09ICcnKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvLyBzaG93SGlkZSgpIHtcclxuICAgIC8vICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgICAvLyAgICAgaWYgKHNlbGVjdGlvbiAmJiBzZWxlY3Rpb24ucmFuZ2VDb3VudCA+IDApIHtcclxuICAgIC8vICAgICAgICAgY29uc3Qgc2VsZWN0ZWRUZXh0ID0gc2VsZWN0aW9uLnRvU3RyaW5nKCkudHJpbSgpO1xyXG4gICAgLy8gICAgICAgICBpZiAoc2VsZWN0ZWRUZXh0ICE9PSAnJykge1xyXG4gICAgLy8gICAgICAgICAgICAgYWxlcnQoXCJTZWxlY2lvbm91OiBcIiArIHNlbGVjdGVkVGV4dCk7XHJcblxyXG4gICAgLy8gICAgICAgICAgICAgdGhpcy5zaG93KCk7XHJcbiAgICAvLyAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAvLyAgICAgICAgICAgICB0aGlzLmhpZGUoKTtcclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgIH1cclxuICAgIC8vIH1cclxuXHJcblxyXG4gICAgY2hhbmdlVG9vbGJhclBvc2l0aW9uVG9CZUNsb3NlZFRvU2VsZWN0aW9uKCk6IHZvaWQge1xyXG5cclxuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcblxyXG4gICAgICAgIGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAwKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ05vIHNlbGVjdGlvbiBmb3VuZCcpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmN1cnJlbnRTZWxlY3Rpb25SYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xyXG4gICAgICAgIGNvbnN0IHJlY3QgPSB0aGlzLmN1cnJlbnRTZWxlY3Rpb25SYW5nZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLmluaXRpYWxSZWN0KSB7XHJcbiAgICAgICAgICAgIHRoaXMuaW5pdGlhbFJlY3QgPSByZWN0O1xyXG4gICAgICAgICAgICB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBlbGVtZW50V2lkdGggPSB0aGlzLmh0bWxFbGVtZW50Lm9mZnNldFdpZHRoO1xyXG4gICAgICAgICAgICBsZXQgbGVmdFBvc2l0aW9uID0gcmVjdC5sZWZ0ICsgd2luZG93LnNjcm9sbFggLSA1MDtcclxuXHJcbiAgICAgICAgICAgIGlmIChsZWZ0UG9zaXRpb24gKyBlbGVtZW50V2lkdGggPiB3aW5kb3cuaW5uZXJXaWR0aCkge1xyXG4gICAgICAgICAgICAgICAgbGVmdFBvc2l0aW9uID0gd2luZG93LmlubmVyV2lkdGggLSBlbGVtZW50V2lkdGggLSAyMDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3QgZWxlbWVudEhlaWdodCA9IHRoaXMuaHRtbEVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xyXG4gICAgICAgICAgICBsZXQgdG9wUG9zaXRpb24gPSByZWN0LnRvcCArIHdpbmRvdy5zY3JvbGxZIC0gZWxlbWVudEhlaWdodCAtIDEwO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRvcFBvc2l0aW9uIDwgMCkge1xyXG4gICAgICAgICAgICAgICAgdG9wUG9zaXRpb24gPSByZWN0LmJvdHRvbSArIHdpbmRvdy5zY3JvbGxZICsgMTA7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUubGVmdCA9IGAke2xlZnRQb3NpdGlvbn1weGA7XHJcbiAgICAgICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUudG9wID0gYCR7dG9wUG9zaXRpb259cHhgO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzaG93KCk6IHZvaWQge1xyXG5cclxuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcblxyXG4gICAgICAgIGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAwKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ05vIHNlbGVjdGlvbiBmb3VuZCcpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZihET01VdGlscy5maW5kQ2xvc2VzdEFuY2VzdG9yT2ZBY3RpdmVFbGVtZW50QnlDbGFzcyhcInRpdGxlXCIpKXtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHRoaXMuY2hhbmdlVG9vbGJhclBvc2l0aW9uVG9CZUNsb3NlZFRvU2VsZWN0aW9uKCk7XHJcbiAgICAgICAgdGhpcy5oaWRlVHVybkludG9Ecm9wZG93bklmSW5DZWxsKCk7XHJcbiAgICAgICAgc3VwZXIuc2hvdygpO1xyXG4gICAgfVxyXG5cclxuICAgIGhpZGVUdXJuSW50b0Ryb3Bkb3duSWZJbkNlbGwoKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgaXNDZWxsID0gRE9NVXRpbHMuaXNTZWxlY3Rpb25JblRhYmxlQ2VsbCgpO1xyXG5cclxuICAgICAgICB0aGlzLmRyb3Bkb3ducy5mb3JFYWNoKGRyb3Bkb3duID0+IHtcclxuICAgICAgICAgICAgaWYgKGRyb3Bkb3duLmlkID09IFwidHVybkludG9NZW51XCIpIHtcclxuICAgICAgICAgICAgICAgIGlmIChpc0NlbGwpIHtcclxuICAgICAgICAgICAgICAgICAgICBkcm9wZG93bi5odG1sRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGRyb3Bkb3duLmh0bWxFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSB0aGlzLmRpc3BsYXk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5zZXBhcmF0b3JzLmZvckVhY2goc2VwYXJhdG9yID0+IHtcclxuICAgICAgICAgICAgaWYgKHNlcGFyYXRvci5pZCA9PSBcInR1cm5JbnRvU2VwYXJhdG9yXCIpIHtcclxuICAgICAgICAgICAgICAgIGlmIChpc0NlbGwpIHtcclxuICAgICAgICAgICAgICAgICAgICBzZXBhcmF0b3IuaHRtbEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBzZXBhcmF0b3IuaHRtbEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9IHRoaXMuZGlzcGxheTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHVwZGF0ZVBvc2l0aW9uKCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcclxuICAgICAgICBpZiAoc2VsZWN0aW9uICYmIHNlbGVjdGlvbi5yYW5nZUNvdW50ID4gMCkge1xyXG4gICAgICAgICAgICBjb25zdCByZWN0ID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0UG9zaXRpb24ocmVjdCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHNldFBvc2l0aW9uKHJlY3Q6IERPTVJlY3QpIHtcclxuICAgICAgICBjb25zdCBlbGVtZW50V2lkdGggPSB0aGlzLmh0bWxFbGVtZW50Lm9mZnNldFdpZHRoO1xyXG4gICAgICAgIGxldCBsZWZ0UG9zaXRpb24gPSByZWN0LmxlZnQgKyB3aW5kb3cuc2Nyb2xsWCAtIDUwO1xyXG5cclxuICAgICAgICBpZiAobGVmdFBvc2l0aW9uICsgZWxlbWVudFdpZHRoID4gd2luZG93LmlubmVyV2lkdGgpIHtcclxuICAgICAgICAgICAgbGVmdFBvc2l0aW9uID0gd2luZG93LmlubmVyV2lkdGggLSBlbGVtZW50V2lkdGggLSAyMDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGVsZW1lbnRIZWlnaHQgPSB0aGlzLmh0bWxFbGVtZW50Lm9mZnNldEhlaWdodDtcclxuICAgICAgICBsZXQgdG9wUG9zaXRpb24gPSByZWN0LnRvcCArIHdpbmRvdy5zY3JvbGxZIC0gZWxlbWVudEhlaWdodCAtIDEwO1xyXG5cclxuICAgICAgICBpZiAodG9wUG9zaXRpb24gPCAwKSB7XHJcbiAgICAgICAgICAgIHRvcFBvc2l0aW9uID0gcmVjdC5ib3R0b20gKyB3aW5kb3cuc2Nyb2xsWSArIDEwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5zdHlsZS5sZWZ0ID0gYCR7bGVmdFBvc2l0aW9ufXB4YDtcclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLnRvcCA9IGAke3RvcFBvc2l0aW9ufXB4YDtcclxuICAgIH1cclxuXHJcbiAgICBoaWRlKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLmNhbkhpZGUpIHtcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50U2VsZWN0aW9uUmFuZ2UgPSBudWxsO1xyXG4gICAgICAgICAgICBzdXBlci5oaWRlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgRHJvcGRvd25NZW51IH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvZmxvYXRpbmctdG9vbGJhci9kcm9wZG93bi10b29sL0Ryb3Bkb3duTWVudVwiO1xyXG5pbXBvcnQgeyBEcm9wZG93bk1lbnVMaXN0IH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvZmxvYXRpbmctdG9vbGJhci9kcm9wZG93bi10b29sL0Ryb3Bkb3duTWVudUxpc3RcIjtcclxuaW1wb3J0IHsgRHJvcGRvd25NZW51TGlzdEl0ZW0gfSBmcm9tIFwiLi4vY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL2Ryb3Bkb3duLXRvb2wvRHJvcGRvd25NZW51TGlzdEl0ZW1cIjtcclxuaW1wb3J0IHsgU1ZHSWNvbiB9IGZyb20gXCIuLi9jb21wb25lbnRzL2NvbW1vbi9TVkdJY29uXCI7XHJcbmltcG9ydCB7IEZsb2F0aW5nVG9vbGJhclNlcGFyYXRvciB9IGZyb20gXCIuLi9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvc2VwYXJhdG9yL0Zsb2F0aW5nVG9vbGJhclNlcGFyYXRvclwiO1xyXG5pbXBvcnQgeyBCdXR0b25Hcm91cCB9IGZyb20gXCIuLi9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvYnV0dG9uLWdyb3VwL0J1dHRvbkdyb3VwXCI7XHJcbmltcG9ydCB7IEJ1dHRvbkdyb3VwSXRlbSB9IGZyb20gXCIuLi9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvYnV0dG9uLWdyb3VwL0J1dHRvbkdyb3VwSXRlbVwiO1xyXG5pbXBvcnQgeyBDb2xvckljb24gfSBmcm9tIFwiLi4vY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL2Ryb3Bkb3duLXRvb2wvQ29sb3JJY29uXCI7XHJcbmltcG9ydCB7IERyb3Bkb3duTWVudUJ1dHRvbiB9IGZyb20gXCIuLi9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvZHJvcGRvd24tdG9vbC9Ecm9wZG93bk1lbnVCdXR0b25cIjtcclxuaW1wb3J0IHsgQmxvY2tPcGVyYXRpb25zU2VydmljZSB9IGZyb20gXCIuLi9zZXJ2aWNlcy9ibG9jay1vcGVyYXRpb25zL0Jsb2NrT3BlcmF0aW9uc1NlcnZpY2VcIjtcclxuaW1wb3J0IHsgRHJvcGRvd25NZW51TGlzdEl0ZW1UaXRsZSB9IGZyb20gXCJAL2NvbXBvbmVudHMvZmxvYXRpbmctdG9vbGJhci9kcm9wZG93bi10b29sL0Ryb3Bkb3duTWVudUxpc3RJdGVtVGl0bGVcIjtcclxuaW1wb3J0IHsgRWxlbWVudEZhY3RvcnlTZXJ2aWNlIH0gZnJvbSBcIkAvc2VydmljZXMvZWxlbWVudC1mYWN0b3J5L0VsZW1lbnRGYWN0b3J5U2VydmljZVwiO1xyXG5pbXBvcnQgeyBDb21tYW5kcyB9IGZyb20gXCJAL2NvbW1hbmRzL0NvbW1hbmRzXCI7XHJcbmltcG9ydCB7IEljb25zIH0gZnJvbSBcIkAvY29tbW9uL0ljb25zXCI7XHJcbmltcG9ydCB7IFNpemVzIH0gZnJvbSBcIkAvY29tbW9uL1NpemVzXCI7XHJcbmltcG9ydCB7IENvbG9ycyB9IGZyb20gXCJAL2NvbW1vbi9Db2xvcnNcIjtcclxuaW1wb3J0IHsgVGV4dENvbnRleHRGbG9hdGluZ1Rvb2xiYXIgfSBmcm9tIFwiQC9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvVGV4dENvbnRleHRGbG9hdGluZ1Rvb2xiYXJcIjtcclxuaW1wb3J0IHsgQnV0dG9uSURzIH0gZnJvbSBcIkAvY29yZS9CdXR0b25JRHNcIjtcclxuaW1wb3J0IHsgRHJvcGRvd25JdGVtSURzIH0gZnJvbSBcIkAvY29yZS9Ecm9wZG93bkl0ZW1JRHNcIjtcclxuaW1wb3J0IHsgRHJvcGRvd25MaXN0SURzIH0gZnJvbSBcIkAvY29yZS9Ecm9wZG93bkxpc3RJRHNcIjtcclxuaW1wb3J0IHsgRHJvcGRvd25NZW51SURzIH0gZnJvbSBcIkAvY29yZS9Ecm9wZG93bk1lbnVJRHNcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBUZXh0Q29udGV4dEZsb2F0aW5nVG9vbGJhckJ1aWxkZXIge1xyXG5cclxuICAgIHN0YXRpYyBidWlsZCgpOiBUZXh0Q29udGV4dEZsb2F0aW5nVG9vbGJhciB7XHJcblxyXG4gICAgICAgIGNvbnN0IGlkID0gXCJcIlxyXG4gICAgICAgIGNvbnN0IGZsb2F0aW5nQmFyID0gVGV4dENvbnRleHRGbG9hdGluZ1Rvb2xiYXIuZ2V0SW5zdGFuY2UoKTtcclxuXHJcbiAgICAgICAgZmxvYXRpbmdCYXIuYXBwZW5kRHJvcGRvd24oVGV4dENvbnRleHRGbG9hdGluZ1Rvb2xiYXJCdWlsZGVyLnR1cm5JbnRvRHJvcGRvd24oKSk7XHJcbiAgICAgICAgZmxvYXRpbmdCYXIuYXBwZW5kU2VwYXJhdG9yKFRleHRDb250ZXh0RmxvYXRpbmdUb29sYmFyQnVpbGRlci5zZXBhcmF0b3IoXCJ0dXJuSW50b1NlcGFyYXRvclwiKSk7XHJcbiAgICAgICAgZmxvYXRpbmdCYXIuYXBwZW5kQnV0dG9uR3JvdXAoVGV4dENvbnRleHRGbG9hdGluZ1Rvb2xiYXJCdWlsZGVyLmJ1dHRvbkdyb3VwKCkpO1xyXG4gICAgICAgIGZsb2F0aW5nQmFyLmFwcGVuZERyb3Bkb3duKFRleHRDb250ZXh0RmxvYXRpbmdUb29sYmFyQnVpbGRlci5jb2xvckRyb3Bkb3duKCkpO1xyXG4gICAgICAgIGZsb2F0aW5nQmFyLmFwcGVuZFNlcGFyYXRvcihUZXh0Q29udGV4dEZsb2F0aW5nVG9vbGJhckJ1aWxkZXIuc2VwYXJhdG9yKFwidGV4dE9wZXJhdGlvbnNTZXBhcmF0b3JcIikpO1xyXG4gICAgICAgIGZsb2F0aW5nQmFyLmFwcGVuZERyb3Bkb3duKFRleHRDb250ZXh0RmxvYXRpbmdUb29sYmFyQnVpbGRlci5tb3JlT3B0aW9uc0Ryb3Bkb3duKCkpO1xyXG5cclxuICAgICAgICByZXR1cm4gZmxvYXRpbmdCYXI7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIHR1cm5JbnRvRHJvcGRvd24oKTogRHJvcGRvd25NZW51IHtcclxuXHJcbiAgICAgICAgY29uc3QgdHVybkludG9CYXJMaXN0ID0gbmV3IERyb3Bkb3duTWVudUxpc3QoXCJ0dXJuSW50b1NlbGVjdFwiKTtcclxuICAgICAgICBjb25zdCB0dXJuSW50b0JhckJ1dHRvbiA9IG5ldyBEcm9wZG93bk1lbnVCdXR0b24oXCJ0dXJuSW50b0J1dHRvblwiLCBcIlRleHRcIiwgdHVybkludG9CYXJMaXN0KTtcclxuICAgICAgICBjb25zdCB0dXJuSW50b0Ryb3Bkb3duID0gbmV3IERyb3Bkb3duTWVudShcInR1cm5JbnRvTWVudVwiLCB0dXJuSW50b0JhckJ1dHRvbiwgdHVybkludG9CYXJMaXN0KTtcclxuXHJcbiAgICAgICAgdHVybkludG9CYXJMaXN0LmFwcGVuZChuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW1UaXRsZSh0dXJuSW50b0Jhckxpc3QsIFwiVHVybiBpbnRvXCIpKTtcclxuXHJcbiAgICAgICAgdHVybkludG9CYXJMaXN0LmFwcGVuZChuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW0oXCJ0dXJuSW50b09wdGlvblRleHRcIiwgdHVybkludG9CYXJMaXN0LCBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLkJMT0NLX09QRVJBVElPTlMuVFJBTlNGT1JNX0JMT0NLLCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5QQVJBR1JBUEgsIFNWR0ljb25zLnBhcmFncmFwaC5odG1sRWxlbWVudCwgXCJUZXh0XCIsIFwiQ3RybCtTaGlmdCtFbnRlclwiKSk7XHJcbiAgICAgICAgdHVybkludG9CYXJMaXN0LmFwcGVuZChuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW0oXCJ0dXJuSW50b09wdGlvblRvZG9MaXN0XCIsIHR1cm5JbnRvQmFyTGlzdCwgQmxvY2tPcGVyYXRpb25zU2VydmljZS5CTE9DS19PUEVSQVRJT05TLlRSQU5TRk9STV9CTE9DSywgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuQ0hFQ0tfTElTVCwgU1ZHSWNvbnMudG9kb19saXN0Lmh0bWxFbGVtZW50LCBcIlRvZG8gbGlzdFwiLCBcIkN0cmwrMVwiKSk7XHJcbiAgICAgICAgdHVybkludG9CYXJMaXN0LmFwcGVuZChuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW0oXCJ0dXJuSW50b09wdGlvbkJ1bGxldGVkTGlzdFwiLCB0dXJuSW50b0Jhckxpc3QsIEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuQkxPQ0tfT1BFUkFUSU9OUy5UUkFOU0ZPUk1fQkxPQ0ssIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkJVTExFVEVEX0xJU1QsIFNWR0ljb25zLmJfbGlzdC5odG1sRWxlbWVudCwgXCJCdWxsZXRlZCBsaXN0XCIsIFwiQ3RybCsuXCIpKTtcclxuICAgICAgICB0dXJuSW50b0Jhckxpc3QuYXBwZW5kKG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcInR1cm5JbnRvT3B0aW9uTnVtYmVyZWRMaXN0XCIsIHR1cm5JbnRvQmFyTGlzdCwgQmxvY2tPcGVyYXRpb25zU2VydmljZS5CTE9DS19PUEVSQVRJT05TLlRSQU5TRk9STV9CTE9DSywgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuTlVNQkVSRURfTElTVCwgU1ZHSWNvbnMubl9saXN0Lmh0bWxFbGVtZW50LCBcIk51bWJlcmVkIGxpc3RcIiwgXCJDdHJsKy9cIikpO1xyXG4gICAgICAgIHR1cm5JbnRvQmFyTGlzdC5hcHBlbmQobmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwidHVybkludG9PcHRpb25CbG9ja0NvZGVcIiwgdHVybkludG9CYXJMaXN0LCBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLkJMT0NLX09QRVJBVElPTlMuVFJBTlNGT1JNX0JMT0NLLCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5DT0RFLCBTVkdJY29ucy5jb2RlLmh0bWxFbGVtZW50LCBcIkJsb2NrIGNvZGVcIikpO1xyXG4gICAgICAgIHR1cm5JbnRvQmFyTGlzdC5hcHBlbmQobmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwidHVybkludG9PcHRpb25RdW90ZVwiLCB0dXJuSW50b0Jhckxpc3QsIEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuQkxPQ0tfT1BFUkFUSU9OUy5UUkFOU0ZPUk1fQkxPQ0ssIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLlFVT1RFLCBTVkdJY29ucy5xdW90ZS5odG1sRWxlbWVudCwgXCJRdW90ZVwiKSk7XHJcbiAgICAgICAgdHVybkludG9CYXJMaXN0LmFwcGVuZChuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW0oXCJ0dXJuSW50b09wdGlvbkhlYWRpbmcxXCIsIHR1cm5JbnRvQmFyTGlzdCwgQmxvY2tPcGVyYXRpb25zU2VydmljZS5CTE9DS19PUEVSQVRJT05TLlRSQU5TRk9STV9CTE9DSywgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuSEVBREVSXzEsIFNWR0ljb25zLmhlYWQxLmh0bWxFbGVtZW50LCBcIkhlYWRpbmcgMVwiLCBcIkN0cmwrQWx0KzFcIikpO1xyXG4gICAgICAgIHR1cm5JbnRvQmFyTGlzdC5hcHBlbmQobmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwidHVybkludG9PcHRpb25IZWFkaW5nMlwiLCB0dXJuSW50b0Jhckxpc3QsIEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuQkxPQ0tfT1BFUkFUSU9OUy5UUkFOU0ZPUk1fQkxPQ0ssIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl8yLCBTVkdJY29ucy5oZWFkMi5odG1sRWxlbWVudCwgXCJIZWFkaW5nIDJcIiwgXCJDdHJsK0FsdCsyXCIpKTtcclxuICAgICAgICB0dXJuSW50b0Jhckxpc3QuYXBwZW5kKG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcInR1cm5JbnRvT3B0aW9uSGVhZGluZzNcIiwgdHVybkludG9CYXJMaXN0LCBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLkJMT0NLX09QRVJBVElPTlMuVFJBTlNGT1JNX0JMT0NLLCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfMywgU1ZHSWNvbnMuaGVhZDMuaHRtbEVsZW1lbnQsIFwiSGVhZGluZyAzXCIsIFwiQ3RybCtBbHQrM1wiKSk7XHJcbiAgICAgICAgdHVybkludG9CYXJMaXN0LmFwcGVuZChuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW0oXCJ0dXJuSW50b09wdGlvbkhlYWRpbmc0XCIsIHR1cm5JbnRvQmFyTGlzdCwgQmxvY2tPcGVyYXRpb25zU2VydmljZS5CTE9DS19PUEVSQVRJT05TLlRSQU5TRk9STV9CTE9DSywgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuSEVBREVSXzQsIFNWR0ljb25zLmhlYWQ0Lmh0bWxFbGVtZW50LCBcIkhlYWRpbmcgNFwiLCBcIkN0cmwrQWx0KzRcIikpO1xyXG4gICAgICAgIHR1cm5JbnRvQmFyTGlzdC5hcHBlbmQobmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwidHVybkludG9PcHRpb25IZWFkaW5nNVwiLCB0dXJuSW50b0Jhckxpc3QsIEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuQkxPQ0tfT1BFUkFUSU9OUy5UUkFOU0ZPUk1fQkxPQ0ssIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl81LCBTVkdJY29ucy5oZWFkNS5odG1sRWxlbWVudCwgXCJIZWFkaW5nIDVcIiwgXCJDdHJsK0FsdCs1XCIpKTtcclxuICAgICAgICB0dXJuSW50b0Jhckxpc3QuYXBwZW5kKG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcInR1cm5JbnRvT3B0aW9uSGVhZGluZzZcIiwgdHVybkludG9CYXJMaXN0LCBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLkJMT0NLX09QRVJBVElPTlMuVFJBTlNGT1JNX0JMT0NLLCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfNiwgU1ZHSWNvbnMuaGVhZDYuaHRtbEVsZW1lbnQsIFwiSGVhZGluZyA2XCIsIFwiQ3RybCtBbHQrNlwiKSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0dXJuSW50b0Ryb3Bkb3duO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBzZXBhcmF0b3IoaWQ6IHN0cmluZyk6IEZsb2F0aW5nVG9vbGJhclNlcGFyYXRvciB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBGbG9hdGluZ1Rvb2xiYXJTZXBhcmF0b3IoaWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBidXR0b25Hcm91cCgpOiBCdXR0b25Hcm91cCB7XHJcbiAgICAgICAgY29uc3QgZ3JvdXBCdXR0b24gPSBuZXcgQnV0dG9uR3JvdXAoKTtcclxuXHJcbiAgICAgICAgQnV0dG9uR3JvdXBJdGVtLmNyZWF0ZShCdXR0b25JRHMuTGluaywgQ29tbWFuZHMudG9nZ2xlTGluaywgXCJMaW5rXCIsIFNWR0ljb24uY3JlYXRlKEljb25zLkxpbmssIFNpemVzLmxhcmdlKSkuYXBwZW5kVG8oZ3JvdXBCdXR0b24pO1xyXG4gICAgICAgIEJ1dHRvbkdyb3VwSXRlbS5jcmVhdGUoQnV0dG9uSURzLkJvbGQsIENvbW1hbmRzLnRvZ2dsZUJvbGQsIFwiQm9sZFwiLCBTVkdJY29uLmNyZWF0ZShJY29ucy5Cb2xkLCBTaXplcy5sYXJnZSkpLmFwcGVuZFRvKGdyb3VwQnV0dG9uKTtcclxuICAgICAgICBCdXR0b25Hcm91cEl0ZW0uY3JlYXRlKEJ1dHRvbklEcy5JdGFsaWMsIENvbW1hbmRzLnRvZ2dsZUl0YWxpYywgXCJJdGFsaWNcIiwgU1ZHSWNvbi5jcmVhdGUoSWNvbnMuSXRhbGljLCBTaXplcy5sYXJnZSkpLmFwcGVuZFRvKGdyb3VwQnV0dG9uKTtcclxuICAgICAgICBCdXR0b25Hcm91cEl0ZW0uY3JlYXRlKEJ1dHRvbklEcy5VbmRlcmxpbmUsIENvbW1hbmRzLnRvZ2dsZVVuZGVybGluZSwgXCJVbmRlcmxpbmVcIiwgU1ZHSWNvbi5jcmVhdGUoSWNvbnMuVW5kZXJsaW5lLCBTaXplcy5sYXJnZSkpLmFwcGVuZFRvKGdyb3VwQnV0dG9uKTtcclxuICAgICAgICBCdXR0b25Hcm91cEl0ZW0uY3JlYXRlKEJ1dHRvbklEcy5JbmxpbmVDb2RlLCBDb21tYW5kcy50b2dnbGVJbmxpbmVDb2RlLCBcIkNvZGVcIiwgU1ZHSWNvbi5jcmVhdGUoSWNvbnMuSW5saW5lQ29kZSwgU2l6ZXMubGFyZ2UpKS5hcHBlbmRUbyhncm91cEJ1dHRvbik7XHJcbiAgICAgICAgQnV0dG9uR3JvdXBJdGVtLmNyZWF0ZShCdXR0b25JRHMuU3RyaWtldGhyb3VnaCwgQ29tbWFuZHMudG9nZ2xlU3RyaWtlVGhyb3VnaCwgXCJTdHJpa2UtdGhyb3VnaFwiLCBTVkdJY29uLmNyZWF0ZShJY29ucy5TdHJpa2VUaHJvdWdoLCBTaXplcy5sYXJnZSkpLmFwcGVuZFRvKGdyb3VwQnV0dG9uKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGdyb3VwQnV0dG9uO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBjb2xvckRyb3Bkb3duKCk6IERyb3Bkb3duTWVudSB7XHJcblxyXG4gICAgICAgIGNvbnN0IGNvbG9yRHJvcGRvd25MaXN0ID0gbmV3IERyb3Bkb3duTWVudUxpc3QoRHJvcGRvd25MaXN0SURzLkNvbG9yVGV4dE9wdGlvblNlbGVjdCk7XHJcbiAgICAgICAgY29uc3QgY29sb3JCdXR0b24gPSBuZXcgRHJvcGRvd25NZW51QnV0dG9uKFwiY29sb3JUZXh0QnV0dG9uXCIsIG5ldyBDb2xvckljb24oXCIjRkFGNEQxXCIpLmh0bWxFbGVtZW50LCBjb2xvckRyb3Bkb3duTGlzdCk7XHJcbiAgICAgICAgY29uc3QgY29sb3JEcm9wZG93biA9IG5ldyBEcm9wZG93bk1lbnUoRHJvcGRvd25NZW51SURzLkNvbG9yVGV4dE9wdGlvbnNNZW51LCBjb2xvckJ1dHRvbiwgY29sb3JEcm9wZG93bkxpc3QpO1xyXG5cclxuICAgICAgICBjb2xvckRyb3Bkb3duTGlzdC5hcHBlbmQobmV3IERyb3Bkb3duTWVudUxpc3RJdGVtVGl0bGUoY29sb3JEcm9wZG93bkxpc3QsIFwiQmFja2dyb3VuZFwiKSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGhpbGl0ZUNvbG9yUmVkID0gbmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKERyb3Bkb3duSXRlbUlEcy5CYWNrZ3JvdW5kT3B0aW9uUmVkLCBjb2xvckRyb3Bkb3duTGlzdCwgQ29tbWFuZHMudG9nZ2xlSGlsaXRlQ29sb3IsIENvbG9ycy5IaWxpdGVDb2xvclJlZCwgbmV3IENvbG9ySWNvbihDb2xvcnMuSGlsaXRlQ29sb3JSZWQpLmh0bWxFbGVtZW50LCBcIlJlZFwiKTtcclxuICAgICAgICBoaWxpdGVDb2xvclJlZC5hZGRDbGFzcyhcImhpbGl0ZUNvbG9yXCIpO1xyXG5cclxuICAgICAgICBjb25zdCBIaWxpdGVDb2xvckdyZWVuID0gbmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKERyb3Bkb3duSXRlbUlEcy5CYWNrZ3JvdW5kT3B0aW9uR3JlZW4sIGNvbG9yRHJvcGRvd25MaXN0LCBDb21tYW5kcy50b2dnbGVIaWxpdGVDb2xvciwgQ29sb3JzLkhpbGl0ZUNvbG9yR3JlZW4sIG5ldyBDb2xvckljb24oQ29sb3JzLkhpbGl0ZUNvbG9yR3JlZW4pLmh0bWxFbGVtZW50LCBcIkdyZWVuXCIpO1xyXG4gICAgICAgIEhpbGl0ZUNvbG9yR3JlZW4uYWRkQ2xhc3MoXCJoaWxpdGVDb2xvclwiKTtcclxuXHJcbiAgICAgICAgY29uc3QgaGlsaXRlQ29sb3JCbHVlID0gbmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKERyb3Bkb3duSXRlbUlEcy5CYWNrZ3JvdW5kT3B0aW9uQmx1ZSwgY29sb3JEcm9wZG93bkxpc3QsIENvbW1hbmRzLnRvZ2dsZUhpbGl0ZUNvbG9yLCBDb2xvcnMuSGlsaXRlQ29sb3JCbHVlLCBuZXcgQ29sb3JJY29uKENvbG9ycy5IaWxpdGVDb2xvckJsdWUpLmh0bWxFbGVtZW50LCBcIkJsdWVcIik7XHJcbiAgICAgICAgaGlsaXRlQ29sb3JCbHVlLmFkZENsYXNzKFwiaGlsaXRlQ29sb3JcIik7XHJcblxyXG4gICAgICAgIGNvbnN0IGhpbGl0ZUNvbG9yWWVsbG93ID0gbmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKERyb3Bkb3duSXRlbUlEcy5CYWNrZ3JvdW5kT3B0aW9uWWVsbG93LCBjb2xvckRyb3Bkb3duTGlzdCwgQ29tbWFuZHMudG9nZ2xlSGlsaXRlQ29sb3IsIENvbG9ycy5IaWxpdGVDb2xvclllbGxvdywgbmV3IENvbG9ySWNvbihDb2xvcnMuSGlsaXRlQ29sb3JZZWxsb3cpLmh0bWxFbGVtZW50LCBcIlllbGxvd1wiKTtcclxuICAgICAgICBoaWxpdGVDb2xvclllbGxvdy5hZGRDbGFzcyhcImhpbGl0ZUNvbG9yXCIpO1xyXG5cclxuICAgICAgICBjb25zdCBoaWxpdGVDb2xvckdyZXkgPSBuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW0oRHJvcGRvd25JdGVtSURzLkJhY2tncm91bmRPcHRpb25HcmV5LCBjb2xvckRyb3Bkb3duTGlzdCwgQ29tbWFuZHMudG9nZ2xlSGlsaXRlQ29sb3IsIENvbG9ycy5IaWxpdGVDb2xvckdyZXksIG5ldyBDb2xvckljb24oQ29sb3JzLkhpbGl0ZUNvbG9yR3JleSkuaHRtbEVsZW1lbnQsIFwiR3JleVwiKTtcclxuICAgICAgICBoaWxpdGVDb2xvckdyZXkuYWRkQ2xhc3MoXCJoaWxpdGVDb2xvclwiKTtcclxuXHJcbiAgICAgICAgY29uc3QgaGlsaXRlQ29sb3JOb25lID0gbmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKERyb3Bkb3duSXRlbUlEcy5CYWNrZ3JvdW5kT3B0aW9uTm9uZSwgY29sb3JEcm9wZG93bkxpc3QsIENvbW1hbmRzLnRvZ2dsZUhpbGl0ZUNvbG9yLCBDb2xvcnMuSGlsaXRlQ29sb3JOb25lLCBuZXcgQ29sb3JJY29uKENvbG9ycy5IaWxpdGVDb2xvck5vbmUpLmh0bWxFbGVtZW50LCBcIk5vbmVcIik7XHJcbiAgICAgICAgaGlsaXRlQ29sb3JOb25lLmFkZENsYXNzKFwiaGlsaXRlQ29sb3JcIik7XHJcblxyXG4gICAgICAgIGNvbG9yRHJvcGRvd25MaXN0LmFwcGVuZChoaWxpdGVDb2xvclJlZCk7XHJcbiAgICAgICAgY29sb3JEcm9wZG93bkxpc3QuYXBwZW5kKEhpbGl0ZUNvbG9yR3JlZW4pO1xyXG4gICAgICAgIGNvbG9yRHJvcGRvd25MaXN0LmFwcGVuZChoaWxpdGVDb2xvckJsdWUpO1xyXG4gICAgICAgIGNvbG9yRHJvcGRvd25MaXN0LmFwcGVuZChoaWxpdGVDb2xvclllbGxvdyk7XHJcbiAgICAgICAgY29sb3JEcm9wZG93bkxpc3QuYXBwZW5kKGhpbGl0ZUNvbG9yR3JleSk7XHJcbiAgICAgICAgY29sb3JEcm9wZG93bkxpc3QuYXBwZW5kKGhpbGl0ZUNvbG9yTm9uZSk7XHJcblxyXG4gICAgICAgIGNvbG9yRHJvcGRvd25MaXN0LmFwcGVuZChuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW1UaXRsZShjb2xvckRyb3Bkb3duTGlzdCwgXCJDb2xvclwiKSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGZvcmVDb2xvclJlZCA9IG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcImNvbG9yT3B0aW9uUmVkXCIsIGNvbG9yRHJvcGRvd25MaXN0LCBDb21tYW5kcy50b2dnbGVGb3JlQ29sb3IsIENvbG9ycy5Gb3JlQ29sb3JSZWQsIG5ldyBTVkdJY29uKFwiaWNvbi1tYXRlcmlhbC1mb3JtYXRcIiwgU2l6ZXMubGFyZ2UpLmh0bWxFbGVtZW50LCBcIlJlZFwiKTtcclxuICAgICAgICBmb3JlQ29sb3JSZWQuYWRkQ2xhc3MoXCJmb3JlQ29sb3JcIik7XHJcblxyXG4gICAgICAgIGNvbnN0IGZvcmVDb2xvckdyZWVuID0gbmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwiY29sb3JPcHRpb25HcmVlblwiLCBjb2xvckRyb3Bkb3duTGlzdCwgQ29tbWFuZHMudG9nZ2xlRm9yZUNvbG9yLCBDb2xvcnMuRm9yZUNvbG9yR3JlZW4sIG5ldyBTVkdJY29uKFwiaWNvbi1tYXRlcmlhbC1mb3JtYXRcIiwgU2l6ZXMubGFyZ2UpLmh0bWxFbGVtZW50LCBcIkdyZWVuXCIpO1xyXG4gICAgICAgIGZvcmVDb2xvckdyZWVuLmFkZENsYXNzKFwiZm9yZUNvbG9yXCIpO1xyXG5cclxuICAgICAgICBjb25zdCBmb3JlQ29sb3JCbHVlID0gbmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwiY29sb3JPcHRpb25CbHVlXCIsIGNvbG9yRHJvcGRvd25MaXN0LCBDb21tYW5kcy50b2dnbGVGb3JlQ29sb3IsIENvbG9ycy5Gb3JlQ29sb3JCbHVlLCBuZXcgU1ZHSWNvbihcImljb24tbWF0ZXJpYWwtZm9ybWF0XCIsIFNpemVzLmxhcmdlKS5odG1sRWxlbWVudCwgXCJCbHVlXCIpO1xyXG4gICAgICAgIGZvcmVDb2xvckJsdWUuYWRkQ2xhc3MoXCJmb3JlQ29sb3JcIik7XHJcblxyXG4gICAgICAgIGNvbnN0IGZvcmVDb2xvclllbGxvdyA9IG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcImNvbG9yT3B0aW9uWWVsbG93XCIsIGNvbG9yRHJvcGRvd25MaXN0LCBDb21tYW5kcy50b2dnbGVGb3JlQ29sb3IsIENvbG9ycy5Gb3JlQ29sb3JZZWxsb3csIG5ldyBTVkdJY29uKFwiaWNvbi1tYXRlcmlhbC1mb3JtYXRcIiwgU2l6ZXMubGFyZ2UpLmh0bWxFbGVtZW50LCBcIlllbGxvd1wiKTtcclxuICAgICAgICBmb3JlQ29sb3JZZWxsb3cuYWRkQ2xhc3MoXCJmb3JlQ29sb3JcIik7XHJcblxyXG4gICAgICAgIGNvbnN0IGZvcmVDb2xvckdyZXkgPSBuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW0oXCJjb2xvck9wdGlvbkdyZXlcIiwgY29sb3JEcm9wZG93bkxpc3QsIENvbW1hbmRzLnRvZ2dsZUZvcmVDb2xvciwgQ29sb3JzLkZvcmVDb2xvckdyZXksIG5ldyBTVkdJY29uKFwiaWNvbi1tYXRlcmlhbC1mb3JtYXRcIiwgU2l6ZXMubGFyZ2UpLmh0bWxFbGVtZW50LCBcIkdyZXlcIik7XHJcbiAgICAgICAgZm9yZUNvbG9yR3JleS5hZGRDbGFzcyhcImZvcmVDb2xvclwiKTtcclxuXHJcbiAgICAgICAgY29uc3QgZm9yZUNvbG9yTm9uZSA9IG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcImNvbG9yT3B0aW9uTm9uZVwiLCBjb2xvckRyb3Bkb3duTGlzdCwgQ29tbWFuZHMudG9nZ2xlRm9yZUNvbG9yLCBDb2xvcnMuRm9yZUNvbG9ySW5pdGlhbCwgbmV3IFNWR0ljb24oXCJpY29uLW1hdGVyaWFsLWZvcm1hdFwiLCBTaXplcy5sYXJnZSkuaHRtbEVsZW1lbnQsIFwiTm9uZVwiKTtcclxuICAgICAgICBmb3JlQ29sb3JOb25lLmFkZENsYXNzKFwiZm9yZUNvbG9yXCIpO1xyXG5cclxuICAgICAgICBjb2xvckRyb3Bkb3duTGlzdC5hcHBlbmQoZm9yZUNvbG9yUmVkKTtcclxuICAgICAgICBjb2xvckRyb3Bkb3duTGlzdC5hcHBlbmQoZm9yZUNvbG9yR3JlZW4pO1xyXG4gICAgICAgIGNvbG9yRHJvcGRvd25MaXN0LmFwcGVuZChmb3JlQ29sb3JCbHVlKTtcclxuICAgICAgICBjb2xvckRyb3Bkb3duTGlzdC5hcHBlbmQoZm9yZUNvbG9yWWVsbG93KTtcclxuICAgICAgICBjb2xvckRyb3Bkb3duTGlzdC5hcHBlbmQoZm9yZUNvbG9yR3JleSk7XHJcbiAgICAgICAgY29sb3JEcm9wZG93bkxpc3QuYXBwZW5kKGZvcmVDb2xvck5vbmUpO1xyXG5cclxuICAgICAgICByZXR1cm4gY29sb3JEcm9wZG93bjtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgbW9yZU9wdGlvbnNEcm9wZG93bigpOiBEcm9wZG93bk1lbnUge1xyXG5cclxuICAgICAgICBjb25zdCBpY29uID0gbmV3IFNWR0ljb24oXCJpY29uLW1hdGVyaWFsLW1vcmVcIiwgU2l6ZXMubGFyZ2UpO1xyXG5cclxuICAgICAgICBjb25zdCBtb3JlT3B0aW9uc0xpc3QgPSBuZXcgRHJvcGRvd25NZW51TGlzdChcIm1vcmVUZXh0T3B0aW9uU2VsZWN0XCIpO1xyXG4gICAgICAgIGNvbnN0IG1vcmVPcHRpb25zQnV0dG9uID0gbmV3IERyb3Bkb3duTWVudUJ1dHRvbihcIm1vcmVUZXh0T3B0aW9uQnV0dG9uXCIsIGljb24uaHRtbEVsZW1lbnQsIG1vcmVPcHRpb25zTGlzdCwgZmFsc2UpO1xyXG4gICAgICAgIGNvbnN0IG1vcmVPcHRpb25zRHJvcGRvd24gPSBuZXcgRHJvcGRvd25NZW51KFwibW9yZVRleHRPcHRpb25zTWVudVwiLCBtb3JlT3B0aW9uc0J1dHRvbiwgbW9yZU9wdGlvbnNMaXN0KTtcclxuXHJcbiAgICAgICAgbW9yZU9wdGlvbnNMaXN0LmFwcGVuZChuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW1UaXRsZShtb3JlT3B0aW9uc0xpc3QsIFwiTW9yZSBvcHRpb25zXCIpKTtcclxuXHJcbiAgICAgICAgbW9yZU9wdGlvbnNMaXN0LmFwcGVuZChuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW0oXCJjb3B5T3B0aW9uXCIsIG1vcmVPcHRpb25zTGlzdCwgQmxvY2tPcGVyYXRpb25zU2VydmljZS5CTE9DS19PUEVSQVRJT05TLkNPUFksIG51bGwsIFNWR0ljb25zLmNvcHkuaHRtbEVsZW1lbnQsIFwiQ29weVwiLCBcIkN0cmwrQ1wiKSk7XHJcbiAgICAgICAgbW9yZU9wdGlvbnNMaXN0LmFwcGVuZChuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW0oXCJjdXRPcHRpb25cIiwgbW9yZU9wdGlvbnNMaXN0LCBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLkJMT0NLX09QRVJBVElPTlMuQ1VULCBudWxsLCBTVkdJY29ucy5jdXQuaHRtbEVsZW1lbnQsIFwiQ3V0XCIsIFwiQ3RybCtYXCIpKTtcclxuICAgICAgICBtb3JlT3B0aW9uc0xpc3QuYXBwZW5kKG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcInBhc3RlT3B0aW9uXCIsIG1vcmVPcHRpb25zTGlzdCwgQmxvY2tPcGVyYXRpb25zU2VydmljZS5CTE9DS19PUEVSQVRJT05TLlBBU1RFLCBudWxsLCBTVkdJY29ucy5wYXN0ZS5odG1sRWxlbWVudCwgXCJSZXBsYWNlXCIsIFwiQ3RybCtWXCIpKTtcclxuICAgICAgICBtb3JlT3B0aW9uc0xpc3QuYXBwZW5kKG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcImR1cGxpY2F0ZU9wdGlvblwiLCBtb3JlT3B0aW9uc0xpc3QsIEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuQkxPQ0tfT1BFUkFUSU9OUy5EVVBMSUNBVEUsIG51bGwsIFNWR0ljb25zLmR1cGxpY2F0ZS5odG1sRWxlbWVudCwgXCJDbG9uZSBCbG9ja1wiLCBcIkN0cmwrRFwiKSk7XHJcbiAgICAgICAgbW9yZU9wdGlvbnNMaXN0LmFwcGVuZChuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW0oXCJyZXNldE9wdGlvblwiLCBtb3JlT3B0aW9uc0xpc3QsIEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuQkxPQ0tfT1BFUkFUSU9OUy5SRU1PVkVfRk9STUFULCBudWxsLCBTVkdJY29ucy5lcmFzZXIuaHRtbEVsZW1lbnQsIFwiUmVzZXQgU3R5bGVcIiwgXCJDdHJsK1xcXFxcIikpO1xyXG5cclxuICAgICAgICBjb25zdCBkZWxldGVJdGVtID0gbmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwiZGVsZXRlT3B0aW9uXCIsIG1vcmVPcHRpb25zTGlzdCwgQmxvY2tPcGVyYXRpb25zU2VydmljZS5CTE9DS19PUEVSQVRJT05TLkRFTEVURSwgbnVsbCwgU1ZHSWNvbnMuZGVsZXRlLmh0bWxFbGVtZW50LCBcIkRlbGV0ZSBCbG9ja1wiLCBcIlNoaWZ0K0RlbFwiKTtcclxuICAgICAgICBkZWxldGVJdGVtLmFkZENzc0NsYXNzKFwiZGFuZ2VyLW9wdGlvblwiKTtcclxuXHJcbiAgICAgICAgbW9yZU9wdGlvbnNMaXN0LmFwcGVuZChkZWxldGVJdGVtKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIG1vcmVPcHRpb25zRHJvcGRvd247XHJcbiAgICB9XHJcbn1cclxuXHJcbmNvbnN0IFNWR0ljb25zOiBhbnkgPSB7XHJcblxyXG4gICAgcGFyYWdyYXBoOiBuZXcgU1ZHSWNvbihcImljb24tbWF0ZXJpYWwtZm9ybWF0XCIsIFwiMS4yNXJlbVwiKSxcclxuICAgIHRvZG9fbGlzdDogbmV3IFNWR0ljb24oXCJpY29uLW1hdGVyaWFsLWNoZWNrLWxpc3QtMlwiLCBTaXplcy5sYXJnZSksXHJcbiAgICBiX2xpc3Q6IG5ldyBTVkdJY29uKFwiaWNvbi13b3JkcHJlc3MtYnVsbGV0ZWQtbGlzdFwiLCBTaXplcy5sYXJnZSksXHJcbiAgICBuX2xpc3Q6IG5ldyBTVkdJY29uKFwiaWNvbi13b3JkcHJlc3MtbnVtYmVyZWQtbGlzdFwiLCBTaXplcy5sYXJnZSksXHJcbiAgICBjb2RlOiBuZXcgU1ZHSWNvbihcImljb24td29yZHByZXNzLWNvZGUtbWFya1wiLCBTaXplcy5sYXJnZSksXHJcbiAgICBxdW90ZTogbmV3IFNWR0ljb24oXCJpY29uLXdvcmRwcmVzcy1xdW90ZVwiLCBTaXplcy5sYXJnZSksXHJcbiAgICBoZWFkMTogbmV3IFNWR0ljb24oXCJpY29uLWp1bGlhLWhlYWQtMVwiLCBTaXplcy5sYXJnZSksXHJcbiAgICBoZWFkMjogbmV3IFNWR0ljb24oXCJpY29uLWp1bGlhLWhlYWQtMlwiLCBTaXplcy5sYXJnZSksXHJcbiAgICBoZWFkMzogbmV3IFNWR0ljb24oXCJpY29uLWp1bGlhLWhlYWQtM1wiLCBTaXplcy5sYXJnZSksXHJcbiAgICBoZWFkNDogbmV3IFNWR0ljb24oXCJpY29uLWp1bGlhLWhlYWQtNFwiLCBTaXplcy5sYXJnZSksXHJcbiAgICBoZWFkNTogbmV3IFNWR0ljb24oXCJpY29uLWp1bGlhLWhlYWQtNVwiLCBTaXplcy5sYXJnZSksXHJcbiAgICBoZWFkNjogbmV3IFNWR0ljb24oXCJpY29uLWp1bGlhLWhlYWQtNlwiLCBTaXplcy5sYXJnZSksXHJcbiAgICBkdXBsaWNhdGU6IG5ldyBTVkdJY29uKFwiaWNvbi1tYXRlcmlhbC1kdXBsaWNhdGVcIiwgU2l6ZXMubGFyZ2UpLFxyXG4gICAgZGVsZXRlOiBuZXcgU1ZHSWNvbihcImljb24tbWF0ZXJpYWwtdHJhc2hcIiwgU2l6ZXMubGFyZ2UpLFxyXG4gICAgZXJhc2VyOiBuZXcgU1ZHSWNvbihcImljb24tbWF0ZXJpYWwtY2xlYXJcIiwgU2l6ZXMubGFyZ2UpLFxyXG4gICAgY29weTogbmV3IFNWR0ljb24oXCJpY29uLW1hdGVyaWFsLWNvcHlcIiwgU2l6ZXMubGFyZ2UpLFxyXG4gICAgY3V0OiBuZXcgU1ZHSWNvbihcImljb24tbWF0ZXJpYWwtY3V0XCIsIFNpemVzLmxhcmdlKSxcclxuICAgIHBhc3RlOiBuZXcgU1ZHSWNvbihcImljb24tbWF0ZXJpYWwtcGFzdGVcIiwgU2l6ZXMubGFyZ2UpXHJcbn0iLCJpbXBvcnQgeyBCYXNlVUlDb21wb25lbnQgfSBmcm9tICcuLi9jb21tb24vQmFzZVVJQ29tcG9uZW50JztcclxuXHJcbmV4cG9ydCBjbGFzcyBRdWlja01lbnVFbXB0eSBleHRlbmRzIEJhc2VVSUNvbXBvbmVudCB7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcblxyXG4gICAgICAgIHN1cGVyKHt9KTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0KCk6IEhUTUxFbGVtZW50IHtcclxuXHJcbiAgICAgICAgY29uc3QgaHRtbEVtcHR5SW5kaWNhdG9yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xyXG5cclxuICAgICAgICBodG1sRW1wdHlJbmRpY2F0b3IuaW5uZXJUZXh0ID0gJ05vIHJlc3VsdHMnO1xyXG4gICAgICAgIGh0bWxFbXB0eUluZGljYXRvci5jbGFzc0xpc3QuYWRkKCdlbXB0eS1ibG9jay1vcHRpb25zJyk7XHJcbiAgICAgICAgaHRtbEVtcHR5SW5kaWNhdG9yLnN0eWxlLnBhZGRpbmcgPSAnMTBweCc7XHJcbiAgICAgICAgaHRtbEVtcHR5SW5kaWNhdG9yLnN0eWxlLmNvbG9yID0gJ3JnYmEoNTUsIDUzLCA0NywgMC42NSknO1xyXG4gICAgICAgIGh0bWxFbXB0eUluZGljYXRvci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG5cclxuICAgICAgICByZXR1cm4gaHRtbEVtcHR5SW5kaWNhdG9yO1xyXG4gICAgfVxyXG59IiwiZXhwb3J0IGVudW0gRE9NRWxlbWVudHMge1xyXG4gICAgVEQgPSBcInRkXCIsXHJcbiAgICBUQUJMRSA9IFwidGFibGVcIlxyXG59IiwiLyoqXHJcbiAqIEVudW0gZm9yIGtleWJvYXJkIGFycm93IGRpcmVjdGlvbnMuXHJcbiAqIEBlbnVtIHtzdHJpbmd9XHJcbiAqL1xyXG5leHBvcnQgZW51bSBEaXJlY3Rpb25zIHtcclxuICAgIC8qKiBSZXByZXNlbnRzIHRoZSAnQXJyb3dVcCcga2V5LCB1c2VkIHRvIG5hdmlnYXRlIHVwd2FyZHMgaW4gdGhlIEVkaXRvci4gKi9cclxuICAgIEFycm93VXAgPSBcIkFycm93VXBcIixcclxuICAgIC8qKiBSZXByZXNlbnRzIHRoZSAnQXJyb3dEb3duJyBrZXksIHVzZWQgdG8gbmF2aWdhdGUgZG93bndhcmRzIGluIHRoZSBFZGl0b3IuICovXHJcbiAgICBBcnJvd0Rvd24gPSBcIkFycm93RG93blwiLFxyXG4gICAgLyoqIFJlcHJlc2VudHMgdGhlICdBcnJvd0xlZnQnIGtleSwgdXNlZCB0byBuYXZpZ2F0ZSBsZWZ0IGluIHRoZSBFZGl0b3IuICovXHJcbiAgICBBcnJvd0xlZnQgPSBcIkFycm93TGVmdFwiLFxyXG4gICAgLyoqIFJlcHJlc2VudHMgdGhlICdBcnJvd1JpZ2h0JyBrZXksIHVzZWQgdG8gbmF2aWdhdGUgcmlnaHQgaW4gdGhlIEVkaXRvci4gKi9cclxuICAgIEFycm93UmlnaHQgPSBcIkFycm93UmlnaHRcIixcclxufVxyXG4iLCJleHBvcnQgZW51bSBUYWJsZVNjb3BlcyB7XHJcbiAgICBDb2x1bW4gPSBcIkNvbHVtblwiLFxyXG4gICAgUm93ID0gXCJSb3dcIixcclxuICAgIENlbGwgPSBcIkNlbGxcIixcclxuICAgIFNlbGVjdGVkQ2VsbHMgPSBcIlNlbGVjdGVkQ2VsbHNcIlxyXG59IiwiZXhwb3J0IGVudW0gS2V5Ym9hcmRLZXlzIHtcclxuICAgIFNoaWZ0ID0gXCJTaGlmdFwiLFxyXG4gICAgRW50ZXIgPSBcIkVudGVyXCIsXHJcbiAgICBFc2NhcGUgPSBcIkVzY2FwZVwiXHJcbn0iLCJleHBvcnQgZW51bSBTZWxlY3Rpb25Nb2RlcyB7XHJcbiAgICBUZXh0ID0gXCJUZXh0XCIsXHJcbiAgICBDZWxsID0gXCJDZWxsXCIsXHJcbiAgICBCbG9jayA9IFwiQmxvY2tcIlxyXG59IiwiZXhwb3J0IGVudW0gVG9vbGJhcklEcyB7XHJcbiAgICBUYWJsZVRvb2xiYXIgPSBcInRhYmxlRmxvYXRpbmdUb29sYmFyXCIsXHJcbiAgICBUZXh0VG9vbGJhciA9IFwidGV4dEZsb2F0aW5nVG9vbGJhclwiXHJcbn0iLCIvKipcclxuICogRW51bSBmb3Igc3BlY2lmeWluZyBib3VuZGFyaWVzIHdpdGhpbiBhbiBlbGVtZW50LlxyXG4gKiBAZW51bSB7c3RyaW5nfVxyXG4gKi9cclxuZXhwb3J0IGVudW0gQm91bmRhcmllcyB7XHJcbiAgICAvKiogUmVwcmVzZW50cyB0aGUgZmlyc3QgbGluZSBvZiBhbiBlbGVtZW50LCBpbXBvcnRhbnQgZm9yIGRldGVybWluaW5nIGlmIHRoZSBjdXJzb3IgaXMgYXQgdGhlIHN0YXJ0aW5nIGJvdW5kYXJ5LiAqL1xyXG4gICAgRmlyc3QgPSBcIkZpcnN0XCIsXHJcbiAgICAvKiogUmVwcmVzZW50cyB0aGUgbGFzdCBsaW5lIG9mIGFuIGVsZW1lbnQsIGltcG9ydGFudCBmb3IgZGV0ZXJtaW5pbmcgaWYgdGhlIGN1cnNvciBpcyBhdCB0aGUgZW5kaW5nIGJvdW5kYXJ5LiAqL1xyXG4gICAgTGFzdCA9IFwiTGFzdFwiXHJcbn0iLCJpbXBvcnQgeyBRdWlja01lbnVTZWN0aW9uIH0gZnJvbSAnLi9RdWlja01lbnVTZWN0aW9uJztcbmltcG9ydCB7IFF1aWNrTWVudUVtcHR5IH0gZnJvbSAnLi9RdWlja01lbnVFbXB0eSc7XG5pbXBvcnQgeyBRdWlja01lbnVJdGVtIH0gZnJvbSAnLi9RdWlja01lbnVJdGVtJztcbmltcG9ydCB7IEJhc2VVSUNvbXBvbmVudCB9IGZyb20gJy4uL2NvbW1vbi9CYXNlVUlDb21wb25lbnQnO1xuaW1wb3J0IHsgQ2lyY3VsYXJEb3VibHlMaW5rZWRMaXN0IH0gZnJvbSAnLi4vLi4vY29tbW9uL0NpcmN1bGFyRG91Ymx5TGlua2VkTGlzdCc7XG5pbXBvcnQgeyBJQmxvY2tPcGVyYXRpb25zU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2Jsb2NrLW9wZXJhdGlvbnMvSUJsb2NrT3BlcmF0aW9uc1NlcnZpY2UnO1xuaW1wb3J0IHsgSk5vZGUgfSBmcm9tIFwiLi4vLi4vY29tbW9uL0pOb2RlXCI7XG5pbXBvcnQgeyBEZXBlbmRlbmN5Q29udGFpbmVyIH0gZnJvbSAnQC9jb3JlL0RlcGVuZGVuY3lDb250YWluZXInO1xuaW1wb3J0IHsgSUZvY3VzU3RhY2sgfSBmcm9tICdAL2NvcmUvSUZvY3VzU3RhY2snO1xuaW1wb3J0IHsgSVF1aWNrTWVudSB9IGZyb20gJy4vSVF1aWNrTWVudSc7XG5pbXBvcnQgeyBJQ29tbWFuZEV2ZW50RGV0YWlsIH0gZnJvbSAnQC9jb21tYW5kcy9JQ29tbWFuZEV2ZW50RGV0YWlsJztcbmltcG9ydCB7IEN1c3RvbUV2ZW50cyB9IGZyb20gJ0AvY29tbW9uL0N1c3RvbUV2ZW50cyc7XG5pbXBvcnQgeyBDb21tYW5kcyB9IGZyb20gJ0AvY29tbWFuZHMvQ29tbWFuZHMnO1xuaW1wb3J0IHsgRE9NVXRpbHMgfSBmcm9tICdAL3V0aWxpdGllcy9ET01VdGlscyc7XG5pbXBvcnQgeyBET01FbGVtZW50cyB9IGZyb20gJ0AvY29tbW9uL0RPTUVsZW1lbnRzJztcblxuZXhwb3J0IGNsYXNzIFF1aWNrTWVudSBleHRlbmRzIEJhc2VVSUNvbXBvbmVudCBpbXBsZW1lbnRzIElRdWlja01lbnUge1xuXG4gICAgc3RhdGljIGlkID0gXCJxdWlja01lbnVcIjtcblxuICAgIHByaXZhdGUgYmxvY2tPcGVyYXRpb25zU2VydmljZTogSUJsb2NrT3BlcmF0aW9uc1NlcnZpY2U7XG5cbiAgICBwcml2YXRlIGN1cnJlbnRGb2N1c2VkTWVudUl0ZW06IEpOb2RlPFF1aWNrTWVudUl0ZW0+IHwgbnVsbDtcblxuICAgIC8vIHByaXZhdGUgaHRtbEZvY3VzZWRFbGVtZW50QmVmb3JlT3BlblF1aWNrTWVudTogSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgIHByaXZhdGUgbWVudVNlY3Rpb25zOiBDaXJjdWxhckRvdWJseUxpbmtlZExpc3Q8UXVpY2tNZW51U2VjdGlvbj47XG4gICAgcHJpdmF0ZSBxdWlja01lbnVFbXB0eTogUXVpY2tNZW51RW1wdHk7XG4gICAgcHJpdmF0ZSBmaWx0ZXJJbnB1dDogc3RyaW5nO1xuXG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IFF1aWNrTWVudSB8IG51bGw7XG5cbiAgICBwcml2YXRlIGZvY3VzU3RhY2s6IElGb2N1c1N0YWNrO1xuXG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihibG9ja09wZXJhdGlvbnNTZXJ2aWNlOiBJQmxvY2tPcGVyYXRpb25zU2VydmljZSwgZm9jdXNTdGFjazogSUZvY3VzU3RhY2spIHtcblxuICAgICAgICBzdXBlcih7fSk7XG5cbiAgICAgICAgdGhpcy5jdXJyZW50Rm9jdXNlZE1lbnVJdGVtID0gbnVsbDtcbiAgICAgICAgLy8gdGhpcy5odG1sRm9jdXNlZEVsZW1lbnRCZWZvcmVPcGVuUXVpY2tNZW51ID0gbnVsbDtcbiAgICAgICAgdGhpcy5tZW51U2VjdGlvbnMgPSBuZXcgQ2lyY3VsYXJEb3VibHlMaW5rZWRMaXN0PFF1aWNrTWVudVNlY3Rpb24+KCk7XG4gICAgICAgIHRoaXMucXVpY2tNZW51RW1wdHkgPSBuZXcgUXVpY2tNZW51RW1wdHkoKTtcbiAgICAgICAgdGhpcy5ibG9ja09wZXJhdGlvbnNTZXJ2aWNlID0gYmxvY2tPcGVyYXRpb25zU2VydmljZTtcbiAgICAgICAgdGhpcy5mb2N1c1N0YWNrID0gZm9jdXNTdGFjaztcblxuICAgICAgICAvL1RPRE86IEdvIGJhY2sgaGVyZVxuICAgICAgICAvLyBsZXQgYmxvY2tPcHRpb25zID0gdGhpcy5odG1sRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcuYmxvY2stb3B0aW9ucycpIGFzIEhUTUxFbGVtZW50O1xuXG4gICAgICAgIC8vIHRoaXMucXVpY2tNZW51RW1wdHkuYXBwZW5kVG8oYmxvY2tPcHRpb25zKTtcbiAgICAgICAgdGhpcy5hdHRhY2hFdmVudHMoKTtcblxuICAgICAgICB0aGlzLmZpbHRlcklucHV0ID0gXCJcIjtcbiAgICB9XG5cbiAgICBpbml0KCk6IEhUTUxFbGVtZW50IHtcblxuICAgICAgICBjb25zdCBodG1sRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBodG1sRWxlbWVudC5pZCA9IFF1aWNrTWVudS5pZDtcblxuICAgICAgICBodG1sRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdibG9jay1vcHRpb25zLXdyYXBwZXInLCAnc29mdC1ib3gtc2hhZG93Jyk7XG4gICAgICAgIGh0bWxFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cbiAgICAgICAgY29uc3QgYmxvY2tPcHRpb25zID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIGJsb2NrT3B0aW9ucy5jbGFzc0xpc3QuYWRkKCdibG9jay1vcHRpb25zJyk7XG4gICAgICAgIGJsb2NrT3B0aW9ucy5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7XG5cbiAgICAgICAgaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQoYmxvY2tPcHRpb25zKTtcblxuICAgICAgICByZXR1cm4gaHRtbEVsZW1lbnQ7XG4gICAgfVxuXG4gICAgYXBwZW5kKG1lbnVJdGVtOiBRdWlja01lbnVTZWN0aW9uKTogdm9pZCB7XG4gICAgICAgIHRoaXMubWVudVNlY3Rpb25zLmFwcGVuZChtZW51SXRlbSk7XG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQucXVlcnlTZWxlY3RvcignLmJsb2NrLW9wdGlvbnMnKSEuYXBwZW5kQ2hpbGQobWVudUl0ZW0uaHRtbEVsZW1lbnQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0SW5zdGFuY2UoKTogUXVpY2tNZW51IHtcblxuICAgICAgICBjb25zdCBibG9ja09wZXJhdGlvblNlcnZpY2UgPSBEZXBlbmRlbmN5Q29udGFpbmVyLkluc3RhbmNlLnJlc29sdmU8SUJsb2NrT3BlcmF0aW9uc1NlcnZpY2U+KFwiSUJsb2NrT3BlcmF0aW9uc1NlcnZpY2VcIik7XG4gICAgICAgIGNvbnN0IGZvY3VzU3RhY2sgPSBEZXBlbmRlbmN5Q29udGFpbmVyLkluc3RhbmNlLnJlc29sdmU8SUZvY3VzU3RhY2s+KFwiSUZvY3VzU3RhY2tcIik7XG5cbiAgICAgICAgaWYgKCFRdWlja01lbnUuaW5zdGFuY2UpIHtcbiAgICAgICAgICAgIFF1aWNrTWVudS5pbnN0YW5jZSA9IG5ldyBRdWlja01lbnUoYmxvY2tPcGVyYXRpb25TZXJ2aWNlLCBmb2N1c1N0YWNrKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBRdWlja01lbnUuaW5zdGFuY2U7XG4gICAgfVxuXG4gICAgc3dpdGNoVmlzdWFsRm9jdXMoaXRlbTogSk5vZGU8UXVpY2tNZW51SXRlbT4pOiB2b2lkIHtcblxuICAgICAgICBpZiAodGhpcy5jdXJyZW50Rm9jdXNlZE1lbnVJdGVtID09IGl0ZW0pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRGb2N1c2VkTWVudUl0ZW0pIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudEZvY3VzZWRNZW51SXRlbS52YWx1ZS5yZW1vdmVGb2N1cygpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jdXJyZW50Rm9jdXNlZE1lbnVJdGVtID0gaXRlbTtcbiAgICAgICAgdGhpcy5jdXJyZW50Rm9jdXNlZE1lbnVJdGVtLnZhbHVlLmZvY3VzKCk7XG5cbiAgICAgICAgLy8gdGhpcy5odG1sRm9jdXNlZEVsZW1lbnRCZWZvcmVPcGVuUXVpY2tNZW51Py5mb2N1cygpO1xuICAgICAgICB0aGlzLmZvY3VzU3RhY2sucGVlaygpPy5mb2N1cygpO1xuICAgIH1cblxuICAgIGZvY3VzT25UaGVGaXJzdFZpc2libGVJdGVtKCk6IHZvaWQge1xuXG4gICAgICAgIGNvbnN0IGZpcnN0U2VjdGlvbk5vZGU6IEpOb2RlPFF1aWNrTWVudVNlY3Rpb24+IHwgbnVsbCA9IHRoaXMubWVudVNlY3Rpb25zLmdldEZpcnN0KCk7XG5cbiAgICAgICAgbGV0IGN1cnJlbnRTZWN0aW9uTm9kZTogSk5vZGU8UXVpY2tNZW51U2VjdGlvbj4gfCBudWxsID0gZmlyc3RTZWN0aW9uTm9kZTtcblxuICAgICAgICB3aGlsZSAoY3VycmVudFNlY3Rpb25Ob2RlKSB7XG5cbiAgICAgICAgICAgIGNvbnN0IGl0ZW1Ob2RlOiBKTm9kZTxRdWlja01lbnVJdGVtPiB8IG51bGwgPSBjdXJyZW50U2VjdGlvbk5vZGUudmFsdWUubWVudUl0ZW1zLmZpbmRGaXJzdChpdGVtID0+IGl0ZW0uaXNWaXNpYmxlKTtcblxuICAgICAgICAgICAgaWYgKGl0ZW1Ob2RlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zd2l0Y2hWaXN1YWxGb2N1cyhpdGVtTm9kZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjdXJyZW50U2VjdGlvbk5vZGUgPSBjdXJyZW50U2VjdGlvbk5vZGUubmV4dE5vZGU7XG5cbiAgICAgICAgICAgIGlmIChjdXJyZW50U2VjdGlvbk5vZGUgPT0gZmlyc3RTZWN0aW9uTm9kZSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZvY3VzUHJldmlvdXNWaXNpYmxlSXRlbSgpOiB2b2lkIHtcblxuICAgICAgICBsZXQgcHJldmlvdXNWaXNpYmxlSXRlbTogSk5vZGU8UXVpY2tNZW51SXRlbT4gfCBudWxsO1xuXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRGb2N1c2VkTWVudUl0ZW0pIHtcbiAgICAgICAgICAgIHByZXZpb3VzVmlzaWJsZUl0ZW0gPSB0aGlzLmN1cnJlbnRGb2N1c2VkTWVudUl0ZW0uZ2V0UHJldmlvdXNTYXRpc2Z5aW5nKGl0ZW0gPT4gaXRlbS5pc1Zpc2libGUpO1xuICAgICAgICAgICAgaWYgKCFwcmV2aW91c1Zpc2libGVJdGVtKSB7XG5cbiAgICAgICAgICAgICAgICBsZXQgcHJldmlvdXNWaXNpYmxlU2VjdGlvbk5vZGU6IEpOb2RlPFF1aWNrTWVudVNlY3Rpb24+IHwgbnVsbCA9IHRoaXMubWVudVNlY3Rpb25zLmZpbmQodGhpcy5jdXJyZW50Rm9jdXNlZE1lbnVJdGVtLnZhbHVlLmltbWVkaWF0ZVBhcmVudCkhLmdldFByZXZpb3VzU2F0aXNmeWluZyhzZWN0aW9uID0+IHNlY3Rpb24uaXNWaXNpYmxlKTtcblxuICAgICAgICAgICAgICAgIGlmICghcHJldmlvdXNWaXNpYmxlU2VjdGlvbk5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwcmV2aW91c1Zpc2libGVJdGVtID0gcHJldmlvdXNWaXNpYmxlU2VjdGlvbk5vZGUudmFsdWUubWVudUl0ZW1zLmZpbmRMYXN0KGl0ZW0gPT4gaXRlbS5pc1Zpc2libGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IGxhc3RWaXNpYmxlU2VjdGlvbk5vZGU6IEpOb2RlPFF1aWNrTWVudVNlY3Rpb24+IHwgbnVsbCA9IHRoaXMubWVudVNlY3Rpb25zLmZpbmRMYXN0KHNlY3Rpb24gPT4gc2VjdGlvbi5pc1Zpc2libGUpO1xuXG4gICAgICAgICAgICBpZiAoIWxhc3RWaXNpYmxlU2VjdGlvbk5vZGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwcmV2aW91c1Zpc2libGVJdGVtID0gbGFzdFZpc2libGVTZWN0aW9uTm9kZS52YWx1ZS5tZW51SXRlbXMuZmluZExhc3QoaXRlbSA9PiBpdGVtLmlzVmlzaWJsZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zd2l0Y2hWaXN1YWxGb2N1cyhwcmV2aW91c1Zpc2libGVJdGVtISk7XG4gICAgfVxuXG4gICAgZm9jdXNOZXh0VmlzaWJsZUl0ZW0oKTogdm9pZCB7XG5cbiAgICAgICAgbGV0IG5leHRWaXNpYmxlSXRlbTogSk5vZGU8UXVpY2tNZW51SXRlbT4gfCBudWxsO1xuXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRGb2N1c2VkTWVudUl0ZW0pIHtcbiAgICAgICAgICAgIG5leHRWaXNpYmxlSXRlbSA9IHRoaXMuY3VycmVudEZvY3VzZWRNZW51SXRlbS5nZXROZXh0U2F0aXNmeWluZyhpdGVtID0+IGl0ZW0uaXNWaXNpYmxlKTtcbiAgICAgICAgICAgIGlmICghbmV4dFZpc2libGVJdGVtKSB7XG5cbiAgICAgICAgICAgICAgICBsZXQgbmV4dFZpc2libGVTZWN0aW9uTm9kZTogSk5vZGU8UXVpY2tNZW51U2VjdGlvbj4gfCBudWxsID0gdGhpcy5tZW51U2VjdGlvbnMuZmluZCh0aGlzLmN1cnJlbnRGb2N1c2VkTWVudUl0ZW0udmFsdWUuaW1tZWRpYXRlUGFyZW50KSEuZ2V0TmV4dFNhdGlzZnlpbmcoc2VjdGlvbiA9PiBzZWN0aW9uLmlzVmlzaWJsZSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoIW5leHRWaXNpYmxlU2VjdGlvbk5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBuZXh0VmlzaWJsZUl0ZW0gPSBuZXh0VmlzaWJsZVNlY3Rpb25Ob2RlLnZhbHVlLm1lbnVJdGVtcy5maW5kRmlyc3QoaXRlbSA9PiBpdGVtLmlzVmlzaWJsZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBmaXJzdFZpc2libGVTZWN0aW9uTm9kZTogbnVsbCB8IEpOb2RlPFF1aWNrTWVudVNlY3Rpb24+ID0gdGhpcy5tZW51U2VjdGlvbnMuZmluZEZpcnN0KHNlY3Rpb24gPT4gc2VjdGlvbi5pc1Zpc2libGUpO1xuICAgICAgICAgICAgaWYgKCFmaXJzdFZpc2libGVTZWN0aW9uTm9kZSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5leHRWaXNpYmxlSXRlbSA9IGZpcnN0VmlzaWJsZVNlY3Rpb25Ob2RlLnZhbHVlLm1lbnVJdGVtcy5maW5kRmlyc3QoaXRlbSA9PiBpdGVtLmlzVmlzaWJsZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnN3aXRjaFZpc3VhbEZvY3VzKG5leHRWaXNpYmxlSXRlbSEpO1xuICAgIH1cblxuICAgIGZpbHRlckl0ZW1zKCk6IHZvaWQge1xuXG4gICAgICAgIHRoaXMubWVudVNlY3Rpb25zLmZvckVhY2goc2VjdGlvbiA9PiB7XG4gICAgICAgICAgICBzZWN0aW9uLmZpbHRlclNlY3Rpb24odGhpcy5maWx0ZXJJbnB1dCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICghdGhpcy5tZW51U2VjdGlvbnMuYW55KHNlY3Rpb24gPT4gc2VjdGlvbi5pc1Zpc2libGUpKSB7XG4gICAgICAgICAgICB0aGlzLnF1aWNrTWVudUVtcHR5LnNob3coKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucXVpY2tNZW51RW1wdHkuaGlkZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5mb2N1c09uVGhlRmlyc3RWaXNpYmxlSXRlbSgpO1xuICAgIH1cblxuICAgIHNob3coKSB7XG5cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG5cbiAgICAgICAgICAgIGNvbnN0IGFjdGl2ZUVsZW1lbnQgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuXG4gICAgICAgICAgICBpZiAoIWFjdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRmFpbGVkIHRvIGRpc3BsYXkgdGhlIHF1aWNrTWVudTogbm8gYWN0aXZlIGVsZW1lbnQgZm91bmQuIFBsZWFzZSBlbnN1cmUgYW4gZWxlbWVudCBpcyBmb2N1c2VkIGJlZm9yZSBhdHRlbXB0aW5nIHRvIGRpc3BsYXkgdGhlIHF1aWNrTWVudS5cIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmZvY3VzU3RhY2sucHVzaChhY3RpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50KVxuXG4gICAgICAgICAgICAvLyB0aGlzLmh0bWxGb2N1c2VkRWxlbWVudEJlZm9yZU9wZW5RdWlja01lbnUgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xuXG4gICAgICAgICAgICAvLyBpZiAoIXRoaXMuaHRtbEZvY3VzZWRFbGVtZW50QmVmb3JlT3BlblF1aWNrTWVudSkge1xuICAgICAgICAgICAgLy8gICAgIHRocm93IG5ldyBFcnJvcihcIkZhaWxlZCB0byBjYXB0dXJlIHRoZSBmb2N1c2VkIGVsZW1lbnQgYmVmb3JlIGRpc3BsYXlpbmcgdGhlIFF1aWNrTWVudS4gRW5zdXJlIGFuIGVsZW1lbnQgaXMgZm9jdXNlZC5cIik7XG4gICAgICAgICAgICAvLyB9XG5cblxuICAgICAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuXG4gICAgICAgICAgICBpZiAoIXNlbGVjdGlvbiB8fCBzZWxlY3Rpb24ucmFuZ2VDb3VudCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTmVuaHVtYSBzZWxlw6fDo28gZW5jb250cmFkYScpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xuICAgICAgICAgICAgY29uc3QgcmVjdCA9IHJhbmdlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICAgICAgICB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG5cbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRXaWR0aCA9IHRoaXMuaHRtbEVsZW1lbnQub2Zmc2V0V2lkdGg7XG4gICAgICAgICAgICBsZXQgbGVmdFBvc2l0aW9uID0gcmVjdC5sZWZ0ICsgd2luZG93LnNjcm9sbFg7XG5cbiAgICAgICAgICAgIGlmIChsZWZ0UG9zaXRpb24gKyBlbGVtZW50V2lkdGggPiB3aW5kb3cuaW5uZXJXaWR0aCkge1xuICAgICAgICAgICAgICAgIGxlZnRQb3NpdGlvbiA9IHdpbmRvdy5pbm5lcldpZHRoIC0gZWxlbWVudFdpZHRoIC0gMjA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRIZWlnaHQgPSB0aGlzLmh0bWxFbGVtZW50Lm9mZnNldEhlaWdodDtcbiAgICAgICAgICAgIGxldCB0b3BQb3NpdGlvbiA9IHJlY3QudG9wICsgd2luZG93LnNjcm9sbFkgLSBlbGVtZW50SGVpZ2h0IC0gMTA7XG5cbiAgICAgICAgICAgIGlmICh0b3BQb3NpdGlvbiA8IDApIHtcbiAgICAgICAgICAgICAgICB0b3BQb3NpdGlvbiA9IHJlY3QuYm90dG9tICsgd2luZG93LnNjcm9sbFkgKyAxMDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5odG1sRWxlbWVudC5zdHlsZS5sZWZ0ID0gYCR7bGVmdFBvc2l0aW9ufXB4YDtcbiAgICAgICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUudG9wID0gYCR7dG9wUG9zaXRpb259cHhgO1xuXG4gICAgICAgICAgICBzdXBlci5zaG93KCk7XG5cbiAgICAgICAgICAgIHRoaXMuZm9jdXNPblRoZUZpcnN0VmlzaWJsZUl0ZW0oKTtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNTdGFjay5wZWVrKCk/LmZvY3VzKCk7XG5cbiAgICAgICAgfSwgMTApO1xuXG4gICAgfVxuXG4gICAgcmVzdG9yZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5maWx0ZXJJbnB1dCA9IFwiXCI7XG5cbiAgICAgICAgdGhpcy5tZW51U2VjdGlvbnMuZm9yRWFjaChzZWN0aW9uID0+IHtcbiAgICAgICAgICAgIHNlY3Rpb24ucmVzdG9yZSgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBoaWRlKCkge1xuXG4gICAgICAgIHRoaXMucmVzdG9yZSgpO1xuICAgICAgICB0aGlzLmZvY3VzU3RhY2sucGVlaygpPy5mb2N1cygpO1xuICAgICAgICAvLyB0aGlzLmh0bWxGb2N1c2VkRWxlbWVudEJlZm9yZU9wZW5RdWlja01lbnU/LmZvY3VzKCk7XG5cbiAgICAgICAgc3VwZXIuaGlkZSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXR0YWNoRXZlbnRzKCkge1xuXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoQ3VzdG9tRXZlbnRzLmVtaXR0ZWRDb21tYW5kLCAoKGV2ZW50OiBDdXN0b21FdmVudDxJQ29tbWFuZEV2ZW50RGV0YWlsPikgPT4ge1xuICAgICAgICAgICAgY29uc3QgeyBjb21tYW5kIH0gPSBldmVudC5kZXRhaWw7XG5cbiAgICAgICAgICAgIGlmIChjb21tYW5kID09IENvbW1hbmRzLnRyYW5zZm9ybUJsb2NrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSkgYXMgRXZlbnRMaXN0ZW5lcik7XG5cbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChldmVudDogS2V5Ym9hcmRFdmVudCkgPT4ge1xuXG4gICAgICAgICAgICBjb25zdCBibG9jayA9IERPTVV0aWxzLmZpbmRDbG9zZXN0QW5jZXN0b3JPZkFjdGl2ZUVsZW1lbnRCeUNsYXNzKFwiYmxvY2tcIik7XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5pc1Zpc2libGUgJiYgZXZlbnQua2V5ID09PSAnLycgJiYgIWV2ZW50LmN0cmxLZXkgJiYgIWV2ZW50LnNoaWZ0S2V5ICYmICFldmVudC5hbHRLZXkgJiYgYmxvY2spIHtcblxuICAgICAgICAgICAgICAgIC8vUHJldmVudCBzaG93IHF1aWNrTWVudSBpbnNpZGUgYSB0YWJsZSBjZWxsXG4gICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRDZWxsID0gdGFyZ2V0LmNsb3Nlc3QoRE9NRWxlbWVudHMuVEQpIGFzIEhUTUxUYWJsZUNlbGxFbGVtZW50O1xuXG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRDZWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLnNob3coKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc1Zpc2libGUgJiYgZXZlbnQua2V5ID09PSAnQXJyb3dMZWZ0JyAmJiAhZXZlbnQuY3RybEtleSAmJiAhZXZlbnQuc2hpZnRLZXkgJiYgIWV2ZW50LmFsdEtleSkge1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNWaXNpYmxlICYmIGV2ZW50LmtleSA9PT0gJ0Fycm93UmlnaHQnICYmICFldmVudC5jdHJsS2V5ICYmICFldmVudC5zaGlmdEtleSAmJiAhZXZlbnQuYWx0S2V5KSB7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuaXNWaXNpYmxlICYmIGV2ZW50LmtleSA9PT0gJ0Fycm93RG93bicgJiYgIWV2ZW50LmN0cmxLZXkgJiYgIWV2ZW50LnNoaWZ0S2V5ICYmICFldmVudC5hbHRLZXkpIHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuZm9jdXNOZXh0VmlzaWJsZUl0ZW0oKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc1Zpc2libGUgJiYgZXZlbnQua2V5ID09PSAnQXJyb3dVcCcgJiYgIWV2ZW50LmN0cmxLZXkgJiYgIWV2ZW50LnNoaWZ0S2V5ICYmICFldmVudC5hbHRLZXkpIHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuZm9jdXNQcmV2aW91c1Zpc2libGVJdGVtKCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNWaXNpYmxlICYmIC9eW2EtejAtOSBdJC9pLnRlc3QoZXZlbnQua2V5KSAmJiAhZXZlbnQuY3RybEtleSAmJiAhZXZlbnQuc2hpZnRLZXkgJiYgIWV2ZW50LmFsdEtleSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29uY2F0RmlsdGVySW5wdXQoZXZlbnQua2V5KTtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlckl0ZW1zKCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNWaXNpYmxlICYmIGV2ZW50LmtleSA9PT0gJ0JhY2tzcGFjZScpIHtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmZpbHRlcklucHV0ID09IFwiXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVMYXN0RmlsdGVySW5wdXRDaGFyYWN0ZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJJdGVtcygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc1Zpc2libGUgJiYgZXZlbnQua2V5ID09PSAnRXNjYXBlJyAmJiAhZXZlbnQuY3RybEtleSAmJiAhZXZlbnQuc2hpZnRLZXkgJiYgIWV2ZW50LmFsdEtleSkge1xuICAgICAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNWaXNpYmxlICYmICEoZXZlbnQudGFyZ2V0ISBhcyBIVE1MRWxlbWVudCkuY2xvc2VzdChgIyR7dGhpcy5odG1sRWxlbWVudC5pZH1gKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGV2ZW50KSA9PiB7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmlzVmlzaWJsZSAmJiBldmVudC5rZXkgPT09ICdFbnRlcicgJiYgIWV2ZW50LmN0cmxLZXkgJiYgIWV2ZW50LnNoaWZ0S2V5ICYmICFldmVudC5hbHRLZXkpIHtcblxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBibG9ja1R5cGUgPSB0aGlzLmN1cnJlbnRGb2N1c2VkTWVudUl0ZW0/LnZhbHVlLmJsb2NrVHlwZTtcblxuICAgICAgICAgICAgICAgIGlmIChibG9ja1R5cGUpIHtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRyYW5zZm9ybUh0bWxGb2N1c2VkRWxlbWVudEJlZm9yZU9wZW5RdWlja01lbnUoYmxvY2tUeXBlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoQ3VzdG9tRXZlbnRzLmJsb2NrVHlwZUNoYW5nZWQsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuXG4gICAgZW1pdENvbW1hbmRFdmVudChibG9ja1R5cGU6IHN0cmluZyk6IHZvaWQge1xuXG4gICAgICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50PElDb21tYW5kRXZlbnREZXRhaWw+KEN1c3RvbUV2ZW50cy5lbWl0dGVkQ29tbWFuZCwge1xuICAgICAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgICAgICAgY29tbWFuZDogQ29tbWFuZHMudHJhbnNmb3JtQmxvY2ssXG4gICAgICAgICAgICAgICAgdmFsdWU6IGJsb2NrVHlwZVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KGN1c3RvbUV2ZW50KTtcbiAgICB9XG5cbiAgICB0cmFuc2Zvcm1IdG1sRm9jdXNlZEVsZW1lbnRCZWZvcmVPcGVuUXVpY2tNZW51KGJsb2NrVHlwZTogc3RyaW5nKTogdm9pZCB7XG5cbiAgICAgICAgaWYgKGJsb2NrVHlwZSkge1xuXG4gICAgICAgICAgICB0aGlzLmVtaXRDb21tYW5kRXZlbnQoYmxvY2tUeXBlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRoaXMuaGlkZSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgY29uY2F0RmlsdGVySW5wdXQoc3RnOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5maWx0ZXJJbnB1dCArPSBzdGcudG9Mb3dlckNhc2UoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlbW92ZUxhc3RGaWx0ZXJJbnB1dENoYXJhY3RlcigpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVySW5wdXQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJJbnB1dCA9IHRoaXMuZmlsdGVySW5wdXQuc2xpY2UoMCwgLTEpO1xuICAgICAgICB9XG4gICAgfVxufSIsImltcG9ydCB7IEJhc2VEb3VibHlMaW5rZWRMaXN0IH0gZnJvbSAnLi9CYXNlRG91Ymx5TGlua2VkTGlzdCc7XHJcbmltcG9ydCB7IEpOb2RlIH0gZnJvbSAnLi9KTm9kZSc7XHJcblxyXG5leHBvcnQgY2xhc3MgRG91Ymx5TGlua2VkTGlzdDxUPiBleHRlbmRzIEJhc2VEb3VibHlMaW5rZWRMaXN0PFQ+IHtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgfVxyXG5cclxuICAgIGFwcGVuZChlbGVtZW50OiBUKTogdm9pZCB7XHJcblxyXG4gICAgICAgIGNvbnN0IG5vZGUgPSBuZXcgSk5vZGUoZWxlbWVudCwgdGhpcyk7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5oZWFkIHx8ICF0aGlzLnRhaWwpIHtcclxuICAgICAgICAgICAgdGhpcy5oZWFkID0gbm9kZTtcclxuICAgICAgICAgICAgdGhpcy50YWlsID0gbm9kZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnRhaWwuc2V0TmV4dChub2RlKTtcclxuICAgICAgICAgICAgbm9kZS5zZXRQcmV2aW91cyh0aGlzLnRhaWwpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy50YWlsID0gbm9kZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMubGVuZ3RoKys7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBRdWlja01lbnUgfSBmcm9tICcuL1F1aWNrTWVudSc7XHJcbmltcG9ydCB7IFF1aWNrTWVudUl0ZW0gfSBmcm9tIFwiLi9RdWlja01lbnVJdGVtXCI7XHJcbmltcG9ydCB7IERvdWJseUxpbmtlZExpc3QgfSBmcm9tICcuLi8uLi9jb21tb24vRG91Ymx5TGlua2VkTGlzdCc7XHJcbmltcG9ydCB7IEJhc2VVSUNvbXBvbmVudCB9IGZyb20gJy4uL2NvbW1vbi9CYXNlVUlDb21wb25lbnQnO1xyXG5cclxuZXhwb3J0IGNsYXNzIFF1aWNrTWVudVNlY3Rpb24gZXh0ZW5kcyBCYXNlVUlDb21wb25lbnQge1xyXG5cclxuICAgIGltbWVkaWF0ZVBhcmVudDogUXVpY2tNZW51O1xyXG5cclxuICAgIG1lbnVJdGVtcyA9IG5ldyBEb3VibHlMaW5rZWRMaXN0PFF1aWNrTWVudUl0ZW0+KCk7XHJcblxyXG4gICAgY29uc3RydWN0b3Iob3B0aW9uczogUXVpY2tNZW51U2VjdGlvbk9wdGlvbnMpIHtcclxuXHJcbiAgICAgICAgc3VwZXIoe1xyXG4gICAgICAgICAgICB0aXRsZTogb3B0aW9ucy50aXRsZSxcclxuICAgICAgICAgICAgY2xhc3NMaXN0OiBvcHRpb25zLmNsYXNzTGlzdFxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmltbWVkaWF0ZVBhcmVudCA9IG9wdGlvbnMucXVpY2tNZW51SW5zdGFuY2U7XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdCgpOiBIVE1MRWxlbWVudCB7XHJcblxyXG4gICAgICAgIGNvbnN0IGh0bWxFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2VjdGlvbicpO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LmNsYXNzTGlzdC5hZGQodGhpcy5wcm9wcy5jbGFzc0xpc3QpO1xyXG5cclxuICAgICAgICBjb25zdCBoZWFkaW5nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaDInKTtcclxuICAgICAgICBoZWFkaW5nLnRleHRDb250ZW50ID0gdGhpcy5wcm9wcy50aXRsZTtcclxuXHJcbiAgICAgICAgaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQoaGVhZGluZyk7XHJcblxyXG4gICAgICAgIHJldHVybiBodG1sRWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICBhcHBlbmRRdWlja01lbnVJdGVtcyhtZW51SXRlbXM6IFF1aWNrTWVudUl0ZW1bXSk6IHZvaWQge1xyXG5cclxuICAgICAgICBtZW51SXRlbXMuZm9yRWFjaChpdGVtID0+IHtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kUXVpY2tNZW51SXRlbShpdGVtKVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGFwcGVuZFF1aWNrTWVudUl0ZW0obWVudUl0ZW06IFF1aWNrTWVudUl0ZW0pOiB2b2lkIHtcclxuXHJcbiAgICAgICAgdGhpcy5tZW51SXRlbXMuYXBwZW5kKG1lbnVJdGVtKTtcclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LmFwcGVuZENoaWxkKG1lbnVJdGVtLmh0bWxFbGVtZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBmaWx0ZXJTZWN0aW9uKHRleHQ6IHN0cmluZyk6IHZvaWQge1xyXG5cclxuICAgICAgICB0aGlzLnJlc3RvcmUoKTtcclxuXHJcbiAgICAgICAgaWYgKHRleHQgIT09IFwiXCIpIHtcclxuICAgICAgICAgICAgdGhpcy5tZW51SXRlbXMuZm9yRWFjaChtZW51SXRlbSA9PiB7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKCEobWVudUl0ZW0uZmlsdGVyVmFsdWUudG9Mb2NhbGVMb3dlckNhc2UoKS5pbmNsdWRlcyh0ZXh0KSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBtZW51SXRlbS5oaWRlKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgbGV0IGF0TGVhZE9uZUl0ZW0gPSB0aGlzLm1lbnVJdGVtcy5hbnkoaXRlbSA9PiBpdGVtLmZpbHRlclZhbHVlLnRvTG9jYWxlTG93ZXJDYXNlKCkuaW5jbHVkZXModGV4dCkpO1xyXG5cclxuICAgICAgICAgICAgaWYgKCFhdExlYWRPbmVJdGVtKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhpZGUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXN0b3JlKCkge1xyXG4gICAgICAgIHRoaXMuc2hvdygpO1xyXG5cclxuICAgICAgICB0aGlzLm1lbnVJdGVtcy5mb3JFYWNoKG1lbnVJdGVtID0+IHtcclxuICAgICAgICAgICAgbWVudUl0ZW0uc2hvdygpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFF1aWNrTWVudVNlY3Rpb25PcHRpb25zIHtcclxuICAgIHF1aWNrTWVudUluc3RhbmNlOiBRdWlja01lbnU7XHJcbiAgICB0aXRsZTogc3RyaW5nO1xyXG4gICAgY2xhc3NMaXN0OiBzdHJpbmc7XHJcbn0iLCJpbXBvcnQgeyBTVkdJY29uIH0gZnJvbSAnLi4vY29tbW9uL1NWR0ljb24nO1xyXG5pbXBvcnQgeyBCYXNlVUlDb21wb25lbnQgfSBmcm9tICcuLi9jb21tb24vQmFzZVVJQ29tcG9uZW50JztcclxuaW1wb3J0IHsgSk5vZGUgfSBmcm9tIFwiLi4vLi4vY29tbW9uL0pOb2RlXCI7XHJcbmltcG9ydCB7IFF1aWNrTWVudVNlY3Rpb24gfSBmcm9tICcuL1F1aWNrTWVudVNlY3Rpb24nO1xyXG5pbXBvcnQgeyBJQ29tbWFuZEV2ZW50RGV0YWlsIH0gZnJvbSAnQC9jb21tYW5kcy9JQ29tbWFuZEV2ZW50RGV0YWlsJztcclxuaW1wb3J0IHsgQ3VzdG9tRXZlbnRzIH0gZnJvbSAnQC9jb21tb24vQ3VzdG9tRXZlbnRzJztcclxuaW1wb3J0IHsgQ29tbWFuZHMgfSBmcm9tICdAL2NvbW1hbmRzL0NvbW1hbmRzJztcclxuXHJcbmV4cG9ydCBjbGFzcyBRdWlja01lbnVJdGVtIGV4dGVuZHMgQmFzZVVJQ29tcG9uZW50IHtcclxuXHJcbiAgICBwcml2YXRlIF9ibG9ja1R5cGU6IHN0cmluZztcclxuICAgIHByaXZhdGUgX2ZpbHRlclZhbHVlOiBzdHJpbmc7XHJcbiAgICBwcml2YXRlIF9pbW1lZGlhdGVQYXJlbnQ6IFF1aWNrTWVudVNlY3Rpb247XHJcblxyXG4gICAgY29uc3RydWN0b3IoaW1tZWRpYXRlUGFyZW50OiBRdWlja01lbnVTZWN0aW9uLCB0aXRsZTogc3RyaW5nLCBkZXNjcmlwdGlvbjogc3RyaW5nLCBpY29uSWQ6IHN0cmluZywgYmxvY2tUeXBlOiBzdHJpbmcsIGZpbHRlclZhbHVlOiBzdHJpbmcpIHtcclxuXHJcbiAgICAgICAgc3VwZXIoe1xyXG4gICAgICAgICAgICB0aXRsZTogdGl0bGUsXHJcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBkZXNjcmlwdGlvbixcclxuICAgICAgICAgICAgaWNvbklkOiBpY29uSWRcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5fYmxvY2tUeXBlID0gYmxvY2tUeXBlO1xyXG4gICAgICAgIHRoaXMuX2ZpbHRlclZhbHVlID0gZmlsdGVyVmFsdWU7XHJcbiAgICAgICAgdGhpcy5faW1tZWRpYXRlUGFyZW50ID0gaW1tZWRpYXRlUGFyZW50O1xyXG5cclxuICAgICAgICB0aGlzLmF0dGFjaEV2ZW50cygpO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXQoKTogSFRNTEVsZW1lbnQge1xyXG5cclxuICAgICAgICBjb25zdCBodG1sRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ29wdGlvbicsICdvcHRpb24taG92ZXInLCAnYmxvY2stb3BlcmF0aW9uJyk7XHJcblxyXG4gICAgICAgIGh0bWxFbGVtZW50LnNldEF0dHJpYnV0ZSgnZGF0YS1ibG9jay1vcGVyYXRpb24nLCAnYXBwbHktc2VsZWN0ZWQtYmxvY2stdHlwZScpO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLCAnMCcpO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LnNldEF0dHJpYnV0ZSgncm9sZScsICdvcHRpb24nKTtcclxuXHJcblxyXG4gICAgICAgIGNvbnN0IG9wdGlvbkltYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgb3B0aW9uSW1hZ2UuY2xhc3NMaXN0LmFkZCgnb3B0aW9uLWltYWdlJyk7XHJcblxyXG4gICAgICAgIGNvbnN0IHN2ZyA9IG5ldyBTVkdJY29uKHRoaXMucHJvcHMuaWNvbklkLCAnMTAwJScpO1xyXG5cclxuICAgICAgICBvcHRpb25JbWFnZS5hcHBlbmRDaGlsZChzdmcuaHRtbEVsZW1lbnQpO1xyXG5cclxuICAgICAgICBodG1sRWxlbWVudC5hcHBlbmRDaGlsZChvcHRpb25JbWFnZSk7XHJcblxyXG4gICAgICAgIGNvbnN0IG9wdGlvblRleHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgICBvcHRpb25UZXh0LmNsYXNzTGlzdC5hZGQoJ29wdGlvbi10ZXh0Jyk7XHJcblxyXG4gICAgICAgIGNvbnN0IGJsb2NrVGl0bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdwJyk7XHJcbiAgICAgICAgYmxvY2tUaXRsZS5jbGFzc0xpc3QuYWRkKCdibG9jay10aXRsZScpO1xyXG4gICAgICAgIGJsb2NrVGl0bGUuaW5uZXJUZXh0ID0gdGhpcy5wcm9wcy50aXRsZTtcclxuXHJcbiAgICAgICAgb3B0aW9uVGV4dC5hcHBlbmRDaGlsZChibG9ja1RpdGxlKTtcclxuXHJcbiAgICAgICAgY29uc3QgYmxvY2tEZXNjcmlwdGlvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3AnKTtcclxuICAgICAgICBibG9ja0Rlc2NyaXB0aW9uLmNsYXNzTGlzdC5hZGQoJ2Jsb2NrLWRlc2NyaXB0aW9uJyk7XHJcbiAgICAgICAgYmxvY2tEZXNjcmlwdGlvbi5pbm5lclRleHQgPSB0aGlzLnByb3BzLmRlc2NyaXB0aW9uO1xyXG5cclxuXHJcbiAgICAgICAgb3B0aW9uVGV4dC5hcHBlbmRDaGlsZChibG9ja0Rlc2NyaXB0aW9uKTtcclxuXHJcbiAgICAgICAgaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQob3B0aW9uVGV4dCk7XHJcblxyXG4gICAgICAgIHJldHVybiBodG1sRWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgZGlzcGxheSgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiAnZmxleCc7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGZpbHRlclZhbHVlKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbHRlclZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBpbW1lZGlhdGVQYXJlbnQgKCk6IFF1aWNrTWVudVNlY3Rpb24ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9pbW1lZGlhdGVQYXJlbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGJsb2NrVHlwZSgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9ibG9ja1R5cGU7XHJcbiAgICB9XHJcblxyXG4gICAgZm9jdXMoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdvcHRpb24tZm9jdXNlZCcpO1xyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuZm9jdXMoKTtcclxuICAgIH1cclxuXHJcbiAgICByZW1vdmVGb2N1cygpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ29wdGlvbi1mb2N1c2VkJyk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIGVtaXRDb21tYW5kRXZlbnQoKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQ8SUNvbW1hbmRFdmVudERldGFpbD4oQ3VzdG9tRXZlbnRzLmVtaXR0ZWRDb21tYW5kLCB7XHJcbiAgICAgICAgICAgIGRldGFpbDoge1xyXG4gICAgICAgICAgICAgICAgY29tbWFuZDogQ29tbWFuZHMudHJhbnNmb3JtQmxvY2ssXHJcbiAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5ibG9ja1R5cGVcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KGN1c3RvbUV2ZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBhdHRhY2hFdmVudHMoKTogdm9pZCB7XHJcblxyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgKCkgPT4ge1xyXG5cclxuICAgICAgICAgICAgY29uc3Qgbm9kZTogSk5vZGU8UXVpY2tNZW51SXRlbT4gPSB0aGlzLl9pbW1lZGlhdGVQYXJlbnQubWVudUl0ZW1zLmZpbmQodGhpcykhO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5faW1tZWRpYXRlUGFyZW50LmltbWVkaWF0ZVBhcmVudC5zd2l0Y2hWaXN1YWxGb2N1cyhub2RlISk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZXZlbnQpID0+IHtcclxuXHJcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5lbWl0Q29tbWFuZEV2ZW50KCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBRdWlja01lbnUgfSBmcm9tIFwiLi4vY29tcG9uZW50cy9xdWljay1tZW51L1F1aWNrTWVudVwiO1xyXG5pbXBvcnQgeyBRdWlja01lbnVTZWN0aW9uIH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvcXVpY2stbWVudS9RdWlja01lbnVTZWN0aW9uXCI7XHJcbmltcG9ydCB7IFF1aWNrTWVudUl0ZW0gfSBmcm9tIFwiLi4vY29tcG9uZW50cy9xdWljay1tZW51L1F1aWNrTWVudUl0ZW1cIjtcclxuaW1wb3J0IHsgRWxlbWVudEZhY3RvcnlTZXJ2aWNlIH0gZnJvbSBcIi4uL3NlcnZpY2VzL2VsZW1lbnQtZmFjdG9yeS9FbGVtZW50RmFjdG9yeVNlcnZpY2VcIjtcclxuaW1wb3J0IHsgSWNvbnMgfSBmcm9tIFwiQC9jb21tb24vSWNvbnNcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBRdWlja01lbnVCdWlsZGVyIHtcclxuXHJcbiAgICBzdGF0aWMgYnVpbGQoKTogUXVpY2tNZW51IHtcclxuXHJcbiAgICAgICAgY29uc3QgcXVpY2tNZW51OiBRdWlja01lbnUgPSBRdWlja01lbnUuZ2V0SW5zdGFuY2UoKTtcclxuXHJcbiAgICAgICAgY29uc3QgYmFzaWNCbG9ja3NTZWN0aW9uOiBRdWlja01lbnVTZWN0aW9uID0gbmV3IFF1aWNrTWVudVNlY3Rpb24oeyBxdWlja01lbnVJbnN0YW5jZTogcXVpY2tNZW51LCB0aXRsZTogJ0Jhc2ljIGJsb2NrcycsIGNsYXNzTGlzdDogJ2Jhc2ljLXNlY3Rpb24nIH0pO1xyXG5cclxuICAgICAgICBiYXNpY0Jsb2Nrc1NlY3Rpb24uYXBwZW5kUXVpY2tNZW51SXRlbXMoW1xyXG4gICAgICAgICAgICBuZXcgUXVpY2tNZW51SXRlbShiYXNpY0Jsb2Nrc1NlY3Rpb24sICdUZXh0JywgJ1N0YXJ0IHdyaXRpbmcgaW4gcGxhaW4gdGV4dC4nLCAnaWNvbi1tYXRlcmlhbC1mb3JtYXQnLCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5QQVJBR1JBUEgsIFwicGFyYWdyYXBoIHRleHQgcFwiKSxcclxuICAgICAgICAgICAgbmV3IFF1aWNrTWVudUl0ZW0oYmFzaWNCbG9ja3NTZWN0aW9uLCAnQnVsbGV0ZWQgbGlzdCcsICdPcmdhbml6ZSBpdGVtcyB3aXRoIGJ1bGxldCBwb2ludHMuJywgJ2ljb24td29yZHByZXNzLWJ1bGxldGVkLWxpc3QnLCAnYnVsbGV0ZWQtbGlzdCcsIFwiYnVsbGV0ZWQgbGlzdCB1bm9yZGVyZWQgbGlzdCB1bFwiKSxcclxuICAgICAgICAgICAgbmV3IFF1aWNrTWVudUl0ZW0oYmFzaWNCbG9ja3NTZWN0aW9uLCAnTnVtYmVyZWQgbGlzdCcsICdMaXN0IGl0ZW1zIGluIGEgbnVtYmVyZWQgZm9ybWF0LicsICdpY29uLXdvcmRwcmVzcy1udW1iZXJlZC1saXN0JywgJ251bWJlcmVkLWxpc3QnLCBcIm51bWJlcmVkIGxpc3QgbnVtYmVyIGxpc3Qgc2VxdWVudGlhbCBsaXN0IG9sIGVudW1lcmF0ZWQgbGlzdCBvcmRlcmVkIGxpc3RcIiksXHJcbiAgICAgICAgICAgIG5ldyBRdWlja01lbnVJdGVtKGJhc2ljQmxvY2tzU2VjdGlvbiwgJ1RhYmxlJywgJ09yZ2FuaXplIGRhdGEgaW4gcm93cyBhbmQgY29sdW1ucy4nLCAnaWNvbi1tYXRlcmlhbC10YWJsZScsIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLlRBQkxFLCBcInRhYmxlIHRyIHRoXCIpLFxyXG4gICAgICAgICAgICBuZXcgUXVpY2tNZW51SXRlbShiYXNpY0Jsb2Nrc1NlY3Rpb24sICdDYWxsb3V0JywgJ0VtcGhhc2l6ZSBrZXkgcG9pbnRzIHdpdGggYSBjYWxsb3V0IGJveC4nLCBJY29ucy5DYWxsb3V0LCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5DQUxMT1VULCBcImNhbGxvdXQgbm90ZSBzcG90bGlnaHRcIiksXHJcbiAgICAgICAgICAgIG5ldyBRdWlja01lbnVJdGVtKGJhc2ljQmxvY2tzU2VjdGlvbiwgJ0NvZGUnLCAnSW5jbHVkZSBjb2RlIHNuaXBwZXQuJywgJ2ljb24td29yZHByZXNzLWNvZGUtbWFyaycsICdjb2RlJywgXCJjb2RlIHNjcmlwdCBzb3VyY2UgbWFya3VwXCIpLFxyXG4gICAgICAgICAgICBuZXcgUXVpY2tNZW51SXRlbShiYXNpY0Jsb2Nrc1NlY3Rpb24sICdRdW90ZScsICdIaWdobGlnaHQgdGV4dCBhcyBhIHF1b3RlLicsICdpY29uLXdvcmRwcmVzcy1xdW90ZScsICdxdW90ZScsIFwicXVvdGUgYmxvY2txdW90ZSBjaXRhdGlvbiBxdW90YXRpb25cIiksXHJcbiAgICAgICAgICAgIG5ldyBRdWlja01lbnVJdGVtKGJhc2ljQmxvY2tzU2VjdGlvbiwgJ0hlYWRpbmcgMicsICdNZWRpdW0gaGVhZGVyIGZvciBzZWN0aW9ucy4nLCAnaWNvbi1qdWxpYS1oZWFkLTInLCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfMiwgXCJoZWFkZXIgMiBoZWFkaW5nIDIgaDJcIiksXHJcbiAgICAgICAgICAgIG5ldyBRdWlja01lbnVJdGVtKGJhc2ljQmxvY2tzU2VjdGlvbiwgJ0hlYWRpbmcgMycsICdTbWFsbCBoZWFkZXIgZm9yIHN1YnNlY3Rpb25zLicsICdpY29uLWp1bGlhLWhlYWQtMicsIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl8zLCBcImhlYWRlciAzIGhlYWRpbmcgMyBoM1wiKSxcclxuICAgICAgICAgICAgbmV3IFF1aWNrTWVudUl0ZW0oYmFzaWNCbG9ja3NTZWN0aW9uLCAnU2VwYXJhdG9yJywgJ1Zpc3VhbGx5IGRpdmlkZSBibG9ja3MuJywgJ2ljb24td29yZHByZXNzLXNlcGFyYXRvcicsICdzZXBhcmF0b3InLCBcInNlcGFyYXRvciBkaXZpZGVyIHJ1bGUgbGluZVwiKVxyXG4gICAgICAgIF0pO1xyXG5cclxuICAgICAgICBxdWlja01lbnUuYXBwZW5kKGJhc2ljQmxvY2tzU2VjdGlvbik7XHJcblxyXG4gICAgICAgIGNvbnN0IG1lZGlhQmxvY2tzU2VjdGlvbiA9IG5ldyBRdWlja01lbnVTZWN0aW9uKHsgcXVpY2tNZW51SW5zdGFuY2U6IHF1aWNrTWVudSwgdGl0bGU6ICdNZWRpYScsIGNsYXNzTGlzdDogJ21lZGlhLXNlY3Rpb24nIH0pO1xyXG5cclxuICAgICAgICBtZWRpYUJsb2Nrc1NlY3Rpb24uYXBwZW5kUXVpY2tNZW51SXRlbXMoW1xyXG4gICAgICAgICAgICBuZXcgUXVpY2tNZW51SXRlbShtZWRpYUJsb2Nrc1NlY3Rpb24sICdJbWFnZScsICdVcGxvYWQgaW1hZ2UuJywgSWNvbnMuSW1hZ2UsIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLklNQUdFLCBcImltYWdlIGZpZ3VyZSBwaG90byBpbGx1c3RyYXRpb24gcGljdHVyZSBtZWRpYSB1cGxvYWRcIiksXHJcbiAgICAgICAgICAgIG5ldyBRdWlja01lbnVJdGVtKG1lZGlhQmxvY2tzU2VjdGlvbiwgJ1ZpZGVvJywgJ0VtYmVkIHZpZGVvLicsIEljb25zLlZpZGVvLCAndmlkZW8nLCBcInZpZGVvIGVtYmVkIHlvdXR1YmUgdmltZW8gY2xpcCBmaWxtIG1vdmllIHRhcGVcIilcclxuICAgICAgICBdKTtcclxuXHJcbiAgICAgICAgcXVpY2tNZW51LmFwcGVuZChtZWRpYUJsb2Nrc1NlY3Rpb24pO1xyXG5cclxuICAgICAgICBjb25zdCBoZWFkaW5nQmxvY2tzU2VjdGlvbiA9IG5ldyBRdWlja01lbnVTZWN0aW9uKHsgcXVpY2tNZW51SW5zdGFuY2U6IHF1aWNrTWVudSwgdGl0bGU6ICdIZWFkaW5nJywgY2xhc3NMaXN0OiAnaGVhZGluZy1zZWN0aW9uJyB9KTtcclxuXHJcbiAgICAgICAgaGVhZGluZ0Jsb2Nrc1NlY3Rpb24uYXBwZW5kUXVpY2tNZW51SXRlbXMoW1xyXG4gICAgICAgICAgICBuZXcgUXVpY2tNZW51SXRlbShoZWFkaW5nQmxvY2tzU2VjdGlvbiwgJ0hlYWRpbmcgMScsICdMYXJnZSBoZWFkZXIgZm9yIG1haW4gdG9waWNzLicsICdpY29uLWp1bGlhLWhlYWQtMScsIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl8xLCBcImhlYWRlciAxIGhlYWRpbmcgMSBoMVwiKSxcclxuICAgICAgICAgICAgbmV3IFF1aWNrTWVudUl0ZW0oaGVhZGluZ0Jsb2Nrc1NlY3Rpb24sICdIZWFkaW5nIDInLCAnTWVkaXVtIGhlYWRlciBmb3Igc2VjdGlvbnMuJywgJ2ljb24tanVsaWEtaGVhZC0yJywgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuSEVBREVSXzIsIFwiaGVhZGVyIDIgaGVhZGluZyAyIGgyXCIpLFxyXG4gICAgICAgICAgICBuZXcgUXVpY2tNZW51SXRlbShoZWFkaW5nQmxvY2tzU2VjdGlvbiwgJ0hlYWRpbmcgMycsICdTbWFsbCBoZWFkZXIgZm9yIHN1YnNlY3Rpb25zLicsICdpY29uLWp1bGlhLWhlYWQtMycsIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl8zLCBcImhlYWRlciAzIGhlYWRpbmcgMyBoM1wiKSxcclxuICAgICAgICAgICAgbmV3IFF1aWNrTWVudUl0ZW0oaGVhZGluZ0Jsb2Nrc1NlY3Rpb24sICdIZWFkaW5nIDQnLCAnRGV0YWlsZWQgaGVhZGVyIGZvciBzdWJ0b3BpY3MuJywgJ2ljb24tanVsaWEtaGVhZC00JywgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuSEVBREVSXzQsIFwiaGVhZGVyIDQgaGVhZGluZyA0IGg0XCIpLFxyXG4gICAgICAgICAgICBuZXcgUXVpY2tNZW51SXRlbShoZWFkaW5nQmxvY2tzU2VjdGlvbiwgJ0hlYWRpbmcgNScsICdNaW5vciBoZWFkZXIgZm9yIHNwZWNpZmljcy4nLCAnaWNvbi1qdWxpYS1oZWFkLTUnLCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfNSwgXCJoZWFkZXIgNSBoZWFkaW5nIDUgaDVcIiksXHJcbiAgICAgICAgICAgIG5ldyBRdWlja01lbnVJdGVtKGhlYWRpbmdCbG9ja3NTZWN0aW9uLCAnSGVhZGluZyA2JywgJ1NtYWxsZXN0IGhlYWRlciBmb3IgZmluZSBkZXRhaWxzLicsICdpY29uLWp1bGlhLWhlYWQtNicsIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl82LCBcImhlYWRlciA2IGhlYWRpbmcgNiBoNlwiKSxcclxuICAgICAgICBdKTtcclxuXHJcbiAgICAgICAgcXVpY2tNZW51LmFwcGVuZChoZWFkaW5nQmxvY2tzU2VjdGlvbik7XHJcblxyXG5cclxuICAgICAgICBjb25zdCBsaXN0QmxvY2tzU2VjdGlvbiA9IG5ldyBRdWlja01lbnVTZWN0aW9uKHsgcXVpY2tNZW51SW5zdGFuY2U6IHF1aWNrTWVudSwgdGl0bGU6ICdMaXN0JywgY2xhc3NMaXN0OiAnbGlzdC1zZWN0aW9uJyB9KTtcclxuXHJcbiAgICAgICAgbGlzdEJsb2Nrc1NlY3Rpb24uYXBwZW5kUXVpY2tNZW51SXRlbXMoW1xyXG4gICAgICAgICAgICBuZXcgUXVpY2tNZW51SXRlbShsaXN0QmxvY2tzU2VjdGlvbiwgJ1RvZG8gbGlzdCcsICdUcmFjayB0YXNrcyB3aXRoIGNoZWNrYm94ZXMuJywgJ2ljb24tbWF0ZXJpYWwtY2hlY2stbGlzdC0yJywgJ3RvZG8tbGlzdCcsIFwidG9kbyBsaXN0IHRhc2sgbGlzdCBjaGVja2xpc3RcIiksXHJcbiAgICAgICAgICAgIG5ldyBRdWlja01lbnVJdGVtKGxpc3RCbG9ja3NTZWN0aW9uLCAnQnVsbGV0ZWQgbGlzdCcsICdPcmdhbml6ZSBpdGVtcyB3aXRoIGJ1bGxldCBwb2ludHMuJywgJ2ljb24td29yZHByZXNzLWJ1bGxldGVkLWxpc3QnLCAnYnVsbGV0ZWQtbGlzdCcsIFwiYnVsbGV0ZWQgbGlzdCB1bm9yZGVyZWQgbGlzdCB1bFwiKSxcclxuICAgICAgICAgICAgbmV3IFF1aWNrTWVudUl0ZW0obGlzdEJsb2Nrc1NlY3Rpb24sICdOdW1iZXJlZCBsaXN0JywgJ0xpc3QgaXRlbXMgaW4gYSBudW1iZXJlZCBmb3JtYXQuJywgJ2ljb24td29yZHByZXNzLW51bWJlcmVkLWxpc3QnLCAnbnVtYmVyZWQtbGlzdCcsIFwibnVtYmVyZWQgbGlzdCBudW1iZXIgbGlzdCBzZXF1ZW50aWFsIGxpc3Qgb2wgZW51bWVyYXRlZCBsaXN0IG9yZGVyZWQgbGlzdFwiKVxyXG4gICAgICAgIF0pO1xyXG5cclxuICAgICAgICBxdWlja01lbnUuYXBwZW5kKGxpc3RCbG9ja3NTZWN0aW9uKTtcclxuICAgICAgICBcclxuICAgICAgICBcclxuICAgICAgICBjb25zdCBlbWJlZFNlY3Rpb24gPSBuZXcgUXVpY2tNZW51U2VjdGlvbih7IHF1aWNrTWVudUluc3RhbmNlOiBxdWlja01lbnUsIHRpdGxlOiAnRW1iZWQnLCBjbGFzc0xpc3Q6ICdlbWJlZC1zZWN0aW9uJyB9KTtcclxuXHJcbiAgICAgICAgZW1iZWRTZWN0aW9uLmFwcGVuZFF1aWNrTWVudUl0ZW1zKFtcclxuICAgICAgICAgICAgbmV3IFF1aWNrTWVudUl0ZW0oZW1iZWRTZWN0aW9uLCAnR2l0SHViIEdpc3QnLCAnVHJhY2sgdGFza3Mgd2l0aCBjaGVja2JveGVzLicsICdpY29uLW1hdGVyaWFsLWNoZWNrLWxpc3QtMicsICd0b2RvLWxpc3QnLCBcInRvZG8gbGlzdCB0YXNrIGxpc3QgY2hlY2tsaXN0XCIpLFxyXG4gICAgICAgICAgICBuZXcgUXVpY2tNZW51SXRlbShlbWJlZFNlY3Rpb24sICdHaXRMYWIgU25pcHBldCAnLCAnTGlzdCBpdGVtcyBpbiBhIG51bWJlcmVkIGZvcm1hdC4nLCAnaWNvbi13b3JkcHJlc3MtbnVtYmVyZWQtbGlzdCcsICdudW1iZXJlZC1saXN0JywgXCJudW1iZXJlZCBsaXN0IG51bWJlciBsaXN0IHNlcXVlbnRpYWwgbGlzdCBvbCBlbnVtZXJhdGVkIGxpc3Qgb3JkZXJlZCBsaXN0XCIpLFxyXG4gICAgICAgICAgICBuZXcgUXVpY2tNZW51SXRlbShlbWJlZFNlY3Rpb24sICdDb2RlUGVuJywgJ09yZ2FuaXplIGl0ZW1zIHdpdGggYnVsbGV0IHBvaW50cy4nLCAnaWNvbi13b3JkcHJlc3MtYnVsbGV0ZWQtbGlzdCcsICdidWxsZXRlZC1saXN0JywgXCJidWxsZXRlZCBsaXN0IHVub3JkZXJlZCBsaXN0IHVsXCIpLFxyXG4gICAgICAgICAgICBuZXcgUXVpY2tNZW51SXRlbShlbWJlZFNlY3Rpb24sICdHb29nbGUgTWFwcycsICdMaXN0IGl0ZW1zIGluIGEgbnVtYmVyZWQgZm9ybWF0LicsICdpY29uLXdvcmRwcmVzcy1udW1iZXJlZC1saXN0JywgJ251bWJlcmVkLWxpc3QnLCBcIm51bWJlcmVkIGxpc3QgbnVtYmVyIGxpc3Qgc2VxdWVudGlhbCBsaXN0IG9sIGVudW1lcmF0ZWQgbGlzdCBvcmRlcmVkIGxpc3RcIiksXHJcbiAgICAgICAgXSk7XHJcblxyXG4gICAgICAgIHF1aWNrTWVudS5hcHBlbmQoZW1iZWRTZWN0aW9uKTsgICAgXHJcblxyXG4gICAgICAgIHJldHVybiBxdWlja01lbnU7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBCYXNlVUlDb21wb25lbnQgfSBmcm9tIFwiLi4vY29tbW9uL0Jhc2VVSUNvbXBvbmVudFwiO1xyXG5pbXBvcnQgeyBDdXN0b21FdmVudHMgfSBmcm9tIFwiQC9jb21tb24vQ3VzdG9tRXZlbnRzXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgVGl0bGUgZXh0ZW5kcyBCYXNlVUlDb21wb25lbnQge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcclxuXHJcbiAgICAgICAgc3VwZXIoe1xyXG4gICAgICAgICAgICB2YWx1ZTogdmFsdWVcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5hdHRhY2hFdmVudHMoKTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0KCk6IEhUTUxFbGVtZW50IHtcclxuXHJcbiAgICAgICAgY29uc3QgaHRtbEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJ0aXRsZVwiKTtcclxuXHJcbiAgICAgICAgY29uc3QgaDEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaDFcIik7XHJcbiAgICAgICAgaDEuc2V0QXR0cmlidXRlKFwiY29udGVudEVkaXRhYmxlXCIsIFwidHJ1ZVwiKTtcclxuICAgICAgICBoMS5zZXRBdHRyaWJ1dGUoXCJkYXRhLXBsYWNlaG9sZGVyXCIsIFwiVW50aXRsZWRcIik7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnByb3BzLnZhbHVlKSB7XHJcbiAgICAgICAgICAgIGgxLnRleHRDb250ZW50ID0gdGhpcy5wcm9wcy52YWx1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGh0bWxFbGVtZW50LmFwcGVuZENoaWxkKGgxKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGh0bWxFbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIGF0dGFjaEV2ZW50cygpIHtcclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIChldmVudCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoZXZlbnQua2V5ID09IFwiRW50ZXJcIikge1xyXG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KEN1c3RvbUV2ZW50cy5mb2N1c09uRmlyc3RSZXF1ZXN0ZWQsIHt9KSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgY3JlYXRlKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBUaXRsZSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBUaXRsZSh2YWx1ZSk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBUaXRsZSB9IGZyb20gXCJAL2NvbXBvbmVudHMvdGl0bGUvVGl0bGVcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBUaXRsZUJ1aWxkZXIge1xyXG4gICAgc3RhdGljIGJ1aWxkKCk6IFRpdGxlIHtcclxuICAgICAgICByZXR1cm4gVGl0bGUuY3JlYXRlKHdpbmRvdy5lZGl0b3JDb25maWc/LnRpdGxlKVxyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgRWxlbWVudEZhY3RvcnlTZXJ2aWNlIH0gZnJvbSBcIkAvc2VydmljZXMvZWxlbWVudC1mYWN0b3J5L0VsZW1lbnRGYWN0b3J5U2VydmljZVwiO1xyXG5pbXBvcnQgeyBCYXNlVUlDb21wb25lbnQgfSBmcm9tIFwiLi4vY29tbW9uL0Jhc2VVSUNvbXBvbmVudFwiO1xyXG5pbXBvcnQgeyBDdXN0b21FdmVudHMgfSBmcm9tIFwiQC9jb21tb24vQ3VzdG9tRXZlbnRzXCI7XHJcbmltcG9ydCB7IENvbW1hbmRzIH0gZnJvbSBcIkAvY29tbWFuZHMvQ29tbWFuZHNcIjtcclxuaW1wb3J0IHsgSUNvbW1hbmRFdmVudERldGFpbCB9IGZyb20gXCJAL2NvbW1hbmRzL0lDb21tYW5kRXZlbnREZXRhaWxcIjtcclxuaW1wb3J0IHsgRGVwZW5kZW5jeUNvbnRhaW5lciB9IGZyb20gXCJAL2NvcmUvRGVwZW5kZW5jeUNvbnRhaW5lclwiO1xyXG5pbXBvcnQgeyBJUXVpY2tNZW51IH0gZnJvbSBcIi4uL3F1aWNrLW1lbnUvSVF1aWNrTWVudVwiO1xyXG5pbXBvcnQgeyBJU2hvcnRjdXRMaXN0ZW5lcnMgfSBmcm9tIFwiQC9jb3JlL0lTaG9ydGN1dExpc3RlbmVyc1wiO1xyXG5pbXBvcnQgeyBJVGFibGVMaXN0ZW5lcnMgfSBmcm9tIFwiQC9jb3JlL2xpc3RlbmVycy9JVGFibGVMaXN0ZW5lcnNcIjtcclxuaW1wb3J0IHsgSVRhYmxlQ29udGV4dEZsb2F0aW5nVG9vbGJhciB9IGZyb20gXCIuLi9mbG9hdGluZy10b29sYmFyL0lUYWJsZUNvbnRleHRGbG9hdGluZ1Rvb2xiYXJcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBDb250ZW50IGV4dGVuZHMgQmFzZVVJQ29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG5cclxuICAgICAgICBzdXBlcih7fSk7XHJcblxyXG4gICAgICAgIHRoaXMuYXR0YWNoRXZlbnQoKTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0KCk6IEhUTUxFbGVtZW50IHtcclxuXHJcbiAgICAgICAgY29uc3QgaHRtbEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJjb250ZW50XCIpO1xyXG5cclxuICAgICAgICBpZiAod2luZG93LmVkaXRvckNvbmZpZz8uaW5jbHVkZUZpcnN0UGFyYWdyYXBoIHx8IHRydWUpIHtcclxuICAgICAgICAgICAgaHRtbEVsZW1lbnQuYXBwZW5kKEVsZW1lbnRGYWN0b3J5U2VydmljZS5ibG9ja1BhcmFncmFwaCgpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBodG1sRWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICogQ2xlYXJzIHRleHQgc2VsZWN0aW9uIHdoZW4gaW5pdGlhdGluZyBhIGRyYWcgZnJvbSBlbGVtZW50cyB3aXRoIHRoZSBgLmRyYWctaGFuZGxlcmAgY2xhc3MuXHJcbiAgICAqIFRoaXMgZnVuY3Rpb24gYXR0YWNoZXMgYSBgbW91c2Vkb3duYCBldmVudCBsaXN0ZW5lciB0byB0aGUgZW50aXJlIGRvY3VtZW50LiBXaGVuIGEgbW91c2Vkb3duXHJcbiAgICAqIGV2ZW50IG9jY3VycyBvbiBhbiBlbGVtZW50IHRoYXQgaXMgYSBjaGlsZCBvZiBhIGAuZHJhZy1oYW5kbGVyYCBvciBvbiB0aGUgYC5kcmFnLWhhbmRsZXJgIGl0c2VsZixcclxuICAgICogaXQgY2hlY2tzIGlmIHRoZSB0YXJnZXQgb3IgaXRzIHBhcmVudCBpcyBhIGRlc2lnbmF0ZWQgZHJhZyBoYW5kbGVyLiBJZiB0cnVlLCBpdCBjbGVhcnMgYW55IGN1cnJlbnQgdGV4dCBzZWxlY3Rpb25zLlxyXG4gICAgKiBUaGlzIHByZXZlbnRzIHRleHQgZnJvbSBiZWluZyBhY2NpZGVudGFsbHkgc2VsZWN0ZWQgZHVyaW5nIGRyYWctYW5kLWRyb3AgaW50ZXJhY3Rpb25zLCBlbmhhbmNpbmcgVVggaW4gZHJhZ2dhYmxlIGludGVyZmFjZXMuXHJcbiAgICAqIFxyXG4gICAgKiBAZnVuY3Rpb24gY2xlYXJTZWxlY3Rpb25PbkRyYWdcclxuICAgICovXHJcbiAgICBjbGVhclNlbGVjdGlvbk9uRHJhZygpIHtcclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vkb3duXCIsIChldmVudCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgICAgICBsZXQgcGFyZW50OiBFbGVtZW50IHwgbnVsbDtcclxuXHJcbiAgICAgICAgICAgIGlmIChlbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5ub2RlVHlwZSA9PSBOb2RlLlRFWFRfTk9ERSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudCA9IGVsZW1lbnQucGFyZW50RWxlbWVudDtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gZWxlbWVudDtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAocGFyZW50ICYmIHBhcmVudC5jbG9zZXN0KFwiLmRyYWctaGFuZGxlclwiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5nZXRTZWxlY3Rpb24oKT8ucmVtb3ZlQWxsUmFuZ2VzKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBhdHRhY2hFdmVudCgpOiB2b2lkIHtcclxuXHJcbiAgICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbk9uRHJhZygpO1xyXG4gICAgICAgIHRoaXMucmVSZW5kZXJQbGFjZWhvbGRlcigpO1xyXG5cclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiY29waWVkVGV4dFwiLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvcHlFbGVtZW50SXRlbSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjY29weU9wdGlvbiAudGV4dC1vcHRpb24gc3BhblwiKSBhcyBIVE1MU3BhbkVsZW1lbnQ7XHJcbiAgICAgICAgICAgIGlmIChjb3B5RWxlbWVudEl0ZW0pIHtcclxuXHJcbiAgICAgICAgICAgICAgICBjb3B5RWxlbWVudEl0ZW0udGV4dENvbnRlbnQgPSBcIkNvcGllZCFcIjtcclxuXHJcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb3B5RWxlbWVudEl0ZW0udGV4dENvbnRlbnQgPSBcIkNvcHlcIjtcclxuICAgICAgICAgICAgICAgIH0sIDE1MDApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vRm9jdXMgb24gUCB3aGVuIGxvYWRcclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBjb25zdCBlZGl0b3IgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuam9oYW5uZXMtZWRpdG9yJyk7XHJcblxyXG4gICAgICAgICAgICBpZiAoZWRpdG9yKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgYmxvY2tzID0gZWRpdG9yLnF1ZXJ5U2VsZWN0b3JBbGwoJy5ibG9jaycpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChibG9ja3MubGVuZ3RoID09IDEpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcCA9IGJsb2Nrc1swXS5xdWVyeVNlbGVjdG9yKCcuam9oYW5uZXMtY29udGVudC1lbGVtZW50JykgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHAuaW5uZXJUZXh0ID09ICcnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHAuZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcblxyXG5cclxuXHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCBhc3luYyAoZXZlbnQpID0+IHtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHF1aWNrTWVudSA9IERlcGVuZGVuY3lDb250YWluZXIuSW5zdGFuY2UucmVzb2x2ZTxJUXVpY2tNZW51PihcIklRdWlja01lbnVcIik7XHJcbiAgICAgICAgICAgIGNvbnN0IHRhYmxlVG9vbGJhciA9IERlcGVuZGVuY3lDb250YWluZXIuSW5zdGFuY2UucmVzb2x2ZTxJVGFibGVDb250ZXh0RmxvYXRpbmdUb29sYmFyPihcIklUYWJsZUNvbnRleHRGbG9hdGluZ1Rvb2xiYXJcIik7XHJcblxyXG4gICAgICAgICAgICBpZiAoZXZlbnQuY3RybEtleSB8fCBldmVudC5zaGlmdEtleSB8fCBldmVudC5hbHRLZXkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJ0VudGVyJyAmJiAhcXVpY2tNZW51LmlzVmlzaWJsZSAmJiAhdGFibGVUb29sYmFyLmlzVmlzaWJsZSkge1xyXG4gICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgZGVmYXVsdCBibG9jayB3aGVuIHByZXNzIEVudGVyXHJcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQ8SUNvbW1hbmRFdmVudERldGFpbD4oQ3VzdG9tRXZlbnRzLmVtaXR0ZWRDb21tYW5kLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGV0YWlsOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ6IENvbW1hbmRzLmluc2VydE5ldyxcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnQmFja3NwYWNlJykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCdqb2hhbm5lcy1jb250ZW50LWVsZW1lbnQnKSAmJiB0YXJnZXQudGV4dENvbnRlbnQ/LnRyaW0oKSA9PT0gJycpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50PElDb21tYW5kRXZlbnREZXRhaWw+KEN1c3RvbUV2ZW50cy5lbWl0dGVkQ29tbWFuZCwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ6IENvbW1hbmRzLmZvY3VzT25QcmV2aW91c0Jsb2NrLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudDxJQ29tbWFuZEV2ZW50RGV0YWlsPihDdXN0b21FdmVudHMuZW1pdHRlZENvbW1hbmQsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGV0YWlsOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kOiBDb21tYW5kcy5mb2N1c09uUHJldmlvdXNCbG9jayxcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygnam9oYW5uZXMtY29udGVudC1lbGVtZW50JykgJiYgdGFyZ2V0LnRleHRDb250ZW50Py50cmltKCkgIT09ICcnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9UT0RPOiBSZXBsYWNlIHRoZSBkZWxldGUgYW5kIGZvY3VzIGJ5IG1lcmdlXHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJ0RlbGV0ZScpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygnam9oYW5uZXMtY29udGVudC1lbGVtZW50JykgJiYgdGFyZ2V0LnRleHRDb250ZW50Py50cmltKCkgPT09ICcnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5ibG9ja09wZXJhdGlvbnNTZXJ2aWNlLmV4ZWNDb21tYW5kKEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuQkxPQ0tfT1BFUkFUSU9OUy5ERUxFVEVfRk9DVVNfT05fTkVYVCwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCdqb2hhbm5lcy1jb250ZW50LWVsZW1lbnQnKSAmJiB0YXJnZXQudGV4dENvbnRlbnQ/LnRyaW0oKSAhPT0gJycpIHtcclxuICAgICAgICAgICAgICAgICAgICAvL1RPRE86IFJlcGxhY2UgdGhlIGRlbGV0ZSBhbmQgZm9jdXMgYnkgbWVyZ2VcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICdBcnJvd1JpZ2h0JyAmJiBDb250ZW50LmlzQ3Vyc29yQXRFbmQoZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KSkge1xyXG4gICAgICAgICAgICAgICAgLy8gdGhpcy5ibG9ja09wZXJhdGlvbnNTZXJ2aWNlLmV4ZWNDb21tYW5kKEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuQkxPQ0tfT1BFUkFUSU9OUy5GT0NVU19PTl9ORVhULCBmYWxzZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dMZWZ0JyAmJiBDb250ZW50LmlzQ3Vyc29yQXRTdGFydChldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyB0aGlzLmJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuZXhlY0NvbW1hbmQoQmxvY2tPcGVyYXRpb25zU2VydmljZS5CTE9DS19PUEVSQVRJT05TLkZPQ1VTX09OX1BSRVZJT1VTLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dEb3duJyAmJiBDb250ZW50LmlzQ3Vyc29yT25MYXN0TGluZSgpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyB0aGlzLmJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuZXhlY0NvbW1hbmQoQmxvY2tPcGVyYXRpb25zU2VydmljZS5CTE9DS19PUEVSQVRJT05TLkZPQ1VTX09OX05FWFQsIGZhbHNlKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICdBcnJvd1VwJyAmJiBDb250ZW50LmlzQ3Vyc29yT25GaXJzdExpbmUoKSkge1xyXG4gICAgICAgICAgICAgICAgLy8gdGhpcy5ibG9ja09wZXJhdGlvbnNTZXJ2aWNlLmV4ZWNDb21tYW5kKEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuQkxPQ0tfT1BFUkFUSU9OUy5GT0NVU19PTl9QUkVWSU9VUywgZmFsc2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICogQWRkcyBhbiBpbnB1dCBldmVudCBsaXN0ZW5lciB0byB0aGUgZW50aXJlIGRvY3VtZW50IHRvIGhhbmRsZSBwbGFjZWhvbGRlciBiZWhhdmlvciBmb3IgY29udGVudEVkaXRhYmxlIGVsZW1lbnRzLlxyXG4gICAgKiBUaGlzIHdvcmthcm91bmQgaXMgc3BlY2lmaWNhbGx5IGRlc2lnbmVkIHRvIGFkZHJlc3MgYSBrbm93biBpc3N1ZSBpbiBGaXJlZm94IHdoZXJlIGNvbnRlbnRFZGl0YWJsZSBlbGVtZW50c1xyXG4gICAgKiBkbyBub3QgcHJvcGVybHkgcmVzZXQgdGhlaXIgcGxhY2Vob2xkZXJzIGFmdGVyIHRoZSBjb250ZW50IGlzIGRlbGV0ZWQgYnkgdGhlIHVzZXIuXHJcbiAgICAqIFxyXG4gICAgKiBUaGUgZXZlbnQgbGlzdGVuZXIgY2hlY2tzIGlmIHRoZSB0YXJnZXQgb2YgdGhlIGlucHV0IGV2ZW50IGlzIGEgY29udGVudEVkaXRhYmxlIGVsZW1lbnQgYW5kIHdoZXRoZXIgaXQgaGFzIGFcclxuICAgICogY3VzdG9tICdkYXRhLXBsYWNlaG9sZGVyJyBhdHRyaWJ1dGUuIElmIHRoZSBlbGVtZW50J3MgY29udGVudCBpcyBlbXB0eSAoaWdub3Jpbmcgd2hpdGUgc3BhY2VzKSwgdGhlIGZ1bmN0aW9uXHJcbiAgICAqIHJlc2V0cyB0aGUgJ2RhdGEtcGxhY2Vob2xkZXInIHRvIGVuc3VyZSBpdCBkaXNwbGF5cyBjb3JyZWN0bHksIGFuZCBjbGVhcnMgYW55IHJlc2lkdWFsIHRleHQgY29udGVudCB0aGF0IG1pZ2h0XHJcbiAgICAqIGludGVyZmVyZSB3aXRoIHRoZSBwbGFjZWhvbGRlciBkaXNwbGF5LlxyXG4gICAgKiBcclxuICAgICogQGV4YW1wbGVcclxuICAgICogLy8gVG8gdXRpbGl6ZSB0aGlzIHdvcmthcm91bmQsIGVuc3VyZSB5b3VyIGNvbnRlbnRFZGl0YWJsZSBlbGVtZW50cyBoYXZlIGEgJ2RhdGEtcGxhY2Vob2xkZXInIGF0dHJpYnV0ZS5cclxuICAgICogLy8gPGRpdiBjb250ZW50RWRpdGFibGU9XCJ0cnVlXCIgZGF0YS1wbGFjZWhvbGRlcj1cIkVudGVyIHRleHQgaGVyZS4uLlwiPjwvZGl2PlxyXG4gICAgKiBcclxuICAgICogQHBhcmFtIHtFdmVudH0gZXZlbnQgLSBUaGUgaW5wdXQgZXZlbnQgdHJpZ2dlcmVkIGJ5IHVzZXIgaW50ZXJhY3Rpb24gd2l0aCB0aGUgZG9jdW1lbnQncyBpbnB1dC1jYXBhYmxlIGVsZW1lbnRzLlxyXG4gICAgKi9cclxuICAgIHJlUmVuZGVyUGxhY2Vob2xkZXIoKSB7XHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCBmdW5jdGlvbiAoZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICAgICAgICAgIGlmIChldmVudC50YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZWRpdGFibGVFbGVtZW50ID0gZXZlbnQudGFyZ2V0O1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChlZGl0YWJsZUVsZW1lbnQuaXNDb250ZW50RWRpdGFibGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZWRpdGFibGVFbGVtZW50Lmhhc0F0dHJpYnV0ZSgnZGF0YS1wbGFjZWhvbGRlcicpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1c3RvbVBsYWNlaG9sZGVyID0gZWRpdGFibGVFbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1wbGFjZWhvbGRlcicpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVkaXRhYmxlRWxlbWVudC50ZXh0Q29udGVudD8udHJpbSgpID09PSAnJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWRpdGFibGVFbGVtZW50LnNldEF0dHJpYnV0ZSgnZGF0YS1wbGFjZWhvbGRlcicsIGN1c3RvbVBsYWNlaG9sZGVyIHx8ICcnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkaXRhYmxlRWxlbWVudC50ZXh0Q29udGVudCA9ICcnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGlzQ3Vyc29yQXRFbmQodGFyZ2V0OiBIVE1MRWxlbWVudCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGNvbnN0IGZvY3VzYWJsZVBhcmVudCA9IHRhcmdldC5jbG9zZXN0KCcuZm9jdXNhYmxlJyk7XHJcbiAgICAgICAgaWYgKCFmb2N1c2FibGVQYXJlbnQpIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpITtcclxuICAgICAgICBpZiAoIXNlbGVjdGlvbi5yYW5nZUNvdW50KSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XHJcbiAgICAgICAgbGV0IGVuZE5vZGU6IE5vZGUgfCBudWxsID0gcmFuZ2UuZW5kQ29udGFpbmVyO1xyXG4gICAgICAgIGlmIChlbmROb2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xyXG4gICAgICAgICAgICBlbmROb2RlID0gZW5kTm9kZS5wYXJlbnROb2RlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmFuZ2UuY29sbGFwc2VkICYmIGVuZE5vZGUgPT09IGZvY3VzYWJsZVBhcmVudCAmJiByYW5nZS5lbmRPZmZzZXQgPT09IChyYW5nZS5lbmRDb250YWluZXIudGV4dENvbnRlbnQgfHwgJycpLmxlbmd0aDtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgaXNDdXJzb3JBdFN0YXJ0KHRhcmdldDogSFRNTEVsZW1lbnQpOiBib29sZWFuIHtcclxuICAgICAgICBjb25zdCBmb2N1c2FibGVQYXJlbnQgPSB0YXJnZXQuY2xvc2VzdCgnLmZvY3VzYWJsZScpO1xyXG4gICAgICAgIGlmICghZm9jdXNhYmxlUGFyZW50KSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKSE7XHJcbiAgICAgICAgaWYgKCFzZWxlY3Rpb24ucmFuZ2VDb3VudCkgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xyXG5cclxuICAgICAgICBsZXQgc3RhcnROb2RlOiBOb2RlIHwgbnVsbCA9IHJhbmdlLnN0YXJ0Q29udGFpbmVyO1xyXG4gICAgICAgIGlmIChzdGFydE5vZGUubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XHJcbiAgICAgICAgICAgIHN0YXJ0Tm9kZSA9IHN0YXJ0Tm9kZS5wYXJlbnROb2RlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmFuZ2UuY29sbGFwc2VkICYmIHN0YXJ0Tm9kZSA9PT0gZm9jdXNhYmxlUGFyZW50ICYmIHJhbmdlLnN0YXJ0T2Zmc2V0ID09PSAwO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBpc0F0Rmlyc3RWaXNpYmxlTGluZShlbGVtZW50OiBIVE1MRWxlbWVudCkge1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKSE7XHJcbiAgICAgICAgaWYgKCFzZWxlY3Rpb24ucmFuZ2VDb3VudCkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCkuY2xvbmVSYW5nZSgpO1xyXG4gICAgICAgIHJhbmdlLmNvbGxhcHNlKHRydWUpO1xyXG4gICAgICAgIHJhbmdlLnNldFN0YXJ0KGVsZW1lbnQsIDApO1xyXG4gICAgICAgIGNvbnN0IHJhbmdlVG9wID0gcmFuZ2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wO1xyXG4gICAgICAgIGNvbnN0IGVsZW1lbnRUb3AgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcDtcclxuXHJcbiAgICAgICAgcmV0dXJuIHJhbmdlVG9wID09PSBlbGVtZW50VG9wO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBpc0F0TGFzdFZpc2libGVMaW5lKGVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpITtcclxuICAgICAgICBpZiAoIXNlbGVjdGlvbi5yYW5nZUNvdW50KSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgY29uc3QgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKS5jbG9uZVJhbmdlKCk7XHJcbiAgICAgICAgcmFuZ2UuY29sbGFwc2UoZmFsc2UpO1xyXG4gICAgICAgIHJhbmdlLnNldEVuZChlbGVtZW50LCBlbGVtZW50LmNoaWxkTm9kZXMubGVuZ3RoKTtcclxuICAgICAgICBjb25zdCByYW5nZUJvdHRvbSA9IHJhbmdlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmJvdHRvbTtcclxuICAgICAgICBjb25zdCBlbGVtZW50Qm90dG9tID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5ib3R0b207XHJcblxyXG4gICAgICAgIHJldHVybiByYW5nZUJvdHRvbSA9PT0gZWxlbWVudEJvdHRvbTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgc3RhdGljIGRpZEN1cnNvck1vdmUoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCkhO1xyXG4gICAgICAgIGlmICghc2VsZWN0aW9uLnJhbmdlQ291bnQpIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xyXG5cclxuICAgICAgICBjb25zdCBvcmlnaW5hbFJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCkuY2xvbmVSYW5nZSgpO1xyXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsUmVjdCA9IG9yaWdpbmFsUmFuZ2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcblxyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTxib29sZWFuPihyZXNvbHZlID0+IHtcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdSYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApLmNsb25lUmFuZ2UoKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG5ld1JlY3QgPSBuZXdSYW5nZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBkaWRNb3ZlID0gIShvcmlnaW5hbFJlY3QudG9wID09PSBuZXdSZWN0LnRvcCAmJiBvcmlnaW5hbFJlY3QubGVmdCA9PT0gbmV3UmVjdC5sZWZ0KTtcclxuICAgICAgICAgICAgICAgIGlmICghZGlkTW92ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKGRpZE1vdmUpO1xyXG4gICAgICAgICAgICB9LCAwKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgaXNDdXJzb3JPbkZpcnN0TGluZSgpOiBib29sZWFuIHtcclxuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgICAgICAgaWYgKCFzZWxlY3Rpb24gfHwgIXNlbGVjdGlvbi5yYW5nZUNvdW50KSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XHJcblxyXG4gICAgICAgIHJldHVybiByYW5nZS5zdGFydE9mZnNldCA9PT0gMCAmJiByYW5nZS5zdGFydENvbnRhaW5lciA9PT0gcmFuZ2UuY29tbW9uQW5jZXN0b3JDb250YWluZXI7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGlzQ3Vyc29yT25MYXN0TGluZSgpOiBib29sZWFuIHtcclxuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgICAgICAgaWYgKCFzZWxlY3Rpb24gfHwgIXNlbGVjdGlvbi5yYW5nZUNvdW50KSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XHJcblxyXG4gICAgICAgIHJldHVybiByYW5nZS5lbmRPZmZzZXQgPT09IHJhbmdlLmVuZENvbnRhaW5lci50ZXh0Q29udGVudD8ubGVuZ3RoICYmIHJhbmdlLmVuZENvbnRhaW5lciA9PT0gcmFuZ2UuY29tbW9uQW5jZXN0b3JDb250YWluZXI7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGdldEluc3RhbmNlKCk6IENvbnRlbnQge1xyXG5cclxuICAgICAgICBjb25zdCBzaG9ydGN1dExpc3RlbmVyID0gRGVwZW5kZW5jeUNvbnRhaW5lci5JbnN0YW5jZS5yZXNvbHZlPElTaG9ydGN1dExpc3RlbmVycz4oXCJJU2hvcnRjdXRMaXN0ZW5lcnNcIik7XHJcbiAgICAgICAgY29uc3QgdGFibGVMaXN0ZW5lcnMgPSBEZXBlbmRlbmN5Q29udGFpbmVyLkluc3RhbmNlLnJlc29sdmU8SVRhYmxlTGlzdGVuZXJzPihcIklUYWJsZUxpc3RlbmVyc1wiKTtcclxuICAgICAgICByZXR1cm4gbmV3IENvbnRlbnQoKTtcclxuICAgIH1cclxufSIsImltcG9ydCB7IENvbnRlbnQgfSBmcm9tIFwiQC9jb21wb25lbnRzL2NvbnRlbnQvQ29udGVudFwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIENvbnRlbnRCdWlsZGVyIHtcclxuICAgIHN0YXRpYyBidWlsZCgpOiBDb250ZW50IHtcclxuICAgICAgICByZXR1cm4gQ29udGVudC5nZXRJbnN0YW5jZSgpO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgRGlyZWN0aW9ucyB9IGZyb20gXCJAL2NvbW1vbi9EaXJlY3Rpb25zXCI7XHJcbmltcG9ydCB7IFRhYmxlU2NvcGVzIH0gZnJvbSBcIkAvc2VydmljZXMvdGFibGUtb3BlcmF0aW9ucy9UYWJsZVNjb3Blc1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFRhYmxlVXRpbHMge1xyXG5cclxuICAgIHN0YXRpYyBhZGRSb3codGFibGU6IEhUTUxUYWJsZUVsZW1lbnQsIHBvc2l0aW9uOiBudW1iZXIgfCBudWxsID0gbnVsbCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGluc2VydFBvc2l0aW9uID0gKHBvc2l0aW9uICE9PSBudWxsICYmIHBvc2l0aW9uID49IDAgJiYgcG9zaXRpb24gPD0gdGFibGUucm93cy5sZW5ndGgpID8gcG9zaXRpb24gOiB0YWJsZS5yb3dzLmxlbmd0aDtcclxuICAgICAgICBjb25zdCBuZXdSb3cgPSB0YWJsZS5pbnNlcnRSb3coaW5zZXJ0UG9zaXRpb24pO1xyXG5cclxuICAgICAgICBjb25zdCBudW1Db2x1bW5zID0gQXJyYXkuZnJvbSh0YWJsZS5yb3dzKS5yZWR1Y2UoKG1heCwgcm93KSA9PiBNYXRoLm1heChtYXgsIHJvdy5jZWxscy5sZW5ndGgpLCAwKTtcclxuICAgICAgICBsZXQgYWZmZWN0ZWRDZWxscyA9IFtdOyAgLy8gQXJyYXkgdG8gaG9sZCByZWZlcmVuY2VzIHRvIG5ldyBjZWxsc1xyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bUNvbHVtbnM7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBjZWxsID0gbmV3Um93Lmluc2VydENlbGwoKTtcclxuICAgICAgICAgICAgY2VsbC5jb250ZW50RWRpdGFibGUgPSBcInRydWVcIjtcclxuICAgICAgICAgICAgY2VsbC5zZXRBdHRyaWJ1dGUoXCJkYXRhLXBsYWNlaG9sZGVyXCIsIFwiRW50ZXIgdGV4dFwiKTtcclxuICAgICAgICAgICAgLy8gY2VsbC5jbGFzc0xpc3QuYWRkKFwidGVtcG9yYXJ5LXNoYWRvd1wiKTtcclxuICAgICAgICAgICAgYWZmZWN0ZWRDZWxscy5wdXNoKGNlbGwpOyAgLy8gQWRkIGNlbGwgcmVmZXJlbmNlIHRvIGFycmF5XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgYWZmZWN0ZWRDZWxscy5mb3JFYWNoKGNlbGwgPT4gY2VsbC5jbGFzc0xpc3QucmVtb3ZlKFwidGVtcG9yYXJ5LXNoYWRvd1wiKSk7XHJcbiAgICAgICAgfSwgNzAwKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgYWRkQ29sdW1uKHRhYmxlOiBIVE1MVGFibGVFbGVtZW50LCBwb3NpdGlvbjogbnVtYmVyIHwgbnVsbCA9IG51bGwpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBpbnNlcnRQb3NpdGlvbiA9IHBvc2l0aW9uICE9PSBudWxsID8gcG9zaXRpb24gOiB1bmRlZmluZWQ7XHJcbiAgICAgICAgbGV0IGFmZmVjdGVkQ2VsbHMgPSBbXTsgIC8vIEFycmF5IHRvIGhvbGQgcmVmZXJlbmNlcyB0byBuZXcgY2VsbHNcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YWJsZS5yb3dzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNlbGwgPSB0YWJsZS5yb3dzW2ldLmluc2VydENlbGwoaW5zZXJ0UG9zaXRpb24pO1xyXG4gICAgICAgICAgICBjZWxsLmNvbnRlbnRFZGl0YWJsZSA9IFwidHJ1ZVwiO1xyXG4gICAgICAgICAgICBjZWxsLnNldEF0dHJpYnV0ZShcImRhdGEtcGxhY2Vob2xkZXJcIiwgXCJjZWxsXCIpO1xyXG4gICAgICAgICAgICAvLyBjZWxsLmNsYXNzTGlzdC5hZGQoXCJ0ZW1wb3Jhcnktc2hhZG93XCIpO1xyXG4gICAgICAgICAgICBhZmZlY3RlZENlbGxzLnB1c2goY2VsbCk7ICAvLyBBZGQgY2VsbCByZWZlcmVuY2UgdG8gYXJyYXlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBhZmZlY3RlZENlbGxzLmZvckVhY2goY2VsbCA9PiBjZWxsLmNsYXNzTGlzdC5yZW1vdmUoXCJ0ZW1wb3Jhcnktc2hhZG93XCIpKTtcclxuICAgICAgICB9LCA3MDApO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBzdGF0aWMgaXNMYXN0Q29sdW1uKHRhYmxlOiBIVE1MVGFibGVFbGVtZW50LCBjZWxsOiBIVE1MVGFibGVDZWxsRWxlbWVudCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGlmICghdGFibGUuY29udGFpbnMoY2VsbCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgY2VsbFJvdyA9IGNlbGwucGFyZW50RWxlbWVudCBhcyBIVE1MVGFibGVSb3dFbGVtZW50O1xyXG4gICAgICAgIGNvbnN0IGxhc3RDZWxsSW5Sb3cgPSBjZWxsUm93LmNlbGxzW2NlbGxSb3cuY2VsbHMubGVuZ3RoIC0gMV07XHJcbiAgICAgICAgcmV0dXJuIGNlbGwgPT09IGxhc3RDZWxsSW5Sb3c7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGlzTGFzdFJvdyh0YWJsZTogSFRNTFRhYmxlRWxlbWVudCwgY2VsbDogSFRNTFRhYmxlQ2VsbEVsZW1lbnQpOiBib29sZWFuIHtcclxuICAgICAgICBpZiAoIXRhYmxlLmNvbnRhaW5zKGNlbGwpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGNlbGxSb3cgPSBjZWxsLnBhcmVudEVsZW1lbnQgYXMgSFRNTFRhYmxlUm93RWxlbWVudDtcclxuICAgICAgICBjb25zdCBsYXN0Um93SW5UYWJsZSA9IHRhYmxlLnJvd3NbdGFibGUucm93cy5sZW5ndGggLSAxXTtcclxuICAgICAgICByZXR1cm4gY2VsbFJvdyA9PT0gbGFzdFJvd0luVGFibGU7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIHJlbW92ZUNvbHVtbkJ5Q2VsbChjZWxsOiBIVE1MVGFibGVDZWxsRWxlbWVudCk6IHZvaWQge1xyXG4gICAgICAgIGlmIChjZWxsLnRhZ05hbWUudG9Mb3dlckNhc2UoKSAhPT0gXCJ0ZFwiICYmIGNlbGwudGFnTmFtZS50b0xvd2VyQ2FzZSgpICE9PSBcInRoXCIpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHByb3ZpZGVkIGVsZW1lbnQgaXMgbm90IGEgdGFibGUgY2VsbC5cIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCByb3cgPSBjZWxsLnBhcmVudEVsZW1lbnQgYXMgSFRNTFRhYmxlUm93RWxlbWVudDtcclxuICAgICAgICBjb25zdCB0YWJsZSA9IHJvdy5wYXJlbnRFbGVtZW50IGFzIEhUTUxUYWJsZUVsZW1lbnQ7XHJcbiAgICAgICAgY29uc3QgY29sdW1uSW5kZXggPSBjZWxsLmNlbGxJbmRleDtcclxuXHJcbiAgICAgICAgLy8gQWRkIGZhZGUtb3V0IGNsYXNzIHRvIGFsbCBjZWxscyBpbiB0aGUgY29sdW1uXHJcbiAgICAgICAgLy8gZm9yIChsZXQgaSA9IDA7IGkgPCB0YWJsZS5yb3dzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgLy8gICAgIGlmIChjb2x1bW5JbmRleCA8IHRhYmxlLnJvd3NbaV0uY2VsbHMubGVuZ3RoKSB7XHJcbiAgICAgICAgLy8gICAgICAgICB0YWJsZS5yb3dzW2ldLmNlbGxzW2NvbHVtbkluZGV4XS5jbGFzc0xpc3QuYWRkKFwiZmFkZS1vdXRcIik7XHJcbiAgICAgICAgLy8gICAgIH1cclxuICAgICAgICAvLyB9XHJcblxyXG4gICAgICAgIC8vIERlbGF5IHRoZSBjb2x1bW4gcmVtb3ZhbCBmb3IgMzAwIG1pbGxpc2Vjb25kc1xyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhYmxlLnJvd3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKGNvbHVtbkluZGV4IDwgdGFibGUucm93c1tpXS5jZWxscy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgIHRhYmxlLnJvd3NbaV0uZGVsZXRlQ2VsbChjb2x1bW5JbmRleCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIC8vICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhYmxlLnJvd3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAvLyAgICAgICAgIGlmIChjb2x1bW5JbmRleCA8IHRhYmxlLnJvd3NbaV0uY2VsbHMubGVuZ3RoKSB7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgdGFibGUucm93c1tpXS5kZWxldGVDZWxsKGNvbHVtbkluZGV4KTtcclxuICAgICAgICAvLyAgICAgICAgIH1cclxuICAgICAgICAvLyAgICAgfVxyXG4gICAgICAgIC8vIH0sIDkwMCk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIHJlbW92ZVJvd0J5Q2VsbChjZWxsOiBIVE1MVGFibGVDZWxsRWxlbWVudCk6IHZvaWQge1xyXG4gICAgICAgIGlmIChjZWxsLnRhZ05hbWUudG9Mb3dlckNhc2UoKSAhPT0gXCJ0ZFwiICYmIGNlbGwudGFnTmFtZS50b0xvd2VyQ2FzZSgpICE9PSBcInRoXCIpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHByb3ZpZGVkIGVsZW1lbnQgaXMgbm90IGEgdGFibGUgY2VsbC5cIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCByb3cgPSBjZWxsLnBhcmVudEVsZW1lbnQgYXMgSFRNTFRhYmxlUm93RWxlbWVudDtcclxuICAgICAgICBjb25zdCB0YWJsZSA9IHJvdy5wYXJlbnRFbGVtZW50IGFzIEhUTUxUYWJsZUVsZW1lbnQ7XHJcblxyXG4gICAgICAgIC8vIEFkZCBmYWRlLW91dCBjbGFzcyB0byBhbGwgY2VsbHMgaW4gdGhlIHJvd1xyXG4gICAgICAgIC8vIEFycmF5LmZyb20ocm93LmNlbGxzKS5mb3JFYWNoKGNlbGwgPT4ge1xyXG4gICAgICAgIC8vICAgICBjZWxsLmNsYXNzTGlzdC5hZGQoXCJmYWRlLW91dFwiKTtcclxuICAgICAgICAvLyB9KTtcclxuXHJcbiAgICAgICAgLy8gRGVsYXkgdGhlIHJvdyByZW1vdmFsIGZvciAzMDAgbWlsbGlzZWNvbmRzXHJcblxyXG4gICAgICAgIHRhYmxlLmRlbGV0ZVJvdyhyb3cucm93SW5kZXgpO1xyXG5cclxuICAgICAgICAvLyBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAvLyAgICAgdGFibGUuZGVsZXRlUm93KHJvdy5yb3dJbmRleCk7XHJcbiAgICAgICAgLy8gfSwgOTAwKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZ2V0QWN0aXZlVGFibGVDZWxsKCk6IEhUTUxUYWJsZUNlbGxFbGVtZW50IHwgbnVsbCB7XHJcbiAgICAgICAgY29uc3QgYWN0aXZlRWxlbWVudCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XHJcblxyXG4gICAgICAgIGlmIChhY3RpdmVFbGVtZW50Py50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICd0ZCcpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGFjdGl2ZUVsZW1lbnQgYXMgSFRNTFRhYmxlQ2VsbEVsZW1lbnQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gYWN0aXZlRWxlbWVudD8uY2xvc2VzdCgndGQnKSBhcyBIVE1MVGFibGVDZWxsRWxlbWVudCB8fCBudWxsO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvLyBzdGF0aWMgaXNBY3RpdmVDZWxsQmFja2dyb3VuZENvbG9yKHRhcmdldEhleENvbG9yOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIC8vICAgICBjb25zdCBhY3RpdmVDZWxsID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcclxuXHJcbiAgICAvLyAgICAgaWYgKCFhY3RpdmVDZWxsIHx8IGFjdGl2ZUNlbGwudGFnTmFtZSAhPT0gJ1REJyB8fCAhYWN0aXZlQ2VsbC5oYXNBdHRyaWJ1dGUoJ2RhdGEtcGxhY2Vob2xkZXInKSkge1xyXG4gICAgLy8gICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAvLyAgICAgfVxyXG5cclxuICAgIC8vICAgICBjb25zdCBjb21wdXRlZFN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoYWN0aXZlQ2VsbCk7XHJcbiAgICAvLyAgICAgY29uc3QgY3VycmVudEJhY2tncm91bmRDb2xvciA9IGNvbXB1dGVkU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgnYmFja2dyb3VuZC1jb2xvcicpO1xyXG5cclxuICAgIC8vICAgICBjb25zdCBoZXhCYWNrZ3JvdW5kQ29sb3IgPSBVdGlscy5yZ2JUb0hleChjdXJyZW50QmFja2dyb3VuZENvbG9yKTtcclxuXHJcbiAgICAvLyAgICAgcmV0dXJuIGhleEJhY2tncm91bmRDb2xvci50b1VwcGVyQ2FzZSgpID09PSB0YXJnZXRIZXhDb2xvci50b1VwcGVyQ2FzZSgpO1xyXG4gICAgLy8gfVxyXG5cclxuXHJcbiAgICBzdGF0aWMgZ2V0TGFzdFRhYmxlQ2VsbCh0YWJsZTogSFRNTFRhYmxlRWxlbWVudCk6IEhUTUxFbGVtZW50IHwgbnVsbCB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IHRhYmxlLnJvd3MubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICAgICAgY29uc3Qgcm93ID0gdGFibGUucm93c1tpXTtcclxuICAgICAgICAgICAgZm9yIChsZXQgaiA9IHJvdy5jZWxscy5sZW5ndGggLSAxOyBqID49IDA7IGotLSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY2VsbCA9IHJvdy5jZWxsc1tqXTtcclxuICAgICAgICAgICAgICAgIGlmIChjZWxsLmlzQ29udGVudEVkaXRhYmxlKSByZXR1cm4gY2VsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZ2V0Rmlyc3RUYWJsZUNlbGwodGFibGU6IEhUTUxUYWJsZUVsZW1lbnQpOiBIVE1MRWxlbWVudCB8IG51bGwge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFibGUucm93cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCByb3cgPSB0YWJsZS5yb3dzW2ldO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHJvdy5jZWxscy5sZW5ndGg7IGorKykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY2VsbCA9IHJvdy5jZWxsc1tqXTtcclxuICAgICAgICAgICAgICAgIGlmIChjZWxsLmlzQ29udGVudEVkaXRhYmxlKSByZXR1cm4gY2VsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZ2V0TmVpZ2hib3JDZWxsKHRhYmxlOiBIVE1MVGFibGVFbGVtZW50LCBjZWxsOiBIVE1MVGFibGVDZWxsRWxlbWVudCwgZGlyZWN0aW9uOiBEaXJlY3Rpb25zKTogSFRNTFRhYmxlQ2VsbEVsZW1lbnQgfCBudWxsIHtcclxuXHJcbiAgICAgICAgaWYgKCFjZWxsLnBhcmVudEVsZW1lbnQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCByb3dJbmRleCA9IChjZWxsLnBhcmVudEVsZW1lbnQgYXMgSFRNTFRhYmxlUm93RWxlbWVudCkucm93SW5kZXg7XHJcbiAgICAgICAgY29uc3QgY2VsbEluZGV4ID0gY2VsbC5jZWxsSW5kZXg7XHJcblxyXG4gICAgICAgIHN3aXRjaCAoZGlyZWN0aW9uKSB7XHJcbiAgICAgICAgICAgIGNhc2UgRGlyZWN0aW9ucy5BcnJvd1JpZ2h0OlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIChjZWxsLnBhcmVudEVsZW1lbnQgYXMgSFRNTFRhYmxlUm93RWxlbWVudCkuY2VsbHNbY2VsbEluZGV4ICsgMV0gPz8gbnVsbDtcclxuICAgICAgICAgICAgY2FzZSBEaXJlY3Rpb25zLkFycm93TGVmdDpcclxuICAgICAgICAgICAgICAgIHJldHVybiAoY2VsbC5wYXJlbnRFbGVtZW50IGFzIEhUTUxUYWJsZVJvd0VsZW1lbnQpLmNlbGxzW2NlbGxJbmRleCAtIDFdID8/IG51bGw7XHJcbiAgICAgICAgICAgIGNhc2UgRGlyZWN0aW9ucy5BcnJvd1VwOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRhYmxlLnJvd3Nbcm93SW5kZXggLSAxXT8uY2VsbHNbY2VsbEluZGV4XSA/PyBudWxsO1xyXG4gICAgICAgICAgICBjYXNlIERpcmVjdGlvbnMuQXJyb3dEb3duOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRhYmxlLnJvd3Nbcm93SW5kZXggKyAxXT8uY2VsbHNbY2VsbEluZGV4XSA/PyBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHN0YXRpYyBjaGFuZ2VDZWxsQm9yZGVyQ29sb3IoXHJcbiAgICAgICAgdGFibGU6IEhUTUxUYWJsZUVsZW1lbnQsXHJcbiAgICAgICAgc2NvcGU6IFRhYmxlU2NvcGVzLFxyXG4gICAgICAgIGNvbG9yOiBzdHJpbmdcclxuICAgICkge1xyXG4gICAgICAgIGxldCBjZWxsc1RvQ2hhbmdlOiBOb2RlTGlzdE9mPEhUTUxUYWJsZUNlbGxFbGVtZW50PiB8IEhUTUxDb2xsZWN0aW9uT2Y8SFRNTFRhYmxlQ2VsbEVsZW1lbnQ+IHwgbnVsbCA9IG51bGw7XHJcblxyXG4gICAgICAgIHN3aXRjaCAoc2NvcGUpIHtcclxuICAgICAgICAgICAgY2FzZSBUYWJsZVNjb3Blcy5Db2x1bW46XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb2x1bW5JbmRleCA9ICh0YWJsZS5xdWVyeVNlbGVjdG9yKFwidGQuc2VsZWN0ZWRcIikgYXMgSFRNTFRhYmxlQ2VsbEVsZW1lbnQpPy5jZWxsSW5kZXg7XHJcbiAgICAgICAgICAgICAgICBpZiAoY29sdW1uSW5kZXggIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNlbGxzVG9DaGFuZ2UgPSB0YWJsZS5xdWVyeVNlbGVjdG9yQWxsKGB0ZDpudGgtY2hpbGQoJHtjb2x1bW5JbmRleCArIDF9KWApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgVGFibGVTY29wZXMuUm93OlxyXG4gICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRDZWxsID0gdGFibGUucXVlcnlTZWxlY3RvcihcInRkLnNlbGVjdGVkXCIpIGFzIEhUTUxUYWJsZUNlbGxFbGVtZW50O1xyXG4gICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkQ2VsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJvdyA9IHNlbGVjdGVkQ2VsbC5wYXJlbnRFbGVtZW50IGFzIEhUTUxUYWJsZVJvd0VsZW1lbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgY2VsbHNUb0NoYW5nZSA9IHJvdy5jZWxscztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFRhYmxlU2NvcGVzLkNlbGw6XHJcbiAgICAgICAgICAgICAgICBjZWxsc1RvQ2hhbmdlID0gdGFibGUucXVlcnlTZWxlY3RvckFsbChcInRkLnNlbGVjdGVkXCIpIGFzIE5vZGVMaXN0T2Y8SFRNTFRhYmxlQ2VsbEVsZW1lbnQ+O1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgVGFibGVTY29wZXMuU2VsZWN0ZWRDZWxsczpcclxuICAgICAgICAgICAgICAgIGNlbGxzVG9DaGFuZ2UgPSB0YWJsZS5xdWVyeVNlbGVjdG9yQWxsKFwidGQuc2VsZWN0ZWRcIikgYXMgTm9kZUxpc3RPZjxIVE1MVGFibGVDZWxsRWxlbWVudD47XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgc2NvcGUuXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGNlbGxzVG9DaGFuZ2UpIHtcclxuXHJcblxyXG5cclxuICAgICAgICAgICAgQXJyYXkuZnJvbShjZWxsc1RvQ2hhbmdlKS5mb3JFYWNoKChjZWxsKSA9PiB7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gY2VsbC5zdHlsZS5ib3JkZXIgPSBgMXB4IGRvdWJsZSAke2NvbG9yfWA7XHJcbiAgICAgICAgICAgICAgICAvLyBjb25zdCBzdHlsZXMgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShjZWxsKTtcclxuXHJcblxyXG4gICAgICAgICAgICAgICAgY2VsbC5zdHlsZS5ib3JkZXIgPSBgMXB4IGRvdWJsZSAke2NvbG9yfWA7XHJcbiAgICAgICAgICAgICAgICAvLyBjZWxsLnN0eWxlLmJveFNoYWRvdyA9IGAwIDAgMCAxcHggJHtjb2xvcn0gaW5zZXRgO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIGNvbnN0IGJveFNoYWRvdyA9IHN0eWxlcy5nZXRQcm9wZXJ0eVZhbHVlKCdib3gtc2hhZG93Jyk7XHJcbiAgICAgICAgICAgICAgICAvLyBjb25zdCBib3JkZXIgPSBzdHlsZXMuZ2V0UHJvcGVydHlWYWx1ZSgnYm9yZGVyJyk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJiYmJcIik7XHJcbiAgICAgICAgICAgICAgICAvLyBjZWxsLnN0eWxlLmJvcmRlciA9IGJvcmRlcjtcclxuICAgICAgICAgICAgICAgIC8vIGNlbGwuc3R5bGUuYm94U2hhZG93ID0gYm94U2hhZG93O1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdCb3ggU2hhZG93OicsIGJveFNoYWRvdyk7XHJcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnQm9yZGVyOicsIGJvcmRlcik7XHJcblxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG59IiwiaW1wb3J0IHsgRmxvYXRpbmdUb29sYmFyIH0gZnJvbSBcIi4vRmxvYXRpbmdUb29sYmFyXCI7XHJcbmltcG9ydCB7IElGb2N1c1N0YWNrIH0gZnJvbSBcIkAvY29yZS9JRm9jdXNTdGFja1wiO1xyXG5pbXBvcnQgeyBEZXBlbmRlbmN5Q29udGFpbmVyIH0gZnJvbSBcIkAvY29yZS9EZXBlbmRlbmN5Q29udGFpbmVyXCI7XHJcbmltcG9ydCB7IElUYWJsZUNvbnRleHRGbG9hdGluZ1Rvb2xiYXIgfSBmcm9tIFwiLi9JVGFibGVDb250ZXh0RmxvYXRpbmdUb29sYmFyXCI7XHJcbmltcG9ydCB7IFpJbmRleCB9IGZyb20gXCJAL2NvbW1vbi9aSW5kZXhcIjtcclxuaW1wb3J0IHsgRGlyZWN0aW9ucyB9IGZyb20gXCIuLi8uLi9jb21tb24vRGlyZWN0aW9uc1wiO1xyXG5pbXBvcnQgeyBEZWZhdWx0SlNFdmVudHMgfSBmcm9tIFwiLi4vLi4vY29tbW9uL0RlZmF1bHRKU0V2ZW50c1wiO1xyXG5pbXBvcnQgeyBET01FbGVtZW50cyB9IGZyb20gXCIuLi8uLi9jb21tb24vRE9NRWxlbWVudHNcIjtcclxuaW1wb3J0IHsgVGFibGVVdGlscyB9IGZyb20gXCJAL3V0aWxpdGllcy9UYWJsZVV0aWxzXCI7XHJcbmltcG9ydCB7IEtleWJvYXJkS2V5cyB9IGZyb20gXCJAL2NvbW1vbi9LZXlib2FyZEtleXNcIjtcclxuaW1wb3J0IHsgVGV4dENvbnRleHRGbG9hdGluZ1Rvb2xiYXIgfSBmcm9tIFwiLi9UZXh0Q29udGV4dEZsb2F0aW5nVG9vbGJhclwiO1xyXG5pbXBvcnQgeyBTZWxlY3Rpb25Nb2RlcyB9IGZyb20gXCIuL1NlbGVjdGlvbk1vZGVcIjtcclxuaW1wb3J0IHsgQ29sb3JzIH0gZnJvbSBcIkAvY29tbW9uL0NvbG9yc1wiO1xyXG5pbXBvcnQgeyBET01VdGlscyB9IGZyb20gXCJAL3V0aWxpdGllcy9ET01VdGlsc1wiO1xyXG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tIFwiQC9jb21tYW5kcy9FdmVudEVtaXR0ZXJcIjtcclxuaW1wb3J0IHsgSVRhYmxlT3BlcmF0aW9uc1NlcnZpY2UgfSBmcm9tIFwiQC9zZXJ2aWNlcy90YWJsZS1vcGVyYXRpb25zL0lUYWJsZU9wZXJhdGlvbnNTZXJ2aWNlXCI7XHJcbmltcG9ydCB7IEN1c3RvbVVJRXZlbnRzIH0gZnJvbSBcIkAvY29tbW9uL0N1c3RvbVVJRXZlbnRzXCI7XHJcbmltcG9ydCB7IElVSUV2ZW50RGV0YWlsIH0gZnJvbSBcIkAvY29tbWFuZHMvSVVJRXZlbnREZXRhaWxcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBUYWJsZUNvbnRleHRGbG9hdGluZ1Rvb2xiYXIgZXh0ZW5kcyBGbG9hdGluZ1Rvb2xiYXIgaW1wbGVtZW50cyBJVGFibGVDb250ZXh0RmxvYXRpbmdUb29sYmFyIHtcclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBpZDogc3RyaW5nID0gXCJ0YWJsZUZsb2F0aW5nVG9vbGJhclwiO1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IFRhYmxlQ29udGV4dEZsb2F0aW5nVG9vbGJhcjtcclxuXHJcbiAgICBmb2N1c1N0YWNrOiBJRm9jdXNTdGFjaztcclxuICAgIHNlbGVjdGVkQ2VsbHM6IEhUTUxUYWJsZUNlbGxFbGVtZW50W10gPSBbXTtcclxuICAgIGFjdHVhbEZvY3VzZWRDZWxsOiBIVE1MVGFibGVDZWxsRWxlbWVudCB8IG51bGwgPSBudWxsO1xyXG5cclxuICAgIHRhYmxlT3BlcmF0aW9uc1NlcnZpY2U6IElUYWJsZU9wZXJhdGlvbnNTZXJ2aWNlO1xyXG5cclxuXHJcbiAgICBjb250cm9sbGVyOiBBYm9ydENvbnRyb2xsZXI7XHJcblxyXG5cclxuICAgIC8vIFRoZSBzZWxlY3Rpb24gbW9kZSBhbmQgc2VsZWN0aW9uQWN0aXZlRmxhZyB3b3JrIHRvZ2V0aGVyIHdoZW4gd2Ugc3RhcnQgc2VsZWN0aW5nIHRleHQgaW5zaWRlIGEgY2VsbCBvciBwcmVzcyBzaGlmdCB0byBhY3RpdmF0ZSB0aGUgc2VsZWN0aW9uQWN0aXZlRmxhZy5cclxuICAgIC8vIEFmdGVyIGFjdGl2YXRpbmcgdGhlIGZsYWcsIHdlIGNhbiBzZWxlY3QgdGV4dCBpbnNpZGUgYSBjZWxsLiBJZiB3ZSByZWFjaCB0aGUgZW5kIG9mIHRoZSB0ZXh0IGluc2lkZSB0aGUgY2VsbCB1c2luZyBzaGlmdCArIGRpcmVjdGlvbmFsIGtleXMgb3IgcGxhY2UgdGhlIGN1cnNvciBvdXRzaWRlXHJcbiAgICAvLyB0aGUgYWN0aXZlIGNlbGwsIGl0IGluZGljYXRlcyB0aGF0IHdlIHdhbnQgdG8gZW50ZXIgY2VsbCBzZWxlY3Rpb24gbW9kZS4gV2UgY2hhbmdlIHRoZSBzZWxlY3Rpb24gbW9kZSBpbiB0aGVzZSBjYXNlcy5cclxuICAgIHNlbGVjdGlvbk1vZGU6IFNlbGVjdGlvbk1vZGVzID0gU2VsZWN0aW9uTW9kZXMuVGV4dDsgLy8gVGhlIGRlZmF1bHQgc2VsZWN0aW9uIG1vZGVcclxuICAgIHNlbGVjdGlvbkZsYWc6IGJvb2xlYW4gPSBmYWxzZTsgLy8gRmxhZyB0byB0cmFjayB3aGV0aGVyIHRleHQgc2VsZWN0aW9uIGlzIGFjdGl2ZVxyXG4gICAgc2VsZWN0ZWRUZXh0OiBzdHJpbmcgPSBcIlwiOyAvLyBTdG9yYWdlIGZvciB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHRleHRcclxuXHJcbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKGZvY3VzU3RhY2s6IElGb2N1c1N0YWNrLCB0YWJsZU9wZXJhdGlvbnNTZXJ2aWNlOiBJVGFibGVPcGVyYXRpb25zU2VydmljZSkge1xyXG5cclxuICAgICAgICBpZiAoVGFibGVDb250ZXh0RmxvYXRpbmdUb29sYmFyLmluc3RhbmNlKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVzZSBUYWJsZUNvbnRleHRGbG9hdGluZ1Rvb2xiYXIuZ2V0SW5zdGFuY2UoKSB0byBnZXQgaW5zdGFuY2UuXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc3VwZXIoVGFibGVDb250ZXh0RmxvYXRpbmdUb29sYmFyLmlkKTtcclxuICAgICAgICB0aGlzLmNsZWFyQW5kSGlkZSA9IHRoaXMuY2xlYXJBbmRIaWRlLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5zdHlsZS56SW5kZXggPSBaSW5kZXguTW9kZXJhdGVseUltcG9ydGFudDtcclxuICAgICAgICB0aGlzLmNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XHJcbiAgICAgICAgdGhpcy5mb2N1c1N0YWNrID0gZm9jdXNTdGFjaztcclxuICAgICAgICB0aGlzLnRhYmxlT3BlcmF0aW9uc1NlcnZpY2UgPSB0YWJsZU9wZXJhdGlvbnNTZXJ2aWNlO1xyXG5cclxuICAgICAgICB0aGlzLmF0dGFjaEV2ZW50cygpO1xyXG4gICAgfVxyXG5cclxuICAgIGF0dGFjaEV2ZW50cygpOiB2b2lkIHtcclxuICAgICAgICAvLyBNb3VzZSBldmVudHNcclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKERlZmF1bHRKU0V2ZW50cy5Nb3VzZWRvd24sIHRoaXMuaGFuZGxlTW91c2VEb3duLmJpbmQodGhpcykpO1xyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRGVmYXVsdEpTRXZlbnRzLk1vdXNlbW92ZSwgdGhpcy5oYW5kbGVNb3VzZU1vdmUuYmluZCh0aGlzKSk7XHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuTW91c2V1cCwgdGhpcy5oYW5kbGVNb3VzZVVwLmJpbmQodGhpcykpO1xyXG5cclxuICAgICAgICAvLyBLZXlib2FyZCBldmVudHNcclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKERlZmF1bHRKU0V2ZW50cy5LZXlkb3duLCB0aGlzLmhhbmRsZVN0YXJ0U2VsZWN0aW9uSW5DZWxsS2V5RG93bi5iaW5kKHRoaXMpKTtcclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKERlZmF1bHRKU0V2ZW50cy5LZXlkb3duLCB0aGlzLmhhbmRsZUNlbGxTZWxlY3Rpb25Db250aW51YXRpb25PbktleURvd24uYmluZCh0aGlzKSk7XHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuS2V5ZG93biwgdGhpcy5oYW5kbGVLZXlEb3duLmJpbmQodGhpcykpO1xyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRGVmYXVsdEpTRXZlbnRzLktleXVwLCB0aGlzLmhhbmRsZUtleVVwLmJpbmQodGhpcykpO1xyXG5cclxuICAgICAgICB0aGlzLmF0dGFjaFVJRXZlbnQoKTtcclxuXHJcbiAgICAgICAgc3VwZXIuYXR0YWNoRXZlbnRzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBoYW5kbGVNb3VzZURvd24oZXZlbnQ6IE1vdXNlRXZlbnQpIHtcclxuXHJcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgIGNvbnN0IGNlbGwgPSB0YXJnZXQuY2xvc2VzdChET01FbGVtZW50cy5URCkgYXMgSFRNTFRhYmxlQ2VsbEVsZW1lbnQ7XHJcblxyXG4gICAgICAgIGlmIChjZWxsKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiTW91c2VEb3duIGV2ZW50IG9uOiBcIiwgZXZlbnQudGFyZ2V0KTtcclxuXHJcbiAgICAgICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLmFib3J0KCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoY2VsbCAhPSB0aGlzLmFjdHVhbEZvY3VzZWRDZWxsKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhpZGUoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5jbGVhckFsbCgpO1xyXG4gICAgICAgICAgICB0aGlzLmFkZFNlbGVjdGVkQ2VsbChjZWxsKTtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25GbGFnID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25Nb2RlID0gU2VsZWN0aW9uTW9kZXMuVGV4dDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBoYW5kbGVNb3VzZU1vdmUoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcclxuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25GbGFnKSB7XHJcblxyXG4gICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGNlbGwgPSB0YXJnZXQuY2xvc2VzdChET01FbGVtZW50cy5URCkgYXMgSFRNTFRhYmxlQ2VsbEVsZW1lbnQ7XHJcblxyXG4gICAgICAgICAgICBpZiAoY2VsbCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVTZWxlY3Rpb25Nb2RlQnlNb3VzZUV2ZW50KGV2ZW50KTtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT0gU2VsZWN0aW9uTW9kZXMuQ2VsbCkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jYW5IaWRlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRTZWxlY3RlZENlbGwoY2VsbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0U2VsZWN0aW9uKCk/LnJlbW92ZUFsbFJhbmdlcygpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaGFuZGxlTW91c2VVcChldmVudDogTW91c2VFdmVudCkge1xyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkQ2VsbHMubGVuZ3RoID4gMCAmJiB0aGlzLnNlbGVjdGlvbkZsYWcpIHtcclxuICAgICAgICAgICAgdGhpcy5yZXNldFNlbGVjdGlvblN0YXRlKCk7XHJcbiAgICAgICAgICAgIHRoaXMuc2hvdygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGhhbmRsZUtleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcclxuXHJcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgIGNvbnN0IGN1cnJlbnRDZWxsID0gdGFyZ2V0LmNsb3Nlc3QoRE9NRWxlbWVudHMuVEQpIGFzIEhUTUxUYWJsZUNlbGxFbGVtZW50O1xyXG5cclxuICAgICAgICBpZiAoY3VycmVudENlbGwpIHtcclxuXHJcbiAgICAgICAgICAgIGlmIChldmVudC5rZXkgPT0gS2V5Ym9hcmRLZXlzLkVudGVyICYmICFldmVudC5zaGlmdEtleSAmJiAhZXZlbnQuY3RybEtleSAmJiAhZXZlbnQubWV0YUtleSAmJiAhZXZlbnQuYWx0S2V5KSB7XHJcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgIC8vIGFsZXJ0KFwianVtcCB0byBuZXh0IGxpbmVcIik7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09IEtleWJvYXJkS2V5cy5Fc2NhcGUgJiYgdGhpcy5jYW5IaWRlICYmICFUZXh0Q29udGV4dEZsb2F0aW5nVG9vbGJhci5nZXRJbnN0YW5jZSgpLmlzVmlzaWJsZSkge1xyXG5cclxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNhbkhpZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJBbGwoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWRlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSwgMTApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaGFuZGxlU3RhcnRTZWxlY3Rpb25JbkNlbGxLZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XHJcblxyXG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICBjb25zdCBjdXJyZW50Q2VsbCA9IHRhcmdldC5jbG9zZXN0KERPTUVsZW1lbnRzLlREKSBhcyBIVE1MVGFibGVDZWxsRWxlbWVudDtcclxuXHJcbiAgICAgICAgaWYgKGN1cnJlbnRDZWxsKSB7XHJcbiAgICAgICAgICAgIGlmICghZXZlbnQucmVwZWF0ICYmIGV2ZW50LmtleSA9PT0gS2V5Ym9hcmRLZXlzLlNoaWZ0KSB7XHJcblxyXG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLmFib3J0KCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbkZsYWcgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25Nb2RlID0gU2VsZWN0aW9uTW9kZXMuVGV4dDtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWRkU2VsZWN0ZWRDZWxsKGN1cnJlbnRDZWxsKTtcclxuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBoYW5kbGVDZWxsU2VsZWN0aW9uQ29udGludWF0aW9uT25LZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XHJcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uRmxhZykge1xyXG4gICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRDZWxsID0gdGFyZ2V0LmNsb3Nlc3QoRE9NRWxlbWVudHMuVEQpIGFzIEhUTUxUYWJsZUNlbGxFbGVtZW50O1xyXG5cclxuICAgICAgICAgICAgaWYgKGN1cnJlbnRDZWxsKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlID09IFNlbGVjdGlvbk1vZGVzLkNlbGwgJiYgZXZlbnQuc2hpZnRLZXkgJiYgZXZlbnQua2V5LnN0YXJ0c1dpdGgoJ0Fycm93JykgJiYgIWV2ZW50LnJlcGVhdCkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB0YWJsZSA9IGN1cnJlbnRDZWxsLmNsb3Nlc3QoRE9NRWxlbWVudHMuVEFCTEUpITtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXh0Q2VsbCA9IFRhYmxlVXRpbHMuZ2V0TmVpZ2hib3JDZWxsKHRhYmxlLCBjdXJyZW50Q2VsbCwgZXZlbnQua2V5IGFzIERpcmVjdGlvbnMpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZFNlbGVjdGVkQ2VsbChjdXJyZW50Q2VsbCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXh0Q2VsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZFNlbGVjdGVkQ2VsbChuZXh0Q2VsbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG5vcm1hbGl6ZVRleHQodGV4dDogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRleHRcclxuICAgICAgICAgICAgLnJlcGxhY2UoL1xccysvZywgJyAnKVxyXG4gICAgICAgICAgICAudHJpbSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgKiBVcGRhdGVzIHRoZSBzZWxlY3Rpb24gbW9kZSBieSBjb21wYXJpbmcgdGhlIGN1cnJlbnQgdGV4dCBzZWxlY3Rpb24gZnJvbSB0aGUgZG9jdW1lbnRcclxuICAgICogd2l0aCB0aGUgc3RvcmVkIHNlbGVjdGVkIHRleHQuIElmIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBtYXRjaGVzIHRoZSBwcmV2aW91c2x5IHN0b3JlZFxyXG4gICAgKiBzZWxlY3Rpb24sIGl0IHN3aXRjaGVzIHRoZSBzZWxlY3Rpb24gbW9kZSB0byBjZWxsIHNlbGVjdGlvbiBhbmQgcmVzZXRzIHRoZSBzZWxlY3RlZCB0ZXh0LlxyXG4gICAgKiBJZiB0aGVyZSBpcyBhIG5ldyBzZWxlY3Rpb24gKGFjdHVhbFNlbGVjdGlvbiBpcyBub3QgZW1wdHkpLCBpdCB1cGRhdGVzIHRoZSBzdG9yZWQgc2VsZWN0ZWQgdGV4dFxyXG4gICAgKiB0byByZWZsZWN0IHRoZSBjdXJyZW50IHNlbGVjdGlvbi5cclxuICAgICpcclxuICAgICovXHJcbiAgICBwcml2YXRlIHVwZGF0ZVRoZVNlbGVjdGlvbk1vZGVCeUN1cnJlbnRTZWxlY3Rpb25TdGF0ZShldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbkZsYWcpIHtcclxuICAgICAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gZG9jdW1lbnQuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgICAgICAgICAgIGlmIChzZWxlY3Rpb24pIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGFjdHVhbFNlbGVjdGlvbiA9IHRoaXMubm9ybWFsaXplVGV4dChzZWxlY3Rpb24udG9TdHJpbmcoKS50cmltKCkpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudENlbGwgPSB0YXJnZXQuY2xvc2VzdChET01FbGVtZW50cy5URCkgYXMgSFRNTFRhYmxlQ2VsbEVsZW1lbnQ7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50Q2VsbFRleHQgPSB0aGlzLm5vcm1hbGl6ZVRleHQoKGN1cnJlbnRDZWxsLnRleHRDb250ZW50IHx8IFwiXCIpLnRyaW0oKSk7XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgeyBhdFN0YXJ0LCBhdEVuZCB9ID0gRE9NVXRpbHMuZ2V0U2VsZWN0aW9uVGV4dEluZm8oY3VycmVudENlbGwpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIFRoaXMgaW50ZXJhY3Rpb24ga2VlcHMgdGhlIG1lbnUgdmlzaWJsZSBhZnRlciBhbGwgdGV4dCBpcyBzZWxlY3RlZCwgZW5oYW5jaW5nIHVzZXIgZW5nYWdlbWVudC4gXHJcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgdXNlciBwcmVzc2VzIGEgZGlyZWN0aW9uYWwga2V5IGFnYWluIGJleW9uZCB0aGlzIHBvaW50LCB0aGUgbWVudSBpcyBoaWRkZW4gYW5kIGNlbGwgc2VsZWN0aW9uIG1vZGUgaXMgaW5pdGlhdGVkLCBcclxuICAgICAgICAgICAgICAgIC8vIHN0cmVhbWxpbmluZyB0aGUgaW50ZXJmYWNlIGFuZCBmb2N1c2luZyBvbiBzdWJzZXF1ZW50IHRhc2tzLlxyXG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRDZWxsVGV4dCA9PT0gXCJcIiB8fCAoYWN0dWFsU2VsZWN0aW9uID09PSB0aGlzLnNlbGVjdGVkVGV4dC50cmltKCkgJiYgKGF0U3RhcnQgfHwgYXRFbmQpKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uTW9kZSA9IFNlbGVjdGlvbk1vZGVzLkNlbGw7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFRleHQgPSBcIlwiO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNhbkhpZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWRlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhY3R1YWxTZWxlY3Rpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkVGV4dCA9IGFjdHVhbFNlbGVjdGlvbjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBwcml2YXRlIHVwZGF0ZVRoZVNlbGVjdGlvbk1vZGVCeUN1cnJlbnRTZWxlY3Rpb25TdGF0ZShldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xyXG4gICAgLy8gICAgIC8vIENoZWNrIGlmIHRoZSBzZWxlY3Rpb24gZmxhZyBpcyBzZXQsIGluZGljYXRpbmcgdGhhdCBzZWxlY3Rpb24gdXBkYXRlcyBzaG91bGQgYmUgbW9uaXRvcmVkXHJcbiAgICAvLyAgICAgaWYgKHRoaXMuc2VsZWN0aW9uRmxhZykge1xyXG4gICAgLy8gICAgICAgICAvLyBHZXQgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGZyb20gdGhlIGRvY3VtZW50XHJcbiAgICAvLyAgICAgICAgIGNvbnN0IGFjdHVhbFNlbGVjdGlvbiA9IHRoaXMubm9ybWFsaXplVGV4dChkb2N1bWVudC5nZXRTZWxlY3Rpb24oKT8udG9TdHJpbmcoKS50cmltKCkgfHwgXCJcIik7XHJcblxyXG4gICAgLy8gICAgICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAvLyAgICAgICAgIGNvbnN0IGN1cnJlbnRDZWxsID0gdGFyZ2V0LmNsb3Nlc3QoRE9NRWxlbWVudHMuVEQpIGFzIEhUTUxUYWJsZUNlbGxFbGVtZW50O1xyXG5cclxuICAgIC8vICAgICAgICAgY29uc3QgY3VycmVudENlbGxUZXh0ID0gdGhpcy5ub3JtYWxpemVUZXh0KChjdXJyZW50Q2VsbC50ZXh0Q29udGVudCB8fCBcIlwiKS50cmltKCkpO1xyXG5cclxuICAgIC8vICAgICAgICAgbGV0IGlzVGhlRW5kOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLy8gICAgICAgICBpZiAoYWN0dWFsU2VsZWN0aW9uKSB7XHJcbiAgICAvLyAgICAgICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSBkb2N1bWVudC5nZXRTZWxlY3Rpb24oKTtcclxuICAgIC8vICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGlvblJhbmdlID0gc2VsZWN0aW9uPy5nZXRSYW5nZUF0KDApO1xyXG5cclxuICAgIC8vICAgICAgICAgICAgIGlmIChzZWxlY3Rpb25SYW5nZSkge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGlvblN0YXJ0T2Zmc2V0ID0gc2VsZWN0aW9uUmFuZ2Uuc3RhcnRPZmZzZXQ7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0aW9uRW5kT2Zmc2V0ID0gc2VsZWN0aW9uUmFuZ2UuZW5kT2Zmc2V0O1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIGNvbnN0IGNlbGxUZXh0TGVuZ3RoID0gY3VycmVudENlbGxUZXh0Lmxlbmd0aDtcclxuXHJcbiAgICAvLyAgICAgICAgICAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gRGlyZWN0aW9ucy5BcnJvd1JpZ2h0IHx8IGV2ZW50LmtleSA9PT0gRGlyZWN0aW9ucy5BcnJvd0Rvd24pIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgLy8gQ29uc2lkZXIgdGhlIGNhcmV0IGJlaW5nIGF0IHRoZSBlbmQgb2YgdGhlIGNlbGwgdGV4dFxyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICBpc1RoZUVuZCA9IHNlbGVjdGlvbkVuZE9mZnNldCA+PSBjZWxsVGV4dExlbmd0aDtcclxuICAgIC8vICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gRGlyZWN0aW9ucy5BcnJvd0xlZnQgfHwgZXZlbnQua2V5ID09PSBEaXJlY3Rpb25zLkFycm93VXApIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgLy8gQ29uc2lkZXIgdGhlIGNhcmV0IGJlaW5nIGF0IHRoZSBzdGFydCBvZiB0aGUgY2VsbCB0ZXh0XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIGlzVGhlRW5kID0gc2VsZWN0aW9uU3RhcnRPZmZzZXQgPT09IDA7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICB9XHJcblxyXG4gICAgLy8gICAgICAgICAvLyBDaGVjayBpZiB0aGUgY3VycmVudCBzZWxlY3Rpb24gbWF0Y2hlcyB0aGUgc3RvcmVkIHNlbGVjdGVkIHRleHRcclxuICAgIC8vICAgICAgICAgaWYgKGN1cnJlbnRDZWxsVGV4dCA9PT0gXCJcIiB8fCAoYWN0dWFsU2VsZWN0aW9uID09PSB0aGlzLnNlbGVjdGVkVGV4dC50cmltKCkgJiYgaXNUaGVFbmQpKSB7XHJcbiAgICAvLyAgICAgICAgICAgICAvLyBJZiB0aGV5IGFyZSB0aGUgc2FtZSwgaXQgaW5kaWNhdGVzIHRoYXQgdGhlIHNlbGVjdGlvbiBoYXNuJ3QgY2hhbmdlZCxcclxuICAgIC8vICAgICAgICAgICAgIC8vIHNvIHN3aXRjaCB0byBjZWxsIHNlbGVjdGlvbiBtb2RlIGFuZCByZXNldCB0aGUgc3RvcmVkIHRleHRcclxuICAgIC8vICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uTW9kZSA9IFNlbGVjdGlvbk1vZGVzLkNlbGw7XHJcbiAgICAvLyAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkVGV4dCA9IFwiXCI7XHJcbiAgICAvLyAgICAgICAgIH0gZWxzZSBpZiAoYWN0dWFsU2VsZWN0aW9uKSB7XHJcbiAgICAvLyAgICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBhIG5ldyBzZWxlY3Rpb24sIHVwZGF0ZSB0aGUgc3RvcmVkIHNlbGVjdGVkIHRleHQgdG8gdGhlIG5ldyB2YWx1ZVxyXG4gICAgLy8gICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFRleHQgPSBhY3R1YWxTZWxlY3Rpb247XHJcbiAgICAvLyAgICAgICAgIH1cclxuICAgIC8vICAgICB9XHJcbiAgICAvLyB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAqIFVwZGF0ZXMgdGhlIHNlbGVjdGlvbiBtb2RlIGJhc2VkIG9uIHRoZSBjdXJyZW50IG1vdXNlIHBvc2l0aW9uIHJlbGF0aXZlIHRvIHRoZSBhY3R1YWwgZm9jdXNlZCBjZWxsLlxyXG4gICAgKiBUaGlzIGZ1bmN0aW9uIGNoZWNrcyBpZiB0aGUgbW91c2UgaXMgb3V0c2lkZSB0aGUgYm91bmRzIG9mIHRoZSBmb2N1c2VkIGNlbGwsIGFuZCBpZiBzbywgc3dpdGNoZXMgdGhlXHJcbiAgICAqIHNlbGVjdGlvbiBtb2RlIHRvIGNlbGwgc2VsZWN0aW9uIG1vZGUuXHJcbiAgICAqIFxyXG4gICAgKiBAcGFyYW0ge01vdXNlRXZlbnR9IGV2ZW50IC0gVGhlIG1vdXNlIGV2ZW50IHRoYXQgdHJpZ2dlcnMgdGhpcyBmdW5jdGlvbiwgdHlwaWNhbGx5IGludm9sdmluZyBtb3VzZSBtb3ZlbWVudC5cclxuICAgICovXHJcbiAgICBwcml2YXRlIHVwZGF0ZVNlbGVjdGlvbk1vZGVCeU1vdXNlRXZlbnQoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uRmxhZyAmJiB0aGlzLmFjdHVhbEZvY3VzZWRDZWxsKSB7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBjZWxsUmVjdCA9IHRoaXMuYWN0dWFsRm9jdXNlZENlbGwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBtb3VzZVggPSBldmVudC5jbGllbnRYO1xyXG4gICAgICAgICAgICBjb25zdCBtb3VzZVkgPSBldmVudC5jbGllbnRZO1xyXG5cclxuICAgICAgICAgICAgaWYgKCEobW91c2VYID49IGNlbGxSZWN0LmxlZnQgJiYgbW91c2VYIDw9IGNlbGxSZWN0LnJpZ2h0ICYmIG1vdXNlWSA+PSBjZWxsUmVjdC50b3AgJiYgbW91c2VZIDw9IGNlbGxSZWN0LmJvdHRvbSkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uTW9kZSA9IFNlbGVjdGlvbk1vZGVzLkNlbGw7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jYW5IaWRlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWRlKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBoYW5kbGVLZXlVcChldmVudDogS2V5Ym9hcmRFdmVudCkge1xyXG5cclxuICAgICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgY29uc3QgY3VycmVudENlbGwgPSB0YXJnZXQuY2xvc2VzdChET01FbGVtZW50cy5URCkgYXMgSFRNTFRhYmxlQ2VsbEVsZW1lbnQ7XHJcblxyXG4gICAgICAgIGlmIChjdXJyZW50Q2VsbCkge1xyXG5cclxuICAgICAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVRoZVNlbGVjdGlvbk1vZGVCeUN1cnJlbnRTZWxlY3Rpb25TdGF0ZShldmVudCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoZXZlbnQua2V5ID09PSBLZXlib2FyZEtleXMuU2hpZnQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVzZXRTZWxlY3Rpb25TdGF0ZSgpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGVkQ2VsbHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2hvdygpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYWRkU2VsZWN0ZWRDZWxsKGNlbGw6IEhUTUxUYWJsZUNlbGxFbGVtZW50KSB7XHJcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRDZWxscy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZENlbGxzLnB1c2goY2VsbCk7XHJcbiAgICAgICAgICAgIGNlbGwuY2xhc3NMaXN0LmFkZCgnc2VsZWN0ZWQnKTtcclxuXHJcbiAgICAgICAgICAgIC8vQ2hhbmdlIHRoZSBhY3R1YWwgZm9jdXNlZCBjZWxsIG9ubHkgaWYgYXQgc2FtZSB0YWJsZVxyXG4gICAgICAgICAgICB0aGlzLmFjdHVhbEZvY3VzZWRDZWxsID0gY2VsbDtcclxuICAgICAgICAgICAgY2VsbC5mb2N1cygpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgbGFzdFNlbGVjdGVkQ2VsbCA9IHRoaXMuc2VsZWN0ZWRDZWxsc1t0aGlzLnNlbGVjdGVkQ2VsbHMubGVuZ3RoIC0gMV07XHJcbiAgICAgICAgICAgIGNvbnN0IGxhc3RTZWxlY3RlZENlbGxUYWJsZSA9IGxhc3RTZWxlY3RlZENlbGwuY2xvc2VzdCgndGFibGUnKTtcclxuICAgICAgICAgICAgY29uc3QgY3VycmVudENlbGxUYWJsZSA9IGNlbGwuY2xvc2VzdCgndGFibGUnKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChsYXN0U2VsZWN0ZWRDZWxsVGFibGUgPT09IGN1cnJlbnRDZWxsVGFibGUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5zZWxlY3RlZENlbGxzLmluZGV4T2YoY2VsbCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZENlbGxzLnB1c2goY2VsbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY2VsbC5jbGFzc0xpc3QuYWRkKCdzZWxlY3RlZCcpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAvL0NoYW5nZSB0aGUgYWN0dWFsIGZvY3VzZWQgY2VsbCBvbmx5IGlmIGF0IHNhbWUgdGFibGVcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdHVhbEZvY3VzZWRDZWxsID0gY2VsbDtcclxuICAgICAgICAgICAgICAgICAgICBjZWxsLmZvY3VzKCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vQ2VsdWxhIGrDoSBmYXogcGFydGUgZGEgbGlzdGEgYXBlbmFzIGZvY2EgZSBjb250aW51YVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0dWFsRm9jdXNlZENlbGwgPSBjZWxsO1xyXG4gICAgICAgICAgICAgICAgICAgIGNlbGwuZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG5cclxuICAgIGF0dGFjaFVJRXZlbnQoKSB7XHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihDdXN0b21VSUV2ZW50cy5DbG9zZUVsZW1lbnQsIHRoaXMuaGFuZGxlQ2xvc2VFbGVtZW50RXZlbnQuYmluZCh0aGlzKSk7XHJcbiAgICB9XHJcblxyXG4gICAgaGFuZGxlQ2xvc2VFbGVtZW50RXZlbnQoZXZlbnQ6IEV2ZW50KSB7XHJcblxyXG4gICAgICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gZXZlbnQgYXMgQ3VzdG9tRXZlbnQ8SVVJRXZlbnREZXRhaWw+O1xyXG4gICAgICAgIGNvbnN0IGRldGFpbHMgPSBjdXN0b21FdmVudC5kZXRhaWw7XHJcblxyXG4gICAgICAgIGlmIChUYWJsZUNvbnRleHRGbG9hdGluZ1Rvb2xiYXIuaWQgPT0gZGV0YWlscy50YXJnZXRJZCEpIHtcclxuICAgICAgICAgICAgdGhpcy5jbGVhckFuZEhpZGUoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc2hvdygpOiB2b2lkIHtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLmFjdHVhbEZvY3VzZWRDZWxsKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ05vIGZvY3VzZWQgY2VsbCBmb3VuZCcpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnJlc2V0QWJvcnRDb250cm9sbGVyKCk7XHJcbiAgICAgICAgdGhpcy5mb2N1c1N0YWNrLnB1c2godGhpcy5hY3R1YWxGb2N1c2VkQ2VsbCk7XHJcbiAgICAgICAgdGhpcy5jaGFuZ2VUb29sYmFyUG9zaXRpb25Ub0JlQ2xvc2VkVG8odGhpcy5hY3R1YWxGb2N1c2VkQ2VsbCk7XHJcbiAgICAgICAgdGhpcy5wcm9jZXNzU2VsZWN0aW9uQ2hhbmdlRWZmZWN0cygpO1xyXG5cclxuICAgICAgICBzdXBlci5zaG93KCk7XHJcblxyXG4gICAgICAgIHRoaXMuYWN0dWFsRm9jdXNlZENlbGwuYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuQmx1ciwgdGhpcy5jbGVhckFuZEhpZGUsIHsgc2lnbmFsOiB0aGlzLmNvbnRyb2xsZXIuc2lnbmFsIH0pO1xyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gICAgLy8gZXhlY0NlbGxCYWNrZ3JvdW5kQ29sb3IodmFsdWU6IHN0cmluZyk6IHZvaWQge1xyXG5cclxuICAgIC8vICAgICB0aGlzLm1lbWVudG8uc2F2ZVN0YXRlKCk7XHJcblxyXG4gICAgLy8gICAgIEV2ZW50RW1pdHRlci5lbWl0UmVzZXRBY3RpdmVCdXR0b25zRWxlbWVudEV2ZW50KFwiYmFja2dyb3VuZENvbG9yXCIpO1xyXG5cclxuICAgIC8vICAgICBjb25zdCBhY3RpdmVDZWxsID0gVGFibGVVdGlscy5nZXRBY3RpdmVUYWJsZUNlbGwoKTtcclxuXHJcbiAgICAvLyAgICAgaWYgKGFjdGl2ZUNlbGwpIHtcclxuICAgIC8vICAgICAgICAgY29uc3QgdGFibGUgPSBhY3RpdmVDZWxsLmNsb3Nlc3QoJ3RhYmxlJykhO1xyXG5cclxuICAgIC8vICAgICAgICAgY29uc3Qgc2VsZWN0ZWRDZWxscyA9IHRhYmxlLnF1ZXJ5U2VsZWN0b3JBbGwoJ3RkLnNlbGVjdGVkJyk7XHJcblxyXG4gICAgLy8gICAgICAgICBzZWxlY3RlZENlbGxzLmZvckVhY2goY2VsbCA9PiB7XHJcbiAgICAvLyAgICAgICAgICAgICAoY2VsbCBhcyBIVE1MRWxlbWVudCkuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gdmFsdWU7XHJcbiAgICAvLyAgICAgICAgIH0pO1xyXG5cclxuICAgIC8vICAgICAgICAgRXZlbnRFbWl0dGVyLmVtaXRTaG93SGlkZUFjdGl2ZUVsZW1lbnRFdmVudChcImJhY2tncm91bmRDb2xvclwiLCB2YWx1ZSwgXCJzaG93XCIpO1xyXG5cclxuICAgIC8vICAgICB9IGVsc2Uge1xyXG4gICAgLy8gICAgICAgICBjb25zb2xlLmVycm9yKFwiY2VsbCBub3QgZm91bmRcIik7XHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gfVxyXG5cclxuICAgIHByb2Nlc3NTZWxlY3Rpb25DaGFuZ2VFZmZlY3RzKCkge1xyXG5cclxuICAgICAgICBFdmVudEVtaXR0ZXIuZW1pdFJlc2V0QWN0aXZlQnV0dG9uc0VsZW1lbnRFdmVudChcImJhY2tncm91bmRDb2xvclwiKTtcclxuXHJcbiAgICAgICAgY29uc3QgYmFja2dyb3VuZENvbG9yczogeyBba2V5OiBzdHJpbmddOiBib29sZWFuIH0gPSB7fTtcclxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3JzW0NvbG9ycy5CYWNrZ3JvdW5kQ29sb3JSZWRdID0gdGhpcy50YWJsZU9wZXJhdGlvbnNTZXJ2aWNlLnF1ZXJ5QWxsU3RhdGVDZWxsQmFja2dyb3VuZENvbG9yKHRoaXMuc2VsZWN0ZWRDZWxscywgQ29sb3JzLkJhY2tncm91bmRDb2xvclJlZCk7XHJcbiAgICAgICAgYmFja2dyb3VuZENvbG9yc1tDb2xvcnMuQmFja2dyb3VuZENvbG9yR3JlZW5dID0gdGhpcy50YWJsZU9wZXJhdGlvbnNTZXJ2aWNlLnF1ZXJ5QWxsU3RhdGVDZWxsQmFja2dyb3VuZENvbG9yKHRoaXMuc2VsZWN0ZWRDZWxscywgQ29sb3JzLkJhY2tncm91bmRDb2xvckdyZWVuKTtcclxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3JzW0NvbG9ycy5CYWNrZ3JvdW5kQ29sb3JCbHVlXSA9IHRoaXMudGFibGVPcGVyYXRpb25zU2VydmljZS5xdWVyeUFsbFN0YXRlQ2VsbEJhY2tncm91bmRDb2xvcih0aGlzLnNlbGVjdGVkQ2VsbHMsIENvbG9ycy5CYWNrZ3JvdW5kQ29sb3JCbHVlKTtcclxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3JzW0NvbG9ycy5CYWNrZ3JvdW5kQ29sb3JZZWxsb3ddID0gdGhpcy50YWJsZU9wZXJhdGlvbnNTZXJ2aWNlLnF1ZXJ5QWxsU3RhdGVDZWxsQmFja2dyb3VuZENvbG9yKHRoaXMuc2VsZWN0ZWRDZWxscywgQ29sb3JzLkJhY2tncm91bmRDb2xvclllbGxvdyk7XHJcbiAgICAgICAgYmFja2dyb3VuZENvbG9yc1tDb2xvcnMuQmFja2dyb3VuZENvbG9yR3JleV0gPSB0aGlzLnRhYmxlT3BlcmF0aW9uc1NlcnZpY2UucXVlcnlBbGxTdGF0ZUNlbGxCYWNrZ3JvdW5kQ29sb3IodGhpcy5zZWxlY3RlZENlbGxzLCBDb2xvcnMuQmFja2dyb3VuZENvbG9yR3JleSk7XHJcblxyXG4gICAgICAgIE9iamVjdC5lbnRyaWVzKGJhY2tncm91bmRDb2xvcnMpLmZvckVhY2goKFtjb2xvciwgYWN0aXZlXSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoYWN0aXZlKSB7XHJcbiAgICAgICAgICAgICAgICBFdmVudEVtaXR0ZXIuZW1pdFNob3dIaWRlQWN0aXZlRWxlbWVudEV2ZW50KFwiYmFja2dyb3VuZENvbG9yXCIsIGNvbG9yLCBcInNob3dcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy8gcmVzZXRDaGVja2VkQ29sb3IoKSB7XHJcblxyXG4gICAgLy8gICAgIGNvbnN0IGRyb3Bkb3duQ29sb3IgPSB0aGlzLmRyb3Bkb3ducy5maW5kKGUgPT4gZS5pZCA9PSBcInRhYmxlQ29sb3JPcHRpb25zTWVudVwiKSE7XHJcblxyXG4gICAgLy8gICAgIGRyb3Bkb3duQ29sb3IuZHJvcGRvd25MaXN0LmRyb3Bkb3duSXRlbXMuZm9yRWFjaChpdGVtID0+IHtcclxuXHJcbiAgICAvLyAgICAgICAgIGl0ZW0ucmVzZXRBY3RpdmVJY29uKCk7XHJcbiAgICAvLyAgICAgfSk7XHJcblxyXG4gICAgLy8gICAgIGRyb3Bkb3duQ29sb3IuZHJvcGRvd25MaXN0LmRyb3Bkb3duSXRlbXMuZm9yRWFjaChpdGVtID0+IHtcclxuXHJcbiAgICAvLyAgICAgICAgIGNvbnN0IGNvbG9yID0gaXRlbS5nZXRMZWZ0SWNvbkJhY2tncm91bmRDb2xvcigpO1xyXG5cclxuICAgIC8vICAgICAgICAgaWYgKGNvbG9yICYmIHRoaXMuYXJlQWxsU2VsZWN0ZWRDZWxsc1NhbWVCZ0NvbG9yKGNvbG9yKSAmJiBjb2xvciAhPSBcInRyYW5zcGFyZW50XCIpIHtcclxuICAgIC8vICAgICAgICAgICAgIGl0ZW0uY2hhbmdlQWN0aXZlSWNvblRvVmlzaWJsZSgpO1xyXG4gICAgLy8gICAgICAgICB9XHJcbiAgICAvLyAgICAgfSk7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgY2hhbmdlVG9vbGJhclBvc2l0aW9uVG9CZUNsb3NlZFRvKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgcmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcblxyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcclxuXHJcbiAgICAgICAgY29uc3QgZWxlbWVudFdpZHRoID0gdGhpcy5odG1sRWxlbWVudC5vZmZzZXRXaWR0aDtcclxuICAgICAgICBsZXQgbGVmdFBvc2l0aW9uID0gcmVjdC5sZWZ0ICsgd2luZG93LnNjcm9sbFggKyAwO1xyXG5cclxuICAgICAgICBpZiAobGVmdFBvc2l0aW9uICsgZWxlbWVudFdpZHRoID4gd2luZG93LmlubmVyV2lkdGgpIHtcclxuICAgICAgICAgICAgbGVmdFBvc2l0aW9uID0gd2luZG93LmlubmVyV2lkdGggLSBlbGVtZW50V2lkdGggLSAyMDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGVsZW1lbnRIZWlnaHQgPSB0aGlzLmh0bWxFbGVtZW50Lm9mZnNldEhlaWdodDtcclxuICAgICAgICBsZXQgdG9wUG9zaXRpb24gPSByZWN0LnRvcCArIHdpbmRvdy5zY3JvbGxZIC0gZWxlbWVudEhlaWdodCAtIDEwO1xyXG5cclxuICAgICAgICBpZiAodG9wUG9zaXRpb24gPCAwKSB7XHJcbiAgICAgICAgICAgIHRvcFBvc2l0aW9uID0gcmVjdC5ib3R0b20gKyB3aW5kb3cuc2Nyb2xsWSArIDEwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5zdHlsZS5sZWZ0ID0gYCR7bGVmdFBvc2l0aW9ufXB4YDtcclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLnRvcCA9IGAke3RvcFBvc2l0aW9ufXB4YDtcclxuICAgIH1cclxuXHJcbiAgICByZXNldFNlbGVjdGlvblN0YXRlKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uTW9kZSA9IFNlbGVjdGlvbk1vZGVzLlRleHQ7XHJcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25GbGFnID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZFRleHQgPSBcIlwiO1xyXG4gICAgfVxyXG5cclxuICAgIGNsZWFyQWxsKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuYWN0dWFsRm9jdXNlZENlbGwgPSBudWxsO1xyXG4gICAgICAgIGNvbnN0IGFsbFRhYmxlQ2VsbHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCd0ZCcpO1xyXG4gICAgICAgIGFsbFRhYmxlQ2VsbHMuZm9yRWFjaChjZWxsID0+IGNlbGwuY2xhc3NMaXN0LnJlbW92ZSgnc2VsZWN0ZWQnKSk7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZENlbGxzID0gW107XHJcbiAgICB9XHJcblxyXG4gICAgaGlkZSgpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5jYW5IaWRlKSB7XHJcbiAgICAgICAgICAgIHN1cGVyLmhpZGUoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY2xlYXJBbmRIaWRlKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuY2xlYXJBbGwoKTtcclxuICAgICAgICB0aGlzLmhpZGUoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHJlc2V0QWJvcnRDb250cm9sbGVyKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZ2V0SW5zdGFuY2UoKSB7XHJcbiAgICAgICAgY29uc3QgZm9jdXNTdGFjayA9IERlcGVuZGVuY3lDb250YWluZXIuSW5zdGFuY2UucmVzb2x2ZTxJRm9jdXNTdGFjaz4oXCJJRm9jdXNTdGFja1wiKTtcclxuICAgICAgICBjb25zdCB0YWJsZU9wZXJhdGlvbnNTZXJ2aWNlID0gRGVwZW5kZW5jeUNvbnRhaW5lci5JbnN0YW5jZS5yZXNvbHZlPElUYWJsZU9wZXJhdGlvbnNTZXJ2aWNlPihcIklUYWJsZU9wZXJhdGlvbnNTZXJ2aWNlXCIpO1xyXG4gICAgICAgIHJldHVybiBuZXcgVGFibGVDb250ZXh0RmxvYXRpbmdUb29sYmFyKGZvY3VzU3RhY2ssIHRhYmxlT3BlcmF0aW9uc1NlcnZpY2UpO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgQ29tbWFuZHMgfSBmcm9tIFwiQC9jb21tYW5kcy9Db21tYW5kc1wiO1xyXG5pbXBvcnQgeyBDb2xvcnMgfSBmcm9tIFwiQC9jb21tb24vQ29sb3JzXCI7XHJcbmltcG9ydCB7IFNpemVzIH0gZnJvbSBcIkAvY29tbW9uL1NpemVzXCI7XHJcbmltcG9ydCB7IFNWR0ljb24gfSBmcm9tIFwiQC9jb21wb25lbnRzL2NvbW1vbi9TVkdJY29uXCI7XHJcbmltcG9ydCB7IENvbG9ySWNvbiB9IGZyb20gXCJAL2NvbXBvbmVudHMvZmxvYXRpbmctdG9vbGJhci9kcm9wZG93bi10b29sL0NvbG9ySWNvblwiO1xyXG5pbXBvcnQgeyBEcm9wZG93bk1lbnUgfSBmcm9tIFwiQC9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvZHJvcGRvd24tdG9vbC9Ecm9wZG93bk1lbnVcIjtcclxuaW1wb3J0IHsgRHJvcGRvd25NZW51QnV0dG9uIH0gZnJvbSBcIkAvY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL2Ryb3Bkb3duLXRvb2wvRHJvcGRvd25NZW51QnV0dG9uXCI7XHJcbmltcG9ydCB7IERyb3Bkb3duTWVudUxpc3QgfSBmcm9tIFwiQC9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvZHJvcGRvd24tdG9vbC9Ecm9wZG93bk1lbnVMaXN0XCI7XHJcbmltcG9ydCB7IERyb3Bkb3duTWVudUxpc3RJdGVtIH0gZnJvbSBcIkAvY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL2Ryb3Bkb3duLXRvb2wvRHJvcGRvd25NZW51TGlzdEl0ZW1cIjtcclxuaW1wb3J0IHsgRHJvcGRvd25NZW51TGlzdEl0ZW1UaXRsZSB9IGZyb20gXCJAL2NvbXBvbmVudHMvZmxvYXRpbmctdG9vbGJhci9kcm9wZG93bi10b29sL0Ryb3Bkb3duTWVudUxpc3RJdGVtVGl0bGVcIjtcclxuaW1wb3J0IHsgRmxvYXRpbmdUb29sYmFyU2VwYXJhdG9yIH0gZnJvbSBcIkAvY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL3NlcGFyYXRvci9GbG9hdGluZ1Rvb2xiYXJTZXBhcmF0b3JcIjtcclxuaW1wb3J0IHsgVGFibGVDb250ZXh0RmxvYXRpbmdUb29sYmFyIH0gZnJvbSBcIkAvY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL1RhYmxlQ29udGV4dEZsb2F0aW5nVG9vbGJhclwiO1xyXG5pbXBvcnQgeyBEZXBlbmRlbmN5Q29udGFpbmVyIH0gZnJvbSBcIkAvY29yZS9EZXBlbmRlbmN5Q29udGFpbmVyXCI7XHJcbmltcG9ydCB7IEVsZW1lbnRGYWN0b3J5U2VydmljZSB9IGZyb20gXCJAL3NlcnZpY2VzL2VsZW1lbnQtZmFjdG9yeS9FbGVtZW50RmFjdG9yeVNlcnZpY2VcIjtcclxuaW1wb3J0IHsgSVRhYmxlT3BlcmF0aW9uc1NlcnZpY2UgfSBmcm9tIFwiQC9zZXJ2aWNlcy90YWJsZS1vcGVyYXRpb25zL0lUYWJsZU9wZXJhdGlvbnNTZXJ2aWNlXCI7XHJcbmltcG9ydCB7IEljb25zIH0gZnJvbSBcIkAvY29tbW9uL0ljb25zXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgVGFibGVDb250ZXh0RmxvYXRpbmdUb29sYmFyQnVpbGRlciB7XHJcblxyXG4gICAgc3RhdGljIGJ1aWxkKCk6IFRhYmxlQ29udGV4dEZsb2F0aW5nVG9vbGJhciB7XHJcblxyXG4gICAgICAgIGNvbnN0IHRhYmxlT3BlcmF0aW9uU2VydmljZSA9IERlcGVuZGVuY3lDb250YWluZXIuSW5zdGFuY2UucmVzb2x2ZTxJVGFibGVPcGVyYXRpb25zU2VydmljZT4oXCJJVGFibGVPcGVyYXRpb25zU2VydmljZVwiKTtcclxuXHJcbiAgICAgICAgY29uc3QgdGFibGVUb29sYmFyID0gVGFibGVDb250ZXh0RmxvYXRpbmdUb29sYmFyLmdldEluc3RhbmNlKCk7XHJcblxyXG4gICAgICAgIHRhYmxlVG9vbGJhci5hcHBlbmREcm9wZG93bihUYWJsZUNvbnRleHRGbG9hdGluZ1Rvb2xiYXJCdWlsZGVyLnRhYmxlT3B0aW9ucyh0YWJsZU9wZXJhdGlvblNlcnZpY2UpKTtcclxuICAgICAgICB0YWJsZVRvb2xiYXIuYXBwZW5kU2VwYXJhdG9yKFRhYmxlQ29udGV4dEZsb2F0aW5nVG9vbGJhckJ1aWxkZXIuc2VwYXJhdG9yKFwidGFibGVPcGVyYXRpb25zU2VwYXJhdG9yXCIpKTtcclxuICAgICAgICB0YWJsZVRvb2xiYXIuYXBwZW5kRHJvcGRvd24oVGFibGVDb250ZXh0RmxvYXRpbmdUb29sYmFyQnVpbGRlci50YWJsZUNvbG9yRHJvcGRvd24oKSk7XHJcblxyXG5cclxuICAgICAgICByZXR1cm4gdGFibGVUb29sYmFyO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyB0YWJsZU9wdGlvbnModGFibGVPcGVyYXRpb25zU2VydmljZTogSVRhYmxlT3BlcmF0aW9uc1NlcnZpY2UpOiBEcm9wZG93bk1lbnUge1xyXG5cclxuICAgICAgICBjb25zdCB0dXJuSW50b0Jhckxpc3QgPSBuZXcgRHJvcGRvd25NZW51TGlzdChcInRhYmxlT3B0aW9uc1NlbGVjdFwiKTtcclxuICAgICAgICBjb25zdCB0dXJuSW50b0JhckJ1dHRvbiA9IG5ldyBEcm9wZG93bk1lbnVCdXR0b24oXCJ0YWJsZU9wdGlvbnNcIiwgXCJPcHRpb25zXCIsIHR1cm5JbnRvQmFyTGlzdCk7XHJcbiAgICAgICAgY29uc3QgdHVybkludG9Ecm9wZG93biA9IG5ldyBEcm9wZG93bk1lbnUoXCJ0YWJsZU9wdGlvbnNNZW51XCIsIHR1cm5JbnRvQmFyQnV0dG9uLCB0dXJuSW50b0Jhckxpc3QpO1xyXG5cclxuICAgICAgICB0dXJuSW50b0Jhckxpc3QuYXBwZW5kKG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbVRpdGxlKHR1cm5JbnRvQmFyTGlzdCwgXCJJbnNlcnQgQ29sdW1uXCIpKTtcclxuXHJcbiAgICAgICAgdHVybkludG9CYXJMaXN0LmFwcGVuZChuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW0oXCJ0dXJuSW50b09wdGlvblRleHRcIiwgdHVybkludG9CYXJMaXN0LCBDb21tYW5kcy5pbnNlcnRUYWJsZUNvbHVtbkxlZnQsIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLlBBUkFHUkFQSCwgU1ZHSWNvbi5jcmVhdGUoSWNvbnMuQ29sdW1uTGVmdCwgU2l6ZXMubWVkaXVtKS5odG1sRWxlbWVudCwgXCJMZWZ0XCIpKTtcclxuICAgICAgICB0dXJuSW50b0Jhckxpc3QuYXBwZW5kKG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcInR1cm5JbnRvT3B0aW9uVGV4dFwiLCB0dXJuSW50b0Jhckxpc3QsIENvbW1hbmRzLmluc2VydFRhYmxlQ29sdW1uUmlnaHQsIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLlBBUkFHUkFQSCwgU1ZHSWNvbi5jcmVhdGUoSWNvbnMuQ29sdW1uUmlnaHQsIFNpemVzLm1lZGl1bSkuaHRtbEVsZW1lbnQsIFwiUmlnaHRcIikpO1xyXG5cclxuICAgICAgICB0dXJuSW50b0Jhckxpc3QuYXBwZW5kKG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbVRpdGxlKHR1cm5JbnRvQmFyTGlzdCwgXCJJbnNlcnQgUm93XCIpKTtcclxuICAgICAgICB0dXJuSW50b0Jhckxpc3QuYXBwZW5kKG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcInR1cm5JbnRvT3B0aW9uVG9kb0xpc3RcIiwgdHVybkludG9CYXJMaXN0LCBDb21tYW5kcy5pbnNlcnRUYWJsZVJvd0Fib3ZlLCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5DSEVDS19MSVNULCBTVkdJY29uLmNyZWF0ZShJY29ucy5Sb3dBYm92ZSwgU2l6ZXMubWVkaXVtKS5odG1sRWxlbWVudCwgXCJBYm92ZVwiKSk7XHJcbiAgICAgICAgdHVybkludG9CYXJMaXN0LmFwcGVuZChuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW0oXCJ0dXJuSW50b09wdGlvblRvZG9MaXN0XCIsIHR1cm5JbnRvQmFyTGlzdCwgQ29tbWFuZHMuaW5zZXJ0VGFibGVSb3dCZWxvdywgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuQ0hFQ0tfTElTVCwgU1ZHSWNvbi5jcmVhdGUoSWNvbnMuUm93QmVsb3csIFNpemVzLm1lZGl1bSkuaHRtbEVsZW1lbnQsIFwiQmVsb3dcIikpO1xyXG5cclxuXHJcbiAgICAgICAgdHVybkludG9CYXJMaXN0LmFwcGVuZChuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW1UaXRsZSh0dXJuSW50b0Jhckxpc3QsIFwiUmVtb3ZlXCIpKTtcclxuXHJcbiAgICAgICAgY29uc3QgZGVsZXRlQ29sdW1uSXRlbSA9IG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcInR1cm5JbnRvT3B0aW9uVGV4dFwiLCB0dXJuSW50b0Jhckxpc3QsIENvbW1hbmRzLnJlbW92ZUNvbHVtbiwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuUEFSQUdSQVBILCBTVkdJY29uLmNyZWF0ZShJY29ucy5kZWxldGVTd2VlcCwgU2l6ZXMubWVkaXVtKS5odG1sRWxlbWVudCwgXCJDb2x1bW5cIik7XHJcbiAgICAgICAgZGVsZXRlQ29sdW1uSXRlbS5hZGRDc3NDbGFzcyhcImRhbmdlci1vcHRpb25cIik7XHJcbiAgICAgICAgLy8gZGVsZXRlQ29sdW1uSXRlbS5hdHRhY2hPbkZvY3VzKHRhYmxlT3BlcmF0aW9uc1NlcnZpY2UuZW1pdENoYW5nZVRhYmxlQm9yZGVyQ29sb3JFdmVudCwgVGFibGVTY29wZXMuQ29sdW1uLCBDb2xvcnMuVG9tYXRvKTtcclxuICAgICAgICAvLyBkZWxldGVDb2x1bW5JdGVtLmF0dGFjaE9uTG9zZUZvY3VzKHRhYmxlT3BlcmF0aW9uc1NlcnZpY2UuZW1pdENoYW5nZVRhYmxlQm9yZGVyQ29sb3JFdmVudCwgVGFibGVTY29wZXMuQ29sdW1uLCBDb2xvcnMuT3JpZ2luYWxUYWJsZUNvbG9yKTtcclxuXHJcbiAgICAgICAgdHVybkludG9CYXJMaXN0LmFwcGVuZChkZWxldGVDb2x1bW5JdGVtKTtcclxuICAgICAgICBcclxuICAgICAgICBcclxuICAgICAgICBjb25zdCBkZWxldGVSb3dJdGVtID0gbmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwidHVybkludG9PcHRpb25Ub2RvTGlzdFwiLCB0dXJuSW50b0Jhckxpc3QsIENvbW1hbmRzLnJlbW92ZVJvdywgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuQ0hFQ0tfTElTVCwgU1ZHSWNvbi5jcmVhdGUoSWNvbnMuZGVsZXRlU3dlZXAsIFNpemVzLm1lZGl1bSkuaHRtbEVsZW1lbnQsIFwiUm93XCIpO1xyXG4gICAgICAgIGRlbGV0ZVJvd0l0ZW0uYWRkQ3NzQ2xhc3MoXCJkYW5nZXItb3B0aW9uXCIpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIGRlbGV0ZVJvd0l0ZW0uYXR0YWNoT25Gb2N1cyh0YWJsZU9wZXJhdGlvbnNTZXJ2aWNlLmVtaXRDaGFuZ2VUYWJsZUJvcmRlckNvbG9yRXZlbnQsIFRhYmxlU2NvcGVzLlJvdywgQ29sb3JzLlRvbWF0byk7XHJcbiAgICAgICAgLy8gZGVsZXRlUm93SXRlbS5hdHRhY2hPbkxvc2VGb2N1cyh0YWJsZU9wZXJhdGlvbnNTZXJ2aWNlLmVtaXRDaGFuZ2VUYWJsZUJvcmRlckNvbG9yRXZlbnQsIFRhYmxlU2NvcGVzLlJvdywgQ29sb3JzLk9yaWdpbmFsVGFibGVDb2xvcik7XHJcblxyXG4gICAgICAgIHR1cm5JbnRvQmFyTGlzdC5hcHBlbmQoZGVsZXRlUm93SXRlbSk7XHJcblxyXG5cclxuICAgICAgICByZXR1cm4gdHVybkludG9Ecm9wZG93bjtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgdGFibGVDb2xvckRyb3Bkb3duKCk6IERyb3Bkb3duTWVudSB7XHJcblxyXG4gICAgICAgIGNvbnN0IGNvbG9yRHJvcGRvd25MaXN0ID0gbmV3IERyb3Bkb3duTWVudUxpc3QoXCJjb2xvclRhYmxlT3B0aW9uU2VsZWN0XCIpO1xyXG4gICAgICAgIGNvbnN0IGNvbG9yQnV0dG9uID0gbmV3IERyb3Bkb3duTWVudUJ1dHRvbihcImNvbG9yVGFibGVCdXR0b25cIiwgbmV3IENvbG9ySWNvbihcIiNGQUY0RDFcIikuaHRtbEVsZW1lbnQsIGNvbG9yRHJvcGRvd25MaXN0KTtcclxuICAgICAgICBjb25zdCBjb2xvckRyb3Bkb3duID0gbmV3IERyb3Bkb3duTWVudShcInRhYmxlQ29sb3JPcHRpb25zTWVudVwiLCBjb2xvckJ1dHRvbiwgY29sb3JEcm9wZG93bkxpc3QpO1xyXG5cclxuICAgICAgICBjb2xvckRyb3Bkb3duTGlzdC5hcHBlbmQobmV3IERyb3Bkb3duTWVudUxpc3RJdGVtVGl0bGUoY29sb3JEcm9wZG93bkxpc3QsIFwiQmFja2dyb3VuZFwiKSk7XHJcblxyXG5cclxuICAgICAgICBjb25zdCBjZWxsQmFja2dyb3VuZENvbG9yUmVkID0gbmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwiYmFja2dyb3VuZE9wdGlvblJlZFwiLCBjb2xvckRyb3Bkb3duTGlzdCwgQ29tbWFuZHMudG9nZ2xlQ2VsbEhpbGl0ZUNvbG9yLCBDb2xvcnMuSGlsaXRlQ29sb3JSZWQsIG5ldyBDb2xvckljb24oQ29sb3JzLkhpbGl0ZUNvbG9yUmVkKS5odG1sRWxlbWVudCwgXCJSZWRcIik7XHJcbiAgICAgICAgY2VsbEJhY2tncm91bmRDb2xvclJlZC5hZGRDbGFzcyhcImJhY2tncm91bmRDb2xvclwiKTtcclxuICAgICAgICBcclxuICAgICAgICBjb25zdCBjZWxsQmFja2dyb3VuZENvbG9yR3JlZW4gPSBuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW0oXCJiYWNrZ3JvdW5kT3B0aW9uR3JlZW5cIiwgY29sb3JEcm9wZG93bkxpc3QsIENvbW1hbmRzLnRvZ2dsZUNlbGxIaWxpdGVDb2xvciwgQ29sb3JzLkhpbGl0ZUNvbG9yR3JlZW4sIG5ldyBDb2xvckljb24oQ29sb3JzLkhpbGl0ZUNvbG9yR3JlZW4pLmh0bWxFbGVtZW50LCBcIkdyZWVuXCIpO1xyXG4gICAgICAgIGNlbGxCYWNrZ3JvdW5kQ29sb3JHcmVlbi5hZGRDbGFzcyhcImJhY2tncm91bmRDb2xvclwiKTtcclxuICAgICAgICBcclxuICAgICAgICBcclxuICAgICAgICBjb25zdCBjZWxsQmFja2dyb3VuZENvbG9yQmx1ZSA9IG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcImJhY2tncm91bmRPcHRpb25CbHVlXCIsIGNvbG9yRHJvcGRvd25MaXN0LCBDb21tYW5kcy50b2dnbGVDZWxsSGlsaXRlQ29sb3IsIENvbG9ycy5IaWxpdGVDb2xvckJsdWUsIG5ldyBDb2xvckljb24oQ29sb3JzLkhpbGl0ZUNvbG9yQmx1ZSkuaHRtbEVsZW1lbnQsIFwiQmx1ZVwiKTtcclxuICAgICAgICBjZWxsQmFja2dyb3VuZENvbG9yQmx1ZS5hZGRDbGFzcyhcImJhY2tncm91bmRDb2xvclwiKTtcclxuICAgICAgICBcclxuICAgICAgICBcclxuICAgICAgICBjb25zdCBjZWxsQmFja2dyb3VuZENvbG9yWWVsbG93ID0gbmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwiYmFja2dyb3VuZE9wdGlvblllbGxvd1wiLCBjb2xvckRyb3Bkb3duTGlzdCwgQ29tbWFuZHMudG9nZ2xlQ2VsbEhpbGl0ZUNvbG9yLCBDb2xvcnMuSGlsaXRlQ29sb3JZZWxsb3csIG5ldyBDb2xvckljb24oQ29sb3JzLkhpbGl0ZUNvbG9yWWVsbG93KS5odG1sRWxlbWVudCwgXCJZZWxsb3dcIik7XHJcbiAgICAgICAgY2VsbEJhY2tncm91bmRDb2xvclllbGxvdy5hZGRDbGFzcyhcImJhY2tncm91bmRDb2xvclwiKTtcclxuICAgICAgICBcclxuICAgICAgICBcclxuICAgICAgICBjb25zdCBjZWxsQmFja2dyb3VuZENvbG9yR3JleSA9IG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcImJhY2tncm91bmRPcHRpb25HcmV5XCIsIGNvbG9yRHJvcGRvd25MaXN0LCBDb21tYW5kcy50b2dnbGVDZWxsSGlsaXRlQ29sb3IsIENvbG9ycy5IaWxpdGVDb2xvckdyZXksIG5ldyBDb2xvckljb24oQ29sb3JzLkhpbGl0ZUNvbG9yR3JleSkuaHRtbEVsZW1lbnQsIFwiR3JleVwiKTtcclxuICAgICAgICBjZWxsQmFja2dyb3VuZENvbG9yR3JleS5hZGRDbGFzcyhcImJhY2tncm91bmRDb2xvclwiKTtcclxuICAgICAgICBcclxuICAgICAgICBcclxuICAgICAgICBjb25zdCBjZWxsQmFja2dyb3VuZENvbG9yTm9uZSA9IG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcImJhY2tncm91bmRPcHRpb25Ob25lXCIsIGNvbG9yRHJvcGRvd25MaXN0LCBDb21tYW5kcy50b2dnbGVDZWxsSGlsaXRlQ29sb3IsIENvbG9ycy5IaWxpdGVDb2xvck5vbmUsIG5ldyBDb2xvckljb24oQ29sb3JzLkhpbGl0ZUNvbG9yTm9uZSkuaHRtbEVsZW1lbnQsIFwiTm9uZVwiKTtcclxuICAgICAgICBjZWxsQmFja2dyb3VuZENvbG9yTm9uZS5hZGRDbGFzcyhcImJhY2tncm91bmRDb2xvclwiKTtcclxuXHJcbiAgICAgICAgY29sb3JEcm9wZG93bkxpc3QuYXBwZW5kKGNlbGxCYWNrZ3JvdW5kQ29sb3JSZWQpO1xyXG4gICAgICAgIGNvbG9yRHJvcGRvd25MaXN0LmFwcGVuZChjZWxsQmFja2dyb3VuZENvbG9yR3JlZW4pO1xyXG4gICAgICAgIGNvbG9yRHJvcGRvd25MaXN0LmFwcGVuZChjZWxsQmFja2dyb3VuZENvbG9yQmx1ZSk7XHJcbiAgICAgICAgY29sb3JEcm9wZG93bkxpc3QuYXBwZW5kKGNlbGxCYWNrZ3JvdW5kQ29sb3JZZWxsb3cpO1xyXG4gICAgICAgIGNvbG9yRHJvcGRvd25MaXN0LmFwcGVuZChjZWxsQmFja2dyb3VuZENvbG9yR3JleSk7XHJcbiAgICAgICAgY29sb3JEcm9wZG93bkxpc3QuYXBwZW5kKGNlbGxCYWNrZ3JvdW5kQ29sb3JOb25lKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGNvbG9yRHJvcGRvd247XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIHNlcGFyYXRvcihpZDogc3RyaW5nKTogRmxvYXRpbmdUb29sYmFyU2VwYXJhdG9yIHtcclxuICAgICAgICByZXR1cm4gbmV3IEZsb2F0aW5nVG9vbGJhclNlcGFyYXRvcihpZCk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBCYXNlVUlDb21wb25lbnQgfSBmcm9tIFwiLi4vY29tbW9uL0Jhc2VVSUNvbXBvbmVudFwiO1xyXG5pbXBvcnQgeyBJRm9jdXNTdGFjayB9IGZyb20gXCJAL2NvcmUvSUZvY3VzU3RhY2tcIjtcclxuaW1wb3J0IHsgRGVwZW5kZW5jeUNvbnRhaW5lciB9IGZyb20gXCJAL2NvcmUvRGVwZW5kZW5jeUNvbnRhaW5lclwiO1xyXG5pbXBvcnQgeyBaSW5kZXggfSBmcm9tIFwiQC9jb21tb24vWkluZGV4XCI7XHJcbmltcG9ydCB7IEN1c3RvbVVJRXZlbnRzIH0gZnJvbSBcIkAvY29tbW9uL0N1c3RvbVVJRXZlbnRzXCI7XHJcbmltcG9ydCB7IElVSUV2ZW50RGV0YWlsIH0gZnJvbSBcIkAvY29tbWFuZHMvSVVJRXZlbnREZXRhaWxcIjtcclxuaW1wb3J0IHsgRGVmYXVsdEpTRXZlbnRzIH0gZnJvbSBcIkAvY29tbW9uL0RlZmF1bHRKU0V2ZW50c1wiO1xyXG5pbXBvcnQgeyBLZXlib2FyZEtleXMgfSBmcm9tIFwiQC9jb21tb24vS2V5Ym9hcmRLZXlzXCI7XHJcbmltcG9ydCB7IERPTVV0aWxzIH0gZnJvbSBcIkAvdXRpbGl0aWVzL0RPTVV0aWxzXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgTWVkaWFJbnB1dHRlciBleHRlbmRzIEJhc2VVSUNvbXBvbmVudCB7XHJcblxyXG4gICAgaWQ6IHN0cmluZztcclxuICAgIGZvY3VzU3RhY2s6IElGb2N1c1N0YWNrO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIGNvbnN0IGlkID0gXCJtZWRpYUlucHV0dGVyXCI7XHJcbiAgICAgICAgc3VwZXIoe1xyXG4gICAgICAgICAgICBpZDogaWRcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5pZCA9IGlkO1xyXG4gICAgICAgIHRoaXMuZm9jdXNTdGFjayA9IERlcGVuZGVuY3lDb250YWluZXIuSW5zdGFuY2UucmVzb2x2ZTxJRm9jdXNTdGFjaz4oXCJJRm9jdXNTdGFja1wiKTtcclxuXHJcbiAgICAgICAgdGhpcy5hdHRhY2hFdmVudHMoKTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0KCk6IEhUTUxFbGVtZW50IHtcclxuICAgICAgICBjb25zdCBodG1sRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuaWQgPSB0aGlzLnByb3BzLmlkO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJ0YWItY29udGFpbmVyXCIsIFwic29mdC1ib3gtc2hhZG93XCIpO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcclxuICAgICAgICBodG1sRWxlbWVudC5zdHlsZS56SW5kZXggPSBaSW5kZXguU2xpZ2h0bHlJbXBvcnRhbnQ7XHJcblxyXG4gICAgICAgIGNvbnN0IGhlYWQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidWxcIik7XHJcbiAgICAgICAgaGVhZC5jbGFzc0xpc3QuYWRkKFwibmF2XCIsIFwibmF2LXVuZGVybGluZVwiKTtcclxuXHJcbiAgICAgICAgY29uc3QgdXBsb2FkVGFiID0gdGhpcy5jcmVhdGVOYXZJdGVtKFwidXBsb2FkVGFiXCIsIFwiVXBsb2FkXCIsIHRydWUpO1xyXG5cclxuICAgICAgICBjb25zdCBlbWJlZFRhYiA9IHRoaXMuY3JlYXRlTmF2SXRlbShcImVtYmVkVGFiXCIsIFwiRW1iZWQgbGlua1wiKTtcclxuXHJcbiAgICAgICAgaGVhZC5hcHBlbmRDaGlsZCh1cGxvYWRUYWIpO1xyXG4gICAgICAgIGhlYWQuYXBwZW5kQ2hpbGQoZW1iZWRUYWIpO1xyXG5cclxuICAgICAgICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICBjb250ZW50LmNsYXNzTGlzdC5hZGQoXCJ0YWItY29udGVudFwiKTtcclxuXHJcbiAgICAgICAgY29uc3QgdXBsb2FkQ29udGVudCA9IHRoaXMuY3JlYXRlVXBsb2FkQ29udGVudCgpO1xyXG4gICAgICAgIGNvbnN0IGVtYmVkQ29udGVudCA9IHRoaXMuY3JlYXRlRW1iZWRDb250ZW50KCk7XHJcblxyXG4gICAgICAgIGNvbnRlbnQuYXBwZW5kQ2hpbGQodXBsb2FkQ29udGVudCk7XHJcbiAgICAgICAgY29udGVudC5hcHBlbmRDaGlsZChlbWJlZENvbnRlbnQpO1xyXG5cclxuICAgICAgICBodG1sRWxlbWVudC5hcHBlbmRDaGlsZChoZWFkKTtcclxuICAgICAgICBodG1sRWxlbWVudC5hcHBlbmRDaGlsZChjb250ZW50KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGh0bWxFbGVtZW50O1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBjcmVhdGVOYXZJdGVtKGlkOiBzdHJpbmcsIHRleHQ6IHN0cmluZywgYWN0aXZlOiBib29sZWFuID0gZmFsc2UpOiBIVE1MRWxlbWVudCB7XHJcbiAgICAgICAgY29uc3QgbGkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwibGlcIik7XHJcbiAgICAgICAgbGkuY2xhc3NMaXN0LmFkZChcIm5hdi1pdGVtXCIpO1xyXG4gICAgICAgIGlmIChhY3RpdmUpIGxpLmNsYXNzTGlzdC5hZGQoXCJhY3RpdmVcIik7XHJcbiAgICAgICAgbGkuaWQgPSBpZDtcclxuXHJcbiAgICAgICAgY29uc3QgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJhXCIpO1xyXG4gICAgICAgIGEuY2xhc3NMaXN0LmFkZChcIm5hdi1saW5rXCIpO1xyXG4gICAgICAgIGEuaW5uZXJUZXh0ID0gdGV4dDtcclxuICAgICAgICBsaS5hcHBlbmRDaGlsZChhKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGxpO1xyXG4gICAgfVxyXG5cclxuICAgIGNyZWF0ZVVwbG9hZENvbnRlbnQoKTogSFRNTEVsZW1lbnQge1xyXG4gICAgICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgZGl2LmlkID0gXCJ1cGxvYWRDb250ZW50XCI7XHJcbiAgICAgICAgZGl2LmNsYXNzTGlzdC5hZGQoXCJ1cGxvYWQtY29udGVudFwiLCBcImNvbnRlbnQtZGF0YVwiKTtcclxuICAgICAgICAvLyBpZiAodGhpcy5pZCA9PT0gXCJ1cGxvYWRDb250ZW50XCIpIGRpdi5jbGFzc0xpc3QuYWRkKFwiYWN0aXZlXCIpO1xyXG5cclxuICAgICAgICBjb25zdCBsYWJlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJsYWJlbFwiKTtcclxuICAgICAgICBsYWJlbC5pbm5lclRleHQgPSBcIlVwbG9hZCBmaWxlXCI7XHJcblxyXG4gICAgICAgIGNvbnN0IHRleHRJbmZvID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICB0ZXh0SW5mby5jbGFzc0xpc3QuYWRkKFwidGV4dC1pbmZvXCIpO1xyXG4gICAgICAgIHRleHRJbmZvLmlubmVyVGV4dCA9IFwiTWF4aW11bSBmaWxlIHNpemU6IDVNQlwiO1xyXG5cclxuICAgICAgICBkaXYuYXBwZW5kQ2hpbGQobGFiZWwpO1xyXG4gICAgICAgIGRpdi5hcHBlbmRDaGlsZCh0ZXh0SW5mbyk7XHJcblxyXG4gICAgICAgIHJldHVybiBkaXY7XHJcbiAgICB9XHJcblxyXG4gICAgY3JlYXRlRW1iZWRDb250ZW50KCk6IEhUTUxFbGVtZW50IHtcclxuICAgICAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgICAgIGRpdi5pZCA9IFwiZW1iZWRDb250ZW50XCI7XHJcbiAgICAgICAgZGl2LmNsYXNzTGlzdC5hZGQoXCJjb250ZW50LWRhdGFcIiwgXCJlbWJlZC1jb250ZW50XCIpO1xyXG4gICAgICAgIC8vIGlmICh0aGlzLmlkID09PSBcImVtYmVkQ29udGVudFwiKSBkaXYuY2xhc3NMaXN0LmFkZChcImFjdGl2ZVwiKTtcclxuXHJcbiAgICAgICAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7XHJcbiAgICAgICAgaW5wdXQudHlwZSA9IFwidGV4dFwiO1xyXG4gICAgICAgIGlucHV0LnNldEF0dHJpYnV0ZShcInBsYWNlaG9sZGVyXCIsIFwiUGFzdGUgVVJMIGhlcmVcIik7XHJcblxyXG4gICAgICAgIGNvbnN0IGJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIik7XHJcbiAgICAgICAgYnV0dG9uLmlubmVyVGV4dCA9IFwiRW1iZWRcIjtcclxuICAgICAgICBidXR0b24uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHRoaXMuZW1iZWRHZW5lcmljKGlucHV0LnZhbHVlKSk7XHJcblxyXG4gICAgICAgIGRpdi5hcHBlbmRDaGlsZChpbnB1dCk7XHJcbiAgICAgICAgZGl2LmFwcGVuZENoaWxkKGJ1dHRvbik7XHJcblxyXG4gICAgICAgIHJldHVybiBkaXY7XHJcbiAgICB9XHJcblxyXG4gICAgZW1iZWRHZW5lcmljKHVybDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgdXJsT2JqID0gbmV3IFVSTCh1cmwpO1xyXG4gICAgICAgIGNvbnN0IGRvbWFpbiA9IHVybE9iai5ob3N0bmFtZTtcclxuICAgICAgICBjb25zdCBwYXRoID0gdXJsT2JqLnBhdGhuYW1lO1xyXG5cclxuICAgICAgICBzd2l0Y2ggKGRvbWFpbikge1xyXG4gICAgICAgICAgICBjYXNlIFwid3d3LnlvdXR1YmUuY29tXCI6XHJcbiAgICAgICAgICAgICAgICBpZiAocGF0aC5zdGFydHNXaXRoKFwiL3dhdGNoXCIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWJlZFlvdVR1YmVWaWRlbyh1cmxPYmopO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXRoLnN0YXJ0c1dpdGgoXCIvcGxheWxpc3RcIikpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmVtYmVkWW91VHViZVBsYXlsaXN0KHVybE9iaik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcIm9wZW4uc3BvdGlmeS5jb21cIjpcclxuICAgICAgICAgICAgICAgIGlmIChwYXRoLnN0YXJ0c1dpdGgoXCIvdHJhY2tcIikpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmVtYmVkU3BvdGlmeVRyYWNrKHVybE9iaik7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhdGguc3RhcnRzV2l0aChcIi9wbGF5bGlzdFwiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZW1iZWRTcG90aWZ5UGxheWxpc3QodXJsT2JqKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwidHdpdHRlci5jb21cIjpcclxuICAgICAgICAgICAgICAgIHRoaXMuZW1iZWRUd2VldCh1cmxPYmopO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJ3d3cuZ29vZ2xlLmNvbVwiOlxyXG4gICAgICAgICAgICBjYXNlIFwid3d3Lmdvb2dsZS5jb20uYnJcIjogIC8vIEhhbmRsZSBtdWx0aXBsZSBHb29nbGUgZG9tYWlucyBpZiBuZWNlc3NhcnlcclxuICAgICAgICAgICAgICAgIGlmIChwYXRoLnN0YXJ0c1dpdGgoXCIvbWFwc1wiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZW1iZWRHb29nbGVNYXAodXJsT2JqKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwiZ2lzdC5naXRodWIuY29tXCI6XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVtYmVkR2lzdCh1cmxPYmosIFwiZ2l0aHViXCIpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJnaXRsYWIuY29tXCI6XHJcbiAgICAgICAgICAgICAgICBpZiAocGF0aC5pbmNsdWRlcyhcIi9zbmlwcGV0c1wiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZW1iZWRHaXN0KHVybE9iaiwgXCJnaXRsYWJcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcImNvZGVwZW4uaW9cIjpcclxuICAgICAgICAgICAgICAgIHRoaXMuZW1iZWRDb2RlcGVuKHVybE9iaik7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJVbnN1cHBvcnRlZCBVUkwgZm9yIGVtYmVkZGluZ1wiKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBBZGRlZCBicmVhayBmb3IgY29uc2lzdGVuY3lcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICB9XHJcblxyXG4gICAgZW1iZWRZb3VUdWJlVmlkZW8odXJsT2JqOiBVUkwpIHtcclxuICAgICAgICBjb25zdCB2aWRlb0lkID0gdXJsT2JqLnNlYXJjaFBhcmFtcy5nZXQoJ3YnKTtcclxuICAgICAgICBpZiAodmlkZW9JZCkge1xyXG5cclxuICAgICAgICAgICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5jcmVhdGVFbWJlZENvbnRhaW5lcigpO1xyXG4gICAgICAgICAgICBjb25zdCBpZnJhbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpZnJhbWUnKTtcclxuXHJcbiAgICAgICAgICAgIGlmcmFtZS5zcmMgPSBgaHR0cHM6Ly93d3cueW91dHViZS5jb20vZW1iZWQvJHt2aWRlb0lkfWA7XHJcbiAgICAgICAgICAgIC8vIGlmcmFtZS5zZXRBdHRyaWJ1dGUoXCJhbGxvd2Z1bGxzY3JlZW5cIiwgXCJ0cnVlXCIpO1xyXG4gICAgICAgICAgICAvLyBpZnJhbWUuc3R5bGUubWF4V2lkdGggPSBcIjEwMCVcIjtcclxuICAgICAgICAgICAgaWZyYW1lLmZyYW1lQm9yZGVyID0gXCIwXCI7XHJcbiAgICAgICAgICAgIGlmcmFtZS5hbGxvdyA9IFwiYWNjZWxlcm9tZXRlcjsgYXV0b3BsYXk7IGNsaXBib2FyZC13cml0ZTsgZW5jcnlwdGVkLW1lZGlhOyBneXJvc2NvcGU7IHBpY3R1cmUtaW4tcGljdHVyZVwiO1xyXG4gICAgICAgICAgICBpZnJhbWUuYWxsb3dGdWxsc2NyZWVuID0gdHJ1ZTtcclxuICAgICAgICAgICAgLy8gaWZyYW1lLnN0eWxlLmhlaWdodCA9IFwiNDUwcHhcIjsgLy8gU2V0IHRoaXMgYXMgcGVyIHlvdXIgbGF5b3V0IHJlcXVpcmVtZW50c1xyXG4gICAgICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoaWZyYW1lKTtcclxuICAgICAgICAgICAgdGhpcy5maW5hbGl6ZUVtYmVkKGNvbnRhaW5lcik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcignSW52YWxpZCBZb3VUdWJlIHZpZGVvIFVSTCcpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBlbWJlZFlvdVR1YmVQbGF5bGlzdCh1cmxPYmo6IFVSTCkge1xyXG4gICAgICAgIGNvbnN0IGxpc3RJZCA9IHVybE9iai5zZWFyY2hQYXJhbXMuZ2V0KCdsaXN0Jyk7XHJcbiAgICAgICAgaWYgKGxpc3RJZCkge1xyXG4gICAgICAgICAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLmNyZWF0ZUVtYmVkQ29udGFpbmVyKCk7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBjb25zdCBpZnJhbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpZnJhbWUnKTtcclxuICAgICAgICAgICAgaWZyYW1lLnNyYyA9IGBodHRwczovL3d3dy55b3V0dWJlLmNvbS9lbWJlZC92aWRlb3Nlcmllcz9saXN0PSR7bGlzdElkfWA7XHJcbiAgICAgICAgICAgIGlmcmFtZS5zZXRBdHRyaWJ1dGUoXCJhbGxvd2Z1bGxzY3JlZW5cIiwgXCJ0cnVlXCIpO1xyXG4gICAgICAgICAgICAvLyBpZnJhbWUuc3R5bGUubWF4V2lkdGggPSBcIjEwMCVcIjtcclxuICAgICAgICAgICAgLy8gaWZyYW1lLnN0eWxlLmhlaWdodCA9IFwiNDUwcHhcIjsgLy8gQWRqdXN0IGFjY29yZGluZyB0byB5b3VyIG5lZWRzXHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChpZnJhbWUpO1xyXG4gICAgICAgICAgICB0aGlzLmZpbmFsaXplRW1iZWQoY29udGFpbmVyKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdJbnZhbGlkIFlvdVR1YmUgcGxheWxpc3QgVVJMJyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGVtYmVkU3BvdGlmeVRyYWNrKHVybE9iajogVVJMKSB7XHJcbiAgICAgICAgY29uc3QgdHJhY2tJZCA9IHVybE9iai5wYXRobmFtZS5zcGxpdCgnLycpLnBvcCgpO1xyXG4gICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuY3JlYXRlRW1iZWRDb250YWluZXIoKTtcclxuICAgICAgICBjb25zdCBpZnJhbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpZnJhbWUnKTtcclxuICAgICAgICBpZnJhbWUuc3JjID0gYGh0dHBzOi8vb3Blbi5zcG90aWZ5LmNvbS9lbWJlZC90cmFjay8ke3RyYWNrSWR9YDtcclxuICAgICAgICBpZnJhbWUuZnJhbWVCb3JkZXIgPSBcIjBcIjtcclxuICAgICAgICAvLyBpZnJhbWUuc3R5bGUubWF4V2lkdGggPSBcIjEwMCVcIjtcclxuICAgICAgICAvLyBpZnJhbWUuc3R5bGUuaGVpZ2h0ID0gXCI4MHB4XCI7IC8vIFNwb3RpZnkgdHJhY2tzIGhhdmUgYSBmaXhlZCBoZWlnaHRcclxuICAgICAgICBpZnJhbWUud2lkdGggPSBcImF1dG9cIjtcclxuICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoaWZyYW1lKTtcclxuICAgICAgICB0aGlzLmZpbmFsaXplRW1iZWQoY29udGFpbmVyKTtcclxuICAgIH1cclxuXHJcbiAgICBlbWJlZFNwb3RpZnlQbGF5bGlzdCh1cmxPYmo6IFVSTCkge1xyXG4gICAgICAgIGNvbnN0IHBsYXlsaXN0SWQgPSB1cmxPYmoucGF0aG5hbWUuc3BsaXQoJy8nKS5wb3AoKTtcclxuICAgICAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLmNyZWF0ZUVtYmVkQ29udGFpbmVyKCk7XHJcbiAgICAgICAgY29uc3QgaWZyYW1lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaWZyYW1lJyk7XHJcbiAgICAgICAgaWZyYW1lLnNyYyA9IGBodHRwczovL29wZW4uc3BvdGlmeS5jb20vZW1iZWQvcGxheWxpc3QvJHtwbGF5bGlzdElkfWA7XHJcbiAgICAgICAgaWZyYW1lLmZyYW1lQm9yZGVyID0gXCIwXCI7XHJcblxyXG4gICAgICAgIC8vIGlmcmFtZS5zdHlsZS5tYXhXaWR0aCA9IFwiMTAwJVwiO1xyXG4gICAgICAgIC8vIGlmcmFtZS5zdHlsZS5oZWlnaHQgPSBcIjM4MHB4XCI7IC8vIFN0YW5kYXJkIFNwb3RpZnkgcGxheWxpc3QgaGVpZ2h0XHJcbiAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGlmcmFtZSk7XHJcbiAgICAgICAgdGhpcy5maW5hbGl6ZUVtYmVkKGNvbnRhaW5lcik7XHJcbiAgICB9XHJcblxyXG4gICAgZW1iZWRUd2VldCh1cmxPYmo6IFVSTCkge1xyXG4gICAgICAgIGNvbnN0IHR3ZWV0SWQgPSB1cmxPYmoucGF0aG5hbWUuc3BsaXQoJy8nKS5wb3AoKTtcclxuICAgICAgICBjb25zdCBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcclxuICAgICAgICBzY3JpcHQuc2V0QXR0cmlidXRlKCdzcmMnLCAnaHR0cHM6Ly9wbGF0Zm9ybS50d2l0dGVyLmNvbS93aWRnZXRzLmpzJyk7XHJcbiAgICAgICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5jcmVhdGVFbWJlZENvbnRhaW5lcigpO1xyXG4gICAgICAgIGNvbnN0IGJsb2NrcXVvdGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdibG9ja3F1b3RlJyk7XHJcbiAgICAgICAgYmxvY2txdW90ZS5jbGFzc0xpc3QuYWRkKFwidHdpdHRlci10d2VldFwiKTtcclxuICAgICAgICBibG9ja3F1b3RlLnNldEF0dHJpYnV0ZSgnZGF0YS10aGVtZScsICdsaWdodCcpOyAvLyBvciAnZGFyaydcclxuICAgICAgICBibG9ja3F1b3RlLmlubmVySFRNTCA9IGA8YSBocmVmPVwiJHt1cmxPYmoudG9TdHJpbmcoKX1cIj5Mb2FkaW5nIHR3ZWV0Li4uPC9hPmA7XHJcbiAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGJsb2NrcXVvdGUpO1xyXG4gICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChzY3JpcHQpO1xyXG4gICAgICAgIHRoaXMuZmluYWxpemVFbWJlZChjb250YWluZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIGVtYmVkR29vZ2xlTWFwKHVybE9iajogVVJMKSB7XHJcbiAgICAgICAgY29uc3QgcXVlcnlTdHJpbmcgPSB1cmxPYmouc2VhcmNoLnNsaWNlKDEpO1xyXG4gICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuY3JlYXRlRW1iZWRDb250YWluZXIoKTtcclxuICAgICAgICBjb25zdCBpZnJhbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpZnJhbWUnKTtcclxuICAgICAgICBpZnJhbWUuc3JjID0gYGh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vbWFwcz8ke3F1ZXJ5U3RyaW5nfSZvdXRwdXQ9ZW1iZWRgO1xyXG4gICAgICAgIGlmcmFtZS5zdHlsZS5tYXhXaWR0aCA9IFwiMTAwJVwiO1xyXG4gICAgICAgIGlmcmFtZS5zdHlsZS5oZWlnaHQgPSBcIjQ1MHB4XCI7XHJcbiAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGlmcmFtZSk7XHJcbiAgICAgICAgdGhpcy5maW5hbGl6ZUVtYmVkKGNvbnRhaW5lcik7XHJcbiAgICB9XHJcblxyXG4gICAgZW1iZWRHaXN0KHVybE9iajogVVJMLCBzZXJ2aWNlOiBzdHJpbmcpIHtcclxuICAgICAgICBjb25zdCBnaXN0SWQgPSB1cmxPYmoucGF0aG5hbWUuc3BsaXQoJy8nKS5wb3AoKTtcclxuICAgICAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLmNyZWF0ZUVtYmVkQ29udGFpbmVyKCk7XHJcbiAgICAgICAgY29udGFpbmVyLnN0eWxlLndpZHRoID0gXCIxMDAlXCI7ICAvLyBFbnN1cmVzIHRoZSBjb250YWluZXIgYWRhcHRzIHRvIHRoZSBjb250ZW50IG9mIHRoZSBHaXN0XHJcbiAgICBcclxuICAgICAgICAvLyBEaWZmZXJlbnRpYXRpbmcgdGhlIHNvdXJjZSBiYXNlZCBvbiB0aGUgc2VydmljZVxyXG4gICAgICAgIGxldCBzcmM7XHJcbiAgICAgICAgaWYgKHNlcnZpY2UgPT09IFwiZ2l0aHViXCIpIHtcclxuICAgICAgICAgICAgc3JjID0gYGh0dHBzOi8vZ2lzdC5naXRodWIuY29tLyR7Z2lzdElkfS5qc2A7XHJcbiAgICAgICAgfSBlbHNlIGlmIChzZXJ2aWNlID09PSBcImdpdGxhYlwiKSB7XHJcbiAgICAgICAgICAgIC8vIEFzc3VtaW5nIEdpdExhYiBnaXN0cyBjYW4gYmUgZW1iZWRkZWQgaW4gYSBzaW1pbGFyIHdheSwgYWRqdXN0IGlmIG5lY2Vzc2FyeVxyXG4gICAgICAgICAgICBzcmMgPSBgaHR0cHM6Ly9naXRsYWIuY29tL3NuaXBwZXRzLyR7Z2lzdElkfS9yYXdgO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJVbnN1cHBvcnRlZCBzZXJ2aWNlIGZvciBlbWJlZGRpbmcgZ2lzdHNcIik7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICBcclxuICAgICAgICBjb25zdCBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcclxuICAgICAgICBzY3JpcHQuc3JjID0gc3JjO1xyXG4gICAgXHJcbiAgICAgICAgLy8gSGFuZGxpbmcgZXZlbnRzIGZvciB3aGVuIHRoZSBzY3JpcHQgaXMgbG9hZGVkXHJcbiAgICAgICAgc2NyaXB0Lm9ubG9hZCA9ICgpID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJHaXN0IGxvYWRlZCBzdWNjZXNzZnVsbHkgZnJvbSBcIiArIHNlcnZpY2UpO1xyXG4gICAgICAgICAgICAvLyBPcHRpb25hbDogYWRkaXRpb25hbCBjb2RlIHRvIHJ1biBhZnRlciB0aGUgR2lzdCBpcyBsb2FkZWRcclxuICAgICAgICB9O1xyXG4gICAgXHJcbiAgICAgICAgLy8gSGFuZGxpbmcgZXJyb3JzXHJcbiAgICAgICAgc2NyaXB0Lm9uZXJyb3IgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJGYWlsZWQgdG8gbG9hZCB0aGUgR2lzdCBmcm9tIFwiICsgc2VydmljZSk7XHJcbiAgICAgICAgICAgIC8vIE9wdGlvbmFsOiBsb2dpYyB0byBoYW5kbGUgbG9hZGluZyBlcnJvcnNcclxuICAgICAgICB9O1xyXG4gICAgXHJcbiAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKHNjcmlwdCk7XHJcbiAgICAgICAgdGhpcy5maW5hbGl6ZUVtYmVkKGNvbnRhaW5lcik7XHJcbiAgICB9XHJcblxyXG4gICAgZW1iZWRDb2RlcGVuKHVybE9iajogVVJMKSB7XHJcbiAgICAgICAgY29uc3QgcGFydHMgPSB1cmxPYmoucGF0aG5hbWUuc3BsaXQoJy8nKTtcclxuICAgICAgICBjb25zdCB1c2VyID0gcGFydHNbMV07XHJcbiAgICAgICAgY29uc3QgcGVuID0gcGFydHNbM107XHJcbiAgICAgICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5jcmVhdGVFbWJlZENvbnRhaW5lcigpO1xyXG4gICAgICAgIGNvbnN0IGlmcmFtZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpO1xyXG4gICAgICAgIGlmcmFtZS5zcmMgPSBgaHR0cHM6Ly9jb2RlcGVuLmlvLyR7dXNlcn0vZW1iZWQvJHtwZW59P2hlaWdodD0yNjUmdGhlbWUtaWQ9bGlnaHQmZGVmYXVsdC10YWI9anMscmVzdWx0YDtcclxuICAgICAgICBpZnJhbWUuc3R5bGUuYm9yZGVyID0gXCJub25lXCI7XHJcbiAgICAgICAgLy8gaWZyYW1lLmZyYW1lQm9yZGVyID0gXCIwXCI7XHJcbiAgICAgICAgaWZyYW1lLnN0eWxlLm1heFdpZHRoID0gJzEwMCUnO1xyXG4gICAgICAgIC8vIGlmcmFtZS5zdHlsZS5oZWlnaHQgPSBcIjMwMHB4XCI7XHJcblxyXG4gICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChpZnJhbWUpO1xyXG4gICAgICAgIHRoaXMuZmluYWxpemVFbWJlZChjb250YWluZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIGNyZWF0ZUVtYmVkQ29udGFpbmVyKCk6IEhUTUxFbGVtZW50IHtcclxuICAgICAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgICBkaXYuY2xhc3NMaXN0LmFkZChcImVtYmVkLWNvbnRhaW5lclwiLCBcImJhY2tncm91bmRcIik7XHJcbiAgICAgICAgcmV0dXJuIGRpdjtcclxuICAgIH1cclxuXHJcbiAgICBmaW5hbGl6ZUVtYmVkKGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5mb2N1c1N0YWNrLnBlZWsoKTtcclxuICAgICAgICBpZiAoZWxlbWVudCkge1xyXG4gICAgICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJyZXNpemFibGVcIik7XHJcbiAgICAgICAgICAgIHdoaWxlIChlbGVtZW50LmZpcnN0Q2hpbGQpIHtcclxuICAgICAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlQ2hpbGQoZWxlbWVudC5maXJzdENoaWxkKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKGNvbnRhaW5lcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuaGlkZSgpO1xyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gICAgc2V0IGlucHV0VmFsdWUodmFsdWU6IHN0cmluZykge1xyXG4gICAgICAgIGNvbnN0IGlucHV0VGV4dCA9IHRoaXMuaHRtbEVsZW1lbnQucXVlcnlTZWxlY3RvcihcImlucHV0XCIpO1xyXG4gICAgICAgIGlmIChpbnB1dFRleHQpIHtcclxuICAgICAgICAgICAgaW5wdXRUZXh0LnZhbHVlID0gdmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBkaXNwbGF5KCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIFwiZmxleFwiO1xyXG4gICAgfVxyXG5cclxuICAgIGF0dGFjaFVJRXZlbnQoKSB7XHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihDdXN0b21VSUV2ZW50cy5TaG93RWxlbWVudCwgdGhpcy5oYW5kbGVTaG93RWxlbWVudEV2ZW50LmJpbmQodGhpcykpO1xyXG4gICAgfVxyXG5cclxuICAgIGhhbmRsZVNob3dFbGVtZW50RXZlbnQoZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBldmVudCBhcyBDdXN0b21FdmVudDxJVUlFdmVudERldGFpbD47XHJcbiAgICAgICAgY29uc3QgZGV0YWlscyA9IGN1c3RvbUV2ZW50LmRldGFpbDtcclxuXHJcbiAgICAgICAgaWYgKGRldGFpbHMudGFyZ2V0SWQgPT0gdGhpcy5pZCkge1xyXG4gICAgICAgICAgICB0aGlzLnNob3coKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXR0YWNoRXZlbnRzKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuYXR0YWNoVUlFdmVudCgpO1xyXG5cclxuICAgICAgICBjb25zdCB1cGxvYWRUYWIgPSB0aGlzLmh0bWxFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjdXBsb2FkVGFiXCIpO1xyXG4gICAgICAgIHVwbG9hZFRhYj8uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5zZXRBY3RpdmVUYWIoJ3VwbG9hZFRhYicsICd1cGxvYWRDb250ZW50Jyk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGVtYmVkVGFiID0gdGhpcy5odG1sRWxlbWVudC5xdWVyeVNlbGVjdG9yKFwiI2VtYmVkVGFiXCIpO1xyXG4gICAgICAgIGVtYmVkVGFiPy5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnNldEFjdGl2ZVRhYignZW1iZWRUYWInLCAnZW1iZWRDb250ZW50Jyk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIGNvbnN0IHZpZGVvVGFiID0gdGhpcy5odG1sRWxlbWVudC5xdWVyeVNlbGVjdG9yKFwiI3ZpZGVvVGFiXCIpO1xyXG4gICAgICAgIC8vIHZpZGVvVGFiPy5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xyXG4gICAgICAgIC8vICAgICB0aGlzLnNldEFjdGl2ZVRhYigndmlkZW9UYWInLCAndmlkZW9Db250ZW50Jyk7XHJcbiAgICAgICAgLy8gfSk7XHJcblxyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRGVmYXVsdEpTRXZlbnRzLktleWRvd24sIHRoaXMuaGFuZGxlckV2ZW50LmJpbmQodGhpcykpO1xyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRGVmYXVsdEpTRXZlbnRzLkNsaWNrLCB0aGlzLmhhbmRsZXJBbm90aGVyRXZlbnQuYmluZCh0aGlzKSk7XHJcbiAgICB9XHJcblxyXG4gICAgaGFuZGxlckV2ZW50KGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XHJcbiAgICAgICAgaWYgKGV2ZW50LmtleSA9PSBLZXlib2FyZEtleXMuRXNjYXBlKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmNhbkhpZGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGhhbmRsZXJBbm90aGVyRXZlbnQoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcclxuICAgICAgICBjb25zdCBpbWFnZVJlcGxhY2UgPSBET01VdGlscy5maW5kQ2xpY2tlZEVsZW1lbnRPckFuY2VzdG9yQnlJZChldmVudCwgXCJlbWJlZEltYWdlXCIpO1xyXG4gICAgICAgIGlmIChpbWFnZVJlcGxhY2UpIHtcclxuICAgICAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmZvY3VzU3RhY2sucGVlaygpO1xyXG4gICAgICAgICAgICBpZiAoZWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5lbWJlZEltYWdlKGVsZW1lbnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCB2aWRlb1JlcGxhY2UgPSBET01VdGlscy5maW5kQ2xpY2tlZEVsZW1lbnRPckFuY2VzdG9yQnlJZChldmVudCwgXCJlbWJlZFZpZGVvXCIpO1xyXG4gICAgICAgIGlmICh2aWRlb1JlcGxhY2UpIHtcclxuICAgICAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmZvY3VzU3RhY2sucGVlaygpO1xyXG4gICAgICAgICAgICBpZiAoZWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5lbWJlZFZpZGVvKGVsZW1lbnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBjbGlja2VkSW5zaWRlID0gRE9NVXRpbHMuZmluZENsaWNrZWRFbGVtZW50T3JBbmNlc3RvckJ5SWQoZXZlbnQsIHRoaXMuaWQpO1xyXG4gICAgICAgIGlmICghY2xpY2tlZEluc2lkZSAmJiB0aGlzLmlzVmlzaWJsZSkge1xyXG4gICAgICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgdGhpcy5oaWRlKCk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IERPTVV0aWxzLmZpbmRDbGlja2VkRWxlbWVudE9yQW5jZXN0b3JCeUNsYXNzKGV2ZW50LCBcInRlbXAtaW1hZ2UtcmVwbGFjZVwiKTtcclxuICAgICAgICBpZiAoY29udGFpbmVyKSB7XHJcbiAgICAgICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICB0aGlzLmZvY3VzU3RhY2sucHVzaChjb250YWluZXIpO1xyXG4gICAgICAgICAgICB0aGlzLnNob3coKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgdmlkZW9Db250YWluZXIgPSBET01VdGlscy5maW5kQ2xpY2tlZEVsZW1lbnRPckFuY2VzdG9yQnlDbGFzcyhldmVudCwgXCJ0ZW1wLXZpZGVvLXJlcGxhY2VcIik7XHJcbiAgICAgICAgaWYgKHZpZGVvQ29udGFpbmVyKSB7XHJcbiAgICAgICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICB0aGlzLmZvY3VzU3RhY2sucHVzaCh2aWRlb0NvbnRhaW5lcik7XHJcbiAgICAgICAgICAgIHRoaXMuc2hvdygpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICBnZXRUYWIodGFiSWQ6IHN0cmluZyk6IEhUTUxFbGVtZW50IHwgbnVsbCB7XHJcbiAgICAgICAgcmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRhYklkKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRDb250ZW50KGNvbnRlbnRJZDogc3RyaW5nKTogSFRNTEVsZW1lbnQgfCBudWxsIHtcclxuICAgICAgICByZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoY29udGVudElkKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRBY3RpdmVUYWIodGFiSWQ6IHN0cmluZywgY29udGVudElkOiBzdHJpbmcpIHtcclxuICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcubmF2LWl0ZW0nKS5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICBpdGVtLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5jb250ZW50LWRhdGEnKS5mb3JFYWNoKGNvbnRlbnQgPT4ge1xyXG4gICAgICAgICAgICBjb250ZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmdldFRhYih0YWJJZCk/LmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xyXG4gICAgICAgIHRoaXMuZ2V0Q29udGVudChjb250ZW50SWQpPy5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcclxuICAgIH1cclxuXHJcbiAgICBlbWJlZEltYWdlKGltYWdlUmVwbGFjZUVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XHJcbiAgICAgICAgY29uc3QgdXJsID0gKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNlbWJlZENvbnRlbnQgaW5wdXRbdHlwZT10ZXh0XScpIGFzIEhUTUxJbnB1dEVsZW1lbnQpPy52YWx1ZTtcclxuICAgICAgICBjb25zb2xlLmxvZygnRW1iZWRkaW5nIGltYWdlIGZyb20gVVJMOicsIHVybCk7XHJcblxyXG4gICAgICAgIGNvbnN0IGNvbnRlbnRFbGVtZW50ID0gaW1hZ2VSZXBsYWNlRWxlbWVudC5jbG9zZXN0KFwiLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudFwiKTtcclxuICAgICAgICBpZiAoY29udGVudEVsZW1lbnQpIHtcclxuICAgICAgICAgICAgd2hpbGUgKGNvbnRlbnRFbGVtZW50LmZpcnN0Q2hpbGQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGNvbnRlbnRFbGVtZW50LmZpcnN0Q2hpbGQpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCBpbWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTtcclxuICAgICAgICAgICAgaW1nLmNvbnRlbnRFZGl0YWJsZSA9IFwidHJ1ZVwiO1xyXG4gICAgICAgICAgICBpbWcuc3JjID0gdXJsO1xyXG4gICAgICAgICAgICBpbWcuYWx0ID0gJ0VtYmVkZGVkIEltYWdlJztcclxuICAgICAgICAgICAgaW1nLnN0eWxlLm1heFdpZHRoID0gJzEwMCUnO1xyXG4gICAgICAgICAgICBpbWcuc3R5bGUud2lkdGggPSAnYXV0byc7XHJcbiAgICAgICAgICAgIGltZy5zdHlsZS5oZWlnaHQgPSAnYXV0byc7XHJcblxyXG5cclxuICAgICAgICAgICAgY29udGVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZChcInJlc2l6YWJsZVwiKTtcclxuICAgICAgICAgICAgaW1nLmNsYXNzTGlzdC5hZGQoXCJiYWNrZ3JvdW5kXCIpO1xyXG5cclxuICAgICAgICAgICAgY29udGVudEVsZW1lbnQuYXBwZW5kQ2hpbGQoaW1nKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdObyBjb250ZW50IGVsZW1lbnQgZm91bmQgd2l0aCBkYXRhLWNvbnRlbnQtdHlwZT1cImltYWdlXCInKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuaGlkZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGVtYmVkVmlkZW8odmlkZW9SZXBsYWNlRWxlbWVudDogSFRNTEVsZW1lbnQpIHtcclxuICAgICAgICBjb25zdCB1cmwgPSAoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3ZpZGVvQ29udGVudCBpbnB1dFt0eXBlPXRleHRdJykgYXMgSFRNTElucHV0RWxlbWVudCk/LnZhbHVlO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCdFbWJlZGRpbmcgdmlkZW8gZnJvbSBVUkw6JywgdXJsKTtcclxuXHJcbiAgICAgICAgY29uc3QgY29udGVudEVsZW1lbnQgPSB2aWRlb1JlcGxhY2VFbGVtZW50LmNsb3Nlc3QoXCIuam9oYW5uZXMtY29udGVudC1lbGVtZW50XCIpO1xyXG4gICAgICAgIGlmIChjb250ZW50RWxlbWVudCkge1xyXG4gICAgICAgICAgICB3aGlsZSAoY29udGVudEVsZW1lbnQuZmlyc3RDaGlsZCkge1xyXG4gICAgICAgICAgICAgICAgY29udGVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoY29udGVudEVsZW1lbnQuZmlyc3RDaGlsZCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHZpZGVvSWQgPSBuZXcgVVJMKHVybCkuc2VhcmNoUGFyYW1zLmdldCgndicpO1xyXG4gICAgICAgICAgICBpZiAodmlkZW9JZCkge1xyXG4gICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgY29udGFpbmVyIGZvciB0aGUgaWZyYW1lXHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCd2aWRlby1jb250YWluZXInKTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBpZnJhbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpZnJhbWUnKTtcclxuICAgICAgICAgICAgICAgIGlmcmFtZS5zcmMgPSBgaHR0cHM6Ly93d3cueW91dHViZS5jb20vZW1iZWQvJHt2aWRlb0lkfWA7XHJcbiAgICAgICAgICAgICAgICBpZnJhbWUuZnJhbWVCb3JkZXIgPSBcIjBcIjtcclxuXHJcbiAgICAgICAgICAgICAgICBpZnJhbWUuYWxsb3cgPSBcImFjY2VsZXJvbWV0ZXI7IGF1dG9wbGF5OyBjbGlwYm9hcmQtd3JpdGU7IGVuY3J5cHRlZC1tZWRpYTsgZ3lyb3Njb3BlOyBwaWN0dXJlLWluLXBpY3R1cmVcIjtcclxuICAgICAgICAgICAgICAgIGlmcmFtZS5hbGxvd0Z1bGxzY3JlZW4gPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChpZnJhbWUpO1xyXG4gICAgICAgICAgICAgICAgY29udGVudEVsZW1lbnQuYXBwZW5kQ2hpbGQoY29udGFpbmVyKTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb250ZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKFwicmVzaXphYmxlXCIpO1xyXG4gICAgICAgICAgICAgICAgaWZyYW1lLmNsYXNzTGlzdC5hZGQoXCJiYWNrZ3JvdW5kXCIpO1xyXG5cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ludmFsaWQgWW91VHViZSBVUkwnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ05vIGNvbnRlbnQgZWxlbWVudCBmb3VuZCB3aXRoIGRhdGEtY29udGVudC10eXBlPVwidmlkZW9cIicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5oaWRlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgc2hvdygpOiB2b2lkIHtcclxuXHJcbiAgICAgICAgY29uc3QgbGFzdEZvY3VzZWQgPSB0aGlzLmZvY3VzU3RhY2sucGVlaygpO1xyXG4gICAgICAgIGlmIChsYXN0Rm9jdXNlZCkge1xyXG4gICAgICAgICAgICB0aGlzLmNoYW5nZVRvb2xiYXJQb3NpdGlvblRvQmVDbG9zZWRUbyhsYXN0Rm9jdXNlZCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSBcInZpc2libGVcIjtcclxuICAgICAgICBzdXBlci5zaG93KCk7XHJcbiAgICB9XHJcblxyXG4gICAgaGlkZSgpIHtcclxuICAgICAgICB0aGlzLmlucHV0VmFsdWUgPSBcIlwiO1xyXG4gICAgICAgIHN1cGVyLmhpZGUoKTtcclxuICAgIH1cclxuXHJcbiAgICBjaGFuZ2VUb29sYmFyUG9zaXRpb25Ub0JlQ2xvc2VkVG8oZWxlbWVudDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCByZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuXHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gXCJmbGV4XCI7XHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gXCJoaWRkZW5cIjtcclxuXHJcbiAgICAgICAgY29uc3QgdGFyZ2V0TWlkcG9pbnQgPSByZWN0LmxlZnQgKyB3aW5kb3cuc2Nyb2xsWCArIChyZWN0LndpZHRoIC8gMik7XHJcbiAgICAgICAgbGV0IGxlZnRQb3NpdGlvbiA9IHRhcmdldE1pZHBvaW50IC0gKHRoaXMuaHRtbEVsZW1lbnQub2Zmc2V0V2lkdGggLyAyKTtcclxuICAgICAgICBsZXQgdG9wUG9zaXRpb24gPSByZWN0LmJvdHRvbSArIHdpbmRvdy5zY3JvbGxZICsgMTA7XHJcblxyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUubGVmdCA9IGAke2xlZnRQb3NpdGlvbn1weGA7XHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5zdHlsZS50b3AgPSBgJHt0b3BQb3NpdGlvbn1weGA7XHJcbiAgICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgTWVkaWFJbnB1dHRlciB9IGZyb20gXCJAL2NvbXBvbmVudHMvbWVkaWEtaW5wdXR0ZXIvTWVkaWFJbnB1dHRlclwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIE1lZGlhSW5wdXR0ZXJCdWlsZGVyIHtcclxuICAgIHN0YXRpYyBidWlsZCgpOiBNZWRpYUlucHV0dGVyIHtcclxuXHJcbiAgICAgICAgY29uc3QgbWVkaWFJbnB1dHRlciA9IG5ldyBNZWRpYUlucHV0dGVyKCk7XHJcblxyXG4gICAgICAgIHJldHVybiBtZWRpYUlucHV0dGVyO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgRWRpdG9yIH0gZnJvbSBcIkAvY29tcG9uZW50cy9lZGl0b3IvRWRpdG9yXCI7XHJcbmltcG9ydCB7IEFkZEJsb2NrQnVpbGRlciB9IGZyb20gXCIuL0FkZEJsb2NrQnVpbGRlclwiO1xyXG5pbXBvcnQgeyBUZXh0Q29udGV4dEZsb2F0aW5nVG9vbGJhckJ1aWxkZXIgfSBmcm9tIFwiLi9UZXh0Q29udGV4dEZsb2F0aW5nVG9vbGJhckJ1aWxkZXJcIjtcclxuaW1wb3J0IHsgUXVpY2tNZW51QnVpbGRlciB9IGZyb20gXCIuL1F1aWNrTWVudUJ1aWxkZXJcIjtcclxuaW1wb3J0IHsgVGl0bGVCdWlsZGVyIH0gZnJvbSBcIi4vVGl0bGVCdWlsZGVyXCI7XHJcbmltcG9ydCB7IENvbnRlbnRCdWlsZGVyIH0gZnJvbSBcIi4vQ29udGVudEJ1aWxkZXJcIjtcclxuaW1wb3J0IHsgVGFibGVDb250ZXh0RmxvYXRpbmdUb29sYmFyQnVpbGRlciB9IGZyb20gXCIuL1RhYmxlQ29udGV4dEZsb2F0aW5nVG9vbGJhckJ1aWxkZXJcIjtcclxuaW1wb3J0IHsgTWVkaWFJbnB1dHRlckJ1aWxkZXIgfSBmcm9tIFwiLi9NZWRpYUlucHV0dGVyQnVpbGRlclwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIEVkaXRvckJ1aWxkZXIge1xyXG5cclxuICAgIHN0YXRpYyBidWlsZCgpOiBFZGl0b3Ige1xyXG5cclxuICAgICAgICBjb25zdCBlZGl0b3IgPSBFZGl0b3IuZ2V0SW5zdGFuY2UoXHJcbiAgICAgICAgICAgIFRpdGxlQnVpbGRlci5idWlsZCgpLFxyXG4gICAgICAgICAgICBDb250ZW50QnVpbGRlci5idWlsZCgpLFxyXG4gICAgICAgICAgICBBZGRCbG9ja0J1aWxkZXIuYnVpbGQoKSxcclxuICAgICAgICAgICAgVGV4dENvbnRleHRGbG9hdGluZ1Rvb2xiYXJCdWlsZGVyLmJ1aWxkKCksXHJcbiAgICAgICAgICAgIFF1aWNrTWVudUJ1aWxkZXIuYnVpbGQoKSxcclxuICAgICAgICAgICAgVGFibGVDb250ZXh0RmxvYXRpbmdUb29sYmFyQnVpbGRlci5idWlsZCgpLFxyXG4gICAgICAgICAgICBNZWRpYUlucHV0dGVyQnVpbGRlci5idWlsZCgpXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGVkaXRvcjtcclxuICAgIH1cclxufSIsImltcG9ydCB7IEVkaXRvciB9IGZyb20gXCIuLi9jb21wb25lbnRzL2VkaXRvci9FZGl0b3JcIjtcclxuaW1wb3J0IGljb25zIGZyb20gXCIuLi9hc3NldHMvaW1nL2ljb25zLnN2Z1wiO1xyXG5pbXBvcnQgeyBFZGl0b3JCdWlsZGVyIH0gZnJvbSBcIi4vRWRpdG9yQnVpbGRlclwiO1xyXG5cclxuLyoqXHJcbiAqIFNpbmdsZXRvbiBjbGFzcyByZXNwb25zaWJsZSBmb3IgYnVpbGRpbmcgYW5kIG1hbmFnaW5nIHRoZSB1c2VyIGludGVyZmFjZSBvZiB0aGUgZWRpdG9yLlxyXG4gKiBFbnN1cmVzIHRoYXQgb25seSBvbmUgaW5zdGFuY2Ugb2YgVUlCdWlsZGVyIGNhbiBleGlzdCwgbWFuYWdpbmcgdGhlIGNyZWF0aW9uIGFuZCBjb25maWd1cmF0aW9uIG9mIHRoZSBlZGl0b3IuXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgVUlCdWlsZGVyIHtcclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZTogVUlCdWlsZGVyO1xyXG5cclxuICAgIHByaXZhdGUgZWRpdG9yOiBFZGl0b3I7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcml2YXRlIGNvbnN0cnVjdG9yIGZvciBVSUJ1aWxkZXIgdG8gZW5mb3JjZSBzaW5nbGV0b24gcGF0dGVybi5cclxuICAgICAqIEluaXRpYWxpemVzIHRoZSBVSUJ1aWxkZXIgaW5zdGFuY2Ugd2l0aCBhIGdpdmVuIGVkaXRvci5cclxuICAgICAqIEBwYXJhbSB7RWRpdG9yfSBlZGl0b3IgVGhlIGVkaXRvciBpbnN0YW5jZSB0byBiZSBtYW5hZ2VkIGJ5IFVJQnVpbGRlci5cclxuICAgICAqIEB0aHJvd3Mge0Vycm9yfSBUaHJvd3MgYW4gZXJyb3IgaWYgYW4gaW5zdGFuY2Ugb2YgVUlCdWlsZGVyIGFscmVhZHkgZXhpc3RzLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKGVkaXRvcjogRWRpdG9yKSB7XHJcblxyXG4gICAgICAgIGlmIChVSUJ1aWxkZXIuaW5zdGFuY2UpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmVkaXRvciA9IGVkaXRvcjtcclxuXHJcbiAgICAgICAgVUlCdWlsZGVyLmluc3RhbmNlID0gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFN0YXRpYyBtZXRob2QgdG8gZ2V0IG9yIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiBVSUJ1aWxkZXIuXHJcbiAgICAgKiBUaGlzIG1ldGhvZCBpbXBsZW1lbnRzIHRoZSBzaW5nbGV0b24gcGF0dGVybiBhbmQgZW5zdXJlcyB0aGF0IFVJQnVpbGRlciBpcyBvbmx5IGluc3RhbnRpYXRlZCBvbmNlLlxyXG4gICAgICogQHJldHVybnMge1VJQnVpbGRlcn0gUmV0dXJucyB0aGUgZXhpc3Rpbmcgb3IgbmV3IFVJQnVpbGRlciBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgc3RhdGljIGJ1aWxkKCk6IFVJQnVpbGRlciB7XHJcblxyXG4gICAgICAgIGlmIChVSUJ1aWxkZXIuaW5zdGFuY2UpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFVJQnVpbGRlci5pbnN0YW5jZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgVUlCdWlsZGVyKEVkaXRvckJ1aWxkZXIuYnVpbGQoKSk7XHJcblxyXG4gICAgICAgIHJldHVybiBidWlsZGVyO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW5pdGlhbGl6ZXMgdGhlIGVkaXRvciBieSBpbnNlcnRpbmcgbmVjZXNzYXJ5IGljb25zIGFuZCByZXR1cm5pbmcgdGhlIGVkaXRvciBpbnN0YW5jZS5cclxuICAgICAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgdG8gc3RhcnQgdGhlIGVkaXRvciBhbmQgcHJlcGFyZSBhbGwgVUkgY29tcG9uZW50cy5cclxuICAgICAqIEByZXR1cm5zIHtFZGl0b3J9IFRoZSBpbml0aWFsaXplZCBlZGl0b3IgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIHN0YXJ0KCk6IEVkaXRvciB7XHJcblxyXG4gICAgICAgIHRoaXMuaW5zZXJ0SWNvbnMoKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZWRpdG9yO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgKiBJbnNlcnRzIGEgY29udGFpbmVyIHdpdGggU1ZHIGljb25zIGludG8gdGhlIGRvY3VtZW50IGJvZHkuIFRoaXMgbWV0aG9kIGVuc3VyZXMgdGhhdFxyXG4gICAgKiB0aGUgaWNvbnMgYXJlIG9ubHkgaW5zZXJ0ZWQgb25jZSB0byBwcmV2ZW50IGR1cGxpY2F0ZSBlbnRyaWVzLlxyXG4gICAgKi9cclxuICAgIGluc2VydEljb25zKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICghZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnN2Zy1pY29ucy1jb250YWluZXInKSkge1xyXG4gICAgICAgICAgICBjb25zdCBzdmdDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuXHJcbiAgICAgICAgICAgIHN2Z0NvbnRhaW5lci5pbm5lckhUTUwgPSBpY29ucztcclxuICAgICAgICAgICAgc3ZnQ29udGFpbmVyLmNsYXNzTmFtZSA9ICdzdmctaWNvbnMtY29udGFpbmVyJztcclxuXHJcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoc3ZnQ29udGFpbmVyKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBDdXN0b21FdmVudHMgfSBmcm9tIFwiQC9jb21tb24vQ3VzdG9tRXZlbnRzXCI7XHJcbmltcG9ydCB7IENvbW1hbmRzIH0gZnJvbSBcIi4vQ29tbWFuZHNcIjtcclxuaW1wb3J0IHsgQmxvY2tPcGVyYXRpb25zU2VydmljZSB9IGZyb20gXCJAL3NlcnZpY2VzL2Jsb2NrLW9wZXJhdGlvbnMvQmxvY2tPcGVyYXRpb25zU2VydmljZVwiO1xyXG5pbXBvcnQgeyBJQ29tbWFuZEV2ZW50RGV0YWlsIH0gZnJvbSBcIi4vSUNvbW1hbmRFdmVudERldGFpbFwiO1xyXG5pbXBvcnQgeyBEZXBlbmRlbmN5Q29udGFpbmVyIH0gZnJvbSBcIkAvY29yZS9EZXBlbmRlbmN5Q29udGFpbmVyXCI7XHJcbmltcG9ydCB7IElCbG9ja09wZXJhdGlvbnNTZXJ2aWNlIH0gZnJvbSBcIkAvc2VydmljZXMvYmxvY2stb3BlcmF0aW9ucy9JQmxvY2tPcGVyYXRpb25zU2VydmljZVwiO1xyXG5pbXBvcnQgeyBJVGFibGVPcGVyYXRpb25zU2VydmljZSB9IGZyb20gXCJAL3NlcnZpY2VzL3RhYmxlLW9wZXJhdGlvbnMvSVRhYmxlT3BlcmF0aW9uc1NlcnZpY2VcIjtcclxuaW1wb3J0IHsgSVRleHRPcGVyYXRpb25zU2VydmljZSB9IGZyb20gXCJAL3NlcnZpY2VzL3RleHQtb3BlcmF0aW9ucy9JVGV4dE9wZXJhdGlvbnNTZXJ2aWNlXCI7XHJcbmltcG9ydCB7IFRhYmxlU2NvcGVzIH0gZnJvbSBcIkAvc2VydmljZXMvdGFibGUtb3BlcmF0aW9ucy9UYWJsZVNjb3Blc1wiO1xyXG5pbXBvcnQgeyBDb2xvcnMgfSBmcm9tIFwiQC9jb21tb24vQ29sb3JzXCI7XHJcblxyXG4vKipcclxuICogQ2VudHJhbCBjb21tYW5kIGRpc3BhdGNoZXIgY2xhc3MgZm9yIGhhbmRsaW5nIHZhcmlvdXMgZWRpdG9yIGNvbW1hbmRzIHJlbGF0ZWQgdG8gdGV4dCBhbmQgYmxvY2sgbWFuaXB1bGF0aW9uLlxyXG4gKiBUaGlzIGNsYXNzIGVuY2Fwc3VsYXRlcyB0aGUgbG9naWMgbmVlZGVkIHRvIGV4ZWN1dGUgY29tbWFuZHMgc3VjaCBhcyBib2xkLCBpdGFsaWMsIHVuZGVybGluZSwgY29sb3IgY2hhbmdlcywgYW5kIHN0cnVjdHVyYWwgbW9kaWZpY2F0aW9ucyB0byBjb250ZW50IGJsb2NrcyB3aXRoaW4gYW4gZWRpdG9yLlxyXG4gKlxyXG4gKiBAY2xhc3NcclxuICogQHNpbmdsZXRvblxyXG4gKiBNZXRob2RzIGluIHRoaXMgY2xhc3MgYXJlIHRyaWdnZXJlZCBieSBldmVudCBsaXN0ZW5lcnMgdGhhdCBsaXN0ZW4gZm9yIGN1c3RvbSBldmVudHMgd2hpY2ggZGljdGF0ZSB0aGUgdHlwZSBvZiBjb21tYW5kIHRvIGJlIGV4ZWN1dGVkLlxyXG4gKlxyXG4gKiBFeGFtcGxlIHVzYWdlOlxyXG4gKiBgYGBqYXZhc2NyaXB0XHJcbiAqIGNvbnN0IGNvbW1hbmREaXNwYXRjaGVyID0gQ29tbWFuZERpc3BhdGNoZXIuZ2V0SW5zdGFuY2UoKTtcclxuICogY29tbWFuZERpc3BhdGNoZXIubGlzdGVuKCk7ICAvLyBTdGFydCBsaXN0ZW5pbmcgZm9yIGNvbW1hbmQgYW5kIHNlbGVjdGlvbiBjaGFuZ2UgZXZlbnRzLlxyXG4gKiBgYGBcclxuICovXHJcbmV4cG9ydCBjbGFzcyBDb21tYW5kRGlzcGF0Y2hlciB7XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IENvbW1hbmREaXNwYXRjaGVyIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gICAgcHJpdmF0ZSBibG9ja09wZXJhdGlvbnNTZXJ2aWNlOiBJQmxvY2tPcGVyYXRpb25zU2VydmljZTtcclxuICAgIHByaXZhdGUgdGFibGVPcGVyYXRpb25zU2VydmljZTogSVRhYmxlT3BlcmF0aW9uc1NlcnZpY2U7XHJcbiAgICBwcml2YXRlIHRleHRPcGVyYXRpb25zU2VydmljZTogSVRleHRPcGVyYXRpb25zU2VydmljZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFByaXZhdGUgY29uc3RydWN0b3IgdG8gZW5mb3JjZSBzaW5nbGV0b24gcGF0dGVybi5cclxuICAgICAqIFRocm93cyBhbiBlcnJvciBpZiBhdHRlbXB0ZWQgdG8gYmUgaW5zdGFudGlhdGVkIG1vcmUgdGhhbiBvbmNlLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIGJsb2NrT3BlcmF0aW9uc1NlcnZpY2U6IElCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLFxyXG4gICAgICAgIHRleHRPcGVyYXRpb25TZXJ2aWNlOiBJVGV4dE9wZXJhdGlvbnNTZXJ2aWNlLFxyXG4gICAgICAgIHRhYmxlT3BlcmF0aW9uc1NlcnZpY2U6IElUYWJsZU9wZXJhdGlvbnNTZXJ2aWNlKSB7XHJcblxyXG4gICAgICAgIGlmIChDb21tYW5kRGlzcGF0Y2hlci5pbnN0YW5jZSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBdHRlbXB0IHRvIGluc3RhbnRpYXRlIHNpbmdsZXRvbiBgQ29tbWFuZERpc3BhdGNoZXJgIG1vcmUgdGhhbiBvbmNlLlwiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuYmxvY2tPcGVyYXRpb25zU2VydmljZSA9IGJsb2NrT3BlcmF0aW9uc1NlcnZpY2U7XHJcbiAgICAgICAgdGhpcy50ZXh0T3BlcmF0aW9uc1NlcnZpY2UgPSB0ZXh0T3BlcmF0aW9uU2VydmljZTtcclxuICAgICAgICB0aGlzLnRhYmxlT3BlcmF0aW9uc1NlcnZpY2UgPSB0YWJsZU9wZXJhdGlvbnNTZXJ2aWNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0cmlldmVzIG9yIGNyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgQ29tbWFuZERpc3BhdGNoZXIuXHJcbiAgICAgKiBAcmV0dXJucyB7Q29tbWFuZERpc3BhdGNoZXJ9IFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIENvbW1hbmREaXNwYXRjaGVyLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldEluc3RhbmNlKCk6IENvbW1hbmREaXNwYXRjaGVyIHtcclxuXHJcbiAgICAgICAgY29uc3QgYmxvY2tPcGVyYXRpb25zU2VydmljZSA9IERlcGVuZGVuY3lDb250YWluZXIuSW5zdGFuY2UucmVzb2x2ZTxJQmxvY2tPcGVyYXRpb25zU2VydmljZT4oXCJJQmxvY2tPcGVyYXRpb25zU2VydmljZVwiKTtcclxuICAgICAgICBjb25zdCB0ZXh0T3BlcmF0aW9uU2VydmljZSA9IERlcGVuZGVuY3lDb250YWluZXIuSW5zdGFuY2UucmVzb2x2ZTxJVGV4dE9wZXJhdGlvbnNTZXJ2aWNlPihcIklUZXh0T3BlcmF0aW9uc1NlcnZpY2VcIik7XHJcbiAgICAgICAgY29uc3QgdGFibGVPcGVyYXRpb25zU2VydmljZSA9IERlcGVuZGVuY3lDb250YWluZXIuSW5zdGFuY2UucmVzb2x2ZTxJVGFibGVPcGVyYXRpb25zU2VydmljZT4oXCJJVGFibGVPcGVyYXRpb25zU2VydmljZVwiKTtcclxuXHJcbiAgICAgICAgaWYgKCFDb21tYW5kRGlzcGF0Y2hlci5pbnN0YW5jZSkge1xyXG4gICAgICAgICAgICBDb21tYW5kRGlzcGF0Y2hlci5pbnN0YW5jZSA9IG5ldyBDb21tYW5kRGlzcGF0Y2hlcihibG9ja09wZXJhdGlvbnNTZXJ2aWNlLCB0ZXh0T3BlcmF0aW9uU2VydmljZSwgdGFibGVPcGVyYXRpb25zU2VydmljZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBDb21tYW5kRGlzcGF0Y2hlci5pbnN0YW5jZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEluaXRpYWxpemVzIGxpc3RlbmVycyBmb3IgdmFyaW91cyBlZGl0b3ItcmVsYXRlZCBldmVudHMgc3VjaCBhcyBjb21tYW5kIHJlcXVlc3RzIGFuZCBzZWxlY3Rpb24gY2hhbmdlcy5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGxpc3RlbigpOiB2b2lkIHtcclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEN1c3RvbUV2ZW50cy5lbWl0dGVkQ29tbWFuZCwgdGhpcy5oYW5kbGVDb21tYW5kRXZlbnQgYXMgRXZlbnRMaXN0ZW5lcik7XHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihDdXN0b21FdmVudHMuZm9jdXNPbkZpcnN0UmVxdWVzdGVkLCB0aGlzLmhhbmRsZUZvY3VzT25GaXJzdFJlcXVlc3RlZEV2ZW50KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEhhbmRsZXMgY29tbWFuZCBldmVudHMgZGlzcGF0Y2hlZCBmcm9tIFVJIGNvbXBvbmVudHMgb3Igb3RoZXIgcGFydHMgb2YgdGhlIGFwcGxpY2F0aW9uLlxyXG4gICAgICogQHBhcmFtIHtDdXN0b21FdmVudDxJQ29tbWFuZEV2ZW50RGV0YWlsPn0gZXZlbnQgLSBUaGUgZXZlbnQgb2JqZWN0IGNvbnRhaW5pbmcgZGV0YWlscyBhYm91dCB0aGUgY29tbWFuZC5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBoYW5kbGVDb21tYW5kRXZlbnQgPSAoZXZlbnQ6IEN1c3RvbUV2ZW50PElDb21tYW5kRXZlbnREZXRhaWw+KTogdm9pZCA9PiB7XHJcbiAgICAgICAgY29uc3QgeyBjb21tYW5kLCBzaG93VUksIHZhbHVlLCB0YXJnZXRCbG9ja1R5cGUsIGJsb2NrLCBzY29wZSB9ID0gZXZlbnQuZGV0YWlsO1xyXG5cclxuICAgICAgICBzd2l0Y2ggKGNvbW1hbmQpIHtcclxuICAgICAgICAgICAgY2FzZSBDb21tYW5kcy50b2dnbGVCb2xkOlxyXG4gICAgICAgICAgICAgICAgdGhpcy50ZXh0T3BlcmF0aW9uc1NlcnZpY2UuZXhlY0JvbGQoKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIENvbW1hbmRzLnRvZ2dsZUl0YWxpYzpcclxuICAgICAgICAgICAgICAgIHRoaXMudGV4dE9wZXJhdGlvbnNTZXJ2aWNlLmV4ZWNJdGFsaWMoKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIENvbW1hbmRzLnRvZ2dsZVVuZGVybGluZTpcclxuICAgICAgICAgICAgICAgIHRoaXMudGV4dE9wZXJhdGlvbnNTZXJ2aWNlLmV4ZWNVbmRlcmxpbmUoKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIENvbW1hbmRzLnRvZ2dsZVN0cmlrZVRocm91Z2g6XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRleHRPcGVyYXRpb25zU2VydmljZS5leGVjU3RyaWtlVGhyb3VnaCgpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgQ29tbWFuZHMudG9nZ2xlSGlsaXRlQ29sb3I6XHJcbiAgICAgICAgICAgICAgICBpZiAoIXZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke0NvbW1hbmRzLnRvZ2dsZUhpbGl0ZUNvbG9yfSByZXF1aXJlcyBhIGNvbG9yIHZhbHVlYCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRleHRPcGVyYXRpb25zU2VydmljZS5leGVjSGlsaXRlQ29sb3IodmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgQ29tbWFuZHMudG9nZ2xlRm9yZUNvbG9yOlxyXG4gICAgICAgICAgICAgICAgaWYgKCF2YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtDb21tYW5kcy50b2dnbGVGb3JlQ29sb3J9IHJlcXVpcmVzIGEgY29sb3IgdmFsdWVgKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMudGV4dE9wZXJhdGlvbnNTZXJ2aWNlLmV4ZWNGb3JlQ29sb3IodmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgQ29tbWFuZHMudHJhbnNmb3JtQmxvY2s6XHJcbiAgICAgICAgICAgICAgICBpZiAoIXZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke0NvbW1hbmRzLnRyYW5zZm9ybUJsb2NrfSByZXF1aXJlcyBhIHZhbHVlIHRoYXQgcmVwcmVzZW50cyB0aGUgdGFyZ2V0IGVsZW1lbnQgdHlwZS5gKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuZXhlY1RyYW5zZm9ybUJsb2NrKHZhbHVlKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIENvbW1hbmRzLmR1cGxpY2F0ZUJsb2NrOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5leGVjRHVwbGljYXRlQmxvY2soKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIENvbW1hbmRzLmRlbGV0ZUJsb2NrOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5leGVjRGVsZXRlQmxvY2soKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIENvbW1hbmRzLnJlbW92ZUZvcm1hdDpcclxuICAgICAgICAgICAgICAgIHRoaXMuZXhlY1JlbW92ZUZvcm1hdCgpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgQ29tbWFuZHMuY3JlYXRlRGVmYXVsdEJsb2NrOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5leGVjQ3JlYXRlRGVmYXVsdEJsb2NrKCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBDb21tYW5kcy5pbnNlcnROZXc6XHJcbiAgICAgICAgICAgICAgICB0aGlzLmV4ZWNJbnNlcnROZXcoKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIENvbW1hbmRzLmZvY3VzT25QcmV2aW91c0Jsb2NrOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5leGVjRm9jdXNPblByZXZpb3VzQmxvY2soKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIENvbW1hbmRzLmluc2VydFRhYmxlQ29sdW1uTGVmdDpcclxuICAgICAgICAgICAgICAgIHRoaXMudGFibGVPcGVyYXRpb25zU2VydmljZS5pbnNlcnRDb2x1bW5MZWZ0KCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBDb21tYW5kcy5pbnNlcnRUYWJsZUNvbHVtblJpZ2h0OlxyXG4gICAgICAgICAgICAgICAgdGhpcy50YWJsZU9wZXJhdGlvbnNTZXJ2aWNlLmluc2VydENvbHVtblJpZ2h0KGJsb2NrIHx8IG51bGwpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgQ29tbWFuZHMuaW5zZXJ0VGFibGVSb3dBYm92ZTpcclxuICAgICAgICAgICAgICAgIHRoaXMudGFibGVPcGVyYXRpb25zU2VydmljZS5pbnNlcnRSb3dBYm92ZSgpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgQ29tbWFuZHMuaW5zZXJ0VGFibGVSb3dCZWxvdzpcclxuICAgICAgICAgICAgICAgIHRoaXMudGFibGVPcGVyYXRpb25zU2VydmljZS5pbnNlcnRSb3dCZWxvdyhibG9jayB8fCBudWxsKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIENvbW1hbmRzLnRvZ2dsZUNlbGxIaWxpdGVDb2xvcjpcclxuICAgICAgICAgICAgICAgIGlmICghdmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7Q29tbWFuZHMudG9nZ2xlQ2VsbEhpbGl0ZUNvbG9yfSByZXF1aXJlcyBhIHZhbHVlIHRoYXQgcmVwcmVzZW50cyB0aGUgY2VsbCBiYWNrZ3JvdW5kIGNvbG9yLmApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy50YWJsZU9wZXJhdGlvbnNTZXJ2aWNlLmV4ZWNDZWxsQmFja2dyb3VuZENvbG9yKHZhbHVlKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIENvbW1hbmRzLnJlbW92ZUNvbHVtbjpcclxuICAgICAgICAgICAgICAgIHRoaXMudGFibGVPcGVyYXRpb25zU2VydmljZS5yZW1vdmVDb2x1bW4oKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIENvbW1hbmRzLnJlbW92ZVJvdzpcclxuICAgICAgICAgICAgICAgIHRoaXMudGFibGVPcGVyYXRpb25zU2VydmljZS5yZW1vdmVSb3coKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIENvbW1hbmRzLnJlbW92ZVJvdzpcclxuICAgICAgICAgICAgICAgIHRoaXMudGFibGVPcGVyYXRpb25zU2VydmljZS5yZW1vdmVSb3coKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIENvbW1hbmRzLmNoYW5nZVRhYmxlQm9yZGVyQ29sb3I6XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRhYmxlT3BlcmF0aW9uc1NlcnZpY2UuY2hhbmdlVGFibGVCb3JkZXJDb2xvcihzY29wZSBhcyBUYWJsZVNjb3BlcywgdmFsdWUgYXMgQ29sb3JzKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAvLyBjYXNlIENvbW1hbmRzLnNob3dJbnNlcnRUYWJsZUNvbHVtbkVsZW1lbnQ6XHJcbiAgICAgICAgICAgIC8vICAgICBpZiAoIWJsb2NrKSB7XHJcbiAgICAgICAgICAgIC8vICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke0NvbW1hbmRzLmluc2VydFRhYmxlQ29sdW1ufSByZXF1aXJlcyBhIGJsb2NrIHdpdGggYSB0YXJnZXQgdGFibGUgaW5zaWRlLmApO1xyXG4gICAgICAgICAgICAvLyAgICAgfVxyXG4gICAgICAgICAgICAvLyAgICAgdGhpcy50YWJsZU9wZXJhdGlvbnNTZXJ2aWNlLnNob3dJbnNlcnRDb2x1bW5FbGVtZW50KGJsb2NrKTtcclxuICAgICAgICAgICAgLy8gICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAvLyBjYXNlIENvbW1hbmRzLnNob3dJbnNlcnRUYWJsZVJvd0VsZW1lbnQ6XHJcbiAgICAgICAgICAgIC8vICAgICBpZiAoIWJsb2NrKSB7XHJcbiAgICAgICAgICAgIC8vICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke0NvbW1hbmRzLmluc2VydFRhYmxlQ29sdW1ufSByZXF1aXJlcyBhIGJsb2NrIHdpdGggYSB0YXJnZXQgdGFibGUgaW5zaWRlLmApO1xyXG4gICAgICAgICAgICAvLyAgICAgfVxyXG4gICAgICAgICAgICAvLyAgICAgdGhpcy50YWJsZU9wZXJhdGlvbnNTZXJ2aWNlLnNob3dJbnNlcnRMaW5lRWxlbWVudChibG9jayk7XHJcbiAgICAgICAgICAgIC8vICAgICBicmVhaztcclxuICAgICAgICAgICAgLy8gY2FzZSBDb21tYW5kcy5oaWRlSW5zZXJ0VGFibGVDb2x1bW5FbGVtZW50OlxyXG4gICAgICAgICAgICAvLyAgICAgaWYgKCFibG9jaykge1xyXG4gICAgICAgICAgICAvLyAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtDb21tYW5kcy5pbnNlcnRUYWJsZUNvbHVtbn0gcmVxdWlyZXMgYSBibG9jayB3aXRoIGEgdGFyZ2V0IHRhYmxlIGluc2lkZS5gKTtcclxuICAgICAgICAgICAgLy8gICAgIH1cclxuICAgICAgICAgICAgLy8gICAgIHRoaXMudGFibGVPcGVyYXRpb25zU2VydmljZS5oaWRlSW5zZXJ0Q29sdW1uRWxlbWVudChibG9jayk7XHJcbiAgICAgICAgICAgIC8vICAgICBicmVhaztcclxuICAgICAgICAgICAgLy8gY2FzZSBDb21tYW5kcy5oaWRlSW5zZXJ0VGFibGVSb3dFbGVtZW50OlxyXG4gICAgICAgICAgICAvLyAgICAgaWYgKCFibG9jaykge1xyXG4gICAgICAgICAgICAvLyAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtDb21tYW5kcy5pbnNlcnRUYWJsZUNvbHVtbn0gcmVxdWlyZXMgYSBibG9jayB3aXRoIGEgdGFyZ2V0IHRhYmxlIGluc2lkZS5gKTtcclxuICAgICAgICAgICAgLy8gICAgIH1cclxuICAgICAgICAgICAgLy8gICAgIHRoaXMudGFibGVPcGVyYXRpb25zU2VydmljZS5oaWRlSW5zZXJ0Um93RWxlbWVudChibG9jayk7XHJcbiAgICAgICAgICAgIC8vICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYE5vIGFjdGlvbiBkZWZpbmVkIGZvciBjb21tYW5kOiAke2NvbW1hbmR9YCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZXhlY1RyYW5zZm9ybUJsb2NrKHRhcmdldEJsb2NrVHlwZTogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICAgICAgdGhpcy5ibG9ja09wZXJhdGlvbnNTZXJ2aWNlLnRyYW5zZm9ybUJsb2NrKHRhcmdldEJsb2NrVHlwZSk7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBleGVjRHVwbGljYXRlQmxvY2soKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYmxvY2tPcGVyYXRpb25zU2VydmljZS5leGVjQ29tbWFuZChCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLkJMT0NLX09QRVJBVElPTlMuRFVQTElDQVRFLCBmYWxzZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBleGVjRGVsZXRlQmxvY2soKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYmxvY2tPcGVyYXRpb25zU2VydmljZS5leGVjQ29tbWFuZChCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLkJMT0NLX09QRVJBVElPTlMuREVMRVRFLCBmYWxzZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBleGVjUmVtb3ZlRm9ybWF0KCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuZXhlY0NvbW1hbmQoQmxvY2tPcGVyYXRpb25zU2VydmljZS5CTE9DS19PUEVSQVRJT05TLlJFTU9WRV9GT1JNQVQsIGZhbHNlKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGV4ZWNDcmVhdGVEZWZhdWx0QmxvY2soKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYmxvY2tPcGVyYXRpb25zU2VydmljZS5leGVjQ29tbWFuZChCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLkJMT0NLX09QRVJBVElPTlMuQ1JFQVRFX0RFRkFVTFRfQkxPQ0ssIGZhbHNlKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGV4ZWNJbnNlcnROZXcoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYmxvY2tPcGVyYXRpb25zU2VydmljZS5jcmVhdGVOZXdFbGVtZW50QW5kU3BsaXRDb250ZW50KCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBleGVjRm9jdXNPblByZXZpb3VzQmxvY2soKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYmxvY2tPcGVyYXRpb25zU2VydmljZS5leGVjQ29tbWFuZChCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLkJMT0NLX09QRVJBVElPTlMuREVMRVRFX0ZPQ1VTX09OX1BSRVZJT1VTLCBmYWxzZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBoYW5kbGVGb2N1c09uRmlyc3RSZXF1ZXN0ZWRFdmVudCA9ICgpOiB2b2lkID0+IHtcclxuICAgICAgICAvLyBhbGVydChcImZvY3VzIG9uIGZpcnN0XCIpO1xyXG4gICAgICAgIHRoaXMuYmxvY2tPcGVyYXRpb25zU2VydmljZS5leGVjQ29tbWFuZChCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLkJMT0NLX09QRVJBVElPTlMuRk9DVVNfT05fRklSU1QsIGZhbHNlKTtcclxuICAgIH1cclxufVxyXG4iLCJpbXBvcnQgeyBDb21tYW5kcyB9IGZyb20gXCJAL2NvbW1hbmRzL0NvbW1hbmRzXCI7XHJcbmltcG9ydCB7IElDb21tYW5kRXZlbnREZXRhaWwgfSBmcm9tIFwiQC9jb21tYW5kcy9JQ29tbWFuZEV2ZW50RGV0YWlsXCI7XHJcbmltcG9ydCB7IEN1c3RvbUV2ZW50cyB9IGZyb20gXCJAL2NvbW1vbi9DdXN0b21FdmVudHNcIjtcclxuaW1wb3J0IHsgRWxlbWVudEZhY3RvcnlTZXJ2aWNlIH0gZnJvbSBcIkAvc2VydmljZXMvZWxlbWVudC1mYWN0b3J5L0VsZW1lbnRGYWN0b3J5U2VydmljZVwiO1xyXG5pbXBvcnQgeyBJU2hvcnRjdXRMaXN0ZW5lcnMgfSBmcm9tIFwiLi9JU2hvcnRjdXRMaXN0ZW5lcnNcIjtcclxuXHJcbi8qKlxyXG4gKiBNYW5hZ2VzIGtleWJvYXJkIHNob3J0Y3V0IGxpc3RlbmluZyBmb3IgYSB3ZWIgYXBwbGljYXRpb24uIFRoaXMgY2xhc3MgaXMgaW1wbGVtZW50ZWQgYXMgYSBzaW5nbGV0b24gdG8gZW5zdXJlXHJcbiAqIHRoYXQga2V5Ym9hcmQgZXZlbnQgaGFuZGxpbmcgaXMgY2VudHJhbGl6ZWQgYW5kIHRoYXQgbXVsdGlwbGUgaW5zdGFuY2VzIGRvIG5vdCBkdXBsaWNhdGUgZXZlbnQgbGlzdGVuZXJzLlxyXG4gKiBJdCBpbnRlcmNlcHRzIGtleWRvd24gZXZlbnRzIGFuZCBkaXNwYXRjaGVzIGNvbW1hbmRzIGJhc2VkIG9uIHNwZWNpZmljIGtleSBjb21iaW5hdGlvbnMsIGVuaGFuY2luZyB0ZXh0IGVkaXRpbmdcclxuICogY2FwYWJpbGl0aWVzIHdpdGhpbiB0aGUgYXBwbGljYXRpb24uXHJcbiAqIFxyXG4gKiBUaGUgY2xhc3MgaW5pdGlhbGl6ZXMgaXRzZWxmIHRoZSBmaXJzdCB0aW1lIGBnZXRJbnN0YW5jZWAgaXMgY2FsbGVkIGFuZCBzdWJzZXF1ZW50bHkgbWFuYWdlcyBhbGwga2V5Ym9hcmQgc2hvcnRjdXRzXHJcbiAqIHRocm91Z2ggYSBzaW5nbGUgaW5zdGFuY2UuXHJcbiAqIFxyXG4gKiBVc2FnZSBvZiB0aGlzIGNsYXNzIG91dHNpZGUgb2YgaXRzIHNpbmdsZXRvbiBwYXR0ZXJuIGlzIHJlc3RyaWN0ZWQgdG8gcHJldmVudCBtdWx0aXBsZSBpbnN0YW5jZXMsIHdoaWNoIGlzIGVuZm9yY2VkXHJcbiAqIGJ5IHRocm93aW5nIGFuIGVycm9yIGlmIHRoZSBjb25zdHJ1Y3RvciBpcyBjYWxsZWQgZGlyZWN0bHkgYWZ0ZXIgaW5pdGlhbGl6YXRpb24uXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgU2hvcnRjdXRMaXN0ZW5lcnMgaW1wbGVtZW50cyBJU2hvcnRjdXRMaXN0ZW5lcnMge1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSG9sZHMgdGhlIHNpbmdsZSBpbnN0YW5jZSBvZiBTaG9ydGN1dExpc3RlbmVycywgZW5zdXJpbmcgdGhlIHNpbmdsZXRvbiBwYXR0ZXJuLlxyXG4gICAgICogQHR5cGUge1Nob3J0Y3V0TGlzdGVuZXJzIHwgbnVsbH1cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgc3RhdGljIGluc3RhbmNlOiBTaG9ydGN1dExpc3RlbmVycyB8IG51bGwgPSBudWxsO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHJpdmF0ZSBjb25zdHJ1Y3RvciB0byBwcmV2ZW50IGluc3RhbnRpYXRpb24gb3V0c2lkZSBvZiB0aGUgc2luZ2xldG9uIGNvbnRleHQuIEluaXRpYWxpemVzIHRoZVxyXG4gICAgICogc2hvcnRjdXQgbGlzdGVuZXIgc2V0dXAgYnkgY2FsbGluZyB0aGUgYGxpc3RlbmAgbWV0aG9kLCBlbnN1cmluZyBpdCBpcyBjYWxsZWQgb25seSBvbmNlLlxyXG4gICAgICogQHRocm93cyB7RXJyb3J9IElmIGFuIGF0dGVtcHQgaXMgbWFkZSB0byBkaXJlY3RseSBpbnN0YW50aWF0ZSB0aGlzIGNsYXNzLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIGlmIChTaG9ydGN1dExpc3RlbmVycy5pbnN0YW5jZSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVc2UgU2hvcnRjdXRMaXN0ZW5lcnMuZ2V0SW5zdGFuY2UoKSB0byBnZXQgaW5zdGFuY2UuXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5saXN0ZW4oKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGFydExpc3RlbigpOiB2b2lkIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcImxpc3RlbmluZyBrZXlib2FyZCBzaG9ydGN1dHNcIik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcm92aWRlcyBhY2Nlc3MgdG8gdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgU2hvcnRjdXRMaXN0ZW5lcnMgY2xhc3MuIElmIHRoZSBpbnN0YW5jZSBkb2VzIG5vdFxyXG4gICAgICogZXhpc3QsIGl0IGNyZWF0ZXMgYW5kIHJldHVybnMgaXQsIGVuc3VyaW5nIHRoZXJlIGlzIG9ubHkgb25lIGluc3RhbmNlIHRocm91Z2hvdXQgdGhlIGFwcGxpY2F0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIHtTaG9ydGN1dExpc3RlbmVyc30gVGhlIHNpbmdsZSBzaGFyZWQgaW5zdGFuY2Ugb2YgdGhlIFNob3J0Y3V0TGlzdGVuZXJzIGNsYXNzLlxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgZ2V0SW5zdGFuY2UoKTogU2hvcnRjdXRMaXN0ZW5lcnMge1xyXG4gICAgICAgIGlmIChTaG9ydGN1dExpc3RlbmVycy5pbnN0YW5jZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gU2hvcnRjdXRMaXN0ZW5lcnMuaW5zdGFuY2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbmV3IFNob3J0Y3V0TGlzdGVuZXJzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAqIEF0dGFjaGVzIGEgZ2xvYmFsIGV2ZW50IGxpc3RlbmVyIHRvIHRoZSBkb2N1bWVudCB0byBpbnRlcmNlcHQga2V5ZG93biBldmVudHMgYW5kIHBlcmZvcm0gc3BlY2lmaWMgdGV4dCB0cmFuc2Zvcm1hdGlvblxyXG4gICAgKiBjb21tYW5kcyBiYXNlZCBvbiB0aGUgY29tYmluYXRpb24gb2Yga2V5cyBwcmVzc2VkLiBUaGlzIGZ1bmN0aW9uIGlzIGRlc2lnbmVkIHRvIGVuaGFuY2UgdGV4dCBlZGl0aW5nIGNhcGFiaWxpdGllc1xyXG4gICAgKiB3aXRoaW4gYSB3ZWIgYXBwbGljYXRpb24gYnkgcHJvdmlkaW5nIGtleWJvYXJkIHNob3J0Y3V0cyBmb3IgdmFyaW91cyB0ZXh0IGZvcm1hdHRpbmcgYW5kIGVkaXRpbmcgYWN0aW9ucy5cclxuICAgICpcclxuICAgICogVGhlIGZ1bmN0aW9uIHVzZXMgYSBjb21iaW5hdGlvbiBvZiBDdHJsLCBBbHQgKG9yIEFsdEdyYXBoKSwgU2hpZnQsIGFuZCBzcGVjaWZpYyBrZXlzIHRvIGRldGVybWluZSB0aGUgYWN0aW9uIHRvIGJlXHJcbiAgICAqIHRha2VuLiBJdCBoYW5kbGVzIHRyYW5zZm9ybWF0aW9uIGludG8gZGlmZmVyZW50IGJsb2NrIHR5cGVzIGxpa2UgcGFyYWdyYXBocywgY2hlY2tsaXN0cywgbnVtYmVyZWQgbGlzdHMsIGhlYWRlcnMsIGV0Yy4sXHJcbiAgICAqIGFzIHdlbGwgYXMgYmxvY2sgZHVwbGljYXRpb24gYW5kIGRlbGV0aW9uLlxyXG4gICAgKlxyXG4gICAgKiBQcmV2ZW50RGVmYXVsdCBhbmQgc3RvcFByb3BhZ2F0aW9uIGFyZSBjYWxsZWQgdG8gcHJldmVudCB0aGUgZGVmYXVsdCBrZXkgYWN0aW9ucyBhbmQgYnViYmxpbmcgb2YgZXZlbnRzLCBlbnN1cmluZyB0aGF0XHJcbiAgICAqIG9ubHkgdGhlIGludGVuZGVkIGFjdGlvbnMgYXJlIGV4ZWN1dGVkLlxyXG4gICAgKlxyXG4gICAgKiBTdXBwb3J0ZWQgU2hvcnRjdXRzOlxyXG4gICAgKiAtIEN0cmwrU2hpZnQrRW50ZXI6IFRyYW5zZm9ybXMgdGhlIGN1cnJlbnQgYmxvY2sgaW50byBhIHBhcmFncmFwaC5cclxuICAgICogLSBDdHJsK1NoaWZ0KzEgb3IgQ3RybCtTaGlmdCtOdW1wYWQxIChOdW1Mb2NrIG9uKTogVHJhbnNmb3JtcyB0aGUgY3VycmVudCBibG9jayBpbnRvIGEgY2hlY2tsaXN0LlxyXG4gICAgKiAtIEN0cmwrU2hpZnQrLiA6IFRyYW5zZm9ybXMgdGhlIGN1cnJlbnQgYmxvY2sgaW50byBhIGJ1bGxldGVkIGxpc3QuXHJcbiAgICAqIC0gQ3RybCtTaGlmdCsvIDogVHJhbnNmb3JtcyB0aGUgY3VycmVudCBibG9jayBpbnRvIGEgbnVtYmVyZWQgbGlzdC5cclxuICAgICogLSBDdHJsK0FsdCsxIHRocm91Z2ggQ3RybCtBbHQrNjogVHJhbnNmb3JtcyB0aGUgY3VycmVudCBibG9jayBpbnRvIGhlYWRlcnMgKEgxIHRocm91Z2ggSDYpLlxyXG4gICAgKiAtIEN0cmwrRDogRHVwbGljYXRlcyB0aGUgY3VycmVudCBibG9jay5cclxuICAgICogLSBTaGlmdCtEZWxldGUgb3IgU2hpZnQrQmFja3NwYWNlOiBEZWxldGVzIHRoZSBjdXJyZW50IGJsb2NrLlxyXG4gICAgKiAtIEN0cmwrXFwgOiBDbGVhcnMgZm9ybWF0dGluZyBvZiB0aGUgY3VycmVudCBibG9jay5cclxuICAgICogLSBDdHJsK0FsdCtEaWdpdDE6IFByZXZlbnRzIGNoYXJhY3RlciBpbnNlcnRpb24gd2hlbiB1c2luZyB0aGUgdG9wIHJvdyAnMScsIHNwZWNpZmljIHRvIGxheW91dCBjb25maWd1cmF0aW9ucy5cclxuICAgICpcclxuICAgICogRWFjaCBhY3Rpb24gZGlzcGF0Y2hlcyBhIGN1c3RvbSBldmVudCB3aXRoIGRldGFpbHMgYWJvdXQgdGhlIGNvbW1hbmQgdG8gYmUgZXhlY3V0ZWQsIHdoaWNoIHNob3VsZCBiZSBoYW5kbGVkIGJ5XHJcbiAgICAqIENvbW1hbmREaXNwYXRjaGVyLlxyXG4gICAgKlxyXG4gICAgKiBAZXhhbXBsZVxyXG4gICAgKiAvLyBJbml0aWFsaXplIGFuZCBhY3RpdmF0ZSB0aGUgc2hvcnRjdXRzIGFjcm9zcyB0aGUgZG9jdW1lbnQuXHJcbiAgICAqIGNvbnN0IHNob3J0Y3V0TGlzdGVuZXIgPSBTaG9ydGN1dExpc3RlbmVycy5nZXRJbnN0YW5jZSgpO1xyXG4gICAgKi9cclxuICAgIHByaXZhdGUgbGlzdGVuKCkge1xyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIChldmVudCkgPT4ge1xyXG5cclxuICAgICAgICAgICAgY29uc29sZS5sb2coYEtleTogJHtldmVudC5rZXl9LCBDb2RlOiAke2V2ZW50LmNvZGV9LCBDdHJsOiAke2V2ZW50LmN0cmxLZXl9LCBBbHQ6ICR7ZXZlbnQuYWx0S2V5fSwgQWx0R3I6ICR7ZXZlbnQua2V5ID09PSAnQWx0R3JhcGgnfSwgTnVtTG9jazogJHtldmVudC5nZXRNb2RpZmllclN0YXRlKCdOdW1Mb2NrJyl9YCk7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBpc051bVBhZCA9IGV2ZW50LmNvZGUuc3RhcnRzV2l0aChcIk51bXBhZFwiKTtcclxuICAgICAgICAgICAgY29uc3QgbnVtTG9ja09uID0gZXZlbnQuZ2V0TW9kaWZpZXJTdGF0ZShcIk51bUxvY2tcIik7XHJcblxyXG4gICAgICAgICAgICBpZiAoKGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQubWV0YUtleSkgJiYgZXZlbnQuc2hpZnRLZXkgJiYgKGV2ZW50LmtleSA9PT0gXCJFbnRlclwiKSkge1xyXG4gICAgICAgICAgICAgICAgLy8gQ29udmVydHMgdG8gcGFyYWdyYXBoIHdoZW4gcHJlc3NpbmcgQ3RybCtTaGlmdCtFbnRlclxyXG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgICAgICAgICAgICAgIGFsZXJ0KFwiY29udmVydG8gcGFyYSBwYXJhZ3JhZm9cIik7XHJcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudDxJQ29tbWFuZEV2ZW50RGV0YWlsPihDdXN0b21FdmVudHMuZW1pdHRlZENvbW1hbmQsIHtcclxuICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogQ29tbWFuZHMudHJhbnNmb3JtQmxvY2ssXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldEJsb2NrVHlwZTogRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuUEFSQUdSQVBIXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSkpO1xyXG5cclxuICAgICAgICAgICAgfSBlbHNlIGlmICgoZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5KSAmJiAhZXZlbnQuYWx0S2V5ICYmIChldmVudC5jb2RlID09PSBcIkRpZ2l0MVwiIHx8IGV2ZW50LmNvZGUgPT09IFwiTnVtcGFkMVwiKSkge1xyXG4gICAgICAgICAgICAgICAgLy8gQ29udmVydHMgdG8gY2hlY2tsaXN0IHdoZW4gcHJlc3NpbmcgIEN0cmwrU2hpZnQrMVxyXG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgICAgICAgICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50PElDb21tYW5kRXZlbnREZXRhaWw+KEN1c3RvbUV2ZW50cy5lbWl0dGVkQ29tbWFuZCwge1xyXG4gICAgICAgICAgICAgICAgICAgIGRldGFpbDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kOiBDb21tYW5kcy50cmFuc2Zvcm1CbG9jayxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0QmxvY2tUeXBlOiBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5DSEVDS19MSVNUXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSkpO1xyXG5cclxuICAgICAgICAgICAgfSBlbHNlIGlmICgoZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5KSAmJiAhZXZlbnQuc2hpZnRLZXkgJiYgZXZlbnQua2V5ID09PSBcIi5cIikge1xyXG4gICAgICAgICAgICAgICAgLy8gQ29udmVydHMgdG8gYnVsbGV0ZWQgbGlzdCB3aGVuIHByZXNzaW5nICBDdHJsK1NoaWZ0Ky5cclxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHJcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudDxJQ29tbWFuZEV2ZW50RGV0YWlsPihDdXN0b21FdmVudHMuZW1pdHRlZENvbW1hbmQsIHtcclxuICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogQ29tbWFuZHMudHJhbnNmb3JtQmxvY2ssXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldEJsb2NrVHlwZTogRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuQlVMTEVURURfTElTVFxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICgoZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5KSAmJiAhZXZlbnQuc2hpZnRLZXkgJiYgKGV2ZW50LmtleSA9PT0gXCIvXCIpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBDb252ZXJ0cyB0byBudW1iZXJlZCBsaXN0IHdoZW4gcHJlc3NpbmcgQ3RybCtTaGlmdCsvXHJcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQ8SUNvbW1hbmRFdmVudERldGFpbD4oQ3VzdG9tRXZlbnRzLmVtaXR0ZWRDb21tYW5kLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGV0YWlsOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ6IENvbW1hbmRzLnRyYW5zZm9ybUJsb2NrLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRCbG9ja1R5cGU6IEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLk5VTUJFUkVEX0xJU1RcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoKGV2ZW50LmN0cmxLZXkgJiYgZXZlbnQuYWx0S2V5ICYmICgoZXZlbnQuY29kZSA9PT0gXCJEaWdpdDFcIikgfHwgKGlzTnVtUGFkICYmIG51bUxvY2tPbiAmJiBldmVudC5jb2RlID09PSBcIk51bXBhZDFcIikpKSkge1xyXG4gICAgICAgICAgICAgICAgLy8gQ29udmVydHMgdG8gaDEgd2hlbiBwcmVzc2luZyBDdHJsK0FsdCsxXHJcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQ8SUNvbW1hbmRFdmVudERldGFpbD4oQ3VzdG9tRXZlbnRzLmVtaXR0ZWRDb21tYW5kLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGV0YWlsOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ6IENvbW1hbmRzLnRyYW5zZm9ybUJsb2NrLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRCbG9ja1R5cGU6IEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl8xXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKChldmVudC5jdHJsS2V5ICYmIGV2ZW50LmFsdEtleSAmJiAoKGV2ZW50LmNvZGUgPT09IFwiRGlnaXQyXCIpIHx8IChpc051bVBhZCAmJiBudW1Mb2NrT24gJiYgZXZlbnQuY29kZSA9PT0gXCJOdW1wYWQyXCIpKSkpIHtcclxuICAgICAgICAgICAgICAgIC8vIENvbnZlcnRzIHRvIGgyIHdoZW4gcHJlc3NpbmcgQ3RybCtBbHQrMlxyXG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgICAgICAgICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50PElDb21tYW5kRXZlbnREZXRhaWw+KEN1c3RvbUV2ZW50cy5lbWl0dGVkQ29tbWFuZCwge1xyXG4gICAgICAgICAgICAgICAgICAgIGRldGFpbDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kOiBDb21tYW5kcy50cmFuc2Zvcm1CbG9jayxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0QmxvY2tUeXBlOiBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfMlxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICgoZXZlbnQuY3RybEtleSAmJiBldmVudC5hbHRLZXkgJiYgKChldmVudC5jb2RlID09PSBcIkRpZ2l0M1wiKSB8fCAoaXNOdW1QYWQgJiYgbnVtTG9ja09uICYmIGV2ZW50LmNvZGUgPT09IFwiTnVtcGFkM1wiKSkpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBDb252ZXJ0cyB0byBoMyB3aGVuIHByZXNzaW5nIEN0cmwrQWx0KzNcclxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHJcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudDxJQ29tbWFuZEV2ZW50RGV0YWlsPihDdXN0b21FdmVudHMuZW1pdHRlZENvbW1hbmQsIHtcclxuICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogQ29tbWFuZHMudHJhbnNmb3JtQmxvY2ssXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldEJsb2NrVHlwZTogRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuSEVBREVSXzNcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoKGV2ZW50LmN0cmxLZXkgJiYgZXZlbnQuYWx0S2V5ICYmICgoZXZlbnQuY29kZSA9PT0gXCJEaWdpdDRcIikgfHwgKGlzTnVtUGFkICYmIG51bUxvY2tPbiAmJiBldmVudC5jb2RlID09PSBcIk51bXBhZDRcIikpKSkge1xyXG4gICAgICAgICAgICAgICAgLy8gQ29udmVydHMgdG8gaDQgd2hlbiBwcmVzc2luZyBDdHJsK0FsdCs0XHJcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQ8SUNvbW1hbmRFdmVudERldGFpbD4oQ3VzdG9tRXZlbnRzLmVtaXR0ZWRDb21tYW5kLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGV0YWlsOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ6IENvbW1hbmRzLnRyYW5zZm9ybUJsb2NrLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRCbG9ja1R5cGU6IEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl80XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKChldmVudC5jdHJsS2V5ICYmIGV2ZW50LmFsdEtleSAmJiAoKGV2ZW50LmNvZGUgPT09IFwiRGlnaXQ1XCIpIHx8IChpc051bVBhZCAmJiBudW1Mb2NrT24gJiYgZXZlbnQuY29kZSA9PT0gXCJOdW1wYWQ1XCIpKSkpIHtcclxuICAgICAgICAgICAgICAgIC8vIENvbnZlcnRzIHRvIGg1IHdoZW4gcHJlc3NpbmcgQ3RybCtBbHQrNVxyXG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgICAgICAgICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50PElDb21tYW5kRXZlbnREZXRhaWw+KEN1c3RvbUV2ZW50cy5lbWl0dGVkQ29tbWFuZCwge1xyXG4gICAgICAgICAgICAgICAgICAgIGRldGFpbDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kOiBDb21tYW5kcy50cmFuc2Zvcm1CbG9jayxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0QmxvY2tUeXBlOiBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfNVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICgoZXZlbnQuY3RybEtleSAmJiBldmVudC5hbHRLZXkgJiYgKChldmVudC5jb2RlID09PSBcIkRpZ2l0NlwiKSB8fCAoaXNOdW1QYWQgJiYgbnVtTG9ja09uICYmIGV2ZW50LmNvZGUgPT09IFwiTnVtcGFkNlwiKSkpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBDb252ZXJ0cyB0byBoNiB3aGVuIHByZXNzaW5nIEN0cmwrQWx0KzZcclxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHJcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudDxJQ29tbWFuZEV2ZW50RGV0YWlsPihDdXN0b21FdmVudHMuZW1pdHRlZENvbW1hbmQsIHtcclxuICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogQ29tbWFuZHMudHJhbnNmb3JtQmxvY2ssXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldEJsb2NrVHlwZTogRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuSEVBREVSXzZcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoKGV2ZW50LmtleSA9PT0gXCJEXCIgfHwgZXZlbnQua2V5ID09PSBcImRcIikgJiYgZXZlbnQuY3RybEtleSkge1xyXG4gICAgICAgICAgICAgICAgLy8gRHVwbGljYXRlIGJsb2NrIHdoZW4gcHJlc3NpbmcgQ3RybCtEXHJcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQ8SUNvbW1hbmRFdmVudERldGFpbD4oQ3VzdG9tRXZlbnRzLmVtaXR0ZWRDb21tYW5kLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGV0YWlsOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ6IENvbW1hbmRzLmR1cGxpY2F0ZUJsb2NrLFxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICgoZXZlbnQua2V5ID09PSBcIkRlbGV0ZVwiIHx8IGV2ZW50LmtleSA9PT0gXCJCYWNrc3BhY2VcIikgJiYgZXZlbnQuc2hpZnRLZXkpIHtcclxuICAgICAgICAgICAgICAgIC8vIERlbGV0ZSBibG9jayB3aGVuIHByZXNzaW5nIFNoaWZ0K0RlbGV0ZVxyXG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgICAgICAgICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50PElDb21tYW5kRXZlbnREZXRhaWw+KEN1c3RvbUV2ZW50cy5lbWl0dGVkQ29tbWFuZCwge1xyXG4gICAgICAgICAgICAgICAgICAgIGRldGFpbDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kOiBDb21tYW5kcy5kZWxldGVCbG9jayxcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSBcIlxcXFxcIiAmJiAoZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5KSkge1xyXG4gICAgICAgICAgICAgICAgLy8gQ2xlYXIgZm9ybWF0dGluZyB3aGVuIHByZXNzaW5nIEN0cmwrXFxcclxuICAgICAgICAgICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50PElDb21tYW5kRXZlbnREZXRhaWw+KEN1c3RvbUV2ZW50cy5lbWl0dGVkQ29tbWFuZCwge1xyXG4gICAgICAgICAgICAgICAgICAgIGRldGFpbDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kOiBDb21tYW5kcy5yZW1vdmVGb3JtYXQsXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmN0cmxLZXkgJiYgZXZlbnQuYWx0S2V5ICYmIGV2ZW50LmNvZGUgPT09IFwiRGlnaXQxXCIpIHtcclxuICAgICAgICAgICAgICAgIC8vIFByZXZlbnQgY2hhcmFjdGVyIGluc2VydGlvbiB3aGVuIHVzaW5nIHRvcCByb3cgJzEnXHJcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBJQ29tbWFuZEV2ZW50RGV0YWlsIH0gZnJvbSBcIkAvY29tbWFuZHMvSUNvbW1hbmRFdmVudERldGFpbFwiO1xyXG5pbXBvcnQgeyBJVGFibGVMaXN0ZW5lcnMgfSBmcm9tIFwiLi9JVGFibGVMaXN0ZW5lcnNcIjtcclxuaW1wb3J0IHsgQ3VzdG9tRXZlbnRzIH0gZnJvbSBcIkAvY29tbW9uL0N1c3RvbUV2ZW50c1wiO1xyXG5pbXBvcnQgeyBDb21tYW5kcyB9IGZyb20gXCJAL2NvbW1hbmRzL0NvbW1hbmRzXCI7XHJcbmltcG9ydCB7IERPTVV0aWxzIH0gZnJvbSBcIkAvdXRpbGl0aWVzL0RPTVV0aWxzXCI7XHJcbmltcG9ydCB7IFRhYmxlVXRpbHMgfSBmcm9tIFwiQC91dGlsaXRpZXMvVGFibGVVdGlsc1wiO1xyXG5pbXBvcnQgeyBGb2N1c1N0YWNrIH0gZnJvbSBcIi4uL0ZvY3VzU3RhY2tcIjtcclxuaW1wb3J0IHsgSUZvY3VzU3RhY2sgfSBmcm9tIFwiLi4vSUZvY3VzU3RhY2tcIjtcclxuaW1wb3J0IHsgRGVwZW5kZW5jeUNvbnRhaW5lciB9IGZyb20gXCIuLi9EZXBlbmRlbmN5Q29udGFpbmVyXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgVGFibGVMaXN0ZW5lcnMgaW1wbGVtZW50cyBJVGFibGVMaXN0ZW5lcnMge1xyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIGluc3RhbmNlOiBUYWJsZUxpc3RlbmVycyB8IG51bGwgPSBudWxsO1xyXG5cclxuICAgIGZvY3VzU3RhY2s6IElGb2N1c1N0YWNrO1xyXG5cclxuICAgIHNob3duRWxlbWVudHMgPSBuZXcgTWFwPEhUTUxUYWJsZUNlbGxFbGVtZW50LCBIVE1MRWxlbWVudD4oKTtcclxuXHJcbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIGZvY3VzU3RhY2s6IElGb2N1c1N0YWNrKSB7XHJcblxyXG4gICAgICAgIGlmIChUYWJsZUxpc3RlbmVycy5pbnN0YW5jZSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVc2UgVGFibGVFdmVudExpc3RlbmVycy5nZXRJbnN0YW5jZSgpIHRvIGdldCBpbnN0YW5jZS5cIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmZvY3VzU3RhY2sgPSBmb2N1c1N0YWNrO1xyXG5cclxuICAgICAgICB0aGlzLmxpc3RlbigpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXJ0TGlzdGVuKCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwibGlzdGVuaW5nIHRhYmxlIGNsaWNrc1wiKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZ2V0SW5zdGFuY2UoKTogVGFibGVMaXN0ZW5lcnMge1xyXG5cclxuICAgICAgICBjb25zdCBmb2N1c1N0YWNrID0gRGVwZW5kZW5jeUNvbnRhaW5lci5JbnN0YW5jZS5yZXNvbHZlPElGb2N1c1N0YWNrPihcIklGb2N1c1N0YWNrXCIpO1xyXG4gICAgICAgIGlmIChUYWJsZUxpc3RlbmVycy5pbnN0YW5jZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gVGFibGVMaXN0ZW5lcnMuaW5zdGFuY2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbmV3IFRhYmxlTGlzdGVuZXJzKGZvY3VzU3RhY2spO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgbGlzdGVuKCkge1xyXG5cclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKGV2ZW50KSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBwYXJlbnQ6IEVsZW1lbnQgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgICAgICAgICAgIGlmICgoZXZlbnQudGFyZ2V0IGFzIE5vZGUpLm5vZGVUeXBlID09IE5vZGUuVEVYVF9OT0RFKSB7XHJcbiAgICAgICAgICAgICAgICBwYXJlbnQgPSAoZXZlbnQudGFyZ2V0IGFzIE5vZGUpLnBhcmVudEVsZW1lbnQ7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBwYXJlbnQgPSAoZXZlbnQudGFyZ2V0IGFzIEVsZW1lbnQpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAocGFyZW50Py5jbG9zZXN0KFwiLmFkZC10YWJsZS1jb2x1bW5cIikpIHtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBjdXN0b21FdmVudCA9IG5ldyBDdXN0b21FdmVudDxJQ29tbWFuZEV2ZW50RGV0YWlsPihDdXN0b21FdmVudHMuZW1pdHRlZENvbW1hbmQsIHtcclxuICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogQ29tbWFuZHMuaW5zZXJ0VGFibGVDb2x1bW5SaWdodCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2s6IHBhcmVudC5jbG9zZXN0KFwiLmJsb2NrXCIpIGFzIEhUTUxFbGVtZW50XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChjdXN0b21FdmVudCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChwYXJlbnQ/LmNsb3Nlc3QoXCIuYWRkLXRhYmxlLXJvd1wiKSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQ8SUNvbW1hbmRFdmVudERldGFpbD4oQ3VzdG9tRXZlbnRzLmVtaXR0ZWRDb21tYW5kLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGV0YWlsOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ6IENvbW1hbmRzLmluc2VydFRhYmxlUm93QmVsb3csXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrOiBwYXJlbnQuY2xvc2VzdChcIi5ibG9ja1wiKSBhcyBIVE1MRWxlbWVudFxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoY3VzdG9tRXZlbnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG5cclxuXHJcbiAgICAgICAgLy8gZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlb3ZlclwiLCAoZXZlbnQpID0+IHtcclxuICAgICAgICAvLyAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG5cclxuICAgICAgICAvLyAgICAgLy8gRW5zdXJlIHRoZSB0YXJnZXQgaXMgYSB0YWJsZSBjZWxsICh0ZCkgYW5kIGEgY2hpbGQgb2YgYW4gZWxlbWVudCB3aXRoIGNsYXNzICdibG9jaydcclxuICAgICAgICAvLyAgICAgY29uc3QgY2VsbCA9IHRhcmdldC5jbG9zZXN0KFwidGRcIik7XHJcbiAgICAgICAgLy8gICAgIGlmICghY2VsbCB8fCAhY2VsbC5jbG9zZXN0KFwiLmJsb2NrXCIpKSByZXR1cm47IFxyXG5cclxuICAgICAgICAvLyAgICAgLy8gR2V0IHRoZSBhc3NvY2lhdGVkIHRhYmxlIChhc3N1bWluZyBhIHRhYmxlIGV4aXN0cylcclxuICAgICAgICAvLyAgICAgY29uc3QgdGFibGUgPSBjZWxsLmNsb3Nlc3QoXCJ0YWJsZVwiKSBhcyBIVE1MVGFibGVFbGVtZW50O1xyXG4gICAgICAgIC8vICAgICBpZiAoIXRhYmxlKSByZXR1cm47XHJcblxyXG4gICAgICAgIC8vICAgICAvLyBJZiBhbiBlbGVtZW50IGlzIGFscmVhZHkgc2hvd24gZm9yIHRoaXMgY2VsbCwgZG8gbm90aGluZ1xyXG4gICAgICAgIC8vICAgICBpZiAodGhpcy5zaG93bkVsZW1lbnRzLmhhcyhjZWxsKSkgcmV0dXJuOyAvLyBQcmV2ZW50IGZsaWNrZXJpbmdcclxuXHJcbiAgICAgICAgLy8gICAgIC8vIENoZWNrIGlmIGluIHRoZSBsYXN0IGNvbHVtbiBhbmQgZW1pdCBldmVudFxyXG4gICAgICAgIC8vICAgICBpZiAoVGFibGVVdGlscy5pc0xhc3RDb2x1bW4odGFibGUsIGNlbGwpKSB7XHJcbiAgICAgICAgLy8gICAgICAgICBjb25zdCBibG9jayA9IGNlbGwuY2xvc2VzdChcIi5ibG9ja1wiKSBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICAvLyAgICAgICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50PElDb21tYW5kRXZlbnREZXRhaWw+KEN1c3RvbUV2ZW50cy5lbWl0dGVkQ29tbWFuZCwge1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIGRldGFpbDogeyBjb21tYW5kOiBDb21tYW5kcy5zaG93SW5zZXJ0VGFibGVDb2x1bW5FbGVtZW50LCBibG9jayB9LFxyXG4gICAgICAgIC8vICAgICAgICAgfSk7XHJcbiAgICAgICAgLy8gICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KGN1c3RvbUV2ZW50KTtcclxuICAgICAgICAvLyAgICAgICAgIHRoaXMuc2hvd25FbGVtZW50cy5zZXQoY2VsbCwgYmxvY2spOyAvLyBUcmFjayB0aGUgc2hvd24gZWxlbWVudFxyXG4gICAgICAgIC8vICAgICB9XHJcblxyXG4gICAgICAgIC8vICAgICAvLyBDaGVjayBpZiBpbiB0aGUgbGFzdCByb3cgYW5kIGVtaXQgZXZlbnRcclxuICAgICAgICAvLyAgICAgaWYgKFRhYmxlVXRpbHMuaXNMYXN0Um93KHRhYmxlLCBjZWxsKSkge1xyXG4gICAgICAgIC8vICAgICAgICAgY29uc3QgYmxvY2sgPSBjZWxsLmNsb3Nlc3QoXCIuYmxvY2tcIikgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgLy8gICAgICAgICBjb25zdCBjdXN0b21FdmVudCA9IG5ldyBDdXN0b21FdmVudDxJQ29tbWFuZEV2ZW50RGV0YWlsPihDdXN0b21FdmVudHMuZW1pdHRlZENvbW1hbmQsIHtcclxuICAgICAgICAvLyAgICAgICAgICAgICBkZXRhaWw6IHsgY29tbWFuZDogQ29tbWFuZHMuc2hvd0luc2VydFRhYmxlUm93RWxlbWVudCwgYmxvY2sgfSxcclxuICAgICAgICAvLyAgICAgICAgIH0pO1xyXG4gICAgICAgIC8vICAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChjdXN0b21FdmVudCk7XHJcbiAgICAgICAgLy8gICAgICAgICB0aGlzLnNob3duRWxlbWVudHMuc2V0KGNlbGwsIGJsb2NrKTsgLy8gVHJhY2sgdGhlIHNob3duIGVsZW1lbnRcclxuICAgICAgICAvLyAgICAgfVxyXG4gICAgICAgIC8vIH0pO1xyXG5cclxuICAgICAgICAvLyBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2VvdXRcIiwgKGV2ZW50KSA9PiB7XHJcbiAgICAgICAgLy8gICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICAvLyAgICAgY29uc3QgcmVsYXRlZFRhcmdldCA9IGV2ZW50LnJlbGF0ZWRUYXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcblxyXG4gICAgICAgIC8vICAgICAvLyBFbnN1cmUgdGhlIHRhcmdldCBpcyBhIHRhYmxlIGNlbGwgKHRkKSBhbmQgYSBjaGlsZCBvZiBhbiBlbGVtZW50IHdpdGggY2xhc3MgJ2Jsb2NrJ1xyXG4gICAgICAgIC8vICAgICBjb25zdCBjZWxsID0gdGFyZ2V0LmNsb3Nlc3QoXCJ0ZFwiKTtcclxuICAgICAgICAvLyAgICAgaWYgKCFjZWxsIHx8ICFjZWxsLmNsb3Nlc3QoXCIuYmxvY2tcIikpIHJldHVybjtcclxuXHJcbiAgICAgICAgLy8gICAgIC8vIEdldCB0aGUgYXNzb2NpYXRlZCB0YWJsZSAoYXNzdW1pbmcgYSB0YWJsZSBleGlzdHMpXHJcbiAgICAgICAgLy8gICAgIGNvbnN0IHRhYmxlID0gY2VsbC5jbG9zZXN0KFwidGFibGVcIikgYXMgSFRNTFRhYmxlRWxlbWVudDtcclxuICAgICAgICAvLyAgICAgaWYgKCF0YWJsZSkgcmV0dXJuO1xyXG5cclxuICAgICAgICAvLyAgICAgLy8gQ2hlY2sgaWYgdGhlIG1vdXNlIGlzIGxlYXZpbmcgdGhlIGxhc3QgY29sdW1uIGNlbGwgYW5kIG5vdCBlbnRlcmluZyB0aGUgYWRkIGNvbHVtbiBidXR0b25cclxuICAgICAgICAvLyAgICAgaWYgKFRhYmxlVXRpbHMuaXNMYXN0Q29sdW1uKHRhYmxlLCBjZWxsKSAmJiAhcmVsYXRlZFRhcmdldD8uY2xhc3NMaXN0LmNvbnRhaW5zKFwiYWRkLXRhYmxlLWNvbHVtblwiKSkge1xyXG4gICAgICAgIC8vICAgICAgICAgY29uc3Qgc2hvd25FbGVtZW50ID0gdGhpcy5zaG93bkVsZW1lbnRzLmdldChjZWxsKTtcclxuICAgICAgICAvLyAgICAgICAgIGlmIChzaG93bkVsZW1lbnQpIHtcclxuICAgICAgICAvLyAgICAgICAgICAgICBjb25zdCBjdXN0b21FdmVudCA9IG5ldyBDdXN0b21FdmVudDxJQ29tbWFuZEV2ZW50RGV0YWlsPihDdXN0b21FdmVudHMuZW1pdHRlZENvbW1hbmQsIHtcclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgZGV0YWlsOiB7IGNvbW1hbmQ6IENvbW1hbmRzLmhpZGVJbnNlcnRUYWJsZUNvbHVtbkVsZW1lbnQsIGJsb2NrOiBzaG93bkVsZW1lbnQgfSxcclxuICAgICAgICAvLyAgICAgICAgICAgICB9KTtcclxuICAgICAgICAvLyAgICAgICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KGN1c3RvbUV2ZW50KTtcclxuICAgICAgICAvLyAgICAgICAgICAgICB0aGlzLnNob3duRWxlbWVudHMuZGVsZXRlKGNlbGwpO1xyXG4gICAgICAgIC8vICAgICAgICAgfVxyXG4gICAgICAgIC8vICAgICB9XHJcblxyXG4gICAgICAgIC8vICAgICAvLyBDaGVjayBpZiB0aGUgbW91c2UgaXMgbGVhdmluZyB0aGUgbGFzdCByb3cgY2VsbCBhbmQgbm90IGVudGVyaW5nIHRoZSBhZGQgcm93IGJ1dHRvblxyXG4gICAgICAgIC8vICAgICBpZiAoVGFibGVVdGlscy5pc0xhc3RSb3codGFibGUsIGNlbGwpICYmICFyZWxhdGVkVGFyZ2V0Py5jbGFzc0xpc3QuY29udGFpbnMoXCJhZGQtdGFibGUtcm93XCIpKSB7XHJcbiAgICAgICAgLy8gICAgICAgICBjb25zdCBzaG93bkVsZW1lbnQgPSB0aGlzLnNob3duRWxlbWVudHMuZ2V0KGNlbGwpO1xyXG4gICAgICAgIC8vICAgICAgICAgaWYgKHNob3duRWxlbWVudCkge1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50PElDb21tYW5kRXZlbnREZXRhaWw+KEN1c3RvbUV2ZW50cy5lbWl0dGVkQ29tbWFuZCwge1xyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICBkZXRhaWw6IHsgY29tbWFuZDogQ29tbWFuZHMuaGlkZUluc2VydFRhYmxlUm93RWxlbWVudCwgYmxvY2s6IHNob3duRWxlbWVudCB9LFxyXG4gICAgICAgIC8vICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoY3VzdG9tRXZlbnQpO1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIHRoaXMuc2hvd25FbGVtZW50cy5kZWxldGUoY2VsbCk7XHJcbiAgICAgICAgLy8gICAgICAgICB9XHJcbiAgICAgICAgLy8gICAgIH1cclxuICAgICAgICAvLyB9KTtcclxuICAgIH1cclxufSIsImltcG9ydCB7IElGb2N1c1N0YWNrIH0gZnJvbSBcIi4vSUZvY3VzU3RhY2tcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBGb2N1c1N0YWNrIGltcGxlbWVudHMgSUZvY3VzU3RhY2sge1xyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIGluc3RhbmNlOiBGb2N1c1N0YWNrO1xyXG4gICAgcHJpdmF0ZSBzdGFjazogSFRNTEVsZW1lbnRbXTtcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgY2FwYWNpdHk6IG51bWJlciA9IDEwO1xyXG5cclxuICAgIHByaXZhdGUgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy5zdGFjayA9IFtdO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0SW5zdGFuY2UoKTogRm9jdXNTdGFjayB7XHJcbiAgICAgICAgaWYgKCFGb2N1c1N0YWNrLmluc3RhbmNlKSB7XHJcbiAgICAgICAgICAgIEZvY3VzU3RhY2suaW5zdGFuY2UgPSBuZXcgRm9jdXNTdGFjaygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gRm9jdXNTdGFjay5pbnN0YW5jZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcHVzaChlbGVtZW50OiBIVE1MRWxlbWVudCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLnN0YWNrLmxlbmd0aCA+PSB0aGlzLmNhcGFjaXR5KSB7XHJcbiAgICAgICAgICAgIHRoaXMuc3RhY2suc2hpZnQoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5zdGFjay5wdXNoKGVsZW1lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBwZWVrKCk6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnN0YWNrID0gW107XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBUYWJsZVV0aWxzIH0gZnJvbSBcIkAvdXRpbGl0aWVzL1RhYmxlVXRpbHNcIjtcclxuaW1wb3J0IHsgSVRhYmxlT3BlcmF0aW9uc1NlcnZpY2UgfSBmcm9tIFwiLi9JVGFibGVPcGVyYXRpb25zU2VydmljZVwiO1xyXG5pbXBvcnQgeyBJRm9jdXNTdGFjayB9IGZyb20gXCJAL2NvcmUvSUZvY3VzU3RhY2tcIjtcclxuaW1wb3J0IHsgRGVwZW5kZW5jeUNvbnRhaW5lciB9IGZyb20gXCJAL2NvcmUvRGVwZW5kZW5jeUNvbnRhaW5lclwiO1xyXG5pbXBvcnQgeyBJTWVtZW50byB9IGZyb20gXCJAL2NvcmUvSU1lbWVudG9cIjtcclxuaW1wb3J0IHsgQ29sb3JzIH0gZnJvbSBcIkAvY29tbW9uL0NvbG9yc1wiO1xyXG5pbXBvcnQgeyBUYWJsZVNjb3BlcyB9IGZyb20gXCIuL1RhYmxlU2NvcGVzXCI7XHJcbmltcG9ydCB7IERPTUVsZW1lbnRzIH0gZnJvbSBcIkAvY29tbW9uL0RPTUVsZW1lbnRzXCI7XHJcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gXCJAL2NvbW1hbmRzL0V2ZW50RW1pdHRlclwiO1xyXG5pbXBvcnQgeyBET01VdGlscyB9IGZyb20gXCJAL3V0aWxpdGllcy9ET01VdGlsc1wiO1xyXG5pbXBvcnQgeyBVdGlscyB9IGZyb20gXCJAL3V0aWxpdGllcy9VdGlsc1wiO1xyXG5pbXBvcnQgeyBUYWJsZUNvbnRleHRGbG9hdGluZ1Rvb2xiYXIgfSBmcm9tIFwiQC9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvVGFibGVDb250ZXh0RmxvYXRpbmdUb29sYmFyXCI7XHJcbmltcG9ydCB7IFRvb2xiYXJJRHMgfSBmcm9tIFwiQC9jb3JlL1Rvb2xiYXJJRHNcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBUYWJsZU9wZXJhdGlvbnNTZXJ2aWNlIGltcGxlbWVudHMgSVRhYmxlT3BlcmF0aW9uc1NlcnZpY2Uge1xyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIGluc3RhbmNlOiBUYWJsZU9wZXJhdGlvbnNTZXJ2aWNlO1xyXG5cclxuICAgIHByaXZhdGUgZm9jdXNTdGFjazogSUZvY3VzU3RhY2s7XHJcbiAgICBwcml2YXRlIG1lbWVudG86IElNZW1lbnRvO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIGZvY3VzU3RhY2s6IElGb2N1c1N0YWNrLFxyXG4gICAgICAgIG1lbWVudG86IElNZW1lbnRvKSB7XHJcbiAgICAgICAgaWYgKFRhYmxlT3BlcmF0aW9uc1NlcnZpY2UuaW5zdGFuY2UpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVXNlIFRhYmxlT3BlcmF0aW9uc1NlcnZpY2UuZ2V0SW5zdGFuY2UoKSB0byBnZXQgaW5zdGFuY2UuXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5mb2N1c1N0YWNrID0gZm9jdXNTdGFjaztcclxuICAgICAgICB0aGlzLm1lbWVudG8gPSBtZW1lbnRvO1xyXG4gICAgfVxyXG5cclxuICAgIGlzQWN0aXZlQ2VsbEJhY2tncm91bmRDb2xvcih2YWx1ZTogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC5cIik7XHJcbiAgICB9XHJcblxyXG4gICAgcmVtb3ZlQ29sdW1uKCk6IHZvaWQge1xyXG5cclxuICAgICAgICB0aGlzLm1lbWVudG8uc2F2ZVN0YXRlKCk7XHJcblxyXG4gICAgICAgIGNvbnN0IGNlbGwgPSB0aGlzLmZvY3VzU3RhY2sucGVlaygpO1xyXG5cclxuICAgICAgICBpZiAoY2VsbCkge1xyXG4gICAgICAgICAgICBUYWJsZVV0aWxzLnJlbW92ZUNvbHVtbkJ5Q2VsbChjZWxsIGFzIEhUTUxUYWJsZUNlbGxFbGVtZW50KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIEV2ZW50RW1pdHRlci5lbWl0Q2xvc2VFbGVtZW50RXZlbnQoVG9vbGJhcklEcy5UYWJsZVRvb2xiYXIpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbW92ZVJvdygpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLm1lbWVudG8uc2F2ZVN0YXRlKCk7XHJcblxyXG4gICAgICAgIGNvbnN0IGNlbGwgPSB0aGlzLmZvY3VzU3RhY2sucGVlaygpO1xyXG5cclxuICAgICAgICBpZiAoY2VsbCkge1xyXG4gICAgICAgICAgICBUYWJsZVV0aWxzLnJlbW92ZVJvd0J5Q2VsbChjZWxsIGFzIEhUTUxUYWJsZUNlbGxFbGVtZW50KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIEV2ZW50RW1pdHRlci5lbWl0Q2xvc2VFbGVtZW50RXZlbnQoVG9vbGJhcklEcy5UYWJsZVRvb2xiYXIpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBleGVjQ2VsbEJhY2tncm91bmRDb2xvcih2YWx1ZTogc3RyaW5nKTogdm9pZCB7XHJcblxyXG4gICAgICAgIHRoaXMubWVtZW50by5zYXZlU3RhdGUoKTtcclxuXHJcbiAgICAgICAgRXZlbnRFbWl0dGVyLmVtaXRSZXNldEFjdGl2ZUJ1dHRvbnNFbGVtZW50RXZlbnQoXCJiYWNrZ3JvdW5kQ29sb3JcIik7XHJcblxyXG4gICAgICAgIGNvbnN0IGFjdGl2ZUNlbGwgPSBUYWJsZVV0aWxzLmdldEFjdGl2ZVRhYmxlQ2VsbCgpO1xyXG5cclxuICAgICAgICBpZiAoYWN0aXZlQ2VsbCkge1xyXG4gICAgICAgICAgICBjb25zdCB0YWJsZSA9IGFjdGl2ZUNlbGwuY2xvc2VzdCgndGFibGUnKSE7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZENlbGxzID0gdGFibGUucXVlcnlTZWxlY3RvckFsbCgndGQuc2VsZWN0ZWQnKTtcclxuXHJcbiAgICAgICAgICAgIHNlbGVjdGVkQ2VsbHMuZm9yRWFjaChjZWxsID0+IHtcclxuICAgICAgICAgICAgICAgIChjZWxsIGFzIEhUTUxFbGVtZW50KS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSB2YWx1ZTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBFdmVudEVtaXR0ZXIuZW1pdFNob3dIaWRlQWN0aXZlRWxlbWVudEV2ZW50KFwiYmFja2dyb3VuZENvbG9yXCIsIHZhbHVlLCBcInNob3dcIik7XHJcblxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJjZWxsIG5vdCBmb3VuZFwiKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgICBzdGF0aWMgaXNDZWxsQmFja2dyb3VuZENvbG9yKGNlbGw6IEhUTUxUYWJsZUNlbGxFbGVtZW50LCB0YXJnZXRIZXhDb2xvcjogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICAgICAgaWYgKCFjZWxsIHx8IGNlbGwudGFnTmFtZSAhPT0gJ1REJyB8fCAhY2VsbC5oYXNBdHRyaWJ1dGUoJ2RhdGEtcGxhY2Vob2xkZXInKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBjb21wdXRlZFN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoY2VsbCk7XHJcbiAgICAgICAgY29uc3QgY3VycmVudEJhY2tncm91bmRDb2xvciA9IGNvbXB1dGVkU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgnYmFja2dyb3VuZC1jb2xvcicpO1xyXG5cclxuICAgICAgICBjb25zdCBoZXhCYWNrZ3JvdW5kQ29sb3IgPSBVdGlscy5yZ2JUb0hleChjdXJyZW50QmFja2dyb3VuZENvbG9yKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGhleEJhY2tncm91bmRDb2xvci50b1VwcGVyQ2FzZSgpID09PSB0YXJnZXRIZXhDb2xvci50b1VwcGVyQ2FzZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHF1ZXJ5U3RhdGVDZWxsQmFja2dyb3VuZENvbG9yKHZhbHVlOiBzdHJpbmcpOiBib29sZWFuIHtcclxuXHJcbiAgICAgICAgY29uc3QgY2VsbCA9IFRhYmxlVXRpbHMuZ2V0QWN0aXZlVGFibGVDZWxsKCk7XHJcblxyXG4gICAgICAgIGlmIChjZWxsKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbXB1dGVkU3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShjZWxsKTtcclxuICAgICAgICAgICAgY29uc3QgY3VycmVudEJhY2tncm91bmRDb2xvciA9IGNvbXB1dGVkU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgnYmFja2dyb3VuZC1jb2xvcicpO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgaGV4QmFja2dyb3VuZENvbG9yID0gVXRpbHMucmdiVG9IZXgoY3VycmVudEJhY2tncm91bmRDb2xvcik7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gaGV4QmFja2dyb3VuZENvbG9yLnRvVXBwZXJDYXNlKCkgPT09IHZhbHVlLnRvVXBwZXJDYXNlKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgIC8vIGNvbnN0IGEgPSBET01VdGlscy5cclxuXHJcbiAgICAgICAgLy8gICAgIHRoaXMubWVtZW50by5zYXZlU3RhdGUoKTtcclxuXHJcbiAgICAgICAgLy8gRXZlbnRFbWl0dGVyLmVtaXRSZXNldEFjdGl2ZUJ1dHRvbnNFbGVtZW50RXZlbnQoXCJiYWNrZ3JvdW5kQ29sb3JcIik7XHJcblxyXG4gICAgICAgIC8vIGNvbnN0IGFjdGl2ZUNlbGwgPSBUYWJsZVV0aWxzLmdldEFjdGl2ZVRhYmxlQ2VsbCgpO1xyXG5cclxuICAgICAgICAvLyBpZiAoYWN0aXZlQ2VsbCkge1xyXG4gICAgICAgIC8vICAgICBjb25zdCB0YWJsZSA9IGFjdGl2ZUNlbGwuY2xvc2VzdCgndGFibGUnKSE7XHJcblxyXG4gICAgICAgIC8vICAgICBjb25zdCBzZWxlY3RlZENlbGxzID0gdGFibGUucXVlcnlTZWxlY3RvckFsbCgndGQuc2VsZWN0ZWQnKTtcclxuXHJcbiAgICAgICAgLy8gICAgIHNlbGVjdGVkQ2VsbHMuZm9yRWFjaChjZWxsID0+IHtcclxuICAgICAgICAvLyAgICAgICAgIChjZWxsIGFzIEhUTUxFbGVtZW50KS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSB2YWx1ZTtcclxuICAgICAgICAvLyAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vICAgICBFdmVudEVtaXR0ZXIuZW1pdFNob3dIaWRlQWN0aXZlRWxlbWVudEV2ZW50KFwiYmFja2dyb3VuZENvbG9yXCIsIHZhbHVlLCBcInNob3dcIik7XHJcblxyXG4gICAgICAgIC8vIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gICAgIGNvbnNvbGUuZXJyb3IoXCJjZWxsIG5vdCBmb3VuZFwiKTtcclxuICAgICAgICAvLyB9XHJcbiAgICB9XHJcblxyXG4gICAgcXVlcnlBbGxTdGF0ZUNlbGxCYWNrZ3JvdW5kQ29sb3IoZWxlbWVudHM6IEhUTUxUYWJsZUNlbGxFbGVtZW50W10sIGNvbG9yOiBDb2xvcnMpOiBib29sZWFuIHtcclxuXHJcbiAgICAgICAgbGV0IGlzOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgaWYgKGNvbG9yID09IENvbG9ycy5CYWNrZ3JvdW5kQ29sb3JOb25lKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGVsZW1lbnRzLmZvckVhY2goY2VsbCA9PiB7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBzdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGNlbGwpO1xyXG4gICAgICAgICAgICBjb25zdCByZ2JDb2xvciA9IHN0eWxlLmJhY2tncm91bmRDb2xvcjtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGhleENvbG9yID0gVXRpbHMucmdiVG9IZXgocmdiQ29sb3IpLnRvTG9jYWxlTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgICAgIGlmIChoZXhDb2xvciAhPT0gY29sb3IudG9Mb2NhbGVMb3dlckNhc2UoKSkge1xyXG4gICAgICAgICAgICAgICAgaXMgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gaXM7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vIGV4ZWNIaWxpdGVDb2xvcih2YWx1ZTogc3RyaW5nKTogdm9pZCB7XHJcblxyXG4gICAgLy8gICAgIHRoaXMubWVtZW50by5zYXZlU3RhdGUoKTtcclxuXHJcbiAgICAvLyAgICAgaWYgKGRvY3VtZW50LmV4ZWNDb21tYW5kKFwiaGlsaXRlQ29sb3JcIiwgZmFsc2UsIHZhbHVlKSkge1xyXG4gICAgLy8gICAgICAgICBFdmVudEVtaXR0ZXIuZW1pdFNob3dIaWRlQWN0aXZlRWxlbWVudEV2ZW50KFwiaGlsaXRlQ29sb3JcIiwgdmFsdWUsIFwic2hvd1wiKTtcclxuICAgIC8vICAgICB9ZWxzZXtcclxuICAgIC8vICAgICAgICAgRXZlbnRFbWl0dGVyLmVtaXRTaG93SGlkZUFjdGl2ZUVsZW1lbnRFdmVudChcImhpbGl0ZUNvbG9yXCIsIHZhbHVlLCBcImhpZGVcIik7XHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gfVxyXG5cclxuICAgIHN0YXRpYyBnZXRJbnN0YW5jZSgpOiBUYWJsZU9wZXJhdGlvbnNTZXJ2aWNlIHtcclxuXHJcbiAgICAgICAgY29uc3QgZm9jdXNTdGFjayA9IERlcGVuZGVuY3lDb250YWluZXIuSW5zdGFuY2UucmVzb2x2ZTxJRm9jdXNTdGFjaz4oXCJJRm9jdXNTdGFja1wiKTtcclxuICAgICAgICBjb25zdCBtZW1lbnRvID0gRGVwZW5kZW5jeUNvbnRhaW5lci5JbnN0YW5jZS5yZXNvbHZlPElNZW1lbnRvPihcIklNZW1lbnRvXCIpO1xyXG5cclxuICAgICAgICBpZiAoIXRoaXMuaW5zdGFuY2UpIHtcclxuICAgICAgICAgICAgdGhpcy5pbnN0YW5jZSA9IG5ldyBUYWJsZU9wZXJhdGlvbnNTZXJ2aWNlKGZvY3VzU3RhY2ssIG1lbWVudG8pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5zdGFuY2U7XHJcbiAgICB9XHJcblxyXG4gICAgaW5zZXJ0Um93QWJvdmUoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5tZW1lbnRvLnNhdmVTdGF0ZSgpO1xyXG5cclxuICAgICAgICBjb25zdCBjZWxsID0gdGhpcy5mb2N1c1N0YWNrLnBlZWsoKTsgLy8gQWdvcmEsIGBjZWxsYCDDqSBhIGB0ZGAgZGlyZXRhbWVudGVcclxuICAgICAgICBpZiAoIWNlbGwpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIk5vIGNlbGwgaXMgZm9jdXNlZFwiKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3Qgcm93ID0gY2VsbC5wYXJlbnRFbGVtZW50OyAvLyBPYnRlbSBhIGxpbmhhIChgdHJgKSBwYWkgZGEgY8OpbHVsYVxyXG4gICAgICAgIGlmICghcm93KSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJObyByb3cgaXMgZm9jdXNlZFwiKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgdGFibGUgPSByb3cuY2xvc2VzdChcInRhYmxlXCIpOyAvLyBFbmNvbnRyYSBhIHRhYmVsYSBxdWUgY29udMOpbSBhIGxpbmhhXHJcbiAgICAgICAgaWYgKCF0YWJsZSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiVGFibGUgZG9lcyBub3QgZXhpc3RcIik7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHRib2R5ID0gdGFibGUucXVlcnlTZWxlY3RvcigndGJvZHknKSB8fCB0YWJsZTsgLy8gQXNzdW1lIHRhYmxlIHNlIHRib2R5IG7Do28gZXhpc3RpclxyXG4gICAgICAgIGNvbnN0IHJvd0luZGV4ID0gQXJyYXkuZnJvbSh0Ym9keS5jaGlsZHJlbikuaW5kZXhPZihyb3cpOyAvLyBFbmNvbnRyYSBvIMOtbmRpY2UgZGEgbGluaGEgZGVudHJvIGRvIHRib2R5IG91IGRhIHRhYmVsYVxyXG5cclxuICAgICAgICBpZiAocm93SW5kZXggPCAwKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJSb3cgaW5kZXggbm90IGZvdW5kXCIpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBUYWJsZVV0aWxzLmFkZFJvdyh0YWJsZSwgcm93SW5kZXgpOyAvLyBJbnNlcmUgdW1hIG5vdmEgbGluaGEgbm8gw61uZGljZSBlbmNvbnRyYWRvXHJcbiAgICAgICAgRXZlbnRFbWl0dGVyLmVtaXRDbG9zZUVsZW1lbnRFdmVudChUb29sYmFySURzLlRhYmxlVG9vbGJhcik7XHJcbiAgICB9XHJcblxyXG4gICAgaW5zZXJ0Um93QmVsb3coYmxvY2s6IEhUTUxFbGVtZW50KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5tZW1lbnRvLnNhdmVTdGF0ZSgpO1xyXG5cclxuICAgICAgICBpZiAoYmxvY2spIHtcclxuICAgICAgICAgICAgY29uc3QgdGFibGUgPSBibG9jay5xdWVyeVNlbGVjdG9yKFwidGFibGVcIik7XHJcbiAgICAgICAgICAgIGlmICh0YWJsZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgcm93ID0gdGFibGUucXVlcnlTZWxlY3RvcihcInRyOmxhc3QtY2hpbGRcIik7XHJcbiAgICAgICAgICAgICAgICBpZiAocm93KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgcm93SW5kZXggPSBBcnJheS5mcm9tKHRhYmxlLmNoaWxkcmVuWzBdLmNoaWxkcmVuKS5pbmRleE9mKHJvdykgKyAxO1xyXG4gICAgICAgICAgICAgICAgICAgIFRhYmxlVXRpbHMuYWRkUm93KHRhYmxlLCByb3dJbmRleCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJObyByb3dzIGluIHRoZSB0YWJsZVwiKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiVGFibGUgZG9lcyBub3QgZXhpc3RcIik7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5mb2N1c1N0YWNrLnBlZWsoKTtcclxuICAgICAgICAgICAgaWYgKCFlbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiTm8gZm9jdXNlZCBlbGVtZW50IGF2YWlsYWJsZVwiKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3QgY2VsbCA9IGVsZW1lbnQuY2xvc2VzdChcInRkXCIpO1xyXG4gICAgICAgICAgICBpZiAoIWNlbGwpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJObyBjZWxsIGlzIGZvY3VzZWRcIik7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHJvdyA9IGNlbGwucGFyZW50RWxlbWVudDtcclxuICAgICAgICAgICAgY29uc3QgdGFibGUgPSBjZWxsLmNsb3Nlc3QoXCJ0YWJsZVwiKTtcclxuICAgICAgICAgICAgaWYgKCF0YWJsZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIlRhYmxlIGRvZXMgbm90IGV4aXN0XCIpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAocm93KSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByb3dJbmRleCA9IEFycmF5LmZyb20odGFibGUuY2hpbGRyZW5bMF0uY2hpbGRyZW4pLmluZGV4T2Yocm93KSArIDE7XHJcbiAgICAgICAgICAgICAgICBUYWJsZVV0aWxzLmFkZFJvdyh0YWJsZSwgcm93SW5kZXgpO1xyXG5cclxuICAgICAgICAgICAgICAgIEV2ZW50RW1pdHRlci5lbWl0Q2xvc2VFbGVtZW50RXZlbnQoVG9vbGJhcklEcy5UYWJsZVRvb2xiYXIpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBpbnNlcnRDb2x1bW4oZGlyZWN0aW9uOiAnbGVmdCcgfCAncmlnaHQnKTogdm9pZCB7XHJcbiAgICAvLyAgICAgdGhpcy5tZW1lbnRvLnNhdmVTdGF0ZSgpOyAgLy8gU2FsdmEgbyBlc3RhZG8gYXR1YWwgcGFyYSBwb3Nzw612ZWwgZGVzZmF6aW1lbnRvXHJcblxyXG4gICAgLy8gICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmZvY3VzU3RhY2sucGVlaygpOyAgLy8gUGVnYSBvIGVsZW1lbnRvIGF0dWFsbWVudGUgZm9jYWRvXHJcbiAgICAvLyAgICAgaWYgKCFlbGVtZW50KSB7XHJcbiAgICAvLyAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJObyBmb2N1c2VkIGVsZW1lbnQgYXZhaWxhYmxlXCIpO1xyXG4gICAgLy8gICAgICAgICByZXR1cm47XHJcbiAgICAvLyAgICAgfVxyXG5cclxuICAgIC8vICAgICBjb25zdCBjZWxsID0gZWxlbWVudC5jbG9zZXN0KFwidGRcIik7ICAvLyBFbmNvbnRyYSBhIGPDqWx1bGEgZm9jYWRhIGRlbnRybyBkYSB0YWJlbGFcclxuICAgIC8vICAgICBpZiAoIWNlbGwpIHtcclxuICAgIC8vICAgICAgICAgY29uc29sZS5lcnJvcihcIk5vIGNlbGwgaXMgZm9jdXNlZFwiKTtcclxuICAgIC8vICAgICAgICAgcmV0dXJuO1xyXG4gICAgLy8gICAgIH1cclxuXHJcbiAgICAvLyAgICAgY29uc3QgdGFibGUgPSBjZWxsLmNsb3Nlc3QoXCJ0YWJsZVwiKTsgIC8vIEVuY29udHJhIGEgdGFiZWxhIGNvbnRlbmRvIGEgY8OpbHVsYVxyXG4gICAgLy8gICAgIGlmICghdGFibGUpIHtcclxuICAgIC8vICAgICAgICAgY29uc29sZS5lcnJvcihcIlRhYmxlIGRvZXMgbm90IGV4aXN0XCIpO1xyXG4gICAgLy8gICAgICAgICByZXR1cm47XHJcbiAgICAvLyAgICAgfVxyXG5cclxuICAgIC8vICAgICBjb25zdCBjb2x1bW5JbmRleCA9IEFycmF5LmZyb20oY2VsbC5wYXJlbnRFbGVtZW50LmNoaWxkcmVuKS5pbmRleE9mKGNlbGwpOyAgLy8gRGV0ZXJtaW5hIG8gw61uZGljZSBkYSBjb2x1bmEgYXR1YWxcclxuICAgIC8vICAgICBpZiAoZGlyZWN0aW9uID09PSAnbGVmdCcpIHtcclxuICAgIC8vICAgICAgICAgVGFibGVVdGlscy5hZGRDb2x1bW4odGFibGUsIGNvbHVtbkluZGV4KTsgIC8vIEFkaWNpb25hIGNvbHVuYSDDoCBlc3F1ZXJkYVxyXG4gICAgLy8gICAgIH0gZWxzZSB7XHJcbiAgICAvLyAgICAgICAgIFRhYmxlVXRpbHMuYWRkQ29sdW1uKHRhYmxlLCBjb2x1bW5JbmRleCArIDEpOyAgLy8gQWRpY2lvbmEgY29sdW5hIMOgIGRpcmVpdGFcclxuICAgIC8vICAgICB9XHJcbiAgICAvLyB9XHJcblxyXG4gICAgaW5zZXJ0Q29sdW1uTGVmdCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLm1lbWVudG8uc2F2ZVN0YXRlKCk7XHJcblxyXG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmZvY3VzU3RhY2sucGVlaygpO1xyXG4gICAgICAgIGlmICghZWxlbWVudCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiTm8gZm9jdXNlZCBlbGVtZW50IGF2YWlsYWJsZVwiKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgY2VsbCA9IGVsZW1lbnQuY2xvc2VzdChcInRkXCIpO1xyXG4gICAgICAgIGlmICghY2VsbCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiTm8gY2VsbCBpcyBmb2N1c2VkXCIpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCB0YWJsZSA9IGNlbGwuY2xvc2VzdChcInRhYmxlXCIpO1xyXG4gICAgICAgIGlmICghdGFibGUpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIlRhYmxlIGRvZXMgbm90IGV4aXN0XCIpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBjb2x1bW5JbmRleCA9IEFycmF5LmZyb20oY2VsbC5wYXJlbnRFbGVtZW50IS5jaGlsZHJlbikuaW5kZXhPZihjZWxsKTtcclxuICAgICAgICBUYWJsZVV0aWxzLmFkZENvbHVtbih0YWJsZSwgY29sdW1uSW5kZXgpO1xyXG5cclxuICAgICAgICBFdmVudEVtaXR0ZXIuZW1pdENsb3NlRWxlbWVudEV2ZW50KFRvb2xiYXJJRHMuVGFibGVUb29sYmFyKTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgaW5zZXJ0Q29sdW1uUmlnaHQoYmxvY2s6IEhUTUxFbGVtZW50IHwgbnVsbCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMubWVtZW50by5zYXZlU3RhdGUoKTtcclxuXHJcbiAgICAgICAgaWYgKGJsb2NrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRhYmxlID0gYmxvY2sucXVlcnlTZWxlY3RvcihcInRhYmxlXCIpO1xyXG4gICAgICAgICAgICBpZiAodGFibGUpIHtcclxuICAgICAgICAgICAgICAgIFRhYmxlVXRpbHMuYWRkQ29sdW1uKHRhYmxlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmZvY3VzU3RhY2sucGVlaygpO1xyXG4gICAgICAgICAgICBpZiAoIWVsZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJObyBmb2N1c2VkIGVsZW1lbnQgYXZhaWxhYmxlXCIpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCBjZWxsID0gZWxlbWVudC5jbG9zZXN0KFwidGRcIik7XHJcbiAgICAgICAgICAgIGlmICghY2VsbCkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIk5vIGNlbGwgaXMgZm9jdXNlZFwiKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3QgdGFibGUgPSBjZWxsLmNsb3Nlc3QoXCJ0YWJsZVwiKTtcclxuICAgICAgICAgICAgaWYgKCF0YWJsZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIlRhYmxlIGRvZXMgbm90IGV4aXN0XCIpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCBjb2x1bW5JbmRleCA9IEFycmF5LmZyb20oY2VsbC5wYXJlbnRFbGVtZW50IS5jaGlsZHJlbikuaW5kZXhPZihjZWxsKTtcclxuICAgICAgICAgICAgVGFibGVVdGlscy5hZGRDb2x1bW4odGFibGUsIGNvbHVtbkluZGV4ICsgMSk7XHJcblxyXG4gICAgICAgICAgICBFdmVudEVtaXR0ZXIuZW1pdENsb3NlRWxlbWVudEV2ZW50KFRvb2xiYXJJRHMuVGFibGVUb29sYmFyKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc2hvd0luc2VydExpbmVFbGVtZW50KGJsb2NrOiBIVE1MRWxlbWVudCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGluc2VydExpbmUgPSBibG9jay5xdWVyeVNlbGVjdG9yKFwiLmFkZC10YWJsZS1yb3dcIikgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgaW5zZXJ0TGluZS5zdHlsZS52aXNpYmlsaXR5ID0gXCJ2aXNpYmxlXCI7XHJcbiAgICB9XHJcblxyXG4gICAgc2hvd0luc2VydENvbHVtbkVsZW1lbnQoYmxvY2s6IEhUTUxFbGVtZW50KTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgaW5zZXJ0TGluZSA9IGJsb2NrLnF1ZXJ5U2VsZWN0b3IoXCIuYWRkLXRhYmxlLWNvbHVtblwiKSBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICBpbnNlcnRMaW5lLnN0eWxlLnZpc2liaWxpdHkgPSBcInZpc2libGVcIjtcclxuICAgIH1cclxuXHJcbiAgICBoaWRlSW5zZXJ0Um93RWxlbWVudChibG9jazogSFRNTEVsZW1lbnQpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBpbnNlcnRMaW5lID0gYmxvY2sucXVlcnlTZWxlY3RvcihcIi5hZGQtdGFibGUtcm93XCIpIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgIGluc2VydExpbmUuc3R5bGUudmlzaWJpbGl0eSA9IFwiaGlkZGVuXCI7XHJcbiAgICB9XHJcblxyXG4gICAgaGlkZUluc2VydENvbHVtbkVsZW1lbnQoYmxvY2s6IEhUTUxFbGVtZW50KTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgaW5zZXJ0TGluZSA9IGJsb2NrLnF1ZXJ5U2VsZWN0b3IoXCIuYWRkLXRhYmxlLWNvbHVtblwiKSBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICBpbnNlcnRMaW5lLnN0eWxlLnZpc2liaWxpdHkgPSBcImhpZGRlblwiO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGlzQWN0aXZlQ2VsbEJhY2tncm91bmRDb2xvcih2YWx1ZTogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICAvLyAgICAgcmV0dXJuIFRhYmxlVXRpbHMuaXNBY3RpdmVDZWxsQmFja2dyb3VuZENvbG9yKHZhbHVlKTtcclxuICAgIC8vIH1cclxuXHJcbiAgICAvLyBlbWl0Q2hhbmdlVGFibGVCb3JkZXJDb2xvckV2ZW50ID0gKHNjb3BlOiBUYWJsZVNjb3BlcywgY29sb3I6IENvbG9ycyk6IHZvaWQgPT4ge1xyXG4gICAgLy8gICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KENvbW1hbmRzLiwge1xyXG4gICAgLy8gICAgICAgICBkZXRhaWw6IHsgc2NvcGU6IHNjb3BlIH1cclxuICAgIC8vICAgICB9KTtcclxuXHJcbiAgICAvLyAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChjdXN0b21FdmVudCk7XHJcbiAgICAvLyB9XHJcblxyXG5cclxuICAgIGNoYW5nZVRhYmxlQm9yZGVyQ29sb3Ioc2NvcGU6IFRhYmxlU2NvcGVzLCBjb2xvcjogQ29sb3JzKTogdm9pZCB7XHJcblxyXG4gICAgICAgIGNvbnN0IHRhYmxlID0gdGhpcy5mb2N1c1N0YWNrLnBlZWsoKT8uY2xvc2VzdChET01FbGVtZW50cy5UQUJMRSk7XHJcblxyXG4gICAgICAgIGlmICh0YWJsZSkge1xyXG4gICAgICAgICAgICBUYWJsZVV0aWxzLmNoYW5nZUNlbGxCb3JkZXJDb2xvcih0YWJsZSwgc2NvcGUsIGNvbG9yKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbn0iLCJpbXBvcnQgeyBJTWVtZW50byB9IGZyb20gXCIuL0lNZW1lbnRvXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgTWVtZW50byBpbXBsZW1lbnRzIElNZW1lbnRvIHtcclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgcXVlcnk6IHN0cmluZyA9IFwiI2pvaGFubmVzRWRpdG9yIC5jb250ZW50XCI7XHJcbiAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IE1lbWVudG87XHJcblxyXG4gIHByaXZhdGUgdW5kb1N0YWNrOiBzdHJpbmdbXSA9IFtdO1xyXG4gIHByaXZhdGUgcmVkb1N0YWNrOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuICBwcml2YXRlIGdldCBjb250ZW50KCkgOiBIVE1MRWxlbWVudHtcclxuICAgIHJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKE1lbWVudG8ucXVlcnkpITtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY29uc3RydWN0b3IoKSB7XHJcblxyXG4gICAgaWYgKE1lbWVudG8uaW5zdGFuY2UpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVXNlIE1lbWVudG8uZ2V0SW5zdGFuY2UoKSB0byBnZXQgaW5zdGFuY2UuXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuYXR0YWNoRXZlbnRzKCk7XHJcbiAgICB0aGlzLnNhdmVTdGF0ZSgpO1xyXG4gIH1cclxuXHJcbiAgc2F2ZVN0YXRlKCkge1xyXG4gICAgaWYgKHRoaXMuY29udGVudCkge1xyXG4gICAgICB0aGlzLnVuZG9TdGFjay5wdXNoKHRoaXMuY29udGVudC5pbm5lckhUTUwpO1xyXG4gICAgICB0aGlzLnJlZG9TdGFjayA9IFtdO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1bmRvKCkge1xyXG4gICAgaWYgKHRoaXMudW5kb1N0YWNrLmxlbmd0aCA+IDEgJiYgdGhpcy5jb250ZW50KSB7XHJcbiAgICAgIHRoaXMucmVkb1N0YWNrLnB1c2godGhpcy5jb250ZW50LmlubmVySFRNTCk7XHJcbiAgICAgIGNvbnN0IHN0YXRlVG9SZXN0b3JlID0gdGhpcy51bmRvU3RhY2sucG9wKCk7XHJcbiAgICAgIHRoaXMuY29udGVudC5pbm5lckhUTUwgPSBzdGF0ZVRvUmVzdG9yZSE7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlZG8oKSB7XHJcbiAgICBpZiAodGhpcy5yZWRvU3RhY2subGVuZ3RoID4gMCAmJiB0aGlzLmNvbnRlbnQpIHtcclxuICAgICAgdGhpcy51bmRvU3RhY2sucHVzaCh0aGlzLmNvbnRlbnQuaW5uZXJIVE1MKTtcclxuICAgICAgY29uc3Qgc3RhdGVUb0FwcGx5ID0gdGhpcy5yZWRvU3RhY2sucG9wKCk7XHJcbiAgICAgIHRoaXMuY29udGVudC5pbm5lckhUTUwgPSBzdGF0ZVRvQXBwbHkhO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIGF0dGFjaEV2ZW50cygpIHtcclxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIChldmVudCkgPT4ge1xyXG4gICAgICBpZiAoZXZlbnQuY3RybEtleSAmJiBldmVudC5rZXkgPT09ICd6Jykge1xyXG4gICAgICAgIHRoaXMudW5kbygpO1xyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgIH0gZWxzZSBpZiAoZXZlbnQuY3RybEtleSAmJiBldmVudC5rZXkgPT09ICd5Jykge1xyXG4gICAgICAgIHRoaXMucmVkbygpO1xyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy8gcHJpdmF0ZSBoYW5kbGVLZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XHJcbiAgLy8gICBpZiAoZXZlbnQuY3RybEtleSAmJiBldmVudC5rZXkgPT09ICd6Jykge1xyXG4gIC8vICAgICB0aGlzLnVuZG8oKTtcclxuICAvLyAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAvLyAgIH0gZWxzZSBpZiAoZXZlbnQuY3RybEtleSAmJiBldmVudC5rZXkgPT09ICd5Jykge1xyXG4gIC8vICAgICB0aGlzLnJlZG8oKTtcclxuICAvLyAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAvLyAgIH1cclxuICAvLyB9XHJcblxyXG4gIHN0YXRpYyBnZXRJbnN0YW5jZSgpOiBNZW1lbnRvIHtcclxuICAgIGlmICghTWVtZW50by5pbnN0YW5jZSkge1xyXG4gICAgICBNZW1lbnRvLmluc3RhbmNlID0gbmV3IE1lbWVudG8oKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gTWVtZW50by5pbnN0YW5jZTtcclxuICB9XHJcbn0iLCJpbXBvcnQgeyBET01VdGlscyB9IGZyb20gXCJAL3V0aWxpdGllcy9ET01VdGlsc1wiO1xuaW1wb3J0IHsgSUVkaXRhYmxlTmF2aWdhdGlvbiB9IGZyb20gXCIuL0lFZGl0YWJsZU5hdmlnYXRpb25cIjtcbmltcG9ydCB7IERpcmVjdGlvbnMgfSBmcm9tIFwiQC9jb21tb24vRGlyZWN0aW9uc1wiO1xuaW1wb3J0IHsgQm91bmRhcmllcyB9IGZyb20gXCJAL2NvbW1vbi9Cb3VuZGFyaWVzXCI7XG5pbXBvcnQgeyBUYWJsZVV0aWxzIH0gZnJvbSBcIkAvdXRpbGl0aWVzL1RhYmxlVXRpbHNcIjtcbmltcG9ydCB7IElRdWlja01lbnUgfSBmcm9tIFwiQC9jb21wb25lbnRzL3F1aWNrLW1lbnUvSVF1aWNrTWVudVwiO1xuaW1wb3J0IHsgRGVwZW5kZW5jeUNvbnRhaW5lciB9IGZyb20gXCIuL0RlcGVuZGVuY3lDb250YWluZXJcIjtcblxuLyoqXG4gKiBUaGlzIGNsYXNzIGhhbmRsZXMga2V5Ym9hcmQgZXZlbnRzIHRvIG5hdmlnYXRlIGJldHdlZW4gY29udGVudGVkaXRhYmxlIGVsZW1lbnRzIHVzaW5nIGFycm93IGtleXMsXG4gKiBhbmQgZW5zdXJlcyBmb2N1cyBtYW5hZ2VtZW50IGFuZCBjYXJldCBwbGFjZW1lbnQgd2l0aGluIHRoZXNlIGVsZW1lbnRzLlxuICogSXQgaW1wbGVtZW50cyB0aGUgYElFZGl0YWJsZU5hdmlnYXRpb25gIGludGVyZmFjZSBhbmQgdXNlcyBhIHNpbmdsZXRvbiBwYXR0ZXJuIHRvIG1hbmFnZSBpdHMgaW5zdGFuY2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBFZGl0YWJsZU5hdmlnYXRpb24gaW1wbGVtZW50cyBJRWRpdGFibGVOYXZpZ2F0aW9uIHtcblxuICAgIHByaXZhdGUgc3RhdGljIGluc3RhbmNlOiBFZGl0YWJsZU5hdmlnYXRpb247XG5cbiAgICBxdWlja01lbnU6IElRdWlja01lbnU7XG5cbiAgICAvKipcbiAgICAgKiBQcml2YXRlIGNvbnN0cnVjdG9yIHRvIHByZXZlbnQgZXh0ZXJuYWwgaW5zdGFudGlhdGlvbi5cbiAgICAgKiBJdCBiaW5kcyB0aGUgYGhhbmRsZUFycm93S2V5c2AgbWV0aG9kIHRvIGtleWJvYXJkIGV2ZW50cyBvbiB0aGUgZG9jdW1lbnQuXG4gICAgICovXG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihxdWlja01lbnU6IElRdWlja01lbnUpIHtcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMuaGFuZGxlQXJyb3dLZXlzLmJpbmQodGhpcykpO1xuXG4gICAgICAgIHRoaXMucXVpY2tNZW51ID0gcXVpY2tNZW51O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFjdHMgYXMgYSB0cmlnZ2VyIHdpdGhpbiB0aGUgZGVwZW5kZW5jeSBpbmplY3Rpb24gY29udGFpbmVyIHRvIGVuc3VyZSBpbnN0YW50aWF0aW9uIG9mIHRoaXMgc2luZ2xldG9uIGNsYXNzLlxuICAgICAqIFRoaXMgbWV0aG9kIGRvZXMgbm90IHBlcmZvcm0gYW55IG9wZXJhdGlvbnMgaXRzZWxmIGJ1dCBlbnN1cmVzIHRoYXQgYW4gaW5zdGFuY2Ugb2YgRWRpdGFibGVOYXZpZ2F0aW9uXG4gICAgICogaXMgY3JlYXRlZCBhbmQgcmVhZHkgdG8gbGlzdGVuIHRvIGtleWJvYXJkIGV2ZW50cy4gVGhpcyBpcyBjcnVjaWFsIGZvciBzZXR0aW5nIHVwIHRoZSBldmVudCBsaXN0ZW5lcnNcbiAgICAgKiB0aGF0IG1hbmFnZSBuYXZpZ2F0aW9uIHdpdGhpbiBlZGl0YWJsZSBjb250ZW50IGFyZWFzLCBhcyBpdCB0cmlnZ2VycyB0aGUgbmVjZXNzYXJ5IGJpbmRpbmdzIHVwb24gaW5zdGFudGlhdGlvbi5cbiAgICAgKi9cbiAgICBsaXN0ZW4oKTogdm9pZCB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiRWRpdGFibGVOYXZpZ2F0aW9uIGlzIG5vdyBsaXN0ZW5pbmcgZm9yIGtleSBldmVudHMuXCIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHJpZXZlcyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBFZGl0YWJsZU5hdmlnYXRpb24gY2xhc3MuXG4gICAgICogSWYgdGhlIGluc3RhbmNlIGRvZXMgbm90IGV4aXN0LCBpdCBjcmVhdGVzIGEgbmV3IG9uZS5cbiAgICAgKiBAcmV0dXJucyB7RWRpdGFibGVOYXZpZ2F0aW9ufSBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBFZGl0YWJsZU5hdmlnYXRpb24gY2xhc3MuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRJbnN0YW5jZSgpOiBFZGl0YWJsZU5hdmlnYXRpb24ge1xuXG4gICAgICAgIGlmICghRWRpdGFibGVOYXZpZ2F0aW9uLmluc3RhbmNlKSB7XG5cbiAgICAgICAgICAgIGNvbnN0IHF1aWNrTWVudSA9IERlcGVuZGVuY3lDb250YWluZXIuSW5zdGFuY2UucmVzb2x2ZTxJUXVpY2tNZW51PihcIklRdWlja01lbnVcIik7XG5cbiAgICAgICAgICAgIEVkaXRhYmxlTmF2aWdhdGlvbi5pbnN0YW5jZSA9IG5ldyBFZGl0YWJsZU5hdmlnYXRpb24ocXVpY2tNZW51KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gRWRpdGFibGVOYXZpZ2F0aW9uLmluc3RhbmNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgaGFuZGxlQXJyb3dLZXlzKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG5cbiAgICAgICAgaWYgKCF0aGlzLnF1aWNrTWVudS5pc1Zpc2libGUgJiYgZXZlbnQua2V5LnN0YXJ0c1dpdGgoJ0Fycm93JykgJiYgIWV2ZW50LmFsdEtleSAmJiAhZXZlbnQuY3RybEtleSAmJiAhZXZlbnQuYWx0S2V5ICYmICFldmVudC5zaGlmdEtleSAmJiAhZXZlbnQubWV0YUtleSkge1xuXG4gICAgICAgICAgICBjb25zdCBjdXJyZW50RWRpdGFibGUgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xuXG4gICAgICAgICAgICBpZiAoY3VycmVudEVkaXRhYmxlICYmIGN1cnJlbnRFZGl0YWJsZS5pc0NvbnRlbnRFZGl0YWJsZSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNob3VsZFN3aXRjaEVkaXRhYmxlKGN1cnJlbnRFZGl0YWJsZSwgZXZlbnQua2V5IGFzIERpcmVjdGlvbnMpKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV4dEVkaXRhYmxlID0gdGhpcy5maW5kTmV4dEVkaXRhYmxlKGN1cnJlbnRFZGl0YWJsZSwgZXZlbnQua2V5IGFzIERpcmVjdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobmV4dEVkaXRhYmxlKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50LmtleSA9PSBEaXJlY3Rpb25zLkFycm93VXAgfHwgZXZlbnQua2V5ID09IERpcmVjdGlvbnMuQXJyb3dEb3duKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbGFjZUNhcmV0SW5TaW1pbGFyUG9zaXRpb24oY3VycmVudEVkaXRhYmxlLCBuZXh0RWRpdGFibGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQua2V5ID09IERpcmVjdGlvbnMuQXJyb3dMZWZ0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRE9NVXRpbHMucGxhY2VDdXJzb3JBdEVuZE9mRWRpdGFibGVFbGVtZW50KG5leHRFZGl0YWJsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChldmVudC5rZXkgPT0gRGlyZWN0aW9ucy5BcnJvd1JpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRE9NVXRpbHMucGxhY2VDdXJzb3JBdFN0YXJ0T2ZFZGl0YWJsZUVsZW1lbnQobmV4dEVkaXRhYmxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEVkaXRhYmxlLmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAqIERldGVybWluZXMgaWYgbmF2aWdhdGlvbiBzaG91bGQgc3dpdGNoIGZyb20gdGhlIGN1cnJlbnQgZWRpdGFibGUgZWxlbWVudCBiYXNlZCBvbiB0aGUgYXJyb3cgZGlyZWN0aW9uIGFuZCBjYXJldCBwb3NpdGlvbi5cbiAgICAqIEl0IGNoZWNrcyBpZiB0aGUgY2FyZXQgaXMgYXQgdGhlIHN0YXJ0IG9yIGVuZCBvZiB0aGUgY29udGVudCBhbmQgZXZhbHVhdGVzIGJvdW5kYXJ5IGNvbmRpdGlvbnMgZm9yIHZlcnRpY2FsIG5hdmlnYXRpb24uXG4gICAgKiBcbiAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnQgLSBUaGUgY3VycmVudCBjb250ZW50ZWRpdGFibGUgZWxlbWVudCBiZWluZyBldmFsdWF0ZWQuXG4gICAgKiBAcGFyYW0ge0RpcmVjdGlvbnN9IGRpcmVjdGlvbiAtIFRoZSBuYXZpZ2F0aW9uIGRpcmVjdGlvbiBpbmRpY2F0ZWQgYnkgdGhlIGFycm93IGtleSBwcmVzcy5cbiAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIHRydWUgaWYgdGhlIG5hdmlnYXRpb24gc2hvdWxkIG1vdmUgdG8gYW5vdGhlciBlbGVtZW50LCBmYWxzZSBvdGhlcndpc2UuXG4gICAgKi9cbiAgICBwcml2YXRlIHNob3VsZFN3aXRjaEVkaXRhYmxlKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBkaXJlY3Rpb246IERpcmVjdGlvbnMpOiBib29sZWFuIHtcblxuICAgICAgICBjb25zdCBzZWwgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG5cbiAgICAgICAgLy8gSWYgaGFzIHNlbGVjdGlvbiBpZ25vcmUgbmF2aWdhdGlvbiBcbiAgICAgICAgaWYgKHNlbCAmJiBzZWwucmFuZ2VDb3VudCA+IDApIHtcbiAgICAgICAgICAgIGxldCByYW5nZSA9IHNlbC5nZXRSYW5nZUF0KDApO1xuICAgICAgICAgICAgaWYgKHJhbmdlLmVuZE9mZnNldCAhPSByYW5nZS5zdGFydE9mZnNldCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNlbCAmJiBzZWwucmFuZ2VDb3VudCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHsgYXRTdGFydCwgYXRFbmQgfSA9IERPTVV0aWxzLmdldFNlbGVjdGlvblRleHRJbmZvKGVsZW1lbnQpO1xuICAgICAgICAgICAgY29uc3QgaXNBdEZpcnN0TGluZSA9IHRoaXMuaXNBdExpbmVCb3VuZGFyeShlbGVtZW50LCBCb3VuZGFyaWVzLkZpcnN0KTtcbiAgICAgICAgICAgIGNvbnN0IGlzQXRMYXN0TGluZSA9IHRoaXMuaXNBdExpbmVCb3VuZGFyeShlbGVtZW50LCBCb3VuZGFyaWVzLkxhc3QpO1xuXG4gICAgICAgICAgICBpZiAoKGRpcmVjdGlvbiA9PT0gRGlyZWN0aW9ucy5BcnJvd0xlZnQgJiYgYXRTdGFydCkgfHwgKGRpcmVjdGlvbiA9PT0gRGlyZWN0aW9ucy5BcnJvd1JpZ2h0ICYmIGF0RW5kKSB8fFxuICAgICAgICAgICAgICAgIChkaXJlY3Rpb24gPT09IERpcmVjdGlvbnMuQXJyb3dVcCAmJiAoYXRTdGFydCB8fCBpc0F0Rmlyc3RMaW5lKSkgfHxcbiAgICAgICAgICAgICAgICAoZGlyZWN0aW9uID09PSBEaXJlY3Rpb25zLkFycm93RG93biAmJiAoYXRFbmQgfHwgaXNBdExhc3RMaW5lKSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNBdExpbmVCb3VuZGFyeShlbGVtZW50OiBIVE1MRWxlbWVudCwgYm91bmRhcnk6IEJvdW5kYXJpZXMpOiBib29sZWFuIHtcblxuICAgICAgICBjb25zdCBoYXNUZXh0Q29udGVudCA9IGVsZW1lbnQudGV4dENvbnRlbnQ/LnRyaW0oKSAhPT0gXCJcIjtcblxuICAgICAgICBpZiAoIWhhc1RleHRDb250ZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcbiAgICAgICAgaWYgKCFzZWxlY3Rpb24gfHwgc2VsZWN0aW9uLnJhbmdlQ291bnQgPT09IDApIHJldHVybiBmYWxzZTtcblxuICAgICAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xuICAgICAgICBjb25zdCByZWN0ID0gcmFuZ2UuZ2V0Q2xpZW50UmVjdHMoKVswXTtcblxuICAgICAgICBpZiAoIXJlY3QpIHJldHVybiB0cnVlO1xuXG4gICAgICAgIGNvbnN0IGVsZW1lbnRSZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgY29uc3QgdG9sZXJhbmNlID0gMTE7XG5cbiAgICAgICAgaWYgKGJvdW5kYXJ5ID09PSBCb3VuZGFyaWVzLkZpcnN0KSB7XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5hYnMocmVjdC50b3AgLSBlbGVtZW50UmVjdC50b3ApIDwgdG9sZXJhbmNlO1xuICAgICAgICB9IGVsc2UgaWYgKGJvdW5kYXJ5ID09PSBCb3VuZGFyaWVzLkxhc3QpIHtcbiAgICAgICAgICAgIHJldHVybiBNYXRoLmFicyhyZWN0LmJvdHRvbSAtIGVsZW1lbnRSZWN0LmJvdHRvbSkgPCB0b2xlcmFuY2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBMb2NhdGVzIHRoZSBuZXh0IGNvbnRlbnRlZGl0YWJsZSBlbGVtZW50IGluIHRoZSBzcGVjaWZpZWQgbmF2aWdhdGlvbiBkaXJlY3Rpb24uXG4gICAgKiBUaGlzIGZ1bmN0aW9uIHRha2VzIGludG8gYWNjb3VudCBib3RoIGhvcml6b250YWwgKGxlZnQvcmlnaHQpIGFuZCB2ZXJ0aWNhbCAodXAvZG93bikgZGlyZWN0aW9ucyBhbmQgaGFuZGxlcyB0YWJsZSBjZWxsIGJvdW5kYXJpZXMuXG4gICAgKiBcbiAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGN1cnJlbnQgLSBUaGUgY3VycmVudCBjb250ZW50ZWRpdGFibGUgZWxlbWVudC5cbiAgICAqIEBwYXJhbSB7RGlyZWN0aW9uc30gZGlyZWN0aW9uIC0gVGhlIGRpcmVjdGlvbiBvZiB0aGUgYXJyb3cga2V5IG5hdmlnYXRpb24uXG4gICAgKiBAcmV0dXJucyB7SFRNTEVsZW1lbnQgfCBudWxsfSBUaGUgbmV4dCBjb250ZW50ZWRpdGFibGUgZWxlbWVudCBpbiB0aGUgZGVzaXJlZCBkaXJlY3Rpb24gb3IgbnVsbCBpZiBubyBzdWl0YWJsZSBlbGVtZW50IGlzIGZvdW5kLlxuICAgICovXG4gICAgcHJpdmF0ZSBmaW5kTmV4dEVkaXRhYmxlKGN1cnJlbnQ6IEhUTUxFbGVtZW50LCBkaXJlY3Rpb246IERpcmVjdGlvbnMpOiBIVE1MRWxlbWVudCB8IG51bGwge1xuICAgICAgICBjb25zdCBhbGxFZGl0YWJsZXMgPSBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tjb250ZW50ZWRpdGFibGU9XCJ0cnVlXCJdJykpIGFzIEhUTUxFbGVtZW50W107XG4gICAgICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IGFsbEVkaXRhYmxlcy5pbmRleE9mKGN1cnJlbnQpO1xuXG4gICAgICAgIGlmIChjdXJyZW50LmNsb3Nlc3QoXCJ0ZFwiKSkge1xuICAgICAgICAgICAgY29uc3QgdGFibGUgPSBjdXJyZW50LmNsb3Nlc3QoXCJ0YWJsZVwiKTtcbiAgICAgICAgICAgIGNvbnN0IGNlbGwgPSBjdXJyZW50LmNsb3Nlc3QoXCJ0ZFwiKTtcbiAgICAgICAgICAgIGlmICh0YWJsZSAmJiBjZWxsKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmVpZ2hib3JDZWxsID0gVGFibGVVdGlscy5nZXROZWlnaGJvckNlbGwodGFibGUsIGNlbGwsIGRpcmVjdGlvbik7XG4gICAgICAgICAgICAgICAgaWYgKG5laWdoYm9yQ2VsbCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmVpZ2hib3JDZWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBuZXh0SW5kZXggPSAtMTtcbiAgICAgICAgaWYgKGRpcmVjdGlvbiA9PT0gRGlyZWN0aW9ucy5BcnJvd0xlZnQgfHwgZGlyZWN0aW9uID09PSBEaXJlY3Rpb25zLkFycm93UmlnaHQpIHtcbiAgICAgICAgICAgIG5leHRJbmRleCA9IGRpcmVjdGlvbiA9PT0gRGlyZWN0aW9ucy5BcnJvd0xlZnQgPyBjdXJyZW50SW5kZXggLSAxIDogY3VycmVudEluZGV4ICsgMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5leHRJbmRleCA9IHRoaXMuZmluZFZlcnRpY2FsRWRpdGFibGUoY3VycmVudCwgYWxsRWRpdGFibGVzLCBkaXJlY3Rpb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5leHRJbmRleCA8IDAgfHwgbmV4dEluZGV4ID49IGFsbEVkaXRhYmxlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsOyAvLyBQcmV2ZW50IHdyYXBhcm91bmRcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhbGxFZGl0YWJsZXNbbmV4dEluZGV4XSB8fCBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogRmluZHMgdGhlIG5leHQgY29udGVudGVkaXRhYmxlIGVsZW1lbnQgaW4gYSB2ZXJ0aWNhbCBkaXJlY3Rpb24gKHVwIG9yIGRvd24pIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IGVsZW1lbnQuXG4gICAgKiBJdCBjYWxjdWxhdGVzIHRoZSBjbG9zZXN0IGVkaXRhYmxlIGVsZW1lbnQgYmFzZWQgb24gdmVydGljYWwgZGlzdGFuY2UgYW5kIG1pbmltYWwgaG9yaXpvbnRhbCBzaGlmdCwgZmF2b3JpbmcgZWxlbWVudHMgZGlyZWN0bHkgYWJvdmUgb3IgYmVsb3cuXG4gICAgKiBcbiAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGN1cnJlbnQgLSBUaGUgY3VycmVudGx5IGZvY3VzZWQgY29udGVudGVkaXRhYmxlIGVsZW1lbnQuXG4gICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50W119IGFsbEVkaXRhYmxlcyAtIEFuIGFycmF5IG9mIGFsbCBjb250ZW50ZWRpdGFibGUgZWxlbWVudHMuXG4gICAgKiBAcGFyYW0ge0RpcmVjdGlvbnN9IGRpcmVjdGlvbiAtIFRoZSBkaXJlY3Rpb24gb2YgbmF2aWdhdGlvbiwgZWl0aGVyIHVwIG9yIGRvd24uXG4gICAgKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgaW5kZXggb2YgdGhlIGNsb3Nlc3QgdmVydGljYWwgZWRpdGFibGUgZWxlbWVudCBvciB0aGUgY3VycmVudCBpbmRleCBpZiBub25lIGFyZSBjbG9zZXIuXG4gICAgKi9cbiAgICBwcml2YXRlIGZpbmRWZXJ0aWNhbEVkaXRhYmxlKGN1cnJlbnQ6IEhUTUxFbGVtZW50LCBhbGxFZGl0YWJsZXM6IEhUTUxFbGVtZW50W10sIGRpcmVjdGlvbjogRGlyZWN0aW9ucyk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IGFsbEVkaXRhYmxlcy5pbmRleE9mKGN1cnJlbnQpO1xuICAgICAgICBjb25zdCBjdXJyZW50UmVjdCA9IGN1cnJlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGxldCBjbG9zZXN0SW5kZXggPSAtMTtcbiAgICAgICAgbGV0IGNsb3Nlc3REaXN0YW5jZSA9IEluZmluaXR5O1xuXG4gICAgICAgIGFsbEVkaXRhYmxlcy5mb3JFYWNoKChlZGl0YWJsZSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGlmIChlZGl0YWJsZSAhPT0gY3VycmVudCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlY3QgPSBlZGl0YWJsZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgICAgICBjb25zdCB2ZXJ0aWNhbERpc3RhbmNlID0gZGlyZWN0aW9uID09PSBEaXJlY3Rpb25zLkFycm93VXAgPyBjdXJyZW50UmVjdC50b3AgLSByZWN0LmJvdHRvbSA6IHJlY3QudG9wIC0gY3VycmVudFJlY3QuYm90dG9tO1xuICAgICAgICAgICAgICAgIGNvbnN0IGhvcml6b250YWxEaXN0YW5jZSA9IE1hdGguYWJzKGN1cnJlbnRSZWN0LmxlZnQgLSByZWN0LmxlZnQpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHZlcnRpY2FsRGlzdGFuY2UgPiAwICYmICh2ZXJ0aWNhbERpc3RhbmNlICsgaG9yaXpvbnRhbERpc3RhbmNlIDwgY2xvc2VzdERpc3RhbmNlKSkge1xuICAgICAgICAgICAgICAgICAgICBjbG9zZXN0RGlzdGFuY2UgPSB2ZXJ0aWNhbERpc3RhbmNlICsgaG9yaXpvbnRhbERpc3RhbmNlO1xuICAgICAgICAgICAgICAgICAgICBjbG9zZXN0SW5kZXggPSBpbmRleDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBjbG9zZXN0SW5kZXggPT09IC0xID8gY3VycmVudEluZGV4IDogY2xvc2VzdEluZGV4O1xuICAgIH1cblxuICAgIC8qKlxuICAgICogUGxhY2VzIHRoZSBjYXJldCBpbiBhIHBvc2l0aW9uIHdpdGhpbiB0aGUgbmV4dCBlbGVtZW50IHRoYXQgY2xvc2VseSBtYXRjaGVzIGl0cyBwb3NpdGlvbiBpbiB0aGUgY3VycmVudCBlbGVtZW50LlxuICAgICogVGhpcyBpcyB1c2VmdWwgd2hlbiBtb3ZpbmcgZm9jdXMgYmV0d2VlbiBjb250ZW50ZWRpdGFibGUgZWxlbWVudHMgdG8gbWFpbnRhaW4gYSBjb25zaXN0ZW50IHVzZXIgZXhwZXJpZW5jZS5cbiAgICAqIFxuICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gY3VycmVudCAtIFRoZSBjdXJyZW50IGNvbnRlbnRlZGl0YWJsZSBlbGVtZW50IHdoZXJlIHRoZSBjYXJldCBpcyBsb2NhdGVkLlxuICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gbmV4dCAtIFRoZSBuZXh0IGNvbnRlbnRlZGl0YWJsZSBlbGVtZW50IHRvIHdoaWNoIHRoZSBjYXJldCB3aWxsIG1vdmUuXG4gICAgKi9cbiAgICBwcml2YXRlIHBsYWNlQ2FyZXRJblNpbWlsYXJQb3NpdGlvbihjdXJyZW50OiBIVE1MRWxlbWVudCwgbmV4dDogSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgY29uc3Qgc2VsID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICAgICAgICBpZiAoc2VsICYmIHNlbC5yYW5nZUNvdW50ID4gMCkge1xuICAgICAgICAgICAgY29uc3QgY3VycmVudFJhbmdlID0gc2VsLmdldFJhbmdlQXQoMCk7XG4gICAgICAgICAgICBjb25zdCByZWN0ID0gY3VycmVudFJhbmdlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICAgICAgICBzZWwucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgICAgICAgICBjb25zdCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG5cbiAgICAgICAgICAgIGNvbnN0IHdhbGtlciA9IGRvY3VtZW50LmNyZWF0ZVRyZWVXYWxrZXIobmV4dCwgTm9kZUZpbHRlci5TSE9XX1RFWFQpO1xuICAgICAgICAgICAgbGV0IG5vZGUgPSB3YWxrZXIubmV4dE5vZGUoKTtcbiAgICAgICAgICAgIGxldCBiZXN0Tm9kZSA9IG5vZGU7XG4gICAgICAgICAgICBsZXQgYmVzdE9mZnNldCA9IDA7XG4gICAgICAgICAgICBsZXQgYmVzdERpc3RhbmNlID0gSW5maW5pdHk7XG5cbiAgICAgICAgICAgIGlmIChiZXN0Tm9kZSkge1xuICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFub2RlIHx8ICFub2RlLm5vZGVWYWx1ZSkgY29udGludWU7XG5cbiAgICAgICAgICAgICAgICAgICAgcmFuZ2Uuc2V0U3RhcnQobm9kZSwgMCk7XG4gICAgICAgICAgICAgICAgICAgIHJhbmdlLnNldEVuZChub2RlLCBub2RlLm5vZGVWYWx1ZS5sZW5ndGgpO1xuXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS5ub2RlVmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlLnNldFN0YXJ0KG5vZGUsIGkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UuY29sbGFwc2UodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZXN0UmVjdCA9IHJhbmdlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBob3Jpem9udGFsRGlzdGFuY2UgPSBNYXRoLmFicyh0ZXN0UmVjdC5sZWZ0IC0gcmVjdC5sZWZ0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChob3Jpem9udGFsRGlzdGFuY2UgPCBiZXN0RGlzdGFuY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZXN0RGlzdGFuY2UgPSBob3Jpem9udGFsRGlzdGFuY2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVzdE5vZGUgPSBub2RlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RPZmZzZXQgPSBpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSB3aGlsZSAobm9kZSA9IHdhbGtlci5uZXh0Tm9kZSgpKTtcblxuICAgICAgICAgICAgICAgIHJhbmdlLnNldFN0YXJ0KGJlc3ROb2RlLCBiZXN0T2Zmc2V0KTtcbiAgICAgICAgICAgICAgICByYW5nZS5jb2xsYXBzZSh0cnVlKTtcbiAgICAgICAgICAgICAgICBzZWwuYWRkUmFuZ2UocmFuZ2UpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByYW5nZS5zZWxlY3ROb2RlQ29udGVudHMobmV4dCk7XG4gICAgICAgICAgICAgICAgcmFuZ2UuY29sbGFwc2UodHJ1ZSk7XG4gICAgICAgICAgICAgICAgc2VsLmFkZFJhbmdlKHJhbmdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxufSIsImltcG9ydCAnLi9hc3NldHMvY3NzL21haW4uY3NzJztcclxuaW1wb3J0IHsgVUlCdWlsZGVyIH0gZnJvbSAnLi9idWlsZGVycy9VSUJ1aWxkZXInO1xyXG5pbXBvcnQgeyBDb21tYW5kRGlzcGF0Y2hlciB9IGZyb20gJy4vY29tbWFuZHMvQ29tbWFuZERpc3BhdGNoZXInO1xyXG5pbXBvcnQgeyBTaG9ydGN1dExpc3RlbmVycyB9IGZyb20gJy4vY29yZS9TaG9ydGN1dExpc3RlbmVycyc7XHJcbmltcG9ydCB7IFRhYmxlTGlzdGVuZXJzIH0gZnJvbSAnLi9jb3JlL2xpc3RlbmVycy9UYWJsZUxpc3RlbmVycyc7XHJcbmltcG9ydCB7IFF1aWNrTWVudSB9IGZyb20gJy4vY29tcG9uZW50cy9xdWljay1tZW51L1F1aWNrTWVudSc7XHJcbmltcG9ydCB7IERlcGVuZGVuY3lDb250YWluZXIgfSBmcm9tICcuL2NvcmUvRGVwZW5kZW5jeUNvbnRhaW5lcic7XHJcbmltcG9ydCB7IEZvY3VzU3RhY2sgfSBmcm9tICcuL2NvcmUvRm9jdXNTdGFjayc7XHJcbmltcG9ydCB7IEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL2Jsb2NrLW9wZXJhdGlvbnMvQmxvY2tPcGVyYXRpb25zU2VydmljZSc7XHJcbmltcG9ydCB7IEVsZW1lbnRGYWN0b3J5U2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvZWxlbWVudC1mYWN0b3J5L0VsZW1lbnRGYWN0b3J5U2VydmljZSc7XHJcbmltcG9ydCB7IFRleHRPcGVyYXRpb25zU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvdGV4dC1vcGVyYXRpb25zL1RleHRPcGVyYXRpb25zU2VydmljZSc7XHJcbmltcG9ydCB7IFRhYmxlT3BlcmF0aW9uc1NlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL3RhYmxlLW9wZXJhdGlvbnMvVGFibGVPcGVyYXRpb25zU2VydmljZSc7XHJcbmltcG9ydCB7IFRhYmxlQ29udGV4dEZsb2F0aW5nVG9vbGJhciB9IGZyb20gJy4vY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL1RhYmxlQ29udGV4dEZsb2F0aW5nVG9vbGJhcic7XHJcbmltcG9ydCB7IE1lbWVudG8gfSBmcm9tICcuL2NvcmUvTWVtZW50byc7XHJcbmltcG9ydCB7IEVkaXRhYmxlTmF2aWdhdGlvbiB9IGZyb20gJy4vY29yZS9FZGl0YWJsZU5hdmlnYXRpb24nO1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgc2NyaXB0IGluaXRpYWxpemVzIHRoZSBlZGl0b3IgYW5kIHNldHMgdXAgZXZlbnQgbGlzdGVuZXJzIG9uY2UgdGhlIERPTSBjb250ZW50IGhhcyBmdWxseSBsb2FkZWQuXHJcbiAqIEl0IGlzIHJlc3BvbnNpYmxlIGZvciBidWlsZGluZyB0aGUgdXNlciBpbnRlcmZhY2UgYW5kIHN0YXJ0aW5nIHRoZSBldmVudCBsaXN0ZW5pbmcgcHJvY2VzcyB0byBoYW5kbGUgY29tbWFuZHMuXHJcbiAqXHJcbiAqIFRoZSBgRE9NQ29udGVudExvYWRlZGAgZXZlbnQgZW5zdXJlcyB0aGF0IGFsbCB0aGUgRE9NIGNvbnRlbnQgaGFzIGJlZW4gZnVsbHkgcGFyc2VkIGFuZCBsb2FkZWQgYmVmb3JlIHRoZSBpbml0aWFsaXphdGlvbiBiZWdpbnMuXHJcbiAqIGBVSUJ1aWxkZXIuYnVpbGQoKS5zdGFydCgpO2AgaXMgdXNlZCB0byBjb25zdHJ1Y3QgYW5kIGFjdGl2YXRlIHRoZSB1c2VyIGludGVyZmFjZS5cclxuICogYENvbW1hbmREaXNwYXRjaGVyLmdldEluc3RhbmNlKCkubGlzdGVuKCk7YCByZXRyaWV2ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIENvbW1hbmREaXNwYXRjaGVyIGFuZCBzdGFydHMgbGlzdGVuaW5nIGZvciBldmVudHMuXHJcbiAqL1xyXG5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgZnVuY3Rpb24gKCkge1xyXG5cclxuICAgIERlcGVuZGVuY3lDb250YWluZXIuSW5zdGFuY2UucmVnaXN0ZXIoXCJJTWVtZW50b1wiLCAoKSA9PiBNZW1lbnRvLmdldEluc3RhbmNlKCkpO1xyXG4gICAgRGVwZW5kZW5jeUNvbnRhaW5lci5JbnN0YW5jZS5yZWdpc3RlcihcIklTaG9ydGN1dExpc3RlbmVyc1wiLCAoKSA9PiBTaG9ydGN1dExpc3RlbmVycy5nZXRJbnN0YW5jZSgpKTtcclxuICAgIERlcGVuZGVuY3lDb250YWluZXIuSW5zdGFuY2UucmVnaXN0ZXIoXCJJVGFibGVMaXN0ZW5lcnNcIiwgKCkgPT4gVGFibGVMaXN0ZW5lcnMuZ2V0SW5zdGFuY2UoKSk7XHJcblxyXG4gICAgRGVwZW5kZW5jeUNvbnRhaW5lci5JbnN0YW5jZS5yZWdpc3RlcihcIklGb2N1c1N0YWNrXCIsICgpID0+IEZvY3VzU3RhY2suZ2V0SW5zdGFuY2UoKSk7XHJcbiAgICBEZXBlbmRlbmN5Q29udGFpbmVyLkluc3RhbmNlLnJlZ2lzdGVyKFwiSUVsZW1lbnRGYWN0b3J5U2VydmljZVwiLCAoKSA9PiBFbGVtZW50RmFjdG9yeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKSk7XHJcbiAgICBEZXBlbmRlbmN5Q29udGFpbmVyLkluc3RhbmNlLnJlZ2lzdGVyKFwiSVRleHRPcGVyYXRpb25zU2VydmljZVwiLCAoKSA9PiBUZXh0T3BlcmF0aW9uc1NlcnZpY2UuZ2V0SW5zdGFuY2UoKSk7XHJcbiAgICBEZXBlbmRlbmN5Q29udGFpbmVyLkluc3RhbmNlLnJlZ2lzdGVyKFwiSVRhYmxlT3BlcmF0aW9uc1NlcnZpY2VcIiwgKCkgPT4gVGFibGVPcGVyYXRpb25zU2VydmljZS5nZXRJbnN0YW5jZSgpKTtcclxuICAgIERlcGVuZGVuY3lDb250YWluZXIuSW5zdGFuY2UucmVnaXN0ZXIoXCJJQmxvY2tPcGVyYXRpb25zU2VydmljZVwiLCAoKSA9PiBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLmdldEluc3RhbmNlKCkpO1xyXG5cclxuICAgIC8vVXNlckludGVyZmFjZVxyXG4gICAgRGVwZW5kZW5jeUNvbnRhaW5lci5JbnN0YW5jZS5yZWdpc3RlcihcIklRdWlja01lbnVcIiwgKCkgPT4gUXVpY2tNZW51LmdldEluc3RhbmNlKCkpO1xyXG4gICAgRGVwZW5kZW5jeUNvbnRhaW5lci5JbnN0YW5jZS5yZWdpc3RlcihcIklUYWJsZUNvbnRleHRGbG9hdGluZ1Rvb2xiYXJcIiwgKCkgPT4gVGFibGVDb250ZXh0RmxvYXRpbmdUb29sYmFyLmdldEluc3RhbmNlKCkpO1xyXG4gICAgRGVwZW5kZW5jeUNvbnRhaW5lci5JbnN0YW5jZS5yZWdpc3RlcihcIklFZGl0YWJsZU5hdmlnYXRpb25cIiwgKCkgPT4gRWRpdGFibGVOYXZpZ2F0aW9uLmdldEluc3RhbmNlKCkpO1xyXG5cclxuICAgIFVJQnVpbGRlci5idWlsZCgpLnN0YXJ0KCk7XHJcbiAgICBDb21tYW5kRGlzcGF0Y2hlci5nZXRJbnN0YW5jZSgpLmxpc3RlbigpO1xyXG4gICAgRWRpdGFibGVOYXZpZ2F0aW9uLmdldEluc3RhbmNlKCkubGlzdGVuKCk7XHJcbn0pOyJdLCJuYW1lcyI6WyJfX19DU1NfTE9BREVSX0VYUE9SVF9fXyIsInB1c2giLCJtb2R1bGUiLCJpZCIsImV4cG9ydHMiLCJjc3NXaXRoTWFwcGluZ1RvU3RyaW5nIiwibGlzdCIsInRvU3RyaW5nIiwidGhpcyIsIm1hcCIsIml0ZW0iLCJjb250ZW50IiwibmVlZExheWVyIiwiY29uY2F0IiwibGVuZ3RoIiwiam9pbiIsImkiLCJtb2R1bGVzIiwibWVkaWEiLCJkZWR1cGUiLCJzdXBwb3J0cyIsImxheWVyIiwidW5kZWZpbmVkIiwiYWxyZWFkeUltcG9ydGVkTW9kdWxlcyIsImsiLCJfayIsImNzc01hcHBpbmciLCJidG9hIiwiYmFzZTY0IiwidW5lc2NhcGUiLCJlbmNvZGVVUklDb21wb25lbnQiLCJKU09OIiwic3RyaW5naWZ5IiwiZGF0YSIsInNvdXJjZU1hcHBpbmciLCJzdHlsZXNJbkRPTSIsImdldEluZGV4QnlJZGVudGlmaWVyIiwiaWRlbnRpZmllciIsInJlc3VsdCIsIm1vZHVsZXNUb0RvbSIsIm9wdGlvbnMiLCJpZENvdW50TWFwIiwiaWRlbnRpZmllcnMiLCJiYXNlIiwiY291bnQiLCJpbmRleEJ5SWRlbnRpZmllciIsIm9iaiIsImNzcyIsInNvdXJjZU1hcCIsInJlZmVyZW5jZXMiLCJ1cGRhdGVyIiwiYWRkRWxlbWVudFN0eWxlIiwiYnlJbmRleCIsInNwbGljZSIsImFwaSIsImRvbUFQSSIsInVwZGF0ZSIsIm5ld09iaiIsInJlbW92ZSIsImxhc3RJZGVudGlmaWVycyIsIm5ld0xpc3QiLCJpbmRleCIsIm5ld0xhc3RJZGVudGlmaWVycyIsIl9pIiwiX2luZGV4IiwibWVtbyIsImluc2VydCIsInN0eWxlIiwidGFyZ2V0Iiwic3R5bGVUYXJnZXQiLCJkb2N1bWVudCIsInF1ZXJ5U2VsZWN0b3IiLCJ3aW5kb3ciLCJIVE1MSUZyYW1lRWxlbWVudCIsImNvbnRlbnREb2N1bWVudCIsImhlYWQiLCJlIiwiZ2V0VGFyZ2V0IiwiRXJyb3IiLCJhcHBlbmRDaGlsZCIsImVsZW1lbnQiLCJjcmVhdGVFbGVtZW50Iiwic2V0QXR0cmlidXRlcyIsImF0dHJpYnV0ZXMiLCJzdHlsZUVsZW1lbnQiLCJub25jZSIsInNldEF0dHJpYnV0ZSIsImluc2VydFN0eWxlRWxlbWVudCIsInN0eWxlVGFnVHJhbnNmb3JtIiwiYXBwbHkiLCJwYXJlbnROb2RlIiwicmVtb3ZlQ2hpbGQiLCJyZW1vdmVTdHlsZUVsZW1lbnQiLCJzdHlsZVNoZWV0IiwiY3NzVGV4dCIsImZpcnN0Q2hpbGQiLCJjcmVhdGVUZXh0Tm9kZSIsIl9fd2VicGFja19tb2R1bGVfY2FjaGVfXyIsIl9fd2VicGFja19yZXF1aXJlX18iLCJtb2R1bGVJZCIsImNhY2hlZE1vZHVsZSIsIl9fd2VicGFja19tb2R1bGVzX18iLCJuIiwiZ2V0dGVyIiwiX19lc01vZHVsZSIsImQiLCJhIiwiZGVmaW5pdGlvbiIsImtleSIsIm8iLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImVudW1lcmFibGUiLCJnZXQiLCJwcm9wIiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwibmMiLCJDb250ZW50VHlwZXMiLCJJY29ucyIsIkN1c3RvbUV2ZW50cyIsIkNvbG9ycyIsIkNvbW1hbmRzIiwiQ3VzdG9tVUlFdmVudHMiLCJCdXR0b25JRHMiLCJaSW5kZXgiLCJEZWZhdWx0SlNFdmVudHMiLCJEcm9wZG93bkl0ZW1JRHMiLCJEcm9wZG93bkxpc3RJRHMiLCJEcm9wZG93bk1lbnVJRHMiLCJsb2NhbHMiLCJVdGlscyIsImdlbmVyYXRlVW5pcXVlSWQiLCJ0aW1lUGFydCIsIkRhdGUiLCJub3ciLCJyYW5kb21BcnJheSIsIlVpbnQzMkFycmF5IiwiY3J5cHRvIiwiZ2V0UmFuZG9tVmFsdWVzIiwicmdiVG9IZXgiLCJyZ2IiLCJtYXRjaCIsIk51bWJlciIsIngiLCJoZXgiLCJFbGVtZW50RmFjdG9yeVNlcnZpY2UiLCJjcmVhdG9ycyIsInN0YXRpYyIsIkJMT0NLX1BBUkFHUkFQSCIsIlBBUkFHUkFQSCIsIkNIRUNLQk9YX0lURU0iLCJMSVNUX0lURU0iLCJDT0RFIiwiUVVPVEUiLCJCVUxMRVRFRF9MSVNUIiwiTlVNQkVSRURfTElTVCIsIkNIRUNLX0xJU1QiLCJIRUFERVJfMSIsIkhFQURFUl8yIiwiSEVBREVSXzMiLCJIRUFERVJfNCIsIkhFQURFUl81IiwiSEVBREVSXzYiLCJEUkFHX0hBTkRMRV9CVVRUT04iLCJUQUJMRSIsIklNQUdFIiwiQ0FMTE9VVCIsIl9pbnN0YW5jZSIsInJlZ2lzdGVyIiwiRUxFTUVOVF9UWVBFUyIsImJsb2NrUGFyYWdyYXBoQ3JlYXRvciIsInBhcmFncmFwaENyZWF0b3IiLCJjaGVja2JveEl0ZW1DcmVhdG9yIiwibGlzdEl0ZW1DcmVhdG9yIiwiY29kZUNyZWF0b3IiLCJxdW90ZUNyZWF0b3IiLCJjaGVja0xpc3RDcmVhdG9yIiwiYnVsbGV0ZWRMaXN0Q3JlYXRvciIsIm51bWJlcmVkTGlzdENyZWF0b3IiLCJoZWFkaW5nQ3JlYXRvciIsImRyYWdIYW5kbGVCdXR0b25DcmVhdG9yIiwidGFibGVDcmVhdG9yIiwiaW1hZ2VDcmVhdG9yMiIsImNhbGxvdXRDcmVhdG9yIiwiZ2V0SW5zdGFuY2UiLCJ0eXBlIiwiY3JlYXRvciIsImNyZWF0ZSIsIlR5cGVFcnJvciIsImJsb2NrUGFyYWdyYXBoIiwicGFyYWdyYXBoIiwibGV2ZWwiLCJoZWFkaW5nIiwiY2hlY2tib3hJdGVtIiwibGlzdEl0ZW1fMiIsImRyYWdIYW5kbGVCdXR0b24iLCJwcmUiLCJjb2RlIiwidGV4dENvbnRlbnQiLCJjb250ZW50RWRpdGFibGUiLCJjbGFzc0xpc3QiLCJhZGQiLCJibG9ja3F1b3RlIiwidWwiLCJDaGVja0xpc3QiLCJpbml0aWFsSXRlbSIsIkJ1bGxldGVkTGlzdCIsIk51bWJlcmVkTGlzdCIsInRhYmxlU2hlbGwiLCJ0YWJsZUNvbnRyb2xsZXIiLCJ0YWJsZVdyYXBwZXIiLCJ0YWJsZSIsIlRhYmxlIiwidGJvZHkiLCJyb3dEYXRhIiwic3BsaXQiLCJyb3ciLCJmb3JFYWNoIiwiY2VsbENvbnRlbnQiLCJjZWxsIiwiYWRkUm93IiwiaW5uZXJIVE1MIiwiYWRkQ29sdW1uIiwiaW1hZ2VDb250YWluZXIiLCJJbWFnZSIsIkFUVFJJQlVURV9OT0RFIiwidGV4dEFyZWEiLCJwYWRkaW5nIiwiYmFja2dyb3VuZENvbG9yIiwiY29sb3IiLCJkaXNwbGF5IiwiZ2FwIiwiYWxpZ25JdGVtcyIsImljb24iLCJzcGFuIiwiaW5uZXJUZXh0Iiwib3B0aW9uc0J1dHRvbiIsIm1vcmVPcHRpb25zQnV0dG9uIiwicG9zaXRpb24iLCJ0b3AiLCJyaWdodCIsImJvcmRlciIsImJhY2tncm91bmQiLCJjdXJzb3IiLCJpbWFnZUNyZWF0b3IiLCJpbWciLCJzcmMiLCJhbHQiLCJ3aWR0aCIsImhlaWdodCIsImFkZEV2ZW50TGlzdGVuZXIiLCJjb25zb2xlIiwibG9nIiwiY2FsbG91dCIsInAiLCJQYXJhZ3JhcGgiLCJoIiwiY2hlY2tib3giLCJkaXYiLCJuZXdEaXYiLCJuZXdFbGVtZW50IiwiYnV0dG9uIiwiZHJhZ2dhYmxlIiwiaWNvbklkIiwiQmFzZVVJQ29tcG9uZW50IiwiX2NhbkhpZGUiLCJwcm9wcyIsImh0bWxFbGVtZW50IiwicGFyZW50IiwiY29uc3RydWN0b3IiLCJpbml0IiwiYXBwZW5kVG8iLCJpc1Zpc2libGUiLCJ2aXNpYmlsaXR5IiwiY29udGFpbnMiLCJnZXRDb21wdXRlZFN0eWxlIiwicGFyZW50RWxlbWVudCIsInNob3ciLCJoaWRlIiwibG9ja0hpZGUiLCJ1bmxvY2tIaWRlIiwiY2FuSGlkZSIsInZhbHVlIiwiZm9jdXMiLCJjaGFuZ2VDb2xvciIsInJlbW92ZUNvbG9yIiwiY2hhbmdlVmlzaWJpbGl0eVRvVmlzaWJsZSIsImNoYW5nZVZpc2liaWxpdHlUb0hpZGRlbiIsImRvZXNFbGVtZW50T3ZlcmZsb3dTY3JlZW4iLCJvcmlnaW5hbERpc3BsYXkiLCJvcmlnaW5hbFZpc2liaWxpdHkiLCJvcmlnaW5hbFBvc2l0aW9uIiwiZWxlbWVudFJlY3QiLCJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLCJzY3JlZW5XaWR0aCIsImlubmVyV2lkdGgiLCJsZWZ0IiwiRGVwZW5kZW5jeUNvbnRhaW5lciIsImRlcGVuZGVuY2llcyIsIkluc3RhbmNlIiwiaW5zdGFuY2UiLCJyZXNvbHZlIiwiRWRpdG9yIiwiZWxlbWVudEZhY3RvcnlTZXJ2aWNlIiwibWVtZW50byIsInRpdGxlIiwiYWRkQmxvY2siLCJ0ZXh0RmxvYXRpbmdUb29sYmFyIiwicXVpY2tNZW51IiwidGFibGVDb250ZXh0VG9vbGJhciIsIm1lZGlhSW5wdXR0ZXIiLCJibG9ja09wZXJhdGlvbnNTZXJ2aWNlIiwiZmxvYXRpbmdUb29sYmFyIiwidGFibGVUb29sYmFyIiwic3VwZXIiLCJhdHRhY2hFdmVudHMiLCJzYXZlU3RhdGUiLCJnZXRFbGVtZW50QnlJZCIsImVkaXRvcklkIiwiZWRpdG9yQ29uZmlnIiwidGFibGVGbG9hdGluZ1Rvb2xiYXIiLCJjb250YWluZXIiLCJldmVudCIsIk5vZGUiLCJub2RlVHlwZSIsIlRFWFRfTk9ERSIsIkVsZW1lbnQiLCJibG9ja0VsZW1lbnQiLCJjbG9zZXN0IiwiYXBwZW5kRHJhZ0hhbmRsZXIiLCJlcnJvciIsInJlYWR5U3RhdGUiLCJmaXJzdFBhcmFncmFwaCIsImdldEF0dHJpYnV0ZSIsInByZXZlbnREZWZhdWx0IiwiY2xpcGJvYXJkRGF0YSIsInRleHQiLCJnZXREYXRhIiwiaW5zZXJ0VGV4dEF0Q3Vyc29yIiwiYXR0YWNoRHJhZ0hhbmRsZXIiLCJzZWwiLCJnZXRTZWxlY3Rpb24iLCJyYW5nZUNvdW50IiwicmFuZ2UiLCJnZXRSYW5nZUF0IiwiZGVsZXRlQ29udGVudHMiLCJ0ZXh0Tm9kZSIsImluc2VydE5vZGUiLCJzZXRTdGFydEFmdGVyIiwic2V0RW5kQWZ0ZXIiLCJyZW1vdmVBbGxSYW5nZXMiLCJhZGRSYW5nZSIsIkhUTUxFbGVtZW50IiwiZHJhZ0hhbmRsZXIiLCJwcmVwZW5kIiwicmVtb3ZlRHJhZ0hhbmRsZXIiLCJleHRyYWN0Q29udGVudCIsImRyYWdnZWRJdGVtIiwiZHJvcExpbmUiLCJzZXRUaW1lb3V0Iiwib3BhY2l0eSIsInJlbW92ZUF0dHJpYnV0ZSIsImJvdW5kaW5nIiwib2Zmc2V0IiwieSIsImNsaWVudFkiLCJuZXh0RWxlbWVudFNpYmxpbmciLCJpbnNlcnRBZGphY2VudEVsZW1lbnQiLCJwcmV2aW91c0VsZW1lbnRTaWJsaW5nIiwiaW5zZXJ0QmVmb3JlIiwiRE9NVXRpbHMiLCJpc1NlbGVjdGlvbkluVGFibGVDZWxsIiwic2VsZWN0aW9uIiwibm9kZSIsImFuY2hvck5vZGUiLCJFTEVNRU5UX05PREUiLCJ0YWdOYW1lIiwiZ2V0U2VsZWN0aW9uVGV4dEluZm8iLCJlbCIsInNlbFJhbmdlIiwidGVzdFJhbmdlIiwiYXRTdGFydCIsImF0RW5kIiwiY3JlYXRlUmFuZ2UiLCJzZWxlY3ROb2RlQ29udGVudHMiLCJzZXRFbmQiLCJzdGFydENvbnRhaW5lciIsInN0YXJ0T2Zmc2V0Iiwic2V0U3RhcnQiLCJlbmRDb250YWluZXIiLCJlbmRPZmZzZXQiLCJpbnNlcnRBZnRlciIsIm5ld05vZGUiLCJyZWZlcmVuY2VOb2RlIiwibmV4dFNpYmxpbmciLCJoYXNUZXh0Q29udGVudCIsInRyaW0iLCJoYXNDaGlsZE5vZGVzIiwiQXJyYXkiLCJmcm9tIiwiY2hpbGROb2RlcyIsInNvbWUiLCJjaGlsZE5vZGUiLCJjbG9uZUFuZEluc2VydEFmdGVyIiwiY2xvbmVkRWxlbWVudCIsImNsb25lTm9kZSIsImZpbmRDbG9zZXN0QW5jZXN0b3JPZkFjdGl2ZUVsZW1lbnRCeUNsYXNzIiwiY2xhc3NOYW1lIiwiYWN0aXZlRWxlbWVudCIsImN1cnJlbnRFbGVtZW50IiwiZmluZENsb3Nlc3RBbmNlc3Rvck9mU2VsZWN0aW9uQnlDbGFzcyIsImNvbW1vbkFuY2VzdG9yQ29udGFpbmVyIiwicmVhcnJhbmdlQ29udGVudEFmdGVyU3BsaXQiLCJjdXJyZW50Tm9kZSIsImN1cnNvclBvc2l0aW9uIiwiZ2V0Q3Vyc29yUG9zaXRpb24iLCJyYW5nZXMxIiwic3BsaXRDb250ZW50QXRDdXJzb3JTZWxlY3Rpb24iLCJkZWxldGVGcm9tRG9jdW1lbnQiLCJzZXRDdXJzb3JQb3NpdGlvbiIsInJhbmdlczIiLCJpbnRlcnNlY3RzTm9kZSIsInRyZWVXYWxrZXIiLCJjcmVhdGVUcmVlV2Fsa2VyIiwiTm9kZUZpbHRlciIsIlNIT1dfVEVYVCIsImFjY2VwdE5vZGUiLCJGSUxURVJfQUNDRVBUIiwiY2hhckNvdW50IiwibmV4dE5vZGUiLCJjdXJyZW50UG9zIiwidGV4dExlbmd0aCIsImNvbGxhcHNlIiwiZ2V0Q29udGVudFR5cGVGcm9tQWN0aXZlRWxlbWVudCIsImJsb2NrIiwiZ2V0Q3VycmVudEFjdGl2ZUJsb2NrIiwiY29udGVudEVsZW1lbnQiLCJyb290Tm9kZSIsInJhbmdlcyIsInJhbmdlQmVmb3JlIiwicmFuZ2VBZnRlciIsImxhc3RDaGlsZCIsInBsYWNlQ3Vyc29yQXRTdGFydE9mRWRpdGFibGVFbGVtZW50IiwiZWRpdGFibGVFbGVtZW50IiwiaXNDb250ZW50RWRpdGFibGUiLCJ3YXJuIiwicGxhY2VDdXJzb3JBdEVuZE9mRWRpdGFibGVFbGVtZW50IiwiY29udGVudEJsb2NrIiwicmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwibGFzdE5vZGUiLCJpc1NlbGVjdGVkVGV4dERlc2NlbmRhbnRPZiIsInBhcmVudFNlbGVjdG9yIiwicmVtb3ZlRmlsdGVyVGV4dCIsImxhc3RTbGFzaFBvc2l0aW9uIiwic3Vic3RyaW5nIiwibGFzdEluZGV4T2YiLCJmaW5kQ2xpY2tlZEVsZW1lbnRPckFuY2VzdG9yQnlEYXRhQ29udGVudFR5cGUiLCJkYXRhQ29udGVudFR5cGUiLCJjbGlja2VkRWxlbWVudCIsImRhdGFzZXQiLCJjb250ZW50VHlwZSIsImZpbmRDbGlja2VkRWxlbWVudE9yQW5jZXN0b3JCeUlkIiwiZmluZENsaWNrZWRFbGVtZW50T3JBbmNlc3RvckJ5Q2xhc3MiLCJjbGFzc0tleSIsIkNoYW5nZUNvbG9yIiwiU2hvd0hpZGVBY3RpdmVCdXR0b24iLCJpbnRlbnRpb24iLCJSZXNldEFjdGl2ZUJ1dHRvbnMiLCJDbG9zZUVsZW1lbnQiLCJTaG93RWxlbWVudCIsIkV2ZW50RW1pdHRlciIsImVtaXRTaG93RWxlbWVudEV2ZW50IiwidGFyZ2V0SWQiLCJjdXN0b21FdmVudCIsIkN1c3RvbUV2ZW50IiwiZGV0YWlsIiwiYWN0aW9uIiwiZGlzcGF0Y2hFdmVudCIsImVtaXRDbG9zZUVsZW1lbnRFdmVudCIsImVtaXRDaGFuZ2VDb21wb25lbnRDb2xvckV2ZW50IiwiQ29sb3JDaGFuZ2VSZXF1ZXN0IiwiZW1pdFNob3dIaWRlQWN0aXZlRWxlbWVudEV2ZW50IiwidGFyZ2V0Q2xhc3MiLCJpbnRlbnNpb24iLCJIaWxpdGVDb2xvck5vbmUiLCJGb3JlQ29sb3JJbml0aWFsIiwiQmFja2dyb3VuZENvbG9yTm9uZSIsImVtaXRSZXNldEFjdGl2ZUJ1dHRvbnNFbGVtZW50RXZlbnQiLCJlbWl0Q2hhbmdlVGFibGVCb3JkZXJDb2xvckV2ZW50Iiwic2NvcGUiLCJlbWl0dGVkQ29tbWFuZCIsImNvbW1hbmQiLCJjaGFuZ2VUYWJsZUJvcmRlckNvbG9yIiwiQmxvY2tPcGVyYXRpb25zU2VydmljZSIsImZvY3VzU3RhY2siLCJUVVJOX0lOVE8iLCJDUkVBVEVfREVGQVVMVF9CTE9DSyIsIkRFTEVURV9GT0NVU19PTl9QUkVWSU9VUyIsIkRFTEVURV9GT0NVU19PTl9ORVhUIiwiRk9DVVNfT05fRklSU1QiLCJGT0NVU19PTl9QUkVWSU9VUyIsIkZPQ1VTX09OX05FWFQiLCJERUxFVEUiLCJEVVBMSUNBVEUiLCJDT1BZIiwiUEFTVEUiLCJDVVQiLCJSRU1PVkVfRk9STUFUIiwiVFJBTlNGT1JNX0JMT0NLIiwiZXhlY0NvbW1hbmQiLCJzaG93VUkiLCJCTE9DS19PUEVSQVRJT05TIiwibmF2aWdhdG9yIiwiY2xpcGJvYXJkIiwid3JpdGVUZXh0Iiwic2VsZWN0ZWRUZXh0IiwidGhlbiIsImNvcGllZEV2ZW50IiwiYnViYmxlcyIsImNhbmNlbGFibGUiLCJjYXRjaCIsImVyciIsInJlYWRUZXh0IiwicGFzdGVkVGV4dCIsInNlbGVjdGlvbkV2ZW50IiwiZ2V0Q3VycmVudFNlbGVjdGVkQmxvY2siLCJ0cmFuc2Zvcm1CbG9jayIsImRlbGV0ZUFuZEZvY3VzT25OZXh0IiwiaGlkZUV2ZW50IiwiYmxvY2tEZWxldGVkIiwiZHVwbGljYXRlU2VsZWN0ZWRCbG9jayIsImNyZWF0ZURlZmF1bHRCbG9jayIsImRlbGV0ZUFuZEZvY3VzT25QcmV2aW91cyIsImZvY3VzT25QcmV2aW91cyIsImZvY3VzT25OZXh0IiwicXVlcnlDb21tYW5kU3RhdGUiLCJnZXREcmFnZ2FibGVFbGVtZW50RnJvbVNlbGVjdGlvbiIsInBlZWsiLCJuZXdDb250ZW50QmxvY2siLCJmb2N1c1N0YWNrVG9BZGQiLCJyZXBsYWNlQ2hpbGQiLCJmb2N1c2FibGUiLCJjcmVhdGVOZXdFbGVtZW50IiwiY3JlYXRlTGlzdEl0ZW0iLCJuZXdDb250ZW50RWxlbWVudCIsImNyZWF0ZU5ld0VsZW1lbnRBbmRTcGxpdENvbnRlbnQiLCJjdXJyZW50SXRlbSIsImNsb25lIiwiY29udGVudEN1cnJlbnQiLCJjb250ZW50Q2xvbmUiLCJwYXJlbnRCbG9jayIsImNvdW50ZXIiLCJxdWVyeVNlbGVjdG9yQWxsIiwibmV3UGFyYWdyYXBoIiwiY3VycmVudEJsb2NrIiwiY2xvbmVkQmxvY2siLCJldmVudFBhcmFncmFwaCIsIm5ld0Jsb2NrIiwiY3VycmVudEFjdGl2ZUVsZW1lbnQiLCJkZWxldGVUaGVDdXJyZW50RWxlbWVudEFuZFRoZURyYWdnYWJsZUJsb2NrSWZFbXB0eSIsImFjdHVhbEVsZW1lbnQiLCJmb2N1c2VkRWxlbWVudCIsInRvVXBwZXJDYXNlIiwicHJldmlvdXNFbGVtZW50IiwiYXBwbHlDdXJzb3JYRW5kUG9zaXRpb24iLCJzaWJsaW5nIiwiZm9jdXNhYmxlQ2FuZGlkYXRlcyIsIm5leHRFbGVtZW50IiwiYXBwbHlDdXJzb3JYU3RhcnRQb3NpdGlvbiIsImFjdHVhbCIsInhQb3NpdGlvbiIsImFkanVzdEN1cnNvck9mZnNldCIsIm5vZGVOYW1lIiwicHJldmlvdXNTaWJsaW5nIiwiY2xvc2VzdE5vZGUiLCJjbG9zZXN0T2Zmc2V0IiwiY2xvc2VzdERpZmYiLCJJbmZpbml0eSIsInJlY3QiLCJsZWZ0RGlmZiIsIk1hdGgiLCJhYnMiLCJyaWdodERpZmYiLCJtaW4iLCJnZXRDdXJyZW50U2VsZWN0ZWRGb2N1c2FibGUiLCJBZGRCbG9ja0J1dHRvbiIsIkFkZEJsb2NrV3JhcHBlciIsIlNpemVzIiwiU1ZHSWNvbiIsInVzZUVsZW1lbnQiLCJzaXplIiwiY3JlYXRlRWxlbWVudE5TIiwidXNlIiwic2V0QXR0cmlidXRlTlMiLCJzaXplcyIsInNldFVzZVRvIiwiQWRkQmxvY2tCdWlsZGVyIiwiYnVpbGQiLCJQbHVzIiwibWVkaXVtIiwiRHJvcGRvd25NZW51IiwiZHJvcGRvd25CdXR0b24iLCJkcm9wZG93bkxpc3QiLCJCYXNlRG91Ymx5TGlua2VkTGlzdCIsInRhaWwiLCJnZXRGaXJzdCIsImdldExhc3QiLCJTeW1ib2wiLCJpdGVyYXRvciIsImN1cnJlbnQiLCJjYWxsYmFjayIsImFueSIsInByZWRpY2F0ZSIsImZpbmRGaXJzdCIsImZpbmRMYXN0IiwicHJldmlvdXNOb2RlIiwiZmluZCIsIkpOb2RlIiwicGFyZW50TGlzdCIsInNldE5leHQiLCJzZXRQcmV2aW91cyIsImdldE5leHRTYXRpc2Z5aW5nIiwic3RhcnROb2RlIiwiZ2V0UHJldmlvdXNTYXRpc2Z5aW5nIiwiQ2lyY3VsYXJEb3VibHlMaW5rZWRMaXN0IiwiYXBwZW5kIiwiRHJvcGRvd25NZW51TGlzdEl0ZW0iLCJhY3RpdmVJY29uIiwibGVmdEljb24iLCJvbkZvY3VzRnVuY3Rpb25MaXN0Iiwib25Mb3NlRm9jdXNGdW5jdGlvbkxpc3QiLCJwYXJlbnREcm9wZG93bk1lbnVMaXN0Iiwic2hvcnRjdXQiLCJhdHRhY2hFdmVudCIsImFkZENsYXNzIiwiYXR0YWNoT25Gb2N1cyIsImZ1bmMiLCJhcmdzIiwiYXR0YWNoT25Mb3NlRm9jdXMiLCJyZW1vdmVGb2N1cyIsInRhYkluZGV4IiwidGV4dE9wdGlvbiIsInNob3J0Q3V0IiwiZW1pdENvbW1hbmRFdmVudCIsImFkZENzc0NsYXNzIiwidG9rZW5zIiwiYXR0YWNoVUlFdmVudCIsImFzeW5jIiwiZHJvcGRvd25JdGVtcyIsInN3aXRjaFZpc3VhbEZvY3VzIiwiaGFuZGxlU2hvd0hpZGVBY3RpdmVCdXR0b25FdmVudCIsImJpbmQiLCJoYW5kbGVSZXNldEFjdGl2ZUJ1dHRvbnNFdmVudCIsImRldGFpbHMiLCJpbmNsdWRlcyIsImV2ZW50VmFsdWVzIiwiZXZlbnRDb2xvciIsInRvTG93ZXJDYXNlIiwiRHJvcGRvd25NZW51TGlzdCIsInBhcmVudERyb3Bkb3duUGFyZW50QnV0dG9uIiwiY3VycmVudEZvY3VzZWRNZW51SXRlbSIsIm1heEhlaWdodCIsIm92ZXJmbG93WSIsImRyb3Bkb3duSXRlbSIsInNldFBhcmVudERyb3Bkb3duTWVudUJ1dHRvbiIsImRyb3Bkb3duUGFyZW50QnV0dG9uIiwiY2xpY2tlZE91dHNpZGVUaGVEcm9wZG93bldoaWxlRHJvcGRvd25Jc1Zpc2libGUiLCJrZXlQcmVzc2VkT3V0c2lkZVRoZURyb3Bkb3duV2hpbGVEcm9wZG93bklzVmlzaWJsZSIsImZvY3VzTmV4dFZpc2libGVJdGVtIiwiZm9jdXNQcmV2aW91c1Zpc2libGVJdGVtIiwic3ZnSWNvbiIsIm5leHRWaXNpYmxlSXRlbSIsInByZXZpb3VzVmlzaWJsZUl0ZW0iLCJGbG9hdGluZ1Rvb2xiYXJTZXBhcmF0b3IiLCJib3JkZXJSaWdodCIsIm1hcmdpbiIsIkJ1dHRvbkdyb3VwIiwiQnV0dG9uR3JvdXBJdGVtIiwidG9nZ2xlTGluayIsIkNvbG9ySWNvbiIsImJvcmRlclJhZGl1cyIsImJveFNpemluZyIsIkRyb3Bkb3duTWVudUJ1dHRvbiIsImluY2x1ZGVDaGV2cm9uSWNvbiIsInJvbGUiLCJEcm9wZG93bk1lbnVMaXN0SXRlbVRpdGxlIiwiY2hhbmdlQWN0aXZlSWNvblRvVmlzaWJsZSIsImdldExlZnRJY29uQmFja2dyb3VuZENvbG9yIiwicmVzZXRBY3RpdmVJY29uIiwiVGV4dE9wZXJhdGlvbnNTZXJ2aWNlIiwidGV4dE9wZXJhdGlvblNlcnZpY2UiLCJleGVjQm9sZCIsIkJvbGQiLCJJY29uQWN0aXZlQmx1ZSIsImV4ZWNJdGFsaWMiLCJJdGFsaWMiLCJleGVjU3RyaWtlVGhyb3VnaCIsIlN0cmlrZXRocm91Z2giLCJleGVjVW5kZXJsaW5lIiwiVW5kZXJsaW5lIiwiZXhlY0hpbGl0ZUNvbG9yIiwiZXhlY0ZvcmVDb2xvciIsInNob3dVaSIsIlByb21pc2UiLCJyZWplY3QiLCJ0b2dnbGVVbmRlcmxpbmUiLCJxdWVyeUFuY2hvciIsInRvZ2dsZUhpbGl0ZUNvbG9yIiwidG9nZ2xlRm9yZUNvbG9yIiwicXVlcnlGb3JlQ29sb3IiLCJxdWVyeUhpbGl0ZUNvbG9yIiwicXVlcnlDb21tYW5kU3RhdGVBIiwidG9nZ2xlQ29kZUV4ZWNDb21tYW5kIiwiY29udGFpbmVyTm9kZSIsImNvZGVFbGVtZW50IiwicmFuZ2VPZkNvZGUiLCJjb250ZW50QXNTdHJpbmciLCJYTUxTZXJpYWxpemVyIiwic2VyaWFsaXplVG9TdHJpbmciLCJjbG9uZUNvbnRlbnRzIiwiZXhwZWN0ZWRDb2xvciIsImZvbnRDb2xvciIsInJnYkNvbG9yIiwic3BhbldpdGhCYWNrZ3JvdW5kIiwiZ2V0SW5pdGlhbENvbG9yQXNIZXgiLCJ0ZW1wRWxlbWVudCIsImJvZHkiLCJjb21wdXRlZENvbG9yIiwiZ2V0VGFyZ2V0RWxlbWVudE1hcCIsImdldFNlbGVjdGVkSFRNTEVsZW1lbnQiLCJnZXRTZWxlY3RlZFRleHROb2RlcyIsInRleHROb2RlcyIsIm5vZGVJdGVyYXRvciIsImNyZWF0ZU5vZGVJdGVyYXRvciIsIkZJTFRFUl9SRUpFQ1QiLCJub2RlUmFuZ2UiLCJjb21wYXJlQm91bmRhcnlQb2ludHMiLCJSYW5nZSIsIkVORF9UT19TVEFSVCIsIlNUQVJUX1RPX0VORCIsImZpbmRDbG9zZXN0TWF0Y2hpbmdQYXJlbnQiLCJlbGVtIiwiY2xhc3NlcyIsImV2ZXJ5IiwiY2xzIiwiZXh0cmFjdFNlbGVjdGVkVGV4dCIsInN0YXJ0IiwiZW5kIiwiSW5wdXRMaW5rQm94IiwicGFyZW50V3JhcHBlciIsInBsYWNlaG9sZGVyIiwic2V0UGFyZW50V3JhcHBlciIsInN0b3BQcm9wYWdhdGlvbiIsInVybCIsIklucHV0TGlua0JveFdyYXBwZXIiLCJpbnB1dExpbmtCb3giLCJoaWdobGlnaHRzIiwiaGlnaGxpZ2h0U2VsZWN0ZWRUZXh0IiwicmVtb3ZlSGlnaGxpZ2h0cyIsInNob3dJbnB1dExpbmtCb3hGaW5pc2hlZCIsInJlY3RzIiwiZ2V0Q2xpZW50UmVjdHMiLCJoaWdobGlnaHQiLCJGbG9hdGluZ1Rvb2xiYXIiLCJkcm9wZG93bnMiLCJzZXBhcmF0b3JzIiwiY3VycmVudFNlbGVjdGlvblJhbmdlIiwiaW5wdXRMaW5rQm94V3JhcHBlciIsImh0bWxGb2N1c2VkRWxlbWVudEJlZm9yZU9wZW5RdWlja01lbnUiLCJzZWxlY3RXcmFwcGVyIiwiZWRpdG9yIiwiYW55RHJvcGRvd25WaXNpYmxlIiwiaGlkZUFsbERyb3Bkb3duVmlzaWJsZSIsImFwcGVuZERyb3Bkb3duIiwiZHJvcGRvd24iLCJhcHBlbmRCdXR0b25Hcm91cCIsImJ1dHRvbkdyb3VwIiwiYXBwZW5kU2VwYXJhdG9yIiwic2VwYXJhdG9yIiwiYXBwZW5kVGV4dFRvb2xiYXIiLCJyZXN0b3JlUmFuZ2VTZWxlY3Rpb24iLCJibG9ja1R5cGVDaGFuZ2VkIiwiaXNTZWxlY3Rpb25FbXB0eSIsIlRleHRDb250ZXh0RmxvYXRpbmdUb29sYmFyIiwidGV4dE9wZXJhdGlvbnNTZXJ2aWNlIiwiaW5pdGlhbFJlY3QiLCJ6SW5kZXgiLCJWZXJ5SW1wb3J0YW50IiwicHJvY2Vzc1NlbGVjdGlvbkNoYW5nZUVmZmVjdHMiLCJpc0JvbGQiLCJpc0l0YWxpYyIsImlzVW5kZXJsaW5lIiwiaXNTdHJpa2VUaHJvdWdoIiwiaGlsaXRlQ29sb3JzIiwiSGlsaXRlQ29sb3JSZWQiLCJIaWxpdGVDb2xvckdyZWVuIiwiSGlsaXRlQ29sb3JCbHVlIiwiSGlsaXRlQ29sb3JZZWxsb3ciLCJIaWxpdGVDb2xvckdyZXkiLCJmb3JlQ29sb3JzIiwiRm9yZUNvbG9yUmVkIiwiRm9yZUNvbG9yR3JlZW4iLCJGb3JlQ29sb3JCbHVlIiwiRm9yZUNvbG9yWWVsbG93IiwiRm9yZUNvbG9yR3JleSIsImVudHJpZXMiLCJhY3RpdmUiLCJJY29uRGVmYXVsdEJsYWNrIiwiU2VsZWN0aW9uQ2hhbmdlIiwiaXNTZWxlY3RpbmciLCJzaGlmdEtleSIsInNob3dIaWRlIiwic2hvdWxkVXBkYXRlUG9zaXRpb24iLCJjdXJyZW50UmVjdCIsImhhc0NvbnRlbnQiLCJoYXNTZWxlY3Rpb24iLCJ1cGRhdGVQb3NpdGlvbiIsImNoYW5nZVRvb2xiYXJQb3NpdGlvblRvQmVDbG9zZWRUb1NlbGVjdGlvbiIsImVsZW1lbnRXaWR0aCIsIm9mZnNldFdpZHRoIiwibGVmdFBvc2l0aW9uIiwic2Nyb2xsWCIsImVsZW1lbnRIZWlnaHQiLCJvZmZzZXRIZWlnaHQiLCJ0b3BQb3NpdGlvbiIsInNjcm9sbFkiLCJib3R0b20iLCJoaWRlVHVybkludG9Ecm9wZG93bklmSW5DZWxsIiwiaXNDZWxsIiwic2V0UG9zaXRpb24iLCJUZXh0Q29udGV4dEZsb2F0aW5nVG9vbGJhckJ1aWxkZXIiLCJmbG9hdGluZ0JhciIsInR1cm5JbnRvRHJvcGRvd24iLCJjb2xvckRyb3Bkb3duIiwibW9yZU9wdGlvbnNEcm9wZG93biIsInR1cm5JbnRvQmFyTGlzdCIsInR1cm5JbnRvQmFyQnV0dG9uIiwiU1ZHSWNvbnMiLCJ0b2RvX2xpc3QiLCJiX2xpc3QiLCJuX2xpc3QiLCJxdW90ZSIsImhlYWQxIiwiaGVhZDIiLCJoZWFkMyIsImhlYWQ0IiwiaGVhZDUiLCJoZWFkNiIsImdyb3VwQnV0dG9uIiwiTGluayIsImxhcmdlIiwidG9nZ2xlQm9sZCIsInRvZ2dsZUl0YWxpYyIsIklubGluZUNvZGUiLCJ0b2dnbGVJbmxpbmVDb2RlIiwidG9nZ2xlU3RyaWtlVGhyb3VnaCIsIlN0cmlrZVRocm91Z2giLCJjb2xvckRyb3Bkb3duTGlzdCIsIkNvbG9yVGV4dE9wdGlvblNlbGVjdCIsImNvbG9yQnV0dG9uIiwiQ29sb3JUZXh0T3B0aW9uc01lbnUiLCJoaWxpdGVDb2xvclJlZCIsIkJhY2tncm91bmRPcHRpb25SZWQiLCJCYWNrZ3JvdW5kT3B0aW9uR3JlZW4iLCJoaWxpdGVDb2xvckJsdWUiLCJCYWNrZ3JvdW5kT3B0aW9uQmx1ZSIsImhpbGl0ZUNvbG9yWWVsbG93IiwiQmFja2dyb3VuZE9wdGlvblllbGxvdyIsImhpbGl0ZUNvbG9yR3JleSIsIkJhY2tncm91bmRPcHRpb25HcmV5IiwiaGlsaXRlQ29sb3JOb25lIiwiQmFja2dyb3VuZE9wdGlvbk5vbmUiLCJmb3JlQ29sb3JSZWQiLCJmb3JlQ29sb3JHcmVlbiIsImZvcmVDb2xvckJsdWUiLCJmb3JlQ29sb3JZZWxsb3ciLCJmb3JlQ29sb3JHcmV5IiwiZm9yZUNvbG9yTm9uZSIsIm1vcmVPcHRpb25zTGlzdCIsImNvcHkiLCJjdXQiLCJwYXN0ZSIsImR1cGxpY2F0ZSIsImVyYXNlciIsImRlbGV0ZUl0ZW0iLCJkZWxldGUiLCJRdWlja01lbnVFbXB0eSIsImh0bWxFbXB0eUluZGljYXRvciIsIkRPTUVsZW1lbnRzIiwiRGlyZWN0aW9ucyIsIlRhYmxlU2NvcGVzIiwiS2V5Ym9hcmRLZXlzIiwiU2VsZWN0aW9uTW9kZXMiLCJUb29sYmFySURzIiwiQm91bmRhcmllcyIsIlF1aWNrTWVudSIsIm1lbnVTZWN0aW9ucyIsInF1aWNrTWVudUVtcHR5IiwiZmlsdGVySW5wdXQiLCJibG9ja09wdGlvbnMiLCJtZW51SXRlbSIsImJsb2NrT3BlcmF0aW9uU2VydmljZSIsImZvY3VzT25UaGVGaXJzdFZpc2libGVJdGVtIiwiZmlyc3RTZWN0aW9uTm9kZSIsImN1cnJlbnRTZWN0aW9uTm9kZSIsIml0ZW1Ob2RlIiwibWVudUl0ZW1zIiwicHJldmlvdXNWaXNpYmxlU2VjdGlvbk5vZGUiLCJpbW1lZGlhdGVQYXJlbnQiLCJzZWN0aW9uIiwibGFzdFZpc2libGVTZWN0aW9uTm9kZSIsIm5leHRWaXNpYmxlU2VjdGlvbk5vZGUiLCJmaXJzdFZpc2libGVTZWN0aW9uTm9kZSIsImZpbHRlckl0ZW1zIiwiZmlsdGVyU2VjdGlvbiIsInJlc3RvcmUiLCJjdHJsS2V5IiwiYWx0S2V5IiwidGVzdCIsInJlbW92ZUxhc3RGaWx0ZXJJbnB1dENoYXJhY3RlciIsImNvbmNhdEZpbHRlcklucHV0IiwiVEQiLCJibG9ja1R5cGUiLCJ0cmFuc2Zvcm1IdG1sRm9jdXNlZEVsZW1lbnRCZWZvcmVPcGVuUXVpY2tNZW51Iiwic3RnIiwic2xpY2UiLCJEb3VibHlMaW5rZWRMaXN0IiwiUXVpY2tNZW51U2VjdGlvbiIsInF1aWNrTWVudUluc3RhbmNlIiwiYXBwZW5kUXVpY2tNZW51SXRlbXMiLCJhcHBlbmRRdWlja01lbnVJdGVtIiwiZmlsdGVyVmFsdWUiLCJ0b0xvY2FsZUxvd2VyQ2FzZSIsIlF1aWNrTWVudUl0ZW0iLCJfYmxvY2tUeXBlIiwiX2ZpbHRlclZhbHVlIiwiX2ltbWVkaWF0ZVBhcmVudCIsImRlc2NyaXB0aW9uIiwib3B0aW9uSW1hZ2UiLCJzdmciLCJvcHRpb25UZXh0IiwiYmxvY2tUaXRsZSIsImJsb2NrRGVzY3JpcHRpb24iLCJRdWlja01lbnVCdWlsZGVyIiwiYmFzaWNCbG9ja3NTZWN0aW9uIiwiQ2FsbG91dCIsIm1lZGlhQmxvY2tzU2VjdGlvbiIsIlZpZGVvIiwiaGVhZGluZ0Jsb2Nrc1NlY3Rpb24iLCJsaXN0QmxvY2tzU2VjdGlvbiIsImVtYmVkU2VjdGlvbiIsIlRpdGxlIiwiaDEiLCJmb2N1c09uRmlyc3RSZXF1ZXN0ZWQiLCJUaXRsZUJ1aWxkZXIiLCJDb250ZW50IiwiY2xlYXJTZWxlY3Rpb25PbkRyYWciLCJyZVJlbmRlclBsYWNlaG9sZGVyIiwiY29weUVsZW1lbnRJdGVtIiwiYmxvY2tzIiwic3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uIiwiZm9jdXNPblByZXZpb3VzQmxvY2siLCJpc0N1cnNvckF0RW5kIiwiaXNDdXJzb3JBdFN0YXJ0IiwiaXNDdXJzb3JPbkxhc3RMaW5lIiwiaXNDdXJzb3JPbkZpcnN0TGluZSIsImluc2VydE5ldyIsImhhc0F0dHJpYnV0ZSIsImN1c3RvbVBsYWNlaG9sZGVyIiwiZm9jdXNhYmxlUGFyZW50IiwiZW5kTm9kZSIsImNvbGxhcHNlZCIsImlzQXRGaXJzdFZpc2libGVMaW5lIiwiY2xvbmVSYW5nZSIsImlzQXRMYXN0VmlzaWJsZUxpbmUiLCJkaWRDdXJzb3JNb3ZlIiwib3JpZ2luYWxSZWN0IiwibmV3UmVjdCIsImRpZE1vdmUiLCJDb250ZW50QnVpbGRlciIsIlRhYmxlVXRpbHMiLCJpbnNlcnRQb3NpdGlvbiIsInJvd3MiLCJuZXdSb3ciLCJpbnNlcnRSb3ciLCJudW1Db2x1bW5zIiwicmVkdWNlIiwibWF4IiwiY2VsbHMiLCJhZmZlY3RlZENlbGxzIiwiaW5zZXJ0Q2VsbCIsImlzTGFzdENvbHVtbiIsImNlbGxSb3ciLCJpc0xhc3RSb3ciLCJyZW1vdmVDb2x1bW5CeUNlbGwiLCJjb2x1bW5JbmRleCIsImNlbGxJbmRleCIsImRlbGV0ZUNlbGwiLCJyZW1vdmVSb3dCeUNlbGwiLCJkZWxldGVSb3ciLCJyb3dJbmRleCIsImdldEFjdGl2ZVRhYmxlQ2VsbCIsImdldExhc3RUYWJsZUNlbGwiLCJqIiwiZ2V0Rmlyc3RUYWJsZUNlbGwiLCJnZXROZWlnaGJvckNlbGwiLCJkaXJlY3Rpb24iLCJBcnJvd1JpZ2h0IiwiQXJyb3dMZWZ0IiwiQXJyb3dVcCIsIkFycm93RG93biIsImNoYW5nZUNlbGxCb3JkZXJDb2xvciIsImNlbGxzVG9DaGFuZ2UiLCJDb2x1bW4iLCJSb3ciLCJzZWxlY3RlZENlbGwiLCJDZWxsIiwiU2VsZWN0ZWRDZWxscyIsIlRhYmxlQ29udGV4dEZsb2F0aW5nVG9vbGJhciIsInNlbGVjdGVkQ2VsbHMiLCJhY3R1YWxGb2N1c2VkQ2VsbCIsInRhYmxlT3BlcmF0aW9uc1NlcnZpY2UiLCJjb250cm9sbGVyIiwic2VsZWN0aW9uTW9kZSIsIlRleHQiLCJzZWxlY3Rpb25GbGFnIiwiY2xlYXJBbmRIaWRlIiwiTW9kZXJhdGVseUltcG9ydGFudCIsIkFib3J0Q29udHJvbGxlciIsIk1vdXNlZG93biIsImhhbmRsZU1vdXNlRG93biIsIk1vdXNlbW92ZSIsImhhbmRsZU1vdXNlTW92ZSIsIk1vdXNldXAiLCJoYW5kbGVNb3VzZVVwIiwiS2V5ZG93biIsImhhbmRsZVN0YXJ0U2VsZWN0aW9uSW5DZWxsS2V5RG93biIsImhhbmRsZUNlbGxTZWxlY3Rpb25Db250aW51YXRpb25PbktleURvd24iLCJoYW5kbGVLZXlEb3duIiwiS2V5dXAiLCJoYW5kbGVLZXlVcCIsImFib3J0IiwiY2xlYXJBbGwiLCJhZGRTZWxlY3RlZENlbGwiLCJ1cGRhdGVTZWxlY3Rpb25Nb2RlQnlNb3VzZUV2ZW50IiwicmVzZXRTZWxlY3Rpb25TdGF0ZSIsIkVudGVyIiwibWV0YUtleSIsIkVzY2FwZSIsImN1cnJlbnRDZWxsIiwicmVwZWF0IiwiU2hpZnQiLCJzdGFydHNXaXRoIiwibmV4dENlbGwiLCJub3JtYWxpemVUZXh0IiwicmVwbGFjZSIsInVwZGF0ZVRoZVNlbGVjdGlvbk1vZGVCeUN1cnJlbnRTZWxlY3Rpb25TdGF0ZSIsImFjdHVhbFNlbGVjdGlvbiIsImN1cnJlbnRDZWxsVGV4dCIsImNlbGxSZWN0IiwibW91c2VYIiwiY2xpZW50WCIsIm1vdXNlWSIsImluZGV4T2YiLCJoYW5kbGVDbG9zZUVsZW1lbnRFdmVudCIsInJlc2V0QWJvcnRDb250cm9sbGVyIiwiY2hhbmdlVG9vbGJhclBvc2l0aW9uVG9CZUNsb3NlZFRvIiwiQmx1ciIsInNpZ25hbCIsImJhY2tncm91bmRDb2xvcnMiLCJCYWNrZ3JvdW5kQ29sb3JSZWQiLCJxdWVyeUFsbFN0YXRlQ2VsbEJhY2tncm91bmRDb2xvciIsIkJhY2tncm91bmRDb2xvckdyZWVuIiwiQmFja2dyb3VuZENvbG9yQmx1ZSIsIkJhY2tncm91bmRDb2xvclllbGxvdyIsIkJhY2tncm91bmRDb2xvckdyZXkiLCJUYWJsZUNvbnRleHRGbG9hdGluZ1Rvb2xiYXJCdWlsZGVyIiwidGFibGVPcGVyYXRpb25TZXJ2aWNlIiwidGFibGVPcHRpb25zIiwidGFibGVDb2xvckRyb3Bkb3duIiwiaW5zZXJ0VGFibGVDb2x1bW5MZWZ0IiwiQ29sdW1uTGVmdCIsImluc2VydFRhYmxlQ29sdW1uUmlnaHQiLCJDb2x1bW5SaWdodCIsImluc2VydFRhYmxlUm93QWJvdmUiLCJSb3dBYm92ZSIsImluc2VydFRhYmxlUm93QmVsb3ciLCJSb3dCZWxvdyIsImRlbGV0ZUNvbHVtbkl0ZW0iLCJyZW1vdmVDb2x1bW4iLCJkZWxldGVTd2VlcCIsImRlbGV0ZVJvd0l0ZW0iLCJyZW1vdmVSb3ciLCJjZWxsQmFja2dyb3VuZENvbG9yUmVkIiwidG9nZ2xlQ2VsbEhpbGl0ZUNvbG9yIiwiY2VsbEJhY2tncm91bmRDb2xvckdyZWVuIiwiY2VsbEJhY2tncm91bmRDb2xvckJsdWUiLCJjZWxsQmFja2dyb3VuZENvbG9yWWVsbG93IiwiY2VsbEJhY2tncm91bmRDb2xvckdyZXkiLCJjZWxsQmFja2dyb3VuZENvbG9yTm9uZSIsIk1lZGlhSW5wdXR0ZXIiLCJTbGlnaHRseUltcG9ydGFudCIsInVwbG9hZFRhYiIsImNyZWF0ZU5hdkl0ZW0iLCJlbWJlZFRhYiIsInVwbG9hZENvbnRlbnQiLCJjcmVhdGVVcGxvYWRDb250ZW50IiwiZW1iZWRDb250ZW50IiwiY3JlYXRlRW1iZWRDb250ZW50IiwibGkiLCJsYWJlbCIsInRleHRJbmZvIiwiaW5wdXQiLCJlbWJlZEdlbmVyaWMiLCJ1cmxPYmoiLCJVUkwiLCJkb21haW4iLCJob3N0bmFtZSIsInBhdGgiLCJwYXRobmFtZSIsImVtYmVkWW91VHViZVZpZGVvIiwiZW1iZWRZb3VUdWJlUGxheWxpc3QiLCJlbWJlZFNwb3RpZnlUcmFjayIsImVtYmVkU3BvdGlmeVBsYXlsaXN0IiwiZW1iZWRUd2VldCIsImVtYmVkR29vZ2xlTWFwIiwiZW1iZWRHaXN0IiwiZW1iZWRDb2RlcGVuIiwidmlkZW9JZCIsInNlYXJjaFBhcmFtcyIsImNyZWF0ZUVtYmVkQ29udGFpbmVyIiwiaWZyYW1lIiwiZnJhbWVCb3JkZXIiLCJhbGxvdyIsImFsbG93RnVsbHNjcmVlbiIsImZpbmFsaXplRW1iZWQiLCJsaXN0SWQiLCJ0cmFja0lkIiwicG9wIiwicGxheWxpc3RJZCIsInNjcmlwdCIsInF1ZXJ5U3RyaW5nIiwic2VhcmNoIiwibWF4V2lkdGgiLCJzZXJ2aWNlIiwiZ2lzdElkIiwib25sb2FkIiwib25lcnJvciIsInBhcnRzIiwidXNlciIsInBlbiIsImlucHV0VmFsdWUiLCJpbnB1dFRleHQiLCJoYW5kbGVTaG93RWxlbWVudEV2ZW50Iiwic2V0QWN0aXZlVGFiIiwiaGFuZGxlckV2ZW50IiwiQ2xpY2siLCJoYW5kbGVyQW5vdGhlckV2ZW50IiwiZW1iZWRJbWFnZSIsImVtYmVkVmlkZW8iLCJ2aWRlb0NvbnRhaW5lciIsImdldFRhYiIsInRhYklkIiwiZ2V0Q29udGVudCIsImNvbnRlbnRJZCIsImltYWdlUmVwbGFjZUVsZW1lbnQiLCJ2aWRlb1JlcGxhY2VFbGVtZW50IiwibGFzdEZvY3VzZWQiLCJNZWRpYUlucHV0dGVyQnVpbGRlciIsIkVkaXRvckJ1aWxkZXIiLCJVSUJ1aWxkZXIiLCJpbnNlcnRJY29ucyIsInN2Z0NvbnRhaW5lciIsIkNvbW1hbmREaXNwYXRjaGVyIiwibGlzdGVuIiwiaGFuZGxlQ29tbWFuZEV2ZW50IiwiaGFuZGxlRm9jdXNPbkZpcnN0UmVxdWVzdGVkRXZlbnQiLCJ0YXJnZXRCbG9ja1R5cGUiLCJleGVjVHJhbnNmb3JtQmxvY2siLCJkdXBsaWNhdGVCbG9jayIsImV4ZWNEdXBsaWNhdGVCbG9jayIsImRlbGV0ZUJsb2NrIiwiZXhlY0RlbGV0ZUJsb2NrIiwicmVtb3ZlRm9ybWF0IiwiZXhlY1JlbW92ZUZvcm1hdCIsImV4ZWNDcmVhdGVEZWZhdWx0QmxvY2siLCJleGVjSW5zZXJ0TmV3IiwiZXhlY0ZvY3VzT25QcmV2aW91c0Jsb2NrIiwiaW5zZXJ0Q29sdW1uTGVmdCIsImluc2VydENvbHVtblJpZ2h0IiwiaW5zZXJ0Um93QWJvdmUiLCJpbnNlcnRSb3dCZWxvdyIsImV4ZWNDZWxsQmFja2dyb3VuZENvbG9yIiwiU2hvcnRjdXRMaXN0ZW5lcnMiLCJzdGFydExpc3RlbiIsImdldE1vZGlmaWVyU3RhdGUiLCJpc051bVBhZCIsIm51bUxvY2tPbiIsImFsZXJ0IiwiVGFibGVMaXN0ZW5lcnMiLCJzaG93bkVsZW1lbnRzIiwiTWFwIiwiRm9jdXNTdGFjayIsInN0YWNrIiwiY2FwYWNpdHkiLCJzaGlmdCIsImNsZWFyIiwiVGFibGVPcGVyYXRpb25zU2VydmljZSIsImlzQWN0aXZlQ2VsbEJhY2tncm91bmRDb2xvciIsIlRhYmxlVG9vbGJhciIsImFjdGl2ZUNlbGwiLCJpc0NlbGxCYWNrZ3JvdW5kQ29sb3IiLCJ0YXJnZXRIZXhDb2xvciIsImN1cnJlbnRCYWNrZ3JvdW5kQ29sb3IiLCJnZXRQcm9wZXJ0eVZhbHVlIiwicXVlcnlTdGF0ZUNlbGxCYWNrZ3JvdW5kQ29sb3IiLCJlbGVtZW50cyIsImlzIiwiY2hpbGRyZW4iLCJzaG93SW5zZXJ0TGluZUVsZW1lbnQiLCJzaG93SW5zZXJ0Q29sdW1uRWxlbWVudCIsImhpZGVJbnNlcnRSb3dFbGVtZW50IiwiaGlkZUluc2VydENvbHVtbkVsZW1lbnQiLCJNZW1lbnRvIiwidW5kb1N0YWNrIiwicmVkb1N0YWNrIiwicXVlcnkiLCJ1bmRvIiwic3RhdGVUb1Jlc3RvcmUiLCJyZWRvIiwic3RhdGVUb0FwcGx5IiwiRWRpdGFibGVOYXZpZ2F0aW9uIiwiaGFuZGxlQXJyb3dLZXlzIiwiY3VycmVudEVkaXRhYmxlIiwic2hvdWxkU3dpdGNoRWRpdGFibGUiLCJuZXh0RWRpdGFibGUiLCJmaW5kTmV4dEVkaXRhYmxlIiwicGxhY2VDYXJldEluU2ltaWxhclBvc2l0aW9uIiwiaXNBdEZpcnN0TGluZSIsImlzQXRMaW5lQm91bmRhcnkiLCJGaXJzdCIsImlzQXRMYXN0TGluZSIsIkxhc3QiLCJib3VuZGFyeSIsImFsbEVkaXRhYmxlcyIsImN1cnJlbnRJbmRleCIsIm5laWdoYm9yQ2VsbCIsIm5leHRJbmRleCIsImZpbmRWZXJ0aWNhbEVkaXRhYmxlIiwiY2xvc2VzdEluZGV4IiwiY2xvc2VzdERpc3RhbmNlIiwiZWRpdGFibGUiLCJ2ZXJ0aWNhbERpc3RhbmNlIiwiaG9yaXpvbnRhbERpc3RhbmNlIiwibmV4dCIsIndhbGtlciIsImJlc3ROb2RlIiwiYmVzdE9mZnNldCIsImJlc3REaXN0YW5jZSIsIm5vZGVWYWx1ZSIsInRlc3RSZWN0Il0sInNvdXJjZVJvb3QiOiIifQ== \ No newline at end of file