@ardium-ui/ui 3.4.4 → 3.5.1

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 (55) hide show
  1. package/esm2022/lib/_internal/disablable-component.mjs +1 -1
  2. package/esm2022/lib/buttons/icon-button/icon-button.module.mjs +2 -2
  3. package/esm2022/lib/calendar/calendar.component.mjs +437 -0
  4. package/esm2022/lib/calendar/calendar.defaults.mjs +26 -0
  5. package/esm2022/lib/calendar/calendar.internal-types.mjs +2 -0
  6. package/esm2022/lib/calendar/calendar.module.mjs +24 -0
  7. package/esm2022/lib/calendar/calendar.types.mjs +6 -0
  8. package/esm2022/lib/calendar/index.mjs +5 -0
  9. package/esm2022/lib/calendar/views/days-view/days-view.component.mjs +282 -0
  10. package/esm2022/lib/calendar/views/days-view/days-view.helpers.mjs +65 -0
  11. package/esm2022/lib/calendar/views/months-view/months-view.component.mjs +245 -0
  12. package/esm2022/lib/calendar/views/months-view/months-view.helpers.mjs +22 -0
  13. package/esm2022/lib/calendar/views/years-view/years-view.component.mjs +244 -0
  14. package/esm2022/lib/calendar/views/years-view/years-view.helpers.mjs +14 -0
  15. package/esm2022/lib/inputs/date-input/date-input.component.mjs +361 -0
  16. package/esm2022/lib/inputs/date-input/date-input.defaults.mjs +38 -0
  17. package/esm2022/lib/inputs/date-input/date-input.directive.mjs +59 -0
  18. package/esm2022/lib/inputs/date-input/date-input.module.mjs +50 -0
  19. package/esm2022/lib/inputs/date-input/date-input.serializers.mjs +49 -0
  20. package/esm2022/lib/inputs/date-input/date-input.types.mjs +5 -0
  21. package/esm2022/lib/inputs/date-input/index.mjs +6 -0
  22. package/esm2022/public-api.mjs +3 -2
  23. package/fesm2022/ardium-ui-ui.mjs +1882 -52
  24. package/fesm2022/ardium-ui-ui.mjs.map +1 -1
  25. package/lib/_internal/disablable-component.d.ts +1 -1
  26. package/lib/calendar/calendar.component.d.ts +94 -0
  27. package/lib/calendar/calendar.defaults.d.ts +18 -0
  28. package/lib/calendar/calendar.internal-types.d.ts +4 -0
  29. package/lib/calendar/calendar.module.d.ts +14 -0
  30. package/lib/calendar/calendar.types.d.ts +83 -0
  31. package/lib/calendar/index.d.ts +4 -0
  32. package/lib/calendar/views/days-view/days-view.component.d.ts +68 -0
  33. package/lib/calendar/views/days-view/days-view.helpers.d.ts +20 -0
  34. package/lib/calendar/views/months-view/months-view.component.d.ts +61 -0
  35. package/lib/calendar/views/months-view/months-view.helpers.d.ts +3 -0
  36. package/lib/calendar/views/years-view/years-view.component.d.ts +59 -0
  37. package/lib/calendar/views/years-view/years-view.helpers.d.ts +3 -0
  38. package/lib/inputs/date-input/date-input.component.d.ts +95 -0
  39. package/lib/inputs/date-input/date-input.defaults.d.ts +30 -0
  40. package/lib/inputs/date-input/date-input.directive.d.ts +33 -0
  41. package/lib/inputs/date-input/date-input.module.d.ts +14 -0
  42. package/lib/inputs/date-input/date-input.serializers.d.ts +3 -0
  43. package/lib/inputs/date-input/date-input.types.d.ts +16 -0
  44. package/lib/inputs/date-input/index.d.ts +5 -0
  45. package/package.json +1 -1
  46. package/prebuilt-themes/default/calendar-OLD.css +294 -0
  47. package/prebuilt-themes/default/calendar-OLD.css.map +1 -0
  48. package/prebuilt-themes/default/calendar.css +100 -80
  49. package/prebuilt-themes/default/calendar.css.map +1 -1
  50. package/prebuilt-themes/default/inputs/date-input.css +68 -0
  51. package/prebuilt-themes/default/inputs/date-input.css.map +1 -0
  52. package/public-api.d.ts +2 -0
  53. package/themes/default/calendar-OLD.scss +183 -0
  54. package/themes/default/calendar.scss +120 -98
  55. package/themes/default/inputs/date-input.scss +32 -0
@@ -48,4 +48,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
48
48
  type: HostBinding,
49
49
  args: ['class.ard-disabled']
50
50
  }] } });
51
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlzYWJsYWJsZS1jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy91aS9zcmMvbGliL19pbnRlcm5hbC9kaXNhYmxhYmxlLWNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM3RSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQzs7QUFNMUQsTUFBTSxDQUFDLE1BQU0sNEJBQTRCLEdBQWlDO0lBQ3hFLFFBQVEsRUFBRSxLQUFLO0lBQ2YsUUFBUSxFQUFFLEtBQUs7Q0FDaEIsQ0FBQztBQUdGLE1BQU0sT0FBZ0Isd0JBQXdCO0lBQzVDLFlBQStCLFNBQXVDO1FBQXZDLGNBQVMsR0FBVCxTQUFTLENBQThCO1FBQ3RFLHNCQUFzQjtRQUN0Qjs7V0FFRztRQUNNLGFBQVEsR0FBRyxLQUFLLENBQWUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFL0c7O1dBRUc7UUFDTSxhQUFRLEdBQUcsTUFBTSxDQUFVLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7SUFWWSxDQUFDO0lBVzFFLElBQ0ksU0FBUyxDQUFDLENBQU07UUFDbEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRUQsSUFFSSxzQkFBc0I7UUFDeEIsT0FBTyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUNELElBRUksc0JBQXNCO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ3pCLENBQUM7K0dBMUJtQix3QkFBd0I7bUdBQXhCLHdCQUF3Qjs7NEZBQXhCLHdCQUF3QjtrQkFEN0MsU0FBUzsyRUFjSixTQUFTO3NCQURaLEtBQUs7dUJBQUMsVUFBVTtnQkFPYixzQkFBc0I7c0JBRnpCLFdBQVc7dUJBQUMsZUFBZTs7c0JBQzNCLFdBQVc7dUJBQUMsb0JBQW9CO2dCQU03QixzQkFBc0I7c0JBRnpCLFdBQVc7dUJBQUMsZUFBZTs7c0JBQzNCLFdBQVc7dUJBQUMsb0JBQW9CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBIb3N0QmluZGluZywgSW5wdXQsIGlucHV0LCBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSB9IGZyb20gJ0BhcmRpdW0tdWkvZGV2a2l0JztcblxuZXhwb3J0IGludGVyZmFjZSBfRGlzYWJsYWJsZUNvbXBvbmVudERlZmF1bHRzIHtcbiAgcmVhZG9ubHk6IGJvb2xlYW47XG4gIGRpc2FibGVkOiBib29sZWFuO1xufVxuZXhwb3J0IGNvbnN0IF9kaXNhYmxhYmxlQ29tcG9uZW50RGVmYXVsdHM6IF9EaXNhYmxhYmxlQ29tcG9uZW50RGVmYXVsdHMgPSB7XG4gIHJlYWRvbmx5OiBmYWxzZSxcbiAgZGlzYWJsZWQ6IGZhbHNlLFxufTtcblxuQERpcmVjdGl2ZSgpXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgX0Rpc2FibGFibGVDb21wb25lbnRCYXNlIHtcbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIHJlYWRvbmx5IF9ERUZBVUxUUzogX0Rpc2FibGFibGVDb21wb25lbnREZWZhdWx0cykge31cbiAgLy8hIG5vIHZhbHVlIGFyZ3VtZW50c1xuICAvKipcbiAgICogV2hldGhlciB0aGUgY29tcG9uZW50IGlzIHJlYWQtb25seS4gRGVmaW5lcyB0aGUgYHJlYWRvbmx5YCBob3N0IGF0dHJpYnV0ZSBhbmQgYGFyZC1yZWFkb25seWAgaG9zdCBjbGFzcy4gQ29lcmNpYmxlIGludG8gYSBib29sZWFuLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVhZG9ubHkgPSBpbnB1dDxhbnksIGJvb2xlYW4+KHRoaXMuX0RFRkFVTFRTLnJlYWRvbmx5LCB7IHRyYW5zZm9ybTogdiA9PiBjb2VyY2VCb29sZWFuUHJvcGVydHkodikgfSk7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGNvbXBvbmVudCBpcyBkaXNhYmxlZC4gRGVmaW5lcyB0aGUgYGRpc2FibGVkYCBob3N0IGF0dHJpYnV0ZSBhbmQgYGFyZC1kaXNhYmxlZGAgaG9zdCBjbGFzcy4gQ29lcmNpYmxlIGludG8gYSBib29sZWFuLlxuICAgKi9cbiAgcmVhZG9ubHkgZGlzYWJsZWQgPSBzaWduYWw8Ym9vbGVhbj4odGhpcy5fREVGQVVMVFMuZGlzYWJsZWQpO1xuICBASW5wdXQoJ2Rpc2FibGVkJylcbiAgc2V0IF9kaXNhYmxlZCh2OiBhbnkpIHtcbiAgICB0aGlzLmRpc2FibGVkLnNldChjb2VyY2VCb29sZWFuUHJvcGVydHkodikpO1xuICB9XG5cbiAgQEhvc3RCaW5kaW5nKCdhdHRyLnJlYWRvbmx5JylcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5hcmQtcmVhZG9ubHknKVxuICBnZXQgX3JlYWRvbmx5SG9zdEF0dHJpYnV0ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkb25seSgpO1xuICB9XG4gIEBIb3N0QmluZGluZygnYXR0ci5kaXNhYmxlZCcpXG4gIEBIb3N0QmluZGluZygnY2xhc3MuYXJkLWRpc2FibGVkJylcbiAgZ2V0IF9kaXNhYmxlZEhvc3RBdHRyaWJ1dGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZGlzYWJsZWQoKTtcbiAgfVxufVxuIl19
51
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlzYWJsYWJsZS1jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy91aS9zcmMvbGliL19pbnRlcm5hbC9kaXNhYmxhYmxlLWNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM3RSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQzs7QUFNMUQsTUFBTSxDQUFDLE1BQU0sNEJBQTRCLEdBQWlDO0lBQ3hFLFFBQVEsRUFBRSxLQUFLO0lBQ2YsUUFBUSxFQUFFLEtBQUs7Q0FDaEIsQ0FBQztBQUdGLE1BQU0sT0FBZ0Isd0JBQXdCO0lBQzVDLFlBQStCLFNBQXVDO1FBQXZDLGNBQVMsR0FBVCxTQUFTLENBQThCO1FBQ3RFLHNCQUFzQjtRQUN0Qjs7V0FFRztRQUNNLGFBQVEsR0FBRyxLQUFLLENBQWUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFL0c7O1dBRUc7UUFDTSxhQUFRLEdBQUcsTUFBTSxDQUFVLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7SUFWWSxDQUFDO0lBVzFFLElBQ0ksU0FBUyxDQUFDLENBQU07UUFDbEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRUQsSUFFSSxzQkFBc0I7UUFDeEIsT0FBTyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUNELElBRUksc0JBQXNCO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ3pCLENBQUM7K0dBMUJtQix3QkFBd0I7bUdBQXhCLHdCQUF3Qjs7NEZBQXhCLHdCQUF3QjtrQkFEN0MsU0FBUzsyRUFjSixTQUFTO3NCQURaLEtBQUs7dUJBQUMsVUFBVTtnQkFPYixzQkFBc0I7c0JBRnpCLFdBQVc7dUJBQUMsZUFBZTs7c0JBQzNCLFdBQVc7dUJBQUMsb0JBQW9CO2dCQU03QixzQkFBc0I7c0JBRnpCLFdBQVc7dUJBQUMsZUFBZTs7c0JBQzNCLFdBQVc7dUJBQUMsb0JBQW9CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBIb3N0QmluZGluZywgSW5wdXQsIGlucHV0LCBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSB9IGZyb20gJ0BhcmRpdW0tdWkvZGV2a2l0JztcblxuZXhwb3J0IGludGVyZmFjZSBfRGlzYWJsYWJsZUNvbXBvbmVudERlZmF1bHRzIHtcbiAgcmVhZG9ubHk6IGJvb2xlYW47XG4gIGRpc2FibGVkOiBib29sZWFuO1xufVxuZXhwb3J0IGNvbnN0IF9kaXNhYmxhYmxlQ29tcG9uZW50RGVmYXVsdHM6IF9EaXNhYmxhYmxlQ29tcG9uZW50RGVmYXVsdHMgPSB7XG4gIHJlYWRvbmx5OiBmYWxzZSxcbiAgZGlzYWJsZWQ6IGZhbHNlLFxufTtcblxuQERpcmVjdGl2ZSgpXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgX0Rpc2FibGFibGVDb21wb25lbnRCYXNlIHtcbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIHJlYWRvbmx5IF9ERUZBVUxUUzogX0Rpc2FibGFibGVDb21wb25lbnREZWZhdWx0cykge31cbiAgLy8hIG5vIHZhbHVlIGFyZ3VtZW50c1xuICAvKipcbiAgICogV2hldGhlciB0aGUgY29tcG9uZW50IGlzIHJlYWQtb25seS4gRGVmaW5lcyB0aGUgYHJlYWRvbmx5YCBob3N0IGF0dHJpYnV0ZSBhbmQgYGFyZC1yZWFkb25seWAgaG9zdCBjbGFzcy4gQ29lcmNpYmxlIGludG8gYSBib29sZWFuLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVhZG9ubHkgPSBpbnB1dDxib29sZWFuLCBhbnk+KHRoaXMuX0RFRkFVTFRTLnJlYWRvbmx5LCB7IHRyYW5zZm9ybTogdiA9PiBjb2VyY2VCb29sZWFuUHJvcGVydHkodikgfSk7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGNvbXBvbmVudCBpcyBkaXNhYmxlZC4gRGVmaW5lcyB0aGUgYGRpc2FibGVkYCBob3N0IGF0dHJpYnV0ZSBhbmQgYGFyZC1kaXNhYmxlZGAgaG9zdCBjbGFzcy4gQ29lcmNpYmxlIGludG8gYSBib29sZWFuLlxuICAgKi9cbiAgcmVhZG9ubHkgZGlzYWJsZWQgPSBzaWduYWw8Ym9vbGVhbj4odGhpcy5fREVGQVVMVFMuZGlzYWJsZWQpO1xuICBASW5wdXQoJ2Rpc2FibGVkJylcbiAgc2V0IF9kaXNhYmxlZCh2OiBhbnkpIHtcbiAgICB0aGlzLmRpc2FibGVkLnNldChjb2VyY2VCb29sZWFuUHJvcGVydHkodikpO1xuICB9XG5cbiAgQEhvc3RCaW5kaW5nKCdhdHRyLnJlYWRvbmx5JylcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5hcmQtcmVhZG9ubHknKVxuICBnZXQgX3JlYWRvbmx5SG9zdEF0dHJpYnV0ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkb25seSgpO1xuICB9XG4gIEBIb3N0QmluZGluZygnYXR0ci5kaXNhYmxlZCcpXG4gIEBIb3N0QmluZGluZygnY2xhc3MuYXJkLWRpc2FibGVkJylcbiAgZ2V0IF9kaXNhYmxlZEhvc3RBdHRyaWJ1dGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZGlzYWJsZWQoKTtcbiAgfVxufVxuIl19
@@ -1,5 +1,5 @@
1
- import { NgModule } from '@angular/core';
2
1
  import { CommonModule } from '@angular/common';
