@c8y/ngx-components 1019.2.4 → 1019.2.9

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 (170) hide show
  1. package/NOTICES +26 -0
  2. package/core/common/forOf.directive.d.ts +10 -1
  3. package/core/common/forOf.directive.d.ts.map +1 -1
  4. package/core/common/geo.service.d.ts +9 -0
  5. package/core/common/geo.service.d.ts.map +1 -0
  6. package/core/common/index.d.ts +1 -0
  7. package/core/common/index.d.ts.map +1 -1
  8. package/core/common/load-more.component.d.ts +1 -0
  9. package/core/common/load-more.component.d.ts.map +1 -1
  10. package/core/core.module.d.ts +50 -49
  11. package/core/core.module.d.ts.map +1 -1
  12. package/core/index.d.ts +1 -0
  13. package/core/index.d.ts.map +1 -1
  14. package/core/realtime/realtime-button.component.d.ts +5 -2
  15. package/core/realtime/realtime-button.component.d.ts.map +1 -1
  16. package/core/router/context-route.service.d.ts +6 -5
  17. package/core/router/context-route.service.d.ts.map +1 -1
  18. package/core/time-interval/index.d.ts +3 -0
  19. package/core/time-interval/index.d.ts.map +1 -0
  20. package/core/time-interval/time-interval.component.d.ts +26 -0
  21. package/core/time-interval/time-interval.component.d.ts.map +1 -0
  22. package/core/time-interval/time-interval.model.d.ts +33 -0
  23. package/core/time-interval/time-interval.model.d.ts.map +1 -0
  24. package/esm2022/context-dashboard/report-dashboard/report-dashboard-list.component.mjs +1 -1
  25. package/esm2022/core/audit-log/audit-log.component.mjs +1 -1
  26. package/esm2022/core/bootstrap/bootstrap.component.mjs +3 -3
  27. package/esm2022/core/common/forOf.directive.mjs +18 -2
  28. package/esm2022/core/common/geo.service.mjs +30 -0
  29. package/esm2022/core/common/index.mjs +2 -1
  30. package/esm2022/core/common/load-more.component.mjs +5 -2
  31. package/esm2022/core/core.module.mjs +11 -7
  32. package/esm2022/core/dynamic-forms/typeahead/typeahead.type.component.mjs +1 -1
  33. package/esm2022/core/index.mjs +2 -1
  34. package/esm2022/core/realtime/realtime-button.component.mjs +10 -4
  35. package/esm2022/core/router/context-route.service.mjs +10 -4
  36. package/esm2022/core/search/search-input.component.mjs +1 -1
  37. package/esm2022/core/time-interval/index.mjs +3 -0
  38. package/esm2022/core/time-interval/time-interval.component.mjs +85 -0
  39. package/esm2022/core/time-interval/time-interval.model.mjs +54 -0
  40. package/esm2022/datapoint-library/list/datapoint-library-list.component.mjs +2 -2
  41. package/esm2022/datapoint-selector/datapoint-selector-list-item/datapoint-selector-list-item.component.mjs +1 -1
  42. package/esm2022/device-profile/device-profile-list.component.mjs +1 -1
  43. package/esm2022/device-profile/device-tab-profile/device-tab-profile.component.mjs +1 -1
  44. package/esm2022/device-shell/shell/shell.component.mjs +1 -1
  45. package/esm2022/diagnostics/diagnostics.component.mjs +1 -1
  46. package/esm2022/ecosystem/applications/install-from-package/install-from-package.component.mjs +1 -1
  47. package/esm2022/ecosystem/shared/package-version-select/package-version-select.component.mjs +1 -1
  48. package/esm2022/location/location.component.mjs +1 -1
  49. package/esm2022/map/cluster-map.component.mjs +7 -7
  50. package/esm2022/map/map.component.mjs +92 -36
  51. package/esm2022/map/map.model.mjs +3 -2
  52. package/esm2022/operations/bulk-operations-list/bulk-operations-list.component.mjs +1 -1
  53. package/esm2022/operations/bulk-single-operations-list/single-operations-list.component.mjs +1 -1
  54. package/esm2022/operations/operations-list/operations-list.component.mjs +1 -1
  55. package/esm2022/operations/operations-timeline/operations-timeline.component.mjs +1 -1
  56. package/esm2022/operations/stepper-bulk-type-configuration/stepper-bulk-type-configuration.component.mjs +1 -1
  57. package/esm2022/operations/stepper-bulk-type-device-profile/select-device-profile-step.component.mjs +1 -1
  58. package/esm2022/operations/stepper-bulk-type-firmware/select-firmware.component.mjs +1 -1
  59. package/esm2022/operations/stepper-bulk-type-firmware/version-or-patch.component.mjs +1 -1
  60. package/esm2022/operations/stepper-bulk-type-software/select-software-step.component.mjs +1 -1
  61. package/esm2022/protocol-lpwan/lpwan-set-connections.component.mjs +1 -1
  62. package/esm2022/protocol-lpwan/lpwan-set-device-protocol.component.mjs +1 -1
  63. package/esm2022/repository/configuration/list/configuration-detail.component.mjs +1 -1
  64. package/esm2022/repository/configuration/list/configuration-list.component.mjs +1 -1
  65. package/esm2022/repository/firmware/list/add-firmware-modal.component.mjs +1 -1
  66. package/esm2022/repository/firmware/list/add-firmware-patch-modal.component.mjs +1 -1
  67. package/esm2022/repository/firmware/list/firmware-details.component.mjs +1 -1
  68. package/esm2022/repository/firmware/list/firmware-list.component.mjs +1 -1
  69. package/esm2022/repository/shared/software-type/software-type.component.mjs +1 -1
  70. package/esm2022/repository/software/device-tab/device-software-list.component.mjs +1 -1
  71. package/esm2022/repository/software/list/add-software-modal.component.mjs +1 -1
  72. package/esm2022/repository/software/list/columns/software-type.filtering-form-renderer.component.mjs +1 -1
  73. package/esm2022/repository/software/list/software-details.component.mjs +1 -1
  74. package/esm2022/sub-assets/location/asset-location.component.mjs +1 -1
  75. package/esm2022/tracking/c8y-ngx-components-tracking.mjs +5 -0
  76. package/esm2022/tracking/index.mjs +6 -0
  77. package/esm2022/tracking/tracking-marker-popup.component.mjs +34 -0
  78. package/esm2022/tracking/tracking-tab.guard.mjs +25 -0
  79. package/esm2022/tracking/tracking.component.mjs +92 -0
  80. package/esm2022/tracking/tracking.feature.mjs +16 -0
  81. package/esm2022/tracking/tracking.service.mjs +124 -0
  82. package/esm2022/trusted-certificates/crl/crl-settings.component.mjs +5 -5
  83. package/esm2022/trusted-certificates/list/trusted-certificate-list.component.mjs +1 -1
  84. package/esm2022/widgets/implementations/map/map-widget-config.component.mjs +2 -2
  85. package/fesm2022/c8y-ngx-components-context-dashboard.mjs +1 -1
  86. package/fesm2022/c8y-ngx-components-context-dashboard.mjs.map +1 -1
  87. package/fesm2022/c8y-ngx-components-datapoint-library-list.mjs +1 -1
  88. package/fesm2022/c8y-ngx-components-datapoint-library-list.mjs.map +1 -1
  89. package/fesm2022/c8y-ngx-components-datapoint-selector.mjs +1 -1
  90. package/fesm2022/c8y-ngx-components-datapoint-selector.mjs.map +1 -1
  91. package/fesm2022/c8y-ngx-components-device-profile.mjs +2 -2
  92. package/fesm2022/c8y-ngx-components-device-profile.mjs.map +1 -1
  93. package/fesm2022/c8y-ngx-components-device-shell.mjs +1 -1
  94. package/fesm2022/c8y-ngx-components-device-shell.mjs.map +1 -1
  95. package/fesm2022/c8y-ngx-components-diagnostics.mjs +1 -1
  96. package/fesm2022/c8y-ngx-components-diagnostics.mjs.map +1 -1
  97. package/fesm2022/c8y-ngx-components-ecosystem-shared.mjs +1 -1
  98. package/fesm2022/c8y-ngx-components-ecosystem-shared.mjs.map +1 -1
  99. package/fesm2022/c8y-ngx-components-ecosystem.mjs +1 -1
  100. package/fesm2022/c8y-ngx-components-ecosystem.mjs.map +1 -1
  101. package/fesm2022/c8y-ngx-components-location.mjs +1 -1
  102. package/fesm2022/c8y-ngx-components-location.mjs.map +1 -1
  103. package/fesm2022/c8y-ngx-components-map.mjs +95 -38
  104. package/fesm2022/c8y-ngx-components-map.mjs.map +1 -1
  105. package/fesm2022/c8y-ngx-components-operations-bulk-operations-list.mjs +1 -1
  106. package/fesm2022/c8y-ngx-components-operations-bulk-operations-list.mjs.map +1 -1
  107. package/fesm2022/c8y-ngx-components-operations-bulk-single-operations-list.mjs +1 -1
  108. package/fesm2022/c8y-ngx-components-operations-bulk-single-operations-list.mjs.map +1 -1
  109. package/fesm2022/c8y-ngx-components-operations-operations-list.mjs +1 -1
  110. package/fesm2022/c8y-ngx-components-operations-operations-list.mjs.map +1 -1
  111. package/fesm2022/c8y-ngx-components-operations-operations-timeline.mjs +1 -1
  112. package/fesm2022/c8y-ngx-components-operations-operations-timeline.mjs.map +1 -1
  113. package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-configuration.mjs +1 -1
  114. package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-configuration.mjs.map +1 -1
  115. package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-device-profile.mjs +1 -1
  116. package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-device-profile.mjs.map +1 -1
  117. package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-firmware.mjs +2 -2
  118. package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-firmware.mjs.map +1 -1
  119. package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-software.mjs +1 -1
  120. package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-software.mjs.map +1 -1
  121. package/fesm2022/c8y-ngx-components-protocol-lpwan.mjs +2 -2
  122. package/fesm2022/c8y-ngx-components-protocol-lpwan.mjs.map +1 -1
  123. package/fesm2022/c8y-ngx-components-repository-configuration.mjs +2 -2
  124. package/fesm2022/c8y-ngx-components-repository-configuration.mjs.map +1 -1
  125. package/fesm2022/c8y-ngx-components-repository-firmware.mjs +4 -4
  126. package/fesm2022/c8y-ngx-components-repository-firmware.mjs.map +1 -1
  127. package/fesm2022/c8y-ngx-components-repository-shared.mjs +1 -1
  128. package/fesm2022/c8y-ngx-components-repository-shared.mjs.map +1 -1
  129. package/fesm2022/c8y-ngx-components-repository-software.mjs +4 -4
  130. package/fesm2022/c8y-ngx-components-repository-software.mjs.map +1 -1
  131. package/fesm2022/c8y-ngx-components-sub-assets.mjs +1 -1
  132. package/fesm2022/c8y-ngx-components-sub-assets.mjs.map +1 -1
  133. package/fesm2022/c8y-ngx-components-tracking.mjs +271 -0
  134. package/fesm2022/c8y-ngx-components-tracking.mjs.map +1 -0
  135. package/fesm2022/c8y-ngx-components-trusted-certificates.mjs +5 -5
  136. package/fesm2022/c8y-ngx-components-trusted-certificates.mjs.map +1 -1
  137. package/fesm2022/c8y-ngx-components-widgets-implementations-map.mjs +1 -1
  138. package/fesm2022/c8y-ngx-components-widgets-implementations-map.mjs.map +1 -1
  139. package/fesm2022/c8y-ngx-components.mjs +204 -16
  140. package/fesm2022/c8y-ngx-components.mjs.map +1 -1
  141. package/locales/de.po +158 -83
  142. package/locales/en.po +6 -0
  143. package/locales/es.po +361 -205
  144. package/locales/fr.po +342 -186
  145. package/locales/locales.pot +40 -7
  146. package/locales/nl.po +326 -170
  147. package/locales/pl.po +60 -59
  148. package/locales/pt_BR.po +342 -186
  149. package/map/cluster-map.component.d.ts +3 -3
  150. package/map/cluster-map.component.d.ts.map +1 -1
  151. package/map/map.component.d.ts +17 -7
  152. package/map/map.component.d.ts.map +1 -1
  153. package/map/map.model.d.ts +14 -6
  154. package/map/map.model.d.ts.map +1 -1
  155. package/package.json +1 -1
  156. package/tracking/c8y-ngx-components-tracking.d.ts.map +1 -0
  157. package/tracking/index.d.ts +6 -0
  158. package/tracking/index.d.ts.map +1 -0
  159. package/tracking/tracking-marker-popup.component.d.ts +17 -0
  160. package/tracking/tracking-marker-popup.component.d.ts.map +1 -0
  161. package/tracking/tracking-tab.guard.d.ts +12 -0
  162. package/tracking/tracking-tab.guard.d.ts.map +1 -0
  163. package/tracking/tracking.component.d.ts +33 -0
  164. package/tracking/tracking.component.d.ts.map +1 -0
  165. package/tracking/tracking.feature.d.ts +3 -0
  166. package/tracking/tracking.feature.d.ts.map +1 -0
  167. package/tracking/tracking.service.d.ts +38 -0
  168. package/tracking/tracking.service.d.ts.map +1 -0
  169. package/trusted-certificates/crl/crl-settings.component.d.ts +1 -1
  170. package/trusted-certificates/crl/crl-settings.component.d.ts.map +1 -1
@@ -136,7 +136,7 @@ export class InstallFromPackageComponent {
136
136
  this.packages = applications.filter(app => this.ecosystemService.isPackageBlueprint(app));
137
137
  }
