@softheon/armature 10.33.3 → 10.34.3-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (193) hide show
  1. package/README.md +81 -78
  2. package/bundles/softheon-armature.umd.js +88 -75
  3. package/bundles/softheon-armature.umd.js.map +1 -1
  4. package/bundles/softheon-armature.umd.min.js +1 -1
  5. package/bundles/softheon-armature.umd.min.js.map +1 -1
  6. package/esm2015/lib/alert-banner/alert-banner-api.js +1 -1
  7. package/esm2015/lib/alert-banner/alert-banner.module.js +1 -1
  8. package/esm2015/lib/alert-banner/components/alert-banner/alert-banner.component.js +1 -1
  9. package/esm2015/lib/alert-banner/models/alert-banner-config.js +1 -1
  10. package/esm2015/lib/alert-banner/models/alert-banner-context.js +1 -1
  11. package/esm2015/lib/alert-banner/models/constants.js +1 -1
  12. package/esm2015/lib/alert-banner/services/alert-banner.service.js +1 -1
  13. package/esm2015/lib/armature.module.js +1 -1
  14. package/esm2015/lib/base-components/base-component-api.js +1 -1
  15. package/esm2015/lib/base-components/base-component.module.js +1 -1
  16. package/esm2015/lib/base-components/sof-alert/sof-alert.component.js +1 -1
  17. package/esm2015/lib/base-components/sof-banner/sof-banner.component.js +1 -1
  18. package/esm2015/lib/base-components/sof-modal/sof-modal.component.js +1 -1
  19. package/esm2015/lib/base-components/sof-progress-bar/sof-progress-bar.component.js +1 -1
  20. package/esm2015/lib/core/client-generated/api/session.service.js +1 -1
  21. package/esm2015/lib/core/client-generated/configuration.js +1 -1
  22. package/esm2015/lib/core/client-generated/encoder.js +1 -1
  23. package/esm2015/lib/core/client-generated/model/applicationUserModel.js +1 -1
  24. package/esm2015/lib/core/client-generated/model/assertedUserModel.js +1 -1
  25. package/esm2015/lib/core/client-generated/model/brandingModel.js +1 -1
  26. package/esm2015/lib/core/client-generated/model/errorModel.js +1 -1
  27. package/esm2015/lib/core/client-generated/model/folderLink.js +1 -1
  28. package/esm2015/lib/core/client-generated/model/identityProfile.js +1 -1
  29. package/esm2015/lib/core/client-generated/model/models.js +1 -1
  30. package/esm2015/lib/core/client-generated/model/oAuthModel.js +1 -1
  31. package/esm2015/lib/core/client-generated/model/preferencesRow.js +1 -1
  32. package/esm2015/lib/core/client-generated/model/rolesRow.js +1 -1
  33. package/esm2015/lib/core/client-generated/model/sessionGetResponseModel.js +1 -1
  34. package/esm2015/lib/core/client-generated/model/sessionPostRequestModel.js +1 -1
  35. package/esm2015/lib/core/client-generated/model/sessionPostResponseModel.js +1 -1
  36. package/esm2015/lib/core/client-generated/model/sessionPutRequestModel.js +1 -1
  37. package/esm2015/lib/core/client-generated/model/sessionPutResponseModel.js +1 -1
  38. package/esm2015/lib/core/client-generated/model/sessionResponseModel.js +1 -1
  39. package/esm2015/lib/core/client-generated/model/settingsProfile.js +1 -1
  40. package/esm2015/lib/core/client-generated/model/themePaletteColorsModel.js +1 -1
  41. package/esm2015/lib/core/client-generated/model/themePaletteModel.js +1 -1
  42. package/esm2015/lib/core/client-generated/model/trackingModel.js +1 -1
  43. package/esm2015/lib/core/client-generated/model/validationRecordsRow.js +1 -1
  44. package/esm2015/lib/core/client-generated/variables.js +1 -1
  45. package/esm2015/lib/core/components/app-template/app-template.component.js +1 -1
  46. package/esm2015/lib/core/functions/guid.js +1 -1
  47. package/esm2015/lib/core/functions/naming-convention.js +1 -1
  48. package/esm2015/lib/core/initializer/abstract-startup-service.js +1 -1
  49. package/esm2015/lib/core/initializer/initializer.service.js +2 -2
  50. package/esm2015/lib/core/interceptors/armature-auth-token-append.interceptor.js +1 -1
  51. package/esm2015/lib/core/models/base-config.js +1 -1
  52. package/esm2015/lib/core/models/constants.js +1 -1
  53. package/esm2015/lib/core/models/data-store-config.js +1 -1
  54. package/esm2015/lib/core/models/header-config.js +1 -1
  55. package/esm2015/lib/core/models/http-verbs.js +1 -1
  56. package/esm2015/lib/core/models/navigation-config.js +1 -1
  57. package/esm2015/lib/core/models/oidc-auth-settings.js +1 -1
  58. package/esm2015/lib/core/models/route-path.js +1 -1
  59. package/esm2015/lib/core/models/session-config.js +1 -1
  60. package/esm2015/lib/core/models/styles.js +1 -1
  61. package/esm2015/lib/core/models/typed-session.js +1 -1
  62. package/esm2015/lib/core/models/user-entity-service-config.js +1 -1
  63. package/esm2015/lib/core/services/authorization.service.js +8 -4
  64. package/esm2015/lib/core/services/banner.service.js +1 -1
  65. package/esm2015/lib/core/services/base-config.service.js +1 -1
  66. package/esm2015/lib/core/services/custom-auth-config.service.js +1 -1
  67. package/esm2015/lib/core/services/default-config.service.js +1 -1
  68. package/esm2015/lib/core/services/session.service.js +1 -1
  69. package/esm2015/lib/core/services/user-entity.service.js +1 -1
  70. package/esm2015/lib/distributed-cache/client-generated/api/api.js +1 -1
  71. package/esm2015/lib/distributed-cache/client-generated/api/cache.service.js +1 -1
  72. package/esm2015/lib/distributed-cache/client-generated/configuration.js +1 -1
  73. package/esm2015/lib/distributed-cache/client-generated/encoder.js +1 -1
  74. package/esm2015/lib/distributed-cache/client-generated/model/cacheExpirationType.js +1 -1
  75. package/esm2015/lib/distributed-cache/client-generated/model/createCacheEntryRequestModel.js +1 -1
  76. package/esm2015/lib/distributed-cache/client-generated/model/models.js +1 -1
  77. package/esm2015/lib/distributed-cache/client-generated/model/retrieveCacheEntryResponseModel.js +1 -1
  78. package/esm2015/lib/distributed-cache/client-generated/model/updateCacheEntryRequestModel.js +1 -1
  79. package/esm2015/lib/distributed-cache/client-generated/variables.js +1 -1
  80. package/esm2015/lib/distributed-cache/distributed-cache-api.js +1 -1
  81. package/esm2015/lib/distributed-cache/distributed-cache.module.js +1 -1
  82. package/esm2015/lib/distributed-cache/models/constants.js +1 -1
  83. package/esm2015/lib/distributed-cache/models/policy-person.js +1 -1
  84. package/esm2015/lib/distributed-cache/services/server-cache.service.js +1 -1
  85. package/esm2015/lib/error/components/error-common/error-common.component.js +1 -1
  86. package/esm2015/lib/error/error-api.js +1 -1
  87. package/esm2015/lib/error/error.module.js +1 -1
  88. package/esm2015/lib/error/models/error-common-config.js +1 -1
  89. package/esm2015/lib/faq/components/faq/faq.component.js +1 -1
  90. package/esm2015/lib/faq/faq-api.js +1 -1
  91. package/esm2015/lib/faq/faq.module.js +1 -1
  92. package/esm2015/lib/faq/models/faq-config.js +1 -1
  93. package/esm2015/lib/faq/models/faq.js +1 -1
  94. package/esm2015/lib/footer/components/footer/footer.component.js +1 -1
  95. package/esm2015/lib/footer/components/site-map/site-map.component.js +1 -1
  96. package/esm2015/lib/footer/footer-api.js +1 -1
  97. package/esm2015/lib/footer/footer.module.js +1 -1
  98. package/esm2015/lib/footer/models/enum/site-map-direction.js +1 -1
  99. package/esm2015/lib/footer/models/footer-config.js +1 -1
  100. package/esm2015/lib/footer/models/site-map-models.js +1 -1
  101. package/esm2015/lib/forms/components/sof-address/sof-address.component.js +1 -1
  102. package/esm2015/lib/forms/directives/alphanumeric/alphanumeric.directive.js +1 -1
  103. package/esm2015/lib/forms/directives/letters-only/letters-only.directive.js +1 -1
  104. package/esm2015/lib/forms/directives/numbers-only/numbers-only.directive.js +1 -1
  105. package/esm2015/lib/forms/forms-api.js +1 -1
  106. package/esm2015/lib/forms/forms.module.js +1 -1
  107. package/esm2015/lib/forms/models/address.js +1 -1
  108. package/esm2015/lib/forms/models/constants.js +1 -1
  109. package/esm2015/lib/forms/models/county.js +1 -1
  110. package/esm2015/lib/forms/models/enums/states.js +1 -1
  111. package/esm2015/lib/forms/pipes/phone-format.pipe.js +1 -1
  112. package/esm2015/lib/forms/services/alert.service.js +1 -1
  113. package/esm2015/lib/header/components/header/header.component.js +1 -1
  114. package/esm2015/lib/header/components/mobile-header-menu/mobile-header-menu.component.js +1 -1
  115. package/esm2015/lib/header/header-api.js +1 -1
  116. package/esm2015/lib/header/header.module.js +1 -1
  117. package/esm2015/lib/header/models/header-auth.settings.js +1 -1
  118. package/esm2015/lib/header/models/header-language.settings.js +1 -1
  119. package/esm2015/lib/header/models/header-theme.settings.js +1 -1
  120. package/esm2015/lib/header/models/header.settings.js +1 -1
  121. package/esm2015/lib/header/models/mobile-header-nav.settings.js +1 -1
  122. package/esm2015/lib/navigation/components/navigation/navigation.component.js +72 -64
  123. package/esm2015/lib/navigation/models/nav-theme.settings.js +1 -1
  124. package/esm2015/lib/navigation/models/nav.settings.js +1 -1
  125. package/esm2015/lib/navigation/models/navigation.js +1 -1
  126. package/esm2015/lib/navigation/navigation-api.js +1 -1
  127. package/esm2015/lib/navigation/navigation.module.js +1 -1
  128. package/esm2015/lib/oauth/models/constants.js +1 -1
  129. package/esm2015/lib/oauth/models/generated/accountManagementAssertionModel.js +1 -1
  130. package/esm2015/lib/oauth/models/generated/accountManagementRefreshRequestModel.js +1 -1
  131. package/esm2015/lib/oauth/models/generated/accountManagementResponseModel.js +1 -1
  132. package/esm2015/lib/oauth/models/generated/coverageDetail.js +1 -1
  133. package/esm2015/lib/oauth/models/generated/finance.js +1 -1
  134. package/esm2015/lib/oauth/models/generated/iSsoResponseModel.js +1 -1
  135. package/esm2015/lib/oauth/models/generated/iSsoResponseModelAccountManagementAssertionModel.js +1 -1
  136. package/esm2015/lib/oauth/models/generated/person.js +1 -1
  137. package/esm2015/lib/oauth/models/generated/policy.js +1 -1
  138. package/esm2015/lib/oauth/models/generated/refreshResponseModel.js +1 -1
  139. package/esm2015/lib/oauth/models/hybrid-saml-oauth-config.js +1 -1
  140. package/esm2015/lib/oauth/oauth-api.js +1 -1
  141. package/esm2015/lib/oauth/oauth.module.js +1 -1
  142. package/esm2015/lib/oauth/services/hybrid-saml-oauth.service.js +1 -1
  143. package/esm2015/lib/rbac/directives/rbac-action.directive.js +1 -1
  144. package/esm2015/lib/rbac/models/access-token-claims.js +1 -1
  145. package/esm2015/lib/rbac/models/constants.js +1 -1
  146. package/esm2015/lib/rbac/models/decoded-access-token.js +1 -1
  147. package/esm2015/lib/rbac/models/rbac-config.js +1 -1
  148. package/esm2015/lib/rbac/models/role-access.js +1 -1
  149. package/esm2015/lib/rbac/rbac-api.js +1 -1
  150. package/esm2015/lib/rbac/rbac.module.js +1 -1
  151. package/esm2015/lib/rbac/services/ar-role-nav.service.js +1 -1
  152. package/esm2015/lib/rbac/services/oauth2-role.service.js +1 -1
  153. package/esm2015/lib/rbac/services/role-nav.service.js +1 -1
  154. package/esm2015/lib/rum/models/arm-error.js +1 -1
  155. package/esm2015/lib/rum/models/rum-config.js +1 -1
  156. package/esm2015/lib/rum/rum-api.js +1 -1
  157. package/esm2015/lib/rum/rum.module.js +1 -1
  158. package/esm2015/lib/rum/services/rum.service.js +1 -1
  159. package/esm2015/lib/rum/services/shared-error.service.js +1 -1
  160. package/esm2015/lib/rum/services/softheon-error-handler.service.js +1 -1
  161. package/esm2015/lib/saml/components/redirect-saml/redirect-saml.component.js +1 -1
  162. package/esm2015/lib/saml/models/i-saml-request.js +1 -1
  163. package/esm2015/lib/saml/models/i-saml-response.js +1 -1
  164. package/esm2015/lib/saml/models/redirect-saml-request.js +1 -1
  165. package/esm2015/lib/saml/models/sso-gateway-model.js +1 -1
  166. package/esm2015/lib/saml/saml-api.js +1 -1
  167. package/esm2015/lib/saml/saml.module.js +1 -1
  168. package/esm2015/lib/saml/services/entry/abstract-saml-entry.service.js +1 -1
  169. package/esm2015/lib/saml/services/entry/sso-gateway-entry.service.js +1 -1
  170. package/esm2015/lib/saml/services/send-off/abstract-saml.service.js +1 -1
  171. package/esm2015/lib/saml/services/send-off/saml.service.js +1 -1
  172. package/esm2015/lib/sof-pipe/constants/constants.js +1 -1
  173. package/esm2015/lib/sof-pipe/models/sof-date-pipe-format.js +1 -1
  174. package/esm2015/lib/sof-pipe/pipes/sof-blank/sof-blank.pipe.js +1 -1
  175. package/esm2015/lib/sof-pipe/pipes/sof-date/sof-date.pipe.js +1 -1
  176. package/esm2015/lib/sof-pipe/pipes/sof-ssn/sof-ssn.pipe.js +1 -1
  177. package/esm2015/lib/sof-pipe/sof-pipe.api.js +1 -1
  178. package/esm2015/lib/sof-pipe/sof-pipe.module.js +1 -1
  179. package/esm2015/lib/theming/directives/css-override.directive.js +1 -1
  180. package/esm2015/lib/theming/models/css-override.js +1 -1
  181. package/esm2015/lib/theming/services/theme.service.js +1 -1
  182. package/esm2015/lib/theming/theme-api.js +1 -1
  183. package/esm2015/lib/theming/theme.module.js +1 -1
  184. package/esm2015/public-api.js +2 -1
  185. package/esm2015/softheon-armature.js +8 -9
  186. package/fesm2015/softheon-armature.js +81 -69
  187. package/fesm2015/softheon-armature.js.map +1 -1
  188. package/lib/core/services/authorization.service.d.ts +1 -1
  189. package/lib/navigation/components/navigation/navigation.component.d.ts +12 -8
  190. package/package.json +2 -2
  191. package/public-api.d.ts +1 -0
  192. package/softheon-armature.d.ts +7 -8
  193. package/softheon-armature.metadata.json +1 -1
@@ -380,27 +380,6 @@ export class ArmatureNavigationComponent {
380
380
  childNode.visited = true;
381
381
  }
382
382
  }
383
- /** Initializes the basic nav settings */
384
- initBasicSettings() {
385
- this.settings.fontAwesomeMenuIcon = this.settings.fontAwesomeMenuIcon || 'fas fa-angle-double-left';
386
- this.settings.fontAwesomeMenuIconClosed = this.settings.fontAwesomeMenuIconClosed || 'fas fa-angle-double-right';
387
- this.settings.allowNavToggle = this.settings.allowNavToggle == null ? true : this.settings.allowNavToggle;
388
- this.settings.mainMenuText ? this.mainMenuText = this.settings.mainMenuText : this.mainMenuText = 'Main Menu';
389
- this.settings.headerHeight = this.settings.headerHeight || 60;
390
- this.settings.menuButtonSRText = this.settings.menuButtonSRText || 'Menu Button';
391
- this.settings.menuStyle = this.settings.menuStyle || 'static';
392
- this.settings.displayNumbers = this.settings.displayNumbers == null ? true : this.settings.displayNumbers;
393
- this.settings.progressSectionCompleteIcon = this.settings.progressSectionCompleteIcon || 'fas fa-check-circle';
394
- this.settings.progressSectionFutureIcon = this.settings.progressSectionFutureIcon || 'far fa-circle';
395
- this.settings.progressSectionCurrentIcon = this.settings.progressSectionCurrentIcon || 'fas fa-circle';
396
- this.settings.progressMenuCompleteIcon = this.settings.progressMenuCompleteIcon || 'far fa-check';
397
- this.settings.showProgressBar = this.settings.showProgressBar == null ? true : this.settings.showProgressBar;
398
- this.settings.sideNavWidthDesktop = this.settings.sideNavWidthDesktop || '350';
399
- this.settings.sideNavWidthMobile = this.settings.sideNavWidthMobile || '350';
400
- this.settings.overrideNavigation = this.settings.overrideNavigation || false;
401
- this.settings.progressMenuWidth = this.settings.progressMenuWidth || '280';
402
- this.settings.useCustomMobileFooter = this.settings.useCustomMobileFooter != null ? this.settings.useCustomMobileFooter : false;
403
- }
404
383
  /**
405
384
  * Closes the expansion panel and navigates to the given node
406
385
  * @param el The mat expansion panel
@@ -410,29 +389,35 @@ export class ArmatureNavigationComponent {
410
389
  el.close();
411
390
  this.navigate(this.navigationData[index].route);
412
391
  }
413
- /** Initializes the advanced nav settings */
414
- initAdvancedSettings() {
415
- this.advancedSettings.topGapDesktop = this.advancedSettings.topGapDesktop || 0;
416
- this.advancedSettings.topGapMobile = this.advancedSettings.topGapMobile || this.settings.headerHeight;
417
- this.advancedSettings.marginTopDesktop = this.advancedSettings.marginTopDesktop || 0;
418
- this.advancedSettings.marginTopMobile = this.advancedSettings.marginTopMobile || 0;
392
+ /**
393
+ * Hides the message
394
+ */
395
+ hide() {
396
+ this.showMessage = false;
419
397
  }
420
- /** Initializes the nav theme settings */
421
- initThemeSettings() {
422
- this.themeSettings.contentBgColor ? this.setThemeColor('content-bg-color', this.themeSettings.contentBgColor) : undefined;
423
- this.themeSettings.fontColor ? this.setThemeColor('font-color', this.themeSettings.fontColor) : undefined;
424
- this.themeSettings.fontColor = this.themeSettings.fontColor || '#000';
425
- this.themeSettings.mobileBgColor = this.themeSettings.mobileBgColor || '#ffffff';
426
- this.themeSettings.bgGradientColor1 ? this.setThemeColor('bg-gradient-color-1', this.themeSettings.bgGradientColor1) : undefined;
427
- this.themeSettings.bgGradientColor2 ? this.setThemeColor('bg-gradient-color-2', this.themeSettings.bgGradientColor2) : undefined;
428
- this.themeSettings.borderRightColor ? this.setThemeColor('border-right-color', this.themeSettings.borderRightColor) : undefined;
429
- this.themeSettings.listBorderColor ? this.setThemeColor('list-border-color', this.themeSettings.listBorderColor) : undefined;
430
- this.themeSettings.highlightGradient1 ? this.setThemeColor('highlight-gradient-1', this.themeSettings.highlightGradient1) : undefined;
431
- this.themeSettings.highlightGradient2 ? this.setThemeColor('highlight-gradient-2', this.themeSettings.highlightGradient2) : undefined;
432
- this.themeSettings.subHighlightBorderColor ?
433
- this.setThemeColor('sub-highlight-border-color', this.themeSettings.subHighlightBorderColor) : undefined;
434
- this.themeSettings.subHighlightBgColor ?
435
- this.setThemeColor('sub-highlight-bg-color', this.themeSettings.subHighlightBgColor) : undefined;
398
+ /**
399
+ * Logs out once user is authorized
400
+ * */
401
+ logOut() {
402
+ this.authorizationService.authorizeUser();
403
+ }
404
+ /**
405
+ * Closes mobile navigation after selection.
406
+ */
407
+ closeNavigationForMobile() {
408
+ if (this.mobileQuery.matches) {
409
+ this.sidenav.close();
410
+ }
411
+ }
412
+ /**
413
+ * Is the navigation selected
414
+ */
415
+ isNavSelected(node) {
416
+ return this.router.isActive(node.route, true);
417
+ }
418
+ /** Sets the width for the side nav */
419
+ setNavWidth(width) {
420
+ return width.includes('%') || width.includes('px') ? width : width + 'px';
436
421
  }
437
422
  /** Binds the stepper to the router */
438
423
  bindStepperToRoutes() {
@@ -474,33 +459,56 @@ export class ArmatureNavigationComponent {
474
459
  }
475
460
  }));
476
461
  }
