@theseam/ui-common 0.3.1 → 0.3.2

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 (82) hide show
  1. package/breadcrumbs/_breadcrumbs-theme.scss +3 -3
  2. package/breadcrumbs/breadcrumbs/breadcrumbs.component.scss +10 -10
  3. package/bundles/theseam-ui-common-form-field.umd.js +1 -1
  4. package/bundles/theseam-ui-common-form-field.umd.js.map +1 -1
  5. package/bundles/theseam-ui-common-google-maps.umd.js +2202 -0
  6. package/bundles/theseam-ui-common-google-maps.umd.js.map +1 -0
  7. package/bundles/theseam-ui-common-menu.umd.js +1 -0
  8. package/bundles/theseam-ui-common-menu.umd.js.map +1 -1
  9. package/bundles/theseam-ui-common-utils.umd.js +610 -136
  10. package/bundles/theseam-ui-common-utils.umd.js.map +1 -1
  11. package/esm2015/form-field/input.directive.js +2 -2
  12. package/esm2015/google-maps/google-maps/google-maps.component.js +261 -0
  13. package/esm2015/google-maps/google-maps-contextmenu.js +113 -0
  14. package/esm2015/google-maps/google-maps-controls.service.js +70 -0
  15. package/esm2015/google-maps/google-maps-feature-helpers.js +177 -0
  16. package/esm2015/google-maps/google-maps-places-autocomplete/google-maps-places-autocomplete.component.js +195 -0
  17. package/esm2015/google-maps/google-maps-places-autocomplete/google-maps-places-autocomplete.directive.js +163 -0
  18. package/esm2015/google-maps/google-maps-recenter-button-control/google-maps-recenter-button-control.component.js +57 -0
  19. package/esm2015/google-maps/google-maps-upload-button-control/google-maps-upload-button-control.component.js +119 -0
  20. package/esm2015/google-maps/google-maps.module.js +45 -0
  21. package/esm2015/google-maps/google-maps.service.js +344 -0
  22. package/esm2015/google-maps/map-control.component.js +65 -0
  23. package/esm2015/google-maps/map-controls-service.js +4 -0
  24. package/esm2015/google-maps/map-file-drop/map-file-drop.component.js +135 -0
  25. package/esm2015/google-maps/map-value-manager.service.js +46 -0
  26. package/esm2015/google-maps/public-api.js +14 -0
  27. package/esm2015/google-maps/theseam-ui-common-google-maps.js +6 -0
  28. package/esm2015/menu/menu-toggle.directive.js +2 -1
  29. package/esm2015/utils/geo-json/coerce-feature-collection.js +44 -0
  30. package/esm2015/utils/geo-json/geo-json-to-area.js +11 -0
  31. package/esm2015/utils/geo-json/is-feature-collection.validator.js +21 -0
  32. package/esm2015/utils/geo-json/is-only-geometry-types.js +23 -0
  33. package/esm2015/utils/geo-json/is-only-geometry-types.validator.js +32 -0
  34. package/esm2015/utils/geo-json/merge-polygons.js +35 -0
  35. package/esm2015/utils/geo-json/no-inner-rings.validator.js +63 -0
  36. package/esm2015/utils/geo-json/no-kinks.validator.js +39 -0
  37. package/esm2015/utils/geo-json/read-geo-file.js +99 -0
  38. package/esm2015/utils/geo-json/split-multi-polygons.js +29 -0
  39. package/esm2015/utils/is-null-or-undefined.js +1 -1
  40. package/esm2015/utils/public-api.js +11 -1
  41. package/fesm2015/theseam-ui-common-form-field.js +1 -1
  42. package/fesm2015/theseam-ui-common-form-field.js.map +1 -1
  43. package/fesm2015/theseam-ui-common-google-maps.js +1729 -0
  44. package/fesm2015/theseam-ui-common-google-maps.js.map +1 -0
  45. package/fesm2015/theseam-ui-common-menu.js +1 -0
  46. package/fesm2015/theseam-ui-common-menu.js.map +1 -1
  47. package/fesm2015/theseam-ui-common-utils.js +477 -94
  48. package/fesm2015/theseam-ui-common-utils.js.map +1 -1
  49. package/form-field/theseam-ui-common-form-field.metadata.json +1 -1
  50. package/framework/top-bar/_top-bar-theme.scss +5 -5
  51. package/google-maps/google-maps/google-maps.component.d.ts +89 -0
  52. package/google-maps/google-maps-contextmenu.d.ts +15 -0
  53. package/google-maps/google-maps-controls.service.d.ts +23 -0
  54. package/google-maps/google-maps-feature-helpers.d.ts +37 -0
  55. package/google-maps/google-maps-places-autocomplete/google-maps-places-autocomplete.component.d.ts +104 -0
  56. package/google-maps/google-maps-places-autocomplete/google-maps-places-autocomplete.directive.d.ts +80 -0
  57. package/google-maps/google-maps-recenter-button-control/google-maps-recenter-button-control.component.d.ts +21 -0
  58. package/google-maps/google-maps-upload-button-control/google-maps-upload-button-control.component.d.ts +34 -0
  59. package/google-maps/google-maps.module.d.ts +2 -0
  60. package/google-maps/google-maps.service.d.ts +53 -0
  61. package/google-maps/map-control.component.d.ts +20 -0
  62. package/google-maps/map-controls-service.d.ts +13 -0
  63. package/google-maps/map-file-drop/map-file-drop.component.d.ts +34 -0
  64. package/google-maps/map-value-manager.service.d.ts +18 -0
  65. package/google-maps/package.json +11 -0
  66. package/google-maps/public-api.d.ts +13 -0
  67. package/google-maps/theseam-ui-common-google-maps.d.ts +5 -0
  68. package/google-maps/theseam-ui-common-google-maps.metadata.json +1 -0
  69. package/package.json +17 -10
  70. package/utils/geo-json/coerce-feature-collection.d.ts +2 -0
  71. package/utils/geo-json/geo-json-to-area.d.ts +6 -0
  72. package/utils/geo-json/is-feature-collection.validator.d.ts +3 -0
  73. package/utils/geo-json/is-only-geometry-types.d.ts +5 -0
  74. package/utils/geo-json/is-only-geometry-types.validator.d.ts +4 -0
  75. package/utils/geo-json/merge-polygons.d.ts +9 -0
  76. package/utils/geo-json/no-inner-rings.validator.d.ts +10 -0
  77. package/utils/geo-json/no-kinks.validator.d.ts +3 -0
  78. package/utils/geo-json/read-geo-file.d.ts +7 -0
  79. package/utils/geo-json/split-multi-polygons.d.ts +8 -0
  80. package/utils/is-null-or-undefined.d.ts +1 -1
  81. package/utils/public-api.d.ts +10 -0
  82. package/utils/theseam-ui-common-utils.metadata.json +1 -1
@@ -0,0 +1,46 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { Subject } from 'rxjs';
3
+ export var MapValueSource;
4
+ (function (MapValueSource) {
5
+ MapValueSource["Input"] = "input";
6
+ MapValueSource["FeatureChange"] = "featurechange";
7
+ })(MapValueSource || (MapValueSource = {}));
8
+ export class MapValueManagerService {
9
+ constructor() {
10
+ this._valueChangedSubject = new Subject();
11
+ this.valueChanged = this._valueChangedSubject.asObservable();
12
+ }
13
+ setValue(value, source) {
14
+ if (value === this._value) {
15
+ return false;
16
+ }
17
+ if (value === null || value === undefined) {
18
+ this._value = value;
19
+ const _change = {
20
+ source,
21
+ value: this._value,
22
+ };
23
+ this._valueChangedSubject.next(_change);
24
+ return true;
25
+ }
26
+ if (JSON.stringify(value) === JSON.stringify(this._value)) {
27
+ return true;
28
+ }
29
+ // TODO: Validate object is valid geojson.
30
+ this._value = value;
31
+ const change = {
32
+ source,
33
+ value: this._value,
34
+ };
35
+ this._valueChangedSubject.next(change);
36
+ return true;
37
+ }
38
+ get value() {
39
+ return this._value;
40
+ }
41
+ }
42
+ MapValueManagerService.decorators = [
43
+ { type: Injectable }
44
+ ];
45
+ MapValueManagerService.ctorParameters = () => [];
46
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFwLXZhbHVlLW1hbmFnZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3VpLWNvbW1vbi9nb29nbGUtbWFwcy9tYXAtdmFsdWUtbWFuYWdlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFDMUMsT0FBTyxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQTtBQUUxQyxNQUFNLENBQU4sSUFBWSxjQUdYO0FBSEQsV0FBWSxjQUFjO0lBQ3hCLGlDQUFlLENBQUE7SUFDZixpREFBK0IsQ0FBQTtBQUNqQyxDQUFDLEVBSFcsY0FBYyxLQUFkLGNBQWMsUUFHekI7QUFVRCxNQUFNLE9BQU8sc0JBQXNCO0lBUWpDO1FBTmlCLHlCQUFvQixHQUFHLElBQUksT0FBTyxFQUFrQixDQUFBO1FBT25FLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFlBQVksRUFBRSxDQUFBO0lBQzlELENBQUM7SUFFTSxRQUFRLENBQUMsS0FBZSxFQUFFLE1BQXNCO1FBQ3JELElBQUksS0FBSyxLQUFLLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDekIsT0FBTyxLQUFLLENBQUE7U0FDYjtRQUVELElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFO1lBQ3pDLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFBO1lBQ25CLE1BQU0sT0FBTyxHQUFtQjtnQkFDOUIsTUFBTTtnQkFDTixLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU07YUFDbkIsQ0FBQTtZQUNELElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUE7WUFDdkMsT0FBTyxJQUFJLENBQUE7U0FDWjtRQUVELElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsS0FBSyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUN6RCxPQUFPLElBQUksQ0FBQTtTQUNaO1FBRUQsMENBQTBDO1FBQzFDLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFBO1FBQ25CLE1BQU0sTUFBTSxHQUFtQjtZQUM3QixNQUFNO1lBQ04sS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNO1NBQ25CLENBQUE7UUFDRCxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBQ3RDLE9BQU8sSUFBSSxDQUFBO0lBQ2IsQ0FBQztJQUVELElBQVcsS0FBSztRQUNkLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQTtJQUNwQixDQUFDOzs7WUE1Q0YsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJ1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnXG5cbmV4cG9ydCBlbnVtIE1hcFZhbHVlU291cmNlIHtcbiAgSW5wdXQgPSAnaW5wdXQnLFxuICBGZWF0dXJlQ2hhbmdlID0gJ2ZlYXR1cmVjaGFuZ2UnXG59XG5cbmV4cG9ydCB0eXBlIE1hcFZhbHVlID0gb2JqZWN0IHwgdW5kZWZpbmVkIHwgbnVsbFxuXG5leHBvcnQgaW50ZXJmYWNlIE1hcFZhbHVlQ2hhbmdlIHtcbiAgdmFsdWU6IE1hcFZhbHVlXG4gIHNvdXJjZTogTWFwVmFsdWVTb3VyY2Vcbn1cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIE1hcFZhbHVlTWFuYWdlclNlcnZpY2Uge1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX3ZhbHVlQ2hhbmdlZFN1YmplY3QgPSBuZXcgU3ViamVjdDxNYXBWYWx1ZUNoYW5nZT4oKVxuXG4gIHByaXZhdGUgX3ZhbHVlOiBNYXBWYWx1ZVxuXG4gIHB1YmxpYyByZWFkb25seSB2YWx1ZUNoYW5nZWQ6IE9ic2VydmFibGU8TWFwVmFsdWVDaGFuZ2U+XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy52YWx1ZUNoYW5nZWQgPSB0aGlzLl92YWx1ZUNoYW5nZWRTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpXG4gIH1cblxuICBwdWJsaWMgc2V0VmFsdWUodmFsdWU6IE1hcFZhbHVlLCBzb3VyY2U6IE1hcFZhbHVlU291cmNlKTogYm9vbGVhbiB7XG4gICAgaWYgKHZhbHVlID09PSB0aGlzLl92YWx1ZSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX3ZhbHVlID0gdmFsdWVcbiAgICAgIGNvbnN0IF9jaGFuZ2U6IE1hcFZhbHVlQ2hhbmdlID0ge1xuICAgICAgICBzb3VyY2UsXG4gICAgICAgIHZhbHVlOiB0aGlzLl92YWx1ZSxcbiAgICAgIH1cbiAgICAgIHRoaXMuX3ZhbHVlQ2hhbmdlZFN1YmplY3QubmV4dChfY2hhbmdlKVxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICBpZiAoSlNPTi5zdHJpbmdpZnkodmFsdWUpID09PSBKU09OLnN0cmluZ2lmeSh0aGlzLl92YWx1ZSkpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgLy8gVE9ETzogVmFsaWRhdGUgb2JqZWN0IGlzIHZhbGlkIGdlb2pzb24uXG4gICAgdGhpcy5fdmFsdWUgPSB2YWx1ZVxuICAgIGNvbnN0IGNoYW5nZTogTWFwVmFsdWVDaGFuZ2UgPSB7XG4gICAgICBzb3VyY2UsXG4gICAgICB2YWx1ZTogdGhpcy5fdmFsdWUsXG4gICAgfVxuICAgIHRoaXMuX3ZhbHVlQ2hhbmdlZFN1YmplY3QubmV4dChjaGFuZ2UpXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdmFsdWUoKTogTWFwVmFsdWUge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZVxuICB9XG5cbn1cbiJdfQ==
@@ -0,0 +1,14 @@
1
+ export * from './google-maps/google-maps.component';
2
+ export * from './google-maps.module';
3
+ export * from './map-value-manager.service';
4
+ export * from './map-control.component';
5
+ export * from './google-maps.service';
6
+ export * from './google-maps-feature-helpers';
7
+ export * from './google-maps-controls.service';
8
+ export * from './google-maps-contextmenu';
9
+ export * from './map-file-drop/map-file-drop.component';
10
+ export * from './google-maps-upload-button-control/google-maps-upload-button-control.component';
11
+ export * from './google-maps-recenter-button-control/google-maps-recenter-button-control.component';
12
+ export * from './google-maps-places-autocomplete/google-maps-places-autocomplete.directive';
13
+ export * from './google-maps-places-autocomplete/google-maps-places-autocomplete.component';
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3VpLWNvbW1vbi9nb29nbGUtbWFwcy9wdWJsaWMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMscUNBQXFDLENBQUE7QUFDbkQsY0FBYyxzQkFBc0IsQ0FBQTtBQUVwQyxjQUFjLDZCQUE2QixDQUFBO0FBQzNDLGNBQWMseUJBQXlCLENBQUE7QUFDdkMsY0FBYyx1QkFBdUIsQ0FBQTtBQUNyQyxjQUFjLCtCQUErQixDQUFBO0FBQzdDLGNBQWMsZ0NBQWdDLENBQUE7QUFDOUMsY0FBYywyQkFBMkIsQ0FBQTtBQUN6QyxjQUFjLHlDQUF5QyxDQUFBO0FBQ3ZELGNBQWMsaUZBQWlGLENBQUE7QUFDL0YsY0FBYyxxRkFBcUYsQ0FBQTtBQUNuRyxjQUFjLDZFQUE2RSxDQUFBO0FBQzNGLGNBQWMsNkVBQTZFLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2dvb2dsZS1tYXBzL2dvb2dsZS1tYXBzLmNvbXBvbmVudCdcbmV4cG9ydCAqIGZyb20gJy4vZ29vZ2xlLW1hcHMubW9kdWxlJ1xuXG5leHBvcnQgKiBmcm9tICcuL21hcC12YWx1ZS1tYW5hZ2VyLnNlcnZpY2UnXG5leHBvcnQgKiBmcm9tICcuL21hcC1jb250cm9sLmNvbXBvbmVudCdcbmV4cG9ydCAqIGZyb20gJy4vZ29vZ2xlLW1hcHMuc2VydmljZSdcbmV4cG9ydCAqIGZyb20gJy4vZ29vZ2xlLW1hcHMtZmVhdHVyZS1oZWxwZXJzJ1xuZXhwb3J0ICogZnJvbSAnLi9nb29nbGUtbWFwcy1jb250cm9scy5zZXJ2aWNlJ1xuZXhwb3J0ICogZnJvbSAnLi9nb29nbGUtbWFwcy1jb250ZXh0bWVudSdcbmV4cG9ydCAqIGZyb20gJy4vbWFwLWZpbGUtZHJvcC9tYXAtZmlsZS1kcm9wLmNvbXBvbmVudCdcbmV4cG9ydCAqIGZyb20gJy4vZ29vZ2xlLW1hcHMtdXBsb2FkLWJ1dHRvbi1jb250cm9sL2dvb2dsZS1tYXBzLXVwbG9hZC1idXR0b24tY29udHJvbC5jb21wb25lbnQnXG5leHBvcnQgKiBmcm9tICcuL2dvb2dsZS1tYXBzLXJlY2VudGVyLWJ1dHRvbi1jb250cm9sL2dvb2dsZS1tYXBzLXJlY2VudGVyLWJ1dHRvbi1jb250cm9sLmNvbXBvbmVudCdcbmV4cG9ydCAqIGZyb20gJy4vZ29vZ2xlLW1hcHMtcGxhY2VzLWF1dG9jb21wbGV0ZS9nb29nbGUtbWFwcy1wbGFjZXMtYXV0b2NvbXBsZXRlLmRpcmVjdGl2ZSdcbmV4cG9ydCAqIGZyb20gJy4vZ29vZ2xlLW1hcHMtcGxhY2VzLWF1dG9jb21wbGV0ZS9nb29nbGUtbWFwcy1wbGFjZXMtYXV0b2NvbXBsZXRlLmNvbXBvbmVudCdcbiJdfQ==
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './public-api';
5
+ export { MAP_CONTROLS_SERVICE as ɵb, MAP_CONTROL_DATA as ɵc } from './map-controls-service';
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGhlc2VhbS11aS1jb21tb24tZ29vZ2xlLW1hcHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy91aS1jb21tb24vZ29vZ2xlLW1hcHMvdGhlc2VhbS11aS1jb21tb24tZ29vZ2xlLW1hcHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLGNBQWMsQ0FBQztBQUU3QixPQUFPLEVBQUMsb0JBQW9CLElBQUksRUFBRSxFQUFDLGdCQUFnQixJQUFJLEVBQUUsRUFBa0IsTUFBTSx3QkFBd0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9wdWJsaWMtYXBpJztcblxuZXhwb3J0IHtNQVBfQ09OVFJPTFNfU0VSVklDRSBhcyDJtWIsTUFQX0NPTlRST0xfREFUQSBhcyDJtWMsTWFwQ29udHJvbCBhcyDJtWF9IGZyb20gJy4vbWFwLWNvbnRyb2xzLXNlcnZpY2UnOyJdfQ==
@@ -145,6 +145,7 @@ export class MenuToggleDirective {
145
145
  (_b = this._overlayRef) === null || _b === void 0 ? void 0 : _b.detach();
146
146
  }