138
138
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: InstallFromPackageComponent, deps: [{ token: i1.EcosystemService }, { token: i2.ApplicationService }, { token: i3.WizardComponent }, { token: i3.PluginsService }], target: i0.ɵɵFactoryTarget.Component }); }
139
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: InstallFromPackageComponent, selector: "c8y-install-from-package", viewQueries: [{ propertyName: "applicationPropertiesForm", first: true, predicate: ApplicationPropertiesFormComponent, descendants: true }], ngImport: i0, template: "<c8y-wizard-header>\n <i [c8yIcon]=\"'big-parcel'\"></i>\n <h4 id=\"modal-title\" translate>Install from extension package</h4>\n</c8y-wizard-header>\n<c8y-wizard-body>\n <ng-container *ngIf=\"!selectedPackage\">\n <div class=\"modal-inner-scroll\" id=\"modal-body\">\n <p class=\"p-16 text-medium text-center separator-bottom sticky-top bg-level-0\">\n {{ 'Select from available extension packages' | translate }}\n </p>\n\n <c8y-ui-empty-state\n *ngIf=\"!packages?.length\"\n [icon]=\"'big-parcel'\"\n [title]=\"'No extension packages to display.' | translate\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n\n <div *ngIf=\"packages?.length\" class=\"c8y-wizard-list-nav\" style=\"min-height: 257px\">\n <button\n class=\"list-group-item text-truncate\"\n *ngFor=\"let package of packages\"\n (click)=\"selectPackage(package)\"\n title=\"{{ package.name }}\"\n type=\"button\"\n >\n <i c8yIcon=\"big-parcel\" class=\"list-group-icon\"></i>\n <span [innerText]=\"package.name\"></span>\n </button>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"!isDeployed && selectedPackage\">\n <p class=\"p-16 text-center text-medium separator-bottom sticky-top bg-level-0\">\n {{ 'Provide application details' | translate }}\n </p>\n <div class=\"d-flex d-col a-i-center j-c-center\" style=\"min-height: 257px\">\n <c8y-application-properties-form\n *ngIf=\"!inProgress\"\n [application]=\"newAppConfig\"\n class=\"d-block fit-w\"\n ></c8y-application-properties-form>\n\n <ng-container *ngIf=\"!inProgress\">\n <div [ngStyle]=\"{ padding: '0 16px' }\" class=\"d-block fit-w bg-gray-white\">\n <label for=\"packageVersion\" translate>Use extension package version</label>\n <c8y-form-group>\n <c8y-typeahead\n [(ngModel)]=\"model.selected\"\n name=\"packageVersion\"\n (onSearch)=\"onInput.next($event)\"\n placeholder=\"{{ 'Select or enter' | translate }}\"\n [displayProperty]=\"'version'\"\n [required]=\"true\"\n [hideNew]=\"true\"\n [container]=\"'body'\"\n >\n <c8y-li\n *c8yFor=\"let version of versions$; loadMore: 'auto'; notFound: notFoundTemplate\"\n (click)=\"onAppVersionSelect(version)\"\n class=\"p-l-8 p-r-8 c8y-list__item--link\"\n [active]=\"model.selected === version\"\n >\n <c8y-li-icon icon=\"big-parcel\"></c8y-li-icon>\n <span\n [ngStyle]=\"{\n display: 'flex',\n 'flex-direction': 'row',\n 'align-content': 'center',\n 'justify-content': 'space-between',\n 'align-items': 'center'\n }\"\n >\n <c8y-highlight\n [text]=\"version.version || '--'\"\n [pattern]=\"onInput | async\"\n ></c8y-highlight>\n\n <span>\n <span *ngFor=\"let tag of version.tags\" class=\"label label-info m-l-4\">\n {{ tag }}\n </span>\n </span>\n </span>\n </c8y-li>\n <ng-template #notFoundTemplate>\n <c8y-li\n class=\"bg-gray-lighter p-8\"\n *ngIf=\"(onInput | async)?.length > 0 && (versions$ | async)?.data?.length === 0\"\n >\n <span translate>No match found.</span>\n </c8y-li>\n </ng-template>\n </c8y-typeahead>\n </c8y-form-group>\n </div>\n </ng-container>\n\n <c8y-progress-bar\n [message]=\"'Installing\u2026' | translate\"\n class=\"text-center d-block\"\n *ngIf=\"inProgress\"\n ></c8y-progress-bar>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"isDeployed\">\n <div\n *ngIf=\"deployedWithSuccess; else failedDeploy\"\n class=\"d-flex a-i-center j-c-center\"\n style=\"min-height: 257px\"\n >\n <c8y-operation-result\n text=\"{{ 'Application created' | translate }}\"\n [size]=\"84\"\n [vertical]=\"true\"\n type=\"success\"\n class=\"lead\"\n ></c8y-operation-result>\n </div>\n <ng-template #failedDeploy>\n <div class=\"d-flex a-i-center j-c-center\" style=\"min-height: 257px\">\n <c8y-operation-result\n text=\"{{ 'Application creation failed' | translate }}\"\n [size]=\"84\"\n [vertical]=\"true\"\n type=\"error\"\n class=\"lead\"\n ></c8y-operation-result>\n </div>\n </ng-template>\n </ng-container>\n</c8y-wizard-body>\n\n<c8y-wizard-footer>\n <button\n *ngIf=\"!isDeployed\"\n (click)=\"selectedPackage ? clean() : back()\"\n class=\"btn btn-default\"\n title=\"{{ 'Back' | translate }}\"\n [disabled]=\"inProgress\"\n type=\"button\"\n >\n {{ 'Back' | translate }}\n </button>\n <button\n title=\"{{ isDeployed && deployedWithSuccess ? ('Close' | translate) : ('Cancel' | translate) }}\"\n class=\"btn btn-default\"\n type=\"button\"\n (click)=\"cancel()\"\n >\n {{ isDeployed && deployedWithSuccess ? ('Close' | translate) : ('Cancel' | translate) }}\n </button>\n\n <button\n title=\"{{ 'Install' | translate }}\"\n class=\"btn btn-primary\"\n type=\"button\"\n (click)=\"deployApp()\"\n [disabled]=\"inProgress || !packages?.length\"\n *ngIf=\"!isDeployed\"\n >\n {{ 'Install' | translate }}\n </button>\n</c8y-wizard-footer>\n", dependencies: [{ kind: "component", type: i3.EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "directive", type: i3.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i3.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i3.ForOfDirective, selector: "[c8yFor]", inputs: ["c8yForOf", "c8yForLoadMore", "c8yForPipe", "c8yForNotFound", "c8yForMaxIterations", "c8yForLoadingTemplate", "c8yForLoadNextLabel", "c8yForRealtime", "c8yForRealtimeOptions", "c8yForComparator", "c8yForEnableVirtualScroll", "c8yForVirtualScrollElementSize", "c8yForVirtualScrollStrategy", "c8yForVirtualScrollContainerHeight"], outputs: ["c8yForCount"] }, { kind: "component", type: i3.ProgressBarComponent, selector: "c8y-progress-bar", inputs: ["message", "progress"] }, { kind: "component", type: i3.OperationResultComponent, selector: "c8y-operation-result", inputs: ["text", "vertical", "size", "type"] }, { kind: "component", type: i3.HighlightComponent, selector: "c8y-highlight", inputs: ["pattern", "text", "elementClass", "shouldTrimPattern"] }, { kind: "component", type: i3.TypeaheadComponent, selector: "c8y-typeahead", inputs: ["required", "maxlength", "disabled", "allowFreeEntries", "placeholder", "displayProperty", "icon", "name", "autoClose", "hideNew", "container", "selected"], outputs: ["onSearch", "onIconClick"] }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i3.FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "component", type: i3.ListItemComponent, selector: "c8y-list-item, c8y-li", inputs: ["active", "emptyActions", "collapsed", "selectable"], outputs: ["collapsedChange"] }, { kind: "component", type: i3.ListItemIconComponent, selector: "c8y-list-item-icon, c8y-li-icon", inputs: ["icon", "status"] }, { kind: "component", type: i3.WizardHeaderComponent, selector: "c8y-wizard-header" }, { kind: "component", type: i3.WizardBodyComponent, selector: "c8y-wizard-body" }, { kind: "component", type: i3.WizardFooterComponent, selector: "c8y-wizard-footer" }, { kind: "component", type: i1.ApplicationPropertiesFormComponent, selector: "c8y-application-properties-form", inputs: ["application", "disabled"] }, { kind: "pipe", type: i3.C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }] }); }
139
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: InstallFromPackageComponent, selector: "c8y-install-from-package", viewQueries: [{ propertyName: "applicationPropertiesForm", first: true, predicate: ApplicationPropertiesFormComponent, descendants: true }], ngImport: i0, template: "<c8y-wizard-header>\n <i [c8yIcon]=\"'big-parcel'\"></i>\n <h4 id=\"modal-title\" translate>Install from extension package</h4>\n</c8y-wizard-header>\n<c8y-wizard-body>\n <ng-container *ngIf=\"!selectedPackage\">\n <div class=\"modal-inner-scroll\" id=\"modal-body\">\n <p class=\"p-16 text-medium text-center separator-bottom sticky-top bg-level-0\">\n {{ 'Select from available extension packages' | translate }}\n </p>\n\n <c8y-ui-empty-state\n *ngIf=\"!packages?.length\"\n [icon]=\"'big-parcel'\"\n [title]=\"'No extension packages to display.' | translate\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n\n <div *ngIf=\"packages?.length\" class=\"c8y-wizard-list-nav\" style=\"min-height: 257px\">\n <button\n class=\"list-group-item text-truncate\"\n *ngFor=\"let package of packages\"\n (click)=\"selectPackage(package)\"\n title=\"{{ package.name }}\"\n type=\"button\"\n >\n <i c8yIcon=\"big-parcel\" class=\"list-group-icon\"></i>\n <span [innerText]=\"package.name\"></span>\n </button>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"!isDeployed && selectedPackage\">\n <p class=\"p-16 text-center text-medium separator-bottom sticky-top bg-level-0\">\n {{ 'Provide application details' | translate }}\n </p>\n <div class=\"d-flex d-col a-i-center j-c-center\" style=\"min-height: 257px\">\n <c8y-application-properties-form\n *ngIf=\"!inProgress\"\n [application]=\"newAppConfig\"\n class=\"d-block fit-w\"\n ></c8y-application-properties-form>\n\n <ng-container *ngIf=\"!inProgress\">\n <div [ngStyle]=\"{ padding: '0 16px' }\" class=\"d-block fit-w bg-gray-white\">\n <label for=\"packageVersion\" translate>Use extension package version</label>\n <c8y-form-group>\n <c8y-typeahead\n [(ngModel)]=\"model.selected\"\n name=\"packageVersion\"\n (onSearch)=\"onInput.next($event)\"\n placeholder=\"{{ 'Select or enter' | translate }}\"\n [displayProperty]=\"'version'\"\n [required]=\"true\"\n [hideNew]=\"true\"\n [container]=\"'body'\"\n >\n <c8y-li\n *c8yFor=\"let version of versions$; loadMore: 'auto'; notFound: notFoundTemplate\"\n (click)=\"onAppVersionSelect(version)\"\n class=\"p-l-8 p-r-8 c8y-list__item--link\"\n [active]=\"model.selected === version\"\n >\n <c8y-li-icon icon=\"big-parcel\"></c8y-li-icon>\n <span\n [ngStyle]=\"{\n display: 'flex',\n 'flex-direction': 'row',\n 'align-content': 'center',\n 'justify-content': 'space-between',\n 'align-items': 'center'\n }\"\n >\n <c8y-highlight\n [text]=\"version.version || '--'\"\n [pattern]=\"onInput | async\"\n ></c8y-highlight>\n\n <span>\n <span *ngFor=\"let tag of version.tags\" class=\"label label-info m-l-4\">\n {{ tag }}\n </span>\n </span>\n </span>\n </c8y-li>\n <ng-template #notFoundTemplate>\n <c8y-li\n class=\"bg-gray-lighter p-8\"\n *ngIf=\"(onInput | async)?.length > 0 && (versions$ | async)?.data?.length === 0\"\n >\n <span translate>No match found.</span>\n </c8y-li>\n </ng-template>\n </c8y-typeahead>\n </c8y-form-group>\n </div>\n </ng-container>\n\n <c8y-progress-bar\n [message]=\"'Installing\u2026' | translate\"\n class=\"text-center d-block\"\n *ngIf=\"inProgress\"\n ></c8y-progress-bar>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"isDeployed\">\n <div\n *ngIf=\"deployedWithSuccess; else failedDeploy\"\n class=\"d-flex a-i-center j-c-center\"\n style=\"min-height: 257px\"\n >\n <c8y-operation-result\n text=\"{{ 'Application created' | translate }}\"\n [size]=\"84\"\n [vertical]=\"true\"\n type=\"success\"\n class=\"lead\"\n ></c8y-operation-result>\n </div>\n <ng-template #failedDeploy>\n <div class=\"d-flex a-i-center j-c-center\" style=\"min-height: 257px\">\n <c8y-operation-result\n text=\"{{ 'Application creation failed' | translate }}\"\n [size]=\"84\"\n [vertical]=\"true\"\n type=\"error\"\n class=\"lead\"\n ></c8y-operation-result>\n </div>\n </ng-template>\n </ng-container>\n</c8y-wizard-body>\n\n<c8y-wizard-footer>\n <button\n *ngIf=\"!isDeployed\"\n (click)=\"selectedPackage ? clean() : back()\"\n class=\"btn btn-default\"\n title=\"{{ 'Back' | translate }}\"\n [disabled]=\"inProgress\"\n type=\"button\"\n >\n {{ 'Back' | translate }}\n </button>\n <button\n title=\"{{ isDeployed && deployedWithSuccess ? ('Close' | translate) : ('Cancel' | translate) }}\"\n class=\"btn btn-default\"\n type=\"button\"\n (click)=\"cancel()\"\n >\n {{ isDeployed && deployedWithSuccess ? ('Close' | translate) : ('Cancel' | translate) }}\n </button>\n\n <button\n title=\"{{ 'Install' | translate }}\"\n class=\"btn btn-primary\"\n type=\"button\"\n (click)=\"deployApp()\"\n [disabled]=\"inProgress || !packages?.length\"\n *ngIf=\"!isDeployed\"\n >\n {{ 'Install' | translate }}\n </button>\n</c8y-wizard-footer>\n", dependencies: [{ kind: "component", type: i3.EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "directive", type: i3.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i3.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i3.ForOfDirective, selector: "[c8yFor]", inputs: ["c8yForOf", "c8yForLoadMore", "c8yForPipe", "c8yForNotFound", "c8yForMaxIterations", "c8yForLoadingTemplate", "c8yForLoadNextLabel", "c8yForLoadingLabel", "c8yForRealtime", "c8yForRealtimeOptions", "c8yForComparator", "c8yForEnableVirtualScroll", "c8yForVirtualScrollElementSize", "c8yForVirtualScrollStrategy", "c8yForVirtualScrollContainerHeight"], outputs: ["c8yForCount", "c8yForLoadMoreComponent"] }, { kind: "component", type: i3.ProgressBarComponent, selector: "c8y-progress-bar", inputs: ["message", "progress"] }, { kind: "component", type: i3.OperationResultComponent, selector: "c8y-operation-result", inputs: ["text", "vertical", "size", "type"] }, { kind: "component", type: i3.HighlightComponent, selector: "c8y-highlight", inputs: ["pattern", "text", "elementClass", "shouldTrimPattern"] }, { kind: "component", type: i3.TypeaheadComponent, selector: "c8y-typeahead", inputs: ["required", "maxlength", "disabled", "allowFreeEntries", "placeholder", "displayProperty", "icon", "name", "autoClose", "hideNew", "container", "selected"], outputs: ["onSearch", "onIconClick"] }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i3.FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "component", type: i3.ListItemComponent, selector: "c8y-list-item, c8y-li", inputs: ["active", "emptyActions", "collapsed", "selectable"], outputs: ["collapsedChange"] }, { kind: "component", type: i3.ListItemIconComponent, selector: "c8y-list-item-icon, c8y-li-icon", inputs: ["icon", "status"] }, { kind: "component", type: i3.WizardHeaderComponent, selector: "c8y-wizard-header" }, { kind: "component", type: i3.WizardBodyComponent, selector: "c8y-wizard-body" }, { kind: "component", type: i3.WizardFooterComponent, selector: "c8y-wizard-footer" }, { kind: "component", type: i1.ApplicationPropertiesFormComponent, selector: "c8y-application-properties-form", inputs: ["application", "disabled"] }, { kind: "pipe", type: i3.C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }] }); }
140
140
  }
