@simpleangularcontrols/sac-common 10.0.0-rc.21 → 10.0.0-rc.23
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/README.md +16 -16
- package/bundles/simpleangularcontrols-sac-common.umd.js +12400 -12358
- package/bundles/simpleangularcontrols-sac-common.umd.js.map +1 -1
- package/bundles/simpleangularcontrols-sac-common.umd.min.js +1 -1
- package/bundles/simpleangularcontrols-sac-common.umd.min.js.map +1 -1
- package/common/basedatetimecontrol.d.ts +169 -169
- package/common/basedatetimecontrol.ngfactory.d.ts +1 -1
- package/common/baseinputcontrol.d.ts +38 -38
- package/common/baseinputcontrol.ngfactory.d.ts +1 -1
- package/common/baselistcontrol.d.ts +43 -43
- package/common/baselistcontrol.ngfactory.d.ts +1 -1
- package/common/basemodelcontrol.d.ts +280 -280
- package/common/basemodelcontrol.ngfactory.d.ts +1 -1
- package/common/baseselectcontrol.d.ts +14 -14
- package/common/baseselectcontrol.ngfactory.d.ts +1 -1
- package/common/baseuploadcontrol.d.ts +300 -300
- package/common/baseuploadcontrol.ngfactory.d.ts +1 -1
- package/components/browser/browser.d.ts +267 -267
- package/components/browser/browser.ngfactory.d.ts +1 -1
- package/components/browser/models/browserfile.d.ts +17 -17
- package/components/browser/models/browserfile.ngfactory.d.ts +1 -1
- package/components/browser/models/browserfiledeleterequest.d.ts +18 -18
- package/components/browser/models/browserfiledeleterequest.ngfactory.d.ts +1 -1
- package/components/browser/models/browserfilerenamerequest.d.ts +22 -22
- package/components/browser/models/browserfilerenamerequest.ngfactory.d.ts +1 -1
- package/components/browser/models/browserfileresponse.d.ts +10 -10
- package/components/browser/models/browserfileresponse.ngfactory.d.ts +1 -1
- package/components/browser/models/browserfilesaverequest.d.ts +22 -22
- package/components/browser/models/browserfilesaverequest.ngfactory.d.ts +1 -1
- package/components/browser/models/browsernode.d.ts +34 -34
- package/components/browser/models/browsernode.ngfactory.d.ts +1 -1
- package/components/browser/models/browsernodedeleterequest.d.ts +14 -14
- package/components/browser/models/browsernodedeleterequest.ngfactory.d.ts +1 -1
- package/components/browser/models/browsernodenewrequest.d.ts +18 -18
- package/components/browser/models/browsernodenewrequest.ngfactory.d.ts +1 -1
- package/components/browser/models/browsernoderenamerequest.d.ts +18 -18
- package/components/browser/models/browsernoderenamerequest.ngfactory.d.ts +1 -1
- package/components/browser/models/browsernoderequest.d.ts +18 -18
- package/components/browser/models/browsernoderequest.ngfactory.d.ts +1 -1
- package/components/browser/models/browsernoderesponse.d.ts +10 -10
- package/components/browser/models/browsernoderesponse.ngfactory.d.ts +1 -1
- package/controls/buttons/button.d.ts +70 -70
- package/controls/buttons/button.ngfactory.d.ts +1 -1
- package/controls/checkbox/checkbox.d.ts +32 -32
- package/controls/checkbox/checkbox.ngfactory.d.ts +1 -1
- package/controls/checkbox/radiobutton.d.ts +114 -114
- package/controls/checkbox/radiobutton.ngfactory.d.ts +1 -1
- package/controls/checkbox/radiobuttons.d.ts +60 -60
- package/controls/checkbox/radiobuttons.ngfactory.d.ts +1 -1
- package/controls/confirm/confirm.button.d.ts +25 -25
- package/controls/confirm/confirm.button.ngfactory.d.ts +1 -1
- package/controls/confirm/confirm.d.ts +49 -49
- package/controls/confirm/confirm.ngfactory.d.ts +1 -1
- package/controls/confirm/confirm.service.d.ts +63 -63
- package/controls/confirm/confirm.service.ngfactory.d.ts +1 -1
- package/controls/contextmenu/contextmenu.d.ts +120 -120
- package/controls/contextmenu/contextmenu.interface.d.ts +3 -3
- package/controls/contextmenu/contextmenu.interface.ngfactory.d.ts +1 -1
- package/controls/contextmenu/contextmenu.ngfactory.d.ts +1 -1
- package/controls/contextmenu/contextmenuanchor.d.ts +15 -15
- package/controls/contextmenu/contextmenuanchor.ngfactory.d.ts +1 -1
- package/controls/contextmenu/contextmenucontainer.d.ts +15 -15
- package/controls/contextmenu/contextmenucontainer.ngfactory.d.ts +1 -1
- package/controls/contextmenu/contextmenuitem.d.ts +10 -10
- package/controls/contextmenu/contextmenuitem.ngfactory.d.ts +1 -1
- package/controls/contextmenu/contextmenuitembutton.d.ts +67 -67
- package/controls/contextmenu/contextmenuitembutton.ngfactory.d.ts +1 -1
- package/controls/datetime/date.d.ts +117 -117
- package/controls/datetime/date.ngfactory.d.ts +1 -1
- package/controls/datetime/dateselector.d.ts +161 -161
- package/controls/datetime/dateselector.ngfactory.d.ts +1 -1
- package/controls/datetime/datetime.d.ts +131 -131
- package/controls/datetime/datetime.ngfactory.d.ts +1 -1
- package/controls/datetime/time.d.ts +111 -111
- package/controls/datetime/time.ngfactory.d.ts +1 -1
- package/controls/dialog/dialog.d.ts +93 -93
- package/controls/dialog/dialog.ngfactory.d.ts +1 -1
- package/controls/form/form.d.ts +47 -47
- package/controls/form/form.ngfactory.d.ts +1 -1
- package/controls/grid/grid.d.ts +127 -127
- package/controls/grid/grid.ngfactory.d.ts +1 -1
- package/controls/grid/gridbutton.d.ts +33 -33
- package/controls/grid/gridbutton.ngfactory.d.ts +1 -1
- package/controls/grid/gridcolumn.d.ts +28 -28
- package/controls/grid/gridcolumn.ngfactory.d.ts +1 -1
- package/controls/grid/gridcolumnaction.d.ts +15 -15
- package/controls/grid/gridcolumnaction.ngfactory.d.ts +1 -1
- package/controls/grid/gridcolumnbase.d.ts +94 -94
- package/controls/grid/gridcolumnbase.ngfactory.d.ts +1 -1
- package/controls/grid/gridimage.d.ts +9 -9
- package/controls/grid/gridimage.ngfactory.d.ts +1 -1
- package/controls/grid/model.d.ts +92 -92
- package/controls/grid/model.ngfactory.d.ts +1 -1
- package/controls/grid/paging.d.ts +145 -145
- package/controls/grid/paging.ngfactory.d.ts +1 -1
- package/controls/input/input.d.ts +35 -35
- package/controls/input/input.ngfactory.d.ts +1 -1
- package/controls/input/inputarea.d.ts +26 -26
- package/controls/input/inputarea.ngfactory.d.ts +1 -1
- package/controls/input/inputcurrency.d.ts +11 -11
- package/controls/input/inputcurrency.ngfactory.d.ts +1 -1
- package/controls/input/inputdecimal.d.ts +59 -59
- package/controls/input/inputdecimal.ngfactory.d.ts +1 -1
- package/controls/input/inputemail.d.ts +19 -19
- package/controls/input/inputemail.ngfactory.d.ts +1 -1
- package/controls/input/inputinteger.d.ts +59 -59
- package/controls/input/inputinteger.ngfactory.d.ts +1 -1
- package/controls/input/inputpassword.d.ts +23 -23
- package/controls/input/inputpassword.ngfactory.d.ts +1 -1
- package/controls/input/inputsearch.d.ts +32 -32
- package/controls/input/inputsearch.ngfactory.d.ts +1 -1
- package/controls/layout/formlayout.d.ts +62 -62
- package/controls/layout/formlayout.ngfactory.d.ts +1 -1
- package/controls/list/buildvaluestring.d.ts +6 -6
- package/controls/list/buildvaluestring.ngfactory.d.ts +1 -1
- package/controls/list/dropdown.d.ts +96 -96
- package/controls/list/dropdown.ngfactory.d.ts +1 -1
- package/controls/list/dropdownoptions.d.ts +38 -38
- package/controls/list/dropdownoptions.ngfactory.d.ts +1 -1
- package/controls/list/list.module.d.ts +2 -2
- package/controls/list/list.module.ngfactory.d.ts +3 -3
- package/controls/list/listbox.d.ts +86 -86
- package/controls/list/listbox.ngfactory.d.ts +1 -1
- package/controls/multilanguage/multilanguageinput.d.ts +102 -102
- package/controls/multilanguage/multilanguageinput.ngfactory.d.ts +1 -1
- package/controls/multilanguage/multilanguageinputarea.d.ts +107 -107
- package/controls/multilanguage/multilanguageinputarea.ngfactory.d.ts +1 -1
- package/controls/static/formcontainer.d.ts +35 -35
- package/controls/static/formcontainer.ngfactory.d.ts +1 -1
- package/controls/static/staticlabel.d.ts +18 -18
- package/controls/static/staticlabel.ngfactory.d.ts +1 -1
- package/controls/tabs/tab.d.ts +45 -45
- package/controls/tabs/tab.ngfactory.d.ts +1 -1
- package/controls/tabs/tabitem.d.ts +30 -30
- package/controls/tabs/tabitem.ngfactory.d.ts +1 -1
- package/controls/tinymce/tinymce.d.ts +149 -149
- package/controls/tinymce/tinymce.ngfactory.d.ts +1 -1
- package/controls/tinymce/tinymcedialogsettings.d.ts +27 -27
- package/controls/tinymce/tinymcedialogsettings.ngfactory.d.ts +1 -1
- package/controls/tinymce/tinymcedialogsettingsmeta.d.ts +9 -9
- package/controls/tinymce/tinymcedialogsettingsmeta.ngfactory.d.ts +1 -1
- package/controls/tinymce/tinymceinstance.d.ts +10 -10
- package/controls/tinymce/tinymceinstance.ngfactory.d.ts +1 -1
- package/controls/tooltip/tooltip.d.ts +145 -145
- package/controls/tooltip/tooltip.ngfactory.d.ts +1 -1
- package/controls/treeview/treeview.d.ts +185 -185
- package/controls/treeview/treeview.ngfactory.d.ts +1 -1
- package/controls/upload/dropzonemultiple.d.ts +70 -70
- package/controls/upload/dropzonemultiple.ngfactory.d.ts +1 -1
- package/controls/upload/dropzonesingle.d.ts +47 -47
- package/controls/upload/dropzonesingle.ngfactory.d.ts +1 -1
- package/controls/upload/uploadmultiple.d.ts +50 -50
- package/controls/upload/uploadmultiple.ngfactory.d.ts +1 -1
- package/controls/upload/uploadsingle.d.ts +27 -27
- package/controls/upload/uploadsingle.ngfactory.d.ts +1 -1
- package/controls/validation/validationsummary.d.ts +60 -60
- package/controls/validation/validationsummary.ngfactory.d.ts +1 -1
- package/controls/wizard/wizard.d.ts +73 -73
- package/controls/wizard/wizard.ngfactory.d.ts +1 -1
- package/controls/wizard/wizarditem.d.ts +25 -25
- package/controls/wizard/wizarditem.ngfactory.d.ts +1 -1
- package/enums/ButtonRoleType.d.ts +1 -1
- package/enums/ButtonRoleType.ngfactory.d.ts +1 -1
- package/enums/ControlHeight.d.ts +17 -17
- package/enums/ControlHeight.ngfactory.d.ts +1 -1
- package/enums/IconType.d.ts +7 -7
- package/enums/IconType.ngfactory.d.ts +1 -1
- package/esm2015/common/basedatetimecontrol.js +329 -319
- package/esm2015/common/basedatetimecontrol.ngfactory.js +7 -7
- package/esm2015/common/baseinputcontrol.js +73 -73
- package/esm2015/common/baseinputcontrol.ngfactory.js +7 -7
- package/esm2015/common/baselistcontrol.js +55 -55
- package/esm2015/common/baselistcontrol.ngfactory.js +7 -7
- package/esm2015/common/basemodelcontrol.js +535 -535
- package/esm2015/common/basemodelcontrol.ngfactory.js +7 -7
- package/esm2015/common/baseselectcontrol.js +26 -26
- package/esm2015/common/baseselectcontrol.ngfactory.js +7 -7
- package/esm2015/common/baseuploadcontrol.js +490 -490
- package/esm2015/common/baseuploadcontrol.ngfactory.js +7 -7
- package/esm2015/components/browser/browser.js +545 -545
- package/esm2015/components/browser/browser.ngfactory.js +7 -7
- package/esm2015/components/browser/models/browserfile.js +1 -1
- package/esm2015/components/browser/models/browserfile.ngfactory.js +7 -7
- package/esm2015/components/browser/models/browserfiledeleterequest.js +13 -13
- package/esm2015/components/browser/models/browserfiledeleterequest.ngfactory.js +7 -7
- package/esm2015/components/browser/models/browserfilerenamerequest.js +13 -13
- package/esm2015/components/browser/models/browserfilerenamerequest.ngfactory.js +7 -7
- package/esm2015/components/browser/models/browserfileresponse.js +1 -1
- package/esm2015/components/browser/models/browserfileresponse.ngfactory.js +7 -7
- package/esm2015/components/browser/models/browserfilesaverequest.js +13 -13
- package/esm2015/components/browser/models/browserfilesaverequest.ngfactory.js +7 -7
- package/esm2015/components/browser/models/browsernode.js +1 -1
- package/esm2015/components/browser/models/browsernode.ngfactory.js +7 -7
- package/esm2015/components/browser/models/browsernodedeleterequest.js +13 -13
- package/esm2015/components/browser/models/browsernodedeleterequest.ngfactory.js +7 -7
- package/esm2015/components/browser/models/browsernodenewrequest.js +13 -13
- package/esm2015/components/browser/models/browsernodenewrequest.ngfactory.js +7 -7
- package/esm2015/components/browser/models/browsernoderenamerequest.js +13 -13
- package/esm2015/components/browser/models/browsernoderenamerequest.ngfactory.js +7 -7
- package/esm2015/components/browser/models/browsernoderequest.js +13 -13
- package/esm2015/components/browser/models/browsernoderequest.ngfactory.js +7 -7
- package/esm2015/components/browser/models/browsernoderesponse.js +1 -1
- package/esm2015/components/browser/models/browsernoderesponse.ngfactory.js +7 -7
- package/esm2015/controls/buttons/button.js +141 -141
- package/esm2015/controls/buttons/button.ngfactory.js +7 -7
- package/esm2015/controls/checkbox/checkbox.js +56 -56
- package/esm2015/controls/checkbox/checkbox.ngfactory.js +7 -7
- package/esm2015/controls/checkbox/radiobutton.js +164 -164
- package/esm2015/controls/checkbox/radiobutton.ngfactory.js +7 -7
- package/esm2015/controls/checkbox/radiobuttons.js +113 -113
- package/esm2015/controls/checkbox/radiobuttons.ngfactory.js +7 -7
- package/esm2015/controls/confirm/confirm.button.js +32 -32
- package/esm2015/controls/confirm/confirm.button.ngfactory.js +7 -7
- package/esm2015/controls/confirm/confirm.js +75 -75
- package/esm2015/controls/confirm/confirm.ngfactory.js +7 -7
- package/esm2015/controls/confirm/confirm.service.js +87 -87
- package/esm2015/controls/confirm/confirm.service.ngfactory.js +7 -7
- package/esm2015/controls/contextmenu/contextmenu.interface.js +1 -1
- package/esm2015/controls/contextmenu/contextmenu.interface.ngfactory.js +7 -7
- package/esm2015/controls/contextmenu/contextmenu.js +193 -193
- package/esm2015/controls/contextmenu/contextmenu.ngfactory.js +7 -7
- package/esm2015/controls/contextmenu/contextmenuanchor.js +22 -22
- package/esm2015/controls/contextmenu/contextmenuanchor.ngfactory.js +7 -7
- package/esm2015/controls/contextmenu/contextmenucontainer.js +22 -22
- package/esm2015/controls/contextmenu/contextmenucontainer.ngfactory.js +7 -7
- package/esm2015/controls/contextmenu/contextmenuitem.js +21 -21
- package/esm2015/controls/contextmenu/contextmenuitem.ngfactory.js +7 -7
- package/esm2015/controls/contextmenu/contextmenuitembutton.js +106 -106
- package/esm2015/controls/contextmenu/contextmenuitembutton.ngfactory.js +7 -7
- package/esm2015/controls/datetime/date.js +213 -213
- package/esm2015/controls/datetime/date.ngfactory.js +7 -7
- package/esm2015/controls/datetime/dateselector.js +458 -458
- package/esm2015/controls/datetime/dateselector.ngfactory.js +7 -7
- package/esm2015/controls/datetime/datetime.js +229 -229
- package/esm2015/controls/datetime/datetime.ngfactory.js +7 -7
- package/esm2015/controls/datetime/time.js +212 -212
- package/esm2015/controls/datetime/time.ngfactory.js +7 -7
- package/esm2015/controls/dialog/dialog.js +165 -165
- package/esm2015/controls/dialog/dialog.ngfactory.js +7 -7
- package/esm2015/controls/form/form.js +110 -110
- package/esm2015/controls/form/form.ngfactory.js +7 -7
- package/esm2015/controls/grid/grid.js +144 -144
- package/esm2015/controls/grid/grid.ngfactory.js +7 -7
- package/esm2015/controls/grid/gridbutton.js +60 -60
- package/esm2015/controls/grid/gridbutton.ngfactory.js +7 -7
- package/esm2015/controls/grid/gridcolumn.js +56 -56
- package/esm2015/controls/grid/gridcolumn.ngfactory.js +7 -7
- package/esm2015/controls/grid/gridcolumnaction.js +27 -27
- package/esm2015/controls/grid/gridcolumnaction.ngfactory.js +7 -7
- package/esm2015/controls/grid/gridcolumnbase.js +138 -138
- package/esm2015/controls/grid/gridcolumnbase.ngfactory.js +7 -7
- package/esm2015/controls/grid/gridimage.js +13 -13
- package/esm2015/controls/grid/gridimage.ngfactory.js +7 -7
- package/esm2015/controls/grid/model.js +100 -100
- package/esm2015/controls/grid/model.ngfactory.js +7 -7
- package/esm2015/controls/grid/paging.js +252 -252
- package/esm2015/controls/grid/paging.ngfactory.js +7 -7
- package/esm2015/controls/input/input.js +64 -64
- package/esm2015/controls/input/input.ngfactory.js +7 -7
- package/esm2015/controls/input/inputarea.js +61 -61
- package/esm2015/controls/input/inputarea.ngfactory.js +7 -7
- package/esm2015/controls/input/inputcurrency.js +31 -31
- package/esm2015/controls/input/inputcurrency.ngfactory.js +7 -7
- package/esm2015/controls/input/inputdecimal.js +146 -146
- package/esm2015/controls/input/inputdecimal.ngfactory.js +7 -7
- package/esm2015/controls/input/inputemail.js +41 -41
- package/esm2015/controls/input/inputemail.ngfactory.js +7 -7
- package/esm2015/controls/input/inputinteger.js +130 -130
- package/esm2015/controls/input/inputinteger.ngfactory.js +7 -7
- package/esm2015/controls/input/inputpassword.js +46 -46
- package/esm2015/controls/input/inputpassword.ngfactory.js +7 -7
- package/esm2015/controls/input/inputsearch.js +66 -66
- package/esm2015/controls/input/inputsearch.ngfactory.js +7 -7
- package/esm2015/controls/layout/formlayout.js +82 -82
- package/esm2015/controls/layout/formlayout.ngfactory.js +7 -7
- package/esm2015/controls/list/buildvaluestring.js +18 -18
- package/esm2015/controls/list/buildvaluestring.ngfactory.js +7 -7
- package/esm2015/controls/list/dropdown.js +172 -172
- package/esm2015/controls/list/dropdown.ngfactory.js +7 -7
- package/esm2015/controls/list/dropdownoptions.js +72 -72
- package/esm2015/controls/list/dropdownoptions.ngfactory.js +7 -7
- package/esm2015/controls/list/list.module.js +11 -11
- package/esm2015/controls/list/list.module.ngfactory.js +7 -7
- package/esm2015/controls/list/listbox.js +187 -187
- package/esm2015/controls/list/listbox.ngfactory.js +7 -7
- package/esm2015/controls/multilanguage/multilanguageinput.js +224 -224
- package/esm2015/controls/multilanguage/multilanguageinput.ngfactory.js +7 -7
- package/esm2015/controls/multilanguage/multilanguageinputarea.js +225 -225
- package/esm2015/controls/multilanguage/multilanguageinputarea.ngfactory.js +7 -7
- package/esm2015/controls/static/formcontainer.js +61 -61
- package/esm2015/controls/static/formcontainer.ngfactory.js +7 -7
- package/esm2015/controls/static/staticlabel.js +31 -31
- package/esm2015/controls/static/staticlabel.ngfactory.js +7 -7
- package/esm2015/controls/tabs/tab.js +72 -72
- package/esm2015/controls/tabs/tab.ngfactory.js +7 -7
- package/esm2015/controls/tabs/tabitem.js +32 -32
- package/esm2015/controls/tabs/tabitem.ngfactory.js +7 -7
- package/esm2015/controls/tinymce/tinymce.js +238 -238
- package/esm2015/controls/tinymce/tinymce.ngfactory.js +7 -7
- package/esm2015/controls/tinymce/tinymcedialogsettings.js +13 -13
- package/esm2015/controls/tinymce/tinymcedialogsettings.ngfactory.js +7 -7
- package/esm2015/controls/tinymce/tinymcedialogsettingsmeta.js +4 -4
- package/esm2015/controls/tinymce/tinymcedialogsettingsmeta.ngfactory.js +7 -7
- package/esm2015/controls/tinymce/tinymceinstance.js +1 -1
- package/esm2015/controls/tinymce/tinymceinstance.ngfactory.js +7 -7
- package/esm2015/controls/tooltip/tooltip.js +242 -242
- package/esm2015/controls/tooltip/tooltip.ngfactory.js +7 -7
- package/esm2015/controls/treeview/treeview.js +367 -367
- package/esm2015/controls/treeview/treeview.ngfactory.js +7 -7
- package/esm2015/controls/upload/dropzonemultiple.js +161 -163
- package/esm2015/controls/upload/dropzonemultiple.ngfactory.js +7 -7
- package/esm2015/controls/upload/dropzonesingle.js +108 -108
- package/esm2015/controls/upload/dropzonesingle.ngfactory.js +7 -7
- package/esm2015/controls/upload/uploadmultiple.js +121 -121
- package/esm2015/controls/upload/uploadmultiple.ngfactory.js +7 -7
- package/esm2015/controls/upload/uploadsingle.js +59 -55
- package/esm2015/controls/upload/uploadsingle.ngfactory.js +7 -7
- package/esm2015/controls/validation/validationsummary.js +133 -133
- package/esm2015/controls/validation/validationsummary.ngfactory.js +7 -7
- package/esm2015/controls/wizard/wizard.js +139 -139
- package/esm2015/controls/wizard/wizard.ngfactory.js +7 -7
- package/esm2015/controls/wizard/wizarditem.js +27 -27
- package/esm2015/controls/wizard/wizarditem.ngfactory.js +7 -7
- package/esm2015/enums/ButtonRoleType.js +1 -1
- package/esm2015/enums/ButtonRoleType.ngfactory.js +7 -7
- package/esm2015/enums/ControlHeight.js +19 -19
- package/esm2015/enums/ControlHeight.ngfactory.js +7 -7
- package/esm2015/enums/IconType.js +9 -9
- package/esm2015/enums/IconType.ngfactory.js +7 -7
- package/esm2015/interfaces/ISacConfigurationService.js +1 -1
- package/esm2015/interfaces/ISacConfigurationService.ngfactory.js +7 -7
- package/esm2015/interfaces/ISacFileBrowserService.js +1 -1
- package/esm2015/interfaces/ISacFileBrowserService.ngfactory.js +7 -7
- package/esm2015/interfaces/ISacIconService.js +1 -1
- package/esm2015/interfaces/ISacIconService.ngfactory.js +7 -7
- package/esm2015/interfaces/ISacLabelSizes.js +1 -1
- package/esm2015/interfaces/ISacLabelSizes.ngfactory.js +7 -7
- package/esm2015/interfaces/ISacLanguageService.js +1 -1
- package/esm2015/interfaces/ISacLanguageService.ngfactory.js +7 -7
- package/esm2015/interfaces/ISacLocalisationService.js +1 -1
- package/esm2015/interfaces/ISacLocalisationService.ngfactory.js +7 -7
- package/esm2015/interfaces/ISacUploadEventCompleteState.js +1 -1
- package/esm2015/interfaces/ISacUploadEventCompleteState.ngfactory.js +7 -7
- package/esm2015/interfaces/ISacValidationKeyService.js +1 -1
- package/esm2015/interfaces/ISacValidationKeyService.ngfactory.js +7 -7
- package/esm2015/interfaces/iabstractcontrollabel.js +1 -1
- package/esm2015/interfaces/iabstractcontrollabel.ngfactory.js +7 -7
- package/esm2015/interfaces/iconfirmcomponent.js +1 -1
- package/esm2015/interfaces/iconfirmcomponent.ngfactory.js +7 -7
- package/esm2015/interfaces/idatetimecontrol.js +1 -1
- package/esm2015/interfaces/idatetimecontrol.ngfactory.js +7 -7
- package/esm2015/interfaces/iuploadcontrol.js +1 -1
- package/esm2015/interfaces/iuploadcontrol.ngfactory.js +7 -7
- package/esm2015/interfaces/treeviewaction.interface.js +1 -1
- package/esm2015/interfaces/treeviewaction.interface.ngfactory.js +7 -7
- package/esm2015/models/languagemodel.js +13 -13
- package/esm2015/models/languagemodel.ngfactory.js +7 -7
- package/esm2015/public_api.js +108 -108
- package/esm2015/public_api.ngfactory.js +7 -7
- package/esm2015/services/index.js +7 -7
- package/esm2015/services/index.ngfactory.js +7 -7
- package/esm2015/services/sac-configuration.service.js +103 -103
- package/esm2015/services/sac-configuration.service.ngfactory.js +7 -7
- package/esm2015/services/sac-filebrowser.service.js +203 -203
- package/esm2015/services/sac-filebrowser.service.ngfactory.js +7 -7
- package/esm2015/services/sac-icon.service.js +191 -191
- package/esm2015/services/sac-icon.service.ngfactory.js +7 -7
- package/esm2015/services/sac-language.service.js +43 -43
- package/esm2015/services/sac-language.service.ngfactory.js +7 -7
- package/esm2015/services/sac-localisation.service.js +349 -349
- package/esm2015/services/sac-localisation.service.ngfactory.js +7 -7
- package/esm2015/services/sac-validationkey.service.js +159 -159
- package/esm2015/services/sac-validationkey.service.ngfactory.js +7 -7
- package/esm2015/simpleangularcontrols-sac-common.js +5 -5
- package/esm2015/simpleangularcontrols-sac-common.ngfactory.js +7 -7
- package/esm2015/utilities/convertion.js +32 -32
- package/esm2015/utilities/convertion.ngfactory.js +7 -7
- package/esm2015/utilities/datatypes.js +9 -9
- package/esm2015/utilities/datatypes.ngfactory.js +7 -7
- package/esm2015/utilities/enums.js +20 -20
- package/esm2015/utilities/enums.ngfactory.js +7 -7
- package/esm2015/utilities/guid.js +18 -18
- package/esm2015/utilities/guid.ngfactory.js +7 -7
- package/esm2015/utilities/interpolation.js +50 -50
- package/esm2015/utilities/interpolation.ngfactory.js +7 -7
- package/esm2015/utilities/popuphelper.js +343 -343
- package/esm2015/utilities/popuphelper.ngfactory.js +7 -7
- package/esm2015/utilities/positioning.js +301 -301
- package/esm2015/utilities/positioning.ngfactory.js +7 -7
- package/esm2015/validation/email.validator.js +13 -13
- package/esm2015/validation/email.validator.ngfactory.js +7 -7
- package/esm2015/validation/equals.validator.js +14 -14
- package/esm2015/validation/equals.validator.ngfactory.js +7 -7
- package/esm2015/validation/index.js +3 -3
- package/esm2015/validation/index.ngfactory.js +7 -7
- package/esm2015/validation/invaliddate.validator.js +14 -14
- package/esm2015/validation/invaliddate.validator.ngfactory.js +7 -7
- package/esm2015/validation/isDateValid.js +23 -23
- package/esm2015/validation/isDateValid.ngfactory.js +7 -7
- package/esm2015/validation/maxdate.validator.js +21 -21
- package/esm2015/validation/maxdate.validator.ngfactory.js +7 -7
- package/esm2015/validation/maxtime.validator.js +21 -21
- package/esm2015/validation/maxtime.validator.ngfactory.js +7 -7
- package/esm2015/validation/maxvalue.validator.js +16 -16
- package/esm2015/validation/maxvalue.validator.ngfactory.js +7 -7
- package/esm2015/validation/mindate.validator.js +21 -21
- package/esm2015/validation/mindate.validator.ngfactory.js +7 -7
- package/esm2015/validation/minfiles.validator.js +19 -19
- package/esm2015/validation/minfiles.validator.ngfactory.js +7 -7
- package/esm2015/validation/mintextlength.validator.js +23 -23
- package/esm2015/validation/mintextlength.validator.ngfactory.js +7 -7
- package/esm2015/validation/mintime.validator.js +21 -21
- package/esm2015/validation/mintime.validator.ngfactory.js +7 -7
- package/esm2015/validation/minvalue.validator.js +16 -16
- package/esm2015/validation/minvalue.validator.ngfactory.js +7 -7
- package/esm2015/validation/multilanguagerequired.validator.js +22 -22
- package/esm2015/validation/multilanguagerequired.validator.ngfactory.js +7 -7
- package/esm2015/validation/multilanguagerequiredany.validator.js +22 -22
- package/esm2015/validation/multilanguagerequiredany.validator.ngfactory.js +7 -7
- package/esm2015/validation/notequals.validator.js +14 -14
- package/esm2015/validation/notequals.validator.ngfactory.js +7 -7
- package/esm2015/validation/pattern.validator.js +16 -16
- package/esm2015/validation/pattern.validator.ngfactory.js +7 -7
- package/esm2015/validation/required.validator.js +13 -13
- package/esm2015/validation/required.validator.ngfactory.js +7 -7
- package/esm2015/validation/validation.class.js +218 -218
- package/esm2015/validation/validation.class.ngfactory.js +7 -7
- package/esm2015/validation/validationerrorcreator.js +11 -11
- package/esm2015/validation/validationerrorcreator.ngfactory.js +7 -7
- package/esm2015/validation/validationerroritem.js +27 -27
- package/esm2015/validation/validationerroritem.ngfactory.js +7 -7
- package/fesm2015/simpleangularcontrols-sac-common.js +10674 -10662
- package/fesm2015/simpleangularcontrols-sac-common.js.map +1 -1
- package/interfaces/ISacConfigurationService.d.ts +58 -58
- package/interfaces/ISacConfigurationService.ngfactory.d.ts +1 -1
- package/interfaces/ISacFileBrowserService.d.ts +65 -65
- package/interfaces/ISacFileBrowserService.ngfactory.d.ts +1 -1
- package/interfaces/ISacIconService.d.ts +113 -113
- package/interfaces/ISacIconService.ngfactory.d.ts +1 -1
- package/interfaces/ISacLabelSizes.d.ts +26 -26
- package/interfaces/ISacLabelSizes.ngfactory.d.ts +1 -1
- package/interfaces/ISacLanguageService.d.ts +12 -12
- package/interfaces/ISacLanguageService.ngfactory.d.ts +1 -1
- package/interfaces/ISacLocalisationService.d.ts +10 -10
- package/interfaces/ISacLocalisationService.ngfactory.d.ts +1 -1
- package/interfaces/ISacUploadEventCompleteState.d.ts +5 -5
- package/interfaces/ISacUploadEventCompleteState.ngfactory.d.ts +1 -1
- package/interfaces/ISacValidationKeyService.d.ts +52 -52
- package/interfaces/ISacValidationKeyService.ngfactory.d.ts +1 -1
- package/interfaces/iabstractcontrollabel.d.ts +6 -6
- package/interfaces/iabstractcontrollabel.ngfactory.d.ts +1 -1
- package/interfaces/iconfirmcomponent.d.ts +18 -18
- package/interfaces/iconfirmcomponent.ngfactory.d.ts +1 -1
- package/interfaces/idatetimecontrol.d.ts +7 -7
- package/interfaces/idatetimecontrol.ngfactory.d.ts +1 -1
- package/interfaces/iuploadcontrol.d.ts +9 -9
- package/interfaces/iuploadcontrol.ngfactory.d.ts +1 -1
- package/interfaces/treeviewaction.interface.d.ts +4 -4
- package/interfaces/treeviewaction.interface.ngfactory.d.ts +1 -1
- package/models/languagemodel.d.ts +22 -22
- package/models/languagemodel.ngfactory.d.ts +1 -1
- package/package.json +1 -1
- package/public_api.d.ts +86 -86
- package/public_api.ngfactory.d.ts +1 -1
- package/services/index.d.ts +6 -6
- package/services/index.ngfactory.d.ts +1 -1
- package/services/sac-configuration.service.d.ts +121 -121
- package/services/sac-configuration.service.ngfactory.d.ts +1 -1
- package/services/sac-filebrowser.service.d.ts +140 -140
- package/services/sac-filebrowser.service.ngfactory.d.ts +1 -1
- package/services/sac-icon.service.d.ts +232 -232
- package/services/sac-icon.service.ngfactory.d.ts +1 -1
- package/services/sac-language.service.d.ts +26 -26
- package/services/sac-language.service.ngfactory.d.ts +1 -1
- package/services/sac-localisation.service.d.ts +137 -137
- package/services/sac-localisation.service.ngfactory.d.ts +1 -1
- package/services/sac-validationkey.service.d.ts +55 -55
- package/services/sac-validationkey.service.ngfactory.d.ts +1 -1
- package/simpleangularcontrols-sac-common-10.0.0-rc.23.tgz +0 -0
- package/simpleangularcontrols-sac-common.d.ts +4 -4
- package/simpleangularcontrols-sac-common.metadata.json +1 -1
- package/simpleangularcontrols-sac-common.ngfactory.d.ts +1 -1
- package/utilities/convertion.d.ts +15 -15
- package/utilities/convertion.ngfactory.d.ts +1 -1
- package/utilities/datatypes.d.ts +6 -6
- package/utilities/datatypes.ngfactory.d.ts +1 -1
- package/utilities/enums.d.ts +12 -12
- package/utilities/enums.ngfactory.d.ts +1 -1
- package/utilities/guid.d.ts +4 -4
- package/utilities/guid.ngfactory.d.ts +1 -1
- package/utilities/interpolation.d.ts +21 -21
- package/utilities/interpolation.ngfactory.d.ts +1 -1
- package/utilities/popuphelper.d.ts +83 -83
- package/utilities/popuphelper.ngfactory.d.ts +1 -1
- package/utilities/positioning.d.ts +82 -82
- package/utilities/positioning.ngfactory.d.ts +1 -1
- package/validation/email.validator.d.ts +2 -2
- package/validation/email.validator.ngfactory.d.ts +1 -1
- package/validation/equals.validator.d.ts +2 -2
- package/validation/equals.validator.ngfactory.d.ts +1 -1
- package/validation/index.d.ts +2 -2
- package/validation/index.ngfactory.d.ts +1 -1
- package/validation/invaliddate.validator.d.ts +2 -2
- package/validation/invaliddate.validator.ngfactory.d.ts +1 -1
- package/validation/isDateValid.d.ts +5 -5
- package/validation/isDateValid.ngfactory.d.ts +1 -1
- package/validation/maxdate.validator.d.ts +2 -2
- package/validation/maxdate.validator.ngfactory.d.ts +1 -1
- package/validation/maxtime.validator.d.ts +2 -2
- package/validation/maxtime.validator.ngfactory.d.ts +1 -1
- package/validation/maxvalue.validator.d.ts +2 -2
- package/validation/maxvalue.validator.ngfactory.d.ts +1 -1
- package/validation/mindate.validator.d.ts +2 -2
- package/validation/mindate.validator.ngfactory.d.ts +1 -1
- package/validation/minfiles.validator.d.ts +2 -2
- package/validation/minfiles.validator.ngfactory.d.ts +1 -1
- package/validation/mintextlength.validator.d.ts +2 -2
- package/validation/mintextlength.validator.ngfactory.d.ts +1 -1
- package/validation/mintime.validator.d.ts +2 -2
- package/validation/mintime.validator.ngfactory.d.ts +1 -1
- package/validation/minvalue.validator.d.ts +2 -2
- package/validation/minvalue.validator.ngfactory.d.ts +1 -1
- package/validation/multilanguagerequired.validator.d.ts +3 -3
- package/validation/multilanguagerequired.validator.ngfactory.d.ts +1 -1
- package/validation/multilanguagerequiredany.validator.d.ts +3 -3
- package/validation/multilanguagerequiredany.validator.ngfactory.d.ts +1 -1
- package/validation/notequals.validator.d.ts +2 -2
- package/validation/notequals.validator.ngfactory.d.ts +1 -1
- package/validation/pattern.validator.d.ts +2 -2
- package/validation/pattern.validator.ngfactory.d.ts +1 -1
- package/validation/required.validator.d.ts +2 -2
- package/validation/required.validator.ngfactory.d.ts +1 -1
- package/validation/validation.class.d.ts +158 -158
- package/validation/validation.class.ngfactory.d.ts +1 -1
- package/validation/validationerrorcreator.d.ts +1 -1
- package/validation/validationerrorcreator.ngfactory.d.ts +1 -1
- package/validation/validationerroritem.d.ts +33 -33
- package/validation/validationerroritem.ngfactory.d.ts +1 -1
- package/simpleangularcontrols-sac-common-10.0.0-rc.21.tgz +0 -0
|
@@ -1,545 +1,545 @@
|
|
|
1
|
-
import { HttpClient } from '@angular/common/http';
|
|
2
|
-
import { Directive, EventEmitter, HostListener, Injector, Input, Output, } from '@angular/core';
|
|
3
|
-
import { SACICON_SERVICE, SACLOCALISATION_SERVICE, SACVALIDATIONKEY_SERVICE, SacDefaultIconService, SacDefaultValidationKeyService, } from '../../services';
|
|
4
|
-
import { SACFILEBROWSER_SERVICE, SacDefaultFileBrowserService, } from '../../services/sac-filebrowser.service';
|
|
5
|
-
import { SacDefaultLocalisationService } from '../../services/sac-localisation.service';
|
|
6
|
-
/**
|
|
7
|
-
* Base Component für File Browser
|
|
8
|
-
*/
|
|
9
|
-
export class SacFileBrowserCommon {
|
|
10
|
-
// #endregion Properties
|
|
11
|
-
// #region Constructors
|
|
12
|
-
/**
|
|
13
|
-
* Konstruktor
|
|
14
|
-
* @param httpclient Angular HTTP Client
|
|
15
|
-
* @param injector Service Injector
|
|
16
|
-
*/
|
|
17
|
-
constructor(httpclient, injector) {
|
|
18
|
-
/**
|
|
19
|
-
* File welches beim starten des Browsers bereits selektiert ist
|
|
20
|
-
*/
|
|
21
|
-
this.preselecedfile = null;
|
|
22
|
-
/**
|
|
23
|
-
* Erlaubte Dateierweiterungen für Fileauswahl und Upload. Dateierweiterung mit Punkt und
|
|
24
|
-
* getrennt durch Komma für mehr als eine Erweiterung (Example: ".jpg,.gif")
|
|
25
|
-
*/
|
|
26
|
-
this.allowedtypes = '';
|
|
27
|
-
/**
|
|
28
|
-
* Erlaubt das löschen einer Datei
|
|
29
|
-
*/
|
|
30
|
-
this.allowfiledelete = true;
|
|
31
|
-
/**
|
|
32
|
-
* Erlaubt das umbenennen einer Datei
|
|
33
|
-
*/
|
|
34
|
-
this.allowfilerename = true;
|
|
35
|
-
/**
|
|
36
|
-
* Erlaubt den Upload von Dateien
|
|
37
|
-
*/
|
|
38
|
-
this.allowfileupload = true;
|
|
39
|
-
/**
|
|
40
|
-
* Erlaubt das erstellen eines neuen Ordners
|
|
41
|
-
*/
|
|
42
|
-
this.allowfoldercreate = true;
|
|
43
|
-
/**
|
|
44
|
-
* Erlaubt das löschen eines Ordners
|
|
45
|
-
*/
|
|
46
|
-
this.allowfolderdelete = true;
|
|
47
|
-
/**
|
|
48
|
-
* Erlaubt das Umbenennen eines Ordners
|
|
49
|
-
*/
|
|
50
|
-
this.allowfolderrename = true;
|
|
51
|
-
/**
|
|
52
|
-
* Output Emitter wenn File selektiert wird.
|
|
53
|
-
*/
|
|
54
|
-
this.file = new EventEmitter();
|
|
55
|
-
/**
|
|
56
|
-
* Root Node Item für Tree
|
|
57
|
-
*/
|
|
58
|
-
this.rootNode = {
|
|
59
|
-
Name: '',
|
|
60
|
-
ChildNodes: [],
|
|
61
|
-
Files: [],
|
|
62
|
-
IsExpanded: true,
|
|
63
|
-
IsEditMode: false,
|
|
64
|
-
IsNewNode: false,
|
|
65
|
-
Path: '',
|
|
66
|
-
};
|
|
67
|
-
/**
|
|
68
|
-
* Selected File Item
|
|
69
|
-
*/
|
|
70
|
-
this.selectedFileItem = null;
|
|
71
|
-
/**
|
|
72
|
-
* Selected Node Item
|
|
73
|
-
*/
|
|
74
|
-
this.selectedNode = null;
|
|
75
|
-
/**
|
|
76
|
-
* Liste von Uploads
|
|
77
|
-
*/
|
|
78
|
-
this.uploads = [];
|
|
79
|
-
this.browserService = injector.get(SACFILEBROWSER_SERVICE, new SacDefaultFileBrowserService(httpclient));
|
|
80
|
-
this.validationKeyService = injector.get(SACVALIDATIONKEY_SERVICE, new SacDefaultValidationKeyService());
|
|
81
|
-
this.lngResourceService = injector.get(SACLOCALISATION_SERVICE, new SacDefaultLocalisationService(this.validationKeyService));
|
|
82
|
-
this.iconService = injector.get(SACICON_SERVICE, new SacDefaultIconService());
|
|
83
|
-
}
|
|
84
|
-
// #endregion Constructors
|
|
85
|
-
// #region Public Getters And Setters
|
|
86
|
-
/**
|
|
87
|
-
* Setzt den Seleced Node über den Pfad
|
|
88
|
-
*/
|
|
89
|
-
set selectedfile(v) {
|
|
90
|
-
const selectednode = this.findSelectedNodeByPath(this.rootNode, v);
|
|
91
|
-
if (selectednode !== null) {
|
|
92
|
-
this.selectNode(selectednode);
|
|
93
|
-
}
|
|
94
|
-
this.preselecedfile = v;
|
|
95
|
-
}
|
|
96
|
-
/**
|
|
97
|
-
* CSS icon class for delete icon
|
|
98
|
-
* @returns css class with icon
|
|
99
|
-
*/
|
|
100
|
-
get iconDelete() {
|
|
101
|
-
return this.iconService.BrowserComponentDeleteIcon;
|
|
102
|
-
}
|
|
103
|
-
/**
|
|
104
|
-
* CSS icon class for edit icon
|
|
105
|
-
* @returns css class with icon
|
|
106
|
-
*/
|
|
107
|
-
get iconEdit() {
|
|
108
|
-
return this.iconService.BrowserComponentEditIcon;
|
|
109
|
-
}
|
|
110
|
-
/**
|
|
111
|
-
* CSS icon for folders in tree there are collabsed
|
|
112
|
-
* @returns css class with icon
|
|
113
|
-
*/
|
|
114
|
-
get iconFolderCollabsed() {
|
|
115
|
-
return this.iconService.BrowserComponentFolderClosedIcon;
|
|
116
|
-
}
|
|
117
|
-
/**
|
|
118
|
-
* CSS icon class for folders without subfolders
|
|
119
|
-
* @returns css class with icon
|
|
120
|
-
*/
|
|
121
|
-
get iconFolderEmpty() {
|
|
122
|
-
return this.iconService.BrowserComponentFolderEmptyIcon;
|
|
123
|
-
}
|
|
124
|
-
/**
|
|
125
|
-
* CSS icon for new folders action
|
|
126
|
-
* @returns css class with icon
|
|
127
|
-
*/
|
|
128
|
-
get iconFolderNew() {
|
|
129
|
-
return this.iconService.BrowserComponentFolderNewIcon;
|
|
130
|
-
}
|
|
131
|
-
/**
|
|
132
|
-
* CSS icon for folders in tree there are expanded
|
|
133
|
-
* @returns css class with icon
|
|
134
|
-
*/
|
|
135
|
-
get iconFolderOpen() {
|
|
136
|
-
return this.iconService.BrowserComponentFolderOpenIcon;
|
|
137
|
-
}
|
|
138
|
-
/**
|
|
139
|
-
* CSS icon class for refresh icon
|
|
140
|
-
* @returns css class with icon
|
|
141
|
-
*/
|
|
142
|
-
get iconRefresh() {
|
|
143
|
-
return this.iconService.BrowserComponentRefreshIcon;
|
|
144
|
-
}
|
|
145
|
-
/**
|
|
146
|
-
* Getter für Selected File. Ist an Input Property gebunden
|
|
147
|
-
*/
|
|
148
|
-
get selectedfile() {
|
|
149
|
-
if (this.selectFile && this.selectFile.length > 0) {
|
|
150
|
-
return this.selectedFile;
|
|
151
|
-
}
|
|
152
|
-
else {
|
|
153
|
-
return null;
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
// #endregion Public Getters And Setters
|
|
157
|
-
// #region Public Methods
|
|
158
|
-
/**
|
|
159
|
-
* HostListener welcher den Edit Mode bei allen Files und Nodes beendet.
|
|
160
|
-
*/
|
|
161
|
-
exitEditMode(targetElement) {
|
|
162
|
-
if (this.selectedNode) {
|
|
163
|
-
this.selectedNode.Files.forEach((itm) => (itm.IsEditMode = false));
|
|
164
|
-
if (!this.selectedNode ||
|
|
165
|
-
this.selectedNode.Name === null ||
|
|
166
|
-
this.selectedNode.Name.length === 0) {
|
|
167
|
-
this.clearNewChildNodes(this.rootNode);
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
this.resetNodeEditMode(null);
|
|
171
|
-
}
|
|
172
|
-
/**
|
|
173
|
-
* Löscht ein File
|
|
174
|
-
* @param file File welches gelöscht werden soll
|
|
175
|
-
*/
|
|
176
|
-
deleteFile(file) {
|
|
177
|
-
this.confirmDeleteFile(file).subscribe((confirm) => {
|
|
178
|
-
if (confirm) {
|
|
179
|
-
this.browserService
|
|
180
|
-
.DeleteFile(this.apiurl, this.selectedNode.Path + '/' + file.Filename, this.allowedtypes)
|
|
181
|
-
.subscribe((result) => {
|
|
182
|
-
this.selectedNode.Files = result.Files;
|
|
183
|
-
});
|
|
184
|
-
}
|
|
185
|
-
});
|
|
186
|
-
}
|
|
187
|
-
/**
|
|
188
|
-
* Löscht einen Node
|
|
189
|
-
* @param node Node welcher gelöscht werden soll
|
|
190
|
-
*/
|
|
191
|
-
deleteNode(node) {
|
|
192
|
-
this.confirmDeleteNode(node).subscribe((confirm) => {
|
|
193
|
-
if (confirm) {
|
|
194
|
-
this.browserService
|
|
195
|
-
.DeleteNode(this.apiurl, node.Path)
|
|
196
|
-
.subscribe((result) => {
|
|
197
|
-
const parentNode = this.findParentNode(this.rootNode, node);
|
|
198
|
-
parentNode.ChildNodes = result.Node.ChildNodes;
|
|
199
|
-
this.rootNode.ChildNodes.forEach((itm) => {
|
|
200
|
-
this.fillPath(itm, '');
|
|
201
|
-
});
|
|
202
|
-
this.selectNode(parentNode);
|
|
203
|
-
});
|
|
204
|
-
}
|
|
205
|
-
});
|
|
206
|
-
}
|
|
207
|
-
/**
|
|
208
|
-
* Setzt ein File in den Edit Mode
|
|
209
|
-
* @param file File welches in den Edit Mode gesetzt werden soll
|
|
210
|
-
*/
|
|
211
|
-
editFile(file) {
|
|
212
|
-
file.IsEditMode = true;
|
|
213
|
-
}
|
|
214
|
-
/**
|
|
215
|
-
* Setzt einen Node in den Edit Mode
|
|
216
|
-
* @param node Node welcher bearbeitet werden soll
|
|
217
|
-
*/
|
|
218
|
-
editNode(node) {
|
|
219
|
-
node.IsEditMode = true;
|
|
220
|
-
}
|
|
221
|
-
/**
|
|
222
|
-
* Erzeugt einen neuen Node im Tree
|
|
223
|
-
* @param node Node unter welchem ein neuer Node erstellt werden soll
|
|
224
|
-
*/
|
|
225
|
-
newNode(node) {
|
|
226
|
-
const item = {
|
|
227
|
-
ChildNodes: [],
|
|
228
|
-
Files: [],
|
|
229
|
-
IsEditMode: false,
|
|
230
|
-
IsExpanded: false,
|
|
231
|
-
Name: '',
|
|
232
|
-
Path: node.Path,
|
|
233
|
-
IsNewNode: true,
|
|
234
|
-
};
|
|
235
|
-
node.ChildNodes.push(item);
|
|
236
|
-
this.selectNode(item);
|
|
237
|
-
this.editNode(item);
|
|
238
|
-
}
|
|
239
|
-
/**
|
|
240
|
-
* Init Event der Komponente
|
|
241
|
-
*/
|
|
242
|
-
ngOnInit() {
|
|
243
|
-
this.browserService
|
|
244
|
-
.GetNode(this.apiurl, '', this.allowedtypes)
|
|
245
|
-
.subscribe((result) => {
|
|
246
|
-
this.rootNode = {
|
|
247
|
-
Name: result.Node.Name,
|
|
248
|
-
Files: result.Node.Files,
|
|
249
|
-
ChildNodes: result.Node.ChildNodes,
|
|
250
|
-
IsExpanded: true,
|
|
251
|
-
IsEditMode: false,
|
|
252
|
-
IsNewNode: false,
|
|
253
|
-
Path: '/',
|
|
254
|
-
};
|
|
255
|
-
this.setPathToAllNodes();
|
|
256
|
-
this.selectedNode = this.rootNode;
|
|
257
|
-
// Selected File erneut setzen, wenn Property gesetzt wurde bevor Daten vom Service geladen wurden.
|
|
258
|
-
if (this.preselecedfile !== null && this.preselecedfile.length > 0) {
|
|
259
|
-
this.selectedfile = this.preselecedfile;
|
|
260
|
-
}
|
|
261
|
-
});
|
|
262
|
-
}
|
|
263
|
-
/**
|
|
264
|
-
* Aktualisiert den Node
|
|
265
|
-
*/
|
|
266
|
-
refreshNode(node) {
|
|
267
|
-
if (!node.IsExpanded) {
|
|
268
|
-
this.switchExpandNode(node);
|
|
269
|
-
}
|
|
270
|
-
this.browserService
|
|
271
|
-
.GetNode(this.apiurl, node.Path, this.allowedtypes)
|
|
272
|
-
.subscribe((result) => {
|
|
273
|
-
node.ChildNodes = result.Node.ChildNodes;
|
|
274
|
-
node.Files = result.Node.Files;
|
|
275
|
-
this.setPathToAllNodes();
|
|
276
|
-
});
|
|
277
|
-
}
|
|
278
|
-
/**
|
|
279
|
-
* Methode wenn eine Datei umbenannt werden soll
|
|
280
|
-
* @param file File welches umbenannt werden soll
|
|
281
|
-
* @param newFilename Neuer Dateiname
|
|
282
|
-
*/
|
|
283
|
-
renameFile(file, newFilename) {
|
|
284
|
-
file.IsEditMode = false;
|
|
285
|
-
if (!newFilename || newFilename === null || newFilename.length === 0) {
|
|
286
|
-
// Cancel, Invalid Filename
|
|
287
|
-
return;
|
|
288
|
-
}
|
|
289
|
-
if (file.Filename !== newFilename) {
|
|
290
|
-
this.browserService
|
|
291
|
-
.RenameFile(this.apiurl, this.selectedNode.Path + '/' + file.Filename, newFilename, this.allowedtypes)
|
|
292
|
-
.subscribe((result) => {
|
|
293
|
-
this.selectedNode.Files = result.Files;
|
|
294
|
-
});
|
|
295
|
-
}
|
|
296
|
-
}
|
|
297
|
-
/**
|
|
298
|
-
* Methode wenn ein Node umbenannt werden soll
|
|
299
|
-
* @param node Node welcher umbenannt werden soll
|
|
300
|
-
* @param newFoldername Neuer Ordnername
|
|
301
|
-
*/
|
|
302
|
-
renameNode(node, newFoldername) {
|
|
303
|
-
node.IsEditMode = false;
|
|
304
|
-
if (!node.IsNewNode) {
|
|
305
|
-
if (!newFoldername ||
|
|
306
|
-
newFoldername === null ||
|
|
307
|
-
newFoldername.length === 0) {
|
|
308
|
-
// Cancel Rename. Invalid Foldername
|
|
309
|
-
return;
|
|
310
|
-
}
|
|
311
|
-
if (node.Name !== newFoldername) {
|
|
312
|
-
this.browserService
|
|
313
|
-
.RenameNode(this.apiurl, node.Path, newFoldername)
|
|
314
|
-
.subscribe((result) => {
|
|
315
|
-
node.Name = result.Node.Name;
|
|
316
|
-
this.setPathToAllNodes();
|
|
317
|
-
});
|
|
318
|
-
}
|
|
319
|
-
}
|
|
320
|
-
else {
|
|
321
|
-
if (!newFoldername ||
|
|
322
|
-
newFoldername === null ||
|
|
323
|
-
newFoldername.length === 0) {
|
|
324
|
-
this.clearNewChildNodes(this.rootNode);
|
|
325
|
-
return;
|
|
326
|
-
}
|
|
327
|
-
node.Name = newFoldername;
|
|
328
|
-
node.IsNewNode = false;
|
|
329
|
-
this.browserService
|
|
330
|
-
.SaveNode(this.apiurl, node.Path, newFoldername)
|
|
331
|
-
.subscribe((result) => {
|
|
332
|
-
node.Name = result.Node.Name;
|
|
333
|
-
node.Files = result.Node.Files;
|
|
334
|
-
this.setPathToAllNodes();
|
|
335
|
-
});
|
|
336
|
-
}
|
|
337
|
-
}
|
|
338
|
-
/**
|
|
339
|
-
* Methode wenn ein File selektiert wird
|
|
340
|
-
* @param file File welches selektiert wird
|
|
341
|
-
*/
|
|
342
|
-
selectFile(file) {
|
|
343
|
-
if (!file.IsEditMode) {
|
|
344
|
-
this.selectedNode.Files.forEach((itm) => (itm.IsEditMode = false));
|
|
345
|
-
}
|
|
346
|
-
if (!this.selectedNode.Path.endsWith('/')) {
|
|
347
|
-
this.selectedFile = this.selectedNode.Path + '/' + file.Filename;
|
|
348
|
-
}
|
|
349
|
-
else {
|
|
350
|
-
this.selectedFile = '/' + file.Filename;
|
|
351
|
-
}
|
|
352
|
-
this.selectedFileItem = file;
|
|
353
|
-
this.file.emit(this.selectedFile);
|
|
354
|
-
}
|
|
355
|
-
/**
|
|
356
|
-
* Methode wenn ein Node selektiert wird
|
|
357
|
-
* @param node Node welcher selektiert werden soll
|
|
358
|
-
*/
|
|
359
|
-
selectNode(node) {
|
|
360
|
-
if (!node.IsExpanded) {
|
|
361
|
-
this.switchExpandNode(node);
|
|
362
|
-
}
|
|
363
|
-
// Reset the Edit Mode in all Nodes
|
|
364
|
-
this.resetNodeEditMode(null);
|
|
365
|
-
if (!node.Files) {
|
|
366
|
-
this.browserService
|
|
367
|
-
.GetFiles(this.apiurl, node.Path, this.allowedtypes)
|
|
368
|
-
.subscribe((result) => {
|
|
369
|
-
node.Files = result.Files;
|
|
370
|
-
this.selectedNode = node;
|
|
371
|
-
if (this.preselecedfile !== null && this.preselecedfile.length > 0) {
|
|
372
|
-
const filename = this.preselecedfile.substring(this.preselecedfile.lastIndexOf('/') + 1);
|
|
373
|
-
const file = node.Files.find((itm) => itm.Filename === filename);
|
|
374
|
-
if (file) {
|
|
375
|
-
this.selectFile(file);
|
|
376
|
-
}
|
|
377
|
-
}
|
|
378
|
-
});
|
|
379
|
-
}
|
|
380
|
-
else {
|
|
381
|
-
this.selectedNode = node;
|
|
382
|
-
}
|
|
383
|
-
}
|
|
384
|
-
/**
|
|
385
|
-
* Expand/Collabse Methode für Nodes
|
|
386
|
-
* @param node Node welcher geöffnet oder geschlossen werden soll
|
|
387
|
-
*/
|
|
388
|
-
switchExpandNode(node) {
|
|
389
|
-
if (node.IsExpanded) {
|
|
390
|
-
node.IsExpanded = false;
|
|
391
|
-
}
|
|
392
|
-
else {
|
|
393
|
-
node.IsExpanded = true;
|
|
394
|
-
}
|
|
395
|
-
}
|
|
396
|
-
/**
|
|
397
|
-
* Methode die Aufgerufen werden muss, wenn ein Upload beendet ist.
|
|
398
|
-
* @param param Parameter des hochgeladenen Files
|
|
399
|
-
*/
|
|
400
|
-
uploadComplete(node, uploadIdList) {
|
|
401
|
-
if (uploadIdList !== null) {
|
|
402
|
-
uploadIdList.forEach((element) => {
|
|
403
|
-
if (this.uploads.indexOf(element) < 0) {
|
|
404
|
-
this.uploads.push(element);
|
|
405
|
-
}
|
|
406
|
-
});
|
|
407
|
-
}
|
|
408
|
-
const id = this.uploads.pop();
|
|
409
|
-
if (id) {
|
|
410
|
-
this.browserService
|
|
411
|
-
.SaveFile(this.apiurl, node.Path, id, this.allowedtypes)
|
|
412
|
-
.subscribe((result) => {
|
|
413
|
-
this.selectedNode.Files = result.Files;
|
|
414
|
-
this.uploadedFileMoved(id);
|
|
415
|
-
});
|
|
416
|
-
}
|
|
417
|
-
}
|
|
418
|
-
// #endregion Public Abstract Methods
|
|
419
|
-
// #region Private Methods
|
|
420
|
-
/**
|
|
421
|
-
* Rekursive Methode welche beim Node und all seinen Childs neue Nodes entfernt
|
|
422
|
-
* @param node Node bei welchem alle neuen Nodes entfernt werden soll.
|
|
423
|
-
*/
|
|
424
|
-
clearNewChildNodes(node) {
|
|
425
|
-
node.ChildNodes.forEach((itm) => {
|
|
426
|
-
if (itm.IsNewNode) {
|
|
427
|
-
node.ChildNodes.splice(node.ChildNodes.indexOf(itm));
|
|
428
|
-
}
|
|
429
|
-
});
|
|
430
|
-
node.ChildNodes.forEach((itm) => this.clearNewChildNodes(itm));
|
|
431
|
-
}
|
|
432
|
-
/**
|
|
433
|
-
* Methode welche den Pfad für einen Node erzeugt
|
|
434
|
-
* @param node Node für welchen der Pfad erzeugt werden soll
|
|
435
|
-
* @param parentPath Übergeordneter Pfad
|
|
436
|
-
*/
|
|
437
|
-
fillPath(node, parentPath) {
|
|
438
|
-
node.Path = parentPath + '/' + node.Name;
|
|
439
|
-
node.ChildNodes.forEach((itm) => {
|
|
440
|
-
this.fillPath(itm, node.Path);
|
|
441
|
-
});
|
|
442
|
-
}
|
|
443
|
-
/**
|
|
444
|
-
* Sucht den übergeordneten Node im Tree
|
|
445
|
-
* @param node Aktueller Node
|
|
446
|
-
* @param nodeToFind Node welcher gefunden werden soll
|
|
447
|
-
* @returns Node wenn er gefunden wurde, ansonsten wird NULL zurückgegeben
|
|
448
|
-
*/
|
|
449
|
-
findParentNode(node, nodeToFind) {
|
|
450
|
-
if (node.ChildNodes.indexOf(nodeToFind) >= 0) {
|
|
451
|
-
return node;
|
|
452
|
-
}
|
|
453
|
-
for (const child of node.ChildNodes) {
|
|
454
|
-
const result = this.findParentNode(child, nodeToFind);
|
|
455
|
-
if (result !== null) {
|
|
456
|
-
return result;
|
|
457
|
-
}
|
|
458
|
-
}
|
|
459
|
-
return null;
|
|
460
|
-
}
|
|
461
|
-
/**
|
|
462
|
-
* Sucht einen Node gem. einem URL Pfad
|
|
463
|
-
* @param node Node in welchem gesucht werden soll
|
|
464
|
-
* @param path Pfad nach welchem gesucht wird
|
|
465
|
-
* @returns Node welcher zum gesuchten Pfad passt. Wenn kein Node gefunden wird, wird NULL zurückgegeben
|
|
466
|
-
*/
|
|
467
|
-
findSelectedNodeByPath(node, path) {
|
|
468
|
-
// Cancel wenn Pfad nicht definiert
|
|
469
|
-
if (path === undefined || path === null) {
|
|
470
|
-
return null;
|
|
471
|
-
}
|
|
472
|
-
// Pfad in Array splitten und Root Foldername setzen
|
|
473
|
-
const pathArray = path.split('/');
|
|
474
|
-
pathArray[0] = this.rootNode.Name;
|
|
475
|
-
return this.findSelectedNodeByPathArray(node, pathArray, 0);
|
|
476
|
-
}
|
|
477
|
-
/**
|
|
478
|
-
* Sucht einen Node gem. einem Array von Node Namen
|
|
479
|
-
* @param node Node in welchem gesucht werden soll
|
|
480
|
-
* @param path Array von Node Namen, welche die Hirarchy des Pfades abbilden
|
|
481
|
-
* @param index Aktueller Index im PATH Array
|
|
482
|
-
* @returns Node wenn einer gefunden wurde, ansonsten NULL
|
|
483
|
-
*/
|
|
484
|
-
findSelectedNodeByPathArray(node, path, index) {
|
|
485
|
-
// Check ob Ordner korrekt. Letzer Ordner zurückgeben. Path Last Index ist der Filename
|
|
486
|
-
if (node.Name === path[index] && path.length - 2 === index) {
|
|
487
|
-
return node;
|
|
488
|
-
}
|
|
489
|
-
else if (node.Name === path[index]) {
|
|
490
|
-
// Expand Node
|
|
491
|
-
node.IsExpanded = true;
|
|
492
|
-
for (const item of node.ChildNodes) {
|
|
493
|
-
const result = this.findSelectedNodeByPathArray(item, path, index + 1);
|
|
494
|
-
if (result !== null) {
|
|
495
|
-
return result;
|
|
496
|
-
}
|
|
497
|
-
}
|
|
498
|
-
}
|
|
499
|
-
return null;
|
|
500
|
-
}
|
|
501
|
-
/**
|
|
502
|
-
* Rekursive Methode welche beim Node und all seinen Childs den Edit Mode beendet.
|
|
503
|
-
* @param node Node bei welchem der Edit Mode beendet werden soll
|
|
504
|
-
*/
|
|
505
|
-
resetNodeEditMode(node) {
|
|
506
|
-
if (node === null) {
|
|
507
|
-
this.resetNodeEditMode(this.rootNode);
|
|
508
|
-
}
|
|
509
|
-
else {
|
|
510
|
-
node.IsEditMode = false;
|
|
511
|
-
if (node.ChildNodes) {
|
|
512
|
-
node.ChildNodes.forEach((itm) => this.resetNodeEditMode(itm));
|
|
513
|
-
}
|
|
514
|
-
}
|
|
515
|
-
}
|
|
516
|
-
/**
|
|
517
|
-
* Setzt den Pfad in allen Nodes
|
|
518
|
-
*/
|
|
519
|
-
setPathToAllNodes() {
|
|
520
|
-
this.rootNode.ChildNodes.forEach((itm) => {
|
|
521
|
-
this.fillPath(itm, '');
|
|
522
|
-
});
|
|
523
|
-
}
|
|
524
|
-
}
|
|
525
|
-
SacFileBrowserCommon.decorators = [
|
|
526
|
-
{ type: Directive }
|
|
527
|
-
];
|
|
528
|
-
SacFileBrowserCommon.ctorParameters = () => [
|
|
529
|
-
{ type: HttpClient },
|
|
530
|
-
{ type: Injector }
|
|
531
|
-
];
|
|
532
|
-
SacFileBrowserCommon.propDecorators = {
|
|
533
|
-
allowedtypes: [{ type: Input }],
|
|
534
|
-
allowfiledelete: [{ type: Input }],
|
|
535
|
-
allowfilerename: [{ type: Input }],
|
|
536
|
-
allowfileupload: [{ type: Input }],
|
|
537
|
-
allowfoldercreate: [{ type: Input }],
|
|
538
|
-
allowfolderdelete: [{ type: Input }],
|
|
539
|
-
allowfolderrename: [{ type: Input }],
|
|
540
|
-
apiurl: [{ type: Input }],
|
|
541
|
-
file: [{ type: Output }],
|
|
542
|
-
selectedfile: [{ type: Input }],
|
|
543
|
-
exitEditMode: [{ type: HostListener, args: ['document:click', ['$event.target'],] }]
|
|
544
|
-
};
|
|
545
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJvd3Nlci5qcyIsInNvdXJjZVJvb3QiOiJDOi9Qcm9qZWt0ZS9zaW1wbGVhbmd1bGFyY29udHJvbHMtbmcxMC9jaC5qbmV0d29yay5zYWMtY29udHJvbHMvcHJvamVjdHMvc2FjLWNvbW1vbi9zcmMvIiwic291cmNlcyI6WyJjb21wb25lbnRzL2Jyb3dzZXIvYnJvd3Nlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUNMLFNBQVMsRUFDVCxZQUFZLEVBQ1osWUFBWSxFQUNaLFFBQVEsRUFDUixLQUFLLEVBRUwsTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBTXZCLE9BQU8sRUFDTCxlQUFlLEVBQ2YsdUJBQXVCLEVBQ3ZCLHdCQUF3QixFQUN4QixxQkFBcUIsRUFDckIsOEJBQThCLEdBQy9CLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUNMLHNCQUFzQixFQUN0Qiw0QkFBNEIsR0FDN0IsTUFBTSx3Q0FBd0MsQ0FBQztBQUNoRCxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQU14Rjs7R0FFRztBQUVILE1BQU0sT0FBZ0Isb0JBQW9CO0lBb0d4Qyx3QkFBd0I7SUFFeEIsdUJBQXVCO0lBRXZCOzs7O09BSUc7SUFDSCxZQUFZLFVBQXNCLEVBQUUsUUFBa0I7UUFsR3REOztXQUVHO1FBQ0ssbUJBQWMsR0FBa0IsSUFBSSxDQUFDO1FBRTdDOzs7V0FHRztRQUVJLGlCQUFZLEdBQVcsRUFBRSxDQUFDO1FBQ2pDOztXQUVHO1FBRUksb0JBQWUsR0FBWSxJQUFJLENBQUM7UUFDdkM7O1dBRUc7UUFFSSxvQkFBZSxHQUFZLElBQUksQ0FBQztRQUN2Qzs7V0FFRztRQUVJLG9CQUFlLEdBQVksSUFBSSxDQUFDO1FBQ3ZDOztXQUVHO1FBRUksc0JBQWlCLEdBQVksSUFBSSxDQUFDO1FBQ3pDOztXQUVHO1FBRUksc0JBQWlCLEdBQVks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QUM7YUFDL0Q7U0FDRjtJQUNILENBQUM7SUFFRDs7T0FFRztJQUNLLGlCQUFpQjtRQUN2QixJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUN2QyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN6QixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7OztZQTNxQkYsU0FBUzs7O1lBbkNELFVBQVU7WUFLakIsUUFBUTs7OzJCQW1EUCxLQUFLOzhCQUtMLEtBQUs7OEJBS0wsS0FBSzs4QkFLTCxLQUFLO2dDQUtMLEtBQUs7Z0NBS0wsS0FBSztnQ0FLTCxLQUFLO3FCQUtMLEtBQUs7bUJBS0wsTUFBTTsyQkE0RU4sS0FBSzsyQkFxRkwsWUFBWSxTQUFDLGdCQUFnQixFQUFFLENBQUMsZUFBZSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHtcclxuICBEaXJlY3RpdmUsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIEhvc3RMaXN0ZW5lcixcclxuICBJbmplY3RvcixcclxuICBJbnB1dCxcclxuICBPbkluaXQsXHJcbiAgT3V0cHV0LFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IElTYWNGaWxlQnJvd3NlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL0lTYWNGaWxlQnJvd3NlclNlcnZpY2UnO1xyXG5pbXBvcnQgeyBJU2FjSWNvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL0lTYWNJY29uU2VydmljZSc7XHJcbmltcG9ydCB7IElTYWNMb2NhbGlzYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9JU2FjTG9jYWxpc2F0aW9uU2VydmljZSc7XHJcbmltcG9ydCB7IElTYWNWYWxpZGF0aW9uS2V5U2VydmljZSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvSVNhY1ZhbGlkYXRpb25LZXlTZXJ2aWNlJztcclxuaW1wb3J0IHtcclxuICBTQUNJQ09OX1NFUlZJQ0UsXHJcbiAgU0FDTE9DQUxJU0FUSU9OX1NFUlZJQ0UsXHJcbiAgU0FDVkFMSURBVElPTktFWV9TRVJWSUNFLFxyXG4gIFNhY0RlZmF1bHRJY29uU2VydmljZSxcclxuICBTYWNEZWZhdWx0VmFsaWRhdGlvbktleVNlcnZpY2UsXHJcbn0gZnJvbSAnLi4vLi4vc2VydmljZXMnO1xyXG5pbXBvcnQge1xyXG4gIFNBQ0ZJTEVCUk9XU0VSX1NFUlZJQ0UsXHJcbiAgU2FjRGVmYXVsdEZpbGVCcm93c2VyU2VydmljZSxcclxufSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9zYWMtZmlsZWJyb3dzZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IFNhY0RlZmF1bHRMb2NhbGlzYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvc2FjLWxvY2FsaXNhdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgSUJyb3dzZXJGaWxlIH0gZnJvbSAnLi9tb2RlbHMvYnJvd3NlcmZpbGUnO1xyXG5pbXBvcnQgeyBJQnJvd3NlckZpbGVSZXNwb25zZSB9IGZyb20gJy4vbW9kZWxzL2Jyb3dzZXJmaWxlcmVzcG9uc2UnO1xyXG5pbXBvcnQgeyBJQnJvd3Nlck5vZGUgfSBmcm9tICcuL21vZGVscy9icm93c2Vybm9kZSc7XHJcbmltcG9ydCB7IElCcm93c2VyTm9kZVJlc3BvbnNlIH0gZnJvbSAnLi9tb2RlbHMvYnJvd3Nlcm5vZGVyZXNwb25zZSc7XHJcblxyXG4vKipcclxuICogQmFzZSBDb21wb25lbnQgZsO8ciBGaWxlIEJyb3dzZXJcclxuICovXHJcbkBEaXJlY3RpdmUoKVxyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgU2FjRmlsZUJyb3dzZXJDb21tb24gaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIC8vICNyZWdpb24gUHJvcGVydGllc1xyXG5cclxuICAvKipcclxuICAgKiBTZXJ2aWNlIGbDvHIgRmlsZSBCcm93c2VyIFp1Z3JpZmYgKEJhY2tlbmQpXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBicm93c2VyU2VydmljZTogSVNhY0ZpbGVCcm93c2VyU2VydmljZTtcclxuICAvKipcclxuICAgKiBJY29uIHNlcnZpY2UgdG8gcmVjZWl2ZSBpY29uIGNsYXNzZXMgZm9yIHVpXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBpY29uU2VydmljZTogSVNhY0ljb25TZXJ2aWNlO1xyXG4gIC8qKlxyXG4gICAqIEZpbGUgd2VsY2hlcyBiZWltIHN0YXJ0ZW4gZGVzIEJyb3dzZXJzIGJlcmVpdHMgc2VsZWt0aWVydCBpc3RcclxuICAgKi9cclxuICBwcml2YXRlIHByZXNlbGVjZWRmaWxlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgLyoqXHJcbiAgICogRXJsYXVidGUgRGF0ZWllcndlaXRlcnVuZ2VuIGbDvHIgRmlsZWF1c3dhaGwgdW5kIFVwbG9hZC4gRGF0ZWllcndlaXRlcnVuZyBtaXQgUHVua3QgdW5kXHJcbiAgICogZ2V0cmVubnQgZHVyY2ggS29tbWEgZsO8ciBtZWhyIGFscyBlaW5lIEVyd2VpdGVydW5nIChFeGFtcGxlOiBcIi5qcGcsLmdpZlwiKVxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGFsbG93ZWR0eXBlczogc3RyaW5nID0gJyc7XHJcbiAgLyoqXHJcbiAgICogRXJsYXVidCBkYXMgbMO2c2NoZW4gZWluZXIgRGF0ZWlcclxuICAgKi9cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBhbGxvd2ZpbGVkZWxldGU6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIC8qKlxyXG4gICAqIEVybGF1YnQgZGFzIHVtYmVuZW5uZW4gZWluZXIgRGF0ZWlcclxuICAgKi9cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBhbGxvd2ZpbGVyZW5hbWU6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIC8qKlxyXG4gICAqIEVybGF1YnQgZGVuIFVwbG9hZCB2b24gRGF0ZWllblxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGFsbG93ZmlsZXVwbG9hZDogYm9vbGVhbiA9IHRydWU7XHJcbiAgLyoqXHJcbiAgICogRXJsYXVidCBkYXMgZXJzdGVsbGVuIGVpbmVzIG5ldWVuIE9yZG5lcnNcclxuICAgKi9cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBhbGxvd2ZvbGRlcmNyZWF0ZTogYm9vbGVhbiA9IHRydWU7XHJcbiAgLyoqXHJcbiAgICogRXJsYXVidCBkYXMgbMO2c2NoZW4gZWluZXMgT3JkbmVyc1xyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGFsbG93Zm9sZGVyZGVsZXRlOiBib29sZWFuID0gdHJ1ZTtcclxuICAvKipcclxuICAgKiBFcmxhdWJ0IGRhcyBVbWJlbmVubmVuIGVpbmVzIE9yZG5lcnNcclxuICAgKi9cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBhbGxvd2ZvbGRlcnJlbmFtZTogYm9vbGVhbiA9IHRydWU7XHJcbiAgLyoqXHJcbiAgICogVVJMIGbDvHIgQmFja2VuZCBBUElcclxuICAgKi9cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBhcGl1cmw6IHN0cmluZztcclxuICAvKipcclxuICAgKiBPdXRwdXQgRW1pdHRlciB3ZW5uIEZpbGUgc2VsZWt0aWVydCB3aXJkLlxyXG4gICAqL1xyXG4gIEBPdXRwdXQoKVxyXG4gIHB1YmxpYyBmaWxlOiBFdmVudEVtaXR0ZXI8c3RyaW5nPiA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xyXG5cclxuICAvKipcclxuICAgKiBTZXJ2aWNlIGbDvHIgRXJyb3IgTG9jYWxpc2F0aW9uXHJcbiAgICovXHJcbiAgcHVibGljIGxuZ1Jlc291cmNlU2VydmljZTogSVNhY0xvY2FsaXNhdGlvblNlcnZpY2U7XHJcbiAgLyoqXHJcbiAgICogUm9vdCBOb2RlIEl0ZW0gZsO8ciBUcmVlXHJcbiAgICovXHJcbiAgcHVibGljIHJvb3ROb2RlOiBJQnJvd3Nlck5vZGUgPSB7XHJcbiAgICBOYW1lOiAnJyxcclxuICAgIENoaWxkTm9kZXM6IFtdLFxyXG4gICAgRmlsZXM6IFtdLFxyXG4gICAgSXNFeHBhbmRlZDogdHJ1ZSxcclxuICAgIElzRWRpdE1vZGU6IGZhbHNlLFxyXG4gICAgSXNOZXdOb2RlOiBmYWxzZSxcclxuICAgIFBhdGg6ICcnLFxyXG4gIH07XHJcbiAgLyoqXHJcbiAgICogU2VsZWN0ZWQgRmlsZSBOYW1lXHJcbiAgICovXHJcbiAgcHVibGljIHNlbGVjdGVkRmlsZTogc3RyaW5nO1xyXG4gIC8qKlxyXG4gICAqIFNlbGVjdGVkIEZpbGUgSXRlbVxyXG4gICAqL1xyXG4gIHB1YmxpYyBzZWxlY3RlZEZpbGVJdGVtOiBJQnJvd3NlckZpbGUgPSBudWxsO1xyXG4gIC8qKlxyXG4gICAqIFNlbGVjdGVkIE5vZGUgSXRlbVxyXG4gICAqL1xyXG4gIHB1YmxpYyBzZWxlY3RlZE5vZGU6IElCcm93c2VyTm9kZSA9IG51bGw7XHJcbiAgLyoqXHJcbiAgICogTGlzdGUgdm9uIFVwbG9hZHNcclxuICAgKi9cclxuICBwdWJsaWMgdXBsb2Fkczogc3RyaW5nW10gPSBbXTtcclxuICAvKipcclxuICAgKiBTZXJ2aWNlIHRvIHJlY2VpdmUgc3RhbmRhcmQgdmFsaWRhdGlvbiBtZXNzYWdlIGtleXMgYW5kIHRleHRzXHJcbiAgICovXHJcbiAgcHVibGljIHZhbGlkYXRpb25LZXlTZXJ2aWNlOiBJU2FjVmFsaWRhdGlvbktleVNlcnZpY2U7XHJcblxyXG4gIC8vICNlbmRyZWdpb24gUHJvcGVydGllc1xyXG5cclxuICAvLyAjcmVnaW9uIENvbnN0cnVjdG9yc1xyXG5cclxuICAvKipcclxuICAgKiBLb25zdHJ1a3RvclxyXG4gICAqIEBwYXJhbSBodHRwY2xpZW50IEFuZ3VsYXIgSFRUUCBDbGllbnRcclxuICAgKiBAcGFyYW0gaW5qZWN0b3IgU2VydmljZSBJbmplY3RvclxyXG4gICAqL1xyXG4gIGNvbnN0cnVjdG9yKGh0dHBjbGllbnQ6IEh0dHBDbGllbnQsIGluamVjdG9yOiBJbmplY3Rvcikge1xyXG4gICAgdGhpcy5icm93c2VyU2VydmljZSA9IGluamVjdG9yLmdldChcclxuICAgICAgU0FDRklMRUJST1dTRVJfU0VSVklDRSxcclxuICAgICAgbmV3IFNhY0RlZmF1bHRGaWxlQnJvd3NlclNlcnZpY2UoaHR0cGNsaWVudClcclxuICAgICk7XHJcbiAgICB0aGlzLnZhbGlkYXRpb25LZXlTZXJ2aWNlID0gaW5qZWN0b3IuZ2V0KFxyXG4gICAgICBTQUNWQUxJREFUSU9OS0VZX1NFUlZJQ0UsXHJcbiAgICAgIG5ldyBTYWNEZWZhdWx0VmFsaWRhdGlvbktleVNlcnZpY2UoKVxyXG4gICAgKTtcclxuICAgIHRoaXMubG5nUmVzb3VyY2VTZXJ2aWNlID0gaW5qZWN0b3IuZ2V0KFxyXG4gICAgICBTQUNMT0NBTElTQVRJT05fU0VSVklDRSxcclxuICAgICAgbmV3IFNhY0RlZmF1bHRMb2NhbGlzYXRpb25TZXJ2aWNlKHRoaXMudmFsaWRhdGlvbktleVNlcnZpY2UpXHJcbiAgICApO1xyXG5cclxuICAgIHRoaXMuaWNvblNlcnZpY2UgPSBpbmplY3Rvci5nZXQoXHJcbiAgICAgIFNBQ0lDT05fU0VSVklDRSxcclxuICAgICAgbmV3IFNhY0RlZmF1bHRJY29uU2VydmljZSgpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLy8gI2VuZHJlZ2lvbiBDb25zdHJ1Y3RvcnNcclxuXHJcbiAgLy8gI3JlZ2lvbiBQdWJsaWMgR2V0dGVycyBBbmQgU2V0dGVyc1xyXG5cclxuICAvKipcclxuICAgKiBTZXR6dCBkZW4gU2VsZWNlZCBOb2RlIMO8YmVyIGRlbiBQZmFkXHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgc2V0IHNlbGVjdGVkZmlsZSh2OiBzdHJpbmcgfCBudWxsKSB7XHJcbiAgICBjb25zdCBzZWxlY3RlZG5vZGUgPSB0aGlzLmZpbmRTZWxlY3RlZE5vZGVCeVBhdGgodGhpcy5yb290Tm9kZSwgdik7XHJcblxyXG4gICAgaWYgKHNlbGVjdGVkbm9kZSAhPT0gbnVsbCkge1xyXG4gICAgICB0aGlzLnNlbGVjdE5vZGUoc2VsZWN0ZWRub2RlKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnByZXNlbGVjZWRmaWxlID0gdjtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENTUyBpY29uIGNsYXNzIGZvciBkZWxldGUgaWNvblxyXG4gICAqIEByZXR1cm5zIGNzcyBjbGFzcyB3aXRoIGljb25cclxuICAgKi9cclxuICBwdWJsaWMgZ2V0IGljb25EZWxldGUoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmljb25TZXJ2aWNlLkJyb3dzZXJDb21wb25lbnREZWxldGVJY29uO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ1NTIGljb24gY2xhc3MgZm9yIGVkaXQgaWNvblxyXG4gICAqIEByZXR1cm5zIGNzcyBjbGFzcyB3aXRoIGljb25cclxuICAgKi9cclxuICBwdWJsaWMgZ2V0IGljb25FZGl0KCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5pY29uU2VydmljZS5Ccm93c2VyQ29tcG9uZW50RWRpdEljb247XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDU1MgaWNvbiBmb3IgZm9sZGVycyBpbiB0cmVlIHRoZXJlIGFyZSBjb2xsYWJzZWRcclxuICAgKiBAcmV0dXJucyBjc3MgY2xhc3Mgd2l0aCBpY29uXHJcbiAgICovXHJcbiAgcHVibGljIGdldCBpY29uRm9sZGVyQ29sbGFic2VkKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5pY29uU2VydmljZS5Ccm93c2VyQ29tcG9uZW50Rm9sZGVyQ2xvc2VkSWNvbjtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENTUyBpY29uIGNsYXNzIGZvciBmb2xkZXJzIHdpdGhvdXQgc3ViZm9sZGVyc1xyXG4gICAqIEByZXR1cm5zIGNzcyBjbGFzcyB3aXRoIGljb25cclxuICAgKi9cclxuICBwdWJsaWMgZ2V0IGljb25Gb2xkZXJFbXB0eSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuaWNvblNlcnZpY2UuQnJvd3NlckNvbXBvbmVudEZvbGRlckVtcHR5SWNvbjtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENTUyBpY29uIGZvciBuZXcgZm9sZGVycyBhY3Rpb25cclxuICAgKiBAcmV0dXJucyBjc3MgY2xhc3Mgd2l0aCBpY29uXHJcbiAgICovXHJcbiAgcHVibGljIGdldCBpY29uRm9sZGVyTmV3KCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5pY29uU2VydmljZS5Ccm93c2VyQ29tcG9uZW50Rm9sZGVyTmV3SWNvbjtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENTUyBpY29uIGZvciBmb2xkZXJzIGluIHRyZWUgdGhlcmUgYXJlIGV4cGFuZGVkXHJcbiAgICogQHJldHVybnMgY3NzIGNsYXNzIHdpdGggaWNvblxyXG4gICAqL1xyXG4gIHB1YmxpYyBnZXQgaWNvbkZvbGRlck9wZW4oKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmljb25TZXJ2aWNlLkJyb3dzZXJDb21wb25lbnRGb2xkZXJPcGVuSWNvbjtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENTUyBpY29uIGNsYXNzIGZvciByZWZyZXNoIGljb25cclxuICAgKiBAcmV0dXJucyBjc3MgY2xhc3Mgd2l0aCBpY29uXHJcbiAgICovXHJcbiAgcHVibGljIGdldCBpY29uUmVmcmVzaCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuaWNvblNlcnZpY2UuQnJvd3NlckNvbXBvbmVudFJlZnJlc2hJY29uO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0dGVyIGbDvHIgU2VsZWN0ZWQgRmlsZS4gSXN0IGFuIElucHV0IFByb3BlcnR5IGdlYnVuZGVuXHJcbiAgICovXHJcbiAgcHVibGljIGdldCBzZWxlY3RlZGZpbGUoKTogc3RyaW5nIHwgbnVsbCB7XHJcbiAgICBpZiAodGhpcy5zZWxlY3RGaWxlICYmIHRoaXMuc2VsZWN0RmlsZS5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnNlbGVjdGVkRmlsZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gI2VuZHJlZ2lvbiBQdWJsaWMgR2V0dGVycyBBbmQgU2V0dGVyc1xyXG5cclxuICAvLyAjcmVnaW9uIFB1YmxpYyBNZXRob2RzXHJcblxyXG4gIC8qKlxyXG4gICAqIEhvc3RMaXN0ZW5lciB3ZWxjaGVyIGRlbiBFZGl0IE1vZGUgYmVpIGFsbGVuIEZpbGVzIHVuZCBOb2RlcyBiZWVuZGV0LlxyXG4gICAqL1xyXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJywgWyckZXZlbnQudGFyZ2V0J10pXHJcbiAgLyoqXHJcbiAgICogQ2xpY2sgRXZlbnRcclxuICAgKi9cclxuICBwdWJsaWMgZXhpdEVkaXRNb2RlKHRhcmdldEVsZW1lbnQpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnNlbGVjdGVkTm9kZSkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkTm9kZS5GaWxlcy5mb3JFYWNoKChpdG0pID0+IChpdG0uSXNFZGl0TW9kZSA9IGZhbHNlKSk7XHJcblxyXG4gICAgICBpZiAoXHJcbiAgICAgICAgIXRoaXMuc2VsZWN0ZWROb2RlIHx8XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZE5vZGUuTmFtZSA9PT0gbnVsbCB8fFxyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWROb2RlLk5hbWUubGVuZ3RoID09PSAwXHJcbiAgICAgICkge1xyXG4gICAgICAgIHRoaXMuY2xlYXJOZXdDaGlsZE5vZGVzKHRoaXMucm9vdE5vZGUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5yZXNldE5vZGVFZGl0TW9kZShudWxsKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEzDtnNjaHQgZWluIEZpbGVcclxuICAgKiBAcGFyYW0gZmlsZSBGaWxlIHdlbGNoZXMgZ2Vsw7ZzY2h0IHdlcmRlbiBzb2xsXHJcbiAgICovXHJcbiAgcHVibGljIGRlbGV0ZUZpbGUoZmlsZTogSUJyb3dzZXJGaWxlKTogdm9pZCB7XHJcbiAgICB0aGlzLmNvbmZpcm1EZWxldGVGaWxlKGZpbGUpLnN1YnNjcmliZSgoY29uZmlybSkgPT4ge1xyXG4gICAgICBpZiAoY29uZmlybSkge1xyXG4gICAgICAgIHRoaXMuYnJvd3NlclNlcnZpY2VcclxuICAgICAgICAgIC5EZWxldGVGaWxlKFxyXG4gICAgICAgICAgICB0aGlzLmFwaXVybCxcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZE5vZGUuUGF0aCArICcvJyArIGZpbGUuRmlsZW5hbWUsXHJcbiAgICAgICAgICAgIHRoaXMuYWxsb3dlZHR5cGVzXHJcbiAgICAgICAgICApXHJcbiAgICAgICAgICAuc3Vic2NyaWJlKChyZXN1bHQ6IElCcm93c2VyRmlsZVJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWROb2RlLkZpbGVzID0gcmVzdWx0LkZpbGVzO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTMO2c2NodCBlaW5lbiBOb2RlXHJcbiAgICogQHBhcmFtIG5vZGUgTm9kZSB3ZWxjaGVyIGdlbMO2c2NodCB3ZXJkZW4gc29sbFxyXG4gICAqL1xyXG4gIHB1YmxpYyBkZWxldGVOb2RlKG5vZGU6IElCcm93c2VyTm9kZSk6IHZvaWQge1xyXG4gICAgdGhpcy5jb25maXJtRGVsZXRlTm9kZShub2RlKS5zdWJzY3JpYmUoKGNvbmZpcm0pID0+IHtcclxuICAgICAgaWYgKGNvbmZpcm0pIHtcclxuICAgICAgICB0aGlzLmJyb3dzZXJTZXJ2aWNlXHJcbiAgICAgICAgICAuRGVsZXRlTm9kZSh0aGlzLmFwaXVybCwgbm9kZS5QYXRoKVxyXG4gICAgICAgICAgLnN1YnNjcmliZSgocmVzdWx0OiBJQnJvd3Nlck5vZGVSZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBwYXJlbnROb2RlID0gdGhpcy5maW5kUGFyZW50Tm9kZSh0aGlzLnJvb3ROb2RlLCBub2RlKTtcclxuICAgICAgICAgICAgcGFyZW50Tm9kZS5DaGlsZE5vZGVzID0gcmVzdWx0Lk5vZGUuQ2hpbGROb2RlcztcclxuXHJcbiAgICAgICAgICAgIHRoaXMucm9vdE5vZGUuQ2hpbGROb2Rlcy5mb3JFYWNoKChpdG0pID0+IHtcclxuICAgICAgICAgICAgICB0aGlzLmZpbGxQYXRoKGl0bSwgJycpO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0Tm9kZShwYXJlbnROb2RlKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHp0IGVpbiBGaWxlIGluIGRlbiBFZGl0IE1vZGVcclxuICAgKiBAcGFyYW0gZmlsZSBGaWxlIHdlbGNoZXMgaW4gZGVuIEVkaXQgTW9kZSBnZXNldHp0IHdlcmRlbiBzb2xsXHJcbiAgICovXHJcbiAgcHVibGljIGVkaXRGaWxlKGZpbGU6IElCcm93c2VyRmlsZSk6IHZvaWQge1xyXG4gICAgZmlsZS5Jc0VkaXRNb2RlID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHp0IGVpbmVuIE5vZGUgaW4gZGVuIEVkaXQgTW9kZVxyXG4gICAqIEBwYXJhbSBub2RlIE5vZGUgd2VsY2hlciBiZWFyYmVpdGV0IHdlcmRlbiBzb2xsXHJcbiAgICovXHJcbiAgcHVibGljIGVkaXROb2RlKG5vZGU6IElCcm93c2VyTm9kZSk6IHZvaWQge1xyXG4gICAgbm9kZS5Jc0VkaXRNb2RlID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEVyemV1Z3QgZWluZW4gbmV1ZW4gTm9kZSBpbSBUcmVlXHJcbiAgICogQHBhcmFtIG5vZGUgTm9kZSB1bnRlciB3ZWxjaGVtIGVpbiBuZXVlciBOb2RlIGVyc3RlbGx0IHdlcmRlbiBzb2xsXHJcbiAgICovXHJcbiAgcHVibGljIG5ld05vZGUobm9kZTogSUJyb3dzZXJOb2RlKSB7XHJcbiAgICBjb25zdCBpdGVtOiBJQnJvd3Nlck5vZGUgPSB7XHJcbiAgICAgIENoaWxkTm9kZXM6IFtdLFxyXG4gICAgICBGaWxlczogW10sXHJcbiAgICAgIElzRWRpdE1vZGU6IGZhbHNlLFxyXG4gICAgICBJc0V4cGFuZGVkOiBmYWxzZSxcclxuICAgICAgTmFtZTogJycsXHJcbiAgICAgIFBhdGg6IG5vZGUuUGF0aCxcclxuICAgICAgSXNOZXdOb2RlOiB0cnVlLFxyXG4gICAgfTtcclxuXHJcbiAgICBub2RlLkNoaWxkTm9kZXMucHVzaChpdGVtKTtcclxuICAgIHRoaXMuc2VsZWN0Tm9kZShpdGVtKTtcclxuICAgIHRoaXMuZWRpdE5vZGUoaXRlbSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBJbml0IEV2ZW50IGRlciBLb21wb25lbnRlXHJcbiAgICovXHJcbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5icm93c2VyU2VydmljZVxyXG4gICAgICAuR2V0Tm9kZSh0aGlzLmFwaXVybCwgJycsIHRoaXMuYWxsb3dlZHR5cGVzKVxyXG4gICAgICAuc3Vic2NyaWJlKChyZXN1bHQ6IElCcm93c2VyTm9kZVJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgdGhpcy5yb290Tm9kZSA9IHtcclxuICAgICAgICAgIE5hbWU6IHJlc3VsdC5Ob2RlLk5hbWUsXHJcbiAgICAgICAgICBGaWxlczogcmVzdWx0Lk5vZGUuRmlsZXMsXHJcbiAgICAgICAgICBDaGlsZE5vZGVzOiByZXN1bHQuTm9kZS5DaGlsZE5vZGVzLFxyXG4gICAgICAgICAgSXNFeHBhbmRlZDogdHJ1ZSxcclxuICAgICAgICAgIElzRWRpdE1vZGU6IGZhbHNlLFxyXG4gICAgICAgICAgSXNOZXdOb2RlOiBmYWxzZSxcclxuICAgICAgICAgIFBhdGg6ICcvJyxcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB0aGlzLnNldFBhdGhUb0FsbE5vZGVzKCk7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZE5vZGUgPSB0aGlzLnJvb3ROb2RlO1xyXG5cclxuICAgICAgICAvLyBTZWxlY3RlZCBGaWxlIGVybmV1dCBzZXR6ZW4sIHdlbm4gUHJvcGVydHkgZ2VzZXR6dCB3dXJkZSBiZXZvciBEYXRlbiB2b20gU2VydmljZSBnZWxhZGVuIHd1cmRlbi5cclxuICAgICAgICBpZiAodGhpcy5wcmVzZWxlY2VkZmlsZSAhPT0gbnVsbCAmJiB0aGlzLnByZXNlbGVjZWRmaWxlLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRmaWxlID0gdGhpcy5wcmVzZWxlY2VkZmlsZTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQWt0dWFsaXNpZXJ0IGRlbiBOb2RlXHJcbiAgICovXHJcbiAgcHVibGljIHJlZnJlc2hOb2RlKG5vZGU6IElCcm93c2VyTm9kZSk6IHZvaWQge1xyXG4gICAgaWYgKCFub2RlLklzRXhwYW5kZWQpIHtcclxuICAgICAgdGhpcy5zd2l0Y2hFeHBhbmROb2RlKG5vZGUpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuYnJvd3NlclNlcnZpY2VcclxuICAgICAgLkdldE5vZGUodGhpcy5hcGl1cmwsIG5vZGUuUGF0aCwgdGhpcy5hbGxvd2VkdHlwZXMpXHJcbiAgICAgIC5zdWJzY3JpYmUoKHJlc3VsdDogSUJyb3dzZXJOb2RlUmVzcG9uc2UpID0+IHtcclxuICAgICAgICBub2RlLkNoaWxkTm9kZXMgPSByZXN1bHQuTm9kZS5DaGlsZE5vZGVzO1xyXG4gICAgICAgIG5vZGUuRmlsZXMgPSByZXN1bHQuTm9kZS5GaWxlcztcclxuXHJcbiAgICAgICAgdGhpcy5zZXRQYXRoVG9BbGxOb2RlcygpO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE1ldGhvZGUgd2VubiBlaW5lIERhdGVpIHVtYmVuYW5udCB3ZXJkZW4gc29sbFxyXG4gICAqIEBwYXJhbSBmaWxlIEZpbGUgd2VsY2hlcyB1bWJlbmFubnQgd2VyZGVuIHNvbGxcclxuICAgKiBAcGFyYW0gbmV3RmlsZW5hbWUgTmV1ZXIgRGF0ZWluYW1lXHJcbiAgICovXHJcbiAgcHVibGljIHJlbmFtZUZpbGUoZmlsZTogSUJyb3dzZXJGaWxlLCBuZXdGaWxlbmFtZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBmaWxlLklzRWRpdE1vZGUgPSBmYWxzZTtcclxuXHJcbiAgICBpZiAoIW5ld0ZpbGVuYW1lIHx8IG5ld0ZpbGVuYW1lID09PSBudWxsIHx8IG5ld0ZpbGVuYW1lLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAvLyBDYW5jZWwsIEludmFsaWQgRmlsZW5hbWVcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChmaWxlLkZpbGVuYW1lICE9PSBuZXdGaWxlbmFtZSkge1xyXG4gICAgICB0aGlzLmJyb3dzZXJTZXJ2aWNlXHJcbiAgICAgICAgLlJlbmFtZUZpbGUoXHJcbiAgICAgICAgICB0aGlzLmFwaXVybCxcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWROb2RlLlBhdGggKyAnLycgKyBmaWxlLkZpbGVuYW1lLFxyXG4gICAgICAgICAgbmV3RmlsZW5hbWUsXHJcbiAgICAgICAgICB0aGlzLmFsbG93ZWR0eXBlc1xyXG4gICAgICAgIClcclxuICAgICAgICAuc3Vic2NyaWJlKChyZXN1bHQ6IElCcm93c2VyRmlsZVJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkTm9kZS5GaWxlcyA9IHJlc3VsdC5GaWxlcztcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE1ldGhvZGUgd2VubiBlaW4gTm9kZSB1bWJlbmFubnQgd2VyZGVuIHNvbGxcclxuICAgKiBAcGFyYW0gbm9kZSBOb2RlIHdlbGNoZXIgdW1iZW5hbm50IHdlcmRlbiBzb2xsXHJcbiAgICogQHBhcmFtIG5ld0ZvbGRlcm5hbWUgTmV1ZXIgT3JkbmVybmFtZVxyXG4gICAqL1xyXG4gIHB1YmxpYyByZW5hbWVOb2RlKG5vZGU6IElCcm93c2VyTm9kZSwgbmV3Rm9sZGVybmFtZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBub2RlLklzRWRpdE1vZGUgPSBmYWxzZTtcclxuXHJcbiAgICBpZiAoIW5vZGUuSXNOZXdOb2RlKSB7XHJcbiAgICAgIGlmIChcclxuICAgICAgICAhbmV3Rm9sZGVybmFtZSB8fFxyXG4gICAgICAgIG5ld0ZvbGRlcm5hbWUgPT09IG51bGwgfHxcclxuICAgICAgICBuZXdGb2xkZXJuYW1lLmxlbmd0aCA9PT0gMFxyXG4gICAgICApIHtcclxuICAgICAgICAvLyBDYW5jZWwgUmVuYW1lLiBJbnZhbGlkIEZvbGRlcm5hbWVcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChub2RlLk5hbWUgIT09IG5ld0ZvbGRlcm5hbWUpIHtcclxuICAgICAgICB0aGlzLmJyb3dzZXJTZXJ2aWNlXHJcbiAgICAgICAgICAuUmVuYW1lTm9kZSh0aGlzLmFwaXVybCwgbm9kZS5QYXRoLCBuZXdGb2xkZXJuYW1lKVxyXG4gICAgICAgICAgLnN1YnNjcmliZSgocmVzdWx0OiBJQnJvd3Nlck5vZGVSZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgICBub2RlLk5hbWUgPSByZXN1bHQuTm9kZS5OYW1lO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5zZXRQYXRoVG9BbGxOb2RlcygpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmIChcclxuICAgICAgICAhbmV3Rm9sZGVybmFtZSB8fFxyXG4gICAgICAgIG5ld0ZvbGRlcm5hbWUgPT09IG51bGwgfHxcclxuICAgICAgICBuZXdGb2xkZXJuYW1lLmxlbmd0aCA9PT0gMFxyXG4gICAgICApIHtcclxuICAgICAgICB0aGlzLmNsZWFyTmV3Q2hpbGROb2Rlcyh0aGlzLnJvb3ROb2RlKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIG5vZGUuTmFtZSA9IG5ld0ZvbGRlcm5hbWU7XHJcbiAgICAgIG5vZGUuSXNOZXdOb2RlID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuYnJvd3NlclNlcnZpY2VcclxuICAgICAgICAuU2F2ZU5vZGUodGhpcy5hcGl1cmwsIG5vZGUuUGF0aCwgbmV3Rm9sZGVybmFtZSlcclxuICAgICAgICAuc3Vic2NyaWJlKChyZXN1bHQ6IElCcm93c2VyTm9kZVJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICBub2RlLk5hbWUgPSByZXN1bHQuTm9kZS5OYW1lO1xyXG4gICAgICAgICAgbm9kZS5GaWxlcyA9IHJlc3VsdC5Ob2RlLkZpbGVzO1xyXG5cclxuICAgICAgICAgIHRoaXMuc2V0UGF0aFRvQWxsTm9kZXMoKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE1ldGhvZGUgd2VubiBlaW4gRmlsZSBzZWxla3RpZXJ0IHdpcmRcclxuICAgKiBAcGFyYW0gZmlsZSBGaWxlIHdlbGNoZXMgc2VsZWt0aWVydCB3aXJkXHJcbiAgICovXHJcbiAgcHVibGljIHNlbGVjdEZpbGUoZmlsZTogSUJyb3dzZXJGaWxlKSB7XHJcbiAgICBpZiAoIWZpbGUuSXNFZGl0TW9kZSkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkTm9kZS5GaWxlcy5mb3JFYWNoKChpdG0pID0+IChpdG0uSXNFZGl0TW9kZSA9IGZhbHNlKSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkTm9kZS5QYXRoLmVuZHNXaXRoKCcvJykpIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZEZpbGUgPSB0aGlzLnNlbGVjdGVkTm9kZS5QYXRoICsgJy8nICsgZmlsZS5GaWxlbmFtZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRGaWxlID0gJy8nICsgZmlsZS5GaWxlbmFtZTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnNlbGVjdGVkRmlsZUl0ZW0gPSBmaWxlO1xyXG4gICAgdGhpcy5maWxlLmVtaXQodGhpcy5zZWxlY3RlZEZpbGUpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTWV0aG9kZSB3ZW5uIGVpbiBOb2RlIHNlbGVrdGllcnQgd2lyZFxyXG4gICAqIEBwYXJhbSBub2RlIE5vZGUgd2VsY2hlciBzZWxla3RpZXJ0IHdlcmRlbiBzb2xsXHJcbiAgICovXHJcbiAgcHVibGljIHNlbGVjdE5vZGUobm9kZTogSUJyb3dzZXJOb2RlKTogdm9pZCB7XHJcbiAgICBpZiAoIW5vZGUuSXNFeHBhbmRlZCkge1xyXG4gICAgICB0aGlzLnN3aXRjaEV4cGFuZE5vZGUobm9kZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUmVzZXQgdGhlIEVkaXQgTW9kZSBpbiBhbGwgTm9kZXNcclxuICAgIHRoaXMucmVzZXROb2RlRWRpdE1vZGUobnVsbCk7XHJcblxyXG4gICAgaWYgKCFub2RlLkZpbGVzKSB7XHJcbiAgICAgIHRoaXMuYnJvd3NlclNlcnZpY2VcclxuICAgICAgICAuR2V0RmlsZXModGhpcy5hcGl1cmwsIG5vZGUuUGF0aCwgdGhpcy5hbGxvd2VkdHlwZXMpXHJcbiAgICAgICAgLnN1YnNjcmliZSgocmVzdWx0OiBJQnJvd3NlckZpbGVSZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgbm9kZS5GaWxlcyA9IHJlc3VsdC5GaWxlcztcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWROb2RlID0gbm9kZTtcclxuXHJcbiAgICAgICAgICBpZiAodGhpcy5wcmVzZWxlY2VkZmlsZSAhPT0gbnVsbCAmJiB0aGlzLnByZXNlbGVjZWRmaWxlLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgY29uc3QgZmlsZW5hbWUgPSB0aGlzLnByZXNlbGVjZWRmaWxlLnN1YnN0cmluZyhcclxuICAgICAgICAgICAgICB0aGlzLnByZXNlbGVjZWRmaWxlLmxhc3RJbmRleE9mKCcvJykgKyAxXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIGNvbnN0IGZpbGUgPSBub2RlLkZpbGVzLmZpbmQoKGl0bSkgPT4gaXRtLkZpbGVuYW1lID09PSBmaWxlbmFtZSk7XHJcbiAgICAgICAgICAgIGlmIChmaWxlKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5zZWxlY3RGaWxlKGZpbGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkTm9kZSA9IG5vZGU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFeHBhbmQvQ29sbGFic2UgTWV0aG9kZSBmw7xyIE5vZGVzXHJcbiAgICogQHBhcmFtIG5vZGUgTm9kZSB3ZWxjaGVyIGdlw7ZmZm5ldCBvZGVyIGdlc2NobG9zc2VuIHdlcmRlbiBzb2xsXHJcbiAgICovXHJcbiAgcHVibGljIHN3aXRjaEV4cGFuZE5vZGUobm9kZTogSUJyb3dzZXJOb2RlKTogdm9pZCB7XHJcbiAgICBpZiAobm9kZS5Jc0V4cGFuZGVkKSB7XHJcbiAgICAgIG5vZGUuSXNFeHBhbmRlZCA9IGZhbHNlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbm9kZS5Jc0V4cGFuZGVkID0gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE1ldGhvZGUgZGllIEF1ZmdlcnVmZW4gd2VyZGVuIG11c3MsIHdlbm4gZWluIFVwbG9hZCBiZWVuZGV0IGlzdC5cclxuICAgKiBAcGFyYW0gcGFyYW0gUGFyYW1ldGVyIGRlcyBob2NoZ2VsYWRlbmVuIEZpbGVzXHJcbiAgICovXHJcbiAgcHVibGljIHVwbG9hZENvbXBsZXRlKG5vZGU6IElCcm93c2VyTm9kZSwgdXBsb2FkSWRMaXN0OiBzdHJpbmdbXSk6IHZvaWQge1xyXG4gICAgaWYgKHVwbG9hZElkTGlzdCAhPT0gbnVsbCkge1xyXG4gICAgICB1cGxvYWRJZExpc3QuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLnVwbG9hZHMuaW5kZXhPZihlbGVtZW50KSA8IDApIHtcclxuICAgICAgICAgIHRoaXMudXBsb2Fkcy5wdXNoKGVsZW1lbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgaWQgPSB0aGlzLnVwbG9hZHMucG9wKCk7XHJcbiAgICBpZiAoaWQpIHtcclxuICAgICAgdGhpcy5icm93c2VyU2VydmljZVxyXG4gICAgICAgIC5TYXZlRmlsZSh0aGlzLmFwaXVybCwgbm9kZS5QYXRoLCBpZCwgdGhpcy5hbGxvd2VkdHlwZXMpXHJcbiAgICAgICAgLnN1YnNjcmliZSgocmVzdWx0OiBJQnJvd3NlckZpbGVSZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZE5vZGUuRmlsZXMgPSByZXN1bHQuRmlsZXM7XHJcbiAgICAgICAgICB0aGlzLnVwbG9hZGVkRmlsZU1vdmVkKGlkKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vICNlbmRyZWdpb24gUHVibGljIE1ldGhvZHNcclxuXHJcbiAgLy8gI3JlZ2lvbiBQdWJsaWMgQWJzdHJhY3QgTWV0aG9kc1xyXG5cclxuICAvKipcclxuICAgKiBBYnN0cmFrdGUgQ29uZmlybSBNZXRob2RlIHdlbGNoZSBpbXBsZW1lbnRpZXJ0IHdlcmRlbiBtdXNzLiBNZXRob2RlIHdpcmQgYXVmZ2VydWZlbiwgd2VubiBlaW5lXHJcbiAgICogRGF0ZWkgZ2Vsw7ZzY2h0IHdlcmRlbiBzb2xsLlxyXG4gICAqIEBwYXJhbSBmaWxlIEZpbGUgZsO8ciB3ZWxjaGVzIGVpbiBEZWxldGUgQ29uZmlybSBlaW5nZWZvcmRlcnQgd2VyZGVuIHNvbGxcclxuICAgKi9cclxuICBwdWJsaWMgYWJzdHJhY3QgY29uZmlybURlbGV0ZUZpbGUoZmlsZTogSUJyb3dzZXJGaWxlKTogT2JzZXJ2YWJsZTxib29sZWFuPjtcclxuICAvKipcclxuICAgKiBBYnN0cmFrdGUgQ29uZmlybSBNZXRob2RlIHdlbGNoZSBpbXBsZW1lbnRpZXJ0IHdlcmRlbiBtdXNzLiBNZXRob2RlIHdpcmQgYXVmZ2VydWZlbiwgd2VubiBlaW5cclxuICAgKiBPcmRuZXIgZ2Vsw7ZzY2h0IHdlcmRlbiBzb2xsLlxyXG4gICAqIEBwYXJhbSBmb2xkZXIgT3JkZXJuIGbDvHIgd2VsY2hlbiBlaW4gRGVsZXRlIENvbmZpcm0gZWluZ2Vmb3JkZXJ0IHdlcmRlbiBzb2xsLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBhYnN0cmFjdCBjb25maXJtRGVsZXRlTm9kZShmb2xkZXI6IElCcm93c2VyTm9kZSk6IE9ic2VydmFibGU8Ym9vbGVhbj47XHJcbiAgLyoqXHJcbiAgICogQWJzdHJha3RlIE1ldGhvZGUgZGllIEF1ZmdlcnVmZW4gd2lyZCwgd2VubiBkYXMgSG9jaGdlbGFkZW5lIEZpbGUgYXVzIGRlbSBUZW1wIEZvbGRlciBpbiBkaWVcclxuICAgKiBTdHJ1a3R1ciB2ZXJzY2hvYmVuIHd1cmRlLlxyXG4gICAqIEBwYXJhbSB1cGxvYWRpZCBJRCBkZXMgVXBsb2Fkc1xyXG4gICAqL1xyXG4gIHB1YmxpYyBhYnN0cmFjdCB1cGxvYWRlZEZpbGVNb3ZlZCh1cGxvYWRpZDogc3RyaW5nKTogdm9pZDtcclxuXHJcbiAgLy8gI2VuZHJlZ2lvbiBQdWJsaWMgQWJzdHJhY3QgTWV0aG9kc1xyXG5cclxuICAvLyAjcmVnaW9uIFByaXZhdGUgTWV0aG9kc1xyXG5cclxuICAvKipcclxuICAgKiBSZWt1cnNpdmUgTWV0aG9kZSB3ZWxjaGUgYmVpbSBOb2RlIHVuZCBhbGwgc2VpbmVuIENoaWxkcyBuZXVlIE5vZGVzIGVudGZlcm50XHJcbiAgICogQHBhcmFtIG5vZGUgTm9kZSBiZWkgd2VsY2hlbSBhbGxlIG5ldWVuIE5vZGVzIGVudGZlcm50IHdlcmRlbiBzb2xsLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgY2xlYXJOZXdDaGlsZE5vZGVzKG5vZGU6IElCcm93c2VyTm9kZSkge1xyXG4gICAgbm9kZS5DaGlsZE5vZGVzLmZvckVhY2goKGl0bSkgPT4ge1xyXG4gICAgICBpZiAoaXRtLklzTmV3Tm9kZSkge1xyXG4gICAgICAgIG5vZGUuQ2hpbGROb2Rlcy5zcGxpY2Uobm9kZS5DaGlsZE5vZGVzLmluZGV4T2YoaXRtKSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIG5vZGUuQ2hpbGROb2Rlcy5mb3JFYWNoKChpdG0pID0+IHRoaXMuY2xlYXJOZXdDaGlsZE5vZGVzKGl0bSkpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTWV0aG9kZSB3ZWxjaGUgZGVuIFBmYWQgZsO8ciBlaW5lbiBOb2RlIGVyemV1Z3RcclxuICAgKiBAcGFyYW0gbm9kZSBOb2RlIGbDvHIgd2VsY2hlbiBkZXIgUGZhZCBlcnpldWd0IHdlcmRlbiBzb2xsXHJcbiAgICogQHBhcmFtIHBhcmVudFBhdGggw5xiZXJnZW9yZG5ldGVyIFBmYWRcclxuICAgKi9cclxuICBwcml2YXRlIGZpbGxQYXRoKG5vZGU6IElCcm93c2VyTm9kZSwgcGFyZW50UGF0aDogc3RyaW5nKSB7XHJcbiAgICBub2RlLlBhdGggPSBwYXJlbnRQYXRoICsgJy8nICsgbm9kZS5OYW1lO1xyXG4gICAgbm9kZS5DaGlsZE5vZGVzLmZvckVhY2goKGl0bSkgPT4ge1xyXG4gICAgICB0aGlzLmZpbGxQYXRoKGl0bSwgbm9kZS5QYXRoKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU3VjaHQgZGVuIMO8YmVyZ2VvcmRuZXRlbiBOb2RlIGltIFRyZWVcclxuICAgKiBAcGFyYW0gbm9kZSBBa3R1ZWxsZXIgTm9kZVxyXG4gICAqIEBwYXJhbSBub2RlVG9GaW5kIE5vZGUgd2VsY2hlciBnZWZ1bmRlbiB3ZXJkZW4gc29sbFxyXG4gICAqIEByZXR1cm5zIE5vZGUgd2VubiBlciBnZWZ1bmRlbiB3dXJkZSwgYW5zb25zdGVuIHdpcmQgTlVMTCB6dXLDvGNrZ2VnZWJlblxyXG4gICAqL1xyXG4gIHByaXZhdGUgZmluZFBhcmVudE5vZGUoXHJcbiAgICBub2RlOiBJQnJvd3Nlck5vZGUsXHJcbiAgICBub2RlVG9GaW5kOiBJQnJvd3Nlck5vZGVcclxuICApOiBJQnJvd3Nlck5vZGUge1xyXG4gICAgaWYgKG5vZGUuQ2hpbGROb2Rlcy5pbmRleE9mKG5vZGVUb0ZpbmQpID49IDApIHtcclxuICAgICAgcmV0dXJuIG5vZGU7XHJcbiAgICB9XHJcblxyXG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiBub2RlLkNoaWxkTm9kZXMpIHtcclxuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5maW5kUGFyZW50Tm9kZShjaGlsZCwgbm9kZVRvRmluZCk7XHJcbiAgICAgIGlmIChyZXN1bHQgIT09IG51bGwpIHtcclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTdWNodCBlaW5lbiBOb2RlIGdlbS4gZWluZW0gVVJMIFBmYWRcclxuICAgKiBAcGFyYW0gbm9kZSBOb2RlIGluIHdlbGNoZW0gZ2VzdWNodCB3ZXJkZW4gc29sbFxyXG4gICAqIEBwYXJhbSBwYXRoIFBmYWQgbmFjaCB3ZWxjaGVtIGdlc3VjaHQgd2lyZFxyXG4gICAqIEByZXR1cm5zIE5vZGUgd2VsY2hlciB6dW0gZ2VzdWNodGVuIFBmYWQgcGFzc3QuIFdlbm4ga2VpbiBOb2RlIGdlZnVuZGVuIHdpcmQsIHdpcmQgTlVMTCB6dXLDvGNrZ2VnZWJlblxyXG4gICAqL1xyXG4gIHByaXZhdGUgZmluZFNlbGVjdGVkTm9kZUJ5UGF0aChcclxuICAgIG5vZGU6IElCcm93c2VyTm9kZSxcclxuICAgIHBhdGg6IHN0cmluZ1xyXG4gICk6IElCcm93c2VyTm9kZSB7XHJcbiAgICAvLyBDYW5jZWwgd2VubiBQZmFkIG5pY2h0IGRlZmluaWVydFxyXG4gICAgaWYgKHBhdGggPT09IHVuZGVmaW5lZCB8fCBwYXRoID09PSBudWxsKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFBmYWQgaW4gQXJyYXkgc3BsaXR0ZW4gdW5kIFJvb3QgRm9sZGVybmFtZSBzZXR6ZW5cclxuICAgIGNvbnN0IHBhdGhBcnJheSA9IHBhdGguc3BsaXQoJy8nKTtcclxuICAgIHBhdGhBcnJheVswXSA9IHRoaXMucm9vdE5vZGUuTmFtZTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5maW5kU2VsZWN0ZWROb2RlQnlQYXRoQXJyYXkobm9kZSwgcGF0aEFycmF5LCAwKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFN1Y2h0IGVpbmVuIE5vZGUgZ2VtLiBlaW5lbSBBcnJheSB2b24gTm9kZSBOYW1lblxyXG4gICAqIEBwYXJhbSBub2RlIE5vZGUgaW4gd2VsY2hlbSBnZXN1Y2h0IHdlcmRlbiBzb2xsXHJcbiAgICogQHBhcmFtIHBhdGggQXJyYXkgdm9uIE5vZGUgTmFtZW4sIHdlbGNoZSBkaWUgSGlyYXJjaHkgZGVzIFBmYWRlcyBhYmJpbGRlblxyXG4gICAqIEBwYXJhbSBpbmRleCBBa3R1ZWxsZXIgSW5kZXggaW0gUEFUSCBBcnJheVxyXG4gICAqIEByZXR1cm5zIE5vZGUgd2VubiBlaW5lciBnZWZ1bmRlbiB3dXJkZSwgYW5zb25zdGVuIE5VTExcclxuICAgKi9cclxuICBwcml2YXRlIGZpbmRTZWxlY3RlZE5vZGVCeVBhdGhBcnJheShcclxuICAgIG5vZGU6IElCcm93c2VyTm9kZSxcclxuICAgIHBhdGg6IHN0cmluZ1tdLFxyXG4gICAgaW5kZXg6IG51bWJlclxyXG4gICk6IElCcm93c2VyTm9kZSB7XHJcbiAgICAvLyBDaGVjayBvYiBPcmRuZXIga29ycmVrdC4gTGV0emVyIE9yZG5lciB6dXLDvGNrZ2ViZW4uIFBhdGggTGFzdCBJbmRleCBpc3QgZGVyIEZpbGVuYW1lXHJcbiAgICBpZiAobm9kZS5OYW1lID09PSBwYXRoW2luZGV4XSAmJiBwYXRoLmxlbmd0aCAtIDIgPT09IGluZGV4KSB7XHJcbiAgICAgIHJldHVybiBub2RlO1xyXG4gICAgfSBlbHNlIGlmIChub2RlLk5hbWUgPT09IHBhdGhbaW5kZXhdKSB7XHJcbiAgICAgIC8vIEV4cGFuZCBOb2RlXHJcbiAgICAgIG5vZGUuSXNFeHBhbmRlZCA9IHRydWU7XHJcbiAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBub2RlLkNoaWxkTm9kZXMpIHtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmZpbmRTZWxlY3RlZE5vZGVCeVBhdGhBcnJheShpdGVtLCBwYXRoLCBpbmRleCArIDEpO1xyXG5cclxuICAgICAgICBpZiAocmVzdWx0ICE9PSBudWxsKSB7XHJcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZWt1cnNpdmUgTWV0aG9kZSB3ZWxjaGUgYmVpbSBOb2RlIHVuZCBhbGwgc2VpbmVuIENoaWxkcyBkZW4gRWRpdCBNb2RlIGJlZW5kZXQuXHJcbiAgICogQHBhcmFtIG5vZGUgTm9kZSBiZWkgd2VsY2hlbSBkZXIgRWRpdCBNb2RlIGJlZW5kZXQgd2VyZGVuIHNvbGxcclxuICAgKi9cclxuICBwcml2YXRlIHJlc2V0Tm9kZUVkaXRNb2RlKG5vZGU6IElCcm93c2VyTm9kZSk6IHZvaWQge1xyXG4gICAgaWYgKG5vZGUgPT09IG51bGwpIHtcclxuICAgICAgdGhpcy5yZXNldE5vZGVFZGl0TW9kZSh0aGlzLnJvb3ROb2RlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIG5vZGUuSXNFZGl0TW9kZSA9IGZhbHNlO1xyXG5cclxuICAgICAgaWYgKG5vZGUuQ2hpbGROb2Rlcykge1xyXG4gICAgICAgIG5vZGUuQ2hpbGROb2Rlcy5mb3JFYWNoKChpdG0pID0+IHRoaXMucmVzZXROb2RlRWRpdE1vZGUoaXRtKSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHp0IGRlbiBQZmFkIGluIGFsbGVuIE5vZGVzXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBzZXRQYXRoVG9BbGxOb2RlcygpIHtcclxuICAgIHRoaXMucm9vdE5vZGUuQ2hpbGROb2Rlcy5mb3JFYWNoKChpdG0pID0+IHtcclxuICAgICAgdGhpcy5maWxsUGF0aChpdG0sICcnKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy8gI2VuZHJlZ2lvbiBQcml2YXRlIE1ldGhvZHNcclxufVxyXG4iXX0=
|
|
1
|
+
import { HttpClient } from '@angular/common/http';
|
|
2
|
+
import { Directive, EventEmitter, HostListener, Injector, Input, Output, } from '@angular/core';
|
|
3
|
+
import { SACICON_SERVICE, SACLOCALISATION_SERVICE, SACVALIDATIONKEY_SERVICE, SacDefaultIconService, SacDefaultValidationKeyService, } from '../../services';
|
|
4
|
+
import { SACFILEBROWSER_SERVICE, SacDefaultFileBrowserService, } from '../../services/sac-filebrowser.service';
|
|
5
|
+
import { SacDefaultLocalisationService } from '../../services/sac-localisation.service';
|
|
6
|
+
/**
|
|
7
|
+
* Base Component für File Browser
|
|
8
|
+
*/
|
|
9
|
+
export class SacFileBrowserCommon {
|
|
10
|
+
// #endregion Properties
|
|
11
|
+
// #region Constructors
|
|
12
|
+
/**
|
|
13
|
+
* Konstruktor
|
|
14
|
+
* @param httpclient Angular HTTP Client
|
|
15
|
+
* @param injector Service Injector
|
|
16
|
+
*/
|
|
17
|
+
constructor(httpclient, injector) {
|
|
18
|
+
/**
|
|
19
|
+
* File welches beim starten des Browsers bereits selektiert ist
|
|
20
|
+
*/
|
|
21
|
+
this.preselecedfile = null;
|
|
22
|
+
/**
|
|
23
|
+
* Erlaubte Dateierweiterungen für Fileauswahl und Upload. Dateierweiterung mit Punkt und
|
|
24
|
+
* getrennt durch Komma für mehr als eine Erweiterung (Example: ".jpg,.gif")
|
|
25
|
+
*/
|
|
26
|
+
this.allowedtypes = '';
|
|
27
|
+
/**
|
|
28
|
+
* Erlaubt das löschen einer Datei
|
|
29
|
+
*/
|
|
30
|
+
this.allowfiledelete = true;
|
|
31
|
+
/**
|
|
32
|
+
* Erlaubt das umbenennen einer Datei
|
|
33
|
+
*/
|
|
34
|
+
this.allowfilerename = true;
|
|
35
|
+
/**
|
|
36
|
+
* Erlaubt den Upload von Dateien
|
|
37
|
+
*/
|
|
38
|
+
this.allowfileupload = true;
|
|
39
|
+
/**
|
|
40
|
+
* Erlaubt das erstellen eines neuen Ordners
|
|
41
|
+
*/
|
|
42
|
+
this.allowfoldercreate = true;
|
|
43
|
+
/**
|
|
44
|
+
* Erlaubt das löschen eines Ordners
|
|
45
|
+
*/
|
|
46
|
+
this.allowfolderdelete = true;
|
|
47
|
+
/**
|
|
48
|
+
* Erlaubt das Umbenennen eines Ordners
|
|
49
|
+
*/
|
|
50
|
+
this.allowfolderrename = true;
|
|
51
|
+
/**
|
|
52
|
+
* Output Emitter wenn File selektiert wird.
|
|
53
|
+
*/
|
|
54
|
+
this.file = new EventEmitter();
|
|
55
|
+
/**
|
|
56
|
+
* Root Node Item für Tree
|
|
57
|
+
*/
|
|
58
|
+
this.rootNode = {
|
|
59
|
+
Name: '',
|
|
60
|
+
ChildNodes: [],
|
|
61
|
+
Files: [],
|
|
62
|
+
IsExpanded: true,
|
|
63
|
+
IsEditMode: false,
|
|
64
|
+
IsNewNode: false,
|
|
65
|
+
Path: '',
|
|
66
|
+
};
|
|
67
|
+
/**
|
|
68
|
+
* Selected File Item
|
|
69
|
+
*/
|
|
70
|
+
this.selectedFileItem = null;
|
|
71
|
+
/**
|
|
72
|
+
* Selected Node Item
|
|
73
|
+
*/
|
|
74
|
+
this.selectedNode = null;
|
|
75
|
+
/**
|
|
76
|
+
* Liste von Uploads
|
|
77
|
+
*/
|
|
78
|
+
this.uploads = [];
|
|
79
|
+
this.browserService = injector.get(SACFILEBROWSER_SERVICE, new SacDefaultFileBrowserService(httpclient));
|
|
80
|
+
this.validationKeyService = injector.get(SACVALIDATIONKEY_SERVICE, new SacDefaultValidationKeyService());
|
|
81
|
+
this.lngResourceService = injector.get(SACLOCALISATION_SERVICE, new SacDefaultLocalisationService(this.validationKeyService));
|
|
82
|
+
this.iconService = injector.get(SACICON_SERVICE, new SacDefaultIconService());
|
|
83
|
+
}
|
|
84
|
+
// #endregion Constructors
|
|
85
|
+
// #region Public Getters And Setters
|
|
86
|
+
/**
|
|
87
|
+
* Setzt den Seleced Node über den Pfad
|
|
88
|
+
*/
|
|
89
|
+
set selectedfile(v) {
|
|
90
|
+
const selectednode = this.findSelectedNodeByPath(this.rootNode, v);
|
|
91
|
+
if (selectednode !== null) {
|
|
92
|
+
this.selectNode(selectednode);
|
|
93
|
+
}
|
|
94
|
+
this.preselecedfile = v;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* CSS icon class for delete icon
|
|
98
|
+
* @returns css class with icon
|
|
99
|
+
*/
|
|
100
|
+
get iconDelete() {
|
|
101
|
+
return this.iconService.BrowserComponentDeleteIcon;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* CSS icon class for edit icon
|
|
105
|
+
* @returns css class with icon
|
|
106
|
+
*/
|
|
107
|
+
get iconEdit() {
|
|
108
|
+
return this.iconService.BrowserComponentEditIcon;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* CSS icon for folders in tree there are collabsed
|
|
112
|
+
* @returns css class with icon
|
|
113
|
+
*/
|
|
114
|
+
get iconFolderCollabsed() {
|
|
115
|
+
return this.iconService.BrowserComponentFolderClosedIcon;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* CSS icon class for folders without subfolders
|
|
119
|
+
* @returns css class with icon
|
|
120
|
+
*/
|
|
121
|
+
get iconFolderEmpty() {
|
|
122
|
+
return this.iconService.BrowserComponentFolderEmptyIcon;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* CSS icon for new folders action
|
|
126
|
+
* @returns css class with icon
|
|
127
|
+
*/
|
|
128
|
+
get iconFolderNew() {
|
|
129
|
+
return this.iconService.BrowserComponentFolderNewIcon;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* CSS icon for folders in tree there are expanded
|
|
133
|
+
* @returns css class with icon
|
|
134
|
+
*/
|
|
135
|
+
get iconFolderOpen() {
|
|
136
|
+
return this.iconService.BrowserComponentFolderOpenIcon;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* CSS icon class for refresh icon
|
|
140
|
+
* @returns css class with icon
|
|
141
|
+
*/
|
|
142
|
+
get iconRefresh() {
|
|
143
|
+
return this.iconService.BrowserComponentRefreshIcon;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Getter für Selected File. Ist an Input Property gebunden
|
|
147
|
+
*/
|
|
148
|
+
get selectedfile() {
|
|
149
|
+
if (this.selectFile && this.selectFile.length > 0) {
|
|
150
|
+
return this.selectedFile;
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
return null;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
// #endregion Public Getters And Setters
|
|
157
|
+
// #region Public Methods
|
|
158
|
+
/**
|
|
159
|
+
* HostListener welcher den Edit Mode bei allen Files und Nodes beendet.
|
|
160
|
+
*/
|
|
161
|
+
exitEditMode(targetElement) {
|
|
162
|
+
if (this.selectedNode) {
|
|
163
|
+
this.selectedNode.Files.forEach((itm) => (itm.IsEditMode = false));
|
|
164
|
+
if (!this.selectedNode ||
|
|
165
|
+
this.selectedNode.Name === null ||
|
|
166
|
+
this.selectedNode.Name.length === 0) {
|
|
167
|
+
this.clearNewChildNodes(this.rootNode);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
this.resetNodeEditMode(null);
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Löscht ein File
|
|
174
|
+
* @param file File welches gelöscht werden soll
|
|
175
|
+
*/
|
|
176
|
+
deleteFile(file) {
|
|
177
|
+
this.confirmDeleteFile(file).subscribe((confirm) => {
|
|
178
|
+
if (confirm) {
|
|
179
|
+
this.browserService
|
|
180
|
+
.DeleteFile(this.apiurl, this.selectedNode.Path + '/' + file.Filename, this.allowedtypes)
|
|
181
|
+
.subscribe((result) => {
|
|
182
|
+
this.selectedNode.Files = result.Files;
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Löscht einen Node
|
|
189
|
+
* @param node Node welcher gelöscht werden soll
|
|
190
|
+
*/
|
|
191
|
+
deleteNode(node) {
|
|
192
|
+
this.confirmDeleteNode(node).subscribe((confirm) => {
|
|
193
|
+
if (confirm) {
|
|
194
|
+
this.browserService
|
|
195
|
+
.DeleteNode(this.apiurl, node.Path)
|
|
196
|
+
.subscribe((result) => {
|
|
197
|
+
const parentNode = this.findParentNode(this.rootNode, node);
|
|
198
|
+
parentNode.ChildNodes = result.Node.ChildNodes;
|
|
199
|
+
this.rootNode.ChildNodes.forEach((itm) => {
|
|
200
|
+
this.fillPath(itm, '');
|
|
201
|
+
});
|
|
202
|
+
this.selectNode(parentNode);
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Setzt ein File in den Edit Mode
|
|
209
|
+
* @param file File welches in den Edit Mode gesetzt werden soll
|
|
210
|
+
*/
|
|
211
|
+
editFile(file) {
|
|
212
|
+
file.IsEditMode = true;
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Setzt einen Node in den Edit Mode
|
|
216
|
+
* @param node Node welcher bearbeitet werden soll
|
|
217
|
+
*/
|
|
218
|
+
editNode(node) {
|
|
219
|
+
node.IsEditMode = true;
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Erzeugt einen neuen Node im Tree
|
|
223
|
+
* @param node Node unter welchem ein neuer Node erstellt werden soll
|
|
224
|
+
*/
|
|
225
|
+
newNode(node) {
|
|
226
|
+
const item = {
|
|
227
|
+
ChildNodes: [],
|
|
228
|
+
Files: [],
|
|
229
|
+
IsEditMode: false,
|
|
230
|
+
IsExpanded: false,
|
|
231
|
+
Name: '',
|
|
232
|
+
Path: node.Path,
|
|
233
|
+
IsNewNode: true,
|
|
234
|
+
};
|
|
235
|
+
node.ChildNodes.push(item);
|
|
236
|
+
this.selectNode(item);
|
|
237
|
+
this.editNode(item);
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Init Event der Komponente
|
|
241
|
+
*/
|
|
242
|
+
ngOnInit() {
|
|
243
|
+
this.browserService
|
|
244
|
+
.GetNode(this.apiurl, '', this.allowedtypes)
|
|
245
|
+
.subscribe((result) => {
|
|
246
|
+
this.rootNode = {
|
|
247
|
+
Name: result.Node.Name,
|
|
248
|
+
Files: result.Node.Files,
|
|
249
|
+
ChildNodes: result.Node.ChildNodes,
|
|
250
|
+
IsExpanded: true,
|
|
251
|
+
IsEditMode: false,
|
|
252
|
+
IsNewNode: false,
|
|
253
|
+
Path: '/',
|
|
254
|
+
};
|
|
255
|
+
this.setPathToAllNodes();
|
|
256
|
+
this.selectedNode = this.rootNode;
|
|
257
|
+
// Selected File erneut setzen, wenn Property gesetzt wurde bevor Daten vom Service geladen wurden.
|
|
258
|
+
if (this.preselecedfile !== null && this.preselecedfile.length > 0) {
|
|
259
|
+
this.selectedfile = this.preselecedfile;
|
|
260
|
+
}
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Aktualisiert den Node
|
|
265
|
+
*/
|
|
266
|
+
refreshNode(node) {
|
|
267
|
+
if (!node.IsExpanded) {
|
|
268
|
+
this.switchExpandNode(node);
|
|
269
|
+
}
|
|
270
|
+
this.browserService
|
|
271
|
+
.GetNode(this.apiurl, node.Path, this.allowedtypes)
|
|
272
|
+
.subscribe((result) => {
|
|
273
|
+
node.ChildNodes = result.Node.ChildNodes;
|
|
274
|
+
node.Files = result.Node.Files;
|
|
275
|
+
this.setPathToAllNodes();
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Methode wenn eine Datei umbenannt werden soll
|
|
280
|
+
* @param file File welches umbenannt werden soll
|
|
281
|
+
* @param newFilename Neuer Dateiname
|
|
282
|
+
*/
|
|
283
|
+
renameFile(file, newFilename) {
|
|
284
|
+
file.IsEditMode = false;
|
|
285
|
+
if (!newFilename || newFilename === null || newFilename.length === 0) {
|
|
286
|
+
// Cancel, Invalid Filename
|
|
287
|
+
return;
|
|
288
|
+
}
|
|
289
|
+
if (file.Filename !== newFilename) {
|
|
290
|
+
this.browserService
|
|
291
|
+
.RenameFile(this.apiurl, this.selectedNode.Path + '/' + file.Filename, newFilename, this.allowedtypes)
|
|
292
|
+
.subscribe((result) => {
|
|
293
|
+
this.selectedNode.Files = result.Files;
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
/**
|
|
298
|
+
* Methode wenn ein Node umbenannt werden soll
|
|
299
|
+
* @param node Node welcher umbenannt werden soll
|
|
300
|
+
* @param newFoldername Neuer Ordnername
|
|
301
|
+
*/
|
|
302
|
+
renameNode(node, newFoldername) {
|
|
303
|
+
node.IsEditMode = false;
|
|
304
|
+
if (!node.IsNewNode) {
|
|
305
|
+
if (!newFoldername ||
|
|
306
|
+
newFoldername === null ||
|
|
307
|
+
newFoldername.length === 0) {
|
|
308
|
+
// Cancel Rename. Invalid Foldername
|
|
309
|
+
return;
|
|
310
|
+
}
|
|
311
|
+
if (node.Name !== newFoldername) {
|
|
312
|
+
this.browserService
|
|
313
|
+
.RenameNode(this.apiurl, node.Path, newFoldername)
|
|
314
|
+
.subscribe((result) => {
|
|
315
|
+
node.Name = result.Node.Name;
|
|
316
|
+
this.setPathToAllNodes();
|
|
317
|
+
});
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
else {
|
|
321
|
+
if (!newFoldername ||
|
|
322
|
+
newFoldername === null ||
|
|
323
|
+
newFoldername.length === 0) {
|
|
324
|
+
this.clearNewChildNodes(this.rootNode);
|
|
325
|
+
return;
|
|
326
|
+
}
|
|
327
|
+
node.Name = newFoldername;
|
|
328
|
+
node.IsNewNode = false;
|
|
329
|
+
this.browserService
|
|
330
|
+
.SaveNode(this.apiurl, node.Path, newFoldername)
|
|
331
|
+
.subscribe((result) => {
|
|
332
|
+
node.Name = result.Node.Name;
|
|
333
|
+
node.Files = result.Node.Files;
|
|
334
|
+
this.setPathToAllNodes();
|
|
335
|
+
});
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
/**
|
|
339
|
+
* Methode wenn ein File selektiert wird
|
|
340
|
+
* @param file File welches selektiert wird
|
|
341
|
+
*/
|
|
342
|
+
selectFile(file) {
|
|
343
|
+
if (!file.IsEditMode) {
|
|
344
|
+
this.selectedNode.Files.forEach((itm) => (itm.IsEditMode = false));
|
|
345
|
+
}
|
|
346
|
+
if (!this.selectedNode.Path.endsWith('/')) {
|
|
347
|
+
this.selectedFile = this.selectedNode.Path + '/' + file.Filename;
|
|
348
|
+
}
|
|
349
|
+
else {
|
|
350
|
+
this.selectedFile = '/' + file.Filename;
|
|
351
|
+
}
|
|
352
|
+
this.selectedFileItem = file;
|
|
353
|
+
this.file.emit(this.selectedFile);
|
|
354
|
+
}
|
|
355
|
+
/**
|
|
356
|
+
* Methode wenn ein Node selektiert wird
|
|
357
|
+
* @param node Node welcher selektiert werden soll
|
|
358
|
+
*/
|
|
359
|
+
selectNode(node) {
|
|
360
|
+
if (!node.IsExpanded) {
|
|
361
|
+
this.switchExpandNode(node);
|
|
362
|
+
}
|
|
363
|
+
// Reset the Edit Mode in all Nodes
|
|
364
|
+
this.resetNodeEditMode(null);
|
|
365
|
+
if (!node.Files) {
|
|
366
|
+
this.browserService
|
|
367
|
+
.GetFiles(this.apiurl, node.Path, this.allowedtypes)
|
|
368
|
+
.subscribe((result) => {
|
|
369
|
+
node.Files = result.Files;
|
|
370
|
+
this.selectedNode = node;
|
|
371
|
+
if (this.preselecedfile !== null && this.preselecedfile.length > 0) {
|
|
372
|
+
const filename = this.preselecedfile.substring(this.preselecedfile.lastIndexOf('/') + 1);
|
|
373
|
+
const file = node.Files.find((itm) => itm.Filename === filename);
|
|
374
|
+
if (file) {
|
|
375
|
+
this.selectFile(file);
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
});
|
|
379
|
+
}
|
|
380
|
+
else {
|
|
381
|
+
this.selectedNode = node;
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
/**
|
|
385
|
+
* Expand/Collabse Methode für Nodes
|
|
386
|
+
* @param node Node welcher geöffnet oder geschlossen werden soll
|
|
387
|
+
*/
|
|
388
|
+
switchExpandNode(node) {
|
|
389
|
+
if (node.IsExpanded) {
|
|
390
|
+
node.IsExpanded = false;
|
|
391
|
+
}
|
|
392
|
+
else {
|
|
393
|
+
node.IsExpanded = true;
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
/**
|
|
397
|
+
* Methode die Aufgerufen werden muss, wenn ein Upload beendet ist.
|
|
398
|
+
* @param param Parameter des hochgeladenen Files
|
|
399
|
+
*/
|
|
400
|
+
uploadComplete(node, uploadIdList) {
|
|
401
|
+
if (uploadIdList !== null) {
|
|
402
|
+
uploadIdList.forEach((element) => {
|
|
403
|
+
if (this.uploads.indexOf(element) < 0) {
|
|
404
|
+
this.uploads.push(element);
|
|
405
|
+
}
|
|
406
|
+
});
|
|
407
|
+
}
|
|
408
|
+
const id = this.uploads.pop();
|
|
409
|
+
if (id) {
|
|
410
|
+
this.browserService
|
|
411
|
+
.SaveFile(this.apiurl, node.Path, id, this.allowedtypes)
|
|
412
|
+
.subscribe((result) => {
|
|
413
|
+
this.selectedNode.Files = result.Files;
|
|
414
|
+
this.uploadedFileMoved(id);
|
|
415
|
+
});
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
// #endregion Public Abstract Methods
|
|
419
|
+
// #region Private Methods
|
|
420
|
+
/**
|
|
421
|
+
* Rekursive Methode welche beim Node und all seinen Childs neue Nodes entfernt
|
|
422
|
+
* @param node Node bei welchem alle neuen Nodes entfernt werden soll.
|
|
423
|
+
*/
|
|
424
|
+
clearNewChildNodes(node) {
|
|
425
|
+
node.ChildNodes.forEach((itm) => {
|
|
426
|
+
if (itm.IsNewNode) {
|
|
427
|
+
node.ChildNodes.splice(node.ChildNodes.indexOf(itm));
|
|
428
|
+
}
|
|
429
|
+
});
|
|
430
|
+
node.ChildNodes.forEach((itm) => this.clearNewChildNodes(itm));
|
|
431
|
+
}
|
|
432
|
+
/**
|
|
433
|
+
* Methode welche den Pfad für einen Node erzeugt
|
|
434
|
+
* @param node Node für welchen der Pfad erzeugt werden soll
|
|
435
|
+
* @param parentPath Übergeordneter Pfad
|
|
436
|
+
*/
|
|
437
|
+
fillPath(node, parentPath) {
|
|
438
|
+
node.Path = parentPath + '/' + node.Name;
|
|
439
|
+
node.ChildNodes.forEach((itm) => {
|
|
440
|
+
this.fillPath(itm, node.Path);
|
|
441
|
+
});
|
|
442
|
+
}
|
|
443
|
+
/**
|
|
444
|
+
* Sucht den übergeordneten Node im Tree
|
|
445
|
+
* @param node Aktueller Node
|
|
446
|
+
* @param nodeToFind Node welcher gefunden werden soll
|
|
447
|
+
* @returns Node wenn er gefunden wurde, ansonsten wird NULL zurückgegeben
|
|
448
|
+
*/
|
|
449
|
+
findParentNode(node, nodeToFind) {
|
|
450
|
+
if (node.ChildNodes.indexOf(nodeToFind) >= 0) {
|
|
451
|
+
return node;
|
|
452
|
+
}
|
|
453
|
+
for (const child of node.ChildNodes) {
|
|
454
|
+
const result = this.findParentNode(child, nodeToFind);
|
|
455
|
+
if (result !== null) {
|
|
456
|
+
return result;
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
return null;
|
|
460
|
+
}
|
|
461
|
+
/**
|
|
462
|
+
* Sucht einen Node gem. einem URL Pfad
|
|
463
|
+
* @param node Node in welchem gesucht werden soll
|
|
464
|
+
* @param path Pfad nach welchem gesucht wird
|
|
465
|
+
* @returns Node welcher zum gesuchten Pfad passt. Wenn kein Node gefunden wird, wird NULL zurückgegeben
|
|
466
|
+
*/
|
|
467
|
+
findSelectedNodeByPath(node, path) {
|
|
468
|
+
// Cancel wenn Pfad nicht definiert
|
|
469
|
+
if (path === undefined || path === null) {
|
|
470
|
+
return null;
|
|
471
|
+
}
|
|
472
|
+
// Pfad in Array splitten und Root Foldername setzen
|
|
473
|
+
const pathArray = path.split('/');
|
|
474
|
+
pathArray[0] = this.rootNode.Name;
|
|
475
|
+
return this.findSelectedNodeByPathArray(node, pathArray, 0);
|
|
476
|
+
}
|
|
477
|
+
/**
|
|
478
|
+
* Sucht einen Node gem. einem Array von Node Namen
|
|
479
|
+
* @param node Node in welchem gesucht werden soll
|
|
480
|
+
* @param path Array von Node Namen, welche die Hirarchy des Pfades abbilden
|
|
481
|
+
* @param index Aktueller Index im PATH Array
|
|
482
|
+
* @returns Node wenn einer gefunden wurde, ansonsten NULL
|
|
483
|
+
*/
|
|
484
|
+
findSelectedNodeByPathArray(node, path, index) {
|
|
485
|
+
// Check ob Ordner korrekt. Letzer Ordner zurückgeben. Path Last Index ist der Filename
|
|
486
|
+
if (node.Name === path[index] && path.length - 2 === index) {
|
|
487
|
+
return node;
|
|
488
|
+
}
|
|
489
|
+
else if (node.Name === path[index]) {
|
|
490
|
+
// Expand Node
|
|
491
|
+
node.IsExpanded = true;
|
|
492
|
+
for (const item of node.ChildNodes) {
|
|
493
|
+
const result = this.findSelectedNodeByPathArray(item, path, index + 1);
|
|
494
|
+
if (result !== null) {
|
|
495
|
+
return result;
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
return null;
|
|
500
|
+
}
|
|
501
|
+
/**
|
|
502
|
+
* Rekursive Methode welche beim Node und all seinen Childs den Edit Mode beendet.
|
|
503
|
+
* @param node Node bei welchem der Edit Mode beendet werden soll
|
|
504
|
+
*/
|
|
505
|
+
resetNodeEditMode(node) {
|
|
506
|
+
if (node === null) {
|
|
507
|
+
this.resetNodeEditMode(this.rootNode);
|
|
508
|
+
}
|
|
509
|
+
else {
|
|
510
|
+
node.IsEditMode = false;
|
|
511
|
+
if (node.ChildNodes) {
|
|
512
|
+
node.ChildNodes.forEach((itm) => this.resetNodeEditMode(itm));
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
}
|
|
516
|
+
/**
|
|
517
|
+
* Setzt den Pfad in allen Nodes
|
|
518
|
+
*/
|
|
519
|
+
setPathToAllNodes() {
|
|
520
|
+
this.rootNode.ChildNodes.forEach((itm) => {
|
|
521
|
+
this.fillPath(itm, '');
|
|
522
|
+
});
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
SacFileBrowserCommon.decorators = [
|
|
526
|
+
{ type: Directive }
|
|
527
|
+
];
|
|
528
|
+
SacFileBrowserCommon.ctorParameters = () => [
|
|
529
|
+
{ type: HttpClient },
|
|
530
|
+
{ type: Injector }
|
|
531
|
+
];
|
|
532
|
+
SacFileBrowserCommon.propDecorators = {
|
|
533
|
+
allowedtypes: [{ type: Input }],
|
|
534
|
+
allowfiledelete: [{ type: Input }],
|
|
535
|
+
allowfilerename: [{ type: Input }],
|
|
536
|
+
allowfileupload: [{ type: Input }],
|
|
537
|
+
allowfoldercreate: [{ type: Input }],
|
|
538
|
+
allowfolderdelete: [{ type: Input }],
|
|
539
|
+
allowfolderrename: [{ type: Input }],
|
|
540
|
+
apiurl: [{ type: Input }],
|
|
541
|
+
file: [{ type: Output }],
|
|
542
|
+
selectedfile: [{ type: Input }],
|
|
543
|
+
exitEditMode: [{ type: HostListener, args: ['document:click', ['$event.target'],] }]
|
|
544
|
+
};
|
|
545
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJvd3Nlci5qcyIsInNvdXJjZVJvb3QiOiIvaG9tZS9ydW5uZXIvd29yay9zaW1wbGVhbmd1bGFyY29udHJvbHMvc2ltcGxlYW5ndWxhcmNvbnRyb2xzL2NoLmpuZXR3b3JrLnNhYy1jb250cm9scy9wcm9qZWN0cy9zYWMtY29tbW9uL3NyYy8iLCJzb3VyY2VzIjpbImNvbXBvbmVudHMvYnJvd3Nlci9icm93c2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRCxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixZQUFZLEVBQ1osUUFBUSxFQUNSLEtBQUssRUFFTCxNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7QUFNdkIsT0FBTyxFQUNMLGVBQWUsRUFDZix1QkFBdUIsRUFDdkIsd0JBQXdCLEVBQ3hCLHFCQUFxQixFQUNyQiw4QkFBOEIsR0FDL0IsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQ0wsc0JBQXNCLEVBQ3RCLDRCQUE0QixHQUM3QixNQUFNLHdDQUF3QyxDQUFDO0FBQ2hELE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBTXhGOztHQUVHO0FBRUgsTUFBTSxPQUFnQixvQkFBb0I7SUFvR3hDLHdCQUF3QjtJQUV4Qix1QkFBdUI7SUFFdkI7Ozs7T0FJRztJQUNILFlBQVksVUFBc0IsRUFBRSxRQUFrQjtRQWxHdEQ7O1dBRUc7UUFDSyxtQkFBYyxHQUFrQixJQUFJLENBQUM7UUFFN0M7OztXQUdHO1FBRUksaUJBQVksR0FBVyxFQUFFLENBQUM7UUFDakM7O1dBRUc7UUFFSSxvQkFBZSxHQUFZLElBQUksQ0FBQztRQUN2Qzs7V0FFRztRQUVJLG9CQUFlLEdBQVksSUFBSSxDQUFDO1FBQ3ZDOztXQUVHO1FBRUksb0JBQWUsR0FBWSxJQUFJLENBQUM7UUFDdkM7O1dBRUc7UUFFSSxzQkFBaUIsR0FBWSxJQUFJLENBQUM7UUFDekM7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LENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQzthQUMvRDtTQUNGO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0ssaUJBQWlCO1FBQ3ZCLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ3ZDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3pCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7O1lBM3FCRixTQUFTOzs7WUFuQ0QsVUFBVTtZQUtqQixRQUFROzs7MkJBbURQLEtBQUs7OEJBS0wsS0FBSzs4QkFLTCxLQUFLOzhCQUtMLEtBQUs7Z0NBS0wsS0FBSztnQ0FLTCxLQUFLO2dDQUtMLEtBQUs7cUJBS0wsS0FBSzttQkFLTCxNQUFNOzJCQTRFTixLQUFLOzJCQXFGTCxZQUFZLFNBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxlQUFlLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHtcbiAgRGlyZWN0aXZlLFxuICBFdmVudEVtaXR0ZXIsXG4gIEhvc3RMaXN0ZW5lcixcbiAgSW5qZWN0b3IsXG4gIElucHV0LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBJU2FjRmlsZUJyb3dzZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9JU2FjRmlsZUJyb3dzZXJTZXJ2aWNlJztcbmltcG9ydCB7IElTYWNJY29uU2VydmljZSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvSVNhY0ljb25TZXJ2aWNlJztcbmltcG9ydCB7IElTYWNMb2NhbGlzYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9JU2FjTG9jYWxpc2F0aW9uU2VydmljZSc7XG5pbXBvcnQgeyBJU2FjVmFsaWRhdGlvbktleVNlcnZpY2UgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL0lTYWNWYWxpZGF0aW9uS2V5U2VydmljZSc7XG5pbXBvcnQge1xuICBTQUNJQ09OX1NFUlZJQ0UsXG4gIFNBQ0xPQ0FMSVNBVElPTl9TRVJWSUNFLFxuICBTQUNWQUxJREFUSU9OS0VZX1NFUlZJQ0UsXG4gIFNhY0RlZmF1bHRJY29uU2VydmljZSxcbiAgU2FjRGVmYXVsdFZhbGlkYXRpb25LZXlTZXJ2aWNlLFxufSBmcm9tICcuLi8uLi9zZXJ2aWNlcyc7XG5pbXBvcnQge1xuICBTQUNGSUxFQlJPV1NFUl9TRVJWSUNFLFxuICBTYWNEZWZhdWx0RmlsZUJyb3dzZXJTZXJ2aWNlLFxufSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9zYWMtZmlsZWJyb3dzZXIuc2VydmljZSc7XG5pbXBvcnQgeyBTYWNEZWZhdWx0TG9jYWxpc2F0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3NhYy1sb2NhbGlzYXRpb24uc2VydmljZSc7XG5pbXBvcnQgeyBJQnJvd3NlckZpbGUgfSBmcm9tICcuL21vZGVscy9icm93c2VyZmlsZSc7XG5pbXBvcnQgeyBJQnJvd3NlckZpbGVSZXNwb25zZSB9IGZyb20gJy4vbW9kZWxzL2Jyb3dzZXJmaWxlcmVzcG9uc2UnO1xuaW1wb3J0IHsgSUJyb3dzZXJOb2RlIH0gZnJvbSAnLi9tb2RlbHMvYnJvd3Nlcm5vZGUnO1xuaW1wb3J0IHsgSUJyb3dzZXJOb2RlUmVzcG9uc2UgfSBmcm9tICcuL21vZGVscy9icm93c2Vybm9kZXJlc3BvbnNlJztcblxuLyoqXG4gKiBCYXNlIENvbXBvbmVudCBmw7xyIEZpbGUgQnJvd3NlclxuICovXG5ARGlyZWN0aXZlKClcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTYWNGaWxlQnJvd3NlckNvbW1vbiBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIC8vICNyZWdpb24gUHJvcGVydGllc1xuXG4gIC8qKlxuICAgKiBTZXJ2aWNlIGbDvHIgRmlsZSBCcm93c2VyIFp1Z3JpZmYgKEJhY2tlbmQpXG4gICAqL1xuICBwcml2YXRlIGJyb3dzZXJTZXJ2aWNlOiBJU2FjRmlsZUJyb3dzZXJTZXJ2aWNlO1xuICAvKipcbiAgICogSWNvbiBzZXJ2aWNlIHRvIHJlY2VpdmUgaWNvbiBjbGFzc2VzIGZvciB1aVxuICAgKi9cbiAgcHJpdmF0ZSBpY29uU2VydmljZTogSVNhY0ljb25TZXJ2aWNlO1xuICAvKipcbiAgICogRmlsZSB3ZWxjaGVzIGJlaW0gc3RhcnRlbiBkZXMgQnJvd3NlcnMgYmVyZWl0cyBzZWxla3RpZXJ0IGlzdFxuICAgKi9cbiAgcHJpdmF0ZSBwcmVzZWxlY2VkZmlsZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIEVybGF1YnRlIERhdGVpZXJ3ZWl0ZXJ1bmdlbiBmw7xyIEZpbGVhdXN3YWhsIHVuZCBVcGxvYWQuIERhdGVpZXJ3ZWl0ZXJ1bmcgbWl0IFB1bmt0IHVuZFxuICAgKiBnZXRyZW5udCBkdXJjaCBLb21tYSBmw7xyIG1laHIgYWxzIGVpbmUgRXJ3ZWl0ZXJ1bmcgKEV4YW1wbGU6IFwiLmpwZywuZ2lmXCIpXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgYWxsb3dlZHR5cGVzOiBzdHJpbmcgPSAnJztcbiAgLyoqXG4gICAqIEVybGF1YnQgZGFzIGzDtnNjaGVuIGVpbmVyIERhdGVpXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgYWxsb3dmaWxlZGVsZXRlOiBib29sZWFuID0gdHJ1ZTtcbiAgLyoqXG4gICAqIEVybGF1YnQgZGFzIHVtYmVuZW5uZW4gZWluZXIgRGF0ZWlcbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBhbGxvd2ZpbGVyZW5hbWU6IGJvb2xlYW4gPSB0cnVlO1xuICAvKipcbiAgICogRXJsYXVidCBkZW4gVXBsb2FkIHZvbiBEYXRlaWVuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgYWxsb3dmaWxldXBsb2FkOiBib29sZWFuID0gdHJ1ZTtcbiAgLyoqXG4gICAqIEVybGF1YnQgZGFzIGVyc3RlbGxlbiBlaW5lcyBuZXVlbiBPcmRuZXJzXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgYWxsb3dmb2xkZXJjcmVhdGU6IGJvb2xlYW4gPSB0cnVlO1xuICAvKipcbiAgICogRXJsYXVidCBkYXMgbMO2c2NoZW4gZWluZXMgT3JkbmVyc1xuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIGFsbG93Zm9sZGVyZGVsZXRlOiBib29sZWFuID0gdHJ1ZTtcbiAgLyoqXG4gICAqIEVybGF1YnQgZGFzIFVtYmVuZW5uZW4gZWluZXMgT3JkbmVyc1xuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIGFsbG93Zm9sZGVycmVuYW1lOiBib29sZWFuID0gdHJ1ZTtcbiAgLyoqXG4gICAqIFVSTCBmw7xyIEJhY2tlbmQgQVBJXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgYXBpdXJsOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBPdXRwdXQgRW1pdHRlciB3ZW5uIEZpbGUgc2VsZWt0aWVydCB3aXJkLlxuICAgKi9cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBmaWxlOiBFdmVudEVtaXR0ZXI8c3RyaW5nPiA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXG4gIC8qKlxuICAgKiBTZXJ2aWNlIGbDvHIgRXJyb3IgTG9jYWxpc2F0aW9uXG4gICAqL1xuICBwdWJsaWMgbG5nUmVzb3VyY2VTZXJ2aWNlOiBJU2FjTG9jYWxpc2F0aW9uU2VydmljZTtcbiAgLyoqXG4gICAqIFJvb3QgTm9kZSBJdGVtIGbDvHIgVHJlZVxuICAgKi9cbiAgcHVibGljIHJvb3ROb2RlOiBJQnJvd3Nlck5vZGUgPSB7XG4gICAgTmFtZTogJycsXG4gICAgQ2hpbGROb2RlczogW10sXG4gICAgRmlsZXM6IFtdLFxuICAgIElzRXhwYW5kZWQ6IHRydWUsXG4gICAgSXNFZGl0TW9kZTogZmFsc2UsXG4gICAgSXNOZXdOb2RlOiBmYWxzZSxcbiAgICBQYXRoOiAnJyxcbiAgfTtcbiAgLyoqXG4gICAqIFNlbGVjdGVkIEZpbGUgTmFtZVxuICAgKi9cbiAgcHVibGljIHNlbGVjdGVkRmlsZTogc3RyaW5nO1xuICAvKipcbiAgICogU2VsZWN0ZWQgRmlsZSBJdGVtXG4gICAqL1xuICBwdWJsaWMgc2VsZWN0ZWRGaWxlSXRlbTogSUJyb3dzZXJGaWxlID0gbnVsbDtcbiAgLyoqXG4gICAqIFNlbGVjdGVkIE5vZGUgSXRlbVxuICAgKi9cbiAgcHVibGljIHNlbGVjdGVkTm9kZTogSUJyb3dzZXJOb2RlID0gbnVsbDtcbiAgLyoqXG4gICAqIExpc3RlIHZvbiBVcGxvYWRzXG4gICAqL1xuICBwdWJsaWMgdXBsb2Fkczogc3RyaW5nW10gPSBbXTtcbiAgLyoqXG4gICAqIFNlcnZpY2UgdG8gcmVjZWl2ZSBzdGFuZGFyZCB2YWxpZGF0aW9uIG1lc3NhZ2Uga2V5cyBhbmQgdGV4dHNcbiAgICovXG4gIHB1YmxpYyB2YWxpZGF0aW9uS2V5U2VydmljZTogSVNhY1ZhbGlkYXRpb25LZXlTZXJ2aWNlO1xuXG4gIC8vICNlbmRyZWdpb24gUHJvcGVydGllc1xuXG4gIC8vICNyZWdpb24gQ29uc3RydWN0b3JzXG5cbiAgLyoqXG4gICAqIEtvbnN0cnVrdG9yXG4gICAqIEBwYXJhbSBodHRwY2xpZW50IEFuZ3VsYXIgSFRUUCBDbGllbnRcbiAgICogQHBhcmFtIGluamVjdG9yIFNlcnZpY2UgSW5qZWN0b3JcbiAgICovXG4gIGNvbnN0cnVjdG9yKGh0dHBjbGllbnQ6IEh0dHBDbGllbnQsIGluamVjdG9yOiBJbmplY3Rvcikge1xuICAgIHRoaXMuYnJvd3NlclNlcnZpY2UgPSBpbmplY3Rvci5nZXQoXG4gICAgICBTQUNGSUxFQlJPV1NFUl9TRVJWSUNFLFxuICAgICAgbmV3IFNhY0RlZmF1bHRGaWxlQnJvd3NlclNlcnZpY2UoaHR0cGNsaWVudClcbiAgICApO1xuICAgIHRoaXMudmFsaWRhdGlvbktleVNlcnZpY2UgPSBpbmplY3Rvci5nZXQoXG4gICAgICBTQUNWQUxJREFUSU9OS0VZX1NFUlZJQ0UsXG4gICAgICBuZXcgU2FjRGVmYXVsdFZhbGlkYXRpb25LZXlTZXJ2aWNlKClcbiAgICApO1xuICAgIHRoaXMubG5nUmVzb3VyY2VTZXJ2aWNlID0gaW5qZWN0b3IuZ2V0KFxuICAgICAgU0FDTE9DQUxJU0FUSU9OX1NFUlZJQ0UsXG4gICAgICBuZXcgU2FjRGVmYXVsdExvY2FsaXNhdGlvblNlcnZpY2UodGhpcy52YWxpZGF0aW9uS2V5U2VydmljZSlcbiAgICApO1xuXG4gICAgdGhpcy5pY29uU2VydmljZSA9IGluamVjdG9yLmdldChcbiAgICAgIFNBQ0lDT05fU0VSVklDRSxcbiAgICAgIG5ldyBTYWNEZWZhdWx0SWNvblNlcnZpY2UoKVxuICAgICk7XG4gIH1cblxuICAvLyAjZW5kcmVnaW9uIENvbnN0cnVjdG9yc1xuXG4gIC8vICNyZWdpb24gUHVibGljIEdldHRlcnMgQW5kIFNldHRlcnNcblxuICAvKipcbiAgICogU2V0enQgZGVuIFNlbGVjZWQgTm9kZSDDvGJlciBkZW4gUGZhZFxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBzZWxlY3RlZGZpbGUodjogc3RyaW5nIHwgbnVsbCkge1xuICAgIGNvbnN0IHNlbGVjdGVkbm9kZSA9IHRoaXMuZmluZFNlbGVjdGVkTm9kZUJ5UGF0aCh0aGlzLnJvb3ROb2RlLCB2KTtcblxuICAgIGlmIChzZWxlY3RlZG5vZGUgIT09IG51bGwpIHtcbiAgICAgIHRoaXMuc2VsZWN0Tm9kZShzZWxlY3RlZG5vZGUpO1xuICAgIH1cblxuICAgIHRoaXMucHJlc2VsZWNlZGZpbGUgPSB2O1xuICB9XG5cbiAgLyoqXG4gICAqIENTUyBpY29uIGNsYXNzIGZvciBkZWxldGUgaWNvblxuICAgKiBAcmV0dXJucyBjc3MgY2xhc3Mgd2l0aCBpY29uXG4gICAqL1xuICBwdWJsaWMgZ2V0IGljb25EZWxldGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pY29uU2VydmljZS5Ccm93c2VyQ29tcG9uZW50RGVsZXRlSWNvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDU1MgaWNvbiBjbGFzcyBmb3IgZWRpdCBpY29uXG4gICAqIEByZXR1cm5zIGNzcyBjbGFzcyB3aXRoIGljb25cbiAgICovXG4gIHB1YmxpYyBnZXQgaWNvbkVkaXQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pY29uU2VydmljZS5Ccm93c2VyQ29tcG9uZW50RWRpdEljb247XG4gIH1cblxuICAvKipcbiAgICogQ1NTIGljb24gZm9yIGZvbGRlcnMgaW4gdHJlZSB0aGVyZSBhcmUgY29sbGFic2VkXG4gICAqIEByZXR1cm5zIGNzcyBjbGFzcyB3aXRoIGljb25cbiAgICovXG4gIHB1YmxpYyBnZXQgaWNvbkZvbGRlckNvbGxhYnNlZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmljb25TZXJ2aWNlLkJyb3dzZXJDb21wb25lbnRGb2xkZXJDbG9zZWRJY29uO1xuICB9XG5cbiAgLyoqXG4gICAqIENTUyBpY29uIGNsYXNzIGZvciBmb2xkZXJzIHdpdGhvdXQgc3ViZm9sZGVyc1xuICAgKiBAcmV0dXJucyBjc3MgY2xhc3Mgd2l0aCBpY29uXG4gICAqL1xuICBwdWJsaWMgZ2V0IGljb25Gb2xkZXJFbXB0eSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmljb25TZXJ2aWNlLkJyb3dzZXJDb21wb25lbnRGb2xkZXJFbXB0eUljb247XG4gIH1cblxuICAvKipcbiAgICogQ1NTIGljb24gZm9yIG5ldyBmb2xkZXJzIGFjdGlvblxuICAgKiBAcmV0dXJucyBjc3MgY2xhc3Mgd2l0aCBpY29uXG4gICAqL1xuICBwdWJsaWMgZ2V0IGljb25Gb2xkZXJOZXcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pY29uU2VydmljZS5Ccm93c2VyQ29tcG9uZW50Rm9sZGVyTmV3SWNvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDU1MgaWNvbiBmb3IgZm9sZGVycyBpbiB0cmVlIHRoZXJlIGFyZSBleHBhbmRlZFxuICAgKiBAcmV0dXJucyBjc3MgY2xhc3Mgd2l0aCBpY29uXG4gICAqL1xuICBwdWJsaWMgZ2V0IGljb25Gb2xkZXJPcGVuKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuaWNvblNlcnZpY2UuQnJvd3NlckNvbXBvbmVudEZvbGRlck9wZW5JY29uO1xuICB9XG5cbiAgLyoqXG4gICAqIENTUyBpY29uIGNsYXNzIGZvciByZWZyZXNoIGljb25cbiAgICogQHJldHVybnMgY3NzIGNsYXNzIHdpdGggaWNvblxuICAgKi9cbiAgcHVibGljIGdldCBpY29uUmVmcmVzaCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmljb25TZXJ2aWNlLkJyb3dzZXJDb21wb25lbnRSZWZyZXNoSWNvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZsO8ciBTZWxlY3RlZCBGaWxlLiBJc3QgYW4gSW5wdXQgUHJvcGVydHkgZ2VidW5kZW5cbiAgICovXG4gIHB1YmxpYyBnZXQgc2VsZWN0ZWRmaWxlKCk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmICh0aGlzLnNlbGVjdEZpbGUgJiYgdGhpcy5zZWxlY3RGaWxlLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiB0aGlzLnNlbGVjdGVkRmlsZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLy8gI2VuZHJlZ2lvbiBQdWJsaWMgR2V0dGVycyBBbmQgU2V0dGVyc1xuXG4gIC8vICNyZWdpb24gUHVibGljIE1ldGhvZHNcblxuICAvKipcbiAgICogSG9zdExpc3RlbmVyIHdlbGNoZXIgZGVuIEVkaXQgTW9kZSBiZWkgYWxsZW4gRmlsZXMgdW5kIE5vZGVzIGJlZW5kZXQuXG4gICAqL1xuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpjbGljaycsIFsnJGV2ZW50LnRhcmdldCddKVxuICAvKipcbiAgICogQ2xpY2sgRXZlbnRcbiAgICovXG4gIHB1YmxpYyBleGl0RWRpdE1vZGUodGFyZ2V0RWxlbWVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnNlbGVjdGVkTm9kZSkge1xuICAgICAgdGhpcy5zZWxlY3RlZE5vZGUuRmlsZXMuZm9yRWFjaCgoaXRtKSA9PiAoaXRtLklzRWRpdE1vZGUgPSBmYWxzZSkpO1xuXG4gICAgICBpZiAoXG4gICAgICAgICF0aGlzLnNlbGVjdGVkTm9kZSB8fFxuICAgICAgICB0aGlzLnNlbGVjdGVkTm9kZS5OYW1lID09PSBudWxsIHx8XG4gICAgICAgIHRoaXMuc2VsZWN0ZWROb2RlLk5hbWUubGVuZ3RoID09PSAwXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5jbGVhck5ld0NoaWxkTm9kZXModGhpcy5yb290Tm9kZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5yZXNldE5vZGVFZGl0TW9kZShudWxsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMw7ZzY2h0IGVpbiBGaWxlXG4gICAqIEBwYXJhbSBmaWxlIEZpbGUgd2VsY2hlcyBnZWzDtnNjaHQgd2VyZGVuIHNvbGxcbiAgICovXG4gIHB1YmxpYyBkZWxldGVGaWxlKGZpbGU6IElCcm93c2VyRmlsZSk6IHZvaWQge1xuICAgIHRoaXMuY29uZmlybURlbGV0ZUZpbGUoZmlsZSkuc3Vic2NyaWJlKChjb25maXJtKSA9PiB7XG4gICAgICBpZiAoY29uZmlybSkge1xuICAgICAgICB0aGlzLmJyb3dzZXJTZXJ2aWNlXG4gICAgICAgICAgLkRlbGV0ZUZpbGUoXG4gICAgICAgICAgICB0aGlzLmFwaXVybCxcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWROb2RlLlBhdGggKyAnLycgKyBmaWxlLkZpbGVuYW1lLFxuICAgICAgICAgICAgdGhpcy5hbGxvd2VkdHlwZXNcbiAgICAgICAgICApXG4gICAgICAgICAgLnN1YnNjcmliZSgocmVzdWx0OiBJQnJvd3NlckZpbGVSZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZE5vZGUuRmlsZXMgPSByZXN1bHQuRmlsZXM7XG4gICAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTMO2c2NodCBlaW5lbiBOb2RlXG4gICAqIEBwYXJhbSBub2RlIE5vZGUgd2VsY2hlciBnZWzDtnNjaHQgd2VyZGVuIHNvbGxcbiAgICovXG4gIHB1YmxpYyBkZWxldGVOb2RlKG5vZGU6IElCcm93c2VyTm9kZSk6IHZvaWQge1xuICAgIHRoaXMuY29uZmlybURlbGV0ZU5vZGUobm9kZSkuc3Vic2NyaWJlKChjb25maXJtKSA9PiB7XG4gICAgICBpZiAoY29uZmlybSkge1xuICAgICAgICB0aGlzLmJyb3dzZXJTZXJ2aWNlXG4gICAgICAgICAgLkRlbGV0ZU5vZGUodGhpcy5hcGl1cmwsIG5vZGUuUGF0aClcbiAgICAgICAgICAuc3Vic2NyaWJlKChyZXN1bHQ6IElCcm93c2VyTm9kZVJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwYXJlbnROb2RlID0gdGhpcy5maW5kUGFyZW50Tm9kZSh0aGlzLnJvb3ROb2RlLCBub2RlKTtcbiAgICAgICAgICAgIHBhcmVudE5vZGUuQ2hpbGROb2RlcyA9IHJlc3VsdC5Ob2RlLkNoaWxkTm9kZXM7XG5cbiAgICAgICAgICAgIHRoaXMucm9vdE5vZGUuQ2hpbGROb2Rlcy5mb3JFYWNoKChpdG0pID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5maWxsUGF0aChpdG0sICcnKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0aGlzLnNlbGVjdE5vZGUocGFyZW50Tm9kZSk7XG4gICAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0enQgZWluIEZpbGUgaW4gZGVuIEVkaXQgTW9kZVxuICAgKiBAcGFyYW0gZmlsZSBGaWxlIHdlbGNoZXMgaW4gZGVuIEVkaXQgTW9kZSBnZXNldHp0IHdlcmRlbiBzb2xsXG4gICAqL1xuICBwdWJsaWMgZWRpdEZpbGUoZmlsZTogSUJyb3dzZXJGaWxlKTogdm9pZCB7XG4gICAgZmlsZS5Jc0VkaXRNb2RlID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR6dCBlaW5lbiBOb2RlIGluIGRlbiBFZGl0IE1vZGVcbiAgICogQHBhcmFtIG5vZGUgTm9kZSB3ZWxjaGVyIGJlYXJiZWl0ZXQgd2VyZGVuIHNvbGxcbiAgICovXG4gIHB1YmxpYyBlZGl0Tm9kZShub2RlOiBJQnJvd3Nlck5vZGUpOiB2b2lkIHtcbiAgICBub2RlLklzRWRpdE1vZGUgPSB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEVyemV1Z3QgZWluZW4gbmV1ZW4gTm9kZSBpbSBUcmVlXG4gICAqIEBwYXJhbSBub2RlIE5vZGUgdW50ZXIgd2VsY2hlbSBlaW4gbmV1ZXIgTm9kZSBlcnN0ZWxsdCB3ZXJkZW4gc29sbFxuICAgKi9cbiAgcHVibGljIG5ld05vZGUobm9kZTogSUJyb3dzZXJOb2RlKSB7XG4gICAgY29uc3QgaXRlbTogSUJyb3dzZXJOb2RlID0ge1xuICAgICAgQ2hpbGROb2RlczogW10sXG4gICAgICBGaWxlczogW10sXG4gICAgICBJc0VkaXRNb2RlOiBmYWxzZSxcbiAgICAgIElzRXhwYW5kZWQ6IGZhbHNlLFxuICAgICAgTmFtZTogJycsXG4gICAgICBQYXRoOiBub2RlLlBhdGgsXG4gICAgICBJc05ld05vZGU6IHRydWUsXG4gICAgfTtcblxuICAgIG5vZGUuQ2hpbGROb2Rlcy5wdXNoKGl0ZW0pO1xuICAgIHRoaXMuc2VsZWN0Tm9kZShpdGVtKTtcbiAgICB0aGlzLmVkaXROb2RlKGl0ZW0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXQgRXZlbnQgZGVyIEtvbXBvbmVudGVcbiAgICovXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmJyb3dzZXJTZXJ2aWNlXG4gICAgICAuR2V0Tm9kZSh0aGlzLmFwaXVybCwgJycsIHRoaXMuYWxsb3dlZHR5cGVzKVxuICAgICAgLnN1YnNjcmliZSgocmVzdWx0OiBJQnJvd3Nlck5vZGVSZXNwb25zZSkgPT4ge1xuICAgICAgICB0aGlzLnJvb3ROb2RlID0ge1xuICAgICAgICAgIE5hbWU6IHJlc3VsdC5Ob2RlLk5hbWUsXG4gICAgICAgICAgRmlsZXM6IHJlc3VsdC5Ob2RlLkZpbGVzLFxuICAgICAgICAgIENoaWxkTm9kZXM6IHJlc3VsdC5Ob2RlLkNoaWxkTm9kZXMsXG4gICAgICAgICAgSXNFeHBhbmRlZDogdHJ1ZSxcbiAgICAgICAgICBJc0VkaXRNb2RlOiBmYWxzZSxcbiAgICAgICAgICBJc05ld05vZGU6IGZhbHNlLFxuICAgICAgICAgIFBhdGg6ICcvJyxcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLnNldFBhdGhUb0FsbE5vZGVzKCk7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWROb2RlID0gdGhpcy5yb290Tm9kZTtcblxuICAgICAgICAvLyBTZWxlY3RlZCBGaWxlIGVybmV1dCBzZXR6ZW4sIHdlbm4gUHJvcGVydHkgZ2VzZXR6dCB3dXJkZSBiZXZvciBEYXRlbiB2b20gU2VydmljZSBnZWxhZGVuIHd1cmRlbi5cbiAgICAgICAgaWYgKHRoaXMucHJlc2VsZWNlZGZpbGUgIT09IG51bGwgJiYgdGhpcy5wcmVzZWxlY2VkZmlsZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdGhpcy5zZWxlY3RlZGZpbGUgPSB0aGlzLnByZXNlbGVjZWRmaWxlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBa3R1YWxpc2llcnQgZGVuIE5vZGVcbiAgICovXG4gIHB1YmxpYyByZWZyZXNoTm9kZShub2RlOiBJQnJvd3Nlck5vZGUpOiB2b2lkIHtcbiAgICBpZiAoIW5vZGUuSXNFeHBhbmRlZCkge1xuICAgICAgdGhpcy5zd2l0Y2hFeHBhbmROb2RlKG5vZGUpO1xuICAgIH1cblxuICAgIHRoaXMuYnJvd3NlclNlcnZpY2VcbiAgICAgIC5HZXROb2RlKHRoaXMuYXBpdXJsLCBub2RlLlBhdGgsIHRoaXMuYWxsb3dlZHR5cGVzKVxuICAgICAgLnN1YnNjcmliZSgocmVzdWx0OiBJQnJvd3Nlck5vZGVSZXNwb25zZSkgPT4ge1xuICAgICAgICBub2RlLkNoaWxkTm9kZXMgPSByZXN1bHQuTm9kZS5DaGlsZE5vZGVzO1xuICAgICAgICBub2RlLkZpbGVzID0gcmVzdWx0Lk5vZGUuRmlsZXM7XG5cbiAgICAgICAgdGhpcy5zZXRQYXRoVG9BbGxOb2RlcygpO1xuICAgICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kZSB3ZW5uIGVpbmUgRGF0ZWkgdW1iZW5hbm50IHdlcmRlbiBzb2xsXG4gICAqIEBwYXJhbSBmaWxlIEZpbGUgd2VsY2hlcyB1bWJlbmFubnQgd2VyZGVuIHNvbGxcbiAgICogQHBhcmFtIG5ld0ZpbGVuYW1lIE5ldWVyIERhdGVpbmFtZVxuICAgKi9cbiAgcHVibGljIHJlbmFtZUZpbGUoZmlsZTogSUJyb3dzZXJGaWxlLCBuZXdGaWxlbmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgZmlsZS5Jc0VkaXRNb2RlID0gZmFsc2U7XG5cbiAgICBpZiAoIW5ld0ZpbGVuYW1lIHx8IG5ld0ZpbGVuYW1lID09PSBudWxsIHx8IG5ld0ZpbGVuYW1lLmxlbmd0aCA9PT0gMCkge1xuICAgICAgLy8gQ2FuY2VsLCBJbnZhbGlkIEZpbGVuYW1lXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGZpbGUuRmlsZW5hbWUgIT09IG5ld0ZpbGVuYW1lKSB7XG4gICAgICB0aGlzLmJyb3dzZXJTZXJ2aWNlXG4gICAgICAgIC5SZW5hbWVGaWxlKFxuICAgICAgICAgIHRoaXMuYXBpdXJsLFxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWROb2RlLlBhdGggKyAnLycgKyBmaWxlLkZpbGVuYW1lLFxuICAgICAgICAgIG5ld0ZpbGVuYW1lLFxuICAgICAgICAgIHRoaXMuYWxsb3dlZHR5cGVzXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgocmVzdWx0OiBJQnJvd3NlckZpbGVSZXNwb25zZSkgPT4ge1xuICAgICAgICAgIHRoaXMuc2VsZWN0ZWROb2RlLkZpbGVzID0gcmVzdWx0LkZpbGVzO1xuICAgICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kZSB3ZW5uIGVpbiBOb2RlIHVtYmVuYW5udCB3ZXJkZW4gc29sbFxuICAgKiBAcGFyYW0gbm9kZSBOb2RlIHdlbGNoZXIgdW1iZW5hbm50IHdlcmRlbiBzb2xsXG4gICAqIEBwYXJhbSBuZXdGb2xkZXJuYW1lIE5ldWVyIE9yZG5lcm5hbWVcbiAgICovXG4gIHB1YmxpYyByZW5hbWVOb2RlKG5vZGU6IElCcm93c2VyTm9kZSwgbmV3Rm9sZGVybmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgbm9kZS5Jc0VkaXRNb2RlID0gZmFsc2U7XG5cbiAgICBpZiAoIW5vZGUuSXNOZXdOb2RlKSB7XG4gICAgICBpZiAoXG4gICAgICAgICFuZXdGb2xkZXJuYW1lIHx8XG4gICAgICAgIG5ld0ZvbGRlcm5hbWUgPT09IG51bGwgfHxcbiAgICAgICAgbmV3Rm9sZGVybmFtZS5sZW5ndGggPT09IDBcbiAgICAgICkge1xuICAgICAgICAvLyBDYW5jZWwgUmVuYW1lLiBJbnZhbGlkIEZvbGRlcm5hbWVcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAobm9kZS5OYW1lICE9PSBuZXdGb2xkZXJuYW1lKSB7XG4gICAgICAgIHRoaXMuYnJvd3NlclNlcnZpY2VcbiAgICAgICAgICAuUmVuYW1lTm9kZSh0aGlzLmFwaXVybCwgbm9kZS5QYXRoLCBuZXdGb2xkZXJuYW1lKVxuICAgICAgICAgIC5zdWJzY3JpYmUoKHJlc3VsdDogSUJyb3dzZXJOb2RlUmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgIG5vZGUuTmFtZSA9IHJlc3VsdC5Ob2RlLk5hbWU7XG5cbiAgICAgICAgICAgIHRoaXMuc2V0UGF0aFRvQWxsTm9kZXMoKTtcbiAgICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKFxuICAgICAgICAhbmV3Rm9sZGVybmFtZSB8fFxuICAgICAgICBuZXdGb2xkZXJuYW1lID09PSBudWxsIHx8XG4gICAgICAgIG5ld0ZvbGRlcm5hbWUubGVuZ3RoID09PSAwXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5jbGVhck5ld0NoaWxkTm9kZXModGhpcy5yb290Tm9kZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbm9kZS5OYW1lID0gbmV3Rm9sZGVybmFtZTtcbiAgICAgIG5vZGUuSXNOZXdOb2RlID0gZmFsc2U7XG4gICAgICB0aGlzLmJyb3dzZXJTZXJ2aWNlXG4gICAgICAgIC5TYXZlTm9kZSh0aGlzLmFwaXVybCwgbm9kZS5QYXRoLCBuZXdGb2xkZXJuYW1lKVxuICAgICAgICAuc3Vic2NyaWJlKChyZXN1bHQ6IElCcm93c2VyTm9kZVJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgbm9kZS5OYW1lID0gcmVzdWx0Lk5vZGUuTmFtZTtcbiAgICAgICAgICBub2RlLkZpbGVzID0gcmVzdWx0Lk5vZGUuRmlsZXM7XG5cbiAgICAgICAgICB0aGlzLnNldFBhdGhUb0FsbE5vZGVzKCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2RlIHdlbm4gZWluIEZpbGUgc2VsZWt0aWVydCB3aXJkXG4gICAqIEBwYXJhbSBmaWxlIEZpbGUgd2VsY2hlcyBzZWxla3RpZXJ0IHdpcmRcbiAgICovXG4gIHB1YmxpYyBzZWxlY3RGaWxlKGZpbGU6IElCcm93c2VyRmlsZSkge1xuICAgIGlmICghZmlsZS5Jc0VkaXRNb2RlKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkTm9kZS5GaWxlcy5mb3JFYWNoKChpdG0pID0+IChpdG0uSXNFZGl0TW9kZSA9IGZhbHNlKSk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkTm9kZS5QYXRoLmVuZHNXaXRoKCcvJykpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRGaWxlID0gdGhpcy5zZWxlY3RlZE5vZGUuUGF0aCArICcvJyArIGZpbGUuRmlsZW5hbWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRGaWxlID0gJy8nICsgZmlsZS5GaWxlbmFtZTtcbiAgICB9XG5cbiAgICB0aGlzLnNlbGVjdGVkRmlsZUl0ZW0gPSBmaWxlO1xuICAgIHRoaXMuZmlsZS5lbWl0KHRoaXMuc2VsZWN0ZWRGaWxlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2RlIHdlbm4gZWluIE5vZGUgc2VsZWt0aWVydCB3aXJkXG4gICAqIEBwYXJhbSBub2RlIE5vZGUgd2VsY2hlciBzZWxla3RpZXJ0IHdlcmRlbiBzb2xsXG4gICAqL1xuICBwdWJsaWMgc2VsZWN0Tm9kZShub2RlOiBJQnJvd3Nlck5vZGUpOiB2b2lkIHtcbiAgICBpZiAoIW5vZGUuSXNFeHBhbmRlZCkge1xuICAgICAgdGhpcy5zd2l0Y2hFeHBhbmROb2RlKG5vZGUpO1xuICAgIH1cblxuICAgIC8vIFJlc2V0IHRoZSBFZGl0IE1vZGUgaW4gYWxsIE5vZGVzXG4gICAgdGhpcy5yZXNldE5vZGVFZGl0TW9kZShudWxsKTtcblxuICAgIGlmICghbm9kZS5GaWxlcykge1xuICAgICAgdGhpcy5icm93c2VyU2VydmljZVxuICAgICAgICAuR2V0RmlsZXModGhpcy5hcGl1cmwsIG5vZGUuUGF0aCwgdGhpcy5hbGxvd2VkdHlwZXMpXG4gICAgICAgIC5zdWJzY3JpYmUoKHJlc3VsdDogSUJyb3dzZXJGaWxlUmVzcG9uc2UpID0+IHtcbiAgICAgICAgICBub2RlLkZpbGVzID0gcmVzdWx0LkZpbGVzO1xuICAgICAgICAgIHRoaXMuc2VsZWN0ZWROb2RlID0gbm9kZTtcblxuICAgICAgICAgIGlmICh0aGlzLnByZXNlbGVjZWRmaWxlICE9PSBudWxsICYmIHRoaXMucHJlc2VsZWNlZGZpbGUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgZmlsZW5hbWUgPSB0aGlzLnByZXNlbGVjZWRmaWxlLnN1YnN0cmluZyhcbiAgICAgICAgICAgICAgdGhpcy5wcmVzZWxlY2VkZmlsZS5sYXN0SW5kZXhPZignLycpICsgMVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IGZpbGUgPSBub2RlLkZpbGVzLmZpbmQoKGl0bSkgPT4gaXRtLkZpbGVuYW1lID09PSBmaWxlbmFtZSk7XG4gICAgICAgICAgICBpZiAoZmlsZSkge1xuICAgICAgICAgICAgICB0aGlzLnNlbGVjdEZpbGUoZmlsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZWxlY3RlZE5vZGUgPSBub2RlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBhbmQvQ29sbGFic2UgTWV0aG9kZSBmw7xyIE5vZGVzXG4gICAqIEBwYXJhbSBub2RlIE5vZGUgd2VsY2hlciBnZcO2ZmZuZXQgb2RlciBnZXNjaGxvc3NlbiB3ZXJkZW4gc29sbFxuICAgKi9cbiAgcHVibGljIHN3aXRjaEV4cGFuZE5vZGUobm9kZTogSUJyb3dzZXJOb2RlKTogdm9pZCB7XG4gICAgaWYgKG5vZGUuSXNFeHBhbmRlZCkge1xuICAgICAgbm9kZS5Jc0V4cGFuZGVkID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5vZGUuSXNFeHBhbmRlZCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZGUgZGllIEF1ZmdlcnVmZW4gd2VyZGVuIG11c3MsIHdlbm4gZWluIFVwbG9hZCBiZWVuZGV0IGlzdC5cbiAgICogQHBhcmFtIHBhcmFtIFBhcmFtZXRlciBkZXMgaG9jaGdlbGFkZW5lbiBGaWxlc1xuICAgKi9cbiAgcHVibGljIHVwbG9hZENvbXBsZXRlKG5vZGU6IElCcm93c2VyTm9kZSwgdXBsb2FkSWRMaXN0OiBzdHJpbmdbXSk6IHZvaWQge1xuICAgIGlmICh1cGxvYWRJZExpc3QgIT09IG51bGwpIHtcbiAgICAgIHVwbG9hZElkTGlzdC5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgIGlmICh0aGlzLnVwbG9hZHMuaW5kZXhPZihlbGVtZW50KSA8IDApIHtcbiAgICAgICAgICB0aGlzLnVwbG9hZHMucHVzaChlbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgaWQgPSB0aGlzLnVwbG9hZHMucG9wKCk7XG4gICAgaWYgKGlkKSB7XG4gICAgICB0aGlzLmJyb3dzZXJTZXJ2aWNlXG4gICAgICAgIC5TYXZlRmlsZSh0aGlzLmFwaXVybCwgbm9kZS5QYXRoLCBpZCwgdGhpcy5hbGxvd2VkdHlwZXMpXG4gICAgICAgIC5zdWJzY3JpYmUoKHJlc3VsdDogSUJyb3dzZXJGaWxlUmVzcG9uc2UpID0+IHtcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkTm9kZS5GaWxlcyA9IHJlc3VsdC5GaWxlcztcbiAgICAgICAgICB0aGlzLnVwbG9hZGVkRmlsZU1vdmVkKGlkKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLy8gI2VuZHJlZ2lvbiBQdWJsaWMgTWV0aG9kc1xuXG4gIC8vICNyZWdpb24gUHVibGljIEFic3RyYWN0IE1ldGhvZHNcblxuICAvKipcbiAgICogQWJzdHJha3RlIENvbmZpcm0gTWV0aG9kZSB3ZWxjaGUgaW1wbGVtZW50aWVydCB3ZXJkZW4gbXVzcy4gTWV0aG9kZSB3aXJkIGF1ZmdlcnVmZW4sIHdlbm4gZWluZVxuICAgKiBEYXRlaSBnZWzDtnNjaHQgd2VyZGVuIHNvbGwuXG4gICAqIEBwYXJhbSBmaWxlIEZpbGUgZsO8ciB3ZWxjaGVzIGVpbiBEZWxldGUgQ29uZmlybSBlaW5nZWZvcmRlcnQgd2VyZGVuIHNvbGxcbiAgICovXG4gIHB1YmxpYyBhYnN0cmFjdCBjb25maXJtRGVsZXRlRmlsZShmaWxlOiBJQnJvd3NlckZpbGUpOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuICAvKipcbiAgICogQWJzdHJha3RlIENvbmZpcm0gTWV0aG9kZSB3ZWxjaGUgaW1wbGVtZW50aWVydCB3ZXJkZW4gbXVzcy4gTWV0aG9kZSB3aXJkIGF1ZmdlcnVmZW4sIHdlbm4gZWluXG4gICAqIE9yZG5lciBnZWzDtnNjaHQgd2VyZGVuIHNvbGwuXG4gICAqIEBwYXJhbSBmb2xkZXIgT3JkZXJuIGbDvHIgd2VsY2hlbiBlaW4gRGVsZXRlIENvbmZpcm0gZWluZ2Vmb3JkZXJ0IHdlcmRlbiBzb2xsLlxuICAgKi9cbiAgcHVibGljIGFic3RyYWN0IGNvbmZpcm1EZWxldGVOb2RlKGZvbGRlcjogSUJyb3dzZXJOb2RlKTogT2JzZXJ2YWJsZTxib29sZWFuPjtcbiAgLyoqXG4gICAqIEFic3RyYWt0ZSBNZXRob2RlIGRpZSBBdWZnZXJ1ZmVuIHdpcmQsIHdlbm4gZGFzIEhvY2hnZWxhZGVuZSBGaWxlIGF1cyBkZW0gVGVtcCBGb2xkZXIgaW4gZGllXG4gICAqIFN0cnVrdHVyIHZlcnNjaG9iZW4gd3VyZGUuXG4gICAqIEBwYXJhbSB1cGxvYWRpZCBJRCBkZXMgVXBsb2Fkc1xuICAgKi9cbiAgcHVibGljIGFic3RyYWN0IHVwbG9hZGVkRmlsZU1vdmVkKHVwbG9hZGlkOiBzdHJpbmcpOiB2b2lkO1xuXG4gIC8vICNlbmRyZWdpb24gUHVibGljIEFic3RyYWN0IE1ldGhvZHNcblxuICAvLyAjcmVnaW9uIFByaXZhdGUgTWV0aG9kc1xuXG4gIC8qKlxuICAgKiBSZWt1cnNpdmUgTWV0aG9kZSB3ZWxjaGUgYmVpbSBOb2RlIHVuZCBhbGwgc2VpbmVuIENoaWxkcyBuZXVlIE5vZGVzIGVudGZlcm50XG4gICAqIEBwYXJhbSBub2RlIE5vZGUgYmVpIHdlbGNoZW0gYWxsZSBuZXVlbiBOb2RlcyBlbnRmZXJudCB3ZXJkZW4gc29sbC5cbiAgICovXG4gIHByaXZhdGUgY2xlYXJOZXdDaGlsZE5vZGVzKG5vZGU6IElCcm93c2VyTm9kZSkge1xuICAgIG5vZGUuQ2hpbGROb2Rlcy5mb3JFYWNoKChpdG0pID0+IHtcbiAgICAgIGlmIChpdG0uSXNOZXdOb2RlKSB7XG4gICAgICAgIG5vZGUuQ2hpbGROb2Rlcy5zcGxpY2Uobm9kZS5DaGlsZE5vZGVzLmluZGV4T2YoaXRtKSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBub2RlLkNoaWxkTm9kZXMuZm9yRWFjaCgoaXRtKSA9PiB0aGlzLmNsZWFyTmV3Q2hpbGROb2RlcyhpdG0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2RlIHdlbGNoZSBkZW4gUGZhZCBmw7xyIGVpbmVuIE5vZGUgZXJ6ZXVndFxuICAgKiBAcGFyYW0gbm9kZSBOb2RlIGbDvHIgd2VsY2hlbiBkZXIgUGZhZCBlcnpldWd0IHdlcmRlbiBzb2xsXG4gICAqIEBwYXJhbSBwYXJlbnRQYXRoIMOcYmVyZ2VvcmRuZXRlciBQZmFkXG4gICAqL1xuICBwcml2YXRlIGZpbGxQYXRoKG5vZGU6IElCcm93c2VyTm9kZSwgcGFyZW50UGF0aDogc3RyaW5nKSB7XG4gICAgbm9kZS5QYXRoID0gcGFyZW50UGF0aCArICcvJyArIG5vZGUuTmFtZTtcbiAgICBub2RlLkNoaWxkTm9kZXMuZm9yRWFjaCgoaXRtKSA9PiB7XG4gICAgICB0aGlzLmZpbGxQYXRoKGl0bSwgbm9kZS5QYXRoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWNodCBkZW4gw7xiZXJnZW9yZG5ldGVuIE5vZGUgaW0gVHJlZVxuICAgKiBAcGFyYW0gbm9kZSBBa3R1ZWxsZXIgTm9kZVxuICAgKiBAcGFyYW0gbm9kZVRvRmluZCBOb2RlIHdlbGNoZXIgZ2VmdW5kZW4gd2VyZGVuIHNvbGxcbiAgICogQHJldHVybnMgTm9kZSB3ZW5uIGVyIGdlZnVuZGVuIHd1cmRlLCBhbnNvbnN0ZW4gd2lyZCBOVUxMIHp1csO8Y2tnZWdlYmVuXG4gICAqL1xuICBwcml2YXRlIGZpbmRQYXJlbnROb2RlKFxuICAgIG5vZGU6IElCcm93c2VyTm9kZSxcbiAgICBub2RlVG9GaW5kOiBJQnJvd3Nlck5vZGVcbiAgKTogSUJyb3dzZXJOb2RlIHtcbiAgICBpZiAobm9kZS5DaGlsZE5vZGVzLmluZGV4T2Yobm9kZVRvRmluZCkgPj0gMCkge1xuICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiBub2RlLkNoaWxkTm9kZXMpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuZmluZFBhcmVudE5vZGUoY2hpbGQsIG5vZGVUb0ZpbmQpO1xuICAgICAgaWYgKHJlc3VsdCAhPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFN1Y2h0IGVpbmVuIE5vZGUgZ2VtLiBlaW5lbSBVUkwgUGZhZFxuICAgKiBAcGFyYW0gbm9kZSBOb2RlIGluIHdlbGNoZW0gZ2VzdWNodCB3ZXJkZW4gc29sbFxuICAgKiBAcGFyYW0gcGF0aCBQZmFkIG5hY2ggd2VsY2hlbSBnZXN1Y2h0IHdpcmRcbiAgICogQHJldHVybnMgTm9kZSB3ZWxjaGVyIHp1bSBnZXN1Y2h0ZW4gUGZhZCBwYXNzdC4gV2VubiBrZWluIE5vZGUgZ2VmdW5kZW4gd2lyZCwgd2lyZCBOVUxMIHp1csO8Y2tnZWdlYmVuXG4gICAqL1xuICBwcml2YXRlIGZpbmRTZWxlY3RlZE5vZGVCeVBhdGgoXG4gICAgbm9kZTogSUJyb3dzZXJOb2RlLFxuICAgIHBhdGg6IHN0cmluZ1xuICApOiBJQnJvd3Nlck5vZGUge1xuICAgIC8vIENhbmNlbCB3ZW5uIFBmYWQgbmljaHQgZGVmaW5pZXJ0XG4gICAgaWYgKHBhdGggPT09IHVuZGVmaW5lZCB8fCBwYXRoID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBQZmFkIGluIEFycmF5IHNwbGl0dGVuIHVuZCBSb290IEZvbGRlcm5hbWUgc2V0emVuXG4gICAgY29uc3QgcGF0aEFycmF5ID0gcGF0aC5zcGxpdCgnLycpO1xuICAgIHBhdGhBcnJheVswXSA9IHRoaXMucm9vdE5vZGUuTmFtZTtcblxuICAgIHJldHVybiB0aGlzLmZpbmRTZWxlY3RlZE5vZGVCeVBhdGhBcnJheShub2RlLCBwYXRoQXJyYXksIDApO1xuICB9XG5cbiAgLyoqXG4gICAqIFN1Y2h0IGVpbmVuIE5vZGUgZ2VtLiBlaW5lbSBBcnJheSB2b24gTm9kZSBOYW1lblxuICAgKiBAcGFyYW0gbm9kZSBOb2RlIGluIHdlbGNoZW0gZ2VzdWNodCB3ZXJkZW4gc29sbFxuICAgKiBAcGFyYW0gcGF0aCBBcnJheSB2b24gTm9kZSBOYW1lbiwgd2VsY2hlIGRpZSBIaXJhcmNoeSBkZXMgUGZhZGVzIGFiYmlsZGVuXG4gICAqIEBwYXJhbSBpbmRleCBBa3R1ZWxsZXIgSW5kZXggaW0gUEFUSCBBcnJheVxuICAgKiBAcmV0dXJucyBOb2RlIHdlbm4gZWluZXIgZ2VmdW5kZW4gd3VyZGUsIGFuc29uc3RlbiBOVUxMXG4gICAqL1xuICBwcml2YXRlIGZpbmRTZWxlY3RlZE5vZGVCeVBhdGhBcnJheShcbiAgICBub2RlOiBJQnJvd3Nlck5vZGUsXG4gICAgcGF0aDogc3RyaW5nW10sXG4gICAgaW5kZXg6IG51bWJlclxuICApOiBJQnJvd3Nlck5vZGUge1xuICAgIC8vIENoZWNrIG9iIE9yZG5lciBrb3JyZWt0LiBMZXR6ZXIgT3JkbmVyIHp1csO8Y2tnZWJlbi4gUGF0aCBMYXN0IEluZGV4IGlzdCBkZXIgRmlsZW5hbWVcbiAgICBpZiAobm9kZS5OYW1lID09PSBwYXRoW2luZGV4XSAmJiBwYXRoLmxlbmd0aCAtIDIgPT09IGluZGV4KSB7XG4gICAgICByZXR1cm4gbm9kZTtcbiAgICB9IGVsc2UgaWYgKG5vZGUuTmFtZSA9PT0gcGF0aFtpbmRleF0pIHtcbiAgICAgIC8vIEV4cGFuZCBOb2RlXG4gICAgICBub2RlLklzRXhwYW5kZWQgPSB0cnVlO1xuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIG5vZGUuQ2hpbGROb2Rlcykge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmZpbmRTZWxlY3RlZE5vZGVCeVBhdGhBcnJheShpdGVtLCBwYXRoLCBpbmRleCArIDEpO1xuXG4gICAgICAgIGlmIChyZXN1bHQgIT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJla3Vyc2l2ZSBNZXRob2RlIHdlbGNoZSBiZWltIE5vZGUgdW5kIGFsbCBzZWluZW4gQ2hpbGRzIGRlbiBFZGl0IE1vZGUgYmVlbmRldC5cbiAgICogQHBhcmFtIG5vZGUgTm9kZSBiZWkgd2VsY2hlbSBkZXIgRWRpdCBNb2RlIGJlZW5kZXQgd2VyZGVuIHNvbGxcbiAgICovXG4gIHByaXZhdGUgcmVzZXROb2RlRWRpdE1vZGUobm9kZTogSUJyb3dzZXJOb2RlKTogdm9pZCB7XG4gICAgaWYgKG5vZGUgPT09IG51bGwpIHtcbiAgICAgIHRoaXMucmVzZXROb2RlRWRpdE1vZGUodGhpcy5yb290Tm9kZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5vZGUuSXNFZGl0TW9kZSA9IGZhbHNlO1xuXG4gICAgICBpZiAobm9kZS5DaGlsZE5vZGVzKSB7XG4gICAgICAgIG5vZGUuQ2hpbGROb2Rlcy5mb3JFYWNoKChpdG0pID0+IHRoaXMucmVzZXROb2RlRWRpdE1vZGUoaXRtKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHp0IGRlbiBQZmFkIGluIGFsbGVuIE5vZGVzXG4gICAqL1xuICBwcml2YXRlIHNldFBhdGhUb0FsbE5vZGVzKCkge1xuICAgIHRoaXMucm9vdE5vZGUuQ2hpbGROb2Rlcy5mb3JFYWNoKChpdG0pID0+IHtcbiAgICAgIHRoaXMuZmlsbFBhdGgoaXRtLCAnJyk7XG4gICAgfSk7XG4gIH1cblxuICAvLyAjZW5kcmVnaW9uIFByaXZhdGUgTWV0aG9kc1xufVxuIl19
|