147
147
  this._resetMenu();
148
+ this._elementRef.nativeElement.removeEventListener('touchstart', this._handleTouchStart, passiveEventListenerOptions);
148
149
  this._menuClosedSubscription.unsubscribe();
149
150
  this._closingActionsSubscription.unsubscribe();
150
151
  this._active = false;
@@ -245,4 +246,4 @@ MenuToggleDirective.propDecorators = {
245
246
  _onClick: [{ type: HostListener, args: ['click', ['$event'],] }],
246
247
  _onDocumentKeydown: [{ type: HostListener, args: ['document:keydown', ['$event'],] }]
247
248
  };
248
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudS10b2dnbGUuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvdWktY29tbW9uL21lbnUvbWVudS10b2dnbGUuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQWUsK0JBQStCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQTtBQUM5RixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQTtBQUNwRSxPQUFPLEVBQTBCLE9BQU8sRUFBZ0MsTUFBTSxzQkFBc0IsQ0FBQTtBQUNwRyxPQUFPLEVBQUUsK0JBQStCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQTtBQUN2RSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0scUJBQXFCLENBQUE7QUFDcEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFVLEtBQUssRUFBdUIsZ0JBQWdCLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFDekgsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFBO0FBTzlDLG9EQUFvRDtBQUNwRCxNQUFNLDJCQUEyQixHQUFHLCtCQUErQixDQUFDLEVBQUMsT0FBTyxFQUFFLElBQUksRUFBQyxDQUFDLENBQUE7QUFXcEYsTUFBTSxPQUFPLG1CQUFtQjtJQTRGOUIsb0RBQW9EO0lBQ3BELHFDQUFxQztJQUNyQyxpQ0FBaUM7SUFDakMsSUFBSTtJQUVKLFlBQ1UsV0FBb0MsRUFDcEMsaUJBQW1DLEVBQ25DLFFBQWlCLEVBQ2pCLGFBQTJCO1FBSDNCLGdCQUFXLEdBQVgsV0FBVyxDQUF5QjtRQUNwQyxzQkFBaUIsR0FBakIsaUJBQWlCLENBQWtCO1FBQ25DLGFBQVEsR0FBUixRQUFRLENBQVM7UUFDakIsa0JBQWEsR0FBYixhQUFhLENBQWM7UUFuRzdCLFlBQU8sR0FBRyxLQUFL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RyxFQUFFLEVBQUUsQ0FBQTtRQUN4QixxRUFBcUU7UUFDckUseURBQXlEO1FBQ3pELGlDQUFpQztRQUNqQyxXQUFXO1FBQ1gsTUFBTSxLQUFLLEdBQUcsRUFBRSxFQUFFLENBQUE7UUFFbEIsT0FBTyxLQUFLLENBQUMsUUFBUSxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsV0FBVyxDQUFDLENBQUE7SUFDekQsQ0FBQzs7O1lBclFGLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsa0JBQWtCO2dCQUM1Qix1REFBdUQ7Z0JBQ3ZELElBQUksRUFBRTtvQkFDSixlQUFlLEVBQUUsTUFBTTtvQkFDdkIsc0JBQXNCLEVBQUUsb0JBQW9CO2lCQUM3QztnQkFDRCxRQUFRLEVBQUUsZ0JBQWdCO2FBQzNCOzs7WUFuQm1CLFVBQVU7WUFBb0QsZ0JBQWdCO1lBSGpFLE9BQU87WUFGL0IsWUFBWTs7OzZCQXNDbEIsS0FBSzt3QkFFTCxLQUFLOzJCQW1DTCxZQUFZLFNBQUMsV0FBVyxFQUFFLENBQUUsUUFBUSxDQUFFO3lCQWdCdEMsWUFBWSxTQUFDLFNBQVMsRUFBRSxDQUFFLFFBQVEsQ0FBRTt1QkFjcEMsWUFBWSxTQUFDLE9BQU8sRUFBRSxDQUFFLFFBQVEsQ0FBRTtpQ0FLbEMsWUFBWSxTQUFDLGtCQUFrQixFQUFFLENBQUUsUUFBUSxDQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRm9jdXNNb25pdG9yLCBGb2N1c09yaWdpbiwgaXNGYWtlTW91c2Vkb3duRnJvbVNjcmVlblJlYWRlciB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9hMTF5J1xuaW1wb3J0IHsgRE9XTl9BUlJPVywgRVNDQVBFLCBVUF9BUlJPVyB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9rZXljb2RlcydcbmltcG9ydCB7IENvbm5lY3Rpb25Qb3NpdGlvblBhaXIsIE92ZXJsYXksIE92ZXJsYXlSZWYsIFBvc2l0aW9uU3RyYXRlZ3kgfSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSdcbmltcG9ydCB7IG5vcm1hbGl6ZVBhc3NpdmVMaXN0ZW5lck9wdGlvbnMgfSBmcm9tICdAYW5ndWxhci9jZGsvcGxhdGZvcm0nXG5pbXBvcnQgeyBUZW1wbGF0ZVBvcnRhbCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9wb3J0YWwnXG5pbXBvcnQgeyBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIEhvc3RMaXN0ZW5lciwgSW5qZWN0LCBJbnB1dCwgT25EZXN0cm95LCBPcHRpb25hbCwgVmlld0NvbnRhaW5lclJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXG5pbXBvcnQgeyBtZXJnZSwgb2YsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnXG5cbmltcG9ydCB7IE1lbnVJdGVtQ29tcG9uZW50IH0gZnJvbSAnLi9tZW51LWl0ZW0uY29tcG9uZW50J1xuaW1wb3J0IHsgSVRoZVNlYW1NZW51UGFuZWwgfSBmcm9tICcuL21lbnUtcGFuZWwnXG5pbXBvcnQgeyBUSEVTRUFNX01FTlVfUEFORUwgfSBmcm9tICcuL21lbnUtcGFuZWwtdG9rZW4nXG5pbXBvcnQgeyBNZW51Q29tcG9uZW50IH0gZnJvbSAnLi9tZW51LmNvbXBvbmVudCdcblxuLyoqIE9wdGlvbnMgZm9yIGJpbmRpbmcgYSBwYXNzaXZlIGV2ZW50IGxpc3RlbmVyLiAqL1xuY29uc3QgcGFzc2l2ZUV2ZW50TGlzdGVuZXJPcHRpb25zID0gbm9ybWFsaXplUGFzc2l2ZUxpc3RlbmVyT3B0aW9ucyh7cGFzc2l2ZTogdHJ1ZX0pXG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1tzZWFtTWVudVRvZ2dsZV0nLFxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6dXNlLWhvc3QtcHJvcGVydHktZGVjb3JhdG9yXG4gIGhvc3Q6IHtcbiAgICAnYXJpYS1oYXNwb3B1cCc6ICd0cnVlJyxcbiAgICAnW2F0dHIuYXJpYS1leHBhbmRlZF0nOiAnbWVudU9wZW4oKSB8fCBudWxsJ1xuICB9LFxuICBleHBvcnRBczogJ3NlYW1NZW51VG9nZ2xlJ1xufSlcbmV4cG9ydCBjbGFzcyBNZW51VG9nZ2xlRGlyZWN0aXZlIGltcGxlbWVudHMgT25EZXN0cm95IHtcblxuICBwcml2YXRlIF9hY3RpdmUgPSBmYWxzZVxuICBwcml2YXRlIF9vdmVybGF5UmVmPzogT3ZlcmxheVJlZlxuICBwcml2YXRlIF9tZW51Q2xvc2VkU3Vic2NyaXB0aW9uID0gU3Vic2NyaXB0aW9uLkVNUFRZXG4gIHByaXZhdGUgX2Nsb3NpbmdBY3Rpb25zU3Vic2NyaXB0aW9uID0gU3Vic2NyaXB0aW9uLkVNUFRZXG5cbiAgcHVibGljIHJlc3RvcmVGb2N1cyA9IHRydWVcblxuICAvLyBUcmFja2luZyBpbnB1dCB0eXBlIGlzIG5lY2Vzc2FyeSBzbyBpdCdzIHBvc3NpYmxlIHRvIG9ubHkgYXV0by1mb2N1c1xuICAvLyB0aGUgZmlyc3QgaXRlbSBvZiB0aGUgbGlzdCB3aGVuIHRoZSBtZW51IGlzIG9wZW5lZCB2aWEgdGhlIGtleWJvYXJkXG4gIF9vcGVuZWRCeTogJ21vdXNlJyB8ICd0b3VjaCcgfCBudWxsID0gbnVsbFxuXG4gIEBJbnB1dCgpIHNlYW1NZW51VG9nZ2xlOiBNZW51Q29tcG9uZW50IHwgdW5kZWZpbmVkIHwgbnVsbFxuXG4gIEBJbnB1dCgpXG4gIHNldCBwb3NpdGlvbnModmFsOiBDb25uZWN0aW9uUG9zaXRpb25QYWlyW10pIHtcbiAgICB0aGlzLl9wb3NpdGlvbnMgPSB2YWxcbiAgICBpZiAodGhpcy5tZW51T3BlbigpKSB7XG4gICAgICB0aGlzLl9vdmVybGF5UmVmPy51cGRhdGVQb3NpdGlvblN0cmF0ZWd5KHRoaXMuZ2V0T3ZlcmxheVBvc2l0aW9uKHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkpXG4gICAgfVxuICB9XG4gIGdldCBwb3NpdGlvbnMoKSB7IHJldHVybiB0aGlzLl9wb3NpdGlvbnMgfVxuICBwcml2YXRlIF9wb3NpdGlvbnM6IENvbm5lY3Rpb25Qb3NpdGlvblBhaXJbXSA9IFtcbiAgICB7XG4gICAgICBvcmlnaW5YOiAnZW5kJyxcbiAgICAgIG9yaWdpblk6ICdib3R0b20nLFxuICAgICAgb3ZlcmxheVg6ICdlbmQnLFxuICAgICAgb3ZlcmxheVk6ICd0b3AnLFxuICAgIH0sXG4gICAge1xuICAgICAgb3JpZ2luWDogJ3N0YXJ0JyxcbiAgICAgIG9yaWdpblk6ICdib3R0b20nLFxuICAgICAgb3ZlcmxheVg6ICdzdGFydCcsXG4gICAgICBvdmVybGF5WTogJ3RvcCcsXG4gICAgfSxcbiAgICB7XG4gICAgICBvcmlnaW5YOiAnZW5kJyxcbiAgICAgIG9yaWdpblk6ICd0b3AnLFxuICAgICAgb3ZlcmxheVg6ICdlbmQnLFxuICAgICAgb3ZlcmxheVk6ICdib3R0b20nLFxuICAgIH0sXG4gICAge1xuICAgICAgb3JpZ2luWDogJ3N0YXJ0JyxcbiAgICAgIG9yaWdpblk6ICd0b3AnLFxuICAgICAgb3ZlcmxheVg6ICdzdGFydCcsXG4gICAgICBvdmVybGF5WTogJ2JvdHRvbScsXG4gICAgfSxcbiAgXVxuXG4gIEBIb3N0TGlzdGVuZXIoJ21vdXNlZG93bicsIFsgJyRldmVudCcgXSlcbiAgX29uTW91c2VEb3duKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgaWYgKCFpc0Zha2VNb3VzZWRvd25Gcm9tU2NyZWVuUmVhZGVyKGV2ZW50KSkge1xuICAgICAgLy8gU2luY2UgcmlnaHQgb3IgbWlkZGxlIGJ1dHRvbiBjbGlja3Mgd29uJ3QgdHJpZ2dlciB0aGUgYGNsaWNrYCBldmVudCxcbiAgICAgIC8vIHdlIHNob3VsZG4ndCBjb25zaWRlciB0aGUgbWVudSBhcyBvcGVuZWQgYnkgbW91c2UgaW4gdGhvc2UgY2FzZXMuXG4gICAgICB0aGlzLl9vcGVuZWRCeSA9IGV2ZW50LmJ1dHRvbiA9PT0gMCA/ICdtb3VzZScgOiBudWxsXG5cbiAgICAgIC8vIFNpbmNlIGNsaWNraW5nIG9uIHRoZSB0cmlnZ2VyIHdvbid0IGNsb3NlIHRoZSBtZW51IGlmIGl0IG9wZW5zIGEgc3ViLW1lbnUsXG4gICAgICAvLyB3ZSBzaG91bGQgcHJldmVudCBmb2N1cyBmcm9tIG1vdmluZyBvbnRvIGl0IHZpYSBjbGljayB0byBhdm9pZCB0aGVcbiAgICAgIC8vIGhpZ2hsaWdodCBmcm9tIGxpbmdlcmluZyBvbiB0aGUgbWVudSBpdGVtLlxuICAgICAgLy8gaWYgKHRoaXMudHJpZ2dlcnNTdWJtZW51KCkpIHtcbiAgICAgIC8vICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIC8vIH1cbiAgICB9XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdrZXlkb3duJywgWyAnJGV2ZW50JyBdKVxuICBfb25LZXlkb3duKGV2ZW50OiBhbnkpIHtcbiAgICB0aGlzLl9vcGVuZWRCeSA9IG51bGxcblxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpkZXByZWNhdGlvblxuICAgIGNvbnN0IGtleUNvZGUgPSBldmVudC5rZXlDb2RlXG5cbiAgICBpZiAoa2V5Q29kZSA9PT0gVVBfQVJST1cgfHwga2V5Q29kZSA9PT0gRE9XTl9BUlJPVykge1xuICAgICAgaWYgKHRoaXMubWVudU9wZW4oKSkge1xuICAgICAgICB0aGlzLnNlYW1NZW51VG9nZ2xlPy5mb2N1c0ZpcnN0SXRlbSh0aGlzLl9vcGVuZWRCeSB8fCAncHJvZ3JhbScpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignY2xpY2snLCBbICckZXZlbnQnIF0pXG4gIF9vbkNsaWNrKGV2ZW50OiBhbnkpIHtcbiAgICB0aGlzLnRvZ2dsZSgpXG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDprZXlkb3duJywgWyAnJGV2ZW50JyBdKVxuICBfb25Eb2N1bWVudEtleWRvd24oZXZlbnQ6IGFueSkge1xuICAgIGlmIChldmVudC5rZXlDb2RlID09PSBFU0NBUEUpIHtcbiAgICAgIHRoaXMuY2xvc2VNZW51KClcbiAgICB9XG4gIH1cblxuICAvLyBASG9zdExpc3RlbmVyKCdkb2N1bWVudDptb3VzZWRvd24nLCBbICckZXZlbnQnIF0pXG4gIC8vIF9vbkRvY3VtZW50TW91c2VEb3duKGV2ZW50OiBhbnkpIHtcbiAgLy8gICBjb25zb2xlLmxvZygnb3V0c2lkZSBjbGljaycpXG4gIC8vIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9lbGVtZW50UmVmOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PixcbiAgICBwcml2YXRlIF92aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmLFxuICAgIHByaXZhdGUgX292ZXJsYXk6IE92ZXJsYXksXG4gICAgcHJpdmF0ZSBfZm9jdXNNb25pdG9yOiBGb2N1c01vbml0b3IsXG4gICAgLy8gQEluamVjdChUSEVTRUFNX01FTlVfUEFORUwpIEBPcHRpb25hbCgpIHByaXZhdGUgX3BhcmVudE1lbnU/OiBJVGhlU2VhbU1lbnVQYW5lbDxNZW51SXRlbUNvbXBvbmVudD5cbiAgKSB7XG4gICAgdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCB0aGlzLl9oYW5kbGVUb3VjaFN0YXJ0LFxuICAgICAgICBwYXNzaXZlRXZlbnRMaXN0ZW5lck9wdGlvbnMpXG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLmNsb3NlTWVudSgpXG5cbiAgICB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHRoaXMuX2hhbmRsZVRvdWNoU3RhcnQsXG4gICAgICAgIHBhc3NpdmVFdmVudExpc3RlbmVyT3B0aW9ucylcblxuICAgIHRoaXMuX21lbnVDbG9zZWRTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKVxuICAgIHRoaXMuX2Nsb3NpbmdBY3Rpb25zU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKClcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIHRvdWNoIHN0YXJ0IGV2ZW50cyBvbiB0aGUgdHJpZ2dlci5cbiAgICogTmVlZHMgdG8gYmUgYW4gYXJyb3cgZnVuY3Rpb24gc28gd2UgY2FuIGVhc2lseSB1c2UgYWRkRXZlbnRMaXN0ZW5lciBhbmQgcmVtb3ZlRXZlbnRMaXN0ZW5lci5cbiAgICovXG4gIHByaXZhdGUgX2hhbmRsZVRvdWNoU3RhcnQgPSAoKSA9PiB0aGlzLl9vcGVuZWRCeSA9ICd0b3VjaCdcblxuICBwdWJsaWMgdG9nZ2xlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9hY3RpdmUpIHtcbiAgICAgIHRoaXMuY2xvc2VNZW51KClcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5vcGVuTWVudSgpXG4gICAgfVxuICB9XG5cbiAgcHVibGljIG9wZW5NZW51KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9hY3RpdmUgfHwgIXRoaXMuc2VhbU1lbnVUb2dnbGUpIHsgcmV0dXJuIH1cbiAgICB0aGlzLl9hY3RpdmUgPSB0cnVlXG5cbiAgICB0aGlzLl9vdmVybGF5UmVmID0gdGhpcy5fb3ZlcmxheS5jcmVhdGUoe1xuICAgICAgaGFzQmFja2Ryb3A6IHRydWUsXG4gICAgICBiYWNrZHJvcENsYXNzOiAndHJhbnNwYXJlbnQnLFxuICAgICAgcG9zaXRpb25TdHJhdGVneTogdGhpcy5nZXRPdmVybGF5UG9zaXRpb24odGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KSxcbiAgICB9KVxuXG4gICAgY29uc3QgdHBsID0gdGhpcy5zZWFtTWVudVRvZ2dsZS50ZW1wbGF0ZVJlZlxuICAgIGlmICghdHBsKSB7XG4gICAgICB0aHJvdyBFcnJvcihgTWVudSB0ZW1wbGF0ZSBub3QgZm91bmQuYClcbiAgICB9XG5cbiAgICB0aGlzLl9vdmVybGF5UmVmLmF0dGFjaChuZXcgVGVtcGxhdGVQb3J0YWwodHBsLCB0aGlzLl92aWV3Q29udGFpbmVyUmVmKSlcblxuICAgIHRoaXMuX2Nsb3NpbmdBY3Rpb25zU3Vic2NyaXB0aW9uID0gdGhpcy5fbWVudUNsb3NpbmdBY3Rpb25zKCkuc3Vic2NyaWJlKCgpID0+IHRoaXMuY2xvc2VNZW51KCkpXG4gICAgdGhpcy5faW5pdE1lbnUoKVxuXG4gICAgdGhpcy5fbWVudUNsb3NlZFN1YnNjcmlwdGlvbiA9IHRoaXMuc2VhbU1lbnVUb2dnbGUuY2xvc2VkLnN1YnNjcmliZSh2ID0+IHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKCdjbG9zZWQnLCB2KVxuICAgICAgdGhpcy5jbG9zZU1lbnUoKVxuICAgIH0pXG5cbiAgICAvLyB0aGlzLl9vdmVybGF5UmVmLmJhY2tkcm9wQ2xpY2soKS5zdWJzY3JpYmUodiA9PiB7XG4gICAgLy8gICBjb25zb2xlLmxvZygnYmFja2Ryb3BDbGljaycsIHYpXG4gICAgLy8gfSlcbiAgfVxuXG4gIHB1YmxpYyBjbG9zZU1lbnUoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9hY3RpdmUpIHsgcmV0dXJuIH1cblxuICAgIGlmICh0aGlzLl9vdmVybGF5UmVmPy5oYXNBdHRhY2hlZCgpKSB7XG4gICAgICB0aGlzLl9vdmVybGF5UmVmPy5kZXRhY2goKVxuICAgIH1cblxuICAgIHRoaXMuX3Jlc2V0TWVudSgpXG5cbiAgICB0aGlzLl9tZW51Q2xvc2VkU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKClcbiAgICB0aGlzLl9jbG9zaW5nQWN0aW9uc1N1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpXG5cbiAgICB0aGlzLl9hY3RpdmUgPSBmYWxzZVxuICB9XG5cbiAgcHVibGljIG1lbnVPcGVuKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAodGhpcy5fb3ZlcmxheVJlZiAmJiB0aGlzLl9vdmVybGF5UmVmLmhhc0F0dGFjaGVkKCkpID8/IGZhbHNlXG4gIH1cblxuICBwcml2YXRlIGdldE92ZXJsYXlQb3NpdGlvbihvcmlnaW46IEhUTUxFbGVtZW50KTogUG9zaXRpb25TdHJhdGVneSB7XG4gICAgY29uc3QgcG9zaXRpb25TdHJhdGVneSA9IHRoaXMuX292ZXJsYXkucG9zaXRpb24oKVxuICAgICAgLmZsZXhpYmxlQ29ubmVjdGVkVG8ob3JpZ2luKVxuICAgICAgLndpdGhQb3NpdGlvbnModGhpcy5wb3NpdGlvbnMpXG4gICAgICAud2l0aEZsZXhpYmxlRGltZW5zaW9ucyhmYWxzZSlcbiAgICAgIC53aXRoUHVzaCh0cnVlKVxuXG4gICAgcmV0dXJuIHBvc2l0aW9uU3RyYXRlZ3lcbiAgfVxuXG4gIC8qKlxuICAgKiBGb2N1c2VzIHRoZSBtZW51IHRyaWdnZXIuXG4gICAqIEBwYXJhbSBvcmlnaW4gU291cmNlIG9mIHRoZSBtZW51IHRyaWdnZXIncyBmb2N1cy5cbiAgICovXG4gIGZvY3VzKG9yaWdpbjogRm9jdXNPcmlnaW4gPSAncHJvZ3JhbScpIHtcbiAgICBpZiAodGhpcy5fZm9jdXNNb25pdG9yKSB7XG4gICAgICB0aGlzLl9mb2N1c01vbml0b3IuZm9jdXNWaWEodGhpcy5fZWxlbWVudFJlZiwgb3JpZ2luKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCBzZXRzIHRoZSBtZW51IHN0YXRlIHRvIG9wZW4gYW5kIGZvY3VzZXMgdGhlIGZpcnN0IGl0ZW0gaWZcbiAgICogdGhlIG1lbnUgd2FzIG9wZW5lZCB2aWEgdGhlIGtleWJvYXJkLlxuICAgKi9cbiAgcHJpdmF0ZSBfaW5pdE1lbnUoKTogdm9pZCB7XG4gICAgLy8gdGhpcy5zZWFtTWVudVRvZ2dsZS5wYXJlbnRNZW51ID0gdGhpcy50cmlnZ2Vyc1N1Ym1lbnUoKSA/IHRoaXMuX3BhcmVudE1lbnUgOiB1bmRlZmluZWRcbiAgICAvLyB0aGlzLnNlYW1NZW51VG9nZ2xlLmRpcmVjdGlvbiA9IHRoaXMuZGlyXG4gICAgLy8gdGhpcy5fc2V0TWVudUVsZXZhdGlvbigpXG4gICAgLy8gdGhpcy5fc2V0SXNNZW51T3Blbih0cnVlKVxuICAgIC8vIHRoaXMuc2VhbU1lbnVUb2dnbGUuZm9jdXNGaXJzdEl0ZW0odGhpcy5fb3BlbmVkQnkgfHwgJ3Byb2dyYW0nKVxuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgbWV0aG9kIHJlc2V0cyB0aGUgbWVudSB3aGVuIGl0J3MgY2xvc2VkLCBtb3N0IGltcG9ydGFudGx5IHJlc3RvcmluZ1xuICAgKiBmb2N1cyB0byB0aGUgbWVudSB0cmlnZ2VyIGlmIHRoZSBtZW51IHdhcyBvcGVuZWQgdmlhIHRoZSBrZXlib2FyZC5cbiAgICovXG4gIHByaXZhdGUgX3Jlc2V0TWVudSgpOiB2b2lkIHtcbiAgICAvLyB0aGlzLl9zZXRJc01lbnVPcGVuKGZhbHNlKVxuXG4gICAgLy8gV2Ugc2hvdWxkIHJlc2V0IGZvY3VzIGlmIHRoZSB1c2VyIGlzIG5hdmlnYXRpbmcgdXNpbmcgYSBrZXlib2FyZCBvclxuICAgIC8vIGlmIHdlIGhhdmUgYSB0b3AtbGV2ZWwgdHJpZ2dlciB3aGljaCBtaWdodCBjYXVzZSBmb2N1cyB0byBiZSBsb3N0XG4gICAgLy8gd2hlbiBjbGlja2luZyBvbiB0aGUgYmFja2Ryb3AuXG4gICAgaWYgKHRoaXMucmVzdG9yZUZvY3VzKSB7XG4gICAgICBpZiAoIXRoaXMuX29wZW5lZEJ5KSB7XG4gICAgICAgIC8vIE5vdGUgdGhhdCB0aGUgZm9jdXMgc3R5bGUgd2lsbCBzaG93IHVwIGJvdGggZm9yIGBwcm9ncmFtYCBhbmRcbiAgICAgICAgLy8gYGtleWJvYXJkYCBzbyB3ZSBkb24ndCBoYXZlIHRvIHNwZWNpZnkgd2hpY2ggb25lIGl0IGlzLlxuICAgICAgICB0aGlzLmZvY3VzKClcbiAgICAgIH1cbiAgICAgIC8vIGVsc2UgaWYgKCF0aGlzLnRyaWdnZXJzU3VibWVudSgpKSB7XG4gICAgICAvLyAgIHRoaXMuZm9jdXModGhpcy5fb3BlbmVkQnkpXG4gICAgICAvLyB9XG4gICAgfVxuXG4gICAgdGhpcy5fb3BlbmVkQnkgPSBudWxsXG4gIH1cblxuICAvKiogUmV0dXJucyBhIHN0cmVhbSB0aGF0IGVtaXRzIHdoZW5ldmVyIGFuIGFjdGlvbiB0aGF0IHNob3VsZCBjbG9zZSB0aGUgbWVudSBvY2N1cnMuICovXG4gIHByaXZhdGUgX21lbnVDbG9zaW5nQWN0aW9ucygpIHtcbiAgICBjb25zdCBiYWNrZHJvcCA9IHRoaXMuX292ZXJsYXlSZWY/LmJhY2tkcm9wQ2xpY2soKSA/PyBvZigpXG4gICAgY29uc3QgZGV0YWNobWVudHMgPSB0aGlzLl9vdmVybGF5UmVmPy5kZXRhY2htZW50cygpID8/IG9mKClcbiAgICAvLyBjb25zdCBwYXJlbnRDbG9zZSA9IHRoaXMuX3BhcmVudE1lbnUgPyB0aGlzLl9wYXJlbnRNZW51LmNsb3NlZCA6IG9mKClcbiAgICBjb25zdCBwYXJlbnRDbG9zZSA9IG9mKClcbiAgICAvLyBjb25zdCBob3ZlciA9IHRoaXMuX3BhcmVudE1lbnUgPyB0aGlzLl9wYXJlbnRNZW51Ll9ob3ZlcmVkKCkucGlwZShcbiAgICAvLyAgIGZpbHRlcihhY3RpdmUgPT4gYWN0aXZlICE9PSB0aGlzLl9tZW51SXRlbUluc3RhbmNlKSxcbiAgICAvLyAgIGZpbHRlcigoKSA9PiB0aGlzLl9tZW51T3BlbilcbiAgICAvLyApIDogb2YoKVxuICAgIGNvbnN0IGhvdmVyID0gb2YoKVxuXG4gICAgcmV0dXJuIG1lcmdlKGJhY2tkcm9wLCBwYXJlbnRDbG9zZSwgaG92ZXIsIGRldGFjaG1lbnRzKVxuICB9XG5cbn1cbiJdfQ==
249
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudS10b2dnbGUuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvdWktY29tbW9uL21lbnUvbWVudS10b2dnbGUuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQWUsK0JBQStCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQTtBQUM5RixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQTtBQUNwRSxPQUFPLEVBQTBCLE9BQU8sRUFBZ0MsTUFBTSxzQkFBc0IsQ0FBQTtBQUNwRyxPQUFPLEVBQUUsK0JBQStCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQTtBQUN2RSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0scUJBQXFCLENBQUE7QUFDcEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFVLEtBQUssRUFBdUIsZ0JBQWdCLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFDekgsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFBO0FBTzlDLG9EQUFvRDtBQUNwRCxNQUFNLDJCQUEyQixHQUFHLCtCQUErQixDQUFDLEVBQUMsT0FBTyxFQUFFLElBQUksRUFBQyxDQUFDLENBQUE7QUFXcEYsTUFBTSxPQUFPLG1CQUFtQjtJQTRGOUIsb0RBQW9EO0lBQ3BELHFDQUFxQztJQUNyQyxpQ0FBaUM7SUFDakMsSUFBSTtJQUVKLFlBQ1UsV0FBb0MsRUFDcEMsaUJBQW1DLEVBQ25DLFFBQWlCLEVBQ2pCLGFBQTJCO1FBSDNCLGdCQUFXLEdBQVgsV0FBVyxDQUF5QjtRQUNwQyxzQkFBaUIsR0FBakIsaUJBQWlCLENBQWtCO1FBQ25DLGFBQVEsR0FBUixRQUFRLENBQVM7UUFDakIsa0JBQWEsR0FBYixhQUFhLENBQWM7UUFuRzdCLFlBQU8sR0FBRyxLQUFLLENBQUE7UUFFZiw0QkFBdUIsR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFBO1FBQzVDLGdDQUEyQixHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUE7UUFFakQsaUJBQVksR0FBRyxJQUFJLENBQUE7UUFFMUIsdUVBQXVFO1FBQ3ZFLHNFQUFzRTtRQUN0RSxjQUFTLEdBQTZCLElBQUksQ0FBQTtRQVlsQyxlQUFVLEdBQTZCO1lBQzdDO2dCQUNFLE9BQU8sRUFBRSxLQUFLO2dCQUNkLE9BQU8sRUFBRSxRQUFRO2dCQUNqQixRQUFRLEVBQUUsS0FBSztnQkFDZixRQUFRLEVBQUUsS0FBSzthQUNoQjtZQUNEO2dCQUNFLE9BQU8sRUFBRSxPQUFPO2dCQUNoQixPQUFPLEVBQUUsUUFBUTtnQkFDakIsUUFBUSxFQUFFLE9BQU87Z0JBQ2pCLFFBQVEsRUFBRSxLQUFLO2FBQ2hCO1lBQ0Q7Z0JBQ0UsT0FBTyxFQUFFLEtBQUs7Z0JBQ2QsT0FBTyxFQUFFLEtBQUs7Z0JBQ2QsUUFBUSxFQUFFLEtBQUs7Z0JBQ2YsUUFBUSxFQUFFLFFBQVE7YUFDbkI7WUFDRDtnQkFDRSxPQUFPLEVBQUUsT0FBTztnQkFDaEIsT0FBTyxFQUFFLEtBQUs7Z0JBQ2QsUUFBUSxFQUFFLE9BQU87Z0JBQ2pCLFFBQVEsRUFBRSxRQUFRO2FBQ25CO1NBQ0YsQ0FBQTtRQXNFRDs7O1dBR0c7UUFDSyxzQkFBaUIsR0FBRyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLE9BQU8sQ0FBQTtRQWxCeEQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxpQkFBaUIsRUFDaEYsMkJBQTJCLENBQUMsQ0FBQTtJQUNsQyxDQUFDO0lBM0ZELElBQ0ksU0FBUyxDQUFDLEdBQTZCOztRQUN6QyxJQUFJLENBQUMsVUFBVSxHQUFHLEdBQUcsQ0FBQTtRQUNyQixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRTtZQUNuQixNQUFBLElBQUksQ0FBQyxXQUFXLDBDQUFFLHNCQUFzQixDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUE7U0FDbEc7SUFDSCxDQUFDO0lBQ0QsSUFBSSxTQUFTLEtBQUssT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFBLENBQUMsQ0FBQztJQTZCMUMsWUFBWSxDQUFDLEtBQWlCO1FBQzVCLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUMzQyx1RUFBdUU7WUFDdkUsb0VBQW9FO1lBQ3BFLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFBO1lBRXBELDZFQUE2RTtZQUM3RSxxRUFBcUU7WUFDckUsNkNBQTZDO1lBQzdDLGdDQUFnQztZQUNoQyw0QkFBNEI7WUFDNUIsSUFBSTtTQUNMO0lBQ0gsQ0FBQztJQUdELFVBQVUsQ0FBQyxLQUFVOztRQUNuQixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQTtRQUVyQix1Q0FBdUM7UUFDdkMsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQTtRQUU3QixJQUFJLE9BQU8sS0FBSyxRQUFRLElBQUksT0FBTyxLQUFLLFVBQVUsRUFBRTtZQUNsRCxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRTtnQkFDbkIsTUFBQSxJQUFJLENBQUMsY0FBYywwQ0FBRSxjQUFjLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxTQUFTLENBQUMsQ0FBQTthQUNqRTtTQUNGO0lBQ0gsQ0FBQztJQUdELFFBQVEsQ0FBQyxLQUFVO1FBQ2pCLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQTtJQUNmLENBQUM7SUFHRCxrQkFBa0IsQ0FBQyxLQUFVO1FBQzNCLElBQUksS0FBSyxDQUFDLE9BQU8sS0FBSyxNQUFNLEVBQUU7WUFDNUIsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFBO1NBQ2pCO0lBQ0gsQ0FBQztJQWtCRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFBO1FBRWhCLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLG1CQUFtQixDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsaUJBQWlCLEVBQ25GLDJCQUEyQixDQUFDLENBQUE7UUFFaEMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFdBQVcsRUFBRSxDQUFBO1FBQzFDLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxXQUFXLEVBQUUsQ0FBQTtJQUNoRCxDQUFDO0lBUU0sTUFBTTtRQUNYLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNoQixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUE7U0FDakI7YUFBTTtZQUNMLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQTtTQUNoQjtJQUNILENBQUM7SUFFTSxRQUFRO1FBQ2IsSUFBSSxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUFFLE9BQU07U0FBRTtRQUNwRCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQTtRQUVuQixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO1lBQ3RDLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLGFBQWEsRUFBRSxhQUFhO1lBQzVCLGdCQUFnQixFQUFFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQztTQUMxRSxDQUFDLENBQUE7UUFFRixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQTtRQUMzQyxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQ1IsTUFBTSxLQUFLLENBQUMsMEJBQTBCLENBQUMsQ0FBQTtTQUN4QztRQUVELElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLElBQUksY0FBYyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFBO1FBRXhFLElBQUksQ0FBQywyQkFBMkIsR0FBRyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUE7UUFDL0YsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFBO1FBRWhCLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDdEUsMkJBQTJCO1lBQzNCLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQTtRQUNsQixDQUFDLENBQUMsQ0FBQTtRQUVGLG9EQUFvRDtRQUNwRCxvQ0FBb0M7UUFDcEMsS0FBSztJQUNQLENBQUM7SUFFTSxTQUFTOztRQUNkLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQUUsT0FBTTtTQUFFO1FBRTdCLElBQUksTUFBQSxJQUFJLENBQUMsV0FBVywwQ0FBRSxXQUFXLEVBQUUsRUFBRTtZQUNuQyxNQUFBLElBQUksQ0FBQyxXQUFXLDBDQUFFLE1BQU0sRUFBRSxDQUFBO1NBQzNCO1FBRUQsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFBO1FBRWpCLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLG1CQUFtQixDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsaUJBQWlCLEVBQ25GLDJCQUEyQixDQUFDLENBQUE7UUFFaEMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFdBQVcsRUFBRSxDQUFBO1FBQzFDLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxXQUFXLEVBQUUsQ0FBQTtRQUU5QyxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQTtJQUN0QixDQUFDO0lBRU0sUUFBUTs7UUFDYixPQUFPLE1BQUEsQ0FBQyxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLENBQUMsbUNBQUksS0FBSyxDQUFBO0lBQ3RFLENBQUM7SUFFTyxrQkFBa0IsQ0FBQyxNQUFtQjtRQUM1QyxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFO2FBQzlDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQzthQUMzQixhQUFhLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQzthQUM3QixzQkFBc0IsQ0FBQyxLQUFLLENBQUM7YUFDN0IsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFBO1FBRWpCLE9BQU8sZ0JBQWdCLENBQUE7SUFDekIsQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxTQUFzQixTQUFTO1FBQ25DLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUN0QixJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxDQUFBO1NBQ3REO2FBQU07WUFDTCxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQTtTQUN2QztJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSyxTQUFTO1FBQ2YseUZBQXlGO1FBQ3pGLDJDQUEyQztRQUMzQywyQkFBMkI7UUFDM0IsNEJBQTRCO1FBQzVCLGtFQUFrRTtJQUNwRSxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssVUFBVTtRQUNoQiw2QkFBNkI7UUFFN0Isc0VBQXNFO1FBQ3RFLG9FQUFvRTtRQUNwRSxpQ0FBaUM7UUFDakMsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3JCLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFO2dCQUNuQixnRUFBZ0U7Z0JBQ2hFLDBEQUEwRDtnQkFDMUQsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFBO2FBQ2I7WUFDRCxzQ0FBc0M7WUFDdEMsK0JBQStCO1lBQy9CLElBQUk7U0FDTDtRQUVELElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFBO0lBQ3ZCLENBQUM7SUFFRCx3RkFBd0Y7SUFDaEYsbUJBQW1COztRQUN6QixNQUFNLFFBQVEsR0FBRyxNQUFBLE1BQUEsSUFBSSxDQUFDLFdBQVcsMENBQUUsYUFBYSxFQUFFLG1DQUFJLEVBQUUsRUFBRSxDQUFBO1FBQzFELE1BQU0sV0FBVyxHQUFHLE1BQUEsTUFBQSxJQUFJLENBQUMsV0FBVywwQ0FBRSxXQUFXLEVBQUUsbUNBQUksRUFBRSxFQUFFLENBQUE7UUFDM0Qsd0VBQXdFO1FBQ3hFLE1BQU0sV0FBVyxHQUFHLEVBQUUsRUFBRSxDQUFBO1FBQ3hCLHFFQUFxRTtRQUNyRSx5REFBeUQ7UUFDekQsaUNBQWlDO1FBQ2pDLFdBQVc7UUFDWCxNQUFNLEtBQUssR0FBRyxFQUFFLEVBQUUsQ0FBQTtRQUVsQixPQUFPLEtBQUssQ0FBQyxRQUFRLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxXQUFXLENBQUMsQ0FBQTtJQUN6RCxDQUFDOzs7WUF4UUYsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSxrQkFBa0I7Z0JBQzVCLHVEQUF1RDtnQkFDdkQsSUFBSSxFQUFFO29CQUNKLGVBQWUsRUFBRSxNQUFNO29CQUN2QixzQkFBc0IsRUFBRSxvQkFBb0I7aUJBQzdDO2dCQUNELFFBQVEsRUFBRSxnQkFBZ0I7YUFDM0I7OztZQW5CbUIsVUFBVTtZQUFvRCxnQkFBZ0I7WUFIakUsT0FBTztZQUYvQixZQUFZOzs7NkJBc0NsQixLQUFLO3dCQUVMLEtBQUs7MkJBbUNMLFlBQVksU0FBQyxXQUFXLEVBQUUsQ0FBRSxRQUFRLENBQUU7eUJBZ0J0QyxZQUFZLFNBQUMsU0FBUyxFQUFFLENBQUUsUUFBUSxDQUFFO3VCQWNwQyxZQUFZLFNBQUMsT0FBTyxFQUFFLENBQUUsUUFBUSxDQUFFO2lDQUtsQyxZQUFZLFNBQUMsa0JBQWtCLEVBQUUsQ0FBRSxRQUFRLENBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBGb2N1c01vbml0b3IsIEZvY3VzT3JpZ2luLCBpc0Zha2VNb3VzZWRvd25Gcm9tU2NyZWVuUmVhZGVyIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2ExMXknXG5pbXBvcnQgeyBET1dOX0FSUk9XLCBFU0NBUEUsIFVQX0FSUk9XIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2tleWNvZGVzJ1xuaW1wb3J0IHsgQ29ubmVjdGlvblBvc2l0aW9uUGFpciwgT3ZlcmxheSwgT3ZlcmxheVJlZiwgUG9zaXRpb25TdHJhdGVneSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5J1xuaW1wb3J0IHsgbm9ybWFsaXplUGFzc2l2ZUxpc3RlbmVyT3B0aW9ucyB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9wbGF0Zm9ybSdcbmltcG9ydCB7IFRlbXBsYXRlUG9ydGFsIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BvcnRhbCdcbmltcG9ydCB7IERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgSG9zdExpc3RlbmVyLCBJbmplY3QsIElucHV0LCBPbkRlc3Ryb3ksIE9wdGlvbmFsLCBWaWV3Q29udGFpbmVyUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcbmltcG9ydCB7IG1lcmdlLCBvZiwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcydcblxuaW1wb3J0IHsgTWVudUl0ZW1Db21wb25lbnQgfSBmcm9tICcuL21lbnUtaXRlbS5jb21wb25lbnQnXG5pbXBvcnQgeyBJVGhlU2VhbU1lbnVQYW5lbCB9IGZyb20gJy4vbWVudS1wYW5lbCdcbmltcG9ydCB7IFRIRVNFQU1fTUVOVV9QQU5FTCB9IGZyb20gJy4vbWVudS1wYW5lbC10b2tlbidcbmltcG9ydCB7IE1lbnVDb21wb25lbnQgfSBmcm9tICcuL21lbnUuY29tcG9uZW50J1xuXG4vKiogT3B0aW9ucyBmb3IgYmluZGluZyBhIHBhc3NpdmUgZXZlbnQgbGlzdGVuZXIuICovXG5jb25zdCBwYXNzaXZlRXZlbnRMaXN0ZW5lck9wdGlvbnMgPSBub3JtYWxpemVQYXNzaXZlTGlzdGVuZXJPcHRpb25zKHtwYXNzaXZlOiB0cnVlfSlcblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW3NlYW1NZW51VG9nZ2xlXScsXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp1c2UtaG9zdC1wcm9wZXJ0eS1kZWNvcmF0b3JcbiAgaG9zdDoge1xuICAgICdhcmlhLWhhc3BvcHVwJzogJ3RydWUnLFxuICAgICdbYXR0ci5hcmlhLWV4cGFuZGVkXSc6ICdtZW51T3BlbigpIHx8IG51bGwnXG4gIH0sXG4gIGV4cG9ydEFzOiAnc2VhbU1lbnVUb2dnbGUnXG59KVxuZXhwb3J0IGNsYXNzIE1lbnVUb2dnbGVEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuXG4gIHByaXZhdGUgX2FjdGl2ZSA9IGZhbHNlXG4gIHByaXZhdGUgX292ZXJsYXlSZWY/OiBPdmVybGF5UmVmXG4gIHByaXZhdGUgX21lbnVDbG9zZWRTdWJzY3JpcHRpb24gPSBTdWJzY3JpcHRpb24uRU1QVFlcbiAgcHJpdmF0ZSBfY2xvc2luZ0FjdGlvbnNTdWJzY3JpcHRpb24gPSBTdWJzY3JpcHRpb24uRU1QVFlcblxuICBwdWJsaWMgcmVzdG9yZUZvY3VzID0gdHJ1ZVxuXG4gIC8vIFRyYWNraW5nIGlucHV0IHR5cGUgaXMgbmVjZXNzYXJ5IHNvIGl0J3MgcG9zc2libGUgdG8gb25seSBhdXRvLWZvY3VzXG4gIC8vIHRoZSBmaXJzdCBpdGVtIG9mIHRoZSBsaXN0IHdoZW4gdGhlIG1lbnUgaXMgb3BlbmVkIHZpYSB0aGUga2V5Ym9hcmRcbiAgX29wZW5lZEJ5OiAnbW91c2UnIHwgJ3RvdWNoJyB8IG51bGwgPSBudWxsXG5cbiAgQElucHV0KCkgc2VhbU1lbnVUb2dnbGU6IE1lbnVDb21wb25lbnQgfCB1bmRlZmluZWQgfCBudWxsXG5cbiAgQElucHV0KClcbiAgc2V0IHBvc2l0aW9ucyh2YWw6IENvbm5lY3Rpb25Qb3NpdGlvblBhaXJbXSkge1xuICAgIHRoaXMuX3Bvc2l0aW9ucyA9IHZhbFxuICAgIGlmICh0aGlzLm1lbnVPcGVuKCkpIHtcbiAgICAgIHRoaXMuX292ZXJsYXlSZWY/LnVwZGF0ZVBvc2l0aW9uU3RyYXRlZ3kodGhpcy5nZXRPdmVybGF5UG9zaXRpb24odGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KSlcbiAgICB9XG4gIH1cbiAgZ2V0IHBvc2l0aW9ucygpIHsgcmV0dXJuIHRoaXMuX3Bvc2l0aW9ucyB9XG4gIHByaXZhdGUgX3Bvc2l0aW9uczogQ29ubmVjdGlvblBvc2l0aW9uUGFpcltdID0gW1xuICAgIHtcbiAgICAgIG9yaWdpblg6ICdlbmQnLFxuICAgICAgb3JpZ2luWTogJ2JvdHRvbScsXG4gICAgICBvdmVybGF5WDogJ2VuZCcsXG4gICAgICBvdmVybGF5WTogJ3RvcCcsXG4gICAgfSxcbiAgICB7XG4gICAgICBvcmlnaW5YOiAnc3RhcnQnLFxuICAgICAgb3JpZ2luWTogJ2JvdHRvbScsXG4gICAgICBvdmVybGF5WDogJ3N0YXJ0JyxcbiAgICAgIG92ZXJsYXlZOiAndG9wJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIG9yaWdpblg6ICdlbmQnLFxuICAgICAgb3JpZ2luWTogJ3RvcCcsXG4gICAgICBvdmVybGF5WDogJ2VuZCcsXG4gICAgICBvdmVybGF5WTogJ2JvdHRvbScsXG4gICAgfSxcbiAgICB7XG4gICAgICBvcmlnaW5YOiAnc3RhcnQnLFxuICAgICAgb3JpZ2luWTogJ3RvcCcsXG4gICAgICBvdmVybGF5WDogJ3N0YXJ0JyxcbiAgICAgIG92ZXJsYXlZOiAnYm90dG9tJyxcbiAgICB9LFxuICBdXG5cbiAgQEhvc3RMaXN0ZW5lcignbW91c2Vkb3duJywgWyAnJGV2ZW50JyBdKVxuICBfb25Nb3VzZURvd24oZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICBpZiAoIWlzRmFrZU1vdXNlZG93bkZyb21TY3JlZW5SZWFkZXIoZXZlbnQpKSB7XG4gICAgICAvLyBTaW5jZSByaWdodCBvciBtaWRkbGUgYnV0dG9uIGNsaWNrcyB3b24ndCB0cmlnZ2VyIHRoZSBgY2xpY2tgIGV2ZW50LFxuICAgICAgLy8gd2Ugc2hvdWxkbid0IGNvbnNpZGVyIHRoZSBtZW51IGFzIG9wZW5lZCBieSBtb3VzZSBpbiB0aG9zZSBjYXNlcy5cbiAgICAgIHRoaXMuX29wZW5lZEJ5ID0gZXZlbnQuYnV0dG9uID09PSAwID8gJ21vdXNlJyA6IG51bGxcblxuICAgICAgLy8gU2luY2UgY2xpY2tpbmcgb24gdGhlIHRyaWdnZXIgd29uJ3QgY2xvc2UgdGhlIG1lbnUgaWYgaXQgb3BlbnMgYSBzdWItbWVudSxcbiAgICAgIC8vIHdlIHNob3VsZCBwcmV2ZW50IGZvY3VzIGZyb20gbW92aW5nIG9udG8gaXQgdmlhIGNsaWNrIHRvIGF2b2lkIHRoZVxuICAgICAgLy8gaGlnaGxpZ2h0IGZyb20gbGluZ2VyaW5nIG9uIHRoZSBtZW51IGl0ZW0uXG4gICAgICAvLyBpZiAodGhpcy50cmlnZ2Vyc1N1Ym1lbnUoKSkge1xuICAgICAgLy8gICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgLy8gfVxuICAgIH1cbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2tleWRvd24nLCBbICckZXZlbnQnIF0pXG4gIF9vbktleWRvd24oZXZlbnQ6IGFueSkge1xuICAgIHRoaXMuX29wZW5lZEJ5ID0gbnVsbFxuXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOmRlcHJlY2F0aW9uXG4gICAgY29uc3Qga2V5Q29kZSA9IGV2ZW50LmtleUNvZGVcblxuICAgIGlmIChrZXlDb2RlID09PSBVUF9BUlJPVyB8fCBrZXlDb2RlID09PSBET1dOX0FSUk9XKSB7XG4gICAgICBpZiAodGhpcy5tZW51T3BlbigpKSB7XG4gICAgICAgIHRoaXMuc2VhbU1lbnVUb2dnbGU/LmZvY3VzRmlyc3RJdGVtKHRoaXMuX29wZW5lZEJ5IHx8ICdwcm9ncmFtJylcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdjbGljaycsIFsgJyRldmVudCcgXSlcbiAgX29uQ2xpY2soZXZlbnQ6IGFueSkge1xuICAgIHRoaXMudG9nZ2xlKClcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmtleWRvd24nLCBbICckZXZlbnQnIF0pXG4gIF9vbkRvY3VtZW50S2V5ZG93bihldmVudDogYW55KSB7XG4gICAgaWYgKGV2ZW50LmtleUNvZGUgPT09IEVTQ0FQRSkge1xuICAgICAgdGhpcy5jbG9zZU1lbnUoKVxuICAgIH1cbiAgfVxuXG4gIC8vIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50Om1vdXNlZG93bicsIFsgJyRldmVudCcgXSlcbiAgLy8gX29uRG9jdW1lbnRNb3VzZURvd24oZXZlbnQ6IGFueSkge1xuICAvLyAgIGNvbnNvbGUubG9nKCdvdXRzaWRlIGNsaWNrJylcbiAgLy8gfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX2VsZW1lbnRSZWY6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+LFxuICAgIHByaXZhdGUgX3ZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWYsXG4gICAgcHJpdmF0ZSBfb3ZlcmxheTogT3ZlcmxheSxcbiAgICBwcml2YXRlIF9mb2N1c01vbml0b3I6IEZvY3VzTW9uaXRvcixcbiAgICAvLyBASW5qZWN0KFRIRVNFQU1fTUVOVV9QQU5FTCkgQE9wdGlvbmFsKCkgcHJpdmF0ZSBfcGFyZW50TWVudT86IElUaGVTZWFtTWVudVBhbmVsPE1lbnVJdGVtQ29tcG9uZW50PlxuICApIHtcbiAgICB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHRoaXMuX2hhbmRsZVRvdWNoU3RhcnQsXG4gICAgICAgIHBhc3NpdmVFdmVudExpc3RlbmVyT3B0aW9ucylcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuY2xvc2VNZW51KClcblxuICAgIHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgdGhpcy5faGFuZGxlVG91Y2hTdGFydCxcbiAgICAgICAgcGFzc2l2ZUV2ZW50TGlzdGVuZXJPcHRpb25zKVxuXG4gICAgdGhpcy5fbWVudUNsb3NlZFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpXG4gICAgdGhpcy5fY2xvc2luZ0FjdGlvbnNTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgdG91Y2ggc3RhcnQgZXZlbnRzIG9uIHRoZSB0cmlnZ2VyLlxuICAgKiBOZWVkcyB0byBiZSBhbiBhcnJvdyBmdW5jdGlvbiBzbyB3ZSBjYW4gZWFzaWx5IHVzZSBhZGRFdmVudExpc3RlbmVyIGFuZCByZW1vdmVFdmVudExpc3RlbmVyLlxuICAgKi9cbiAgcHJpdmF0ZSBfaGFuZGxlVG91Y2hTdGFydCA9ICgpID0+IHRoaXMuX29wZW5lZEJ5ID0gJ3RvdWNoJ1xuXG4gIHB1YmxpYyB0b2dnbGUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2FjdGl2ZSkge1xuICAgICAgdGhpcy5jbG9zZU1lbnUoKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm9wZW5NZW51KClcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb3Blbk1lbnUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2FjdGl2ZSB8fCAhdGhpcy5zZWFtTWVudVRvZ2dsZSkgeyByZXR1cm4gfVxuICAgIHRoaXMuX2FjdGl2ZSA9IHRydWVcblxuICAgIHRoaXMuX292ZXJsYXlSZWYgPSB0aGlzLl9vdmVybGF5LmNyZWF0ZSh7XG4gICAgICBoYXNCYWNrZHJvcDogdHJ1ZSxcbiAgICAgIGJhY2tkcm9wQ2xhc3M6ICd0cmFuc3BhcmVudCcsXG4gICAgICBwb3NpdGlvblN0cmF0ZWd5OiB0aGlzLmdldE92ZXJsYXlQb3NpdGlvbih0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpLFxuICAgIH0pXG5cbiAgICBjb25zdCB0cGwgPSB0aGlzLnNlYW1NZW51VG9nZ2xlLnRlbXBsYXRlUmVmXG4gICAgaWYgKCF0cGwpIHtcbiAgICAgIHRocm93IEVycm9yKGBNZW51IHRlbXBsYXRlIG5vdCBmb3VuZC5gKVxuICAgIH1cblxuICAgIHRoaXMuX292ZXJsYXlSZWYuYXR0YWNoKG5ldyBUZW1wbGF0ZVBvcnRhbCh0cGwsIHRoaXMuX3ZpZXdDb250YWluZXJSZWYpKVxuXG4gICAgdGhpcy5fY2xvc2luZ0FjdGlvbnNTdWJzY3JpcHRpb24gPSB0aGlzLl9tZW51Q2xvc2luZ0FjdGlvbnMoKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5jbG9zZU1lbnUoKSlcbiAgICB0aGlzLl9pbml0TWVudSgpXG5cbiAgICB0aGlzLl9tZW51Q2xvc2VkU3Vic2NyaXB0aW9uID0gdGhpcy5zZWFtTWVudVRvZ2dsZS5jbG9zZWQuc3Vic2NyaWJlKHYgPT4ge1xuICAgICAgLy8gY29uc29sZS5sb2coJ2Nsb3NlZCcsIHYpXG4gICAgICB0aGlzLmNsb3NlTWVudSgpXG4gICAgfSlcblxuICAgIC8vIHRoaXMuX292ZXJsYXlSZWYuYmFja2Ryb3BDbGljaygpLnN1YnNjcmliZSh2ID0+IHtcbiAgICAvLyAgIGNvbnNvbGUubG9nKCdiYWNrZHJvcENsaWNrJywgdilcbiAgICAvLyB9KVxuICB9XG5cbiAgcHVibGljIGNsb3NlTWVudSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX2FjdGl2ZSkgeyByZXR1cm4gfVxuXG4gICAgaWYgKHRoaXMuX292ZXJsYXlSZWY/Lmhhc0F0dGFjaGVkKCkpIHtcbiAgICAgIHRoaXMuX292ZXJsYXlSZWY/LmRldGFjaCgpXG4gICAgfVxuXG4gICAgdGhpcy5fcmVzZXRNZW51KClcblxuICAgIHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgdGhpcy5faGFuZGxlVG91Y2hTdGFydCxcbiAgICAgICAgcGFzc2l2ZUV2ZW50TGlzdGVuZXJPcHRpb25zKVxuXG4gICAgdGhpcy5fbWVudUNsb3NlZFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpXG4gICAgdGhpcy5fY2xvc2luZ0FjdGlvbnNTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKVxuXG4gICAgdGhpcy5fYWN0aXZlID0gZmFsc2VcbiAgfVxuXG4gIHB1YmxpYyBtZW51T3BlbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKHRoaXMuX292ZXJsYXlSZWYgJiYgdGhpcy5fb3ZlcmxheVJlZi5oYXNBdHRhY2hlZCgpKSA/PyBmYWxzZVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRPdmVybGF5UG9zaXRpb24ob3JpZ2luOiBIVE1MRWxlbWVudCk6IFBvc2l0aW9uU3RyYXRlZ3kge1xuICAgIGNvbnN0IHBvc2l0aW9uU3RyYXRlZ3kgPSB0aGlzLl9vdmVybGF5LnBvc2l0aW9uKClcbiAgICAgIC5mbGV4aWJsZUNvbm5lY3RlZFRvKG9yaWdpbilcbiAgICAgIC53aXRoUG9zaXRpb25zKHRoaXMucG9zaXRpb25zKVxuICAgICAgLndpdGhGbGV4aWJsZURpbWVuc2lvbnMoZmFsc2UpXG4gICAgICAud2l0aFB1c2godHJ1ZSlcblxuICAgIHJldHVybiBwb3NpdGlvblN0cmF0ZWd5XG4gIH1cblxuICAvKipcbiAgICogRm9jdXNlcyB0aGUgbWVudSB0cmlnZ2VyLlxuICAgKiBAcGFyYW0gb3JpZ2luIFNvdXJjZSBvZiB0aGUgbWVudSB0cmlnZ2VyJ3MgZm9jdXMuXG4gICAqL1xuICBmb2N1cyhvcmlnaW46IEZvY3VzT3JpZ2luID0gJ3Byb2dyYW0nKSB7XG4gICAgaWYgKHRoaXMuX2ZvY3VzTW9uaXRvcikge1xuICAgICAgdGhpcy5fZm9jdXNNb25pdG9yLmZvY3VzVmlhKHRoaXMuX2VsZW1lbnRSZWYsIG9yaWdpbilcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmZvY3VzKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBtZXRob2Qgc2V0cyB0aGUgbWVudSBzdGF0ZSB0byBvcGVuIGFuZCBmb2N1c2VzIHRoZSBmaXJzdCBpdGVtIGlmXG4gICAqIHRoZSBtZW51IHdhcyBvcGVuZWQgdmlhIHRoZSBrZXlib2FyZC5cbiAgICovXG4gIHByaXZhdGUgX2luaXRNZW51KCk6IHZvaWQge1xuICAgIC8vIHRoaXMuc2VhbU1lbnVUb2dnbGUucGFyZW50TWVudSA9IHRoaXMudHJpZ2dlcnNTdWJtZW51KCkgPyB0aGlzLl9wYXJlbnRNZW51IDogdW5kZWZpbmVkXG4gICAgLy8gdGhpcy5zZWFtTWVudVRvZ2dsZS5kaXJlY3Rpb24gPSB0aGlzLmRpclxuICAgIC8vIHRoaXMuX3NldE1lbnVFbGV2YXRpb24oKVxuICAgIC8vIHRoaXMuX3NldElzTWVudU9wZW4odHJ1ZSlcbiAgICAvLyB0aGlzLnNlYW1NZW51VG9nZ2xlLmZvY3VzRmlyc3RJdGVtKHRoaXMuX29wZW5lZEJ5IHx8ICdwcm9ncmFtJylcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCByZXNldHMgdGhlIG1lbnUgd2hlbiBpdCdzIGNsb3NlZCwgbW9zdCBpbXBvcnRhbnRseSByZXN0b3JpbmdcbiAgICogZm9jdXMgdG8gdGhlIG1lbnUgdHJpZ2dlciBpZiB0aGUgbWVudSB3YXMgb3BlbmVkIHZpYSB0aGUga2V5Ym9hcmQuXG4gICAqL1xuICBwcml2YXRlIF9yZXNldE1lbnUoKTogdm9pZCB7XG4gICAgLy8gdGhpcy5fc2V0SXNNZW51T3BlbihmYWxzZSlcblxuICAgIC8vIFdlIHNob3VsZCByZXNldCBmb2N1cyBpZiB0aGUgdXNlciBpcyBuYXZpZ2F0aW5nIHVzaW5nIGEga2V5Ym9hcmQgb3JcbiAgICAvLyBpZiB3ZSBoYXZlIGEgdG9wLWxldmVsIHRyaWdnZXIgd2hpY2ggbWlnaHQgY2F1c2UgZm9jdXMgdG8gYmUgbG9zdFxuICAgIC8vIHdoZW4gY2xpY2tpbmcgb24gdGhlIGJhY2tkcm9wLlxuICAgIGlmICh0aGlzLnJlc3RvcmVGb2N1cykge1xuICAgICAgaWYgKCF0aGlzLl9vcGVuZWRCeSkge1xuICAgICAgICAvLyBOb3RlIHRoYXQgdGhlIGZvY3VzIHN0eWxlIHdpbGwgc2hvdyB1cCBib3RoIGZvciBgcHJvZ3JhbWAgYW5kXG4gICAgICAgIC8vIGBrZXlib2FyZGAgc28gd2UgZG9uJ3QgaGF2ZSB0byBzcGVjaWZ5IHdoaWNoIG9uZSBpdCBpcy5cbiAgICAgICAgdGhpcy5mb2N1cygpXG4gICAgICB9XG4gICAgICAvLyBlbHNlIGlmICghdGhpcy50cmlnZ2Vyc1N1Ym1lbnUoKSkge1xuICAgICAgLy8gICB0aGlzLmZvY3VzKHRoaXMuX29wZW5lZEJ5KVxuICAgICAgLy8gfVxuICAgIH1cblxuICAgIHRoaXMuX29wZW5lZEJ5ID0gbnVsbFxuICB9XG5cbiAgLyoqIFJldHVybnMgYSBzdHJlYW0gdGhhdCBlbWl0cyB3aGVuZXZlciBhbiBhY3Rpb24gdGhhdCBzaG91bGQgY2xvc2UgdGhlIG1lbnUgb2NjdXJzLiAqL1xuICBwcml2YXRlIF9tZW51Q2xvc2luZ0FjdGlvbnMoKSB7XG4gICAgY29uc3QgYmFja2Ryb3AgPSB0aGlzLl9vdmVybGF5UmVmPy5iYWNrZHJvcENsaWNrKCkgPz8gb2YoKVxuICAgIGNvbnN0IGRldGFjaG1lbnRzID0gdGhpcy5fb3ZlcmxheVJlZj8uZGV0YWNobWVudHMoKSA/PyBvZigpXG4gICAgLy8gY29uc3QgcGFyZW50Q2xvc2UgPSB0aGlzLl9wYXJlbnRNZW51ID8gdGhpcy5fcGFyZW50TWVudS5jbG9zZWQgOiBvZigpXG4gICAgY29uc3QgcGFyZW50Q2xvc2UgPSBvZigpXG4gICAgLy8gY29uc3QgaG92ZXIgPSB0aGlzLl9wYXJlbnRNZW51ID8gdGhpcy5fcGFyZW50TWVudS5faG92ZXJlZCgpLnBpcGUoXG4gICAgLy8gICBmaWx0ZXIoYWN0aXZlID0+IGFjdGl2ZSAhPT0gdGhpcy5fbWVudUl0ZW1JbnN0YW5jZSksXG4gICAgLy8gICBmaWx0ZXIoKCkgPT4gdGhpcy5fbWVudU9wZW4pXG4gICAgLy8gKSA6IG9mKClcbiAgICBjb25zdCBob3ZlciA9IG9mKClcblxuICAgIHJldHVybiBtZXJnZShiYWNrZHJvcCwgcGFyZW50Q2xvc2UsIGhvdmVyLCBkZXRhY2htZW50cylcbiAgfVxuXG59XG4iXX0=
@@ -0,0 +1,44 @@
1
+ // TODO: Make this more thorough and maybe error on unrecognized.
2
+ export function coerceFeatureCollection(value) {
3
+ return parseValue(value);
4
+ }
5
+ /**
6
+ * Parses the value to a FeatureCollection object or null if it is not a
7
+ * FeatureCollection.
8
+ */
9
+ function parseValue(value) {
10
+ const _value = parseStringValue(value);
11
+ if (isFeatureCollectionValue(_value)) {
12
+ return _value;
13
+ }
14
+ return null;
15
+ }
16
+ /**
17
+ * Tries to parse the value to an object, in case the value is a stringified
18
+ * json.
19
+ */
20
+ function parseStringValue(value) {
21
+ if (typeof value === 'string') {
22
+ try {
23
+ return JSON.parse(value);
24
+ }
25
+ catch (_a) {
26
+ return null;
27
+ }
28
+ }
29
+ return value;
30
+ }
31
+ /**
32
+ * Checks if the value is a FeatureCollection.
33
+ *
34
+ * NOTE: This is not a thorough FeatureCollection check. It only checks that the
35
+ * value is an object resembling a GeoJSON.FeatureCollection, enough for the
36
+ * validator.
37
+ */
38
+ function isFeatureCollectionValue(value) {
39
+ if (value === undefined || value === null) {
40
+ return false;
41
+ }
42
+ return value.type === 'FeatureCollection' && Array.isArray(value.features);
43
+ }
44
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29lcmNlLWZlYXR1cmUtY29sbGVjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3VpLWNvbW1vbi91dGlscy9nZW8tanNvbi9jb2VyY2UtZmVhdHVyZS1jb2xsZWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLGlFQUFpRTtBQUNqRSxNQUFNLFVBQVUsdUJBQXVCLENBQUMsS0FBVTtJQUNoRCxPQUFPLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQTtBQUMxQixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBUyxVQUFVLENBQUMsS0FBVTtJQUM1QixNQUFNLE1BQU0sR0FBRyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUN0QyxJQUFJLHdCQUF3QixDQUFDLE1BQU0sQ0FBQyxFQUFFO1FBQ3BDLE9BQU8sTUFBTSxDQUFBO0tBQ2Q7SUFDRCxPQUFPLElBQUksQ0FBQTtBQUNiLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFTLGdCQUFnQixDQUFDLEtBQVU7SUFDbEMsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUU7UUFDN0IsSUFBSTtZQUNGLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQTtTQUN6QjtRQUFDLFdBQU07WUFDTixPQUFPLElBQUksQ0FBQTtTQUNaO0tBQ0Y7SUFFRCxPQUFPLEtBQUssQ0FBQTtBQUNkLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFTLHdCQUF3QixDQUFDLEtBQVU7SUFDMUMsSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssS0FBSyxJQUFJLEVBQUU7UUFDekMsT0FBTyxLQUFLLENBQUE7S0FDYjtJQUNELE9BQU8sS0FBSyxDQUFDLElBQUksS0FBSyxtQkFBbUIsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQTtBQUM1RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRmVhdHVyZUNvbGxlY3Rpb24gfSBmcm9tICdnZW9qc29uJ1xyXG5cclxuLy8gVE9ETzogTWFrZSB0aGlzIG1vcmUgdGhvcm91Z2ggYW5kIG1heWJlIGVycm9yIG9uIHVucmVjb2duaXplZC5cclxuZXhwb3J0IGZ1bmN0aW9uIGNvZXJjZUZlYXR1cmVDb2xsZWN0aW9uKHZhbHVlOiBhbnkpOiBGZWF0dXJlQ29sbGVjdGlvbiB8IG51bGwge1xyXG4gIHJldHVybiBwYXJzZVZhbHVlKHZhbHVlKVxyXG59XHJcblxyXG4vKipcclxuICogUGFyc2VzIHRoZSB2YWx1ZSB0byBhIEZlYXR1cmVDb2xsZWN0aW9uIG9iamVjdCBvciBudWxsIGlmIGl0IGlzIG5vdCBhXHJcbiAqIEZlYXR1cmVDb2xsZWN0aW9uLlxyXG4gKi9cclxuZnVuY3Rpb24gcGFyc2VWYWx1ZSh2YWx1ZTogYW55KTogRmVhdHVyZUNvbGxlY3Rpb24gfCBudWxsIHtcclxuICBjb25zdCBfdmFsdWUgPSBwYXJzZVN0cmluZ1ZhbHVlKHZhbHVlKVxyXG4gIGlmIChpc0ZlYXR1cmVDb2xsZWN0aW9uVmFsdWUoX3ZhbHVlKSkge1xyXG4gICAgcmV0dXJuIF92YWx1ZVxyXG4gIH1cclxuICByZXR1cm4gbnVsbFxyXG59XHJcblxyXG4vKipcclxuICogVHJpZXMgdG8gcGFyc2UgdGhlIHZhbHVlIHRvIGFuIG9iamVjdCwgaW4gY2FzZSB0aGUgdmFsdWUgaXMgYSBzdHJpbmdpZmllZFxyXG4gKiBqc29uLlxyXG4gKi9cclxuZnVuY3Rpb24gcGFyc2VTdHJpbmdWYWx1ZSh2YWx1ZTogYW55KTogYW55IHtcclxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xyXG4gICAgdHJ5IHtcclxuICAgICAgcmV0dXJuIEpTT04ucGFyc2UodmFsdWUpXHJcbiAgICB9IGNhdGNoIHtcclxuICAgICAgcmV0dXJuIG51bGxcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJldHVybiB2YWx1ZVxyXG59XHJcblxyXG4vKipcclxuICogQ2hlY2tzIGlmIHRoZSB2YWx1ZSBpcyBhIEZlYXR1cmVDb2xsZWN0aW9uLlxyXG4gKlxyXG4gKiBOT1RFOiBUaGlzIGlzIG5vdCBhIHRob3JvdWdoIEZlYXR1cmVDb2xsZWN0aW9uIGNoZWNrLiBJdCBvbmx5IGNoZWNrcyB0aGF0IHRoZVxyXG4gKiB2YWx1ZSBpcyBhbiBvYmplY3QgcmVzZW1ibGluZyBhIEdlb0pTT04uRmVhdHVyZUNvbGxlY3Rpb24sIGVub3VnaCBmb3IgdGhlXHJcbiAqIHZhbGlkYXRvci5cclxuICovXHJcbmZ1bmN0aW9uIGlzRmVhdHVyZUNvbGxlY3Rpb25WYWx1ZSh2YWx1ZTogYW55KTogdmFsdWUgaXMgRmVhdHVyZUNvbGxlY3Rpb24ge1xyXG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsKSB7XHJcbiAgICByZXR1cm4gZmFsc2VcclxuICB9XHJcbiAgcmV0dXJuIHZhbHVlLnR5cGUgPT09ICdGZWF0dXJlQ29sbGVjdGlvbicgJiYgQXJyYXkuaXNBcnJheSh2YWx1ZS5mZWF0dXJlcylcclxufVxyXG4iXX0=
@@ -0,0 +1,11 @@
1
+ import area from '@turf/area';
2
+ import { convertArea } from '@turf/helpers';
3
+ /**
4
+ *
5
+ */
6
+ export function geoJsonToArea(geoJson, units = 'acres') {
7
+ const area_mSqr = area(geoJson);
8
+ const acres = convertArea(area_mSqr, 'meters', units);
9
+ return acres;
10
+ }
11
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VvLWpzb24tdG8tYXJlYS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3VpLWNvbW1vbi91dGlscy9nZW8tanNvbi9nZW8tanNvbi10by1hcmVhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sSUFBSSxNQUFNLFlBQVksQ0FBQTtBQUM3QixPQUFPLEVBQUUsV0FBVyxFQUEyRCxNQUFNLGVBQWUsQ0FBQTtBQUdwRzs7R0FFRztBQUNILE1BQU0sVUFBVSxhQUFhLENBQzNCLE9BQTJGLEVBQzNGLFFBQWUsT0FBTztJQUV0QixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsT0FBYyxDQUFDLENBQUE7SUFDdEMsTUFBTSxLQUFLLEdBQUcsV0FBVyxDQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUE7SUFDckQsT0FBTyxLQUFLLENBQUE7QUFDZCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFyZWEgZnJvbSAnQHR1cmYvYXJlYSdcclxuaW1wb3J0IHsgY29udmVydEFyZWEsIEZlYXR1cmUsIEZlYXR1cmVDb2xsZWN0aW9uLCBHZW9tZXRyeSwgUHJvcGVydGllcywgVW5pdHMgfSBmcm9tICdAdHVyZi9oZWxwZXJzJ1xyXG5pbXBvcnQgeyBHZW9KU09OIH0gZnJvbSAnZ2VvanNvbidcclxuXHJcbi8qKlxyXG4gKlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdlb0pzb25Ub0FyZWEoXHJcbiAgZ2VvSnNvbjogR2VvSlNPTiB8IEZlYXR1cmU8YW55LCBQcm9wZXJ0aWVzPiB8IEZlYXR1cmVDb2xsZWN0aW9uPGFueSwgUHJvcGVydGllcz4gfCBHZW9tZXRyeSxcclxuICB1bml0czogVW5pdHMgPSAnYWNyZXMnXHJcbik6IG51bWJlciB7XHJcbiAgY29uc3QgYXJlYV9tU3FyID0gYXJlYShnZW9Kc29uIGFzIGFueSlcclxuICBjb25zdCBhY3JlcyA9IGNvbnZlcnRBcmVhKGFyZWFfbVNxciwgJ21ldGVycycsIHVuaXRzKVxyXG4gIHJldHVybiBhY3Jlc1xyXG59XHJcbiJdfQ==
@@ -0,0 +1,21 @@
1
+ import { isEmptyInputValue } from '../form/is-empty-input-value';
2
+ import { coerceFeatureCollection } from './coerce-feature-collection';
3
+ export const IS_FEATURE_COLLECTION_VALIDATOR_NAME = 'is-feature-collection';
4
+ export function isFeatureCollectionValidator() {
5
+ return (control) => {
6
+ // Don't need to validate if there isn't a value. Use `Validators.required` for that.
7
+ if (isEmptyInputValue(control.value)) {
8
+ return null; // don't validate empty values to allow optional controls
9
+ }
10
+ const value = coerceFeatureCollection(control.value);
11
+ if (value === null) {
12
+ return {
13
+ [IS_FEATURE_COLLECTION_VALIDATOR_NAME]: {
14
+ reason: `Must be a FeatureCollection.`,
15
+ }
16
+ };
17
+ }
18
+ return null;
19
+ };
20
+ }
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXMtZmVhdHVyZS1jb2xsZWN0aW9uLnZhbGlkYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3VpLWNvbW1vbi91dGlscy9nZW8tanNvbi9pcy1mZWF0dXJlLWNvbGxlY3Rpb24udmFsaWRhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDhCQUE4QixDQUFBO0FBQ2hFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDZCQUE2QixDQUFBO0FBRXJFLE1BQU0sQ0FBQyxNQUFNLG9DQUFvQyxHQUFHLHVCQUF1QixDQUFBO0FBRTNFLE1BQU0sVUFBVSw0QkFBNEI7SUFDMUMsT0FBTyxDQUFDLE9BQXdCLEVBQUUsRUFBRTtRQUNsQyxxRkFBcUY7UUFDckYsSUFBSSxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDcEMsT0FBTyxJQUFJLENBQUEsQ0FBQyx5REFBeUQ7U0FDdEU7UUFFRCxNQUFNLEtBQUssR0FBRyx1QkFBdUIsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUE7UUFFcEQsSUFBSSxLQUFLLEtBQUssSUFBSSxFQUFFO1lBQ2xCLE9BQU87Z0JBQ0wsQ0FBQyxvQ0FBb0MsQ0FBQyxFQUFFO29CQUN0QyxNQUFNLEVBQUUsOEJBQThCO2lCQUN2QzthQUNGLENBQUE7U0FDRjtRQUVELE9BQU8sSUFBSSxDQUFBO0lBQ2IsQ0FBQyxDQUFBO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgVmFsaWRhdG9yRm4gfSBmcm9tICdAYW5ndWxhci9mb3JtcydcclxuXHJcbmltcG9ydCB7IGlzRW1wdHlJbnB1dFZhbHVlIH0gZnJvbSAnLi4vZm9ybS9pcy1lbXB0eS1pbnB1dC12YWx1ZSdcclxuaW1wb3J0IHsgY29lcmNlRmVhdHVyZUNvbGxlY3Rpb24gfSBmcm9tICcuL2NvZXJjZS1mZWF0dXJlLWNvbGxlY3Rpb24nXHJcblxyXG5leHBvcnQgY29uc3QgSVNfRkVBVFVSRV9DT0xMRUNUSU9OX1ZBTElEQVRPUl9OQU1FID0gJ2lzLWZlYXR1cmUtY29sbGVjdGlvbidcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpc0ZlYXR1cmVDb2xsZWN0aW9uVmFsaWRhdG9yKCk6IFZhbGlkYXRvckZuIHtcclxuICByZXR1cm4gKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCkgPT4ge1xyXG4gICAgLy8gRG9uJ3QgbmVlZCB0byB2YWxpZGF0ZSBpZiB0aGVyZSBpc24ndCBhIHZhbHVlLiBVc2UgYFZhbGlkYXRvcnMucmVxdWlyZWRgIGZvciB0aGF0LlxyXG4gICAgaWYgKGlzRW1wdHlJbnB1dFZhbHVlKGNvbnRyb2wudmFsdWUpKSB7XHJcbiAgICAgIHJldHVybiBudWxsIC8vIGRvbid0IHZhbGlkYXRlIGVtcHR5IHZhbHVlcyB0byBhbGxvdyBvcHRpb25hbCBjb250cm9sc1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHZhbHVlID0gY29lcmNlRmVhdHVyZUNvbGxlY3Rpb24oY29udHJvbC52YWx1ZSlcclxuXHJcbiAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBbSVNfRkVBVFVSRV9DT0xMRUNUSU9OX1ZBTElEQVRPUl9OQU1FXToge1xyXG4gICAgICAgICAgcmVhc29uOiBgTXVzdCBiZSBhIEZlYXR1cmVDb2xsZWN0aW9uLmAsXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG51bGxcclxuICB9XHJcbn1cclxuIl19
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Returns true if the GeoJSON is only specifies geometries.
3
+ */
4
+ export function isOnlyGeometryTypes(featureCollection, types) {
5
+ if (types.length === 0) {
6
+ if (featureCollection.features.length > 0) {
7
+ // If no types are specified then there can't be any specified types found.
8
+ return false;
9
+ }
10
+ else {
11
+ // If no types are specified and there are no features then there is
12
+ // nothing to say a specified type isn't found.
13
+ return true;
14
+ }
15
+ }
16
+ for (const f of featureCollection.features) {
17
+ if (types.indexOf(f.geometry.type) === -1) {
18
+ return false;
19
+ }
20
+ }
21
+ return true;
22
+ }
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXMtb25seS1nZW9tZXRyeS10eXBlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3VpLWNvbW1vbi91dGlscy9nZW8tanNvbi9pcy1vbmx5LWdlb21ldHJ5LXR5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBOztHQUVHO0FBQ0gsTUFBTSxVQUFVLG1CQUFtQixDQUFDLGlCQUFvQyxFQUFFLEtBQXlCO0lBQ2pHLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDdEIsSUFBSSxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUN6QywyRUFBMkU7WUFDM0UsT0FBTyxLQUFLLENBQUE7U0FDYjthQUFNO1lBQ0wsb0VBQW9FO1lBQ3BFLCtDQUErQztZQUMvQyxPQUFPLElBQUksQ0FBQTtTQUNaO0tBQ0Y7SUFFRCxLQUFLLE1BQU0sQ0FBQyxJQUFJLGlCQUFpQixDQUFDLFFBQVEsRUFBRTtRQUMxQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTtZQUN6QyxPQUFPLEtBQUssQ0FBQTtTQUNiO0tBQ0Y7SUFFRCxPQUFPLElBQUksQ0FBQTtBQUNiLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBGZWF0dXJlQ29sbGVjdGlvbiwgR2VvbWV0cnkgfSBmcm9tICdnZW9qc29uJ1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgR2VvSlNPTiBpcyBvbmx5IHNwZWNpZmllcyBnZW9tZXRyaWVzLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGlzT25seUdlb21ldHJ5VHlwZXMoZmVhdHVyZUNvbGxlY3Rpb246IEZlYXR1cmVDb2xsZWN0aW9uLCB0eXBlczogR2VvbWV0cnlbJ3R5cGUnXVtdKTogYm9vbGVhbiB7XHJcbiAgaWYgKHR5cGVzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgaWYgKGZlYXR1cmVDb2xsZWN0aW9uLmZlYXR1cmVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgLy8gSWYgbm8gdHlwZXMgYXJlIHNwZWNpZmllZCB0aGVuIHRoZXJlIGNhbid0IGJlIGFueSBzcGVjaWZpZWQgdHlwZXMgZm91bmQuXHJcbiAgICAgIHJldHVybiBmYWxzZVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gSWYgbm8gdHlwZXMgYXJlIHNwZWNpZmllZCBhbmQgdGhlcmUgYXJlIG5vIGZlYXR1cmVzIHRoZW4gdGhlcmUgaXNcclxuICAgICAgLy8gbm90aGluZyB0byBzYXkgYSBzcGVjaWZpZWQgdHlwZSBpc24ndCBmb3VuZC5cclxuICAgICAgcmV0dXJuIHRydWVcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGZvciAoY29uc3QgZiBvZiBmZWF0dXJlQ29sbGVjdGlvbi5mZWF0dXJlcykge1xyXG4gICAgaWYgKHR5cGVzLmluZGV4T2YoZi5nZW9tZXRyeS50eXBlKSA9PT0gLTEpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZXR1cm4gdHJ1ZVxyXG59XHJcbiJdfQ==
@@ -0,0 +1,32 @@
1
+ import { isEmptyInputValue } from '../form/is-empty-input-value';
2
+ import { coerceFeatureCollection } from './coerce-feature-collection';
3
+ import { isOnlyGeometryTypes } from './is-only-geometry-types';
4
+ export const IS_ONLY_GEOMETRY_TYPES_VALIDATOR_NAME = 'is-only-geometry-types';
5
+ export function isOnlyGeometryTypesValidator(types) {
6
+ return (control) => {
7
+ // Don't need to validate if there isn't a value. Use `Validators.required` for that.
8
+ if (isEmptyInputValue(control.value)) {
9
+ return null; // don't validate empty values to allow optional controls
10
+ }
11
+ const value = coerceFeatureCollection(control.value);
12
+ if (value === null) {
13
+ // If there isn't a FeatureCollection then there is nothing to validate.
14
+ // Use 'isFeatureCollection' to validate the value is a FeatureCollection.
15
+ return null;
16
+ }
17
+ if (!isOnlyGeometryTypes(value, types)) {
18
+ const typesNotAllowed = value.features
19
+ .map(f => f.geometry.type)
20
+ .filter(t => types.indexOf(t) === -1);
21
+ const distinctTypesNotAllowed = Array.from(new Set(typesNotAllowed));
22
+ return {
23
+ [IS_ONLY_GEOMETRY_TYPES_VALIDATOR_NAME]: {
24
+ reason: `Only geometry type${(types.length === 1 ? '' : 's')} ${types.join(', ')} allowed.`,
25
+ notAllowedGeometryTypesFound: distinctTypesNotAllowed,
26
+ }
27
+ };
28
+ }
29
+ return null;
30
+ };
31
+ }
32
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXMtb25seS1nZW9tZXRyeS10eXBlcy52YWxpZGF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy91aS1jb21tb24vdXRpbHMvZ2VvLWpzb24vaXMtb25seS1nZW9tZXRyeS10eXBlcy52YWxpZGF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBSUEsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sOEJBQThCLENBQUE7QUFDaEUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sNkJBQTZCLENBQUE7QUFDckUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMEJBQTBCLENBQUE7QUFFOUQsTUFBTSxDQUFDLE1BQU0scUNBQXFDLEdBQUcsd0JBQXdCLENBQUE7QUFFN0UsTUFBTSxVQUFVLDRCQUE0QixDQUFDLEtBQXlCO0lBQ3BFLE9BQU8sQ0FBQyxPQUF3QixFQUFFLEVBQUU7UUFDbEMscUZBQXFGO1FBQ3JGLElBQUksaUJBQWlCLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ3BDLE9BQU8sSUFBSSxDQUFBLENBQUMseURBQXlEO1NBQ3RFO1FBRUQsTUFBTSxLQUFLLEdBQUcsdUJBQXVCLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBRXBELElBQUksS0FBSyxLQUFLLElBQUksRUFBRTtZQUNsQix3RUFBd0U7WUFDeEUsMEVBQTBFO1lBQzFFLE9BQU8sSUFBSSxDQUFBO1NBQ1o7UUFFRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxFQUFFO1lBQ3RDLE1BQU0sZUFBZSxHQUFHLEtBQUssQ0FBQyxRQUFRO2lCQUNuQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztpQkFDekIsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFBO1lBQ3ZDLE1BQU0sdUJBQXVCLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFBO1lBQ3BFLE9BQU87Z0JBQ0wsQ0FBQyxxQ0FBcUMsQ0FBQyxFQUFFO29CQUN2QyxNQUFNLEVBQUUscUJBQXFCLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVztvQkFDM0YsNEJBQTRCLEVBQUUsdUJBQXVCO2lCQUN0RDthQUNGLENBQUE7U0FDRjtRQUVELE9BQU8sSUFBSSxDQUFBO0lBQ2IsQ0FBQyxDQUFBO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgVmFsaWRhdG9yRm4gfSBmcm9tICdAYW5ndWxhci9mb3JtcydcclxuXHJcbmltcG9ydCB7IEdlb21ldHJ5IH0gZnJvbSAnZ2VvanNvbidcclxuXHJcbmltcG9ydCB7IGlzRW1wdHlJbnB1dFZhbHVlIH0gZnJvbSAnLi4vZm9ybS9pcy1lbXB0eS1pbnB1dC12YWx1ZSdcclxuaW1wb3J0IHsgY29lcmNlRmVhdHVyZUNvbGxlY3Rpb24gfSBmcm9tICcuL2NvZXJjZS1mZWF0dXJlLWNvbGxlY3Rpb24nXHJcbmltcG9ydCB7IGlzT25seUdlb21ldHJ5VHlwZXMgfSBmcm9tICcuL2lzLW9ubHktZ2VvbWV0cnktdHlwZXMnXHJcblxyXG5leHBvcnQgY29uc3QgSVNfT05MWV9HRU9NRVRSWV9UWVBFU19WQUxJREFUT1JfTkFNRSA9ICdpcy1vbmx5LWdlb21ldHJ5LXR5cGVzJ1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGlzT25seUdlb21ldHJ5VHlwZXNWYWxpZGF0b3IodHlwZXM6IEdlb21ldHJ5Wyd0eXBlJ11bXSk6IFZhbGlkYXRvckZuIHtcclxuICByZXR1cm4gKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCkgPT4ge1xyXG4gICAgLy8gRG9uJ3QgbmVlZCB0byB2YWxpZGF0ZSBpZiB0aGVyZSBpc24ndCBhIHZhbHVlLiBVc2UgYFZhbGlkYXRvcnMucmVxdWlyZWRgIGZvciB0aGF0LlxyXG4gICAgaWYgKGlzRW1wdHlJbnB1dFZhbHVlKGNvbnRyb2wudmFsdWUpKSB7XHJcbiAgICAgIHJldHVybiBudWxsIC8vIGRvbid0IHZhbGlkYXRlIGVtcHR5IHZhbHVlcyB0byBhbGxvdyBvcHRpb25hbCBjb250cm9sc1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHZhbHVlID0gY29lcmNlRmVhdHVyZUNvbGxlY3Rpb24oY29udHJvbC52YWx1ZSlcclxuXHJcbiAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcclxuICAgICAgLy8gSWYgdGhlcmUgaXNuJ3QgYSBGZWF0dXJlQ29sbGVjdGlvbiB0aGVuIHRoZXJlIGlzIG5vdGhpbmcgdG8gdmFsaWRhdGUuXHJcbiAgICAgIC8vIFVzZSAnaXNGZWF0dXJlQ29sbGVjdGlvbicgdG8gdmFsaWRhdGUgdGhlIHZhbHVlIGlzIGEgRmVhdHVyZUNvbGxlY3Rpb24uXHJcbiAgICAgIHJldHVybiBudWxsXHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFpc09ubHlHZW9tZXRyeVR5cGVzKHZhbHVlLCB0eXBlcykpIHtcclxuICAgICAgY29uc3QgdHlwZXNOb3RBbGxvd2VkID0gdmFsdWUuZmVhdHVyZXNcclxuICAgICAgICAubWFwKGYgPT4gZi5nZW9tZXRyeS50eXBlKVxyXG4gICAgICAgIC5maWx0ZXIodCA9PiB0eXBlcy5pbmRleE9mKHQpID09PSAtMSlcclxuICAgICAgY29uc3QgZGlzdGluY3RUeXBlc05vdEFsbG93ZWQgPSBBcnJheS5mcm9tKG5ldyBTZXQodHlwZXNOb3RBbGxvd2VkKSlcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBbSVNfT05MWV9HRU9NRVRSWV9UWVBFU19WQUxJREFUT1JfTkFNRV06IHtcclxuICAgICAgICAgIHJlYXNvbjogYE9ubHkgZ2VvbWV0cnkgdHlwZSR7KHR5cGVzLmxlbmd0aCA9PT0gMSA/ICcnIDogJ3MnKX0gJHt0eXBlcy5qb2luKCcsICcpfSBhbGxvd2VkLmAsXHJcbiAgICAgICAgICBub3RBbGxvd2VkR2VvbWV0cnlUeXBlc0ZvdW5kOiBkaXN0aW5jdFR5cGVzTm90QWxsb3dlZCxcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbnVsbFxyXG4gIH1cclxufVxyXG5cclxuXHJcbiJdfQ==
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Merge Polygon and MultiPolygon geometries into a single MultiPolygon. Any
3
+ * properties, other than 'coordinates', of the Polygons and MultiPolygons will
4
+ * be lost.
5
+ *
6
+ * NOTE: Polygons and MultPolygons in a GeometryCollection will not be merged.
7
+ */
8
+ export function mergePolygons(featureCollection) {
9
+ const multiPolygon = {
10
+ type: 'MultiPolygon',
11
+ coordinates: [],
12
+ };
13
+ for (let i = 0; i < featureCollection.features.length; i++) {
14
+ const f = featureCollection.features[i];
15
+ if (f.geometry.type === 'Polygon') {
16
+ multiPolygon.coordinates.push(f.geometry.coordinates);
17
+ featureCollection.features.splice(i, 1);
18
+ i--;
19
+ }
20
+ else if (f.geometry.type === 'MultiPolygon') {
21
+ multiPolygon.coordinates.push(...f.geometry.coordinates);
22
+ featureCollection.features.splice(i, 1);
23
+ i--;
24
+ }
25
+ }
26
+ if (multiPolygon.coordinates.length > 0) {
27
+ const feature = {
28
+ type: 'Feature',
29
+ geometry: multiPolygon,
30
+ properties: {},
31
+ };
32
+ featureCollection.features.push(feature);
33
+ }
34
+ }
35
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVyZ2UtcG9seWdvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy91aS1jb21tb24vdXRpbHMvZ2VvLWpzb24vbWVyZ2UtcG9seWdvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBTUE7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLGFBQWEsQ0FBQyxpQkFBb0M7SUFDaEUsTUFBTSxZQUFZLEdBQWlCO1FBQ2pDLElBQUksRUFBRSxjQUFjO1FBQ3BCLFdBQVcsRUFBRSxFQUFFO0tBQ2hCLENBQUE7SUFFRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsaUJBQWlCLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUMxRCxNQUFNLENBQUMsR0FBRyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDdkMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksS0FBSyxTQUFTLEVBQUU7WUFDakMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQTtZQUNyRCxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTtZQUN2QyxDQUFDLEVBQUUsQ0FBQTtTQUNKO2FBQU0sSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksS0FBSyxjQUFjLEVBQUU7WUFDN0MsWUFBWSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFBO1lBQ3hELGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO1lBQ3ZDLENBQUMsRUFBRSxDQUFBO1NBQ0o7S0FDRjtJQUVELElBQUksWUFBWSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1FBQ3ZDLE1BQU0sT0FBTyxHQUFZO1lBQ3ZCLElBQUksRUFBRSxTQUFTO1lBQ2YsUUFBUSxFQUFFLFlBQVk7WUFDdEIsVUFBVSxFQUFFLEVBQUc7U0FDaEIsQ0FBQTtRQUNELGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUE7S0FDekM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBGZWF0dXJlLFxyXG4gIEZlYXR1cmVDb2xsZWN0aW9uLFxyXG4gIE11bHRpUG9seWdvbixcclxufSBmcm9tICdnZW9qc29uJ1xyXG5cclxuLyoqXHJcbiAqIE1lcmdlIFBvbHlnb24gYW5kIE11bHRpUG9seWdvbiBnZW9tZXRyaWVzIGludG8gYSBzaW5nbGUgTXVsdGlQb2x5Z29uLiBBbnlcclxuICogcHJvcGVydGllcywgb3RoZXIgdGhhbiAnY29vcmRpbmF0ZXMnLCBvZiB0aGUgUG9seWdvbnMgYW5kIE11bHRpUG9seWdvbnMgd2lsbFxyXG4gKiBiZSBsb3N0LlxyXG4gKlxyXG4gKiBOT1RFOiBQb2x5Z29ucyBhbmQgTXVsdFBvbHlnb25zIGluIGEgR2VvbWV0cnlDb2xsZWN0aW9uIHdpbGwgbm90IGJlIG1lcmdlZC5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBtZXJnZVBvbHlnb25zKGZlYXR1cmVDb2xsZWN0aW9uOiBGZWF0dXJlQ29sbGVjdGlvbik6IHZvaWQge1xyXG4gIGNvbnN0IG11bHRpUG9seWdvbjogTXVsdGlQb2x5Z29uID0ge1xyXG4gICAgdHlwZTogJ011bHRpUG9seWdvbicsXHJcbiAgICBjb29yZGluYXRlczogW10sXHJcbiAgfVxyXG5cclxuICBmb3IgKGxldCBpID0gMDsgaSA8IGZlYXR1cmVDb2xsZWN0aW9uLmZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICBjb25zdCBmID0gZmVhdHVyZUNvbGxlY3Rpb24uZmVhdHVyZXNbaV1cclxuICAgIGlmIChmLmdlb21ldHJ5LnR5cGUgPT09ICdQb2x5Z29uJykge1xyXG4gICAgICBtdWx0aVBvbHlnb24uY29vcmRpbmF0ZXMucHVzaChmLmdlb21ldHJ5LmNvb3JkaW5hdGVzKVxyXG4gICAgICBmZWF0dXJlQ29sbGVjdGlvbi5mZWF0dXJlcy5zcGxpY2UoaSwgMSlcclxuICAgICAgaS0tXHJcbiAgICB9IGVsc2UgaWYgKGYuZ2VvbWV0cnkudHlwZSA9PT0gJ011bHRpUG9seWdvbicpIHtcclxuICAgICAgbXVsdGlQb2x5Z29uLmNvb3JkaW5hdGVzLnB1c2goLi4uZi5nZW9tZXRyeS5jb29yZGluYXRlcylcclxuICAgICAgZmVhdHVyZUNvbGxlY3Rpb24uZmVhdHVyZXMuc3BsaWNlKGksIDEpXHJcbiAgICAgIGktLVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaWYgKG11bHRpUG9seWdvbi5jb29yZGluYXRlcy5sZW5ndGggPiAwKSB7XHJcbiAgICBjb25zdCBmZWF0dXJlOiBGZWF0dXJlID0ge1xyXG4gICAgICB0eXBlOiAnRmVhdHVyZScsXHJcbiAgICAgIGdlb21ldHJ5OiBtdWx0aVBvbHlnb24sXHJcbiAgICAgIHByb3BlcnRpZXM6IHsgfSxcclxuICAgIH1cclxuICAgIGZlYXR1cmVDb2xsZWN0aW9uLmZlYXR1cmVzLnB1c2goZmVhdHVyZSlcclxuICB9XHJcbn1cclxuIl19
@@ -0,0 +1,63 @@
1
+ import { isEmptyInputValue } from '../form/is-empty-input-value';
2
+ import { coerceFeatureCollection } from './coerce-feature-collection';
3
+ export const NO_INNER_RINGS_VALIDATOR_NAME = 'no-inner-rings';
4
+ /**
5
+ * Validates that a FeatureCollection does not contain any Polygon with inner
6
+ * rings("holes").
7
+ *
8
+ * NOTE: Only considers Polygon and MultiPolygon. Does not consider
9
+ * GeometryCollection.
10
+ */
11
+ export function noInnerRingsValidator() {
12
+ return (control) => {
13
+ // Don't need to validate if there isn't a value. Use `Validators.required` for that.
14
+ if (isEmptyInputValue(control.value)) {
15
+ return null; // don't validate empty values to allow optional controls
16
+ }
17
+ const value = coerceFeatureCollection(control.value);
18
+ if (value === null) {
19
+ // If there isn't a FeatureCollection then there is nothing to validate.
20
+ // Use 'isFeatureCollection' to validate the value is a FeatureCollection.
21
+ return null;
22
+ }
23
+ if (hasInnerRing(value)) {
24
+ return {
25
+ [NO_INNER_RINGS_VALIDATOR_NAME]: {
26
+ reason: `A shape cannot have an inner ring.`
27
+ }
28
+ };
29
+ }
30
+ return null;
31
+ };
32
+ }
33
+ /**
34
+ * Checks if a FeatureCollection contains any geometries with an inner
35
+ * ring("hole").
36
+ *
37
+ * NOTE: Does not consider GeometryCollection.
38
+ */
39
+ function hasInnerRing(featureCollection) {
40
+ for (const f of featureCollection.features) {
41
+ // The spec says the right-hand rule must be followed, but also specifies
42
+ // that tools should not reject polygons that do not follow the right-hand
43
+ // rule. It does specify that the first ring must be the exterior ring and
44
+ // the others must be the interior. So, this should be safe to just check
45
+ // if there are multiple rings, instead of checking their winding orders.
46
+ //
47
+ // Polygon spec: https://datatracker.ietf.org/doc/html/rfc7946#section-3.1.6
48
+ if (f.geometry.type === 'Polygon') {
49
+ if (f.geometry.coordinates.length > 1) {
50
+ return true;
51
+ }
52
+ }
53
+ else if (f.geometry.type === 'MultiPolygon') {
54
+ for (const coords of f.geometry.coordinates) {
55
+ if (coords.length > 1) {
56
+ return true;
57
+ }
58
+ }
59
+ }
60
+ }
61
+ return false;
62
+ }
63
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm8taW5uZXItcmluZ3MudmFsaWRhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdWktY29tbW9uL3V0aWxzL2dlby1qc29uL25vLWlubmVyLXJpbmdzLnZhbGlkYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFJQSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQTtBQUNoRSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQTtBQUVyRSxNQUFNLENBQUMsTUFBTSw2QkFBNkIsR0FBRyxnQkFBZ0IsQ0FBQTtBQUU3RDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUscUJBQXFCO0lBQ25DLE9BQU8sQ0FBQyxPQUF3QixFQUFFLEVBQUU7UUFDbEMscUZBQXFGO1FBQ3JGLElBQUksaUJBQWlCLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ3BDLE9BQU8sSUFBSSxDQUFBLENBQUMseURBQXlEO1NBQ3RFO1FBRUQsTUFBTSxLQUFLLEdBQUcsdUJBQXVCLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBRXBELElBQUksS0FBSyxLQUFLLElBQUksRUFBRTtZQUNsQix3RUFBd0U7WUFDeEUsMEVBQTBFO1lBQzFFLE9BQU8sSUFBSSxDQUFBO1NBQ1o7UUFFRCxJQUFJLFlBQVksQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUN2QixPQUFPO2dCQUNMLENBQUMsNkJBQTZCLENBQUMsRUFBRTtvQkFDL0IsTUFBTSxFQUFFLG9DQUFvQztpQkFDN0M7YUFDRixDQUFBO1NBQ0Y7UUFFRCxPQUFPLElBQUksQ0FBQTtJQUNiLENBQUMsQ0FBQTtBQUNILENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsWUFBWSxDQUFDLGlCQUFvQztJQUN4RCxLQUFLLE1BQU0sQ0FBQyxJQUFJLGlCQUFpQixDQUFDLFFBQVEsRUFBRTtRQUMxQyx5RUFBeUU7UUFDekUsMEVBQTBFO1FBQzFFLDBFQUEwRTtRQUMxRSx5RUFBeUU7UUFDekUseUVBQXlFO1FBQ3pFLEVBQUU7UUFDRiw0RUFBNEU7UUFDNUUsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksS0FBSyxTQUFTLEVBQUU7WUFDakMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUNyQyxPQUFPLElBQUksQ0FBQTthQUNaO1NBQ0Y7YUFBTSxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxLQUFLLGNBQWMsRUFBRTtZQUM3QyxLQUFLLE1BQU0sTUFBTSxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFO2dCQUMzQyxJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO29CQUNyQixPQUFPLElBQUksQ0FBQTtpQkFDWjthQUNGO1NBQ0Y7S0FDRjtJQUVELE9BQU8sS0FBSyxDQUFBO0FBQ2QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgVmFsaWRhdG9yRm4gfSBmcm9tICdAYW5ndWxhci9mb3JtcydcclxuXHJcbmltcG9ydCB7IEZlYXR1cmVDb2xsZWN0aW9uIH0gZnJvbSAnZ2VvanNvbidcclxuXHJcbmltcG9ydCB7IGlzRW1wdHlJbnB1dFZhbHVlIH0gZnJvbSAnLi4vZm9ybS9pcy1lbXB0eS1pbnB1dC12YWx1ZSdcclxuaW1wb3J0IHsgY29lcmNlRmVhdHVyZUNvbGxlY3Rpb24gfSBmcm9tICcuL2NvZXJjZS1mZWF0dXJlLWNvbGxlY3Rpb24nXHJcblxyXG5leHBvcnQgY29uc3QgTk9fSU5ORVJfUklOR1NfVkFMSURBVE9SX05BTUUgPSAnbm8taW5uZXItcmluZ3MnXHJcblxyXG4vKipcclxuICogVmFsaWRhdGVzIHRoYXQgYSBGZWF0dXJlQ29sbGVjdGlvbiBkb2VzIG5vdCBjb250YWluIGFueSBQb2x5Z29uIHdpdGggaW5uZXJcclxuICogcmluZ3MoXCJob2xlc1wiKS5cclxuICpcclxuICogTk9URTogT25seSBjb25zaWRlcnMgUG9seWdvbiBhbmQgTXVsdGlQb2x5Z29uLiBEb2VzIG5vdCBjb25zaWRlclxyXG4gKiBHZW9tZXRyeUNvbGxlY3Rpb24uXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gbm9Jbm5lclJpbmdzVmFsaWRhdG9yKCk6IFZhbGlkYXRvckZuIHtcclxuICByZXR1cm4gKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCkgPT4ge1xyXG4gICAgLy8gRG9uJ3QgbmVlZCB0byB2YWxpZGF0ZSBpZiB0aGVyZSBpc24ndCBhIHZhbHVlLiBVc2UgYFZhbGlkYXRvcnMucmVxdWlyZWRgIGZvciB0aGF0LlxyXG4gICAgaWYgKGlzRW1wdHlJbnB1dFZhbHVlKGNvbnRyb2wudmFsdWUpKSB7XHJcbiAgICAgIHJldHVybiBudWxsIC8vIGRvbid0IHZhbGlkYXRlIGVtcHR5IHZhbHVlcyB0byBhbGxvdyBvcHRpb25hbCBjb250cm9sc1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHZhbHVlID0gY29lcmNlRmVhdHVyZUNvbGxlY3Rpb24oY29udHJvbC52YWx1ZSlcclxuXHJcbiAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcclxuICAgICAgLy8gSWYgdGhlcmUgaXNuJ3QgYSBGZWF0dXJlQ29sbGVjdGlvbiB0aGVuIHRoZXJlIGlzIG5vdGhpbmcgdG8gdmFsaWRhdGUuXHJcbiAgICAgIC8vIFVzZSAnaXNGZWF0dXJlQ29sbGVjdGlvbicgdG8gdmFsaWRhdGUgdGhlIHZhbHVlIGlzIGEgRmVhdHVyZUNvbGxlY3Rpb24uXHJcbiAgICAgIHJldHVybiBudWxsXHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGhhc0lubmVyUmluZyh2YWx1ZSkpIHtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBbTk9fSU5ORVJfUklOR1NfVkFMSURBVE9SX05BTUVdOiB7XHJcbiAgICAgICAgICByZWFzb246IGBBIHNoYXBlIGNhbm5vdCBoYXZlIGFuIGlubmVyIHJpbmcuYFxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBudWxsXHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogQ2hlY2tzIGlmIGEgRmVhdHVyZUNvbGxlY3Rpb24gY29udGFpbnMgYW55IGdlb21ldHJpZXMgd2l0aCBhbiBpbm5lclxyXG4gKiByaW5nKFwiaG9sZVwiKS5cclxuICpcclxuICogTk9URTogRG9lcyBub3QgY29uc2lkZXIgR2VvbWV0cnlDb2xsZWN0aW9uLlxyXG4gKi9cclxuZnVuY3Rpb24gaGFzSW5uZXJSaW5nKGZlYXR1cmVDb2xsZWN0aW9uOiBGZWF0dXJlQ29sbGVjdGlvbik6IGJvb2xlYW4ge1xyXG4gIGZvciAoY29uc3QgZiBvZiBmZWF0dXJlQ29sbGVjdGlvbi5mZWF0dXJlcykge1xyXG4gICAgLy8gVGhlIHNwZWMgc2F5cyB0aGUgcmlnaHQtaGFuZCBydWxlIG11c3QgYmUgZm9sbG93ZWQsIGJ1dCBhbHNvIHNwZWNpZmllc1xyXG4gICAgLy8gdGhhdCB0b29scyBzaG91bGQgbm90IHJlamVjdCBwb2x5Z29ucyB0aGF0IGRvIG5vdCBmb2xsb3cgdGhlIHJpZ2h0LWhhbmRcclxuICAgIC8vIHJ1bGUuIEl0IGRvZXMgc3BlY2lmeSB0aGF0IHRoZSBmaXJzdCByaW5nIG11c3QgYmUgdGhlIGV4dGVyaW9yIHJpbmcgYW5kXHJcbiAgICAvLyB0aGUgb3RoZXJzIG11c3QgYmUgdGhlIGludGVyaW9yLiBTbywgdGhpcyBzaG91bGQgYmUgc2FmZSB0byBqdXN0IGNoZWNrXHJcbiAgICAvLyBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgcmluZ3MsIGluc3RlYWQgb2YgY2hlY2tpbmcgdGhlaXIgd2luZGluZyBvcmRlcnMuXHJcbiAgICAvL1xyXG4gICAgLy8gUG9seWdvbiBzcGVjOiBodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzc5NDYjc2VjdGlvbi0zLjEuNlxyXG4gICAgaWYgKGYuZ2VvbWV0cnkudHlwZSA9PT0gJ1BvbHlnb24nKSB7XHJcbiAgICAgIGlmIChmLmdlb21ldHJ5LmNvb3JkaW5hdGVzLmxlbmd0aCA+IDEpIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKGYuZ2VvbWV0cnkudHlwZSA9PT0gJ011bHRpUG9seWdvbicpIHtcclxuICAgICAgZm9yIChjb25zdCBjb29yZHMgb2YgZi5nZW9tZXRyeS5jb29yZGluYXRlcykge1xyXG4gICAgICAgIGlmIChjb29yZHMubGVuZ3RoID4gMSkge1xyXG4gICAgICAgICAgcmV0dXJuIHRydWVcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJldHVybiBmYWxzZVxyXG59XHJcbiJdfQ==
@@ -0,0 +1,39 @@
1
+ import kinks from '@turf/kinks';
2
+ import { isEmptyInputValue } from '../form/is-empty-input-value';
3
+ import { coerceFeatureCollection } from './coerce-feature-collection';
4
+ const kinkableGeometryTypes = ['LineString', 'MultiLineString', 'MultiPolygon', 'Polygon'];
5
+ export const NO_KINKS_VALIDATOR_NAME = 'no-kinks';
6
+ export function noKinksValidator() {
7
+ return (control) => {
8
+ // Don't need to validate if there isn't a value. Use `Validators.required` for that.
9
+ if (isEmptyInputValue(control.value)) {
10
+ return null; // don't validate empty values to allow optional controls
11
+ }
12
+ const value = coerceFeatureCollection(control.value);
13
+ if (value === null) {
14
+ return null;
15
+ }
16
+ const kinksFound = [];
17
+ for (const f of value.features) {
18
+ if (kinkableGeometryTypes.indexOf(f.geometry.type) !== -1) {
19
+ const _kinks = kinks(f);
20
+ if (_kinks.features.length > 0) {
21
+ kinksFound.push({
22
+ feature: f,
23
+ kinks: _kinks,
24
+ });
25
+ }
26
+ }
27
+ }
28
+ if (kinksFound.length > 0) {
29
+ return {
30
+ [NO_KINKS_VALIDATOR_NAME]: {
31
+ reason: 'Paths should not intersect themself.',
32
+ featuresWithKink: kinksFound,
33
+ }
34
+ };
35
+ }
36
+ return null;
37
+ };
38
+ }
39
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm8ta2lua3MudmFsaWRhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdWktY29tbW9uL3V0aWxzL2dlby1qc29uL25vLWtpbmtzLnZhbGlkYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEtBQUssTUFBTSxhQUFhLENBQUE7QUFHL0IsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sOEJBQThCLENBQUE7QUFDaEUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sNkJBQTZCLENBQUE7QUFFckUsTUFBTSxxQkFBcUIsR0FBRyxDQUFFLFlBQVksRUFBRSxpQkFBaUIsRUFBRSxjQUFjLEVBQUUsU0FBUyxDQUFFLENBQUE7QUFFNUYsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsVUFBVSxDQUFBO0FBRWpELE1BQU0sVUFBVSxnQkFBZ0I7SUFDOUIsT0FBTyxDQUFDLE9BQXdCLEVBQUUsRUFBRTtRQUNsQyxxRkFBcUY7UUFDckYsSUFBSSxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDcEMsT0FBTyxJQUFJLENBQUEsQ0FBQyx5REFBeUQ7U0FDdEU7UUFFRCxNQUFNLEtBQUssR0FBRyx1QkFBdUIsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUE7UUFFcEQsSUFBSSxLQUFLLEtBQUssSUFBSSxFQUFFO1lBQ2xCLE9BQU8sSUFBSSxDQUFBO1NBQ1o7UUFFRCxNQUFNLFVBQVUsR0FBcUQsRUFBRSxDQUFBO1FBQ3ZFLEtBQUssTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLFFBQVEsRUFBRTtZQUM5QixJQUFJLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO2dCQUN6RCxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsQ0FBUSxDQUFDLENBQUE7Z0JBQzlCLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO29CQUM5QixVQUFVLENBQUMsSUFBSSxDQUFDO3dCQUNkLE9BQU8sRUFBRSxDQUFDO3dCQUNWLEtBQUssRUFBRSxNQUFNO3FCQUNkLENBQUMsQ0FBQTtpQkFDSDthQUNGO1NBQ0Y7UUFFRCxJQUFJLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ3pCLE9BQU87Z0JBQ0wsQ0FBQyx1QkFBdUIsQ0FBQyxFQUFFO29CQUN6QixNQUFNLEVBQUUsc0NBQXNDO29CQUM5QyxnQkFBZ0IsRUFBRSxVQUFVO2lCQUM3QjthQUNGLENBQUE7U0FDRjtRQUVELE9BQU8sSUFBSSxDQUFBO0lBQ2IsQ0FBQyxDQUFBO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgVmFsaWRhdG9yRm4gfSBmcm9tICdAYW5ndWxhci9mb3JtcydcclxuXHJcbmltcG9ydCBraW5rcyBmcm9tICdAdHVyZi9raW5rcydcclxuaW1wb3J0IHsgRmVhdHVyZSwgRmVhdHVyZUNvbGxlY3Rpb24gfSBmcm9tICdnZW9qc29uJ1xyXG5cclxuaW1wb3J0IHsgaXNFbXB0eUlucHV0VmFsdWUgfSBmcm9tICcuLi9mb3JtL2lzLWVtcHR5LWlucHV0LXZhbHVlJ1xyXG5pbXBvcnQgeyBjb2VyY2VGZWF0dXJlQ29sbGVjdGlvbiB9IGZyb20gJy4vY29lcmNlLWZlYXR1cmUtY29sbGVjdGlvbidcclxuXHJcbmNvbnN0IGtpbmthYmxlR2VvbWV0cnlUeXBlcyA9IFsgJ0xpbmVTdHJpbmcnLCAnTXVsdGlMaW5lU3RyaW5nJywgJ011bHRpUG9seWdvbicsICdQb2x5Z29uJyBdXHJcblxyXG5leHBvcnQgY29uc3QgTk9fS0lOS1NfVkFMSURBVE9SX05BTUUgPSAnbm8ta2lua3MnXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gbm9LaW5rc1ZhbGlkYXRvcigpOiBWYWxpZGF0b3JGbiB7XHJcbiAgcmV0dXJuIChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpID0+IHtcclxuICAgIC8vIERvbid0IG5lZWQgdG8gdmFsaWRhdGUgaWYgdGhlcmUgaXNuJ3QgYSB2YWx1ZS4gVXNlIGBWYWxpZGF0b3JzLnJlcXVpcmVkYCBmb3IgdGhhdC5cclxuICAgIGlmIChpc0VtcHR5SW5wdXRWYWx1ZShjb250cm9sLnZhbHVlKSkge1xyXG4gICAgICByZXR1cm4gbnVsbCAvLyBkb24ndCB2YWxpZGF0ZSBlbXB0eSB2YWx1ZXMgdG8gYWxsb3cgb3B0aW9uYWwgY29udHJvbHNcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB2YWx1ZSA9IGNvZXJjZUZlYXR1cmVDb2xsZWN0aW9uKGNvbnRyb2wudmFsdWUpXHJcblxyXG4gICAgaWYgKHZhbHVlID09PSBudWxsKSB7XHJcbiAgICAgIHJldHVybiBudWxsXHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qga2lua3NGb3VuZDogeyBmZWF0dXJlOiBGZWF0dXJlLCBraW5rczogRmVhdHVyZUNvbGxlY3Rpb24gfVtdID0gW11cclxuICAgIGZvciAoY29uc3QgZiBvZiB2YWx1ZS5mZWF0dXJlcykge1xyXG4gICAgICBpZiAoa2lua2FibGVHZW9tZXRyeVR5cGVzLmluZGV4T2YoZi5nZW9tZXRyeS50eXBlKSAhPT0gLTEpIHtcclxuICAgICAgICBjb25zdCBfa2lua3MgPSBraW5rcyhmIGFzIGFueSlcclxuICAgICAgICBpZiAoX2tpbmtzLmZlYXR1cmVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIGtpbmtzRm91bmQucHVzaCh7XHJcbiAgICAgICAgICAgIGZlYXR1cmU6IGYsXHJcbiAgICAgICAgICAgIGtpbmtzOiBfa2lua3MsXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChraW5rc0ZvdW5kLmxlbmd0aCA+IDApIHtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBbTk9fS0lOS1NfVkFMSURBVE9SX05BTUVdOiB7XHJcbiAgICAgICAgICByZWFzb246ICdQYXRocyBzaG91bGQgbm90IGludGVyc2VjdCB0aGVtc2VsZi4nLFxyXG4gICAgICAgICAgZmVhdHVyZXNXaXRoS2luazoga2lua3NGb3VuZCxcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbnVsbFxyXG4gIH1cclxufVxyXG4iXX0=
@@ -0,0 +1,99 @@
1
+ import { __awaiter } from "tslib";
2
+ import { isDevMode } from '@angular/core';
3
+ import fileType from '@marklb/file-type';
4
+ const Buffer = require('buffer/').Buffer;
5
+ import shp from 'shpjs';
6
+ import { readFileAsync } from '../file-utils';
7
+ import { withoutProperty } from '../obj-utils';
8
+ /**
9
+ * Reads a File, or buffer of file content, in GeoJSON or ESRI Shapefile format
10
+ * and returns a GeoJSON `FeatureCollection`.
11
+ */
12
+ export function readGeoFile(fileOrBuffer) {
13
+ var _a;
14
+ return __awaiter(this, void 0, void 0, function* () {
15
+ const buffer = yield coerceFileOrBufferToBuffer(fileOrBuffer);
16
+ if (isShpFile(buffer)) {
17
+ return yield parseShpFile(buffer);
18
+ }
19
+ else if (((_a = fileType(buffer)) === null || _a === void 0 ? void 0 : _a.mime) === 'application/zip') {
20
+ try {
21
+ return yield parseShpZip(buffer);
22
+ }
23
+ catch (e) {
24
+ // NOTE: If 'shpjs' updates or we switch to a fork, where it doesn't use
25
+ // node buffers, then we can remove this rethrow.
26
+ if (isDevMode()) {
27
+ if (e.message === 'nodebuffer is not supported by this platform') {
28
+ console.warn('Try adding Buffer polyfill.\n' +
29
+ 'Install: npm install buffer\n' +
30
+ 'Add `global.Buffer = global.Buffer || require(\'buffer\').Buffer` to "src/polyfills.ts"');
31
+ }
32
+ }
33
+ throw e;
34
+ }
35
+ }
36
+ return parseGeoJson(buffer);
37
+ });
38
+ }
39
+ function coerceFileOrBufferToBuffer(fileOrBuffer) {
40
+ return __awaiter(this, void 0, void 0, function* () {
41
+ if (fileOrBuffer instanceof File) {
42
+ const arrBuf = yield readFileAsync(fileOrBuffer);
43
+ return Buffer.from(arrBuf);
44
+ }
45
+ return Buffer.from(fileOrBuffer);
46
+ });
47
+ }
48
+ // NOTE: Our current version of file-type does not detect shp files. We can
49
+ // remove this function when file-types is upgraded.
50
+ function isShpFile(buffer) {
51
+ const header = [0x27, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00];
52
+ const offset = 2;
53
+ if (buffer.length < (header.length + offset)) {
54
+ return false;
55
+ }
56
+ for (let i = 0; i < header.length; i++) {
57
+ if (header[i] !== buffer[i + offset]) {
58
+ return false;
59
+ }
60
+ }
61
+ return true;
62
+ }
63
+ function parseShpFile(buffer) {
64
+ return __awaiter(this, void 0, void 0, function* () {
65
+ const geometries = yield shp.parseShp(buffer, undefined);
66
+ const featCollection = {
67
+ type: 'FeatureCollection',
68
+ features: geometries.map(geom => ({
69
+ type: 'Feature',
70
+ geometry: geom,
71
+ properties: {}
72
+ }))
73
+ };
74
+ return featCollection;
75
+ });
76
+ }
77
+ function parseShpZip(buffer) {
78
+ return __awaiter(this, void 0, void 0, function* () {
79
+ let featCollection = yield shp.parseZip(buffer, undefined);
80
+ if (Array.isArray(featCollection)) {
81
+ if (featCollection.length === 0) {
82
+ throw Error(`Shape data not found.`);
83
+ }
84
+ else if (featCollection.length > 1) {
85
+ throw Error(`Multiple shape files not supported.`);
86
+ }
87
+ featCollection = featCollection[0];
88
+ }
89
+ return withoutProperty(featCollection, 'fileName');
90
+ });
91
+ }
92
+ function parseGeoJson(buffer) {
93
+ const json = JSON.parse(buffer.toString());
94
+ if ((json === null || json === void 0 ? void 0 : json.type) === 'FeatureCollection' && Array.isArray(json === null || json === void 0 ? void 0 : json.features)) {
95
+ return json;
96
+ }
97
+ throw Error(`Unable to parse as GeoJSON.`);
98
+ }
99
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhZC1nZW8tZmlsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3VpLWNvbW1vbi91dGlscy9nZW8tanNvbi9yZWFkLWdlby1maWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBQ3pDLE9BQU8sUUFBUSxNQUFNLG1CQUFtQixDQUFBO0FBRXhDLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUE7QUFDeEMsT0FBTyxHQUFHLE1BQU0sT0FBTyxDQUFBO0FBRXZCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFDN0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGNBQWMsQ0FBQTtBQUU5Qzs7O0dBR0c7QUFDSCxNQUFNLFVBQWdCLFdBQVcsQ0FBQyxZQUF5Qzs7O1FBQ3pFLE1BQU0sTUFBTSxHQUFHLE1BQU0sMEJBQTBCLENBQUMsWUFBWSxDQUFDLENBQUE7UUFFN0QsSUFBSSxTQUFTLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDckIsT0FBTyxNQUFNLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQTtTQUNsQzthQUFNLElBQUksQ0FBQSxNQUFBLFFBQVEsQ0FBQyxNQUFNLENBQUMsMENBQUUsSUFBSSxNQUFLLGlCQUFpQixFQUFFO1lBQ3ZELElBQUk7Z0JBQ0YsT0FBTyxNQUFNLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQTthQUNqQztZQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUNWLHdFQUF3RTtnQkFDeEUsaURBQWlEO2dCQUNqRCxJQUFJLFNBQVMsRUFBRSxFQUFFO29CQUNmLElBQUksQ0FBQyxDQUFDLE9BQU8sS0FBSyw4Q0FBOEMsRUFBRTt3QkFDaEUsT0FBTyxDQUFDLElBQUksQ0FDViwrQkFBK0I7NEJBQy9CLCtCQUErQjs0QkFDL0IseUZBQXlGLENBQzFGLENBQUE7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QUFJLHVCQUFKLElBQUksQ0FBRSxRQUFRLENBQUMsRUFBRTtRQUN2RSxPQUFPLElBQXlCLENBQUE7S0FDakM7SUFFRCxNQUFNLEtBQUssQ0FBQyw2QkFBNkIsQ0FBQyxDQUFBO0FBQzVDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpc0Rldk1vZGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJ1xuaW1wb3J0IGZpbGVUeXBlIGZyb20gJ0BtYXJrbGIvZmlsZS10eXBlJ1xuaW1wb3J0IHsgRmVhdHVyZUNvbGxlY3Rpb24gfSBmcm9tICdnZW9qc29uJ1xuY29uc3QgQnVmZmVyID0gcmVxdWlyZSgnYnVmZmVyLycpLkJ1ZmZlclxuaW1wb3J0IHNocCBmcm9tICdzaHBqcydcblxuaW1wb3J0IHsgcmVhZEZpbGVBc3luYyB9IGZyb20gJy4uL2ZpbGUtdXRpbHMnXG5pbXBvcnQgeyB3aXRob3V0UHJvcGVydHkgfSBmcm9tICcuLi9vYmotdXRpbHMnXG5cbi8qKlxuICogUmVhZHMgYSBGaWxlLCBvciBidWZmZXIgb2YgZmlsZSBjb250ZW50LCBpbiBHZW9KU09OIG9yIEVTUkkgU2hhcGVmaWxlIGZvcm1hdFxuICogYW5kIHJldHVybnMgYSBHZW9KU09OIGBGZWF0dXJlQ29sbGVjdGlvbmAuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWFkR2VvRmlsZShmaWxlT3JCdWZmZXI6IEZpbGUgfCBBcnJheUJ1ZmZlciB8IEJ1ZmZlcik6IFByb21pc2U8RmVhdHVyZUNvbGxlY3Rpb24+IHtcbiAgY29uc3QgYnVmZmVyID0gYXdhaXQgY29lcmNlRmlsZU9yQnVmZmVyVG9CdWZmZXIoZmlsZU9yQnVmZmVyKVxuXG4gIGlmIChpc1NocEZpbGUoYnVmZmVyKSkge1xuICAgIHJldHVybiBhd2FpdCBwYXJzZVNocEZpbGUoYnVmZmVyKVxuICB9IGVsc2UgaWYgKGZpbGVUeXBlKGJ1ZmZlcik/Lm1pbWUgPT09ICdhcHBsaWNhdGlvbi96aXAnKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBwYXJzZVNocFppcChidWZmZXIpXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gTk9URTogSWYgJ3NocGpzJyB1cGRhdGVzIG9yIHdlIHN3aXRjaCB0byBhIGZvcmssIHdoZXJlIGl0IGRvZXNuJ3QgdXNlXG4gICAgICAvLyBub2RlIGJ1ZmZlcnMsIHRoZW4gd2UgY2FuIHJlbW92ZSB0aGlzIHJldGhyb3cuXG4gICAgICBpZiAoaXNEZXZNb2RlKCkpIHtcbiAgICAgICAgaWYgKGUubWVzc2FnZSA9PT0gJ25vZGVidWZmZXIgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIHBsYXRmb3JtJykge1xuICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICdUcnkgYWRkaW5nIEJ1ZmZlciBwb2x5ZmlsbC5cXG4nICtcbiAgICAgICAgICAgICdJbnN0YWxsOiBucG0gaW5zdGFsbCBidWZmZXJcXG4nICtcbiAgICAgICAgICAgICdBZGQgYGdsb2JhbC5CdWZmZXIgPSBnbG9iYWwuQnVmZmVyIHx8IHJlcXVpcmUoXFwnYnVmZmVyXFwnKS5CdWZmZXJgIHRvIFwic3JjL3BvbHlmaWxscy50c1wiJ1xuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhyb3cgZVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBwYXJzZUdlb0pzb24oYnVmZmVyKVxufVxuXG5hc3luYyBmdW5jdGlvbiBjb2VyY2VGaWxlT3JCdWZmZXJUb0J1ZmZlcihmaWxlT3JCdWZmZXI6IEZpbGUgfCBBcnJheUJ1ZmZlciB8IEJ1ZmZlcik6IFByb21pc2U8QnVmZmVyPiB7XG4gIGlmIChmaWxlT3JCdWZmZXIgaW5zdGFuY2VvZiBGaWxlKSB7XG4gICAgY29uc3QgYXJyQnVmID0gYXdhaXQgcmVhZEZpbGVBc3luYyhmaWxlT3JCdWZmZXIpXG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGFyckJ1ZilcbiAgfVxuXG4gIHJldHVybiBCdWZmZXIuZnJvbShmaWxlT3JCdWZmZXIpXG59XG5cbi8vIE5PVEU6IE91ciBjdXJyZW50IHZlcnNpb24gb2YgZmlsZS10eXBlIGRvZXMgbm90IGRldGVjdCBzaHAgZmlsZXMuIFdlIGNhblxuLy8gcmVtb3ZlIHRoaXMgZnVuY3Rpb24gd2hlbiBmaWxlLXR5cGVzIGlzIHVwZ3JhZGVkLlxuZnVuY3Rpb24gaXNTaHBGaWxlKGJ1ZmZlcjogQnVmZmVyKTogYm9vbGVhbiB7XG4gIGNvbnN0IGhlYWRlciA9IFsgMHgyNywgMHgwQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCBdXG4gIGNvbnN0IG9mZnNldCA9IDJcblxuICBpZiAoYnVmZmVyLmxlbmd0aCA8IChoZWFkZXIubGVuZ3RoICsgb2Zmc2V0KSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBoZWFkZXIubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoaGVhZGVyW2ldICE9PSBidWZmZXJbaSArIG9mZnNldF0pIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlXG59XG5cbmFzeW5jIGZ1bmN0aW9uIHBhcnNlU2hwRmlsZShidWZmZXI6IEJ1ZmZlcik6IFByb21pc2U8RmVhdHVyZUNvbGxlY3Rpb24+IHtcbiAgY29uc3QgZ2VvbWV0cmllcyA9IGF3YWl0IHNocC5wYXJzZVNocChidWZmZXIsIHVuZGVmaW5lZCBhcyBhbnkpXG4gIGNvbnN0IGZlYXRDb2xsZWN0aW9uOiBGZWF0dXJlQ29sbGVjdGlvbiA9IHtcbiAgICB0eXBlOiAnRmVhdHVyZUNvbGxlY3Rpb24nLFxuICAgIGZlYXR1cmVzOiBnZW9tZXRyaWVzLm1hcChnZW9tID0+ICh7XG4gICAgICB0eXBlOiAnRmVhdHVyZScsXG4gICAgICBnZW9tZXRyeTogZ2VvbSxcbiAgICAgIHByb3BlcnRpZXM6IHsgfVxuICAgIH0pKVxuICB9XG4gIHJldHVybiBmZWF0Q29sbGVjdGlvblxufVxuXG5hc3luYyBmdW5jdGlvbiBwYXJzZVNocFppcChidWZmZXI6IEJ1ZmZlcik6IFByb21pc2U8RmVhdHVyZUNvbGxlY3Rpb24+IHtcbiAgbGV0IGZlYXRDb2xsZWN0aW9uID0gYXdhaXQgc2hwLnBhcnNlWmlwKGJ1ZmZlciwgdW5kZWZpbmVkIGFzIGFueSlcbiAgaWYgKEFycmF5LmlzQXJyYXkoZmVhdENvbGxlY3Rpb24pKSB7XG4gICAgaWYgKGZlYXRDb2xsZWN0aW9uLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgRXJyb3IoYFNoYXBlIGRhdGEgbm90IGZvdW5kLmApXG4gICAgfSBlbHNlIGlmIChmZWF0Q29sbGVjdGlvbi5sZW5ndGggPiAxKSB7XG4gICAgICB0aHJvdyBFcnJvcihgTXVsdGlwbGUgc2hhcGUgZmlsZXMgbm90IHN1cHBvcnRlZC5gKVxuICAgIH1cbiAgICBmZWF0Q29sbGVjdGlvbiA9IGZlYXRDb2xsZWN0aW9uWzBdXG4gIH1cbiAgcmV0dXJuIHdpdGhvdXRQcm9wZXJ0eShmZWF0Q29sbGVjdGlvbiwgJ2ZpbGVOYW1lJylcbn1cblxuZnVuY3Rpb24gcGFyc2VHZW9Kc29uKGJ1ZmZlcjogQnVmZmVyKTogRmVhdHVyZUNvbGxlY3Rpb24ge1xuICBjb25zdCBqc29uID0gSlNPTi5wYXJzZShidWZmZXIudG9TdHJpbmcoKSlcblxuICBpZiAoanNvbj8udHlwZSA9PT0gJ0ZlYXR1cmVDb2xsZWN0aW9uJyAmJiBBcnJheS5pc0FycmF5KGpzb24/LmZlYXR1cmVzKSkge1xuICAgIHJldHVybiBqc29uIGFzIEZlYXR1cmVDb2xsZWN0aW9uXG4gIH1cblxuICB0aHJvdyBFcnJvcihgVW5hYmxlIHRvIHBhcnNlIGFzIEdlb0pTT04uYClcbn1cbiJdfQ==