141
141
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: InstallFromPackageComponent, decorators: [{
142
142
  type: Component,
@@ -91,7 +91,7 @@ export class PackageVersionSelectComponent {
91
91
  multi: true,
92
92
  useExisting: forwardRef(() => PackageVersionSelectComponent)
93
93
  }
94
- ], usesOnChanges: true, ngImport: i0, template: "<label for=\"packageVersion\">{{ label | translate }}</label>\n<c8y-form-group>\n <c8y-typeahead\n [(ngModel)]=\"selectedVersion\"\n name=\"packageVersion\"\n (onSearch)=\"onInput$.next($event)\"\n placeholder=\"{{ 'Select below or start typing' | translate }}\"\n [displayProperty]=\"'version'\"\n [required]=\"true\"\n [disabled]=\"isDisabled\"\n [hideNew]=\"true\"\n [container]=\"'body'\"\n >\n <c8y-li\n *c8yFor=\"let appVersion of versions$; loadMore: 'auto'; notFound: notFoundTemplate\"\n (click)=\"onVersionSelect(appVersion)\"\n class=\"p-l-8 p-r-8 c8y-list__item--link\"\n [active]=\"selectedVersion === appVersion\"\n >\n <c8y-li-icon icon=\"big-parcel\"></c8y-li-icon>\n <span\n [ngStyle]=\"{\n display: 'flex',\n 'flex-direction': 'row',\n 'align-content': 'center',\n 'justify-content': 'space-between',\n 'align-items': 'center'\n }\"\n >\n <c8y-highlight\n [text]=\"appVersion.version || '--'\"\n [pattern]=\"onInput$ | async\"\n ></c8y-highlight>\n <span>\n <span *ngFor=\"let tag of appVersion.tags\" class=\"label label-info m-l-4\">\n {{ tag }}\n </span>\n </span>\n </span>\n </c8y-li>\n <ng-template #notFoundTemplate>\n <c8y-li\n class=\"bg-gray-lighter p-8\"\n *ngIf=\"(onInput$ | async)?.length > 0 && (versions$ | async)?.data?.length === 0\"\n >\n <span translate>No match found.</span>\n </c8y-li>\n </ng-template>\n </c8y-typeahead>\n</c8y-form-group>\n", dependencies: [{ kind: "directive", type: i2.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i2.ForOfDirective, selector: "[c8yFor]", inputs: ["c8yForOf", "c8yForLoadMore", "c8yForPipe", "c8yForNotFound", "c8yForMaxIterations", "c8yForLoadingTemplate", "c8yForLoadNextLabel", "c8yForRealtime", "c8yForRealtimeOptions", "c8yForComparator", "c8yForEnableVirtualScroll", "c8yForVirtualScrollElementSize", "c8yForVirtualScrollStrategy", "c8yForVirtualScrollContainerHeight"], outputs: ["c8yForCount"] }, { kind: "component", type: i2.HighlightComponent, selector: "c8y-highlight", inputs: ["pattern", "text", "elementClass", "shouldTrimPattern"] }, { kind: "component", type: i2.TypeaheadComponent, selector: "c8y-typeahead", inputs: ["required", "maxlength", "disabled", "allowFreeEntries", "placeholder", "displayProperty", "icon", "name", "autoClose", "hideNew", "container", "selected"], outputs: ["onSearch", "onIconClick"] }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i2.FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "component", type: i2.ListItemComponent, selector: "c8y-list-item, c8y-li", inputs: ["active", "emptyActions", "collapsed", "selectable"], outputs: ["collapsedChange"] }, { kind: "component", type: i2.ListItemIconComponent, selector: "c8y-list-item-icon, c8y-li-icon", inputs: ["icon", "status"] }, { kind: "pipe", type: i2.C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }] }); }
94
+ ], usesOnChanges: true, ngImport: i0, template: "<label for=\"packageVersion\">{{ label | translate }}</label>\n<c8y-form-group>\n <c8y-typeahead\n [(ngModel)]=\"selectedVersion\"\n name=\"packageVersion\"\n (onSearch)=\"onInput$.next($event)\"\n placeholder=\"{{ 'Select below or start typing' | translate }}\"\n [displayProperty]=\"'version'\"\n [required]=\"true\"\n [disabled]=\"isDisabled\"\n [hideNew]=\"true\"\n [container]=\"'body'\"\n >\n <c8y-li\n *c8yFor=\"let appVersion of versions$; loadMore: 'auto'; notFound: notFoundTemplate\"\n (click)=\"onVersionSelect(appVersion)\"\n class=\"p-l-8 p-r-8 c8y-list__item--link\"\n [active]=\"selectedVersion === appVersion\"\n >\n <c8y-li-icon icon=\"big-parcel\"></c8y-li-icon>\n <span\n [ngStyle]=\"{\n display: 'flex',\n 'flex-direction': 'row',\n 'align-content': 'center',\n 'justify-content': 'space-between',\n 'align-items': 'center'\n }\"\n >\n <c8y-highlight\n [text]=\"appVersion.version || '--'\"\n [pattern]=\"onInput$ | async\"\n ></c8y-highlight>\n <span>\n <span *ngFor=\"let tag of appVersion.tags\" class=\"label label-info m-l-4\">\n {{ tag }}\n </span>\n </span>\n </span>\n </c8y-li>\n <ng-template #notFoundTemplate>\n <c8y-li\n class=\"bg-gray-lighter p-8\"\n *ngIf=\"(onInput$ | async)?.length > 0 && (versions$ | async)?.data?.length === 0\"\n >\n <span translate>No match found.</span>\n </c8y-li>\n </ng-template>\n </c8y-typeahead>\n</c8y-form-group>\n", dependencies: [{ kind: "directive", type: i2.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i2.ForOfDirective, selector: "[c8yFor]", inputs: ["c8yForOf", "c8yForLoadMore", "c8yForPipe", "c8yForNotFound", "c8yForMaxIterations", "c8yForLoadingTemplate", "c8yForLoadNextLabel", "c8yForLoadingLabel", "c8yForRealtime", "c8yForRealtimeOptions", "c8yForComparator", "c8yForEnableVirtualScroll", "c8yForVirtualScrollElementSize", "c8yForVirtualScrollStrategy", "c8yForVirtualScrollContainerHeight"], outputs: ["c8yForCount", "c8yForLoadMoreComponent"] }, { kind: "component", type: i2.HighlightComponent, selector: "c8y-highlight", inputs: ["pattern", "text", "elementClass", "shouldTrimPattern"] }, { kind: "component", type: i2.TypeaheadComponent, selector: "c8y-typeahead", inputs: ["required", "maxlength", "disabled", "allowFreeEntries", "placeholder", "displayProperty", "icon", "name", "autoClose", "hideNew", "container", "selected"], outputs: ["onSearch", "onIconClick"] }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i2.FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "component", type: i2.ListItemComponent, selector: "c8y-list-item, c8y-li", inputs: ["active", "emptyActions", "collapsed", "selectable"], outputs: ["collapsedChange"] }, { kind: "component", type: i2.ListItemIconComponent, selector: "c8y-list-item-icon, c8y-li-icon", inputs: ["icon", "status"] }, { kind: "pipe", type: i2.C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }] }); }
95
95
  }
