@eqproject/eqp-dynamic-module 2.8.7 → 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 -179
- 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 -12770
- package/fesm2015/eqproject-eqp-dynamic-module.mjs.map +0 -1
- package/fesm2020/eqproject-eqp-dynamic-module.mjs +0 -12739
- package/fesm2020/eqproject-eqp-dynamic-module.mjs.map +0 -1
|
@@ -1,403 +0,0 @@
|
|
|
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
|
-
constructor() {
|
|
11
|
-
this.closeDialog = new EventEmitter();
|
|
12
|
-
this.forceSizeCanvas = true;
|
|
13
|
-
this.forceSizeExport = false;
|
|
14
|
-
this.enableRemoveImage = false;
|
|
15
|
-
this.enableLoadAnotherImage = false;
|
|
16
|
-
this.enableTooltip = false;
|
|
17
|
-
this.showCancelButton = true;
|
|
18
|
-
this.inConfig = false;
|
|
19
|
-
this.locale = 'en';
|
|
20
|
-
this.outputMimeType = 'image/jpeg';
|
|
21
|
-
this.outputQuality = 0.8;
|
|
22
|
-
this.borderCss = 'none';
|
|
23
|
-
this.drawingSizes = {
|
|
24
|
-
small: 5,
|
|
25
|
-
medium: 10,
|
|
26
|
-
large: 25,
|
|
27
|
-
};
|
|
28
|
-
this.colors = {
|
|
29
|
-
black: '#000',
|
|
30
|
-
white: '#fff',
|
|
31
|
-
yellow: '#ffeb3b',
|
|
32
|
-
red: '#f44336',
|
|
33
|
-
blue: '#2196f3',
|
|
34
|
-
green: '#4caf50',
|
|
35
|
-
purple: '#7a08af',
|
|
36
|
-
};
|
|
37
|
-
this.save = new EventEmitter();
|
|
38
|
-
this.loadOriginal = new EventEmitter();
|
|
39
|
-
this.currentTool = 'brush';
|
|
40
|
-
this.currentSize = 'medium';
|
|
41
|
-
this.currentColor = 'black';
|
|
42
|
-
this.i18n = I18nEn;
|
|
43
|
-
this.canUndo = false;
|
|
44
|
-
this.canRedo = false;
|
|
45
|
-
this.isLoading = true;
|
|
46
|
-
this.hasError = false;
|
|
47
|
-
this.errorMessage = '';
|
|
48
|
-
this.stack = [];
|
|
49
|
-
this.colorsName = [];
|
|
50
|
-
this.drawingSizesName = [];
|
|
51
|
-
}
|
|
52
|
-
ngOnInit() {
|
|
53
|
-
this.componentGuid = 'xxxx-xxxx-xxxx-xxxx'.replace(/[xy]/g, function (c) {
|
|
54
|
-
var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
|
|
55
|
-
return v.toString(16);
|
|
56
|
-
});
|
|
57
|
-
}
|
|
58
|
-
ngAfterViewInit() {
|
|
59
|
-
this.isLoading = false;
|
|
60
|
-
this.colorsName = Object.keys(this.colors);
|
|
61
|
-
this.drawingSizesName = Object.keys(this.drawingSizes);
|
|
62
|
-
const canvasScaledElement = document.getElementById(this.componentGuid);
|
|
63
|
-
this.canvas = new fabric.Canvas(canvasScaledElement, {
|
|
64
|
-
hoverCursor: 'pointer',
|
|
65
|
-
isDrawingMode: true,
|
|
66
|
-
});
|
|
67
|
-
this.canvas.backgroundColor = 'white';
|
|
68
|
-
if (this.src) {
|
|
69
|
-
this.importPhotoFromSrc(this.src);
|
|
70
|
-
}
|
|
71
|
-
else {
|
|
72
|
-
if (!this.width || !this.height) {
|
|
73
|
-
throw new Error('No width or hight given !');
|
|
74
|
-
}
|
|
75
|
-
this.canvas.setWidth(this.width);
|
|
76
|
-
this.canvas.setHeight(this.height);
|
|
77
|
-
}
|
|
78
|
-
this.canvas.on('path:created', () => {
|
|
79
|
-
this.stack = [];
|
|
80
|
-
this.setUndoRedo();
|
|
81
|
-
});
|
|
82
|
-
this.selectTool(this.currentTool);
|
|
83
|
-
this.selectColor(this.currentColor);
|
|
84
|
-
this.selectDrawingSize(this.currentSize);
|
|
85
|
-
if (this.locale && i18nLanguages[this.locale.toLowerCase()]) {
|
|
86
|
-
this.i18n = i18nLanguages[this.locale.toLowerCase()];
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
ngOnChanges(changes) {
|
|
90
|
-
if (changes.src && !changes.src.firstChange && changes.src.currentValue) {
|
|
91
|
-
if (typeof changes.src.currentValue === 'string') {
|
|
92
|
-
this.importPhotoFromSrc(changes.src.currentValue);
|
|
93
|
-
}
|
|
94
|
-
else if (changes.src.currentValue instanceof Blob) {
|
|
95
|
-
this.importPhotoFromBlob(changes.src.currentValue);
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
// Tools
|
|
100
|
-
selectTool(tool) {
|
|
101
|
-
this.currentTool = tool;
|
|
102
|
-
}
|
|
103
|
-
selectDrawingSize(size) {
|
|
104
|
-
this.currentSize = size;
|
|
105
|
-
if (this.canvas) {
|
|
106
|
-
this.canvas.freeDrawingBrush.width = this.drawingSizes[size];
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
selectColor(color) {
|
|
110
|
-
this.currentColor = color;
|
|
111
|
-
if (this.canvas) {
|
|
112
|
-
this.canvas.freeDrawingBrush.color = this.colors[color];
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
// Actions
|
|
116
|
-
undo() {
|
|
117
|
-
if (this.canUndo) {
|
|
118
|
-
const lastId = this.canvas.getObjects().length - 1;
|
|
119
|
-
const lastObj = this.canvas.getObjects()[lastId];
|
|
120
|
-
this.stack.push(lastObj);
|
|
121
|
-
this.canvas.remove(lastObj);
|
|
122
|
-
this.setUndoRedo();
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
redo() {
|
|
126
|
-
if (this.canRedo) {
|
|
127
|
-
const firstInStack = this.stack.splice(-1, 1)[0];
|
|
128
|
-
if (firstInStack) {
|
|
129
|
-
this.canvas.insertAt(firstInStack, this.canvas.getObjects().length - 1, false);
|
|
130
|
-
}
|
|
131
|
-
this.setUndoRedo();
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
clearCanvas() {
|
|
135
|
-
if (this.canvas) {
|
|
136
|
-
this.canvas.remove(...this.canvas.getObjects());
|
|
137
|
-
this.setUndoRedo();
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
saveImage() {
|
|
141
|
-
if (!this.forceSizeExport || (this.forceSizeExport && this.width && this.height)) {
|
|
142
|
-
const canvasScaledElement = document.createElement('canvas');
|
|
143
|
-
const canvasScaled = new fabric.Canvas(canvasScaledElement);
|
|
144
|
-
canvasScaled.backgroundColor = 'white';
|
|
145
|
-
new Observable(observer => {
|
|
146
|
-
if (this.imageUsed) {
|
|
147
|
-
if (this.forceSizeExport) {
|
|
148
|
-
canvasScaled.setWidth(this.width);
|
|
149
|
-
canvasScaled.setHeight(this.height);
|
|
150
|
-
this.imageUsed.cloneAsImage(imageCloned => {
|
|
151
|
-
imageCloned.scaleToWidth(this.width, false);
|
|
152
|
-
imageCloned.scaleToHeight(this.height, false);
|
|
153
|
-
canvasScaled.setBackgroundImage(imageCloned, (img) => {
|
|
154
|
-
if (!img) {
|
|
155
|
-
observer.error(new Error('Impossible to draw the image on the temporary canvas'));
|
|
156
|
-
}
|
|
157
|
-
observer.next(canvasScaled);
|
|
158
|
-
observer.complete();
|
|
159
|
-
}, {
|
|
160
|
-
crossOrigin: 'anonymous',
|
|
161
|
-
originX: 'left',
|
|
162
|
-
originY: 'top'
|
|
163
|
-
});
|
|
164
|
-
});
|
|
165
|
-
}
|
|
166
|
-
else {
|
|
167
|
-
canvasScaled.setBackgroundImage(this.imageUsed, (img) => {
|
|
168
|
-
if (!img) {
|
|
169
|
-
observer.error(new Error('Impossible to draw the image on the temporary canvas'));
|
|
170
|
-
}
|
|
171
|
-
canvasScaled.setWidth(img.width);
|
|
172
|
-
canvasScaled.setHeight(img.height);
|
|
173
|
-
observer.next(canvasScaled);
|
|
174
|
-
observer.complete();
|
|
175
|
-
}, {
|
|
176
|
-
crossOrigin: 'anonymous',
|
|
177
|
-
originX: 'left',
|
|
178
|
-
originY: 'top'
|
|
179
|
-
});
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
else {
|
|
183
|
-
canvasScaled.setWidth(this.width);
|
|
184
|
-
canvasScaled.setHeight(this.height);
|
|
185
|
-
}
|
|
186
|
-
}).pipe(switchMap(() => {
|
|
187
|
-
let process = of(canvasScaled);
|
|
188
|
-
if (this.canvas.getObjects().length > 0) {
|
|
189
|
-
const ratioX = canvasScaled.getWidth() / this.canvas.getWidth();
|
|
190
|
-
const ratioY = canvasScaled.getHeight() / this.canvas.getHeight();
|
|
191
|
-
this.canvas.getObjects().forEach((originalObject, i) => {
|
|
192
|
-
process = process.pipe(switchMap(() => {
|
|
193
|
-
return new Observable(observerObject => {
|
|
194
|
-
originalObject.clone((clonedObject) => {
|
|
195
|
-
clonedObject.set('left', originalObject.left * ratioX);
|
|
196
|
-
clonedObject.set('top', originalObject.top * ratioY);
|
|
197
|
-
clonedObject.scaleToWidth(originalObject.width * ratioX);
|
|
198
|
-
clonedObject.scaleToHeight(originalObject.height * ratioY);
|
|
199
|
-
canvasScaled.insertAt(clonedObject, i, false);
|
|
200
|
-
canvasScaled.renderAll();
|
|
201
|
-
observerObject.next(canvasScaled);
|
|
202
|
-
observerObject.complete();
|
|
203
|
-
});
|
|
204
|
-
});
|
|
205
|
-
}));
|
|
206
|
-
});
|
|
207
|
-
}
|
|
208
|
-
return process;
|
|
209
|
-
})).subscribe(() => {
|
|
210
|
-
canvasScaled.renderAll();
|
|
211
|
-
canvasScaled.getElement().toBlob((data) => {
|
|
212
|
-
this.save.emit(data);
|
|
213
|
-
}, this.outputMimeType, this.outputQuality);
|
|
214
|
-
});
|
|
215
|
-
}
|
|
216
|
-
else {
|
|
217
|
-
this.canvas.getElement().toBlob((data) => {
|
|
218
|
-
this.save.emit(data);
|
|
219
|
-
}, this.outputMimeType, this.outputQuality);
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
doLoadOriginal() {
|
|
223
|
-
this.loadOriginal.emit();
|
|
224
|
-
}
|
|
225
|
-
getTextTranslated(name) {
|
|
226
|
-
let strOk = name.split('.').reduce((o, i) => o[i], this.i18n);
|
|
227
|
-
if (this.i18nUser) {
|
|
228
|
-
try {
|
|
229
|
-
const str = name.split('.').reduce((o, i) => o[i], this.i18nUser);
|
|
230
|
-
if (str) {
|
|
231
|
-
strOk = str;
|
|
232
|
-
}
|
|
233
|
-
}
|
|
234
|
-
catch (e) {
|
|
235
|
-
// if we pass here, ignored
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
if (!strOk) {
|
|
239
|
-
console.error(name + ' translation not found !');
|
|
240
|
-
}
|
|
241
|
-
return strOk;
|
|
242
|
-
}
|
|
243
|
-
getTooltipTranslated(name) {
|
|
244
|
-
if (this.enableTooltip) {
|
|
245
|
-
return this.getTextTranslated(name);
|
|
246
|
-
}
|
|
247
|
-
else {
|
|
248
|
-
return '';
|
|
249
|
-
}
|
|
250
|
-
}
|
|
251
|
-
setUndoRedo() {
|
|
252
|
-
this.canUndo = this.canvas.getObjects().length > 0;
|
|
253
|
-
this.canRedo = this.stack.length > 0;
|
|
254
|
-
// this.canvas.renderAll();
|
|
255
|
-
}
|
|
256
|
-
importPhotoFromFile(event) {
|
|
257
|
-
if (event.target.files && event.target.files.length > 0) {
|
|
258
|
-
const file = event.target.files[0];
|
|
259
|
-
if (file.type.match('image.*')) {
|
|
260
|
-
this.importPhotoFromBlob(file);
|
|
261
|
-
}
|
|
262
|
-
else {
|
|
263
|
-
throw new Error('Not an image !');
|
|
264
|
-
}
|
|
265
|
-
}
|
|
266
|
-
}
|
|
267
|
-
removeImage() {
|
|
268
|
-
if (this.imageUsed) {
|
|
269
|
-
this.imageUsed.dispose();
|
|
270
|
-
this.imageUsed = null;
|
|
271
|
-
}
|
|
272
|
-
this.canvas.backgroundImage = null;
|
|
273
|
-
if (this.width && this.height) {
|
|
274
|
-
this.canvas.setWidth(this.width);
|
|
275
|
-
this.canvas.setHeight(this.height);
|
|
276
|
-
}
|
|
277
|
-
this.canvas.renderAll();
|
|
278
|
-
}
|
|
279
|
-
get hasImage() {
|
|
280
|
-
return !!this.canvas.backgroundImage;
|
|
281
|
-
}
|
|
282
|
-
importPhotoFromSrc(src) {
|
|
283
|
-
this.isLoading = true;
|
|
284
|
-
let isFirstTry = true;
|
|
285
|
-
const imgEl = new Image();
|
|
286
|
-
imgEl.setAttribute('crossOrigin', 'anonymous');
|
|
287
|
-
imgEl.src = src;
|
|
288
|
-
imgEl.onerror = () => {
|
|
289
|
-
// Retry with cors proxy
|
|
290
|
-
if (isFirstTry) {
|
|
291
|
-
imgEl.src = 'https://cors-anywhere.herokuapp.com/' + this.src;
|
|
292
|
-
isFirstTry = false;
|
|
293
|
-
}
|
|
294
|
-
else {
|
|
295
|
-
this.isLoading = false;
|
|
296
|
-
this.hasError = true;
|
|
297
|
-
this.errorMessage = this.getTextTranslated('loadError').replace('%@', this.src);
|
|
298
|
-
}
|
|
299
|
-
};
|
|
300
|
-
imgEl.onload = () => {
|
|
301
|
-
this.isLoading = false;
|
|
302
|
-
this.imageUsed = new fabric.Image(imgEl);
|
|
303
|
-
this.imageUsed.cloneAsImage(image => {
|
|
304
|
-
let width = imgEl.width;
|
|
305
|
-
let height = imgEl.height;
|
|
306
|
-
if (this.width) {
|
|
307
|
-
width = this.width;
|
|
308
|
-
}
|
|
309
|
-
if (this.height) {
|
|
310
|
-
height = this.height;
|
|
311
|
-
}
|
|
312
|
-
image.scaleToWidth(width, false);
|
|
313
|
-
image.scaleToHeight(height, false);
|
|
314
|
-
this.canvas.setBackgroundImage(image, ((img) => {
|
|
315
|
-
if (img) {
|
|
316
|
-
if (this.forceSizeCanvas) {
|
|
317
|
-
this.canvas.setWidth(width);
|
|
318
|
-
this.canvas.setHeight(height);
|
|
319
|
-
}
|
|
320
|
-
else {
|
|
321
|
-
this.canvas.setWidth(image.getScaledWidth());
|
|
322
|
-
this.canvas.setHeight(image.getScaledHeight());
|
|
323
|
-
}
|
|
324
|
-
}
|
|
325
|
-
}), {
|
|
326
|
-
crossOrigin: 'anonymous',
|
|
327
|
-
originX: 'left',
|
|
328
|
-
originY: 'top'
|
|
329
|
-
});
|
|
330
|
-
});
|
|
331
|
-
};
|
|
332
|
-
}
|
|
333
|
-
importPhotoFromBlob(file) {
|
|
334
|
-
const reader = new FileReader();
|
|
335
|
-
reader.readAsDataURL(file);
|
|
336
|
-
reader.onload = (evtReader) => {
|
|
337
|
-
if (evtReader.target.readyState == FileReader.DONE) {
|
|
338
|
-
this.importPhotoFromSrc(evtReader.target.result);
|
|
339
|
-
}
|
|
340
|
-
};
|
|
341
|
-
}
|
|
342
|
-
importPhotoFromUrl() {
|
|
343
|
-
const url = prompt(this.getTooltipTranslated('loadImageUrl'));
|
|
344
|
-
if (url) {
|
|
345
|
-
this.importPhotoFromSrc(url);
|
|
346
|
-
}
|
|
347
|
-
}
|
|
348
|
-
close() {
|
|
349
|
-
this.closeDialog.emit();
|
|
350
|
-
}
|
|
351
|
-
}
|
|
352
|
-
TmwImageDrawerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TmwImageDrawerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
353
|
-
TmwImageDrawerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", 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"] }] });
|
|
354
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TmwImageDrawerComponent, decorators: [{
|
|
355
|
-
type: Component,
|
|
356
|
-
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"] }]
|
|
357
|
-
}], ctorParameters: function () { return []; }, propDecorators: { closeDialog: [{
|
|
358
|
-
type: Output
|
|
359
|
-
}], src: [{
|
|
360
|
-
type: Input
|
|
361
|
-
}], width: [{
|
|
362
|
-
type: Input
|
|
363
|
-
}], height: [{
|
|
364
|
-
type: Input
|
|
365
|
-
}], forceSizeCanvas: [{
|
|
366
|
-
type: Input
|
|
367
|
-
}], forceSizeExport: [{
|
|
368
|
-
type: Input
|
|
369
|
-
}], enableRemoveImage: [{
|
|
370
|
-
type: Input
|
|
371
|
-
}], enableLoadAnotherImage: [{
|
|
372
|
-
type: Input
|
|
373
|
-
}], enableTooltip: [{
|
|
374
|
-
type: Input
|
|
375
|
-
}], showCancelButton: [{
|
|
376
|
-
type: Input
|
|
377
|
-
}], inConfig: [{
|
|
378
|
-
type: Input
|
|
379
|
-
}], i18nUser: [{
|
|
380
|
-
type: Input,
|
|
381
|
-
args: ['i18n']
|
|
382
|
-
}], locale: [{
|
|
383
|
-
type: Input
|
|
384
|
-
}], loadingTemplate: [{
|
|
385
|
-
type: Input
|
|
386
|
-
}], errorTemplate: [{
|
|
387
|
-
type: Input
|
|
388
|
-
}], outputMimeType: [{
|
|
389
|
-
type: Input
|
|
390
|
-
}], outputQuality: [{
|
|
391
|
-
type: Input
|
|
392
|
-
}], borderCss: [{
|
|
393
|
-
type: Input
|
|
394
|
-
}], drawingSizes: [{
|
|
395
|
-
type: Input
|
|
396
|
-
}], colors: [{
|
|
397
|
-
type: Input
|
|
398
|
-
}], save: [{
|
|
399
|
-
type: Output
|
|
400
|
-
}], loadOriginal: [{
|
|
401
|
-
type: Output
|
|
402
|
-
}] } });
|
|
403
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG13LWltYWdlLWRyYXdlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lcXAtZHluYW1pYy1tb2R1bGUvc3JjL2xpYi9jb21wb25lbnRzL3ByaXZhdGUvdG13LWltYWdlLWRyYXdlci90bXctaW1hZ2UtZHJhd2VyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VxcC1keW5hbWljLW1vZHVsZS9zcmMvbGliL2NvbXBvbmVudHMvcHJpdmF0ZS90bXctaW1hZ2UtZHJhd2VyL3Rtdy1pbWFnZS1kcmF3ZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFpQixTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBcUIsTUFBTSxFQUE4QixNQUFNLGVBQWUsQ0FBQztBQUNySSxPQUFPLEVBQUUsTUFBTSxFQUFpQixhQUFhLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDOUQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUNoQyxPQUFPLEVBQUUsVUFBVSxFQUFFLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN0QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7QUFPM0MsTUFBTSxPQUFPLHVCQUF1QjtJQXNFbEM7UUFwRVUsZ0JBQVcsR0FBdUIsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQU1yRCxvQkFBZSxHQUFHLElBQUksQ0FBQztRQUN2QixvQkFBZSxHQUFHLEtBQUssQ0FBQztRQUN4QixzQkFBaUIsR0FBRyxLQUFLLENBQUM7UUFDMUIsMkJBQXNCLEdBQUcsS0FBSyxDQUFDO1FBQy9CLGtCQUFhLEdBQUcsS0FBSyxDQUFDO1FBQ3RCLHFCQUFnQixHQUFHLElBQUksQ0FBQztRQUV4QixhQUFRLEdBQWEsS0FBSyxDQUFDO1FBSTNCLFdBQU0sR0FBVyxJQUFJLENB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QXBCLE1BQU07Z0JBQ1UsWUFBWTtzQkFBNUIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0luaXQsIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25DaGFuZ2VzLCBPbkluaXQsIE91dHB1dCwgU2ltcGxlQ2hhbmdlcywgVGVtcGxhdGVSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgSTE4bkVuLCBJMThuSW50ZXJmYWNlLCBpMThuTGFuZ3VhZ2VzIH0gZnJvbSAnLi9pMThuJztcclxuaW1wb3J0IHsgZmFicmljIH0gZnJvbSAnZmFicmljJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgc3dpdGNoTWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICd0bXctaW1hZ2UtZHJhd2VyJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vdG13LWltYWdlLWRyYXdlci5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vdG13LWltYWdlLWRyYXdlci5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBUbXdJbWFnZURyYXdlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzIHtcclxuXHJcbiAgQE91dHB1dCgpIGNsb3NlRGlhbG9nOiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcblxyXG4gIEBJbnB1dCgpIHB1YmxpYyBzcmM/OiBzdHJpbmc7XHJcbiAgQElucHV0KCkgcHVibGljIHdpZHRoPzogbnVtYmVyO1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBoZWlnaHQ/OiBudW1iZXI7XHJcblxyXG4gIEBJbnB1dCgpIHB1YmxpYyBmb3JjZVNpemVDYW52YXMgPSB0cnVlO1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBmb3JjZVNpemVFeHBvcnQgPSBmYWxzZTtcclxuICBASW5wdXQoKSBwdWJsaWMgZW5hYmxlUmVtb3ZlSW1hZ2UgPSBmYWxzZTtcclxuICBASW5wdXQoKSBwdWJsaWMgZW5hYmxlTG9hZEFub3RoZXJJbWFnZSA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBlbmFibGVUb29sdGlwID0gZmFsc2U7XHJcbiAgQElucHV0KCkgcHVibGljIHNob3dDYW5jZWxCdXR0b24gPSB0cnVlO1xyXG5cclxuICBASW5wdXQoKSBwdWJsaWMgaW5Db25maWc/OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8vIEB0cy1pZ25vcmVcclxuICBASW5wdXQoJ2kxOG4nKSBwdWJsaWMgaTE4blVzZXI6IEkxOG5JbnRlcmZhY2U7XHJcbiAgQElucHV0KCkgcHVibGljIGxvY2FsZTogc3RyaW5nID0gJ2VuJztcclxuXHJcbiAgQElucHV0KCkgcHVibGljIGxvYWRpbmdUZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgQElucHV0KCkgcHVibGljIGVycm9yVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG5cclxuICBASW5wdXQoKSBwdWJsaWMgb3V0cHV0TWltZVR5cGUgPSAnaW1hZ2UvanBlZyc7XHJcbiAgQElucHV0KCkgcHVibGljIG91dHB1dFF1YWxpdHkgPSAwLjg7XHJcblxyXG4gIEBJbnB1dCgpIHB1YmxpYyBib3JkZXJDc3M6IHN0cmluZyA9ICdub25lJztcclxuXHJcbiAgQElucHV0KCkgcHVibGljIGRyYXdpbmdTaXplczogeyBbbmFtZTogc3RyaW5nXTogbnVtYmVyIH0gPSB7XHJcbiAgICBzbWFsbDogNSxcclxuICAgIG1lZGl1bTogMTAsXHJcbiAgICBsYXJnZTogMjUsXHJcbiAgfTtcclxuXHJcbiAgQElucHV0KCkgcHVibGljIGNvbG9yczogeyBbbmFtZTogc3RyaW5nXTogc3RyaW5nIH0gPSB7XHJcbiAgICBibGFjazogJyMwMDAnLFxyXG4gICAgd2hpdGU6ICcjZmZmJyxcclxuICAgIHllbGxvdzogJyNmZmViM2InLFxyXG4gICAgcmVkOiAnI2Y0NDMzNicsXHJcbiAgICBibHVlOiAnIzIxOTZmMycsXHJcbiAgICBncmVlbjogJyM0Y2FmNTAnLFxyXG4gICAgcHVycGxlOiAnIzdhMDhhZicsXHJcbiAgfTtcclxuXHJcbiAgQE91dHB1dCgpIHB1YmxpYyBzYXZlOiBFdmVudEVtaXR0ZXI8QmxvYj4gPSBuZXcgRXZlbnRFbWl0dGVyPEJsb2I+KCk7XHJcbiAgQE91dHB1dCgpIHB1YmxpYyBsb2FkT3JpZ2luYWw6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuXHJcbiAgcHVibGljIGN1cnJlbnRUb29sID0gJ2JydXNoJztcclxuICBwdWJsaWMgY3VycmVudFNpemUgPSAnbWVkaXVtJztcclxuICBwdWJsaWMgY3VycmVudENvbG9yID0gJ2JsYWNrJztcclxuICBwdWJsaWMgaTE4bjogSTE4bkludGVyZmFjZSA9IEkxOG5FbjtcclxuXHJcbiAgcHVibGljIGNhblVuZG8gPSBmYWxzZTtcclxuICBwdWJsaWMgY2FuUmVkbyA9IGZhbHNlO1xyXG5cclxuICBwdWJsaWMgaXNMb2FkaW5nID0gdHJ1ZTtcclxuICBwdWJsaWMgaGFzRXJyb3IgPSBmYWxzZTtcclxuICBwdWJsaWMgZXJyb3JNZXNzYWdlID0gJyc7XHJcblxyXG4gIHByaXZhdGUgY2FudmFzOiBmYWJyaWMuQ2FudmFzO1xyXG4gIHByaXZhdGUgc3RhY2s6IGZhYnJpYy5PYmplY3RbXSA9IFtdO1xyXG5cclxuICBwdWJsaWMgY29sb3JzTmFtZTogc3RyaW5nW10gPSBbXTtcclxuICBwdWJsaWMgZHJhd2luZ1NpemVzTmFtZTogc3RyaW5nW10gPSBbXTtcclxuXHJcbiAgcHJpdmF0ZSBpbWFnZVVzZWQ/OiBmYWJyaWMuSW1hZ2U7XHJcblxyXG4gIGNvbXBvbmVudEd1aWQ6IHN0cmluZztcclxuXHJcbiAgY29uc3RydWN0b3IoKSB7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmNvbXBvbmVudEd1aWQgPSAneHh4eC14eHh4LXh4eHgteHh4eCcucmVwbGFjZSgvW3h5XS9nLCBmdW5jdGlvbiAoYykge1xyXG4gICAgICB2YXIgciA9IE1hdGgucmFuZG9tKCkgKiAxNiB8IDAsXHJcbiAgICAgICAgdiA9IGMgPT0gJ3gnID8gciA6IChyICYgMHgzIHwgMHg4KTtcclxuICAgICAgcmV0dXJuIHYudG9TdHJpbmcoMTYpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZVxyXG4gICAgdGhpcy5jb2xvcnNOYW1lID0gT2JqZWN0LmtleXModGhpcy5jb2xvcnMpO1xyXG4gICAgdGhpcy5kcmF3aW5nU2l6ZXNOYW1lID0gT2JqZWN0LmtleXModGhpcy5kcmF3aW5nU2l6ZXMpO1xyXG5cclxuICAgIGNvbnN0IGNhbnZhc1NjYWxlZEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmNvbXBvbmVudEd1aWQpO1xyXG4gICAgdGhpcy5jYW52YXMgPSBuZXcgZmFicmljLkNhbnZhcyhjYW52YXNTY2FsZWRFbGVtZW50LCB7XHJcbiAgICAgIGhvdmVyQ3Vyc29yOiAncG9pbnRlcicsXHJcbiAgICAgIGlzRHJhd2luZ01vZGU6IHRydWUsXHJcbiAgICB9KTtcclxuICAgIHRoaXMuY2FudmFzLmJhY2tncm91bmRDb2xvciA9ICd3aGl0ZSc7XHJcblxyXG4gICAgaWYgKHRoaXMuc3JjKSB7XHJcbiAgICAgIHRoaXMuaW1wb3J0UGhvdG9Gcm9tU3JjKHRoaXMuc3JjKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmICghdGhpcy53aWR0aCB8fCAhdGhpcy5oZWlnaHQpIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHdpZHRoIG9yIGhpZ2h0IGdpdmVuICEnKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5jYW52YXMuc2V0V2lkdGgodGhpcy53aWR0aCk7XHJcbiAgICAgIHRoaXMuY2FudmFzLnNldEhlaWdodCh0aGlzLmhlaWdodCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jYW52YXMub24oJ3BhdGg6Y3JlYXRlZCcsICgpID0+IHtcclxuICAgICAgdGhpcy5zdGFjayA9IFtdO1xyXG4gICAgICB0aGlzLnNldFVuZG9SZWRvKCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLnNlbGVjdFRvb2wodGhpcy5jdXJyZW50VG9vbCk7XHJcbiAgICB0aGlzLnNlbGVjdENvbG9yKHRoaXMuY3VycmVudENvbG9yKTtcclxuICAgIHRoaXMuc2VsZWN0RHJhd2luZ1NpemUodGhpcy5jdXJyZW50U2l6ZSk7XHJcblxyXG4gICAgaWYgKHRoaXMubG9jYWxlICYmIGkxOG5MYW5ndWFnZXNbdGhpcy5sb2NhbGUudG9Mb3dlckNhc2UoKV0pIHtcclxuICAgICAgdGhpcy5pMThuID0gaTE4bkxhbmd1YWdlc1t0aGlzLmxvY2FsZS50b0xvd2VyQ2FzZSgpXTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgIGlmIChjaGFuZ2VzLnNyYyAmJiAhY2hhbmdlcy5zcmMuZmlyc3RDaGFuZ2UgJiYgY2hhbmdlcy5zcmMuY3VycmVudFZhbHVlKSB7XHJcbiAgICAgIGlmICh0eXBlb2YgY2hhbmdlcy5zcmMuY3VycmVudFZhbHVlID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgIHRoaXMuaW1wb3J0UGhvdG9Gcm9tU3JjKGNoYW5nZXMuc3JjLmN1cnJlbnRWYWx1ZSk7XHJcbiAgICAgIH0gZWxzZSBpZiAoY2hhbmdlcy5zcmMuY3VycmVudFZhbHVlIGluc3RhbmNlb2YgQmxvYikge1xyXG4gICAgICAgIHRoaXMuaW1wb3J0UGhvdG9Gcm9tQmxvYihjaGFuZ2VzLnNyYy5jdXJyZW50VmFsdWUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBUb29sc1xyXG4gIHB1YmxpYyBzZWxlY3RUb29sKHRvb2w6IHN0cmluZykge1xyXG4gICAgdGhpcy5jdXJyZW50VG9vbCA9IHRvb2w7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2VsZWN0RHJhd2luZ1NpemUoc2l6ZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLmN1cnJlbnRTaXplID0gc2l6ZTtcclxuICAgIGlmICh0aGlzLmNhbnZhcykge1xyXG4gICAgICB0aGlzLmNhbnZhcy5mcmVlRHJhd2luZ0JydXNoLndpZHRoID0gdGhpcy5kcmF3aW5nU2l6ZXNbc2l6ZV07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2VsZWN0Q29sb3IoY29sb3I6IHN0cmluZykge1xyXG4gICAgdGhpcy5jdXJyZW50Q29sb3IgPSBjb2xvcjtcclxuICAgIGlmICh0aGlzLmNhbnZhcykge1xyXG4gICAgICB0aGlzLmNhbnZhcy5mcmVlRHJhd2luZ0JydXNoLmNvbG9yID0gdGhpcy5jb2xvcnNbY29sb3JdO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gQWN0aW9uc1xyXG4gIHB1YmxpYyB1bmRvKCkge1xyXG4gICAgaWYgKHRoaXMuY2FuVW5kbykge1xyXG4gICAgICBjb25zdCBsYXN0SWQgPSB0aGlzLmNhbnZhcy5nZXRPYmplY3RzKCkubGVuZ3RoIC0gMTtcclxuICAgICAgY29uc3QgbGFzdE9iaiA9IHRoaXMuY2FudmFzLmdldE9iamVjdHMoKVtsYXN0SWRdO1xyXG4gICAgICB0aGlzLnN0YWNrLnB1c2gobGFzdE9iaik7XHJcbiAgICAgIHRoaXMuY2FudmFzLnJlbW92ZShsYXN0T2JqKTtcclxuICAgICAgdGhpcy5zZXRVbmRvUmVkbygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlZG8oKSB7XHJcbiAgICBpZiAodGhpcy5jYW5SZWRvKSB7XHJcbiAgICAgIGNvbnN0IGZpcnN0SW5TdGFjayA9IHRoaXMuc3RhY2suc3BsaWNlKC0xLCAxKVswXTtcclxuICAgICAgaWYgKGZpcnN0SW5TdGFjaykge1xyXG4gICAgICAgIHRoaXMuY2FudmFzLmluc2VydEF0KGZpcnN0SW5TdGFjaywgdGhpcy5jYW52YXMuZ2V0T2JqZWN0cygpLmxlbmd0aCAtIDEsIGZhbHNlKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnNldFVuZG9SZWRvKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2xlYXJDYW52YXMoKSB7XHJcbiAgICBpZiAodGhpcy5jYW52YXMpIHtcclxuICAgICAgdGhpcy5jYW52YXMucmVtb3ZlKC4uLnRoaXMuY2FudmFzLmdldE9iamVjdHMoKSk7XHJcbiAgICAgIHRoaXMuc2V0VW5kb1JlZG8oKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBzYXZlSW1hZ2UoKSB7XHJcbiAgICBpZiAoIXRoaXMuZm9yY2VTaXplRXhwb3J0IHx8ICh0aGlzLmZvcmNlU2l6ZUV4cG9ydCAmJiB0aGlzLndpZHRoICYmIHRoaXMuaGVpZ2h0KSkge1xyXG4gICAgICBjb25zdCBjYW52YXNTY2FsZWRFbGVtZW50OiBIVE1MQ2FudmFzRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xyXG4gICAgICBjb25zdCBjYW52YXNTY2FsZWQgPSBuZXcgZmFicmljLkNhbnZhcyhjYW52YXNTY2FsZWRFbGVtZW50KTtcclxuICAgICAgY2FudmFzU2NhbGVkLmJhY2tncm91bmRDb2xvciA9ICd3aGl0ZSc7XHJcblxyXG4gICAgICBuZXcgT2JzZXJ2YWJsZTxmYWJyaWMuQ2FudmFzPihvYnNlcnZlciA9PiB7XHJcbiAgICAgICAgaWYgKHRoaXMuaW1hZ2VVc2VkKSB7XHJcbiAgICAgICAgICBpZiAodGhpcy5mb3JjZVNpemVFeHBvcnQpIHtcclxuICAgICAgICAgICAgY2FudmFzU2NhbGVkLnNldFdpZHRoKHRoaXMud2lkdGgpO1xyXG4gICAgICAgICAgICBjYW52YXNTY2FsZWQuc2V0SGVpZ2h0KHRoaXMuaGVpZ2h0KTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuaW1hZ2VVc2VkLmNsb25lQXNJbWFnZShpbWFnZUNsb25lZCA9PiB7XHJcbiAgICAgICAgICAgICAgaW1hZ2VDbG9uZWQuc2NhbGVUb1dpZHRoKHRoaXMud2lkdGgsIGZhbHNlKTtcclxuICAgICAgICAgICAgICBpbWFnZUNsb25lZC5zY2FsZVRvSGVpZ2h0KHRoaXMuaGVpZ2h0LCBmYWxzZSk7XHJcblxyXG4gICAgICAgICAgICAgIGNhbnZhc1NjYWxlZC5zZXRCYWNrZ3JvdW5kSW1hZ2UoaW1hZ2VDbG9uZWQsIChpbWc6IEhUTUxJbWFnZUVsZW1lbnQpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICghaW1nKSB7XHJcbiAgICAgICAgICAgICAgICAgIG9ic2VydmVyLmVycm9yKG5ldyBFcnJvcignSW1wb3NzaWJsZSB0byBkcmF3IHRoZSBpbWFnZSBvbiB0aGUgdGVtcG9yYXJ5IGNhbnZhcycpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBvYnNlcnZlci5uZXh0KGNhbnZhc1NjYWxlZCk7XHJcbiAgICAgICAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xyXG4gICAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICAgIGNyb3NzT3JpZ2luOiAnYW5vbnltb3VzJyxcclxuICAgICAgICAgICAgICAgIG9yaWdpblg6ICdsZWZ0JyxcclxuICAgICAgICAgICAgICAgIG9yaWdpblk6ICd0b3AnXHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY2FudmFzU2NhbGVkLnNldEJhY2tncm91bmRJbWFnZSh0aGlzLmltYWdlVXNlZCwgKGltZzogSFRNTEltYWdlRWxlbWVudCkgPT4ge1xyXG4gICAgICAgICAgICAgIGlmICghaW1nKSB7XHJcbiAgICAgICAgICAgICAgICBvYnNlcnZlci5lcnJvcihuZXcgRXJyb3IoJ0ltcG9zc2libGUgdG8gZHJhdyB0aGUgaW1hZ2Ugb24gdGhlIHRlbXBvcmFyeSBjYW52YXMnKSk7XHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICBjYW52YXNTY2FsZWQuc2V0V2lkdGgoaW1nLndpZHRoKTtcclxuICAgICAgICAgICAgICBjYW52YXNTY2FsZWQuc2V0SGVpZ2h0KGltZy5oZWlnaHQpO1xyXG5cclxuICAgICAgICAgICAgICBvYnNlcnZlci5uZXh0KGNhbnZhc1NjYWxlZCk7XHJcbiAgICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcclxuICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgIGNyb3NzT3JpZ2luOiAnYW5vbnltb3VzJyxcclxuICAgICAgICAgICAgICBvcmlnaW5YOiAnbGVmdCcsXHJcbiAgICAgICAgICAgICAgb3JpZ2luWTogJ3RvcCdcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGNhbnZhc1NjYWxlZC5zZXRXaWR0aCh0aGlzLndpZHRoKTtcclxuICAgICAgICAgIGNhbnZhc1NjYWxlZC5zZXRIZWlnaHQodGhpcy5oZWlnaHQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSkucGlwZShcclxuICAgICAgICBzd2l0Y2hNYXAoKCkgPT4ge1xyXG4gICAgICAgICAgbGV0IHByb2Nlc3MgPSBvZihjYW52YXNTY2FsZWQpO1xyXG5cclxuICAgICAgICAgIGlmICh0aGlzLmNhbnZhcy5nZXRPYmplY3RzKCkubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBjb25zdCByYXRpb1ggPSBjYW52YXNTY2FsZWQuZ2V0V2lkdGgoKSAvIHRoaXMuY2FudmFzLmdldFdpZHRoKCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHJhdGlvWSA9IGNhbnZhc1NjYWxlZC5nZXRIZWlnaHQoKSAvIHRoaXMuY2FudmFzLmdldEhlaWdodCgpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5jYW52YXMuZ2V0T2JqZWN0cygpLmZvckVhY2goKG9yaWdpbmFsT2JqZWN0OiBmYWJyaWMuT2JqZWN0LCBpOiBudW1iZXIpID0+IHtcclxuICAgICAgICAgICAgICBwcm9jZXNzID0gcHJvY2Vzcy5waXBlKHN3aXRjaE1hcCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE9ic2VydmFibGU8ZmFicmljLkNhbnZhcz4ob2JzZXJ2ZXJPYmplY3QgPT4ge1xyXG4gICAgICAgICAgICAgICAgICBvcmlnaW5hbE9iamVjdC5jbG9uZSgoY2xvbmVkT2JqZWN0OiBmYWJyaWMuT2JqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2xvbmVkT2JqZWN0LnNldCgnbGVmdCcsIG9yaWdpbmFsT2JqZWN0LmxlZnQgKiByYXRpb1gpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNsb25lZE9iamVjdC5zZXQoJ3RvcCcsIG9yaWdpbmFsT2JqZWN0LnRvcCAqIHJhdGlvWSk7XHJcbiAgICAgICAgICAgICAgICAgICAgY2xvbmVkT2JqZWN0LnNjYWxlVG9XaWR0aChvcmlnaW5hbE9iamVjdC53aWR0aCAqIHJhdGlvWCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY2xvbmVkT2JqZWN0LnNjYWxlVG9IZWlnaHQob3JpZ2luYWxPYmplY3QuaGVpZ2h0ICogcmF0aW9ZKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY2FudmFzU2NhbGVkLmluc2VydEF0KGNsb25lZE9iamVjdCwgaSwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhbnZhc1NjYWxlZC5yZW5kZXJBbGwoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXJPYmplY3QubmV4dChjYW52YXNTY2FsZWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIG9ic2VydmVyT2JqZWN0LmNvbXBsZXRlKCk7XHJcbiAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiBwcm9jZXNzO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICApLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgY2FudmFzU2NhbGVkLnJlbmRlckFsbCgpO1xyXG4gICAgICAgIGNhbnZhc1NjYWxlZC5nZXRFbGVtZW50KCkudG9CbG9iKFxyXG4gICAgICAgICAgKGRhdGE6IEJsb2IpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5zYXZlLmVtaXQoZGF0YSk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgdGhpcy5vdXRwdXRNaW1lVHlwZSxcclxuICAgICAgICAgIHRoaXMub3V0cHV0UXVhbGl0eVxyXG4gICAgICAgICk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5jYW52YXMuZ2V0RWxlbWVudCgpLnRvQmxvYihcclxuICAgICAgICAoZGF0YTogQmxvYikgPT4ge1xyXG4gICAgICAgICAgdGhpcy5zYXZlLmVtaXQoZGF0YSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICB0aGlzLm91dHB1dE1pbWVUeXBlLFxyXG4gICAgICAgIHRoaXMub3V0cHV0UXVhbGl0eVxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGRvTG9hZE9yaWdpbmFsKCkge1xyXG4gICAgdGhpcy5sb2FkT3JpZ2luYWwuZW1pdCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldFRleHRUcmFuc2xhdGVkKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBsZXQgc3RyT2sgPSBuYW1lLnNwbGl0KCcuJykucmVkdWNlKChvLCBpKSA9PiBvW2ldLCB0aGlzLmkxOG4gYXMgYW55KTtcclxuXHJcbiAgICBpZiAodGhpcy5pMThuVXNlcikge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IHN0ciA9IG5hbWUuc3BsaXQoJy4nKS5yZWR1Y2UoKG8sIGkpID0+IG9baV0sIHRoaXMuaTE4blVzZXIgYXMgYW55KTtcclxuICAgICAgICBpZiAoc3RyKSB7XHJcbiAgICAgICAgICBzdHJPayA9IHN0cjtcclxuICAgICAgICB9XHJcbiAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAvLyBpZiB3ZSBwYXNzIGhlcmUsIGlnbm9yZWRcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICghc3RyT2spIHtcclxuICAgICAgY29uc29sZS5lcnJvcihuYW1lICsgJyB0cmFuc2xhdGlvbiBub3QgZm91bmQgIScpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBzdHJPaztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRUb29sdGlwVHJhbnNsYXRlZChuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgaWYgKHRoaXMuZW5hYmxlVG9vbHRpcCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5nZXRUZXh0VHJhbnNsYXRlZChuYW1lKVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuICcnO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRVbmRvUmVkbygpIHtcclxuICAgIHRoaXMuY2FuVW5kbyA9IHRoaXMuY2FudmFzLmdldE9iamVjdHMoKS5sZW5ndGggPiAwO1xyXG4gICAgdGhpcy5jYW5SZWRvID0gdGhpcy5zdGFjay5sZW5ndGggPiAwO1xyXG4gICAgLy8gdGhpcy5jYW52YXMucmVuZGVyQWxsKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaW1wb3J0UGhvdG9Gcm9tRmlsZShldmVudDogRXZlbnQgfCBhbnkpIHtcclxuICAgIGlmIChldmVudC50YXJnZXQuZmlsZXMgJiYgZXZlbnQudGFyZ2V0LmZpbGVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgY29uc3QgZmlsZSA9IGV2ZW50LnRhcmdldC5maWxlc1swXTtcclxuICAgICAgaWYgKGZpbGUudHlwZS5tYXRjaCgnaW1hZ2UuKicpKSB7XHJcbiAgICAgICAgdGhpcy5pbXBvcnRQaG90b0Zyb21CbG9iKGZpbGUpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTm90IGFuIGltYWdlICEnKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlbW92ZUltYWdlKCkge1xyXG4gICAgaWYgKHRoaXMuaW1hZ2VVc2VkKSB7XHJcbiAgICAgIHRoaXMuaW1hZ2VVc2VkLmRpc3Bvc2UoKTtcclxuICAgICAgdGhpcy5pbWFnZVVzZWQgPSBudWxsO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jYW52YXMuYmFja2dyb3VuZEltYWdlID0gbnVsbDtcclxuXHJcbiAgICBpZiAodGhpcy53aWR0aCAmJiB0aGlzLmhlaWdodCkge1xyXG4gICAgICB0aGlzLmNhbnZhcy5zZXRXaWR0aCh0aGlzLndpZHRoKTtcclxuICAgICAgdGhpcy5jYW52YXMuc2V0SGVpZ2h0KHRoaXMuaGVpZ2h0KTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmNhbnZhcy5yZW5kZXJBbGwoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgaGFzSW1hZ2UoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gISF0aGlzLmNhbnZhcy5iYWNrZ3JvdW5kSW1hZ2U7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGltcG9ydFBob3RvRnJvbVNyYyhzcmM6IHN0cmluZykge1xyXG4gICAgdGhpcy5pc0xvYWRpbmcgPSB0cnVlO1xyXG4gICAgbGV0IGlzRmlyc3RUcnkgPSB0cnVlO1xyXG4gICAgY29uc3QgaW1nRWwgPSBuZXcgSW1hZ2UoKTtcclxuICAgIGltZ0VsLnNldEF0dHJpYnV0ZSgnY3Jvc3NPcmlnaW4nLCAnYW5vbnltb3VzJyk7XHJcbiAgICBpbWdFbC5zcmMgPSBzcmM7XHJcbiAgICBpbWdFbC5vbmVycm9yID0gKCkgPT4ge1xyXG4gICAgICAvLyBSZXRyeSB3aXRoIGNvcnMgcHJveHlcclxuICAgICAgaWYgKGlzRmlyc3RUcnkpIHtcclxuICAgICAgICBpbWdFbC5zcmMgPSAnaHR0cHM6Ly9jb3JzLWFueXdoZXJlLmhlcm9rdWFwcC5jb20vJyArIHRoaXMuc3JjO1xyXG4gICAgICAgIGlzRmlyc3RUcnkgPSBmYWxzZTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuaGFzRXJyb3IgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gdGhpcy5nZXRUZXh0VHJhbnNsYXRlZCgnbG9hZEVycm9yJykucmVwbGFjZSgnJUAnLCB0aGlzLnNyYyBhcyBzdHJpbmcpO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gICAgaW1nRWwub25sb2FkID0gKCkgPT4ge1xyXG4gICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICB0aGlzLmltYWdlVXNlZCA9IG5ldyBmYWJyaWMuSW1hZ2UoaW1nRWwpO1xyXG5cclxuICAgICAgdGhpcy5pbWFnZVVzZWQuY2xvbmVBc0ltYWdlKGltYWdlID0+IHtcclxuICAgICAgICBsZXQgd2lkdGggPSBpbWdFbC53aWR0aDtcclxuICAgICAgICBsZXQgaGVpZ2h0ID0gaW1nRWwuaGVpZ2h0O1xyXG5cclxuICAgICAgICBpZiAodGhpcy53aWR0aCkge1xyXG4gICAgICAgICAgd2lkdGggPSB0aGlzLndpZHRoO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5oZWlnaHQpIHtcclxuICAgICAgICAgIGhlaWdodCA9IHRoaXMuaGVpZ2h0O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaW1hZ2Uuc2NhbGVUb1dpZHRoKHdpZHRoLCBmYWxzZSk7XHJcbiAgICAgICAgaW1hZ2Uuc2NhbGVUb0hlaWdodChoZWlnaHQsIGZhbHNlKTtcclxuXHJcbiAgICAgICAgdGhpcy5jYW52YXMuc2V0QmFja2dyb3VuZEltYWdlKGltYWdlLCAoKGltZzogSFRNTEltYWdlRWxlbWVudCkgPT4ge1xyXG4gICAgICAgICAgaWYgKGltZykge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5mb3JjZVNpemVDYW52YXMpIHtcclxuICAgICAgICAgICAgICB0aGlzLmNhbnZhcy5zZXRXaWR0aCh3aWR0aCk7XHJcbiAgICAgICAgICAgICAgdGhpcy5jYW52YXMuc2V0SGVpZ2h0KGhlaWdodCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5jYW52YXMuc2V0V2lkdGgoaW1hZ2UuZ2V0U2NhbGVkV2lkdGgoKSk7XHJcbiAgICAgICAgICAgICAgdGhpcy5jYW52YXMuc2V0SGVpZ2h0KGltYWdlLmdldFNjYWxlZEhlaWdodCgpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pLCB7XHJcbiAgICAgICAgICBjcm9zc09yaWdpbjogJ2Fub255bW91cycsXHJcbiAgICAgICAgICBvcmlnaW5YOiAnbGVmdCcsXHJcbiAgICAgICAgICBvcmlnaW5ZOiAndG9wJ1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGltcG9ydFBob3RvRnJvbUJsb2IoZmlsZTogQmxvYiB8IEZpbGUpIHtcclxuICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcbiAgICByZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlKTtcclxuICAgIHJlYWRlci5vbmxvYWQgPSAoZXZ0UmVhZGVyOiBhbnkpID0+IHtcclxuICAgICAgaWYgKGV2dFJlYWRlci50YXJnZXQucmVhZHlTdGF0ZSA9PSBGaWxlUmVhZGVyLkRPTkUpIHtcclxuICAgICAgICB0aGlzLmltcG9ydFBob3RvRnJvbVNyYyhldnRSZWFkZXIudGFyZ2V0LnJlc3VsdCk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaW1wb3J0UGhvdG9Gcm9tVXJsKCkge1xyXG4gICAgY29uc3QgdXJsID0gcHJvbXB0KHRoaXMuZ2V0VG9vbHRpcFRyYW5zbGF0ZWQoJ2xvYWRJbWFnZVVybCcpKTtcclxuICAgIGlmICh1cmwpIHtcclxuICAgICAgdGhpcy5pbXBvcnRQaG90b0Zyb21TcmModXJsKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBjbG9zZSgpe1xyXG4gICAgdGhpcy5jbG9zZURpYWxvZy5lbWl0KCk7XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJsb2FkaW5nXCIgKm5nSWY9XCJpc0xvYWRpbmcgJiYgbG9hZGluZ1RlbXBsYXRlXCI+XHJcbiAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImxvYWRpbmdUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxyXG48L2Rpdj5cclxuPGRpdiBjbGFzcz1cImVycm9yXCIgKm5nSWY9XCJoYXNFcnJvclwiPlxyXG4gIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJlcnJvclRlbXBsYXRlID8gZXJyb3JUZW1wbGF0ZSA6IGRlZmF1bHRFcnJvclwiPjwvbmctY29udGFpbmVyPlxyXG48L2Rpdj5cclxuXHJcbjwhLS0gPG5nLXRlbXBsYXRlICNkZWZhdWx0TG9hZGluZz5cclxuICAgIDxwPnt7IGdldFRleHRUcmFuc2xhdGVkKCdsb2FkaW5nJykgfX08L3A+XHJcbjwvbmctdGVtcGxhdGU+IC0tPlxyXG48bmctdGVtcGxhdGUgI2RlZmF1bHRFcnJvcj5cclxuICA8cD57eyBlcnJvck1lc3NhZ2UgfX08L3A+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48ZGl2IGNsYXNzPVwidG9vbGJhclwiICpuZ0lmPVwiIWlzTG9hZGluZ1wiPlxyXG4gIDxkaXYgY2xhc3M9XCJ0b29sc1wiPlxyXG5cclxuICAgICAgPGRpdiBjbGFzcz1cImJydXNoXCI+XHJcbiAgICAgICAgICA8aSBjbGFzcz1cInRpdGxlXCI+dG9vbHM8L2k+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW50ZXJuYWxcIj5cclxuICAgICAgICAgICAgPGkgY2xhc3M9XCJtYXRlcmlhbC1pY29ucyBidG5cIiBbY2xhc3Muc2VsZWN0ZWRdPVwiY3VycmVudFRvb2wgPT0gJ2JydXNoJ1wiIChjbGljayk9XCJzZWxlY3RUb29sKCdicnVzaCcpXCJcclxuICAgICAgICAgICAgICBbdGl0bGVdPVwiZ2V0VG9vbHRpcFRyYW5zbGF0ZWQoJ3Rvb2xzLmJydXNoJylcIj48bWF0LWljb24+YnJ1c2g8L21hdC1pY29uPjwvaT5cclxuICAgICAgICAgICAgPHNwYW4gKm5nRm9yPVwibGV0IGRyYXdpbmdTaXplTmFtZSBvZiBkcmF3aW5nU2l6ZXNOYW1lXCIgY2xhc3M9XCJzaXplIGJ0biBtci0xXCJcclxuICAgICAgICAgICAgICBbc3R5bGUud2lkdGgucHhdPVwiZHJhd2luZ1NpemVzW2RyYXdpbmdTaXplTmFtZV0gKiAwLjggKyA4XCJcclxuICAgICAgICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cImRyYXdpbmdTaXplc1tkcmF3aW5nU2l6ZU5hbWVdICogMC44ICsgOFwiXHJcbiAgICAgICAgICAgICAgW3N0eWxlLmJvcmRlclJhZGl1cy5weF09XCJkcmF3aW5nU2l6ZXNbZHJhd2luZ1NpemVOYW1lXSAqIDAuNCArIDRcIlxyXG4gICAgICAgICAgICAgIFtjbGFzcy5zZWxlY3RlZF09XCJjdXJyZW50U2l6ZSA9PSBkcmF3aW5nU2l6ZU5hbWVcIiBbdGl0bGVdPVwiZ2V0VG9vbHRpcFRyYW5zbGF0ZWQoJ3NpemVzLicgKyBkcmF3aW5nU2l6ZU5hbWUpXCJcclxuICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0RHJhd2luZ1NpemUoZHJhd2luZ1NpemVOYW1lKVwiPlxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY29tbWFuZHNcIj5cclxuICAgICAgICA8aSBjbGFzcz1cInRpdGxlXCI+b3B0aW9uczwvaT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiaW50ZXJuYWxcIj5cclxuICAgICAgICAgIDxpIGNsYXNzPVwibWF0ZXJpYWwtaWNvbnMgYnRuXCIgW2NsYXNzLmRpc2FibGVkXT1cIiFjYW5VbmRvXCIgKGNsaWNrKT1cInVuZG8oKVwiXHJcbiAgICAgICAgICBbdGl0bGVdPVwiZ2V0VG9vbHRpcFRyYW5zbGF0ZWQoJ3VuZG8nKVwiPjxtYXQtaWNvbj51bmRvPC9tYXQtaWNvbj48L2k+XHJcbiAgICAgICAgICA8aSBjbGFzcz1cIm1hdGVyaWFsLWljb25zIGJ0blwiIFtjbGFzcy5kaXNhYmxlZF09XCIhY2FuUmVkb1wiIChjbGljayk9XCJyZWRvKClcIlxyXG4gICAgICAgICAgICBbdGl0bGVdPVwiZ2V0VG9vbHRpcFRyYW5zbGF0ZWQoJ3JlZG8nKVwiPjxtYXQtaWNvbj5yZWRvPC9tYXQtaWNvbj48L2k+XHJcbiAgICAgICAgICA8aSBjbGFzcz1cIm1hdGVyaWFsLWljb25zIGJ0blwiIChjbGljayk9XCJjbGVhckNhbnZhcygpXCIgW3RpdGxlXT1cImdldFRvb2x0aXBUcmFuc2xhdGVkKCdjbGVhcicpXCI+PG1hdC1pY29uPmNsZWFyPC9tYXQtaWNvbj48L2k+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPGRpdiBjbGFzcz1cImNvbG9yc1wiPlxyXG4gICAgICAgIDxpIGNsYXNzPVwidGl0bGVcIj5jb2xvcnM8L2k+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImludGVybmFsXCI+XHJcbiAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBjb2xvck5hbWUgb2YgY29sb3JzTmFtZVwiIFtjbGFzcy5zZWxlY3RlZF09XCJjdXJyZW50Q29sb3IgPT0gY29sb3JOYW1lXCIgY2xhc3M9XCJjb2xvclwiXHJcbiAgICAgICAgICBbbmdDbGFzc109XCJjb2xvck5hbWVcIiBbc3R5bGUuYmFja2dyb3VuZF09XCJjb2xvcnNbY29sb3JOYW1lXVwiXHJcbiAgICAgICAgICBbdGl0bGVdPVwiZ2V0VG9vbHRpcFRyYW5zbGF0ZWQoJ2NvbG9ycy4nICsgY29sb3JOYW1lKVwiIChjbGljayk9XCJzZWxlY3RDb2xvcihjb2xvck5hbWUpXCI+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9uc1wiPlxyXG4gICAgICAgIDxpIGNsYXNzPVwidGl0bGVcIj5hY3Rpb25zPC9pPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJpbnRlcm5hbFwiPlxyXG4gICAgICAgICAgPGEgaHJlZj1cIiNcIiBjbGFzcz1cImJ0biBidG4tc3VjY2Vzc1wiIChjbGljayk9XCJzYXZlSW1hZ2UoKTsgJGV2ZW50LnByZXZlbnREZWZhdWx0KClcIiAqbmdJZj1cIiFpbkNvbmZpZ1wiPnt7XHJcbiAgICAgICAgICAgIGdldFRleHRUcmFuc2xhdGVkKCdzYXZlQnRuJykgfX08L2E+XHJcbiAgICAgICAgICA8YSBocmVmPVwiI1wiIGNsYXNzPVwiYnRuIGJ0bi13YXJuaW5nXCIgKm5nSWY9XCJzaG93Q2FuY2VsQnV0dG9uICYmICFpbkNvbmZpZ1wiIChjbGljayk9XCJkb0xvYWRPcmlnaW5hbCgpOyAkZXZlbnQucHJldmVudERlZmF1bHQoKVwiPnt7XHJcbiAgICAgICAgICAgIGdldFRleHRUcmFuc2xhdGVkKCdjYW5jZWxCdG4nKSB9fTwvYT5cclxuICAgICAgICAgIDxhIGhyZWY9XCIjXCIgY2xhc3M9XCJidG4gYnRuLWRhbmdlclwiICpuZ0lmPVwic2hvd0NhbmNlbEJ1dHRvblwiIChjbGljayk9XCJjbG9zZSgpOyAkZXZlbnQucHJldmVudERlZmF1bHQoKVwiPnt7XHJcbiAgICAgICAgICAgIGdldFRleHRUcmFuc2xhdGVkKCdjbG9zZURpYWxvZycpIH19PC9hPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICA8L2Rpdj5cclxuXHJcbiAgPCEtLSBBbnkgYWRkaXRpb25hbCB0b29sYmFyIGJ1dHRvbnMgdG8gYmUgcHJvamVjdGVkIGJ5IHRoZSBjb25zdW1pbmcgYXBwIC0tPlxyXG4gIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cclxuPC9kaXY+XHJcblxyXG48ZGl2IFtuZ1N0eWxlXT1cInsgYm9yZGVyOiBib3JkZXJDc3MgfVwiPlxyXG4gIDxjYW52YXMgW2lkXT1cImNvbXBvbmVudEd1aWRcIj48L2NhbnZhcz5cclxuPC9kaXY+Il19
|