2
+ import { NgModule } from '@angular/core';
3
3
  import { ArdiumIconButtonComponent } from './icon-button.component';
4
4
  import * as i0 from "@angular/core";
5
5
  export class ArdiumIconButtonModule {
@@ -15,4 +15,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
15
15
  exports: [ArdiumIconButtonComponent],
16
16
  }]
17
17
  }] });
18
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWNvbi1idXR0b24ubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdWkvc3JjL2xpYi9idXR0b25zL2ljb24tYnV0dG9uL2ljb24tYnV0dG9uLm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQzs7QUFPcEUsTUFBTSxPQUFPLHNCQUFzQjsrR0FBdEIsc0JBQXNCO2dIQUF0QixzQkFBc0IsaUJBSmxCLHlCQUF5QixhQUM5QixZQUFZLGFBQ1oseUJBQXlCO2dIQUV4QixzQkFBc0IsWUFIdkIsWUFBWTs7NEZBR1gsc0JBQXNCO2tCQUxsQyxRQUFRO21CQUFDO29CQUNSLFlBQVksRUFBRSxDQUFDLHlCQUF5QixDQUFDO29CQUN6QyxPQUFPLEVBQUUsQ0FBQyxZQUFZLENBQUM7b0JBQ3ZCLE9BQU8sRUFBRSxDQUFDLHlCQUF5QixDQUFDO2lCQUNyQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQXJkaXVtSWNvbkJ1dHRvbkNvbXBvbmVudCB9IGZyb20gJy4vaWNvbi1idXR0b24uY29tcG9uZW50JztcblxuQE5nTW9kdWxlKHtcbiAgZGVjbGFyYXRpb25zOiBbQXJkaXVtSWNvbkJ1dHRvbkNvbXBvbmVudF0sXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICBleHBvcnRzOiBbQXJkaXVtSWNvbkJ1dHRvbkNvbXBvbmVudF0sXG59KVxuZXhwb3J0IGNsYXNzIEFyZGl1bUljb25CdXR0b25Nb2R1bGUge31cbiJdfQ==
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWNvbi1idXR0b24ubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdWkvc3JjL2xpYi9idXR0b25zL2ljb24tYnV0dG9uL2ljb24tYnV0dG9uLm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQzs7QUFPcEUsTUFBTSxPQUFPLHNCQUFzQjsrR0FBdEIsc0JBQXNCO2dIQUF0QixzQkFBc0IsaUJBSmxCLHlCQUF5QixhQUM5QixZQUFZLGFBQ1oseUJBQXlCO2dIQUV4QixzQkFBc0IsWUFIdkIsWUFBWTs7NEZBR1gsc0JBQXNCO2tCQUxsQyxRQUFRO21CQUFDO29CQUNSLFlBQVksRUFBRSxDQUFDLHlCQUF5QixDQUFDO29CQUN6QyxPQUFPLEVBQUUsQ0FBQyxZQUFZLENBQUM7b0JBQ3ZCLE9BQU8sRUFBRSxDQUFDLHlCQUF5QixDQUFDO2lCQUNyQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQXJkaXVtSWNvbkJ1dHRvbkNvbXBvbmVudCB9IGZyb20gJy4vaWNvbi1idXR0b24uY29tcG9uZW50JztcblxuQE5nTW9kdWxlKHtcbiAgZGVjbGFyYXRpb25zOiBbQXJkaXVtSWNvbkJ1dHRvbkNvbXBvbmVudF0sXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICBleHBvcnRzOiBbQXJkaXVtSWNvbkJ1dHRvbkNvbXBvbmVudF0sXG59KVxuZXhwb3J0IGNsYXNzIEFyZGl1bUljb25CdXR0b25Nb2R1bGUge31cbiJdfQ==
@@ -0,0 +1,437 @@
1
+ import { ChangeDetectionStrategy, Component, computed, contentChild, effect, HostListener, Inject, input, model, output, signal, TemplateRef, ViewEncapsulation, } from '@angular/core';
2
+ import { coerceBooleanProperty, coerceDateProperty, coerceNumberProperty } from '@ardium-ui/devkit';
3
+ import { roundFromZero } from 'more-rounding';
4
+ import { isDefined, isNull } from 'simple-bool';
5
+ import { _NgModelComponentBase } from '../_internal/ngmodel-component';
6
+ import { ARD_CALENDAR_DEFAULTS } from './calendar.defaults';
7
+ import { ArdCalendarView, } from './calendar.types';
8
+ import { isDayOutOfRange } from './views/days-view/days-view.helpers';
9
+ import { isMonthOutOfRange } from './views/months-view/months-view.helpers';
10
+ import { isYearOutOfRange } from './views/years-view/years-view.helpers';
11
+ import * as i0 from "@angular/core";
12
+ import * as i1 from "@angular/common";
13
+ import * as i2 from "./views/days-view/days-view.component";
14
+ import * as i3 from "./views/months-view/months-view.component";
15
+ import * as i4 from "./views/years-view/years-view.component";
16
+ const TODAY = new Date();
17
+ export class ArdiumCalendarComponent extends _NgModelComponentBase {
18
+ constructor(defaults) {
19
+ super(defaults);
20
+ //! appearance
21
+ this.color = input(this._DEFAULTS.color);
22
+ this.ngClasses = computed(() => [`ard-color-${this.color()}`].join(' '));
23
+ //! active view
24
+ this.activeView = model(this._DEFAULTS.activeView);
25
+ this.activeYear = model(this._DEFAULTS.activeYear);
26
+ this.activeMonth = model(this._DEFAULTS.activeMonth);
27
+ this.firstWeekday = input(this._DEFAULTS.firstWeekday, {
28
+ transform: v => {
29
+ const value = coerceNumberProperty(v, this._DEFAULTS.firstWeekday);
30
+ if (!Number.isInteger(value)) {
31
+ console.error(new Error(`ARD-NF2001A: [firstWeekday] must be a positive integer, got "${value}". Using default value instead.`));
32
+ return 1;
33
+ }
34
+ if (value < 0 || value > 6) {
35
+ console.error(new Error(`ARD-NF2001B: [firstWeekday] must be between 0 and 6, got "${value}". Using modulo operator to adjust the value.`));
36
+ }
37
+ return value % 7;
38
+ },
39
+ });
40
+ this.multipleYearPageChangeModifier = input(this._DEFAULTS.multipleYearPageChangeModifier, {
41
+ transform: v => {
42
+ const value = coerceNumberProperty(v, this._DEFAULTS.multipleYearPageChangeModifier);
43
+ if (!Number.isInteger(value) || value < 1) {
44
+ console.error(new Error(`ARD-NF2002: [multipleYearPageChangeModifier] must be a positive integer, got "${value}". Using default value instead.`));
45
+ return 5;
46
+ }
47
+ return value;
48
+ },
49
+ });
50
+ this.autoFocus = input(this._DEFAULTS.autoFocus, { transform: v => coerceBooleanProperty(v) });
51
+ //! value
52
+ this.selectedDate = model(null, { alias: 'selected' });
53
+ this.yearSelect = output();
54
+ this.monthSelect = output();
55
+ this.min = input(this._DEFAULTS.min, { transform: v => coerceDateProperty(v, this._DEFAULTS.min) });
56
+ this.max = input(this._DEFAULTS.max, { transform: v => coerceDateProperty(v, this._DEFAULTS.max) });
57
+ this.filter = input(this._DEFAULTS.filter);
58
+ this.isDayFilteredOut = computed(() => {
59
+ return (day, month = this.activeMonth(), year = this.activeYear()) => {
60
+ const filter = this.filter();
61
+ return filter?.(new Date(year, month, day)) ?? false;
62
+ };
63
+ });
64
+ //! highlighting days
65
+ this.__highlightedDay = signal(null);
66
+ this.highlightedDay = this.__highlightedDay.asReadonly();
67
+ //! highlighting months
68
+ this.__highlightedMonth = signal(null);
69
+ this.highlightedMonth = this.__highlightedMonth.asReadonly();
70
+ //! highlighting years
71
+ this.__highlightedYear = signal(null);
72
+ this.highlightedYear = this.__highlightedYear.asReadonly();
73
+ this.currentYearRangeStart = signal(TODAY.getFullYear() - (TODAY.getFullYear() % 4) - 8); // current year always in 3rd row
74
+ //! internals
75
+ this._isUsingKeyboard = signal(false);
76
+ //! templates
77
+ this.yearsViewHeaderTemplate = contentChild(TemplateRef);
78
+ this.monthsViewHeaderTemplate = contentChild(TemplateRef);
79
+ this.daysViewHeaderTemplate = contentChild(TemplateRef);
80
+ this.floatingMonthTemplate = contentChild(TemplateRef);
81
+ this.yearTemplate = contentChild(TemplateRef);
82
+ this.monthTemplate = contentChild(TemplateRef);
83
+ this.dayTemplate = contentChild(TemplateRef);
84
+ this.weekdayTemplate = contentChild(TemplateRef);
85
+ effect(() => {
86
+ this.selectedDate(); // trigger effect
87
+ this._emitChange();
88
+ });
89
+ }
90
+ onTriggerOpenDaysView() {
91
+ this.activeView.set(ArdCalendarView.Days);
92
+ }
93
+ onTriggerOpenMonthsView() {
94
+ this.activeView.set(ArdCalendarView.Months);
95
+ }
96
+ onTriggerOpenYearsView() {
97
+ this.activeView.set(ArdCalendarView.Years);
98
+ }
99
+ writeValue(v) {
100
+ if (v instanceof Date) {
101
+ this.selectedDate.set(v);
102
+ }
103
+ else if (!isDefined(v)) {
104
+ this.selectedDate.set(null);
105
+ }
106
+ else {
107
+ console.error(new Error(`ARD-NF2003: <ard-calendar> [writeValue] expected a Date or null, got "${v}".`));
108
+ }
109
+ }
110
+ _emitChange() {
111
+ this._onChangeRegistered?.(this.selectedDate());
112
+ }
113
+ //! selecting days
114
+ isDaySelected(day) {
115
+ if (day instanceof Date)
116
+ day = day.getDate();
117
+ return (this.selectedDate() !== null &&
118
+ this.activeYear() === this.selectedDate()?.getFullYear() &&
119
+ this.activeMonth() === this.selectedDate()?.getMonth() &&
120
+ day === this.selectedDate()?.getDate());
121
+ }
122
+ isDayOutOfRange(day, month = this.activeMonth(), year = this.activeYear()) {
123
+ return isDayOutOfRange(day, month, year, this.min(), this.max());
124
+ }
125
+ selectDay(day) {
126
+ if (this.isDaySelected(day))
127
+ return;
128
+ if (isNull(day)) {
129
+ if (!isDefined(this.selectedDate()))
130
+ return;
131
+ this.selectedDate.set(null);
132
+ return;
133
+ }
134
+ if (day instanceof Date)
135
+ day = day.getDate();
136
+ if (day && this.isDayOutOfRange(day) || this.isDayFilteredOut()(day))
137
+ return;
138
+ this.selectedDate.set(new Date(this.activeYear(), this.activeMonth(), day, 0, 0, 0, 0));
139
+ }
140
+ selectCurrentlyHighlightedDay() {
141
+ if (!isDefined(this.highlightedDay()))
142
+ return;
143
+ this.selectDay(this.highlightedDay());
144
+ }
145
+ setHighlightedDay(day, month = this.activeMonth(), year = this.activeYear()) {
146
+ if (isNull(day)) {
147
+ this.__highlightedDay.update(() => day);
148
+ return;
149
+ }
150
+ const date = new Date(year, month, day);
151
+ const outOfRange = this.isDayOutOfRange(day, month, year);
152
+ if (outOfRange === -1) {
153
+ this._highlightMinDay();
154
+ return;
155
+ }
156
+ if (outOfRange === 1) {
157
+ this._highlightMaxDay();
158
+ return;
159
+ }
160
+ this.__highlightedDay.update(() => date.getDate());
161
+ if (date.getFullYear() !== this.activeYear()) {
162
+ this.activeYear.set(date.getFullYear());
163
+ }
164
+ if (date.getMonth() !== this.activeMonth()) {
165
+ this.activeMonth.set(date.getMonth());
166
+ }
167
+ }
168
+ _highlightMinDay() {
169
+ const min = this.min();
170
+ if (!isDefined(min))
171
+ return;
172
+ this.activeYear.set(min.getFullYear());
173
+ this.activeMonth.set(min.getMonth());
174
+ this.__highlightedDay.set(min.getDate());
175
+ }
176
+ _highlightMaxDay() {
177
+ const max = this.max();
178
+ if (!isDefined(max))
179
+ return;
180
+ this.activeYear.set(max.getFullYear());
181
+ this.activeMonth.set(max.getMonth());
182
+ this.__highlightedDay.set(max.getDate());
183
+ }
184
+ highlightNextDay(offset = 1) {
185
+ const currentDay = this.highlightedDay();
186
+ const newDay = isDefined(currentDay) ? currentDay + offset : 1;
187
+ this.setHighlightedDay(newDay);
188
+ }
189
+ highlightPreviousDay(offset = 1) {
190
+ this.highlightNextDay(offset * -1);
191
+ }
192
+ highlightFirstDay() {
193
+ this.setHighlightedDay(1);
194
+ }
195
+ highlightLastDay() {
196
+ const daysInMonth = new Date(this.activeYear(), this.activeMonth() + 1, 0).getDate();
197
+ this.setHighlightedDay(daysInMonth);
198
+ }
199
+ highlightSameDayNextMonth() {
200
+ const month = this.activeMonth();
201
+ const year = this.activeYear();
202
+ const newMonth = month + 1;
203
+ const newYear = year + Math.floor(newMonth / 12);
204
+ this.setHighlightedDay(this.highlightedDay(), newMonth % 12, newYear);
205
+ }
206
+ highlightSameDayPreviousMonth() {
207
+ const month = this.activeMonth();
208
+ const year = this.activeYear();
209
+ const newMonth = month - 1;
210
+ const newYear = year + Math.floor(newMonth / 12);
211
+ this.setHighlightedDay(this.highlightedDay(), newMonth % 12, newYear);
212
+ }
213
+ highlightSameDayNextYear() {
214
+ this.setHighlightedDay(this.highlightedDay(), this.activeMonth(), this.activeYear() + 1);
215
+ }
216
+ highlightSameDayPreviousYear() {
217
+ this.setHighlightedDay(this.highlightedDay(), this.activeMonth(), this.activeYear() - 1);
218
+ }
219
+ //! selecting months
220
+ isMonthSelected(month) {
221
+ if (month instanceof Date)
222
+ month = month.getMonth();
223
+ return (this.selectedDate() !== null &&
224
+ this.activeYear() === this.selectedDate()?.getFullYear() &&
225
+ month === this.selectedDate()?.getMonth());
226
+ }
227
+ isMonthOutOfRange(month, year = this.activeYear()) {
228
+ return isMonthOutOfRange(month, year, this.min(), this.max());
229
+ }
230
+ changeMonth(newMonth) {
231
+ if (isNull(newMonth)) {
232
+ this.activeMonth.set(TODAY.getMonth());
233
+ return true;
234
+ }
235
+ if (this.isMonthOutOfRange(newMonth))
236
+ return false;
237
+ if (newMonth > 11) {
238
+ this.activeMonth.set(0);
239
+ this.activeYear.update(v => v + 1);
240
+ }
241
+ else if (newMonth < 0) {
242
+ this.activeMonth.set(11);
243
+ this.activeYear.update(v => v - 1);
244
+ }
245
+ else {
246
+ this.activeMonth.set(newMonth);
247
+ }
248
+ return true;
249
+ }
250
+ selectMonth(newMonth) {
251
+ if (isNull(newMonth) || this.isMonthOutOfRange(newMonth))
252
+ return;
253
+ const wasSuccessful = this.changeMonth(newMonth);
254
+ if (!wasSuccessful)
255
+ return;
256
+ this.activeView.set(ArdCalendarView.Days);
257
+ this.monthSelect.emit(newMonth);
258
+ }
259
+ selectCurrentlyHighlightedMonth() {
260
+ if (!isDefined(this.highlightedMonth()))
261
+ return;
262
+ this.selectMonth(this.highlightedMonth());
263
+ }
264
+ setHighlightedMonth(month, year = this.activeYear()) {
265
+ if (isNull(month)) {
266
+ this.__highlightedMonth.update(() => month);
267
+ return;
268
+ }
269
+ const date = new Date(year, month, 15);
270
+ const outOfRange = this.isMonthOutOfRange(month, year);
271
+ if (outOfRange === -1) {
272
+ this._highlightMinMonth();
273
+ return;
274
+ }
275
+ if (outOfRange === 1) {
276
+ this._highlightMaxMonth();
277
+ return;
278
+ }
279
+ this.__highlightedMonth.update(() => date.getMonth());
280
+ if (date.getFullYear() !== this.activeYear()) {
281
+ this.activeYear.set(date.getFullYear());
282
+ }
283
+ }
284
+ _highlightMinMonth() {
285
+ const min = this.min();
286
+ if (!isDefined(min))
287
+ return;
288
+ this.activeYear.set(min.getFullYear());
289
+ this.__highlightedMonth.set(min.getMonth());
290
+ }
291
+ _highlightMaxMonth() {
292
+ const max = this.max();
293
+ if (!isDefined(max))
294
+ return;
295
+ this.activeYear.set(max.getFullYear());
296
+ this.__highlightedMonth.set(max.getMonth());
297
+ }
298
+ highlightNextMonth(offset = 1) {
299
+ const currentMonth = this.highlightedMonth();
300
+ const newMonth = isDefined(currentMonth) ? currentMonth + offset : 0;
301
+ this.setHighlightedMonth(newMonth);
302
+ }
303
+ highlightPreviousMonth(offset = 1) {
304
+ this.highlightNextMonth(offset * -1);
305
+ }
306
+ highlightFirstMonth() {
307
+ this.setHighlightedMonth(0);
308
+ }
309
+ highlightLastMonth() {
310
+ this.setHighlightedMonth(11);
311
+ }
312
+ highlightSameMonthNextYear(multiple) {
313
+ this.setHighlightedMonth(this.highlightedMonth(), this.activeYear() + (multiple ? 10 : 1));
314
+ }
315
+ highlightSameMonthPreviousYear(multiple) {
316
+ this.setHighlightedMonth(this.highlightedMonth(), this.activeYear() - (multiple ? 10 : 1));
317
+ }
318
+ //! selecting years
319
+ isYearSelected(year) {
320
+ if (year instanceof Date)
321
+ year = year.getFullYear();
322
+ return this.selectedDate() !== null && year === this.selectedDate()?.getFullYear();
323
+ }
324
+ isYearOutOfRange(year) {
325
+ return isYearOutOfRange(year, this.min(), this.max());
326
+ }
327
+ changeYear(year) {
328
+ if (isNull(year)) {
329
+ this.activeYear.set(TODAY.getFullYear());
330
+ return true;
331
+ }
332
+ if (this.isYearOutOfRange(year))
333
+ return false;
334
+ this.activeYear.set(year);
335
+ return true;
336
+ }
337
+ selectYear(year) {
338
+ if (isNull(year))
339
+ return;
340
+ if (year instanceof Date)
341
+ year = year.getFullYear();
342
+ const wasSuccessful = this.changeYear(year);
343
+ if (!wasSuccessful)
344
+ return;
345
+ this.activeView.set(ArdCalendarView.Months);
346
+ this.yearSelect.emit(year);
347
+ }
348
+ selectCurrentlyHighlightedYear() {
349
+ if (!isDefined(this.highlightedYear()))
350
+ return;
351
+ this.selectYear(this.highlightedYear());
352
+ }
353
+ setHighlightedYear(year) {
354
+ if (isNull(year)) {
355
+ this.__highlightedYear.update(() => year);
356
+ return;
357
+ }
358
+ const date = new Date(year, 0);
359
+ const outOfRange = this.isYearOutOfRange(year);
360
+ if (outOfRange === -1) {
361
+ this._highlightMinYear();
362
+ return;
363
+ }
364
+ if (outOfRange === 1) {
365
+ this._highlightMaxYear();
366
+ return;
367
+ }
368
+ const newYear = date.getFullYear();
369
+ this.__highlightedYear.update(() => newYear);
370
+ if (newYear < this.currentYearRangeStart() || newYear >= this.currentYearRangeStart() + 24) {
371
+ // round the offset away from zero: 0.1 -> 1, -0.1 -> -1
372
+ // this is to ensure the range start is always shifted by 24 years
373
+ const offset = roundFromZero((newYear - this.currentYearRangeStart()) / 24);
374
+ this.currentYearRangeStart.update(v => v + offset * 24);
375
+ }
376
+ }
377
+ changeYearsViewPage(offset) {
378
+ const newYearRangeStart = this.currentYearRangeStart() + offset * 24;
379
+ this.currentYearRangeStart.set(newYearRangeStart);
380
+ }
381
+ _highlightMinYear() {
382
+ const min = this.min();
383
+ if (!isDefined(min))
384
+ return;
385
+ this.__highlightedYear.set(min.getFullYear());
386
+ }
387
+ _highlightMaxYear() {
388
+ const max = this.max();
389
+ if (!isDefined(max))
390
+ return;
391
+ this.__highlightedYear.set(max.getFullYear());
392
+ }
393
+ highlightNextYear(offset = 1) {
394
+ const currentYear = this.highlightedYear();
395
+ const newYear = isDefined(currentYear) ? currentYear + offset : null;
396
+ this.setHighlightedYear(newYear);
397
+ }
398
+ highlightPreviousYear(offset = 1) {
399
+ this.highlightNextYear(offset * -1);
400
+ }
401
+ highlightFirstYear() {
402
+ this.setHighlightedYear(this.currentYearRangeStart());
403
+ }
404
+ highlightLastYear() {
405
+ this.setHighlightedYear(this.currentYearRangeStart() + 23); // 24 years per page
406
+ }
407
+ highlightSameYearNextPage(multiple) {
408
+ const year = this.highlightedYear() ?? this.currentYearRangeStart();
409
+ this.setHighlightedYear(year + (multiple ? 60 : 24));
410
+ }
411
+ highlightSameYearPreviousPage(multiple) {
412
+ const year = this.highlightedYear() ?? this.currentYearRangeStart();
413
+ this.setHighlightedYear(year - (multiple ? 60 : 24));
414
+ }
415
+ onDocumentMousemove() {
416
+ this._isUsingKeyboard.set(false);
417
+ }
418
+ onDocumentKeydown() {
419
+ this._isUsingKeyboard.set(true);
420
+ }
421
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ArdiumCalendarComponent, deps: [{ token: ARD_CALENDAR_DEFAULTS }], target: i0.ɵɵFactoryTarget.Component }); }
422
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: ArdiumCalendarComponent, selector: "ard-calendar", inputs: { color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, activeView: { classPropertyName: "activeView", publicName: "activeView", isSignal: true, isRequired: false, transformFunction: null }, activeYear: { classPropertyName: "activeYear", publicName: "activeYear", isSignal: true, isRequired: false, transformFunction: null }, activeMonth: { classPropertyName: "activeMonth", publicName: "activeMonth", isSignal: true, isRequired: false, transformFunction: null }, firstWeekday: { classPropertyName: "firstWeekday", publicName: "firstWeekday", isSignal: true, isRequired: false, transformFunction: null }, multipleYearPageChangeModifier: { classPropertyName: "multipleYearPageChangeModifier", publicName: "multipleYearPageChangeModifier", isSignal: true, isRequired: false, transformFunction: null }, autoFocus: { classPropertyName: "autoFocus", publicName: "autoFocus", isSignal: true, isRequired: false, transformFunction: null }, selectedDate: { classPropertyName: "selectedDate", publicName: "selected", isSignal: true, isRequired: false, transformFunction: null }, min: { classPropertyName: "min", publicName: "min", isSignal: true, isRequired: false, transformFunction: null }, max: { classPropertyName: "max", publicName: "max", isSignal: true, isRequired: false, transformFunction: null }, filter: { classPropertyName: "filter", publicName: "filter", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { activeView: "activeViewChange", activeYear: "activeYearChange", activeMonth: "activeMonthChange", selectedDate: "selectedChange", yearSelect: "yearSelect", monthSelect: "monthSelect" }, host: { listeners: { "document:mousemove": "onDocumentMousemove()", "document:keydown": "onDocumentKeydown()" } }, queries: [{ propertyName: "yearsViewHeaderTemplate", first: true, predicate: TemplateRef, descendants: true, isSignal: true }, { propertyName: "monthsViewHeaderTemplate", first: true, predicate: TemplateRef, descendants: true, isSignal: true }, { propertyName: "daysViewHeaderTemplate", first: true, predicate: TemplateRef, descendants: true, isSignal: true }, { propertyName: "floatingMonthTemplate", first: true, predicate: TemplateRef, descendants: true, isSignal: true }, { propertyName: "yearTemplate", first: true, predicate: TemplateRef, descendants: true, isSignal: true }, { propertyName: "monthTemplate", first: true, predicate: TemplateRef, descendants: true, isSignal: true }, { propertyName: "dayTemplate", first: true, predicate: TemplateRef, descendants: true, isSignal: true }, { propertyName: "weekdayTemplate", first: true, predicate: TemplateRef, descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<div\r\n class=\"ard-calendar\"\r\n [ngClass]=\"ngClasses()\"\r\n>\r\n @switch (activeView()) { @case ('days') {\r\n <ard-days-view\r\n [tabIndex]=\"tabIndex()\"\r\n [readOnly]=\"readonly()\"\r\n [disabled]=\"disabled()\"\r\n [autoFocus]=\"autoFocus()\"\r\n [_isUsingKeyboard]=\"_isUsingKeyboard()\"\r\n [activeMonth]=\"activeMonth()\"\r\n [activeYear]=\"activeYear()\"\r\n [selectedDate]=\"selectedDate()\"\r\n [firstWeekday]=\"firstWeekday()\"\r\n [highlightedDay]=\"highlightedDay()\"\r\n [min]=\"min()\"\r\n [max]=\"max()\"\r\n [isDayFilteredOut]=\"isDayFilteredOut()\"\r\n [daysViewHeaderTemplate]=\"daysViewHeaderTemplate()\"\r\n [floatingMonthTemplate]=\"floatingMonthTemplate()\"\r\n [weekdayTemplate]=\"weekdayTemplate()\"\r\n [dayTemplate]=\"dayTemplate()\"\r\n (focus)=\"onFocus($event)\"\r\n (blur)=\"onBlur($event)\"\r\n (triggerOpenMonthsView)=\"onTriggerOpenMonthsView()\"\r\n (triggerOpenYearsView)=\"onTriggerOpenYearsView()\"\r\n (triggerChangeMonth)=\"changeMonth($event)\"\r\n (triggerChangeYear)=\"changeYear($event)\"\r\n (triggerHighlightDay)=\"setHighlightedDay($event)\"\r\n (triggerHighlightFirstDay)=\"highlightFirstDay()\"\r\n (triggerHighlightLastDay)=\"highlightLastDay()\"\r\n (triggerHighlightNextDay)=\"highlightNextDay($event)\"\r\n (triggerHighlightPreviousDay)=\"highlightPreviousDay($event)\"\r\n (triggerHighlightSameDayNextPage)=\"$event ? highlightSameDayNextYear() : highlightSameDayNextMonth()\"\r\n (triggerHighlightSameDayPreviousPage)=\"$event ? highlightSameDayPreviousYear() : highlightSameDayPreviousMonth()\"\r\n (triggerSelectDay)=\"selectDay($event)\"\r\n />\r\n } @case ('months') {\r\n <ard-months-view\r\n [tabIndex]=\"tabIndex()\"\r\n [readOnly]=\"readonly()\"\r\n [disabled]=\"disabled()\"\r\n [autoFocus]=\"autoFocus()\"\r\n [_isUsingKeyboard]=\"_isUsingKeyboard()\"\r\n [color]=\"color()\"\r\n [activeMonth]=\"activeMonth()\"\r\n [activeYear]=\"activeYear()\"\r\n [selectedDate]=\"selectedDate()\"\r\n [min]=\"min()\"\r\n [max]=\"max()\"\r\n [highlightedMonth]=\"highlightedMonth()\"\r\n [monthsViewHeaderTemplate]=\"monthsViewHeaderTemplate()\"\r\n [monthTemplate]=\"monthTemplate()\"\r\n (focus)=\"onFocus($event)\"\r\n (blur)=\"onBlur($event)\"\r\n (triggerOpenDaysView)=\"onTriggerOpenDaysView()\"\r\n (triggerOpenYearsView)=\"onTriggerOpenYearsView()\"\r\n (triggeChangeYear)=\"changeYear($event)\"\r\n (triggerSelectMonth)=\"selectMonth($event)\"\r\n (triggerHighlightMonth)=\"setHighlightedMonth($event)\"\r\n (triggerHighlightFirstMonth)=\"highlightFirstMonth()\"\r\n (triggerHighlightLastMonth)=\"highlightLastMonth()\"\r\n (triggerHighlightNextMonth)=\"highlightNextMonth($event)\"\r\n (triggerHighlightPreviousMonth)=\"highlightPreviousMonth($event)\"\r\n (triggerHighlightSameMonthNextPage)=\"highlightSameMonthNextYear($event)\"\r\n (triggerHighlightSameMonthPreviousPage)=\"highlightSameMonthPreviousYear($event)\"\r\n />\r\n } @case ('years') {\r\n <ard-years-view\r\n [tabIndex]=\"tabIndex()\"\r\n [readOnly]=\"readonly()\"\r\n [disabled]=\"disabled()\"\r\n [autoFocus]=\"autoFocus()\"\r\n [_isUsingKeyboard]=\"_isUsingKeyboard()\"\r\n [highlightedYear]=\"highlightedYear()\"\r\n [currentYearRangeStart]=\"currentYearRangeStart()\"\r\n [activeYear]=\"activeYear()\"\r\n [selectedDate]=\"selectedDate()\"\r\n [min]=\"min()\"\r\n [max]=\"max()\"\r\n [yearsViewHeaderTemplate]=\"yearsViewHeaderTemplate()\"\r\n [yearTemplate]=\"yearTemplate()\"\r\n (focus)=\"onFocus($event)\"\r\n (blur)=\"onBlur($event)\"\r\n (triggerOpenDaysView)=\"onTriggerOpenDaysView()\"\r\n (triggerOpenMonthsView)=\"onTriggerOpenMonthsView()\"\r\n (triggerSelectYear)=\"selectYear($event)\"\r\n (triggerChangeYearsViewPage)=\"changeYearsViewPage($event)\"\r\n (triggerHighlightYear)=\"setHighlightedYear($event)\"\r\n (triggerHighlightFirstYear)=\"highlightFirstYear()\"\r\n (triggerHighlightLastYear)=\"highlightLastYear()\"\r\n (triggerHighlightNextYear)=\"highlightNextYear($event)\"\r\n (triggerHighlightPreviousYear)=\"highlightPreviousYear($event)\"\r\n (triggerHighlightSameYearNextPage)=\"highlightSameYearNextPage($event)\"\r\n (triggerHighlightSameYearPreviousPage)=\"highlightSameYearPreviousPage($event)\"\r\n />\r\n } }\r\n</div>\r\n", styles: [""], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: i2.DaysViewComponent, selector: "ard-days-view", inputs: ["tabIndex", "readOnly", "disabled", "autoFocus", "_isUsingKeyboard", "activeYear", "activeMonth", "selectedDate", "min", "max", "isDayFilteredOut", "highlightedDay", "firstWeekday", "daysViewHeaderTemplate", "floatingMonthTemplate", "weekdayTemplate", "dayTemplate"], outputs: ["triggerOpenYearsView", "triggerOpenMonthsView", "triggerSelectDay", "triggerChangeMonth", "triggerChangeYear", "triggerHighlightDay", "triggerHighlightNextDay", "triggerHighlightPreviousDay", "triggerHighlightFirstDay", "triggerHighlightLastDay", "triggerHighlightSameDayPreviousPage", "triggerHighlightSameDayNextPage", "focus", "blur"] }, { kind: "component", type: i3.MonthsViewComponent, selector: "ard-months-view", inputs: ["tabIndex", "readOnly", "disabled", "autoFocus", "_isUsingKeyboard", "color", "activeYear", "activeMonth", "selectedDate", "min", "max", "highlightedMonth", "monthsViewHeaderTemplate", "monthTemplate"], outputs: ["triggerOpenYearsView", "triggerOpenDaysView", "focus", "blur", "triggerSelectMonth", "triggeChangeYear", "triggerHighlightMonth", "triggerHighlightNextMonth", "triggerHighlightPreviousMonth", "triggerHighlightFirstMonth", "triggerHighlightLastMonth", "triggerHighlightSameMonthPreviousPage", "triggerHighlightSameMonthNextPage"] }, { kind: "component", type: i4.YearsViewComponent, selector: "ard-years-view", inputs: ["tabIndex", "readOnly", "disabled", "autoFocus", "_isUsingKeyboard", "activeYear", "selectedDate", "min", "max", "currentYearRangeStart", "highlightedYear", "yearsViewHeaderTemplate", "yearTemplate"], outputs: ["triggerOpenMonthsView", "triggerOpenDaysView", "focus", "blur", "triggerSelectYear", "triggerChangeYearsViewPage", "triggerHighlightYear", "triggerHighlightNextYear", "triggerHighlightPreviousYear", "triggerHighlightFirstYear", "triggerHighlightLastYear", "triggerHighlightSameYearPreviousPage", "triggerHighlightSameYearNextPage"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
423
+ }
424
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ArdiumCalendarComponent, decorators: [{
425
+ type: Component,
426
+ args: [{ selector: 'ard-calendar', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\r\n class=\"ard-calendar\"\r\n [ngClass]=\"ngClasses()\"\r\n>\r\n @switch (activeView()) { @case ('days') {\r\n <ard-days-view\r\n [tabIndex]=\"tabIndex()\"\r\n [readOnly]=\"readonly()\"\r\n [disabled]=\"disabled()\"\r\n [autoFocus]=\"autoFocus()\"\r\n [_isUsingKeyboard]=\"_isUsingKeyboard()\"\r\n [activeMonth]=\"activeMonth()\"\r\n [activeYear]=\"activeYear()\"\r\n [selectedDate]=\"selectedDate()\"\r\n [firstWeekday]=\"firstWeekday()\"\r\n [highlightedDay]=\"highlightedDay()\"\r\n [min]=\"min()\"\r\n [max]=\"max()\"\r\n [isDayFilteredOut]=\"isDayFilteredOut()\"\r\n [daysViewHeaderTemplate]=\"daysViewHeaderTemplate()\"\r\n [floatingMonthTemplate]=\"floatingMonthTemplate()\"\r\n [weekdayTemplate]=\"weekdayTemplate()\"\r\n [dayTemplate]=\"dayTemplate()\"\r\n (focus)=\"onFocus($event)\"\r\n (blur)=\"onBlur($event)\"\r\n (triggerOpenMonthsView)=\"onTriggerOpenMonthsView()\"\r\n (triggerOpenYearsView)=\"onTriggerOpenYearsView()\"\r\n (triggerChangeMonth)=\"changeMonth($event)\"\r\n (triggerChangeYear)=\"changeYear($event)\"\r\n (triggerHighlightDay)=\"setHighlightedDay($event)\"\r\n (triggerHighlightFirstDay)=\"highlightFirstDay()\"\r\n (triggerHighlightLastDay)=\"highlightLastDay()\"\r\n (triggerHighlightNextDay)=\"highlightNextDay($event)\"\r\n (triggerHighlightPreviousDay)=\"highlightPreviousDay($event)\"\r\n (triggerHighlightSameDayNextPage)=\"$event ? highlightSameDayNextYear() : highlightSameDayNextMonth()\"\r\n (triggerHighlightSameDayPreviousPage)=\"$event ? highlightSameDayPreviousYear() : highlightSameDayPreviousMonth()\"\r\n (triggerSelectDay)=\"selectDay($event)\"\r\n />\r\n } @case ('months') {\r\n <ard-months-view\r\n [tabIndex]=\"tabIndex()\"\r\n [readOnly]=\"readonly()\"\r\n [disabled]=\"disabled()\"\r\n [autoFocus]=\"autoFocus()\"\r\n [_isUsingKeyboard]=\"_isUsingKeyboard()\"\r\n [color]=\"color()\"\r\n [activeMonth]=\"activeMonth()\"\r\n [activeYear]=\"activeYear()\"\r\n [selectedDate]=\"selectedDate()\"\r\n [min]=\"min()\"\r\n [max]=\"max()\"\r\n [highlightedMonth]=\"highlightedMonth()\"\r\n [monthsViewHeaderTemplate]=\"monthsViewHeaderTemplate()\"\r\n [monthTemplate]=\"monthTemplate()\"\r\n (focus)=\"onFocus($event)\"\r\n (blur)=\"onBlur($event)\"\r\n (triggerOpenDaysView)=\"onTriggerOpenDaysView()\"\r\n (triggerOpenYearsView)=\"onTriggerOpenYearsView()\"\r\n (triggeChangeYear)=\"changeYear($event)\"\r\n (triggerSelectMonth)=\"selectMonth($event)\"\r\n (triggerHighlightMonth)=\"setHighlightedMonth($event)\"\r\n (triggerHighlightFirstMonth)=\"highlightFirstMonth()\"\r\n (triggerHighlightLastMonth)=\"highlightLastMonth()\"\r\n (triggerHighlightNextMonth)=\"highlightNextMonth($event)\"\r\n (triggerHighlightPreviousMonth)=\"highlightPreviousMonth($event)\"\r\n (triggerHighlightSameMonthNextPage)=\"highlightSameMonthNextYear($event)\"\r\n (triggerHighlightSameMonthPreviousPage)=\"highlightSameMonthPreviousYear($event)\"\r\n />\r\n } @case ('years') {\r\n <ard-years-view\r\n [tabIndex]=\"tabIndex()\"\r\n [readOnly]=\"readonly()\"\r\n [disabled]=\"disabled()\"\r\n [autoFocus]=\"autoFocus()\"\r\n [_isUsingKeyboard]=\"_isUsingKeyboard()\"\r\n [highlightedYear]=\"highlightedYear()\"\r\n [currentYearRangeStart]=\"currentYearRangeStart()\"\r\n [activeYear]=\"activeYear()\"\r\n [selectedDate]=\"selectedDate()\"\r\n [min]=\"min()\"\r\n [max]=\"max()\"\r\n [yearsViewHeaderTemplate]=\"yearsViewHeaderTemplate()\"\r\n [yearTemplate]=\"yearTemplate()\"\r\n (focus)=\"onFocus($event)\"\r\n (blur)=\"onBlur($event)\"\r\n (triggerOpenDaysView)=\"onTriggerOpenDaysView()\"\r\n (triggerOpenMonthsView)=\"onTriggerOpenMonthsView()\"\r\n (triggerSelectYear)=\"selectYear($event)\"\r\n (triggerChangeYearsViewPage)=\"changeYearsViewPage($event)\"\r\n (triggerHighlightYear)=\"setHighlightedYear($event)\"\r\n (triggerHighlightFirstYear)=\"highlightFirstYear()\"\r\n (triggerHighlightLastYear)=\"highlightLastYear()\"\r\n (triggerHighlightNextYear)=\"highlightNextYear($event)\"\r\n (triggerHighlightPreviousYear)=\"highlightPreviousYear($event)\"\r\n (triggerHighlightSameYearNextPage)=\"highlightSameYearNextPage($event)\"\r\n (triggerHighlightSameYearPreviousPage)=\"highlightSameYearPreviousPage($event)\"\r\n />\r\n } }\r\n</div>\r\n" }]
427
+ }], ctorParameters: () => [{ type: undefined, decorators: [{
428
+ type: Inject,
429
+ args: [ARD_CALENDAR_DEFAULTS]
430
+ }] }], propDecorators: { onDocumentMousemove: [{
431
+ type: HostListener,
432
+ args: ['document:mousemove']
433
+ }], onDocumentKeydown: [{
434
+ type: HostListener,
435
+ args: ['document:keydown']
436
+ }] } });
437
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdWkvc3JjL2xpYi9jYWxlbmRhci9jYWxlbmRhci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy91aS9zcmMvbGliL2NhbGVuZGFyL2NhbGVuZGFyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFFBQVEsRUFDUixZQUFZLEVBQ1osTUFBTSxFQUNOLFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUNMLEtBQUssRUFDTCxNQUFNLEVBQ04sTUFBTSxFQUNOLFdBQVcsRUFDWCxpQkFBaUIsR0FDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLHFCQUFxQixFQUFFLGtCQUFrQixFQUFFLG9CQUFvQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDcEcsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM5QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNoRCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUV2RSxPQUFPLEVBQUUscUJBQXFCLEVBQXVCLE1BQU0scUJBQXFCLENBQUM7QUFDakYsT0FBTyxFQUVMLGVBQWUsR0FTaEIsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDdEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDNUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7Ozs7OztBQUV6RSxNQUFNLEtBQUssR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO0FBU3pCLE1BQU0sT0FBTyx1QkFBd0IsU0FB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QUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUNwRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUtELG1CQUFtQjtRQUNqQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRCxpQkFBaUI7UUFDZixJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2xDLENBQUM7K0dBL2JVLHVCQUF1QixrQkFFZCxxQkFBcUI7bUdBRjlCLHVCQUF1Qix5M0RBa2MyRCxXQUFXLDJHQUNULFdBQVcseUdBQ2YsV0FBVyx3R0FDYixXQUFXLCtGQUM3QixXQUFXLGdHQUNULFdBQVcsOEZBQ2YsV0FBVyxrR0FDSCxXQUFXLHVGQ3ZmMUYsMDJJQW1HQTs7NEZEckRhLHVCQUF1QjtrQkFQbkMsU0FBUzsrQkFDRSxjQUFjLGlCQUdULGlCQUFpQixDQUFDLElBQUksbUJBQ3BCLHVCQUF1QixDQUFDLE1BQU07OzBCQUlsQyxNQUFNOzJCQUFDLHFCQUFxQjt5Q0F1YnpDLG1CQUFtQjtzQkFEbEIsWUFBWTt1QkFBQyxvQkFBb0I7Z0JBS2xDLGlCQUFpQjtzQkFEaEIsWUFBWTt1QkFBQyxrQkFBa0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxyXG4gIENvbXBvbmVudCxcclxuICBjb21wdXRlZCxcclxuICBjb250ZW50Q2hpbGQsXHJcbiAgZWZmZWN0LFxyXG4gIEhvc3RMaXN0ZW5lcixcclxuICBJbmplY3QsXHJcbiAgaW5wdXQsXHJcbiAgbW9kZWwsXHJcbiAgb3V0cHV0LFxyXG4gIHNpZ25hbCxcclxuICBUZW1wbGF0ZVJlZixcclxuICBWaWV3RW5jYXBzdWxhdGlvbixcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgY29lcmNlQm9vbGVhblByb3BlcnR5LCBjb2VyY2VEYXRlUHJvcGVydHksIGNvZXJjZU51bWJlclByb3BlcnR5IH0gZnJvbSAnQGFyZGl1bS11aS9kZXZraXQnO1xyXG5pbXBvcnQgeyByb3VuZEZyb21aZXJvIH0gZnJvbSAnbW9yZS1yb3VuZGluZyc7XHJcbmltcG9ydCB7IGlzRGVmaW5lZCwgaXNOdWxsIH0gZnJvbSAnc2ltcGxlLWJvb2wnO1xyXG5pbXBvcnQgeyBfTmdNb2RlbENvbXBvbmVudEJhc2UgfSBmcm9tICcuLi9faW50ZXJuYWwvbmdtb2RlbC1jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBDb21wb25lbnRDb2xvciB9IGZyb20gJy4uL3R5cGVzL2NvbG9ycy50eXBlcyc7XHJcbmltcG9ydCB7IEFSRF9DQUxFTkRBUl9ERUZBVUxUUywgQXJkQ2FsZW5kYXJEZWZhdWx0cyB9IGZyb20gJy4vY2FsZW5kYXIuZGVmYXVsdHMnO1xyXG5pbXBvcnQge1xyXG4gIEFyZENhbGVuZGFyRmlsdGVyRm4sXHJcbiAgQXJkQ2FsZW5kYXJWaWV3LFxyXG4gIENhbGVuZGFyRGF5Q29udGV4dCxcclxuICBDYWxlbmRhckRheXNWaWV3SGVhZGVyQ29udGV4dCxcclxuICBDYWxlbmRhckZsb2F0aW5nTW9udGhDb250ZXh0LFxyXG4gIENhbGVuZGFyTW9udGhDb250ZXh0LFxyXG4gIENhbGVuZGFyTW9udGhzVmlld0hlYWRlckNvbnRleHQsXHJcbiAgQ2FsZW5kYXJXZWVrZGF5Q29udGV4dCxcclxuICBDYWxlbmRhclllYXJDb250ZXh0LFxyXG4gIENhbGVuZGFyWWVhcnNWaWV3SGVhZGVyQ29udGV4dCxcclxufSBmcm9tICcuL2NhbGVuZGFyLnR5cGVzJztcclxuaW1wb3J0IHsgaXNEYXlPdXRPZlJhbmdlIH0gZnJvbSAnLi92aWV3cy9kYXlzLXZpZXcvZGF5cy12aWV3LmhlbHBlcnMnO1xyXG5pbXBvcnQgeyBpc01vbnRoT3V0T2ZSYW5nZSB9IGZyb20gJy4vdmlld3MvbW9udGhzLXZpZXcvbW9udGhzLXZpZXcuaGVscGVycyc7XHJcbmltcG9ydCB7IGlzWWVhck91dE9mUmFuZ2UgfSBmcm9tICcuL3ZpZXdzL3llYXJzLXZpZXcveWVhcnMtdmlldy5oZWxwZXJzJztcclxuXHJcbmNvbnN0IFRPREFZID0gbmV3IERhdGUoKTtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYXJkLWNhbGVuZGFyJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vY2FsZW5kYXIuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2NhbGVuZGFyLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcclxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcclxufSlcclxuZXhwb3J0IGNsYXNzIEFyZGl1bUNhbGVuZGFyQ29tcG9uZW50IGV4dGVuZHMgX05nTW9kZWxDb21wb25lbnRCYXNlIHtcclxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcmVhZG9ubHkgX0RFRkFVTFRTITogQXJkQ2FsZW5kYXJEZWZhdWx0cztcclxuICBjb25zdHJ1Y3RvcihASW5qZWN0KEFSRF9DQUxFTkRBUl9ERUZBVUxUUykgZGVmYXVsdHM6IEFyZENhbGVuZGFyRGVmYXVsdHMpIHtcclxuICAgIHN1cGVyKGRlZmF1bHRzKTtcclxuXHJcbiAgICBlZmZlY3QoKCkgPT4ge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkRGF0ZSgpOyAvLyB0cmlnZ2VyIGVmZmVjdFxyXG4gICAgICB0aGlzLl9lbWl0Q2hhbmdlKCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8vISBhcHBlYXJhbmNlXHJcbiAgcmVhZG9ubHkgY29sb3IgPSBpbnB1dDxDb21wb25lbnRDb2xvcj4odGhpcy5fREVGQVVMVFMuY29sb3IpO1xyXG5cclxuICByZWFkb25seSBuZ0NsYXNzZXMgPSBjb21wdXRlZCgoKTogc3RyaW5nID0+IFtgYXJkLWNvbG9yLSR7dGhpcy5jb2xvcigpfWBdLmpvaW4oJyAnKSk7XHJcblxyXG4gIC8vISBhY3RpdmUgdmlld1xyXG4gIHJlYWRvbmx5IGFjdGl2ZVZpZXcgPSBtb2RlbDxBcmRDYWxlbmRhclZpZXc+KHRoaXMuX0RFRkFVTFRTLmFjdGl2ZVZpZXcpO1xyXG4gIHJlYWRvbmx5IGFjdGl2ZVllYXIgPSBtb2RlbDxudW1iZXI+KHRoaXMuX0RFRkFVTFRTLmFjdGl2ZVllYXIpO1xyXG4gIHJlYWRvbmx5IGFjdGl2ZU1vbnRoID0gbW9kZWw8bnVtYmVyPih0aGlzLl9ERUZBVUxUUy5hY3RpdmVNb250aCk7XHJcblxyXG4gIHJlYWRvbmx5IGZpcnN0V2Vla2RheSA9IGlucHV0PG51bWJlciwgYW55Pih0aGlzLl9ERUZBVUxUUy5maXJzdFdlZWtkYXksIHtcclxuICAgIHRyYW5zZm9ybTogdiA9PiB7XHJcbiAgICAgIGNvbnN0IHZhbHVlID0gY29lcmNlTnVtYmVyUHJvcGVydHkodiwgdGhpcy5fREVGQVVMVFMuZmlyc3RXZWVrZGF5KTtcclxuICAgICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKHZhbHVlKSkge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXHJcbiAgICAgICAgICBuZXcgRXJyb3IoYEFSRC1ORjIwMDFBOiBbZmlyc3RXZWVrZGF5XSBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciwgZ290IFwiJHt2YWx1ZX1cIi4gVXNpbmcgZGVmYXVsdCB2YWx1ZSBpbnN0ZWFkLmApXHJcbiAgICAgICAgKTtcclxuICAgICAgICByZXR1cm4gMTtcclxuICAgICAgfVxyXG4gICAgICBpZiAodmFsdWUgPCAwIHx8IHZhbHVlID4gNikge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXHJcbiAgICAgICAgICBuZXcgRXJyb3IoXHJcbiAgICAgICAgICAgIGBBUkQtTkYyMDAxQjogW2ZpcnN0V2Vla2RheV0gbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDYsIGdvdCBcIiR7dmFsdWV9XCIuIFVzaW5nIG1vZHVsbyBvcGVyYXRvciB0byBhZGp1c3QgdGhlIHZhbHVlLmBcclxuICAgICAgICAgIClcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiB2YWx1ZSAlIDc7XHJcbiAgICB9LFxyXG4gIH0pO1xyXG5cclxuICByZWFkb25seSBtdWx0aXBsZVllYXJQYWdlQ2hhbmdlTW9kaWZpZXIgPSBpbnB1dDxudW1iZXIsIGFueT4odGhpcy5fREVGQVVMVFMubXVsdGlwbGVZZWFyUGFnZUNoYW5nZU1vZGlmaWVyLCB7XHJcbiAgICB0cmFuc2Zvcm06IHYgPT4ge1xyXG4gICAgICBjb25zdCB2YWx1ZSA9IGNvZXJjZU51bWJlclByb3BlcnR5KHYsIHRoaXMuX0RFRkFVTFRTLm11bHRpcGxlWWVhclBhZ2VDaGFuZ2VNb2RpZmllcik7XHJcbiAgICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcih2YWx1ZSkgfHwgdmFsdWUgPCAxKSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihcclxuICAgICAgICAgIG5ldyBFcnJvcihcclxuICAgICAgICAgICAgYEFSRC1ORjIwMDI6IFttdWx0aXBsZVllYXJQYWdlQ2hhbmdlTW9kaWZpZXJdIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyLCBnb3QgXCIke3ZhbHVlfVwiLiBVc2luZyBkZWZhdWx0IHZhbHVlIGluc3RlYWQuYFxyXG4gICAgICAgICAgKVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgcmV0dXJuIDU7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgfSxcclxuICB9KTtcclxuXHJcbiAgcmVhZG9ubHkgYXV0b0ZvY3VzID0gaW5wdXQ8Ym9vbGVhbiwgYW55Pih0aGlzLl9ERUZBVUxUUy5hdXRvRm9jdXMsIHsgdHJhbnNmb3JtOiB2ID0+IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2KSB9KTtcclxuXHJcbiAgb25UcmlnZ2VyT3BlbkRheXNWaWV3KCk6IHZvaWQge1xyXG4gICAgdGhpcy5hY3RpdmVWaWV3LnNldChBcmRDYWxlbmRhclZpZXcuRGF5cyk7XHJcbiAgfVxyXG4gIG9uVHJpZ2dlck9wZW5Nb250aHNWaWV3KCk6IHZvaWQge1xyXG4gICAgdGhpcy5hY3RpdmVWaWV3LnNldChBcmRDYWxlbmRhclZpZXcuTW9udGhzKTtcclxuICB9XHJcbiAgb25UcmlnZ2VyT3BlblllYXJzVmlldygpOiB2b2lkIHtcclxuICAgIHRoaXMuYWN0aXZlVmlldy5zZXQoQXJkQ2FsZW5kYXJWaWV3LlllYXJzKTtcclxuICB9XHJcblxyXG4gIC8vISB2YWx1ZVxyXG4gIHJlYWRvbmx5IHNlbGVjdGVkRGF0ZSA9IG1vZGVsPERhdGUgfCBudWxsPihudWxsLCB7IGFsaWFzOiAnc2VsZWN0ZWQnIH0pO1xyXG5cclxuICByZWFkb25seSB5ZWFyU2VsZWN0ID0gb3V0cHV0PG51bWJlcj4oKTtcclxuICByZWFkb25seSBtb250aFNlbGVjdCA9IG91dHB1dDxudW1iZXI+KCk7XHJcblxyXG4gIHJlYWRvbmx5IG1pbiA9IGlucHV0PERhdGUgfCBudWxsLCBhbnk+KHRoaXMuX0RFRkFVTFRTLm1pbiwgeyB0cmFuc2Zvcm06IHYgPT4gY29lcmNlRGF0ZVByb3BlcnR5KHYsIHRoaXMuX0RFRkFVTFRTLm1pbikgfSk7XHJcbiAgcmVhZG9ubHkgbWF4ID0gaW5wdXQ8RGF0ZSB8IG51bGwsIGFueT4odGhpcy5fREVGQVVMVFMubWF4LCB7IHRyYW5zZm9ybTogdiA9PiBjb2VyY2VEYXRlUHJvcGVydHkodiwgdGhpcy5fREVGQVVMVFMubWF4KSB9KTtcclxuXHJcbiAgcmVhZG9ubHkgZmlsdGVyID0gaW5wdXQ8QXJkQ2FsZW5kYXJGaWx0ZXJGbiB8IG51bGw+KHRoaXMuX0RFRkFVTFRTLmZpbHRlcik7XHJcblxyXG4gIG92ZXJyaWRlIHdyaXRlVmFsdWUodjogYW55KTogdm9pZCB7XHJcbiAgICBpZiAodiBpbnN0YW5jZW9mIERhdGUpIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZERhdGUuc2V0KHYpO1xyXG4gICAgfSBlbHNlIGlmICghaXNEZWZpbmVkKHYpKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWREYXRlLnNldChudWxsKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IobmV3IEVycm9yKGBBUkQtTkYyMDAzOiA8YXJkLWNhbGVuZGFyPiBbd3JpdGVWYWx1ZV0gZXhwZWN0ZWQgYSBEYXRlIG9yIG51bGwsIGdvdCBcIiR7dn1cIi5gKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgX2VtaXRDaGFuZ2UoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9vbkNoYW5nZVJlZ2lzdGVyZWQ/Lih0aGlzLnNlbGVjdGVkRGF0ZSgpKTtcclxuICB9XHJcblxyXG4gIC8vISBzZWxlY3RpbmcgZGF5c1xyXG4gIGlzRGF5U2VsZWN0ZWQoZGF5OiBudW1iZXIgfCBEYXRlIHwgbnVsbCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKGRheSBpbnN0YW5jZW9mIERhdGUpIGRheSA9IGRheS5nZXREYXRlKCk7XHJcbiAgICByZXR1cm4gKFxyXG4gICAgICB0aGlzLnNlbGVjdGVkRGF0ZSgpICE9PSBudWxsICYmXHJcbiAgICAgIHRoaXMuYWN0aXZlWWVhcigpID09PSB0aGlzLnNlbGVjdGVkRGF0ZSgpPy5nZXRGdWxsWWVhcigpICYmXHJcbiAgICAgIHRoaXMuYWN0aXZlTW9udGgoKSA9PT0gdGhpcy5zZWxlY3RlZERhdGUoKT8uZ2V0TW9udGgoKSAmJlxyXG4gICAgICBkYXkgPT09IHRoaXMuc2VsZWN0ZWREYXRlKCk/LmdldERhdGUoKVxyXG4gICAgKTtcclxuICB9XHJcbiAgaXNEYXlPdXRPZlJhbmdlKGRheTogbnVtYmVyLCBtb250aDogbnVtYmVyID0gdGhpcy5hY3RpdmVNb250aCgpLCB5ZWFyOiBudW1iZXIgPSB0aGlzLmFjdGl2ZVllYXIoKSk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gaXNEYXlPdXRPZlJhbmdlKGRheSwgbW9udGgsIHllYXIsIHRoaXMubWluKCksIHRoaXMubWF4KCkpO1xyXG4gIH1cclxuICByZWFkb25seSBpc0RheUZpbHRlcmVkT3V0ID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gICAgcmV0dXJuIChkYXk6IG51bWJlciwgbW9udGg6IG51bWJlciA9IHRoaXMuYWN0aXZlTW9udGgoKSwgeWVhcjogbnVtYmVyID0gdGhpcy5hY3RpdmVZZWFyKCkpOiBib29sZWFuID0+IHtcclxuICAgICAgY29uc3QgZmlsdGVyID0gdGhpcy5maWx0ZXIoKTtcclxuICAgICAgcmV0dXJuIGZpbHRlcj8uKG5ldyBEYXRlKHllYXIsIG1vbnRoLCBkYXkpKSA/PyBmYWxzZTtcclxuICAgIH07XHJcbiAgfSk7XHJcbiAgc2VsZWN0RGF5KGRheTogbnVtYmVyIHwgRGF0ZSB8IG51bGwpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmlzRGF5U2VsZWN0ZWQoZGF5KSkgcmV0dXJuO1xyXG4gICAgaWYgKGlzTnVsbChkYXkpKSB7XHJcbiAgICAgIGlmICghaXNEZWZpbmVkKHRoaXMuc2VsZWN0ZWREYXRlKCkpKSByZXR1cm47XHJcblxyXG4gICAgICB0aGlzLnNlbGVjdGVkRGF0ZS5zZXQobnVsbCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZGF5IGluc3RhbmNlb2YgRGF0ZSkgZGF5ID0gZGF5LmdldERhdGUoKTtcclxuICAgIGlmIChkYXkgJiYgdGhpcy5pc0RheU91dE9mUmFuZ2UoZGF5KSB8fCB0aGlzLmlzRGF5RmlsdGVyZWRPdXQoKShkYXkpKSByZXR1cm47XHJcblxyXG4gICAgdGhpcy5zZWxlY3RlZERhdGUuc2V0KG5ldyBEYXRlKHRoaXMuYWN0aXZlWWVhcigpLCB0aGlzLmFjdGl2ZU1vbnRoKCksIGRheSwgMCwgMCwgMCwgMCkpO1xyXG4gIH1cclxuICBzZWxlY3RDdXJyZW50bHlIaWdobGlnaHRlZERheSgpOiB2b2lkIHtcclxuICAgIGlmICghaXNEZWZpbmVkKHRoaXMuaGlnaGxpZ2h0ZWREYXkoKSkpIHJldHVybjtcclxuXHJcbiAgICB0aGlzLnNlbGVjdERheSh0aGlzLmhpZ2hsaWdodGVkRGF5KCkpO1xyXG4gIH1cclxuXHJcbiAgLy8hIGhpZ2hsaWdodGluZyBkYXlzXHJcbiAgcHJpdmF0ZSByZWFkb25seSBfX2hpZ2hsaWdodGVkRGF5ID0gc2lnbmFsPG51bWJlciB8IG51bGw+KG51bGwpO1xyXG4gIHJlYWRvbmx5IGhpZ2hsaWdodGVkRGF5ID0gdGhpcy5fX2hpZ2hsaWdodGVkRGF5LmFzUmVhZG9ubHkoKTtcclxuXHJcbiAgc2V0SGlnaGxpZ2h0ZWREYXkoZGF5OiBudW1iZXIgfCBudWxsLCBtb250aDogbnVtYmVyID0gdGhpcy5hY3RpdmVNb250aCgpLCB5ZWFyOiBudW1iZXIgPSB0aGlzLmFjdGl2ZVllYXIoKSk6IHZvaWQge1xyXG4gICAgaWYgKGlzTnVsbChkYXkpKSB7XHJcbiAgICAgIHRoaXMuX19oaWdobGlnaHRlZERheS51cGRhdGUoKCkgPT4gZGF5KTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHllYXIsIG1vbnRoLCBkYXkpO1xyXG4gICAgY29uc3Qgb3V0T2ZSYW5nZSA9IHRoaXMuaXNEYXlPdXRPZlJhbmdlKGRheSwgbW9udGgsIHllYXIpO1xyXG5cclxuICAgIGlmIChvdXRPZlJhbmdlID09PSAtMSkge1xyXG4gICAgICB0aGlzLl9oaWdobGlnaHRNaW5EYXkoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKG91dE9mUmFuZ2UgPT09IDEpIHtcclxuICAgICAgdGhpcy5faGlnaGxpZ2h0TWF4RGF5KCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl9faGlnaGxpZ2h0ZWREYXkudXBkYXRlKCgpID0+IGRhdGUuZ2V0RGF0ZSgpKTtcclxuXHJcbiAgICBpZiAoZGF0ZS5nZXRGdWxsWWVhcigpICE9PSB0aGlzLmFjdGl2ZVllYXIoKSkge1xyXG4gICAgICB0aGlzLmFjdGl2ZVllYXIuc2V0KGRhdGUuZ2V0RnVsbFllYXIoKSk7XHJcbiAgICB9XHJcbiAgICBpZiAoZGF0ZS5nZXRNb250aCgpICE9PSB0aGlzLmFjdGl2ZU1vbnRoKCkpIHtcclxuICAgICAgdGhpcy5hY3RpdmVNb250aC5zZXQoZGF0ZS5nZXRNb250aCgpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2hpZ2hsaWdodE1pbkRheSgpOiB2b2lkIHtcclxuICAgIGNvbnN0IG1pbiA9IHRoaXMubWluKCk7XHJcbiAgICBpZiAoIWlzRGVmaW5lZChtaW4pKSByZXR1cm47XHJcblxyXG4gICAgdGhpcy5hY3RpdmVZZWFyLnNldChtaW4uZ2V0RnVsbFllYXIoKSk7XHJcbiAgICB0aGlzLmFjdGl2ZU1vbnRoLnNldChtaW4uZ2V0TW9udGgoKSk7XHJcbiAgICB0aGlzLl9faGlnaGxpZ2h0ZWREYXkuc2V0KG1pbi5nZXREYXRlKCkpO1xyXG4gIH1cclxuICBwcml2YXRlIF9oaWdobGlnaHRNYXhEYXkoKTogdm9pZCB7XHJcbiAgICBjb25zdCBtYXggPSB0aGlzLm1heCgpO1xyXG4gICAgaWYgKCFpc0RlZmluZWQobWF4KSkgcmV0dXJuO1xyXG5cclxuICAgIHRoaXMuYWN0aXZlWWVhci5zZXQobWF4LmdldEZ1bGxZZWFyKCkpO1xyXG4gICAgdGhpcy5hY3RpdmVNb250aC5zZXQobWF4LmdldE1vbnRoKCkpO1xyXG4gICAgdGhpcy5fX2hpZ2hsaWdodGVkRGF5LnNldChtYXguZ2V0RGF0ZSgpKTtcclxuICB9XHJcblxyXG4gIGhpZ2hsaWdodE5leHREYXkob2Zmc2V0ID0gMSk6IHZvaWQge1xyXG4gICAgY29uc3QgY3VycmVudERheSA9IHRoaXMuaGlnaGxpZ2h0ZWREYXkoKTtcclxuICAgIGNvbnN0IG5ld0RheSA9IGlzRGVmaW5lZChjdXJyZW50RGF5KSA/IGN1cnJlbnREYXkgKyBvZmZzZXQgOiAxO1xyXG4gICAgdGhpcy5zZXRIaWdobGlnaHRlZERheShuZXdEYXkpO1xyXG4gIH1cclxuICBoaWdobGlnaHRQcmV2aW91c0RheShvZmZzZXQgPSAxKTogdm9pZCB7XHJcbiAgICB0aGlzLmhpZ2hsaWdodE5leHREYXkob2Zmc2V0ICogLTEpO1xyXG4gIH1cclxuICBoaWdobGlnaHRGaXJzdERheSgpOiB2b2lkIHtcclxuICAgIHRoaXMuc2V0SGlnaGxpZ2h0ZWREYXkoMSk7XHJcbiAgfVxyXG4gIGhpZ2hsaWdodExhc3REYXkoKTogdm9pZCB7XHJcbiAgICBjb25zdCBkYXlzSW5Nb250aCA9IG5ldyBEYXRlKHRoaXMuYWN0aXZlWWVhcigpLCB0aGlzLmFjdGl2ZU1vbnRoKCkgKyAxLCAwKS5nZXREYXRlKCk7XHJcbiAgICB0aGlzLnNldEhpZ2hsaWdodGVkRGF5KGRheXNJbk1vbnRoKTtcclxuICB9XHJcbiAgaGlnaGxpZ2h0U2FtZURheU5leHRNb250aCgpOiB2b2lkIHtcclxuICAgIGNvbnN0IG1vbnRoID0gdGhpcy5hY3RpdmVNb250aCgpO1xyXG4gICAgY29uc3QgeWVhciA9IHRoaXMuYWN0aXZlWWVhcigpO1xyXG4gICAgY29uc3QgbmV3TW9udGggPSBtb250aCArIDE7XHJcbiAgICBjb25zdCBuZXdZZWFyID0geWVhciArIE1hdGguZmxvb3IobmV3TW9udGggLyAxMik7XHJcbiAgICB0aGlzLnNldEhpZ2hsaWdodGVkRGF5KHRoaXMuaGlnaGxpZ2h0ZWREYXkoKSwgbmV3TW9udGggJSAxMiwgbmV3WWVhcik7XHJcbiAgfVxyXG4gIGhpZ2hsaWdodFNhbWVEYXlQcmV2aW91c01vbnRoKCk6IHZvaWQge1xyXG4gICAgY29uc3QgbW9udGggPSB0aGlzLmFjdGl2ZU1vbnRoKCk7XHJcbiAgICBjb25zdCB5ZWFyID0gdGhpcy5hY3RpdmVZZWFyKCk7XHJcbiAgICBjb25zdCBuZXdNb250aCA9IG1vbnRoIC0gMTtcclxuICAgIGNvbnN0IG5ld1llYXIgPSB5ZWFyICsgTWF0aC5mbG9vcihuZXdNb250aCAvIDEyKTtcclxuICAgIHRoaXMuc2V0SGlnaGxpZ2h0ZWREYXkodGhpcy5oaWdobGlnaHRlZERheSgpLCBuZXdNb250aCAlIDEyLCBuZXdZZWFyKTtcclxuICB9XHJcbiAgaGlnaGxpZ2h0U2FtZURheU5leHRZZWFyKCk6IHZvaWQge1xyXG4gICAgdGhpcy5zZXRIaWdobGlnaHRlZERheSh0aGlzLmhpZ2hsaWdodGVkRGF5KCksIHRoaXMuYWN0aXZlTW9udGgoKSwgdGhpcy5hY3RpdmVZZWFyKCkgKyAxKTtcclxuICB9XHJcbiAgaGlnaGxpZ2h0U2FtZURheVByZXZpb3VzWWVhcigpOiB2b2lkIHtcclxuICAgIHRoaXMuc2V0SGlnaGxpZ2h0ZWREYXkodGhpcy5oaWdobGlnaHRlZERheSgpLCB0aGlzLmFjdGl2ZU1vbnRoKCksIHRoaXMuYWN0aXZlWWVhcigpIC0gMSk7XHJcbiAgfVxyXG5cclxuICAvLyEgc2VsZWN0aW5nIG1vbnRoc1xyXG4gIGlzTW9udGhTZWxlY3RlZChtb250aDogbnVtYmVyIHwgRGF0ZSk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKG1vbnRoIGluc3RhbmNlb2YgRGF0ZSkgbW9udGggPSBtb250aC5nZXRNb250aCgpO1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgdGhpcy5zZWxlY3RlZERhdGUoKSAhPT0gbnVsbCAmJlxyXG4gICAgICB0aGlzLmFjdGl2ZVllYXIoKSA9PT0gdGhpcy5zZWxlY3RlZERhdGUoKT8uZ2V0RnVsbFllYXIoKSAmJlxyXG4gICAgICBtb250aCA9PT0gdGhpcy5zZWxlY3RlZERhdGUoKT8uZ2V0TW9udGgoKVxyXG4gICAgKTtcclxuICB9XHJcbiAgaXNNb250aE91dE9mUmFuZ2UobW9udGg6IG51bWJlciwgeWVhcjogbnVtYmVyID0gdGhpcy5hY3RpdmVZZWFyKCkpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIGlzTW9udGhPdXRPZlJhbmdlKG1vbnRoLCB5ZWFyLCB0aGlzLm1pbigpLCB0aGlzLm1heCgpKTtcclxuICB9XHJcbiAgY2hhbmdlTW9udGgobmV3TW9udGg6IG51bWJlciB8IG51bGwpOiBib29sZWFuIHtcclxuICAgIGlmIChpc051bGwobmV3TW9udGgpKSB7XHJcbiAgICAgIHRoaXMuYWN0aXZlTW9udGguc2V0KFRPREFZLmdldE1vbnRoKCkpO1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5pc01vbnRoT3V0T2ZSYW5nZShuZXdNb250aCkpIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICBpZiAobmV3TW9udGggPiAxMSkge1xyXG4gICAgICB0aGlzLmFjdGl2ZU1vbnRoLnNldCgwKTtcclxuICAgICAgdGhpcy5hY3RpdmVZZWFyLnVwZGF0ZSh2ID0+IHYgKyAxKTtcclxuICAgIH0gZWxzZSBpZiAobmV3TW9udGggPCAwKSB7XHJcbiAgICAgIHRoaXMuYWN0aXZlTW9udGguc2V0KDExKTtcclxuICAgICAgdGhpcy5hY3RpdmVZZWFyLnVwZGF0ZSh2ID0+IHYgLSAxKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuYWN0aXZlTW9udGguc2V0KG5ld01vbnRoKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcbiAgc2VsZWN0TW9udGgobmV3TW9udGg6IG51bWJlciB8IG51bGwpOiB2b2lkIHtcclxuICAgIGlmIChpc051bGwobmV3TW9udGgpIHx8IHRoaXMuaXNNb250aE91dE9mUmFuZ2UobmV3TW9udGgpKSByZXR1cm47XHJcblxyXG4gICAgY29uc3Qgd2FzU3VjY2Vzc2Z1bCA9IHRoaXMuY2hhbmdlTW9udGgobmV3TW9udGgpO1xyXG4gICAgaWYgKCF3YXNTdWNjZXNzZnVsKSByZXR1cm47XHJcblxyXG4gICAgdGhpcy5hY3RpdmVWaWV3LnNldChBcmRDYWxlbmRhclZpZXcuRGF5cyk7XHJcbiAgICB0aGlzLm1vbnRoU2VsZWN0LmVtaXQobmV3TW9udGgpO1xyXG4gIH1cclxuICBzZWxlY3RDdXJyZW50bHlIaWdobGlnaHRlZE1vbnRoKCk6IHZvaWQge1xyXG4gICAgaWYgKCFpc0RlZmluZWQodGhpcy5oaWdobGlnaHRlZE1vbnRoKCkpKSByZXR1cm47XHJcblxyXG4gICAgdGhpcy5zZWxlY3RNb250aCh0aGlzLmhpZ2hsaWdodGVkTW9udGgoKSEpO1xyXG4gIH1cclxuXHJcbiAgLy8hIGhpZ2hsaWdodGluZyBtb250aHNcclxuICBwcml2YXRlIHJlYWRvbmx5IF9faGlnaGxpZ2h0ZWRNb250aCA9IHNpZ25hbDxudW1iZXIgfCBudWxsPihudWxsKTtcclxuICByZWFkb25seSBoaWdobGlnaHRlZE1vbnRoID0gdGhpcy5fX2hpZ2hsaWdodGVkTW9udGguYXNSZWFkb25seSgpO1xyXG5cclxuICBzZXRIaWdobGlnaHRlZE1vbnRoKG1vbnRoOiBudW1iZXIgfCBudWxsLCB5ZWFyOiBudW1iZXIgPSB0aGlzLmFjdGl2ZVllYXIoKSk6IHZvaWQge1xyXG4gICAgaWYgKGlzTnVsbChtb250aCkpIHtcclxuICAgICAgdGhpcy5fX2hpZ2hsaWdodGVkTW9udGgudXBkYXRlKCgpID0+IG1vbnRoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHllYXIsIG1vbnRoLCAxNSk7XHJcbiAgICBjb25zdCBvdXRPZlJhbmdlID0gdGhpcy5pc01vbnRoT3V0T2ZSYW5nZShtb250aCwgeWVhcik7XHJcblxyXG4gICAgaWYgKG91dE9mUmFuZ2UgPT09IC0xKSB7XHJcbiAgICAgIHRoaXMuX2hpZ2hsaWdodE1pbk1vbnRoKCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmIChvdXRPZlJhbmdlID09PSAxKSB7XHJcbiAgICAgIHRoaXMuX2hpZ2hsaWdodE1heE1vbnRoKCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl9faGlnaGxpZ2h0ZWRNb250aC51cGRhdGUoKCkgPT4gZGF0ZS5nZXRNb250aCgpKTtcclxuXHJcbiAgICBpZiAoZGF0ZS5nZXRGdWxsWWVhcigpICE9PSB0aGlzLmFjdGl2ZVllYXIoKSkge1xyXG4gICAgICB0aGlzLmFjdGl2ZVllYXIuc2V0KGRhdGUuZ2V0RnVsbFllYXIoKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9oaWdobGlnaHRNaW5Nb250aCgpOiB2b2lkIHtcclxuICAgIGNvbnN0IG1pbiA9IHRoaXMubWluKCk7XHJcbiAgICBpZiAoIWlzRGVmaW5lZChtaW4pKSByZXR1cm47XHJcblxyXG4gICAgdGhpcy5hY3RpdmVZZWFyLnNldChtaW4uZ2V0RnVsbFllYXIoKSk7XHJcbiAgICB0aGlzLl9faGlnaGxpZ2h0ZWRNb250aC5zZXQobWluLmdldE1vbnRoKCkpO1xyXG4gIH1cclxuICBwcml2YXRlIF9oaWdobGlnaHRNYXhNb250aCgpOiB2b2lkIHtcclxuICAgIGNvbnN0IG1heCA9IHRoaXMubWF4KCk7XHJcbiAgICBpZiAoIWlzRGVmaW5lZChtYXgpKSByZXR1cm47XHJcblxyXG4gICAgdGhpcy5hY3RpdmVZZWFyLnNldChtYXguZ2V0RnVsbFllYXIoKSk7XHJcbiAgICB0aGlzLl9faGlnaGxpZ2h0ZWRNb250aC5zZXQobWF4LmdldE1vbnRoKCkpO1xyXG4gIH1cclxuXHJcbiAgaGlnaGxpZ2h0TmV4dE1vbnRoKG9mZnNldCA9IDEpOiB2b2lkIHtcclxuICAgIGNvbnN0IGN1cnJlbnRNb250aCA9IHRoaXMuaGlnaGxpZ2h0ZWRNb250aCgpO1xyXG4gICAgY29uc3QgbmV3TW9udGggPSBpc0RlZmluZWQoY3VycmVudE1vbnRoKSA/IGN1cnJlbnRNb250aCArIG9mZnNldCA6IDA7XHJcbiAgICB0aGlzLnNldEhpZ2hsaWdodGVkTW9udGgobmV3TW9udGgpO1xyXG4gIH1cclxuICBoaWdobGlnaHRQcmV2aW91c01vbnRoKG9mZnNldCA9IDEpOiB2b2lkIHtcclxuICAgIHRoaXMuaGlnaGxpZ2h0TmV4dE1vbnRoKG9mZnNldCAqIC0xKTtcclxuICB9XHJcbiAgaGlnaGxpZ2h0Rmlyc3RNb250aCgpOiB2b2lkIHtcclxuICAgIHRoaXMuc2V0SGlnaGxpZ2h0ZWRNb250aCgwKTtcclxuICB9XHJcbiAgaGlnaGxpZ2h0TGFzdE1vbnRoKCk6IHZvaWQge1xyXG4gICAgdGhpcy5zZXRIaWdobGlnaHRlZE1vbnRoKDExKTtcclxuICB9XHJcbiAgaGlnaGxpZ2h0U2FtZU1vbnRoTmV4dFllYXIobXVsdGlwbGU6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuc2V0SGlnaGxpZ2h0ZWRNb250aCh0aGlzLmhpZ2hsaWdodGVkTW9udGgoKSwgdGhpcy5hY3RpdmVZZWFyKCkgKyAobXVsdGlwbGUgPyAxMCA6IDEpKTtcclxuICB9XHJcbiAgaGlnaGxpZ2h0U2FtZU1vbnRoUHJldmlvdXNZZWFyKG11bHRpcGxlOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLnNldEhpZ2hsaWdodGVkTW9udGgodGhpcy5oaWdobGlnaHRlZE1vbnRoKCksIHRoaXMuYWN0aXZlWWVhcigpIC0gKG11bHRpcGxlID8gMTAgOiAxKSk7XHJcbiAgfVxyXG5cclxuICAvLyEgc2VsZWN0aW5nIHllYXJzXHJcbiAgaXNZZWFyU2VsZWN0ZWQoeWVhcjogbnVtYmVyIHwgRGF0ZSk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHllYXIgaW5zdGFuY2VvZiBEYXRlKSB5ZWFyID0geWVhci5nZXRGdWxsWWVhcigpO1xyXG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWREYXRlKCkgIT09IG51bGwgJiYgeWVhciA9PT0gdGhpcy5zZWxlY3RlZERhdGUoKT8uZ2V0RnVsbFllYXIoKTtcclxuICB9XHJcbiAgaXNZZWFyT3V0T2ZSYW5nZSh5ZWFyOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIGlzWWVhck91dE9mUmFuZ2UoeWVhciwgdGhpcy5taW4oKSwgdGhpcy5tYXgoKSk7XHJcbiAgfVxyXG4gIGNoYW5nZVllYXIoeWVhcjogbnVtYmVyIHwgbnVsbCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKGlzTnVsbCh5ZWFyKSkge1xyXG4gICAgICB0aGlzLmFjdGl2ZVllYXIuc2V0KFRPREFZLmdldEZ1bGxZZWFyKCkpO1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5pc1llYXJPdXRPZlJhbmdlKHllYXIpKSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgdGhpcy5hY3RpdmVZZWFyLnNldCh5ZWFyKTtcclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcbiAgc2VsZWN0WWVhcih5ZWFyOiBudW1iZXIgfCBEYXRlIHwgbnVsbCk6IHZvaWQge1xyXG4gICAgaWYgKGlzTnVsbCh5ZWFyKSkgcmV0dXJuO1xyXG4gICAgaWYgKHllYXIgaW5zdGFuY2VvZiBEYXRlKSB5ZWFyID0geWVhci5nZXRGdWxsWWVhcigpO1xyXG5cclxuICAgIGNvbnN0IHdhc1N1Y2Nlc3NmdWwgPSB0aGlzLmNoYW5nZVllYXIoeWVhcik7XHJcbiAgICBpZiAoIXdhc1N1Y2Nlc3NmdWwpIHJldHVybjtcclxuXHJcbiAgICB0aGlzLmFjdGl2ZVZpZXcuc2V0KEFyZENhbGVuZGFyVmlldy5Nb250aHMpO1xyXG4gICAgdGhpcy55ZWFyU2VsZWN0LmVtaXQoeWVhcik7XHJcbiAgfVxyXG4gIHNlbGVjdEN1cnJlbnRseUhpZ2hsaWdodGVkWWVhcigpOiB2b2lkIHtcclxuICAgIGlmICghaXNEZWZpbmVkKHRoaXMuaGlnaGxpZ2h0ZWRZZWFyKCkpKSByZXR1cm47XHJcblxyXG4gICAgdGhpcy5zZWxlY3RZZWFyKHRoaXMuaGlnaGxpZ2h0ZWRZZWFyKCkhKTtcclxuICB9XHJcblxyXG4gIC8vISBoaWdobGlnaHRpbmcgeWVhcnNcclxuICBwcml2YXRlIHJlYWRvbmx5IF9faGlnaGxpZ2h0ZWRZZWFyID0gc2lnbmFsPG51bWJlciB8IG51bGw+KG51bGwpO1xyXG4gIHJlYWRvbmx5IGhpZ2hsaWdodGVkWWVhciA9IHRoaXMuX19oaWdobGlnaHRlZFllYXIuYXNSZWFkb25seSgpO1xyXG5cclxuICByZWFkb25seSBjdXJyZW50WWVhclJhbmdlU3RhcnQgPSBzaWduYWw8bnVtYmVyPihUT0RBWS5nZXRGdWxsWWVhcigpIC0gKFRPREFZLmdldEZ1bGxZZWFyKCkgJSA0KSAtIDgpOyAvLyBjdXJyZW50IHllYXIgYWx3YXlzIGluIDNyZCByb3dcclxuXHJcbiAgc2V0SGlnaGxpZ2h0ZWRZZWFyKHllYXI6IG51bWJlciB8IG51bGwpOiB2b2lkIHtcclxuICAgIGlmIChpc051bGwoeWVhcikpIHtcclxuICAgICAgdGhpcy5fX2hpZ2hsaWdodGVkWWVhci51cGRhdGUoKCkgPT4geWVhcik7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh5ZWFyLCAwKTtcclxuICAgIGNvbnN0IG91dE9mUmFuZ2UgPSB0aGlzLmlzWWVhck91dE9mUmFuZ2UoeWVhcik7XHJcblxyXG4gICAgaWYgKG91dE9mUmFuZ2UgPT09IC0xKSB7XHJcbiAgICAgIHRoaXMuX2hpZ2hsaWdodE1pblllYXIoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKG91dE9mUmFuZ2UgPT09IDEpIHtcclxuICAgICAgdGhpcy5faGlnaGxpZ2h0TWF4WWVhcigpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgbmV3WWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcclxuICAgIHRoaXMuX19oaWdobGlnaHRlZFllYXIudXBkYXRlKCgpID0+IG5ld1llYXIpO1xyXG5cclxuICAgIGlmIChuZXdZZWFyIDwgdGhpcy5jdXJyZW50WWVhclJhbmdlU3RhcnQoKSB8fCBuZXdZZWFyID49IHRoaXMuY3VycmVudFllYXJSYW5nZVN0YXJ0KCkgKyAyNCkge1xyXG4gICAgICAvLyByb3VuZCB0aGUgb2Zmc2V0IGF3YXkgZnJvbSB6ZXJvOiAwLjEgLT4gMSwgLTAuMSAtPiAtMVxyXG4gICAgICAvLyB0aGlzIGlzIHRvIGVuc3VyZSB0aGUgcmFuZ2Ugc3RhcnQgaXMgYWx3YXlzIHNoaWZ0ZWQgYnkgMjQgeWVhcnNcclxuICAgICAgY29uc3Qgb2Zmc2V0ID0gcm91bmRGcm9tWmVybygobmV3WWVhciAtIHRoaXMuY3VycmVudFllYXJSYW5nZVN0YXJ0KCkpIC8gMjQpO1xyXG4gICAgICB0aGlzLmN1cnJlbnRZZWFyUmFuZ2VTdGFydC51cGRhdGUodiA9PiB2ICsgb2Zmc2V0ICogMjQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2hhbmdlWWVhcnNWaWV3UGFnZShvZmZzZXQ6IG51bWJlcik6IHZvaWQge1xyXG4gICAgY29uc3QgbmV3WWVhclJhbmdlU3RhcnQgPSB0aGlzLmN1cnJlbnRZZWFyUmFuZ2VTdGFydCgpICsgb2Zmc2V0ICogMjQ7XHJcbiAgICB0aGlzLmN1cnJlbnRZZWFyUmFuZ2VTdGFydC5zZXQobmV3WWVhclJhbmdlU3RhcnQpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfaGlnaGxpZ2h0TWluWWVhcigpOiB2b2lkIHtcclxuICAgIGNvbnN0IG1pbiA9IHRoaXMubWluKCk7XHJcbiAgICBpZiAoIWlzRGVmaW5lZChtaW4pKSByZXR1cm47XHJcblxyXG4gICAgdGhpcy5fX2hpZ2hsaWdodGVkWWVhci5zZXQobWluLmdldEZ1bGxZZWFyKCkpO1xyXG4gIH1cclxuICBwcml2YXRlIF9oaWdobGlnaHRNYXhZZWFyKCk6IHZvaWQge1xyXG4gICAgY29uc3QgbWF4ID0gdGhpcy5tYXgoKTtcclxuICAgIGlmICghaXNEZWZpbmVkKG1heCkpIHJldHVybjtcclxuXHJcbiAgICB0aGlzLl9faGlnaGxpZ2h0ZWRZZWFyLnNldChtYXguZ2V0RnVsbFllYXIoKSk7XHJcbiAgfVxyXG5cclxuICBoaWdobGlnaHROZXh0WWVhcihvZmZzZXQgPSAxKTogdm9pZCB7XHJcbiAgICBjb25zdCBjdXJyZW50WWVhciA9IHRoaXMuaGlnaGxpZ2h0ZWRZZWFyKCk7XHJcbiAgICBjb25zdCBuZXdZZWFyID0gaXNEZWZpbmVkKGN1cnJlbnRZZWFyKSA/IGN1cnJlbnRZZWFyICsgb2Zmc2V0IDogbnVsbDtcclxuICAgIHRoaXMuc2V0SGlnaGxpZ2h0ZWRZZWFyKG5ld1llYXIpO1xyXG4gIH1cclxuICBoaWdobGlnaHRQcmV2aW91c1llYXIob2Zmc2V0ID0gMSk6IHZvaWQge1xyXG4gICAgdGhpcy5oaWdobGlnaHROZXh0WWVhcihvZmZzZXQgKiAtMSk7XHJcbiAgfVxyXG4gIGhpZ2hsaWdodEZpcnN0WWVhcigpOiB2b2lkIHtcclxuICAgIHRoaXMuc2V0SGlnaGxpZ2h0ZWRZZWFyKHRoaXMuY3VycmVudFllYXJSYW5nZVN0YXJ0KCkpO1xyXG4gIH1cclxuICBoaWdobGlnaHRMYXN0WWVhcigpOiB2b2lkIHtcclxuICAgIHRoaXMuc2V0SGlnaGxpZ2h0ZWRZZWFyKHRoaXMuY3VycmVudFllYXJSYW5nZVN0YXJ0KCkgKyAyMyk7IC8vIDI0IHllYXJzIHBlciBwYWdlXHJcbiAgfVxyXG4gIGhpZ2hsaWdodFNhbWVZZWFyTmV4dFBhZ2UobXVsdGlwbGU6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGNvbnN0IHllYXIgPSB0aGlzLmhpZ2hsaWdodGVkWWVhcigpID8/IHRoaXMuY3VycmVudFllYXJSYW5nZVN0YXJ0KCk7XHJcbiAgICB0aGlzLnNldEhpZ2hsaWdodGVkWWVhcih5ZWFyICsgKG11bHRpcGxlID8gNjAgOiAyNCkpO1xyXG4gIH1cclxuICBoaWdobGlnaHRTYW1lWWVhclByZXZpb3VzUGFnZShtdWx0aXBsZTogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgY29uc3QgeWVhciA9IHRoaXMuaGlnaGxpZ2h0ZWRZZWFyKCkgPz8gdGhpcy5jdXJyZW50WWVhclJhbmdlU3RhcnQoKTtcclxuICAgIHRoaXMuc2V0SGlnaGxpZ2h0ZWRZZWFyKHllYXIgLSAobXVsdGlwbGUgPyA2MCA6IDI0KSk7XHJcbiAgfVxyXG5cclxuICAvLyEgaW50ZXJuYWxzXHJcbiAgcmVhZG9ubHkgX2lzVXNpbmdLZXlib2FyZCA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XHJcbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6bW91c2Vtb3ZlJylcclxuICBvbkRvY3VtZW50TW91c2Vtb3ZlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5faXNVc2luZ0tleWJvYXJkLnNldChmYWxzZSk7XHJcbiAgfVxyXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmtleWRvd24nKVxyXG4gIG9uRG9jdW1lbnRLZXlkb3duKCk6IHZvaWQge1xyXG4gICAgdGhpcy5faXNVc2luZ0tleWJvYXJkLnNldCh0cnVlKTtcclxuICB9XHJcblxyXG4gIC8vISB0ZW1wbGF0ZXNcclxuICByZWFkb25seSB5ZWFyc1ZpZXdIZWFkZXJUZW1wbGF0ZSA9IGNvbnRlbnRDaGlsZDxUZW1wbGF0ZVJlZjxDYWxlbmRhclllYXJzVmlld0hlYWRlckNvbnRleHQ+PihUZW1wbGF0ZVJlZik7XHJcbiAgcmVhZG9ubHkgbW9udGhzVmlld0hlYWRlclRlbXBsYXRlID0gY29udGVudENoaWxkPFRlbXBsYXRlUmVmPENhbGVuZGFyTW9udGhzVmlld0hlYWRlckNvbnRleHQ+PihUZW1wbGF0ZVJlZik7XHJcbiAgcmVhZG9ubHkgZGF5c1ZpZXdIZWFkZXJUZW1wbGF0ZSA9IGNvbnRlbnRDaGlsZDxUZW1wbGF0ZVJlZjxDYWxlbmRhckRheXNWaWV3SGVhZGVyQ29udGV4dD4+KFRlbXBsYXRlUmVmKTtcclxuICByZWFkb25seSBmbG9hdGluZ01vbnRoVGVtcGxhdGUgPSBjb250ZW50Q2hpbGQ8VGVtcGxhdGVSZWY8Q2FsZW5kYXJGbG9hdGluZ01vbnRoQ29udGV4dD4+KFRlbXBsYXRlUmVmKTtcclxuICByZWFkb25seSB5ZWFyVGVtcGxhdGUgPSBjb250ZW50Q2hpbGQ8VGVtcGxhdGVSZWY8Q2FsZW5kYXJZZWFyQ29udGV4dD4+KFRlbXBsYXRlUmVmKTtcclxuICByZWFkb25seSBtb250aFRlbXBsYXRlID0gY29udGVudENoaWxkPFRlbXBsYXRlUmVmPENhbGVuZGFyTW9udGhDb250ZXh0Pj4oVGVtcGxhdGVSZWYpO1xyXG4gIHJlYWRvbmx5IGRheVRlbXBsYXRlID0gY29udGVudENoaWxkPFRlbXBsYXRlUmVmPENhbGVuZGFyRGF5Q29udGV4dD4+KFRlbXBsYXRlUmVmKTtcclxuICByZWFkb25seSB3ZWVrZGF5VGVtcGxhdGUgPSBjb250ZW50Q2hpbGQ8VGVtcGxhdGVSZWY8Q2FsZW5kYXJXZWVrZGF5Q29udGV4dD4+KFRlbXBsYXRlUmVmKTtcclxufVxyXG4iLCI8ZGl2XHJcbiAgY2xhc3M9XCJhcmQtY2FsZW5kYXJcIlxyXG4gIFtuZ0NsYXNzXT1cIm5nQ2xhc3NlcygpXCJcclxuPlxyXG4gIEBzd2l0Y2ggKGFjdGl2ZVZpZXcoKSkgeyBAY2FzZSAoJ2RheXMnKSB7XHJcbiAgPGFyZC1kYXlzLXZpZXdcclxuICAgIFt0YWJJbmRleF09XCJ0YWJJbmRleCgpXCJcclxuICAgIFtyZWFkT25seV09XCJyZWFkb25seSgpXCJcclxuICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZCgpXCJcclxuICAgIFthdXRvRm9jdXNdPVwiYXV0b0ZvY3VzKClcIlxyXG4gICAgW19pc1VzaW5nS2V5Ym9hcmRdPVwiX2lzVXNpbmdLZXlib2FyZCgpXCJcclxuICAgIFthY3RpdmVNb250aF09XCJhY3RpdmVNb250aCgpXCJcclxuICAgIFthY3RpdmVZZWFyXT1cImFjdGl2ZVllYXIoKVwiXHJcbiAgICBbc2VsZWN0ZWREYXRlXT1cInNlbGVjdGVkRGF0ZSgpXCJcclxuICAgIFtmaXJzdFdlZWtkYXldPVwiZmlyc3RXZWVrZGF5KClcIlxyXG4gICAgW2hpZ2hsaWdodGVkRGF5XT1cImhpZ2hsaWdodGVkRGF5KClcIlxyXG4gICAgW21pbl09XCJtaW4oKVwiXHJcbiAgICBbbWF4XT1cIm1heCgpXCJcclxuICAgIFtpc0RheUZpbHRlcmVkT3V0XT1cImlzRGF5RmlsdGVyZWRPdXQoKVwiXHJcbiAgICBbZGF5c1ZpZXdIZWFkZXJUZW1wbGF0ZV09XCJkYXlzVmlld0hlYWRlclRlbXBsYXRlKClcIlxyXG4gICAgW2Zsb2F0aW5nTW9udGhUZW1wbGF0ZV09XCJmbG9hdGluZ01vbnRoVGVtcGxhdGUoKVwiXHJcbiAgICBbd2Vla2RheVRlbXBsYXRlXT1cIndlZWtkYXlUZW1wbGF0ZSgpXCJcclxuICAgIFtkYXlUZW1wbGF0ZV09XCJkYXlUZW1wbGF0ZSgpXCJcclxuICAgIChmb2N1cyk9XCJvbkZvY3VzKCRldmVudClcIlxyXG4gICAgKGJsdXIpPVwib25CbHVyKCRldmVudClcIlxyXG4gICAgKHRyaWdnZXJPcGVuTW9udGhzVmlldyk9XCJvblRyaWdnZXJPcGVuTW9udGhzVmlldygpXCJcclxuICAgICh0cmlnZ2VyT3BlblllYXJzVmlldyk9XCJvblRyaWdnZXJPcGVuWWVhcnNWaWV3KClcIlxyXG4gICAgKHRyaWdnZXJDaGFuZ2VNb250aCk9XCJjaGFuZ2VNb250aCgkZXZlbnQpXCJcclxuICAgICh0cmlnZ2VyQ2hhbmdlWWVhcik9XCJjaGFuZ2VZZWFyKCRldmVudClcIlxyXG4gICAgKHRyaWdnZXJIaWdobGlnaHREYXkpPVwic2V0SGlnaGxpZ2h0ZWREYXkoJGV2ZW50KVwiXHJcbiAgICAodHJpZ2dlckhpZ2hsaWdodEZpcnN0RGF5KT1cImhpZ2hsaWdodEZpcnN0RGF5KClcIlxyXG4gICAgKHRyaWdnZXJIaWdobGlnaHRMYXN0RGF5KT1cImhpZ2hsaWdodExhc3REYXkoKVwiXHJcbiAgICAodHJpZ2dlckhpZ2hsaWdodE5leHREYXkpPVwiaGlnaGxpZ2h0TmV4dERheSgkZXZlbnQpXCJcclxuICAgICh0cmlnZ2VySGlnaGxpZ2h0UHJldmlvdXNEYXkpPVwiaGlnaGxpZ2h0UHJldmlvdXNEYXkoJGV2ZW50KVwiXHJcbiAgICAodHJpZ2dlckhpZ2hsaWdodFNhbWVEYXlOZXh0UGFnZSk9XCIkZXZlbnQgPyBoaWdobGlnaHRTYW1lRGF5TmV4dFllYXIoKSA6IGhpZ2hsaWdodFNhbWVEYXlOZXh0TW9udGgoKVwiXHJcbiAgICAodHJpZ2dlckhpZ2hsaWdodFNhbWVEYXlQcmV2aW91c1BhZ2UpPVwiJGV2ZW50ID8gaGlnaGxpZ2h0U2FtZURheVByZXZpb3VzWWVhcigpIDogaGlnaGxpZ2h0U2FtZURheVByZXZpb3VzTW9udGgoKVwiXHJcbiAgICAodHJpZ2dlclNlbGVjdERheSk9XCJzZWxlY3REYXkoJGV2ZW50KVwiXHJcbiAgLz5cclxuICB9IEBjYXNlICgnbW9udGhzJykge1xyXG4gIDxhcmQtbW9udGhzLXZpZXdcclxuICAgIFt0YWJJbmRleF09XCJ0YWJJbmRleCgpXCJcclxuICAgIFtyZWFkT25seV09XCJyZWFkb25seSgpXCJcclxuICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZCgpXCJcclxuICAgIFthdXRvRm9jdXNdPVwiYXV0b0ZvY3VzKClcIlxyXG4gICAgW19pc1VzaW5nS2V5Ym9hcmRdPVwiX2lzVXNpbmdLZXlib2FyZCgpXCJcclxuICAgIFtjb2xvcl09XCJjb2xvcigpXCJcclxuICAgIFthY3RpdmVNb250aF09XCJhY3RpdmVNb250aCgpXCJcclxuICAgIFthY3RpdmVZZWFyXT1cImFjdGl2ZVllYXIoKVwiXHJcbiAgICBbc2VsZWN0ZWREYXRlXT1cInNlbGVjdGVkRGF0ZSgpXCJcclxuICAgIFttaW5dPVwibWluKClcIlxyXG4gICAgW21heF09XCJtYXgoKVwiXHJcbiAgICBbaGlnaGxpZ2h0ZWRNb250aF09XCJoaWdobGlnaHRlZE1vbnRoKClcIlxyXG4gICAgW21vbnRoc1ZpZXdIZWFkZXJUZW1wbGF0ZV09XCJtb250aHNWaWV3SGVhZGVyVGVtcGxhdGUoKVwiXHJcbiAgICBbbW9udGhUZW1wbGF0ZV09XCJtb250aFRlbXBsYXRlKClcIlxyXG4gICAgKGZvY3VzKT1cIm9uRm9jdXMoJGV2ZW50KVwiXHJcbiAgICAoYmx1cik9XCJvbkJsdXIoJGV2ZW50KVwiXHJcbiAgICAodHJpZ2dlck9wZW5EYXlzVmlldyk9XCJvblRyaWdnZXJPcGVuRGF5c1ZpZXcoKVwiXHJcbiAgICAodHJpZ2dlck9wZW5ZZWFyc1ZpZXcpPVwib25UcmlnZ2VyT3BlblllYXJzVmlldygpXCJcclxuICAgICh0cmlnZ2VDaGFuZ2VZZWFyKT1cImNoYW5nZVllYXIoJGV2ZW50KVwiXHJcbiAgICAodHJpZ2dlclNlbGVjdE1vbnRoKT1cInNlbGVjdE1vbnRoKCRldmVudClcIlxyXG4gICAgKHRyaWdnZXJIaWdobGlnaHRNb250aCk9XCJzZXRIaWdobGlnaHRlZE1vbnRoKCRldmVudClcIlxyXG4gICAgKHRyaWdnZXJIaWdobGlnaHRGaXJzdE1vbnRoKT1cImhpZ2hsaWdodEZpcnN0TW9udGgoKVwiXHJcbiAgICAodHJpZ2dlckhpZ2hsaWdodExhc3RNb250aCk9XCJoaWdobGlnaHRMYXN0TW9udGgoKVwiXHJcbiAgICAodHJpZ2dlckhpZ2hsaWdodE5leHRNb250aCk9XCJoaWdobGlnaHROZXh0TW9udGgoJGV2ZW50KVwiXHJcbiAgICAodHJpZ2dlckhpZ2hsaWdodFByZXZpb3VzTW9udGgpPVwiaGlnaGxpZ2h0UHJldmlvdXNNb250aCgkZXZlbnQpXCJcclxuICAgICh0cmlnZ2VySGlnaGxpZ2h0U2FtZU1vbnRoTmV4dFBhZ2UpPVwiaGlnaGxpZ2h0U2FtZU1vbnRoTmV4dFllYXIoJGV2ZW50KVwiXHJcbiAgICAodHJpZ2dlckhpZ2hsaWdodFNhbWVNb250aFByZXZpb3VzUGFnZSk9XCJoaWdobGlnaHRTYW1lTW9udGhQcmV2aW91c1llYXIoJGV2ZW50KVwiXHJcbiAgLz5cclxuICB9IEBjYXNlICgneWVhcnMnKSB7XHJcbiAgPGFyZC15ZWFycy12aWV3XHJcbiAgICBbdGFiSW5kZXhdPVwidGFiSW5kZXgoKVwiXHJcbiAgICBbcmVhZE9ubHldPVwicmVhZG9ubHkoKVwiXHJcbiAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWQoKVwiXHJcbiAgICBbYXV0b0ZvY3VzXT1cImF1dG9Gb2N1cygpXCJcclxuICAgIFtfaXNVc2luZ0tleWJvYXJkXT1cIl9pc1VzaW5nS2V5Ym9hcmQoKVwiXHJcbiAgICBbaGlnaGxpZ2h0ZWRZZWFyXT1cImhpZ2hsaWdodGVkWWVhcigpXCJcclxuICAgIFtjdXJyZW50WWVhclJhbmdlU3RhcnRdPVwiY3VycmVudFllYXJSYW5nZVN0YXJ0KClcIlxyXG4gICAgW2FjdGl2ZVllYXJdPVwiYWN0aXZlWWVhcigpXCJcclxuICAgIFtzZWxlY3RlZERhdGVdPVwic2VsZWN0ZWREYXRlKClcIlxyXG4gICAgW21pbl09XCJtaW4oKVwiXHJcbiAgICBbbWF4XT1cIm1heCgpXCJcclxuICAgIFt5ZWFyc1ZpZXdIZWFkZXJUZW1wbGF0ZV09XCJ5ZWFyc1ZpZXdIZWFkZXJUZW1wbGF0ZSgpXCJcclxuICAgIFt5ZWFyVGVtcGxhdGVdPVwieWVhclRlbXBsYXRlKClcIlxyXG4gICAgKGZvY3VzKT1cIm9uRm9jdXMoJGV2ZW50KVwiXHJcbiAgICAoYmx1cik9XCJvbkJsdXIoJGV2ZW50KVwiXHJcbiAgICAodHJpZ2dlck9wZW5EYXlzVmlldyk9XCJvblRyaWdnZXJPcGVuRGF5c1ZpZXcoKVwiXHJcbiAgICAodHJpZ2dlck9wZW5Nb250aHNWaWV3KT1cIm9uVHJpZ2dlck9wZW5Nb250aHNWaWV3KClcIlxyXG4gICAgKHRyaWdnZXJTZWxlY3RZZWFyKT1cInNlbGVjdFllYXIoJGV2ZW50KVwiXHJcbiAgICAodHJpZ2dlckNoYW5nZVllYXJzVmlld1BhZ2UpPVwiY2hhbmdlWWVhcnNWaWV3UGFnZSgkZXZlbnQpXCJcclxuICAgICh0cmlnZ2VySGlnaGxpZ2h0WWVhcik9XCJzZXRIaWdobGlnaHRlZFllYXIoJGV2ZW50KVwiXHJcbiAgICAodHJpZ2dlckhpZ2hsaWdodEZpcnN0WWVhcik9XCJoaWdobGlnaHRGaXJzdFllYXIoKVwiXHJcbiAgICAodHJpZ2dlckhpZ2hsaWdodExhc3RZZWFyKT1cImhpZ2hsaWdodExhc3RZZWFyKClcIlxyXG4gICAgKHRyaWdnZXJIaWdobGlnaHROZXh0WWVhcik9XCJoaWdobGlnaHROZXh0WWVhcigkZXZlbnQpXCJcclxuICAgICh0cmlnZ2VySGlnaGxpZ2h0UHJldmlvdXNZZWFyKT1cImhpZ2hsaWdodFByZXZpb3VzWWVhcigkZXZlbnQpXCJcclxuICAgICh0cmlnZ2VySGlnaGxpZ2h0U2FtZVllYXJOZXh0UGFnZSk9XCJoaWdobGlnaHRTYW1lWWVhck5leHRQYWdlKCRldmVudClcIlxyXG4gICAgKHRyaWdnZXJIaWdobGlnaHRTYW1lWWVhclByZXZpb3VzUGFnZSk9XCJoaWdobGlnaHRTYW1lWWVhclByZXZpb3VzUGFnZSgkZXZlbnQpXCJcclxuICAvPlxyXG4gIH0gfVxyXG48L2Rpdj5cclxuIl19