96
96
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: PackageVersionSelectComponent, decorators: [{
97
97
  type: Component,
@@ -130,7 +130,7 @@ export class LocationComponent {
130
130
  }
131
131
  }
132
132
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: LocationComponent, deps: [{ token: i1.ContextRouteService }, { token: i2.ActivatedRoute }, { token: i3.InventoryService }, { token: i1.Permissions }, { token: i1.OptionsService }, { token: i1.AlertService }], target: i0.ɵɵFactoryTarget.Component }); }
133
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: LocationComponent, selector: "c8y-location", viewQueries: [{ propertyName: "map", first: true, predicate: MapComponent, descendants: true }], ngImport: i0, template: "<c8y-action-bar-item placement=\"right\">\n <button\n class=\"btn btn-link c8y-realtime\"\n title=\"{{ 'Toggle realtime' | translate }}\"\n type=\"button\"\n (click)=\"toggleRealtime()\"\n >\n <span\n class=\"c8y-pulse\"\n [ngClass]=\"{ active: config.realtime, inactive: !config.realtime }\"\n ></span>\n <span translate>Realtime</span>\n </button>\n</c8y-action-bar-item>\n<c8y-action-bar-item placement=\"right\">\n <button\n class=\"btn btn-clean\"\n title=\"{{ 'Center`verb`' | translate }}\"\n (click)=\"centerMap()\"\n >\n <i [c8yIcon]=\"'target1'\"></i>\n <span translate>Center`verb`</span>\n </button>\n</c8y-action-bar-item>\n\n<div class=\"card card--grid content-fullpage d-grid grid__col--8-4--md\">\n <div\n class=\"bg-white p-relative\"\n style=\"min-height: 30vh\"\n >\n <c8y-map\n [assets]=\"[position]\"\n [config]=\"config\"\n (onRealtimeUpdate)=\"positionChanged($event)\"\n ></c8y-map>\n </div>\n\n <form\n class=\"d-flex d-col bg-inherit content-fullpage bg-gray-white\"\n #positionForm=\"ngForm\"\n (ngSubmit)=\"save()\"\n >\n <div class=\"card-header large-padding separator sticky-top\">\n <span\n class=\"card-title\"\n translate\n >\n Device location\n </span>\n </div>\n <div class=\"inner-scroll\">\n <div\n class=\"m-16\"\n *ngIf=\"!isEdit\"\n >\n <div class=\"p-b-40\">\n <div\n class=\"text-bold\"\n translate\n >\n Latitude (\u00B0)\n </div>\n {{ position.c8y_Position.lat }}\n </div>\n <div class=\"p-b-40\">\n <div\n class=\"text-bold\"\n translate\n >\n Longitude (\u00B0)\n </div>\n {{ position.c8y_Position.lng }}\n </div>\n <div class=\"p-b-40\">\n <div\n class=\"text-bold\"\n translate\n >\n Altitude (m)\n </div>\n {{ position.c8y_Position.alt }}\n </div>\n </div>\n <div\n class=\"m-16\"\n *ngIf=\"isEdit\"\n >\n <c8y-form-group>\n <label\n for=\"lat\"\n translate\n >\n Latitude (\u00B0)\n </label>\n\n <input\n class=\"form-control\"\n [title]=\"'Latitude (\u00B0)' | translate\"\n id=\"lat\"\n name=\"lat\"\n type=\"number\"\n required\n min=\"-90\"\n max=\"90\"\n (blur)=\"updateMarkerPosition()\"\n [(ngModel)]=\"position.c8y_Position.lat\"\n />\n <c8y-messages>\n <c8y-message\n name=\"min\"\n [text]=\"'The minimum latitude value is -90\u00B0.' | translate\"\n ></c8y-message>\n <c8y-message\n name=\"max\"\n [text]=\"'The maximum latitude value is 90\u00B0.' | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n <c8y-form-group>\n <label\n for=\"lat\"\n translate\n >\n Longitude (\u00B0)\n </label>\n\n <input\n class=\"form-control\"\n [title]=\"'Longitude (\u00B0)' | translate\"\n id=\"lng\"\n name=\"lng\"\n type=\"number\"\n required\n min=\"-180\"\n max=\"180\"\n (blur)=\"updateMarkerPosition()\"\n [(ngModel)]=\"position.c8y_Position.lng\"\n />\n <c8y-messages>\n <c8y-message\n name=\"min\"\n [text]=\"'The minimum longitude value is -180\u00B0.' | translate\"\n ></c8y-message>\n <c8y-message\n name=\"max\"\n [text]=\"'The maximum longitude value is 180\u00B0.' | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n <c8y-form-group>\n <label\n for=\"alt\"\n translate\n >\n Altitude (m)\n </label>\n\n <input\n class=\"form-control\"\n [title]=\"'Altitude (m)' | translate\"\n id=\"alt\"\n name=\"alt\"\n type=\"number\"\n [(ngModel)]=\"position.c8y_Position.alt\"\n />\n </c8y-form-group>\n </div>\n\n <form\n class=\"card-block bg-level-1\"\n #addressSearch=\"ngForm\"\n novalidate\n (submit)=\"searchAddress(addressSearchTerm)\"\n *ngIf=\"isEdit && !hideAddressSearchFeature\"\n >\n <div class=\"form-group\">\n <label\n for=\"searchAddress\"\n translate\n >\n Find lat/long by address\n </label>\n <div class=\"input-group input-group-search\">\n <input\n class=\"form-control\"\n id=\"searchAddress\"\n name=\"addressSearchTerm\"\n type=\"text\"\n [placeholder]=\"'e.g. Speditionstra\u00DFe 13, D\u00FCsseldorf`LOCALIZE`' | translate\"\n [(ngModel)]=\"addressSearchTerm\"\n />\n <span class=\"input-group-btn\">\n <button\n class=\"btn btn-dot\"\n [title]=\"'Search' | translate\"\n type=\"submit\"\n >\n <i\n class=\"dlt-c8y-icon-search\"\n c8y-icon=\"search\"\n ></i>\n </button>\n </span>\n </div>\n </div>\n </form>\n </div>\n <div class=\"card-footer separator\">\n <button\n class=\"btn btn-default\"\n [title]=\"'Edit location' | translate\"\n type=\"button\"\n *ngIf=\"canEdit && !isEdit\"\n (click)=\"edit()\"\n translate\n >\n Edit location\n </button>\n <button\n class=\"btn btn-default\"\n [title]=\"'Cancel' | translate\"\n type=\"button\"\n (click)=\"cancel()\"\n *ngIf=\"isEdit\"\n translate\n >\n Cancel\n </button>\n <button\n class=\"btn btn-primary\"\n [title]=\"'Save' | translate\"\n type=\"submit\"\n *ngIf=\"isEdit\"\n translate\n [disabled]=\"!positionForm.valid\"\n >\n Save\n </button>\n </div>\n </form>\n</div>\n", dependencies: [{ kind: "component", type: i4.MapComponent, selector: "c8y-map", inputs: ["config", "assets"], outputs: ["onMove", "onMoveEnd", "onZoomStart", "onZoomEnd", "onRealtimeUpdate", "onInit"] }, { kind: "component", type: i1.ActionBarItemComponent, selector: "c8y-action-bar-item", inputs: ["placement", "priority", "itemClass", "injector", "groupId", "inGroupPriority"] }, { kind: "directive", type: i1.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i1.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.MinValidationDirective, selector: "[min]", inputs: ["min"] }, { kind: "directive", type: i1.MaxValidationDirective, selector: "[max]", inputs: ["max"] }, { kind: "directive", type: i6.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i6.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i6.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i6.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i6.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i6.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i6.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i1.FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: i1.MessageDirective, selector: "c8y-message", inputs: ["name", "text"] }, { kind: "component", type: i1.MessagesComponent, selector: "c8y-messages", inputs: ["show", "defaults"] }, { kind: "directive", type: i1.RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "pipe", type: i1.C8yTranslatePipe, name: "translate" }] }); }
133
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: LocationComponent, selector: "c8y-location", viewQueries: [{ propertyName: "map", first: true, predicate: MapComponent, descendants: true }], ngImport: i0, template: "<c8y-action-bar-item placement=\"right\">\n <button\n class=\"btn btn-link c8y-realtime\"\n title=\"{{ 'Toggle realtime' | translate }}\"\n type=\"button\"\n (click)=\"toggleRealtime()\"\n >\n <span\n class=\"c8y-pulse\"\n [ngClass]=\"{ active: config.realtime, inactive: !config.realtime }\"\n ></span>\n <span translate>Realtime</span>\n </button>\n</c8y-action-bar-item>\n<c8y-action-bar-item placement=\"right\">\n <button\n class=\"btn btn-clean\"\n title=\"{{ 'Center`verb`' | translate }}\"\n (click)=\"centerMap()\"\n >\n <i [c8yIcon]=\"'target1'\"></i>\n <span translate>Center`verb`</span>\n </button>\n</c8y-action-bar-item>\n\n<div class=\"card card--grid content-fullpage d-grid grid__col--8-4--md\">\n <div\n class=\"bg-white p-relative\"\n style=\"min-height: 30vh\"\n >\n <c8y-map\n [assets]=\"[position]\"\n [config]=\"config\"\n (onRealtimeUpdate)=\"positionChanged($event)\"\n ></c8y-map>\n </div>\n\n <form\n class=\"d-flex d-col bg-inherit content-fullpage bg-gray-white\"\n #positionForm=\"ngForm\"\n (ngSubmit)=\"save()\"\n >\n <div class=\"card-header large-padding separator sticky-top\">\n <span\n class=\"card-title\"\n translate\n >\n Device location\n </span>\n </div>\n <div class=\"inner-scroll\">\n <div\n class=\"m-16\"\n *ngIf=\"!isEdit\"\n >\n <div class=\"p-b-40\">\n <div\n class=\"text-bold\"\n translate\n >\n Latitude (\u00B0)\n </div>\n {{ position.c8y_Position.lat }}\n </div>\n <div class=\"p-b-40\">\n <div\n class=\"text-bold\"\n translate\n >\n Longitude (\u00B0)\n </div>\n {{ position.c8y_Position.lng }}\n </div>\n <div class=\"p-b-40\">\n <div\n class=\"text-bold\"\n translate\n >\n Altitude (m)\n </div>\n {{ position.c8y_Position.alt }}\n </div>\n </div>\n <div\n class=\"m-16\"\n *ngIf=\"isEdit\"\n >\n <c8y-form-group>\n <label\n for=\"lat\"\n translate\n >\n Latitude (\u00B0)\n </label>\n\n <input\n class=\"form-control\"\n [title]=\"'Latitude (\u00B0)' | translate\"\n id=\"lat\"\n name=\"lat\"\n type=\"number\"\n required\n min=\"-90\"\n max=\"90\"\n (blur)=\"updateMarkerPosition()\"\n [(ngModel)]=\"position.c8y_Position.lat\"\n />\n <c8y-messages>\n <c8y-message\n name=\"min\"\n [text]=\"'The minimum latitude value is -90\u00B0.' | translate\"\n ></c8y-message>\n <c8y-message\n name=\"max\"\n [text]=\"'The maximum latitude value is 90\u00B0.' | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n <c8y-form-group>\n <label\n for=\"lat\"\n translate\n >\n Longitude (\u00B0)\n </label>\n\n <input\n class=\"form-control\"\n [title]=\"'Longitude (\u00B0)' | translate\"\n id=\"lng\"\n name=\"lng\"\n type=\"number\"\n required\n min=\"-180\"\n max=\"180\"\n (blur)=\"updateMarkerPosition()\"\n [(ngModel)]=\"position.c8y_Position.lng\"\n />\n <c8y-messages>\n <c8y-message\n name=\"min\"\n [text]=\"'The minimum longitude value is -180\u00B0.' | translate\"\n ></c8y-message>\n <c8y-message\n name=\"max\"\n [text]=\"'The maximum longitude value is 180\u00B0.' | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n <c8y-form-group>\n <label\n for=\"alt\"\n translate\n >\n Altitude (m)\n </label>\n\n <input\n class=\"form-control\"\n [title]=\"'Altitude (m)' | translate\"\n id=\"alt\"\n name=\"alt\"\n type=\"number\"\n [(ngModel)]=\"position.c8y_Position.alt\"\n />\n </c8y-form-group>\n </div>\n\n <form\n class=\"card-block bg-level-1\"\n #addressSearch=\"ngForm\"\n novalidate\n (submit)=\"searchAddress(addressSearchTerm)\"\n *ngIf=\"isEdit && !hideAddressSearchFeature\"\n >\n <div class=\"form-group\">\n <label\n for=\"searchAddress\"\n translate\n >\n Find lat/long by address\n </label>\n <div class=\"input-group input-group-search\">\n <input\n class=\"form-control\"\n id=\"searchAddress\"\n name=\"addressSearchTerm\"\n type=\"text\"\n [placeholder]=\"'e.g. Speditionstra\u00DFe 13, D\u00FCsseldorf`LOCALIZE`' | translate\"\n [(ngModel)]=\"addressSearchTerm\"\n />\n <span class=\"input-group-btn\">\n <button\n class=\"btn btn-dot\"\n [title]=\"'Search' | translate\"\n type=\"submit\"\n >\n <i\n class=\"dlt-c8y-icon-search\"\n c8y-icon=\"search\"\n ></i>\n </button>\n </span>\n </div>\n </div>\n </form>\n </div>\n <div class=\"card-footer separator\">\n <button\n class=\"btn btn-default\"\n [title]=\"'Edit location' | translate\"\n type=\"button\"\n *ngIf=\"canEdit && !isEdit\"\n (click)=\"edit()\"\n translate\n >\n Edit location\n </button>\n <button\n class=\"btn btn-default\"\n [title]=\"'Cancel' | translate\"\n type=\"button\"\n (click)=\"cancel()\"\n *ngIf=\"isEdit\"\n translate\n >\n Cancel\n </button>\n <button\n class=\"btn btn-primary\"\n [title]=\"'Save' | translate\"\n type=\"submit\"\n *ngIf=\"isEdit\"\n translate\n [disabled]=\"!positionForm.valid\"\n >\n Save\n </button>\n </div>\n </form>\n</div>\n", dependencies: [{ kind: "component", type: i4.MapComponent, selector: "c8y-map", inputs: ["config", "assets", "polyline$", "polylineOptions"], outputs: ["onMove", "onMoveEnd", "onZoomStart", "onZoomEnd", "onRealtimeUpdate", "onInit"] }, { kind: "component", type: i1.ActionBarItemComponent, selector: "c8y-action-bar-item", inputs: ["placement", "priority", "itemClass", "injector", "groupId", "inGroupPriority"] }, { kind: "directive", type: i1.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i1.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.MinValidationDirective, selector: "[min]", inputs: ["min"] }, { kind: "directive", type: i1.MaxValidationDirective, selector: "[max]", inputs: ["max"] }, { kind: "directive", type: i6.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i6.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i6.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i6.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i6.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i6.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i6.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i1.FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: i1.MessageDirective, selector: "c8y-message", inputs: ["name", "text"] }, { kind: "component", type: i1.MessagesComponent, selector: "c8y-messages", inputs: ["show", "defaults"] }, { kind: "directive", type: i1.RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "pipe", type: i1.C8yTranslatePipe, name: "translate" }] }); }
134
134
  }
135
135
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: LocationComponent, decorators: [{
136
136
  type: Component,
@@ -1,7 +1,7 @@
1
1
  import { Component, EventEmitter, Inject, Input, IterableDiffers, Output, SimpleChange } from '@angular/core';
2
- import { ColorService, ManagedObjectRealtimeService } from '@c8y/ngx-components';
2
+ import { ColorService, DatePipe, GeoService, ManagedObjectRealtimeService } from '@c8y/ngx-components';
3
3
  import { TranslateService } from '@ngx-translate/core';
4
- import { BehaviorSubject, NEVER, Observable, Subject, combineLatest, from, fromEvent, interval, merge, of } from 'rxjs';
4
+ import { BehaviorSubject, combineLatest, from, fromEvent, interval, merge, NEVER, Observable, of, Subject } from 'rxjs';
5
5
  import { debounceTime, filter, first, map, mergeMap, switchMap, takeUntil, tap } from 'rxjs/operators';
6
6
  import { ClusterMap } from './cluster-map';
7
7
  import { MapComponent } from './map.component';
@@ -13,8 +13,8 @@ import * as i2 from "./map.service";
13
13
  import * as i3 from "@ngx-translate/core";
14
14
  import * as i4 from "rxjs";
15
15
  export class ClusterMapComponent extends MapComponent {
16
- constructor(moRealtimeService, mapService, layers$, defaultConfig$, translateService, iterable, colorService) {
17
- super(moRealtimeService, mapService, layers$, defaultConfig$, translateService);
16
+ constructor(moRealtimeService, mapService, layers$, defaultConfig$, translateService, iterable, colorService, geo, datePipe) {
17
+ super(moRealtimeService, mapService, layers$, defaultConfig$, translateService, geo, datePipe);
18
18
  this.moRealtimeService = moRealtimeService;
19
19
  this.mapService = mapService;
20
20
  this.layers$ = layers$;
@@ -212,7 +212,7 @@ export class ClusterMapComponent extends MapComponent {
212
212
  });
213
213
  return Promise.all(updatePromise);
214
214
  }
215
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ClusterMapComponent, deps: [{ token: i1.ManagedObjectRealtimeService }, { token: i2.MapService }, { token: MAP_TILE_LAYER }, { token: MAP_DEFAULT_CONFIG }, { token: i3.TranslateService }, { token: i0.IterableDiffers }, { token: i1.ColorService }], target: i0.ɵɵFactoryTarget.Component }); }
215
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ClusterMapComponent, deps: [{ token: i1.ManagedObjectRealtimeService }, { token: i2.MapService }, { token: MAP_TILE_LAYER }, { token: MAP_DEFAULT_CONFIG }, { token: i3.TranslateService }, { token: i0.IterableDiffers }, { token: i1.ColorService }, { token: i1.GeoService }, { token: i1.DatePipe }], target: i0.ɵɵFactoryTarget.Component }); }
216
216
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: ClusterMapComponent, selector: "c8y-cluster-map", inputs: { config: "config", rootNode: "rootNode", assets: ["asset", "assets"], showClusterColor: "showClusterColor" }, outputs: { mapChange: "mapChange" }, providers: [ManagedObjectRealtimeService], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"c8y-map\">\n <div #map></div>\n</div>\n<ng-content></ng-content>\n" }); }
217
217
  }