477
- /**
478
- * Hides the message
479
- */
480
- hide() {
481
- this.showMessage = false;
482
- }
483
- /**
484
- * Logs out once user is authorized
485
- * */
486
- logOut() {
487
- this.authorizationService.authorizeUser();
462
+ /** Initializes the advanced nav settings */
463
+ initAdvancedSettings() {
464
+ this.advancedSettings.topGapDesktop = this.advancedSettings.topGapDesktop || 0;
465
+ this.advancedSettings.topGapMobile = this.advancedSettings.topGapMobile || this.settings.headerHeight;
466
+ this.advancedSettings.marginTopDesktop = this.advancedSettings.marginTopDesktop || 0;
467
+ this.advancedSettings.marginTopMobile = this.advancedSettings.marginTopMobile || 0;
488
468
  }
489
- /**
490
- * Is the navigation selected
491
- */
492
- isNavSelected(node) {
493
- return this.router.isActive(node.route, true);
469
+ /** Initializes the nav theme settings */
470
+ initThemeSettings() {
471
+ this.themeSettings.contentBgColor ? this.setThemeColor('content-bg-color', this.themeSettings.contentBgColor) : undefined;
472
+ this.themeSettings.fontColor ? this.setThemeColor('font-color', this.themeSettings.fontColor) : undefined;
473
+ this.themeSettings.fontColor = this.themeSettings.fontColor || '#000';
474
+ this.themeSettings.mobileBgColor = this.themeSettings.mobileBgColor || '#ffffff';
475
+ this.themeSettings.bgGradientColor1 ? this.setThemeColor('bg-gradient-color-1', this.themeSettings.bgGradientColor1) : undefined;
476
+ this.themeSettings.bgGradientColor2 ? this.setThemeColor('bg-gradient-color-2', this.themeSettings.bgGradientColor2) : undefined;
477
+ this.themeSettings.borderRightColor ? this.setThemeColor('border-right-color', this.themeSettings.borderRightColor) : undefined;
478
+ this.themeSettings.listBorderColor ? this.setThemeColor('list-border-color', this.themeSettings.listBorderColor) : undefined;
479
+ this.themeSettings.highlightGradient1 ? this.setThemeColor('highlight-gradient-1', this.themeSettings.highlightGradient1) : undefined;
480
+ this.themeSettings.highlightGradient2 ? this.setThemeColor('highlight-gradient-2', this.themeSettings.highlightGradient2) : undefined;
481
+ this.themeSettings.subHighlightBorderColor ?
482
+ this.setThemeColor('sub-highlight-border-color', this.themeSettings.subHighlightBorderColor) : undefined;
483
+ this.themeSettings.subHighlightBgColor ?
484
+ this.setThemeColor('sub-highlight-bg-color', this.themeSettings.subHighlightBgColor) : undefined;
494
485
  }
495
- /** Sets the width for the side nav */
496
- setNavWidth(width) {
497
- return width.includes('%') || width.includes('px') ? width : width + 'px';
486
+ /** Initializes the basic nav settings */
487
+ initBasicSettings() {
488
+ this.settings.fontAwesomeMenuIcon = this.settings.fontAwesomeMenuIcon || 'fas fa-angle-double-left';
489
+ this.settings.fontAwesomeMenuIconClosed = this.settings.fontAwesomeMenuIconClosed || 'fas fa-angle-double-right';
490
+ this.settings.allowNavToggle = this.settings.allowNavToggle == null ? true : this.settings.allowNavToggle;
491
+ this.settings.mainMenuText ? this.mainMenuText = this.settings.mainMenuText : this.mainMenuText = 'Main Menu';
492
+ this.settings.headerHeight = this.settings.headerHeight || 60;
493
+ this.settings.menuButtonSRText = this.settings.menuButtonSRText || 'Menu Button';
494
+ this.settings.menuStyle = this.settings.menuStyle || 'static';
495
+ this.settings.displayNumbers = this.settings.displayNumbers == null ? true : this.settings.displayNumbers;
496
+ this.settings.progressSectionCompleteIcon = this.settings.progressSectionCompleteIcon || 'fas fa-check-circle';
497
+ this.settings.progressSectionFutureIcon = this.settings.progressSectionFutureIcon || 'far fa-circle';
498
+ this.settings.progressSectionCurrentIcon = this.settings.progressSectionCurrentIcon || 'fas fa-circle';
499
+ this.settings.progressMenuCompleteIcon = this.settings.progressMenuCompleteIcon || 'far fa-check';
500
+ this.settings.showProgressBar = this.settings.showProgressBar == null ? true : this.settings.showProgressBar;
501
+ this.settings.sideNavWidthDesktop = this.settings.sideNavWidthDesktop || '350';
502
+ this.settings.sideNavWidthMobile = this.settings.sideNavWidthMobile || '350';
503
+ this.settings.overrideNavigation = this.settings.overrideNavigation || false;
504
+ this.settings.progressMenuWidth = this.settings.progressMenuWidth || '280';
505
+ this.settings.useCustomMobileFooter = this.settings.useCustomMobileFooter != null ? this.settings.useCustomMobileFooter : false;
498
506
  }
499
507
  }
500
508
  ArmatureNavigationComponent.decorators = [
501
509
  { type: Component, args: [{
502
510
  selector: 'sof-ar-navigation',
503
- template: "<div class=\"sof-ar-nav-container\"\r\n [style.top]=\"mobileQuery.matches && advancedSettings.topGapMobile ? advancedSettings.topGapMobile + 'px' : settings.headerHeight + 'px'\"\r\n [class.sof-ar-nav-mobile]=\"mobileQuery.matches\">\r\n <div *ngIf=\"showMessage\" m-a-0 fxLayout=\"row\" fxLayoutAlign=\"space-between center\" sws-alert--secondary role=\"alert\">\r\n <div fxLayout=\"row\" aria-hidden=\"true\">\r\n <i *ngIf=\"showCheckMark\" m-r-5 m-l-5 class=\"fas fa-check-circle icon-container\"></i>\r\n <p class=\"message-container\" m-r-5 m-l-5 [innerHtml]=\"message | translate\"></p>\r\n </div>\r\n <div fxLayout=\"column\">\r\n <button id=\"btnClose\" (click)=\"hide()\" mat-icon-button [attr.aria-label]=\"'common.close' | translate\">\r\n <span aria-hidden=\"true\">\r\n <i class=\"fal fa-times fa-lg\"></i>\r\n </span>\r\n </button>\r\n </div>\r\n </div>\r\n <button id=\"sof-ar-nav-btn-menu\" aria-label=\"Menu Button\" mat-icon-button [disableRipple]=\"true\"\r\n (click)=\"snav.toggle()\" class=\"sof-ar-nav-menu-btn\"\r\n [class.hidden]=\"!(mobileQuery.matches || settings.allowNavToggle) || settings.hideNavigation\">\r\n <span *ngIf=\"isNavOpen; else closedIcon\" aria-hidden=\"true\" class=\"sof-ar-nav-menu-icon\">\r\n <i class=\"{{settings.fontAwesomeMenuIcon}} menu-icon\"></i>\r\n </span>\r\n <ng-template #closedIcon>\r\n <span aria-hidden=\"true\" class=\"sof-ar-nav-menu-icon\">\r\n <i class=\"{{settings.fontAwesomeMenuIconClosed}} menu-icon\"></i>\r\n </span>\r\n </ng-template>\r\n <span class=\"sr-only\">{{settings.menuButtonSRText | translate}}</span>\r\n </button>\r\n\r\n <mat-sidenav-container autosize class=\"sof-ar-nav-sidenav-container\" [style.marginTop.px]=\"\r\n mobileQuery.matches ? advancedSettings.marginTopMobile : advancedSettings.marginTopDesktop\">\r\n <mat-sidenav [disableClose]=\"!mobileQuery.matches\" class=\"sof-ar-nav-sidenav\" #snav [mode]=\"mobileQuery.matches ? 'over' : 'side'\"\r\n [fixedInViewport]=\"mobileQuery.matches\" [fixedTopGap]=\"mobileQuery.matches ? advancedSettings.topGapMobile : advancedSettings.topGapDesktop\"\r\n [opened]=\"!mobileQuery.matches && !settings.hideNavigation && settings.menuStyle!='progress' \"\r\n [style.width]=\"mobileQuery.matches ? setNavWidth(settings.sideNavWidthMobile) : setNavWidth(settings.sideNavWidthDesktop)\"\r\n [ngStyle]=\"{background:mobileQuery.matches ? themeSettings?.mobileBgColor : undefined}\">\r\n <ng-container *ngIf=\"mobileQuery.matches && userName && !settings.customUserName\">\r\n <span class=\"user-name\">\r\n {{userName}}\r\n </span>\r\n </ng-container>\r\n <ng-container *ngIf=\"mobileQuery.matches && settings.customUserName\">\r\n <span class=\"user-name\">\r\n {{settings.customUserName | translate}}\r\n </span>\r\n </ng-container>\r\n <!-- Nav Header Content -->\r\n <ng-content select=\"[sof-ar-nav-header]\"> </ng-content>\r\n\r\n <!-- Static Navigation -->\r\n <div class=\"nav-content-item sidenav-background\" *ngIf=\"settings.menuStyle === 'static'\" [ngStyle]=\"{'padding-bottom.px': (footerItemCount*64)+128}\">\r\n <ng-container *ngIf=\"settings.menuStyle === 'static'\">\r\n <ng-container *ngFor=\"let nav of navigationData\">\r\n <ng-container *ngIf=\"nav?.subNodes?.length && !nav.hidden\">\r\n <mat-accordion>\r\n <mat-expansion-panel [expanded]=\"nav.expanded\">\r\n <mat-expansion-panel-header [ngClass]=\"{ 'sof-ar-nav-selected': isNavSelected(nav) }\">\r\n <!-- Desktop Nav -->\r\n <ng-container>\r\n <!-- If there is a route -->\r\n <ng-container *ngIf=\"nav?.route\">\r\n <mat-nav-list [disableRipple]=\"true\">\r\n <a class=\"nav-item\" mat-list-item [routerLink]=\"nav?.route\"\r\n [routerLinkActive]=\"['sof-ar-nav-active-route']\">\r\n <ng-container *ngIf=\"nav?.fontAwesomeIcon\">\r\n <span aria-hidden=\"true\" class=\"icon-styling\">\r\n <i class=\"{{nav?.fontAwesomeIcon}}\"></i>\r\n </span>\r\n </ng-container>\r\n <span class=\"sof-ar-nav-header-text\">{{nav.text | translate}}</span>\r\n </a>\r\n </mat-nav-list>\r\n </ng-container>\r\n <!-- If there is not a route -->\r\n <ng-container *ngIf=\"!nav?.route\">\r\n <mat-nav-list [disableRipple]=\"true\">\r\n <button id=\"sof-ar-nav-btn-node\" class=\"nav-item\" mat-list-item\r\n [routerLinkActive]=\"['sof-ar-nav-active-route']\">\r\n <ng-container *ngIf=\"nav?.fontAwesomeIcon\">\r\n <span aria-hidden=\"true\" class=\"icon-styling\">\r\n <i class=\"{{nav?.fontAwesomeIcon}}\"></i>\r\n </span>\r\n </ng-container>\r\n <span class=\"sof-ar-nav-header-text\">{{nav.text | translate}}</span>\r\n </button>\r\n </mat-nav-list>\r\n </ng-container>\r\n </ng-container>\r\n </mat-expansion-panel-header>\r\n <!-- Desktop SubNav -->\r\n <ng-container>\r\n <mat-nav-list [ngClass]=\"{ 'sof-ar-nav-selected': isNavSelected(subnav) }\" class=\"subnav-content\"\r\n [disableRipple]=\"true\" *ngFor=\"let subnav of nav?.subNodes\">\r\n <a mat-list-item [routerLinkActive]=\"['sof-ar-nav-sub-active-route']\" [routerLink]=\"subnav.route\">\r\n {{subnav.text | translate}}\r\n </a>\r\n </mat-nav-list>\r\n </ng-container>\r\n </mat-expansion-panel>\r\n </mat-accordion>\r\n </ng-container>\r\n <!-- If subnodes are not there -->\r\n <ng-container>\r\n <!-- Desktop Nav -->\r\n <ng-container *ngIf=\"!nav?.subNodes?.length && !nav?.hidden\">\r\n <!-- If there is a route -->\r\n <ng-container *ngIf=\"nav?.route\">\r\n <mat-nav-list \r\n [ngClass]=\"{ 'sof-ar-nav-selected': isNavSelected(nav) }\" class=\"nav-header\"\r\n [disableRipple]=\"true\">\r\n <a class=\"nav-item nav-item-margin\" mat-list-item [routerLink]=\"nav?.route\"\r\n [routerLinkActive]=\"['sof-ar-nav-active-route']\">\r\n <ng-container *ngIf=\"nav?.fontAwesomeIcon\">\r\n <span aria-hidden=\"true\" class=\"icon-styling\"><i class=\"{{nav?.fontAwesomeIcon}}\"></i></span>\r\n </ng-container>\r\n <span class=\"sof-ar-nav-header-text\">{{nav.text | translate}}</span>\r\n </a>\r\n </mat-nav-list>\r\n </ng-container>\r\n <!-- If there is not a route -->\r\n <ng-container *ngIf=\"!nav?.route\">\r\n <mat-nav-list [disableRipple]=\"true\">\r\n <button id=\"sof-ar-nav-btn-node\" class=\"nav-item\" mat-list-item\r\n [routerLinkActive]=\"['sof-ar-nav-active-route']\">\r\n <ng-container *ngIf=\"nav?.fontAwesomeIcon\">\r\n <span aria-hidden=\"true\" class=\"icon-styling\"><i class=\"{{nav?.fontAwesomeIcon}}\"></i></span>\r\n </ng-container>\r\n <span class=\"sof-ar-nav-header-text\">{{nav.text | translate}}</span>\r\n </button>\r\n </mat-nav-list>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n\r\n <!-- Stepper -->\r\n <mat-vertical-stepper *ngIf=\"settings.menuStyle === 'stepper'\" [selectedIndex]=\"selectedParentIndex\" #vertStepper\r\n [linear]=\"false\" class=\"sidenav-background\">\r\n <!-- Alternate step states for nav, icaons should always be white only worked with styles -->\r\n <ng-template matStepperIcon=\"create\">\r\n <span>\r\n <i class=\"fad fa-pencil-alt\" style=\"color: white !important\"></i>\r\n </span>\r\n </ng-template>\r\n <ng-template matStepperIcon=\"edit\">\r\n <span>\r\n <i class=\"fad fa-pencil-alt\" style=\"color: white !important\"></i>\r\n </span>\r\n </ng-template>\r\n <ng-template matStepperIcon=\"active\">\r\n <span>\r\n <i class=\"fad fa-pencil-alt\" style=\"color: white !important\"></i>\r\n </span>\r\n </ng-template>\r\n <ng-template matStepperIcon=\"done\">\r\n <span>\r\n <i class=\"fas fa-check\" style=\"color: white !important\"></i>\r\n </span>\r\n </ng-template>\r\n\r\n <!-- nav steps -->\r\n <ng-container *ngFor=\"let nav of navigationData; let i = index\">\r\n <mat-step *ngIf=\"!nav?.hidden\" state=\"{{ determineStepState(i, -1) }}\">\r\n <ng-template matStepLabel *ngIf=\"!nav.hidden\">\r\n <div id=\"divStep{{ i }}\" style=\"height: 72px\" fxLayout=\"row\" fxLayoutAlign=\"start center\"\r\n matTooltip=\"{{ nav.text | translate }}\" [matTooltipPosition]=\"'after'\" fxFlex=\"100%\">\r\n <a id=\"step{{ i }}\" fxFlex=\"100%\" class=\"mat-button step-link\" [routerLink]=\"nav.route\"\r\n [ngStyle]=\"{ color: themeSettings?.fontColor }\" [routerLinkActive]=\"['step-active']\">\r\n {{ nav.text | translate }}\r\n </a>\r\n </div>\r\n </ng-template>\r\n <p [innerHTML]=\"nav.stepContent | translate\"></p>\r\n <!-- sub nav -->\r\n <mat-vertical-stepper *ngIf=\"nav?.subNodes\" [selectedIndex]=\"selectedChildIndexes[i]\" [linear]=\"false\"\r\n #vertStepperInner>\r\n <!-- Alternate step states for sub nav, icons should always be white only worked with styles -->\r\n <ng-template matStepperIcon=\"create\">\r\n <span>\r\n <i class=\"fad fa-pencil-alt\" style=\"color: white !important\"></i>\r\n </span>\r\n </ng-template>\r\n <ng-template matStepperIcon=\"edit\">\r\n <span>\r\n <i class=\"fad fa-pencil-alt\" style=\"color: white !important\"></i>\r\n </span>\r\n </ng-template>\r\n <ng-template matStepperIcon=\"done\">\r\n <span>\r\n <i class=\"fas fa-check\" style=\"color: white !important\"></i>\r\n </span>\r\n </ng-template>\r\n <ng-template matStepperIcon=\"active\">\r\n <span>\r\n <i class=\"fas fa-pencil-alt\" style=\"color: white !important\"></i>\r\n </span>\r\n </ng-template>\r\n <ng-template matStepperIcon=\"none\">\r\n <span></span>\r\n </ng-template>\r\n <!-- sub nav steps -->\r\n <ng-container *ngFor=\"let subnav of nav?.subNodes; let j = index\">\r\n <mat-step state=\"{{ determineStepState(i, j) }}\" *ngIf=\"!subnav.hidden\" >\r\n <ng-template matStepLabel>\r\n <div id=\"divSubStep{{ i }}-{{ j }}\" style=\"height: 72px\" fxLayout=\"row\" fxLayoutAlign=\"start center\"\r\n matTooltip=\"{{ subnav.text | translate }}\" [matTooltipPosition]=\"'after'\" fxFlex=\"100%\">\r\n <a id=\"subStep{{ i }}-{{ j }}\" class=\"mat-button step-link\"\r\n [ngStyle]=\"{ color: themeSettings?.fontColor }\" [routerLink]=\"subnav.route\"\r\n [routerLinkActive]=\"['step-active']\">{{ subnav.text | translate }}</a>\r\n </div>\r\n </ng-template>\r\n <p [innerHTML]=\"subnav.stepContent | translate\"></p>\r\n </mat-step>\r\n </ng-container>\r\n \r\n </mat-vertical-stepper>\r\n </mat-step>\r\n </ng-container>\r\n \r\n </mat-vertical-stepper>\r\n\r\n <!-- Nav Footer -->\r\n <div class=\"nav-footer-item\">\r\n <ng-container *ngIf=\"settings.menuStyle === 'static'\">\r\n <ng-container *ngFor=\"let nav of footerNavigationData\">\r\n <ng-container>\r\n <!-- Desktop Nav -->\r\n <ng-container *ngIf=\"!nav?.subNodes?.length\">\r\n <!-- If there is a route -->\r\n <ng-container *ngIf=\"nav?.route\">\r\n <mat-nav-list class=\"nav-header\" [disableRipple]=\"true\">\r\n <a class=\"nav-item\" mat-list-item [routerLink]=\"nav?.route\"\r\n [routerLinkActive]=\"['sof-ar-nav-active-route']\">\r\n <ng-container *ngIf=\"nav?.fontAwesomeIcon\">\r\n <span aria-hidden=\"true\" class=\"icon-styling\"><i class=\"{{nav?.fontAwesomeIcon}}\"></i></span>\r\n </ng-container>\r\n {{nav.text | translate}}\r\n </a>\r\n </mat-nav-list>\r\n </ng-container>\r\n <!-- If there is not a route -->\r\n <ng-container *ngIf=\"!nav?.route\">\r\n <mat-nav-list>\r\n <button id=\"sof-ar-nav-btn-node\" class=\"nav-item\" mat-list-item\r\n [routerLinkActive]=\"['sof-ar-nav-active-route']\">\r\n <ng-container *ngIf=\"nav?.fontAwesomeIcon\">\r\n <span aria-hidden=\"true\" class=\"icon-styling\"><i class=\"{{nav?.fontAwesomeIcon}}\"></i></span>\r\n </ng-container>\r\n {{nav.text | translate}}\r\n </button>\r\n </mat-nav-list>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <ng-template [ngTemplateOutlet]=\"navigationFooter\">\r\n </ng-template>\r\n </ng-container>\r\n </div>\r\n\r\n <!-- the mobile progress menu-->\r\n <ng-container *ngIf=\"settings?.menuStyle === 'progress'\">\r\n <div class=\"sidenav-background\" [ngStyle]=\"{'padding-bottom.px': (footerItemCount*64)+128}\">\r\n <mat-accordion>\r\n <div *ngFor=\"let step of navigationData; let i = index\">\r\n <ng-container *ngIf=\"step.subNodes && step.subNodes.length > 0 && !step.hidden\">\r\n <mat-expansion-panel hideToggle class=\"progress-mobile-expansion-panel\"\r\n [disabled]=\"(!step.visited || step.isDisabled) && !settings.overrideNavigation\" (opened)=\"panelOpenState = true\"\r\n (closed)=\"panelOpenState = false\">\r\n <mat-expansion-panel-header>\r\n <mat-panel-title class=\"progress-mobile-panel-title\">\r\n <div style=\"width: -webkit-fill-available;\"\r\n [ngClass]=\"{'disabled':(!step.visited || step.isDisabled) && !settings.overrideNavigation && !step.complete,'color-primary':step.complete && step!=activeParentNode,'progress-menu-active':step===activeParentNode}\">\r\n <ng-template [ngTemplateOutlet]=\"progressParentNodeIcons\" [ngTemplateOutletContext]=\"{step:step}\">\r\n </ng-template>\r\n <span *ngIf=\"settings?.displayNumbers\">\r\n {{i < 10 ? \"0\" + (i + 1) + \". \" : i + \" . \" }}\r\n </span>\r\n <span class=\"nav-btn-text\">\r\n {{ step.text | translate }}\r\n </span>\r\n <span *ngIf=\"!panelOpenState\">\r\n <i class=\"fas fa-chevron-down panel-icon\"></i>\r\n </span>\r\n <span *ngIf=\"panelOpenState\">\r\n <i class=\"fas fa-chevron-up panel-icon\"></i>\r\n </span>\r\n </div>\r\n </mat-panel-title>\r\n <mat-panel-description>\r\n </mat-panel-description>\r\n </mat-expansion-panel-header>\r\n <!-- mobile sub menu -->\r\n <div class=\"progress-nav-menu\" *ngFor=\"let subNode of step.subNodes; let idx = index;\" [hidden]=\"step.subNodes[idx].hidden\">\r\n <button id=\"mobileMenu{{ idx }}\" mat-button class=\"step-link progress-menu-mobile-btn\"\r\n [ngClass]=\"{'color-primary':subNode.complete && subNode!=activeSubNode}\"\r\n [routerLinkActive]=\"['progress-menu-active']\" [ngStyle]=\"{ ' color': themeSettings?.fontColor }\"\r\n [routerLink]=\"subNode.route\" [disabled]=\"!subNode.visited && !settings.overrideNavigation\">\r\n <ng-template [ngTemplateOutlet]=\"progressSubNodeIcons\"\r\n [ngTemplateOutletContext]=\"{subNode:subNode}\">\r\n </ng-template>\r\n <span class=\"nav-menu-btn-text\" [ngClass]=\"{'disabled':(!subNode.visited) && !settings.overrideNavigation && !subNode.complete,'color-primary':subNode.complete,'progress-menu-active':subNode===activeSubNode}\">{{ subNode.text | translate }}</span>\r\n </button>\r\n </div>\r\n </mat-expansion-panel>\r\n </ng-container>\r\n <!-- if there are no subNodes -->\r\n <ng-container *ngIf=\"(!step.subNodes || step.subNodes.length==0) && !step.hidden\">\r\n <mat-expansion-panel #panel hideToggle (opened)=\"disablePanel(panel,i)\" class=\"progress-mobile-expansion-panel\"\r\n [disabled]=\"(!step.visited || step.isDisabled) && !settings.overrideNavigation\">\r\n <mat-expansion-panel-header>\r\n <mat-panel-title class=\"progress-mobile-panel-title\">\r\n <div [ngClass]=\"{'disabled':(!step.visited || step.isDisabled) && !settings.overrideNavigation && !step.complete,'color-primary':step.complete && step!=activeParentNode,'progress-menu-active':step===activeParentNode}\">\r\n <ng-template [ngTemplateOutlet]=\"progressParentNodeIcons\" [ngTemplateOutletContext]=\"{step:step}\">\r\n </ng-template>\r\n <span *ngIf=\"settings?.displayNumbers\">\r\n {{i < 10 ? \"0\" + (i + 1) + \". \" : i + \" . \" }}\r\n </span>\r\n <span class=\"nav-btn-text\">\r\n {{ step.text | translate }}\r\n </span>\r\n </div>\r\n </mat-panel-title>\r\n <mat-panel-description>\r\n </mat-panel-description>\r\n </mat-expansion-panel-header>\r\n </mat-expansion-panel>\r\n </ng-container>\r\n </div>\r\n </mat-accordion>\r\n </div>\r\n\r\n <!-- the progress menu language and logout buttons-->\r\n <div class=\"nav-footer-item progress-footer\">\r\n <ng-template [ngTemplateOutlet]=\"navigationFooter\">\r\n </ng-template>\r\n </div>\r\n </ng-container>\r\n </mat-sidenav>\r\n <mat-sidenav-content>\r\n <!-- Horizontal Progress -->\r\n <ng-container *ngIf=\"settings?.menuStyle === 'progress'\">\r\n <mat-progress-bar *ngIf=\"settings?.showProgressBar\" mode=\"determinate\" [value]=\"navProgressCount\"\r\n style=\"height: 9px\" color=\"accent\">\r\n </mat-progress-bar>\r\n <div fxHide.lt-md class=\"step-titles center\" fxLayout=\"row\" style=\"justify-content:center !important\" [class.hidden]=\"settings.hideNavigation\">\r\n <div *ngFor=\"let step of navigationData; let i = index\" class=\"horizontal-progress-div\">\r\n <ng-container *ngIf=\"!step.subNodes?.length && !step.hidden\">\r\n <button mat-button [routerLink]=\"step.route\"\r\n [disabled]=\"(!step.visited || step.isDisabled) && !settings.overrideNavigation\" class=\"progress-menu-btn\"\r\n [ngClass]=\"{'color-primary':step.complete && step!=activeParentNode,'progress-menu-active':step===activeParentNode}\">\r\n <ng-template [ngTemplateOutlet]=\"progressParentNodeIcons\" [ngTemplateOutletContext]=\"{step:step}\">\r\n </ng-template>\r\n <span *ngIf=\"settings?.displayNumbers\">\r\n {{i < 10 ? \"0\" + (i + 1) + \". \" : i + \" . \"}}\r\n </span>\r\n <span class=\"nav-btn-text\">{{ step.text | translate }}</span>\r\n </button>\r\n </ng-container>\r\n <!-- if there are subnodes create menus for each step -->\r\n <ng-container *ngIf=\"step.subNodes && step.subNodes.length && !step.hidden\">\r\n <button [ngClass]=\"{'color-primary':step.complete && step!=activeParentNode,'progress-menu-active':step===activeParentNode}\"\r\n mat-button [disabled]=\"(!step.visited || step.isDisabled) && !settings.overrideNavigation\" class=\"progress-menu-btn\"\r\n [matMenuTriggerFor]=\"menu\">\r\n <ng-template [ngTemplateOutlet]=\"progressParentNodeIcons\" [ngTemplateOutletContext]=\"{step:step}\">\r\n </ng-template>\r\n <span *ngIf=\"settings?.displayNumbers\">\r\n {{i < 10 ? \"0\" + (i + 1) + \". \" : i + \" . \"}}\r\n </span>\r\n <span class=\"nav-btn-text\">{{ step.text | translate }}</span>\r\n </button>\r\n <mat-menu #menu=\"matMenu\" class=\"sof-ar-mat-menu progress-menu-panel\">\r\n <div class=\"progress-nav-menu\" *ngFor=\"let subNode of step.subNodes; let idx = index;\" [ngStyle]=\"{width:settings.progressMenuWidth+'px'}\" [hidden]=\"step.subNodes[idx].hidden\">\r\n <button id=\"submenu{{ idx }}\" mat-button class=\"step-link progress-menu-btn\"\r\n [ngClass]=\"{'color-primary':subNode.complete && subNode!=activeSubNode,'disabled':!subNode.visited && !settings.overrideNavigation}\"\r\n [routerLinkActive]=\"['progress-menu-active']\" [ngStyle]=\"{ ' color': themeSettings?.fontColor }\"\r\n [routerLink]=\"subNode.route\" [disabled]=\"!subNode.visited && !settings.overrideNavigation\">\r\n <ng-template [ngTemplateOutlet]=\"progressSubNodeIcons\"\r\n [ngTemplateOutletContext]=\"{subNode:subNode}\">\r\n </ng-template>\r\n <span class=\"nav-menu-btn-text\">{{ subNode.text |translate }}</span>\r\n </button>\r\n </div>\r\n </mat-menu>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <div class=\"mobile-progress-container\" fxHide.gt-sm>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-content sof-ar-nav-content></ng-content>\r\n </mat-sidenav-content>\r\n </mat-sidenav-container>\r\n <!-- The progress menu parent node icon template-->\r\n <ng-template #progressParentNodeIcons let-step='step'>\r\n <span *ngIf=\"step.complete && step != activeParentNode\">\r\n <i class=\"{{ settings.progressSectionCompleteIcon }} color-primary progress-nav-icon\"></i>\r\n </span>\r\n <span *ngIf=\"step === activeParentNode\">\r\n <i class=\"{{ settings.progressSectionCurrentIcon }} color-primary progress-nav-icon\"></i>\r\n </span>\r\n <span *ngIf=\"!step.complete && step != activeParentNode\" [ngClass]=\"{'disabled':!step.visited && !settings.overrideNavigation}\">\r\n <i class=\"{{ settings.progressSectionFutureIcon }} progress-nav-icon\"></i>\r\n </span>\r\n </ng-template>\r\n <!-- The progress menu sub node icon template-->\r\n <ng-template #progressSubNodeIcons let-subNode='subNode'>\r\n <span *ngIf=\"subNode.complete &&activeSubNode !=subNode\">\r\n <i class=\"{{settings.progressMenuCompleteIcon}} color-primary progress-nav-icon\"></i>\r\n </span>\r\n <span *ngIf=\"activeSubNode ===subNode\">\r\n <i class=\"{{ settings.progressSectionCurrentIcon }} color-primary progress-nav-icon\"></i>\r\n </span>\r\n <span *ngIf=\"!subNode.complete &&activeSubNode !=subNode\" [ngClass]=\"{'disabled':!subNode.visited && !settings.overrideNavigation}\">\r\n <i class=\"{{ settings.progressSectionFutureIcon }} progress-nav-icon\"></i>\r\n </span>\r\n </ng-template>\r\n <!-- The navigation footer template for language and logout buttons -->\r\n <ng-template #navigationFooter>\r\n <ng-content select=\"[sof-ar-nav-mobile-footer]\"> </ng-content>\r\n <ng-container *ngIf=\"!settings.useCustomMobileFooter\">\r\n <!-- The language button -->\r\n <ng-container *ngIf=\"languageSettings?.displayLanguageOptions && languageSettings?.languages.length > 2 && mobileQuery.matches\">\r\n <button id=\"sof-ar-nav-lang-dropdown\" mat-stroked-button\r\n class=\"faded-button-50 language-button navigationFooter\" [matMenuTriggerFor]=\"headerLanguageMenu\"\r\n [attr.aria-label]=\"languageSettings.buttonText | translate\">\r\n <span aria-hidden=\"true\" class=\"icon-styling\">\r\n <i class=\"far fa-globe language-globe\"></i>\r\n </span>\r\n {{languageSettings.buttonText | translate}}\r\n </button>\r\n <mat-menu #headerLanguageMenu=\"matMenu\" class=\"sof-ar-mat-menu\">\r\n <button mat-menu-item *ngFor=\"let lang of languageSettings.languages\" (click)=\"setLanguage$.emit(lang)\"\r\n id=\"apply-lang-btn-{{lang}}\">\r\n <div fxLayout=\"row\" fxLayoutGap=\"10px\" fxLayoutAlign=\"start center\">\r\n <div fxFlex=\"auto\">\r\n {{ lang | translate }}\r\n </div>\r\n <div fxFlex=\"auto\" fxLayoutAlign=\"end end\">\r\n <i *ngIf=\"currentLang === lang\" class=\"fad fa-check selected-language-icon\"></i>\r\n </div>\r\n </div>\r\n </button>\r\n </mat-menu>\r\n </ng-container>\r\n <ng-container *ngIf=\"languageSettings?.displayLanguageOptions && languageSettings?.languages.length === 2 && mobileQuery.matches\">\r\n <button *ngIf=\"languageSettings?.languages.length === 2\" id=\"sof-ar-nav-lang-button\" mat-stroked-button\r\n class=\"faded-button-50 language-button navigationFooter\"\r\n [attr.aria-label]=\"languageSettings.buttonText | translate\" (click)=\"setLanguage$.emit()\">\r\n <span aria-hidden=\"true\" class=\"icon-styling\">\r\n <i class=\"far fa-globe language-globe\"></i>\r\n </span>\r\n {{otherLangText | translate}}\r\n </button>\r\n </ng-container>\r\n <!-- The logout button-->\r\n <ng-container *ngIf=\"mobileQuery.matches && userName\">\r\n <button id=\"sof-ar-header-lang-button\" mat-stroked-button class=\"navigationFooter\" (click)=\"logOut()\">\r\n <span aria-hidden=\"true\" class=\"icon-styling\">\r\n <i class=\"fas fa-sign-out-alt\"></i>\r\n </span>\r\n {{logOutText | translate}}\r\n </button>\r\n </ng-container>\r\n </ng-container>\r\n </ng-template>\r\n</div>\r\n",
511
+ template: "<div class=\"sof-ar-nav-container\"\r\n [style.top]=\"mobileQuery.matches && advancedSettings.topGapMobile ? advancedSettings.topGapMobile + 'px' : settings.headerHeight + 'px'\"\r\n [class.sof-ar-nav-mobile]=\"mobileQuery.matches\">\r\n <div *ngIf=\"showMessage\" m-a-0 fxLayout=\"row\" fxLayoutAlign=\"space-between center\" sws-alert--secondary role=\"alert\">\r\n <div fxLayout=\"row\" aria-hidden=\"true\">\r\n <i *ngIf=\"showCheckMark\" m-r-5 m-l-5 class=\"fas fa-check-circle icon-container\"></i>\r\n <p class=\"message-container\" m-r-5 m-l-5 [innerHtml]=\"message | translate\"></p>\r\n </div>\r\n <div fxLayout=\"column\">\r\n <button id=\"btnClose\" (click)=\"hide()\" mat-icon-button [attr.aria-label]=\"'common.close' | translate\">\r\n <span aria-hidden=\"true\">\r\n <i class=\"fal fa-times fa-lg\"></i>\r\n </span>\r\n </button>\r\n </div>\r\n </div>\r\n <button id=\"sof-ar-nav-btn-menu\" aria-label=\"Menu Button\" mat-icon-button [disableRipple]=\"true\"\r\n (click)=\"snav.toggle()\" class=\"sof-ar-nav-menu-btn\"\r\n [class.hidden]=\"!(mobileQuery.matches || settings.allowNavToggle) || settings.hideNavigation\">\r\n <span *ngIf=\"isNavOpen; else closedIcon\" aria-hidden=\"true\" class=\"sof-ar-nav-menu-icon\">\r\n <i class=\"{{settings.fontAwesomeMenuIcon}} menu-icon\"></i>\r\n </span>\r\n <ng-template #closedIcon>\r\n <span aria-hidden=\"true\" class=\"sof-ar-nav-menu-icon\">\r\n <i class=\"{{settings.fontAwesomeMenuIconClosed}} menu-icon\"></i>\r\n </span>\r\n </ng-template>\r\n <span class=\"sr-only\">{{settings.menuButtonSRText | translate}}</span>\r\n </button>\r\n\r\n <mat-sidenav-container autosize class=\"sof-ar-nav-sidenav-container\" [style.marginTop.px]=\"\r\n mobileQuery.matches ? advancedSettings.marginTopMobile : advancedSettings.marginTopDesktop\">\r\n <mat-sidenav [disableClose]=\"!mobileQuery.matches\" class=\"sof-ar-nav-sidenav\" #snav [mode]=\"mobileQuery.matches ? 'over' : 'side'\"\r\n [fixedInViewport]=\"mobileQuery.matches\" [fixedTopGap]=\"mobileQuery.matches ? advancedSettings.topGapMobile : advancedSettings.topGapDesktop\"\r\n [opened]=\"!mobileQuery.matches && !settings.hideNavigation && settings.menuStyle!='progress' \"\r\n [style.width]=\"mobileQuery.matches ? setNavWidth(settings.sideNavWidthMobile) : setNavWidth(settings.sideNavWidthDesktop)\"\r\n [ngStyle]=\"{background:mobileQuery.matches ? themeSettings?.mobileBgColor : undefined}\">\r\n <ng-container *ngIf=\"mobileQuery.matches && userName && !settings.customUserName\">\r\n <span class=\"user-name\">\r\n {{userName}}\r\n </span>\r\n </ng-container>\r\n <ng-container *ngIf=\"mobileQuery.matches && settings.customUserName\">\r\n <span class=\"user-name\">\r\n {{settings.customUserName | translate}}\r\n </span>\r\n </ng-container>\r\n <!-- Nav Header Content -->\r\n <ng-content select=\"[sof-ar-nav-header]\"> </ng-content>\r\n\r\n <!-- Static Navigation -->\r\n <div class=\"nav-content-item sidenav-background\" *ngIf=\"settings.menuStyle === 'static'\" [ngStyle]=\"{'padding-bottom.px': (footerItemCount*64)+128}\">\r\n <ng-container *ngIf=\"settings.menuStyle === 'static'\">\r\n <ng-container *ngFor=\"let nav of navigationData\">\r\n <ng-container *ngIf=\"nav?.subNodes?.length && !nav.hidden\">\r\n <mat-accordion>\r\n <mat-expansion-panel [expanded]=\"nav.expanded\">\r\n <mat-expansion-panel-header [ngClass]=\"{ 'sof-ar-nav-selected': isNavSelected(nav) }\">\r\n <!-- Navigation -->\r\n <ng-container>\r\n <!-- If there is a route -->\r\n <ng-container *ngIf=\"nav?.route\">\r\n <mat-nav-list [disableRipple]=\"true\">\r\n <a class=\"nav-item\" mat-list-item [routerLink]=\"nav?.route\"\r\n [routerLinkActive]=\"['sof-ar-nav-active-route']\">\r\n <ng-container *ngIf=\"nav?.fontAwesomeIcon\">\r\n <span aria-hidden=\"true\" class=\"icon-styling\">\r\n <i class=\"{{nav?.fontAwesomeIcon}}\"></i>\r\n </span>\r\n </ng-container>\r\n <span class=\"sof-ar-nav-header-text\">{{nav.text | translate}}</span>\r\n </a>\r\n </mat-nav-list>\r\n </ng-container>\r\n <!-- If there is not a route -->\r\n <ng-container *ngIf=\"!nav?.route\">\r\n <mat-nav-list [disableRipple]=\"true\">\r\n <button id=\"sof-ar-nav-btn-node\" class=\"nav-item\" mat-list-item\r\n [routerLinkActive]=\"['sof-ar-nav-active-route']\">\r\n <ng-container *ngIf=\"nav?.fontAwesomeIcon\">\r\n <span aria-hidden=\"true\" class=\"icon-styling\">\r\n <i class=\"{{nav?.fontAwesomeIcon}}\"></i>\r\n </span>\r\n </ng-container>\r\n <span class=\"sof-ar-nav-header-text\">{{nav.text | translate}}</span>\r\n </button>\r\n </mat-nav-list>\r\n </ng-container>\r\n </ng-container>\r\n </mat-expansion-panel-header>\r\n <!-- SubNav -->\r\n <ng-container>\r\n <mat-nav-list [ngClass]=\"{ 'sof-ar-nav-selected': isNavSelected(subnav) }\" class=\"subnav-content\"\r\n [disableRipple]=\"true\" *ngFor=\"let subnav of nav?.subNodes\" (click)=\"closeNavigationForMobile()\">\r\n <a mat-list-item [routerLinkActive]=\"['sof-ar-nav-sub-active-route']\" [routerLink]=\"subnav.route\">\r\n {{subnav.text | translate}}\r\n </a>\r\n </mat-nav-list>\r\n </ng-container>\r\n </mat-expansion-panel>\r\n </mat-accordion>\r\n </ng-container>\r\n <!-- If subnodes are not there -->\r\n <ng-container>\r\n <ng-container *ngIf=\"!nav?.subNodes?.length && !nav?.hidden\">\r\n <!-- If there is a route -->\r\n <ng-container *ngIf=\"nav?.route\">\r\n <mat-nav-list [ngClass]=\"{ 'sof-ar-nav-selected': isNavSelected(nav) }\" class=\"nav-header\"\r\n [disableRipple]=\"true\" (click)=\"closeNavigationForMobile()\">\r\n <a class=\"nav-item nav-item-margin\" mat-list-item [routerLink]=\"nav?.route\"\r\n [routerLinkActive]=\"['sof-ar-nav-active-route']\">\r\n <ng-container *ngIf=\"nav?.fontAwesomeIcon\">\r\n <span aria-hidden=\"true\" class=\"icon-styling\"><i class=\"{{nav?.fontAwesomeIcon}}\"></i></span>\r\n </ng-container>\r\n <span class=\"sof-ar-nav-header-text\">{{nav.text | translate}}</span>\r\n </a>\r\n </mat-nav-list>\r\n </ng-container>\r\n <!-- If there is not a route -->\r\n <ng-container *ngIf=\"!nav?.route\">\r\n <mat-nav-list [disableRipple]=\"true\">\r\n <button id=\"sof-ar-nav-btn-node\" class=\"nav-item\" mat-list-item\r\n [routerLinkActive]=\"['sof-ar-nav-active-route']\">\r\n <ng-container *ngIf=\"nav?.fontAwesomeIcon\">\r\n <span aria-hidden=\"true\" class=\"icon-styling\"><i class=\"{{nav?.fontAwesomeIcon}}\"></i></span>\r\n </ng-container>\r\n <span class=\"sof-ar-nav-header-text\">{{nav.text | translate}}</span>\r\n </button>\r\n </mat-nav-list>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n\r\n <!-- Stepper -->\r\n <mat-vertical-stepper *ngIf=\"settings.menuStyle === 'stepper'\" [selectedIndex]=\"selectedParentIndex\" #vertStepper\r\n [linear]=\"false\" class=\"sidenav-background\">\r\n <!-- Alternate step states for nav, icaons should always be white only worked with styles -->\r\n <ng-template matStepperIcon=\"create\">\r\n <span>\r\n <i class=\"fad fa-pencil-alt\" style=\"color: white !important\"></i>\r\n </span>\r\n </ng-template>\r\n <ng-template matStepperIcon=\"edit\">\r\n <span>\r\n <i class=\"fad fa-pencil-alt\" style=\"color: white !important\"></i>\r\n </span>\r\n </ng-template>\r\n <ng-template matStepperIcon=\"active\">\r\n <span>\r\n <i class=\"fad fa-pencil-alt\" style=\"color: white !important\"></i>\r\n </span>\r\n </ng-template>\r\n <ng-template matStepperIcon=\"done\">\r\n <span>\r\n <i class=\"fas fa-check\" style=\"color: white !important\"></i>\r\n </span>\r\n </ng-template>\r\n\r\n <!-- nav steps -->\r\n <ng-container *ngFor=\"let nav of navigationData; let i = index\">\r\n <mat-step *ngIf=\"!nav?.hidden\" state=\"{{ determineStepState(i, -1) }}\">\r\n <ng-template matStepLabel *ngIf=\"!nav.hidden\">\r\n <div id=\"divStep{{ i }}\" style=\"height: 72px\" fxLayout=\"row\" fxLayoutAlign=\"start center\"\r\n matTooltip=\"{{ nav.text | translate }}\" [matTooltipPosition]=\"'after'\" fxFlex=\"100%\">\r\n <a id=\"step{{ i }}\" fxFlex=\"100%\" class=\"mat-button step-link\" [routerLink]=\"nav.route\"\r\n [ngStyle]=\"{ color: themeSettings?.fontColor }\" [routerLinkActive]=\"['step-active']\">\r\n {{ nav.text | translate }}\r\n </a>\r\n </div>\r\n </ng-template>\r\n <p [innerHTML]=\"nav.stepContent | translate\"></p>\r\n <!-- sub nav -->\r\n <mat-vertical-stepper *ngIf=\"nav?.subNodes\" [selectedIndex]=\"selectedChildIndexes[i]\" [linear]=\"false\"\r\n #vertStepperInner>\r\n <!-- Alternate step states for sub nav, icons should always be white only worked with styles -->\r\n <ng-template matStepperIcon=\"create\">\r\n <span>\r\n <i class=\"fad fa-pencil-alt\" style=\"color: white !important\"></i>\r\n </span>\r\n </ng-template>\r\n <ng-template matStepperIcon=\"edit\">\r\n <span>\r\n <i class=\"fad fa-pencil-alt\" style=\"color: white !important\"></i>\r\n </span>\r\n </ng-template>\r\n <ng-template matStepperIcon=\"done\">\r\n <span>\r\n <i class=\"fas fa-check\" style=\"color: white !important\"></i>\r\n </span>\r\n </ng-template>\r\n <ng-template matStepperIcon=\"active\">\r\n <span>\r\n <i class=\"fas fa-pencil-alt\" style=\"color: white !important\"></i>\r\n </span>\r\n </ng-template>\r\n <ng-template matStepperIcon=\"none\">\r\n <span></span>\r\n </ng-template>\r\n <!-- sub nav steps -->\r\n <ng-container *ngFor=\"let subnav of nav?.subNodes; let j = index\">\r\n <mat-step state=\"{{ determineStepState(i, j) }}\" *ngIf=\"!subnav.hidden\">\r\n <ng-template matStepLabel>\r\n <div id=\"divSubStep{{ i }}-{{ j }}\" style=\"height: 72px\" fxLayout=\"row\" fxLayoutAlign=\"start center\"\r\n matTooltip=\"{{ subnav.text | translate }}\" [matTooltipPosition]=\"'after'\" fxFlex=\"100%\">\r\n <a id=\"subStep{{ i }}-{{ j }}\" class=\"mat-button step-link\"\r\n [ngStyle]=\"{ color: themeSettings?.fontColor }\" [routerLink]=\"subnav.route\"\r\n [routerLinkActive]=\"['step-active']\">{{ subnav.text | translate }}</a>\r\n </div>\r\n </ng-template>\r\n <p [innerHTML]=\"subnav.stepContent | translate\"></p>\r\n </mat-step>\r\n </ng-container>\r\n\r\n </mat-vertical-stepper>\r\n </mat-step>\r\n </ng-container>\r\n\r\n </mat-vertical-stepper>\r\n\r\n <!-- Nav Footer -->\r\n <div class=\"nav-footer-item\">\r\n <ng-container *ngIf=\"settings.menuStyle === 'static'\">\r\n <ng-container *ngFor=\"let nav of footerNavigationData\">\r\n <ng-container>\r\n <!-- Desktop Nav -->\r\n <ng-container *ngIf=\"!nav?.subNodes?.length\">\r\n <!-- If there is a route -->\r\n <ng-container *ngIf=\"nav?.route\">\r\n <mat-nav-list class=\"nav-header\" [disableRipple]=\"true\">\r\n <a class=\"nav-item\" mat-list-item [routerLink]=\"nav?.route\"\r\n [routerLinkActive]=\"['sof-ar-nav-active-route']\">\r\n <ng-container *ngIf=\"nav?.fontAwesomeIcon\">\r\n <span aria-hidden=\"true\" class=\"icon-styling\"><i class=\"{{nav?.fontAwesomeIcon}}\"></i></span>\r\n </ng-container>\r\n {{nav.text | translate}}\r\n </a>\r\n </mat-nav-list>\r\n </ng-container>\r\n <!-- If there is not a route -->\r\n <ng-container *ngIf=\"!nav?.route\">\r\n <mat-nav-list>\r\n <button id=\"sof-ar-nav-btn-node\" class=\"nav-item\" mat-list-item\r\n [routerLinkActive]=\"['sof-ar-nav-active-route']\">\r\n <ng-container *ngIf=\"nav?.fontAwesomeIcon\">\r\n <span aria-hidden=\"true\" class=\"icon-styling\"><i class=\"{{nav?.fontAwesomeIcon}}\"></i></span>\r\n </ng-container>\r\n {{nav.text | translate}}\r\n </button>\r\n </mat-nav-list>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <ng-template [ngTemplateOutlet]=\"navigationFooter\">\r\n </ng-template>\r\n </ng-container>\r\n </div>\r\n\r\n <!-- the mobile progress menu-->\r\n <ng-container *ngIf=\"settings?.menuStyle === 'progress'\">\r\n <div class=\"sidenav-background\" [ngStyle]=\"{'padding-bottom.px': (footerItemCount*64)+128}\">\r\n <mat-accordion>\r\n <div *ngFor=\"let step of navigationData; let i = index\">\r\n <ng-container *ngIf=\"step.subNodes && step.subNodes.length > 0 && !step.hidden\">\r\n <mat-expansion-panel hideToggle class=\"progress-mobile-expansion-panel\"\r\n [disabled]=\"(!step.visited || step.isDisabled) && !settings.overrideNavigation\" (opened)=\"panelOpenState = true\"\r\n (closed)=\"panelOpenState = false\">\r\n <mat-expansion-panel-header>\r\n <mat-panel-title class=\"progress-mobile-panel-title\">\r\n <div style=\"width: -webkit-fill-available;\"\r\n [ngClass]=\"{'disabled':(!step.visited || step.isDisabled) && !settings.overrideNavigation && !step.complete,'color-primary':step.complete && step!=activeParentNode,'progress-menu-active':step===activeParentNode}\">\r\n <ng-template [ngTemplateOutlet]=\"progressParentNodeIcons\" [ngTemplateOutletContext]=\"{step:step}\">\r\n </ng-template>\r\n <span *ngIf=\"settings?.displayNumbers\">\r\n {{i < 10 ? \"0\" + (i + 1) + \". \" : i + \" . \" }}\r\n </span>\r\n <span class=\"nav-btn-text\">\r\n {{ step.text | translate }}\r\n </span>\r\n <span *ngIf=\"!panelOpenState\">\r\n <i class=\"fas fa-chevron-down panel-icon\"></i>\r\n </span>\r\n <span *ngIf=\"panelOpenState\">\r\n <i class=\"fas fa-chevron-up panel-icon\"></i>\r\n </span>\r\n </div>\r\n </mat-panel-title>\r\n <mat-panel-description>\r\n </mat-panel-description>\r\n </mat-expansion-panel-header>\r\n <!-- mobile sub menu -->\r\n <div class=\"progress-nav-menu\" *ngFor=\"let subNode of step.subNodes; let idx = index;\" [hidden]=\"step.subNodes[idx].hidden\">\r\n <button id=\"mobileMenu{{ idx }}\" mat-button class=\"step-link progress-menu-mobile-btn\"\r\n [ngClass]=\"{'color-primary':subNode.complete && subNode!=activeSubNode}\"\r\n [routerLinkActive]=\"['progress-menu-active']\" [ngStyle]=\"{ ' color': themeSettings?.fontColor }\"\r\n [routerLink]=\"subNode.route\" [disabled]=\"!subNode.visited && !settings.overrideNavigation\">\r\n <ng-template [ngTemplateOutlet]=\"progressSubNodeIcons\"\r\n [ngTemplateOutletContext]=\"{subNode:subNode}\">\r\n </ng-template>\r\n <span class=\"nav-menu-btn-text\" [ngClass]=\"{'disabled':(!subNode.visited) && !settings.overrideNavigation && !subNode.complete,'color-primary':subNode.complete,'progress-menu-active':subNode===activeSubNode}\">{{ subNode.text | translate }}</span>\r\n </button>\r\n </div>\r\n </mat-expansion-panel>\r\n </ng-container>\r\n <!-- if there are no subNodes -->\r\n <ng-container *ngIf=\"(!step.subNodes || step.subNodes.length==0) && !step.hidden\">\r\n <mat-expansion-panel #panel hideToggle (opened)=\"disablePanel(panel,i)\" class=\"progress-mobile-expansion-panel\"\r\n [disabled]=\"(!step.visited || step.isDisabled) && !settings.overrideNavigation\">\r\n <mat-expansion-panel-header>\r\n <mat-panel-title class=\"progress-mobile-panel-title\">\r\n <div [ngClass]=\"{'disabled':(!step.visited || step.isDisabled) && !settings.overrideNavigation && !step.complete,'color-primary':step.complete && step!=activeParentNode,'progress-menu-active':step===activeParentNode}\">\r\n <ng-template [ngTemplateOutlet]=\"progressParentNodeIcons\" [ngTemplateOutletContext]=\"{step:step}\">\r\n </ng-template>\r\n <span *ngIf=\"settings?.displayNumbers\">\r\n {{i < 10 ? \"0\" + (i + 1) + \". \" : i + \" . \" }}\r\n </span>\r\n <span class=\"nav-btn-text\">\r\n {{ step.text | translate }}\r\n </span>\r\n </div>\r\n </mat-panel-title>\r\n <mat-panel-description>\r\n </mat-panel-description>\r\n </mat-expansion-panel-header>\r\n </mat-expansion-panel>\r\n </ng-container>\r\n </div>\r\n </mat-accordion>\r\n </div>\r\n\r\n <!-- the progress menu language and logout buttons-->\r\n <div class=\"nav-footer-item progress-footer\">\r\n <ng-template [ngTemplateOutlet]=\"navigationFooter\">\r\n </ng-template>\r\n </div>\r\n </ng-container>\r\n </mat-sidenav>\r\n <mat-sidenav-content>\r\n <!-- Horizontal Progress -->\r\n <ng-container *ngIf=\"settings?.menuStyle === 'progress'\">\r\n <mat-progress-bar *ngIf=\"settings?.showProgressBar\" mode=\"determinate\" [value]=\"navProgressCount\"\r\n style=\"height: 9px\" color=\"accent\">\r\n </mat-progress-bar>\r\n <div fxHide.lt-md class=\"step-titles center\" fxLayout=\"row\" style=\"justify-content:center !important\" [class.hidden]=\"settings.hideNavigation\">\r\n <div *ngFor=\"let step of navigationData; let i = index\" class=\"horizontal-progress-div\">\r\n <ng-container *ngIf=\"!step.subNodes?.length && !step.hidden\">\r\n <button mat-button [routerLink]=\"step.route\"\r\n [disabled]=\"(!step.visited || step.isDisabled) && !settings.overrideNavigation\" class=\"progress-menu-btn\"\r\n [ngClass]=\"{'color-primary':step.complete && step!=activeParentNode,'progress-menu-active':step===activeParentNode}\">\r\n <ng-template [ngTemplateOutlet]=\"progressParentNodeIcons\" [ngTemplateOutletContext]=\"{step:step}\">\r\n </ng-template>\r\n <span *ngIf=\"settings?.displayNumbers\">\r\n {{i < 10 ? \"0\" + (i + 1) + \". \" : i + \" . \"}}\r\n </span>\r\n <span class=\"nav-btn-text\">{{ step.text | translate }}</span>\r\n </button>\r\n </ng-container>\r\n <!-- if there are subnodes create menus for each step -->\r\n <ng-container *ngIf=\"step.subNodes && step.subNodes.length && !step.hidden\">\r\n <button [ngClass]=\"{'color-primary':step.complete && step!=activeParentNode,'progress-menu-active':step===activeParentNode}\"\r\n mat-button [disabled]=\"(!step.visited || step.isDisabled) && !settings.overrideNavigation\" class=\"progress-menu-btn\"\r\n [matMenuTriggerFor]=\"menu\">\r\n <ng-template [ngTemplateOutlet]=\"progressParentNodeIcons\" [ngTemplateOutletContext]=\"{step:step}\">\r\n </ng-template>\r\n <span *ngIf=\"settings?.displayNumbers\">\r\n {{i < 10 ? \"0\" + (i + 1) + \". \" : i + \" . \"}}\r\n </span>\r\n <span class=\"nav-btn-text\">{{ step.text | translate }}</span>\r\n </button>\r\n <mat-menu #menu=\"matMenu\" class=\"sof-ar-mat-menu progress-menu-panel\">\r\n <div class=\"progress-nav-menu\" *ngFor=\"let subNode of step.subNodes; let idx = index;\" [ngStyle]=\"{width:settings.progressMenuWidth+'px'}\" [hidden]=\"step.subNodes[idx].hidden\">\r\n <button id=\"submenu{{ idx }}\" mat-button class=\"step-link progress-menu-btn\"\r\n [ngClass]=\"{'color-primary':subNode.complete && subNode!=activeSubNode,'disabled':!subNode.visited && !settings.overrideNavigation}\"\r\n [routerLinkActive]=\"['progress-menu-active']\" [ngStyle]=\"{ ' color': themeSettings?.fontColor }\"\r\n [routerLink]=\"subNode.route\" [disabled]=\"!subNode.visited && !settings.overrideNavigation\">\r\n <ng-template [ngTemplateOutlet]=\"progressSubNodeIcons\"\r\n [ngTemplateOutletContext]=\"{subNode:subNode}\">\r\n </ng-template>\r\n <span class=\"nav-menu-btn-text\">{{ subNode.text |translate }}</span>\r\n </button>\r\n </div>\r\n </mat-menu>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <div class=\"mobile-progress-container\" fxHide.gt-sm>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-content sof-ar-nav-content></ng-content>\r\n </mat-sidenav-content>\r\n </mat-sidenav-container>\r\n <!-- The progress menu parent node icon template-->\r\n <ng-template #progressParentNodeIcons let-step='step'>\r\n <span *ngIf=\"step.complete && step != activeParentNode\">\r\n <i class=\"{{ settings.progressSectionCompleteIcon }} color-primary progress-nav-icon\"></i>\r\n </span>\r\n <span *ngIf=\"step === activeParentNode\">\r\n <i class=\"{{ settings.progressSectionCurrentIcon }} color-primary progress-nav-icon\"></i>\r\n </span>\r\n <span *ngIf=\"!step.complete && step != activeParentNode\" [ngClass]=\"{'disabled':!step.visited && !settings.overrideNavigation}\">\r\n <i class=\"{{ settings.progressSectionFutureIcon }} progress-nav-icon\"></i>\r\n </span>\r\n </ng-template>\r\n <!-- The progress menu sub node icon template-->\r\n <ng-template #progressSubNodeIcons let-subNode='subNode'>\r\n <span *ngIf=\"subNode.complete &&activeSubNode !=subNode\">\r\n <i class=\"{{settings.progressMenuCompleteIcon}} color-primary progress-nav-icon\"></i>\r\n </span>\r\n <span *ngIf=\"activeSubNode ===subNode\">\r\n <i class=\"{{ settings.progressSectionCurrentIcon }} color-primary progress-nav-icon\"></i>\r\n </span>\r\n <span *ngIf=\"!subNode.complete &&activeSubNode !=subNode\" [ngClass]=\"{'disabled':!subNode.visited && !settings.overrideNavigation}\">\r\n <i class=\"{{ settings.progressSectionFutureIcon }} progress-nav-icon\"></i>\r\n </span>\r\n </ng-template>\r\n <!-- The navigation footer template for language and logout buttons -->\r\n <ng-template #navigationFooter>\r\n <ng-content select=\"[sof-ar-nav-mobile-footer]\"> </ng-content>\r\n <ng-container *ngIf=\"!settings.useCustomMobileFooter\">\r\n <!-- The language button -->\r\n <ng-container *ngIf=\"languageSettings?.displayLanguageOptions && languageSettings?.languages.length > 2 && mobileQuery.matches\">\r\n <button id=\"sof-ar-nav-lang-dropdown\" mat-stroked-button\r\n class=\"faded-button-50 language-button navigationFooter\" [matMenuTriggerFor]=\"headerLanguageMenu\"\r\n [attr.aria-label]=\"languageSettings.buttonText | translate\">\r\n <span aria-hidden=\"true\" class=\"icon-styling\">\r\n <i class=\"far fa-globe language-globe\"></i>\r\n </span>\r\n {{languageSettings.buttonText | translate}}\r\n </button>\r\n <mat-menu #headerLanguageMenu=\"matMenu\" class=\"sof-ar-mat-menu\">\r\n <button mat-menu-item *ngFor=\"let lang of languageSettings.languages\" (click)=\"setLanguage$.emit(lang)\"\r\n id=\"apply-lang-btn-{{lang}}\">\r\n <div fxLayout=\"row\" fxLayoutGap=\"10px\" fxLayoutAlign=\"start center\">\r\n <div fxFlex=\"auto\">\r\n {{ lang | translate }}\r\n </div>\r\n <div fxFlex=\"auto\" fxLayoutAlign=\"end end\">\r\n <i *ngIf=\"currentLang === lang\" class=\"fad fa-check selected-language-icon\"></i>\r\n </div>\r\n </div>\r\n </button>\r\n </mat-menu>\r\n </ng-container>\r\n <ng-container *ngIf=\"languageSettings?.displayLanguageOptions && languageSettings?.languages.length === 2 && mobileQuery.matches\">\r\n <button *ngIf=\"languageSettings?.languages.length === 2\" id=\"sof-ar-nav-lang-button\" mat-stroked-button\r\n class=\"faded-button-50 language-button navigationFooter\"\r\n [attr.aria-label]=\"languageSettings.buttonText | translate\" (click)=\"setLanguage$.emit()\">\r\n <span aria-hidden=\"true\" class=\"icon-styling\">\r\n <i class=\"far fa-globe language-globe\"></i>\r\n </span>\r\n {{otherLangText | translate}}\r\n </button>\r\n </ng-container>\r\n <!-- The logout button-->\r\n <ng-container *ngIf=\"mobileQuery.matches && userName\">\r\n <button id=\"sof-ar-header-lang-button\" mat-stroked-button class=\"navigationFooter\" (click)=\"logOut()\">\r\n <span aria-hidden=\"true\" class=\"icon-styling\">\r\n <i class=\"fas fa-sign-out-alt\"></i>\r\n </span>\r\n {{logOutText | translate}}\r\n </button>\r\n </ng-container>\r\n </ng-container>\r\n </ng-template>\r\n</div>\r\n",
504
512
  providers: [{
505
513
  provide: STEPPER_GLOBAL_OPTIONS,
506
514
  useValue: ɵ0
@@ -531,4 +539,4 @@ ArmatureNavigationComponent.propDecorators = {
531
539
  setLanguage$: [{ type: Output }]
532
540
  };
533
541
  export { ɵ0 };
534
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF2aWdhdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiUzovQjA2L193b3JrLzM3Mi9zL2xpYnJhcnkvcHJvamVjdHMvYXJtYXR1cmUvc3JjLyIsInNvdXJjZXMiOlsibGliL25hdmlnYXRpb24vY29tcG9uZW50cy9uYXZpZ2F0aW9uL25hdmlnYXRpb24uY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUM5RCxPQUFPLEVBQWlCLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFxQixRQUFRLEVBQUUsTUFBTSxFQUFhLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFJMUssT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN4RCxPQUFPLEVBQWMsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2hELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUNwRixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDdEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNENBQTRDLENBQUM7V0FnQmhDLEVBQUUsMkJBQTJCLEVBQUUsS0FBSyxFQUFFO0FBVnJGLDBGQUEwRjtBQUUxRjs7R0FFRztBQVNILE1BQU0sT0FBTywyQkFBMkI7SUF5SHRDOzs7Ozs7OztPQVFHO0lBQ0gsWUFDVyxpQkFBb0MsRUFDcEMsS0FBbUIsRUFDWCxNQUFjLEVBQ3ZCLGFBQTRCLEVBQ25CLG9CQUEwQyxFQUM5QixhQUFnQztRQUxwRCxzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBQ3BDLFVBQUss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USxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVELHNDQUFzQztJQUMvQixXQUFXLENBQUMsS0FBYTtRQUM5QixPQUFPLEtBQUssQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO0lBQzVFLENBQUM7OztZQS9tQkYsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSxtQkFBbUI7Z0JBQzdCLGdxNEJBQTBDO2dCQUUxQyxTQUFTLEVBQUUsQ0FBQzt3QkFDVixPQUFPLEVBQUUsc0JBQXNCO3dCQUFFLFFBQVEsSUFBd0M7cUJBQ2xGLENBQUM7O2FBQ0g7OztZQTVCdUIsaUJBQWlCO1lBRmhDLFlBQVk7WUFNRyxNQUFNO1lBS3JCLGFBQWE7WUFEYixvQkFBb0I7WUFFcEIsaUJBQWlCLHVCQTJKckIsUUFBUTs7O3NCQXJJVixTQUFTLFNBQUMsYUFBYTtzQkFHdkIsU0FBUyxTQUFDLE1BQU07NkJBR2hCLFNBQVMsU0FBQyxPQUFPOzRCQUdqQixZQUFZLFNBQUMsa0JBQWtCOzZCQUcvQixLQUFLO3VCQUdMLEtBQUs7K0JBR0wsS0FBSzs0QkFHTCxLQUFLOytCQUdMLEtBQUs7MEJBR0wsS0FBSzt5QkFHTCxLQUFLOzJCQUdMLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBNZWRpYU1hdGNoZXIgfSBmcm9tICdAYW5ndWxhci9jZGsvbGF5b3V0JztcclxuaW1wb3J0IHsgU1RFUFBFUl9HTE9CQUxfT1BUSU9OUyB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9zdGVwcGVyJztcclxuaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIE9wdGlvbmFsLCBPdXRwdXQsIFF1ZXJ5TGlzdCwgVmlld0NoaWxkLCBWaWV3Q2hpbGRyZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTWF0RXhwYW5zaW9uUGFuZWwgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9leHBhbnNpb24nO1xyXG5pbXBvcnQgeyBNYXRTaWRlbmF2IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc2lkZW5hdic7XHJcbmltcG9ydCB7IE1hdFZlcnRpY2FsU3RlcHBlciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3N0ZXBwZXInO1xyXG5pbXBvcnQgeyBOYXZpZ2F0aW9uRW5kLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgZmlsdGVyIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBCYXNlQ29uZmlnIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9tb2RlbHMvYmFzZS1jb25maWcnO1xyXG5pbXBvcnQgeyBBdXRob3JpemF0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZXMvYXV0aG9yaXphdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQmFubmVyU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZXMvYmFubmVyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBCYXNlQ29uZmlnU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZXMvYmFzZS1jb25maWcuc2VydmljZSc7XHJcbmltcG9ydCB7IEhlYWRlckxhbmd1YWdlU2V0dGluZ3MgfSBmcm9tICcuLi8uLi8uLi9oZWFkZXIvbW9kZWxzL2hlYWRlci1sYW5ndWFnZS5zZXR0aW5ncyc7XHJcbmltcG9ydCB7IE5hdmlnYXRpb25UaGVtZVNldHRpbmdzIH0gZnJvbSAnLi4vLi4vbW9kZWxzL25hdi10aGVtZS5zZXR0aW5ncyc7XHJcbmltcG9ydCB7IE5hdmlnYXRpb25BZHZhbmNlZFNldHRpbmdzLCBOYXZpZ2F0aW9uU2V0dGluZ3MgfSBmcm9tICcuLi8uLi9tb2RlbHMvbmF2LnNldHRpbmdzJztcclxuaW1wb3J0IHsgTmF2Tm9kZSwgU3ViTmF2Tm9kZXMgfSBmcm9tICcuLi8uLi9tb2RlbHMvbmF2aWdhdGlvbic7XHJcblxyXG4vLyBUT0RPOiBzZWUgaG93IHRoaXMgY2FuIGZpdCB3aXRoIHRoZSBgc29mLXByb2dyZXNzLWJhcmAgY29tcG9uZW50LiBQb3NzaWJseSBjb21iaW5lIHRoZW1cclxuXHJcbi8qKlxyXG4gKiBUaGUgTmF2aWdhdGlvbiBDb21wb25lbnRcclxuICovXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnc29mLWFyLW5hdmlnYXRpb24nLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9uYXZpZ2F0aW9uLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9uYXZpZ2F0aW9uLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgcHJvdmlkZXJzOiBbe1xyXG4gICAgcHJvdmlkZTogU1RFUFBFUl9HTE9CQUxfT1BUSU9OUywgdXNlVmFsdWU6IHsgZGlzcGxheURlZmF1bHRJbmRpY2F0b3JUeXBlOiBmYWxzZSB9XHJcbiAgfV1cclxufSlcclxuZXhwb3J0IGNsYXNzIEFybWF0dXJlTmF2aWdhdGlvbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcclxuXHJcbiAgLyoqIFRoZSBwYXJlbnQgc3RlcHBlciAqL1xyXG4gIEBWaWV3Q2hpbGQoJ3ZlcnRTdGVwcGVyJykgcHVibGljIHN0ZXBwZXI6IE1hdFZlcnRpY2FsU3RlcHBlcjtcclxuXHJcbiAgLyoqIFRoZSBzaWRlIG1vYmlsZSBuYXYgKi9cclxuICBAVmlld0NoaWxkKCdzbmF2JykgcHVibGljIHNpZGVuYXY6IE1hdFNpZGVuYXY7XHJcblxyXG4gIC8qKiBUaGUgbW9iaWxlIGV4cGFuc2lvbiBwYW5lbCBmb3IgcHJvZ3Jlc3MgbWVudSAqL1xyXG4gIEBWaWV3Q2hpbGQoJ3BhbmVsJykgcHVibGljIGV4cGFuc2lvblBhbmVsOiBNYXRFeHBhbnNpb25QYW5lbDtcclxuXHJcbiAgLyoqIFRoZSBjaGlsZCBzdGVwcGVycyAqL1xyXG4gIEBWaWV3Q2hpbGRyZW4oJ3ZlcnRTdGVwcGVySW5uZXInKSBwdWJsaWMgaW5uZXJTdGVwcGVyczogUXVlcnlMaXN0PE1hdFZlcnRpY2FsU3RlcHBlcj47XHJcblxyXG4gIC8qKiBDb21wb25lbnQgSW5wdXQgLSB0aGUgbmF2aWdhdGlvbiBkYXRhICovXHJcbiAgQElucHV0KCkgcHVibGljIG5hdmlnYXRpb25EYXRhOiBOYXZOb2RlW107XHJcblxyXG4gIC8qKiBDb21wb25lbnQgSW5wdXQgLSB0aGUgbmF2aWdhdGlvbiBzZXR0aW5ncyAqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBzZXR0aW5nczogTmF2aWdhdGlvblNldHRpbmdzID0ge307XHJcblxyXG4gIC8qKiBDb21wb25lbnQgSW5wdXQgLSB0aGUgbmF2aWdhdGlvbiBzZXR0aW5ncyAqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBhZHZhbmNlZFNldHRpbmdzOiBOYXZpZ2F0aW9uQWR2YW5jZWRTZXR0aW5ncyA9IHt9O1xyXG5cclxuICAvKiogQ29tcG9uZW50IElucHV0IC0gdGhlIG5hdmlnYXRpb24gc2V0dGluZ3MgKi9cclxuICBASW5wdXQoKSBwdWJsaWMgdGhlbWVTZXR0aW5nczogTmF2aWdhdGlvblRoZW1lU2V0dGluZ3MgPSB7fTtcclxuXHJcbiAgLyoqIENvbXBvbmVudCBJbnB1dCAtIHRoZSBuYXZpZ2F0aW9uIGxhbmd1YWdlIHNldHRpbmdzICovXHJcbiAgQElucHV0KCkgcHVibGljIGxhbmd1YWdlU2V0dGluZ3M6IEhlYWRlckxhbmd1YWdlU2V0dGluZ3MgPSB7fTtcclxuXHJcbiAgLyoqIEN1cnJlbnQgbGFuZ3VhZ2UgKiovXHJcbiAgQElucHV0KCkgcHVibGljIGN1cnJlbnRMYW5nOiBzdHJpbmc7XHJcblxyXG4gIC8qKiBsb2dPdXQgdGV4dCAqKi9cclxuICBASW5wdXQoKSBwdWJsaWMgbG9nT3V0VGV4dDogc3RyaW5nO1xyXG5cclxuICAvKiogU2V0cyBsYW5ndWFnZSAqKi9cclxuICBAT3V0cHV0KCkgcHVibGljIHNldExhbmd1YWdlJDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgLyoqIGdldHMgdGhlIG5vbiB1c2VkIGxhbmd1YWdlICovXHJcbiAgcHVibGljIGdldCBvdGhlckxhbmdUZXh0KCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5sYW5ndWFnZVNldHRpbmdzPy5sYW5ndWFnZXM/LmZpbmQoeCA9PiB4ICE9PSB0aGlzLmN1cnJlbnRMYW5nKTtcclxuICB9XHJcblxyXG4gIC8qKiBXaGV0aGVyIHNpZGUgbmF2IGlzIG9wZW4gb3Igbm90ICovXHJcbiAgcHVibGljIGlzTmF2T3BlbjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvKiogTW9iaWxlIFN1Yk5hdiAtIHdoZXRoZXIgb3Igbm90IHRoZSBtb2JpbGUgU3ViTmF2IGlzIG9wZW4gKi9cclxuICBwdWJsaWMgaXNNb2JpbGVTdWJOYXZPcGVuOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8qKiBNb2JpbGUgU3ViTmF2IC10aGUgZGF0YSB0byBiZSBwYXNzZWQgdG8gdGhlIG1vYmlsZSBTdWJOYXYgKi9cclxuICBwdWJsaWMgY3VycmVudE1vYmlsZU5hdjogTmF2Tm9kZTtcclxuXHJcbiAgLyoqIFNldHRpbmdzIC0gdGhlIG1haW4gbWVudSB0ZXh0IHRoYXQgYXBwZWFycyBpbiB0aGUgbW9iaWxlIFN1Yk5hdiAqL1xyXG4gIHB1YmxpYyBtYWluTWVudVRleHQ6IHN0cmluZztcclxuXHJcbiAgLyoqIHRoZSBtb2JpbGUgcXVlcnkgKi9cclxuICBwdWJsaWMgbW9iaWxlUXVlcnk6IE1lZGlhUXVlcnlMaXN0O1xyXG5cclxuICAvKiogVGhlIHNlbGVjdGVkIHBhcmVudCBpbmRleCAqL1xyXG4gIHB1YmxpYyBzZWxlY3RlZFBhcmVudEluZGV4OiBudW1iZXIgPSAwO1xyXG5cclxuICAvKiogVGhlIHNlbGVjdGVkIGNoaWxkIGluZGV4ICovXHJcbiAgcHVibGljIHNlbGVjdGVkQ2hpbGRJbmRleGVzOiB7IFtrZXk6IG51bWJlcl06IG51bWJlciB9ID0ge307XHJcblxyXG4gIC8qKiBUaGUgbmF2aWdhdGlvbiBwcm9ncmVzcyBjb3VudCAqL1xyXG4gIHB1YmxpYyBuYXZQcm9ncmVzc0NvdW50OiBudW1iZXIgPSAwO1xyXG5cclxuICAvKiogVGhlIGN1cnJlbnQgYWN0aXZlIHBhcmVudCBub2RlICovXHJcbiAgcHVibGljIGFjdGl2ZVBhcmVudE5vZGU6IE5hdk5vZGU7XHJcblxyXG4gIC8qKiBUaGUgY3VycmVudCBhY3RpdmUgc3ViIG5vZGUgKi9cclxuICBwdWJsaWMgYWN0aXZlU3ViTm9kZTogU3ViTmF2Tm9kZXM7XHJcblxyXG4gIC8qKiBUcnVlIGlmIHRoZSBleHBhbnNpb24gcGFuZWwgaXMgb3BlbiAqL1xyXG4gIHB1YmxpYyBwYW5lbE9wZW5TdGF0ZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvKiogVGhlIGZvb3RlciBuYXZpZ2F0aW9uIGRhdGEgKi9cclxuICBwdWJsaWMgZm9vdGVyTmF2aWdhdGlvbkRhdGE6IE5hdk5vZGVbXVxyXG5cclxuICAvKiogdXNlciBuYW1lICoqL1xyXG4gIHB1YmxpYyB1c2VyTmFtZTogc3RyaW5nO1xyXG5cclxuICAvKiogVGhlIGNvbmZpZyBvYnNlcnZhYmxlICovXHJcbiAgcHVibGljIGNvbmZpZyQ6IE9ic2VydmFibGU8QmFzZUNvbmZpZz47XHJcblxyXG4gIC8qKiBUaGUgcGFyZW50IG5vZGUgaW5kZXggdG8gYmUgc2V0IHdoZW4gbmF2IGlzIHRvZ2dsZWQgdG8gcHJvZ3Jlc3MgbWVudSBzdHlsZSAqL1xyXG4gIHB1YmxpYyB0b2dnbGVQcm9ncmVzc05hdlBhcmVudEluZGV4OiBudW1iZXI7XHJcblxyXG4gIC8qKiBUaGUgY2hpbGQgbm9kZSBpbmRleCB0byBiZSBzZXQgd2hlbiBuYXYgaXMgdG9nZ2xlZCB0byBwcm9ncmVzcyBtZW51IHN0eWxlICovXHJcbiAgcHVibGljIHRvZ2dsZVByb2dyZXNzTmF2Q2hpbGRJbmRleDogbnVtYmVyO1xyXG5cclxuICAvKiogdGhlIG1vYmlsZSBxdWVyeSBsaXN0ZW5lcjIgKi9cclxuICBwcml2YXRlIHJlYWRvbmx5IF9tb2JpbGVRdWVyeUxpc3RlbmVyOiAoKSA9PiB2b2lkO1xyXG5cclxuICAvKiogVGhlIG5hdiBiaW5kIHN1YnNjcmlwdGlvbiAqL1xyXG4gIHByaXZhdGUgbmF2QmluZFN1YjogU3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xyXG5cclxuICAvKiogVGhlIG1lc3NhZ2UgdG8gZGlzcGxheSAqL1xyXG4gIHB1YmxpYyBtZXNzYWdlOiBzdHJpbmc7XHJcblxyXG4gIC8qKiBXaGV0aGVyIHdlIHNob3VsZCB0aGUgbWVzc2FnZSAqL1xyXG4gIHB1YmxpYyBzaG93TWVzc2FnZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvKiogV2hldGhlciBzaG91bGQgc2hvdyBjaGVjayBtYXJrIG9yIG5vdCAqL1xyXG4gIHB1YmxpYyBzaG93Q2hlY2tNYXJrOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgLyoqIFRoZSBuYXYgYmluZCBzdWJzY3JpcHRpb24gKi9cclxuICBwcml2YXRlIGxvZ0luU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XHJcblxyXG4gIC8qKiBUaGUgY291bnQgb2YgZm9vdGVyIGl0ZW1zKi9cclxuICBwdWJsaWMgZm9vdGVySXRlbUNvdW50OiBudW1iZXI7XHJcblxyXG4gIC8qKiBUaGUgYmFubmVyIHN1YnNjcmlwdGlvbiAqL1xyXG4gIHByaXZhdGUgYmFubmVyU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XHJcblxyXG4gIC8qKiBUaGUgY29uZmlnIHN1YnNjcmlwdGlvbiAqL1xyXG4gIHB1YmxpYyBjb25maWdTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcclxuXHJcbiAgLyoqIFRoZSBzaWRlbmF2IHN1YnNjcmlwdGlvbiAqL1xyXG4gIHByaXZhdGUgc2lkZU5hdlN1YjogU3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xyXG5cclxuICAvKipcclxuICAgKiB0aGUgY29uc3RydWN0b3JcclxuICAgKiBAcGFyYW0gY2hhbmdlRGV0ZWN0b3JSZWYgdGhlIGNoYW5nZSBkZXRlY3RvciByZWZlcmVuY2VcclxuICAgKiBAcGFyYW0gbWVkaWEgdGhlIG1lZGlhIG1hdGNoZXJcclxuICAgKiBAcGFyYW0gcm91dGVyIFRoZSByb3V0ZXJcclxuICAgKiBAcGFyYW0gYmFubmVyU2VydmljZSBUaGUgQmFubmVyIFNlcnZpY2VcclxuICAgKiBAcGFyYW0gYWN0aXZhdGVkUm91dGUgVGhlIGFjdGl2YXRlZCByb3V0ZVxyXG4gICAqIEBwYXJhbSBjb25maWdTZXJ2aWNlIFRoZSBjb25maWcgc2VydmljZVxyXG4gICAqL1xyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcmVhZG9ubHkgY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgcmVhZG9ubHkgbWVkaWE6IE1lZGlhTWF0Y2hlcixcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgcm91dGVyOiBSb3V0ZXIsXHJcbiAgICBwcml2YXRlIGJhbm5lclNlcnZpY2U6IEJhbm5lclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGF1dGhvcml6YXRpb25TZXJ2aWNlOiBBdXRob3JpemF0aW9uU2VydmljZSxcclxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgcmVhZG9ubHkgY29uZmlnU2VydmljZTogQmFzZUNvbmZpZ1NlcnZpY2VcclxuICApIHtcclxuICAgIHRoaXMubW9iaWxlUXVlcnkgPSBtZWRpYS5tYXRjaE1lZGlhKCcobWF4LXdpZHRoOiA5NTlweCknKTtcclxuICAgIHRoaXMuX21vYmlsZVF1ZXJ5TGlzdGVuZXIgPSAoKSA9PiB7XHJcbiAgICAgIGNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgLy8gY2xvc2UgdGhlIHNpZGVuYXYgd2hlbiBzY3JlZW4gc2l6ZSBpcyBjaGFuZ2VkXHJcbiAgICAgIGlmICghdGhpcy5tb2JpbGVRdWVyeS5tYXRjaGVzICYmIHRoaXMuc2V0dGluZ3MubWVudVN0eWxlID09PSAncHJvZ3Jlc3MnKSB7XHJcbiAgICAgICAgdGhpcy5zaWRlbmF2LmNsb3NlKCk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgICAvLyBiZWxvdyBpZiBzdGF0ZW1lbnQgaXMgZm9yIGVkZ2Ugc3VwcG9ydCBzaW5jZSBhZGRFdmVudExpc3RlbmVyIGRvZXNuJ3QgZXhpc3QgZm9yIE1lZGlhUXVlcnlMaXN0c1xyXG4gICAgaWYgKHRoaXMubW9iaWxlUXVlcnkuYWRkRXZlbnRMaXN0ZW5lcikge1xyXG4gICAgICB0aGlzLm1vYmlsZVF1ZXJ5LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIHRoaXMuX21vYmlsZVF1ZXJ5TGlzdGVuZXIpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMubW9iaWxlUXVlcnkuYWRkTGlzdGVuZXIodGhpcy5fbW9iaWxlUXVlcnlMaXN0ZW5lcik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogT24gSW5pdCAtIGNvbmZpZ3VyZSB0aGUgc2V0dGluZ3MgKi9cclxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XHJcblxyXG4gICAgdGhpcy5iYW5uZXJTdWJzY3JpcHRpb24uYWRkKHRoaXMuYmFubmVyU2VydmljZS5zaG93QmFubmVyJC5zdWJzY3JpYmUodmFsID0+IHRoaXMuc2hvd01lc3NhZ2UgPSB2YWwpKTtcclxuICAgIHRoaXMuYmFubmVyU3Vic2NyaXB0aW9uLmFkZCh0aGlzLmJhbm5lclNlcnZpY2UubWVzc2FnZSQuc3Vic2NyaWJlKHZhbCA9PiB0aGlzLm1lc3NhZ2UgPSB2YWwpKTtcclxuICAgIHRoaXMuYmFubmVyU3Vic2NyaXB0aW9uLmFkZCh0aGlzLmJhbm5lclNlcnZpY2Uuc2hvd0NoZWNrTWFyayQuc3Vic2NyaWJlKHZhbCA9PiB0aGlzLnNob3dDaGVja01hcmsgPSB2YWwpKTtcclxuXHJcbiAgICB0aGlzLmZvb3Rlck5hdmlnYXRpb25EYXRhID0gdGhpcy5uYXZpZ2F0aW9uRGF0YT8uZmlsdGVyKG5vZGUgPT4gbm9kZT8uYWx0TG9jYXRpb24gPT0gdHJ1ZSk7XHJcbiAgICB0aGlzLmZvb3Rlckl0ZW1Db3VudCA9IHRoaXMuZm9vdGVyTmF2aWdhdGlvbkRhdGEgPyB0aGlzLmZvb3Rlck5hdmlnYXRpb25EYXRhLmxlbmd0aCA6IDA7XHJcbiAgICB0aGlzLm5hdmlnYXRpb25EYXRhID0gdGhpcy5uYXZpZ2F0aW9uRGF0YT8uZmlsdGVyKG5vZGUgPT4gbm9kZT8uYWx0TG9jYXRpb24gIT0gdHJ1ZSk7XHJcblxyXG4gICAgLy8gaWYgcGFyZW50cyBoYXZlIG5vIHJvdXRlLCBncmFiIGZpcnN0IHJvdXRlIG9mIGNoaWxkXHJcbiAgICB0aGlzLm5hdmlnYXRpb25EYXRhPy5mb3JFYWNoKG4gPT4ge1xyXG4gICAgICBpZiAoIW4ucm91dGUpIHtcclxuICAgICAgICBuLnJvdXRlID0gbi5zdWJOb2RlcyAmJiBuLnN1Yk5vZGVzLmxlbmd0aCA+IDAgPyBuLnN1Yk5vZGVzWzBdLnJvdXRlIDogdW5kZWZpbmVkO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIGVuYWJsZSBhbGwgcGFnZXMgYnkgZGVmYXVsdFxyXG4gICAgICBpZiAobi5pc0Rpc2FibGVkID09IG51bGwpIHtcclxuICAgICAgICBuLmlzRGlzYWJsZWQgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5pbml0QmFzaWNTZXR0aW5ncygpO1xyXG4gICAgdGhpcy5pbml0QWR2YW5jZWRTZXR0aW5ncygpO1xyXG4gICAgdGhpcy5pbml0VGhlbWVTZXR0aW5ncygpO1xyXG5cclxuICAgIC8vIGluaXQgYmluZGluZyBmb3IgcHJvZ3Jlc3MgbmF2XHJcbiAgICBpZiAodGhpcy5zZXR0aW5ncy5tZW51U3R5bGUgPT09ICdwcm9ncmVzcycpIHtcclxuICAgICAgLy8gc2V0IHRoZSBmaXJzdCBub2RlIGFuZCBjaGlsZCBub2RlIGFzIHZpc2l0ZWRcclxuICAgICAgaWYgKHRoaXMubmF2aWdhdGlvbkRhdGEubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIHRoaXMubmF2aWdhdGlvbkRhdGFbMF0udmlzaXRlZCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5uYXZpZ2F0ZSh0aGlzLm5hdmlnYXRpb25EYXRhWzBdLnJvdXRlKTtcclxuICAgICAgICBpZiAodGhpcy5uYXZpZ2F0aW9uRGF0YVswXS5zdWJOb2RlcyAmJiB0aGlzLm5hdmlnYXRpb25EYXRhWzBdLnN1Yk5vZGVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIHRoaXMubmF2aWdhdGlvbkRhdGFbMF0uc3ViTm9kZXNbMF0udmlzaXRlZCA9IHRydWU7XHJcbiAgICAgICAgICB0aGlzLm5hdmlnYXRlKHRoaXMubmF2aWdhdGlvbkRhdGFbMF0uc3ViTm9kZXNbMF0ucm91dGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gc2V0IGluaXRpYWwgcHJvZ3Jlc3MgYmFyXHJcbiAgICAgIHRoaXMubmF2UHJvZ3Jlc3NDb3VudCA9ICh0aGlzLnNlbGVjdGVkUGFyZW50SW5kZXggKyAxKSAvIHRoaXMubmF2aWdhdGlvbkRhdGEubGVuZ3RoICogMTAwO1xyXG5cclxuXHJcbiAgICAgIHRoaXMubmF2QmluZFN1Yi5hZGQoXHJcbiAgICAgICAgdGhpcy5yb3V0ZXIuZXZlbnRzLnBpcGUoZmlsdGVyKGV2ZW50ID0+IGV2ZW50IGluc3RhbmNlb2YgTmF2aWdhdGlvbkVuZCkpXHJcbiAgICAgICAgICAuc3Vic2NyaWJlKChldmVudDogTmF2aWdhdGlvbkVuZCkgPT4ge1xyXG4gICAgICAgICAgICAvLyBmaW5kIHBhcmVudCBpbmRleCB3aXRoIGFjdGl2ZSBjaGlsZFxyXG4gICAgICAgICAgICB0aGlzLmdldEFjdGl2ZVBhcmVudEFuZENoaWxkKGV2ZW50LnVybCk7XHJcbiAgICAgICAgICB9KVxyXG4gICAgICApO1xyXG5cclxuICAgICAgdGhpcy5zZXR0aW5ncy5hbGxvd05hdlRvZ2dsZSA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgdGhpcy5sb2dJblN1YnNjcmlwdGlvbiA9IHRoaXMuYXV0aG9yaXphdGlvblNlcnZpY2UuaXNMb2dnZWRJbiQuc3Vic2NyaWJlKHZhbHVlID0+IHtcclxuICAgICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy51c2VyTmFtZSA9IHRoaXMuYXV0aG9yaXphdGlvblNlcnZpY2UudXNlck5hbWUoKVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAodGhpcy5jb25maWdTZXJ2aWNlKSB7XHJcbiAgICAgIHRoaXMuY29uZmlnU3Vic2NyaXB0aW9uID0gdGhpcy5jb25maWdTZXJ2aWNlLmNvbmZpZyQuc3Vic2NyaWJlKGNvbmZpZyA9PiB7XHJcbiAgICAgICAgaWYgKGNvbmZpZykge1xyXG4gICAgICAgICAgaWYgKGNvbmZpZz8ubmF2aWdhdGlvbj8uc2V0dGluZ3M/LnJlc2V0TmF2KSB7XHJcbiAgICAgICAgICAgIHRoaXMubmF2UHJvZ3Jlc3NDb3VudCA9IDA7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRQYXJlbnRJbmRleCA9IDA7XHJcbiAgICAgICAgICAgIHRoaXMubmF2aWdhdGUodGhpcy5uYXZpZ2F0aW9uRGF0YVswXS5yb3V0ZSk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnN0ZXBwZXIpIHtcclxuICAgICAgICAgICAgICB0aGlzLnN0ZXBwZXIuc2VsZWN0ZWRJbmRleCA9IDA7XHJcbiAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnN0ZXBwZXIucmVzZXQoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW5uZXJTdGVwcGVycz8uZm9yRWFjaChzdGVwcGVyID0+IHtcclxuICAgICAgICAgICAgICAgICAgc3RlcHBlci5zZWxlY3RlZEluZGV4ID0gMDtcclxuICAgICAgICAgICAgICAgICAgc3RlcHBlci5yZXNldCgpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5uYXZpZ2F0aW9uRGF0YS5mb3JFYWNoKG4gPT4ge1xyXG4gICAgICAgICAgICAgIG4udmlzaXRlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgIG4uY29tcGxldGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgICBuLnN1Yk5vZGVzPy5mb3JFYWNoKHMgPT4ge1xyXG4gICAgICAgICAgICAgICAgcy52aXNpdGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBzLmNvbXBsZXRlID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIC8vIHJlc2V0IGJhY2sgdG8gZmFsc2UgdG8gYXZvaWQgbXVsdGlwbGUgdHJpZ2dlcnMgb24gZnV0dXJlIGNhbGxzXHJcbiAgICAgICAgICAgIGNvbmZpZy5uYXZpZ2F0aW9uLnNldHRpbmdzLnJlc2V0TmF2ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuY29uZmlnU2VydmljZS5jb25maWcgPSBjb25maWc7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgLy8gaWYgdGhlIHZhbHVlcyB3ZXJlIGNoYW5nZWQgYW5kIG5vdCBudWxsLCBpdCBtZWFucyB0aGF0IHRoZSBuYXYgd2FzIHRvZ2dsZWQgdG8gcHJvZ3Jlc3NcclxuICAgICAgICAgIGlmIChjb25maWc/Lm5hdmlnYXRpb24/LnNldHRpbmdzPy50b2dnbGVQcm9ncmVzc05hdlBhcmVudEluZGV4ICE9IG51bGxcclxuICAgICAgICAgICAgJiYgdGhpcy50b2dnbGVQcm9ncmVzc05hdlBhcmVudEluZGV4ICE9IGNvbmZpZz8ubmF2aWdhdGlvbj8uc2V0dGluZ3M/LnRvZ2dsZVByb2dyZXNzTmF2UGFyZW50SW5kZXhcclxuICAgICAgICAgICAgJiYgdGhpcy50b2dnbGVQcm9ncmVzc05hdkNoaWxkSW5kZXggIT0gY29uZmlnPy5uYXZpZ2F0aW9uPy5zZXR0aW5ncz8udG9nZ2xlUHJvZ3Jlc3NOYXZDaGlsZEluZGV4XHJcbiAgICAgICAgICAgICYmIGNvbmZpZz8ubmF2aWdhdGlvbj8uc2V0dGluZ3M/LnRvZ2dsZVByb2dyZXNzTmF2Q2hpbGRJbmRleCAhPSBudWxsKSB7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnRvZ2dsZVByb2dyZXNzTmF2UGFyZW50SW5kZXggPSBjb25maWcubmF2aWdhdGlvbi5zZXR0aW5ncy50b2dnbGVQcm9ncmVzc05hdlBhcmVudEluZGV4O1xyXG4gICAgICAgICAgICB0aGlzLnRvZ2dsZVByb2dyZXNzTmF2Q2hpbGRJbmRleCA9IGNvbmZpZy5uYXZpZ2F0aW9uLnNldHRpbmdzLnRvZ2dsZVByb2dyZXNzTmF2Q2hpbGRJbmRleDtcclxuXHJcbiAgICAgICAgICAgIC8vIGFkZCB0aGUgcm91dGVyIHN1YlxyXG4gICAgICAgICAgICB0aGlzLm5hdkJpbmRTdWIuYWRkKFxyXG4gICAgICAgICAgICAgIHRoaXMucm91dGVyLmV2ZW50cy5waXBlKGZpbHRlcihldmVudCA9PiBldmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25FbmQpKVxyXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoZXZlbnQ6IE5hdmlnYXRpb25FbmQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgLy8gZmluZCBwYXJlbnQgaW5kZXggd2l0aCBhY3RpdmUgY2hpbGRcclxuICAgICAgICAgICAgICAgICAgdGhpcy5nZXRBY3RpdmVQYXJlbnRBbmRDaGlsZChldmVudC51cmwpO1xyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgLy8gaWYgdGhlIGNoaWxkIG5vZGUgaW5kZXggaXMgdmFsaWRcclxuICAgICAgICAgICAgaWYgKGNvbmZpZy5uYXZpZ2F0aW9uLm5vZGVzW3RoaXMudG9nZ2xlUHJvZ3Jlc3NOYXZQYXJlbnRJbmRleF0uc3ViTm9kZXM/Lmxlbmd0aCA+IHRoaXMudG9nZ2xlUHJvZ3Jlc3NOYXZDaGlsZEluZGV4KSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5zZXROb2RlU3RhdGVzKGNvbmZpZy5uYXZpZ2F0aW9uLm5vZGVzW3RoaXMudG9nZ2xlUHJvZ3Jlc3NOYXZQYXJlbnRJbmRleF0sXHJcbiAgICAgICAgICAgICAgICBjb25maWcubmF2aWdhdGlvbi5ub2Rlc1t0aGlzLnRvZ2dsZVByb2dyZXNzTmF2UGFyZW50SW5kZXhdLnN1Yk5vZGVzW3RoaXMudG9nZ2xlUHJvZ3Jlc3NOYXZDaGlsZEluZGV4XSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5zZXROb2RlU3RhdGVzKGNvbmZpZy5uYXZpZ2F0aW9uLm5vZGVzW3RoaXMudG9nZ2xlUHJvZ3Jlc3NOYXZQYXJlbnRJbmRleF0sIG51bGwpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBpbmRleGVzXHJcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlUHJvZ3Jlc3NOYXZQYXJlbnRJbmRleCA9IGNvbmZpZz8ubmF2aWdhdGlvbj8uc2V0dGluZ3M/LnRvZ2dsZVByb2dyZXNzTmF2UGFyZW50SW5kZXhcclxuICAgICAgICAgICAgdGhpcy50b2dnbGVQcm9ncmVzc05hdkNoaWxkSW5kZXggPSBjb25maWc/Lm5hdmlnYXRpb24/LnNldHRpbmdzPy50b2dnbGVQcm9ncmVzc05hdkNoaWxkSW5kZXg7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBMaWZlIGN5Y2xlIGhvb2sgZm9yIGFmdGVyIGNvbXBvbmVudCB2aWV3IGluaXRpYWxpemF0aW9uICovXHJcbiAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnNldHRpbmdzLm1lbnVTdHlsZSA9PT0gJ3N0ZXBwZXInKSB7XHJcbiAgICAgIHRoaXMuYmluZFN0ZXBwZXJUb1JvdXRlcygpO1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICB0aGlzLnN0ZXBwZXIuc3RlcHMuZm9yRWFjaCgoc3RlcCwgaW5kZXgpID0+IHtcclxuICAgICAgICAgIHN0ZXAuc2VsZWN0ID0gKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUGFyZW50SW5kZXggPSBpbmRleDtcclxuICAgICAgICAgICAgdGhpcy5uYXZpZ2F0ZSh0aGlzLm5hdmlnYXRpb25EYXRhW2luZGV4XS5yb3V0ZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5pbm5lclN0ZXBwZXJzLmZvckVhY2goKHN0ZXBwZXIsIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICBzdGVwcGVyLnN0ZXBzLmZvckVhY2goKHN0ZXAsIGppbmRleCkgPT4ge1xyXG4gICAgICAgICAgICBzdGVwLnNlbGVjdCA9ICgpID0+IHtcclxuICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkQ2hpbGRJbmRleGVzW2luZGV4XSA9IGppbmRleDtcclxuICAgICAgICAgICAgICB0aGlzLm5hdmlnYXRlKHRoaXMubmF2aWdhdGlvbkRhdGFbaW5kZXhdLnN1Yk5vZGVzW2ppbmRleF0ucm91dGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnNpZGVOYXZTdWIgPSB0aGlzLnNpZGVuYXYub3BlbmVkQ2hhbmdlLnN1YnNjcmliZShkcmF3ZXJTdGF0ZSA9PiB7XHJcbiAgICAgIHRoaXMuaXNOYXZPcGVuID0gZHJhd2VyU3RhdGU7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKiBPbiBEZXN0cm95ICovXHJcbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5tb2JpbGVRdWVyeS5yZW1vdmVFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCB0aGlzLl9tb2JpbGVRdWVyeUxpc3RlbmVyKTtcclxuICAgIHRoaXMubmF2QmluZFN1Yi51bnN1YnNjcmliZSgpO1xyXG4gICAgdGhpcy5sb2dJblN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgdGhpcy5iYW5uZXJTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgIHRoaXMuY29uZmlnU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgICB0aGlzLnNpZGVOYXZTdWIudW5zdWJzY3JpYmUoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE1vYmlsZSBTdWJOYXYgLSBvcGVuIHRoZSBTdWJOYXZcclxuICAgKiBAcGFyYW0gbmF2IHRoZSBuYXYgZGF0YSB0byBiZSBwYXNzZWQgdG8gdGhlIFN1Yk5hdlxyXG4gICAqL1xyXG4gIHB1YmxpYyBvcGVuTW9iaWxlU3ViTmF2KG5hdjogTmF2Tm9kZSk6IHZvaWQge1xyXG4gICAgdGhpcy5pc01vYmlsZVN1Yk5hdk9wZW4gPSB0cnVlO1xyXG4gICAgdGhpcy5jdXJyZW50TW9iaWxlTmF2ID0gbmF2O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTW9iaWxlIFN1Yk5hdiAtIGNsb3NlcyB0aGUgU3ViTmF2XHJcbiAgICovXHJcbiAgcHVibGljIGNsb3NlTW9iaWxlU3ViTmF2KCk6IHZvaWQge1xyXG4gICAgdGhpcy5pc01vYmlsZVN1Yk5hdk9wZW4gPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHMgdGhlIHRoZW1lIGNvbG9yXHJcbiAgICogQHBhcmFtIHZhcmlhYmxlIHRoZSBjc3MgdmFyaWFibGUgbmFtZVxyXG4gICAqIEBwYXJhbSBjb2xvciB0aGUgY29sb3JcclxuICAgKi9cclxuICBwdWJsaWMgc2V0VGhlbWVDb2xvcih2YXJpYWJsZTogc3RyaW5nLCBjb2xvcjogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoYC0tc29mLW5hdi0ke3ZhcmlhYmxlfWAsIGNvbG9yKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERldGVybWluZXMgdGhlIHN0ZXAgc3RhdGVcclxuICAgKiBAcGFyYW0gcGFyZW50SW5kZXggVGhlIHBhcmVudCBpbmRleFxyXG4gICAqIEBwYXJhbSBjaGlsZEluZGV4IFRoZSBjaGlsZCBpbmRleFxyXG4gICAqIEByZXR1cm5zIFRoZSBzdGVwIHN0YXRlXHJcbiAgICovXHJcbiAgcHVibGljIGRldGVybWluZVN0ZXBTdGF0ZShwYXJlbnRJbmRleDogbnVtYmVyLCBjaGlsZEluZGV4OiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgLy8gbm90IHBhc3NlZCAmJiBub3QgYWN0aXZlXHJcbiAgICBpZiAoY2hpbGRJbmRleCA9PT0gLTEpIHtcclxuICAgICAgaWYgKCF0aGlzLnN0ZXBwZXIpIHtcclxuICAgICAgICByZXR1cm4gJ251bWJlcic7XHJcbiAgICAgIH1cclxuICAgICAgLy8gbm90IHBhc3NlZCAmJiBhY3RpdmVcclxuICAgICAgaWYgKHBhcmVudEluZGV4ID09PSB0aGlzLnN0ZXBwZXIuc2VsZWN0ZWRJbmRleCkge1xyXG4gICAgICAgIHRoaXMubmF2aWdhdGlvbkRhdGFbcGFyZW50SW5kZXhdLnZpc2l0ZWQgPSB0cnVlO1xyXG5cclxuICAgICAgICByZXR1cm4gJ2FjdGl2ZSc7XHJcbiAgICAgIH1cclxuICAgICAgLy8gcGFzc2VkIGJ1dCBuYXYgYmFja1xyXG4gICAgICBlbHNlIGlmIChwYXJlbnRJbmRleCA+IHRoaXMuc3RlcHBlci5zZWxlY3RlZEluZGV4ICYmIHRoaXMubmF2aWdhdGlvbkRhdGFbcGFyZW50SW5kZXhdLnZpc2l0ZWQpIHtcclxuICAgICAgICB0aGlzLnN0ZXBwZXIuc3RlcHMuZmluZCgocywgaW5kZXgpID0+IGluZGV4ID09PSBwYXJlbnRJbmRleClcclxuICAgICAgICAgIC5yZXNldCgpO1xyXG5cclxuICAgICAgICByZXR1cm4gJ2FjdGl2ZSc7XHJcbiAgICAgIH1cclxuICAgICAgLy8gcGFzc2VkICYmIG5vdCBhY3RpdmVcclxuICAgICAgZWxzZSBpZiAocGFyZW50SW5kZXggPCB0aGlzLnN0ZXBwZXIuc2VsZWN0ZWRJbmRleCkge1xyXG4gICAgICAgIHRoaXMubmF2aWdhdGlvbkRhdGFbcGFyZW50SW5kZXhdLnZpc2l0ZWQgPSB0cnVlO1xyXG5cclxuICAgICAgICByZXR1cm4gJ2RvbmUnO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHJldHVybiAnbnVtYmVyJztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmICghdGhpcy5pbm5lclN0ZXBwZXJzKSB7XHJcbiAgICAgICAgcmV0dXJuICdub25lJztcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBpbm5lclN0ZXBwZXIgPSB0aGlzLmlubmVyU3RlcHBlcnMuZmluZCgocywgaW5kZXgpID0+IGluZGV4ID09PSBwYXJlbnRJbmRleCk7XHJcbiAgICAgIGlmIChjaGlsZEluZGV4ID09PSBpbm5lclN0ZXBwZXIuc2VsZWN0ZWRJbmRleCkge1xyXG4gICAgICAgIHRoaXMubmF2aWdhdGlvbkRhdGFbcGFyZW50SW5kZXhdLnN1Yk5vZGVzW2NoaWxkSW5kZXhdLnZpc2l0ZWQgPSB0cnVlO1xyXG5cclxuICAgICAgICByZXR1cm4gJ2FjdGl2ZSc7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAoY2hpbGRJbmRleCA+IGlubmVyU3RlcHBlci5zZWxlY3RlZEluZGV4ICYmIHRoaXMubmF2aWdhdGlvbkRhdGFbcGFyZW50SW5kZXhdLnN1Yk5vZGVzW2NoaWxkSW5kZXhdLnZpc2l0ZWQpIHtcclxuICAgICAgICBpbm5lclN0ZXBwZXIuc3RlcHMuZmluZCgocywgaW5kZXgpID0+IGluZGV4ID09PSBjaGlsZEluZGV4KVxyXG4gICAgICAgICAgLnJlc2V0KCk7XHJcblxyXG4gICAgICAgIHJldHVybiAnYWN0aXZlJztcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmIChjaGlsZEluZGV4IDwgaW5uZXJTdGVwcGVyLnNlbGVjdGVkSW5kZXgpIHtcclxuICAgICAgICB0aGlzLm5hdmlnYXRpb25EYXRhW3BhcmVudEluZGV4XS5zdWJOb2Rlc1tjaGlsZEluZGV4XS52aXNpdGVkID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgcmV0dXJuICdkb25lJztcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICByZXR1cm4gJ25vbmUnO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBOYXZpZ2F0ZXMgdG8gdGhlIHByb3ZpZGVkIHJvdXRlXHJcbiAgICogQHBhcmFtIHJvdXRlIFRoZSByb3V0ZVxyXG4gICAqL1xyXG4gIHB1YmxpYyBuYXZpZ2F0ZShyb3V0ZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWZsb2F0aW5nLXByb21pc2VzXHJcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZUJ5VXJsKHJvdXRlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE5hdmlnYXRlcyB0byBnaXZlbiBzdGVwXHJcbiAgICogQHBhcmFtIHN0ZXBOdW1iZXIgVGhlIHN0ZXAgbnVtYmVyIHRvIG5hdmlnYXRlIHRvXHJcbiAgICovXHJcbiAgcHVibGljIG5hdmlnYXRlVG9TdGVwKHN0ZXBOdW1iZXI6IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKHN0ZXBOdW1iZXIgPCB0aGlzLnNlbGVjdGVkUGFyZW50SW5kZXgpIHtcclxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1mbG9hdGluZy1wcm9taXNlc1xyXG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZUJ5VXJsKHRoaXMubmF2aWdhdGlvbkRhdGFbc3RlcE51bWJlcl0ucm91dGUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0cyB0aGUgYWN0aXZlIHBhcmVudCBhbmQgY2hpbGQgbm9kZXMgXHJcbiAgICogQHBhcmFtIHVybCBUaGUgcm91dGVyIHVybFxyXG4gICAqL1xyXG4gIHB1YmxpYyBnZXRBY3RpdmVQYXJlbnRBbmRDaGlsZCh1cmw6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgbGV0IGNoaWxkSW5kZXg7XHJcbiAgICBsZXQgcGFyZW50SW5kZXggPSB0aGlzLm5hdmlnYXRpb25EYXRhLmZpbmRJbmRleChuID0+IHtcclxuICAgICAgY2hpbGRJbmRleCA9IG4uc3ViTm9kZXM/LmZpbmRJbmRleChzID0+IHVybC5pbmNsdWRlcyhzLnJvdXRlLnJlcGxhY2UoJy4nLCAnJykpKTtcclxuICAgICAgcmV0dXJuIGNoaWxkSW5kZXggPiAtMSB8fCB0aGlzLnJvdXRlci51cmwuaW5jbHVkZXMobi5yb3V0ZS5yZXBsYWNlKCcuJywgJycpKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGlmIChwYXJlbnRJbmRleCA9PSAtMSkge1xyXG4gICAgICBwYXJlbnRJbmRleCA9IDBcclxuICAgIH1cclxuXHJcbiAgICAvLyBzZXQgdGhlIGFjdGl2ZSBwYXJlbnQgbm9kZSBhbmQgc3ViIG5vZGVcclxuICAgIHRoaXMuYWN0aXZlUGFyZW50Tm9kZSA9IHRoaXMubmF2aWdhdGlvbkRhdGFbcGFyZW50SW5kZXhdO1xyXG4gICAgdGhpcy5hY3RpdmVTdWJOb2RlID0gY2hpbGRJbmRleCA+IC0xICYmIHRoaXMuYWN0aXZlUGFyZW50Tm9kZS5zdWJOb2Rlcy5sZW5ndGggPiAwID8gdGhpcy5hY3RpdmVQYXJlbnROb2RlLnN1Yk5vZGVzW2NoaWxkSW5kZXhdIDogbnVsbDtcclxuXHJcbiAgICAvLyBjb21wdXRlIHRoZSBwcm9ncmVzcyBiYXJcclxuICAgIHRoaXMubmF2UHJvZ3Jlc3NDb3VudCA9IChwYXJlbnRJbmRleCArIDEpIC8gdGhpcy5uYXZpZ2F0aW9uRGF0YS5sZW5ndGggKiAxMDA7XHJcblxyXG4gICAgLy8gc2V0IHRoZSBub2RlIHN0YXRlc1xyXG4gICAgdGhpcy5zZXROb2RlU3RhdGVzKHRoaXMuYWN0aXZlUGFyZW50Tm9kZSwgdGhpcy5hY3RpdmVTdWJOb2RlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHMgdGhlIGNvbXBsZXRlIGFuZCB2aXNpdGVkIHN0YXRlcyBmb3IgYWxsIE5hdk5vZGVzIFxyXG4gICAqIEBwYXJhbSBwYXJlbnROb2RlIFRoZSBwYXJlbnQgbm9kZVxyXG4gICAqIEBwYXJhbSBjaGlsZE5vZGUgVGhlIGNoaWxkIG5vZGVcclxuICAgKi9cclxuICBwdWJsaWMgc2V0Tm9kZVN0YXRlcyhwYXJlbnROb2RlOiBOYXZOb2RlLCBjaGlsZE5vZGU6IFN1Yk5hdk5vZGVzKTogdm9pZCB7XHJcbiAgICBpZiAoY2hpbGROb2RlKSB7XHJcbiAgICAgIHRoaXMuYWN0aXZlU3ViTm9kZSA9IGNoaWxkTm9kZTtcclxuICAgICAgbGV0IGNoaWxkSW5kZXggPSBwYXJlbnROb2RlLnN1Yk5vZGVzLmluZGV4T2YoY2hpbGROb2RlKSA+IC0xID8gcGFyZW50Tm9kZS5zdWJOb2Rlcy5pbmRleE9mKGNoaWxkTm9kZSkgOiAwO1xyXG4gICAgICAvLyBhbGwgc3Vibm9kZXMgYmVmb3JlIHRoaXMgd2VyZSBjb21wbGV0ZWQgYW5kIHZpc2l0ZWRcclxuICAgICAgcGFyZW50Tm9kZS5zdWJOb2Rlcy5zbGljZSgwLCBjaGlsZEluZGV4KS5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICAgIGVsZW1lbnQuY29tcGxldGUgPSB0cnVlO1xyXG4gICAgICAgIGVsZW1lbnQudmlzaXRlZCA9IHRydWU7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgdGhpcy5hY3RpdmVQYXJlbnROb2RlID0gcGFyZW50Tm9kZTtcclxuICAgIC8vIHNldCBhbGwgcHJldmlvdXMgbm9kZXMgdG8gY29tcGxldGVcclxuICAgIGxldCBwYXJlbnRJbmRleCA9IHRoaXMubmF2aWdhdGlvbkRhdGEuaW5kZXhPZihwYXJlbnROb2RlKSA+IC0xID8gdGhpcy5uYXZpZ2F0aW9uRGF0YS5pbmRleE9mKHBhcmVudE5vZGUpIDogMDtcclxuICAgIHRoaXMubmF2aWdhdGlvbkRhdGEuc2xpY2UoMCwgcGFyZW50SW5kZXgpLmZvckVhY2goZCA9PiB7XHJcbiAgICAgIGQuY29tcGxldGUgPSB0cnVlO1xyXG5cclxuICAgICAgLy8gc2V0IGFsbCBzdWJub2RlcyBvZiBwcmV2aW91cyBub2RlcyB0byBjb21wbGV0ZSBvbmx5IGlmIHRoZSBub2RlIHdhcyBub3QgZGlzYWJsZWRcclxuICAgICAgaWYgKCFkLmlzRGlzYWJsZWQpIHtcclxuICAgICAgICBkLnN1Yk5vZGVzLmZvckVhY2gocyA9PiB7XHJcbiAgICAgICAgICBzLmNvbXBsZXRlID0gdHJ1ZTtcclxuICAgICAgICAgIHMudmlzaXRlZCA9IHRydWU7XHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG4gICAgfSlcclxuICAgIC8vIHNldCB0aGUgY3VycmVudCBub2RlcyBhcyB2aXNpdGVkXHJcbiAgICBwYXJlbnROb2RlLnZpc2l0ZWQgPSB0cnVlO1xyXG4gICAgaWYgKGNoaWxkTm9kZSkge1xyXG4gICAgICBjaGlsZE5vZGUudmlzaXRlZCA9IHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgLyoqIEluaXRpYWxpemVzIHRoZSBiYXNpYyBuYXYgc2V0dGluZ3MgKi9cclxuICBwcml2YXRlIGluaXRCYXNpY1NldHRpbmdzKCk6IHZvaWQge1xyXG4gICAgdGhpcy5zZXR0aW5ncy5mb250QXdlc29tZU1lbnVJY29uID0gdGhpcy5zZXR0aW5ncy5mb250QXdlc29tZU1lbnVJY29uIHx8ICdmYXMgZmEtYW5nbGUtZG91YmxlLWxlZnQnO1xyXG4gICAgdGhpcy5zZXR0aW5ncy5mb250QXdlc29tZU1lbnVJY29uQ2xvc2VkID0gdGhpcy5zZXR0aW5ncy5mb250QXdlc29tZU1lbnVJY29uQ2xvc2VkIHx8ICdmYXMgZmEtYW5nbGUtZG91YmxlLXJpZ2h0JztcclxuICAgIHRoaXMuc2V0dGluZ3MuYWxsb3dOYXZUb2dnbGUgPSB0aGlzLnNldHRpbmdzLmFsbG93TmF2VG9nZ2xlID09IG51bGwgPyB0cnVlIDogdGhpcy5zZXR0aW5ncy5hbGxvd05hdlRvZ2dsZTtcclxuICAgIHRoaXMuc2V0dGluZ3MubWFpbk1lbnVUZXh0ID8gdGhpcy5tYWluTWVudVRleHQgPSB0aGlzLnNldHRpbmdzLm1haW5NZW51VGV4dCA6IHRoaXMubWFpbk1lbnVUZXh0ID0gJ01haW4gTWVudSc7XHJcbiAgICB0aGlzLnNldHRpbmdzLmhlYWRlckhlaWdodCA9IHRoaXMuc2V0dGluZ3MuaGVhZGVySGVpZ2h0IHx8IDYwO1xyXG4gICAgdGhpcy5zZXR0aW5ncy5tZW51QnV0dG9uU1JUZXh0ID0gdGhpcy5zZXR0aW5ncy5tZW51QnV0dG9uU1JUZXh0IHx8ICdNZW51IEJ1dHRvbic7XHJcbiAgICB0aGlzLnNldHRpbmdzLm1lbnVTdHlsZSA9IHRoaXMuc2V0dGluZ3MubWVudVN0eWxlIHx8ICdzdGF0aWMnO1xyXG4gICAgdGhpcy5zZXR0aW5ncy5kaXNwbGF5TnVtYmVycyA9IHRoaXMuc2V0dGluZ3MuZGlzcGxheU51bWJlcnMgPT0gbnVsbCA/IHRydWUgOiB0aGlzLnNldHRpbmdzLmRpc3BsYXlOdW1iZXJzO1xyXG4gICAgdGhpcy5zZXR0aW5ncy5wcm9ncmVzc1NlY3Rpb25Db21wbGV0ZUljb24gPSB0aGlzLnNldHRpbmdzLnByb2dyZXNzU2VjdGlvbkNvbXBsZXRlSWNvbiB8fCAnZmFzIGZhLWNoZWNrLWNpcmNsZSc7XHJcbiAgICB0aGlzLnNldHRpbmdzLnByb2dyZXNzU2VjdGlvbkZ1dHVyZUljb24gPSB0aGlzLnNldHRpbmdzLnByb2dyZXNzU2VjdGlvbkZ1dHVyZUljb24gfHwgJ2ZhciBmYS1jaXJjbGUnO1xyXG4gICAgdGhpcy5zZXR0aW5ncy5wcm9ncmVzc1NlY3Rpb25DdXJyZW50SWNvbiA9IHRoaXMuc2V0dGluZ3MucHJvZ3Jlc3NTZWN0aW9uQ3VycmVudEljb24gfHwgJ2ZhcyBmYS1jaXJjbGUnO1xyXG4gICAgdGhpcy5zZXR0aW5ncy5wcm9ncmVzc01lbnVDb21wbGV0ZUljb24gPSB0aGlzLnNldHRpbmdzLnByb2dyZXNzTWVudUNvbXBsZXRlSWNvbiB8fCAnZmFyIGZhLWNoZWNrJztcclxuICAgIHRoaXMuc2V0dGluZ3Muc2hvd1Byb2dyZXNzQmFyID0gdGhpcy5zZXR0aW5ncy5zaG93UHJvZ3Jlc3NCYXIgPT0gbnVsbCA/IHRydWUgOiB0aGlzLnNldHRpbmdzLnNob3dQcm9ncmVzc0JhclxyXG4gICAgdGhpcy5zZXR0aW5ncy5zaWRlTmF2V2lkdGhEZXNrdG9wID0gdGhpcy5zZXR0aW5ncy5zaWRlTmF2V2lkdGhEZXNrdG9wIHx8ICczNTAnO1xyXG4gICAgdGhpcy5zZXR0aW5ncy5zaWRlTmF2V2lkdGhNb2JpbGUgPSB0aGlzLnNldHRpbmdzLnNpZGVOYXZXaWR0aE1vYmlsZSB8fCAnMzUwJztcclxuICAgIHRoaXMuc2V0dGluZ3Mub3ZlcnJpZGVOYXZpZ2F0aW9uID0gdGhpcy5zZXR0aW5ncy5vdmVycmlkZU5hdmlnYXRpb24gfHwgZmFsc2U7XHJcbiAgICB0aGlzLnNldHRpbmdzLnByb2dyZXNzTWVudVdpZHRoID0gdGhpcy5zZXR0aW5ncy5wcm9ncmVzc01lbnVXaWR0aCB8fCAnMjgwJztcclxuICAgIHRoaXMuc2V0dGluZ3MudXNlQ3VzdG9tTW9iaWxlRm9vdGVyID0gdGhpcy5zZXR0aW5ncy51c2VDdXN0b21Nb2JpbGVGb290ZXIgIT0gbnVsbCA/IHRoaXMuc2V0dGluZ3MudXNlQ3VzdG9tTW9iaWxlRm9vdGVyIDogZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDbG9zZXMgdGhlIGV4cGFuc2lvbiBwYW5lbCBhbmQgbmF2aWdhdGVzIHRvIHRoZSBnaXZlbiBub2RlXHJcbiAgICogQHBhcmFtIGVsIFRoZSBtYXQgZXhwYW5zaW9uIHBhbmVsIFxyXG4gICAqIEBwYXJhbSBpbmRleCBUaGUgcGFyZW50IG5vZGUgaW5kZXggXHJcbiAgICovXHJcbiAgcHVibGljIGRpc2FibGVQYW5lbChlbCwgaW5kZXg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgZWwuY2xvc2UoKTtcclxuICAgIHRoaXMubmF2aWdhdGUodGhpcy5uYXZpZ2F0aW9uRGF0YVtpbmRleF0ucm91dGUpO1xyXG4gIH1cclxuXHJcbiAgLyoqIEluaXRpYWxpemVzIHRoZSBhZHZhbmNlZCBuYXYgc2V0dGluZ3MgKi9cclxuICBwcml2YXRlIGluaXRBZHZhbmNlZFNldHRpbmdzKCk6IHZvaWQge1xyXG4gICAgdGhpcy5hZHZhbmNlZFNldHRpbmdzLnRvcEdhcERlc2t0b3AgPSB0aGlzLmFkdmFuY2VkU2V0dGluZ3MudG9wR2FwRGVza3RvcCB8fCAwO1xyXG4gICAgdGhpcy5hZHZhbmNlZFNldHRpbmdzLnRvcEdhcE1vYmlsZSA9IHRoaXMuYWR2YW5jZWRTZXR0aW5ncy50b3BHYXBNb2JpbGUgfHwgdGhpcy5zZXR0aW5ncy5oZWFkZXJIZWlnaHQ7XHJcbiAgICB0aGlzLmFkdmFuY2VkU2V0dGluZ3MubWFyZ2luVG9wRGVza3RvcCA9IHRoaXMuYWR2YW5jZWRTZXR0aW5ncy5tYXJnaW5Ub3BEZXNrdG9wIHx8IDA7XHJcbiAgICB0aGlzLmFkdmFuY2VkU2V0dGluZ3MubWFyZ2luVG9wTW9iaWxlID0gdGhpcy5hZHZhbmNlZFNldHRpbmdzLm1hcmdpblRvcE1vYmlsZSB8fCAwO1xyXG5cclxuICB9XHJcblxyXG4gIC8qKiBJbml0aWFsaXplcyB0aGUgbmF2IHRoZW1lIHNldHRpbmdzICovXHJcbiAgcHJpdmF0ZSBpbml0VGhlbWVTZXR0aW5ncygpOiB2b2lkIHtcclxuICAgIHRoaXMudGhlbWVTZXR0aW5ncy5jb250ZW50QmdDb2xvciA/IHRoaXMuc2V0VGhlbWVDb2xvcignY29udGVudC1iZy1jb2xvcicsIHRoaXMudGhlbWVTZXR0aW5ncy5jb250ZW50QmdDb2xvcikgOiB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLnRoZW1lU2V0dGluZ3MuZm9udENvbG9yID8gdGhpcy5zZXRUaGVtZUNvbG9yKCdmb250LWNvbG9yJywgdGhpcy50aGVtZVNldHRpbmdzLmZvbnRDb2xvcikgOiB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLnRoZW1lU2V0dGluZ3MuZm9udENvbG9yID0gdGhpcy50aGVtZVNldHRpbmdzLmZvbnRDb2xvciB8fCAnIzAwMCc7XHJcbiAgICB0aGlzLnRoZW1lU2V0dGluZ3MubW9iaWxlQmdDb2xvciA9IHRoaXMudGhlbWVTZXR0aW5ncy5tb2JpbGVCZ0NvbG9yIHx8ICcjZmZmZmZmJztcclxuICAgIHRoaXMudGhlbWVTZXR0aW5ncy5iZ0dyYWRpZW50Q29sb3IxID8gdGhpcy5zZXRUaGVtZUNvbG9yKCdiZy1ncmFkaWVudC1jb2xvci0xJywgdGhpcy50aGVtZVNldHRpbmdzLmJnR3JhZGllbnRDb2xvcjEpIDogdW5kZWZpbmVkO1xyXG4gICAgdGhpcy50aGVtZVNldHRpbmdzLmJnR3JhZGllbnRDb2xvcjIgPyB0aGlzLnNldFRoZW1lQ29sb3IoJ2JnLWdyYWRpZW50LWNvbG9yLTInLCB0aGlzLnRoZW1lU2V0dGluZ3MuYmdHcmFkaWVudENvbG9yMikgOiB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLnRoZW1lU2V0dGluZ3MuYm9yZGVyUmlnaHRDb2xvciA/IHRoaXMuc2V0VGhlbWVDb2xvcignYm9yZGVyLXJpZ2h0LWNvbG9yJywgdGhpcy50aGVtZVNldHRpbmdzLmJvcmRlclJpZ2h0Q29sb3IpIDogdW5kZWZpbmVkO1xyXG4gICAgdGhpcy50aGVtZVNldHRpbmdzLmxpc3RCb3JkZXJDb2xvciA/IHRoaXMuc2V0VGhlbWVDb2xvcignbGlzdC1ib3JkZXItY29sb3InLCB0aGlzLnRoZW1lU2V0dGluZ3MubGlzdEJvcmRlckNvbG9yKSA6IHVuZGVmaW5lZDtcclxuICAgIHRoaXMudGhlbWVTZXR0aW5ncy5oaWdobGlnaHRHcmFkaWVudDEgPyB0aGlzLnNldFRoZW1lQ29sb3IoJ2hpZ2hsaWdodC1ncmFkaWVudC0xJywgdGhpcy50aGVtZVNldHRpbmdzLmhpZ2hsaWdodEdyYWRpZW50MSkgOiB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLnRoZW1lU2V0dGluZ3MuaGlnaGxpZ2h0R3JhZGllbnQyID8gdGhpcy5zZXRUaGVtZUNvbG9yKCdoaWdobGlnaHQtZ3JhZGllbnQtMicsIHRoaXMudGhlbWVTZXR0aW5ncy5oaWdobGlnaHRHcmFkaWVudDIpIDogdW5kZWZpbmVkO1xyXG4gICAgdGhpcy50aGVtZVNldHRpbmdzLnN1YkhpZ2hsaWdodEJvcmRlckNvbG9yID9cclxuICAgICAgdGhpcy5zZXRUaGVtZUNvbG9yKCdzdWItaGlnaGxpZ2h0LWJvcmRlci1jb2xvcicsIHRoaXMudGhlbWVTZXR0aW5ncy5zdWJIaWdobGlnaHRCb3JkZXJDb2xvcikgOiB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLnRoZW1lU2V0dGluZ3Muc3ViSGlnaGxpZ2h0QmdDb2xvciA/XHJcbiAgICAgIHRoaXMuc2V0VGhlbWVDb2xvcignc3ViLWhpZ2hsaWdodC1iZy1jb2xvcicsIHRoaXMudGhlbWVTZXR0aW5ncy5zdWJIaWdobGlnaHRCZ0NvbG9yKSA6IHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG4gIC8qKiBCaW5kcyB0aGUgc3RlcHBlciB0byB0aGUgcm91dGVyICovXHJcbiAgcHJpdmF0ZSBiaW5kU3RlcHBlclRvUm91dGVzKCk6IHZvaWQge1xyXG4gICAgLy8gZmluZCBwYXJlbnRzXHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgLy8gZmluZCBwYXJlbnQgaW5kZXggd2l0aCBhY3RpdmUgY2hpbGRcclxuICAgICAgbGV0IGNoaWxkSW5kZXg7XHJcbiAgICAgIGxldCBwYXJlbnRJbmRleCA9IHRoaXMubmF2aWdhdGlvbkRhdGEuZmluZEluZGV4KG4gPT4ge1xyXG4gICAgICAgIGNoaWxkSW5kZXggPSBuLnN1Yk5vZGVzPy5maW5kSW5kZXgocyA9PiB0aGlzLnJvdXRlci51cmwuaW5jbHVkZXMocy5yb3V0ZS5yZXBsYWNlKCcuJywgJycpKSk7XHJcblxyXG4gICAgICAgIHJldHVybiBjaGlsZEluZGV4ID4gLTEgfHwgdGhpcy5yb3V0ZXIudXJsLmluY2x1ZGVzKG4ucm91dGUucmVwbGFjZSgnLicsICcnKSk7XHJcbiAgICAgIH0pO1xyXG4gICAgICAvLyBpZiBubyBjaGlsZHJlbiBvciBubyBpbmRleGVzIGFjdGl2YXRlIGZpcnN0IHBhcmVudFxyXG4gICAgICBpZiAocGFyZW50SW5kZXggPT09IC0xKSB7XHJcbiAgICAgICAgcGFyZW50SW5kZXggPSAwO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLnNlbGVjdGVkUGFyZW50SW5kZXggPSBwYXJlbnRJbmRleDtcclxuICAgICAgaWYgKGNoaWxkSW5kZXggPiAtMSkge1xyXG4gICAgICAgIHRoaXMuaW5uZXJTdGVwcGVycy5maW5kKChpcywgaW5kZXgpID0+IGluZGV4ID09PSBwYXJlbnRJbmRleCkuc2VsZWN0ZWRJbmRleCA9IGNoaWxkSW5kZXg7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIC8vIGZpbmQgcGFyZW50c1xyXG4gICAgdGhpcy5uYXZCaW5kU3ViLmFkZChcclxuICAgICAgdGhpcy5yb3V0ZXIuZXZlbnRzLnBpcGUoZmlsdGVyKGV2ZW50ID0+IGV2ZW50IGluc3RhbmNlb2YgTmF2aWdhdGlvbkVuZCkpXHJcbiAgICAgICAgLnN1YnNjcmliZSgoZXZlbnQ6IE5hdmlnYXRpb25FbmQpID0+IHtcclxuICAgICAgICAgIC8vIGZpbmQgcGFyZW50IGluZGV4IHdpdGggYWN0aXZlIGNoaWxkXHJcbiAgICAgICAgICBsZXQgY2hpbGRJbmRleDtcclxuICAgICAgICAgIGxldCBwYXJlbnRJbmRleCA9IHRoaXMubmF2aWdhdGlvbkRhdGEuZmluZEluZGV4KG4gPT4ge1xyXG4gICAgICAgICAgICBjaGlsZEluZGV4ID0gbi5zdWJOb2Rlcz8uZmluZEluZGV4KHMgPT4gZXZlbnQudXJsQWZ0ZXJSZWRpcmVjdHMuaW5jbHVkZXMocy5yb3V0ZS5yZXBsYWNlKCcuJywgJycpKSk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gY2hpbGRJbmRleCA+IC0xIHx8IGV2ZW50LnVybEFmdGVyUmVkaXJlY3RzLmluY2x1ZGVzKG4ucm91dGUucmVwbGFjZSgnLicsICcnKSk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIC8vIGlmIG5vIGNoaWxkcmVuIG9yIG5vIGluZGV4ZXMgYWN0aXZhdGUgZmlyc3QgcGFyZW50XHJcbiAgICAgICAgICBpZiAocGFyZW50SW5kZXggPT09IC0xKSB7XHJcbiAgICAgICAgICAgIHBhcmVudEluZGV4ID0gMDtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkUGFyZW50SW5kZXggPSBwYXJlbnRJbmRleDtcclxuICAgICAgICAgIGlmIChjaGlsZEluZGV4ID4gLTEpIHtcclxuICAgICAgICAgICAgdGhpcy5pbm5lclN0ZXBwZXJzLmZpbmQoKGlzLCBpbmRleCkgPT4gaW5kZXggPT09IHBhcmVudEluZGV4KS5zZWxlY3RlZEluZGV4ID0gY2hpbGRJbmRleDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogSGlkZXMgdGhlIG1lc3NhZ2VcclxuICAqL1xyXG4gIHB1YmxpYyBoaWRlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5zaG93TWVzc2FnZSA9IGZhbHNlO1xyXG4gIH1cclxuXHJcblxyXG4gIC8qKlxyXG4gICAqIExvZ3Mgb3V0IG9uY2UgdXNlciBpcyBhdXRob3JpemVkXHJcbiAgICogKi9cclxuICBwdWJsaWMgbG9nT3V0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5hdXRob3JpemF0aW9uU2VydmljZS5hdXRob3JpemVVc2VyKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBJcyB0aGUgbmF2aWdhdGlvbiBzZWxlY3RlZFxyXG4gICAqL1xyXG4gIHB1YmxpYyBpc05hdlNlbGVjdGVkKG5vZGU6IE5hdk5vZGUgfCBTdWJOYXZOb2Rlcyk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMucm91dGVyLmlzQWN0aXZlKG5vZGUucm91dGUsIHRydWUpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFNldHMgdGhlIHdpZHRoIGZvciB0aGUgc2lkZSBuYXYgKi9cclxuICBwdWJsaWMgc2V0TmF2V2lkdGgod2lkdGg6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gd2lkdGguaW5jbHVkZXMoJyUnKSB8fCB3aWR0aC5pbmNsdWRlcygncHgnKSA/IHdpZHRoIDogd2lkdGggKyAncHgnO1xyXG4gIH1cclxufVxyXG4iXX0=
542
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF2aWdhdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiQzovRGV2ZWxvcG1lbnQ5L2Fkb19naXQvQXJtYXR1cmUvbGlicmFyeS9wcm9qZWN0cy9hcm1hdHVyZS9zcmMvIiwic291cmNlcyI6WyJsaWIvbmF2aWdhdGlvbi9jb21wb25lbnRzL25hdmlnYXRpb24vbmF2aWdhdGlvbi5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzlELE9BQU8sRUFBaUIsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQXFCLFFBQVEsRUFBRSxNQUFNLEVBQWEsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUkxSyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3hELE9BQU8sRUFBYyxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDaEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXhDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDhDQUE4QyxDQUFDO0FBQ3BGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUN0RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztXQWdCaEMsRUFBRSwyQkFBMkIsRUFBRSxLQUFLLEVBQUU7QUFWckYsMEZBQTBGO0FBRTFGOztHQUVHO0FBU0gsTUFBTSxPQUFPLDJCQUEyQjtJQXlIdEM7Ozs7Ozs7O09BUUc7SUFDSCxZQUNXLGlCQUFvQyxFQUNwQyxLQUFtQixFQUNYLE1BQWMsRUFDdkIsYUFBNEIsRUFDbkIsb0JBQTBDLEVBQzlCLGFBQWdDO1FBTHBELHNCQUFpQixHQUFqQixpQkFBaUIsQ0FB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a0IsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGtCQUFrQixJQUFJLEtBQUssQ0FBQztRQUM3RSxJQUFJLENBQUMsUUFBUSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsa0JBQWtCLElBQUksS0FBSyxDQUFDO1FBQzdFLElBQUksQ0FBQyxRQUFRLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsSUFBSSxLQUFLLENBQUM7UUFDM0UsSUFBSSxDQUFDLFFBQVEsQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLHFCQUFxQixJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQ2xJLENBQUM7OztZQXRuQkYsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSxtQkFBbUI7Z0JBQzdCLDJ0NEJBQTBDO2dCQUUxQyxTQUFTLEVBQUUsQ0FBQzt3QkFDVixPQUFPLEVBQUUsc0JBQXNCO3dCQUFFLFFBQVEsSUFBd0M7cUJBQ2xGLENBQUM7O2FBQ0g7OztZQTVCdUIsaUJBQWlCO1lBRmhDLFlBQVk7WUFNRyxNQUFNO1lBS3JCLGFBQWE7WUFEYixvQkFBb0I7WUFFcEIsaUJBQWlCLHVCQTJKckIsUUFBUTs7O3NCQXJJVixTQUFTLFNBQUMsYUFBYTtzQkFHdkIsU0FBUyxTQUFDLE1BQU07NkJBR2hCLFNBQVMsU0FBQyxPQUFPOzRCQUdqQixZQUFZLFNBQUMsa0JBQWtCOzZCQUcvQixLQUFLO3VCQUdMLEtBQUs7K0JBR0wsS0FBSzs0QkFHTCxLQUFLOytCQUdMLEtBQUs7MEJBR0wsS0FBSzt5QkFHTCxLQUFLOzJCQUdMLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBNZWRpYU1hdGNoZXIgfSBmcm9tICdAYW5ndWxhci9jZGsvbGF5b3V0JztcclxuaW1wb3J0IHsgU1RFUFBFUl9HTE9CQUxfT1BUSU9OUyB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9zdGVwcGVyJztcclxuaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIE9wdGlvbmFsLCBPdXRwdXQsIFF1ZXJ5TGlzdCwgVmlld0NoaWxkLCBWaWV3Q2hpbGRyZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTWF0RXhwYW5zaW9uUGFuZWwgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9leHBhbnNpb24nO1xyXG5pbXBvcnQgeyBNYXRTaWRlbmF2IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc2lkZW5hdic7XHJcbmltcG9ydCB7IE1hdFZlcnRpY2FsU3RlcHBlciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3N0ZXBwZXInO1xyXG5pbXBvcnQgeyBOYXZpZ2F0aW9uRW5kLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgZmlsdGVyIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBCYXNlQ29uZmlnIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9tb2RlbHMvYmFzZS1jb25maWcnO1xyXG5pbXBvcnQgeyBBdXRob3JpemF0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZXMvYXV0aG9yaXphdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQmFubmVyU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZXMvYmFubmVyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBCYXNlQ29uZmlnU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZXMvYmFzZS1jb25maWcuc2VydmljZSc7XHJcbmltcG9ydCB7IEhlYWRlckxhbmd1YWdlU2V0dGluZ3MgfSBmcm9tICcuLi8uLi8uLi9oZWFkZXIvbW9kZWxzL2hlYWRlci1sYW5ndWFnZS5zZXR0aW5ncyc7XHJcbmltcG9ydCB7IE5hdmlnYXRpb25UaGVtZVNldHRpbmdzIH0gZnJvbSAnLi4vLi4vbW9kZWxzL25hdi10aGVtZS5zZXR0aW5ncyc7XHJcbmltcG9ydCB7IE5hdmlnYXRpb25BZHZhbmNlZFNldHRpbmdzLCBOYXZpZ2F0aW9uU2V0dGluZ3MgfSBmcm9tICcuLi8uLi9tb2RlbHMvbmF2LnNldHRpbmdzJztcclxuaW1wb3J0IHsgTmF2Tm9kZSwgU3ViTmF2Tm9kZXMgfSBmcm9tICcuLi8uLi9tb2RlbHMvbmF2aWdhdGlvbic7XHJcblxyXG4vLyBUT0RPOiBzZWUgaG93IHRoaXMgY2FuIGZpdCB3aXRoIHRoZSBgc29mLXByb2dyZXNzLWJhcmAgY29tcG9uZW50LiBQb3NzaWJseSBjb21iaW5lIHRoZW1cclxuXHJcbi8qKlxyXG4gKiBUaGUgTmF2aWdhdGlvbiBDb21wb25lbnRcclxuICovXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnc29mLWFyLW5hdmlnYXRpb24nLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9uYXZpZ2F0aW9uLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9uYXZpZ2F0aW9uLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgcHJvdmlkZXJzOiBbe1xyXG4gICAgcHJvdmlkZTogU1RFUFBFUl9HTE9CQUxfT1BUSU9OUywgdXNlVmFsdWU6IHsgZGlzcGxheURlZmF1bHRJbmRpY2F0b3JUeXBlOiBmYWxzZSB9XHJcbiAgfV1cclxufSlcclxuZXhwb3J0IGNsYXNzIEFybWF0dXJlTmF2aWdhdGlvbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcclxuXHJcbiAgLyoqIFRoZSBwYXJlbnQgc3RlcHBlciAqL1xyXG4gIEBWaWV3Q2hpbGQoJ3ZlcnRTdGVwcGVyJykgcHVibGljIHN0ZXBwZXI6IE1hdFZlcnRpY2FsU3RlcHBlcjtcclxuXHJcbiAgLyoqIFRoZSBzaWRlIG1vYmlsZSBuYXYgKi9cclxuICBAVmlld0NoaWxkKCdzbmF2JykgcHVibGljIHNpZGVuYXY6IE1hdFNpZGVuYXY7XHJcblxyXG4gIC8qKiBUaGUgbW9iaWxlIGV4cGFuc2lvbiBwYW5lbCBmb3IgcHJvZ3Jlc3MgbWVudSAqL1xyXG4gIEBWaWV3Q2hpbGQoJ3BhbmVsJykgcHVibGljIGV4cGFuc2lvblBhbmVsOiBNYXRFeHBhbnNpb25QYW5lbDtcclxuXHJcbiAgLyoqIFRoZSBjaGlsZCBzdGVwcGVycyAqL1xyXG4gIEBWaWV3Q2hpbGRyZW4oJ3ZlcnRTdGVwcGVySW5uZXInKSBwdWJsaWMgaW5uZXJTdGVwcGVyczogUXVlcnlMaXN0PE1hdFZlcnRpY2FsU3RlcHBlcj47XHJcblxyXG4gIC8qKiBDb21wb25lbnQgSW5wdXQgLSB0aGUgbmF2aWdhdGlvbiBkYXRhICovXHJcbiAgQElucHV0KCkgcHVibGljIG5hdmlnYXRpb25EYXRhOiBOYXZOb2RlW107XHJcblxyXG4gIC8qKiBDb21wb25lbnQgSW5wdXQgLSB0aGUgbmF2aWdhdGlvbiBzZXR0aW5ncyAqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBzZXR0aW5nczogTmF2aWdhdGlvblNldHRpbmdzID0ge307XHJcblxyXG4gIC8qKiBDb21wb25lbnQgSW5wdXQgLSB0aGUgbmF2aWdhdGlvbiBzZXR0aW5ncyAqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBhZHZhbmNlZFNldHRpbmdzOiBOYXZpZ2F0aW9uQWR2YW5jZWRTZXR0aW5ncyA9IHt9O1xyXG5cclxuICAvKiogQ29tcG9uZW50IElucHV0IC0gdGhlIG5hdmlnYXRpb24gc2V0dGluZ3MgKi9cclxuICBASW5wdXQoKSBwdWJsaWMgdGhlbWVTZXR0aW5nczogTmF2aWdhdGlvblRoZW1lU2V0dGluZ3MgPSB7fTtcclxuXHJcbiAgLyoqIENvbXBvbmVudCBJbnB1dCAtIHRoZSBuYXZpZ2F0aW9uIGxhbmd1YWdlIHNldHRpbmdzICovXHJcbiAgQElucHV0KCkgcHVibGljIGxhbmd1YWdlU2V0dGluZ3M6IEhlYWRlckxhbmd1YWdlU2V0dGluZ3MgPSB7fTtcclxuXHJcbiAgLyoqIEN1cnJlbnQgbGFuZ3VhZ2UgKiovXHJcbiAgQElucHV0KCkgcHVibGljIGN1cnJlbnRMYW5nOiBzdHJpbmc7XHJcblxyXG4gIC8qKiBsb2dPdXQgdGV4dCAqKi9cclxuICBASW5wdXQoKSBwdWJsaWMgbG9nT3V0VGV4dDogc3RyaW5nO1xyXG5cclxuICAvKiogU2V0cyBsYW5ndWFnZSAqKi9cclxuICBAT3V0cHV0KCkgcHVibGljIHNldExhbmd1YWdlJDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgLyoqIGdldHMgdGhlIG5vbiB1c2VkIGxhbmd1YWdlICovXHJcbiAgcHVibGljIGdldCBvdGhlckxhbmdUZXh0KCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5sYW5ndWFnZVNldHRpbmdzPy5sYW5ndWFnZXM/LmZpbmQoeCA9PiB4ICE9PSB0aGlzLmN1cnJlbnRMYW5nKTtcclxuICB9XHJcblxyXG4gIC8qKiBXaGV0aGVyIHNpZGUgbmF2IGlzIG9wZW4gb3Igbm90ICovXHJcbiAgcHVibGljIGlzTmF2T3BlbjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvKiogTW9iaWxlIFN1Yk5hdiAtIHdoZXRoZXIgb3Igbm90IHRoZSBtb2JpbGUgU3ViTmF2IGlzIG9wZW4gKi9cclxuICBwdWJsaWMgaXNNb2JpbGVTdWJOYXZPcGVuOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8qKiBNb2JpbGUgU3ViTmF2IC10aGUgZGF0YSB0byBiZSBwYXNzZWQgdG8gdGhlIG1vYmlsZSBTdWJOYXYgKi9cclxuICBwdWJsaWMgY3VycmVudE1vYmlsZU5hdjogTmF2Tm9kZTtcclxuXHJcbiAgLyoqIFNldHRpbmdzIC0gdGhlIG1haW4gbWVudSB0ZXh0IHRoYXQgYXBwZWFycyBpbiB0aGUgbW9iaWxlIFN1Yk5hdiAqL1xyXG4gIHB1YmxpYyBtYWluTWVudVRleHQ6IHN0cmluZztcclxuXHJcbiAgLyoqIHRoZSBtb2JpbGUgcXVlcnkgKi9cclxuICBwdWJsaWMgbW9iaWxlUXVlcnk6IE1lZGlhUXVlcnlMaXN0O1xyXG5cclxuICAvKiogVGhlIHNlbGVjdGVkIHBhcmVudCBpbmRleCAqL1xyXG4gIHB1YmxpYyBzZWxlY3RlZFBhcmVudEluZGV4OiBudW1iZXIgPSAwO1xyXG5cclxuICAvKiogVGhlIHNlbGVjdGVkIGNoaWxkIGluZGV4ICovXHJcbiAgcHVibGljIHNlbGVjdGVkQ2hpbGRJbmRleGVzOiB7IFtrZXk6IG51bWJlcl06IG51bWJlciB9ID0ge307XHJcblxyXG4gIC8qKiBUaGUgbmF2aWdhdGlvbiBwcm9ncmVzcyBjb3VudCAqL1xyXG4gIHB1YmxpYyBuYXZQcm9ncmVzc0NvdW50OiBudW1iZXIgPSAwO1xyXG5cclxuICAvKiogVGhlIGN1cnJlbnQgYWN0aXZlIHBhcmVudCBub2RlICovXHJcbiAgcHVibGljIGFjdGl2ZVBhcmVudE5vZGU6IE5hdk5vZGU7XHJcblxyXG4gIC8qKiBUaGUgY3VycmVudCBhY3RpdmUgc3ViIG5vZGUgKi9cclxuICBwdWJsaWMgYWN0aXZlU3ViTm9kZTogU3ViTmF2Tm9kZXM7XHJcblxyXG4gIC8qKiBUcnVlIGlmIHRoZSBleHBhbnNpb24gcGFuZWwgaXMgb3BlbiAqL1xyXG4gIHB1YmxpYyBwYW5lbE9wZW5TdGF0ZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvKiogVGhlIGZvb3RlciBuYXZpZ2F0aW9uIGRhdGEgKi9cclxuICBwdWJsaWMgZm9vdGVyTmF2aWdhdGlvbkRhdGE6IE5hdk5vZGVbXVxyXG5cclxuICAvKiogdXNlciBuYW1lICoqL1xyXG4gIHB1YmxpYyB1c2VyTmFtZTogc3RyaW5nO1xyXG5cclxuICAvKiogVGhlIGNvbmZpZyBvYnNlcnZhYmxlICovXHJcbiAgcHVibGljIGNvbmZpZyQ6IE9ic2VydmFibGU8QmFzZUNvbmZpZz47XHJcblxyXG4gIC8qKiBUaGUgcGFyZW50IG5vZGUgaW5kZXggdG8gYmUgc2V0IHdoZW4gbmF2IGlzIHRvZ2dsZWQgdG8gcHJvZ3Jlc3MgbWVudSBzdHlsZSAqL1xyXG4gIHB1YmxpYyB0b2dnbGVQcm9ncmVzc05hdlBhcmVudEluZGV4OiBudW1iZXI7XHJcblxyXG4gIC8qKiBUaGUgY2hpbGQgbm9kZSBpbmRleCB0byBiZSBzZXQgd2hlbiBuYXYgaXMgdG9nZ2xlZCB0byBwcm9ncmVzcyBtZW51IHN0eWxlICovXHJcbiAgcHVibGljIHRvZ2dsZVByb2dyZXNzTmF2Q2hpbGRJbmRleDogbnVtYmVyO1xyXG5cclxuICAvKiogdGhlIG1vYmlsZSBxdWVyeSBsaXN0ZW5lcjIgKi9cclxuICBwcml2YXRlIHJlYWRvbmx5IF9tb2JpbGVRdWVyeUxpc3RlbmVyOiAoKSA9PiB2b2lkO1xyXG5cclxuICAvKiogVGhlIG5hdiBiaW5kIHN1YnNjcmlwdGlvbiAqL1xyXG4gIHByaXZhdGUgbmF2QmluZFN1YjogU3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xyXG5cclxuICAvKiogVGhlIG1lc3NhZ2UgdG8gZGlzcGxheSAqL1xyXG4gIHB1YmxpYyBtZXNzYWdlOiBzdHJpbmc7XHJcblxyXG4gIC8qKiBXaGV0aGVyIHdlIHNob3VsZCB0aGUgbWVzc2FnZSAqL1xyXG4gIHB1YmxpYyBzaG93TWVzc2FnZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvKiogV2hldGhlciBzaG91bGQgc2hvdyBjaGVjayBtYXJrIG9yIG5vdCAqL1xyXG4gIHB1YmxpYyBzaG93Q2hlY2tNYXJrOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgLyoqIFRoZSBuYXYgYmluZCBzdWJzY3JpcHRpb24gKi9cclxuICBwcml2YXRlIGxvZ0luU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XHJcblxyXG4gIC8qKiBUaGUgY291bnQgb2YgZm9vdGVyIGl0ZW1zKi9cclxuICBwdWJsaWMgZm9vdGVySXRlbUNvdW50OiBudW1iZXI7XHJcblxyXG4gIC8qKiBUaGUgYmFubmVyIHN1YnNjcmlwdGlvbiAqL1xyXG4gIHByaXZhdGUgYmFubmVyU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XHJcblxyXG4gIC8qKiBUaGUgY29uZmlnIHN1YnNjcmlwdGlvbiAqL1xyXG4gIHB1YmxpYyBjb25maWdTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcclxuXHJcbiAgLyoqIFRoZSBzaWRlbmF2IHN1YnNjcmlwdGlvbiAqL1xyXG4gIHByaXZhdGUgc2lkZU5hdlN1YjogU3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xyXG5cclxuICAvKipcclxuICAgKiB0aGUgY29uc3RydWN0b3JcclxuICAgKiBAcGFyYW0gY2hhbmdlRGV0ZWN0b3JSZWYgdGhlIGNoYW5nZSBkZXRlY3RvciByZWZlcmVuY2VcclxuICAgKiBAcGFyYW0gbWVkaWEgdGhlIG1lZGlhIG1hdGNoZXJcclxuICAgKiBAcGFyYW0gcm91dGVyIFRoZSByb3V0ZXJcclxuICAgKiBAcGFyYW0gYmFubmVyU2VydmljZSBUaGUgQmFubmVyIFNlcnZpY2VcclxuICAgKiBAcGFyYW0gYWN0aXZhdGVkUm91dGUgVGhlIGFjdGl2YXRlZCByb3V0ZVxyXG4gICAqIEBwYXJhbSBjb25maWdTZXJ2aWNlIFRoZSBjb25maWcgc2VydmljZVxyXG4gICAqL1xyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcmVhZG9ubHkgY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgcmVhZG9ubHkgbWVkaWE6IE1lZGlhTWF0Y2hlcixcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgcm91dGVyOiBSb3V0ZXIsXHJcbiAgICBwcml2YXRlIGJhbm5lclNlcnZpY2U6IEJhbm5lclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGF1dGhvcml6YXRpb25TZXJ2aWNlOiBBdXRob3JpemF0aW9uU2VydmljZSxcclxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgcmVhZG9ubHkgY29uZmlnU2VydmljZTogQmFzZUNvbmZpZ1NlcnZpY2VcclxuICApIHtcclxuICAgIHRoaXMubW9iaWxlUXVlcnkgPSBtZWRpYS5tYXRjaE1lZGlhKCcobWF4LXdpZHRoOiA5NTlweCknKTtcclxuICAgIHRoaXMuX21vYmlsZVF1ZXJ5TGlzdGVuZXIgPSAoKSA9PiB7XHJcbiAgICAgIGNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgLy8gY2xvc2UgdGhlIHNpZGVuYXYgd2hlbiBzY3JlZW4gc2l6ZSBpcyBjaGFuZ2VkXHJcbiAgICAgIGlmICghdGhpcy5tb2JpbGVRdWVyeS5tYXRjaGVzICYmIHRoaXMuc2V0dGluZ3MubWVudVN0eWxlID09PSAncHJvZ3Jlc3MnKSB7XHJcbiAgICAgICAgdGhpcy5zaWRlbmF2LmNsb3NlKCk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgICAvLyBiZWxvdyBpZiBzdGF0ZW1lbnQgaXMgZm9yIGVkZ2Ugc3VwcG9ydCBzaW5jZSBhZGRFdmVudExpc3RlbmVyIGRvZXNuJ3QgZXhpc3QgZm9yIE1lZGlhUXVlcnlMaXN0c1xyXG4gICAgaWYgKHRoaXMubW9iaWxlUXVlcnkuYWRkRXZlbnRMaXN0ZW5lcikge1xyXG4gICAgICB0aGlzLm1vYmlsZVF1ZXJ5LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIHRoaXMuX21vYmlsZVF1ZXJ5TGlzdGVuZXIpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMubW9iaWxlUXVlcnkuYWRkTGlzdGVuZXIodGhpcy5fbW9iaWxlUXVlcnlMaXN0ZW5lcik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogT24gSW5pdCAtIGNvbmZpZ3VyZSB0aGUgc2V0dGluZ3MgKi9cclxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XHJcblxyXG4gICAgdGhpcy5iYW5uZXJTdWJzY3JpcHRpb24uYWRkKHRoaXMuYmFubmVyU2VydmljZS5zaG93QmFubmVyJC5zdWJzY3JpYmUodmFsID0+IHRoaXMuc2hvd01lc3NhZ2UgPSB2YWwpKTtcclxuICAgIHRoaXMuYmFubmVyU3Vic2NyaXB0aW9uLmFkZCh0aGlzLmJhbm5lclNlcnZpY2UubWVzc2FnZSQuc3Vic2NyaWJlKHZhbCA9PiB0aGlzLm1lc3NhZ2UgPSB2YWwpKTtcclxuICAgIHRoaXMuYmFubmVyU3Vic2NyaXB0aW9uLmFkZCh0aGlzLmJhbm5lclNlcnZpY2Uuc2hvd0NoZWNrTWFyayQuc3Vic2NyaWJlKHZhbCA9PiB0aGlzLnNob3dDaGVja01hcmsgPSB2YWwpKTtcclxuXHJcbiAgICB0aGlzLmZvb3Rlck5hdmlnYXRpb25EYXRhID0gdGhpcy5uYXZpZ2F0aW9uRGF0YT8uZmlsdGVyKG5vZGUgPT4gbm9kZT8uYWx0TG9jYXRpb24gPT0gdHJ1ZSk7XHJcbiAgICB0aGlzLmZvb3Rlckl0ZW1Db3VudCA9IHRoaXMuZm9vdGVyTmF2aWdhdGlvbkRhdGEgPyB0aGlzLmZvb3Rlck5hdmlnYXRpb25EYXRhLmxlbmd0aCA6IDA7XHJcbiAgICB0aGlzLm5hdmlnYXRpb25EYXRhID0gdGhpcy5uYXZpZ2F0aW9uRGF0YT8uZmlsdGVyKG5vZGUgPT4gbm9kZT8uYWx0TG9jYXRpb24gIT0gdHJ1ZSk7XHJcblxyXG4gICAgLy8gaWYgcGFyZW50cyBoYXZlIG5vIHJvdXRlLCBncmFiIGZpcnN0IHJvdXRlIG9mIGNoaWxkXHJcbiAgICB0aGlzLm5hdmlnYXRpb25EYXRhPy5mb3JFYWNoKG4gPT4ge1xyXG4gICAgICBpZiAoIW4ucm91dGUpIHtcclxuICAgICAgICBuLnJvdXRlID0gbi5zdWJOb2RlcyAmJiBuLnN1Yk5vZGVzLmxlbmd0aCA+IDAgPyBuLnN1Yk5vZGVzWzBdLnJvdXRlIDogdW5kZWZpbmVkO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIGVuYWJsZSBhbGwgcGFnZXMgYnkgZGVmYXVsdFxyXG4gICAgICBpZiAobi5pc0Rpc2FibGVkID09IG51bGwpIHtcclxuICAgICAgICBuLmlzRGlzYWJsZWQgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5pbml0QmFzaWNTZXR0aW5ncygpO1xyXG4gICAgdGhpcy5pbml0QWR2YW5jZWRTZXR0aW5ncygpO1xyXG4gICAgdGhpcy5pbml0VGhlbWVTZXR0aW5ncygpO1xyXG5cclxuICAgIC8vIGluaXQgYmluZGluZyBmb3IgcHJvZ3Jlc3MgbmF2XHJcbiAgICBpZiAodGhpcy5zZXR0aW5ncy5tZW51U3R5bGUgPT09ICdwcm9ncmVzcycpIHtcclxuICAgICAgLy8gc2V0IHRoZSBmaXJzdCBub2RlIGFuZCBjaGlsZCBub2RlIGFzIHZpc2l0ZWRcclxuICAgICAgaWYgKHRoaXMubmF2aWdhdGlvbkRhdGEubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIHRoaXMubmF2aWdhdGlvbkRhdGFbMF0udmlzaXRlZCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5uYXZpZ2F0ZSh0aGlzLm5hdmlnYXRpb25EYXRhWzBdLnJvdXRlKTtcclxuICAgICAgICBpZiAodGhpcy5uYXZpZ2F0aW9uRGF0YVswXS5zdWJOb2RlcyAmJiB0aGlzLm5hdmlnYXRpb25EYXRhWzBdLnN1Yk5vZGVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIHRoaXMubmF2aWdhdGlvbkRhdGFbMF0uc3ViTm9kZXNbMF0udmlzaXRlZCA9IHRydWU7XHJcbiAgICAgICAgICB0aGlzLm5hdmlnYXRlKHRoaXMubmF2aWdhdGlvbkRhdGFbMF0uc3ViTm9kZXNbMF0ucm91dGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gc2V0IGluaXRpYWwgcHJvZ3Jlc3MgYmFyXHJcbiAgICAgIHRoaXMubmF2UHJvZ3Jlc3NDb3VudCA9ICh0aGlzLnNlbGVjdGVkUGFyZW50SW5kZXggKyAxKSAvIHRoaXMubmF2aWdhdGlvbkRhdGEubGVuZ3RoICogMTAwO1xyXG5cclxuXHJcbiAgICAgIHRoaXMubmF2QmluZFN1Yi5hZGQoXHJcbiAgICAgICAgdGhpcy5yb3V0ZXIuZXZlbnRzLnBpcGUoZmlsdGVyKGV2ZW50ID0+IGV2ZW50IGluc3RhbmNlb2YgTmF2aWdhdGlvbkVuZCkpXHJcbiAgICAgICAgICAuc3Vic2NyaWJlKChldmVudDogTmF2aWdhdGlvbkVuZCkgPT4ge1xyXG4gICAgICAgICAgICAvLyBmaW5kIHBhcmVudCBpbmRleCB3aXRoIGFjdGl2ZSBjaGlsZFxyXG4gICAgICAgICAgICB0aGlzLmdldEFjdGl2ZVBhcmVudEFuZENoaWxkKGV2ZW50LnVybCk7XHJcbiAgICAgICAgICB9KVxyXG4gICAgICApO1xyXG5cclxuICAgICAgdGhpcy5zZXR0aW5ncy5hbGxvd05hdlRvZ2dsZSA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgdGhpcy5sb2dJblN1YnNjcmlwdGlvbiA9IHRoaXMuYXV0aG9yaXphdGlvblNlcnZpY2UuaXNMb2dnZWRJbiQuc3Vic2NyaWJlKHZhbHVlID0+IHtcclxuICAgICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy51c2VyTmFtZSA9IHRoaXMuYXV0aG9yaXphdGlvblNlcnZpY2UudXNlck5hbWUoKVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAodGhpcy5jb25maWdTZXJ2aWNlKSB7XHJcbiAgICAgIHRoaXMuY29uZmlnU3Vic2NyaXB0aW9uID0gdGhpcy5jb25maWdTZXJ2aWNlLmNvbmZpZyQuc3Vic2NyaWJlKGNvbmZpZyA9PiB7XHJcbiAgICAgICAgaWYgKGNvbmZpZykge1xyXG4gICAgICAgICAgaWYgKGNvbmZpZz8ubmF2aWdhdGlvbj8uc2V0dGluZ3M/LnJlc2V0TmF2KSB7XHJcbiAgICAgICAgICAgIHRoaXMubmF2UHJvZ3Jlc3NDb3VudCA9IDA7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRQYXJlbnRJbmRleCA9IDA7XHJcbiAgICAgICAgICAgIHRoaXMubmF2aWdhdGUodGhpcy5uYXZpZ2F0aW9uRGF0YVswXS5yb3V0ZSk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnN0ZXBwZXIpIHtcclxuICAgICAgICAgICAgICB0aGlzLnN0ZXBwZXIuc2VsZWN0ZWRJbmRleCA9IDA7XHJcbiAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnN0ZXBwZXIucmVzZXQoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW5uZXJTdGVwcGVycz8uZm9yRWFjaChzdGVwcGVyID0+IHtcclxuICAgICAgICAgICAgICAgICAgc3RlcHBlci5zZWxlY3RlZEluZGV4ID0gMDtcclxuICAgICAgICAgICAgICAgICAgc3RlcHBlci5yZXNldCgpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5uYXZpZ2F0aW9uRGF0YS5mb3JFYWNoKG4gPT4ge1xyXG4gICAgICAgICAgICAgIG4udmlzaXRlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgIG4uY29tcGxldGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgICBuLnN1Yk5vZGVzPy5mb3JFYWNoKHMgPT4ge1xyXG4gICAgICAgICAgICAgICAgcy52aXNpdGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBzLmNvbXBsZXRlID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIC8vIHJlc2V0IGJhY2sgdG8gZmFsc2UgdG8gYXZvaWQgbXVsdGlwbGUgdHJpZ2dlcnMgb24gZnV0dXJlIGNhbGxzXHJcbiAgICAgICAgICAgIGNvbmZpZy5uYXZpZ2F0aW9uLnNldHRpbmdzLnJlc2V0TmF2ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuY29uZmlnU2VydmljZS5jb25maWcgPSBjb25maWc7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgLy8gaWYgdGhlIHZhbHVlcyB3ZXJlIGNoYW5nZWQgYW5kIG5vdCBudWxsLCBpdCBtZWFucyB0aGF0IHRoZSBuYXYgd2FzIHRvZ2dsZWQgdG8gcHJvZ3Jlc3NcclxuICAgICAgICAgIGlmIChjb25maWc/Lm5hdmlnYXRpb24/LnNldHRpbmdzPy50b2dnbGVQcm9ncmVzc05hdlBhcmVudEluZGV4ICE9IG51bGxcclxuICAgICAgICAgICAgJiYgdGhpcy50b2dnbGVQcm9ncmVzc05hdlBhcmVudEluZGV4ICE9IGNvbmZpZz8ubmF2aWdhdGlvbj8uc2V0dGluZ3M/LnRvZ2dsZVByb2dyZXNzTmF2UGFyZW50SW5kZXhcclxuICAgICAgICAgICAgJiYgdGhpcy50b2dnbGVQcm9ncmVzc05hdkNoaWxkSW5kZXggIT0gY29uZmlnPy5uYXZpZ2F0aW9uPy5zZXR0aW5ncz8udG9nZ2xlUHJvZ3Jlc3NOYXZDaGlsZEluZGV4XHJcbiAgICAgICAgICAgICYmIGNvbmZpZz8ubmF2aWdhdGlvbj8uc2V0dGluZ3M/LnRvZ2dsZVByb2dyZXNzTmF2Q2hpbGRJbmRleCAhPSBudWxsKSB7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnRvZ2dsZVByb2dyZXNzTmF2UGFyZW50SW5kZXggPSBjb25maWcubmF2aWdhdGlvbi5zZXR0aW5ncy50b2dnbGVQcm9ncmVzc05hdlBhcmVudEluZGV4O1xyXG4gICAgICAgICAgICB0aGlzLnRvZ2dsZVByb2dyZXNzTmF2Q2hpbGRJbmRleCA9IGNvbmZpZy5uYXZpZ2F0aW9uLnNldHRpbmdzLnRvZ2dsZVByb2dyZXNzTmF2Q2hpbGRJbmRleDtcclxuXHJcbiAgICAgICAgICAgIC8vIGFkZCB0aGUgcm91dGVyIHN1YlxyXG4gICAgICAgICAgICB0aGlzLm5hdkJpbmRTdWIuYWRkKFxyXG4gICAgICAgICAgICAgIHRoaXMucm91dGVyLmV2ZW50cy5waXBlKGZpbHRlcihldmVudCA9PiBldmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25FbmQpKVxyXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoZXZlbnQ6IE5hdmlnYXRpb25FbmQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgLy8gZmluZCBwYXJlbnQgaW5kZXggd2l0aCBhY3RpdmUgY2hpbGRcclxuICAgICAgICAgICAgICAgICAgdGhpcy5nZXRBY3RpdmVQYXJlbnRBbmRDaGlsZChldmVudC51cmwpO1xyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgLy8gaWYgdGhlIGNoaWxkIG5vZGUgaW5kZXggaXMgdmFsaWRcclxuICAgICAgICAgICAgaWYgKGNvbmZpZy5uYXZpZ2F0aW9uLm5vZGVzW3RoaXMudG9nZ2xlUHJvZ3Jlc3NOYXZQYXJlbnRJbmRleF0uc3ViTm9kZXM/Lmxlbmd0aCA+IHRoaXMudG9nZ2xlUHJvZ3Jlc3NOYXZDaGlsZEluZGV4KSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5zZXROb2RlU3RhdGVzKGNvbmZpZy5uYXZpZ2F0aW9uLm5vZGVzW3RoaXMudG9nZ2xlUHJvZ3Jlc3NOYXZQYXJlbnRJbmRleF0sXHJcbiAgICAgICAgICAgICAgICBjb25maWcubmF2aWdhdGlvbi5ub2Rlc1t0aGlzLnRvZ2dsZVByb2dyZXNzTmF2UGFyZW50SW5kZXhdLnN1Yk5vZGVzW3RoaXMudG9nZ2xlUHJvZ3Jlc3NOYXZDaGlsZEluZGV4XSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5zZXROb2RlU3RhdGVzKGNvbmZpZy5uYXZpZ2F0aW9uLm5vZGVzW3RoaXMudG9nZ2xlUHJvZ3Jlc3NOYXZQYXJlbnRJbmRleF0sIG51bGwpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBpbmRleGVzXHJcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlUHJvZ3Jlc3NOYXZQYXJlbnRJbmRleCA9IGNvbmZpZz8ubmF2aWdhdGlvbj8uc2V0dGluZ3M/LnRvZ2dsZVByb2dyZXNzTmF2UGFyZW50SW5kZXhcclxuICAgICAgICAgICAgdGhpcy50b2dnbGVQcm9ncmVzc05hdkNoaWxkSW5kZXggPSBjb25maWc/Lm5hdmlnYXRpb24/LnNldHRpbmdzPy50b2dnbGVQcm9ncmVzc05hdkNoaWxkSW5kZXg7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBMaWZlIGN5Y2xlIGhvb2sgZm9yIGFmdGVyIGNvbXBvbmVudCB2aWV3IGluaXRpYWxpemF0aW9uICovXHJcbiAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnNldHRpbmdzLm1lbnVTdHlsZSA9PT0gJ3N0ZXBwZXInKSB7XHJcbiAgICAgIHRoaXMuYmluZFN0ZXBwZXJUb1JvdXRlcygpO1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICB0aGlzLnN0ZXBwZXIuc3RlcHMuZm9yRWFjaCgoc3RlcCwgaW5kZXgpID0+IHtcclxuICAgICAgICAgIHN0ZXAuc2VsZWN0ID0gKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUGFyZW50SW5kZXggPSBpbmRleDtcclxuICAgICAgICAgICAgdGhpcy5uYXZpZ2F0ZSh0aGlzLm5hdmlnYXRpb25EYXRhW2luZGV4XS5yb3V0ZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5pbm5lclN0ZXBwZXJzLmZvckVhY2goKHN0ZXBwZXIsIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICBzdGVwcGVyLnN0ZXBzLmZvckVhY2goKHN0ZXAsIGppbmRleCkgPT4ge1xyXG4gICAgICAgICAgICBzdGVwLnNlbGVjdCA9ICgpID0+IHtcclxuICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkQ2hpbGRJbmRleGVzW2luZGV4XSA9IGppbmRleDtcclxuICAgICAgICAgICAgICB0aGlzLm5hdmlnYXRlKHRoaXMubmF2aWdhdGlvbkRhdGFbaW5kZXhdLnN1Yk5vZGVzW2ppbmRleF0ucm91dGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnNpZGVOYXZTdWIgPSB0aGlzLnNpZGVuYXYub3BlbmVkQ2hhbmdlLnN1YnNjcmliZShkcmF3ZXJTdGF0ZSA9PiB7XHJcbiAgICAgIHRoaXMuaXNOYXZPcGVuID0gZHJhd2VyU3RhdGU7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKiBPbiBEZXN0cm95ICovXHJcbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5tb2JpbGVRdWVyeS5yZW1vdmVFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCB0aGlzLl9tb2JpbGVRdWVyeUxpc3RlbmVyKTtcclxuICAgIHRoaXMubmF2QmluZFN1Yi51bnN1YnNjcmliZSgpO1xyXG4gICAgdGhpcy5sb2dJblN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgdGhpcy5iYW5uZXJTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgIHRoaXMuY29uZmlnU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgICB0aGlzLnNpZGVOYXZTdWIudW5zdWJzY3JpYmUoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE1vYmlsZSBTdWJOYXYgLSBvcGVuIHRoZSBTdWJOYXZcclxuICAgKiBAcGFyYW0gbmF2IHRoZSBuYXYgZGF0YSB0byBiZSBwYXNzZWQgdG8gdGhlIFN1Yk5hdlxyXG4gICAqL1xyXG4gIHB1YmxpYyBvcGVuTW9iaWxlU3ViTmF2KG5hdjogTmF2Tm9kZSk6IHZvaWQge1xyXG4gICAgdGhpcy5pc01vYmlsZVN1Yk5hdk9wZW4gPSB0cnVlO1xyXG4gICAgdGhpcy5jdXJyZW50TW9iaWxlTmF2ID0gbmF2O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTW9iaWxlIFN1Yk5hdiAtIGNsb3NlcyB0aGUgU3ViTmF2XHJcbiAgICovXHJcbiAgcHVibGljIGNsb3NlTW9iaWxlU3ViTmF2KCk6IHZvaWQge1xyXG4gICAgdGhpcy5pc01vYmlsZVN1Yk5hdk9wZW4gPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHMgdGhlIHRoZW1lIGNvbG9yXHJcbiAgICogQHBhcmFtIHZhcmlhYmxlIHRoZSBjc3MgdmFyaWFibGUgbmFtZVxyXG4gICAqIEBwYXJhbSBjb2xvciB0aGUgY29sb3JcclxuICAgKi9cclxuICBwdWJsaWMgc2V0VGhlbWVDb2xvcih2YXJpYWJsZTogc3RyaW5nLCBjb2xvcjogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoYC0tc29mLW5hdi0ke3ZhcmlhYmxlfWAsIGNvbG9yKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERldGVybWluZXMgdGhlIHN0ZXAgc3RhdGVcclxuICAgKiBAcGFyYW0gcGFyZW50SW5kZXggVGhlIHBhcmVudCBpbmRleFxyXG4gICAqIEBwYXJhbSBjaGlsZEluZGV4IFRoZSBjaGlsZCBpbmRleFxyXG4gICAqIEByZXR1cm5zIFRoZSBzdGVwIHN0YXRlXHJcbiAgICovXHJcbiAgcHVibGljIGRldGVybWluZVN0ZXBTdGF0ZShwYXJlbnRJbmRleDogbnVtYmVyLCBjaGlsZEluZGV4OiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgLy8gbm90IHBhc3NlZCAmJiBub3QgYWN0aXZlXHJcbiAgICBpZiAoY2hpbGRJbmRleCA9PT0gLTEpIHtcclxuICAgICAgaWYgKCF0aGlzLnN0ZXBwZXIpIHtcclxuICAgICAgICByZXR1cm4gJ251bWJlcic7XHJcbiAgICAgIH1cclxuICAgICAgLy8gbm90IHBhc3NlZCAmJiBhY3RpdmVcclxuICAgICAgaWYgKHBhcmVudEluZGV4ID09PSB0aGlzLnN0ZXBwZXIuc2VsZWN0ZWRJbmRleCkge1xyXG4gICAgICAgIHRoaXMubmF2aWdhdGlvbkRhdGFbcGFyZW50SW5kZXhdLnZpc2l0ZWQgPSB0cnVlO1xyXG5cclxuICAgICAgICByZXR1cm4gJ2FjdGl2ZSc7XHJcbiAgICAgIH1cclxuICAgICAgLy8gcGFzc2VkIGJ1dCBuYXYgYmFja1xyXG4gICAgICBlbHNlIGlmIChwYXJlbnRJbmRleCA+IHRoaXMuc3RlcHBlci5zZWxlY3RlZEluZGV4ICYmIHRoaXMubmF2aWdhdGlvbkRhdGFbcGFyZW50SW5kZXhdLnZpc2l0ZWQpIHtcclxuICAgICAgICB0aGlzLnN0ZXBwZXIuc3RlcHMuZmluZCgocywgaW5kZXgpID0+IGluZGV4ID09PSBwYXJlbnRJbmRleClcclxuICAgICAgICAgIC5yZXNldCgpO1xyXG5cclxuICAgICAgICByZXR1cm4gJ2FjdGl2ZSc7XHJcbiAgICAgIH1cclxuICAgICAgLy8gcGFzc2VkICYmIG5vdCBhY3RpdmVcclxuICAgICAgZWxzZSBpZiAocGFyZW50SW5kZXggPCB0aGlzLnN0ZXBwZXIuc2VsZWN0ZWRJbmRleCkge1xyXG4gICAgICAgIHRoaXMubmF2aWdhdGlvbkRhdGFbcGFyZW50SW5kZXhdLnZpc2l0ZWQgPSB0cnVlO1xyXG5cclxuICAgICAgICByZXR1cm4gJ2RvbmUnO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHJldHVybiAnbnVtYmVyJztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmICghdGhpcy5pbm5lclN0ZXBwZXJzKSB7XHJcbiAgICAgICAgcmV0dXJuICdub25lJztcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBpbm5lclN0ZXBwZXIgPSB0aGlzLmlubmVyU3RlcHBlcnMuZmluZCgocywgaW5kZXgpID0+IGluZGV4ID09PSBwYXJlbnRJbmRleCk7XHJcbiAgICAgIGlmIChjaGlsZEluZGV4ID09PSBpbm5lclN0ZXBwZXIuc2VsZWN0ZWRJbmRleCkge1xyXG4gICAgICAgIHRoaXMubmF2aWdhdGlvbkRhdGFbcGFyZW50SW5kZXhdLnN1Yk5vZGVzW2NoaWxkSW5kZXhdLnZpc2l0ZWQgPSB0cnVlO1xyXG5cclxuICAgICAgICByZXR1cm4gJ2FjdGl2ZSc7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAoY2hpbGRJbmRleCA+IGlubmVyU3RlcHBlci5zZWxlY3RlZEluZGV4ICYmIHRoaXMubmF2aWdhdGlvbkRhdGFbcGFyZW50SW5kZXhdLnN1Yk5vZGVzW2NoaWxkSW5kZXhdLnZpc2l0ZWQpIHtcclxuICAgICAgICBpbm5lclN0ZXBwZXIuc3RlcHMuZmluZCgocywgaW5kZXgpID0+IGluZGV4ID09PSBjaGlsZEluZGV4KVxyXG4gICAgICAgICAgLnJlc2V0KCk7XHJcblxyXG4gICAgICAgIHJldHVybiAnYWN0aXZlJztcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmIChjaGlsZEluZGV4IDwgaW5uZXJTdGVwcGVyLnNlbGVjdGVkSW5kZXgpIHtcclxuICAgICAgICB0aGlzLm5hdmlnYXRpb25EYXRhW3BhcmVudEluZGV4XS5zdWJOb2Rlc1tjaGlsZEluZGV4XS52aXNpdGVkID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgcmV0dXJuICdkb25lJztcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICByZXR1cm4gJ25vbmUnO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBOYXZpZ2F0ZXMgdG8gdGhlIHByb3ZpZGVkIHJvdXRlXHJcbiAgICogQHBhcmFtIHJvdXRlIFRoZSByb3V0ZVxyXG4gICAqL1xyXG4gIHB1YmxpYyBuYXZpZ2F0ZShyb3V0ZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWZsb2F0aW5nLXByb21pc2VzXHJcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZUJ5VXJsKHJvdXRlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE5hdmlnYXRlcyB0byBnaXZlbiBzdGVwXHJcbiAgICogQHBhcmFtIHN0ZXBOdW1iZXIgVGhlIHN0ZXAgbnVtYmVyIHRvIG5hdmlnYXRlIHRvXHJcbiAgICovXHJcbiAgcHVibGljIG5hdmlnYXRlVG9TdGVwKHN0ZXBOdW1iZXI6IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKHN0ZXBOdW1iZXIgPCB0aGlzLnNlbGVjdGVkUGFyZW50SW5kZXgpIHtcclxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1mbG9hdGluZy1wcm9taXNlc1xyXG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZUJ5VXJsKHRoaXMubmF2aWdhdGlvbkRhdGFbc3RlcE51bWJlcl0ucm91dGUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0cyB0aGUgYWN0aXZlIHBhcmVudCBhbmQgY2hpbGQgbm9kZXMgXHJcbiAgICogQHBhcmFtIHVybCBUaGUgcm91dGVyIHVybFxyXG4gICAqL1xyXG4gIHB1YmxpYyBnZXRBY3RpdmVQYXJlbnRBbmRDaGlsZCh1cmw6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgbGV0IGNoaWxkSW5kZXg7XHJcbiAgICBsZXQgcGFyZW50SW5kZXggPSB0aGlzLm5hdmlnYXRpb25EYXRhLmZpbmRJbmRleChuID0+IHtcclxuICAgICAgY2hpbGRJbmRleCA9IG4uc3ViTm9kZXM/LmZpbmRJbmRleChzID0+IHVybC5pbmNsdWRlcyhzLnJvdXRlLnJlcGxhY2UoJy4nLCAnJykpKTtcclxuICAgICAgcmV0dXJuIGNoaWxkSW5kZXggPiAtMSB8fCB0aGlzLnJvdXRlci51cmwuaW5jbHVkZXMobi5yb3V0ZS5yZXBsYWNlKCcuJywgJycpKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGlmIChwYXJlbnRJbmRleCA9PSAtMSkge1xyXG4gICAgICBwYXJlbnRJbmRleCA9IDBcclxuICAgIH1cclxuXHJcbiAgICAvLyBzZXQgdGhlIGFjdGl2ZSBwYXJlbnQgbm9kZSBhbmQgc3ViIG5vZGVcclxuICAgIHRoaXMuYWN0aXZlUGFyZW50Tm9kZSA9IHRoaXMubmF2aWdhdGlvbkRhdGFbcGFyZW50SW5kZXhdO1xyXG4gICAgdGhpcy5hY3RpdmVTdWJOb2RlID0gY2hpbGRJbmRleCA+IC0xICYmIHRoaXMuYWN0aXZlUGFyZW50Tm9kZS5zdWJOb2Rlcy5sZW5ndGggPiAwID8gdGhpcy5hY3RpdmVQYXJlbnROb2RlLnN1Yk5vZGVzW2NoaWxkSW5kZXhdIDogbnVsbDtcclxuXHJcbiAgICAvLyBjb21wdXRlIHRoZSBwcm9ncmVzcyBiYXJcclxuICAgIHRoaXMubmF2UHJvZ3Jlc3NDb3VudCA9IChwYXJlbnRJbmRleCArIDEpIC8gdGhpcy5uYXZpZ2F0aW9uRGF0YS5sZW5ndGggKiAxMDA7XHJcblxyXG4gICAgLy8gc2V0IHRoZSBub2RlIHN0YXRlc1xyXG4gICAgdGhpcy5zZXROb2RlU3RhdGVzKHRoaXMuYWN0aXZlUGFyZW50Tm9kZSwgdGhpcy5hY3RpdmVTdWJOb2RlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHMgdGhlIGNvbXBsZXRlIGFuZCB2aXNpdGVkIHN0YXRlcyBmb3IgYWxsIE5hdk5vZGVzIFxyXG4gICAqIEBwYXJhbSBwYXJlbnROb2RlIFRoZSBwYXJlbnQgbm9kZVxyXG4gICAqIEBwYXJhbSBjaGlsZE5vZGUgVGhlIGNoaWxkIG5vZGVcclxuICAgKi9cclxuICBwdWJsaWMgc2V0Tm9kZVN0YXRlcyhwYXJlbnROb2RlOiBOYXZOb2RlLCBjaGlsZE5vZGU6IFN1Yk5hdk5vZGVzKTogdm9pZCB7XHJcbiAgICBpZiAoY2hpbGROb2RlKSB7XHJcbiAgICAgIHRoaXMuYWN0aXZlU3ViTm9kZSA9IGNoaWxkTm9kZTtcclxuICAgICAgbGV0IGNoaWxkSW5kZXggPSBwYXJlbnROb2RlLnN1Yk5vZGVzLmluZGV4T2YoY2hpbGROb2RlKSA+IC0xID8gcGFyZW50Tm9kZS5zdWJOb2Rlcy5pbmRleE9mKGNoaWxkTm9kZSkgOiAwO1xyXG4gICAgICAvLyBhbGwgc3Vibm9kZXMgYmVmb3JlIHRoaXMgd2VyZSBjb21wbGV0ZWQgYW5kIHZpc2l0ZWRcclxuICAgICAgcGFyZW50Tm9kZS5zdWJOb2Rlcy5zbGljZSgwLCBjaGlsZEluZGV4KS5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICAgIGVsZW1lbnQuY29tcGxldGUgPSB0cnVlO1xyXG4gICAgICAgIGVsZW1lbnQudmlzaXRlZCA9IHRydWU7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgdGhpcy5hY3RpdmVQYXJlbnROb2RlID0gcGFyZW50Tm9kZTtcclxuICAgIC8vIHNldCBhbGwgcHJldmlvdXMgbm9kZXMgdG8gY29tcGxldGVcclxuICAgIGxldCBwYXJlbnRJbmRleCA9IHRoaXMubmF2aWdhdGlvbkRhdGEuaW5kZXhPZihwYXJlbnROb2RlKSA+IC0xID8gdGhpcy5uYXZpZ2F0aW9uRGF0YS5pbmRleE9mKHBhcmVudE5vZGUpIDogMDtcclxuICAgIHRoaXMubmF2aWdhdGlvbkRhdGEuc2xpY2UoMCwgcGFyZW50SW5kZXgpLmZvckVhY2goZCA9PiB7XHJcbiAgICAgIGQuY29tcGxldGUgPSB0cnVlO1xyXG5cclxuICAgICAgLy8gc2V0IGFsbCBzdWJub2RlcyBvZiBwcmV2aW91cyBub2RlcyB0byBjb21wbGV0ZSBvbmx5IGlmIHRoZSBub2RlIHdhcyBub3QgZGlzYWJsZWRcclxuICAgICAgaWYgKCFkLmlzRGlzYWJsZWQpIHtcclxuICAgICAgICBkLnN1Yk5vZGVzLmZvckVhY2gocyA9PiB7XHJcbiAgICAgICAgICBzLmNvbXBsZXRlID0gdHJ1ZTtcclxuICAgICAgICAgIHMudmlzaXRlZCA9IHRydWU7XHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG4gICAgfSlcclxuICAgIC8vIHNldCB0aGUgY3VycmVudCBub2RlcyBhcyB2aXNpdGVkXHJcbiAgICBwYXJlbnROb2RlLnZpc2l0ZWQgPSB0cnVlO1xyXG4gICAgaWYgKGNoaWxkTm9kZSkge1xyXG4gICAgICBjaGlsZE5vZGUudmlzaXRlZCA9IHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDbG9zZXMgdGhlIGV4cGFuc2lvbiBwYW5lbCBhbmQgbmF2aWdhdGVzIHRvIHRoZSBnaXZlbiBub2RlXHJcbiAgICogQHBhcmFtIGVsIFRoZSBtYXQgZXhwYW5zaW9uIHBhbmVsIFxyXG4gICAqIEBwYXJhbSBpbmRleCBUaGUgcGFyZW50IG5vZGUgaW5kZXggXHJcbiAgICovXHJcbiAgcHVibGljIGRpc2FibGVQYW5lbChlbCwgaW5kZXg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgZWwuY2xvc2UoKTtcclxuICAgIHRoaXMubmF2aWdhdGUodGhpcy5uYXZpZ2F0aW9uRGF0YVtpbmRleF0ucm91dGUpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgKiBIaWRlcyB0aGUgbWVzc2FnZVxyXG4gICovXHJcbiAgcHVibGljIGhpZGUoKTogdm9pZCB7XHJcbiAgICB0aGlzLnNob3dNZXNzYWdlID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBMb2dzIG91dCBvbmNlIHVzZXIgaXMgYXV0aG9yaXplZFxyXG4gICAqICovXHJcbiAgcHVibGljIGxvZ091dCgpOiB2b2lkIHtcclxuICAgIHRoaXMuYXV0aG9yaXphdGlvblNlcnZpY2UuYXV0aG9yaXplVXNlcigpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2xvc2VzIG1vYmlsZSBuYXZpZ2F0aW9uIGFmdGVyIHNlbGVjdGlvbi5cclxuICAgKi9cclxuICBwdWJsaWMgY2xvc2VOYXZpZ2F0aW9uRm9yTW9iaWxlKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMubW9iaWxlUXVlcnkubWF0Y2hlcykge1xyXG4gICAgICB0aGlzLnNpZGVuYXYuY2xvc2UoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIElzIHRoZSBuYXZpZ2F0aW9uIHNlbGVjdGVkXHJcbiAgICovXHJcbiAgcHVibGljIGlzTmF2U2VsZWN0ZWQobm9kZTogTmF2Tm9kZSB8IFN1Yk5hdk5vZGVzKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5yb3V0ZXIuaXNBY3RpdmUobm9kZS5yb3V0ZSwgdHJ1ZSk7XHJcbiAgfVxyXG5cclxuICAvKiogU2V0cyB0aGUgd2lkdGggZm9yIHRoZSBzaWRlIG5hdiAqL1xyXG4gIHB1YmxpYyBzZXROYXZXaWR0aCh3aWR0aDogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB3aWR0aC5pbmNsdWRlcygnJScpIHx8IHdpZHRoLmluY2x1ZGVzKCdweCcpID8gd2lkdGggOiB3aWR0aCArICdweCc7XHJcbiAgfVxyXG5cclxuICAvKiogQmluZHMgdGhlIHN0ZXBwZXIgdG8gdGhlIHJvdXRlciAqL1xyXG4gIHByaXZhdGUgYmluZFN0ZXBwZXJUb1JvdXRlcygpOiB2b2lkIHtcclxuICAgIC8vIGZpbmQgcGFyZW50c1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIC8vIGZpbmQgcGFyZW50IGluZGV4IHdpdGggYWN0aXZlIGNoaWxkXHJcbiAgICAgIGxldCBjaGlsZEluZGV4O1xyXG4gICAgICBsZXQgcGFyZW50SW5kZXggPSB0aGlzLm5hdmlnYXRpb25EYXRhLmZpbmRJbmRleChuID0+IHtcclxuICAgICAgICBjaGlsZEluZGV4ID0gbi5zdWJOb2Rlcz8uZmluZEluZGV4KHMgPT4gdGhpcy5yb3V0ZXIudXJsLmluY2x1ZGVzKHMucm91dGUucmVwbGFjZSgnLicsICcnKSkpO1xyXG5cclxuICAgICAgICByZXR1cm4gY2hpbGRJbmRleCA+IC0xIHx8IHRoaXMucm91dGVyLnVybC5pbmNsdWRlcyhuLnJvdXRlLnJlcGxhY2UoJy4nLCAnJykpO1xyXG4gICAgICB9KTtcclxuICAgICAgLy8gaWYgbm8gY2hpbGRyZW4gb3Igbm8gaW5kZXhlcyBhY3RpdmF0ZSBmaXJzdCBwYXJlbnRcclxuICAgICAgaWYgKHBhcmVudEluZGV4ID09PSAtMSkge1xyXG4gICAgICAgIHBhcmVudEluZGV4ID0gMDtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5zZWxlY3RlZFBhcmVudEluZGV4ID0gcGFyZW50SW5kZXg7XHJcbiAgICAgIGlmIChjaGlsZEluZGV4ID4gLTEpIHtcclxuICAgICAgICB0aGlzLmlubmVyU3RlcHBlcnMuZmluZCgoaXMsIGluZGV4KSA9PiBpbmRleCA9PT0gcGFyZW50SW5kZXgpLnNlbGVjdGVkSW5kZXggPSBjaGlsZEluZGV4O1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBmaW5kIHBhcmVudHNcclxuICAgIHRoaXMubmF2QmluZFN1Yi5hZGQoXHJcbiAgICAgIHRoaXMucm91dGVyLmV2ZW50cy5waXBlKGZpbHRlcihldmVudCA9PiBldmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25FbmQpKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoKGV2ZW50OiBOYXZpZ2F0aW9uRW5kKSA9PiB7XHJcbiAgICAgICAgICAvLyBmaW5kIHBhcmVudCBpbmRleCB3aXRoIGFjdGl2ZSBjaGlsZFxyXG4gICAgICAgICAgbGV0IGNoaWxkSW5kZXg7XHJcbiAgICAgICAgICBsZXQgcGFyZW50SW5kZXggPSB0aGlzLm5hdmlnYXRpb25EYXRhLmZpbmRJbmRleChuID0+IHtcclxuICAgICAgICAgICAgY2hpbGRJbmRleCA9IG4uc3ViTm9kZXM/LmZpbmRJbmRleChzID0+IGV2ZW50LnVybEFmdGVyUmVkaXJlY3RzLmluY2x1ZGVzKHMucm91dGUucmVwbGFjZSgnLicsICcnKSkpO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIGNoaWxkSW5kZXggPiAtMSB8fCBldmVudC51cmxBZnRlclJlZGlyZWN0cy5pbmNsdWRlcyhuLnJvdXRlLnJlcGxhY2UoJy4nLCAnJykpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICAvLyBpZiBubyBjaGlsZHJlbiBvciBubyBpbmRleGVzIGFjdGl2YXRlIGZpcnN0IHBhcmVudFxyXG4gICAgICAgICAgaWYgKHBhcmVudEluZGV4ID09PSAtMSkge1xyXG4gICAgICAgICAgICBwYXJlbnRJbmRleCA9IDA7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZFBhcmVudEluZGV4ID0gcGFyZW50SW5kZXg7XHJcbiAgICAgICAgICBpZiAoY2hpbGRJbmRleCA+IC0xKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaW5uZXJTdGVwcGVycy5maW5kKChpcywgaW5kZXgpID0+IGluZGV4ID09PSBwYXJlbnRJbmRleCkuc2VsZWN0ZWRJbmRleCA9IGNoaWxkSW5kZXg7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKiogSW5pdGlhbGl6ZXMgdGhlIGFkdmFuY2VkIG5hdiBzZXR0aW5ncyAqL1xyXG4gIHByaXZhdGUgaW5pdEFkdmFuY2VkU2V0dGluZ3MoKTogdm9pZCB7XHJcbiAgICB0aGlzLmFkdmFuY2VkU2V0dGluZ3MudG9wR2FwRGVza3RvcCA9IHRoaXMuYWR2YW5jZWRTZXR0aW5ncy50b3BHYXBEZXNrdG9wIHx8IDA7XHJcbiAgICB0aGlzLmFkdmFuY2VkU2V0dGluZ3MudG9wR2FwTW9iaWxlID0gdGhpcy5hZHZhbmNlZFNldHRpbmdzLnRvcEdhcE1vYmlsZSB8fCB0aGlzLnNldHRpbmdzLmhlYWRlckhlaWdodDtcclxuICAgIHRoaXMuYWR2YW5jZWRTZXR0aW5ncy5tYXJnaW5Ub3BEZXNrdG9wID0gdGhpcy5hZHZhbmNlZFNldHRpbmdzLm1hcmdpblRvcERlc2t0b3AgfHwgMDtcclxuICAgIHRoaXMuYWR2YW5jZWRTZXR0aW5ncy5tYXJnaW5Ub3BNb2JpbGUgPSB0aGlzLmFkdmFuY2VkU2V0dGluZ3MubWFyZ2luVG9wTW9iaWxlIHx8IDA7XHJcblxyXG4gIH1cclxuXHJcbiAgLyoqIEluaXRpYWxpemVzIHRoZSBuYXYgdGhlbWUgc2V0dGluZ3MgKi9cclxuICBwcml2YXRlIGluaXRUaGVtZVNldHRpbmdzKCk6IHZvaWQge1xyXG4gICAgdGhpcy50aGVtZVNldHRpbmdzLmNvbnRlbnRCZ0NvbG9yID8gdGhpcy5zZXRUaGVtZUNvbG9yKCdjb250ZW50LWJnLWNvbG9yJywgdGhpcy50aGVtZVNldHRpbmdzLmNvbnRlbnRCZ0NvbG9yKSA6IHVuZGVmaW5lZDtcclxuICAgIHRoaXMudGhlbWVTZXR0aW5ncy5mb250Q29sb3IgPyB0aGlzLnNldFRoZW1lQ29sb3IoJ2ZvbnQtY29sb3InLCB0aGlzLnRoZW1lU2V0dGluZ3MuZm9udENvbG9yKSA6IHVuZGVmaW5lZDtcclxuICAgIHRoaXMudGhlbWVTZXR0aW5ncy5mb250Q29sb3IgPSB0aGlzLnRoZW1lU2V0dGluZ3MuZm9udENvbG9yIHx8ICcjMDAwJztcclxuICAgIHRoaXMudGhlbWVTZXR0aW5ncy5tb2JpbGVCZ0NvbG9yID0gdGhpcy50aGVtZVNldHRpbmdzLm1vYmlsZUJnQ29sb3IgfHwgJyNmZmZmZmYnO1xyXG4gICAgdGhpcy50aGVtZVNldHRpbmdzLmJnR3JhZGllbnRDb2xvcjEgPyB0aGlzLnNldFRoZW1lQ29sb3IoJ2JnLWdyYWRpZW50LWNvbG9yLTEnLCB0aGlzLnRoZW1lU2V0dGluZ3MuYmdHcmFkaWVudENvbG9yMSkgOiB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLnRoZW1lU2V0dGluZ3MuYmdHcmFkaWVudENvbG9yMiA/IHRoaXMuc2V0VGhlbWVDb2xvcignYmctZ3JhZGllbnQtY29sb3ItMicsIHRoaXMudGhlbWVTZXR0aW5ncy5iZ0dyYWRpZW50Q29sb3IyKSA6IHVuZGVmaW5lZDtcclxuICAgIHRoaXMudGhlbWVTZXR0aW5ncy5ib3JkZXJSaWdodENvbG9yID8gdGhpcy5zZXRUaGVtZUNvbG9yKCdib3JkZXItcmlnaHQtY29sb3InLCB0aGlzLnRoZW1lU2V0dGluZ3MuYm9yZGVyUmlnaHRDb2xvcikgOiB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLnRoZW1lU2V0dGluZ3MubGlzdEJvcmRlckNvbG9yID8gdGhpcy5zZXRUaGVtZUNvbG9yKCdsaXN0LWJvcmRlci1jb2xvcicsIHRoaXMudGhlbWVTZXR0aW5ncy5saXN0Qm9yZGVyQ29sb3IpIDogdW5kZWZpbmVkO1xyXG4gICAgdGhpcy50aGVtZVNldHRpbmdzLmhpZ2hsaWdodEdyYWRpZW50MSA/IHRoaXMuc2V0VGhlbWVDb2xvcignaGlnaGxpZ2h0LWdyYWRpZW50LTEnLCB0aGlzLnRoZW1lU2V0dGluZ3MuaGlnaGxpZ2h0R3JhZGllbnQxKSA6IHVuZGVmaW5lZDtcclxuICAgIHRoaXMudGhlbWVTZXR0aW5ncy5oaWdobGlnaHRHcmFkaWVudDIgPyB0aGlzLnNldFRoZW1lQ29sb3IoJ2hpZ2hsaWdodC1ncmFkaWVudC0yJywgdGhpcy50aGVtZVNldHRpbmdzLmhpZ2hsaWdodEdyYWRpZW50MikgOiB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLnRoZW1lU2V0dGluZ3Muc3ViSGlnaGxpZ2h0Qm9yZGVyQ29sb3IgP1xyXG4gICAgICB0aGlzLnNldFRoZW1lQ29sb3IoJ3N1Yi1oaWdobGlnaHQtYm9yZGVyLWNvbG9yJywgdGhpcy50aGVtZVNldHRpbmdzLnN1YkhpZ2hsaWdodEJvcmRlckNvbG9yKSA6IHVuZGVmaW5lZDtcclxuICAgIHRoaXMudGhlbWVTZXR0aW5ncy5zdWJIaWdobGlnaHRCZ0NvbG9yID9cclxuICAgICAgdGhpcy5zZXRUaGVtZUNvbG9yKCdzdWItaGlnaGxpZ2h0LWJnLWNvbG9yJywgdGhpcy50aGVtZVNldHRpbmdzLnN1YkhpZ2hsaWdodEJnQ29sb3IpIDogdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgLyoqIEluaXRpYWxpemVzIHRoZSBiYXNpYyBuYXYgc2V0dGluZ3MgKi9cclxuICBwcml2YXRlIGluaXRCYXNpY1NldHRpbmdzKCk6IHZvaWQge1xyXG4gICAgdGhpcy5zZXR0aW5ncy5mb250QXdlc29tZU1lbnVJY29uID0gdGhpcy5zZXR0aW5ncy5mb250QXdlc29tZU1lbnVJY29uIHx8ICdmYXMgZmEtYW5nbGUtZG91YmxlLWxlZnQnO1xyXG4gICAgdGhpcy5zZXR0aW5ncy5mb250QXdlc29tZU1lbnVJY29uQ2xvc2VkID0gdGhpcy5zZXR0aW5ncy5mb250QXdlc29tZU1lbnVJY29uQ2xvc2VkIHx8ICdmYXMgZmEtYW5nbGUtZG91YmxlLXJpZ2h0JztcclxuICAgIHRoaXMuc2V0dGluZ3MuYWxsb3dOYXZUb2dnbGUgPSB0aGlzLnNldHRpbmdzLmFsbG93TmF2VG9nZ2xlID09IG51bGwgPyB0cnVlIDogdGhpcy5zZXR0aW5ncy5hbGxvd05hdlRvZ2dsZTtcclxuICAgIHRoaXMuc2V0dGluZ3MubWFpbk1lbnVUZXh0ID8gdGhpcy5tYWluTWVudVRleHQgPSB0aGlzLnNldHRpbmdzLm1haW5NZW51VGV4dCA6IHRoaXMubWFpbk1lbnVUZXh0ID0gJ01haW4gTWVudSc7XHJcbiAgICB0aGlzLnNldHRpbmdzLmhlYWRlckhlaWdodCA9IHRoaXMuc2V0dGluZ3MuaGVhZGVySGVpZ2h0IHx8IDYwO1xyXG4gICAgdGhpcy5zZXR0aW5ncy5tZW51QnV0dG9uU1JUZXh0ID0gdGhpcy5zZXR0aW5ncy5tZW51QnV0dG9uU1JUZXh0IHx8ICdNZW51IEJ1dHRvbic7XHJcbiAgICB0aGlzLnNldHRpbmdzLm1lbnVTdHlsZSA9IHRoaXMuc2V0dGluZ3MubWVudVN0eWxlIHx8ICdzdGF0aWMnO1xyXG4gICAgdGhpcy5zZXR0aW5ncy5kaXNwbGF5TnVtYmVycyA9IHRoaXMuc2V0dGluZ3MuZGlzcGxheU51bWJlcnMgPT0gbnVsbCA/IHRydWUgOiB0aGlzLnNldHRpbmdzLmRpc3BsYXlOdW1iZXJzO1xyXG4gICAgdGhpcy5zZXR0aW5ncy5wcm9ncmVzc1NlY3Rpb25Db21wbGV0ZUljb24gPSB0aGlzLnNldHRpbmdzLnByb2dyZXNzU2VjdGlvbkNvbXBsZXRlSWNvbiB8fCAnZmFzIGZhLWNoZWNrLWNpcmNsZSc7XHJcbiAgICB0aGlzLnNldHRpbmdzLnByb2dyZXNzU2VjdGlvbkZ1dHVyZUljb24gPSB0aGlzLnNldHRpbmdzLnByb2dyZXNzU2VjdGlvbkZ1dHVyZUljb24gfHwgJ2ZhciBmYS1jaXJjbGUnO1xyXG4gICAgdGhpcy5zZXR0aW5ncy5wcm9ncmVzc1NlY3Rpb25DdXJyZW50SWNvbiA9IHRoaXMuc2V0dGluZ3MucHJvZ3Jlc3NTZWN0aW9uQ3VycmVudEljb24gfHwgJ2ZhcyBmYS1jaXJjbGUnO1xyXG4gICAgdGhpcy5zZXR0aW5ncy5wcm9ncmVzc01lbnVDb21wbGV0ZUljb24gPSB0aGlzLnNldHRpbmdzLnByb2dyZXNzTWVudUNvbXBsZXRlSWNvbiB8fCAnZmFyIGZhLWNoZWNrJztcclxuICAgIHRoaXMuc2V0dGluZ3Muc2hvd1Byb2dyZXNzQmFyID0gdGhpcy5zZXR0aW5ncy5zaG93UHJvZ3Jlc3NCYXIgPT0gbnVsbCA/IHRydWUgOiB0aGlzLnNldHRpbmdzLnNob3dQcm9ncmVzc0JhclxyXG4gICAgdGhpcy5zZXR0aW5ncy5zaWRlTmF2V2lkdGhEZXNrdG9wID0gdGhpcy5zZXR0aW5ncy5zaWRlTmF2V2lkdGhEZXNrdG9wIHx8ICczNTAnO1xyXG4gICAgdGhpcy5zZXR0aW5ncy5zaWRlTmF2V2lkdGhNb2JpbGUgPSB0aGlzLnNldHRpbmdzLnNpZGVOYXZXaWR0aE1vYmlsZSB8fCAnMzUwJztcclxuICAgIHRoaXMuc2V0dGluZ3Mub3ZlcnJpZGVOYXZpZ2F0aW9uID0gdGhpcy5zZXR0aW5ncy5vdmVycmlkZU5hdmlnYXRpb24gfHwgZmFsc2U7XHJcbiAgICB0aGlzLnNldHRpbmdzLnByb2dyZXNzTWVudVdpZHRoID0gdGhpcy5zZXR0aW5ncy5wcm9ncmVzc01lbnVXaWR0aCB8fCAnMjgwJztcclxuICAgIHRoaXMuc2V0dGluZ3MudXNlQ3VzdG9tTW9iaWxlRm9vdGVyID0gdGhpcy5zZXR0aW5ncy51c2VDdXN0b21Nb2JpbGVGb290ZXIgIT0gbnVsbCA/IHRoaXMuc2V0dGluZ3MudXNlQ3VzdG9tTW9iaWxlRm9vdGVyIDogZmFsc2U7XHJcbiAgfVxyXG59XHJcbiJdfQ==