@dotglitch/ngx-common 3.0.0-beta.1 → 3.0.0-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/command-palette/breadcrumb/breadcrumb.component.d.ts +16 -0
- package/command-palette/command-palette.component.d.ts +38 -0
- package/command-palette/command-palette.service.d.ts +128 -0
- package/command-palette/index.d.ts +2 -0
- package/command-palette/shortcut/shortcut.component.d.ts +9 -0
- package/{components → core/components}/menu/menu.component.d.ts +2 -2
- package/{directives → core/components/menu}/menu.directive.d.ts +1 -1
- package/{types/menu.d.ts → core/components/menu/types.d.ts} +1 -1
- package/{components → core/components}/types.d.ts +0 -1
- package/{public-api.d.ts → core/index.d.ts} +8 -4
- package/{services → core/services}/navigation.service.d.ts +1 -1
- package/core/utils/index.d.ts +18 -0
- package/esm2022/command-palette/breadcrumb/breadcrumb.component.mjs +30 -0
- package/esm2022/command-palette/command-palette.component.mjs +257 -0
- package/esm2022/command-palette/command-palette.service.mjs +207 -0
- package/esm2022/command-palette/dotglitch-ngx-common-command-palette.mjs +5 -0
- package/esm2022/command-palette/index.mjs +3 -0
- package/esm2022/command-palette/shortcut/shortcut.component.mjs +19 -0
- package/esm2022/core/components/lazy-loader/lazy-loader.component.mjs +383 -0
- package/esm2022/core/components/lazy-loader/lazy-loader.module.mjs +33 -0
- package/esm2022/core/components/lazy-loader/lazy-loader.service.mjs +216 -0
- package/esm2022/core/components/lazy-loader/types.mjs +26 -0
- package/esm2022/core/components/menu/menu.component.mjs +433 -0
- package/esm2022/core/components/menu/menu.directive.mjs +159 -0
- package/esm2022/core/components/menu/types.mjs +2 -0
- package/esm2022/core/components/parallax-card/parallax-card.component.mjs +138 -0
- package/esm2022/core/components/types.mjs +3 -0
- package/esm2022/core/directives/image-cache.directive.mjs +143 -0
- package/esm2022/core/directives/utils.mjs +120 -0
- package/esm2022/core/dotglitch-ngx-common-core.mjs +5 -0
- package/esm2022/core/index.mjs +50 -0
- package/esm2022/core/pipes/html-bypass.pipe.mjs +27 -0
- package/esm2022/core/pipes/resource-bypass.pipe.mjs +27 -0
- package/esm2022/core/pipes/script-bypass.pipe.mjs +27 -0
- package/esm2022/core/pipes/style-bypass.pipe.mjs +27 -0
- package/esm2022/core/pipes/url-bypass.pipe.mjs +27 -0
- package/esm2022/core/services/dependency.service.mjs +55 -0
- package/esm2022/core/services/dialog.service.mjs +67 -0
- package/esm2022/core/services/fetch.service.mjs +74 -0
- package/esm2022/core/services/file.service.mjs +42 -0
- package/esm2022/core/services/keyboard.service.mjs +128 -0
- package/esm2022/core/services/navigation.service.mjs +50 -0
- package/esm2022/core/services/theme.service.mjs +64 -0
- package/esm2022/core/types/popup.mjs +2 -0
- package/esm2022/core/utils/index.mjs +69 -0
- package/esm2022/dotglitch-ngx-common.mjs +2 -2
- package/esm2022/filemanager/dotglitch-ngx-common-filemanager.mjs +5 -0
- package/esm2022/filemanager/file-grid/file-grid.component.mjs +676 -0
- package/esm2022/filemanager/filemanager.component.mjs +313 -0
- package/esm2022/filemanager/folder-rename/folder-rename.component.mjs +57 -0
- package/esm2022/filemanager/helpers.mjs +26 -0
- package/esm2022/filemanager/icon-resolver.mjs +155 -0
- package/esm2022/filemanager/index.mjs +2 -0
- package/esm2022/filemanager/mat-icons.mjs +5705 -0
- package/esm2022/filemanager/textextensions.mjs +294 -0
- package/esm2022/filemanager/toolbar/breadcrumb/breadcrumb.component.mjs +22 -0
- package/esm2022/filemanager/toolbar/icon-button/icon-button.component.mjs +32 -0
- package/esm2022/filemanager/toolbar/toolbar.component.mjs +165 -0
- package/esm2022/filemanager/tree-view/tree-view.component.mjs +51 -0
- package/esm2022/filemanager/types.mjs +2 -0
- package/esm2022/index.mjs +3 -0
- package/esm2022/monaco-editor/dotglitch-ngx-common-monaco-editor.mjs +5 -0
- package/esm2022/monaco-editor/index.mjs +2 -0
- package/esm2022/monaco-editor/monaco-editor.component.mjs +234 -0
- package/esm2022/monaco-editor/ts-type-resolver/dependency-parser.mjs +91 -0
- package/esm2022/monaco-editor/ts-type-resolver/dummy-source-cache.mjs +15 -0
- package/esm2022/monaco-editor/ts-type-resolver/import-resolver.mjs +311 -0
- package/esm2022/monaco-editor/ts-type-resolver/main.mjs +112 -0
- package/esm2022/monaco-editor/ts-type-resolver/recursion-depth.mjs +21 -0
- package/esm2022/monaco-editor/ts-type-resolver/types.mjs +14 -0
- package/esm2022/monaco-editor/ts-type-resolver/unpkg-source-resolver.mjs +21 -0
- package/esm2022/monaco-editor/ts-type-resolver/update-emitter.mjs +37 -0
- package/esm2022/overlay-wrapper/dotglitch-ngx-common-overlay-wrapper.mjs +5 -0
- package/esm2022/overlay-wrapper/index.mjs +2 -0
- package/esm2022/overlay-wrapper/overlay-wrapper.component.mjs +247 -0
- package/esm2022/tooltip/dotglitch-ngx-common-tooltip.mjs +5 -0
- package/esm2022/tooltip/index.mjs +4 -0
- package/esm2022/tooltip/tooltip.component.mjs +204 -0
- package/esm2022/tooltip/tooltip.directive.mjs +153 -0
- package/esm2022/tooltip/types.mjs +2 -0
- package/fesm2022/dotglitch-ngx-common-command-palette.mjs +508 -0
- package/fesm2022/dotglitch-ngx-common-command-palette.mjs.map +1 -0
- package/fesm2022/dotglitch-ngx-common-core.mjs +2280 -0
- package/fesm2022/dotglitch-ngx-common-core.mjs.map +1 -0
- package/fesm2022/dotglitch-ngx-common-filemanager-folder-rename.component-CnKuU8nn.mjs +60 -0
- package/fesm2022/dotglitch-ngx-common-filemanager-folder-rename.component-CnKuU8nn.mjs.map +1 -0
- package/fesm2022/dotglitch-ngx-common-filemanager.mjs +7403 -0
- package/fesm2022/dotglitch-ngx-common-filemanager.mjs.map +1 -0
- package/fesm2022/dotglitch-ngx-common-monaco-editor.mjs +850 -0
- package/fesm2022/dotglitch-ngx-common-monaco-editor.mjs.map +1 -0
- package/fesm2022/dotglitch-ngx-common-overlay-wrapper.mjs +254 -0
- package/fesm2022/dotglitch-ngx-common-overlay-wrapper.mjs.map +1 -0
- package/fesm2022/dotglitch-ngx-common-tooltip.mjs +357 -0
- package/fesm2022/dotglitch-ngx-common-tooltip.mjs.map +1 -0
- package/fesm2022/dotglitch-ngx-common.mjs +3 -2757
- package/fesm2022/dotglitch-ngx-common.mjs.map +1 -1
- package/filemanager/file-grid/file-grid.component.d.ts +94 -0
- package/filemanager/filemanager.component.d.ts +206 -0
- package/filemanager/folder-rename/folder-rename.component.d.ts +18 -0
- package/filemanager/helpers.d.ts +5 -0
- package/filemanager/icon-resolver.d.ts +13 -0
- package/filemanager/index.d.ts +1 -0
- package/filemanager/mat-icons.d.ts +5705 -0
- package/filemanager/textextensions.d.ts +3 -0
- package/filemanager/toolbar/breadcrumb/breadcrumb.component.d.ts +16 -0
- package/filemanager/toolbar/icon-button/icon-button.component.d.ts +11 -0
- package/filemanager/toolbar/toolbar.component.d.ts +31 -0
- package/filemanager/tree-view/tree-view.component.d.ts +21 -0
- package/filemanager/types.d.ts +1 -0
- package/index.d.ts +1 -5
- package/monaco-editor/README.md +3 -0
- package/monaco-editor/index.d.ts +1 -0
- package/monaco-editor/monaco-editor.component.d.ts +53 -0
- package/monaco-editor/ts-type-resolver/dependency-parser.d.ts +6 -0
- package/monaco-editor/ts-type-resolver/dummy-source-cache.d.ts +7 -0
- package/monaco-editor/ts-type-resolver/import-resolver.d.ts +28 -0
- package/monaco-editor/ts-type-resolver/main.d.ts +22 -0
- package/monaco-editor/ts-type-resolver/recursion-depth.d.ts +11 -0
- package/monaco-editor/ts-type-resolver/types.d.ts +179 -0
- package/monaco-editor/ts-type-resolver/unpkg-source-resolver.d.ts +5 -0
- package/monaco-editor/ts-type-resolver/update-emitter.d.ts +2 -0
- package/overlay-wrapper/index.d.ts +1 -0
- package/overlay-wrapper/overlay-wrapper.component.d.ts +11 -0
- package/package.json +104 -64
- package/tooltip/index.d.ts +3 -0
- package/{components/tooltip → tooltip}/tooltip.component.d.ts +3 -3
- package/{directives → tooltip}/tooltip.directive.d.ts +2 -2
- package/{types/tooltip.d.ts → tooltip/types.d.ts} +1 -1
- package/assets/lib/vs/base/browser/ui/codicons/codicon/codicon.ttf +0 -0
- package/assets/lib/vs/base/common/worker/simpleWorker.nls.de.js +0 -8
- package/assets/lib/vs/base/common/worker/simpleWorker.nls.es.js +0 -8
- package/assets/lib/vs/base/common/worker/simpleWorker.nls.fr.js +0 -8
- package/assets/lib/vs/base/common/worker/simpleWorker.nls.it.js +0 -8
- package/assets/lib/vs/base/common/worker/simpleWorker.nls.ja.js +0 -8
- package/assets/lib/vs/base/common/worker/simpleWorker.nls.js +0 -8
- package/assets/lib/vs/base/common/worker/simpleWorker.nls.ko.js +0 -8
- package/assets/lib/vs/base/common/worker/simpleWorker.nls.ru.js +0 -8
- package/assets/lib/vs/base/common/worker/simpleWorker.nls.zh-cn.js +0 -8
- package/assets/lib/vs/base/common/worker/simpleWorker.nls.zh-tw.js +0 -8
- package/assets/lib/vs/base/worker/workerMain.js +0 -24
- package/assets/lib/vs/basic-languages/abap/abap.js +0 -10
- package/assets/lib/vs/basic-languages/apex/apex.js +0 -10
- package/assets/lib/vs/basic-languages/azcli/azcli.js +0 -10
- package/assets/lib/vs/basic-languages/bat/bat.js +0 -10
- package/assets/lib/vs/basic-languages/bicep/bicep.js +0 -11
- package/assets/lib/vs/basic-languages/cameligo/cameligo.js +0 -10
- package/assets/lib/vs/basic-languages/clojure/clojure.js +0 -10
- package/assets/lib/vs/basic-languages/coffee/coffee.js +0 -10
- package/assets/lib/vs/basic-languages/cpp/cpp.js +0 -10
- package/assets/lib/vs/basic-languages/csharp/csharp.js +0 -10
- package/assets/lib/vs/basic-languages/csp/csp.js +0 -10
- package/assets/lib/vs/basic-languages/css/css.js +0 -12
- package/assets/lib/vs/basic-languages/cypher/cypher.js +0 -10
- package/assets/lib/vs/basic-languages/dart/dart.js +0 -10
- package/assets/lib/vs/basic-languages/dockerfile/dockerfile.js +0 -10
- package/assets/lib/vs/basic-languages/ecl/ecl.js +0 -10
- package/assets/lib/vs/basic-languages/elixir/elixir.js +0 -10
- package/assets/lib/vs/basic-languages/flow9/flow9.js +0 -10
- package/assets/lib/vs/basic-languages/freemarker2/freemarker2.js +0 -12
- package/assets/lib/vs/basic-languages/fsharp/fsharp.js +0 -10
- package/assets/lib/vs/basic-languages/go/go.js +0 -10
- package/assets/lib/vs/basic-languages/graphql/graphql.js +0 -10
- package/assets/lib/vs/basic-languages/handlebars/handlebars.js +0 -10
- package/assets/lib/vs/basic-languages/hcl/hcl.js +0 -10
- package/assets/lib/vs/basic-languages/html/html.js +0 -10
- package/assets/lib/vs/basic-languages/ini/ini.js +0 -10
- package/assets/lib/vs/basic-languages/java/java.js +0 -10
- package/assets/lib/vs/basic-languages/javascript/javascript.js +0 -10
- package/assets/lib/vs/basic-languages/julia/julia.js +0 -10
- package/assets/lib/vs/basic-languages/kotlin/kotlin.js +0 -10
- package/assets/lib/vs/basic-languages/less/less.js +0 -11
- package/assets/lib/vs/basic-languages/lexon/lexon.js +0 -10
- package/assets/lib/vs/basic-languages/liquid/liquid.js +0 -10
- package/assets/lib/vs/basic-languages/lua/lua.js +0 -10
- package/assets/lib/vs/basic-languages/m3/m3.js +0 -10
- package/assets/lib/vs/basic-languages/markdown/markdown.js +0 -10
- package/assets/lib/vs/basic-languages/mips/mips.js +0 -10
- package/assets/lib/vs/basic-languages/msdax/msdax.js +0 -10
- package/assets/lib/vs/basic-languages/mysql/mysql.js +0 -10
- package/assets/lib/vs/basic-languages/objective-c/objective-c.js +0 -10
- package/assets/lib/vs/basic-languages/pascal/pascal.js +0 -10
- package/assets/lib/vs/basic-languages/pascaligo/pascaligo.js +0 -10
- package/assets/lib/vs/basic-languages/perl/perl.js +0 -10
- package/assets/lib/vs/basic-languages/pgsql/pgsql.js +0 -10
- package/assets/lib/vs/basic-languages/php/php.js +0 -10
- package/assets/lib/vs/basic-languages/pla/pla.js +0 -10
- package/assets/lib/vs/basic-languages/postiats/postiats.js +0 -10
- package/assets/lib/vs/basic-languages/powerquery/powerquery.js +0 -10
- package/assets/lib/vs/basic-languages/powershell/powershell.js +0 -10
- package/assets/lib/vs/basic-languages/protobuf/protobuf.js +0 -11
- package/assets/lib/vs/basic-languages/pug/pug.js +0 -10
- package/assets/lib/vs/basic-languages/python/python.js +0 -10
- package/assets/lib/vs/basic-languages/qsharp/qsharp.js +0 -10
- package/assets/lib/vs/basic-languages/r/r.js +0 -10
- package/assets/lib/vs/basic-languages/razor/razor.js +0 -10
- package/assets/lib/vs/basic-languages/redis/redis.js +0 -10
- package/assets/lib/vs/basic-languages/redshift/redshift.js +0 -10
- package/assets/lib/vs/basic-languages/restructuredtext/restructuredtext.js +0 -10
- package/assets/lib/vs/basic-languages/ruby/ruby.js +0 -10
- package/assets/lib/vs/basic-languages/rust/rust.js +0 -10
- package/assets/lib/vs/basic-languages/sb/sb.js +0 -10
- package/assets/lib/vs/basic-languages/scala/scala.js +0 -10
- package/assets/lib/vs/basic-languages/scheme/scheme.js +0 -10
- package/assets/lib/vs/basic-languages/scss/scss.js +0 -12
- package/assets/lib/vs/basic-languages/shell/shell.js +0 -10
- package/assets/lib/vs/basic-languages/solidity/solidity.js +0 -10
- package/assets/lib/vs/basic-languages/sophia/sophia.js +0 -10
- package/assets/lib/vs/basic-languages/sparql/sparql.js +0 -10
- package/assets/lib/vs/basic-languages/sql/sql.js +0 -10
- package/assets/lib/vs/basic-languages/st/st.js +0 -10
- package/assets/lib/vs/basic-languages/swift/swift.js +0 -13
- package/assets/lib/vs/basic-languages/systemverilog/systemverilog.js +0 -10
- package/assets/lib/vs/basic-languages/tcl/tcl.js +0 -10
- package/assets/lib/vs/basic-languages/twig/twig.js +0 -10
- package/assets/lib/vs/basic-languages/typescript/typescript.js +0 -10
- package/assets/lib/vs/basic-languages/vb/vb.js +0 -10
- package/assets/lib/vs/basic-languages/wgsl/wgsl.js +0 -307
- package/assets/lib/vs/basic-languages/xml/xml.js +0 -10
- package/assets/lib/vs/basic-languages/yaml/yaml.js +0 -10
- package/assets/lib/vs/editor/editor.main.css +0 -6
- package/assets/lib/vs/editor/editor.main.js +0 -752
- package/assets/lib/vs/editor/editor.main.nls.de.js +0 -31
- package/assets/lib/vs/editor/editor.main.nls.es.js +0 -31
- package/assets/lib/vs/editor/editor.main.nls.fr.js +0 -29
- package/assets/lib/vs/editor/editor.main.nls.it.js +0 -29
- package/assets/lib/vs/editor/editor.main.nls.ja.js +0 -31
- package/assets/lib/vs/editor/editor.main.nls.js +0 -29
- package/assets/lib/vs/editor/editor.main.nls.ko.js +0 -29
- package/assets/lib/vs/editor/editor.main.nls.ru.js +0 -31
- package/assets/lib/vs/editor/editor.main.nls.zh-cn.js +0 -31
- package/assets/lib/vs/editor/editor.main.nls.zh-tw.js +0 -29
- package/assets/lib/vs/language/css/cssMode.js +0 -13
- package/assets/lib/vs/language/css/cssWorker.js +0 -81
- package/assets/lib/vs/language/html/htmlMode.js +0 -13
- package/assets/lib/vs/language/html/htmlWorker.js +0 -453
- package/assets/lib/vs/language/json/jsonMode.js +0 -15
- package/assets/lib/vs/language/json/jsonWorker.js +0 -36
- package/assets/lib/vs/language/typescript/tsMode.js +0 -20
- package/assets/lib/vs/language/typescript/tsWorker.js +0 -37016
- package/assets/lib/vs/loader.js +0 -11
- package/assets/mat-icons.ts +0 -5704
- package/assets/material/3d.svg +0 -1
- package/assets/material/abc.svg +0 -1
- package/assets/material/actionscript.svg +0 -1
- package/assets/material/ada.svg +0 -1
- package/assets/material/adonis.svg +0 -1
- package/assets/material/advpl_include.svg +0 -1
- package/assets/material/advpl_prw.svg +0 -1
- package/assets/material/advpl_ptm.svg +0 -1
- package/assets/material/advpl_tlpp.svg +0 -1
- package/assets/material/android.svg +0 -1
- package/assets/material/angular-component.svg +0 -1
- package/assets/material/angular-directive.svg +0 -1
- package/assets/material/angular-guard.svg +0 -1
- package/assets/material/angular-pipe.svg +0 -1
- package/assets/material/angular-resolver.svg +0 -1
- package/assets/material/angular-service.svg +0 -1
- package/assets/material/angular.svg +0 -1
- package/assets/material/antlr.svg +0 -1
- package/assets/material/apiblueprint.svg +0 -1
- package/assets/material/apollo.svg +0 -1
- package/assets/material/applescript.svg +0 -1
- package/assets/material/appveyor.svg +0 -1
- package/assets/material/architecture.svg +0 -1
- package/assets/material/arduino.svg +0 -1
- package/assets/material/asciidoc.svg +0 -1
- package/assets/material/assembly.svg +0 -1
- package/assets/material/astro.svg +0 -1
- package/assets/material/astyle.svg +0 -1
- package/assets/material/audio.svg +0 -1
- package/assets/material/aurelia.svg +0 -1
- package/assets/material/authors.svg +0 -1
- package/assets/material/auto.svg +0 -1
- package/assets/material/auto_light.svg +0 -1
- package/assets/material/autohotkey.svg +0 -1
- package/assets/material/autoit.svg +0 -1
- package/assets/material/azure-pipelines.svg +0 -1
- package/assets/material/azure.svg +0 -1
- package/assets/material/babel.svg +0 -1
- package/assets/material/ballerina.svg +0 -1
- package/assets/material/bazel.svg +0 -1
- package/assets/material/bicep.svg +0 -1
- package/assets/material/bitbucket.svg +0 -13
- package/assets/material/bithound.svg +0 -1
- package/assets/material/blink.svg +0 -1
- package/assets/material/blink_light.svg +0 -1
- package/assets/material/blitz.svg +0 -1
- package/assets/material/bower.svg +0 -1
- package/assets/material/brainfuck.svg +0 -1
- package/assets/material/browserlist.svg +0 -1
- package/assets/material/browserlist_light.svg +0 -1
- package/assets/material/buck.svg +0 -1
- package/assets/material/bucklescript.svg +0 -1
- package/assets/material/buildkite.svg +0 -1
- package/assets/material/bun.svg +0 -2
- package/assets/material/bun_light.svg +0 -2
- package/assets/material/c.svg +0 -4
- package/assets/material/cabal.svg +0 -1
- package/assets/material/caddy.svg +0 -1
- package/assets/material/cadence.svg +0 -1
- package/assets/material/cake.svg +0 -1
- package/assets/material/capacitor.svg +0 -1
- package/assets/material/certificate.svg +0 -1
- package/assets/material/changelog.svg +0 -1
- package/assets/material/chess.svg +0 -1
- package/assets/material/chess_light.svg +0 -1
- package/assets/material/circleci.svg +0 -1
- package/assets/material/circleci_light.svg +0 -1
- package/assets/material/clojure.svg +0 -1
- package/assets/material/cloudfoundry.svg +0 -1
- package/assets/material/cmake.svg +0 -1
- package/assets/material/coala.svg +0 -1
- package/assets/material/cobol.svg +0 -1
- package/assets/material/coconut.svg +0 -1
- package/assets/material/code-climate.svg +0 -1
- package/assets/material/code-climate_light.svg +0 -1
- package/assets/material/codecov.svg +0 -1
- package/assets/material/codeowners.svg +0 -1
- package/assets/material/coffee.svg +0 -1
- package/assets/material/coldfusion.svg +0 -1
- package/assets/material/command.svg +0 -1
- package/assets/material/commitlint.svg +0 -1
- package/assets/material/conduct.svg +0 -1
- package/assets/material/console.svg +0 -1
- package/assets/material/contributing.svg +0 -1
- package/assets/material/cpp.svg +0 -4
- package/assets/material/craco.svg +0 -45
- package/assets/material/credits.svg +0 -1
- package/assets/material/crystal.svg +0 -1
- package/assets/material/crystal_light.svg +0 -1
- package/assets/material/csharp.svg +0 -4
- package/assets/material/css-map.svg +0 -1
- package/assets/material/css.svg +0 -1
- package/assets/material/cucumber.svg +0 -1
- package/assets/material/cuda.svg +0 -1
- package/assets/material/cypress.svg +0 -1
- package/assets/material/d.svg +0 -1
- package/assets/material/dart.svg +0 -1
- package/assets/material/dart_generated.svg +0 -1
- package/assets/material/database.svg +0 -1
- package/assets/material/denizenscript.svg +0 -1
- package/assets/material/deno.svg +0 -1
- package/assets/material/deno_light.svg +0 -1
- package/assets/material/dependabot.svg +0 -1
- package/assets/material/dhall.svg +0 -1
- package/assets/material/diff.svg +0 -1
- package/assets/material/dinophp.svg +0 -1
- package/assets/material/disc.svg +0 -1
- package/assets/material/django.svg +0 -1
- package/assets/material/docker.svg +0 -1
- package/assets/material/document.svg +0 -1
- package/assets/material/dotjs.svg +0 -1
- package/assets/material/drawio.svg +0 -1
- package/assets/material/drone.svg +0 -1
- package/assets/material/drone_light.svg +0 -1
- package/assets/material/dune.svg +0 -1
- package/assets/material/edge.svg +0 -1
- package/assets/material/editorconfig.svg +0 -1
- package/assets/material/ejs.svg +0 -1
- package/assets/material/elixir.svg +0 -1
- package/assets/material/elm.svg +0 -1
- package/assets/material/email.svg +0 -1
- package/assets/material/ember.svg +0 -1
- package/assets/material/erlang.svg +0 -1
- package/assets/material/eslint.svg +0 -1
- package/assets/material/exe.svg +0 -1
- package/assets/material/fastlane.svg +0 -1
- package/assets/material/favicon.svg +0 -1
- package/assets/material/figma.svg +0 -1
- package/assets/material/file.svg +0 -1
- package/assets/material/firebase.svg +0 -1
- package/assets/material/flash.svg +0 -1
- package/assets/material/flow.svg +0 -1
- package/assets/material/folder-admin-open.svg +0 -1
- package/assets/material/folder-admin.svg +0 -1
- package/assets/material/folder-android-open.svg +0 -1
- package/assets/material/folder-android.svg +0 -1
- package/assets/material/folder-angular-open.svg +0 -1
- package/assets/material/folder-angular.svg +0 -1
- package/assets/material/folder-animation-open.svg +0 -1
- package/assets/material/folder-animation.svg +0 -1
- package/assets/material/folder-ansible-open.svg +0 -1
- package/assets/material/folder-ansible.svg +0 -1
- package/assets/material/folder-api-open.svg +0 -1
- package/assets/material/folder-api.svg +0 -1
- package/assets/material/folder-apollo-open.svg +0 -1
- package/assets/material/folder-apollo.svg +0 -1
- package/assets/material/folder-app-open.svg +0 -1
- package/assets/material/folder-app.svg +0 -1
- package/assets/material/folder-archive-open.svg +0 -1
- package/assets/material/folder-archive.svg +0 -1
- package/assets/material/folder-audio-open.svg +0 -1
- package/assets/material/folder-audio.svg +0 -1
- package/assets/material/folder-aurelia-open.svg +0 -1
- package/assets/material/folder-aurelia.svg +0 -1
- package/assets/material/folder-aws-open.svg +0 -1
- package/assets/material/folder-aws.svg +0 -1
- package/assets/material/folder-azure-pipelines-open.svg +0 -1
- package/assets/material/folder-azure-pipelines.svg +0 -1
- package/assets/material/folder-base-open.svg +0 -1
- package/assets/material/folder-base.svg +0 -1
- package/assets/material/folder-batch-open.svg +0 -1
- package/assets/material/folder-batch.svg +0 -1
- package/assets/material/folder-benchmark-open.svg +0 -1
- package/assets/material/folder-benchmark.svg +0 -1
- package/assets/material/folder-bower-open.svg +0 -1
- package/assets/material/folder-bower.svg +0 -1
- package/assets/material/folder-buildkite-open.svg +0 -1
- package/assets/material/folder-buildkite.svg +0 -1
- package/assets/material/folder-cart-open.svg +0 -1
- package/assets/material/folder-cart.svg +0 -1
- package/assets/material/folder-changesets-open.svg +0 -5
- package/assets/material/folder-changesets.svg +0 -2
- package/assets/material/folder-ci-open.svg +0 -1
- package/assets/material/folder-ci.svg +0 -1
- package/assets/material/folder-circleci-open.svg +0 -1
- package/assets/material/folder-circleci.svg +0 -1
- package/assets/material/folder-class-open.svg +0 -1
- package/assets/material/folder-class.svg +0 -1
- package/assets/material/folder-client-open.svg +0 -1
- package/assets/material/folder-client.svg +0 -1
- package/assets/material/folder-cluster-open.svg +0 -1
- package/assets/material/folder-cluster.svg +0 -1
- package/assets/material/folder-cobol-open.svg +0 -1
- package/assets/material/folder-cobol.svg +0 -1
- package/assets/material/folder-command-open.svg +0 -1
- package/assets/material/folder-command.svg +0 -1
- package/assets/material/folder-components-open.svg +0 -1
- package/assets/material/folder-components.svg +0 -1
- package/assets/material/folder-config-open.svg +0 -1
- package/assets/material/folder-config.svg +0 -1
- package/assets/material/folder-connection-open.svg +0 -1
- package/assets/material/folder-connection.svg +0 -1
- package/assets/material/folder-constant-open.svg +0 -1
- package/assets/material/folder-constant.svg +0 -1
- package/assets/material/folder-container-open.svg +0 -1
- package/assets/material/folder-container.svg +0 -1
- package/assets/material/folder-content-open.svg +0 -1
- package/assets/material/folder-content.svg +0 -1
- package/assets/material/folder-context-open.svg +0 -1
- package/assets/material/folder-context.svg +0 -1
- package/assets/material/folder-contract-open.svg +0 -1
- package/assets/material/folder-contract.svg +0 -1
- package/assets/material/folder-controller-open.svg +0 -1
- package/assets/material/folder-controller.svg +0 -1
- package/assets/material/folder-core-open.svg +0 -1
- package/assets/material/folder-core.svg +0 -1
- package/assets/material/folder-coverage-open.svg +0 -1
- package/assets/material/folder-coverage.svg +0 -1
- package/assets/material/folder-css-open.svg +0 -1
- package/assets/material/folder-css.svg +0 -1
- package/assets/material/folder-custom-open.svg +0 -1
- package/assets/material/folder-custom.svg +0 -1
- package/assets/material/folder-cypress-open.svg +0 -1
- package/assets/material/folder-cypress.svg +0 -1
- package/assets/material/folder-database-open.svg +0 -1
- package/assets/material/folder-database.svg +0 -1
- package/assets/material/folder-debug-open.svg +0 -1
- package/assets/material/folder-debug.svg +0 -1
- package/assets/material/folder-decorators-open.svg +0 -2
- package/assets/material/folder-decorators.svg +0 -5
- package/assets/material/folder-delta-open.svg +0 -1
- package/assets/material/folder-delta.svg +0 -1
- package/assets/material/folder-dist-open.svg +0 -1
- package/assets/material/folder-dist.svg +0 -1
- package/assets/material/folder-docker-open.svg +0 -1
- package/assets/material/folder-docker.svg +0 -1
- package/assets/material/folder-docs-open.svg +0 -1
- package/assets/material/folder-docs.svg +0 -1
- package/assets/material/folder-download-open.svg +0 -1
- package/assets/material/folder-download.svg +0 -1
- package/assets/material/folder-dump-open.svg +0 -1
- package/assets/material/folder-dump.svg +0 -1
- package/assets/material/folder-environment-open.svg +0 -1
- package/assets/material/folder-environment.svg +0 -1
- package/assets/material/folder-error-open.svg +0 -1
- package/assets/material/folder-error.svg +0 -1
- package/assets/material/folder-event-open.svg +0 -1
- package/assets/material/folder-event.svg +0 -1
- package/assets/material/folder-examples-open.svg +0 -1
- package/assets/material/folder-examples.svg +0 -1
- package/assets/material/folder-expo-open.svg +0 -1
- package/assets/material/folder-expo.svg +0 -1
- package/assets/material/folder-export-open.svg +0 -1
- package/assets/material/folder-export.svg +0 -1
- package/assets/material/folder-fastlane-open.svg +0 -1
- package/assets/material/folder-fastlane.svg +0 -1
- package/assets/material/folder-firebase-open.svg +0 -1
- package/assets/material/folder-firebase.svg +0 -1
- package/assets/material/folder-flow-open.svg +0 -1
- package/assets/material/folder-flow.svg +0 -1
- package/assets/material/folder-font-open.svg +0 -1
- package/assets/material/folder-font.svg +0 -1
- package/assets/material/folder-functions-open.svg +0 -1
- package/assets/material/folder-functions.svg +0 -1
- package/assets/material/folder-gamemaker-open.svg +0 -2
- package/assets/material/folder-gamemaker.svg +0 -2
- package/assets/material/folder-generator-open.svg +0 -1
- package/assets/material/folder-generator.svg +0 -1
- package/assets/material/folder-git-open.svg +0 -1
- package/assets/material/folder-git.svg +0 -1
- package/assets/material/folder-github-open.svg +0 -1
- package/assets/material/folder-github.svg +0 -1
- package/assets/material/folder-gitlab-open.svg +0 -1
- package/assets/material/folder-gitlab.svg +0 -1
- package/assets/material/folder-global-open.svg +0 -1
- package/assets/material/folder-global.svg +0 -1
- package/assets/material/folder-godot-open.svg +0 -2
- package/assets/material/folder-godot.svg +0 -8
- package/assets/material/folder-gradle-open.svg +0 -1
- package/assets/material/folder-gradle.svg +0 -1
- package/assets/material/folder-graphql-open.svg +0 -1
- package/assets/material/folder-graphql.svg +0 -1
- package/assets/material/folder-guard-open.svg +0 -1
- package/assets/material/folder-guard.svg +0 -1
- package/assets/material/folder-gulp-open.svg +0 -1
- package/assets/material/folder-gulp.svg +0 -1
- package/assets/material/folder-helper-open.svg +0 -1
- package/assets/material/folder-helper.svg +0 -1
- package/assets/material/folder-home-open.svg +0 -1
- package/assets/material/folder-home.svg +0 -1
- package/assets/material/folder-hook-open.svg +0 -1
- package/assets/material/folder-hook.svg +0 -1
- package/assets/material/folder-husky-open.svg +0 -1
- package/assets/material/folder-husky.svg +0 -1
- package/assets/material/folder-i18n-open.svg +0 -1
- package/assets/material/folder-i18n.svg +0 -1
- package/assets/material/folder-images-open.svg +0 -1
- package/assets/material/folder-images.svg +0 -1
- package/assets/material/folder-import-open.svg +0 -1
- package/assets/material/folder-import.svg +0 -1
- package/assets/material/folder-include-open.svg +0 -1
- package/assets/material/folder-include.svg +0 -1
- package/assets/material/folder-intellij-open.svg +0 -1
- package/assets/material/folder-intellij-open_light.svg +0 -1
- package/assets/material/folder-intellij.svg +0 -1
- package/assets/material/folder-intellij_light.svg +0 -1
- package/assets/material/folder-interface-open.svg +0 -1
- package/assets/material/folder-interface.svg +0 -1
- package/assets/material/folder-ios-open.svg +0 -1
- package/assets/material/folder-ios.svg +0 -1
- package/assets/material/folder-java-open.svg +0 -1
- package/assets/material/folder-java.svg +0 -1
- package/assets/material/folder-javascript-open.svg +0 -1
- package/assets/material/folder-javascript.svg +0 -1
- package/assets/material/folder-jinja-open.svg +0 -1
- package/assets/material/folder-jinja-open_light.svg +0 -1
- package/assets/material/folder-jinja.svg +0 -1
- package/assets/material/folder-jinja_light.svg +0 -1
- package/assets/material/folder-job-open.svg +0 -1
- package/assets/material/folder-job.svg +0 -1
- package/assets/material/folder-json-open.svg +0 -1
- package/assets/material/folder-json.svg +0 -1
- package/assets/material/folder-keys-open.svg +0 -1
- package/assets/material/folder-keys.svg +0 -1
- package/assets/material/folder-kubernetes-open.svg +0 -1
- package/assets/material/folder-kubernetes.svg +0 -1
- package/assets/material/folder-layout-open.svg +0 -1
- package/assets/material/folder-layout.svg +0 -1
- package/assets/material/folder-less-open.svg +0 -1
- package/assets/material/folder-less.svg +0 -1
- package/assets/material/folder-lib-open.svg +0 -1
- package/assets/material/folder-lib.svg +0 -1
- package/assets/material/folder-log-open.svg +0 -1
- package/assets/material/folder-log.svg +0 -1
- package/assets/material/folder-lua-open.svg +0 -1
- package/assets/material/folder-lua.svg +0 -1
- package/assets/material/folder-mail-open.svg +0 -1
- package/assets/material/folder-mail.svg +0 -1
- package/assets/material/folder-mappings-open.svg +0 -1
- package/assets/material/folder-mappings.svg +0 -1
- package/assets/material/folder-markdown-open.svg +0 -1
- package/assets/material/folder-markdown.svg +0 -1
- package/assets/material/folder-mercurial-open.svg +0 -5
- package/assets/material/folder-mercurial.svg +0 -2
- package/assets/material/folder-messages-open.svg +0 -1
- package/assets/material/folder-messages.svg +0 -1
- package/assets/material/folder-meta-open.svg +0 -1
- package/assets/material/folder-meta.svg +0 -1
- package/assets/material/folder-middleware-open.svg +0 -1
- package/assets/material/folder-middleware.svg +0 -1
- package/assets/material/folder-mjml-open.svg +0 -1
- package/assets/material/folder-mjml.svg +0 -1
- package/assets/material/folder-mobile-open.svg +0 -1
- package/assets/material/folder-mobile.svg +0 -1
- package/assets/material/folder-mock-open.svg +0 -1
- package/assets/material/folder-mock.svg +0 -1
- package/assets/material/folder-netlify-open.svg +0 -5
- package/assets/material/folder-netlify.svg +0 -2
- package/assets/material/folder-next-open.svg +0 -1
- package/assets/material/folder-next.svg +0 -1
- package/assets/material/folder-ngrx-actions-open.svg +0 -1
- package/assets/material/folder-ngrx-actions.svg +0 -1
- package/assets/material/folder-ngrx-effects-open.svg +0 -1
- package/assets/material/folder-ngrx-effects.svg +0 -1
- package/assets/material/folder-ngrx-entities-open.svg +0 -1
- package/assets/material/folder-ngrx-entities.svg +0 -1
- package/assets/material/folder-ngrx-reducer-open.svg +0 -1
- package/assets/material/folder-ngrx-reducer.svg +0 -1
- package/assets/material/folder-ngrx-selectors-open.svg +0 -1
- package/assets/material/folder-ngrx-selectors.svg +0 -1
- package/assets/material/folder-ngrx-state-open.svg +0 -1
- package/assets/material/folder-ngrx-state.svg +0 -1
- package/assets/material/folder-ngrx-store-open.svg +0 -1
- package/assets/material/folder-ngrx-store.svg +0 -1
- package/assets/material/folder-node-open.svg +0 -1
- package/assets/material/folder-node.svg +0 -1
- package/assets/material/folder-nuxt-open.svg +0 -1
- package/assets/material/folder-nuxt.svg +0 -1
- package/assets/material/folder-open.svg +0 -1
- package/assets/material/folder-other-open.svg +0 -1
- package/assets/material/folder-other.svg +0 -1
- package/assets/material/folder-packages-open.svg +0 -1
- package/assets/material/folder-packages.svg +0 -1
- package/assets/material/folder-pdf-open.svg +0 -1
- package/assets/material/folder-pdf.svg +0 -1
- package/assets/material/folder-php-open.svg +0 -1
- package/assets/material/folder-php.svg +0 -1
- package/assets/material/folder-phpmailer-open.svg +0 -1
- package/assets/material/folder-phpmailer.svg +0 -1
- package/assets/material/folder-pipe-open.svg +0 -1
- package/assets/material/folder-pipe.svg +0 -1
- package/assets/material/folder-plastic-open.svg +0 -8
- package/assets/material/folder-plastic.svg +0 -2
- package/assets/material/folder-plugin-open.svg +0 -1
- package/assets/material/folder-plugin.svg +0 -1
- package/assets/material/folder-prisma-open.svg +0 -1
- package/assets/material/folder-prisma.svg +0 -1
- package/assets/material/folder-private-open.svg +0 -1
- package/assets/material/folder-private.svg +0 -1
- package/assets/material/folder-project-open.svg +0 -1
- package/assets/material/folder-project.svg +0 -1
- package/assets/material/folder-proto-open.svg +0 -1
- package/assets/material/folder-proto.svg +0 -1
- package/assets/material/folder-public-open.svg +0 -1
- package/assets/material/folder-public.svg +0 -1
- package/assets/material/folder-python-open.svg +0 -1
- package/assets/material/folder-python.svg +0 -1
- package/assets/material/folder-quasar-open.svg +0 -1
- package/assets/material/folder-quasar.svg +0 -1
- package/assets/material/folder-queue-open.svg +0 -1
- package/assets/material/folder-queue.svg +0 -1
- package/assets/material/folder-react-components-open.svg +0 -1
- package/assets/material/folder-react-components.svg +0 -1
- package/assets/material/folder-redux-actions-open.svg +0 -1
- package/assets/material/folder-redux-actions.svg +0 -1
- package/assets/material/folder-redux-reducer-open.svg +0 -1
- package/assets/material/folder-redux-reducer.svg +0 -1
- package/assets/material/folder-redux-selector-open.svg +0 -1
- package/assets/material/folder-redux-selector.svg +0 -1
- package/assets/material/folder-redux-store-open.svg +0 -1
- package/assets/material/folder-redux-store.svg +0 -1
- package/assets/material/folder-resolver-open.svg +0 -1
- package/assets/material/folder-resolver.svg +0 -1
- package/assets/material/folder-resource-open.svg +0 -1
- package/assets/material/folder-resource.svg +0 -1
- package/assets/material/folder-review-open.svg +0 -1
- package/assets/material/folder-review.svg +0 -1
- package/assets/material/folder-root-open.svg +0 -1
- package/assets/material/folder-root.svg +0 -1
- package/assets/material/folder-routes-open.svg +0 -1
- package/assets/material/folder-routes.svg +0 -1
- package/assets/material/folder-rules-open.svg +0 -1
- package/assets/material/folder-rules.svg +0 -1
- package/assets/material/folder-sass-open.svg +0 -1
- package/assets/material/folder-sass.svg +0 -1
- package/assets/material/folder-scala-open.svg +0 -1
- package/assets/material/folder-scala.svg +0 -1
- package/assets/material/folder-scripts-open.svg +0 -1
- package/assets/material/folder-scripts.svg +0 -1
- package/assets/material/folder-secure-open.svg +0 -1
- package/assets/material/folder-secure.svg +0 -1
- package/assets/material/folder-server-open.svg +0 -1
- package/assets/material/folder-server.svg +0 -1
- package/assets/material/folder-serverless-open.svg +0 -1
- package/assets/material/folder-serverless.svg +0 -1
- package/assets/material/folder-shader-open.svg +0 -1
- package/assets/material/folder-shader.svg +0 -1
- package/assets/material/folder-shared-open.svg +0 -1
- package/assets/material/folder-shared.svg +0 -1
- package/assets/material/folder-src-open.svg +0 -1
- package/assets/material/folder-src.svg +0 -1
- package/assets/material/folder-stack-open.svg +0 -1
- package/assets/material/folder-stack.svg +0 -1
- package/assets/material/folder-stencil-open.svg +0 -1
- package/assets/material/folder-stencil.svg +0 -1
- package/assets/material/folder-storybook-open.svg +0 -1
- package/assets/material/folder-storybook.svg +0 -1
- package/assets/material/folder-stylus-open.svg +0 -1
- package/assets/material/folder-stylus.svg +0 -1
- package/assets/material/folder-sublime-open.svg +0 -1
- package/assets/material/folder-sublime.svg +0 -1
- package/assets/material/folder-supabase-open.svg +0 -5
- package/assets/material/folder-supabase.svg +0 -2
- package/assets/material/folder-svelte-open.svg +0 -1
- package/assets/material/folder-svelte.svg +0 -1
- package/assets/material/folder-svg-open.svg +0 -1
- package/assets/material/folder-svg.svg +0 -1
- package/assets/material/folder-syntax-open.svg +0 -1
- package/assets/material/folder-syntax.svg +0 -1
- package/assets/material/folder-target-open.svg +0 -1
- package/assets/material/folder-target.svg +0 -1
- package/assets/material/folder-tasks-open.svg +0 -1
- package/assets/material/folder-tasks.svg +0 -1
- package/assets/material/folder-temp-open.svg +0 -1
- package/assets/material/folder-temp.svg +0 -1
- package/assets/material/folder-template-open.svg +0 -1
- package/assets/material/folder-template.svg +0 -1
- package/assets/material/folder-terraform-open.svg +0 -1
- package/assets/material/folder-terraform.svg +0 -1
- package/assets/material/folder-test-open.svg +0 -1
- package/assets/material/folder-test.svg +0 -1
- package/assets/material/folder-theme-open.svg +0 -1
- package/assets/material/folder-theme.svg +0 -1
- package/assets/material/folder-tools-open.svg +0 -1
- package/assets/material/folder-tools.svg +0 -1
- package/assets/material/folder-typescript-open.svg +0 -1
- package/assets/material/folder-typescript.svg +0 -1
- package/assets/material/folder-unity-open.svg +0 -1
- package/assets/material/folder-unity.svg +0 -1
- package/assets/material/folder-update-open.svg +0 -1
- package/assets/material/folder-update.svg +0 -1
- package/assets/material/folder-upload-open.svg +0 -1
- package/assets/material/folder-upload.svg +0 -1
- package/assets/material/folder-utils-open.svg +0 -1
- package/assets/material/folder-utils.svg +0 -1
- package/assets/material/folder-vercel-open.svg +0 -1
- package/assets/material/folder-vercel.svg +0 -1
- package/assets/material/folder-verdaccio-open.svg +0 -1
- package/assets/material/folder-verdaccio.svg +0 -1
- package/assets/material/folder-video-open.svg +0 -1
- package/assets/material/folder-video.svg +0 -1
- package/assets/material/folder-views-open.svg +0 -1
- package/assets/material/folder-views.svg +0 -1
- package/assets/material/folder-vm-open.svg +0 -1
- package/assets/material/folder-vm.svg +0 -1
- package/assets/material/folder-vscode-open.svg +0 -1
- package/assets/material/folder-vscode.svg +0 -1
- package/assets/material/folder-vue-directives-open.svg +0 -1
- package/assets/material/folder-vue-directives.svg +0 -1
- package/assets/material/folder-vue-open.svg +0 -1
- package/assets/material/folder-vue.svg +0 -1
- package/assets/material/folder-vuepress-open.svg +0 -1
- package/assets/material/folder-vuepress.svg +0 -1
- package/assets/material/folder-vuex-store-open.svg +0 -1
- package/assets/material/folder-vuex-store.svg +0 -1
- package/assets/material/folder-wakatime-open.svg +0 -1
- package/assets/material/folder-wakatime.svg +0 -1
- package/assets/material/folder-webpack-open.svg +0 -1
- package/assets/material/folder-webpack.svg +0 -1
- package/assets/material/folder-wordpress-open.svg +0 -1
- package/assets/material/folder-wordpress.svg +0 -1
- package/assets/material/folder-yarn-open.svg +0 -1
- package/assets/material/folder-yarn.svg +0 -1
- package/assets/material/folder.svg +0 -1
- package/assets/material/font.svg +0 -1
- package/assets/material/forth.svg +0 -1
- package/assets/material/fortran.svg +0 -1
- package/assets/material/foxpro.svg +0 -1
- package/assets/material/fsharp.svg +0 -1
- package/assets/material/fusebox.svg +0 -1
- package/assets/material/gamemaker.svg +0 -4
- package/assets/material/gatsby.svg +0 -1
- package/assets/material/gcp.svg +0 -1
- package/assets/material/gemfile.svg +0 -1
- package/assets/material/gemini.svg +0 -1
- package/assets/material/git.svg +0 -1
- package/assets/material/gitlab.svg +0 -1
- package/assets/material/gitpod.svg +0 -1
- package/assets/material/gleam.svg +0 -1
- package/assets/material/go-mod.svg +0 -1
- package/assets/material/go.svg +0 -1
- package/assets/material/go_gopher.svg +0 -1
- package/assets/material/godot-assets.svg +0 -7
- package/assets/material/godot.svg +0 -7
- package/assets/material/gradle.svg +0 -1
- package/assets/material/grain.svg +0 -1
- package/assets/material/graphcool.svg +0 -1
- package/assets/material/graphql.svg +0 -1
- package/assets/material/gridsome.svg +0 -1
- package/assets/material/groovy.svg +0 -1
- package/assets/material/grunt.svg +0 -1
- package/assets/material/gulp.svg +0 -1
- package/assets/material/h.svg +0 -1
- package/assets/material/hack.svg +0 -1
- package/assets/material/haml.svg +0 -1
- package/assets/material/handlebars.svg +0 -1
- package/assets/material/hardhat.svg +0 -1
- package/assets/material/haskell.svg +0 -1
- package/assets/material/haxe.svg +0 -1
- package/assets/material/hcl.svg +0 -1
- package/assets/material/hcl_light.svg +0 -1
- package/assets/material/helm.svg +0 -1
- package/assets/material/heroku.svg +0 -1
- package/assets/material/hex.svg +0 -1
- package/assets/material/horusec.svg +0 -1
- package/assets/material/hpp.svg +0 -1
- package/assets/material/html.svg +0 -1
- package/assets/material/http.svg +0 -1
- package/assets/material/husky.svg +0 -1
- package/assets/material/i18n.svg +0 -1
- package/assets/material/idris.svg +0 -1
- package/assets/material/ifanr-cloud.svg +0 -10
- package/assets/material/image.svg +0 -1
- package/assets/material/imba.svg +0 -1
- package/assets/material/ionic.svg +0 -1
- package/assets/material/istanbul.svg +0 -1
- package/assets/material/jar.svg +0 -1
- package/assets/material/java.svg +0 -1
- package/assets/material/javaclass.svg +0 -1
- package/assets/material/javascript-map.svg +0 -1
- package/assets/material/javascript.svg +0 -1
- package/assets/material/jenkins.svg +0 -1
- package/assets/material/jest.svg +0 -1
- package/assets/material/jinja.svg +0 -1
- package/assets/material/jinja_light.svg +0 -1
- package/assets/material/jsconfig.svg +0 -1
- package/assets/material/json.svg +0 -1
- package/assets/material/julia.svg +0 -1
- package/assets/material/jupyter.svg +0 -1
- package/assets/material/karma.svg +0 -1
- package/assets/material/key.svg +0 -1
- package/assets/material/kivy.svg +0 -1
- package/assets/material/kl.svg +0 -1
- package/assets/material/kotlin.svg +0 -1
- package/assets/material/kusto.svg +0 -1
- package/assets/material/laravel.svg +0 -1
- package/assets/material/lerna.svg +0 -1
- package/assets/material/less.svg +0 -1
- package/assets/material/lib.svg +0 -1
- package/assets/material/lighthouse.svg +0 -1
- package/assets/material/lilypond.svg +0 -1
- package/assets/material/liquid.svg +0 -1
- package/assets/material/lisp.svg +0 -1
- package/assets/material/livescript.svg +0 -1
- package/assets/material/lock.svg +0 -1
- package/assets/material/log.svg +0 -1
- package/assets/material/lolcode.svg +0 -1
- package/assets/material/lua.svg +0 -1
- package/assets/material/makefile.svg +0 -1
- package/assets/material/markdown.svg +0 -1
- package/assets/material/markojs.svg +0 -1
- package/assets/material/mathematica.svg +0 -1
- package/assets/material/matlab.svg +0 -1
- package/assets/material/maven.svg +0 -1
- package/assets/material/mdsvex.svg +0 -1
- package/assets/material/mdx.svg +0 -1
- package/assets/material/mercurial.svg +0 -6
- package/assets/material/merlin.svg +0 -1
- package/assets/material/mermaid.svg +0 -4
- package/assets/material/meson.svg +0 -1
- package/assets/material/minecraft.svg +0 -1
- package/assets/material/mint.svg +0 -1
- package/assets/material/mjml.svg +0 -1
- package/assets/material/mocha.svg +0 -1
- package/assets/material/modernizr.svg +0 -1
- package/assets/material/moonscript.svg +0 -1
- package/assets/material/mxml.svg +0 -1
- package/assets/material/nano-staged.svg +0 -1
- package/assets/material/nano-staged_light.svg +0 -1
- package/assets/material/ndst.svg +0 -1
- package/assets/material/nest-controller.svg +0 -1
- package/assets/material/nest-decorator.svg +0 -1
- package/assets/material/nest-filter.svg +0 -1
- package/assets/material/nest-gateway.svg +0 -1
- package/assets/material/nest-guard.svg +0 -1
- package/assets/material/nest-middleware.svg +0 -1
- package/assets/material/nest-module.svg +0 -1
- package/assets/material/nest-pipe.svg +0 -1
- package/assets/material/nest-resolver.svg +0 -1
- package/assets/material/nest-service.svg +0 -1
- package/assets/material/nest.svg +0 -1
- package/assets/material/netlify.svg +0 -7
- package/assets/material/netlify_light.svg +0 -7
- package/assets/material/next.svg +0 -1
- package/assets/material/next_light.svg +0 -1
- package/assets/material/nginx.svg +0 -1
- package/assets/material/ngrx-actions.svg +0 -1
- package/assets/material/ngrx-effects.svg +0 -1
- package/assets/material/ngrx-entity.svg +0 -1
- package/assets/material/ngrx-reducer.svg +0 -1
- package/assets/material/ngrx-selectors.svg +0 -1
- package/assets/material/ngrx-state.svg +0 -1
- package/assets/material/nim.svg +0 -1
- package/assets/material/nix.svg +0 -1
- package/assets/material/nodejs.svg +0 -1
- package/assets/material/nodejs_alt.svg +0 -1
- package/assets/material/nodemon.svg +0 -1
- package/assets/material/npm.svg +0 -1
- package/assets/material/nrwl.svg +0 -1
- package/assets/material/nuget.svg +0 -1
- package/assets/material/nunjucks.svg +0 -1
- package/assets/material/nuxt.svg +0 -1
- package/assets/material/objective-c.svg +0 -4
- package/assets/material/objective-cpp.svg +0 -1
- package/assets/material/ocaml.svg +0 -1
- package/assets/material/odin.svg +0 -1
- package/assets/material/opa.svg +0 -1
- package/assets/material/opam.svg +0 -1
- package/assets/material/otne.svg +0 -1
- package/assets/material/parcel.svg +0 -1
- package/assets/material/pascal.svg +0 -6
- package/assets/material/pawn.svg +0 -1
- package/assets/material/pdf.svg +0 -1
- package/assets/material/percy.svg +0 -1
- package/assets/material/perl.svg +0 -1
- package/assets/material/php-cs-fixer.svg +0 -1
- package/assets/material/php.svg +0 -1
- package/assets/material/php_elephant.svg +0 -1
- package/assets/material/php_elephant_pink.svg +0 -1
- package/assets/material/phpunit.svg +0 -1
- package/assets/material/pinejs.svg +0 -1
- package/assets/material/pipeline.svg +0 -1
- package/assets/material/plastic.svg +0 -7
- package/assets/material/playwright.svg +0 -1
- package/assets/material/plop.svg +0 -1
- package/assets/material/pnpm.svg +0 -1
- package/assets/material/pnpm_light.svg +0 -1
- package/assets/material/poetry.svg +0 -1
- package/assets/material/postcss.svg +0 -1
- package/assets/material/posthtml.svg +0 -1
- package/assets/material/powerpoint.svg +0 -1
- package/assets/material/powershell.svg +0 -1
- package/assets/material/prettier.svg +0 -1
- package/assets/material/prisma.svg +0 -1
- package/assets/material/processing.svg +0 -1
- package/assets/material/prolog.svg +0 -1
- package/assets/material/proto.svg +0 -1
- package/assets/material/protractor.svg +0 -1
- package/assets/material/pug.svg +0 -1
- package/assets/material/puppet.svg +0 -1
- package/assets/material/purescript.svg +0 -1
- package/assets/material/python-misc.svg +0 -1
- package/assets/material/python.svg +0 -1
- package/assets/material/qsharp.svg +0 -1
- package/assets/material/quasar.svg +0 -1
- package/assets/material/qwik.svg +0 -2
- package/assets/material/r.svg +0 -1
- package/assets/material/racket.svg +0 -1
- package/assets/material/raml.svg +0 -1
- package/assets/material/razor.svg +0 -1
- package/assets/material/rc.svg +0 -2
- package/assets/material/react.svg +0 -1
- package/assets/material/react_ts.svg +0 -1
- package/assets/material/readme.svg +0 -1
- package/assets/material/reason.svg +0 -1
- package/assets/material/red.svg +0 -1
- package/assets/material/redux-action.svg +0 -1
- package/assets/material/redux-reducer.svg +0 -1
- package/assets/material/redux-selector.svg +0 -1
- package/assets/material/redux-store.svg +0 -1
- package/assets/material/remix.svg +0 -1
- package/assets/material/remix_light.svg +0 -1
- package/assets/material/renovate.svg +0 -1
- package/assets/material/replit.svg +0 -1
- package/assets/material/rescript-interface.svg +0 -1
- package/assets/material/rescript.svg +0 -1
- package/assets/material/restql.svg +0 -1
- package/assets/material/riot.svg +0 -1
- package/assets/material/roadmap.svg +0 -1
- package/assets/material/robot.svg +0 -1
- package/assets/material/robots.svg +0 -1
- package/assets/material/rollup.svg +0 -1
- package/assets/material/rome.svg +0 -1
- package/assets/material/routing.svg +0 -1
- package/assets/material/rubocop.svg +0 -1
- package/assets/material/rubocop_light.svg +0 -1
- package/assets/material/ruby.svg +0 -1
- package/assets/material/rust.svg +0 -1
- package/assets/material/salesforce.svg +0 -1
- package/assets/material/san.svg +0 -1
- package/assets/material/sas.svg +0 -1
- package/assets/material/sass.svg +0 -1
- package/assets/material/sbt.svg +0 -1
- package/assets/material/scala.svg +0 -1
- package/assets/material/scheme.svg +0 -1
- package/assets/material/search.svg +0 -1
- package/assets/material/semantic-release.svg +0 -1
- package/assets/material/semantic-release_light.svg +0 -1
- package/assets/material/sentry.svg +0 -1
- package/assets/material/sequelize.svg +0 -1
- package/assets/material/serverless.svg +0 -1
- package/assets/material/settings.svg +0 -1
- package/assets/material/shader.svg +0 -1
- package/assets/material/shaderlab.svg +0 -1
- package/assets/material/silverstripe.svg +0 -1
- package/assets/material/siyuan.svg +0 -1
- package/assets/material/sketch.svg +0 -1
- package/assets/material/slim.svg +0 -1
- package/assets/material/slug.svg +0 -1
- package/assets/material/smarty.svg +0 -1
- package/assets/material/sml.svg +0 -1
- package/assets/material/snowpack.svg +0 -1
- package/assets/material/snowpack_light.svg +0 -1
- package/assets/material/snyk.svg +0 -1
- package/assets/material/solidity.svg +0 -1
- package/assets/material/sonarcloud.svg +0 -4
- package/assets/material/steadybit.svg +0 -1
- package/assets/material/stencil.svg +0 -1
- package/assets/material/stitches.svg +0 -1
- package/assets/material/stitches_light.svg +0 -1
- package/assets/material/storybook.svg +0 -1
- package/assets/material/stryker.svg +0 -1
- package/assets/material/stylable.svg +0 -10
- package/assets/material/stylelint.svg +0 -1
- package/assets/material/stylelint_light.svg +0 -1
- package/assets/material/stylus.svg +0 -1
- package/assets/material/sublime.svg +0 -1
- package/assets/material/supabase.svg +0 -4
- package/assets/material/svelte.svg +0 -1
- package/assets/material/svg.svg +0 -1
- package/assets/material/svgo.svg +0 -1
- package/assets/material/svgr.svg +0 -1
- package/assets/material/swc.svg +0 -1
- package/assets/material/swift.svg +0 -1
- package/assets/material/table.svg +0 -1
- package/assets/material/tailwindcss.svg +0 -1
- package/assets/material/tauri.svg +0 -1
- package/assets/material/tcl.svg +0 -1
- package/assets/material/teal.svg +0 -1
- package/assets/material/template.svg +0 -1
- package/assets/material/terraform.svg +0 -1
- package/assets/material/test-js.svg +0 -1
- package/assets/material/test-jsx.svg +0 -1
- package/assets/material/test-ts.svg +0 -1
- package/assets/material/tex.svg +0 -1
- package/assets/material/textlint.svg +0 -1
- package/assets/material/tilt.svg +0 -1
- package/assets/material/tldraw.svg +0 -4
- package/assets/material/tldraw_light.svg +0 -4
- package/assets/material/tobi.svg +0 -1
- package/assets/material/tobimake.svg +0 -1
- package/assets/material/todo.svg +0 -1
- package/assets/material/travis.svg +0 -1
- package/assets/material/tree.svg +0 -1
- package/assets/material/tsconfig.svg +0 -1
- package/assets/material/tune.svg +0 -1
- package/assets/material/turborepo.svg +0 -1
- package/assets/material/turborepo_light.svg +0 -1
- package/assets/material/twig.svg +0 -1
- package/assets/material/twine.svg +0 -1
- package/assets/material/typescript-def.svg +0 -1
- package/assets/material/typescript.svg +0 -1
- package/assets/material/typst.svg +0 -2
- package/assets/material/uml.svg +0 -1
- package/assets/material/uml_light.svg +0 -1
- package/assets/material/url.svg +0 -1
- package/assets/material/vagrant.svg +0 -1
- package/assets/material/vala.svg +0 -1
- package/assets/material/velocity.svg +0 -1
- package/assets/material/vercel.svg +0 -1
- package/assets/material/vercel_light.svg +0 -1
- package/assets/material/verdaccio.svg +0 -1
- package/assets/material/verilog.svg +0 -1
- package/assets/material/vfl.svg +0 -1
- package/assets/material/video.svg +0 -1
- package/assets/material/vim.svg +0 -1
- package/assets/material/virtual.svg +0 -1
- package/assets/material/visualstudio.svg +0 -1
- package/assets/material/vite.svg +0 -1
- package/assets/material/vitest.svg +0 -6
- package/assets/material/vlang.svg +0 -1
- package/assets/material/vscode.svg +0 -1
- package/assets/material/vue-config.svg +0 -1
- package/assets/material/vue.svg +0 -1
- package/assets/material/vuex-store.svg +0 -1
- package/assets/material/wakatime.svg +0 -1
- package/assets/material/wakatime_light.svg +0 -1
- package/assets/material/wallaby.svg +0 -1
- package/assets/material/watchman.svg +0 -1
- package/assets/material/webassembly.svg +0 -1
- package/assets/material/webhint.svg +0 -1
- package/assets/material/webpack.svg +0 -1
- package/assets/material/wepy.svg +0 -1
- package/assets/material/windicss.svg +0 -1
- package/assets/material/wolframlanguage.svg +0 -1
- package/assets/material/word.svg +0 -1
- package/assets/material/xaml.svg +0 -1
- package/assets/material/xml.svg +0 -1
- package/assets/material/yaml.svg +0 -1
- package/assets/material/yang.svg +0 -1
- package/assets/material/yarn.svg +0 -1
- package/assets/material/zig.svg +0 -1
- package/assets/material/zip.svg +0 -1
- package/assets/pop/LICENSE +0 -2
- package/assets/pop/binary.svg +0 -1
- package/assets/pop/compressed.svg +0 -1
- package/assets/pop/database.svg +0 -1
- package/assets/pop/exts/7z.svg +0 -1
- package/assets/pop/exts/apk.svg +0 -1
- package/assets/pop/exts/arc.svg +0 -1
- package/assets/pop/exts/bz.svg +0 -1
- package/assets/pop/exts/deb.svg +0 -1
- package/assets/pop/exts/gz.svg +0 -1
- package/assets/pop/exts/pdf.svg +0 -1
- package/assets/pop/exts/rar.svg +0 -1
- package/assets/pop/exts/rpm.svg +0 -1
- package/assets/pop/exts/tar.svg +0 -1
- package/assets/pop/exts/xar.svg +0 -1
- package/assets/pop/exts/xz.svg +0 -1
- package/assets/pop/exts/zip.svg +0 -1
- package/assets/pop/folder-open.svg +0 -1
- package/assets/pop/folder.svg +0 -1
- package/assets/pop/generic.svg +0 -1
- package/assets/pop/presentation.svg +0 -1
- package/assets/pop/richtext.svg +0 -1
- package/assets/pop/spreadsheet.svg +0 -1
- package/assets/pop/text.svg +0 -1
- package/esm2022/components/lazy-loader/lazy-loader.component.mjs +0 -383
- package/esm2022/components/lazy-loader/lazy-loader.module.mjs +0 -33
- package/esm2022/components/lazy-loader/lazy-loader.service.mjs +0 -217
- package/esm2022/components/lazy-loader/types.mjs +0 -26
- package/esm2022/components/menu/menu.component.mjs +0 -433
- package/esm2022/components/parallax-card/parallax-card.component.mjs +0 -138
- package/esm2022/components/tooltip/tooltip.component.mjs +0 -205
- package/esm2022/components/types.mjs +0 -3
- package/esm2022/directives/image-cache.directive.mjs +0 -143
- package/esm2022/directives/menu.directive.mjs +0 -159
- package/esm2022/directives/tooltip.directive.mjs +0 -154
- package/esm2022/directives/utils.mjs +0 -120
- package/esm2022/pipes/html-bypass.pipe.mjs +0 -27
- package/esm2022/pipes/resource-bypass.pipe.mjs +0 -27
- package/esm2022/pipes/script-bypass.pipe.mjs +0 -27
- package/esm2022/pipes/style-bypass.pipe.mjs +0 -27
- package/esm2022/pipes/url-bypass.pipe.mjs +0 -27
- package/esm2022/public-api.mjs +0 -46
- package/esm2022/services/dependency.service.mjs +0 -55
- package/esm2022/services/dialog.service.mjs +0 -69
- package/esm2022/services/fetch.service.mjs +0 -74
- package/esm2022/services/file.service.mjs +0 -42
- package/esm2022/services/keyboard.service.mjs +0 -128
- package/esm2022/services/navigation.service.mjs +0 -52
- package/esm2022/services/theme.service.mjs +0 -64
- package/esm2022/types/menu.mjs +0 -2
- package/esm2022/types/popup.mjs +0 -2
- package/esm2022/types/tooltip.mjs +0 -2
- package/esm2022/utils/index.mjs +0 -205
- package/utils/index.d.ts +0 -128
- /package/{components → core/components}/lazy-loader/lazy-loader.component.d.ts +0 -0
- /package/{components → core/components}/lazy-loader/lazy-loader.module.d.ts +0 -0
- /package/{components → core/components}/lazy-loader/lazy-loader.service.d.ts +0 -0
- /package/{components → core/components}/lazy-loader/types.d.ts +0 -0
- /package/{components → core/components}/parallax-card/parallax-card.component.d.ts +0 -0
- /package/{directives → core/directives}/image-cache.directive.d.ts +0 -0
- /package/{directives → core/directives}/utils.d.ts +0 -0
- /package/{pipes → core/pipes}/html-bypass.pipe.d.ts +0 -0
- /package/{pipes → core/pipes}/resource-bypass.pipe.d.ts +0 -0
- /package/{pipes → core/pipes}/script-bypass.pipe.d.ts +0 -0
- /package/{pipes → core/pipes}/style-bypass.pipe.d.ts +0 -0
- /package/{pipes → core/pipes}/url-bypass.pipe.d.ts +0 -0
- /package/{services → core/services}/dependency.service.d.ts +0 -0
- /package/{services → core/services}/dialog.service.d.ts +0 -0
- /package/{services → core/services}/fetch.service.d.ts +0 -0
- /package/{services → core/services}/file.service.d.ts +0 -0
- /package/{services → core/services}/keyboard.service.d.ts +0 -0
- /package/{services → core/services}/theme.service.d.ts +0 -0
- /package/{types → core/types}/popup.d.ts +0 -0
|
@@ -0,0 +1,676 @@
|
|
|
1
|
+
import { ScrollingModule } from '@angular/cdk/scrolling';
|
|
2
|
+
import { DatePipe, NgForOf, NgIf } from '@angular/common';
|
|
3
|
+
import { Component, EventEmitter, Input, Output, SecurityContext, TemplateRef, ViewChild } from '@angular/core';
|
|
4
|
+
import { MatButtonModule } from '@angular/material/button';
|
|
5
|
+
import { MatCheckboxModule } from '@angular/material/checkbox';
|
|
6
|
+
import { MatIconModule } from '@angular/material/icon';
|
|
7
|
+
import { MatInputModule } from '@angular/material/input';
|
|
8
|
+
import { MatProgressBarModule } from '@angular/material/progress-bar';
|
|
9
|
+
import { MatTabsModule } from '@angular/material/tabs';
|
|
10
|
+
import { MenuDirective, openMenu } from '@dotglitch/ngx-common/core';
|
|
11
|
+
import { NgScrollbarModule } from 'ngx-scrollbar';
|
|
12
|
+
import { TabulatorComponent, TabulatorModule } from 'ngx-tabulator-tables';
|
|
13
|
+
import { uploadFile } from '../helpers';
|
|
14
|
+
import { IconResolver } from '../icon-resolver';
|
|
15
|
+
import * as i0 from "@angular/core";
|
|
16
|
+
import * as i1 from "@dotglitch/ngx-common/core";
|
|
17
|
+
import * as i2 from "@angular/material/dialog";
|
|
18
|
+
import * as i3 from "../filemanager.component";
|
|
19
|
+
import * as i4 from "@angular/platform-browser";
|
|
20
|
+
import * as i5 from "ngx-scrollbar";
|
|
21
|
+
import * as i6 from "@angular/material/checkbox";
|
|
22
|
+
import * as i7 from "@angular/material/progress-bar";
|
|
23
|
+
import * as i8 from "@angular/material/icon";
|
|
24
|
+
import * as i9 from "@angular/material/button";
|
|
25
|
+
import * as i10 from "ngx-tabulator-tables";
|
|
26
|
+
import * as i11 from "@angular/cdk/scrolling";
|
|
27
|
+
const itemWidth = (80 + 20);
|
|
28
|
+
export class FileGridComponent {
|
|
29
|
+
set path(value) {
|
|
30
|
+
if (!value)
|
|
31
|
+
return;
|
|
32
|
+
if (this._path && this.config.navigateOnlyToDescendants) {
|
|
33
|
+
if (!value.startsWith('/'))
|
|
34
|
+
value = '/' + value;
|
|
35
|
+
if (!value.startsWith(this.config.path))
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
let prev = this._path;
|
|
39
|
+
this._path = value;
|
|
40
|
+
if (prev != value) {
|
|
41
|
+
this.pathChange.next(this.path);
|
|
42
|
+
if (this.config.apiSettings)
|
|
43
|
+
this.loadFolder();
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
get path() { return this._path; }
|
|
47
|
+
performChecksum(path, digest) {
|
|
48
|
+
// this.windowManager.openWindow({
|
|
49
|
+
// appId: "checksum",
|
|
50
|
+
// data: { digest, path },
|
|
51
|
+
// workspace: this.windowRef.workspace,
|
|
52
|
+
// width: 600,
|
|
53
|
+
// height: 250
|
|
54
|
+
// });
|
|
55
|
+
}
|
|
56
|
+
get libConfig() { return this.fileManager.libConfig; }
|
|
57
|
+
constructor(fetch, keyboard, dialog, matDialog, fileManager, changeDetector, sanitizer) {
|
|
58
|
+
this.fetch = fetch;
|
|
59
|
+
this.keyboard = keyboard;
|
|
60
|
+
this.dialog = dialog;
|
|
61
|
+
this.matDialog = matDialog;
|
|
62
|
+
this.fileManager = fileManager;
|
|
63
|
+
this.changeDetector = changeDetector;
|
|
64
|
+
this.sanitizer = sanitizer;
|
|
65
|
+
this.pathChange = new EventEmitter();
|
|
66
|
+
this.config = {};
|
|
67
|
+
this.showHiddenFiles = false;
|
|
68
|
+
this.viewMode = "grid";
|
|
69
|
+
this.gridSize = "normal";
|
|
70
|
+
this.fileSelect = new EventEmitter();
|
|
71
|
+
this.fileDblClick = new EventEmitter();
|
|
72
|
+
this.folderSelect = new EventEmitter();
|
|
73
|
+
this.folderDblClick = new EventEmitter();
|
|
74
|
+
this.newTab = new EventEmitter();
|
|
75
|
+
this.loadFiles = new EventEmitter();
|
|
76
|
+
this.directoryContents = [];
|
|
77
|
+
this.selection = [];
|
|
78
|
+
this.selectionChange = new EventEmitter();
|
|
79
|
+
this.value = [];
|
|
80
|
+
this.valueChange = new EventEmitter();
|
|
81
|
+
this.sortedFolders = [];
|
|
82
|
+
this.sorters = {
|
|
83
|
+
"a-z": (a, b) => a.name > b.name ? 1 : -1,
|
|
84
|
+
"z-a": (a, b) => b.name > a.name ? 1 : -1,
|
|
85
|
+
"lastmod": (a, b) => b.stats.mtimeMs - a.stats.mtimeMs,
|
|
86
|
+
"firstmod": (a, b) => a.stats.mtimeMs - b.stats.mtimeMs,
|
|
87
|
+
"size": (a, b) => b.stats.size - a.stats.size,
|
|
88
|
+
"type": (a, b) => a.path.split('.').splice(-1, 1)[0] > b.path.split('.').splice(-1, 1)[0] ? 1 : -1
|
|
89
|
+
};
|
|
90
|
+
this.sortOrder = "a-z";
|
|
91
|
+
this.itemsPerRow = 6;
|
|
92
|
+
// If the current directory is inside of an archive
|
|
93
|
+
this.isArchive = true;
|
|
94
|
+
this.userIsDraggingFile = false;
|
|
95
|
+
this.draggingOver = false;
|
|
96
|
+
this.showLoader = false;
|
|
97
|
+
this.hideLoader = false;
|
|
98
|
+
this.failedLoad = false;
|
|
99
|
+
this.columns = [
|
|
100
|
+
{ id: "name", label: "Name" },
|
|
101
|
+
{ id: "size", label: "Size" },
|
|
102
|
+
{ id: "type", label: "Type" },
|
|
103
|
+
{ id: "owner", label: "Owner" },
|
|
104
|
+
{ id: "group", label: "Group" },
|
|
105
|
+
{ id: "permissions", label: "Permissions" },
|
|
106
|
+
{ id: "location", label: "Location" },
|
|
107
|
+
{ id: "modified", label: "Modified" },
|
|
108
|
+
{ id: "modified--time", label: "Modified - Time" },
|
|
109
|
+
{ id: "accessed", label: "Accessed" },
|
|
110
|
+
{ id: "created", label: "Created" },
|
|
111
|
+
{ id: "recency", label: "Recency" },
|
|
112
|
+
{ id: "star", label: "Star" },
|
|
113
|
+
{ id: "detailed-type", label: "Detailed Type" },
|
|
114
|
+
];
|
|
115
|
+
this.cols = [
|
|
116
|
+
{ id: "name", label: "Name" },
|
|
117
|
+
{ id: "size", label: "Size" },
|
|
118
|
+
{ id: "modified", label: "Modified" },
|
|
119
|
+
{ id: "star", label: "Star" }
|
|
120
|
+
];
|
|
121
|
+
this.folderContextMenu = [
|
|
122
|
+
{
|
|
123
|
+
label: "New Folder",
|
|
124
|
+
// shortcutLabel: "Shift+Ctrl+N",
|
|
125
|
+
icon: "create_new_folder",
|
|
126
|
+
action: (data) => this.onCreateFolder(data)
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
label: "Upload file",
|
|
130
|
+
// shortcutLabel: "Ctrl+D",
|
|
131
|
+
icon: "file_upload",
|
|
132
|
+
action: (evt) => this.onUploadFile(evt)
|
|
133
|
+
},
|
|
134
|
+
"separator",
|
|
135
|
+
// {
|
|
136
|
+
// isDisabled: (data) => true,
|
|
137
|
+
// label: "_P_aste",
|
|
138
|
+
// icon: "content_paste",
|
|
139
|
+
// action: (evt) => {
|
|
140
|
+
// }
|
|
141
|
+
// },
|
|
142
|
+
{
|
|
143
|
+
label: "Select _A_ll",
|
|
144
|
+
shortcutLabel: "Ctrl+A",
|
|
145
|
+
icon: "select_all",
|
|
146
|
+
action: (evt) => {
|
|
147
|
+
this.selection = this._sortFilter();
|
|
148
|
+
this.selectionText = this.getSelectionText();
|
|
149
|
+
this.selectionChange.next(this.selection);
|
|
150
|
+
}
|
|
151
|
+
},
|
|
152
|
+
// "separator",
|
|
153
|
+
// {
|
|
154
|
+
// label: "P_r_operties",
|
|
155
|
+
// icon: "find_in_page",
|
|
156
|
+
// action: (evt) => {
|
|
157
|
+
// }
|
|
158
|
+
// }
|
|
159
|
+
];
|
|
160
|
+
this.fileContextMenu = [];
|
|
161
|
+
this.nameCellFormatter = ((cell, formatterParams, onRendered) => {
|
|
162
|
+
// TODO: Sanitize?
|
|
163
|
+
const item = cell.getData();
|
|
164
|
+
return `
|
|
165
|
+
<span style="display: flex; align-items: center">
|
|
166
|
+
<img style="height: 24px; margin-right: 6px" src="${item['_icon'].path}"/>
|
|
167
|
+
<p style="margin: 0">${this.sanitizer.sanitize(SecurityContext.HTML, item['vanityName'] || item.name)}</p>
|
|
168
|
+
</span>
|
|
169
|
+
`;
|
|
170
|
+
}).bind(this);
|
|
171
|
+
this.iconResolver = new IconResolver(this.libConfig.assetPath);
|
|
172
|
+
// ctrl + a => select all
|
|
173
|
+
keyboard.onKeyCommand({
|
|
174
|
+
key: "a",
|
|
175
|
+
ctrl: true,
|
|
176
|
+
}).subscribe(evt => {
|
|
177
|
+
this.selection = this._sortFilter();
|
|
178
|
+
this.selectionText = this.getSelectionText();
|
|
179
|
+
this.selectionChange.next(this.selection);
|
|
180
|
+
});
|
|
181
|
+
// ctrl + c => copy file names to clipboard
|
|
182
|
+
keyboard.onKeyCommand({
|
|
183
|
+
key: "c",
|
|
184
|
+
ctrl: true,
|
|
185
|
+
}).subscribe(evt => {
|
|
186
|
+
});
|
|
187
|
+
// ctrl + h => toggle hidden files
|
|
188
|
+
keyboard.onKeyCommand({
|
|
189
|
+
key: "h",
|
|
190
|
+
ctrl: true,
|
|
191
|
+
interrupt: true
|
|
192
|
+
}).subscribe(evt => {
|
|
193
|
+
this.showHiddenFiles = !this.showHiddenFiles;
|
|
194
|
+
});
|
|
195
|
+
// F2 => Rename selected files
|
|
196
|
+
keyboard.onKeyCommand({
|
|
197
|
+
key: "f2",
|
|
198
|
+
}).subscribe(evt => {
|
|
199
|
+
// Rename selected file(s)
|
|
200
|
+
});
|
|
201
|
+
// Enter => Open selected files
|
|
202
|
+
keyboard.onKeyCommand({
|
|
203
|
+
key: "Enter",
|
|
204
|
+
}).subscribe(evt => {
|
|
205
|
+
const files = this.directoryContents.filter(dc => this.selection.find(i => i.name == dc.name));
|
|
206
|
+
// this.windowManager.openFiles(files as any);
|
|
207
|
+
});
|
|
208
|
+
// Delete => delete selected files
|
|
209
|
+
keyboard.onKeyCommand({
|
|
210
|
+
key: "delete",
|
|
211
|
+
}).subscribe(evt => {
|
|
212
|
+
const files = this.directoryContents.filter(dc => this.selection.find(i => i.name == dc.name));
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
async ngOnInit() {
|
|
216
|
+
// this.loadFolder();
|
|
217
|
+
}
|
|
218
|
+
ngAfterViewInit() {
|
|
219
|
+
this.fileContextMenu = [
|
|
220
|
+
{
|
|
221
|
+
label: "Download",
|
|
222
|
+
icon: "download",
|
|
223
|
+
action: (file) => this.fileManager.downloadFile(file)
|
|
224
|
+
},
|
|
225
|
+
{
|
|
226
|
+
label: "Open in new Tab",
|
|
227
|
+
icon: "open_in_new",
|
|
228
|
+
isVisible: (data) => data.kind == "directory",
|
|
229
|
+
action: (data) => {
|
|
230
|
+
this.fileManager.initTab(data.path + data.name);
|
|
231
|
+
}
|
|
232
|
+
},
|
|
233
|
+
// {
|
|
234
|
+
// label: "Open with Application...",
|
|
235
|
+
// isVisible: (data) => data.kind == "file",
|
|
236
|
+
// shortcutLabel: "Ctrl+D",
|
|
237
|
+
// action: (evt) => {
|
|
238
|
+
// },
|
|
239
|
+
// },
|
|
240
|
+
"separator",
|
|
241
|
+
// {
|
|
242
|
+
// label: "Cut",
|
|
243
|
+
// icon: "content_cut",
|
|
244
|
+
// isDisabled: data => true,
|
|
245
|
+
// action: (evt) => {
|
|
246
|
+
// },
|
|
247
|
+
// },
|
|
248
|
+
// {
|
|
249
|
+
// label: "Copy",
|
|
250
|
+
// icon: "file_copy",
|
|
251
|
+
// isDisabled: data => true,
|
|
252
|
+
// childrenResolver: () => new Promise(r => setTimeout(r, 500000))
|
|
253
|
+
// },
|
|
254
|
+
// {
|
|
255
|
+
// label: "Move To...",
|
|
256
|
+
// icon: "drive_file_move",
|
|
257
|
+
// shortcutLabel: "Ctrl+A",
|
|
258
|
+
// action: (evt) => {
|
|
259
|
+
// },
|
|
260
|
+
// },
|
|
261
|
+
// {
|
|
262
|
+
// label: "Copy To...",
|
|
263
|
+
// icon: "folder_copy",
|
|
264
|
+
// shortcutLabel: "Ctrl+A",
|
|
265
|
+
// action: (evt) => {
|
|
266
|
+
// },
|
|
267
|
+
// },
|
|
268
|
+
{
|
|
269
|
+
label: "Delete",
|
|
270
|
+
icon: "delete",
|
|
271
|
+
// shortcutLabel: "Del",
|
|
272
|
+
isVisible: data => !data.path.includes("#/"), // omit files in compressed dirs
|
|
273
|
+
action: (evt) => {
|
|
274
|
+
const path = evt.path + evt.name;
|
|
275
|
+
const url = this.config.apiSettings.deleteEntryUrlTemplate
|
|
276
|
+
? this.config.apiSettings.deleteEntryUrlTemplate(path)
|
|
277
|
+
: this.config.apiSettings.deleteEntryUrl;
|
|
278
|
+
this.fetch.post(url, { path: evt.path + evt.name })
|
|
279
|
+
.then(() => this.loadFolder());
|
|
280
|
+
},
|
|
281
|
+
},
|
|
282
|
+
// {
|
|
283
|
+
// label: "Shred file",
|
|
284
|
+
// icon: "delete_forever",
|
|
285
|
+
// isVisible: data => !data.path.includes("#/"), // omit files in compressed dirs
|
|
286
|
+
// action: (evt) => {
|
|
287
|
+
// this.fetch.post(`/api/filesystem/delete?wipe=true`, { files: [evt.path + evt.name]})
|
|
288
|
+
// .then(() => this.loadFolder())
|
|
289
|
+
// },
|
|
290
|
+
// },
|
|
291
|
+
{
|
|
292
|
+
label: "Rename",
|
|
293
|
+
icon: "drive_file_rename_outline",
|
|
294
|
+
isVisible: data => !data.path.includes("#/"), // omit files in compressed dirs
|
|
295
|
+
// shortcutLabel: "F2",
|
|
296
|
+
action: (data) => {
|
|
297
|
+
this.dialog.open("folder-rename", "@dotglitch/ngx-web-components", {
|
|
298
|
+
inputs: { path: data?.path || this.path, name: data?.name || '', config: this.config }
|
|
299
|
+
}).then(r => this.loadFolder());
|
|
300
|
+
}
|
|
301
|
+
},
|
|
302
|
+
// Extract Here
|
|
303
|
+
// Extract To...
|
|
304
|
+
// {
|
|
305
|
+
// label: "Extract Here",
|
|
306
|
+
// icon: "folder_zip",
|
|
307
|
+
// shortcutLabel: "Ctrl+A",
|
|
308
|
+
// isDisabled: (data) => !(data.kind == "file" && data.ext != ".zip" && isArchive(data)),
|
|
309
|
+
// action: (evt) => {
|
|
310
|
+
// // TODO
|
|
311
|
+
// },
|
|
312
|
+
// },
|
|
313
|
+
// {
|
|
314
|
+
// label: "Extract to...",
|
|
315
|
+
// icon: "folder_zip",
|
|
316
|
+
// shortcutLabel: "Ctrl+A",
|
|
317
|
+
// isDisabled: (data) => !(data.kind == "file" && data.ext != ".zip" && isArchive(data)),
|
|
318
|
+
// action: (evt) => {
|
|
319
|
+
// // TODO
|
|
320
|
+
// },
|
|
321
|
+
// },
|
|
322
|
+
// {
|
|
323
|
+
// label: "Compress...",
|
|
324
|
+
// icon: "folder_zip",
|
|
325
|
+
// shortcutLabel: "Ctrl+A",
|
|
326
|
+
// isDisabled: (data) => data.kind == "file",
|
|
327
|
+
// action: (evt) => {
|
|
328
|
+
// // TODO
|
|
329
|
+
// },
|
|
330
|
+
// },
|
|
331
|
+
{
|
|
332
|
+
label: "Checksum",
|
|
333
|
+
icon: "manage_search",
|
|
334
|
+
isDisabled: (data) => data.kind != "file",
|
|
335
|
+
children: [
|
|
336
|
+
{
|
|
337
|
+
label: "MD5",
|
|
338
|
+
action: (evt) => this.performChecksum(evt.path + evt.name, "md5"),
|
|
339
|
+
},
|
|
340
|
+
{
|
|
341
|
+
label: "SHA1",
|
|
342
|
+
action: (evt) => this.performChecksum(evt.path + evt.name, "sha1"),
|
|
343
|
+
},
|
|
344
|
+
{
|
|
345
|
+
label: "SHA256",
|
|
346
|
+
action: (evt) => this.performChecksum(evt.path + evt.name, "sha256"),
|
|
347
|
+
},
|
|
348
|
+
{
|
|
349
|
+
label: "SHA512",
|
|
350
|
+
action: (evt) => this.performChecksum(evt.path + evt.name, "sha512"),
|
|
351
|
+
},
|
|
352
|
+
],
|
|
353
|
+
isVisible: (data) => {
|
|
354
|
+
return false;
|
|
355
|
+
return !this.isArchive || data.kind == "file";
|
|
356
|
+
},
|
|
357
|
+
},
|
|
358
|
+
// {
|
|
359
|
+
// label: "Star",
|
|
360
|
+
// icon: "star",
|
|
361
|
+
// shortcutLabel: "Ctrl+A",
|
|
362
|
+
// action: (evt) => {
|
|
363
|
+
// },
|
|
364
|
+
// },
|
|
365
|
+
// "separator",
|
|
366
|
+
// {
|
|
367
|
+
// label: "P_r_operties",
|
|
368
|
+
// icon: "find_in_page",
|
|
369
|
+
// action: (evt) => {
|
|
370
|
+
// },
|
|
371
|
+
// }
|
|
372
|
+
];
|
|
373
|
+
}
|
|
374
|
+
async loadFolder() {
|
|
375
|
+
this.showLoader = true;
|
|
376
|
+
this.hideLoader = false;
|
|
377
|
+
this.failedLoad = false;
|
|
378
|
+
const url = this.config.apiSettings.listEntriesUrlTemplate
|
|
379
|
+
? this.config.apiSettings.listEntriesUrlTemplate(this.path)
|
|
380
|
+
: this.config.apiSettings.listEntriesUrl;
|
|
381
|
+
this.fetch.post(url, { path: this.path, showHidden: this.showHiddenFiles }, {}, true)
|
|
382
|
+
.then((data) => {
|
|
383
|
+
const files = data?.files || [];
|
|
384
|
+
const dirs = data?.dirs || [];
|
|
385
|
+
const descriptors = files.concat(dirs);
|
|
386
|
+
descriptors.forEach(f => {
|
|
387
|
+
f['_icon'] = this.iconResolver.resolveIcon(f);
|
|
388
|
+
if (f.kind == "file") {
|
|
389
|
+
f['_ctime'] = new Date(f.stats?.ctimeMs)?.toLocaleString();
|
|
390
|
+
f['_mtime'] = new Date(f.stats?.mtimeMs)?.toLocaleString();
|
|
391
|
+
f['_size'] = this.bytesToString(f.stats?.size);
|
|
392
|
+
}
|
|
393
|
+
});
|
|
394
|
+
this.directoryContents = descriptors;
|
|
395
|
+
this._sortFilter();
|
|
396
|
+
this.resize();
|
|
397
|
+
this.loadFiles.next(descriptors);
|
|
398
|
+
if (this.sortedFolders.length > 0)
|
|
399
|
+
this.flowRows();
|
|
400
|
+
setTimeout(() => this.resize(), 250);
|
|
401
|
+
setTimeout(() => this.resize(), 500);
|
|
402
|
+
setTimeout(() => this.resize(), 1000);
|
|
403
|
+
setTimeout(() => this.resize(), 2500);
|
|
404
|
+
setTimeout(() => this.resize(), 5000);
|
|
405
|
+
})
|
|
406
|
+
.catch(e => {
|
|
407
|
+
this.failedLoad = true;
|
|
408
|
+
this.error = e;
|
|
409
|
+
console.error(e);
|
|
410
|
+
})
|
|
411
|
+
.finally(() => {
|
|
412
|
+
this.hideLoader = true;
|
|
413
|
+
setTimeout(() => {
|
|
414
|
+
this.showLoader = false;
|
|
415
|
+
}, 200);
|
|
416
|
+
});
|
|
417
|
+
}
|
|
418
|
+
flowRows() {
|
|
419
|
+
let filtered = this._sortFilter();
|
|
420
|
+
this.sortedFolders = [];
|
|
421
|
+
const num = Math.ceil(filtered.length / this.itemsPerRow);
|
|
422
|
+
const iterations = Math.min(num, 100);
|
|
423
|
+
for (let row = 0; row < iterations; row++) {
|
|
424
|
+
if (!this.sortedFolders[row])
|
|
425
|
+
this.sortedFolders[row] = [];
|
|
426
|
+
for (let i = row * this.itemsPerRow; i < (row + 1) * this.itemsPerRow && i < filtered.length; i++) {
|
|
427
|
+
this.sortedFolders[row].push(filtered[i]);
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
onSelect(item, evt) {
|
|
432
|
+
evt.stopPropagation();
|
|
433
|
+
if (this.keyboard.isShiftPressed) {
|
|
434
|
+
let start = this.directoryContents.findIndex(i => i.name == this.selection.slice(-1, 1)[0].name);
|
|
435
|
+
let end = this.directoryContents.indexOf(item);
|
|
436
|
+
if (start == -1)
|
|
437
|
+
start = end;
|
|
438
|
+
let items = start > end
|
|
439
|
+
? this.directoryContents.slice(end, start + 1)
|
|
440
|
+
: this.directoryContents.slice(start, end + 1);
|
|
441
|
+
this.selection = items;
|
|
442
|
+
}
|
|
443
|
+
else if (this.keyboard.isCtrlPressed) {
|
|
444
|
+
if (!this.selection.includes(item))
|
|
445
|
+
this.selection.push(item);
|
|
446
|
+
else // Case that we selected the same item twice
|
|
447
|
+
this.selection.splice(this.selection.indexOf(item), 1);
|
|
448
|
+
}
|
|
449
|
+
else
|
|
450
|
+
this.selection = [item];
|
|
451
|
+
if (this.selection.length == 1) {
|
|
452
|
+
if (this.selection[0].kind == "directory")
|
|
453
|
+
this.folderSelect.next(this.selection[0]);
|
|
454
|
+
else
|
|
455
|
+
this.fileSelect.next(this.selection[0]);
|
|
456
|
+
}
|
|
457
|
+
this.selectionChange.next(this.selection);
|
|
458
|
+
this.selectionText = this.getSelectionText();
|
|
459
|
+
}
|
|
460
|
+
onItemClick(file) {
|
|
461
|
+
console.log(file, this);
|
|
462
|
+
if (file.kind == "directory") {
|
|
463
|
+
this.folderDblClick.next(file);
|
|
464
|
+
this.path = file.path + file.name;
|
|
465
|
+
}
|
|
466
|
+
// else if (file.ext == "zip") {
|
|
467
|
+
// this.fileDblClick.next(file);
|
|
468
|
+
// this.path = file.path + file.name;
|
|
469
|
+
// }
|
|
470
|
+
else {
|
|
471
|
+
this.fileDblClick.next(file);
|
|
472
|
+
this.fileSelect.next(file);
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
onToggle(item, state) {
|
|
476
|
+
item['_value'] = state.checked;
|
|
477
|
+
// TODO: What causes this to be null when initialized with an array?
|
|
478
|
+
if (!this.value) {
|
|
479
|
+
this.value = [];
|
|
480
|
+
}
|
|
481
|
+
if (state.checked) {
|
|
482
|
+
this.value.push(item);
|
|
483
|
+
}
|
|
484
|
+
else {
|
|
485
|
+
const i = this.value.findIndex(v => v == item);
|
|
486
|
+
if (i >= 0)
|
|
487
|
+
this.value.splice(i, 1);
|
|
488
|
+
}
|
|
489
|
+
this.valueChange.next(this.value);
|
|
490
|
+
}
|
|
491
|
+
async clearSelection() {
|
|
492
|
+
this.value = [];
|
|
493
|
+
this.valueChange.next(this.value);
|
|
494
|
+
this.tabulator?.table?.getRows().forEach(r => r.getElement().classList.remove('selected'));
|
|
495
|
+
}
|
|
496
|
+
_sortFilter() {
|
|
497
|
+
return this.directoryContents = this.directoryContents?.filter(d => d.kind == 'directory')
|
|
498
|
+
.concat(this.directoryContents?.filter(d => d.kind == 'file')
|
|
499
|
+
.sort(this.sorters[this.sortOrder]));
|
|
500
|
+
}
|
|
501
|
+
getSelectionText() {
|
|
502
|
+
const dirCount = this.selection.filter(s => s.kind == "directory").length;
|
|
503
|
+
const fileCount = this.selection.filter(s => s.kind == "file").length;
|
|
504
|
+
if (dirCount + fileCount == 0)
|
|
505
|
+
return "";
|
|
506
|
+
const totalSize = this.directoryContents
|
|
507
|
+
.filter(d => d.kind == "file")
|
|
508
|
+
.filter(d => this.selection?.find(i => i.name == d.name))
|
|
509
|
+
.map(d => d['stats'].size).reduce((a, b) => a + b, 0);
|
|
510
|
+
if (dirCount + fileCount == 1)
|
|
511
|
+
return `"${this.selection[0].name}" selected (${this.bytesToString(totalSize)})`;
|
|
512
|
+
if (dirCount > 0 && fileCount == 0)
|
|
513
|
+
return `"${dirCount}" folders selected`;
|
|
514
|
+
if (fileCount > 0 && dirCount == 0)
|
|
515
|
+
return `${fileCount} items selected (${this.bytesToString(totalSize)})`;
|
|
516
|
+
return `${dirCount} folder${dirCount == 1 ? "" : "s"} selected, ${fileCount} other item${fileCount == 1 ? "" : "s"} selected (${this.bytesToString(totalSize)})`;
|
|
517
|
+
}
|
|
518
|
+
bytesToString(bytes, decimals = 2) {
|
|
519
|
+
if (!+bytes)
|
|
520
|
+
return '0 Bytes';
|
|
521
|
+
const k = 1024;
|
|
522
|
+
const dm = decimals < 0 ? 0 : decimals;
|
|
523
|
+
const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
|
|
524
|
+
const i = Math.floor(Math.log(bytes) / Math.log(k));
|
|
525
|
+
return `${parseFloat((bytes / Math.pow(k, i)).toFixed(dm))} ${sizes[i]}`;
|
|
526
|
+
}
|
|
527
|
+
resize() {
|
|
528
|
+
if (!this.filesRef) {
|
|
529
|
+
setTimeout(() => this.resize(), 25);
|
|
530
|
+
return;
|
|
531
|
+
}
|
|
532
|
+
;
|
|
533
|
+
const bounds = this.filesRef.nativeElement.getBoundingClientRect();
|
|
534
|
+
const newColCount = Math.floor(bounds.width / itemWidth);
|
|
535
|
+
if (newColCount != this.itemsPerRow) {
|
|
536
|
+
this.itemsPerRow = Math.floor(bounds.width / itemWidth);
|
|
537
|
+
if (this.itemsPerRow > 100)
|
|
538
|
+
this.itemsPerRow = 1;
|
|
539
|
+
this.flowRows();
|
|
540
|
+
}
|
|
541
|
+
if (this.sortedFolders?.length == 0)
|
|
542
|
+
this.flowRows();
|
|
543
|
+
}
|
|
544
|
+
onDragStart(evt, item) {
|
|
545
|
+
const target = `${window.origin}/api/filesystem/download?dir=${item.path}&file=${item.name}`;
|
|
546
|
+
evt.dataTransfer.clearData();
|
|
547
|
+
// evt.dataTransfer.setData('text/uri-list', target);
|
|
548
|
+
// evt.dataTransfer.setData('DownloadURL', `text/uri-list:${target}`);
|
|
549
|
+
evt.dataTransfer.setData('text/plain', item.name);
|
|
550
|
+
}
|
|
551
|
+
onDrop(ev) {
|
|
552
|
+
ev.preventDefault();
|
|
553
|
+
if (ev.dataTransfer.items) {
|
|
554
|
+
// Use DataTransferItemList interface to access the file(s)
|
|
555
|
+
[...ev.dataTransfer.items].forEach((item, i) => {
|
|
556
|
+
// If dropped items aren't files, reject them
|
|
557
|
+
if (item.kind === "file") {
|
|
558
|
+
const file = item.getAsFile();
|
|
559
|
+
console.log(`… file[${i}].name = ${file.name}`);
|
|
560
|
+
}
|
|
561
|
+
});
|
|
562
|
+
}
|
|
563
|
+
else {
|
|
564
|
+
// Use DataTransfer interface to access the file(s)
|
|
565
|
+
[...ev.dataTransfer.files].forEach((file, i) => {
|
|
566
|
+
console.log(`… file[${i}].name = ${file.name}`);
|
|
567
|
+
});
|
|
568
|
+
}
|
|
569
|
+
}
|
|
570
|
+
onRowCtx([event, row] = []) {
|
|
571
|
+
openMenu(this.matDialog, this.fileContextMenu, row.getData(), event);
|
|
572
|
+
}
|
|
573
|
+
onRowClick(row) {
|
|
574
|
+
const data = row.getData();
|
|
575
|
+
// $event.data['_value'] = $event.data['_value'] == true ? false : true
|
|
576
|
+
// console.log(event, row, data, this.value);
|
|
577
|
+
const rowEl = row.getElement();
|
|
578
|
+
let state = rowEl.classList.contains('selected');
|
|
579
|
+
data['_value'] = !state;
|
|
580
|
+
if (!this.value) {
|
|
581
|
+
this.value = [];
|
|
582
|
+
}
|
|
583
|
+
if (!state) {
|
|
584
|
+
rowEl.classList.add('selected');
|
|
585
|
+
this.value.push(data);
|
|
586
|
+
}
|
|
587
|
+
else {
|
|
588
|
+
rowEl.classList.remove('selected');
|
|
589
|
+
const i = this.value.findIndex(v => v == data);
|
|
590
|
+
if (i >= 0)
|
|
591
|
+
this.value.splice(i, 1);
|
|
592
|
+
}
|
|
593
|
+
this.valueChange.next(this.value);
|
|
594
|
+
}
|
|
595
|
+
sort() {
|
|
596
|
+
this._sortFilter();
|
|
597
|
+
}
|
|
598
|
+
onUploadFile(evt) {
|
|
599
|
+
uploadFile(this.fetch, this.config, this._path, evt ? (evt.path + evt.name) : null, this.fileManager.contextTags)
|
|
600
|
+
.then(res => {
|
|
601
|
+
// Refresh folder contents
|
|
602
|
+
this.loadFolder();
|
|
603
|
+
});
|
|
604
|
+
}
|
|
605
|
+
onCreateFolder(data) {
|
|
606
|
+
this.dialog.open("folder-rename", "@dotglitch/ngx-web-components", {
|
|
607
|
+
inputs: { path: data?.path || this.path, name: data?.name || '', config: this.config }
|
|
608
|
+
}).then(r => this.loadFolder());
|
|
609
|
+
}
|
|
610
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FileGridComponent, deps: [{ token: i1.Fetch }, { token: i1.KeyboardService }, { token: i1.DialogService }, { token: i2.MatDialog }, { token: i3.FilemanagerComponent }, { token: i0.ChangeDetectorRef }, { token: i4.DomSanitizer }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
611
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: FileGridComponent, isStandalone: true, selector: "app-file-grid", inputs: { path: "path", config: "config", showHiddenFiles: "showHiddenFiles", viewMode: "viewMode", gridSize: "gridSize", tab: "tab", selection: "selection", value: "value", sortOrder: "sortOrder" }, outputs: { pathChange: "pathChange", fileSelect: "fileSelect", fileDblClick: "fileDblClick", folderSelect: "folderSelect", folderDblClick: "folderDblClick", newTab: "newTab", loadFiles: "loadFiles", selectionChange: "selectionChange", valueChange: "valueChange" }, viewQueries: [{ propertyName: "filesRef", first: true, predicate: ["fileViewport"], descendants: true }, { propertyName: "tabulator", first: true, predicate: TabulatorComponent, descendants: true }, { propertyName: "renameTemplate", first: true, predicate: ["renameTemplate"], descendants: true, read: TemplateRef }], ngImport: i0, template: "@if (showLoader) {\n<mat-progress-bar [class.hide]=\"hideLoader\" mode=\"query\" />\n}\n\n<div style=\"display: contents\"\n [style.--filemanager-fileicon-backdrop]=\"'url(' + iconResolver.path + '/pop/generic.svg)'\"\n (dragstart)=\"userIsDraggingFile = true\" (dragend)=\"userIsDraggingFile = false\" (dragover)=\"draggingOver = true\"\n (dragleave)=\"draggingOver = false\" (ondrop)=\"onDrop($event)\">\n\n @if (failedLoad) {\n <div style=\"display: flex; align-items: center; justify-content: center; height: 100%\">\n <div\n style=\"max-width: 400px; display: flex; flex-direction: column; align-items: center; justify-content: center;\">\n <!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->\n <svg fill=\"var(--text-color)\" width=\"200px\" viewBox=\"0 0 600.525 600.525\">\n <path\n d=\"M57.375,138.656L43.031,95.146c-23.428,8.128-40.162,29.166-42.553,54.028l45.9,3.825C46.856,146.306,51.16,140.568,57.375,138.656z\" />\n <rect y=\"288.309\" width=\"45.9\" height=\"45.901\" />\n <path\n d=\"M554.625,446.091c0,3.346-0.956,6.215-2.868,9.084l38.25,25.34c6.693-10.039,10.04-21.992,10.04-34.424V423.14h-45.899v22.951H554.625z\" />\n <rect x=\"456.609\" y=\"146.306\" width=\"45.9\" height=\"45.9\" />\n <rect x=\"485.297\" y=\"462.825\" width=\"45.9\" height=\"45.9\" />\n <rect x=\"393.497\" y=\"462.825\" width=\"45.9\" height=\"45.9\" />\n <rect x=\"364.81\" y=\"146.306\" width=\"45.9\" height=\"45.9\" />\n <rect x=\"118.097\" y=\"462.825\" width=\"45.9\" height=\"45.9\" />\n <rect y=\"380.108\" width=\"45.9\" height=\"45.9\" />\n <rect y=\"196.509\" width=\"45.9\" height=\"45.9\" />\n <path\n d=\"M330.385,143.437c-2.391-1.434-3.825-2.391-4.304-2.869l-28.209-29.166c-1.913-1.913-4.303-3.825-6.694-5.737l-27.253,36.815c0.478,0.478,0.956,0.956,0.956,0.956s37.772,34.425,44.465,41.119L330.385,143.437z\" />\n <rect x=\"554.625\" y=\"239.541\" width=\"45.9\" height=\"45.9\" />\n <rect x=\"301.697\" y=\"462.825\" width=\"45.899\" height=\"45.9\" />\n <path\n d=\"M559.885,146.306h-10.997v47.812h5.737h45.9v-7.172C600.525,164.475,582.356,146.306,559.885,146.306z\" />\n <rect x=\"187.425\" y=\"91.8\" width=\"45.9\" height=\"45.9\" />\n <rect x=\"554.625\" y=\"331.341\" width=\"45.9\" height=\"45.9\" />\n <rect x=\"95.625\" y=\"91.8\" width=\"45.9\" height=\"45.9\" />\n <rect x=\"209.897\" y=\"462.825\" width=\"45.9\" height=\"45.9\" />\n <path\n d=\"M49.247,456.132l-36.337,27.73c11.953,15.777,30.122,24.863,49.725,24.863h9.562v-45.9h-9.562C57.375,462.825,52.594,460.435,49.247,456.132z\" />\n </svg>\n\n <h3>Sorry about that.</h3>\n <p>\n Our servers aren't doing their thing right now.\n You can try again later or contact an administrator about this.\n </p>\n <hr style=\"width: 100%; opacity: .5;\" />\n <p>\n Error:\n <span style=\"color: var(--mat-tab-header-active-focus-label-text-color)\">{{error.status}}</span>\n <br />\n @if (error.error?.message) {\n Message: {{error.error?.message}}\n }\n </p>\n </div>\n </div>\n }\n @else {\n <!-- <ng-container *ngIf=\"draggingOver\"></ng-container> -->\n <!-- Grid mode -->\n @if (viewMode == 'grid') {\n <ng-scrollbar class=\"grid content-area {{gridSize}} {{config.imageSize || 'normal'}}\"\n [class.selectionMode]=\"config.mode == 'focusFiles'\" [class.showDropArea]=\"draggingOver\"\n style=\"height: 100%; width: 100%\" track=\"vertical\" pointerEventsMethod=\"scrollbar\"\n [ngx-contextmenu]=\"folderContextMenu\">\n <div class=\"resize-observer\" #fileViewport></div>\n <cdk-virtual-scroll-viewport itemSize=\"150\" scrollViewport (click)=\"selection = []; selectionText = ''\">\n <div class=\"row\" *cdkVirtualFor=\"let row of sortedFolders\">\n @for (item of row; track item) {\n <div class=\"file\" [class.selected]=\"selection.includes(item)\"\n [class.generic]=\"item['_icon'].needsBackdrop\" [ngx-contextmenu]=\"fileContextMenu\"\n [ngx-menu-context]=\"item\">\n @if (config.mode == 'focusFiles' && item.kind == 'file') {\n <mat-checkbox #checkbox [checked]=\"item['_value']\" (change)=\"onToggle(item, $event)\" />\n }\n <div style=\"display: contents\" (click)=\"onSelect(item, $event)\" (dblclick)=\"onItemClick(item)\"\n (dragstart)=\"onDragStart($event, item)\">\n <img [src]=\"item['_icon'].path\" />\n <p>{{item['vanityName'] || item.name}}</p>\n </div>\n </div>\n }\n </div>\n </cdk-virtual-scroll-viewport>\n </ng-scrollbar>\n }\n\n <!-- List mode -->\n @if (viewMode == 'list') {\n <div class=\"content-area\" style=\"width: 100%; height: 100%\" [class.showDropArea]=\"draggingOver\"\n [ngx-contextmenu]=\"folderContextMenu\">\n <ngx-tabulator [dataSource]=\"directoryContents\" (rowClick)=\"onRowClick($event?.[1])\"\n (rowDblClick)=\"onItemClick($any($event?.[1]?.getData()))\" (rowContext)=\"onRowCtx($event)\">\n <ngx-tabulator-column field=\"name\" title=\"Name\" [formatter]=\"nameCellFormatter\" />\n <ngx-tabulator-column field=\"_size\" title=\"Size\" />\n <ngx-tabulator-column field=\"_ctime\" title=\"Created\" />\n <ngx-tabulator-column field=\"_mtime\" title=\"Modified\" />\n </ngx-tabulator>\n </div>\n }\n }\n</div>\n\n@if (selectionText?.trim()?.length > 0) {\n<div class=\"select-hint\">\n {{selectionText}}\n</div>\n}\n\n<div class=\"controls\">\n <button mat-flat-button class=\"upload-button\" (click)=\"onCreateFolder()\">\n <mat-icon>create_new_folder</mat-icon>\n New Folder\n </button>\n <button mat-flat-button class=\"upload-button\" (click)=\"onUploadFile()\">\n <mat-icon>upload_file</mat-icon>\n Upload\n </button>\n</div>", styles: [":host{display:block;height:100%;width:100%;overflow:hidden}.resize-observer{position:absolute;inset:0}.grid .row{flex:1;display:grid;grid-template-columns:repeat(auto-fill,80px);justify-content:space-between;grid-gap:20px;grid-auto-rows:min-content;padding:10px;margin-right:10px}.grid .file{width:80px;z-index:1;position:relative;transition:opacity 50ms ease-in-out;display:flex;flex-direction:column;align-items:center;text-align:center}.grid .file.selected p{background-color:#8ad9d9;color:#000}.grid .file.generic:before{content:\" \";position:absolute;background:var(--filemanager-fileicon-backdrop);background-repeat:no-repeat;width:100%;height:100%;z-index:-1;left:0}.grid .file.generic img{height:44px;width:44px;margin-top:28px;margin-bottom:8px}.grid .file img{-webkit-user-select:none;user-select:none}.grid .file p{height:50px;width:100%;margin:0;padding:2px;font-size:14px;line-height:16px;border-radius:4px;overflow:hidden;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;text-overflow:ellipsis;overflow-wrap:break-word;transition:background-color 50ms ease-in-out,color 50ms ease-in-out}.grid .file mat-checkbox{position:absolute;left:-32px;top:-16px}:host ::ng-deep .small .file{width:46px}:host ::ng-deep .grid.selectionMode .row{padding-left:30px}:host ::ng-deep .grid.selectionMode .cdk-virtual-scroll-content-wrapper{padding-top:10px}:host ::ng-deep .tabulator .tabulator-row .tabulator-cell:not(:first-of-type){padding-top:9px}.list .row{flex:1;display:flex;align-items:center;padding:5px 10px;height:42px}.list .row p{margin:0}.list .row:hover{background-color:var(--filemanager-row-hover-background-color, #343434)}.list .row.selected p{background-color:#8ad9d9;color:#000;border-radius:5px;padding:0 4px}.list .row.odd{background-color:var(--filemanager-row-alt-background-color, #323232)}.controls{position:absolute;bottom:12px;right:12px;display:flex;gap:12px}.select-hint{position:absolute;font-size:14px;bottom:0;right:0;background-color:#000a;padding:2px 10px;border:1px solid black;border-top-right-radius:5px;border-bottom:none;border-right:none;z-index:9999}.select-hint:hover{display:none}.content-area{border:4px dashed rgba(0,0,0,0)}.showDropArea{border:4px dashed var(--theme-primary, rgba(128, 128, 128, .8));transition:border-color .25s ease}:host ::ng-deep ng-scrollbar.ng-scrollbar{box-sizing:border-box!important;--scrollbar-thumb-color: #666;min-height:200px;min-width:200px}mat-progress-bar{--mdc-linear-progress-track-height: 2px;position:absolute;top:0;left:0;width:100%;animation:dropIn .2s ease;transition:position .2s ease;z-index:100}mat-progress-bar.hide{top:-2px}@keyframes dropIn{0%{top:-2px}to{top:0}}\n"], dependencies: [{ kind: "ngmodule", type: MatTabsModule }, { kind: "ngmodule", type: NgScrollbarModule }, { kind: "component", type: i5.NgScrollbar, selector: "ng-scrollbar", inputs: ["disabled", "sensorDisabled", "pointerEventsDisabled", "viewportPropagateMouseMove", "autoHeightDisabled", "autoWidthDisabled", "viewClass", "trackClass", "thumbClass", "minThumbSize", "trackClickScrollDuration", "pointerEventsMethod", "track", "visibility", "appearance", "position", "sensorDebounce", "scrollAuditTime"], outputs: ["updated"], exportAs: ["ngScrollbar"] }, { kind: "directive", type: i5.ScrollViewport, selector: "[scrollViewport]" }, { kind: "ngmodule", type: MatInputModule }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i6.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "ngmodule", type: MatProgressBarModule }, { kind: "component", type: i7.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i9.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "ngmodule", type: TabulatorModule }, { kind: "component", type: i10.TabulatorComponent, selector: "ngx-tabulator", inputs: ["dataSource", "options", "height", "maxHeight", "minHeight", "renderVertical", "renderHorizontal", "rowHeight", "renderVerticalBuffer", "placeholder", "placeholderHeaderFilter", "footerElement", "keybindings", "reactiveData", "autoResize", "invalidOptionWarnings", "validationMode", "textDirection", "rowHeader", "editorEmptyValue", "editorEmptyValueFunc", "rowContextMenu", "rowClickMenu", "rowDblClickMenu", "groupClickMenu", "groupDblClickMenu", "groupContextMenu", "popupContainer", "groupClickPopup", "groupContextPopup", "groupDblPopup", "groupDblClickPopup", "rowClickPopup", "rowContextPopup", "rowDblClickPopup", "history", "locale", "langs", "downloadEncoder", "downloadConfig", "downloadRowRange", "downloadDataFormatter", "downloadReady", "autoColumns", "autoColumnsDefinitions", "layout", "layoutColumnsOnNewData", "responsiveLayout", "responsiveLayoutCollapseStartOpen", "responsiveLayoutCollapseUseFormatters", "responsiveLayoutCollapseFormatter", "movableColumns", "columnHeaderVertAlign", "scrollToColumnPosition", "scrollToColumnIfVisible", "columnCalcs", "nestedFieldSeparator", "columnHeaderSortMulti", "headerVisible", "headerSort", "headerSortElement", "columnDefaults", "resizableColumnFit", "rowFormatter", "rowFormatterPrint", "rowFormatterHtmlOutput", "rowFormatterClipboard", "addRowPos", "selectable", "selectableRows", "selectableRange", "selectableRangeColumns", "selectableRangeRows", "selectableRangeClearCells", "selectableRangeClearCellsValue", "selectableRangeMode", "selectableRowsRangeMode", "selectableRollingSelection", "selectableRowsRollingSelection", "selectablePersistence", "selectableRowsPersistence", "selectableCheck", "movableRows", "movableRowsConnectedTables", "movableRowsSender", "movableRowsReceiver", "movableRowsConnectedElements", "resizableRows", "resizableRowGuide", "resizableColumnGuide", "scrollToRowPosition", "scrollToRowIfVisible", "tabEndNewRow", "frozenRowsField", "frozenRows", "editTriggerEvent", "index", "data", "importFormat", "importReader", "autoTables", "ajaxURL", "ajaxParams", "ajaxConfig", "ajaxContentType", "ajaxURLGenerator", "ajaxRequestFunc", "ajaxFiltering", "ajaxSorting", "progressiveLoad", "progressiveLoadDelay", "progressiveLoadScrollMargin", "ajaxLoader", "ajaxLoaderLoading", "ajaxLoaderError", "ajaxRequesting", "ajaxResponse", "dataLoader", "dataLoaderLoading", "dataLoaderError", "dataLoaderErrorTimeout", "sortMode", "filterMode", "initialSort", "sortOrderReverse", "headerSortClickElement", "initialFilter", "initialHeaderFilter", "headerFilterLiveFilterDelay", "groupBy", "groupValues", "groupHeader", "groupHeaderPrint", "groupStartOpen", "groupToggleElement", "groupClosedShowCalcs", "groupUpdateOnCellEdit", "pagination", "paginationMode", "paginationSize", "paginationSizeSelector", "paginationElement", "dataReceiveParams", "dataSendParams", "paginationAddRow", "paginationCounter", "paginationCounterElement", "paginationButtonCount", "paginationInitialPage", "persistenceID", "persistenceMode", "persistentLayout", "persistentSort", "persistentFilter", "persistence", "persistenceWriterFunc", "persistenceReaderFunc", "clipboard", "clipboardCopyRowRange", "clipboardCopyFormatter", "clipboardCopyHeader", "clipboardPasteParser", "clipboardPasteAction", "clipboardCopyStyled", "clipboardCopyConfig", "groupHeaderClipboard", "groupHeaderHtmlOutput", "dataTree", "dataTreeElementColumn", "dataTreeBranchElement", "dataTreeChildIndent", "dataTreeChildField", "dataTreeCollapseElement", "dataTreeExpandElement", "dataTreeStartExpanded", "dataTreeSelectPropagate", "dataTreeFilter", "dataTreeSort", "dataTreeChildColumnCalcs", "invalidOptionWarning", "debugInvalidOptions", "debugInitialization", "debugEventsExternal", "debugEventsInternal", "debugInvalidComponentFuncs", "debugDeprecation", "htmlOutputConfig", "printAsHtml", "printConfig", "printStyled", "printRowRange", "printHeader", "printFooter", "printFormatter", "groupHeaderDownload", "spreadsheet", "spreadsheetRows", "spreadsheetColumns", "spreadsheetColumnDefinition", "spreadsheetSheets", "spreadsheetSheetTabs", "spreadsheetOutputFull"], outputs: ["validationFailed", "scrollHorizontal", "scrollVertical", "rowAdded", "rowDeleted", "rowMoving", "rowMoved", "rowMoveCancelled", "rowUpdated", "rowSelectionChanged", "rowSelected", "rowDeselected", "rowResized", "rowClick", "rowDblClick", "rowContext", "rowTap", "rowDblTap", "rowTapHold", "rowMouseEnter", "rowMouseLeave", "rowMouseOver", "rowMouseDown", "rowMouseUp", "rowMouseOut", "rowMouseMove", "htmlImporting", "htmlImported", "ajaxError", "clipboardCopied", "clipboardPasted", "clipboardPasteError", "downloadComplete", "dataTreeRowExpanded", "dataTreeRowCollapsed", "pageLoaded", "pageSizeChanged", "headerClick", "headerDblClick", "headerContext", "headerTap", "headerDblTap", "headerTapHold", "headerMouseUp", "headerMouseDown", "groupClick", "groupDblClick", "groupContext", "groupTap", "groupDblTap", "groupTapHold", "groupMouseDown", "groupMouseUp", "tableBuilding", "tableBuilt", "tableDestroyed", "dataChanged", "dataLoading", "dataLoaded", "dataLoadError", "dataProcessing", "dataProcessed", "dataFiltering", "dataFiltered", "dataSorting", "dataSorted", "movableRowsSendingStart", "movableRowsSent", "movableRowsSentFailed", "movableRowsSendingStop", "movableRowsReceivingStart", "movableRowsReceived", "movableRowsReceivedFailed", "movableRowsReceivingStop", "movableRowsElementDrop", "dataGrouping", "dataGrouped", "groupVisibilityChanged", "localized", "renderStarted", "renderComplete", "columnMoved", "columnResized", "columnTitleChanged", "columnVisibilityChanged", "historyUndo", "historyRedo", "cellEditing", "cellEdited", "cellEditCancelled", "cellClick", "cellDblClick", "cellContext", "cellMouseDown", "cellMouseUp", "cellTap", "cellDblTap", "cellTapHold", "cellMouseEnter", "cellMouseLeave", "cellMouseOver", "cellMouseOut", "cellMouseMove", "popupOpen", "popupClosed", "menuClosed", "menuOpened", "TooltipClosed", "TooltipOpened", "rangeAdded", "rangeChanged", "rangeRemoved", "rowHeightChange", "rowResizing", "columnWidth", "columnResizing", "sheetAdded", "sheetLoaded", "sheetUpdated", "sheetRemoved", "columnsLoaded", "importChoose", "importImporting", "importError", "importImported"] }, { kind: "directive", type: i10.ColumnDirective, selector: "ngx-tabulator>ngx-tabulator-column", inputs: ["accessorClipboard", "accessor", "accessorClipboardParams", "accessorDownload", "accessorDownloadParams", "accessorHtmlOutput", "accessorHtmlOutputParams", "accessorParams", "accessorPrint", "accessorPrintParams", "bottomCalc", "bottomCalcFormatter", "bottomCalcFormatterParams", "bottomCalcParams", "cellPopup", "clickMenu", "clipboard", "columns", "contextMenu", "cssClass", "dblClickMenu", "dblClickPopup", "download", "editable", "editableTitle", "editor", "editorEmptyValue", "editorEmptyValueFunc", "editorParams", "field", "formatter", "formatterClipboard", "formatterClipboardParams", "formatterHtmlOutput", "formatterHtmlOutputParams", "formatterParams", "formatterPrint", "formatterPrintParams", "frozen", "headerContextMenu", "headerDblClickMenu", "headerDblClickPopup", "headerFilter", "headerFilterEmptyCheck", "headerFilterFunc", "headerFilterFuncParams", "headerFilterLiveFilter", "headerFilterParams", "headerFilterPlaceholder", "headerHozAlign", "headerMenu", "headerMenuIcon", "headerSort", "headerSortStartingDir", "headerSortTristate", "headerTooltip", "headerVertical", "headerWordWrap", "hideInHtml", "hozAlign", "htmlOutput", "maxWidth", "minWidth", "mutator", "mutatorClipboard", "mutatorClipboardParams", "mutatorData", "mutatorDataParams", "mutatorEdit", "mutatorEditParams", "mutatorParams", "print", "resizable", "responsive", "rowHandle", "sorter", "sorterParams", "title", "titleClipboard", "titleDownload", "titleFormatter", "titleFormatterParams", "titleHtmlOutput", "titlePrint", "tooltip", "topCalc", "topCalcFormatter", "topCalcFormatterParams", "topCalcParams", "validator", "variableHeight", "vertAlign", "visible", "width", "widthGrow", "widthShrink"], outputs: ["headerClick", "headerDblClick", "headerMouseDown", "headerMouseUp", "headerContext", "headerTap", "headerDblTap", "headerTapHold", "cellClick", "cellDblClick", "cellContext", "cellTap", "cellDblTap", "cellTapHold", "cellMouseEnter", "cellMouseLeave", "cellMouseOver", "cellMouseOut", "cellMouseMove", "cellEditing", "cellEdited", "cellEditCancelled", "cellMouseDown", "cellMouseUp"] }, { kind: "directive", type: MenuDirective, selector: "[ngx-contextmenu],[ngx-menu]", inputs: ["ngx-menu-context", "ngx-contextmenu", "ngx-menu", "ngx-menu-config"] }, { kind: "ngmodule", type: ScrollingModule }, { kind: "directive", type: i11.CdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "directive", type: i11.CdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { kind: "component", type: i11.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }] }); }
|
|
612
|
+
}
|
|
613
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FileGridComponent, decorators: [{
|
|
614
|
+
type: Component,
|
|
615
|
+
args: [{ selector: 'app-file-grid', imports: [
|
|
616
|
+
NgIf,
|
|
617
|
+
NgForOf,
|
|
618
|
+
DatePipe,
|
|
619
|
+
MatTabsModule,
|
|
620
|
+
NgScrollbarModule,
|
|
621
|
+
MatInputModule,
|
|
622
|
+
MatCheckboxModule,
|
|
623
|
+
MatProgressBarModule,
|
|
624
|
+
MatIconModule,
|
|
625
|
+
MatButtonModule,
|
|
626
|
+
TabulatorModule,
|
|
627
|
+
MenuDirective,
|
|
628
|
+
ScrollingModule
|
|
629
|
+
], standalone: true, template: "@if (showLoader) {\n<mat-progress-bar [class.hide]=\"hideLoader\" mode=\"query\" />\n}\n\n<div style=\"display: contents\"\n [style.--filemanager-fileicon-backdrop]=\"'url(' + iconResolver.path + '/pop/generic.svg)'\"\n (dragstart)=\"userIsDraggingFile = true\" (dragend)=\"userIsDraggingFile = false\" (dragover)=\"draggingOver = true\"\n (dragleave)=\"draggingOver = false\" (ondrop)=\"onDrop($event)\">\n\n @if (failedLoad) {\n <div style=\"display: flex; align-items: center; justify-content: center; height: 100%\">\n <div\n style=\"max-width: 400px; display: flex; flex-direction: column; align-items: center; justify-content: center;\">\n <!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->\n <svg fill=\"var(--text-color)\" width=\"200px\" viewBox=\"0 0 600.525 600.525\">\n <path\n d=\"M57.375,138.656L43.031,95.146c-23.428,8.128-40.162,29.166-42.553,54.028l45.9,3.825C46.856,146.306,51.16,140.568,57.375,138.656z\" />\n <rect y=\"288.309\" width=\"45.9\" height=\"45.901\" />\n <path\n d=\"M554.625,446.091c0,3.346-0.956,6.215-2.868,9.084l38.25,25.34c6.693-10.039,10.04-21.992,10.04-34.424V423.14h-45.899v22.951H554.625z\" />\n <rect x=\"456.609\" y=\"146.306\" width=\"45.9\" height=\"45.9\" />\n <rect x=\"485.297\" y=\"462.825\" width=\"45.9\" height=\"45.9\" />\n <rect x=\"393.497\" y=\"462.825\" width=\"45.9\" height=\"45.9\" />\n <rect x=\"364.81\" y=\"146.306\" width=\"45.9\" height=\"45.9\" />\n <rect x=\"118.097\" y=\"462.825\" width=\"45.9\" height=\"45.9\" />\n <rect y=\"380.108\" width=\"45.9\" height=\"45.9\" />\n <rect y=\"196.509\" width=\"45.9\" height=\"45.9\" />\n <path\n d=\"M330.385,143.437c-2.391-1.434-3.825-2.391-4.304-2.869l-28.209-29.166c-1.913-1.913-4.303-3.825-6.694-5.737l-27.253,36.815c0.478,0.478,0.956,0.956,0.956,0.956s37.772,34.425,44.465,41.119L330.385,143.437z\" />\n <rect x=\"554.625\" y=\"239.541\" width=\"45.9\" height=\"45.9\" />\n <rect x=\"301.697\" y=\"462.825\" width=\"45.899\" height=\"45.9\" />\n <path\n d=\"M559.885,146.306h-10.997v47.812h5.737h45.9v-7.172C600.525,164.475,582.356,146.306,559.885,146.306z\" />\n <rect x=\"187.425\" y=\"91.8\" width=\"45.9\" height=\"45.9\" />\n <rect x=\"554.625\" y=\"331.341\" width=\"45.9\" height=\"45.9\" />\n <rect x=\"95.625\" y=\"91.8\" width=\"45.9\" height=\"45.9\" />\n <rect x=\"209.897\" y=\"462.825\" width=\"45.9\" height=\"45.9\" />\n <path\n d=\"M49.247,456.132l-36.337,27.73c11.953,15.777,30.122,24.863,49.725,24.863h9.562v-45.9h-9.562C57.375,462.825,52.594,460.435,49.247,456.132z\" />\n </svg>\n\n <h3>Sorry about that.</h3>\n <p>\n Our servers aren't doing their thing right now.\n You can try again later or contact an administrator about this.\n </p>\n <hr style=\"width: 100%; opacity: .5;\" />\n <p>\n Error:\n <span style=\"color: var(--mat-tab-header-active-focus-label-text-color)\">{{error.status}}</span>\n <br />\n @if (error.error?.message) {\n Message: {{error.error?.message}}\n }\n </p>\n </div>\n </div>\n }\n @else {\n <!-- <ng-container *ngIf=\"draggingOver\"></ng-container> -->\n <!-- Grid mode -->\n @if (viewMode == 'grid') {\n <ng-scrollbar class=\"grid content-area {{gridSize}} {{config.imageSize || 'normal'}}\"\n [class.selectionMode]=\"config.mode == 'focusFiles'\" [class.showDropArea]=\"draggingOver\"\n style=\"height: 100%; width: 100%\" track=\"vertical\" pointerEventsMethod=\"scrollbar\"\n [ngx-contextmenu]=\"folderContextMenu\">\n <div class=\"resize-observer\" #fileViewport></div>\n <cdk-virtual-scroll-viewport itemSize=\"150\" scrollViewport (click)=\"selection = []; selectionText = ''\">\n <div class=\"row\" *cdkVirtualFor=\"let row of sortedFolders\">\n @for (item of row; track item) {\n <div class=\"file\" [class.selected]=\"selection.includes(item)\"\n [class.generic]=\"item['_icon'].needsBackdrop\" [ngx-contextmenu]=\"fileContextMenu\"\n [ngx-menu-context]=\"item\">\n @if (config.mode == 'focusFiles' && item.kind == 'file') {\n <mat-checkbox #checkbox [checked]=\"item['_value']\" (change)=\"onToggle(item, $event)\" />\n }\n <div style=\"display: contents\" (click)=\"onSelect(item, $event)\" (dblclick)=\"onItemClick(item)\"\n (dragstart)=\"onDragStart($event, item)\">\n <img [src]=\"item['_icon'].path\" />\n <p>{{item['vanityName'] || item.name}}</p>\n </div>\n </div>\n }\n </div>\n </cdk-virtual-scroll-viewport>\n </ng-scrollbar>\n }\n\n <!-- List mode -->\n @if (viewMode == 'list') {\n <div class=\"content-area\" style=\"width: 100%; height: 100%\" [class.showDropArea]=\"draggingOver\"\n [ngx-contextmenu]=\"folderContextMenu\">\n <ngx-tabulator [dataSource]=\"directoryContents\" (rowClick)=\"onRowClick($event?.[1])\"\n (rowDblClick)=\"onItemClick($any($event?.[1]?.getData()))\" (rowContext)=\"onRowCtx($event)\">\n <ngx-tabulator-column field=\"name\" title=\"Name\" [formatter]=\"nameCellFormatter\" />\n <ngx-tabulator-column field=\"_size\" title=\"Size\" />\n <ngx-tabulator-column field=\"_ctime\" title=\"Created\" />\n <ngx-tabulator-column field=\"_mtime\" title=\"Modified\" />\n </ngx-tabulator>\n </div>\n }\n }\n</div>\n\n@if (selectionText?.trim()?.length > 0) {\n<div class=\"select-hint\">\n {{selectionText}}\n</div>\n}\n\n<div class=\"controls\">\n <button mat-flat-button class=\"upload-button\" (click)=\"onCreateFolder()\">\n <mat-icon>create_new_folder</mat-icon>\n New Folder\n </button>\n <button mat-flat-button class=\"upload-button\" (click)=\"onUploadFile()\">\n <mat-icon>upload_file</mat-icon>\n Upload\n </button>\n</div>", styles: [":host{display:block;height:100%;width:100%;overflow:hidden}.resize-observer{position:absolute;inset:0}.grid .row{flex:1;display:grid;grid-template-columns:repeat(auto-fill,80px);justify-content:space-between;grid-gap:20px;grid-auto-rows:min-content;padding:10px;margin-right:10px}.grid .file{width:80px;z-index:1;position:relative;transition:opacity 50ms ease-in-out;display:flex;flex-direction:column;align-items:center;text-align:center}.grid .file.selected p{background-color:#8ad9d9;color:#000}.grid .file.generic:before{content:\" \";position:absolute;background:var(--filemanager-fileicon-backdrop);background-repeat:no-repeat;width:100%;height:100%;z-index:-1;left:0}.grid .file.generic img{height:44px;width:44px;margin-top:28px;margin-bottom:8px}.grid .file img{-webkit-user-select:none;user-select:none}.grid .file p{height:50px;width:100%;margin:0;padding:2px;font-size:14px;line-height:16px;border-radius:4px;overflow:hidden;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;text-overflow:ellipsis;overflow-wrap:break-word;transition:background-color 50ms ease-in-out,color 50ms ease-in-out}.grid .file mat-checkbox{position:absolute;left:-32px;top:-16px}:host ::ng-deep .small .file{width:46px}:host ::ng-deep .grid.selectionMode .row{padding-left:30px}:host ::ng-deep .grid.selectionMode .cdk-virtual-scroll-content-wrapper{padding-top:10px}:host ::ng-deep .tabulator .tabulator-row .tabulator-cell:not(:first-of-type){padding-top:9px}.list .row{flex:1;display:flex;align-items:center;padding:5px 10px;height:42px}.list .row p{margin:0}.list .row:hover{background-color:var(--filemanager-row-hover-background-color, #343434)}.list .row.selected p{background-color:#8ad9d9;color:#000;border-radius:5px;padding:0 4px}.list .row.odd{background-color:var(--filemanager-row-alt-background-color, #323232)}.controls{position:absolute;bottom:12px;right:12px;display:flex;gap:12px}.select-hint{position:absolute;font-size:14px;bottom:0;right:0;background-color:#000a;padding:2px 10px;border:1px solid black;border-top-right-radius:5px;border-bottom:none;border-right:none;z-index:9999}.select-hint:hover{display:none}.content-area{border:4px dashed rgba(0,0,0,0)}.showDropArea{border:4px dashed var(--theme-primary, rgba(128, 128, 128, .8));transition:border-color .25s ease}:host ::ng-deep ng-scrollbar.ng-scrollbar{box-sizing:border-box!important;--scrollbar-thumb-color: #666;min-height:200px;min-width:200px}mat-progress-bar{--mdc-linear-progress-track-height: 2px;position:absolute;top:0;left:0;width:100%;animation:dropIn .2s ease;transition:position .2s ease;z-index:100}mat-progress-bar.hide{top:-2px}@keyframes dropIn{0%{top:-2px}to{top:0}}\n"] }]
|
|
630
|
+
}], ctorParameters: () => [{ type: i1.Fetch }, { type: i1.KeyboardService }, { type: i1.DialogService }, { type: i2.MatDialog }, { type: i3.FilemanagerComponent }, { type: i0.ChangeDetectorRef }, { type: i4.DomSanitizer }], propDecorators: { filesRef: [{
|
|
631
|
+
type: ViewChild,
|
|
632
|
+
args: ["fileViewport"]
|
|
633
|
+
}], tabulator: [{
|
|
634
|
+
type: ViewChild,
|
|
635
|
+
args: [TabulatorComponent]
|
|
636
|
+
}], renameTemplate: [{
|
|
637
|
+
type: ViewChild,
|
|
638
|
+
args: ['renameTemplate', { read: TemplateRef }]
|
|
639
|
+
}], path: [{
|
|
640
|
+
type: Input
|
|
641
|
+
}], pathChange: [{
|
|
642
|
+
type: Output
|
|
643
|
+
}], config: [{
|
|
644
|
+
type: Input
|
|
645
|
+
}], showHiddenFiles: [{
|
|
646
|
+
type: Input
|
|
647
|
+
}], viewMode: [{
|
|
648
|
+
type: Input
|
|
649
|
+
}], gridSize: [{
|
|
650
|
+
type: Input
|
|
651
|
+
}], tab: [{
|
|
652
|
+
type: Input
|
|
653
|
+
}], fileSelect: [{
|
|
654
|
+
type: Output
|
|
655
|
+
}], fileDblClick: [{
|
|
656
|
+
type: Output
|
|
657
|
+
}], folderSelect: [{
|
|
658
|
+
type: Output
|
|
659
|
+
}], folderDblClick: [{
|
|
660
|
+
type: Output
|
|
661
|
+
}], newTab: [{
|
|
662
|
+
type: Output
|
|
663
|
+
}], loadFiles: [{
|
|
664
|
+
type: Output
|
|
665
|
+
}], selection: [{
|
|
666
|
+
type: Input
|
|
667
|
+
}], selectionChange: [{
|
|
668
|
+
type: Output
|
|
669
|
+
}], value: [{
|
|
670
|
+
type: Input
|
|
671
|
+
}], valueChange: [{
|
|
672
|
+
type: Output
|
|
673
|
+
}], sortOrder: [{
|
|
674
|
+
type: Input
|
|
675
|
+
}] } });
|
|
676
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS1ncmlkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvbW1vbi9maWxlbWFuYWdlci9maWxlLWdyaWQvZmlsZS1ncmlkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvbW1vbi9maWxlbWFuYWdlci9maWxlLWdyaWQvZmlsZS1ncmlkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN6RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMxRCxPQUFPLEVBQXFCLFNBQVMsRUFBYyxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxlQUFlLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN2SixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFxQixpQkFBaUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRWxGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDdEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRXZELE9BQU8sRUFBeUMsYUFBYSxFQUFZLFFBQVEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3RILE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNsRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsZUFBZSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFHM0UsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFN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QUFiLEtBQUs7Z0JBQ0ksV0FBVztzQkFBcEIsTUFBTTtnQkFjRSxTQUFTO3NCQUFqQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU2Nyb2xsaW5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3Njcm9sbGluZyc7XG5pbXBvcnQgeyBEYXRlUGlwZSwgTmdGb3JPZiwgTmdJZiB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCwgU2VjdXJpdHlDb250ZXh0LCBUZW1wbGF0ZVJlZiwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNYXRCdXR0b25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xuaW1wb3J0IHsgTWF0Q2hlY2tib3hDaGFuZ2UsIE1hdENoZWNrYm94TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY2hlY2tib3gnO1xuaW1wb3J0IHsgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7IE1hdEljb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcbmltcG9ydCB7IE1hdElucHV0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaW5wdXQnO1xuaW1wb3J0IHsgTWF0UHJvZ3Jlc3NCYXJNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wcm9ncmVzcy1iYXInO1xuaW1wb3J0IHsgTWF0VGFic01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3RhYnMnO1xuaW1wb3J0IHsgRG9tU2FuaXRpemVyIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5pbXBvcnQgeyBEaWFsb2dTZXJ2aWNlLCBGZXRjaCwgS2V5Ym9hcmRTZXJ2aWNlLCBNZW51RGlyZWN0aXZlLCBNZW51SXRlbSwgb3Blbk1lbnUgfSBmcm9tICdAZG90Z2xpdGNoL25neC1jb21tb24vY29yZSc7XG5pbXBvcnQgeyBOZ1Njcm9sbGJhck1vZHVsZSB9IGZyb20gJ25neC1zY3JvbGxiYXInO1xuaW1wb3J0IHsgVGFidWxhdG9yQ29tcG9uZW50LCBUYWJ1bGF0b3JNb2R1bGUgfSBmcm9tICduZ3gtdGFidWxhdG9yLXRhYmxlcyc7XG5pbXBvcnQgeyBDZWxsQ29tcG9uZW50LCBFbXB0eUNhbGxiYWNrIH0gZnJvbSAndGFidWxhdG9yLXRhYmxlcyc7XG5pbXBvcnQgeyBEaXJlY3RvcnlEZXNjcmlwdG9yLCBGaWxlRGVzY3JpcHRvciwgRmlsZW1hbmFnZXJDb21wb25lbnQsIEZpbGVWaWV3VGFiLCBGU0Rlc2NyaXB0b3IsIE5neEZpbGVNYW5hZ2VyQ29uZmlndXJhdGlvbiB9IGZyb20gJy4uL2ZpbGVtYW5hZ2VyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyB1cGxvYWRGaWxlIH0gZnJvbSAnLi4vaGVscGVycyc7XG5pbXBvcnQgeyBJY29uUmVzb2x2ZXIgfSBmcm9tICcuLi9pY29uLXJlc29sdmVyJztcbmltcG9ydCB7IEZpbGVTb3J0aW5nIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5jb25zdCBpdGVtV2lkdGggPSAoODAgKyAyMCk7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnYXBwLWZpbGUtZ3JpZCcsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2ZpbGUtZ3JpZC5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vZmlsZS1ncmlkLmNvbXBvbmVudC5zY3NzJ10sXG4gICAgaW1wb3J0czogW1xuICAgICAgICBOZ0lmLFxuICAgICAgICBOZ0Zvck9mLFxuICAgICAgICBEYXRlUGlwZSxcbiAgICAgICAgTWF0VGFic01vZHVsZSxcbiAgICAgICAgTmdTY3JvbGxiYXJNb2R1bGUsXG4gICAgICAgIE1hdElucHV0TW9kdWxlLFxuICAgICAgICBNYXRDaGVja2JveE1vZHVsZSxcbiAgICAgICAgTWF0UHJvZ3Jlc3NCYXJNb2R1bGUsXG4gICAgICAgIE1hdEljb25Nb2R1bGUsXG4gICAgICAgIE1hdEJ1dHRvbk1vZHVsZSxcbiAgICAgICAgVGFidWxhdG9yTW9kdWxlLFxuICAgICAgICBNZW51RGlyZWN0aXZlLFxuICAgICAgICBTY3JvbGxpbmdNb2R1bGVcbiAgICBdLFxuICAgIHN0YW5kYWxvbmU6IHRydWVcbn0pXG5leHBvcnQgY2xhc3MgRmlsZUdyaWRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICAgIEBWaWV3Q2hpbGQoXCJmaWxlVmlld3BvcnRcIikgZmlsZXNSZWY6IEVsZW1lbnRSZWY7XG4gICAgQFZpZXdDaGlsZChUYWJ1bGF0b3JDb21wb25lbnQpIHRhYnVsYXRvcjogVGFidWxhdG9yQ29tcG9uZW50O1xuXG4gICAgQFZpZXdDaGlsZCgncmVuYW1lVGVtcGxhdGUnLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pIHJlbmFtZVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG5cbiAgICBwcml2YXRlIF9wYXRoOiBzdHJpbmc7XG4gICAgQElucHV0KCkgc2V0IHBhdGgodmFsdWU6IHN0cmluZykge1xuICAgICAgICBpZiAoIXZhbHVlKSByZXR1cm47XG5cbiAgICAgICAgaWYgKHRoaXMuX3BhdGggJiYgdGhpcy5jb25maWcubmF2aWdhdGVPbmx5VG9EZXNjZW5kYW50cykge1xuICAgICAgICAgICAgaWYgKCF2YWx1ZS5zdGFydHNXaXRoKCcvJykpXG4gICAgICAgICAgICAgICAgdmFsdWUgPSAnLycgKyB2YWx1ZTtcbiAgICAgICAgICAgIGlmICghdmFsdWUuc3RhcnRzV2l0aCh0aGlzLmNvbmZpZy5wYXRoKSlcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcHJldiA9IHRoaXMuX3BhdGg7XG5cbiAgICAgICAgdGhpcy5fcGF0aCA9IHZhbHVlO1xuXG4gICAgICAgIGlmIChwcmV2ICE9IHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLnBhdGhDaGFuZ2UubmV4dCh0aGlzLnBhdGgpO1xuICAgICAgICAgICAgaWYgKHRoaXMuY29uZmlnLmFwaVNldHRpbmdzKVxuICAgICAgICAgICAgICAgIHRoaXMubG9hZEZvbGRlcigpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCBwYXRoKCkgeyByZXR1cm4gdGhpcy5fcGF0aDsgfVxuICAgIEBPdXRwdXQoKSBwYXRoQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgICBASW5wdXQoKSBjb25maWc6IE5neEZpbGVNYW5hZ2VyQ29uZmlndXJhdGlvbiA9IHt9O1xuICAgIEBJbnB1dCgpIHNob3dIaWRkZW5GaWxlcyA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIHZpZXdNb2RlOiBcImxpc3RcIiB8IFwiZ3JpZFwiID0gXCJncmlkXCI7XG4gICAgQElucHV0KCkgZ3JpZFNpemU6IFwic21hbGxcIiB8IFwibm9ybWFsXCIgfCBcImxhcmdlXCIgPSBcIm5vcm1hbFwiO1xuICAgIEBJbnB1dCgpIHRhYjogRmlsZVZpZXdUYWI7XG5cbiAgICBAT3V0cHV0KCkgZmlsZVNlbGVjdCA9IG5ldyBFdmVudEVtaXR0ZXI8RmlsZURlc2NyaXB0b3I+KCk7XG4gICAgQE91dHB1dCgpIGZpbGVEYmxDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8RmlsZURlc2NyaXB0b3I+KCk7XG4gICAgQE91dHB1dCgpIGZvbGRlclNlbGVjdCA9IG5ldyBFdmVudEVtaXR0ZXI8RGlyZWN0b3J5RGVzY3JpcHRvcj4oKTtcbiAgICBAT3V0cHV0KCkgZm9sZGVyRGJsQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPERpcmVjdG9yeURlc2NyaXB0b3I+KCk7XG4gICAgQE91dHB1dCgpIG5ld1RhYiA9IG5ldyBFdmVudEVtaXR0ZXI8eyBwYXRoOiBzdHJpbmc7IH0+KCk7XG4gICAgQE91dHB1dCgpIGxvYWRGaWxlcyA9IG5ldyBFdmVudEVtaXR0ZXI8RlNEZXNjcmlwdG9yW10+KCk7XG5cbiAgICBkaXJlY3RvcnlDb250ZW50czogRlNEZXNjcmlwdG9yW10gPSBbXTtcbiAgICBASW5wdXQoKSBzZWxlY3Rpb246IEZTRGVzY3JpcHRvcltdID0gW107XG4gICAgQE91dHB1dCgpIHNlbGVjdGlvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8RlNEZXNjcmlwdG9yW10+KCk7XG5cbiAgICBASW5wdXQoKSB2YWx1ZTogRlNEZXNjcmlwdG9yW10gPSBbXTtcbiAgICBAT3V0cHV0KCkgdmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPEZTRGVzY3JpcHRvcltdPigpO1xuXG4gICAgc2VsZWN0aW9uVGV4dDogc3RyaW5nO1xuXG4gICAgc29ydGVkRm9sZGVyczogYW55W11bXSA9IFtdO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBzb3J0ZXJzID0ge1xuICAgICAgICBcImEtelwiOiAoYTogRmlsZURlc2NyaXB0b3IsIGI6IEZpbGVEZXNjcmlwdG9yKSA9PiBhLm5hbWUgPiBiLm5hbWUgPyAxIDogLTEsXG4gICAgICAgIFwiei1hXCI6IChhOiBGaWxlRGVzY3JpcHRvciwgYjogRmlsZURlc2NyaXB0b3IpID0+IGIubmFtZSA+IGEubmFtZSA/IDEgOiAtMSxcbiAgICAgICAgXCJsYXN0bW9kXCI6IChhOiBGaWxlRGVzY3JpcHRvciwgYjogRmlsZURlc2NyaXB0b3IpID0+IGIuc3RhdHMubXRpbWVNcyAtIGEuc3RhdHMubXRpbWVNcyxcbiAgICAgICAgXCJmaXJzdG1vZFwiOiAoYTogRmlsZURlc2NyaXB0b3IsIGI6IEZpbGVEZXNjcmlwdG9yKSA9PiBhLnN0YXRzLm10aW1lTXMgLSBiLnN0YXRzLm10aW1lTXMsXG4gICAgICAgIFwic2l6ZVwiOiAoYTogRmlsZURlc2NyaXB0b3IsIGI6IEZpbGVEZXNjcmlwdG9yKSA9PiBiLnN0YXRzLnNpemUgLSBhLnN0YXRzLnNpemUsXG4gICAgICAgIFwidHlwZVwiOiAoYTogRmlsZURlc2NyaXB0b3IsIGI6IEZpbGVEZXNjcmlwdG9yKSA9PiBhLnBhdGguc3BsaXQoJy4nKS5zcGxpY2UoLTEsIDEpWzBdID4gYi5wYXRoLnNwbGl0KCcuJykuc3BsaWNlKC0xLCAxKVswXSA/IDEgOiAtMVxuICAgIH07XG4gICAgQElucHV0KCkgc29ydE9yZGVyOiBGaWxlU29ydGluZyA9IFwiYS16XCI7XG5cbiAgICBpdGVtc1BlclJvdyA9IDY7XG5cbiAgICAvLyBJZiB0aGUgY3VycmVudCBkaXJlY3RvcnkgaXMgaW5zaWRlIG9mIGFuIGFyY2hpdmVcbiAgICBpc0FyY2hpdmUgPSB0cnVlO1xuXG4gICAgdXNlcklzRHJhZ2dpbmdGaWxlID0gZmFsc2U7XG4gICAgZHJhZ2dpbmdPdmVyID0gZmFsc2U7XG5cbiAgICBzaG93TG9hZGVyID0gZmFsc2U7XG4gICAgaGlkZUxvYWRlciA9IGZhbHNlO1xuICAgIGZhaWxlZExvYWQgPSBmYWxzZTtcbiAgICBlcnJvcjtcblxuICAgIHJlYWRvbmx5IGNvbHVtbnMgPSBbXG4gICAgICAgIHsgaWQ6IFwibmFtZVwiLCBsYWJlbDogXCJOYW1lXCIgfSxcbiAgICAgICAgeyBpZDogXCJzaXplXCIsIGxhYmVsOiBcIlNpemVcIiB9LFxuICAgICAgICB7IGlkOiBcInR5cGVcIiwgbGFiZWw6IFwiVHlwZVwiIH0sXG4gICAgICAgIHsgaWQ6IFwib3duZXJcIiwgbGFiZWw6IFwiT3duZXJcIiB9LFxuICAgICAgICB7IGlkOiBcImdyb3VwXCIsIGxhYmVsOiBcIkdyb3VwXCIgfSxcbiAgICAgICAgeyBpZDogXCJwZXJtaXNzaW9uc1wiLCBsYWJlbDogXCJQZXJtaXNzaW9uc1wiIH0sXG4gICAgICAgIHsgaWQ6IFwibG9jYXRpb25cIiwgbGFiZWw6IFwiTG9jYXRpb25cIiB9LFxuICAgICAgICB7IGlkOiBcIm1vZGlmaWVkXCIsIGxhYmVsOiBcIk1vZGlmaWVkXCIgfSxcbiAgICAgICAgeyBpZDogXCJtb2RpZmllZC0tdGltZVwiLCBsYWJlbDogXCJNb2RpZmllZCAtIFRpbWVcIiB9LFxuICAgICAgICB7IGlkOiBcImFjY2Vzc2VkXCIsIGxhYmVsOiBcIkFjY2Vzc2VkXCIgfSxcbiAgICAgICAgeyBpZDogXCJjcmVhdGVkXCIsIGxhYmVsOiBcIkNyZWF0ZWRcIiB9LFxuICAgICAgICB7IGlkOiBcInJlY2VuY3lcIiwgbGFiZWw6IFwiUmVjZW5jeVwiIH0sXG4gICAgICAgIHsgaWQ6IFwic3RhclwiLCBsYWJlbDogXCJTdGFyXCIgfSxcbiAgICAgICAgeyBpZDogXCJkZXRhaWxlZC10eXBlXCIsIGxhYmVsOiBcIkRldGFpbGVkIFR5cGVcIiB9LFxuICAgIF07XG5cbiAgICBjb2xzID0gW1xuICAgICAgICB7IGlkOiBcIm5hbWVcIiwgbGFiZWw6IFwiTmFtZVwiIH0sXG4gICAgICAgIHsgaWQ6IFwic2l6ZVwiLCBsYWJlbDogXCJTaXplXCIgfSxcbiAgICAgICAgeyBpZDogXCJtb2RpZmllZFwiLCBsYWJlbDogXCJNb2RpZmllZFwiIH0sXG4gICAgICAgIHsgaWQ6IFwic3RhclwiLCBsYWJlbDogXCJTdGFyXCIgfVxuICAgIF07XG5cbiAgICBmb2xkZXJDb250ZXh0TWVudTogTWVudUl0ZW08RlNEZXNjcmlwdG9yPltdID0gW1xuICAgICAgICB7XG4gICAgICAgICAgICBsYWJlbDogXCJOZXcgRm9sZGVyXCIsXG4gICAgICAgICAgICAvLyBzaG9ydGN1dExhYmVsOiBcIlNoaWZ0K0N0cmwrTlwiLFxuICAgICAgICAgICAgaWNvbjogXCJjcmVhdGVfbmV3X2ZvbGRlclwiLFxuICAgICAgICAgICAgYWN0aW9uOiAoZGF0YSkgPT4gdGhpcy5vbkNyZWF0ZUZvbGRlcihkYXRhKVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBsYWJlbDogXCJVcGxvYWQgZmlsZVwiLFxuICAgICAgICAgICAgLy8gc2hvcnRjdXRMYWJlbDogXCJDdHJsK0RcIixcbiAgICAgICAgICAgIGljb246IFwiZmlsZV91cGxvYWRcIixcbiAgICAgICAgICAgIGFjdGlvbjogKGV2dCkgPT4gdGhpcy5vblVwbG9hZEZpbGUoZXZ0KVxuICAgICAgICB9LFxuICAgICAgICBcInNlcGFyYXRvclwiLFxuICAgICAgICAvLyB7XG4gICAgICAgIC8vICAgICBpc0Rpc2FibGVkOiAoZGF0YSkgPT4gdHJ1ZSxcbiAgICAgICAgLy8gICAgIGxhYmVsOiBcIl9QX2FzdGVcIixcbiAgICAgICAgLy8gICAgIGljb246IFwiY29udGVudF9wYXN0ZVwiLFxuICAgICAgICAvLyAgICAgYWN0aW9uOiAoZXZ0KSA9PiB7XG4gICAgICAgIC8vICAgICB9XG4gICAgICAgIC8vIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIGxhYmVsOiBcIlNlbGVjdCBfQV9sbFwiLFxuICAgICAgICAgICAgc2hvcnRjdXRMYWJlbDogXCJDdHJsK0FcIixcbiAgICAgICAgICAgIGljb246IFwic2VsZWN0X2FsbFwiLFxuICAgICAgICAgICAgYWN0aW9uOiAoZXZ0KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24gPSB0aGlzLl9zb3J0RmlsdGVyKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25UZXh0ID0gdGhpcy5nZXRTZWxlY3Rpb25UZXh0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2UubmV4dCh0aGlzLnNlbGVjdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIC8vIFwic2VwYXJhdG9yXCIsXG4gICAgICAgIC8vIHtcbiAgICAgICAgLy8gICAgIGxhYmVsOiBcIlBfcl9vcGVydGllc1wiLFxuICAgICAgICAvLyAgICAgaWNvbjogXCJmaW5kX2luX3BhZ2VcIixcbiAgICAgICAgLy8gICAgIGFjdGlvbjogKGV2dCkgPT4ge1xuXG4gICAgICAgIC8vICAgICB9XG4gICAgICAgIC8vIH1cbiAgICBdO1xuXG4gICAgZmlsZUNvbnRleHRNZW51OiBNZW51SXRlbTxGU0Rlc2NyaXB0b3I+W10gPSBbXTtcblxuICAgIHBlcmZvcm1DaGVja3N1bShwYXRoLCBkaWdlc3QpIHtcbiAgICAgICAgLy8gdGhpcy53aW5kb3dNYW5hZ2VyLm9wZW5XaW5kb3coe1xuICAgICAgICAvLyAgICAgYXBwSWQ6IFwiY2hlY2tzdW1cIixcbiAgICAgICAgLy8gICAgIGRhdGE6IHsgZGlnZXN0LCBwYXRoIH0sXG4gICAgICAgIC8vICAgICB3b3Jrc3BhY2U6IHRoaXMud2luZG93UmVmLndvcmtzcGFjZSxcbiAgICAgICAgLy8gICAgIHdpZHRoOiA2MDAsXG4gICAgICAgIC8vICAgICBoZWlnaHQ6IDI1MFxuICAgICAgICAvLyB9KTtcbiAgICB9XG5cbiAgICBpY29uUmVzb2x2ZXI6IEljb25SZXNvbHZlcjtcblxuICAgIGdldCBsaWJDb25maWcoKSB7IHJldHVybiB0aGlzLmZpbGVNYW5hZ2VyLmxpYkNvbmZpZzsgfVxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGZldGNoOiBGZXRjaCxcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBrZXlib2FyZDogS2V5Ym9hcmRTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGRpYWxvZzogRGlhbG9nU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBtYXREaWFsb2c6IE1hdERpYWxvZyxcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBmaWxlTWFuYWdlcjogRmlsZW1hbmFnZXJDb21wb25lbnQsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgY2hhbmdlRGV0ZWN0b3I6IENoYW5nZURldGVjdG9yUmVmLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHNhbml0aXplcjogRG9tU2FuaXRpemVyXG4gICAgKSB7XG5cblxuICAgICAgICB0aGlzLmljb25SZXNvbHZlciA9IG5ldyBJY29uUmVzb2x2ZXIodGhpcy5saWJDb25maWcuYXNzZXRQYXRoKTtcblxuICAgICAgICAvLyBjdHJsICsgYSA9PiBzZWxlY3QgYWxsXG4gICAgICAgIGtleWJvYXJkLm9uS2V5Q29tbWFuZCh7XG4gICAgICAgICAgICBrZXk6IFwiYVwiLFxuICAgICAgICAgICAgY3RybDogdHJ1ZSxcbiAgICAgICAgfSkuc3Vic2NyaWJlKGV2dCA9PiB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbiA9IHRoaXMuX3NvcnRGaWx0ZXIoKTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uVGV4dCA9IHRoaXMuZ2V0U2VsZWN0aW9uVGV4dCgpO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2UubmV4dCh0aGlzLnNlbGVjdGlvbik7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIGN0cmwgKyBjID0+IGNvcHkgZmlsZSBuYW1lcyB0byBjbGlwYm9hcmRcbiAgICAgICAga2V5Ym9hcmQub25LZXlDb21tYW5kKHtcbiAgICAgICAgICAgIGtleTogXCJjXCIsXG4gICAgICAgICAgICBjdHJsOiB0cnVlLFxuICAgICAgICB9KS5zdWJzY3JpYmUoZXZ0ID0+IHtcblxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBjdHJsICsgaCA9PiB0b2dnbGUgaGlkZGVuIGZpbGVzXG4gICAgICAgIGtleWJvYXJkLm9uS2V5Q29tbWFuZCh7XG4gICAgICAgICAgICBrZXk6IFwiaFwiLFxuICAgICAgICAgICAgY3RybDogdHJ1ZSxcbiAgICAgICAgICAgIGludGVycnVwdDogdHJ1ZVxuICAgICAgICB9KS5zdWJzY3JpYmUoZXZ0ID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2hvd0hpZGRlbkZpbGVzID0gIXRoaXMuc2hvd0hpZGRlbkZpbGVzO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBGMiA9PiBSZW5hbWUgc2VsZWN0ZWQgZmlsZXNcbiAgICAgICAga2V5Ym9hcmQub25LZXlDb21tYW5kKHtcbiAgICAgICAgICAgIGtleTogXCJmMlwiLFxuICAgICAgICB9KS5zdWJzY3JpYmUoZXZ0ID0+IHtcbiAgICAgICAgICAgIC8vIFJlbmFtZSBzZWxlY3RlZCBmaWxlKHMpXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEVudGVyID0+IE9wZW4gc2VsZWN0ZWQgZmlsZXNcbiAgICAgICAga2V5Ym9hcmQub25LZXlDb21tYW5kKHtcbiAgICAgICAgICAgIGtleTogXCJFbnRlclwiLFxuICAgICAgICB9KS5zdWJzY3JpYmUoZXZ0ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVzID0gdGhpcy5kaXJlY3RvcnlDb250ZW50cy5maWx0ZXIoZGMgPT4gdGhpcy5zZWxlY3Rpb24uZmluZChpID0+IGkubmFtZSA9PSBkYy5uYW1lKSk7XG4gICAgICAgICAgICAvLyB0aGlzLndpbmRvd01hbmFnZXIub3BlbkZpbGVzKGZpbGVzIGFzIGFueSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIERlbGV0ZSA9PiBkZWxldGUgc2VsZWN0ZWQgZmlsZXNcbiAgICAgICAga2V5Ym9hcmQub25LZXlDb21tYW5kKHtcbiAgICAgICAgICAgIGtleTogXCJkZWxldGVcIixcbiAgICAgICAgfSkuc3Vic2NyaWJlKGV2dCA9PiB7XG4gICAgICAgICAgICBjb25zdCBmaWxlcyA9IHRoaXMuZGlyZWN0b3J5Q29udGVudHMuZmlsdGVyKGRjID0+IHRoaXMuc2VsZWN0aW9uLmZpbmQoaSA9PiBpLm5hbWUgPT0gZGMubmFtZSkpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBhc3luYyBuZ09uSW5pdCgpIHtcbiAgICAgICAgLy8gdGhpcy5sb2FkRm9sZGVyKCk7XG4gICAgfVxuXG4gICAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgICAgICB0aGlzLmZpbGVDb250ZXh0TWVudSA9IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsYWJlbDogXCJEb3dubG9hZFwiLFxuICAgICAgICAgICAgICAgIGljb246IFwiZG93bmxvYWRcIixcbiAgICAgICAgICAgICAgICBhY3Rpb246IChmaWxlKSA9PiB0aGlzLmZpbGVNYW5hZ2VyLmRvd25sb2FkRmlsZShmaWxlKVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsYWJlbDogXCJPcGVuIGluIG5ldyBUYWJcIixcbiAgICAgICAgICAgICAgICBpY29uOiBcIm9wZW5faW5fbmV3XCIsXG4gICAgICAgICAgICAgICAgaXNWaXNpYmxlOiAoZGF0YSkgPT4gZGF0YS5raW5kID09IFwiZGlyZWN0b3J5XCIsXG4gICAgICAgICAgICAgICAgYWN0aW9uOiAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbGVNYW5hZ2VyLmluaXRUYWIoZGF0YS5wYXRoICsgZGF0YS5uYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLy8ge1xuICAgICAgICAgICAgLy8gICAgIGxhYmVsOiBcIk9wZW4gd2l0aCBBcHBsaWNhdGlvbi4uLlwiLFxuICAgICAgICAgICAgLy8gICAgIGlzVmlzaWJsZTogKGRhdGEpID0+IGRhdGEua2luZCA9PSBcImZpbGVcIixcbiAgICAgICAgICAgIC8vICAgICBzaG9ydGN1dExhYmVsOiBcIkN0cmwrRFwiLFxuICAgICAgICAgICAgLy8gICAgIGFjdGlvbjogKGV2dCkgPT4ge1xuXG4gICAgICAgICAgICAvLyAgICAgfSxcbiAgICAgICAgICAgIC8vIH0sXG4gICAgICAgICAgICBcInNlcGFyYXRvclwiLFxuICAgICAgICAgICAgLy8ge1xuICAgICAgICAgICAgLy8gICAgIGxhYmVsOiBcIkN1dFwiLFxuICAgICAgICAgICAgLy8gICAgIGljb246IFwiY29udGVudF9jdXRcIixcbiAgICAgICAgICAgIC8vICAgICBpc0Rpc2FibGVkOiBkYXRhID0+IHRydWUsXG4gICAgICAgICAgICAvLyAgICAgYWN0aW9uOiAoZXZ0KSA9PiB7XG4gICAgICAgICAgICAvLyAgICAgfSxcbiAgICAgICAgICAgIC8vIH0sXG4gICAgICAgICAgICAvLyB7XG4gICAgICAgICAgICAvLyAgICAgbGFiZWw6IFwiQ29weVwiLFxuICAgICAgICAgICAgLy8gICAgIGljb246IFwiZmlsZV9jb3B5XCIsXG4gICAgICAgICAgICAvLyAgICAgaXNEaXNhYmxlZDogZGF0YSA9PiB0cnVlLFxuICAgICAgICAgICAgLy8gICAgIGNoaWxkcmVuUmVzb2x2ZXI6ICgpID0+IG5ldyBQcm9taXNlKHIgPT4gc2V0VGltZW91dChyLCA1MDAwMDApKVxuICAgICAgICAgICAgLy8gfSxcbiAgICAgICAgICAgIC8vIHtcbiAgICAgICAgICAgIC8vICAgICBsYWJlbDogXCJNb3ZlIFRvLi4uXCIsXG4gICAgICAgICAgICAvLyAgICAgaWNvbjogXCJkcml2ZV9maWxlX21vdmVcIixcbiAgICAgICAgICAgIC8vICAgICBzaG9ydGN1dExhYmVsOiBcIkN0cmwrQVwiLFxuICAgICAgICAgICAgLy8gICAgIGFjdGlvbjogKGV2dCkgPT4ge1xuXG4gICAgICAgICAgICAvLyAgICAgfSxcbiAgICAgICAgICAgIC8vIH0sXG4gICAgICAgICAgICAvLyB7XG4gICAgICAgICAgICAvLyAgICAgbGFiZWw6IFwiQ29weSBUby4uLlwiLFxuICAgICAgICAgICAgLy8gICAgIGljb246IFwiZm9sZGVyX2NvcHlcIixcbiAgICAgICAgICAgIC8vICAgICBzaG9ydGN1dExhYmVsOiBcIkN0cmwrQVwiLFxuICAgICAgICAgICAgLy8gICAgIGFjdGlvbjogKGV2dCkgPT4ge1xuXG4gICAgICAgICAgICAvLyAgICAgfSxcbiAgICAgICAgICAgIC8vIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbGFiZWw6IFwiRGVsZXRlXCIsXG4gICAgICAgICAgICAgICAgaWNvbjogXCJkZWxldGVcIixcbiAgICAgICAgICAgICAgICAvLyBzaG9ydGN1dExhYmVsOiBcIkRlbFwiLFxuICAgICAgICAgICAgICAgIGlzVmlzaWJsZTogZGF0YSA9PiAhZGF0YS5wYXRoLmluY2x1ZGVzKFwiIy9cIiksIC8vIG9taXQgZmlsZXMgaW4gY29tcHJlc3NlZCBkaXJzXG4gICAgICAgICAgICAgICAgYWN0aW9uOiAoZXZ0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhdGggPSBldnQucGF0aCArIGV2dC5uYW1lO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHVybCA9IHRoaXMuY29uZmlnLmFwaVNldHRpbmdzLmRlbGV0ZUVudHJ5VXJsVGVtcGxhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgID8gdGhpcy5jb25maWcuYXBpU2V0dGluZ3MuZGVsZXRlRW50cnlVcmxUZW1wbGF0ZShwYXRoKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiB0aGlzLmNvbmZpZy5hcGlTZXR0aW5ncy5kZWxldGVFbnRyeVVybDtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZldGNoLnBvc3QodXJsLCB7IHBhdGg6IGV2dC5wYXRoICsgZXZ0Lm5hbWUgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IHRoaXMubG9hZEZvbGRlcigpKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC8vIHtcbiAgICAgICAgICAgIC8vICAgICBsYWJlbDogXCJTaHJlZCBmaWxlXCIsXG4gICAgICAgICAgICAvLyAgICAgaWNvbjogXCJkZWxldGVfZm9yZXZlclwiLFxuICAgICAgICAgICAgLy8gICAgIGlzVmlzaWJsZTogZGF0YSA9PiAhZGF0YS5wYXRoLmluY2x1ZGVzKFwiIy9cIiksIC8vIG9taXQgZmlsZXMgaW4gY29tcHJlc3NlZCBkaXJzXG4gICAgICAgICAgICAvLyAgICAgYWN0aW9uOiAoZXZ0KSA9PiB7XG4gICAgICAgICAgICAvLyAgICAgICAgIHRoaXMuZmV0Y2gucG9zdChgL2FwaS9maWxlc3lzdGVtL2RlbGV0ZT93aXBlPXRydWVgLCB7IGZpbGVzOiBbZXZ0LnBhdGggKyBldnQubmFtZV19KVxuICAgICAgICAgICAgLy8gICAgICAgICAgICAgLnRoZW4oKCkgPT4gdGhpcy5sb2FkRm9sZGVyKCkpXG4gICAgICAgICAgICAvLyAgICAgfSxcbiAgICAgICAgICAgIC8vIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbGFiZWw6IFwiUmVuYW1lXCIsXG4gICAgICAgICAgICAgICAgaWNvbjogXCJkcml2ZV9maWxlX3JlbmFtZV9vdXRsaW5lXCIsXG4gICAgICAgICAgICAgICAgaXNWaXNpYmxlOiBkYXRhID0+ICFkYXRhLnBhdGguaW5jbHVkZXMoXCIjL1wiKSwgLy8gb21pdCBmaWxlcyBpbiBjb21wcmVzc2VkIGRpcnNcbiAgICAgICAgICAgICAgICAvLyBzaG9ydGN1dExhYmVsOiBcIkYyXCIsXG4gICAgICAgICAgICAgICAgYWN0aW9uOiAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRpYWxvZy5vcGVuKFwiZm9sZGVyLXJlbmFtZVwiLCBcIkBkb3RnbGl0Y2gvbmd4LXdlYi1jb21wb25lbnRzXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0czogeyBwYXRoOiBkYXRhPy5wYXRoIHx8IHRoaXMucGF0aCwgbmFtZTogZGF0YT8ubmFtZSB8fCAnJywgY29uZmlnOiB0aGlzLmNvbmZpZyB9XG4gICAgICAgICAgICAgICAgICAgIH0pLnRoZW4ociA9PiB0aGlzLmxvYWRGb2xkZXIoKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgLy8gRXh0cmFjdCBIZXJlXG4gICAgICAgICAgICAvLyBFeHRyYWN0IFRvLi4uXG4gICAgICAgICAgICAvLyB7XG4gICAgICAgICAgICAvLyAgICAgbGFiZWw6IFwiRXh0cmFjdCBIZXJlXCIsXG4gICAgICAgICAgICAvLyAgICAgaWNvbjogXCJmb2xkZXJfemlwXCIsXG4gICAgICAgICAgICAvLyAgICAgc2hvcnRjdXRMYWJlbDogXCJDdHJsK0FcIixcbiAgICAgICAgICAgIC8vICAgICBpc0Rpc2FibGVkOiAoZGF0YSkgPT4gIShkYXRhLmtpbmQgPT0gXCJmaWxlXCIgJiYgZGF0YS5leHQgIT0gXCIuemlwXCIgJiYgaXNBcmNoaXZlKGRhdGEpKSxcbiAgICAgICAgICAgIC8vICAgICBhY3Rpb246IChldnQpID0+IHtcbiAgICAgICAgICAgIC8vICAgICAgICAgLy8gVE9ET1xuICAgICAgICAgICAgLy8gICAgIH0sXG4gICAgICAgICAgICAvLyB9LFxuICAgICAgICAgICAgLy8ge1xuICAgICAgICAgICAgLy8gICAgIGxhYmVsOiBcIkV4dHJhY3QgdG8uLi5cIixcbiAgICAgICAgICAgIC8vICAgICBpY29uOiBcImZvbGRlcl96aXBcIixcbiAgICAgICAgICAgIC8vICAgICBzaG9ydGN1dExhYmVsOiBcIkN0cmwrQVwiLFxuICAgICAgICAgICAgLy8gICAgIGlzRGlzYWJsZWQ6IChkYXRhKSA9PiAhKGRhdGEua2luZCA9PSBcImZpbGVcIiAmJiBkYXRhLmV4dCAhPSBcIi56aXBcIiAmJiBpc0FyY2hpdmUoZGF0YSkpLFxuICAgICAgICAgICAgLy8gICAgIGFjdGlvbjogKGV2dCkgPT4ge1xuICAgICAgICAgICAgLy8gICAgICAgICAvLyBUT0RPXG4gICAgICAgICAgICAvLyAgICAgfSxcbiAgICAgICAgICAgIC8vIH0sXG4gICAgICAgICAgICAvLyB7XG4gICAgICAgICAgICAvLyAgICAgbGFiZWw6IFwiQ29tcHJlc3MuLi5cIixcbiAgICAgICAgICAgIC8vICAgICBpY29uOiBcImZvbGRlcl96aXBcIixcbiAgICAgICAgICAgIC8vICAgICBzaG9ydGN1dExhYmVsOiBcIkN0cmwrQVwiLFxuICAgICAgICAgICAgLy8gICAgIGlzRGlzYWJsZWQ6IChkYXRhKSA9PiBkYXRhLmtpbmQgPT0gXCJmaWxlXCIsXG4gICAgICAgICAgICAvLyAgICAgYWN0aW9uOiAoZXZ0KSA9PiB7XG4gICAgICAgICAgICAvLyAgICAgICAgIC8vIFRPRE9cbiAgICAgICAgICAgIC8vICAgICB9LFxuICAgICAgICAgICAgLy8gfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsYWJlbDogXCJDaGVja3N1bVwiLFxuICAgICAgICAgICAgICAgIGljb246IFwibWFuYWdlX3NlYXJjaFwiLFxuICAgICAgICAgICAgICAgIGlzRGlzYWJsZWQ6IChkYXRhKSA9PiBkYXRhLmtpbmQgIT0gXCJmaWxlXCIsXG4gICAgICAgICAgICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IFwiTUQ1XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb246IChldnQpID0+IHRoaXMucGVyZm9ybUNoZWNrc3VtKGV2dC5wYXRoICsgZXZ0Lm5hbWUsIFwibWQ1XCIpLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogXCJTSEExXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb246IChldnQpID0+IHRoaXMucGVyZm9ybUNoZWNrc3VtKGV2dC5wYXRoICsgZXZ0Lm5hbWUsIFwic2hhMVwiKSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IFwiU0hBMjU2XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb246IChldnQpID0+IHRoaXMucGVyZm9ybUNoZWNrc3VtKGV2dC5wYXRoICsgZXZ0Lm5hbWUsIFwic2hhMjU2XCIpLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogXCJTSEE1MTJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjogKGV2dCkgPT4gdGhpcy5wZXJmb3JtQ2hlY2tzdW0oZXZ0LnBhdGggKyBldnQubmFtZSwgXCJzaGE1MTJcIiksXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICBpc1Zpc2libGU6IChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICF0aGlzLmlzQXJjaGl2ZSB8fCBkYXRhLmtpbmQgPT0gXCJmaWxlXCI7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAvLyB7XG4gICAgICAgICAgICAvLyAgICAgbGFiZWw6IFwiU3RhclwiLFxuICAgICAgICAgICAgLy8gICAgIGljb246IFwic3RhclwiLFxuICAgICAgICAgICAgLy8gICAgIHNob3J0Y3V0TGFiZWw6IFwiQ3RybCtBXCIsXG4gICAgICAgICAgICAvLyAgICAgYWN0aW9uOiAoZXZ0KSA9PiB7XG5cbiAgICAgICAgICAgIC8vICAgICB9LFxuICAgICAgICAgICAgLy8gfSxcbiAgICAgICAgICAgIC8vIFwic2VwYXJhdG9yXCIsXG4gICAgICAgICAgICAvLyB7XG4gICAgICAgICAgICAvLyAgICAgbGFiZWw6IFwiUF9yX29wZXJ0aWVzXCIsXG4gICAgICAgICAgICAvLyAgICAgaWNvbjogXCJmaW5kX2luX3BhZ2VcIixcbiAgICAgICAgICAgIC8vICAgICBhY3Rpb246IChldnQpID0+IHtcblxuICAgICAgICAgICAgLy8gICAgIH0sXG4gICAgICAgICAgICAvLyB9XG4gICAgICAgIF07XG4gICAgfVxuXG4gICAgYXN5bmMgbG9hZEZvbGRlcigpIHtcbiAgICAgICAgdGhpcy5zaG93TG9hZGVyID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5oaWRlTG9hZGVyID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZmFpbGVkTG9hZCA9IGZhbHNlO1xuXG4gICAgICAgIGNvbnN0IHVybCA9IHRoaXMuY29uZmlnLmFwaVNldHRpbmdzLmxpc3RFbnRyaWVzVXJsVGVtcGxhdGVcbiAgICAgICAgICAgID8gdGhpcy5jb25maWcuYXBpU2V0dGluZ3MubGlzdEVudHJpZXNVcmxUZW1wbGF0ZSh0aGlzLnBhdGgpXG4gICAgICAgICAgICA6IHRoaXMuY29uZmlnLmFwaVNldHRpbmdzLmxpc3RFbnRyaWVzVXJsO1xuXG4gICAgICAgIHRoaXMuZmV0Y2gucG9zdCh1cmwsIHsgcGF0aDogdGhpcy5wYXRoLCBzaG93SGlkZGVuOiB0aGlzLnNob3dIaWRkZW5GaWxlcyB9LCB7fSwgdHJ1ZSlcbiAgICAgICAgICAgIC50aGVuKChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWxlczogRmlsZURlc2NyaXB0b3JbXSA9IGRhdGE/LmZpbGVzIHx8IFtdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRpcnM6IERpcmVjdG9yeURlc2NyaXB0b3JbXSA9IGRhdGE/LmRpcnMgfHwgW107XG4gICAgICAgICAgICAgICAgY29uc3QgZGVzY3JpcHRvcnMgPSBmaWxlcy5jb25jYXQoZGlycyBhcyBhbnkpIGFzIEZTRGVzY3JpcHRvcltdO1xuXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRvcnMuZm9yRWFjaChmID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZlsnX2ljb24nXSA9IHRoaXMuaWNvblJlc29sdmVyLnJlc29sdmVJY29uKGYpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZi5raW5kID09IFwiZmlsZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmWydfY3RpbWUnXSA9IG5ldyBEYXRlKGYuc3RhdHM/LmN0aW1lTXMpPy50b0xvY2FsZVN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZlsnX210aW1lJ10gPSBuZXcgRGF0ZShmLnN0YXRzPy5tdGltZU1zKT8udG9Mb2NhbGVTdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZbJ19zaXplJ10gPSB0aGlzLmJ5dGVzVG9TdHJpbmcoZi5zdGF0cz8uc2l6ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIHRoaXMuZGlyZWN0b3J5Q29udGVudHMgPSBkZXNjcmlwdG9ycztcblxuICAgICAgICAgICAgICAgIHRoaXMuX3NvcnRGaWx0ZXIoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlc2l6ZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZEZpbGVzLm5leHQoZGVzY3JpcHRvcnMpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc29ydGVkRm9sZGVycy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZsb3dSb3dzKCk7XG5cbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMucmVzaXplKCksIDI1MCk7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnJlc2l6ZSgpLCA1MDApO1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5yZXNpemUoKSwgMTAwMCk7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnJlc2l6ZSgpLCAyNTAwKTtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMucmVzaXplKCksIDUwMDApO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaChlID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmZhaWxlZExvYWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuZXJyb3IgPSBlO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuaGlkZUxvYWRlciA9IHRydWU7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2hvd0xvYWRlciA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH0sIDIwMCk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBmbG93Um93cygpIHtcbiAgICAgICAgbGV0IGZpbHRlcmVkID0gdGhpcy5fc29ydEZpbHRlcigpO1xuXG4gICAgICAgIHRoaXMuc29ydGVkRm9sZGVycyA9IFtdO1xuICAgICAgICBjb25zdCBudW0gPSBNYXRoLmNlaWwoZmlsdGVyZWQubGVuZ3RoIC8gdGhpcy5pdGVtc1BlclJvdyk7XG4gICAgICAgIGNvbnN0IGl0ZXJhdGlvbnMgPSBNYXRoLm1pbihudW0sIDEwMCk7XG5cbiAgICAgICAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgaXRlcmF0aW9uczsgcm93KyspIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5zb3J0ZWRGb2xkZXJzW3Jvd10pXG4gICAgICAgICAgICAgICAgdGhpcy5zb3J0ZWRGb2xkZXJzW3Jvd10gPSBbXTtcblxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IHJvdyAqIHRoaXMuaXRlbXNQZXJSb3c7IGkgPCAocm93ICsgMSkgKiB0aGlzLml0ZW1zUGVyUm93ICYmIGkgPCBmaWx0ZXJlZC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHRoaXMuc29ydGVkRm9sZGVyc1tyb3ddLnB1c2goZmlsdGVyZWRbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25TZWxlY3QoaXRlbTogRlNEZXNjcmlwdG9yLCBldnQpIHtcbiAgICAgICAgZXZ0LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgICAgIGlmICh0aGlzLmtleWJvYXJkLmlzU2hpZnRQcmVzc2VkKSB7XG4gICAgICAgICAgICBsZXQgc3RhcnQgPSB0aGlzLmRpcmVjdG9yeUNvbnRlbnRzLmZpbmRJbmRleChpID0+IGkubmFtZSA9PSB0aGlzLnNlbGVjdGlvbi5zbGljZSgtMSwgMSlbMF0ubmFtZSk7XG4gICAgICAgICAgICBsZXQgZW5kID0gdGhpcy5kaXJlY3RvcnlDb250ZW50cy5pbmRleE9mKGl0ZW0pO1xuXG4gICAgICAgICAgICBpZiAoc3RhcnQgPT0gLTEpXG4gICAgICAgICAgICAgICAgc3RhcnQgPSBlbmQ7XG5cbiAgICAgICAgICAgIGxldCBpdGVtcyA9IHN0YXJ0ID4gZW5kXG4gICAgICAgICAgICAgICAgPyB0aGlzLmRpcmVjdG9yeUNvbnRlbnRzLnNsaWNlKGVuZCwgc3RhcnQgKyAxKVxuICAgICAgICAgICAgICAgIDogdGhpcy5kaXJlY3RvcnlDb250ZW50cy5zbGljZShzdGFydCwgZW5kICsgMSk7XG5cbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uID0gaXRlbXM7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5rZXlib2FyZC5pc0N0cmxQcmVzc2VkKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuc2VsZWN0aW9uLmluY2x1ZGVzKGl0ZW0pKVxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnB1c2goaXRlbSk7XG4gICAgICAgICAgICBlbHNlIC8vIENhc2UgdGhhdCB3ZSBzZWxlY3RlZCB0aGUgc2FtZSBpdGVtIHR3aWNlXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24uc3BsaWNlKHRoaXMuc2VsZWN0aW9uLmluZGV4T2YoaXRlbSksIDEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uID0gW2l0ZW1dO1xuXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbi5sZW5ndGggPT0gMSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uWzBdLmtpbmQgPT0gXCJkaXJlY3RvcnlcIilcbiAgICAgICAgICAgICAgICB0aGlzLmZvbGRlclNlbGVjdC5uZXh0KHRoaXMuc2VsZWN0aW9uWzBdKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICB0aGlzLmZpbGVTZWxlY3QubmV4dCh0aGlzLnNlbGVjdGlvblswXSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZS5uZXh0KHRoaXMuc2VsZWN0aW9uKTtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25UZXh0ID0gdGhpcy5nZXRTZWxlY3Rpb25UZXh0KCk7XG4gICAgfVxuXG4gICAgb25JdGVtQ2xpY2soZmlsZTogRlNEZXNjcmlwdG9yKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGZpbGUsIHRoaXMpO1xuICAgICAgICBpZiAoZmlsZS5raW5kID09IFwiZGlyZWN0b3J5XCIpIHtcbiAgICAgICAgICAgIHRoaXMuZm9sZGVyRGJsQ2xpY2submV4dChmaWxlKTtcbiAgICAgICAgICAgIHRoaXMucGF0aCA9IGZpbGUucGF0aCArIGZpbGUubmFtZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBlbHNlIGlmIChmaWxlLmV4dCA9PSBcInppcFwiKSB7XG4gICAgICAgIC8vICAgICB0aGlzLmZpbGVEYmxDbGljay5uZXh0KGZpbGUpO1xuICAgICAgICAvLyAgICAgdGhpcy5wYXRoID0gZmlsZS5wYXRoICsgZmlsZS5uYW1lO1xuICAgICAgICAvLyB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5maWxlRGJsQ2xpY2submV4dChmaWxlKTtcbiAgICAgICAgICAgIHRoaXMuZmlsZVNlbGVjdC5uZXh0KGZpbGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25Ub2dnbGUoaXRlbSwgc3RhdGU6IE1hdENoZWNrYm94Q2hhbmdlKSB7XG4gICAgICAgIGl0ZW1bJ192YWx1ZSddID0gc3RhdGUuY2hlY2tlZDtcblxuICAgICAgICAvLyBUT0RPOiBXaGF0IGNhdXNlcyB0aGlzIHRvIGJlIG51bGwgd2hlbiBpbml0aWFsaXplZCB3aXRoIGFuIGFycmF5P1xuICAgICAgICBpZiAoIXRoaXMudmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzdGF0ZS5jaGVja2VkKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlLnB1c2goaXRlbSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBpID0gdGhpcy52YWx1ZS5maW5kSW5kZXgodiA9PiB2ID09IGl0ZW0pO1xuICAgICAgICAgICAgaWYgKGkgPj0gMClcbiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlLnNwbGljZShpLCAxKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZhbHVlQ2hhbmdlLm5leHQodGhpcy52YWx1ZSk7XG4gICAgfVxuXG4gICAgYXN5bmMgY2xlYXJTZWxlY3Rpb24oKSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSBbXTtcbiAgICAgICAgdGhpcy52YWx1ZUNoYW5nZS5uZXh0KHRoaXMudmFsdWUpO1xuXG4gICAgICAgIHRoaXMudGFidWxhdG9yPy50YWJsZT8uZ2V0Um93cygpLmZvckVhY2gociA9PiByLmdldEVsZW1lbnQoKS5jbGFzc0xpc3QucmVtb3ZlKCdzZWxlY3RlZCcpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9zb3J0RmlsdGVyKCk6IEZpbGVEZXNjcmlwdG9yW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5kaXJlY3RvcnlDb250ZW50cyA9IHRoaXMuZGlyZWN0b3J5Q29udGVudHM/LmZpbHRlcihkID0+IGQua2luZCA9PSAnZGlyZWN0b3J5JylcbiAgICAgICAgICAgIC5jb25jYXQodGhpcy5kaXJlY3RvcnlDb250ZW50cz8uZmlsdGVyKGQgPT4gZC5raW5kID09ICdmaWxlJylcbiAgICAgICAgICAgICAgICAuc29ydCh0aGlzLnNvcnRlcnNbdGhpcy5zb3J0T3JkZXJdKVxuICAgICAgICAgICAgKSBhcyBGaWxlRGVzY3JpcHRvcltdO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0U2VsZWN0aW9uVGV4dCgpIHtcbiAgICAgICAgY29uc3QgZGlyQ291bnQgPSB0aGlzLnNlbGVjdGlvbi5maWx0ZXIocyA9PiBzLmtpbmQgPT0gXCJkaXJlY3RvcnlcIikubGVuZ3RoO1xuICAgICAgICBjb25zdCBmaWxlQ291bnQgPSB0aGlzLnNlbGVjdGlvbi5maWx0ZXIocyA9PiBzLmtpbmQgPT0gXCJmaWxlXCIpLmxlbmd0aDtcblxuICAgICAgICBpZiAoZGlyQ291bnQgKyBmaWxlQ291bnQgPT0gMCkgcmV0dXJuIFwiXCI7XG5cbiAgICAgICAgY29uc3QgdG90YWxTaXplID1cbiAgICAgICAgICAgIHRoaXMuZGlyZWN0b3J5Q29udGVudHNcbiAgICAgICAgICAgICAgICAuZmlsdGVyKGQgPT4gZC5raW5kID09IFwiZmlsZVwiKVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoZCA9PiB0aGlzLnNlbGVjdGlvbj8uZmluZChpID0+IGkubmFtZSA9PSBkLm5hbWUpKVxuICAgICAgICAgICAgICAgIC5tYXAoZCA9PiBkWydzdGF0cyddLnNpemUpLnJlZHVjZSgoYSwgYikgPT4gYSArIGIsIDApO1xuXG4gICAgICAgIGlmIChkaXJDb3VudCArIGZpbGVDb3VudCA9PSAxKVxuICAgICAgICAgICAgcmV0dXJuIGBcIiR7dGhpcy5zZWxlY3Rpb25bMF0ubmFtZX1cIiBzZWxlY3RlZCAoJHt0aGlzLmJ5dGVzVG9TdHJpbmcodG90YWxTaXplKX0pYDtcblxuICAgICAgICBpZiAoZGlyQ291bnQgPiAwICYmIGZpbGVDb3VudCA9PSAwKVxuICAgICAgICAgICAgcmV0dXJuIGBcIiR7ZGlyQ291bnR9XCIgZm9sZGVycyBzZWxlY3RlZGA7XG4gICAgICAgIGlmIChmaWxlQ291bnQgPiAwICYmIGRpckNvdW50ID09IDApXG4gICAgICAgICAgICByZXR1cm4gYCR7ZmlsZUNvdW50fSBpdGVtcyBzZWxlY3RlZCAoJHt0aGlzLmJ5dGVzVG9TdHJpbmcodG90YWxTaXplKX0pYDtcblxuICAgICAgICByZXR1cm4gYCR7ZGlyQ291bnR9IGZvbGRlciR7ZGlyQ291bnQgPT0gMSA/IFwiXCIgOiBcInNcIn0gc2VsZWN0ZWQsICR7ZmlsZUNvdW50fSBvdGhlciBpdGVtJHtmaWxlQ291bnQgPT0gMSA/IFwiXCIgOiBcInNcIn0gc2VsZWN0ZWQgKCR7dGhpcy5ieXRlc1RvU3RyaW5nKHRvdGFsU2l6ZSl9KWA7XG4gICAgfVxuXG4gICAgYnl0ZXNUb1N0cmluZyhieXRlczogbnVtYmVyLCBkZWNpbWFscyA9IDIpIHtcbiAgICAgICAgaWYgKCErYnl0ZXMpIHJldHVybiAnMCBCeXRlcyc7XG5cbiAgICAgICAgY29uc3QgayA9IDEwMjQ7XG4gICAgICAgIGNvbnN0IGRtID0gZGVjaW1hbHMgPCAwID8gMCA6IGRlY2ltYWxzO1xuICAgICAgICBjb25zdCBzaXplcyA9IFsnQnl0ZXMnLCAnS0InLCAnTUInLCAnR0InLCAnVEInLCAnUEInLCAnRUInLCAnWkInLCAnWUInXTtcblxuICAgICAgICBjb25zdCBpID0gTWF0aC5mbG9vcihNYXRoLmxvZyhieXRlcykgLyBNYXRoLmxvZyhrKSk7XG5cbiAgICAgICAgcmV0dXJuIGAke3BhcnNlRmxvYXQoKGJ5dGVzIC8gTWF0aC5wb3coaywgaSkpLnRvRml4ZWQoZG0pKX0gJHtzaXplc1tpXX1gO1xuICAgIH1cblxuICAgIHJlc2l6ZSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmZpbGVzUmVmKSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMucmVzaXplKCksIDI1KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBib3VuZHMgPSAodGhpcy5maWxlc1JlZi5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50KS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgICAgICBjb25zdCBuZXdDb2xDb3VudCA9IE1hdGguZmxvb3IoYm91bmRzLndpZHRoIC8gaXRlbVdpZHRoKTtcbiAgICAgICAgaWYgKG5ld0NvbENvdW50ICE9IHRoaXMuaXRlbXNQZXJSb3cpIHtcbiAgICAgICAgICAgIHRoaXMuaXRlbXNQZXJSb3cgPSBNYXRoLmZsb29yKGJvdW5kcy53aWR0aCAvIGl0ZW1XaWR0aCk7XG4gICAgICAgICAgICBpZiAodGhpcy5pdGVtc1BlclJvdyA+IDEwMClcbiAgICAgICAgICAgICAgICB0aGlzLml0ZW1zUGVyUm93ID0gMTtcblxuICAgICAgICAgICAgdGhpcy5mbG93Um93cygpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuc29ydGVkRm9sZGVycz8ubGVuZ3RoID09IDApXG4gICAgICAgICAgICB0aGlzLmZsb3dSb3dzKCk7XG4gICAgfVxuXG4gICAgb25EcmFnU3RhcnQoZXZ0OiBEcmFnRXZlbnQsIGl0ZW06IEZTRGVzY3JpcHRvcikge1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBgJHt3aW5kb3cub3JpZ2lufS9hcGkvZmlsZXN5c3RlbS9kb3dubG9hZD9kaXI9JHtpdGVtLnBhdGh9JmZpbGU9JHtpdGVtLm5hbWV9YDtcblxuICAgICAgICBldnQuZGF0YVRyYW5zZmVyLmNsZWFyRGF0YSgpO1xuICAgICAgICAvLyBldnQuZGF0YVRyYW5zZmVyLnNldERhdGEoJ3RleHQvdXJpLWxpc3QnLCB0YXJnZXQpO1xuICAgICAgICAvLyBldnQuZGF0YVRyYW5zZmVyLnNldERhdGEoJ0Rvd25sb2FkVVJMJywgYHRleHQvdXJpLWxpc3Q6JHt0YXJnZXR9YCk7XG4gICAgICAgIGV2dC5kYXRhVHJhbnNmZXIuc2V0RGF0YSgndGV4dC9wbGFpbicsIGl0ZW0ubmFtZSk7XG4gICAgfVxuXG4gICAgb25Ecm9wKGV2KSB7XG4gICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgaWYgKGV2LmRhdGFUcmFuc2Zlci5pdGVtcykge1xuICAgICAgICAgICAgLy8gVXNlIERhdGFUcmFuc2Zlckl0ZW1MaXN0IGludGVyZmFjZSB0byBhY2Nlc3MgdGhlIGZpbGUocylcbiAgICAgICAgICAgIFsuLi5ldi5kYXRhVHJhbnNmZXIuaXRlbXNdLmZvckVhY2goKGl0ZW0sIGkpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBJZiBkcm9wcGVkIGl0ZW1zIGFyZW4ndCBmaWxlcywgcmVqZWN0IHRoZW1cbiAgICAgICAgICAgICAgICBpZiAoaXRlbS5raW5kID09PSBcImZpbGVcIikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmaWxlID0gaXRlbS5nZXRBc0ZpbGUoKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYOKApiBmaWxlWyR7aX1dLm5hbWUgPSAke2ZpbGUubmFtZX1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFVzZSBEYXRhVHJhbnNmZXIgaW50ZXJmYWNlIHRvIGFjY2VzcyB0aGUgZmlsZShzKVxuICAgICAgICAgICAgWy4uLmV2LmRhdGFUcmFuc2Zlci5maWxlc10uZm9yRWFjaCgoZmlsZSwgaSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGDigKYgZmlsZVske2l9XS5uYW1lID0gJHtmaWxlLm5hbWV9YCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG5hbWVDZWxsRm9ybWF0dGVyID0gKChjZWxsOiBDZWxsQ29tcG9uZW50LCBmb3JtYXR0ZXJQYXJhbXM6IHt9LCBvblJlbmRlcmVkOiBFbXB0eUNhbGxiYWNrKSA9PiB7XG4gICAgICAgIC8vIFRPRE86IFNhbml0aXplP1xuICAgICAgICBjb25zdCBpdGVtID0gY2VsbC5nZXREYXRhKCkgYXMgRlNEZXNjcmlwdG9yO1xuICAgICAgICByZXR1cm4gYFxuICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgPGltZyBzdHlsZT1cImhlaWdodDogMjRweDsgbWFyZ2luLXJpZ2h0OiA2cHhcIiBzcmM9XCIke2l0ZW1bJ19pY29uJ10ucGF0aH1cIi8+XG4gICAgICAgICAgICAgICAgPHAgc3R5bGU9XCJtYXJnaW46IDBcIj4ke3RoaXMuc2FuaXRpemVyLnNhbml0aXplKFNlY3VyaXR5Q29udGV4dC5IVE1MLCBpdGVtWyd2YW5pdHlOYW1lJ10gfHwgaXRlbS5uYW1lKX08L3A+XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIGA7XG4gICAgfSkuYmluZCh0aGlzKTtcblxuICAgIG9uUm93Q3R4KFtldmVudCwgcm93XSA9IFtdKSB7XG4gICAgICAgIG9wZW5NZW51KHRoaXMubWF0RGlhbG9nLCB0aGlzLmZpbGVDb250ZXh0TWVudSwgcm93LmdldERhdGEoKSwgZXZlbnQpO1xuICAgIH1cblxuICAgIG9uUm93Q2xpY2socm93KSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSByb3cuZ2V0RGF0YSgpO1xuICAgICAgICAvLyAkZXZlbnQuZGF0YVsnX3ZhbHVlJ10gPSAkZXZlbnQuZGF0YVsnX3ZhbHVlJ10gPT0gdHJ1ZSA/IGZhbHNlIDogdHJ1ZVxuICAgICAgICAvLyBjb25zb2xlLmxvZyhldmVudCwgcm93LCBkYXRhLCB0aGlzLnZhbHVlKTtcblxuICAgICAgICBjb25zdCByb3dFbCA9IHJvdy5nZXRFbGVtZW50KCk7XG4gICAgICAgIGxldCBzdGF0ZSA9IHJvd0VsLmNsYXNzTGlzdC5jb250YWlucygnc2VsZWN0ZWQnKTtcbiAgICAgICAgZGF0YVsnX3ZhbHVlJ10gPSAhc3RhdGU7XG5cbiAgICAgICAgaWYgKCF0aGlzLnZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gW107XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXN0YXRlKSB7XG4gICAgICAgICAgICByb3dFbC5jbGFzc0xpc3QuYWRkKCdzZWxlY3RlZCcpO1xuICAgICAgICAgICAgdGhpcy52YWx1ZS5wdXNoKGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcm93RWwuY2xhc3NMaXN0LnJlbW92ZSgnc2VsZWN0ZWQnKTtcbiAgICAgICAgICAgIGNvbnN0IGkgPSB0aGlzLnZhbHVlLmZpbmRJbmRleCh2ID0+IHYgPT0gZGF0YSk7XG4gICAgICAgICAgICBpZiAoaSA+PSAwKVxuICAgICAgICAgICAgICAgIHRoaXMudmFsdWUuc3BsaWNlKGksIDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy52YWx1ZUNoYW5nZS5uZXh0KHRoaXMudmFsdWUpO1xuICAgIH1cblxuICAgIHNvcnQoKSB7XG4gICAgICAgIHRoaXMuX3NvcnRGaWx0ZXIoKTtcbiAgICB9XG5cbiAgICBvblVwbG9hZEZpbGUoZXZ0PzogRlNEZXNjcmlwdG9yKSB7XG4gICAgICAgIHVwbG9hZEZpbGUoXG4gICAgICAgICAgICB0aGlzLmZldGNoLFxuICAgICAgICAgICAgdGhpcy5jb25maWcsXG4gICAgICAgICAgICB0aGlzLl9wYXRoLFxuICAgICAgICAgICAgZXZ0ID8gKGV2dC5wYXRoICsgZXZ0Lm5hbWUpIDogbnVsbCxcbiAgICAgICAgICAgIHRoaXMuZmlsZU1hbmFnZXIuY29udGV4dFRhZ3NcbiAgICAgICAgKVxuICAgICAgICAgICAgLnRoZW4ocmVzID0+IHtcbiAgICAgICAgICAgICAgICAvLyBSZWZyZXNoIGZvbGRlciBjb250ZW50c1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZEZvbGRlcigpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgb25DcmVhdGVGb2xkZXIoZGF0YT86IEZTRGVzY3JpcHRvcikge1xuICAgICAgICB0aGlzLmRpYWxvZy5vcGVuKFwiZm9sZGVyLXJlbmFtZVwiLCBcIkBkb3RnbGl0Y2gvbmd4LXdlYi1jb21wb25lbnRzXCIsIHtcbiAgICAgICAgICAgIGlucHV0czogeyBwYXRoOiBkYXRhPy5wYXRoIHx8IHRoaXMucGF0aCwgbmFtZTogZGF0YT8ubmFtZSB8fCAnJywgY29uZmlnOiB0aGlzLmNvbmZpZyB9XG4gICAgICAgIH0pLnRoZW4ociA9PiB0aGlzLmxvYWRGb2xkZXIoKSk7XG4gICAgfVxufVxuXG4iLCJAaWYgKHNob3dMb2FkZXIpIHtcbjxtYXQtcHJvZ3Jlc3MtYmFyIFtjbGFzcy5oaWRlXT1cImhpZGVMb2FkZXJcIiBtb2RlPVwicXVlcnlcIiAvPlxufVxuXG48ZGl2IHN0eWxlPVwiZGlzcGxheTogY29udGVudHNcIlxuICAgIFtzdHlsZS4tLWZpbGVtYW5hZ2VyLWZpbGVpY29uLWJhY2tkcm9wXT1cIid1cmwoJyArIGljb25SZXNvbHZlci5wYXRoICsgJy9wb3AvZ2VuZXJpYy5zdmcpJ1wiXG4gICAgKGRyYWdzdGFydCk9XCJ1c2VySXNEcmFnZ2luZ0ZpbGUgPSB0cnVlXCIgKGRyYWdlbmQpPVwidXNlcklzRHJhZ2dpbmdGaWxlID0gZmFsc2VcIiAoZHJhZ292ZXIpPVwiZHJhZ2dpbmdPdmVyID0gdHJ1ZVwiXG4gICAgKGRyYWdsZWF2ZSk9XCJkcmFnZ2luZ092ZXIgPSBmYWxzZVwiIChvbmRyb3ApPVwib25Ecm9wKCRldmVudClcIj5cblxuICAgIEBpZiAoZmFpbGVkTG9hZCkge1xuICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsgaGVpZ2h0OiAxMDAlXCI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICAgIHN0eWxlPVwibWF4LXdpZHRoOiA0MDBweDsgZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgYWxpZ24taXRlbXM6IGNlbnRlcjsganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XCI+XG4gICAgICAgICAgICA8IS0tIFVwbG9hZGVkIHRvOiBTVkcgUmVwbywgd3d3LnN2Z3JlcG8uY29tLCBHZW5lcmF0b3I6IFNWRyBSZXBvIE1peGVyIFRvb2xzIC0tPlxuICAgICAgICAgICAgPHN2ZyBmaWxsPVwidmFyKC0tdGV4dC1jb2xvcilcIiB3aWR0aD1cIjIwMHB4XCIgdmlld0JveD1cIjAgMCA2MDAuNTI1IDYwMC41MjVcIj5cbiAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICBkPVwiTTU3LjM3NSwxMzguNjU2TDQzLjAzMSw5NS4xNDZjLTIzLjQyOCw4LjEyOC00MC4xNjIsMjkuMTY2LTQyLjU1Myw1NC4wMjhsNDUuOSwzLjgyNUM0Ni44NTYsMTQ2LjMwNiw1MS4xNiwxNDAuNTY4LDU3LjM3NSwxMzguNjU2elwiIC8+XG4gICAgICAgICAgICAgICAgPHJlY3QgeT1cIjI4OC4zMDlcIiB3aWR0aD1cIjQ1LjlcIiBoZWlnaHQ9XCI0NS45MDFcIiAvPlxuICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgIGQ9XCJNNTU0LjYyNSw0NDYuMDkxYzAsMy4zNDYtMC45NTYsNi4yMTUtMi44NjgsOS4wODRsMzguMjUsMjUuMzRjNi42OTMtMTAuMDM5LDEwLjA0LTIxLjk5MiwxMC4wNC0zNC40MjRWNDIzLjE0aC00NS44OTl2MjIuOTUxSDU1NC42MjV6XCIgLz5cbiAgICAgICAgICAgICAgICA8cmVjdCB4PVwiNDU2LjYwOVwiIHk9XCIxNDYuMzA2XCIgd2lkdGg9XCI0NS45XCIgaGVpZ2h0PVwiNDUuOVwiIC8+XG4gICAgICAgICAgICAgICAgPHJlY3QgeD1cIjQ4NS4yOTdcIiB5PVwiNDYyLjgyNVwiIHdpZHRoPVwiNDUuOVwiIGhlaWdodD1cIjQ1LjlcIiAvPlxuICAgICAgICAgICAgICAgIDxyZWN0IHg9XCIzOTMuNDk3XCIgeT1cIjQ2Mi44MjVcIiB3aWR0aD1cIjQ1LjlcIiBoZWlnaHQ9XCI0NS45XCIgLz5cbiAgICAgICAgICAgICAgICA8cmVjdCB4PVwiMzY0LjgxXCIgeT1cIjE0Ni4zMDZcIiB3aWR0aD1cIjQ1LjlcIiBoZWlnaHQ9XCI0NS45XCIgLz5cbiAgICAgICAgICAgICAgICA8cmVjdCB4PVwiMTE4LjA5N1wiIHk9XCI0NjIuODI1XCIgd2lkdGg9XCI0NS45XCIgaGVpZ2h0PVwiNDUuOVwiIC8+XG4gICAgICAgICAgICAgICAgPHJlY3QgeT1cIjM4MC4xMDhcIiB3aWR0aD1cIjQ1LjlcIiBoZWlnaHQ9XCI0NS45XCIgLz5cbiAgICAgICAgICAgICAgICA8cmVjdCB5PVwiMTk2LjUwOVwiIHdpZHRoPVwiNDUuOVwiIGhlaWdodD1cIjQ1LjlcIiAvPlxuICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgIGQ9XCJNMzMwLjM4NSwxNDMuNDM3Yy0yLjM5MS0xLjQzNC0zLjgyNS0yLjM5MS00LjMwNC0yLjg2OWwtMjguMjA5LTI5LjE2NmMtMS45MTMtMS45MTMtNC4zMDMtMy44MjUtNi42OTQtNS43MzdsLTI3LjI1MywzNi44MTVjMC40NzgsMC40NzgsMC45NTYsMC45NTYsMC45NTYsMC45NTZzMzcuNzcyLDM0LjQyNSw0NC40NjUsNDEuMTE5TDMzMC4zODUsMTQzLjQzN3pcIiAvPlxuICAgICAgICAgICAgICAgIDxyZWN0IHg9XCI1NTQuNjI1XCIgeT1cIjIzOS41NDFcIiB3aWR0aD1cIjQ1LjlcIiBoZWlnaHQ9XCI0NS45XCIgLz5cbiAgICAgICAgICAgICAgICA8cmVjdCB4PVwiMzAxLjY5N1wiIHk9XCI0NjIuODI1XCIgd2lkdGg9XCI0NS44OTlcIiBoZWlnaHQ9XCI0NS45XCIgLz5cbiAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICBkPVwiTTU1OS44ODUsMTQ2LjMwNmgtMTAuOTk3djQ3LjgxMmg1LjczN2g0NS45di03LjE3MkM2MDAuNTI1LDE2NC40NzUsNTgyLjM1NiwxNDYuMzA2LDU1OS44ODUsMTQ2LjMwNnpcIiAvPlxuICAgICAgICAgICAgICAgIDxyZWN0IHg9XCIxODcuNDI1XCIgeT1cIjkxLjhcIiB3aWR0aD1cIjQ1LjlcIiBoZWlnaHQ9XCI0NS45XCIgLz5cbiAgICAgICAgICAgICAgICA8cmVjdCB4PVwiNTU0LjYyNVwiIHk9XCIzMzEuMzQxXCIgd2lkdGg9XCI0NS45XCIgaGVpZ2h0PVwiNDUuOVwiIC8+XG4gICAgICAgICAgICAgICAgPHJlY3QgeD1cIjk1LjYyNVwiIHk9XCI5MS44XCIgd2lkdGg9XCI0NS45XCIgaGVpZ2h0PVwiNDUuOVwiIC8+XG4gICAgICAgICAgICAgICAgPHJlY3QgeD1cIjIwOS44OTdcIiB5PVwiNDYyLjgyNVwiIHdpZHRoPVwiNDUuOVwiIGhlaWdodD1cIjQ1LjlcIiAvPlxuICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgIGQ9XCJNNDkuMjQ3LDQ1Ni4xMzJsLTM2LjMzNywyNy43M2MxMS45NTMsMTUuNzc3LDMwLjEyMiwyNC44NjMsNDkuNzI1LDI0Ljg2M2g5LjU2MnYtNDUuOWgtOS41NjJDNTcuMzc1LDQ2Mi44MjUsNTIuNTk0LDQ2MC40MzUsNDkuMjQ3LDQ1Ni4xMzJ6XCIgLz5cbiAgICAgICAgICAgIDwvc3ZnPlxuXG4gICAgICAgICAgICA8aDM+U29ycnkgYWJvdXQgdGhhdC48L2gzPlxuICAgICAgICAgICAgPHA+XG4gICAgICAgICAgICAgICAgT3VyIHNlcnZlcnMgYXJlbid0IGRvaW5nIHRoZWlyIHRoaW5nIHJpZ2h0IG5vdy5cbiAgICAgICAgICAgICAgICBZb3UgY2FuIHRyeSBhZ2FpbiBsYXRlciBvciBjb250YWN0IGFuIGFkbWluaXN0cmF0b3IgYWJvdXQgdGhpcy5cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgIDxociBzdHlsZT1cIndpZHRoOiAxMDAlOyBvcGFjaXR5OiAuNTtcIiAvPlxuICAgICAgICAgICAgPHA+XG4gICAgICAgICAgICAgICAgRXJyb3I6XG4gICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tbWF0LXRhYi1oZWFkZXItYWN0aXZlLWZvY3VzLWxhYmVsLXRleHQtY29sb3IpXCI+e3tlcnJvci5zdGF0dXN9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8YnIgLz5cbiAgICAgICAgICAgICAgICBAaWYgKGVycm9yLmVycm9yPy5tZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgTWVzc2FnZToge3tlcnJvci5lcnJvcj8ubWVzc2FnZX19XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9wPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICB9XG4gICAgQGVsc2Uge1xuICAgIDwhLS0gPG5nLWNvbnRhaW5lciAqbmdJZj1cImRyYWdnaW5nT3ZlclwiPjwvbmctY29udGFpbmVyPiAtLT5cbiAgICA8IS0tIEdyaWQgbW9kZSAtLT5cbiAgICBAaWYgKHZpZXdNb2RlID09ICdncmlkJykge1xuICAgIDxuZy1zY3JvbGxiYXIgY2xhc3M9XCJncmlkIGNvbnRlbnQtYXJlYSB7e2dyaWRTaXplfX0ge3tjb25maWcuaW1hZ2VTaXplIHx8ICdub3JtYWwnfX1cIlxuICAgICAgICBbY2xhc3Muc2VsZWN0aW9uTW9kZV09XCJjb25maWcubW9kZSA9PSAnZm9jdXNGaWxlcydcIiBbY2xhc3Muc2hvd0Ryb3BBcmVhXT1cImRyYWdnaW5nT3ZlclwiXG4gICAgICAgIHN0eWxlPVwiaGVpZ2h0OiAxMDAlOyB3aWR0aDogMTAwJVwiIHRyYWNrPVwidmVydGljYWxcIiBwb2ludGVyRXZlbnRzTWV0aG9kPVwic2Nyb2xsYmFyXCJcbiAgICAgICAgW25neC1jb250ZXh0bWVudV09XCJmb2xkZXJDb250ZXh0TWVudVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicmVzaXplLW9ic2VydmVyXCIgI2ZpbGVWaWV3cG9ydD48L2Rpdj5cbiAgICAgICAgPGNkay12aXJ0dWFsLXNjcm9sbC12aWV3cG9ydCBpdGVtU2l6ZT1cIjE1MFwiIHNjcm9sbFZpZXdwb3J0IChjbGljayk9XCJzZWxlY3Rpb24gPSBbXTsgc2VsZWN0aW9uVGV4dCA9ICcnXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCIgKmNka1ZpcnR1YWxGb3I9XCJsZXQgcm93IG9mIHNvcnRlZEZvbGRlcnNcIj5cbiAgICAgICAgICAgICAgICBAZm9yIChpdGVtIG9mIHJvdzsgdHJhY2sgaXRlbSkge1xuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWxlXCIgW2NsYXNzLnNlbGVjdGVkXT1cInNlbGVjdGlvbi5pbmNsdWRlcyhpdGVtKVwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5nZW5lcmljXT1cIml0ZW1bJ19pY29uJ10ubmVlZHNCYWNrZHJvcFwiIFtuZ3gtY29udGV4dG1lbnVdPVwiZmlsZUNvbnRleHRNZW51XCJcbiAgICAgICAgICAgICAgICAgICAgW25neC1tZW51LWNvbnRleHRdPVwiaXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICBAaWYgKGNvbmZpZy5tb2RlID09ICdmb2N1c0ZpbGVzJyAmJiBpdGVtLmtpbmQgPT0gJ2ZpbGUnKSB7XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtY2hlY2tib3ggI2NoZWNrYm94IFtjaGVja2VkXT1cIml0ZW1bJ192YWx1ZSddXCIgKGNoYW5nZSk9XCJvblRvZ2dsZShpdGVtLCAkZXZlbnQpXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogY29udGVudHNcIiAoY2xpY2spPVwib25TZWxlY3QoaXRlbSwgJGV2ZW50KVwiIChkYmxjbGljayk9XCJvbkl0ZW1DbGljayhpdGVtKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoZHJhZ3N0YXJ0KT1cIm9uRHJhZ1N0YXJ0KCRldmVudCwgaXRlbSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgW3NyY109XCJpdGVtWydfaWNvbiddLnBhdGhcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHA+e3tpdGVtWyd2YW5pdHlOYW1lJ10gfHwgaXRlbS5uYW1lfX08L3A+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Nkay12aXJ0dWFsLXNjcm9sbC12aWV3cG9ydD5cbiAgICA8L25nLXNjcm9sbGJhcj5cbiAgICB9XG5cbiAgICA8IS0tIExpc3QgbW9kZSAtLT5cbiAgICBAaWYgKHZpZXdNb2RlID09ICdsaXN0Jykge1xuICAgIDxkaXYgY2xhc3M9XCJjb250ZW50LWFyZWFcIiBzdHlsZT1cIndpZHRoOiAxMDAlOyBoZWlnaHQ6IDEwMCVcIiBbY2xhc3Muc2hvd0Ryb3BBcmVhXT1cImRyYWdnaW5nT3ZlclwiXG4gICAgICAgIFtuZ3gtY29udGV4dG1lbnVdPVwiZm9sZGVyQ29udGV4dE1lbnVcIj5cbiAgICAgICAgPG5neC10YWJ1bGF0b3IgW2RhdGFTb3VyY2VdPVwiZGlyZWN0b3J5Q29udGVudHNcIiAocm93Q2xpY2spPVwib25Sb3dDbGljaygkZXZlbnQ/LlsxXSlcIlxuICAgICAgICAgICAgKHJvd0RibENsaWNrKT1cIm9uSXRlbUNsaWNrKCRhbnkoJGV2ZW50Py5bMV0/LmdldERhdGEoKSkpXCIgKHJvd0NvbnRleHQpPVwib25Sb3dDdHgoJGV2ZW50KVwiPlxuICAgICAgICAgICAgPG5neC10YWJ1bGF0b3ItY29sdW1uIGZpZWxkPVwibmFtZVwiIHRpdGxlPVwiTmFtZVwiIFtmb3JtYXR0ZXJdPVwibmFtZUNlbGxGb3JtYXR0ZXJcIiAvPlxuICAgICAgICAgICAgPG5neC10YWJ1bGF0b3ItY29sdW1uIGZpZWxkPVwiX3NpemVcIiB0aXRsZT1cIlNpemVcIiAvPlxuICAgICAgICAgICAgPG5neC10YWJ1bGF0b3ItY29sdW1uIGZpZWxkPVwiX2N0aW1lXCIgdGl0bGU9XCJDcmVhdGVkXCIgLz5cbiAgICAgICAgICAgIDxuZ3gtdGFidWxhdG9yLWNvbHVtbiBmaWVsZD1cIl9tdGltZVwiIHRpdGxlPVwiTW9kaWZpZWRcIiAvPlxuICAgICAgICA8L25neC10YWJ1bGF0b3I+XG4gICAgPC9kaXY+XG4gICAgfVxuICAgIH1cbjwvZGl2PlxuXG5AaWYgKHNlbGVjdGlvblRleHQ/LnRyaW0oKT8ubGVuZ3RoID4gMCkge1xuPGRpdiBjbGFzcz1cInNlbGVjdC1oaW50XCI+XG4gICAge3tzZWxlY3Rpb25UZXh0fX1cbjwvZGl2PlxufVxuXG48ZGl2IGNsYXNzPVwiY29udHJvbHNcIj5cbiAgICA8YnV0dG9uIG1hdC1mbGF0LWJ1dHRvbiBjbGFzcz1cInVwbG9hZC1idXR0b25cIiAoY2xpY2spPVwib25DcmVhdGVGb2xkZXIoKVwiPlxuICAgICAgICA8bWF0LWljb24+Y3JlYXRlX25ld19mb2xkZXI8L21hdC1pY29uPlxuICAgICAgICBOZXcgRm9sZGVyXG4gICAgPC9idXR0b24+XG4gICAgPGJ1dHRvbiBtYXQtZmxhdC1idXR0b24gY2xhc3M9XCJ1cGxvYWQtYnV0dG9uXCIgKGNsaWNrKT1cIm9uVXBsb2FkRmlsZSgpXCI+XG4gICAgICAgIDxtYXQtaWNvbj51cGxvYWRfZmlsZTwvbWF0LWljb24+XG4gICAgICAgIFVwbG9hZFxuICAgIDwvYnV0dG9uPlxuPC9kaXY+Il19
|