218
218
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ClusterMapComponent, decorators: [{
@@ -224,7 +224,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
224
224
  }] }, { type: i4.Observable, decorators: [{
225
225
  type: Inject,
226
226
  args: [MAP_DEFAULT_CONFIG]
227
- }] }, { type: i3.TranslateService }, { type: i0.IterableDiffers }, { type: i1.ColorService }]; }, propDecorators: { config: [{
227
+ }] }, { type: i3.TranslateService }, { type: i0.IterableDiffers }, { type: i1.ColorService }, { type: i1.GeoService }, { type: i1.DatePipe }]; }, propDecorators: { config: [{
228
228
  type: Input
229
229
  }], rootNode: [{
230
230
  type: Input
@@ -236,4 +236,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
236
236
  }], mapChange: [{
237
237
  type: Output
238
238
  }] } });
239
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2x1c3Rlci1tYXAuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vbWFwL2NsdXN0ZXItbWFwLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uL21hcC9jbHVzdGVyLW1hcC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUNMLGVBQWUsRUFDZixNQUFNLEVBQ04sWUFBWSxFQUViLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUVqRixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUV2RCxPQUFPLEVBQ0wsZUFBZSxFQUNmLEtBQUssRUFDTCxVQUFVLEVBQ1YsT0FBTyxFQUNQLGFBQWEsRUFDYixJQUFJLEVBQ0osU0FBUyxFQUNULFFBQVEsRUFDUixLQUFLLEVBQ0wsRUFBRSxFQUNILE1BQU0sTUFBTSxDQUFDO0FBQ2QsT0FBTyxFQUNMLFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUNMLEdBQUcsRUFDSCxRQUFRLEVBQ1IsU0FBUyxFQUNULFNBQVMsRUFDVCxHQUFHLEVBQ0osTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBRUwsV0FBVyxFQUNYLGtCQUFrQixFQUNsQixjQUFjLEVBRWYsTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7Ozs7O0FBTzNDLE1BQU0sT0FBTyxtQkFBb0IsU0FBUSxZQUFZO0lBd0JuRCxZQUNZLGlCQUErQyxFQUMvQyxVQUFzQixFQUNFLE9BQXdDLEVBRWhFLGNB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QWlCLGFBRWhCLENBQUMsNEJBQTRCLENBQUM7OzBCQTZCdEMsTUFBTTsyQkFBQyxjQUFjOzswQkFDckIsTUFBTTsyQkFBQyxrQkFBa0I7b0lBdkI1QixNQUFNO3NCQURMLEtBQUs7Z0JBSU4sUUFBUTtzQkFEUCxLQUFLO2dCQUlOLE1BQU07c0JBREwsS0FBSzt1QkFBQyxPQUFPO2dCQUlkLGdCQUFnQjtzQkFEZixLQUFLO2dCQUlOLFNBQVM7c0JBRFIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbmplY3QsXG4gIElucHV0LFxuICBJdGVyYWJsZURpZmZlcnMsXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlLFxuICBTaW1wbGVDaGFuZ2VzXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSU1hbmFnZWRPYmplY3QgfSBmcm9tICdAYzh5L2NsaWVudCc7XG5pbXBvcnQgeyBDb2xvclNlcnZpY2UsIE1hbmFnZWRPYmplY3RSZWFsdGltZVNlcnZpY2UgfSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzJztcbmltcG9ydCB0eXBlIHsgTWFwVGlsZUxheWVyLCBNYXBEZWZhdWx0Q29uZmlnIH0gZnJvbSAnQGM4eS9kZXZraXQvb3B0aW9ucyc7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgdHlwZSAqIGFzIEwgZnJvbSAnbGVhZmxldCc7XG5pbXBvcnQge1xuICBCZWhhdmlvclN1YmplY3QsXG4gIE5FVkVSLFxuICBPYnNlcnZhYmxlLFxuICBTdWJqZWN0LFxuICBjb21iaW5lTGF0ZXN0LFxuICBmcm9tLFxuICBmcm9tRXZlbnQsXG4gIGludGVydmFsLFxuICBtZXJnZSxcbiAgb2Zcbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1xuICBkZWJvdW5jZVRpbWUsXG4gIGZpbHRlcixcbiAgZmlyc3QsXG4gIG1hcCxcbiAgbWVyZ2VNYXAsXG4gIHN3aXRjaE1hcCxcbiAgdGFrZVVudGlsLFxuICB0YXBcbn0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgQ2x1c3Rlck1hcCB9IGZyb20gJy4vY2x1c3Rlci1tYXAnO1xuaW1wb3J0IHsgTWFwQ29tcG9uZW50IH0gZnJvbSAnLi9tYXAuY29tcG9uZW50JztcbmltcG9ydCB7XG4gIENsdXN0ZXJNYXBDb25maWcsXG4gIENsdXN0ZXJTaXplLFxuICBNQVBfREVGQVVMVF9DT05GSUcsXG4gIE1BUF9USUxFX0xBWUVSLFxuICBQb3NpdGlvbk1hbmFnZWRPYmplY3Rcbn0gZnJvbSAnLi9tYXAubW9kZWwnO1xuaW1wb3J0IHsgTWFwU2VydmljZSB9IGZyb20gJy4vbWFwLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjOHktY2x1c3Rlci1tYXAnLFxuICB0ZW1wbGF0ZVVybDogJy4vY2x1c3Rlci1tYXAuY29tcG9uZW50Lmh0bWwnLFxuICBwcm92aWRlcnM6IFtNYW5hZ2VkT2JqZWN0UmVhbHRpbWVTZXJ2aWNlXVxufSlcbmV4cG9ydCBjbGFzcyBDbHVzdGVyTWFwQ29tcG9uZW50IGV4dGVuZHMgTWFwQ29tcG9uZW50IHtcbiAgaXNMb2FkaW5nJCA9IG5ldyBCZWhhdmlvclN1YmplY3QoZmFsc2UpO1xuICBtc1VudGlsUmVmcmVzaCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KDUwMDApO1xuXG4gIEBJbnB1dCgpXG4gIGNvbmZpZzogQ2x1c3Rlck1hcENvbmZpZztcblxuICBASW5wdXQoKVxuICByb290Tm9kZTogSU1hbmFnZWRPYmplY3Q7XG5cbiAgQElucHV0KCdhc3NldCcpXG4gIGFzc2V0czogUG9zaXRpb25NYW5hZ2VkT2JqZWN0O1xuXG4gIEBJbnB1dCgpXG4gIHNob3dDbHVzdGVyQ29sb3IgPSBmYWxzZTtcblxuICBAT3V0cHV0KClcbiAgbWFwQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxMLkxlYWZsZXRFdmVudD4oKTtcblxuICBwcml2YXRlIHJlbG9hZFRyaWdnZXIkID0gbmV3IEJlaGF2aW9yU3ViamVjdChmYWxzZSk7XG4gIHByaXZhdGUgY2x1c3RlcnM6IENsdXN0ZXJNYXBbXSA9IFtdO1xuICBwcml2YXRlIHJlYWRvbmx5IE1JTl9JTlRFUlZBTCA9IDUwMDA7XG4gIHByaXZhdGUgcmVhZG9ubHkgRVZFTlRfVEhST1RUTEVfVElNRSA9IDc1MDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgbW9SZWFsdGltZVNlcnZpY2U6IE1hbmFnZWRPYmplY3RSZWFsdGltZVNlcnZpY2UsXG4gICAgcHJvdGVjdGVkIG1hcFNlcnZpY2U6IE1hcFNlcnZpY2UsXG4gICAgQEluamVjdChNQVBfVElMRV9MQVlFUikgcHJvdGVjdGVkIGxheWVycyQ6IEJlaGF2aW9yU3ViamVjdDxNYXBUaWxlTGF5ZXJbXT4sXG4gICAgQEluamVjdChNQVBfREVGQVVMVF9DT05GSUcpXG4gICAgcHJvdGVjdGVkIGRlZmF1bHRDb25maWckOiBPYnNlcnZhYmxlPE1hcERlZmF1bHRDb25maWc+LFxuICAgIHByb3RlY3RlZCB0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgaXRlcmFibGU6IEl0ZXJhYmxlRGlmZmVycyxcbiAgICBwcml2YXRlIGNvbG9yU2VydmljZTogQ29sb3JTZXJ2aWNlXG4gICkge1xuICAgIHN1cGVyKG1vUmVhbHRpbWVTZXJ2aWNlLCBtYXBTZXJ2aWNlLCBsYXllcnMkLCBkZWZhdWx0Q29uZmlnJCwgdHJhbnNsYXRlU2VydmljZSk7XG4gIH1cblxuICBhc3luYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgaWYgKGNoYW5nZXMuY29uZmlnPy5maXJzdENoYW5nZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChjaGFuZ2VzLnJvb3ROb2RlPy5wcmV2aW91c1ZhbHVlICE9PSBjaGFuZ2VzLnJvb3ROb2RlPy5jdXJyZW50VmFsdWUpIHtcbiAgICAgIHRoaXMuY2hhbmdlUm9vdE5vZGUoY2hhbmdlcy5yb290Tm9kZS5jdXJyZW50VmFsdWUpO1xuICAgIH1cblxuICAgIGlmIChjaGFuZ2VzLmNvbmZpZz8uY3VycmVudFZhbHVlKSB7XG4gICAgICB0aGlzLmNoYW5nZUNvbmZpZyhjaGFuZ2VzLmNvbmZpZyk7XG4gICAgfVxuICB9XG5cbiAgY2hhbmdlQ29uZmlnKGNoYW5nZTogU2ltcGxlQ2hhbmdlKSB7XG4gICAgLy8gb24gZm9sbG93aW5nLCBjYW5jZWwgcmVsb2FkIHRvIGF2b2lkIHN0YWxlIHN0YXRlXG4gICAgaWYgKGNoYW5nZS5jdXJyZW50VmFsdWUuZm9sbG93ID09PSB0cnVlKSB7XG4gICAgICB0aGlzLmNhbmNlbFJlbG9hZCgpO1xuICAgICAgdGhpcy5pc0xvYWRpbmckLm5leHQoZmFsc2UpO1xuICAgIH1cblxuICAgIGlmIChjaGFuZ2UuY3VycmVudFZhbHVlLnJlZnJlc2hJbnRlcnZhbCAhPT0gY2hhbmdlLnByZXZpb3VzVmFsdWUucmVmcmVzaEludGVydmFsKSB7XG4gICAgICB0aGlzLnJlbG9hZCgpO1xuICAgIH1cbiAgICBzdXBlci5jaGFuZ2VDb25maWcoY2hhbmdlKTtcbiAgfVxuXG4gIGFzeW5jIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICBpZiAoIXRoaXMubGVhZmxldCkge1xuICAgICAgdGhpcy5sZWFmbGV0ID0gYXdhaXQgdGhpcy5tYXBTZXJ2aWNlLmdldExlYWZsZXQoKTtcbiAgICB9XG4gICAgY29tYmluZUxhdGVzdChbdGhpcy5sYXllcnMkLCB0aGlzLmRlZmF1bHRDb25maWckXSlcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgIC5zdWJzY3JpYmUoKFtsYXllcnMsIGRlZmF1bHRDb25maWddKSA9PiB7XG4gICAgICAgIHRoaXMuaW5pdE1hcChsYXllcnMsIGRlZmF1bHRDb25maWcpO1xuICAgICAgICB0aGlzLmNoYW5nZVJvb3ROb2RlKHRoaXMucm9vdE5vZGUpO1xuICAgICAgICB0aGlzLmNoYW5nZUNvbmZpZyhuZXcgU2ltcGxlQ2hhbmdlKHt9LCB0aGlzLmNvbmZpZywgZmFsc2UpKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgcmVzZXQoKSB7XG4gICAgdGhpcy5uZ09uRGVzdHJveSgpO1xuICAgIGF3YWl0IHRoaXMubmdBZnRlclZpZXdJbml0KCk7XG4gIH1cblxuICByZWxvYWQoKSB7XG4gICAgdGhpcy5yZWxvYWRUcmlnZ2VyJC5uZXh0KHRydWUpO1xuICB9XG5cbiAgY2FuY2VsUmVsb2FkKCkge1xuICAgIHRoaXMucmVsb2FkVHJpZ2dlciQubmV4dChmYWxzZSk7XG4gIH1cblxuICBsaXN0ZW5Ub0NsdXN0ZXJDaGFuZ2VzKCkge1xuICAgIGNvbnN0IHRpbWVyU3RhcnQkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgICBjb25zdCB0aW1lckVuZCQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gICAgY29uc3QgZG9jdW1lbnRIaWRkZW5FdmVudCQgPSBmcm9tRXZlbnQ8Ym9vbGVhbj4oZG9jdW1lbnQsICd2aXNpYmlsaXR5Y2hhbmdlJykucGlwZShcbiAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKVxuICAgICk7XG5cbiAgICBjb25zdCBpbnRlcnZhbCQgPSB0aW1lclN0YXJ0JC5waXBlKFxuICAgICAgbWFwKCgpID0+IHRoaXMuY29uZmlnLnJlZnJlc2hJbnRlcnZhbCksXG4gICAgICBzd2l0Y2hNYXAoY29uZmlnSW50ZXJ2YWwgPT4ge1xuICAgICAgICBpZiAoIWNvbmZpZ0ludGVydmFsKSB7XG4gICAgICAgICAgcmV0dXJuIE5FVkVSO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpbnRlcnZhbCgxMDAwKS5waXBlKFxuICAgICAgICAgIG1hcCh2YWx1ZSA9PiB2YWx1ZSAqIDEwMDApLFxuICAgICAgICAgIHRhcCh2YWx1ZSA9PiB0aGlzLm1zVW50aWxSZWZyZXNoJC5uZXh0KGNvbmZpZ0ludGVydmFsIC0gdmFsdWUpKSxcbiAgICAgICAgICBmaWx0ZXIodmFsdWUgPT4gdmFsdWUgPj0gdGhpcy5NSU5fSU5URVJWQUwgJiYgdmFsdWUgPj0gY29uZmlnSW50ZXJ2YWwpLFxuICAgICAgICAgIGZpcnN0KCksXG4gICAgICAgICAgdGFrZVVudGlsKHRpbWVyRW5kJClcbiAgICAgICAgKTtcbiAgICAgIH0pLFxuICAgICAgc3dpdGNoTWFwKCgpID0+IChkb2N1bWVudC5oaWRkZW4gPyBkb2N1bWVudEhpZGRlbkV2ZW50JCA6IG9mKHRydWUpKSksXG4gICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JClcbiAgICApO1xuXG4gICAgY29uc3QgbWFwQ2hhbmdlJCA9IG1lcmdlKFxuICAgICAgZnJvbUV2ZW50PEwuTGVhZmxldEV2ZW50Pih0aGlzLm1hcCwgJ21vdmUnKSxcbiAgICAgIGZyb21FdmVudDxMLkxlYWZsZXRFdmVudD4odGhpcy5tYXAsICdtb3ZlZW5kJylcbiAgICApLnBpcGUoXG4gICAgICBkZWJvdW5jZVRpbWUodGhpcy5FVkVOVF9USFJPVFRMRV9USU1FKSxcbiAgICAgIHRhcChldmVudCA9PiB0aGlzLm1hcENoYW5nZS5lbWl0KGV2ZW50KSksXG4gICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JClcbiAgICApO1xuXG4gICAgbWVyZ2UodGhpcy5yZWxvYWRUcmlnZ2VyJCwgbWFwQ2hhbmdlJCwgaW50ZXJ2YWwkKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRhcCgoKSA9PiB7XG4gICAgICAgICAgdGltZXJFbmQkLm5leHQoKTtcbiAgICAgICAgICB0aGlzLm1zVW50aWxSZWZyZXNoJC5uZXh0KDApO1xuICAgICAgICAgIHRoaXMuaXNMb2FkaW5nJC5uZXh0KHRydWUpO1xuICAgICAgICB9KSxcbiAgICAgICAgc3dpdGNoTWFwKHZhbHVlID0+XG4gICAgICAgICAgdmFsdWUgPT09IGZhbHNlXG4gICAgICAgICAgICA/IG9mKFtdKVxuICAgICAgICAgICAgOiBmcm9tKHRoaXMubWFwU2VydmljZS5nZXRDbHVzdGVyU2l6ZSh0aGlzLm1hcC5nZXRCb3VuZHMoKSkpLnBpcGUoXG4gICAgICAgICAgICAgICAgbWVyZ2VNYXAoKGNsdXN0ZXJTaXplOiBDbHVzdGVyU2l6ZSkgPT5cbiAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0Q2x1c3RlclJlY3RzKGNsdXN0ZXJTaXplLCB0aGlzLm1hcC5nZXRCb3VuZHMoKSlcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIG1lcmdlTWFwKHJlY3RzID0+IHRoaXMuY3JlYXRlT3JVcGRhdGVDbHVzdGVyKHJlY3RzKSlcbiAgICAgICAgICAgICAgKVxuICAgICAgICApLFxuICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JClcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKGNsdXN0ZXJzOiBDbHVzdGVyTWFwW10pID0+IHtcbiAgICAgICAgY2x1c3RlcnMuZm9yRWFjaChjbHVzdGVyID0+IGNsdXN0ZXIucmVuZGVyKHRoaXMubWFwKSk7XG5cbiAgICAgICAgdGhpcy5pc0xvYWRpbmckLm5leHQoZmFsc2UpO1xuICAgICAgICB0aW1lclN0YXJ0JC5uZXh0KCk7XG4gICAgICAgIHRoaXMubXNVbnRpbFJlZnJlc2gkLm5leHQodGhpcy5jb25maWcucmVmcmVzaEludGVydmFsKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcmVmcmVzaE1hcmtlcnMoKSB7XG4gICAgaWYgKHRoaXMuYXNzZXRzKSB7XG4gICAgICBzdXBlci5yZWZyZXNoTWFya2VycygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmNsdXN0ZXJzLmZvckVhY2goY2x1c3RlciA9PiB7XG4gICAgICBjbHVzdGVyLmNsZWFyKHRoaXMubWFwKTtcbiAgICB9KTtcbiAgICB0aGlzLnJlbG9hZCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGFuZ2VSb290Tm9kZShtbzogSU1hbmFnZWRPYmplY3QpIHtcbiAgICB0aGlzLnVuc3Vic2NyaWJlQWxsTGlzdGVuZXJzKCk7XG4gICAgdGhpcy5jbGVhck1hcmtlcnMoKTtcbiAgICB0aGlzLmNsZWFyQ2x1c3RlcnMoKTtcblxuICAgIGNvbnN0IGlzUG9zaXRpb25EZXZpY2UgPSBtbz8uYzh5X1Bvc2l0aW9uICYmIG1vPy5jOHlfSXNEZXZpY2U7XG4gICAgaWYgKGlzUG9zaXRpb25EZXZpY2UpIHtcbiAgICAgIHRoaXMuYXNzZXRzID0gbW8gYXMgUG9zaXRpb25NYW5hZ2VkT2JqZWN0O1xuICAgICAgdGhpcy5yZWZyZXNoTWFya2VycygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmFzc2V0cyA9IG51bGw7XG4gICAgdGhpcy5saXN0ZW5Ub0NsdXN0ZXJDaGFuZ2VzKCk7XG4gICAgdGhpcy5yZWxvYWQoKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2V0Q2x1c3RlclJlY3RzKFxuICAgIGxldmVsVGhyZXNob2xkOiBDbHVzdGVyU2l6ZSA9IENsdXN0ZXJTaXplLkZPVVIsXG4gICAgdmlld0JvdW5kczogTC5MYXRMbmdCb3VuZHMsXG4gICAgbGV2ZWwgPSAwXG4gICk6IFByb21pc2U8TC5SZWN0YW5nbGVbXT4ge1xuICAgIGxldCByZWN0cyA9IFtdO1xuXG4gICAgaWYgKGxldmVsVGhyZXNob2xkID09PSBDbHVzdGVyU2l6ZS5OT05FKSB7XG4gICAgICBjb25zdCByZWN0ID0gYXdhaXQgdGhpcy5nZXRSZWN0KHZpZXdCb3VuZHMpO1xuICAgICAgcmVjdHMucHVzaChyZWN0KTtcbiAgICAgIHJldHVybiByZWN0cztcbiAgICB9XG5cbiAgICBpZiAobGV2ZWwgPj0gbGV2ZWxUaHJlc2hvbGQpIHtcbiAgICAgIHJldHVybiByZWN0cztcbiAgICB9XG4gICAgbGV2ZWwrKztcblxuICAgIGNvbnN0IHsgbGF0OiB4MSwgbG5nOiB5MSB9ID0gdmlld0JvdW5kcy5nZXRTb3V0aFdlc3QoKTtcbiAgICBjb25zdCB7IGxhdDogeDIsIGxuZzogeTIgfSA9IHZpZXdCb3VuZHMuZ2V0Tm9ydGhFYXN0KCk7XG4gICAgY29uc3QgbmV3WDIgPSAoeDEgKyB4MikgLyAyO1xuICAgIGNvbnN0IG5ld1kyID0gKHkxICsgeTIpIC8gMjtcblxuICAgIGNvbnN0IGJvdW5kczogW1tudW1iZXIsIG51bWJlcl0sIFtudW1iZXIsIG51bWJlcl1dW10gPSBbXG4gICAgICBbXG4gICAgICAgIFt4MSwgeTFdLFxuICAgICAgICBbbmV3WDIsIG5ld1kyXVxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgW25ld1gyLCBuZXdZMl0sXG4gICAgICAgIFt4MiwgeTJdXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICBbeDEsIG5ld1kyXSxcbiAgICAgICAgW25ld1gyLCB5Ml1cbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgIFtuZXdYMiwgeTFdLFxuICAgICAgICBbeDIsIG5ld1kyXVxuICAgICAgXVxuICAgIF07XG4gICAgZm9yIChjb25zdCBib3VuZCBvZiBib3VuZHMpIHtcbiAgICAgIGNvbnN0IGxhdExuZ0JvdW5kID0gdGhpcy5sZWFmbGV0LmxhdExuZ0JvdW5kcyhib3VuZCk7XG4gICAgICBjb25zdCByZWN0ID0gYXdhaXQgdGhpcy5nZXRSZWN0KGxhdExuZ0JvdW5kKTtcbiAgICAgIHJlY3RzID0gWy4uLnJlY3RzLCAuLi4oYXdhaXQgdGhpcy5nZXRDbHVzdGVyUmVjdHMobGV2ZWxUaHJlc2hvbGQsIGxhdExuZ0JvdW5kLCBsZXZlbCkpXTtcblxuICAgICAgaWYgKGxldmVsID09PSBsZXZlbFRocmVzaG9sZCkge1xuICAgICAgICByZWN0cy5wdXNoKHJlY3QpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZWN0cztcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2V0UmVjdChsYXRMbmdCb3VuZDogTC5MYXRMbmdCb3VuZHMpIHtcbiAgICBsZXQgY29sb3IgPSAnbm9uZSc7XG4gICAgaWYgKHRoaXMuc2hvd0NsdXN0ZXJDb2xvcikge1xuICAgICAgY29sb3IgPSBhd2FpdCB0aGlzLmNvbG9yU2VydmljZS5nZW5lcmF0ZUNvbG9yKGxhdExuZ0JvdW5kLnRvQkJveFN0cmluZygpKTtcbiAgICB9XG4gICAgY29uc3QgcmVjdCA9IHRoaXMubGVhZmxldC5yZWN0YW5nbGUobGF0TG5nQm91bmQsIHtcbiAgICAgIGNvbG9yLFxuICAgICAgd2VpZ2h0OiBjb2xvciA9PT0gJ25vbmUnID8gMCA6IDEsXG4gICAgICBpbnRlcmFjdGl2ZTogZmFsc2VcbiAgICB9KTtcbiAgICByZXR1cm4gcmVjdDtcbiAgfVxuXG4gIHByaXZhdGUgY2xlYXJDbHVzdGVycygpIHtcbiAgICB0aGlzLmNsdXN0ZXJzLmZvckVhY2goY2x1c3RlciA9PiB7XG4gICAgICBjbHVzdGVyLmNsZWFyKHRoaXMubWFwKTtcbiAgICB9KTtcbiAgICB0aGlzLmNsdXN0ZXJzID0gW107XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHVwZGF0ZUNsdXN0ZXIoY2x1c3RlcjogQ2x1c3Rlck1hcCkge1xuICAgIGNvbnN0IGNsdXN0ZXJDb3VudCA9IGF3YWl0IHRoaXMubWFwU2VydmljZS5nZXRQb3NpdGlvbk1Pc0Zyb21Cb3VuZENvdW50KFxuICAgICAgY2x1c3Rlci5yZWN0LmdldEJvdW5kcygpLFxuICAgICAgdGhpcy5yb290Tm9kZVxuICAgICk7XG4gICAgaWYgKGNsdXN0ZXJDb3VudCA+IHRoaXMubWFwU2VydmljZS5NQVhfREVWSUNFX1BFUl9DTFVTVEVSKSB7XG4gICAgICBjbHVzdGVyLnNldENsdXN0ZXJUb0JpZ01hcmtlcih0aGlzLm1hcCwgY2x1c3RlckNvdW50LCB0aGlzLmxlYWZsZXQpO1xuICAgICAgY2x1c3Rlci5wb3NpdGlvbnMgPSBbXTtcbiAgICAgIHJldHVybiBjbHVzdGVyO1xuICAgIH1cblxuICAgIGNsdXN0ZXIucmVtb3ZlQ2x1c3RlclRvQmlnTWFya2VyKCk7XG4gICAgY2x1c3Rlci5wb3NpdGlvbnMgPSBhd2FpdCB0aGlzLm1hcFNlcnZpY2UuZ2V0UG9zaXRpb25NT3NGcm9tQm91bmQoXG4gICAgICBjbHVzdGVyLnJlY3QuZ2V0Qm91bmRzKCksXG4gICAgICB0aGlzLnJvb3ROb2RlXG4gICAgKTtcbiAgICByZXR1cm4gY2x1c3RlcjtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlT3JVcGRhdGVDbHVzdGVyKHJlY3RzOiBMLlJlY3RhbmdsZTx1bmtub3duPltdKSB7XG4gICAgY29uc3QgaXNOZXcgPSByZWN0cy5sZW5ndGggIT09IHRoaXMuY2x1c3RlcnMubGVuZ3RoO1xuICAgIGlmIChpc05ldykge1xuICAgICAgdGhpcy5jbGVhckNsdXN0ZXJzKCk7XG4gICAgfVxuICAgIGNvbnN0IHVwZGF0ZVByb21pc2UgPSByZWN0cy5tYXAoKHJlY3QsIGluZGV4KSA9PiB7XG4gICAgICBpZiAoaXNOZXcpIHtcbiAgICAgICAgY29uc3QgY2x1c3RlciA9IG5ldyBDbHVzdGVyTWFwKFxuICAgICAgICAgIHRoaXMuaXRlcmFibGUsXG4gICAgICAgICAgYXNzZXQgPT4gdGhpcy5nZXRBc3NldE1hcmtlcihhc3NldCksXG4gICAgICAgICAgdGhpcy50cmFuc2xhdGVTZXJ2aWNlXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuY2x1c3RlcnMucHVzaChjbHVzdGVyKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY2x1c3RlcnNbaW5kZXhdLnJlY3QgPSByZWN0O1xuICAgICAgcmV0dXJuIHRoaXMudXBkYXRlQ2x1c3Rlcih0aGlzLmNsdXN0ZXJzW2luZGV4XSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gUHJvbWlzZS5hbGwodXBkYXRlUHJvbWlzZSk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJjOHktbWFwXCI+XG4gIDxkaXYgI21hcD48L2Rpdj5cbjwvZGl2PlxuPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuIl19
239
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2x1c3Rlci1tYXAuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vbWFwL2NsdXN0ZXItbWFwLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uL21hcC9jbHVzdGVyLW1hcC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUNMLGVBQWUsRUFDZixNQUFNLEVBQ04sWUFBWSxFQUViLE1BQU0sZUFBZSxDQUFDO0FBR3ZCLE9BQU8sRUFDTCxZQUFZLEVBQ1osUUFBUSxFQUNSLFVBQVUsRUFDViw0QkFBNEIsRUFDN0IsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUV2RCxPQUFPLEVBQ0wsZUFBZSxFQUNmLGFBQWEsRUFDYixJQUFJLEVBQ0osU0FBUyxFQUNULFFBQVEsRUFDUixLQUFLLEVBQ0wsS0FBSyxFQUNMLFVBQVUsRUFDVixFQUFFLEVBQ0YsT0FBTyxFQUNSLE1BQU0sTUFBTSxDQUFDO0FBQ2QsT0FBTyxFQUNMLFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUNMLEdBQUcsRUFDSCxRQUFRLEVBQ1IsU0FBUyxFQUNULFNBQVMsRUFDVCxHQUFHLEVBQ0osTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBRUwsV0FBVyxFQUNYLGtCQUFrQixFQUNsQixjQUFjLEVBRWYsTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7Ozs7O0FBTzNDLE1BQU0sT0FBTyxtQkFBb0IsU0FBUSxZQUFZO0lBd0JuRCxZQUNZLGlCQUErQyxFQUMvQyxVQUFz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LDRCQUE0QixDQUFDLHNFQ3hEM0Msa0ZBSUE7OzRGRHNEYSxtQkFBbUI7a0JBTC9CLFNBQVM7K0JBQ0UsaUJBQWlCLGFBRWhCLENBQUMsNEJBQTRCLENBQUM7OzBCQTZCdEMsTUFBTTsyQkFBQyxjQUFjOzswQkFDckIsTUFBTTsyQkFBQyxrQkFBa0I7b0xBdkI1QixNQUFNO3NCQURMLEtBQUs7Z0JBSU4sUUFBUTtzQkFEUCxLQUFLO2dCQUlOLE1BQU07c0JBREwsS0FBSzt1QkFBQyxPQUFPO2dCQUlkLGdCQUFnQjtzQkFEZixLQUFLO2dCQUlOLFNBQVM7c0JBRFIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbmplY3QsXG4gIElucHV0LFxuICBJdGVyYWJsZURpZmZlcnMsXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlLFxuICBTaW1wbGVDaGFuZ2VzXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSU1hbmFnZWRPYmplY3QgfSBmcm9tICdAYzh5L2NsaWVudCc7XG5pbXBvcnQgdHlwZSB7IE1hcERlZmF1bHRDb25maWcsIE1hcFRpbGVMYXllciB9IGZyb20gJ0BjOHkvZGV2a2l0L29wdGlvbnMnO1xuaW1wb3J0IHtcbiAgQ29sb3JTZXJ2aWNlLFxuICBEYXRlUGlwZSxcbiAgR2VvU2VydmljZSxcbiAgTWFuYWdlZE9iamVjdFJlYWx0aW1lU2VydmljZVxufSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB0eXBlICogYXMgTCBmcm9tICdsZWFmbGV0JztcbmltcG9ydCB7XG4gIEJlaGF2aW9yU3ViamVjdCxcbiAgY29tYmluZUxhdGVzdCxcbiAgZnJvbSxcbiAgZnJvbUV2ZW50LFxuICBpbnRlcnZhbCxcbiAgbWVyZ2UsXG4gIE5FVkVSLFxuICBPYnNlcnZhYmxlLFxuICBvZixcbiAgU3ViamVjdFxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIGRlYm91bmNlVGltZSxcbiAgZmlsdGVyLFxuICBmaXJzdCxcbiAgbWFwLFxuICBtZXJnZU1hcCxcbiAgc3dpdGNoTWFwLFxuICB0YWtlVW50aWwsXG4gIHRhcFxufSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBDbHVzdGVyTWFwIH0gZnJvbSAnLi9jbHVzdGVyLW1hcCc7XG5pbXBvcnQgeyBNYXBDb21wb25lbnQgfSBmcm9tICcuL21hcC5jb21wb25lbnQnO1xuaW1wb3J0IHtcbiAgQ2x1c3Rlck1hcENvbmZpZyxcbiAgQ2x1c3RlclNpemUsXG4gIE1BUF9ERUZBVUxUX0NPTkZJRyxcbiAgTUFQX1RJTEVfTEFZRVIsXG4gIFBvc2l0aW9uTWFuYWdlZE9iamVjdFxufSBmcm9tICcuL21hcC5tb2RlbCc7XG5pbXBvcnQgeyBNYXBTZXJ2aWNlIH0gZnJvbSAnLi9tYXAuc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2M4eS1jbHVzdGVyLW1hcCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9jbHVzdGVyLW1hcC5jb21wb25lbnQuaHRtbCcsXG4gIHByb3ZpZGVyczogW01hbmFnZWRPYmplY3RSZWFsdGltZVNlcnZpY2VdXG59KVxuZXhwb3J0IGNsYXNzIENsdXN0ZXJNYXBDb21wb25lbnQgZXh0ZW5kcyBNYXBDb21wb25lbnQge1xuICBpc0xvYWRpbmckID0gbmV3IEJlaGF2aW9yU3ViamVjdChmYWxzZSk7XG4gIG1zVW50aWxSZWZyZXNoJCA9IG5ldyBCZWhhdmlvclN1YmplY3QoNTAwMCk7XG5cbiAgQElucHV0KClcbiAgY29uZmlnOiBDbHVzdGVyTWFwQ29uZmlnO1xuXG4gIEBJbnB1dCgpXG4gIHJvb3ROb2RlOiBJTWFuYWdlZE9iamVjdDtcblxuICBASW5wdXQoJ2Fzc2V0JylcbiAgYXNzZXRzOiBQb3NpdGlvbk1hbmFnZWRPYmplY3Q7XG5cbiAgQElucHV0KClcbiAgc2hvd0NsdXN0ZXJDb2xvciA9IGZhbHNlO1xuXG4gIEBPdXRwdXQoKVxuICBtYXBDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPEwuTGVhZmxldEV2ZW50PigpO1xuXG4gIHByaXZhdGUgcmVsb2FkVHJpZ2dlciQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KGZhbHNlKTtcbiAgcHJpdmF0ZSBjbHVzdGVyczogQ2x1c3Rlck1hcFtdID0gW107XG4gIHByaXZhdGUgcmVhZG9ubHkgTUlOX0lOVEVSVkFMID0gNTAwMDtcbiAgcHJpdmF0ZSByZWFkb25seSBFVkVOVF9USFJPVFRMRV9USU1FID0gNzUwO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBtb1JlYWx0aW1lU2VydmljZTogTWFuYWdlZE9iamVjdFJlYWx0aW1lU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgbWFwU2VydmljZTogTWFwU2VydmljZSxcbiAgICBASW5qZWN0KE1BUF9USUxFX0xBWUVSKSBwcm90ZWN0ZWQgbGF5ZXJzJDogQmVoYXZpb3JTdWJqZWN0PE1hcFRpbGVMYXllcltdPixcbiAgICBASW5qZWN0KE1BUF9ERUZBVUxUX0NPTkZJRylcbiAgICBwcm90ZWN0ZWQgZGVmYXVsdENvbmZpZyQ6IE9ic2VydmFibGU8TWFwRGVmYXVsdENvbmZpZz4sXG4gICAgcHJvdGVjdGVkIHRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBpdGVyYWJsZTogSXRlcmFibGVEaWZmZXJzLFxuICAgIHByaXZhdGUgY29sb3JTZXJ2aWNlOiBDb2xvclNlcnZpY2UsXG4gICAgZ2VvOiBHZW9TZXJ2aWNlLFxuICAgIGRhdGVQaXBlOiBEYXRlUGlwZVxuICApIHtcbiAgICBzdXBlcihtb1JlYWx0aW1lU2VydmljZSwgbWFwU2VydmljZSwgbGF5ZXJzJCwgZGVmYXVsdENvbmZpZyQsIHRyYW5zbGF0ZVNlcnZpY2UsIGdlbywgZGF0ZVBpcGUpO1xuICB9XG5cbiAgYXN5bmMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGlmIChjaGFuZ2VzLmNvbmZpZz8uZmlyc3RDaGFuZ2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlcy5yb290Tm9kZT8ucHJldmlvdXNWYWx1ZSAhPT0gY2hhbmdlcy5yb290Tm9kZT8uY3VycmVudFZhbHVlKSB7XG4gICAgICB0aGlzLmNoYW5nZVJvb3ROb2RlKGNoYW5nZXMucm9vdE5vZGUuY3VycmVudFZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlcy5jb25maWc/LmN1cnJlbnRWYWx1ZSkge1xuICAgICAgdGhpcy5jaGFuZ2VDb25maWcoY2hhbmdlcy5jb25maWcpO1xuICAgIH1cbiAgfVxuXG4gIGNoYW5nZUNvbmZpZyhjaGFuZ2U6IFNpbXBsZUNoYW5nZSkge1xuICAgIC8vIG9uIGZvbGxvd2luZywgY2FuY2VsIHJlbG9hZCB0byBhdm9pZCBzdGFsZSBzdGF0ZVxuICAgIGlmIChjaGFuZ2UuY3VycmVudFZhbHVlLmZvbGxvdyA9PT0gdHJ1ZSkge1xuICAgICAgdGhpcy5jYW5jZWxSZWxvYWQoKTtcbiAgICAgIHRoaXMuaXNMb2FkaW5nJC5uZXh0KGZhbHNlKTtcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlLmN1cnJlbnRWYWx1ZS5yZWZyZXNoSW50ZXJ2YWwgIT09IGNoYW5nZS5wcmV2aW91c1ZhbHVlLnJlZnJlc2hJbnRlcnZhbCkge1xuICAgICAgdGhpcy5yZWxvYWQoKTtcbiAgICB9XG4gICAgc3VwZXIuY2hhbmdlQ29uZmlnKGNoYW5nZSk7XG4gIH1cblxuICBhc3luYyBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgaWYgKCF0aGlzLmxlYWZsZXQpIHtcbiAgICAgIHRoaXMubGVhZmxldCA9IGF3YWl0IHRoaXMubWFwU2VydmljZS5nZXRMZWFmbGV0KCk7XG4gICAgfVxuICAgIGNvbWJpbmVMYXRlc3QoW3RoaXMubGF5ZXJzJCwgdGhpcy5kZWZhdWx0Q29uZmlnJF0pXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAuc3Vic2NyaWJlKChbbGF5ZXJzLCBkZWZhdWx0Q29uZmlnXSkgPT4ge1xuICAgICAgICB0aGlzLmluaXRNYXAobGF5ZXJzLCBkZWZhdWx0Q29uZmlnKTtcbiAgICAgICAgdGhpcy5jaGFuZ2VSb290Tm9kZSh0aGlzLnJvb3ROb2RlKTtcbiAgICAgICAgdGhpcy5jaGFuZ2VDb25maWcobmV3IFNpbXBsZUNoYW5nZSh7fSwgdGhpcy5jb25maWcsIGZhbHNlKSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHJlc2V0KCkge1xuICAgIHRoaXMubmdPbkRlc3Ryb3koKTtcbiAgICBhd2FpdCB0aGlzLm5nQWZ0ZXJWaWV3SW5pdCgpO1xuICB9XG5cbiAgcmVsb2FkKCkge1xuICAgIHRoaXMucmVsb2FkVHJpZ2dlciQubmV4dCh0cnVlKTtcbiAgfVxuXG4gIGNhbmNlbFJlbG9hZCgpIHtcbiAgICB0aGlzLnJlbG9hZFRyaWdnZXIkLm5leHQoZmFsc2UpO1xuICB9XG5cbiAgbGlzdGVuVG9DbHVzdGVyQ2hhbmdlcygpIHtcbiAgICBjb25zdCB0aW1lclN0YXJ0JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gICAgY29uc3QgdGltZXJFbmQkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAgIGNvbnN0IGRvY3VtZW50SGlkZGVuRXZlbnQkID0gZnJvbUV2ZW50PGJvb2xlYW4+KGRvY3VtZW50LCAndmlzaWJpbGl0eWNoYW5nZScpLnBpcGUoXG4gICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JClcbiAgICApO1xuXG4gICAgY29uc3QgaW50ZXJ2YWwkID0gdGltZXJTdGFydCQucGlwZShcbiAgICAgIG1hcCgoKSA9PiB0aGlzLmNvbmZpZy5yZWZyZXNoSW50ZXJ2YWwpLFxuICAgICAgc3dpdGNoTWFwKGNvbmZpZ0ludGVydmFsID0+IHtcbiAgICAgICAgaWYgKCFjb25maWdJbnRlcnZhbCkge1xuICAgICAgICAgIHJldHVybiBORVZFUjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW50ZXJ2YWwoMTAwMCkucGlwZShcbiAgICAgICAgICBtYXAodmFsdWUgPT4gdmFsdWUgKiAxMDAwKSxcbiAgICAgICAgICB0YXAodmFsdWUgPT4gdGhpcy5tc1VudGlsUmVmcmVzaCQubmV4dChjb25maWdJbnRlcnZhbCAtIHZhbHVlKSksXG4gICAgICAgICAgZmlsdGVyKHZhbHVlID0+IHZhbHVlID49IHRoaXMuTUlOX0lOVEVSVkFMICYmIHZhbHVlID49IGNvbmZpZ0ludGVydmFsKSxcbiAgICAgICAgICBmaXJzdCgpLFxuICAgICAgICAgIHRha2VVbnRpbCh0aW1lckVuZCQpXG4gICAgICAgICk7XG4gICAgICB9KSxcbiAgICAgIHN3aXRjaE1hcCgoKSA9PiAoZG9jdW1lbnQuaGlkZGVuID8gZG9jdW1lbnRIaWRkZW5FdmVudCQgOiBvZih0cnVlKSkpLFxuICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpXG4gICAgKTtcblxuICAgIGNvbnN0IG1hcENoYW5nZSQgPSBtZXJnZShcbiAgICAgIGZyb21FdmVudDxMLkxlYWZsZXRFdmVudD4odGhpcy5tYXAsICdtb3ZlJyksXG4gICAgICBmcm9tRXZlbnQ8TC5MZWFmbGV0RXZlbnQ+KHRoaXMubWFwLCAnbW92ZWVuZCcpXG4gICAgKS5waXBlKFxuICAgICAgZGVib3VuY2VUaW1lKHRoaXMuRVZFTlRfVEhST1RUTEVfVElNRSksXG4gICAgICB0YXAoZXZlbnQgPT4gdGhpcy5tYXBDaGFuZ2UuZW1pdChldmVudCkpLFxuICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpXG4gICAgKTtcblxuICAgIG1lcmdlKHRoaXMucmVsb2FkVHJpZ2dlciQsIG1hcENoYW5nZSQsIGludGVydmFsJClcbiAgICAgIC5waXBlKFxuICAgICAgICB0YXAoKCkgPT4ge1xuICAgICAgICAgIHRpbWVyRW5kJC5uZXh0KCk7XG4gICAgICAgICAgdGhpcy5tc1VudGlsUmVmcmVzaCQubmV4dCgwKTtcbiAgICAgICAgICB0aGlzLmlzTG9hZGluZyQubmV4dCh0cnVlKTtcbiAgICAgICAgfSksXG4gICAgICAgIHN3aXRjaE1hcCh2YWx1ZSA9PlxuICAgICAgICAgIHZhbHVlID09PSBmYWxzZVxuICAgICAgICAgICAgPyBvZihbXSlcbiAgICAgICAgICAgIDogZnJvbSh0aGlzLm1hcFNlcnZpY2UuZ2V0Q2x1c3RlclNpemUodGhpcy5tYXAuZ2V0Qm91bmRzKCkpKS5waXBlKFxuICAgICAgICAgICAgICAgIG1lcmdlTWFwKChjbHVzdGVyU2l6ZTogQ2x1c3RlclNpemUpID0+XG4gICAgICAgICAgICAgICAgICB0aGlzLmdldENsdXN0ZXJSZWN0cyhjbHVzdGVyU2l6ZSwgdGhpcy5tYXAuZ2V0Qm91bmRzKCkpXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICBtZXJnZU1hcChyZWN0cyA9PiB0aGlzLmNyZWF0ZU9yVXBkYXRlQ2x1c3RlcihyZWN0cykpXG4gICAgICAgICAgICAgIClcbiAgICAgICAgKSxcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKChjbHVzdGVyczogQ2x1c3Rlck1hcFtdKSA9PiB7XG4gICAgICAgIGNsdXN0ZXJzLmZvckVhY2goY2x1c3RlciA9PiBjbHVzdGVyLnJlbmRlcih0aGlzLm1hcCkpO1xuXG4gICAgICAgIHRoaXMuaXNMb2FkaW5nJC5uZXh0KGZhbHNlKTtcbiAgICAgICAgdGltZXJTdGFydCQubmV4dCgpO1xuICAgICAgICB0aGlzLm1zVW50aWxSZWZyZXNoJC5uZXh0KHRoaXMuY29uZmlnLnJlZnJlc2hJbnRlcnZhbCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHJlZnJlc2hNYXJrZXJzKCkge1xuICAgIGlmICh0aGlzLmFzc2V0cykge1xuICAgICAgc3VwZXIucmVmcmVzaE1hcmtlcnMoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5jbHVzdGVycy5mb3JFYWNoKGNsdXN0ZXIgPT4ge1xuICAgICAgY2x1c3Rlci5jbGVhcih0aGlzLm1hcCk7XG4gICAgfSk7XG4gICAgdGhpcy5yZWxvYWQoKTtcbiAgfVxuXG4gIHByaXZhdGUgY2hhbmdlUm9vdE5vZGUobW86IElNYW5hZ2VkT2JqZWN0KSB7XG4gICAgdGhpcy51bnN1YnNjcmliZUFsbExpc3RlbmVycygpO1xuICAgIHRoaXMuY2xlYXJNYXJrZXJzKCk7XG4gICAgdGhpcy5jbGVhckNsdXN0ZXJzKCk7XG5cbiAgICBjb25zdCBpc1Bvc2l0aW9uRGV2aWNlID0gbW8/LmM4eV9Qb3NpdGlvbiAmJiBtbz8uYzh5X0lzRGV2aWNlO1xuICAgIGlmIChpc1Bvc2l0aW9uRGV2aWNlKSB7XG4gICAgICB0aGlzLmFzc2V0cyA9IG1vIGFzIFBvc2l0aW9uTWFuYWdlZE9iamVjdDtcbiAgICAgIHRoaXMucmVmcmVzaE1hcmtlcnMoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5hc3NldHMgPSBudWxsO1xuICAgIHRoaXMubGlzdGVuVG9DbHVzdGVyQ2hhbmdlcygpO1xuICAgIHRoaXMucmVsb2FkKCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGdldENsdXN0ZXJSZWN0cyhcbiAgICBsZXZlbFRocmVzaG9sZDogQ2x1c3RlclNpemUgPSBDbHVzdGVyU2l6ZS5GT1VSLFxuICAgIHZpZXdCb3VuZHM6IEwuTGF0TG5nQm91bmRzLFxuICAgIGxldmVsID0gMFxuICApOiBQcm9taXNlPEwuUmVjdGFuZ2xlW10+IHtcbiAgICBsZXQgcmVjdHMgPSBbXTtcblxuICAgIGlmIChsZXZlbFRocmVzaG9sZCA9PT0gQ2x1c3RlclNpemUuTk9ORSkge1xuICAgICAgY29uc3QgcmVjdCA9IGF3YWl0IHRoaXMuZ2V0UmVjdCh2aWV3Qm91bmRzKTtcbiAgICAgIHJlY3RzLnB1c2gocmVjdCk7XG4gICAgICByZXR1cm4gcmVjdHM7XG4gICAgfVxuXG4gICAgaWYgKGxldmVsID49IGxldmVsVGhyZXNob2xkKSB7XG4gICAgICByZXR1cm4gcmVjdHM7XG4gICAgfVxuICAgIGxldmVsKys7XG5cbiAgICBjb25zdCB7IGxhdDogeDEsIGxuZzogeTEgfSA9IHZpZXdCb3VuZHMuZ2V0U291dGhXZXN0KCk7XG4gICAgY29uc3QgeyBsYXQ6IHgyLCBsbmc6IHkyIH0gPSB2aWV3Qm91bmRzLmdldE5vcnRoRWFzdCgpO1xuICAgIGNvbnN0IG5ld1gyID0gKHgxICsgeDIpIC8gMjtcbiAgICBjb25zdCBuZXdZMiA9ICh5MSArIHkyKSAvIDI7XG5cbiAgICBjb25zdCBib3VuZHM6IFtbbnVtYmVyLCBudW1iZXJdLCBbbnVtYmVyLCBudW1iZXJdXVtdID0gW1xuICAgICAgW1xuICAgICAgICBbeDEsIHkxXSxcbiAgICAgICAgW25ld1gyLCBuZXdZMl1cbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgIFtuZXdYMiwgbmV3WTJdLFxuICAgICAgICBbeDIsIHkyXVxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgW3gxLCBuZXdZMl0sXG4gICAgICAgIFtuZXdYMiwgeTJdXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICBbbmV3WDIsIHkxXSxcbiAgICAgICAgW3gyLCBuZXdZMl1cbiAgICAgIF1cbiAgICBdO1xuICAgIGZvciAoY29uc3QgYm91bmQgb2YgYm91bmRzKSB7XG4gICAgICBjb25zdCBsYXRMbmdCb3VuZCA9IHRoaXMubGVhZmxldC5sYXRMbmdCb3VuZHMoYm91bmQpO1xuICAgICAgY29uc3QgcmVjdCA9IGF3YWl0IHRoaXMuZ2V0UmVjdChsYXRMbmdCb3VuZCk7XG4gICAgICByZWN0cyA9IFsuLi5yZWN0cywgLi4uKGF3YWl0IHRoaXMuZ2V0Q2x1c3RlclJlY3RzKGxldmVsVGhyZXNob2xkLCBsYXRMbmdCb3VuZCwgbGV2ZWwpKV07XG5cbiAgICAgIGlmIChsZXZlbCA9PT0gbGV2ZWxUaHJlc2hvbGQpIHtcbiAgICAgICAgcmVjdHMucHVzaChyZWN0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVjdHM7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGdldFJlY3QobGF0TG5nQm91bmQ6IEwuTGF0TG5nQm91bmRzKSB7XG4gICAgbGV0IGNvbG9yID0gJ25vbmUnO1xuICAgIGlmICh0aGlzLnNob3dDbHVzdGVyQ29sb3IpIHtcbiAgICAgIGNvbG9yID0gYXdhaXQgdGhpcy5jb2xvclNlcnZpY2UuZ2VuZXJhdGVDb2xvcihsYXRMbmdCb3VuZC50b0JCb3hTdHJpbmcoKSk7XG4gICAgfVxuICAgIGNvbnN0IHJlY3QgPSB0aGlzLmxlYWZsZXQucmVjdGFuZ2xlKGxhdExuZ0JvdW5kLCB7XG4gICAgICBjb2xvcixcbiAgICAgIHdlaWdodDogY29sb3IgPT09ICdub25lJyA/IDAgOiAxLFxuICAgICAgaW50ZXJhY3RpdmU6IGZhbHNlXG4gICAgfSk7XG4gICAgcmV0dXJuIHJlY3Q7XG4gIH1cblxuICBwcml2YXRlIGNsZWFyQ2x1c3RlcnMoKSB7XG4gICAgdGhpcy5jbHVzdGVycy5mb3JFYWNoKGNsdXN0ZXIgPT4ge1xuICAgICAgY2x1c3Rlci5jbGVhcih0aGlzLm1hcCk7XG4gICAgfSk7XG4gICAgdGhpcy5jbHVzdGVycyA9IFtdO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB1cGRhdGVDbHVzdGVyKGNsdXN0ZXI6IENsdXN0ZXJNYXApIHtcbiAgICBjb25zdCBjbHVzdGVyQ291bnQgPSBhd2FpdCB0aGlzLm1hcFNlcnZpY2UuZ2V0UG9zaXRpb25NT3NGcm9tQm91bmRDb3VudChcbiAgICAgIGNsdXN0ZXIucmVjdC5nZXRCb3VuZHMoKSxcbiAgICAgIHRoaXMucm9vdE5vZGVcbiAgICApO1xuICAgIGlmIChjbHVzdGVyQ291bnQgPiB0aGlzLm1hcFNlcnZpY2UuTUFYX0RFVklDRV9QRVJfQ0xVU1RFUikge1xuICAgICAgY2x1c3Rlci5zZXRDbHVzdGVyVG9CaWdNYXJrZXIodGhpcy5tYXAsIGNsdXN0ZXJDb3VudCwgdGhpcy5sZWFmbGV0KTtcbiAgICAgIGNsdXN0ZXIucG9zaXRpb25zID0gW107XG4gICAgICByZXR1cm4gY2x1c3RlcjtcbiAgICB9XG5cbiAgICBjbHVzdGVyLnJlbW92ZUNsdXN0ZXJUb0JpZ01hcmtlcigpO1xuICAgIGNsdXN0ZXIucG9zaXRpb25zID0gYXdhaXQgdGhpcy5tYXBTZXJ2aWNlLmdldFBvc2l0aW9uTU9zRnJvbUJvdW5kKFxuICAgICAgY2x1c3Rlci5yZWN0LmdldEJvdW5kcygpLFxuICAgICAgdGhpcy5yb290Tm9kZVxuICAgICk7XG4gICAgcmV0dXJuIGNsdXN0ZXI7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZU9yVXBkYXRlQ2x1c3RlcihyZWN0czogTC5SZWN0YW5nbGU8dW5rbm93bj5bXSkge1xuICAgIGNvbnN0IGlzTmV3ID0gcmVjdHMubGVuZ3RoICE9PSB0aGlzLmNsdXN0ZXJzLmxlbmd0aDtcbiAgICBpZiAoaXNOZXcpIHtcbiAgICAgIHRoaXMuY2xlYXJDbHVzdGVycygpO1xuICAgIH1cbiAgICBjb25zdCB1cGRhdGVQcm9taXNlID0gcmVjdHMubWFwKChyZWN0LCBpbmRleCkgPT4ge1xuICAgICAgaWYgKGlzTmV3KSB7XG4gICAgICAgIGNvbnN0IGNsdXN0ZXIgPSBuZXcgQ2x1c3Rlck1hcChcbiAgICAgICAgICB0aGlzLml0ZXJhYmxlLFxuICAgICAgICAgIGFzc2V0ID0+IHRoaXMuZ2V0QXNzZXRNYXJrZXIoYXNzZXQpLFxuICAgICAgICAgIHRoaXMudHJhbnNsYXRlU2VydmljZVxuICAgICAgICApO1xuICAgICAgICB0aGlzLmNsdXN0ZXJzLnB1c2goY2x1c3Rlcik7XG4gICAgICB9XG4gICAgICB0aGlzLmNsdXN0ZXJzW2luZGV4XS5yZWN0ID0gcmVjdDtcbiAgICAgIHJldHVybiB0aGlzLnVwZGF0ZUNsdXN0ZXIodGhpcy5jbHVzdGVyc1tpbmRleF0pO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIFByb21pc2UuYWxsKHVwZGF0ZVByb21pc2UpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiYzh5LW1hcFwiPlxuICA8ZGl2ICNtYXA+PC9kaXY+XG48L2Rpdj5cbjxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiJdfQ==