1import { Q as QBreadcrumbsEl } from "./QBreadcrumbsEl-DJmFSikN.js"; 2import { Q as QTab, a as QTabs, b as QTabPanel, c as QTabPanels } from "./QTabPanels-BC9Oww_1.js"; 3import { r as rotateAccessToken, c as clearCache, h as clearSecrets, k as getExternalLoginInfo, b as getConnUsage, l as getConnUsername, i as deleteConnections, m as getConnection } from "./realsyncUtils-B_eb3OgH.js"; 4import { a2 as getPropsToDisplay, v as valueLabels, p as getAuditUpdated, q as getAuditCreated, a1 as getCurrentProduct, R as showConfirm, h as notifySuccess, B as getEntityNamesListForDialog, r as confirmDanger, G as notifyInfo, y as confirmDelete, a3 as isTenantAdmin, Y as hasRealtask } from "./utils-Dl9t6EOZ.js"; 5import { m as mixins } from "./mixins-BCMXzTHA.js"; 6import { O as OutputField } from "./OutputField-DkpOfYYx.js"; 7import { _ as _export_sfc, c as createBlock, o as openBlock, w as withCtx, a as createVNode, r as resolveComponent, e as createCommentVNode, j as createTextVNode } from "./index-l2g1tnsc.js"; 8import { I as IconReadOnly, R as RefUsageViewerDialog, C as ConnectionDialog } from "./IconReadOnly-9GxUNzum.js"; 9import { T as TextViewerDialog } from "./TextViewerDialog-BPyN4E_q.js"; 10import { S as SyncStatus } from "./SyncStatus-Ehz8Em6K.js"; 11import "./QResizeObserver-C-xPzvmf.js"; 12import "./rtl-DDpZOXNn.js"; 13import "./touch-BscSWsHh.js"; 14import "./selection-CtEbNG46.js"; 15import "./use-render-cache-DRJWLz-b.js"; 16import "./http-QV44vcaW.js"; 17import "./api-CsX1TBBI.js"; 18/* empty css */ 19import "./QForm-B7u6vHMU.js"; 20import "./SharingDialog-8nsVnUso.js"; 21import "./mixinsV3-DJOx874v.js"; 22import "./lodash-D-1jTqv6.js"; 23import "./Column-CHEOSUiF.js"; 24import "./TextViewer-DMWZwv7n.js"; 25import "./styles-Ba8hxl-j.js"; 26import "./Tooltip-BL9mlxg7.js"; 27import "./Popover-DdmYwYku.js"; 28import "./light-ChFcYHVz.js"; 29import "./Scrollbar-w6xdyLLY.js"; 30import "./Close-CMLcMmhU.js"; 31import "./Icon-XvtDqeG4.js"; 32import "./replaceable-D4umoBrm.js"; 33import "./upperFirst-DygzsnnD.js"; 34const _sfc_main$1 = { 35 mixins: [mixins], 36 components: { OutputField }, 37 props: { 38 model: Object 39 }, 40 data() { 41 return { 42 message: "" 43 }; 44 }, 45 computed: { 46 created() { 47 return getAuditCreated(this.model); 48 }, 49 updated() { 50 return getAuditUpdated(this.model); 51 } 52 }, 53 methods: { 54 valueLabels() { 55 return valueLabels; 56 }, 57 getPropsToDisplay() { 58 return getPropsToDisplay(this.model.options); 59 } 60 } 61}; 62function _sfc_render$1(_ctx, _cache, $props, $setup, $data, $options) { 63 const _component_OutputField = resolveComponent("OutputField"); 64 const _component_Column = resolveComponent("Column"); 65 const _component_Row = resolveComponent("Row"); 66 const _component_ProgressDialog = resolveComponent("ProgressDialog"); 67 const _component_Card = resolveComponent("Card"); 68 return openBlock(), createBlock(_component_Card, { 69 width: "100%", 70 message: $data.message, 71 messageType: _ctx.messageType 72 }, { 73 default: withCtx(() => [ 74 createVNode(_component_Row, null, { 75 default: withCtx(() => [ 76 createVNode(_component_Column, null, { 77 default: withCtx(() => [ 78 createVNode(_component_OutputField, { 79 label: "Name", 80 value: $props.model.name 81 }, null, 8, ["value"]) 82 ]), 83 _: 1 84 }), 85 createVNode(_component_Column, null, { 86 default: withCtx(() => [ 87 createVNode(_component_OutputField, { 88 label: "Type", 89 value: $props.model.type, 90 valueLabels: $options.valueLabels().connTypes 91 }, null, 8, ["value", "valueLabels"]) 92 ]), 93 _: 1 94 }), 95 createVNode(_component_Column, null, { 96 default: withCtx(() => [ 97 createVNode(_component_OutputField, { 98 label: "Flavor", 99 value: $props.model.flavor 100 }, null, 8, ["value"]) 101 ]), 102 _: 1 103 }) 104 ]), 105 _: 1 106 }), 107 createVNode(_component_Row, null, { 108 default: withCtx(() => [ 109 createVNode(_component_Column, null, { 110 default: withCtx(() => [ 111 createVNode(_component_OutputField, { 112 label: "Auth Type", 113 value: $props.model.authType, 114 valueLabels: $options.valueLabels().authTypes 115 }, null, 8, ["value", "valueLabels"]) 116 ]), 117 _: 1 118 }), 119 createVNode(_component_Column, null, { 120 default: withCtx(() => [ 121 createVNode(_component_OutputField, { 122 label: "Auth User", 123 value: $props.model.authUser 124 }, null, 8, ["value"]) 125 ]), 126 _: 1 127 }) 128 ]), 129 _: 1 130 }), 131 createVNode(_component_Row, null, { 132 default: withCtx(() => [ 133 createVNode(_component_Column, null, { 134 default: withCtx(() => [ 135 createVNode(_component_OutputField, { 136 label: "External Env Name", 137 value: $props.model.externalEnvName 138 }, null, 8, ["value"]) 139 ]), 140 _: 1 141 }), 142 createVNode(_component_Column, null, { 143 default: withCtx(() => [ 144 createVNode(_component_OutputField, { 145 label: "External Env Id", 146 value: $props.model.externalEnvId 147 }, null, 8, ["value"]) 148 ]), 149 _: 1 150 }) 151 ]), 152 _: 1 153 }), 154 createVNode(_component_Row, null, { 155 default: withCtx(() => [ 156 createVNode(_component_Column, null, { 157 default: withCtx(() => [ 158 createVNode(_component_OutputField, { 159 label: "Sharing", 160 value: $props.model.sharing, 161 valueLabels: $options.valueLabels().sharingTypes 162 }, null, 8, ["value", "valueLabels"]) 163 ]), 164 _: 1 165 }), 166 createVNode(_component_Column, null, { 167 default: withCtx(() => [ 168 createVNode(_component_OutputField, { 169 label: "Sharing Details", 170 value: $props.model.sharingDetails 171 }, null, 8, ["value"]) 172 ]), 173 _: 1 174 }) 175 ]), 176 _: 1 177 }), 178 createVNode(_component_Row, null, { 179 default: withCtx(() => [ 180 createVNode(_component_Column, null, { 181 default: withCtx(() => [ 182 createVNode(_component_OutputField, { 183 label: "Owner", 184 value: ($props.model.ownerId__r || {}).name 185 }, null, 8, ["value"]) 186 ]), 187 _: 1 188 }) 189 ]), 190 _: 1 191 }), 192 createVNode(_component_Row, null, { 193 default: withCtx(() => [ 194 createVNode(_component_Column, null, { 195 default: withCtx(() => [ 196 createVNode(_component_OutputField, { 197 label: "Properties", 198 value: $options.getPropsToDisplay() 199 }, null, 8, ["value"]) 200 ]), 201 _: 1 202 }) 203 ]), 204 _: 1 205 }), 206 createVNode(_component_Row, null, { 207 default: withCtx(() => [ 208 createVNode(_component_Column, null, { 209 default: withCtx(() => [ 210 createVNode(_component_OutputField, { 211 label: "Message", 212 value: $props.model.message 213 }, null, 8, ["value"]) 214 ]), 215 _: 1 216 }) 217 ]), 218 _: 1 219 }), 220 createVNode(_component_Row, null, { 221 default: withCtx(() => [ 222 createVNode(_component_Column, null, { 223 default: withCtx(() => [ 224 createVNode(_component_OutputField, { 225 label: "Details", 226 value: $props.model.details 227 }, null, 8, ["value"]) 228 ]), 229 _: 1 230 }) 231 ]), 232 _: 1 233 }), 234 createVNode(_component_Row, null, { 235 default: withCtx(() => [ 236 createVNode(_component_Column, null, { 237 default: withCtx(() => [ 238 createVNode(_component_OutputField, { 239 label: "Created", 240 value: $options.created 241 }, null, 8, ["value"]) 242 ]), 243 _: 1 244 }), 245 createVNode(_component_Column, null, { 246 default: withCtx(() => [ 247 createVNode(_component_OutputField, { 248 label: "Updated", 249 value: $options.updated 250 }, null, 8, ["value"]) 251 ]), 252 _: 1 253 }) 254 ]), 255 _: 1 256 }), 257 createVNode(_component_ProgressDialog, { 258 modelValue: _ctx.processing, 259 "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => _ctx.processing = $event) 260 }, null, 8, ["modelValue"]) 261 ]), 262 _: 1 263 }, 8, ["message", "messageType"]); 264}
265const ConnectionDetails = /* @__PURE__ */ _export_sfc(_sfc_main$1, [["render", _sfc_render$1], ["__file", "ConnectionDetails.vue"]]); 266const _sfc_main = { 267 mixins: [mixins], 268 components: { 269 ConnectionDialog, 270 ConnectionDetails, 271 RefUsageViewerDialog, 272 IconReadOnly, 273 TextViewerDialog, 274 SyncStatus 275 }, 276 props: { 277 showEnvs: { 278 type: Boolean, 279 default: false 280 }, 281 showJobs: { 282 type: Boolean, 283 default: false 284 } 285 }, 286 data: () => ({ 287 progressOpen: false, 288 dialogOpen: false, 289 dialogMode: "add", 290 dialogConnId: null, 291 dialogData: {}, 292 initingSuccess: true, 293 model: [], 294 currentTab: "details", 295 connId: "", 296 productName: getCurrentProduct(), 297 textViewerContent: "", 298 textViewerOpen: false, 299 usageViewerContent: [], 300 usageViewerOpen: false, 301 usageViewerTitle: "" 302 }), 303 created() { 304 this.connId = this.$route.params.connId; 305 this.initForm(async () => { 306 this.model = await getConnection(this.connId); 307 }); 308 }, 309 computed: { 310 hasRealtask() { 311 return hasRealtask(); 312 }, 313 isTenantAdmin() { 314 return isTenantAdmin(); 315 } 316 }, 317 methods: { 318 async refresh() { 319 this.processForm(async () => { 320 this.model = await getConnection(this.connId); 321 }); 322 }, 323 async handleDelete() { 324 const recs = [this.model]; 325 const msg = `Are you sure you want to delete the following Connection? </br> ${getEntityNamesListForDialog(recs)}Note that if Connection is referenced by entities like Realtask Jobs or Realtask Environments, then it cannot be deleted until all references are removed.`; 326 const result = await confirmDelete("Delete Connection?", msg); 327 if (result) { 328 this.handleDeleteAfterConfirm(); 329 } 330 }, 331 handleDeleteAfterConfirm() { 332 this.processing = true; 333 this.processForm(async () => { 334 await deleteConnections({ 335 records: [{ id: this.model.id }] 336 }); 337 this.$router.go(-1); 338 notifySuccess("Connection have been deleted"); 339 }); 340 }, 341 handleEdit() { 342 this.dialogConnId = this.model.id; 343 this.dialogMode = "edit"; 344 this.dialogOpen = true; 345 }, 346 viewUsername() { 347 this.process(async () => { 348 const resp = await getConnUsername(this.model.id); 349 this.textViewerContent = JSON.stringify(resp); 350 this.textViewerOpen = true; 351 }); 352 }, 353 viewUsage() { 354 this.process(async () => { 355 const usages = await getConnUsage(this.model.id); 356 if (usages.length === 0) { 357 notifyInfo("This connection is not used anywhere"); 358 } else { 359 this.usageViewerContent = usages; 360 this.usageViewerOpen = true; 361 this.usageViewerTitle = `Connection Usage - ${this.model.name}`; 362 } 363 }); 364 }, 365 openSfdcUI() { 366 this.process(async () => { 367 const info = await getExternalLoginInfo(this.model.id); 368 window.open(info.url, "_newtab"); 369 }); 370 }, 371 async handleClearSecrets() { 372 const recs = [this.model]; 373 this.message = null; 374 const msg = `Are you sure you want to clear the secrets for following Connections? </br> ${getEntityNamesListForDialog(recs)} 375 376Once cleared, this connection will not be able to be used till secrets are specified again.`; 377 const confirmed = await confirmDanger("Clear Secrets?", msg, "Yes, Clear"); 378 if (!confirmed) { 379 return; 380 } 381 return this.processForm(async () => { 382 const resp = await clearSecrets({ records: [{ id: this.model.id }] }); 383 notifySuccess(resp.message); 384 this.refresh(); 385 }); 386 }, 387 async handleClearCache() { 388 this.message = null; 389 const msg = "Are you sure you want to clear the cache?"; 390 const confirmed = await showConfirm("Clear Cache?", msg, { okLabel: "Yes, Clear" }); 391 if (!confirmed) { 392 return; 393 } 394 return this.processForm(async () => { 395 await clearCache({ records: [{ id: this.model.id }] }); 396 notifySuccess("Cache has been cleared"); 397 }); 398 }, 399 async handleRotateAccessToken() { 400 this.message = null; 401 const msg = "Are you sure you want to rotate the access token for this Connection? This will call Salesforce to renew the session, re-issuing the access token (and refresh token, if Refresh Token Rotation is enabled) and saving the new tokens."; 402 const confirmed = await showConfirm("Rotate Access Token?", msg, { okLabel: "Yes, Rotate" }); 403 if (!confirmed) { 404 return; 405 } 406 return this.processForm(async () => { 407 const resp = await rotateAccessToken(this.model.id); 408 notifySuccess(resp.message); 409 this.refresh(); 410 }); 411 } 412 } 413}; 414function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
415 const _component_Icon = resolveComponent("Icon"); 416 const _component_MenuItem = resolveComponent("MenuItem"); 417 const _component_Separator = resolveComponent("Separator"); 418 const _component_IconMenu = resolveComponent("IconMenu"); 419 const _component_IconReadOnly = resolveComponent("IconReadOnly"); 420 const _component_SyncStatus = resolveComponent("SyncStatus"); 421 const _component_ConnectionDetails = resolveComponent("ConnectionDetails"); 422 const _component_ConnectionDialog = resolveComponent("ConnectionDialog"); 423 const _component_TextViewerDialog = resolveComponent("TextViewerDialog"); 424 const _component_RefUsageViewerDialog = resolveComponent("RefUsageViewerDialog"); 425 const _component_Page = resolveComponent("Page"); 426 return openBlock(), createBlock(_component_Page, { 427 title: `Connection - ${_ctx.model.name || ""}`, 428 initing: _ctx.initing, 429 initingSuccess: _ctx.initingSuccess, 430 processing: _ctx.processing, 431 message: _ctx.message, 432 messageType: _ctx.messageType 433 }, { 434 breadcrumbs: withCtx(() => [ 435 createVNode(QBreadcrumbsEl, { 436 label: "Home", 437 to: `/${_ctx.productName}/home` 438 }, null, 8, ["to"]), 439 createVNode(QBreadcrumbsEl, { 440 label: "Connections", 441 to: `/${_ctx.productName}/connections` 442 }, null, 8, ["to"]) 443 ]), 444 "title-suffix": withCtx(() => [ 445 createVNode(_component_Icon, { 446 name: "refresh", 447 onClick: $options.refresh, 448 clickable: "" 449 }, null, 8, ["onClick"]), 450 createVNode(_component_IconMenu, null, { 451 default: withCtx(() => [ 452 createVNode(_component_MenuItem, { onClick: $options.handleEdit }, { 453 default: withCtx(() => [..._cache[7] || (_cache[7] = [ 454 createTextVNode("Edit", -1) 455 ])]), 456 _: 1 457 }, 8, ["onClick"]), 458 createVNode(_component_MenuItem, { onClick: $options.handleClearCache }, { 459 default: withCtx(() => [..._cache[8] || (_cache[8] = [ 460 createTextVNode("Clear Cache", -1) 461 ])]), 462 _: 1 463 }, 8, ["onClick"]), 464 createVNode(_component_Separator), 465 createVNode(_component_MenuItem, { onClick: $options.viewUsage }, { 466 default: withCtx(() => [..._cache[9] || (_cache[9] = [ 467 createTextVNode("View Usage", -1) 468 ])]), 469 _: 1 470 }, 8, ["onClick"]), 471 _ctx.model.type === "sfdc" ? (openBlock(), createBlock(_component_MenuItem, { 472 key: 0, 473 onClick: $options.openSfdcUI 474 }, { 475 default: withCtx(() => [..._cache[10] || (_cache[10] = [ 476 createTextVNode("Open Sfdc UI", -1) 477 ])]), 478 _: 1 479 }, 8, ["onClick"])) : createCommentVNode("", true), 480 _ctx.model.type === "sfdc" && $options.isTenantAdmin ? (openBlock(), createBlock(_component_MenuItem, { 481 key: 1, 482 onClick: $options.handleRotateAccessToken 483 }, { 484 default: withCtx(() => [..._cache[11] || (_cache[11] = [ 485 createTextVNode("Rotate Access Token", -1) 486 ])]), 487 _: 1 488 }, 8, ["onClick"])) : createCommentVNode("", true), 489 createVNode(_component_MenuItem, { onClick: $options.handleClearSecrets }, { 490 default: withCtx(() => [..._cache[12] || (_cache[12] = [ 491 createTextVNode("Clear Secrets", -1) 492 ])]), 493 _: 1 494 }, 8, ["onClick"]), 495 createVNode(_component_Separator), 496 createVNode(_component_Separator), 497 createVNode(_component_MenuItem, { 498 onClick: $options.handleDelete, 499 danger: "" 500 }, { 501 default: withCtx(() => [..._cache[13] || (_cache[13] = [ 502 createTextVNode("Delete", -1) 503 ])]), 504 _: 1 505 }, 8, ["onClick"]) 506 ]), 507 _: 1 508 }) 509 ]), 510 "title-desc": withCtx(() => [ 511 createVNode(_component_IconReadOnly, { model: _ctx.model }, null, 8, ["model"]), 512 createVNode(_component_SyncStatus, { 513 status: _ctx.model.status, 514 tooltip: _ctx.model.message 515 }, null, 8, ["status", "tooltip"]) 516 ]), 517 default: withCtx(() => [ 518 createVNode(QTabs, { 519 "indicator-color": "primary", 520 align: "left", 521 modelValue: _ctx.currentTab, 522 "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => _ctx.currentTab = $event), 523 dense: "", 524 class: "", 525 "no-caps": "" 526 }, { 527 default: withCtx(() => [ 528 createVNode(QTab, { 529 name: "details", 530 label: "Details" 531 }) 532 ]), 533 _: 1 534 }, 8, ["modelValue"]), 535 createVNode(QTabPanels, { 536 "keep-alive": "", 537 modelValue: _ctx.currentTab, 538 "onUpdate:modelValue": _cache[2] || (_cache[2] = ($event) => _ctx.currentTab = $event) 539 }, { 540 default: withCtx(() => [ 541 createVNode(QTabPanel, { name: "details" }, { 542 default: withCtx(() => [
543 createVNode(_component_ConnectionDetails, { 544 model: _ctx.model, 545 onEdit: _cache[1] || (_cache[1] = ($event) => _ctx.dialogOpen = true) 546 }, null, 8, ["model"]) 547 ]), 548 _: 1 549 }) 550 ]), 551 _: 1 552 }, 8, ["modelValue"]), 553 createVNode(_component_ConnectionDialog, { 554 modelValue: _ctx.dialogOpen, 555 "onUpdate:modelValue": _cache[3] || (_cache[3] = ($event) => _ctx.dialogOpen = $event), 556 connId: _ctx.connId, 557 mode: "edit", 558 onOk: $options.refresh, 559 onCancel: _cache[4] || (_cache[4] = ($event) => _ctx.dialogOpen = false) 560 }, null, 8, ["modelValue", "connId", "onOk"]), 561 createVNode(_component_TextViewerDialog, { 562 modelValue: _ctx.textViewerOpen, 563 "onUpdate:modelValue": _cache[5] || (_cache[5] = ($event) => _ctx.textViewerOpen = $event), 564 content: _ctx.textViewerContent 565 }, null, 8, ["modelValue", "content"]), 566 createVNode(_component_RefUsageViewerDialog, { 567 modelValue: _ctx.usageViewerOpen, 568 "onUpdate:modelValue": _cache[6] || (_cache[6] = ($event) => _ctx.usageViewerOpen = $event), 569 model: _ctx.usageViewerContent, 570 title: _ctx.usageViewerTitle 571 }, null, 8, ["modelValue", "model", "title"]) 572 ]), 573 _: 1 574 }, 8, ["title", "initing", "initingSuccess", "processing", "message", "messageType"]); 575} 576const Connection = /* @__PURE__ */ _export_sfc(_sfc_main, [["render", _sfc_render], ["__file", "Connection.vue"]]); 577export { 578 Connection as default 579}; 580//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29ubmVjdGlvbi1DamtRQ0JoYy5qcyIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3Byb2R1Y3RzL2FjY291bnQvcGFnZXMvY29ubmVjdGlvbi9Db25uZWN0aW9uRGV0YWlscy52dWUiLCIuLi8uLi8uLi9zcmMvcHJvZHVjdHMvYWNjb3VudC9wYWdlcy9jb25uZWN0aW9uL0Nvbm5lY3Rpb24udnVlIl0sInNvdXJjZXNDb250ZW50IjpbIjx0ZW1wbGF0ZT5cbiAgPENhcmQgd2lkdGg9XCIxMDAlXCIgOm1lc3NhZ2U9XCJtZXNzYWdlXCIgOm1lc3NhZ2VUeXBlPVwibWVzc2FnZVR5cGVcIj5cbiAgICA8Um93PlxuICAgICAgPENvbHVtbj5cbiAgICAgICAgPE91dHB1dEZpZWxkIGxhYmVsPVwiTmFtZVwiIDp2YWx1ZT1cIm1vZGVsLm5hbWVcIiAvPlxuICAgICAgPC9Db2x1bW4+XG4gICAgICA8Q29sdW1uPlxuICAgICAgICA8T3V0cHV0RmllbGQgbGFiZWw9XCJUeXBlXCIgOnZhbHVlPVwibW9kZWwudHlwZVwiIDp2YWx1ZUxhYmVscz1cInZhbHVlTGFiZWxzKCkuY29ublR5cGVzXCIgLz5cbiAgICAgIDwvQ29sdW1uPlxuICAgICAgPENvbHVtbj5cbiAgICAgICAgPE91dHB1dEZpZWxkIGxhYmVsPVwiRmxhdm9yXCIgOnZhbHVlPVwibW9kZWwuZmxhdm9yXCIgLz5cbiAgICAgIDwvQ29sdW1uPlxuICAgIDwvUm93PlxuICAgIDxSb3c+XG4gICAgICA8Q29sdW1uPlxuICAgICAgICA8T3V0cHV0RmllbGQgbGFiZWw9XCJBdXRoIFR5cGVcIiA6dmFsdWU9XCJtb2RlbC5hdXRoVHlwZVwiIDp2YWx1ZUxhYmVscz1cInZhbHVlTGFiZWxzKCkuYXV0aFR5cGVzXCIgLz5cbiAgICAgIDwvQ29sdW1uPlxuICAgICAgPENvbHVtbj5cbiAgICAgICAgPE91dHB1dEZpZWxkIGxhYmVsPVwiQXV0aCBVc2VyXCIgOnZhbHVlPVwibW9kZWwuYXV0aFVzZXJcIiAvPlxuICAgICAgPC9Db2x1bW4+XG4gICAgPC9Sb3c+XG4gICAgPFJvdz5cbiAgICAgIDxDb2x1bW4+XG4gICAgICAgIDxPdXRwdXRGaWVsZCBsYWJlbD1cIkV4dGVybmFsIEVudiBOYW1lXCIgOnZhbHVlPVwibW9kZWwuZXh0ZXJuYWxFbnZOYW1lXCIgLz5cbiAgICAgIDwvQ29sdW1uPlxuICAgICAgPENvbHVtbj5cbiAgICAgICAgPE91dHB1dEZpZWxkIGxhYmVsPVwiRXh0ZXJuYWwgRW52IElkXCIgOnZhbHVlPVwibW9kZWwuZXh0ZXJuYWxFbnZJZFwiIC8+XG4gICAgICA8L0NvbHVtbj5cbiAgICA8L1Jvdz5cbiAgICA8Um93PlxuICAgICAgPENvbHVtbj5cbiAgICAgICAgPE91dHB1dEZpZWxkIGxhYmVsPVwiU2hhcmluZ1wiIDp2YWx1ZT1cIm1vZGVsLnNoYXJpbmdcIiA6dmFsdWVMYWJlbHM9XCJ2YWx1ZUxhYmVscygpLnNoYXJpbmdUeXBlc1wiIC8+XG4gICAgICA8L0NvbHVtbj5cbiAgICAgIDxDb2x1bW4+XG4gICAgICAgIDxPdXRwdXRGaWVsZCBsYWJlbD1cIlNoYXJpbmcgRGV0YWlsc1wiIDp2YWx1ZT1cIm1vZGVsLnNoYXJpbmdEZXRhaWxzXCIgLz5cbiAgICAgIDwvQ29sdW1uPlxuICAgIDwvUm93PlxuICAgIDxSb3c+XG4gICAgICA8Q29sdW1uPlxuICAgICAgICA8T3V0cHV0RmllbGQgbGFiZWw9XCJPd25lclwiIDp2YWx1ZT1cIihtb2RlbC5vd25lcklkX19yIHx8IHt9KS5uYW1lXCIgLz5cbiAgICAgIDwvQ29sdW1uPlxuICAgIDwvUm93PlxuICAgIDxSb3c+XG4gICAgICA8Q29sdW1uPlxuICAgICAgICA8T3V0cHV0RmllbGQgbGFiZWw9XCJQcm9wZXJ0aWVzXCIgOnZhbHVlPVwiZ2V0UHJvcHNUb0Rpc3BsYXkoKVwiIC8+XG4gICAgICA8L0NvbHVtbj5cbiAgICA8L1Jvdz5cbiAgICA8Um93PlxuICAgICAgPENvbHVtbj5cbiAgICAgICAgPE91dHB1dEZpZWxkIGxhYmVsPVwiTWVzc2FnZVwiIDp2YWx1ZT1cIm1vZGVsLm1lc3NhZ2VcIiAvPlxuICAgICAgPC9Db2x1bW4+XG4gICAgPC9Sb3c+XG4gICAgPFJvdz5cbiAgICAgIDxDb2x1bW4+XG4gICAgICAgIDxPdXRwdXRGaWVsZCBsYWJlbD1cIkRldGFpbHNcIiA6dmFsdWU9XCJtb2RlbC5kZXRhaWxzXCIgLz5cbiAgICAgIDwvQ29sdW1uPlxuICAgIDwvUm93PlxuICAgIDxSb3c+XG4gICAgICA8Q29sdW1uPlxuICAgICAgICA8T3V0cHV0RmllbGQgbGFiZWw9XCJDcmVhdGVkXCIgOnZhbHVlPVwiY3JlYXRlZFwiIC8+XG4gICAgICA8L0NvbHVtbj5cbiAgICAgIDxDb2x1bW4+XG4gICAgICAgIDxPdXRwdXRGaWVsZCBsYWJlbD1cIlVwZGF0ZWRcIiA6dmFsdWU9XCJ1cGRhdGVkXCIgLz5cbiAgICAgIDwvQ29sdW1uPlxuICAgIDwvUm93PlxuICAgIDwhLS0gICAgPFJvdz4tLT5cbiAgICA8IS0tICAgICAgPENvbHVtbj4tLT5cbiAgICA8IS0tICAgICAgICA8QnV0dG9uIEBjbGljaz1cIiRlbWl0KCdlZGl0JylcIiBsYWJlbD1cIkVkaXRcIiAvPi0tPlxuICAgIDwhLS0gICAgICA8L0NvbHVtbj4tLT5cbiAgICA8IS0tICAgIDwvUm93Pi0tPlxuXG4gICAgPFByb2dyZXNzRGlhbG9nIHYtbW9kZWw9XCJwcm9jZXNzaW5nXCIgLz5cbiAgPC9DYXJkPlxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCAqIGFzIHV0aWxzIGZyb20gJ3NyYy9zZXJ2aWNlcy91dGlscyc7XG5pbXBvcnQgbWl4aW5zIGZyb20gJ3NyYy9taXhpbnMvbWl4aW5zJztcbmltcG9ydCAqIGFzIGNvbW1vbkFwaSBmcm9tICdzcmMvc2VydmljZXMvY29tbW9uQXBpJztcbmltcG9ydCBPdXRwdXRGaWVsZCBmcm9tICdzcmMvY29tcG9uZW50cy9PdXRwdXRGaWVsZC52dWUnO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIG1peGluczogW21peGluc10sXG4gIGNvbXBvbmVudHM6IHtPdXRwdXRGaWVsZH0sXG4gIHByb3BzOiB7XG4gICAgbW9kZWw6IE9iamVjdCxcbiAgfSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybi
580B7XG4gICAgICBtZXNzYWdlOiAnJyxcbiAgICB9O1xuICB9LFxuICBjb21wdXRlZDoge1xuICAgIGNyZWF0ZWQoKSB7XG4gICAgICByZXR1cm4gdXRpbHMuZ2V0QXVkaXRDcmVhdGVkKHRoaXMubW9kZWwpO1xuICAgIH0sXG4gICAgdXBkYXRlZCgpIHtcbiAgICAgIHJldHVybiB1dGlscy5nZXRBdWRpdFVwZGF0ZWQodGhpcy5tb2RlbCk7XG4gICAgfSxcbiAgfSxcbiAgbWV0aG9kczoge1xuICAgIHZhbHVlTGFiZWxzKCkge1xuICAgICAgcmV0dXJuIHV0aWxzLnZhbHVlTGFiZWxzO1xuICAgIH0sXG4gICAgZ2V0UHJvcHNUb0Rpc3BsYXkoKSB7XG4gICAgICByZXR1cm4gdXRpbHMuZ2V0UHJvcHNUb0Rpc3BsYXkodGhpcy5tb2RlbC5vcHRpb25zKTtcbiAgICB9LFxuICB9LFxufTtcbjwvc2NyaXB0PlxuIiwiPHRlbXBsYXRlPlxuICA8UGFnZVxuICAgIDp0aXRsZT1cImBDb25uZWN0aW9uIC0gJHttb2RlbC5uYW1lIHx8ICcnfWBcIlxuICAgIDppbml0aW5nPVwiaW5pdGluZ1wiXG4gICAgOmluaXRpbmdTdWNjZXNzPVwiaW5pdGluZ1N1Y2Nlc3NcIlxuICAgIDpwcm9jZXNzaW5nPVwicHJvY2Vzc2luZ1wiXG4gICAgOm1lc3NhZ2U9XCJtZXNzYWdlXCJcbiAgICA6bWVzc2FnZVR5cGU9XCJtZXNzYWdlVHlwZVwiXG4gID5cbiAgICA8dGVtcGxhdGUgdi1zbG90OmJyZWFkY3J1bWJzPlxuICAgICAgPHEtYnJlYWRjcnVtYnMtZWwgbGFiZWw9XCJIb21lXCIgOnRvPVwiYC8ke3Byb2R1Y3ROYW1lfS9ob21lYFwiIC8+XG4gICAgICA8cS1icmVhZGNydW1icy1lbCBsYWJlbD1cIkNvbm5lY3Rpb25zXCIgOnRvPVwiYC8ke3Byb2R1Y3ROYW1lfS9jb25uZWN0aW9uc2BcIiAvPlxuICAgIDwvdGVtcGxhdGU+XG5cbiAgICA8dGVtcGxhdGUgdi1zbG90OnRpdGxlLXN1ZmZpeD5cbiAgICAgIDxJY29uIG5hbWU9XCJyZWZyZXNoXCIgQGNsaWNrPVwicmVmcmVzaFwiIGNsaWNrYWJsZSAvPlxuICAgICAgPEljb25NZW51PlxuICAgICAgICA8TWVudUl0ZW0gQGNsaWNrPVwiaGFuZGxlRWRpdFwiPkVkaXQ8L01lbnVJdGVtPlxuICAgICAgICA8IS0tICAgICAgICA8TWVudUl0ZW0gQGNsaWNrPVwiaGFuZGxlQ2hhbmdlT3duZXJcIj5DaGFuZ2UgT3duZXI8L01lbnVJdGVtPi0tPlxuICAgICAgICA8TWVudUl0ZW0gQGNsaWNrPVwiaGFuZGxlQ2xlYXJDYWNoZVwiPkNsZWFyIENhY2hlPC9NZW51SXRlbT5cbiAgICAgICAgPFNlcGFyYXRvciAvPlxuICAgICAgICA8IS0tICAgICAgICBUaGlzIGlzIG5vdCByZXF1aXJlZCBhcyB3ZSBkb24ndCBtYXNrIHRoZSB1c2VybmFtZS0tPlxuICAgICAgICA8IS0tICAgICAgICA8TWVudUl0ZW0gQGNsaWNrPVwidmlld1VzZXJuYW1lXCI+VmlldyBVc2VybmFtZTwvTWVudUl0ZW0+LS0+XG4gICAgICAgIDxNZW51SXRlbSBAY2xpY2s9XCJ2aWV3VXNhZ2
580VcIj5WaWV3IFVzYWdlPC9NZW51SXRlbT5cbiAgICAgICAgPE1lbnVJdGVtIHYtaWY9XCJtb2RlbC50eXBlID09PSAnc2ZkYydcIiBAY2xpY2s9XCJvcGVuU2ZkY1VJXCI+T3BlbiBTZmRjIFVJPC9NZW51SXRlbT5cbiAgICAgICAgPE1lbnVJdGVtIHYtaWY9XCJtb2RlbC50eXBlID09PSAnc2ZkYycgJiYgaXNUZW5hbnRBZG1pblwiIEBjbGljaz1cImhhbmRsZVJvdGF0ZUFjY2Vzc1Rva2VuXCI+Um90YXRlIEFjY2VzcyBUb2tlbjwvTWVudUl0ZW0+XG4gICAgICAgIDxNZW51SXRlbSBAY2xpY2s9XCJoYW5kbGVDbGVhclNlY3JldHNcIj5DbGVhciBTZWNyZXRzPC9NZW51SXRlbT5cbiAgICAgICAgPFNlcGFyYXRvciAvPlxuXG4gICAgICAgIDxTZXBhcmF0b3IgLz5cbiAgICAgICAgPE1lbnVJdGVtIEBjbGljaz1cImhhbmRsZURlbGV0ZVwiIGRhbmdlcj5EZWxldGU8L01lbnVJdGVtPlxuICAgICAgPC9JY29uTWVudT5cbiAgICA8L3RlbXBsYXRlPlxuICAgIDx0ZW1wbGF0ZSB2LXNsb3Q6dGl0bGUtZGVzYz5cbiAgICAgIDxJY29uUmVhZE9ubHkgOm1vZGVsPVwibW9kZWxcIiAvPlxuICAgICAgPFN5bmNTdGF0dXMgOnN0YXR1cz1cIm1vZGVsLnN0YXR1c1wiIDp0b29sdGlwPVwibW9kZWwubWVzc2FnZVwiIC8+XG4gICAgPC90ZW1wbGF0ZT5cblxuICAgIDxxLXRhYnMgaW5kaWNhdG9yLWNvbG9yPVwicHJpbWFyeVwiIGFsaWduPVwibGVmdFwiIHYtbW9kZWw9XCJjdXJyZW50VGFiXCIgZGVuc2UgY2xhc3Mgbm8tY2Fwcz5cbiAgICAgIDxxLXRhYiBuYW1lPVwiZGV0YWlsc1wiIGxhYmVsPVwiRGV0YWlsc1wiIC8+XG4gICAgPC9xLXRhYnM+XG5cbiAgICA8cS10YWItcGFuZWxzIGtlZXAtYWxpdmUgdi1tb2RlbD1cImN1cnJlbnRUYWJcIj5cbiAgICAgIDxxLXRhYi1wYW5lbCBuYW1lPVwiZGV0YWlsc1wiPlxuICAgICAgICA8Q29ubmVjdGlvbkRldGFpbHMgOm1vZGVsPVwibW9kZWxcIiBAZWRpdD1cImRpYWxvZ09wZW4gPSB0cnVlXCIgLz5cbiAgICAgIDwvcS10YWItcGFuZWw+XG4gICAgPC9xLXRhYi1wYW5lbHM+XG4gICAgPENvbm5lY3Rpb25EaWFsb2cgdi1tb2RlbD1cImRpYWxvZ09wZW5cIiA6Y29ubklkPVwiY29ubklkXCIgbW9kZT1cImVkaXRcIiBAb2s9XCJyZWZyZXNoXCIgQGNhbmNlbD1cImRpYWxvZ09wZW4gPSBmYWxzZVwiIC8+XG4gICAgPFRleHRWaWV3ZXJEaWFsb2cgdi1tb2RlbD1cInRleHRWaWV3ZXJPcGVuXCIgOmNvbnRlbnQ9XCJ0ZXh0Vmlld2VyQ29udGVudFwiIC8+XG4gICAgPFJlZlVzYWdlVmlld2VyRGlhbG9nIHYtbW9kZWw9XCJ1c2FnZVZpZXdlck9wZW5cIiA6bW9kZWw9XCJ1c2FnZVZpZXdlckNvbnRlbnRcIiA6dGl0bGU9XCJ1c2FnZVZpZXdlclRpdGxlXCIgLz5cbiAgPC9QYWdlPlxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCAqIGFzIGNvbW1vbkFwaSBmcm9tICdzcmMvc2VydmljZXMvY29tbW9uQXBpJztcbmltcG9ydCAqIGFzIHV0aWxzIGZyb20gJ3NyYy9zZXJ2aWNlcy91dGlscyc7XG5pbXBvcnQgbWl4aW5zIGZyb20gJ3NyYy9taXhpbnMvbWl4aW5zJztcbmltcG9ydCBDb25uZWN0aW9uRGV0YWlscyBmcm9tICcuL0Nvbm5lY3Rpb25EZXRhaWxzLnZ1ZSc7XG5pbXBvcnQgQ29ubmVjdGlvbkRpYWxvZyBmcm9tICcuL0Nvbm5lY3Rpb25EaWFsb2cudnVlJztcbmltcG9ydCBSZWZVc2FnZVZpZXdlckRpYWxvZyBmcm9tICcuL1JlZlVzYWdlVmlld2VyRGlhbG9nLnZ1ZSc7XG5pbXBvcnQge25vdGlmeUluZm99IGZyb20gJ3NyYy9zZXJ2aWNlcy91dGlscyc7XG5pbXBvcnQgKiBhcyBjb21tbm9uQXBpIGZyb20gJ3NyYy9zZXJ2aWNlcy9jb21tb25BcGknO1xuaW1wb3J0IEljb25SZWFkT25seSBmcm9tICdzcmMvY29tcG9uZW50cy9JY29uUmVhZE9ubHkudnVlJztcbmltcG9ydCBUZXh0Vmlld2VyRGlhbG9nIGZyb20gJ3NyYy9jb21wb25lbnRzL1RleHRWaWV3ZXJEaWFsb2cudnVlJztcbmltcG9ydCBTeW5jU3RhdHVzIGZyb20gJ3NyYy9jb21wb25lbnRzL1N5bmNTdGF0dXMudnVlJztcbmltcG9ydCAqIGFzIGFjY2VzcyBmcm9tICdAZGF0YXNlcnQvanMtdXRpbHMnO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIG1peGluczogW21peGluc10sXG5cbiAgY29tcG9uZW50czoge1xuICAgIENvbm5lY3Rpb25EaWFsb2csXG4gICAgQ29ubmVjdGlvbkRldGFpbHMsXG4gICAgUmVmVXNhZ2VWaWV3ZXJEaWFsb2csXG4gICAgSWNvblJlYWRPbmx5LFxuICAgIFRleHRWaWV3ZXJEaWFsb2csXG4gICAgU3luY1N0YXR1cyxcbiAgfSxcbiAgcHJvcHM6IHtcbiAgICBzaG93RW52czoge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgIH0sXG4gICAgc2hvd0pvYnM6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICB9LFxuICB9LFxuXG4gIGRhdGE6ICgpID0+ICh7XG4gICAgcHJvZ3Jlc3NPcGVuOiBmYWxzZSxcbiAgICBkaWFsb2dPcGVuOiBmYWxzZSxcbiAgICBkaWFsb2dNb2RlOiAnYWRkJyxcbiAgICBkaWFsb2dDb25uSWQ6IG51bGwsXG4gICAgZGlhbG9nRGF0YToge30sXG4gICAgaW5pdGluZ1N1Y2Nlc3M6IHRydWUsXG4gICAgbW9kZWw6IFtdLFxuICAgIGN1cnJlbnRUYWI6ICdkZXRhaWxzJyxcbiAgICBjb25uSWQ6ICcnLFxuICAgIHByb2R1Y3ROYW1lOiB1dGlscy5nZXRDdXJyZW50UHJvZHVjdCgpLFxuICAgIHRleHRWaWV3ZXJDb250ZW50OiAnJyxcbiAgICB0ZXh0Vmlld2VyT3BlbjogZmFsc2UsXG4gICAgdXNhZ2VWaWV3ZXJDb250ZW50OiBbXSxcbiAgICB1c2FnZVZpZXdlck9wZW46IGZhbHNlLFxuICAgIHVzYWdlVmlld2VyVGl0bGU6ICcnLFxuICB9KSxcblxuICBjcmVhdGVkKCkge1xuICAgIHRoaXMuY29ubklkID0gdGhpcy4kcm91dGUucGFyYW1zLmNvbm5JZDtcbiAgICB0aGlzLmluaXRGb3JtKGFzeW5jICgpID0+IHtcbiAgICAgIHRoaXMubW9kZWwgPSBhd2FpdCBjb21tb25BcGkuZ2V0Q29ubmVjdGlvbih0aGlzLmNvbm5JZCk7XG4gICAgfSk7XG4gIH0sXG4gIGNvbXB1dGVkOiB7XG4gICAgaGFzUmVhbHRhc2soKSB7XG4gICAgICByZXR1cm4gdXRpbHMuaGFzUmVhbHRhc2soKTtcbiAgICB9LFxuICAgIGlzVGVuYW50
580QWRtaW4oKSB7XG4gICAgICByZXR1cm4gdXRpbHMuaXNUZW5hbnRBZG1pbigpO1xuICAgIH0sXG4gIH0sXG4gIG1ldGhvZHM6IHtcbiAgICBhc3luYyByZWZyZXNoKCkge1xuICAgICAgdGhpcy5wcm9jZXNzRm9ybShhc3luYyAoKSA9PiB7XG4gICAgICAgIHRoaXMubW9kZWwgPSBhd2FpdCBjb21tb25BcGkuZ2V0Q29ubmVjdGlvbih0aGlzLmNvbm5JZCk7XG4gICAgICB9KTtcbiAgICB9LFxuXG4gICAgYXN5bmMgaGFuZGxlRGVsZXRlKCkge1xuICAgICAgY29uc3QgcmVjcyA9IFt0aGlzLm1vZGVsXTtcbiAgICAgIGNvbnN0IG1zZyA9XG4gICAgICAgIGBBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRoZSBmb2xsb3dpbmcgQ29ubmVjdGlvbj8gPC9icj4gJHt1dGlscy5nZXRFbnRpdHlOYW1lc0xpc3RGb3JEaWFsb2cocmVjcyl9YCArXG4gICAgICAgICdOb3RlIHRoYXQgaWYgQ29ubmVjdGlvbiBpcyByZWZlcmVuY2VkIGJ5IGVudGl0aWVzIGxpa2UgUmVhbHRhc2sgSm9icyBvciBSZWFsdGFzayBFbnZpcm9ubWVudHMsIHRoZW4gaXQgY2Fubm90IGJlIGRlbGV0ZWQgdW50aWwgYWxsIHJlZmVyZW5jZXMgYXJlIHJlbW92ZWQuJztcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdXRpbHMuY29uZmlybURlbGV0ZSgnRGVsZXRlIENvbm5lY3Rpb24/JywgbXNnKTtcblxuICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICB0aGlzLmhhbmRsZURlbGV0ZUFmdGVyQ29uZmlybSgpO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBoYW5kbGVEZWxldGVBZnRlckNvbmZpcm0oKSB7XG4gICAgICB0aGlzLnByb2Nlc3NpbmcgPSB0cnVlO1xuICAgICAgdGhpcy5wcm9jZXNzRm9ybShhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IGNvbW1vbkFwaS5kZWxldGVDb25uZWN0aW9ucyh7XG4gICAgICAgICAgcmVjb3JkczogW3tpZDogdGhpcy5tb2RlbC5pZH1dLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy4kcm91dGVyLmdvKC0xKTtcbiAgICAgICAgdXRpbHMubm90aWZ5U3VjY2VzcygnQ29ubmVjdGlvbiBoYXZlIGJlZW4gZGVsZXRlZCcpO1xuICAgICAgfSk7XG4gICAgfSxcblxuICAgIGhhbmRsZUVkaXQoKSB7XG4gICAgICB0aGlzLmRpYWxvZ0Nvbm5JZCA9IHRoaXMubW9kZWwuaWQ7XG4gICAgICB0aGlzLmRpYWxvZ01vZGUgPSAnZWRpdCc7XG4gICAgICB0aGlzLmRpYWxvZ09wZW4gPSB0cnVlO1xuICAgIH0sXG5cbiAgICB2aWV3VXNlcm5hbWUoKSB7XG4gICAgICB0aGlzLnByb2Nlc3MoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXNwID0gYXdhaXQgY29tbW9uQXBpLmdldENvbm5Vc2VybmFtZSh0aGlzLm1vZGVsLmlkKTtcbiAgICAgICAgdGhpcy50ZXh0Vmlld2VyQ29udGVudCA9IEpTT04uc3RyaW5naWZ5KHJlc3ApO1xuICAgICAgICB0aGlzLnRleHRWaWV3ZXJPcGVuID0gdHJ1ZTtcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICB2aWV3VXNhZ2UoKSB7XG4gICAgICB0aGlzLnByb2Nlc3MoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCB1c2FnZXMgPSBhd2FpdCBjb21tb25BcGkuZ2V0Q29ublVzYWdlKHRoaXMubW9kZWwuaWQpO1xuICAgICAgICBpZiAodXNhZ2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIG5vdGlmeUluZm8oJ1RoaXMgY29ubmVjdGlvbiBpcyBub3QgdXNlZCBhbnl3aGVyZScpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMudXNhZ2VWaWV3ZXJDb250ZW50ID0gdXNhZ2VzO1xuICAgICAgICAgIHRoaXMudXNhZ2VWaWV3ZXJPcGVuID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLnVzYWdlVmlld2VyVGl0bGUgPSBgQ29ubmVjdGlvbiBVc2FnZSAtICR7dGhpcy5tb2RlbC5uYW1lfWA7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBvcGVuU2ZkY1VJKCkge1xuICAgICAgdGhpcy5wcm9jZXNzKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgaW5mbyA9IGF3YWl0IGNvbW1vbkFwaS5nZXRFeHRlcm5hbExvZ2luSW5mbyh0aGlzLm1vZGVsLmlkKTtcbiAgICAgICAgd2luZG93Lm9wZW4oaW5mby51cmwsICdfbmV3dGFiJyk7XG4gICAgICB9KTtcbiAgICB9LFxuXG4gICAgYXN5bmMgaGFuZGxlQ2xlYXJTZWNyZXRzKCkge1xuICAgICAgY29uc3QgcmVjcyA9IFt0aGlzLm1vZGVsXTtcbiAgICAgIHRoaXMubWVzc2FnZSA9IG51bGw7XG4gICAgICBjb25zdCBtc2cgPVxuICAgICAgICBgQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGNsZWFyIHRoZSBzZWNyZXRzIGZvciBmb2xsb3dpbmcgQ29ubmVjdGlvbnM/IDwvYnI+ICR7dXRpbHMuZ2V0RW50aXR5TmFtZXNMaXN0Rm9yRGlhbG9nKHJlY3MpfVxcblxcbmAgK1xuICAgICAgICAnT25jZSBjbGVhcmVkLCB0aGlzIGNvbm5lY3Rpb24gd2lsbCBub3QgYmUgYWJsZSB0byBiZSB1c2VkIHRpbGwgc2VjcmV0cyBhcmUgc3BlY2lmaWVkIGFnYWluLic7XG5cbiAgICAgIGNvbnN0IGNvbmZpcm1lZCA9IGF3YWl0IHV0aWxzLmNvbmZpcm1EYW5nZXIoJ0NsZWFyIFNlY3JldHM/JywgbXNnLCAnWWVzLCBDbGVhcicpO1xuICAgICAgaWYgKCFjb25maXJtZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5wcm9jZXNzRm9ybShhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBjb21tb25BcGkuY2xlYXJTZWNyZXRzKHtyZWNvcmRzOiBbe2lkOiB0aGlzLm1vZGVsLmlkfV19KTtcbiAgICAgICAgdXRpbHMubm90aWZ5U3VjY2VzcyhyZXNwLm1lc3NhZ2UpO1xuICAgICAgICB0aGlzLnJlZnJlc2goKTtcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBhc3luYyBoYW5kbGVDbGVhckNhY2hlKCkge1xuICAgICAgdGhpcy5tZXNzYWdlID0gbnVsbDtcbiAgICAgIGNvbnN0IG1zZyA9ICdBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gY2xlYXIgdGhlIGNhY2hlPyc7XG4gICAgICBjb25zdCBjb25maXJtZWQgPSBhd2FpdCB1dGlscy5zaG93Q29uZmlybSgnQ2xlYXIgQ2FjaGU/JywgbXNnLCB7b2tMYWJlbDogJ1llcywgQ2xlYXInfSk7XG4gICAgICBpZiAoIWNvbmZpcm1lZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHJldHVybi
580B0aGlzLnByb2Nlc3NGb3JtKGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgY29tbW5vbkFwaS5jbGVhckNhY2hlKHtyZWNvcmRzOiBbe2lkOiB0aGlzLm1vZGVsLmlkfV19KTtcbiAgICAgICAgdXRpbHMubm90aWZ5U3VjY2VzcygnQ2FjaGUgaGFzIGJlZW4gY2xlYXJlZCcpO1xuICAgICAgfSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGhhbmRsZVJvdGF0ZUFjY2Vzc1Rva2VuKCkge1xuICAgICAgdGhpcy5tZXNzYWdlID0gbnVsbDtcbiAgICAgIGNvbnN0IG1zZyA9XG4gICAgICAgICdBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gcm90YXRlIHRoZSBhY2Nlc3MgdG9rZW4gZm9yIHRoaXMgQ29ubmVjdGlvbj8gJyArXG4gICAgICAgICdUaGlzIHdpbGwgY2FsbCBTYWxlc2ZvcmNlIHRvIHJlbmV3IHRoZSBzZXNzaW9uLCByZS1pc3N1aW5nIHRoZSBhY2Nlc3MgdG9rZW4gKGFuZCByZWZyZXNoIHRva2VuLCBpZiBSZWZyZXNoIFRva2VuIFJvdGF0aW9uICcgK1xuICAgICAgICAnaXMgZW5hYmxlZCkgYW5kIHNhdmluZyB0aGUgbmV3IHRva2Vucy4nO1xuICAgICAgY29uc3QgY29uZmlybWVkID0gYXdhaXQgdXRpbHMuc2hvd0NvbmZpcm0oJ1JvdGF0ZSBBY2Nlc3MgVG9rZW4/JywgbXNnLCB7b2tMYWJlbDogJ1llcywgUm90YXRlJ30pO1xuICAgICAgaWYgKCFjb25maXJtZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5wcm9jZXNzRm9ybShhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBjb21tb25BcGkucm90YXRlQWNjZXNzVG9rZW4odGhpcy5tb2RlbC5pZCk7XG4gICAgICAgIHV0aWxzLm5vdGlmeVN1Y2Nlc3MocmVzcC5tZXNzYWdlKTtcbiAgICAgICAgdGhpcy5yZWZyZXNoKCk7XG4gICAgICB9KTtcbiAgICB9LFxuICB9LFxufTtcbjwvc2NyaXB0PlxuIl0sIm5hbWVzIjpbIl9zZmNfbWFpbiIsInV0aWxzLmdldEF1ZGl0Q3JlYXRlZCIsInV0aWxzLmdldEF1ZGl0VXBkYXRlZCIsInV0aWxzLnZhbHVlTGFiZWxzIiwidXRpbHMuZ2V0UHJvcHNUb0Rpc3BsYXkiLCJfY3JlYXRlQmxvY2siLCJfY3JlYXRlVk5vZGUiLCJ1dGlscy5nZXRDdXJyZW50UHJvZHVjdCIsImNvbW1vbkFwaS5nZXRDb25uZWN0aW9uIiwidXRpbHMuaGFzUmVhbHRhc2siLCJ1dGlscy5pc1RlbmFudEFkbWluIiwidXRpbHMuZ2V0RW50aXR5TmFtZXNMaXN0Rm9yRGlhbG9nIiwidXRpbHMuY29uZmlybURlbGV0ZSIsImNvbW1vbkFwaS5kZWxldGVDb25uZWN0aW9ucyIsInV0aWxzLm5vdGlmeVN1Y2Nlc3MiLCJjb21tb25BcGkuZ2V0Q29ublVzZXJuYW1lIiwiY29tbW9uQXBpLmdldENvbm5Vc2FnZSIsImNvbW1vbkFwaS5nZXRFeHRlcm5hbExvZ2luSW5mbyIsInV0aWxzLmNvbmZpcm1EYW5nZXIiLCJjb21tb25BcGkuY2xlYXJTZWNyZXRzIiwidXRpbHMuc2hvd0NvbmZpcm0iLCJjb21tbm9uQXBpLmNsZWFyQ2FjaGUiLCJjb21tb25BcGkucm90YXRlQWNjZXNzVG9rZW4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWlGQSxNQUFLQSxjQUFVO0FBQUEsRUFDYixRQUFRLENBQUMsTUFBTTtBQUFBLEVBQ2YsWUFBWSxFQUFDLFlBQVc7QUFBQSxFQUN4QixPQUFPO0FBQUEsSUFDTCxPQUFPO0FBQUE7RUFHVCxPQUFPO0FBQ0wsV0FBTztBQUFBLE1BQ0wsU0FBUztBQUFBO0VBRWI7QUFBQSxFQUNBLFVBQVU7QUFBQSxJQUNSLFVBQVU7QUFDUixhQUFPQyxnQkFBc0IsS0FBSyxLQUFLO0FBQUEsSUFDekM7QUFBQSxJQUNBLFVBQVU7QUFDUixhQUFPQyxnQkFBc0IsS0FBSyxLQUFLO0FBQUEsSUFDekM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
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.