verben-workflow-ui 0.2.2 → 0.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/components/workflow-designer/designer-canvas/designer-canvas.component.mjs +3 -3
- package/esm2022/lib/components/workflow-designer/stage-node/stage-node.component.mjs +9 -9
- package/esm2022/lib/components/workflow-designer/swimlane-dialog/swimlane-dialog.component.mjs +5 -1
- package/esm2022/lib/components/workflow-designer/workflow-designer.component.mjs +30 -4
- package/esm2022/lib/components/workflow-designer/workflow-designer.state.mjs +67 -142
- package/esm2022/lib/models/Workflow.mjs +1 -1
- package/esm2022/lib/services/http-web-request.service.mjs +2 -2
- package/fesm2022/verben-workflow-ui.mjs +109 -154
- package/fesm2022/verben-workflow-ui.mjs.map +1 -1
- package/lib/components/workflow-designer/stage-node/stage-node.component.d.ts +2 -2
- package/lib/components/workflow-designer/workflow-designer.component.d.ts +2 -1
- package/lib/components/workflow-designer/workflow-designer.state.d.ts +8 -0
- package/lib/models/Workflow.d.ts +1 -0
- package/package.json +1 -1
package/esm2022/lib/components/workflow-designer/designer-canvas/designer-canvas.component.mjs
CHANGED
|
@@ -510,11 +510,11 @@ export class DesignerCanvasComponent {
|
|
|
510
510
|
this.pendingConnectionSourceSwimlaneIndex = null;
|
|
511
511
|
}
|
|
512
512
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DesignerCanvasComponent, deps: [{ token: i1.WorkflowDesignerState }, { token: i2.WorkflowDataService }], target: i0.ɵɵFactoryTarget.Component });
|
|
513
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: DesignerCanvasComponent, selector: "lib-designer-canvas", inputs: { selectedTool: "selectedTool" }, outputs: { clickedPosition: "clickedPosition", subflowSelected: "subflowSelected", showStageDialog: "showStageDialog" }, host: { listeners: { "window:mouseup": "onWindowMouseUp($event)", "document:click": "onDocumentClick($event)" } }, viewQueries: [{ propertyName: "canvasRef", first: true, predicate: ["canvas"], descendants: true, static: true }], ngImport: i0, template: "<div class=\"canvas-container\">\n <svg\n #canvas\n [attr.width]=\"canvasWidth\"\n [attr.height]=\"canvasHeight\"\n class=\"designer-canvas\"\n (click)=\"onCanvasClick($event)\"\n >\n <defs>\n <!-- Grid pattern definition -->\n\n <pattern\n id=\"grid\"\n [attr.width]=\"gridSize\"\n [attr.height]=\"gridSize\"\n patternUnits=\"userSpaceOnUse\"\n >\n <path\n d=\"M 20 0 L 0 0 0 20\"\n fill=\"none\"\n stroke=\"#e2e8f0\"\n stroke-width=\"0.5\"\n />\n </pattern>\n\n <!-- Arrow head marker definition -->\n <marker\n id=\"arrowhead\"\n markerWidth=\"10\"\n markerHeight=\"7\"\n refX=\"9\"\n refY=\"3.5\"\n orient=\"auto\"\n >\n <polygon points=\"0 0, 10 3.5, 0 7\" fill=\"#D36CFF\" />\n </marker>\n\n <!-- Connection point styles -->\n <circle\n id=\"connection-point-template\"\n r=\"5\"\n fill=\"#D36CFF\"\n stroke=\"#FFFFFF\"\n stroke-width=\"1\"\n />\n\n <!-- Dashed line style for connection preview -->\n <pattern\n id=\"dashed-line\"\n width=\"10\"\n height=\"10\"\n patternUnits=\"userSpaceOnUse\"\n >\n <line\n x1=\"0\"\n y1=\"5\"\n x2=\"10\"\n y2=\"5\"\n stroke=\"#D36CFF\"\n stroke-width=\"2\"\n stroke-dasharray=\"5,5\"\n />\n </pattern>\n </defs>\n\n <!-- Background grid -->\n <rect width=\"100%\" height=\"100%\" fill=\"url(#grid)\" />\n\n <!-- Display a message when no swimlanes exist -->\n @if (state.swimlanes.length === 0) {\n <text\n x=\"50%\"\n y=\"50%\"\n font-family=\"sans-serif\"\n font-size=\"16\"\n fill=\"#94a3b8\"\n text-anchor=\"middle\"\n >\n Select the Swimlane tool and click on the canvas to add a swimlane\n </text>\n }\n\n <!-- This is where workflow elements will be added later -->\n @for (swimlane of state.swimlanes; track swimlane.order) {\n <g [attr.transform]=\"'translate(0,' + swimlane.order * 263 + ')'\">\n <!-- Swimlane container -->\n <rect\n x=\"0\"\n y=\"0\"\n [attr.width]=\"canvasWidth\"\n [attr.height]=\"263\"\n fill=\"#ffffff\"\n stroke=\"#e2e8f0\"\n stroke-width=\"1\"\n ></rect>\n\n <!-- Swimlane header -->\n <rect\n x=\"0\"\n y=\"0\"\n [attr.width]=\"canvasWidth\"\n height=\"40\"\n fill=\"#f8fafc\"\n stroke=\"#e2e8f0\"\n stroke-width=\"1\"\n ></rect>\n\n <!-- Swimlane label -->\n <text\n x=\"20\"\n y=\"25\"\n font-family=\"sans-serif\"\n font-size=\"14\"\n fill=\"#333333\"\n font-weight=\"bold\"\n >\n {{ swimlane.label }}\n </text>\n\n <!-- Edit button -->\n <g\n class=\"edit-swimlane-button\"\n [attr.transform]=\"'translate(200, 20)'\"\n (click)=\"\n onEditSwimlane($event, swimlane, swimlane.order);\n $event.stopPropagation()\n \"\n >\n <rect\n x=\"-5\"\n y=\"-15\"\n width=\"40\"\n height=\"20\"\n fill=\"#f3e8ff\"\n rx=\"3\"\n ry=\"3\"\n stroke=\"#d8b4fe\"\n stroke-width=\"1\"\n ></rect>\n <text\n x=\"15\"\n y=\"0\"\n font-family=\"sans-serif\"\n font-size=\"12\"\n fill=\"#7e22ce\"\n text-anchor=\"middle\"\n >\n Edit\n </text>\n </g>\n\n <!-- Tag indicators -->\n <g [attr.transform]=\"'translate(200, 20)'\">\n @for (tag of swimlane.tags.slice(0, 3); track tag.Name; let i = $index)\n {\n <text\n [attr.x]=\"i * 100\"\n y=\"5\"\n font-family=\"sans-serif\"\n font-size=\"12\"\n fill=\"#666666\"\n >\n {{ tag.Name }}\n </text>\n } @if (swimlane.tags.length > 3) {\n <text\n [attr.x]=\"3 * 100 + 10\"\n y=\"5\"\n font-family=\"sans-serif\"\n font-size=\"12\"\n fill=\"#666666\"\n >\n +{{ swimlane.tags.length - 3 }} more\n </text>\n }\n </g>\n\n <!-- Render nodes in this swimlane -->\n @for (node of swimlane.nodes; track node.id) {\n <g\n [attr.transform]=\"'translate(' + node.x + ',' + (node.y + 40) + ')'\"\n (mouseenter)=\"showConnectionPoints(node.id, swimlane.order)\"\n (mouseleave)=\"hideConnectionPoints(node.id)\"\n >\n <!-- Start node indicator (circle and arrow) for the first node -->\n @if (node.isStartNode) {\n <!-- Circle -->\n <circle\n cx=\"-30\"\n cy=\"50\"\n r=\"15\"\n fill=\"none\"\n stroke=\"#D36CFF\"\n stroke-width=\"1\"\n ></circle>\n <!-- Form icon for start node -->\n <svg:g\n (click)=\"\n toggleStartNodeFormPopup($event, node.x, node.y, swimlane.order)\n \"\n class=\"stage-icon\"\n transform=\"translate(-45, 42)\"\n style=\"cursor: pointer; pointer-events: all\"\n >\n <!-- Transparent rectangle to capture clicks -->\n <svg:rect\n x=\"-2\"\n y=\"-2\"\n width=\"24\"\n height=\"24\"\n fill=\"transparent\"\n style=\"cursor: pointer\"\n />\n <svg:path\n d=\"M16.5 20.475V17.475H13.5V16.475H16.5V13.475H17.5V16.475H20.5V17.475H17.5V20.475H16.5ZM3.5 17.5V16.5H4.5V17.5H3.5ZM6.5 17.5V16.5H11.517C11.5057 16.6767 11.5043 16.845 11.513 17.005C11.521 17.165 11.531 17.33 11.543 17.5H6.5ZM3.5 13.5V12.5H4.5V13.5H3.5ZM6.5 13.5V12.5H13.804C13.6127 12.6387 13.4333 12.7913 13.266 12.958C13.0993 13.1247 12.9377 13.3053 12.781 13.5H6.5ZM3.5 9.5V8.5H4.5V9.5H3.5ZM6.5 9.5V8.5H18.5V9.5H6.5ZM3.5 5.5V4.5H4.5V5.5H3.5ZM6.5 5.5V4.5H18.5V5.5H6.5Z\"\n [attr.fill]=\"state.workflowFormId ? '#D36CFF' : 'black'\"\n transform=\"scale(0.7)\"\n />\n </svg:g>\n <!-- Arrow from circle to node -->\n <path\n d=\"M -20 50 L 0 50\"\n stroke=\"#D36CFF\"\n stroke-width=\"1\"\n marker-end=\"url(#arrowhead)\"\n ></path>\n }\n\n <!-- Stage node -->\n @if (node.type === 'stage') {\n <!-- <rect\n x=\"0\"\n y=\"0\"\n [attr.width]=\"node.width\"\n [attr.height]=\"node.height\"\n fill=\"none\"\n stroke=\"#D36CFF\"\n stroke-width=\"1\"\n ></rect> -->\n <svg:g\n lib-stage-node\n [node]=\"node\"\n [isStartNode]=\"node.isStartNode\"\n (stagePropertiesUpdated)=\"onStagePropertiesUpdated($event)\"\n ></svg:g>\n }\n\n <!-- Decision node -->\n @if (node.type === 'decision') {\n <path\n [attr.d]=\"\n 'M 0 ' +\n node.height / 2 +\n ' L ' +\n node.width / 2 +\n ' 0' +\n ' L ' +\n node.width +\n ' ' +\n node.height / 2 +\n ' L ' +\n node.width / 2 +\n ' ' +\n node.height +\n ' Z'\n \"\n fill=\"none\"\n stroke=\"#D36CFF\"\n stroke-width=\"1\"\n ></path>\n }\n\n <!-- Form node -->\n @if (node.type === 'form') {\n <path\n d=\"M95.0625 50.5591V95.0625C95.0625 97.9716 93.9069 100.762 91.8498 102.819C89.7928 104.876 87.0028 106.031 84.0938 106.031H32.9062C29.9972 106.031 27.2072 104.876 25.1502 102.819C23.0931 100.762 21.9375 97.9716 21.9375 95.0625V21.9375C21.9375 19.0284 23.0931 16.2385 25.1502 14.1814C27.2072 12.1244 29.9972 10.9688 32.9062 10.9688H55.4722C57.4109 10.969 59.2701 11.7392 60.6412 13.1099L92.9213 45.3901C94.292 46.7611 95.0622 48.6204 95.0625 50.5591Z\"\n transform=\"scale(0.7)\"\n fill=\"none\"\n stroke=\"#D36CFF\"\n stroke-linejoin=\"round\"\n />\n <path\n d=\"M58.5 12.7969V40.2188C58.5 42.1581 59.2704 44.0181 60.6418 45.3895C62.0131 46.7608 63.8731 47.5312 65.8125 47.5312H93.2344\"\n transform=\"scale(0.7)\"\n stroke=\"#D36CFF\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n <text\n x=\"50%\"\n y=\"50%\"\n text-anchor=\"middle\"\n dominant-baseline=\"middle\"\n font-family=\"sans-serif\"\n font-size=\"14\"\n fill=\"#D36CFF\"\n >\n Form\n </text>\n }\n\n <!-- Subflow node -->\n @if (node.type === 'subflow') {\n <path\n [attr.d]=\"\n 'M 1 ' +\n node.height / 4 +\n ' L ' +\n node.width / 2 +\n ' 1 L ' +\n (node.width - 1) +\n ' ' +\n node.height / 4 +\n ' V ' +\n (node.height * 3) / 4 +\n ' L ' +\n node.width / 2 +\n ' ' +\n (node.height - 1) +\n ' L 1 ' +\n (node.height * 3) / 4 +\n ' Z'\n \"\n fill=\"none\"\n stroke=\"#D36CFF\"\n stroke-width=\"1\"\n ></path>\n <text\n x=\"50%\"\n y=\"50%\"\n text-anchor=\"middle\"\n dominant-baseline=\"middle\"\n font-family=\"sans-serif\"\n font-size=\"14\"\n fill=\"#000000\"\n >\n {{ node.workflowData?.name || \"Subflow\" }}\n </text>\n }\n\n <!-- Connection points for this node -->\n @for (point of node.connectionPoints || []; track point.id) { @if\n (isConnectionPointVisible(node.id)) {\n <use\n [attr.href]=\"'#connection-point-template'\"\n [attr.x]=\"point.x\"\n [attr.y]=\"point.y\"\n [attr.id]=\"point.id\"\n (mousedown)=\"startConnectionDrag($event, point, swimlane.order)\"\n />\n } }\n </g>\n <!-- A transparent hover area for improved hover detection -->\n <rect\n [attr.x]=\"node.x - 10\"\n [attr.y]=\"node.y + 40 - 10\"\n [attr.width]=\"node.width + 20\"\n [attr.height]=\"node.height + 20\"\n fill=\"transparent\"\n (mouseover)=\"showConnectionPoints(node.id, swimlane.order)\"\n (mouseout)=\"hideConnectionPoints(node.id)\"\n style=\"pointer-events: none\"\n />\n }\n </g>\n } @for (connection of state.connections; track connection.id) {\n <g>\n <path\n [attr.d]=\"getConnectionPathForSavedConnection(connection)\"\n stroke=\"#D36CFF\"\n stroke-width=\"2\"\n fill=\"none\"\n marker-end=\"url(#arrowhead)\"\n ></path>\n </g>\n }\n\n <!-- Connection preview line -->\n @if (state.isConnectionDragging()) {\n <g>\n <path\n [attr.d]=\"getConnectionPath()\"\n stroke=\"#D36CFF\"\n stroke-width=\"2\"\n stroke-dasharray=\"5,5\"\n fill=\"none\"\n ></path>\n </g>\n }\n </svg>\n\n <div\n *ngIf=\"popupVisible\"\n [style.position]=\"'absolute'\"\n [style.left.px]=\"popupX\"\n [style.top.px]=\"popupY\"\n >\n <verben-pop-Up\n [dropdownOpen]=\"true\"\n [customStyles]=\"{ 'z-index': '99' }\"\n [enableMouseLeave]=\"false\"\n >\n <div dropdown-trigger style=\"display: none\">\n <!-- Hidden trigger element -->\n </div>\n <div\n class=\"p-3 bg-white border border-gray-200 rounded shadow-md\"\n dropdown-content\n >\n <h4 class=\"mb-2 font-medium\">Create Connection</h4>\n <div class=\"flex flex-col gap-2\">\n <ng-container *ngFor=\"let type of allowedNodeTypes\">\n <button\n class=\"px-3 py-2 bg-white border border-gray-200 rounded text-sm hover:bg-gray-50\"\n (click)=\"createNodeConnection(type)\"\n >\n Create {{ type | titlecase }}\n </button>\n </ng-container>\n <button\n class=\"px-3 py-2 bg-white border border-gray-200 rounded text-sm hover:bg-gray-50\"\n (click)=\"hideConnectionPopup()\"\n >\n Cancel\n </button>\n </div>\n </div>\n </verben-pop-Up>\n </div>\n\n <div\n *ngIf=\"showStartNodeFormPopup\"\n [style.position]=\"'absolute'\"\n [style.left.px]=\"startNodeFormPopupX\"\n [style.top.px]=\"startNodeFormPopupY\"\n >\n <verben-pop-Up [dropdownOpen]=\"true\" [customStyles]=\"{ 'z-index': '100' }\">\n <div dropdown-trigger style=\"display: none\">\n <!-- Hidden trigger element -->\n </div>\n <div\n class=\"p-3 bg-white border border-gray-200 rounded shadow-md w-64\"\n dropdown-content\n style=\"background-color: white; z-index: 1000\"\n >\n <h4 class=\"mb-2 font-medium\">Select Workflow Form</h4>\n <div *ngIf=\"isLoadingStartNodeForms\" class=\"text-center py-2\">\n Loading forms...\n </div>\n <div *ngIf=\"!isLoadingStartNodeForms\" class=\"max-h-48 overflow-y-auto\">\n <div class=\"mb-2\">\n <button\n class=\"w-full px-3 py-2 bg-white border border-gray-200 rounded text-sm hover:bg-gray-50 text-left\"\n (click)=\"selectStartNodeForm(null)\"\n >\n Clear form selection\n </button>\n </div>\n <div *ngFor=\"let form of startNodeFormsList\" class=\"mb-1\">\n <button\n class=\"w-full px-3 py-2 bg-white border border-gray-200 rounded text-sm hover:bg-gray-50 text-left\"\n (click)=\"selectStartNodeForm(form)\"\n >\n {{ form.Name }}\n </button>\n </div>\n <div\n *ngIf=\"startNodeFormsList.length === 0\"\n class=\"text-center py-2 text-gray-500\"\n >\n No forms available\n </div>\n </div>\n </div>\n </verben-pop-Up>\n </div>\n\n <div\n *ngIf=\"showSubflowPopup\"\n [style.position]=\"'fiabsolutexed'\"\n [style.left.px]=\"subflowPopupX\"\n [style.top.px]=\"subflowPopupY\"\n >\n <verben-pop-Up [dropdownOpen]=\"true\" [customStyles]=\"{ 'z-index': '100' }\">\n <div dropdown-trigger style=\"display: none\">\n <!-- Hidden trigger element -->\n </div>\n <div\n class=\"p-3 bg-white border border-gray-200 rounded shadow-md w-64\"\n dropdown-content\n style=\"background-color: white; z-index: 1000\"\n >\n <h4 class=\"mb-2 font-medium\">Select Workflow</h4>\n <div *ngIf=\"isLoadingWorkflows\" class=\"text-center py-2\">\n Loading workflows...\n </div>\n <div *ngIf=\"!isLoadingWorkflows\" class=\"max-h-48 overflow-y-auto\">\n <div *ngFor=\"let workflow of workflowsList\" class=\"mb-1\">\n <button\n class=\"w-full px-3 py-2 bg-white border border-gray-200 rounded text-sm hover:bg-gray-50 text-left\"\n (click)=\"selectSubflowWorkflow(workflow)\"\n >\n {{ workflow.Name }}\n </button>\n </div>\n <div\n *ngIf=\"workflowsList.length === 0\"\n class=\"text-center py-2 text-gray-500\"\n >\n No workflows available\n </div>\n </div>\n </div>\n </verben-pop-Up>\n </div>\n</div>\n", styles: [".canvas-container{flex:1;overflow:auto;background-color:#fff}.designer-canvas{min-width:100%;min-height:100%;cursor:default}.designer-canvas:focus{outline:none}.edit-swimlane-button{cursor:pointer}.edit-swimlane-button:hover rect{fill:#ddd6fe}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.VerbenPopUpComponent, selector: "verben-pop-Up", inputs: ["dropdownOpen", "dropdownWidth", "color", "customStyles", "popUpClass", "border", "borderRadius", "enableMouseLeave"], outputs: ["dropdownOpenChange", "close"] }, { kind: "component", type: i5.StageNodeComponent, selector: "svg:g[lib-stage-node]", inputs: ["node", "isStartNode", "stageData"], outputs: ["stagePropertiesUpdated", "parallelExecutionToggled"] }, { kind: "pipe", type: i3.TitleCasePipe, name: "titlecase" }] });
|
|
513
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: DesignerCanvasComponent, selector: "lib-designer-canvas", inputs: { selectedTool: "selectedTool" }, outputs: { clickedPosition: "clickedPosition", subflowSelected: "subflowSelected", showStageDialog: "showStageDialog" }, host: { listeners: { "window:mouseup": "onWindowMouseUp($event)", "document:click": "onDocumentClick($event)" } }, viewQueries: [{ propertyName: "canvasRef", first: true, predicate: ["canvas"], descendants: true, static: true }], ngImport: i0, template: "<div class=\"canvas-container\">\n <svg\n #canvas\n [attr.width]=\"canvasWidth\"\n [attr.height]=\"canvasHeight\"\n class=\"designer-canvas\"\n (click)=\"onCanvasClick($event)\"\n >\n <defs>\n <!-- Grid pattern definition -->\n\n <pattern\n id=\"grid\"\n [attr.width]=\"gridSize\"\n [attr.height]=\"gridSize\"\n patternUnits=\"userSpaceOnUse\"\n >\n <path\n d=\"M 20 0 L 0 0 0 20\"\n fill=\"none\"\n stroke=\"#e2e8f0\"\n stroke-width=\"0.5\"\n />\n </pattern>\n\n <!-- Arrow head marker definition -->\n <marker\n id=\"arrowhead\"\n markerWidth=\"10\"\n markerHeight=\"7\"\n refX=\"9\"\n refY=\"3.5\"\n orient=\"auto\"\n >\n <polygon points=\"0 0, 10 3.5, 0 7\" fill=\"#D36CFF\" />\n </marker>\n\n <!-- Connection point styles -->\n <circle\n id=\"connection-point-template\"\n r=\"5\"\n fill=\"#D36CFF\"\n stroke=\"#FFFFFF\"\n stroke-width=\"1\"\n />\n\n <!-- Dashed line style for connection preview -->\n <pattern\n id=\"dashed-line\"\n width=\"10\"\n height=\"10\"\n patternUnits=\"userSpaceOnUse\"\n >\n <line\n x1=\"0\"\n y1=\"5\"\n x2=\"10\"\n y2=\"5\"\n stroke=\"#D36CFF\"\n stroke-width=\"2\"\n stroke-dasharray=\"5,5\"\n />\n </pattern>\n </defs>\n\n <!-- Background grid -->\n <rect width=\"100%\" height=\"100%\" fill=\"url(#grid)\" />\n\n <!-- Display a message when no swimlanes exist -->\n @if (state.swimlanes.length === 0) {\n <text\n x=\"50%\"\n y=\"50%\"\n font-family=\"sans-serif\"\n font-size=\"16\"\n fill=\"#94a3b8\"\n text-anchor=\"middle\"\n >\n Select the Swimlane tool and click on the canvas to add a swimlane\n </text>\n }\n\n <!-- This is where workflow elements will be added later -->\n @for (swimlane of state.swimlanes; track swimlane.order) {\n <g [attr.transform]=\"'translate(0,' + swimlane.order * 263 + ')'\">\n <!-- Swimlane container -->\n <rect\n x=\"0\"\n y=\"0\"\n [attr.width]=\"canvasWidth\"\n [attr.height]=\"263\"\n fill=\"#ffffff\"\n stroke=\"#e2e8f0\"\n stroke-width=\"1\"\n ></rect>\n\n <!-- Swimlane header -->\n <rect\n x=\"0\"\n y=\"0\"\n [attr.width]=\"canvasWidth\"\n height=\"40\"\n fill=\"#f8fafc\"\n stroke=\"#e2e8f0\"\n stroke-width=\"1\"\n ></rect>\n\n <!-- Swimlane label -->\n <text\n x=\"20\"\n y=\"25\"\n font-family=\"sans-serif\"\n font-size=\"14\"\n fill=\"#333333\"\n font-weight=\"bold\"\n >\n {{ swimlane.label }}\n </text>\n\n <!-- Edit button -->\n <g\n class=\"edit-swimlane-button\"\n [attr.transform]=\"'translate(100, 20)'\"\n (click)=\"\n onEditSwimlane($event, swimlane, swimlane.order);\n $event.stopPropagation()\n \"\n >\n <rect\n x=\"-5\"\n y=\"-15\"\n width=\"40\"\n height=\"20\"\n fill=\"#f3e8ff\"\n rx=\"3\"\n ry=\"3\"\n stroke=\"#d8b4fe\"\n stroke-width=\"1\"\n ></rect>\n <text\n x=\"15\"\n y=\"0\"\n font-family=\"sans-serif\"\n font-size=\"12\"\n fill=\"#7e22ce\"\n text-anchor=\"middle\"\n >\n Edit\n </text>\n </g>\n\n <!-- Tag indicators -->\n <g [attr.transform]=\"'translate(200, 20)'\">\n @for (tag of swimlane.tags.slice(0, 3); track tag.Name; let i = $index)\n {\n <text\n [attr.x]=\"i * 100\"\n y=\"5\"\n font-family=\"sans-serif\"\n font-size=\"12\"\n fill=\"#666666\"\n >\n {{ tag.Name }}\n </text>\n } @if (swimlane.tags.length > 3) {\n <text\n [attr.x]=\"3 * 100 + 10\"\n y=\"5\"\n font-family=\"sans-serif\"\n font-size=\"12\"\n fill=\"#666666\"\n >\n +{{ swimlane.tags.length - 3 }} more\n </text>\n }\n </g>\n\n <!-- Render nodes in this swimlane -->\n @for (node of swimlane.nodes; track node.id) {\n <g\n [attr.transform]=\"'translate(' + node.x + ',' + (node.y + 40) + ')'\"\n (mouseenter)=\"showConnectionPoints(node.id, swimlane.order)\"\n (mouseleave)=\"hideConnectionPoints(node.id)\"\n >\n <!-- Start node indicator (circle and arrow) for the first node -->\n @if (node.isStartNode) {\n <!-- Circle -->\n <circle\n cx=\"-30\"\n cy=\"50\"\n r=\"15\"\n fill=\"none\"\n stroke=\"#D36CFF\"\n stroke-width=\"1\"\n ></circle>\n <!-- Form icon for start node -->\n <svg:g\n (click)=\"\n toggleStartNodeFormPopup($event, node.x, node.y, swimlane.order)\n \"\n class=\"stage-icon\"\n transform=\"translate(-45, 42)\"\n style=\"cursor: pointer; pointer-events: all\"\n >\n <!-- Transparent rectangle to capture clicks -->\n <svg:rect\n x=\"-2\"\n y=\"-2\"\n width=\"24\"\n height=\"24\"\n fill=\"transparent\"\n style=\"cursor: pointer\"\n />\n <svg:path\n d=\"M16.5 20.475V17.475H13.5V16.475H16.5V13.475H17.5V16.475H20.5V17.475H17.5V20.475H16.5ZM3.5 17.5V16.5H4.5V17.5H3.5ZM6.5 17.5V16.5H11.517C11.5057 16.6767 11.5043 16.845 11.513 17.005C11.521 17.165 11.531 17.33 11.543 17.5H6.5ZM3.5 13.5V12.5H4.5V13.5H3.5ZM6.5 13.5V12.5H13.804C13.6127 12.6387 13.4333 12.7913 13.266 12.958C13.0993 13.1247 12.9377 13.3053 12.781 13.5H6.5ZM3.5 9.5V8.5H4.5V9.5H3.5ZM6.5 9.5V8.5H18.5V9.5H6.5ZM3.5 5.5V4.5H4.5V5.5H3.5ZM6.5 5.5V4.5H18.5V5.5H6.5Z\"\n [attr.fill]=\"state.workflowFormId ? '#D36CFF' : 'black'\"\n transform=\"scale(0.7)\"\n />\n </svg:g>\n <!-- Arrow from circle to node -->\n <path\n d=\"M -20 50 L 0 50\"\n stroke=\"#D36CFF\"\n stroke-width=\"1\"\n marker-end=\"url(#arrowhead)\"\n ></path>\n }\n\n <!-- Stage node -->\n @if (node.type === 'stage') {\n <!-- <rect\n x=\"0\"\n y=\"0\"\n [attr.width]=\"node.width\"\n [attr.height]=\"node.height\"\n fill=\"none\"\n stroke=\"#D36CFF\"\n stroke-width=\"1\"\n ></rect> -->\n <svg:g\n lib-stage-node\n [node]=\"node\"\n [isStartNode]=\"node.isStartNode\"\n (stagePropertiesUpdated)=\"onStagePropertiesUpdated($event)\"\n ></svg:g>\n }\n\n <!-- Decision node -->\n @if (node.type === 'decision') {\n <path\n [attr.d]=\"\n 'M 0 ' +\n node.height / 2 +\n ' L ' +\n node.width / 2 +\n ' 0' +\n ' L ' +\n node.width +\n ' ' +\n node.height / 2 +\n ' L ' +\n node.width / 2 +\n ' ' +\n node.height +\n ' Z'\n \"\n fill=\"none\"\n stroke=\"#D36CFF\"\n stroke-width=\"1\"\n ></path>\n }\n\n <!-- Form node -->\n @if (node.type === 'form') {\n <path\n d=\"M95.0625 50.5591V95.0625C95.0625 97.9716 93.9069 100.762 91.8498 102.819C89.7928 104.876 87.0028 106.031 84.0938 106.031H32.9062C29.9972 106.031 27.2072 104.876 25.1502 102.819C23.0931 100.762 21.9375 97.9716 21.9375 95.0625V21.9375C21.9375 19.0284 23.0931 16.2385 25.1502 14.1814C27.2072 12.1244 29.9972 10.9688 32.9062 10.9688H55.4722C57.4109 10.969 59.2701 11.7392 60.6412 13.1099L92.9213 45.3901C94.292 46.7611 95.0622 48.6204 95.0625 50.5591Z\"\n transform=\"scale(0.7)\"\n fill=\"none\"\n stroke=\"#D36CFF\"\n stroke-linejoin=\"round\"\n />\n <path\n d=\"M58.5 12.7969V40.2188C58.5 42.1581 59.2704 44.0181 60.6418 45.3895C62.0131 46.7608 63.8731 47.5312 65.8125 47.5312H93.2344\"\n transform=\"scale(0.7)\"\n stroke=\"#D36CFF\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n <text\n x=\"50%\"\n y=\"50%\"\n text-anchor=\"middle\"\n dominant-baseline=\"middle\"\n font-family=\"sans-serif\"\n font-size=\"14\"\n fill=\"#D36CFF\"\n >\n Form\n </text>\n }\n\n <!-- Subflow node -->\n @if (node.type === 'subflow') {\n <path\n [attr.d]=\"\n 'M 1 ' +\n node.height / 4 +\n ' L ' +\n node.width / 2 +\n ' 1 L ' +\n (node.width - 1) +\n ' ' +\n node.height / 4 +\n ' V ' +\n (node.height * 3) / 4 +\n ' L ' +\n node.width / 2 +\n ' ' +\n (node.height - 1) +\n ' L 1 ' +\n (node.height * 3) / 4 +\n ' Z'\n \"\n fill=\"none\"\n stroke=\"#D36CFF\"\n stroke-width=\"1\"\n ></path>\n <text\n [attr.x]=\"node.width / 2\"\n [attr.y]=\"node.height / 2\"\n text-anchor=\"middle\"\n alignment-baseline=\"middle\"\n font-family=\"sans-serif\"\n font-size=\"10\"\n fill=\"#000000\"\n >\n <!-- Limit text length -->\n {{\n (node.workflowData?.name || \"Subflow\").length > 12\n ? (node.workflowData?.name || \"Subflow\").substring(0, 10) + \"...\"\n : node.workflowData?.name || \"Subflow\"\n }}\n </text>\n }\n\n <!-- Connection points for this node -->\n @for (point of node.connectionPoints || []; track point.id) { @if\n (isConnectionPointVisible(node.id)) {\n <use\n [attr.href]=\"'#connection-point-template'\"\n [attr.x]=\"point.x\"\n [attr.y]=\"point.y\"\n [attr.id]=\"point.id\"\n (mousedown)=\"startConnectionDrag($event, point, swimlane.order)\"\n />\n } }\n </g>\n <!-- A transparent hover area for improved hover detection -->\n <rect\n [attr.x]=\"node.x - 10\"\n [attr.y]=\"node.y + 40 - 10\"\n [attr.width]=\"node.width + 20\"\n [attr.height]=\"node.height + 20\"\n fill=\"transparent\"\n (mouseover)=\"showConnectionPoints(node.id, swimlane.order)\"\n (mouseout)=\"hideConnectionPoints(node.id)\"\n style=\"pointer-events: none\"\n />\n }\n </g>\n } @for (connection of state.connections; track connection.id) {\n <g>\n <path\n [attr.d]=\"getConnectionPathForSavedConnection(connection)\"\n stroke=\"#D36CFF\"\n stroke-width=\"2\"\n fill=\"none\"\n marker-end=\"url(#arrowhead)\"\n ></path>\n </g>\n }\n\n <!-- Connection preview line -->\n @if (state.isConnectionDragging()) {\n <g>\n <path\n [attr.d]=\"getConnectionPath()\"\n stroke=\"#D36CFF\"\n stroke-width=\"2\"\n stroke-dasharray=\"5,5\"\n fill=\"none\"\n ></path>\n </g>\n }\n </svg>\n\n <div\n *ngIf=\"popupVisible\"\n [style.position]=\"'absolute'\"\n [style.left.px]=\"popupX\"\n [style.top.px]=\"popupY\"\n >\n <verben-pop-Up\n [dropdownOpen]=\"true\"\n [customStyles]=\"{ 'z-index': '99' }\"\n [enableMouseLeave]=\"false\"\n >\n <div dropdown-trigger style=\"display: none\">\n <!-- Hidden trigger element -->\n </div>\n <div\n class=\"p-3 bg-white border border-gray-200 rounded shadow-md\"\n dropdown-content\n >\n <h4 class=\"mb-2 font-medium\">Create Connection</h4>\n <div class=\"flex flex-col gap-2\">\n <ng-container *ngFor=\"let type of allowedNodeTypes\">\n <button\n class=\"px-3 py-2 bg-white border border-gray-200 rounded text-sm hover:bg-gray-50\"\n (click)=\"createNodeConnection(type)\"\n >\n Create {{ type | titlecase }}\n </button>\n </ng-container>\n <button\n class=\"px-3 py-2 bg-white border border-gray-200 rounded text-sm hover:bg-gray-50\"\n (click)=\"hideConnectionPopup()\"\n >\n Cancel\n </button>\n </div>\n </div>\n </verben-pop-Up>\n </div>\n\n <div\n *ngIf=\"showStartNodeFormPopup\"\n [style.position]=\"'absolute'\"\n [style.left.px]=\"startNodeFormPopupX\"\n [style.top.px]=\"startNodeFormPopupY\"\n >\n <verben-pop-Up [dropdownOpen]=\"true\" [customStyles]=\"{ 'z-index': '100' }\">\n <div dropdown-trigger style=\"display: none\">\n <!-- Hidden trigger element -->\n </div>\n <div\n class=\"p-3 bg-white border border-gray-200 rounded shadow-md w-64\"\n dropdown-content\n style=\"background-color: white; z-index: 1000\"\n >\n <h4 class=\"mb-2 font-medium\">Select Workflow Form</h4>\n <div *ngIf=\"isLoadingStartNodeForms\" class=\"text-center py-2\">\n Loading forms...\n </div>\n <div *ngIf=\"!isLoadingStartNodeForms\" class=\"max-h-48 overflow-y-auto\">\n <div class=\"mb-2\">\n <button\n class=\"w-full px-3 py-2 bg-white border border-gray-200 rounded text-sm hover:bg-gray-50 text-left\"\n (click)=\"selectStartNodeForm(null)\"\n >\n Clear form selection\n </button>\n </div>\n <div *ngFor=\"let form of startNodeFormsList\" class=\"mb-1\">\n <button\n class=\"w-full px-3 py-2 bg-white border border-gray-200 rounded text-sm hover:bg-gray-50 text-left\"\n (click)=\"selectStartNodeForm(form)\"\n >\n {{ form.Name }}\n </button>\n </div>\n <div\n *ngIf=\"startNodeFormsList.length === 0\"\n class=\"text-center py-2 text-gray-500\"\n >\n No forms available\n </div>\n </div>\n </div>\n </verben-pop-Up>\n </div>\n\n <div\n *ngIf=\"showSubflowPopup\"\n [style.position]=\"'absolute'\"\n [style.left.px]=\"subflowPopupX\"\n [style.top.px]=\"subflowPopupY\"\n >\n <verben-pop-Up [dropdownOpen]=\"true\" [customStyles]=\"{ 'z-index': '100' }\">\n <div dropdown-trigger style=\"display: none\">\n <!-- Hidden trigger element -->\n </div>\n <div\n class=\"p-3 bg-white border border-gray-200 rounded shadow-md w-64\"\n dropdown-content\n style=\"background-color: white; z-index: 1000\"\n >\n <h4 class=\"mb-2 font-medium\">Select Workflow</h4>\n <div *ngIf=\"isLoadingWorkflows\" class=\"text-center py-2\">\n Loading workflows...\n </div>\n <div *ngIf=\"!isLoadingWorkflows\" class=\"max-h-48 overflow-y-auto\">\n <div *ngFor=\"let workflow of workflowsList\" class=\"mb-1\">\n <button\n class=\"w-full px-3 py-2 bg-white border border-gray-200 rounded text-sm hover:bg-gray-50 text-left\"\n (click)=\"selectSubflowWorkflow(workflow)\"\n >\n {{ workflow.Name }}\n </button>\n </div>\n <div\n *ngIf=\"workflowsList.length === 0\"\n class=\"text-center py-2 text-gray-500\"\n >\n No workflows available\n </div>\n </div>\n </div>\n </verben-pop-Up>\n </div>\n</div>\n", styles: [".canvas-container{flex:1;overflow:auto;background-color:#fff}.designer-canvas{min-width:100%;min-height:100%;cursor:default}.designer-canvas:focus{outline:none}.edit-swimlane-button{cursor:pointer}.edit-swimlane-button:hover rect{fill:#ddd6fe}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.VerbenPopUpComponent, selector: "verben-pop-Up", inputs: ["dropdownOpen", "dropdownWidth", "color", "customStyles", "popUpClass", "border", "borderRadius", "enableMouseLeave"], outputs: ["dropdownOpenChange", "close"] }, { kind: "component", type: i5.StageNodeComponent, selector: "svg:g[lib-stage-node]", inputs: ["node", "isStartNode", "stageData"], outputs: ["stagePropertiesUpdated", "parallelExecutionToggled"] }, { kind: "pipe", type: i3.TitleCasePipe, name: "titlecase" }] });
|
|
514
514
|
}
|
|
515
515
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DesignerCanvasComponent, decorators: [{
|
|
516
516
|
type: Component,
|
|
517
|
-
args: [{ selector: 'lib-designer-canvas', template: "<div class=\"canvas-container\">\n <svg\n #canvas\n [attr.width]=\"canvasWidth\"\n [attr.height]=\"canvasHeight\"\n class=\"designer-canvas\"\n (click)=\"onCanvasClick($event)\"\n >\n <defs>\n <!-- Grid pattern definition -->\n\n <pattern\n id=\"grid\"\n [attr.width]=\"gridSize\"\n [attr.height]=\"gridSize\"\n patternUnits=\"userSpaceOnUse\"\n >\n <path\n d=\"M 20 0 L 0 0 0 20\"\n fill=\"none\"\n stroke=\"#e2e8f0\"\n stroke-width=\"0.5\"\n />\n </pattern>\n\n <!-- Arrow head marker definition -->\n <marker\n id=\"arrowhead\"\n markerWidth=\"10\"\n markerHeight=\"7\"\n refX=\"9\"\n refY=\"3.5\"\n orient=\"auto\"\n >\n <polygon points=\"0 0, 10 3.5, 0 7\" fill=\"#D36CFF\" />\n </marker>\n\n <!-- Connection point styles -->\n <circle\n id=\"connection-point-template\"\n r=\"5\"\n fill=\"#D36CFF\"\n stroke=\"#FFFFFF\"\n stroke-width=\"1\"\n />\n\n <!-- Dashed line style for connection preview -->\n <pattern\n id=\"dashed-line\"\n width=\"10\"\n height=\"10\"\n patternUnits=\"userSpaceOnUse\"\n >\n <line\n x1=\"0\"\n y1=\"5\"\n x2=\"10\"\n y2=\"5\"\n stroke=\"#D36CFF\"\n stroke-width=\"2\"\n stroke-dasharray=\"5,5\"\n />\n </pattern>\n </defs>\n\n <!-- Background grid -->\n <rect width=\"100%\" height=\"100%\" fill=\"url(#grid)\" />\n\n <!-- Display a message when no swimlanes exist -->\n @if (state.swimlanes.length === 0) {\n <text\n x=\"50%\"\n y=\"50%\"\n font-family=\"sans-serif\"\n font-size=\"16\"\n fill=\"#94a3b8\"\n text-anchor=\"middle\"\n >\n Select the Swimlane tool and click on the canvas to add a swimlane\n </text>\n }\n\n <!-- This is where workflow elements will be added later -->\n @for (swimlane of state.swimlanes; track swimlane.order) {\n <g [attr.transform]=\"'translate(0,' + swimlane.order * 263 + ')'\">\n <!-- Swimlane container -->\n <rect\n x=\"0\"\n y=\"0\"\n [attr.width]=\"canvasWidth\"\n [attr.height]=\"263\"\n fill=\"#ffffff\"\n stroke=\"#e2e8f0\"\n stroke-width=\"1\"\n ></rect>\n\n <!-- Swimlane header -->\n <rect\n x=\"0\"\n y=\"0\"\n [attr.width]=\"canvasWidth\"\n height=\"40\"\n fill=\"#f8fafc\"\n stroke=\"#e2e8f0\"\n stroke-width=\"1\"\n ></rect>\n\n <!-- Swimlane label -->\n <text\n x=\"20\"\n y=\"25\"\n font-family=\"sans-serif\"\n font-size=\"14\"\n fill=\"#333333\"\n font-weight=\"bold\"\n >\n {{ swimlane.label }}\n </text>\n\n <!-- Edit button -->\n <g\n class=\"edit-swimlane-button\"\n [attr.transform]=\"'translate(200, 20)'\"\n (click)=\"\n onEditSwimlane($event, swimlane, swimlane.order);\n $event.stopPropagation()\n \"\n >\n <rect\n x=\"-5\"\n y=\"-15\"\n width=\"40\"\n height=\"20\"\n fill=\"#f3e8ff\"\n rx=\"3\"\n ry=\"3\"\n stroke=\"#d8b4fe\"\n stroke-width=\"1\"\n ></rect>\n <text\n x=\"15\"\n y=\"0\"\n font-family=\"sans-serif\"\n font-size=\"12\"\n fill=\"#7e22ce\"\n text-anchor=\"middle\"\n >\n Edit\n </text>\n </g>\n\n <!-- Tag indicators -->\n <g [attr.transform]=\"'translate(200, 20)'\">\n @for (tag of swimlane.tags.slice(0, 3); track tag.Name; let i = $index)\n {\n <text\n [attr.x]=\"i * 100\"\n y=\"5\"\n font-family=\"sans-serif\"\n font-size=\"12\"\n fill=\"#666666\"\n >\n {{ tag.Name }}\n </text>\n } @if (swimlane.tags.length > 3) {\n <text\n [attr.x]=\"3 * 100 + 10\"\n y=\"5\"\n font-family=\"sans-serif\"\n font-size=\"12\"\n fill=\"#666666\"\n >\n +{{ swimlane.tags.length - 3 }} more\n </text>\n }\n </g>\n\n <!-- Render nodes in this swimlane -->\n @for (node of swimlane.nodes; track node.id) {\n <g\n [attr.transform]=\"'translate(' + node.x + ',' + (node.y + 40) + ')'\"\n (mouseenter)=\"showConnectionPoints(node.id, swimlane.order)\"\n (mouseleave)=\"hideConnectionPoints(node.id)\"\n >\n <!-- Start node indicator (circle and arrow) for the first node -->\n @if (node.isStartNode) {\n <!-- Circle -->\n <circle\n cx=\"-30\"\n cy=\"50\"\n r=\"15\"\n fill=\"none\"\n stroke=\"#D36CFF\"\n stroke-width=\"1\"\n ></circle>\n <!-- Form icon for start node -->\n <svg:g\n (click)=\"\n toggleStartNodeFormPopup($event, node.x, node.y, swimlane.order)\n \"\n class=\"stage-icon\"\n transform=\"translate(-45, 42)\"\n style=\"cursor: pointer; pointer-events: all\"\n >\n <!-- Transparent rectangle to capture clicks -->\n <svg:rect\n x=\"-2\"\n y=\"-2\"\n width=\"24\"\n height=\"24\"\n fill=\"transparent\"\n style=\"cursor: pointer\"\n />\n <svg:path\n d=\"M16.5 20.475V17.475H13.5V16.475H16.5V13.475H17.5V16.475H20.5V17.475H17.5V20.475H16.5ZM3.5 17.5V16.5H4.5V17.5H3.5ZM6.5 17.5V16.5H11.517C11.5057 16.6767 11.5043 16.845 11.513 17.005C11.521 17.165 11.531 17.33 11.543 17.5H6.5ZM3.5 13.5V12.5H4.5V13.5H3.5ZM6.5 13.5V12.5H13.804C13.6127 12.6387 13.4333 12.7913 13.266 12.958C13.0993 13.1247 12.9377 13.3053 12.781 13.5H6.5ZM3.5 9.5V8.5H4.5V9.5H3.5ZM6.5 9.5V8.5H18.5V9.5H6.5ZM3.5 5.5V4.5H4.5V5.5H3.5ZM6.5 5.5V4.5H18.5V5.5H6.5Z\"\n [attr.fill]=\"state.workflowFormId ? '#D36CFF' : 'black'\"\n transform=\"scale(0.7)\"\n />\n </svg:g>\n <!-- Arrow from circle to node -->\n <path\n d=\"M -20 50 L 0 50\"\n stroke=\"#D36CFF\"\n stroke-width=\"1\"\n marker-end=\"url(#arrowhead)\"\n ></path>\n }\n\n <!-- Stage node -->\n @if (node.type === 'stage') {\n <!-- <rect\n x=\"0\"\n y=\"0\"\n [attr.width]=\"node.width\"\n [attr.height]=\"node.height\"\n fill=\"none\"\n stroke=\"#D36CFF\"\n stroke-width=\"1\"\n ></rect> -->\n <svg:g\n lib-stage-node\n [node]=\"node\"\n [isStartNode]=\"node.isStartNode\"\n (stagePropertiesUpdated)=\"onStagePropertiesUpdated($event)\"\n ></svg:g>\n }\n\n <!-- Decision node -->\n @if (node.type === 'decision') {\n <path\n [attr.d]=\"\n 'M 0 ' +\n node.height / 2 +\n ' L ' +\n node.width / 2 +\n ' 0' +\n ' L ' +\n node.width +\n ' ' +\n node.height / 2 +\n ' L ' +\n node.width / 2 +\n ' ' +\n node.height +\n ' Z'\n \"\n fill=\"none\"\n stroke=\"#D36CFF\"\n stroke-width=\"1\"\n ></path>\n }\n\n <!-- Form node -->\n @if (node.type === 'form') {\n <path\n d=\"M95.0625 50.5591V95.0625C95.0625 97.9716 93.9069 100.762 91.8498 102.819C89.7928 104.876 87.0028 106.031 84.0938 106.031H32.9062C29.9972 106.031 27.2072 104.876 25.1502 102.819C23.0931 100.762 21.9375 97.9716 21.9375 95.0625V21.9375C21.9375 19.0284 23.0931 16.2385 25.1502 14.1814C27.2072 12.1244 29.9972 10.9688 32.9062 10.9688H55.4722C57.4109 10.969 59.2701 11.7392 60.6412 13.1099L92.9213 45.3901C94.292 46.7611 95.0622 48.6204 95.0625 50.5591Z\"\n transform=\"scale(0.7)\"\n fill=\"none\"\n stroke=\"#D36CFF\"\n stroke-linejoin=\"round\"\n />\n <path\n d=\"M58.5 12.7969V40.2188C58.5 42.1581 59.2704 44.0181 60.6418 45.3895C62.0131 46.7608 63.8731 47.5312 65.8125 47.5312H93.2344\"\n transform=\"scale(0.7)\"\n stroke=\"#D36CFF\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n <text\n x=\"50%\"\n y=\"50%\"\n text-anchor=\"middle\"\n dominant-baseline=\"middle\"\n font-family=\"sans-serif\"\n font-size=\"14\"\n fill=\"#D36CFF\"\n >\n Form\n </text>\n }\n\n <!-- Subflow node -->\n @if (node.type === 'subflow') {\n <path\n [attr.d]=\"\n 'M 1 ' +\n node.height / 4 +\n ' L ' +\n node.width / 2 +\n ' 1 L ' +\n (node.width - 1) +\n ' ' +\n node.height / 4 +\n ' V ' +\n (node.height * 3) / 4 +\n ' L ' +\n node.width / 2 +\n ' ' +\n (node.height - 1) +\n ' L 1 ' +\n (node.height * 3) / 4 +\n ' Z'\n \"\n fill=\"none\"\n stroke=\"#D36CFF\"\n stroke-width=\"1\"\n ></path>\n <text\n x=\"50%\"\n y=\"50%\"\n text-anchor=\"middle\"\n dominant-baseline=\"middle\"\n font-family=\"sans-serif\"\n font-size=\"14\"\n fill=\"#000000\"\n >\n {{ node.workflowData?.name || \"Subflow\" }}\n </text>\n }\n\n <!-- Connection points for this node -->\n @for (point of node.connectionPoints || []; track point.id) { @if\n (isConnectionPointVisible(node.id)) {\n <use\n [attr.href]=\"'#connection-point-template'\"\n [attr.x]=\"point.x\"\n [attr.y]=\"point.y\"\n [attr.id]=\"point.id\"\n (mousedown)=\"startConnectionDrag($event, point, swimlane.order)\"\n />\n } }\n </g>\n <!-- A transparent hover area for improved hover detection -->\n <rect\n [attr.x]=\"node.x - 10\"\n [attr.y]=\"node.y + 40 - 10\"\n [attr.width]=\"node.width + 20\"\n [attr.height]=\"node.height + 20\"\n fill=\"transparent\"\n (mouseover)=\"showConnectionPoints(node.id, swimlane.order)\"\n (mouseout)=\"hideConnectionPoints(node.id)\"\n style=\"pointer-events: none\"\n />\n }\n </g>\n } @for (connection of state.connections; track connection.id) {\n <g>\n <path\n [attr.d]=\"getConnectionPathForSavedConnection(connection)\"\n stroke=\"#D36CFF\"\n stroke-width=\"2\"\n fill=\"none\"\n marker-end=\"url(#arrowhead)\"\n ></path>\n </g>\n }\n\n <!-- Connection preview line -->\n @if (state.isConnectionDragging()) {\n <g>\n <path\n [attr.d]=\"getConnectionPath()\"\n stroke=\"#D36CFF\"\n stroke-width=\"2\"\n stroke-dasharray=\"5,5\"\n fill=\"none\"\n ></path>\n </g>\n }\n </svg>\n\n <div\n *ngIf=\"popupVisible\"\n [style.position]=\"'absolute'\"\n [style.left.px]=\"popupX\"\n [style.top.px]=\"popupY\"\n >\n <verben-pop-Up\n [dropdownOpen]=\"true\"\n [customStyles]=\"{ 'z-index': '99' }\"\n [enableMouseLeave]=\"false\"\n >\n <div dropdown-trigger style=\"display: none\">\n <!-- Hidden trigger element -->\n </div>\n <div\n class=\"p-3 bg-white border border-gray-200 rounded shadow-md\"\n dropdown-content\n >\n <h4 class=\"mb-2 font-medium\">Create Connection</h4>\n <div class=\"flex flex-col gap-2\">\n <ng-container *ngFor=\"let type of allowedNodeTypes\">\n <button\n class=\"px-3 py-2 bg-white border border-gray-200 rounded text-sm hover:bg-gray-50\"\n (click)=\"createNodeConnection(type)\"\n >\n Create {{ type | titlecase }}\n </button>\n </ng-container>\n <button\n class=\"px-3 py-2 bg-white border border-gray-200 rounded text-sm hover:bg-gray-50\"\n (click)=\"hideConnectionPopup()\"\n >\n Cancel\n </button>\n </div>\n </div>\n </verben-pop-Up>\n </div>\n\n <div\n *ngIf=\"showStartNodeFormPopup\"\n [style.position]=\"'absolute'\"\n [style.left.px]=\"startNodeFormPopupX\"\n [style.top.px]=\"startNodeFormPopupY\"\n >\n <verben-pop-Up [dropdownOpen]=\"true\" [customStyles]=\"{ 'z-index': '100' }\">\n <div dropdown-trigger style=\"display: none\">\n <!-- Hidden trigger element -->\n </div>\n <div\n class=\"p-3 bg-white border border-gray-200 rounded shadow-md w-64\"\n dropdown-content\n style=\"background-color: white; z-index: 1000\"\n >\n <h4 class=\"mb-2 font-medium\">Select Workflow Form</h4>\n <div *ngIf=\"isLoadingStartNodeForms\" class=\"text-center py-2\">\n Loading forms...\n </div>\n <div *ngIf=\"!isLoadingStartNodeForms\" class=\"max-h-48 overflow-y-auto\">\n <div class=\"mb-2\">\n <button\n class=\"w-full px-3 py-2 bg-white border border-gray-200 rounded text-sm hover:bg-gray-50 text-left\"\n (click)=\"selectStartNodeForm(null)\"\n >\n Clear form selection\n </button>\n </div>\n <div *ngFor=\"let form of startNodeFormsList\" class=\"mb-1\">\n <button\n class=\"w-full px-3 py-2 bg-white border border-gray-200 rounded text-sm hover:bg-gray-50 text-left\"\n (click)=\"selectStartNodeForm(form)\"\n >\n {{ form.Name }}\n </button>\n </div>\n <div\n *ngIf=\"startNodeFormsList.length === 0\"\n class=\"text-center py-2 text-gray-500\"\n >\n No forms available\n </div>\n </div>\n </div>\n </verben-pop-Up>\n </div>\n\n <div\n *ngIf=\"showSubflowPopup\"\n [style.position]=\"'fiabsolutexed'\"\n [style.left.px]=\"subflowPopupX\"\n [style.top.px]=\"subflowPopupY\"\n >\n <verben-pop-Up [dropdownOpen]=\"true\" [customStyles]=\"{ 'z-index': '100' }\">\n <div dropdown-trigger style=\"display: none\">\n <!-- Hidden trigger element -->\n </div>\n <div\n class=\"p-3 bg-white border border-gray-200 rounded shadow-md w-64\"\n dropdown-content\n style=\"background-color: white; z-index: 1000\"\n >\n <h4 class=\"mb-2 font-medium\">Select Workflow</h4>\n <div *ngIf=\"isLoadingWorkflows\" class=\"text-center py-2\">\n Loading workflows...\n </div>\n <div *ngIf=\"!isLoadingWorkflows\" class=\"max-h-48 overflow-y-auto\">\n <div *ngFor=\"let workflow of workflowsList\" class=\"mb-1\">\n <button\n class=\"w-full px-3 py-2 bg-white border border-gray-200 rounded text-sm hover:bg-gray-50 text-left\"\n (click)=\"selectSubflowWorkflow(workflow)\"\n >\n {{ workflow.Name }}\n </button>\n </div>\n <div\n *ngIf=\"workflowsList.length === 0\"\n class=\"text-center py-2 text-gray-500\"\n >\n No workflows available\n </div>\n </div>\n </div>\n </verben-pop-Up>\n </div>\n</div>\n", styles: [".canvas-container{flex:1;overflow:auto;background-color:#fff}.designer-canvas{min-width:100%;min-height:100%;cursor:default}.designer-canvas:focus{outline:none}.edit-swimlane-button{cursor:pointer}.edit-swimlane-button:hover rect{fill:#ddd6fe}\n"] }]
|
|
517
|
+
args: [{ selector: 'lib-designer-canvas', template: "<div class=\"canvas-container\">\n <svg\n #canvas\n [attr.width]=\"canvasWidth\"\n [attr.height]=\"canvasHeight\"\n class=\"designer-canvas\"\n (click)=\"onCanvasClick($event)\"\n >\n <defs>\n <!-- Grid pattern definition -->\n\n <pattern\n id=\"grid\"\n [attr.width]=\"gridSize\"\n [attr.height]=\"gridSize\"\n patternUnits=\"userSpaceOnUse\"\n >\n <path\n d=\"M 20 0 L 0 0 0 20\"\n fill=\"none\"\n stroke=\"#e2e8f0\"\n stroke-width=\"0.5\"\n />\n </pattern>\n\n <!-- Arrow head marker definition -->\n <marker\n id=\"arrowhead\"\n markerWidth=\"10\"\n markerHeight=\"7\"\n refX=\"9\"\n refY=\"3.5\"\n orient=\"auto\"\n >\n <polygon points=\"0 0, 10 3.5, 0 7\" fill=\"#D36CFF\" />\n </marker>\n\n <!-- Connection point styles -->\n <circle\n id=\"connection-point-template\"\n r=\"5\"\n fill=\"#D36CFF\"\n stroke=\"#FFFFFF\"\n stroke-width=\"1\"\n />\n\n <!-- Dashed line style for connection preview -->\n <pattern\n id=\"dashed-line\"\n width=\"10\"\n height=\"10\"\n patternUnits=\"userSpaceOnUse\"\n >\n <line\n x1=\"0\"\n y1=\"5\"\n x2=\"10\"\n y2=\"5\"\n stroke=\"#D36CFF\"\n stroke-width=\"2\"\n stroke-dasharray=\"5,5\"\n />\n </pattern>\n </defs>\n\n <!-- Background grid -->\n <rect width=\"100%\" height=\"100%\" fill=\"url(#grid)\" />\n\n <!-- Display a message when no swimlanes exist -->\n @if (state.swimlanes.length === 0) {\n <text\n x=\"50%\"\n y=\"50%\"\n font-family=\"sans-serif\"\n font-size=\"16\"\n fill=\"#94a3b8\"\n text-anchor=\"middle\"\n >\n Select the Swimlane tool and click on the canvas to add a swimlane\n </text>\n }\n\n <!-- This is where workflow elements will be added later -->\n @for (swimlane of state.swimlanes; track swimlane.order) {\n <g [attr.transform]=\"'translate(0,' + swimlane.order * 263 + ')'\">\n <!-- Swimlane container -->\n <rect\n x=\"0\"\n y=\"0\"\n [attr.width]=\"canvasWidth\"\n [attr.height]=\"263\"\n fill=\"#ffffff\"\n stroke=\"#e2e8f0\"\n stroke-width=\"1\"\n ></rect>\n\n <!-- Swimlane header -->\n <rect\n x=\"0\"\n y=\"0\"\n [attr.width]=\"canvasWidth\"\n height=\"40\"\n fill=\"#f8fafc\"\n stroke=\"#e2e8f0\"\n stroke-width=\"1\"\n ></rect>\n\n <!-- Swimlane label -->\n <text\n x=\"20\"\n y=\"25\"\n font-family=\"sans-serif\"\n font-size=\"14\"\n fill=\"#333333\"\n font-weight=\"bold\"\n >\n {{ swimlane.label }}\n </text>\n\n <!-- Edit button -->\n <g\n class=\"edit-swimlane-button\"\n [attr.transform]=\"'translate(100, 20)'\"\n (click)=\"\n onEditSwimlane($event, swimlane, swimlane.order);\n $event.stopPropagation()\n \"\n >\n <rect\n x=\"-5\"\n y=\"-15\"\n width=\"40\"\n height=\"20\"\n fill=\"#f3e8ff\"\n rx=\"3\"\n ry=\"3\"\n stroke=\"#d8b4fe\"\n stroke-width=\"1\"\n ></rect>\n <text\n x=\"15\"\n y=\"0\"\n font-family=\"sans-serif\"\n font-size=\"12\"\n fill=\"#7e22ce\"\n text-anchor=\"middle\"\n >\n Edit\n </text>\n </g>\n\n <!-- Tag indicators -->\n <g [attr.transform]=\"'translate(200, 20)'\">\n @for (tag of swimlane.tags.slice(0, 3); track tag.Name; let i = $index)\n {\n <text\n [attr.x]=\"i * 100\"\n y=\"5\"\n font-family=\"sans-serif\"\n font-size=\"12\"\n fill=\"#666666\"\n >\n {{ tag.Name }}\n </text>\n } @if (swimlane.tags.length > 3) {\n <text\n [attr.x]=\"3 * 100 + 10\"\n y=\"5\"\n font-family=\"sans-serif\"\n font-size=\"12\"\n fill=\"#666666\"\n >\n +{{ swimlane.tags.length - 3 }} more\n </text>\n }\n </g>\n\n <!-- Render nodes in this swimlane -->\n @for (node of swimlane.nodes; track node.id) {\n <g\n [attr.transform]=\"'translate(' + node.x + ',' + (node.y + 40) + ')'\"\n (mouseenter)=\"showConnectionPoints(node.id, swimlane.order)\"\n (mouseleave)=\"hideConnectionPoints(node.id)\"\n >\n <!-- Start node indicator (circle and arrow) for the first node -->\n @if (node.isStartNode) {\n <!-- Circle -->\n <circle\n cx=\"-30\"\n cy=\"50\"\n r=\"15\"\n fill=\"none\"\n stroke=\"#D36CFF\"\n stroke-width=\"1\"\n ></circle>\n <!-- Form icon for start node -->\n <svg:g\n (click)=\"\n toggleStartNodeFormPopup($event, node.x, node.y, swimlane.order)\n \"\n class=\"stage-icon\"\n transform=\"translate(-45, 42)\"\n style=\"cursor: pointer; pointer-events: all\"\n >\n <!-- Transparent rectangle to capture clicks -->\n <svg:rect\n x=\"-2\"\n y=\"-2\"\n width=\"24\"\n height=\"24\"\n fill=\"transparent\"\n style=\"cursor: pointer\"\n />\n <svg:path\n d=\"M16.5 20.475V17.475H13.5V16.475H16.5V13.475H17.5V16.475H20.5V17.475H17.5V20.475H16.5ZM3.5 17.5V16.5H4.5V17.5H3.5ZM6.5 17.5V16.5H11.517C11.5057 16.6767 11.5043 16.845 11.513 17.005C11.521 17.165 11.531 17.33 11.543 17.5H6.5ZM3.5 13.5V12.5H4.5V13.5H3.5ZM6.5 13.5V12.5H13.804C13.6127 12.6387 13.4333 12.7913 13.266 12.958C13.0993 13.1247 12.9377 13.3053 12.781 13.5H6.5ZM3.5 9.5V8.5H4.5V9.5H3.5ZM6.5 9.5V8.5H18.5V9.5H6.5ZM3.5 5.5V4.5H4.5V5.5H3.5ZM6.5 5.5V4.5H18.5V5.5H6.5Z\"\n [attr.fill]=\"state.workflowFormId ? '#D36CFF' : 'black'\"\n transform=\"scale(0.7)\"\n />\n </svg:g>\n <!-- Arrow from circle to node -->\n <path\n d=\"M -20 50 L 0 50\"\n stroke=\"#D36CFF\"\n stroke-width=\"1\"\n marker-end=\"url(#arrowhead)\"\n ></path>\n }\n\n <!-- Stage node -->\n @if (node.type === 'stage') {\n <!-- <rect\n x=\"0\"\n y=\"0\"\n [attr.width]=\"node.width\"\n [attr.height]=\"node.height\"\n fill=\"none\"\n stroke=\"#D36CFF\"\n stroke-width=\"1\"\n ></rect> -->\n <svg:g\n lib-stage-node\n [node]=\"node\"\n [isStartNode]=\"node.isStartNode\"\n (stagePropertiesUpdated)=\"onStagePropertiesUpdated($event)\"\n ></svg:g>\n }\n\n <!-- Decision node -->\n @if (node.type === 'decision') {\n <path\n [attr.d]=\"\n 'M 0 ' +\n node.height / 2 +\n ' L ' +\n node.width / 2 +\n ' 0' +\n ' L ' +\n node.width +\n ' ' +\n node.height / 2 +\n ' L ' +\n node.width / 2 +\n ' ' +\n node.height +\n ' Z'\n \"\n fill=\"none\"\n stroke=\"#D36CFF\"\n stroke-width=\"1\"\n ></path>\n }\n\n <!-- Form node -->\n @if (node.type === 'form') {\n <path\n d=\"M95.0625 50.5591V95.0625C95.0625 97.9716 93.9069 100.762 91.8498 102.819C89.7928 104.876 87.0028 106.031 84.0938 106.031H32.9062C29.9972 106.031 27.2072 104.876 25.1502 102.819C23.0931 100.762 21.9375 97.9716 21.9375 95.0625V21.9375C21.9375 19.0284 23.0931 16.2385 25.1502 14.1814C27.2072 12.1244 29.9972 10.9688 32.9062 10.9688H55.4722C57.4109 10.969 59.2701 11.7392 60.6412 13.1099L92.9213 45.3901C94.292 46.7611 95.0622 48.6204 95.0625 50.5591Z\"\n transform=\"scale(0.7)\"\n fill=\"none\"\n stroke=\"#D36CFF\"\n stroke-linejoin=\"round\"\n />\n <path\n d=\"M58.5 12.7969V40.2188C58.5 42.1581 59.2704 44.0181 60.6418 45.3895C62.0131 46.7608 63.8731 47.5312 65.8125 47.5312H93.2344\"\n transform=\"scale(0.7)\"\n stroke=\"#D36CFF\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n <text\n x=\"50%\"\n y=\"50%\"\n text-anchor=\"middle\"\n dominant-baseline=\"middle\"\n font-family=\"sans-serif\"\n font-size=\"14\"\n fill=\"#D36CFF\"\n >\n Form\n </text>\n }\n\n <!-- Subflow node -->\n @if (node.type === 'subflow') {\n <path\n [attr.d]=\"\n 'M 1 ' +\n node.height / 4 +\n ' L ' +\n node.width / 2 +\n ' 1 L ' +\n (node.width - 1) +\n ' ' +\n node.height / 4 +\n ' V ' +\n (node.height * 3) / 4 +\n ' L ' +\n node.width / 2 +\n ' ' +\n (node.height - 1) +\n ' L 1 ' +\n (node.height * 3) / 4 +\n ' Z'\n \"\n fill=\"none\"\n stroke=\"#D36CFF\"\n stroke-width=\"1\"\n ></path>\n <text\n [attr.x]=\"node.width / 2\"\n [attr.y]=\"node.height / 2\"\n text-anchor=\"middle\"\n alignment-baseline=\"middle\"\n font-family=\"sans-serif\"\n font-size=\"10\"\n fill=\"#000000\"\n >\n <!-- Limit text length -->\n {{\n (node.workflowData?.name || \"Subflow\").length > 12\n ? (node.workflowData?.name || \"Subflow\").substring(0, 10) + \"...\"\n : node.workflowData?.name || \"Subflow\"\n }}\n </text>\n }\n\n <!-- Connection points for this node -->\n @for (point of node.connectionPoints || []; track point.id) { @if\n (isConnectionPointVisible(node.id)) {\n <use\n [attr.href]=\"'#connection-point-template'\"\n [attr.x]=\"point.x\"\n [attr.y]=\"point.y\"\n [attr.id]=\"point.id\"\n (mousedown)=\"startConnectionDrag($event, point, swimlane.order)\"\n />\n } }\n </g>\n <!-- A transparent hover area for improved hover detection -->\n <rect\n [attr.x]=\"node.x - 10\"\n [attr.y]=\"node.y + 40 - 10\"\n [attr.width]=\"node.width + 20\"\n [attr.height]=\"node.height + 20\"\n fill=\"transparent\"\n (mouseover)=\"showConnectionPoints(node.id, swimlane.order)\"\n (mouseout)=\"hideConnectionPoints(node.id)\"\n style=\"pointer-events: none\"\n />\n }\n </g>\n } @for (connection of state.connections; track connection.id) {\n <g>\n <path\n [attr.d]=\"getConnectionPathForSavedConnection(connection)\"\n stroke=\"#D36CFF\"\n stroke-width=\"2\"\n fill=\"none\"\n marker-end=\"url(#arrowhead)\"\n ></path>\n </g>\n }\n\n <!-- Connection preview line -->\n @if (state.isConnectionDragging()) {\n <g>\n <path\n [attr.d]=\"getConnectionPath()\"\n stroke=\"#D36CFF\"\n stroke-width=\"2\"\n stroke-dasharray=\"5,5\"\n fill=\"none\"\n ></path>\n </g>\n }\n </svg>\n\n <div\n *ngIf=\"popupVisible\"\n [style.position]=\"'absolute'\"\n [style.left.px]=\"popupX\"\n [style.top.px]=\"popupY\"\n >\n <verben-pop-Up\n [dropdownOpen]=\"true\"\n [customStyles]=\"{ 'z-index': '99' }\"\n [enableMouseLeave]=\"false\"\n >\n <div dropdown-trigger style=\"display: none\">\n <!-- Hidden trigger element -->\n </div>\n <div\n class=\"p-3 bg-white border border-gray-200 rounded shadow-md\"\n dropdown-content\n >\n <h4 class=\"mb-2 font-medium\">Create Connection</h4>\n <div class=\"flex flex-col gap-2\">\n <ng-container *ngFor=\"let type of allowedNodeTypes\">\n <button\n class=\"px-3 py-2 bg-white border border-gray-200 rounded text-sm hover:bg-gray-50\"\n (click)=\"createNodeConnection(type)\"\n >\n Create {{ type | titlecase }}\n </button>\n </ng-container>\n <button\n class=\"px-3 py-2 bg-white border border-gray-200 rounded text-sm hover:bg-gray-50\"\n (click)=\"hideConnectionPopup()\"\n >\n Cancel\n </button>\n </div>\n </div>\n </verben-pop-Up>\n </div>\n\n <div\n *ngIf=\"showStartNodeFormPopup\"\n [style.position]=\"'absolute'\"\n [style.left.px]=\"startNodeFormPopupX\"\n [style.top.px]=\"startNodeFormPopupY\"\n >\n <verben-pop-Up [dropdownOpen]=\"true\" [customStyles]=\"{ 'z-index': '100' }\">\n <div dropdown-trigger style=\"display: none\">\n <!-- Hidden trigger element -->\n </div>\n <div\n class=\"p-3 bg-white border border-gray-200 rounded shadow-md w-64\"\n dropdown-content\n style=\"background-color: white; z-index: 1000\"\n >\n <h4 class=\"mb-2 font-medium\">Select Workflow Form</h4>\n <div *ngIf=\"isLoadingStartNodeForms\" class=\"text-center py-2\">\n Loading forms...\n </div>\n <div *ngIf=\"!isLoadingStartNodeForms\" class=\"max-h-48 overflow-y-auto\">\n <div class=\"mb-2\">\n <button\n class=\"w-full px-3 py-2 bg-white border border-gray-200 rounded text-sm hover:bg-gray-50 text-left\"\n (click)=\"selectStartNodeForm(null)\"\n >\n Clear form selection\n </button>\n </div>\n <div *ngFor=\"let form of startNodeFormsList\" class=\"mb-1\">\n <button\n class=\"w-full px-3 py-2 bg-white border border-gray-200 rounded text-sm hover:bg-gray-50 text-left\"\n (click)=\"selectStartNodeForm(form)\"\n >\n {{ form.Name }}\n </button>\n </div>\n <div\n *ngIf=\"startNodeFormsList.length === 0\"\n class=\"text-center py-2 text-gray-500\"\n >\n No forms available\n </div>\n </div>\n </div>\n </verben-pop-Up>\n </div>\n\n <div\n *ngIf=\"showSubflowPopup\"\n [style.position]=\"'absolute'\"\n [style.left.px]=\"subflowPopupX\"\n [style.top.px]=\"subflowPopupY\"\n >\n <verben-pop-Up [dropdownOpen]=\"true\" [customStyles]=\"{ 'z-index': '100' }\">\n <div dropdown-trigger style=\"display: none\">\n <!-- Hidden trigger element -->\n </div>\n <div\n class=\"p-3 bg-white border border-gray-200 rounded shadow-md w-64\"\n dropdown-content\n style=\"background-color: white; z-index: 1000\"\n >\n <h4 class=\"mb-2 font-medium\">Select Workflow</h4>\n <div *ngIf=\"isLoadingWorkflows\" class=\"text-center py-2\">\n Loading workflows...\n </div>\n <div *ngIf=\"!isLoadingWorkflows\" class=\"max-h-48 overflow-y-auto\">\n <div *ngFor=\"let workflow of workflowsList\" class=\"mb-1\">\n <button\n class=\"w-full px-3 py-2 bg-white border border-gray-200 rounded text-sm hover:bg-gray-50 text-left\"\n (click)=\"selectSubflowWorkflow(workflow)\"\n >\n {{ workflow.Name }}\n </button>\n </div>\n <div\n *ngIf=\"workflowsList.length === 0\"\n class=\"text-center py-2 text-gray-500\"\n >\n No workflows available\n </div>\n </div>\n </div>\n </verben-pop-Up>\n </div>\n</div>\n", styles: [".canvas-container{flex:1;overflow:auto;background-color:#fff}.designer-canvas{min-width:100%;min-height:100%;cursor:default}.designer-canvas:focus{outline:none}.edit-swimlane-button{cursor:pointer}.edit-swimlane-button:hover rect{fill:#ddd6fe}\n"] }]
|
|
518
518
|
}], ctorParameters: () => [{ type: i1.WorkflowDesignerState }, { type: i2.WorkflowDataService }], propDecorators: { selectedTool: [{
|
|
519
519
|
type: Input
|
|
520
520
|
}], clickedPosition: [{
|
|
@@ -533,4 +533,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
533
533
|
type: HostListener,
|
|
534
534
|
args: ['document:click', ['$event']]
|
|
535
535
|
}] } });
|
|
536
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzaWduZXItY2FudmFzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ZlcmJlbi13b3JrZmxvdy11aS9zcmMvbGliL2NvbXBvbmVudHMvd29ya2Zsb3ctZGVzaWduZXIvZGVzaWduZXItY2FudmFzL2Rlc2lnbmVyLWNhbnZhcy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92ZXJiZW4td29ya2Zsb3ctdWkvc3JjL2xpYi9jb21wb25lbnRzL3dvcmtmbG93LWRlc2lnbmVyL2Rlc2lnbmVyLWNhbnZhcy9kZXNpZ25lci1jYW52YXMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFFVCxZQUFZLEVBQ1osWUFBWSxFQUNaLEtBQUssRUFFTCxNQUFNLEVBQ04sU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDOzs7Ozs7O0FBbUJ2QixNQUFNLE9BQU8sdUJBQXVCO0lBK0R6QjtJQUNDO0lBL0RELFlBQVksR0FBYSxJQUFJLENBQUM7SUFDN0IsZUFBZSxHQUFHLElBQUksWUFBWSxFQUE0QixDQUFDO0lBQy9ELGVBQWUsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO0lBQy9DLG9CQUFvQixHQUNsQixJQUFJLENBQUM7SUFDRyxlQUFlLEdBQUcsSUFBSSxZQUFZLEVBR3hDLENBQUM7SUFFTCwrQkFBK0I7SUFDUSxTQUFTLENBQTBCO0lBRzFFLGVBQWUsQ0FBQyxLQUFpQjtRQUMvQixzRUFBc0U7UUFDdEUsSUFDRSxDQUFDLElBQUksQ0FBQyxnQkFBZ0I7WUFDdEIsQ0FBQyxJQUFJLENBQUMsc0JBQXNCO1lBQzVCLENBQUMsSUFBSSxDQUFDLFlBQVksSUFBSSx1Q0FBdUM7WUFDN0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsRUFBRSxFQUNqQyxDQUFDO1lBQ0QsT0FBTyxDQUFDLEdBQUcsQ0FB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QyxzQkFBc0IsR0FBRyxJQUFJLENBQUM7UUFDbkMsSUFBSSxDQUFDLDRCQUE0QixHQUFHLElBQUksQ0FBQztRQUN6QyxJQUFJLENBQUMsb0NBQW9DLEdBQUcsSUFBSSxDQUFDO0lBQ25ELENBQUM7d0dBOXJCVSx1QkFBdUI7NEZBQXZCLHVCQUF1QixvY0M1QnBDLHU5ZUFvZ0JBOzs0RkR4ZWEsdUJBQXVCO2tCQUxuQyxTQUFTOytCQUNFLHFCQUFxQjs0SEFLdEIsWUFBWTtzQkFBcEIsS0FBSztnQkFDSSxlQUFlO3NCQUF4QixNQUFNO2dCQUNHLGVBQWU7c0JBQXhCLE1BQU07Z0JBR0csZUFBZTtzQkFBeEIsTUFBTTtnQkFNZ0MsU0FBUztzQkFBL0MsU0FBUzt1QkFBQyxRQUFRLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUdyQyxlQUFlO3NCQURkLFlBQVk7dUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBc1AxQyxlQUFlO3NCQURkLFlBQVk7dUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSG9zdExpc3RlbmVyLFxuICBJbnB1dCxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBDb25uZWN0aW9uLFxuICBDb25uZWN0aW9uUG9pbnQsXG4gIE5vZGUgYXMgV0ZOb2RlLFxuICBUb29sVHlwZSxcbiAgU3dpbWxhbmVJdGVtLFxufSBmcm9tICcuLi93b3JrZmxvdy1kZXNpZ25lci50eXBlcyc7XG5pbXBvcnQgeyBXb3JrZmxvd0Rlc2lnbmVyU3RhdGUgfSBmcm9tICcuLi93b3JrZmxvdy1kZXNpZ25lci5zdGF0ZSc7XG5pbXBvcnQgeyBXb3JrZmxvd1N0YWdlIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL1dvcmtmbG93U3RhZ2UnO1xuaW1wb3J0IHsgRm9ybUVudGl0eSB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9Gb3JtRW50aXR5JztcbmltcG9ydCB7IFdvcmtmbG93IH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL1dvcmtmbG93JztcbmltcG9ydCB7IFdvcmtmbG93RGF0YVNlcnZpY2UgfSBmcm9tICcuLi93b3JrZmxvdy1kYXRhLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItZGVzaWduZXItY2FudmFzJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2Rlc2lnbmVyLWNhbnZhcy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9kZXNpZ25lci1jYW52YXMuY29tcG9uZW50LmNzcycsXG59KVxuZXhwb3J0IGNsYXNzIERlc2lnbmVyQ2FudmFzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KCkgc2VsZWN0ZWRUb29sOiBUb29sVHlwZSA9IG51bGw7XG4gIEBPdXRwdXQoKSBjbGlja2VkUG9zaXRpb24gPSBuZXcgRXZlbnRFbWl0dGVyPHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfT4oKTtcbiAgQE91dHB1dCgpIHN1YmZsb3dTZWxlY3RlZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgcGVuZGluZ1N0YWdlUG9zaXRpb246IHsgc3dpbWxhbmVJbmRleDogbnVtYmVyOyB4OiBudW1iZXI7IHk6IG51bWJlciB9IHwgbnVsbCA9XG4gICAgbnVsbDtcbiAgQE91dHB1dCgpIHNob3dTdGFnZURpYWxvZyA9IG5ldyBFdmVudEVtaXR0ZXI8e1xuICAgIHBvc2l0aW9uOiBhbnk7XG4gICAgaXNGcm9tQ29ubmVjdGlvbjogYm9vbGVhbjtcbiAgfT4oKTtcblxuICAvLyBSZWZlcmVuY2UgdG8gdGhlIFNWRyBlbGVtZW50XG4gIEBWaWV3Q2hpbGQoJ2NhbnZhcycsIHsgc3RhdGljOiB0cnVlIH0pIGNhbnZhc1JlZiE6IEVsZW1lbnRSZWY8U1ZHRWxlbWVudD47XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93Om1vdXNldXAnLCBbJyRldmVudCddKVxuICBvbldpbmRvd01vdXNlVXAoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICAvLyBJZiB3ZSBoYXZlIGEgcG9wdXAgb3BlbiBidXQgdGhlIG1vdXNlIGlzIHJlbGVhc2VkIG91dHNpZGUsIGNsZWFuIHVwXG4gICAgaWYgKFxuICAgICAgIXRoaXMuc2hvd1N1YmZsb3dQb3B1cCAmJlxuICAgICAgIXRoaXMuc2hvd1N0YXJ0Tm9kZUZvcm1Qb3B1cCAmJlxuICAgICAgIXRoaXMucG9wdXBWaXNpYmxlICYmIC8vIE9ubHkgZW5kIGRyYWcgaWYgbm8gcG9wdXAgaXMgdmlzaWJsZVxuICAgICAgdGhpcy5zdGF0ZS5pc0Nvbm5lY3Rpb25EcmFnZ2luZygpXG4gICAgKSB7XG4gICAgICBjb25zb2xlLmxvZygnRXh0ZXJuYWwgbW91c2V1cCBkZXRlY3RlZCAtIGNsZWFuaW5nIHVwIGNvbm5lY3Rpb24gZHJhZycpO1xuICAgICAgdGhpcy5zdGF0ZS5lbmRDb25uZWN0aW9uRHJhZygpO1xuICAgIH1cbiAgfVxuXG4gIC8vIENhbnZhcyBkaW1lbnNpb25zXG4gIGNhbnZhc1dpZHRoID0gMzAwMDtcbiAgY2FudmFzSGVpZ2h0ID0gMjAwMDtcblxuICAvLyBHcmlkIHNpemVcbiAgZ3JpZFNpemUgPSAyMDtcblxuICBzd2ltbGFuZUhlaWdodCA9IDI2MztcbiAgdmlzaWJsZUNvbm5lY3Rpb25Qb2ludHNOb2RlSWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBwb3B1cFZpc2libGUgPSBmYWxzZTtcbiAgcG9wdXBYID0gMDtcbiAgcG9wdXBZID0gMDtcbiAgYWxsb3dlZE5vZGVUeXBlczogc3RyaW5nW10gPSBbXTtcblxuICBzaG93U3RhcnROb2RlRm9ybVBvcHVwOiBib29sZWFuID0gZmFsc2U7XG4gIHN0YXJ0Tm9kZUZvcm1zTGlzdDogRm9ybUVudGl0eVtdID0gW107XG4gIGlzTG9hZGluZ1N0YXJ0Tm9kZUZvcm1zOiBib29sZWFuID0gZmFsc2U7XG4gIHN0YXJ0Tm9kZUZvcm1Qb3B1cFg6IG51bWJlciA9IDA7XG4gIHN0YXJ0Tm9kZUZvcm1Qb3B1cFk6IG51bWJlciA9IDA7XG5cbiAgc2hvd1N1YmZsb3dQb3B1cDogYm9vbGVhbiA9IGZhbHNlO1xuICB3b3JrZmxvd3NMaXN0OiBXb3JrZmxvd1tdID0gW107XG4gIGlzTG9hZGluZ1dvcmtmbG93czogYm9vbGVhbiA9IGZhbHNlO1xuICBzdWJmbG93UG9wdXBYOiBudW1iZXIgPSAwO1xuICBzdWJmbG93UG9wdXBZOiBudW1iZXIgPSAwO1xuICBwZW5kaW5nU3ViZmxvd1Bvc2l0aW9uOiB7XG4gICAgc3dpbWxhbmVJbmRleDogbnVtYmVyO1xuICAgIHg6IG51bWJlcjtcbiAgICB5OiBudW1iZXI7XG4gIH0gfCBudWxsID0gbnVsbDtcblxuICBwZW5kaW5nQ29ubmVjdGlvblNvdXJjZVBvaW50OiBDb25uZWN0aW9uUG9pbnQgfCBudWxsID0gbnVsbDtcbiAgcGVuZGluZ0Nvbm5lY3Rpb25Tb3VyY2VTd2ltbGFuZUluZGV4OiBudW1iZXIgfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgc3RhdGU6IFdvcmtmbG93RGVzaWduZXJTdGF0ZSxcbiAgICBwcml2YXRlIGRhdGFTZXJ2aWNlOiBXb3JrZmxvd0RhdGFTZXJ2aWNlXG4gICkge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnVwZGF0ZUNhbnZhc1NpemUoKTtcbiAgfVxuXG4gIC8vIEhhbmRsZSBtb3VzZSBjbGljayBvbiBjYW52YXNcbiAgb25DYW52YXNDbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIC8vIE9ubHkgcHJvY2VzcyBjYW52YXMgY2xpY2tzIGlmIGEgdG9vbCBpcyBzZWxlY3RlZFxuICAgIGlmICghdGhpcy5zZWxlY3RlZFRvb2wpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBHZXQgdGhlIHBvc2l0aW9uIHdoZXJlIHRoZSBjbGljayBvY2N1cnJlZFxuICAgIGNvbnN0IHBvc2l0aW9uID0gdGhpcy5nZXRNb3VzZVBvc2l0aW9uKGV2ZW50KTtcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgICdDYW52YXMgY2xpY2tlZCBhdDonLFxuICAgICAgcG9zaXRpb24sXG4gICAgICAnd2l0aCB0b29sOicsXG4gICAgICB0aGlzLnNlbGVjdGVkVG9vbFxuICAgICk7XG5cbiAgICAvLyBDYWxjdWxhdGUgdGhlIHN3aW1sYW5lIGluZGV4IGJhc2VkIG9uIHBvc2l0aW9uXG4gICAgLy8gY29uc3Qgc3dpbWxhbmVJbmRleCA9IE1hdGguZmxvb3IocG9zaXRpb24ueSAvIHRoaXMuc3dpbWxhbmVIZWlnaHQpO1xuXG4gICAgLy8gT25seSBlbWl0IHRoZSBwb3NpdGlvbiBpZiB3ZSBoYXZlIGEgdG9vbCBzZWxlY3RlZCBhbmQgaXQncyBhIHZhbGlkIGNsaWNrIGFyZWFcbiAgICBpZiAodGhpcy5zZWxlY3RlZFRvb2wpIHtcbiAgICAgIHRoaXMuY2xpY2tlZFBvc2l0aW9uLmVtaXQoe1xuICAgICAgICB4OiBwb3NpdGlvbi54LFxuICAgICAgICB5OiBwb3NpdGlvbi55LFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlQ2FudmFzU2l6ZSgpOiB2b2lkIHtcbiAgICBjb25zdCByZXF1aXJlZEhlaWdodCA9XG4gICAgICAodGhpcy5zdGF0ZS5zd2ltbGFuZXMubGVuZ3RoICsgMSkgKiB0aGlzLnN3aW1sYW5lSGVpZ2h0O1xuICAgIHRoaXMuY2FudmFzSGVpZ2h0ID0gTWF0aC5tYXgoMjAwMCwgcmVxdWlyZWRIZWlnaHQpOyAvLyBFbnN1cmUgd2UgaGF2ZSBhdCBsZWFzdCBvdXIgZGVmYXVsdCBoZWlnaHRcbiAgfVxuXG4gIC8vIEhlbHBlciBtZXRob2QgdG8gZ2V0IHRoZSBtb3VzZSBwb3NpdGlvbiByZWxhdGl2ZSB0byB0aGUgU1ZHIGNhbnZhc1xuICBwcml2YXRlIGdldE1vdXNlUG9zaXRpb24oZXZlbnQ6IE1vdXNlRXZlbnQpOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0ge1xuICAgIC8vIFVzZSBjbGllbnRYL1kgYW5kIGdldEJvdW5kaW5nQ2xpZW50UmVjdCgpIGZvciBjcm9zcy1icm93c2VyIGNvbXBhdGliaWxpdHlcbiAgICBjb25zdCByZWN0ID0gdGhpcy5jYW52YXNSZWYubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICByZXR1cm4ge1xuICAgICAgeDogZXZlbnQuY2xpZW50WCAtIHJlY3QubGVmdCxcbiAgICAgIHk6IGV2ZW50LmNsaWVudFkgLSByZWN0LnRvcCxcbiAgICB9O1xuICB9XG5cbiAgc2hvd0Nvbm5lY3Rpb25Qb2ludHMobm9kZUlkOiBzdHJpbmcsIHN3aW1sYW5lSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMudmlzaWJsZUNvbm5lY3Rpb25Qb2ludHNOb2RlSWQgPSBub2RlSWQ7XG4gIH1cblxuICBpc01vdXNlT3Zlck5vZGUoXG4gICAgZXZlbnQ6IE1vdXNlRXZlbnQsXG4gICAgbm9kZTogV0ZOb2RlLFxuICAgIHN3aW1sYW5lSW5kZXg6IG51bWJlclxuICApOiBib29sZWFuIHtcbiAgICBjb25zdCBwb3NpdGlvbiA9IHRoaXMuZ2V0TW91c2VQb3NpdGlvbihldmVudCk7XG4gICAgY29uc3Qgbm9kZUJvdW5kcyA9IHRoaXMuZ2V0Tm9kZUJvdW5kc1dpdGhQYWRkaW5nKG5vZGUsIHN3aW1sYW5lSW5kZXgpO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIHBvc2l0aW9uLnggPj0gbm9kZUJvdW5kcy54ICYmXG4gICAgICBwb3NpdGlvbi54IDw9IG5vZGVCb3VuZHMueCArIG5vZGVCb3VuZHMud2lkdGggJiZcbiAgICAgIHBvc2l0aW9uLnkgPj0gbm9kZUJvdW5kcy55ICYmXG4gICAgICBwb3NpdGlvbi55IDw9IG5vZGVCb3VuZHMueSArIG5vZGVCb3VuZHMuaGVpZ2h0XG4gICAgKTtcbiAgfVxuXG4gIC8vIGhlbHBlciBtZXRob2QgdG8gY2FsY3VsYXRlIG5vZGUgYm91bmRzIHdpdGggcGFkZGluZ1xuICBnZXROb2RlQm91bmRzV2l0aFBhZGRpbmcoXG4gICAgbm9kZTogV0ZOb2RlLFxuICAgIHN3aW1sYW5lSW5kZXg6IG51bWJlclxuICApOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHtcbiAgICBjb25zdCBwYWRkaW5nID0gMTA7IC8vIEFkZCAxMHB4IHBhZGRpbmcgYXJvdW5kIG5vZGVzIGZvciBlYXNpZXIgaG92ZXIgZGV0ZWN0aW9uXG5cbiAgICAvLyBDYWxjdWxhdGUgdGhlIGFic29sdXRlIFkgcG9zaXRpb24gaW5jbHVkaW5nIHN3aW1sYW5lIG9mZnNldFxuICAgIGNvbnN0IGFic29sdXRlWSA9IG5vZGUueSArIChzd2ltbGFuZUluZGV4ICogMjYzICsgNDApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IG5vZGUueCAtIHBhZGRpbmcsXG4gICAgICB5OiBhYnNvbHV0ZVkgLSBwYWRkaW5nLFxuICAgICAgd2lkdGg6IG5vZGUud2lkdGggKyBwYWRkaW5nICogMixcbiAgICAgIGhlaWdodDogbm9kZS5oZWlnaHQgKyBwYWRkaW5nICogMixcbiAgICB9O1xuICB9XG5cbiAgaGlkZUNvbm5lY3Rpb25Qb2ludHMobm9kZUlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLnZpc2libGVDb25uZWN0aW9uUG9pbnRzTm9kZUlkID09PSBub2RlSWQgJiZcbiAgICAgICF0aGlzLnN0YXRlLmlzQ29ubmVjdGlvbkRyYWdnaW5nKClcbiAgICApIHtcbiAgICAgIHRoaXMudmlzaWJsZUNvbm5lY3Rpb25Qb2ludHNOb2RlSWQgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGlzQ29ubmVjdGlvblBvaW50VmlzaWJsZShub2RlSWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnZpc2libGVDb25uZWN0aW9uUG9pbnRzTm9kZUlkID09PSBub2RlSWQ7XG4gIH1cblxuICBzdGFydENvbm5lY3Rpb25EcmFnKFxuICAgIGV2ZW50OiBNb3VzZUV2ZW50LFxuICAgIHBvaW50OiBDb25uZWN0aW9uUG9pbnQsXG4gICAgc3dpbWxhbmVJbmRleDogbnVtYmVyXG4gICk6IHZvaWQge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICBjb25zdCBwb3NpdGlvbiA9IHRoaXMuZ2V0TW91c2VQb3NpdGlvbihldmVudCk7XG4gICAgdGhpcy5zdGF0ZS5zdGFydENvbm5lY3Rpb25EcmFnKFxuICAgICAgcG9pbnQsXG4gICAgICBzd2ltbGFuZUluZGV4LFxuICAgICAgcG9zaXRpb24ueCxcbiAgICAgIHBvc2l0aW9uLnlcbiAgICApO1xuXG4gICAgLy8gQWRkIG1vdXNlIG1vdmUgYW5kIG1vdXNlIHVwIGV2ZW50IGxpc3RlbmVycyB0byB0aGUgZG9jdW1lbnRcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLm9uTW91c2VNb3ZlKTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5vbk1vdXNlVXApO1xuICB9XG5cbiAgLy8gVXNlIGFycm93IGZ1bmN0aW9ucyB0byBwcmVzZXJ2ZSAndGhpcycgY29udGV4dFxuICBvbk1vdXNlTW92ZSA9IChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgIGNvbnN0IHBvc2l0aW9uID0gdGhpcy5nZXRNb3VzZVBvc2l0aW9uKGV2ZW50KTtcbiAgICB0aGlzLnN0YXRlLnVwZGF0ZUNvbm5lY3Rpb25EcmFnKHBvc2l0aW9uLngsIHBvc2l0aW9uLnkpO1xuICB9O1xuXG4gIG9uTW91c2VVcCA9IChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMub25Nb3VzZU1vdmUpO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLm9uTW91c2VVcCk7XG5cbiAgICBjb25zdCBwb3NpdGlvbiA9IHRoaXMuZ2V0TW91c2VQb3NpdGlvbihldmVudCk7XG4gICAgY29uc29sZS5sb2coJ01vdXNlIHVwIGF0IHBvc2l0aW9uOicsIHBvc2l0aW9uKTtcbiAgICBjb25zb2xlLmxvZygnSXMgY29ubmVjdGlvbiBkcmFnZ2luZzonLCB0aGlzLnN0YXRlLmlzQ29ubmVjdGlvbkRyYWdnaW5nKCkpO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHBvc2l0aW9uIGlzIHdpdGhpbiBhbnkgc3dpbWxhbmVcbiAgICBjb25zdCBpc0luc2lkZVN3aW1sYW5lID0gdGhpcy5pc1Bvc2l0aW9uSW5zaWRlU3dpbWxhbmUocG9zaXRpb24ueSk7XG4gICAgY29uc29sZS5sb2coJ0lzIGluc2lkZSBzd2ltbGFuZTonLCBpc0luc2lkZVN3aW1sYW5lKTtcblxuICAgIC8vIE9ubHkgc2hvdyBwb3B1cCBpZiB3aXRoaW4gYSBzd2ltbGFuZVxuICAgIGlmIChpc0luc2lkZVN3aW1sYW5lICYmIHRoaXMuc3RhdGUuaXNDb25uZWN0aW9uRHJhZ2dpbmcoKSkge1xuICAgICAgY29uc29sZS5sb2coJ1Nob3dpbmcgY29ubmVjdGlvbiBwb3B1cCcpO1xuICAgICAgdGhpcy5zaG93Q29ubmVjdGlvblBvcHVwKHBvc2l0aW9uLngsIHBvc2l0aW9uLnkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBFbmQgdGhlIGNvbm5lY3Rpb24gZHJhZyBpZiBvdXRzaWRlIGEgc3dpbWxhbmVcbiAgICAgIGNvbnNvbGUubG9nKCdFbmRpbmcgY29ubmVjdGlvbiBkcmFnIHdpdGhvdXQgc2hvd2luZyBwb3B1cCcpO1xuICAgICAgdGhpcy5zdGF0ZS5lbmRDb25uZWN0aW9uRHJhZygpO1xuICAgIH1cbiAgfTtcblxuICBpc1Bvc2l0aW9uSW5zaWRlU3dpbWxhbmUoeTogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgLy8gQ2hlY2sgaWYgeSBwb3NpdGlvbiBpcyB3aXRoaW4gYW55IHN3aW1sYW5lXG4gICAgY29uc3Qgc3dpbWxhbmVDb3VudCA9IHRoaXMuc3RhdGUuc3dpbWxhbmVzLmxlbmd0aDtcbiAgICBpZiAoc3dpbWxhbmVDb3VudCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgLy8gRWFjaCBzd2ltbGFuZSBoYXMgYSBoZWlnaHQgb2YgMjYzcHhcbiAgICBjb25zdCB0b3RhbFN3aW1sYW5lSGVpZ2h0ID0gc3dpbWxhbmVDb3VudCAqIHRoaXMuc3dpbWxhbmVIZWlnaHQ7XG5cbiAgICAvLyBDaGVjayBpZiB5IGlzIHdpdGhpbiB0aGUgdG90YWwgaGVpZ2h0IG9mIGFsbCBzd2ltbGFuZXNcbiAgICByZXR1cm4geSA+PSAwICYmIHkgPCB0b3RhbFN3aW1sYW5lSGVpZ2h0O1xuICB9XG5cbiAgc2hvd0Nvbm5lY3Rpb25Qb3B1cCh4OiBudW1iZXIsIHk6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKCdTaG93aW5nIGNvbm5lY3Rpb24gcG9wdXAgYXQ6JywgeCwgeSk7XG4gICAgdGhpcy5wb3B1cFggPSB4O1xuICAgIHRoaXMucG9wdXBZID0geTtcblxuICAgIC8vIEdldCBhbGxvd2VkIG5vZGUgdHlwZXMgYmFzZWQgb24gdGhlIHNvdXJjZSBub2RlIHR5cGVcbiAgICB0aGlzLmFsbG93ZWROb2RlVHlwZXMgPSB0aGlzLnN0YXRlLmdldEFsbG93ZWRUYXJnZXROb2RlVHlwZXMoKTtcbiAgICBjb25zb2xlLmxvZygnQWxsb3dlZCBub2RlIHR5cGVzOicsIHRoaXMuYWxsb3dlZE5vZGVUeXBlcyk7XG5cbiAgICAvLyBPbmx5IHNob3cgdGhlIHBvcHVwIGlmIHdlIGhhdmUgYWxsb3dlZCBub2RlIHR5cGVzXG4gICAgaWYgKHRoaXMuYWxsb3dlZE5vZGVUeXBlcy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnBvcHVwVmlzaWJsZSA9IHRydWU7XG4gICAgICBjb25zb2xlLmxvZygnUG9wdXAgdmlzaWJpbGl0eSBzZXQgdG8gdHJ1ZScpO1xuXG4gICAgICAvLyBGb3JjZSB0aGUgcG9wdXAgdG8gYmUgdmlzaWJsZSBpbiB0aGUgbmV4dCB0aWNrXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coJ0lzIHBvcHVwIHZpc2libGUgaW4gbmV4dCB0aWNrOicsIHRoaXMucG9wdXBWaXNpYmxlKTtcbiAgICAgIH0sIDApO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBObyBhbGxvd2VkIG5vZGUgdHlwZXMsIGp1c3QgZW5kIHRoZSBkcmFnXG4gICAgICBjb25zb2xlLmxvZygnTm8gYWxsb3dlZCBub2RlIHR5cGVzLCBlbmRpbmcgZHJhZycpO1xuICAgICAgdGhpcy5zdGF0ZS5lbmRDb25uZWN0aW9uRHJhZygpO1xuICAgIH1cbiAgfVxuXG4gIGhpZGVDb25uZWN0aW9uUG9wdXAoKTogdm9pZCB7XG4gICAgdGhpcy5wb3B1cFZpc2libGUgPSBmYWxzZTtcbiAgICB0aGlzLnN0YXRlLmVuZENvbm5lY3Rpb25EcmFnKCk7XG4gIH1cblxuICAvLyBBZGQgdGhpcyBoYW5kbGVyIHRvIGNsb3NlIHRoZSBwb3B1cCB3aGVuIGNsaWNraW5nIG91dHNpZGVcbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6Y2xpY2snLCBbJyRldmVudCddKVxuICBvbkRvY3VtZW50Q2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wb3B1cFZpc2libGUpIHtcbiAgICAgIGNvbnN0IHBvcHVwRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3ZlcmJlbi1wb3AtVXAnKTtcbiAgICAgIGlmIChwb3B1cEVsZW1lbnQgJiYgIXBvcHVwRWxlbWVudC5jb250YWlucyhldmVudC50YXJnZXQgYXMgTm9kZSkpIHtcbiAgICAgICAgdGhpcy5oaWRlQ29ubmVjdGlvblBvcHVwKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY3JlYXRlTm9kZUNvbm5lY3Rpb24obm9kZVR5cGU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHBhdGhEYXRhID0gdGhpcy5zdGF0ZS5nZXRDb25uZWN0aW9uUGF0aERhdGEoKTtcbiAgICBpZiAoIXBhdGhEYXRhKSB7XG4gICAgICB0aGlzLmhpZGVDb25uZWN0aW9uUG9wdXAoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiB0aGlzIG5vZGUgdHlwZSBpcyBhbGxvd2VkIHRvIGJlIGNyZWF0ZWRcbiAgICBjb25zdCBhbGxvd2VkVHlwZXMgPSB0aGlzLnN0YXRlLmdldEFsbG93ZWRUYXJnZXROb2RlVHlwZXMoKTtcbiAgICBpZiAoIWFsbG93ZWRUeXBlcy5pbmNsdWRlcyhub2RlVHlwZSkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGBDYW5ub3QgY3JlYXRlIGNvbm5lY3Rpb24gdG8gJHtub2RlVHlwZX0gZnJvbSBjdXJyZW50IG5vZGUgdHlwZWBcbiAgICAgICk7XG4gICAgICB0aGlzLmhpZGVDb25uZWN0aW9uUG9wdXAoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB7IGVuZFgsIGVuZFksIHNvdXJjZVN3aW1sYW5lSW5kZXggfSA9IHBhdGhEYXRhO1xuXG4gICAgLy8gQ2FsY3VsYXRlIHN3aW1sYW5lLXJlbGF0aXZlIHBvc2l0aW9uXG4gICAgY29uc3Qgc3dpbWxhbmVPZmZzZXRZID0gc291cmNlU3dpbWxhbmVJbmRleCAqIDI2MyArIDQwO1xuICAgIGNvbnN0IHJlbGF0aXZlWSA9IGVuZFkgLSBzd2ltbGFuZU9mZnNldFk7XG5cbiAgICAvLyBIYW5kbGUgcHJlY29uZGl0aW9ucyBiYXNlZCBvbiBub2RlIHR5cGVcbiAgICBpZiAobm9kZVR5cGUgPT09ICdzdGFnZScpIHtcbiAgICAgIC8vIE9wZW4gc3RhZ2UgcHJvcGVydGllcyBkaWFsb2cgaW5zdGVhZCBvZiBjcmVhdGluZyBub2RlIGRpcmVjdGx5XG4gICAgICB0aGlzLnBlbmRpbmdTdGFnZVBvc2l0aW9uID0ge1xuICAgICAgICBzd2ltbGFuZUluZGV4OiBzb3VyY2VTd2ltbGFuZUluZGV4LFxuICAgICAgICB4OiBlbmRYLFxuICAgICAgICB5OiBlbmRZLFxuICAgICAgfTtcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAnRW1pdHRpbmcgc2hvd1N0YWdlRGlhbG9nIGV2ZW50IHdpdGggcG9zaXRpb246JyxcbiAgICAgICAgdGhpcy5wZW5kaW5nU3RhZ2VQb3NpdGlvblxuICAgICAgKTtcbiAgICAgIHRoaXMuc2hvd1N0YWdlRGlhbG9nLmVtaXQoe1xuICAgICAgICBwb3NpdGlvbjogdGhpcy5wZW5kaW5nU3RhZ2VQb3NpdGlvbixcbiAgICAgICAgaXNGcm9tQ29ubmVjdGlvbjogdHJ1ZSxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5oaWRlQ29ubmVjdGlvblBvcHVwKCk7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIGlmIChub2RlVHlwZSA9PT0gJ3N1YmZsb3cnKSB7XG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgJ0NyZWF0aW5nIHN1YmZsb3cgZnJvbSBjb25uZWN0aW9uIGF0OicsXG4gICAgICAgIGVuZFgsXG4gICAgICAgIGVuZFksXG4gICAgICAgICdzd2ltbGFuZTonLFxuICAgICAgICBzb3VyY2VTd2ltbGFuZUluZGV4XG4gICAgICApO1xuICAgICAgLy8gU2hvdyB3b3JrZmxvdyBzZWxlY3Rpb24gcG9wdXAgYW5kIHN0b3JlIGNvbm5lY3Rpb24gZGF0YSBmb3IgbGF0ZXIgdXNlXG4gICAgICB0aGlzLnNob3dTdWJmbG93U2VsZWN0aW9uUG9wdXAoZW5kWCwgZW5kWSwgc291cmNlU3dpbWxhbmVJbmRleCk7XG4gICAgICB0aGlzLmhpZGVDb25uZWN0aW9uUG9wdXAoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBGb3Igb3RoZXIgbm9kZXMgQ3JlYXRlIHRoZSBuZXcgbm9kZSBhdCB0aGUgZW5kIHBvc2l0aW9uIG9mIHRoZSBjb25uZWN0aW9uXG4gICAgY29uc3QgbmV3Tm9kZSA9IHRoaXMuc3RhdGUuYWRkTm9kZShcbiAgICAgIHNvdXJjZVN3aW1sYW5lSW5kZXgsXG4gICAgICBub2RlVHlwZSBhcyBUb29sVHlwZSxcbiAgICAgIGVuZFgsXG4gICAgICByZWxhdGl2ZVlcbiAgICApO1xuXG4gICAgaWYgKFxuICAgICAgbmV3Tm9kZSAmJlxuICAgICAgbmV3Tm9kZS5jb25uZWN0aW9uUG9pbnRzICYmXG4gICAgICBuZXdOb2RlLmNvbm5lY3Rpb25Qb2ludHMubGVuZ3RoID4gMFxuICAgICkge1xuICAgICAgLy8gRmluZCB0aGUgbW9zdCBhcHByb3ByaWF0ZSBjb25uZWN0aW9uIHBvaW50IChjbG9zZXN0IHRvIHRoZSBzb3VyY2UpXG4gICAgICBjb25zdCBzb3VyY2VQb2ludCA9IHRoaXMuc3RhdGUuZHJhZ2dpbmdDb25uZWN0aW9uRGF0YS5zb3VyY2VQb2ludDtcbiAgICAgIGlmIChzb3VyY2VQb2ludCkge1xuICAgICAgICAvLyBGb3Igc2ltcGxpY2l0eSwgdXNlIHRoZSBmaXJzdCBjb25uZWN0aW9uIHBvaW50IG9mIG9wcG9zaW5nIHR5cGVcbiAgICAgICAgLy8gSW4gYSByZWFsIGltcGxlbWVudGF0aW9uLCB5b3UnZCBmaW5kIHRoZSBjbG9zZXN0IG9yIG1vc3QgYXBwcm9wcmlhdGUgcG9pbnRcbiAgICAgICAgbGV0IHRhcmdldFBvaW50O1xuXG4gICAgICAgIC8vIElmIHNvdXJjZSBpcyBvbiByaWdodCwgdGFyZ2V0IHNob3VsZCBiZSBvbiBsZWZ0LCBldGMuXG4gICAgICAgIGNvbnN0IG9wcG9zaW5nVHlwZSA9IHtcbiAgICAgICAgICByaWdodDogJ2xlZnQnLFxuICAgICAgICAgIGxlZnQ6ICdyaWdodCcsXG4gICAgICAgICAgdG9wOiAnYm90dG9tJyxcbiAgICAgICAgICBib3R0b206ICd0b3AnLFxuICAgICAgICB9W3NvdXJjZVBvaW50LnR5cGVdIGFzICd0b3AnIHwgJ3JpZ2h0JyB8ICdib3R0b20nIHwgJ2xlZnQnO1xuXG4gICAgICAgIHRhcmdldFBvaW50ID0gbmV3Tm9kZS5jb25uZWN0aW9uUG9pbnRzLmZpbmQoXG4gICAgICAgICAgKHApID0+IHAudHlwZSA9PT0gb3Bwb3NpbmdUeXBlXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHRhcmdldFBvaW50KSB7XG4gICAgICAgICAgLy8gQ3JlYXRlIHRoZSBjb25uZWN0aW9uXG4gICAgICAgICAgdGhpcy5zdGF0ZS5jcmVhdGVDb25uZWN0aW9uKFxuICAgICAgICAgICAgbmV3Tm9kZS5pZCxcbiAgICAgICAgICAgIHRhcmdldFBvaW50LmlkLFxuICAgICAgICAgICAgc291cmNlU3dpbWxhbmVJbmRleFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBFbmQgdGhlIGNvbm5lY3Rpb24gZHJhZ1xuICAgIHRoaXMuaGlkZUNvbm5lY3Rpb25Qb3B1cCgpO1xuICB9XG5cbiAgZ2V0Q29ubmVjdGlvblBhdGgoKTogc3RyaW5nIHtcbiAgICBjb25zdCBwYXRoRGF0YSA9IHRoaXMuc3RhdGUuZ2V0Q29ubmVjdGlvblBhdGhEYXRhKCk7XG4gICAgaWYgKCFwYXRoRGF0YSkgcmV0dXJuICcnO1xuXG4gICAgY29uc3QgeyBzdGFydFgsIHN0YXJ0WSwgZW5kWCwgZW5kWSB9ID0gcGF0aERhdGE7XG4gICAgY29uc3Qgc291cmNlUG9pbnQgPSB0aGlzLnN0YXRlLmRyYWdnaW5nQ29ubmVjdGlvbkRhdGEuc291cmNlUG9pbnQ7XG5cbiAgICBpZiAoIXNvdXJjZVBvaW50KSByZXR1cm4gJyc7XG5cbiAgICByZXR1cm4gdGhpcy5nZXRPcnRob2dvbmFsUGF0aChzdGFydFgsIHN0YXJ0WSwgZW5kWCwgZW5kWSwgc291cmNlUG9pbnQudHlwZSk7XG4gIH1cblxuICBnZXRDb25uZWN0aW9uUGF0aEZvclNhdmVkQ29ubmVjdGlvbihjb25uZWN0aW9uOiBDb25uZWN0aW9uKTogc3RyaW5nIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGF0aERhdGEgPSB0aGlzLnN0YXRlLmdldENvbm5lY3Rpb25EYXRhKGNvbm5lY3Rpb24pO1xuICAgICAgaWYgKCFwYXRoRGF0YSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdObyBwYXRoIGRhdGEgZm9yIGNvbm5lY3Rpb246JywgY29ubmVjdGlvbik7XG4gICAgICAgIHJldHVybiAnJztcbiAgICAgIH1cblxuICAgICAgY29uc3QgeyBzdGFydFgsIHN0YXJ0WSwgZW5kWCwgZW5kWSB9ID0gcGF0aERhdGE7XG5cbiAgICAgIGNvbnN0IHNvdXJjZU5vZGVJbmZvID0gdGhpcy5zdGF0ZS5maW5kTm9kZUJ5SWQoY29ubmVjdGlvbi5zb3VyY2VOb2RlSWQpO1xuICAgICAgaWYgKCFzb3VyY2VOb2RlSW5mbykge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdTb3VyY2Ugbm9kZSBub3QgZm91bmQgZm9yIGNvbm5lY3Rpb246JywgY29ubmVjdGlvbik7XG4gICAgICAgIHJldHVybiAnJztcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc291cmNlTm9kZSA9IHNvdXJjZU5vZGVJbmZvLm5vZGU7XG4gICAgICBjb25zdCBzb3VyY2VQb2ludCA9IHNvdXJjZU5vZGUuY29ubmVjdGlvblBvaW50cz8uZmluZChcbiAgICAgICAgKHApID0+IHAuaWQgPT09IGNvbm5lY3Rpb24uc291cmNlUG9pbnRJZFxuICAgICAgKTtcblxuICAgICAgaWYgKCFzb3VyY2VQb2ludCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdTb3VyY2UgcG9pbnQgbm90IGZvdW5kIGZvciBjb25uZWN0aW9uOicsIGNvbm5lY3Rpb24pO1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLmdldE9ydGhvZ29uYWxQYXRoKFxuICAgICAgICBzdGFydFgsXG4gICAgICAgIHN0YXJ0WSxcbiAgICAgICAgZW5kWCxcbiAgICAgICAgZW5kWSxcbiAgICAgICAgc291cmNlUG9pbnQudHlwZVxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZ2VuZXJhdGluZyBwYXRoIGZvciBjb25uZWN0aW9uOicsIGNvbm5lY3Rpb24sIGVycm9yKTtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gIH1cblxuICBnZXRPcnRob2dvbmFsUGF0aChcbiAgICBzdGFydFg6IG51bWJlcixcbiAgICBzdGFydFk6IG51bWJlcixcbiAgICBlbmRYOiBudW1iZXIsXG4gICAgZW5kWTogbnVtYmVyLFxuICAgIHBvaW50VHlwZTogJ3RvcCcgfCAncmlnaHQnIHwgJ2JvdHRvbScgfCAnbGVmdCdcbiAgKTogc3RyaW5nIHtcbiAgICAvLyBEZXRlcm1pbmUgaW5pdGlhbCBkaXJlY3Rpb24gYmFzZWQgb24gY29ubmVjdGlvbiBwb2ludCB0eXBlXG4gICAgbGV0IHBhdGggPSAnJztcblxuICAgIC8vIEZvciBzaWRlIHBvaW50cyAobGVmdC9yaWdodCksIHN0YXJ0IHdpdGggaG9yaXpvbnRhbCBsaW5lXG4gICAgaWYgKHBvaW50VHlwZSA9PT0gJ2xlZnQnIHx8IHBvaW50VHlwZSA9PT0gJ3JpZ2h0Jykge1xuICAgICAgLy8gQ2FsY3VsYXRlIGhvcml6b250YWwgZGlzdGFuY2VcbiAgICAgIGNvbnN0IGhvcml6b250YWxEaXN0ID0gZW5kWCAtIHN0YXJ0WDtcblxuICAgICAgLy8gSWYgdGhlIGVuZCBwb2ludCBpcyB2ZXJ5IGNsb3NlIGhvcml6b250YWxseSwgdXNlIGEgc2ltcGxlIDMtc2VnbWVudCBwYXRoXG4gICAgICBpZiAoTWF0aC5hYnMoaG9yaXpvbnRhbERpc3QpIDwgMzApIHtcbiAgICAgICAgY29uc3QgbWlkWSA9IChzdGFydFkgKyBlbmRZKSAvIDI7XG4gICAgICAgIHBhdGggPSBgTSAke3N0YXJ0WH0gJHtzdGFydFl9IEggJHtlbmRYfSBWICR7bWlkWX0gViAke2VuZFl9YDtcbiAgICAgIH1cbiAgICAgIC8vIE90aGVyd2lzZSwgY3JlYXRlIGEgcGF0aCB3aXRoIGhvcml6b250YWwgc2VnbWVudCBmaXJzdCwgdGhlbiB2ZXJ0aWNhbCwgdGhlbiBob3Jpem9udGFsXG4gICAgICBlbHNlIHtcbiAgICAgICAgcGF0aCA9IGBNICR7c3RhcnRYfSAke3N0YXJ0WX0gSCAke1xuICAgICAgICAgIHN0YXJ0WCArIGhvcml6b250YWxEaXN0IC8gMlxuICAgICAgICB9IFYgJHtlbmRZfSBIICR7ZW5kWH1gO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBGb3IgdG9wL2JvdHRvbSBwb2ludHMsIHN0YXJ0IHdpdGggdmVydGljYWwgbGluZVxuICAgIGVsc2UgaWYgKHBvaW50VHlwZSA9PT0gJ3RvcCcgfHwgcG9pbnRUeXBlID09PSAnYm90dG9tJykge1xuICAgICAgLy8gQ2FsY3VsYXRlIHZlcnRpY2FsIGRpc3RhbmNlXG4gICAgICBjb25zdCB2ZXJ0aWNhbERpc3QgPSBlbmRZIC0gc3RhcnRZO1xuXG4gICAgICAvLyBJZiB0aGUgZW5kIHBvaW50IGlzIHZlcnkgY2xvc2UgdmVydGljYWxseSwgdXNlIGEgc2ltcGxlIDMtc2VnbWVudCBwYXRoXG4gICAgICBpZiAoTWF0aC5hYnModmVydGljYWxEaXN0KSA8IDMwKSB7XG4gICAgICAgIGNvbnN0IG1pZFggPSAoc3RhcnRYICsgZW5kWCkgLyAyO1xuICAgICAgICBwYXRoID0gYE0gJHtzdGFydFh9ICR7c3RhcnRZfSBWICR7ZW5kWX0gSCAke21pZFh9IEggJHtlbmRYfWA7XG4gICAgICB9XG4gICAgICAvLyBPdGhlcndpc2UsIGNyZWF0ZSBhIHBhdGggd2l0aCB2ZXJ0aWNhbCBzZWdtZW50IGZpcnN0LCB0aGVuIGhvcml6b250YWwsIHRoZW4gdmVydGljYWxcbiAgICAgIGVsc2Uge1xuICAgICAgICBwYXRoID0gYE0gJHtzdGFydFh9ICR7c3RhcnRZfSBWICR7XG4gICAgICAgICAgc3RhcnRZICsgdmVydGljYWxEaXN0IC8gMlxuICAgICAgICB9IEggJHtlbmRYfSBWICR7ZW5kWX1gO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBwYXRoO1xuICB9XG5cbiAgb25TdGFnZVByb3BlcnRpZXNVcGRhdGVkKGV2ZW50OiB7XG4gICAgbm9kZUlkOiBzdHJpbmc7XG4gICAgc3RhZ2VEYXRhOiBQYXJ0aWFsPFdvcmtmbG93U3RhZ2U+O1xuICB9KTogdm9pZCB7XG4gICAgLy8gRmluZCB0aGUgbm9kZSBpbiB0aGUgc3dpbWxhbmVzXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnN0YXRlLnN3aW1sYW5lcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qgc3dpbWxhbmUgPSB0aGlzLnN0YXRlLnN3aW1sYW5lc1tpXTtcbiAgICAgIGNvbnN0IG5vZGVJbmRleCA9IHN3aW1sYW5lLm5vZGVzPy5maW5kSW5kZXgoKG4pID0+IG4uaWQgPT09IGV2ZW50Lm5vZGVJZCk7XG5cbiAgICAgIGlmIChub2RlSW5kZXggIT09IHVuZGVmaW5lZCAmJiBub2RlSW5kZXggPj0gMCkge1xuICAgICAgICAvLyBVcGRhdGUgdGhlIHN0YWdlIGRhdGFcbiAgICAgICAgaWYgKHN3aW1sYW5lLm5vZGVzKSB7XG4gICAgICAgICAgc3dpbWxhbmUubm9kZXNbbm9kZUluZGV4XS5zdGFnZURhdGEgPSB7XG4gICAgICAgICAgICAuLi5zd2ltbGFuZS5ub2Rlc1tub2RlSW5kZXhdLnN0YWdlRGF0YSxcbiAgICAgICAgICAgIC4uLmV2ZW50LnN0YWdlRGF0YSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgJ1VwZGF0ZWQgc3RhZ2UgZGF0YSBpbiBzd2ltbGFuZTonLFxuICAgICAgICAgICAgaSxcbiAgICAgICAgICAgICdub2RlOicsXG4gICAgICAgICAgICBub2RlSW5kZXgsXG4gICAgICAgICAgICAnZGF0YTonLFxuICAgICAgICAgICAgc3dpbWxhbmUubm9kZXNbbm9kZUluZGV4XS5zdGFnZURhdGFcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG9uQ29ubmVjdGlvbkNyZWF0ZWQoY29ubmVjdGlvbjogQ29ubmVjdGlvbik6IHZvaWQge1xuICAgIC8vIEFmdGVyIGEgY29ubmVjdGlvbiBpcyBjcmVhdGVkLCByZWZyZXNoIHRoZSBzb3VyY2Ugbm9kZSB0byB1cGRhdGUgaXRzIHN0YXRlXG4gICAgY29uc3Qgc291cmNlTm9kZUluZm8gPSB0aGlzLnN0YXRlLmZpbmROb2RlQnlJZChjb25uZWN0aW9uLnNvdXJjZU5vZGVJZCk7XG4gICAgaWYgKHNvdXJjZU5vZGVJbmZvICYmIHNvdXJjZU5vZGVJbmZvLm5vZGUudHlwZSA9PT0gJ3N0YWdlJykge1xuICAgICAgLy8gUmVmcmVzaCBub2RlIHN0YXRlXG4gICAgICB0aGlzLnVwZGF0ZU5vZGVDb25uZWN0aW9ucyhzb3VyY2VOb2RlSW5mby5ub2RlKTtcbiAgICB9XG4gIH1cblxuICAvLyBIZWxwZXIgbWV0aG9kIHRvIHVwZGF0ZSBub2RlJ3MgY29ubmVjdGlvbiBzdGF0dXNcbiAgdXBkYXRlTm9kZUNvbm5lY3Rpb25zKG5vZGU6IFdGTm9kZSk6IHZvaWQge1xuICAgIC8vIENvdW50IHRoZSBudW1iZXIgb2Ygb3V0Z29pbmcgY29ubmVjdGlvbnMgdGhhdCBjb25uZWN0IHRvIHN0YWdlc1xuICAgIGNvbnN0IG91dGdvaW5nQ29ubmVjdGlvbnMgPSB0aGlzLnN0YXRlLmNvbm5lY3Rpb25zLmZpbHRlcihcbiAgICAgIChjb25uKSA9PiBjb25uLnNvdXJjZU5vZGVJZCA9PT0gbm9kZS5pZFxuICAgICk7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgdGFyZ2V0IG5vZGVzIGFyZSBzdGFnZXNcbiAgICBjb25zdCBjb25uZWN0ZWRTdGFnZU5vZGVzID0gb3V0Z29pbmdDb25uZWN0aW9uc1xuICAgICAgLm1hcCgoY29ubikgPT4gdGhpcy5zdGF0ZS5maW5kTm9kZUJ5SWQoY29ubi50YXJnZXROb2RlSWQpKVxuICAgICAgLmZpbHRlcigobm9kZUluZm8pID0+IG5vZGVJbmZvICYmIG5vZGVJbmZvLm5vZGUudHlwZSA9PT0gJ3N0YWdlJyk7XG5cbiAgICBub2RlLmhhc011bHRpcGxlQ29ubmVjdGVkU3RhZ2VzID0gY29ubmVjdGVkU3RhZ2VOb2Rlcy5sZW5ndGggPiAxO1xuICB9XG5cbiAgb25FZGl0U3dpbWxhbmUoXG4gICAgZXZlbnQ6IE1vdXNlRXZlbnQsXG4gICAgc3dpbWxhbmU6IFN3aW1sYW5lSXRlbSxcbiAgICBzd2ltbGFuZUluZGV4OiBudW1iZXJcbiAgKTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IC8vIFByZXZlbnQgdGhlIGNhbnZhcyBjbGljayBldmVudCBmcm9tIGZpcmluZ1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgY29uc29sZS5sb2coJ0VkaXQgc3dpbWxhbmUgYnV0dG9uIGNsaWNrZWQgZm9yIHN3aW1sYW5lOicsIHN3aW1sYW5lSW5kZXgpO1xuXG4gICAgLy8gRW1pdCBhIHNwZWNpYWwgZXZlbnQgZm9yIGVkaXRpbmcgYSBzd2ltbGFuZVxuICAgIHRoaXMuY2xpY2tlZFBvc2l0aW9uLmVtaXQoe1xuICAgICAgeDogLTEsIC8vIFNwZWNpYWwgdmFsdWUgdG8gaW5kaWNhdGUgZWRpdCBtb2RlXG4gICAgICB5OiBzd2ltbGFuZUluZGV4LFxuICAgIH0pO1xuICB9XG5cbiAgLy8gc2hvd1N0YXJ0Tm9kZUZvcm1Qb3B1cChldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAvLyAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIC8vICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgLy8gICAvLyBJbXBsZW1lbnRhdGlvbiB3aWxsIGJlIHNpbWlsYXIgdG8gdGhlIHN0YWdlIGZvcm0gcG9wdXBcbiAgLy8gICAvLyBXZSdsbCBuZWVkIHRvIGFkZCBVSSBlbGVtZW50cyBmb3IgdGhpc1xuICAvLyAgIGNvbnNvbGUubG9nKCdTdGFydCBub2RlIGZvcm0gcG9wdXAgcmVxdWVzdGVkJyk7XG5cbiAgLy8gICAvLyBGb3Igbm93LCB0aGlzIGlzIGEgcGxhY2Vob2xkZXJcbiAgLy8gICAvLyBUaGUgYWN0dWFsIGltcGxlbWVudGF0aW9uIHdvdWxkIGxvYWQgZm9ybXMgYW5kIGFkZCB0aGVtIHRvIHRoZSB3b3JrZmxvd1xuICAvLyB9XG5cbiAgdG9nZ2xlU3RhcnROb2RlRm9ybVBvcHVwKFxuICAgIGV2ZW50OiBNb3VzZUV2ZW50LFxuICAgIG5vZGVYOiBudW1iZXIsXG4gICAgbm9kZVk6IG51bWJlcixcbiAgICBzd2ltbGFuZUluZGV4OiBudW1iZXJcbiAgKTogdm9pZCB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgIC8vIFNldCBwb3B1cCBwb3NpdGlvblxuICAgIGNvbnN0IHN3aW1sYW5lT2Zmc2V0ID0gc3dpbWxhbmVJbmRleCAqIDI2MyArIDQwO1xuICAgIHRoaXMuc3RhcnROb2RlRm9ybVBvcHVwWCA9IG5vZGVYIC0gMzA7IC8vIFBvc2l0aW9uIG5lYXIgdGhlIHN0YXJ0IG5vZGVcbiAgICB0aGlzLnN0YXJ0Tm9kZUZvcm1Qb3B1cFkgPSBub2RlWSArIHN3aW1sYW5lT2Zmc2V0O1xuXG4gICAgLy8gSWYgd2UncmUgb3BlbmluZyB0aGUgcG9wdXAsIGxvYWQgZm9ybXNcbiAgICBpZiAoIXRoaXMuc2hvd1N0YXJ0Tm9kZUZvcm1Qb3B1cCkge1xuICAgICAgdGhpcy5pc0xvYWRpbmdTdGFydE5vZGVGb3JtcyA9IHRydWU7XG4gICAgICB0aGlzLmRhdGFTZXJ2aWNlXG4gICAgICAgIC5nZXRGb3JtcygpXG4gICAgICAgIC50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgIHRoaXMuc3RhcnROb2RlRm9ybXNMaXN0ID0gcmVzcG9uc2UuUmVzdWx0O1xuICAgICAgICAgIHRoaXMuaXNMb2FkaW5nU3RhcnROb2RlRm9ybXMgPSBmYWxzZTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGxvYWRpbmcgZm9ybXM6JywgZXJyb3IpO1xuICAgICAgICAgIHRoaXMuaXNMb2FkaW5nU3RhcnROb2RlRm9ybXMgPSBmYWxzZTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5zaG93U3RhcnROb2RlRm9ybVBvcHVwID0gIXRoaXMuc2hvd1N0YXJ0Tm9kZUZvcm1Qb3B1cDtcbiAgfVxuXG4gIHNlbGVjdFN0YXJ0Tm9kZUZvcm0oZm9ybTogRm9ybUVudGl0eSB8IG51bGwpOiB2b2lkIHtcbiAgICBpZiAoZm9ybSkge1xuICAgICAgdGhpcy5zdGF0ZS5zZXRXb3JrZmxvd0Zvcm0oZm9ybS5JZCwgZm9ybS5OYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zdGF0ZS5zZXRXb3JrZmxvd0Zvcm0obnVsbCwgbnVsbCk7XG4gICAgfVxuXG4gICAgLy8gQ2xvc2UgdGhlIHBvcHVwXG4gICAgdGhpcy5zaG93U3RhcnROb2RlRm9ybVBvcHVwID0gZmFsc2U7XG4gIH1cblxuICBzaG93U3ViZmxvd1NlbGVjdGlvblBvcHVwKHg6IG51bWJlciwgeTogbnVtYmVyLCBzd2ltbGFuZUluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnN1YmZsb3dQb3B1cFggPSB4O1xuICAgIHRoaXMuc3ViZmxvd1BvcHVwWSA9IHk7XG4gICAgdGhpcy5wZW5kaW5nU3ViZmxvd1Bvc2l0aW9uID0geyBzd2ltbGFuZUluZGV4LCB4LCB5IH07XG5cbiAgICAvLyBTdG9yZSBjb25uZWN0aW9uIGRhdGEgaWYgd2UncmUgY3JlYXRpbmcgZnJvbSBhIGNvbm5lY3Rpb25cbiAgICBpZiAodGhpcy5zdGF0ZS5pc0Nvbm5lY3Rpb25EcmFnZ2luZygpKSB7XG4gICAgICAvLyBTdG9yZSB0aGUgc291cmNlIGNvbm5lY3Rpb24gZGF0YVxuICAgICAgdGhpcy5wZW5kaW5nQ29ubmVjdGlvblNvdXJjZVBvaW50ID1cbiAgICAgICAgdGhpcy5zdGF0ZS5kcmFnZ2luZ0Nvbm5lY3Rpb25EYXRhLnNvdXJjZVBvaW50ID8/IG51bGw7XG4gICAgICB0aGlzLnBlbmRpbmdDb25uZWN0aW9uU291cmNlU3dpbWxhbmVJbmRleCA9XG4gICAgICAgIHRoaXMuc3RhdGUuZHJhZ2dpbmdDb25uZWN0aW9uRGF0YS5zb3VyY2VTd2ltbGFuZUluZGV4ID8/IG51bGw7XG4gICAgICBjb25zb2xlLmxvZygnU3RvcmVkIGNvbm5lY3Rpb24gZGF0YSBmb3Igc3ViZmxvdzonLCB7XG4gICAgICAgIHNvdXJjZVBvaW50OiB0aGlzLnBlbmRpbmdDb25uZWN0aW9uU291cmNlUG9pbnQsXG4gICAgICAgIHNvdXJjZVN3aW1sYW5lSW5kZXg6IHRoaXMucGVuZGluZ0Nvbm5lY3Rpb25Tb3VyY2VTd2ltbGFuZUluZGV4LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gTG9hZCB3b3JrZmxvd3NcbiAgICB0aGlzLmlzTG9hZGluZ1dvcmtmbG93cyA9IHRydWU7XG4gICAgdGhpcy5kYXRhU2VydmljZVxuICAgICAgLmdldFdvcmtmbG93cygpXG4gICAgICAudGhlbigocmVzcG9uc2UpID0+IHtcbiAgICAgICAgdGhpcy53b3JrZmxvd3NMaXN0ID0gcmVzcG9uc2UuUmVzdWx0O1xuICAgICAgICB0aGlzLmlzTG9hZGluZ1dvcmtmbG93cyA9IGZhbHNlO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgbG9hZGluZyB3b3JrZmxvd3M6JywgZXJyb3IpO1xuICAgICAgICB0aGlzLmlzTG9hZGluZ1dvcmtmbG93cyA9IGZhbHNlO1xuICAgICAgfSk7XG5cbiAgICB0aGlzLnNob3dTdWJmbG93UG9wdXAgPSB0cnVlO1xuICB9XG5cbiAgc2VsZWN0U3ViZmxvd1dvcmtmbG93KHdvcmtmbG93OiBXb3JrZmxvdyk6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKCdTZWxlY3Rpbmcgd29ya2Zsb3cgZm9yIHN1YmZsb3c6Jywgd29ya2Zsb3cuTmFtZSk7XG4gICAgY29uc29sZS5sb2coJ1BlbmRpbmcgY29ubmVjdGlvbiBkYXRhOicsIHtcbiAgICAgIHNvdXJjZVBvaW50OiB0aGlzLnBlbmRpbmdDb25uZWN0aW9uU291cmNlUG9pbnQsXG4gICAgICBzb3VyY2VTd2ltbGFuZUluZGV4OiB0aGlzLnBlbmRpbmdDb25uZWN0aW9uU291cmNlU3dpbWxhbmVJbmRleCxcbiAgICAgIHBvc2l0aW9uOiB0aGlzLnBlbmRpbmdTdWJmbG93UG9zaXRpb24sXG4gICAgfSk7XG5cbiAgICBpZiAodGhpcy5wZW5kaW5nU3ViZmxvd1Bvc2l0aW9uKSB7XG4gICAgICBjb25zdCB7IHN3aW1sYW5lSW5kZXgsIHgsIHkgfSA9IHRoaXMucGVuZGluZ1N1YmZsb3dQb3NpdGlvbjtcblxuICAgICAgLy8gQ3JlYXRlIHRoZSBzdWJmbG93IG5vZGUgd2l0aCB0aGUgc2VsZWN0ZWQgd29ya2Zsb3cgZGF0YVxuICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhdGUuYWRkTm9kZShcbiAgICAgICAgc3dpbWxhbmVJbmRleCxcbiAgICAgICAgJ3N1YmZsb3cnLFxuICAgICAgICB4LFxuICAgICAgICB5LFxuICAgICAgICB1bmRlZmluZWQsIC8vIE5vIHN0YWdlIGRhdGFcbiAgICAgICAgeyBpZDogd29ya2Zsb3cuSWQsIG5hbWU6IHdvcmtmbG93Lk5hbWUgfVxuICAgICAgKTtcblxuICAgICAgY29uc29sZS5sb2coJ0NyZWF0ZWQgc3ViZmxvdyBub2RlOicsIG5vZGUpO1xuXG4gICAgICAvLyBJZiB0aGlzIHdhcyBjcmVhdGVkIGZyb20gYSBjb25uZWN0aW9uLCBjcmVhdGUgdGhlIGNvbm5lY3Rpb25cbiAgICAgIGlmIChub2RlICYmIHRoaXMucGVuZGluZ0Nvbm5lY3Rpb25Tb3VyY2VQb2ludCkge1xuICAgICAgICBjb25zb2xlLmxvZygnQ3JlYXRpbmcgY29ubmVjdGlvbiB0byBuZXcgc3ViZmxvdyBub2RlJyk7XG5cbiAgICAgICAgLy8gRmluZCBhIHN1aXRhYmxlIGNvbm5lY3Rpb24gcG9pbnQgb24gdGhlIG5ldyBub2RlXG4gICAgICAgIGlmIChub2RlLmNvbm5lY3Rpb25Qb2ludHMgJiYgbm9kZS5jb25uZWN0aW9uUG9pbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCBzb3VyY2VQb2ludCA9IHRoaXMucGVuZGluZ0Nvbm5lY3Rpb25Tb3VyY2VQb2ludDtcblxuICAgICAgICAgIC8vIEZpbmQgb3Bwb3NpbmcgdHlwZSBjb25uZWN0aW9uIHBvaW50XG4gICAgICAgICAgY29uc3Qgb3Bwb3NpbmdUeXBlID0ge1xuICAgICAgICAgICAgcmlnaHQ6ICdsZWZ0JyxcbiAgICAgICAgICAgIGxlZnQ6ICdyaWdodCcsXG4gICAgICAgICAgICB0b3A6ICdib3R0b20nLFxuICAgICAgICAgICAgYm90dG9tOiAndG9wJyxcbiAgICAgICAgICB9W3NvdXJjZVBvaW50LnR5cGVdIGFzICd0b3AnIHwgJ3JpZ2h0JyB8ICdib3R0b20nIHwgJ2xlZnQnO1xuXG4gICAgICAgICAgY29uc3QgdGFyZ2V0UG9pbnQgPSBub2RlLmNvbm5lY3Rpb25Qb2ludHMuZmluZChcbiAgICAgICAgICAgIChwKSA9PiBwLnR5cGUgPT09IG9wcG9zaW5nVHlwZVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAodGFyZ2V0UG9pbnQpIHtcbiAgICAgICAgICAgIC8vIENyZWF0ZSBjb25uZWN0aW9uXG4gICAgICAgICAgICBjb25zdCBjb25uZWN0aW9uID0ge1xuICAgICAgICAgICAgICBpZDogYGNvbm4tJHtEYXRlLm5vdygpfS0ke01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDEwMDApfWAsXG4gICAgICAgICAgICAgIHNvdXJjZU5vZGVJZDogc291cmNlUG9pbnQubm9kZUlkLFxuICAgICAgICAgICAgICB0YXJnZXROb2RlSWQ6IG5vZGUuaWQsXG4gICAgICAgICAgICAgIHNvdXJjZVBvaW50SWQ6IHNvdXJjZVBvaW50LmlkLFxuICAgICAgICAgICAgICB0YXJnZXRQb2ludElkOiB0YXJnZXRQb2ludC5pZCxcbiAgICAgICAgICAgICAgc291cmNlU3dpbWxhbmVJbmRleDogdGhpcy5wZW5kaW5nQ29ubmVjdGlvblNvdXJjZVN3aW1sYW5lSW5kZXghLFxuICAgICAgICAgICAgICB0YXJnZXRTd2ltbGFuZUluZGV4OiBzd2ltbGFuZUluZGV4LFxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgLy8gQWRkIGNvbm5lY3Rpb24gZGlyZWN0bHkgdG8gdGhlIHN0YXRlJ3MgY29ubmVjdGlvbnMgYXJyYXlcbiAgICAgICAgICAgIHRoaXMuc3RhdGUuY29ubmVjdGlvbnMucHVzaChjb25uZWN0aW9uKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdBZGRlZCBjb25uZWN0aW9uIHRvIHN0YXRlOicsIGNvbm5lY3Rpb24pO1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ0Nvbm5lY3Rpb25zIGFmdGVyIGFkZGluZzonLCB0aGlzLnN0YXRlLmNvbm5lY3Rpb25zKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zdGF0ZS5lbmRDb25uZWN0aW9uRHJhZygpO1xuICAgICAgfVxuXG4gICAgICAvLyBSZXNldCBzZWxlY3Rpb24gdG9vbCBpbiBwYXJlbnQgY29tcG9uZW50XG4gICAgICB0aGlzLnN1YmZsb3dTZWxlY3RlZC5lbWl0KCk7XG4gICAgfVxuXG4gICAgLy8gQ2xlYW4gdXBcbiAgICB0aGlzLnNob3dTdWJmbG93UG9wdXAgPSBmYWxzZTtcbiAgICB0aGlzLnBlbmRpbmdTdWJmbG93UG9zaXRpb24gPSBudWxsO1xuICAgIHRoaXMucGVuZGluZ0Nvbm5lY3Rpb25Tb3VyY2VQb2ludCA9IG51bGw7XG4gICAgdGhpcy5wZW5kaW5nQ29ubmVjdGlvblNvdXJjZVN3aW1sYW5lSW5kZXggPSBudWxsO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiY2FudmFzLWNvbnRhaW5lclwiPlxuICA8c3ZnXG4gICAgI2NhbnZhc1xuICAgIFthdHRyLndpZHRoXT1cImNhbnZhc1dpZHRoXCJcbiAgICBbYXR0ci5oZWlnaHRdPVwiY2FudmFzSGVpZ2h0XCJcbiAgICBjbGFzcz1cImRlc2lnbmVyLWNhbnZhc1wiXG4gICAgKGNsaWNrKT1cIm9uQ2FudmFzQ2xpY2soJGV2ZW50KVwiXG4gID5cbiAgICA8ZGVmcz5cbiAgICAgIDwhLS0gR3JpZCBwYXR0ZXJuIGRlZmluaXRpb24gLS0+XG5cbiAgICAgIDxwYXR0ZXJuXG4gICAgICAgIGlkPVwiZ3JpZFwiXG4gICAgICAgIFthdHRyLndpZHRoXT1cImdyaWRTaXplXCJcbiAgICAgICAgW2F0dHIuaGVpZ2h0XT1cImdyaWRTaXplXCJcbiAgICAgICAgcGF0dGVyblVuaXRzPVwidXNlclNwYWNlT25Vc2VcIlxuICAgICAgPlxuICAgICAgICA8cGF0aFxuICAgICAgICAgIGQ9XCJNIDIwIDAgTCAwIDAgMCAyMFwiXG4gICAgICAgICAgZmlsbD1cIm5vbmVcIlxuICAgICAgICAgIHN0cm9rZT1cIiNlMmU4ZjBcIlxuICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjAuNVwiXG4gICAgICAgIC8+XG4gICAgICA8L3BhdHRlcm4+XG5cbiAgICAgIDwhLS0gQXJyb3cgaGVhZCBtYXJrZXIgZGVmaW5pdGlvbiAtLT5cbiAgICAgIDxtYXJrZXJcbiAgICAgICAgaWQ9XCJhcnJvd2hlYWRcIlxuICAgICAgICBtYXJrZXJXaWR0aD1cIjEwXCJcbiAgICAgICAgbWFya2VySGVpZ2h0PVwiN1wiXG4gICAgICAgIHJlZlg9XCI5XCJcbiAgICAgICAgcmVmWT1cIjMuNVwiXG4gICAgICAgIG9yaWVudD1cImF1dG9cIlxuICAgICAgPlxuICAgICAgICA8cG9seWdvbiBwb2ludHM9XCIwIDAsIDEwIDMuNSwgMCA3XCIgZmlsbD1cIiNEMzZDRkZcIiAvPlxuICAgICAgPC9tYXJrZXI+XG5cbiAgICAgIDwhLS0gQ29ubmVjdGlvbiBwb2ludCBzdHlsZXMgLS0+XG4gICAgICA8Y2lyY2xlXG4gICAgICAgIGlkPVwiY29ubmVjdGlvbi1wb2ludC10ZW1wbGF0ZVwiXG4gICAgICAgIHI9XCI1XCJcbiAgICAgICAgZmlsbD1cIiNEMzZDRkZcIlxuICAgICAgICBzdHJva2U9XCIjRkZGRkZGXCJcbiAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMVwiXG4gICAgICAvPlxuXG4gICAgICA8IS0tIERhc2hlZCBsaW5lIHN0eWxlIGZvciBjb25uZWN0aW9uIHByZXZpZXcgLS0+XG4gICAgICA8cGF0dGVyblxuICAgICAgICBpZD1cImRhc2hlZC1saW5lXCJcbiAgICAgICAgd2lkdGg9XCIxMFwiXG4gICAgICAgIGhlaWdodD1cIjEwXCJcbiAgICAgICAgcGF0dGVyblVuaXRzPVwidXNlclNwYWNlT25Vc2VcIlxuICAgICAgPlxuICAgICAgICA8bGluZVxuICAgICAgICAgIHgxPVwiMFwiXG4gICAgICAgICAgeTE9XCI1XCJcbiAgICAgICAgICB4Mj1cIjEwXCJcbiAgICAgICAgICB5Mj1cIjVcIlxuICAgICAgICAgIHN0cm9rZT1cIiNEMzZDRkZcIlxuICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjJcIlxuICAgICAgICAgIHN0cm9rZS1kYXNoYXJyYXk9XCI1LDVcIlxuICAgICAgICAvPlxuICAgICAgPC9wYXR0ZXJuPlxuICAgIDwvZGVmcz5cblxuICAgIDwhLS0gQmFja2dyb3VuZCBncmlkIC0tPlxuICAgIDxyZWN0IHdpZHRoPVwiMTAwJVwiIGhlaWdodD1cIjEwMCVcIiBmaWxsPVwidXJsKCNncmlkKVwiIC8+XG5cbiAgICA8IS0tIERpc3BsYXkgYSBtZXNzYWdlIHdoZW4gbm8gc3dpbWxhbmVzIGV4aXN0IC0tPlxuICAgIEBpZiAoc3RhdGUuc3dpbWxhbmVzLmxlbmd0aCA9PT0gMCkge1xuICAgIDx0ZXh0XG4gICAgICB4PVwiNTAlXCJcbiAgICAgIHk9XCI1MCVcIlxuICAgICAgZm9udC1mYW1pbHk9XCJzYW5zLXNlcmlmXCJcbiAgICAgIGZvbnQtc2l6ZT1cIjE2XCJcbiAgICAgIGZpbGw9XCIjOTRhM2I4XCJcbiAgICAgIHRleHQtYW5jaG9yPVwibWlkZGxlXCJcbiAgICA+XG4gICAgICBTZWxlY3QgdGhlIFN3aW1sYW5lIHRvb2wgYW5kIGNsaWNrIG9uIHRoZSBjYW52YXMgdG8gYWRkIGEgc3dpbWxhbmVcbiAgICA8L3RleHQ+XG4gICAgfVxuXG4gICAgPCEtLSBUaGlzIGlzIHdoZXJlIHdvcmtmbG93IGVsZW1lbnRzIHdpbGwgYmUgYWRkZWQgbGF0ZXIgLS0+XG4gICAgQGZvciAoc3dpbWxhbmUgb2Ygc3RhdGUuc3dpbWxhbmVzOyB0cmFjayBzd2ltbGFuZS5vcmRlcikge1xuICAgIDxnIFthdHRyLnRyYW5zZm9ybV09XCIndHJhbnNsYXRlKDAsJyArIHN3aW1sYW5lLm9yZGVyICogMjYzICsgJyknXCI+XG4gICAgICA8IS0tIFN3aW1sYW5lIGNvbnRhaW5lciAtLT5cbiAgICAgIDxyZWN0XG4gICAgICAgIHg9XCIwXCJcbiAgICAgICAgeT1cIjBcIlxuICAgICAgICBbYXR0ci53aWR0aF09XCJjYW52YXNXaWR0aFwiXG4gICAgICAgIFthdHRyLmhlaWdodF09XCIyNjNcIlxuICAgICAgICBmaWxsPVwiI2ZmZmZmZlwiXG4gICAgICAgIHN0cm9rZT1cIiNlMmU4ZjBcIlxuICAgICAgICBzdHJva2Utd2lkdGg9XCIxXCJcbiAgICAgID48L3JlY3Q+XG5cbiAgICAgIDwhLS0gU3dpbWxhbmUgaGVhZGVyIC0tPlxuICAgICAgPHJlY3RcbiAgICAgICAgeD1cIjBcIlxuICAgICAgICB5PVwiMFwiXG4gICAgICAgIFthdHRyLndpZHRoXT1cImNhbnZhc1dpZHRoXCJcbiAgICAgICAgaGVpZ2h0PVwiNDBcIlxuICAgICAgICBmaWxsPVwiI2Y4ZmFmY1wiXG4gICAgICAgIHN0cm9rZT1cIiNlMmU4ZjBcIlxuICAgICAgICBzdHJva2Utd2lkdGg9XCIxXCJcbiAgICAgID48L3JlY3Q+XG5cbiAgICAgIDwhLS0gU3dpbWxhbmUgbGFiZWwgLS0+XG4gICAgICA8dGV4dFxuICAgICAgICB4PVwiMjBcIlxuICAgICAgICB5PVwiMjVcIlxuICAgICAgICBmb250LWZhbWlseT1cInNhbnMtc2VyaWZcIlxuICAgICAgICBmb250LXNpemU9XCIxNFwiXG4gICAgICAgIGZpbGw9XCIjMzMzMzMzXCJcbiAgICAgICAgZm9udC13ZWlnaHQ9XCJib2xkXCJcbiAgICAgID5cbiAgICAgICAge3sgc3dpbWxhbmUubGFiZWwgfX1cbiAgICAgIDwvdGV4dD5cblxuICAgICAgPCEtLSBFZGl0IGJ1dHRvbiAtLT5cbiAgICAgIDxnXG4gICAgICAgIGNsYXNzPVwiZWRpdC1zd2ltbGFuZS1idXR0b25cIlxuICAgICAgICBbYXR0ci50cmFuc2Zvcm1dPVwiJ3RyYW5zbGF0ZSgyMDAsIDIwKSdcIlxuICAgICAgICAoY2xpY2spPVwiXG4gICAgICAgICAgb25FZGl0U3dpbWxhbmUoJGV2ZW50LCBzd2ltbGFuZSwgc3dpbWxhbmUub3JkZXIpO1xuICAgICAgICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVxuICAgICAgICBcIlxuICAgICAgPlxuICAgICAgICA8cmVjdFxuICAgICAgICAgIHg9XCItNVwiXG4gICAgICAgICAgeT1cIi0xNVwiXG4gICAgICAgICAgd2lkdGg9XCI0MFwiXG4gICAgICAgICAgaGVpZ2h0PVwiMjBcIlxuICAgICAgICAgIGZpbGw9XCIjZjNlOGZmXCJcbiAgICAgICAgICByeD1cIjNcIlxuICAgICAgICAgIHJ5PVwiM1wiXG4gICAgICAgICAgc3Ryb2tlPVwiI2Q4YjRmZVwiXG4gICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMVwiXG4gICAgICAgID48L3JlY3Q+XG4gICAgICAgIDx0ZXh0XG4gICAgICAgICAgeD1cIjE1XCJcbiAgICAgICAgICB5PVwiMFwiXG4gICAgICAgICAgZm9udC1mYW1pbHk9XCJzYW5zLXNlcmlmXCJcbiAgICAgICAgICBmb250LXNpemU9XCIxMlwiXG4gICAgICAgICAgZmlsbD1cIiM3ZTIyY2VcIlxuICAgICAgICAgIHRleHQtYW5jaG9yPVwibWlkZGxlXCJcbiAgICAgICAgPlxuICAgICAgICAgIEVkaXRcbiAgICAgICAgPC90ZXh0PlxuICAgICAgPC9nPlxuXG4gICAgICA8IS0tIFRhZyBpbmRpY2F0b3JzIC0tPlxuICAgICAgPGcgW2F0dHIudHJhbnNmb3JtXT1cIid0cmFuc2xhdGUoMjAwLCAyMCknXCI+XG4gICAgICAgIEBmb3IgKHRhZyBvZiBzd2ltbGFuZS50YWdzLnNsaWNlKDAsIDMpOyB0cmFjayB0YWcuTmFtZTsgbGV0IGkgPSAkaW5kZXgpXG4gICAgICAgIHtcbiAgICAgICAgPHRleHRcbiAgICAgICAgICBbYXR0ci54XT1cImkgKiAxMDBcIlxuICAgICAgICAgIHk9XCI1XCJcbiAgICAgICAgICBmb250LWZhbWlseT1cInNhbnMtc2VyaWZcIlxuICAgICAgICAgIGZvbnQtc2l6ZT1cIjEyXCJcbiAgICAgICAgICBmaWxsPVwiIzY2NjY2NlwiXG4gICAgICAgID5cbiAgICAgICAgICB7eyB0YWcuTmFtZSB9fVxuICAgICAgICA8L3RleHQ+XG4gICAgICAgIH0gQGlmIChzd2ltbGFuZS50YWdzLmxlbmd0aCA+IDMpIHtcbiAgICAgICAgPHRleHRcbiAgICAgICAgICBbYXR0ci54XT1cIjMgKiAxMDAgKyAxMFwiXG4gICAgICAgICAgeT1cIjVcIlxuICAgICAgICAgIGZvbnQtZmFtaWx5PVwic2Fucy1zZXJpZlwiXG4gICAgICAgICAgZm9udC1zaXplPVwiMTJcIlxuICAgICAgICAgIGZpbGw9XCIjNjY2NjY2XCJcbiAgICAgICAgPlxuICAgICAgICAgICt7eyBzd2ltbGFuZS50YWdzLmxlbmd0aCAtIDMgfX0gbW9yZVxuICAgICAgICA8L3RleHQ+XG4gICAgICAgIH1cbiAgICAgIDwvZz5cblxuICAgICAgPCEtLSBSZW5kZXIgbm9kZXMgaW4gdGhpcyBzd2ltbGFuZSAtLT5cbiAgICAgIEBmb3IgKG5vZGUgb2Ygc3dpbWxhbmUubm9kZXM7IHRyYWNrIG5vZGUuaWQpIHtcbiAgICAgIDxnXG4gICAgICAgIFthdHRyLnRyYW5zZm9ybV09XCIndHJhbnNsYXRlKCcgKyBub2RlLnggKyAnLCcgKyAobm9kZS55ICsgNDApICsgJyknXCJcbiAgICAgICAgKG1vdXNlZW50ZXIpPVwic2hvd0Nvbm5lY3Rpb25Qb2ludHMobm9kZS5pZCwgc3dpbWxhbmUub3JkZXIpXCJcbiAgICAgICAgKG1vdXNlbGVhdmUpPVwiaGlkZUNvbm5lY3Rpb25Qb2ludHMobm9kZS5pZClcIlxuICAgICAgPlxuICAgICAgICA8IS0tIFN0YXJ0IG5vZGUgaW5kaWNhdG9yIChjaXJjbGUgYW5kIGFycm93KSBmb3IgdGhlIGZpcnN0IG5vZGUgLS0+XG4gICAgICAgIEBpZiAobm9kZS5pc1N0YXJ0Tm9kZSkge1xuICAgICAgICA8IS0tIENpcmNsZSAtLT5cbiAgICAgICAgPGNpcmNsZVxuICAgICAgICAgIGN4PVwiLTMwXCJcbiAgICAgICAgICBjeT1cIjUwXCJcbiAgICAgICAgICByPVwiMTVcIlxuICAgICAgICAgIGZpbGw9XCJub25lXCJcbiAgICAgICAgICBzdHJva2U9XCIjRDM2Q0ZGXCJcbiAgICAgICAgICBzdHJva2Utd2lkdGg9XCIxXCJcbiAgICAgICAgPjwvY2lyY2xlPlxuICAgICAgICA8IS0tIEZvcm0gaWNvbiBmb3Igc3RhcnQgbm9kZSAtLT5cbiAgICAgICAgPHN2ZzpnXG4gICAgICAgICAgKGNsaWNrKT1cIlxuICAgICAgICAgICAgdG9nZ2xlU3RhcnROb2RlRm9ybVBvcHVwKCRldmVudCwgbm9kZS54LCBub2RlLnksIHN3aW1sYW5lLm9yZGVyKVxuICAgICAgICAgIFwiXG4gICAgICAgICAgY2xhc3M9XCJzdGFnZS1pY29uXCJcbiAgICAgICAgICB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoLTQ1LCA0MilcIlxuICAgICAgICAgIHN0eWxlPVwiY3Vyc29yOiBwb2ludGVyOyBwb2ludGVyLWV2ZW50czogYWxsXCJcbiAgICAgICAgPlxuICAgICAgICAgIDwhLS0gVHJhbnNwYXJlbnQgcmVjdGFuZ2xlIHRvIGNhcHR1cmUgY2xpY2tzIC0tPlxuICAgICAgICAgIDxzdmc6cmVjdFxuICAgICAgICAgICAgeD1cIi0yXCJcbiAgICAgICAgICAgIHk9XCItMlwiXG4gICAgICAgICAgICB3aWR0aD1cIjI0XCJcbiAgICAgICAgICAgIGhlaWdodD1cIjI0XCJcbiAgICAgICAgICAgIGZpbGw9XCJ0cmFuc3BhcmVudFwiXG4gICAgICAgICAgICBzdHlsZT1cImN1cnNvcjogcG9pbnRlclwiXG4gICAgICAgICAgLz5cbiAgICAgICAgICA8c3ZnOnBhdGhcbiAgICAgICAgICAgIGQ9XCJNMTYuNSAyMC40NzVWMTcuNDc1SDEzLjVWMTYuNDc1SDE2LjVWMTMuNDc1SDE3LjVWMTYuNDc1SDIwLjVWMTcuNDc1SDE3LjVWMjAuNDc1SDE2LjVaTTMuNSAxNy41VjE2LjVINC41VjE3LjVIMy41Wk02LjUgMTcuNVYxNi41SDExLjUxN0MxMS41MDU3IDE2LjY3NjcgMTEuNTA0MyAxNi44NDUgMTEuNTEzIDE3LjAwNUMxMS41MjEgMTcuMTY1IDExLjUzMSAxNy4zMyAxMS41NDMgMTcuNUg2LjVaTTMuNSAxMy41VjEyLjVINC41VjEzLjVIMy41Wk02LjUgMTMuNVYxMi41SDEzLjgwNEMxMy42MTI3IDEyLjYzODcgMTMuNDMzMyAxMi43OTEzIDEzLjI2NiAxMi45NThDMTMuMDk5MyAxMy4xMjQ3IDEyLjkzNzcgMTMuMzA1MyAxMi43ODEgMTMuNUg2LjVaTTMuNSA5LjVWOC41SDQuNVY5LjVIMy41Wk02LjUgOS41VjguNUgxOC41VjkuNUg2LjVaTTMuNSA1LjVWNC41SDQuNVY1LjVIMy41Wk02LjUgNS41VjQuNUgxOC41VjUuNUg2LjVaXCJcbiAgICAgICAgICAgIFthdHRyLmZpbGxdPVwic3RhdGUud29ya2Zsb3dGb3JtSWQgPyAnI0QzNkNGRicgOiAnYmxhY2snXCJcbiAgICAgICAgICAgIHRyYW5zZm9ybT1cInNjYWxlKDAuNylcIlxuICAgICAgICAgIC8+XG4gICAgICAgIDwvc3ZnOmc+XG4gICAgICAgIDwhLS0gQXJyb3cgZnJvbSBjaXJjbGUgdG8gbm9kZSAtLT5cbiAgICAgICAgPHBhdGhcbiAgICAgICAgICBkPVwiTSAtMjAgNTAgTCAwIDUwXCJcbiAgICAgICAgICBzdHJva2U9XCIjRDM2Q0ZGXCJcbiAgICAgICAgICBzdHJva2Utd2lkdGg9XCIxXCJcbiAgICAgICAgICBtYXJrZXItZW5kPVwidXJsKCNhcnJvd2hlYWQpXCJcbiAgICAgICAgPjwvcGF0aD5cbiAgICAgICAgfVxuXG4gICAgICAgIDwhLS0gU3RhZ2Ugbm9kZSAtLT5cbiAgICAgICAgQGlmIChub2RlLnR5cGUgPT09ICdzdGFnZScpIHtcbiAgICAgICAgPCEtLSA8cmVjdFxuICAgICAgICAgIHg9XCIwXCJcbiAgICAgICAgICB5PVwiMFwiXG4gICAgICAgICAgW2F0dHIud2lkdGhdPVwibm9kZS53aWR0aFwiXG4gICAgICAgICAgW2F0dHIuaGVpZ2h0XT1cIm5vZGUuaGVpZ2h0XCJcbiAgICAgICAgICBmaWxsPVwibm9uZVwiXG4gICAgICAgICAgc3Ryb2tlPVwiI0QzNkNGRlwiXG4gICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMVwiXG4gICAgICAgID48L3JlY3Q+IC0tPlxuICAgICAgICA8c3ZnOmdcbiAgICAgICAgICBsaWItc3RhZ2Utbm9kZVxuICAgICAgICAgIFtub2RlXT1cIm5vZGVcIlxuICAgICAgICAgIFtpc1N0YXJ0Tm9kZV09XCJub2RlLmlzU3RhcnROb2RlXCJcbiAgICAgICAgICAoc3RhZ2VQcm9wZXJ0aWVzVXBkYXRlZCk9XCJvblN0YWdlUHJvcGVydGllc1VwZGF0ZWQoJGV2ZW50KVwiXG4gICAgICAgID48L3N2ZzpnPlxuICAgICAgICB9XG5cbiAgICAgICAgPCEtLSBEZWNpc2lvbiBub2RlIC0tPlxuICAgICAgICBAaWYgKG5vZGUudHlwZSA9PT0gJ2RlY2lzaW9uJykge1xuICAgICAgICA8cGF0aFxuICAgICAgICAgIFthdHRyLmRdPVwiXG4gICAgICAgICAgICAnTSAwICcgK1xuICAgICAgICAgICAgbm9kZS5oZWlnaHQgLyAyICtcbiAgICAgICAgICAgICcgTCAnICtcbiAgICAgICAgICAgIG5vZGUud2lkdGggLyAyICtcbiAgICAgICAgICAgICcgMCcgK1xuICAgICAgICAgICAgJyBMICcgK1xuICAgICAgICAgICAgbm9kZS53aWR0aCArXG4gICAgICAgICAgICAnICcgK1xuICAgICAgICAgICAgbm9kZS5oZWlnaHQgLyAyICtcbiAgICAgICAgICAgICcgTCAnICtcbiAgICAgICAgICAgIG5vZGUud2lkdGggLyAyICtcbiAgICAgICAgICAgICcgJyArXG4gICAgICAgICAgICBub2RlLmhlaWdodCArXG4gICAgICAgICAgICAnIFonXG4gICAgICAgICAgXCJcbiAgICAgICAgICBmaWxsPVwibm9uZVwiXG4gICAgICAgICAgc3Ryb2tlPVwiI0QzNkNGRlwiXG4gICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMVwiXG4gICAgICAgID48L3BhdGg+XG4gICAgICAgIH1cblxuICAgICAgICA8IS0tIEZvcm0gbm9kZSAtLT5cbiAgICAgICAgQGlmIChub2RlLnR5cGUgPT09ICdmb3JtJykge1xuICAgICAgICA8cGF0aFxuICAgICAgICAgIGQ9XCJNOTUuMDYyNSA1MC41NTkxVjk1LjA2MjVDOTUuMDYyNSA5Ny45NzE2IDkzLjkwNjkgMTAwLjc2MiA5MS44NDk4IDEwMi44MTlDODkuNzkyOCAxMDQuODc2IDg3LjAwMjggMTA2LjAzMSA4NC4wOTM4IDEwNi4wMzFIMzIuOTA2MkMyOS45OTcyIDEwNi4wMzEgMjcuMjA3MiAxMDQuODc2IDI1LjE1MDIgMTAyLjgxOUMyMy4wOTMxIDEwMC43NjIgMjEuOTM3NSA5Ny45NzE2IDIxLjkzNzUgOTUuMDYyNVYyMS45Mzc1QzIxLjkzNzUgMTkuMDI4NCAyMy4wOTMxIDE2LjIzODUgMjUuMTUwMiAxNC4xODE0QzI3LjIwNzIgMTIuMTI0NCAyOS45OTcyIDEwLjk2ODggMzIuOTA2MiAxMC45Njg4SDU1LjQ3MjJDNTcuNDEwOSAxMC45NjkgNTkuMjcwMSAxMS43MzkyIDYwLjY0MTIgMTMuMTA5OUw5Mi45MjEzIDQ1LjM5MDFDOTQuMjkyIDQ2Ljc2MTEgOTUuMDYyMiA0OC42MjA0IDk1LjA2MjUgNTAuNTU5MVpcIlxuICAgICAgICAgIHRyYW5zZm9ybT1cInNjYWxlKDAuNylcIlxuICAgICAgICAgIGZpbGw9XCJub25lXCJcbiAgICAgICAgICBzdHJva2U9XCIjRDM2Q0ZGXCJcbiAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXG4gICAgICAgIC8+XG4gICAgICAgIDxwYXRoXG4gICAgICAgICAgZD1cIk01OC41IDEyLjc5NjlWNDAuMjE4OEM1OC41IDQyLjE1ODEgNTkuMjcwNCA0NC4wMTgxIDYwLjY0MTggNDUuMzg5NUM2Mi4wMTMxIDQ2Ljc2MDggNjMuODczMSA0Ny41MzEyIDY1LjgxMjUgNDcuNTMxMkg5My4yMzQ0XCJcbiAgICAgICAgICB0cmFuc2Zvcm09XCJzY2FsZSgwLjcpXCJcbiAgICAgICAgICBzdHJva2U9XCIjRDM2Q0ZGXCJcbiAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXG4gICAgICAgIC8+XG4gICAgICAgIDx0ZXh0XG4gICAgICAgICAgeD1cIjUwJVwiXG4gICAgICAgICAgeT1cIjUwJVwiXG4gICAgICAgICAgdGV4dC1hbmNob3I9XCJtaWRkbGVcIlxuICAgICAgICAgIGRvbWluYW50LWJhc2VsaW5lPVwibWlkZGxlXCJcbiAgICAgICAgICBmb250LWZhbWlseT1cInNhbnMtc2VyaWZcIlxuICAgICAgICAgIGZvbnQtc2l6ZT1cIjE0XCJcbiAgICAgICAgICBmaWxsPVwiI0QzNkNGRlwiXG4gICAgICAgID5cbiAgICAgICAgICBGb3JtXG4gICAgICAgIDwvdGV4dD5cbiAgICAgICAgfVxuXG4gICAgICAgIDwhLS0gU3ViZmxvdyBub2RlIC0tPlxuICAgICAgICBAaWYgKG5vZGUudHlwZSA9PT0gJ3N1YmZsb3cnKSB7XG4gICAgICAgIDxwYXRoXG4gICAgICAgICAgW2F0dHIuZF09XCJcbiAgICAgICAgICAgICdNIDEgJyArXG4gICAgICAgICAgICBub2RlLmhlaWdodCAvIDQgK1xuICAgICAgICAgICAgJyBMICcgK1xuICAgICAgICAgICAgbm9kZS53aWR0aCAvIDIgK1xuICAgICAgICAgICAgJyAxIEwgJyArXG4gICAgICAgICAgICAobm9kZS53aWR0aCAtIDEpICtcbiAgICAgICAgICAgICcgJyArXG4gICAgICAgICAgICBub2RlLmhlaWdodCAvIDQgK1xuICAgICAgICAgICAgJyBWICcgK1xuICAgICAgICAgICAgKG5vZGUuaGVpZ2h0ICogMykgLyA0ICtcbiAgICAgICAgICAgICcgTCAnICtcbiAgICAgICAgICAgIG5vZGUud2lkdGggLyAyICtcbiAgICAgICAgICAgICcgJyArXG4gICAgICAgICAgICAobm9kZS5oZWlnaHQgLSAxKSArXG4gICAgICAgICAgICAnIEwgMSAnICtcbiAgICAgICAgICAgIChub2RlLmhlaWdodCAqIDMpIC8gNCArXG4gICAgICAgICAgICAnIFonXG4gICAgICAgICAgXCJcbiAgICAgICAgICBmaWxsPVwibm9uZVwiXG4gICAgICAgICAgc3Ryb2tlPVwiI0QzNkNGRlwiXG4gICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMVwiXG4gICAgICAgID48L3BhdGg+XG4gICAgICAgIDx0ZXh0XG4gICAgICAgICAgeD1cIjUwJVwiXG4gICAgICAgICAgeT1cIjUwJVwiXG4gICAgICAgICAgdGV4dC1hbmNob3I9XCJtaWRkbGVcIlxuICAgICAgICAgIGRvbWluYW50LWJhc2VsaW5lPVwibWlkZGxlXCJcbiAgICAgICAgICBmb250LWZhbWlseT1cInNhbnMtc2VyaWZcIlxuICAgICAgICAgIGZvbnQtc2l6ZT1cIjE0XCJcbiAgICAgICAgICBmaWxsPVwiIzAwMDAwMFwiXG4gICAgICAgID5cbiAgICAgICAgICB7eyBub2RlLndvcmtmbG93RGF0YT8ubmFtZSB8fCBcIlN1YmZsb3dcIiB9fVxuICAgICAgICA8L3RleHQ+XG4gICAgICAgIH1cblxuICAgICAgICA8IS0tIENvbm5lY3Rpb24gcG9pbnRzIGZvciB0aGlzIG5vZGUgLS0+XG4gICAgICAgIEBmb3IgKHBvaW50IG9mIG5vZGUuY29ubmVjdGlvblBvaW50cyB8fCBbXTsgdHJhY2sgcG9pbnQuaWQpIHsgQGlmXG4gICAgICAgIChpc0Nvbm5lY3Rpb25Qb2ludFZpc2libGUobm9kZS5pZCkpIHtcbiAgICAgICAgPHVzZVxuICAgICAgICAgIFthdHRyLmhyZWZdPVwiJyNjb25uZWN0aW9uLXBvaW50LXRlbXBsYXRlJ1wiXG4gICAgICAgICAgW2F0dHIueF09XCJwb2ludC54XCJcbiAgICAgICAgICBbYXR0ci55XT1cInBvaW50LnlcIlxuICAgICAgICAgIFthdHRyLmlkXT1cInBvaW50LmlkXCJcbiAgICAgICAgICAobW91c2Vkb3duKT1cInN0YXJ0Q29ubmVjdGlvbkRyYWcoJGV2ZW50LCBwb2ludCwgc3dpbWxhbmUub3JkZXIpXCJcbiAgICAgICAgLz5cbiAgICAgICAgfSB9XG4gICAgICA8L2c+XG4gICAgICA8IS0tIEEgdHJhbnNwYXJlbnQgaG92ZXIgYXJlYSBmb3IgaW1wcm92ZWQgaG92ZXIgZGV0ZWN0aW9uIC0tPlxuICAgICAgPHJlY3RcbiAgICAgICAgW2F0dHIueF09XCJub2RlLnggLSAxMFwiXG4gICAgICAgIFthdHRyLnldPVwibm9kZS55ICsgNDAgLSAxMFwiXG4gICAgICAgIFthdHRyLndpZHRoXT1cIm5vZGUud2lkdGggKyAyMFwiXG4gICAgICAgIFthdHRyLmhlaWdodF09XCJub2RlLmhlaWdodCArIDIwXCJcbiAgICAgICAgZmlsbD1cInRyYW5zcGFyZW50XCJcbiAgICAgICAgKG1vdXNlb3Zlcik9XCJzaG93Q29ubmVjdGlvblBvaW50cyhub2RlLmlkLCBzd2ltbGFuZS5vcmRlcilcIlxuICAgICAgICAobW91c2VvdXQpPVwiaGlkZUNvbm5lY3Rpb25Qb2ludHMobm9kZS5pZClcIlxuICAgICAgICBzdHlsZT1cInBvaW50ZXItZXZlbnRzOiBub25lXCJcbiAgICAgIC8+XG4gICAgICB9XG4gICAgPC9nPlxuICAgIH0gQGZvciAoY29ubmVjdGlvbiBvZiBzdGF0ZS5jb25uZWN0aW9uczsgdHJhY2sgY29ubmVjdGlvbi5pZCkge1xuICAgIDxnPlxuICAgICAgPHBhdGhcbiAgICAgICAgW2F0dHIuZF09XCJnZXRDb25uZWN0aW9uUGF0aEZvclNhdmVkQ29ubmVjdGlvbihjb25uZWN0aW9uKVwiXG4gICAgICAgIHN0cm9rZT1cIiNEMzZDRkZcIlxuICAgICAgICBzdHJva2Utd2lkdGg9XCIyXCJcbiAgICAgICAgZmlsbD1cIm5vbmVcIlxuICAgICAgICBtYXJrZXItZW5kPVwidXJsKCNhcnJvd2hlYWQpXCJcbiAgICAgID48L3BhdGg+XG4gICAgPC9nPlxuICAgIH1cblxuICAgIDwhLS0gQ29ubmVjdGlvbiBwcmV2aWV3IGxpbmUgLS0+XG4gICAgQGlmIChzdGF0ZS5pc0Nvbm5lY3Rpb25EcmFnZ2luZygpKSB7XG4gICAgPGc+XG4gICAgICA8cGF0aFxuICAgICAgICBbYXR0ci5kXT1cImdldENvbm5lY3Rpb25QYXRoKClcIlxuICAgICAgICBzdHJva2U9XCIjRDM2Q0ZGXCJcbiAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMlwiXG4gICAgICAgIHN0cm9rZS1kYXNoYXJyYXk9XCI1LDVcIlxuICAgICAgICBmaWxsPVwibm9uZVwiXG4gICAgICA+PC9wYXRoPlxuICAgIDwvZz5cbiAgICB9XG4gIDwvc3ZnPlxuXG4gIDxkaXZcbiAgICAqbmdJZj1cInBvcHVwVmlzaWJsZVwiXG4gICAgW3N0eWxlLnBvc2l0aW9uXT1cIidhYnNvbHV0ZSdcIlxuICAgIFtzdHlsZS5sZWZ0LnB4XT1cInBvcHVwWFwiXG4gICAgW3N0eWxlLnRvcC5weF09XCJwb3B1cFlcIlxuICA+XG4gICAgPHZlcmJlbi1wb3AtVXBcbiAgICAgIFtkcm9wZG93bk9wZW5dPVwidHJ1ZVwiXG4gICAgICBbY3VzdG9tU3R5bGVzXT1cInsgJ3otaW5kZXgnOiAnOTknIH1cIlxuICAgICAgW2VuYWJsZU1vdXNlTGVhdmVdPVwiZmFsc2VcIlxuICAgID5cbiAgICAgIDxkaXYgZHJvcGRvd24tdHJpZ2dlciBzdHlsZT1cImRpc3BsYXk6IG5vbmVcIj5cbiAgICAgICAgPCEtLSBIaWRkZW4gdHJpZ2dlciBlbGVtZW50IC0tPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwicC0zIGJnLXdoaXRlIGJvcmRlciBib3JkZXItZ3JheS0yMDAgcm91bmRlZCBzaGFkb3ctbWRcIlxuICAgICAgICBkcm9wZG93bi1jb250ZW50XG4gICAgICA+XG4gICAgICAgIDxoNCBjbGFzcz1cIm1iLTIgZm9udC1tZWRpdW1cIj5DcmVhdGUgQ29ubmVjdGlvbjwvaDQ+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC0yXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgdHlwZSBvZiBhbGxvd2VkTm9kZVR5cGVzXCI+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIGNsYXNzPVwicHgtMyBweS0yIGJnLXdoaXRlIGJvcmRlciBib3JkZXItZ3JheS0yMDAgcm91bmRlZCB0ZXh0LXNtIGhvdmVyOmJnLWdyYXktNTBcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiY3JlYXRlTm9kZUNvbm5lY3Rpb24odHlwZSlcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICBDcmVhdGUge3sgdHlwZSB8IHRpdGxlY2FzZSB9fVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgY2xhc3M9XCJweC0zIHB5LTIgYmctd2hpdGUgYm9yZGVyIGJvcmRlci1ncmF5LTIwMCByb3VuZGVkIHRleHQtc20gaG92ZXI6YmctZ3JheS01MFwiXG4gICAgICAgICAgICAoY2xpY2spPVwiaGlkZUNvbm5lY3Rpb25Qb3B1cCgpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICBDYW5jZWxcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L3ZlcmJlbi1wb3AtVXA+XG4gIDwvZGl2PlxuXG4gIDxkaXZcbiAgICAqbmdJZj1cInNob3dTdGFydE5vZGVGb3JtUG9wdXBcIlxuICAgIFtzdHlsZS5wb3NpdGlvbl09XCInYWJzb2x1dGUnXCJcbiAgICBbc3R5bGUubGVmdC5weF09XCJzdGFydE5vZGVGb3JtUG9wdXBYXCJcbiAgICBbc3R5bGUudG9wLnB4XT1cInN0YXJ0Tm9kZUZvcm1Qb3B1cFlcIlxuICA+XG4gICAgPHZlcmJlbi1wb3AtVXAgW2Ryb3Bkb3duT3Blbl09XCJ0cnVlXCIgW2N1c3RvbVN0eWxlc109XCJ7ICd6LWluZGV4JzogJzEwMCcgfVwiPlxuICAgICAgPGRpdiBkcm9wZG93bi10cmlnZ2VyIHN0eWxlPVwiZGlzcGxheTogbm9uZVwiPlxuICAgICAgICA8IS0tIEhpZGRlbiB0cmlnZ2VyIGVsZW1lbnQgLS0+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJwLTMgYmctd2hpdGUgYm9yZGVyIGJvcmRlci1ncmF5LTIwMCByb3VuZGVkIHNoYWRvdy1tZCB3LTY0XCJcbiAgICAgICAgZHJvcGRvd24tY29udGVudFxuICAgICAgICBzdHlsZT1cImJhY2tncm91bmQtY29sb3I6IHdoaXRlOyB6LWluZGV4OiAxMDAwXCJcbiAgICAgID5cbiAgICAgICAgPGg0IGNsYXNzPVwibWItMiBmb250LW1lZGl1bVwiPlNlbGVjdCBXb3JrZmxvdyBGb3JtPC9oND5cbiAgICAgICAgPGRpdiAqbmdJZj1cImlzTG9hZGluZ1N0YXJ0Tm9kZUZvcm1zXCIgY2xhc3M9XCJ0ZXh0LWNlbnRlciBweS0yXCI+XG4gICAgICAgICAgTG9hZGluZyBmb3Jtcy4uLlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiAqbmdJZj1cIiFpc0xvYWRpbmdTdGFydE5vZGVGb3Jtc1wiIGNsYXNzPVwibWF4LWgtNDggb3ZlcmZsb3cteS1hdXRvXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTJcIj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgY2xhc3M9XCJ3LWZ1bGwgcHgtMyBweS0yIGJnLXdoaXRlIGJvcmRlciBib3JkZXItZ3JheS0yMDAgcm91bmRlZCB0ZXh0LXNtIGhvdmVyOmJnLWdyYXktNTAgdGV4dC1sZWZ0XCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdFN0YXJ0Tm9kZUZvcm0obnVsbClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICBDbGVhciBmb3JtIHNlbGVjdGlvblxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgZm9ybSBvZiBzdGFydE5vZGVGb3Jtc0xpc3RcIiBjbGFzcz1cIm1iLTFcIj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgY2xhc3M9XCJ3LWZ1bGwgcHgtMyBweS0yIGJnLXdoaXRlIGJvcmRlciBib3JkZXItZ3JheS0yMDAgcm91bmRlZCB0ZXh0LXNtIGhvdmVyOmJnLWdyYXktNTAgdGV4dC1sZWZ0XCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdFN0YXJ0Tm9kZUZvcm0oZm9ybSlcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7eyBmb3JtLk5hbWUgfX1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICpuZ0lmPVwic3RhcnROb2RlRm9ybXNMaXN0Lmxlbmd0aCA9PT0gMFwiXG4gICAgICAgICAgICBjbGFzcz1cInRleHQtY2VudGVyIHB5LTIgdGV4dC1ncmF5LTUwMFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgTm8gZm9ybXMgYXZhaWxhYmxlXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC92ZXJiZW4tcG9wLVVwPlxuICA8L2Rpdj5cblxuICA8ZGl2XG4gICAgKm5nSWY9XCJzaG93U3ViZmxvd1BvcHVwXCJcbiAgICBbc3R5bGUucG9zaXRpb25dPVwiJ2ZpYWJzb2x1dGV4ZWQnXCJcbiAgICBbc3R5bGUubGVmdC5weF09XCJzdWJmbG93UG9wdXBYXCJcbiAgICBbc3R5bGUudG9wLnB4XT1cInN1YmZsb3dQb3B1cFlcIlxuICA+XG4gICAgPHZlcmJlbi1wb3AtVXAgW2Ryb3Bkb3duT3Blbl09XCJ0cnVlXCIgW2N1c3RvbVN0eWxlc109XCJ7ICd6LWluZGV4JzogJzEwMCcgfVwiPlxuICAgICAgPGRpdiBkcm9wZG93bi10cmlnZ2VyIHN0eWxlPVwiZGlzcGxheTogbm9uZVwiPlxuICAgICAgICA8IS0tIEhpZGRlbiB0cmlnZ2VyIGVsZW1lbnQgLS0+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJwLTMgYmctd2hpdGUgYm9yZGVyIGJvcmRlci1ncmF5LTIwMCByb3VuZGVkIHNoYWRvdy1tZCB3LTY0XCJcbiAgICAgICAgZHJvcGRvd24tY29udGVudFxuICAgICAgICBzdHlsZT1cImJhY2tncm91bmQtY29sb3I6IHdoaXRlOyB6LWluZGV4OiAxMDAwXCJcbiAgICAgID5cbiAgICAgICAgPGg0IGNsYXNzPVwibWItMiBmb250LW1lZGl1bVwiPlNlbGVjdCBXb3JrZmxvdzwvaDQ+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJpc0xvYWRpbmdXb3JrZmxvd3NcIiBjbGFzcz1cInRleHQtY2VudGVyIHB5LTJcIj5cbiAgICAgICAgICBMb2FkaW5nIHdvcmtmbG93cy4uLlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiAqbmdJZj1cIiFpc0xvYWRpbmdXb3JrZmxvd3NcIiBjbGFzcz1cIm1heC1oLTQ4IG92ZXJmbG93LXktYXV0b1wiPlxuICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHdvcmtmbG93IG9mIHdvcmtmbG93c0xpc3RcIiBjbGFzcz1cIm1iLTFcIj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgY2xhc3M9XCJ3LWZ1bGwgcHgtMyBweS0yIGJnLXdoaXRlIGJvcmRlciBib3JkZXItZ3JheS0yMDAgcm91bmRlZCB0ZXh0LXNtIGhvdmVyOmJnLWdyYXktNTAgdGV4dC1sZWZ0XCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdFN1YmZsb3dXb3JrZmxvdyh3b3JrZmxvdylcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7eyB3b3JrZmxvdy5OYW1lIH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAqbmdJZj1cIndvcmtmbG93c0xpc3QubGVuZ3RoID09PSAwXCJcbiAgICAgICAgICAgIGNsYXNzPVwidGV4dC1jZW50ZXIgcHktMiB0ZXh0LWdyYXktNTAwXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICBObyB3b3JrZmxvd3MgYXZhaWxhYmxlXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC92ZXJiZW4tcG9wLVVwPlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
|
|
536
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzaWduZXItY2FudmFzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ZlcmJlbi13b3JrZmxvdy11aS9zcmMvbGliL2NvbXBvbmVudHMvd29ya2Zsb3ctZGVzaWduZXIvZGVzaWduZXItY2FudmFzL2Rlc2lnbmVyLWNhbnZhcy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92ZXJiZW4td29ya2Zsb3ctdWkvc3JjL2xpYi9jb21wb25lbnRzL3dvcmtmbG93LWRlc2lnbmVyL2Rlc2lnbmVyLWNhbnZhcy9kZXNpZ25lci1jYW52YXMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFFVCxZQUFZLEVBQ1osWUFBWSxFQUNaLEtBQUssRUFFTCxNQUFNLEVBQ04sU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDOzs7Ozs7O0FBbUJ2QixNQUFNLE9BQU8sdUJBQXVCO0lBK0R6QjtJQUNDO0lBL0RELFlBQVksR0FBYSxJQUFJLENBQUM7SUFDN0IsZUFBZSxHQUFHLElBQUksWUFBWSxFQUE0QixDQUFDO0lBQy9ELGVBQWUsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO0lBQy9DLG9CQUFvQixHQUNsQixJQUFJLENBQUM7SUFDRyxlQUFlLEdBQUcsSUFBSSxZQUFZLEVBR3hDLENBQUM7SUFFTCwrQkFBK0I7SUFDUSxTQUFTLENBQTBCO0lBRzFFLGVBQWUsQ0FBQyxLQUFpQjtRQUMvQixzRUFBc0U7UUFDdEUsSUFDRSxDQUFDLElBQUksQ0FBQyxnQkFBZ0I7WUFDdEIsQ0FBQyxJQUFJLENBQUMsc0JBQXNCO1lBQzVCLENBQUMsSUFBSSxDQUFDLFlBQVksSUFBSSx1Q0FBdUM7WUFDN0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsRUFBRSxFQUNqQyxDQUFDO1lBQ0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyx5REFBeUQsQ0FBQyxDQUFDO1lBQ3ZFLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUNqQyxDQUFDO0lBQ0gsQ0FBQztJQUVELG9CQUFvQjtJQUNwQixXQUFXLEdBQUcsSUFBSSxDQUFDO0lBQ25CLFlBQVksR0FBRyxJQUFJLENBQUM7SUFFcEIsWUFBWTtJQUNaLFFBQVEsR0FBRyxFQUFFLENBQUM7SUFFZCxjQUFjLEdBQUcsR0FBRyxDQUFDO0lBQ3JCLDZCQUE2QixHQUFrQixJQUFJLENBQUM7SUFDcEQsWUFBWSxHQUFHLEtBQUssQ0FBQztJQUNyQixNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQ1gsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUNYLGdCQUFnQixHQUFhLEVBQUUsQ0FBQztJQUVoQyxzQkFBc0IsR0FBWSxLQUFLLENBQUM7SUFDeEMsa0JBQWtCLEdBQWlCLEVBQUUsQ0FBQztJQUN0Qyx1QkFBdUIsR0FBWSxLQUFLLENBQUM7SUFDekMsbUJBQW1CLEdBQVcsQ0FBQyxDQUFDO0lBQ2hDLG1CQUFtQixHQUFXLENBQUMsQ0FBQztJQUVoQyxnQkFBZ0IsR0FBWSxLQUFLLENBQUM7SUFDbEMsYUFBYSxHQUFlLEVBQUUsQ0FBQztJQUMvQixrQkFBa0IsR0FBWSxLQUFLLENBQUM7SUFDcEMsYUFBYSxHQUFXLENBQUMsQ0FBQztJQUMxQixhQUFhLEdBQVcsQ0FBQyxDQUFDO0lBQzFCLHNCQUFzQixHQUlYLElBQUksQ0FBQztJQUVoQiw0QkFBNEIsR0FBMkIsSUFBSSxDQUFDO0lBQzVELG9DQUFvQyxHQUFrQixJQUFJLENBQUM7SUFFM0QsWUFDUyxLQUE0QixFQUMzQixXQUFnQztRQURqQyxVQUFLLEdBQUwsS0FBSyxDQUF1QjtRQUMzQixnQkFBVyxHQUFYLFdBQVcsQ0FBcUI7SUFDdkMsQ0FBQztJQUVKLFFBQVE7UUFDTixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQsK0JBQStCO0lBQy9CLGFBQWEsQ0FBQyxLQUFpQjtRQUM3QixtREFBbUQ7UUFDbkQsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN2QixPQUFPO1FBQ1QsQ0FBQztRQUVELDRDQUE0QztRQUM1QyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDOUMsT0FBTyxDQUFDLEdBQUcsQ0FDVCxvQkFBb0IsRUFDcEIsUUFBUSxFQUNSLFlBQVksRUFDWixJQUFJLENBQUMsWUFBWSxDQUNsQixDQUFDO1FBRUYsaURBQWlEO1FBQ2pELHNFQUFzRTtRQUV0RSxnRkFBZ0Y7UUFDaEYsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUM7Z0JBQ3hCLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztnQkFDYixDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7YUFDZCxDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQztJQUVELGdCQUFnQjtRQUNkLE1BQU0sY0FBYyxHQUNsQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDO1FBQzFELElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsY0FBYyxDQUFDLENBQUMsQ0FBQyw2Q0FBNkM7SUFDbkcsQ0FBQztJQUVELHFFQUFxRTtJQUM3RCxnQkFBZ0IsQ0FBQyxLQUFpQjtRQUN4Qyw0RUFBNEU7UUFDNUUsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUNsRSxPQUFPO1lBQ0wsQ0FBQyxFQUFFLEtBQUssQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUk7WUFDNUIsQ0FBQyxFQUFFLEtBQUssQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUc7U0FDNUIsQ0FBQztJQUNKLENBQUM7SUFFRCxvQkFBb0IsQ0FBQyxNQUFjLEVBQUUsYUFBcUI7UUFDeEQsSUFBSSxDQUFDLDZCQUE2QixHQUFHLE1BQU0sQ0FBQztJQUM5QyxDQUFDO0lBRUQsZUFBZSxDQUNiLEtBQWlCLEVBQ2pCLElBQVksRUFDWixhQUFxQjtRQUVyQixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDOUMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDLElBQUksRUFBRSxhQUFhLENBQUMsQ0FBQztRQUV0RSxPQUFPLENBQ0wsUUFBUSxDQUFDLENBQUMsSUFBSSxVQUFVLENBQUMsQ0FBQztZQUMxQixRQUFRLENBQUMsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLEtBQUs7WUFDN0MsUUFBUSxDQUFDLENBQUMsSUFBSSxVQUFVLENBQUMsQ0FBQztZQUMxQixRQUFRLENBQUMsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FDL0MsQ0FBQztJQUNKLENBQUM7SUFFRCxzREFBc0Q7SUFDdEQsd0JBQXdCLENBQ3RCLElBQVksRUFDWixhQUFxQjtRQUVyQixNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUMsQ0FBQywyREFBMkQ7UUFFL0UsOERBQThEO1FBQzlELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxhQUFhLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBRXRELE9BQU87WUFDTCxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxPQUFPO1lBQ25CLENBQUMsRUFBRSxTQUFTLEdBQUcsT0FBTztZQUN0QixLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssR0FBRyxPQUFPLEdBQUcsQ0FBQztZQUMvQixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sR0FBRyxPQUFPLEdBQUcsQ0FBQztTQUNsQyxDQUFDO0lBQ0osQ0FBQztJQUVELG9CQUFvQixDQUFDLE1BQWM7UUFDakMsSUFDRSxJQUFJLENBQUMsNkJBQTZCLEtBQUssTUFBTTtZQUM3QyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsb0JBQW9CLEVBQUUsRUFDbEMsQ0FBQztZQUNELElBQUksQ0FBQyw2QkFBNkIsR0FBRyxJQUFJLENBQUM7UUFDNUMsQ0FBQztJQUNILENBQUM7SUFFRCx3QkFBd0IsQ0FBQyxNQUFjO1FBQ3JDLE9BQU8sSUFBSSxDQUFDLDZCQUE2QixLQUFLLE1BQU0sQ0FBQztJQUN2RCxDQUFDO0lBRUQsbUJBQW1CLENBQ2pCLEtBQWlCLEVBQ2pCLEtBQXNCLEVBQ3RCLGFBQXFCO1FBRXJCLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN2QixLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7UUFFeEIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlDLElBQUksQ0FBQyxLQUFLLENBQUMsbUJBQW1CLENBQzVCLEtBQUssRUFDTCxhQUFhLEVBQ2IsUUFBUSxDQUFDLENBQUMsRUFDVixRQUFRLENBQUMsQ0FBQyxDQUNYLENBQUM7UUFFRiw4REFBOEQ7UUFDOUQsUUFBUSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDekQsUUFBUSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVELGlEQUFpRDtJQUNqRCxXQUFXLEdBQUcsQ0FBQyxLQUFpQixFQUFFLEVBQUU7UUFDbEMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlDLElBQUksQ0FBQyxLQUFLLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDMUQsQ0FBQyxDQUFDO0lBRUYsU0FBUyxHQUFHLENBQUMsS0FBaUIsRUFBRSxFQUFFO1FBQ2hDLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzVELFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRXhELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QyxPQUFPLENBQUMsR0FBRyxDQUFDLHVCQUF1QixFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQy9DLE9BQU8sQ0FBQyxHQUFHLENBQUMseUJBQXlCLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsRUFBRSxDQUFDLENBQUM7UUFFMUUsK0NBQStDO1FBQy9DLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNuRSxPQUFPLENBQUMsR0FBRyxDQUFDLHFCQUFxQixFQUFFLGdCQUFnQixDQUFDLENBQUM7UUFFckQsdUNBQXVDO1FBQ3ZDLElBQUksZ0JBQWdCLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsRUFBRSxFQUFFLENBQUM7WUFDMUQsT0FBTyxDQUFDLEdBQUcsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO1lBQ3hDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNuRCxDQUFDO2FBQU0sQ0FBQztZQUNOLGdEQUFnRDtZQUNoRCxPQUFPLENBQUMsR0FBRyxDQUFDLDhDQUE4QyxDQUFDLENBQUM7WUFDNUQsSUFBSSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ2pDLENBQUM7SUFDSCxDQUFDLENBQUM7SUFFRix3QkFBd0IsQ0FBQyxDQUFTO1FBQ2hDLDZDQUE2QztRQUM3QyxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUM7UUFDbEQsSUFBSSxhQUFhLEtBQUssQ0FBQztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBRXRDLHNDQUFzQztRQUN0QyxNQUFNLG1CQUFtQixHQUFHLGFBQWEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDO1FBRWhFLHlEQUF5RDtRQUN6RCxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLG1CQUFtQixDQUFDO0lBQzNDLENBQUM7SUFFRCxtQkFBbUIsQ0FBQyxDQUFTLEVBQUUsQ0FBUztRQUN0QyxPQUFPLENBQUMsR0FBRyxDQUFDLDhCQUE4QixFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNsRCxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUNoQixJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUVoQix1REFBdUQ7UUFDdkQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMseUJBQXlCLEVBQUUsQ0FBQztRQUMvRCxPQUFPLENBQUMsR0FBRyxDQUFDLHFCQUFxQixFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBRTFELG9EQUFvRDtRQUNwRCxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDckMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7WUFDekIsT0FBTyxDQUFDLEdBQUcsQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO1lBRTVDLGlEQUFpRDtZQUNqRCxVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUNkLE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0NBQWdDLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ25FLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNSLENBQUM7YUFBTSxDQUFDO1lBQ04sMkNBQTJDO1lBQzNDLE9BQU8sQ0FBQyxHQUFHLENBQUMsb0NBQW9DLENBQUMsQ0FBQztZQUNsRCxJQUFJLENBQUMsS0FBSyxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDakMsQ0FBQztJQUNILENBQUM7SUFFRCxtQkFBbUI7UUFDakIsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7UUFDMUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO0lBQ2pDLENBQUM7SUFFRCw0REFBNEQ7SUFFNUQsZUFBZSxDQUFDLEtBQWlCO1FBQy9CLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3RCLE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDN0QsSUFBSSxZQUFZLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFjLENBQUMsRUFBRSxDQUFDO2dCQUNqRSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUM3QixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCxvQkFBb0IsQ0FBQyxRQUFnQjtRQUNuQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDcEQsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2QsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDM0IsT0FBTztRQUNULENBQUM7UUFFRCxtREFBbUQ7UUFDbkQsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO1FBQzVELElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDckMsT0FBTyxDQUFDLEtBQUssQ0FDWCwrQkFBK0IsUUFBUSx5QkFBeUIsQ0FDakUsQ0FBQztZQUNGLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBQzNCLE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsbUJBQW1CLEVBQUUsR0FBRyxRQUFRLENBQUM7UUFFckQsdUNBQXVDO1FBQ3ZDLE1BQU0sZUFBZSxHQUFHLG1CQUFtQixHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUM7UUFDdkQsTUFBTSxTQUFTLEdBQUcsSUFBSSxHQUFHLGVBQWUsQ0FBQztRQUV6QywwQ0FBMEM7UUFDMUMsSUFBSSxRQUFRLEtBQUssT0FBTyxFQUFFLENBQUM7WUFDekIsaUVBQWlFO1lBQ2pFLElBQUksQ0FBQyxvQkFBb0IsR0FBRztnQkFDMUIsYUFBYSxFQUFFLG1CQUFtQjtnQkFDbEMsQ0FBQyxFQUFFLElBQUk7Z0JBQ1AsQ0FBQyxFQUFFLElBQUk7YUFDUixDQUFDO1lBQ0YsT0FBTyxDQUFDLEdBQUcsQ0FDVCwrQ0FBK0MsRUFDL0MsSUFBSSxDQUFDLG9CQUFvQixDQUMxQixDQUFDO1lBQ0YsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUM7Z0JBQ3hCLFFBQVEsRUFBRSxJQUFJLENBQUMsb0JBQW9CO2dCQUNuQyxnQkFBZ0IsRUFBRSxJQUFJO2FBQ3ZCLENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBQzNCLE9BQU87UUFDVCxDQUFDO2FBQU0sSUFBSSxRQUFRLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDbEMsT0FBTyxDQUFDLEdBQUcsQ0FDVCxzQ0FBc0MsRUFDdEMsSUFBSSxFQUNKLElBQUksRUFDSixXQUFXLEVBQ1gsbUJBQW1CLENBQ3BCLENBQUM7WUFDRix3RUFBd0U7WUFDeEUsSUFBSSxDQUFDLHlCQUF5QixDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztZQUNoRSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUMzQixPQUFPO1FBQ1QsQ0FBQztRQUVELDRFQUE0RTtRQUM1RSxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FDaEMsbUJBQW1CLEVBQ25CLFFBQW9CLEVBQ3BCLElBQUksRUFDSixTQUFTLENBQ1YsQ0FBQztRQUVGLElBQ0UsT0FBTztZQUNQLE9BQU8sQ0FBQyxnQkFBZ0I7WUFDeEIsT0FBTyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQ25DLENBQUM7WUFDRCxxRUFBcUU7WUFDckUsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxXQUFXLENBQUM7WUFDbEUsSUFBSSxXQUFXLEVBQUUsQ0FBQztnQkFDaEIsa0VBQWtFO2dCQUNsRSw2RUFBNkU7Z0JBQzdFLElBQUksV0FBVyxDQUFDO2dCQUVoQix3REFBd0Q7Z0JBQ3hELE1BQU0sWUFBWSxHQUFHO29CQUNuQixLQUFLLEVBQUUsTUFBTTtvQkFDYixJQUFJLEVBQUUsT0FBTztvQkFDYixHQUFHLEVBQUUsUUFBUTtvQkFDYixNQUFNLEVBQUUsS0FBSztpQkFDZCxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQXdDLENBQUM7Z0JBRTNELFdBQVcsR0FBRyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUN6QyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxZQUFZLENBQy9CLENBQUM7Z0JBRUYsSUFBSSxXQUFXLEVBQUUsQ0FBQztvQkFDaEIsd0JBQXdCO29CQUN4QixJQUFJLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUN6QixPQUFPLENBQUMsRUFBRSxFQUNWLFdBQVcsQ0FBQyxFQUFFLEVBQ2QsbUJBQW1CLENBQ3BCLENBQUM7Z0JBQ0osQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBRUQsMEJBQTBCO1FBQzFCLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFRCxpQkFBaUI7UUFDZixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDcEQsSUFBSSxDQUFDLFFBQVE7WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUV6QixNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEdBQUcsUUFBUSxDQUFDO1FBQ2hELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsc0JBQXNCLENBQUMsV0FBVyxDQUFDO1FBRWxFLElBQUksQ0FBQyxXQUFXO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFFNUIsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM5RSxDQUFDO0lBRUQsbUNBQW1DLENBQUMsVUFBc0I7UUFDeEQsSUFBSSxDQUFDO1lBQ0gsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUMxRCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ2QsT0FBTyxDQUFDLEtBQUssQ0FBQyw4QkFBOEIsRUFBRSxVQUFVLENBQUMsQ0FBQztnQkFDMUQsT0FBTyxFQUFFLENBQUM7WUFDWixDQUFDO1lBRUQsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxHQUFHLFFBQVEsQ0FBQztZQUVoRCxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDeEUsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUNwQixPQUFPLENBQUMsS0FBSyxDQUFDLHVDQUF1QyxFQUFFLFVBQVUsQ0FBQyxDQUFDO2dCQUNuRSxPQUFPLEVBQUUsQ0FBQztZQUNaLENBQUM7WUFFRCxNQUFNLFVBQVUsR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDO1lBQ3ZDLE1BQU0sV0FBVyxHQUFHLFVBQVUsQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQ25ELENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLFVBQVUsQ0FBQyxhQUFhLENBQ3pDLENBQUM7WUFFRixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ2pCLE9BQU8sQ0FBQyxLQUFLLENBQUMsd0NBQXdDLEVBQUUsVUFBVSxDQUFDLENBQUM7Z0JBQ3BFLE9BQU8sRUFBRSxDQUFDO1lBQ1osQ0FBQztZQUVELE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUMzQixNQUFNLEVBQ04sTUFBTSxFQUNOLElBQUksRUFDSixJQUFJLEVBQ0osV0FBVyxDQUFDLElBQUksQ0FDakIsQ0FBQztRQUNKLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsT0FBTyxDQUFDLEtBQUssQ0FBQyx1Q0FBdUMsRUFBRSxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDMUUsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDO0lBQ0gsQ0FBQztJQUVELGlCQUFpQixDQUNmLE1BQWMsRUFDZCxNQUFjLEVBQ2QsSUFBWSxFQUNaLElBQVksRUFDWixTQUE4QztRQUU5Qyw2REFBNkQ7UUFDN0QsSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBRWQsMkRBQTJEO1FBQzNELElBQUksU0FBUyxLQUFLLE1BQU0sSUFBSSxTQUFTLEtBQUssT0FBTyxFQUFFLENBQUM7WUFDbEQsZ0NBQWdDO1lBQ2hDLE1BQU0sY0FBYyxHQUFHLElBQUksR0FBRyxNQUFNLENBQUM7WUFFckMsMkVBQTJFO1lBQzNFLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQztnQkFDbEMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNqQyxJQUFJLEdBQUcsS0FBSyxNQUFNLElBQUksTUFBTSxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sSUFBSSxFQUFFLENBQUM7WUFDL0QsQ0FBQztZQUNELHlGQUF5RjtpQkFDcEYsQ0FBQztnQkFDSixJQUFJLEdBQUcsS0FBSyxNQUFNLElBQUksTUFBTSxNQUMxQixNQUFNLEdBQUcsY0FBYyxHQUFHLENBQzVCLE1BQU0sSUFBSSxNQUFNLElBQUksRUFBRSxDQUFDO1lBQ3pCLENBQUM7UUFDSCxDQUFDO1FBQ0Qsa0RBQWtEO2FBQzdDLElBQUksU0FBUyxLQUFLLEtBQUssSUFBSSxTQUFTLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDdkQsOEJBQThCO1lBQzlCLE1BQU0sWUFBWSxHQUFHLElBQUksR0FBRyxNQUFNLENBQUM7WUFFbkMseUVBQXlFO1lBQ3pFLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQztnQkFDaEMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNqQyxJQUFJLEdBQUcsS0FBSyxNQUFNLElBQUksTUFBTSxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sSUFBSSxFQUFFLENBQUM7WUFDL0QsQ0FBQztZQUNELHVGQUF1RjtpQkFDbEYsQ0FBQztnQkFDSixJQUFJLEdBQUcsS0FBSyxNQUFNLElBQUksTUFBTSxNQUMxQixNQUFNLEdBQUcsWUFBWSxHQUFHLENBQzFCLE1BQU0sSUFBSSxNQUFNLElBQUksRUFBRSxDQUFDO1lBQ3pCLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsd0JBQXdCLENBQUMsS0FHeEI7UUFDQyxpQ0FBaUM7UUFDakMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ3JELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3pDLE1BQU0sU0FBUyxHQUFHLFFBQVEsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUUxRSxJQUFJLFNBQVMsS0FBSyxTQUFTLElBQUksU0FBUyxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUM5Qyx3QkFBd0I7Z0JBQ3hCLElBQUksUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO29CQUNuQixRQUFRLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLFNBQVMsR0FBRzt3QkFDcEMsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLFNBQVM7d0JBQ3RDLEdBQUcsS0FBSyxDQUFDLFNBQVM7cUJBQ25CLENBQUM7b0JBQ0YsT0FBTyxDQUFDLEdBQUcsQ0FDVCxpQ0FBaUMsRUFDakMsQ0FBQyxFQUNELE9BQU8sRUFDUCxTQUFTLEVBQ1QsT0FBTyxFQUNQLFFBQVEsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsU0FBUyxDQUNwQyxDQUFDO2dCQUNKLENBQUM7Z0JBQ0QsTUFBTTtZQUNSLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVELG1CQUFtQixDQUFDLFVBQXNCO1FBQ3hDLDZFQUE2RTtRQUM3RSxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDeEUsSUFBSSxjQUFjLElBQUksY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssT0FBTyxFQUFFLENBQUM7WUFDM0QscUJBQXFCO1lBQ3JCLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEQsQ0FBQztJQUNILENBQUM7SUFFRCxtREFBbUQ7SUFDbkQscUJBQXFCLENBQUMsSUFBWTtRQUNoQyxrRUFBa0U7UUFDbEUsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQ3ZELENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxLQUFLLElBQUksQ0FBQyxFQUFFLENBQ3hDLENBQUM7UUFFRix1Q0FBdUM7UUFDdkMsTUFBTSxtQkFBbUIsR0FBRyxtQkFBbUI7YUFDNUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7YUFDekQsTUFBTSxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxRQUFRLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssT0FBTyxDQUFDLENBQUM7UUFFcEUsSUFBSSxDQUFDLDBCQUEwQixHQUFHLG1CQUFtQixDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDbkUsQ0FBQztJQUVELGNBQWMsQ0FDWixLQUFpQixFQUNqQixRQUFzQixFQUN0QixhQUFxQjtRQUVyQixLQUFLLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQyw2Q0FBNkM7UUFDdEUsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3ZCLE9BQU8sQ0FBQyxHQUFHLENBQUMsNENBQTRDLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFFekUsOENBQThDO1FBQzlDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDO1lBQ3hCLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxzQ0FBc0M7WUFDN0MsQ0FBQyxFQUFFLGFBQWE7U0FDakIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELG9EQUFvRDtJQUNwRCw0QkFBNEI7SUFDNUIsNkJBQTZCO0lBRTdCLDhEQUE4RDtJQUM5RCw4Q0FBOEM7SUFDOUMsb0RBQW9EO0lBRXBELHNDQUFzQztJQUN0QywrRUFBK0U7SUFDL0UsSUFBSTtJQUVKLHdCQUF3QixDQUN0QixLQUFpQixFQUNqQixLQUFhLEVBQ2IsS0FBYSxFQUNiLGFBQXFCO1FBRXJCLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN2QixLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7UUFFeEIscUJBQXFCO1FBQ3JCLE1BQU0sY0FBYyxHQUFHLGFBQWEsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDO1FBQ2hELElBQUksQ0FBQyxtQkFBbUIsR0FBRyxLQUFLLEdBQUcsRUFBRSxDQUFDLENBQUMsK0JBQStCO1FBQ3RFLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxLQUFLLEdBQUcsY0FBYyxDQUFDO1FBRWxELHlDQUF5QztRQUN6QyxJQUFJLENBQUMsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7WUFDakMsSUFBSSxDQUFDLHVCQUF1QixHQUFHLElBQUksQ0FBQztZQUNwQyxJQUFJLENBQUMsV0FBVztpQkFDYixRQUFRLEVBQUU7aUJBQ1YsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7Z0JBQ2pCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO2dCQUMxQyxJQUFJLENBQUMsdUJBQXVCLEdBQUcsS0FBSyxDQUFDO1lBQ3ZDLENBQUMsQ0FBQztpQkFDRCxLQUFLLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQkFDZixPQUFPLENBQUMsS0FBSyxDQUFDLHNCQUFzQixFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUM3QyxJQUFJLENBQUMsdUJBQXVCLEdBQUcsS0FBSyxDQUFDO1lBQ3ZDLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQztRQUVELElBQUksQ0FBQyxzQkFBc0IsR0FBRyxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQztJQUM3RCxDQUFDO0lBRUQsbUJBQW1CLENBQUMsSUFBdUI7UUFDekMsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNULElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pELENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3pDLENBQUM7UUFFRCxrQkFBa0I7UUFDbEIsSUFBSSxDQUFDLHNCQUFzQixHQUFHLEtBQUssQ0FBQztJQUN0QyxDQUFDO0lBRUQseUJBQXlCLENBQUMsQ0FBUyxFQUFFLENBQVMsRUFBRSxhQUFxQjtRQUNuRSxJQUFJLENBQUMsYUFBYSxHQUFHLENBQUMsQ0FBQztRQUN2QixJQUFJLENBQUMsYUFBYSxHQUFHLENBQUMsQ0FBQztRQUN2QixJQUFJLENBQUMsc0JBQXNCLEdBQUcsRUFBRSxhQUFhLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO1FBRXRELDREQUE0RDtRQUM1RCxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsb0JBQW9CLEVBQUUsRUFBRSxDQUFDO1lBQ3RDLG1DQUFtQztZQUNuQyxJQUFJLENBQUMsNEJBQTRCO2dCQUMvQixJQUFJLENBQUMsS0FBSyxDQUFDLHNCQUFzQixDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUM7WUFDeEQsSUFBSSxDQUFDLG9DQUFvQztnQkFDdkMsSUFBSSxDQUFDLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxtQkFBbUIsSUFBSSxJQUFJLENBQUM7WUFDaEUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxxQ0FBcUMsRUFBRTtnQkFDakQsV0FBVyxFQUFFLElBQUksQ0FBQyw0QkFBNEI7Z0JBQzlDLG1CQUFtQixFQUFFLElBQUksQ0FBQyxvQ0FBb0M7YUFDL0QsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVELGlCQUFpQjtRQUNqQixJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDO1FBQy9CLElBQUksQ0FBQyxXQUFXO2FBQ2IsWUFBWSxFQUFFO2FBQ2QsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDakIsSUFBSSxDQUFDLGFBQWEsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1lBQ3JDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxLQUFLLENBQUM7UUFDbEMsQ0FBQyxDQUFDO2FBQ0QsS0FBSyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDZixPQUFPLENBQUMsS0FBSyxDQUFDLDBCQUEwQixFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ2pELElBQUksQ0FBQyxrQkFBa0IsR0FBRyxLQUFLLENBQUM7UUFDbEMsQ0FBQyxDQUFDLENBQUM7UUFFTCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO0lBQy9CLENBQUM7SUFFRCxxQkFBcUIsQ0FBQyxRQUFrQjtRQUN0QyxPQUFPLENBQUMsR0FBRyxDQUFDLGlDQUFpQyxFQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM5RCxPQUFPLENBQUMsR0FBRyxDQUFDLDBCQUEwQixFQUFFO1lBQ3RDLFdBQVcsRUFBRSxJQUFJLENBQUMsNEJBQTRCO1lBQzlDLG1CQUFtQixFQUFFLElBQUksQ0FBQyxvQ0FBb0M7WUFDOUQsUUFBUSxFQUFFLElBQUksQ0FBQyxzQkFBc0I7U0FDdEMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztZQUNoQyxNQUFNLEVBQUUsYUFBYSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUM7WUFFNUQsMERBQTBEO1lBQzFELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUM3QixhQUFhLEVBQ2IsU0FBUyxFQUNULENBQUMsRUFDRCxDQUFDLEVBQ0QsU0FBUyxFQUFFLGdCQUFnQjtZQUMzQixFQUFFLEVBQUUsRUFBRSxRQUFRLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQ3pDLENBQUM7WUFFRixPQUFPLENBQUMsR0FBRyxDQUFDLHVCQUF1QixFQUFFLElBQUksQ0FBQyxDQUFDO1lBRTNDLCtEQUErRDtZQUMvRCxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsNEJBQTRCLEVBQUUsQ0FBQztnQkFDOUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFDO2dCQUV2RCxtREFBbUQ7Z0JBQ25ELElBQUksSUFBSSxDQUFDLGdCQUFnQixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQzlELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyw0QkFBNEIsQ0FBQztvQkFFdEQsc0NBQXNDO29CQUN0QyxNQUFNLFlBQVksR0FBRzt3QkFDbkIsS0FBSyxFQUFFLE1BQU07d0JBQ2IsSUFBSSxFQUFFLE9BQU87d0JBQ2IsR0FBRyxFQUFFLFFBQVE7d0JBQ2IsTUFBTSxFQUFFLEtBQUs7cUJBQ2QsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUF3QyxDQUFDO29CQUUzRCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUM1QyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxZQUFZLENBQy9CLENBQUM7b0JBRUYsSUFBSSxXQUFXLEVBQUUsQ0FBQzt3QkFDaEIsb0JBQW9CO3dCQUNwQixNQUFNLFVBQVUsR0FBRzs0QkFDakIsRUFBRSxFQUFFLFFBQVEsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFOzRCQUM1RCxZQUFZLEVBQUUsV0FBVyxDQUFDLE1BQU07NEJBQ2hDLFlBQVksRUFBRSxJQUFJLENBQUMsRUFBRTs0QkFDckIsYUFBYSxFQUFFLFdBQVcsQ0FBQyxFQUFFOzRCQUM3QixhQUFhLEVBQUUsV0FBVyxDQUFDLEVBQUU7NEJBQzdCLG1CQUFtQixFQUFFLElBQUksQ0FBQyxvQ0FBcUM7NEJBQy9ELG1CQUFtQixFQUFFLGFBQWE7eUJBQ25DLENBQUM7d0JBRUYsMkRBQTJEO3dCQUMzRCxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7d0JBQ3hDLE9BQU8sQ0FBQyxHQUFHLENBQUMsNEJBQTRCLEVBQUUsVUFBVSxDQUFDLENBQUM7d0JBQ3RELE9BQU8sQ0FBQyxHQUFHLENBQUMsMkJBQTJCLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztvQkFDbkUsQ0FBQztnQkFDSCxDQUFDO2dCQUNELElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUNqQyxDQUFDO1lBRUQsMkNBQTJDO1lBQzNDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDOUIsQ0FBQztRQUVELFdBQVc7UUFDWCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO1FBQzlCLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxJQUFJLENBQUM7UUFDbkMsSUFBSSxDQUFDLDRCQUE0QixHQUFHLElBQUksQ0FBQztRQUN6QyxJQUFJLENBQUMsb0NBQW9DLEdBQUcsSUFBSSxDQUFDO0lBQ25ELENBQUM7d0dBOXJCVSx1QkFBdUI7NEZBQXZCLHVCQUF1QixvY0M1QnBDLGl0ZkF5Z0JBOzs0RkQ3ZWEsdUJBQXVCO2tCQUxuQyxTQUFTOytCQUNFLHFCQUFxQjs0SEFLdEIsWUFBWTtzQkFBcEIsS0FBSztnQkFDSSxlQUFlO3NCQUF4QixNQUFNO2dCQUNHLGVBQWU7c0JBQXhCLE1BQU07Z0JBR0csZUFBZTtzQkFBeEIsTUFBTTtnQkFNZ0MsU0FBUztzQkFBL0MsU0FBUzt1QkFBQyxRQUFRLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUdyQyxlQUFlO3NCQURkLFlBQVk7dUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBc1AxQyxlQUFlO3NCQURkLFlBQVk7dUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSG9zdExpc3RlbmVyLFxuICBJbnB1dCxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBDb25uZWN0aW9uLFxuICBDb25uZWN0aW9uUG9pbnQsXG4gIE5vZGUgYXMgV0ZOb2RlLFxuICBUb29sVHlwZSxcbiAgU3dpbWxhbmVJdGVtLFxufSBmcm9tICcuLi93b3JrZmxvdy1kZXNpZ25lci50eXBlcyc7XG5pbXBvcnQgeyBXb3JrZmxvd0Rlc2lnbmVyU3RhdGUgfSBmcm9tICcuLi93b3JrZmxvdy1kZXNpZ25lci5zdGF0ZSc7XG5pbXBvcnQgeyBXb3JrZmxvd1N0YWdlIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL1dvcmtmbG93U3RhZ2UnO1xuaW1wb3J0IHsgRm9ybUVudGl0eSB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9Gb3JtRW50aXR5JztcbmltcG9ydCB7IFdvcmtmbG93IH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL1dvcmtmbG93JztcbmltcG9ydCB7IFdvcmtmbG93RGF0YVNlcnZpY2UgfSBmcm9tICcuLi93b3JrZmxvdy1kYXRhLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItZGVzaWduZXItY2FudmFzJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2Rlc2lnbmVyLWNhbnZhcy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9kZXNpZ25lci1jYW52YXMuY29tcG9uZW50LmNzcycsXG59KVxuZXhwb3J0IGNsYXNzIERlc2lnbmVyQ2FudmFzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KCkgc2VsZWN0ZWRUb29sOiBUb29sVHlwZSA9IG51bGw7XG4gIEBPdXRwdXQoKSBjbGlja2VkUG9zaXRpb24gPSBuZXcgRXZlbnRFbWl0dGVyPHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfT4oKTtcbiAgQE91dHB1dCgpIHN1YmZsb3dTZWxlY3RlZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgcGVuZGluZ1N0YWdlUG9zaXRpb246IHsgc3dpbWxhbmVJbmRleDogbnVtYmVyOyB4OiBudW1iZXI7IHk6IG51bWJlciB9IHwgbnVsbCA9XG4gICAgbnVsbDtcbiAgQE91dHB1dCgpIHNob3dTdGFnZURpYWxvZyA9IG5ldyBFdmVudEVtaXR0ZXI8e1xuICAgIHBvc2l0aW9uOiBhbnk7XG4gICAgaXNGcm9tQ29ubmVjdGlvbjogYm9vbGVhbjtcbiAgfT4oKTtcblxuICAvLyBSZWZlcmVuY2UgdG8gdGhlIFNWRyBlbGVtZW50XG4gIEBWaWV3Q2hpbGQoJ2NhbnZhcycsIHsgc3RhdGljOiB0cnVlIH0pIGNhbnZhc1JlZiE6IEVsZW1lbnRSZWY8U1ZHRWxlbWVudD47XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93Om1vdXNldXAnLCBbJyRldmVudCddKVxuICBvbldpbmRvd01vdXNlVXAoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICAvLyBJZiB3ZSBoYXZlIGEgcG9wdXAgb3BlbiBidXQgdGhlIG1vdXNlIGlzIHJlbGVhc2VkIG91dHNpZGUsIGNsZWFuIHVwXG4gICAgaWYgKFxuICAgICAgIXRoaXMuc2hvd1N1YmZsb3dQb3B1cCAmJlxuICAgICAgIXRoaXMuc2hvd1N0YXJ0Tm9kZUZvcm1Qb3B1cCAmJlxuICAgICAgIXRoaXMucG9wdXBWaXNpYmxlICYmIC8vIE9ubHkgZW5kIGRyYWcgaWYgbm8gcG9wdXAgaXMgdmlzaWJsZVxuICAgICAgdGhpcy5zdGF0ZS5pc0Nvbm5lY3Rpb25EcmFnZ2luZygpXG4gICAgKSB7XG4gICAgICBjb25zb2xlLmxvZygnRXh0ZXJuYWwgbW91c2V1cCBkZXRlY3RlZCAtIGNsZWFuaW5nIHVwIGNvbm5lY3Rpb24gZHJhZycpO1xuICAgICAgdGhpcy5zdGF0ZS5lbmRDb25uZWN0aW9uRHJhZygpO1xuICAgIH1cbiAgfVxuXG4gIC8vIENhbnZhcyBkaW1lbnNpb25zXG4gIGNhbnZhc1dpZHRoID0gMzAwMDtcbiAgY2FudmFzSGVpZ2h0ID0gMjAwMDtcblxuICAvLyBHcmlkIHNpemVcbiAgZ3JpZFNpemUgPSAyMDtcblxuICBzd2ltbGFuZUhlaWdodCA9IDI2MztcbiAgdmlzaWJsZUNvbm5lY3Rpb25Qb2ludHNOb2RlSWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBwb3B1cFZpc2libGUgPSBmYWxzZTtcbiAgcG9wdXBYID0gMDtcbiAgcG9wdXBZID0gMDtcbiAgYWxsb3dlZE5vZGVUeXBlczogc3RyaW5nW10gPSBbXTtcblxuICBzaG93U3RhcnROb2RlRm9ybVBvcHVwOiBib29sZWFuID0gZmFsc2U7XG4gIHN0YXJ0Tm9kZUZvcm1zTGlzdDogRm9ybUVudGl0eVtdID0gW107XG4gIGlzTG9hZGluZ1N0YXJ0Tm9kZUZvcm1zOiBib29sZWFuID0gZmFsc2U7XG4gIHN0YXJ0Tm9kZUZvcm1Qb3B1cFg6IG51bWJlciA9IDA7XG4gIHN0YXJ0Tm9kZUZvcm1Qb3B1cFk6IG51bWJlciA9IDA7XG5cbiAgc2hvd1N1YmZsb3dQb3B1cDogYm9vbGVhbiA9IGZhbHNlO1xuICB3b3JrZmxvd3NMaXN0OiBXb3JrZmxvd1tdID0gW107XG4gIGlzTG9hZGluZ1dvcmtmbG93czogYm9vbGVhbiA9IGZhbHNlO1xuICBzdWJmbG93UG9wdXBYOiBudW1iZXIgPSAwO1xuICBzdWJmbG93UG9wdXBZOiBudW1iZXIgPSAwO1xuICBwZW5kaW5nU3ViZmxvd1Bvc2l0aW9uOiB7XG4gICAgc3dpbWxhbmVJbmRleDogbnVtYmVyO1xuICAgIHg6IG51bWJlcjtcbiAgICB5OiBudW1iZXI7XG4gIH0gfCBudWxsID0gbnVsbDtcblxuICBwZW5kaW5nQ29ubmVjdGlvblNvdXJjZVBvaW50OiBDb25uZWN0aW9uUG9pbnQgfCBudWxsID0gbnVsbDtcbiAgcGVuZGluZ0Nvbm5lY3Rpb25Tb3VyY2VTd2ltbGFuZUluZGV4OiBudW1iZXIgfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgc3RhdGU6IFdvcmtmbG93RGVzaWduZXJTdGF0ZSxcbiAgICBwcml2YXRlIGRhdGFTZXJ2aWNlOiBXb3JrZmxvd0RhdGFTZXJ2aWNlXG4gICkge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnVwZGF0ZUNhbnZhc1NpemUoKTtcbiAgfVxuXG4gIC8vIEhhbmRsZSBtb3VzZSBjbGljayBvbiBjYW52YXNcbiAgb25DYW52YXNDbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIC8vIE9ubHkgcHJvY2VzcyBjYW52YXMgY2xpY2tzIGlmIGEgdG9vbCBpcyBzZWxlY3RlZFxuICAgIGlmICghdGhpcy5zZWxlY3RlZFRvb2wpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBHZXQgdGhlIHBvc2l0aW9uIHdoZXJlIHRoZSBjbGljayBvY2N1cnJlZFxuICAgIGNvbnN0IHBvc2l0aW9uID0gdGhpcy5nZXRNb3VzZVBvc2l0aW9uKGV2ZW50KTtcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgICdDYW52YXMgY2xpY2tlZCBhdDonLFxuICAgICAgcG9zaXRpb24sXG4gICAgICAnd2l0aCB0b29sOicsXG4gICAgICB0aGlzLnNlbGVjdGVkVG9vbFxuICAgICk7XG5cbiAgICAvLyBDYWxjdWxhdGUgdGhlIHN3aW1sYW5lIGluZGV4IGJhc2VkIG9uIHBvc2l0aW9uXG4gICAgLy8gY29uc3Qgc3dpbWxhbmVJbmRleCA9IE1hdGguZmxvb3IocG9zaXRpb24ueSAvIHRoaXMuc3dpbWxhbmVIZWlnaHQpO1xuXG4gICAgLy8gT25seSBlbWl0IHRoZSBwb3NpdGlvbiBpZiB3ZSBoYXZlIGEgdG9vbCBzZWxlY3RlZCBhbmQgaXQncyBhIHZhbGlkIGNsaWNrIGFyZWFcbiAgICBpZiAodGhpcy5zZWxlY3RlZFRvb2wpIHtcbiAgICAgIHRoaXMuY2xpY2tlZFBvc2l0aW9uLmVtaXQoe1xuICAgICAgICB4OiBwb3NpdGlvbi54LFxuICAgICAgICB5OiBwb3NpdGlvbi55LFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlQ2FudmFzU2l6ZSgpOiB2b2lkIHtcbiAgICBjb25zdCByZXF1aXJlZEhlaWdodCA9XG4gICAgICAodGhpcy5zdGF0ZS5zd2ltbGFuZXMubGVuZ3RoICsgMSkgKiB0aGlzLnN3aW1sYW5lSGVpZ2h0O1xuICAgIHRoaXMuY2FudmFzSGVpZ2h0ID0gTWF0aC5tYXgoMjAwMCwgcmVxdWlyZWRIZWlnaHQpOyAvLyBFbnN1cmUgd2UgaGF2ZSBhdCBsZWFzdCBvdXIgZGVmYXVsdCBoZWlnaHRcbiAgfVxuXG4gIC8vIEhlbHBlciBtZXRob2QgdG8gZ2V0IHRoZSBtb3VzZSBwb3NpdGlvbiByZWxhdGl2ZSB0byB0aGUgU1ZHIGNhbnZhc1xuICBwcml2YXRlIGdldE1vdXNlUG9zaXRpb24oZXZlbnQ6IE1vdXNlRXZlbnQpOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0ge1xuICAgIC8vIFVzZSBjbGllbnRYL1kgYW5kIGdldEJvdW5kaW5nQ2xpZW50UmVjdCgpIGZvciBjcm9zcy1icm93c2VyIGNvbXBhdGliaWxpdHlcbiAgICBjb25zdCByZWN0ID0gdGhpcy5jYW52YXNSZWYubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICByZXR1cm4ge1xuICAgICAgeDogZXZlbnQuY2xpZW50WCAtIHJlY3QubGVmdCxcbiAgICAgIHk6IGV2ZW50LmNsaWVudFkgLSByZWN0LnRvcCxcbiAgICB9O1xuICB9XG5cbiAgc2hvd0Nvbm5lY3Rpb25Qb2ludHMobm9kZUlkOiBzdHJpbmcsIHN3aW1sYW5lSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMudmlzaWJsZUNvbm5lY3Rpb25Qb2ludHNOb2RlSWQgPSBub2RlSWQ7XG4gIH1cblxuICBpc01vdXNlT3Zlck5vZGUoXG4gICAgZXZlbnQ6IE1vdXNlRXZlbnQsXG4gICAgbm9kZTogV0ZOb2RlLFxuICAgIHN3aW1sYW5lSW5kZXg6IG51bWJlclxuICApOiBib29sZWFuIHtcbiAgICBjb25zdCBwb3NpdGlvbiA9IHRoaXMuZ2V0TW91c2VQb3NpdGlvbihldmVudCk7XG4gICAgY29uc3Qgbm9kZUJvdW5kcyA9IHRoaXMuZ2V0Tm9kZUJvdW5kc1dpdGhQYWRkaW5nKG5vZGUsIHN3aW1sYW5lSW5kZXgpO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIHBvc2l0aW9uLnggPj0gbm9kZUJvdW5kcy54ICYmXG4gICAgICBwb3NpdGlvbi54IDw9IG5vZGVCb3VuZHMueCArIG5vZGVCb3VuZHMud2lkdGggJiZcbiAgICAgIHBvc2l0aW9uLnkgPj0gbm9kZUJvdW5kcy55ICYmXG4gICAgICBwb3NpdGlvbi55IDw9IG5vZGVCb3VuZHMueSArIG5vZGVCb3VuZHMuaGVpZ2h0XG4gICAgKTtcbiAgfVxuXG4gIC8vIGhlbHBlciBtZXRob2QgdG8gY2FsY3VsYXRlIG5vZGUgYm91bmRzIHdpdGggcGFkZGluZ1xuICBnZXROb2RlQm91bmRzV2l0aFBhZGRpbmcoXG4gICAgbm9kZTogV0ZOb2RlLFxuICAgIHN3aW1sYW5lSW5kZXg6IG51bWJlclxuICApOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHtcbiAgICBjb25zdCBwYWRkaW5nID0gMTA7IC8vIEFkZCAxMHB4IHBhZGRpbmcgYXJvdW5kIG5vZGVzIGZvciBlYXNpZXIgaG92ZXIgZGV0ZWN0aW9uXG5cbiAgICAvLyBDYWxjdWxhdGUgdGhlIGFic29sdXRlIFkgcG9zaXRpb24gaW5jbHVkaW5nIHN3aW1sYW5lIG9mZnNldFxuICAgIGNvbnN0IGFic29sdXRlWSA9IG5vZGUueSArIChzd2ltbGFuZUluZGV4ICogMjYzICsgNDApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IG5vZGUueCAtIHBhZGRpbmcsXG4gICAgICB5OiBhYnNvbHV0ZVkgLSBwYWRkaW5nLFxuICAgICAgd2lkdGg6IG5vZGUud2lkdGggKyBwYWRkaW5nICogMixcbiAgICAgIGhlaWdodDogbm9kZS5oZWlnaHQgKyBwYWRkaW5nICogMixcbiAgICB9O1xuICB9XG5cbiAgaGlkZUNvbm5lY3Rpb25Qb2ludHMobm9kZUlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLnZpc2libGVDb25uZWN0aW9uUG9pbnRzTm9kZUlkID09PSBub2RlSWQgJiZcbiAgICAgICF0aGlzLnN0YXRlLmlzQ29ubmVjdGlvbkRyYWdnaW5nKClcbiAgICApIHtcbiAgICAgIHRoaXMudmlzaWJsZUNvbm5lY3Rpb25Qb2ludHNOb2RlSWQgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGlzQ29ubmVjdGlvblBvaW50VmlzaWJsZShub2RlSWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnZpc2libGVDb25uZWN0aW9uUG9pbnRzTm9kZUlkID09PSBub2RlSWQ7XG4gIH1cblxuICBzdGFydENvbm5lY3Rpb25EcmFnKFxuICAgIGV2ZW50OiBNb3VzZUV2ZW50LFxuICAgIHBvaW50OiBDb25uZWN0aW9uUG9pbnQsXG4gICAgc3dpbWxhbmVJbmRleDogbnVtYmVyXG4gICk6IHZvaWQge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICBjb25zdCBwb3NpdGlvbiA9IHRoaXMuZ2V0TW91c2VQb3NpdGlvbihldmVudCk7XG4gICAgdGhpcy5zdGF0ZS5zdGFydENvbm5lY3Rpb25EcmFnKFxuICAgICAgcG9pbnQsXG4gICAgICBzd2ltbGFuZUluZGV4LFxuICAgICAgcG9zaXRpb24ueCxcbiAgICAgIHBvc2l0aW9uLnlcbiAgICApO1xuXG4gICAgLy8gQWRkIG1vdXNlIG1vdmUgYW5kIG1vdXNlIHVwIGV2ZW50IGxpc3RlbmVycyB0byB0aGUgZG9jdW1lbnRcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLm9uTW91c2VNb3ZlKTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5vbk1vdXNlVXApO1xuICB9XG5cbiAgLy8gVXNlIGFycm93IGZ1bmN0aW9ucyB0byBwcmVzZXJ2ZSAndGhpcycgY29udGV4dFxuICBvbk1vdXNlTW92ZSA9IChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgIGNvbnN0IHBvc2l0aW9uID0gdGhpcy5nZXRNb3VzZVBvc2l0aW9uKGV2ZW50KTtcbiAgICB0aGlzLnN0YXRlLnVwZGF0ZUNvbm5lY3Rpb25EcmFnKHBvc2l0aW9uLngsIHBvc2l0aW9uLnkpO1xuICB9O1xuXG4gIG9uTW91c2VVcCA9IChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMub25Nb3VzZU1vdmUpO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLm9uTW91c2VVcCk7XG5cbiAgICBjb25zdCBwb3NpdGlvbiA9IHRoaXMuZ2V0TW91c2VQb3NpdGlvbihldmVudCk7XG4gICAgY29uc29sZS5sb2coJ01vdXNlIHVwIGF0IHBvc2l0aW9uOicsIHBvc2l0aW9uKTtcbiAgICBjb25zb2xlLmxvZygnSXMgY29ubmVjdGlvbiBkcmFnZ2luZzonLCB0aGlzLnN0YXRlLmlzQ29ubmVjdGlvbkRyYWdnaW5nKCkpO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHBvc2l0aW9uIGlzIHdpdGhpbiBhbnkgc3dpbWxhbmVcbiAgICBjb25zdCBpc0luc2lkZVN3aW1sYW5lID0gdGhpcy5pc1Bvc2l0aW9uSW5zaWRlU3dpbWxhbmUocG9zaXRpb24ueSk7XG4gICAgY29uc29sZS5sb2coJ0lzIGluc2lkZSBzd2ltbGFuZTonLCBpc0luc2lkZVN3aW1sYW5lKTtcblxuICAgIC8vIE9ubHkgc2hvdyBwb3B1cCBpZiB3aXRoaW4gYSBzd2ltbGFuZVxuICAgIGlmIChpc0luc2lkZVN3aW1sYW5lICYmIHRoaXMuc3RhdGUuaXNDb25uZWN0aW9uRHJhZ2dpbmcoKSkge1xuICAgICAgY29uc29sZS5sb2coJ1Nob3dpbmcgY29ubmVjdGlvbiBwb3B1cCcpO1xuICAgICAgdGhpcy5zaG93Q29ubmVjdGlvblBvcHVwKHBvc2l0aW9uLngsIHBvc2l0aW9uLnkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBFbmQgdGhlIGNvbm5lY3Rpb24gZHJhZyBpZiBvdXRzaWRlIGEgc3dpbWxhbmVcbiAgICAgIGNvbnNvbGUubG9nKCdFbmRpbmcgY29ubmVjdGlvbiBkcmFnIHdpdGhvdXQgc2hvd2luZyBwb3B1cCcpO1xuICAgICAgdGhpcy5zdGF0ZS5lbmRDb25uZWN0aW9uRHJhZygpO1xuICAgIH1cbiAgfTtcblxuICBpc1Bvc2l0aW9uSW5zaWRlU3dpbWxhbmUoeTogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgLy8gQ2hlY2sgaWYgeSBwb3NpdGlvbiBpcyB3aXRoaW4gYW55IHN3aW1sYW5lXG4gICAgY29uc3Qgc3dpbWxhbmVDb3VudCA9IHRoaXMuc3RhdGUuc3dpbWxhbmVzLmxlbmd0aDtcbiAgICBpZiAoc3dpbWxhbmVDb3VudCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgLy8gRWFjaCBzd2ltbGFuZSBoYXMgYSBoZWlnaHQgb2YgMjYzcHhcbiAgICBjb25zdCB0b3RhbFN3aW1sYW5lSGVpZ2h0ID0gc3dpbWxhbmVDb3VudCAqIHRoaXMuc3dpbWxhbmVIZWlnaHQ7XG5cbiAgICAvLyBDaGVjayBpZiB5IGlzIHdpdGhpbiB0aGUgdG90YWwgaGVpZ2h0IG9mIGFsbCBzd2ltbGFuZXNcbiAgICByZXR1cm4geSA+PSAwICYmIHkgPCB0b3RhbFN3aW1sYW5lSGVpZ2h0O1xuICB9XG5cbiAgc2hvd0Nvbm5lY3Rpb25Qb3B1cCh4OiBudW1iZXIsIHk6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKCdTaG93aW5nIGNvbm5lY3Rpb24gcG9wdXAgYXQ6JywgeCwgeSk7XG4gICAgdGhpcy5wb3B1cFggPSB4O1xuICAgIHRoaXMucG9wdXBZID0geTtcblxuICAgIC8vIEdldCBhbGxvd2VkIG5vZGUgdHlwZXMgYmFzZWQgb24gdGhlIHNvdXJjZSBub2RlIHR5cGVcbiAgICB0aGlzLmFsbG93ZWROb2RlVHlwZXMgPSB0aGlzLnN0YXRlLmdldEFsbG93ZWRUYXJnZXROb2RlVHlwZXMoKTtcbiAgICBjb25zb2xlLmxvZygnQWxsb3dlZCBub2RlIHR5cGVzOicsIHRoaXMuYWxsb3dlZE5vZGVUeXBlcyk7XG5cbiAgICAvLyBPbmx5IHNob3cgdGhlIHBvcHVwIGlmIHdlIGhhdmUgYWxsb3dlZCBub2RlIHR5cGVzXG4gICAgaWYgKHRoaXMuYWxsb3dlZE5vZGVUeXBlcy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnBvcHVwVmlzaWJsZSA9IHRydWU7XG4gICAgICBjb25zb2xlLmxvZygnUG9wdXAgdmlzaWJpbGl0eSBzZXQgdG8gdHJ1ZScpO1xuXG4gICAgICAvLyBGb3JjZSB0aGUgcG9wdXAgdG8gYmUgdmlzaWJsZSBpbiB0aGUgbmV4dCB0aWNrXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coJ0lzIHBvcHVwIHZpc2libGUgaW4gbmV4dCB0aWNrOicsIHRoaXMucG9wdXBWaXNpYmxlKTtcbiAgICAgIH0sIDApO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBObyBhbGxvd2VkIG5vZGUgdHlwZXMsIGp1c3QgZW5kIHRoZSBkcmFnXG4gICAgICBjb25zb2xlLmxvZygnTm8gYWxsb3dlZCBub2RlIHR5cGVzLCBlbmRpbmcgZHJhZycpO1xuICAgICAgdGhpcy5zdGF0ZS5lbmRDb25uZWN0aW9uRHJhZygpO1xuICAgIH1cbiAgfVxuXG4gIGhpZGVDb25uZWN0aW9uUG9wdXAoKTogdm9pZCB7XG4gICAgdGhpcy5wb3B1cFZpc2libGUgPSBmYWxzZTtcbiAgICB0aGlzLnN0YXRlLmVuZENvbm5lY3Rpb25EcmFnKCk7XG4gIH1cblxuICAvLyBBZGQgdGhpcyBoYW5kbGVyIHRvIGNsb3NlIHRoZSBwb3B1cCB3aGVuIGNsaWNraW5nIG91dHNpZGVcbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6Y2xpY2snLCBbJyRldmVudCddKVxuICBvbkRvY3VtZW50Q2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wb3B1cFZpc2libGUpIHtcbiAgICAgIGNvbnN0IHBvcHVwRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3ZlcmJlbi1wb3AtVXAnKTtcbiAgICAgIGlmIChwb3B1cEVsZW1lbnQgJiYgIXBvcHVwRWxlbWVudC5jb250YWlucyhldmVudC50YXJnZXQgYXMgTm9kZSkpIHtcbiAgICAgICAgdGhpcy5oaWRlQ29ubmVjdGlvblBvcHVwKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY3JlYXRlTm9kZUNvbm5lY3Rpb24obm9kZVR5cGU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHBhdGhEYXRhID0gdGhpcy5zdGF0ZS5nZXRDb25uZWN0aW9uUGF0aERhdGEoKTtcbiAgICBpZiAoIXBhdGhEYXRhKSB7XG4gICAgICB0aGlzLmhpZGVDb25uZWN0aW9uUG9wdXAoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiB0aGlzIG5vZGUgdHlwZSBpcyBhbGxvd2VkIHRvIGJlIGNyZWF0ZWRcbiAgICBjb25zdCBhbGxvd2VkVHlwZXMgPSB0aGlzLnN0YXRlLmdldEFsbG93ZWRUYXJnZXROb2RlVHlwZXMoKTtcbiAgICBpZiAoIWFsbG93ZWRUeXBlcy5pbmNsdWRlcyhub2RlVHlwZSkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGBDYW5ub3QgY3JlYXRlIGNvbm5lY3Rpb24gdG8gJHtub2RlVHlwZX0gZnJvbSBjdXJyZW50IG5vZGUgdHlwZWBcbiAgICAgICk7XG4gICAgICB0aGlzLmhpZGVDb25uZWN0aW9uUG9wdXAoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB7IGVuZFgsIGVuZFksIHNvdXJjZVN3aW1sYW5lSW5kZXggfSA9IHBhdGhEYXRhO1xuXG4gICAgLy8gQ2FsY3VsYXRlIHN3aW1sYW5lLXJlbGF0aXZlIHBvc2l0aW9uXG4gICAgY29uc3Qgc3dpbWxhbmVPZmZzZXRZID0gc291cmNlU3dpbWxhbmVJbmRleCAqIDI2MyArIDQwO1xuICAgIGNvbnN0IHJlbGF0aXZlWSA9IGVuZFkgLSBzd2ltbGFuZU9mZnNldFk7XG5cbiAgICAvLyBIYW5kbGUgcHJlY29uZGl0aW9ucyBiYXNlZCBvbiBub2RlIHR5cGVcbiAgICBpZiAobm9kZVR5cGUgPT09ICdzdGFnZScpIHtcbiAgICAgIC8vIE9wZW4gc3RhZ2UgcHJvcGVydGllcyBkaWFsb2cgaW5zdGVhZCBvZiBjcmVhdGluZyBub2RlIGRpcmVjdGx5XG4gICAgICB0aGlzLnBlbmRpbmdTdGFnZVBvc2l0aW9uID0ge1xuICAgICAgICBzd2ltbGFuZUluZGV4OiBzb3VyY2VTd2ltbGFuZUluZGV4LFxuICAgICAgICB4OiBlbmRYLFxuICAgICAgICB5OiBlbmRZLFxuICAgICAgfTtcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAnRW1pdHRpbmcgc2hvd1N0YWdlRGlhbG9nIGV2ZW50IHdpdGggcG9zaXRpb246JyxcbiAgICAgICAgdGhpcy5wZW5kaW5nU3RhZ2VQb3NpdGlvblxuICAgICAgKTtcbiAgICAgIHRoaXMuc2hvd1N0YWdlRGlhbG9nLmVtaXQoe1xuICAgICAgICBwb3NpdGlvbjogdGhpcy5wZW5kaW5nU3RhZ2VQb3NpdGlvbixcbiAgICAgICAgaXNGcm9tQ29ubmVjdGlvbjogdHJ1ZSxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5oaWRlQ29ubmVjdGlvblBvcHVwKCk7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIGlmIChub2RlVHlwZSA9PT0gJ3N1YmZsb3cnKSB7XG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgJ0NyZWF0aW5nIHN1YmZsb3cgZnJvbSBjb25uZWN0aW9uIGF0OicsXG4gICAgICAgIGVuZFgsXG4gICAgICAgIGVuZFksXG4gICAgICAgICdzd2ltbGFuZTonLFxuICAgICAgICBzb3VyY2VTd2ltbGFuZUluZGV4XG4gICAgICApO1xuICAgICAgLy8gU2hvdyB3b3JrZmxvdyBzZWxlY3Rpb24gcG9wdXAgYW5kIHN0b3JlIGNvbm5lY3Rpb24gZGF0YSBmb3IgbGF0ZXIgdXNlXG4gICAgICB0aGlzLnNob3dTdWJmbG93U2VsZWN0aW9uUG9wdXAoZW5kWCwgZW5kWSwgc291cmNlU3dpbWxhbmVJbmRleCk7XG4gICAgICB0aGlzLmhpZGVDb25uZWN0aW9uUG9wdXAoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBGb3Igb3RoZXIgbm9kZXMgQ3JlYXRlIHRoZSBuZXcgbm9kZSBhdCB0aGUgZW5kIHBvc2l0aW9uIG9mIHRoZSBjb25uZWN0aW9uXG4gICAgY29uc3QgbmV3Tm9kZSA9IHRoaXMuc3RhdGUuYWRkTm9kZShcbiAgICAgIHNvdXJjZVN3aW1sYW5lSW5kZXgsXG4gICAgICBub2RlVHlwZSBhcyBUb29sVHlwZSxcbiAgICAgIGVuZFgsXG4gICAgICByZWxhdGl2ZVlcbiAgICApO1xuXG4gICAgaWYgKFxuICAgICAgbmV3Tm9kZSAmJlxuICAgICAgbmV3Tm9kZS5jb25uZWN0aW9uUG9pbnRzICYmXG4gICAgICBuZXdOb2RlLmNvbm5lY3Rpb25Qb2ludHMubGVuZ3RoID4gMFxuICAgICkge1xuICAgICAgLy8gRmluZCB0aGUgbW9zdCBhcHByb3ByaWF0ZSBjb25uZWN0aW9uIHBvaW50IChjbG9zZXN0IHRvIHRoZSBzb3VyY2UpXG4gICAgICBjb25zdCBzb3VyY2VQb2ludCA9IHRoaXMuc3RhdGUuZHJhZ2dpbmdDb25uZWN0aW9uRGF0YS5zb3VyY2VQb2ludDtcbiAgICAgIGlmIChzb3VyY2VQb2ludCkge1xuICAgICAgICAvLyBGb3Igc2ltcGxpY2l0eSwgdXNlIHRoZSBmaXJzdCBjb25uZWN0aW9uIHBvaW50IG9mIG9wcG9zaW5nIHR5cGVcbiAgICAgICAgLy8gSW4gYSByZWFsIGltcGxlbWVudGF0aW9uLCB5b3UnZCBmaW5kIHRoZSBjbG9zZXN0IG9yIG1vc3QgYXBwcm9wcmlhdGUgcG9pbnRcbiAgICAgICAgbGV0IHRhcmdldFBvaW50O1xuXG4gICAgICAgIC8vIElmIHNvdXJjZSBpcyBvbiByaWdodCwgdGFyZ2V0IHNob3VsZCBiZSBvbiBsZWZ0LCBldGMuXG4gICAgICAgIGNvbnN0IG9wcG9zaW5nVHlwZSA9IHtcbiAgICAgICAgICByaWdodDogJ2xlZnQnLFxuICAgICAgICAgIGxlZnQ6ICdyaWdodCcsXG4gICAgICAgICAgdG9wOiAnYm90dG9tJyxcbiAgICAgICAgICBib3R0b206ICd0b3AnLFxuICAgICAgICB9W3NvdXJjZVBvaW50LnR5cGVdIGFzICd0b3AnIHwgJ3JpZ2h0JyB8ICdib3R0b20nIHwgJ2xlZnQnO1xuXG4gICAgICAgIHRhcmdldFBvaW50ID0gbmV3Tm9kZS5jb25uZWN0aW9uUG9pbnRzLmZpbmQoXG4gICAgICAgICAgKHApID0+IHAudHlwZSA9PT0gb3Bwb3NpbmdUeXBlXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHRhcmdldFBvaW50KSB7XG4gICAgICAgICAgLy8gQ3JlYXRlIHRoZSBjb25uZWN0aW9uXG4gICAgICAgICAgdGhpcy5zdGF0ZS5jcmVhdGVDb25uZWN0aW9uKFxuICAgICAgICAgICAgbmV3Tm9kZS5pZCxcbiAgICAgICAgICAgIHRhcmdldFBvaW50LmlkLFxuICAgICAgICAgICAgc291cmNlU3dpbWxhbmVJbmRleFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBFbmQgdGhlIGNvbm5lY3Rpb24gZHJhZ1xuICAgIHRoaXMuaGlkZUNvbm5lY3Rpb25Qb3B1cCgpO1xuICB9XG5cbiAgZ2V0Q29ubmVjdGlvblBhdGgoKTogc3RyaW5nIHtcbiAgICBjb25zdCBwYXRoRGF0YSA9IHRoaXMuc3RhdGUuZ2V0Q29ubmVjdGlvblBhdGhEYXRhKCk7XG4gICAgaWYgKCFwYXRoRGF0YSkgcmV0dXJuICcnO1xuXG4gICAgY29uc3QgeyBzdGFydFgsIHN0YXJ0WSwgZW5kWCwgZW5kWSB9ID0gcGF0aERhdGE7XG4gICAgY29uc3Qgc291cmNlUG9pbnQgPSB0aGlzLnN0YXRlLmRyYWdnaW5nQ29ubmVjdGlvbkRhdGEuc291cmNlUG9pbnQ7XG5cbiAgICBpZiAoIXNvdXJjZVBvaW50KSByZXR1cm4gJyc7XG5cbiAgICByZXR1cm4gdGhpcy5nZXRPcnRob2dvbmFsUGF0aChzdGFydFgsIHN0YXJ0WSwgZW5kWCwgZW5kWSwgc291cmNlUG9pbnQudHlwZSk7XG4gIH1cblxuICBnZXRDb25uZWN0aW9uUGF0aEZvclNhdmVkQ29ubmVjdGlvbihjb25uZWN0aW9uOiBDb25uZWN0aW9uKTogc3RyaW5nIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGF0aERhdGEgPSB0aGlzLnN0YXRlLmdldENvbm5lY3Rpb25EYXRhKGNvbm5lY3Rpb24pO1xuICAgICAgaWYgKCFwYXRoRGF0YSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdObyBwYXRoIGRhdGEgZm9yIGNvbm5lY3Rpb246JywgY29ubmVjdGlvbik7XG4gICAgICAgIHJldHVybiAnJztcbiAgICAgIH1cblxuICAgICAgY29uc3QgeyBzdGFydFgsIHN0YXJ0WSwgZW5kWCwgZW5kWSB9ID0gcGF0aERhdGE7XG5cbiAgICAgIGNvbnN0IHNvdXJjZU5vZGVJbmZvID0gdGhpcy5zdGF0ZS5maW5kTm9kZUJ5SWQoY29ubmVjdGlvbi5zb3VyY2VOb2RlSWQpO1xuICAgICAgaWYgKCFzb3VyY2VOb2RlSW5mbykge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdTb3VyY2Ugbm9kZSBub3QgZm91bmQgZm9yIGNvbm5lY3Rpb246JywgY29ubmVjdGlvbik7XG4gICAgICAgIHJldHVybiAnJztcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc291cmNlTm9kZSA9IHNvdXJjZU5vZGVJbmZvLm5vZGU7XG4gICAgICBjb25zdCBzb3VyY2VQb2ludCA9IHNvdXJjZU5vZGUuY29ubmVjdGlvblBvaW50cz8uZmluZChcbiAgICAgICAgKHApID0+IHAuaWQgPT09IGNvbm5lY3Rpb24uc291cmNlUG9pbnRJZFxuICAgICAgKTtcblxuICAgICAgaWYgKCFzb3VyY2VQb2ludCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdTb3VyY2UgcG9pbnQgbm90IGZvdW5kIGZvciBjb25uZWN0aW9uOicsIGNvbm5lY3Rpb24pO1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLmdldE9ydGhvZ29uYWxQYXRoKFxuICAgICAgICBzdGFydFgsXG4gICAgICAgIHN0YXJ0WSxcbiAgICAgICAgZW5kWCxcbiAgICAgICAgZW5kWSxcbiAgICAgICAgc291cmNlUG9pbnQudHlwZVxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZ2VuZXJhdGluZyBwYXRoIGZvciBjb25uZWN0aW9uOicsIGNvbm5lY3Rpb24sIGVycm9yKTtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gIH1cblxuICBnZXRPcnRob2dvbmFsUGF0aChcbiAgICBzdGFydFg6IG51bWJlcixcbiAgICBzdGFydFk6IG51bWJlcixcbiAgICBlbmRYOiBudW1iZXIsXG4gICAgZW5kWTogbnVtYmVyLFxuICAgIHBvaW50VHlwZTogJ3RvcCcgfCAncmlnaHQnIHwgJ2JvdHRvbScgfCAnbGVmdCdcbiAgKTogc3RyaW5nIHtcbiAgICAvLyBEZXRlcm1pbmUgaW5pdGlhbCBkaXJlY3Rpb24gYmFzZWQgb24gY29ubmVjdGlvbiBwb2ludCB0eXBlXG4gICAgbGV0IHBhdGggPSAnJztcblxuICAgIC8vIEZvciBzaWRlIHBvaW50cyAobGVmdC9yaWdodCksIHN0YXJ0IHdpdGggaG9yaXpvbnRhbCBsaW5lXG4gICAgaWYgKHBvaW50VHlwZSA9PT0gJ2xlZnQnIHx8IHBvaW50VHlwZSA9PT0gJ3JpZ2h0Jykge1xuICAgICAgLy8gQ2FsY3VsYXRlIGhvcml6b250YWwgZGlzdGFuY2VcbiAgICAgIGNvbnN0IGhvcml6b250YWxEaXN0ID0gZW5kWCAtIHN0YXJ0WDtcblxuICAgICAgLy8gSWYgdGhlIGVuZCBwb2ludCBpcyB2ZXJ5IGNsb3NlIGhvcml6b250YWxseSwgdXNlIGEgc2ltcGxlIDMtc2VnbWVudCBwYXRoXG4gICAgICBpZiAoTWF0aC5hYnMoaG9yaXpvbnRhbERpc3QpIDwgMzApIHtcbiAgICAgICAgY29uc3QgbWlkWSA9IChzdGFydFkgKyBlbmRZKSAvIDI7XG4gICAgICAgIHBhdGggPSBgTSAke3N0YXJ0WH0gJHtzdGFydFl9IEggJHtlbmRYfSBWICR7bWlkWX0gViAke2VuZFl9YDtcbiAgICAgIH1cbiAgICAgIC8vIE90aGVyd2lzZSwgY3JlYXRlIGEgcGF0aCB3aXRoIGhvcml6b250YWwgc2VnbWVudCBmaXJzdCwgdGhlbiB2ZXJ0aWNhbCwgdGhlbiBob3Jpem9udGFsXG4gICAgICBlbHNlIHtcbiAgICAgICAgcGF0aCA9IGBNICR7c3RhcnRYfSAke3N0YXJ0WX0gSCAke1xuICAgICAgICAgIHN0YXJ0WCArIGhvcml6b250YWxEaXN0IC8gMlxuICAgICAgICB9IFYgJHtlbmRZfSBIICR7ZW5kWH1gO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBGb3IgdG9wL2JvdHRvbSBwb2ludHMsIHN0YXJ0IHdpdGggdmVydGljYWwgbGluZVxuICAgIGVsc2UgaWYgKHBvaW50VHlwZSA9PT0gJ3RvcCcgfHwgcG9pbnRUeXBlID09PSAnYm90dG9tJykge1xuICAgICAgLy8gQ2FsY3VsYXRlIHZlcnRpY2FsIGRpc3RhbmNlXG4gICAgICBjb25zdCB2ZXJ0aWNhbERpc3QgPSBlbmRZIC0gc3RhcnRZO1xuXG4gICAgICAvLyBJZiB0aGUgZW5kIHBvaW50IGlzIHZlcnkgY2xvc2UgdmVydGljYWxseSwgdXNlIGEgc2ltcGxlIDMtc2VnbWVudCBwYXRoXG4gICAgICBpZiAoTWF0aC5hYnModmVydGljYWxEaXN0KSA8IDMwKSB7XG4gICAgICAgIGNvbnN0IG1pZFggPSAoc3RhcnRYICsgZW5kWCkgLyAyO1xuICAgICAgICBwYXRoID0gYE0gJHtzdGFydFh9ICR7c3RhcnRZfSBWICR7ZW5kWX0gSCAke21pZFh9IEggJHtlbmRYfWA7XG4gICAgICB9XG4gICAgICAvLyBPdGhlcndpc2UsIGNyZWF0ZSBhIHBhdGggd2l0aCB2ZXJ0aWNhbCBzZWdtZW50IGZpcnN0LCB0aGVuIGhvcml6b250YWwsIHRoZW4gdmVydGljYWxcbiAgICAgIGVsc2Uge1xuICAgICAgICBwYXRoID0gYE0gJHtzdGFydFh9ICR7c3RhcnRZfSBWICR7XG4gICAgICAgICAgc3RhcnRZICsgdmVydGljYWxEaXN0IC8gMlxuICAgICAgICB9IEggJHtlbmRYfSBWICR7ZW5kWX1gO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBwYXRoO1xuICB9XG5cbiAgb25TdGFnZVByb3BlcnRpZXNVcGRhdGVkKGV2ZW50OiB7XG4gICAgbm9kZUlkOiBzdHJpbmc7XG4gICAgc3RhZ2VEYXRhOiBQYXJ0aWFsPFdvcmtmbG93U3RhZ2U+O1xuICB9KTogdm9pZCB7XG4gICAgLy8gRmluZCB0aGUgbm9kZSBpbiB0aGUgc3dpbWxhbmVzXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnN0YXRlLnN3aW1sYW5lcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qgc3dpbWxhbmUgPSB0aGlzLnN0YXRlLnN3aW1sYW5lc1tpXTtcbiAgICAgIGNvbnN0IG5vZGVJbmRleCA9IHN3aW1sYW5lLm5vZGVzPy5maW5kSW5kZXgoKG4pID0+IG4uaWQgPT09IGV2ZW50Lm5vZGVJZCk7XG5cbiAgICAgIGlmIChub2RlSW5kZXggIT09IHVuZGVmaW5lZCAmJiBub2RlSW5kZXggPj0gMCkge1xuICAgICAgICAvLyBVcGRhdGUgdGhlIHN0YWdlIGRhdGFcbiAgICAgICAgaWYgKHN3aW1sYW5lLm5vZGVzKSB7XG4gICAgICAgICAgc3dpbWxhbmUubm9kZXNbbm9kZUluZGV4XS5zdGFnZURhdGEgPSB7XG4gICAgICAgICAgICAuLi5zd2ltbGFuZS5ub2Rlc1tub2RlSW5kZXhdLnN0YWdlRGF0YSxcbiAgICAgICAgICAgIC4uLmV2ZW50LnN0YWdlRGF0YSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgJ1VwZGF0ZWQgc3RhZ2UgZGF0YSBpbiBzd2ltbGFuZTonLFxuICAgICAgICAgICAgaSxcbiAgICAgICAgICAgICdub2RlOicsXG4gICAgICAgICAgICBub2RlSW5kZXgsXG4gICAgICAgICAgICAnZGF0YTonLFxuICAgICAgICAgICAgc3dpbWxhbmUubm9kZXNbbm9kZUluZGV4XS5zdGFnZURhdGFcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG9uQ29ubmVjdGlvbkNyZWF0ZWQoY29ubmVjdGlvbjogQ29ubmVjdGlvbik6IHZvaWQge1xuICAgIC8vIEFmdGVyIGEgY29ubmVjdGlvbiBpcyBjcmVhdGVkLCByZWZyZXNoIHRoZSBzb3VyY2Ugbm9kZSB0byB1cGRhdGUgaXRzIHN0YXRlXG4gICAgY29uc3Qgc291cmNlTm9kZUluZm8gPSB0aGlzLnN0YXRlLmZpbmROb2RlQnlJZChjb25uZWN0aW9uLnNvdXJjZU5vZGVJZCk7XG4gICAgaWYgKHNvdXJjZU5vZGVJbmZvICYmIHNvdXJjZU5vZGVJbmZvLm5vZGUudHlwZSA9PT0gJ3N0YWdlJykge1xuICAgICAgLy8gUmVmcmVzaCBub2RlIHN0YXRlXG4gICAgICB0aGlzLnVwZGF0ZU5vZGVDb25uZWN0aW9ucyhzb3VyY2VOb2RlSW5mby5ub2RlKTtcbiAgICB9XG4gIH1cblxuICAvLyBIZWxwZXIgbWV0aG9kIHRvIHVwZGF0ZSBub2RlJ3MgY29ubmVjdGlvbiBzdGF0dXNcbiAgdXBkYXRlTm9kZUNvbm5lY3Rpb25zKG5vZGU6IFdGTm9kZSk6IHZvaWQge1xuICAgIC8vIENvdW50IHRoZSBudW1iZXIgb2Ygb3V0Z29pbmcgY29ubmVjdGlvbnMgdGhhdCBjb25uZWN0IHRvIHN0YWdlc1xuICAgIGNvbnN0IG91dGdvaW5nQ29ubmVjdGlvbnMgPSB0aGlzLnN0YXRlLmNvbm5lY3Rpb25zLmZpbHRlcihcbiAgICAgIChjb25uKSA9PiBjb25uLnNvdXJjZU5vZGVJZCA9PT0gbm9kZS5pZFxuICAgICk7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgdGFyZ2V0IG5vZGVzIGFyZSBzdGFnZXNcbiAgICBjb25zdCBjb25uZWN0ZWRTdGFnZU5vZGVzID0gb3V0Z29pbmdDb25uZWN0aW9uc1xuICAgICAgLm1hcCgoY29ubikgPT4gdGhpcy5zdGF0ZS5maW5kTm9kZUJ5SWQoY29ubi50YXJnZXROb2RlSWQpKVxuICAgICAgLmZpbHRlcigobm9kZUluZm8pID0+IG5vZGVJbmZvICYmIG5vZGVJbmZvLm5vZGUudHlwZSA9PT0gJ3N0YWdlJyk7XG5cbiAgICBub2RlLmhhc011bHRpcGxlQ29ubmVjdGVkU3RhZ2VzID0gY29ubmVjdGVkU3RhZ2VOb2Rlcy5sZW5ndGggPiAxO1xuICB9XG5cbiAgb25FZGl0U3dpbWxhbmUoXG4gICAgZXZlbnQ6IE1vdXNlRXZlbnQsXG4gICAgc3dpbWxhbmU6IFN3aW1sYW5lSXRlbSxcbiAgICBzd2ltbGFuZUluZGV4OiBudW1iZXJcbiAgKTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IC8vIFByZXZlbnQgdGhlIGNhbnZhcyBjbGljayBldmVudCBmcm9tIGZpcmluZ1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgY29uc29sZS5sb2coJ0VkaXQgc3dpbWxhbmUgYnV0dG9uIGNsaWNrZWQgZm9yIHN3aW1sYW5lOicsIHN3aW1sYW5lSW5kZXgpO1xuXG4gICAgLy8gRW1pdCBhIHNwZWNpYWwgZXZlbnQgZm9yIGVkaXRpbmcgYSBzd2ltbGFuZVxuICAgIHRoaXMuY2xpY2tlZFBvc2l0aW9uLmVtaXQoe1xuICAgICAgeDogLTEsIC8vIFNwZWNpYWwgdmFsdWUgdG8gaW5kaWNhdGUgZWRpdCBtb2RlXG4gICAgICB5OiBzd2ltbGFuZUluZGV4LFxuICAgIH0pO1xuICB9XG5cbiAgLy8gc2hvd1N0YXJ0Tm9kZUZvcm1Qb3B1cChldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAvLyAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIC8vICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgLy8gICAvLyBJbXBsZW1lbnRhdGlvbiB3aWxsIGJlIHNpbWlsYXIgdG8gdGhlIHN0YWdlIGZvcm0gcG9wdXBcbiAgLy8gICAvLyBXZSdsbCBuZWVkIHRvIGFkZCBVSSBlbGVtZW50cyBmb3IgdGhpc1xuICAvLyAgIGNvbnNvbGUubG9nKCdTdGFydCBub2RlIGZvcm0gcG9wdXAgcmVxdWVzdGVkJyk7XG5cbiAgLy8gICAvLyBGb3Igbm93LCB0aGlzIGlzIGEgcGxhY2Vob2xkZXJcbiAgLy8gICAvLyBUaGUgYWN0dWFsIGltcGxlbWVudGF0aW9uIHdvdWxkIGxvYWQgZm9ybXMgYW5kIGFkZCB0aGVtIHRvIHRoZSB3b3JrZmxvd1xuICAvLyB9XG5cbiAgdG9nZ2xlU3RhcnROb2RlRm9ybVBvcHVwKFxuICAgIGV2ZW50OiBNb3VzZUV2ZW50LFxuICAgIG5vZGVYOiBudW1iZXIsXG4gICAgbm9kZVk6IG51bWJlcixcbiAgICBzd2ltbGFuZUluZGV4OiBudW1iZXJcbiAgKTogdm9pZCB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgIC8vIFNldCBwb3B1cCBwb3NpdGlvblxuICAgIGNvbnN0IHN3aW1sYW5lT2Zmc2V0ID0gc3dpbWxhbmVJbmRleCAqIDI2MyArIDQwO1xuICAgIHRoaXMuc3RhcnROb2RlRm9ybVBvcHVwWCA9IG5vZGVYIC0gMzA7IC8vIFBvc2l0aW9uIG5lYXIgdGhlIHN0YXJ0IG5vZGVcbiAgICB0aGlzLnN0YXJ0Tm9kZUZvcm1Qb3B1cFkgPSBub2RlWSArIHN3aW1sYW5lT2Zmc2V0O1xuXG4gICAgLy8gSWYgd2UncmUgb3BlbmluZyB0aGUgcG9wdXAsIGxvYWQgZm9ybXNcbiAgICBpZiAoIXRoaXMuc2hvd1N0YXJ0Tm9kZUZvcm1Qb3B1cCkge1xuICAgICAgdGhpcy5pc0xvYWRpbmdTdGFydE5vZGVGb3JtcyA9IHRydWU7XG4gICAgICB0aGlzLmRhdGFTZXJ2aWNlXG4gICAgICAgIC5nZXRGb3JtcygpXG4gICAgICAgIC50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgIHRoaXMuc3RhcnROb2RlRm9ybXNMaXN0ID0gcmVzcG9uc2UuUmVzdWx0O1xuICAgICAgICAgIHRoaXMuaXNMb2FkaW5nU3RhcnROb2RlRm9ybXMgPSBmYWxzZTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGxvYWRpbmcgZm9ybXM6JywgZXJyb3IpO1xuICAgICAgICAgIHRoaXMuaXNMb2FkaW5nU3RhcnROb2RlRm9ybXMgPSBmYWxzZTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5zaG93U3RhcnROb2RlRm9ybVBvcHVwID0gIXRoaXMuc2hvd1N0YXJ0Tm9kZUZvcm1Qb3B1cDtcbiAgfVxuXG4gIHNlbGVjdFN0YXJ0Tm9kZUZvcm0oZm9ybTogRm9ybUVudGl0eSB8IG51bGwpOiB2b2lkIHtcbiAgICBpZiAoZm9ybSkge1xuICAgICAgdGhpcy5zdGF0ZS5zZXRXb3JrZmxvd0Zvcm0oZm9ybS5JZCwgZm9ybS5OYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zdGF0ZS5zZXRXb3JrZmxvd0Zvcm0obnVsbCwgbnVsbCk7XG4gICAgfVxuXG4gICAgLy8gQ2xvc2UgdGhlIHBvcHVwXG4gICAgdGhpcy5zaG93U3RhcnROb2RlRm9ybVBvcHVwID0gZmFsc2U7XG4gIH1cblxuICBzaG93U3ViZmxvd1NlbGVjdGlvblBvcHVwKHg6IG51bWJlciwgeTogbnVtYmVyLCBzd2ltbGFuZUluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnN1YmZsb3dQb3B1cFggPSB4O1xuICAgIHRoaXMuc3ViZmxvd1BvcHVwWSA9IHk7XG4gICAgdGhpcy5wZW5kaW5nU3ViZmxvd1Bvc2l0aW9uID0geyBzd2ltbGFuZUluZGV4LCB4LCB5IH07XG5cbiAgICAvLyBTdG9yZSBjb25uZWN0aW9uIGRhdGEgaWYgd2UncmUgY3JlYXRpbmcgZnJvbSBhIGNvbm5lY3Rpb25cbiAgICBpZiAodGhpcy5zdGF0ZS5pc0Nvbm5lY3Rpb25EcmFnZ2luZygpKSB7XG4gICAgICAvLyBTdG9yZSB0aGUgc291cmNlIGNvbm5lY3Rpb24gZGF0YVxuICAgICAgdGhpcy5wZW5kaW5nQ29ubmVjdGlvblNvdXJjZVBvaW50ID1cbiAgICAgICAgdGhpcy5zdGF0ZS5kcmFnZ2luZ0Nvbm5lY3Rpb25EYXRhLnNvdXJjZVBvaW50ID8/IG51bGw7XG4gICAgICB0aGlzLnBlbmRpbmdDb25uZWN0aW9uU291cmNlU3dpbWxhbmVJbmRleCA9XG4gICAgICAgIHRoaXMuc3RhdGUuZHJhZ2dpbmdDb25uZWN0aW9uRGF0YS5zb3VyY2VTd2ltbGFuZUluZGV4ID8/IG51bGw7XG4gICAgICBjb25zb2xlLmxvZygnU3RvcmVkIGNvbm5lY3Rpb24gZGF0YSBmb3Igc3ViZmxvdzonLCB7XG4gICAgICAgIHNvdXJjZVBvaW50OiB0aGlzLnBlbmRpbmdDb25uZWN0aW9uU291cmNlUG9pbnQsXG4gICAgICAgIHNvdXJjZVN3aW1sYW5lSW5kZXg6IHRoaXMucGVuZGluZ0Nvbm5lY3Rpb25Tb3VyY2VTd2ltbGFuZUluZGV4LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gTG9hZCB3b3JrZmxvd3NcbiAgICB0aGlzLmlzTG9hZGluZ1dvcmtmbG93cyA9IHRydWU7XG4gICAgdGhpcy5kYXRhU2VydmljZVxuICAgICAgLmdldFdvcmtmbG93cygpXG4gICAgICAudGhlbigocmVzcG9uc2UpID0+IHtcbiAgICAgICAgdGhpcy53b3JrZmxvd3NMaXN0ID0gcmVzcG9uc2UuUmVzdWx0O1xuICAgICAgICB0aGlzLmlzTG9hZGluZ1dvcmtmbG93cyA9IGZhbHNlO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgbG9hZGluZyB3b3JrZmxvd3M6JywgZXJyb3IpO1xuICAgICAgICB0aGlzLmlzTG9hZGluZ1dvcmtmbG93cyA9IGZhbHNlO1xuICAgICAgfSk7XG5cbiAgICB0aGlzLnNob3dTdWJmbG93UG9wdXAgPSB0cnVlO1xuICB9XG5cbiAgc2VsZWN0U3ViZmxvd1dvcmtmbG93KHdvcmtmbG93OiBXb3JrZmxvdyk6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKCdTZWxlY3Rpbmcgd29ya2Zsb3cgZm9yIHN1YmZsb3c6Jywgd29ya2Zsb3cuTmFtZSk7XG4gICAgY29uc29sZS5sb2coJ1BlbmRpbmcgY29ubmVjdGlvbiBkYXRhOicsIHtcbiAgICAgIHNvdXJjZVBvaW50OiB0aGlzLnBlbmRpbmdDb25uZWN0aW9uU291cmNlUG9pbnQsXG4gICAgICBzb3VyY2VTd2ltbGFuZUluZGV4OiB0aGlzLnBlbmRpbmdDb25uZWN0aW9uU291cmNlU3dpbWxhbmVJbmRleCxcbiAgICAgIHBvc2l0aW9uOiB0aGlzLnBlbmRpbmdTdWJmbG93UG9zaXRpb24sXG4gICAgfSk7XG5cbiAgICBpZiAodGhpcy5wZW5kaW5nU3ViZmxvd1Bvc2l0aW9uKSB7XG4gICAgICBjb25zdCB7IHN3aW1sYW5lSW5kZXgsIHgsIHkgfSA9IHRoaXMucGVuZGluZ1N1YmZsb3dQb3NpdGlvbjtcblxuICAgICAgLy8gQ3JlYXRlIHRoZSBzdWJmbG93IG5vZGUgd2l0aCB0aGUgc2VsZWN0ZWQgd29ya2Zsb3cgZGF0YVxuICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhdGUuYWRkTm9kZShcbiAgICAgICAgc3dpbWxhbmVJbmRleCxcbiAgICAgICAgJ3N1YmZsb3cnLFxuICAgICAgICB4LFxuICAgICAgICB5LFxuICAgICAgICB1bmRlZmluZWQsIC8vIE5vIHN0YWdlIGRhdGFcbiAgICAgICAgeyBpZDogd29ya2Zsb3cuSWQsIG5hbWU6IHdvcmtmbG93Lk5hbWUgfVxuICAgICAgKTtcblxuICAgICAgY29uc29sZS5sb2coJ0NyZWF0ZWQgc3ViZmxvdyBub2RlOicsIG5vZGUpO1xuXG4gICAgICAvLyBJZiB0aGlzIHdhcyBjcmVhdGVkIGZyb20gYSBjb25uZWN0aW9uLCBjcmVhdGUgdGhlIGNvbm5lY3Rpb25cbiAgICAgIGlmIChub2RlICYmIHRoaXMucGVuZGluZ0Nvbm5lY3Rpb25Tb3VyY2VQb2ludCkge1xuICAgICAgICBjb25zb2xlLmxvZygnQ3JlYXRpbmcgY29ubmVjdGlvbiB0byBuZXcgc3ViZmxvdyBub2RlJyk7XG5cbiAgICAgICAgLy8gRmluZCBhIHN1aXRhYmxlIGNvbm5lY3Rpb24gcG9pbnQgb24gdGhlIG5ldyBub2RlXG4gICAgICAgIGlmIChub2RlLmNvbm5lY3Rpb25Qb2ludHMgJiYgbm9kZS5jb25uZWN0aW9uUG9pbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCBzb3VyY2VQb2ludCA9IHRoaXMucGVuZGluZ0Nvbm5lY3Rpb25Tb3VyY2VQb2ludDtcblxuICAgICAgICAgIC8vIEZpbmQgb3Bwb3NpbmcgdHlwZSBjb25uZWN0aW9uIHBvaW50XG4gICAgICAgICAgY29uc3Qgb3Bwb3NpbmdUeXBlID0ge1xuICAgICAgICAgICAgcmlnaHQ6ICdsZWZ0JyxcbiAgICAgICAgICAgIGxlZnQ6ICdyaWdodCcsXG4gICAgICAgICAgICB0b3A6ICdib3R0b20nLFxuICAgICAgICAgICAgYm90dG9tOiAndG9wJyxcbiAgICAgICAgICB9W3NvdXJjZVBvaW50LnR5cGVdIGFzICd0b3AnIHwgJ3JpZ2h0JyB8ICdib3R0b20nIHwgJ2xlZnQnO1xuXG4gICAgICAgICAgY29uc3QgdGFyZ2V0UG9pbnQgPSBub2RlLmNvbm5lY3Rpb25Qb2ludHMuZmluZChcbiAgICAgICAgICAgIChwKSA9PiBwLnR5cGUgPT09IG9wcG9zaW5nVHlwZVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAodGFyZ2V0UG9pbnQpIHtcbiAgICAgICAgICAgIC8vIENyZWF0ZSBjb25uZWN0aW9uXG4gICAgICAgICAgICBjb25zdCBjb25uZWN0aW9uID0ge1xuICAgICAgICAgICAgICBpZDogYGNvbm4tJHtEYXRlLm5vdygpfS0ke01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDEwMDApfWAsXG4gICAgICAgICAgICAgIHNvdXJjZU5vZGVJZDogc291cmNlUG9pbnQubm9kZUlkLFxuICAgICAgICAgICAgICB0YXJnZXROb2RlSWQ6IG5vZGUuaWQsXG4gICAgICAgICAgICAgIHNvdXJjZVBvaW50SWQ6IHNvdXJjZVBvaW50LmlkLFxuICAgICAgICAgICAgICB0YXJnZXRQb2ludElkOiB0YXJnZXRQb2ludC5pZCxcbiAgICAgICAgICAgICAgc291cmNlU3dpbWxhbmVJbmRleDogdGhpcy5wZW5kaW5nQ29ubmVjdGlvblNvdXJjZVN3aW1sYW5lSW5kZXghLFxuICAgICAgICAgICAgICB0YXJnZXRTd2ltbGFuZUluZGV4OiBzd2ltbGFuZUluZGV4LFxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgLy8gQWRkIGNvbm5lY3Rpb24gZGlyZWN0bHkgdG8gdGhlIHN0YXRlJ3MgY29ubmVjdGlvbnMgYXJyYXlcbiAgICAgICAgICAgIHRoaXMuc3RhdGUuY29ubmVjdGlvbnMucHVzaChjb25uZWN0aW9uKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdBZGRlZCBjb25uZWN0aW9uIHRvIHN0YXRlOicsIGNvbm5lY3Rpb24pO1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ0Nvbm5lY3Rpb25zIGFmdGVyIGFkZGluZzonLCB0aGlzLnN0YXRlLmNvbm5lY3Rpb25zKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zdGF0ZS5lbmRDb25uZWN0aW9uRHJhZygpO1xuICAgICAgfVxuXG4gICAgICAvLyBSZXNldCBzZWxlY3Rpb24gdG9vbCBpbiBwYXJlbnQgY29tcG9uZW50XG4gICAgICB0aGlzLnN1YmZsb3dTZWxlY3RlZC5lbWl0KCk7XG4gICAgfVxuXG4gICAgLy8gQ2xlYW4gdXBcbiAgICB0aGlzLnNob3dTdWJmbG93UG9wdXAgPSBmYWxzZTtcbiAgICB0aGlzLnBlbmRpbmdTdWJmbG93UG9zaXRpb24gPSBudWxsO1xuICAgIHRoaXMucGVuZGluZ0Nvbm5lY3Rpb25Tb3VyY2VQb2ludCA9IG51bGw7XG4gICAgdGhpcy5wZW5kaW5nQ29ubmVjdGlvblNvdXJjZVN3aW1sYW5lSW5kZXggPSBudWxsO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiY2FudmFzLWNvbnRhaW5lclwiPlxuICA8c3ZnXG4gICAgI2NhbnZhc1xuICAgIFthdHRyLndpZHRoXT1cImNhbnZhc1dpZHRoXCJcbiAgICBbYXR0ci5oZWlnaHRdPVwiY2FudmFzSGVpZ2h0XCJcbiAgICBjbGFzcz1cImRlc2lnbmVyLWNhbnZhc1wiXG4gICAgKGNsaWNrKT1cIm9uQ2FudmFzQ2xpY2soJGV2ZW50KVwiXG4gID5cbiAgICA8ZGVmcz5cbiAgICAgIDwhLS0gR3JpZCBwYXR0ZXJuIGRlZmluaXRpb24gLS0+XG5cbiAgICAgIDxwYXR0ZXJuXG4gICAgICAgIGlkPVwiZ3JpZFwiXG4gICAgICAgIFthdHRyLndpZHRoXT1cImdyaWRTaXplXCJcbiAgICAgICAgW2F0dHIuaGVpZ2h0XT1cImdyaWRTaXplXCJcbiAgICAgICAgcGF0dGVyblVuaXRzPVwidXNlclNwYWNlT25Vc2VcIlxuICAgICAgPlxuICAgICAgICA8cGF0aFxuICAgICAgICAgIGQ9XCJNIDIwIDAgTCAwIDAgMCAyMFwiXG4gICAgICAgICAgZmlsbD1cIm5vbmVcIlxuICAgICAgICAgIHN0cm9rZT1cIiNlMmU4ZjBcIlxuICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjAuNVwiXG4gICAgICAgIC8+XG4gICAgICA8L3BhdHRlcm4+XG5cbiAgICAgIDwhLS0gQXJyb3cgaGVhZCBtYXJrZXIgZGVmaW5pdGlvbiAtLT5cbiAgICAgIDxtYXJrZXJcbiAgICAgICAgaWQ9XCJhcnJvd2hlYWRcIlxuICAgICAgICBtYXJrZXJXaWR0aD1cIjEwXCJcbiAgICAgICAgbWFya2VySGVpZ2h0PVwiN1wiXG4gICAgICAgIHJlZlg9XCI5XCJcbiAgICAgICAgcmVmWT1cIjMuNVwiXG4gICAgICAgIG9yaWVudD1cImF1dG9cIlxuICAgICAgPlxuICAgICAgICA8cG9seWdvbiBwb2ludHM9XCIwIDAsIDEwIDMuNSwgMCA3XCIgZmlsbD1cIiNEMzZDRkZcIiAvPlxuICAgICAgPC9tYXJrZXI+XG5cbiAgICAgIDwhLS0gQ29ubmVjdGlvbiBwb2ludCBzdHlsZXMgLS0+XG4gICAgICA8Y2lyY2xlXG4gICAgICAgIGlkPVwiY29ubmVjdGlvbi1wb2ludC10ZW1wbGF0ZVwiXG4gICAgICAgIHI9XCI1XCJcbiAgICAgICAgZmlsbD1cIiNEMzZDRkZcIlxuICAgICAgICBzdHJva2U9XCIjRkZGRkZGXCJcbiAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMVwiXG4gICAgICAvPlxuXG4gICAgICA8IS0tIERhc2hlZCBsaW5lIHN0eWxlIGZvciBjb25uZWN0aW9uIHByZXZpZXcgLS0+XG4gICAgICA8cGF0dGVyblxuICAgICAgICBpZD1cImRhc2hlZC1saW5lXCJcbiAgICAgICAgd2lkdGg9XCIxMFwiXG4gICAgICAgIGhlaWdodD1cIjEwXCJcbiAgICAgICAgcGF0dGVyblVuaXRzPVwidXNlclNwYWNlT25Vc2VcIlxuICAgICAgPlxuICAgICAgICA8bGluZVxuICAgICAgICAgIHgxPVwiMFwiXG4gICAgICAgICAgeTE9XCI1XCJcbiAgICAgICAgICB4Mj1cIjEwXCJcbiAgICAgICAgICB5Mj1cIjVcIlxuICAgICAgICAgIHN0cm9rZT1cIiNEMzZDRkZcIlxuICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjJcIlxuICAgICAgICAgIHN0cm9rZS1kYXNoYXJyYXk9XCI1LDVcIlxuICAgICAgICAvPlxuICAgICAgPC9wYXR0ZXJuPlxuICAgIDwvZGVmcz5cblxuICAgIDwhLS0gQmFja2dyb3VuZCBncmlkIC0tPlxuICAgIDxyZWN0IHdpZHRoPVwiMTAwJVwiIGhlaWdodD1cIjEwMCVcIiBmaWxsPVwidXJsKCNncmlkKVwiIC8+XG5cbiAgICA8IS0tIERpc3BsYXkgYSBtZXNzYWdlIHdoZW4gbm8gc3dpbWxhbmVzIGV4aXN0IC0tPlxuICAgIEBpZiAoc3RhdGUuc3dpbWxhbmVzLmxlbmd0aCA9PT0gMCkge1xuICAgIDx0ZXh0XG4gICAgICB4PVwiNTAlXCJcbiAgICAgIHk9XCI1MCVcIlxuICAgICAgZm9udC1mYW1pbHk9XCJzYW5zLXNlcmlmXCJcbiAgICAgIGZvbnQtc2l6ZT1cIjE2XCJcbiAgICAgIGZpbGw9XCIjOTRhM2I4XCJcbiAgICAgIHRleHQtYW5jaG9yPVwibWlkZGxlXCJcbiAgICA+XG4gICAgICBTZWxlY3QgdGhlIFN3aW1sYW5lIHRvb2wgYW5kIGNsaWNrIG9uIHRoZSBjYW52YXMgdG8gYWRkIGEgc3dpbWxhbmVcbiAgICA8L3RleHQ+XG4gICAgfVxuXG4gICAgPCEtLSBUaGlzIGlzIHdoZXJlIHdvcmtmbG93IGVsZW1lbnRzIHdpbGwgYmUgYWRkZWQgbGF0ZXIgLS0+XG4gICAgQGZvciAoc3dpbWxhbmUgb2Ygc3RhdGUuc3dpbWxhbmVzOyB0cmFjayBzd2ltbGFuZS5vcmRlcikge1xuICAgIDxnIFthdHRyLnRyYW5zZm9ybV09XCIndHJhbnNsYXRlKDAsJyArIHN3aW1sYW5lLm9yZGVyICogMjYzICsgJyknXCI+XG4gICAgICA8IS0tIFN3aW1sYW5lIGNvbnRhaW5lciAtLT5cbiAgICAgIDxyZWN0XG4gICAgICAgIHg9XCIwXCJcbiAgICAgICAgeT1cIjBcIlxuICAgICAgICBbYXR0ci53aWR0aF09XCJjYW52YXNXaWR0aFwiXG4gICAgICAgIFthdHRyLmhlaWdodF09XCIyNjNcIlxuICAgICAgICBmaWxsPVwiI2ZmZmZmZlwiXG4gICAgICAgIHN0cm9rZT1cIiNlMmU4ZjBcIlxuICAgICAgICBzdHJva2Utd2lkdGg9XCIxXCJcbiAgICAgID48L3JlY3Q+XG5cbiAgICAgIDwhLS0gU3dpbWxhbmUgaGVhZGVyIC0tPlxuICAgICAgPHJlY3RcbiAgICAgICAgeD1cIjBcIlxuICAgICAgICB5PVwiMFwiXG4gICAgICAgIFthdHRyLndpZHRoXT1cImNhbnZhc1dpZHRoXCJcbiAgICAgICAgaGVpZ2h0PVwiNDBcIlxuICAgICAgICBmaWxsPVwiI2Y4ZmFmY1wiXG4gICAgICAgIHN0cm9rZT1cIiNlMmU4ZjBcIlxuICAgICAgICBzdHJva2Utd2lkdGg9XCIxXCJcbiAgICAgID48L3JlY3Q+XG5cbiAgICAgIDwhLS0gU3dpbWxhbmUgbGFiZWwgLS0+XG4gICAgICA8dGV4dFxuICAgICAgICB4PVwiMjBcIlxuICAgICAgICB5PVwiMjVcIlxuICAgICAgICBmb250LWZhbWlseT1cInNhbnMtc2VyaWZcIlxuICAgICAgICBmb250LXNpemU9XCIxNFwiXG4gICAgICAgIGZpbGw9XCIjMzMzMzMzXCJcbiAgICAgICAgZm9udC13ZWlnaHQ9XCJib2xkXCJcbiAgICAgID5cbiAgICAgICAge3sgc3dpbWxhbmUubGFiZWwgfX1cbiAgICAgIDwvdGV4dD5cblxuICAgICAgPCEtLSBFZGl0IGJ1dHRvbiAtLT5cbiAgICAgIDxnXG4gICAgICAgIGNsYXNzPVwiZWRpdC1zd2ltbGFuZS1idXR0b25cIlxuICAgICAgICBbYXR0ci50cmFuc2Zvcm1dPVwiJ3RyYW5zbGF0ZSgxMDAsIDIwKSdcIlxuICAgICAgICAoY2xpY2spPVwiXG4gICAgICAgICAgb25FZGl0U3dpbWxhbmUoJGV2ZW50LCBzd2ltbGFuZSwgc3dpbWxhbmUub3JkZXIpO1xuICAgICAgICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVxuICAgICAgICBcIlxuICAgICAgPlxuICAgICAgICA8cmVjdFxuICAgICAgICAgIHg9XCItNVwiXG4gICAgICAgICAgeT1cIi0xNVwiXG4gICAgICAgICAgd2lkdGg9XCI0MFwiXG4gICAgICAgICAgaGVpZ2h0PVwiMjBcIlxuICAgICAgICAgIGZpbGw9XCIjZjNlOGZmXCJcbiAgICAgICAgICByeD1cIjNcIlxuICAgICAgICAgIHJ5PVwiM1wiXG4gICAgICAgICAgc3Ryb2tlPVwiI2Q4YjRmZVwiXG4gICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMVwiXG4gICAgICAgID48L3JlY3Q+XG4gICAgICAgIDx0ZXh0XG4gICAgICAgICAgeD1cIjE1XCJcbiAgICAgICAgICB5PVwiMFwiXG4gICAgICAgICAgZm9udC1mYW1pbHk9XCJzYW5zLXNlcmlmXCJcbiAgICAgICAgICBmb250LXNpemU9XCIxMlwiXG4gICAgICAgICAgZmlsbD1cIiM3ZTIyY2VcIlxuICAgICAgICAgIHRleHQtYW5jaG9yPVwibWlkZGxlXCJcbiAgICAgICAgPlxuICAgICAgICAgIEVkaXRcbiAgICAgICAgPC90ZXh0PlxuICAgICAgPC9nPlxuXG4gICAgICA8IS0tIFRhZyBpbmRpY2F0b3JzIC0tPlxuICAgICAgPGcgW2F0dHIudHJhbnNmb3JtXT1cIid0cmFuc2xhdGUoMjAwLCAyMCknXCI+XG4gICAgICAgIEBmb3IgKHRhZyBvZiBzd2ltbGFuZS50YWdzLnNsaWNlKDAsIDMpOyB0cmFjayB0YWcuTmFtZTsgbGV0IGkgPSAkaW5kZXgpXG4gICAgICAgIHtcbiAgICAgICAgPHRleHRcbiAgICAgICAgICBbYXR0ci54XT1cImkgKiAxMDBcIlxuICAgICAgICAgIHk9XCI1XCJcbiAgICAgICAgICBmb250LWZhbWlseT1cInNhbnMtc2VyaWZcIlxuICAgICAgICAgIGZvbnQtc2l6ZT1cIjEyXCJcbiAgICAgICAgICBmaWxsPVwiIzY2NjY2NlwiXG4gICAgICAgID5cbiAgICAgICAgICB7eyB0YWcuTmFtZSB9fVxuICAgICAgICA8L3RleHQ+XG4gICAgICAgIH0gQGlmIChzd2ltbGFuZS50YWdzLmxlbmd0aCA+IDMpIHtcbiAgICAgICAgPHRleHRcbiAgICAgICAgICBbYXR0ci54XT1cIjMgKiAxMDAgKyAxMFwiXG4gICAgICAgICAgeT1cIjVcIlxuICAgICAgICAgIGZvbnQtZmFtaWx5PVwic2Fucy1zZXJpZlwiXG4gICAgICAgICAgZm9udC1zaXplPVwiMTJcIlxuICAgICAgICAgIGZpbGw9XCIjNjY2NjY2XCJcbiAgICAgICAgPlxuICAgICAgICAgICt7eyBzd2ltbGFuZS50YWdzLmxlbmd0aCAtIDMgfX0gbW9yZVxuICAgICAgICA8L3RleHQ+XG4gICAgICAgIH1cbiAgICAgIDwvZz5cblxuICAgICAgPCEtLSBSZW5kZXIgbm9kZXMgaW4gdGhpcyBzd2ltbGFuZSAtLT5cbiAgICAgIEBmb3IgKG5vZGUgb2Ygc3dpbWxhbmUubm9kZXM7IHRyYWNrIG5vZGUuaWQpIHtcbiAgICAgIDxnXG4gICAgICAgIFthdHRyLnRyYW5zZm9ybV09XCIndHJhbnNsYXRlKCcgKyBub2RlLnggKyAnLCcgKyAobm9kZS55ICsgNDApICsgJyknXCJcbiAgICAgICAgKG1vdXNlZW50ZXIpPVwic2hvd0Nvbm5lY3Rpb25Qb2ludHMobm9kZS5pZCwgc3dpbWxhbmUub3JkZXIpXCJcbiAgICAgICAgKG1vdXNlbGVhdmUpPVwiaGlkZUNvbm5lY3Rpb25Qb2ludHMobm9kZS5pZClcIlxuICAgICAgPlxuICAgICAgICA8IS0tIFN0YXJ0IG5vZGUgaW5kaWNhdG9yIChjaXJjbGUgYW5kIGFycm93KSBmb3IgdGhlIGZpcnN0IG5vZGUgLS0+XG4gICAgICAgIEBpZiAobm9kZS5pc1N0YXJ0Tm9kZSkge1xuICAgICAgICA8IS0tIENpcmNsZSAtLT5cbiAgICAgICAgPGNpcmNsZVxuICAgICAgICAgIGN4PVwiLTMwXCJcbiAgICAgICAgICBjeT1cIjUwXCJcbiAgICAgICAgICByPVwiMTVcIlxuICAgICAgICAgIGZpbGw9XCJub25lXCJcbiAgICAgICAgICBzdHJva2U9XCIjRDM2Q0ZGXCJcbiAgICAgICAgICBzdHJva2Utd2lkdGg9XCIxXCJcbiAgICAgICAgPjwvY2lyY2xlPlxuICAgICAgICA8IS0tIEZvcm0gaWNvbiBmb3Igc3RhcnQgbm9kZSAtLT5cbiAgICAgICAgPHN2ZzpnXG4gICAgICAgICAgKGNsaWNrKT1cIlxuICAgICAgICAgICAgdG9nZ2xlU3RhcnROb2RlRm9ybVBvcHVwKCRldmVudCwgbm9kZS54LCBub2RlLnksIHN3aW1sYW5lLm9yZGVyKVxuICAgICAgICAgIFwiXG4gICAgICAgICAgY2xhc3M9XCJzdGFnZS1pY29uXCJcbiAgICAgICAgICB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoLTQ1LCA0MilcIlxuICAgICAgICAgIHN0eWxlPVwiY3Vyc29yOiBwb2ludGVyOyBwb2ludGVyLWV2ZW50czogYWxsXCJcbiAgICAgICAgPlxuICAgICAgICAgIDwhLS0gVHJhbnNwYXJlbnQgcmVjdGFuZ2xlIHRvIGNhcHR1cmUgY2xpY2tzIC0tPlxuICAgICAgICAgIDxzdmc6cmVjdFxuICAgICAgICAgICAgeD1cIi0yXCJcbiAgICAgICAgICAgIHk9XCItMlwiXG4gICAgICAgICAgICB3aWR0aD1cIjI0XCJcbiAgICAgICAgICAgIGhlaWdodD1cIjI0XCJcbiAgICAgICAgICAgIGZpbGw9XCJ0cmFuc3BhcmVudFwiXG4gICAgICAgICAgICBzdHlsZT1cImN1cnNvcjogcG9pbnRlclwiXG4gICAgICAgICAgLz5cbiAgICAgICAgICA8c3ZnOnBhdGhcbiAgICAgICAgICAgIGQ9XCJNMTYuNSAyMC40NzVWMTcuNDc1SDEzLjVWMTYuNDc1SDE2LjVWMTMuNDc1SDE3LjVWMTYuNDc1SDIwLjVWMTcuNDc1SDE3LjVWMjAuNDc1SDE2LjVaTTMuNSAxNy41VjE2LjVINC41VjE3LjVIMy41Wk02LjUgMTcuNVYxNi41SDExLjUxN0MxMS41MDU3IDE2LjY3NjcgMTEuNTA0MyAxNi44NDUgMTEuNTEzIDE3LjAwNUMxMS41MjEgMTcuMTY1IDExLjUzMSAxNy4zMyAxMS41NDMgMTcuNUg2LjVaTTMuNSAxMy41VjEyLjVINC41VjEzLjVIMy41Wk02LjUgMTMuNVYxMi41SDEzLjgwNEMxMy42MTI3IDEyLjYzODcgMTMuNDMzMyAxMi43OTEzIDEzLjI2NiAxMi45NThDMTMuMDk5MyAxMy4xMjQ3IDEyLjkzNzcgMTMuMzA1MyAxMi43ODEgMTMuNUg2LjVaTTMuNSA5LjVWOC41SDQuNVY5LjVIMy41Wk02LjUgOS41VjguNUgxOC41VjkuNUg2LjVaTTMuNSA1LjVWNC41SDQuNVY1LjVIMy41Wk02LjUgNS41VjQuNUgxOC41VjUuNUg2LjVaXCJcbiAgICAgICAgICAgIFthdHRyLmZpbGxdPVwic3RhdGUud29ya2Zsb3dGb3JtSWQgPyAnI0QzNkNGRicgOiAnYmxhY2snXCJcbiAgICAgICAgICAgIHRyYW5zZm9ybT1cInNjYWxlKDAuNylcIlxuICAgICAgICAgIC8+XG4gICAgICAgIDwvc3ZnOmc+XG4gICAgICAgIDwhLS0gQXJyb3cgZnJvbSBjaXJjbGUgdG8gbm9kZSAtLT5cbiAgICAgICAgPHBhdGhcbiAgICAgICAgICBkPVwiTSAtMjAgNTAgTCAwIDUwXCJcbiAgICAgICAgICBzdHJva2U9XCIjRDM2Q0ZGXCJcbiAgICAgICAgICBzdHJva2Utd2lkdGg9XCIxXCJcbiAgICAgICAgICBtYXJrZXItZW5kPVwidXJsKCNhcnJvd2hlYWQpXCJcbiAgICAgICAgPjwvcGF0aD5cbiAgICAgICAgfVxuXG4gICAgICAgIDwhLS0gU3RhZ2Ugbm9kZSAtLT5cbiAgICAgICAgQGlmIChub2RlLnR5cGUgPT09ICdzdGFnZScpIHtcbiAgICAgICAgPCEtLSA8cmVjdFxuICAgICAgICAgIHg9XCIwXCJcbiAgICAgICAgICB5PVwiMFwiXG4gICAgICAgICAgW2F0dHIud2lkdGhdPVwibm9kZS53aWR0aFwiXG4gICAgICAgICAgW2F0dHIuaGVpZ2h0XT1cIm5vZGUuaGVpZ2h0XCJcbiAgICAgICAgICBmaWxsPVwibm9uZVwiXG4gICAgICAgICAgc3Ryb2tlPVwiI0QzNkNGRlwiXG4gICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMVwiXG4gICAgICAgID48L3JlY3Q+IC0tPlxuICAgICAgICA8c3ZnOmdcbiAgICAgICAgICBsaWItc3RhZ2Utbm9kZVxuICAgICAgICAgIFtub2RlXT1cIm5vZGVcIlxuICAgICAgICAgIFtpc1N0YXJ0Tm9kZV09XCJub2RlLmlzU3RhcnROb2RlXCJcbiAgICAgICAgICAoc3RhZ2VQcm9wZXJ0aWVzVXBkYXRlZCk9XCJvblN0YWdlUHJvcGVydGllc1VwZGF0ZWQoJGV2ZW50KVwiXG4gICAgICAgID48L3N2ZzpnPlxuICAgICAgICB9XG5cbiAgICAgICAgPCEtLSBEZWNpc2lvbiBub2RlIC0tPlxuICAgICAgICBAaWYgKG5vZGUudHlwZSA9PT0gJ2RlY2lzaW9uJykge1xuICAgICAgICA8cGF0aFxuICAgICAgICAgIFthdHRyLmRdPVwiXG4gICAgICAgICAgICAnTSAwICcgK1xuICAgICAgICAgICAgbm9kZS5oZWlnaHQgLyAyICtcbiAgICAgICAgICAgICcgTCAnICtcbiAgICAgICAgICAgIG5vZGUud2lkdGggLyAyICtcbiAgICAgICAgICAgICcgMCcgK1xuICAgICAgICAgICAgJyBMICcgK1xuICAgICAgICAgICAgbm9kZS53aWR0aCArXG4gICAgICAgICAgICAnICcgK1xuICAgICAgICAgICAgbm9kZS5oZWlnaHQgLyAyICtcbiAgICAgICAgICAgICcgTCAnICtcbiAgICAgICAgICAgIG5vZGUud2lkdGggLyAyICtcbiAgICAgICAgICAgICcgJyArXG4gICAgICAgICAgICBub2RlLmhlaWdodCArXG4gICAgICAgICAgICAnIFonXG4gICAgICAgICAgXCJcbiAgICAgICAgICBmaWxsPVwibm9uZVwiXG4gICAgICAgICAgc3Ryb2tlPVwiI0QzNkNGRlwiXG4gICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMVwiXG4gICAgICAgID48L3BhdGg+XG4gICAgICAgIH1cblxuICAgICAgICA8IS0tIEZvcm0gbm9kZSAtLT5cbiAgICAgICAgQGlmIChub2RlLnR5cGUgPT09ICdmb3JtJykge1xuICAgICAgICA8cGF0aFxuICAgICAgICAgIGQ9XCJNOTUuMDYyNSA1MC41NTkxVjk1LjA2MjVDOTUuMDYyNSA5Ny45NzE2IDkzLjkwNjkgMTAwLjc2MiA5MS44NDk4IDEwMi44MTlDODkuNzkyOCAxMDQuODc2IDg3LjAwMjggMTA2LjAzMSA4NC4wOTM4IDEwNi4wMzFIMzIuOTA2MkMyOS45OTcyIDEwNi4wMzEgMjcuMjA3MiAxMDQuODc2IDI1LjE1MDIgMTAyLjgxOUMyMy4wOTMxIDEwMC43NjIgMjEuOTM3NSA5Ny45NzE2IDIxLjkzNzUgOTUuMDYyNVYyMS45Mzc1QzIxLjkzNzUgMTkuMDI4NCAyMy4wOTMxIDE2LjIzODUgMjUuMTUwMiAxNC4xODE0QzI3LjIwNzIgMTIuMTI0NCAyOS45OTcyIDEwLjk2ODggMzIuOTA2MiAxMC45Njg4SDU1LjQ3MjJDNTcuNDEwOSAxMC45NjkgNTkuMjcwMSAxMS43MzkyIDYwLjY0MTIgMTMuMTA5OUw5Mi45MjEzIDQ1LjM5MDFDOTQuMjkyIDQ2Ljc2MTEgOTUuMDYyMiA0OC42MjA0IDk1LjA2MjUgNTAuNTU5MVpcIlxuICAgICAgICAgIHRyYW5zZm9ybT1cInNjYWxlKDAuNylcIlxuICAgICAgICAgIGZpbGw9XCJub25lXCJcbiAgICAgICAgICBzdHJva2U9XCIjRDM2Q0ZGXCJcbiAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXG4gICAgICAgIC8+XG4gICAgICAgIDxwYXRoXG4gICAgICAgICAgZD1cIk01OC41IDEyLjc5NjlWNDAuMjE4OEM1OC41IDQyLjE1ODEgNTkuMjcwNCA0NC4wMTgxIDYwLjY0MTggNDUuMzg5NUM2Mi4wMTMxIDQ2Ljc2MDggNjMuODczMSA0Ny41MzEyIDY1LjgxMjUgNDcuNTMxMkg5My4yMzQ0XCJcbiAgICAgICAgICB0cmFuc2Zvcm09XCJzY2FsZSgwLjcpXCJcbiAgICAgICAgICBzdHJva2U9XCIjRDM2Q0ZGXCJcbiAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXG4gICAgICAgIC8+XG4gICAgICAgIDx0ZXh0XG4gICAgICAgICAgeD1cIjUwJVwiXG4gICAgICAgICAgeT1cIjUwJVwiXG4gICAgICAgICAgdGV4dC1hbmNob3I9XCJtaWRkbGVcIlxuICAgICAgICAgIGRvbWluYW50LWJhc2VsaW5lPVwibWlkZGxlXCJcbiAgICAgICAgICBmb250LWZhbWlseT1cInNhbnMtc2VyaWZcIlxuICAgICAgICAgIGZvbnQtc2l6ZT1cIjE0XCJcbiAgICAgICAgICBmaWxsPVwiI0QzNkNGRlwiXG4gICAgICAgID5cbiAgICAgICAgICBGb3JtXG4gICAgICAgIDwvdGV4dD5cbiAgICAgICAgfVxuXG4gICAgICAgIDwhLS0gU3ViZmxvdyBub2RlIC0tPlxuICAgICAgICBAaWYgKG5vZGUudHlwZSA9PT0gJ3N1YmZsb3cnKSB7XG4gICAgICAgIDxwYXRoXG4gICAgICAgICAgW2F0dHIuZF09XCJcbiAgICAgICAgICAgICdNIDEgJyArXG4gICAgICAgICAgICBub2RlLmhlaWdodCAvIDQgK1xuICAgICAgICAgICAgJyBMICcgK1xuICAgICAgICAgICAgbm9kZS53aWR0aCAvIDIgK1xuICAgICAgICAgICAgJyAxIEwgJyArXG4gICAgICAgICAgICAobm9kZS53aWR0aCAtIDEpICtcbiAgICAgICAgICAgICcgJyArXG4gICAgICAgICAgICBub2RlLmhlaWdodCAvIDQgK1xuICAgICAgICAgICAgJyBWICcgK1xuICAgICAgICAgICAgKG5vZGUuaGVpZ2h0ICogMykgLyA0ICtcbiAgICAgICAgICAgICcgTCAnICtcbiAgICAgICAgICAgIG5vZGUud2lkdGggLyAyICtcbiAgICAgICAgICAgICcgJyArXG4gICAgICAgICAgICAobm9kZS5oZWlnaHQgLSAxKSArXG4gICAgICAgICAgICAnIEwgMSAnICtcbiAgICAgICAgICAgIChub2RlLmhlaWdodCAqIDMpIC8gNCArXG4gICAgICAgICAgICAnIFonXG4gICAgICAgICAgXCJcbiAgICAgICAgICBmaWxsPVwibm9uZVwiXG4gICAgICAgICAgc3Ryb2tlPVwiI0QzNkNGRlwiXG4gICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMVwiXG4gICAgICAgID48L3BhdGg+XG4gICAgICAgIDx0ZXh0XG4gICAgICAgICAgW2F0dHIueF09XCJub2RlLndpZHRoIC8gMlwiXG4gICAgICAgICAgW2F0dHIueV09XCJub2RlLmhlaWdodCAvIDJcIlxuICAgICAgICAgIHRleHQtYW5jaG9yPVwibWlkZGxlXCJcbiAgICAgICAgICBhbGlnbm1lbnQtYmFzZWxpbmU9XCJtaWRkbGVcIlxuICAgICAgICAgIGZvbnQtZmFtaWx5PVwic2Fucy1zZXJpZlwiXG4gICAgICAgICAgZm9udC1zaXplPVwiMTBcIlxuICAgICAgICAgIGZpbGw9XCIjMDAwMDAwXCJcbiAgICAgICAgPlxuICAgICAgICAgIDwhLS0gTGltaXQgdGV4dCBsZW5ndGggLS0+XG4gICAgICAgICAge3tcbiAgICAgICAgICAgIChub2RlLndvcmtmbG93RGF0YT8ubmFtZSB8fCBcIlN1YmZsb3dcIikubGVuZ3RoID4gMTJcbiAgICAgICAgICAgICAgPyAobm9kZS53b3JrZmxvd0RhdGE/Lm5hbWUgfHwgXCJTdWJmbG93XCIpLnN1YnN0cmluZygwLCAxMCkgKyBcIi4uLlwiXG4gICAgICAgICAgICAgIDogbm9kZS53b3JrZmxvd0RhdGE/Lm5hbWUgfHwgXCJTdWJmbG93XCJcbiAgICAgICAgICB9fVxuICAgICAgICA8L3RleHQ+XG4gICAgICAgIH1cblxuICAgICAgICA8IS0tIENvbm5lY3Rpb24gcG9pbnRzIGZvciB0aGlzIG5vZGUgLS0+XG4gICAgICAgIEBmb3IgKHBvaW50IG9mIG5vZGUuY29ubmVjdGlvblBvaW50cyB8fCBbXTsgdHJhY2sgcG9pbnQuaWQpIHsgQGlmXG4gICAgICAgIChpc0Nvbm5lY3Rpb25Qb2ludFZpc2libGUobm9kZS5pZCkpIHtcbiAgICAgICAgPHVzZVxuICAgICAgICAgIFthdHRyLmhyZWZdPVwiJyNjb25uZWN0aW9uLXBvaW50LXRlbXBsYXRlJ1wiXG4gICAgICAgICAgW2F0dHIueF09XCJwb2ludC54XCJcbiAgICAgICAgICBbYXR0ci55XT1cInBvaW50LnlcIlxuICAgICAgICAgIFthdHRyLmlkXT1cInBvaW50LmlkXCJcbiAgICAgICAgICAobW91c2Vkb3duKT1cInN0YXJ0Q29ubmVjdGlvbkRyYWcoJGV2ZW50LCBwb2ludCwgc3dpbWxhbmUub3JkZXIpXCJcbiAgICAgICAgLz5cbiAgICAgICAgfSB9XG4gICAgICA8L2c+XG4gICAgICA8IS0tIEEgdHJhbnNwYXJlbnQgaG92ZXIgYXJlYSBmb3IgaW1wcm92ZWQgaG92ZXIgZGV0ZWN0aW9uIC0tPlxuICAgICAgPHJlY3RcbiAgICAgICAgW2F0dHIueF09XCJub2RlLnggLSAxMFwiXG4gICAgICAgIFthdHRyLnldPVwibm9kZS55ICsgNDAgLSAxMFwiXG4gICAgICAgIFthdHRyLndpZHRoXT1cIm5vZGUud2lkdGggKyAyMFwiXG4gICAgICAgIFthdHRyLmhlaWdodF09XCJub2RlLmhlaWdodCArIDIwXCJcbiAgICAgICAgZmlsbD1cInRyYW5zcGFyZW50XCJcbiAgICAgICAgKG1vdXNlb3Zlcik9XCJzaG93Q29ubmVjdGlvblBvaW50cyhub2RlLmlkLCBzd2ltbGFuZS5vcmRlcilcIlxuICAgICAgICAobW91c2VvdXQpPVwiaGlkZUNvbm5lY3Rpb25Qb2ludHMobm9kZS5pZClcIlxuICAgICAgICBzdHlsZT1cInBvaW50ZXItZXZlbnRzOiBub25lXCJcbiAgICAgIC8+XG4gICAgICB9XG4gICAgPC9nPlxuICAgIH0gQGZvciAoY29ubmVjdGlvbiBvZiBzdGF0ZS5jb25uZWN0aW9uczsgdHJhY2sgY29ubmVjdGlvbi5pZCkge1xuICAgIDxnPlxuICAgICAgPHBhdGhcbiAgICAgICAgW2F0dHIuZF09XCJnZXRDb25uZWN0aW9uUGF0aEZvclNhdmVkQ29ubmVjdGlvbihjb25uZWN0aW9uKVwiXG4gICAgICAgIHN0cm9rZT1cIiNEMzZDRkZcIlxuICAgICAgICBzdHJva2Utd2lkdGg9XCIyXCJcbiAgICAgICAgZmlsbD1cIm5vbmVcIlxuICAgICAgICBtYXJrZXItZW5kPVwidXJsKCNhcnJvd2hlYWQpXCJcbiAgICAgID48L3BhdGg+XG4gICAgPC9nPlxuICAgIH1cblxuICAgIDwhLS0gQ29ubmVjdGlvbiBwcmV2aWV3IGxpbmUgLS0+XG4gICAgQGlmIChzdGF0ZS5pc0Nvbm5lY3Rpb25EcmFnZ2luZygpKSB7XG4gICAgPGc+XG4gICAgICA8cGF0aFxuICAgICAgICBbYXR0ci5kXT1cImdldENvbm5lY3Rpb25QYXRoKClcIlxuICAgICAgICBzdHJva2U9XCIjRDM2Q0ZGXCJcbiAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMlwiXG4gICAgICAgIHN0cm9rZS1kYXNoYXJyYXk9XCI1LDVcIlxuICAgICAgICBmaWxsPVwibm9uZVwiXG4gICAgICA+PC9wYXRoPlxuICAgIDwvZz5cbiAgICB9XG4gIDwvc3ZnPlxuXG4gIDxkaXZcbiAgICAqbmdJZj1cInBvcHVwVmlzaWJsZVwiXG4gICAgW3N0eWxlLnBvc2l0aW9uXT1cIidhYnNvbHV0ZSdcIlxuICAgIFtzdHlsZS5sZWZ0LnB4XT1cInBvcHVwWFwiXG4gICAgW3N0eWxlLnRvcC5weF09XCJwb3B1cFlcIlxuICA+XG4gICAgPHZlcmJlbi1wb3AtVXBcbiAgICAgIFtkcm9wZG93bk9wZW5dPVwidHJ1ZVwiXG4gICAgICBbY3VzdG9tU3R5bGVzXT1cInsgJ3otaW5kZXgnOiAnOTknIH1cIlxuICAgICAgW2VuYWJsZU1vdXNlTGVhdmVdPVwiZmFsc2VcIlxuICAgID5cbiAgICAgIDxkaXYgZHJvcGRvd24tdHJpZ2dlciBzdHlsZT1cImRpc3BsYXk6IG5vbmVcIj5cbiAgICAgICAgPCEtLSBIaWRkZW4gdHJpZ2dlciBlbGVtZW50IC0tPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwicC0zIGJnLXdoaXRlIGJvcmRlciBib3JkZXItZ3JheS0yMDAgcm91bmRlZCBzaGFkb3ctbWRcIlxuICAgICAgICBkcm9wZG93bi1jb250ZW50XG4gICAgICA+XG4gICAgICAgIDxoNCBjbGFzcz1cIm1iLTIgZm9udC1tZWRpdW1cIj5DcmVhdGUgQ29ubmVjdGlvbjwvaDQ+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC0yXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgdHlwZSBvZiBhbGxvd2VkTm9kZVR5cGVzXCI+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIGNsYXNzPVwicHgtMyBweS0yIGJnLXdoaXRlIGJvcmRlciBib3JkZXItZ3JheS0yMDAgcm91bmRlZCB0ZXh0LXNtIGhvdmVyOmJnLWdyYXktNTBcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiY3JlYXRlTm9kZUNvbm5lY3Rpb24odHlwZSlcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICBDcmVhdGUge3sgdHlwZSB8IHRpdGxlY2FzZSB9fVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgY2xhc3M9XCJweC0zIHB5LTIgYmctd2hpdGUgYm9yZGVyIGJvcmRlci1ncmF5LTIwMCByb3VuZGVkIHRleHQtc20gaG92ZXI6YmctZ3JheS01MFwiXG4gICAgICAgICAgICAoY2xpY2spPVwiaGlkZUNvbm5lY3Rpb25Qb3B1cCgpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICBDYW5jZWxcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L3ZlcmJlbi1wb3AtVXA+XG4gIDwvZGl2PlxuXG4gIDxkaXZcbiAgICAqbmdJZj1cInNob3dTdGFydE5vZGVGb3JtUG9wdXBcIlxuICAgIFtzdHlsZS5wb3NpdGlvbl09XCInYWJzb2x1dGUnXCJcbiAgICBbc3R5bGUubGVmdC5weF09XCJzdGFydE5vZGVGb3JtUG9wdXBYXCJcbiAgICBbc3R5bGUudG9wLnB4XT1cInN0YXJ0Tm9kZUZvcm1Qb3B1cFlcIlxuICA+XG4gICAgPHZlcmJlbi1wb3AtVXAgW2Ryb3Bkb3duT3Blbl09XCJ0cnVlXCIgW2N1c3RvbVN0eWxlc109XCJ7ICd6LWluZGV4JzogJzEwMCcgfVwiPlxuICAgICAgPGRpdiBkcm9wZG93bi10cmlnZ2VyIHN0eWxlPVwiZGlzcGxheTogbm9uZVwiPlxuICAgICAgICA8IS0tIEhpZGRlbiB0cmlnZ2VyIGVsZW1lbnQgLS0+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJwLTMgYmctd2hpdGUgYm9yZGVyIGJvcmRlci1ncmF5LTIwMCByb3VuZGVkIHNoYWRvdy1tZCB3LTY0XCJcbiAgICAgICAgZHJvcGRvd24tY29udGVudFxuICAgICAgICBzdHlsZT1cImJhY2tncm91bmQtY29sb3I6IHdoaXRlOyB6LWluZGV4OiAxMDAwXCJcbiAgICAgID5cbiAgICAgICAgPGg0IGNsYXNzPVwibWItMiBmb250LW1lZGl1bVwiPlNlbGVjdCBXb3JrZmxvdyBGb3JtPC9oND5cbiAgICAgICAgPGRpdiAqbmdJZj1cImlzTG9hZGluZ1N0YXJ0Tm9kZUZvcm1zXCIgY2xhc3M9XCJ0ZXh0LWNlbnRlciBweS0yXCI+XG4gICAgICAgICAgTG9hZGluZyBmb3Jtcy4uLlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiAqbmdJZj1cIiFpc0xvYWRpbmdTdGFydE5vZGVGb3Jtc1wiIGNsYXNzPVwibWF4LWgtNDggb3ZlcmZsb3cteS1hdXRvXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTJcIj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgY2xhc3M9XCJ3LWZ1bGwgcHgtMyBweS0yIGJnLXdoaXRlIGJvcmRlciBib3JkZXItZ3JheS0yMDAgcm91bmRlZCB0ZXh0LXNtIGhvdmVyOmJnLWdyYXktNTAgdGV4dC1sZWZ0XCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdFN0YXJ0Tm9kZUZvcm0obnVsbClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICBDbGVhciBmb3JtIHNlbGVjdGlvblxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgZm9ybSBvZiBzdGFydE5vZGVGb3Jtc0xpc3RcIiBjbGFzcz1cIm1iLTFcIj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgY2xhc3M9XCJ3LWZ1bGwgcHgtMyBweS0yIGJnLXdoaXRlIGJvcmRlciBib3JkZXItZ3JheS0yMDAgcm91bmRlZCB0ZXh0LXNtIGhvdmVyOmJnLWdyYXktNTAgdGV4dC1sZWZ0XCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdFN0YXJ0Tm9kZUZvcm0oZm9ybSlcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7eyBmb3JtLk5hbWUgfX1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICpuZ0lmPVwic3RhcnROb2RlRm9ybXNMaXN0Lmxlbmd0aCA9PT0gMFwiXG4gICAgICAgICAgICBjbGFzcz1cInRleHQtY2VudGVyIHB5LTIgdGV4dC1ncmF5LTUwMFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgTm8gZm9ybXMgYXZhaWxhYmxlXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC92ZXJiZW4tcG9wLVVwPlxuICA8L2Rpdj5cblxuICA8ZGl2XG4gICAgKm5nSWY9XCJzaG93U3ViZmxvd1BvcHVwXCJcbiAgICBbc3R5bGUucG9zaXRpb25dPVwiJ2Fic29sdXRlJ1wiXG4gICAgW3N0eWxlLmxlZnQucHhdPVwic3ViZmxvd1BvcHVwWFwiXG4gICAgW3N0eWxlLnRvcC5weF09XCJzdWJmbG93UG9wdXBZXCJcbiAgPlxuICAgIDx2ZXJiZW4tcG9wLVVwIFtkcm9wZG93bk9wZW5dPVwidHJ1ZVwiIFtjdXN0b21TdHlsZXNdPVwieyAnei1pbmRleCc6ICcxMDAnIH1cIj5cbiAgICAgIDxkaXYgZHJvcGRvd24tdHJpZ2dlciBzdHlsZT1cImRpc3BsYXk6IG5vbmVcIj5cbiAgICAgICAgPCEtLSBIaWRkZW4gdHJpZ2dlciBlbGVtZW50IC0tPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwicC0zIGJnLXdoaXRlIGJvcmRlciBib3JkZXItZ3JheS0yMDAgcm91bmRlZCBzaGFkb3ctbWQgdy02NFwiXG4gICAgICAgIGRyb3Bkb3duLWNvbnRlbnRcbiAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsgei1pbmRleDogMTAwMFwiXG4gICAgICA+XG4gICAgICAgIDxoNCBjbGFzcz1cIm1iLTIgZm9udC1tZWRpdW1cIj5TZWxlY3QgV29ya2Zsb3c8L2g0PlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNMb2FkaW5nV29ya2Zsb3dzXCIgY2xhc3M9XCJ0ZXh0LWNlbnRlciBweS0yXCI+XG4gICAgICAgICAgTG9hZGluZyB3b3JrZmxvd3MuLi5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgKm5nSWY9XCIhaXNMb2FkaW5nV29ya2Zsb3dzXCIgY2xhc3M9XCJtYXgtaC00OCBvdmVyZmxvdy15LWF1dG9cIj5cbiAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCB3b3JrZmxvdyBvZiB3b3JrZmxvd3NMaXN0XCIgY2xhc3M9XCJtYi0xXCI+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIGNsYXNzPVwidy1mdWxsIHB4LTMgcHktMiBiZy13aGl0ZSBib3JkZXIgYm9yZGVyLWdyYXktMjAwIHJvdW5kZWQgdGV4dC1zbSBob3ZlcjpiZy1ncmF5LTUwIHRleHQtbGVmdFwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RTdWJmbG93V29ya2Zsb3cod29ya2Zsb3cpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge3sgd29ya2Zsb3cuTmFtZSB9fVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgKm5nSWY9XCJ3b3JrZmxvd3NMaXN0Lmxlbmd0aCA9PT0gMFwiXG4gICAgICAgICAgICBjbGFzcz1cInRleHQtY2VudGVyIHB5LTIgdGV4dC1ncmF5LTUwMFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgTm8gd29ya2Zsb3dzIGF2YWlsYWJsZVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvdmVyYmVuLXBvcC1VcD5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
|