Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
A
AI推理平台
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
lichunliang
AI推理平台
Commits
a9038b00
Commit
a9038b00
authored
Feb 24, 2025
by
xinzhedeai
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
add: 山西华远跳转 token接收
parent
e4d8f181
Changes
7
Show whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
325 additions
and
9 deletions
+325
-9
.env
.env
+1
-1
dist.zip
dist.zip
+0
-0
route.ts
src/router/guard/route.ts
+6
-0
shared.ts
src/service/request/shared.ts
+12
-2
index.vue
src/views/AlgorithmConfiguration/index.vue
+3
-3
vite.config.ts
vite.config.ts
+3
-3
vite.config.ts.timestamp-1740122963479-f65ffad1dbb92.mjs
vite.config.ts.timestamp-1740122963479-f65ffad1dbb92.mjs
+300
-0
No files found.
.env
View file @
a9038b00
...
...
@@ -74,7 +74,7 @@ VITE_STORAGE_PREFIX=SOY_
# ============================================ old
# 开发环境 - 视频流地址
VITE_VIDEO_URL=ws://192.168.2.1
6
:9999
VITE_VIDEO_URL=ws://192.168.2.1
8
:9999
# 开发环境 - 所有服务接口地址
VITE_SERVICE_URL=http://192.168.2.16:9998
...
...
dist.zip
0 → 100644
View file @
a9038b00
File added
src/router/guard/route.ts
View file @
a9038b00
...
...
@@ -41,6 +41,12 @@ export function createRouteGuard(router: Router) {
// 是否存在 TOKEN 登录 与否
const
AdminToken
=
new
URLSearchParams
(
window
.
location
.
search
).
get
(
'
Admin
'
)
if
(
AdminToken
){
localStg
.
set
(
'
token
'
,
AdminToken
);
localStg
.
set
(
'
refreshToken
'
,
AdminToken
);
}
const
isLogin
=
Boolean
(
localStg
.
get
(
'
token
'
));
// 留存过期前信息
...
...
src/service/request/shared.ts
View file @
a9038b00
...
...
@@ -15,9 +15,19 @@ export async function handleRefreshToken(axiosConfig: AxiosRequestConfig) {
const
refreshToken
=
localStg
.
get
(
'
refreshToken
'
)
||
''
;
const
{
error
,
data
}
=
await
fetchRefreshToken
(
refreshToken
);
const
AdminToken
=
new
URLSearchParams
(
window
.
location
.
search
).
get
(
'
Admin
'
)
alert
(
'
adminToken
'
)
if
(
!
error
)
{
if
(
AdminToken
){
localStg
.
set
(
'
token
'
,
AdminToken
);
localStg
.
set
(
'
refreshToken
'
,
AdminToken
);
}
else
{
localStg
.
set
(
'
token
'
,
data
.
token
);
localStg
.
set
(
'
refreshToken
'
,
data
.
refreshToken
);
}
const
config
=
{
...
axiosConfig
};
if
(
config
.
headers
)
{
...
...
src/views/AlgorithmConfiguration/index.vue
View file @
a9038b00
...
...
@@ -477,9 +477,9 @@ const submitCallback = async () => {
return
message
.
error
(
'
摄像头分组必选!
'
);
}
if
(
!
preview
)
{
return
message
.
error
(
'
请选择摄像头预览图片!
'
);
}
//
if (!preview) {
//
return message.error('请选择摄像头预览图片!');
//
}
if
(
isEdit
.
value
)
{
await
api_addCameras
(
formWebCam
.
value
).
then
(
async
res
=>
{
...
...
vite.config.ts
View file @
a9038b00
...
...
@@ -4,7 +4,7 @@ import { defineConfig, loadEnv } from 'vite';
import
{
setupVitePlugins
}
from
'
./build/plugins
'
;
import
{
createViteProxy
,
getBuildTime
}
from
'
./build/config
'
;
// export const proxyTarget = 'http://192.168.2.16:999
6
';
// export const proxyTarget = 'http://192.168.2.16:999
8
';
// export const proxyTarget = 'http://192.168.2.16:9998';
export
const
proxyTarget
=
'
http://192.168.2.16:9998
'
;
...
...
@@ -13,13 +13,13 @@ export const proxyTarget = 'http://192.168.2.16:9998';
// 视频地址
export
const
videdUrl
=
'
ws://192.168.2.1
6
:9999
'
;
export
const
videdUrl
=
'
ws://192.168.2.1
8
:9999
'
;
// 固定接口地址
export
const
apiUrl
=
'
http://192.168.2.16:9998
'
;
// WS 地址
export
const
wsUrl
=
'
ws://192.168.2.1
6
:9999
'
;
export
const
wsUrl
=
'
ws://192.168.2.1
8
:9999
'
;
export
default
defineConfig
(
configEnv
=>
{
...
...
vite.config.ts.timestamp-1740122963479-f65ffad1dbb92.mjs
0 → 100644
View file @
a9038b00
// vite.config.ts
import
process3
from
"
node:process
"
;
import
{
URL
,
fileURLToPath
}
from
"
node:url
"
;
import
{
defineConfig
,
loadEnv
}
from
"
file:///E:/gitlabWorkspace/AI%E6%8E%A8%E7%90%86%E5%B9%B3%E5%8F%B0/AI-SYS/node_modules/.pnpm/vite@5.3.5_@types+node@22.0.1_sass@1.77.8/node_modules/vite/dist/node/index.js
"
;
// build/plugins/index.ts
import
vue
from
"
file:///E:/gitlabWorkspace/AI%E6%8E%A8%E7%90%86%E5%B9%B3%E5%8F%B0/AI-SYS/node_modules/.pnpm/@vitejs+plugin-vue@5.1.1_vi_01300163138d99939bda63065f555de2/node_modules/@vitejs/plugin-vue/dist/index.mjs
"
;
import
vueJsx
from
"
file:///E:/gitlabWorkspace/AI%E6%8E%A8%E7%90%86%E5%B9%B3%E5%8F%B0/AI-SYS/node_modules/.pnpm/@vitejs+plugin-vue-jsx@4.0._16ebef93e020e05b44527342356d5093/node_modules/@vitejs/plugin-vue-jsx/dist/index.mjs
"
;
import
VueDevtools
from
"
file:///E:/gitlabWorkspace/AI%E6%8E%A8%E7%90%86%E5%B9%B3%E5%8F%B0/AI-SYS/node_modules/.pnpm/vite-plugin-vue-devtools@7._9611d6832f3ead75846d24563c89710e/node_modules/vite-plugin-vue-devtools/dist/vite.mjs
"
;
import
progress
from
"
file:///E:/gitlabWorkspace/AI%E6%8E%A8%E7%90%86%E5%B9%B3%E5%8F%B0/AI-SYS/node_modules/.pnpm/vite-plugin-progress@0.0.7__184575f36ff902dcde273e93b2ab5a8e/node_modules/vite-plugin-progress/dist/index.mjs
"
;
// build/plugins/router.ts
import
ElegantVueRouter
from
"
file:///E:/gitlabWorkspace/AI%E6%8E%A8%E7%90%86%E5%B9%B3%E5%8F%B0/AI-SYS/node_modules/.pnpm/@elegant-router+vue@0.3.8/node_modules/@elegant-router/vue/dist/vite.mjs
"
;
function
setupElegantRouter
()
{
return
ElegantVueRouter
({
layouts
:
{
base
:
"
src/layouts/base-layout/index.vue
"
,
blank
:
"
src/layouts/blank-layout/index.vue
"
},
customRoutes
:
{
names
:
[
"
exception_403
"
,
"
exception_404
"
,
"
exception_500
"
,
"
document_project
"
,
"
document_project-link
"
,
"
document_vue
"
,
"
document_vite
"
,
"
document_unocss
"
,
"
document_naive
"
,
"
document_antd
"
]
},
routePathTransformer
(
routeName
,
routePath
)
{
const
key
=
routeName
;
if
(
key
===
"
login
"
)
{
const
modules
=
[
"
pwd-login
"
,
"
code-login
"
,
"
register
"
,
"
reset-pwd
"
,
"
bind-wechat
"
];
const
moduleReg
=
modules
.
join
(
"
|
"
);
return
`/login/:module(
${
moduleReg
}
)?`
;
}
return
routePath
;
},
onRouteMetaGen
(
routeName
)
{
const
key
=
routeName
;
const
constantRoutes
=
[
"
login
"
,
"
403
"
,
"
404
"
,
"
500
"
];
const
meta
=
{
title
:
key
,
i18nKey
:
`route.
${
key
}
`
};
if
(
constantRoutes
.
includes
(
key
))
{
meta
.
constant
=
true
;
}
return
meta
;
}
});
}
// build/plugins/unocss.ts
import
process
from
"
node:process
"
;
import
path
from
"
node:path
"
;
import
unocss
from
"
file:///E:/gitlabWorkspace/AI%E6%8E%A8%E7%90%86%E5%B9%B3%E5%8F%B0/AI-SYS/node_modules/.pnpm/@unocss+vite@0.61.9_rollup@_a3a27a356cbc6aeaa827e74c6aec9617/node_modules/@unocss/vite/dist/index.mjs
"
;
import
presetIcons
from
"
file:///E:/gitlabWorkspace/AI%E6%8E%A8%E7%90%86%E5%B9%B3%E5%8F%B0/AI-SYS/node_modules/.pnpm/@unocss+preset-icons@0.61.9/node_modules/@unocss/preset-icons/dist/index.mjs
"
;
import
{
FileSystemIconLoader
}
from
"
file:///E:/gitlabWorkspace/AI%E6%8E%A8%E7%90%86%E5%B9%B3%E5%8F%B0/AI-SYS/node_modules/.pnpm/@iconify+utils@2.1.29/node_modules/@iconify/utils/lib/loader/node-loaders.mjs
"
;
function
setupUnocss
(
viteEnv
)
{
const
{
VITE_ICON_PREFIX
,
VITE_ICON_LOCAL_PREFIX
}
=
viteEnv
;
const
localIconPath
=
path
.
join
(
process
.
cwd
(),
"
src/assets/svg-icon
"
);
const
collectionName
=
VITE_ICON_LOCAL_PREFIX
.
replace
(
`
${
VITE_ICON_PREFIX
}
-`
,
""
);
return
unocss
({
presets
:
[
presetIcons
({
prefix
:
`
${
VITE_ICON_PREFIX
}
-`
,
scale
:
1
,
extraProperties
:
{
display
:
"
inline-block
"
},
collections
:
{
[
collectionName
]:
FileSystemIconLoader
(
localIconPath
,
(
svg
)
=>
svg
.
replace
(
/^<svg
\s
/
,
'
<svg width="1em" height="1em"
'
)
)
},
warn
:
true
})
]
});
}
// build/plugins/unplugin.ts
import
process2
from
"
node:process
"
;
import
path2
from
"
node:path
"
;
import
Icons
from
"
file:///E:/gitlabWorkspace/AI%E6%8E%A8%E7%90%86%E5%B9%B3%E5%8F%B0/AI-SYS/node_modules/.pnpm/unplugin-icons@0.19.1_@vue+compiler-sfc@3.4.35/node_modules/unplugin-icons/dist/vite.js
"
;
import
IconsResolver
from
"
file:///E:/gitlabWorkspace/AI%E6%8E%A8%E7%90%86%E5%B9%B3%E5%8F%B0/AI-SYS/node_modules/.pnpm/unplugin-icons@0.19.1_@vue+compiler-sfc@3.4.35/node_modules/unplugin-icons/dist/resolver.js
"
;
import
Components
from
"
file:///E:/gitlabWorkspace/AI%E6%8E%A8%E7%90%86%E5%B9%B3%E5%8F%B0/AI-SYS/node_modules/.pnpm/unplugin-vue-components@0.2_399125951f7c19759694498f84b98625/node_modules/unplugin-vue-components/dist/vite.js
"
;
import
{
AntDesignVueResolver
,
NaiveUiResolver
}
from
"
file:///E:/gitlabWorkspace/AI%E6%8E%A8%E7%90%86%E5%B9%B3%E5%8F%B0/AI-SYS/node_modules/.pnpm/unplugin-vue-components@0.2_399125951f7c19759694498f84b98625/node_modules/unplugin-vue-components/dist/resolvers.js
"
;
import
{
FileSystemIconLoader
as
FileSystemIconLoader2
}
from
"
file:///E:/gitlabWorkspace/AI%E6%8E%A8%E7%90%86%E5%B9%B3%E5%8F%B0/AI-SYS/node_modules/.pnpm/unplugin-icons@0.19.1_@vue+compiler-sfc@3.4.35/node_modules/unplugin-icons/dist/loaders.js
"
;
import
{
createSvgIconsPlugin
}
from
"
file:///E:/gitlabWorkspace/AI%E6%8E%A8%E7%90%86%E5%B9%B3%E5%8F%B0/AI-SYS/node_modules/.pnpm/vite-plugin-svg-icons@2.0.1_74d6199eb1d71f61292914d4be54295b/node_modules/vite-plugin-svg-icons/dist/index.mjs
"
;
function
setupUnplugin
(
viteEnv
)
{
const
{
VITE_ICON_PREFIX
,
VITE_ICON_LOCAL_PREFIX
}
=
viteEnv
;
const
localIconPath
=
path2
.
join
(
process2
.
cwd
(),
"
src/assets/svg-icon
"
);
const
collectionName
=
VITE_ICON_LOCAL_PREFIX
.
replace
(
`
${
VITE_ICON_PREFIX
}
-`
,
""
);
const
plugins
=
[
Icons
({
compiler
:
"
vue3
"
,
customCollections
:
{
[
collectionName
]:
FileSystemIconLoader2
(
localIconPath
,
(
svg
)
=>
svg
.
replace
(
/^<svg
\s
/
,
'
<svg width="1em" height="1em"
'
)
)
},
scale
:
1
,
defaultClass
:
"
inline-block
"
}),
Components
({
dts
:
"
src/typings/components.d.ts
"
,
types
:
[{
from
:
"
vue-router
"
,
names
:
[
"
RouterLink
"
,
"
RouterView
"
]
}],
resolvers
:
[
AntDesignVueResolver
({
importStyle
:
false
}),
NaiveUiResolver
(),
IconsResolver
({
customCollections
:
[
collectionName
],
componentPrefix
:
VITE_ICON_PREFIX
})
]
}),
createSvgIconsPlugin
({
iconDirs
:
[
localIconPath
],
symbolId
:
`
${
VITE_ICON_LOCAL_PREFIX
}
-[dir]-[name]`
,
inject
:
"
body-last
"
,
customDomId
:
"
__SVG_ICON_LOCAL__
"
})
];
return
plugins
;
}
// build/plugins/html.ts
function
setupHtmlPlugin
(
buildTime
)
{
const
plugin
=
{
name
:
"
html-plugin
"
,
apply
:
"
build
"
,
transformIndexHtml
(
html
)
{
return
html
.
replace
(
"
<head>
"
,
`<head>
<meta name="buildTime" content="
${
buildTime
}
">`
);
}
};
return
plugin
;
}
// build/plugins/index.ts
function
setupVitePlugins
(
viteEnv
,
buildTime
)
{
const
plugins
=
[
vue
({
script
:
{
defineModel
:
true
}
}),
vueJsx
(),
VueDevtools
(),
setupElegantRouter
(),
setupUnocss
(
viteEnv
),
...
setupUnplugin
(
viteEnv
),
progress
(),
setupHtmlPlugin
(
buildTime
)
];
return
plugins
;
}
// src/utils/service.ts
function
createServiceConfig
(
env
)
{
const
{
VITE_SERVICE_BASE_URL
,
VITE_OTHER_SERVICE_BASE_URL
}
=
env
;
let
other
=
{};
try
{
other
=
JSON
.
parse
(
VITE_OTHER_SERVICE_BASE_URL
);
}
catch
(
error
)
{
}
console
.
error
(
"
VITE_OTHER_SERVICE_BASE_URL is not a valid JSON string
"
);
const
httpConfig
=
{
baseURL
:
VITE_SERVICE_BASE_URL
,
other
};
const
otherHttpKeys
=
Object
.
keys
(
httpConfig
.
other
);
const
otherConfig
=
otherHttpKeys
.
map
((
key
)
=>
{
return
{
key
,
baseURL
:
httpConfig
.
other
[
key
],
proxyPattern
:
createProxyPattern
(
key
)
};
});
const
config
=
{
baseURL
:
httpConfig
.
baseURL
,
proxyPattern
:
createProxyPattern
(),
other
:
otherConfig
};
return
config
;
}
function
createProxyPattern
(
key
)
{
if
(
!
key
)
{
return
"
/proxy-default
"
;
}
return
`/proxy-
${
key
}
`
;
}
// build/config/proxy.ts
function
createViteProxy
(
env
,
isDev
)
{
const
isEnableHttpProxy
=
isDev
&&
env
.
VITE_HTTP_PROXY
===
"
Y
"
;
if
(
!
isEnableHttpProxy
)
return
void
0
;
const
{
baseURL
,
proxyPattern
,
other
}
=
createServiceConfig
(
env
);
const
proxy
=
createProxyItem
({
baseURL
,
proxyPattern
});
console
.
log
(
"
\
u5F53
\
u524D
\
u4EE3
\
u7406
\
u9879
\
u76EE
"
,
proxy
);
other
.
forEach
((
item
)
=>
{
Object
.
assign
(
proxy
,
createProxyItem
(
item
));
});
return
proxy
;
}
function
createProxyItem
(
item
)
{
console
.
log
(
"
createProxyItem
\
u521B
\
u5EFA
\
u4EE3
\
u7406
\
u9879
\
u76EE
"
,
item
);
const
proxy
=
{};
proxy
[
item
.
proxyPattern
]
=
{
target
:
item
.
baseURL
,
changeOrigin
:
true
,
rewrite
:
(
path3
)
=>
path3
.
replace
(
new
RegExp
(
`^
${
item
.
proxyPattern
}
`
),
""
)
};
return
proxy
;
}
// build/config/time.ts
import
dayjs
from
"
file:///E:/gitlabWorkspace/AI%E6%8E%A8%E7%90%86%E5%B9%B3%E5%8F%B0/AI-SYS/node_modules/.pnpm/dayjs@1.11.12/node_modules/dayjs/dayjs.min.js
"
;
import
utc
from
"
file:///E:/gitlabWorkspace/AI%E6%8E%A8%E7%90%86%E5%B9%B3%E5%8F%B0/AI-SYS/node_modules/.pnpm/dayjs@1.11.12/node_modules/dayjs/plugin/utc.js
"
;
import
timezone
from
"
file:///E:/gitlabWorkspace/AI%E6%8E%A8%E7%90%86%E5%B9%B3%E5%8F%B0/AI-SYS/node_modules/.pnpm/dayjs@1.11.12/node_modules/dayjs/plugin/timezone.js
"
;
function
getBuildTime
()
{
dayjs
.
extend
(
utc
);
dayjs
.
extend
(
timezone
);
const
buildTime
=
dayjs
.
tz
(
Date
.
now
(),
"
Asia/Shanghai
"
).
format
(
"
YYYY-MM-DD HH:mm:ss
"
);
return
buildTime
;
}
// vite.config.ts
var
__vite_injected_original_import_meta_url
=
"
file:///E:/gitlabWorkspace/AI%E6%8E%A8%E7%90%86%E5%B9%B3%E5%8F%B0/AI-SYS/vite.config.ts
"
;
var
proxyTarget
=
"
http://192.168.2.16:9998
"
;
var
videdUrl
=
"
ws://192.168.2.18:9999
"
;
var
apiUrl
=
"
http://192.168.2.16:9998
"
;
var
wsUrl
=
"
ws://192.168.2.18:9999
"
;
var
vite_config_default
=
defineConfig
((
configEnv
)
=>
{
const
viteEnv
=
loadEnv
(
configEnv
.
mode
,
process3
.
cwd
());
const
buildTime
=
getBuildTime
();
return
{
base
:
viteEnv
.
VITE_BASE_URL
,
resolve
:
{
alias
:
{
"
~
"
:
fileURLToPath
(
new
URL
(
"
./
"
,
__vite_injected_original_import_meta_url
)),
"
@
"
:
fileURLToPath
(
new
URL
(
"
./src
"
,
__vite_injected_original_import_meta_url
))
}
},
css
:
{
preprocessorOptions
:
{
scss
:
{
additionalData
:
`@use "./src/styles/scss/global.scss" as *;`
}
}
},
plugins
:
setupVitePlugins
(
viteEnv
,
buildTime
),
define
:
{
BUILD_TIME
:
JSON
.
stringify
(
buildTime
)
},
server
:
{
host
:
"
0.0.0.0
"
,
port
:
9527
,
open
:
true
,
// 集成别人封装的代理项 & 晶合项目的代理项
proxy
:
{
...
createViteProxy
(
viteEnv
,
configEnv
.
command
===
"
serve
"
),
// '/menus': 'http://192.168.1.102:9995/menus',
// '/menus': 'http://192.168.1.173:10000/menus'
"
/v1
"
:
{
target
:
proxyTarget
,
changeOrigin
:
true
}
},
fs
:
{
cachedChecks
:
false
}
},
preview
:
{
port
:
9725
},
build
:
{
reportCompressedSize
:
false
,
sourcemap
:
viteEnv
.
VITE_SOURCE_MAP
===
"
Y
"
,
commonjsOptions
:
{
ignoreTryCatch
:
false
}
}
};
});
export
{
apiUrl
,
vite_config_default
as
default
,
proxyTarget
,
videdUrl
,
wsUrl
};
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsidml0ZS5jb25maWcudHMiLCAiYnVpbGQvcGx1Z2lucy9pbmRleC50cyIsICJidWlsZC9wbHVnaW5zL3JvdXRlci50cyIsICJidWlsZC9wbHVnaW5zL3Vub2Nzcy50cyIsICJidWlsZC9wbHVnaW5zL3VucGx1Z2luLnRzIiwgImJ1aWxkL3BsdWdpbnMvaHRtbC50cyIsICJzcmMvdXRpbHMvc2VydmljZS50cyIsICJidWlsZC9jb25maWcvcHJveHkudHMiLCAiYnVpbGQvY29uZmlnL3RpbWUudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImNvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lID0gXCJFOlxcXFxnaXRsYWJXb3Jrc3BhY2VcXFxcQUlcdTYzQThcdTc0MDZcdTVFNzNcdTUzRjBcXFxcQUktU1lTXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ZpbGVuYW1lID0gXCJFOlxcXFxnaXRsYWJXb3Jrc3BhY2VcXFxcQUlcdTYzQThcdTc0MDZcdTVFNzNcdTUzRjBcXFxcQUktU1lTXFxcXHZpdGUuY29uZmlnLnRzXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ltcG9ydF9tZXRhX3VybCA9IFwiZmlsZTovLy9FOi9naXRsYWJXb3Jrc3BhY2UvQUklRTYlOEUlQTglRTclOTAlODYlRTUlQjklQjMlRTUlOEYlQjAvQUktU1lTL3ZpdGUuY29uZmlnLnRzXCI7aW1wb3J0IHByb2Nlc3MgZnJvbSAnbm9kZTpwcm9jZXNzJztcbmltcG9ydCB7IFVSTCwgZmlsZVVSTFRvUGF0aCB9IGZyb20gJ25vZGU6dXJsJztcbmltcG9ydCB7IGRlZmluZUNvbmZpZywgbG9hZEVudiB9IGZyb20gJ3ZpdGUnO1xuaW1wb3J0IHsgc2V0dXBWaXRlUGx1Z2lucyB9IGZyb20gJy4vYnVpbGQvcGx1Z2lucyc7XG5pbXBvcnQgeyBjcmVhdGVWaXRlUHJveHksIGdldEJ1aWxkVGltZSB9IGZyb20gJy4vYnVpbGQvY29uZmlnJztcblxuLy8gZXhwb3J0IGNvbnN0IHByb3h5VGFyZ2V0ID0gJ2h0dHA6Ly8xOTIuMTY4LjIuMTY6OTk5Nic7XG4vLyBleHBvcnQgY29uc3QgcHJveHlUYXJnZXQgPSAnaHR0cDovLzE5Mi4xNjguMi4xNjo5OTk4JztcbmV4cG9ydCBjb25zdCBwcm94eVRhcmdldCA9ICdodHRwOi8vMTkyLjE2OC4yLjE2Ojk5OTgnO1xuXG4vLyBleHBvcnQgY29uc3QgcHJveHlUYXJnZXQgPSAnaHR0cDovLzE5Mi4xNjguMS4xMTk6OTk5Nic7XG4vLyBleHBvcnQgY29uc3QgcHJveHlUYXJnZXQgPSAnaHR0cDovLzE5Mi4xNjguMS4xMTk6OTk5Nic7XG5cblxuLy8gXHU4OUM2XHU5ODkxXHU1NzMwXHU1NzQwXG5leHBvcnQgY29uc3QgdmlkZWRVcmwgPSAnd3M6Ly8xOTIuMTY4LjIuMTY6OTk5OSc7XG5cbi8vIFx1NTZGQVx1NUI5QVx1NjNBNVx1NTNFM1x1NTczMFx1NTc0MFxuZXhwb3J0IGNvbnN0IGFwaVVybCA9ICdodHRwOi8vMTkyLjE2OC4yLjE2Ojk5OTgnO1xuXG4vLyBXUyBcdTU3MzBcdTU3NDBcbmV4cG9ydCBjb25zdCB3c1VybCA9ICd3czovLzE5Mi4xNjguMi4xNjo5OTk5JztcblxuXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb25maWcoY29uZmlnRW52ID0+IHtcblxuICBjb25zdCB2aXRlRW52ID0gbG9hZEVudihjb25maWdFbnYubW9kZSwgcHJvY2Vzcy5jd2QoKSkgYXMgdW5rbm93biBhcyBFbnYuSW1wb3J0TWV0YTtcblxuICBjb25zdCBidWlsZFRpbWUgPSBnZXRCdWlsZFRpbWUoKTtcblxuICByZXR1cm4ge1xuICAgIGJhc2U6IHZpdGVFbnYuVklURV9CQVNFX1VSTCxcbiAgICByZXNvbHZlOiB7XG4gICAgICBhbGlhczoge1xuICAgICAgICAnfic6IGZpbGVVUkxUb1BhdGgobmV3IFVSTCgnLi8nLCBpbXBvcnQubWV0YS51cmwpKSxcbiAgICAgICAgJ0AnOiBmaWxlVVJMVG9QYXRoKG5ldyBVUkwoJy4vc3JjJywgaW1wb3J0Lm1ldGEudXJsKSlcbiAgICAgIH1cbiAgICB9LFxuICAgIGNzczoge1xuICAgICAgcHJlcHJvY2Vzc29yT3B0aW9uczoge1xuICAgICAgICBzY3NzOiB7XG4gICAgICAgICAgYWRkaXRpb25hbERhdGE6IGBAdXNlIFwiLi9zcmMvc3R5bGVzL3Njc3MvZ2xvYmFsLnNjc3NcIiBhcyAqO2BcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgcGx1Z2luczogc2V0dXBWaXRlUGx1Z2lucyh2aXRlRW52LCBidWlsZFRpbWUpLFxuICAgIGRlZmluZToge1xuICAgICAgQlVJTERfVElNRTogSlNPTi5zdHJpbmdpZnkoYnVpbGRUaW1lKVxuICAgIH0sXG4gICAgc2VydmVyOiB7XG4gICAgICBob3N0OiAnMC4wLjAuMCcsXG4gICAgICBwb3J0OiA5NTI3LFxuICAgICAgb3BlbjogdHJ1ZSxcbiAgICAgIC8vIFx1OTZDNlx1NjIxMFx1NTIyQlx1NEVCQVx1NUMwMVx1ODhDNVx1NzY4NFx1NEVFM1x1NzQwNlx1OTg3OSAmIFx1NjY3Nlx1NTQwOFx1OTg3OVx1NzZFRVx1NzY4NFx1NEVFM1x1NzQwNlx1OTg3OVxuICAgICAgcHJveHk6IHtcbiAgICAgICAgLi4uY3JlYXRlVml0ZVByb3h5KHZpdGVFbnYsIGNvbmZpZ0Vudi5jb21tYW5kID09PSAnc2VydmUnKSxcbiAgICAgICAgLy8gJy9tZW51cyc6ICdodHRwOi8vMTkyLjE2OC4xLjEwMjo5OTk1L21lbnVzJyxcbiAgICAgICAgLy8gJy9tZW51cyc6ICdodHRwOi8vMTkyLjE2OC4xLjE3MzoxMDAwMC9tZW51cydcbiAgICAgICAgJy92MSc6IHtcbiAgICAgICAgICB0YXJnZXQ6IHByb3h5VGFyZ2V0LFxuICAgICAgICAgIGNoYW5nZU9yaWdpbjogdHJ1ZVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZnM6IHtcbiAgICAgICAgY2FjaGVkQ2hlY2tzOiBmYWxzZVxuICAgICAgfVxuICAgIH0sXG4gICAgcHJldmlldzoge1xuICAgICAgcG9ydDogOTcyNVxuICAgIH0sXG4gICAgYnVpbGQ6IHtcbiAgICAgIHJlcG9ydENvbXByZXNzZWRTaXplOiBmYWxzZSxcbiAgICAgIHNvdXJjZW1hcDogdml0ZUVudi5WSVRFX1NPVVJDRV9NQVAgPT09ICdZJyxcbiAgICAgIGNvbW1vbmpzT3B0aW9uczoge1xuICAgICAgICBpZ25vcmVUcnlDYXRjaDogZmFsc2VcbiAgICAgIH1cbiAgICB9XG4gIH07XG59KTtcblxuLy8gMTIzNDU2enlAXG4iLCAiY29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2Rpcm5hbWUgPSBcIkU6XFxcXGdpdGxhYldvcmtzcGFjZVxcXFxBSVx1NjNBOFx1NzQwNlx1NUU3M1x1NTNGMFxcXFxBSS1TWVNcXFxcYnVpbGRcXFxccGx1Z2luc1wiO2NvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9maWxlbmFtZSA9IFwiRTpcXFxcZ2l0bGFiV29ya3NwYWNlXFxcXEFJXHU2M0E4XHU3NDA2XHU1RTczXHU1M0YwXFxcXEFJLVNZU1xcXFxidWlsZFxcXFxwbHVnaW5zXFxcXGluZGV4LnRzXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ltcG9ydF9tZXRhX3VybCA9IFwiZmlsZTovLy9FOi9naXRsYWJXb3Jrc3BhY2UvQUklRTYlOEUlQTglRTclOTAlODYlRTUlQjklQjMlRTUlOEYlQjAvQUktU1lTL2J1aWxkL3BsdWdpbnMvaW5kZXgudHNcIjtpbXBvcnQgdHlwZSB7IFBsdWdpbk9wdGlvbiB9IGZyb20gJ3ZpdGUnO1xuaW1wb3J0IHZ1ZSBmcm9tICdAdml0ZWpzL3BsdWdpbi12dWUnO1xuaW1wb3J0IHZ1ZUpzeCBmcm9tICdAdml0ZWpzL3BsdWdpbi12dWUtanN4JztcbmltcG9ydCBWdWVEZXZ0b29scyBmcm9tICd2aXRlLXBsdWdpbi12dWUtZGV2dG9vbHMnO1xuaW1wb3J0IHByb2dyZXNzIGZyb20gJ3ZpdGUtcGx1Z2luLXByb2dyZXNzJztcbmltcG9ydCB7IHNldHVwRWxlZ2FudFJvdXRlciB9IGZyb20gJy4vcm91dGVyJztcbmltcG9ydCB7IHNldHVwVW5vY3NzIH0gZnJvbSAnLi91bm9jc3MnO1xuaW1wb3J0IHsgc2V0dXBVbnBsdWdpbiB9IGZyb20gJy4vdW5wbHVnaW4nO1xuaW1wb3J0IHsgc2V0dXBIdG1sUGx1Z2luIH0gZnJvbSAnLi9odG1sJztcblxuZXhwb3J0IGZ1bmN0aW9uIHNldHVwVml0ZVBsdWdpbnModml0ZUVudjogRW52LkltcG9ydE1ldGEsIGJ1aWxkVGltZTogc3RyaW5nKSB7XG4gIGNvbnN0IHBsdWdpbnM6IFBsdWdpbk9wdGlvbiA9IFtcbiAgICB2dWUoe1xuICAgICAgc2NyaXB0OiB7XG4gICAgICAgIGRlZmluZU1vZGVsOiB0cnVlXG4gICAgICB9XG4gICAgfSksXG4gICAgdnVlSnN4KCksXG4gICAgVnVlRGV2dG9vbHMoKSxcbiAgICBzZXR1cEVsZWdhbnRSb3V0ZXIoKSxcbiAgICBzZXR1cFVub2Nzcyh2aXRlRW52KSxcbiAgICAuLi5zZXR1cFVucGx1Z2luKHZpdGVFbnYpLFxuICAgIHByb2dyZXNzKCksXG4gICAgc2V0dXBIdG1sUGx1Z2luKGJ1aWxkVGltZSlcbiAgXTtcblxuICByZXR1cm4gcGx1Z2lucztcbn1cbiIsICJjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZGlybmFtZSA9IFwiRTpcXFxcZ2l0bGFiV29ya3NwYWNlXFxcXEFJXHU2M0E4XHU3NDA2XHU1RTczXHU1M0YwXFxcXEFJLVNZU1xcXFxidWlsZFxcXFxwbHVnaW5zXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ZpbGVuYW1lID0gXCJFOlxcXFxnaXRsYWJXb3Jrc3BhY2VcXFxcQUlcdTYzQThcdTc0MDZcdTVFNzNcdTUzRjBcXFxcQUktU1lTXFxcXGJ1aWxkXFxcXHBsdWdpbnNcXFxccm91dGVyLnRzXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ltcG9ydF9tZXRhX3VybCA9IFwiZmlsZTovLy9FOi9naXRsYWJXb3Jrc3BhY2UvQUklRTYlOEUlQTglRTclOTAlODYlRTUlQjklQjMlRTUlOEYlQjAvQUktU1lTL2J1aWxkL3BsdWdpbnMvcm91dGVyLnRzXCI7aW1wb3J0IHR5cGUgeyBSb3V0ZU1ldGEgfSBmcm9tICd2dWUtcm91dGVyJztcbmltcG9ydCBFbGVnYW50VnVlUm91dGVyIGZyb20gJ0BlbGVnYW50LXJvdXRlci92dWUvdml0ZSc7XG5pbXBvcnQgdHlwZSB7IFJvdXRlS2V5IH0gZnJvbSAnQGVsZWdhbnQtcm91dGVyL3R5cGVzJztcblxuZXhwb3J0IGZ1bmN0aW9uIHNldHVwRWxlZ2FudFJvdXRlcigpIHtcbiAgcmV0dXJuIEVsZWdhbnRWdWVSb3V0ZXIoe1xuICAgIGxheW91dHM6IHtcbiAgICAgIGJhc2U6ICdzcmMvbGF5b3V0cy9iYXNlLWxheW91dC9pbmRleC52dWUnLFxuICAgICAgYmxhbms6ICdzcmMvbGF5b3V0cy9ibGFuay1sYXlvdXQvaW5kZXgudnVlJ1xuICAgIH0sXG4gICAgY3VzdG9tUm91dGVzOiB7XG4gICAgICBuYW1lczogW1xuICAgICAgICAnZXhjZXB0aW9uXzQwMycsXG4gICAgICAgICdleGNlcHRpb25fNDA0JyxcbiAgICAgICAgJ2V4Y2VwdGlvbl81MDAnLFxuICAgICAgICAnZG9jdW1lbnRfcHJvamVjdCcsXG4gICAgICAgICdkb2N1bWVudF9wcm9qZWN0LWxpbmsnLFxuICAgICAgICAnZG9jdW1lbnRfdnVlJyxcbiAgICAgICAgJ2RvY3VtZW50X3ZpdGUnLFxuICAgICAgICAnZG9jdW1lbnRfdW5vY3NzJyxcbiAgICAgICAgJ2RvY3VtZW50X25haXZlJyxcbiAgICAgICAgJ2RvY3VtZW50X2FudGQnXG4gICAgICBdXG4gICAgfSxcbiAgICByb3V0ZVBhdGhUcmFuc2Zvcm1lcihyb3V0ZU5hbWUsIHJvdXRlUGF0aCkge1xuICAgICAgY29uc3Qga2V5ID0gcm91dGVOYW1lIGFzIFJvdXRlS2V5O1xuXG4gICAgICBpZiAoa2V5ID09PSAnbG9naW4nKSB7XG4gICAgICAgIGNvbnN0IG1vZHVsZXM6IFVuaW9uS2V5LkxvZ2luTW9kdWxlW10gPSBbJ3B3ZC1sb2dpbicsICdjb2RlLWxvZ2luJywgJ3JlZ2lzdGVyJywgJ3Jlc2V0LXB3ZCcsICdiaW5kLXdlY2hhdCddO1xuXG4gICAgICAgIGNvbnN0IG1vZHVsZVJlZyA9IG1vZHVsZXMuam9pbignfCcpO1xuXG4gICAgICAgIHJldHVybiBgL2xvZ2luLzptb2R1bGUoJHttb2R1bGVSZWd9KT9gO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcm91dGVQYXRoO1xuICAgIH0sXG4gICAgb25Sb3V0ZU1ldGFHZW4ocm91dGVOYW1lKSB7XG4gICAgICBjb25zdCBrZXkgPSByb3V0ZU5hbWUgYXMgUm91dGVLZXk7XG5cbiAgICAgIGNvbnN0IGNvbnN0YW50Um91dGVzOiBSb3V0ZUtleVtdID0gWydsb2dpbicsICc0MDMnLCAnNDA0JywgJzUwMCddO1xuXG4gICAgICBjb25zdCBtZXRhOiBQYXJ0aWFsPFJvdXRlTWV0YT4gPSB7XG4gICAgICAgIHRpdGxlOiBrZXksXG4gICAgICAgIGkxOG5LZXk6IGByb3V0ZS4ke2tleX1gIGFzIEFwcC5JMThuLkkxOG5LZXlcbiAgICAgIH07XG5cbiAgICAgIGlmIChjb25zdGFudFJvdXRlcy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgIG1ldGEuY29uc3RhbnQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbWV0YTtcbiAgICB9XG4gIH0pO1xufVxuIiwgImNvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lID0gXCJFOlxcXFxnaXRsYWJXb3Jrc3BhY2VcXFxcQUlcdTYzQThcdTc0MDZcdTVFNzNcdTUzRjBcXFxcQUktU1lTXFxcXGJ1aWxkXFxcXHBsdWdpbnNcIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZmlsZW5hbWUgPSBcIkU6XFxcXGdpdGxhYldvcmtzcGFjZVxcXFxBSVx1NjNBOFx1NzQwNlx1NUU3M1x1NTNGMFxcXFxBSS1TWVNcXFxcYnVpbGRcXFxccGx1Z2luc1xcXFx1bm9jc3MudHNcIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfaW1wb3J0X21ldGFfdXJsID0gXCJmaWxlOi8vL0U6L2dpdGxhYldvcmtzcGFjZS9BSSVFNiU4RSVBOCVFNyU5MCU4NiVFNSVCOSVCMyVFNSU4RiVCMC9BSS1TWVMvYnVpbGQvcGx1Z2lucy91bm9jc3MudHNcIjtpbXBvcnQgcHJvY2VzcyBmcm9tICdub2RlOnByb2Nlc3MnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB1bm9jc3MgZnJvbSAnQHVub2Nzcy92aXRlJztcbmltcG9ydCBwcmVzZXRJY29ucyBmcm9tICdAdW5vY3NzL3ByZXNldC1pY29ucyc7XG5pbXBvcnQgeyBGaWxlU3lzdGVtSWNvbkxvYWRlciB9IGZyb20gJ0BpY29uaWZ5L3V0aWxzL2xpYi9sb2FkZXIvbm9kZS1sb2FkZXJzJztcblxuZXhwb3J0IGZ1bmN0aW9uIHNldHVwVW5vY3NzKHZpdGVFbnY6IEVudi5JbXBvcnRNZXRhKSB7XG4gIGNvbnN0IHsgVklURV9JQ09OX1BSRUZJWCwgVklURV9JQ09OX0xPQ0FMX1BSRUZJWCB9ID0gdml0ZUVudjtcblxuICBjb25zdCBsb2NhbEljb25QYXRoID0gcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksICdzcmMvYXNzZXRzL3N2Zy1pY29uJyk7XG5cbiAgLyoqIFRoZSBuYW1lIG9mIHRoZSBsb2NhbCBpY29uIGNvbGxlY3Rpb24gKi9cbiAgY29uc3QgY29sbGVjdGlvbk5hbWUgPSBWSVRFX0lDT05fTE9DQUxfUFJFRklYLnJlcGxhY2UoYCR7VklURV9JQ09OX1BSRUZJWH0tYCwgJycpO1xuXG4gIHJldHVybiB1bm9jc3Moe1xuICAgIHByZXNldHM6IFtcbiAgICAgIHByZXNldEljb25zKHtcbiAgICAgICAgcHJlZml4OiBgJHtWSVRFX0lDT05fUFJFRklYfS1gLFxuICAgICAgICBzY2FsZTogMSxcbiAgICAgICAgZXh0cmFQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgZGlzcGxheTogJ2lubGluZS1ibG9jaydcbiAgICAgICAgfSxcbiAgICAgICAgY29sbGVjdGlvbnM6IHtcbiAgICAgICAgICBbY29sbGVjdGlvbk5hbWVdOiBGaWxlU3lzdGVtSWNvbkxvYWRlcihsb2NhbEljb25QYXRoLCBzdmcgPT5cbiAgICAgICAgICAgIHN2Zy5yZXBsYWNlKC9ePHN2Z1xccy8sICc8c3ZnIHdpZHRoPVwiMWVtXCIgaGVpZ2h0PVwiMWVtXCIgJylcbiAgICAgICAgICApXG4gICAgICAgIH0sXG4gICAgICAgIHdhcm46IHRydWVcbiAgICAgIH0pXG4gICAgXVxuICB9KTtcbn1cbiIsICJjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZGlybmFtZSA9IFwiRTpcXFxcZ2l0bGFiV29ya3NwYWNlXFxcXEFJXHU2M0E4XHU3NDA2XHU1RTczXHU1M0YwXFxcXEFJLVNZU1xcXFxidWlsZFxcXFxwbHVnaW5zXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ZpbGVuYW1lID0gXCJFOlxcXFxnaXRsYWJXb3Jrc3BhY2VcXFxcQUlcdTYzQThcdTc0MDZcdTVFNzNcdTUzRjBcXFxcQUktU1lTXFxcXGJ1aWxkXFxcXHBsdWdpbnNcXFxcdW5wbHVnaW4udHNcIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfaW1wb3J0X21ldGFfdXJsID0gXCJmaWxlOi8vL0U6L2dpdGxhYldvcmtzcGFjZS9BSSVFNiU4RSVBOCVFNyU5MCU4NiVFNSVCOSVCMyVFNSU4RiVCMC9BSS1TWVMvYnVpbGQvcGx1Z2lucy91bnBsdWdpbi50c1wiO2ltcG9ydCBwcm9jZXNzIGZyb20gJ25vZGU6cHJvY2Vzcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHR5cGUgeyBQbHVnaW5PcHRpb24gfSBmcm9tICd2aXRlJztcbmltcG9ydCBJY29ucyBmcm9tICd1bnBsdWdpbi1pY29ucy92aXRlJztcbmltcG9ydCBJY29uc1Jlc29sdmVyIGZyb20gJ3VucGx1Z2luLWljb25zL3Jlc29sdmVyJztcbmltcG9ydCBDb21wb25lbnRzIGZyb20gJ3VucGx1Z2luLXZ1ZS1jb21wb25lbnRzL3ZpdGUnO1xuaW1wb3J0IHsgQW50RGVzaWduVnVlUmVzb2x2ZXIsIE5haXZlVWlSZXNvbHZlciB9IGZyb20gJ3VucGx1Z2luLXZ1ZS1jb21wb25lbnRzL3Jlc29sdmVycyc7XG5pbXBvcnQgeyBGaWxlU3lzdGVtSWNvbkxvYWRlciB9IGZyb20gJ3VucGx1Z2luLWljb25zL2xvYWRlcnMnO1xuaW1wb3J0IHsgY3JlYXRlU3ZnSWNvbnNQbHVnaW4gfSBmcm9tICd2aXRlLXBsdWdpbi1zdmctaWNvbnMnO1xuXG5leHBvcnQgZnVuY3Rpb24gc2V0dXBVbnBsdWdpbih2aXRlRW52OiBFbnYuSW1wb3J0TWV0YSkge1xuICBjb25zdCB7IFZJVEVfSUNPTl9QUkVGSVgsIFZJVEVfSUNPTl9MT0NBTF9QUkVGSVggfSA9IHZpdGVFbnY7XG5cbiAgY29uc3QgbG9jYWxJY29uUGF0aCA9IHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCAnc3JjL2Fzc2V0cy9zdmctaWNvbicpO1xuXG4gIC8qKiBUaGUgbmFtZSBvZiB0aGUgbG9jYWwgaWNvbiBjb2xsZWN0aW9uICovXG4gIGNvbnN0IGNvbGxlY3Rpb25OYW1lID0gVklURV9JQ09OX0xPQ0FMX1BSRUZJWC5yZXBsYWNlKGAke1ZJVEVfSUNPTl9QUkVGSVh9LWAsICcnKTtcblxuICBjb25zdCBwbHVnaW5zOiBQbHVnaW5PcHRpb25bXSA9IFtcbiAgICBJY29ucyh7XG4gICAgICBjb21waWxlcjogJ3Z1ZTMnLFxuICAgICAgY3VzdG9tQ29sbGVjdGlvbnM6IHtcbiAgICAgICAgW2NvbGxlY3Rpb25OYW1lXTogRmlsZVN5c3RlbUljb25Mb2FkZXIobG9jYWxJY29uUGF0aCwgc3ZnID0+XG4gICAgICAgICAgc3ZnLnJlcGxhY2UoL148c3ZnXFxzLywgJzxzdmcgd2lkdGg9XCIxZW1cIiBoZWlnaHQ9XCIxZW1cIiAnKVxuICAgICAgICApXG4gICAgICB9LFxuICAgICAgc2NhbGU6IDEsXG4gICAgICBkZWZhdWx0Q2xhc3M6ICdpbmxpbmUtYmxvY2snXG4gICAgfSksXG4gICAgQ29tcG9uZW50cyh7XG4gICAgICBkdHM6ICdzcmMvdHlwaW5ncy9jb21wb25lbnRzLmQudHMnLFxuICAgICAgdHlwZXM6IFt7IGZyb206ICd2dWUtcm91dGVyJywgbmFtZXM6IFsnUm91dGVyTGluaycsICdSb3V0ZXJWaWV3J10gfV0sXG4gICAgICByZXNvbHZlcnM6IFtcbiAgICAgICAgQW50RGVzaWduVnVlUmVzb2x2ZXIoe1xuICAgICAgICAgIGltcG9ydFN0eWxlOiBmYWxzZVxuICAgICAgICB9KSxcbiAgICAgICAgTmFpdmVVaVJlc29sdmVyKCksXG4gICAgICAgIEljb25zUmVzb2x2ZXIoeyBjdXN0b21Db2xsZWN0aW9uczogW2NvbGxlY3Rpb25OYW1lXSwgY29tcG9uZW50UHJlZml4OiBWSVRFX0lDT05fUFJFRklYIH0pXG4gICAgICBdXG4gICAgfSksXG4gICAgY3JlYXRlU3ZnSWNvbnNQbHVnaW4oe1xuICAgICAgaWNvbkRpcnM6IFtsb2NhbEljb25QYXRoXSxcbiAgICAgIHN5bWJvbElkOiBgJHtWSVRFX0lDT05fTE9DQUxfUFJFRklYfS1bZGlyXS1bbmFtZV1gLFxuICAgICAgaW5qZWN0OiAnYm9keS1sYXN0JyxcbiAgICAgIGN1c3RvbURvbUlkOiAnX19TVkdfSUNPTl9MT0NBTF9fJ1xuICAgIH0pXG4gIF07XG5cbiAgcmV0dXJuIHBsdWdpbnM7XG59XG4iLCAiY29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2Rpcm5hbWUgPSBcIkU6XFxcXGdpdGxhYldvcmtzcGFjZVxcXFxBSVx1NjNBOFx1NzQwNlx1NUU3M1x1NTNGMFxcXFxBSS1TWVNcXFxcYnVpbGRcXFxccGx1Z2luc1wiO2NvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9maWxlbmFtZSA9IFwiRTpcXFxcZ2l0bGFiV29ya3NwYWNlXFxcXEFJXHU2M0E4XHU3NDA2XHU1RTczXHU1M0YwXFxcXEFJLVNZU1xcXFxidWlsZFxcXFxwbHVnaW5zXFxcXGh0bWwudHNcIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfaW1wb3J0X21ldGFfdXJsID0gXCJmaWxlOi8vL0U6L2dpdGxhYldvcmtzcGFjZS9BSSVFNiU4RSVBOCVFNyU5MCU4NiVFNSVCOSVCMyVFNSU4RiVCMC9BSS1TWVMvYnVpbGQvcGx1Z2lucy9odG1sLnRzXCI7aW1wb3J0IHR5cGUgeyBQbHVnaW4gfSBmcm9tICd2aXRlJztcblxuZXhwb3J0IGZ1bmN0aW9uIHNldHVwSHRtbFBsdWdpbihidWlsZFRpbWU6IHN0cmluZykge1xuICBjb25zdCBwbHVnaW46IFBsdWdpbiA9IHtcbiAgICBuYW1lOiAnaHRtbC1wbHVnaW4nLFxuICAgIGFwcGx5OiAnYnVpbGQnLFxuICAgIHRyYW5zZm9ybUluZGV4SHRtbChodG1sKSB7XG4gICAgICByZXR1cm4gaHRtbC5yZXBsYWNlKCc8aGVhZD4nLCBgPGhlYWQ+XFxuICAgIDxtZXRhIG5hbWU9XCJidWlsZFRpbWVcIiBjb250ZW50PVwiJHtidWlsZFRpbWV9XCI+YCk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBwbHVnaW47XG59XG4iLCAiY29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2Rpcm5hbWUgPSBcIkU6XFxcXGdpdGxhYldvcmtzcGFjZVxcXFxBSVx1NjNBOFx1NzQwNlx1NUU3M1x1NTNGMFxcXFxBSS1TWVNcXFxcc3JjXFxcXHV0aWxzXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ZpbGVuYW1lID0gXCJFOlxcXFxnaXRsYWJXb3Jrc3BhY2VcXFxcQUlcdTYzQThcdTc0MDZcdTVFNzNcdTUzRjBcXFxcQUktU1lTXFxcXHNyY1xcXFx1dGlsc1xcXFxzZXJ2aWNlLnRzXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ltcG9ydF9tZXRhX3VybCA9IFwiZmlsZTovLy9FOi9naXRsYWJXb3Jrc3BhY2UvQUklRTYlOEUlQTglRTclOTAlODYlRTUlQjklQjMlRTUlOEYlQjAvQUktU1lTL3NyYy91dGlscy9zZXJ2aWNlLnRzXCI7LyoqXG4gKiBDcmVhdGUgc2VydmljZSBjb25maWcgYnkgY3VycmVudCBlbnZcbiAqXG4gKiBAcGFyYW0gZW52IFRoZSBjdXJyZW50IGVudlxuICovXG5cblxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU2VydmljZUNvbmZpZyhlbnY6IEVudi5JbXBvcnRNZXRhKSB7XG4gIGNvbnN0IHsgVklURV9TRVJWSUNFX0JBU0VfVVJMLCBWSVRFX09USEVSX1NFUlZJQ0VfQkFTRV9VUkwgfSA9IGVudjtcblxuICBsZXQgb3RoZXIgPSB7fSBhcyBSZWNvcmQ8QXBwLlNlcnZpY2UuT3RoZXJCYXNlVVJMS2V5LCBzdHJpbmc+O1xuICB0cnkge1xuICAgIG90aGVyID0gSlNPTi5wYXJzZShWSVRFX09USEVSX1NFUlZJQ0VfQkFTRV9VUkwpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gIH0gICAgY29uc29sZS5lcnJvcignVklURV9PVEhFUl9TRVJWSUNFX0JBU0VfVVJMIGlzIG5vdCBhIHZhbGlkIEpTT04gc3RyaW5nJyk7XG5cblxuICBjb25zdCBodHRwQ29uZmlnOiBBcHAuU2VydmljZS5TaW1wbGVTZXJ2aWNlQ29uZmlnID0ge1xuICAgIGJhc2VVUkw6IFZJVEVfU0VSVklDRV9CQVNFX1VSTCxcbiAgICBvdGhlclxuICB9O1xuXG4gIGNvbnN0IG90aGVySHR0cEtleXMgPSBPYmplY3Qua2V5cyhodHRwQ29uZmlnLm90aGVyKSBhcyBBcHAuU2VydmljZS5PdGhlckJhc2VVUkxLZXlbXTtcblxuICBjb25zdCBvdGhlckNvbmZpZzogQXBwLlNlcnZpY2UuT3RoZXJTZXJ2aWNlQ29uZmlnSXRlbVtdID0gb3RoZXJIdHRwS2V5cy5tYXAoa2V5ID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAga2V5LFxuICAgICAgYmFzZVVSTDogaHR0cENvbmZpZy5vdGhlcltrZXldLFxuICAgICAgcHJveHlQYXR0ZXJuOiBjcmVhdGVQcm94eVBhdHRlcm4oa2V5KVxuICAgIH07XG4gIH0pO1xuXG4gIGNvbnN0IGNvbmZpZzogQXBwLlNlcnZpY2UuU2VydmljZUNvbmZpZyA9IHtcbiAgICBiYXNlVVJMOiBodHRwQ29uZmlnLmJhc2VVUkwsXG4gICAgcHJveHlQYXR0ZXJuOiBjcmVhdGVQcm94eVBhdHRlcm4oKSxcbiAgICBvdGhlcjogb3RoZXJDb25maWdcbiAgfTtcblxuICByZXR1cm4gY29uZmlnO1xufVxuXG4vKipcbiAqIGdldCBiYWNrZW5kIHNlcnZpY2UgYmFzZSB1cmxcbiAqXG4gKiBAcGFyYW0gZW52IC0gdGhlIGN1cnJlbnQgZW52XG4gKiBAcGFyYW0gaXNQcm94eSAtIGlmIHVzZSBwcm94eVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2VydmljZUJhc2VVUkwoZW52OiBFbnYuSW1wb3J0TWV0YSwgaXNQcm94eTogYm9vbGVhbikge1xuICBjb25zdCB7IGJhc2VVUkwsIG90aGVyIH0gPSBjcmVhdGVTZXJ2aWNlQ29uZmlnKGVudik7XG5cbiAgY29uc3Qgb3RoZXJCYXNlVVJMID0ge30gYXMgUmVjb3JkPEFwcC5TZXJ2aWNlLk90aGVyQmFzZVVSTEtleSwgc3RyaW5nPjtcblxuICBvdGhlci5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgIG90aGVyQmFzZVVSTFtpdGVtLmtleV0gPSBpc1Byb3h5ID8gaXRlbS5wcm94eVBhdHRlcm4gOiBpdGVtLmJhc2VVUkw7XG4gIH0pO1xuXG4gIHJldHVybiB7XG4gICAgYmFzZVVSTDogaXNQcm94eSA/IGNyZWF0ZVByb3h5UGF0dGVybigpIDogYmFzZVVSTCxcbiAgICBvdGhlckJhc2VVUkxcbiAgfTtcbn1cblxuLyoqXG4gKiBHZXQgcHJveHkgcGF0dGVybiBvZiBiYWNrZW5kIHNlcnZpY2UgYmFzZSB1cmxcbiAqXG4gKiBAcGFyYW0ga2V5IElmIG5vdCBzZXQsIHdpbGwgdXNlIHRoZSBkZWZhdWx0IGtleVxuICovXG5mdW5jdGlvbiBjcmVhdGVQcm94eVBhdHRlcm4oa2V5PzogQXBwLlNlcnZpY2UuT3RoZXJCYXNlVVJMS2V5KSB7XG4gIGlmICgha2V5KSB7XG4gICAgcmV0dXJuICcvcHJveHktZGVmYXVsdCc7XG4gIH1cblxuICByZXR1cm4gYC9wcm94eS0ke2tleX1gO1xufVxuIiwgImNvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lID0gXCJFOlxcXFxnaXRsYWJXb3Jrc3BhY2VcXFxcQUlcdTYzQThcdTc0MDZcdTVFNzNcdTUzRjBcXFxcQUktU1lTXFxcXGJ1aWxkXFxcXGNvbmZpZ1wiO2NvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9maWxlbmFtZSA9IFwiRTpcXFxcZ2l0bGFiV29ya3NwYWNlXFxcXEFJXHU2M0E4XHU3NDA2XHU1RTczXHU1M0YwXFxcXEFJLVNZU1xcXFxidWlsZFxcXFxjb25maWdcXFxccHJveHkudHNcIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfaW1wb3J0X21ldGFfdXJsID0gXCJmaWxlOi8vL0U6L2dpdGxhYldvcmtzcGFjZS9BSSVFNiU4RSVBOCVFNyU5MCU4NiVFNSVCOSVCMyVFNSU4RiVCMC9BSS1TWVMvYnVpbGQvY29uZmlnL3Byb3h5LnRzXCI7aW1wb3J0IHR5cGUgeyBQcm94eU9wdGlvbnMgfSBmcm9tICd2aXRlJztcbmltcG9ydCB7IGNyZWF0ZVNlcnZpY2VDb25maWcgfSBmcm9tICcuLi8uLi9zcmMvdXRpbHMvc2VydmljZSc7XG5cbi8qKlxuICogU2V0IGh0dHAgcHJveHlcbiAqXG4gKiBAcGFyYW0gZW52IC0gVGhlIGN1cnJlbnQgZW52XG4gKiBAcGFyYW0gaXNEZXYgLSBJcyBkZXZlbG9wbWVudCBlbnZpcm9ubWVudFxuICovXG5cbi8vIFx1NTIxQlx1NUVGQSBWaXRlIFx1NjcwRFx1NTJBMVx1NEVFM1x1NzQwNlxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVZpdGVQcm94eShlbnY6IEVudi5JbXBvcnRNZXRhLCBpc0RldjogYm9vbGVhbikge1xuICAvLyBlbnYgXHU3M0FGXHU1ODgzXHU1M0Q4XHU5MUNGXHVGRjBDIFx1NjYyRlx1NEVDMFx1NEU0OFx1NzNBRlx1NTg4M1xuXG4gIGNvbnN0IGlzRW5hYmxlSHR0cFByb3h5ID0gaXNEZXYgJiYgZW52LlZJVEVfSFRUUF9QUk9YWSA9PT0gJ1knO1xuXG4gIGlmICghaXNFbmFibGVIdHRwUHJveHkpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgY29uc3QgeyBiYXNlVVJMLCBwcm94eVBhdHRlcm4sIG90aGVyIH0gPSBjcmVhdGVTZXJ2aWNlQ29uZmlnKGVudik7XG5cbiAgY29uc3QgcHJveHk6IFJlY29yZDxzdHJpbmcsIFByb3h5T3B0aW9ucz4gPSBjcmVhdGVQcm94eUl0ZW0oeyBiYXNlVVJMLCBwcm94eVBhdHRlcm4gfSk7XG5cbiAgY29uc29sZS5sb2coJ1x1NUY1M1x1NTI0RFx1NEVFM1x1NzQwNlx1OTg3OVx1NzZFRScsIHByb3h5KTtcblxuICBvdGhlci5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgIE9iamVjdC5hc3NpZ24ocHJveHksIGNyZWF0ZVByb3h5SXRlbShpdGVtKSk7XG4gIH0pO1xuXG4gIHJldHVybiBwcm94eTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlUHJveHlJdGVtKGl0ZW06IEFwcC5TZXJ2aWNlLlNlcnZpY2VDb25maWdJdGVtKSB7XG4gIGNvbnNvbGUubG9nKCdjcmVhdGVQcm94eUl0ZW0gXHU1MjFCXHU1RUZBXHU0RUUzXHU3NDA2XHU5ODc5XHU3NkVFJywgaXRlbSk7XG5cbiAgY29uc3QgcHJveHk6IFJlY29yZDxzdHJpbmcsIFByb3h5T3B0aW9ucz4gPSB7fTtcblxuICBwcm94eVtpdGVtLnByb3h5UGF0dGVybl0gPSB7XG4gICAgdGFyZ2V0OiBpdGVtLmJhc2VVUkwsXG4gICAgY2hhbmdlT3JpZ2luOiB0cnVlLFxuICAgIHJld3JpdGU6IHBhdGggPT4gcGF0aC5yZXBsYWNlKG5ldyBSZWdFeHAoYF4ke2l0ZW0ucHJveHlQYXR0ZXJufWApLCAnJylcbiAgfTtcblxuICByZXR1cm4gcHJveHk7XG59XG4iLCAiY29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2Rpcm5hbWUgPSBcIkU6XFxcXGdpdGxhYldvcmtzcGFjZVxcXFxBSVx1NjNBOFx1NzQwNlx1NUU3M1x1NTNGMFxcXFxBSS1TWVNcXFxcYnVpbGRcXFxcY29uZmlnXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ZpbGVuYW1lID0gXCJFOlxcXFxnaXRsYWJXb3Jrc3BhY2VcXFxcQUlcdTYzQThcdTc0MDZcdTVFNzNcdTUzRjBcXFxcQUktU1lTXFxcXGJ1aWxkXFxcXGNvbmZpZ1xcXFx0aW1lLnRzXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ltcG9ydF9tZXRhX3VybCA9IFwiZmlsZTovLy9FOi9naXRsYWJXb3Jrc3BhY2UvQUklRTYlOEUlQTglRTclOTAlODYlRTUlQjklQjMlRTUlOEYlQjAvQUktU1lTL2J1aWxkL2NvbmZpZy90aW1lLnRzXCI7aW1wb3J0IGRheWpzIGZyb20gJ2RheWpzJztcbmltcG9ydCB1dGMgZnJvbSAnZGF5anMvcGx1Z2luL3V0Yyc7XG5pbXBvcnQgdGltZXpvbmUgZnJvbSAnZGF5anMvcGx1Z2luL3RpbWV6b25lJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEJ1aWxkVGltZSgpIHtcbiAgZGF5anMuZXh0ZW5kKHV0Yyk7XG4gIGRheWpzLmV4dGVuZCh0aW1lem9uZSk7XG5cbiAgY29uc3QgYnVpbGRUaW1lID0gZGF5anMudHooRGF0ZS5ub3coKSwgJ0FzaWEvU2hhbmdoYWknKS5mb3JtYXQoJ1lZWVktTU0tREQgSEg6bW06c3MnKTtcblxuICByZXR1cm4gYnVpbGRUaW1lO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjtBQUEwVCxPQUFPQSxjQUFhO0FBQzlVLFNBQVMsS0FBSyxxQkFBcUI7QUFDbkMsU0FBUyxjQUFjLGVBQWU7OztBQ0R0QyxPQUFPLFNBQVM7QUFDaEIsT0FBTyxZQUFZO0FBQ25CLE9BQU8saUJBQWlCO0FBQ3hCLE9BQU8sY0FBYzs7O0FDSHJCLE9BQU8sc0JBQXNCO0FBR3RCLFNBQVMscUJBQXFC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QUFNO0FBQUEsTUFDTixNQUFNO0FBQUE7QUFBQSxNQUVOLE9BQU87QUFBQSxRQUNMLEdBQUcsZ0JBQWdCLFNBQVMsVUFBVSxZQUFZLE9BQU87QUFBQTtBQUFBO0FBQUEsUUFHekQsT0FBTztBQUFBLFVBQ0wsUUFBUTtBQUFBLFVBQ1IsY0FBYztBQUFBLFFBQ2hCO0FBQUEsTUFDRjtBQUFBLE1BQ0EsSUFBSTtBQUFBLFFBQ0YsY0FBYztBQUFBLE1BQ2hCO0FBQUEsSUFDRjtBQUFBLElBQ0EsU0FBUztBQUFBLE1BQ1AsTUFBTTtBQUFBLElBQ1I7QUFBQSxJQUNBLE9BQU87QUFBQSxNQUNMLHNCQUFzQjtBQUFBLE1BQ3RCLFdBQVcsUUFBUSxvQkFBb0I7QUFBQSxNQUN2QyxpQkFBaUI7QUFBQSxRQUNmLGdCQUFnQjtBQUFBLE1BQ2xCO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFDRixDQUFDOyIsCiAgIm5hbWVzIjogWyJwcm9jZXNzIiwgInByb2Nlc3MiLCAicGF0aCIsICJGaWxlU3lzdGVtSWNvbkxvYWRlciIsICJwYXRoIiwgInByb2Nlc3MiLCAiRmlsZVN5c3RlbUljb25Mb2FkZXIiLCAicGF0aCIsICJwcm9jZXNzIl0KfQo=
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment