@eqproject/eqp-dynamic-module 2.8.8 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/{esm2020 → esm2022}/eqproject-eqp-dynamic-module.mjs +4 -4
- package/esm2022/lib/components/exported/eqp-dynamic-module/eqp-dynamic-module.component.mjs +531 -0
- package/esm2022/lib/components/exported/eqp-dynamic-module-configurator/eqp-dynamic-module-configurator.component.mjs +1245 -0
- package/esm2022/lib/components/private/add-form-field/add-form-field.component.mjs +1263 -0
- package/esm2022/lib/components/private/add-formula-field/add-formula-field.component.mjs +200 -0
- package/esm2022/lib/components/private/dbgetter/dbgetter.component.mjs +233 -0
- package/esm2022/lib/components/private/dynamic-module-field-fix/dynamic-module-field.component.mjs +280 -0
- package/esm2022/lib/components/private/field-templates/attachment-field-template/attachment-field-template.component.mjs +143 -0
- package/esm2022/lib/components/private/field-templates/boolean-field-template/boolean-field-template.component.mjs +75 -0
- package/esm2022/lib/components/private/field-templates/date-field-template/date-field-template.component.mjs +106 -0
- package/esm2022/lib/components/private/field-templates/image-field-selector-template/image-field-selector-template.component.mjs +107 -0
- package/esm2022/lib/components/private/field-templates/image-field-template/image-field-template.component.mjs +265 -0
- package/esm2022/lib/components/private/field-templates/image-with-markers-field-template/image-with-markers-field-template.component.mjs +261 -0
- package/esm2022/lib/components/private/field-templates/label-field-template/label-field-template.component.mjs +82 -0
- package/esm2022/lib/components/private/field-templates/list-value-field-template/list-value-field-template.component.mjs +176 -0
- package/esm2022/lib/components/private/field-templates/numeric-field-template/numeric-field-template.component.mjs +129 -0
- package/esm2022/lib/components/private/field-templates/text-field-template/text-field-template.component.mjs +103 -0
- package/esm2022/lib/components/private/field-templates/textarea-field-template/textarea-field-template.component.mjs +78 -0
- package/esm2022/lib/components/private/form-records/add-form-record/add-form-record.component.mjs +837 -0
- package/esm2022/lib/components/private/form-records/list-form-record/list-form-record.component.mjs +408 -0
- package/esm2022/lib/components/private/form-records/list-view-form-record/list-view-form-record.component.mjs +651 -0
- package/esm2022/lib/components/private/form-records/list-view-form-record/single-record/single-record.component.mjs +82 -0
- package/esm2022/lib/components/private/form-records/repair-form-fields/repair-form-fields.component.mjs +59 -0
- package/esm2022/lib/components/private/form-records/view-form-record/view-form-record.component.mjs +131 -0
- package/esm2022/lib/components/private/form-statistics/dynamic-module-filter-fix/dynamic-module-filter-fix.component.mjs +89 -0
- package/esm2022/lib/components/private/form-statistics/filter-form-statistic/filter-form-statistic.component.mjs +460 -0
- package/esm2022/lib/components/private/form-statistics/filter-templates/attachment-filter-template/attachment-filter-template.component.mjs +58 -0
- package/esm2022/lib/components/private/form-statistics/filter-templates/boolean-filter-template/boolean-filter-template.component.mjs +110 -0
- package/esm2022/lib/components/private/form-statistics/filter-templates/date-filter-template/date-filter-template.component.mjs +108 -0
- package/esm2022/lib/components/private/form-statistics/filter-templates/image-filter-template/image-filter-template.component.mjs +58 -0
- package/esm2022/lib/components/private/form-statistics/filter-templates/image-selector-filter-template/image-selector-filter-template.component.mjs +135 -0
- package/esm2022/lib/components/private/form-statistics/filter-templates/list-form-record-filter-template/list-form-record-filter-template.component.mjs +58 -0
- package/esm2022/lib/components/private/form-statistics/filter-templates/list-value-filter-template/list-value-filter-template.component.mjs +141 -0
- package/esm2022/lib/components/private/form-statistics/filter-templates/numeric-filter-template/numeric-filter-template.component.mjs +126 -0
- package/esm2022/lib/components/private/form-statistics/filter-templates/text-filter-template/text-filter-template.component.mjs +111 -0
- package/esm2022/lib/components/private/form-statistics/filter-templates/textarea-filter-template/textarea-filter-template.component.mjs +111 -0
- package/esm2022/lib/components/private/graphs/graph/graph.component.mjs +186 -0
- package/esm2022/lib/components/private/graphs/graphs.component.mjs +175 -0
- package/esm2022/lib/components/private/spinner/spinner.component.mjs +21 -0
- package/{esm2020 → esm2022}/lib/components/private/tmw-image-drawer/i18n.mjs +62 -62
- package/esm2022/lib/components/private/tmw-image-drawer/tmw-image-drawer.component.mjs +413 -0
- package/esm2022/lib/components/private/tmw-image-marker/tmw-image-marker.component.mjs +348 -0
- package/esm2022/lib/components/private/trigger-creator/dynamic-module-trigger-fix/dynamic-module-trigger-fix.component.mjs +81 -0
- package/esm2022/lib/components/private/trigger-creator/trigger-creator.component.mjs +199 -0
- package/esm2022/lib/components/private/trigger-creator/trigger-templates/boolean-trigger-template/boolean-trigger-template.component.mjs +91 -0
- package/esm2022/lib/components/private/trigger-creator/trigger-templates/date-trigger-template/date-trigger-template.component.mjs +88 -0
- package/esm2022/lib/components/private/trigger-creator/trigger-templates/list-form-record-trigger-template/list-form-record-trigger-template.component.mjs +61 -0
- package/esm2022/lib/components/private/trigger-creator/trigger-templates/list-value-trigger-template/list-value-trigger-template.component.mjs +69 -0
- package/esm2022/lib/components/private/trigger-creator/trigger-templates/numeric-trigger-template/numeric-trigger-template.component.mjs +107 -0
- package/esm2022/lib/components/private/trigger-creator/trigger-templates/text-trigger-template/text-trigger-template.component.mjs +92 -0
- package/esm2022/lib/components/private/trigger-creator/trigger-templates/textarea-trigger-template/textarea-trigger-template.component.mjs +92 -0
- package/esm2022/lib/directives/dynamic-loader/dynamic-loader.directive.mjs +63 -0
- package/esm2022/lib/directives/speech-to-text/speech-to-text.directive.mjs +192 -0
- package/esm2022/lib/eqp-dynamic-module.module.mjs +253 -0
- package/{esm2020 → esm2022}/lib/interfaces/iBaseFieldComponent.interface.mjs +1 -1
- package/{esm2020 → esm2022}/lib/interfaces/iRootObject.interface.mjs +1 -1
- package/esm2022/lib/models/baseField.model.mjs +133 -0
- package/esm2022/lib/models/baseObj.model.mjs +10 -0
- package/{esm2020 → esm2022}/lib/models/context.model.mjs +10 -8
- package/esm2022/lib/models/dynAttachment.mjs +52 -0
- package/esm2022/lib/models/dynamicModuleCompileConfig.model.mjs +45 -0
- package/esm2022/lib/models/dynamicModuleConfig.model.mjs +13 -0
- package/esm2022/lib/models/dynamicModuleConfiguratorConfig.model.mjs +11 -0
- package/esm2022/lib/models/dynamicModuleConfiguratorSpecificConfig.model.mjs +16 -0
- package/{esm2020 → esm2022}/lib/models/dynamicModuleFilterResultViewModeEnum.model.mjs +6 -6
- package/esm2022/lib/models/dynamicModuleGeneralConfig.model.mjs +36 -0
- package/esm2022/lib/models/dynamicModuleListConfig.model.mjs +48 -0
- package/esm2022/lib/models/dynamicModuleListFormRecordActionsDefault.mjs +35 -0
- package/{esm2020 → esm2022}/lib/models/dynamicModuleRepairConfig.model.mjs +10 -10
- package/{esm2020 → esm2022}/lib/models/dynamicModuleViewModeEnum.mjs +11 -11
- package/esm2022/lib/models/endPointConfiguration.model.mjs +211 -0
- package/{esm2020 → esm2022}/lib/models/entity.model.mjs +10 -7
- package/esm2022/lib/models/fields/attachmentField.model.mjs +28 -0
- package/esm2022/lib/models/fields/booleanField.model.mjs +15 -0
- package/esm2022/lib/models/fields/dateField.model.mjs +15 -0
- package/esm2022/lib/models/fields/imageField.model.mjs +14 -0
- package/esm2022/lib/models/fields/imageSelectorField.model.mjs +10 -0
- package/esm2022/lib/models/fields/imageWithMarkersField.model.mjs +7 -0
- package/{esm2020 → esm2022}/lib/models/fields/labelField.model.mjs +5 -4
- package/esm2022/lib/models/fields/listValueField.model.mjs +24 -0
- package/esm2022/lib/models/fields/lookupField.model.mjs +11 -0
- package/esm2022/lib/models/fields/numericField.model.mjs +13 -0
- package/esm2022/lib/models/fields/textField.model.mjs +18 -0
- package/esm2022/lib/models/fields/textareaField.model.mjs +9 -0
- package/esm2022/lib/models/form.model.mjs +63 -0
- package/esm2022/lib/models/getter.model.mjs +6 -0
- package/esm2022/lib/models/graph.model.mjs +19 -0
- package/{esm2020 → esm2022}/lib/models/logicOperator.model.mjs +55 -55
- package/esm2022/lib/models/record.model.mjs +39 -0
- package/esm2022/lib/models/statistic.model.mjs +12 -0
- package/esm2022/lib/models/trigger.model.mjs +63 -0
- package/esm2022/lib/modules/formula.model.mjs +266 -0
- package/{esm2020 → esm2022}/lib/modules/material.module.mjs +231 -231
- package/{esm2020 → esm2022}/lib/services/custom-form-validators.service.mjs +18 -18
- package/esm2022/lib/services/db-date.service.mjs +178 -0
- package/esm2022/lib/services/eqp-dynamic-module-dialog.service.mjs +114 -0
- package/esm2022/lib/services/global.service.mjs +43 -0
- package/esm2022/lib/services/spinner.service.mjs +41 -0
- package/esm2022/lib/services/utilityHelper.services.mjs +601 -0
- package/{esm2020 → esm2022}/public-api.mjs +56 -56
- package/fesm2022/eqproject-eqp-dynamic-module.mjs +13506 -0
- package/fesm2022/eqproject-eqp-dynamic-module.mjs.map +1 -0
- package/index.d.ts +5 -5
- package/lib/components/exported/eqp-dynamic-module/eqp-dynamic-module.component.d.ts +162 -162
- package/lib/components/exported/eqp-dynamic-module-configurator/eqp-dynamic-module-configurator.component.d.ts +308 -308
- package/lib/components/private/add-form-field/add-form-field.component.d.ts +263 -263
- package/lib/components/private/add-formula-field/add-formula-field.component.d.ts +45 -45
- package/lib/components/private/dbgetter/dbgetter.component.d.ts +51 -51
- package/lib/components/private/dynamic-module-field-fix/dynamic-module-field.component.d.ts +84 -84
- package/lib/components/private/field-templates/attachment-field-template/attachment-field-template.component.d.ts +57 -57
- package/lib/components/private/field-templates/boolean-field-template/boolean-field-template.component.d.ts +27 -27
- package/lib/components/private/field-templates/date-field-template/date-field-template.component.d.ts +36 -36
- package/lib/components/private/field-templates/image-field-selector-template/image-field-selector-template.component.d.ts +33 -33
- package/lib/components/private/field-templates/image-field-template/image-field-template.component.d.ts +80 -80
- package/lib/components/private/field-templates/image-with-markers-field-template/image-with-markers-field-template.component.d.ts +78 -78
- package/lib/components/private/field-templates/label-field-template/label-field-template.component.d.ts +33 -33
- package/lib/components/private/field-templates/list-value-field-template/list-value-field-template.component.d.ts +59 -59
- package/lib/components/private/field-templates/numeric-field-template/numeric-field-template.component.d.ts +40 -40
- package/lib/components/private/field-templates/text-field-template/text-field-template.component.d.ts +35 -35
- package/lib/components/private/field-templates/textarea-field-template/textarea-field-template.component.d.ts +31 -31
- package/lib/components/private/form-records/add-form-record/add-form-record.component.d.ts +104 -104
- package/lib/components/private/form-records/list-form-record/list-form-record.component.d.ts +83 -83
- package/lib/components/private/form-records/list-view-form-record/list-view-form-record.component.d.ts +151 -151
- package/lib/components/private/form-records/list-view-form-record/single-record/single-record.component.d.ts +39 -39
- package/lib/components/private/form-records/repair-form-fields/repair-form-fields.component.d.ts +20 -20
- package/lib/components/private/form-records/view-form-record/view-form-record.component.d.ts +36 -36
- package/lib/components/private/form-statistics/dynamic-module-filter-fix/dynamic-module-filter-fix.component.d.ts +42 -42
- package/lib/components/private/form-statistics/filter-form-statistic/filter-form-statistic.component.d.ts +109 -109
- package/lib/components/private/form-statistics/filter-templates/attachment-filter-template/attachment-filter-template.component.d.ts +21 -21
- package/lib/components/private/form-statistics/filter-templates/boolean-filter-template/boolean-filter-template.component.d.ts +37 -37
- package/lib/components/private/form-statistics/filter-templates/date-filter-template/date-filter-template.component.d.ts +37 -37
- package/lib/components/private/form-statistics/filter-templates/image-filter-template/image-filter-template.component.d.ts +21 -21
- package/lib/components/private/form-statistics/filter-templates/image-selector-filter-template/image-selector-filter-template.component.d.ts +47 -47
- package/lib/components/private/form-statistics/filter-templates/list-form-record-filter-template/list-form-record-filter-template.component.d.ts +21 -21
- package/lib/components/private/form-statistics/filter-templates/list-value-filter-template/list-value-filter-template.component.d.ts +47 -47
- package/lib/components/private/form-statistics/filter-templates/numeric-filter-template/numeric-filter-template.component.d.ts +40 -40
- package/lib/components/private/form-statistics/filter-templates/text-filter-template/text-filter-template.component.d.ts +38 -38
- package/lib/components/private/form-statistics/filter-templates/textarea-filter-template/textarea-filter-template.component.d.ts +38 -38
- package/lib/components/private/graphs/graph/graph.component.d.ts +25 -25
- package/lib/components/private/graphs/graphs.component.d.ts +47 -47
- package/lib/components/private/spinner/spinner.component.d.ts +12 -12
- package/lib/components/private/tmw-image-drawer/i18n.d.ts +27 -27
- package/lib/components/private/tmw-image-drawer/tmw-image-drawer.component.d.ts +70 -70
- package/lib/components/private/tmw-image-marker/tmw-image-marker.component.d.ts +62 -62
- package/lib/components/private/trigger-creator/dynamic-module-trigger-fix/dynamic-module-trigger-fix.component.d.ts +42 -42
- package/lib/components/private/trigger-creator/trigger-creator.component.d.ts +42 -42
- package/lib/components/private/trigger-creator/trigger-templates/boolean-trigger-template/boolean-trigger-template.component.d.ts +34 -34
- package/lib/components/private/trigger-creator/trigger-templates/date-trigger-template/date-trigger-template.component.d.ts +34 -34
- package/lib/components/private/trigger-creator/trigger-templates/list-form-record-trigger-template/list-form-record-trigger-template.component.d.ts +24 -24
- package/lib/components/private/trigger-creator/trigger-templates/list-value-trigger-template/list-value-trigger-template.component.d.ts +34 -34
- package/lib/components/private/trigger-creator/trigger-templates/numeric-trigger-template/numeric-trigger-template.component.d.ts +37 -37
- package/lib/components/private/trigger-creator/trigger-templates/text-trigger-template/text-trigger-template.component.d.ts +36 -36
- package/lib/components/private/trigger-creator/trigger-templates/textarea-trigger-template/textarea-trigger-template.component.d.ts +36 -36
- package/lib/directives/dynamic-loader/dynamic-loader.directive.d.ts +26 -26
- package/lib/directives/speech-to-text/speech-to-text.directive.d.ts +31 -31
- package/lib/eqp-dynamic-module.module.d.ts +85 -85
- package/lib/interfaces/iBaseFieldComponent.interface.d.ts +8 -8
- package/lib/interfaces/iRootObject.interface.d.ts +11 -11
- package/lib/models/baseField.model.d.ts +126 -126
- package/lib/models/baseObj.model.d.ts +9 -9
- package/lib/models/context.model.d.ts +9 -9
- package/lib/models/dynAttachment.d.ts +49 -49
- package/lib/models/dynamicModuleCompileConfig.model.d.ts +35 -35
- package/lib/models/dynamicModuleConfig.model.d.ts +11 -11
- package/lib/models/dynamicModuleConfiguratorConfig.model.d.ts +7 -7
- package/lib/models/dynamicModuleConfiguratorSpecificConfig.model.d.ts +11 -11
- package/lib/models/dynamicModuleFilterResultViewModeEnum.model.d.ts +5 -5
- package/lib/models/dynamicModuleGeneralConfig.model.d.ts +29 -29
- package/lib/models/dynamicModuleListConfig.model.d.ts +39 -39
- package/lib/models/dynamicModuleListFormRecordActionsDefault.d.ts +9 -9
- package/lib/models/dynamicModuleRepairConfig.model.d.ts +4 -4
- package/lib/models/dynamicModuleViewModeEnum.d.ts +10 -10
- package/lib/models/endPointConfiguration.model.d.ts +46 -46
- package/lib/models/entity.model.d.ts +11 -11
- package/lib/models/fields/attachmentField.model.d.ts +17 -17
- package/lib/models/fields/booleanField.model.d.ts +11 -11
- package/lib/models/fields/dateField.model.d.ts +13 -13
- package/lib/models/fields/imageField.model.d.ts +13 -13
- package/lib/models/fields/imageSelectorField.model.d.ts +12 -12
- package/lib/models/fields/imageWithMarkersField.model.d.ts +7 -7
- package/lib/models/fields/labelField.model.d.ts +4 -4
- package/lib/models/fields/listValueField.model.d.ts +24 -24
- package/lib/models/fields/lookupField.model.d.ts +10 -10
- package/lib/models/fields/numericField.model.d.ts +12 -12
- package/lib/models/fields/textField.model.d.ts +16 -16
- package/lib/models/fields/textareaField.model.d.ts +8 -8
- package/lib/models/form.model.d.ts +61 -61
- package/lib/models/getter.model.d.ts +5 -5
- package/lib/models/graph.model.d.ts +18 -18
- package/lib/models/logicOperator.model.d.ts +48 -48
- package/lib/models/record.model.d.ts +41 -41
- package/lib/models/statistic.model.d.ts +13 -13
- package/lib/models/trigger.model.d.ts +51 -51
- package/lib/modules/formula.model.d.ts +32 -32
- package/lib/modules/material.module.d.ts +37 -37
- package/lib/services/custom-form-validators.service.d.ts +5 -5
- package/lib/services/db-date.service.d.ts +24 -24
- package/lib/services/eqp-dynamic-module-dialog.service.d.ts +44 -44
- package/lib/services/global.service.d.ts +16 -16
- package/lib/services/spinner.service.d.ts +18 -18
- package/lib/services/utilityHelper.services.d.ts +101 -101
- package/package.json +20 -25
- package/public-api.d.ts +53 -53
- package/esm2020/lib/components/exported/eqp-dynamic-module/eqp-dynamic-module.component.mjs +0 -516
- package/esm2020/lib/components/exported/eqp-dynamic-module-configurator/eqp-dynamic-module-configurator.component.mjs +0 -1196
- package/esm2020/lib/components/private/add-form-field/add-form-field.component.mjs +0 -1202
- package/esm2020/lib/components/private/add-formula-field/add-formula-field.component.mjs +0 -196
- package/esm2020/lib/components/private/dbgetter/dbgetter.component.mjs +0 -226
- package/esm2020/lib/components/private/dynamic-module-field-fix/dynamic-module-field.component.mjs +0 -263
- package/esm2020/lib/components/private/field-templates/attachment-field-template/attachment-field-template.component.mjs +0 -138
- package/esm2020/lib/components/private/field-templates/boolean-field-template/boolean-field-template.component.mjs +0 -71
- package/esm2020/lib/components/private/field-templates/date-field-template/date-field-template.component.mjs +0 -104
- package/esm2020/lib/components/private/field-templates/image-field-selector-template/image-field-selector-template.component.mjs +0 -100
- package/esm2020/lib/components/private/field-templates/image-field-template/image-field-template.component.mjs +0 -256
- package/esm2020/lib/components/private/field-templates/image-with-markers-field-template/image-with-markers-field-template.component.mjs +0 -252
- package/esm2020/lib/components/private/field-templates/label-field-template/label-field-template.component.mjs +0 -74
- package/esm2020/lib/components/private/field-templates/list-value-field-template/list-value-field-template.component.mjs +0 -172
- package/esm2020/lib/components/private/field-templates/numeric-field-template/numeric-field-template.component.mjs +0 -124
- package/esm2020/lib/components/private/field-templates/text-field-template/text-field-template.component.mjs +0 -95
- package/esm2020/lib/components/private/field-templates/textarea-field-template/textarea-field-template.component.mjs +0 -71
- package/esm2020/lib/components/private/form-records/add-form-record/add-form-record.component.mjs +0 -828
- package/esm2020/lib/components/private/form-records/list-form-record/list-form-record.component.mjs +0 -400
- package/esm2020/lib/components/private/form-records/list-view-form-record/list-view-form-record.component.mjs +0 -628
- package/esm2020/lib/components/private/form-records/list-view-form-record/single-record/single-record.component.mjs +0 -75
- package/esm2020/lib/components/private/form-records/repair-form-fields/repair-form-fields.component.mjs +0 -54
- package/esm2020/lib/components/private/form-records/view-form-record/view-form-record.component.mjs +0 -125
- package/esm2020/lib/components/private/form-statistics/dynamic-module-filter-fix/dynamic-module-filter-fix.component.mjs +0 -76
- package/esm2020/lib/components/private/form-statistics/filter-form-statistic/filter-form-statistic.component.mjs +0 -453
- package/esm2020/lib/components/private/form-statistics/filter-templates/attachment-filter-template/attachment-filter-template.component.mjs +0 -57
- package/esm2020/lib/components/private/form-statistics/filter-templates/boolean-filter-template/boolean-filter-template.component.mjs +0 -104
- package/esm2020/lib/components/private/form-statistics/filter-templates/date-filter-template/date-filter-template.component.mjs +0 -105
- package/esm2020/lib/components/private/form-statistics/filter-templates/image-filter-template/image-filter-template.component.mjs +0 -57
- package/esm2020/lib/components/private/form-statistics/filter-templates/image-selector-filter-template/image-selector-filter-template.component.mjs +0 -128
- package/esm2020/lib/components/private/form-statistics/filter-templates/list-form-record-filter-template/list-form-record-filter-template.component.mjs +0 -57
- package/esm2020/lib/components/private/form-statistics/filter-templates/list-value-filter-template/list-value-filter-template.component.mjs +0 -135
- package/esm2020/lib/components/private/form-statistics/filter-templates/numeric-filter-template/numeric-filter-template.component.mjs +0 -120
- package/esm2020/lib/components/private/form-statistics/filter-templates/text-filter-template/text-filter-template.component.mjs +0 -102
- package/esm2020/lib/components/private/form-statistics/filter-templates/textarea-filter-template/textarea-filter-template.component.mjs +0 -102
- package/esm2020/lib/components/private/graphs/graph/graph.component.mjs +0 -180
- package/esm2020/lib/components/private/graphs/graphs.component.mjs +0 -164
- package/esm2020/lib/components/private/spinner/spinner.component.mjs +0 -19
- package/esm2020/lib/components/private/tmw-image-drawer/tmw-image-drawer.component.mjs +0 -403
- package/esm2020/lib/components/private/tmw-image-marker/tmw-image-marker.component.mjs +0 -336
- package/esm2020/lib/components/private/trigger-creator/dynamic-module-trigger-fix/dynamic-module-trigger-fix.component.mjs +0 -69
- package/esm2020/lib/components/private/trigger-creator/trigger-creator.component.mjs +0 -191
- package/esm2020/lib/components/private/trigger-creator/trigger-templates/boolean-trigger-template/boolean-trigger-template.component.mjs +0 -86
- package/esm2020/lib/components/private/trigger-creator/trigger-templates/date-trigger-template/date-trigger-template.component.mjs +0 -86
- package/esm2020/lib/components/private/trigger-creator/trigger-templates/list-form-record-trigger-template/list-form-record-trigger-template.component.mjs +0 -60
- package/esm2020/lib/components/private/trigger-creator/trigger-templates/list-value-trigger-template/list-value-trigger-template.component.mjs +0 -66
- package/esm2020/lib/components/private/trigger-creator/trigger-templates/numeric-trigger-template/numeric-trigger-template.component.mjs +0 -102
- package/esm2020/lib/components/private/trigger-creator/trigger-templates/text-trigger-template/text-trigger-template.component.mjs +0 -84
- package/esm2020/lib/components/private/trigger-creator/trigger-templates/textarea-trigger-template/textarea-trigger-template.component.mjs +0 -84
- package/esm2020/lib/directives/dynamic-loader/dynamic-loader.directive.mjs +0 -59
- package/esm2020/lib/directives/speech-to-text/speech-to-text.directive.mjs +0 -186
- package/esm2020/lib/eqp-dynamic-module.module.mjs +0 -253
- package/esm2020/lib/models/baseField.model.mjs +0 -101
- package/esm2020/lib/models/baseObj.model.mjs +0 -9
- package/esm2020/lib/models/dynAttachment.mjs +0 -21
- package/esm2020/lib/models/dynamicModuleCompileConfig.model.mjs +0 -13
- package/esm2020/lib/models/dynamicModuleConfig.model.mjs +0 -9
- package/esm2020/lib/models/dynamicModuleConfiguratorConfig.model.mjs +0 -9
- package/esm2020/lib/models/dynamicModuleConfiguratorSpecificConfig.model.mjs +0 -15
- package/esm2020/lib/models/dynamicModuleGeneralConfig.model.mjs +0 -36
- package/esm2020/lib/models/dynamicModuleListConfig.model.mjs +0 -30
- package/esm2020/lib/models/dynamicModuleListFormRecordActionsDefault.mjs +0 -11
- package/esm2020/lib/models/endPointConfiguration.model.mjs +0 -205
- package/esm2020/lib/models/fields/attachmentField.model.mjs +0 -22
- package/esm2020/lib/models/fields/booleanField.model.mjs +0 -12
- package/esm2020/lib/models/fields/dateField.model.mjs +0 -15
- package/esm2020/lib/models/fields/imageField.model.mjs +0 -15
- package/esm2020/lib/models/fields/imageSelectorField.model.mjs +0 -8
- package/esm2020/lib/models/fields/imageWithMarkersField.model.mjs +0 -8
- package/esm2020/lib/models/fields/listValueField.model.mjs +0 -11
- package/esm2020/lib/models/fields/lookupField.model.mjs +0 -5
- package/esm2020/lib/models/fields/numericField.model.mjs +0 -5
- package/esm2020/lib/models/fields/textField.model.mjs +0 -14
- package/esm2020/lib/models/fields/textareaField.model.mjs +0 -4
- package/esm2020/lib/models/form.model.mjs +0 -24
- package/esm2020/lib/models/getter.model.mjs +0 -3
- package/esm2020/lib/models/graph.model.mjs +0 -15
- package/esm2020/lib/models/record.model.mjs +0 -10
- package/esm2020/lib/models/statistic.model.mjs +0 -8
- package/esm2020/lib/models/trigger.model.mjs +0 -41
- package/esm2020/lib/modules/formula.model.mjs +0 -265
- package/esm2020/lib/services/db-date.service.mjs +0 -178
- package/esm2020/lib/services/eqp-dynamic-module-dialog.service.mjs +0 -114
- package/esm2020/lib/services/global.service.mjs +0 -41
- package/esm2020/lib/services/spinner.service.mjs +0 -43
- package/esm2020/lib/services/utilityHelper.services.mjs +0 -598
- package/fesm2015/eqproject-eqp-dynamic-module.mjs +0 -12782
- package/fesm2015/eqproject-eqp-dynamic-module.mjs.map +0 -1
- package/fesm2020/eqproject-eqp-dynamic-module.mjs +0 -12751
- package/fesm2020/eqproject-eqp-dynamic-module.mjs.map +0 -1
|
@@ -0,0 +1,413 @@
|
|
|
1
|
+
import { Component, EventEmitter, Input, Output } from '@angular/core';
|
|
2
|
+
import { I18nEn, i18nLanguages } from './i18n';
|
|
3
|
+
import { fabric } from 'fabric';
|
|
4
|
+
import { Observable, of } from 'rxjs';
|
|
5
|
+
import { switchMap } from 'rxjs/operators';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
import * as i1 from "@angular/material/icon";
|
|
8
|
+
import * as i2 from "@angular/common";
|
|
9
|
+
export class TmwImageDrawerComponent {
|
|
10
|
+
closeDialog = new EventEmitter();
|
|
11
|
+
src;
|
|
12
|
+
width;
|
|
13
|
+
height;
|
|
14
|
+
forceSizeCanvas = true;
|
|
15
|
+
forceSizeExport = false;
|
|
16
|
+
enableRemoveImage = false;
|
|
17
|
+
enableLoadAnotherImage = false;
|
|
18
|
+
enableTooltip = false;
|
|
19
|
+
showCancelButton = true;
|
|
20
|
+
inConfig = false;
|
|
21
|
+
// @ts-ignore
|
|
22
|
+
i18nUser;
|
|
23
|
+
locale = 'en';
|
|
24
|
+
loadingTemplate;
|
|
25
|
+
errorTemplate;
|
|
26
|
+
outputMimeType = 'image/jpeg';
|
|
27
|
+
outputQuality = 0.8;
|
|
28
|
+
borderCss = 'none';
|
|
29
|
+
drawingSizes = {
|
|
30
|
+
small: 5,
|
|
31
|
+
medium: 10,
|
|
32
|
+
large: 25,
|
|
33
|
+
};
|
|
34
|
+
colors = {
|
|
35
|
+
black: '#000',
|
|
36
|
+
white: '#fff',
|
|
37
|
+
yellow: '#ffeb3b',
|
|
38
|
+
red: '#f44336',
|
|
39
|
+
blue: '#2196f3',
|
|
40
|
+
green: '#4caf50',
|
|
41
|
+
purple: '#7a08af',
|
|
42
|
+
};
|
|
43
|
+
save = new EventEmitter();
|
|
44
|
+
loadOriginal = new EventEmitter();
|
|
45
|
+
currentTool = 'brush';
|
|
46
|
+
currentSize = 'medium';
|
|
47
|
+
currentColor = 'black';
|
|
48
|
+
i18n = I18nEn;
|
|
49
|
+
canUndo = false;
|
|
50
|
+
canRedo = false;
|
|
51
|
+
isLoading = true;
|
|
52
|
+
hasError = false;
|
|
53
|
+
errorMessage = '';
|
|
54
|
+
canvas;
|
|
55
|
+
stack = [];
|
|
56
|
+
colorsName = [];
|
|
57
|
+
drawingSizesName = [];
|
|
58
|
+
imageUsed;
|
|
59
|
+
componentGuid;
|
|
60
|
+
constructor() {
|
|
61
|
+
}
|
|
62
|
+
ngOnInit() {
|
|
63
|
+
this.componentGuid = 'xxxx-xxxx-xxxx-xxxx'.replace(/[xy]/g, function (c) {
|
|
64
|
+
var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
|
|
65
|
+
return v.toString(16);
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
ngAfterViewInit() {
|
|
69
|
+
this.isLoading = false;
|
|
70
|
+
this.colorsName = Object.keys(this.colors);
|
|
71
|
+
this.drawingSizesName = Object.keys(this.drawingSizes);
|
|
72
|
+
const canvasScaledElement = document.getElementById(this.componentGuid);
|
|
73
|
+
this.canvas = new fabric.Canvas(canvasScaledElement, {
|
|
74
|
+
hoverCursor: 'pointer',
|
|
75
|
+
isDrawingMode: true,
|
|
76
|
+
});
|
|
77
|
+
this.canvas.backgroundColor = 'white';
|
|
78
|
+
if (this.src) {
|
|
79
|
+
this.importPhotoFromSrc(this.src);
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
if (!this.width || !this.height) {
|
|
83
|
+
throw new Error('No width or hight given !');
|
|
84
|
+
}
|
|
85
|
+
this.canvas.setWidth(this.width);
|
|
86
|
+
this.canvas.setHeight(this.height);
|
|
87
|
+
}
|
|
88
|
+
this.canvas.on('path:created', () => {
|
|
89
|
+
this.stack = [];
|
|
90
|
+
this.setUndoRedo();
|
|
91
|
+
});
|
|
92
|
+
this.selectTool(this.currentTool);
|
|
93
|
+
this.selectColor(this.currentColor);
|
|
94
|
+
this.selectDrawingSize(this.currentSize);
|
|
95
|
+
if (this.locale && i18nLanguages[this.locale.toLowerCase()]) {
|
|
96
|
+
this.i18n = i18nLanguages[this.locale.toLowerCase()];
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
ngOnChanges(changes) {
|
|
100
|
+
if (changes.src && !changes.src.firstChange && changes.src.currentValue) {
|
|
101
|
+
if (typeof changes.src.currentValue === 'string') {
|
|
102
|
+
this.importPhotoFromSrc(changes.src.currentValue);
|
|
103
|
+
}
|
|
104
|
+
else if (changes.src.currentValue instanceof Blob) {
|
|
105
|
+
this.importPhotoFromBlob(changes.src.currentValue);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
// Tools
|
|
110
|
+
selectTool(tool) {
|
|
111
|
+
this.currentTool = tool;
|
|
112
|
+
}
|
|
113
|
+
selectDrawingSize(size) {
|
|
114
|
+
this.currentSize = size;
|
|
115
|
+
if (this.canvas) {
|
|
116
|
+
this.canvas.freeDrawingBrush.width = this.drawingSizes[size];
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
selectColor(color) {
|
|
120
|
+
this.currentColor = color;
|
|
121
|
+
if (this.canvas) {
|
|
122
|
+
this.canvas.freeDrawingBrush.color = this.colors[color];
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
// Actions
|
|
126
|
+
undo() {
|
|
127
|
+
if (this.canUndo) {
|
|
128
|
+
const lastId = this.canvas.getObjects().length - 1;
|
|
129
|
+
const lastObj = this.canvas.getObjects()[lastId];
|
|
130
|
+
this.stack.push(lastObj);
|
|
131
|
+
this.canvas.remove(lastObj);
|
|
132
|
+
this.setUndoRedo();
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
redo() {
|
|
136
|
+
if (this.canRedo) {
|
|
137
|
+
const firstInStack = this.stack.splice(-1, 1)[0];
|
|
138
|
+
if (firstInStack) {
|
|
139
|
+
this.canvas.insertAt(firstInStack, this.canvas.getObjects().length - 1, false);
|
|
140
|
+
}
|
|
141
|
+
this.setUndoRedo();
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
clearCanvas() {
|
|
145
|
+
if (this.canvas) {
|
|
146
|
+
this.canvas.remove(...this.canvas.getObjects());
|
|
147
|
+
this.setUndoRedo();
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
saveImage() {
|
|
151
|
+
if (!this.forceSizeExport || (this.forceSizeExport && this.width && this.height)) {
|
|
152
|
+
const canvasScaledElement = document.createElement('canvas');
|
|
153
|
+
const canvasScaled = new fabric.Canvas(canvasScaledElement);
|
|
154
|
+
canvasScaled.backgroundColor = 'white';
|
|
155
|
+
new Observable(observer => {
|
|
156
|
+
if (this.imageUsed) {
|
|
157
|
+
if (this.forceSizeExport) {
|
|
158
|
+
canvasScaled.setWidth(this.width);
|
|
159
|
+
canvasScaled.setHeight(this.height);
|
|
160
|
+
this.imageUsed.cloneAsImage(imageCloned => {
|
|
161
|
+
imageCloned.scaleToWidth(this.width, false);
|
|
162
|
+
imageCloned.scaleToHeight(this.height, false);
|
|
163
|
+
canvasScaled.setBackgroundImage(imageCloned, (img) => {
|
|
164
|
+
if (!img) {
|
|
165
|
+
observer.error(new Error('Impossible to draw the image on the temporary canvas'));
|
|
166
|
+
}
|
|
167
|
+
observer.next(canvasScaled);
|
|
168
|
+
observer.complete();
|
|
169
|
+
}, {
|
|
170
|
+
crossOrigin: 'anonymous',
|
|
171
|
+
originX: 'left',
|
|
172
|
+
originY: 'top'
|
|
173
|
+
});
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
canvasScaled.setBackgroundImage(this.imageUsed, (img) => {
|
|
178
|
+
if (!img) {
|
|
179
|
+
observer.error(new Error('Impossible to draw the image on the temporary canvas'));
|
|
180
|
+
}
|
|
181
|
+
canvasScaled.setWidth(img.width);
|
|
182
|
+
canvasScaled.setHeight(img.height);
|
|
183
|
+
observer.next(canvasScaled);
|
|
184
|
+
observer.complete();
|
|
185
|
+
}, {
|
|
186
|
+
crossOrigin: 'anonymous',
|
|
187
|
+
originX: 'left',
|
|
188
|
+
originY: 'top'
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
else {
|
|
193
|
+
canvasScaled.setWidth(this.width);
|
|
194
|
+
canvasScaled.setHeight(this.height);
|
|
195
|
+
}
|
|
196
|
+
}).pipe(switchMap(() => {
|
|
197
|
+
let process = of(canvasScaled);
|
|
198
|
+
if (this.canvas.getObjects().length > 0) {
|
|
199
|
+
const ratioX = canvasScaled.getWidth() / this.canvas.getWidth();
|
|
200
|
+
const ratioY = canvasScaled.getHeight() / this.canvas.getHeight();
|
|
201
|
+
this.canvas.getObjects().forEach((originalObject, i) => {
|
|
202
|
+
process = process.pipe(switchMap(() => {
|
|
203
|
+
return new Observable(observerObject => {
|
|
204
|
+
originalObject.clone((clonedObject) => {
|
|
205
|
+
clonedObject.set('left', originalObject.left * ratioX);
|
|
206
|
+
clonedObject.set('top', originalObject.top * ratioY);
|
|
207
|
+
clonedObject.scaleToWidth(originalObject.width * ratioX);
|
|
208
|
+
clonedObject.scaleToHeight(originalObject.height * ratioY);
|
|
209
|
+
canvasScaled.insertAt(clonedObject, i, false);
|
|
210
|
+
canvasScaled.renderAll();
|
|
211
|
+
observerObject.next(canvasScaled);
|
|
212
|
+
observerObject.complete();
|
|
213
|
+
});
|
|
214
|
+
});
|
|
215
|
+
}));
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
return process;
|
|
219
|
+
})).subscribe(() => {
|
|
220
|
+
canvasScaled.renderAll();
|
|
221
|
+
canvasScaled.getElement().toBlob((data) => {
|
|
222
|
+
this.save.emit(data);
|
|
223
|
+
}, this.outputMimeType, this.outputQuality);
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
else {
|
|
227
|
+
this.canvas.getElement().toBlob((data) => {
|
|
228
|
+
this.save.emit(data);
|
|
229
|
+
}, this.outputMimeType, this.outputQuality);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
doLoadOriginal() {
|
|
233
|
+
this.loadOriginal.emit();
|
|
234
|
+
}
|
|
235
|
+
getTextTranslated(name) {
|
|
236
|
+
let strOk = name.split('.').reduce((o, i) => o[i], this.i18n);
|
|
237
|
+
if (this.i18nUser) {
|
|
238
|
+
try {
|
|
239
|
+
const str = name.split('.').reduce((o, i) => o[i], this.i18nUser);
|
|
240
|
+
if (str) {
|
|
241
|
+
strOk = str;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
catch (e) {
|
|
245
|
+
// if we pass here, ignored
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
if (!strOk) {
|
|
249
|
+
console.error(name + ' translation not found !');
|
|
250
|
+
}
|
|
251
|
+
return strOk;
|
|
252
|
+
}
|
|
253
|
+
getTooltipTranslated(name) {
|
|
254
|
+
if (this.enableTooltip) {
|
|
255
|
+
return this.getTextTranslated(name);
|
|
256
|
+
}
|
|
257
|
+
else {
|
|
258
|
+
return '';
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
setUndoRedo() {
|
|
262
|
+
this.canUndo = this.canvas.getObjects().length > 0;
|
|
263
|
+
this.canRedo = this.stack.length > 0;
|
|
264
|
+
// this.canvas.renderAll();
|
|
265
|
+
}
|
|
266
|
+
importPhotoFromFile(event) {
|
|
267
|
+
if (event.target.files && event.target.files.length > 0) {
|
|
268
|
+
const file = event.target.files[0];
|
|
269
|
+
if (file.type.match('image.*')) {
|
|
270
|
+
this.importPhotoFromBlob(file);
|
|
271
|
+
}
|
|
272
|
+
else {
|
|
273
|
+
throw new Error('Not an image !');
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
removeImage() {
|
|
278
|
+
if (this.imageUsed) {
|
|
279
|
+
this.imageUsed.dispose();
|
|
280
|
+
this.imageUsed = null;
|
|
281
|
+
}
|
|
282
|
+
this.canvas.backgroundImage = null;
|
|
283
|
+
if (this.width && this.height) {
|
|
284
|
+
this.canvas.setWidth(this.width);
|
|
285
|
+
this.canvas.setHeight(this.height);
|
|
286
|
+
}
|
|
287
|
+
this.canvas.renderAll();
|
|
288
|
+
}
|
|
289
|
+
get hasImage() {
|
|
290
|
+
return !!this.canvas.backgroundImage;
|
|
291
|
+
}
|
|
292
|
+
importPhotoFromSrc(src) {
|
|
293
|
+
this.isLoading = true;
|
|
294
|
+
let isFirstTry = true;
|
|
295
|
+
const imgEl = new Image();
|
|
296
|
+
imgEl.setAttribute('crossOrigin', 'anonymous');
|
|
297
|
+
imgEl.src = src;
|
|
298
|
+
imgEl.onerror = () => {
|
|
299
|
+
// Retry with cors proxy
|
|
300
|
+
if (isFirstTry) {
|
|
301
|
+
imgEl.src = 'https://cors-anywhere.herokuapp.com/' + this.src;
|
|
302
|
+
isFirstTry = false;
|
|
303
|
+
}
|
|
304
|
+
else {
|
|
305
|
+
this.isLoading = false;
|
|
306
|
+
this.hasError = true;
|
|
307
|
+
this.errorMessage = this.getTextTranslated('loadError').replace('%@', this.src);
|
|
308
|
+
}
|
|
309
|
+
};
|
|
310
|
+
imgEl.onload = () => {
|
|
311
|
+
this.isLoading = false;
|
|
312
|
+
this.imageUsed = new fabric.Image(imgEl);
|
|
313
|
+
this.imageUsed.cloneAsImage(image => {
|
|
314
|
+
let width = imgEl.width;
|
|
315
|
+
let height = imgEl.height;
|
|
316
|
+
if (this.width) {
|
|
317
|
+
width = this.width;
|
|
318
|
+
}
|
|
319
|
+
if (this.height) {
|
|
320
|
+
height = this.height;
|
|
321
|
+
}
|
|
322
|
+
image.scaleToWidth(width, false);
|
|
323
|
+
image.scaleToHeight(height, false);
|
|
324
|
+
this.canvas.setBackgroundImage(image, ((img) => {
|
|
325
|
+
if (img) {
|
|
326
|
+
if (this.forceSizeCanvas) {
|
|
327
|
+
this.canvas.setWidth(width);
|
|
328
|
+
this.canvas.setHeight(height);
|
|
329
|
+
}
|
|
330
|
+
else {
|
|
331
|
+
this.canvas.setWidth(image.getScaledWidth());
|
|
332
|
+
this.canvas.setHeight(image.getScaledHeight());
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
}), {
|
|
336
|
+
crossOrigin: 'anonymous',
|
|
337
|
+
originX: 'left',
|
|
338
|
+
originY: 'top'
|
|
339
|
+
});
|
|
340
|
+
});
|
|
341
|
+
};
|
|
342
|
+
}
|
|
343
|
+
importPhotoFromBlob(file) {
|
|
344
|
+
const reader = new FileReader();
|
|
345
|
+
reader.readAsDataURL(file);
|
|
346
|
+
reader.onload = (evtReader) => {
|
|
347
|
+
if (evtReader.target.readyState == FileReader.DONE) {
|
|
348
|
+
this.importPhotoFromSrc(evtReader.target.result);
|
|
349
|
+
}
|
|
350
|
+
};
|
|
351
|
+
}
|
|
352
|
+
importPhotoFromUrl() {
|
|
353
|
+
const url = prompt(this.getTooltipTranslated('loadImageUrl'));
|
|
354
|
+
if (url) {
|
|
355
|
+
this.importPhotoFromSrc(url);
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
close() {
|
|
359
|
+
this.closeDialog.emit();
|
|
360
|
+
}
|
|
361
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TmwImageDrawerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
362
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: TmwImageDrawerComponent, selector: "tmw-image-drawer", inputs: { src: "src", width: "width", height: "height", forceSizeCanvas: "forceSizeCanvas", forceSizeExport: "forceSizeExport", enableRemoveImage: "enableRemoveImage", enableLoadAnotherImage: "enableLoadAnotherImage", enableTooltip: "enableTooltip", showCancelButton: "showCancelButton", inConfig: "inConfig", i18nUser: ["i18n", "i18nUser"], locale: "locale", loadingTemplate: "loadingTemplate", errorTemplate: "errorTemplate", outputMimeType: "outputMimeType", outputQuality: "outputQuality", borderCss: "borderCss", drawingSizes: "drawingSizes", colors: "colors" }, outputs: { closeDialog: "closeDialog", save: "save", loadOriginal: "loadOriginal" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"loading\" *ngIf=\"isLoading && loadingTemplate\">\r\n <ng-container *ngTemplateOutlet=\"loadingTemplate\"></ng-container>\r\n</div>\r\n<div class=\"error\" *ngIf=\"hasError\">\r\n <ng-container *ngTemplateOutlet=\"errorTemplate ? errorTemplate : defaultError\"></ng-container>\r\n</div>\r\n\r\n<!-- <ng-template #defaultLoading>\r\n <p>{{ getTextTranslated('loading') }}</p>\r\n</ng-template> -->\r\n<ng-template #defaultError>\r\n <p>{{ errorMessage }}</p>\r\n</ng-template>\r\n\r\n<div class=\"toolbar\" *ngIf=\"!isLoading\">\r\n <div class=\"tools\">\r\n\r\n <div class=\"brush\">\r\n <i class=\"title\">tools</i>\r\n <div class=\"internal\">\r\n <i class=\"material-icons btn\" [class.selected]=\"currentTool == 'brush'\" (click)=\"selectTool('brush')\"\r\n [title]=\"getTooltipTranslated('tools.brush')\"><mat-icon>brush</mat-icon></i>\r\n <span *ngFor=\"let drawingSizeName of drawingSizesName\" class=\"size btn mr-1\"\r\n [style.width.px]=\"drawingSizes[drawingSizeName] * 0.8 + 8\"\r\n [style.height.px]=\"drawingSizes[drawingSizeName] * 0.8 + 8\"\r\n [style.borderRadius.px]=\"drawingSizes[drawingSizeName] * 0.4 + 4\"\r\n [class.selected]=\"currentSize == drawingSizeName\" [title]=\"getTooltipTranslated('sizes.' + drawingSizeName)\"\r\n (click)=\"selectDrawingSize(drawingSizeName)\">\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"commands\">\r\n <i class=\"title\">options</i>\r\n <div class=\"internal\">\r\n <i class=\"material-icons btn\" [class.disabled]=\"!canUndo\" (click)=\"undo()\"\r\n [title]=\"getTooltipTranslated('undo')\"><mat-icon>undo</mat-icon></i>\r\n <i class=\"material-icons btn\" [class.disabled]=\"!canRedo\" (click)=\"redo()\"\r\n [title]=\"getTooltipTranslated('redo')\"><mat-icon>redo</mat-icon></i>\r\n <i class=\"material-icons btn\" (click)=\"clearCanvas()\" [title]=\"getTooltipTranslated('clear')\"><mat-icon>clear</mat-icon></i>\r\n </div>\r\n </div>\r\n\r\n <div class=\"colors\">\r\n <i class=\"title\">colors</i>\r\n <div class=\"internal\">\r\n <div *ngFor=\"let colorName of colorsName\" [class.selected]=\"currentColor == colorName\" class=\"color\"\r\n [ngClass]=\"colorName\" [style.background]=\"colors[colorName]\"\r\n [title]=\"getTooltipTranslated('colors.' + colorName)\" (click)=\"selectColor(colorName)\">\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"actions\">\r\n <i class=\"title\">actions</i>\r\n <div class=\"internal\">\r\n <a href=\"#\" class=\"btn btn-success\" (click)=\"saveImage(); $event.preventDefault()\" *ngIf=\"!inConfig\">{{\r\n getTextTranslated('saveBtn') }}</a>\r\n <a href=\"#\" class=\"btn btn-warning\" *ngIf=\"showCancelButton && !inConfig\" (click)=\"doLoadOriginal(); $event.preventDefault()\">{{\r\n getTextTranslated('cancelBtn') }}</a>\r\n <a href=\"#\" class=\"btn btn-danger\" *ngIf=\"showCancelButton\" (click)=\"close(); $event.preventDefault()\">{{\r\n getTextTranslated('closeDialog') }}</a>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n\r\n <!-- Any additional toolbar buttons to be projected by the consuming app -->\r\n <ng-content></ng-content>\r\n</div>\r\n\r\n<div [ngStyle]=\"{ border: borderCss }\">\r\n <canvas [id]=\"componentGuid\"></canvas>\r\n</div>", styles: [":host{display:flex;flex-direction:column;align-items:center}:host .toolbar{display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap}:host .tools{display:inline-flex;flex-direction:row;margin:10px;background:#fff;border-radius:6px;box-shadow:0 3px 10px #0006}:host .tools .brush,:host .tools .commands,:host .tools .colors,:host .tools .actions{display:flex}:host .tools .brush .title,:host .tools .commands .title,:host .tools .colors .title,:host .tools .actions .title{display:flex;vertical-align:middle;background-color:#00a8ff;color:#fff;padding:10px}:host .tools .brush .internal,:host .tools .commands .internal,:host .tools .colors .internal,:host .tools .actions .internal{display:flex;vertical-align:middle;align-items:center;padding:0 15px}:host .tools .brush .internal>*,:host .tools .commands .internal>*,:host .tools .colors .internal>*,:host .tools .actions .internal>*{margin-right:5px}:host .tools .brush .internal .disabled,:host .tools .commands .internal .disabled,:host .tools .colors .internal .disabled,:host .tools .actions .internal .disabled{border:0;color:red}:host .row{display:flex;justify-content:space-around;align-items:center}:host .row:first-child{margin-bottom:10px}:host .size{background-color:#000}:host .size.selected{background-color:#bdbdbd}:host .color{width:28px;height:28px;border-radius:14px;cursor:pointer;display:flex;align-items:center;justify-content:center}:host .color.selected:after{content:\"\";width:10px;height:10px;background:#000;display:flex;border-radius:5px}:host .color.black{background-color:#000}:host .color.black.selected:after{background:#fff}:host .color.white{border:1px solid #a7a7a7}:host .buttons{margin:10px;display:flex;flex-direction:column}:host .button{cursor:pointer;outline:0;border:none;white-space:nowrap;text-decoration:none;vertical-align:baseline;text-align:center;min-width:64px;line-height:36px;padding:3px 16px;border-radius:4px;overflow:visible;transition:background .4s cubic-bezier(.25,.8,.25,1),box-shadow .28s cubic-bezier(.4,0,.2,1);margin:10px}:host .button:hover{text-decoration:none!important}\n"], dependencies: [{ kind: "component", type: i1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }] });
|
|
363
|
+
}
|
|
364
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TmwImageDrawerComponent, decorators: [{
|
|
365
|
+
type: Component,
|
|
366
|
+
args: [{ selector: 'tmw-image-drawer', template: "<div class=\"loading\" *ngIf=\"isLoading && loadingTemplate\">\r\n <ng-container *ngTemplateOutlet=\"loadingTemplate\"></ng-container>\r\n</div>\r\n<div class=\"error\" *ngIf=\"hasError\">\r\n <ng-container *ngTemplateOutlet=\"errorTemplate ? errorTemplate : defaultError\"></ng-container>\r\n</div>\r\n\r\n<!-- <ng-template #defaultLoading>\r\n <p>{{ getTextTranslated('loading') }}</p>\r\n</ng-template> -->\r\n<ng-template #defaultError>\r\n <p>{{ errorMessage }}</p>\r\n</ng-template>\r\n\r\n<div class=\"toolbar\" *ngIf=\"!isLoading\">\r\n <div class=\"tools\">\r\n\r\n <div class=\"brush\">\r\n <i class=\"title\">tools</i>\r\n <div class=\"internal\">\r\n <i class=\"material-icons btn\" [class.selected]=\"currentTool == 'brush'\" (click)=\"selectTool('brush')\"\r\n [title]=\"getTooltipTranslated('tools.brush')\"><mat-icon>brush</mat-icon></i>\r\n <span *ngFor=\"let drawingSizeName of drawingSizesName\" class=\"size btn mr-1\"\r\n [style.width.px]=\"drawingSizes[drawingSizeName] * 0.8 + 8\"\r\n [style.height.px]=\"drawingSizes[drawingSizeName] * 0.8 + 8\"\r\n [style.borderRadius.px]=\"drawingSizes[drawingSizeName] * 0.4 + 4\"\r\n [class.selected]=\"currentSize == drawingSizeName\" [title]=\"getTooltipTranslated('sizes.' + drawingSizeName)\"\r\n (click)=\"selectDrawingSize(drawingSizeName)\">\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"commands\">\r\n <i class=\"title\">options</i>\r\n <div class=\"internal\">\r\n <i class=\"material-icons btn\" [class.disabled]=\"!canUndo\" (click)=\"undo()\"\r\n [title]=\"getTooltipTranslated('undo')\"><mat-icon>undo</mat-icon></i>\r\n <i class=\"material-icons btn\" [class.disabled]=\"!canRedo\" (click)=\"redo()\"\r\n [title]=\"getTooltipTranslated('redo')\"><mat-icon>redo</mat-icon></i>\r\n <i class=\"material-icons btn\" (click)=\"clearCanvas()\" [title]=\"getTooltipTranslated('clear')\"><mat-icon>clear</mat-icon></i>\r\n </div>\r\n </div>\r\n\r\n <div class=\"colors\">\r\n <i class=\"title\">colors</i>\r\n <div class=\"internal\">\r\n <div *ngFor=\"let colorName of colorsName\" [class.selected]=\"currentColor == colorName\" class=\"color\"\r\n [ngClass]=\"colorName\" [style.background]=\"colors[colorName]\"\r\n [title]=\"getTooltipTranslated('colors.' + colorName)\" (click)=\"selectColor(colorName)\">\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"actions\">\r\n <i class=\"title\">actions</i>\r\n <div class=\"internal\">\r\n <a href=\"#\" class=\"btn btn-success\" (click)=\"saveImage(); $event.preventDefault()\" *ngIf=\"!inConfig\">{{\r\n getTextTranslated('saveBtn') }}</a>\r\n <a href=\"#\" class=\"btn btn-warning\" *ngIf=\"showCancelButton && !inConfig\" (click)=\"doLoadOriginal(); $event.preventDefault()\">{{\r\n getTextTranslated('cancelBtn') }}</a>\r\n <a href=\"#\" class=\"btn btn-danger\" *ngIf=\"showCancelButton\" (click)=\"close(); $event.preventDefault()\">{{\r\n getTextTranslated('closeDialog') }}</a>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n\r\n <!-- Any additional toolbar buttons to be projected by the consuming app -->\r\n <ng-content></ng-content>\r\n</div>\r\n\r\n<div [ngStyle]=\"{ border: borderCss }\">\r\n <canvas [id]=\"componentGuid\"></canvas>\r\n</div>", styles: [":host{display:flex;flex-direction:column;align-items:center}:host .toolbar{display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap}:host .tools{display:inline-flex;flex-direction:row;margin:10px;background:#fff;border-radius:6px;box-shadow:0 3px 10px #0006}:host .tools .brush,:host .tools .commands,:host .tools .colors,:host .tools .actions{display:flex}:host .tools .brush .title,:host .tools .commands .title,:host .tools .colors .title,:host .tools .actions .title{display:flex;vertical-align:middle;background-color:#00a8ff;color:#fff;padding:10px}:host .tools .brush .internal,:host .tools .commands .internal,:host .tools .colors .internal,:host .tools .actions .internal{display:flex;vertical-align:middle;align-items:center;padding:0 15px}:host .tools .brush .internal>*,:host .tools .commands .internal>*,:host .tools .colors .internal>*,:host .tools .actions .internal>*{margin-right:5px}:host .tools .brush .internal .disabled,:host .tools .commands .internal .disabled,:host .tools .colors .internal .disabled,:host .tools .actions .internal .disabled{border:0;color:red}:host .row{display:flex;justify-content:space-around;align-items:center}:host .row:first-child{margin-bottom:10px}:host .size{background-color:#000}:host .size.selected{background-color:#bdbdbd}:host .color{width:28px;height:28px;border-radius:14px;cursor:pointer;display:flex;align-items:center;justify-content:center}:host .color.selected:after{content:\"\";width:10px;height:10px;background:#000;display:flex;border-radius:5px}:host .color.black{background-color:#000}:host .color.black.selected:after{background:#fff}:host .color.white{border:1px solid #a7a7a7}:host .buttons{margin:10px;display:flex;flex-direction:column}:host .button{cursor:pointer;outline:0;border:none;white-space:nowrap;text-decoration:none;vertical-align:baseline;text-align:center;min-width:64px;line-height:36px;padding:3px 16px;border-radius:4px;overflow:visible;transition:background .4s cubic-bezier(.25,.8,.25,1),box-shadow .28s cubic-bezier(.4,0,.2,1);margin:10px}:host .button:hover{text-decoration:none!important}\n"] }]
|
|
367
|
+
}], ctorParameters: () => [], propDecorators: { closeDialog: [{
|
|
368
|
+
type: Output
|
|
369
|
+
}], src: [{
|
|
370
|
+
type: Input
|
|
371
|
+
}], width: [{
|
|
372
|
+
type: Input
|
|
373
|
+
}], height: [{
|
|
374
|
+
type: Input
|
|
375
|
+
}], forceSizeCanvas: [{
|
|
376
|
+
type: Input
|
|
377
|
+
}], forceSizeExport: [{
|
|
378
|
+
type: Input
|
|
379
|
+
}], enableRemoveImage: [{
|
|
380
|
+
type: Input
|
|
381
|
+
}], enableLoadAnotherImage: [{
|
|
382
|
+
type: Input
|
|
383
|
+
}], enableTooltip: [{
|
|
384
|
+
type: Input
|
|
385
|
+
}], showCancelButton: [{
|
|
386
|
+
type: Input
|
|
387
|
+
}], inConfig: [{
|
|
388
|
+
type: Input
|
|
389
|
+
}], i18nUser: [{
|
|
390
|
+
type: Input,
|
|
391
|
+
args: ['i18n']
|
|
392
|
+
}], locale: [{
|
|
393
|
+
type: Input
|
|
394
|
+
}], loadingTemplate: [{
|
|
395
|
+
type: Input
|
|
396
|
+
}], errorTemplate: [{
|
|
397
|
+
type: Input
|
|
398
|
+
}], outputMimeType: [{
|
|
399
|
+
type: Input
|
|
400
|
+
}], outputQuality: [{
|
|
401
|
+
type: Input
|
|
402
|
+
}], borderCss: [{
|
|
403
|
+
type: Input
|
|
404
|
+
}], drawingSizes: [{
|
|
405
|
+
type: Input
|
|
406
|
+
}], colors: [{
|
|
407
|
+
type: Input
|
|
408
|
+
}], save: [{
|
|
409
|
+
type: Output
|
|
410
|
+
}], loadOriginal: [{
|
|
411
|
+
type: Output
|
|
412
|
+
}] } });
|
|
413
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG13LWltYWdlLWRyYXdlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lcXAtZHluYW1pYy1tb2R1bGUvc3JjL2xpYi9jb21wb25lbnRzL3ByaXZhdGUvdG13LWltYWdlLWRyYXdlci90bXctaW1hZ2UtZHJhd2VyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VxcC1keW5hbWljLW1vZHVsZS9zcmMvbGliL2NvbXBvbmVudHMvcHJpdmF0ZS90bXctaW1hZ2UtZHJhd2VyL3Rtdy1pbWFnZS1kcmF3ZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFpQixTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBcUIsTUFBTSxFQUE4QixNQUFNLGVBQWUsQ0FBQztBQUNySSxPQUFPLEVBQUUsTUFBTSxFQUFpQixhQUFhLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDOUQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUNoQyxPQUFPLEVBQUUsVUFBVSxFQUFFLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN0QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7QUFPM0MsTUFBTSxPQUFPLHVCQUF1QjtJQUV4QixXQUFXLEdBQXVCLElBQUksWUFBWSxFQUFRLENBQUM7SUFFckQsR0FBRyxDQUFVO0lBQ2IsS0FBSyxDQUFVO0lBQ2YsTUFBTSxDQUFVO0lBRWhCLGVBQWUsR0FBRyxJQUFJLENBQUM7SUFDdkIsZUFBZSxHQUFHLEtBQUssQ0FBQztJQUN4QixpQkFBaUIsR0FBRyxLQUFLLENBQUM7SUFDMUIsc0JBQXNCLEdBQUcsS0FBSyxDQUFDO0lBQy9CLGFBQWEsR0FBRyxLQUFLLENBQUM7SUFDdEIsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO0lBRXhCLFFBQVEsR0FB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d0dBamFVLHVCQUF1Qjs0RkFBdkIsdUJBQXVCLDB0QkNYcEMsKy9HQXlFTTs7NEZEOURPLHVCQUF1QjtrQkFMbkMsU0FBUzsrQkFDRSxrQkFBa0I7d0RBTWxCLFdBQVc7c0JBQXBCLE1BQU07Z0JBRVMsR0FBRztzQkFBbEIsS0FBSztnQkFDVSxLQUFLO3NCQUFwQixLQUFLO2dCQUNVLE1BQU07c0JBQXJCLEtBQUs7Z0JBRVUsZUFBZTtzQkFBOUIsS0FBSztnQkFDVSxlQUFlO3NCQUE5QixLQUFLO2dCQUNVLGlCQUFpQjtzQkFBaEMsS0FBSztnQkFDVSxzQkFBc0I7c0JBQXJDLEtBQUs7Z0JBQ1UsYUFBYTtzQkFBNUIsS0FBSztnQkFDVSxnQkFBZ0I7c0JBQS9CLEtBQUs7Z0JBRVUsUUFBUTtzQkFBdkIsS0FBSztnQkFHZ0IsUUFBUTtzQkFBN0IsS0FBSzt1QkFBQyxNQUFNO2dCQUNHLE1BQU07c0JBQXJCLEtBQUs7Z0JBRVUsZUFBZTtzQkFBOUIsS0FBSztnQkFDVSxhQUFhO3NCQUE1QixLQUFLO2dCQUVVLGNBQWM7c0JBQTdCLEtBQUs7Z0JBQ1UsYUFBYTtzQkFBNUIsS0FBSztnQkFFVSxTQUFTO3NCQUF4QixLQUFLO2dCQUVVLFlBQVk7c0JBQTNCLEtBQUs7Z0JBTVUsTUFBTTtzQkFBckIsS0FBSztnQkFVVyxJQUFJO3NCQUFwQixNQUFNO2dCQUNVLFlBQVk7c0JBQTVCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlclZpZXdJbml0LCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uQ2hhbmdlcywgT25Jbml0LCBPdXRwdXQsIFNpbXBsZUNoYW5nZXMsIFRlbXBsYXRlUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEkxOG5FbiwgSTE4bkludGVyZmFjZSwgaTE4bkxhbmd1YWdlcyB9IGZyb20gJy4vaTE4bic7XHJcbmltcG9ydCB7IGZhYnJpYyB9IGZyb20gJ2ZhYnJpYyc7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIG9mIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IHN3aXRjaE1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAndG13LWltYWdlLWRyYXdlcicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3Rtdy1pbWFnZS1kcmF3ZXIuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3Rtdy1pbWFnZS1kcmF3ZXIuY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgVG13SW1hZ2VEcmF3ZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uQ2hhbmdlcyB7XHJcblxyXG4gIEBPdXRwdXQoKSBjbG9zZURpYWxvZzogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG5cclxuICBASW5wdXQoKSBwdWJsaWMgc3JjPzogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIHB1YmxpYyB3aWR0aD86IG51bWJlcjtcclxuICBASW5wdXQoKSBwdWJsaWMgaGVpZ2h0PzogbnVtYmVyO1xyXG5cclxuICBASW5wdXQoKSBwdWJsaWMgZm9yY2VTaXplQ2FudmFzID0gdHJ1ZTtcclxuICBASW5wdXQoKSBwdWJsaWMgZm9yY2VTaXplRXhwb3J0ID0gZmFsc2U7XHJcbiAgQElucHV0KCkgcHVibGljIGVuYWJsZVJlbW92ZUltYWdlID0gZmFsc2U7XHJcbiAgQElucHV0KCkgcHVibGljIGVuYWJsZUxvYWRBbm90aGVySW1hZ2UgPSBmYWxzZTtcclxuICBASW5wdXQoKSBwdWJsaWMgZW5hYmxlVG9vbHRpcCA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBzaG93Q2FuY2VsQnV0dG9uID0gdHJ1ZTtcclxuXHJcbiAgQElucHV0KCkgcHVibGljIGluQ29uZmlnPzogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvLyBAdHMtaWdub3JlXHJcbiAgQElucHV0KCdpMThuJykgcHVibGljIGkxOG5Vc2VyOiBJMThuSW50ZXJmYWNlO1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBsb2NhbGU6IHN0cmluZyA9ICdlbic7XHJcblxyXG4gIEBJbnB1dCgpIHB1YmxpYyBsb2FkaW5nVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBlcnJvclRlbXBsYXRlPzogVGVtcGxhdGVSZWY8YW55PjtcclxuXHJcbiAgQElucHV0KCkgcHVibGljIG91dHB1dE1pbWVUeXBlID0gJ2ltYWdlL2pwZWcnO1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBvdXRwdXRRdWFsaXR5ID0gMC44O1xyXG5cclxuICBASW5wdXQoKSBwdWJsaWMgYm9yZGVyQ3NzOiBzdHJpbmcgPSAnbm9uZSc7XHJcblxyXG4gIEBJbnB1dCgpIHB1YmxpYyBkcmF3aW5nU2l6ZXM6IHsgW25hbWU6IHN0cmluZ106IG51bWJlciB9ID0ge1xyXG4gICAgc21hbGw6IDUsXHJcbiAgICBtZWRpdW06IDEwLFxyXG4gICAgbGFyZ2U6IDI1LFxyXG4gIH07XHJcblxyXG4gIEBJbnB1dCgpIHB1YmxpYyBjb2xvcnM6IHsgW25hbWU6IHN0cmluZ106IHN0cmluZyB9ID0ge1xyXG4gICAgYmxhY2s6ICcjMDAwJyxcclxuICAgIHdoaXRlOiAnI2ZmZicsXHJcbiAgICB5ZWxsb3c6ICcjZmZlYjNiJyxcclxuICAgIHJlZDogJyNmNDQzMzYnLFxyXG4gICAgYmx1ZTogJyMyMTk2ZjMnLFxyXG4gICAgZ3JlZW46ICcjNGNhZjUwJyxcclxuICAgIHB1cnBsZTogJyM3YTA4YWYnLFxyXG4gIH07XHJcblxyXG4gIEBPdXRwdXQoKSBwdWJsaWMgc2F2ZTogRXZlbnRFbWl0dGVyPEJsb2I+ID0gbmV3IEV2ZW50RW1pdHRlcjxCbG9iPigpO1xyXG4gIEBPdXRwdXQoKSBwdWJsaWMgbG9hZE9yaWdpbmFsOiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcblxyXG4gIHB1YmxpYyBjdXJyZW50VG9vbCA9ICdicnVzaCc7XHJcbiAgcHVibGljIGN1cnJlbnRTaXplID0gJ21lZGl1bSc7XHJcbiAgcHVibGljIGN1cnJlbnRDb2xvciA9ICdibGFjayc7XHJcbiAgcHVibGljIGkxOG46IEkxOG5JbnRlcmZhY2UgPSBJMThuRW47XHJcblxyXG4gIHB1YmxpYyBjYW5VbmRvID0gZmFsc2U7XHJcbiAgcHVibGljIGNhblJlZG8gPSBmYWxzZTtcclxuXHJcbiAgcHVibGljIGlzTG9hZGluZyA9IHRydWU7XHJcbiAgcHVibGljIGhhc0Vycm9yID0gZmFsc2U7XHJcbiAgcHVibGljIGVycm9yTWVzc2FnZSA9ICcnO1xyXG5cclxuICBwcml2YXRlIGNhbnZhczogZmFicmljLkNhbnZhcztcclxuICBwcml2YXRlIHN0YWNrOiBmYWJyaWMuT2JqZWN0W10gPSBbXTtcclxuXHJcbiAgcHVibGljIGNvbG9yc05hbWU6IHN0cmluZ1tdID0gW107XHJcbiAgcHVibGljIGRyYXdpbmdTaXplc05hbWU6IHN0cmluZ1tdID0gW107XHJcblxyXG4gIHByaXZhdGUgaW1hZ2VVc2VkPzogZmFicmljLkltYWdlO1xyXG5cclxuICBjb21wb25lbnRHdWlkOiBzdHJpbmc7XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5jb21wb25lbnRHdWlkID0gJ3h4eHgteHh4eC14eHh4LXh4eHgnLnJlcGxhY2UoL1t4eV0vZywgZnVuY3Rpb24gKGMpIHtcclxuICAgICAgdmFyIHIgPSBNYXRoLnJhbmRvbSgpICogMTYgfCAwLFxyXG4gICAgICAgIHYgPSBjID09ICd4JyA/IHIgOiAociAmIDB4MyB8IDB4OCk7XHJcbiAgICAgIHJldHVybiB2LnRvU3RyaW5nKDE2KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2VcclxuICAgIHRoaXMuY29sb3JzTmFtZSA9IE9iamVjdC5rZXlzKHRoaXMuY29sb3JzKTtcclxuICAgIHRoaXMuZHJhd2luZ1NpemVzTmFtZSA9IE9iamVjdC5rZXlzKHRoaXMuZHJhd2luZ1NpemVzKTtcclxuXHJcbiAgICBjb25zdCBjYW52YXNTY2FsZWRFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5jb21wb25lbnRHdWlkKTtcclxuICAgIHRoaXMuY2FudmFzID0gbmV3IGZhYnJpYy5DYW52YXMoY2FudmFzU2NhbGVkRWxlbWVudCwge1xyXG4gICAgICBob3ZlckN1cnNvcjogJ3BvaW50ZXInLFxyXG4gICAgICBpc0RyYXdpbmdNb2RlOiB0cnVlLFxyXG4gICAgfSk7XHJcbiAgICB0aGlzLmNhbnZhcy5iYWNrZ3JvdW5kQ29sb3IgPSAnd2hpdGUnO1xyXG5cclxuICAgIGlmICh0aGlzLnNyYykge1xyXG4gICAgICB0aGlzLmltcG9ydFBob3RvRnJvbVNyYyh0aGlzLnNyYyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAoIXRoaXMud2lkdGggfHwgIXRoaXMuaGVpZ2h0KSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyB3aWR0aCBvciBoaWdodCBnaXZlbiAhJyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuY2FudmFzLnNldFdpZHRoKHRoaXMud2lkdGgpO1xyXG4gICAgICB0aGlzLmNhbnZhcy5zZXRIZWlnaHQodGhpcy5oZWlnaHQpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuY2FudmFzLm9uKCdwYXRoOmNyZWF0ZWQnLCAoKSA9PiB7XHJcbiAgICAgIHRoaXMuc3RhY2sgPSBbXTtcclxuICAgICAgdGhpcy5zZXRVbmRvUmVkbygpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5zZWxlY3RUb29sKHRoaXMuY3VycmVudFRvb2wpO1xyXG4gICAgdGhpcy5zZWxlY3RDb2xvcih0aGlzLmN1cnJlbnRDb2xvcik7XHJcbiAgICB0aGlzLnNlbGVjdERyYXdpbmdTaXplKHRoaXMuY3VycmVudFNpemUpO1xyXG5cclxuICAgIGlmICh0aGlzLmxvY2FsZSAmJiBpMThuTGFuZ3VhZ2VzW3RoaXMubG9jYWxlLnRvTG93ZXJDYXNlKCldKSB7XHJcbiAgICAgIHRoaXMuaTE4biA9IGkxOG5MYW5ndWFnZXNbdGhpcy5sb2NhbGUudG9Mb3dlckNhc2UoKV07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICBpZiAoY2hhbmdlcy5zcmMgJiYgIWNoYW5nZXMuc3JjLmZpcnN0Q2hhbmdlICYmIGNoYW5nZXMuc3JjLmN1cnJlbnRWYWx1ZSkge1xyXG4gICAgICBpZiAodHlwZW9mIGNoYW5nZXMuc3JjLmN1cnJlbnRWYWx1ZSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICB0aGlzLmltcG9ydFBob3RvRnJvbVNyYyhjaGFuZ2VzLnNyYy5jdXJyZW50VmFsdWUpO1xyXG4gICAgICB9IGVsc2UgaWYgKGNoYW5nZXMuc3JjLmN1cnJlbnRWYWx1ZSBpbnN0YW5jZW9mIEJsb2IpIHtcclxuICAgICAgICB0aGlzLmltcG9ydFBob3RvRnJvbUJsb2IoY2hhbmdlcy5zcmMuY3VycmVudFZhbHVlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gVG9vbHNcclxuICBwdWJsaWMgc2VsZWN0VG9vbCh0b29sOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuY3VycmVudFRvb2wgPSB0b29sO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNlbGVjdERyYXdpbmdTaXplKHNpemU6IHN0cmluZykge1xyXG4gICAgdGhpcy5jdXJyZW50U2l6ZSA9IHNpemU7XHJcbiAgICBpZiAodGhpcy5jYW52YXMpIHtcclxuICAgICAgdGhpcy5jYW52YXMuZnJlZURyYXdpbmdCcnVzaC53aWR0aCA9IHRoaXMuZHJhd2luZ1NpemVzW3NpemVdO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHNlbGVjdENvbG9yKGNvbG9yOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuY3VycmVudENvbG9yID0gY29sb3I7XHJcbiAgICBpZiAodGhpcy5jYW52YXMpIHtcclxuICAgICAgdGhpcy5jYW52YXMuZnJlZURyYXdpbmdCcnVzaC5jb2xvciA9IHRoaXMuY29sb3JzW2NvbG9yXTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIEFjdGlvbnNcclxuICBwdWJsaWMgdW5kbygpIHtcclxuICAgIGlmICh0aGlzLmNhblVuZG8pIHtcclxuICAgICAgY29uc3QgbGFzdElkID0gdGhpcy5jYW52YXMuZ2V0T2JqZWN0cygpLmxlbmd0aCAtIDE7XHJcbiAgICAgIGNvbnN0IGxhc3RPYmogPSB0aGlzLmNhbnZhcy5nZXRPYmplY3RzKClbbGFzdElkXTtcclxuICAgICAgdGhpcy5zdGFjay5wdXNoKGxhc3RPYmopO1xyXG4gICAgICB0aGlzLmNhbnZhcy5yZW1vdmUobGFzdE9iaik7XHJcbiAgICAgIHRoaXMuc2V0VW5kb1JlZG8oKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyByZWRvKCkge1xyXG4gICAgaWYgKHRoaXMuY2FuUmVkbykge1xyXG4gICAgICBjb25zdCBmaXJzdEluU3RhY2sgPSB0aGlzLnN0YWNrLnNwbGljZSgtMSwgMSlbMF07XHJcbiAgICAgIGlmIChmaXJzdEluU3RhY2spIHtcclxuICAgICAgICB0aGlzLmNhbnZhcy5pbnNlcnRBdChmaXJzdEluU3RhY2ssIHRoaXMuY2FudmFzLmdldE9iamVjdHMoKS5sZW5ndGggLSAxLCBmYWxzZSk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5zZXRVbmRvUmVkbygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGNsZWFyQ2FudmFzKCkge1xyXG4gICAgaWYgKHRoaXMuY2FudmFzKSB7XHJcbiAgICAgIHRoaXMuY2FudmFzLnJlbW92ZSguLi50aGlzLmNhbnZhcy5nZXRPYmplY3RzKCkpO1xyXG4gICAgICB0aGlzLnNldFVuZG9SZWRvKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2F2ZUltYWdlKCkge1xyXG4gICAgaWYgKCF0aGlzLmZvcmNlU2l6ZUV4cG9ydCB8fCAodGhpcy5mb3JjZVNpemVFeHBvcnQgJiYgdGhpcy53aWR0aCAmJiB0aGlzLmhlaWdodCkpIHtcclxuICAgICAgY29uc3QgY2FudmFzU2NhbGVkRWxlbWVudDogSFRNTENhbnZhc0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcclxuICAgICAgY29uc3QgY2FudmFzU2NhbGVkID0gbmV3IGZhYnJpYy5DYW52YXMoY2FudmFzU2NhbGVkRWxlbWVudCk7XHJcbiAgICAgIGNhbnZhc1NjYWxlZC5iYWNrZ3JvdW5kQ29sb3IgPSAnd2hpdGUnO1xyXG5cclxuICAgICAgbmV3IE9ic2VydmFibGU8ZmFicmljLkNhbnZhcz4ob2JzZXJ2ZXIgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLmltYWdlVXNlZCkge1xyXG4gICAgICAgICAgaWYgKHRoaXMuZm9yY2VTaXplRXhwb3J0KSB7XHJcbiAgICAgICAgICAgIGNhbnZhc1NjYWxlZC5zZXRXaWR0aCh0aGlzLndpZHRoKTtcclxuICAgICAgICAgICAgY2FudmFzU2NhbGVkLnNldEhlaWdodCh0aGlzLmhlaWdodCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmltYWdlVXNlZC5jbG9uZUFzSW1hZ2UoaW1hZ2VDbG9uZWQgPT4ge1xyXG4gICAgICAgICAgICAgIGltYWdlQ2xvbmVkLnNjYWxlVG9XaWR0aCh0aGlzLndpZHRoLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgaW1hZ2VDbG9uZWQuc2NhbGVUb0hlaWdodCh0aGlzLmhlaWdodCwgZmFsc2UpO1xyXG5cclxuICAgICAgICAgICAgICBjYW52YXNTY2FsZWQuc2V0QmFja2dyb3VuZEltYWdlKGltYWdlQ2xvbmVkLCAoaW1nOiBIVE1MSW1hZ2VFbGVtZW50KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWltZykge1xyXG4gICAgICAgICAgICAgICAgICBvYnNlcnZlci5lcnJvcihuZXcgRXJyb3IoJ0ltcG9zc2libGUgdG8gZHJhdyB0aGUgaW1hZ2Ugb24gdGhlIHRlbXBvcmFyeSBjYW52YXMnKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dChjYW52YXNTY2FsZWQpO1xyXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcclxuICAgICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgICBjcm9zc09yaWdpbjogJ2Fub255bW91cycsXHJcbiAgICAgICAgICAgICAgICBvcmlnaW5YOiAnbGVmdCcsXHJcbiAgICAgICAgICAgICAgICBvcmlnaW5ZOiAndG9wJ1xyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNhbnZhc1NjYWxlZC5zZXRCYWNrZ3JvdW5kSW1hZ2UodGhpcy5pbWFnZVVzZWQsIChpbWc6IEhUTUxJbWFnZUVsZW1lbnQpID0+IHtcclxuICAgICAgICAgICAgICBpZiAoIWltZykge1xyXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZXIuZXJyb3IobmV3IEVycm9yKCdJbXBvc3NpYmxlIHRvIGRyYXcgdGhlIGltYWdlIG9uIHRoZSB0ZW1wb3JhcnkgY2FudmFzJykpO1xyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgY2FudmFzU2NhbGVkLnNldFdpZHRoKGltZy53aWR0aCk7XHJcbiAgICAgICAgICAgICAgY2FudmFzU2NhbGVkLnNldEhlaWdodChpbWcuaGVpZ2h0KTtcclxuXHJcbiAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dChjYW52YXNTY2FsZWQpO1xyXG4gICAgICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XHJcbiAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICBjcm9zc09yaWdpbjogJ2Fub255bW91cycsXHJcbiAgICAgICAgICAgICAgb3JpZ2luWDogJ2xlZnQnLFxyXG4gICAgICAgICAgICAgIG9yaWdpblk6ICd0b3AnXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjYW52YXNTY2FsZWQuc2V0V2lkdGgodGhpcy53aWR0aCk7XHJcbiAgICAgICAgICBjYW52YXNTY2FsZWQuc2V0SGVpZ2h0KHRoaXMuaGVpZ2h0KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pLnBpcGUoXHJcbiAgICAgICAgc3dpdGNoTWFwKCgpID0+IHtcclxuICAgICAgICAgIGxldCBwcm9jZXNzID0gb2YoY2FudmFzU2NhbGVkKTtcclxuXHJcbiAgICAgICAgICBpZiAodGhpcy5jYW52YXMuZ2V0T2JqZWN0cygpLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgY29uc3QgcmF0aW9YID0gY2FudmFzU2NhbGVkLmdldFdpZHRoKCkgLyB0aGlzLmNhbnZhcy5nZXRXaWR0aCgpO1xyXG4gICAgICAgICAgICBjb25zdCByYXRpb1kgPSBjYW52YXNTY2FsZWQuZ2V0SGVpZ2h0KCkgLyB0aGlzLmNhbnZhcy5nZXRIZWlnaHQoKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuY2FudmFzLmdldE9iamVjdHMoKS5mb3JFYWNoKChvcmlnaW5hbE9iamVjdDogZmFicmljLk9iamVjdCwgaTogbnVtYmVyKSA9PiB7XHJcbiAgICAgICAgICAgICAgcHJvY2VzcyA9IHByb2Nlc3MucGlwZShzd2l0Y2hNYXAoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlPGZhYnJpYy5DYW52YXM+KG9ic2VydmVyT2JqZWN0ID0+IHtcclxuICAgICAgICAgICAgICAgICAgb3JpZ2luYWxPYmplY3QuY2xvbmUoKGNsb25lZE9iamVjdDogZmFicmljLk9iamVjdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNsb25lZE9iamVjdC5zZXQoJ2xlZnQnLCBvcmlnaW5hbE9iamVjdC5sZWZ0ICogcmF0aW9YKTtcclxuICAgICAgICAgICAgICAgICAgICBjbG9uZWRPYmplY3Quc2V0KCd0b3AnLCBvcmlnaW5hbE9iamVjdC50b3AgKiByYXRpb1kpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNsb25lZE9iamVjdC5zY2FsZVRvV2lkdGgob3JpZ2luYWxPYmplY3Qud2lkdGggKiByYXRpb1gpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNsb25lZE9iamVjdC5zY2FsZVRvSGVpZ2h0KG9yaWdpbmFsT2JqZWN0LmhlaWdodCAqIHJhdGlvWSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNhbnZhc1NjYWxlZC5pbnNlcnRBdChjbG9uZWRPYmplY3QsIGksIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICBjYW52YXNTY2FsZWQucmVuZGVyQWxsKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIG9ic2VydmVyT2JqZWN0Lm5leHQoY2FudmFzU2NhbGVkKTtcclxuICAgICAgICAgICAgICAgICAgICBvYnNlcnZlck9iamVjdC5jb21wbGV0ZSgpO1xyXG4gICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gcHJvY2VzcztcclxuICAgICAgICB9KSxcclxuICAgICAgKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgIGNhbnZhc1NjYWxlZC5yZW5kZXJBbGwoKTtcclxuICAgICAgICBjYW52YXNTY2FsZWQuZ2V0RWxlbWVudCgpLnRvQmxvYihcclxuICAgICAgICAgIChkYXRhOiBCbG9iKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuc2F2ZS5lbWl0KGRhdGEpO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHRoaXMub3V0cHV0TWltZVR5cGUsXHJcbiAgICAgICAgICB0aGlzLm91dHB1dFF1YWxpdHlcclxuICAgICAgICApO1xyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuY2FudmFzLmdldEVsZW1lbnQoKS50b0Jsb2IoXHJcbiAgICAgICAgKGRhdGE6IEJsb2IpID0+IHtcclxuICAgICAgICAgIHRoaXMuc2F2ZS5lbWl0KGRhdGEpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgdGhpcy5vdXRwdXRNaW1lVHlwZSxcclxuICAgICAgICB0aGlzLm91dHB1dFF1YWxpdHlcclxuICAgICAgKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBkb0xvYWRPcmlnaW5hbCgpIHtcclxuICAgIHRoaXMubG9hZE9yaWdpbmFsLmVtaXQoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRUZXh0VHJhbnNsYXRlZChuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgbGV0IHN0ck9rID0gbmFtZS5zcGxpdCgnLicpLnJlZHVjZSgobywgaSkgPT4gb1tpXSwgdGhpcy5pMThuIGFzIGFueSk7XHJcblxyXG4gICAgaWYgKHRoaXMuaTE4blVzZXIpIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBjb25zdCBzdHIgPSBuYW1lLnNwbGl0KCcuJykucmVkdWNlKChvLCBpKSA9PiBvW2ldLCB0aGlzLmkxOG5Vc2VyIGFzIGFueSk7XHJcbiAgICAgICAgaWYgKHN0cikge1xyXG4gICAgICAgICAgc3RyT2sgPSBzdHI7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgLy8gaWYgd2UgcGFzcyBoZXJlLCBpZ25vcmVkXHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXN0ck9rKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IobmFtZSArICcgdHJhbnNsYXRpb24gbm90IGZvdW5kICEnKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gc3RyT2s7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0VG9vbHRpcFRyYW5zbGF0ZWQobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGlmICh0aGlzLmVuYWJsZVRvb2x0aXApIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZ2V0VGV4dFRyYW5zbGF0ZWQobmFtZSlcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiAnJztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0VW5kb1JlZG8oKSB7XHJcbiAgICB0aGlzLmNhblVuZG8gPSB0aGlzLmNhbnZhcy5nZXRPYmplY3RzKCkubGVuZ3RoID4gMDtcclxuICAgIHRoaXMuY2FuUmVkbyA9IHRoaXMuc3RhY2subGVuZ3RoID4gMDtcclxuICAgIC8vIHRoaXMuY2FudmFzLnJlbmRlckFsbCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGltcG9ydFBob3RvRnJvbUZpbGUoZXZlbnQ6IEV2ZW50IHwgYW55KSB7XHJcbiAgICBpZiAoZXZlbnQudGFyZ2V0LmZpbGVzICYmIGV2ZW50LnRhcmdldC5maWxlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGNvbnN0IGZpbGUgPSBldmVudC50YXJnZXQuZmlsZXNbMF07XHJcbiAgICAgIGlmIChmaWxlLnR5cGUubWF0Y2goJ2ltYWdlLionKSkge1xyXG4gICAgICAgIHRoaXMuaW1wb3J0UGhvdG9Gcm9tQmxvYihmaWxlKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBhbiBpbWFnZSAhJyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyByZW1vdmVJbWFnZSgpIHtcclxuICAgIGlmICh0aGlzLmltYWdlVXNlZCkge1xyXG4gICAgICB0aGlzLmltYWdlVXNlZC5kaXNwb3NlKCk7XHJcbiAgICAgIHRoaXMuaW1hZ2VVc2VkID0gbnVsbDtcclxuICAgIH1cclxuICAgIHRoaXMuY2FudmFzLmJhY2tncm91bmRJbWFnZSA9IG51bGw7XHJcblxyXG4gICAgaWYgKHRoaXMud2lkdGggJiYgdGhpcy5oZWlnaHQpIHtcclxuICAgICAgdGhpcy5jYW52YXMuc2V0V2lkdGgodGhpcy53aWR0aCk7XHJcbiAgICAgIHRoaXMuY2FudmFzLnNldEhlaWdodCh0aGlzLmhlaWdodCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jYW52YXMucmVuZGVyQWxsKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGhhc0ltYWdlKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICEhdGhpcy5jYW52YXMuYmFja2dyb3VuZEltYWdlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbXBvcnRQaG90b0Zyb21TcmMoc3JjOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuaXNMb2FkaW5nID0gdHJ1ZTtcclxuICAgIGxldCBpc0ZpcnN0VHJ5ID0gdHJ1ZTtcclxuICAgIGNvbnN0IGltZ0VsID0gbmV3IEltYWdlKCk7XHJcbiAgICBpbWdFbC5zZXRBdHRyaWJ1dGUoJ2Nyb3NzT3JpZ2luJywgJ2Fub255bW91cycpO1xyXG4gICAgaW1nRWwuc3JjID0gc3JjO1xyXG4gICAgaW1nRWwub25lcnJvciA9ICgpID0+IHtcclxuICAgICAgLy8gUmV0cnkgd2l0aCBjb3JzIHByb3h5XHJcbiAgICAgIGlmIChpc0ZpcnN0VHJ5KSB7XHJcbiAgICAgICAgaW1nRWwuc3JjID0gJ2h0dHBzOi8vY29ycy1hbnl3aGVyZS5oZXJva3VhcHAuY29tLycgKyB0aGlzLnNyYztcclxuICAgICAgICBpc0ZpcnN0VHJ5ID0gZmFsc2U7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmhhc0Vycm9yID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmVycm9yTWVzc2FnZSA9IHRoaXMuZ2V0VGV4dFRyYW5zbGF0ZWQoJ2xvYWRFcnJvcicpLnJlcGxhY2UoJyVAJywgdGhpcy5zcmMgYXMgc3RyaW5nKTtcclxuICAgICAgfVxyXG4gICAgfTtcclxuICAgIGltZ0VsLm9ubG9hZCA9ICgpID0+IHtcclxuICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgdGhpcy5pbWFnZVVzZWQgPSBuZXcgZmFicmljLkltYWdlKGltZ0VsKTtcclxuXHJcbiAgICAgIHRoaXMuaW1hZ2VVc2VkLmNsb25lQXNJbWFnZShpbWFnZSA9PiB7XHJcbiAgICAgICAgbGV0IHdpZHRoID0gaW1nRWwud2lkdGg7XHJcbiAgICAgICAgbGV0IGhlaWdodCA9IGltZ0VsLmhlaWdodDtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMud2lkdGgpIHtcclxuICAgICAgICAgIHdpZHRoID0gdGhpcy53aWR0aDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuaGVpZ2h0KSB7XHJcbiAgICAgICAgICBoZWlnaHQgPSB0aGlzLmhlaWdodDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGltYWdlLnNjYWxlVG9XaWR0aCh3aWR0aCwgZmFsc2UpO1xyXG4gICAgICAgIGltYWdlLnNjYWxlVG9IZWlnaHQoaGVpZ2h0LCBmYWxzZSk7XHJcblxyXG4gICAgICAgIHRoaXMuY2FudmFzLnNldEJhY2tncm91bmRJbWFnZShpbWFnZSwgKChpbWc6IEhUTUxJbWFnZUVsZW1lbnQpID0+IHtcclxuICAgICAgICAgIGlmIChpbWcpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuZm9yY2VTaXplQ2FudmFzKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5jYW52YXMuc2V0V2lkdGgod2lkdGgpO1xyXG4gICAgICAgICAgICAgIHRoaXMuY2FudmFzLnNldEhlaWdodChoZWlnaHQpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIHRoaXMuY2FudmFzLnNldFdpZHRoKGltYWdlLmdldFNjYWxlZFdpZHRoKCkpO1xyXG4gICAgICAgICAgICAgIHRoaXMuY2FudmFzLnNldEhlaWdodChpbWFnZS5nZXRTY2FsZWRIZWlnaHQoKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9KSwge1xyXG4gICAgICAgICAgY3Jvc3NPcmlnaW46ICdhbm9ueW1vdXMnLFxyXG4gICAgICAgICAgb3JpZ2luWDogJ2xlZnQnLFxyXG4gICAgICAgICAgb3JpZ2luWTogJ3RvcCdcclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbXBvcnRQaG90b0Zyb21CbG9iKGZpbGU6IEJsb2IgfCBGaWxlKSB7XHJcbiAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG4gICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSk7XHJcbiAgICByZWFkZXIub25sb2FkID0gKGV2dFJlYWRlcjogYW55KSA9PiB7XHJcbiAgICAgIGlmIChldnRSZWFkZXIudGFyZ2V0LnJlYWR5U3RhdGUgPT0gRmlsZVJlYWRlci5ET05FKSB7XHJcbiAgICAgICAgdGhpcy5pbXBvcnRQaG90b0Zyb21TcmMoZXZ0UmVhZGVyLnRhcmdldC5yZXN1bHQpO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGltcG9ydFBob3RvRnJvbVVybCgpIHtcclxuICAgIGNvbnN0IHVybCA9IHByb21wdCh0aGlzLmdldFRvb2x0aXBUcmFuc2xhdGVkKCdsb2FkSW1hZ2VVcmwnKSk7XHJcbiAgICBpZiAodXJsKSB7XHJcbiAgICAgIHRoaXMuaW1wb3J0UGhvdG9Gcm9tU3JjKHVybCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2xvc2UoKXtcclxuICAgIHRoaXMuY2xvc2VEaWFsb2cuZW1pdCgpO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwibG9hZGluZ1wiICpuZ0lmPVwiaXNMb2FkaW5nICYmIGxvYWRpbmdUZW1wbGF0ZVwiPlxyXG4gIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJsb2FkaW5nVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cclxuPC9kaXY+XHJcbjxkaXYgY2xhc3M9XCJlcnJvclwiICpuZ0lmPVwiaGFzRXJyb3JcIj5cclxuICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZXJyb3JUZW1wbGF0ZSA/IGVycm9yVGVtcGxhdGUgOiBkZWZhdWx0RXJyb3JcIj48L25nLWNvbnRhaW5lcj5cclxuPC9kaXY+XHJcblxyXG48IS0tIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdExvYWRpbmc+XHJcbiAgICA8cD57eyBnZXRUZXh0VHJhbnNsYXRlZCgnbG9hZGluZycpIH19PC9wPlxyXG48L25nLXRlbXBsYXRlPiAtLT5cclxuPG5nLXRlbXBsYXRlICNkZWZhdWx0RXJyb3I+XHJcbiAgPHA+e3sgZXJyb3JNZXNzYWdlIH19PC9wPlxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuPGRpdiBjbGFzcz1cInRvb2xiYXJcIiAqbmdJZj1cIiFpc0xvYWRpbmdcIj5cclxuICA8ZGl2IGNsYXNzPVwidG9vbHNcIj5cclxuXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJicnVzaFwiPlxyXG4gICAgICAgICAgPGkgY2xhc3M9XCJ0aXRsZVwiPnRvb2xzPC9pPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImludGVybmFsXCI+XHJcbiAgICAgICAgICAgIDxpIGNsYXNzPVwibWF0ZXJpYWwtaWNvbnMgYnRuXCIgW2NsYXNzLnNlbGVjdGVkXT1cImN1cnJlbnRUb29sID09ICdicnVzaCdcIiAoY2xpY2spPVwic2VsZWN0VG9vbCgnYnJ1c2gnKVwiXHJcbiAgICAgICAgICAgICAgW3RpdGxlXT1cImdldFRvb2x0aXBUcmFuc2xhdGVkKCd0b29scy5icnVzaCcpXCI+PG1hdC1pY29uPmJydXNoPC9tYXQtaWNvbj48L2k+XHJcbiAgICAgICAgICAgIDxzcGFuICpuZ0Zvcj1cImxldCBkcmF3aW5nU2l6ZU5hbWUgb2YgZHJhd2luZ1NpemVzTmFtZVwiIGNsYXNzPVwic2l6ZSBidG4gbXItMVwiXHJcbiAgICAgICAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cImRyYXdpbmdTaXplc1tkcmF3aW5nU2l6ZU5hbWVdICogMC44ICsgOFwiXHJcbiAgICAgICAgICAgICAgW3N0eWxlLmhlaWdodC5weF09XCJkcmF3aW5nU2l6ZXNbZHJhd2luZ1NpemVOYW1lXSAqIDAuOCArIDhcIlxyXG4gICAgICAgICAgICAgIFtzdHlsZS5ib3JkZXJSYWRpdXMucHhdPVwiZHJhd2luZ1NpemVzW2RyYXdpbmdTaXplTmFtZV0gKiAwLjQgKyA0XCJcclxuICAgICAgICAgICAgICBbY2xhc3Muc2VsZWN0ZWRdPVwiY3VycmVudFNpemUgPT0gZHJhd2luZ1NpemVOYW1lXCIgW3RpdGxlXT1cImdldFRvb2x0aXBUcmFuc2xhdGVkKCdzaXplcy4nICsgZHJhd2luZ1NpemVOYW1lKVwiXHJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdERyYXdpbmdTaXplKGRyYXdpbmdTaXplTmFtZSlcIj5cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPGRpdiBjbGFzcz1cImNvbW1hbmRzXCI+XHJcbiAgICAgICAgPGkgY2xhc3M9XCJ0aXRsZVwiPm9wdGlvbnM8L2k+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImludGVybmFsXCI+XHJcbiAgICAgICAgICA8aSBjbGFzcz1cIm1hdGVyaWFsLWljb25zIGJ0blwiIFtjbGFzcy5kaXNhYmxlZF09XCIhY2FuVW5kb1wiIChjbGljayk9XCJ1bmRvKClcIlxyXG4gICAgICAgICAgW3RpdGxlXT1cImdldFRvb2x0aXBUcmFuc2xhdGVkKCd1bmRvJylcIj48bWF0LWljb24+dW5kbzwvbWF0LWljb24+PC9pPlxyXG4gICAgICAgICAgPGkgY2xhc3M9XCJtYXRlcmlhbC1pY29ucyBidG5cIiBbY2xhc3MuZGlzYWJsZWRdPVwiIWNhblJlZG9cIiAoY2xpY2spPVwicmVkbygpXCJcclxuICAgICAgICAgICAgW3RpdGxlXT1cImdldFRvb2x0aXBUcmFuc2xhdGVkKCdyZWRvJylcIj48bWF0LWljb24+cmVkbzwvbWF0LWljb24+PC9pPlxyXG4gICAgICAgICAgPGkgY2xhc3M9XCJtYXRlcmlhbC1pY29ucyBidG5cIiAoY2xpY2spPVwiY2xlYXJDYW52YXMoKVwiIFt0aXRsZV09XCJnZXRUb29sdGlwVHJhbnNsYXRlZCgnY2xlYXInKVwiPjxtYXQtaWNvbj5jbGVhcjwvbWF0LWljb24+PC9pPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjb2xvcnNcIj5cclxuICAgICAgICA8aSBjbGFzcz1cInRpdGxlXCI+Y29sb3JzPC9pPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJpbnRlcm5hbFwiPlxyXG4gICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgY29sb3JOYW1lIG9mIGNvbG9yc05hbWVcIiBbY2xhc3Muc2VsZWN0ZWRdPVwiY3VycmVudENvbG9yID09IGNvbG9yTmFtZVwiIGNsYXNzPVwiY29sb3JcIlxyXG4gICAgICAgICAgW25nQ2xhc3NdPVwiY29sb3JOYW1lXCIgW3N0eWxlLmJhY2tncm91bmRdPVwiY29sb3JzW2NvbG9yTmFtZV1cIlxyXG4gICAgICAgICAgW3RpdGxlXT1cImdldFRvb2x0aXBUcmFuc2xhdGVkKCdjb2xvcnMuJyArIGNvbG9yTmFtZSlcIiAoY2xpY2spPVwic2VsZWN0Q29sb3IoY29sb3JOYW1lKVwiPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPGRpdiBjbGFzcz1cImFjdGlvbnNcIj5cclxuICAgICAgICA8aSBjbGFzcz1cInRpdGxlXCI+YWN0aW9uczwvaT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiaW50ZXJuYWxcIj5cclxuICAgICAgICAgIDxhIGhyZWY9XCIjXCIgY2xhc3M9XCJidG4gYnRuLXN1Y2Nlc3NcIiAoY2xpY2spPVwic2F2ZUltYWdlKCk7ICRldmVudC5wcmV2ZW50RGVmYXVsdCgpXCIgKm5nSWY9XCIhaW5Db25maWdcIj57e1xyXG4gICAgICAgICAgICBnZXRUZXh0VHJhbnNsYXRlZCgnc2F2ZUJ0bicpIH19PC9hPlxyXG4gICAgICAgICAgPGEgaHJlZj1cIiNcIiBjbGFzcz1cImJ0biBidG4td2FybmluZ1wiICpuZ0lmPVwic2hvd0NhbmNlbEJ1dHRvbiAmJiAhaW5Db25maWdcIiAoY2xpY2spPVwiZG9Mb2FkT3JpZ2luYWwoKTsgJGV2ZW50LnByZXZlbnREZWZhdWx0KClcIj57e1xyXG4gICAgICAgICAgICBnZXRUZXh0VHJhbnNsYXRlZCgnY2FuY2VsQnRuJykgfX08L2E+XHJcbiAgICAgICAgICA8YSBocmVmPVwiI1wiIGNsYXNzPVwiYnRuIGJ0bi1kYW5nZXJcIiAqbmdJZj1cInNob3dDYW5jZWxCdXR0b25cIiAoY2xpY2spPVwiY2xvc2UoKTsgJGV2ZW50LnByZXZlbnREZWZhdWx0KClcIj57e1xyXG4gICAgICAgICAgICBnZXRUZXh0VHJhbnNsYXRlZCgnY2xvc2VEaWFsb2cnKSB9fTwvYT5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgPC9kaXY+XHJcblxyXG4gIDwhLS0gQW55IGFkZGl0aW9uYWwgdG9vbGJhciBidXR0b25zIHRvIGJlIHByb2plY3RlZCBieSB0aGUgY29uc3VtaW5nIGFwcCAtLT5cclxuICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XHJcbjwvZGl2PlxyXG5cclxuPGRpdiBbbmdTdHlsZV09XCJ7IGJvcmRlcjogYm9yZGVyQ3NzIH1cIj5cclxuICA8Y2FudmFzIFtpZF09XCJjb21wb25lbnRHdWlkXCI+PC9jYW52YXM+XHJcbjwvZGl2PiJdfQ==
|