diff --git a/packages/horizon-router/build.js b/packages/horizon-router/build.js index 02251d4e..0aa2e7b2 100644 --- a/packages/horizon-router/build.js +++ b/packages/horizon-router/build.js @@ -1,9 +1,10 @@ import path from 'path'; +import fs from 'fs'; import { fileURLToPath } from 'url'; import babel from '@rollup/plugin-babel'; import nodeResolve from '@rollup/plugin-node-resolve'; import execute from 'rollup-plugin-execute'; -import fs from 'fs'; +import { terser } from 'rollup-plugin-terser'; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); @@ -19,71 +20,96 @@ if (!fs.existsSync(path.join(output, 'connectRouter'))) { fs.mkdirSync(path.join(output, 'connectRouter'), { recursive: true }); } -const routerBuildConfig = { - input: { router: routerEntry }, - output: [ +const routerBuildConfig = mode => { + const prod = mode.startsWith('prod'); + const outputList = [ { - dir: path.resolve(output, 'router/cjs'), - sourcemap: 'inline', + file: path.join(output, `router/cjs/router.${prod ? 'min.' : ''}js`), + sourcemap: 'true', format: 'cjs', }, { - dir: path.resolve(output, 'router/esm'), - sourcemap: 'inline', - format: 'esm', + file: path.join(output, `router/umd/router.${prod ? 'min.' : ''}js`), + name: `HorizonRouter`, + sourcemap: 'true', + format: 'umd', }, - ], - plugins: [ - nodeResolve({ - extensions, - modulesOnly: true, - }), - babel({ - exclude: 'node_modules/**', - configFile: path.join(__dirname, '/babel.config.js'), - babelHelpers: 'runtime', - extensions, - }), - execute('npm run build-types-router'), - ], + ]; + if (!prod) { + outputList.push({ + file: path.join(output, `router/esm/router.js`), + sourcemap: 'true', + format: 'esm', + }); + } + return { + input: routerEntry, + output: outputList, + plugins: [ + nodeResolve({ + extensions, + modulesOnly: true, + }), + babel({ + exclude: 'node_modules/**', + configFile: path.join(__dirname, '/babel.config.js'), + babelHelpers: 'runtime', + extensions, + }), + execute('npm run build-types-router'), + prod && terser(), + ], + }; }; -const connectRouterConfig = { - input: { connectRouter: connectRouterEntry }, - output: [ +const connectRouterConfig = mode => { + const prod = mode.startsWith('prod'); + const outputList = [ { - dir: path.resolve(output, 'connectRouter/cjs'), - sourcemap: 'inline', + file: path.join(output, `connectRouter/cjs/connectRouter.${prod ? 'min.' : ''}js`), + sourcemap: 'true', format: 'cjs', }, { - dir: path.resolve(output, 'connectRouter/esm'), - sourcemap: 'inline', - format: 'esm', + file: path.join(output, `connectRouter/umd/connectRouter.${prod ? 'min.' : ''}js`), + name: 'HorizonRouter', + sourcemap: 'true', + format: 'umd', }, - ], - plugins: [ - nodeResolve({ - extensions, - modulesOnly: true, - }), - babel({ - exclude: 'node_modules/**', - configFile: path.join(__dirname, '/babel.config.js'), - babelHelpers: 'runtime', - extensions, - }), - execute('npm run build-types-all'), - copyFiles([ - { - from: path.join(__dirname, 'src/configs/package.json'), - to: path.join(output, '/connectRouter/package.json'), - }, - ]), - ], + ]; + if (!prod) { + outputList.push({ + file: path.join(output, `connectRouter/esm/connectRouter.js`), + sourcemap: 'true', + format: 'esm', + }); + } + return { + input: connectRouterEntry, + output: outputList, + plugins: [ + nodeResolve({ + extensions, + modulesOnly: true, + }), + babel({ + exclude: 'node_modules/**', + configFile: path.join(__dirname, '/babel.config.js'), + babelHelpers: 'runtime', + extensions, + }), + execute('npm run build-types-all'), + prod && terser(), + copyFiles([ + { + from: path.join(__dirname, 'src/configs/package.json'), + to: path.join(output, '/connectRouter/package.json'), + }, + ]), + ], + }; }; - function copyFiles(copyPairs) { return { name: 'copy-files', @@ -96,5 +122,9 @@ function copyFiles(copyPairs) { }; } - -export default [routerBuildConfig, connectRouterConfig]; +export default [ + routerBuildConfig('dev'), + routerBuildConfig('prod'), + connectRouterConfig('dev'), + connectRouterConfig('prod'), +]; diff --git a/packages/horizon-router/connectRouter/@types/connect-router/actions.d.ts b/packages/horizon-router/connectRouter/@types/connect-router/actions.d.ts deleted file mode 100644 index 965f7ee7..00000000 --- a/packages/horizon-router/connectRouter/@types/connect-router/actions.d.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { Action, Path } from '../history/types'; -type Location = Partial; -export declare enum ActionName { - LOCATION_CHANGE = "$horizon-router/LOCATION_CHANGE", - CALL_HISTORY_METHOD = "$horizon-router/CALL_HISTORY_METHOD" -} -export type ActionMessage = { - type: ActionName.LOCATION_CHANGE; - payload: { - location: Location; - action: Action; - isFirstRendering: boolean; - }; -} | { - type: ActionName.CALL_HISTORY_METHOD; - payload: { - method: string; - args: any; - }; -}; -export declare const onLocationChanged: (location: Location, action: Action, isFirstRendering?: boolean) => ActionMessage; -export declare const push: (...args: any) => ActionMessage; -export declare const replace: (...args: any) => ActionMessage; -export declare const go: (...args: any) => ActionMessage; -export {}; diff --git a/packages/horizon-router/connectRouter/@types/connect-router/dispatch.d.ts b/packages/horizon-router/connectRouter/@types/connect-router/dispatch.d.ts deleted file mode 100644 index 48424699..00000000 --- a/packages/horizon-router/connectRouter/@types/connect-router/dispatch.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { ActionMessage } from './actions'; -import { History } from '../history/types'; -export declare function routerMiddleware(history: History): (_: any) => (next: any) => (action: ActionMessage) => any; diff --git a/packages/horizon-router/connectRouter/@types/connect-router/index.d.ts b/packages/horizon-router/connectRouter/@types/connect-router/index.d.ts deleted file mode 100644 index 38b43283..00000000 --- a/packages/horizon-router/connectRouter/@types/connect-router/index.d.ts +++ /dev/null @@ -1,11 +0,0 @@ -export { getConnectedRouter } from './connectedRouter'; -export declare const connectRouter: (history: import("../router").History) => (state?: { - location: Partial> & { - query?: Record; - }; - action: import("../history/types").Action; -}, { type, payload }?: { - type?: import("./actions").ActionName; - payload?: any; -}) => any; -export { routerMiddleware } from './dispatch'; diff --git a/packages/horizon-router/connectRouter/@types/connect-router/reducer.d.ts b/packages/horizon-router/connectRouter/@types/connect-router/reducer.d.ts deleted file mode 100644 index 3de2b851..00000000 --- a/packages/horizon-router/connectRouter/@types/connect-router/reducer.d.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { ActionName } from './actions'; -import { Action, History } from '../history/types'; -import { Location } from '../router'; -type LocationWithQuery = Partial & { - query?: Record; -}; -type InitRouterState = { - location: LocationWithQuery; - action: Action; -}; -type Payload = { - type?: ActionName; - payload?: any; -}; -export declare function createConnectRouter(): (history: History) => (state?: InitRouterState, { type, payload }?: Payload) => any; -export {}; diff --git a/packages/horizon-router/connectRouter/@types/history/baseHistory.d.ts b/packages/horizon-router/connectRouter/@types/history/baseHistory.d.ts deleted file mode 100644 index 74892c1e..00000000 --- a/packages/horizon-router/connectRouter/@types/history/baseHistory.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { HistoryProps, Listener, Navigation, Prompt } from './types'; -import transitionManager from './transitionManager'; -export declare function getBaseHistory(transitionManager: transitionManager, setListener: (delta: number) => void, browserHistory: History): { - go: (step: number) => void; - goBack: () => void; - goForward: () => void; - listen: (listener: Listener) => () => void; - block: (prompt?: Prompt) => () => void; - getUpdateStateFunc: (historyProps: HistoryProps) => (nextState: Navigation | undefined) => void; -}; diff --git a/packages/horizon-router/connectRouter/@types/history/browerHistory.d.ts b/packages/horizon-router/connectRouter/@types/history/browerHistory.d.ts deleted file mode 100644 index 000d1ad2..00000000 --- a/packages/horizon-router/connectRouter/@types/history/browerHistory.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { BaseOption, DefaultStateType, History } from './types'; -export type BrowserHistoryOption = { - /** - * forceRefresh为True时跳转时会强制刷新页面 - */ - forceRefresh?: boolean; -} & BaseOption; -export declare function createBrowserHistory(options?: BrowserHistoryOption): History; diff --git a/packages/horizon-router/connectRouter/@types/history/dom.d.ts b/packages/horizon-router/connectRouter/@types/history/dom.d.ts deleted file mode 100644 index b889eef2..00000000 --- a/packages/horizon-router/connectRouter/@types/history/dom.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -export declare function isBrowser(): boolean; -export declare function getDefaultConfirmation(message: string, callBack: (result: boolean) => void): void; -export declare function isSupportHistory(): boolean; -export declare function isSupportsPopState(): boolean; diff --git a/packages/horizon-router/connectRouter/@types/history/hashHistory.d.ts b/packages/horizon-router/connectRouter/@types/history/hashHistory.d.ts deleted file mode 100644 index a8cf1959..00000000 --- a/packages/horizon-router/connectRouter/@types/history/hashHistory.d.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { BaseOption, DefaultStateType, History } from './types'; -export type urlHashType = 'slash' | 'noslash'; -type HashHistoryOption = { - hashType?: urlHashType; -} & BaseOption; -export declare function createHashHistory(option?: HashHistoryOption): History; -export {}; diff --git a/packages/horizon-router/connectRouter/@types/history/transitionManager.d.ts b/packages/horizon-router/connectRouter/@types/history/transitionManager.d.ts deleted file mode 100644 index 45edc03f..00000000 --- a/packages/horizon-router/connectRouter/@types/history/transitionManager.d.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Action, CallBackFunc, ConfirmationFunc, Listener, Location, Navigation, Prompt, TManager } from './types'; -declare class TransitionManager implements TManager { - private prompt; - private listeners; - constructor(); - setPrompt(prompt: Prompt): () => void; - addListener(func: Listener): () => void; - notifyListeners(args: Navigation): void; - confirmJumpTo(location: Location, action: Action, userConfirmationFunc: ConfirmationFunc, callBack: CallBackFunc): void; -} -export default TransitionManager; diff --git a/packages/horizon-router/connectRouter/@types/history/types.d.ts b/packages/horizon-router/connectRouter/@types/history/types.d.ts deleted file mode 100644 index 6a8a8636..00000000 --- a/packages/horizon-router/connectRouter/@types/history/types.d.ts +++ /dev/null @@ -1,56 +0,0 @@ -export type BaseOption = { - basename?: string; - getUserConfirmation?: ConfirmationFunc; -}; -export interface HistoryProps { - readonly action: Action; - readonly location: Location; - length: number; -} -export interface History extends HistoryProps { - createHref(path: Partial): string; - push(to: To, state?: T): void; - replace(to: To, state?: T): void; - listen(listener: Listener): () => void; - block(prompt: Prompt): () => void; - go(index: number): void; - goBack(): void; - goForward(): void; -} -export declare enum Action { - pop = "POP", - push = "PUSH", - replace = "REPLACE" -} -export declare enum EventType { - PopState = "popstate", - HashChange = "hashchange" -} -export type Path = { - pathname: string; - search: string; - hash: string; -}; -export type HistoryState = { - state?: T; - key: string; -}; -export type DefaultStateType = unknown; -export type Location = Path & HistoryState; -export type To = string | Partial; -export interface Listener { - (navigation: Navigation): void; -} -export interface Navigation { - action: Action; - location: Location; -} -export type Prompt = string | boolean | null | ((location: Location, action: Action) => void); -export type CallBackFunc = (isJump: boolean) => void; -export type ConfirmationFunc = (message: string, callBack: CallBackFunc) => void; -export interface TManager { - setPrompt(next: Prompt): () => void; - addListener(func: (navigation: Navigation) => void): () => void; - notifyListeners(args: Navigation): void; - confirmJumpTo(location: Location, action: Action, userConfirmationFunc: ConfirmationFunc, callBack: CallBackFunc): void; -} diff --git a/packages/horizon-router/connectRouter/@types/history/utils.d.ts b/packages/horizon-router/connectRouter/@types/history/utils.d.ts deleted file mode 100644 index adee264f..00000000 --- a/packages/horizon-router/connectRouter/@types/history/utils.d.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { Action, Location, Path, To } from './types'; -export declare function createPath(path: Partial): string; -export declare function parsePath(url: string): Partial; -export declare function createLocation(current: string | Location, to: To, state?: S, key?: string): Readonly>; -export declare function isLocationEqual(p1: Partial, p2: Partial): boolean; -export declare function addHeadSlash(path: string): string; -export declare function stripHeadSlash(path: string): string; -export declare function normalizeSlash(path: string): string; -export declare function hasBasename(path: string, prefix: string): Boolean; -export declare function stripBasename(path: string, prefix: string): string; -export declare function createMemoryRecord(initVal: S, fn: (arg: S) => T): { - getDelta: (to: S, form: S) => number; - addRecord: (current: S, newRecord: S, action: Action) => void; -}; diff --git a/packages/horizon-router/connectRouter/@types/history/waring.d.ts b/packages/horizon-router/connectRouter/@types/history/waring.d.ts deleted file mode 100644 index 18f09cb7..00000000 --- a/packages/horizon-router/connectRouter/@types/history/waring.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -declare function warning(condition: any, message: string): void; -export default warning; diff --git a/packages/horizon-router/connectRouter/@types/router/BrowserRouter.d.ts b/packages/horizon-router/connectRouter/@types/router/BrowserRouter.d.ts deleted file mode 100644 index b91dd697..00000000 --- a/packages/horizon-router/connectRouter/@types/router/BrowserRouter.d.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { ReactNode } from 'react'; -import { ConfirmationFunc } from '../history/types'; -export type BaseRouterProps = { - basename: string; - getUserConfirmation: ConfirmationFunc; - children?: ReactNode; -}; -export type BrowserRouterProps = BaseRouterProps & { - forceRefresh: boolean; -}; -declare function BrowserRouter

>(props: P): JSX.Element; -export default BrowserRouter; diff --git a/packages/horizon-router/connectRouter/@types/router/HashRouter.d.ts b/packages/horizon-router/connectRouter/@types/router/HashRouter.d.ts deleted file mode 100644 index ff09ad81..00000000 --- a/packages/horizon-router/connectRouter/@types/router/HashRouter.d.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { BaseRouterProps } from './BrowserRouter'; -import { urlHashType } from '../history/hashHistory'; -export type HashRouterProps = BaseRouterProps & { - hashType: urlHashType; -}; -declare function HashRouter

>(props: P): JSX.Element; -export default HashRouter; diff --git a/packages/horizon-router/connectRouter/@types/router/Link.d.ts b/packages/horizon-router/connectRouter/@types/router/Link.d.ts deleted file mode 100644 index 48ec51d8..00000000 --- a/packages/horizon-router/connectRouter/@types/router/Link.d.ts +++ /dev/null @@ -1,18 +0,0 @@ -import * as React from 'react'; -import { Location } from './index'; -export type LinkProps = { - component?: React.ComponentType; - to: Partial | string | ((location: Location) => string | Partial); - replace?: boolean; - tag?: string; - /** - * @deprecated - * React16以后不再需要该属性 - **/ - innerRef?: React.Ref; -} & React.AnchorHTMLAttributes; -declare function Link

(props: P): React.DOMElement<{ - href: string; - onClick: (event: React.MouseEvent) => void; -} & Omit, Element>; -export default Link; diff --git a/packages/horizon-router/connectRouter/@types/router/NavLink.d.ts b/packages/horizon-router/connectRouter/@types/router/NavLink.d.ts deleted file mode 100644 index a7181526..00000000 --- a/packages/horizon-router/connectRouter/@types/router/NavLink.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -import type { LinkProps } from './Link'; -import { Location } from './index'; -import { Matched } from './matcher/parser'; -type NavLinkProps = { - to: Partial | string | ((location: Location) => string | Partial); - isActive?: (match: Matched | null, location: Location) => boolean; - [key: string]: any; -} & LinkProps; -declare function NavLink

(props: P): JSX.Element; -export default NavLink; diff --git a/packages/horizon-router/connectRouter/@types/router/Prompt.d.ts b/packages/horizon-router/connectRouter/@types/router/Prompt.d.ts deleted file mode 100644 index 84752997..00000000 --- a/packages/horizon-router/connectRouter/@types/router/Prompt.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { Location } from './index'; -import { Action } from '../history/types'; -type PromptProps = { - message?: string | ((location: Partial, action: Action) => void); - when?: boolean | ((location: Partial) => boolean); -}; -declare function Prompt

(props: P): JSX.Element; -export default Prompt; diff --git a/packages/horizon-router/connectRouter/@types/router/Redirect.d.ts b/packages/horizon-router/connectRouter/@types/router/Redirect.d.ts deleted file mode 100644 index e1569e31..00000000 --- a/packages/horizon-router/connectRouter/@types/router/Redirect.d.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { Matched } from './matcher/parser'; -import { Location } from './index'; -export type RedirectProps = { - to: string | Partial; - push?: boolean; - path?: string; - from?: string; - exact?: boolean; - strict?: boolean; - readonly computed?: Matched | null; -}; -declare function Redirect

(props: P): JSX.Element; -export default Redirect; diff --git a/packages/horizon-router/connectRouter/@types/router/Route.d.ts b/packages/horizon-router/connectRouter/@types/router/Route.d.ts deleted file mode 100644 index b8939efb..00000000 --- a/packages/horizon-router/connectRouter/@types/router/Route.d.ts +++ /dev/null @@ -1,23 +0,0 @@ -import * as React from 'react'; -import { History, Location } from './index'; -import { Matched } from './matcher/parser'; -import { GetURLParams } from './matcher/types'; -export type RouteComponentProps

= {}, S = unknown> = RouteChildrenProps; -export type RouteChildrenProps

= {}, S = unknown> = { - history: History; - location: Location; - match: Matched

| null; -}; -export type RouteProps

= {}, Path extends string = string> = { - location?: Location; - component?: React.ComponentType> | React.ComponentType | undefined; - children?: ((props: RouteChildrenProps

) => React.ReactNode) | React.ReactNode; - render?: (props: RouteComponentProps

) => React.ReactNode; - path?: Path | Path[]; - exact?: boolean; - sensitive?: boolean; - strict?: boolean; - computed?: Matched

; -}; -declare function Route = GetURLParams>(props: RouteProps): JSX.Element; -export default Route; diff --git a/packages/horizon-router/connectRouter/@types/router/Router.d.ts b/packages/horizon-router/connectRouter/@types/router/Router.d.ts deleted file mode 100644 index 53751b67..00000000 --- a/packages/horizon-router/connectRouter/@types/router/Router.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -import * as React from 'react'; -import { History } from '../history/types'; -export type RouterProps = { - history: History; - children?: React.ReactNode; -}; -declare function Router

(props: P): JSX.Element; -export default Router; diff --git a/packages/horizon-router/connectRouter/@types/router/Switch.d.ts b/packages/horizon-router/connectRouter/@types/router/Switch.d.ts deleted file mode 100644 index 53ea8c32..00000000 --- a/packages/horizon-router/connectRouter/@types/router/Switch.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -import * as React from 'react'; -import { Location } from './index'; -export type SwitchProps = { - location?: Location; - children?: React.ReactNode; -}; -declare function Switch

(props: P): React.ReactElement | null; -export default Switch; diff --git a/packages/horizon-router/connectRouter/@types/router/__tests__/router.test.d.ts b/packages/horizon-router/connectRouter/@types/router/__tests__/router.test.d.ts deleted file mode 100644 index 7b0828bf..00000000 --- a/packages/horizon-router/connectRouter/@types/router/__tests__/router.test.d.ts +++ /dev/null @@ -1 +0,0 @@ -import '@testing-library/jest-dom'; diff --git a/packages/horizon-router/connectRouter/@types/router/__tests__/test_app.d.ts b/packages/horizon-router/connectRouter/@types/router/__tests__/test_app.d.ts deleted file mode 100644 index c36ab167..00000000 --- a/packages/horizon-router/connectRouter/@types/router/__tests__/test_app.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { History, Location } from '../index'; -export declare let historyHook: History; -export declare let locationHook: Location; -export declare const LocationDisplay: () => JSX.Element; -export declare const Test_Demo: () => JSX.Element; -export declare const Test_Demo2: () => JSX.Element; -export declare const Test_Demo3: () => JSX.Element; -export declare const Test_Demo4: () => JSX.Element; diff --git a/packages/horizon-router/connectRouter/@types/router/context.d.ts b/packages/horizon-router/connectRouter/@types/router/context.d.ts deleted file mode 100644 index 8a39bd8c..00000000 --- a/packages/horizon-router/connectRouter/@types/router/context.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -/// -import { History, Location } from './index'; -import { Matched } from './matcher/parser'; -export type RouterContextValue = { - history: History; - location: Location; - match: Matched | null; -}; -declare const RouterContext: import("react").Context; -export default RouterContext; diff --git a/packages/horizon-router/connectRouter/@types/router/hooks.d.ts b/packages/horizon-router/connectRouter/@types/router/hooks.d.ts deleted file mode 100644 index 7ff53865..00000000 --- a/packages/horizon-router/connectRouter/@types/router/hooks.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { Matched, Params } from './matcher/parser'; -import { History } from '../history/types'; -import { Location } from './index'; -declare function useHistory(): History; -declare function useLocation(): Location; -declare function useParams

(): Params

| {}; -declare function useRouteMatch

(path?: string): Matched

| null; -export { useHistory, useLocation, useParams, useRouteMatch }; diff --git a/packages/horizon-router/connectRouter/@types/router/index.d.ts b/packages/horizon-router/connectRouter/@types/router/index.d.ts deleted file mode 100644 index 01659cc3..00000000 --- a/packages/horizon-router/connectRouter/@types/router/index.d.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { Location as HLocation } from '../history/types'; -type Location = Omit, 'key'>; -export { Location }; -export type { History } from '../history/types'; -export { createBrowserHistory } from '../history/browerHistory'; -export { createHashHistory } from '../history/hashHistory'; -export { default as __RouterContext } from './context'; -export { matchPath, generatePath } from './matcher/parser'; -export { useHistory, useLocation, useParams, useRouteMatch } from './hooks'; -export { default as Route } from './Route'; -export { default as Router } from './Router'; -export { default as Switch } from './Switch'; -export { default as Redirect } from './Redirect'; -export { default as Prompt } from './Prompt'; -export { default as withRouter } from './withRouter'; -export { default as HashRouter } from './HashRouter'; -export { default as BrowserRouter } from './BrowserRouter'; -export { default as Link } from './Link'; -export { default as NavLink } from './NavLink'; -export type { RouteComponentProps, RouteChildrenProps, RouteProps } from './Route'; diff --git a/packages/horizon-router/connectRouter/@types/router/index2.d.ts b/packages/horizon-router/connectRouter/@types/router/index2.d.ts deleted file mode 100644 index 77801836..00000000 --- a/packages/horizon-router/connectRouter/@types/router/index2.d.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { Location as HLocation } from '../history/types'; -type Location = Omit, 'key'>; -export { Location }; -export type { History } from '../history/types'; -export { createBrowserHistory } from '../history/browerHistory'; -export { createHashHistory } from '../history/hashHistory'; -export { default as __RouterContext } from './context'; -export { matchPath, generatePath } from './matcher/parser'; -export { useHistory, useLocation, useParams, useRouteMatch } from './hooks'; -export { default as Route } from './Route'; -export { default as Router } from './Router'; -export { default as Switch } from './Switch'; -export { default as Redirect } from './Redirect'; -export { default as Prompt } from './Prompt'; -export { default as withRouter } from './withRouter'; -export { default as HashRouter } from './HashRouter'; -export { default as BrowserRouter } from './BrowserRouter'; -export { default as Link } from './Link'; -export { default as NavLink } from './NavLink'; -export type { RouteComponentProps, RouteChildrenProps, RouteProps } from './Route'; -export { connectRouter, routerMiddleware } from '../connect-router'; -export declare const ConnectedRouter: any; -export declare const ConnectedHRouter: any; diff --git a/packages/horizon-router/connectRouter/@types/router/lifeCycleHook.d.ts b/packages/horizon-router/connectRouter/@types/router/lifeCycleHook.d.ts deleted file mode 100644 index 6837c2c0..00000000 --- a/packages/horizon-router/connectRouter/@types/router/lifeCycleHook.d.ts +++ /dev/null @@ -1,7 +0,0 @@ -export type LifeCycleProps = { - onMount?: () => void; - onUpdate?: (prevProps?: LifeCycleProps) => void; - onUnmount?: () => void; - data?: any; -}; -export declare function LifeCycle(props: LifeCycleProps): any; diff --git a/packages/horizon-router/connectRouter/@types/router/matcher/__tests__/parser.test.d.ts b/packages/horizon-router/connectRouter/@types/router/matcher/__tests__/parser.test.d.ts deleted file mode 100644 index cb0ff5c3..00000000 --- a/packages/horizon-router/connectRouter/@types/router/matcher/__tests__/parser.test.d.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/packages/horizon-router/connectRouter/@types/router/matcher/__tests__/utils.test.d.ts b/packages/horizon-router/connectRouter/@types/router/matcher/__tests__/utils.test.d.ts deleted file mode 100644 index cb0ff5c3..00000000 --- a/packages/horizon-router/connectRouter/@types/router/matcher/__tests__/utils.test.d.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/packages/horizon-router/connectRouter/@types/router/matcher/lexer.d.ts b/packages/horizon-router/connectRouter/@types/router/matcher/lexer.d.ts deleted file mode 100644 index 6137743a..00000000 --- a/packages/horizon-router/connectRouter/@types/router/matcher/lexer.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -import { Token } from './types'; -export declare function lexer(path: string): Token[]; diff --git a/packages/horizon-router/connectRouter/@types/router/matcher/parser.d.ts b/packages/horizon-router/connectRouter/@types/router/matcher/parser.d.ts deleted file mode 100644 index ee672cf9..00000000 --- a/packages/horizon-router/connectRouter/@types/router/matcher/parser.d.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { GetURLParams, Parser, ParserOption } from './types'; -export type Params

= { - [K in keyof P]?: P[K]; -}; -export type Matched

= { - score: number[]; - params: Params

; - path: string; - url: string; - isExact: boolean; -}; -export declare function createPathParser(pathname: Str, option?: ParserOption): Parser>; -export declare function createPathParser

(pathname: string, option?: ParserOption): Parser

; -/** - * @description 依次使用pathname与pattern进行匹配,根据匹配分数取得分数最高结果 - */ -export declare function matchPath

(pathname: string, pattern: string | string[], option?: ParserOption): Matched

| null; -export declare function generatePath

(path: string, params: Params

): string; diff --git a/packages/horizon-router/connectRouter/@types/router/matcher/types.d.ts b/packages/horizon-router/connectRouter/@types/router/matcher/types.d.ts deleted file mode 100644 index 971fbe5b..00000000 --- a/packages/horizon-router/connectRouter/@types/router/matcher/types.d.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { Matched, Params } from './parser'; -export type Token = { - type: TokenType; - value: string; -}; -export declare enum TokenType { - Delimiter = "delimiter", - Static = "static", - Param = "param", - WildCard = "wildcard", - LBracket = "(", - RBracket = ")", - Pattern = "pattern" -} -export interface Parser

{ - regexp: RegExp; - keys: string[]; - parse(url: string): Matched

| null; - compile(params: Params

): string; -} -export type ParserOption = { - caseSensitive?: boolean; - strictMode?: boolean; - exact?: boolean; -}; -type ClearLeading = U extends `/${infer R}` ? ClearLeading : U; -type ClearTailing = U extends `${infer L}/` ? ClearTailing : U; -type ParseParam = Param extends `:${infer R}` ? { - [K in R]: string; -} : {}; -type MergeParams, OtherParam extends Record> = { - readonly [Key in keyof OneParam | keyof OtherParam]?: string; -}; -type ParseURLString = Str extends `${infer Param}/${infer Rest}` ? MergeParams, ParseURLString>> : ParseParam; -export type GetURLParams = ParseURLString>>; -export {}; diff --git a/packages/horizon-router/connectRouter/@types/router/matcher/utils.d.ts b/packages/horizon-router/connectRouter/@types/router/matcher/utils.d.ts deleted file mode 100644 index 8b739ae7..00000000 --- a/packages/horizon-router/connectRouter/@types/router/matcher/utils.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -/** - * @description 将url中的//转换为/ - */ -export declare function cleanPath(path: string): string; -export declare function scoreCompare(score1: number[], score2: number[]): number; -export declare function escapeStr(str: string): string; diff --git a/packages/horizon-router/connectRouter/@types/router/withRouter.d.ts b/packages/horizon-router/connectRouter/@types/router/withRouter.d.ts deleted file mode 100644 index b6c398cd..00000000 --- a/packages/horizon-router/connectRouter/@types/router/withRouter.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import * as React from 'react'; -declare function withRouter(Component: C): (props: any) => JSX.Element; -export default withRouter; diff --git a/packages/horizon-router/connectRouter/cjs/connectRouter.js b/packages/horizon-router/connectRouter/cjs/connectRouter.js deleted file mode 100644 index 645c43d3..00000000 --- a/packages/horizon-router/connectRouter/cjs/connectRouter.js +++ /dev/null @@ -1,1787 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, '__esModule', { value: true }); - -var React = require('react'); -var reactRedux = require('react-redux'); -var horizon = require('@cloudsop/horizon'); - -function _interopNamespace(e) { - if (e && e.__esModule) return e; - var n = Object.create(null); - if (e) { - Object.keys(e).forEach(function (k) { - if (k !== 'default') { - var d = Object.getOwnPropertyDescriptor(e, k); - Object.defineProperty(n, k, d.get ? d : { - enumerable: true, - get: function () { return e[k]; } - }); - } - }); - } - n["default"] = e; - return Object.freeze(n); -} - -var React__namespace = /*#__PURE__*/_interopNamespace(React); - -function _extends() { - _extends = Object.assign ? Object.assign.bind() : function (target) { - for (var i = 1; i < arguments.length; i++) { - var source = arguments[i]; - for (var key in source) { - if (Object.prototype.hasOwnProperty.call(source, key)) { - target[key] = source[key]; - } - } - } - return target; - }; - return _extends.apply(this, arguments); -} - -// 定义位置变化和history方法调用的Action type -var ActionName = /*#__PURE__*/function (ActionName) { - ActionName["LOCATION_CHANGE"] = "$horizon-router/LOCATION_CHANGE"; - ActionName["CALL_HISTORY_METHOD"] = "$horizon-router/CALL_HISTORY_METHOD"; - return ActionName; -}({}); - -// 定义Action的两种数据类型 - -var onLocationChanged = function (location, action) { - var isFirstRendering = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - return { - type: ActionName.LOCATION_CHANGE, - payload: { - location: location, - action: action, - isFirstRendering: isFirstRendering - } - }; -}; - -// 解析location对象,将其中的query参数解析并注入 -function injectQueryParams(location) { - if (location && location.query) { - return location; - } - var queryString = location && location.search; - if (!queryString) { - return _extends({}, location, { - query: {} - }); - } - var queryObject = {}; - var params = new URLSearchParams(queryString); - params.forEach(function (value, key) { - return queryObject[key] = value; - }); - return _extends({}, location, { - query: queryObject - }); -} -function createConnectRouter() { - // 初始化redux State - return function (history) { - var initRouterState = { - location: injectQueryParams(history.location), - action: history.action - }; - - // 定义connect-router对应的redux reducer函数 - return function () { - var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : initRouterState; - var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, - type = _ref.type, - payload = _ref.payload; - if (type === ActionName.LOCATION_CHANGE) { - var location = payload.location, - action = payload.action, - isFirstRendering = payload.isFirstRendering; - if (isFirstRendering) { - return state; - } - return _extends({}, state, { - location: injectQueryParams(location), - action: action - }); - } - return state; - }; - }; -} - -function isBrowser() { - return typeof window !== 'undefined' && window.document && typeof window.document.createElement === 'function'; -} -function getDefaultConfirmation(message, callBack) { - callBack(window.confirm(message)); -} - -// 判断浏览器是否支持pushState方法,pushState是browserHistory实现的基础 -function isSupportHistory() { - return isBrowser() && window.history && 'pushState' in window.history; -} - -// 判断浏览器是否支持PopState事件 -function isSupportsPopState() { - return window.navigator.userAgent.indexOf('Trident') === -1; -} - -var Action = /*#__PURE__*/function (Action) { - Action["pop"] = "POP"; - Action["push"] = "PUSH"; - Action["replace"] = "REPLACE"; - return Action; -}({}); -var EventType = /*#__PURE__*/function (EventType) { - EventType["PopState"] = "popstate"; - EventType["HashChange"] = "hashchange"; - return EventType; -}({}); - -function createPath(path) { - var search = path.search, - hash = path.hash; - var pathname = path.pathname || '/'; - if (search && search !== '?') { - pathname += search.startsWith('?') ? search : '?' + search; - } - if (hash && hash !== '#') { - pathname += hash.startsWith('#') ? hash : '#' + hash; - } - return pathname; -} -function parsePath(url) { - if (!url) { - return {}; - } - var parsedPath = {}; - var hashIdx = url.indexOf('#'); - if (hashIdx > -1) { - parsedPath.hash = url.substring(hashIdx); - url = url.substring(0, hashIdx); - } - var searchIdx = url.indexOf('?'); - if (searchIdx > -1) { - parsedPath.search = url.substring(searchIdx); - url = url.substring(0, searchIdx); - } - if (url) { - parsedPath.pathname = url; - } - return parsedPath; -} -function createLocation(current, to, state, key) { - var pathname = typeof current === 'string' ? current : current.pathname; - var urlObj = typeof to === 'string' ? parsePath(to) : to; - // 随机key长度取6 - var getRandKey = genRandomKey(6); - var location = _extends({ - pathname: pathname, - search: '', - hash: '', - state: state, - key: typeof key === 'string' ? key : getRandKey() - }, urlObj); - if (!location.pathname) { - location.pathname = '/'; - } - return location; -} -function isLocationEqual(p1, p2) { - return p1.pathname === p2.pathname && p1.search === p2.search && p1.hash === p2.hash; -} -function addHeadSlash(path) { - if (path[0] === '/') { - return path; - } - return '/' + path; -} -function stripHeadSlash(path) { - if (path[0] === '/') { - return path.substring(1); - } - return path; -} -function normalizeSlash(path) { - var tempPath = addHeadSlash(path); - if (tempPath[tempPath.length - 1] === '/') { - return tempPath.substring(0, tempPath.length - 1); - } - return tempPath; -} -function hasBasename(path, prefix) { - return path.toLowerCase().indexOf(prefix.toLowerCase()) === 0 && ['/', '?', '#', ''].includes(path.charAt(prefix.length)); -} -function stripBasename(path, prefix) { - return hasBasename(path, prefix) ? path.substring(prefix.length) : path; -} - -// 使用随机生成的Key记录被访问过的URL,当Block被被触发时利用delta值跳转到之前的页面 -function createMemoryRecord(initVal, fn) { - var visitedRecord = [fn(initVal)]; - function getDelta(to, form) { - var toIdx = visitedRecord.lastIndexOf(fn(to)); - if (toIdx === -1) { - toIdx = 0; - } - var fromIdx = visitedRecord.lastIndexOf(fn(form)); - if (fromIdx === -1) { - fromIdx = 0; - } - return toIdx - fromIdx; - } - function addRecord(current, newRecord, action) { - var curVal = fn(current); - var NewVal = fn(newRecord); - if (action === Action.push) { - var prevIdx = visitedRecord.lastIndexOf(curVal); - var newVisitedRecord = visitedRecord.slice(0, prevIdx + 1); - newVisitedRecord.push(NewVal); - visitedRecord = newVisitedRecord; - } - if (action === Action.replace) { - var _prevIdx = visitedRecord.lastIndexOf(curVal); - if (_prevIdx !== -1) { - visitedRecord[_prevIdx] = NewVal; - } - } - } - return { - getDelta: getDelta, - addRecord: addRecord - }; -} -function genRandomKey(length) { - var end = length + 2; - return function () { - return Math.random().toString(18).substring(2, end); - }; -} - -function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } -} - -function _typeof(obj) { - "@babel/helpers - typeof"; - - return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { - return typeof obj; - } : function (obj) { - return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; - }, _typeof(obj); -} - -function _toPrimitive(input, hint) { - if (_typeof(input) !== "object" || input === null) return input; - var prim = input[Symbol.toPrimitive]; - if (prim !== undefined) { - var res = prim.call(input, hint || "default"); - if (_typeof(res) !== "object") return res; - throw new TypeError("@@toPrimitive must return a primitive value."); - } - return (hint === "string" ? String : Number)(input); -} - -function _toPropertyKey(arg) { - var key = _toPrimitive(arg, "string"); - return _typeof(key) === "symbol" ? key : String(key); -} - -function _defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i]; - descriptor.enumerable = descriptor.enumerable || false; - descriptor.configurable = true; - if ("value" in descriptor) descriptor.writable = true; - Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); - } -} -function _createClass(Constructor, protoProps, staticProps) { - if (protoProps) _defineProperties(Constructor.prototype, protoProps); - if (staticProps) _defineProperties(Constructor, staticProps); - Object.defineProperty(Constructor, "prototype", { - writable: false - }); - return Constructor; -} - -function _createForOfIteratorHelper$1(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray$1(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function () {}; return { s: F, n: function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function (e) { throw e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function () { it = it.call(o); }, n: function () { var step = it.next(); normalCompletion = step.done; return step; }, e: function (e) { didErr = true; err = e; }, f: function () { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; } -function _unsupportedIterableToArray$1(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray$1(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray$1(o, minLen); } -function _arrayLikeToArray$1(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } -var TransitionManager = /*#__PURE__*/function () { - function TransitionManager() { - _classCallCheck(this, TransitionManager); - this.prompt = void 0; - this.listeners = void 0; - this.prompt = null; - this.listeners = []; - } - _createClass(TransitionManager, [{ - key: "setPrompt", - value: function setPrompt(prompt) { - var _this = this; - this.prompt = prompt; - - // 清除Prompt - return function () { - if (_this.prompt === prompt) { - _this.prompt = null; - } - }; - } - - // 使用发布订阅模式管理history的监听者 - }, { - key: "addListener", - value: function addListener(func) { - var _this2 = this; - var isActive = true; - var listener = function (args) { - if (isActive) { - func(args); - } - }; - this.listeners.push(listener); - return function () { - isActive = false; - // 移除对应的监听者 - _this2.listeners = _this2.listeners.filter(function (item) { - return item !== listener; - }); - }; - } - }, { - key: "notifyListeners", - value: function notifyListeners(args) { - var _iterator = _createForOfIteratorHelper$1(this.listeners), - _step; - try { - for (_iterator.s(); !(_step = _iterator.n()).done;) { - var listener = _step.value; - listener(args); - } - } catch (err) { - _iterator.e(err); - } finally { - _iterator.f(); - } - } - }, { - key: "confirmJumpTo", - value: function confirmJumpTo(location, action, userConfirmationFunc, callBack) { - if (this.prompt !== null) { - var result = typeof this.prompt === 'function' ? this.prompt(location, action) : this.prompt; - if (typeof result === 'string') { - typeof userConfirmationFunc === 'function' ? userConfirmationFunc(result, callBack) : callBack(true); - } else { - callBack(result !== false); - } - } else { - callBack(true); - } - } - }]); - return TransitionManager; -}(); - -function warning(condition, message) { - if (condition) { - if (console && typeof console.warn === 'function') { - console.warn(message); - } - } -} - -// 抽取BrowserHistory和HashHistory中相同的方法 -function getBaseHistory(transitionManager, setListener, browserHistory) { - function go(step) { - browserHistory.go(step); - } - function goBack() { - browserHistory.go(-1); - } - function goForward() { - browserHistory.go(1); - } - function listen(listener) { - var cancel = transitionManager.addListener(listener); - setListener(1); - return function () { - setListener(-1); - cancel(); - }; - } - var isBlocked = false; - function block() { - var prompt = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; - var unblock = transitionManager.setPrompt(prompt); - if (!isBlocked) { - setListener(1); - isBlocked = true; - } - return function () { - if (isBlocked) { - isBlocked = false; - setListener(-1); - } - unblock(); - }; - } - function getUpdateStateFunc(historyProps) { - return function (nextState) { - if (nextState) { - _extends(historyProps, nextState); - } - historyProps.length = browserHistory.length; - var args = { - location: historyProps.location, - action: historyProps.action - }; - transitionManager.notifyListeners(args); - }; - } - return { - go: go, - goBack: goBack, - goForward: goForward, - listen: listen, - block: block, - getUpdateStateFunc: getUpdateStateFunc - }; -} - -function createBrowserHistory() { - var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; - var supportHistory = isSupportHistory(); - var isSupportPopState = isSupportsPopState(); - var browserHistory = window.history; - var _options$forceRefresh = options.forceRefresh, - forceRefresh = _options$forceRefresh === void 0 ? false : _options$forceRefresh, - _options$getUserConfi = options.getUserConfirmation, - getUserConfirmation = _options$getUserConfi === void 0 ? getDefaultConfirmation : _options$getUserConfi; - var basename = options.basename ? normalizeSlash(options.basename) : ''; - var initLocation = getLocation(getHistoryState()); - var recordOperator = createMemoryRecord(initLocation, function (l) { - return l.key; - }); - var transitionManager = new TransitionManager(); - var _getBaseHistory = getBaseHistory(transitionManager, setListener, browserHistory), - go = _getBaseHistory.go, - goBack = _getBaseHistory.goBack, - goForward = _getBaseHistory.goForward, - listen = _getBaseHistory.listen, - block = _getBaseHistory.block, - getUpdateStateFunc = _getBaseHistory.getUpdateStateFunc; - var history = { - action: Action.pop, - length: browserHistory.length, - location: initLocation, - go: go, - goBack: goBack, - goForward: goForward, - listen: listen, - block: block, - push: push, - replace: replace, - createHref: createHref - }; - var updateState = getUpdateStateFunc(history); - function getHistoryState() { - return supportHistory ? window.history.state : {}; - } - function getLocation(historyState) { - var _window$location = window.location, - search = _window$location.search, - hash = _window$location.hash; - var _ref = historyState || {}, - key = _ref.key, - state = _ref.state; - var pathname = window.location.pathname; - pathname = basename ? stripBasename(pathname, basename) : pathname; - return createLocation('', { - pathname: pathname, - search: search, - hash: hash - }, state, key); - } - - // 拦截页面POP事件后,防止返回到的页面被重复拦截 - var forceJump = false; - function handlePopState(location) { - if (forceJump) { - forceJump = false; - updateState(undefined); - } else { - var action = Action.pop; - var callback = function (isJump) { - if (isJump) { - // 执行跳转行为 - updateState({ - action: action, - location: location - }); - } else { - revertPopState(location, history.location); - } - }; - transitionManager.confirmJumpTo(location, action, getUserConfirmation, callback); - } - } - function popStateListener(event) { - handlePopState(getLocation(event.state)); - } - function hashChangeListener() { - var location = getLocation(getHistoryState()); - handlePopState(location); - } - var listenerCount = 0; - function setListener(count) { - listenerCount += count; - if (listenerCount === 1 && count === 1) { - window.addEventListener(EventType.PopState, popStateListener); - if (!isSupportPopState) { - window.addEventListener(EventType.HashChange, hashChangeListener); - } - } else if (listenerCount === 0) { - window.removeEventListener(EventType.PopState, popStateListener); - if (!isSupportPopState) { - window.removeEventListener(EventType.HashChange, hashChangeListener); - } - } - } - - // 取消页面跳转并恢复到跳转前的页面 - function revertPopState(form, to) { - var delta = recordOperator.getDelta(to, form); - if (delta !== 0) { - go(delta); - forceJump = true; - } - } - function createHref(path) { - return basename + createPath(path); - } - function push(to, state) { - var action = Action.push; - var location = createLocation(history.location, to, state, undefined); - transitionManager.confirmJumpTo(location, action, getUserConfirmation, function (isJump) { - if (!isJump) { - return; - } - var href = createHref(location); - var key = location.key, - state = location.state; - if (supportHistory) { - if (forceRefresh) { - window.location.href = href; - } else { - browserHistory.pushState({ - key: key, - state: state - }, '', href); - recordOperator.addRecord(history.location, location, action); - updateState({ - action: action, - location: location - }); - } - } else { - warning(state !== undefined, 'Browser history cannot push state in browsers that do not support HTML5 history'); - window.location.href = href; - } - }); - } - function replace(to, state) { - var action = Action.replace; - var location = createLocation(history.location, to, state, undefined); - transitionManager.confirmJumpTo(location, action, getUserConfirmation, function (isJump) { - if (!isJump) { - return; - } - var href = createHref(location); - var key = location.key, - state = location.state; - if (supportHistory) { - if (forceRefresh) { - window.location.replace(href); - } else { - browserHistory.replaceState({ - key: key, - state: state - }, '', href); - recordOperator.addRecord(history.location, location, action); - updateState({ - action: action, - location: location - }); - } - } else { - warning(state !== undefined, 'Browser history cannot push state in browsers that do not support HTML5 history'); - window.location.replace(href); - } - }); - } - return history; -} - -// 获取#前的内容 -function stripHash(path) { - var idx = path.indexOf('#'); - return idx === -1 ? path : path.substring(0, idx); -} - -// 获取#后的内容 -function getHashContent(path) { - var idx = path.indexOf('#'); - return idx === -1 ? '' : path.substring(idx + 1); -} -function createHashHistory() { - var option = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; - var browserHistory = window.history; - var _option$hashType = option.hashType, - hashType = _option$hashType === void 0 ? 'slash' : _option$hashType, - _option$getUserConfir = option.getUserConfirmation, - getUserConfirmation = _option$getUserConfir === void 0 ? getDefaultConfirmation : _option$getUserConfir; - var basename = option.basename ? normalizeSlash(option.basename) : ''; - var pathDecoder = addHeadSlash; - var pathEncoder = hashType === 'slash' ? addHeadSlash : stripHeadSlash; - function getLocation() { - var hashPath = pathDecoder(getHashContent(window.location.hash)); - if (basename) { - hashPath = stripBasename(hashPath, basename); - } - return createLocation('', hashPath, undefined, 'default'); - } - var initLocation = getLocation(); - var memRecords = createMemoryRecord(initLocation, createPath); - var transitionManager = new TransitionManager(); - function createHref(location) { - var tag = document.querySelector('base'); - var base = tag && tag.getAttribute('href') ? stripHash(window.location.href) : ''; - return base + '#' + pathEncoder(basename + createPath(location)); - } - var forceNextPop = false; - var ignorePath = null; - var _getBaseHistory = getBaseHistory(transitionManager, setListener, browserHistory), - go = _getBaseHistory.go, - goBack = _getBaseHistory.goBack, - goForward = _getBaseHistory.goForward, - listen = _getBaseHistory.listen, - block = _getBaseHistory.block, - getUpdateStateFunc = _getBaseHistory.getUpdateStateFunc; - var history = { - action: Action.pop, - length: browserHistory.length, - location: initLocation, - go: go, - goBack: goBack, - goForward: goForward, - push: push, - replace: replace, - listen: listen, - block: block, - createHref: createHref - }; - var updateState = getUpdateStateFunc(history); - function push(to, state) { - warning(state !== undefined, 'Hash history does not support state, it will be ignored'); - var action = Action.push; - var location = createLocation(history.location, to, undefined, ''); - transitionManager.confirmJumpTo(location, action, getUserConfirmation, function (isJump) { - if (!isJump) { - return; - } - var path = createPath(location); - var encodedPath = pathEncoder(basename + path); - // 前后hash不一样才进行跳转 - if (getHashContent(window.location.href) !== encodedPath) { - ignorePath = encodedPath; - window.location.hash = encodedPath; - memRecords.addRecord(history.location, location, action); - updateState({ - action: action, - location: location - }); - } else { - updateState(undefined); - } - }); - } - function replace(to, state) { - warning(state !== undefined, 'Hash history does not support state, it will be ignored'); - var action = Action.replace; - var location = createLocation(history.location, to, undefined, ''); - transitionManager.confirmJumpTo(location, action, getUserConfirmation, function (isJump) { - if (!isJump) { - return; - } - var path = createPath(location); - var encodedPath = pathEncoder(basename + path); - if (getHashContent(window.location.href) !== encodedPath) { - ignorePath = path; - window.location.replace(stripHash(window.location.href) + '#' + encodedPath); - } - memRecords.addRecord(history.location, location, action); - updateState({ - action: action, - location: location - }); - }); - } - function handleHashChange() { - var hashPath = getHashContent(window.location.href); - var encodedPath = pathEncoder(hashPath); - if (hashPath !== encodedPath) { - window.location.replace(stripHash(window.location.href) + '#' + encodedPath); - } else { - var location = getLocation(); - var prevLocation = history.location; - if (!forceNextPop && isLocationEqual(location, prevLocation)) { - return; - } - if (ignorePath === createPath(location)) { - return; - } - ignorePath = null; - handlePopState(location); - } - } - function handlePopState(location) { - if (forceNextPop) { - forceNextPop = false; - updateState(undefined); - } else { - var action = Action.pop; - var callback = function (isJump) { - if (isJump) { - updateState({ - action: action, - location: location - }); - } else { - revertPopState(location); - } - }; - transitionManager.confirmJumpTo(location, action, getUserConfirmation, callback); - } - } - - // 在跳转行为被Block后,用History.go()跳转回之前的页面 - function revertPopState(form) { - var to = history.location; - var delta = memRecords.getDelta(to, form); - if (delta !== 0) { - go(delta); - forceNextPop = true; - } - } - var listenerCount = 0; - function setListener(delta) { - listenerCount += delta; - if (listenerCount === 1 && delta === 1) { - window.addEventListener(EventType.HashChange, handleHashChange); - } else if (listenerCount === 0) { - window.removeEventListener(EventType.HashChange, handleHashChange); - } - } - return history; -} - -function createNamedContext(name, defaultValue) { - var context = React.createContext(defaultValue); - context.displayName = name; - return context; -} -var RouterContext = createNamedContext('Router', {}); - -var TokenType = /*#__PURE__*/function (TokenType) { - TokenType["Delimiter"] = "delimiter"; - TokenType["Static"] = "static"; - TokenType["Param"] = "param"; - TokenType["WildCard"] = "wildcard"; - TokenType["LBracket"] = "("; - TokenType["RBracket"] = ")"; - TokenType["Pattern"] = "pattern"; - return TokenType; -}({}); - -// 解析URL中的动态参数,以实现TypeScript提示功能 - -/** - * @description 将url中的//转换为/ - */ -function cleanPath(path) { - return path.replace(/\/+/g, '/'); -} -function scoreCompare(score1, score2) { - var score1Length = score1.length; - var score2Length = score2.length; - var end = Math.min(score1Length, score2Length); - for (var i = 0; i < end; i++) { - var delta = score2[i] - score1[i]; - if (delta !== 0) { - return delta; - } - } - if (score1Length === score2Length) { - return 0; - } - return score1Length > score2Length ? -1 : 1; -} - -// 把正则表达式的特殊符号加两个反斜杠进行转义 -function escapeStr(str) { - return str.replace(/([.+*?=^!:${}()[\]|/\\])/g, '\\$1'); -} - -var validChar = /[^/:*()]/; - -// 对Url模板进行词法解析,解析结果为Tokens -function lexer(path) { - var tokens = []; - if (!path) { - return tokens; - } - var urlPath = cleanPath(path); - if (urlPath !== '*' && !urlPath.startsWith('/')) { - throw new Error("Url must start with \"/\"."); - } - var getLiteral = function () { - var name = ''; - while (i < urlPath.length && validChar.test(urlPath[i])) { - name += urlPath[i]; - skipChar(1); - } - return name; - }; - var skipChar = function (step) { - i += step; - }; - var i = 0; - while (i < urlPath.length) { - var curChar = urlPath[i]; - var prevChar = urlPath[i - 1]; - if (curChar === '/') { - tokens.push({ - type: TokenType.Delimiter, - value: urlPath[i] - }); - skipChar(1); - continue; - } - // dynamic params (/:a) - if (prevChar === '/' && curChar === ':') { - skipChar(1); - tokens.push({ - type: TokenType.Param, - value: getLiteral() - }); - continue; - } - // wildCard params (/:*) - if ((prevChar === '/' || prevChar === undefined) && curChar === '*') { - tokens.push({ - type: TokenType.WildCard, - value: urlPath[i] - }); - skipChar(1); - continue; - } - // static params - if (prevChar === '/' && validChar.test(curChar)) { - tokens.push({ - type: TokenType.Static, - value: getLiteral() - }); - continue; - } - if (curChar === '(') { - tokens.push({ - type: TokenType.LBracket, - value: '(' - }); - skipChar(1); - continue; - } - if (curChar === ')') { - tokens.push({ - type: TokenType.RBracket, - value: ')' - }); - skipChar(1); - continue; - } - if (validChar.test(curChar)) { - tokens.push({ - type: TokenType.Pattern, - value: getLiteral() - }); - continue; - } - // 跳过非法字符 - skipChar(1); - } - return tokens; -} - -function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function () {}; return { s: F, n: function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function (e) { throw e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function () { it = it.call(o); }, n: function () { var step = it.next(); normalCompletion = step.done; return step; }, e: function (e) { didErr = true; err = e; }, f: function () { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; } -function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } -function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } - -// 不同类型参数的匹配得分 -var MatchScore = /*#__PURE__*/function (MatchScore) { - MatchScore[MatchScore["static"] = 10] = "static"; - MatchScore[MatchScore["param"] = 6] = "param"; - MatchScore[MatchScore["wildcard"] = 3] = "wildcard"; - MatchScore[MatchScore["placeholder"] = -1] = "placeholder"; - return MatchScore; -}(MatchScore || {}); // 兼容 react v5 matched类型 -var defaultOption = { - // url匹配时是否大小写敏感 - caseSensitive: true, - // 是否严格匹配url结尾的/ - strictMode: false, - // 是否完全精确匹配 - exact: false -}; -// 正则表达式中需要转义的字符 -var REGEX_CHARS_RE = /[.+*?^${}()[\]/\\]/g; -// 用于匹配两个//中的的值 -var BASE_PARAM_PATTERN = '[^/]+'; -var DefaultDelimiter = '/#?'; -function createPathParser(pathname) { - var option = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : defaultOption; - var _option$caseSensitive = option.caseSensitive, - caseSensitive = _option$caseSensitive === void 0 ? defaultOption.caseSensitive : _option$caseSensitive, - _option$strictMode = option.strictMode, - strictMode = _option$strictMode === void 0 ? defaultOption.strictMode : _option$strictMode, - _option$exact = option.exact, - exact = _option$exact === void 0 ? defaultOption.exact : _option$exact; - /** - * URL匹配整体流程 - * 1.词法解析,将URL模板解析为Token - * 2.使用Token生成正则表达式 - * 3.利用正则表达式解析URL中参数或填充URL模板 - */ - var pattern = '^'; - var keys = []; - var scores = []; - var tokens = lexer(pathname); - var onlyHasWildCard = tokens.length === 1 && tokens[0].type === TokenType.WildCard; - var tokenCount = tokens.length; - var lastToken = tokens[tokenCount - 1]; - for (var tokenIdx = 0; tokenIdx < tokenCount; tokenIdx++) { - var token = tokens[tokenIdx]; - var nextToken = tokens[tokenIdx + 1]; - switch (token.type) { - case TokenType.Delimiter: - pattern += '/'; - break; - case TokenType.Static: - pattern += token.value.replace(REGEX_CHARS_RE, '\\$&'); - scores.push(MatchScore.static); - break; - case TokenType.Param: - var paramRegexp = ''; - if (nextToken && nextToken.type === TokenType.LBracket) { - // 跳过当前Token和左括号 - tokenIdx += 2; - while (tokens[tokenIdx].type !== TokenType.RBracket) { - paramRegexp += tokens[tokenIdx].value; - tokenIdx++; - } - } - pattern += paramRegexp ? "((?:" + paramRegexp + "))" : "(" + BASE_PARAM_PATTERN + ")"; - keys.push(token.value); - scores.push(MatchScore.param); - break; - case TokenType.WildCard: - keys.push(token.value); - pattern += "((?:" + BASE_PARAM_PATTERN + ")" + (onlyHasWildCard ? '?' : '') + "(?:/(?:" + BASE_PARAM_PATTERN + "))*)"; - scores.push(onlyHasWildCard ? MatchScore.wildcard : MatchScore.placeholder); - break; - } - } - var isWildCard = lastToken.type === TokenType.WildCard; - if (!isWildCard && !exact) { - if (!strictMode) { - pattern += "(?:[" + escapeStr(DefaultDelimiter) + "](?=$))?"; - } - if (lastToken.type !== TokenType.Delimiter) { - pattern += "(?=[" + escapeStr(DefaultDelimiter) + "]|$)"; - } - } else { - pattern += strictMode ? '$' : "[" + escapeStr(DefaultDelimiter) + "]?$"; - } - var flag = caseSensitive ? '' : 'i'; - var regexp = new RegExp(pattern, flag); - - /** - * @description 根据给定Pattern解析path - */ - function parse(path) { - var reMatch = path.match(regexp); - if (!reMatch) { - return null; - } - var matchedPath = reMatch[0]; - var params = {}; - var parseScore = Array.from(scores); - for (var i = 1; i < reMatch.length; i++) { - var param = reMatch[i]; - var key = keys[i - 1]; - if (key === '*' && param) { - var value = param.split('/'); - if (!Array.isArray(params['*'])) { - params['*'] = value; - } else { - var _params$; - (_params$ = params['*']).push.apply(_params$, value); - } - // 完成通配符参数解析后将placeholder替换为wildcard参数的分值 - parseScore.splice.apply(parseScore, [scores.indexOf(MatchScore.placeholder), 1].concat(new Array(value.length).fill(MatchScore.wildcard))); - } else { - params[key] = param ? param : []; - } - } - var isExact = path === matchedPath; - var url = path === '/' && matchedPath === '' ? '/' : matchedPath; - return { - isExact: isExact, - path: pathname, - url: url, - score: parseScore, - params: params - }; - } - - /** - * @description 使用给定参数填充pattern,得到目标URL - */ - function compile(params) { - var path = ''; - var _iterator = _createForOfIteratorHelper(tokens), - _step; - try { - for (_iterator.s(); !(_step = _iterator.n()).done;) { - var _token = _step.value; - switch (_token.type) { - case TokenType.Static: - path += _token.value; - break; - case TokenType.Param: - if (!params[_token.value]) { - throw new Error('Param is invalid.'); - } - path += params[_token.value]; - break; - case TokenType.WildCard: - var wildCard = params['*']; - if (wildCard instanceof Array) { - path += wildCard.join('/'); - } else { - path += wildCard; - } - break; - case TokenType.Delimiter: - path += _token.value; - break; - } - } - } catch (err) { - _iterator.e(err); - } finally { - _iterator.f(); - } - return path; - } - return { - get regexp() { - return regexp; - }, - get keys() { - return keys; - }, - compile: compile, - parse: parse - }; -} - -/** - * @description 依次使用pathname与pattern进行匹配,根据匹配分数取得分数最高结果 - */ -function matchPath(pathname, pattern, option) { - var patterns = Array.isArray(pattern) ? [].concat(pattern) : [pattern]; - var matchedResults = []; - var _iterator2 = _createForOfIteratorHelper(patterns), - _step2; - try { - for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) { - var item = _step2.value; - var parser = createPathParser(item, option); - var matched = parser.parse(pathname); - if (matched) { - matchedResults.push(matched); - } - } - } catch (err) { - _iterator2.e(err); - } finally { - _iterator2.f(); - } - return !matchedResults.length ? null : matchedResults.sort(function (a, b) { - return scoreCompare(a.score, b.score); - })[0]; -} -function generatePath(path, params) { - var parser = createPathParser(path); - return parser.compile(params); -} - -function useHistory() { - return React.useContext(RouterContext).history; -} -function useLocation() { - return React.useContext(RouterContext).location; -} -function useParams() { - var match = React.useContext(RouterContext).match; - return match ? match.params : {}; -} -function useRouteMatch(path) { - var pathname = useLocation().pathname; - var match = React.useContext(RouterContext).match; - if (path) { - return matchPath(pathname, path); - } - return match; -} - -function Route(props) { - var context = React.useContext(RouterContext); - var computed = props.computed, - location = props.location, - path = props.path; - var children = props.children, - component = props.component, - render = props.render; - var match; - var routeLocation = location || context.location; - if (computed) { - match = computed; - } else if (path) { - match = matchPath(routeLocation.pathname, path); - } else { - match = context.match; - } - var newProps = _extends({}, context, { - location: routeLocation, - match: match - }); - if (Array.isArray(children) && React.Children.count(children) === 0) { - children = null; - } - - /** - * 按顺序获取需要渲染的组件 - * 1.children - * 2.component - * 3.render - * 都没有匹配到返回Null - */ - var getChildren = function () { - // 如果 match 存在 - if (newProps.match) { - if (children) { - if (typeof children === 'function') { - return children(newProps); - } - return children; - } - if (component) { - return React.createElement(component, newProps); - } else if (render) { - return render(newProps); - } else { - return null; - } - } else { - // match为null - if (typeof children === 'function') { - return children(newProps); - } - return null; - } - }; - return /*#__PURE__*/React__namespace.createElement(RouterContext.Provider, { - value: newProps - }, getChildren()); -} - -function Router(props) { - var history = props.history, - _props$children = props.children, - children = _props$children === void 0 ? null : _props$children; - var _useState = React.useState(props.history.location), - location = _useState[0], - setLocation = _useState[1]; - var pendingLocation = React.useRef(null); - - // 在Router加载时就监听history地址变化,以保证在始渲染时重定向能正确触发 - var unListen = history.listen(function (arg) { - pendingLocation.current = arg.location; - }); - - // 模拟componentDidMount和componentWillUnmount - React.useLayoutEffect(function () { - if (unListen) { - unListen(); - } - // 监听history中的位置变化 - unListen = history.listen(function (arg) { - setLocation(arg.location); - }); - if (pendingLocation.current) { - setLocation(pendingLocation.current); - } - return function () { - if (unListen) { - unListen(); - unListen = null; - pendingLocation.current = null; - } - }; - }, []); - var initContextValue = React.useMemo(function () { - return { - history: history, - location: location, - match: { - isExact: location.pathname === '/', - params: {}, - path: '/', - score: [], - url: '/' - } - }; - }, [location]); - return /*#__PURE__*/React__namespace.createElement(RouterContext.Provider, { - value: initContextValue, - children: children - }); -} - -function _objectWithoutPropertiesLoose(source, excluded) { - if (source == null) return {}; - var target = {}; - var sourceKeys = Object.keys(source); - var key, i; - for (i = 0; i < sourceKeys.length; i++) { - key = sourceKeys[i]; - if (excluded.indexOf(key) >= 0) continue; - target[key] = source[key]; - } - return target; -} - -function LifeCycle(props) { - // 使用ref保存上一次的props,防止重新渲染 - var prevProps = React.useRef(null); - var isMount = React.useRef(false); - var onMount = props.onMount, - onUpdate = props.onUpdate, - onUnmount = props.onUnmount; - React.useLayoutEffect(function () { - // 首次挂载 模拟componentDidMount - if (!isMount.current) { - isMount.current = true; - if (onMount) { - onMount(); - } - } else { - // 不是首次渲染 模拟componentDidUpdate - if (onUpdate) { - prevProps.current ? onUpdate(prevProps.current) : onUpdate(); - } - } - prevProps.current = props; - }); - - // 模拟componentWillUnmount - React.useLayoutEffect(function () { - return function () { - if (onUnmount) { - onUnmount(); - } - }; - }, []); - return null; -} - -var _excluded$2 = ["state"]; -function Redirect(props) { - var to = props.to, - _props$push = props.push, - push = _props$push === void 0 ? false : _props$push, - computed = props.computed; - var context = React.useContext(RouterContext); - var history = context.history; - var calcLocation = function () { - if (computed) { - if (typeof to === 'string') { - var parser = createPathParser(to); - var target = parser.compile(computed.params); - return parsePath(target); - } else { - var pathname = to.pathname ? addHeadSlash(to.pathname) : '/'; - var _parser = createPathParser(pathname); - var _target = _parser.compile(computed.params); - return _extends({}, to, { - pathname: _target - }); - } - } - return typeof to === 'string' ? parsePath(to) : to; - }; - var navigate = push ? history.push : history.replace; - var _calcLocation = calcLocation(), - state = _calcLocation.state, - path = _objectWithoutPropertiesLoose(_calcLocation, _excluded$2); - var onMountFunc = function () { - navigate(path, state); - }; - var onUpdateFunc = function (prevProps) { - // 如果当前页面与重定向前页面不一致,执行跳转 - var prevPath = prevProps === null || prevProps === void 0 ? void 0 : prevProps.data; - if (!isLocationEqual(prevPath, path)) { - navigate(path, state); - } - }; - return /*#__PURE__*/React__namespace.createElement(LifeCycle, { - onMount: onMountFunc, - onUpdate: onUpdateFunc, - data: path - }); -} - -function Switch(props) { - var context = React.useContext(RouterContext); - var location = props.location || context.location; - var element = null; - var match = null; - - // 使用forEach不会给React.ReactNode增加key属性,防止重新渲染 - React.Children.forEach(props.children, function (node) { - if (match === null && React.isValidElement(node)) { - element = node; - var strict; - var sensitive; - var path; - var from; - - // node可能是Route和Redirect - if (node.type === Route) { - var _props = node.props; - strict = _props.strict; - sensitive = _props.sensitive; - path = _props.path; - } else if (node.type === Redirect) { - var _props2 = node.props; - path = _props2.path; - strict = _props2.strict; - from = _props2.from; - } - var exact = node.props.exact; - var target = path || from; - - // 更新匹配状态,一旦匹配到停止遍历 - if (target) { - match = matchPath(location.pathname, target, { - strictMode: strict, - caseSensitive: sensitive, - exact: exact - }); - } else { - match = context.match; - } - } - }); - if (match && element) { - // 使用cloneElement复制已有组件并更新其Props - return React.cloneElement(element, { - location: location, - computed: match - }); - } - return null; -} - -function Prompt(props) { - var context = React.useContext(RouterContext); - var message = props.message, - _props$when = props.when, - when = _props$when === void 0 ? true : _props$when; - if (typeof when === 'function' && when(context.location) === false || !when) { - return null; - } - var navigate = context.history.block; - var release = null; - var onMountFunc = function () { - release = message ? navigate(message) : null; - }; - var onUpdateFunc = function (prevProps) { - if (prevProps && prevProps.data !== message) { - if (release) { - release(); - } - release = message ? navigate(message) : null; - } - }; - var onUnmountFunc = function () { - if (release) { - release(); - } - release = null; - }; - return /*#__PURE__*/React__namespace.createElement(LifeCycle, { - onMount: onMountFunc, - onUpdate: onUpdateFunc, - onUnmount: onUnmountFunc, - data: message - }); -} - -function withRouter(Component) { - function ComponentWithRouterProp(props) { - var _useContext = React.useContext(RouterContext), - history = _useContext.history, - location = _useContext.location, - match = _useContext.match; - var routeProps = { - history: history, - location: location, - match: match - }; - return /*#__PURE__*/React__namespace.createElement(Component, _extends({}, props, routeProps)); - } - return ComponentWithRouterProp; -} - -function HashRouter(props) { - var historyRef = React.useRef(); - if (historyRef.current === null || historyRef.current === undefined) { - historyRef.current = createHashHistory({ - basename: props.basename, - getUserConfirmation: props.getUserConfirmation, - hashType: props.hashType - }); - } - return /*#__PURE__*/React__namespace.createElement(Router, { - history: historyRef.current - }, props.children); -} - -function BrowserRouter(props) { - // 使用Ref持有History对象,防止重复渲染 - var historyRef = React.useRef(); - if (historyRef.current === null || historyRef.current === undefined) { - historyRef.current = createBrowserHistory({ - basename: props.basename, - forceRefresh: props.forceRefresh, - getUserConfirmation: props.getUserConfirmation - }); - } - return /*#__PURE__*/React__namespace.createElement(Router, { - history: historyRef.current - }, props.children); -} - -var _excluded$1 = ["to", "replace", "component", "onClick", "target"]; -var isModifiedEvent = function (event) { - return event.metaKey || event.altKey || event.ctrlKey || event.shiftKey; -}; -var checkTarget = function (target) { - return !target || target === '_self'; -}; -function Link(props) { - var to = props.to, - replace = props.replace; - props.component; - var onClick = props.onClick, - target = props.target, - other = _objectWithoutPropertiesLoose(props, _excluded$1); - var tag = props.tag || 'a'; - var context = React.useContext(RouterContext); - var history = context.history; - var location = typeof to === 'function' ? to(context.location) : to; - var state; - var path; - if (typeof location === 'string') { - path = parsePath(location); - } else { - var pathname = location.pathname, - hash = location.hash, - search = location.search; - path = { - pathname: pathname, - hash: hash, - search: search - }; - state = location.state; - } - var href = history.createHref(path); - var linkClickEvent = function (event) { - try { - if (onClick) { - onClick(event); - } - } catch (e) { - event.preventDefault(); - throw e; - } - if (!event.defaultPrevented && event.button === 0 && checkTarget(target) && !isModifiedEvent(event)) { - // 不是相同的路径执行push操作,是相同的路径执行replace - var isSamePath = createPath(context.location) === createPath(path); - var navigate = replace || isSamePath ? history.replace : history.push; - event.preventDefault(); - navigate(path, state); - } - }; - var linkProps = _extends({ - href: href, - onClick: linkClickEvent - }, other); - return React__namespace.createElement(tag, linkProps); -} - -var _excluded = ["to", "isActive"]; -function NavLink(props) { - var to = props.to, - isActive = props.isActive, - rest = _objectWithoutPropertiesLoose(props, _excluded); - var context = React.useContext(RouterContext); - var toLocation = typeof to === 'function' ? to(context.location) : to; - var _ref = typeof toLocation === 'string' ? parsePath(toLocation) : toLocation, - path = _ref.pathname; - // 把正则表达式的特殊符号加两个反斜杠进行转义 - var escapedPath = path ? escapeStr(path) : ''; - var match = escapedPath ? matchPath(context.location.pathname, escapedPath) : null; - var isLinkActive = match && isActive ? isActive(match, context.location) : false; - var page = 'page'; - var otherProps = _extends({ - 'aria-current': isLinkActive ? page : false - }, rest); - return /*#__PURE__*/React__namespace.createElement(Link, _extends({ - to: to - }, otherProps)); -} - -// 获取redux state中的值 -function getIn(state, path) { - if (!state) { - return state; - } - var length = path.length; - if (!length) { - return undefined; - } - var res = state; - for (var i = 0; i < length && !!res; ++i) { - res = res[path[i]]; - } - return res; -} - -// 从store的state中获取Router、Location、Action、Hash等信息 -var stateReader = function (storeType) { - var isRouter = function (value) { - return value !== null && typeof value === 'object' && !!getIn(value, ['location']) && !!getIn(value, ['action']); - }; - var getRouter = function (state) { - var router = getIn(state, ['router']); - if (!isRouter(router)) { - throw new Error("Could not find router reducer in " + storeType + " store, it must be mounted under \"router\""); - } - return router; - }; - var getLocation = function (state) { - return getIn(getRouter(state), ['location']); - }; - var getAction = function (state) { - return getIn(getRouter(state), ['action']); - }; - var getSearch = function (state) { - return getIn(getRouter(state), ['location', 'search']); - }; - var getHash = function (state) { - return getIn(getRouter(state), ['location', 'hash']); - }; - return { - getHash: getHash, - getAction: getAction, - getSearch: getSearch, - getRouter: getRouter, - getLocation: getLocation - }; -}; - -var hConnect = horizon.reduxAdapter.connect; -function ConnectedRouterWithoutMemo(props) { - var store = props.store, - history = props.history, - onLocationChanged = props.onLocationChanged, - omitRouter = props.omitRouter, - children = props.children, - storeType = props.storeType; - var _stateReader = stateReader(storeType), - getLocation = _stateReader.getLocation; - - // 监听store变化 - var unsubscribe = store.subscribe(function () { - // 获取redux State中的location信息 - var _getLocation = getLocation(store.getState()), - pathnameInStore = _getLocation.pathname, - searchInStore = _getLocation.search, - hashInStore = _getLocation.hash, - stateInStore = _getLocation.state; - - // 获取当前history对象中的location信息 - var _history$location = history.location, - pathnameInHistory = _history$location.pathname, - searchInHistory = _history$location.search, - hashInHistory = _history$location.hash, - stateInHistory = _history$location.state; - - // 两个location不一致 执行跳转 - if (history.action === 'PUSH' && (pathnameInHistory !== pathnameInStore || searchInHistory !== searchInStore || hashInHistory !== hashInStore || stateInHistory !== stateInStore)) { - history.push({ - pathname: pathnameInStore, - search: searchInStore, - hash: hashInStore - }, stateInStore); - } - }); - var handleLocationChange = function (args) { - var isFirstRendering = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; - var location = args.location, - action = args.action; - onLocationChanged(location, action, isFirstRendering); - }; - - // 监听history更新 - var unListen = function () { - return history.listen(handleLocationChange); - }; - React.useLayoutEffect(function () { - return function () { - unListen(); - unsubscribe(); - }; - }, []); - if (!props.noInitialPop) { - // 传递初始时位置信息,isFirstRendering设为true防止重复渲染 - handleLocationChange({ - location: history.location, - action: history.action - }, true); - } - if (omitRouter) { - return /*#__PURE__*/React__namespace.createElement(React__namespace.Fragment, null, children); - } - var childrenNode; - if (typeof children === 'function') { - childrenNode = children(); - } else { - childrenNode = children; - } - return /*#__PURE__*/React__namespace.createElement(Router, { - history: history - }, childrenNode); -} -function getConnectedRouter(type) { - var mapDispatchToProps = function (dispatch) { - return { - onLocationChanged: function (location, action, isFirstRendering) { - return dispatch(onLocationChanged(location, action, isFirstRendering)); - } - }; - }; - var ConnectedRouter = React__namespace.memo(ConnectedRouterWithoutMemo); - var ConnectedRouterWithContext = function (props) { - var Context = props.context || reactRedux.ReactReduxContext; - return /*#__PURE__*/React__namespace.createElement(Context.Consumer, null, function (_ref) { - var store = _ref.store; - return /*#__PURE__*/React__namespace.createElement(ConnectedRouter, _extends({ - store: store, - storeType: type - }, props)); - }); - }; - - // 针对不同的Store类型,使用对应的connect函数 - if (type === 'HorizonXCompat') { - return hConnect(null, mapDispatchToProps)(ConnectedRouterWithContext); - } - if (type === 'Redux') { - return reactRedux.connect(null, mapDispatchToProps)(ConnectedRouterWithContext); - } else { - throw new Error('Invalid store type'); - } -} - -// 定义connect-router对应的redux dispatch函数 -function routerMiddleware(history) { - return function (_) { - return function (next) { - return function (action) { - if (action.type !== ActionName.CALL_HISTORY_METHOD) { - return next(action); - } - var _action$payload = action.payload, - method = _action$payload.method, - args = _action$payload.args; - if (method in history) { - var _ref; - (_ref = history)[method].apply(_ref, args); - } - }; - }; - }; -} - -var connectRouter = createConnectRouter(); - -var ConnectedRouter = getConnectedRouter('Redux'); -var ConnectedHRouter = getConnectedRouter('HorizonXCompat'); - -exports.BrowserRouter = BrowserRouter; -exports.ConnectedHRouter = ConnectedHRouter; -exports.ConnectedRouter = ConnectedRouter; -exports.HashRouter = HashRouter; -exports.Link = Link; -exports.NavLink = NavLink; -exports.Prompt = Prompt; -exports.Redirect = Redirect; -exports.Route = Route; -exports.Router = Router; -exports.Switch = Switch; -exports.__RouterContext = RouterContext; -exports.connectRouter = connectRouter; -exports.createBrowserHistory = createBrowserHistory; -exports.createHashHistory = createHashHistory; -exports.generatePath = generatePath; -exports.matchPath = matchPath; -exports.routerMiddleware = routerMiddleware; -exports.useHistory = useHistory; -exports.useLocation = useLocation; -exports.useParams = useParams; -exports.useRouteMatch = useRouteMatch; -exports.withRouter = withRouter; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29ubmVjdFJvdXRlci5qcyIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHMuanMiLCIuLi8uLi9zcmMvY29ubmVjdC1yb3V0ZXIvYWN0aW9ucy50cyIsIi4uLy4uL3NyYy9jb25uZWN0LXJvdXRlci9yZWR1Y2VyLnRzIiwiLi4vLi4vc3JjL2hpc3RvcnkvZG9tLnRzIiwiLi4vLi4vc3JjL2hpc3RvcnkvdHlwZXMudHMiLCIuLi8uLi9zcmMvaGlzdG9yeS91dGlscy50cyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jbGFzc0NhbGxDaGVjay5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90eXBlb2YuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdG9QcmltaXRpdmUuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdG9Qcm9wZXJ0eUtleS5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jcmVhdGVDbGFzcy5qcyIsIi4uLy4uL3NyYy9oaXN0b3J5L3RyYW5zaXRpb25NYW5hZ2VyLnRzIiwiLi4vLi4vc3JjL2hpc3Rvcnkvd2FyaW5nLnRzIiwiLi4vLi4vc3JjL2hpc3RvcnkvYmFzZUhpc3RvcnkudHMiLCIuLi8uLi9zcmMvaGlzdG9yeS9icm93ZXJIaXN0b3J5LnRzIiwiLi4vLi4vc3JjL2hpc3RvcnkvaGFzaEhpc3RvcnkudHMiLCIuLi8uLi9zcmMvcm91dGVyL2NvbnRleHQudHN4IiwiLi4vLi4vc3JjL3JvdXRlci9tYXRjaGVyL3R5cGVzLnRzIiwiLi4vLi4vc3JjL3JvdXRlci9tYXRjaGVyL3V0aWxzLnRzIiwiLi4vLi4vc3JjL3JvdXRlci9tYXRjaGVyL2xleGVyLnRzIiwiLi4vLi4vc3JjL3JvdXRlci9tYXRjaGVyL3BhcnNlci50cyIsIi4uLy4uL3NyYy9yb3V0ZXIvaG9va3MudHMiLCIuLi8uLi9zcmMvcm91dGVyL1JvdXRlLnRzeCIsIi4uLy4uL3NyYy9yb3V0ZXIvUm91dGVyLnRzeCIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlLmpzIiwiLi4vLi4vc3JjL3JvdXRlci9saWZlQ3ljbGVIb29rLnRzIiwiLi4vLi4vc3JjL3JvdXRlci9SZWRpcmVjdC50c3giLCIuLi8uLi9zcmMvcm91dGVyL1N3aXRjaC50c3giLCIuLi8uLi9zcmMvcm91dGVyL1Byb21wdC50c3giLCIuLi8uLi9zcmMvcm91dGVyL3dpdGhSb3V0ZXIudHN4IiwiLi4vLi4vc3JjL3JvdXRlci9IYXNoUm91dGVyLnRzeCIsIi4uLy4uL3NyYy9yb3V0ZXIvQnJvd3NlclJvdXRlci50c3giLCIuLi8uLi9zcmMvcm91dGVyL0xpbmsudHN4IiwiLi4vLi4vc3JjL3JvdXRlci9OYXZMaW5rLnRzeCIsIi4uLy4uL3NyYy9jb25uZWN0LXJvdXRlci9yZWR1eFV0aWxzLnRzIiwiLi4vLi4vc3JjL2Nvbm5lY3Qtcm91dGVyL2Nvbm5lY3RlZFJvdXRlci50c3giLCIuLi8uLi9zcmMvY29ubmVjdC1yb3V0ZXIvZGlzcGF0Y2gudHMiLCIuLi8uLi9zcmMvY29ubmVjdC1yb3V0ZXIvaW5kZXgudHMiLCIuLi8uLi9zcmMvcm91dGVyL2luZGV4Mi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfZXh0ZW5kcygpIHtcbiAgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduID8gT2JqZWN0LmFzc2lnbi5iaW5kKCkgOiBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07XG4gICAgICBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7XG4gICAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9O1xuICByZXR1cm4gX2V4dGVuZHMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn0iLCJpbXBvcnQgeyBBY3Rpb24sIFBhdGggfSBmcm9tICcuLi9oaXN0b3J5L3R5cGVzJztcclxuXHJcbnR5cGUgTG9jYXRpb24gPSBQYXJ0aWFsPFBhdGg+XHJcblxyXG4vLyDlrprkuYnkvY3nva7lj5jljJblkoxoaXN0b3J55pa55rOV6LCD55So55qEQWN0aW9uIHR5cGVcclxuZXhwb3J0IGVudW0gQWN0aW9uTmFtZSB7XHJcbiAgTE9DQVRJT05fQ0hBTkdFID0gJyRob3Jpem9uLXJvdXRlci9MT0NBVElPTl9DSEFOR0UnLFxyXG4gIENBTExfSElTVE9SWV9NRVRIT0QgPSAnJGhvcml6b24tcm91dGVyL0NBTExfSElTVE9SWV9NRVRIT0QnXHJcbn1cclxuXHJcbi8vIOWumuS5iUFjdGlvbueahOS4pOenjeaVsOaNruexu+Wei1xyXG5leHBvcnQgdHlwZSBBY3Rpb25NZXNzYWdlID0ge1xyXG4gIHR5cGU6IEFjdGlvbk5hbWUuTE9DQVRJT05fQ0hBTkdFXHJcbiAgcGF5bG9hZDoge1xyXG4gICAgbG9jYXRpb246IExvY2F0aW9uLFxyXG4gICAgYWN0aW9uOiBBY3Rpb25cclxuICAgIGlzRmlyc3RSZW5kZXJpbmc6IGJvb2xlYW5cclxuICB9XHJcbn0gfCB7XHJcbiAgdHlwZTogQWN0aW9uTmFtZS5DQUxMX0hJU1RPUllfTUVUSE9EXHJcbiAgcGF5bG9hZDoge1xyXG4gICAgbWV0aG9kOiBzdHJpbmcsXHJcbiAgICBhcmdzOiBhbnlcclxuICB9XHJcbn1cclxuXHJcblxyXG5leHBvcnQgY29uc3Qgb25Mb2NhdGlvbkNoYW5nZWQgPSAobG9jYXRpb246IExvY2F0aW9uLCBhY3Rpb246IEFjdGlvbiwgaXNGaXJzdFJlbmRlcmluZyA9IGZhbHNlKTogQWN0aW9uTWVzc2FnZSA9PiB7XHJcbiAgcmV0dXJuIHtcclxuICAgIHR5cGU6IEFjdGlvbk5hbWUuTE9DQVRJT05fQ0hBTkdFLFxyXG4gICAgcGF5bG9hZDoge1xyXG4gICAgICBsb2NhdGlvbixcclxuICAgICAgYWN0aW9uLFxyXG4gICAgICBpc0ZpcnN0UmVuZGVyaW5nLFxyXG4gICAgfSxcclxuICB9O1xyXG59O1xyXG5cclxuY29uc3QgdXBkYXRlTG9jYXRpb24gPSAobWV0aG9kOiBzdHJpbmcpOiAoLi4uYXJnczogYW55KSA9PiBBY3Rpb25NZXNzYWdlID0+IHtcclxuICByZXR1cm4gKC4uLmFyZ3M6IGFueSkgPT4gKHtcclxuICAgIHR5cGU6IEFjdGlvbk5hbWUuQ0FMTF9ISVNUT1JZX01FVEhPRCxcclxuICAgIHBheWxvYWQ6IHtcclxuICAgICAgbWV0aG9kLFxyXG4gICAgICBhcmdzLFxyXG4gICAgfSxcclxuICB9KTtcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBwdXNoID0gdXBkYXRlTG9jYXRpb24oJ3B1c2gnKTtcclxuZXhwb3J0IGNvbnN0IHJlcGxhY2UgPSB1cGRhdGVMb2NhdGlvbigncmVwbGFjZScpO1xyXG5leHBvcnQgY29uc3QgZ28gPSB1cGRhdGVMb2NhdGlvbignZ28nKTsiLCJpbXBvcnQgeyBBY3Rpb25OYW1lIH0gZnJvbSAnLi9hY3Rpb25zJztcclxuaW1wb3J0IHsgQWN0aW9uLCBIaXN0b3J5IH0gZnJvbSAnLi4vaGlzdG9yeS90eXBlcyc7XHJcbmltcG9ydCB7IExvY2F0aW9uIH0gZnJvbSAnLi4vcm91dGVyJztcclxuXHJcbnR5cGUgTG9jYXRpb25XaXRoUXVlcnkgPSBQYXJ0aWFsPExvY2F0aW9uPiAmIHsgcXVlcnk/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+IH07XHJcblxyXG4vLyDop6PmnpBsb2NhdGlvbuWvueixoe+8jOWwhuWFtuS4reeahHF1ZXJ55Y+C5pWw6Kej5p6Q5bm25rOo5YWlXHJcbmZ1bmN0aW9uIGluamVjdFF1ZXJ5UGFyYW1zKGxvY2F0aW9uPzogTG9jYXRpb25XaXRoUXVlcnkpOiBMb2NhdGlvbldpdGhRdWVyeSB7XHJcbiAgaWYgKGxvY2F0aW9uICYmIGxvY2F0aW9uLnF1ZXJ5KSB7XHJcbiAgICByZXR1cm4gbG9jYXRpb247XHJcbiAgfVxyXG5cclxuICBjb25zdCBxdWVyeVN0cmluZyA9IGxvY2F0aW9uICYmIGxvY2F0aW9uLnNlYXJjaDtcclxuXHJcbiAgaWYgKCFxdWVyeVN0cmluZykge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgLi4ubG9jYXRpb24sXHJcbiAgICAgIHF1ZXJ5OiB7fSxcclxuICAgIH07XHJcbiAgfVxyXG4gIGNvbnN0IHF1ZXJ5T2JqZWN0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XHJcblxyXG4gIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMocXVlcnlTdHJpbmcpO1xyXG4gIHBhcmFtcy5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiAocXVlcnlPYmplY3Rba2V5XSA9IHZhbHVlKSk7XHJcblxyXG4gIHJldHVybiB7XHJcbiAgICAuLi5sb2NhdGlvbixcclxuICAgIHF1ZXJ5OiBxdWVyeU9iamVjdCxcclxuICB9O1xyXG59XHJcblxyXG50eXBlIEluaXRSb3V0ZXJTdGF0ZSA9IHtcclxuICBsb2NhdGlvbjogTG9jYXRpb25XaXRoUXVlcnk7XHJcbiAgYWN0aW9uOiBBY3Rpb247XHJcbn07XHJcblxyXG50eXBlIFBheWxvYWQgPSB7XHJcbiAgdHlwZT86IEFjdGlvbk5hbWU7XHJcbiAgcGF5bG9hZD86IGFueTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDb25uZWN0Um91dGVyKCkge1xyXG4gIC8vIOWIneWni+WMlnJlZHV4IFN0YXRlXHJcbiAgcmV0dXJuIChoaXN0b3J5OiBIaXN0b3J5KSA9PiB7XHJcbiAgICBjb25zdCBpbml0Um91dGVyU3RhdGUgPSB7XHJcbiAgICAgIGxvY2F0aW9uOiBpbmplY3RRdWVyeVBhcmFtcyhoaXN0b3J5LmxvY2F0aW9uKSxcclxuICAgICAgYWN0aW9uOiBoaXN0b3J5LmFjdGlvbixcclxuICAgIH07XHJcblxyXG4gICAgLy8g5a6a5LmJY29ubmVjdC1yb3V0ZXLlr7nlupTnmoRyZWR1eCByZWR1Y2Vy5Ye95pWwXHJcbiAgICByZXR1cm4gKHN0YXRlOiBJbml0Um91dGVyU3RhdGUgPSBpbml0Um91dGVyU3RhdGUsIHsgdHlwZSwgcGF5bG9hZCB9OiBQYXlsb2FkID0ge30pOiBhbnkgPT4ge1xyXG4gICAgICBpZiAodHlwZSA9PT0gQWN0aW9uTmFtZS5MT0NBVElPTl9DSEFOR0UpIHtcclxuICAgICAgICBjb25zdCB7IGxvY2F0aW9uLCBhY3Rpb24sIGlzRmlyc3RSZW5kZXJpbmcgfSA9IHBheWxvYWQ7XHJcbiAgICAgICAgaWYgKGlzRmlyc3RSZW5kZXJpbmcpIHtcclxuICAgICAgICAgIHJldHVybiBzdGF0ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgLi4uc3RhdGUsIGxvY2F0aW9uOiBpbmplY3RRdWVyeVBhcmFtcyhsb2NhdGlvbiksIGFjdGlvbjogYWN0aW9uIH07XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHN0YXRlO1xyXG4gICAgfTtcclxuICB9O1xyXG59XHJcbiIsImV4cG9ydCBmdW5jdGlvbiBpc0Jyb3dzZXIoKTogYm9vbGVhbiB7XHJcbiAgcmV0dXJuIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5kb2N1bWVudCAmJiB0eXBlb2Ygd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgPT09ICdmdW5jdGlvbic7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXREZWZhdWx0Q29uZmlybWF0aW9uKG1lc3NhZ2U6IHN0cmluZywgY2FsbEJhY2s6IChyZXN1bHQ6IGJvb2xlYW4pID0+IHZvaWQpIHtcclxuICBjYWxsQmFjayh3aW5kb3cuY29uZmlybShtZXNzYWdlKSk7XHJcbn1cclxuXHJcbi8vIOWIpOaWrea1j+iniOWZqOaYr+WQpuaUr+aMgXB1c2hTdGF0ZeaWueazle+8jHB1c2hTdGF0ZeaYr2Jyb3dzZXJIaXN0b3J55a6e546w55qE5Z+656GAXHJcbmV4cG9ydCBmdW5jdGlvbiBpc1N1cHBvcnRIaXN0b3J5KCk6IGJvb2xlYW4ge1xyXG4gIHJldHVybiBpc0Jyb3dzZXIoKSAmJiB3aW5kb3cuaGlzdG9yeSAmJiAncHVzaFN0YXRlJyBpbiB3aW5kb3cuaGlzdG9yeTtcclxufVxyXG5cclxuLy8g5Yik5pat5rWP6KeI5Zmo5piv5ZCm5pSv5oyBUG9wU3RhdGXkuovku7ZcclxuZXhwb3J0IGZ1bmN0aW9uIGlzU3VwcG9ydHNQb3BTdGF0ZSgpOiBib29sZWFuIHtcclxuICByZXR1cm4gd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignVHJpZGVudCcpID09PSAtMTtcclxufVxyXG4iLCJleHBvcnQgdHlwZSBCYXNlT3B0aW9uID0ge1xyXG4gIGJhc2VuYW1lPzogc3RyaW5nO1xyXG4gIGdldFVzZXJDb25maXJtYXRpb24/OiBDb25maXJtYXRpb25GdW5jO1xyXG59O1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBIaXN0b3J5UHJvcHM8VCA9IHVua25vd24+IHtcclxuICByZWFkb25seSBhY3Rpb246IEFjdGlvbjtcclxuXHJcbiAgcmVhZG9ubHkgbG9jYXRpb246IExvY2F0aW9uPFQ+O1xyXG5cclxuICBsZW5ndGg6IG51bWJlcjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBIaXN0b3J5PFQgPSB1bmtub3duPiBleHRlbmRzIEhpc3RvcnlQcm9wczxUPiB7XHJcbiAgY3JlYXRlSHJlZihwYXRoOiBQYXJ0aWFsPFBhdGg+KTogc3RyaW5nO1xyXG5cclxuICBwdXNoKHRvOiBUbywgc3RhdGU/OiBUKTogdm9pZDtcclxuXHJcbiAgcmVwbGFjZSh0bzogVG8sIHN0YXRlPzogVCk6IHZvaWQ7XHJcblxyXG4gIGxpc3RlbihsaXN0ZW5lcjogTGlzdGVuZXI8VD4pOiAoKSA9PiB2b2lkO1xyXG5cclxuICBibG9jayhwcm9tcHQ6IFByb21wdDxUPik6ICgpID0+IHZvaWQ7XHJcblxyXG4gIGdvKGluZGV4OiBudW1iZXIpOiB2b2lkO1xyXG5cclxuICBnb0JhY2soKTogdm9pZDtcclxuXHJcbiAgZ29Gb3J3YXJkKCk6IHZvaWQ7XHJcbn1cclxuXHJcbmV4cG9ydCBlbnVtIEFjdGlvbiB7XHJcbiAgcG9wID0gJ1BPUCcsXHJcbiAgcHVzaCA9ICdQVVNIJyxcclxuICByZXBsYWNlID0gJ1JFUExBQ0UnLFxyXG59XHJcblxyXG5leHBvcnQgZW51bSBFdmVudFR5cGUge1xyXG4gIFBvcFN0YXRlID0gJ3BvcHN0YXRlJyxcclxuICBIYXNoQ2hhbmdlID0gJ2hhc2hjaGFuZ2UnLFxyXG59XHJcblxyXG5leHBvcnQgdHlwZSBQYXRoID0ge1xyXG4gIHBhdGhuYW1lOiBzdHJpbmc7XHJcblxyXG4gIHNlYXJjaDogc3RyaW5nO1xyXG5cclxuICBoYXNoOiBzdHJpbmc7XHJcbn07XHJcblxyXG5leHBvcnQgdHlwZSBIaXN0b3J5U3RhdGU8VD4gPSB7XHJcbiAgc3RhdGU/OiBUO1xyXG5cclxuICBrZXk6IHN0cmluZztcclxufTtcclxuXHJcbmV4cG9ydCB0eXBlIERlZmF1bHRTdGF0ZVR5cGUgPSB1bmtub3duO1xyXG5cclxuZXhwb3J0IHR5cGUgTG9jYXRpb248VCA9IHVua25vd24+ID0gUGF0aCAmIEhpc3RvcnlTdGF0ZTxUPjtcclxuXHJcbmV4cG9ydCB0eXBlIFRvID0gc3RyaW5nIHwgUGFydGlhbDxQYXRoPjtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgTGlzdGVuZXI8VCA9IHVua25vd24+IHtcclxuICAobmF2aWdhdGlvbjogTmF2aWdhdGlvbjxUPik6IHZvaWQ7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgTmF2aWdhdGlvbjxUID0gdW5rbm93bj4ge1xyXG4gIGFjdGlvbjogQWN0aW9uO1xyXG5cclxuICBsb2NhdGlvbjogTG9jYXRpb248VD47XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIFByb21wdDxTPiA9IHN0cmluZyB8IGJvb2xlYW4gfCBudWxsIHwgKChsb2NhdGlvbjogTG9jYXRpb248Uz4sIGFjdGlvbjogQWN0aW9uKSA9PiB2b2lkKTtcclxuXHJcbmV4cG9ydCB0eXBlIENhbGxCYWNrRnVuYyA9IChpc0p1bXA6IGJvb2xlYW4pID0+IHZvaWQ7XHJcblxyXG5leHBvcnQgdHlwZSBDb25maXJtYXRpb25GdW5jID0gKG1lc3NhZ2U6IHN0cmluZywgY2FsbEJhY2s6IENhbGxCYWNrRnVuYykgPT4gdm9pZDtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgVE1hbmFnZXI8Uz4ge1xyXG4gIHNldFByb21wdChuZXh0OiBQcm9tcHQ8Uz4pOiAoKSA9PiB2b2lkO1xyXG5cclxuICBhZGRMaXN0ZW5lcihmdW5jOiAobmF2aWdhdGlvbjogTmF2aWdhdGlvbjxTPikgPT4gdm9pZCk6ICgpID0+IHZvaWQ7XHJcblxyXG4gIG5vdGlmeUxpc3RlbmVycyhhcmdzOiBOYXZpZ2F0aW9uPFM+KTogdm9pZDtcclxuXHJcbiAgY29uZmlybUp1bXBUbyhcclxuICAgIGxvY2F0aW9uOiBMb2NhdGlvbjxTPixcclxuICAgIGFjdGlvbjogQWN0aW9uLFxyXG4gICAgdXNlckNvbmZpcm1hdGlvbkZ1bmM6IENvbmZpcm1hdGlvbkZ1bmMsXHJcbiAgICBjYWxsQmFjazogQ2FsbEJhY2tGdW5jLFxyXG4gICk6IHZvaWQ7XHJcbn1cclxuIiwiaW1wb3J0IHsgQWN0aW9uLCBMb2NhdGlvbiwgUGF0aCwgVG8gfSBmcm9tICcuL3R5cGVzJztcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQYXRoKHBhdGg6IFBhcnRpYWw8UGF0aD4pOiBzdHJpbmcge1xyXG4gIGNvbnN0IHsgc2VhcmNoLCBoYXNoIH0gPSBwYXRoO1xyXG4gIGxldCBwYXRobmFtZSA9IHBhdGgucGF0aG5hbWUgfHwgJy8nO1xyXG4gIGlmIChzZWFyY2ggJiYgc2VhcmNoICE9PSAnPycpIHtcclxuICAgIHBhdGhuYW1lICs9IHNlYXJjaC5zdGFydHNXaXRoKCc/JykgPyBzZWFyY2ggOiAnPycgKyBzZWFyY2g7XHJcbiAgfVxyXG4gIGlmIChoYXNoICYmIGhhc2ggIT09ICcjJykge1xyXG4gICAgcGF0aG5hbWUgKz0gaGFzaC5zdGFydHNXaXRoKCcjJykgPyBoYXNoIDogJyMnICsgaGFzaDtcclxuICB9XHJcbiAgcmV0dXJuIHBhdGhuYW1lO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VQYXRoKHVybDogc3RyaW5nKTogUGFydGlhbDxQYXRoPiB7XHJcbiAgaWYgKCF1cmwpIHtcclxuICAgIHJldHVybiB7fTtcclxuICB9XHJcbiAgbGV0IHBhcnNlZFBhdGg6IFBhcnRpYWw8UGF0aD4gPSB7fTtcclxuXHJcbiAgbGV0IGhhc2hJZHggPSB1cmwuaW5kZXhPZignIycpO1xyXG4gIGlmIChoYXNoSWR4ID4gLTEpIHtcclxuICAgIHBhcnNlZFBhdGguaGFzaCA9IHVybC5zdWJzdHJpbmcoaGFzaElkeCk7XHJcbiAgICB1cmwgPSB1cmwuc3Vic3RyaW5nKDAsIGhhc2hJZHgpO1xyXG4gIH1cclxuXHJcbiAgbGV0IHNlYXJjaElkeCA9IHVybC5pbmRleE9mKCc/Jyk7XHJcbiAgaWYgKHNlYXJjaElkeCA+IC0xKSB7XHJcbiAgICBwYXJzZWRQYXRoLnNlYXJjaCA9IHVybC5zdWJzdHJpbmcoc2VhcmNoSWR4KTtcclxuICAgIHVybCA9IHVybC5zdWJzdHJpbmcoMCwgc2VhcmNoSWR4KTtcclxuICB9XHJcbiAgaWYgKHVybCkge1xyXG4gICAgcGFyc2VkUGF0aC5wYXRobmFtZSA9IHVybDtcclxuICB9XHJcbiAgcmV0dXJuIHBhcnNlZFBhdGg7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVMb2NhdGlvbjxTPihjdXJyZW50OiBzdHJpbmcgfCBMb2NhdGlvbiwgdG86IFRvLCBzdGF0ZT86IFMsIGtleT86IHN0cmluZyk6IFJlYWRvbmx5PExvY2F0aW9uPFM+PiB7XHJcbiAgbGV0IHBhdGhuYW1lID0gdHlwZW9mIGN1cnJlbnQgPT09ICdzdHJpbmcnID8gY3VycmVudCA6IGN1cnJlbnQucGF0aG5hbWU7XHJcbiAgbGV0IHVybE9iaiA9IHR5cGVvZiB0byA9PT0gJ3N0cmluZycgPyBwYXJzZVBhdGgodG8pIDogdG87XHJcbiAgLy8g6ZqP5py6a2V56ZW/5bqm5Y+WNlxyXG4gIGNvbnN0IGdldFJhbmRLZXkgPSBnZW5SYW5kb21LZXkoNik7XHJcbiAgY29uc3QgbG9jYXRpb24gPSB7XHJcbiAgICBwYXRobmFtZTogcGF0aG5hbWUsXHJcbiAgICBzZWFyY2g6ICcnLFxyXG4gICAgaGFzaDogJycsXHJcbiAgICBzdGF0ZTogc3RhdGUsXHJcbiAgICBrZXk6IHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnID8ga2V5IDogZ2V0UmFuZEtleSgpLFxyXG4gICAgLi4udXJsT2JqLFxyXG4gIH07XHJcbiAgaWYgKCFsb2NhdGlvbi5wYXRobmFtZSkge1xyXG4gICAgbG9jYXRpb24ucGF0aG5hbWUgPSAnLyc7XHJcbiAgfVxyXG4gIHJldHVybiBsb2NhdGlvbjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGlzTG9jYXRpb25FcXVhbChwMTogUGFydGlhbDxQYXRoPiwgcDI6IFBhcnRpYWw8UGF0aD4pIHtcclxuICByZXR1cm4gcDEucGF0aG5hbWUgPT09IHAyLnBhdGhuYW1lICYmIHAxLnNlYXJjaCA9PT0gcDIuc2VhcmNoICYmIHAxLmhhc2ggPT09IHAyLmhhc2g7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhZGRIZWFkU2xhc2gocGF0aDogc3RyaW5nKTogc3RyaW5nIHtcclxuICBpZiAocGF0aFswXSA9PT0gJy8nKSB7XHJcbiAgICByZXR1cm4gcGF0aDtcclxuICB9XHJcbiAgcmV0dXJuICcvJyArIHBhdGg7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzdHJpcEhlYWRTbGFzaChwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gIGlmIChwYXRoWzBdID09PSAnLycpIHtcclxuICAgIHJldHVybiBwYXRoLnN1YnN0cmluZygxKTtcclxuICB9XHJcbiAgcmV0dXJuIHBhdGg7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVTbGFzaChwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gIGNvbnN0IHRlbXBQYXRoID0gYWRkSGVhZFNsYXNoKHBhdGgpO1xyXG4gIGlmICh0ZW1wUGF0aFt0ZW1wUGF0aC5sZW5ndGggLSAxXSA9PT0gJy8nKSB7XHJcbiAgICByZXR1cm4gdGVtcFBhdGguc3Vic3RyaW5nKDAsIHRlbXBQYXRoLmxlbmd0aCAtIDEpO1xyXG4gIH1cclxuICByZXR1cm4gdGVtcFBhdGg7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBoYXNCYXNlbmFtZShwYXRoOiBzdHJpbmcsIHByZWZpeDogc3RyaW5nKTogQm9vbGVhbiB7XHJcbiAgcmV0dXJuIChcclxuICAgIHBhdGgudG9Mb3dlckNhc2UoKS5pbmRleE9mKHByZWZpeC50b0xvd2VyQ2FzZSgpKSA9PT0gMCAmJiBbJy8nLCAnPycsICcjJywgJyddLmluY2x1ZGVzKHBhdGguY2hhckF0KHByZWZpeC5sZW5ndGgpKVxyXG4gICk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzdHJpcEJhc2VuYW1lKHBhdGg6IHN0cmluZywgcHJlZml4OiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gIHJldHVybiBoYXNCYXNlbmFtZShwYXRoLCBwcmVmaXgpID8gcGF0aC5zdWJzdHJpbmcocHJlZml4Lmxlbmd0aCkgOiBwYXRoO1xyXG59XHJcblxyXG4vLyDkvb/nlKjpmo/mnLrnlJ/miJDnmoRLZXnorrDlvZXooqvorr/pl67ov4fnmoRVUkzvvIzlvZNCbG9ja+iiq+iiq+inpuWPkeaXtuWIqeeUqGRlbHRh5YC86Lez6L2s5Yiw5LmL5YmN55qE6aG16Z2iXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVNZW1vcnlSZWNvcmQ8VCwgUz4oaW5pdFZhbDogUywgZm46IChhcmc6IFMpID0+IFQpIHtcclxuICBsZXQgdmlzaXRlZFJlY29yZDogVFtdID0gW2ZuKGluaXRWYWwpXTtcclxuXHJcbiAgZnVuY3Rpb24gZ2V0RGVsdGEodG86IFMsIGZvcm06IFMpOiBudW1iZXIge1xyXG4gICAgbGV0IHRvSWR4ID0gdmlzaXRlZFJlY29yZC5sYXN0SW5kZXhPZihmbih0bykpO1xyXG4gICAgaWYgKHRvSWR4ID09PSAtMSkge1xyXG4gICAgICB0b0lkeCA9IDA7XHJcbiAgICB9XHJcbiAgICBsZXQgZnJvbUlkeCA9IHZpc2l0ZWRSZWNvcmQubGFzdEluZGV4T2YoZm4oZm9ybSkpO1xyXG4gICAgaWYgKGZyb21JZHggPT09IC0xKSB7XHJcbiAgICAgIGZyb21JZHggPSAwO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRvSWR4IC0gZnJvbUlkeDtcclxuICB9XHJcblxyXG4gIGZ1bmN0aW9uIGFkZFJlY29yZChjdXJyZW50OiBTLCBuZXdSZWNvcmQ6IFMsIGFjdGlvbjogQWN0aW9uKSB7XHJcbiAgICBjb25zdCBjdXJWYWwgPSBmbihjdXJyZW50KTtcclxuICAgIGNvbnN0IE5ld1ZhbCA9IGZuKG5ld1JlY29yZCk7XHJcbiAgICBpZiAoYWN0aW9uID09PSBBY3Rpb24ucHVzaCkge1xyXG4gICAgICBjb25zdCBwcmV2SWR4ID0gdmlzaXRlZFJlY29yZC5sYXN0SW5kZXhPZihjdXJWYWwpO1xyXG4gICAgICBjb25zdCBuZXdWaXNpdGVkUmVjb3JkID0gdmlzaXRlZFJlY29yZC5zbGljZSgwLCBwcmV2SWR4ICsgMSk7XHJcbiAgICAgIG5ld1Zpc2l0ZWRSZWNvcmQucHVzaChOZXdWYWwpO1xyXG4gICAgICB2aXNpdGVkUmVjb3JkID0gbmV3VmlzaXRlZFJlY29yZDtcclxuICAgIH1cclxuICAgIGlmIChhY3Rpb24gPT09IEFjdGlvbi5yZXBsYWNlKSB7XHJcbiAgICAgIGNvbnN0IHByZXZJZHggPSB2aXNpdGVkUmVjb3JkLmxhc3RJbmRleE9mKGN1clZhbCk7XHJcbiAgICAgIGlmIChwcmV2SWR4ICE9PSAtMSkge1xyXG4gICAgICAgIHZpc2l0ZWRSZWNvcmRbcHJldklkeF0gPSBOZXdWYWw7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJldHVybiB7IGdldERlbHRhLCBhZGRSZWNvcmQgfTtcclxufVxyXG5cclxuZnVuY3Rpb24gZ2VuUmFuZG9tS2V5KGxlbmd0aDogbnVtYmVyKTogKCkgPT4gc3RyaW5nIHtcclxuICBjb25zdCBlbmQgPSBsZW5ndGggKyAyO1xyXG4gIHJldHVybiAoKSA9PiB7XHJcbiAgICByZXR1cm4gTWF0aC5yYW5kb20oKS50b1N0cmluZygxOCkuc3Vic3RyaW5nKDIsIGVuZCk7XHJcbiAgfTtcclxufVxyXG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7XG4gIGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTtcbiAgfVxufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7XG4gIFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjtcblxuICByZXR1cm4gX3R5cGVvZiA9IFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIFwic3ltYm9sXCIgPT0gdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA/IGZ1bmN0aW9uIChvYmopIHtcbiAgICByZXR1cm4gdHlwZW9mIG9iajtcbiAgfSA6IGZ1bmN0aW9uIChvYmopIHtcbiAgICByZXR1cm4gb2JqICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqO1xuICB9LCBfdHlwZW9mKG9iaik7XG59IiwiaW1wb3J0IF90eXBlb2YgZnJvbSBcIi4vdHlwZW9mLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfdG9QcmltaXRpdmUoaW5wdXQsIGhpbnQpIHtcbiAgaWYgKF90eXBlb2YoaW5wdXQpICE9PSBcIm9iamVjdFwiIHx8IGlucHV0ID09PSBudWxsKSByZXR1cm4gaW5wdXQ7XG4gIHZhciBwcmltID0gaW5wdXRbU3ltYm9sLnRvUHJpbWl0aXZlXTtcbiAgaWYgKHByaW0gIT09IHVuZGVmaW5lZCkge1xuICAgIHZhciByZXMgPSBwcmltLmNhbGwoaW5wdXQsIGhpbnQgfHwgXCJkZWZhdWx0XCIpO1xuICAgIGlmIChfdHlwZW9mKHJlcykgIT09IFwib2JqZWN0XCIpIHJldHVybiByZXM7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkBAdG9QcmltaXRpdmUgbXVzdCByZXR1cm4gYSBwcmltaXRpdmUgdmFsdWUuXCIpO1xuICB9XG4gIHJldHVybiAoaGludCA9PT0gXCJzdHJpbmdcIiA/IFN0cmluZyA6IE51bWJlcikoaW5wdXQpO1xufSIsImltcG9ydCBfdHlwZW9mIGZyb20gXCIuL3R5cGVvZi5qc1wiO1xuaW1wb3J0IHRvUHJpbWl0aXZlIGZyb20gXCIuL3RvUHJpbWl0aXZlLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfdG9Qcm9wZXJ0eUtleShhcmcpIHtcbiAgdmFyIGtleSA9IHRvUHJpbWl0aXZlKGFyZywgXCJzdHJpbmdcIik7XG4gIHJldHVybiBfdHlwZW9mKGtleSkgPT09IFwic3ltYm9sXCIgPyBrZXkgOiBTdHJpbmcoa2V5KTtcbn0iLCJpbXBvcnQgdG9Qcm9wZXJ0eUtleSBmcm9tIFwiLi90b1Byb3BlcnR5S2V5LmpzXCI7XG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldO1xuICAgIGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTtcbiAgICBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7XG4gICAgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCB0b1Byb3BlcnR5S2V5KGRlc2NyaXB0b3Iua2V5KSwgZGVzY3JpcHRvcik7XG4gIH1cbn1cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHtcbiAgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7XG4gIGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbnN0cnVjdG9yLCBcInByb3RvdHlwZVwiLCB7XG4gICAgd3JpdGFibGU6IGZhbHNlXG4gIH0pO1xuICByZXR1cm4gQ29uc3RydWN0b3I7XG59IiwiaW1wb3J0IHsgQWN0aW9uLCBDYWxsQmFja0Z1bmMsIENvbmZpcm1hdGlvbkZ1bmMsIExpc3RlbmVyLCBMb2NhdGlvbiwgTmF2aWdhdGlvbiwgUHJvbXB0LCBUTWFuYWdlciB9IGZyb20gJy4vdHlwZXMnO1xyXG5cclxuY2xhc3MgVHJhbnNpdGlvbk1hbmFnZXI8Uz4gaW1wbGVtZW50cyBUTWFuYWdlcjxTPiB7XHJcbiAgcHJpdmF0ZSBwcm9tcHQ6IFByb21wdDxTPjtcclxuICBwcml2YXRlIGxpc3RlbmVyczogTGlzdGVuZXI8Uz5bXTtcclxuXHJcbiAgY29uc3RydWN0b3IoKSB7XHJcbiAgICB0aGlzLnByb21wdCA9IG51bGw7XHJcbiAgICB0aGlzLmxpc3RlbmVycyA9IFtdO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldFByb21wdChwcm9tcHQ6IFByb21wdDxTPik6ICgpID0+IHZvaWQge1xyXG4gICAgdGhpcy5wcm9tcHQgPSBwcm9tcHQ7XHJcblxyXG4gICAgLy8g5riF6ZmkUHJvbXB0XHJcbiAgICByZXR1cm4gKCkgPT4ge1xyXG4gICAgICBpZiAodGhpcy5wcm9tcHQgPT09IHByb21wdCkge1xyXG4gICAgICAgIHRoaXMucHJvbXB0ID0gbnVsbDtcclxuICAgICAgfVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIC8vIOS9v+eUqOWPkeW4g+iuoumYheaooeW8j+euoeeQhmhpc3RvcnnnmoTnm5HlkKzogIVcclxuICBwdWJsaWMgYWRkTGlzdGVuZXIoZnVuYzogTGlzdGVuZXI8Uz4pOiAoKSA9PiB2b2lkIHtcclxuICAgIGxldCBpc0FjdGl2ZSA9IHRydWU7XHJcbiAgICBjb25zdCBsaXN0ZW5lciA9IChhcmdzOiBOYXZpZ2F0aW9uPFM+KSA9PiB7XHJcbiAgICAgIGlmIChpc0FjdGl2ZSkge1xyXG4gICAgICAgIGZ1bmMoYXJncyk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgICB0aGlzLmxpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcclxuICAgIHJldHVybiAoKSA9PiB7XHJcbiAgICAgIGlzQWN0aXZlID0gZmFsc2U7XHJcbiAgICAgIC8vIOenu+mZpOWvueW6lOeahOebkeWQrOiAhVxyXG4gICAgICB0aGlzLmxpc3RlbmVycyA9IHRoaXMubGlzdGVuZXJzLmZpbHRlcihpdGVtID0+IGl0ZW0gIT09IGxpc3RlbmVyKTtcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbm90aWZ5TGlzdGVuZXJzKGFyZ3M6IE5hdmlnYXRpb248Uz4pIHtcclxuICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgdGhpcy5saXN0ZW5lcnMpIHtcclxuICAgICAgbGlzdGVuZXIoYXJncyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY29uZmlybUp1bXBUbyhcclxuICAgIGxvY2F0aW9uOiBMb2NhdGlvbjxTPixcclxuICAgIGFjdGlvbjogQWN0aW9uLFxyXG4gICAgdXNlckNvbmZpcm1hdGlvbkZ1bmM6IENvbmZpcm1hdGlvbkZ1bmMsXHJcbiAgICBjYWxsQmFjazogQ2FsbEJhY2tGdW5jXHJcbiAgKSB7XHJcbiAgICBpZiAodGhpcy5wcm9tcHQgIT09IG51bGwpIHtcclxuICAgICAgY29uc3QgcmVzdWx0ID0gdHlwZW9mIHRoaXMucHJvbXB0ID09PSAnZnVuY3Rpb24nID8gdGhpcy5wcm9tcHQobG9jYXRpb24sIGFjdGlvbikgOiB0aGlzLnByb21wdDtcclxuICAgICAgaWYgKHR5cGVvZiByZXN1bHQgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgdHlwZW9mIHVzZXJDb25maXJtYXRpb25GdW5jID09PSAnZnVuY3Rpb24nID8gdXNlckNvbmZpcm1hdGlvbkZ1bmMocmVzdWx0LCBjYWxsQmFjaykgOiBjYWxsQmFjayh0cnVlKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjYWxsQmFjayhyZXN1bHQgIT09IGZhbHNlKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY2FsbEJhY2sodHJ1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBUcmFuc2l0aW9uTWFuYWdlcjtcclxuIiwiZnVuY3Rpb24gd2FybmluZyhjb25kaXRpb246IGFueSwgbWVzc2FnZTogc3RyaW5nKSB7XHJcbiAgaWYgKGNvbmRpdGlvbikge1xyXG4gICAgaWYgKGNvbnNvbGUgJiYgdHlwZW9mIGNvbnNvbGUud2FybiA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICBjb25zb2xlLndhcm4obWVzc2FnZSk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCB3YXJuaW5nOyIsImltcG9ydCB7IEhpc3RvcnlQcm9wcywgTGlzdGVuZXIsIE5hdmlnYXRpb24sIFByb21wdCB9IGZyb20gJy4vdHlwZXMnO1xyXG5pbXBvcnQgdHJhbnNpdGlvbk1hbmFnZXIgZnJvbSAnLi90cmFuc2l0aW9uTWFuYWdlcic7XHJcblxyXG4vLyDmir3lj5ZCcm93c2VySGlzdG9yeeWSjEhhc2hIaXN0b3J55Lit55u45ZCM55qE5pa55rOVXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRCYXNlSGlzdG9yeTxTPihcclxuICB0cmFuc2l0aW9uTWFuYWdlcjogdHJhbnNpdGlvbk1hbmFnZXI8Uz4sXHJcbiAgc2V0TGlzdGVuZXI6IChkZWx0YTogbnVtYmVyKSA9PiB2b2lkLFxyXG4gIGJyb3dzZXJIaXN0b3J5OiBIaXN0b3J5LFxyXG4pIHtcclxuICBmdW5jdGlvbiBnbyhzdGVwOiBudW1iZXIpIHtcclxuICAgIGJyb3dzZXJIaXN0b3J5LmdvKHN0ZXApO1xyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gZ29CYWNrKCkge1xyXG4gICAgYnJvd3Nlckhpc3RvcnkuZ28oLTEpO1xyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gZ29Gb3J3YXJkKCkge1xyXG4gICAgYnJvd3Nlckhpc3RvcnkuZ28oMSk7XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiBsaXN0ZW4obGlzdGVuZXI6IExpc3RlbmVyPFM+KTogKCkgPT4gdm9pZCB7XHJcbiAgICBjb25zdCBjYW5jZWwgPSB0cmFuc2l0aW9uTWFuYWdlci5hZGRMaXN0ZW5lcihsaXN0ZW5lcik7XHJcbiAgICBzZXRMaXN0ZW5lcigxKTtcclxuICAgIHJldHVybiAoKSA9PiB7XHJcbiAgICAgIHNldExpc3RlbmVyKC0xKTtcclxuICAgICAgY2FuY2VsKCk7XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgbGV0IGlzQmxvY2tlZCA9IGZhbHNlO1xyXG5cclxuICBmdW5jdGlvbiBibG9jayhwcm9tcHQ6IFByb21wdDxTPiA9IGZhbHNlKTogKCkgPT4gdm9pZCB7XHJcbiAgICBjb25zdCB1bmJsb2NrID0gdHJhbnNpdGlvbk1hbmFnZXIuc2V0UHJvbXB0KHByb21wdCk7XHJcbiAgICBpZiAoIWlzQmxvY2tlZCkge1xyXG4gICAgICBzZXRMaXN0ZW5lcigxKTtcclxuICAgICAgaXNCbG9ja2VkID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiAoKSA9PiB7XHJcbiAgICAgIGlmIChpc0Jsb2NrZWQpIHtcclxuICAgICAgICBpc0Jsb2NrZWQgPSBmYWxzZTtcclxuICAgICAgICBzZXRMaXN0ZW5lcigtMSk7XHJcbiAgICAgIH1cclxuICAgICAgdW5ibG9jaygpO1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIGZ1bmN0aW9uIGdldFVwZGF0ZVN0YXRlRnVuYyhoaXN0b3J5UHJvcHM6IEhpc3RvcnlQcm9wczxTPikge1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChuZXh0U3RhdGU6IE5hdmlnYXRpb248Uz4gfCB1bmRlZmluZWQpIHtcclxuICAgICAgaWYgKG5leHRTdGF0ZSkge1xyXG4gICAgICAgIE9iamVjdC5hc3NpZ24oaGlzdG9yeVByb3BzLCBuZXh0U3RhdGUpO1xyXG4gICAgICB9XHJcbiAgICAgIGhpc3RvcnlQcm9wcy5sZW5ndGggPSBicm93c2VySGlzdG9yeS5sZW5ndGg7XHJcbiAgICAgIGNvbnN0IGFyZ3MgPSB7IGxvY2F0aW9uOiBoaXN0b3J5UHJvcHMubG9jYXRpb24sIGFjdGlvbjogaGlzdG9yeVByb3BzLmFjdGlvbiB9O1xyXG4gICAgICB0cmFuc2l0aW9uTWFuYWdlci5ub3RpZnlMaXN0ZW5lcnMoYXJncyk7XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHsgZ28sIGdvQmFjaywgZ29Gb3J3YXJkLCBsaXN0ZW4sIGJsb2NrLCBnZXRVcGRhdGVTdGF0ZUZ1bmMgfTtcclxufVxyXG4iLCJpbXBvcnQgeyBnZXREZWZhdWx0Q29uZmlybWF0aW9uLCBpc1N1cHBvcnRIaXN0b3J5LCBpc1N1cHBvcnRzUG9wU3RhdGUgfSBmcm9tICcuL2RvbSc7XHJcbmltcG9ydCB7IEFjdGlvbiwgQmFzZU9wdGlvbiwgRGVmYXVsdFN0YXRlVHlwZSwgRXZlbnRUeXBlLCBIaXN0b3J5LCBIaXN0b3J5U3RhdGUsIExvY2F0aW9uLCBQYXRoLCBUbyB9IGZyb20gJy4vdHlwZXMnO1xyXG5pbXBvcnQgeyBub3JtYWxpemVTbGFzaCwgY3JlYXRlTWVtb3J5UmVjb3JkLCBjcmVhdGVQYXRoLCBjcmVhdGVMb2NhdGlvbiwgc3RyaXBCYXNlbmFtZSB9IGZyb20gJy4vdXRpbHMnO1xyXG5pbXBvcnQgVHJhbnNpdGlvbk1hbmFnZXIgZnJvbSAnLi90cmFuc2l0aW9uTWFuYWdlcic7XHJcblxyXG5pbXBvcnQgd2FybmluZyBmcm9tICcuL3dhcmluZyc7XHJcbmltcG9ydCB7IGdldEJhc2VIaXN0b3J5IH0gZnJvbSAnLi9iYXNlSGlzdG9yeSc7XHJcblxyXG5leHBvcnQgdHlwZSBCcm93c2VySGlzdG9yeU9wdGlvbiA9IHtcclxuICAvKipcclxuICAgKiBmb3JjZVJlZnJlc2jkuLpUcnVl5pe26Lez6L2s5pe25Lya5by65Yi25Yi35paw6aG16Z2iXHJcbiAgICovXHJcbiAgZm9yY2VSZWZyZXNoPzogYm9vbGVhbjtcclxufSAmIEJhc2VPcHRpb247XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQnJvd3Nlckhpc3Rvcnk8UyA9IERlZmF1bHRTdGF0ZVR5cGU+KG9wdGlvbnM6IEJyb3dzZXJIaXN0b3J5T3B0aW9uID0ge30pOiBIaXN0b3J5PFM+IHtcclxuICBjb25zdCBzdXBwb3J0SGlzdG9yeSA9IGlzU3VwcG9ydEhpc3RvcnkoKTtcclxuICBjb25zdCBpc1N1cHBvcnRQb3BTdGF0ZSA9IGlzU3VwcG9ydHNQb3BTdGF0ZSgpO1xyXG4gIGNvbnN0IGJyb3dzZXJIaXN0b3J5ID0gd2luZG93Lmhpc3Rvcnk7XHJcbiAgY29uc3QgeyBmb3JjZVJlZnJlc2ggPSBmYWxzZSwgZ2V0VXNlckNvbmZpcm1hdGlvbiA9IGdldERlZmF1bHRDb25maXJtYXRpb24gfSA9IG9wdGlvbnM7XHJcblxyXG4gIGNvbnN0IGJhc2VuYW1lID0gb3B0aW9ucy5iYXNlbmFtZSA/IG5vcm1hbGl6ZVNsYXNoKG9wdGlvbnMuYmFzZW5hbWUpIDogJyc7XHJcblxyXG4gIGNvbnN0IGluaXRMb2NhdGlvbiA9IGdldExvY2F0aW9uKGdldEhpc3RvcnlTdGF0ZSgpKTtcclxuXHJcbiAgY29uc3QgcmVjb3JkT3BlcmF0b3IgPSBjcmVhdGVNZW1vcnlSZWNvcmQ8c3RyaW5nLCBMb2NhdGlvbjxTPj4oaW5pdExvY2F0aW9uLCBsID0+IGwua2V5KTtcclxuXHJcbiAgY29uc3QgdHJhbnNpdGlvbk1hbmFnZXIgPSBuZXcgVHJhbnNpdGlvbk1hbmFnZXI8Uz4oKTtcclxuXHJcbiAgY29uc3QgeyBnbywgZ29CYWNrLCBnb0ZvcndhcmQsIGxpc3RlbiwgYmxvY2ssIGdldFVwZGF0ZVN0YXRlRnVuYyB9ID0gZ2V0QmFzZUhpc3Rvcnk8Uz4oXHJcbiAgICB0cmFuc2l0aW9uTWFuYWdlcixcclxuICAgIHNldExpc3RlbmVyLFxyXG4gICAgYnJvd3Nlckhpc3RvcnksXHJcbiAgKTtcclxuXHJcbiAgY29uc3QgaGlzdG9yeTogSGlzdG9yeTxTPiA9IHtcclxuICAgIGFjdGlvbjogQWN0aW9uLnBvcCxcclxuICAgIGxlbmd0aDogYnJvd3Nlckhpc3RvcnkubGVuZ3RoLFxyXG4gICAgbG9jYXRpb246IGluaXRMb2NhdGlvbixcclxuICAgIGdvLFxyXG4gICAgZ29CYWNrLFxyXG4gICAgZ29Gb3J3YXJkLFxyXG4gICAgbGlzdGVuLFxyXG4gICAgYmxvY2ssXHJcbiAgICBwdXNoLFxyXG4gICAgcmVwbGFjZSxcclxuICAgIGNyZWF0ZUhyZWYsXHJcbiAgfTtcclxuXHJcbiAgY29uc3QgdXBkYXRlU3RhdGUgPSBnZXRVcGRhdGVTdGF0ZUZ1bmMoaGlzdG9yeSk7XHJcblxyXG4gIGZ1bmN0aW9uIGdldEhpc3RvcnlTdGF0ZSgpIHtcclxuICAgIHJldHVybiBzdXBwb3J0SGlzdG9yeSA/IHdpbmRvdy5oaXN0b3J5LnN0YXRlIDoge307XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiBnZXRMb2NhdGlvbihoaXN0b3J5U3RhdGU6IFBhcnRpYWw8SGlzdG9yeVN0YXRlPFM+Pikge1xyXG4gICAgY29uc3QgeyBzZWFyY2gsIGhhc2ggfSA9IHdpbmRvdy5sb2NhdGlvbjtcclxuICAgIGNvbnN0IHsga2V5LCBzdGF0ZSB9ID0gaGlzdG9yeVN0YXRlIHx8IHt9O1xyXG4gICAgbGV0IHBhdGhuYW1lID0gd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lO1xyXG4gICAgcGF0aG5hbWUgPSBiYXNlbmFtZSA/IHN0cmlwQmFzZW5hbWUocGF0aG5hbWUsIGJhc2VuYW1lKSA6IHBhdGhuYW1lO1xyXG5cclxuICAgIHJldHVybiBjcmVhdGVMb2NhdGlvbjxTPignJywgeyBwYXRobmFtZSwgc2VhcmNoLCBoYXNoIH0sIHN0YXRlLCBrZXkpO1xyXG4gIH1cclxuXHJcbiAgLy8g5oum5oiq6aG16Z2iUE9Q5LqL5Lu25ZCO77yM6Ziy5q2i6L+U5Zue5Yiw55qE6aG16Z2i6KKr6YeN5aSN5oum5oiqXHJcbiAgbGV0IGZvcmNlSnVtcCA9IGZhbHNlO1xyXG5cclxuICBmdW5jdGlvbiBoYW5kbGVQb3BTdGF0ZShsb2NhdGlvbjogTG9jYXRpb248Uz4pIHtcclxuICAgIGlmIChmb3JjZUp1bXApIHtcclxuICAgICAgZm9yY2VKdW1wID0gZmFsc2U7XHJcbiAgICAgIHVwZGF0ZVN0YXRlKHVuZGVmaW5lZCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCBhY3Rpb24gPSBBY3Rpb24ucG9wO1xyXG5cclxuICAgICAgY29uc3QgY2FsbGJhY2sgPSAoaXNKdW1wOiBib29sZWFuKSA9PiB7XHJcbiAgICAgICAgaWYgKGlzSnVtcCkge1xyXG4gICAgICAgICAgLy8g5omn6KGM6Lez6L2s6KGM5Li6XHJcbiAgICAgICAgICB1cGRhdGVTdGF0ZSh7IGFjdGlvbjogYWN0aW9uLCBsb2NhdGlvbjogbG9jYXRpb24gfSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJldmVydFBvcFN0YXRlKGxvY2F0aW9uLCBoaXN0b3J5LmxvY2F0aW9uKTtcclxuICAgICAgICB9XHJcbiAgICAgIH07XHJcblxyXG4gICAgICB0cmFuc2l0aW9uTWFuYWdlci5jb25maXJtSnVtcFRvKGxvY2F0aW9uLCBhY3Rpb24sIGdldFVzZXJDb25maXJtYXRpb24sIGNhbGxiYWNrKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGZ1bmN0aW9uIHBvcFN0YXRlTGlzdGVuZXIoZXZlbnQ6IFBvcFN0YXRlRXZlbnQpIHtcclxuICAgIGhhbmRsZVBvcFN0YXRlKGdldExvY2F0aW9uKGV2ZW50LnN0YXRlKSk7XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiBoYXNoQ2hhbmdlTGlzdGVuZXIoKSB7XHJcbiAgICBjb25zdCBsb2NhdGlvbiA9IGdldExvY2F0aW9uKGdldEhpc3RvcnlTdGF0ZSgpKTtcclxuICAgIGhhbmRsZVBvcFN0YXRlKGxvY2F0aW9uKTtcclxuICB9XHJcblxyXG4gIGxldCBsaXN0ZW5lckNvdW50ID0gMDtcclxuXHJcbiAgZnVuY3Rpb24gc2V0TGlzdGVuZXIoY291bnQ6IG51bWJlcikge1xyXG4gICAgbGlzdGVuZXJDb3VudCArPSBjb3VudDtcclxuICAgIGlmIChsaXN0ZW5lckNvdW50ID09PSAxICYmIGNvdW50ID09PSAxKSB7XHJcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKEV2ZW50VHlwZS5Qb3BTdGF0ZSwgcG9wU3RhdGVMaXN0ZW5lcik7XHJcbiAgICAgIGlmICghaXNTdXBwb3J0UG9wU3RhdGUpIHtcclxuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihFdmVudFR5cGUuSGFzaENoYW5nZSwgaGFzaENoYW5nZUxpc3RlbmVyKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmIChsaXN0ZW5lckNvdW50ID09PSAwKSB7XHJcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKEV2ZW50VHlwZS5Qb3BTdGF0ZSwgcG9wU3RhdGVMaXN0ZW5lcik7XHJcbiAgICAgIGlmICghaXNTdXBwb3J0UG9wU3RhdGUpIHtcclxuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihFdmVudFR5cGUuSGFzaENoYW5nZSwgaGFzaENoYW5nZUxpc3RlbmVyKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8g5Y+W5raI6aG16Z2i6Lez6L2s5bm25oGi5aSN5Yiw6Lez6L2s5YmN55qE6aG16Z2iXHJcbiAgZnVuY3Rpb24gcmV2ZXJ0UG9wU3RhdGUoZm9ybTogTG9jYXRpb248Uz4sIHRvOiBMb2NhdGlvbjxTPikge1xyXG4gICAgY29uc3QgZGVsdGEgPSByZWNvcmRPcGVyYXRvci5nZXREZWx0YSh0bywgZm9ybSk7XHJcbiAgICBpZiAoZGVsdGEgIT09IDApIHtcclxuICAgICAgZ28oZGVsdGEpO1xyXG4gICAgICBmb3JjZUp1bXAgPSB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gY3JlYXRlSHJlZihwYXRoOiBQYXJ0aWFsPFBhdGg+KSB7XHJcbiAgICByZXR1cm4gYmFzZW5hbWUgKyBjcmVhdGVQYXRoKHBhdGgpO1xyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gcHVzaCh0bzogVG8sIHN0YXRlPzogUykge1xyXG4gICAgY29uc3QgYWN0aW9uID0gQWN0aW9uLnB1c2g7XHJcbiAgICBjb25zdCBsb2NhdGlvbiA9IGNyZWF0ZUxvY2F0aW9uPFM+KGhpc3RvcnkubG9jYXRpb24sIHRvLCBzdGF0ZSwgdW5kZWZpbmVkKTtcclxuXHJcbiAgICB0cmFuc2l0aW9uTWFuYWdlci5jb25maXJtSnVtcFRvKGxvY2F0aW9uLCBhY3Rpb24sIGdldFVzZXJDb25maXJtYXRpb24sIGlzSnVtcCA9PiB7XHJcbiAgICAgIGlmICghaXNKdW1wKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IGhyZWYgPSBjcmVhdGVIcmVmKGxvY2F0aW9uKTtcclxuICAgICAgY29uc3QgeyBrZXksIHN0YXRlIH0gPSBsb2NhdGlvbjtcclxuXHJcbiAgICAgIGlmIChzdXBwb3J0SGlzdG9yeSkge1xyXG4gICAgICAgIGlmIChmb3JjZVJlZnJlc2gpIHtcclxuICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gaHJlZjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgYnJvd3Nlckhpc3RvcnkucHVzaFN0YXRlKHsga2V5OiBrZXksIHN0YXRlOiBzdGF0ZSB9LCAnJywgaHJlZik7XHJcbiAgICAgICAgICByZWNvcmRPcGVyYXRvci5hZGRSZWNvcmQoaGlzdG9yeS5sb2NhdGlvbiwgbG9jYXRpb24sIGFjdGlvbik7XHJcbiAgICAgICAgICB1cGRhdGVTdGF0ZSh7IGFjdGlvbiwgbG9jYXRpb24gfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHdhcm5pbmcoc3RhdGUgIT09IHVuZGVmaW5lZCwgJ0Jyb3dzZXIgaGlzdG9yeSBjYW5ub3QgcHVzaCBzdGF0ZSBpbiBicm93c2VycyB0aGF0IGRvIG5vdCBzdXBwb3J0IEhUTUw1IGhpc3RvcnknKTtcclxuICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IGhyZWY7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gcmVwbGFjZSh0bzogVG8sIHN0YXRlPzogUykge1xyXG4gICAgY29uc3QgYWN0aW9uID0gQWN0aW9uLnJlcGxhY2U7XHJcbiAgICBjb25zdCBsb2NhdGlvbiA9IGNyZWF0ZUxvY2F0aW9uPFM+KGhpc3RvcnkubG9jYXRpb24sIHRvLCBzdGF0ZSwgdW5kZWZpbmVkKTtcclxuXHJcbiAgICB0cmFuc2l0aW9uTWFuYWdlci5jb25maXJtSnVtcFRvKGxvY2F0aW9uLCBhY3Rpb24sIGdldFVzZXJDb25maXJtYXRpb24sIGlzSnVtcCA9PiB7XHJcbiAgICAgIGlmICghaXNKdW1wKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IGhyZWYgPSBjcmVhdGVIcmVmKGxvY2F0aW9uKTtcclxuICAgICAgY29uc3QgeyBrZXksIHN0YXRlIH0gPSBsb2NhdGlvbjtcclxuICAgICAgaWYgKHN1cHBvcnRIaXN0b3J5KSB7XHJcbiAgICAgICAgaWYgKGZvcmNlUmVmcmVzaCkge1xyXG4gICAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlcGxhY2UoaHJlZik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGJyb3dzZXJIaXN0b3J5LnJlcGxhY2VTdGF0ZSh7IGtleToga2V5LCBzdGF0ZTogc3RhdGUgfSwgJycsIGhyZWYpO1xyXG4gICAgICAgICAgcmVjb3JkT3BlcmF0b3IuYWRkUmVjb3JkKGhpc3RvcnkubG9jYXRpb24sIGxvY2F0aW9uLCBhY3Rpb24pO1xyXG4gICAgICAgICAgdXBkYXRlU3RhdGUoeyBhY3Rpb24sIGxvY2F0aW9uIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB3YXJuaW5nKHN0YXRlICE9PSB1bmRlZmluZWQsICdCcm93c2VyIGhpc3RvcnkgY2Fubm90IHB1c2ggc3RhdGUgaW4gYnJvd3NlcnMgdGhhdCBkbyBub3Qgc3VwcG9ydCBIVE1MNSBoaXN0b3J5Jyk7XHJcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlcGxhY2UoaHJlZik7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGhpc3Rvcnk7XHJcbn1cclxuIiwiaW1wb3J0IHsgQWN0aW9uLCBCYXNlT3B0aW9uLCBEZWZhdWx0U3RhdGVUeXBlLCBFdmVudFR5cGUsIEhpc3RvcnksIExvY2F0aW9uLCBUbyB9IGZyb20gJy4vdHlwZXMnO1xyXG5pbXBvcnQge1xyXG4gIGFkZEhlYWRTbGFzaCxcclxuICBub3JtYWxpemVTbGFzaCxcclxuICBjcmVhdGVNZW1vcnlSZWNvcmQsXHJcbiAgY3JlYXRlUGF0aCxcclxuICBjcmVhdGVMb2NhdGlvbixcclxuICBpc0xvY2F0aW9uRXF1YWwsXHJcbiAgc3RyaXBCYXNlbmFtZSxcclxuICBzdHJpcEhlYWRTbGFzaCxcclxufSBmcm9tICcuL3V0aWxzJztcclxuaW1wb3J0IHsgZ2V0RGVmYXVsdENvbmZpcm1hdGlvbiB9IGZyb20gJy4vZG9tJztcclxuaW1wb3J0IFRyYW5zaXRpb25NYW5hZ2VyIGZyb20gJy4vdHJhbnNpdGlvbk1hbmFnZXInO1xyXG5cclxuaW1wb3J0IHdhcm5pbmcgZnJvbSAnLi93YXJpbmcnO1xyXG5pbXBvcnQgeyBnZXRCYXNlSGlzdG9yeSB9IGZyb20gJy4vYmFzZUhpc3RvcnknO1xyXG5cclxuZXhwb3J0IHR5cGUgdXJsSGFzaFR5cGUgPSAnc2xhc2gnIHwgJ25vc2xhc2gnO1xyXG5cclxudHlwZSBIYXNoSGlzdG9yeU9wdGlvbiA9IHtcclxuICBoYXNoVHlwZT86IHVybEhhc2hUeXBlO1xyXG59ICYgQmFzZU9wdGlvbjtcclxuXHJcbi8vIOiOt+WPliPliY3nmoTlhoXlrrlcclxuZnVuY3Rpb24gc3RyaXBIYXNoKHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgY29uc3QgaWR4ID0gcGF0aC5pbmRleE9mKCcjJyk7XHJcbiAgcmV0dXJuIGlkeCA9PT0gLTEgPyBwYXRoIDogcGF0aC5zdWJzdHJpbmcoMCwgaWR4KTtcclxufVxyXG5cclxuLy8g6I635Y+WI+WQjueahOWGheWuuVxyXG5mdW5jdGlvbiBnZXRIYXNoQ29udGVudChwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gIGNvbnN0IGlkeCA9IHBhdGguaW5kZXhPZignIycpO1xyXG4gIHJldHVybiBpZHggPT09IC0xID8gJycgOiBwYXRoLnN1YnN0cmluZyhpZHggKyAxKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUhhc2hIaXN0b3J5PFMgPSBEZWZhdWx0U3RhdGVUeXBlPihvcHRpb246IEhhc2hIaXN0b3J5T3B0aW9uID0ge30pOiBIaXN0b3J5PFM+IHtcclxuICBjb25zdCBicm93c2VySGlzdG9yeSA9IHdpbmRvdy5oaXN0b3J5O1xyXG4gIGNvbnN0IHsgaGFzaFR5cGUgPSAnc2xhc2gnLCBnZXRVc2VyQ29uZmlybWF0aW9uID0gZ2V0RGVmYXVsdENvbmZpcm1hdGlvbiB9ID0gb3B0aW9uO1xyXG5cclxuICBjb25zdCBiYXNlbmFtZSA9IG9wdGlvbi5iYXNlbmFtZSA/IG5vcm1hbGl6ZVNsYXNoKG9wdGlvbi5iYXNlbmFtZSkgOiAnJztcclxuXHJcbiAgY29uc3QgcGF0aERlY29kZXIgPSBhZGRIZWFkU2xhc2g7XHJcbiAgY29uc3QgcGF0aEVuY29kZXIgPSBoYXNoVHlwZSA9PT0gJ3NsYXNoJyA/IGFkZEhlYWRTbGFzaCA6IHN0cmlwSGVhZFNsYXNoO1xyXG5cclxuICBmdW5jdGlvbiBnZXRMb2NhdGlvbigpIHtcclxuICAgIGxldCBoYXNoUGF0aCA9IHBhdGhEZWNvZGVyKGdldEhhc2hDb250ZW50KHdpbmRvdy5sb2NhdGlvbi5oYXNoKSk7XHJcbiAgICBpZiAoYmFzZW5hbWUpIHtcclxuICAgICAgaGFzaFBhdGggPSBzdHJpcEJhc2VuYW1lKGhhc2hQYXRoLCBiYXNlbmFtZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGNyZWF0ZUxvY2F0aW9uPFM+KCcnLCBoYXNoUGF0aCwgdW5kZWZpbmVkLCAnZGVmYXVsdCcpO1xyXG4gIH1cclxuXHJcbiAgY29uc3QgaW5pdExvY2F0aW9uID0gZ2V0TG9jYXRpb24oKTtcclxuXHJcbiAgY29uc3QgbWVtUmVjb3JkcyA9IGNyZWF0ZU1lbW9yeVJlY29yZDxzdHJpbmcsIExvY2F0aW9uPFM+Pihpbml0TG9jYXRpb24sIGNyZWF0ZVBhdGgpO1xyXG5cclxuICBjb25zdCB0cmFuc2l0aW9uTWFuYWdlciA9IG5ldyBUcmFuc2l0aW9uTWFuYWdlcjxTPigpO1xyXG5cclxuICBmdW5jdGlvbiBjcmVhdGVIcmVmKGxvY2F0aW9uOiBMb2NhdGlvbjxTPikge1xyXG4gICAgY29uc3QgdGFnID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignYmFzZScpO1xyXG4gICAgY29uc3QgYmFzZSA9IHRhZyAmJiB0YWcuZ2V0QXR0cmlidXRlKCdocmVmJykgPyBzdHJpcEhhc2god2luZG93LmxvY2F0aW9uLmhyZWYpIDogJyc7XHJcbiAgICByZXR1cm4gYmFzZSArICcjJyArIHBhdGhFbmNvZGVyKGJhc2VuYW1lICsgY3JlYXRlUGF0aChsb2NhdGlvbikpO1xyXG4gIH1cclxuXHJcbiAgbGV0IGZvcmNlTmV4dFBvcCA9IGZhbHNlO1xyXG4gIGxldCBpZ25vcmVQYXRoOiBudWxsIHwgc3RyaW5nID0gbnVsbDtcclxuXHJcbiAgY29uc3QgeyBnbywgZ29CYWNrLCBnb0ZvcndhcmQsIGxpc3RlbiwgYmxvY2ssIGdldFVwZGF0ZVN0YXRlRnVuYyB9ID0gZ2V0QmFzZUhpc3RvcnkoXHJcbiAgICB0cmFuc2l0aW9uTWFuYWdlcixcclxuICAgIHNldExpc3RlbmVyLFxyXG4gICAgYnJvd3Nlckhpc3RvcnksXHJcbiAgKTtcclxuXHJcbiAgY29uc3QgaGlzdG9yeTogSGlzdG9yeTxTPiA9IHtcclxuICAgIGFjdGlvbjogQWN0aW9uLnBvcCxcclxuICAgIGxlbmd0aDogYnJvd3Nlckhpc3RvcnkubGVuZ3RoLFxyXG4gICAgbG9jYXRpb246IGluaXRMb2NhdGlvbixcclxuICAgIGdvLFxyXG4gICAgZ29CYWNrLFxyXG4gICAgZ29Gb3J3YXJkLFxyXG4gICAgcHVzaCxcclxuICAgIHJlcGxhY2UsXHJcbiAgICBsaXN0ZW4sXHJcbiAgICBibG9jayxcclxuICAgIGNyZWF0ZUhyZWYsXHJcbiAgfTtcclxuXHJcbiAgY29uc3QgdXBkYXRlU3RhdGUgPSBnZXRVcGRhdGVTdGF0ZUZ1bmMoaGlzdG9yeSk7XHJcblxyXG4gIGZ1bmN0aW9uIHB1c2godG86IFRvLCBzdGF0ZT86IFMpIHtcclxuICAgIHdhcm5pbmcoc3RhdGUgIT09IHVuZGVmaW5lZCwgJ0hhc2ggaGlzdG9yeSBkb2VzIG5vdCBzdXBwb3J0IHN0YXRlLCBpdCB3aWxsIGJlIGlnbm9yZWQnKTtcclxuXHJcbiAgICBjb25zdCBhY3Rpb24gPSBBY3Rpb24ucHVzaDtcclxuICAgIGNvbnN0IGxvY2F0aW9uID0gY3JlYXRlTG9jYXRpb248Uz4oaGlzdG9yeS5sb2NhdGlvbiwgdG8sIHVuZGVmaW5lZCwgJycpO1xyXG5cclxuICAgIHRyYW5zaXRpb25NYW5hZ2VyLmNvbmZpcm1KdW1wVG8obG9jYXRpb24sIGFjdGlvbiwgZ2V0VXNlckNvbmZpcm1hdGlvbiwgaXNKdW1wID0+IHtcclxuICAgICAgaWYgKCFpc0p1bXApIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgcGF0aCA9IGNyZWF0ZVBhdGgobG9jYXRpb24pO1xyXG4gICAgICBjb25zdCBlbmNvZGVkUGF0aCA9IHBhdGhFbmNvZGVyKGJhc2VuYW1lICsgcGF0aCk7XHJcbiAgICAgIC8vIOWJjeWQjmhhc2jkuI3kuIDmoLfmiY3ov5vooYzot7PovaxcclxuICAgICAgaWYgKGdldEhhc2hDb250ZW50KHdpbmRvdy5sb2NhdGlvbi5ocmVmKSAhPT0gZW5jb2RlZFBhdGgpIHtcclxuICAgICAgICBpZ25vcmVQYXRoID0gZW5jb2RlZFBhdGg7XHJcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLmhhc2ggPSBlbmNvZGVkUGF0aDtcclxuXHJcbiAgICAgICAgbWVtUmVjb3Jkcy5hZGRSZWNvcmQoaGlzdG9yeS5sb2NhdGlvbiwgbG9jYXRpb24sIGFjdGlvbik7XHJcblxyXG4gICAgICAgIHVwZGF0ZVN0YXRlKHsgYWN0aW9uLCBsb2NhdGlvbiB9KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB1cGRhdGVTdGF0ZSh1bmRlZmluZWQpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGZ1bmN0aW9uIHJlcGxhY2UodG86IFRvLCBzdGF0ZT86IFMpIHtcclxuICAgIHdhcm5pbmcoc3RhdGUgIT09IHVuZGVmaW5lZCwgJ0hhc2ggaGlzdG9yeSBkb2VzIG5vdCBzdXBwb3J0IHN0YXRlLCBpdCB3aWxsIGJlIGlnbm9yZWQnKTtcclxuICAgIGNvbnN0IGFjdGlvbiA9IEFjdGlvbi5yZXBsYWNlO1xyXG4gICAgY29uc3QgbG9jYXRpb24gPSBjcmVhdGVMb2NhdGlvbjxTPihoaXN0b3J5LmxvY2F0aW9uLCB0bywgdW5kZWZpbmVkLCAnJyk7XHJcblxyXG4gICAgdHJhbnNpdGlvbk1hbmFnZXIuY29uZmlybUp1bXBUbyhsb2NhdGlvbiwgYWN0aW9uLCBnZXRVc2VyQ29uZmlybWF0aW9uLCBpc0p1bXAgPT4ge1xyXG4gICAgICBpZiAoIWlzSnVtcCkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBwYXRoID0gY3JlYXRlUGF0aChsb2NhdGlvbik7XHJcbiAgICAgIGNvbnN0IGVuY29kZWRQYXRoID0gcGF0aEVuY29kZXIoYmFzZW5hbWUgKyBwYXRoKTtcclxuICAgICAgaWYgKGdldEhhc2hDb250ZW50KHdpbmRvdy5sb2NhdGlvbi5ocmVmKSAhPT0gZW5jb2RlZFBhdGgpIHtcclxuICAgICAgICBpZ25vcmVQYXRoID0gcGF0aDtcclxuICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVwbGFjZShzdHJpcEhhc2god2luZG93LmxvY2F0aW9uLmhyZWYpICsgJyMnICsgZW5jb2RlZFBhdGgpO1xyXG4gICAgICB9XHJcbiAgICAgIG1lbVJlY29yZHMuYWRkUmVjb3JkKGhpc3RvcnkubG9jYXRpb24sIGxvY2F0aW9uLCBhY3Rpb24pO1xyXG4gICAgICB1cGRhdGVTdGF0ZSh7IGFjdGlvbiwgbG9jYXRpb24gfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGZ1bmN0aW9uIGhhbmRsZUhhc2hDaGFuZ2UoKSB7XHJcbiAgICBjb25zdCBoYXNoUGF0aCA9IGdldEhhc2hDb250ZW50KHdpbmRvdy5sb2NhdGlvbi5ocmVmKTtcclxuICAgIGNvbnN0IGVuY29kZWRQYXRoID0gcGF0aEVuY29kZXIoaGFzaFBhdGgpO1xyXG4gICAgaWYgKGhhc2hQYXRoICE9PSBlbmNvZGVkUGF0aCkge1xyXG4gICAgICB3aW5kb3cubG9jYXRpb24ucmVwbGFjZShzdHJpcEhhc2god2luZG93LmxvY2F0aW9uLmhyZWYpICsgJyMnICsgZW5jb2RlZFBhdGgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgbG9jYXRpb24gPSBnZXRMb2NhdGlvbigpO1xyXG4gICAgICBjb25zdCBwcmV2TG9jYXRpb24gPSBoaXN0b3J5LmxvY2F0aW9uO1xyXG4gICAgICBpZiAoIWZvcmNlTmV4dFBvcCAmJiBpc0xvY2F0aW9uRXF1YWwobG9jYXRpb24sIHByZXZMb2NhdGlvbikpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGlnbm9yZVBhdGggPT09IGNyZWF0ZVBhdGgobG9jYXRpb24pKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGlnbm9yZVBhdGggPSBudWxsO1xyXG4gICAgICBoYW5kbGVQb3BTdGF0ZShsb2NhdGlvbik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiBoYW5kbGVQb3BTdGF0ZShsb2NhdGlvbjogTG9jYXRpb248Uz4pIHtcclxuICAgIGlmIChmb3JjZU5leHRQb3ApIHtcclxuICAgICAgZm9yY2VOZXh0UG9wID0gZmFsc2U7XHJcbiAgICAgIHVwZGF0ZVN0YXRlKHVuZGVmaW5lZCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCBhY3Rpb24gPSBBY3Rpb24ucG9wO1xyXG5cclxuICAgICAgY29uc3QgY2FsbGJhY2sgPSAoaXNKdW1wOiBib29sZWFuKSA9PiB7XHJcbiAgICAgICAgaWYgKGlzSnVtcCkge1xyXG4gICAgICAgICAgdXBkYXRlU3RhdGUoeyBhY3Rpb246IGFjdGlvbiwgbG9jYXRpb246IGxvY2F0aW9uIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXZlcnRQb3BTdGF0ZShsb2NhdGlvbik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9O1xyXG5cclxuICAgICAgdHJhbnNpdGlvbk1hbmFnZXIuY29uZmlybUp1bXBUbyhsb2NhdGlvbiwgYWN0aW9uLCBnZXRVc2VyQ29uZmlybWF0aW9uLCBjYWxsYmFjayk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyDlnKjot7PovazooYzkuLrooqtCbG9ja+WQju+8jOeUqEhpc3RvcnkuZ28oKei3s+i9rOWbnuS5i+WJjeeahOmhtemdolxyXG4gIGZ1bmN0aW9uIHJldmVydFBvcFN0YXRlKGZvcm06IExvY2F0aW9uPFM+KSB7XHJcbiAgICBjb25zdCB0byA9IGhpc3RvcnkubG9jYXRpb247XHJcbiAgICBjb25zdCBkZWx0YSA9IG1lbVJlY29yZHMuZ2V0RGVsdGEodG8sIGZvcm0pO1xyXG4gICAgaWYgKGRlbHRhICE9PSAwKSB7XHJcbiAgICAgIGdvKGRlbHRhKTtcclxuICAgICAgZm9yY2VOZXh0UG9wID0gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGxldCBsaXN0ZW5lckNvdW50ID0gMDtcclxuXHJcbiAgZnVuY3Rpb24gc2V0TGlzdGVuZXIoZGVsdGE6IG51bWJlcikge1xyXG4gICAgbGlzdGVuZXJDb3VudCArPSBkZWx0YTtcclxuICAgIGlmIChsaXN0ZW5lckNvdW50ID09PSAxICYmIGRlbHRhID09PSAxKSB7XHJcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKEV2ZW50VHlwZS5IYXNoQ2hhbmdlLCBoYW5kbGVIYXNoQ2hhbmdlKTtcclxuICAgIH0gZWxzZSBpZiAobGlzdGVuZXJDb3VudCA9PT0gMCkge1xyXG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihFdmVudFR5cGUuSGFzaENoYW5nZSwgaGFuZGxlSGFzaENoYW5nZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZXR1cm4gaGlzdG9yeTtcclxufVxyXG4iLCJpbXBvcnQgeyBjcmVhdGVDb250ZXh0IH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyBIaXN0b3J5LCBMb2NhdGlvbiB9IGZyb20gJy4vaW5kZXgnO1xyXG5pbXBvcnQgeyBNYXRjaGVkIH0gZnJvbSAnLi9tYXRjaGVyL3BhcnNlcic7XHJcblxyXG5mdW5jdGlvbiBjcmVhdGVOYW1lZENvbnRleHQ8VD4obmFtZTogc3RyaW5nLCBkZWZhdWx0VmFsdWU6IFQpIHtcclxuICBjb25zdCBjb250ZXh0ID0gY3JlYXRlQ29udGV4dDxUPihkZWZhdWx0VmFsdWUpO1xyXG4gIGNvbnRleHQuZGlzcGxheU5hbWUgPSBuYW1lO1xyXG4gIHJldHVybiBjb250ZXh0O1xyXG59XHJcblxyXG5leHBvcnQgdHlwZSBSb3V0ZXJDb250ZXh0VmFsdWUgPSB7XHJcbiAgaGlzdG9yeTogSGlzdG9yeTtcclxuICBsb2NhdGlvbjogTG9jYXRpb247XHJcbiAgbWF0Y2g6IE1hdGNoZWQgfCBudWxsO1xyXG59O1xyXG5cclxuY29uc3QgUm91dGVyQ29udGV4dCA9IGNyZWF0ZU5hbWVkQ29udGV4dDxSb3V0ZXJDb250ZXh0VmFsdWU+KCdSb3V0ZXInLCB7fSBhcyBhbnkpO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgUm91dGVyQ29udGV4dDsiLCJpbXBvcnQgeyBNYXRjaGVkLCBQYXJhbXMgfSBmcm9tICcuL3BhcnNlcic7XHJcblxyXG5leHBvcnQgdHlwZSBUb2tlbiA9IHtcclxuICB0eXBlOiBUb2tlblR5cGU7XHJcbiAgdmFsdWU6IHN0cmluZztcclxufTtcclxuXHJcbmV4cG9ydCBlbnVtIFRva2VuVHlwZSB7XHJcbiAgRGVsaW1pdGVyID0gJ2RlbGltaXRlcicsXHJcbiAgU3RhdGljID0gJ3N0YXRpYycsXHJcbiAgUGFyYW0gPSAncGFyYW0nLFxyXG4gIFdpbGRDYXJkID0gJ3dpbGRjYXJkJyxcclxuICBMQnJhY2tldCA9ICcoJyxcclxuICBSQnJhY2tldCA9ICcpJyxcclxuICBQYXR0ZXJuID0gJ3BhdHRlcm4nLFxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFBhcnNlcjxQPiB7XHJcbiAgcmVnZXhwOiBSZWdFeHA7XHJcblxyXG4gIGtleXM6IHN0cmluZ1tdO1xyXG5cclxuICBwYXJzZSh1cmw6IHN0cmluZyk6IE1hdGNoZWQ8UD4gfCBudWxsO1xyXG5cclxuICBjb21waWxlKHBhcmFtczogUGFyYW1zPFA+KTogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgdHlwZSBQYXJzZXJPcHRpb24gPSB7XHJcbiAgLy8g5piv5ZCm5aSn5bCP5YaZ5pWP5oSfXHJcbiAgY2FzZVNlbnNpdGl2ZT86IGJvb2xlYW47XHJcbiAgLy8g5piv5ZCm5ZCv55So5Lil5qC85qih5byPXHJcbiAgc3RyaWN0TW9kZT86IGJvb2xlYW47XHJcbiAgLy8g57K+5YeG5Yy56YWNIOWFvOWuuSBSZWFjdC1Sb3V0ZXJWNVxyXG4gIGV4YWN0PzogYm9vbGVhbjtcclxufTtcclxuXHJcbnR5cGUgQ2xlYXJMZWFkaW5nPFUgZXh0ZW5kcyBzdHJpbmc+ID0gVSBleHRlbmRzIGAvJHtpbmZlciBSfWAgPyBDbGVhckxlYWRpbmc8Uj4gOiBVO1xyXG50eXBlIENsZWFyVGFpbGluZzxVIGV4dGVuZHMgc3RyaW5nPiA9IFUgZXh0ZW5kcyBgJHtpbmZlciBMfS9gID8gQ2xlYXJUYWlsaW5nPEw+IDogVTtcclxuXHJcbnR5cGUgUGFyc2VQYXJhbTxQYXJhbSBleHRlbmRzIHN0cmluZz4gPSBQYXJhbSBleHRlbmRzIGA6JHtpbmZlciBSfWBcclxuICA/IHtcclxuICAgIFtLIGluIFJdOiBzdHJpbmc7XHJcbiAgfVxyXG4gIDoge307XHJcblxyXG50eXBlIE1lcmdlUGFyYW1zPE9uZVBhcmFtIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiwgT3RoZXJQYXJhbSBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4+ID0ge1xyXG4gIHJlYWRvbmx5IFtLZXkgaW4ga2V5b2YgT25lUGFyYW0gfCBrZXlvZiBPdGhlclBhcmFtXT86IHN0cmluZztcclxufTtcclxuXHJcbnR5cGUgUGFyc2VVUkxTdHJpbmc8U3RyIGV4dGVuZHMgc3RyaW5nPiA9IFN0ciBleHRlbmRzIGAke2luZmVyIFBhcmFtfS8ke2luZmVyIFJlc3R9YFxyXG4gID8gTWVyZ2VQYXJhbXM8UGFyc2VQYXJhbTxQYXJhbT4sIFBhcnNlVVJMU3RyaW5nPENsZWFyTGVhZGluZzxSZXN0Pj4+XHJcbiAgOiBQYXJzZVBhcmFtPFN0cj47XHJcblxyXG4vLyDop6PmnpBVUkzkuK3nmoTliqjmgIHlj4LmlbDvvIzku6Xlrp7njrBUeXBlU2NyaXB05o+Q56S65Yqf6IO9XHJcbmV4cG9ydCB0eXBlIEdldFVSTFBhcmFtczxVIGV4dGVuZHMgc3RyaW5nPiA9IFBhcnNlVVJMU3RyaW5nPENsZWFyTGVhZGluZzxDbGVhclRhaWxpbmc8VT4+PjtcclxuIiwiLyoqXHJcbiAqIEBkZXNjcmlwdGlvbiDlsIZ1cmzkuK3nmoQvL+i9rOaNouS4ui9cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBjbGVhblBhdGgocGF0aDogc3RyaW5nKTogc3RyaW5nIHtcclxuICByZXR1cm4gcGF0aC5yZXBsYWNlKC9cXC8rL2csICcvJyk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzY29yZUNvbXBhcmUoc2NvcmUxOiBudW1iZXJbXSwgc2NvcmUyOiBudW1iZXJbXSk6IG51bWJlciB7XHJcbiAgY29uc3Qgc2NvcmUxTGVuZ3RoID0gc2NvcmUxLmxlbmd0aDtcclxuICBjb25zdCBzY29yZTJMZW5ndGggPSBzY29yZTIubGVuZ3RoO1xyXG4gIGNvbnN0IGVuZCA9IE1hdGgubWluKHNjb3JlMUxlbmd0aCwgc2NvcmUyTGVuZ3RoKTtcclxuICBmb3IgKGxldCBpID0gMDsgaSA8IGVuZDsgaSsrKSB7XHJcbiAgICBjb25zdCBkZWx0YSA9IHNjb3JlMltpXSAtIHNjb3JlMVtpXTtcclxuICAgIGlmIChkZWx0YSAhPT0gMCkge1xyXG4gICAgICByZXR1cm4gZGVsdGE7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGlmIChzY29yZTFMZW5ndGggPT09IHNjb3JlMkxlbmd0aCkge1xyXG4gICAgcmV0dXJuIDA7XHJcbiAgfVxyXG4gIHJldHVybiBzY29yZTFMZW5ndGggPiBzY29yZTJMZW5ndGggPyAtMSA6IDE7XHJcbn1cclxuXHJcbi8vIOaKiuato+WImeihqOi+vuW8j+eahOeJueauiuespuWPt+WKoOS4pOS4quWPjeaWnOadoOi/m+ihjOi9rOS5iVxyXG5leHBvcnQgZnVuY3Rpb24gZXNjYXBlU3RyKHN0cjogc3RyaW5nKSB7XHJcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC8oWy4rKj89XiE6JHt9KClbXFxdfC9cXFxcXSkvZywgJ1xcXFwkMScpO1xyXG59XHJcbiIsImltcG9ydCB7IFRva2VuLCBUb2tlblR5cGUgfSBmcm9tICcuL3R5cGVzJztcclxuaW1wb3J0IHsgY2xlYW5QYXRoIH0gZnJvbSAnLi91dGlscyc7XHJcblxyXG5jb25zdCB2YWxpZENoYXIgPSAvW14vOiooKV0vO1xyXG5cclxuLy8g5a+5VXJs5qih5p2/6L+b6KGM6K+N5rOV6Kej5p6Q77yM6Kej5p6Q57uT5p6c5Li6VG9rZW5zXHJcbmV4cG9ydCBmdW5jdGlvbiBsZXhlcihwYXRoOiBzdHJpbmcpOiBUb2tlbltdIHtcclxuICBjb25zdCB0b2tlbnM6IFRva2VuW10gPSBbXTtcclxuXHJcbiAgaWYgKCFwYXRoKSB7XHJcbiAgICByZXR1cm4gdG9rZW5zO1xyXG4gIH1cclxuXHJcbiAgbGV0IHVybFBhdGggPSBjbGVhblBhdGgocGF0aCk7XHJcbiAgaWYgKHVybFBhdGggIT09ICcqJyAmJiAhdXJsUGF0aC5zdGFydHNXaXRoKCcvJykpIHtcclxuICAgIHRocm93IG5ldyBFcnJvcihgVXJsIG11c3Qgc3RhcnQgd2l0aCBcIi9cIi5gKTtcclxuICB9XHJcblxyXG4gIGNvbnN0IGdldExpdGVyYWwgPSAoKSA9PiB7XHJcbiAgICBsZXQgbmFtZSA9ICcnO1xyXG4gICAgd2hpbGUgKGkgPCB1cmxQYXRoLmxlbmd0aCAmJiB2YWxpZENoYXIudGVzdCh1cmxQYXRoW2ldKSkge1xyXG4gICAgICBuYW1lICs9IHVybFBhdGhbaV07XHJcbiAgICAgIHNraXBDaGFyKDEpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5hbWU7XHJcbiAgfTtcclxuXHJcbiAgY29uc3Qgc2tpcENoYXIgPSAoc3RlcDogbnVtYmVyKSA9PiB7XHJcbiAgICBpICs9IHN0ZXA7XHJcbiAgfTtcclxuXHJcbiAgbGV0IGkgPSAwO1xyXG4gIHdoaWxlIChpIDwgdXJsUGF0aC5sZW5ndGgpIHtcclxuICAgIGNvbnN0IGN1ckNoYXIgPSB1cmxQYXRoW2ldO1xyXG4gICAgY29uc3QgcHJldkNoYXIgPSB1cmxQYXRoW2kgLSAxXTtcclxuXHJcbiAgICBpZiAoY3VyQ2hhciA9PT0gJy8nKSB7XHJcbiAgICAgIHRva2Vucy5wdXNoKHsgdHlwZTogVG9rZW5UeXBlLkRlbGltaXRlciwgdmFsdWU6IHVybFBhdGhbaV0gfSk7XHJcbiAgICAgIHNraXBDaGFyKDEpO1xyXG4gICAgICBjb250aW51ZTtcclxuICAgIH1cclxuICAgIC8vIGR5bmFtaWMgcGFyYW1zICgvOmEpXHJcbiAgICBpZiAocHJldkNoYXIgPT09ICcvJyAmJiBjdXJDaGFyID09PSAnOicpIHtcclxuICAgICAgc2tpcENoYXIoMSk7XHJcbiAgICAgIHRva2Vucy5wdXNoKHsgdHlwZTogVG9rZW5UeXBlLlBhcmFtLCB2YWx1ZTogZ2V0TGl0ZXJhbCgpIH0pO1xyXG4gICAgICBjb250aW51ZTtcclxuICAgIH1cclxuICAgIC8vIHdpbGRDYXJkIHBhcmFtcyAoLzoqKVxyXG4gICAgaWYgKChwcmV2Q2hhciA9PT0gJy8nIHx8IHByZXZDaGFyID09PSB1bmRlZmluZWQpICYmIGN1ckNoYXIgPT09ICcqJykge1xyXG4gICAgICB0b2tlbnMucHVzaCh7IHR5cGU6IFRva2VuVHlwZS5XaWxkQ2FyZCwgdmFsdWU6IHVybFBhdGhbaV0gfSk7XHJcbiAgICAgIHNraXBDaGFyKDEpO1xyXG4gICAgICBjb250aW51ZTtcclxuICAgIH1cclxuICAgIC8vIHN0YXRpYyBwYXJhbXNcclxuICAgIGlmIChwcmV2Q2hhciA9PT0gJy8nICYmIHZhbGlkQ2hhci50ZXN0KGN1ckNoYXIpKSB7XHJcbiAgICAgIHRva2Vucy5wdXNoKHsgdHlwZTogVG9rZW5UeXBlLlN0YXRpYywgdmFsdWU6IGdldExpdGVyYWwoKSB9KTtcclxuICAgICAgY29udGludWU7XHJcbiAgICB9XHJcbiAgICBpZiAoY3VyQ2hhciA9PT0gJygnKSB7XHJcbiAgICAgIHRva2Vucy5wdXNoKHsgdHlwZTogVG9rZW5UeXBlLkxCcmFja2V0LCB2YWx1ZTogJygnIH0pO1xyXG4gICAgICBza2lwQ2hhcigxKTtcclxuICAgICAgY29udGludWU7XHJcbiAgICB9XHJcbiAgICBpZiAoY3VyQ2hhciA9PT0gJyknKSB7XHJcbiAgICAgIHRva2Vucy5wdXNoKHsgdHlwZTogVG9rZW5UeXBlLlJCcmFja2V0LCB2YWx1ZTogJyknIH0pO1xyXG4gICAgICBza2lwQ2hhcigxKTtcclxuICAgICAgY29udGludWU7XHJcbiAgICB9XHJcbiAgICBpZiAodmFsaWRDaGFyLnRlc3QoY3VyQ2hhcikpIHtcclxuICAgICAgdG9rZW5zLnB1c2goeyB0eXBlOiBUb2tlblR5cGUuUGF0dGVybiwgdmFsdWU6IGdldExpdGVyYWwoKSB9KTtcclxuICAgICAgY29udGludWU7XHJcbiAgICB9XHJcbiAgICAvLyDot7Pov4fpnZ7ms5XlrZfnrKZcclxuICAgIHNraXBDaGFyKDEpO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHRva2VucztcclxufVxyXG4iLCJpbXBvcnQgeyBHZXRVUkxQYXJhbXMsIFBhcnNlciwgUGFyc2VyT3B0aW9uLCBUb2tlblR5cGUgfSBmcm9tICcuL3R5cGVzJztcclxuaW1wb3J0IHsgbGV4ZXIgfSBmcm9tICcuL2xleGVyJztcclxuaW1wb3J0IHsgZXNjYXBlU3RyLCBzY29yZUNvbXBhcmUgfSBmcm9tICcuL3V0aWxzJztcclxuXHJcbi8vIOS4jeWQjOexu+Wei+WPguaVsOeahOWMuemFjeW+l+WIhlxyXG5lbnVtIE1hdGNoU2NvcmUge1xyXG4gIC8vIOWbuuWumuWPguaVsFxyXG4gIHN0YXRpYyA9IDEwLFxyXG4gIC8vIOWKqOaAgeWPguaVsFxyXG4gIHBhcmFtID0gNixcclxuICAvLyDpgJrphY3nrKblj4LmlbBcclxuICB3aWxkY2FyZCA9IDMsXHJcbiAgcGxhY2Vob2xkZXIgPSAtMSxcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgUGFyYW1zPFA+ID0geyBbSyBpbiBrZXlvZiBQXT86IFBbS10gfTtcclxuXHJcbi8vIOWFvOWuuSByZWFjdCB2NSBtYXRjaGVk57G75Z6LXHJcbmV4cG9ydCB0eXBlIE1hdGNoZWQ8UCA9IGFueT4gPSB7XHJcbiAgc2NvcmU6IG51bWJlcltdO1xyXG4gIHBhcmFtczogUGFyYW1zPFA+O1xyXG4gIHBhdGg6IHN0cmluZztcclxuICB1cmw6IHN0cmluZztcclxuICBpc0V4YWN0OiBib29sZWFuO1xyXG59O1xyXG5cclxuY29uc3QgZGVmYXVsdE9wdGlvbjogUmVxdWlyZWQ8UGFyc2VyT3B0aW9uPiA9IHtcclxuICAvLyB1cmzljLnphY3ml7bmmK/lkKblpKflsI/lhpnmlY/mhJ9cclxuICBjYXNlU2Vuc2l0aXZlOiB0cnVlLFxyXG4gIC8vIOaYr+WQpuS4peagvOWMuemFjXVybOe7k+WwvueahC9cclxuICBzdHJpY3RNb2RlOiBmYWxzZSxcclxuICAvLyDmmK/lkKblrozlhajnsr7noa7ljLnphY1cclxuICBleGFjdDogZmFsc2UsXHJcbn07XHJcbi8vIOato+WImeihqOi+vuW8j+S4remcgOimgei9rOS5ieeahOWtl+esplxyXG5jb25zdCBSRUdFWF9DSEFSU19SRSA9IC9bLisqP14ke30oKVtcXF0vXFxcXF0vZztcclxuLy8g55So5LqO5Yy56YWN5Lik5LiqLy/kuK3nmoTnmoTlgLxcclxuY29uc3QgQkFTRV9QQVJBTV9QQVRURVJOID0gJ1teL10rJztcclxuXHJcbmNvbnN0IERlZmF1bHREZWxpbWl0ZXIgPSAnLyM/JztcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQYXRoUGFyc2VyPFN0ciBleHRlbmRzIHN0cmluZz4ocGF0aG5hbWU6IFN0ciwgb3B0aW9uPzogUGFyc2VyT3B0aW9uKTogUGFyc2VyPEdldFVSTFBhcmFtczxTdHI+PjtcclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVBhdGhQYXJzZXI8UCA9IHVua25vd24+KHBhdGhuYW1lOiBzdHJpbmcsIG9wdGlvbj86IFBhcnNlck9wdGlvbik6IFBhcnNlcjxQPjtcclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVBhdGhQYXJzZXI8UCA9IHVua25vd24+KHBhdGhuYW1lOiBzdHJpbmcsIG9wdGlvbjogUGFyc2VyT3B0aW9uID0gZGVmYXVsdE9wdGlvbik6IFBhcnNlcjxQPiB7XHJcbiAgY29uc3Qge1xyXG4gICAgY2FzZVNlbnNpdGl2ZSA9IGRlZmF1bHRPcHRpb24uY2FzZVNlbnNpdGl2ZSxcclxuICAgIHN0cmljdE1vZGUgPSBkZWZhdWx0T3B0aW9uLnN0cmljdE1vZGUsXHJcbiAgICBleGFjdCA9IGRlZmF1bHRPcHRpb24uZXhhY3QsXHJcbiAgfSA9IG9wdGlvbjtcclxuICAvKipcclxuICAgKiBVUkzljLnphY3mlbTkvZPmtYHnqItcclxuICAgKiAxLuivjeazleino+aekO+8jOWwhlVSTOaooeadv+ino+aekOS4ulRva2VuXHJcbiAgICogMi7kvb/nlKhUb2tlbueUn+aIkOato+WImeihqOi+vuW8j1xyXG4gICAqIDMu5Yip55So5q2j5YiZ6KGo6L6+5byP6Kej5p6QVVJM5Lit5Y+C5pWw5oiW5aGr5YWFVVJM5qih5p2/XHJcbiAgICovXHJcbiAgbGV0IHBhdHRlcm4gPSAnXic7XHJcbiAgY29uc3Qga2V5czogc3RyaW5nW10gPSBbXTtcclxuICBjb25zdCBzY29yZXM6IG51bWJlcltdID0gW107XHJcblxyXG4gIGNvbnN0IHRva2VucyA9IGxleGVyKHBhdGhuYW1lKTtcclxuICBjb25zdCBvbmx5SGFzV2lsZENhcmQgPSB0b2tlbnMubGVuZ3RoID09PSAxICYmIHRva2Vuc1swXS50eXBlID09PSBUb2tlblR5cGUuV2lsZENhcmQ7XHJcbiAgY29uc3QgdG9rZW5Db3VudCA9IHRva2Vucy5sZW5ndGg7XHJcbiAgY29uc3QgbGFzdFRva2VuID0gdG9rZW5zW3Rva2VuQ291bnQgLSAxXTtcclxuXHJcbiAgZm9yIChsZXQgdG9rZW5JZHggPSAwOyB0b2tlbklkeCA8IHRva2VuQ291bnQ7IHRva2VuSWR4KyspIHtcclxuICAgIGNvbnN0IHRva2VuID0gdG9rZW5zW3Rva2VuSWR4XTtcclxuICAgIGNvbnN0IG5leHRUb2tlbiA9IHRva2Vuc1t0b2tlbklkeCArIDFdO1xyXG4gICAgc3dpdGNoICh0b2tlbi50eXBlKSB7XHJcbiAgICAgIGNhc2UgVG9rZW5UeXBlLkRlbGltaXRlcjpcclxuICAgICAgICBwYXR0ZXJuICs9ICcvJztcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBUb2tlblR5cGUuU3RhdGljOlxyXG4gICAgICAgIHBhdHRlcm4gKz0gdG9rZW4udmFsdWUucmVwbGFjZShSRUdFWF9DSEFSU19SRSwgJ1xcXFwkJicpO1xyXG4gICAgICAgIHNjb3Jlcy5wdXNoKE1hdGNoU2NvcmUuc3RhdGljKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBUb2tlblR5cGUuUGFyYW06XHJcbiAgICAgICAgbGV0IHBhcmFtUmVnZXhwID0gJyc7XHJcbiAgICAgICAgaWYgKG5leHRUb2tlbiAmJiBuZXh0VG9rZW4udHlwZSA9PT0gVG9rZW5UeXBlLkxCcmFja2V0KSB7XHJcbiAgICAgICAgICAvLyDot7Pov4flvZPliY1Ub2tlbuWSjOW3puaLrOWPt1xyXG4gICAgICAgICAgdG9rZW5JZHggKz0gMjtcclxuICAgICAgICAgIHdoaWxlICh0b2tlbnNbdG9rZW5JZHhdLnR5cGUgIT09IFRva2VuVHlwZS5SQnJhY2tldCkge1xyXG4gICAgICAgICAgICBwYXJhbVJlZ2V4cCArPSB0b2tlbnNbdG9rZW5JZHhdLnZhbHVlO1xyXG4gICAgICAgICAgICB0b2tlbklkeCsrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBwYXR0ZXJuICs9IHBhcmFtUmVnZXhwID8gYCgoPzoke3BhcmFtUmVnZXhwfSkpYCA6IGAoJHtCQVNFX1BBUkFNX1BBVFRFUk59KWA7XHJcbiAgICAgICAga2V5cy5wdXNoKHRva2VuLnZhbHVlKTtcclxuICAgICAgICBzY29yZXMucHVzaChNYXRjaFNjb3JlLnBhcmFtKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBUb2tlblR5cGUuV2lsZENhcmQ6XHJcbiAgICAgICAga2V5cy5wdXNoKHRva2VuLnZhbHVlKTtcclxuICAgICAgICBwYXR0ZXJuICs9IGAoKD86JHtCQVNFX1BBUkFNX1BBVFRFUk59KSR7b25seUhhc1dpbGRDYXJkID8gJz8nIDogJyd9KD86Lyg/OiR7QkFTRV9QQVJBTV9QQVRURVJOfSkpKilgO1xyXG4gICAgICAgIHNjb3Jlcy5wdXNoKG9ubHlIYXNXaWxkQ2FyZCA/IE1hdGNoU2NvcmUud2lsZGNhcmQgOiBNYXRjaFNjb3JlLnBsYWNlaG9sZGVyKTtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICB9XHJcbiAgY29uc3QgaXNXaWxkQ2FyZCA9IGxhc3RUb2tlbi50eXBlID09PSBUb2tlblR5cGUuV2lsZENhcmQ7XHJcblxyXG4gIGlmICghaXNXaWxkQ2FyZCAmJiAhZXhhY3QpIHtcclxuICAgIGlmICghc3RyaWN0TW9kZSkge1xyXG4gICAgICBwYXR0ZXJuICs9IGAoPzpbJHtlc2NhcGVTdHIoRGVmYXVsdERlbGltaXRlcil9XSg/PSQpKT9gO1xyXG4gICAgfVxyXG4gICAgaWYgKGxhc3RUb2tlbi50eXBlICE9PSBUb2tlblR5cGUuRGVsaW1pdGVyKSB7XHJcbiAgICAgIHBhdHRlcm4gKz0gYCg/PVske2VzY2FwZVN0cihEZWZhdWx0RGVsaW1pdGVyKX1dfCQpYDtcclxuICAgIH1cclxuICB9IGVsc2Uge1xyXG4gICAgcGF0dGVybiArPSBzdHJpY3RNb2RlID8gJyQnIDogYFske2VzY2FwZVN0cihEZWZhdWx0RGVsaW1pdGVyKX1dPyRgO1xyXG4gIH1cclxuXHJcbiAgY29uc3QgZmxhZyA9IGNhc2VTZW5zaXRpdmUgPyAnJyA6ICdpJztcclxuICBjb25zdCByZWdleHAgPSBuZXcgUmVnRXhwKHBhdHRlcm4sIGZsYWcpO1xyXG5cclxuICAvKipcclxuICAgKiBAZGVzY3JpcHRpb24g5qC55o2u57uZ5a6aUGF0dGVybuino+aekHBhdGhcclxuICAgKi9cclxuICBmdW5jdGlvbiBwYXJzZShwYXRoOiBzdHJpbmcpOiBNYXRjaGVkPFA+IHwgbnVsbCB7XHJcbiAgICBjb25zdCByZU1hdGNoID0gcGF0aC5tYXRjaChyZWdleHApO1xyXG5cclxuICAgIGlmICghcmVNYXRjaCkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIGNvbnN0IG1hdGNoZWRQYXRoID0gcmVNYXRjaFswXTtcclxuICAgIGxldCBwYXJhbXM6IFBhcmFtczxQPiA9IHt9O1xyXG4gICAgbGV0IHBhcnNlU2NvcmU6IG51bWJlcltdID0gQXJyYXkuZnJvbShzY29yZXMpO1xyXG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCByZU1hdGNoLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCBwYXJhbSA9IHJlTWF0Y2hbaV07XHJcbiAgICAgIGxldCBrZXkgPSBrZXlzW2kgLSAxXTtcclxuICAgICAgaWYgKGtleSA9PT0gJyonICYmIHBhcmFtKSB7XHJcbiAgICAgICAgbGV0IHZhbHVlID0gcGFyYW0uc3BsaXQoJy8nKTtcclxuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkocGFyYW1zWycqJ10pKSB7XHJcbiAgICAgICAgICBwYXJhbXNbJyonXSA9IHZhbHVlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBwYXJhbXNbJyonXS5wdXNoKC4uLnZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8g5a6M5oiQ6YCa6YWN56ym5Y+C5pWw6Kej5p6Q5ZCO5bCGcGxhY2Vob2xkZXLmm7/mjaLkuLp3aWxkY2FyZOWPguaVsOeahOWIhuWAvFxyXG4gICAgICAgIHBhcnNlU2NvcmUuc3BsaWNlKFxyXG4gICAgICAgICAgc2NvcmVzLmluZGV4T2YoTWF0Y2hTY29yZS5wbGFjZWhvbGRlciksXHJcbiAgICAgICAgICAxLFxyXG4gICAgICAgICAgLi4ubmV3IEFycmF5KHZhbHVlLmxlbmd0aCkuZmlsbChNYXRjaFNjb3JlLndpbGRjYXJkKSxcclxuICAgICAgICApO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHBhcmFtc1trZXldID0gcGFyYW0gPyBwYXJhbSA6IFtdO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgaXNFeGFjdCA9IHBhdGggPT09IG1hdGNoZWRQYXRoO1xyXG4gICAgY29uc3QgdXJsID0gcGF0aCA9PT0gJy8nICYmIG1hdGNoZWRQYXRoID09PSAnJyA/ICcvJyA6IG1hdGNoZWRQYXRoO1xyXG4gICAgcmV0dXJuIHsgaXNFeGFjdDogaXNFeGFjdCwgcGF0aDogcGF0aG5hbWUsIHVybDogdXJsLCBzY29yZTogcGFyc2VTY29yZSwgcGFyYW1zOiBwYXJhbXMgfTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBkZXNjcmlwdGlvbiDkvb/nlKjnu5nlrprlj4LmlbDloavlhYVwYXR0ZXJu77yM5b6X5Yiw55uu5qCHVVJMXHJcbiAgICovXHJcbiAgZnVuY3Rpb24gY29tcGlsZShwYXJhbXM6IFBhcmFtczxQPik6IHN0cmluZyB7XHJcbiAgICBsZXQgcGF0aCA9ICcnO1xyXG4gICAgZm9yIChjb25zdCB0b2tlbiBvZiB0b2tlbnMpIHtcclxuICAgICAgc3dpdGNoICh0b2tlbi50eXBlKSB7XHJcbiAgICAgICAgY2FzZSBUb2tlblR5cGUuU3RhdGljOlxyXG4gICAgICAgICAgcGF0aCArPSB0b2tlbi52YWx1ZTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgVG9rZW5UeXBlLlBhcmFtOlxyXG4gICAgICAgICAgaWYgKCFwYXJhbXNbdG9rZW4udmFsdWVdKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUGFyYW0gaXMgaW52YWxpZC4nKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHBhdGggKz0gcGFyYW1zW3Rva2VuLnZhbHVlXTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgVG9rZW5UeXBlLldpbGRDYXJkOlxyXG4gICAgICAgICAgbGV0IHdpbGRDYXJkID0gcGFyYW1zWycqJ107XHJcbiAgICAgICAgICBpZiAod2lsZENhcmQgaW5zdGFuY2VvZiBBcnJheSkge1xyXG4gICAgICAgICAgICBwYXRoICs9IHdpbGRDYXJkLmpvaW4oJy8nKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHBhdGggKz0gd2lsZENhcmQ7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFRva2VuVHlwZS5EZWxpbWl0ZXI6XHJcbiAgICAgICAgICBwYXRoICs9IHRva2VuLnZhbHVlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBwYXRoO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHtcclxuICAgIGdldCByZWdleHAoKSB7XHJcbiAgICAgIHJldHVybiByZWdleHA7XHJcbiAgICB9LFxyXG4gICAgZ2V0IGtleXMoKSB7XHJcbiAgICAgIHJldHVybiBrZXlzO1xyXG4gICAgfSxcclxuICAgIGNvbXBpbGUsXHJcbiAgICBwYXJzZSxcclxuICB9O1xyXG59XHJcblxyXG4vKipcclxuICogQGRlc2NyaXB0aW9uIOS+neasoeS9v+eUqHBhdGhuYW1l5LiOcGF0dGVybui/m+ihjOWMuemFje+8jOagueaNruWMuemFjeWIhuaVsOWPluW+l+WIhuaVsOacgOmrmOe7k+aenFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIG1hdGNoUGF0aDxQID0gYW55PihcclxuICBwYXRobmFtZTogc3RyaW5nLFxyXG4gIHBhdHRlcm46IHN0cmluZyB8IHN0cmluZ1tdLFxyXG4gIG9wdGlvbj86IFBhcnNlck9wdGlvbixcclxuKTogTWF0Y2hlZDxQPiB8IG51bGwge1xyXG4gIGNvbnN0IHBhdHRlcm5zID0gQXJyYXkuaXNBcnJheShwYXR0ZXJuKSA/IFsuLi5wYXR0ZXJuXSA6IFtwYXR0ZXJuXTtcclxuICBjb25zdCBtYXRjaGVkUmVzdWx0czogTWF0Y2hlZDxQPltdID0gW107XHJcbiAgZm9yIChjb25zdCBpdGVtIG9mIHBhdHRlcm5zKSB7XHJcbiAgICBjb25zdCBwYXJzZXIgPSBjcmVhdGVQYXRoUGFyc2VyKGl0ZW0sIG9wdGlvbik7XHJcbiAgICBjb25zdCBtYXRjaGVkID0gcGFyc2VyLnBhcnNlKHBhdGhuYW1lKTtcclxuICAgIGlmIChtYXRjaGVkKSB7XHJcbiAgICAgIG1hdGNoZWRSZXN1bHRzLnB1c2gobWF0Y2hlZCk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHJldHVybiAhbWF0Y2hlZFJlc3VsdHMubGVuZ3RoID8gbnVsbCA6IG1hdGNoZWRSZXN1bHRzLnNvcnQoKGEsIGIpID0+IHNjb3JlQ29tcGFyZShhLnNjb3JlLCBiLnNjb3JlKSlbMF07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZVBhdGg8UCA9IGFueT4ocGF0aDogc3RyaW5nLCBwYXJhbXM6IFBhcmFtczxQPikge1xyXG4gIGNvbnN0IHBhcnNlciA9IGNyZWF0ZVBhdGhQYXJzZXIocGF0aCk7XHJcbiAgcmV0dXJuIHBhcnNlci5jb21waWxlKHBhcmFtcyk7XHJcbn0iLCJpbXBvcnQgeyB1c2VDb250ZXh0IH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgUm91dGVyQ29udGV4dCBmcm9tICcuL2NvbnRleHQnO1xyXG5pbXBvcnQgeyBNYXRjaGVkLCBtYXRjaFBhdGgsIFBhcmFtcyB9IGZyb20gJy4vbWF0Y2hlci9wYXJzZXInO1xyXG5pbXBvcnQgeyBIaXN0b3J5IH0gZnJvbSAnLi4vaGlzdG9yeS90eXBlcyc7XHJcbmltcG9ydCB7IExvY2F0aW9uIH0gZnJvbSAnLi9pbmRleCc7XHJcblxyXG5mdW5jdGlvbiB1c2VIaXN0b3J5PFM+KCk6IEhpc3Rvcnk8Uz47XHJcbmZ1bmN0aW9uIHVzZUhpc3RvcnkoKSB7XHJcbiAgcmV0dXJuIHVzZUNvbnRleHQoUm91dGVyQ29udGV4dCkuaGlzdG9yeTtcclxufVxyXG5cclxuZnVuY3Rpb24gdXNlTG9jYXRpb248Uz4oKTogTG9jYXRpb248Uz47XHJcbmZ1bmN0aW9uIHVzZUxvY2F0aW9uKCkge1xyXG4gIHJldHVybiB1c2VDb250ZXh0KFJvdXRlckNvbnRleHQpLmxvY2F0aW9uO1xyXG59XHJcblxyXG5mdW5jdGlvbiB1c2VQYXJhbXM8UD4oKTogUGFyYW1zPFA+IHwge307XHJcbmZ1bmN0aW9uIHVzZVBhcmFtcygpIHtcclxuICBjb25zdCBtYXRjaCA9IHVzZUNvbnRleHQoUm91dGVyQ29udGV4dCkubWF0Y2g7XHJcbiAgcmV0dXJuIG1hdGNoID8gbWF0Y2gucGFyYW1zIDoge307XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHVzZVJvdXRlTWF0Y2g8UD4ocGF0aD86IHN0cmluZyk6IE1hdGNoZWQ8UD4gfCBudWxsO1xyXG5mdW5jdGlvbiB1c2VSb3V0ZU1hdGNoKHBhdGg/OiBzdHJpbmcpIHtcclxuICBjb25zdCBwYXRobmFtZSA9IHVzZUxvY2F0aW9uKCkucGF0aG5hbWU7XHJcbiAgY29uc3QgbWF0Y2ggPSB1c2VDb250ZXh0KFJvdXRlckNvbnRleHQpLm1hdGNoO1xyXG4gIGlmIChwYXRoKSB7XHJcbiAgICByZXR1cm4gbWF0Y2hQYXRoKHBhdGhuYW1lLCBwYXRoKTtcclxuICB9XHJcbiAgcmV0dXJuIG1hdGNoO1xyXG59XHJcblxyXG5leHBvcnQgeyB1c2VIaXN0b3J5LCB1c2VMb2NhdGlvbiwgdXNlUGFyYW1zLCB1c2VSb3V0ZU1hdGNoIH07XHJcbiIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcclxuaW1wb3J0IHsgSGlzdG9yeSwgTG9jYXRpb24gfSBmcm9tICcuL2luZGV4JztcclxuaW1wb3J0IHsgTWF0Y2hlZCwgbWF0Y2hQYXRoIH0gZnJvbSAnLi9tYXRjaGVyL3BhcnNlcic7XHJcbmltcG9ydCB7IHVzZUNvbnRleHQsIENoaWxkcmVuLCBjcmVhdGVFbGVtZW50IH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgUm91dGVyQ29udGV4dCBmcm9tICcuL2NvbnRleHQnO1xyXG5pbXBvcnQgeyBHZXRVUkxQYXJhbXMgfSBmcm9tICcuL21hdGNoZXIvdHlwZXMnO1xyXG5cclxuZXhwb3J0IHR5cGUgUm91dGVDb21wb25lbnRQcm9wczxQIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IHt9LCBTID0gdW5rbm93bj4gPSBSb3V0ZUNoaWxkcmVuUHJvcHM8UCwgUz47XHJcblxyXG5leHBvcnQgdHlwZSBSb3V0ZUNoaWxkcmVuUHJvcHM8UCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fSwgUyA9IHVua25vd24+ID0ge1xyXG4gIGhpc3Rvcnk6IEhpc3Rvcnk8Uz47XHJcbiAgbG9jYXRpb246IExvY2F0aW9uPFM+O1xyXG4gIG1hdGNoOiBNYXRjaGVkPFA+IHwgbnVsbFxyXG59XHJcblxyXG5leHBvcnQgdHlwZSBSb3V0ZVByb3BzPFAgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge30sIFBhdGggZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmc+ID0ge1xyXG4gIGxvY2F0aW9uPzogTG9jYXRpb247XHJcbiAgY29tcG9uZW50PzogUmVhY3QuQ29tcG9uZW50VHlwZTxSb3V0ZUNvbXBvbmVudFByb3BzPFA+PiB8IFJlYWN0LkNvbXBvbmVudFR5cGU8YW55PiB8IHVuZGVmaW5lZDtcclxuICBjaGlsZHJlbj86ICgocHJvcHM6IFJvdXRlQ2hpbGRyZW5Qcm9wczxQPikgPT4gUmVhY3QuUmVhY3ROb2RlKSB8IFJlYWN0LlJlYWN0Tm9kZTtcclxuICByZW5kZXI/OiAocHJvcHM6IFJvdXRlQ29tcG9uZW50UHJvcHM8UD4pID0+IFJlYWN0LlJlYWN0Tm9kZTtcclxuICBwYXRoPzogUGF0aCB8IFBhdGhbXTtcclxuICBleGFjdD86IGJvb2xlYW47XHJcbiAgc2Vuc2l0aXZlPzogYm9vbGVhbjtcclxuICBzdHJpY3Q/OiBib29sZWFuO1xyXG4gIGNvbXB1dGVkPzogTWF0Y2hlZDxQPjtcclxufTtcclxuXHJcbmZ1bmN0aW9uIFJvdXRlPFBhdGggZXh0ZW5kcyBzdHJpbmcsIFAgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gR2V0VVJMUGFyYW1zPFBhdGg+Pihwcm9wczogUm91dGVQcm9wczxQLCBQYXRoPikge1xyXG4gIGNvbnN0IGNvbnRleHQgPSB1c2VDb250ZXh0KFJvdXRlckNvbnRleHQpO1xyXG5cclxuICBjb25zdCB7IGNvbXB1dGVkLCBsb2NhdGlvbiwgcGF0aCB9ID0gcHJvcHM7XHJcbiAgbGV0IHsgY2hpbGRyZW4sIGNvbXBvbmVudCwgcmVuZGVyIH0gPSBwcm9wcztcclxuICBsZXQgbWF0Y2g6IE1hdGNoZWQ8UD4gfCBudWxsO1xyXG5cclxuICBjb25zdCByb3V0ZUxvY2F0aW9uID0gbG9jYXRpb24gfHwgY29udGV4dC5sb2NhdGlvbjtcclxuICBpZiAoY29tcHV0ZWQpIHtcclxuICAgIG1hdGNoID0gY29tcHV0ZWQ7XHJcbiAgfSBlbHNlIGlmIChwYXRoKSB7XHJcbiAgICBtYXRjaCA9IG1hdGNoUGF0aDxQPihyb3V0ZUxvY2F0aW9uLnBhdGhuYW1lLCBwYXRoKTtcclxuICB9IGVsc2Uge1xyXG4gICAgbWF0Y2ggPSBjb250ZXh0Lm1hdGNoO1xyXG4gIH1cclxuICBjb25zdCBuZXdQcm9wcyA9IHsgLi4uY29udGV4dCwgbG9jYXRpb246IHJvdXRlTG9jYXRpb24sIG1hdGNoOiBtYXRjaCB9O1xyXG5cclxuICBpZiAoQXJyYXkuaXNBcnJheShjaGlsZHJlbikgJiYgQ2hpbGRyZW4uY291bnQoY2hpbGRyZW4pID09PSAwKSB7XHJcbiAgICBjaGlsZHJlbiA9IG51bGw7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiDmjInpobrluo/ojrflj5bpnIDopoHmuLLmn5PnmoTnu4Tku7ZcclxuICAgKiAxLmNoaWxkcmVuXHJcbiAgICogMi5jb21wb25lbnRcclxuICAgKiAzLnJlbmRlclxyXG4gICAqIOmDveayoeacieWMuemFjeWIsOi/lOWbnk51bGxcclxuICAgKi9cclxuICBjb25zdCBnZXRDaGlsZHJlbiA9ICgpOiBSZWFjdC5SZWFjdE5vZGUgfCBudWxsID0+IHtcclxuICAgIC8vIOWmguaenCBtYXRjaCDlrZjlnKhcclxuICAgIGlmIChuZXdQcm9wcy5tYXRjaCkge1xyXG4gICAgICBpZiAoY2hpbGRyZW4pIHtcclxuICAgICAgICBpZiAodHlwZW9mIGNoaWxkcmVuID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICByZXR1cm4gY2hpbGRyZW4obmV3UHJvcHMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gY2hpbGRyZW47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChjb21wb25lbnQpIHtcclxuICAgICAgICByZXR1cm4gY3JlYXRlRWxlbWVudChjb21wb25lbnQsIG5ld1Byb3BzKTtcclxuICAgICAgfSBlbHNlIGlmIChyZW5kZXIpIHtcclxuICAgICAgICByZXR1cm4gcmVuZGVyKG5ld1Byb3BzKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gbWF0Y2jkuLpudWxsXHJcbiAgICAgIGlmICh0eXBlb2YgY2hpbGRyZW4gPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICByZXR1cm4gY2hpbGRyZW4obmV3UHJvcHMpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIHJldHVybiA8Um91dGVyQ29udGV4dC5Qcm92aWRlciB2YWx1ZT17bmV3UHJvcHN9PntnZXRDaGlsZHJlbigpfTwvUm91dGVyQ29udGV4dC5Qcm92aWRlcj47XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFJvdXRlO1xyXG4iLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XHJcbmltcG9ydCB7IHVzZUxheW91dEVmZmVjdCwgdXNlTWVtbywgdXNlUmVmLCB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0JztcclxuXHJcbmltcG9ydCB7IEhpc3RvcnksIExvY2F0aW9uIH0gZnJvbSAnLi4vaGlzdG9yeS90eXBlcyc7XHJcblxyXG5pbXBvcnQgUm91dGVyQ29udGV4dCwgeyBSb3V0ZXJDb250ZXh0VmFsdWUgfSBmcm9tICcuL2NvbnRleHQnO1xyXG5cclxuZXhwb3J0IHR5cGUgUm91dGVyUHJvcHMgPSB7XHJcbiAgaGlzdG9yeTogSGlzdG9yeTtcclxuICBjaGlsZHJlbj86IFJlYWN0LlJlYWN0Tm9kZTtcclxufTtcclxuXHJcbmZ1bmN0aW9uIFJvdXRlcjxQIGV4dGVuZHMgUm91dGVyUHJvcHM+KHByb3BzOiBQKSB7XHJcbiAgY29uc3QgeyBoaXN0b3J5LCBjaGlsZHJlbiA9IG51bGwgfSA9IHByb3BzO1xyXG4gIGNvbnN0IFtsb2NhdGlvbiwgc2V0TG9jYXRpb25dID0gdXNlU3RhdGUocHJvcHMuaGlzdG9yeS5sb2NhdGlvbik7XHJcbiAgY29uc3QgcGVuZGluZ0xvY2F0aW9uID0gdXNlUmVmPExvY2F0aW9uIHwgbnVsbD4obnVsbCk7XHJcblxyXG4gIC8vIOWcqFJvdXRlcuWKoOi9veaXtuWwseebkeWQrGhpc3RvcnnlnLDlnYDlj5jljJbvvIzku6Xkv53or4HlnKjlp4vmuLLmn5Pml7bph43lrprlkJHog73mraPnoa7op6blj5FcclxuICBsZXQgdW5MaXN0ZW46IG51bGwgfCAoKCkgPT4gdm9pZCkgPSBoaXN0b3J5Lmxpc3RlbihhcmcgPT4ge1xyXG4gICAgcGVuZGluZ0xvY2F0aW9uLmN1cnJlbnQgPSBhcmcubG9jYXRpb247XHJcbiAgfSk7XHJcblxyXG4gIC8vIOaooeaLn2NvbXBvbmVudERpZE1vdW505ZKMY29tcG9uZW50V2lsbFVubW91bnRcclxuICB1c2VMYXlvdXRFZmZlY3QoKCkgPT4ge1xyXG4gICAgaWYgKHVuTGlzdGVuKSB7XHJcbiAgICAgIHVuTGlzdGVuKCk7XHJcbiAgICB9XHJcbiAgICAvLyDnm5HlkKxoaXN0b3J55Lit55qE5L2N572u5Y+Y5YyWXHJcbiAgICB1bkxpc3RlbiA9IGhpc3RvcnkubGlzdGVuKGFyZyA9PiB7XHJcbiAgICAgIHNldExvY2F0aW9uKGFyZy5sb2NhdGlvbik7XHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAocGVuZGluZ0xvY2F0aW9uLmN1cnJlbnQpIHtcclxuICAgICAgc2V0TG9jYXRpb24ocGVuZGluZ0xvY2F0aW9uLmN1cnJlbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiAoKSA9PiB7XHJcbiAgICAgIGlmICh1bkxpc3Rlbikge1xyXG4gICAgICAgIHVuTGlzdGVuKCk7XHJcbiAgICAgICAgdW5MaXN0ZW4gPSBudWxsO1xyXG4gICAgICAgIHBlbmRpbmdMb2NhdGlvbi5jdXJyZW50ID0gbnVsbDtcclxuICAgICAgfVxyXG4gICAgfTtcclxuICB9LCBbXSk7XHJcblxyXG4gIGNvbnN0IGluaXRDb250ZXh0VmFsdWU6IFJvdXRlckNvbnRleHRWYWx1ZSA9IHVzZU1lbW8oXHJcbiAgICAoKSA9PiAoe1xyXG4gICAgICBoaXN0b3J5OiBoaXN0b3J5LFxyXG4gICAgICBsb2NhdGlvbjogbG9jYXRpb24sXHJcbiAgICAgIG1hdGNoOiB7IGlzRXhhY3Q6IGxvY2F0aW9uLnBhdGhuYW1lID09PSAnLycsIHBhcmFtczoge30sIHBhdGg6ICcvJywgc2NvcmU6IFtdLCB1cmw6ICcvJyB9LFxyXG4gICAgfSksXHJcbiAgICBbbG9jYXRpb25dLFxyXG4gICk7XHJcblxyXG4gIHJldHVybiA8Um91dGVyQ29udGV4dC5Qcm92aWRlciB2YWx1ZT17aW5pdENvbnRleHRWYWx1ZX0gY2hpbGRyZW49e2NoaWxkcmVufSAvPjtcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgUm91dGVyO1xyXG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShzb3VyY2UsIGV4Y2x1ZGVkKSB7XG4gIGlmIChzb3VyY2UgPT0gbnVsbCkgcmV0dXJuIHt9O1xuICB2YXIgdGFyZ2V0ID0ge307XG4gIHZhciBzb3VyY2VLZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTtcbiAgdmFyIGtleSwgaTtcbiAgZm9yIChpID0gMDsgaSA8IHNvdXJjZUtleXMubGVuZ3RoOyBpKyspIHtcbiAgICBrZXkgPSBzb3VyY2VLZXlzW2ldO1xuICAgIGlmIChleGNsdWRlZC5pbmRleE9mKGtleSkgPj0gMCkgY29udGludWU7XG4gICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgfVxuICByZXR1cm4gdGFyZ2V0O1xufSIsImltcG9ydCB7IHVzZUxheW91dEVmZmVjdCwgdXNlUmVmIH0gZnJvbSAncmVhY3QnO1xyXG5cclxuZXhwb3J0IHR5cGUgTGlmZUN5Y2xlUHJvcHMgPSB7XHJcbiAgb25Nb3VudD86ICgpID0+IHZvaWQ7XHJcbiAgb25VcGRhdGU/OiAocHJldlByb3BzPzogTGlmZUN5Y2xlUHJvcHMpID0+IHZvaWQ7XHJcbiAgb25Vbm1vdW50PzogKCkgPT4gdm9pZDtcclxuICBkYXRhPzogYW55O1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIExpZmVDeWNsZShwcm9wczogTGlmZUN5Y2xlUHJvcHMpIHtcclxuICAvLyDkvb/nlKhyZWbkv53lrZjkuIrkuIDmrKHnmoRwcm9wc++8jOmYsuatoumHjeaWsOa4suafk1xyXG4gIGNvbnN0IHByZXZQcm9wcyA9IHVzZVJlZjxMaWZlQ3ljbGVQcm9wcyB8IG51bGw+KG51bGwpO1xyXG4gIGNvbnN0IGlzTW91bnQgPSB1c2VSZWYoZmFsc2UpO1xyXG5cclxuICBjb25zdCB7IG9uTW91bnQsIG9uVXBkYXRlLCBvblVubW91bnQgfSA9IHByb3BzO1xyXG5cclxuICB1c2VMYXlvdXRFZmZlY3QoKCkgPT4ge1xyXG4gICAgLy8g6aaW5qyh5oyC6L29IOaooeaLn2NvbXBvbmVudERpZE1vdW50XHJcbiAgICBpZiAoIWlzTW91bnQuY3VycmVudCkge1xyXG4gICAgICBpc01vdW50LmN1cnJlbnQgPSB0cnVlO1xyXG4gICAgICBpZiAob25Nb3VudCkge1xyXG4gICAgICAgIG9uTW91bnQoKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8g5LiN5piv6aaW5qyh5riy5p+TIOaooeaLn2NvbXBvbmVudERpZFVwZGF0ZVxyXG4gICAgICBpZiAob25VcGRhdGUpIHtcclxuICAgICAgICBwcmV2UHJvcHMuY3VycmVudCA/IG9uVXBkYXRlKHByZXZQcm9wcy5jdXJyZW50KSA6IG9uVXBkYXRlKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHByZXZQcm9wcy5jdXJyZW50ID0gcHJvcHM7XHJcbiAgfSk7XHJcblxyXG4gIC8vIOaooeaLn2NvbXBvbmVudFdpbGxVbm1vdW50XHJcbiAgdXNlTGF5b3V0RWZmZWN0KCgpID0+IHtcclxuICAgIHJldHVybiAoKSA9PiB7XHJcbiAgICAgIGlmIChvblVubW91bnQpIHtcclxuICAgICAgICBvblVubW91bnQoKTtcclxuICAgICAgfVxyXG4gICAgfTtcclxuICB9LCBbXSk7XHJcblxyXG4gIHJldHVybiBudWxsO1xyXG59XHJcbiIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcclxuaW1wb3J0IHsgdXNlQ29udGV4dCB9IGZyb20gJ3JlYWN0JztcclxuaW1wb3J0IFJvdXRlckNvbnRleHQgZnJvbSAnLi9jb250ZXh0JztcclxuaW1wb3J0IHsgTGlmZUN5Y2xlLCBMaWZlQ3ljbGVQcm9wcyB9IGZyb20gJy4vbGlmZUN5Y2xlSG9vayc7XHJcbmltcG9ydCB7IE1hdGNoZWQsIGNyZWF0ZVBhdGhQYXJzZXIgfSBmcm9tICcuL21hdGNoZXIvcGFyc2VyJztcclxuaW1wb3J0IHsgYWRkSGVhZFNsYXNoLCBpc0xvY2F0aW9uRXF1YWwsIHBhcnNlUGF0aCB9IGZyb20gJy4uL2hpc3RvcnkvdXRpbHMnO1xyXG5pbXBvcnQgeyBMb2NhdGlvbiB9IGZyb20gJy4vaW5kZXgnO1xyXG5cclxuZXhwb3J0IHR5cGUgUmVkaXJlY3RQcm9wcyA9IHtcclxuICB0bzogc3RyaW5nIHwgUGFydGlhbDxMb2NhdGlvbj47XHJcbiAgcHVzaD86IGJvb2xlYW47XHJcbiAgcGF0aD86IHN0cmluZztcclxuICBmcm9tPzogc3RyaW5nO1xyXG4gIGV4YWN0PzogYm9vbGVhbjtcclxuICBzdHJpY3Q/OiBib29sZWFuO1xyXG5cclxuICAvLyDnlLFTd2l0Y2jorqHnrpflvpfliLBcclxuICByZWFkb25seSBjb21wdXRlZD86IE1hdGNoZWQgfCBudWxsO1xyXG59O1xyXG5cclxuZnVuY3Rpb24gUmVkaXJlY3Q8UCBleHRlbmRzIFJlZGlyZWN0UHJvcHM+KHByb3BzOiBQKSB7XHJcbiAgY29uc3QgeyB0bywgcHVzaCA9IGZhbHNlLCBjb21wdXRlZCB9ID0gcHJvcHM7XHJcblxyXG4gIGNvbnN0IGNvbnRleHQgPSB1c2VDb250ZXh0KFJvdXRlckNvbnRleHQpO1xyXG4gIGNvbnN0IHsgaGlzdG9yeSB9ID0gY29udGV4dDtcclxuXHJcbiAgY29uc3QgY2FsY0xvY2F0aW9uID0gKCk6IFBhcnRpYWw8TG9jYXRpb24+ID0+IHtcclxuICAgIGlmIChjb21wdXRlZCkge1xyXG4gICAgICBpZiAodHlwZW9mIHRvID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgIGNvbnN0IHBhcnNlciA9IGNyZWF0ZVBhdGhQYXJzZXIodG8pO1xyXG4gICAgICAgIGNvbnN0IHRhcmdldCA9IHBhcnNlci5jb21waWxlKGNvbXB1dGVkLnBhcmFtcyk7XHJcbiAgICAgICAgcmV0dXJuIHBhcnNlUGF0aCh0YXJnZXQpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IHBhdGhuYW1lID0gdG8ucGF0aG5hbWUgPyBhZGRIZWFkU2xhc2godG8ucGF0aG5hbWUpIDogJy8nO1xyXG4gICAgICAgIGNvbnN0IHBhcnNlciA9IGNyZWF0ZVBhdGhQYXJzZXIocGF0aG5hbWUpO1xyXG4gICAgICAgIGNvbnN0IHRhcmdldCA9IHBhcnNlci5jb21waWxlKGNvbXB1dGVkLnBhcmFtcyk7XHJcbiAgICAgICAgcmV0dXJuIHsgLi4udG8sIHBhdGhuYW1lOiB0YXJnZXQgfTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHR5cGVvZiB0byA9PT0gJ3N0cmluZycgPyBwYXJzZVBhdGgodG8pIDogdG87XHJcbiAgfTtcclxuXHJcbiAgY29uc3QgbmF2aWdhdGUgPSBwdXNoID8gaGlzdG9yeS5wdXNoIDogaGlzdG9yeS5yZXBsYWNlO1xyXG4gIGNvbnN0IHsgc3RhdGUsIC4uLnBhdGggfSA9IGNhbGNMb2NhdGlvbigpO1xyXG5cclxuICBjb25zdCBvbk1vdW50RnVuYyA9ICgpID0+IHtcclxuICAgIG5hdmlnYXRlKHBhdGgsIHN0YXRlKTtcclxuICB9O1xyXG5cclxuICBjb25zdCBvblVwZGF0ZUZ1bmMgPSAocHJldlByb3BzPzogTGlmZUN5Y2xlUHJvcHMpID0+IHtcclxuICAgIC8vIOWmguaenOW9k+WJjemhtemdouS4jumHjeWumuWQkeWJjemhtemdouS4jeS4gOiHtO+8jOaJp+ihjOi3s+i9rFxyXG4gICAgY29uc3QgcHJldlBhdGggPSBwcmV2UHJvcHM/LmRhdGEgYXMgTG9jYXRpb247XHJcbiAgICBpZiAoIWlzTG9jYXRpb25FcXVhbChwcmV2UGF0aCwgcGF0aCkpIHtcclxuICAgICAgbmF2aWdhdGUocGF0aCwgc3RhdGUpO1xyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIHJldHVybiA8TGlmZUN5Y2xlIG9uTW91bnQ9e29uTW91bnRGdW5jfSBvblVwZGF0ZT17b25VcGRhdGVGdW5jfSBkYXRhPXtwYXRofSAvPjtcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgUmVkaXJlY3Q7XHJcbiIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcclxuaW1wb3J0IHsgdXNlQ29udGV4dCwgQ2hpbGRyZW4sIGlzVmFsaWRFbGVtZW50LCBjbG9uZUVsZW1lbnQgfSBmcm9tICdyZWFjdCc7XHJcblxyXG5pbXBvcnQgeyBMb2NhdGlvbiB9IGZyb20gJy4vaW5kZXgnO1xyXG5pbXBvcnQgUm91dGVyQ29udGV4dCBmcm9tICcuL2NvbnRleHQnO1xyXG5pbXBvcnQgeyBNYXRjaGVkLCBtYXRjaFBhdGggfSBmcm9tICcuL21hdGNoZXIvcGFyc2VyJztcclxuaW1wb3J0IFJvdXRlLCB7IFJvdXRlUHJvcHMgfSBmcm9tICcuL1JvdXRlJztcclxuaW1wb3J0IFJlZGlyZWN0LCB7IFJlZGlyZWN0UHJvcHMgfSBmcm9tICcuL1JlZGlyZWN0JztcclxuXHJcbmV4cG9ydCB0eXBlIFN3aXRjaFByb3BzID0ge1xyXG4gIGxvY2F0aW9uPzogTG9jYXRpb247XHJcbiAgY2hpbGRyZW4/OiBSZWFjdC5SZWFjdE5vZGU7XHJcbn07XHJcblxyXG5mdW5jdGlvbiBTd2l0Y2g8UCBleHRlbmRzIFN3aXRjaFByb3BzPihwcm9wczogUCk6IFJlYWN0LlJlYWN0RWxlbWVudCB8IG51bGwge1xyXG4gIGNvbnN0IGNvbnRleHQgPSB1c2VDb250ZXh0KFJvdXRlckNvbnRleHQpO1xyXG4gIGNvbnN0IGxvY2F0aW9uID0gcHJvcHMubG9jYXRpb24gfHwgY29udGV4dC5sb2NhdGlvbjtcclxuXHJcbiAgbGV0IGVsZW1lbnQ6IFJlYWN0LlJlYWN0RWxlbWVudCB8IG51bGwgPSBudWxsO1xyXG4gIGxldCBtYXRjaDogTWF0Y2hlZCB8IG51bGwgPSBudWxsO1xyXG5cclxuICAvLyDkvb/nlKhmb3JFYWNo5LiN5Lya57uZUmVhY3QuUmVhY3ROb2Rl5aKe5Yqga2V55bGe5oCnLOmYsuatoumHjeaWsOa4suafk1xyXG4gIENoaWxkcmVuLmZvckVhY2gocHJvcHMuY2hpbGRyZW4sIG5vZGUgPT4ge1xyXG4gICAgaWYgKG1hdGNoID09PSBudWxsICYmIGlzVmFsaWRFbGVtZW50KG5vZGUpKSB7XHJcbiAgICAgIGVsZW1lbnQgPSBub2RlO1xyXG5cclxuICAgICAgbGV0IHN0cmljdDogYm9vbGVhbiB8IHVuZGVmaW5lZDtcclxuICAgICAgbGV0IHNlbnNpdGl2ZTogYm9vbGVhbiB8IHVuZGVmaW5lZDtcclxuICAgICAgbGV0IHBhdGg6IHN0cmluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xyXG4gICAgICBsZXQgZnJvbTogc3RyaW5nIHwgdW5kZWZpbmVkO1xyXG5cclxuICAgICAgLy8gbm9kZeWPr+iDveaYr1JvdXRl5ZKMUmVkaXJlY3RcclxuICAgICAgaWYgKG5vZGUudHlwZSA9PT0gUm91dGUpIHtcclxuICAgICAgICBjb25zdCBwcm9wcyA9IG5vZGUucHJvcHMgYXMgUm91dGVQcm9wcztcclxuICAgICAgICBzdHJpY3QgPSBwcm9wcy5zdHJpY3Q7XHJcbiAgICAgICAgc2Vuc2l0aXZlID0gcHJvcHMuc2Vuc2l0aXZlO1xyXG4gICAgICAgIHBhdGggPSBwcm9wcy5wYXRoO1xyXG4gICAgICB9IGVsc2UgaWYgKG5vZGUudHlwZSA9PT0gUmVkaXJlY3QpIHtcclxuICAgICAgICBjb25zdCBwcm9wcyA9IG5vZGUucHJvcHMgYXMgUmVkaXJlY3RQcm9wcztcclxuICAgICAgICBwYXRoID0gcHJvcHMucGF0aDtcclxuICAgICAgICBzdHJpY3QgPSBwcm9wcy5zdHJpY3Q7XHJcbiAgICAgICAgZnJvbSA9IHByb3BzLmZyb207XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IGV4YWN0ID0gbm9kZS5wcm9wcy5leGFjdDtcclxuICAgICAgY29uc3QgdGFyZ2V0ID0gcGF0aCB8fCBmcm9tO1xyXG5cclxuICAgICAgLy8g5pu05paw5Yy56YWN54q25oCB77yM5LiA5pem5Yy56YWN5Yiw5YGc5q2i6YGN5Y6GXHJcbiAgICAgIGlmICh0YXJnZXQpIHtcclxuICAgICAgICBtYXRjaCA9IG1hdGNoUGF0aChsb2NhdGlvbi5wYXRobmFtZSwgdGFyZ2V0LCB7XHJcbiAgICAgICAgICBzdHJpY3RNb2RlOiBzdHJpY3QsXHJcbiAgICAgICAgICBjYXNlU2Vuc2l0aXZlOiBzZW5zaXRpdmUsXHJcbiAgICAgICAgICBleGFjdDogZXhhY3QsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgbWF0Y2ggPSBjb250ZXh0Lm1hdGNoO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfSk7XHJcblxyXG4gIGlmIChtYXRjaCAmJiBlbGVtZW50KSB7XHJcbiAgICAvLyDkvb/nlKhjbG9uZUVsZW1lbnTlpI3liLblt7LmnInnu4Tku7blubbmm7TmlrDlhbZQcm9wc1xyXG4gICAgcmV0dXJuIGNsb25lRWxlbWVudChlbGVtZW50LCB7IGxvY2F0aW9uOiBsb2NhdGlvbiwgY29tcHV0ZWQ6IG1hdGNoIH0pO1xyXG4gIH1cclxuICByZXR1cm4gbnVsbDtcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgU3dpdGNoO1xyXG4iLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XHJcbmltcG9ydCB7IHVzZUNvbnRleHQgfSBmcm9tICdyZWFjdCc7XHJcbmltcG9ydCB7IExpZmVDeWNsZSwgTGlmZUN5Y2xlUHJvcHMgfSBmcm9tICcuL2xpZmVDeWNsZUhvb2snO1xyXG5pbXBvcnQgeyBMb2NhdGlvbiB9IGZyb20gJy4vaW5kZXgnO1xyXG5pbXBvcnQgeyBBY3Rpb24gfSBmcm9tICcuLi9oaXN0b3J5L3R5cGVzJztcclxuaW1wb3J0IFJvdXRlckNvbnRleHQgZnJvbSAnLi9jb250ZXh0JztcclxuXHJcbnR5cGUgUHJvbXB0UHJvcHMgPSB7XHJcbiAgbWVzc2FnZT86IHN0cmluZyB8ICgobG9jYXRpb246IFBhcnRpYWw8TG9jYXRpb24+LCBhY3Rpb246IEFjdGlvbikgPT4gdm9pZCk7XHJcbiAgd2hlbj86IGJvb2xlYW4gfCAoKGxvY2F0aW9uOiBQYXJ0aWFsPExvY2F0aW9uPikgPT4gYm9vbGVhbik7XHJcbn07XHJcblxyXG5mdW5jdGlvbiBQcm9tcHQ8UCBleHRlbmRzIFByb21wdFByb3BzPihwcm9wczogUCkge1xyXG4gIGNvbnN0IGNvbnRleHQgPSB1c2VDb250ZXh0KFJvdXRlckNvbnRleHQpO1xyXG5cclxuICBjb25zdCB7IG1lc3NhZ2UsIHdoZW4gPSB0cnVlIH0gPSBwcm9wcztcclxuXHJcbiAgaWYgKCh0eXBlb2Ygd2hlbiA9PT0gJ2Z1bmN0aW9uJyAmJiB3aGVuKGNvbnRleHQubG9jYXRpb24pID09PSBmYWxzZSkgfHwgIXdoZW4pIHtcclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgY29uc3QgbmF2aWdhdGUgPSBjb250ZXh0Lmhpc3RvcnkuYmxvY2s7XHJcblxyXG4gIGxldCByZWxlYXNlOiAoKCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgY29uc3Qgb25Nb3VudEZ1bmMgPSAoKSA9PiB7XHJcbiAgICByZWxlYXNlID0gbWVzc2FnZSA/IG5hdmlnYXRlKG1lc3NhZ2UpIDogbnVsbDtcclxuICB9O1xyXG5cclxuICBjb25zdCBvblVwZGF0ZUZ1bmMgPSAocHJldlByb3BzPzogTGlmZUN5Y2xlUHJvcHMpID0+IHtcclxuICAgIGlmIChwcmV2UHJvcHMgJiYgcHJldlByb3BzLmRhdGEgIT09IG1lc3NhZ2UpIHtcclxuICAgICAgaWYgKHJlbGVhc2UpIHtcclxuICAgICAgICByZWxlYXNlKCk7XHJcbiAgICAgIH1cclxuICAgICAgcmVsZWFzZSA9IG1lc3NhZ2UgPyBuYXZpZ2F0ZShtZXNzYWdlKSA6IG51bGw7XHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgY29uc3Qgb25Vbm1vdW50RnVuYyA9ICgpID0+IHtcclxuICAgIGlmIChyZWxlYXNlKSB7XHJcbiAgICAgIHJlbGVhc2UoKTtcclxuICAgIH1cclxuICAgIHJlbGVhc2UgPSBudWxsO1xyXG4gIH07XHJcblxyXG4gIHJldHVybiA8TGlmZUN5Y2xlIG9uTW91bnQ9e29uTW91bnRGdW5jfSBvblVwZGF0ZT17b25VcGRhdGVGdW5jfSBvblVubW91bnQ9e29uVW5tb3VudEZ1bmN9IGRhdGE9e21lc3NhZ2V9IC8+O1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBQcm9tcHQ7XHJcbiIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcclxuaW1wb3J0IHsgdXNlQ29udGV4dCB9IGZyb20gJ3JlYWN0JztcclxuaW1wb3J0IFJvdXRlckNvbnRleHQgZnJvbSAnLi9jb250ZXh0JztcclxuXHJcbmZ1bmN0aW9uIHdpdGhSb3V0ZXI8QyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudFR5cGU+KENvbXBvbmVudDogQykge1xyXG5cclxuICBmdW5jdGlvbiBDb21wb25lbnRXaXRoUm91dGVyUHJvcChwcm9wczogYW55KSB7XHJcbiAgICBjb25zdCB7IGhpc3RvcnksIGxvY2F0aW9uLCBtYXRjaCB9ID0gdXNlQ29udGV4dChSb3V0ZXJDb250ZXh0KTtcclxuICAgIGNvbnN0IHJvdXRlUHJvcHMgPSB7IGhpc3Rvcnk6IGhpc3RvcnksIGxvY2F0aW9uOiBsb2NhdGlvbiwgbWF0Y2g6IG1hdGNoIH07XHJcblxyXG4gICAgcmV0dXJuIDxDb21wb25lbnQgey4uLnByb3BzfSB7Li4ucm91dGVQcm9wc30gLz47XHJcbiAgfVxyXG5cclxuICByZXR1cm4gQ29tcG9uZW50V2l0aFJvdXRlclByb3A7XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IHdpdGhSb3V0ZXI7IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyB1c2VSZWYgfSBmcm9tICdyZWFjdCc7XHJcbmltcG9ydCB7IEhpc3RvcnkgfSBmcm9tICcuLi9oaXN0b3J5L3R5cGVzJztcclxuaW1wb3J0IHsgQmFzZVJvdXRlclByb3BzIH0gZnJvbSAnLi9Ccm93c2VyUm91dGVyJztcclxuaW1wb3J0IHsgY3JlYXRlSGFzaEhpc3RvcnksIHVybEhhc2hUeXBlIH0gZnJvbSAnLi4vaGlzdG9yeS9oYXNoSGlzdG9yeSc7XHJcbmltcG9ydCBSb3V0ZXIgZnJvbSAnLi9Sb3V0ZXInO1xyXG5cclxuZXhwb3J0IHR5cGUgSGFzaFJvdXRlclByb3BzID0gQmFzZVJvdXRlclByb3BzICYge1xyXG4gIGhhc2hUeXBlOiB1cmxIYXNoVHlwZTtcclxufTtcclxuXHJcbmZ1bmN0aW9uIEhhc2hSb3V0ZXI8UCBleHRlbmRzIFBhcnRpYWw8SGFzaFJvdXRlclByb3BzPj4ocHJvcHM6IFApIHtcclxuICBsZXQgaGlzdG9yeVJlZiA9IHVzZVJlZjxIaXN0b3J5PigpO1xyXG4gIGlmIChoaXN0b3J5UmVmLmN1cnJlbnQgPT09IG51bGwgfHwgaGlzdG9yeVJlZi5jdXJyZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgIGhpc3RvcnlSZWYuY3VycmVudCA9IGNyZWF0ZUhhc2hIaXN0b3J5KHtcclxuICAgICAgYmFzZW5hbWU6IHByb3BzLmJhc2VuYW1lLFxyXG4gICAgICBnZXRVc2VyQ29uZmlybWF0aW9uOiBwcm9wcy5nZXRVc2VyQ29uZmlybWF0aW9uLFxyXG4gICAgICBoYXNoVHlwZTogcHJvcHMuaGFzaFR5cGUsXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHJldHVybiA8Um91dGVyIGhpc3Rvcnk9e2hpc3RvcnlSZWYuY3VycmVudH0+e3Byb3BzLmNoaWxkcmVufTwvUm91dGVyPjtcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgSGFzaFJvdXRlcjsiLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XHJcbmltcG9ydCB7IHVzZVJlZiwgUmVhY3ROb2RlIH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgUm91dGVyIGZyb20gJy4vUm91dGVyJztcclxuaW1wb3J0IHsgY3JlYXRlQnJvd3Nlckhpc3RvcnkgfSBmcm9tICcuLi9oaXN0b3J5L2Jyb3dlckhpc3RvcnknO1xyXG5pbXBvcnQgeyBDb25maXJtYXRpb25GdW5jLCBIaXN0b3J5IH0gZnJvbSAnLi4vaGlzdG9yeS90eXBlcyc7XHJcblxyXG5leHBvcnQgdHlwZSBCYXNlUm91dGVyUHJvcHMgPSB7XHJcbiAgYmFzZW5hbWU6IHN0cmluZztcclxuICBnZXRVc2VyQ29uZmlybWF0aW9uOiBDb25maXJtYXRpb25GdW5jO1xyXG4gIGNoaWxkcmVuPzogUmVhY3ROb2RlO1xyXG59O1xyXG5cclxuZXhwb3J0IHR5cGUgQnJvd3NlclJvdXRlclByb3BzID0gQmFzZVJvdXRlclByb3BzICYge1xyXG4gIGZvcmNlUmVmcmVzaDogYm9vbGVhbjtcclxufTtcclxuXHJcbmZ1bmN0aW9uIEJyb3dzZXJSb3V0ZXI8UCBleHRlbmRzIFBhcnRpYWw8QnJvd3NlclJvdXRlclByb3BzPj4ocHJvcHM6IFApIHtcclxuICAvLyDkvb/nlKhSZWbmjIHmnIlIaXN0b3J55a+56LGh77yM6Ziy5q2i6YeN5aSN5riy5p+TXHJcbiAgbGV0IGhpc3RvcnlSZWYgPSB1c2VSZWY8SGlzdG9yeT4oKTtcclxuXHJcbiAgaWYgKGhpc3RvcnlSZWYuY3VycmVudCA9PT0gbnVsbCB8fCBoaXN0b3J5UmVmLmN1cnJlbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgaGlzdG9yeVJlZi5jdXJyZW50ID0gY3JlYXRlQnJvd3Nlckhpc3Rvcnkoe1xyXG4gICAgICBiYXNlbmFtZTogcHJvcHMuYmFzZW5hbWUsXHJcbiAgICAgIGZvcmNlUmVmcmVzaDogcHJvcHMuZm9yY2VSZWZyZXNoLFxyXG4gICAgICBnZXRVc2VyQ29uZmlybWF0aW9uOiBwcm9wcy5nZXRVc2VyQ29uZmlybWF0aW9uLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gPFJvdXRlciBoaXN0b3J5PXtoaXN0b3J5UmVmLmN1cnJlbnR9Pntwcm9wcy5jaGlsZHJlbn08L1JvdXRlcj47XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IEJyb3dzZXJSb3V0ZXI7IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyB1c2VDb250ZXh0IH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgUm91dGVyQ29udGV4dCBmcm9tICcuL2NvbnRleHQnO1xyXG5pbXBvcnQgeyBMb2NhdGlvbiB9IGZyb20gJy4vaW5kZXgnO1xyXG5pbXBvcnQgeyBjcmVhdGVQYXRoLCBwYXJzZVBhdGggfSBmcm9tICcuLi9oaXN0b3J5L3V0aWxzJztcclxuaW1wb3J0IHsgUGF0aCB9IGZyb20gJy4uL2hpc3RvcnkvdHlwZXMnO1xyXG5cclxuZXhwb3J0IHR5cGUgTGlua1Byb3BzID0ge1xyXG4gIGNvbXBvbmVudD86IFJlYWN0LkNvbXBvbmVudFR5cGU8YW55PjtcclxuICB0bzogUGFydGlhbDxMb2NhdGlvbj4gfCBzdHJpbmcgfCAoKGxvY2F0aW9uOiBMb2NhdGlvbikgPT4gc3RyaW5nIHwgUGFydGlhbDxMb2NhdGlvbj4pO1xyXG4gIHJlcGxhY2U/OiBib29sZWFuO1xyXG4gIHRhZz86IHN0cmluZztcclxuICAvKipcclxuICAgKiBAZGVwcmVjYXRlZFxyXG4gICAqIFJlYWN0MTbku6XlkI7kuI3lho3pnIDopoHor6XlsZ7mgKdcclxuICAgKiovXHJcbiAgaW5uZXJSZWY/OiBSZWFjdC5SZWY8SFRNTEFuY2hvckVsZW1lbnQ+O1xyXG59ICYgUmVhY3QuQW5jaG9ySFRNTEF0dHJpYnV0ZXM8SFRNTEFuY2hvckVsZW1lbnQ+O1xyXG5cclxuY29uc3QgaXNNb2RpZmllZEV2ZW50ID0gKGV2ZW50OiBSZWFjdC5Nb3VzZUV2ZW50KSA9PiB7XHJcbiAgcmV0dXJuIGV2ZW50Lm1ldGFLZXkgfHwgZXZlbnQuYWx0S2V5IHx8IGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQuc2hpZnRLZXk7XHJcbn07XHJcblxyXG5jb25zdCBjaGVja1RhcmdldCA9ICh0YXJnZXQ/OiBSZWFjdC5IVE1MQXR0cmlidXRlQW5jaG9yVGFyZ2V0KSA9PiB7XHJcbiAgcmV0dXJuICF0YXJnZXQgfHwgdGFyZ2V0ID09PSAnX3NlbGYnO1xyXG59O1xyXG5cclxuXHJcbmZ1bmN0aW9uIExpbms8UCBleHRlbmRzIExpbmtQcm9wcz4ocHJvcHM6IFApIHtcclxuICBjb25zdCB7IHRvLCByZXBsYWNlLCBjb21wb25lbnQsIG9uQ2xpY2ssIHRhcmdldCwgLi4ub3RoZXIgfSA9IHByb3BzO1xyXG5cclxuICBjb25zdCB0YWcgPSBwcm9wcy50YWcgfHwgJ2EnO1xyXG5cclxuICBjb25zdCBjb250ZXh0ID0gdXNlQ29udGV4dChSb3V0ZXJDb250ZXh0KTtcclxuICBjb25zdCBoaXN0b3J5ID0gY29udGV4dC5oaXN0b3J5O1xyXG5cclxuICBsZXQgbG9jYXRpb24gPSB0eXBlb2YgdG8gPT09ICdmdW5jdGlvbicgPyB0byhjb250ZXh0LmxvY2F0aW9uKSA6IHRvO1xyXG5cclxuICBsZXQgc3RhdGU6IGFueTtcclxuICBsZXQgcGF0aDogUGFydGlhbDxQYXRoPjtcclxuICBpZiAodHlwZW9mIGxvY2F0aW9uID09PSAnc3RyaW5nJykge1xyXG4gICAgcGF0aCA9IHBhcnNlUGF0aChsb2NhdGlvbik7XHJcbiAgfSBlbHNlIHtcclxuICAgIGNvbnN0IHsgcGF0aG5hbWUsIGhhc2gsIHNlYXJjaCB9ID0gbG9jYXRpb247XHJcbiAgICBwYXRoID0geyBwYXRobmFtZSwgaGFzaCwgc2VhcmNoIH07XHJcbiAgICBzdGF0ZSA9IGxvY2F0aW9uLnN0YXRlO1xyXG4gIH1cclxuICBjb25zdCBocmVmID0gaGlzdG9yeS5jcmVhdGVIcmVmKHBhdGgpO1xyXG5cclxuICBjb25zdCBsaW5rQ2xpY2tFdmVudCA9IChldmVudDogUmVhY3QuTW91c2VFdmVudDxIVE1MQW5jaG9yRWxlbWVudD4pID0+IHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGlmIChvbkNsaWNrKSB7XHJcbiAgICAgICAgb25DbGljayhldmVudCk7XHJcbiAgICAgIH1cclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgdGhyb3cgZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIWV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQgJiYgZXZlbnQuYnV0dG9uID09PSAwICYmIGNoZWNrVGFyZ2V0KHRhcmdldCkgJiYgIWlzTW9kaWZpZWRFdmVudChldmVudCkpIHtcclxuICAgICAgLy8g5LiN5piv55u45ZCM55qE6Lev5b6E5omn6KGMcHVzaOaTjeS9nO+8jOaYr+ebuOWQjOeahOi3r+W+hOaJp+ihjHJlcGxhY2VcclxuICAgICAgY29uc3QgaXNTYW1lUGF0aCA9IGNyZWF0ZVBhdGgoY29udGV4dC5sb2NhdGlvbikgPT09IGNyZWF0ZVBhdGgocGF0aCk7XHJcbiAgICAgIGNvbnN0IG5hdmlnYXRlID0gcmVwbGFjZSB8fCBpc1NhbWVQYXRoID8gaGlzdG9yeS5yZXBsYWNlIDogaGlzdG9yeS5wdXNoO1xyXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICBuYXZpZ2F0ZShwYXRoLCBzdGF0ZSk7XHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgY29uc3QgbGlua1Byb3BzID0geyBocmVmOiBocmVmLCBvbkNsaWNrOiBsaW5rQ2xpY2tFdmVudCwgLi4ub3RoZXIgfTtcclxuICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudCh0YWcsIGxpbmtQcm9wcyk7XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IExpbms7IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyB1c2VDb250ZXh0IH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgdHlwZSB7IExpbmtQcm9wcyB9IGZyb20gJy4vTGluayc7XHJcbmltcG9ydCBMaW5rIGZyb20gJy4vTGluayc7XHJcbmltcG9ydCB7IExvY2F0aW9uLCBtYXRjaFBhdGggfSBmcm9tICcuL2luZGV4JztcclxuaW1wb3J0IHsgTWF0Y2hlZCB9IGZyb20gJy4vbWF0Y2hlci9wYXJzZXInO1xyXG5pbXBvcnQgQ29udGV4dCBmcm9tICcuL2NvbnRleHQnO1xyXG5pbXBvcnQgeyBwYXJzZVBhdGggfSBmcm9tICcuLi9oaXN0b3J5L3V0aWxzJztcclxuaW1wb3J0IHsgZXNjYXBlU3RyIH0gZnJvbSAnLi9tYXRjaGVyL3V0aWxzJztcclxuXHJcbnR5cGUgTmF2TGlua1Byb3BzID0ge1xyXG4gIHRvOiBQYXJ0aWFsPExvY2F0aW9uPiB8IHN0cmluZyB8ICgobG9jYXRpb246IExvY2F0aW9uKSA9PiBzdHJpbmcgfCBQYXJ0aWFsPExvY2F0aW9uPik7XHJcbiAgaXNBY3RpdmU/OiAobWF0Y2g6IE1hdGNoZWQgfCBudWxsLCBsb2NhdGlvbjogTG9jYXRpb24pID0+IGJvb2xlYW47XHJcbiAgLy8gY29tcGF0IHJlYWN0LXJvdXRlciBOYXZMaW5rIHByb3BzIHR5cGVcclxuICBba2V5OiBzdHJpbmddOiBhbnk7XHJcbn0gJiBMaW5rUHJvcHM7XHJcblxyXG50eXBlIFBhZ2UgPSAncGFnZSc7XHJcblxyXG5mdW5jdGlvbiBOYXZMaW5rPFAgZXh0ZW5kcyBOYXZMaW5rUHJvcHM+KHByb3BzOiBQKSB7XHJcbiAgY29uc3QgeyB0bywgaXNBY3RpdmUsIC4uLnJlc3QgfSA9IHByb3BzO1xyXG4gIGNvbnN0IGNvbnRleHQgPSB1c2VDb250ZXh0KENvbnRleHQpO1xyXG5cclxuICBjb25zdCB0b0xvY2F0aW9uID0gdHlwZW9mIHRvID09PSAnZnVuY3Rpb24nID8gdG8oY29udGV4dC5sb2NhdGlvbikgOiB0bztcclxuXHJcbiAgY29uc3QgeyBwYXRobmFtZTogcGF0aCB9ID0gdHlwZW9mIHRvTG9jYXRpb24gPT09ICdzdHJpbmcnID8gcGFyc2VQYXRoKHRvTG9jYXRpb24pIDogdG9Mb2NhdGlvbjtcclxuICAvLyDmiormraPliJnooajovr7lvI/nmoTnibnmrornrKblj7fliqDkuKTkuKrlj43mlpzmnaDov5vooYzovazkuYlcclxuICBjb25zdCBlc2NhcGVkUGF0aCA9IHBhdGggPyBlc2NhcGVTdHIocGF0aCkgOiAnJztcclxuICBjb25zdCBtYXRjaCA9IGVzY2FwZWRQYXRoID8gbWF0Y2hQYXRoKGNvbnRleHQubG9jYXRpb24ucGF0aG5hbWUsIGVzY2FwZWRQYXRoKSA6IG51bGw7XHJcblxyXG4gIGNvbnN0IGlzTGlua0FjdGl2ZSA9IG1hdGNoICYmIGlzQWN0aXZlID8gaXNBY3RpdmUobWF0Y2gsIGNvbnRleHQubG9jYXRpb24pIDogZmFsc2U7XHJcblxyXG4gIGNvbnN0IHBhZ2U6IFBhZ2UgPSAncGFnZSc7XHJcbiAgY29uc3Qgb3RoZXJQcm9wcyA9IHtcclxuICAgICdhcmlhLWN1cnJlbnQnOiBpc0xpbmtBY3RpdmUgPyBwYWdlIDogZmFsc2UsXHJcbiAgICAuLi5yZXN0LFxyXG4gIH07XHJcblxyXG4gIHJldHVybiA8TGluayB0bz17dG99IHsuLi5vdGhlclByb3BzfSAvPjtcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgTmF2TGluaztcclxuIiwiaW1wb3J0IHsgTG9jYXRpb24gfSBmcm9tICcuLi9yb3V0ZXInO1xyXG5pbXBvcnQgeyBBY3Rpb24gfSBmcm9tICcuLi9oaXN0b3J5L3R5cGVzJztcclxuXHJcbi8vIOiOt+WPlnJlZHV4IHN0YXRl5Lit55qE5YC8XHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRJbihzdGF0ZTogUmVjb3JkPHN0cmluZywgYW55PiwgcGF0aDogc3RyaW5nW10pOiBhbnkge1xyXG4gIGlmICghc3RhdGUpIHtcclxuICAgIHJldHVybiBzdGF0ZTtcclxuICB9XHJcbiAgY29uc3QgbGVuZ3RoID0gcGF0aC5sZW5ndGg7XHJcbiAgaWYgKCFsZW5ndGgpIHtcclxuICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgfVxyXG4gIGxldCByZXMgPSBzdGF0ZTtcclxuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aCAmJiAhIXJlczsgKytpKSB7XHJcbiAgICByZXMgPSByZXNbcGF0aFtpXV07XHJcbiAgfVxyXG4gIHJldHVybiByZXM7XHJcbn1cclxuXHJcbi8vIOS7jnN0b3Jl55qEc3RhdGXkuK3ojrflj5ZSb3V0ZXLjgIFMb2NhdGlvbuOAgUFjdGlvbuOAgUhhc2jnrYnkv6Hmga9cclxuY29uc3Qgc3RhdGVSZWFkZXIgPSAoc3RvcmVUeXBlOiBzdHJpbmcpID0+IHtcclxuICBjb25zdCBpc1JvdXRlciA9ICh2YWx1ZTogdW5rbm93bikgPT4ge1xyXG4gICAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgISFnZXRJbih2YWx1ZSwgWydsb2NhdGlvbiddKSAmJiAhIWdldEluKHZhbHVlLCBbJ2FjdGlvbiddKTtcclxuICB9O1xyXG5cclxuICBjb25zdCBnZXRSb3V0ZXIgPSAoc3RhdGU6IGFueSkgPT4ge1xyXG4gICAgY29uc3Qgcm91dGVyID0gZ2V0SW4oc3RhdGUsIFsncm91dGVyJ10pO1xyXG4gICAgaWYgKCFpc1JvdXRlcihyb3V0ZXIpKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGZpbmQgcm91dGVyIHJlZHVjZXIgaW4gJHtzdG9yZVR5cGV9IHN0b3JlLCBpdCBtdXN0IGJlIG1vdW50ZWQgdW5kZXIgXCJyb3V0ZXJcImApO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJvdXRlciE7XHJcbiAgfTtcclxuXHJcbiAgY29uc3QgZ2V0TG9jYXRpb24gPSA8Uz4oc3RhdGU6IGFueSk6IFBhcnRpYWw8TG9jYXRpb248Uz4+ID0+IGdldEluKGdldFJvdXRlcihzdGF0ZSksIFsnbG9jYXRpb24nXSk7XHJcbiAgY29uc3QgZ2V0QWN0aW9uID0gKHN0YXRlOiBhbnkpOiBBY3Rpb24gPT4gZ2V0SW4oZ2V0Um91dGVyKHN0YXRlKSwgWydhY3Rpb24nXSk7XHJcbiAgY29uc3QgZ2V0U2VhcmNoID0gKHN0YXRlOiBhbnkpOiBzdHJpbmcgPT4gZ2V0SW4oZ2V0Um91dGVyKHN0YXRlKSwgWydsb2NhdGlvbicsICdzZWFyY2gnXSk7XHJcbiAgY29uc3QgZ2V0SGFzaCA9IChzdGF0ZTogYW55KTogc3RyaW5nID0+IGdldEluKGdldFJvdXRlcihzdGF0ZSksIFsnbG9jYXRpb24nLCAnaGFzaCddKTtcclxuXHJcbiAgcmV0dXJuIHtcclxuICAgIGdldEhhc2gsXHJcbiAgICBnZXRBY3Rpb24sXHJcbiAgICBnZXRTZWFyY2gsXHJcbiAgICBnZXRSb3V0ZXIsXHJcbiAgICBnZXRMb2NhdGlvbixcclxuICB9O1xyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgc3RhdGVSZWFkZXIiLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XHJcbmltcG9ydCB7IHVzZUxheW91dEVmZmVjdCB9IGZyb20gJ3JlYWN0JztcclxuaW1wb3J0IHsgY29ubmVjdCwgUmVhY3RSZWR1eENvbnRleHQgfSBmcm9tICdyZWFjdC1yZWR1eCc7XHJcbmltcG9ydCB7IFN0b3JlIH0gZnJvbSAncmVkdXgnO1xyXG5pbXBvcnQgeyByZWR1eEFkYXB0ZXIgfSBmcm9tICdAY2xvdWRzb3AvaG9yaXpvbic7XHJcbmltcG9ydCB7IEhpc3RvcnksIExvY2F0aW9uLCBSb3V0ZXIgfSBmcm9tICcuLi9yb3V0ZXInO1xyXG5pbXBvcnQgeyBBY3Rpb24sIERlZmF1bHRTdGF0ZVR5cGUsIE5hdmlnYXRpb24gfSBmcm9tICcuLi9oaXN0b3J5L3R5cGVzJztcclxuaW1wb3J0IHsgQWN0aW9uTWVzc2FnZSwgb25Mb2NhdGlvbkNoYW5nZWQgfSBmcm9tICcuL2FjdGlvbnMnO1xyXG5pbXBvcnQgc3RhdGVSZWFkZXIgZnJvbSAnLi9yZWR1eFV0aWxzJztcclxuXHJcbnR5cGUgU3RvcmVUeXBlID0gJ0hvcml6b25YQ29tcGF0JyB8ICdSZWR1eCc7XHJcblxyXG50eXBlIENvbm5lY3RlZFJvdXRlcjxTPiA9IHtcclxuICBzdG9yZTogU3RvcmU7XHJcbiAgaGlzdG9yeTogSGlzdG9yeTxTPjtcclxuICBiYXNlbmFtZTogc3RyaW5nO1xyXG4gIGNoaWxkcmVuPzogKCgpID0+IFJlYWN0LlJlYWN0Tm9kZSkgfCBSZWFjdC5SZWFjdE5vZGU7XHJcbiAgb25Mb2NhdGlvbkNoYW5nZWQ6IChsb2NhdGlvbjogTG9jYXRpb248Uz4sIGFjdGlvbjogQWN0aW9uLCBpc0ZpcnN0UmVuZGVyaW5nOiBib29sZWFuKSA9PiBBY3Rpb25NZXNzYWdlO1xyXG4gIG5vSW5pdGlhbFBvcDogYm9vbGVhbjtcclxuICBvbWl0Um91dGVyOiBib29sZWFuO1xyXG4gIHN0b3JlVHlwZTogU3RvcmVUeXBlO1xyXG59O1xyXG5cclxuY29uc3QgeyBjb25uZWN0OiBoQ29ubmVjdCB9ID0gcmVkdXhBZGFwdGVyO1xyXG5cclxuZnVuY3Rpb24gQ29ubmVjdGVkUm91dGVyV2l0aG91dE1lbW88Uz4ocHJvcHM6IENvbm5lY3RlZFJvdXRlcjxTPikge1xyXG4gIGNvbnN0IHsgc3RvcmUsIGhpc3RvcnksIG9uTG9jYXRpb25DaGFuZ2VkLCBvbWl0Um91dGVyLCBjaGlsZHJlbiwgc3RvcmVUeXBlIH0gPSBwcm9wcztcclxuICBjb25zdCB7IGdldExvY2F0aW9uIH0gPSBzdGF0ZVJlYWRlcihzdG9yZVR5cGUpO1xyXG5cclxuICAvLyDnm5HlkKxzdG9yZeWPmOWMllxyXG4gIGNvbnN0IHVuc3Vic2NyaWJlID0gc3RvcmUuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgIC8vIOiOt+WPlnJlZHV4IFN0YXRl5Lit55qEbG9jYXRpb27kv6Hmga9cclxuICAgIGNvbnN0IHtcclxuICAgICAgcGF0aG5hbWU6IHBhdGhuYW1lSW5TdG9yZSxcclxuICAgICAgc2VhcmNoOiBzZWFyY2hJblN0b3JlLFxyXG4gICAgICBoYXNoOiBoYXNoSW5TdG9yZSxcclxuICAgICAgc3RhdGU6IHN0YXRlSW5TdG9yZSxcclxuICAgIH0gPSBnZXRMb2NhdGlvbjxTPihzdG9yZS5nZXRTdGF0ZSgpKTtcclxuXHJcbiAgICAvLyDojrflj5blvZPliY1oaXN0b3J55a+56LGh5Lit55qEbG9jYXRpb27kv6Hmga9cclxuICAgIGNvbnN0IHtcclxuICAgICAgcGF0aG5hbWU6IHBhdGhuYW1lSW5IaXN0b3J5LFxyXG4gICAgICBzZWFyY2g6IHNlYXJjaEluSGlzdG9yeSxcclxuICAgICAgaGFzaDogaGFzaEluSGlzdG9yeSxcclxuICAgICAgc3RhdGU6IHN0YXRlSW5IaXN0b3J5LFxyXG4gICAgfSA9IGhpc3RvcnkubG9jYXRpb247XHJcblxyXG4gICAgLy8g5Lik5LiqbG9jYXRpb27kuI3kuIDoh7Qg5omn6KGM6Lez6L2sXHJcbiAgICBpZiAoXHJcbiAgICAgIGhpc3RvcnkuYWN0aW9uID09PSAnUFVTSCcgJiZcclxuICAgICAgKHBhdGhuYW1lSW5IaXN0b3J5ICE9PSBwYXRobmFtZUluU3RvcmUgfHxcclxuICAgICAgICBzZWFyY2hJbkhpc3RvcnkgIT09IHNlYXJjaEluU3RvcmUgfHxcclxuICAgICAgICBoYXNoSW5IaXN0b3J5ICE9PSBoYXNoSW5TdG9yZSB8fFxyXG4gICAgICAgIHN0YXRlSW5IaXN0b3J5ICE9PSBzdGF0ZUluU3RvcmUpXHJcbiAgICApIHtcclxuICAgICAgaGlzdG9yeS5wdXNoKFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIHBhdGhuYW1lOiBwYXRobmFtZUluU3RvcmUsXHJcbiAgICAgICAgICBzZWFyY2g6IHNlYXJjaEluU3RvcmUsXHJcbiAgICAgICAgICBoYXNoOiBoYXNoSW5TdG9yZSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHN0YXRlSW5TdG9yZSxcclxuICAgICAgKTtcclxuICAgIH1cclxuICB9KTtcclxuXHJcbiAgY29uc3QgaGFuZGxlTG9jYXRpb25DaGFuZ2UgPSAoYXJnczogTmF2aWdhdGlvbjxTPiwgaXNGaXJzdFJlbmRlcmluZzogYm9vbGVhbiA9IGZhbHNlKSA9PiB7XHJcbiAgICBjb25zdCB7IGxvY2F0aW9uLCBhY3Rpb24gfSA9IGFyZ3M7XHJcbiAgICBvbkxvY2F0aW9uQ2hhbmdlZChsb2NhdGlvbiwgYWN0aW9uLCBpc0ZpcnN0UmVuZGVyaW5nKTtcclxuICB9O1xyXG5cclxuICAvLyDnm5HlkKxoaXN0b3J55pu05pawXHJcbiAgY29uc3QgdW5MaXN0ZW4gPSAoKSA9PiBoaXN0b3J5Lmxpc3RlbihoYW5kbGVMb2NhdGlvbkNoYW5nZSk7XHJcblxyXG4gIHVzZUxheW91dEVmZmVjdCgoKSA9PiB7XHJcbiAgICByZXR1cm4gKCkgPT4ge1xyXG4gICAgICB1bkxpc3RlbigpO1xyXG4gICAgICB1bnN1YnNjcmliZSgpO1xyXG4gICAgfTtcclxuICB9LCBbXSk7XHJcblxyXG4gIGlmICghcHJvcHMubm9Jbml0aWFsUG9wKSB7XHJcbiAgICAvLyDkvKDpgJLliJ3lp4vml7bkvY3nva7kv6Hmga/vvIxpc0ZpcnN0UmVuZGVyaW5n6K6+5Li6dHJ1ZemYsuatoumHjeWkjea4suafk1xyXG4gICAgaGFuZGxlTG9jYXRpb25DaGFuZ2UoeyBsb2NhdGlvbjogaGlzdG9yeS5sb2NhdGlvbiwgYWN0aW9uOiBoaXN0b3J5LmFjdGlvbiB9LCB0cnVlKTtcclxuICB9XHJcblxyXG4gIGlmIChvbWl0Um91dGVyKSB7XHJcbiAgICByZXR1cm4gPD57Y2hpbGRyZW59PC8+O1xyXG4gIH1cclxuICBsZXQgY2hpbGRyZW5Ob2RlOiBSZWFjdC5SZWFjdE5vZGU7XHJcbiAgaWYgKHR5cGVvZiBjaGlsZHJlbiA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgY2hpbGRyZW5Ob2RlID0gY2hpbGRyZW4oKTtcclxuICB9IGVsc2Uge1xyXG4gICAgY2hpbGRyZW5Ob2RlID0gY2hpbGRyZW47XHJcbiAgfVxyXG5cclxuICByZXR1cm4gPFJvdXRlciBoaXN0b3J5PXtoaXN0b3J5fT57Y2hpbGRyZW5Ob2RlfTwvUm91dGVyPjtcclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0Q29ubmVjdGVkUm91dGVyPFMgPSBEZWZhdWx0U3RhdGVUeXBlPih0eXBlOiBTdG9yZVR5cGUpIHtcclxuICBjb25zdCBtYXBEaXNwYXRjaFRvUHJvcHMgPSAoZGlzcGF0Y2g6IGFueSkgPT4gKHtcclxuICAgIG9uTG9jYXRpb25DaGFuZ2VkOiAobG9jYXRpb246IExvY2F0aW9uLCBhY3Rpb246IEFjdGlvbiwgaXNGaXJzdFJlbmRlcmluZzogYm9vbGVhbikgPT5cclxuICAgICAgZGlzcGF0Y2gob25Mb2NhdGlvbkNoYW5nZWQobG9jYXRpb24sIGFjdGlvbiwgaXNGaXJzdFJlbmRlcmluZykpLFxyXG4gIH0pO1xyXG4gIGNvbnN0IENvbm5lY3RlZFJvdXRlciA9IFJlYWN0Lm1lbW8oQ29ubmVjdGVkUm91dGVyV2l0aG91dE1lbW88Uz4pO1xyXG5cclxuICBjb25zdCBDb25uZWN0ZWRSb3V0ZXJXaXRoQ29udGV4dCA9IChwcm9wczogYW55KSA9PiB7XHJcbiAgICBjb25zdCBDb250ZXh0ID0gcHJvcHMuY29udGV4dCB8fCBSZWFjdFJlZHV4Q29udGV4dDtcclxuXHJcbiAgICByZXR1cm4gKFxyXG4gICAgICA8Q29udGV4dC5Db25zdW1lcj5cclxuICAgICAgICB7KHsgc3RvcmUgfTogYW55KSA9PiA8Q29ubmVjdGVkUm91dGVyIHN0b3JlPXtzdG9yZX0gc3RvcmVUeXBlPXt0eXBlfSB7Li4ucHJvcHN9IC8+fVxyXG4gICAgICA8L0NvbnRleHQuQ29uc3VtZXI+XHJcbiAgICApO1xyXG4gIH07XHJcblxyXG4gIC8vIOmSiOWvueS4jeWQjOeahFN0b3Jl57G75Z6L77yM5L2/55So5a+55bqU55qEY29ubmVjdOWHveaVsFxyXG4gIGlmICh0eXBlID09PSAnSG9yaXpvblhDb21wYXQnKSB7XHJcbiAgICByZXR1cm4gaENvbm5lY3QobnVsbCwgbWFwRGlzcGF0Y2hUb1Byb3BzKShDb25uZWN0ZWRSb3V0ZXJXaXRoQ29udGV4dCk7XHJcbiAgfVxyXG4gIGlmICh0eXBlID09PSAnUmVkdXgnKSB7XHJcbiAgICByZXR1cm4gY29ubmVjdChudWxsLCBtYXBEaXNwYXRjaFRvUHJvcHMpKENvbm5lY3RlZFJvdXRlcldpdGhDb250ZXh0KTtcclxuICB9IGVsc2Uge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHN0b3JlIHR5cGUnKTtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCB7IGdldENvbm5lY3RlZFJvdXRlciB9O1xyXG4iLCJpbXBvcnQgeyBBY3Rpb25NZXNzYWdlLCBBY3Rpb25OYW1lIH0gZnJvbSAnLi9hY3Rpb25zJztcclxuaW1wb3J0IHsgSGlzdG9yeSB9IGZyb20gJy4uL2hpc3RvcnkvdHlwZXMnO1xyXG5cclxuLy8g5a6a5LmJY29ubmVjdC1yb3V0ZXLlr7nlupTnmoRyZWR1eCBkaXNwYXRjaOWHveaVsFxyXG5leHBvcnQgZnVuY3Rpb24gcm91dGVyTWlkZGxld2FyZShoaXN0b3J5OiBIaXN0b3J5KSB7XHJcbiAgcmV0dXJuIGZ1bmN0aW9uKF86IGFueSkge1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uKG5leHQ6IGFueSkge1xyXG4gICAgICByZXR1cm4gZnVuY3Rpb24oYWN0aW9uOiBBY3Rpb25NZXNzYWdlKSB7XHJcbiAgICAgICAgaWYgKGFjdGlvbi50eXBlICE9PSBBY3Rpb25OYW1lLkNBTExfSElTVE9SWV9NRVRIT0QpIHtcclxuICAgICAgICAgIHJldHVybiBuZXh0KGFjdGlvbik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHsgcGF5bG9hZDogeyBtZXRob2QsIGFyZ3MgfSB9ID0gYWN0aW9uO1xyXG4gICAgICAgIGlmIChtZXRob2QgaW4gaGlzdG9yeSkge1xyXG4gICAgICAgICAgKGhpc3RvcnkgYXMgYW55KVttZXRob2RdKC4uLmFyZ3MpO1xyXG4gICAgICAgIH1cclxuICAgICAgfTtcclxuICAgIH07XHJcbiAgfTtcclxufVxyXG4iLCJpbXBvcnQgeyBjcmVhdGVDb25uZWN0Um91dGVyIH0gZnJvbSAnLi9yZWR1Y2VyJztcclxuXHJcbmV4cG9ydCB7IGdldENvbm5lY3RlZFJvdXRlciB9IGZyb20gJy4vY29ubmVjdGVkUm91dGVyJztcclxuZXhwb3J0IGNvbnN0IGNvbm5lY3RSb3V0ZXIgPSBjcmVhdGVDb25uZWN0Um91dGVyKCk7XHJcbmV4cG9ydCB7IHJvdXRlck1pZGRsZXdhcmUgfSBmcm9tICcuL2Rpc3BhdGNoJztcclxuIiwiaW1wb3J0IHsgTG9jYXRpb24gYXMgSExvY2F0aW9uIH0gZnJvbSAnLi4vaGlzdG9yeS90eXBlcyc7XHJcbmltcG9ydCB7IGdldENvbm5lY3RlZFJvdXRlciB9IGZyb20gJy4uL2Nvbm5lY3Qtcm91dGVyJztcclxuXHJcbnR5cGUgTG9jYXRpb248UyA9IHVua25vd24+ID0gT21pdDxITG9jYXRpb248Uz4sICdrZXknPjtcclxuXHJcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gaGlzdG9yeSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcblxyXG5leHBvcnQgeyBMb2NhdGlvbiB9O1xyXG5leHBvcnQgdHlwZSB7IEhpc3RvcnkgfSBmcm9tICcuLi9oaXN0b3J5L3R5cGVzJztcclxuXHJcbmV4cG9ydCB7IGNyZWF0ZUJyb3dzZXJIaXN0b3J5IH0gZnJvbSAnLi4vaGlzdG9yeS9icm93ZXJIaXN0b3J5JztcclxuZXhwb3J0IHsgY3JlYXRlSGFzaEhpc3RvcnkgfSBmcm9tICcuLi9oaXN0b3J5L2hhc2hIaXN0b3J5JztcclxuXHJcbmV4cG9ydCB7IGRlZmF1bHQgYXMgX19Sb3V0ZXJDb250ZXh0IH0gZnJvbSAnLi9jb250ZXh0JztcclxuXHJcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gVVJMIHBhcnNlciA9PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcblxyXG5leHBvcnQgeyBtYXRjaFBhdGgsIGdlbmVyYXRlUGF0aCB9IGZyb20gJy4vbWF0Y2hlci9wYXJzZXInO1xyXG5cclxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PSBSb3V0ZXIgSG9va3MgPT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG5cclxuZXhwb3J0IHsgdXNlSGlzdG9yeSwgdXNlTG9jYXRpb24sIHVzZVBhcmFtcywgdXNlUm91dGVNYXRjaCB9IGZyb20gJy4vaG9va3MnO1xyXG5cclxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PSBSb3V0ZXIgZnVuY3Rpb24gY29tcG9uZW50ID09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuXHJcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUm91dGUgfSBmcm9tICcuL1JvdXRlJztcclxuZXhwb3J0IHsgZGVmYXVsdCBhcyBSb3V0ZXIgfSBmcm9tICcuL1JvdXRlcic7XHJcbmV4cG9ydCB7IGRlZmF1bHQgYXMgU3dpdGNoIH0gZnJvbSAnLi9Td2l0Y2gnO1xyXG5leHBvcnQgeyBkZWZhdWx0IGFzIFJlZGlyZWN0IH0gZnJvbSAnLi9SZWRpcmVjdCc7XHJcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUHJvbXB0IH0gZnJvbSAnLi9Qcm9tcHQnO1xyXG5leHBvcnQgeyBkZWZhdWx0IGFzIHdpdGhSb3V0ZXIgfSBmcm9tICcuL3dpdGhSb3V0ZXInO1xyXG5leHBvcnQgeyBkZWZhdWx0IGFzIEhhc2hSb3V0ZXIgfSBmcm9tICcuL0hhc2hSb3V0ZXInO1xyXG5leHBvcnQgeyBkZWZhdWx0IGFzIEJyb3dzZXJSb3V0ZXIgfSBmcm9tICcuL0Jyb3dzZXJSb3V0ZXInO1xyXG5leHBvcnQgeyBkZWZhdWx0IGFzIExpbmsgfSBmcm9tICcuL0xpbmsnO1xyXG5leHBvcnQgeyBkZWZhdWx0IGFzIE5hdkxpbmsgfSBmcm9tICcuL05hdkxpbmsnO1xyXG5cclxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PSBSb3V0ZXIgVHlwZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG5cclxuZXhwb3J0IHR5cGUgeyBSb3V0ZUNvbXBvbmVudFByb3BzLCBSb3V0ZUNoaWxkcmVuUHJvcHMsIFJvdXRlUHJvcHMgfSBmcm9tICcuL1JvdXRlJztcclxuXHJcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gQ29ubmVjdC1yb3V0ZXIgPT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG5cclxuZXhwb3J0IHsgY29ubmVjdFJvdXRlciwgcm91dGVyTWlkZGxld2FyZSB9IGZyb20gJy4uL2Nvbm5lY3Qtcm91dGVyJztcclxuZXhwb3J0IGNvbnN0IENvbm5lY3RlZFJvdXRlciA9IGdldENvbm5lY3RlZFJvdXRlcignUmVkdXgnKTtcclxuZXhwb3J0IGNvbnN0IENvbm5lY3RlZEhSb3V0ZXIgPSBnZXRDb25uZWN0ZWRSb3V0ZXIoJ0hvcml6b25YQ29tcGF0Jyk7Il0sIm5hbWVzIjpbIl9leHRlbmRzIiwiT2JqZWN0IiwiYXNzaWduIiwiYmluZCIsInRhcmdldCIsImkiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJzb3VyY2UiLCJrZXkiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJhcHBseSIsIkFjdGlvbk5hbWUiLCJvbkxvY2F0aW9uQ2hhbmdlZCIsImxvY2F0aW9uIiwiYWN0aW9uIiwiaXNGaXJzdFJlbmRlcmluZyIsInVuZGVmaW5lZCIsInR5cGUiLCJMT0NBVElPTl9DSEFOR0UiLCJwYXlsb2FkIiwiaW5qZWN0UXVlcnlQYXJhbXMiLCJxdWVyeSIsInF1ZXJ5U3RyaW5nIiwic2VhcmNoIiwicXVlcnlPYmplY3QiLCJwYXJhbXMiLCJVUkxTZWFyY2hQYXJhbXMiLCJmb3JFYWNoIiwidmFsdWUiLCJjcmVhdGVDb25uZWN0Um91dGVyIiwiaGlzdG9yeSIsImluaXRSb3V0ZXJTdGF0ZSIsInN0YXRlIiwiX3JlZiIsImlzQnJvd3NlciIsIndpbmRvdyIsImRvY3VtZW50IiwiY3JlYXRlRWxlbWVudCIsImdldERlZmF1bHRDb25maXJtYXRpb24iLCJtZXNzYWdlIiwiY2FsbEJhY2siLCJjb25maXJtIiwiaXNTdXBwb3J0SGlzdG9yeSIsImlzU3VwcG9ydHNQb3BTdGF0ZSIsIm5hdmlnYXRvciIsInVzZXJBZ2VudCIsImluZGV4T2YiLCJBY3Rpb24iLCJFdmVudFR5cGUiLCJjcmVhdGVQYXRoIiwicGF0aCIsImhhc2giLCJwYXRobmFtZSIsInN0YXJ0c1dpdGgiLCJwYXJzZVBhdGgiLCJ1cmwiLCJwYXJzZWRQYXRoIiwiaGFzaElkeCIsInN1YnN0cmluZyIsInNlYXJjaElkeCIsImNyZWF0ZUxvY2F0aW9uIiwiY3VycmVudCIsInRvIiwidXJsT2JqIiwiZ2V0UmFuZEtleSIsImdlblJhbmRvbUtleSIsImlzTG9jYXRpb25FcXVhbCIsInAxIiwicDIiLCJhZGRIZWFkU2xhc2giLCJzdHJpcEhlYWRTbGFzaCIsIm5vcm1hbGl6ZVNsYXNoIiwidGVtcFBhdGgiLCJoYXNCYXNlbmFtZSIsInByZWZpeCIsInRvTG93ZXJDYXNlIiwiaW5jbHVkZXMiLCJjaGFyQXQiLCJzdHJpcEJhc2VuYW1lIiwiY3JlYXRlTWVtb3J5UmVjb3JkIiwiaW5pdFZhbCIsImZuIiwidmlzaXRlZFJlY29yZCIsImdldERlbHRhIiwiZm9ybSIsInRvSWR4IiwibGFzdEluZGV4T2YiLCJmcm9tSWR4IiwiYWRkUmVjb3JkIiwibmV3UmVjb3JkIiwiY3VyVmFsIiwiTmV3VmFsIiwicHVzaCIsInByZXZJZHgiLCJuZXdWaXNpdGVkUmVjb3JkIiwic2xpY2UiLCJyZXBsYWNlIiwiZW5kIiwiTWF0aCIsInJhbmRvbSIsInRvU3RyaW5nIiwiX2NsYXNzQ2FsbENoZWNrIiwiaW5zdGFuY2UiLCJDb25zdHJ1Y3RvciIsIlR5cGVFcnJvciIsIl90eXBlb2YiLCJvYmoiLCJTeW1ib2wiLCJpdGVyYXRvciIsImNvbnN0cnVjdG9yIiwiX3RvUHJpbWl0aXZlIiwiaW5wdXQiLCJoaW50IiwicHJpbSIsInRvUHJpbWl0aXZlIiwicmVzIiwiU3RyaW5nIiwiTnVtYmVyIiwiX3RvUHJvcGVydHlLZXkiLCJhcmciLCJfZGVmaW5lUHJvcGVydGllcyIsInByb3BzIiwiZGVzY3JpcHRvciIsImVudW1lcmFibGUiLCJjb25maWd1cmFibGUiLCJ3cml0YWJsZSIsImRlZmluZVByb3BlcnR5IiwidG9Qcm9wZXJ0eUtleSIsIl9jcmVhdGVDbGFzcyIsInByb3RvUHJvcHMiLCJzdGF0aWNQcm9wcyIsIlRyYW5zaXRpb25NYW5hZ2VyIiwicHJvbXB0IiwibGlzdGVuZXJzIiwic2V0UHJvbXB0IiwiX3RoaXMiLCJhZGRMaXN0ZW5lciIsImZ1bmMiLCJfdGhpczIiLCJpc0FjdGl2ZSIsImxpc3RlbmVyIiwiYXJncyIsImZpbHRlciIsIml0ZW0iLCJub3RpZnlMaXN0ZW5lcnMiLCJfaXRlcmF0b3IiLCJfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlciIsIl9zdGVwIiwicyIsIm4iLCJkb25lIiwiZXJyIiwiZSIsImYiLCJjb25maXJtSnVtcFRvIiwidXNlckNvbmZpcm1hdGlvbkZ1bmMiLCJyZXN1bHQiLCJ3YXJuaW5nIiwiY29uZGl0aW9uIiwiY29uc29sZSIsIndhcm4iLCJnZXRCYXNlSGlzdG9yeSIsInRyYW5zaXRpb25NYW5hZ2VyIiwic2V0TGlzdGVuZXIiLCJicm93c2VySGlzdG9yeSIsImdvIiwic3RlcCIsImdvQmFjayIsImdvRm9yd2FyZCIsImxpc3RlbiIsImNhbmNlbCIsImlzQmxvY2tlZCIsImJsb2NrIiwidW5ibG9jayIsImdldFVwZGF0ZVN0YXRlRnVuYyIsImhpc3RvcnlQcm9wcyIsIm5leHRTdGF0ZSIsImNyZWF0ZUJyb3dzZXJIaXN0b3J5Iiwib3B0aW9ucyIsInN1cHBvcnRIaXN0b3J5IiwiaXNTdXBwb3J0UG9wU3RhdGUiLCJfb3B0aW9ucyRmb3JjZVJlZnJlc2giLCJmb3JjZVJlZnJlc2giLCJfb3B0aW9ucyRnZXRVc2VyQ29uZmkiLCJnZXRVc2VyQ29uZmlybWF0aW9uIiwiYmFzZW5hbWUiLCJpbml0TG9jYXRpb24iLCJnZXRMb2NhdGlvbiIsImdldEhpc3RvcnlTdGF0ZSIsInJlY29yZE9wZXJhdG9yIiwibCIsIl9nZXRCYXNlSGlzdG9yeSIsInBvcCIsImNyZWF0ZUhyZWYiLCJ1cGRhdGVTdGF0ZSIsImhpc3RvcnlTdGF0ZSIsIl93aW5kb3ckbG9jYXRpb24iLCJmb3JjZUp1bXAiLCJoYW5kbGVQb3BTdGF0ZSIsImNhbGxiYWNrIiwiaXNKdW1wIiwicmV2ZXJ0UG9wU3RhdGUiLCJwb3BTdGF0ZUxpc3RlbmVyIiwiZXZlbnQiLCJoYXNoQ2hhbmdlTGlzdGVuZXIiLCJsaXN0ZW5lckNvdW50IiwiY291bnQiLCJhZGRFdmVudExpc3RlbmVyIiwiUG9wU3RhdGUiLCJIYXNoQ2hhbmdlIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsImRlbHRhIiwiaHJlZiIsInB1c2hTdGF0ZSIsInJlcGxhY2VTdGF0ZSIsInN0cmlwSGFzaCIsImlkeCIsImdldEhhc2hDb250ZW50IiwiY3JlYXRlSGFzaEhpc3RvcnkiLCJvcHRpb24iLCJfb3B0aW9uJGhhc2hUeXBlIiwiaGFzaFR5cGUiLCJfb3B0aW9uJGdldFVzZXJDb25maXIiLCJwYXRoRGVjb2RlciIsInBhdGhFbmNvZGVyIiwiaGFzaFBhdGgiLCJtZW1SZWNvcmRzIiwidGFnIiwicXVlcnlTZWxlY3RvciIsImJhc2UiLCJnZXRBdHRyaWJ1dGUiLCJmb3JjZU5leHRQb3AiLCJpZ25vcmVQYXRoIiwiZW5jb2RlZFBhdGgiLCJoYW5kbGVIYXNoQ2hhbmdlIiwicHJldkxvY2F0aW9uIiwiY3JlYXRlTmFtZWRDb250ZXh0IiwibmFtZSIsImRlZmF1bHRWYWx1ZSIsImNvbnRleHQiLCJjcmVhdGVDb250ZXh0IiwiZGlzcGxheU5hbWUiLCJSb3V0ZXJDb250ZXh0IiwiVG9rZW5UeXBlIiwiY2xlYW5QYXRoIiwic2NvcmVDb21wYXJlIiwic2NvcmUxIiwic2NvcmUyIiwic2NvcmUxTGVuZ3RoIiwic2NvcmUyTGVuZ3RoIiwibWluIiwiZXNjYXBlU3RyIiwic3RyIiwidmFsaWRDaGFyIiwibGV4ZXIiLCJ0b2tlbnMiLCJ1cmxQYXRoIiwiRXJyb3IiLCJnZXRMaXRlcmFsIiwidGVzdCIsInNraXBDaGFyIiwiY3VyQ2hhciIsInByZXZDaGFyIiwiRGVsaW1pdGVyIiwiUGFyYW0iLCJXaWxkQ2FyZCIsIlN0YXRpYyIsIkxCcmFja2V0IiwiUkJyYWNrZXQiLCJQYXR0ZXJuIiwiTWF0Y2hTY29yZSIsImRlZmF1bHRPcHRpb24iLCJjYXNlU2Vuc2l0aXZlIiwic3RyaWN0TW9kZSIsImV4YWN0IiwiUkVHRVhfQ0hBUlNfUkUiLCJCQVNFX1BBUkFNX1BBVFRFUk4iLCJEZWZhdWx0RGVsaW1pdGVyIiwiY3JlYXRlUGF0aFBhcnNlciIsIl9vcHRpb24kY2FzZVNlbnNpdGl2ZSIsIl9vcHRpb24kc3RyaWN0TW9kZSIsIl9vcHRpb24kZXhhY3QiLCJwYXR0ZXJuIiwia2V5cyIsInNjb3JlcyIsIm9ubHlIYXNXaWxkQ2FyZCIsInRva2VuQ291bnQiLCJsYXN0VG9rZW4iLCJ0b2tlbklkeCIsInRva2VuIiwibmV4dFRva2VuIiwic3RhdGljIiwicGFyYW1SZWdleHAiLCJwYXJhbSIsIndpbGRjYXJkIiwicGxhY2Vob2xkZXIiLCJpc1dpbGRDYXJkIiwiZmxhZyIsInJlZ2V4cCIsIlJlZ0V4cCIsInBhcnNlIiwicmVNYXRjaCIsIm1hdGNoIiwibWF0Y2hlZFBhdGgiLCJwYXJzZVNjb3JlIiwiQXJyYXkiLCJmcm9tIiwic3BsaXQiLCJpc0FycmF5IiwiX3BhcmFtcyQiLCJzcGxpY2UiLCJjb25jYXQiLCJmaWxsIiwiaXNFeGFjdCIsInNjb3JlIiwiY29tcGlsZSIsIndpbGRDYXJkIiwiam9pbiIsIm1hdGNoUGF0aCIsInBhdHRlcm5zIiwibWF0Y2hlZFJlc3VsdHMiLCJfaXRlcmF0b3IyIiwiX3N0ZXAyIiwicGFyc2VyIiwibWF0Y2hlZCIsInNvcnQiLCJhIiwiYiIsImdlbmVyYXRlUGF0aCIsInVzZUhpc3RvcnkiLCJ1c2VDb250ZXh0IiwidXNlTG9jYXRpb24iLCJ1c2VQYXJhbXMiLCJ1c2VSb3V0ZU1hdGNoIiwiUm91dGUiLCJjb21wdXRlZCIsImNoaWxkcmVuIiwiY29tcG9uZW50IiwicmVuZGVyIiwicm91dGVMb2NhdGlvbiIsIm5ld1Byb3BzIiwiQ2hpbGRyZW4iLCJnZXRDaGlsZHJlbiIsIlJlYWN0IiwiUHJvdmlkZXIiLCJSb3V0ZXIiLCJfcHJvcHMkY2hpbGRyZW4iLCJfdXNlU3RhdGUiLCJ1c2VTdGF0ZSIsInNldExvY2F0aW9uIiwicGVuZGluZ0xvY2F0aW9uIiwidXNlUmVmIiwidW5MaXN0ZW4iLCJ1c2VMYXlvdXRFZmZlY3QiLCJpbml0Q29udGV4dFZhbHVlIiwidXNlTWVtbyIsIl9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlIiwiZXhjbHVkZWQiLCJzb3VyY2VLZXlzIiwiTGlmZUN5Y2xlIiwicHJldlByb3BzIiwiaXNNb3VudCIsIm9uTW91bnQiLCJvblVwZGF0ZSIsIm9uVW5tb3VudCIsIlJlZGlyZWN0IiwiX3Byb3BzJHB1c2giLCJjYWxjTG9jYXRpb24iLCJuYXZpZ2F0ZSIsIl9jYWxjTG9jYXRpb24iLCJfZXhjbHVkZWQiLCJvbk1vdW50RnVuYyIsIm9uVXBkYXRlRnVuYyIsInByZXZQYXRoIiwiZGF0YSIsIlN3aXRjaCIsImVsZW1lbnQiLCJub2RlIiwiaXNWYWxpZEVsZW1lbnQiLCJzdHJpY3QiLCJzZW5zaXRpdmUiLCJjbG9uZUVsZW1lbnQiLCJQcm9tcHQiLCJfcHJvcHMkd2hlbiIsIndoZW4iLCJyZWxlYXNlIiwib25Vbm1vdW50RnVuYyIsIndpdGhSb3V0ZXIiLCJDb21wb25lbnQiLCJDb21wb25lbnRXaXRoUm91dGVyUHJvcCIsIl91c2VDb250ZXh0Iiwicm91dGVQcm9wcyIsIkhhc2hSb3V0ZXIiLCJoaXN0b3J5UmVmIiwiQnJvd3NlclJvdXRlciIsImlzTW9kaWZpZWRFdmVudCIsIm1ldGFLZXkiLCJhbHRLZXkiLCJjdHJsS2V5Iiwic2hpZnRLZXkiLCJjaGVja1RhcmdldCIsIkxpbmsiLCJvbkNsaWNrIiwib3RoZXIiLCJsaW5rQ2xpY2tFdmVudCIsInByZXZlbnREZWZhdWx0IiwiZGVmYXVsdFByZXZlbnRlZCIsImJ1dHRvbiIsImlzU2FtZVBhdGgiLCJsaW5rUHJvcHMiLCJOYXZMaW5rIiwicmVzdCIsIkNvbnRleHQiLCJ0b0xvY2F0aW9uIiwiZXNjYXBlZFBhdGgiLCJpc0xpbmtBY3RpdmUiLCJwYWdlIiwib3RoZXJQcm9wcyIsImdldEluIiwic3RhdGVSZWFkZXIiLCJzdG9yZVR5cGUiLCJpc1JvdXRlciIsImdldFJvdXRlciIsInJvdXRlciIsImdldEFjdGlvbiIsImdldFNlYXJjaCIsImdldEhhc2giLCJoQ29ubmVjdCIsInJlZHV4QWRhcHRlciIsImNvbm5lY3QiLCJDb25uZWN0ZWRSb3V0ZXJXaXRob3V0TWVtbyIsInN0b3JlIiwib21pdFJvdXRlciIsIl9zdGF0ZVJlYWRlciIsInVuc3Vic2NyaWJlIiwic3Vic2NyaWJlIiwiX2dldExvY2F0aW9uIiwiZ2V0U3RhdGUiLCJwYXRobmFtZUluU3RvcmUiLCJzZWFyY2hJblN0b3JlIiwiaGFzaEluU3RvcmUiLCJzdGF0ZUluU3RvcmUiLCJfaGlzdG9yeSRsb2NhdGlvbiIsInBhdGhuYW1lSW5IaXN0b3J5Iiwic2VhcmNoSW5IaXN0b3J5IiwiaGFzaEluSGlzdG9yeSIsInN0YXRlSW5IaXN0b3J5IiwiaGFuZGxlTG9jYXRpb25DaGFuZ2UiLCJub0luaXRpYWxQb3AiLCJGcmFnbWVudCIsImNoaWxkcmVuTm9kZSIsImdldENvbm5lY3RlZFJvdXRlciIsIm1hcERpc3BhdGNoVG9Qcm9wcyIsImRpc3BhdGNoIiwiQ29ubmVjdGVkUm91dGVyIiwibWVtbyIsIkNvbm5lY3RlZFJvdXRlcldpdGhDb250ZXh0IiwiUmVhY3RSZWR1eENvbnRleHQiLCJDb25zdW1lciIsInJvdXRlck1pZGRsZXdhcmUiLCJfIiwibmV4dCIsIkNBTExfSElTVE9SWV9NRVRIT0QiLCJfYWN0aW9uJHBheWxvYWQiLCJtZXRob2QiLCJjb25uZWN0Um91dGVyIiwiQ29ubmVj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 diff --git a/packages/horizon-router/connectRouter/esm/connectRouter.js b/packages/horizon-router/connectRouter/esm/connectRouter.js deleted file mode 100644 index 798c7413..00000000 --- a/packages/horizon-router/connectRouter/esm/connectRouter.js +++ /dev/null @@ -1,1742 +0,0 @@ -import * as React from 'react'; -import { createContext, useContext, Children, createElement, useState, useRef, useLayoutEffect, useMemo, isValidElement, cloneElement } from 'react'; -import { connect, ReactReduxContext } from 'react-redux'; -import { reduxAdapter } from '@cloudsop/horizon'; - -function _extends() { - _extends = Object.assign ? Object.assign.bind() : function (target) { - for (var i = 1; i < arguments.length; i++) { - var source = arguments[i]; - for (var key in source) { - if (Object.prototype.hasOwnProperty.call(source, key)) { - target[key] = source[key]; - } - } - } - return target; - }; - return _extends.apply(this, arguments); -} - -// 定义位置变化和history方法调用的Action type -var ActionName = /*#__PURE__*/function (ActionName) { - ActionName["LOCATION_CHANGE"] = "$horizon-router/LOCATION_CHANGE"; - ActionName["CALL_HISTORY_METHOD"] = "$horizon-router/CALL_HISTORY_METHOD"; - return ActionName; -}({}); - -// 定义Action的两种数据类型 - -var onLocationChanged = function (location, action) { - var isFirstRendering = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - return { - type: ActionName.LOCATION_CHANGE, - payload: { - location: location, - action: action, - isFirstRendering: isFirstRendering - } - }; -}; - -// 解析location对象,将其中的query参数解析并注入 -function injectQueryParams(location) { - if (location && location.query) { - return location; - } - var queryString = location && location.search; - if (!queryString) { - return _extends({}, location, { - query: {} - }); - } - var queryObject = {}; - var params = new URLSearchParams(queryString); - params.forEach(function (value, key) { - return queryObject[key] = value; - }); - return _extends({}, location, { - query: queryObject - }); -} -function createConnectRouter() { - // 初始化redux State - return function (history) { - var initRouterState = { - location: injectQueryParams(history.location), - action: history.action - }; - - // 定义connect-router对应的redux reducer函数 - return function () { - var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : initRouterState; - var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, - type = _ref.type, - payload = _ref.payload; - if (type === ActionName.LOCATION_CHANGE) { - var location = payload.location, - action = payload.action, - isFirstRendering = payload.isFirstRendering; - if (isFirstRendering) { - return state; - } - return _extends({}, state, { - location: injectQueryParams(location), - action: action - }); - } - return state; - }; - }; -} - -function isBrowser() { - return typeof window !== 'undefined' && window.document && typeof window.document.createElement === 'function'; -} -function getDefaultConfirmation(message, callBack) { - callBack(window.confirm(message)); -} - -// 判断浏览器是否支持pushState方法,pushState是browserHistory实现的基础 -function isSupportHistory() { - return isBrowser() && window.history && 'pushState' in window.history; -} - -// 判断浏览器是否支持PopState事件 -function isSupportsPopState() { - return window.navigator.userAgent.indexOf('Trident') === -1; -} - -var Action = /*#__PURE__*/function (Action) { - Action["pop"] = "POP"; - Action["push"] = "PUSH"; - Action["replace"] = "REPLACE"; - return Action; -}({}); -var EventType = /*#__PURE__*/function (EventType) { - EventType["PopState"] = "popstate"; - EventType["HashChange"] = "hashchange"; - return EventType; -}({}); - -function createPath(path) { - var search = path.search, - hash = path.hash; - var pathname = path.pathname || '/'; - if (search && search !== '?') { - pathname += search.startsWith('?') ? search : '?' + search; - } - if (hash && hash !== '#') { - pathname += hash.startsWith('#') ? hash : '#' + hash; - } - return pathname; -} -function parsePath(url) { - if (!url) { - return {}; - } - var parsedPath = {}; - var hashIdx = url.indexOf('#'); - if (hashIdx > -1) { - parsedPath.hash = url.substring(hashIdx); - url = url.substring(0, hashIdx); - } - var searchIdx = url.indexOf('?'); - if (searchIdx > -1) { - parsedPath.search = url.substring(searchIdx); - url = url.substring(0, searchIdx); - } - if (url) { - parsedPath.pathname = url; - } - return parsedPath; -} -function createLocation(current, to, state, key) { - var pathname = typeof current === 'string' ? current : current.pathname; - var urlObj = typeof to === 'string' ? parsePath(to) : to; - // 随机key长度取6 - var getRandKey = genRandomKey(6); - var location = _extends({ - pathname: pathname, - search: '', - hash: '', - state: state, - key: typeof key === 'string' ? key : getRandKey() - }, urlObj); - if (!location.pathname) { - location.pathname = '/'; - } - return location; -} -function isLocationEqual(p1, p2) { - return p1.pathname === p2.pathname && p1.search === p2.search && p1.hash === p2.hash; -} -function addHeadSlash(path) { - if (path[0] === '/') { - return path; - } - return '/' + path; -} -function stripHeadSlash(path) { - if (path[0] === '/') { - return path.substring(1); - } - return path; -} -function normalizeSlash(path) { - var tempPath = addHeadSlash(path); - if (tempPath[tempPath.length - 1] === '/') { - return tempPath.substring(0, tempPath.length - 1); - } - return tempPath; -} -function hasBasename(path, prefix) { - return path.toLowerCase().indexOf(prefix.toLowerCase()) === 0 && ['/', '?', '#', ''].includes(path.charAt(prefix.length)); -} -function stripBasename(path, prefix) { - return hasBasename(path, prefix) ? path.substring(prefix.length) : path; -} - -// 使用随机生成的Key记录被访问过的URL,当Block被被触发时利用delta值跳转到之前的页面 -function createMemoryRecord(initVal, fn) { - var visitedRecord = [fn(initVal)]; - function getDelta(to, form) { - var toIdx = visitedRecord.lastIndexOf(fn(to)); - if (toIdx === -1) { - toIdx = 0; - } - var fromIdx = visitedRecord.lastIndexOf(fn(form)); - if (fromIdx === -1) { - fromIdx = 0; - } - return toIdx - fromIdx; - } - function addRecord(current, newRecord, action) { - var curVal = fn(current); - var NewVal = fn(newRecord); - if (action === Action.push) { - var prevIdx = visitedRecord.lastIndexOf(curVal); - var newVisitedRecord = visitedRecord.slice(0, prevIdx + 1); - newVisitedRecord.push(NewVal); - visitedRecord = newVisitedRecord; - } - if (action === Action.replace) { - var _prevIdx = visitedRecord.lastIndexOf(curVal); - if (_prevIdx !== -1) { - visitedRecord[_prevIdx] = NewVal; - } - } - } - return { - getDelta: getDelta, - addRecord: addRecord - }; -} -function genRandomKey(length) { - var end = length + 2; - return function () { - return Math.random().toString(18).substring(2, end); - }; -} - -function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } -} - -function _typeof(obj) { - "@babel/helpers - typeof"; - - return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { - return typeof obj; - } : function (obj) { - return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; - }, _typeof(obj); -} - -function _toPrimitive(input, hint) { - if (_typeof(input) !== "object" || input === null) return input; - var prim = input[Symbol.toPrimitive]; - if (prim !== undefined) { - var res = prim.call(input, hint || "default"); - if (_typeof(res) !== "object") return res; - throw new TypeError("@@toPrimitive must return a primitive value."); - } - return (hint === "string" ? String : Number)(input); -} - -function _toPropertyKey(arg) { - var key = _toPrimitive(arg, "string"); - return _typeof(key) === "symbol" ? key : String(key); -} - -function _defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i]; - descriptor.enumerable = descriptor.enumerable || false; - descriptor.configurable = true; - if ("value" in descriptor) descriptor.writable = true; - Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); - } -} -function _createClass(Constructor, protoProps, staticProps) { - if (protoProps) _defineProperties(Constructor.prototype, protoProps); - if (staticProps) _defineProperties(Constructor, staticProps); - Object.defineProperty(Constructor, "prototype", { - writable: false - }); - return Constructor; -} - -function _createForOfIteratorHelper$1(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray$1(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function () {}; return { s: F, n: function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function (e) { throw e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function () { it = it.call(o); }, n: function () { var step = it.next(); normalCompletion = step.done; return step; }, e: function (e) { didErr = true; err = e; }, f: function () { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; } -function _unsupportedIterableToArray$1(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray$1(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray$1(o, minLen); } -function _arrayLikeToArray$1(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } -var TransitionManager = /*#__PURE__*/function () { - function TransitionManager() { - _classCallCheck(this, TransitionManager); - this.prompt = void 0; - this.listeners = void 0; - this.prompt = null; - this.listeners = []; - } - _createClass(TransitionManager, [{ - key: "setPrompt", - value: function setPrompt(prompt) { - var _this = this; - this.prompt = prompt; - - // 清除Prompt - return function () { - if (_this.prompt === prompt) { - _this.prompt = null; - } - }; - } - - // 使用发布订阅模式管理history的监听者 - }, { - key: "addListener", - value: function addListener(func) { - var _this2 = this; - var isActive = true; - var listener = function (args) { - if (isActive) { - func(args); - } - }; - this.listeners.push(listener); - return function () { - isActive = false; - // 移除对应的监听者 - _this2.listeners = _this2.listeners.filter(function (item) { - return item !== listener; - }); - }; - } - }, { - key: "notifyListeners", - value: function notifyListeners(args) { - var _iterator = _createForOfIteratorHelper$1(this.listeners), - _step; - try { - for (_iterator.s(); !(_step = _iterator.n()).done;) { - var listener = _step.value; - listener(args); - } - } catch (err) { - _iterator.e(err); - } finally { - _iterator.f(); - } - } - }, { - key: "confirmJumpTo", - value: function confirmJumpTo(location, action, userConfirmationFunc, callBack) { - if (this.prompt !== null) { - var result = typeof this.prompt === 'function' ? this.prompt(location, action) : this.prompt; - if (typeof result === 'string') { - typeof userConfirmationFunc === 'function' ? userConfirmationFunc(result, callBack) : callBack(true); - } else { - callBack(result !== false); - } - } else { - callBack(true); - } - } - }]); - return TransitionManager; -}(); - -function warning(condition, message) { - if (condition) { - if (console && typeof console.warn === 'function') { - console.warn(message); - } - } -} - -// 抽取BrowserHistory和HashHistory中相同的方法 -function getBaseHistory(transitionManager, setListener, browserHistory) { - function go(step) { - browserHistory.go(step); - } - function goBack() { - browserHistory.go(-1); - } - function goForward() { - browserHistory.go(1); - } - function listen(listener) { - var cancel = transitionManager.addListener(listener); - setListener(1); - return function () { - setListener(-1); - cancel(); - }; - } - var isBlocked = false; - function block() { - var prompt = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; - var unblock = transitionManager.setPrompt(prompt); - if (!isBlocked) { - setListener(1); - isBlocked = true; - } - return function () { - if (isBlocked) { - isBlocked = false; - setListener(-1); - } - unblock(); - }; - } - function getUpdateStateFunc(historyProps) { - return function (nextState) { - if (nextState) { - _extends(historyProps, nextState); - } - historyProps.length = browserHistory.length; - var args = { - location: historyProps.location, - action: historyProps.action - }; - transitionManager.notifyListeners(args); - }; - } - return { - go: go, - goBack: goBack, - goForward: goForward, - listen: listen, - block: block, - getUpdateStateFunc: getUpdateStateFunc - }; -} - -function createBrowserHistory() { - var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; - var supportHistory = isSupportHistory(); - var isSupportPopState = isSupportsPopState(); - var browserHistory = window.history; - var _options$forceRefresh = options.forceRefresh, - forceRefresh = _options$forceRefresh === void 0 ? false : _options$forceRefresh, - _options$getUserConfi = options.getUserConfirmation, - getUserConfirmation = _options$getUserConfi === void 0 ? getDefaultConfirmation : _options$getUserConfi; - var basename = options.basename ? normalizeSlash(options.basename) : ''; - var initLocation = getLocation(getHistoryState()); - var recordOperator = createMemoryRecord(initLocation, function (l) { - return l.key; - }); - var transitionManager = new TransitionManager(); - var _getBaseHistory = getBaseHistory(transitionManager, setListener, browserHistory), - go = _getBaseHistory.go, - goBack = _getBaseHistory.goBack, - goForward = _getBaseHistory.goForward, - listen = _getBaseHistory.listen, - block = _getBaseHistory.block, - getUpdateStateFunc = _getBaseHistory.getUpdateStateFunc; - var history = { - action: Action.pop, - length: browserHistory.length, - location: initLocation, - go: go, - goBack: goBack, - goForward: goForward, - listen: listen, - block: block, - push: push, - replace: replace, - createHref: createHref - }; - var updateState = getUpdateStateFunc(history); - function getHistoryState() { - return supportHistory ? window.history.state : {}; - } - function getLocation(historyState) { - var _window$location = window.location, - search = _window$location.search, - hash = _window$location.hash; - var _ref = historyState || {}, - key = _ref.key, - state = _ref.state; - var pathname = window.location.pathname; - pathname = basename ? stripBasename(pathname, basename) : pathname; - return createLocation('', { - pathname: pathname, - search: search, - hash: hash - }, state, key); - } - - // 拦截页面POP事件后,防止返回到的页面被重复拦截 - var forceJump = false; - function handlePopState(location) { - if (forceJump) { - forceJump = false; - updateState(undefined); - } else { - var action = Action.pop; - var callback = function (isJump) { - if (isJump) { - // 执行跳转行为 - updateState({ - action: action, - location: location - }); - } else { - revertPopState(location, history.location); - } - }; - transitionManager.confirmJumpTo(location, action, getUserConfirmation, callback); - } - } - function popStateListener(event) { - handlePopState(getLocation(event.state)); - } - function hashChangeListener() { - var location = getLocation(getHistoryState()); - handlePopState(location); - } - var listenerCount = 0; - function setListener(count) { - listenerCount += count; - if (listenerCount === 1 && count === 1) { - window.addEventListener(EventType.PopState, popStateListener); - if (!isSupportPopState) { - window.addEventListener(EventType.HashChange, hashChangeListener); - } - } else if (listenerCount === 0) { - window.removeEventListener(EventType.PopState, popStateListener); - if (!isSupportPopState) { - window.removeEventListener(EventType.HashChange, hashChangeListener); - } - } - } - - // 取消页面跳转并恢复到跳转前的页面 - function revertPopState(form, to) { - var delta = recordOperator.getDelta(to, form); - if (delta !== 0) { - go(delta); - forceJump = true; - } - } - function createHref(path) { - return basename + createPath(path); - } - function push(to, state) { - var action = Action.push; - var location = createLocation(history.location, to, state, undefined); - transitionManager.confirmJumpTo(location, action, getUserConfirmation, function (isJump) { - if (!isJump) { - return; - } - var href = createHref(location); - var key = location.key, - state = location.state; - if (supportHistory) { - if (forceRefresh) { - window.location.href = href; - } else { - browserHistory.pushState({ - key: key, - state: state - }, '', href); - recordOperator.addRecord(history.location, location, action); - updateState({ - action: action, - location: location - }); - } - } else { - warning(state !== undefined, 'Browser history cannot push state in browsers that do not support HTML5 history'); - window.location.href = href; - } - }); - } - function replace(to, state) { - var action = Action.replace; - var location = createLocation(history.location, to, state, undefined); - transitionManager.confirmJumpTo(location, action, getUserConfirmation, function (isJump) { - if (!isJump) { - return; - } - var href = createHref(location); - var key = location.key, - state = location.state; - if (supportHistory) { - if (forceRefresh) { - window.location.replace(href); - } else { - browserHistory.replaceState({ - key: key, - state: state - }, '', href); - recordOperator.addRecord(history.location, location, action); - updateState({ - action: action, - location: location - }); - } - } else { - warning(state !== undefined, 'Browser history cannot push state in browsers that do not support HTML5 history'); - window.location.replace(href); - } - }); - } - return history; -} - -// 获取#前的内容 -function stripHash(path) { - var idx = path.indexOf('#'); - return idx === -1 ? path : path.substring(0, idx); -} - -// 获取#后的内容 -function getHashContent(path) { - var idx = path.indexOf('#'); - return idx === -1 ? '' : path.substring(idx + 1); -} -function createHashHistory() { - var option = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; - var browserHistory = window.history; - var _option$hashType = option.hashType, - hashType = _option$hashType === void 0 ? 'slash' : _option$hashType, - _option$getUserConfir = option.getUserConfirmation, - getUserConfirmation = _option$getUserConfir === void 0 ? getDefaultConfirmation : _option$getUserConfir; - var basename = option.basename ? normalizeSlash(option.basename) : ''; - var pathDecoder = addHeadSlash; - var pathEncoder = hashType === 'slash' ? addHeadSlash : stripHeadSlash; - function getLocation() { - var hashPath = pathDecoder(getHashContent(window.location.hash)); - if (basename) { - hashPath = stripBasename(hashPath, basename); - } - return createLocation('', hashPath, undefined, 'default'); - } - var initLocation = getLocation(); - var memRecords = createMemoryRecord(initLocation, createPath); - var transitionManager = new TransitionManager(); - function createHref(location) { - var tag = document.querySelector('base'); - var base = tag && tag.getAttribute('href') ? stripHash(window.location.href) : ''; - return base + '#' + pathEncoder(basename + createPath(location)); - } - var forceNextPop = false; - var ignorePath = null; - var _getBaseHistory = getBaseHistory(transitionManager, setListener, browserHistory), - go = _getBaseHistory.go, - goBack = _getBaseHistory.goBack, - goForward = _getBaseHistory.goForward, - listen = _getBaseHistory.listen, - block = _getBaseHistory.block, - getUpdateStateFunc = _getBaseHistory.getUpdateStateFunc; - var history = { - action: Action.pop, - length: browserHistory.length, - location: initLocation, - go: go, - goBack: goBack, - goForward: goForward, - push: push, - replace: replace, - listen: listen, - block: block, - createHref: createHref - }; - var updateState = getUpdateStateFunc(history); - function push(to, state) { - warning(state !== undefined, 'Hash history does not support state, it will be ignored'); - var action = Action.push; - var location = createLocation(history.location, to, undefined, ''); - transitionManager.confirmJumpTo(location, action, getUserConfirmation, function (isJump) { - if (!isJump) { - return; - } - var path = createPath(location); - var encodedPath = pathEncoder(basename + path); - // 前后hash不一样才进行跳转 - if (getHashContent(window.location.href) !== encodedPath) { - ignorePath = encodedPath; - window.location.hash = encodedPath; - memRecords.addRecord(history.location, location, action); - updateState({ - action: action, - location: location - }); - } else { - updateState(undefined); - } - }); - } - function replace(to, state) { - warning(state !== undefined, 'Hash history does not support state, it will be ignored'); - var action = Action.replace; - var location = createLocation(history.location, to, undefined, ''); - transitionManager.confirmJumpTo(location, action, getUserConfirmation, function (isJump) { - if (!isJump) { - return; - } - var path = createPath(location); - var encodedPath = pathEncoder(basename + path); - if (getHashContent(window.location.href) !== encodedPath) { - ignorePath = path; - window.location.replace(stripHash(window.location.href) + '#' + encodedPath); - } - memRecords.addRecord(history.location, location, action); - updateState({ - action: action, - location: location - }); - }); - } - function handleHashChange() { - var hashPath = getHashContent(window.location.href); - var encodedPath = pathEncoder(hashPath); - if (hashPath !== encodedPath) { - window.location.replace(stripHash(window.location.href) + '#' + encodedPath); - } else { - var location = getLocation(); - var prevLocation = history.location; - if (!forceNextPop && isLocationEqual(location, prevLocation)) { - return; - } - if (ignorePath === createPath(location)) { - return; - } - ignorePath = null; - handlePopState(location); - } - } - function handlePopState(location) { - if (forceNextPop) { - forceNextPop = false; - updateState(undefined); - } else { - var action = Action.pop; - var callback = function (isJump) { - if (isJump) { - updateState({ - action: action, - location: location - }); - } else { - revertPopState(location); - } - }; - transitionManager.confirmJumpTo(location, action, getUserConfirmation, callback); - } - } - - // 在跳转行为被Block后,用History.go()跳转回之前的页面 - function revertPopState(form) { - var to = history.location; - var delta = memRecords.getDelta(to, form); - if (delta !== 0) { - go(delta); - forceNextPop = true; - } - } - var listenerCount = 0; - function setListener(delta) { - listenerCount += delta; - if (listenerCount === 1 && delta === 1) { - window.addEventListener(EventType.HashChange, handleHashChange); - } else if (listenerCount === 0) { - window.removeEventListener(EventType.HashChange, handleHashChange); - } - } - return history; -} - -function createNamedContext(name, defaultValue) { - var context = createContext(defaultValue); - context.displayName = name; - return context; -} -var RouterContext = createNamedContext('Router', {}); - -var TokenType = /*#__PURE__*/function (TokenType) { - TokenType["Delimiter"] = "delimiter"; - TokenType["Static"] = "static"; - TokenType["Param"] = "param"; - TokenType["WildCard"] = "wildcard"; - TokenType["LBracket"] = "("; - TokenType["RBracket"] = ")"; - TokenType["Pattern"] = "pattern"; - return TokenType; -}({}); - -// 解析URL中的动态参数,以实现TypeScript提示功能 - -/** - * @description 将url中的//转换为/ - */ -function cleanPath(path) { - return path.replace(/\/+/g, '/'); -} -function scoreCompare(score1, score2) { - var score1Length = score1.length; - var score2Length = score2.length; - var end = Math.min(score1Length, score2Length); - for (var i = 0; i < end; i++) { - var delta = score2[i] - score1[i]; - if (delta !== 0) { - return delta; - } - } - if (score1Length === score2Length) { - return 0; - } - return score1Length > score2Length ? -1 : 1; -} - -// 把正则表达式的特殊符号加两个反斜杠进行转义 -function escapeStr(str) { - return str.replace(/([.+*?=^!:${}()[\]|/\\])/g, '\\$1'); -} - -var validChar = /[^/:*()]/; - -// 对Url模板进行词法解析,解析结果为Tokens -function lexer(path) { - var tokens = []; - if (!path) { - return tokens; - } - var urlPath = cleanPath(path); - if (urlPath !== '*' && !urlPath.startsWith('/')) { - throw new Error("Url must start with \"/\"."); - } - var getLiteral = function () { - var name = ''; - while (i < urlPath.length && validChar.test(urlPath[i])) { - name += urlPath[i]; - skipChar(1); - } - return name; - }; - var skipChar = function (step) { - i += step; - }; - var i = 0; - while (i < urlPath.length) { - var curChar = urlPath[i]; - var prevChar = urlPath[i - 1]; - if (curChar === '/') { - tokens.push({ - type: TokenType.Delimiter, - value: urlPath[i] - }); - skipChar(1); - continue; - } - // dynamic params (/:a) - if (prevChar === '/' && curChar === ':') { - skipChar(1); - tokens.push({ - type: TokenType.Param, - value: getLiteral() - }); - continue; - } - // wildCard params (/:*) - if ((prevChar === '/' || prevChar === undefined) && curChar === '*') { - tokens.push({ - type: TokenType.WildCard, - value: urlPath[i] - }); - skipChar(1); - continue; - } - // static params - if (prevChar === '/' && validChar.test(curChar)) { - tokens.push({ - type: TokenType.Static, - value: getLiteral() - }); - continue; - } - if (curChar === '(') { - tokens.push({ - type: TokenType.LBracket, - value: '(' - }); - skipChar(1); - continue; - } - if (curChar === ')') { - tokens.push({ - type: TokenType.RBracket, - value: ')' - }); - skipChar(1); - continue; - } - if (validChar.test(curChar)) { - tokens.push({ - type: TokenType.Pattern, - value: getLiteral() - }); - continue; - } - // 跳过非法字符 - skipChar(1); - } - return tokens; -} - -function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function () {}; return { s: F, n: function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function (e) { throw e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function () { it = it.call(o); }, n: function () { var step = it.next(); normalCompletion = step.done; return step; }, e: function (e) { didErr = true; err = e; }, f: function () { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; } -function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } -function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } - -// 不同类型参数的匹配得分 -var MatchScore = /*#__PURE__*/function (MatchScore) { - MatchScore[MatchScore["static"] = 10] = "static"; - MatchScore[MatchScore["param"] = 6] = "param"; - MatchScore[MatchScore["wildcard"] = 3] = "wildcard"; - MatchScore[MatchScore["placeholder"] = -1] = "placeholder"; - return MatchScore; -}(MatchScore || {}); // 兼容 react v5 matched类型 -var defaultOption = { - // url匹配时是否大小写敏感 - caseSensitive: true, - // 是否严格匹配url结尾的/ - strictMode: false, - // 是否完全精确匹配 - exact: false -}; -// 正则表达式中需要转义的字符 -var REGEX_CHARS_RE = /[.+*?^${}()[\]/\\]/g; -// 用于匹配两个//中的的值 -var BASE_PARAM_PATTERN = '[^/]+'; -var DefaultDelimiter = '/#?'; -function createPathParser(pathname) { - var option = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : defaultOption; - var _option$caseSensitive = option.caseSensitive, - caseSensitive = _option$caseSensitive === void 0 ? defaultOption.caseSensitive : _option$caseSensitive, - _option$strictMode = option.strictMode, - strictMode = _option$strictMode === void 0 ? defaultOption.strictMode : _option$strictMode, - _option$exact = option.exact, - exact = _option$exact === void 0 ? defaultOption.exact : _option$exact; - /** - * URL匹配整体流程 - * 1.词法解析,将URL模板解析为Token - * 2.使用Token生成正则表达式 - * 3.利用正则表达式解析URL中参数或填充URL模板 - */ - var pattern = '^'; - var keys = []; - var scores = []; - var tokens = lexer(pathname); - var onlyHasWildCard = tokens.length === 1 && tokens[0].type === TokenType.WildCard; - var tokenCount = tokens.length; - var lastToken = tokens[tokenCount - 1]; - for (var tokenIdx = 0; tokenIdx < tokenCount; tokenIdx++) { - var token = tokens[tokenIdx]; - var nextToken = tokens[tokenIdx + 1]; - switch (token.type) { - case TokenType.Delimiter: - pattern += '/'; - break; - case TokenType.Static: - pattern += token.value.replace(REGEX_CHARS_RE, '\\$&'); - scores.push(MatchScore.static); - break; - case TokenType.Param: - var paramRegexp = ''; - if (nextToken && nextToken.type === TokenType.LBracket) { - // 跳过当前Token和左括号 - tokenIdx += 2; - while (tokens[tokenIdx].type !== TokenType.RBracket) { - paramRegexp += tokens[tokenIdx].value; - tokenIdx++; - } - } - pattern += paramRegexp ? "((?:" + paramRegexp + "))" : "(" + BASE_PARAM_PATTERN + ")"; - keys.push(token.value); - scores.push(MatchScore.param); - break; - case TokenType.WildCard: - keys.push(token.value); - pattern += "((?:" + BASE_PARAM_PATTERN + ")" + (onlyHasWildCard ? '?' : '') + "(?:/(?:" + BASE_PARAM_PATTERN + "))*)"; - scores.push(onlyHasWildCard ? MatchScore.wildcard : MatchScore.placeholder); - break; - } - } - var isWildCard = lastToken.type === TokenType.WildCard; - if (!isWildCard && !exact) { - if (!strictMode) { - pattern += "(?:[" + escapeStr(DefaultDelimiter) + "](?=$))?"; - } - if (lastToken.type !== TokenType.Delimiter) { - pattern += "(?=[" + escapeStr(DefaultDelimiter) + "]|$)"; - } - } else { - pattern += strictMode ? '$' : "[" + escapeStr(DefaultDelimiter) + "]?$"; - } - var flag = caseSensitive ? '' : 'i'; - var regexp = new RegExp(pattern, flag); - - /** - * @description 根据给定Pattern解析path - */ - function parse(path) { - var reMatch = path.match(regexp); - if (!reMatch) { - return null; - } - var matchedPath = reMatch[0]; - var params = {}; - var parseScore = Array.from(scores); - for (var i = 1; i < reMatch.length; i++) { - var param = reMatch[i]; - var key = keys[i - 1]; - if (key === '*' && param) { - var value = param.split('/'); - if (!Array.isArray(params['*'])) { - params['*'] = value; - } else { - var _params$; - (_params$ = params['*']).push.apply(_params$, value); - } - // 完成通配符参数解析后将placeholder替换为wildcard参数的分值 - parseScore.splice.apply(parseScore, [scores.indexOf(MatchScore.placeholder), 1].concat(new Array(value.length).fill(MatchScore.wildcard))); - } else { - params[key] = param ? param : []; - } - } - var isExact = path === matchedPath; - var url = path === '/' && matchedPath === '' ? '/' : matchedPath; - return { - isExact: isExact, - path: pathname, - url: url, - score: parseScore, - params: params - }; - } - - /** - * @description 使用给定参数填充pattern,得到目标URL - */ - function compile(params) { - var path = ''; - var _iterator = _createForOfIteratorHelper(tokens), - _step; - try { - for (_iterator.s(); !(_step = _iterator.n()).done;) { - var _token = _step.value; - switch (_token.type) { - case TokenType.Static: - path += _token.value; - break; - case TokenType.Param: - if (!params[_token.value]) { - throw new Error('Param is invalid.'); - } - path += params[_token.value]; - break; - case TokenType.WildCard: - var wildCard = params['*']; - if (wildCard instanceof Array) { - path += wildCard.join('/'); - } else { - path += wildCard; - } - break; - case TokenType.Delimiter: - path += _token.value; - break; - } - } - } catch (err) { - _iterator.e(err); - } finally { - _iterator.f(); - } - return path; - } - return { - get regexp() { - return regexp; - }, - get keys() { - return keys; - }, - compile: compile, - parse: parse - }; -} - -/** - * @description 依次使用pathname与pattern进行匹配,根据匹配分数取得分数最高结果 - */ -function matchPath(pathname, pattern, option) { - var patterns = Array.isArray(pattern) ? [].concat(pattern) : [pattern]; - var matchedResults = []; - var _iterator2 = _createForOfIteratorHelper(patterns), - _step2; - try { - for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) { - var item = _step2.value; - var parser = createPathParser(item, option); - var matched = parser.parse(pathname); - if (matched) { - matchedResults.push(matched); - } - } - } catch (err) { - _iterator2.e(err); - } finally { - _iterator2.f(); - } - return !matchedResults.length ? null : matchedResults.sort(function (a, b) { - return scoreCompare(a.score, b.score); - })[0]; -} -function generatePath(path, params) { - var parser = createPathParser(path); - return parser.compile(params); -} - -function useHistory() { - return useContext(RouterContext).history; -} -function useLocation() { - return useContext(RouterContext).location; -} -function useParams() { - var match = useContext(RouterContext).match; - return match ? match.params : {}; -} -function useRouteMatch(path) { - var pathname = useLocation().pathname; - var match = useContext(RouterContext).match; - if (path) { - return matchPath(pathname, path); - } - return match; -} - -function Route(props) { - var context = useContext(RouterContext); - var computed = props.computed, - location = props.location, - path = props.path; - var children = props.children, - component = props.component, - render = props.render; - var match; - var routeLocation = location || context.location; - if (computed) { - match = computed; - } else if (path) { - match = matchPath(routeLocation.pathname, path); - } else { - match = context.match; - } - var newProps = _extends({}, context, { - location: routeLocation, - match: match - }); - if (Array.isArray(children) && Children.count(children) === 0) { - children = null; - } - - /** - * 按顺序获取需要渲染的组件 - * 1.children - * 2.component - * 3.render - * 都没有匹配到返回Null - */ - var getChildren = function () { - // 如果 match 存在 - if (newProps.match) { - if (children) { - if (typeof children === 'function') { - return children(newProps); - } - return children; - } - if (component) { - return createElement(component, newProps); - } else if (render) { - return render(newProps); - } else { - return null; - } - } else { - // match为null - if (typeof children === 'function') { - return children(newProps); - } - return null; - } - }; - return /*#__PURE__*/React.createElement(RouterContext.Provider, { - value: newProps - }, getChildren()); -} - -function Router(props) { - var history = props.history, - _props$children = props.children, - children = _props$children === void 0 ? null : _props$children; - var _useState = useState(props.history.location), - location = _useState[0], - setLocation = _useState[1]; - var pendingLocation = useRef(null); - - // 在Router加载时就监听history地址变化,以保证在始渲染时重定向能正确触发 - var unListen = history.listen(function (arg) { - pendingLocation.current = arg.location; - }); - - // 模拟componentDidMount和componentWillUnmount - useLayoutEffect(function () { - if (unListen) { - unListen(); - } - // 监听history中的位置变化 - unListen = history.listen(function (arg) { - setLocation(arg.location); - }); - if (pendingLocation.current) { - setLocation(pendingLocation.current); - } - return function () { - if (unListen) { - unListen(); - unListen = null; - pendingLocation.current = null; - } - }; - }, []); - var initContextValue = useMemo(function () { - return { - history: history, - location: location, - match: { - isExact: location.pathname === '/', - params: {}, - path: '/', - score: [], - url: '/' - } - }; - }, [location]); - return /*#__PURE__*/React.createElement(RouterContext.Provider, { - value: initContextValue, - children: children - }); -} - -function _objectWithoutPropertiesLoose(source, excluded) { - if (source == null) return {}; - var target = {}; - var sourceKeys = Object.keys(source); - var key, i; - for (i = 0; i < sourceKeys.length; i++) { - key = sourceKeys[i]; - if (excluded.indexOf(key) >= 0) continue; - target[key] = source[key]; - } - return target; -} - -function LifeCycle(props) { - // 使用ref保存上一次的props,防止重新渲染 - var prevProps = useRef(null); - var isMount = useRef(false); - var onMount = props.onMount, - onUpdate = props.onUpdate, - onUnmount = props.onUnmount; - useLayoutEffect(function () { - // 首次挂载 模拟componentDidMount - if (!isMount.current) { - isMount.current = true; - if (onMount) { - onMount(); - } - } else { - // 不是首次渲染 模拟componentDidUpdate - if (onUpdate) { - prevProps.current ? onUpdate(prevProps.current) : onUpdate(); - } - } - prevProps.current = props; - }); - - // 模拟componentWillUnmount - useLayoutEffect(function () { - return function () { - if (onUnmount) { - onUnmount(); - } - }; - }, []); - return null; -} - -var _excluded$2 = ["state"]; -function Redirect(props) { - var to = props.to, - _props$push = props.push, - push = _props$push === void 0 ? false : _props$push, - computed = props.computed; - var context = useContext(RouterContext); - var history = context.history; - var calcLocation = function () { - if (computed) { - if (typeof to === 'string') { - var parser = createPathParser(to); - var target = parser.compile(computed.params); - return parsePath(target); - } else { - var pathname = to.pathname ? addHeadSlash(to.pathname) : '/'; - var _parser = createPathParser(pathname); - var _target = _parser.compile(computed.params); - return _extends({}, to, { - pathname: _target - }); - } - } - return typeof to === 'string' ? parsePath(to) : to; - }; - var navigate = push ? history.push : history.replace; - var _calcLocation = calcLocation(), - state = _calcLocation.state, - path = _objectWithoutPropertiesLoose(_calcLocation, _excluded$2); - var onMountFunc = function () { - navigate(path, state); - }; - var onUpdateFunc = function (prevProps) { - // 如果当前页面与重定向前页面不一致,执行跳转 - var prevPath = prevProps === null || prevProps === void 0 ? void 0 : prevProps.data; - if (!isLocationEqual(prevPath, path)) { - navigate(path, state); - } - }; - return /*#__PURE__*/React.createElement(LifeCycle, { - onMount: onMountFunc, - onUpdate: onUpdateFunc, - data: path - }); -} - -function Switch(props) { - var context = useContext(RouterContext); - var location = props.location || context.location; - var element = null; - var match = null; - - // 使用forEach不会给React.ReactNode增加key属性,防止重新渲染 - Children.forEach(props.children, function (node) { - if (match === null && isValidElement(node)) { - element = node; - var strict; - var sensitive; - var path; - var from; - - // node可能是Route和Redirect - if (node.type === Route) { - var _props = node.props; - strict = _props.strict; - sensitive = _props.sensitive; - path = _props.path; - } else if (node.type === Redirect) { - var _props2 = node.props; - path = _props2.path; - strict = _props2.strict; - from = _props2.from; - } - var exact = node.props.exact; - var target = path || from; - - // 更新匹配状态,一旦匹配到停止遍历 - if (target) { - match = matchPath(location.pathname, target, { - strictMode: strict, - caseSensitive: sensitive, - exact: exact - }); - } else { - match = context.match; - } - } - }); - if (match && element) { - // 使用cloneElement复制已有组件并更新其Props - return cloneElement(element, { - location: location, - computed: match - }); - } - return null; -} - -function Prompt(props) { - var context = useContext(RouterContext); - var message = props.message, - _props$when = props.when, - when = _props$when === void 0 ? true : _props$when; - if (typeof when === 'function' && when(context.location) === false || !when) { - return null; - } - var navigate = context.history.block; - var release = null; - var onMountFunc = function () { - release = message ? navigate(message) : null; - }; - var onUpdateFunc = function (prevProps) { - if (prevProps && prevProps.data !== message) { - if (release) { - release(); - } - release = message ? navigate(message) : null; - } - }; - var onUnmountFunc = function () { - if (release) { - release(); - } - release = null; - }; - return /*#__PURE__*/React.createElement(LifeCycle, { - onMount: onMountFunc, - onUpdate: onUpdateFunc, - onUnmount: onUnmountFunc, - data: message - }); -} - -function withRouter(Component) { - function ComponentWithRouterProp(props) { - var _useContext = useContext(RouterContext), - history = _useContext.history, - location = _useContext.location, - match = _useContext.match; - var routeProps = { - history: history, - location: location, - match: match - }; - return /*#__PURE__*/React.createElement(Component, _extends({}, props, routeProps)); - } - return ComponentWithRouterProp; -} - -function HashRouter(props) { - var historyRef = useRef(); - if (historyRef.current === null || historyRef.current === undefined) { - historyRef.current = createHashHistory({ - basename: props.basename, - getUserConfirmation: props.getUserConfirmation, - hashType: props.hashType - }); - } - return /*#__PURE__*/React.createElement(Router, { - history: historyRef.current - }, props.children); -} - -function BrowserRouter(props) { - // 使用Ref持有History对象,防止重复渲染 - var historyRef = useRef(); - if (historyRef.current === null || historyRef.current === undefined) { - historyRef.current = createBrowserHistory({ - basename: props.basename, - forceRefresh: props.forceRefresh, - getUserConfirmation: props.getUserConfirmation - }); - } - return /*#__PURE__*/React.createElement(Router, { - history: historyRef.current - }, props.children); -} - -var _excluded$1 = ["to", "replace", "component", "onClick", "target"]; -var isModifiedEvent = function (event) { - return event.metaKey || event.altKey || event.ctrlKey || event.shiftKey; -}; -var checkTarget = function (target) { - return !target || target === '_self'; -}; -function Link(props) { - var to = props.to, - replace = props.replace; - props.component; - var onClick = props.onClick, - target = props.target, - other = _objectWithoutPropertiesLoose(props, _excluded$1); - var tag = props.tag || 'a'; - var context = useContext(RouterContext); - var history = context.history; - var location = typeof to === 'function' ? to(context.location) : to; - var state; - var path; - if (typeof location === 'string') { - path = parsePath(location); - } else { - var pathname = location.pathname, - hash = location.hash, - search = location.search; - path = { - pathname: pathname, - hash: hash, - search: search - }; - state = location.state; - } - var href = history.createHref(path); - var linkClickEvent = function (event) { - try { - if (onClick) { - onClick(event); - } - } catch (e) { - event.preventDefault(); - throw e; - } - if (!event.defaultPrevented && event.button === 0 && checkTarget(target) && !isModifiedEvent(event)) { - // 不是相同的路径执行push操作,是相同的路径执行replace - var isSamePath = createPath(context.location) === createPath(path); - var navigate = replace || isSamePath ? history.replace : history.push; - event.preventDefault(); - navigate(path, state); - } - }; - var linkProps = _extends({ - href: href, - onClick: linkClickEvent - }, other); - return React.createElement(tag, linkProps); -} - -var _excluded = ["to", "isActive"]; -function NavLink(props) { - var to = props.to, - isActive = props.isActive, - rest = _objectWithoutPropertiesLoose(props, _excluded); - var context = useContext(RouterContext); - var toLocation = typeof to === 'function' ? to(context.location) : to; - var _ref = typeof toLocation === 'string' ? parsePath(toLocation) : toLocation, - path = _ref.pathname; - // 把正则表达式的特殊符号加两个反斜杠进行转义 - var escapedPath = path ? escapeStr(path) : ''; - var match = escapedPath ? matchPath(context.location.pathname, escapedPath) : null; - var isLinkActive = match && isActive ? isActive(match, context.location) : false; - var page = 'page'; - var otherProps = _extends({ - 'aria-current': isLinkActive ? page : false - }, rest); - return /*#__PURE__*/React.createElement(Link, _extends({ - to: to - }, otherProps)); -} - -// 获取redux state中的值 -function getIn(state, path) { - if (!state) { - return state; - } - var length = path.length; - if (!length) { - return undefined; - } - var res = state; - for (var i = 0; i < length && !!res; ++i) { - res = res[path[i]]; - } - return res; -} - -// 从store的state中获取Router、Location、Action、Hash等信息 -var stateReader = function (storeType) { - var isRouter = function (value) { - return value !== null && typeof value === 'object' && !!getIn(value, ['location']) && !!getIn(value, ['action']); - }; - var getRouter = function (state) { - var router = getIn(state, ['router']); - if (!isRouter(router)) { - throw new Error("Could not find router reducer in " + storeType + " store, it must be mounted under \"router\""); - } - return router; - }; - var getLocation = function (state) { - return getIn(getRouter(state), ['location']); - }; - var getAction = function (state) { - return getIn(getRouter(state), ['action']); - }; - var getSearch = function (state) { - return getIn(getRouter(state), ['location', 'search']); - }; - var getHash = function (state) { - return getIn(getRouter(state), ['location', 'hash']); - }; - return { - getHash: getHash, - getAction: getAction, - getSearch: getSearch, - getRouter: getRouter, - getLocation: getLocation - }; -}; - -var hConnect = reduxAdapter.connect; -function ConnectedRouterWithoutMemo(props) { - var store = props.store, - history = props.history, - onLocationChanged = props.onLocationChanged, - omitRouter = props.omitRouter, - children = props.children, - storeType = props.storeType; - var _stateReader = stateReader(storeType), - getLocation = _stateReader.getLocation; - - // 监听store变化 - var unsubscribe = store.subscribe(function () { - // 获取redux State中的location信息 - var _getLocation = getLocation(store.getState()), - pathnameInStore = _getLocation.pathname, - searchInStore = _getLocation.search, - hashInStore = _getLocation.hash, - stateInStore = _getLocation.state; - - // 获取当前history对象中的location信息 - var _history$location = history.location, - pathnameInHistory = _history$location.pathname, - searchInHistory = _history$location.search, - hashInHistory = _history$location.hash, - stateInHistory = _history$location.state; - - // 两个location不一致 执行跳转 - if (history.action === 'PUSH' && (pathnameInHistory !== pathnameInStore || searchInHistory !== searchInStore || hashInHistory !== hashInStore || stateInHistory !== stateInStore)) { - history.push({ - pathname: pathnameInStore, - search: searchInStore, - hash: hashInStore - }, stateInStore); - } - }); - var handleLocationChange = function (args) { - var isFirstRendering = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; - var location = args.location, - action = args.action; - onLocationChanged(location, action, isFirstRendering); - }; - - // 监听history更新 - var unListen = function () { - return history.listen(handleLocationChange); - }; - useLayoutEffect(function () { - return function () { - unListen(); - unsubscribe(); - }; - }, []); - if (!props.noInitialPop) { - // 传递初始时位置信息,isFirstRendering设为true防止重复渲染 - handleLocationChange({ - location: history.location, - action: history.action - }, true); - } - if (omitRouter) { - return /*#__PURE__*/React.createElement(React.Fragment, null, children); - } - var childrenNode; - if (typeof children === 'function') { - childrenNode = children(); - } else { - childrenNode = children; - } - return /*#__PURE__*/React.createElement(Router, { - history: history - }, childrenNode); -} -function getConnectedRouter(type) { - var mapDispatchToProps = function (dispatch) { - return { - onLocationChanged: function (location, action, isFirstRendering) { - return dispatch(onLocationChanged(location, action, isFirstRendering)); - } - }; - }; - var ConnectedRouter = React.memo(ConnectedRouterWithoutMemo); - var ConnectedRouterWithContext = function (props) { - var Context = props.context || ReactReduxContext; - return /*#__PURE__*/React.createElement(Context.Consumer, null, function (_ref) { - var store = _ref.store; - return /*#__PURE__*/React.createElement(ConnectedRouter, _extends({ - store: store, - storeType: type - }, props)); - }); - }; - - // 针对不同的Store类型,使用对应的connect函数 - if (type === 'HorizonXCompat') { - return hConnect(null, mapDispatchToProps)(ConnectedRouterWithContext); - } - if (type === 'Redux') { - return connect(null, mapDispatchToProps)(ConnectedRouterWithContext); - } else { - throw new Error('Invalid store type'); - } -} - -// 定义connect-router对应的redux dispatch函数 -function routerMiddleware(history) { - return function (_) { - return function (next) { - return function (action) { - if (action.type !== ActionName.CALL_HISTORY_METHOD) { - return next(action); - } - var _action$payload = action.payload, - method = _action$payload.method, - args = _action$payload.args; - if (method in history) { - var _ref; - (_ref = history)[method].apply(_ref, args); - } - }; - }; - }; -} - -var connectRouter = createConnectRouter(); - -var ConnectedRouter = getConnectedRouter('Redux'); -var ConnectedHRouter = getConnectedRouter('HorizonXCompat'); - -export { BrowserRouter, ConnectedHRouter, ConnectedRouter, HashRouter, Link, NavLink, Prompt, Redirect, Route, Router, Switch, RouterContext as __RouterContext, connectRouter, createBrowserHistory, createHashHistory, generatePath, matchPath, routerMiddleware, useHistory, useLocation, useParams, useRouteMatch, withRouter }; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29ubmVjdFJvdXRlci5qcyIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHMuanMiLCIuLi8uLi9zcmMvY29ubmVjdC1yb3V0ZXIvYWN0aW9ucy50cyIsIi4uLy4uL3NyYy9jb25uZWN0LXJvdXRlci9yZWR1Y2VyLnRzIiwiLi4vLi4vc3JjL2hpc3RvcnkvZG9tLnRzIiwiLi4vLi4vc3JjL2hpc3RvcnkvdHlwZXMudHMiLCIuLi8uLi9zcmMvaGlzdG9yeS91dGlscy50cyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jbGFzc0NhbGxDaGVjay5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90eXBlb2YuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdG9QcmltaXRpdmUuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdG9Qcm9wZXJ0eUtleS5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jcmVhdGVDbGFzcy5qcyIsIi4uLy4uL3NyYy9oaXN0b3J5L3RyYW5zaXRpb25NYW5hZ2VyLnRzIiwiLi4vLi4vc3JjL2hpc3Rvcnkvd2FyaW5nLnRzIiwiLi4vLi4vc3JjL2hpc3RvcnkvYmFzZUhpc3RvcnkudHMiLCIuLi8uLi9zcmMvaGlzdG9yeS9icm93ZXJIaXN0b3J5LnRzIiwiLi4vLi4vc3JjL2hpc3RvcnkvaGFzaEhpc3RvcnkudHMiLCIuLi8uLi9zcmMvcm91dGVyL2NvbnRleHQudHN4IiwiLi4vLi4vc3JjL3JvdXRlci9tYXRjaGVyL3R5cGVzLnRzIiwiLi4vLi4vc3JjL3JvdXRlci9tYXRjaGVyL3V0aWxzLnRzIiwiLi4vLi4vc3JjL3JvdXRlci9tYXRjaGVyL2xleGVyLnRzIiwiLi4vLi4vc3JjL3JvdXRlci9tYXRjaGVyL3BhcnNlci50cyIsIi4uLy4uL3NyYy9yb3V0ZXIvaG9va3MudHMiLCIuLi8uLi9zcmMvcm91dGVyL1JvdXRlLnRzeCIsIi4uLy4uL3NyYy9yb3V0ZXIvUm91dGVyLnRzeCIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlLmpzIiwiLi4vLi4vc3JjL3JvdXRlci9saWZlQ3ljbGVIb29rLnRzIiwiLi4vLi4vc3JjL3JvdXRlci9SZWRpcmVjdC50c3giLCIuLi8uLi9zcmMvcm91dGVyL1N3aXRjaC50c3giLCIuLi8uLi9zcmMvcm91dGVyL1Byb21wdC50c3giLCIuLi8uLi9zcmMvcm91dGVyL3dpdGhSb3V0ZXIudHN4IiwiLi4vLi4vc3JjL3JvdXRlci9IYXNoUm91dGVyLnRzeCIsIi4uLy4uL3NyYy9yb3V0ZXIvQnJvd3NlclJvdXRlci50c3giLCIuLi8uLi9zcmMvcm91dGVyL0xpbmsudHN4IiwiLi4vLi4vc3JjL3JvdXRlci9OYXZMaW5rLnRzeCIsIi4uLy4uL3NyYy9jb25uZWN0LXJvdXRlci9yZWR1eFV0aWxzLnRzIiwiLi4vLi4vc3JjL2Nvbm5lY3Qtcm91dGVyL2Nvbm5lY3RlZFJvdXRlci50c3giLCIuLi8uLi9zcmMvY29ubmVjdC1yb3V0ZXIvZGlzcGF0Y2gudHMiLCIuLi8uLi9zcmMvY29ubmVjdC1yb3V0ZXIvaW5kZXgudHMiLCIuLi8uLi9zcmMvcm91dGVyL2luZGV4Mi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfZXh0ZW5kcygpIHtcbiAgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduID8gT2JqZWN0LmFzc2lnbi5iaW5kKCkgOiBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07XG4gICAgICBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7XG4gICAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9O1xuICByZXR1cm4gX2V4dGVuZHMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn0iLCJpbXBvcnQgeyBBY3Rpb24sIFBhdGggfSBmcm9tICcuLi9oaXN0b3J5L3R5cGVzJztcclxuXHJcbnR5cGUgTG9jYXRpb24gPSBQYXJ0aWFsPFBhdGg+XHJcblxyXG4vLyDlrprkuYnkvY3nva7lj5jljJblkoxoaXN0b3J55pa55rOV6LCD55So55qEQWN0aW9uIHR5cGVcclxuZXhwb3J0IGVudW0gQWN0aW9uTmFtZSB7XHJcbiAgTE9DQVRJT05fQ0hBTkdFID0gJyRob3Jpem9uLXJvdXRlci9MT0NBVElPTl9DSEFOR0UnLFxyXG4gIENBTExfSElTVE9SWV9NRVRIT0QgPSAnJGhvcml6b24tcm91dGVyL0NBTExfSElTVE9SWV9NRVRIT0QnXHJcbn1cclxuXHJcbi8vIOWumuS5iUFjdGlvbueahOS4pOenjeaVsOaNruexu+Wei1xyXG5leHBvcnQgdHlwZSBBY3Rpb25NZXNzYWdlID0ge1xyXG4gIHR5cGU6IEFjdGlvbk5hbWUuTE9DQVRJT05fQ0hBTkdFXHJcbiAgcGF5bG9hZDoge1xyXG4gICAgbG9jYXRpb246IExvY2F0aW9uLFxyXG4gICAgYWN0aW9uOiBBY3Rpb25cclxuICAgIGlzRmlyc3RSZW5kZXJpbmc6IGJvb2xlYW5cclxuICB9XHJcbn0gfCB7XHJcbiAgdHlwZTogQWN0aW9uTmFtZS5DQUxMX0hJU1RPUllfTUVUSE9EXHJcbiAgcGF5bG9hZDoge1xyXG4gICAgbWV0aG9kOiBzdHJpbmcsXHJcbiAgICBhcmdzOiBhbnlcclxuICB9XHJcbn1cclxuXHJcblxyXG5leHBvcnQgY29uc3Qgb25Mb2NhdGlvbkNoYW5nZWQgPSAobG9jYXRpb246IExvY2F0aW9uLCBhY3Rpb246IEFjdGlvbiwgaXNGaXJzdFJlbmRlcmluZyA9IGZhbHNlKTogQWN0aW9uTWVzc2FnZSA9PiB7XHJcbiAgcmV0dXJuIHtcclxuICAgIHR5cGU6IEFjdGlvbk5hbWUuTE9DQVRJT05fQ0hBTkdFLFxyXG4gICAgcGF5bG9hZDoge1xyXG4gICAgICBsb2NhdGlvbixcclxuICAgICAgYWN0aW9uLFxyXG4gICAgICBpc0ZpcnN0UmVuZGVyaW5nLFxyXG4gICAgfSxcclxuICB9O1xyXG59O1xyXG5cclxuY29uc3QgdXBkYXRlTG9jYXRpb24gPSAobWV0aG9kOiBzdHJpbmcpOiAoLi4uYXJnczogYW55KSA9PiBBY3Rpb25NZXNzYWdlID0+IHtcclxuICByZXR1cm4gKC4uLmFyZ3M6IGFueSkgPT4gKHtcclxuICAgIHR5cGU6IEFjdGlvbk5hbWUuQ0FMTF9ISVNUT1JZX01FVEhPRCxcclxuICAgIHBheWxvYWQ6IHtcclxuICAgICAgbWV0aG9kLFxyXG4gICAgICBhcmdzLFxyXG4gICAgfSxcclxuICB9KTtcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBwdXNoID0gdXBkYXRlTG9jYXRpb24oJ3B1c2gnKTtcclxuZXhwb3J0IGNvbnN0IHJlcGxhY2UgPSB1cGRhdGVMb2NhdGlvbigncmVwbGFjZScpO1xyXG5leHBvcnQgY29uc3QgZ28gPSB1cGRhdGVMb2NhdGlvbignZ28nKTsiLCJpbXBvcnQgeyBBY3Rpb25OYW1lIH0gZnJvbSAnLi9hY3Rpb25zJztcclxuaW1wb3J0IHsgQWN0aW9uLCBIaXN0b3J5IH0gZnJvbSAnLi4vaGlzdG9yeS90eXBlcyc7XHJcbmltcG9ydCB7IExvY2F0aW9uIH0gZnJvbSAnLi4vcm91dGVyJztcclxuXHJcbnR5cGUgTG9jYXRpb25XaXRoUXVlcnkgPSBQYXJ0aWFsPExvY2F0aW9uPiAmIHsgcXVlcnk/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+IH07XHJcblxyXG4vLyDop6PmnpBsb2NhdGlvbuWvueixoe+8jOWwhuWFtuS4reeahHF1ZXJ55Y+C5pWw6Kej5p6Q5bm25rOo5YWlXHJcbmZ1bmN0aW9uIGluamVjdFF1ZXJ5UGFyYW1zKGxvY2F0aW9uPzogTG9jYXRpb25XaXRoUXVlcnkpOiBMb2NhdGlvbldpdGhRdWVyeSB7XHJcbiAgaWYgKGxvY2F0aW9uICYmIGxvY2F0aW9uLnF1ZXJ5KSB7XHJcbiAgICByZXR1cm4gbG9jYXRpb247XHJcbiAgfVxyXG5cclxuICBjb25zdCBxdWVyeVN0cmluZyA9IGxvY2F0aW9uICYmIGxvY2F0aW9uLnNlYXJjaDtcclxuXHJcbiAgaWYgKCFxdWVyeVN0cmluZykge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgLi4ubG9jYXRpb24sXHJcbiAgICAgIHF1ZXJ5OiB7fSxcclxuICAgIH07XHJcbiAgfVxyXG4gIGNvbnN0IHF1ZXJ5T2JqZWN0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XHJcblxyXG4gIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMocXVlcnlTdHJpbmcpO1xyXG4gIHBhcmFtcy5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiAocXVlcnlPYmplY3Rba2V5XSA9IHZhbHVlKSk7XHJcblxyXG4gIHJldHVybiB7XHJcbiAgICAuLi5sb2NhdGlvbixcclxuICAgIHF1ZXJ5OiBxdWVyeU9iamVjdCxcclxuICB9O1xyXG59XHJcblxyXG50eXBlIEluaXRSb3V0ZXJTdGF0ZSA9IHtcclxuICBsb2NhdGlvbjogTG9jYXRpb25XaXRoUXVlcnk7XHJcbiAgYWN0aW9uOiBBY3Rpb247XHJcbn07XHJcblxyXG50eXBlIFBheWxvYWQgPSB7XHJcbiAgdHlwZT86IEFjdGlvbk5hbWU7XHJcbiAgcGF5bG9hZD86IGFueTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDb25uZWN0Um91dGVyKCkge1xyXG4gIC8vIOWIneWni+WMlnJlZHV4IFN0YXRlXHJcbiAgcmV0dXJuIChoaXN0b3J5OiBIaXN0b3J5KSA9PiB7XHJcbiAgICBjb25zdCBpbml0Um91dGVyU3RhdGUgPSB7XHJcbiAgICAgIGxvY2F0aW9uOiBpbmplY3RRdWVyeVBhcmFtcyhoaXN0b3J5LmxvY2F0aW9uKSxcclxuICAgICAgYWN0aW9uOiBoaXN0b3J5LmFjdGlvbixcclxuICAgIH07XHJcblxyXG4gICAgLy8g5a6a5LmJY29ubmVjdC1yb3V0ZXLlr7nlupTnmoRyZWR1eCByZWR1Y2Vy5Ye95pWwXHJcbiAgICByZXR1cm4gKHN0YXRlOiBJbml0Um91dGVyU3RhdGUgPSBpbml0Um91dGVyU3RhdGUsIHsgdHlwZSwgcGF5bG9hZCB9OiBQYXlsb2FkID0ge30pOiBhbnkgPT4ge1xyXG4gICAgICBpZiAodHlwZSA9PT0gQWN0aW9uTmFtZS5MT0NBVElPTl9DSEFOR0UpIHtcclxuICAgICAgICBjb25zdCB7IGxvY2F0aW9uLCBhY3Rpb24sIGlzRmlyc3RSZW5kZXJpbmcgfSA9IHBheWxvYWQ7XHJcbiAgICAgICAgaWYgKGlzRmlyc3RSZW5kZXJpbmcpIHtcclxuICAgICAgICAgIHJldHVybiBzdGF0ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgLi4uc3RhdGUsIGxvY2F0aW9uOiBpbmplY3RRdWVyeVBhcmFtcyhsb2NhdGlvbiksIGFjdGlvbjogYWN0aW9uIH07XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHN0YXRlO1xyXG4gICAgfTtcclxuICB9O1xyXG59XHJcbiIsImV4cG9ydCBmdW5jdGlvbiBpc0Jyb3dzZXIoKTogYm9vbGVhbiB7XHJcbiAgcmV0dXJuIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5kb2N1bWVudCAmJiB0eXBlb2Ygd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgPT09ICdmdW5jdGlvbic7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXREZWZhdWx0Q29uZmlybWF0aW9uKG1lc3NhZ2U6IHN0cmluZywgY2FsbEJhY2s6IChyZXN1bHQ6IGJvb2xlYW4pID0+IHZvaWQpIHtcclxuICBjYWxsQmFjayh3aW5kb3cuY29uZmlybShtZXNzYWdlKSk7XHJcbn1cclxuXHJcbi8vIOWIpOaWrea1j+iniOWZqOaYr+WQpuaUr+aMgXB1c2hTdGF0ZeaWueazle+8jHB1c2hTdGF0ZeaYr2Jyb3dzZXJIaXN0b3J55a6e546w55qE5Z+656GAXHJcbmV4cG9ydCBmdW5jdGlvbiBpc1N1cHBvcnRIaXN0b3J5KCk6IGJvb2xlYW4ge1xyXG4gIHJldHVybiBpc0Jyb3dzZXIoKSAmJiB3aW5kb3cuaGlzdG9yeSAmJiAncHVzaFN0YXRlJyBpbiB3aW5kb3cuaGlzdG9yeTtcclxufVxyXG5cclxuLy8g5Yik5pat5rWP6KeI5Zmo5piv5ZCm5pSv5oyBUG9wU3RhdGXkuovku7ZcclxuZXhwb3J0IGZ1bmN0aW9uIGlzU3VwcG9ydHNQb3BTdGF0ZSgpOiBib29sZWFuIHtcclxuICByZXR1cm4gd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignVHJpZGVudCcpID09PSAtMTtcclxufVxyXG4iLCJleHBvcnQgdHlwZSBCYXNlT3B0aW9uID0ge1xyXG4gIGJhc2VuYW1lPzogc3RyaW5nO1xyXG4gIGdldFVzZXJDb25maXJtYXRpb24/OiBDb25maXJtYXRpb25GdW5jO1xyXG59O1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBIaXN0b3J5UHJvcHM8VCA9IHVua25vd24+IHtcclxuICByZWFkb25seSBhY3Rpb246IEFjdGlvbjtcclxuXHJcbiAgcmVhZG9ubHkgbG9jYXRpb246IExvY2F0aW9uPFQ+O1xyXG5cclxuICBsZW5ndGg6IG51bWJlcjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBIaXN0b3J5PFQgPSB1bmtub3duPiBleHRlbmRzIEhpc3RvcnlQcm9wczxUPiB7XHJcbiAgY3JlYXRlSHJlZihwYXRoOiBQYXJ0aWFsPFBhdGg+KTogc3RyaW5nO1xyXG5cclxuICBwdXNoKHRvOiBUbywgc3RhdGU/OiBUKTogdm9pZDtcclxuXHJcbiAgcmVwbGFjZSh0bzogVG8sIHN0YXRlPzogVCk6IHZvaWQ7XHJcblxyXG4gIGxpc3RlbihsaXN0ZW5lcjogTGlzdGVuZXI8VD4pOiAoKSA9PiB2b2lkO1xyXG5cclxuICBibG9jayhwcm9tcHQ6IFByb21wdDxUPik6ICgpID0+IHZvaWQ7XHJcblxyXG4gIGdvKGluZGV4OiBudW1iZXIpOiB2b2lkO1xyXG5cclxuICBnb0JhY2soKTogdm9pZDtcclxuXHJcbiAgZ29Gb3J3YXJkKCk6IHZvaWQ7XHJcbn1cclxuXHJcbmV4cG9ydCBlbnVtIEFjdGlvbiB7XHJcbiAgcG9wID0gJ1BPUCcsXHJcbiAgcHVzaCA9ICdQVVNIJyxcclxuICByZXBsYWNlID0gJ1JFUExBQ0UnLFxyXG59XHJcblxyXG5leHBvcnQgZW51bSBFdmVudFR5cGUge1xyXG4gIFBvcFN0YXRlID0gJ3BvcHN0YXRlJyxcclxuICBIYXNoQ2hhbmdlID0gJ2hhc2hjaGFuZ2UnLFxyXG59XHJcblxyXG5leHBvcnQgdHlwZSBQYXRoID0ge1xyXG4gIHBhdGhuYW1lOiBzdHJpbmc7XHJcblxyXG4gIHNlYXJjaDogc3RyaW5nO1xyXG5cclxuICBoYXNoOiBzdHJpbmc7XHJcbn07XHJcblxyXG5leHBvcnQgdHlwZSBIaXN0b3J5U3RhdGU8VD4gPSB7XHJcbiAgc3RhdGU/OiBUO1xyXG5cclxuICBrZXk6IHN0cmluZztcclxufTtcclxuXHJcbmV4cG9ydCB0eXBlIERlZmF1bHRTdGF0ZVR5cGUgPSB1bmtub3duO1xyXG5cclxuZXhwb3J0IHR5cGUgTG9jYXRpb248VCA9IHVua25vd24+ID0gUGF0aCAmIEhpc3RvcnlTdGF0ZTxUPjtcclxuXHJcbmV4cG9ydCB0eXBlIFRvID0gc3RyaW5nIHwgUGFydGlhbDxQYXRoPjtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgTGlzdGVuZXI8VCA9IHVua25vd24+IHtcclxuICAobmF2aWdhdGlvbjogTmF2aWdhdGlvbjxUPik6IHZvaWQ7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgTmF2aWdhdGlvbjxUID0gdW5rbm93bj4ge1xyXG4gIGFjdGlvbjogQWN0aW9uO1xyXG5cclxuICBsb2NhdGlvbjogTG9jYXRpb248VD47XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIFByb21wdDxTPiA9IHN0cmluZyB8IGJvb2xlYW4gfCBudWxsIHwgKChsb2NhdGlvbjogTG9jYXRpb248Uz4sIGFjdGlvbjogQWN0aW9uKSA9PiB2b2lkKTtcclxuXHJcbmV4cG9ydCB0eXBlIENhbGxCYWNrRnVuYyA9IChpc0p1bXA6IGJvb2xlYW4pID0+IHZvaWQ7XHJcblxyXG5leHBvcnQgdHlwZSBDb25maXJtYXRpb25GdW5jID0gKG1lc3NhZ2U6IHN0cmluZywgY2FsbEJhY2s6IENhbGxCYWNrRnVuYykgPT4gdm9pZDtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgVE1hbmFnZXI8Uz4ge1xyXG4gIHNldFByb21wdChuZXh0OiBQcm9tcHQ8Uz4pOiAoKSA9PiB2b2lkO1xyXG5cclxuICBhZGRMaXN0ZW5lcihmdW5jOiAobmF2aWdhdGlvbjogTmF2aWdhdGlvbjxTPikgPT4gdm9pZCk6ICgpID0+IHZvaWQ7XHJcblxyXG4gIG5vdGlmeUxpc3RlbmVycyhhcmdzOiBOYXZpZ2F0aW9uPFM+KTogdm9pZDtcclxuXHJcbiAgY29uZmlybUp1bXBUbyhcclxuICAgIGxvY2F0aW9uOiBMb2NhdGlvbjxTPixcclxuICAgIGFjdGlvbjogQWN0aW9uLFxyXG4gICAgdXNlckNvbmZpcm1hdGlvbkZ1bmM6IENvbmZpcm1hdGlvbkZ1bmMsXHJcbiAgICBjYWxsQmFjazogQ2FsbEJhY2tGdW5jLFxyXG4gICk6IHZvaWQ7XHJcbn1cclxuIiwiaW1wb3J0IHsgQWN0aW9uLCBMb2NhdGlvbiwgUGF0aCwgVG8gfSBmcm9tICcuL3R5cGVzJztcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQYXRoKHBhdGg6IFBhcnRpYWw8UGF0aD4pOiBzdHJpbmcge1xyXG4gIGNvbnN0IHsgc2VhcmNoLCBoYXNoIH0gPSBwYXRoO1xyXG4gIGxldCBwYXRobmFtZSA9IHBhdGgucGF0aG5hbWUgfHwgJy8nO1xyXG4gIGlmIChzZWFyY2ggJiYgc2VhcmNoICE9PSAnPycpIHtcclxuICAgIHBhdGhuYW1lICs9IHNlYXJjaC5zdGFydHNXaXRoKCc/JykgPyBzZWFyY2ggOiAnPycgKyBzZWFyY2g7XHJcbiAgfVxyXG4gIGlmIChoYXNoICYmIGhhc2ggIT09ICcjJykge1xyXG4gICAgcGF0aG5hbWUgKz0gaGFzaC5zdGFydHNXaXRoKCcjJykgPyBoYXNoIDogJyMnICsgaGFzaDtcclxuICB9XHJcbiAgcmV0dXJuIHBhdGhuYW1lO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VQYXRoKHVybDogc3RyaW5nKTogUGFydGlhbDxQYXRoPiB7XHJcbiAgaWYgKCF1cmwpIHtcclxuICAgIHJldHVybiB7fTtcclxuICB9XHJcbiAgbGV0IHBhcnNlZFBhdGg6IFBhcnRpYWw8UGF0aD4gPSB7fTtcclxuXHJcbiAgbGV0IGhhc2hJZHggPSB1cmwuaW5kZXhPZignIycpO1xyXG4gIGlmIChoYXNoSWR4ID4gLTEpIHtcclxuICAgIHBhcnNlZFBhdGguaGFzaCA9IHVybC5zdWJzdHJpbmcoaGFzaElkeCk7XHJcbiAgICB1cmwgPSB1cmwuc3Vic3RyaW5nKDAsIGhhc2hJZHgpO1xyXG4gIH1cclxuXHJcbiAgbGV0IHNlYXJjaElkeCA9IHVybC5pbmRleE9mKCc/Jyk7XHJcbiAgaWYgKHNlYXJjaElkeCA+IC0xKSB7XHJcbiAgICBwYXJzZWRQYXRoLnNlYXJjaCA9IHVybC5zdWJzdHJpbmcoc2VhcmNoSWR4KTtcclxuICAgIHVybCA9IHVybC5zdWJzdHJpbmcoMCwgc2VhcmNoSWR4KTtcclxuICB9XHJcbiAgaWYgKHVybCkge1xyXG4gICAgcGFyc2VkUGF0aC5wYXRobmFtZSA9IHVybDtcclxuICB9XHJcbiAgcmV0dXJuIHBhcnNlZFBhdGg7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVMb2NhdGlvbjxTPihjdXJyZW50OiBzdHJpbmcgfCBMb2NhdGlvbiwgdG86IFRvLCBzdGF0ZT86IFMsIGtleT86IHN0cmluZyk6IFJlYWRvbmx5PExvY2F0aW9uPFM+PiB7XHJcbiAgbGV0IHBhdGhuYW1lID0gdHlwZW9mIGN1cnJlbnQgPT09ICdzdHJpbmcnID8gY3VycmVudCA6IGN1cnJlbnQucGF0aG5hbWU7XHJcbiAgbGV0IHVybE9iaiA9IHR5cGVvZiB0byA9PT0gJ3N0cmluZycgPyBwYXJzZVBhdGgodG8pIDogdG87XHJcbiAgLy8g6ZqP5py6a2V56ZW/5bqm5Y+WNlxyXG4gIGNvbnN0IGdldFJhbmRLZXkgPSBnZW5SYW5kb21LZXkoNik7XHJcbiAgY29uc3QgbG9jYXRpb24gPSB7XHJcbiAgICBwYXRobmFtZTogcGF0aG5hbWUsXHJcbiAgICBzZWFyY2g6ICcnLFxyXG4gICAgaGFzaDogJycsXHJcbiAgICBzdGF0ZTogc3RhdGUsXHJcbiAgICBrZXk6IHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnID8ga2V5IDogZ2V0UmFuZEtleSgpLFxyXG4gICAgLi4udXJsT2JqLFxyXG4gIH07XHJcbiAgaWYgKCFsb2NhdGlvbi5wYXRobmFtZSkge1xyXG4gICAgbG9jYXRpb24ucGF0aG5hbWUgPSAnLyc7XHJcbiAgfVxyXG4gIHJldHVybiBsb2NhdGlvbjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGlzTG9jYXRpb25FcXVhbChwMTogUGFydGlhbDxQYXRoPiwgcDI6IFBhcnRpYWw8UGF0aD4pIHtcclxuICByZXR1cm4gcDEucGF0aG5hbWUgPT09IHAyLnBhdGhuYW1lICYmIHAxLnNlYXJjaCA9PT0gcDIuc2VhcmNoICYmIHAxLmhhc2ggPT09IHAyLmhhc2g7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhZGRIZWFkU2xhc2gocGF0aDogc3RyaW5nKTogc3RyaW5nIHtcclxuICBpZiAocGF0aFswXSA9PT0gJy8nKSB7XHJcbiAgICByZXR1cm4gcGF0aDtcclxuICB9XHJcbiAgcmV0dXJuICcvJyArIHBhdGg7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzdHJpcEhlYWRTbGFzaChwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gIGlmIChwYXRoWzBdID09PSAnLycpIHtcclxuICAgIHJldHVybiBwYXRoLnN1YnN0cmluZygxKTtcclxuICB9XHJcbiAgcmV0dXJuIHBhdGg7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVTbGFzaChwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gIGNvbnN0IHRlbXBQYXRoID0gYWRkSGVhZFNsYXNoKHBhdGgpO1xyXG4gIGlmICh0ZW1wUGF0aFt0ZW1wUGF0aC5sZW5ndGggLSAxXSA9PT0gJy8nKSB7XHJcbiAgICByZXR1cm4gdGVtcFBhdGguc3Vic3RyaW5nKDAsIHRlbXBQYXRoLmxlbmd0aCAtIDEpO1xyXG4gIH1cclxuICByZXR1cm4gdGVtcFBhdGg7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBoYXNCYXNlbmFtZShwYXRoOiBzdHJpbmcsIHByZWZpeDogc3RyaW5nKTogQm9vbGVhbiB7XHJcbiAgcmV0dXJuIChcclxuICAgIHBhdGgudG9Mb3dlckNhc2UoKS5pbmRleE9mKHByZWZpeC50b0xvd2VyQ2FzZSgpKSA9PT0gMCAmJiBbJy8nLCAnPycsICcjJywgJyddLmluY2x1ZGVzKHBhdGguY2hhckF0KHByZWZpeC5sZW5ndGgpKVxyXG4gICk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzdHJpcEJhc2VuYW1lKHBhdGg6IHN0cmluZywgcHJlZml4OiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gIHJldHVybiBoYXNCYXNlbmFtZShwYXRoLCBwcmVmaXgpID8gcGF0aC5zdWJzdHJpbmcocHJlZml4Lmxlbmd0aCkgOiBwYXRoO1xyXG59XHJcblxyXG4vLyDkvb/nlKjpmo/mnLrnlJ/miJDnmoRLZXnorrDlvZXooqvorr/pl67ov4fnmoRVUkzvvIzlvZNCbG9ja+iiq+iiq+inpuWPkeaXtuWIqeeUqGRlbHRh5YC86Lez6L2s5Yiw5LmL5YmN55qE6aG16Z2iXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVNZW1vcnlSZWNvcmQ8VCwgUz4oaW5pdFZhbDogUywgZm46IChhcmc6IFMpID0+IFQpIHtcclxuICBsZXQgdmlzaXRlZFJlY29yZDogVFtdID0gW2ZuKGluaXRWYWwpXTtcclxuXHJcbiAgZnVuY3Rpb24gZ2V0RGVsdGEodG86IFMsIGZvcm06IFMpOiBudW1iZXIge1xyXG4gICAgbGV0IHRvSWR4ID0gdmlzaXRlZFJlY29yZC5sYXN0SW5kZXhPZihmbih0bykpO1xyXG4gICAgaWYgKHRvSWR4ID09PSAtMSkge1xyXG4gICAgICB0b0lkeCA9IDA7XHJcbiAgICB9XHJcbiAgICBsZXQgZnJvbUlkeCA9IHZpc2l0ZWRSZWNvcmQubGFzdEluZGV4T2YoZm4oZm9ybSkpO1xyXG4gICAgaWYgKGZyb21JZHggPT09IC0xKSB7XHJcbiAgICAgIGZyb21JZHggPSAwO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRvSWR4IC0gZnJvbUlkeDtcclxuICB9XHJcblxyXG4gIGZ1bmN0aW9uIGFkZFJlY29yZChjdXJyZW50OiBTLCBuZXdSZWNvcmQ6IFMsIGFjdGlvbjogQWN0aW9uKSB7XHJcbiAgICBjb25zdCBjdXJWYWwgPSBmbihjdXJyZW50KTtcclxuICAgIGNvbnN0IE5ld1ZhbCA9IGZuKG5ld1JlY29yZCk7XHJcbiAgICBpZiAoYWN0aW9uID09PSBBY3Rpb24ucHVzaCkge1xyXG4gICAgICBjb25zdCBwcmV2SWR4ID0gdmlzaXRlZFJlY29yZC5sYXN0SW5kZXhPZihjdXJWYWwpO1xyXG4gICAgICBjb25zdCBuZXdWaXNpdGVkUmVjb3JkID0gdmlzaXRlZFJlY29yZC5zbGljZSgwLCBwcmV2SWR4ICsgMSk7XHJcbiAgICAgIG5ld1Zpc2l0ZWRSZWNvcmQucHVzaChOZXdWYWwpO1xyXG4gICAgICB2aXNpdGVkUmVjb3JkID0gbmV3VmlzaXRlZFJlY29yZDtcclxuICAgIH1cclxuICAgIGlmIChhY3Rpb24gPT09IEFjdGlvbi5yZXBsYWNlKSB7XHJcbiAgICAgIGNvbnN0IHByZXZJZHggPSB2aXNpdGVkUmVjb3JkLmxhc3RJbmRleE9mKGN1clZhbCk7XHJcbiAgICAgIGlmIChwcmV2SWR4ICE9PSAtMSkge1xyXG4gICAgICAgIHZpc2l0ZWRSZWNvcmRbcHJldklkeF0gPSBOZXdWYWw7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJldHVybiB7IGdldERlbHRhLCBhZGRSZWNvcmQgfTtcclxufVxyXG5cclxuZnVuY3Rpb24gZ2VuUmFuZG9tS2V5KGxlbmd0aDogbnVtYmVyKTogKCkgPT4gc3RyaW5nIHtcclxuICBjb25zdCBlbmQgPSBsZW5ndGggKyAyO1xyXG4gIHJldHVybiAoKSA9PiB7XHJcbiAgICByZXR1cm4gTWF0aC5yYW5kb20oKS50b1N0cmluZygxOCkuc3Vic3RyaW5nKDIsIGVuZCk7XHJcbiAgfTtcclxufVxyXG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7XG4gIGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTtcbiAgfVxufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7XG4gIFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjtcblxuICByZXR1cm4gX3R5cGVvZiA9IFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIFwic3ltYm9sXCIgPT0gdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA/IGZ1bmN0aW9uIChvYmopIHtcbiAgICByZXR1cm4gdHlwZW9mIG9iajtcbiAgfSA6IGZ1bmN0aW9uIChvYmopIHtcbiAgICByZXR1cm4gb2JqICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqO1xuICB9LCBfdHlwZW9mKG9iaik7XG59IiwiaW1wb3J0IF90eXBlb2YgZnJvbSBcIi4vdHlwZW9mLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfdG9QcmltaXRpdmUoaW5wdXQsIGhpbnQpIHtcbiAgaWYgKF90eXBlb2YoaW5wdXQpICE9PSBcIm9iamVjdFwiIHx8IGlucHV0ID09PSBudWxsKSByZXR1cm4gaW5wdXQ7XG4gIHZhciBwcmltID0gaW5wdXRbU3ltYm9sLnRvUHJpbWl0aXZlXTtcbiAgaWYgKHByaW0gIT09IHVuZGVmaW5lZCkge1xuICAgIHZhciByZXMgPSBwcmltLmNhbGwoaW5wdXQsIGhpbnQgfHwgXCJkZWZhdWx0XCIpO1xuICAgIGlmIChfdHlwZW9mKHJlcykgIT09IFwib2JqZWN0XCIpIHJldHVybiByZXM7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkBAdG9QcmltaXRpdmUgbXVzdCByZXR1cm4gYSBwcmltaXRpdmUgdmFsdWUuXCIpO1xuICB9XG4gIHJldHVybiAoaGludCA9PT0gXCJzdHJpbmdcIiA/IFN0cmluZyA6IE51bWJlcikoaW5wdXQpO1xufSIsImltcG9ydCBfdHlwZW9mIGZyb20gXCIuL3R5cGVvZi5qc1wiO1xuaW1wb3J0IHRvUHJpbWl0aXZlIGZyb20gXCIuL3RvUHJpbWl0aXZlLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfdG9Qcm9wZXJ0eUtleShhcmcpIHtcbiAgdmFyIGtleSA9IHRvUHJpbWl0aXZlKGFyZywgXCJzdHJpbmdcIik7XG4gIHJldHVybiBfdHlwZW9mKGtleSkgPT09IFwic3ltYm9sXCIgPyBrZXkgOiBTdHJpbmcoa2V5KTtcbn0iLCJpbXBvcnQgdG9Qcm9wZXJ0eUtleSBmcm9tIFwiLi90b1Byb3BlcnR5S2V5LmpzXCI7XG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldO1xuICAgIGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTtcbiAgICBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7XG4gICAgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCB0b1Byb3BlcnR5S2V5KGRlc2NyaXB0b3Iua2V5KSwgZGVzY3JpcHRvcik7XG4gIH1cbn1cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHtcbiAgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7XG4gIGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbnN0cnVjdG9yLCBcInByb3RvdHlwZVwiLCB7XG4gICAgd3JpdGFibGU6IGZhbHNlXG4gIH0pO1xuICByZXR1cm4gQ29uc3RydWN0b3I7XG59IiwiaW1wb3J0IHsgQWN0aW9uLCBDYWxsQmFja0Z1bmMsIENvbmZpcm1hdGlvbkZ1bmMsIExpc3RlbmVyLCBMb2NhdGlvbiwgTmF2aWdhdGlvbiwgUHJvbXB0LCBUTWFuYWdlciB9IGZyb20gJy4vdHlwZXMnO1xyXG5cclxuY2xhc3MgVHJhbnNpdGlvbk1hbmFnZXI8Uz4gaW1wbGVtZW50cyBUTWFuYWdlcjxTPiB7XHJcbiAgcHJpdmF0ZSBwcm9tcHQ6IFByb21wdDxTPjtcclxuICBwcml2YXRlIGxpc3RlbmVyczogTGlzdGVuZXI8Uz5bXTtcclxuXHJcbiAgY29uc3RydWN0b3IoKSB7XHJcbiAgICB0aGlzLnByb21wdCA9IG51bGw7XHJcbiAgICB0aGlzLmxpc3RlbmVycyA9IFtdO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldFByb21wdChwcm9tcHQ6IFByb21wdDxTPik6ICgpID0+IHZvaWQge1xyXG4gICAgdGhpcy5wcm9tcHQgPSBwcm9tcHQ7XHJcblxyXG4gICAgLy8g5riF6ZmkUHJvbXB0XHJcbiAgICByZXR1cm4gKCkgPT4ge1xyXG4gICAgICBpZiAodGhpcy5wcm9tcHQgPT09IHByb21wdCkge1xyXG4gICAgICAgIHRoaXMucHJvbXB0ID0gbnVsbDtcclxuICAgICAgfVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIC8vIOS9v+eUqOWPkeW4g+iuoumYheaooeW8j+euoeeQhmhpc3RvcnnnmoTnm5HlkKzogIVcclxuICBwdWJsaWMgYWRkTGlzdGVuZXIoZnVuYzogTGlzdGVuZXI8Uz4pOiAoKSA9PiB2b2lkIHtcclxuICAgIGxldCBpc0FjdGl2ZSA9IHRydWU7XHJcbiAgICBjb25zdCBsaXN0ZW5lciA9IChhcmdzOiBOYXZpZ2F0aW9uPFM+KSA9PiB7XHJcbiAgICAgIGlmIChpc0FjdGl2ZSkge1xyXG4gICAgICAgIGZ1bmMoYXJncyk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgICB0aGlzLmxpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcclxuICAgIHJldHVybiAoKSA9PiB7XHJcbiAgICAgIGlzQWN0aXZlID0gZmFsc2U7XHJcbiAgICAgIC8vIOenu+mZpOWvueW6lOeahOebkeWQrOiAhVxyXG4gICAgICB0aGlzLmxpc3RlbmVycyA9IHRoaXMubGlzdGVuZXJzLmZpbHRlcihpdGVtID0+IGl0ZW0gIT09IGxpc3RlbmVyKTtcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbm90aWZ5TGlzdGVuZXJzKGFyZ3M6IE5hdmlnYXRpb248Uz4pIHtcclxuICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgdGhpcy5saXN0ZW5lcnMpIHtcclxuICAgICAgbGlzdGVuZXIoYXJncyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY29uZmlybUp1bXBUbyhcclxuICAgIGxvY2F0aW9uOiBMb2NhdGlvbjxTPixcclxuICAgIGFjdGlvbjogQWN0aW9uLFxyXG4gICAgdXNlckNvbmZpcm1hdGlvbkZ1bmM6IENvbmZpcm1hdGlvbkZ1bmMsXHJcbiAgICBjYWxsQmFjazogQ2FsbEJhY2tGdW5jXHJcbiAgKSB7XHJcbiAgICBpZiAodGhpcy5wcm9tcHQgIT09IG51bGwpIHtcclxuICAgICAgY29uc3QgcmVzdWx0ID0gdHlwZW9mIHRoaXMucHJvbXB0ID09PSAnZnVuY3Rpb24nID8gdGhpcy5wcm9tcHQobG9jYXRpb24sIGFjdGlvbikgOiB0aGlzLnByb21wdDtcclxuICAgICAgaWYgKHR5cGVvZiByZXN1bHQgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgdHlwZW9mIHVzZXJDb25maXJtYXRpb25GdW5jID09PSAnZnVuY3Rpb24nID8gdXNlckNvbmZpcm1hdGlvbkZ1bmMocmVzdWx0LCBjYWxsQmFjaykgOiBjYWxsQmFjayh0cnVlKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjYWxsQmFjayhyZXN1bHQgIT09IGZhbHNlKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY2FsbEJhY2sodHJ1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBUcmFuc2l0aW9uTWFuYWdlcjtcclxuIiwiZnVuY3Rpb24gd2FybmluZyhjb25kaXRpb246IGFueSwgbWVzc2FnZTogc3RyaW5nKSB7XHJcbiAgaWYgKGNvbmRpdGlvbikge1xyXG4gICAgaWYgKGNvbnNvbGUgJiYgdHlwZW9mIGNvbnNvbGUud2FybiA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICBjb25zb2xlLndhcm4obWVzc2FnZSk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCB3YXJuaW5nOyIsImltcG9ydCB7IEhpc3RvcnlQcm9wcywgTGlzdGVuZXIsIE5hdmlnYXRpb24sIFByb21wdCB9IGZyb20gJy4vdHlwZXMnO1xyXG5pbXBvcnQgdHJhbnNpdGlvbk1hbmFnZXIgZnJvbSAnLi90cmFuc2l0aW9uTWFuYWdlcic7XHJcblxyXG4vLyDmir3lj5ZCcm93c2VySGlzdG9yeeWSjEhhc2hIaXN0b3J55Lit55u45ZCM55qE5pa55rOVXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRCYXNlSGlzdG9yeTxTPihcclxuICB0cmFuc2l0aW9uTWFuYWdlcjogdHJhbnNpdGlvbk1hbmFnZXI8Uz4sXHJcbiAgc2V0TGlzdGVuZXI6IChkZWx0YTogbnVtYmVyKSA9PiB2b2lkLFxyXG4gIGJyb3dzZXJIaXN0b3J5OiBIaXN0b3J5LFxyXG4pIHtcclxuICBmdW5jdGlvbiBnbyhzdGVwOiBudW1iZXIpIHtcclxuICAgIGJyb3dzZXJIaXN0b3J5LmdvKHN0ZXApO1xyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gZ29CYWNrKCkge1xyXG4gICAgYnJvd3Nlckhpc3RvcnkuZ28oLTEpO1xyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gZ29Gb3J3YXJkKCkge1xyXG4gICAgYnJvd3Nlckhpc3RvcnkuZ28oMSk7XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiBsaXN0ZW4obGlzdGVuZXI6IExpc3RlbmVyPFM+KTogKCkgPT4gdm9pZCB7XHJcbiAgICBjb25zdCBjYW5jZWwgPSB0cmFuc2l0aW9uTWFuYWdlci5hZGRMaXN0ZW5lcihsaXN0ZW5lcik7XHJcbiAgICBzZXRMaXN0ZW5lcigxKTtcclxuICAgIHJldHVybiAoKSA9PiB7XHJcbiAgICAgIHNldExpc3RlbmVyKC0xKTtcclxuICAgICAgY2FuY2VsKCk7XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgbGV0IGlzQmxvY2tlZCA9IGZhbHNlO1xyXG5cclxuICBmdW5jdGlvbiBibG9jayhwcm9tcHQ6IFByb21wdDxTPiA9IGZhbHNlKTogKCkgPT4gdm9pZCB7XHJcbiAgICBjb25zdCB1bmJsb2NrID0gdHJhbnNpdGlvbk1hbmFnZXIuc2V0UHJvbXB0KHByb21wdCk7XHJcbiAgICBpZiAoIWlzQmxvY2tlZCkge1xyXG4gICAgICBzZXRMaXN0ZW5lcigxKTtcclxuICAgICAgaXNCbG9ja2VkID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiAoKSA9PiB7XHJcbiAgICAgIGlmIChpc0Jsb2NrZWQpIHtcclxuICAgICAgICBpc0Jsb2NrZWQgPSBmYWxzZTtcclxuICAgICAgICBzZXRMaXN0ZW5lcigtMSk7XHJcbiAgICAgIH1cclxuICAgICAgdW5ibG9jaygpO1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIGZ1bmN0aW9uIGdldFVwZGF0ZVN0YXRlRnVuYyhoaXN0b3J5UHJvcHM6IEhpc3RvcnlQcm9wczxTPikge1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChuZXh0U3RhdGU6IE5hdmlnYXRpb248Uz4gfCB1bmRlZmluZWQpIHtcclxuICAgICAgaWYgKG5leHRTdGF0ZSkge1xyXG4gICAgICAgIE9iamVjdC5hc3NpZ24oaGlzdG9yeVByb3BzLCBuZXh0U3RhdGUpO1xyXG4gICAgICB9XHJcbiAgICAgIGhpc3RvcnlQcm9wcy5sZW5ndGggPSBicm93c2VySGlzdG9yeS5sZW5ndGg7XHJcbiAgICAgIGNvbnN0IGFyZ3MgPSB7IGxvY2F0aW9uOiBoaXN0b3J5UHJvcHMubG9jYXRpb24sIGFjdGlvbjogaGlzdG9yeVByb3BzLmFjdGlvbiB9O1xyXG4gICAgICB0cmFuc2l0aW9uTWFuYWdlci5ub3RpZnlMaXN0ZW5lcnMoYXJncyk7XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHsgZ28sIGdvQmFjaywgZ29Gb3J3YXJkLCBsaXN0ZW4sIGJsb2NrLCBnZXRVcGRhdGVTdGF0ZUZ1bmMgfTtcclxufVxyXG4iLCJpbXBvcnQgeyBnZXREZWZhdWx0Q29uZmlybWF0aW9uLCBpc1N1cHBvcnRIaXN0b3J5LCBpc1N1cHBvcnRzUG9wU3RhdGUgfSBmcm9tICcuL2RvbSc7XHJcbmltcG9ydCB7IEFjdGlvbiwgQmFzZU9wdGlvbiwgRGVmYXVsdFN0YXRlVHlwZSwgRXZlbnRUeXBlLCBIaXN0b3J5LCBIaXN0b3J5U3RhdGUsIExvY2F0aW9uLCBQYXRoLCBUbyB9IGZyb20gJy4vdHlwZXMnO1xyXG5pbXBvcnQgeyBub3JtYWxpemVTbGFzaCwgY3JlYXRlTWVtb3J5UmVjb3JkLCBjcmVhdGVQYXRoLCBjcmVhdGVMb2NhdGlvbiwgc3RyaXBCYXNlbmFtZSB9IGZyb20gJy4vdXRpbHMnO1xyXG5pbXBvcnQgVHJhbnNpdGlvbk1hbmFnZXIgZnJvbSAnLi90cmFuc2l0aW9uTWFuYWdlcic7XHJcblxyXG5pbXBvcnQgd2FybmluZyBmcm9tICcuL3dhcmluZyc7XHJcbmltcG9ydCB7IGdldEJhc2VIaXN0b3J5IH0gZnJvbSAnLi9iYXNlSGlzdG9yeSc7XHJcblxyXG5leHBvcnQgdHlwZSBCcm93c2VySGlzdG9yeU9wdGlvbiA9IHtcclxuICAvKipcclxuICAgKiBmb3JjZVJlZnJlc2jkuLpUcnVl5pe26Lez6L2s5pe25Lya5by65Yi25Yi35paw6aG16Z2iXHJcbiAgICovXHJcbiAgZm9yY2VSZWZyZXNoPzogYm9vbGVhbjtcclxufSAmIEJhc2VPcHRpb247XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQnJvd3Nlckhpc3Rvcnk8UyA9IERlZmF1bHRTdGF0ZVR5cGU+KG9wdGlvbnM6IEJyb3dzZXJIaXN0b3J5T3B0aW9uID0ge30pOiBIaXN0b3J5PFM+IHtcclxuICBjb25zdCBzdXBwb3J0SGlzdG9yeSA9IGlzU3VwcG9ydEhpc3RvcnkoKTtcclxuICBjb25zdCBpc1N1cHBvcnRQb3BTdGF0ZSA9IGlzU3VwcG9ydHNQb3BTdGF0ZSgpO1xyXG4gIGNvbnN0IGJyb3dzZXJIaXN0b3J5ID0gd2luZG93Lmhpc3Rvcnk7XHJcbiAgY29uc3QgeyBmb3JjZVJlZnJlc2ggPSBmYWxzZSwgZ2V0VXNlckNvbmZpcm1hdGlvbiA9IGdldERlZmF1bHRDb25maXJtYXRpb24gfSA9IG9wdGlvbnM7XHJcblxyXG4gIGNvbnN0IGJhc2VuYW1lID0gb3B0aW9ucy5iYXNlbmFtZSA/IG5vcm1hbGl6ZVNsYXNoKG9wdGlvbnMuYmFzZW5hbWUpIDogJyc7XHJcblxyXG4gIGNvbnN0IGluaXRMb2NhdGlvbiA9IGdldExvY2F0aW9uKGdldEhpc3RvcnlTdGF0ZSgpKTtcclxuXHJcbiAgY29uc3QgcmVjb3JkT3BlcmF0b3IgPSBjcmVhdGVNZW1vcnlSZWNvcmQ8c3RyaW5nLCBMb2NhdGlvbjxTPj4oaW5pdExvY2F0aW9uLCBsID0+IGwua2V5KTtcclxuXHJcbiAgY29uc3QgdHJhbnNpdGlvbk1hbmFnZXIgPSBuZXcgVHJhbnNpdGlvbk1hbmFnZXI8Uz4oKTtcclxuXHJcbiAgY29uc3QgeyBnbywgZ29CYWNrLCBnb0ZvcndhcmQsIGxpc3RlbiwgYmxvY2ssIGdldFVwZGF0ZVN0YXRlRnVuYyB9ID0gZ2V0QmFzZUhpc3Rvcnk8Uz4oXHJcbiAgICB0cmFuc2l0aW9uTWFuYWdlcixcclxuICAgIHNldExpc3RlbmVyLFxyXG4gICAgYnJvd3Nlckhpc3RvcnksXHJcbiAgKTtcclxuXHJcbiAgY29uc3QgaGlzdG9yeTogSGlzdG9yeTxTPiA9IHtcclxuICAgIGFjdGlvbjogQWN0aW9uLnBvcCxcclxuICAgIGxlbmd0aDogYnJvd3Nlckhpc3RvcnkubGVuZ3RoLFxyXG4gICAgbG9jYXRpb246IGluaXRMb2NhdGlvbixcclxuICAgIGdvLFxyXG4gICAgZ29CYWNrLFxyXG4gICAgZ29Gb3J3YXJkLFxyXG4gICAgbGlzdGVuLFxyXG4gICAgYmxvY2ssXHJcbiAgICBwdXNoLFxyXG4gICAgcmVwbGFjZSxcclxuICAgIGNyZWF0ZUhyZWYsXHJcbiAgfTtcclxuXHJcbiAgY29uc3QgdXBkYXRlU3RhdGUgPSBnZXRVcGRhdGVTdGF0ZUZ1bmMoaGlzdG9yeSk7XHJcblxyXG4gIGZ1bmN0aW9uIGdldEhpc3RvcnlTdGF0ZSgpIHtcclxuICAgIHJldHVybiBzdXBwb3J0SGlzdG9yeSA/IHdpbmRvdy5oaXN0b3J5LnN0YXRlIDoge307XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiBnZXRMb2NhdGlvbihoaXN0b3J5U3RhdGU6IFBhcnRpYWw8SGlzdG9yeVN0YXRlPFM+Pikge1xyXG4gICAgY29uc3QgeyBzZWFyY2gsIGhhc2ggfSA9IHdpbmRvdy5sb2NhdGlvbjtcclxuICAgIGNvbnN0IHsga2V5LCBzdGF0ZSB9ID0gaGlzdG9yeVN0YXRlIHx8IHt9O1xyXG4gICAgbGV0IHBhdGhuYW1lID0gd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lO1xyXG4gICAgcGF0aG5hbWUgPSBiYXNlbmFtZSA/IHN0cmlwQmFzZW5hbWUocGF0aG5hbWUsIGJhc2VuYW1lKSA6IHBhdGhuYW1lO1xyXG5cclxuICAgIHJldHVybiBjcmVhdGVMb2NhdGlvbjxTPignJywgeyBwYXRobmFtZSwgc2VhcmNoLCBoYXNoIH0sIHN0YXRlLCBrZXkpO1xyXG4gIH1cclxuXHJcbiAgLy8g5oum5oiq6aG16Z2iUE9Q5LqL5Lu25ZCO77yM6Ziy5q2i6L+U5Zue5Yiw55qE6aG16Z2i6KKr6YeN5aSN5oum5oiqXHJcbiAgbGV0IGZvcmNlSnVtcCA9IGZhbHNlO1xyXG5cclxuICBmdW5jdGlvbiBoYW5kbGVQb3BTdGF0ZShsb2NhdGlvbjogTG9jYXRpb248Uz4pIHtcclxuICAgIGlmIChmb3JjZUp1bXApIHtcclxuICAgICAgZm9yY2VKdW1wID0gZmFsc2U7XHJcbiAgICAgIHVwZGF0ZVN0YXRlKHVuZGVmaW5lZCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCBhY3Rpb24gPSBBY3Rpb24ucG9wO1xyXG5cclxuICAgICAgY29uc3QgY2FsbGJhY2sgPSAoaXNKdW1wOiBib29sZWFuKSA9PiB7XHJcbiAgICAgICAgaWYgKGlzSnVtcCkge1xyXG4gICAgICAgICAgLy8g5omn6KGM6Lez6L2s6KGM5Li6XHJcbiAgICAgICAgICB1cGRhdGVTdGF0ZSh7IGFjdGlvbjogYWN0aW9uLCBsb2NhdGlvbjogbG9jYXRpb24gfSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJldmVydFBvcFN0YXRlKGxvY2F0aW9uLCBoaXN0b3J5LmxvY2F0aW9uKTtcclxuICAgICAgICB9XHJcbiAgICAgIH07XHJcblxyXG4gICAgICB0cmFuc2l0aW9uTWFuYWdlci5jb25maXJtSnVtcFRvKGxvY2F0aW9uLCBhY3Rpb24sIGdldFVzZXJDb25maXJtYXRpb24sIGNhbGxiYWNrKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGZ1bmN0aW9uIHBvcFN0YXRlTGlzdGVuZXIoZXZlbnQ6IFBvcFN0YXRlRXZlbnQpIHtcclxuICAgIGhhbmRsZVBvcFN0YXRlKGdldExvY2F0aW9uKGV2ZW50LnN0YXRlKSk7XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiBoYXNoQ2hhbmdlTGlzdGVuZXIoKSB7XHJcbiAgICBjb25zdCBsb2NhdGlvbiA9IGdldExvY2F0aW9uKGdldEhpc3RvcnlTdGF0ZSgpKTtcclxuICAgIGhhbmRsZVBvcFN0YXRlKGxvY2F0aW9uKTtcclxuICB9XHJcblxyXG4gIGxldCBsaXN0ZW5lckNvdW50ID0gMDtcclxuXHJcbiAgZnVuY3Rpb24gc2V0TGlzdGVuZXIoY291bnQ6IG51bWJlcikge1xyXG4gICAgbGlzdGVuZXJDb3VudCArPSBjb3VudDtcclxuICAgIGlmIChsaXN0ZW5lckNvdW50ID09PSAxICYmIGNvdW50ID09PSAxKSB7XHJcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKEV2ZW50VHlwZS5Qb3BTdGF0ZSwgcG9wU3RhdGVMaXN0ZW5lcik7XHJcbiAgICAgIGlmICghaXNTdXBwb3J0UG9wU3RhdGUpIHtcclxuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihFdmVudFR5cGUuSGFzaENoYW5nZSwgaGFzaENoYW5nZUxpc3RlbmVyKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmIChsaXN0ZW5lckNvdW50ID09PSAwKSB7XHJcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKEV2ZW50VHlwZS5Qb3BTdGF0ZSwgcG9wU3RhdGVMaXN0ZW5lcik7XHJcbiAgICAgIGlmICghaXNTdXBwb3J0UG9wU3RhdGUpIHtcclxuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihFdmVudFR5cGUuSGFzaENoYW5nZSwgaGFzaENoYW5nZUxpc3RlbmVyKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8g5Y+W5raI6aG16Z2i6Lez6L2s5bm25oGi5aSN5Yiw6Lez6L2s5YmN55qE6aG16Z2iXHJcbiAgZnVuY3Rpb24gcmV2ZXJ0UG9wU3RhdGUoZm9ybTogTG9jYXRpb248Uz4sIHRvOiBMb2NhdGlvbjxTPikge1xyXG4gICAgY29uc3QgZGVsdGEgPSByZWNvcmRPcGVyYXRvci5nZXREZWx0YSh0bywgZm9ybSk7XHJcbiAgICBpZiAoZGVsdGEgIT09IDApIHtcclxuICAgICAgZ28oZGVsdGEpO1xyXG4gICAgICBmb3JjZUp1bXAgPSB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gY3JlYXRlSHJlZihwYXRoOiBQYXJ0aWFsPFBhdGg+KSB7XHJcbiAgICByZXR1cm4gYmFzZW5hbWUgKyBjcmVhdGVQYXRoKHBhdGgpO1xyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gcHVzaCh0bzogVG8sIHN0YXRlPzogUykge1xyXG4gICAgY29uc3QgYWN0aW9uID0gQWN0aW9uLnB1c2g7XHJcbiAgICBjb25zdCBsb2NhdGlvbiA9IGNyZWF0ZUxvY2F0aW9uPFM+KGhpc3RvcnkubG9jYXRpb24sIHRvLCBzdGF0ZSwgdW5kZWZpbmVkKTtcclxuXHJcbiAgICB0cmFuc2l0aW9uTWFuYWdlci5jb25maXJtSnVtcFRvKGxvY2F0aW9uLCBhY3Rpb24sIGdldFVzZXJDb25maXJtYXRpb24sIGlzSnVtcCA9PiB7XHJcbiAgICAgIGlmICghaXNKdW1wKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IGhyZWYgPSBjcmVhdGVIcmVmKGxvY2F0aW9uKTtcclxuICAgICAgY29uc3QgeyBrZXksIHN0YXRlIH0gPSBsb2NhdGlvbjtcclxuXHJcbiAgICAgIGlmIChzdXBwb3J0SGlzdG9yeSkge1xyXG4gICAgICAgIGlmIChmb3JjZVJlZnJlc2gpIHtcclxuICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gaHJlZjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgYnJvd3Nlckhpc3RvcnkucHVzaFN0YXRlKHsga2V5OiBrZXksIHN0YXRlOiBzdGF0ZSB9LCAnJywgaHJlZik7XHJcbiAgICAgICAgICByZWNvcmRPcGVyYXRvci5hZGRSZWNvcmQoaGlzdG9yeS5sb2NhdGlvbiwgbG9jYXRpb24sIGFjdGlvbik7XHJcbiAgICAgICAgICB1cGRhdGVTdGF0ZSh7IGFjdGlvbiwgbG9jYXRpb24gfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHdhcm5pbmcoc3RhdGUgIT09IHVuZGVmaW5lZCwgJ0Jyb3dzZXIgaGlzdG9yeSBjYW5ub3QgcHVzaCBzdGF0ZSBpbiBicm93c2VycyB0aGF0IGRvIG5vdCBzdXBwb3J0IEhUTUw1IGhpc3RvcnknKTtcclxuICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IGhyZWY7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gcmVwbGFjZSh0bzogVG8sIHN0YXRlPzogUykge1xyXG4gICAgY29uc3QgYWN0aW9uID0gQWN0aW9uLnJlcGxhY2U7XHJcbiAgICBjb25zdCBsb2NhdGlvbiA9IGNyZWF0ZUxvY2F0aW9uPFM+KGhpc3RvcnkubG9jYXRpb24sIHRvLCBzdGF0ZSwgdW5kZWZpbmVkKTtcclxuXHJcbiAgICB0cmFuc2l0aW9uTWFuYWdlci5jb25maXJtSnVtcFRvKGxvY2F0aW9uLCBhY3Rpb24sIGdldFVzZXJDb25maXJtYXRpb24sIGlzSnVtcCA9PiB7XHJcbiAgICAgIGlmICghaXNKdW1wKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IGhyZWYgPSBjcmVhdGVIcmVmKGxvY2F0aW9uKTtcclxuICAgICAgY29uc3QgeyBrZXksIHN0YXRlIH0gPSBsb2NhdGlvbjtcclxuICAgICAgaWYgKHN1cHBvcnRIaXN0b3J5KSB7XHJcbiAgICAgICAgaWYgKGZvcmNlUmVmcmVzaCkge1xyXG4gICAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlcGxhY2UoaHJlZik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGJyb3dzZXJIaXN0b3J5LnJlcGxhY2VTdGF0ZSh7IGtleToga2V5LCBzdGF0ZTogc3RhdGUgfSwgJycsIGhyZWYpO1xyXG4gICAgICAgICAgcmVjb3JkT3BlcmF0b3IuYWRkUmVjb3JkKGhpc3RvcnkubG9jYXRpb24sIGxvY2F0aW9uLCBhY3Rpb24pO1xyXG4gICAgICAgICAgdXBkYXRlU3RhdGUoeyBhY3Rpb24sIGxvY2F0aW9uIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB3YXJuaW5nKHN0YXRlICE9PSB1bmRlZmluZWQsICdCcm93c2VyIGhpc3RvcnkgY2Fubm90IHB1c2ggc3RhdGUgaW4gYnJvd3NlcnMgdGhhdCBkbyBub3Qgc3VwcG9ydCBIVE1MNSBoaXN0b3J5Jyk7XHJcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlcGxhY2UoaHJlZik7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGhpc3Rvcnk7XHJcbn1cclxuIiwiaW1wb3J0IHsgQWN0aW9uLCBCYXNlT3B0aW9uLCBEZWZhdWx0U3RhdGVUeXBlLCBFdmVudFR5cGUsIEhpc3RvcnksIExvY2F0aW9uLCBUbyB9IGZyb20gJy4vdHlwZXMnO1xyXG5pbXBvcnQge1xyXG4gIGFkZEhlYWRTbGFzaCxcclxuICBub3JtYWxpemVTbGFzaCxcclxuICBjcmVhdGVNZW1vcnlSZWNvcmQsXHJcbiAgY3JlYXRlUGF0aCxcclxuICBjcmVhdGVMb2NhdGlvbixcclxuICBpc0xvY2F0aW9uRXF1YWwsXHJcbiAgc3RyaXBCYXNlbmFtZSxcclxuICBzdHJpcEhlYWRTbGFzaCxcclxufSBmcm9tICcuL3V0aWxzJztcclxuaW1wb3J0IHsgZ2V0RGVmYXVsdENvbmZpcm1hdGlvbiB9IGZyb20gJy4vZG9tJztcclxuaW1wb3J0IFRyYW5zaXRpb25NYW5hZ2VyIGZyb20gJy4vdHJhbnNpdGlvbk1hbmFnZXInO1xyXG5cclxuaW1wb3J0IHdhcm5pbmcgZnJvbSAnLi93YXJpbmcnO1xyXG5pbXBvcnQgeyBnZXRCYXNlSGlzdG9yeSB9IGZyb20gJy4vYmFzZUhpc3RvcnknO1xyXG5cclxuZXhwb3J0IHR5cGUgdXJsSGFzaFR5cGUgPSAnc2xhc2gnIHwgJ25vc2xhc2gnO1xyXG5cclxudHlwZSBIYXNoSGlzdG9yeU9wdGlvbiA9IHtcclxuICBoYXNoVHlwZT86IHVybEhhc2hUeXBlO1xyXG59ICYgQmFzZU9wdGlvbjtcclxuXHJcbi8vIOiOt+WPliPliY3nmoTlhoXlrrlcclxuZnVuY3Rpb24gc3RyaXBIYXNoKHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgY29uc3QgaWR4ID0gcGF0aC5pbmRleE9mKCcjJyk7XHJcbiAgcmV0dXJuIGlkeCA9PT0gLTEgPyBwYXRoIDogcGF0aC5zdWJzdHJpbmcoMCwgaWR4KTtcclxufVxyXG5cclxuLy8g6I635Y+WI+WQjueahOWGheWuuVxyXG5mdW5jdGlvbiBnZXRIYXNoQ29udGVudChwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gIGNvbnN0IGlkeCA9IHBhdGguaW5kZXhPZignIycpO1xyXG4gIHJldHVybiBpZHggPT09IC0xID8gJycgOiBwYXRoLnN1YnN0cmluZyhpZHggKyAxKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUhhc2hIaXN0b3J5PFMgPSBEZWZhdWx0U3RhdGVUeXBlPihvcHRpb246IEhhc2hIaXN0b3J5T3B0aW9uID0ge30pOiBIaXN0b3J5PFM+IHtcclxuICBjb25zdCBicm93c2VySGlzdG9yeSA9IHdpbmRvdy5oaXN0b3J5O1xyXG4gIGNvbnN0IHsgaGFzaFR5cGUgPSAnc2xhc2gnLCBnZXRVc2VyQ29uZmlybWF0aW9uID0gZ2V0RGVmYXVsdENvbmZpcm1hdGlvbiB9ID0gb3B0aW9uO1xyXG5cclxuICBjb25zdCBiYXNlbmFtZSA9IG9wdGlvbi5iYXNlbmFtZSA/IG5vcm1hbGl6ZVNsYXNoKG9wdGlvbi5iYXNlbmFtZSkgOiAnJztcclxuXHJcbiAgY29uc3QgcGF0aERlY29kZXIgPSBhZGRIZWFkU2xhc2g7XHJcbiAgY29uc3QgcGF0aEVuY29kZXIgPSBoYXNoVHlwZSA9PT0gJ3NsYXNoJyA/IGFkZEhlYWRTbGFzaCA6IHN0cmlwSGVhZFNsYXNoO1xyXG5cclxuICBmdW5jdGlvbiBnZXRMb2NhdGlvbigpIHtcclxuICAgIGxldCBoYXNoUGF0aCA9IHBhdGhEZWNvZGVyKGdldEhhc2hDb250ZW50KHdpbmRvdy5sb2NhdGlvbi5oYXNoKSk7XHJcbiAgICBpZiAoYmFzZW5hbWUpIHtcclxuICAgICAgaGFzaFBhdGggPSBzdHJpcEJhc2VuYW1lKGhhc2hQYXRoLCBiYXNlbmFtZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGNyZWF0ZUxvY2F0aW9uPFM+KCcnLCBoYXNoUGF0aCwgdW5kZWZpbmVkLCAnZGVmYXVsdCcpO1xyXG4gIH1cclxuXHJcbiAgY29uc3QgaW5pdExvY2F0aW9uID0gZ2V0TG9jYXRpb24oKTtcclxuXHJcbiAgY29uc3QgbWVtUmVjb3JkcyA9IGNyZWF0ZU1lbW9yeVJlY29yZDxzdHJpbmcsIExvY2F0aW9uPFM+Pihpbml0TG9jYXRpb24sIGNyZWF0ZVBhdGgpO1xyXG5cclxuICBjb25zdCB0cmFuc2l0aW9uTWFuYWdlciA9IG5ldyBUcmFuc2l0aW9uTWFuYWdlcjxTPigpO1xyXG5cclxuICBmdW5jdGlvbiBjcmVhdGVIcmVmKGxvY2F0aW9uOiBMb2NhdGlvbjxTPikge1xyXG4gICAgY29uc3QgdGFnID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignYmFzZScpO1xyXG4gICAgY29uc3QgYmFzZSA9IHRhZyAmJiB0YWcuZ2V0QXR0cmlidXRlKCdocmVmJykgPyBzdHJpcEhhc2god2luZG93LmxvY2F0aW9uLmhyZWYpIDogJyc7XHJcbiAgICByZXR1cm4gYmFzZSArICcjJyArIHBhdGhFbmNvZGVyKGJhc2VuYW1lICsgY3JlYXRlUGF0aChsb2NhdGlvbikpO1xyXG4gIH1cclxuXHJcbiAgbGV0IGZvcmNlTmV4dFBvcCA9IGZhbHNlO1xyXG4gIGxldCBpZ25vcmVQYXRoOiBudWxsIHwgc3RyaW5nID0gbnVsbDtcclxuXHJcbiAgY29uc3QgeyBnbywgZ29CYWNrLCBnb0ZvcndhcmQsIGxpc3RlbiwgYmxvY2ssIGdldFVwZGF0ZVN0YXRlRnVuYyB9ID0gZ2V0QmFzZUhpc3RvcnkoXHJcbiAgICB0cmFuc2l0aW9uTWFuYWdlcixcclxuICAgIHNldExpc3RlbmVyLFxyXG4gICAgYnJvd3Nlckhpc3RvcnksXHJcbiAgKTtcclxuXHJcbiAgY29uc3QgaGlzdG9yeTogSGlzdG9yeTxTPiA9IHtcclxuICAgIGFjdGlvbjogQWN0aW9uLnBvcCxcclxuICAgIGxlbmd0aDogYnJvd3Nlckhpc3RvcnkubGVuZ3RoLFxyXG4gICAgbG9jYXRpb246IGluaXRMb2NhdGlvbixcclxuICAgIGdvLFxyXG4gICAgZ29CYWNrLFxyXG4gICAgZ29Gb3J3YXJkLFxyXG4gICAgcHVzaCxcclxuICAgIHJlcGxhY2UsXHJcbiAgICBsaXN0ZW4sXHJcbiAgICBibG9jayxcclxuICAgIGNyZWF0ZUhyZWYsXHJcbiAgfTtcclxuXHJcbiAgY29uc3QgdXBkYXRlU3RhdGUgPSBnZXRVcGRhdGVTdGF0ZUZ1bmMoaGlzdG9yeSk7XHJcblxyXG4gIGZ1bmN0aW9uIHB1c2godG86IFRvLCBzdGF0ZT86IFMpIHtcclxuICAgIHdhcm5pbmcoc3RhdGUgIT09IHVuZGVmaW5lZCwgJ0hhc2ggaGlzdG9yeSBkb2VzIG5vdCBzdXBwb3J0IHN0YXRlLCBpdCB3aWxsIGJlIGlnbm9yZWQnKTtcclxuXHJcbiAgICBjb25zdCBhY3Rpb24gPSBBY3Rpb24ucHVzaDtcclxuICAgIGNvbnN0IGxvY2F0aW9uID0gY3JlYXRlTG9jYXRpb248Uz4oaGlzdG9yeS5sb2NhdGlvbiwgdG8sIHVuZGVmaW5lZCwgJycpO1xyXG5cclxuICAgIHRyYW5zaXRpb25NYW5hZ2VyLmNvbmZpcm1KdW1wVG8obG9jYXRpb24sIGFjdGlvbiwgZ2V0VXNlckNvbmZpcm1hdGlvbiwgaXNKdW1wID0+IHtcclxuICAgICAgaWYgKCFpc0p1bXApIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgcGF0aCA9IGNyZWF0ZVBhdGgobG9jYXRpb24pO1xyXG4gICAgICBjb25zdCBlbmNvZGVkUGF0aCA9IHBhdGhFbmNvZGVyKGJhc2VuYW1lICsgcGF0aCk7XHJcbiAgICAgIC8vIOWJjeWQjmhhc2jkuI3kuIDmoLfmiY3ov5vooYzot7PovaxcclxuICAgICAgaWYgKGdldEhhc2hDb250ZW50KHdpbmRvdy5sb2NhdGlvbi5ocmVmKSAhPT0gZW5jb2RlZFBhdGgpIHtcclxuICAgICAgICBpZ25vcmVQYXRoID0gZW5jb2RlZFBhdGg7XHJcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLmhhc2ggPSBlbmNvZGVkUGF0aDtcclxuXHJcbiAgICAgICAgbWVtUmVjb3Jkcy5hZGRSZWNvcmQoaGlzdG9yeS5sb2NhdGlvbiwgbG9jYXRpb24sIGFjdGlvbik7XHJcblxyXG4gICAgICAgIHVwZGF0ZVN0YXRlKHsgYWN0aW9uLCBsb2NhdGlvbiB9KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB1cGRhdGVTdGF0ZSh1bmRlZmluZWQpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGZ1bmN0aW9uIHJlcGxhY2UodG86IFRvLCBzdGF0ZT86IFMpIHtcclxuICAgIHdhcm5pbmcoc3RhdGUgIT09IHVuZGVmaW5lZCwgJ0hhc2ggaGlzdG9yeSBkb2VzIG5vdCBzdXBwb3J0IHN0YXRlLCBpdCB3aWxsIGJlIGlnbm9yZWQnKTtcclxuICAgIGNvbnN0IGFjdGlvbiA9IEFjdGlvbi5yZXBsYWNlO1xyXG4gICAgY29uc3QgbG9jYXRpb24gPSBjcmVhdGVMb2NhdGlvbjxTPihoaXN0b3J5LmxvY2F0aW9uLCB0bywgdW5kZWZpbmVkLCAnJyk7XHJcblxyXG4gICAgdHJhbnNpdGlvbk1hbmFnZXIuY29uZmlybUp1bXBUbyhsb2NhdGlvbiwgYWN0aW9uLCBnZXRVc2VyQ29uZmlybWF0aW9uLCBpc0p1bXAgPT4ge1xyXG4gICAgICBpZiAoIWlzSnVtcCkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBwYXRoID0gY3JlYXRlUGF0aChsb2NhdGlvbik7XHJcbiAgICAgIGNvbnN0IGVuY29kZWRQYXRoID0gcGF0aEVuY29kZXIoYmFzZW5hbWUgKyBwYXRoKTtcclxuICAgICAgaWYgKGdldEhhc2hDb250ZW50KHdpbmRvdy5sb2NhdGlvbi5ocmVmKSAhPT0gZW5jb2RlZFBhdGgpIHtcclxuICAgICAgICBpZ25vcmVQYXRoID0gcGF0aDtcclxuICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVwbGFjZShzdHJpcEhhc2god2luZG93LmxvY2F0aW9uLmhyZWYpICsgJyMnICsgZW5jb2RlZFBhdGgpO1xyXG4gICAgICB9XHJcbiAgICAgIG1lbVJlY29yZHMuYWRkUmVjb3JkKGhpc3RvcnkubG9jYXRpb24sIGxvY2F0aW9uLCBhY3Rpb24pO1xyXG4gICAgICB1cGRhdGVTdGF0ZSh7IGFjdGlvbiwgbG9jYXRpb24gfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGZ1bmN0aW9uIGhhbmRsZUhhc2hDaGFuZ2UoKSB7XHJcbiAgICBjb25zdCBoYXNoUGF0aCA9IGdldEhhc2hDb250ZW50KHdpbmRvdy5sb2NhdGlvbi5ocmVmKTtcclxuICAgIGNvbnN0IGVuY29kZWRQYXRoID0gcGF0aEVuY29kZXIoaGFzaFBhdGgpO1xyXG4gICAgaWYgKGhhc2hQYXRoICE9PSBlbmNvZGVkUGF0aCkge1xyXG4gICAgICB3aW5kb3cubG9jYXRpb24ucmVwbGFjZShzdHJpcEhhc2god2luZG93LmxvY2F0aW9uLmhyZWYpICsgJyMnICsgZW5jb2RlZFBhdGgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgbG9jYXRpb24gPSBnZXRMb2NhdGlvbigpO1xyXG4gICAgICBjb25zdCBwcmV2TG9jYXRpb24gPSBoaXN0b3J5LmxvY2F0aW9uO1xyXG4gICAgICBpZiAoIWZvcmNlTmV4dFBvcCAmJiBpc0xvY2F0aW9uRXF1YWwobG9jYXRpb24sIHByZXZMb2NhdGlvbikpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGlnbm9yZVBhdGggPT09IGNyZWF0ZVBhdGgobG9jYXRpb24pKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGlnbm9yZVBhdGggPSBudWxsO1xyXG4gICAgICBoYW5kbGVQb3BTdGF0ZShsb2NhdGlvbik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiBoYW5kbGVQb3BTdGF0ZShsb2NhdGlvbjogTG9jYXRpb248Uz4pIHtcclxuICAgIGlmIChmb3JjZU5leHRQb3ApIHtcclxuICAgICAgZm9yY2VOZXh0UG9wID0gZmFsc2U7XHJcbiAgICAgIHVwZGF0ZVN0YXRlKHVuZGVmaW5lZCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCBhY3Rpb24gPSBBY3Rpb24ucG9wO1xyXG5cclxuICAgICAgY29uc3QgY2FsbGJhY2sgPSAoaXNKdW1wOiBib29sZWFuKSA9PiB7XHJcbiAgICAgICAgaWYgKGlzSnVtcCkge1xyXG4gICAgICAgICAgdXBkYXRlU3RhdGUoeyBhY3Rpb246IGFjdGlvbiwgbG9jYXRpb246IGxvY2F0aW9uIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXZlcnRQb3BTdGF0ZShsb2NhdGlvbik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9O1xyXG5cclxuICAgICAgdHJhbnNpdGlvbk1hbmFnZXIuY29uZmlybUp1bXBUbyhsb2NhdGlvbiwgYWN0aW9uLCBnZXRVc2VyQ29uZmlybWF0aW9uLCBjYWxsYmFjayk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyDlnKjot7PovazooYzkuLrooqtCbG9ja+WQju+8jOeUqEhpc3RvcnkuZ28oKei3s+i9rOWbnuS5i+WJjeeahOmhtemdolxyXG4gIGZ1bmN0aW9uIHJldmVydFBvcFN0YXRlKGZvcm06IExvY2F0aW9uPFM+KSB7XHJcbiAgICBjb25zdCB0byA9IGhpc3RvcnkubG9jYXRpb247XHJcbiAgICBjb25zdCBkZWx0YSA9IG1lbVJlY29yZHMuZ2V0RGVsdGEodG8sIGZvcm0pO1xyXG4gICAgaWYgKGRlbHRhICE9PSAwKSB7XHJcbiAgICAgIGdvKGRlbHRhKTtcclxuICAgICAgZm9yY2VOZXh0UG9wID0gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGxldCBsaXN0ZW5lckNvdW50ID0gMDtcclxuXHJcbiAgZnVuY3Rpb24gc2V0TGlzdGVuZXIoZGVsdGE6IG51bWJlcikge1xyXG4gICAgbGlzdGVuZXJDb3VudCArPSBkZWx0YTtcclxuICAgIGlmIChsaXN0ZW5lckNvdW50ID09PSAxICYmIGRlbHRhID09PSAxKSB7XHJcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKEV2ZW50VHlwZS5IYXNoQ2hhbmdlLCBoYW5kbGVIYXNoQ2hhbmdlKTtcclxuICAgIH0gZWxzZSBpZiAobGlzdGVuZXJDb3VudCA9PT0gMCkge1xyXG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihFdmVudFR5cGUuSGFzaENoYW5nZSwgaGFuZGxlSGFzaENoYW5nZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZXR1cm4gaGlzdG9yeTtcclxufVxyXG4iLCJpbXBvcnQgeyBjcmVhdGVDb250ZXh0IH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyBIaXN0b3J5LCBMb2NhdGlvbiB9IGZyb20gJy4vaW5kZXgnO1xyXG5pbXBvcnQgeyBNYXRjaGVkIH0gZnJvbSAnLi9tYXRjaGVyL3BhcnNlcic7XHJcblxyXG5mdW5jdGlvbiBjcmVhdGVOYW1lZENvbnRleHQ8VD4obmFtZTogc3RyaW5nLCBkZWZhdWx0VmFsdWU6IFQpIHtcclxuICBjb25zdCBjb250ZXh0ID0gY3JlYXRlQ29udGV4dDxUPihkZWZhdWx0VmFsdWUpO1xyXG4gIGNvbnRleHQuZGlzcGxheU5hbWUgPSBuYW1lO1xyXG4gIHJldHVybiBjb250ZXh0O1xyXG59XHJcblxyXG5leHBvcnQgdHlwZSBSb3V0ZXJDb250ZXh0VmFsdWUgPSB7XHJcbiAgaGlzdG9yeTogSGlzdG9yeTtcclxuICBsb2NhdGlvbjogTG9jYXRpb247XHJcbiAgbWF0Y2g6IE1hdGNoZWQgfCBudWxsO1xyXG59O1xyXG5cclxuY29uc3QgUm91dGVyQ29udGV4dCA9IGNyZWF0ZU5hbWVkQ29udGV4dDxSb3V0ZXJDb250ZXh0VmFsdWU+KCdSb3V0ZXInLCB7fSBhcyBhbnkpO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgUm91dGVyQ29udGV4dDsiLCJpbXBvcnQgeyBNYXRjaGVkLCBQYXJhbXMgfSBmcm9tICcuL3BhcnNlcic7XHJcblxyXG5leHBvcnQgdHlwZSBUb2tlbiA9IHtcclxuICB0eXBlOiBUb2tlblR5cGU7XHJcbiAgdmFsdWU6IHN0cmluZztcclxufTtcclxuXHJcbmV4cG9ydCBlbnVtIFRva2VuVHlwZSB7XHJcbiAgRGVsaW1pdGVyID0gJ2RlbGltaXRlcicsXHJcbiAgU3RhdGljID0gJ3N0YXRpYycsXHJcbiAgUGFyYW0gPSAncGFyYW0nLFxyXG4gIFdpbGRDYXJkID0gJ3dpbGRjYXJkJyxcclxuICBMQnJhY2tldCA9ICcoJyxcclxuICBSQnJhY2tldCA9ICcpJyxcclxuICBQYXR0ZXJuID0gJ3BhdHRlcm4nLFxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFBhcnNlcjxQPiB7XHJcbiAgcmVnZXhwOiBSZWdFeHA7XHJcblxyXG4gIGtleXM6IHN0cmluZ1tdO1xyXG5cclxuICBwYXJzZSh1cmw6IHN0cmluZyk6IE1hdGNoZWQ8UD4gfCBudWxsO1xyXG5cclxuICBjb21waWxlKHBhcmFtczogUGFyYW1zPFA+KTogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgdHlwZSBQYXJzZXJPcHRpb24gPSB7XHJcbiAgLy8g5piv5ZCm5aSn5bCP5YaZ5pWP5oSfXHJcbiAgY2FzZVNlbnNpdGl2ZT86IGJvb2xlYW47XHJcbiAgLy8g5piv5ZCm5ZCv55So5Lil5qC85qih5byPXHJcbiAgc3RyaWN0TW9kZT86IGJvb2xlYW47XHJcbiAgLy8g57K+5YeG5Yy56YWNIOWFvOWuuSBSZWFjdC1Sb3V0ZXJWNVxyXG4gIGV4YWN0PzogYm9vbGVhbjtcclxufTtcclxuXHJcbnR5cGUgQ2xlYXJMZWFkaW5nPFUgZXh0ZW5kcyBzdHJpbmc+ID0gVSBleHRlbmRzIGAvJHtpbmZlciBSfWAgPyBDbGVhckxlYWRpbmc8Uj4gOiBVO1xyXG50eXBlIENsZWFyVGFpbGluZzxVIGV4dGVuZHMgc3RyaW5nPiA9IFUgZXh0ZW5kcyBgJHtpbmZlciBMfS9gID8gQ2xlYXJUYWlsaW5nPEw+IDogVTtcclxuXHJcbnR5cGUgUGFyc2VQYXJhbTxQYXJhbSBleHRlbmRzIHN0cmluZz4gPSBQYXJhbSBleHRlbmRzIGA6JHtpbmZlciBSfWBcclxuICA/IHtcclxuICAgIFtLIGluIFJdOiBzdHJpbmc7XHJcbiAgfVxyXG4gIDoge307XHJcblxyXG50eXBlIE1lcmdlUGFyYW1zPE9uZVBhcmFtIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiwgT3RoZXJQYXJhbSBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4+ID0ge1xyXG4gIHJlYWRvbmx5IFtLZXkgaW4ga2V5b2YgT25lUGFyYW0gfCBrZXlvZiBPdGhlclBhcmFtXT86IHN0cmluZztcclxufTtcclxuXHJcbnR5cGUgUGFyc2VVUkxTdHJpbmc8U3RyIGV4dGVuZHMgc3RyaW5nPiA9IFN0ciBleHRlbmRzIGAke2luZmVyIFBhcmFtfS8ke2luZmVyIFJlc3R9YFxyXG4gID8gTWVyZ2VQYXJhbXM8UGFyc2VQYXJhbTxQYXJhbT4sIFBhcnNlVVJMU3RyaW5nPENsZWFyTGVhZGluZzxSZXN0Pj4+XHJcbiAgOiBQYXJzZVBhcmFtPFN0cj47XHJcblxyXG4vLyDop6PmnpBVUkzkuK3nmoTliqjmgIHlj4LmlbDvvIzku6Xlrp7njrBUeXBlU2NyaXB05o+Q56S65Yqf6IO9XHJcbmV4cG9ydCB0eXBlIEdldFVSTFBhcmFtczxVIGV4dGVuZHMgc3RyaW5nPiA9IFBhcnNlVVJMU3RyaW5nPENsZWFyTGVhZGluZzxDbGVhclRhaWxpbmc8VT4+PjtcclxuIiwiLyoqXHJcbiAqIEBkZXNjcmlwdGlvbiDlsIZ1cmzkuK3nmoQvL+i9rOaNouS4ui9cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBjbGVhblBhdGgocGF0aDogc3RyaW5nKTogc3RyaW5nIHtcclxuICByZXR1cm4gcGF0aC5yZXBsYWNlKC9cXC8rL2csICcvJyk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzY29yZUNvbXBhcmUoc2NvcmUxOiBudW1iZXJbXSwgc2NvcmUyOiBudW1iZXJbXSk6IG51bWJlciB7XHJcbiAgY29uc3Qgc2NvcmUxTGVuZ3RoID0gc2NvcmUxLmxlbmd0aDtcclxuICBjb25zdCBzY29yZTJMZW5ndGggPSBzY29yZTIubGVuZ3RoO1xyXG4gIGNvbnN0IGVuZCA9IE1hdGgubWluKHNjb3JlMUxlbmd0aCwgc2NvcmUyTGVuZ3RoKTtcclxuICBmb3IgKGxldCBpID0gMDsgaSA8IGVuZDsgaSsrKSB7XHJcbiAgICBjb25zdCBkZWx0YSA9IHNjb3JlMltpXSAtIHNjb3JlMVtpXTtcclxuICAgIGlmIChkZWx0YSAhPT0gMCkge1xyXG4gICAgICByZXR1cm4gZGVsdGE7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGlmIChzY29yZTFMZW5ndGggPT09IHNjb3JlMkxlbmd0aCkge1xyXG4gICAgcmV0dXJuIDA7XHJcbiAgfVxyXG4gIHJldHVybiBzY29yZTFMZW5ndGggPiBzY29yZTJMZW5ndGggPyAtMSA6IDE7XHJcbn1cclxuXHJcbi8vIOaKiuato+WImeihqOi+vuW8j+eahOeJueauiuespuWPt+WKoOS4pOS4quWPjeaWnOadoOi/m+ihjOi9rOS5iVxyXG5leHBvcnQgZnVuY3Rpb24gZXNjYXBlU3RyKHN0cjogc3RyaW5nKSB7XHJcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC8oWy4rKj89XiE6JHt9KClbXFxdfC9cXFxcXSkvZywgJ1xcXFwkMScpO1xyXG59XHJcbiIsImltcG9ydCB7IFRva2VuLCBUb2tlblR5cGUgfSBmcm9tICcuL3R5cGVzJztcclxuaW1wb3J0IHsgY2xlYW5QYXRoIH0gZnJvbSAnLi91dGlscyc7XHJcblxyXG5jb25zdCB2YWxpZENoYXIgPSAvW14vOiooKV0vO1xyXG5cclxuLy8g5a+5VXJs5qih5p2/6L+b6KGM6K+N5rOV6Kej5p6Q77yM6Kej5p6Q57uT5p6c5Li6VG9rZW5zXHJcbmV4cG9ydCBmdW5jdGlvbiBsZXhlcihwYXRoOiBzdHJpbmcpOiBUb2tlbltdIHtcclxuICBjb25zdCB0b2tlbnM6IFRva2VuW10gPSBbXTtcclxuXHJcbiAgaWYgKCFwYXRoKSB7XHJcbiAgICByZXR1cm4gdG9rZW5zO1xyXG4gIH1cclxuXHJcbiAgbGV0IHVybFBhdGggPSBjbGVhblBhdGgocGF0aCk7XHJcbiAgaWYgKHVybFBhdGggIT09ICcqJyAmJiAhdXJsUGF0aC5zdGFydHNXaXRoKCcvJykpIHtcclxuICAgIHRocm93IG5ldyBFcnJvcihgVXJsIG11c3Qgc3RhcnQgd2l0aCBcIi9cIi5gKTtcclxuICB9XHJcblxyXG4gIGNvbnN0IGdldExpdGVyYWwgPSAoKSA9PiB7XHJcbiAgICBsZXQgbmFtZSA9ICcnO1xyXG4gICAgd2hpbGUgKGkgPCB1cmxQYXRoLmxlbmd0aCAmJiB2YWxpZENoYXIudGVzdCh1cmxQYXRoW2ldKSkge1xyXG4gICAgICBuYW1lICs9IHVybFBhdGhbaV07XHJcbiAgICAgIHNraXBDaGFyKDEpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5hbWU7XHJcbiAgfTtcclxuXHJcbiAgY29uc3Qgc2tpcENoYXIgPSAoc3RlcDogbnVtYmVyKSA9PiB7XHJcbiAgICBpICs9IHN0ZXA7XHJcbiAgfTtcclxuXHJcbiAgbGV0IGkgPSAwO1xyXG4gIHdoaWxlIChpIDwgdXJsUGF0aC5sZW5ndGgpIHtcclxuICAgIGNvbnN0IGN1ckNoYXIgPSB1cmxQYXRoW2ldO1xyXG4gICAgY29uc3QgcHJldkNoYXIgPSB1cmxQYXRoW2kgLSAxXTtcclxuXHJcbiAgICBpZiAoY3VyQ2hhciA9PT0gJy8nKSB7XHJcbiAgICAgIHRva2Vucy5wdXNoKHsgdHlwZTogVG9rZW5UeXBlLkRlbGltaXRlciwgdmFsdWU6IHVybFBhdGhbaV0gfSk7XHJcbiAgICAgIHNraXBDaGFyKDEpO1xyXG4gICAgICBjb250aW51ZTtcclxuICAgIH1cclxuICAgIC8vIGR5bmFtaWMgcGFyYW1zICgvOmEpXHJcbiAgICBpZiAocHJldkNoYXIgPT09ICcvJyAmJiBjdXJDaGFyID09PSAnOicpIHtcclxuICAgICAgc2tpcENoYXIoMSk7XHJcbiAgICAgIHRva2Vucy5wdXNoKHsgdHlwZTogVG9rZW5UeXBlLlBhcmFtLCB2YWx1ZTogZ2V0TGl0ZXJhbCgpIH0pO1xyXG4gICAgICBjb250aW51ZTtcclxuICAgIH1cclxuICAgIC8vIHdpbGRDYXJkIHBhcmFtcyAoLzoqKVxyXG4gICAgaWYgKChwcmV2Q2hhciA9PT0gJy8nIHx8IHByZXZDaGFyID09PSB1bmRlZmluZWQpICYmIGN1ckNoYXIgPT09ICcqJykge1xyXG4gICAgICB0b2tlbnMucHVzaCh7IHR5cGU6IFRva2VuVHlwZS5XaWxkQ2FyZCwgdmFsdWU6IHVybFBhdGhbaV0gfSk7XHJcbiAgICAgIHNraXBDaGFyKDEpO1xyXG4gICAgICBjb250aW51ZTtcclxuICAgIH1cclxuICAgIC8vIHN0YXRpYyBwYXJhbXNcclxuICAgIGlmIChwcmV2Q2hhciA9PT0gJy8nICYmIHZhbGlkQ2hhci50ZXN0KGN1ckNoYXIpKSB7XHJcbiAgICAgIHRva2Vucy5wdXNoKHsgdHlwZTogVG9rZW5UeXBlLlN0YXRpYywgdmFsdWU6IGdldExpdGVyYWwoKSB9KTtcclxuICAgICAgY29udGludWU7XHJcbiAgICB9XHJcbiAgICBpZiAoY3VyQ2hhciA9PT0gJygnKSB7XHJcbiAgICAgIHRva2Vucy5wdXNoKHsgdHlwZTogVG9rZW5UeXBlLkxCcmFja2V0LCB2YWx1ZTogJygnIH0pO1xyXG4gICAgICBza2lwQ2hhcigxKTtcclxuICAgICAgY29udGludWU7XHJcbiAgICB9XHJcbiAgICBpZiAoY3VyQ2hhciA9PT0gJyknKSB7XHJcbiAgICAgIHRva2Vucy5wdXNoKHsgdHlwZTogVG9rZW5UeXBlLlJCcmFja2V0LCB2YWx1ZTogJyknIH0pO1xyXG4gICAgICBza2lwQ2hhcigxKTtcclxuICAgICAgY29udGludWU7XHJcbiAgICB9XHJcbiAgICBpZiAodmFsaWRDaGFyLnRlc3QoY3VyQ2hhcikpIHtcclxuICAgICAgdG9rZW5zLnB1c2goeyB0eXBlOiBUb2tlblR5cGUuUGF0dGVybiwgdmFsdWU6IGdldExpdGVyYWwoKSB9KTtcclxuICAgICAgY29udGludWU7XHJcbiAgICB9XHJcbiAgICAvLyDot7Pov4fpnZ7ms5XlrZfnrKZcclxuICAgIHNraXBDaGFyKDEpO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHRva2VucztcclxufVxyXG4iLCJpbXBvcnQgeyBHZXRVUkxQYXJhbXMsIFBhcnNlciwgUGFyc2VyT3B0aW9uLCBUb2tlblR5cGUgfSBmcm9tICcuL3R5cGVzJztcclxuaW1wb3J0IHsgbGV4ZXIgfSBmcm9tICcuL2xleGVyJztcclxuaW1wb3J0IHsgZXNjYXBlU3RyLCBzY29yZUNvbXBhcmUgfSBmcm9tICcuL3V0aWxzJztcclxuXHJcbi8vIOS4jeWQjOexu+Wei+WPguaVsOeahOWMuemFjeW+l+WIhlxyXG5lbnVtIE1hdGNoU2NvcmUge1xyXG4gIC8vIOWbuuWumuWPguaVsFxyXG4gIHN0YXRpYyA9IDEwLFxyXG4gIC8vIOWKqOaAgeWPguaVsFxyXG4gIHBhcmFtID0gNixcclxuICAvLyDpgJrphY3nrKblj4LmlbBcclxuICB3aWxkY2FyZCA9IDMsXHJcbiAgcGxhY2Vob2xkZXIgPSAtMSxcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgUGFyYW1zPFA+ID0geyBbSyBpbiBrZXlvZiBQXT86IFBbS10gfTtcclxuXHJcbi8vIOWFvOWuuSByZWFjdCB2NSBtYXRjaGVk57G75Z6LXHJcbmV4cG9ydCB0eXBlIE1hdGNoZWQ8UCA9IGFueT4gPSB7XHJcbiAgc2NvcmU6IG51bWJlcltdO1xyXG4gIHBhcmFtczogUGFyYW1zPFA+O1xyXG4gIHBhdGg6IHN0cmluZztcclxuICB1cmw6IHN0cmluZztcclxuICBpc0V4YWN0OiBib29sZWFuO1xyXG59O1xyXG5cclxuY29uc3QgZGVmYXVsdE9wdGlvbjogUmVxdWlyZWQ8UGFyc2VyT3B0aW9uPiA9IHtcclxuICAvLyB1cmzljLnphY3ml7bmmK/lkKblpKflsI/lhpnmlY/mhJ9cclxuICBjYXNlU2Vuc2l0aXZlOiB0cnVlLFxyXG4gIC8vIOaYr+WQpuS4peagvOWMuemFjXVybOe7k+WwvueahC9cclxuICBzdHJpY3RNb2RlOiBmYWxzZSxcclxuICAvLyDmmK/lkKblrozlhajnsr7noa7ljLnphY1cclxuICBleGFjdDogZmFsc2UsXHJcbn07XHJcbi8vIOato+WImeihqOi+vuW8j+S4remcgOimgei9rOS5ieeahOWtl+esplxyXG5jb25zdCBSRUdFWF9DSEFSU19SRSA9IC9bLisqP14ke30oKVtcXF0vXFxcXF0vZztcclxuLy8g55So5LqO5Yy56YWN5Lik5LiqLy/kuK3nmoTnmoTlgLxcclxuY29uc3QgQkFTRV9QQVJBTV9QQVRURVJOID0gJ1teL10rJztcclxuXHJcbmNvbnN0IERlZmF1bHREZWxpbWl0ZXIgPSAnLyM/JztcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQYXRoUGFyc2VyPFN0ciBleHRlbmRzIHN0cmluZz4ocGF0aG5hbWU6IFN0ciwgb3B0aW9uPzogUGFyc2VyT3B0aW9uKTogUGFyc2VyPEdldFVSTFBhcmFtczxTdHI+PjtcclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVBhdGhQYXJzZXI8UCA9IHVua25vd24+KHBhdGhuYW1lOiBzdHJpbmcsIG9wdGlvbj86IFBhcnNlck9wdGlvbik6IFBhcnNlcjxQPjtcclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVBhdGhQYXJzZXI8UCA9IHVua25vd24+KHBhdGhuYW1lOiBzdHJpbmcsIG9wdGlvbjogUGFyc2VyT3B0aW9uID0gZGVmYXVsdE9wdGlvbik6IFBhcnNlcjxQPiB7XHJcbiAgY29uc3Qge1xyXG4gICAgY2FzZVNlbnNpdGl2ZSA9IGRlZmF1bHRPcHRpb24uY2FzZVNlbnNpdGl2ZSxcclxuICAgIHN0cmljdE1vZGUgPSBkZWZhdWx0T3B0aW9uLnN0cmljdE1vZGUsXHJcbiAgICBleGFjdCA9IGRlZmF1bHRPcHRpb24uZXhhY3QsXHJcbiAgfSA9IG9wdGlvbjtcclxuICAvKipcclxuICAgKiBVUkzljLnphY3mlbTkvZPmtYHnqItcclxuICAgKiAxLuivjeazleino+aekO+8jOWwhlVSTOaooeadv+ino+aekOS4ulRva2VuXHJcbiAgICogMi7kvb/nlKhUb2tlbueUn+aIkOato+WImeihqOi+vuW8j1xyXG4gICAqIDMu5Yip55So5q2j5YiZ6KGo6L6+5byP6Kej5p6QVVJM5Lit5Y+C5pWw5oiW5aGr5YWFVVJM5qih5p2/XHJcbiAgICovXHJcbiAgbGV0IHBhdHRlcm4gPSAnXic7XHJcbiAgY29uc3Qga2V5czogc3RyaW5nW10gPSBbXTtcclxuICBjb25zdCBzY29yZXM6IG51bWJlcltdID0gW107XHJcblxyXG4gIGNvbnN0IHRva2VucyA9IGxleGVyKHBhdGhuYW1lKTtcclxuICBjb25zdCBvbmx5SGFzV2lsZENhcmQgPSB0b2tlbnMubGVuZ3RoID09PSAxICYmIHRva2Vuc1swXS50eXBlID09PSBUb2tlblR5cGUuV2lsZENhcmQ7XHJcbiAgY29uc3QgdG9rZW5Db3VudCA9IHRva2Vucy5sZW5ndGg7XHJcbiAgY29uc3QgbGFzdFRva2VuID0gdG9rZW5zW3Rva2VuQ291bnQgLSAxXTtcclxuXHJcbiAgZm9yIChsZXQgdG9rZW5JZHggPSAwOyB0b2tlbklkeCA8IHRva2VuQ291bnQ7IHRva2VuSWR4KyspIHtcclxuICAgIGNvbnN0IHRva2VuID0gdG9rZW5zW3Rva2VuSWR4XTtcclxuICAgIGNvbnN0IG5leHRUb2tlbiA9IHRva2Vuc1t0b2tlbklkeCArIDFdO1xyXG4gICAgc3dpdGNoICh0b2tlbi50eXBlKSB7XHJcbiAgICAgIGNhc2UgVG9rZW5UeXBlLkRlbGltaXRlcjpcclxuICAgICAgICBwYXR0ZXJuICs9ICcvJztcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBUb2tlblR5cGUuU3RhdGljOlxyXG4gICAgICAgIHBhdHRlcm4gKz0gdG9rZW4udmFsdWUucmVwbGFjZShSRUdFWF9DSEFSU19SRSwgJ1xcXFwkJicpO1xyXG4gICAgICAgIHNjb3Jlcy5wdXNoKE1hdGNoU2NvcmUuc3RhdGljKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBUb2tlblR5cGUuUGFyYW06XHJcbiAgICAgICAgbGV0IHBhcmFtUmVnZXhwID0gJyc7XHJcbiAgICAgICAgaWYgKG5leHRUb2tlbiAmJiBuZXh0VG9rZW4udHlwZSA9PT0gVG9rZW5UeXBlLkxCcmFja2V0KSB7XHJcbiAgICAgICAgICAvLyDot7Pov4flvZPliY1Ub2tlbuWSjOW3puaLrOWPt1xyXG4gICAgICAgICAgdG9rZW5JZHggKz0gMjtcclxuICAgICAgICAgIHdoaWxlICh0b2tlbnNbdG9rZW5JZHhdLnR5cGUgIT09IFRva2VuVHlwZS5SQnJhY2tldCkge1xyXG4gICAgICAgICAgICBwYXJhbVJlZ2V4cCArPSB0b2tlbnNbdG9rZW5JZHhdLnZhbHVlO1xyXG4gICAgICAgICAgICB0b2tlbklkeCsrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBwYXR0ZXJuICs9IHBhcmFtUmVnZXhwID8gYCgoPzoke3BhcmFtUmVnZXhwfSkpYCA6IGAoJHtCQVNFX1BBUkFNX1BBVFRFUk59KWA7XHJcbiAgICAgICAga2V5cy5wdXNoKHRva2VuLnZhbHVlKTtcclxuICAgICAgICBzY29yZXMucHVzaChNYXRjaFNjb3JlLnBhcmFtKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBUb2tlblR5cGUuV2lsZENhcmQ6XHJcbiAgICAgICAga2V5cy5wdXNoKHRva2VuLnZhbHVlKTtcclxuICAgICAgICBwYXR0ZXJuICs9IGAoKD86JHtCQVNFX1BBUkFNX1BBVFRFUk59KSR7b25seUhhc1dpbGRDYXJkID8gJz8nIDogJyd9KD86Lyg/OiR7QkFTRV9QQVJBTV9QQVRURVJOfSkpKilgO1xyXG4gICAgICAgIHNjb3Jlcy5wdXNoKG9ubHlIYXNXaWxkQ2FyZCA/IE1hdGNoU2NvcmUud2lsZGNhcmQgOiBNYXRjaFNjb3JlLnBsYWNlaG9sZGVyKTtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICB9XHJcbiAgY29uc3QgaXNXaWxkQ2FyZCA9IGxhc3RUb2tlbi50eXBlID09PSBUb2tlblR5cGUuV2lsZENhcmQ7XHJcblxyXG4gIGlmICghaXNXaWxkQ2FyZCAmJiAhZXhhY3QpIHtcclxuICAgIGlmICghc3RyaWN0TW9kZSkge1xyXG4gICAgICBwYXR0ZXJuICs9IGAoPzpbJHtlc2NhcGVTdHIoRGVmYXVsdERlbGltaXRlcil9XSg/PSQpKT9gO1xyXG4gICAgfVxyXG4gICAgaWYgKGxhc3RUb2tlbi50eXBlICE9PSBUb2tlblR5cGUuRGVsaW1pdGVyKSB7XHJcbiAgICAgIHBhdHRlcm4gKz0gYCg/PVske2VzY2FwZVN0cihEZWZhdWx0RGVsaW1pdGVyKX1dfCQpYDtcclxuICAgIH1cclxuICB9IGVsc2Uge1xyXG4gICAgcGF0dGVybiArPSBzdHJpY3RNb2RlID8gJyQnIDogYFske2VzY2FwZVN0cihEZWZhdWx0RGVsaW1pdGVyKX1dPyRgO1xyXG4gIH1cclxuXHJcbiAgY29uc3QgZmxhZyA9IGNhc2VTZW5zaXRpdmUgPyAnJyA6ICdpJztcclxuICBjb25zdCByZWdleHAgPSBuZXcgUmVnRXhwKHBhdHRlcm4sIGZsYWcpO1xyXG5cclxuICAvKipcclxuICAgKiBAZGVzY3JpcHRpb24g5qC55o2u57uZ5a6aUGF0dGVybuino+aekHBhdGhcclxuICAgKi9cclxuICBmdW5jdGlvbiBwYXJzZShwYXRoOiBzdHJpbmcpOiBNYXRjaGVkPFA+IHwgbnVsbCB7XHJcbiAgICBjb25zdCByZU1hdGNoID0gcGF0aC5tYXRjaChyZWdleHApO1xyXG5cclxuICAgIGlmICghcmVNYXRjaCkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIGNvbnN0IG1hdGNoZWRQYXRoID0gcmVNYXRjaFswXTtcclxuICAgIGxldCBwYXJhbXM6IFBhcmFtczxQPiA9IHt9O1xyXG4gICAgbGV0IHBhcnNlU2NvcmU6IG51bWJlcltdID0gQXJyYXkuZnJvbShzY29yZXMpO1xyXG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCByZU1hdGNoLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCBwYXJhbSA9IHJlTWF0Y2hbaV07XHJcbiAgICAgIGxldCBrZXkgPSBrZXlzW2kgLSAxXTtcclxuICAgICAgaWYgKGtleSA9PT0gJyonICYmIHBhcmFtKSB7XHJcbiAgICAgICAgbGV0IHZhbHVlID0gcGFyYW0uc3BsaXQoJy8nKTtcclxuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkocGFyYW1zWycqJ10pKSB7XHJcbiAgICAgICAgICBwYXJhbXNbJyonXSA9IHZhbHVlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBwYXJhbXNbJyonXS5wdXNoKC4uLnZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8g5a6M5oiQ6YCa6YWN56ym5Y+C5pWw6Kej5p6Q5ZCO5bCGcGxhY2Vob2xkZXLmm7/mjaLkuLp3aWxkY2FyZOWPguaVsOeahOWIhuWAvFxyXG4gICAgICAgIHBhcnNlU2NvcmUuc3BsaWNlKFxyXG4gICAgICAgICAgc2NvcmVzLmluZGV4T2YoTWF0Y2hTY29yZS5wbGFjZWhvbGRlciksXHJcbiAgICAgICAgICAxLFxyXG4gICAgICAgICAgLi4ubmV3IEFycmF5KHZhbHVlLmxlbmd0aCkuZmlsbChNYXRjaFNjb3JlLndpbGRjYXJkKSxcclxuICAgICAgICApO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHBhcmFtc1trZXldID0gcGFyYW0gPyBwYXJhbSA6IFtdO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgaXNFeGFjdCA9IHBhdGggPT09IG1hdGNoZWRQYXRoO1xyXG4gICAgY29uc3QgdXJsID0gcGF0aCA9PT0gJy8nICYmIG1hdGNoZWRQYXRoID09PSAnJyA/ICcvJyA6IG1hdGNoZWRQYXRoO1xyXG4gICAgcmV0dXJuIHsgaXNFeGFjdDogaXNFeGFjdCwgcGF0aDogcGF0aG5hbWUsIHVybDogdXJsLCBzY29yZTogcGFyc2VTY29yZSwgcGFyYW1zOiBwYXJhbXMgfTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBkZXNjcmlwdGlvbiDkvb/nlKjnu5nlrprlj4LmlbDloavlhYVwYXR0ZXJu77yM5b6X5Yiw55uu5qCHVVJMXHJcbiAgICovXHJcbiAgZnVuY3Rpb24gY29tcGlsZShwYXJhbXM6IFBhcmFtczxQPik6IHN0cmluZyB7XHJcbiAgICBsZXQgcGF0aCA9ICcnO1xyXG4gICAgZm9yIChjb25zdCB0b2tlbiBvZiB0b2tlbnMpIHtcclxuICAgICAgc3dpdGNoICh0b2tlbi50eXBlKSB7XHJcbiAgICAgICAgY2FzZSBUb2tlblR5cGUuU3RhdGljOlxyXG4gICAgICAgICAgcGF0aCArPSB0b2tlbi52YWx1ZTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgVG9rZW5UeXBlLlBhcmFtOlxyXG4gICAgICAgICAgaWYgKCFwYXJhbXNbdG9rZW4udmFsdWVdKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUGFyYW0gaXMgaW52YWxpZC4nKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHBhdGggKz0gcGFyYW1zW3Rva2VuLnZhbHVlXTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgVG9rZW5UeXBlLldpbGRDYXJkOlxyXG4gICAgICAgICAgbGV0IHdpbGRDYXJkID0gcGFyYW1zWycqJ107XHJcbiAgICAgICAgICBpZiAod2lsZENhcmQgaW5zdGFuY2VvZiBBcnJheSkge1xyXG4gICAgICAgICAgICBwYXRoICs9IHdpbGRDYXJkLmpvaW4oJy8nKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHBhdGggKz0gd2lsZENhcmQ7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFRva2VuVHlwZS5EZWxpbWl0ZXI6XHJcbiAgICAgICAgICBwYXRoICs9IHRva2VuLnZhbHVlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBwYXRoO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHtcclxuICAgIGdldCByZWdleHAoKSB7XHJcbiAgICAgIHJldHVybiByZWdleHA7XHJcbiAgICB9LFxyXG4gICAgZ2V0IGtleXMoKSB7XHJcbiAgICAgIHJldHVybiBrZXlzO1xyXG4gICAgfSxcclxuICAgIGNvbXBpbGUsXHJcbiAgICBwYXJzZSxcclxuICB9O1xyXG59XHJcblxyXG4vKipcclxuICogQGRlc2NyaXB0aW9uIOS+neasoeS9v+eUqHBhdGhuYW1l5LiOcGF0dGVybui/m+ihjOWMuemFje+8jOagueaNruWMuemFjeWIhuaVsOWPluW+l+WIhuaVsOacgOmrmOe7k+aenFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIG1hdGNoUGF0aDxQID0gYW55PihcclxuICBwYXRobmFtZTogc3RyaW5nLFxyXG4gIHBhdHRlcm46IHN0cmluZyB8IHN0cmluZ1tdLFxyXG4gIG9wdGlvbj86IFBhcnNlck9wdGlvbixcclxuKTogTWF0Y2hlZDxQPiB8IG51bGwge1xyXG4gIGNvbnN0IHBhdHRlcm5zID0gQXJyYXkuaXNBcnJheShwYXR0ZXJuKSA/IFsuLi5wYXR0ZXJuXSA6IFtwYXR0ZXJuXTtcclxuICBjb25zdCBtYXRjaGVkUmVzdWx0czogTWF0Y2hlZDxQPltdID0gW107XHJcbiAgZm9yIChjb25zdCBpdGVtIG9mIHBhdHRlcm5zKSB7XHJcbiAgICBjb25zdCBwYXJzZXIgPSBjcmVhdGVQYXRoUGFyc2VyKGl0ZW0sIG9wdGlvbik7XHJcbiAgICBjb25zdCBtYXRjaGVkID0gcGFyc2VyLnBhcnNlKHBhdGhuYW1lKTtcclxuICAgIGlmIChtYXRjaGVkKSB7XHJcbiAgICAgIG1hdGNoZWRSZXN1bHRzLnB1c2gobWF0Y2hlZCk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHJldHVybiAhbWF0Y2hlZFJlc3VsdHMubGVuZ3RoID8gbnVsbCA6IG1hdGNoZWRSZXN1bHRzLnNvcnQoKGEsIGIpID0+IHNjb3JlQ29tcGFyZShhLnNjb3JlLCBiLnNjb3JlKSlbMF07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZVBhdGg8UCA9IGFueT4ocGF0aDogc3RyaW5nLCBwYXJhbXM6IFBhcmFtczxQPikge1xyXG4gIGNvbnN0IHBhcnNlciA9IGNyZWF0ZVBhdGhQYXJzZXIocGF0aCk7XHJcbiAgcmV0dXJuIHBhcnNlci5jb21waWxlKHBhcmFtcyk7XHJcbn0iLCJpbXBvcnQgeyB1c2VDb250ZXh0IH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgUm91dGVyQ29udGV4dCBmcm9tICcuL2NvbnRleHQnO1xyXG5pbXBvcnQgeyBNYXRjaGVkLCBtYXRjaFBhdGgsIFBhcmFtcyB9IGZyb20gJy4vbWF0Y2hlci9wYXJzZXInO1xyXG5pbXBvcnQgeyBIaXN0b3J5IH0gZnJvbSAnLi4vaGlzdG9yeS90eXBlcyc7XHJcbmltcG9ydCB7IExvY2F0aW9uIH0gZnJvbSAnLi9pbmRleCc7XHJcblxyXG5mdW5jdGlvbiB1c2VIaXN0b3J5PFM+KCk6IEhpc3Rvcnk8Uz47XHJcbmZ1bmN0aW9uIHVzZUhpc3RvcnkoKSB7XHJcbiAgcmV0dXJuIHVzZUNvbnRleHQoUm91dGVyQ29udGV4dCkuaGlzdG9yeTtcclxufVxyXG5cclxuZnVuY3Rpb24gdXNlTG9jYXRpb248Uz4oKTogTG9jYXRpb248Uz47XHJcbmZ1bmN0aW9uIHVzZUxvY2F0aW9uKCkge1xyXG4gIHJldHVybiB1c2VDb250ZXh0KFJvdXRlckNvbnRleHQpLmxvY2F0aW9uO1xyXG59XHJcblxyXG5mdW5jdGlvbiB1c2VQYXJhbXM8UD4oKTogUGFyYW1zPFA+IHwge307XHJcbmZ1bmN0aW9uIHVzZVBhcmFtcygpIHtcclxuICBjb25zdCBtYXRjaCA9IHVzZUNvbnRleHQoUm91dGVyQ29udGV4dCkubWF0Y2g7XHJcbiAgcmV0dXJuIG1hdGNoID8gbWF0Y2gucGFyYW1zIDoge307XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHVzZVJvdXRlTWF0Y2g8UD4ocGF0aD86IHN0cmluZyk6IE1hdGNoZWQ8UD4gfCBudWxsO1xyXG5mdW5jdGlvbiB1c2VSb3V0ZU1hdGNoKHBhdGg/OiBzdHJpbmcpIHtcclxuICBjb25zdCBwYXRobmFtZSA9IHVzZUxvY2F0aW9uKCkucGF0aG5hbWU7XHJcbiAgY29uc3QgbWF0Y2ggPSB1c2VDb250ZXh0KFJvdXRlckNvbnRleHQpLm1hdGNoO1xyXG4gIGlmIChwYXRoKSB7XHJcbiAgICByZXR1cm4gbWF0Y2hQYXRoKHBhdGhuYW1lLCBwYXRoKTtcclxuICB9XHJcbiAgcmV0dXJuIG1hdGNoO1xyXG59XHJcblxyXG5leHBvcnQgeyB1c2VIaXN0b3J5LCB1c2VMb2NhdGlvbiwgdXNlUGFyYW1zLCB1c2VSb3V0ZU1hdGNoIH07XHJcbiIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcclxuaW1wb3J0IHsgSGlzdG9yeSwgTG9jYXRpb24gfSBmcm9tICcuL2luZGV4JztcclxuaW1wb3J0IHsgTWF0Y2hlZCwgbWF0Y2hQYXRoIH0gZnJvbSAnLi9tYXRjaGVyL3BhcnNlcic7XHJcbmltcG9ydCB7IHVzZUNvbnRleHQsIENoaWxkcmVuLCBjcmVhdGVFbGVtZW50IH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgUm91dGVyQ29udGV4dCBmcm9tICcuL2NvbnRleHQnO1xyXG5pbXBvcnQgeyBHZXRVUkxQYXJhbXMgfSBmcm9tICcuL21hdGNoZXIvdHlwZXMnO1xyXG5cclxuZXhwb3J0IHR5cGUgUm91dGVDb21wb25lbnRQcm9wczxQIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IHt9LCBTID0gdW5rbm93bj4gPSBSb3V0ZUNoaWxkcmVuUHJvcHM8UCwgUz47XHJcblxyXG5leHBvcnQgdHlwZSBSb3V0ZUNoaWxkcmVuUHJvcHM8UCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fSwgUyA9IHVua25vd24+ID0ge1xyXG4gIGhpc3Rvcnk6IEhpc3Rvcnk8Uz47XHJcbiAgbG9jYXRpb246IExvY2F0aW9uPFM+O1xyXG4gIG1hdGNoOiBNYXRjaGVkPFA+IHwgbnVsbFxyXG59XHJcblxyXG5leHBvcnQgdHlwZSBSb3V0ZVByb3BzPFAgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge30sIFBhdGggZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmc+ID0ge1xyXG4gIGxvY2F0aW9uPzogTG9jYXRpb247XHJcbiAgY29tcG9uZW50PzogUmVhY3QuQ29tcG9uZW50VHlwZTxSb3V0ZUNvbXBvbmVudFByb3BzPFA+PiB8IFJlYWN0LkNvbXBvbmVudFR5cGU8YW55PiB8IHVuZGVmaW5lZDtcclxuICBjaGlsZHJlbj86ICgocHJvcHM6IFJvdXRlQ2hpbGRyZW5Qcm9wczxQPikgPT4gUmVhY3QuUmVhY3ROb2RlKSB8IFJlYWN0LlJlYWN0Tm9kZTtcclxuICByZW5kZXI/OiAocHJvcHM6IFJvdXRlQ29tcG9uZW50UHJvcHM8UD4pID0+IFJlYWN0LlJlYWN0Tm9kZTtcclxuICBwYXRoPzogUGF0aCB8IFBhdGhbXTtcclxuICBleGFjdD86IGJvb2xlYW47XHJcbiAgc2Vuc2l0aXZlPzogYm9vbGVhbjtcclxuICBzdHJpY3Q/OiBib29sZWFuO1xyXG4gIGNvbXB1dGVkPzogTWF0Y2hlZDxQPjtcclxufTtcclxuXHJcbmZ1bmN0aW9uIFJvdXRlPFBhdGggZXh0ZW5kcyBzdHJpbmcsIFAgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gR2V0VVJMUGFyYW1zPFBhdGg+Pihwcm9wczogUm91dGVQcm9wczxQLCBQYXRoPikge1xyXG4gIGNvbnN0IGNvbnRleHQgPSB1c2VDb250ZXh0KFJvdXRlckNvbnRleHQpO1xyXG5cclxuICBjb25zdCB7IGNvbXB1dGVkLCBsb2NhdGlvbiwgcGF0aCB9ID0gcHJvcHM7XHJcbiAgbGV0IHsgY2hpbGRyZW4sIGNvbXBvbmVudCwgcmVuZGVyIH0gPSBwcm9wcztcclxuICBsZXQgbWF0Y2g6IE1hdGNoZWQ8UD4gfCBudWxsO1xyXG5cclxuICBjb25zdCByb3V0ZUxvY2F0aW9uID0gbG9jYXRpb24gfHwgY29udGV4dC5sb2NhdGlvbjtcclxuICBpZiAoY29tcHV0ZWQpIHtcclxuICAgIG1hdGNoID0gY29tcHV0ZWQ7XHJcbiAgfSBlbHNlIGlmIChwYXRoKSB7XHJcbiAgICBtYXRjaCA9IG1hdGNoUGF0aDxQPihyb3V0ZUxvY2F0aW9uLnBhdGhuYW1lLCBwYXRoKTtcclxuICB9IGVsc2Uge1xyXG4gICAgbWF0Y2ggPSBjb250ZXh0Lm1hdGNoO1xyXG4gIH1cclxuICBjb25zdCBuZXdQcm9wcyA9IHsgLi4uY29udGV4dCwgbG9jYXRpb246IHJvdXRlTG9jYXRpb24sIG1hdGNoOiBtYXRjaCB9O1xyXG5cclxuICBpZiAoQXJyYXkuaXNBcnJheShjaGlsZHJlbikgJiYgQ2hpbGRyZW4uY291bnQoY2hpbGRyZW4pID09PSAwKSB7XHJcbiAgICBjaGlsZHJlbiA9IG51bGw7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiDmjInpobrluo/ojrflj5bpnIDopoHmuLLmn5PnmoTnu4Tku7ZcclxuICAgKiAxLmNoaWxkcmVuXHJcbiAgICogMi5jb21wb25lbnRcclxuICAgKiAzLnJlbmRlclxyXG4gICAqIOmDveayoeacieWMuemFjeWIsOi/lOWbnk51bGxcclxuICAgKi9cclxuICBjb25zdCBnZXRDaGlsZHJlbiA9ICgpOiBSZWFjdC5SZWFjdE5vZGUgfCBudWxsID0+IHtcclxuICAgIC8vIOWmguaenCBtYXRjaCDlrZjlnKhcclxuICAgIGlmIChuZXdQcm9wcy5tYXRjaCkge1xyXG4gICAgICBpZiAoY2hpbGRyZW4pIHtcclxuICAgICAgICBpZiAodHlwZW9mIGNoaWxkcmVuID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICByZXR1cm4gY2hpbGRyZW4obmV3UHJvcHMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gY2hpbGRyZW47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChjb21wb25lbnQpIHtcclxuICAgICAgICByZXR1cm4gY3JlYXRlRWxlbWVudChjb21wb25lbnQsIG5ld1Byb3BzKTtcclxuICAgICAgfSBlbHNlIGlmIChyZW5kZXIpIHtcclxuICAgICAgICByZXR1cm4gcmVuZGVyKG5ld1Byb3BzKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gbWF0Y2jkuLpudWxsXHJcbiAgICAgIGlmICh0eXBlb2YgY2hpbGRyZW4gPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICByZXR1cm4gY2hpbGRyZW4obmV3UHJvcHMpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIHJldHVybiA8Um91dGVyQ29udGV4dC5Qcm92aWRlciB2YWx1ZT17bmV3UHJvcHN9PntnZXRDaGlsZHJlbigpfTwvUm91dGVyQ29udGV4dC5Qcm92aWRlcj47XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFJvdXRlO1xyXG4iLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XHJcbmltcG9ydCB7IHVzZUxheW91dEVmZmVjdCwgdXNlTWVtbywgdXNlUmVmLCB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0JztcclxuXHJcbmltcG9ydCB7IEhpc3RvcnksIExvY2F0aW9uIH0gZnJvbSAnLi4vaGlzdG9yeS90eXBlcyc7XHJcblxyXG5pbXBvcnQgUm91dGVyQ29udGV4dCwgeyBSb3V0ZXJDb250ZXh0VmFsdWUgfSBmcm9tICcuL2NvbnRleHQnO1xyXG5cclxuZXhwb3J0IHR5cGUgUm91dGVyUHJvcHMgPSB7XHJcbiAgaGlzdG9yeTogSGlzdG9yeTtcclxuICBjaGlsZHJlbj86IFJlYWN0LlJlYWN0Tm9kZTtcclxufTtcclxuXHJcbmZ1bmN0aW9uIFJvdXRlcjxQIGV4dGVuZHMgUm91dGVyUHJvcHM+KHByb3BzOiBQKSB7XHJcbiAgY29uc3QgeyBoaXN0b3J5LCBjaGlsZHJlbiA9IG51bGwgfSA9IHByb3BzO1xyXG4gIGNvbnN0IFtsb2NhdGlvbiwgc2V0TG9jYXRpb25dID0gdXNlU3RhdGUocHJvcHMuaGlzdG9yeS5sb2NhdGlvbik7XHJcbiAgY29uc3QgcGVuZGluZ0xvY2F0aW9uID0gdXNlUmVmPExvY2F0aW9uIHwgbnVsbD4obnVsbCk7XHJcblxyXG4gIC8vIOWcqFJvdXRlcuWKoOi9veaXtuWwseebkeWQrGhpc3RvcnnlnLDlnYDlj5jljJbvvIzku6Xkv53or4HlnKjlp4vmuLLmn5Pml7bph43lrprlkJHog73mraPnoa7op6blj5FcclxuICBsZXQgdW5MaXN0ZW46IG51bGwgfCAoKCkgPT4gdm9pZCkgPSBoaXN0b3J5Lmxpc3RlbihhcmcgPT4ge1xyXG4gICAgcGVuZGluZ0xvY2F0aW9uLmN1cnJlbnQgPSBhcmcubG9jYXRpb247XHJcbiAgfSk7XHJcblxyXG4gIC8vIOaooeaLn2NvbXBvbmVudERpZE1vdW505ZKMY29tcG9uZW50V2lsbFVubW91bnRcclxuICB1c2VMYXlvdXRFZmZlY3QoKCkgPT4ge1xyXG4gICAgaWYgKHVuTGlzdGVuKSB7XHJcbiAgICAgIHVuTGlzdGVuKCk7XHJcbiAgICB9XHJcbiAgICAvLyDnm5HlkKxoaXN0b3J55Lit55qE5L2N572u5Y+Y5YyWXHJcbiAgICB1bkxpc3RlbiA9IGhpc3RvcnkubGlzdGVuKGFyZyA9PiB7XHJcbiAgICAgIHNldExvY2F0aW9uKGFyZy5sb2NhdGlvbik7XHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAocGVuZGluZ0xvY2F0aW9uLmN1cnJlbnQpIHtcclxuICAgICAgc2V0TG9jYXRpb24ocGVuZGluZ0xvY2F0aW9uLmN1cnJlbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiAoKSA9PiB7XHJcbiAgICAgIGlmICh1bkxpc3Rlbikge1xyXG4gICAgICAgIHVuTGlzdGVuKCk7XHJcbiAgICAgICAgdW5MaXN0ZW4gPSBudWxsO1xyXG4gICAgICAgIHBlbmRpbmdMb2NhdGlvbi5jdXJyZW50ID0gbnVsbDtcclxuICAgICAgfVxyXG4gICAgfTtcclxuICB9LCBbXSk7XHJcblxyXG4gIGNvbnN0IGluaXRDb250ZXh0VmFsdWU6IFJvdXRlckNvbnRleHRWYWx1ZSA9IHVzZU1lbW8oXHJcbiAgICAoKSA9PiAoe1xyXG4gICAgICBoaXN0b3J5OiBoaXN0b3J5LFxyXG4gICAgICBsb2NhdGlvbjogbG9jYXRpb24sXHJcbiAgICAgIG1hdGNoOiB7IGlzRXhhY3Q6IGxvY2F0aW9uLnBhdGhuYW1lID09PSAnLycsIHBhcmFtczoge30sIHBhdGg6ICcvJywgc2NvcmU6IFtdLCB1cmw6ICcvJyB9LFxyXG4gICAgfSksXHJcbiAgICBbbG9jYXRpb25dLFxyXG4gICk7XHJcblxyXG4gIHJldHVybiA8Um91dGVyQ29udGV4dC5Qcm92aWRlciB2YWx1ZT17aW5pdENvbnRleHRWYWx1ZX0gY2hpbGRyZW49e2NoaWxkcmVufSAvPjtcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgUm91dGVyO1xyXG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShzb3VyY2UsIGV4Y2x1ZGVkKSB7XG4gIGlmIChzb3VyY2UgPT0gbnVsbCkgcmV0dXJuIHt9O1xuICB2YXIgdGFyZ2V0ID0ge307XG4gIHZhciBzb3VyY2VLZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTtcbiAgdmFyIGtleSwgaTtcbiAgZm9yIChpID0gMDsgaSA8IHNvdXJjZUtleXMubGVuZ3RoOyBpKyspIHtcbiAgICBrZXkgPSBzb3VyY2VLZXlzW2ldO1xuICAgIGlmIChleGNsdWRlZC5pbmRleE9mKGtleSkgPj0gMCkgY29udGludWU7XG4gICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgfVxuICByZXR1cm4gdGFyZ2V0O1xufSIsImltcG9ydCB7IHVzZUxheW91dEVmZmVjdCwgdXNlUmVmIH0gZnJvbSAncmVhY3QnO1xyXG5cclxuZXhwb3J0IHR5cGUgTGlmZUN5Y2xlUHJvcHMgPSB7XHJcbiAgb25Nb3VudD86ICgpID0+IHZvaWQ7XHJcbiAgb25VcGRhdGU/OiAocHJldlByb3BzPzogTGlmZUN5Y2xlUHJvcHMpID0+IHZvaWQ7XHJcbiAgb25Vbm1vdW50PzogKCkgPT4gdm9pZDtcclxuICBkYXRhPzogYW55O1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIExpZmVDeWNsZShwcm9wczogTGlmZUN5Y2xlUHJvcHMpIHtcclxuICAvLyDkvb/nlKhyZWbkv53lrZjkuIrkuIDmrKHnmoRwcm9wc++8jOmYsuatoumHjeaWsOa4suafk1xyXG4gIGNvbnN0IHByZXZQcm9wcyA9IHVzZVJlZjxMaWZlQ3ljbGVQcm9wcyB8IG51bGw+KG51bGwpO1xyXG4gIGNvbnN0IGlzTW91bnQgPSB1c2VSZWYoZmFsc2UpO1xyXG5cclxuICBjb25zdCB7IG9uTW91bnQsIG9uVXBkYXRlLCBvblVubW91bnQgfSA9IHByb3BzO1xyXG5cclxuICB1c2VMYXlvdXRFZmZlY3QoKCkgPT4ge1xyXG4gICAgLy8g6aaW5qyh5oyC6L29IOaooeaLn2NvbXBvbmVudERpZE1vdW50XHJcbiAgICBpZiAoIWlzTW91bnQuY3VycmVudCkge1xyXG4gICAgICBpc01vdW50LmN1cnJlbnQgPSB0cnVlO1xyXG4gICAgICBpZiAob25Nb3VudCkge1xyXG4gICAgICAgIG9uTW91bnQoKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8g5LiN5piv6aaW5qyh5riy5p+TIOaooeaLn2NvbXBvbmVudERpZFVwZGF0ZVxyXG4gICAgICBpZiAob25VcGRhdGUpIHtcclxuICAgICAgICBwcmV2UHJvcHMuY3VycmVudCA/IG9uVXBkYXRlKHByZXZQcm9wcy5jdXJyZW50KSA6IG9uVXBkYXRlKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHByZXZQcm9wcy5jdXJyZW50ID0gcHJvcHM7XHJcbiAgfSk7XHJcblxyXG4gIC8vIOaooeaLn2NvbXBvbmVudFdpbGxVbm1vdW50XHJcbiAgdXNlTGF5b3V0RWZmZWN0KCgpID0+IHtcclxuICAgIHJldHVybiAoKSA9PiB7XHJcbiAgICAgIGlmIChvblVubW91bnQpIHtcclxuICAgICAgICBvblVubW91bnQoKTtcclxuICAgICAgfVxyXG4gICAgfTtcclxuICB9LCBbXSk7XHJcblxyXG4gIHJldHVybiBudWxsO1xyXG59XHJcbiIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcclxuaW1wb3J0IHsgdXNlQ29udGV4dCB9IGZyb20gJ3JlYWN0JztcclxuaW1wb3J0IFJvdXRlckNvbnRleHQgZnJvbSAnLi9jb250ZXh0JztcclxuaW1wb3J0IHsgTGlmZUN5Y2xlLCBMaWZlQ3ljbGVQcm9wcyB9IGZyb20gJy4vbGlmZUN5Y2xlSG9vayc7XHJcbmltcG9ydCB7IE1hdGNoZWQsIGNyZWF0ZVBhdGhQYXJzZXIgfSBmcm9tICcuL21hdGNoZXIvcGFyc2VyJztcclxuaW1wb3J0IHsgYWRkSGVhZFNsYXNoLCBpc0xvY2F0aW9uRXF1YWwsIHBhcnNlUGF0aCB9IGZyb20gJy4uL2hpc3RvcnkvdXRpbHMnO1xyXG5pbXBvcnQgeyBMb2NhdGlvbiB9IGZyb20gJy4vaW5kZXgnO1xyXG5cclxuZXhwb3J0IHR5cGUgUmVkaXJlY3RQcm9wcyA9IHtcclxuICB0bzogc3RyaW5nIHwgUGFydGlhbDxMb2NhdGlvbj47XHJcbiAgcHVzaD86IGJvb2xlYW47XHJcbiAgcGF0aD86IHN0cmluZztcclxuICBmcm9tPzogc3RyaW5nO1xyXG4gIGV4YWN0PzogYm9vbGVhbjtcclxuICBzdHJpY3Q/OiBib29sZWFuO1xyXG5cclxuICAvLyDnlLFTd2l0Y2jorqHnrpflvpfliLBcclxuICByZWFkb25seSBjb21wdXRlZD86IE1hdGNoZWQgfCBudWxsO1xyXG59O1xyXG5cclxuZnVuY3Rpb24gUmVkaXJlY3Q8UCBleHRlbmRzIFJlZGlyZWN0UHJvcHM+KHByb3BzOiBQKSB7XHJcbiAgY29uc3QgeyB0bywgcHVzaCA9IGZhbHNlLCBjb21wdXRlZCB9ID0gcHJvcHM7XHJcblxyXG4gIGNvbnN0IGNvbnRleHQgPSB1c2VDb250ZXh0KFJvdXRlckNvbnRleHQpO1xyXG4gIGNvbnN0IHsgaGlzdG9yeSB9ID0gY29udGV4dDtcclxuXHJcbiAgY29uc3QgY2FsY0xvY2F0aW9uID0gKCk6IFBhcnRpYWw8TG9jYXRpb24+ID0+IHtcclxuICAgIGlmIChjb21wdXRlZCkge1xyXG4gICAgICBpZiAodHlwZW9mIHRvID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgIGNvbnN0IHBhcnNlciA9IGNyZWF0ZVBhdGhQYXJzZXIodG8pO1xyXG4gICAgICAgIGNvbnN0IHRhcmdldCA9IHBhcnNlci5jb21waWxlKGNvbXB1dGVkLnBhcmFtcyk7XHJcbiAgICAgICAgcmV0dXJuIHBhcnNlUGF0aCh0YXJnZXQpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IHBhdGhuYW1lID0gdG8ucGF0aG5hbWUgPyBhZGRIZWFkU2xhc2godG8ucGF0aG5hbWUpIDogJy8nO1xyXG4gICAgICAgIGNvbnN0IHBhcnNlciA9IGNyZWF0ZVBhdGhQYXJzZXIocGF0aG5hbWUpO1xyXG4gICAgICAgIGNvbnN0IHRhcmdldCA9IHBhcnNlci5jb21waWxlKGNvbXB1dGVkLnBhcmFtcyk7XHJcbiAgICAgICAgcmV0dXJuIHsgLi4udG8sIHBhdGhuYW1lOiB0YXJnZXQgfTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHR5cGVvZiB0byA9PT0gJ3N0cmluZycgPyBwYXJzZVBhdGgodG8pIDogdG87XHJcbiAgfTtcclxuXHJcbiAgY29uc3QgbmF2aWdhdGUgPSBwdXNoID8gaGlzdG9yeS5wdXNoIDogaGlzdG9yeS5yZXBsYWNlO1xyXG4gIGNvbnN0IHsgc3RhdGUsIC4uLnBhdGggfSA9IGNhbGNMb2NhdGlvbigpO1xyXG5cclxuICBjb25zdCBvbk1vdW50RnVuYyA9ICgpID0+IHtcclxuICAgIG5hdmlnYXRlKHBhdGgsIHN0YXRlKTtcclxuICB9O1xyXG5cclxuICBjb25zdCBvblVwZGF0ZUZ1bmMgPSAocHJldlByb3BzPzogTGlmZUN5Y2xlUHJvcHMpID0+IHtcclxuICAgIC8vIOWmguaenOW9k+WJjemhtemdouS4jumHjeWumuWQkeWJjemhtemdouS4jeS4gOiHtO+8jOaJp+ihjOi3s+i9rFxyXG4gICAgY29uc3QgcHJldlBhdGggPSBwcmV2UHJvcHM/LmRhdGEgYXMgTG9jYXRpb247XHJcbiAgICBpZiAoIWlzTG9jYXRpb25FcXVhbChwcmV2UGF0aCwgcGF0aCkpIHtcclxuICAgICAgbmF2aWdhdGUocGF0aCwgc3RhdGUpO1xyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIHJldHVybiA8TGlmZUN5Y2xlIG9uTW91bnQ9e29uTW91bnRGdW5jfSBvblVwZGF0ZT17b25VcGRhdGVGdW5jfSBkYXRhPXtwYXRofSAvPjtcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgUmVkaXJlY3Q7XHJcbiIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcclxuaW1wb3J0IHsgdXNlQ29udGV4dCwgQ2hpbGRyZW4sIGlzVmFsaWRFbGVtZW50LCBjbG9uZUVsZW1lbnQgfSBmcm9tICdyZWFjdCc7XHJcblxyXG5pbXBvcnQgeyBMb2NhdGlvbiB9IGZyb20gJy4vaW5kZXgnO1xyXG5pbXBvcnQgUm91dGVyQ29udGV4dCBmcm9tICcuL2NvbnRleHQnO1xyXG5pbXBvcnQgeyBNYXRjaGVkLCBtYXRjaFBhdGggfSBmcm9tICcuL21hdGNoZXIvcGFyc2VyJztcclxuaW1wb3J0IFJvdXRlLCB7IFJvdXRlUHJvcHMgfSBmcm9tICcuL1JvdXRlJztcclxuaW1wb3J0IFJlZGlyZWN0LCB7IFJlZGlyZWN0UHJvcHMgfSBmcm9tICcuL1JlZGlyZWN0JztcclxuXHJcbmV4cG9ydCB0eXBlIFN3aXRjaFByb3BzID0ge1xyXG4gIGxvY2F0aW9uPzogTG9jYXRpb247XHJcbiAgY2hpbGRyZW4/OiBSZWFjdC5SZWFjdE5vZGU7XHJcbn07XHJcblxyXG5mdW5jdGlvbiBTd2l0Y2g8UCBleHRlbmRzIFN3aXRjaFByb3BzPihwcm9wczogUCk6IFJlYWN0LlJlYWN0RWxlbWVudCB8IG51bGwge1xyXG4gIGNvbnN0IGNvbnRleHQgPSB1c2VDb250ZXh0KFJvdXRlckNvbnRleHQpO1xyXG4gIGNvbnN0IGxvY2F0aW9uID0gcHJvcHMubG9jYXRpb24gfHwgY29udGV4dC5sb2NhdGlvbjtcclxuXHJcbiAgbGV0IGVsZW1lbnQ6IFJlYWN0LlJlYWN0RWxlbWVudCB8IG51bGwgPSBudWxsO1xyXG4gIGxldCBtYXRjaDogTWF0Y2hlZCB8IG51bGwgPSBudWxsO1xyXG5cclxuICAvLyDkvb/nlKhmb3JFYWNo5LiN5Lya57uZUmVhY3QuUmVhY3ROb2Rl5aKe5Yqga2V55bGe5oCnLOmYsuatoumHjeaWsOa4suafk1xyXG4gIENoaWxkcmVuLmZvckVhY2gocHJvcHMuY2hpbGRyZW4sIG5vZGUgPT4ge1xyXG4gICAgaWYgKG1hdGNoID09PSBudWxsICYmIGlzVmFsaWRFbGVtZW50KG5vZGUpKSB7XHJcbiAgICAgIGVsZW1lbnQgPSBub2RlO1xyXG5cclxuICAgICAgbGV0IHN0cmljdDogYm9vbGVhbiB8IHVuZGVmaW5lZDtcclxuICAgICAgbGV0IHNlbnNpdGl2ZTogYm9vbGVhbiB8IHVuZGVmaW5lZDtcclxuICAgICAgbGV0IHBhdGg6IHN0cmluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xyXG4gICAgICBsZXQgZnJvbTogc3RyaW5nIHwgdW5kZWZpbmVkO1xyXG5cclxuICAgICAgLy8gbm9kZeWPr+iDveaYr1JvdXRl5ZKMUmVkaXJlY3RcclxuICAgICAgaWYgKG5vZGUudHlwZSA9PT0gUm91dGUpIHtcclxuICAgICAgICBjb25zdCBwcm9wcyA9IG5vZGUucHJvcHMgYXMgUm91dGVQcm9wcztcclxuICAgICAgICBzdHJpY3QgPSBwcm9wcy5zdHJpY3Q7XHJcbiAgICAgICAgc2Vuc2l0aXZlID0gcHJvcHMuc2Vuc2l0aXZlO1xyXG4gICAgICAgIHBhdGggPSBwcm9wcy5wYXRoO1xyXG4gICAgICB9IGVsc2UgaWYgKG5vZGUudHlwZSA9PT0gUmVkaXJlY3QpIHtcclxuICAgICAgICBjb25zdCBwcm9wcyA9IG5vZGUucHJvcHMgYXMgUmVkaXJlY3RQcm9wcztcclxuICAgICAgICBwYXRoID0gcHJvcHMucGF0aDtcclxuICAgICAgICBzdHJpY3QgPSBwcm9wcy5zdHJpY3Q7XHJcbiAgICAgICAgZnJvbSA9IHByb3BzLmZyb207XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IGV4YWN0ID0gbm9kZS5wcm9wcy5leGFjdDtcclxuICAgICAgY29uc3QgdGFyZ2V0ID0gcGF0aCB8fCBmcm9tO1xyXG5cclxuICAgICAgLy8g5pu05paw5Yy56YWN54q25oCB77yM5LiA5pem5Yy56YWN5Yiw5YGc5q2i6YGN5Y6GXHJcbiAgICAgIGlmICh0YXJnZXQpIHtcclxuICAgICAgICBtYXRjaCA9IG1hdGNoUGF0aChsb2NhdGlvbi5wYXRobmFtZSwgdGFyZ2V0LCB7XHJcbiAgICAgICAgICBzdHJpY3RNb2RlOiBzdHJpY3QsXHJcbiAgICAgICAgICBjYXNlU2Vuc2l0aXZlOiBzZW5zaXRpdmUsXHJcbiAgICAgICAgICBleGFjdDogZXhhY3QsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgbWF0Y2ggPSBjb250ZXh0Lm1hdGNoO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfSk7XHJcblxyXG4gIGlmIChtYXRjaCAmJiBlbGVtZW50KSB7XHJcbiAgICAvLyDkvb/nlKhjbG9uZUVsZW1lbnTlpI3liLblt7LmnInnu4Tku7blubbmm7TmlrDlhbZQcm9wc1xyXG4gICAgcmV0dXJuIGNsb25lRWxlbWVudChlbGVtZW50LCB7IGxvY2F0aW9uOiBsb2NhdGlvbiwgY29tcHV0ZWQ6IG1hdGNoIH0pO1xyXG4gIH1cclxuICByZXR1cm4gbnVsbDtcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgU3dpdGNoO1xyXG4iLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XHJcbmltcG9ydCB7IHVzZUNvbnRleHQgfSBmcm9tICdyZWFjdCc7XHJcbmltcG9ydCB7IExpZmVDeWNsZSwgTGlmZUN5Y2xlUHJvcHMgfSBmcm9tICcuL2xpZmVDeWNsZUhvb2snO1xyXG5pbXBvcnQgeyBMb2NhdGlvbiB9IGZyb20gJy4vaW5kZXgnO1xyXG5pbXBvcnQgeyBBY3Rpb24gfSBmcm9tICcuLi9oaXN0b3J5L3R5cGVzJztcclxuaW1wb3J0IFJvdXRlckNvbnRleHQgZnJvbSAnLi9jb250ZXh0JztcclxuXHJcbnR5cGUgUHJvbXB0UHJvcHMgPSB7XHJcbiAgbWVzc2FnZT86IHN0cmluZyB8ICgobG9jYXRpb246IFBhcnRpYWw8TG9jYXRpb24+LCBhY3Rpb246IEFjdGlvbikgPT4gdm9pZCk7XHJcbiAgd2hlbj86IGJvb2xlYW4gfCAoKGxvY2F0aW9uOiBQYXJ0aWFsPExvY2F0aW9uPikgPT4gYm9vbGVhbik7XHJcbn07XHJcblxyXG5mdW5jdGlvbiBQcm9tcHQ8UCBleHRlbmRzIFByb21wdFByb3BzPihwcm9wczogUCkge1xyXG4gIGNvbnN0IGNvbnRleHQgPSB1c2VDb250ZXh0KFJvdXRlckNvbnRleHQpO1xyXG5cclxuICBjb25zdCB7IG1lc3NhZ2UsIHdoZW4gPSB0cnVlIH0gPSBwcm9wcztcclxuXHJcbiAgaWYgKCh0eXBlb2Ygd2hlbiA9PT0gJ2Z1bmN0aW9uJyAmJiB3aGVuKGNvbnRleHQubG9jYXRpb24pID09PSBmYWxzZSkgfHwgIXdoZW4pIHtcclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgY29uc3QgbmF2aWdhdGUgPSBjb250ZXh0Lmhpc3RvcnkuYmxvY2s7XHJcblxyXG4gIGxldCByZWxlYXNlOiAoKCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgY29uc3Qgb25Nb3VudEZ1bmMgPSAoKSA9PiB7XHJcbiAgICByZWxlYXNlID0gbWVzc2FnZSA/IG5hdmlnYXRlKG1lc3NhZ2UpIDogbnVsbDtcclxuICB9O1xyXG5cclxuICBjb25zdCBvblVwZGF0ZUZ1bmMgPSAocHJldlByb3BzPzogTGlmZUN5Y2xlUHJvcHMpID0+IHtcclxuICAgIGlmIChwcmV2UHJvcHMgJiYgcHJldlByb3BzLmRhdGEgIT09IG1lc3NhZ2UpIHtcclxuICAgICAgaWYgKHJlbGVhc2UpIHtcclxuICAgICAgICByZWxlYXNlKCk7XHJcbiAgICAgIH1cclxuICAgICAgcmVsZWFzZSA9IG1lc3NhZ2UgPyBuYXZpZ2F0ZShtZXNzYWdlKSA6IG51bGw7XHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgY29uc3Qgb25Vbm1vdW50RnVuYyA9ICgpID0+IHtcclxuICAgIGlmIChyZWxlYXNlKSB7XHJcbiAgICAgIHJlbGVhc2UoKTtcclxuICAgIH1cclxuICAgIHJlbGVhc2UgPSBudWxsO1xyXG4gIH07XHJcblxyXG4gIHJldHVybiA8TGlmZUN5Y2xlIG9uTW91bnQ9e29uTW91bnRGdW5jfSBvblVwZGF0ZT17b25VcGRhdGVGdW5jfSBvblVubW91bnQ9e29uVW5tb3VudEZ1bmN9IGRhdGE9e21lc3NhZ2V9IC8+O1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBQcm9tcHQ7XHJcbiIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcclxuaW1wb3J0IHsgdXNlQ29udGV4dCB9IGZyb20gJ3JlYWN0JztcclxuaW1wb3J0IFJvdXRlckNvbnRleHQgZnJvbSAnLi9jb250ZXh0JztcclxuXHJcbmZ1bmN0aW9uIHdpdGhSb3V0ZXI8QyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudFR5cGU+KENvbXBvbmVudDogQykge1xyXG5cclxuICBmdW5jdGlvbiBDb21wb25lbnRXaXRoUm91dGVyUHJvcChwcm9wczogYW55KSB7XHJcbiAgICBjb25zdCB7IGhpc3RvcnksIGxvY2F0aW9uLCBtYXRjaCB9ID0gdXNlQ29udGV4dChSb3V0ZXJDb250ZXh0KTtcclxuICAgIGNvbnN0IHJvdXRlUHJvcHMgPSB7IGhpc3Rvcnk6IGhpc3RvcnksIGxvY2F0aW9uOiBsb2NhdGlvbiwgbWF0Y2g6IG1hdGNoIH07XHJcblxyXG4gICAgcmV0dXJuIDxDb21wb25lbnQgey4uLnByb3BzfSB7Li4ucm91dGVQcm9wc30gLz47XHJcbiAgfVxyXG5cclxuICByZXR1cm4gQ29tcG9uZW50V2l0aFJvdXRlclByb3A7XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IHdpdGhSb3V0ZXI7IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyB1c2VSZWYgfSBmcm9tICdyZWFjdCc7XHJcbmltcG9ydCB7IEhpc3RvcnkgfSBmcm9tICcuLi9oaXN0b3J5L3R5cGVzJztcclxuaW1wb3J0IHsgQmFzZVJvdXRlclByb3BzIH0gZnJvbSAnLi9Ccm93c2VyUm91dGVyJztcclxuaW1wb3J0IHsgY3JlYXRlSGFzaEhpc3RvcnksIHVybEhhc2hUeXBlIH0gZnJvbSAnLi4vaGlzdG9yeS9oYXNoSGlzdG9yeSc7XHJcbmltcG9ydCBSb3V0ZXIgZnJvbSAnLi9Sb3V0ZXInO1xyXG5cclxuZXhwb3J0IHR5cGUgSGFzaFJvdXRlclByb3BzID0gQmFzZVJvdXRlclByb3BzICYge1xyXG4gIGhhc2hUeXBlOiB1cmxIYXNoVHlwZTtcclxufTtcclxuXHJcbmZ1bmN0aW9uIEhhc2hSb3V0ZXI8UCBleHRlbmRzIFBhcnRpYWw8SGFzaFJvdXRlclByb3BzPj4ocHJvcHM6IFApIHtcclxuICBsZXQgaGlzdG9yeVJlZiA9IHVzZVJlZjxIaXN0b3J5PigpO1xyXG4gIGlmIChoaXN0b3J5UmVmLmN1cnJlbnQgPT09IG51bGwgfHwgaGlzdG9yeVJlZi5jdXJyZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgIGhpc3RvcnlSZWYuY3VycmVudCA9IGNyZWF0ZUhhc2hIaXN0b3J5KHtcclxuICAgICAgYmFzZW5hbWU6IHByb3BzLmJhc2VuYW1lLFxyXG4gICAgICBnZXRVc2VyQ29uZmlybWF0aW9uOiBwcm9wcy5nZXRVc2VyQ29uZmlybWF0aW9uLFxyXG4gICAgICBoYXNoVHlwZTogcHJvcHMuaGFzaFR5cGUsXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHJldHVybiA8Um91dGVyIGhpc3Rvcnk9e2hpc3RvcnlSZWYuY3VycmVudH0+e3Byb3BzLmNoaWxkcmVufTwvUm91dGVyPjtcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgSGFzaFJvdXRlcjsiLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XHJcbmltcG9ydCB7IHVzZVJlZiwgUmVhY3ROb2RlIH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgUm91dGVyIGZyb20gJy4vUm91dGVyJztcclxuaW1wb3J0IHsgY3JlYXRlQnJvd3Nlckhpc3RvcnkgfSBmcm9tICcuLi9oaXN0b3J5L2Jyb3dlckhpc3RvcnknO1xyXG5pbXBvcnQgeyBDb25maXJtYXRpb25GdW5jLCBIaXN0b3J5IH0gZnJvbSAnLi4vaGlzdG9yeS90eXBlcyc7XHJcblxyXG5leHBvcnQgdHlwZSBCYXNlUm91dGVyUHJvcHMgPSB7XHJcbiAgYmFzZW5hbWU6IHN0cmluZztcclxuICBnZXRVc2VyQ29uZmlybWF0aW9uOiBDb25maXJtYXRpb25GdW5jO1xyXG4gIGNoaWxkcmVuPzogUmVhY3ROb2RlO1xyXG59O1xyXG5cclxuZXhwb3J0IHR5cGUgQnJvd3NlclJvdXRlclByb3BzID0gQmFzZVJvdXRlclByb3BzICYge1xyXG4gIGZvcmNlUmVmcmVzaDogYm9vbGVhbjtcclxufTtcclxuXHJcbmZ1bmN0aW9uIEJyb3dzZXJSb3V0ZXI8UCBleHRlbmRzIFBhcnRpYWw8QnJvd3NlclJvdXRlclByb3BzPj4ocHJvcHM6IFApIHtcclxuICAvLyDkvb/nlKhSZWbmjIHmnIlIaXN0b3J55a+56LGh77yM6Ziy5q2i6YeN5aSN5riy5p+TXHJcbiAgbGV0IGhpc3RvcnlSZWYgPSB1c2VSZWY8SGlzdG9yeT4oKTtcclxuXHJcbiAgaWYgKGhpc3RvcnlSZWYuY3VycmVudCA9PT0gbnVsbCB8fCBoaXN0b3J5UmVmLmN1cnJlbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgaGlzdG9yeVJlZi5jdXJyZW50ID0gY3JlYXRlQnJvd3Nlckhpc3Rvcnkoe1xyXG4gICAgICBiYXNlbmFtZTogcHJvcHMuYmFzZW5hbWUsXHJcbiAgICAgIGZvcmNlUmVmcmVzaDogcHJvcHMuZm9yY2VSZWZyZXNoLFxyXG4gICAgICBnZXRVc2VyQ29uZmlybWF0aW9uOiBwcm9wcy5nZXRVc2VyQ29uZmlybWF0aW9uLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gPFJvdXRlciBoaXN0b3J5PXtoaXN0b3J5UmVmLmN1cnJlbnR9Pntwcm9wcy5jaGlsZHJlbn08L1JvdXRlcj47XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IEJyb3dzZXJSb3V0ZXI7IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyB1c2VDb250ZXh0IH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgUm91dGVyQ29udGV4dCBmcm9tICcuL2NvbnRleHQnO1xyXG5pbXBvcnQgeyBMb2NhdGlvbiB9IGZyb20gJy4vaW5kZXgnO1xyXG5pbXBvcnQgeyBjcmVhdGVQYXRoLCBwYXJzZVBhdGggfSBmcm9tICcuLi9oaXN0b3J5L3V0aWxzJztcclxuaW1wb3J0IHsgUGF0aCB9IGZyb20gJy4uL2hpc3RvcnkvdHlwZXMnO1xyXG5cclxuZXhwb3J0IHR5cGUgTGlua1Byb3BzID0ge1xyXG4gIGNvbXBvbmVudD86IFJlYWN0LkNvbXBvbmVudFR5cGU8YW55PjtcclxuICB0bzogUGFydGlhbDxMb2NhdGlvbj4gfCBzdHJpbmcgfCAoKGxvY2F0aW9uOiBMb2NhdGlvbikgPT4gc3RyaW5nIHwgUGFydGlhbDxMb2NhdGlvbj4pO1xyXG4gIHJlcGxhY2U/OiBib29sZWFuO1xyXG4gIHRhZz86IHN0cmluZztcclxuICAvKipcclxuICAgKiBAZGVwcmVjYXRlZFxyXG4gICAqIFJlYWN0MTbku6XlkI7kuI3lho3pnIDopoHor6XlsZ7mgKdcclxuICAgKiovXHJcbiAgaW5uZXJSZWY/OiBSZWFjdC5SZWY8SFRNTEFuY2hvckVsZW1lbnQ+O1xyXG59ICYgUmVhY3QuQW5jaG9ySFRNTEF0dHJpYnV0ZXM8SFRNTEFuY2hvckVsZW1lbnQ+O1xyXG5cclxuY29uc3QgaXNNb2RpZmllZEV2ZW50ID0gKGV2ZW50OiBSZWFjdC5Nb3VzZUV2ZW50KSA9PiB7XHJcbiAgcmV0dXJuIGV2ZW50Lm1ldGFLZXkgfHwgZXZlbnQuYWx0S2V5IHx8IGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQuc2hpZnRLZXk7XHJcbn07XHJcblxyXG5jb25zdCBjaGVja1RhcmdldCA9ICh0YXJnZXQ/OiBSZWFjdC5IVE1MQXR0cmlidXRlQW5jaG9yVGFyZ2V0KSA9PiB7XHJcbiAgcmV0dXJuICF0YXJnZXQgfHwgdGFyZ2V0ID09PSAnX3NlbGYnO1xyXG59O1xyXG5cclxuXHJcbmZ1bmN0aW9uIExpbms8UCBleHRlbmRzIExpbmtQcm9wcz4ocHJvcHM6IFApIHtcclxuICBjb25zdCB7IHRvLCByZXBsYWNlLCBjb21wb25lbnQsIG9uQ2xpY2ssIHRhcmdldCwgLi4ub3RoZXIgfSA9IHByb3BzO1xyXG5cclxuICBjb25zdCB0YWcgPSBwcm9wcy50YWcgfHwgJ2EnO1xyXG5cclxuICBjb25zdCBjb250ZXh0ID0gdXNlQ29udGV4dChSb3V0ZXJDb250ZXh0KTtcclxuICBjb25zdCBoaXN0b3J5ID0gY29udGV4dC5oaXN0b3J5O1xyXG5cclxuICBsZXQgbG9jYXRpb24gPSB0eXBlb2YgdG8gPT09ICdmdW5jdGlvbicgPyB0byhjb250ZXh0LmxvY2F0aW9uKSA6IHRvO1xyXG5cclxuICBsZXQgc3RhdGU6IGFueTtcclxuICBsZXQgcGF0aDogUGFydGlhbDxQYXRoPjtcclxuICBpZiAodHlwZW9mIGxvY2F0aW9uID09PSAnc3RyaW5nJykge1xyXG4gICAgcGF0aCA9IHBhcnNlUGF0aChsb2NhdGlvbik7XHJcbiAgfSBlbHNlIHtcclxuICAgIGNvbnN0IHsgcGF0aG5hbWUsIGhhc2gsIHNlYXJjaCB9ID0gbG9jYXRpb247XHJcbiAgICBwYXRoID0geyBwYXRobmFtZSwgaGFzaCwgc2VhcmNoIH07XHJcbiAgICBzdGF0ZSA9IGxvY2F0aW9uLnN0YXRlO1xyXG4gIH1cclxuICBjb25zdCBocmVmID0gaGlzdG9yeS5jcmVhdGVIcmVmKHBhdGgpO1xyXG5cclxuICBjb25zdCBsaW5rQ2xpY2tFdmVudCA9IChldmVudDogUmVhY3QuTW91c2VFdmVudDxIVE1MQW5jaG9yRWxlbWVudD4pID0+IHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGlmIChvbkNsaWNrKSB7XHJcbiAgICAgICAgb25DbGljayhldmVudCk7XHJcbiAgICAgIH1cclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgdGhyb3cgZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIWV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQgJiYgZXZlbnQuYnV0dG9uID09PSAwICYmIGNoZWNrVGFyZ2V0KHRhcmdldCkgJiYgIWlzTW9kaWZpZWRFdmVudChldmVudCkpIHtcclxuICAgICAgLy8g5LiN5piv55u45ZCM55qE6Lev5b6E5omn6KGMcHVzaOaTjeS9nO+8jOaYr+ebuOWQjOeahOi3r+W+hOaJp+ihjHJlcGxhY2VcclxuICAgICAgY29uc3QgaXNTYW1lUGF0aCA9IGNyZWF0ZVBhdGgoY29udGV4dC5sb2NhdGlvbikgPT09IGNyZWF0ZVBhdGgocGF0aCk7XHJcbiAgICAgIGNvbnN0IG5hdmlnYXRlID0gcmVwbGFjZSB8fCBpc1NhbWVQYXRoID8gaGlzdG9yeS5yZXBsYWNlIDogaGlzdG9yeS5wdXNoO1xyXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICBuYXZpZ2F0ZShwYXRoLCBzdGF0ZSk7XHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgY29uc3QgbGlua1Byb3BzID0geyBocmVmOiBocmVmLCBvbkNsaWNrOiBsaW5rQ2xpY2tFdmVudCwgLi4ub3RoZXIgfTtcclxuICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudCh0YWcsIGxpbmtQcm9wcyk7XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IExpbms7IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyB1c2VDb250ZXh0IH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgdHlwZSB7IExpbmtQcm9wcyB9IGZyb20gJy4vTGluayc7XHJcbmltcG9ydCBMaW5rIGZyb20gJy4vTGluayc7XHJcbmltcG9ydCB7IExvY2F0aW9uLCBtYXRjaFBhdGggfSBmcm9tICcuL2luZGV4JztcclxuaW1wb3J0IHsgTWF0Y2hlZCB9IGZyb20gJy4vbWF0Y2hlci9wYXJzZXInO1xyXG5pbXBvcnQgQ29udGV4dCBmcm9tICcuL2NvbnRleHQnO1xyXG5pbXBvcnQgeyBwYXJzZVBhdGggfSBmcm9tICcuLi9oaXN0b3J5L3V0aWxzJztcclxuaW1wb3J0IHsgZXNjYXBlU3RyIH0gZnJvbSAnLi9tYXRjaGVyL3V0aWxzJztcclxuXHJcbnR5cGUgTmF2TGlua1Byb3BzID0ge1xyXG4gIHRvOiBQYXJ0aWFsPExvY2F0aW9uPiB8IHN0cmluZyB8ICgobG9jYXRpb246IExvY2F0aW9uKSA9PiBzdHJpbmcgfCBQYXJ0aWFsPExvY2F0aW9uPik7XHJcbiAgaXNBY3RpdmU/OiAobWF0Y2g6IE1hdGNoZWQgfCBudWxsLCBsb2NhdGlvbjogTG9jYXRpb24pID0+IGJvb2xlYW47XHJcbiAgLy8gY29tcGF0IHJlYWN0LXJvdXRlciBOYXZMaW5rIHByb3BzIHR5cGVcclxuICBba2V5OiBzdHJpbmddOiBhbnk7XHJcbn0gJiBMaW5rUHJvcHM7XHJcblxyXG50eXBlIFBhZ2UgPSAncGFnZSc7XHJcblxyXG5mdW5jdGlvbiBOYXZMaW5rPFAgZXh0ZW5kcyBOYXZMaW5rUHJvcHM+KHByb3BzOiBQKSB7XHJcbiAgY29uc3QgeyB0bywgaXNBY3RpdmUsIC4uLnJlc3QgfSA9IHByb3BzO1xyXG4gIGNvbnN0IGNvbnRleHQgPSB1c2VDb250ZXh0KENvbnRleHQpO1xyXG5cclxuICBjb25zdCB0b0xvY2F0aW9uID0gdHlwZW9mIHRvID09PSAnZnVuY3Rpb24nID8gdG8oY29udGV4dC5sb2NhdGlvbikgOiB0bztcclxuXHJcbiAgY29uc3QgeyBwYXRobmFtZTogcGF0aCB9ID0gdHlwZW9mIHRvTG9jYXRpb24gPT09ICdzdHJpbmcnID8gcGFyc2VQYXRoKHRvTG9jYXRpb24pIDogdG9Mb2NhdGlvbjtcclxuICAvLyDmiormraPliJnooajovr7lvI/nmoTnibnmrornrKblj7fliqDkuKTkuKrlj43mlpzmnaDov5vooYzovazkuYlcclxuICBjb25zdCBlc2NhcGVkUGF0aCA9IHBhdGggPyBlc2NhcGVTdHIocGF0aCkgOiAnJztcclxuICBjb25zdCBtYXRjaCA9IGVzY2FwZWRQYXRoID8gbWF0Y2hQYXRoKGNvbnRleHQubG9jYXRpb24ucGF0aG5hbWUsIGVzY2FwZWRQYXRoKSA6IG51bGw7XHJcblxyXG4gIGNvbnN0IGlzTGlua0FjdGl2ZSA9IG1hdGNoICYmIGlzQWN0aXZlID8gaXNBY3RpdmUobWF0Y2gsIGNvbnRleHQubG9jYXRpb24pIDogZmFsc2U7XHJcblxyXG4gIGNvbnN0IHBhZ2U6IFBhZ2UgPSAncGFnZSc7XHJcbiAgY29uc3Qgb3RoZXJQcm9wcyA9IHtcclxuICAgICdhcmlhLWN1cnJlbnQnOiBpc0xpbmtBY3RpdmUgPyBwYWdlIDogZmFsc2UsXHJcbiAgICAuLi5yZXN0LFxyXG4gIH07XHJcblxyXG4gIHJldHVybiA8TGluayB0bz17dG99IHsuLi5vdGhlclByb3BzfSAvPjtcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgTmF2TGluaztcclxuIiwiaW1wb3J0IHsgTG9jYXRpb24gfSBmcm9tICcuLi9yb3V0ZXInO1xyXG5pbXBvcnQgeyBBY3Rpb24gfSBmcm9tICcuLi9oaXN0b3J5L3R5cGVzJztcclxuXHJcbi8vIOiOt+WPlnJlZHV4IHN0YXRl5Lit55qE5YC8XHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRJbihzdGF0ZTogUmVjb3JkPHN0cmluZywgYW55PiwgcGF0aDogc3RyaW5nW10pOiBhbnkge1xyXG4gIGlmICghc3RhdGUpIHtcclxuICAgIHJldHVybiBzdGF0ZTtcclxuICB9XHJcbiAgY29uc3QgbGVuZ3RoID0gcGF0aC5sZW5ndGg7XHJcbiAgaWYgKCFsZW5ndGgpIHtcclxuICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgfVxyXG4gIGxldCByZXMgPSBzdGF0ZTtcclxuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aCAmJiAhIXJlczsgKytpKSB7XHJcbiAgICByZXMgPSByZXNbcGF0aFtpXV07XHJcbiAgfVxyXG4gIHJldHVybiByZXM7XHJcbn1cclxuXHJcbi8vIOS7jnN0b3Jl55qEc3RhdGXkuK3ojrflj5ZSb3V0ZXLjgIFMb2NhdGlvbuOAgUFjdGlvbuOAgUhhc2jnrYnkv6Hmga9cclxuY29uc3Qgc3RhdGVSZWFkZXIgPSAoc3RvcmVUeXBlOiBzdHJpbmcpID0+IHtcclxuICBjb25zdCBpc1JvdXRlciA9ICh2YWx1ZTogdW5rbm93bikgPT4ge1xyXG4gICAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgISFnZXRJbih2YWx1ZSwgWydsb2NhdGlvbiddKSAmJiAhIWdldEluKHZhbHVlLCBbJ2FjdGlvbiddKTtcclxuICB9O1xyXG5cclxuICBjb25zdCBnZXRSb3V0ZXIgPSAoc3RhdGU6IGFueSkgPT4ge1xyXG4gICAgY29uc3Qgcm91dGVyID0gZ2V0SW4oc3RhdGUsIFsncm91dGVyJ10pO1xyXG4gICAgaWYgKCFpc1JvdXRlcihyb3V0ZXIpKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGZpbmQgcm91dGVyIHJlZHVjZXIgaW4gJHtzdG9yZVR5cGV9IHN0b3JlLCBpdCBtdXN0IGJlIG1vdW50ZWQgdW5kZXIgXCJyb3V0ZXJcImApO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJvdXRlciE7XHJcbiAgfTtcclxuXHJcbiAgY29uc3QgZ2V0TG9jYXRpb24gPSA8Uz4oc3RhdGU6IGFueSk6IFBhcnRpYWw8TG9jYXRpb248Uz4+ID0+IGdldEluKGdldFJvdXRlcihzdGF0ZSksIFsnbG9jYXRpb24nXSk7XHJcbiAgY29uc3QgZ2V0QWN0aW9uID0gKHN0YXRlOiBhbnkpOiBBY3Rpb24gPT4gZ2V0SW4oZ2V0Um91dGVyKHN0YXRlKSwgWydhY3Rpb24nXSk7XHJcbiAgY29uc3QgZ2V0U2VhcmNoID0gKHN0YXRlOiBhbnkpOiBzdHJpbmcgPT4gZ2V0SW4oZ2V0Um91dGVyKHN0YXRlKSwgWydsb2NhdGlvbicsICdzZWFyY2gnXSk7XHJcbiAgY29uc3QgZ2V0SGFzaCA9IChzdGF0ZTogYW55KTogc3RyaW5nID0+IGdldEluKGdldFJvdXRlcihzdGF0ZSksIFsnbG9jYXRpb24nLCAnaGFzaCddKTtcclxuXHJcbiAgcmV0dXJuIHtcclxuICAgIGdldEhhc2gsXHJcbiAgICBnZXRBY3Rpb24sXHJcbiAgICBnZXRTZWFyY2gsXHJcbiAgICBnZXRSb3V0ZXIsXHJcbiAgICBnZXRMb2NhdGlvbixcclxuICB9O1xyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgc3RhdGVSZWFkZXIiLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XHJcbmltcG9ydCB7IHVzZUxheW91dEVmZmVjdCB9IGZyb20gJ3JlYWN0JztcclxuaW1wb3J0IHsgY29ubmVjdCwgUmVhY3RSZWR1eENvbnRleHQgfSBmcm9tICdyZWFjdC1yZWR1eCc7XHJcbmltcG9ydCB7IFN0b3JlIH0gZnJvbSAncmVkdXgnO1xyXG5pbXBvcnQgeyByZWR1eEFkYXB0ZXIgfSBmcm9tICdAY2xvdWRzb3AvaG9yaXpvbic7XHJcbmltcG9ydCB7IEhpc3RvcnksIExvY2F0aW9uLCBSb3V0ZXIgfSBmcm9tICcuLi9yb3V0ZXInO1xyXG5pbXBvcnQgeyBBY3Rpb24sIERlZmF1bHRTdGF0ZVR5cGUsIE5hdmlnYXRpb24gfSBmcm9tICcuLi9oaXN0b3J5L3R5cGVzJztcclxuaW1wb3J0IHsgQWN0aW9uTWVzc2FnZSwgb25Mb2NhdGlvbkNoYW5nZWQgfSBmcm9tICcuL2FjdGlvbnMnO1xyXG5pbXBvcnQgc3RhdGVSZWFkZXIgZnJvbSAnLi9yZWR1eFV0aWxzJztcclxuXHJcbnR5cGUgU3RvcmVUeXBlID0gJ0hvcml6b25YQ29tcGF0JyB8ICdSZWR1eCc7XHJcblxyXG50eXBlIENvbm5lY3RlZFJvdXRlcjxTPiA9IHtcclxuICBzdG9yZTogU3RvcmU7XHJcbiAgaGlzdG9yeTogSGlzdG9yeTxTPjtcclxuICBiYXNlbmFtZTogc3RyaW5nO1xyXG4gIGNoaWxkcmVuPzogKCgpID0+IFJlYWN0LlJlYWN0Tm9kZSkgfCBSZWFjdC5SZWFjdE5vZGU7XHJcbiAgb25Mb2NhdGlvbkNoYW5nZWQ6IChsb2NhdGlvbjogTG9jYXRpb248Uz4sIGFjdGlvbjogQWN0aW9uLCBpc0ZpcnN0UmVuZGVyaW5nOiBib29sZWFuKSA9PiBBY3Rpb25NZXNzYWdlO1xyXG4gIG5vSW5pdGlhbFBvcDogYm9vbGVhbjtcclxuICBvbWl0Um91dGVyOiBib29sZWFuO1xyXG4gIHN0b3JlVHlwZTogU3RvcmVUeXBlO1xyXG59O1xyXG5cclxuY29uc3QgeyBjb25uZWN0OiBoQ29ubmVjdCB9ID0gcmVkdXhBZGFwdGVyO1xyXG5cclxuZnVuY3Rpb24gQ29ubmVjdGVkUm91dGVyV2l0aG91dE1lbW88Uz4ocHJvcHM6IENvbm5lY3RlZFJvdXRlcjxTPikge1xyXG4gIGNvbnN0IHsgc3RvcmUsIGhpc3RvcnksIG9uTG9jYXRpb25DaGFuZ2VkLCBvbWl0Um91dGVyLCBjaGlsZHJlbiwgc3RvcmVUeXBlIH0gPSBwcm9wcztcclxuICBjb25zdCB7IGdldExvY2F0aW9uIH0gPSBzdGF0ZVJlYWRlcihzdG9yZVR5cGUpO1xyXG5cclxuICAvLyDnm5HlkKxzdG9yZeWPmOWMllxyXG4gIGNvbnN0IHVuc3Vic2NyaWJlID0gc3RvcmUuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgIC8vIOiOt+WPlnJlZHV4IFN0YXRl5Lit55qEbG9jYXRpb27kv6Hmga9cclxuICAgIGNvbnN0IHtcclxuICAgICAgcGF0aG5hbWU6IHBhdGhuYW1lSW5TdG9yZSxcclxuICAgICAgc2VhcmNoOiBzZWFyY2hJblN0b3JlLFxyXG4gICAgICBoYXNoOiBoYXNoSW5TdG9yZSxcclxuICAgICAgc3RhdGU6IHN0YXRlSW5TdG9yZSxcclxuICAgIH0gPSBnZXRMb2NhdGlvbjxTPihzdG9yZS5nZXRTdGF0ZSgpKTtcclxuXHJcbiAgICAvLyDojrflj5blvZPliY1oaXN0b3J55a+56LGh5Lit55qEbG9jYXRpb27kv6Hmga9cclxuICAgIGNvbnN0IHtcclxuICAgICAgcGF0aG5hbWU6IHBhdGhuYW1lSW5IaXN0b3J5LFxyXG4gICAgICBzZWFyY2g6IHNlYXJjaEluSGlzdG9yeSxcclxuICAgICAgaGFzaDogaGFzaEluSGlzdG9yeSxcclxuICAgICAgc3RhdGU6IHN0YXRlSW5IaXN0b3J5LFxyXG4gICAgfSA9IGhpc3RvcnkubG9jYXRpb247XHJcblxyXG4gICAgLy8g5Lik5LiqbG9jYXRpb27kuI3kuIDoh7Qg5omn6KGM6Lez6L2sXHJcbiAgICBpZiAoXHJcbiAgICAgIGhpc3RvcnkuYWN0aW9uID09PSAnUFVTSCcgJiZcclxuICAgICAgKHBhdGhuYW1lSW5IaXN0b3J5ICE9PSBwYXRobmFtZUluU3RvcmUgfHxcclxuICAgICAgICBzZWFyY2hJbkhpc3RvcnkgIT09IHNlYXJjaEluU3RvcmUgfHxcclxuICAgICAgICBoYXNoSW5IaXN0b3J5ICE9PSBoYXNoSW5TdG9yZSB8fFxyXG4gICAgICAgIHN0YXRlSW5IaXN0b3J5ICE9PSBzdGF0ZUluU3RvcmUpXHJcbiAgICApIHtcclxuICAgICAgaGlzdG9yeS5wdXNoKFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIHBhdGhuYW1lOiBwYXRobmFtZUluU3RvcmUsXHJcbiAgICAgICAgICBzZWFyY2g6IHNlYXJjaEluU3RvcmUsXHJcbiAgICAgICAgICBoYXNoOiBoYXNoSW5TdG9yZSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHN0YXRlSW5TdG9yZSxcclxuICAgICAgKTtcclxuICAgIH1cclxuICB9KTtcclxuXHJcbiAgY29uc3QgaGFuZGxlTG9jYXRpb25DaGFuZ2UgPSAoYXJnczogTmF2aWdhdGlvbjxTPiwgaXNGaXJzdFJlbmRlcmluZzogYm9vbGVhbiA9IGZhbHNlKSA9PiB7XHJcbiAgICBjb25zdCB7IGxvY2F0aW9uLCBhY3Rpb24gfSA9IGFyZ3M7XHJcbiAgICBvbkxvY2F0aW9uQ2hhbmdlZChsb2NhdGlvbiwgYWN0aW9uLCBpc0ZpcnN0UmVuZGVyaW5nKTtcclxuICB9O1xyXG5cclxuICAvLyDnm5HlkKxoaXN0b3J55pu05pawXHJcbiAgY29uc3QgdW5MaXN0ZW4gPSAoKSA9PiBoaXN0b3J5Lmxpc3RlbihoYW5kbGVMb2NhdGlvbkNoYW5nZSk7XHJcblxyXG4gIHVzZUxheW91dEVmZmVjdCgoKSA9PiB7XHJcbiAgICByZXR1cm4gKCkgPT4ge1xyXG4gICAgICB1bkxpc3RlbigpO1xyXG4gICAgICB1bnN1YnNjcmliZSgpO1xyXG4gICAgfTtcclxuICB9LCBbXSk7XHJcblxyXG4gIGlmICghcHJvcHMubm9Jbml0aWFsUG9wKSB7XHJcbiAgICAvLyDkvKDpgJLliJ3lp4vml7bkvY3nva7kv6Hmga/vvIxpc0ZpcnN0UmVuZGVyaW5n6K6+5Li6dHJ1ZemYsuatoumHjeWkjea4suafk1xyXG4gICAgaGFuZGxlTG9jYXRpb25DaGFuZ2UoeyBsb2NhdGlvbjogaGlzdG9yeS5sb2NhdGlvbiwgYWN0aW9uOiBoaXN0b3J5LmFjdGlvbiB9LCB0cnVlKTtcclxuICB9XHJcblxyXG4gIGlmIChvbWl0Um91dGVyKSB7XHJcbiAgICByZXR1cm4gPD57Y2hpbGRyZW59PC8+O1xyXG4gIH1cclxuICBsZXQgY2hpbGRyZW5Ob2RlOiBSZWFjdC5SZWFjdE5vZGU7XHJcbiAgaWYgKHR5cGVvZiBjaGlsZHJlbiA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgY2hpbGRyZW5Ob2RlID0gY2hpbGRyZW4oKTtcclxuICB9IGVsc2Uge1xyXG4gICAgY2hpbGRyZW5Ob2RlID0gY2hpbGRyZW47XHJcbiAgfVxyXG5cclxuICByZXR1cm4gPFJvdXRlciBoaXN0b3J5PXtoaXN0b3J5fT57Y2hpbGRyZW5Ob2RlfTwvUm91dGVyPjtcclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0Q29ubmVjdGVkUm91dGVyPFMgPSBEZWZhdWx0U3RhdGVUeXBlPih0eXBlOiBTdG9yZVR5cGUpIHtcclxuICBjb25zdCBtYXBEaXNwYXRjaFRvUHJvcHMgPSAoZGlzcGF0Y2g6IGFueSkgPT4gKHtcclxuICAgIG9uTG9jYXRpb25DaGFuZ2VkOiAobG9jYXRpb246IExvY2F0aW9uLCBhY3Rpb246IEFjdGlvbiwgaXNGaXJzdFJlbmRlcmluZzogYm9vbGVhbikgPT5cclxuICAgICAgZGlzcGF0Y2gob25Mb2NhdGlvbkNoYW5nZWQobG9jYXRpb24sIGFjdGlvbiwgaXNGaXJzdFJlbmRlcmluZykpLFxyXG4gIH0pO1xyXG4gIGNvbnN0IENvbm5lY3RlZFJvdXRlciA9IFJlYWN0Lm1lbW8oQ29ubmVjdGVkUm91dGVyV2l0aG91dE1lbW88Uz4pO1xyXG5cclxuICBjb25zdCBDb25uZWN0ZWRSb3V0ZXJXaXRoQ29udGV4dCA9IChwcm9wczogYW55KSA9PiB7XHJcbiAgICBjb25zdCBDb250ZXh0ID0gcHJvcHMuY29udGV4dCB8fCBSZWFjdFJlZHV4Q29udGV4dDtcclxuXHJcbiAgICByZXR1cm4gKFxyXG4gICAgICA8Q29udGV4dC5Db25zdW1lcj5cclxuICAgICAgICB7KHsgc3RvcmUgfTogYW55KSA9PiA8Q29ubmVjdGVkUm91dGVyIHN0b3JlPXtzdG9yZX0gc3RvcmVUeXBlPXt0eXBlfSB7Li4ucHJvcHN9IC8+fVxyXG4gICAgICA8L0NvbnRleHQuQ29uc3VtZXI+XHJcbiAgICApO1xyXG4gIH07XHJcblxyXG4gIC8vIOmSiOWvueS4jeWQjOeahFN0b3Jl57G75Z6L77yM5L2/55So5a+55bqU55qEY29ubmVjdOWHveaVsFxyXG4gIGlmICh0eXBlID09PSAnSG9yaXpvblhDb21wYXQnKSB7XHJcbiAgICByZXR1cm4gaENvbm5lY3QobnVsbCwgbWFwRGlzcGF0Y2hUb1Byb3BzKShDb25uZWN0ZWRSb3V0ZXJXaXRoQ29udGV4dCk7XHJcbiAgfVxyXG4gIGlmICh0eXBlID09PSAnUmVkdXgnKSB7XHJcbiAgICByZXR1cm4gY29ubmVjdChudWxsLCBtYXBEaXNwYXRjaFRvUHJvcHMpKENvbm5lY3RlZFJvdXRlcldpdGhDb250ZXh0KTtcclxuICB9IGVsc2Uge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHN0b3JlIHR5cGUnKTtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCB7IGdldENvbm5lY3RlZFJvdXRlciB9O1xyXG4iLCJpbXBvcnQgeyBBY3Rpb25NZXNzYWdlLCBBY3Rpb25OYW1lIH0gZnJvbSAnLi9hY3Rpb25zJztcclxuaW1wb3J0IHsgSGlzdG9yeSB9IGZyb20gJy4uL2hpc3RvcnkvdHlwZXMnO1xyXG5cclxuLy8g5a6a5LmJY29ubmVjdC1yb3V0ZXLlr7nlupTnmoRyZWR1eCBkaXNwYXRjaOWHveaVsFxyXG5leHBvcnQgZnVuY3Rpb24gcm91dGVyTWlkZGxld2FyZShoaXN0b3J5OiBIaXN0b3J5KSB7XHJcbiAgcmV0dXJuIGZ1bmN0aW9uKF86IGFueSkge1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uKG5leHQ6IGFueSkge1xyXG4gICAgICByZXR1cm4gZnVuY3Rpb24oYWN0aW9uOiBBY3Rpb25NZXNzYWdlKSB7XHJcbiAgICAgICAgaWYgKGFjdGlvbi50eXBlICE9PSBBY3Rpb25OYW1lLkNBTExfSElTVE9SWV9NRVRIT0QpIHtcclxuICAgICAgICAgIHJldHVybiBuZXh0KGFjdGlvbik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHsgcGF5bG9hZDogeyBtZXRob2QsIGFyZ3MgfSB9ID0gYWN0aW9uO1xyXG4gICAgICAgIGlmIChtZXRob2QgaW4gaGlzdG9yeSkge1xyXG4gICAgICAgICAgKGhpc3RvcnkgYXMgYW55KVttZXRob2RdKC4uLmFyZ3MpO1xyXG4gICAgICAgIH1cclxuICAgICAgfTtcclxuICAgIH07XHJcbiAgfTtcclxufVxyXG4iLCJpbXBvcnQgeyBjcmVhdGVDb25uZWN0Um91dGVyIH0gZnJvbSAnLi9yZWR1Y2VyJztcclxuXHJcbmV4cG9ydCB7IGdldENvbm5lY3RlZFJvdXRlciB9IGZyb20gJy4vY29ubmVjdGVkUm91dGVyJztcclxuZXhwb3J0IGNvbnN0IGNvbm5lY3RSb3V0ZXIgPSBjcmVhdGVDb25uZWN0Um91dGVyKCk7XHJcbmV4cG9ydCB7IHJvdXRlck1pZGRsZXdhcmUgfSBmcm9tICcuL2Rpc3BhdGNoJztcclxuIiwiaW1wb3J0IHsgTG9jYXRpb24gYXMgSExvY2F0aW9uIH0gZnJvbSAnLi4vaGlzdG9yeS90eXBlcyc7XHJcbmltcG9ydCB7IGdldENvbm5lY3RlZFJvdXRlciB9IGZyb20gJy4uL2Nvbm5lY3Qtcm91dGVyJztcclxuXHJcbnR5cGUgTG9jYXRpb248UyA9IHVua25vd24+ID0gT21pdDxITG9jYXRpb248Uz4sICdrZXknPjtcclxuXHJcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gaGlzdG9yeSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcblxyXG5leHBvcnQgeyBMb2NhdGlvbiB9O1xyXG5leHBvcnQgdHlwZSB7IEhpc3RvcnkgfSBmcm9tICcuLi9oaXN0b3J5L3R5cGVzJztcclxuXHJcbmV4cG9ydCB7IGNyZWF0ZUJyb3dzZXJIaXN0b3J5IH0gZnJvbSAnLi4vaGlzdG9yeS9icm93ZXJIaXN0b3J5JztcclxuZXhwb3J0IHsgY3JlYXRlSGFzaEhpc3RvcnkgfSBmcm9tICcuLi9oaXN0b3J5L2hhc2hIaXN0b3J5JztcclxuXHJcbmV4cG9ydCB7IGRlZmF1bHQgYXMgX19Sb3V0ZXJDb250ZXh0IH0gZnJvbSAnLi9jb250ZXh0JztcclxuXHJcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gVVJMIHBhcnNlciA9PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcblxyXG5leHBvcnQgeyBtYXRjaFBhdGgsIGdlbmVyYXRlUGF0aCB9IGZyb20gJy4vbWF0Y2hlci9wYXJzZXInO1xyXG5cclxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PSBSb3V0ZXIgSG9va3MgPT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG5cclxuZXhwb3J0IHsgdXNlSGlzdG9yeSwgdXNlTG9jYXRpb24sIHVzZVBhcmFtcywgdXNlUm91dGVNYXRjaCB9IGZyb20gJy4vaG9va3MnO1xyXG5cclxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PSBSb3V0ZXIgZnVuY3Rpb24gY29tcG9uZW50ID09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuXHJcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUm91dGUgfSBmcm9tICcuL1JvdXRlJztcclxuZXhwb3J0IHsgZGVmYXVsdCBhcyBSb3V0ZXIgfSBmcm9tICcuL1JvdXRlcic7XHJcbmV4cG9ydCB7IGRlZmF1bHQgYXMgU3dpdGNoIH0gZnJvbSAnLi9Td2l0Y2gnO1xyXG5leHBvcnQgeyBkZWZhdWx0IGFzIFJlZGlyZWN0IH0gZnJvbSAnLi9SZWRpcmVjdCc7XHJcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUHJvbXB0IH0gZnJvbSAnLi9Qcm9tcHQnO1xyXG5leHBvcnQgeyBkZWZhdWx0IGFzIHdpdGhSb3V0ZXIgfSBmcm9tICcuL3dpdGhSb3V0ZXInO1xyXG5leHBvcnQgeyBkZWZhdWx0IGFzIEhhc2hSb3V0ZXIgfSBmcm9tICcuL0hhc2hSb3V0ZXInO1xyXG5leHBvcnQgeyBkZWZhdWx0IGFzIEJyb3dzZXJSb3V0ZXIgfSBmcm9tICcuL0Jyb3dzZXJSb3V0ZXInO1xyXG5leHBvcnQgeyBkZWZhdWx0IGFzIExpbmsgfSBmcm9tICcuL0xpbmsnO1xyXG5leHBvcnQgeyBkZWZhdWx0IGFzIE5hdkxpbmsgfSBmcm9tICcuL05hdkxpbmsnO1xyXG5cclxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PSBSb3V0ZXIgVHlwZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG5cclxuZXhwb3J0IHR5cGUgeyBSb3V0ZUNvbXBvbmVudFByb3BzLCBSb3V0ZUNoaWxkcmVuUHJvcHMsIFJvdXRlUHJvcHMgfSBmcm9tICcuL1JvdXRlJztcclxuXHJcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gQ29ubmVjdC1yb3V0ZXIgPT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG5cclxuZXhwb3J0IHsgY29ubmVjdFJvdXRlciwgcm91dGVyTWlkZGxld2FyZSB9IGZyb20gJy4uL2Nvbm5lY3Qtcm91dGVyJztcclxuZXhwb3J0IGNvbnN0IENvbm5lY3RlZFJvdXRlciA9IGdldENvbm5lY3RlZFJvdXRlcignUmVkdXgnKTtcclxuZXhwb3J0IGNvbnN0IENvbm5lY3RlZEhSb3V0ZXIgPSBnZXRDb25uZWN0ZWRSb3V0ZXIoJ0hvcml6b25YQ29tcGF0Jyk7Il0sIm5hbWVzIjpbIl9leHRlbmRzIiwiT2JqZWN0IiwiYXNzaWduIiwiYmluZCIsInRhcmdldCIsImkiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJzb3VyY2UiLCJrZXkiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJhcHBseSIsIkFjdGlvbk5hbWUiLCJvbkxvY2F0aW9uQ2hhbmdlZCIsImxvY2F0aW9uIiwiYWN0aW9uIiwiaXNGaXJzdFJlbmRlcmluZyIsInVuZGVmaW5lZCIsInR5cGUiLCJMT0NBVElPTl9DSEFOR0UiLCJwYXlsb2FkIiwiaW5qZWN0UXVlcnlQYXJhbXMiLCJxdWVyeSIsInF1ZXJ5U3RyaW5nIiwic2VhcmNoIiwicXVlcnlPYmplY3QiLCJwYXJhbXMiLCJVUkxTZWFyY2hQYXJhbXMiLCJmb3JFYWNoIiwidmFsdWUiLCJjcmVhdGVDb25uZWN0Um91dGVyIiwiaGlzdG9yeSIsImluaXRSb3V0ZXJTdGF0ZSIsInN0YXRlIiwiX3JlZiIsImlzQnJvd3NlciIsIndpbmRvdyIsImRvY3VtZW50IiwiY3JlYXRlRWxlbWVudCIsImdldERlZmF1bHRDb25maXJtYXRpb24iLCJtZXNzYWdlIiwiY2FsbEJhY2siLCJjb25maXJtIiwiaXNTdXBwb3J0SGlzdG9yeSIsImlzU3VwcG9ydHNQb3BTdGF0ZSIsIm5hdmlnYXRvciIsInVzZXJBZ2VudCIsImluZGV4T2YiLCJBY3Rpb24iLCJFdmVudFR5cGUiLCJjcmVhdGVQYXRoIiwicGF0aCIsImhhc2giLCJwYXRobmFtZSIsInN0YXJ0c1dpdGgiLCJwYXJzZVBhdGgiLCJ1cmwiLCJwYXJzZWRQYXRoIiwiaGFzaElkeCIsInN1YnN0cmluZyIsInNlYXJjaElkeCIsImNyZWF0ZUxvY2F0aW9uIiwiY3VycmVudCIsInRvIiwidXJsT2JqIiwiZ2V0UmFuZEtleSIsImdlblJhbmRvbUtleSIsImlzTG9jYXRpb25FcXVhbCIsInAxIiwicDIiLCJhZGRIZWFkU2xhc2giLCJzdHJpcEhlYWRTbGFzaCIsIm5vcm1hbGl6ZVNsYXNoIiwidGVtcFBhdGgiLCJoYXNCYXNlbmFtZSIsInByZWZpeCIsInRvTG93ZXJDYXNlIiwiaW5jbHVkZXMiLCJjaGFyQXQiLCJzdHJpcEJhc2VuYW1lIiwiY3JlYXRlTWVtb3J5UmVjb3JkIiwiaW5pdFZhbCIsImZuIiwidmlzaXRlZFJlY29yZCIsImdldERlbHRhIiwiZm9ybSIsInRvSWR4IiwibGFzdEluZGV4T2YiLCJmcm9tSWR4IiwiYWRkUmVjb3JkIiwibmV3UmVjb3JkIiwiY3VyVmFsIiwiTmV3VmFsIiwicHVzaCIsInByZXZJZHgiLCJuZXdWaXNpdGVkUmVjb3JkIiwic2xpY2UiLCJyZXBsYWNlIiwiZW5kIiwiTWF0aCIsInJhbmRvbSIsInRvU3RyaW5nIiwiX2NsYXNzQ2FsbENoZWNrIiwiaW5zdGFuY2UiLCJDb25zdHJ1Y3RvciIsIlR5cGVFcnJvciIsIl90eXBlb2YiLCJvYmoiLCJTeW1ib2wiLCJpdGVyYXRvciIsImNvbnN0cnVjdG9yIiwiX3RvUHJpbWl0aXZlIiwiaW5wdXQiLCJoaW50IiwicHJpbSIsInRvUHJpbWl0aXZlIiwicmVzIiwiU3RyaW5nIiwiTnVtYmVyIiwiX3RvUHJvcGVydHlLZXkiLCJhcmciLCJfZGVmaW5lUHJvcGVydGllcyIsInByb3BzIiwiZGVzY3JpcHRvciIsImVudW1lcmFibGUiLCJjb25maWd1cmFibGUiLCJ3cml0YWJsZSIsImRlZmluZVByb3BlcnR5IiwidG9Qcm9wZXJ0eUtleSIsIl9jcmVhdGVDbGFzcyIsInByb3RvUHJvcHMiLCJzdGF0aWNQcm9wcyIsIlRyYW5zaXRpb25NYW5hZ2VyIiwicHJvbXB0IiwibGlzdGVuZXJzIiwic2V0UHJvbXB0IiwiX3RoaXMiLCJhZGRMaXN0ZW5lciIsImZ1bmMiLCJfdGhpczIiLCJpc0FjdGl2ZSIsImxpc3RlbmVyIiwiYXJncyIsImZpbHRlciIsIml0ZW0iLCJub3RpZnlMaXN0ZW5lcnMiLCJfaXRlcmF0b3IiLCJfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlciIsIl9zdGVwIiwicyIsIm4iLCJkb25lIiwiZXJyIiwiZSIsImYiLCJjb25maXJtSnVtcFRvIiwidXNlckNvbmZpcm1hdGlvbkZ1bmMiLCJyZXN1bHQiLCJ3YXJuaW5nIiwiY29uZGl0aW9uIiwiY29uc29sZSIsIndhcm4iLCJnZXRCYXNlSGlzdG9yeSIsInRyYW5zaXRpb25NYW5hZ2VyIiwic2V0TGlzdGVuZXIiLCJicm93c2VySGlzdG9yeSIsImdvIiwic3RlcCIsImdvQmFjayIsImdvRm9yd2FyZCIsImxpc3RlbiIsImNhbmNlbCIsImlzQmxvY2tlZCIsImJsb2NrIiwidW5ibG9jayIsImdldFVwZGF0ZVN0YXRlRnVuYyIsImhpc3RvcnlQcm9wcyIsIm5leHRTdGF0ZSIsImNyZWF0ZUJyb3dzZXJIaXN0b3J5Iiwib3B0aW9ucyIsInN1cHBvcnRIaXN0b3J5IiwiaXNTdXBwb3J0UG9wU3RhdGUiLCJfb3B0aW9ucyRmb3JjZVJlZnJlc2giLCJmb3JjZVJlZnJlc2giLCJfb3B0aW9ucyRnZXRVc2VyQ29uZmkiLCJnZXRVc2VyQ29uZmlybWF0aW9uIiwiYmFzZW5hbWUiLCJpbml0TG9jYXRpb24iLCJnZXRMb2NhdGlvbiIsImdldEhpc3RvcnlTdGF0ZSIsInJlY29yZE9wZXJhdG9yIiwibCIsIl9nZXRCYXNlSGlzdG9yeSIsInBvcCIsImNyZWF0ZUhyZWYiLCJ1cGRhdGVTdGF0ZSIsImhpc3RvcnlTdGF0ZSIsIl93aW5kb3ckbG9jYXRpb24iLCJmb3JjZUp1bXAiLCJoYW5kbGVQb3BTdGF0ZSIsImNhbGxiYWNrIiwiaXNKdW1wIiwicmV2ZXJ0UG9wU3RhdGUiLCJwb3BTdGF0ZUxpc3RlbmVyIiwiZXZlbnQiLCJoYXNoQ2hhbmdlTGlzdGVuZXIiLCJsaXN0ZW5lckNvdW50IiwiY291bnQiLCJhZGRFdmVudExpc3RlbmVyIiwiUG9wU3RhdGUiLCJIYXNoQ2hhbmdlIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsImRlbHRhIiwiaHJlZiIsInB1c2hTdGF0ZSIsInJlcGxhY2VTdGF0ZSIsInN0cmlwSGFzaCIsImlkeCIsImdldEhhc2hDb250ZW50IiwiY3JlYXRlSGFzaEhpc3RvcnkiLCJvcHRpb24iLCJfb3B0aW9uJGhhc2hUeXBlIiwiaGFzaFR5cGUiLCJfb3B0aW9uJGdldFVzZXJDb25maXIiLCJwYXRoRGVjb2RlciIsInBhdGhFbmNvZGVyIiwiaGFzaFBhdGgiLCJtZW1SZWNvcmRzIiwidGFnIiwicXVlcnlTZWxlY3RvciIsImJhc2UiLCJnZXRBdHRyaWJ1dGUiLCJmb3JjZU5leHRQb3AiLCJpZ25vcmVQYXRoIiwiZW5jb2RlZFBhdGgiLCJoYW5kbGVIYXNoQ2hhbmdlIiwicHJldkxvY2F0aW9uIiwiY3JlYXRlTmFtZWRDb250ZXh0IiwibmFtZSIsImRlZmF1bHRWYWx1ZSIsImNvbnRleHQiLCJjcmVhdGVDb250ZXh0IiwiZGlzcGxheU5hbWUiLCJSb3V0ZXJDb250ZXh0IiwiVG9rZW5UeXBlIiwiY2xlYW5QYXRoIiwic2NvcmVDb21wYXJlIiwic2NvcmUxIiwic2NvcmUyIiwic2NvcmUxTGVuZ3RoIiwic2NvcmUyTGVuZ3RoIiwibWluIiwiZXNjYXBlU3RyIiwic3RyIiwidmFsaWRDaGFyIiwibGV4ZXIiLCJ0b2tlbnMiLCJ1cmxQYXRoIiwiRXJyb3IiLCJnZXRMaXRlcmFsIiwidGVzdCIsInNraXBDaGFyIiwiY3VyQ2hhciIsInByZXZDaGFyIiwiRGVsaW1pdGVyIiwiUGFyYW0iLCJXaWxkQ2FyZCIsIlN0YXRpYyIsIkxCcmFja2V0IiwiUkJyYWNrZXQiLCJQYXR0ZXJuIiwiTWF0Y2hTY29yZSIsImRlZmF1bHRPcHRpb24iLCJjYXNlU2Vuc2l0aXZlIiwic3RyaWN0TW9kZSIsImV4YWN0IiwiUkVHRVhfQ0hBUlNfUkUiLCJCQVNFX1BBUkFNX1BBVFRFUk4iLCJEZWZhdWx0RGVsaW1pdGVyIiwiY3JlYXRlUGF0aFBhcnNlciIsIl9vcHRpb24kY2FzZVNlbnNpdGl2ZSIsIl9vcHRpb24kc3RyaWN0TW9kZSIsIl9vcHRpb24kZXhhY3QiLCJwYXR0ZXJuIiwia2V5cyIsInNjb3JlcyIsIm9ubHlIYXNXaWxkQ2FyZCIsInRva2VuQ291bnQiLCJsYXN0VG9rZW4iLCJ0b2tlbklkeCIsInRva2VuIiwibmV4dFRva2VuIiwic3RhdGljIiwicGFyYW1SZWdleHAiLCJwYXJhbSIsIndpbGRjYXJkIiwicGxhY2Vob2xkZXIiLCJpc1dpbGRDYXJkIiwiZmxhZyIsInJlZ2V4cCIsIlJlZ0V4cCIsInBhcnNlIiwicmVNYXRjaCIsIm1hdGNoIiwibWF0Y2hlZFBhdGgiLCJwYXJzZVNjb3JlIiwiQXJyYXkiLCJmcm9tIiwic3BsaXQiLCJpc0FycmF5IiwiX3BhcmFtcyQiLCJzcGxpY2UiLCJjb25jYXQiLCJmaWxsIiwiaXNFeGFjdCIsInNjb3JlIiwiY29tcGlsZSIsIndpbGRDYXJkIiwiam9pbiIsIm1hdGNoUGF0aCIsInBhdHRlcm5zIiwibWF0Y2hlZFJlc3VsdHMiLCJfaXRlcmF0b3IyIiwiX3N0ZXAyIiwicGFyc2VyIiwibWF0Y2hlZCIsInNvcnQiLCJhIiwiYiIsImdlbmVyYXRlUGF0aCIsInVzZUhpc3RvcnkiLCJ1c2VDb250ZXh0IiwidXNlTG9jYXRpb24iLCJ1c2VQYXJhbXMiLCJ1c2VSb3V0ZU1hdGNoIiwiUm91dGUiLCJjb21wdXRlZCIsImNoaWxkcmVuIiwiY29tcG9uZW50IiwicmVuZGVyIiwicm91dGVMb2NhdGlvbiIsIm5ld1Byb3BzIiwiQ2hpbGRyZW4iLCJnZXRDaGlsZHJlbiIsIlJlYWN0IiwiUHJvdmlkZXIiLCJSb3V0ZXIiLCJfcHJvcHMkY2hpbGRyZW4iLCJfdXNlU3RhdGUiLCJ1c2VTdGF0ZSIsInNldExvY2F0aW9uIiwicGVuZGluZ0xvY2F0aW9uIiwidXNlUmVmIiwidW5MaXN0ZW4iLCJ1c2VMYXlvdXRFZmZlY3QiLCJpbml0Q29udGV4dFZhbHVlIiwidXNlTWVtbyIsIl9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlIiwiZXhjbHVkZWQiLCJzb3VyY2VLZXlzIiwiTGlmZUN5Y2xlIiwicHJldlByb3BzIiwiaXNNb3VudCIsIm9uTW91bnQiLCJvblVwZGF0ZSIsIm9uVW5tb3VudCIsIlJlZGlyZWN0IiwiX3Byb3BzJHB1c2giLCJjYWxjTG9jYXRpb24iLCJuYXZpZ2F0ZSIsIl9jYWxjTG9jYXRpb24iLCJfZXhjbHVkZWQiLCJvbk1vdW50RnVuYyIsIm9uVXBkYXRlRnVuYyIsInByZXZQYXRoIiwiZGF0YSIsIlN3aXRjaCIsImVsZW1lbnQiLCJub2RlIiwiaXNWYWxpZEVsZW1lbnQiLCJzdHJpY3QiLCJzZW5zaXRpdmUiLCJjbG9uZUVsZW1lbnQiLCJQcm9tcHQiLCJfcHJvcHMkd2hlbiIsIndoZW4iLCJyZWxlYXNlIiwib25Vbm1vdW50RnVuYyIsIndpdGhSb3V0ZXIiLCJDb21wb25lbnQiLCJDb21wb25lbnRXaXRoUm91dGVyUHJvcCIsIl91c2VDb250ZXh0Iiwicm91dGVQcm9wcyIsIkhhc2hSb3V0ZXIiLCJoaXN0b3J5UmVmIiwiQnJvd3NlclJvdXRlciIsImlzTW9kaWZpZWRFdmVudCIsIm1ldGFLZXkiLCJhbHRLZXkiLCJjdHJsS2V5Iiwic2hpZnRLZXkiLCJjaGVja1RhcmdldCIsIkxpbmsiLCJvbkNsaWNrIiwib3RoZXIiLCJsaW5rQ2xpY2tFdmVudCIsInByZXZlbnREZWZhdWx0IiwiZGVmYXVsdFByZXZlbnRlZCIsImJ1dHRvbiIsImlzU2FtZVBhdGgiLCJsaW5rUHJvcHMiLCJOYXZMaW5rIiwicmVzdCIsIkNvbnRleHQiLCJ0b0xvY2F0aW9uIiwiZXNjYXBlZFBhdGgiLCJpc0xpbmtBY3RpdmUiLCJwYWdlIiwib3RoZXJQcm9wcyIsImdldEluIiwic3RhdGVSZWFkZXIiLCJzdG9yZVR5cGUiLCJpc1JvdXRlciIsImdldFJvdXRlciIsInJvdXRlciIsImdldEFjdGlvbiIsImdldFNlYXJjaCIsImdldEhhc2giLCJoQ29ubmVjdCIsInJlZHV4QWRhcHRlciIsImNvbm5lY3QiLCJDb25uZWN0ZWRSb3V0ZXJXaXRob3V0TWVtbyIsInN0b3JlIiwib21pdFJvdXRlciIsIl9zdGF0ZVJlYWRlciIsInVuc3Vic2NyaWJlIiwic3Vic2NyaWJlIiwiX2dldExvY2F0aW9uIiwiZ2V0U3RhdGUiLCJwYXRobmFtZUluU3RvcmUiLCJzZWFyY2hJblN0b3JlIiwiaGFzaEluU3RvcmUiLCJzdGF0ZUluU3RvcmUiLCJfaGlzdG9yeSRsb2NhdGlvbiIsInBhdGhuYW1lSW5IaXN0b3J5Iiwic2VhcmNoSW5IaXN0b3J5IiwiaGFzaEluSGlzdG9yeSIsInN0YXRlSW5IaXN0b3J5IiwiaGFuZGxlTG9jYXRpb25DaGFuZ2UiLCJub0luaXRpYWxQb3AiLCJGcmFnbWVudCIsImNoaWxkcmVuTm9kZSIsImdldENvbm5lY3RlZFJvdXRlciIsIm1hcERpc3BhdGNoVG9Qcm9wcyIsImRpc3BhdGNoIiwiQ29ubmVjdGVkUm91dGVyIiwibWVtbyIsIkNvbm5lY3RlZFJvdXRlcldpdGhDb250ZXh0IiwiUmVhY3RSZWR1eENvbnRleHQiLCJDb25zdW1lciIsInJvdXRlck1pZGRsZXdhcmUiLCJfIiwibmV4dCIsIkNBTExfSElTVE9SWV9NRVRIT0QiLCJfYWN0aW9uJHBheWxvYWQiLCJtZXRob2QiLCJjb25uZWN0Um91dGVyIiwiQ29ubmVj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 diff --git a/packages/horizon-router/connectRouter/package.json b/packages/horizon-router/connectRouter/package.json deleted file mode 100644 index 0c8f9fe5..00000000 --- a/packages/horizon-router/connectRouter/package.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "module": "./esm/connectRouter.js", - "main": "./cjs/connectRouter.js", - "types": "./@types/router/index2.d.ts", - "peerDependencies": { - "react-redux": "^6.0.0 || ^7.1.0", - "redux": "^3.6.0 || ^4.0.0" - } -} diff --git a/packages/horizon-router/package.json b/packages/horizon-router/package.json index 379046a5..f7fabe21 100644 --- a/packages/horizon-router/package.json +++ b/packages/horizon-router/package.json @@ -1,6 +1,6 @@ { "name": "@cloudsop/horizon-router", - "version": "0.0.12", + "version": "1.0.5-alpha", "description": "router for horizon framework, a part of horizon-ecosystem", "main": "./router/cjs/router.js", "module": "./router/esm/router.js", @@ -16,7 +16,7 @@ }, "scripts": { "test": "jest", - "build": "rollup -c build.js", + "bulid": "rollup -c build.js", "build-types-router": "tsc -p src/router/index.ts --emitDeclarationOnly --declaration --declarationDir ./router/@types --skipLibCheck", "build-types-all": "tsc -p src/router/index2.ts --emitDeclarationOnly --declaration --declarationDir ./connectRouter/@types --skipLibCheck" }, @@ -67,10 +67,11 @@ "rollup": "2.79.1", "rollup-plugin-execute": "^1.1.1", "ts-jest": "29.0.3", - "typescript": "4.9.3" + "typescript": "4.9.3", + "rollup-plugin-terser": "^5.1.3" }, "dependencies": { - "@cloudsop/horizon": "^0.0.52", + "@cloudsop/horizon": "*", "react": "18.2.0", "react-dom": "18.2.0" }, diff --git a/packages/horizon-router/router/@types/connect-router/actions.d.ts b/packages/horizon-router/router/@types/connect-router/actions.d.ts deleted file mode 100644 index 965f7ee7..00000000 --- a/packages/horizon-router/router/@types/connect-router/actions.d.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { Action, Path } from '../history/types'; -type Location = Partial; -export declare enum ActionName { - LOCATION_CHANGE = "$horizon-router/LOCATION_CHANGE", - CALL_HISTORY_METHOD = "$horizon-router/CALL_HISTORY_METHOD" -} -export type ActionMessage = { - type: ActionName.LOCATION_CHANGE; - payload: { - location: Location; - action: Action; - isFirstRendering: boolean; - }; -} | { - type: ActionName.CALL_HISTORY_METHOD; - payload: { - method: string; - args: any; - }; -}; -export declare const onLocationChanged: (location: Location, action: Action, isFirstRendering?: boolean) => ActionMessage; -export declare const push: (...args: any) => ActionMessage; -export declare const replace: (...args: any) => ActionMessage; -export declare const go: (...args: any) => ActionMessage; -export {}; diff --git a/packages/horizon-router/router/@types/connect-router/dispatch.d.ts b/packages/horizon-router/router/@types/connect-router/dispatch.d.ts deleted file mode 100644 index 48424699..00000000 --- a/packages/horizon-router/router/@types/connect-router/dispatch.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { ActionMessage } from './actions'; -import { History } from '../history/types'; -export declare function routerMiddleware(history: History): (_: any) => (next: any) => (action: ActionMessage) => any; diff --git a/packages/horizon-router/router/@types/connect-router/index.d.ts b/packages/horizon-router/router/@types/connect-router/index.d.ts deleted file mode 100644 index 38b43283..00000000 --- a/packages/horizon-router/router/@types/connect-router/index.d.ts +++ /dev/null @@ -1,11 +0,0 @@ -export { getConnectedRouter } from './connectedRouter'; -export declare const connectRouter: (history: import("../router").History) => (state?: { - location: Partial> & { - query?: Record; - }; - action: import("../history/types").Action; -}, { type, payload }?: { - type?: import("./actions").ActionName; - payload?: any; -}) => any; -export { routerMiddleware } from './dispatch'; diff --git a/packages/horizon-router/router/@types/connect-router/reducer.d.ts b/packages/horizon-router/router/@types/connect-router/reducer.d.ts deleted file mode 100644 index 3de2b851..00000000 --- a/packages/horizon-router/router/@types/connect-router/reducer.d.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { ActionName } from './actions'; -import { Action, History } from '../history/types'; -import { Location } from '../router'; -type LocationWithQuery = Partial & { - query?: Record; -}; -type InitRouterState = { - location: LocationWithQuery; - action: Action; -}; -type Payload = { - type?: ActionName; - payload?: any; -}; -export declare function createConnectRouter(): (history: History) => (state?: InitRouterState, { type, payload }?: Payload) => any; -export {}; diff --git a/packages/horizon-router/router/@types/history/baseHistory.d.ts b/packages/horizon-router/router/@types/history/baseHistory.d.ts deleted file mode 100644 index 74892c1e..00000000 --- a/packages/horizon-router/router/@types/history/baseHistory.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { HistoryProps, Listener, Navigation, Prompt } from './types'; -import transitionManager from './transitionManager'; -export declare function getBaseHistory(transitionManager: transitionManager, setListener: (delta: number) => void, browserHistory: History): { - go: (step: number) => void; - goBack: () => void; - goForward: () => void; - listen: (listener: Listener) => () => void; - block: (prompt?: Prompt) => () => void; - getUpdateStateFunc: (historyProps: HistoryProps) => (nextState: Navigation | undefined) => void; -}; diff --git a/packages/horizon-router/router/@types/history/browerHistory.d.ts b/packages/horizon-router/router/@types/history/browerHistory.d.ts deleted file mode 100644 index 000d1ad2..00000000 --- a/packages/horizon-router/router/@types/history/browerHistory.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { BaseOption, DefaultStateType, History } from './types'; -export type BrowserHistoryOption = { - /** - * forceRefresh为True时跳转时会强制刷新页面 - */ - forceRefresh?: boolean; -} & BaseOption; -export declare function createBrowserHistory(options?: BrowserHistoryOption): History; diff --git a/packages/horizon-router/router/@types/history/dom.d.ts b/packages/horizon-router/router/@types/history/dom.d.ts deleted file mode 100644 index b889eef2..00000000 --- a/packages/horizon-router/router/@types/history/dom.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -export declare function isBrowser(): boolean; -export declare function getDefaultConfirmation(message: string, callBack: (result: boolean) => void): void; -export declare function isSupportHistory(): boolean; -export declare function isSupportsPopState(): boolean; diff --git a/packages/horizon-router/router/@types/history/hashHistory.d.ts b/packages/horizon-router/router/@types/history/hashHistory.d.ts deleted file mode 100644 index a8cf1959..00000000 --- a/packages/horizon-router/router/@types/history/hashHistory.d.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { BaseOption, DefaultStateType, History } from './types'; -export type urlHashType = 'slash' | 'noslash'; -type HashHistoryOption = { - hashType?: urlHashType; -} & BaseOption; -export declare function createHashHistory(option?: HashHistoryOption): History; -export {}; diff --git a/packages/horizon-router/router/@types/history/transitionManager.d.ts b/packages/horizon-router/router/@types/history/transitionManager.d.ts deleted file mode 100644 index 45edc03f..00000000 --- a/packages/horizon-router/router/@types/history/transitionManager.d.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Action, CallBackFunc, ConfirmationFunc, Listener, Location, Navigation, Prompt, TManager } from './types'; -declare class TransitionManager implements TManager { - private prompt; - private listeners; - constructor(); - setPrompt(prompt: Prompt): () => void; - addListener(func: Listener): () => void; - notifyListeners(args: Navigation): void; - confirmJumpTo(location: Location, action: Action, userConfirmationFunc: ConfirmationFunc, callBack: CallBackFunc): void; -} -export default TransitionManager; diff --git a/packages/horizon-router/router/@types/history/types.d.ts b/packages/horizon-router/router/@types/history/types.d.ts deleted file mode 100644 index 6a8a8636..00000000 --- a/packages/horizon-router/router/@types/history/types.d.ts +++ /dev/null @@ -1,56 +0,0 @@ -export type BaseOption = { - basename?: string; - getUserConfirmation?: ConfirmationFunc; -}; -export interface HistoryProps { - readonly action: Action; - readonly location: Location; - length: number; -} -export interface History extends HistoryProps { - createHref(path: Partial): string; - push(to: To, state?: T): void; - replace(to: To, state?: T): void; - listen(listener: Listener): () => void; - block(prompt: Prompt): () => void; - go(index: number): void; - goBack(): void; - goForward(): void; -} -export declare enum Action { - pop = "POP", - push = "PUSH", - replace = "REPLACE" -} -export declare enum EventType { - PopState = "popstate", - HashChange = "hashchange" -} -export type Path = { - pathname: string; - search: string; - hash: string; -}; -export type HistoryState = { - state?: T; - key: string; -}; -export type DefaultStateType = unknown; -export type Location = Path & HistoryState; -export type To = string | Partial; -export interface Listener { - (navigation: Navigation): void; -} -export interface Navigation { - action: Action; - location: Location; -} -export type Prompt = string | boolean | null | ((location: Location, action: Action) => void); -export type CallBackFunc = (isJump: boolean) => void; -export type ConfirmationFunc = (message: string, callBack: CallBackFunc) => void; -export interface TManager { - setPrompt(next: Prompt): () => void; - addListener(func: (navigation: Navigation) => void): () => void; - notifyListeners(args: Navigation): void; - confirmJumpTo(location: Location, action: Action, userConfirmationFunc: ConfirmationFunc, callBack: CallBackFunc): void; -} diff --git a/packages/horizon-router/router/@types/history/utils.d.ts b/packages/horizon-router/router/@types/history/utils.d.ts deleted file mode 100644 index adee264f..00000000 --- a/packages/horizon-router/router/@types/history/utils.d.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { Action, Location, Path, To } from './types'; -export declare function createPath(path: Partial): string; -export declare function parsePath(url: string): Partial; -export declare function createLocation(current: string | Location, to: To, state?: S, key?: string): Readonly>; -export declare function isLocationEqual(p1: Partial, p2: Partial): boolean; -export declare function addHeadSlash(path: string): string; -export declare function stripHeadSlash(path: string): string; -export declare function normalizeSlash(path: string): string; -export declare function hasBasename(path: string, prefix: string): Boolean; -export declare function stripBasename(path: string, prefix: string): string; -export declare function createMemoryRecord(initVal: S, fn: (arg: S) => T): { - getDelta: (to: S, form: S) => number; - addRecord: (current: S, newRecord: S, action: Action) => void; -}; diff --git a/packages/horizon-router/router/@types/history/waring.d.ts b/packages/horizon-router/router/@types/history/waring.d.ts deleted file mode 100644 index 18f09cb7..00000000 --- a/packages/horizon-router/router/@types/history/waring.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -declare function warning(condition: any, message: string): void; -export default warning; diff --git a/packages/horizon-router/router/@types/router/BrowserRouter.d.ts b/packages/horizon-router/router/@types/router/BrowserRouter.d.ts deleted file mode 100644 index b91dd697..00000000 --- a/packages/horizon-router/router/@types/router/BrowserRouter.d.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { ReactNode } from 'react'; -import { ConfirmationFunc } from '../history/types'; -export type BaseRouterProps = { - basename: string; - getUserConfirmation: ConfirmationFunc; - children?: ReactNode; -}; -export type BrowserRouterProps = BaseRouterProps & { - forceRefresh: boolean; -}; -declare function BrowserRouter

>(props: P): JSX.Element; -export default BrowserRouter; diff --git a/packages/horizon-router/router/@types/router/HashRouter.d.ts b/packages/horizon-router/router/@types/router/HashRouter.d.ts deleted file mode 100644 index ff09ad81..00000000 --- a/packages/horizon-router/router/@types/router/HashRouter.d.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { BaseRouterProps } from './BrowserRouter'; -import { urlHashType } from '../history/hashHistory'; -export type HashRouterProps = BaseRouterProps & { - hashType: urlHashType; -}; -declare function HashRouter

>(props: P): JSX.Element; -export default HashRouter; diff --git a/packages/horizon-router/router/@types/router/Link.d.ts b/packages/horizon-router/router/@types/router/Link.d.ts deleted file mode 100644 index 48ec51d8..00000000 --- a/packages/horizon-router/router/@types/router/Link.d.ts +++ /dev/null @@ -1,18 +0,0 @@ -import * as React from 'react'; -import { Location } from './index'; -export type LinkProps = { - component?: React.ComponentType; - to: Partial | string | ((location: Location) => string | Partial); - replace?: boolean; - tag?: string; - /** - * @deprecated - * React16以后不再需要该属性 - **/ - innerRef?: React.Ref; -} & React.AnchorHTMLAttributes; -declare function Link

(props: P): React.DOMElement<{ - href: string; - onClick: (event: React.MouseEvent) => void; -} & Omit, Element>; -export default Link; diff --git a/packages/horizon-router/router/@types/router/NavLink.d.ts b/packages/horizon-router/router/@types/router/NavLink.d.ts deleted file mode 100644 index a7181526..00000000 --- a/packages/horizon-router/router/@types/router/NavLink.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -import type { LinkProps } from './Link'; -import { Location } from './index'; -import { Matched } from './matcher/parser'; -type NavLinkProps = { - to: Partial | string | ((location: Location) => string | Partial); - isActive?: (match: Matched | null, location: Location) => boolean; - [key: string]: any; -} & LinkProps; -declare function NavLink

(props: P): JSX.Element; -export default NavLink; diff --git a/packages/horizon-router/router/@types/router/Prompt.d.ts b/packages/horizon-router/router/@types/router/Prompt.d.ts deleted file mode 100644 index 84752997..00000000 --- a/packages/horizon-router/router/@types/router/Prompt.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { Location } from './index'; -import { Action } from '../history/types'; -type PromptProps = { - message?: string | ((location: Partial, action: Action) => void); - when?: boolean | ((location: Partial) => boolean); -}; -declare function Prompt

(props: P): JSX.Element; -export default Prompt; diff --git a/packages/horizon-router/router/@types/router/Redirect.d.ts b/packages/horizon-router/router/@types/router/Redirect.d.ts deleted file mode 100644 index e1569e31..00000000 --- a/packages/horizon-router/router/@types/router/Redirect.d.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { Matched } from './matcher/parser'; -import { Location } from './index'; -export type RedirectProps = { - to: string | Partial; - push?: boolean; - path?: string; - from?: string; - exact?: boolean; - strict?: boolean; - readonly computed?: Matched | null; -}; -declare function Redirect

(props: P): JSX.Element; -export default Redirect; diff --git a/packages/horizon-router/router/@types/router/Route.d.ts b/packages/horizon-router/router/@types/router/Route.d.ts deleted file mode 100644 index b8939efb..00000000 --- a/packages/horizon-router/router/@types/router/Route.d.ts +++ /dev/null @@ -1,23 +0,0 @@ -import * as React from 'react'; -import { History, Location } from './index'; -import { Matched } from './matcher/parser'; -import { GetURLParams } from './matcher/types'; -export type RouteComponentProps

= {}, S = unknown> = RouteChildrenProps; -export type RouteChildrenProps

= {}, S = unknown> = { - history: History; - location: Location; - match: Matched

| null; -}; -export type RouteProps

= {}, Path extends string = string> = { - location?: Location; - component?: React.ComponentType> | React.ComponentType | undefined; - children?: ((props: RouteChildrenProps

) => React.ReactNode) | React.ReactNode; - render?: (props: RouteComponentProps

) => React.ReactNode; - path?: Path | Path[]; - exact?: boolean; - sensitive?: boolean; - strict?: boolean; - computed?: Matched

; -}; -declare function Route = GetURLParams>(props: RouteProps): JSX.Element; -export default Route; diff --git a/packages/horizon-router/router/@types/router/Router.d.ts b/packages/horizon-router/router/@types/router/Router.d.ts deleted file mode 100644 index 53751b67..00000000 --- a/packages/horizon-router/router/@types/router/Router.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -import * as React from 'react'; -import { History } from '../history/types'; -export type RouterProps = { - history: History; - children?: React.ReactNode; -}; -declare function Router

(props: P): JSX.Element; -export default Router; diff --git a/packages/horizon-router/router/@types/router/Switch.d.ts b/packages/horizon-router/router/@types/router/Switch.d.ts deleted file mode 100644 index 53ea8c32..00000000 --- a/packages/horizon-router/router/@types/router/Switch.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -import * as React from 'react'; -import { Location } from './index'; -export type SwitchProps = { - location?: Location; - children?: React.ReactNode; -}; -declare function Switch

(props: P): React.ReactElement | null; -export default Switch; diff --git a/packages/horizon-router/router/@types/router/__tests__/router.test.d.ts b/packages/horizon-router/router/@types/router/__tests__/router.test.d.ts deleted file mode 100644 index 7b0828bf..00000000 --- a/packages/horizon-router/router/@types/router/__tests__/router.test.d.ts +++ /dev/null @@ -1 +0,0 @@ -import '@testing-library/jest-dom'; diff --git a/packages/horizon-router/router/@types/router/__tests__/test_app.d.ts b/packages/horizon-router/router/@types/router/__tests__/test_app.d.ts deleted file mode 100644 index c36ab167..00000000 --- a/packages/horizon-router/router/@types/router/__tests__/test_app.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { History, Location } from '../index'; -export declare let historyHook: History; -export declare let locationHook: Location; -export declare const LocationDisplay: () => JSX.Element; -export declare const Test_Demo: () => JSX.Element; -export declare const Test_Demo2: () => JSX.Element; -export declare const Test_Demo3: () => JSX.Element; -export declare const Test_Demo4: () => JSX.Element; diff --git a/packages/horizon-router/router/@types/router/context.d.ts b/packages/horizon-router/router/@types/router/context.d.ts deleted file mode 100644 index 8a39bd8c..00000000 --- a/packages/horizon-router/router/@types/router/context.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -/// -import { History, Location } from './index'; -import { Matched } from './matcher/parser'; -export type RouterContextValue = { - history: History; - location: Location; - match: Matched | null; -}; -declare const RouterContext: import("react").Context; -export default RouterContext; diff --git a/packages/horizon-router/router/@types/router/hooks.d.ts b/packages/horizon-router/router/@types/router/hooks.d.ts deleted file mode 100644 index 7ff53865..00000000 --- a/packages/horizon-router/router/@types/router/hooks.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { Matched, Params } from './matcher/parser'; -import { History } from '../history/types'; -import { Location } from './index'; -declare function useHistory(): History; -declare function useLocation(): Location; -declare function useParams

(): Params

| {}; -declare function useRouteMatch

(path?: string): Matched

| null; -export { useHistory, useLocation, useParams, useRouteMatch }; diff --git a/packages/horizon-router/router/@types/router/index.d.ts b/packages/horizon-router/router/@types/router/index.d.ts deleted file mode 100644 index 01659cc3..00000000 --- a/packages/horizon-router/router/@types/router/index.d.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { Location as HLocation } from '../history/types'; -type Location = Omit, 'key'>; -export { Location }; -export type { History } from '../history/types'; -export { createBrowserHistory } from '../history/browerHistory'; -export { createHashHistory } from '../history/hashHistory'; -export { default as __RouterContext } from './context'; -export { matchPath, generatePath } from './matcher/parser'; -export { useHistory, useLocation, useParams, useRouteMatch } from './hooks'; -export { default as Route } from './Route'; -export { default as Router } from './Router'; -export { default as Switch } from './Switch'; -export { default as Redirect } from './Redirect'; -export { default as Prompt } from './Prompt'; -export { default as withRouter } from './withRouter'; -export { default as HashRouter } from './HashRouter'; -export { default as BrowserRouter } from './BrowserRouter'; -export { default as Link } from './Link'; -export { default as NavLink } from './NavLink'; -export type { RouteComponentProps, RouteChildrenProps, RouteProps } from './Route'; diff --git a/packages/horizon-router/router/@types/router/index2.d.ts b/packages/horizon-router/router/@types/router/index2.d.ts deleted file mode 100644 index 77801836..00000000 --- a/packages/horizon-router/router/@types/router/index2.d.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { Location as HLocation } from '../history/types'; -type Location = Omit, 'key'>; -export { Location }; -export type { History } from '../history/types'; -export { createBrowserHistory } from '../history/browerHistory'; -export { createHashHistory } from '../history/hashHistory'; -export { default as __RouterContext } from './context'; -export { matchPath, generatePath } from './matcher/parser'; -export { useHistory, useLocation, useParams, useRouteMatch } from './hooks'; -export { default as Route } from './Route'; -export { default as Router } from './Router'; -export { default as Switch } from './Switch'; -export { default as Redirect } from './Redirect'; -export { default as Prompt } from './Prompt'; -export { default as withRouter } from './withRouter'; -export { default as HashRouter } from './HashRouter'; -export { default as BrowserRouter } from './BrowserRouter'; -export { default as Link } from './Link'; -export { default as NavLink } from './NavLink'; -export type { RouteComponentProps, RouteChildrenProps, RouteProps } from './Route'; -export { connectRouter, routerMiddleware } from '../connect-router'; -export declare const ConnectedRouter: any; -export declare const ConnectedHRouter: any; diff --git a/packages/horizon-router/router/@types/router/lifeCycleHook.d.ts b/packages/horizon-router/router/@types/router/lifeCycleHook.d.ts deleted file mode 100644 index 6837c2c0..00000000 --- a/packages/horizon-router/router/@types/router/lifeCycleHook.d.ts +++ /dev/null @@ -1,7 +0,0 @@ -export type LifeCycleProps = { - onMount?: () => void; - onUpdate?: (prevProps?: LifeCycleProps) => void; - onUnmount?: () => void; - data?: any; -}; -export declare function LifeCycle(props: LifeCycleProps): any; diff --git a/packages/horizon-router/router/@types/router/matcher/__tests__/lexer.test.d.ts b/packages/horizon-router/router/@types/router/matcher/__tests__/lexer.test.d.ts deleted file mode 100644 index cb0ff5c3..00000000 --- a/packages/horizon-router/router/@types/router/matcher/__tests__/lexer.test.d.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/packages/horizon-router/router/@types/router/matcher/__tests__/parser.test.d.ts b/packages/horizon-router/router/@types/router/matcher/__tests__/parser.test.d.ts deleted file mode 100644 index cb0ff5c3..00000000 --- a/packages/horizon-router/router/@types/router/matcher/__tests__/parser.test.d.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/packages/horizon-router/router/@types/router/matcher/__tests__/utils.test.d.ts b/packages/horizon-router/router/@types/router/matcher/__tests__/utils.test.d.ts deleted file mode 100644 index cb0ff5c3..00000000 --- a/packages/horizon-router/router/@types/router/matcher/__tests__/utils.test.d.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/packages/horizon-router/router/@types/router/matcher/lexer.d.ts b/packages/horizon-router/router/@types/router/matcher/lexer.d.ts deleted file mode 100644 index 6137743a..00000000 --- a/packages/horizon-router/router/@types/router/matcher/lexer.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -import { Token } from './types'; -export declare function lexer(path: string): Token[]; diff --git a/packages/horizon-router/router/@types/router/matcher/parser.d.ts b/packages/horizon-router/router/@types/router/matcher/parser.d.ts deleted file mode 100644 index ee672cf9..00000000 --- a/packages/horizon-router/router/@types/router/matcher/parser.d.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { GetURLParams, Parser, ParserOption } from './types'; -export type Params

= { - [K in keyof P]?: P[K]; -}; -export type Matched

= { - score: number[]; - params: Params

; - path: string; - url: string; - isExact: boolean; -}; -export declare function createPathParser(pathname: Str, option?: ParserOption): Parser>; -export declare function createPathParser

(pathname: string, option?: ParserOption): Parser

; -/** - * @description 依次使用pathname与pattern进行匹配,根据匹配分数取得分数最高结果 - */ -export declare function matchPath

(pathname: string, pattern: string | string[], option?: ParserOption): Matched

| null; -export declare function generatePath

(path: string, params: Params

): string; diff --git a/packages/horizon-router/router/@types/router/matcher/types.d.ts b/packages/horizon-router/router/@types/router/matcher/types.d.ts deleted file mode 100644 index 971fbe5b..00000000 --- a/packages/horizon-router/router/@types/router/matcher/types.d.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { Matched, Params } from './parser'; -export type Token = { - type: TokenType; - value: string; -}; -export declare enum TokenType { - Delimiter = "delimiter", - Static = "static", - Param = "param", - WildCard = "wildcard", - LBracket = "(", - RBracket = ")", - Pattern = "pattern" -} -export interface Parser

{ - regexp: RegExp; - keys: string[]; - parse(url: string): Matched

| null; - compile(params: Params

): string; -} -export type ParserOption = { - caseSensitive?: boolean; - strictMode?: boolean; - exact?: boolean; -}; -type ClearLeading = U extends `/${infer R}` ? ClearLeading : U; -type ClearTailing = U extends `${infer L}/` ? ClearTailing : U; -type ParseParam = Param extends `:${infer R}` ? { - [K in R]: string; -} : {}; -type MergeParams, OtherParam extends Record> = { - readonly [Key in keyof OneParam | keyof OtherParam]?: string; -}; -type ParseURLString = Str extends `${infer Param}/${infer Rest}` ? MergeParams, ParseURLString>> : ParseParam; -export type GetURLParams = ParseURLString>>; -export {}; diff --git a/packages/horizon-router/router/@types/router/matcher/utils.d.ts b/packages/horizon-router/router/@types/router/matcher/utils.d.ts deleted file mode 100644 index 8b739ae7..00000000 --- a/packages/horizon-router/router/@types/router/matcher/utils.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -/** - * @description 将url中的//转换为/ - */ -export declare function cleanPath(path: string): string; -export declare function scoreCompare(score1: number[], score2: number[]): number; -export declare function escapeStr(str: string): string; diff --git a/packages/horizon-router/router/@types/router/withRouter.d.ts b/packages/horizon-router/router/@types/router/withRouter.d.ts deleted file mode 100644 index b6c398cd..00000000 --- a/packages/horizon-router/router/@types/router/withRouter.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import * as React from 'react'; -declare function withRouter(Component: C): (props: any) => JSX.Element; -export default withRouter; diff --git a/packages/horizon-router/router/cjs/router.js b/packages/horizon-router/router/cjs/router.js deleted file mode 100644 index 989b246f..00000000 --- a/packages/horizon-router/router/cjs/router.js +++ /dev/null @@ -1,1531 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, '__esModule', { value: true }); - -var React = require('react'); - -function _interopNamespace(e) { - if (e && e.__esModule) return e; - var n = Object.create(null); - if (e) { - Object.keys(e).forEach(function (k) { - if (k !== 'default') { - var d = Object.getOwnPropertyDescriptor(e, k); - Object.defineProperty(n, k, d.get ? d : { - enumerable: true, - get: function () { return e[k]; } - }); - } - }); - } - n["default"] = e; - return Object.freeze(n); -} - -var React__namespace = /*#__PURE__*/_interopNamespace(React); - -function isBrowser() { - return typeof window !== 'undefined' && window.document && typeof window.document.createElement === 'function'; -} -function getDefaultConfirmation(message, callBack) { - callBack(window.confirm(message)); -} - -// 判断浏览器是否支持pushState方法,pushState是browserHistory实现的基础 -function isSupportHistory() { - return isBrowser() && window.history && 'pushState' in window.history; -} - -// 判断浏览器是否支持PopState事件 -function isSupportsPopState() { - return window.navigator.userAgent.indexOf('Trident') === -1; -} - -var Action = /*#__PURE__*/function (Action) { - Action["pop"] = "POP"; - Action["push"] = "PUSH"; - Action["replace"] = "REPLACE"; - return Action; -}({}); -var EventType = /*#__PURE__*/function (EventType) { - EventType["PopState"] = "popstate"; - EventType["HashChange"] = "hashchange"; - return EventType; -}({}); - -function _extends() { - _extends = Object.assign ? Object.assign.bind() : function (target) { - for (var i = 1; i < arguments.length; i++) { - var source = arguments[i]; - for (var key in source) { - if (Object.prototype.hasOwnProperty.call(source, key)) { - target[key] = source[key]; - } - } - } - return target; - }; - return _extends.apply(this, arguments); -} - -function createPath(path) { - var search = path.search, - hash = path.hash; - var pathname = path.pathname || '/'; - if (search && search !== '?') { - pathname += search.startsWith('?') ? search : '?' + search; - } - if (hash && hash !== '#') { - pathname += hash.startsWith('#') ? hash : '#' + hash; - } - return pathname; -} -function parsePath(url) { - if (!url) { - return {}; - } - var parsedPath = {}; - var hashIdx = url.indexOf('#'); - if (hashIdx > -1) { - parsedPath.hash = url.substring(hashIdx); - url = url.substring(0, hashIdx); - } - var searchIdx = url.indexOf('?'); - if (searchIdx > -1) { - parsedPath.search = url.substring(searchIdx); - url = url.substring(0, searchIdx); - } - if (url) { - parsedPath.pathname = url; - } - return parsedPath; -} -function createLocation(current, to, state, key) { - var pathname = typeof current === 'string' ? current : current.pathname; - var urlObj = typeof to === 'string' ? parsePath(to) : to; - // 随机key长度取6 - var getRandKey = genRandomKey(6); - var location = _extends({ - pathname: pathname, - search: '', - hash: '', - state: state, - key: typeof key === 'string' ? key : getRandKey() - }, urlObj); - if (!location.pathname) { - location.pathname = '/'; - } - return location; -} -function isLocationEqual(p1, p2) { - return p1.pathname === p2.pathname && p1.search === p2.search && p1.hash === p2.hash; -} -function addHeadSlash(path) { - if (path[0] === '/') { - return path; - } - return '/' + path; -} -function stripHeadSlash(path) { - if (path[0] === '/') { - return path.substring(1); - } - return path; -} -function normalizeSlash(path) { - var tempPath = addHeadSlash(path); - if (tempPath[tempPath.length - 1] === '/') { - return tempPath.substring(0, tempPath.length - 1); - } - return tempPath; -} -function hasBasename(path, prefix) { - return path.toLowerCase().indexOf(prefix.toLowerCase()) === 0 && ['/', '?', '#', ''].includes(path.charAt(prefix.length)); -} -function stripBasename(path, prefix) { - return hasBasename(path, prefix) ? path.substring(prefix.length) : path; -} - -// 使用随机生成的Key记录被访问过的URL,当Block被被触发时利用delta值跳转到之前的页面 -function createMemoryRecord(initVal, fn) { - var visitedRecord = [fn(initVal)]; - function getDelta(to, form) { - var toIdx = visitedRecord.lastIndexOf(fn(to)); - if (toIdx === -1) { - toIdx = 0; - } - var fromIdx = visitedRecord.lastIndexOf(fn(form)); - if (fromIdx === -1) { - fromIdx = 0; - } - return toIdx - fromIdx; - } - function addRecord(current, newRecord, action) { - var curVal = fn(current); - var NewVal = fn(newRecord); - if (action === Action.push) { - var prevIdx = visitedRecord.lastIndexOf(curVal); - var newVisitedRecord = visitedRecord.slice(0, prevIdx + 1); - newVisitedRecord.push(NewVal); - visitedRecord = newVisitedRecord; - } - if (action === Action.replace) { - var _prevIdx = visitedRecord.lastIndexOf(curVal); - if (_prevIdx !== -1) { - visitedRecord[_prevIdx] = NewVal; - } - } - } - return { - getDelta: getDelta, - addRecord: addRecord - }; -} -function genRandomKey(length) { - var end = length + 2; - return function () { - return Math.random().toString(18).substring(2, end); - }; -} - -function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } -} - -function _typeof(obj) { - "@babel/helpers - typeof"; - - return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { - return typeof obj; - } : function (obj) { - return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; - }, _typeof(obj); -} - -function _toPrimitive(input, hint) { - if (_typeof(input) !== "object" || input === null) return input; - var prim = input[Symbol.toPrimitive]; - if (prim !== undefined) { - var res = prim.call(input, hint || "default"); - if (_typeof(res) !== "object") return res; - throw new TypeError("@@toPrimitive must return a primitive value."); - } - return (hint === "string" ? String : Number)(input); -} - -function _toPropertyKey(arg) { - var key = _toPrimitive(arg, "string"); - return _typeof(key) === "symbol" ? key : String(key); -} - -function _defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i]; - descriptor.enumerable = descriptor.enumerable || false; - descriptor.configurable = true; - if ("value" in descriptor) descriptor.writable = true; - Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); - } -} -function _createClass(Constructor, protoProps, staticProps) { - if (protoProps) _defineProperties(Constructor.prototype, protoProps); - if (staticProps) _defineProperties(Constructor, staticProps); - Object.defineProperty(Constructor, "prototype", { - writable: false - }); - return Constructor; -} - -function _createForOfIteratorHelper$1(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray$1(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function () {}; return { s: F, n: function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function (e) { throw e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function () { it = it.call(o); }, n: function () { var step = it.next(); normalCompletion = step.done; return step; }, e: function (e) { didErr = true; err = e; }, f: function () { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; } -function _unsupportedIterableToArray$1(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray$1(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray$1(o, minLen); } -function _arrayLikeToArray$1(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } -var TransitionManager = /*#__PURE__*/function () { - function TransitionManager() { - _classCallCheck(this, TransitionManager); - this.prompt = void 0; - this.listeners = void 0; - this.prompt = null; - this.listeners = []; - } - _createClass(TransitionManager, [{ - key: "setPrompt", - value: function setPrompt(prompt) { - var _this = this; - this.prompt = prompt; - - // 清除Prompt - return function () { - if (_this.prompt === prompt) { - _this.prompt = null; - } - }; - } - - // 使用发布订阅模式管理history的监听者 - }, { - key: "addListener", - value: function addListener(func) { - var _this2 = this; - var isActive = true; - var listener = function (args) { - if (isActive) { - func(args); - } - }; - this.listeners.push(listener); - return function () { - isActive = false; - // 移除对应的监听者 - _this2.listeners = _this2.listeners.filter(function (item) { - return item !== listener; - }); - }; - } - }, { - key: "notifyListeners", - value: function notifyListeners(args) { - var _iterator = _createForOfIteratorHelper$1(this.listeners), - _step; - try { - for (_iterator.s(); !(_step = _iterator.n()).done;) { - var listener = _step.value; - listener(args); - } - } catch (err) { - _iterator.e(err); - } finally { - _iterator.f(); - } - } - }, { - key: "confirmJumpTo", - value: function confirmJumpTo(location, action, userConfirmationFunc, callBack) { - if (this.prompt !== null) { - var result = typeof this.prompt === 'function' ? this.prompt(location, action) : this.prompt; - if (typeof result === 'string') { - typeof userConfirmationFunc === 'function' ? userConfirmationFunc(result, callBack) : callBack(true); - } else { - callBack(result !== false); - } - } else { - callBack(true); - } - } - }]); - return TransitionManager; -}(); - -function warning(condition, message) { - if (condition) { - if (console && typeof console.warn === 'function') { - console.warn(message); - } - } -} - -// 抽取BrowserHistory和HashHistory中相同的方法 -function getBaseHistory(transitionManager, setListener, browserHistory) { - function go(step) { - browserHistory.go(step); - } - function goBack() { - browserHistory.go(-1); - } - function goForward() { - browserHistory.go(1); - } - function listen(listener) { - var cancel = transitionManager.addListener(listener); - setListener(1); - return function () { - setListener(-1); - cancel(); - }; - } - var isBlocked = false; - function block() { - var prompt = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; - var unblock = transitionManager.setPrompt(prompt); - if (!isBlocked) { - setListener(1); - isBlocked = true; - } - return function () { - if (isBlocked) { - isBlocked = false; - setListener(-1); - } - unblock(); - }; - } - function getUpdateStateFunc(historyProps) { - return function (nextState) { - if (nextState) { - _extends(historyProps, nextState); - } - historyProps.length = browserHistory.length; - var args = { - location: historyProps.location, - action: historyProps.action - }; - transitionManager.notifyListeners(args); - }; - } - return { - go: go, - goBack: goBack, - goForward: goForward, - listen: listen, - block: block, - getUpdateStateFunc: getUpdateStateFunc - }; -} - -function createBrowserHistory() { - var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; - var supportHistory = isSupportHistory(); - var isSupportPopState = isSupportsPopState(); - var browserHistory = window.history; - var _options$forceRefresh = options.forceRefresh, - forceRefresh = _options$forceRefresh === void 0 ? false : _options$forceRefresh, - _options$getUserConfi = options.getUserConfirmation, - getUserConfirmation = _options$getUserConfi === void 0 ? getDefaultConfirmation : _options$getUserConfi; - var basename = options.basename ? normalizeSlash(options.basename) : ''; - var initLocation = getLocation(getHistoryState()); - var recordOperator = createMemoryRecord(initLocation, function (l) { - return l.key; - }); - var transitionManager = new TransitionManager(); - var _getBaseHistory = getBaseHistory(transitionManager, setListener, browserHistory), - go = _getBaseHistory.go, - goBack = _getBaseHistory.goBack, - goForward = _getBaseHistory.goForward, - listen = _getBaseHistory.listen, - block = _getBaseHistory.block, - getUpdateStateFunc = _getBaseHistory.getUpdateStateFunc; - var history = { - action: Action.pop, - length: browserHistory.length, - location: initLocation, - go: go, - goBack: goBack, - goForward: goForward, - listen: listen, - block: block, - push: push, - replace: replace, - createHref: createHref - }; - var updateState = getUpdateStateFunc(history); - function getHistoryState() { - return supportHistory ? window.history.state : {}; - } - function getLocation(historyState) { - var _window$location = window.location, - search = _window$location.search, - hash = _window$location.hash; - var _ref = historyState || {}, - key = _ref.key, - state = _ref.state; - var pathname = window.location.pathname; - pathname = basename ? stripBasename(pathname, basename) : pathname; - return createLocation('', { - pathname: pathname, - search: search, - hash: hash - }, state, key); - } - - // 拦截页面POP事件后,防止返回到的页面被重复拦截 - var forceJump = false; - function handlePopState(location) { - if (forceJump) { - forceJump = false; - updateState(undefined); - } else { - var action = Action.pop; - var callback = function (isJump) { - if (isJump) { - // 执行跳转行为 - updateState({ - action: action, - location: location - }); - } else { - revertPopState(location, history.location); - } - }; - transitionManager.confirmJumpTo(location, action, getUserConfirmation, callback); - } - } - function popStateListener(event) { - handlePopState(getLocation(event.state)); - } - function hashChangeListener() { - var location = getLocation(getHistoryState()); - handlePopState(location); - } - var listenerCount = 0; - function setListener(count) { - listenerCount += count; - if (listenerCount === 1 && count === 1) { - window.addEventListener(EventType.PopState, popStateListener); - if (!isSupportPopState) { - window.addEventListener(EventType.HashChange, hashChangeListener); - } - } else if (listenerCount === 0) { - window.removeEventListener(EventType.PopState, popStateListener); - if (!isSupportPopState) { - window.removeEventListener(EventType.HashChange, hashChangeListener); - } - } - } - - // 取消页面跳转并恢复到跳转前的页面 - function revertPopState(form, to) { - var delta = recordOperator.getDelta(to, form); - if (delta !== 0) { - go(delta); - forceJump = true; - } - } - function createHref(path) { - return basename + createPath(path); - } - function push(to, state) { - var action = Action.push; - var location = createLocation(history.location, to, state, undefined); - transitionManager.confirmJumpTo(location, action, getUserConfirmation, function (isJump) { - if (!isJump) { - return; - } - var href = createHref(location); - var key = location.key, - state = location.state; - if (supportHistory) { - if (forceRefresh) { - window.location.href = href; - } else { - browserHistory.pushState({ - key: key, - state: state - }, '', href); - recordOperator.addRecord(history.location, location, action); - updateState({ - action: action, - location: location - }); - } - } else { - warning(state !== undefined, 'Browser history cannot push state in browsers that do not support HTML5 history'); - window.location.href = href; - } - }); - } - function replace(to, state) { - var action = Action.replace; - var location = createLocation(history.location, to, state, undefined); - transitionManager.confirmJumpTo(location, action, getUserConfirmation, function (isJump) { - if (!isJump) { - return; - } - var href = createHref(location); - var key = location.key, - state = location.state; - if (supportHistory) { - if (forceRefresh) { - window.location.replace(href); - } else { - browserHistory.replaceState({ - key: key, - state: state - }, '', href); - recordOperator.addRecord(history.location, location, action); - updateState({ - action: action, - location: location - }); - } - } else { - warning(state !== undefined, 'Browser history cannot push state in browsers that do not support HTML5 history'); - window.location.replace(href); - } - }); - } - return history; -} - -// 获取#前的内容 -function stripHash(path) { - var idx = path.indexOf('#'); - return idx === -1 ? path : path.substring(0, idx); -} - -// 获取#后的内容 -function getHashContent(path) { - var idx = path.indexOf('#'); - return idx === -1 ? '' : path.substring(idx + 1); -} -function createHashHistory() { - var option = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; - var browserHistory = window.history; - var _option$hashType = option.hashType, - hashType = _option$hashType === void 0 ? 'slash' : _option$hashType, - _option$getUserConfir = option.getUserConfirmation, - getUserConfirmation = _option$getUserConfir === void 0 ? getDefaultConfirmation : _option$getUserConfir; - var basename = option.basename ? normalizeSlash(option.basename) : ''; - var pathDecoder = addHeadSlash; - var pathEncoder = hashType === 'slash' ? addHeadSlash : stripHeadSlash; - function getLocation() { - var hashPath = pathDecoder(getHashContent(window.location.hash)); - if (basename) { - hashPath = stripBasename(hashPath, basename); - } - return createLocation('', hashPath, undefined, 'default'); - } - var initLocation = getLocation(); - var memRecords = createMemoryRecord(initLocation, createPath); - var transitionManager = new TransitionManager(); - function createHref(location) { - var tag = document.querySelector('base'); - var base = tag && tag.getAttribute('href') ? stripHash(window.location.href) : ''; - return base + '#' + pathEncoder(basename + createPath(location)); - } - var forceNextPop = false; - var ignorePath = null; - var _getBaseHistory = getBaseHistory(transitionManager, setListener, browserHistory), - go = _getBaseHistory.go, - goBack = _getBaseHistory.goBack, - goForward = _getBaseHistory.goForward, - listen = _getBaseHistory.listen, - block = _getBaseHistory.block, - getUpdateStateFunc = _getBaseHistory.getUpdateStateFunc; - var history = { - action: Action.pop, - length: browserHistory.length, - location: initLocation, - go: go, - goBack: goBack, - goForward: goForward, - push: push, - replace: replace, - listen: listen, - block: block, - createHref: createHref - }; - var updateState = getUpdateStateFunc(history); - function push(to, state) { - warning(state !== undefined, 'Hash history does not support state, it will be ignored'); - var action = Action.push; - var location = createLocation(history.location, to, undefined, ''); - transitionManager.confirmJumpTo(location, action, getUserConfirmation, function (isJump) { - if (!isJump) { - return; - } - var path = createPath(location); - var encodedPath = pathEncoder(basename + path); - // 前后hash不一样才进行跳转 - if (getHashContent(window.location.href) !== encodedPath) { - ignorePath = encodedPath; - window.location.hash = encodedPath; - memRecords.addRecord(history.location, location, action); - updateState({ - action: action, - location: location - }); - } else { - updateState(undefined); - } - }); - } - function replace(to, state) { - warning(state !== undefined, 'Hash history does not support state, it will be ignored'); - var action = Action.replace; - var location = createLocation(history.location, to, undefined, ''); - transitionManager.confirmJumpTo(location, action, getUserConfirmation, function (isJump) { - if (!isJump) { - return; - } - var path = createPath(location); - var encodedPath = pathEncoder(basename + path); - if (getHashContent(window.location.href) !== encodedPath) { - ignorePath = path; - window.location.replace(stripHash(window.location.href) + '#' + encodedPath); - } - memRecords.addRecord(history.location, location, action); - updateState({ - action: action, - location: location - }); - }); - } - function handleHashChange() { - var hashPath = getHashContent(window.location.href); - var encodedPath = pathEncoder(hashPath); - if (hashPath !== encodedPath) { - window.location.replace(stripHash(window.location.href) + '#' + encodedPath); - } else { - var location = getLocation(); - var prevLocation = history.location; - if (!forceNextPop && isLocationEqual(location, prevLocation)) { - return; - } - if (ignorePath === createPath(location)) { - return; - } - ignorePath = null; - handlePopState(location); - } - } - function handlePopState(location) { - if (forceNextPop) { - forceNextPop = false; - updateState(undefined); - } else { - var action = Action.pop; - var callback = function (isJump) { - if (isJump) { - updateState({ - action: action, - location: location - }); - } else { - revertPopState(location); - } - }; - transitionManager.confirmJumpTo(location, action, getUserConfirmation, callback); - } - } - - // 在跳转行为被Block后,用History.go()跳转回之前的页面 - function revertPopState(form) { - var to = history.location; - var delta = memRecords.getDelta(to, form); - if (delta !== 0) { - go(delta); - forceNextPop = true; - } - } - var listenerCount = 0; - function setListener(delta) { - listenerCount += delta; - if (listenerCount === 1 && delta === 1) { - window.addEventListener(EventType.HashChange, handleHashChange); - } else if (listenerCount === 0) { - window.removeEventListener(EventType.HashChange, handleHashChange); - } - } - return history; -} - -function createNamedContext(name, defaultValue) { - var context = React.createContext(defaultValue); - context.displayName = name; - return context; -} -var RouterContext = createNamedContext('Router', {}); - -var TokenType = /*#__PURE__*/function (TokenType) { - TokenType["Delimiter"] = "delimiter"; - TokenType["Static"] = "static"; - TokenType["Param"] = "param"; - TokenType["WildCard"] = "wildcard"; - TokenType["LBracket"] = "("; - TokenType["RBracket"] = ")"; - TokenType["Pattern"] = "pattern"; - return TokenType; -}({}); - -// 解析URL中的动态参数,以实现TypeScript提示功能 - -/** - * @description 将url中的//转换为/ - */ -function cleanPath(path) { - return path.replace(/\/+/g, '/'); -} -function scoreCompare(score1, score2) { - var score1Length = score1.length; - var score2Length = score2.length; - var end = Math.min(score1Length, score2Length); - for (var i = 0; i < end; i++) { - var delta = score2[i] - score1[i]; - if (delta !== 0) { - return delta; - } - } - if (score1Length === score2Length) { - return 0; - } - return score1Length > score2Length ? -1 : 1; -} - -// 把正则表达式的特殊符号加两个反斜杠进行转义 -function escapeStr(str) { - return str.replace(/([.+*?=^!:${}()[\]|/\\])/g, '\\$1'); -} - -var validChar = /[^/:*()]/; - -// 对Url模板进行词法解析,解析结果为Tokens -function lexer(path) { - var tokens = []; - if (!path) { - return tokens; - } - var urlPath = cleanPath(path); - if (urlPath !== '*' && !urlPath.startsWith('/')) { - throw new Error("Url must start with \"/\"."); - } - var getLiteral = function () { - var name = ''; - while (i < urlPath.length && validChar.test(urlPath[i])) { - name += urlPath[i]; - skipChar(1); - } - return name; - }; - var skipChar = function (step) { - i += step; - }; - var i = 0; - while (i < urlPath.length) { - var curChar = urlPath[i]; - var prevChar = urlPath[i - 1]; - if (curChar === '/') { - tokens.push({ - type: TokenType.Delimiter, - value: urlPath[i] - }); - skipChar(1); - continue; - } - // dynamic params (/:a) - if (prevChar === '/' && curChar === ':') { - skipChar(1); - tokens.push({ - type: TokenType.Param, - value: getLiteral() - }); - continue; - } - // wildCard params (/:*) - if ((prevChar === '/' || prevChar === undefined) && curChar === '*') { - tokens.push({ - type: TokenType.WildCard, - value: urlPath[i] - }); - skipChar(1); - continue; - } - // static params - if (prevChar === '/' && validChar.test(curChar)) { - tokens.push({ - type: TokenType.Static, - value: getLiteral() - }); - continue; - } - if (curChar === '(') { - tokens.push({ - type: TokenType.LBracket, - value: '(' - }); - skipChar(1); - continue; - } - if (curChar === ')') { - tokens.push({ - type: TokenType.RBracket, - value: ')' - }); - skipChar(1); - continue; - } - if (validChar.test(curChar)) { - tokens.push({ - type: TokenType.Pattern, - value: getLiteral() - }); - continue; - } - // 跳过非法字符 - skipChar(1); - } - return tokens; -} - -function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function () {}; return { s: F, n: function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function (e) { throw e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function () { it = it.call(o); }, n: function () { var step = it.next(); normalCompletion = step.done; return step; }, e: function (e) { didErr = true; err = e; }, f: function () { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; } -function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } -function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } - -// 不同类型参数的匹配得分 -var MatchScore = /*#__PURE__*/function (MatchScore) { - MatchScore[MatchScore["static"] = 10] = "static"; - MatchScore[MatchScore["param"] = 6] = "param"; - MatchScore[MatchScore["wildcard"] = 3] = "wildcard"; - MatchScore[MatchScore["placeholder"] = -1] = "placeholder"; - return MatchScore; -}(MatchScore || {}); // 兼容 react v5 matched类型 -var defaultOption = { - // url匹配时是否大小写敏感 - caseSensitive: true, - // 是否严格匹配url结尾的/ - strictMode: false, - // 是否完全精确匹配 - exact: false -}; -// 正则表达式中需要转义的字符 -var REGEX_CHARS_RE = /[.+*?^${}()[\]/\\]/g; -// 用于匹配两个//中的的值 -var BASE_PARAM_PATTERN = '[^/]+'; -var DefaultDelimiter = '/#?'; -function createPathParser(pathname) { - var option = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : defaultOption; - var _option$caseSensitive = option.caseSensitive, - caseSensitive = _option$caseSensitive === void 0 ? defaultOption.caseSensitive : _option$caseSensitive, - _option$strictMode = option.strictMode, - strictMode = _option$strictMode === void 0 ? defaultOption.strictMode : _option$strictMode, - _option$exact = option.exact, - exact = _option$exact === void 0 ? defaultOption.exact : _option$exact; - /** - * URL匹配整体流程 - * 1.词法解析,将URL模板解析为Token - * 2.使用Token生成正则表达式 - * 3.利用正则表达式解析URL中参数或填充URL模板 - */ - var pattern = '^'; - var keys = []; - var scores = []; - var tokens = lexer(pathname); - var onlyHasWildCard = tokens.length === 1 && tokens[0].type === TokenType.WildCard; - var tokenCount = tokens.length; - var lastToken = tokens[tokenCount - 1]; - for (var tokenIdx = 0; tokenIdx < tokenCount; tokenIdx++) { - var token = tokens[tokenIdx]; - var nextToken = tokens[tokenIdx + 1]; - switch (token.type) { - case TokenType.Delimiter: - pattern += '/'; - break; - case TokenType.Static: - pattern += token.value.replace(REGEX_CHARS_RE, '\\$&'); - scores.push(MatchScore.static); - break; - case TokenType.Param: - var paramRegexp = ''; - if (nextToken && nextToken.type === TokenType.LBracket) { - // 跳过当前Token和左括号 - tokenIdx += 2; - while (tokens[tokenIdx].type !== TokenType.RBracket) { - paramRegexp += tokens[tokenIdx].value; - tokenIdx++; - } - } - pattern += paramRegexp ? "((?:" + paramRegexp + "))" : "(" + BASE_PARAM_PATTERN + ")"; - keys.push(token.value); - scores.push(MatchScore.param); - break; - case TokenType.WildCard: - keys.push(token.value); - pattern += "((?:" + BASE_PARAM_PATTERN + ")" + (onlyHasWildCard ? '?' : '') + "(?:/(?:" + BASE_PARAM_PATTERN + "))*)"; - scores.push(onlyHasWildCard ? MatchScore.wildcard : MatchScore.placeholder); - break; - } - } - var isWildCard = lastToken.type === TokenType.WildCard; - if (!isWildCard && !exact) { - if (!strictMode) { - pattern += "(?:[" + escapeStr(DefaultDelimiter) + "](?=$))?"; - } - if (lastToken.type !== TokenType.Delimiter) { - pattern += "(?=[" + escapeStr(DefaultDelimiter) + "]|$)"; - } - } else { - pattern += strictMode ? '$' : "[" + escapeStr(DefaultDelimiter) + "]?$"; - } - var flag = caseSensitive ? '' : 'i'; - var regexp = new RegExp(pattern, flag); - - /** - * @description 根据给定Pattern解析path - */ - function parse(path) { - var reMatch = path.match(regexp); - if (!reMatch) { - return null; - } - var matchedPath = reMatch[0]; - var params = {}; - var parseScore = Array.from(scores); - for (var i = 1; i < reMatch.length; i++) { - var param = reMatch[i]; - var key = keys[i - 1]; - if (key === '*' && param) { - var value = param.split('/'); - if (!Array.isArray(params['*'])) { - params['*'] = value; - } else { - var _params$; - (_params$ = params['*']).push.apply(_params$, value); - } - // 完成通配符参数解析后将placeholder替换为wildcard参数的分值 - parseScore.splice.apply(parseScore, [scores.indexOf(MatchScore.placeholder), 1].concat(new Array(value.length).fill(MatchScore.wildcard))); - } else { - params[key] = param ? param : []; - } - } - var isExact = path === matchedPath; - var url = path === '/' && matchedPath === '' ? '/' : matchedPath; - return { - isExact: isExact, - path: pathname, - url: url, - score: parseScore, - params: params - }; - } - - /** - * @description 使用给定参数填充pattern,得到目标URL - */ - function compile(params) { - var path = ''; - var _iterator = _createForOfIteratorHelper(tokens), - _step; - try { - for (_iterator.s(); !(_step = _iterator.n()).done;) { - var _token = _step.value; - switch (_token.type) { - case TokenType.Static: - path += _token.value; - break; - case TokenType.Param: - if (!params[_token.value]) { - throw new Error('Param is invalid.'); - } - path += params[_token.value]; - break; - case TokenType.WildCard: - var wildCard = params['*']; - if (wildCard instanceof Array) { - path += wildCard.join('/'); - } else { - path += wildCard; - } - break; - case TokenType.Delimiter: - path += _token.value; - break; - } - } - } catch (err) { - _iterator.e(err); - } finally { - _iterator.f(); - } - return path; - } - return { - get regexp() { - return regexp; - }, - get keys() { - return keys; - }, - compile: compile, - parse: parse - }; -} - -/** - * @description 依次使用pathname与pattern进行匹配,根据匹配分数取得分数最高结果 - */ -function matchPath(pathname, pattern, option) { - var patterns = Array.isArray(pattern) ? [].concat(pattern) : [pattern]; - var matchedResults = []; - var _iterator2 = _createForOfIteratorHelper(patterns), - _step2; - try { - for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) { - var item = _step2.value; - var parser = createPathParser(item, option); - var matched = parser.parse(pathname); - if (matched) { - matchedResults.push(matched); - } - } - } catch (err) { - _iterator2.e(err); - } finally { - _iterator2.f(); - } - return !matchedResults.length ? null : matchedResults.sort(function (a, b) { - return scoreCompare(a.score, b.score); - })[0]; -} -function generatePath(path, params) { - var parser = createPathParser(path); - return parser.compile(params); -} - -function useHistory() { - return React.useContext(RouterContext).history; -} -function useLocation() { - return React.useContext(RouterContext).location; -} -function useParams() { - var match = React.useContext(RouterContext).match; - return match ? match.params : {}; -} -function useRouteMatch(path) { - var pathname = useLocation().pathname; - var match = React.useContext(RouterContext).match; - if (path) { - return matchPath(pathname, path); - } - return match; -} - -function Route(props) { - var context = React.useContext(RouterContext); - var computed = props.computed, - location = props.location, - path = props.path; - var children = props.children, - component = props.component, - render = props.render; - var match; - var routeLocation = location || context.location; - if (computed) { - match = computed; - } else if (path) { - match = matchPath(routeLocation.pathname, path); - } else { - match = context.match; - } - var newProps = _extends({}, context, { - location: routeLocation, - match: match - }); - if (Array.isArray(children) && React.Children.count(children) === 0) { - children = null; - } - - /** - * 按顺序获取需要渲染的组件 - * 1.children - * 2.component - * 3.render - * 都没有匹配到返回Null - */ - var getChildren = function () { - // 如果 match 存在 - if (newProps.match) { - if (children) { - if (typeof children === 'function') { - return children(newProps); - } - return children; - } - if (component) { - return React.createElement(component, newProps); - } else if (render) { - return render(newProps); - } else { - return null; - } - } else { - // match为null - if (typeof children === 'function') { - return children(newProps); - } - return null; - } - }; - return /*#__PURE__*/React__namespace.createElement(RouterContext.Provider, { - value: newProps - }, getChildren()); -} - -function Router(props) { - var history = props.history, - _props$children = props.children, - children = _props$children === void 0 ? null : _props$children; - var _useState = React.useState(props.history.location), - location = _useState[0], - setLocation = _useState[1]; - var pendingLocation = React.useRef(null); - - // 在Router加载时就监听history地址变化,以保证在始渲染时重定向能正确触发 - var unListen = history.listen(function (arg) { - pendingLocation.current = arg.location; - }); - - // 模拟componentDidMount和componentWillUnmount - React.useLayoutEffect(function () { - if (unListen) { - unListen(); - } - // 监听history中的位置变化 - unListen = history.listen(function (arg) { - setLocation(arg.location); - }); - if (pendingLocation.current) { - setLocation(pendingLocation.current); - } - return function () { - if (unListen) { - unListen(); - unListen = null; - pendingLocation.current = null; - } - }; - }, []); - var initContextValue = React.useMemo(function () { - return { - history: history, - location: location, - match: { - isExact: location.pathname === '/', - params: {}, - path: '/', - score: [], - url: '/' - } - }; - }, [location]); - return /*#__PURE__*/React__namespace.createElement(RouterContext.Provider, { - value: initContextValue, - children: children - }); -} - -function _objectWithoutPropertiesLoose(source, excluded) { - if (source == null) return {}; - var target = {}; - var sourceKeys = Object.keys(source); - var key, i; - for (i = 0; i < sourceKeys.length; i++) { - key = sourceKeys[i]; - if (excluded.indexOf(key) >= 0) continue; - target[key] = source[key]; - } - return target; -} - -function LifeCycle(props) { - // 使用ref保存上一次的props,防止重新渲染 - var prevProps = React.useRef(null); - var isMount = React.useRef(false); - var onMount = props.onMount, - onUpdate = props.onUpdate, - onUnmount = props.onUnmount; - React.useLayoutEffect(function () { - // 首次挂载 模拟componentDidMount - if (!isMount.current) { - isMount.current = true; - if (onMount) { - onMount(); - } - } else { - // 不是首次渲染 模拟componentDidUpdate - if (onUpdate) { - prevProps.current ? onUpdate(prevProps.current) : onUpdate(); - } - } - prevProps.current = props; - }); - - // 模拟componentWillUnmount - React.useLayoutEffect(function () { - return function () { - if (onUnmount) { - onUnmount(); - } - }; - }, []); - return null; -} - -var _excluded$2 = ["state"]; -function Redirect(props) { - var to = props.to, - _props$push = props.push, - push = _props$push === void 0 ? false : _props$push, - computed = props.computed; - var context = React.useContext(RouterContext); - var history = context.history; - var calcLocation = function () { - if (computed) { - if (typeof to === 'string') { - var parser = createPathParser(to); - var target = parser.compile(computed.params); - return parsePath(target); - } else { - var pathname = to.pathname ? addHeadSlash(to.pathname) : '/'; - var _parser = createPathParser(pathname); - var _target = _parser.compile(computed.params); - return _extends({}, to, { - pathname: _target - }); - } - } - return typeof to === 'string' ? parsePath(to) : to; - }; - var navigate = push ? history.push : history.replace; - var _calcLocation = calcLocation(), - state = _calcLocation.state, - path = _objectWithoutPropertiesLoose(_calcLocation, _excluded$2); - var onMountFunc = function () { - navigate(path, state); - }; - var onUpdateFunc = function (prevProps) { - // 如果当前页面与重定向前页面不一致,执行跳转 - var prevPath = prevProps === null || prevProps === void 0 ? void 0 : prevProps.data; - if (!isLocationEqual(prevPath, path)) { - navigate(path, state); - } - }; - return /*#__PURE__*/React__namespace.createElement(LifeCycle, { - onMount: onMountFunc, - onUpdate: onUpdateFunc, - data: path - }); -} - -function Switch(props) { - var context = React.useContext(RouterContext); - var location = props.location || context.location; - var element = null; - var match = null; - - // 使用forEach不会给React.ReactNode增加key属性,防止重新渲染 - React.Children.forEach(props.children, function (node) { - if (match === null && React.isValidElement(node)) { - element = node; - var strict; - var sensitive; - var path; - var from; - - // node可能是Route和Redirect - if (node.type === Route) { - var _props = node.props; - strict = _props.strict; - sensitive = _props.sensitive; - path = _props.path; - } else if (node.type === Redirect) { - var _props2 = node.props; - path = _props2.path; - strict = _props2.strict; - from = _props2.from; - } - var exact = node.props.exact; - var target = path || from; - - // 更新匹配状态,一旦匹配到停止遍历 - if (target) { - match = matchPath(location.pathname, target, { - strictMode: strict, - caseSensitive: sensitive, - exact: exact - }); - } else { - match = context.match; - } - } - }); - if (match && element) { - // 使用cloneElement复制已有组件并更新其Props - return React.cloneElement(element, { - location: location, - computed: match - }); - } - return null; -} - -function Prompt(props) { - var context = React.useContext(RouterContext); - var message = props.message, - _props$when = props.when, - when = _props$when === void 0 ? true : _props$when; - if (typeof when === 'function' && when(context.location) === false || !when) { - return null; - } - var navigate = context.history.block; - var release = null; - var onMountFunc = function () { - release = message ? navigate(message) : null; - }; - var onUpdateFunc = function (prevProps) { - if (prevProps && prevProps.data !== message) { - if (release) { - release(); - } - release = message ? navigate(message) : null; - } - }; - var onUnmountFunc = function () { - if (release) { - release(); - } - release = null; - }; - return /*#__PURE__*/React__namespace.createElement(LifeCycle, { - onMount: onMountFunc, - onUpdate: onUpdateFunc, - onUnmount: onUnmountFunc, - data: message - }); -} - -function withRouter(Component) { - function ComponentWithRouterProp(props) { - var _useContext = React.useContext(RouterContext), - history = _useContext.history, - location = _useContext.location, - match = _useContext.match; - var routeProps = { - history: history, - location: location, - match: match - }; - return /*#__PURE__*/React__namespace.createElement(Component, _extends({}, props, routeProps)); - } - return ComponentWithRouterProp; -} - -function HashRouter(props) { - var historyRef = React.useRef(); - if (historyRef.current === null || historyRef.current === undefined) { - historyRef.current = createHashHistory({ - basename: props.basename, - getUserConfirmation: props.getUserConfirmation, - hashType: props.hashType - }); - } - return /*#__PURE__*/React__namespace.createElement(Router, { - history: historyRef.current - }, props.children); -} - -function BrowserRouter(props) { - // 使用Ref持有History对象,防止重复渲染 - var historyRef = React.useRef(); - if (historyRef.current === null || historyRef.current === undefined) { - historyRef.current = createBrowserHistory({ - basename: props.basename, - forceRefresh: props.forceRefresh, - getUserConfirmation: props.getUserConfirmation - }); - } - return /*#__PURE__*/React__namespace.createElement(Router, { - history: historyRef.current - }, props.children); -} - -var _excluded$1 = ["to", "replace", "component", "onClick", "target"]; -var isModifiedEvent = function (event) { - return event.metaKey || event.altKey || event.ctrlKey || event.shiftKey; -}; -var checkTarget = function (target) { - return !target || target === '_self'; -}; -function Link(props) { - var to = props.to, - replace = props.replace; - props.component; - var onClick = props.onClick, - target = props.target, - other = _objectWithoutPropertiesLoose(props, _excluded$1); - var tag = props.tag || 'a'; - var context = React.useContext(RouterContext); - var history = context.history; - var location = typeof to === 'function' ? to(context.location) : to; - var state; - var path; - if (typeof location === 'string') { - path = parsePath(location); - } else { - var pathname = location.pathname, - hash = location.hash, - search = location.search; - path = { - pathname: pathname, - hash: hash, - search: search - }; - state = location.state; - } - var href = history.createHref(path); - var linkClickEvent = function (event) { - try { - if (onClick) { - onClick(event); - } - } catch (e) { - event.preventDefault(); - throw e; - } - if (!event.defaultPrevented && event.button === 0 && checkTarget(target) && !isModifiedEvent(event)) { - // 不是相同的路径执行push操作,是相同的路径执行replace - var isSamePath = createPath(context.location) === createPath(path); - var navigate = replace || isSamePath ? history.replace : history.push; - event.preventDefault(); - navigate(path, state); - } - }; - var linkProps = _extends({ - href: href, - onClick: linkClickEvent - }, other); - return React__namespace.createElement(tag, linkProps); -} - -var _excluded = ["to", "isActive"]; -function NavLink(props) { - var to = props.to, - isActive = props.isActive, - rest = _objectWithoutPropertiesLoose(props, _excluded); - var context = React.useContext(RouterContext); - var toLocation = typeof to === 'function' ? to(context.location) : to; - var _ref = typeof toLocation === 'string' ? parsePath(toLocation) : toLocation, - path = _ref.pathname; - // 把正则表达式的特殊符号加两个反斜杠进行转义 - var escapedPath = path ? escapeStr(path) : ''; - var match = escapedPath ? matchPath(context.location.pathname, escapedPath) : null; - var isLinkActive = match && isActive ? isActive(match, context.location) : false; - var page = 'page'; - var otherProps = _extends({ - 'aria-current': isLinkActive ? page : false - }, rest); - return /*#__PURE__*/React__namespace.createElement(Link, _extends({ - to: to - }, otherProps)); -} - -exports.BrowserRouter = BrowserRouter; -exports.HashRouter = HashRouter; -exports.Link = Link; -exports.NavLink = NavLink; -exports.Prompt = Prompt; -exports.Redirect = Redirect; -exports.Route = Route; -exports.Router = Router; -exports.Switch = Switch; -exports.__RouterContext = RouterContext; -exports.createBrowserHistory = createBrowserHistory; -exports.createHashHistory = createHashHistory; -exports.generatePath = generatePath; -exports.matchPath = matchPath; -exports.useHistory = useHistory; -exports.useLocation = useLocation; -exports.useParams = useParams; -exports.useRouteMatch = useRouteMatch; -exports.withRouter = withRouter; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGVyLmpzIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaGlzdG9yeS9kb20udHMiLCIuLi8uLi9zcmMvaGlzdG9yeS90eXBlcy50cyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzLmpzIiwiLi4vLi4vc3JjL2hpc3RvcnkvdXRpbHMudHMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY2xhc3NDYWxsQ2hlY2suanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdHlwZW9mLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvUHJpbWl0aXZlLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvUHJvcGVydHlLZXkuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY3JlYXRlQ2xhc3MuanMiLCIuLi8uLi9zcmMvaGlzdG9yeS90cmFuc2l0aW9uTWFuYWdlci50cyIsIi4uLy4uL3NyYy9oaXN0b3J5L3dhcmluZy50cyIsIi4uLy4uL3NyYy9oaXN0b3J5L2Jhc2VIaXN0b3J5LnRzIiwiLi4vLi4vc3JjL2hpc3RvcnkvYnJvd2VySGlzdG9yeS50cyIsIi4uLy4uL3NyYy9oaXN0b3J5L2hhc2hIaXN0b3J5LnRzIiwiLi4vLi4vc3JjL3JvdXRlci9jb250ZXh0LnRzeCIsIi4uLy4uL3NyYy9yb3V0ZXIvbWF0Y2hlci90eXBlcy50cyIsIi4uLy4uL3NyYy9yb3V0ZXIvbWF0Y2hlci91dGlscy50cyIsIi4uLy4uL3NyYy9yb3V0ZXIvbWF0Y2hlci9sZXhlci50cyIsIi4uLy4uL3NyYy9yb3V0ZXIvbWF0Y2hlci9wYXJzZXIudHMiLCIuLi8uLi9zcmMvcm91dGVyL2hvb2tzLnRzIiwiLi4vLi4vc3JjL3JvdXRlci9Sb3V0ZS50c3giLCIuLi8uLi9zcmMvcm91dGVyL1JvdXRlci50c3giLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZS5qcyIsIi4uLy4uL3NyYy9yb3V0ZXIvbGlmZUN5Y2xlSG9vay50cyIsIi4uLy4uL3NyYy9yb3V0ZXIvUmVkaXJlY3QudHN4IiwiLi4vLi4vc3JjL3JvdXRlci9Td2l0Y2gudHN4IiwiLi4vLi4vc3JjL3JvdXRlci9Qcm9tcHQudHN4IiwiLi4vLi4vc3JjL3JvdXRlci93aXRoUm91dGVyLnRzeCIsIi4uLy4uL3NyYy9yb3V0ZXIvSGFzaFJvdXRlci50c3giLCIuLi8uLi9zcmMvcm91dGVyL0Jyb3dzZXJSb3V0ZXIudHN4IiwiLi4vLi4vc3JjL3JvdXRlci9MaW5rLnRzeCIsIi4uLy4uL3NyYy9yb3V0ZXIvTmF2TGluay50c3giXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGZ1bmN0aW9uIGlzQnJvd3NlcigpOiBib29sZWFuIHtcclxuICByZXR1cm4gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LmRvY3VtZW50ICYmIHR5cGVvZiB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCA9PT0gJ2Z1bmN0aW9uJztcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldERlZmF1bHRDb25maXJtYXRpb24obWVzc2FnZTogc3RyaW5nLCBjYWxsQmFjazogKHJlc3VsdDogYm9vbGVhbikgPT4gdm9pZCkge1xyXG4gIGNhbGxCYWNrKHdpbmRvdy5jb25maXJtKG1lc3NhZ2UpKTtcclxufVxyXG5cclxuLy8g5Yik5pat5rWP6KeI5Zmo5piv5ZCm5pSv5oyBcHVzaFN0YXRl5pa55rOV77yMcHVzaFN0YXRl5pivYnJvd3Nlckhpc3Rvcnnlrp7njrDnmoTln7rnoYBcclxuZXhwb3J0IGZ1bmN0aW9uIGlzU3VwcG9ydEhpc3RvcnkoKTogYm9vbGVhbiB7XHJcbiAgcmV0dXJuIGlzQnJvd3NlcigpICYmIHdpbmRvdy5oaXN0b3J5ICYmICdwdXNoU3RhdGUnIGluIHdpbmRvdy5oaXN0b3J5O1xyXG59XHJcblxyXG4vLyDliKTmlq3mtY/op4jlmajmmK/lkKbmlK/mjIFQb3BTdGF0ZeS6i+S7tlxyXG5leHBvcnQgZnVuY3Rpb24gaXNTdXBwb3J0c1BvcFN0YXRlKCk6IGJvb2xlYW4ge1xyXG4gIHJldHVybiB3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdUcmlkZW50JykgPT09IC0xO1xyXG59XHJcbiIsImV4cG9ydCB0eXBlIEJhc2VPcHRpb24gPSB7XHJcbiAgYmFzZW5hbWU/OiBzdHJpbmc7XHJcbiAgZ2V0VXNlckNvbmZpcm1hdGlvbj86IENvbmZpcm1hdGlvbkZ1bmM7XHJcbn07XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEhpc3RvcnlQcm9wczxUID0gdW5rbm93bj4ge1xyXG4gIHJlYWRvbmx5IGFjdGlvbjogQWN0aW9uO1xyXG5cclxuICByZWFkb25seSBsb2NhdGlvbjogTG9jYXRpb248VD47XHJcblxyXG4gIGxlbmd0aDogbnVtYmVyO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEhpc3Rvcnk8VCA9IHVua25vd24+IGV4dGVuZHMgSGlzdG9yeVByb3BzPFQ+IHtcclxuICBjcmVhdGVIcmVmKHBhdGg6IFBhcnRpYWw8UGF0aD4pOiBzdHJpbmc7XHJcblxyXG4gIHB1c2godG86IFRvLCBzdGF0ZT86IFQpOiB2b2lkO1xyXG5cclxuICByZXBsYWNlKHRvOiBUbywgc3RhdGU/OiBUKTogdm9pZDtcclxuXHJcbiAgbGlzdGVuKGxpc3RlbmVyOiBMaXN0ZW5lcjxUPik6ICgpID0+IHZvaWQ7XHJcblxyXG4gIGJsb2NrKHByb21wdDogUHJvbXB0PFQ+KTogKCkgPT4gdm9pZDtcclxuXHJcbiAgZ28oaW5kZXg6IG51bWJlcik6IHZvaWQ7XHJcblxyXG4gIGdvQmFjaygpOiB2b2lkO1xyXG5cclxuICBnb0ZvcndhcmQoKTogdm9pZDtcclxufVxyXG5cclxuZXhwb3J0IGVudW0gQWN0aW9uIHtcclxuICBwb3AgPSAnUE9QJyxcclxuICBwdXNoID0gJ1BVU0gnLFxyXG4gIHJlcGxhY2UgPSAnUkVQTEFDRScsXHJcbn1cclxuXHJcbmV4cG9ydCBlbnVtIEV2ZW50VHlwZSB7XHJcbiAgUG9wU3RhdGUgPSAncG9wc3RhdGUnLFxyXG4gIEhhc2hDaGFuZ2UgPSAnaGFzaGNoYW5nZScsXHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIFBhdGggPSB7XHJcbiAgcGF0aG5hbWU6IHN0cmluZztcclxuXHJcbiAgc2VhcmNoOiBzdHJpbmc7XHJcblxyXG4gIGhhc2g6IHN0cmluZztcclxufTtcclxuXHJcbmV4cG9ydCB0eXBlIEhpc3RvcnlTdGF0ZTxUPiA9IHtcclxuICBzdGF0ZT86IFQ7XHJcblxyXG4gIGtleTogc3RyaW5nO1xyXG59O1xyXG5cclxuZXhwb3J0IHR5cGUgRGVmYXVsdFN0YXRlVHlwZSA9IHVua25vd247XHJcblxyXG5leHBvcnQgdHlwZSBMb2NhdGlvbjxUID0gdW5rbm93bj4gPSBQYXRoICYgSGlzdG9yeVN0YXRlPFQ+O1xyXG5cclxuZXhwb3J0IHR5cGUgVG8gPSBzdHJpbmcgfCBQYXJ0aWFsPFBhdGg+O1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBMaXN0ZW5lcjxUID0gdW5rbm93bj4ge1xyXG4gIChuYXZpZ2F0aW9uOiBOYXZpZ2F0aW9uPFQ+KTogdm9pZDtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBOYXZpZ2F0aW9uPFQgPSB1bmtub3duPiB7XHJcbiAgYWN0aW9uOiBBY3Rpb247XHJcblxyXG4gIGxvY2F0aW9uOiBMb2NhdGlvbjxUPjtcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgUHJvbXB0PFM+ID0gc3RyaW5nIHwgYm9vbGVhbiB8IG51bGwgfCAoKGxvY2F0aW9uOiBMb2NhdGlvbjxTPiwgYWN0aW9uOiBBY3Rpb24pID0+IHZvaWQpO1xyXG5cclxuZXhwb3J0IHR5cGUgQ2FsbEJhY2tGdW5jID0gKGlzSnVtcDogYm9vbGVhbikgPT4gdm9pZDtcclxuXHJcbmV4cG9ydCB0eXBlIENvbmZpcm1hdGlvbkZ1bmMgPSAobWVzc2FnZTogc3RyaW5nLCBjYWxsQmFjazogQ2FsbEJhY2tGdW5jKSA9PiB2b2lkO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBUTWFuYWdlcjxTPiB7XHJcbiAgc2V0UHJvbXB0KG5leHQ6IFByb21wdDxTPik6ICgpID0+IHZvaWQ7XHJcblxyXG4gIGFkZExpc3RlbmVyKGZ1bmM6IChuYXZpZ2F0aW9uOiBOYXZpZ2F0aW9uPFM+KSA9PiB2b2lkKTogKCkgPT4gdm9pZDtcclxuXHJcbiAgbm90aWZ5TGlzdGVuZXJzKGFyZ3M6IE5hdmlnYXRpb248Uz4pOiB2b2lkO1xyXG5cclxuICBjb25maXJtSnVtcFRvKFxyXG4gICAgbG9jYXRpb246IExvY2F0aW9uPFM+LFxyXG4gICAgYWN0aW9uOiBBY3Rpb24sXHJcbiAgICB1c2VyQ29uZmlybWF0aW9uRnVuYzogQ29uZmlybWF0aW9uRnVuYyxcclxuICAgIGNhbGxCYWNrOiBDYWxsQmFja0Z1bmMsXHJcbiAgKTogdm9pZDtcclxufVxyXG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfZXh0ZW5kcygpIHtcbiAgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduID8gT2JqZWN0LmFzc2lnbi5iaW5kKCkgOiBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07XG4gICAgICBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7XG4gICAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9O1xuICByZXR1cm4gX2V4dGVuZHMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn0iLCJpbXBvcnQgeyBBY3Rpb24sIExvY2F0aW9uLCBQYXRoLCBUbyB9IGZyb20gJy4vdHlwZXMnO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVBhdGgocGF0aDogUGFydGlhbDxQYXRoPik6IHN0cmluZyB7XHJcbiAgY29uc3QgeyBzZWFyY2gsIGhhc2ggfSA9IHBhdGg7XHJcbiAgbGV0IHBhdGhuYW1lID0gcGF0aC5wYXRobmFtZSB8fCAnLyc7XHJcbiAgaWYgKHNlYXJjaCAmJiBzZWFyY2ggIT09ICc/Jykge1xyXG4gICAgcGF0aG5hbWUgKz0gc2VhcmNoLnN0YXJ0c1dpdGgoJz8nKSA/IHNlYXJjaCA6ICc/JyArIHNlYXJjaDtcclxuICB9XHJcbiAgaWYgKGhhc2ggJiYgaGFzaCAhPT0gJyMnKSB7XHJcbiAgICBwYXRobmFtZSArPSBoYXNoLnN0YXJ0c1dpdGgoJyMnKSA/IGhhc2ggOiAnIycgKyBoYXNoO1xyXG4gIH1cclxuICByZXR1cm4gcGF0aG5hbWU7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVBhdGgodXJsOiBzdHJpbmcpOiBQYXJ0aWFsPFBhdGg+IHtcclxuICBpZiAoIXVybCkge1xyXG4gICAgcmV0dXJuIHt9O1xyXG4gIH1cclxuICBsZXQgcGFyc2VkUGF0aDogUGFydGlhbDxQYXRoPiA9IHt9O1xyXG5cclxuICBsZXQgaGFzaElkeCA9IHVybC5pbmRleE9mKCcjJyk7XHJcbiAgaWYgKGhhc2hJZHggPiAtMSkge1xyXG4gICAgcGFyc2VkUGF0aC5oYXNoID0gdXJsLnN1YnN0cmluZyhoYXNoSWR4KTtcclxuICAgIHVybCA9IHVybC5zdWJzdHJpbmcoMCwgaGFzaElkeCk7XHJcbiAgfVxyXG5cclxuICBsZXQgc2VhcmNoSWR4ID0gdXJsLmluZGV4T2YoJz8nKTtcclxuICBpZiAoc2VhcmNoSWR4ID4gLTEpIHtcclxuICAgIHBhcnNlZFBhdGguc2VhcmNoID0gdXJsLnN1YnN0cmluZyhzZWFyY2hJZHgpO1xyXG4gICAgdXJsID0gdXJsLnN1YnN0cmluZygwLCBzZWFyY2hJZHgpO1xyXG4gIH1cclxuICBpZiAodXJsKSB7XHJcbiAgICBwYXJzZWRQYXRoLnBhdGhuYW1lID0gdXJsO1xyXG4gIH1cclxuICByZXR1cm4gcGFyc2VkUGF0aDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUxvY2F0aW9uPFM+KGN1cnJlbnQ6IHN0cmluZyB8IExvY2F0aW9uLCB0bzogVG8sIHN0YXRlPzogUywga2V5Pzogc3RyaW5nKTogUmVhZG9ubHk8TG9jYXRpb248Uz4+IHtcclxuICBsZXQgcGF0aG5hbWUgPSB0eXBlb2YgY3VycmVudCA9PT0gJ3N0cmluZycgPyBjdXJyZW50IDogY3VycmVudC5wYXRobmFtZTtcclxuICBsZXQgdXJsT2JqID0gdHlwZW9mIHRvID09PSAnc3RyaW5nJyA/IHBhcnNlUGF0aCh0bykgOiB0bztcclxuICAvLyDpmo/mnLprZXnplb/luqblj5Y2XHJcbiAgY29uc3QgZ2V0UmFuZEtleSA9IGdlblJhbmRvbUtleSg2KTtcclxuICBjb25zdCBsb2NhdGlvbiA9IHtcclxuICAgIHBhdGhuYW1lOiBwYXRobmFtZSxcclxuICAgIHNlYXJjaDogJycsXHJcbiAgICBoYXNoOiAnJyxcclxuICAgIHN0YXRlOiBzdGF0ZSxcclxuICAgIGtleTogdHlwZW9mIGtleSA9PT0gJ3N0cmluZycgPyBrZXkgOiBnZXRSYW5kS2V5KCksXHJcbiAgICAuLi51cmxPYmosXHJcbiAgfTtcclxuICBpZiAoIWxvY2F0aW9uLnBhdGhuYW1lKSB7XHJcbiAgICBsb2NhdGlvbi5wYXRobmFtZSA9ICcvJztcclxuICB9XHJcbiAgcmV0dXJuIGxvY2F0aW9uO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXNMb2NhdGlvbkVxdWFsKHAxOiBQYXJ0aWFsPFBhdGg+LCBwMjogUGFydGlhbDxQYXRoPikge1xyXG4gIHJldHVybiBwMS5wYXRobmFtZSA9PT0gcDIucGF0aG5hbWUgJiYgcDEuc2VhcmNoID09PSBwMi5zZWFyY2ggJiYgcDEuaGFzaCA9PT0gcDIuaGFzaDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGFkZEhlYWRTbGFzaChwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gIGlmIChwYXRoWzBdID09PSAnLycpIHtcclxuICAgIHJldHVybiBwYXRoO1xyXG4gIH1cclxuICByZXR1cm4gJy8nICsgcGF0aDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHN0cmlwSGVhZFNsYXNoKHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgaWYgKHBhdGhbMF0gPT09ICcvJykge1xyXG4gICAgcmV0dXJuIHBhdGguc3Vic3RyaW5nKDEpO1xyXG4gIH1cclxuICByZXR1cm4gcGF0aDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVNsYXNoKHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgY29uc3QgdGVtcFBhdGggPSBhZGRIZWFkU2xhc2gocGF0aCk7XHJcbiAgaWYgKHRlbXBQYXRoW3RlbXBQYXRoLmxlbmd0aCAtIDFdID09PSAnLycpIHtcclxuICAgIHJldHVybiB0ZW1wUGF0aC5zdWJzdHJpbmcoMCwgdGVtcFBhdGgubGVuZ3RoIC0gMSk7XHJcbiAgfVxyXG4gIHJldHVybiB0ZW1wUGF0aDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGhhc0Jhc2VuYW1lKHBhdGg6IHN0cmluZywgcHJlZml4OiBzdHJpbmcpOiBCb29sZWFuIHtcclxuICByZXR1cm4gKFxyXG4gICAgcGF0aC50b0xvd2VyQ2FzZSgpLmluZGV4T2YocHJlZml4LnRvTG93ZXJDYXNlKCkpID09PSAwICYmIFsnLycsICc/JywgJyMnLCAnJ10uaW5jbHVkZXMocGF0aC5jaGFyQXQocHJlZml4Lmxlbmd0aCkpXHJcbiAgKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHN0cmlwQmFzZW5hbWUocGF0aDogc3RyaW5nLCBwcmVmaXg6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgcmV0dXJuIGhhc0Jhc2VuYW1lKHBhdGgsIHByZWZpeCkgPyBwYXRoLnN1YnN0cmluZyhwcmVmaXgubGVuZ3RoKSA6IHBhdGg7XHJcbn1cclxuXHJcbi8vIOS9v+eUqOmaj+acuueUn+aIkOeahEtleeiusOW9leiiq+iuv+mXrui/h+eahFVSTO+8jOW9k0Jsb2Nr6KKr6KKr6Kem5Y+R5pe25Yip55SoZGVsdGHlgLzot7PovazliLDkuYvliY3nmoTpobXpnaJcclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1lbW9yeVJlY29yZDxULCBTPihpbml0VmFsOiBTLCBmbjogKGFyZzogUykgPT4gVCkge1xyXG4gIGxldCB2aXNpdGVkUmVjb3JkOiBUW10gPSBbZm4oaW5pdFZhbCldO1xyXG5cclxuICBmdW5jdGlvbiBnZXREZWx0YSh0bzogUywgZm9ybTogUyk6IG51bWJlciB7XHJcbiAgICBsZXQgdG9JZHggPSB2aXNpdGVkUmVjb3JkLmxhc3RJbmRleE9mKGZuKHRvKSk7XHJcbiAgICBpZiAodG9JZHggPT09IC0xKSB7XHJcbiAgICAgIHRvSWR4ID0gMDtcclxuICAgIH1cclxuICAgIGxldCBmcm9tSWR4ID0gdmlzaXRlZFJlY29yZC5sYXN0SW5kZXhPZihmbihmb3JtKSk7XHJcbiAgICBpZiAoZnJvbUlkeCA9PT0gLTEpIHtcclxuICAgICAgZnJvbUlkeCA9IDA7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdG9JZHggLSBmcm9tSWR4O1xyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gYWRkUmVjb3JkKGN1cnJlbnQ6IFMsIG5ld1JlY29yZDogUywgYWN0aW9uOiBBY3Rpb24pIHtcclxuICAgIGNvbnN0IGN1clZhbCA9IGZuKGN1cnJlbnQpO1xyXG4gICAgY29uc3QgTmV3VmFsID0gZm4obmV3UmVjb3JkKTtcclxuICAgIGlmIChhY3Rpb24gPT09IEFjdGlvbi5wdXNoKSB7XHJcbiAgICAgIGNvbnN0IHByZXZJZHggPSB2aXNpdGVkUmVjb3JkLmxhc3RJbmRleE9mKGN1clZhbCk7XHJcbiAgICAgIGNvbnN0IG5ld1Zpc2l0ZWRSZWNvcmQgPSB2aXNpdGVkUmVjb3JkLnNsaWNlKDAsIHByZXZJZHggKyAxKTtcclxuICAgICAgbmV3VmlzaXRlZFJlY29yZC5wdXNoKE5ld1ZhbCk7XHJcbiAgICAgIHZpc2l0ZWRSZWNvcmQgPSBuZXdWaXNpdGVkUmVjb3JkO1xyXG4gICAgfVxyXG4gICAgaWYgKGFjdGlvbiA9PT0gQWN0aW9uLnJlcGxhY2UpIHtcclxuICAgICAgY29uc3QgcHJldklkeCA9IHZpc2l0ZWRSZWNvcmQubGFzdEluZGV4T2YoY3VyVmFsKTtcclxuICAgICAgaWYgKHByZXZJZHggIT09IC0xKSB7XHJcbiAgICAgICAgdmlzaXRlZFJlY29yZFtwcmV2SWR4XSA9IE5ld1ZhbDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHsgZ2V0RGVsdGEsIGFkZFJlY29yZCB9O1xyXG59XHJcblxyXG5mdW5jdGlvbiBnZW5SYW5kb21LZXkobGVuZ3RoOiBudW1iZXIpOiAoKSA9PiBzdHJpbmcge1xyXG4gIGNvbnN0IGVuZCA9IGxlbmd0aCArIDI7XHJcbiAgcmV0dXJuICgpID0+IHtcclxuICAgIHJldHVybiBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDE4KS5zdWJzdHJpbmcoMiwgZW5kKTtcclxuICB9O1xyXG59XHJcbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHtcbiAgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpO1xuICB9XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX3R5cGVvZihvYmopIHtcbiAgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiO1xuXG4gIHJldHVybiBfdHlwZW9mID0gXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgXCJzeW1ib2xcIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKG9iaikge1xuICAgIHJldHVybiB0eXBlb2Ygb2JqO1xuICB9IDogZnVuY3Rpb24gKG9iaikge1xuICAgIHJldHVybiBvYmogJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7XG4gIH0sIF90eXBlb2Yob2JqKTtcbn0iLCJpbXBvcnQgX3R5cGVvZiBmcm9tIFwiLi90eXBlb2YuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF90b1ByaW1pdGl2ZShpbnB1dCwgaGludCkge1xuICBpZiAoX3R5cGVvZihpbnB1dCkgIT09IFwib2JqZWN0XCIgfHwgaW5wdXQgPT09IG51bGwpIHJldHVybiBpbnB1dDtcbiAgdmFyIHByaW0gPSBpbnB1dFtTeW1ib2wudG9QcmltaXRpdmVdO1xuICBpZiAocHJpbSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdmFyIHJlcyA9IHByaW0uY2FsbChpbnB1dCwgaGludCB8fCBcImRlZmF1bHRcIik7XG4gICAgaWYgKF90eXBlb2YocmVzKSAhPT0gXCJvYmplY3RcIikgcmV0dXJuIHJlcztcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQEB0b1ByaW1pdGl2ZSBtdXN0IHJldHVybiBhIHByaW1pdGl2ZSB2YWx1ZS5cIik7XG4gIH1cbiAgcmV0dXJuIChoaW50ID09PSBcInN0cmluZ1wiID8gU3RyaW5nIDogTnVtYmVyKShpbnB1dCk7XG59IiwiaW1wb3J0IF90eXBlb2YgZnJvbSBcIi4vdHlwZW9mLmpzXCI7XG5pbXBvcnQgdG9QcmltaXRpdmUgZnJvbSBcIi4vdG9QcmltaXRpdmUuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF90b1Byb3BlcnR5S2V5KGFyZykge1xuICB2YXIga2V5ID0gdG9QcmltaXRpdmUoYXJnLCBcInN0cmluZ1wiKTtcbiAgcmV0dXJuIF90eXBlb2Yoa2V5KSA9PT0gXCJzeW1ib2xcIiA/IGtleSA6IFN0cmluZyhrZXkpO1xufSIsImltcG9ydCB0b1Byb3BlcnR5S2V5IGZyb20gXCIuL3RvUHJvcGVydHlLZXkuanNcIjtcbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07XG4gICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlO1xuICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTtcbiAgICBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHRvUHJvcGVydHlLZXkoZGVzY3JpcHRvci5rZXkpLCBkZXNjcmlwdG9yKTtcbiAgfVxufVxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykge1xuICBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTtcbiAgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29uc3RydWN0b3IsIFwicHJvdG90eXBlXCIsIHtcbiAgICB3cml0YWJsZTogZmFsc2VcbiAgfSk7XG4gIHJldHVybiBDb25zdHJ1Y3Rvcjtcbn0iLCJpbXBvcnQgeyBBY3Rpb24sIENhbGxCYWNrRnVuYywgQ29uZmlybWF0aW9uRnVuYywgTGlzdGVuZXIsIExvY2F0aW9uLCBOYXZpZ2F0aW9uLCBQcm9tcHQsIFRNYW5hZ2VyIH0gZnJvbSAnLi90eXBlcyc7XHJcblxyXG5jbGFzcyBUcmFuc2l0aW9uTWFuYWdlcjxTPiBpbXBsZW1lbnRzIFRNYW5hZ2VyPFM+IHtcclxuICBwcml2YXRlIHByb21wdDogUHJvbXB0PFM+O1xyXG4gIHByaXZhdGUgbGlzdGVuZXJzOiBMaXN0ZW5lcjxTPltdO1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIHRoaXMucHJvbXB0ID0gbnVsbDtcclxuICAgIHRoaXMubGlzdGVuZXJzID0gW107XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0UHJvbXB0KHByb21wdDogUHJvbXB0PFM+KTogKCkgPT4gdm9pZCB7XHJcbiAgICB0aGlzLnByb21wdCA9IHByb21wdDtcclxuXHJcbiAgICAvLyDmuIXpmaRQcm9tcHRcclxuICAgIHJldHVybiAoKSA9PiB7XHJcbiAgICAgIGlmICh0aGlzLnByb21wdCA9PT0gcHJvbXB0KSB7XHJcbiAgICAgICAgdGhpcy5wcm9tcHQgPSBudWxsO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLy8g5L2/55So5Y+R5biD6K6i6ZiF5qih5byP566h55CGaGlzdG9yeeeahOebkeWQrOiAhVxyXG4gIHB1YmxpYyBhZGRMaXN0ZW5lcihmdW5jOiBMaXN0ZW5lcjxTPik6ICgpID0+IHZvaWQge1xyXG4gICAgbGV0IGlzQWN0aXZlID0gdHJ1ZTtcclxuICAgIGNvbnN0IGxpc3RlbmVyID0gKGFyZ3M6IE5hdmlnYXRpb248Uz4pID0+IHtcclxuICAgICAgaWYgKGlzQWN0aXZlKSB7XHJcbiAgICAgICAgZnVuYyhhcmdzKTtcclxuICAgICAgfVxyXG4gICAgfTtcclxuICAgIHRoaXMubGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xyXG4gICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgaXNBY3RpdmUgPSBmYWxzZTtcclxuICAgICAgLy8g56e76Zmk5a+55bqU55qE55uR5ZCs6ICFXHJcbiAgICAgIHRoaXMubGlzdGVuZXJzID0gdGhpcy5saXN0ZW5lcnMuZmlsdGVyKGl0ZW0gPT4gaXRlbSAhPT0gbGlzdGVuZXIpO1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBub3RpZnlMaXN0ZW5lcnMoYXJnczogTmF2aWdhdGlvbjxTPikge1xyXG4gICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiB0aGlzLmxpc3RlbmVycykge1xyXG4gICAgICBsaXN0ZW5lcihhcmdzKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBjb25maXJtSnVtcFRvKFxyXG4gICAgbG9jYXRpb246IExvY2F0aW9uPFM+LFxyXG4gICAgYWN0aW9uOiBBY3Rpb24sXHJcbiAgICB1c2VyQ29uZmlybWF0aW9uRnVuYzogQ29uZmlybWF0aW9uRnVuYyxcclxuICAgIGNhbGxCYWNrOiBDYWxsQmFja0Z1bmNcclxuICApIHtcclxuICAgIGlmICh0aGlzLnByb21wdCAhPT0gbnVsbCkge1xyXG4gICAgICBjb25zdCByZXN1bHQgPSB0eXBlb2YgdGhpcy5wcm9tcHQgPT09ICdmdW5jdGlvbicgPyB0aGlzLnByb21wdChsb2NhdGlvbiwgYWN0aW9uKSA6IHRoaXMucHJvbXB0O1xyXG4gICAgICBpZiAodHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICB0eXBlb2YgdXNlckNvbmZpcm1hdGlvbkZ1bmMgPT09ICdmdW5jdGlvbicgPyB1c2VyQ29uZmlybWF0aW9uRnVuYyhyZXN1bHQsIGNhbGxCYWNrKSA6IGNhbGxCYWNrKHRydWUpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNhbGxCYWNrKHJlc3VsdCAhPT0gZmFsc2UpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjYWxsQmFjayh0cnVlKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFRyYW5zaXRpb25NYW5hZ2VyO1xyXG4iLCJmdW5jdGlvbiB3YXJuaW5nKGNvbmRpdGlvbjogYW55LCBtZXNzYWdlOiBzdHJpbmcpIHtcclxuICBpZiAoY29uZGl0aW9uKSB7XHJcbiAgICBpZiAoY29uc29sZSAmJiB0eXBlb2YgY29uc29sZS53YXJuID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihtZXNzYWdlKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IHdhcm5pbmc7IiwiaW1wb3J0IHsgSGlzdG9yeVByb3BzLCBMaXN0ZW5lciwgTmF2aWdhdGlvbiwgUHJvbXB0IH0gZnJvbSAnLi90eXBlcyc7XHJcbmltcG9ydCB0cmFuc2l0aW9uTWFuYWdlciBmcm9tICcuL3RyYW5zaXRpb25NYW5hZ2VyJztcclxuXHJcbi8vIOaKveWPlkJyb3dzZXJIaXN0b3J55ZKMSGFzaEhpc3RvcnnkuK3nm7jlkIznmoTmlrnms5VcclxuZXhwb3J0IGZ1bmN0aW9uIGdldEJhc2VIaXN0b3J5PFM+KFxyXG4gIHRyYW5zaXRpb25NYW5hZ2VyOiB0cmFuc2l0aW9uTWFuYWdlcjxTPixcclxuICBzZXRMaXN0ZW5lcjogKGRlbHRhOiBudW1iZXIpID0+IHZvaWQsXHJcbiAgYnJvd3Nlckhpc3Rvcnk6IEhpc3RvcnksXHJcbikge1xyXG4gIGZ1bmN0aW9uIGdvKHN0ZXA6IG51bWJlcikge1xyXG4gICAgYnJvd3Nlckhpc3RvcnkuZ28oc3RlcCk7XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiBnb0JhY2soKSB7XHJcbiAgICBicm93c2VySGlzdG9yeS5nbygtMSk7XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiBnb0ZvcndhcmQoKSB7XHJcbiAgICBicm93c2VySGlzdG9yeS5nbygxKTtcclxuICB9XHJcblxyXG4gIGZ1bmN0aW9uIGxpc3RlbihsaXN0ZW5lcjogTGlzdGVuZXI8Uz4pOiAoKSA9PiB2b2lkIHtcclxuICAgIGNvbnN0IGNhbmNlbCA9IHRyYW5zaXRpb25NYW5hZ2VyLmFkZExpc3RlbmVyKGxpc3RlbmVyKTtcclxuICAgIHNldExpc3RlbmVyKDEpO1xyXG4gICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgc2V0TGlzdGVuZXIoLTEpO1xyXG4gICAgICBjYW5jZWwoKTtcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBsZXQgaXNCbG9ja2VkID0gZmFsc2U7XHJcblxyXG4gIGZ1bmN0aW9uIGJsb2NrKHByb21wdDogUHJvbXB0PFM+ID0gZmFsc2UpOiAoKSA9PiB2b2lkIHtcclxuICAgIGNvbnN0IHVuYmxvY2sgPSB0cmFuc2l0aW9uTWFuYWdlci5zZXRQcm9tcHQocHJvbXB0KTtcclxuICAgIGlmICghaXNCbG9ja2VkKSB7XHJcbiAgICAgIHNldExpc3RlbmVyKDEpO1xyXG4gICAgICBpc0Jsb2NrZWQgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgaWYgKGlzQmxvY2tlZCkge1xyXG4gICAgICAgIGlzQmxvY2tlZCA9IGZhbHNlO1xyXG4gICAgICAgIHNldExpc3RlbmVyKC0xKTtcclxuICAgICAgfVxyXG4gICAgICB1bmJsb2NrKCk7XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gZ2V0VXBkYXRlU3RhdGVGdW5jKGhpc3RvcnlQcm9wczogSGlzdG9yeVByb3BzPFM+KSB7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKG5leHRTdGF0ZTogTmF2aWdhdGlvbjxTPiB8IHVuZGVmaW5lZCkge1xyXG4gICAgICBpZiAobmV4dFN0YXRlKSB7XHJcbiAgICAgICAgT2JqZWN0LmFzc2lnbihoaXN0b3J5UHJvcHMsIG5leHRTdGF0ZSk7XHJcbiAgICAgIH1cclxuICAgICAgaGlzdG9yeVByb3BzLmxlbmd0aCA9IGJyb3dzZXJIaXN0b3J5Lmxlbmd0aDtcclxuICAgICAgY29uc3QgYXJncyA9IHsgbG9jYXRpb246IGhpc3RvcnlQcm9wcy5sb2NhdGlvbiwgYWN0aW9uOiBoaXN0b3J5UHJvcHMuYWN0aW9uIH07XHJcbiAgICAgIHRyYW5zaXRpb25NYW5hZ2VyLm5vdGlmeUxpc3RlbmVycyhhcmdzKTtcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICByZXR1cm4geyBnbywgZ29CYWNrLCBnb0ZvcndhcmQsIGxpc3RlbiwgYmxvY2ssIGdldFVwZGF0ZVN0YXRlRnVuYyB9O1xyXG59XHJcbiIsImltcG9ydCB7IGdldERlZmF1bHRDb25maXJtYXRpb24sIGlzU3VwcG9ydEhpc3RvcnksIGlzU3VwcG9ydHNQb3BTdGF0ZSB9IGZyb20gJy4vZG9tJztcclxuaW1wb3J0IHsgQWN0aW9uLCBCYXNlT3B0aW9uLCBEZWZhdWx0U3RhdGVUeXBlLCBFdmVudFR5cGUsIEhpc3RvcnksIEhpc3RvcnlTdGF0ZSwgTG9jYXRpb24sIFBhdGgsIFRvIH0gZnJvbSAnLi90eXBlcyc7XHJcbmltcG9ydCB7IG5vcm1hbGl6ZVNsYXNoLCBjcmVhdGVNZW1vcnlSZWNvcmQsIGNyZWF0ZVBhdGgsIGNyZWF0ZUxvY2F0aW9uLCBzdHJpcEJhc2VuYW1lIH0gZnJvbSAnLi91dGlscyc7XHJcbmltcG9ydCBUcmFuc2l0aW9uTWFuYWdlciBmcm9tICcuL3RyYW5zaXRpb25NYW5hZ2VyJztcclxuXHJcbmltcG9ydCB3YXJuaW5nIGZyb20gJy4vd2FyaW5nJztcclxuaW1wb3J0IHsgZ2V0QmFzZUhpc3RvcnkgfSBmcm9tICcuL2Jhc2VIaXN0b3J5JztcclxuXHJcbmV4cG9ydCB0eXBlIEJyb3dzZXJIaXN0b3J5T3B0aW9uID0ge1xyXG4gIC8qKlxyXG4gICAqIGZvcmNlUmVmcmVzaOS4ulRydWXml7bot7Povazml7bkvJrlvLrliLbliLfmlrDpobXpnaJcclxuICAgKi9cclxuICBmb3JjZVJlZnJlc2g/OiBib29sZWFuO1xyXG59ICYgQmFzZU9wdGlvbjtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVCcm93c2VySGlzdG9yeTxTID0gRGVmYXVsdFN0YXRlVHlwZT4ob3B0aW9uczogQnJvd3Nlckhpc3RvcnlPcHRpb24gPSB7fSk6IEhpc3Rvcnk8Uz4ge1xyXG4gIGNvbnN0IHN1cHBvcnRIaXN0b3J5ID0gaXNTdXBwb3J0SGlzdG9yeSgpO1xyXG4gIGNvbnN0IGlzU3VwcG9ydFBvcFN0YXRlID0gaXNTdXBwb3J0c1BvcFN0YXRlKCk7XHJcbiAgY29uc3QgYnJvd3Nlckhpc3RvcnkgPSB3aW5kb3cuaGlzdG9yeTtcclxuICBjb25zdCB7IGZvcmNlUmVmcmVzaCA9IGZhbHNlLCBnZXRVc2VyQ29uZmlybWF0aW9uID0gZ2V0RGVmYXVsdENvbmZpcm1hdGlvbiB9ID0gb3B0aW9ucztcclxuXHJcbiAgY29uc3QgYmFzZW5hbWUgPSBvcHRpb25zLmJhc2VuYW1lID8gbm9ybWFsaXplU2xhc2gob3B0aW9ucy5iYXNlbmFtZSkgOiAnJztcclxuXHJcbiAgY29uc3QgaW5pdExvY2F0aW9uID0gZ2V0TG9jYXRpb24oZ2V0SGlzdG9yeVN0YXRlKCkpO1xyXG5cclxuICBjb25zdCByZWNvcmRPcGVyYXRvciA9IGNyZWF0ZU1lbW9yeVJlY29yZDxzdHJpbmcsIExvY2F0aW9uPFM+Pihpbml0TG9jYXRpb24sIGwgPT4gbC5rZXkpO1xyXG5cclxuICBjb25zdCB0cmFuc2l0aW9uTWFuYWdlciA9IG5ldyBUcmFuc2l0aW9uTWFuYWdlcjxTPigpO1xyXG5cclxuICBjb25zdCB7IGdvLCBnb0JhY2ssIGdvRm9yd2FyZCwgbGlzdGVuLCBibG9jaywgZ2V0VXBkYXRlU3RhdGVGdW5jIH0gPSBnZXRCYXNlSGlzdG9yeTxTPihcclxuICAgIHRyYW5zaXRpb25NYW5hZ2VyLFxyXG4gICAgc2V0TGlzdGVuZXIsXHJcbiAgICBicm93c2VySGlzdG9yeSxcclxuICApO1xyXG5cclxuICBjb25zdCBoaXN0b3J5OiBIaXN0b3J5PFM+ID0ge1xyXG4gICAgYWN0aW9uOiBBY3Rpb24ucG9wLFxyXG4gICAgbGVuZ3RoOiBicm93c2VySGlzdG9yeS5sZW5ndGgsXHJcbiAgICBsb2NhdGlvbjogaW5pdExvY2F0aW9uLFxyXG4gICAgZ28sXHJcbiAgICBnb0JhY2ssXHJcbiAgICBnb0ZvcndhcmQsXHJcbiAgICBsaXN0ZW4sXHJcbiAgICBibG9jayxcclxuICAgIHB1c2gsXHJcbiAgICByZXBsYWNlLFxyXG4gICAgY3JlYXRlSHJlZixcclxuICB9O1xyXG5cclxuICBjb25zdCB1cGRhdGVTdGF0ZSA9IGdldFVwZGF0ZVN0YXRlRnVuYyhoaXN0b3J5KTtcclxuXHJcbiAgZnVuY3Rpb24gZ2V0SGlzdG9yeVN0YXRlKCkge1xyXG4gICAgcmV0dXJuIHN1cHBvcnRIaXN0b3J5ID8gd2luZG93Lmhpc3Rvcnkuc3RhdGUgOiB7fTtcclxuICB9XHJcblxyXG4gIGZ1bmN0aW9uIGdldExvY2F0aW9uKGhpc3RvcnlTdGF0ZTogUGFydGlhbDxIaXN0b3J5U3RhdGU8Uz4+KSB7XHJcbiAgICBjb25zdCB7IHNlYXJjaCwgaGFzaCB9ID0gd2luZG93LmxvY2F0aW9uO1xyXG4gICAgY29uc3QgeyBrZXksIHN0YXRlIH0gPSBoaXN0b3J5U3RhdGUgfHwge307XHJcbiAgICBsZXQgcGF0aG5hbWUgPSB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWU7XHJcbiAgICBwYXRobmFtZSA9IGJhc2VuYW1lID8gc3RyaXBCYXNlbmFtZShwYXRobmFtZSwgYmFzZW5hbWUpIDogcGF0aG5hbWU7XHJcblxyXG4gICAgcmV0dXJuIGNyZWF0ZUxvY2F0aW9uPFM+KCcnLCB7IHBhdGhuYW1lLCBzZWFyY2gsIGhhc2ggfSwgc3RhdGUsIGtleSk7XHJcbiAgfVxyXG5cclxuICAvLyDmi6bmiKrpobXpnaJQT1Dkuovku7blkI7vvIzpmLLmraLov5Tlm57liLDnmoTpobXpnaLooqvph43lpI3mi6bmiKpcclxuICBsZXQgZm9yY2VKdW1wID0gZmFsc2U7XHJcblxyXG4gIGZ1bmN0aW9uIGhhbmRsZVBvcFN0YXRlKGxvY2F0aW9uOiBMb2NhdGlvbjxTPikge1xyXG4gICAgaWYgKGZvcmNlSnVtcCkge1xyXG4gICAgICBmb3JjZUp1bXAgPSBmYWxzZTtcclxuICAgICAgdXBkYXRlU3RhdGUodW5kZWZpbmVkKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IGFjdGlvbiA9IEFjdGlvbi5wb3A7XHJcblxyXG4gICAgICBjb25zdCBjYWxsYmFjayA9IChpc0p1bXA6IGJvb2xlYW4pID0+IHtcclxuICAgICAgICBpZiAoaXNKdW1wKSB7XHJcbiAgICAgICAgICAvLyDmiafooYzot7PovazooYzkuLpcclxuICAgICAgICAgIHVwZGF0ZVN0YXRlKHsgYWN0aW9uOiBhY3Rpb24sIGxvY2F0aW9uOiBsb2NhdGlvbiB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmV2ZXJ0UG9wU3RhdGUobG9jYXRpb24sIGhpc3RvcnkubG9jYXRpb24pO1xyXG4gICAgICAgIH1cclxuICAgICAgfTtcclxuXHJcbiAgICAgIHRyYW5zaXRpb25NYW5hZ2VyLmNvbmZpcm1KdW1wVG8obG9jYXRpb24sIGFjdGlvbiwgZ2V0VXNlckNvbmZpcm1hdGlvbiwgY2FsbGJhY2spO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gcG9wU3RhdGVMaXN0ZW5lcihldmVudDogUG9wU3RhdGVFdmVudCkge1xyXG4gICAgaGFuZGxlUG9wU3RhdGUoZ2V0TG9jYXRpb24oZXZlbnQuc3RhdGUpKTtcclxuICB9XHJcblxyXG4gIGZ1bmN0aW9uIGhhc2hDaGFuZ2VMaXN0ZW5lcigpIHtcclxuICAgIGNvbnN0IGxvY2F0aW9uID0gZ2V0TG9jYXRpb24oZ2V0SGlzdG9yeVN0YXRlKCkpO1xyXG4gICAgaGFuZGxlUG9wU3RhdGUobG9jYXRpb24pO1xyXG4gIH1cclxuXHJcbiAgbGV0IGxpc3RlbmVyQ291bnQgPSAwO1xyXG5cclxuICBmdW5jdGlvbiBzZXRMaXN0ZW5lcihjb3VudDogbnVtYmVyKSB7XHJcbiAgICBsaXN0ZW5lckNvdW50ICs9IGNvdW50O1xyXG4gICAgaWYgKGxpc3RlbmVyQ291bnQgPT09IDEgJiYgY291bnQgPT09IDEpIHtcclxuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRXZlbnRUeXBlLlBvcFN0YXRlLCBwb3BTdGF0ZUxpc3RlbmVyKTtcclxuICAgICAgaWYgKCFpc1N1cHBvcnRQb3BTdGF0ZSkge1xyXG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKEV2ZW50VHlwZS5IYXNoQ2hhbmdlLCBoYXNoQ2hhbmdlTGlzdGVuZXIpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKGxpc3RlbmVyQ291bnQgPT09IDApIHtcclxuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoRXZlbnRUeXBlLlBvcFN0YXRlLCBwb3BTdGF0ZUxpc3RlbmVyKTtcclxuICAgICAgaWYgKCFpc1N1cHBvcnRQb3BTdGF0ZSkge1xyXG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKEV2ZW50VHlwZS5IYXNoQ2hhbmdlLCBoYXNoQ2hhbmdlTGlzdGVuZXIpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyDlj5bmtojpobXpnaLot7PovazlubbmgaLlpI3liLDot7PovazliY3nmoTpobXpnaJcclxuICBmdW5jdGlvbiByZXZlcnRQb3BTdGF0ZShmb3JtOiBMb2NhdGlvbjxTPiwgdG86IExvY2F0aW9uPFM+KSB7XHJcbiAgICBjb25zdCBkZWx0YSA9IHJlY29yZE9wZXJhdG9yLmdldERlbHRhKHRvLCBmb3JtKTtcclxuICAgIGlmIChkZWx0YSAhPT0gMCkge1xyXG4gICAgICBnbyhkZWx0YSk7XHJcbiAgICAgIGZvcmNlSnVtcCA9IHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiBjcmVhdGVIcmVmKHBhdGg6IFBhcnRpYWw8UGF0aD4pIHtcclxuICAgIHJldHVybiBiYXNlbmFtZSArIGNyZWF0ZVBhdGgocGF0aCk7XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiBwdXNoKHRvOiBUbywgc3RhdGU/OiBTKSB7XHJcbiAgICBjb25zdCBhY3Rpb24gPSBBY3Rpb24ucHVzaDtcclxuICAgIGNvbnN0IGxvY2F0aW9uID0gY3JlYXRlTG9jYXRpb248Uz4oaGlzdG9yeS5sb2NhdGlvbiwgdG8sIHN0YXRlLCB1bmRlZmluZWQpO1xyXG5cclxuICAgIHRyYW5zaXRpb25NYW5hZ2VyLmNvbmZpcm1KdW1wVG8obG9jYXRpb24sIGFjdGlvbiwgZ2V0VXNlckNvbmZpcm1hdGlvbiwgaXNKdW1wID0+IHtcclxuICAgICAgaWYgKCFpc0p1bXApIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgaHJlZiA9IGNyZWF0ZUhyZWYobG9jYXRpb24pO1xyXG4gICAgICBjb25zdCB7IGtleSwgc3RhdGUgfSA9IGxvY2F0aW9uO1xyXG5cclxuICAgICAgaWYgKHN1cHBvcnRIaXN0b3J5KSB7XHJcbiAgICAgICAgaWYgKGZvcmNlUmVmcmVzaCkge1xyXG4gICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBocmVmO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBicm93c2VySGlzdG9yeS5wdXNoU3RhdGUoeyBrZXk6IGtleSwgc3RhdGU6IHN0YXRlIH0sICcnLCBocmVmKTtcclxuICAgICAgICAgIHJlY29yZE9wZXJhdG9yLmFkZFJlY29yZChoaXN0b3J5LmxvY2F0aW9uLCBsb2NhdGlvbiwgYWN0aW9uKTtcclxuICAgICAgICAgIHVwZGF0ZVN0YXRlKHsgYWN0aW9uLCBsb2NhdGlvbiB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgd2FybmluZyhzdGF0ZSAhPT0gdW5kZWZpbmVkLCAnQnJvd3NlciBoaXN0b3J5IGNhbm5vdCBwdXNoIHN0YXRlIGluIGJyb3dzZXJzIHRoYXQgZG8gbm90IHN1cHBvcnQgSFRNTDUgaGlzdG9yeScpO1xyXG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gaHJlZjtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiByZXBsYWNlKHRvOiBUbywgc3RhdGU/OiBTKSB7XHJcbiAgICBjb25zdCBhY3Rpb24gPSBBY3Rpb24ucmVwbGFjZTtcclxuICAgIGNvbnN0IGxvY2F0aW9uID0gY3JlYXRlTG9jYXRpb248Uz4oaGlzdG9yeS5sb2NhdGlvbiwgdG8sIHN0YXRlLCB1bmRlZmluZWQpO1xyXG5cclxuICAgIHRyYW5zaXRpb25NYW5hZ2VyLmNvbmZpcm1KdW1wVG8obG9jYXRpb24sIGFjdGlvbiwgZ2V0VXNlckNvbmZpcm1hdGlvbiwgaXNKdW1wID0+IHtcclxuICAgICAgaWYgKCFpc0p1bXApIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgaHJlZiA9IGNyZWF0ZUhyZWYobG9jYXRpb24pO1xyXG4gICAgICBjb25zdCB7IGtleSwgc3RhdGUgfSA9IGxvY2F0aW9uO1xyXG4gICAgICBpZiAoc3VwcG9ydEhpc3RvcnkpIHtcclxuICAgICAgICBpZiAoZm9yY2VSZWZyZXNoKSB7XHJcbiAgICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVwbGFjZShocmVmKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgYnJvd3Nlckhpc3RvcnkucmVwbGFjZVN0YXRlKHsga2V5OiBrZXksIHN0YXRlOiBzdGF0ZSB9LCAnJywgaHJlZik7XHJcbiAgICAgICAgICByZWNvcmRPcGVyYXRvci5hZGRSZWNvcmQoaGlzdG9yeS5sb2NhdGlvbiwgbG9jYXRpb24sIGFjdGlvbik7XHJcbiAgICAgICAgICB1cGRhdGVTdGF0ZSh7IGFjdGlvbiwgbG9jYXRpb24gfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHdhcm5pbmcoc3RhdGUgIT09IHVuZGVmaW5lZCwgJ0Jyb3dzZXIgaGlzdG9yeSBjYW5ub3QgcHVzaCBzdGF0ZSBpbiBicm93c2VycyB0aGF0IGRvIG5vdCBzdXBwb3J0IEhUTUw1IGhpc3RvcnknKTtcclxuICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVwbGFjZShocmVmKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gaGlzdG9yeTtcclxufVxyXG4iLCJpbXBvcnQgeyBBY3Rpb24sIEJhc2VPcHRpb24sIERlZmF1bHRTdGF0ZVR5cGUsIEV2ZW50VHlwZSwgSGlzdG9yeSwgTG9jYXRpb24sIFRvIH0gZnJvbSAnLi90eXBlcyc7XHJcbmltcG9ydCB7XHJcbiAgYWRkSGVhZFNsYXNoLFxyXG4gIG5vcm1hbGl6ZVNsYXNoLFxyXG4gIGNyZWF0ZU1lbW9yeVJlY29yZCxcclxuICBjcmVhdGVQYXRoLFxyXG4gIGNyZWF0ZUxvY2F0aW9uLFxyXG4gIGlzTG9jYXRpb25FcXVhbCxcclxuICBzdHJpcEJhc2VuYW1lLFxyXG4gIHN0cmlwSGVhZFNsYXNoLFxyXG59IGZyb20gJy4vdXRpbHMnO1xyXG5pbXBvcnQgeyBnZXREZWZhdWx0Q29uZmlybWF0aW9uIH0gZnJvbSAnLi9kb20nO1xyXG5pbXBvcnQgVHJhbnNpdGlvbk1hbmFnZXIgZnJvbSAnLi90cmFuc2l0aW9uTWFuYWdlcic7XHJcblxyXG5pbXBvcnQgd2FybmluZyBmcm9tICcuL3dhcmluZyc7XHJcbmltcG9ydCB7IGdldEJhc2VIaXN0b3J5IH0gZnJvbSAnLi9iYXNlSGlzdG9yeSc7XHJcblxyXG5leHBvcnQgdHlwZSB1cmxIYXNoVHlwZSA9ICdzbGFzaCcgfCAnbm9zbGFzaCc7XHJcblxyXG50eXBlIEhhc2hIaXN0b3J5T3B0aW9uID0ge1xyXG4gIGhhc2hUeXBlPzogdXJsSGFzaFR5cGU7XHJcbn0gJiBCYXNlT3B0aW9uO1xyXG5cclxuLy8g6I635Y+WI+WJjeeahOWGheWuuVxyXG5mdW5jdGlvbiBzdHJpcEhhc2gocGF0aDogc3RyaW5nKTogc3RyaW5nIHtcclxuICBjb25zdCBpZHggPSBwYXRoLmluZGV4T2YoJyMnKTtcclxuICByZXR1cm4gaWR4ID09PSAtMSA/IHBhdGggOiBwYXRoLnN1YnN0cmluZygwLCBpZHgpO1xyXG59XHJcblxyXG4vLyDojrflj5Yj5ZCO55qE5YaF5a65XHJcbmZ1bmN0aW9uIGdldEhhc2hDb250ZW50KHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgY29uc3QgaWR4ID0gcGF0aC5pbmRleE9mKCcjJyk7XHJcbiAgcmV0dXJuIGlkeCA9PT0gLTEgPyAnJyA6IHBhdGguc3Vic3RyaW5nKGlkeCArIDEpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlSGFzaEhpc3Rvcnk8UyA9IERlZmF1bHRTdGF0ZVR5cGU+KG9wdGlvbjogSGFzaEhpc3RvcnlPcHRpb24gPSB7fSk6IEhpc3Rvcnk8Uz4ge1xyXG4gIGNvbnN0IGJyb3dzZXJIaXN0b3J5ID0gd2luZG93Lmhpc3Rvcnk7XHJcbiAgY29uc3QgeyBoYXNoVHlwZSA9ICdzbGFzaCcsIGdldFVzZXJDb25maXJtYXRpb24gPSBnZXREZWZhdWx0Q29uZmlybWF0aW9uIH0gPSBvcHRpb247XHJcblxyXG4gIGNvbnN0IGJhc2VuYW1lID0gb3B0aW9uLmJhc2VuYW1lID8gbm9ybWFsaXplU2xhc2gob3B0aW9uLmJhc2VuYW1lKSA6ICcnO1xyXG5cclxuICBjb25zdCBwYXRoRGVjb2RlciA9IGFkZEhlYWRTbGFzaDtcclxuICBjb25zdCBwYXRoRW5jb2RlciA9IGhhc2hUeXBlID09PSAnc2xhc2gnID8gYWRkSGVhZFNsYXNoIDogc3RyaXBIZWFkU2xhc2g7XHJcblxyXG4gIGZ1bmN0aW9uIGdldExvY2F0aW9uKCkge1xyXG4gICAgbGV0IGhhc2hQYXRoID0gcGF0aERlY29kZXIoZ2V0SGFzaENvbnRlbnQod2luZG93LmxvY2F0aW9uLmhhc2gpKTtcclxuICAgIGlmIChiYXNlbmFtZSkge1xyXG4gICAgICBoYXNoUGF0aCA9IHN0cmlwQmFzZW5hbWUoaGFzaFBhdGgsIGJhc2VuYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gY3JlYXRlTG9jYXRpb248Uz4oJycsIGhhc2hQYXRoLCB1bmRlZmluZWQsICdkZWZhdWx0Jyk7XHJcbiAgfVxyXG5cclxuICBjb25zdCBpbml0TG9jYXRpb24gPSBnZXRMb2NhdGlvbigpO1xyXG5cclxuICBjb25zdCBtZW1SZWNvcmRzID0gY3JlYXRlTWVtb3J5UmVjb3JkPHN0cmluZywgTG9jYXRpb248Uz4+KGluaXRMb2NhdGlvbiwgY3JlYXRlUGF0aCk7XHJcblxyXG4gIGNvbnN0IHRyYW5zaXRpb25NYW5hZ2VyID0gbmV3IFRyYW5zaXRpb25NYW5hZ2VyPFM+KCk7XHJcblxyXG4gIGZ1bmN0aW9uIGNyZWF0ZUhyZWYobG9jYXRpb246IExvY2F0aW9uPFM+KSB7XHJcbiAgICBjb25zdCB0YWcgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdiYXNlJyk7XHJcbiAgICBjb25zdCBiYXNlID0gdGFnICYmIHRhZy5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSA/IHN0cmlwSGFzaCh3aW5kb3cubG9jYXRpb24uaHJlZikgOiAnJztcclxuICAgIHJldHVybiBiYXNlICsgJyMnICsgcGF0aEVuY29kZXIoYmFzZW5hbWUgKyBjcmVhdGVQYXRoKGxvY2F0aW9uKSk7XHJcbiAgfVxyXG5cclxuICBsZXQgZm9yY2VOZXh0UG9wID0gZmFsc2U7XHJcbiAgbGV0IGlnbm9yZVBhdGg6IG51bGwgfCBzdHJpbmcgPSBudWxsO1xyXG5cclxuICBjb25zdCB7IGdvLCBnb0JhY2ssIGdvRm9yd2FyZCwgbGlzdGVuLCBibG9jaywgZ2V0VXBkYXRlU3RhdGVGdW5jIH0gPSBnZXRCYXNlSGlzdG9yeShcclxuICAgIHRyYW5zaXRpb25NYW5hZ2VyLFxyXG4gICAgc2V0TGlzdGVuZXIsXHJcbiAgICBicm93c2VySGlzdG9yeSxcclxuICApO1xyXG5cclxuICBjb25zdCBoaXN0b3J5OiBIaXN0b3J5PFM+ID0ge1xyXG4gICAgYWN0aW9uOiBBY3Rpb24ucG9wLFxyXG4gICAgbGVuZ3RoOiBicm93c2VySGlzdG9yeS5sZW5ndGgsXHJcbiAgICBsb2NhdGlvbjogaW5pdExvY2F0aW9uLFxyXG4gICAgZ28sXHJcbiAgICBnb0JhY2ssXHJcbiAgICBnb0ZvcndhcmQsXHJcbiAgICBwdXNoLFxyXG4gICAgcmVwbGFjZSxcclxuICAgIGxpc3RlbixcclxuICAgIGJsb2NrLFxyXG4gICAgY3JlYXRlSHJlZixcclxuICB9O1xyXG5cclxuICBjb25zdCB1cGRhdGVTdGF0ZSA9IGdldFVwZGF0ZVN0YXRlRnVuYyhoaXN0b3J5KTtcclxuXHJcbiAgZnVuY3Rpb24gcHVzaCh0bzogVG8sIHN0YXRlPzogUykge1xyXG4gICAgd2FybmluZyhzdGF0ZSAhPT0gdW5kZWZpbmVkLCAnSGFzaCBoaXN0b3J5IGRvZXMgbm90IHN1cHBvcnQgc3RhdGUsIGl0IHdpbGwgYmUgaWdub3JlZCcpO1xyXG5cclxuICAgIGNvbnN0IGFjdGlvbiA9IEFjdGlvbi5wdXNoO1xyXG4gICAgY29uc3QgbG9jYXRpb24gPSBjcmVhdGVMb2NhdGlvbjxTPihoaXN0b3J5LmxvY2F0aW9uLCB0bywgdW5kZWZpbmVkLCAnJyk7XHJcblxyXG4gICAgdHJhbnNpdGlvbk1hbmFnZXIuY29uZmlybUp1bXBUbyhsb2NhdGlvbiwgYWN0aW9uLCBnZXRVc2VyQ29uZmlybWF0aW9uLCBpc0p1bXAgPT4ge1xyXG4gICAgICBpZiAoIWlzSnVtcCkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBwYXRoID0gY3JlYXRlUGF0aChsb2NhdGlvbik7XHJcbiAgICAgIGNvbnN0IGVuY29kZWRQYXRoID0gcGF0aEVuY29kZXIoYmFzZW5hbWUgKyBwYXRoKTtcclxuICAgICAgLy8g5YmN5ZCOaGFzaOS4jeS4gOagt+aJjei/m+ihjOi3s+i9rFxyXG4gICAgICBpZiAoZ2V0SGFzaENvbnRlbnQod2luZG93LmxvY2F0aW9uLmhyZWYpICE9PSBlbmNvZGVkUGF0aCkge1xyXG4gICAgICAgIGlnbm9yZVBhdGggPSBlbmNvZGVkUGF0aDtcclxuICAgICAgICB3aW5kb3cubG9jYXRpb24uaGFzaCA9IGVuY29kZWRQYXRoO1xyXG5cclxuICAgICAgICBtZW1SZWNvcmRzLmFkZFJlY29yZChoaXN0b3J5LmxvY2F0aW9uLCBsb2NhdGlvbiwgYWN0aW9uKTtcclxuXHJcbiAgICAgICAgdXBkYXRlU3RhdGUoeyBhY3Rpb24sIGxvY2F0aW9uIH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHVwZGF0ZVN0YXRlKHVuZGVmaW5lZCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gcmVwbGFjZSh0bzogVG8sIHN0YXRlPzogUykge1xyXG4gICAgd2FybmluZyhzdGF0ZSAhPT0gdW5kZWZpbmVkLCAnSGFzaCBoaXN0b3J5IGRvZXMgbm90IHN1cHBvcnQgc3RhdGUsIGl0IHdpbGwgYmUgaWdub3JlZCcpO1xyXG4gICAgY29uc3QgYWN0aW9uID0gQWN0aW9uLnJlcGxhY2U7XHJcbiAgICBjb25zdCBsb2NhdGlvbiA9IGNyZWF0ZUxvY2F0aW9uPFM+KGhpc3RvcnkubG9jYXRpb24sIHRvLCB1bmRlZmluZWQsICcnKTtcclxuXHJcbiAgICB0cmFuc2l0aW9uTWFuYWdlci5jb25maXJtSnVtcFRvKGxvY2F0aW9uLCBhY3Rpb24sIGdldFVzZXJDb25maXJtYXRpb24sIGlzSnVtcCA9PiB7XHJcbiAgICAgIGlmICghaXNKdW1wKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IHBhdGggPSBjcmVhdGVQYXRoKGxvY2F0aW9uKTtcclxuICAgICAgY29uc3QgZW5jb2RlZFBhdGggPSBwYXRoRW5jb2RlcihiYXNlbmFtZSArIHBhdGgpO1xyXG4gICAgICBpZiAoZ2V0SGFzaENvbnRlbnQod2luZG93LmxvY2F0aW9uLmhyZWYpICE9PSBlbmNvZGVkUGF0aCkge1xyXG4gICAgICAgIGlnbm9yZVBhdGggPSBwYXRoO1xyXG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZXBsYWNlKHN0cmlwSGFzaCh3aW5kb3cubG9jYXRpb24uaHJlZikgKyAnIycgKyBlbmNvZGVkUGF0aCk7XHJcbiAgICAgIH1cclxuICAgICAgbWVtUmVjb3Jkcy5hZGRSZWNvcmQoaGlzdG9yeS5sb2NhdGlvbiwgbG9jYXRpb24sIGFjdGlvbik7XHJcbiAgICAgIHVwZGF0ZVN0YXRlKHsgYWN0aW9uLCBsb2NhdGlvbiB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gaGFuZGxlSGFzaENoYW5nZSgpIHtcclxuICAgIGNvbnN0IGhhc2hQYXRoID0gZ2V0SGFzaENvbnRlbnQod2luZG93LmxvY2F0aW9uLmhyZWYpO1xyXG4gICAgY29uc3QgZW5jb2RlZFBhdGggPSBwYXRoRW5jb2RlcihoYXNoUGF0aCk7XHJcbiAgICBpZiAoaGFzaFBhdGggIT09IGVuY29kZWRQYXRoKSB7XHJcbiAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZXBsYWNlKHN0cmlwSGFzaCh3aW5kb3cubG9jYXRpb24uaHJlZikgKyAnIycgKyBlbmNvZGVkUGF0aCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCBsb2NhdGlvbiA9IGdldExvY2F0aW9uKCk7XHJcbiAgICAgIGNvbnN0IHByZXZMb2NhdGlvbiA9IGhpc3RvcnkubG9jYXRpb247XHJcbiAgICAgIGlmICghZm9yY2VOZXh0UG9wICYmIGlzTG9jYXRpb25FcXVhbChsb2NhdGlvbiwgcHJldkxvY2F0aW9uKSkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBpZiAoaWdub3JlUGF0aCA9PT0gY3JlYXRlUGF0aChsb2NhdGlvbikpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgaWdub3JlUGF0aCA9IG51bGw7XHJcbiAgICAgIGhhbmRsZVBvcFN0YXRlKGxvY2F0aW9uKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGZ1bmN0aW9uIGhhbmRsZVBvcFN0YXRlKGxvY2F0aW9uOiBMb2NhdGlvbjxTPikge1xyXG4gICAgaWYgKGZvcmNlTmV4dFBvcCkge1xyXG4gICAgICBmb3JjZU5leHRQb3AgPSBmYWxzZTtcclxuICAgICAgdXBkYXRlU3RhdGUodW5kZWZpbmVkKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IGFjdGlvbiA9IEFjdGlvbi5wb3A7XHJcblxyXG4gICAgICBjb25zdCBjYWxsYmFjayA9IChpc0p1bXA6IGJvb2xlYW4pID0+IHtcclxuICAgICAgICBpZiAoaXNKdW1wKSB7XHJcbiAgICAgICAgICB1cGRhdGVTdGF0ZSh7IGFjdGlvbjogYWN0aW9uLCBsb2NhdGlvbjogbG9jYXRpb24gfSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJldmVydFBvcFN0YXRlKGxvY2F0aW9uKTtcclxuICAgICAgICB9XHJcbiAgICAgIH07XHJcblxyXG4gICAgICB0cmFuc2l0aW9uTWFuYWdlci5jb25maXJtSnVtcFRvKGxvY2F0aW9uLCBhY3Rpb24sIGdldFVzZXJDb25maXJtYXRpb24sIGNhbGxiYWNrKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIOWcqOi3s+i9rOihjOS4uuiiq0Jsb2Nr5ZCO77yM55SoSGlzdG9yeS5nbygp6Lez6L2s5Zue5LmL5YmN55qE6aG16Z2iXHJcbiAgZnVuY3Rpb24gcmV2ZXJ0UG9wU3RhdGUoZm9ybTogTG9jYXRpb248Uz4pIHtcclxuICAgIGNvbnN0IHRvID0gaGlzdG9yeS5sb2NhdGlvbjtcclxuICAgIGNvbnN0IGRlbHRhID0gbWVtUmVjb3Jkcy5nZXREZWx0YSh0bywgZm9ybSk7XHJcbiAgICBpZiAoZGVsdGEgIT09IDApIHtcclxuICAgICAgZ28oZGVsdGEpO1xyXG4gICAgICBmb3JjZU5leHRQb3AgPSB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbGV0IGxpc3RlbmVyQ291bnQgPSAwO1xyXG5cclxuICBmdW5jdGlvbiBzZXRMaXN0ZW5lcihkZWx0YTogbnVtYmVyKSB7XHJcbiAgICBsaXN0ZW5lckNvdW50ICs9IGRlbHRhO1xyXG4gICAgaWYgKGxpc3RlbmVyQ291bnQgPT09IDEgJiYgZGVsdGEgPT09IDEpIHtcclxuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRXZlbnRUeXBlLkhhc2hDaGFuZ2UsIGhhbmRsZUhhc2hDaGFuZ2UpO1xyXG4gICAgfSBlbHNlIGlmIChsaXN0ZW5lckNvdW50ID09PSAwKSB7XHJcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKEV2ZW50VHlwZS5IYXNoQ2hhbmdlLCBoYW5kbGVIYXNoQ2hhbmdlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJldHVybiBoaXN0b3J5O1xyXG59XHJcbiIsImltcG9ydCB7IGNyZWF0ZUNvbnRleHQgfSBmcm9tICdyZWFjdCc7XHJcbmltcG9ydCB7IEhpc3RvcnksIExvY2F0aW9uIH0gZnJvbSAnLi9pbmRleCc7XHJcbmltcG9ydCB7IE1hdGNoZWQgfSBmcm9tICcuL21hdGNoZXIvcGFyc2VyJztcclxuXHJcbmZ1bmN0aW9uIGNyZWF0ZU5hbWVkQ29udGV4dDxUPihuYW1lOiBzdHJpbmcsIGRlZmF1bHRWYWx1ZTogVCkge1xyXG4gIGNvbnN0IGNvbnRleHQgPSBjcmVhdGVDb250ZXh0PFQ+KGRlZmF1bHRWYWx1ZSk7XHJcbiAgY29udGV4dC5kaXNwbGF5TmFtZSA9IG5hbWU7XHJcbiAgcmV0dXJuIGNvbnRleHQ7XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIFJvdXRlckNvbnRleHRWYWx1ZSA9IHtcclxuICBoaXN0b3J5OiBIaXN0b3J5O1xyXG4gIGxvY2F0aW9uOiBMb2NhdGlvbjtcclxuICBtYXRjaDogTWF0Y2hlZCB8IG51bGw7XHJcbn07XHJcblxyXG5jb25zdCBSb3V0ZXJDb250ZXh0ID0gY3JlYXRlTmFtZWRDb250ZXh0PFJvdXRlckNvbnRleHRWYWx1ZT4oJ1JvdXRlcicsIHt9IGFzIGFueSk7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBSb3V0ZXJDb250ZXh0OyIsImltcG9ydCB7IE1hdGNoZWQsIFBhcmFtcyB9IGZyb20gJy4vcGFyc2VyJztcclxuXHJcbmV4cG9ydCB0eXBlIFRva2VuID0ge1xyXG4gIHR5cGU6IFRva2VuVHlwZTtcclxuICB2YWx1ZTogc3RyaW5nO1xyXG59O1xyXG5cclxuZXhwb3J0IGVudW0gVG9rZW5UeXBlIHtcclxuICBEZWxpbWl0ZXIgPSAnZGVsaW1pdGVyJyxcclxuICBTdGF0aWMgPSAnc3RhdGljJyxcclxuICBQYXJhbSA9ICdwYXJhbScsXHJcbiAgV2lsZENhcmQgPSAnd2lsZGNhcmQnLFxyXG4gIExCcmFja2V0ID0gJygnLFxyXG4gIFJCcmFja2V0ID0gJyknLFxyXG4gIFBhdHRlcm4gPSAncGF0dGVybicsXHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgUGFyc2VyPFA+IHtcclxuICByZWdleHA6IFJlZ0V4cDtcclxuXHJcbiAga2V5czogc3RyaW5nW107XHJcblxyXG4gIHBhcnNlKHVybDogc3RyaW5nKTogTWF0Y2hlZDxQPiB8IG51bGw7XHJcblxyXG4gIGNvbXBpbGUocGFyYW1zOiBQYXJhbXM8UD4pOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIFBhcnNlck9wdGlvbiA9IHtcclxuICAvLyDmmK/lkKblpKflsI/lhpnmlY/mhJ9cclxuICBjYXNlU2Vuc2l0aXZlPzogYm9vbGVhbjtcclxuICAvLyDmmK/lkKblkK/nlKjkuKXmoLzmqKHlvI9cclxuICBzdHJpY3RNb2RlPzogYm9vbGVhbjtcclxuICAvLyDnsr7lh4bljLnphY0g5YW85a65IFJlYWN0LVJvdXRlclY1XHJcbiAgZXhhY3Q/OiBib29sZWFuO1xyXG59O1xyXG5cclxudHlwZSBDbGVhckxlYWRpbmc8VSBleHRlbmRzIHN0cmluZz4gPSBVIGV4dGVuZHMgYC8ke2luZmVyIFJ9YCA/IENsZWFyTGVhZGluZzxSPiA6IFU7XHJcbnR5cGUgQ2xlYXJUYWlsaW5nPFUgZXh0ZW5kcyBzdHJpbmc+ID0gVSBleHRlbmRzIGAke2luZmVyIEx9L2AgPyBDbGVhclRhaWxpbmc8TD4gOiBVO1xyXG5cclxudHlwZSBQYXJzZVBhcmFtPFBhcmFtIGV4dGVuZHMgc3RyaW5nPiA9IFBhcmFtIGV4dGVuZHMgYDoke2luZmVyIFJ9YFxyXG4gID8ge1xyXG4gICAgW0sgaW4gUl06IHN0cmluZztcclxuICB9XHJcbiAgOiB7fTtcclxuXHJcbnR5cGUgTWVyZ2VQYXJhbXM8T25lUGFyYW0gZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBPdGhlclBhcmFtIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pj4gPSB7XHJcbiAgcmVhZG9ubHkgW0tleSBpbiBrZXlvZiBPbmVQYXJhbSB8IGtleW9mIE90aGVyUGFyYW1dPzogc3RyaW5nO1xyXG59O1xyXG5cclxudHlwZSBQYXJzZVVSTFN0cmluZzxTdHIgZXh0ZW5kcyBzdHJpbmc+ID0gU3RyIGV4dGVuZHMgYCR7aW5mZXIgUGFyYW19LyR7aW5mZXIgUmVzdH1gXHJcbiAgPyBNZXJnZVBhcmFtczxQYXJzZVBhcmFtPFBhcmFtPiwgUGFyc2VVUkxTdHJpbmc8Q2xlYXJMZWFkaW5nPFJlc3Q+Pj5cclxuICA6IFBhcnNlUGFyYW08U3RyPjtcclxuXHJcbi8vIOino+aekFVSTOS4reeahOWKqOaAgeWPguaVsO+8jOS7peWunueOsFR5cGVTY3JpcHTmj5DnpLrlip/og71cclxuZXhwb3J0IHR5cGUgR2V0VVJMUGFyYW1zPFUgZXh0ZW5kcyBzdHJpbmc+ID0gUGFyc2VVUkxTdHJpbmc8Q2xlYXJMZWFkaW5nPENsZWFyVGFpbGluZzxVPj4+O1xyXG4iLCIvKipcclxuICogQGRlc2NyaXB0aW9uIOWwhnVybOS4reeahC8v6L2s5o2i5Li6L1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGNsZWFuUGF0aChwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gIHJldHVybiBwYXRoLnJlcGxhY2UoL1xcLysvZywgJy8nKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHNjb3JlQ29tcGFyZShzY29yZTE6IG51bWJlcltdLCBzY29yZTI6IG51bWJlcltdKTogbnVtYmVyIHtcclxuICBjb25zdCBzY29yZTFMZW5ndGggPSBzY29yZTEubGVuZ3RoO1xyXG4gIGNvbnN0IHNjb3JlMkxlbmd0aCA9IHNjb3JlMi5sZW5ndGg7XHJcbiAgY29uc3QgZW5kID0gTWF0aC5taW4oc2NvcmUxTGVuZ3RoLCBzY29yZTJMZW5ndGgpO1xyXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZW5kOyBpKyspIHtcclxuICAgIGNvbnN0IGRlbHRhID0gc2NvcmUyW2ldIC0gc2NvcmUxW2ldO1xyXG4gICAgaWYgKGRlbHRhICE9PSAwKSB7XHJcbiAgICAgIHJldHVybiBkZWx0YTtcclxuICAgIH1cclxuICB9XHJcbiAgaWYgKHNjb3JlMUxlbmd0aCA9PT0gc2NvcmUyTGVuZ3RoKSB7XHJcbiAgICByZXR1cm4gMDtcclxuICB9XHJcbiAgcmV0dXJuIHNjb3JlMUxlbmd0aCA+IHNjb3JlMkxlbmd0aCA/IC0xIDogMTtcclxufVxyXG5cclxuLy8g5oqK5q2j5YiZ6KGo6L6+5byP55qE54m55q6K56ym5Y+35Yqg5Lik5Liq5Y+N5pac5p2g6L+b6KGM6L2s5LmJXHJcbmV4cG9ydCBmdW5jdGlvbiBlc2NhcGVTdHIoc3RyOiBzdHJpbmcpIHtcclxuICByZXR1cm4gc3RyLnJlcGxhY2UoLyhbLisqPz1eIToke30oKVtcXF18L1xcXFxdKS9nLCAnXFxcXCQxJyk7XHJcbn1cclxuIiwiaW1wb3J0IHsgVG9rZW4sIFRva2VuVHlwZSB9IGZyb20gJy4vdHlwZXMnO1xyXG5pbXBvcnQgeyBjbGVhblBhdGggfSBmcm9tICcuL3V0aWxzJztcclxuXHJcbmNvbnN0IHZhbGlkQ2hhciA9IC9bXi86KigpXS87XHJcblxyXG4vLyDlr7lVcmzmqKHmnb/ov5vooYzor43ms5Xop6PmnpDvvIzop6PmnpDnu5PmnpzkuLpUb2tlbnNcclxuZXhwb3J0IGZ1bmN0aW9uIGxleGVyKHBhdGg6IHN0cmluZyk6IFRva2VuW10ge1xyXG4gIGNvbnN0IHRva2VuczogVG9rZW5bXSA9IFtdO1xyXG5cclxuICBpZiAoIXBhdGgpIHtcclxuICAgIHJldHVybiB0b2tlbnM7XHJcbiAgfVxyXG5cclxuICBsZXQgdXJsUGF0aCA9IGNsZWFuUGF0aChwYXRoKTtcclxuICBpZiAodXJsUGF0aCAhPT0gJyonICYmICF1cmxQYXRoLnN0YXJ0c1dpdGgoJy8nKSkge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKGBVcmwgbXVzdCBzdGFydCB3aXRoIFwiL1wiLmApO1xyXG4gIH1cclxuXHJcbiAgY29uc3QgZ2V0TGl0ZXJhbCA9ICgpID0+IHtcclxuICAgIGxldCBuYW1lID0gJyc7XHJcbiAgICB3aGlsZSAoaSA8IHVybFBhdGgubGVuZ3RoICYmIHZhbGlkQ2hhci50ZXN0KHVybFBhdGhbaV0pKSB7XHJcbiAgICAgIG5hbWUgKz0gdXJsUGF0aFtpXTtcclxuICAgICAgc2tpcENoYXIoMSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmFtZTtcclxuICB9O1xyXG5cclxuICBjb25zdCBza2lwQ2hhciA9IChzdGVwOiBudW1iZXIpID0+IHtcclxuICAgIGkgKz0gc3RlcDtcclxuICB9O1xyXG5cclxuICBsZXQgaSA9IDA7XHJcbiAgd2hpbGUgKGkgPCB1cmxQYXRoLmxlbmd0aCkge1xyXG4gICAgY29uc3QgY3VyQ2hhciA9IHVybFBhdGhbaV07XHJcbiAgICBjb25zdCBwcmV2Q2hhciA9IHVybFBhdGhbaSAtIDFdO1xyXG5cclxuICAgIGlmIChjdXJDaGFyID09PSAnLycpIHtcclxuICAgICAgdG9rZW5zLnB1c2goeyB0eXBlOiBUb2tlblR5cGUuRGVsaW1pdGVyLCB2YWx1ZTogdXJsUGF0aFtpXSB9KTtcclxuICAgICAgc2tpcENoYXIoMSk7XHJcbiAgICAgIGNvbnRpbnVlO1xyXG4gICAgfVxyXG4gICAgLy8gZHluYW1pYyBwYXJhbXMgKC86YSlcclxuICAgIGlmIChwcmV2Q2hhciA9PT0gJy8nICYmIGN1ckNoYXIgPT09ICc6Jykge1xyXG4gICAgICBza2lwQ2hhcigxKTtcclxuICAgICAgdG9rZW5zLnB1c2goeyB0eXBlOiBUb2tlblR5cGUuUGFyYW0sIHZhbHVlOiBnZXRMaXRlcmFsKCkgfSk7XHJcbiAgICAgIGNvbnRpbnVlO1xyXG4gICAgfVxyXG4gICAgLy8gd2lsZENhcmQgcGFyYW1zICgvOiopXHJcbiAgICBpZiAoKHByZXZDaGFyID09PSAnLycgfHwgcHJldkNoYXIgPT09IHVuZGVmaW5lZCkgJiYgY3VyQ2hhciA9PT0gJyonKSB7XHJcbiAgICAgIHRva2Vucy5wdXNoKHsgdHlwZTogVG9rZW5UeXBlLldpbGRDYXJkLCB2YWx1ZTogdXJsUGF0aFtpXSB9KTtcclxuICAgICAgc2tpcENoYXIoMSk7XHJcbiAgICAgIGNvbnRpbnVlO1xyXG4gICAgfVxyXG4gICAgLy8gc3RhdGljIHBhcmFtc1xyXG4gICAgaWYgKHByZXZDaGFyID09PSAnLycgJiYgdmFsaWRDaGFyLnRlc3QoY3VyQ2hhcikpIHtcclxuICAgICAgdG9rZW5zLnB1c2goeyB0eXBlOiBUb2tlblR5cGUuU3RhdGljLCB2YWx1ZTogZ2V0TGl0ZXJhbCgpIH0pO1xyXG4gICAgICBjb250aW51ZTtcclxuICAgIH1cclxuICAgIGlmIChjdXJDaGFyID09PSAnKCcpIHtcclxuICAgICAgdG9rZW5zLnB1c2goeyB0eXBlOiBUb2tlblR5cGUuTEJyYWNrZXQsIHZhbHVlOiAnKCcgfSk7XHJcbiAgICAgIHNraXBDaGFyKDEpO1xyXG4gICAgICBjb250aW51ZTtcclxuICAgIH1cclxuICAgIGlmIChjdXJDaGFyID09PSAnKScpIHtcclxuICAgICAgdG9rZW5zLnB1c2goeyB0eXBlOiBUb2tlblR5cGUuUkJyYWNrZXQsIHZhbHVlOiAnKScgfSk7XHJcbiAgICAgIHNraXBDaGFyKDEpO1xyXG4gICAgICBjb250aW51ZTtcclxuICAgIH1cclxuICAgIGlmICh2YWxpZENoYXIudGVzdChjdXJDaGFyKSkge1xyXG4gICAgICB0b2tlbnMucHVzaCh7IHR5cGU6IFRva2VuVHlwZS5QYXR0ZXJuLCB2YWx1ZTogZ2V0TGl0ZXJhbCgpIH0pO1xyXG4gICAgICBjb250aW51ZTtcclxuICAgIH1cclxuICAgIC8vIOi3s+i/h+mdnuazleWtl+esplxyXG4gICAgc2tpcENoYXIoMSk7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gdG9rZW5zO1xyXG59XHJcbiIsImltcG9ydCB7IEdldFVSTFBhcmFtcywgUGFyc2VyLCBQYXJzZXJPcHRpb24sIFRva2VuVHlwZSB9IGZyb20gJy4vdHlwZXMnO1xyXG5pbXBvcnQgeyBsZXhlciB9IGZyb20gJy4vbGV4ZXInO1xyXG5pbXBvcnQgeyBlc2NhcGVTdHIsIHNjb3JlQ29tcGFyZSB9IGZyb20gJy4vdXRpbHMnO1xyXG5cclxuLy8g5LiN5ZCM57G75Z6L5Y+C5pWw55qE5Yy56YWN5b6X5YiGXHJcbmVudW0gTWF0Y2hTY29yZSB7XHJcbiAgLy8g5Zu65a6a5Y+C5pWwXHJcbiAgc3RhdGljID0gMTAsXHJcbiAgLy8g5Yqo5oCB5Y+C5pWwXHJcbiAgcGFyYW0gPSA2LFxyXG4gIC8vIOmAmumFjeespuWPguaVsFxyXG4gIHdpbGRjYXJkID0gMyxcclxuICBwbGFjZWhvbGRlciA9IC0xLFxyXG59XHJcblxyXG5leHBvcnQgdHlwZSBQYXJhbXM8UD4gPSB7IFtLIGluIGtleW9mIFBdPzogUFtLXSB9O1xyXG5cclxuLy8g5YW85a65IHJlYWN0IHY1IG1hdGNoZWTnsbvlnotcclxuZXhwb3J0IHR5cGUgTWF0Y2hlZDxQID0gYW55PiA9IHtcclxuICBzY29yZTogbnVtYmVyW107XHJcbiAgcGFyYW1zOiBQYXJhbXM8UD47XHJcbiAgcGF0aDogc3RyaW5nO1xyXG4gIHVybDogc3RyaW5nO1xyXG4gIGlzRXhhY3Q6IGJvb2xlYW47XHJcbn07XHJcblxyXG5jb25zdCBkZWZhdWx0T3B0aW9uOiBSZXF1aXJlZDxQYXJzZXJPcHRpb24+ID0ge1xyXG4gIC8vIHVybOWMuemFjeaXtuaYr+WQpuWkp+Wwj+WGmeaVj+aEn1xyXG4gIGNhc2VTZW5zaXRpdmU6IHRydWUsXHJcbiAgLy8g5piv5ZCm5Lil5qC85Yy56YWNdXJs57uT5bC+55qEL1xyXG4gIHN0cmljdE1vZGU6IGZhbHNlLFxyXG4gIC8vIOaYr+WQpuWujOWFqOeyvuehruWMuemFjVxyXG4gIGV4YWN0OiBmYWxzZSxcclxufTtcclxuLy8g5q2j5YiZ6KGo6L6+5byP5Lit6ZyA6KaB6L2s5LmJ55qE5a2X56ymXHJcbmNvbnN0IFJFR0VYX0NIQVJTX1JFID0gL1suKyo/XiR7fSgpW1xcXS9cXFxcXS9nO1xyXG4vLyDnlKjkuo7ljLnphY3kuKTkuKovL+S4reeahOeahOWAvFxyXG5jb25zdCBCQVNFX1BBUkFNX1BBVFRFUk4gPSAnW14vXSsnO1xyXG5cclxuY29uc3QgRGVmYXVsdERlbGltaXRlciA9ICcvIz8nO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVBhdGhQYXJzZXI8U3RyIGV4dGVuZHMgc3RyaW5nPihwYXRobmFtZTogU3RyLCBvcHRpb24/OiBQYXJzZXJPcHRpb24pOiBQYXJzZXI8R2V0VVJMUGFyYW1zPFN0cj4+O1xyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUGF0aFBhcnNlcjxQID0gdW5rbm93bj4ocGF0aG5hbWU6IHN0cmluZywgb3B0aW9uPzogUGFyc2VyT3B0aW9uKTogUGFyc2VyPFA+O1xyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUGF0aFBhcnNlcjxQID0gdW5rbm93bj4ocGF0aG5hbWU6IHN0cmluZywgb3B0aW9uOiBQYXJzZXJPcHRpb24gPSBkZWZhdWx0T3B0aW9uKTogUGFyc2VyPFA+IHtcclxuICBjb25zdCB7XHJcbiAgICBjYXNlU2Vuc2l0aXZlID0gZGVmYXVsdE9wdGlvbi5jYXNlU2Vuc2l0aXZlLFxyXG4gICAgc3RyaWN0TW9kZSA9IGRlZmF1bHRPcHRpb24uc3RyaWN0TW9kZSxcclxuICAgIGV4YWN0ID0gZGVmYXVsdE9wdGlvbi5leGFjdCxcclxuICB9ID0gb3B0aW9uO1xyXG4gIC8qKlxyXG4gICAqIFVSTOWMuemFjeaVtOS9k+a1geeoi1xyXG4gICAqIDEu6K+N5rOV6Kej5p6Q77yM5bCGVVJM5qih5p2/6Kej5p6Q5Li6VG9rZW5cclxuICAgKiAyLuS9v+eUqFRva2Vu55Sf5oiQ5q2j5YiZ6KGo6L6+5byPXHJcbiAgICogMy7liKnnlKjmraPliJnooajovr7lvI/op6PmnpBVUkzkuK3lj4LmlbDmiJbloavlhYVVUkzmqKHmnb9cclxuICAgKi9cclxuICBsZXQgcGF0dGVybiA9ICdeJztcclxuICBjb25zdCBrZXlzOiBzdHJpbmdbXSA9IFtdO1xyXG4gIGNvbnN0IHNjb3JlczogbnVtYmVyW10gPSBbXTtcclxuXHJcbiAgY29uc3QgdG9rZW5zID0gbGV4ZXIocGF0aG5hbWUpO1xyXG4gIGNvbnN0IG9ubHlIYXNXaWxkQ2FyZCA9IHRva2Vucy5sZW5ndGggPT09IDEgJiYgdG9rZW5zWzBdLnR5cGUgPT09IFRva2VuVHlwZS5XaWxkQ2FyZDtcclxuICBjb25zdCB0b2tlbkNvdW50ID0gdG9rZW5zLmxlbmd0aDtcclxuICBjb25zdCBsYXN0VG9rZW4gPSB0b2tlbnNbdG9rZW5Db3VudCAtIDFdO1xyXG5cclxuICBmb3IgKGxldCB0b2tlbklkeCA9IDA7IHRva2VuSWR4IDwgdG9rZW5Db3VudDsgdG9rZW5JZHgrKykge1xyXG4gICAgY29uc3QgdG9rZW4gPSB0b2tlbnNbdG9rZW5JZHhdO1xyXG4gICAgY29uc3QgbmV4dFRva2VuID0gdG9rZW5zW3Rva2VuSWR4ICsgMV07XHJcbiAgICBzd2l0Y2ggKHRva2VuLnR5cGUpIHtcclxuICAgICAgY2FzZSBUb2tlblR5cGUuRGVsaW1pdGVyOlxyXG4gICAgICAgIHBhdHRlcm4gKz0gJy8nO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFRva2VuVHlwZS5TdGF0aWM6XHJcbiAgICAgICAgcGF0dGVybiArPSB0b2tlbi52YWx1ZS5yZXBsYWNlKFJFR0VYX0NIQVJTX1JFLCAnXFxcXCQmJyk7XHJcbiAgICAgICAgc2NvcmVzLnB1c2goTWF0Y2hTY29yZS5zdGF0aWMpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFRva2VuVHlwZS5QYXJhbTpcclxuICAgICAgICBsZXQgcGFyYW1SZWdleHAgPSAnJztcclxuICAgICAgICBpZiAobmV4dFRva2VuICYmIG5leHRUb2tlbi50eXBlID09PSBUb2tlblR5cGUuTEJyYWNrZXQpIHtcclxuICAgICAgICAgIC8vIOi3s+i/h+W9k+WJjVRva2Vu5ZKM5bem5ous5Y+3XHJcbiAgICAgICAgICB0b2tlbklkeCArPSAyO1xyXG4gICAgICAgICAgd2hpbGUgKHRva2Vuc1t0b2tlbklkeF0udHlwZSAhPT0gVG9rZW5UeXBlLlJCcmFja2V0KSB7XHJcbiAgICAgICAgICAgIHBhcmFtUmVnZXhwICs9IHRva2Vuc1t0b2tlbklkeF0udmFsdWU7XHJcbiAgICAgICAgICAgIHRva2VuSWR4Kys7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHBhdHRlcm4gKz0gcGFyYW1SZWdleHAgPyBgKCg/OiR7cGFyYW1SZWdleHB9KSlgIDogYCgke0JBU0VfUEFSQU1fUEFUVEVSTn0pYDtcclxuICAgICAgICBrZXlzLnB1c2godG9rZW4udmFsdWUpO1xyXG4gICAgICAgIHNjb3Jlcy5wdXNoKE1hdGNoU2NvcmUucGFyYW0pO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFRva2VuVHlwZS5XaWxkQ2FyZDpcclxuICAgICAgICBrZXlzLnB1c2godG9rZW4udmFsdWUpO1xyXG4gICAgICAgIHBhdHRlcm4gKz0gYCgoPzoke0JBU0VfUEFSQU1fUEFUVEVSTn0pJHtvbmx5SGFzV2lsZENhcmQgPyAnPycgOiAnJ30oPzovKD86JHtCQVNFX1BBUkFNX1BBVFRFUk59KSkqKWA7XHJcbiAgICAgICAgc2NvcmVzLnB1c2gob25seUhhc1dpbGRDYXJkID8gTWF0Y2hTY29yZS53aWxkY2FyZCA6IE1hdGNoU2NvcmUucGxhY2Vob2xkZXIpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuICBjb25zdCBpc1dpbGRDYXJkID0gbGFzdFRva2VuLnR5cGUgPT09IFRva2VuVHlwZS5XaWxkQ2FyZDtcclxuXHJcbiAgaWYgKCFpc1dpbGRDYXJkICYmICFleGFjdCkge1xyXG4gICAgaWYgKCFzdHJpY3RNb2RlKSB7XHJcbiAgICAgIHBhdHRlcm4gKz0gYCg/Olske2VzY2FwZVN0cihEZWZhdWx0RGVsaW1pdGVyKX1dKD89JCkpP2A7XHJcbiAgICB9XHJcbiAgICBpZiAobGFzdFRva2VuLnR5cGUgIT09IFRva2VuVHlwZS5EZWxpbWl0ZXIpIHtcclxuICAgICAgcGF0dGVybiArPSBgKD89WyR7ZXNjYXBlU3RyKERlZmF1bHREZWxpbWl0ZXIpfV18JClgO1xyXG4gICAgfVxyXG4gIH0gZWxzZSB7XHJcbiAgICBwYXR0ZXJuICs9IHN0cmljdE1vZGUgPyAnJCcgOiBgWyR7ZXNjYXBlU3RyKERlZmF1bHREZWxpbWl0ZXIpfV0/JGA7XHJcbiAgfVxyXG5cclxuICBjb25zdCBmbGFnID0gY2FzZVNlbnNpdGl2ZSA/ICcnIDogJ2knO1xyXG4gIGNvbnN0IHJlZ2V4cCA9IG5ldyBSZWdFeHAocGF0dGVybiwgZmxhZyk7XHJcblxyXG4gIC8qKlxyXG4gICAqIEBkZXNjcmlwdGlvbiDmoLnmja7nu5nlrppQYXR0ZXJu6Kej5p6QcGF0aFxyXG4gICAqL1xyXG4gIGZ1bmN0aW9uIHBhcnNlKHBhdGg6IHN0cmluZyk6IE1hdGNoZWQ8UD4gfCBudWxsIHtcclxuICAgIGNvbnN0IHJlTWF0Y2ggPSBwYXRoLm1hdGNoKHJlZ2V4cCk7XHJcblxyXG4gICAgaWYgKCFyZU1hdGNoKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgY29uc3QgbWF0Y2hlZFBhdGggPSByZU1hdGNoWzBdO1xyXG4gICAgbGV0IHBhcmFtczogUGFyYW1zPFA+ID0ge307XHJcbiAgICBsZXQgcGFyc2VTY29yZTogbnVtYmVyW10gPSBBcnJheS5mcm9tKHNjb3Jlcyk7XHJcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IHJlTWF0Y2gubGVuZ3RoOyBpKyspIHtcclxuICAgICAgbGV0IHBhcmFtID0gcmVNYXRjaFtpXTtcclxuICAgICAgbGV0IGtleSA9IGtleXNbaSAtIDFdO1xyXG4gICAgICBpZiAoa2V5ID09PSAnKicgJiYgcGFyYW0pIHtcclxuICAgICAgICBsZXQgdmFsdWUgPSBwYXJhbS5zcGxpdCgnLycpO1xyXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShwYXJhbXNbJyonXSkpIHtcclxuICAgICAgICAgIHBhcmFtc1snKiddID0gdmFsdWU7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHBhcmFtc1snKiddLnB1c2goLi4udmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyDlrozmiJDpgJrphY3nrKblj4LmlbDop6PmnpDlkI7lsIZwbGFjZWhvbGRlcuabv+aNouS4undpbGRjYXJk5Y+C5pWw55qE5YiG5YC8XHJcbiAgICAgICAgcGFyc2VTY29yZS5zcGxpY2UoXHJcbiAgICAgICAgICBzY29yZXMuaW5kZXhPZihNYXRjaFNjb3JlLnBsYWNlaG9sZGVyKSxcclxuICAgICAgICAgIDEsXHJcbiAgICAgICAgICAuLi5uZXcgQXJyYXkodmFsdWUubGVuZ3RoKS5maWxsKE1hdGNoU2NvcmUud2lsZGNhcmQpLFxyXG4gICAgICAgICk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcGFyYW1zW2tleV0gPSBwYXJhbSA/IHBhcmFtIDogW107XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBpc0V4YWN0ID0gcGF0aCA9PT0gbWF0Y2hlZFBhdGg7XHJcbiAgICBjb25zdCB1cmwgPSBwYXRoID09PSAnLycgJiYgbWF0Y2hlZFBhdGggPT09ICcnID8gJy8nIDogbWF0Y2hlZFBhdGg7XHJcbiAgICByZXR1cm4geyBpc0V4YWN0OiBpc0V4YWN0LCBwYXRoOiBwYXRobmFtZSwgdXJsOiB1cmwsIHNjb3JlOiBwYXJzZVNjb3JlLCBwYXJhbXM6IHBhcmFtcyB9O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQGRlc2NyaXB0aW9uIOS9v+eUqOe7meWumuWPguaVsOWhq+WFhXBhdHRlcm7vvIzlvpfliLDnm67moIdVUkxcclxuICAgKi9cclxuICBmdW5jdGlvbiBjb21waWxlKHBhcmFtczogUGFyYW1zPFA+KTogc3RyaW5nIHtcclxuICAgIGxldCBwYXRoID0gJyc7XHJcbiAgICBmb3IgKGNvbnN0IHRva2VuIG9mIHRva2Vucykge1xyXG4gICAgICBzd2l0Y2ggKHRva2VuLnR5cGUpIHtcclxuICAgICAgICBjYXNlIFRva2VuVHlwZS5TdGF0aWM6XHJcbiAgICAgICAgICBwYXRoICs9IHRva2VuLnZhbHVlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBUb2tlblR5cGUuUGFyYW06XHJcbiAgICAgICAgICBpZiAoIXBhcmFtc1t0b2tlbi52YWx1ZV0pIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQYXJhbSBpcyBpbnZhbGlkLicpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcGF0aCArPSBwYXJhbXNbdG9rZW4udmFsdWVdO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBUb2tlblR5cGUuV2lsZENhcmQ6XHJcbiAgICAgICAgICBsZXQgd2lsZENhcmQgPSBwYXJhbXNbJyonXTtcclxuICAgICAgICAgIGlmICh3aWxkQ2FyZCBpbnN0YW5jZW9mIEFycmF5KSB7XHJcbiAgICAgICAgICAgIHBhdGggKz0gd2lsZENhcmQuam9pbignLycpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcGF0aCArPSB3aWxkQ2FyZDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgVG9rZW5UeXBlLkRlbGltaXRlcjpcclxuICAgICAgICAgIHBhdGggKz0gdG9rZW4udmFsdWU7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHBhdGg7XHJcbiAgfVxyXG5cclxuICByZXR1cm4ge1xyXG4gICAgZ2V0IHJlZ2V4cCgpIHtcclxuICAgICAgcmV0dXJuIHJlZ2V4cDtcclxuICAgIH0sXHJcbiAgICBnZXQga2V5cygpIHtcclxuICAgICAgcmV0dXJuIGtleXM7XHJcbiAgICB9LFxyXG4gICAgY29tcGlsZSxcclxuICAgIHBhcnNlLFxyXG4gIH07XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBAZGVzY3JpcHRpb24g5L6d5qyh5L2/55SocGF0aG5hbWXkuI5wYXR0ZXJu6L+b6KGM5Yy56YWN77yM5qC55o2u5Yy56YWN5YiG5pWw5Y+W5b6X5YiG5pWw5pyA6auY57uT5p6cXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gbWF0Y2hQYXRoPFAgPSBhbnk+KFxyXG4gIHBhdGhuYW1lOiBzdHJpbmcsXHJcbiAgcGF0dGVybjogc3RyaW5nIHwgc3RyaW5nW10sXHJcbiAgb3B0aW9uPzogUGFyc2VyT3B0aW9uLFxyXG4pOiBNYXRjaGVkPFA+IHwgbnVsbCB7XHJcbiAgY29uc3QgcGF0dGVybnMgPSBBcnJheS5pc0FycmF5KHBhdHRlcm4pID8gWy4uLnBhdHRlcm5dIDogW3BhdHRlcm5dO1xyXG4gIGNvbnN0IG1hdGNoZWRSZXN1bHRzOiBNYXRjaGVkPFA+W10gPSBbXTtcclxuICBmb3IgKGNvbnN0IGl0ZW0gb2YgcGF0dGVybnMpIHtcclxuICAgIGNvbnN0IHBhcnNlciA9IGNyZWF0ZVBhdGhQYXJzZXIoaXRlbSwgb3B0aW9uKTtcclxuICAgIGNvbnN0IG1hdGNoZWQgPSBwYXJzZXIucGFyc2UocGF0aG5hbWUpO1xyXG4gICAgaWYgKG1hdGNoZWQpIHtcclxuICAgICAgbWF0Y2hlZFJlc3VsdHMucHVzaChtYXRjaGVkKTtcclxuICAgIH1cclxuICB9XHJcbiAgcmV0dXJuICFtYXRjaGVkUmVzdWx0cy5sZW5ndGggPyBudWxsIDogbWF0Y2hlZFJlc3VsdHMuc29ydCgoYSwgYikgPT4gc2NvcmVDb21wYXJlKGEuc2NvcmUsIGIuc2NvcmUpKVswXTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlUGF0aDxQID0gYW55PihwYXRoOiBzdHJpbmcsIHBhcmFtczogUGFyYW1zPFA+KSB7XHJcbiAgY29uc3QgcGFyc2VyID0gY3JlYXRlUGF0aFBhcnNlcihwYXRoKTtcclxuICByZXR1cm4gcGFyc2VyLmNvbXBpbGUocGFyYW1zKTtcclxufSIsImltcG9ydCB7IHVzZUNvbnRleHQgfSBmcm9tICdyZWFjdCc7XHJcbmltcG9ydCBSb3V0ZXJDb250ZXh0IGZyb20gJy4vY29udGV4dCc7XHJcbmltcG9ydCB7IE1hdGNoZWQsIG1hdGNoUGF0aCwgUGFyYW1zIH0gZnJvbSAnLi9tYXRjaGVyL3BhcnNlcic7XHJcbmltcG9ydCB7IEhpc3RvcnkgfSBmcm9tICcuLi9oaXN0b3J5L3R5cGVzJztcclxuaW1wb3J0IHsgTG9jYXRpb24gfSBmcm9tICcuL2luZGV4JztcclxuXHJcbmZ1bmN0aW9uIHVzZUhpc3Rvcnk8Uz4oKTogSGlzdG9yeTxTPjtcclxuZnVuY3Rpb24gdXNlSGlzdG9yeSgpIHtcclxuICByZXR1cm4gdXNlQ29udGV4dChSb3V0ZXJDb250ZXh0KS5oaXN0b3J5O1xyXG59XHJcblxyXG5mdW5jdGlvbiB1c2VMb2NhdGlvbjxTPigpOiBMb2NhdGlvbjxTPjtcclxuZnVuY3Rpb24gdXNlTG9jYXRpb24oKSB7XHJcbiAgcmV0dXJuIHVzZUNvbnRleHQoUm91dGVyQ29udGV4dCkubG9jYXRpb247XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHVzZVBhcmFtczxQPigpOiBQYXJhbXM8UD4gfCB7fTtcclxuZnVuY3Rpb24gdXNlUGFyYW1zKCkge1xyXG4gIGNvbnN0IG1hdGNoID0gdXNlQ29udGV4dChSb3V0ZXJDb250ZXh0KS5tYXRjaDtcclxuICByZXR1cm4gbWF0Y2ggPyBtYXRjaC5wYXJhbXMgOiB7fTtcclxufVxyXG5cclxuZnVuY3Rpb24gdXNlUm91dGVNYXRjaDxQPihwYXRoPzogc3RyaW5nKTogTWF0Y2hlZDxQPiB8IG51bGw7XHJcbmZ1bmN0aW9uIHVzZVJvdXRlTWF0Y2gocGF0aD86IHN0cmluZykge1xyXG4gIGNvbnN0IHBhdGhuYW1lID0gdXNlTG9jYXRpb24oKS5wYXRobmFtZTtcclxuICBjb25zdCBtYXRjaCA9IHVzZUNvbnRleHQoUm91dGVyQ29udGV4dCkubWF0Y2g7XHJcbiAgaWYgKHBhdGgpIHtcclxuICAgIHJldHVybiBtYXRjaFBhdGgocGF0aG5hbWUsIHBhdGgpO1xyXG4gIH1cclxuICByZXR1cm4gbWF0Y2g7XHJcbn1cclxuXHJcbmV4cG9ydCB7IHVzZUhpc3RvcnksIHVzZUxvY2F0aW9uLCB1c2VQYXJhbXMsIHVzZVJvdXRlTWF0Y2ggfTtcclxuIiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyBIaXN0b3J5LCBMb2NhdGlvbiB9IGZyb20gJy4vaW5kZXgnO1xyXG5pbXBvcnQgeyBNYXRjaGVkLCBtYXRjaFBhdGggfSBmcm9tICcuL21hdGNoZXIvcGFyc2VyJztcclxuaW1wb3J0IHsgdXNlQ29udGV4dCwgQ2hpbGRyZW4sIGNyZWF0ZUVsZW1lbnQgfSBmcm9tICdyZWFjdCc7XHJcbmltcG9ydCBSb3V0ZXJDb250ZXh0IGZyb20gJy4vY29udGV4dCc7XHJcbmltcG9ydCB7IEdldFVSTFBhcmFtcyB9IGZyb20gJy4vbWF0Y2hlci90eXBlcyc7XHJcblxyXG5leHBvcnQgdHlwZSBSb3V0ZUNvbXBvbmVudFByb3BzPFAgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge30sIFMgPSB1bmtub3duPiA9IFJvdXRlQ2hpbGRyZW5Qcm9wczxQLCBTPjtcclxuXHJcbmV4cG9ydCB0eXBlIFJvdXRlQ2hpbGRyZW5Qcm9wczxQIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IHt9LCBTID0gdW5rbm93bj4gPSB7XHJcbiAgaGlzdG9yeTogSGlzdG9yeTxTPjtcclxuICBsb2NhdGlvbjogTG9jYXRpb248Uz47XHJcbiAgbWF0Y2g6IE1hdGNoZWQ8UD4gfCBudWxsXHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIFJvdXRlUHJvcHM8UCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fSwgUGF0aCBleHRlbmRzIHN0cmluZyA9IHN0cmluZz4gPSB7XHJcbiAgbG9jYXRpb24/OiBMb2NhdGlvbjtcclxuICBjb21wb25lbnQ/OiBSZWFjdC5Db21wb25lbnRUeXBlPFJvdXRlQ29tcG9uZW50UHJvcHM8UD4+IHwgUmVhY3QuQ29tcG9uZW50VHlwZTxhbnk+IHwgdW5kZWZpbmVkO1xyXG4gIGNoaWxkcmVuPzogKChwcm9wczogUm91dGVDaGlsZHJlblByb3BzPFA+KSA9PiBSZWFjdC5SZWFjdE5vZGUpIHwgUmVhY3QuUmVhY3ROb2RlO1xyXG4gIHJlbmRlcj86IChwcm9wczogUm91dGVDb21wb25lbnRQcm9wczxQPikgPT4gUmVhY3QuUmVhY3ROb2RlO1xyXG4gIHBhdGg/OiBQYXRoIHwgUGF0aFtdO1xyXG4gIGV4YWN0PzogYm9vbGVhbjtcclxuICBzZW5zaXRpdmU/OiBib29sZWFuO1xyXG4gIHN0cmljdD86IGJvb2xlYW47XHJcbiAgY29tcHV0ZWQ/OiBNYXRjaGVkPFA+O1xyXG59O1xyXG5cclxuZnVuY3Rpb24gUm91dGU8UGF0aCBleHRlbmRzIHN0cmluZywgUCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gPSBHZXRVUkxQYXJhbXM8UGF0aD4+KHByb3BzOiBSb3V0ZVByb3BzPFAsIFBhdGg+KSB7XHJcbiAgY29uc3QgY29udGV4dCA9IHVzZUNvbnRleHQoUm91dGVyQ29udGV4dCk7XHJcblxyXG4gIGNvbnN0IHsgY29tcHV0ZWQsIGxvY2F0aW9uLCBwYXRoIH0gPSBwcm9wcztcclxuICBsZXQgeyBjaGlsZHJlbiwgY29tcG9uZW50LCByZW5kZXIgfSA9IHByb3BzO1xyXG4gIGxldCBtYXRjaDogTWF0Y2hlZDxQPiB8IG51bGw7XHJcblxyXG4gIGNvbnN0IHJvdXRlTG9jYXRpb24gPSBsb2NhdGlvbiB8fCBjb250ZXh0LmxvY2F0aW9uO1xyXG4gIGlmIChjb21wdXRlZCkge1xyXG4gICAgbWF0Y2ggPSBjb21wdXRlZDtcclxuICB9IGVsc2UgaWYgKHBhdGgpIHtcclxuICAgIG1hdGNoID0gbWF0Y2hQYXRoPFA+KHJvdXRlTG9jYXRpb24ucGF0aG5hbWUsIHBhdGgpO1xyXG4gIH0gZWxzZSB7XHJcbiAgICBtYXRjaCA9IGNvbnRleHQubWF0Y2g7XHJcbiAgfVxyXG4gIGNvbnN0IG5ld1Byb3BzID0geyAuLi5jb250ZXh0LCBsb2NhdGlvbjogcm91dGVMb2NhdGlvbiwgbWF0Y2g6IG1hdGNoIH07XHJcblxyXG4gIGlmIChBcnJheS5pc0FycmF5KGNoaWxkcmVuKSAmJiBDaGlsZHJlbi5jb3VudChjaGlsZHJlbikgPT09IDApIHtcclxuICAgIGNoaWxkcmVuID0gbnVsbDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIOaMiemhuuW6j+iOt+WPlumcgOimgea4suafk+eahOe7hOS7tlxyXG4gICAqIDEuY2hpbGRyZW5cclxuICAgKiAyLmNvbXBvbmVudFxyXG4gICAqIDMucmVuZGVyXHJcbiAgICog6YO95rKh5pyJ5Yy56YWN5Yiw6L+U5ZueTnVsbFxyXG4gICAqL1xyXG4gIGNvbnN0IGdldENoaWxkcmVuID0gKCk6IFJlYWN0LlJlYWN0Tm9kZSB8IG51bGwgPT4ge1xyXG4gICAgLy8g5aaC5p6cIG1hdGNoIOWtmOWcqFxyXG4gICAgaWYgKG5ld1Byb3BzLm1hdGNoKSB7XHJcbiAgICAgIGlmIChjaGlsZHJlbikge1xyXG4gICAgICAgIGlmICh0eXBlb2YgY2hpbGRyZW4gPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgIHJldHVybiBjaGlsZHJlbihuZXdQcm9wcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBjaGlsZHJlbjtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGNvbXBvbmVudCkge1xyXG4gICAgICAgIHJldHVybiBjcmVhdGVFbGVtZW50KGNvbXBvbmVudCwgbmV3UHJvcHMpO1xyXG4gICAgICB9IGVsc2UgaWYgKHJlbmRlcikge1xyXG4gICAgICAgIHJldHVybiByZW5kZXIobmV3UHJvcHMpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBtYXRjaOS4um51bGxcclxuICAgICAgaWYgKHR5cGVvZiBjaGlsZHJlbiA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgIHJldHVybiBjaGlsZHJlbihuZXdQcm9wcyk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgcmV0dXJuIDxSb3V0ZXJDb250ZXh0LlByb3ZpZGVyIHZhbHVlPXtuZXdQcm9wc30+e2dldENoaWxkcmVuKCl9PC9Sb3V0ZXJDb250ZXh0LlByb3ZpZGVyPjtcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgUm91dGU7XHJcbiIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcclxuaW1wb3J0IHsgdXNlTGF5b3V0RWZmZWN0LCB1c2VNZW1vLCB1c2VSZWYsIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnO1xyXG5cclxuaW1wb3J0IHsgSGlzdG9yeSwgTG9jYXRpb24gfSBmcm9tICcuLi9oaXN0b3J5L3R5cGVzJztcclxuXHJcbmltcG9ydCBSb3V0ZXJDb250ZXh0LCB7IFJvdXRlckNvbnRleHRWYWx1ZSB9IGZyb20gJy4vY29udGV4dCc7XHJcblxyXG5leHBvcnQgdHlwZSBSb3V0ZXJQcm9wcyA9IHtcclxuICBoaXN0b3J5OiBIaXN0b3J5O1xyXG4gIGNoaWxkcmVuPzogUmVhY3QuUmVhY3ROb2RlO1xyXG59O1xyXG5cclxuZnVuY3Rpb24gUm91dGVyPFAgZXh0ZW5kcyBSb3V0ZXJQcm9wcz4ocHJvcHM6IFApIHtcclxuICBjb25zdCB7IGhpc3RvcnksIGNoaWxkcmVuID0gbnVsbCB9ID0gcHJvcHM7XHJcbiAgY29uc3QgW2xvY2F0aW9uLCBzZXRMb2NhdGlvbl0gPSB1c2VTdGF0ZShwcm9wcy5oaXN0b3J5LmxvY2F0aW9uKTtcclxuICBjb25zdCBwZW5kaW5nTG9jYXRpb24gPSB1c2VSZWY8TG9jYXRpb24gfCBudWxsPihudWxsKTtcclxuXHJcbiAgLy8g5ZyoUm91dGVy5Yqg6L295pe25bCx55uR5ZCsaGlzdG9yeeWcsOWdgOWPmOWMlu+8jOS7peS/neivgeWcqOWni+a4suafk+aXtumHjeWumuWQkeiDveato+ehruinpuWPkVxyXG4gIGxldCB1bkxpc3RlbjogbnVsbCB8ICgoKSA9PiB2b2lkKSA9IGhpc3RvcnkubGlzdGVuKGFyZyA9PiB7XHJcbiAgICBwZW5kaW5nTG9jYXRpb24uY3VycmVudCA9IGFyZy5sb2NhdGlvbjtcclxuICB9KTtcclxuXHJcbiAgLy8g5qih5oufY29tcG9uZW50RGlkTW91bnTlkoxjb21wb25lbnRXaWxsVW5tb3VudFxyXG4gIHVzZUxheW91dEVmZmVjdCgoKSA9PiB7XHJcbiAgICBpZiAodW5MaXN0ZW4pIHtcclxuICAgICAgdW5MaXN0ZW4oKTtcclxuICAgIH1cclxuICAgIC8vIOebkeWQrGhpc3RvcnnkuK3nmoTkvY3nva7lj5jljJZcclxuICAgIHVuTGlzdGVuID0gaGlzdG9yeS5saXN0ZW4oYXJnID0+IHtcclxuICAgICAgc2V0TG9jYXRpb24oYXJnLmxvY2F0aW9uKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGlmIChwZW5kaW5nTG9jYXRpb24uY3VycmVudCkge1xyXG4gICAgICBzZXRMb2NhdGlvbihwZW5kaW5nTG9jYXRpb24uY3VycmVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgaWYgKHVuTGlzdGVuKSB7XHJcbiAgICAgICAgdW5MaXN0ZW4oKTtcclxuICAgICAgICB1bkxpc3RlbiA9IG51bGw7XHJcbiAgICAgICAgcGVuZGluZ0xvY2F0aW9uLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gIH0sIFtdKTtcclxuXHJcbiAgY29uc3QgaW5pdENvbnRleHRWYWx1ZTogUm91dGVyQ29udGV4dFZhbHVlID0gdXNlTWVtbyhcclxuICAgICgpID0+ICh7XHJcbiAgICAgIGhpc3Rvcnk6IGhpc3RvcnksXHJcbiAgICAgIGxvY2F0aW9uOiBsb2NhdGlvbixcclxuICAgICAgbWF0Y2g6IHsgaXNFeGFjdDogbG9jYXRpb24ucGF0aG5hbWUgPT09ICcvJywgcGFyYW1zOiB7fSwgcGF0aDogJy8nLCBzY29yZTogW10sIHVybDogJy8nIH0sXHJcbiAgICB9KSxcclxuICAgIFtsb2NhdGlvbl0sXHJcbiAgKTtcclxuXHJcbiAgcmV0dXJuIDxSb3V0ZXJDb250ZXh0LlByb3ZpZGVyIHZhbHVlPXtpbml0Q29udGV4dFZhbHVlfSBjaGlsZHJlbj17Y2hpbGRyZW59IC8+O1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBSb3V0ZXI7XHJcbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHNvdXJjZSwgZXhjbHVkZWQpIHtcbiAgaWYgKHNvdXJjZSA9PSBudWxsKSByZXR1cm4ge307XG4gIHZhciB0YXJnZXQgPSB7fTtcbiAgdmFyIHNvdXJjZUtleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpO1xuICB2YXIga2V5LCBpO1xuICBmb3IgKGkgPSAwOyBpIDwgc291cmNlS2V5cy5sZW5ndGg7IGkrKykge1xuICAgIGtleSA9IHNvdXJjZUtleXNbaV07XG4gICAgaWYgKGV4Y2x1ZGVkLmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTtcbiAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICB9XG4gIHJldHVybiB0YXJnZXQ7XG59IiwiaW1wb3J0IHsgdXNlTGF5b3V0RWZmZWN0LCB1c2VSZWYgfSBmcm9tICdyZWFjdCc7XHJcblxyXG5leHBvcnQgdHlwZSBMaWZlQ3ljbGVQcm9wcyA9IHtcclxuICBvbk1vdW50PzogKCkgPT4gdm9pZDtcclxuICBvblVwZGF0ZT86IChwcmV2UHJvcHM/OiBMaWZlQ3ljbGVQcm9wcykgPT4gdm9pZDtcclxuICBvblVubW91bnQ/OiAoKSA9PiB2b2lkO1xyXG4gIGRhdGE/OiBhbnk7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gTGlmZUN5Y2xlKHByb3BzOiBMaWZlQ3ljbGVQcm9wcykge1xyXG4gIC8vIOS9v+eUqHJlZuS/neWtmOS4iuS4gOasoeeahHByb3Bz77yM6Ziy5q2i6YeN5paw5riy5p+TXHJcbiAgY29uc3QgcHJldlByb3BzID0gdXNlUmVmPExpZmVDeWNsZVByb3BzIHwgbnVsbD4obnVsbCk7XHJcbiAgY29uc3QgaXNNb3VudCA9IHVzZVJlZihmYWxzZSk7XHJcblxyXG4gIGNvbnN0IHsgb25Nb3VudCwgb25VcGRhdGUsIG9uVW5tb3VudCB9ID0gcHJvcHM7XHJcblxyXG4gIHVzZUxheW91dEVmZmVjdCgoKSA9PiB7XHJcbiAgICAvLyDpppbmrKHmjILovb0g5qih5oufY29tcG9uZW50RGlkTW91bnRcclxuICAgIGlmICghaXNNb3VudC5jdXJyZW50KSB7XHJcbiAgICAgIGlzTW91bnQuY3VycmVudCA9IHRydWU7XHJcbiAgICAgIGlmIChvbk1vdW50KSB7XHJcbiAgICAgICAgb25Nb3VudCgpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyDkuI3mmK/pppbmrKHmuLLmn5Mg5qih5oufY29tcG9uZW50RGlkVXBkYXRlXHJcbiAgICAgIGlmIChvblVwZGF0ZSkge1xyXG4gICAgICAgIHByZXZQcm9wcy5jdXJyZW50ID8gb25VcGRhdGUocHJldlByb3BzLmN1cnJlbnQpIDogb25VcGRhdGUoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcHJldlByb3BzLmN1cnJlbnQgPSBwcm9wcztcclxuICB9KTtcclxuXHJcbiAgLy8g5qih5oufY29tcG9uZW50V2lsbFVubW91bnRcclxuICB1c2VMYXlvdXRFZmZlY3QoKCkgPT4ge1xyXG4gICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgaWYgKG9uVW5tb3VudCkge1xyXG4gICAgICAgIG9uVW5tb3VudCgpO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gIH0sIFtdKTtcclxuXHJcbiAgcmV0dXJuIG51bGw7XHJcbn1cclxuIiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyB1c2VDb250ZXh0IH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgUm91dGVyQ29udGV4dCBmcm9tICcuL2NvbnRleHQnO1xyXG5pbXBvcnQgeyBMaWZlQ3ljbGUsIExpZmVDeWNsZVByb3BzIH0gZnJvbSAnLi9saWZlQ3ljbGVIb29rJztcclxuaW1wb3J0IHsgTWF0Y2hlZCwgY3JlYXRlUGF0aFBhcnNlciB9IGZyb20gJy4vbWF0Y2hlci9wYXJzZXInO1xyXG5pbXBvcnQgeyBhZGRIZWFkU2xhc2gsIGlzTG9jYXRpb25FcXVhbCwgcGFyc2VQYXRoIH0gZnJvbSAnLi4vaGlzdG9yeS91dGlscyc7XHJcbmltcG9ydCB7IExvY2F0aW9uIH0gZnJvbSAnLi9pbmRleCc7XHJcblxyXG5leHBvcnQgdHlwZSBSZWRpcmVjdFByb3BzID0ge1xyXG4gIHRvOiBzdHJpbmcgfCBQYXJ0aWFsPExvY2F0aW9uPjtcclxuICBwdXNoPzogYm9vbGVhbjtcclxuICBwYXRoPzogc3RyaW5nO1xyXG4gIGZyb20/OiBzdHJpbmc7XHJcbiAgZXhhY3Q/OiBib29sZWFuO1xyXG4gIHN0cmljdD86IGJvb2xlYW47XHJcblxyXG4gIC8vIOeUsVN3aXRjaOiuoeeul+W+l+WIsFxyXG4gIHJlYWRvbmx5IGNvbXB1dGVkPzogTWF0Y2hlZCB8IG51bGw7XHJcbn07XHJcblxyXG5mdW5jdGlvbiBSZWRpcmVjdDxQIGV4dGVuZHMgUmVkaXJlY3RQcm9wcz4ocHJvcHM6IFApIHtcclxuICBjb25zdCB7IHRvLCBwdXNoID0gZmFsc2UsIGNvbXB1dGVkIH0gPSBwcm9wcztcclxuXHJcbiAgY29uc3QgY29udGV4dCA9IHVzZUNvbnRleHQoUm91dGVyQ29udGV4dCk7XHJcbiAgY29uc3QgeyBoaXN0b3J5IH0gPSBjb250ZXh0O1xyXG5cclxuICBjb25zdCBjYWxjTG9jYXRpb24gPSAoKTogUGFydGlhbDxMb2NhdGlvbj4gPT4ge1xyXG4gICAgaWYgKGNvbXB1dGVkKSB7XHJcbiAgICAgIGlmICh0eXBlb2YgdG8gPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgY29uc3QgcGFyc2VyID0gY3JlYXRlUGF0aFBhcnNlcih0byk7XHJcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gcGFyc2VyLmNvbXBpbGUoY29tcHV0ZWQucGFyYW1zKTtcclxuICAgICAgICByZXR1cm4gcGFyc2VQYXRoKHRhcmdldCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc3QgcGF0aG5hbWUgPSB0by5wYXRobmFtZSA/IGFkZEhlYWRTbGFzaCh0by5wYXRobmFtZSkgOiAnLyc7XHJcbiAgICAgICAgY29uc3QgcGFyc2VyID0gY3JlYXRlUGF0aFBhcnNlcihwYXRobmFtZSk7XHJcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gcGFyc2VyLmNvbXBpbGUoY29tcHV0ZWQucGFyYW1zKTtcclxuICAgICAgICByZXR1cm4geyAuLi50bywgcGF0aG5hbWU6IHRhcmdldCB9O1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHlwZW9mIHRvID09PSAnc3RyaW5nJyA/IHBhcnNlUGF0aCh0bykgOiB0bztcclxuICB9O1xyXG5cclxuICBjb25zdCBuYXZpZ2F0ZSA9IHB1c2ggPyBoaXN0b3J5LnB1c2ggOiBoaXN0b3J5LnJlcGxhY2U7XHJcbiAgY29uc3QgeyBzdGF0ZSwgLi4ucGF0aCB9ID0gY2FsY0xvY2F0aW9uKCk7XHJcblxyXG4gIGNvbnN0IG9uTW91bnRGdW5jID0gKCkgPT4ge1xyXG4gICAgbmF2aWdhdGUocGF0aCwgc3RhdGUpO1xyXG4gIH07XHJcblxyXG4gIGNvbnN0IG9uVXBkYXRlRnVuYyA9IChwcmV2UHJvcHM/OiBMaWZlQ3ljbGVQcm9wcykgPT4ge1xyXG4gICAgLy8g5aaC5p6c5b2T5YmN6aG16Z2i5LiO6YeN5a6a5ZCR5YmN6aG16Z2i5LiN5LiA6Ie077yM5omn6KGM6Lez6L2sXHJcbiAgICBjb25zdCBwcmV2UGF0aCA9IHByZXZQcm9wcz8uZGF0YSBhcyBMb2NhdGlvbjtcclxuICAgIGlmICghaXNMb2NhdGlvbkVxdWFsKHByZXZQYXRoLCBwYXRoKSkge1xyXG4gICAgICBuYXZpZ2F0ZShwYXRoLCBzdGF0ZSk7XHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgcmV0dXJuIDxMaWZlQ3ljbGUgb25Nb3VudD17b25Nb3VudEZ1bmN9IG9uVXBkYXRlPXtvblVwZGF0ZUZ1bmN9IGRhdGE9e3BhdGh9IC8+O1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBSZWRpcmVjdDtcclxuIiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyB1c2VDb250ZXh0LCBDaGlsZHJlbiwgaXNWYWxpZEVsZW1lbnQsIGNsb25lRWxlbWVudCB9IGZyb20gJ3JlYWN0JztcclxuXHJcbmltcG9ydCB7IExvY2F0aW9uIH0gZnJvbSAnLi9pbmRleCc7XHJcbmltcG9ydCBSb3V0ZXJDb250ZXh0IGZyb20gJy4vY29udGV4dCc7XHJcbmltcG9ydCB7IE1hdGNoZWQsIG1hdGNoUGF0aCB9IGZyb20gJy4vbWF0Y2hlci9wYXJzZXInO1xyXG5pbXBvcnQgUm91dGUsIHsgUm91dGVQcm9wcyB9IGZyb20gJy4vUm91dGUnO1xyXG5pbXBvcnQgUmVkaXJlY3QsIHsgUmVkaXJlY3RQcm9wcyB9IGZyb20gJy4vUmVkaXJlY3QnO1xyXG5cclxuZXhwb3J0IHR5cGUgU3dpdGNoUHJvcHMgPSB7XHJcbiAgbG9jYXRpb24/OiBMb2NhdGlvbjtcclxuICBjaGlsZHJlbj86IFJlYWN0LlJlYWN0Tm9kZTtcclxufTtcclxuXHJcbmZ1bmN0aW9uIFN3aXRjaDxQIGV4dGVuZHMgU3dpdGNoUHJvcHM+KHByb3BzOiBQKTogUmVhY3QuUmVhY3RFbGVtZW50IHwgbnVsbCB7XHJcbiAgY29uc3QgY29udGV4dCA9IHVzZUNvbnRleHQoUm91dGVyQ29udGV4dCk7XHJcbiAgY29uc3QgbG9jYXRpb24gPSBwcm9wcy5sb2NhdGlvbiB8fCBjb250ZXh0LmxvY2F0aW9uO1xyXG5cclxuICBsZXQgZWxlbWVudDogUmVhY3QuUmVhY3RFbGVtZW50IHwgbnVsbCA9IG51bGw7XHJcbiAgbGV0IG1hdGNoOiBNYXRjaGVkIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIC8vIOS9v+eUqGZvckVhY2jkuI3kvJrnu5lSZWFjdC5SZWFjdE5vZGXlop7liqBrZXnlsZ7mgKcs6Ziy5q2i6YeN5paw5riy5p+TXHJcbiAgQ2hpbGRyZW4uZm9yRWFjaChwcm9wcy5jaGlsZHJlbiwgbm9kZSA9PiB7XHJcbiAgICBpZiAobWF0Y2ggPT09IG51bGwgJiYgaXNWYWxpZEVsZW1lbnQobm9kZSkpIHtcclxuICAgICAgZWxlbWVudCA9IG5vZGU7XHJcblxyXG4gICAgICBsZXQgc3RyaWN0OiBib29sZWFuIHwgdW5kZWZpbmVkO1xyXG4gICAgICBsZXQgc2Vuc2l0aXZlOiBib29sZWFuIHwgdW5kZWZpbmVkO1xyXG4gICAgICBsZXQgcGF0aDogc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQ7XHJcbiAgICAgIGxldCBmcm9tOiBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcblxyXG4gICAgICAvLyBub2Rl5Y+v6IO95pivUm91dGXlkoxSZWRpcmVjdFxyXG4gICAgICBpZiAobm9kZS50eXBlID09PSBSb3V0ZSkge1xyXG4gICAgICAgIGNvbnN0IHByb3BzID0gbm9kZS5wcm9wcyBhcyBSb3V0ZVByb3BzO1xyXG4gICAgICAgIHN0cmljdCA9IHByb3BzLnN0cmljdDtcclxuICAgICAgICBzZW5zaXRpdmUgPSBwcm9wcy5zZW5zaXRpdmU7XHJcbiAgICAgICAgcGF0aCA9IHByb3BzLnBhdGg7XHJcbiAgICAgIH0gZWxzZSBpZiAobm9kZS50eXBlID09PSBSZWRpcmVjdCkge1xyXG4gICAgICAgIGNvbnN0IHByb3BzID0gbm9kZS5wcm9wcyBhcyBSZWRpcmVjdFByb3BzO1xyXG4gICAgICAgIHBhdGggPSBwcm9wcy5wYXRoO1xyXG4gICAgICAgIHN0cmljdCA9IHByb3BzLnN0cmljdDtcclxuICAgICAgICBmcm9tID0gcHJvcHMuZnJvbTtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgZXhhY3QgPSBub2RlLnByb3BzLmV4YWN0O1xyXG4gICAgICBjb25zdCB0YXJnZXQgPSBwYXRoIHx8IGZyb207XHJcblxyXG4gICAgICAvLyDmm7TmlrDljLnphY3nirbmgIHvvIzkuIDml6bljLnphY3liLDlgZzmraLpgY3ljoZcclxuICAgICAgaWYgKHRhcmdldCkge1xyXG4gICAgICAgIG1hdGNoID0gbWF0Y2hQYXRoKGxvY2F0aW9uLnBhdGhuYW1lLCB0YXJnZXQsIHtcclxuICAgICAgICAgIHN0cmljdE1vZGU6IHN0cmljdCxcclxuICAgICAgICAgIGNhc2VTZW5zaXRpdmU6IHNlbnNpdGl2ZSxcclxuICAgICAgICAgIGV4YWN0OiBleGFjdCxcclxuICAgICAgICB9KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBtYXRjaCA9IGNvbnRleHQubWF0Y2g7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9KTtcclxuXHJcbiAgaWYgKG1hdGNoICYmIGVsZW1lbnQpIHtcclxuICAgIC8vIOS9v+eUqGNsb25lRWxlbWVudOWkjeWItuW3suaciee7hOS7tuW5tuabtOaWsOWFtlByb3BzXHJcbiAgICByZXR1cm4gY2xvbmVFbGVtZW50KGVsZW1lbnQsIHsgbG9jYXRpb246IGxvY2F0aW9uLCBjb21wdXRlZDogbWF0Y2ggfSk7XHJcbiAgfVxyXG4gIHJldHVybiBudWxsO1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBTd2l0Y2g7XHJcbiIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcclxuaW1wb3J0IHsgdXNlQ29udGV4dCB9IGZyb20gJ3JlYWN0JztcclxuaW1wb3J0IHsgTGlmZUN5Y2xlLCBMaWZlQ3ljbGVQcm9wcyB9IGZyb20gJy4vbGlmZUN5Y2xlSG9vayc7XHJcbmltcG9ydCB7IExvY2F0aW9uIH0gZnJvbSAnLi9pbmRleCc7XHJcbmltcG9ydCB7IEFjdGlvbiB9IGZyb20gJy4uL2hpc3RvcnkvdHlwZXMnO1xyXG5pbXBvcnQgUm91dGVyQ29udGV4dCBmcm9tICcuL2NvbnRleHQnO1xyXG5cclxudHlwZSBQcm9tcHRQcm9wcyA9IHtcclxuICBtZXNzYWdlPzogc3RyaW5nIHwgKChsb2NhdGlvbjogUGFydGlhbDxMb2NhdGlvbj4sIGFjdGlvbjogQWN0aW9uKSA9PiB2b2lkKTtcclxuICB3aGVuPzogYm9vbGVhbiB8ICgobG9jYXRpb246IFBhcnRpYWw8TG9jYXRpb24+KSA9PiBib29sZWFuKTtcclxufTtcclxuXHJcbmZ1bmN0aW9uIFByb21wdDxQIGV4dGVuZHMgUHJvbXB0UHJvcHM+KHByb3BzOiBQKSB7XHJcbiAgY29uc3QgY29udGV4dCA9IHVzZUNvbnRleHQoUm91dGVyQ29udGV4dCk7XHJcblxyXG4gIGNvbnN0IHsgbWVzc2FnZSwgd2hlbiA9IHRydWUgfSA9IHByb3BzO1xyXG5cclxuICBpZiAoKHR5cGVvZiB3aGVuID09PSAnZnVuY3Rpb24nICYmIHdoZW4oY29udGV4dC5sb2NhdGlvbikgPT09IGZhbHNlKSB8fCAhd2hlbikge1xyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICBjb25zdCBuYXZpZ2F0ZSA9IGNvbnRleHQuaGlzdG9yeS5ibG9jaztcclxuXHJcbiAgbGV0IHJlbGVhc2U6ICgoKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xyXG5cclxuICBjb25zdCBvbk1vdW50RnVuYyA9ICgpID0+IHtcclxuICAgIHJlbGVhc2UgPSBtZXNzYWdlID8gbmF2aWdhdGUobWVzc2FnZSkgOiBudWxsO1xyXG4gIH07XHJcblxyXG4gIGNvbnN0IG9uVXBkYXRlRnVuYyA9IChwcmV2UHJvcHM/OiBMaWZlQ3ljbGVQcm9wcykgPT4ge1xyXG4gICAgaWYgKHByZXZQcm9wcyAmJiBwcmV2UHJvcHMuZGF0YSAhPT0gbWVzc2FnZSkge1xyXG4gICAgICBpZiAocmVsZWFzZSkge1xyXG4gICAgICAgIHJlbGVhc2UoKTtcclxuICAgICAgfVxyXG4gICAgICByZWxlYXNlID0gbWVzc2FnZSA/IG5hdmlnYXRlKG1lc3NhZ2UpIDogbnVsbDtcclxuICAgIH1cclxuICB9O1xyXG5cclxuICBjb25zdCBvblVubW91bnRGdW5jID0gKCkgPT4ge1xyXG4gICAgaWYgKHJlbGVhc2UpIHtcclxuICAgICAgcmVsZWFzZSgpO1xyXG4gICAgfVxyXG4gICAgcmVsZWFzZSA9IG51bGw7XHJcbiAgfTtcclxuXHJcbiAgcmV0dXJuIDxMaWZlQ3ljbGUgb25Nb3VudD17b25Nb3VudEZ1bmN9IG9uVXBkYXRlPXtvblVwZGF0ZUZ1bmN9IG9uVW5tb3VudD17b25Vbm1vdW50RnVuY30gZGF0YT17bWVzc2FnZX0gLz47XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFByb21wdDtcclxuIiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyB1c2VDb250ZXh0IH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgUm91dGVyQ29udGV4dCBmcm9tICcuL2NvbnRleHQnO1xyXG5cclxuZnVuY3Rpb24gd2l0aFJvdXRlcjxDIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50VHlwZT4oQ29tcG9uZW50OiBDKSB7XHJcblxyXG4gIGZ1bmN0aW9uIENvbXBvbmVudFdpdGhSb3V0ZXJQcm9wKHByb3BzOiBhbnkpIHtcclxuICAgIGNvbnN0IHsgaGlzdG9yeSwgbG9jYXRpb24sIG1hdGNoIH0gPSB1c2VDb250ZXh0KFJvdXRlckNvbnRleHQpO1xyXG4gICAgY29uc3Qgcm91dGVQcm9wcyA9IHsgaGlzdG9yeTogaGlzdG9yeSwgbG9jYXRpb246IGxvY2F0aW9uLCBtYXRjaDogbWF0Y2ggfTtcclxuXHJcbiAgICByZXR1cm4gPENvbXBvbmVudCB7Li4ucHJvcHN9IHsuLi5yb3V0ZVByb3BzfSAvPjtcclxuICB9XHJcblxyXG4gIHJldHVybiBDb21wb25lbnRXaXRoUm91dGVyUHJvcDtcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgd2l0aFJvdXRlcjsiLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XHJcbmltcG9ydCB7IHVzZVJlZiB9IGZyb20gJ3JlYWN0JztcclxuaW1wb3J0IHsgSGlzdG9yeSB9IGZyb20gJy4uL2hpc3RvcnkvdHlwZXMnO1xyXG5pbXBvcnQgeyBCYXNlUm91dGVyUHJvcHMgfSBmcm9tICcuL0Jyb3dzZXJSb3V0ZXInO1xyXG5pbXBvcnQgeyBjcmVhdGVIYXNoSGlzdG9yeSwgdXJsSGFzaFR5cGUgfSBmcm9tICcuLi9oaXN0b3J5L2hhc2hIaXN0b3J5JztcclxuaW1wb3J0IFJvdXRlciBmcm9tICcuL1JvdXRlcic7XHJcblxyXG5leHBvcnQgdHlwZSBIYXNoUm91dGVyUHJvcHMgPSBCYXNlUm91dGVyUHJvcHMgJiB7XHJcbiAgaGFzaFR5cGU6IHVybEhhc2hUeXBlO1xyXG59O1xyXG5cclxuZnVuY3Rpb24gSGFzaFJvdXRlcjxQIGV4dGVuZHMgUGFydGlhbDxIYXNoUm91dGVyUHJvcHM+Pihwcm9wczogUCkge1xyXG4gIGxldCBoaXN0b3J5UmVmID0gdXNlUmVmPEhpc3Rvcnk+KCk7XHJcbiAgaWYgKGhpc3RvcnlSZWYuY3VycmVudCA9PT0gbnVsbCB8fCBoaXN0b3J5UmVmLmN1cnJlbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgaGlzdG9yeVJlZi5jdXJyZW50ID0gY3JlYXRlSGFzaEhpc3Rvcnkoe1xyXG4gICAgICBiYXNlbmFtZTogcHJvcHMuYmFzZW5hbWUsXHJcbiAgICAgIGdldFVzZXJDb25maXJtYXRpb246IHByb3BzLmdldFVzZXJDb25maXJtYXRpb24sXHJcbiAgICAgIGhhc2hUeXBlOiBwcm9wcy5oYXNoVHlwZSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIDxSb3V0ZXIgaGlzdG9yeT17aGlzdG9yeVJlZi5jdXJyZW50fT57cHJvcHMuY2hpbGRyZW59PC9Sb3V0ZXI+O1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBIYXNoUm91dGVyOyIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcclxuaW1wb3J0IHsgdXNlUmVmLCBSZWFjdE5vZGUgfSBmcm9tICdyZWFjdCc7XHJcbmltcG9ydCBSb3V0ZXIgZnJvbSAnLi9Sb3V0ZXInO1xyXG5pbXBvcnQgeyBjcmVhdGVCcm93c2VySGlzdG9yeSB9IGZyb20gJy4uL2hpc3RvcnkvYnJvd2VySGlzdG9yeSc7XHJcbmltcG9ydCB7IENvbmZpcm1hdGlvbkZ1bmMsIEhpc3RvcnkgfSBmcm9tICcuLi9oaXN0b3J5L3R5cGVzJztcclxuXHJcbmV4cG9ydCB0eXBlIEJhc2VSb3V0ZXJQcm9wcyA9IHtcclxuICBiYXNlbmFtZTogc3RyaW5nO1xyXG4gIGdldFVzZXJDb25maXJtYXRpb246IENvbmZpcm1hdGlvbkZ1bmM7XHJcbiAgY2hpbGRyZW4/OiBSZWFjdE5vZGU7XHJcbn07XHJcblxyXG5leHBvcnQgdHlwZSBCcm93c2VyUm91dGVyUHJvcHMgPSBCYXNlUm91dGVyUHJvcHMgJiB7XHJcbiAgZm9yY2VSZWZyZXNoOiBib29sZWFuO1xyXG59O1xyXG5cclxuZnVuY3Rpb24gQnJvd3NlclJvdXRlcjxQIGV4dGVuZHMgUGFydGlhbDxCcm93c2VyUm91dGVyUHJvcHM+Pihwcm9wczogUCkge1xyXG4gIC8vIOS9v+eUqFJlZuaMgeaciUhpc3Rvcnnlr7nosaHvvIzpmLLmraLph43lpI3muLLmn5NcclxuICBsZXQgaGlzdG9yeVJlZiA9IHVzZVJlZjxIaXN0b3J5PigpO1xyXG5cclxuICBpZiAoaGlzdG9yeVJlZi5jdXJyZW50ID09PSBudWxsIHx8IGhpc3RvcnlSZWYuY3VycmVudCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICBoaXN0b3J5UmVmLmN1cnJlbnQgPSBjcmVhdGVCcm93c2VySGlzdG9yeSh7XHJcbiAgICAgIGJhc2VuYW1lOiBwcm9wcy5iYXNlbmFtZSxcclxuICAgICAgZm9yY2VSZWZyZXNoOiBwcm9wcy5mb3JjZVJlZnJlc2gsXHJcbiAgICAgIGdldFVzZXJDb25maXJtYXRpb246IHByb3BzLmdldFVzZXJDb25maXJtYXRpb24sXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHJldHVybiA8Um91dGVyIGhpc3Rvcnk9e2hpc3RvcnlSZWYuY3VycmVudH0+e3Byb3BzLmNoaWxkcmVufTwvUm91dGVyPjtcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgQnJvd3NlclJvdXRlcjsiLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XHJcbmltcG9ydCB7IHVzZUNvbnRleHQgfSBmcm9tICdyZWFjdCc7XHJcbmltcG9ydCBSb3V0ZXJDb250ZXh0IGZyb20gJy4vY29udGV4dCc7XHJcbmltcG9ydCB7IExvY2F0aW9uIH0gZnJvbSAnLi9pbmRleCc7XHJcbmltcG9ydCB7IGNyZWF0ZVBhdGgsIHBhcnNlUGF0aCB9IGZyb20gJy4uL2hpc3RvcnkvdXRpbHMnO1xyXG5pbXBvcnQgeyBQYXRoIH0gZnJvbSAnLi4vaGlzdG9yeS90eXBlcyc7XHJcblxyXG5leHBvcnQgdHlwZSBMaW5rUHJvcHMgPSB7XHJcbiAgY29tcG9uZW50PzogUmVhY3QuQ29tcG9uZW50VHlwZTxhbnk+O1xyXG4gIHRvOiBQYXJ0aWFsPExvY2F0aW9uPiB8IHN0cmluZyB8ICgobG9jYXRpb246IExvY2F0aW9uKSA9PiBzdHJpbmcgfCBQYXJ0aWFsPExvY2F0aW9uPik7XHJcbiAgcmVwbGFjZT86IGJvb2xlYW47XHJcbiAgdGFnPzogc3RyaW5nO1xyXG4gIC8qKlxyXG4gICAqIEBkZXByZWNhdGVkXHJcbiAgICogUmVhY3QxNuS7peWQjuS4jeWGjemcgOimgeivpeWxnuaAp1xyXG4gICAqKi9cclxuICBpbm5lclJlZj86IFJlYWN0LlJlZjxIVE1MQW5jaG9yRWxlbWVudD47XHJcbn0gJiBSZWFjdC5BbmNob3JIVE1MQXR0cmlidXRlczxIVE1MQW5jaG9yRWxlbWVudD47XHJcblxyXG5jb25zdCBpc01vZGlmaWVkRXZlbnQgPSAoZXZlbnQ6IFJlYWN0Lk1vdXNlRXZlbnQpID0+IHtcclxuICByZXR1cm4gZXZlbnQubWV0YUtleSB8fCBldmVudC5hbHRLZXkgfHwgZXZlbnQuY3RybEtleSB8fCBldmVudC5zaGlmdEtleTtcclxufTtcclxuXHJcbmNvbnN0IGNoZWNrVGFyZ2V0ID0gKHRhcmdldD86IFJlYWN0LkhUTUxBdHRyaWJ1dGVBbmNob3JUYXJnZXQpID0+IHtcclxuICByZXR1cm4gIXRhcmdldCB8fCB0YXJnZXQgPT09ICdfc2VsZic7XHJcbn07XHJcblxyXG5cclxuZnVuY3Rpb24gTGluazxQIGV4dGVuZHMgTGlua1Byb3BzPihwcm9wczogUCkge1xyXG4gIGNvbnN0IHsgdG8sIHJlcGxhY2UsIGNvbXBvbmVudCwgb25DbGljaywgdGFyZ2V0LCAuLi5vdGhlciB9ID0gcHJvcHM7XHJcblxyXG4gIGNvbnN0IHRhZyA9IHByb3BzLnRhZyB8fCAnYSc7XHJcblxyXG4gIGNvbnN0IGNvbnRleHQgPSB1c2VDb250ZXh0KFJvdXRlckNvbnRleHQpO1xyXG4gIGNvbnN0IGhpc3RvcnkgPSBjb250ZXh0Lmhpc3Rvcnk7XHJcblxyXG4gIGxldCBsb2NhdGlvbiA9IHR5cGVvZiB0byA9PT0gJ2Z1bmN0aW9uJyA/IHRvKGNvbnRleHQubG9jYXRpb24pIDogdG87XHJcblxyXG4gIGxldCBzdGF0ZTogYW55O1xyXG4gIGxldCBwYXRoOiBQYXJ0aWFsPFBhdGg+O1xyXG4gIGlmICh0eXBlb2YgbG9jYXRpb24gPT09ICdzdHJpbmcnKSB7XHJcbiAgICBwYXRoID0gcGFyc2VQYXRoKGxvY2F0aW9uKTtcclxuICB9IGVsc2Uge1xyXG4gICAgY29uc3QgeyBwYXRobmFtZSwgaGFzaCwgc2VhcmNoIH0gPSBsb2NhdGlvbjtcclxuICAgIHBhdGggPSB7IHBhdGhuYW1lLCBoYXNoLCBzZWFyY2ggfTtcclxuICAgIHN0YXRlID0gbG9jYXRpb24uc3RhdGU7XHJcbiAgfVxyXG4gIGNvbnN0IGhyZWYgPSBoaXN0b3J5LmNyZWF0ZUhyZWYocGF0aCk7XHJcblxyXG4gIGNvbnN0IGxpbmtDbGlja0V2ZW50ID0gKGV2ZW50OiBSZWFjdC5Nb3VzZUV2ZW50PEhUTUxBbmNob3JFbGVtZW50PikgPT4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgaWYgKG9uQ2xpY2spIHtcclxuICAgICAgICBvbkNsaWNrKGV2ZW50KTtcclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICB0aHJvdyBlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghZXZlbnQuZGVmYXVsdFByZXZlbnRlZCAmJiBldmVudC5idXR0b24gPT09IDAgJiYgY2hlY2tUYXJnZXQodGFyZ2V0KSAmJiAhaXNNb2RpZmllZEV2ZW50KGV2ZW50KSkge1xyXG4gICAgICAvLyDkuI3mmK/nm7jlkIznmoTot6/lvoTmiafooYxwdXNo5pON5L2c77yM5piv55u45ZCM55qE6Lev5b6E5omn6KGMcmVwbGFjZVxyXG4gICAgICBjb25zdCBpc1NhbWVQYXRoID0gY3JlYXRlUGF0aChjb250ZXh0LmxvY2F0aW9uKSA9PT0gY3JlYXRlUGF0aChwYXRoKTtcclxuICAgICAgY29uc3QgbmF2aWdhdGUgPSByZXBsYWNlIHx8IGlzU2FtZVBhdGggPyBoaXN0b3J5LnJlcGxhY2UgOiBoaXN0b3J5LnB1c2g7XHJcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgIG5hdmlnYXRlKHBhdGgsIHN0YXRlKTtcclxuICAgIH1cclxuICB9O1xyXG5cclxuICBjb25zdCBsaW5rUHJvcHMgPSB7IGhyZWY6IGhyZWYsIG9uQ2xpY2s6IGxpbmtDbGlja0V2ZW50LCAuLi5vdGhlciB9O1xyXG4gIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KHRhZywgbGlua1Byb3BzKTtcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgTGluazsiLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XHJcbmltcG9ydCB7IHVzZUNvbnRleHQgfSBmcm9tICdyZWFjdCc7XHJcbmltcG9ydCB0eXBlIHsgTGlua1Byb3BzIH0gZnJvbSAnLi9MaW5rJztcclxuaW1wb3J0IExpbmsgZnJvbSAnLi9MaW5rJztcclxuaW1wb3J0IHsgTG9jYXRpb24sIG1hdGNoUGF0aCB9IGZyb20gJy4vaW5kZXgnO1xyXG5pbXBvcnQgeyBNYXRjaGVkIH0gZnJvbSAnLi9tYXRjaGVyL3BhcnNlcic7XHJcbmltcG9ydCBDb250ZXh0IGZyb20gJy4vY29udGV4dCc7XHJcbmltcG9ydCB7IHBhcnNlUGF0aCB9IGZyb20gJy4uL2hpc3RvcnkvdXRpbHMnO1xyXG5pbXBvcnQgeyBlc2NhcGVTdHIgfSBmcm9tICcuL21hdGNoZXIvdXRpbHMnO1xyXG5cclxudHlwZSBOYXZMaW5rUHJvcHMgPSB7XHJcbiAgdG86IFBhcnRpYWw8TG9jYXRpb24+IHwgc3RyaW5nIHwgKChsb2NhdGlvbjogTG9jYXRpb24pID0+IHN0cmluZyB8IFBhcnRpYWw8TG9jYXRpb24+KTtcclxuICBpc0FjdGl2ZT86IChtYXRjaDogTWF0Y2hlZCB8IG51bGwsIGxvY2F0aW9uOiBMb2NhdGlvbikgPT4gYm9vbGVhbjtcclxuICAvLyBjb21wYXQgcmVhY3Qtcm91dGVyIE5hdkxpbmsgcHJvcHMgdHlwZVxyXG4gIFtrZXk6IHN0cmluZ106IGFueTtcclxufSAmIExpbmtQcm9wcztcclxuXHJcbnR5cGUgUGFnZSA9ICdwYWdlJztcclxuXHJcbmZ1bmN0aW9uIE5hdkxpbms8UCBleHRlbmRzIE5hdkxpbmtQcm9wcz4ocHJvcHM6IFApIHtcclxuICBjb25zdCB7IHRvLCBpc0FjdGl2ZSwgLi4ucmVzdCB9ID0gcHJvcHM7XHJcbiAgY29uc3QgY29udGV4dCA9IHVzZUNvbnRleHQoQ29udGV4dCk7XHJcblxyXG4gIGNvbnN0IHRvTG9jYXRpb24gPSB0eXBlb2YgdG8gPT09ICdmdW5jdGlvbicgPyB0byhjb250ZXh0LmxvY2F0aW9uKSA6IHRvO1xyXG5cclxuICBjb25zdCB7IHBhdGhuYW1lOiBwYXRoIH0gPSB0eXBlb2YgdG9Mb2NhdGlvbiA9PT0gJ3N0cmluZycgPyBwYXJzZVBhdGgodG9Mb2NhdGlvbikgOiB0b0xvY2F0aW9uO1xyXG4gIC8vIOaKiuato+WImeihqOi+vuW8j+eahOeJueauiuespuWPt+WKoOS4pOS4quWPjeaWnOadoOi/m+ihjOi9rOS5iVxyXG4gIGNvbnN0IGVzY2FwZWRQYXRoID0gcGF0aCA/IGVzY2FwZVN0cihwYXRoKSA6ICcnO1xyXG4gIGNvbnN0IG1hdGNoID0gZXNjYXBlZFBhdGggPyBtYXRjaFBhdGgoY29udGV4dC5sb2NhdGlvbi5wYXRobmFtZSwgZXNjYXBlZFBhdGgpIDogbnVsbDtcclxuXHJcbiAgY29uc3QgaXNMaW5rQWN0aXZlID0gbWF0Y2ggJiYgaXNBY3RpdmUgPyBpc0FjdGl2ZShtYXRjaCwgY29udGV4dC5sb2NhdGlvbikgOiBmYWxzZTtcclxuXHJcbiAgY29uc3QgcGFnZTogUGFnZSA9ICdwYWdlJztcclxuICBjb25zdCBvdGhlclByb3BzID0ge1xyXG4gICAgJ2FyaWEtY3VycmVudCc6IGlzTGlua0FjdGl2ZSA/IHBhZ2UgOiBmYWxzZSxcclxuICAgIC4uLnJlc3QsXHJcbiAgfTtcclxuXHJcbiAgcmV0dXJuIDxMaW5rIHRvPXt0b30gey4uLm90aGVyUHJvcHN9IC8+O1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBOYXZMaW5rO1xyXG4iXSwibmFtZXMiOlsiaXNCcm93c2VyIiwid2luZG93IiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50IiwiZ2V0RGVmYXVsdENvbmZpcm1hdGlvbiIsIm1lc3NhZ2UiLCJjYWxsQmFjayIsImNvbmZpcm0iLCJpc1N1cHBvcnRIaXN0b3J5IiwiaGlzdG9yeSIsImlzU3VwcG9ydHNQb3BTdGF0ZSIsIm5hdmlnYXRvciIsInVzZXJBZ2VudCIsImluZGV4T2YiLCJBY3Rpb24iLCJFdmVudFR5cGUiLCJfZXh0ZW5kcyIsIk9iamVjdCIsImFzc2lnbiIsImJpbmQiLCJ0YXJnZXQiLCJpIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwic291cmNlIiwia2V5IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiYXBwbHkiLCJjcmVhdGVQYXRoIiwicGF0aCIsInNlYXJjaCIsImhhc2giLCJwYXRobmFtZSIsInN0YXJ0c1dpdGgiLCJwYXJzZVBhdGgiLCJ1cmwiLCJwYXJzZWRQYXRoIiwiaGFzaElkeCIsInN1YnN0cmluZyIsInNlYXJjaElkeCIsImNyZWF0ZUxvY2F0aW9uIiwiY3VycmVudCIsInRvIiwic3RhdGUiLCJ1cmxPYmoiLCJnZXRSYW5kS2V5IiwiZ2VuUmFuZG9tS2V5IiwibG9jYXRpb24iLCJpc0xvY2F0aW9uRXF1YWwiLCJwMSIsInAyIiwiYWRkSGVhZFNsYXNoIiwic3RyaXBIZWFkU2xhc2giLCJub3JtYWxpemVTbGFzaCIsInRlbXBQYXRoIiwiaGFzQmFzZW5hbWUiLCJwcmVmaXgiLCJ0b0xvd2VyQ2FzZSIsImluY2x1ZGVzIiwiY2hhckF0Iiwic3RyaXBCYXNlbmFtZSIsImNyZWF0ZU1lbW9yeVJlY29yZCIsImluaXRWYWwiLCJmbiIsInZpc2l0ZWRSZWNvcmQiLCJnZXREZWx0YSIsImZvcm0iLCJ0b0lkeCIsImxhc3RJbmRleE9mIiwiZnJvbUlkeCIsImFkZFJlY29yZCIsIm5ld1JlY29yZCIsImFjdGlvbiIsImN1clZhbCIsIk5ld1ZhbCIsInB1c2giLCJwcmV2SWR4IiwibmV3VmlzaXRlZFJlY29yZCIsInNsaWNlIiwicmVwbGFjZSIsImVuZCIsIk1hdGgiLCJyYW5kb20iLCJ0b1N0cmluZyIsIl9jbGFzc0NhbGxDaGVjayIsImluc3RhbmNlIiwiQ29uc3RydWN0b3IiLCJUeXBlRXJyb3IiLCJfdHlwZW9mIiwib2JqIiwiU3ltYm9sIiwiaXRlcmF0b3IiLCJjb25zdHJ1Y3RvciIsIl90b1ByaW1pdGl2ZSIsImlucHV0IiwiaGludCIsInByaW0iLCJ0b1ByaW1pdGl2ZSIsInVuZGVmaW5lZCIsInJlcyIsIlN0cmluZyIsIk51bWJlciIsIl90b1Byb3BlcnR5S2V5IiwiYXJnIiwiX2RlZmluZVByb3BlcnRpZXMiLCJwcm9wcyIsImRlc2NyaXB0b3IiLCJlbnVtZXJhYmxlIiwiY29uZmlndXJhYmxlIiwid3JpdGFibGUiLCJkZWZpbmVQcm9wZXJ0eSIsInRvUHJvcGVydHlLZXkiLCJfY3JlYXRlQ2xhc3MiLCJwcm90b1Byb3BzIiwic3RhdGljUHJvcHMiLCJUcmFuc2l0aW9uTWFuYWdlciIsInByb21wdCIsImxpc3RlbmVycyIsInZhbHVlIiwic2V0UHJvbXB0IiwiX3RoaXMiLCJhZGRMaXN0ZW5lciIsImZ1bmMiLCJfdGhpczIiLCJpc0FjdGl2ZSIsImxpc3RlbmVyIiwiYXJncyIsImZpbHRlciIsIml0ZW0iLCJub3RpZnlMaXN0ZW5lcnMiLCJfaXRlcmF0b3IiLCJfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlciIsIl9zdGVwIiwicyIsIm4iLCJkb25lIiwiZXJyIiwiZSIsImYiLCJjb25maXJtSnVtcFRvIiwidXNlckNvbmZpcm1hdGlvbkZ1bmMiLCJyZXN1bHQiLCJ3YXJuaW5nIiwiY29uZGl0aW9uIiwiY29uc29sZSIsIndhcm4iLCJnZXRCYXNlSGlzdG9yeSIsInRyYW5zaXRpb25NYW5hZ2VyIiwic2V0TGlzdGVuZXIiLCJicm93c2VySGlzdG9yeSIsImdvIiwic3RlcCIsImdvQmFjayIsImdvRm9yd2FyZCIsImxpc3RlbiIsImNhbmNlbCIsImlzQmxvY2tlZCIsImJsb2NrIiwidW5ibG9jayIsImdldFVwZGF0ZVN0YXRlRnVuYyIsImhpc3RvcnlQcm9wcyIsIm5leHRTdGF0ZSIsImNyZWF0ZUJyb3dzZXJIaXN0b3J5Iiwib3B0aW9ucyIsInN1cHBvcnRIaXN0b3J5IiwiaXNTdXBwb3J0UG9wU3RhdGUiLCJfb3B0aW9ucyRmb3JjZVJlZnJlc2giLCJmb3JjZVJlZnJlc2giLCJfb3B0aW9ucyRnZXRVc2VyQ29uZmkiLCJnZXRVc2VyQ29uZmlybWF0aW9uIiwiYmFzZW5hbWUiLCJpbml0TG9jYXRpb24iLCJnZXRMb2NhdGlvbiIsImdldEhpc3RvcnlTdGF0ZSIsInJlY29yZE9wZXJhdG9yIiwibCIsIl9nZXRCYXNlSGlzdG9yeSIsInBvcCIsImNyZWF0ZUhyZWYiLCJ1cGRhdGVTdGF0ZSIsImhpc3RvcnlTdGF0ZSIsIl93aW5kb3ckbG9jYXRpb24iLCJfcmVmIiwiZm9yY2VKdW1wIiwiaGFuZGxlUG9wU3RhdGUiLCJjYWxsYmFjayIsImlzSnVtcCIsInJldmVydFBvcFN0YXRlIiwicG9wU3RhdGVMaXN0ZW5lciIsImV2ZW50IiwiaGFzaENoYW5nZUxpc3RlbmVyIiwibGlzdGVuZXJDb3VudCIsImNvdW50IiwiYWRkRXZlbnRMaXN0ZW5lciIsIlBvcFN0YXRlIiwiSGFzaENoYW5nZSIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJkZWx0YSIsImhyZWYiLCJwdXNoU3RhdGUiLCJyZXBsYWNlU3RhdGUiLCJzdHJpcEhhc2giLCJpZHgiLCJnZXRIYXNoQ29udGVudCIsImNyZWF0ZUhhc2hIaXN0b3J5Iiwib3B0aW9uIiwiX29wdGlvbiRoYXNoVHlwZSIsImhhc2hUeXBlIiwiX29wdGlvbiRnZXRVc2VyQ29uZmlyIiwicGF0aERlY29kZXIiLCJwYXRoRW5jb2RlciIsImhhc2hQYXRoIiwibWVtUmVjb3JkcyIsInRhZyIsInF1ZXJ5U2VsZWN0b3IiLCJiYXNlIiwiZ2V0QXR0cmlidXRlIiwiZm9yY2VOZXh0UG9wIiwiaWdub3JlUGF0aCIsImVuY29kZWRQYXRoIiwiaGFuZGxlSGFzaENoYW5nZSIsInByZXZMb2NhdGlvbiIsImNyZWF0ZU5hbWVkQ29udGV4dCIsIm5hbWUiLCJkZWZhdWx0VmFsdWUiLCJjb250ZXh0IiwiY3JlYXRlQ29udGV4dCIsImRpc3BsYXlOYW1lIiwiUm91dGVyQ29udGV4dCIsIlRva2VuVHlwZSIsImNsZWFuUGF0aCIsInNjb3JlQ29tcGFyZSIsInNjb3JlMSIsInNjb3JlMiIsInNjb3JlMUxlbmd0aCIsInNjb3JlMkxlbmd0aCIsIm1pbiIsImVzY2FwZVN0ciIsInN0ciIsInZhbGlkQ2hhciIsImxleGVyIiwidG9rZW5zIiwidXJsUGF0aCIsIkVycm9yIiwiZ2V0TGl0ZXJhbCIsInRlc3QiLCJza2lwQ2hhciIsImN1ckNoYXIiLCJwcmV2Q2hhciIsInR5cGUiLCJEZWxpbWl0ZXIiLCJQYXJhbSIsIldpbGRDYXJkIiwiU3RhdGljIiwiTEJyYWNrZXQiLCJSQnJhY2tldCIsIlBhdHRlcm4iLCJNYXRjaFNjb3JlIiwiZGVmYXVsdE9wdGlvbiIsImNhc2VTZW5zaXRpdmUiLCJzdHJpY3RNb2RlIiwiZXhhY3QiLCJSRUdFWF9DSEFSU19SRSIsIkJBU0VfUEFSQU1fUEFUVEVSTiIsIkRlZmF1bHREZWxpbWl0ZXIiLCJjcmVhdGVQYXRoUGFyc2VyIiwiX29wdGlvbiRjYXNlU2Vuc2l0aXZlIiwiX29wdGlvbiRzdHJpY3RNb2RlIiwiX29wdGlvbiRleGFjdCIsInBhdHRlcm4iLCJrZXlzIiwic2NvcmVzIiwib25seUhhc1dpbGRDYXJkIiwidG9rZW5Db3VudCIsImxhc3RUb2tlbiIsInRva2VuSWR4IiwidG9rZW4iLCJuZXh0VG9rZW4iLCJzdGF0aWMiLCJwYXJhbVJlZ2V4cCIsInBhcmFtIiwid2lsZGNhcmQiLCJwbGFjZWhvbGRlciIsImlzV2lsZENhcmQiLCJmbGFnIiwicmVnZXhwIiwiUmVnRXhwIiwicGFyc2UiLCJyZU1hdGNoIiwibWF0Y2giLCJtYXRjaGVkUGF0aCIsInBhcmFtcyIsInBhcnNlU2NvcmUiLCJBcnJheSIsImZyb20iLCJzcGxpdCIsImlzQXJyYXkiLCJfcGFyYW1zJCIsInNwbGljZSIsImNvbmNhdCIsImZpbGwiLCJpc0V4YWN0Iiwic2NvcmUiLCJjb21waWxlIiwid2lsZENhcmQiLCJqb2luIiwibWF0Y2hQYXRoIiwicGF0dGVybnMiLCJtYXRjaGVkUmVzdWx0cyIsIl9pdGVyYXRvcjIiLCJfc3RlcDIiLCJwYXJzZXIiLCJtYXRjaGVkIiwic29ydCIsImEiLCJiIiwiZ2VuZXJhdGVQYXRoIiwidXNlSGlzdG9yeSIsInVzZUNvbnRleHQiLCJ1c2VMb2NhdGlvbiIsInVzZVBhcmFtcyIsInVzZVJvdXRlTWF0Y2giLCJSb3V0ZSIsImNvbXB1dGVkIiwiY2hpbGRyZW4iLCJjb21wb25lbnQiLCJyZW5kZXIiLCJyb3V0ZUxvY2F0aW9uIiwibmV3UHJvcHMiLCJDaGlsZHJlbiIsImdldENoaWxkcmVuIiwiUmVhY3QiLCJQcm92aWRlciIsIlJvdXRlciIsIl9wcm9wcyRjaGlsZHJlbiIsIl91c2VTdGF0ZSIsInVzZVN0YXRlIiwic2V0TG9jYXRpb24iLCJwZW5kaW5nTG9jYXRpb24iLCJ1c2VSZWYiLCJ1bkxpc3RlbiIsInVzZUxheW91dEVmZmVjdCIsImluaXRDb250ZXh0VmFsdWUiLCJ1c2VNZW1vIiwiX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UiLCJleGNsdWRlZCIsInNvdXJjZUtleXMiLCJMaWZlQ3ljbGUiLCJwcmV2UHJvcHMiLCJpc01vdW50Iiwib25Nb3VudCIsIm9uVXBkYXRlIiwib25Vbm1vdW50IiwiUmVkaXJlY3QiLCJfcHJvcHMkcHVzaCIsImNhbGNMb2NhdGlvbiIsIm5hdmlnYXRlIiwiX2NhbGNMb2NhdGlvbiIsIl9leGNsdWRlZCIsIm9uTW91bnRGdW5jIiwib25VcGRhdGVGdW5jIiwicHJldlBhdGgiLCJkYXRhIiwiU3dpdGNoIiwiZWxlbWVudCIsImZvckVhY2giLCJub2RlIiwiaXNWYWxpZEVsZW1lbnQiLCJzdHJpY3QiLCJzZW5zaXRpdmUiLCJjbG9uZUVsZW1lbnQiLCJQcm9tcHQiLCJfcHJvcHMkd2hlbiIsIndoZW4iLCJyZWxlYXNlIiwib25Vbm1vdW50RnVuYyIsIndpdGhSb3V0ZXIiLCJDb21wb25lbnQiLCJDb21wb25lbnRXaXRoUm91dGVyUHJvcCIsIl91c2VDb250ZXh0Iiwicm91dGVQcm9wcyIsIkhhc2hSb3V0ZXIiLCJoaXN0b3J5UmVmIiwiQnJvd3NlclJvdXRlciIsImlzTW9kaWZpZWRFdmVudCIsIm1ldGFLZXkiLCJhbHRLZXkiLCJjdHJsS2V5Iiwic2hpZnRLZXkiLCJjaGVja1RhcmdldCIsIkxpbmsiLCJvbkNsaWNrIiwib3RoZXIiLCJsaW5rQ2xpY2tFdmVudCIsInByZXZlbnREZWZhdWx0IiwiZGVmYXVsdFByZXZlbnRlZCIsImJ1dHRvbiIsImlzU2FtZVBhdGgiLCJsaW5rUHJvcHMiLCJOYXZMaW5rIiwicmVzdCIsIkNvbnRleHQiLCJ0b0xvY2F0aW9uIiwiZXNjYXBlZFBhdGgiLCJpc0xpbmtBY3RpdmUiLCJwYWdlIiwib3RoZXJQcm9wcyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBTyxTQUFTQSxTQUFTQSxHQUFZO0FBQ25DLEVBQUEsT0FBTyxPQUFPQyxNQUFNLEtBQUssV0FBVyxJQUFJQSxNQUFNLENBQUNDLFFBQVEsSUFBSSxPQUFPRCxNQUFNLENBQUNDLFFBQVEsQ0FBQ0MsYUFBYSxLQUFLLFVBQVUsQ0FBQTtBQUNoSCxDQUFBO0FBRU8sU0FBU0Msc0JBQXNCQSxDQUFDQyxPQUFlLEVBQUVDLFFBQW1DLEVBQUU7QUFDM0ZBLEVBQUFBLFFBQVEsQ0FBQ0wsTUFBTSxDQUFDTSxPQUFPLENBQUNGLE9BQU8sQ0FBQyxDQUFDLENBQUE7QUFDbkMsQ0FBQTs7QUFFQTtBQUNPLFNB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 diff --git a/packages/horizon-router/router/esm/router.js b/packages/horizon-router/router/esm/router.js deleted file mode 100644 index 91ea480e..00000000 --- a/packages/horizon-router/router/esm/router.js +++ /dev/null @@ -1,1490 +0,0 @@ -import * as React from 'react'; -import { createContext, useContext, Children, createElement, useState, useRef, useLayoutEffect, useMemo, isValidElement, cloneElement } from 'react'; - -function isBrowser() { - return typeof window !== 'undefined' && window.document && typeof window.document.createElement === 'function'; -} -function getDefaultConfirmation(message, callBack) { - callBack(window.confirm(message)); -} - -// 判断浏览器是否支持pushState方法,pushState是browserHistory实现的基础 -function isSupportHistory() { - return isBrowser() && window.history && 'pushState' in window.history; -} - -// 判断浏览器是否支持PopState事件 -function isSupportsPopState() { - return window.navigator.userAgent.indexOf('Trident') === -1; -} - -var Action = /*#__PURE__*/function (Action) { - Action["pop"] = "POP"; - Action["push"] = "PUSH"; - Action["replace"] = "REPLACE"; - return Action; -}({}); -var EventType = /*#__PURE__*/function (EventType) { - EventType["PopState"] = "popstate"; - EventType["HashChange"] = "hashchange"; - return EventType; -}({}); - -function _extends() { - _extends = Object.assign ? Object.assign.bind() : function (target) { - for (var i = 1; i < arguments.length; i++) { - var source = arguments[i]; - for (var key in source) { - if (Object.prototype.hasOwnProperty.call(source, key)) { - target[key] = source[key]; - } - } - } - return target; - }; - return _extends.apply(this, arguments); -} - -function createPath(path) { - var search = path.search, - hash = path.hash; - var pathname = path.pathname || '/'; - if (search && search !== '?') { - pathname += search.startsWith('?') ? search : '?' + search; - } - if (hash && hash !== '#') { - pathname += hash.startsWith('#') ? hash : '#' + hash; - } - return pathname; -} -function parsePath(url) { - if (!url) { - return {}; - } - var parsedPath = {}; - var hashIdx = url.indexOf('#'); - if (hashIdx > -1) { - parsedPath.hash = url.substring(hashIdx); - url = url.substring(0, hashIdx); - } - var searchIdx = url.indexOf('?'); - if (searchIdx > -1) { - parsedPath.search = url.substring(searchIdx); - url = url.substring(0, searchIdx); - } - if (url) { - parsedPath.pathname = url; - } - return parsedPath; -} -function createLocation(current, to, state, key) { - var pathname = typeof current === 'string' ? current : current.pathname; - var urlObj = typeof to === 'string' ? parsePath(to) : to; - // 随机key长度取6 - var getRandKey = genRandomKey(6); - var location = _extends({ - pathname: pathname, - search: '', - hash: '', - state: state, - key: typeof key === 'string' ? key : getRandKey() - }, urlObj); - if (!location.pathname) { - location.pathname = '/'; - } - return location; -} -function isLocationEqual(p1, p2) { - return p1.pathname === p2.pathname && p1.search === p2.search && p1.hash === p2.hash; -} -function addHeadSlash(path) { - if (path[0] === '/') { - return path; - } - return '/' + path; -} -function stripHeadSlash(path) { - if (path[0] === '/') { - return path.substring(1); - } - return path; -} -function normalizeSlash(path) { - var tempPath = addHeadSlash(path); - if (tempPath[tempPath.length - 1] === '/') { - return tempPath.substring(0, tempPath.length - 1); - } - return tempPath; -} -function hasBasename(path, prefix) { - return path.toLowerCase().indexOf(prefix.toLowerCase()) === 0 && ['/', '?', '#', ''].includes(path.charAt(prefix.length)); -} -function stripBasename(path, prefix) { - return hasBasename(path, prefix) ? path.substring(prefix.length) : path; -} - -// 使用随机生成的Key记录被访问过的URL,当Block被被触发时利用delta值跳转到之前的页面 -function createMemoryRecord(initVal, fn) { - var visitedRecord = [fn(initVal)]; - function getDelta(to, form) { - var toIdx = visitedRecord.lastIndexOf(fn(to)); - if (toIdx === -1) { - toIdx = 0; - } - var fromIdx = visitedRecord.lastIndexOf(fn(form)); - if (fromIdx === -1) { - fromIdx = 0; - } - return toIdx - fromIdx; - } - function addRecord(current, newRecord, action) { - var curVal = fn(current); - var NewVal = fn(newRecord); - if (action === Action.push) { - var prevIdx = visitedRecord.lastIndexOf(curVal); - var newVisitedRecord = visitedRecord.slice(0, prevIdx + 1); - newVisitedRecord.push(NewVal); - visitedRecord = newVisitedRecord; - } - if (action === Action.replace) { - var _prevIdx = visitedRecord.lastIndexOf(curVal); - if (_prevIdx !== -1) { - visitedRecord[_prevIdx] = NewVal; - } - } - } - return { - getDelta: getDelta, - addRecord: addRecord - }; -} -function genRandomKey(length) { - var end = length + 2; - return function () { - return Math.random().toString(18).substring(2, end); - }; -} - -function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } -} - -function _typeof(obj) { - "@babel/helpers - typeof"; - - return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { - return typeof obj; - } : function (obj) { - return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; - }, _typeof(obj); -} - -function _toPrimitive(input, hint) { - if (_typeof(input) !== "object" || input === null) return input; - var prim = input[Symbol.toPrimitive]; - if (prim !== undefined) { - var res = prim.call(input, hint || "default"); - if (_typeof(res) !== "object") return res; - throw new TypeError("@@toPrimitive must return a primitive value."); - } - return (hint === "string" ? String : Number)(input); -} - -function _toPropertyKey(arg) { - var key = _toPrimitive(arg, "string"); - return _typeof(key) === "symbol" ? key : String(key); -} - -function _defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i]; - descriptor.enumerable = descriptor.enumerable || false; - descriptor.configurable = true; - if ("value" in descriptor) descriptor.writable = true; - Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); - } -} -function _createClass(Constructor, protoProps, staticProps) { - if (protoProps) _defineProperties(Constructor.prototype, protoProps); - if (staticProps) _defineProperties(Constructor, staticProps); - Object.defineProperty(Constructor, "prototype", { - writable: false - }); - return Constructor; -} - -function _createForOfIteratorHelper$1(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray$1(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function () {}; return { s: F, n: function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function (e) { throw e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function () { it = it.call(o); }, n: function () { var step = it.next(); normalCompletion = step.done; return step; }, e: function (e) { didErr = true; err = e; }, f: function () { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; } -function _unsupportedIterableToArray$1(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray$1(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray$1(o, minLen); } -function _arrayLikeToArray$1(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } -var TransitionManager = /*#__PURE__*/function () { - function TransitionManager() { - _classCallCheck(this, TransitionManager); - this.prompt = void 0; - this.listeners = void 0; - this.prompt = null; - this.listeners = []; - } - _createClass(TransitionManager, [{ - key: "setPrompt", - value: function setPrompt(prompt) { - var _this = this; - this.prompt = prompt; - - // 清除Prompt - return function () { - if (_this.prompt === prompt) { - _this.prompt = null; - } - }; - } - - // 使用发布订阅模式管理history的监听者 - }, { - key: "addListener", - value: function addListener(func) { - var _this2 = this; - var isActive = true; - var listener = function (args) { - if (isActive) { - func(args); - } - }; - this.listeners.push(listener); - return function () { - isActive = false; - // 移除对应的监听者 - _this2.listeners = _this2.listeners.filter(function (item) { - return item !== listener; - }); - }; - } - }, { - key: "notifyListeners", - value: function notifyListeners(args) { - var _iterator = _createForOfIteratorHelper$1(this.listeners), - _step; - try { - for (_iterator.s(); !(_step = _iterator.n()).done;) { - var listener = _step.value; - listener(args); - } - } catch (err) { - _iterator.e(err); - } finally { - _iterator.f(); - } - } - }, { - key: "confirmJumpTo", - value: function confirmJumpTo(location, action, userConfirmationFunc, callBack) { - if (this.prompt !== null) { - var result = typeof this.prompt === 'function' ? this.prompt(location, action) : this.prompt; - if (typeof result === 'string') { - typeof userConfirmationFunc === 'function' ? userConfirmationFunc(result, callBack) : callBack(true); - } else { - callBack(result !== false); - } - } else { - callBack(true); - } - } - }]); - return TransitionManager; -}(); - -function warning(condition, message) { - if (condition) { - if (console && typeof console.warn === 'function') { - console.warn(message); - } - } -} - -// 抽取BrowserHistory和HashHistory中相同的方法 -function getBaseHistory(transitionManager, setListener, browserHistory) { - function go(step) { - browserHistory.go(step); - } - function goBack() { - browserHistory.go(-1); - } - function goForward() { - browserHistory.go(1); - } - function listen(listener) { - var cancel = transitionManager.addListener(listener); - setListener(1); - return function () { - setListener(-1); - cancel(); - }; - } - var isBlocked = false; - function block() { - var prompt = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; - var unblock = transitionManager.setPrompt(prompt); - if (!isBlocked) { - setListener(1); - isBlocked = true; - } - return function () { - if (isBlocked) { - isBlocked = false; - setListener(-1); - } - unblock(); - }; - } - function getUpdateStateFunc(historyProps) { - return function (nextState) { - if (nextState) { - _extends(historyProps, nextState); - } - historyProps.length = browserHistory.length; - var args = { - location: historyProps.location, - action: historyProps.action - }; - transitionManager.notifyListeners(args); - }; - } - return { - go: go, - goBack: goBack, - goForward: goForward, - listen: listen, - block: block, - getUpdateStateFunc: getUpdateStateFunc - }; -} - -function createBrowserHistory() { - var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; - var supportHistory = isSupportHistory(); - var isSupportPopState = isSupportsPopState(); - var browserHistory = window.history; - var _options$forceRefresh = options.forceRefresh, - forceRefresh = _options$forceRefresh === void 0 ? false : _options$forceRefresh, - _options$getUserConfi = options.getUserConfirmation, - getUserConfirmation = _options$getUserConfi === void 0 ? getDefaultConfirmation : _options$getUserConfi; - var basename = options.basename ? normalizeSlash(options.basename) : ''; - var initLocation = getLocation(getHistoryState()); - var recordOperator = createMemoryRecord(initLocation, function (l) { - return l.key; - }); - var transitionManager = new TransitionManager(); - var _getBaseHistory = getBaseHistory(transitionManager, setListener, browserHistory), - go = _getBaseHistory.go, - goBack = _getBaseHistory.goBack, - goForward = _getBaseHistory.goForward, - listen = _getBaseHistory.listen, - block = _getBaseHistory.block, - getUpdateStateFunc = _getBaseHistory.getUpdateStateFunc; - var history = { - action: Action.pop, - length: browserHistory.length, - location: initLocation, - go: go, - goBack: goBack, - goForward: goForward, - listen: listen, - block: block, - push: push, - replace: replace, - createHref: createHref - }; - var updateState = getUpdateStateFunc(history); - function getHistoryState() { - return supportHistory ? window.history.state : {}; - } - function getLocation(historyState) { - var _window$location = window.location, - search = _window$location.search, - hash = _window$location.hash; - var _ref = historyState || {}, - key = _ref.key, - state = _ref.state; - var pathname = window.location.pathname; - pathname = basename ? stripBasename(pathname, basename) : pathname; - return createLocation('', { - pathname: pathname, - search: search, - hash: hash - }, state, key); - } - - // 拦截页面POP事件后,防止返回到的页面被重复拦截 - var forceJump = false; - function handlePopState(location) { - if (forceJump) { - forceJump = false; - updateState(undefined); - } else { - var action = Action.pop; - var callback = function (isJump) { - if (isJump) { - // 执行跳转行为 - updateState({ - action: action, - location: location - }); - } else { - revertPopState(location, history.location); - } - }; - transitionManager.confirmJumpTo(location, action, getUserConfirmation, callback); - } - } - function popStateListener(event) { - handlePopState(getLocation(event.state)); - } - function hashChangeListener() { - var location = getLocation(getHistoryState()); - handlePopState(location); - } - var listenerCount = 0; - function setListener(count) { - listenerCount += count; - if (listenerCount === 1 && count === 1) { - window.addEventListener(EventType.PopState, popStateListener); - if (!isSupportPopState) { - window.addEventListener(EventType.HashChange, hashChangeListener); - } - } else if (listenerCount === 0) { - window.removeEventListener(EventType.PopState, popStateListener); - if (!isSupportPopState) { - window.removeEventListener(EventType.HashChange, hashChangeListener); - } - } - } - - // 取消页面跳转并恢复到跳转前的页面 - function revertPopState(form, to) { - var delta = recordOperator.getDelta(to, form); - if (delta !== 0) { - go(delta); - forceJump = true; - } - } - function createHref(path) { - return basename + createPath(path); - } - function push(to, state) { - var action = Action.push; - var location = createLocation(history.location, to, state, undefined); - transitionManager.confirmJumpTo(location, action, getUserConfirmation, function (isJump) { - if (!isJump) { - return; - } - var href = createHref(location); - var key = location.key, - state = location.state; - if (supportHistory) { - if (forceRefresh) { - window.location.href = href; - } else { - browserHistory.pushState({ - key: key, - state: state - }, '', href); - recordOperator.addRecord(history.location, location, action); - updateState({ - action: action, - location: location - }); - } - } else { - warning(state !== undefined, 'Browser history cannot push state in browsers that do not support HTML5 history'); - window.location.href = href; - } - }); - } - function replace(to, state) { - var action = Action.replace; - var location = createLocation(history.location, to, state, undefined); - transitionManager.confirmJumpTo(location, action, getUserConfirmation, function (isJump) { - if (!isJump) { - return; - } - var href = createHref(location); - var key = location.key, - state = location.state; - if (supportHistory) { - if (forceRefresh) { - window.location.replace(href); - } else { - browserHistory.replaceState({ - key: key, - state: state - }, '', href); - recordOperator.addRecord(history.location, location, action); - updateState({ - action: action, - location: location - }); - } - } else { - warning(state !== undefined, 'Browser history cannot push state in browsers that do not support HTML5 history'); - window.location.replace(href); - } - }); - } - return history; -} - -// 获取#前的内容 -function stripHash(path) { - var idx = path.indexOf('#'); - return idx === -1 ? path : path.substring(0, idx); -} - -// 获取#后的内容 -function getHashContent(path) { - var idx = path.indexOf('#'); - return idx === -1 ? '' : path.substring(idx + 1); -} -function createHashHistory() { - var option = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; - var browserHistory = window.history; - var _option$hashType = option.hashType, - hashType = _option$hashType === void 0 ? 'slash' : _option$hashType, - _option$getUserConfir = option.getUserConfirmation, - getUserConfirmation = _option$getUserConfir === void 0 ? getDefaultConfirmation : _option$getUserConfir; - var basename = option.basename ? normalizeSlash(option.basename) : ''; - var pathDecoder = addHeadSlash; - var pathEncoder = hashType === 'slash' ? addHeadSlash : stripHeadSlash; - function getLocation() { - var hashPath = pathDecoder(getHashContent(window.location.hash)); - if (basename) { - hashPath = stripBasename(hashPath, basename); - } - return createLocation('', hashPath, undefined, 'default'); - } - var initLocation = getLocation(); - var memRecords = createMemoryRecord(initLocation, createPath); - var transitionManager = new TransitionManager(); - function createHref(location) { - var tag = document.querySelector('base'); - var base = tag && tag.getAttribute('href') ? stripHash(window.location.href) : ''; - return base + '#' + pathEncoder(basename + createPath(location)); - } - var forceNextPop = false; - var ignorePath = null; - var _getBaseHistory = getBaseHistory(transitionManager, setListener, browserHistory), - go = _getBaseHistory.go, - goBack = _getBaseHistory.goBack, - goForward = _getBaseHistory.goForward, - listen = _getBaseHistory.listen, - block = _getBaseHistory.block, - getUpdateStateFunc = _getBaseHistory.getUpdateStateFunc; - var history = { - action: Action.pop, - length: browserHistory.length, - location: initLocation, - go: go, - goBack: goBack, - goForward: goForward, - push: push, - replace: replace, - listen: listen, - block: block, - createHref: createHref - }; - var updateState = getUpdateStateFunc(history); - function push(to, state) { - warning(state !== undefined, 'Hash history does not support state, it will be ignored'); - var action = Action.push; - var location = createLocation(history.location, to, undefined, ''); - transitionManager.confirmJumpTo(location, action, getUserConfirmation, function (isJump) { - if (!isJump) { - return; - } - var path = createPath(location); - var encodedPath = pathEncoder(basename + path); - // 前后hash不一样才进行跳转 - if (getHashContent(window.location.href) !== encodedPath) { - ignorePath = encodedPath; - window.location.hash = encodedPath; - memRecords.addRecord(history.location, location, action); - updateState({ - action: action, - location: location - }); - } else { - updateState(undefined); - } - }); - } - function replace(to, state) { - warning(state !== undefined, 'Hash history does not support state, it will be ignored'); - var action = Action.replace; - var location = createLocation(history.location, to, undefined, ''); - transitionManager.confirmJumpTo(location, action, getUserConfirmation, function (isJump) { - if (!isJump) { - return; - } - var path = createPath(location); - var encodedPath = pathEncoder(basename + path); - if (getHashContent(window.location.href) !== encodedPath) { - ignorePath = path; - window.location.replace(stripHash(window.location.href) + '#' + encodedPath); - } - memRecords.addRecord(history.location, location, action); - updateState({ - action: action, - location: location - }); - }); - } - function handleHashChange() { - var hashPath = getHashContent(window.location.href); - var encodedPath = pathEncoder(hashPath); - if (hashPath !== encodedPath) { - window.location.replace(stripHash(window.location.href) + '#' + encodedPath); - } else { - var location = getLocation(); - var prevLocation = history.location; - if (!forceNextPop && isLocationEqual(location, prevLocation)) { - return; - } - if (ignorePath === createPath(location)) { - return; - } - ignorePath = null; - handlePopState(location); - } - } - function handlePopState(location) { - if (forceNextPop) { - forceNextPop = false; - updateState(undefined); - } else { - var action = Action.pop; - var callback = function (isJump) { - if (isJump) { - updateState({ - action: action, - location: location - }); - } else { - revertPopState(location); - } - }; - transitionManager.confirmJumpTo(location, action, getUserConfirmation, callback); - } - } - - // 在跳转行为被Block后,用History.go()跳转回之前的页面 - function revertPopState(form) { - var to = history.location; - var delta = memRecords.getDelta(to, form); - if (delta !== 0) { - go(delta); - forceNextPop = true; - } - } - var listenerCount = 0; - function setListener(delta) { - listenerCount += delta; - if (listenerCount === 1 && delta === 1) { - window.addEventListener(EventType.HashChange, handleHashChange); - } else if (listenerCount === 0) { - window.removeEventListener(EventType.HashChange, handleHashChange); - } - } - return history; -} - -function createNamedContext(name, defaultValue) { - var context = createContext(defaultValue); - context.displayName = name; - return context; -} -var RouterContext = createNamedContext('Router', {}); - -var TokenType = /*#__PURE__*/function (TokenType) { - TokenType["Delimiter"] = "delimiter"; - TokenType["Static"] = "static"; - TokenType["Param"] = "param"; - TokenType["WildCard"] = "wildcard"; - TokenType["LBracket"] = "("; - TokenType["RBracket"] = ")"; - TokenType["Pattern"] = "pattern"; - return TokenType; -}({}); - -// 解析URL中的动态参数,以实现TypeScript提示功能 - -/** - * @description 将url中的//转换为/ - */ -function cleanPath(path) { - return path.replace(/\/+/g, '/'); -} -function scoreCompare(score1, score2) { - var score1Length = score1.length; - var score2Length = score2.length; - var end = Math.min(score1Length, score2Length); - for (var i = 0; i < end; i++) { - var delta = score2[i] - score1[i]; - if (delta !== 0) { - return delta; - } - } - if (score1Length === score2Length) { - return 0; - } - return score1Length > score2Length ? -1 : 1; -} - -// 把正则表达式的特殊符号加两个反斜杠进行转义 -function escapeStr(str) { - return str.replace(/([.+*?=^!:${}()[\]|/\\])/g, '\\$1'); -} - -var validChar = /[^/:*()]/; - -// 对Url模板进行词法解析,解析结果为Tokens -function lexer(path) { - var tokens = []; - if (!path) { - return tokens; - } - var urlPath = cleanPath(path); - if (urlPath !== '*' && !urlPath.startsWith('/')) { - throw new Error("Url must start with \"/\"."); - } - var getLiteral = function () { - var name = ''; - while (i < urlPath.length && validChar.test(urlPath[i])) { - name += urlPath[i]; - skipChar(1); - } - return name; - }; - var skipChar = function (step) { - i += step; - }; - var i = 0; - while (i < urlPath.length) { - var curChar = urlPath[i]; - var prevChar = urlPath[i - 1]; - if (curChar === '/') { - tokens.push({ - type: TokenType.Delimiter, - value: urlPath[i] - }); - skipChar(1); - continue; - } - // dynamic params (/:a) - if (prevChar === '/' && curChar === ':') { - skipChar(1); - tokens.push({ - type: TokenType.Param, - value: getLiteral() - }); - continue; - } - // wildCard params (/:*) - if ((prevChar === '/' || prevChar === undefined) && curChar === '*') { - tokens.push({ - type: TokenType.WildCard, - value: urlPath[i] - }); - skipChar(1); - continue; - } - // static params - if (prevChar === '/' && validChar.test(curChar)) { - tokens.push({ - type: TokenType.Static, - value: getLiteral() - }); - continue; - } - if (curChar === '(') { - tokens.push({ - type: TokenType.LBracket, - value: '(' - }); - skipChar(1); - continue; - } - if (curChar === ')') { - tokens.push({ - type: TokenType.RBracket, - value: ')' - }); - skipChar(1); - continue; - } - if (validChar.test(curChar)) { - tokens.push({ - type: TokenType.Pattern, - value: getLiteral() - }); - continue; - } - // 跳过非法字符 - skipChar(1); - } - return tokens; -} - -function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function () {}; return { s: F, n: function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function (e) { throw e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function () { it = it.call(o); }, n: function () { var step = it.next(); normalCompletion = step.done; return step; }, e: function (e) { didErr = true; err = e; }, f: function () { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; } -function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } -function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } - -// 不同类型参数的匹配得分 -var MatchScore = /*#__PURE__*/function (MatchScore) { - MatchScore[MatchScore["static"] = 10] = "static"; - MatchScore[MatchScore["param"] = 6] = "param"; - MatchScore[MatchScore["wildcard"] = 3] = "wildcard"; - MatchScore[MatchScore["placeholder"] = -1] = "placeholder"; - return MatchScore; -}(MatchScore || {}); // 兼容 react v5 matched类型 -var defaultOption = { - // url匹配时是否大小写敏感 - caseSensitive: true, - // 是否严格匹配url结尾的/ - strictMode: false, - // 是否完全精确匹配 - exact: false -}; -// 正则表达式中需要转义的字符 -var REGEX_CHARS_RE = /[.+*?^${}()[\]/\\]/g; -// 用于匹配两个//中的的值 -var BASE_PARAM_PATTERN = '[^/]+'; -var DefaultDelimiter = '/#?'; -function createPathParser(pathname) { - var option = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : defaultOption; - var _option$caseSensitive = option.caseSensitive, - caseSensitive = _option$caseSensitive === void 0 ? defaultOption.caseSensitive : _option$caseSensitive, - _option$strictMode = option.strictMode, - strictMode = _option$strictMode === void 0 ? defaultOption.strictMode : _option$strictMode, - _option$exact = option.exact, - exact = _option$exact === void 0 ? defaultOption.exact : _option$exact; - /** - * URL匹配整体流程 - * 1.词法解析,将URL模板解析为Token - * 2.使用Token生成正则表达式 - * 3.利用正则表达式解析URL中参数或填充URL模板 - */ - var pattern = '^'; - var keys = []; - var scores = []; - var tokens = lexer(pathname); - var onlyHasWildCard = tokens.length === 1 && tokens[0].type === TokenType.WildCard; - var tokenCount = tokens.length; - var lastToken = tokens[tokenCount - 1]; - for (var tokenIdx = 0; tokenIdx < tokenCount; tokenIdx++) { - var token = tokens[tokenIdx]; - var nextToken = tokens[tokenIdx + 1]; - switch (token.type) { - case TokenType.Delimiter: - pattern += '/'; - break; - case TokenType.Static: - pattern += token.value.replace(REGEX_CHARS_RE, '\\$&'); - scores.push(MatchScore.static); - break; - case TokenType.Param: - var paramRegexp = ''; - if (nextToken && nextToken.type === TokenType.LBracket) { - // 跳过当前Token和左括号 - tokenIdx += 2; - while (tokens[tokenIdx].type !== TokenType.RBracket) { - paramRegexp += tokens[tokenIdx].value; - tokenIdx++; - } - } - pattern += paramRegexp ? "((?:" + paramRegexp + "))" : "(" + BASE_PARAM_PATTERN + ")"; - keys.push(token.value); - scores.push(MatchScore.param); - break; - case TokenType.WildCard: - keys.push(token.value); - pattern += "((?:" + BASE_PARAM_PATTERN + ")" + (onlyHasWildCard ? '?' : '') + "(?:/(?:" + BASE_PARAM_PATTERN + "))*)"; - scores.push(onlyHasWildCard ? MatchScore.wildcard : MatchScore.placeholder); - break; - } - } - var isWildCard = lastToken.type === TokenType.WildCard; - if (!isWildCard && !exact) { - if (!strictMode) { - pattern += "(?:[" + escapeStr(DefaultDelimiter) + "](?=$))?"; - } - if (lastToken.type !== TokenType.Delimiter) { - pattern += "(?=[" + escapeStr(DefaultDelimiter) + "]|$)"; - } - } else { - pattern += strictMode ? '$' : "[" + escapeStr(DefaultDelimiter) + "]?$"; - } - var flag = caseSensitive ? '' : 'i'; - var regexp = new RegExp(pattern, flag); - - /** - * @description 根据给定Pattern解析path - */ - function parse(path) { - var reMatch = path.match(regexp); - if (!reMatch) { - return null; - } - var matchedPath = reMatch[0]; - var params = {}; - var parseScore = Array.from(scores); - for (var i = 1; i < reMatch.length; i++) { - var param = reMatch[i]; - var key = keys[i - 1]; - if (key === '*' && param) { - var value = param.split('/'); - if (!Array.isArray(params['*'])) { - params['*'] = value; - } else { - var _params$; - (_params$ = params['*']).push.apply(_params$, value); - } - // 完成通配符参数解析后将placeholder替换为wildcard参数的分值 - parseScore.splice.apply(parseScore, [scores.indexOf(MatchScore.placeholder), 1].concat(new Array(value.length).fill(MatchScore.wildcard))); - } else { - params[key] = param ? param : []; - } - } - var isExact = path === matchedPath; - var url = path === '/' && matchedPath === '' ? '/' : matchedPath; - return { - isExact: isExact, - path: pathname, - url: url, - score: parseScore, - params: params - }; - } - - /** - * @description 使用给定参数填充pattern,得到目标URL - */ - function compile(params) { - var path = ''; - var _iterator = _createForOfIteratorHelper(tokens), - _step; - try { - for (_iterator.s(); !(_step = _iterator.n()).done;) { - var _token = _step.value; - switch (_token.type) { - case TokenType.Static: - path += _token.value; - break; - case TokenType.Param: - if (!params[_token.value]) { - throw new Error('Param is invalid.'); - } - path += params[_token.value]; - break; - case TokenType.WildCard: - var wildCard = params['*']; - if (wildCard instanceof Array) { - path += wildCard.join('/'); - } else { - path += wildCard; - } - break; - case TokenType.Delimiter: - path += _token.value; - break; - } - } - } catch (err) { - _iterator.e(err); - } finally { - _iterator.f(); - } - return path; - } - return { - get regexp() { - return regexp; - }, - get keys() { - return keys; - }, - compile: compile, - parse: parse - }; -} - -/** - * @description 依次使用pathname与pattern进行匹配,根据匹配分数取得分数最高结果 - */ -function matchPath(pathname, pattern, option) { - var patterns = Array.isArray(pattern) ? [].concat(pattern) : [pattern]; - var matchedResults = []; - var _iterator2 = _createForOfIteratorHelper(patterns), - _step2; - try { - for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) { - var item = _step2.value; - var parser = createPathParser(item, option); - var matched = parser.parse(pathname); - if (matched) { - matchedResults.push(matched); - } - } - } catch (err) { - _iterator2.e(err); - } finally { - _iterator2.f(); - } - return !matchedResults.length ? null : matchedResults.sort(function (a, b) { - return scoreCompare(a.score, b.score); - })[0]; -} -function generatePath(path, params) { - var parser = createPathParser(path); - return parser.compile(params); -} - -function useHistory() { - return useContext(RouterContext).history; -} -function useLocation() { - return useContext(RouterContext).location; -} -function useParams() { - var match = useContext(RouterContext).match; - return match ? match.params : {}; -} -function useRouteMatch(path) { - var pathname = useLocation().pathname; - var match = useContext(RouterContext).match; - if (path) { - return matchPath(pathname, path); - } - return match; -} - -function Route(props) { - var context = useContext(RouterContext); - var computed = props.computed, - location = props.location, - path = props.path; - var children = props.children, - component = props.component, - render = props.render; - var match; - var routeLocation = location || context.location; - if (computed) { - match = computed; - } else if (path) { - match = matchPath(routeLocation.pathname, path); - } else { - match = context.match; - } - var newProps = _extends({}, context, { - location: routeLocation, - match: match - }); - if (Array.isArray(children) && Children.count(children) === 0) { - children = null; - } - - /** - * 按顺序获取需要渲染的组件 - * 1.children - * 2.component - * 3.render - * 都没有匹配到返回Null - */ - var getChildren = function () { - // 如果 match 存在 - if (newProps.match) { - if (children) { - if (typeof children === 'function') { - return children(newProps); - } - return children; - } - if (component) { - return createElement(component, newProps); - } else if (render) { - return render(newProps); - } else { - return null; - } - } else { - // match为null - if (typeof children === 'function') { - return children(newProps); - } - return null; - } - }; - return /*#__PURE__*/React.createElement(RouterContext.Provider, { - value: newProps - }, getChildren()); -} - -function Router(props) { - var history = props.history, - _props$children = props.children, - children = _props$children === void 0 ? null : _props$children; - var _useState = useState(props.history.location), - location = _useState[0], - setLocation = _useState[1]; - var pendingLocation = useRef(null); - - // 在Router加载时就监听history地址变化,以保证在始渲染时重定向能正确触发 - var unListen = history.listen(function (arg) { - pendingLocation.current = arg.location; - }); - - // 模拟componentDidMount和componentWillUnmount - useLayoutEffect(function () { - if (unListen) { - unListen(); - } - // 监听history中的位置变化 - unListen = history.listen(function (arg) { - setLocation(arg.location); - }); - if (pendingLocation.current) { - setLocation(pendingLocation.current); - } - return function () { - if (unListen) { - unListen(); - unListen = null; - pendingLocation.current = null; - } - }; - }, []); - var initContextValue = useMemo(function () { - return { - history: history, - location: location, - match: { - isExact: location.pathname === '/', - params: {}, - path: '/', - score: [], - url: '/' - } - }; - }, [location]); - return /*#__PURE__*/React.createElement(RouterContext.Provider, { - value: initContextValue, - children: children - }); -} - -function _objectWithoutPropertiesLoose(source, excluded) { - if (source == null) return {}; - var target = {}; - var sourceKeys = Object.keys(source); - var key, i; - for (i = 0; i < sourceKeys.length; i++) { - key = sourceKeys[i]; - if (excluded.indexOf(key) >= 0) continue; - target[key] = source[key]; - } - return target; -} - -function LifeCycle(props) { - // 使用ref保存上一次的props,防止重新渲染 - var prevProps = useRef(null); - var isMount = useRef(false); - var onMount = props.onMount, - onUpdate = props.onUpdate, - onUnmount = props.onUnmount; - useLayoutEffect(function () { - // 首次挂载 模拟componentDidMount - if (!isMount.current) { - isMount.current = true; - if (onMount) { - onMount(); - } - } else { - // 不是首次渲染 模拟componentDidUpdate - if (onUpdate) { - prevProps.current ? onUpdate(prevProps.current) : onUpdate(); - } - } - prevProps.current = props; - }); - - // 模拟componentWillUnmount - useLayoutEffect(function () { - return function () { - if (onUnmount) { - onUnmount(); - } - }; - }, []); - return null; -} - -var _excluded$2 = ["state"]; -function Redirect(props) { - var to = props.to, - _props$push = props.push, - push = _props$push === void 0 ? false : _props$push, - computed = props.computed; - var context = useContext(RouterContext); - var history = context.history; - var calcLocation = function () { - if (computed) { - if (typeof to === 'string') { - var parser = createPathParser(to); - var target = parser.compile(computed.params); - return parsePath(target); - } else { - var pathname = to.pathname ? addHeadSlash(to.pathname) : '/'; - var _parser = createPathParser(pathname); - var _target = _parser.compile(computed.params); - return _extends({}, to, { - pathname: _target - }); - } - } - return typeof to === 'string' ? parsePath(to) : to; - }; - var navigate = push ? history.push : history.replace; - var _calcLocation = calcLocation(), - state = _calcLocation.state, - path = _objectWithoutPropertiesLoose(_calcLocation, _excluded$2); - var onMountFunc = function () { - navigate(path, state); - }; - var onUpdateFunc = function (prevProps) { - // 如果当前页面与重定向前页面不一致,执行跳转 - var prevPath = prevProps === null || prevProps === void 0 ? void 0 : prevProps.data; - if (!isLocationEqual(prevPath, path)) { - navigate(path, state); - } - }; - return /*#__PURE__*/React.createElement(LifeCycle, { - onMount: onMountFunc, - onUpdate: onUpdateFunc, - data: path - }); -} - -function Switch(props) { - var context = useContext(RouterContext); - var location = props.location || context.location; - var element = null; - var match = null; - - // 使用forEach不会给React.ReactNode增加key属性,防止重新渲染 - Children.forEach(props.children, function (node) { - if (match === null && isValidElement(node)) { - element = node; - var strict; - var sensitive; - var path; - var from; - - // node可能是Route和Redirect - if (node.type === Route) { - var _props = node.props; - strict = _props.strict; - sensitive = _props.sensitive; - path = _props.path; - } else if (node.type === Redirect) { - var _props2 = node.props; - path = _props2.path; - strict = _props2.strict; - from = _props2.from; - } - var exact = node.props.exact; - var target = path || from; - - // 更新匹配状态,一旦匹配到停止遍历 - if (target) { - match = matchPath(location.pathname, target, { - strictMode: strict, - caseSensitive: sensitive, - exact: exact - }); - } else { - match = context.match; - } - } - }); - if (match && element) { - // 使用cloneElement复制已有组件并更新其Props - return cloneElement(element, { - location: location, - computed: match - }); - } - return null; -} - -function Prompt(props) { - var context = useContext(RouterContext); - var message = props.message, - _props$when = props.when, - when = _props$when === void 0 ? true : _props$when; - if (typeof when === 'function' && when(context.location) === false || !when) { - return null; - } - var navigate = context.history.block; - var release = null; - var onMountFunc = function () { - release = message ? navigate(message) : null; - }; - var onUpdateFunc = function (prevProps) { - if (prevProps && prevProps.data !== message) { - if (release) { - release(); - } - release = message ? navigate(message) : null; - } - }; - var onUnmountFunc = function () { - if (release) { - release(); - } - release = null; - }; - return /*#__PURE__*/React.createElement(LifeCycle, { - onMount: onMountFunc, - onUpdate: onUpdateFunc, - onUnmount: onUnmountFunc, - data: message - }); -} - -function withRouter(Component) { - function ComponentWithRouterProp(props) { - var _useContext = useContext(RouterContext), - history = _useContext.history, - location = _useContext.location, - match = _useContext.match; - var routeProps = { - history: history, - location: location, - match: match - }; - return /*#__PURE__*/React.createElement(Component, _extends({}, props, routeProps)); - } - return ComponentWithRouterProp; -} - -function HashRouter(props) { - var historyRef = useRef(); - if (historyRef.current === null || historyRef.current === undefined) { - historyRef.current = createHashHistory({ - basename: props.basename, - getUserConfirmation: props.getUserConfirmation, - hashType: props.hashType - }); - } - return /*#__PURE__*/React.createElement(Router, { - history: historyRef.current - }, props.children); -} - -function BrowserRouter(props) { - // 使用Ref持有History对象,防止重复渲染 - var historyRef = useRef(); - if (historyRef.current === null || historyRef.current === undefined) { - historyRef.current = createBrowserHistory({ - basename: props.basename, - forceRefresh: props.forceRefresh, - getUserConfirmation: props.getUserConfirmation - }); - } - return /*#__PURE__*/React.createElement(Router, { - history: historyRef.current - }, props.children); -} - -var _excluded$1 = ["to", "replace", "component", "onClick", "target"]; -var isModifiedEvent = function (event) { - return event.metaKey || event.altKey || event.ctrlKey || event.shiftKey; -}; -var checkTarget = function (target) { - return !target || target === '_self'; -}; -function Link(props) { - var to = props.to, - replace = props.replace; - props.component; - var onClick = props.onClick, - target = props.target, - other = _objectWithoutPropertiesLoose(props, _excluded$1); - var tag = props.tag || 'a'; - var context = useContext(RouterContext); - var history = context.history; - var location = typeof to === 'function' ? to(context.location) : to; - var state; - var path; - if (typeof location === 'string') { - path = parsePath(location); - } else { - var pathname = location.pathname, - hash = location.hash, - search = location.search; - path = { - pathname: pathname, - hash: hash, - search: search - }; - state = location.state; - } - var href = history.createHref(path); - var linkClickEvent = function (event) { - try { - if (onClick) { - onClick(event); - } - } catch (e) { - event.preventDefault(); - throw e; - } - if (!event.defaultPrevented && event.button === 0 && checkTarget(target) && !isModifiedEvent(event)) { - // 不是相同的路径执行push操作,是相同的路径执行replace - var isSamePath = createPath(context.location) === createPath(path); - var navigate = replace || isSamePath ? history.replace : history.push; - event.preventDefault(); - navigate(path, state); - } - }; - var linkProps = _extends({ - href: href, - onClick: linkClickEvent - }, other); - return React.createElement(tag, linkProps); -} - -var _excluded = ["to", "isActive"]; -function NavLink(props) { - var to = props.to, - isActive = props.isActive, - rest = _objectWithoutPropertiesLoose(props, _excluded); - var context = useContext(RouterContext); - var toLocation = typeof to === 'function' ? to(context.location) : to; - var _ref = typeof toLocation === 'string' ? parsePath(toLocation) : toLocation, - path = _ref.pathname; - // 把正则表达式的特殊符号加两个反斜杠进行转义 - var escapedPath = path ? escapeStr(path) : ''; - var match = escapedPath ? matchPath(context.location.pathname, escapedPath) : null; - var isLinkActive = match && isActive ? isActive(match, context.location) : false; - var page = 'page'; - var otherProps = _extends({ - 'aria-current': isLinkActive ? page : false - }, rest); - return /*#__PURE__*/React.createElement(Link, _extends({ - to: to - }, otherProps)); -} - -export { BrowserRouter, HashRouter, Link, NavLink, Prompt, Redirect, Route, Router, Switch, RouterContext as __RouterContext, createBrowserHistory, createHashHistory, generatePath, matchPath, useHistory, useLocation, useParams, useRouteMatch, withRouter }; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGVyLmpzIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaGlzdG9yeS9kb20udHMiLCIuLi8uLi9zcmMvaGlzdG9yeS90eXBlcy50cyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzLmpzIiwiLi4vLi4vc3JjL2hpc3RvcnkvdXRpbHMudHMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY2xhc3NDYWxsQ2hlY2suanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdHlwZW9mLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvUHJpbWl0aXZlLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvUHJvcGVydHlLZXkuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY3JlYXRlQ2xhc3MuanMiLCIuLi8uLi9zcmMvaGlzdG9yeS90cmFuc2l0aW9uTWFuYWdlci50cyIsIi4uLy4uL3NyYy9oaXN0b3J5L3dhcmluZy50cyIsIi4uLy4uL3NyYy9oaXN0b3J5L2Jhc2VIaXN0b3J5LnRzIiwiLi4vLi4vc3JjL2hpc3RvcnkvYnJvd2VySGlzdG9yeS50cyIsIi4uLy4uL3NyYy9oaXN0b3J5L2hhc2hIaXN0b3J5LnRzIiwiLi4vLi4vc3JjL3JvdXRlci9jb250ZXh0LnRzeCIsIi4uLy4uL3NyYy9yb3V0ZXIvbWF0Y2hlci90eXBlcy50cyIsIi4uLy4uL3NyYy9yb3V0ZXIvbWF0Y2hlci91dGlscy50cyIsIi4uLy4uL3NyYy9yb3V0ZXIvbWF0Y2hlci9sZXhlci50cyIsIi4uLy4uL3NyYy9yb3V0ZXIvbWF0Y2hlci9wYXJzZXIudHMiLCIuLi8uLi9zcmMvcm91dGVyL2hvb2tzLnRzIiwiLi4vLi4vc3JjL3JvdXRlci9Sb3V0ZS50c3giLCIuLi8uLi9zcmMvcm91dGVyL1JvdXRlci50c3giLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZS5qcyIsIi4uLy4uL3NyYy9yb3V0ZXIvbGlmZUN5Y2xlSG9vay50cyIsIi4uLy4uL3NyYy9yb3V0ZXIvUmVkaXJlY3QudHN4IiwiLi4vLi4vc3JjL3JvdXRlci9Td2l0Y2gudHN4IiwiLi4vLi4vc3JjL3JvdXRlci9Qcm9tcHQudHN4IiwiLi4vLi4vc3JjL3JvdXRlci93aXRoUm91dGVyLnRzeCIsIi4uLy4uL3NyYy9yb3V0ZXIvSGFzaFJvdXRlci50c3giLCIuLi8uLi9zcmMvcm91dGVyL0Jyb3dzZXJSb3V0ZXIudHN4IiwiLi4vLi4vc3JjL3JvdXRlci9MaW5rLnRzeCIsIi4uLy4uL3NyYy9yb3V0ZXIvTmF2TGluay50c3giXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGZ1bmN0aW9uIGlzQnJvd3NlcigpOiBib29sZWFuIHtcclxuICByZXR1cm4gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LmRvY3VtZW50ICYmIHR5cGVvZiB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCA9PT0gJ2Z1bmN0aW9uJztcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldERlZmF1bHRDb25maXJtYXRpb24obWVzc2FnZTogc3RyaW5nLCBjYWxsQmFjazogKHJlc3VsdDogYm9vbGVhbikgPT4gdm9pZCkge1xyXG4gIGNhbGxCYWNrKHdpbmRvdy5jb25maXJtKG1lc3NhZ2UpKTtcclxufVxyXG5cclxuLy8g5Yik5pat5rWP6KeI5Zmo5piv5ZCm5pSv5oyBcHVzaFN0YXRl5pa55rOV77yMcHVzaFN0YXRl5pivYnJvd3Nlckhpc3Rvcnnlrp7njrDnmoTln7rnoYBcclxuZXhwb3J0IGZ1bmN0aW9uIGlzU3VwcG9ydEhpc3RvcnkoKTogYm9vbGVhbiB7XHJcbiAgcmV0dXJuIGlzQnJvd3NlcigpICYmIHdpbmRvdy5oaXN0b3J5ICYmICdwdXNoU3RhdGUnIGluIHdpbmRvdy5oaXN0b3J5O1xyXG59XHJcblxyXG4vLyDliKTmlq3mtY/op4jlmajmmK/lkKbmlK/mjIFQb3BTdGF0ZeS6i+S7tlxyXG5leHBvcnQgZnVuY3Rpb24gaXNTdXBwb3J0c1BvcFN0YXRlKCk6IGJvb2xlYW4ge1xyXG4gIHJldHVybiB3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdUcmlkZW50JykgPT09IC0xO1xyXG59XHJcbiIsImV4cG9ydCB0eXBlIEJhc2VPcHRpb24gPSB7XHJcbiAgYmFzZW5hbWU/OiBzdHJpbmc7XHJcbiAgZ2V0VXNlckNvbmZpcm1hdGlvbj86IENvbmZpcm1hdGlvbkZ1bmM7XHJcbn07XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEhpc3RvcnlQcm9wczxUID0gdW5rbm93bj4ge1xyXG4gIHJlYWRvbmx5IGFjdGlvbjogQWN0aW9uO1xyXG5cclxuICByZWFkb25seSBsb2NhdGlvbjogTG9jYXRpb248VD47XHJcblxyXG4gIGxlbmd0aDogbnVtYmVyO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEhpc3Rvcnk8VCA9IHVua25vd24+IGV4dGVuZHMgSGlzdG9yeVByb3BzPFQ+IHtcclxuICBjcmVhdGVIcmVmKHBhdGg6IFBhcnRpYWw8UGF0aD4pOiBzdHJpbmc7XHJcblxyXG4gIHB1c2godG86IFRvLCBzdGF0ZT86IFQpOiB2b2lkO1xyXG5cclxuICByZXBsYWNlKHRvOiBUbywgc3RhdGU/OiBUKTogdm9pZDtcclxuXHJcbiAgbGlzdGVuKGxpc3RlbmVyOiBMaXN0ZW5lcjxUPik6ICgpID0+IHZvaWQ7XHJcblxyXG4gIGJsb2NrKHByb21wdDogUHJvbXB0PFQ+KTogKCkgPT4gdm9pZDtcclxuXHJcbiAgZ28oaW5kZXg6IG51bWJlcik6IHZvaWQ7XHJcblxyXG4gIGdvQmFjaygpOiB2b2lkO1xyXG5cclxuICBnb0ZvcndhcmQoKTogdm9pZDtcclxufVxyXG5cclxuZXhwb3J0IGVudW0gQWN0aW9uIHtcclxuICBwb3AgPSAnUE9QJyxcclxuICBwdXNoID0gJ1BVU0gnLFxyXG4gIHJlcGxhY2UgPSAnUkVQTEFDRScsXHJcbn1cclxuXHJcbmV4cG9ydCBlbnVtIEV2ZW50VHlwZSB7XHJcbiAgUG9wU3RhdGUgPSAncG9wc3RhdGUnLFxyXG4gIEhhc2hDaGFuZ2UgPSAnaGFzaGNoYW5nZScsXHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIFBhdGggPSB7XHJcbiAgcGF0aG5hbWU6IHN0cmluZztcclxuXHJcbiAgc2VhcmNoOiBzdHJpbmc7XHJcblxyXG4gIGhhc2g6IHN0cmluZztcclxufTtcclxuXHJcbmV4cG9ydCB0eXBlIEhpc3RvcnlTdGF0ZTxUPiA9IHtcclxuICBzdGF0ZT86IFQ7XHJcblxyXG4gIGtleTogc3RyaW5nO1xyXG59O1xyXG5cclxuZXhwb3J0IHR5cGUgRGVmYXVsdFN0YXRlVHlwZSA9IHVua25vd247XHJcblxyXG5leHBvcnQgdHlwZSBMb2NhdGlvbjxUID0gdW5rbm93bj4gPSBQYXRoICYgSGlzdG9yeVN0YXRlPFQ+O1xyXG5cclxuZXhwb3J0IHR5cGUgVG8gPSBzdHJpbmcgfCBQYXJ0aWFsPFBhdGg+O1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBMaXN0ZW5lcjxUID0gdW5rbm93bj4ge1xyXG4gIChuYXZpZ2F0aW9uOiBOYXZpZ2F0aW9uPFQ+KTogdm9pZDtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBOYXZpZ2F0aW9uPFQgPSB1bmtub3duPiB7XHJcbiAgYWN0aW9uOiBBY3Rpb247XHJcblxyXG4gIGxvY2F0aW9uOiBMb2NhdGlvbjxUPjtcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgUHJvbXB0PFM+ID0gc3RyaW5nIHwgYm9vbGVhbiB8IG51bGwgfCAoKGxvY2F0aW9uOiBMb2NhdGlvbjxTPiwgYWN0aW9uOiBBY3Rpb24pID0+IHZvaWQpO1xyXG5cclxuZXhwb3J0IHR5cGUgQ2FsbEJhY2tGdW5jID0gKGlzSnVtcDogYm9vbGVhbikgPT4gdm9pZDtcclxuXHJcbmV4cG9ydCB0eXBlIENvbmZpcm1hdGlvbkZ1bmMgPSAobWVzc2FnZTogc3RyaW5nLCBjYWxsQmFjazogQ2FsbEJhY2tGdW5jKSA9PiB2b2lkO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBUTWFuYWdlcjxTPiB7XHJcbiAgc2V0UHJvbXB0KG5leHQ6IFByb21wdDxTPik6ICgpID0+IHZvaWQ7XHJcblxyXG4gIGFkZExpc3RlbmVyKGZ1bmM6IChuYXZpZ2F0aW9uOiBOYXZpZ2F0aW9uPFM+KSA9PiB2b2lkKTogKCkgPT4gdm9pZDtcclxuXHJcbiAgbm90aWZ5TGlzdGVuZXJzKGFyZ3M6IE5hdmlnYXRpb248Uz4pOiB2b2lkO1xyXG5cclxuICBjb25maXJtSnVtcFRvKFxyXG4gICAgbG9jYXRpb246IExvY2F0aW9uPFM+LFxyXG4gICAgYWN0aW9uOiBBY3Rpb24sXHJcbiAgICB1c2VyQ29uZmlybWF0aW9uRnVuYzogQ29uZmlybWF0aW9uRnVuYyxcclxuICAgIGNhbGxCYWNrOiBDYWxsQmFja0Z1bmMsXHJcbiAgKTogdm9pZDtcclxufVxyXG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfZXh0ZW5kcygpIHtcbiAgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduID8gT2JqZWN0LmFzc2lnbi5iaW5kKCkgOiBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07XG4gICAgICBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7XG4gICAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9O1xuICByZXR1cm4gX2V4dGVuZHMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn0iLCJpbXBvcnQgeyBBY3Rpb24sIExvY2F0aW9uLCBQYXRoLCBUbyB9IGZyb20gJy4vdHlwZXMnO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVBhdGgocGF0aDogUGFydGlhbDxQYXRoPik6IHN0cmluZyB7XHJcbiAgY29uc3QgeyBzZWFyY2gsIGhhc2ggfSA9IHBhdGg7XHJcbiAgbGV0IHBhdGhuYW1lID0gcGF0aC5wYXRobmFtZSB8fCAnLyc7XHJcbiAgaWYgKHNlYXJjaCAmJiBzZWFyY2ggIT09ICc/Jykge1xyXG4gICAgcGF0aG5hbWUgKz0gc2VhcmNoLnN0YXJ0c1dpdGgoJz8nKSA/IHNlYXJjaCA6ICc/JyArIHNlYXJjaDtcclxuICB9XHJcbiAgaWYgKGhhc2ggJiYgaGFzaCAhPT0gJyMnKSB7XHJcbiAgICBwYXRobmFtZSArPSBoYXNoLnN0YXJ0c1dpdGgoJyMnKSA/IGhhc2ggOiAnIycgKyBoYXNoO1xyXG4gIH1cclxuICByZXR1cm4gcGF0aG5hbWU7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVBhdGgodXJsOiBzdHJpbmcpOiBQYXJ0aWFsPFBhdGg+IHtcclxuICBpZiAoIXVybCkge1xyXG4gICAgcmV0dXJuIHt9O1xyXG4gIH1cclxuICBsZXQgcGFyc2VkUGF0aDogUGFydGlhbDxQYXRoPiA9IHt9O1xyXG5cclxuICBsZXQgaGFzaElkeCA9IHVybC5pbmRleE9mKCcjJyk7XHJcbiAgaWYgKGhhc2hJZHggPiAtMSkge1xyXG4gICAgcGFyc2VkUGF0aC5oYXNoID0gdXJsLnN1YnN0cmluZyhoYXNoSWR4KTtcclxuICAgIHVybCA9IHVybC5zdWJzdHJpbmcoMCwgaGFzaElkeCk7XHJcbiAgfVxyXG5cclxuICBsZXQgc2VhcmNoSWR4ID0gdXJsLmluZGV4T2YoJz8nKTtcclxuICBpZiAoc2VhcmNoSWR4ID4gLTEpIHtcclxuICAgIHBhcnNlZFBhdGguc2VhcmNoID0gdXJsLnN1YnN0cmluZyhzZWFyY2hJZHgpO1xyXG4gICAgdXJsID0gdXJsLnN1YnN0cmluZygwLCBzZWFyY2hJZHgpO1xyXG4gIH1cclxuICBpZiAodXJsKSB7XHJcbiAgICBwYXJzZWRQYXRoLnBhdGhuYW1lID0gdXJsO1xyXG4gIH1cclxuICByZXR1cm4gcGFyc2VkUGF0aDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUxvY2F0aW9uPFM+KGN1cnJlbnQ6IHN0cmluZyB8IExvY2F0aW9uLCB0bzogVG8sIHN0YXRlPzogUywga2V5Pzogc3RyaW5nKTogUmVhZG9ubHk8TG9jYXRpb248Uz4+IHtcclxuICBsZXQgcGF0aG5hbWUgPSB0eXBlb2YgY3VycmVudCA9PT0gJ3N0cmluZycgPyBjdXJyZW50IDogY3VycmVudC5wYXRobmFtZTtcclxuICBsZXQgdXJsT2JqID0gdHlwZW9mIHRvID09PSAnc3RyaW5nJyA/IHBhcnNlUGF0aCh0bykgOiB0bztcclxuICAvLyDpmo/mnLprZXnplb/luqblj5Y2XHJcbiAgY29uc3QgZ2V0UmFuZEtleSA9IGdlblJhbmRvbUtleSg2KTtcclxuICBjb25zdCBsb2NhdGlvbiA9IHtcclxuICAgIHBhdGhuYW1lOiBwYXRobmFtZSxcclxuICAgIHNlYXJjaDogJycsXHJcbiAgICBoYXNoOiAnJyxcclxuICAgIHN0YXRlOiBzdGF0ZSxcclxuICAgIGtleTogdHlwZW9mIGtleSA9PT0gJ3N0cmluZycgPyBrZXkgOiBnZXRSYW5kS2V5KCksXHJcbiAgICAuLi51cmxPYmosXHJcbiAgfTtcclxuICBpZiAoIWxvY2F0aW9uLnBhdGhuYW1lKSB7XHJcbiAgICBsb2NhdGlvbi5wYXRobmFtZSA9ICcvJztcclxuICB9XHJcbiAgcmV0dXJuIGxvY2F0aW9uO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXNMb2NhdGlvbkVxdWFsKHAxOiBQYXJ0aWFsPFBhdGg+LCBwMjogUGFydGlhbDxQYXRoPikge1xyXG4gIHJldHVybiBwMS5wYXRobmFtZSA9PT0gcDIucGF0aG5hbWUgJiYgcDEuc2VhcmNoID09PSBwMi5zZWFyY2ggJiYgcDEuaGFzaCA9PT0gcDIuaGFzaDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGFkZEhlYWRTbGFzaChwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gIGlmIChwYXRoWzBdID09PSAnLycpIHtcclxuICAgIHJldHVybiBwYXRoO1xyXG4gIH1cclxuICByZXR1cm4gJy8nICsgcGF0aDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHN0cmlwSGVhZFNsYXNoKHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgaWYgKHBhdGhbMF0gPT09ICcvJykge1xyXG4gICAgcmV0dXJuIHBhdGguc3Vic3RyaW5nKDEpO1xyXG4gIH1cclxuICByZXR1cm4gcGF0aDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVNsYXNoKHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgY29uc3QgdGVtcFBhdGggPSBhZGRIZWFkU2xhc2gocGF0aCk7XHJcbiAgaWYgKHRlbXBQYXRoW3RlbXBQYXRoLmxlbmd0aCAtIDFdID09PSAnLycpIHtcclxuICAgIHJldHVybiB0ZW1wUGF0aC5zdWJzdHJpbmcoMCwgdGVtcFBhdGgubGVuZ3RoIC0gMSk7XHJcbiAgfVxyXG4gIHJldHVybiB0ZW1wUGF0aDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGhhc0Jhc2VuYW1lKHBhdGg6IHN0cmluZywgcHJlZml4OiBzdHJpbmcpOiBCb29sZWFuIHtcclxuICByZXR1cm4gKFxyXG4gICAgcGF0aC50b0xvd2VyQ2FzZSgpLmluZGV4T2YocHJlZml4LnRvTG93ZXJDYXNlKCkpID09PSAwICYmIFsnLycsICc/JywgJyMnLCAnJ10uaW5jbHVkZXMocGF0aC5jaGFyQXQocHJlZml4Lmxlbmd0aCkpXHJcbiAgKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHN0cmlwQmFzZW5hbWUocGF0aDogc3RyaW5nLCBwcmVmaXg6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgcmV0dXJuIGhhc0Jhc2VuYW1lKHBhdGgsIHByZWZpeCkgPyBwYXRoLnN1YnN0cmluZyhwcmVmaXgubGVuZ3RoKSA6IHBhdGg7XHJcbn1cclxuXHJcbi8vIOS9v+eUqOmaj+acuueUn+aIkOeahEtleeiusOW9leiiq+iuv+mXrui/h+eahFVSTO+8jOW9k0Jsb2Nr6KKr6KKr6Kem5Y+R5pe25Yip55SoZGVsdGHlgLzot7PovazliLDkuYvliY3nmoTpobXpnaJcclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1lbW9yeVJlY29yZDxULCBTPihpbml0VmFsOiBTLCBmbjogKGFyZzogUykgPT4gVCkge1xyXG4gIGxldCB2aXNpdGVkUmVjb3JkOiBUW10gPSBbZm4oaW5pdFZhbCldO1xyXG5cclxuICBmdW5jdGlvbiBnZXREZWx0YSh0bzogUywgZm9ybTogUyk6IG51bWJlciB7XHJcbiAgICBsZXQgdG9JZHggPSB2aXNpdGVkUmVjb3JkLmxhc3RJbmRleE9mKGZuKHRvKSk7XHJcbiAgICBpZiAodG9JZHggPT09IC0xKSB7XHJcbiAgICAgIHRvSWR4ID0gMDtcclxuICAgIH1cclxuICAgIGxldCBmcm9tSWR4ID0gdmlzaXRlZFJlY29yZC5sYXN0SW5kZXhPZihmbihmb3JtKSk7XHJcbiAgICBpZiAoZnJvbUlkeCA9PT0gLTEpIHtcclxuICAgICAgZnJvbUlkeCA9IDA7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdG9JZHggLSBmcm9tSWR4O1xyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gYWRkUmVjb3JkKGN1cnJlbnQ6IFMsIG5ld1JlY29yZDogUywgYWN0aW9uOiBBY3Rpb24pIHtcclxuICAgIGNvbnN0IGN1clZhbCA9IGZuKGN1cnJlbnQpO1xyXG4gICAgY29uc3QgTmV3VmFsID0gZm4obmV3UmVjb3JkKTtcclxuICAgIGlmIChhY3Rpb24gPT09IEFjdGlvbi5wdXNoKSB7XHJcbiAgICAgIGNvbnN0IHByZXZJZHggPSB2aXNpdGVkUmVjb3JkLmxhc3RJbmRleE9mKGN1clZhbCk7XHJcbiAgICAgIGNvbnN0IG5ld1Zpc2l0ZWRSZWNvcmQgPSB2aXNpdGVkUmVjb3JkLnNsaWNlKDAsIHByZXZJZHggKyAxKTtcclxuICAgICAgbmV3VmlzaXRlZFJlY29yZC5wdXNoKE5ld1ZhbCk7XHJcbiAgICAgIHZpc2l0ZWRSZWNvcmQgPSBuZXdWaXNpdGVkUmVjb3JkO1xyXG4gICAgfVxyXG4gICAgaWYgKGFjdGlvbiA9PT0gQWN0aW9uLnJlcGxhY2UpIHtcclxuICAgICAgY29uc3QgcHJldklkeCA9IHZpc2l0ZWRSZWNvcmQubGFzdEluZGV4T2YoY3VyVmFsKTtcclxuICAgICAgaWYgKHByZXZJZHggIT09IC0xKSB7XHJcbiAgICAgICAgdmlzaXRlZFJlY29yZFtwcmV2SWR4XSA9IE5ld1ZhbDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHsgZ2V0RGVsdGEsIGFkZFJlY29yZCB9O1xyXG59XHJcblxyXG5mdW5jdGlvbiBnZW5SYW5kb21LZXkobGVuZ3RoOiBudW1iZXIpOiAoKSA9PiBzdHJpbmcge1xyXG4gIGNvbnN0IGVuZCA9IGxlbmd0aCArIDI7XHJcbiAgcmV0dXJuICgpID0+IHtcclxuICAgIHJldHVybiBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDE4KS5zdWJzdHJpbmcoMiwgZW5kKTtcclxuICB9O1xyXG59XHJcbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHtcbiAgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpO1xuICB9XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX3R5cGVvZihvYmopIHtcbiAgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiO1xuXG4gIHJldHVybiBfdHlwZW9mID0gXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgXCJzeW1ib2xcIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKG9iaikge1xuICAgIHJldHVybiB0eXBlb2Ygb2JqO1xuICB9IDogZnVuY3Rpb24gKG9iaikge1xuICAgIHJldHVybiBvYmogJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7XG4gIH0sIF90eXBlb2Yob2JqKTtcbn0iLCJpbXBvcnQgX3R5cGVvZiBmcm9tIFwiLi90eXBlb2YuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF90b1ByaW1pdGl2ZShpbnB1dCwgaGludCkge1xuICBpZiAoX3R5cGVvZihpbnB1dCkgIT09IFwib2JqZWN0XCIgfHwgaW5wdXQgPT09IG51bGwpIHJldHVybiBpbnB1dDtcbiAgdmFyIHByaW0gPSBpbnB1dFtTeW1ib2wudG9QcmltaXRpdmVdO1xuICBpZiAocHJpbSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdmFyIHJlcyA9IHByaW0uY2FsbChpbnB1dCwgaGludCB8fCBcImRlZmF1bHRcIik7XG4gICAgaWYgKF90eXBlb2YocmVzKSAhPT0gXCJvYmplY3RcIikgcmV0dXJuIHJlcztcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQEB0b1ByaW1pdGl2ZSBtdXN0IHJldHVybiBhIHByaW1pdGl2ZSB2YWx1ZS5cIik7XG4gIH1cbiAgcmV0dXJuIChoaW50ID09PSBcInN0cmluZ1wiID8gU3RyaW5nIDogTnVtYmVyKShpbnB1dCk7XG59IiwiaW1wb3J0IF90eXBlb2YgZnJvbSBcIi4vdHlwZW9mLmpzXCI7XG5pbXBvcnQgdG9QcmltaXRpdmUgZnJvbSBcIi4vdG9QcmltaXRpdmUuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF90b1Byb3BlcnR5S2V5KGFyZykge1xuICB2YXIga2V5ID0gdG9QcmltaXRpdmUoYXJnLCBcInN0cmluZ1wiKTtcbiAgcmV0dXJuIF90eXBlb2Yoa2V5KSA9PT0gXCJzeW1ib2xcIiA/IGtleSA6IFN0cmluZyhrZXkpO1xufSIsImltcG9ydCB0b1Byb3BlcnR5S2V5IGZyb20gXCIuL3RvUHJvcGVydHlLZXkuanNcIjtcbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07XG4gICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlO1xuICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTtcbiAgICBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHRvUHJvcGVydHlLZXkoZGVzY3JpcHRvci5rZXkpLCBkZXNjcmlwdG9yKTtcbiAgfVxufVxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykge1xuICBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTtcbiAgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29uc3RydWN0b3IsIFwicHJvdG90eXBlXCIsIHtcbiAgICB3cml0YWJsZTogZmFsc2VcbiAgfSk7XG4gIHJldHVybiBDb25zdHJ1Y3Rvcjtcbn0iLCJpbXBvcnQgeyBBY3Rpb24sIENhbGxCYWNrRnVuYywgQ29uZmlybWF0aW9uRnVuYywgTGlzdGVuZXIsIExvY2F0aW9uLCBOYXZpZ2F0aW9uLCBQcm9tcHQsIFRNYW5hZ2VyIH0gZnJvbSAnLi90eXBlcyc7XHJcblxyXG5jbGFzcyBUcmFuc2l0aW9uTWFuYWdlcjxTPiBpbXBsZW1lbnRzIFRNYW5hZ2VyPFM+IHtcclxuICBwcml2YXRlIHByb21wdDogUHJvbXB0PFM+O1xyXG4gIHByaXZhdGUgbGlzdGVuZXJzOiBMaXN0ZW5lcjxTPltdO1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIHRoaXMucHJvbXB0ID0gbnVsbDtcclxuICAgIHRoaXMubGlzdGVuZXJzID0gW107XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0UHJvbXB0KHByb21wdDogUHJvbXB0PFM+KTogKCkgPT4gdm9pZCB7XHJcbiAgICB0aGlzLnByb21wdCA9IHByb21wdDtcclxuXHJcbiAgICAvLyDmuIXpmaRQcm9tcHRcclxuICAgIHJldHVybiAoKSA9PiB7XHJcbiAgICAgIGlmICh0aGlzLnByb21wdCA9PT0gcHJvbXB0KSB7XHJcbiAgICAgICAgdGhpcy5wcm9tcHQgPSBudWxsO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLy8g5L2/55So5Y+R5biD6K6i6ZiF5qih5byP566h55CGaGlzdG9yeeeahOebkeWQrOiAhVxyXG4gIHB1YmxpYyBhZGRMaXN0ZW5lcihmdW5jOiBMaXN0ZW5lcjxTPik6ICgpID0+IHZvaWQge1xyXG4gICAgbGV0IGlzQWN0aXZlID0gdHJ1ZTtcclxuICAgIGNvbnN0IGxpc3RlbmVyID0gKGFyZ3M6IE5hdmlnYXRpb248Uz4pID0+IHtcclxuICAgICAgaWYgKGlzQWN0aXZlKSB7XHJcbiAgICAgICAgZnVuYyhhcmdzKTtcclxuICAgICAgfVxyXG4gICAgfTtcclxuICAgIHRoaXMubGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xyXG4gICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgaXNBY3RpdmUgPSBmYWxzZTtcclxuICAgICAgLy8g56e76Zmk5a+55bqU55qE55uR5ZCs6ICFXHJcbiAgICAgIHRoaXMubGlzdGVuZXJzID0gdGhpcy5saXN0ZW5lcnMuZmlsdGVyKGl0ZW0gPT4gaXRlbSAhPT0gbGlzdGVuZXIpO1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBub3RpZnlMaXN0ZW5lcnMoYXJnczogTmF2aWdhdGlvbjxTPikge1xyXG4gICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiB0aGlzLmxpc3RlbmVycykge1xyXG4gICAgICBsaXN0ZW5lcihhcmdzKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBjb25maXJtSnVtcFRvKFxyXG4gICAgbG9jYXRpb246IExvY2F0aW9uPFM+LFxyXG4gICAgYWN0aW9uOiBBY3Rpb24sXHJcbiAgICB1c2VyQ29uZmlybWF0aW9uRnVuYzogQ29uZmlybWF0aW9uRnVuYyxcclxuICAgIGNhbGxCYWNrOiBDYWxsQmFja0Z1bmNcclxuICApIHtcclxuICAgIGlmICh0aGlzLnByb21wdCAhPT0gbnVsbCkge1xyXG4gICAgICBjb25zdCByZXN1bHQgPSB0eXBlb2YgdGhpcy5wcm9tcHQgPT09ICdmdW5jdGlvbicgPyB0aGlzLnByb21wdChsb2NhdGlvbiwgYWN0aW9uKSA6IHRoaXMucHJvbXB0O1xyXG4gICAgICBpZiAodHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICB0eXBlb2YgdXNlckNvbmZpcm1hdGlvbkZ1bmMgPT09ICdmdW5jdGlvbicgPyB1c2VyQ29uZmlybWF0aW9uRnVuYyhyZXN1bHQsIGNhbGxCYWNrKSA6IGNhbGxCYWNrKHRydWUpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNhbGxCYWNrKHJlc3VsdCAhPT0gZmFsc2UpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjYWxsQmFjayh0cnVlKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFRyYW5zaXRpb25NYW5hZ2VyO1xyXG4iLCJmdW5jdGlvbiB3YXJuaW5nKGNvbmRpdGlvbjogYW55LCBtZXNzYWdlOiBzdHJpbmcpIHtcclxuICBpZiAoY29uZGl0aW9uKSB7XHJcbiAgICBpZiAoY29uc29sZSAmJiB0eXBlb2YgY29uc29sZS53YXJuID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihtZXNzYWdlKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IHdhcm5pbmc7IiwiaW1wb3J0IHsgSGlzdG9yeVByb3BzLCBMaXN0ZW5lciwgTmF2aWdhdGlvbiwgUHJvbXB0IH0gZnJvbSAnLi90eXBlcyc7XHJcbmltcG9ydCB0cmFuc2l0aW9uTWFuYWdlciBmcm9tICcuL3RyYW5zaXRpb25NYW5hZ2VyJztcclxuXHJcbi8vIOaKveWPlkJyb3dzZXJIaXN0b3J55ZKMSGFzaEhpc3RvcnnkuK3nm7jlkIznmoTmlrnms5VcclxuZXhwb3J0IGZ1bmN0aW9uIGdldEJhc2VIaXN0b3J5PFM+KFxyXG4gIHRyYW5zaXRpb25NYW5hZ2VyOiB0cmFuc2l0aW9uTWFuYWdlcjxTPixcclxuICBzZXRMaXN0ZW5lcjogKGRlbHRhOiBudW1iZXIpID0+IHZvaWQsXHJcbiAgYnJvd3Nlckhpc3Rvcnk6IEhpc3RvcnksXHJcbikge1xyXG4gIGZ1bmN0aW9uIGdvKHN0ZXA6IG51bWJlcikge1xyXG4gICAgYnJvd3Nlckhpc3RvcnkuZ28oc3RlcCk7XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiBnb0JhY2soKSB7XHJcbiAgICBicm93c2VySGlzdG9yeS5nbygtMSk7XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiBnb0ZvcndhcmQoKSB7XHJcbiAgICBicm93c2VySGlzdG9yeS5nbygxKTtcclxuICB9XHJcblxyXG4gIGZ1bmN0aW9uIGxpc3RlbihsaXN0ZW5lcjogTGlzdGVuZXI8Uz4pOiAoKSA9PiB2b2lkIHtcclxuICAgIGNvbnN0IGNhbmNlbCA9IHRyYW5zaXRpb25NYW5hZ2VyLmFkZExpc3RlbmVyKGxpc3RlbmVyKTtcclxuICAgIHNldExpc3RlbmVyKDEpO1xyXG4gICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgc2V0TGlzdGVuZXIoLTEpO1xyXG4gICAgICBjYW5jZWwoKTtcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBsZXQgaXNCbG9ja2VkID0gZmFsc2U7XHJcblxyXG4gIGZ1bmN0aW9uIGJsb2NrKHByb21wdDogUHJvbXB0PFM+ID0gZmFsc2UpOiAoKSA9PiB2b2lkIHtcclxuICAgIGNvbnN0IHVuYmxvY2sgPSB0cmFuc2l0aW9uTWFuYWdlci5zZXRQcm9tcHQocHJvbXB0KTtcclxuICAgIGlmICghaXNCbG9ja2VkKSB7XHJcbiAgICAgIHNldExpc3RlbmVyKDEpO1xyXG4gICAgICBpc0Jsb2NrZWQgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgaWYgKGlzQmxvY2tlZCkge1xyXG4gICAgICAgIGlzQmxvY2tlZCA9IGZhbHNlO1xyXG4gICAgICAgIHNldExpc3RlbmVyKC0xKTtcclxuICAgICAgfVxyXG4gICAgICB1bmJsb2NrKCk7XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gZ2V0VXBkYXRlU3RhdGVGdW5jKGhpc3RvcnlQcm9wczogSGlzdG9yeVByb3BzPFM+KSB7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKG5leHRTdGF0ZTogTmF2aWdhdGlvbjxTPiB8IHVuZGVmaW5lZCkge1xyXG4gICAgICBpZiAobmV4dFN0YXRlKSB7XHJcbiAgICAgICAgT2JqZWN0LmFzc2lnbihoaXN0b3J5UHJvcHMsIG5leHRTdGF0ZSk7XHJcbiAgICAgIH1cclxuICAgICAgaGlzdG9yeVByb3BzLmxlbmd0aCA9IGJyb3dzZXJIaXN0b3J5Lmxlbmd0aDtcclxuICAgICAgY29uc3QgYXJncyA9IHsgbG9jYXRpb246IGhpc3RvcnlQcm9wcy5sb2NhdGlvbiwgYWN0aW9uOiBoaXN0b3J5UHJvcHMuYWN0aW9uIH07XHJcbiAgICAgIHRyYW5zaXRpb25NYW5hZ2VyLm5vdGlmeUxpc3RlbmVycyhhcmdzKTtcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICByZXR1cm4geyBnbywgZ29CYWNrLCBnb0ZvcndhcmQsIGxpc3RlbiwgYmxvY2ssIGdldFVwZGF0ZVN0YXRlRnVuYyB9O1xyXG59XHJcbiIsImltcG9ydCB7IGdldERlZmF1bHRDb25maXJtYXRpb24sIGlzU3VwcG9ydEhpc3RvcnksIGlzU3VwcG9ydHNQb3BTdGF0ZSB9IGZyb20gJy4vZG9tJztcclxuaW1wb3J0IHsgQWN0aW9uLCBCYXNlT3B0aW9uLCBEZWZhdWx0U3RhdGVUeXBlLCBFdmVudFR5cGUsIEhpc3RvcnksIEhpc3RvcnlTdGF0ZSwgTG9jYXRpb24sIFBhdGgsIFRvIH0gZnJvbSAnLi90eXBlcyc7XHJcbmltcG9ydCB7IG5vcm1hbGl6ZVNsYXNoLCBjcmVhdGVNZW1vcnlSZWNvcmQsIGNyZWF0ZVBhdGgsIGNyZWF0ZUxvY2F0aW9uLCBzdHJpcEJhc2VuYW1lIH0gZnJvbSAnLi91dGlscyc7XHJcbmltcG9ydCBUcmFuc2l0aW9uTWFuYWdlciBmcm9tICcuL3RyYW5zaXRpb25NYW5hZ2VyJztcclxuXHJcbmltcG9ydCB3YXJuaW5nIGZyb20gJy4vd2FyaW5nJztcclxuaW1wb3J0IHsgZ2V0QmFzZUhpc3RvcnkgfSBmcm9tICcuL2Jhc2VIaXN0b3J5JztcclxuXHJcbmV4cG9ydCB0eXBlIEJyb3dzZXJIaXN0b3J5T3B0aW9uID0ge1xyXG4gIC8qKlxyXG4gICAqIGZvcmNlUmVmcmVzaOS4ulRydWXml7bot7Povazml7bkvJrlvLrliLbliLfmlrDpobXpnaJcclxuICAgKi9cclxuICBmb3JjZVJlZnJlc2g/OiBib29sZWFuO1xyXG59ICYgQmFzZU9wdGlvbjtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVCcm93c2VySGlzdG9yeTxTID0gRGVmYXVsdFN0YXRlVHlwZT4ob3B0aW9uczogQnJvd3Nlckhpc3RvcnlPcHRpb24gPSB7fSk6IEhpc3Rvcnk8Uz4ge1xyXG4gIGNvbnN0IHN1cHBvcnRIaXN0b3J5ID0gaXNTdXBwb3J0SGlzdG9yeSgpO1xyXG4gIGNvbnN0IGlzU3VwcG9ydFBvcFN0YXRlID0gaXNTdXBwb3J0c1BvcFN0YXRlKCk7XHJcbiAgY29uc3QgYnJvd3Nlckhpc3RvcnkgPSB3aW5kb3cuaGlzdG9yeTtcclxuICBjb25zdCB7IGZvcmNlUmVmcmVzaCA9IGZhbHNlLCBnZXRVc2VyQ29uZmlybWF0aW9uID0gZ2V0RGVmYXVsdENvbmZpcm1hdGlvbiB9ID0gb3B0aW9ucztcclxuXHJcbiAgY29uc3QgYmFzZW5hbWUgPSBvcHRpb25zLmJhc2VuYW1lID8gbm9ybWFsaXplU2xhc2gob3B0aW9ucy5iYXNlbmFtZSkgOiAnJztcclxuXHJcbiAgY29uc3QgaW5pdExvY2F0aW9uID0gZ2V0TG9jYXRpb24oZ2V0SGlzdG9yeVN0YXRlKCkpO1xyXG5cclxuICBjb25zdCByZWNvcmRPcGVyYXRvciA9IGNyZWF0ZU1lbW9yeVJlY29yZDxzdHJpbmcsIExvY2F0aW9uPFM+Pihpbml0TG9jYXRpb24sIGwgPT4gbC5rZXkpO1xyXG5cclxuICBjb25zdCB0cmFuc2l0aW9uTWFuYWdlciA9IG5ldyBUcmFuc2l0aW9uTWFuYWdlcjxTPigpO1xyXG5cclxuICBjb25zdCB7IGdvLCBnb0JhY2ssIGdvRm9yd2FyZCwgbGlzdGVuLCBibG9jaywgZ2V0VXBkYXRlU3RhdGVGdW5jIH0gPSBnZXRCYXNlSGlzdG9yeTxTPihcclxuICAgIHRyYW5zaXRpb25NYW5hZ2VyLFxyXG4gICAgc2V0TGlzdGVuZXIsXHJcbiAgICBicm93c2VySGlzdG9yeSxcclxuICApO1xyXG5cclxuICBjb25zdCBoaXN0b3J5OiBIaXN0b3J5PFM+ID0ge1xyXG4gICAgYWN0aW9uOiBBY3Rpb24ucG9wLFxyXG4gICAgbGVuZ3RoOiBicm93c2VySGlzdG9yeS5sZW5ndGgsXHJcbiAgICBsb2NhdGlvbjogaW5pdExvY2F0aW9uLFxyXG4gICAgZ28sXHJcbiAgICBnb0JhY2ssXHJcbiAgICBnb0ZvcndhcmQsXHJcbiAgICBsaXN0ZW4sXHJcbiAgICBibG9jayxcclxuICAgIHB1c2gsXHJcbiAgICByZXBsYWNlLFxyXG4gICAgY3JlYXRlSHJlZixcclxuICB9O1xyXG5cclxuICBjb25zdCB1cGRhdGVTdGF0ZSA9IGdldFVwZGF0ZVN0YXRlRnVuYyhoaXN0b3J5KTtcclxuXHJcbiAgZnVuY3Rpb24gZ2V0SGlzdG9yeVN0YXRlKCkge1xyXG4gICAgcmV0dXJuIHN1cHBvcnRIaXN0b3J5ID8gd2luZG93Lmhpc3Rvcnkuc3RhdGUgOiB7fTtcclxuICB9XHJcblxyXG4gIGZ1bmN0aW9uIGdldExvY2F0aW9uKGhpc3RvcnlTdGF0ZTogUGFydGlhbDxIaXN0b3J5U3RhdGU8Uz4+KSB7XHJcbiAgICBjb25zdCB7IHNlYXJjaCwgaGFzaCB9ID0gd2luZG93LmxvY2F0aW9uO1xyXG4gICAgY29uc3QgeyBrZXksIHN0YXRlIH0gPSBoaXN0b3J5U3RhdGUgfHwge307XHJcbiAgICBsZXQgcGF0aG5hbWUgPSB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWU7XHJcbiAgICBwYXRobmFtZSA9IGJhc2VuYW1lID8gc3RyaXBCYXNlbmFtZShwYXRobmFtZSwgYmFzZW5hbWUpIDogcGF0aG5hbWU7XHJcblxyXG4gICAgcmV0dXJuIGNyZWF0ZUxvY2F0aW9uPFM+KCcnLCB7IHBhdGhuYW1lLCBzZWFyY2gsIGhhc2ggfSwgc3RhdGUsIGtleSk7XHJcbiAgfVxyXG5cclxuICAvLyDmi6bmiKrpobXpnaJQT1Dkuovku7blkI7vvIzpmLLmraLov5Tlm57liLDnmoTpobXpnaLooqvph43lpI3mi6bmiKpcclxuICBsZXQgZm9yY2VKdW1wID0gZmFsc2U7XHJcblxyXG4gIGZ1bmN0aW9uIGhhbmRsZVBvcFN0YXRlKGxvY2F0aW9uOiBMb2NhdGlvbjxTPikge1xyXG4gICAgaWYgKGZvcmNlSnVtcCkge1xyXG4gICAgICBmb3JjZUp1bXAgPSBmYWxzZTtcclxuICAgICAgdXBkYXRlU3RhdGUodW5kZWZpbmVkKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IGFjdGlvbiA9IEFjdGlvbi5wb3A7XHJcblxyXG4gICAgICBjb25zdCBjYWxsYmFjayA9IChpc0p1bXA6IGJvb2xlYW4pID0+IHtcclxuICAgICAgICBpZiAoaXNKdW1wKSB7XHJcbiAgICAgICAgICAvLyDmiafooYzot7PovazooYzkuLpcclxuICAgICAgICAgIHVwZGF0ZVN0YXRlKHsgYWN0aW9uOiBhY3Rpb24sIGxvY2F0aW9uOiBsb2NhdGlvbiB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmV2ZXJ0UG9wU3RhdGUobG9jYXRpb24sIGhpc3RvcnkubG9jYXRpb24pO1xyXG4gICAgICAgIH1cclxuICAgICAgfTtcclxuXHJcbiAgICAgIHRyYW5zaXRpb25NYW5hZ2VyLmNvbmZpcm1KdW1wVG8obG9jYXRpb24sIGFjdGlvbiwgZ2V0VXNlckNvbmZpcm1hdGlvbiwgY2FsbGJhY2spO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gcG9wU3RhdGVMaXN0ZW5lcihldmVudDogUG9wU3RhdGVFdmVudCkge1xyXG4gICAgaGFuZGxlUG9wU3RhdGUoZ2V0TG9jYXRpb24oZXZlbnQuc3RhdGUpKTtcclxuICB9XHJcblxyXG4gIGZ1bmN0aW9uIGhhc2hDaGFuZ2VMaXN0ZW5lcigpIHtcclxuICAgIGNvbnN0IGxvY2F0aW9uID0gZ2V0TG9jYXRpb24oZ2V0SGlzdG9yeVN0YXRlKCkpO1xyXG4gICAgaGFuZGxlUG9wU3RhdGUobG9jYXRpb24pO1xyXG4gIH1cclxuXHJcbiAgbGV0IGxpc3RlbmVyQ291bnQgPSAwO1xyXG5cclxuICBmdW5jdGlvbiBzZXRMaXN0ZW5lcihjb3VudDogbnVtYmVyKSB7XHJcbiAgICBsaXN0ZW5lckNvdW50ICs9IGNvdW50O1xyXG4gICAgaWYgKGxpc3RlbmVyQ291bnQgPT09IDEgJiYgY291bnQgPT09IDEpIHtcclxuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRXZlbnRUeXBlLlBvcFN0YXRlLCBwb3BTdGF0ZUxpc3RlbmVyKTtcclxuICAgICAgaWYgKCFpc1N1cHBvcnRQb3BTdGF0ZSkge1xyXG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKEV2ZW50VHlwZS5IYXNoQ2hhbmdlLCBoYXNoQ2hhbmdlTGlzdGVuZXIpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKGxpc3RlbmVyQ291bnQgPT09IDApIHtcclxuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoRXZlbnRUeXBlLlBvcFN0YXRlLCBwb3BTdGF0ZUxpc3RlbmVyKTtcclxuICAgICAgaWYgKCFpc1N1cHBvcnRQb3BTdGF0ZSkge1xyXG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKEV2ZW50VHlwZS5IYXNoQ2hhbmdlLCBoYXNoQ2hhbmdlTGlzdGVuZXIpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyDlj5bmtojpobXpnaLot7PovazlubbmgaLlpI3liLDot7PovazliY3nmoTpobXpnaJcclxuICBmdW5jdGlvbiByZXZlcnRQb3BTdGF0ZShmb3JtOiBMb2NhdGlvbjxTPiwgdG86IExvY2F0aW9uPFM+KSB7XHJcbiAgICBjb25zdCBkZWx0YSA9IHJlY29yZE9wZXJhdG9yLmdldERlbHRhKHRvLCBmb3JtKTtcclxuICAgIGlmIChkZWx0YSAhPT0gMCkge1xyXG4gICAgICBnbyhkZWx0YSk7XHJcbiAgICAgIGZvcmNlSnVtcCA9IHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiBjcmVhdGVIcmVmKHBhdGg6IFBhcnRpYWw8UGF0aD4pIHtcclxuICAgIHJldHVybiBiYXNlbmFtZSArIGNyZWF0ZVBhdGgocGF0aCk7XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiBwdXNoKHRvOiBUbywgc3RhdGU/OiBTKSB7XHJcbiAgICBjb25zdCBhY3Rpb24gPSBBY3Rpb24ucHVzaDtcclxuICAgIGNvbnN0IGxvY2F0aW9uID0gY3JlYXRlTG9jYXRpb248Uz4oaGlzdG9yeS5sb2NhdGlvbiwgdG8sIHN0YXRlLCB1bmRlZmluZWQpO1xyXG5cclxuICAgIHRyYW5zaXRpb25NYW5hZ2VyLmNvbmZpcm1KdW1wVG8obG9jYXRpb24sIGFjdGlvbiwgZ2V0VXNlckNvbmZpcm1hdGlvbiwgaXNKdW1wID0+IHtcclxuICAgICAgaWYgKCFpc0p1bXApIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgaHJlZiA9IGNyZWF0ZUhyZWYobG9jYXRpb24pO1xyXG4gICAgICBjb25zdCB7IGtleSwgc3RhdGUgfSA9IGxvY2F0aW9uO1xyXG5cclxuICAgICAgaWYgKHN1cHBvcnRIaXN0b3J5KSB7XHJcbiAgICAgICAgaWYgKGZvcmNlUmVmcmVzaCkge1xyXG4gICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBocmVmO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBicm93c2VySGlzdG9yeS5wdXNoU3RhdGUoeyBrZXk6IGtleSwgc3RhdGU6IHN0YXRlIH0sICcnLCBocmVmKTtcclxuICAgICAgICAgIHJlY29yZE9wZXJhdG9yLmFkZFJlY29yZChoaXN0b3J5LmxvY2F0aW9uLCBsb2NhdGlvbiwgYWN0aW9uKTtcclxuICAgICAgICAgIHVwZGF0ZVN0YXRlKHsgYWN0aW9uLCBsb2NhdGlvbiB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgd2FybmluZyhzdGF0ZSAhPT0gdW5kZWZpbmVkLCAnQnJvd3NlciBoaXN0b3J5IGNhbm5vdCBwdXNoIHN0YXRlIGluIGJyb3dzZXJzIHRoYXQgZG8gbm90IHN1cHBvcnQgSFRNTDUgaGlzdG9yeScpO1xyXG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gaHJlZjtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiByZXBsYWNlKHRvOiBUbywgc3RhdGU/OiBTKSB7XHJcbiAgICBjb25zdCBhY3Rpb24gPSBBY3Rpb24ucmVwbGFjZTtcclxuICAgIGNvbnN0IGxvY2F0aW9uID0gY3JlYXRlTG9jYXRpb248Uz4oaGlzdG9yeS5sb2NhdGlvbiwgdG8sIHN0YXRlLCB1bmRlZmluZWQpO1xyXG5cclxuICAgIHRyYW5zaXRpb25NYW5hZ2VyLmNvbmZpcm1KdW1wVG8obG9jYXRpb24sIGFjdGlvbiwgZ2V0VXNlckNvbmZpcm1hdGlvbiwgaXNKdW1wID0+IHtcclxuICAgICAgaWYgKCFpc0p1bXApIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgaHJlZiA9IGNyZWF0ZUhyZWYobG9jYXRpb24pO1xyXG4gICAgICBjb25zdCB7IGtleSwgc3RhdGUgfSA9IGxvY2F0aW9uO1xyXG4gICAgICBpZiAoc3VwcG9ydEhpc3RvcnkpIHtcclxuICAgICAgICBpZiAoZm9yY2VSZWZyZXNoKSB7XHJcbiAgICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVwbGFjZShocmVmKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgYnJvd3Nlckhpc3RvcnkucmVwbGFjZVN0YXRlKHsga2V5OiBrZXksIHN0YXRlOiBzdGF0ZSB9LCAnJywgaHJlZik7XHJcbiAgICAgICAgICByZWNvcmRPcGVyYXRvci5hZGRSZWNvcmQoaGlzdG9yeS5sb2NhdGlvbiwgbG9jYXRpb24sIGFjdGlvbik7XHJcbiAgICAgICAgICB1cGRhdGVTdGF0ZSh7IGFjdGlvbiwgbG9jYXRpb24gfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHdhcm5pbmcoc3RhdGUgIT09IHVuZGVmaW5lZCwgJ0Jyb3dzZXIgaGlzdG9yeSBjYW5ub3QgcHVzaCBzdGF0ZSBpbiBicm93c2VycyB0aGF0IGRvIG5vdCBzdXBwb3J0IEhUTUw1IGhpc3RvcnknKTtcclxuICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVwbGFjZShocmVmKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gaGlzdG9yeTtcclxufVxyXG4iLCJpbXBvcnQgeyBBY3Rpb24sIEJhc2VPcHRpb24sIERlZmF1bHRTdGF0ZVR5cGUsIEV2ZW50VHlwZSwgSGlzdG9yeSwgTG9jYXRpb24sIFRvIH0gZnJvbSAnLi90eXBlcyc7XHJcbmltcG9ydCB7XHJcbiAgYWRkSGVhZFNsYXNoLFxyXG4gIG5vcm1hbGl6ZVNsYXNoLFxyXG4gIGNyZWF0ZU1lbW9yeVJlY29yZCxcclxuICBjcmVhdGVQYXRoLFxyXG4gIGNyZWF0ZUxvY2F0aW9uLFxyXG4gIGlzTG9jYXRpb25FcXVhbCxcclxuICBzdHJpcEJhc2VuYW1lLFxyXG4gIHN0cmlwSGVhZFNsYXNoLFxyXG59IGZyb20gJy4vdXRpbHMnO1xyXG5pbXBvcnQgeyBnZXREZWZhdWx0Q29uZmlybWF0aW9uIH0gZnJvbSAnLi9kb20nO1xyXG5pbXBvcnQgVHJhbnNpdGlvbk1hbmFnZXIgZnJvbSAnLi90cmFuc2l0aW9uTWFuYWdlcic7XHJcblxyXG5pbXBvcnQgd2FybmluZyBmcm9tICcuL3dhcmluZyc7XHJcbmltcG9ydCB7IGdldEJhc2VIaXN0b3J5IH0gZnJvbSAnLi9iYXNlSGlzdG9yeSc7XHJcblxyXG5leHBvcnQgdHlwZSB1cmxIYXNoVHlwZSA9ICdzbGFzaCcgfCAnbm9zbGFzaCc7XHJcblxyXG50eXBlIEhhc2hIaXN0b3J5T3B0aW9uID0ge1xyXG4gIGhhc2hUeXBlPzogdXJsSGFzaFR5cGU7XHJcbn0gJiBCYXNlT3B0aW9uO1xyXG5cclxuLy8g6I635Y+WI+WJjeeahOWGheWuuVxyXG5mdW5jdGlvbiBzdHJpcEhhc2gocGF0aDogc3RyaW5nKTogc3RyaW5nIHtcclxuICBjb25zdCBpZHggPSBwYXRoLmluZGV4T2YoJyMnKTtcclxuICByZXR1cm4gaWR4ID09PSAtMSA/IHBhdGggOiBwYXRoLnN1YnN0cmluZygwLCBpZHgpO1xyXG59XHJcblxyXG4vLyDojrflj5Yj5ZCO55qE5YaF5a65XHJcbmZ1bmN0aW9uIGdldEhhc2hDb250ZW50KHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgY29uc3QgaWR4ID0gcGF0aC5pbmRleE9mKCcjJyk7XHJcbiAgcmV0dXJuIGlkeCA9PT0gLTEgPyAnJyA6IHBhdGguc3Vic3RyaW5nKGlkeCArIDEpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlSGFzaEhpc3Rvcnk8UyA9IERlZmF1bHRTdGF0ZVR5cGU+KG9wdGlvbjogSGFzaEhpc3RvcnlPcHRpb24gPSB7fSk6IEhpc3Rvcnk8Uz4ge1xyXG4gIGNvbnN0IGJyb3dzZXJIaXN0b3J5ID0gd2luZG93Lmhpc3Rvcnk7XHJcbiAgY29uc3QgeyBoYXNoVHlwZSA9ICdzbGFzaCcsIGdldFVzZXJDb25maXJtYXRpb24gPSBnZXREZWZhdWx0Q29uZmlybWF0aW9uIH0gPSBvcHRpb247XHJcblxyXG4gIGNvbnN0IGJhc2VuYW1lID0gb3B0aW9uLmJhc2VuYW1lID8gbm9ybWFsaXplU2xhc2gob3B0aW9uLmJhc2VuYW1lKSA6ICcnO1xyXG5cclxuICBjb25zdCBwYXRoRGVjb2RlciA9IGFkZEhlYWRTbGFzaDtcclxuICBjb25zdCBwYXRoRW5jb2RlciA9IGhhc2hUeXBlID09PSAnc2xhc2gnID8gYWRkSGVhZFNsYXNoIDogc3RyaXBIZWFkU2xhc2g7XHJcblxyXG4gIGZ1bmN0aW9uIGdldExvY2F0aW9uKCkge1xyXG4gICAgbGV0IGhhc2hQYXRoID0gcGF0aERlY29kZXIoZ2V0SGFzaENvbnRlbnQod2luZG93LmxvY2F0aW9uLmhhc2gpKTtcclxuICAgIGlmIChiYXNlbmFtZSkge1xyXG4gICAgICBoYXNoUGF0aCA9IHN0cmlwQmFzZW5hbWUoaGFzaFBhdGgsIGJhc2VuYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gY3JlYXRlTG9jYXRpb248Uz4oJycsIGhhc2hQYXRoLCB1bmRlZmluZWQsICdkZWZhdWx0Jyk7XHJcbiAgfVxyXG5cclxuICBjb25zdCBpbml0TG9jYXRpb24gPSBnZXRMb2NhdGlvbigpO1xyXG5cclxuICBjb25zdCBtZW1SZWNvcmRzID0gY3JlYXRlTWVtb3J5UmVjb3JkPHN0cmluZywgTG9jYXRpb248Uz4+KGluaXRMb2NhdGlvbiwgY3JlYXRlUGF0aCk7XHJcblxyXG4gIGNvbnN0IHRyYW5zaXRpb25NYW5hZ2VyID0gbmV3IFRyYW5zaXRpb25NYW5hZ2VyPFM+KCk7XHJcblxyXG4gIGZ1bmN0aW9uIGNyZWF0ZUhyZWYobG9jYXRpb246IExvY2F0aW9uPFM+KSB7XHJcbiAgICBjb25zdCB0YWcgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdiYXNlJyk7XHJcbiAgICBjb25zdCBiYXNlID0gdGFnICYmIHRhZy5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSA/IHN0cmlwSGFzaCh3aW5kb3cubG9jYXRpb24uaHJlZikgOiAnJztcclxuICAgIHJldHVybiBiYXNlICsgJyMnICsgcGF0aEVuY29kZXIoYmFzZW5hbWUgKyBjcmVhdGVQYXRoKGxvY2F0aW9uKSk7XHJcbiAgfVxyXG5cclxuICBsZXQgZm9yY2VOZXh0UG9wID0gZmFsc2U7XHJcbiAgbGV0IGlnbm9yZVBhdGg6IG51bGwgfCBzdHJpbmcgPSBudWxsO1xyXG5cclxuICBjb25zdCB7IGdvLCBnb0JhY2ssIGdvRm9yd2FyZCwgbGlzdGVuLCBibG9jaywgZ2V0VXBkYXRlU3RhdGVGdW5jIH0gPSBnZXRCYXNlSGlzdG9yeShcclxuICAgIHRyYW5zaXRpb25NYW5hZ2VyLFxyXG4gICAgc2V0TGlzdGVuZXIsXHJcbiAgICBicm93c2VySGlzdG9yeSxcclxuICApO1xyXG5cclxuICBjb25zdCBoaXN0b3J5OiBIaXN0b3J5PFM+ID0ge1xyXG4gICAgYWN0aW9uOiBBY3Rpb24ucG9wLFxyXG4gICAgbGVuZ3RoOiBicm93c2VySGlzdG9yeS5sZW5ndGgsXHJcbiAgICBsb2NhdGlvbjogaW5pdExvY2F0aW9uLFxyXG4gICAgZ28sXHJcbiAgICBnb0JhY2ssXHJcbiAgICBnb0ZvcndhcmQsXHJcbiAgICBwdXNoLFxyXG4gICAgcmVwbGFjZSxcclxuICAgIGxpc3RlbixcclxuICAgIGJsb2NrLFxyXG4gICAgY3JlYXRlSHJlZixcclxuICB9O1xyXG5cclxuICBjb25zdCB1cGRhdGVTdGF0ZSA9IGdldFVwZGF0ZVN0YXRlRnVuYyhoaXN0b3J5KTtcclxuXHJcbiAgZnVuY3Rpb24gcHVzaCh0bzogVG8sIHN0YXRlPzogUykge1xyXG4gICAgd2FybmluZyhzdGF0ZSAhPT0gdW5kZWZpbmVkLCAnSGFzaCBoaXN0b3J5IGRvZXMgbm90IHN1cHBvcnQgc3RhdGUsIGl0IHdpbGwgYmUgaWdub3JlZCcpO1xyXG5cclxuICAgIGNvbnN0IGFjdGlvbiA9IEFjdGlvbi5wdXNoO1xyXG4gICAgY29uc3QgbG9jYXRpb24gPSBjcmVhdGVMb2NhdGlvbjxTPihoaXN0b3J5LmxvY2F0aW9uLCB0bywgdW5kZWZpbmVkLCAnJyk7XHJcblxyXG4gICAgdHJhbnNpdGlvbk1hbmFnZXIuY29uZmlybUp1bXBUbyhsb2NhdGlvbiwgYWN0aW9uLCBnZXRVc2VyQ29uZmlybWF0aW9uLCBpc0p1bXAgPT4ge1xyXG4gICAgICBpZiAoIWlzSnVtcCkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBwYXRoID0gY3JlYXRlUGF0aChsb2NhdGlvbik7XHJcbiAgICAgIGNvbnN0IGVuY29kZWRQYXRoID0gcGF0aEVuY29kZXIoYmFzZW5hbWUgKyBwYXRoKTtcclxuICAgICAgLy8g5YmN5ZCOaGFzaOS4jeS4gOagt+aJjei/m+ihjOi3s+i9rFxyXG4gICAgICBpZiAoZ2V0SGFzaENvbnRlbnQod2luZG93LmxvY2F0aW9uLmhyZWYpICE9PSBlbmNvZGVkUGF0aCkge1xyXG4gICAgICAgIGlnbm9yZVBhdGggPSBlbmNvZGVkUGF0aDtcclxuICAgICAgICB3aW5kb3cubG9jYXRpb24uaGFzaCA9IGVuY29kZWRQYXRoO1xyXG5cclxuICAgICAgICBtZW1SZWNvcmRzLmFkZFJlY29yZChoaXN0b3J5LmxvY2F0aW9uLCBsb2NhdGlvbiwgYWN0aW9uKTtcclxuXHJcbiAgICAgICAgdXBkYXRlU3RhdGUoeyBhY3Rpb24sIGxvY2F0aW9uIH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHVwZGF0ZVN0YXRlKHVuZGVmaW5lZCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gcmVwbGFjZSh0bzogVG8sIHN0YXRlPzogUykge1xyXG4gICAgd2FybmluZyhzdGF0ZSAhPT0gdW5kZWZpbmVkLCAnSGFzaCBoaXN0b3J5IGRvZXMgbm90IHN1cHBvcnQgc3RhdGUsIGl0IHdpbGwgYmUgaWdub3JlZCcpO1xyXG4gICAgY29uc3QgYWN0aW9uID0gQWN0aW9uLnJlcGxhY2U7XHJcbiAgICBjb25zdCBsb2NhdGlvbiA9IGNyZWF0ZUxvY2F0aW9uPFM+KGhpc3RvcnkubG9jYXRpb24sIHRvLCB1bmRlZmluZWQsICcnKTtcclxuXHJcbiAgICB0cmFuc2l0aW9uTWFuYWdlci5jb25maXJtSnVtcFRvKGxvY2F0aW9uLCBhY3Rpb24sIGdldFVzZXJDb25maXJtYXRpb24sIGlzSnVtcCA9PiB7XHJcbiAgICAgIGlmICghaXNKdW1wKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IHBhdGggPSBjcmVhdGVQYXRoKGxvY2F0aW9uKTtcclxuICAgICAgY29uc3QgZW5jb2RlZFBhdGggPSBwYXRoRW5jb2RlcihiYXNlbmFtZSArIHBhdGgpO1xyXG4gICAgICBpZiAoZ2V0SGFzaENvbnRlbnQod2luZG93LmxvY2F0aW9uLmhyZWYpICE9PSBlbmNvZGVkUGF0aCkge1xyXG4gICAgICAgIGlnbm9yZVBhdGggPSBwYXRoO1xyXG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZXBsYWNlKHN0cmlwSGFzaCh3aW5kb3cubG9jYXRpb24uaHJlZikgKyAnIycgKyBlbmNvZGVkUGF0aCk7XHJcbiAgICAgIH1cclxuICAgICAgbWVtUmVjb3Jkcy5hZGRSZWNvcmQoaGlzdG9yeS5sb2NhdGlvbiwgbG9jYXRpb24sIGFjdGlvbik7XHJcbiAgICAgIHVwZGF0ZVN0YXRlKHsgYWN0aW9uLCBsb2NhdGlvbiB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gaGFuZGxlSGFzaENoYW5nZSgpIHtcclxuICAgIGNvbnN0IGhhc2hQYXRoID0gZ2V0SGFzaENvbnRlbnQod2luZG93LmxvY2F0aW9uLmhyZWYpO1xyXG4gICAgY29uc3QgZW5jb2RlZFBhdGggPSBwYXRoRW5jb2RlcihoYXNoUGF0aCk7XHJcbiAgICBpZiAoaGFzaFBhdGggIT09IGVuY29kZWRQYXRoKSB7XHJcbiAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZXBsYWNlKHN0cmlwSGFzaCh3aW5kb3cubG9jYXRpb24uaHJlZikgKyAnIycgKyBlbmNvZGVkUGF0aCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCBsb2NhdGlvbiA9IGdldExvY2F0aW9uKCk7XHJcbiAgICAgIGNvbnN0IHByZXZMb2NhdGlvbiA9IGhpc3RvcnkubG9jYXRpb247XHJcbiAgICAgIGlmICghZm9yY2VOZXh0UG9wICYmIGlzTG9jYXRpb25FcXVhbChsb2NhdGlvbiwgcHJldkxvY2F0aW9uKSkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBpZiAoaWdub3JlUGF0aCA9PT0gY3JlYXRlUGF0aChsb2NhdGlvbikpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgaWdub3JlUGF0aCA9IG51bGw7XHJcbiAgICAgIGhhbmRsZVBvcFN0YXRlKGxvY2F0aW9uKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGZ1bmN0aW9uIGhhbmRsZVBvcFN0YXRlKGxvY2F0aW9uOiBMb2NhdGlvbjxTPikge1xyXG4gICAgaWYgKGZvcmNlTmV4dFBvcCkge1xyXG4gICAgICBmb3JjZU5leHRQb3AgPSBmYWxzZTtcclxuICAgICAgdXBkYXRlU3RhdGUodW5kZWZpbmVkKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IGFjdGlvbiA9IEFjdGlvbi5wb3A7XHJcblxyXG4gICAgICBjb25zdCBjYWxsYmFjayA9IChpc0p1bXA6IGJvb2xlYW4pID0+IHtcclxuICAgICAgICBpZiAoaXNKdW1wKSB7XHJcbiAgICAgICAgICB1cGRhdGVTdGF0ZSh7IGFjdGlvbjogYWN0aW9uLCBsb2NhdGlvbjogbG9jYXRpb24gfSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJldmVydFBvcFN0YXRlKGxvY2F0aW9uKTtcclxuICAgICAgICB9XHJcbiAgICAgIH07XHJcblxyXG4gICAgICB0cmFuc2l0aW9uTWFuYWdlci5jb25maXJtSnVtcFRvKGxvY2F0aW9uLCBhY3Rpb24sIGdldFVzZXJDb25maXJtYXRpb24sIGNhbGxiYWNrKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIOWcqOi3s+i9rOihjOS4uuiiq0Jsb2Nr5ZCO77yM55SoSGlzdG9yeS5nbygp6Lez6L2s5Zue5LmL5YmN55qE6aG16Z2iXHJcbiAgZnVuY3Rpb24gcmV2ZXJ0UG9wU3RhdGUoZm9ybTogTG9jYXRpb248Uz4pIHtcclxuICAgIGNvbnN0IHRvID0gaGlzdG9yeS5sb2NhdGlvbjtcclxuICAgIGNvbnN0IGRlbHRhID0gbWVtUmVjb3Jkcy5nZXREZWx0YSh0bywgZm9ybSk7XHJcbiAgICBpZiAoZGVsdGEgIT09IDApIHtcclxuICAgICAgZ28oZGVsdGEpO1xyXG4gICAgICBmb3JjZU5leHRQb3AgPSB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbGV0IGxpc3RlbmVyQ291bnQgPSAwO1xyXG5cclxuICBmdW5jdGlvbiBzZXRMaXN0ZW5lcihkZWx0YTogbnVtYmVyKSB7XHJcbiAgICBsaXN0ZW5lckNvdW50ICs9IGRlbHRhO1xyXG4gICAgaWYgKGxpc3RlbmVyQ291bnQgPT09IDEgJiYgZGVsdGEgPT09IDEpIHtcclxuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRXZlbnRUeXBlLkhhc2hDaGFuZ2UsIGhhbmRsZUhhc2hDaGFuZ2UpO1xyXG4gICAgfSBlbHNlIGlmIChsaXN0ZW5lckNvdW50ID09PSAwKSB7XHJcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKEV2ZW50VHlwZS5IYXNoQ2hhbmdlLCBoYW5kbGVIYXNoQ2hhbmdlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJldHVybiBoaXN0b3J5O1xyXG59XHJcbiIsImltcG9ydCB7IGNyZWF0ZUNvbnRleHQgfSBmcm9tICdyZWFjdCc7XHJcbmltcG9ydCB7IEhpc3RvcnksIExvY2F0aW9uIH0gZnJvbSAnLi9pbmRleCc7XHJcbmltcG9ydCB7IE1hdGNoZWQgfSBmcm9tICcuL21hdGNoZXIvcGFyc2VyJztcclxuXHJcbmZ1bmN0aW9uIGNyZWF0ZU5hbWVkQ29udGV4dDxUPihuYW1lOiBzdHJpbmcsIGRlZmF1bHRWYWx1ZTogVCkge1xyXG4gIGNvbnN0IGNvbnRleHQgPSBjcmVhdGVDb250ZXh0PFQ+KGRlZmF1bHRWYWx1ZSk7XHJcbiAgY29udGV4dC5kaXNwbGF5TmFtZSA9IG5hbWU7XHJcbiAgcmV0dXJuIGNvbnRleHQ7XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIFJvdXRlckNvbnRleHRWYWx1ZSA9IHtcclxuICBoaXN0b3J5OiBIaXN0b3J5O1xyXG4gIGxvY2F0aW9uOiBMb2NhdGlvbjtcclxuICBtYXRjaDogTWF0Y2hlZCB8IG51bGw7XHJcbn07XHJcblxyXG5jb25zdCBSb3V0ZXJDb250ZXh0ID0gY3JlYXRlTmFtZWRDb250ZXh0PFJvdXRlckNvbnRleHRWYWx1ZT4oJ1JvdXRlcicsIHt9IGFzIGFueSk7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBSb3V0ZXJDb250ZXh0OyIsImltcG9ydCB7IE1hdGNoZWQsIFBhcmFtcyB9IGZyb20gJy4vcGFyc2VyJztcclxuXHJcbmV4cG9ydCB0eXBlIFRva2VuID0ge1xyXG4gIHR5cGU6IFRva2VuVHlwZTtcclxuICB2YWx1ZTogc3RyaW5nO1xyXG59O1xyXG5cclxuZXhwb3J0IGVudW0gVG9rZW5UeXBlIHtcclxuICBEZWxpbWl0ZXIgPSAnZGVsaW1pdGVyJyxcclxuICBTdGF0aWMgPSAnc3RhdGljJyxcclxuICBQYXJhbSA9ICdwYXJhbScsXHJcbiAgV2lsZENhcmQgPSAnd2lsZGNhcmQnLFxyXG4gIExCcmFja2V0ID0gJygnLFxyXG4gIFJCcmFja2V0ID0gJyknLFxyXG4gIFBhdHRlcm4gPSAncGF0dGVybicsXHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgUGFyc2VyPFA+IHtcclxuICByZWdleHA6IFJlZ0V4cDtcclxuXHJcbiAga2V5czogc3RyaW5nW107XHJcblxyXG4gIHBhcnNlKHVybDogc3RyaW5nKTogTWF0Y2hlZDxQPiB8IG51bGw7XHJcblxyXG4gIGNvbXBpbGUocGFyYW1zOiBQYXJhbXM8UD4pOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIFBhcnNlck9wdGlvbiA9IHtcclxuICAvLyDmmK/lkKblpKflsI/lhpnmlY/mhJ9cclxuICBjYXNlU2Vuc2l0aXZlPzogYm9vbGVhbjtcclxuICAvLyDmmK/lkKblkK/nlKjkuKXmoLzmqKHlvI9cclxuICBzdHJpY3RNb2RlPzogYm9vbGVhbjtcclxuICAvLyDnsr7lh4bljLnphY0g5YW85a65IFJlYWN0LVJvdXRlclY1XHJcbiAgZXhhY3Q/OiBib29sZWFuO1xyXG59O1xyXG5cclxudHlwZSBDbGVhckxlYWRpbmc8VSBleHRlbmRzIHN0cmluZz4gPSBVIGV4dGVuZHMgYC8ke2luZmVyIFJ9YCA/IENsZWFyTGVhZGluZzxSPiA6IFU7XHJcbnR5cGUgQ2xlYXJUYWlsaW5nPFUgZXh0ZW5kcyBzdHJpbmc+ID0gVSBleHRlbmRzIGAke2luZmVyIEx9L2AgPyBDbGVhclRhaWxpbmc8TD4gOiBVO1xyXG5cclxudHlwZSBQYXJzZVBhcmFtPFBhcmFtIGV4dGVuZHMgc3RyaW5nPiA9IFBhcmFtIGV4dGVuZHMgYDoke2luZmVyIFJ9YFxyXG4gID8ge1xyXG4gICAgW0sgaW4gUl06IHN0cmluZztcclxuICB9XHJcbiAgOiB7fTtcclxuXHJcbnR5cGUgTWVyZ2VQYXJhbXM8T25lUGFyYW0gZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBPdGhlclBhcmFtIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pj4gPSB7XHJcbiAgcmVhZG9ubHkgW0tleSBpbiBrZXlvZiBPbmVQYXJhbSB8IGtleW9mIE90aGVyUGFyYW1dPzogc3RyaW5nO1xyXG59O1xyXG5cclxudHlwZSBQYXJzZVVSTFN0cmluZzxTdHIgZXh0ZW5kcyBzdHJpbmc+ID0gU3RyIGV4dGVuZHMgYCR7aW5mZXIgUGFyYW19LyR7aW5mZXIgUmVzdH1gXHJcbiAgPyBNZXJnZVBhcmFtczxQYXJzZVBhcmFtPFBhcmFtPiwgUGFyc2VVUkxTdHJpbmc8Q2xlYXJMZWFkaW5nPFJlc3Q+Pj5cclxuICA6IFBhcnNlUGFyYW08U3RyPjtcclxuXHJcbi8vIOino+aekFVSTOS4reeahOWKqOaAgeWPguaVsO+8jOS7peWunueOsFR5cGVTY3JpcHTmj5DnpLrlip/og71cclxuZXhwb3J0IHR5cGUgR2V0VVJMUGFyYW1zPFUgZXh0ZW5kcyBzdHJpbmc+ID0gUGFyc2VVUkxTdHJpbmc8Q2xlYXJMZWFkaW5nPENsZWFyVGFpbGluZzxVPj4+O1xyXG4iLCIvKipcclxuICogQGRlc2NyaXB0aW9uIOWwhnVybOS4reeahC8v6L2s5o2i5Li6L1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGNsZWFuUGF0aChwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gIHJldHVybiBwYXRoLnJlcGxhY2UoL1xcLysvZywgJy8nKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHNjb3JlQ29tcGFyZShzY29yZTE6IG51bWJlcltdLCBzY29yZTI6IG51bWJlcltdKTogbnVtYmVyIHtcclxuICBjb25zdCBzY29yZTFMZW5ndGggPSBzY29yZTEubGVuZ3RoO1xyXG4gIGNvbnN0IHNjb3JlMkxlbmd0aCA9IHNjb3JlMi5sZW5ndGg7XHJcbiAgY29uc3QgZW5kID0gTWF0aC5taW4oc2NvcmUxTGVuZ3RoLCBzY29yZTJMZW5ndGgpO1xyXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZW5kOyBpKyspIHtcclxuICAgIGNvbnN0IGRlbHRhID0gc2NvcmUyW2ldIC0gc2NvcmUxW2ldO1xyXG4gICAgaWYgKGRlbHRhICE9PSAwKSB7XHJcbiAgICAgIHJldHVybiBkZWx0YTtcclxuICAgIH1cclxuICB9XHJcbiAgaWYgKHNjb3JlMUxlbmd0aCA9PT0gc2NvcmUyTGVuZ3RoKSB7XHJcbiAgICByZXR1cm4gMDtcclxuICB9XHJcbiAgcmV0dXJuIHNjb3JlMUxlbmd0aCA+IHNjb3JlMkxlbmd0aCA/IC0xIDogMTtcclxufVxyXG5cclxuLy8g5oqK5q2j5YiZ6KGo6L6+5byP55qE54m55q6K56ym5Y+35Yqg5Lik5Liq5Y+N5pac5p2g6L+b6KGM6L2s5LmJXHJcbmV4cG9ydCBmdW5jdGlvbiBlc2NhcGVTdHIoc3RyOiBzdHJpbmcpIHtcclxuICByZXR1cm4gc3RyLnJlcGxhY2UoLyhbLisqPz1eIToke30oKVtcXF18L1xcXFxdKS9nLCAnXFxcXCQxJyk7XHJcbn1cclxuIiwiaW1wb3J0IHsgVG9rZW4sIFRva2VuVHlwZSB9IGZyb20gJy4vdHlwZXMnO1xyXG5pbXBvcnQgeyBjbGVhblBhdGggfSBmcm9tICcuL3V0aWxzJztcclxuXHJcbmNvbnN0IHZhbGlkQ2hhciA9IC9bXi86KigpXS87XHJcblxyXG4vLyDlr7lVcmzmqKHmnb/ov5vooYzor43ms5Xop6PmnpDvvIzop6PmnpDnu5PmnpzkuLpUb2tlbnNcclxuZXhwb3J0IGZ1bmN0aW9uIGxleGVyKHBhdGg6IHN0cmluZyk6IFRva2VuW10ge1xyXG4gIGNvbnN0IHRva2VuczogVG9rZW5bXSA9IFtdO1xyXG5cclxuICBpZiAoIXBhdGgpIHtcclxuICAgIHJldHVybiB0b2tlbnM7XHJcbiAgfVxyXG5cclxuICBsZXQgdXJsUGF0aCA9IGNsZWFuUGF0aChwYXRoKTtcclxuICBpZiAodXJsUGF0aCAhPT0gJyonICYmICF1cmxQYXRoLnN0YXJ0c1dpdGgoJy8nKSkge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKGBVcmwgbXVzdCBzdGFydCB3aXRoIFwiL1wiLmApO1xyXG4gIH1cclxuXHJcbiAgY29uc3QgZ2V0TGl0ZXJhbCA9ICgpID0+IHtcclxuICAgIGxldCBuYW1lID0gJyc7XHJcbiAgICB3aGlsZSAoaSA8IHVybFBhdGgubGVuZ3RoICYmIHZhbGlkQ2hhci50ZXN0KHVybFBhdGhbaV0pKSB7XHJcbiAgICAgIG5hbWUgKz0gdXJsUGF0aFtpXTtcclxuICAgICAgc2tpcENoYXIoMSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmFtZTtcclxuICB9O1xyXG5cclxuICBjb25zdCBza2lwQ2hhciA9IChzdGVwOiBudW1iZXIpID0+IHtcclxuICAgIGkgKz0gc3RlcDtcclxuICB9O1xyXG5cclxuICBsZXQgaSA9IDA7XHJcbiAgd2hpbGUgKGkgPCB1cmxQYXRoLmxlbmd0aCkge1xyXG4gICAgY29uc3QgY3VyQ2hhciA9IHVybFBhdGhbaV07XHJcbiAgICBjb25zdCBwcmV2Q2hhciA9IHVybFBhdGhbaSAtIDFdO1xyXG5cclxuICAgIGlmIChjdXJDaGFyID09PSAnLycpIHtcclxuICAgICAgdG9rZW5zLnB1c2goeyB0eXBlOiBUb2tlblR5cGUuRGVsaW1pdGVyLCB2YWx1ZTogdXJsUGF0aFtpXSB9KTtcclxuICAgICAgc2tpcENoYXIoMSk7XHJcbiAgICAgIGNvbnRpbnVlO1xyXG4gICAgfVxyXG4gICAgLy8gZHluYW1pYyBwYXJhbXMgKC86YSlcclxuICAgIGlmIChwcmV2Q2hhciA9PT0gJy8nICYmIGN1ckNoYXIgPT09ICc6Jykge1xyXG4gICAgICBza2lwQ2hhcigxKTtcclxuICAgICAgdG9rZW5zLnB1c2goeyB0eXBlOiBUb2tlblR5cGUuUGFyYW0sIHZhbHVlOiBnZXRMaXRlcmFsKCkgfSk7XHJcbiAgICAgIGNvbnRpbnVlO1xyXG4gICAgfVxyXG4gICAgLy8gd2lsZENhcmQgcGFyYW1zICgvOiopXHJcbiAgICBpZiAoKHByZXZDaGFyID09PSAnLycgfHwgcHJldkNoYXIgPT09IHVuZGVmaW5lZCkgJiYgY3VyQ2hhciA9PT0gJyonKSB7XHJcbiAgICAgIHRva2Vucy5wdXNoKHsgdHlwZTogVG9rZW5UeXBlLldpbGRDYXJkLCB2YWx1ZTogdXJsUGF0aFtpXSB9KTtcclxuICAgICAgc2tpcENoYXIoMSk7XHJcbiAgICAgIGNvbnRpbnVlO1xyXG4gICAgfVxyXG4gICAgLy8gc3RhdGljIHBhcmFtc1xyXG4gICAgaWYgKHByZXZDaGFyID09PSAnLycgJiYgdmFsaWRDaGFyLnRlc3QoY3VyQ2hhcikpIHtcclxuICAgICAgdG9rZW5zLnB1c2goeyB0eXBlOiBUb2tlblR5cGUuU3RhdGljLCB2YWx1ZTogZ2V0TGl0ZXJhbCgpIH0pO1xyXG4gICAgICBjb250aW51ZTtcclxuICAgIH1cclxuICAgIGlmIChjdXJDaGFyID09PSAnKCcpIHtcclxuICAgICAgdG9rZW5zLnB1c2goeyB0eXBlOiBUb2tlblR5cGUuTEJyYWNrZXQsIHZhbHVlOiAnKCcgfSk7XHJcbiAgICAgIHNraXBDaGFyKDEpO1xyXG4gICAgICBjb250aW51ZTtcclxuICAgIH1cclxuICAgIGlmIChjdXJDaGFyID09PSAnKScpIHtcclxuICAgICAgdG9rZW5zLnB1c2goeyB0eXBlOiBUb2tlblR5cGUuUkJyYWNrZXQsIHZhbHVlOiAnKScgfSk7XHJcbiAgICAgIHNraXBDaGFyKDEpO1xyXG4gICAgICBjb250aW51ZTtcclxuICAgIH1cclxuICAgIGlmICh2YWxpZENoYXIudGVzdChjdXJDaGFyKSkge1xyXG4gICAgICB0b2tlbnMucHVzaCh7IHR5cGU6IFRva2VuVHlwZS5QYXR0ZXJuLCB2YWx1ZTogZ2V0TGl0ZXJhbCgpIH0pO1xyXG4gICAgICBjb250aW51ZTtcclxuICAgIH1cclxuICAgIC8vIOi3s+i/h+mdnuazleWtl+esplxyXG4gICAgc2tpcENoYXIoMSk7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gdG9rZW5zO1xyXG59XHJcbiIsImltcG9ydCB7IEdldFVSTFBhcmFtcywgUGFyc2VyLCBQYXJzZXJPcHRpb24sIFRva2VuVHlwZSB9IGZyb20gJy4vdHlwZXMnO1xyXG5pbXBvcnQgeyBsZXhlciB9IGZyb20gJy4vbGV4ZXInO1xyXG5pbXBvcnQgeyBlc2NhcGVTdHIsIHNjb3JlQ29tcGFyZSB9IGZyb20gJy4vdXRpbHMnO1xyXG5cclxuLy8g5LiN5ZCM57G75Z6L5Y+C5pWw55qE5Yy56YWN5b6X5YiGXHJcbmVudW0gTWF0Y2hTY29yZSB7XHJcbiAgLy8g5Zu65a6a5Y+C5pWwXHJcbiAgc3RhdGljID0gMTAsXHJcbiAgLy8g5Yqo5oCB5Y+C5pWwXHJcbiAgcGFyYW0gPSA2LFxyXG4gIC8vIOmAmumFjeespuWPguaVsFxyXG4gIHdpbGRjYXJkID0gMyxcclxuICBwbGFjZWhvbGRlciA9IC0xLFxyXG59XHJcblxyXG5leHBvcnQgdHlwZSBQYXJhbXM8UD4gPSB7IFtLIGluIGtleW9mIFBdPzogUFtLXSB9O1xyXG5cclxuLy8g5YW85a65IHJlYWN0IHY1IG1hdGNoZWTnsbvlnotcclxuZXhwb3J0IHR5cGUgTWF0Y2hlZDxQID0gYW55PiA9IHtcclxuICBzY29yZTogbnVtYmVyW107XHJcbiAgcGFyYW1zOiBQYXJhbXM8UD47XHJcbiAgcGF0aDogc3RyaW5nO1xyXG4gIHVybDogc3RyaW5nO1xyXG4gIGlzRXhhY3Q6IGJvb2xlYW47XHJcbn07XHJcblxyXG5jb25zdCBkZWZhdWx0T3B0aW9uOiBSZXF1aXJlZDxQYXJzZXJPcHRpb24+ID0ge1xyXG4gIC8vIHVybOWMuemFjeaXtuaYr+WQpuWkp+Wwj+WGmeaVj+aEn1xyXG4gIGNhc2VTZW5zaXRpdmU6IHRydWUsXHJcbiAgLy8g5piv5ZCm5Lil5qC85Yy56YWNdXJs57uT5bC+55qEL1xyXG4gIHN0cmljdE1vZGU6IGZhbHNlLFxyXG4gIC8vIOaYr+WQpuWujOWFqOeyvuehruWMuemFjVxyXG4gIGV4YWN0OiBmYWxzZSxcclxufTtcclxuLy8g5q2j5YiZ6KGo6L6+5byP5Lit6ZyA6KaB6L2s5LmJ55qE5a2X56ymXHJcbmNvbnN0IFJFR0VYX0NIQVJTX1JFID0gL1suKyo/XiR7fSgpW1xcXS9cXFxcXS9nO1xyXG4vLyDnlKjkuo7ljLnphY3kuKTkuKovL+S4reeahOeahOWAvFxyXG5jb25zdCBCQVNFX1BBUkFNX1BBVFRFUk4gPSAnW14vXSsnO1xyXG5cclxuY29uc3QgRGVmYXVsdERlbGltaXRlciA9ICcvIz8nO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVBhdGhQYXJzZXI8U3RyIGV4dGVuZHMgc3RyaW5nPihwYXRobmFtZTogU3RyLCBvcHRpb24/OiBQYXJzZXJPcHRpb24pOiBQYXJzZXI8R2V0VVJMUGFyYW1zPFN0cj4+O1xyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUGF0aFBhcnNlcjxQID0gdW5rbm93bj4ocGF0aG5hbWU6IHN0cmluZywgb3B0aW9uPzogUGFyc2VyT3B0aW9uKTogUGFyc2VyPFA+O1xyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUGF0aFBhcnNlcjxQID0gdW5rbm93bj4ocGF0aG5hbWU6IHN0cmluZywgb3B0aW9uOiBQYXJzZXJPcHRpb24gPSBkZWZhdWx0T3B0aW9uKTogUGFyc2VyPFA+IHtcclxuICBjb25zdCB7XHJcbiAgICBjYXNlU2Vuc2l0aXZlID0gZGVmYXVsdE9wdGlvbi5jYXNlU2Vuc2l0aXZlLFxyXG4gICAgc3RyaWN0TW9kZSA9IGRlZmF1bHRPcHRpb24uc3RyaWN0TW9kZSxcclxuICAgIGV4YWN0ID0gZGVmYXVsdE9wdGlvbi5leGFjdCxcclxuICB9ID0gb3B0aW9uO1xyXG4gIC8qKlxyXG4gICAqIFVSTOWMuemFjeaVtOS9k+a1geeoi1xyXG4gICAqIDEu6K+N5rOV6Kej5p6Q77yM5bCGVVJM5qih5p2/6Kej5p6Q5Li6VG9rZW5cclxuICAgKiAyLuS9v+eUqFRva2Vu55Sf5oiQ5q2j5YiZ6KGo6L6+5byPXHJcbiAgICogMy7liKnnlKjmraPliJnooajovr7lvI/op6PmnpBVUkzkuK3lj4LmlbDmiJbloavlhYVVUkzmqKHmnb9cclxuICAgKi9cclxuICBsZXQgcGF0dGVybiA9ICdeJztcclxuICBjb25zdCBrZXlzOiBzdHJpbmdbXSA9IFtdO1xyXG4gIGNvbnN0IHNjb3JlczogbnVtYmVyW10gPSBbXTtcclxuXHJcbiAgY29uc3QgdG9rZW5zID0gbGV4ZXIocGF0aG5hbWUpO1xyXG4gIGNvbnN0IG9ubHlIYXNXaWxkQ2FyZCA9IHRva2Vucy5sZW5ndGggPT09IDEgJiYgdG9rZW5zWzBdLnR5cGUgPT09IFRva2VuVHlwZS5XaWxkQ2FyZDtcclxuICBjb25zdCB0b2tlbkNvdW50ID0gdG9rZW5zLmxlbmd0aDtcclxuICBjb25zdCBsYXN0VG9rZW4gPSB0b2tlbnNbdG9rZW5Db3VudCAtIDFdO1xyXG5cclxuICBmb3IgKGxldCB0b2tlbklkeCA9IDA7IHRva2VuSWR4IDwgdG9rZW5Db3VudDsgdG9rZW5JZHgrKykge1xyXG4gICAgY29uc3QgdG9rZW4gPSB0b2tlbnNbdG9rZW5JZHhdO1xyXG4gICAgY29uc3QgbmV4dFRva2VuID0gdG9rZW5zW3Rva2VuSWR4ICsgMV07XHJcbiAgICBzd2l0Y2ggKHRva2VuLnR5cGUpIHtcclxuICAgICAgY2FzZSBUb2tlblR5cGUuRGVsaW1pdGVyOlxyXG4gICAgICAgIHBhdHRlcm4gKz0gJy8nO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFRva2VuVHlwZS5TdGF0aWM6XHJcbiAgICAgICAgcGF0dGVybiArPSB0b2tlbi52YWx1ZS5yZXBsYWNlKFJFR0VYX0NIQVJTX1JFLCAnXFxcXCQmJyk7XHJcbiAgICAgICAgc2NvcmVzLnB1c2goTWF0Y2hTY29yZS5zdGF0aWMpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFRva2VuVHlwZS5QYXJhbTpcclxuICAgICAgICBsZXQgcGFyYW1SZWdleHAgPSAnJztcclxuICAgICAgICBpZiAobmV4dFRva2VuICYmIG5leHRUb2tlbi50eXBlID09PSBUb2tlblR5cGUuTEJyYWNrZXQpIHtcclxuICAgICAgICAgIC8vIOi3s+i/h+W9k+WJjVRva2Vu5ZKM5bem5ous5Y+3XHJcbiAgICAgICAgICB0b2tlbklkeCArPSAyO1xyXG4gICAgICAgICAgd2hpbGUgKHRva2Vuc1t0b2tlbklkeF0udHlwZSAhPT0gVG9rZW5UeXBlLlJCcmFja2V0KSB7XHJcbiAgICAgICAgICAgIHBhcmFtUmVnZXhwICs9IHRva2Vuc1t0b2tlbklkeF0udmFsdWU7XHJcbiAgICAgICAgICAgIHRva2VuSWR4Kys7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHBhdHRlcm4gKz0gcGFyYW1SZWdleHAgPyBgKCg/OiR7cGFyYW1SZWdleHB9KSlgIDogYCgke0JBU0VfUEFSQU1fUEFUVEVSTn0pYDtcclxuICAgICAgICBrZXlzLnB1c2godG9rZW4udmFsdWUpO1xyXG4gICAgICAgIHNjb3Jlcy5wdXNoKE1hdGNoU2NvcmUucGFyYW0pO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFRva2VuVHlwZS5XaWxkQ2FyZDpcclxuICAgICAgICBrZXlzLnB1c2godG9rZW4udmFsdWUpO1xyXG4gICAgICAgIHBhdHRlcm4gKz0gYCgoPzoke0JBU0VfUEFSQU1fUEFUVEVSTn0pJHtvbmx5SGFzV2lsZENhcmQgPyAnPycgOiAnJ30oPzovKD86JHtCQVNFX1BBUkFNX1BBVFRFUk59KSkqKWA7XHJcbiAgICAgICAgc2NvcmVzLnB1c2gob25seUhhc1dpbGRDYXJkID8gTWF0Y2hTY29yZS53aWxkY2FyZCA6IE1hdGNoU2NvcmUucGxhY2Vob2xkZXIpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuICBjb25zdCBpc1dpbGRDYXJkID0gbGFzdFRva2VuLnR5cGUgPT09IFRva2VuVHlwZS5XaWxkQ2FyZDtcclxuXHJcbiAgaWYgKCFpc1dpbGRDYXJkICYmICFleGFjdCkge1xyXG4gICAgaWYgKCFzdHJpY3RNb2RlKSB7XHJcbiAgICAgIHBhdHRlcm4gKz0gYCg/Olske2VzY2FwZVN0cihEZWZhdWx0RGVsaW1pdGVyKX1dKD89JCkpP2A7XHJcbiAgICB9XHJcbiAgICBpZiAobGFzdFRva2VuLnR5cGUgIT09IFRva2VuVHlwZS5EZWxpbWl0ZXIpIHtcclxuICAgICAgcGF0dGVybiArPSBgKD89WyR7ZXNjYXBlU3RyKERlZmF1bHREZWxpbWl0ZXIpfV18JClgO1xyXG4gICAgfVxyXG4gIH0gZWxzZSB7XHJcbiAgICBwYXR0ZXJuICs9IHN0cmljdE1vZGUgPyAnJCcgOiBgWyR7ZXNjYXBlU3RyKERlZmF1bHREZWxpbWl0ZXIpfV0/JGA7XHJcbiAgfVxyXG5cclxuICBjb25zdCBmbGFnID0gY2FzZVNlbnNpdGl2ZSA/ICcnIDogJ2knO1xyXG4gIGNvbnN0IHJlZ2V4cCA9IG5ldyBSZWdFeHAocGF0dGVybiwgZmxhZyk7XHJcblxyXG4gIC8qKlxyXG4gICAqIEBkZXNjcmlwdGlvbiDmoLnmja7nu5nlrppQYXR0ZXJu6Kej5p6QcGF0aFxyXG4gICAqL1xyXG4gIGZ1bmN0aW9uIHBhcnNlKHBhdGg6IHN0cmluZyk6IE1hdGNoZWQ8UD4gfCBudWxsIHtcclxuICAgIGNvbnN0IHJlTWF0Y2ggPSBwYXRoLm1hdGNoKHJlZ2V4cCk7XHJcblxyXG4gICAgaWYgKCFyZU1hdGNoKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgY29uc3QgbWF0Y2hlZFBhdGggPSByZU1hdGNoWzBdO1xyXG4gICAgbGV0IHBhcmFtczogUGFyYW1zPFA+ID0ge307XHJcbiAgICBsZXQgcGFyc2VTY29yZTogbnVtYmVyW10gPSBBcnJheS5mcm9tKHNjb3Jlcyk7XHJcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IHJlTWF0Y2gubGVuZ3RoOyBpKyspIHtcclxuICAgICAgbGV0IHBhcmFtID0gcmVNYXRjaFtpXTtcclxuICAgICAgbGV0IGtleSA9IGtleXNbaSAtIDFdO1xyXG4gICAgICBpZiAoa2V5ID09PSAnKicgJiYgcGFyYW0pIHtcclxuICAgICAgICBsZXQgdmFsdWUgPSBwYXJhbS5zcGxpdCgnLycpO1xyXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShwYXJhbXNbJyonXSkpIHtcclxuICAgICAgICAgIHBhcmFtc1snKiddID0gdmFsdWU7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHBhcmFtc1snKiddLnB1c2goLi4udmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyDlrozmiJDpgJrphY3nrKblj4LmlbDop6PmnpDlkI7lsIZwbGFjZWhvbGRlcuabv+aNouS4undpbGRjYXJk5Y+C5pWw55qE5YiG5YC8XHJcbiAgICAgICAgcGFyc2VTY29yZS5zcGxpY2UoXHJcbiAgICAgICAgICBzY29yZXMuaW5kZXhPZihNYXRjaFNjb3JlLnBsYWNlaG9sZGVyKSxcclxuICAgICAgICAgIDEsXHJcbiAgICAgICAgICAuLi5uZXcgQXJyYXkodmFsdWUubGVuZ3RoKS5maWxsKE1hdGNoU2NvcmUud2lsZGNhcmQpLFxyXG4gICAgICAgICk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcGFyYW1zW2tleV0gPSBwYXJhbSA/IHBhcmFtIDogW107XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBpc0V4YWN0ID0gcGF0aCA9PT0gbWF0Y2hlZFBhdGg7XHJcbiAgICBjb25zdCB1cmwgPSBwYXRoID09PSAnLycgJiYgbWF0Y2hlZFBhdGggPT09ICcnID8gJy8nIDogbWF0Y2hlZFBhdGg7XHJcbiAgICByZXR1cm4geyBpc0V4YWN0OiBpc0V4YWN0LCBwYXRoOiBwYXRobmFtZSwgdXJsOiB1cmwsIHNjb3JlOiBwYXJzZVNjb3JlLCBwYXJhbXM6IHBhcmFtcyB9O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQGRlc2NyaXB0aW9uIOS9v+eUqOe7meWumuWPguaVsOWhq+WFhXBhdHRlcm7vvIzlvpfliLDnm67moIdVUkxcclxuICAgKi9cclxuICBmdW5jdGlvbiBjb21waWxlKHBhcmFtczogUGFyYW1zPFA+KTogc3RyaW5nIHtcclxuICAgIGxldCBwYXRoID0gJyc7XHJcbiAgICBmb3IgKGNvbnN0IHRva2VuIG9mIHRva2Vucykge1xyXG4gICAgICBzd2l0Y2ggKHRva2VuLnR5cGUpIHtcclxuICAgICAgICBjYXNlIFRva2VuVHlwZS5TdGF0aWM6XHJcbiAgICAgICAgICBwYXRoICs9IHRva2VuLnZhbHVlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBUb2tlblR5cGUuUGFyYW06XHJcbiAgICAgICAgICBpZiAoIXBhcmFtc1t0b2tlbi52YWx1ZV0pIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQYXJhbSBpcyBpbnZhbGlkLicpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcGF0aCArPSBwYXJhbXNbdG9rZW4udmFsdWVdO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBUb2tlblR5cGUuV2lsZENhcmQ6XHJcbiAgICAgICAgICBsZXQgd2lsZENhcmQgPSBwYXJhbXNbJyonXTtcclxuICAgICAgICAgIGlmICh3aWxkQ2FyZCBpbnN0YW5jZW9mIEFycmF5KSB7XHJcbiAgICAgICAgICAgIHBhdGggKz0gd2lsZENhcmQuam9pbignLycpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcGF0aCArPSB3aWxkQ2FyZDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgVG9rZW5UeXBlLkRlbGltaXRlcjpcclxuICAgICAgICAgIHBhdGggKz0gdG9rZW4udmFsdWU7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHBhdGg7XHJcbiAgfVxyXG5cclxuICByZXR1cm4ge1xyXG4gICAgZ2V0IHJlZ2V4cCgpIHtcclxuICAgICAgcmV0dXJuIHJlZ2V4cDtcclxuICAgIH0sXHJcbiAgICBnZXQga2V5cygpIHtcclxuICAgICAgcmV0dXJuIGtleXM7XHJcbiAgICB9LFxyXG4gICAgY29tcGlsZSxcclxuICAgIHBhcnNlLFxyXG4gIH07XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBAZGVzY3JpcHRpb24g5L6d5qyh5L2/55SocGF0aG5hbWXkuI5wYXR0ZXJu6L+b6KGM5Yy56YWN77yM5qC55o2u5Yy56YWN5YiG5pWw5Y+W5b6X5YiG5pWw5pyA6auY57uT5p6cXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gbWF0Y2hQYXRoPFAgPSBhbnk+KFxyXG4gIHBhdGhuYW1lOiBzdHJpbmcsXHJcbiAgcGF0dGVybjogc3RyaW5nIHwgc3RyaW5nW10sXHJcbiAgb3B0aW9uPzogUGFyc2VyT3B0aW9uLFxyXG4pOiBNYXRjaGVkPFA+IHwgbnVsbCB7XHJcbiAgY29uc3QgcGF0dGVybnMgPSBBcnJheS5pc0FycmF5KHBhdHRlcm4pID8gWy4uLnBhdHRlcm5dIDogW3BhdHRlcm5dO1xyXG4gIGNvbnN0IG1hdGNoZWRSZXN1bHRzOiBNYXRjaGVkPFA+W10gPSBbXTtcclxuICBmb3IgKGNvbnN0IGl0ZW0gb2YgcGF0dGVybnMpIHtcclxuICAgIGNvbnN0IHBhcnNlciA9IGNyZWF0ZVBhdGhQYXJzZXIoaXRlbSwgb3B0aW9uKTtcclxuICAgIGNvbnN0IG1hdGNoZWQgPSBwYXJzZXIucGFyc2UocGF0aG5hbWUpO1xyXG4gICAgaWYgKG1hdGNoZWQpIHtcclxuICAgICAgbWF0Y2hlZFJlc3VsdHMucHVzaChtYXRjaGVkKTtcclxuICAgIH1cclxuICB9XHJcbiAgcmV0dXJuICFtYXRjaGVkUmVzdWx0cy5sZW5ndGggPyBudWxsIDogbWF0Y2hlZFJlc3VsdHMuc29ydCgoYSwgYikgPT4gc2NvcmVDb21wYXJlKGEuc2NvcmUsIGIuc2NvcmUpKVswXTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlUGF0aDxQID0gYW55PihwYXRoOiBzdHJpbmcsIHBhcmFtczogUGFyYW1zPFA+KSB7XHJcbiAgY29uc3QgcGFyc2VyID0gY3JlYXRlUGF0aFBhcnNlcihwYXRoKTtcclxuICByZXR1cm4gcGFyc2VyLmNvbXBpbGUocGFyYW1zKTtcclxufSIsImltcG9ydCB7IHVzZUNvbnRleHQgfSBmcm9tICdyZWFjdCc7XHJcbmltcG9ydCBSb3V0ZXJDb250ZXh0IGZyb20gJy4vY29udGV4dCc7XHJcbmltcG9ydCB7IE1hdGNoZWQsIG1hdGNoUGF0aCwgUGFyYW1zIH0gZnJvbSAnLi9tYXRjaGVyL3BhcnNlcic7XHJcbmltcG9ydCB7IEhpc3RvcnkgfSBmcm9tICcuLi9oaXN0b3J5L3R5cGVzJztcclxuaW1wb3J0IHsgTG9jYXRpb24gfSBmcm9tICcuL2luZGV4JztcclxuXHJcbmZ1bmN0aW9uIHVzZUhpc3Rvcnk8Uz4oKTogSGlzdG9yeTxTPjtcclxuZnVuY3Rpb24gdXNlSGlzdG9yeSgpIHtcclxuICByZXR1cm4gdXNlQ29udGV4dChSb3V0ZXJDb250ZXh0KS5oaXN0b3J5O1xyXG59XHJcblxyXG5mdW5jdGlvbiB1c2VMb2NhdGlvbjxTPigpOiBMb2NhdGlvbjxTPjtcclxuZnVuY3Rpb24gdXNlTG9jYXRpb24oKSB7XHJcbiAgcmV0dXJuIHVzZUNvbnRleHQoUm91dGVyQ29udGV4dCkubG9jYXRpb247XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHVzZVBhcmFtczxQPigpOiBQYXJhbXM8UD4gfCB7fTtcclxuZnVuY3Rpb24gdXNlUGFyYW1zKCkge1xyXG4gIGNvbnN0IG1hdGNoID0gdXNlQ29udGV4dChSb3V0ZXJDb250ZXh0KS5tYXRjaDtcclxuICByZXR1cm4gbWF0Y2ggPyBtYXRjaC5wYXJhbXMgOiB7fTtcclxufVxyXG5cclxuZnVuY3Rpb24gdXNlUm91dGVNYXRjaDxQPihwYXRoPzogc3RyaW5nKTogTWF0Y2hlZDxQPiB8IG51bGw7XHJcbmZ1bmN0aW9uIHVzZVJvdXRlTWF0Y2gocGF0aD86IHN0cmluZykge1xyXG4gIGNvbnN0IHBhdGhuYW1lID0gdXNlTG9jYXRpb24oKS5wYXRobmFtZTtcclxuICBjb25zdCBtYXRjaCA9IHVzZUNvbnRleHQoUm91dGVyQ29udGV4dCkubWF0Y2g7XHJcbiAgaWYgKHBhdGgpIHtcclxuICAgIHJldHVybiBtYXRjaFBhdGgocGF0aG5hbWUsIHBhdGgpO1xyXG4gIH1cclxuICByZXR1cm4gbWF0Y2g7XHJcbn1cclxuXHJcbmV4cG9ydCB7IHVzZUhpc3RvcnksIHVzZUxvY2F0aW9uLCB1c2VQYXJhbXMsIHVzZVJvdXRlTWF0Y2ggfTtcclxuIiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyBIaXN0b3J5LCBMb2NhdGlvbiB9IGZyb20gJy4vaW5kZXgnO1xyXG5pbXBvcnQgeyBNYXRjaGVkLCBtYXRjaFBhdGggfSBmcm9tICcuL21hdGNoZXIvcGFyc2VyJztcclxuaW1wb3J0IHsgdXNlQ29udGV4dCwgQ2hpbGRyZW4sIGNyZWF0ZUVsZW1lbnQgfSBmcm9tICdyZWFjdCc7XHJcbmltcG9ydCBSb3V0ZXJDb250ZXh0IGZyb20gJy4vY29udGV4dCc7XHJcbmltcG9ydCB7IEdldFVSTFBhcmFtcyB9IGZyb20gJy4vbWF0Y2hlci90eXBlcyc7XHJcblxyXG5leHBvcnQgdHlwZSBSb3V0ZUNvbXBvbmVudFByb3BzPFAgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge30sIFMgPSB1bmtub3duPiA9IFJvdXRlQ2hpbGRyZW5Qcm9wczxQLCBTPjtcclxuXHJcbmV4cG9ydCB0eXBlIFJvdXRlQ2hpbGRyZW5Qcm9wczxQIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IHt9LCBTID0gdW5rbm93bj4gPSB7XHJcbiAgaGlzdG9yeTogSGlzdG9yeTxTPjtcclxuICBsb2NhdGlvbjogTG9jYXRpb248Uz47XHJcbiAgbWF0Y2g6IE1hdGNoZWQ8UD4gfCBudWxsXHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIFJvdXRlUHJvcHM8UCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fSwgUGF0aCBleHRlbmRzIHN0cmluZyA9IHN0cmluZz4gPSB7XHJcbiAgbG9jYXRpb24/OiBMb2NhdGlvbjtcclxuICBjb21wb25lbnQ/OiBSZWFjdC5Db21wb25lbnRUeXBlPFJvdXRlQ29tcG9uZW50UHJvcHM8UD4+IHwgUmVhY3QuQ29tcG9uZW50VHlwZTxhbnk+IHwgdW5kZWZpbmVkO1xyXG4gIGNoaWxkcmVuPzogKChwcm9wczogUm91dGVDaGlsZHJlblByb3BzPFA+KSA9PiBSZWFjdC5SZWFjdE5vZGUpIHwgUmVhY3QuUmVhY3ROb2RlO1xyXG4gIHJlbmRlcj86IChwcm9wczogUm91dGVDb21wb25lbnRQcm9wczxQPikgPT4gUmVhY3QuUmVhY3ROb2RlO1xyXG4gIHBhdGg/OiBQYXRoIHwgUGF0aFtdO1xyXG4gIGV4YWN0PzogYm9vbGVhbjtcclxuICBzZW5zaXRpdmU/OiBib29sZWFuO1xyXG4gIHN0cmljdD86IGJvb2xlYW47XHJcbiAgY29tcHV0ZWQ/OiBNYXRjaGVkPFA+O1xyXG59O1xyXG5cclxuZnVuY3Rpb24gUm91dGU8UGF0aCBleHRlbmRzIHN0cmluZywgUCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gPSBHZXRVUkxQYXJhbXM8UGF0aD4+KHByb3BzOiBSb3V0ZVByb3BzPFAsIFBhdGg+KSB7XHJcbiAgY29uc3QgY29udGV4dCA9IHVzZUNvbnRleHQoUm91dGVyQ29udGV4dCk7XHJcblxyXG4gIGNvbnN0IHsgY29tcHV0ZWQsIGxvY2F0aW9uLCBwYXRoIH0gPSBwcm9wcztcclxuICBsZXQgeyBjaGlsZHJlbiwgY29tcG9uZW50LCByZW5kZXIgfSA9IHByb3BzO1xyXG4gIGxldCBtYXRjaDogTWF0Y2hlZDxQPiB8IG51bGw7XHJcblxyXG4gIGNvbnN0IHJvdXRlTG9jYXRpb24gPSBsb2NhdGlvbiB8fCBjb250ZXh0LmxvY2F0aW9uO1xyXG4gIGlmIChjb21wdXRlZCkge1xyXG4gICAgbWF0Y2ggPSBjb21wdXRlZDtcclxuICB9IGVsc2UgaWYgKHBhdGgpIHtcclxuICAgIG1hdGNoID0gbWF0Y2hQYXRoPFA+KHJvdXRlTG9jYXRpb24ucGF0aG5hbWUsIHBhdGgpO1xyXG4gIH0gZWxzZSB7XHJcbiAgICBtYXRjaCA9IGNvbnRleHQubWF0Y2g7XHJcbiAgfVxyXG4gIGNvbnN0IG5ld1Byb3BzID0geyAuLi5jb250ZXh0LCBsb2NhdGlvbjogcm91dGVMb2NhdGlvbiwgbWF0Y2g6IG1hdGNoIH07XHJcblxyXG4gIGlmIChBcnJheS5pc0FycmF5KGNoaWxkcmVuKSAmJiBDaGlsZHJlbi5jb3VudChjaGlsZHJlbikgPT09IDApIHtcclxuICAgIGNoaWxkcmVuID0gbnVsbDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIOaMiemhuuW6j+iOt+WPlumcgOimgea4suafk+eahOe7hOS7tlxyXG4gICAqIDEuY2hpbGRyZW5cclxuICAgKiAyLmNvbXBvbmVudFxyXG4gICAqIDMucmVuZGVyXHJcbiAgICog6YO95rKh5pyJ5Yy56YWN5Yiw6L+U5ZueTnVsbFxyXG4gICAqL1xyXG4gIGNvbnN0IGdldENoaWxkcmVuID0gKCk6IFJlYWN0LlJlYWN0Tm9kZSB8IG51bGwgPT4ge1xyXG4gICAgLy8g5aaC5p6cIG1hdGNoIOWtmOWcqFxyXG4gICAgaWYgKG5ld1Byb3BzLm1hdGNoKSB7XHJcbiAgICAgIGlmIChjaGlsZHJlbikge1xyXG4gICAgICAgIGlmICh0eXBlb2YgY2hpbGRyZW4gPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgIHJldHVybiBjaGlsZHJlbihuZXdQcm9wcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBjaGlsZHJlbjtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGNvbXBvbmVudCkge1xyXG4gICAgICAgIHJldHVybiBjcmVhdGVFbGVtZW50KGNvbXBvbmVudCwgbmV3UHJvcHMpO1xyXG4gICAgICB9IGVsc2UgaWYgKHJlbmRlcikge1xyXG4gICAgICAgIHJldHVybiByZW5kZXIobmV3UHJvcHMpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBtYXRjaOS4um51bGxcclxuICAgICAgaWYgKHR5cGVvZiBjaGlsZHJlbiA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgIHJldHVybiBjaGlsZHJlbihuZXdQcm9wcyk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgcmV0dXJuIDxSb3V0ZXJDb250ZXh0LlByb3ZpZGVyIHZhbHVlPXtuZXdQcm9wc30+e2dldENoaWxkcmVuKCl9PC9Sb3V0ZXJDb250ZXh0LlByb3ZpZGVyPjtcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgUm91dGU7XHJcbiIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcclxuaW1wb3J0IHsgdXNlTGF5b3V0RWZmZWN0LCB1c2VNZW1vLCB1c2VSZWYsIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnO1xyXG5cclxuaW1wb3J0IHsgSGlzdG9yeSwgTG9jYXRpb24gfSBmcm9tICcuLi9oaXN0b3J5L3R5cGVzJztcclxuXHJcbmltcG9ydCBSb3V0ZXJDb250ZXh0LCB7IFJvdXRlckNvbnRleHRWYWx1ZSB9IGZyb20gJy4vY29udGV4dCc7XHJcblxyXG5leHBvcnQgdHlwZSBSb3V0ZXJQcm9wcyA9IHtcclxuICBoaXN0b3J5OiBIaXN0b3J5O1xyXG4gIGNoaWxkcmVuPzogUmVhY3QuUmVhY3ROb2RlO1xyXG59O1xyXG5cclxuZnVuY3Rpb24gUm91dGVyPFAgZXh0ZW5kcyBSb3V0ZXJQcm9wcz4ocHJvcHM6IFApIHtcclxuICBjb25zdCB7IGhpc3RvcnksIGNoaWxkcmVuID0gbnVsbCB9ID0gcHJvcHM7XHJcbiAgY29uc3QgW2xvY2F0aW9uLCBzZXRMb2NhdGlvbl0gPSB1c2VTdGF0ZShwcm9wcy5oaXN0b3J5LmxvY2F0aW9uKTtcclxuICBjb25zdCBwZW5kaW5nTG9jYXRpb24gPSB1c2VSZWY8TG9jYXRpb24gfCBudWxsPihudWxsKTtcclxuXHJcbiAgLy8g5ZyoUm91dGVy5Yqg6L295pe25bCx55uR5ZCsaGlzdG9yeeWcsOWdgOWPmOWMlu+8jOS7peS/neivgeWcqOWni+a4suafk+aXtumHjeWumuWQkeiDveato+ehruinpuWPkVxyXG4gIGxldCB1bkxpc3RlbjogbnVsbCB8ICgoKSA9PiB2b2lkKSA9IGhpc3RvcnkubGlzdGVuKGFyZyA9PiB7XHJcbiAgICBwZW5kaW5nTG9jYXRpb24uY3VycmVudCA9IGFyZy5sb2NhdGlvbjtcclxuICB9KTtcclxuXHJcbiAgLy8g5qih5oufY29tcG9uZW50RGlkTW91bnTlkoxjb21wb25lbnRXaWxsVW5tb3VudFxyXG4gIHVzZUxheW91dEVmZmVjdCgoKSA9PiB7XHJcbiAgICBpZiAodW5MaXN0ZW4pIHtcclxuICAgICAgdW5MaXN0ZW4oKTtcclxuICAgIH1cclxuICAgIC8vIOebkeWQrGhpc3RvcnnkuK3nmoTkvY3nva7lj5jljJZcclxuICAgIHVuTGlzdGVuID0gaGlzdG9yeS5saXN0ZW4oYXJnID0+IHtcclxuICAgICAgc2V0TG9jYXRpb24oYXJnLmxvY2F0aW9uKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGlmIChwZW5kaW5nTG9jYXRpb24uY3VycmVudCkge1xyXG4gICAgICBzZXRMb2NhdGlvbihwZW5kaW5nTG9jYXRpb24uY3VycmVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgaWYgKHVuTGlzdGVuKSB7XHJcbiAgICAgICAgdW5MaXN0ZW4oKTtcclxuICAgICAgICB1bkxpc3RlbiA9IG51bGw7XHJcbiAgICAgICAgcGVuZGluZ0xvY2F0aW9uLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gIH0sIFtdKTtcclxuXHJcbiAgY29uc3QgaW5pdENvbnRleHRWYWx1ZTogUm91dGVyQ29udGV4dFZhbHVlID0gdXNlTWVtbyhcclxuICAgICgpID0+ICh7XHJcbiAgICAgIGhpc3Rvcnk6IGhpc3RvcnksXHJcbiAgICAgIGxvY2F0aW9uOiBsb2NhdGlvbixcclxuICAgICAgbWF0Y2g6IHsgaXNFeGFjdDogbG9jYXRpb24ucGF0aG5hbWUgPT09ICcvJywgcGFyYW1zOiB7fSwgcGF0aDogJy8nLCBzY29yZTogW10sIHVybDogJy8nIH0sXHJcbiAgICB9KSxcclxuICAgIFtsb2NhdGlvbl0sXHJcbiAgKTtcclxuXHJcbiAgcmV0dXJuIDxSb3V0ZXJDb250ZXh0LlByb3ZpZGVyIHZhbHVlPXtpbml0Q29udGV4dFZhbHVlfSBjaGlsZHJlbj17Y2hpbGRyZW59IC8+O1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBSb3V0ZXI7XHJcbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHNvdXJjZSwgZXhjbHVkZWQpIHtcbiAgaWYgKHNvdXJjZSA9PSBudWxsKSByZXR1cm4ge307XG4gIHZhciB0YXJnZXQgPSB7fTtcbiAgdmFyIHNvdXJjZUtleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpO1xuICB2YXIga2V5LCBpO1xuICBmb3IgKGkgPSAwOyBpIDwgc291cmNlS2V5cy5sZW5ndGg7IGkrKykge1xuICAgIGtleSA9IHNvdXJjZUtleXNbaV07XG4gICAgaWYgKGV4Y2x1ZGVkLmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTtcbiAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICB9XG4gIHJldHVybiB0YXJnZXQ7XG59IiwiaW1wb3J0IHsgdXNlTGF5b3V0RWZmZWN0LCB1c2VSZWYgfSBmcm9tICdyZWFjdCc7XHJcblxyXG5leHBvcnQgdHlwZSBMaWZlQ3ljbGVQcm9wcyA9IHtcclxuICBvbk1vdW50PzogKCkgPT4gdm9pZDtcclxuICBvblVwZGF0ZT86IChwcmV2UHJvcHM/OiBMaWZlQ3ljbGVQcm9wcykgPT4gdm9pZDtcclxuICBvblVubW91bnQ/OiAoKSA9PiB2b2lkO1xyXG4gIGRhdGE/OiBhbnk7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gTGlmZUN5Y2xlKHByb3BzOiBMaWZlQ3ljbGVQcm9wcykge1xyXG4gIC8vIOS9v+eUqHJlZuS/neWtmOS4iuS4gOasoeeahHByb3Bz77yM6Ziy5q2i6YeN5paw5riy5p+TXHJcbiAgY29uc3QgcHJldlByb3BzID0gdXNlUmVmPExpZmVDeWNsZVByb3BzIHwgbnVsbD4obnVsbCk7XHJcbiAgY29uc3QgaXNNb3VudCA9IHVzZVJlZihmYWxzZSk7XHJcblxyXG4gIGNvbnN0IHsgb25Nb3VudCwgb25VcGRhdGUsIG9uVW5tb3VudCB9ID0gcHJvcHM7XHJcblxyXG4gIHVzZUxheW91dEVmZmVjdCgoKSA9PiB7XHJcbiAgICAvLyDpppbmrKHmjILovb0g5qih5oufY29tcG9uZW50RGlkTW91bnRcclxuICAgIGlmICghaXNNb3VudC5jdXJyZW50KSB7XHJcbiAgICAgIGlzTW91bnQuY3VycmVudCA9IHRydWU7XHJcbiAgICAgIGlmIChvbk1vdW50KSB7XHJcbiAgICAgICAgb25Nb3VudCgpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyDkuI3mmK/pppbmrKHmuLLmn5Mg5qih5oufY29tcG9uZW50RGlkVXBkYXRlXHJcbiAgICAgIGlmIChvblVwZGF0ZSkge1xyXG4gICAgICAgIHByZXZQcm9wcy5jdXJyZW50ID8gb25VcGRhdGUocHJldlByb3BzLmN1cnJlbnQpIDogb25VcGRhdGUoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcHJldlByb3BzLmN1cnJlbnQgPSBwcm9wcztcclxuICB9KTtcclxuXHJcbiAgLy8g5qih5oufY29tcG9uZW50V2lsbFVubW91bnRcclxuICB1c2VMYXlvdXRFZmZlY3QoKCkgPT4ge1xyXG4gICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgaWYgKG9uVW5tb3VudCkge1xyXG4gICAgICAgIG9uVW5tb3VudCgpO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gIH0sIFtdKTtcclxuXHJcbiAgcmV0dXJuIG51bGw7XHJcbn1cclxuIiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyB1c2VDb250ZXh0IH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgUm91dGVyQ29udGV4dCBmcm9tICcuL2NvbnRleHQnO1xyXG5pbXBvcnQgeyBMaWZlQ3ljbGUsIExpZmVDeWNsZVByb3BzIH0gZnJvbSAnLi9saWZlQ3ljbGVIb29rJztcclxuaW1wb3J0IHsgTWF0Y2hlZCwgY3JlYXRlUGF0aFBhcnNlciB9IGZyb20gJy4vbWF0Y2hlci9wYXJzZXInO1xyXG5pbXBvcnQgeyBhZGRIZWFkU2xhc2gsIGlzTG9jYXRpb25FcXVhbCwgcGFyc2VQYXRoIH0gZnJvbSAnLi4vaGlzdG9yeS91dGlscyc7XHJcbmltcG9ydCB7IExvY2F0aW9uIH0gZnJvbSAnLi9pbmRleCc7XHJcblxyXG5leHBvcnQgdHlwZSBSZWRpcmVjdFByb3BzID0ge1xyXG4gIHRvOiBzdHJpbmcgfCBQYXJ0aWFsPExvY2F0aW9uPjtcclxuICBwdXNoPzogYm9vbGVhbjtcclxuICBwYXRoPzogc3RyaW5nO1xyXG4gIGZyb20/OiBzdHJpbmc7XHJcbiAgZXhhY3Q/OiBib29sZWFuO1xyXG4gIHN0cmljdD86IGJvb2xlYW47XHJcblxyXG4gIC8vIOeUsVN3aXRjaOiuoeeul+W+l+WIsFxyXG4gIHJlYWRvbmx5IGNvbXB1dGVkPzogTWF0Y2hlZCB8IG51bGw7XHJcbn07XHJcblxyXG5mdW5jdGlvbiBSZWRpcmVjdDxQIGV4dGVuZHMgUmVkaXJlY3RQcm9wcz4ocHJvcHM6IFApIHtcclxuICBjb25zdCB7IHRvLCBwdXNoID0gZmFsc2UsIGNvbXB1dGVkIH0gPSBwcm9wcztcclxuXHJcbiAgY29uc3QgY29udGV4dCA9IHVzZUNvbnRleHQoUm91dGVyQ29udGV4dCk7XHJcbiAgY29uc3QgeyBoaXN0b3J5IH0gPSBjb250ZXh0O1xyXG5cclxuICBjb25zdCBjYWxjTG9jYXRpb24gPSAoKTogUGFydGlhbDxMb2NhdGlvbj4gPT4ge1xyXG4gICAgaWYgKGNvbXB1dGVkKSB7XHJcbiAgICAgIGlmICh0eXBlb2YgdG8gPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgY29uc3QgcGFyc2VyID0gY3JlYXRlUGF0aFBhcnNlcih0byk7XHJcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gcGFyc2VyLmNvbXBpbGUoY29tcHV0ZWQucGFyYW1zKTtcclxuICAgICAgICByZXR1cm4gcGFyc2VQYXRoKHRhcmdldCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc3QgcGF0aG5hbWUgPSB0by5wYXRobmFtZSA/IGFkZEhlYWRTbGFzaCh0by5wYXRobmFtZSkgOiAnLyc7XHJcbiAgICAgICAgY29uc3QgcGFyc2VyID0gY3JlYXRlUGF0aFBhcnNlcihwYXRobmFtZSk7XHJcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gcGFyc2VyLmNvbXBpbGUoY29tcHV0ZWQucGFyYW1zKTtcclxuICAgICAgICByZXR1cm4geyAuLi50bywgcGF0aG5hbWU6IHRhcmdldCB9O1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHlwZW9mIHRvID09PSAnc3RyaW5nJyA/IHBhcnNlUGF0aCh0bykgOiB0bztcclxuICB9O1xyXG5cclxuICBjb25zdCBuYXZpZ2F0ZSA9IHB1c2ggPyBoaXN0b3J5LnB1c2ggOiBoaXN0b3J5LnJlcGxhY2U7XHJcbiAgY29uc3QgeyBzdGF0ZSwgLi4ucGF0aCB9ID0gY2FsY0xvY2F0aW9uKCk7XHJcblxyXG4gIGNvbnN0IG9uTW91bnRGdW5jID0gKCkgPT4ge1xyXG4gICAgbmF2aWdhdGUocGF0aCwgc3RhdGUpO1xyXG4gIH07XHJcblxyXG4gIGNvbnN0IG9uVXBkYXRlRnVuYyA9IChwcmV2UHJvcHM/OiBMaWZlQ3ljbGVQcm9wcykgPT4ge1xyXG4gICAgLy8g5aaC5p6c5b2T5YmN6aG16Z2i5LiO6YeN5a6a5ZCR5YmN6aG16Z2i5LiN5LiA6Ie077yM5omn6KGM6Lez6L2sXHJcbiAgICBjb25zdCBwcmV2UGF0aCA9IHByZXZQcm9wcz8uZGF0YSBhcyBMb2NhdGlvbjtcclxuICAgIGlmICghaXNMb2NhdGlvbkVxdWFsKHByZXZQYXRoLCBwYXRoKSkge1xyXG4gICAgICBuYXZpZ2F0ZShwYXRoLCBzdGF0ZSk7XHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgcmV0dXJuIDxMaWZlQ3ljbGUgb25Nb3VudD17b25Nb3VudEZ1bmN9IG9uVXBkYXRlPXtvblVwZGF0ZUZ1bmN9IGRhdGE9e3BhdGh9IC8+O1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBSZWRpcmVjdDtcclxuIiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyB1c2VDb250ZXh0LCBDaGlsZHJlbiwgaXNWYWxpZEVsZW1lbnQsIGNsb25lRWxlbWVudCB9IGZyb20gJ3JlYWN0JztcclxuXHJcbmltcG9ydCB7IExvY2F0aW9uIH0gZnJvbSAnLi9pbmRleCc7XHJcbmltcG9ydCBSb3V0ZXJDb250ZXh0IGZyb20gJy4vY29udGV4dCc7XHJcbmltcG9ydCB7IE1hdGNoZWQsIG1hdGNoUGF0aCB9IGZyb20gJy4vbWF0Y2hlci9wYXJzZXInO1xyXG5pbXBvcnQgUm91dGUsIHsgUm91dGVQcm9wcyB9IGZyb20gJy4vUm91dGUnO1xyXG5pbXBvcnQgUmVkaXJlY3QsIHsgUmVkaXJlY3RQcm9wcyB9IGZyb20gJy4vUmVkaXJlY3QnO1xyXG5cclxuZXhwb3J0IHR5cGUgU3dpdGNoUHJvcHMgPSB7XHJcbiAgbG9jYXRpb24/OiBMb2NhdGlvbjtcclxuICBjaGlsZHJlbj86IFJlYWN0LlJlYWN0Tm9kZTtcclxufTtcclxuXHJcbmZ1bmN0aW9uIFN3aXRjaDxQIGV4dGVuZHMgU3dpdGNoUHJvcHM+KHByb3BzOiBQKTogUmVhY3QuUmVhY3RFbGVtZW50IHwgbnVsbCB7XHJcbiAgY29uc3QgY29udGV4dCA9IHVzZUNvbnRleHQoUm91dGVyQ29udGV4dCk7XHJcbiAgY29uc3QgbG9jYXRpb24gPSBwcm9wcy5sb2NhdGlvbiB8fCBjb250ZXh0LmxvY2F0aW9uO1xyXG5cclxuICBsZXQgZWxlbWVudDogUmVhY3QuUmVhY3RFbGVtZW50IHwgbnVsbCA9IG51bGw7XHJcbiAgbGV0IG1hdGNoOiBNYXRjaGVkIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIC8vIOS9v+eUqGZvckVhY2jkuI3kvJrnu5lSZWFjdC5SZWFjdE5vZGXlop7liqBrZXnlsZ7mgKcs6Ziy5q2i6YeN5paw5riy5p+TXHJcbiAgQ2hpbGRyZW4uZm9yRWFjaChwcm9wcy5jaGlsZHJlbiwgbm9kZSA9PiB7XHJcbiAgICBpZiAobWF0Y2ggPT09IG51bGwgJiYgaXNWYWxpZEVsZW1lbnQobm9kZSkpIHtcclxuICAgICAgZWxlbWVudCA9IG5vZGU7XHJcblxyXG4gICAgICBsZXQgc3RyaWN0OiBib29sZWFuIHwgdW5kZWZpbmVkO1xyXG4gICAgICBsZXQgc2Vuc2l0aXZlOiBib29sZWFuIHwgdW5kZWZpbmVkO1xyXG4gICAgICBsZXQgcGF0aDogc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQ7XHJcbiAgICAgIGxldCBmcm9tOiBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcblxyXG4gICAgICAvLyBub2Rl5Y+v6IO95pivUm91dGXlkoxSZWRpcmVjdFxyXG4gICAgICBpZiAobm9kZS50eXBlID09PSBSb3V0ZSkge1xyXG4gICAgICAgIGNvbnN0IHByb3BzID0gbm9kZS5wcm9wcyBhcyBSb3V0ZVByb3BzO1xyXG4gICAgICAgIHN0cmljdCA9IHByb3BzLnN0cmljdDtcclxuICAgICAgICBzZW5zaXRpdmUgPSBwcm9wcy5zZW5zaXRpdmU7XHJcbiAgICAgICAgcGF0aCA9IHByb3BzLnBhdGg7XHJcbiAgICAgIH0gZWxzZSBpZiAobm9kZS50eXBlID09PSBSZWRpcmVjdCkge1xyXG4gICAgICAgIGNvbnN0IHByb3BzID0gbm9kZS5wcm9wcyBhcyBSZWRpcmVjdFByb3BzO1xyXG4gICAgICAgIHBhdGggPSBwcm9wcy5wYXRoO1xyXG4gICAgICAgIHN0cmljdCA9IHByb3BzLnN0cmljdDtcclxuICAgICAgICBmcm9tID0gcHJvcHMuZnJvbTtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgZXhhY3QgPSBub2RlLnByb3BzLmV4YWN0O1xyXG4gICAgICBjb25zdCB0YXJnZXQgPSBwYXRoIHx8IGZyb207XHJcblxyXG4gICAgICAvLyDmm7TmlrDljLnphY3nirbmgIHvvIzkuIDml6bljLnphY3liLDlgZzmraLpgY3ljoZcclxuICAgICAgaWYgKHRhcmdldCkge1xyXG4gICAgICAgIG1hdGNoID0gbWF0Y2hQYXRoKGxvY2F0aW9uLnBhdGhuYW1lLCB0YXJnZXQsIHtcclxuICAgICAgICAgIHN0cmljdE1vZGU6IHN0cmljdCxcclxuICAgICAgICAgIGNhc2VTZW5zaXRpdmU6IHNlbnNpdGl2ZSxcclxuICAgICAgICAgIGV4YWN0OiBleGFjdCxcclxuICAgICAgICB9KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBtYXRjaCA9IGNvbnRleHQubWF0Y2g7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9KTtcclxuXHJcbiAgaWYgKG1hdGNoICYmIGVsZW1lbnQpIHtcclxuICAgIC8vIOS9v+eUqGNsb25lRWxlbWVudOWkjeWItuW3suaciee7hOS7tuW5tuabtOaWsOWFtlByb3BzXHJcbiAgICByZXR1cm4gY2xvbmVFbGVtZW50KGVsZW1lbnQsIHsgbG9jYXRpb246IGxvY2F0aW9uLCBjb21wdXRlZDogbWF0Y2ggfSk7XHJcbiAgfVxyXG4gIHJldHVybiBudWxsO1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBTd2l0Y2g7XHJcbiIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcclxuaW1wb3J0IHsgdXNlQ29udGV4dCB9IGZyb20gJ3JlYWN0JztcclxuaW1wb3J0IHsgTGlmZUN5Y2xlLCBMaWZlQ3ljbGVQcm9wcyB9IGZyb20gJy4vbGlmZUN5Y2xlSG9vayc7XHJcbmltcG9ydCB7IExvY2F0aW9uIH0gZnJvbSAnLi9pbmRleCc7XHJcbmltcG9ydCB7IEFjdGlvbiB9IGZyb20gJy4uL2hpc3RvcnkvdHlwZXMnO1xyXG5pbXBvcnQgUm91dGVyQ29udGV4dCBmcm9tICcuL2NvbnRleHQnO1xyXG5cclxudHlwZSBQcm9tcHRQcm9wcyA9IHtcclxuICBtZXNzYWdlPzogc3RyaW5nIHwgKChsb2NhdGlvbjogUGFydGlhbDxMb2NhdGlvbj4sIGFjdGlvbjogQWN0aW9uKSA9PiB2b2lkKTtcclxuICB3aGVuPzogYm9vbGVhbiB8ICgobG9jYXRpb246IFBhcnRpYWw8TG9jYXRpb24+KSA9PiBib29sZWFuKTtcclxufTtcclxuXHJcbmZ1bmN0aW9uIFByb21wdDxQIGV4dGVuZHMgUHJvbXB0UHJvcHM+KHByb3BzOiBQKSB7XHJcbiAgY29uc3QgY29udGV4dCA9IHVzZUNvbnRleHQoUm91dGVyQ29udGV4dCk7XHJcblxyXG4gIGNvbnN0IHsgbWVzc2FnZSwgd2hlbiA9IHRydWUgfSA9IHByb3BzO1xyXG5cclxuICBpZiAoKHR5cGVvZiB3aGVuID09PSAnZnVuY3Rpb24nICYmIHdoZW4oY29udGV4dC5sb2NhdGlvbikgPT09IGZhbHNlKSB8fCAhd2hlbikge1xyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICBjb25zdCBuYXZpZ2F0ZSA9IGNvbnRleHQuaGlzdG9yeS5ibG9jaztcclxuXHJcbiAgbGV0IHJlbGVhc2U6ICgoKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xyXG5cclxuICBjb25zdCBvbk1vdW50RnVuYyA9ICgpID0+IHtcclxuICAgIHJlbGVhc2UgPSBtZXNzYWdlID8gbmF2aWdhdGUobWVzc2FnZSkgOiBudWxsO1xyXG4gIH07XHJcblxyXG4gIGNvbnN0IG9uVXBkYXRlRnVuYyA9IChwcmV2UHJvcHM/OiBMaWZlQ3ljbGVQcm9wcykgPT4ge1xyXG4gICAgaWYgKHByZXZQcm9wcyAmJiBwcmV2UHJvcHMuZGF0YSAhPT0gbWVzc2FnZSkge1xyXG4gICAgICBpZiAocmVsZWFzZSkge1xyXG4gICAgICAgIHJlbGVhc2UoKTtcclxuICAgICAgfVxyXG4gICAgICByZWxlYXNlID0gbWVzc2FnZSA/IG5hdmlnYXRlKG1lc3NhZ2UpIDogbnVsbDtcclxuICAgIH1cclxuICB9O1xyXG5cclxuICBjb25zdCBvblVubW91bnRGdW5jID0gKCkgPT4ge1xyXG4gICAgaWYgKHJlbGVhc2UpIHtcclxuICAgICAgcmVsZWFzZSgpO1xyXG4gICAgfVxyXG4gICAgcmVsZWFzZSA9IG51bGw7XHJcbiAgfTtcclxuXHJcbiAgcmV0dXJuIDxMaWZlQ3ljbGUgb25Nb3VudD17b25Nb3VudEZ1bmN9IG9uVXBkYXRlPXtvblVwZGF0ZUZ1bmN9IG9uVW5tb3VudD17b25Vbm1vdW50RnVuY30gZGF0YT17bWVzc2FnZX0gLz47XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFByb21wdDtcclxuIiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyB1c2VDb250ZXh0IH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgUm91dGVyQ29udGV4dCBmcm9tICcuL2NvbnRleHQnO1xyXG5cclxuZnVuY3Rpb24gd2l0aFJvdXRlcjxDIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50VHlwZT4oQ29tcG9uZW50OiBDKSB7XHJcblxyXG4gIGZ1bmN0aW9uIENvbXBvbmVudFdpdGhSb3V0ZXJQcm9wKHByb3BzOiBhbnkpIHtcclxuICAgIGNvbnN0IHsgaGlzdG9yeSwgbG9jYXRpb24sIG1hdGNoIH0gPSB1c2VDb250ZXh0KFJvdXRlckNvbnRleHQpO1xyXG4gICAgY29uc3Qgcm91dGVQcm9wcyA9IHsgaGlzdG9yeTogaGlzdG9yeSwgbG9jYXRpb246IGxvY2F0aW9uLCBtYXRjaDogbWF0Y2ggfTtcclxuXHJcbiAgICByZXR1cm4gPENvbXBvbmVudCB7Li4ucHJvcHN9IHsuLi5yb3V0ZVByb3BzfSAvPjtcclxuICB9XHJcblxyXG4gIHJldHVybiBDb21wb25lbnRXaXRoUm91dGVyUHJvcDtcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgd2l0aFJvdXRlcjsiLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XHJcbmltcG9ydCB7IHVzZVJlZiB9IGZyb20gJ3JlYWN0JztcclxuaW1wb3J0IHsgSGlzdG9yeSB9IGZyb20gJy4uL2hpc3RvcnkvdHlwZXMnO1xyXG5pbXBvcnQgeyBCYXNlUm91dGVyUHJvcHMgfSBmcm9tICcuL0Jyb3dzZXJSb3V0ZXInO1xyXG5pbXBvcnQgeyBjcmVhdGVIYXNoSGlzdG9yeSwgdXJsSGFzaFR5cGUgfSBmcm9tICcuLi9oaXN0b3J5L2hhc2hIaXN0b3J5JztcclxuaW1wb3J0IFJvdXRlciBmcm9tICcuL1JvdXRlcic7XHJcblxyXG5leHBvcnQgdHlwZSBIYXNoUm91dGVyUHJvcHMgPSBCYXNlUm91dGVyUHJvcHMgJiB7XHJcbiAgaGFzaFR5cGU6IHVybEhhc2hUeXBlO1xyXG59O1xyXG5cclxuZnVuY3Rpb24gSGFzaFJvdXRlcjxQIGV4dGVuZHMgUGFydGlhbDxIYXNoUm91dGVyUHJvcHM+Pihwcm9wczogUCkge1xyXG4gIGxldCBoaXN0b3J5UmVmID0gdXNlUmVmPEhpc3Rvcnk+KCk7XHJcbiAgaWYgKGhpc3RvcnlSZWYuY3VycmVudCA9PT0gbnVsbCB8fCBoaXN0b3J5UmVmLmN1cnJlbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgaGlzdG9yeVJlZi5jdXJyZW50ID0gY3JlYXRlSGFzaEhpc3Rvcnkoe1xyXG4gICAgICBiYXNlbmFtZTogcHJvcHMuYmFzZW5hbWUsXHJcbiAgICAgIGdldFVzZXJDb25maXJtYXRpb246IHByb3BzLmdldFVzZXJDb25maXJtYXRpb24sXHJcbiAgICAgIGhhc2hUeXBlOiBwcm9wcy5oYXNoVHlwZSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIDxSb3V0ZXIgaGlzdG9yeT17aGlzdG9yeVJlZi5jdXJyZW50fT57cHJvcHMuY2hpbGRyZW59PC9Sb3V0ZXI+O1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBIYXNoUm91dGVyOyIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcclxuaW1wb3J0IHsgdXNlUmVmLCBSZWFjdE5vZGUgfSBmcm9tICdyZWFjdCc7XHJcbmltcG9ydCBSb3V0ZXIgZnJvbSAnLi9Sb3V0ZXInO1xyXG5pbXBvcnQgeyBjcmVhdGVCcm93c2VySGlzdG9yeSB9IGZyb20gJy4uL2hpc3RvcnkvYnJvd2VySGlzdG9yeSc7XHJcbmltcG9ydCB7IENvbmZpcm1hdGlvbkZ1bmMsIEhpc3RvcnkgfSBmcm9tICcuLi9oaXN0b3J5L3R5cGVzJztcclxuXHJcbmV4cG9ydCB0eXBlIEJhc2VSb3V0ZXJQcm9wcyA9IHtcclxuICBiYXNlbmFtZTogc3RyaW5nO1xyXG4gIGdldFVzZXJDb25maXJtYXRpb246IENvbmZpcm1hdGlvbkZ1bmM7XHJcbiAgY2hpbGRyZW4/OiBSZWFjdE5vZGU7XHJcbn07XHJcblxyXG5leHBvcnQgdHlwZSBCcm93c2VyUm91dGVyUHJvcHMgPSBCYXNlUm91dGVyUHJvcHMgJiB7XHJcbiAgZm9yY2VSZWZyZXNoOiBib29sZWFuO1xyXG59O1xyXG5cclxuZnVuY3Rpb24gQnJvd3NlclJvdXRlcjxQIGV4dGVuZHMgUGFydGlhbDxCcm93c2VyUm91dGVyUHJvcHM+Pihwcm9wczogUCkge1xyXG4gIC8vIOS9v+eUqFJlZuaMgeaciUhpc3Rvcnnlr7nosaHvvIzpmLLmraLph43lpI3muLLmn5NcclxuICBsZXQgaGlzdG9yeVJlZiA9IHVzZVJlZjxIaXN0b3J5PigpO1xyXG5cclxuICBpZiAoaGlzdG9yeVJlZi5jdXJyZW50ID09PSBudWxsIHx8IGhpc3RvcnlSZWYuY3VycmVudCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICBoaXN0b3J5UmVmLmN1cnJlbnQgPSBjcmVhdGVCcm93c2VySGlzdG9yeSh7XHJcbiAgICAgIGJhc2VuYW1lOiBwcm9wcy5iYXNlbmFtZSxcclxuICAgICAgZm9yY2VSZWZyZXNoOiBwcm9wcy5mb3JjZVJlZnJlc2gsXHJcbiAgICAgIGdldFVzZXJDb25maXJtYXRpb246IHByb3BzLmdldFVzZXJDb25maXJtYXRpb24sXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHJldHVybiA8Um91dGVyIGhpc3Rvcnk9e2hpc3RvcnlSZWYuY3VycmVudH0+e3Byb3BzLmNoaWxkcmVufTwvUm91dGVyPjtcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgQnJvd3NlclJvdXRlcjsiLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XHJcbmltcG9ydCB7IHVzZUNvbnRleHQgfSBmcm9tICdyZWFjdCc7XHJcbmltcG9ydCBSb3V0ZXJDb250ZXh0IGZyb20gJy4vY29udGV4dCc7XHJcbmltcG9ydCB7IExvY2F0aW9uIH0gZnJvbSAnLi9pbmRleCc7XHJcbmltcG9ydCB7IGNyZWF0ZVBhdGgsIHBhcnNlUGF0aCB9IGZyb20gJy4uL2hpc3RvcnkvdXRpbHMnO1xyXG5pbXBvcnQgeyBQYXRoIH0gZnJvbSAnLi4vaGlzdG9yeS90eXBlcyc7XHJcblxyXG5leHBvcnQgdHlwZSBMaW5rUHJvcHMgPSB7XHJcbiAgY29tcG9uZW50PzogUmVhY3QuQ29tcG9uZW50VHlwZTxhbnk+O1xyXG4gIHRvOiBQYXJ0aWFsPExvY2F0aW9uPiB8IHN0cmluZyB8ICgobG9jYXRpb246IExvY2F0aW9uKSA9PiBzdHJpbmcgfCBQYXJ0aWFsPExvY2F0aW9uPik7XHJcbiAgcmVwbGFjZT86IGJvb2xlYW47XHJcbiAgdGFnPzogc3RyaW5nO1xyXG4gIC8qKlxyXG4gICAqIEBkZXByZWNhdGVkXHJcbiAgICogUmVhY3QxNuS7peWQjuS4jeWGjemcgOimgeivpeWxnuaAp1xyXG4gICAqKi9cclxuICBpbm5lclJlZj86IFJlYWN0LlJlZjxIVE1MQW5jaG9yRWxlbWVudD47XHJcbn0gJiBSZWFjdC5BbmNob3JIVE1MQXR0cmlidXRlczxIVE1MQW5jaG9yRWxlbWVudD47XHJcblxyXG5jb25zdCBpc01vZGlmaWVkRXZlbnQgPSAoZXZlbnQ6IFJlYWN0Lk1vdXNlRXZlbnQpID0+IHtcclxuICByZXR1cm4gZXZlbnQubWV0YUtleSB8fCBldmVudC5hbHRLZXkgfHwgZXZlbnQuY3RybEtleSB8fCBldmVudC5zaGlmdEtleTtcclxufTtcclxuXHJcbmNvbnN0IGNoZWNrVGFyZ2V0ID0gKHRhcmdldD86IFJlYWN0LkhUTUxBdHRyaWJ1dGVBbmNob3JUYXJnZXQpID0+IHtcclxuICByZXR1cm4gIXRhcmdldCB8fCB0YXJnZXQgPT09ICdfc2VsZic7XHJcbn07XHJcblxyXG5cclxuZnVuY3Rpb24gTGluazxQIGV4dGVuZHMgTGlua1Byb3BzPihwcm9wczogUCkge1xyXG4gIGNvbnN0IHsgdG8sIHJlcGxhY2UsIGNvbXBvbmVudCwgb25DbGljaywgdGFyZ2V0LCAuLi5vdGhlciB9ID0gcHJvcHM7XHJcblxyXG4gIGNvbnN0IHRhZyA9IHByb3BzLnRhZyB8fCAnYSc7XHJcblxyXG4gIGNvbnN0IGNvbnRleHQgPSB1c2VDb250ZXh0KFJvdXRlckNvbnRleHQpO1xyXG4gIGNvbnN0IGhpc3RvcnkgPSBjb250ZXh0Lmhpc3Rvcnk7XHJcblxyXG4gIGxldCBsb2NhdGlvbiA9IHR5cGVvZiB0byA9PT0gJ2Z1bmN0aW9uJyA/IHRvKGNvbnRleHQubG9jYXRpb24pIDogdG87XHJcblxyXG4gIGxldCBzdGF0ZTogYW55O1xyXG4gIGxldCBwYXRoOiBQYXJ0aWFsPFBhdGg+O1xyXG4gIGlmICh0eXBlb2YgbG9jYXRpb24gPT09ICdzdHJpbmcnKSB7XHJcbiAgICBwYXRoID0gcGFyc2VQYXRoKGxvY2F0aW9uKTtcclxuICB9IGVsc2Uge1xyXG4gICAgY29uc3QgeyBwYXRobmFtZSwgaGFzaCwgc2VhcmNoIH0gPSBsb2NhdGlvbjtcclxuICAgIHBhdGggPSB7IHBhdGhuYW1lLCBoYXNoLCBzZWFyY2ggfTtcclxuICAgIHN0YXRlID0gbG9jYXRpb24uc3RhdGU7XHJcbiAgfVxyXG4gIGNvbnN0IGhyZWYgPSBoaXN0b3J5LmNyZWF0ZUhyZWYocGF0aCk7XHJcblxyXG4gIGNvbnN0IGxpbmtDbGlja0V2ZW50ID0gKGV2ZW50OiBSZWFjdC5Nb3VzZUV2ZW50PEhUTUxBbmNob3JFbGVtZW50PikgPT4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgaWYgKG9uQ2xpY2spIHtcclxuICAgICAgICBvbkNsaWNrKGV2ZW50KTtcclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICB0aHJvdyBlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghZXZlbnQuZGVmYXVsdFByZXZlbnRlZCAmJiBldmVudC5idXR0b24gPT09IDAgJiYgY2hlY2tUYXJnZXQodGFyZ2V0KSAmJiAhaXNNb2RpZmllZEV2ZW50KGV2ZW50KSkge1xyXG4gICAgICAvLyDkuI3mmK/nm7jlkIznmoTot6/lvoTmiafooYxwdXNo5pON5L2c77yM5piv55u45ZCM55qE6Lev5b6E5omn6KGMcmVwbGFjZVxyXG4gICAgICBjb25zdCBpc1NhbWVQYXRoID0gY3JlYXRlUGF0aChjb250ZXh0LmxvY2F0aW9uKSA9PT0gY3JlYXRlUGF0aChwYXRoKTtcclxuICAgICAgY29uc3QgbmF2aWdhdGUgPSByZXBsYWNlIHx8IGlzU2FtZVBhdGggPyBoaXN0b3J5LnJlcGxhY2UgOiBoaXN0b3J5LnB1c2g7XHJcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgIG5hdmlnYXRlKHBhdGgsIHN0YXRlKTtcclxuICAgIH1cclxuICB9O1xyXG5cclxuICBjb25zdCBsaW5rUHJvcHMgPSB7IGhyZWY6IGhyZWYsIG9uQ2xpY2s6IGxpbmtDbGlja0V2ZW50LCAuLi5vdGhlciB9O1xyXG4gIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KHRhZywgbGlua1Byb3BzKTtcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgTGluazsiLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XHJcbmltcG9ydCB7IHVzZUNvbnRleHQgfSBmcm9tICdyZWFjdCc7XHJcbmltcG9ydCB0eXBlIHsgTGlua1Byb3BzIH0gZnJvbSAnLi9MaW5rJztcclxuaW1wb3J0IExpbmsgZnJvbSAnLi9MaW5rJztcclxuaW1wb3J0IHsgTG9jYXRpb24sIG1hdGNoUGF0aCB9IGZyb20gJy4vaW5kZXgnO1xyXG5pbXBvcnQgeyBNYXRjaGVkIH0gZnJvbSAnLi9tYXRjaGVyL3BhcnNlcic7XHJcbmltcG9ydCBDb250ZXh0IGZyb20gJy4vY29udGV4dCc7XHJcbmltcG9ydCB7IHBhcnNlUGF0aCB9IGZyb20gJy4uL2hpc3RvcnkvdXRpbHMnO1xyXG5pbXBvcnQgeyBlc2NhcGVTdHIgfSBmcm9tICcuL21hdGNoZXIvdXRpbHMnO1xyXG5cclxudHlwZSBOYXZMaW5rUHJvcHMgPSB7XHJcbiAgdG86IFBhcnRpYWw8TG9jYXRpb24+IHwgc3RyaW5nIHwgKChsb2NhdGlvbjogTG9jYXRpb24pID0+IHN0cmluZyB8IFBhcnRpYWw8TG9jYXRpb24+KTtcclxuICBpc0FjdGl2ZT86IChtYXRjaDogTWF0Y2hlZCB8IG51bGwsIGxvY2F0aW9uOiBMb2NhdGlvbikgPT4gYm9vbGVhbjtcclxuICAvLyBjb21wYXQgcmVhY3Qtcm91dGVyIE5hdkxpbmsgcHJvcHMgdHlwZVxyXG4gIFtrZXk6IHN0cmluZ106IGFueTtcclxufSAmIExpbmtQcm9wcztcclxuXHJcbnR5cGUgUGFnZSA9ICdwYWdlJztcclxuXHJcbmZ1bmN0aW9uIE5hdkxpbms8UCBleHRlbmRzIE5hdkxpbmtQcm9wcz4ocHJvcHM6IFApIHtcclxuICBjb25zdCB7IHRvLCBpc0FjdGl2ZSwgLi4ucmVzdCB9ID0gcHJvcHM7XHJcbiAgY29uc3QgY29udGV4dCA9IHVzZUNvbnRleHQoQ29udGV4dCk7XHJcblxyXG4gIGNvbnN0IHRvTG9jYXRpb24gPSB0eXBlb2YgdG8gPT09ICdmdW5jdGlvbicgPyB0byhjb250ZXh0LmxvY2F0aW9uKSA6IHRvO1xyXG5cclxuICBjb25zdCB7IHBhdGhuYW1lOiBwYXRoIH0gPSB0eXBlb2YgdG9Mb2NhdGlvbiA9PT0gJ3N0cmluZycgPyBwYXJzZVBhdGgodG9Mb2NhdGlvbikgOiB0b0xvY2F0aW9uO1xyXG4gIC8vIOaKiuato+WImeihqOi+vuW8j+eahOeJueauiuespuWPt+WKoOS4pOS4quWPjeaWnOadoOi/m+ihjOi9rOS5iVxyXG4gIGNvbnN0IGVzY2FwZWRQYXRoID0gcGF0aCA/IGVzY2FwZVN0cihwYXRoKSA6ICcnO1xyXG4gIGNvbnN0IG1hdGNoID0gZXNjYXBlZFBhdGggPyBtYXRjaFBhdGgoY29udGV4dC5sb2NhdGlvbi5wYXRobmFtZSwgZXNjYXBlZFBhdGgpIDogbnVsbDtcclxuXHJcbiAgY29uc3QgaXNMaW5rQWN0aXZlID0gbWF0Y2ggJiYgaXNBY3RpdmUgPyBpc0FjdGl2ZShtYXRjaCwgY29udGV4dC5sb2NhdGlvbikgOiBmYWxzZTtcclxuXHJcbiAgY29uc3QgcGFnZTogUGFnZSA9ICdwYWdlJztcclxuICBjb25zdCBvdGhlclByb3BzID0ge1xyXG4gICAgJ2FyaWEtY3VycmVudCc6IGlzTGlua0FjdGl2ZSA/IHBhZ2UgOiBmYWxzZSxcclxuICAgIC4uLnJlc3QsXHJcbiAgfTtcclxuXHJcbiAgcmV0dXJuIDxMaW5rIHRvPXt0b30gey4uLm90aGVyUHJvcHN9IC8+O1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBOYXZMaW5rO1xyXG4iXSwibmFtZXMiOlsiaXNCcm93c2VyIiwid2luZG93IiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50IiwiZ2V0RGVmYXVsdENvbmZpcm1hdGlvbiIsIm1lc3NhZ2UiLCJjYWxsQmFjayIsImNvbmZpcm0iLCJpc1N1cHBvcnRIaXN0b3J5IiwiaGlzdG9yeSIsImlzU3VwcG9ydHNQb3BTdGF0ZSIsIm5hdmlnYXRvciIsInVzZXJBZ2VudCIsImluZGV4T2YiLCJBY3Rpb24iLCJFdmVudFR5cGUiLCJfZXh0ZW5kcyIsIk9iamVjdCIsImFzc2lnbiIsImJpbmQiLCJ0YXJnZXQiLCJpIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwic291cmNlIiwia2V5IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiYXBwbHkiLCJjcmVhdGVQYXRoIiwicGF0aCIsInNlYXJjaCIsImhhc2giLCJwYXRobmFtZSIsInN0YXJ0c1dpdGgiLCJwYXJzZVBhdGgiLCJ1cmwiLCJwYXJzZWRQYXRoIiwiaGFzaElkeCIsInN1YnN0cmluZyIsInNlYXJjaElkeCIsImNyZWF0ZUxvY2F0aW9uIiwiY3VycmVudCIsInRvIiwic3RhdGUiLCJ1cmxPYmoiLCJnZXRSYW5kS2V5IiwiZ2VuUmFuZG9tS2V5IiwibG9jYXRpb24iLCJpc0xvY2F0aW9uRXF1YWwiLCJwMSIsInAyIiwiYWRkSGVhZFNsYXNoIiwic3RyaXBIZWFkU2xhc2giLCJub3JtYWxpemVTbGFzaCIsInRlbXBQYXRoIiwiaGFzQmFzZW5hbWUiLCJwcmVmaXgiLCJ0b0xvd2VyQ2FzZSIsImluY2x1ZGVzIiwiY2hhckF0Iiwic3RyaXBCYXNlbmFtZSIsImNyZWF0ZU1lbW9yeVJlY29yZCIsImluaXRWYWwiLCJmbiIsInZpc2l0ZWRSZWNvcmQiLCJnZXREZWx0YSIsImZvcm0iLCJ0b0lkeCIsImxhc3RJbmRleE9mIiwiZnJvbUlkeCIsImFkZFJlY29yZCIsIm5ld1JlY29yZCIsImFjdGlvbiIsImN1clZhbCIsIk5ld1ZhbCIsInB1c2giLCJwcmV2SWR4IiwibmV3VmlzaXRlZFJlY29yZCIsInNsaWNlIiwicmVwbGFjZSIsImVuZCIsIk1hdGgiLCJyYW5kb20iLCJ0b1N0cmluZyIsIl9jbGFzc0NhbGxDaGVjayIsImluc3RhbmNlIiwiQ29uc3RydWN0b3IiLCJUeXBlRXJyb3IiLCJfdHlwZW9mIiwib2JqIiwiU3ltYm9sIiwiaXRlcmF0b3IiLCJjb25zdHJ1Y3RvciIsIl90b1ByaW1pdGl2ZSIsImlucHV0IiwiaGludCIsInByaW0iLCJ0b1ByaW1pdGl2ZSIsInVuZGVmaW5lZCIsInJlcyIsIlN0cmluZyIsIk51bWJlciIsIl90b1Byb3BlcnR5S2V5IiwiYXJnIiwiX2RlZmluZVByb3BlcnRpZXMiLCJwcm9wcyIsImRlc2NyaXB0b3IiLCJlbnVtZXJhYmxlIiwiY29uZmlndXJhYmxlIiwid3JpdGFibGUiLCJkZWZpbmVQcm9wZXJ0eSIsInRvUHJvcGVydHlLZXkiLCJfY3JlYXRlQ2xhc3MiLCJwcm90b1Byb3BzIiwic3RhdGljUHJvcHMiLCJUcmFuc2l0aW9uTWFuYWdlciIsInByb21wdCIsImxpc3RlbmVycyIsInZhbHVlIiwic2V0UHJvbXB0IiwiX3RoaXMiLCJhZGRMaXN0ZW5lciIsImZ1bmMiLCJfdGhpczIiLCJpc0FjdGl2ZSIsImxpc3RlbmVyIiwiYXJncyIsImZpbHRlciIsIml0ZW0iLCJub3RpZnlMaXN0ZW5lcnMiLCJfaXRlcmF0b3IiLCJfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlciIsIl9zdGVwIiwicyIsIm4iLCJkb25lIiwiZXJyIiwiZSIsImYiLCJjb25maXJtSnVtcFRvIiwidXNlckNvbmZpcm1hdGlvbkZ1bmMiLCJyZXN1bHQiLCJ3YXJuaW5nIiwiY29uZGl0aW9uIiwiY29uc29sZSIsIndhcm4iLCJnZXRCYXNlSGlzdG9yeSIsInRyYW5zaXRpb25NYW5hZ2VyIiwic2V0TGlzdGVuZXIiLCJicm93c2VySGlzdG9yeSIsImdvIiwic3RlcCIsImdvQmFjayIsImdvRm9yd2FyZCIsImxpc3RlbiIsImNhbmNlbCIsImlzQmxvY2tlZCIsImJsb2NrIiwidW5ibG9jayIsImdldFVwZGF0ZVN0YXRlRnVuYyIsImhpc3RvcnlQcm9wcyIsIm5leHRTdGF0ZSIsImNyZWF0ZUJyb3dzZXJIaXN0b3J5Iiwib3B0aW9ucyIsInN1cHBvcnRIaXN0b3J5IiwiaXNTdXBwb3J0UG9wU3RhdGUiLCJfb3B0aW9ucyRmb3JjZVJlZnJlc2giLCJmb3JjZVJlZnJlc2giLCJfb3B0aW9ucyRnZXRVc2VyQ29uZmkiLCJnZXRVc2VyQ29uZmlybWF0aW9uIiwiYmFzZW5hbWUiLCJpbml0TG9jYXRpb24iLCJnZXRMb2NhdGlvbiIsImdldEhpc3RvcnlTdGF0ZSIsInJlY29yZE9wZXJhdG9yIiwibCIsIl9nZXRCYXNlSGlzdG9yeSIsInBvcCIsImNyZWF0ZUhyZWYiLCJ1cGRhdGVTdGF0ZSIsImhpc3RvcnlTdGF0ZSIsIl93aW5kb3ckbG9jYXRpb24iLCJfcmVmIiwiZm9yY2VKdW1wIiwiaGFuZGxlUG9wU3RhdGUiLCJjYWxsYmFjayIsImlzSnVtcCIsInJldmVydFBvcFN0YXRlIiwicG9wU3RhdGVMaXN0ZW5lciIsImV2ZW50IiwiaGFzaENoYW5nZUxpc3RlbmVyIiwibGlzdGVuZXJDb3VudCIsImNvdW50IiwiYWRkRXZlbnRMaXN0ZW5lciIsIlBvcFN0YXRlIiwiSGFzaENoYW5nZSIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJkZWx0YSIsImhyZWYiLCJwdXNoU3RhdGUiLCJyZXBsYWNlU3RhdGUiLCJzdHJpcEhhc2giLCJpZHgiLCJnZXRIYXNoQ29udGVudCIsImNyZWF0ZUhhc2hIaXN0b3J5Iiwib3B0aW9uIiwiX29wdGlvbiRoYXNoVHlwZSIsImhhc2hUeXBlIiwiX29wdGlvbiRnZXRVc2VyQ29uZmlyIiwicGF0aERlY29kZXIiLCJwYXRoRW5jb2RlciIsImhhc2hQYXRoIiwibWVtUmVjb3JkcyIsInRhZyIsInF1ZXJ5U2VsZWN0b3IiLCJiYXNlIiwiZ2V0QXR0cmlidXRlIiwiZm9yY2VOZXh0UG9wIiwiaWdub3JlUGF0aCIsImVuY29kZWRQYXRoIiwiaGFuZGxlSGFzaENoYW5nZSIsInByZXZMb2NhdGlvbiIsImNyZWF0ZU5hbWVkQ29udGV4dCIsIm5hbWUiLCJkZWZhdWx0VmFsdWUiLCJjb250ZXh0IiwiY3JlYXRlQ29udGV4dCIsImRpc3BsYXlOYW1lIiwiUm91dGVyQ29udGV4dCIsIlRva2VuVHlwZSIsImNsZWFuUGF0aCIsInNjb3JlQ29tcGFyZSIsInNjb3JlMSIsInNjb3JlMiIsInNjb3JlMUxlbmd0aCIsInNjb3JlMkxlbmd0aCIsIm1pbiIsImVzY2FwZVN0ciIsInN0ciIsInZhbGlkQ2hhciIsImxleGVyIiwidG9rZW5zIiwidXJsUGF0aCIsIkVycm9yIiwiZ2V0TGl0ZXJhbCIsInRlc3QiLCJza2lwQ2hhciIsImN1ckNoYXIiLCJwcmV2Q2hhciIsInR5cGUiLCJEZWxpbWl0ZXIiLCJQYXJhbSIsIldpbGRDYXJkIiwiU3RhdGljIiwiTEJyYWNrZXQiLCJSQnJhY2tldCIsIlBhdHRlcm4iLCJNYXRjaFNjb3JlIiwiZGVmYXVsdE9wdGlvbiIsImNhc2VTZW5zaXRpdmUiLCJzdHJpY3RNb2RlIiwiZXhhY3QiLCJSRUdFWF9DSEFSU19SRSIsIkJBU0VfUEFSQU1fUEFUVEVSTiIsIkRlZmF1bHREZWxpbWl0ZXIiLCJjcmVhdGVQYXRoUGFyc2VyIiwiX29wdGlvbiRjYXNlU2Vuc2l0aXZlIiwiX29wdGlvbiRzdHJpY3RNb2RlIiwiX29wdGlvbiRleGFjdCIsInBhdHRlcm4iLCJrZXlzIiwic2NvcmVzIiwib25seUhhc1dpbGRDYXJkIiwidG9rZW5Db3VudCIsImxhc3RUb2tlbiIsInRva2VuSWR4IiwidG9rZW4iLCJuZXh0VG9rZW4iLCJzdGF0aWMiLCJwYXJhbVJlZ2V4cCIsInBhcmFtIiwid2lsZGNhcmQiLCJwbGFjZWhvbGRlciIsImlzV2lsZENhcmQiLCJmbGFnIiwicmVnZXhwIiwiUmVnRXhwIiwicGFyc2UiLCJyZU1hdGNoIiwibWF0Y2giLCJtYXRjaGVkUGF0aCIsInBhcmFtcyIsInBhcnNlU2NvcmUiLCJBcnJheSIsImZyb20iLCJzcGxpdCIsImlzQXJyYXkiLCJfcGFyYW1zJCIsInNwbGljZSIsImNvbmNhdCIsImZpbGwiLCJpc0V4YWN0Iiwic2NvcmUiLCJjb21waWxlIiwid2lsZENhcmQiLCJqb2luIiwibWF0Y2hQYXRoIiwicGF0dGVybnMiLCJtYXRjaGVkUmVzdWx0cyIsIl9pdGVyYXRvcjIiLCJfc3RlcDIiLCJwYXJzZXIiLCJtYXRjaGVkIiwic29ydCIsImEiLCJiIiwiZ2VuZXJhdGVQYXRoIiwidXNlSGlzdG9yeSIsInVzZUNvbnRleHQiLCJ1c2VMb2NhdGlvbiIsInVzZVBhcmFtcyIsInVzZVJvdXRlTWF0Y2giLCJSb3V0ZSIsImNvbXB1dGVkIiwiY2hpbGRyZW4iLCJjb21wb25lbnQiLCJyZW5kZXIiLCJyb3V0ZUxvY2F0aW9uIiwibmV3UHJvcHMiLCJDaGlsZHJlbiIsImdldENoaWxkcmVuIiwiUmVhY3QiLCJQcm92aWRlciIsIlJvdXRlciIsIl9wcm9wcyRjaGlsZHJlbiIsIl91c2VTdGF0ZSIsInVzZVN0YXRlIiwic2V0TG9jYXRpb24iLCJwZW5kaW5nTG9jYXRpb24iLCJ1c2VSZWYiLCJ1bkxpc3RlbiIsInVzZUxheW91dEVmZmVjdCIsImluaXRDb250ZXh0VmFsdWUiLCJ1c2VNZW1vIiwiX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UiLCJleGNsdWRlZCIsInNvdXJjZUtleXMiLCJMaWZlQ3ljbGUiLCJwcmV2UHJvcHMiLCJpc01vdW50Iiwib25Nb3VudCIsIm9uVXBkYXRlIiwib25Vbm1vdW50IiwiUmVkaXJlY3QiLCJfcHJvcHMkcHVzaCIsImNhbGNMb2NhdGlvbiIsIm5hdmlnYXRlIiwiX2NhbGNMb2NhdGlvbiIsIl9leGNsdWRlZCIsIm9uTW91bnRGdW5jIiwib25VcGRhdGVGdW5jIiwicHJldlBhdGgiLCJkYXRhIiwiU3dpdGNoIiwiZWxlbWVudCIsImZvckVhY2giLCJub2RlIiwiaXNWYWxpZEVsZW1lbnQiLCJzdHJpY3QiLCJzZW5zaXRpdmUiLCJjbG9uZUVsZW1lbnQiLCJQcm9tcHQiLCJfcHJvcHMkd2hlbiIsIndoZW4iLCJyZWxlYXNlIiwib25Vbm1vdW50RnVuYyIsIndpdGhSb3V0ZXIiLCJDb21wb25lbnQiLCJDb21wb25lbnRXaXRoUm91dGVyUHJvcCIsIl91c2VDb250ZXh0Iiwicm91dGVQcm9wcyIsIkhhc2hSb3V0ZXIiLCJoaXN0b3J5UmVmIiwiQnJvd3NlclJvdXRlciIsImlzTW9kaWZpZWRFdmVudCIsIm1ldGFLZXkiLCJhbHRLZXkiLCJjdHJsS2V5Iiwic2hpZnRLZXkiLCJjaGVja1RhcmdldCIsIkxpbmsiLCJvbkNsaWNrIiwib3RoZXIiLCJsaW5rQ2xpY2tFdmVudCIsInByZXZlbnREZWZhdWx0IiwiZGVmYXVsdFByZXZlbnRlZCIsImJ1dHRvbiIsImlzU2FtZVBhdGgiLCJsaW5rUHJvcHMiLCJOYXZMaW5rIiwicmVzdCIsIkNvbnRleHQiLCJ0b0xvY2F0aW9uIiwiZXNjYXBlZFBhdGgiLCJpc0xpbmtBY3RpdmUiLCJwYWdlIiwib3RoZXJQcm9wcyJdLCJtYXBwaW5ncyI6Ijs7O0FBQU8sU0FBU0EsU0FBU0EsR0FBWTtBQUNuQyxFQUFBLE9BQU8sT0FBT0MsTUFBTSxLQUFLLFdBQVcsSUFBSUEsTUFBTSxDQUFDQyxRQUFRLElBQUksT0FBT0QsTUFBTSxDQUFDQyxRQUFRLENBQUNDLGFBQWEsS0FBSyxVQUFVLENBQUE7QUFDaEgsQ0FBQTtBQUVPLFNBQVNDLHNCQUFzQkEsQ0FBQ0MsT0FBZSxFQUFFQyxRQUFtQyxFQUFFO0FBQzNGQSxFQUFBQSxRQUFRLENBQUNMLE1BQU0sQ0FBQ00sT0FBTyxDQUFDRixPQUFPLENBQUMsQ0FBQyxDQUFBO0FBQ25DLENBQUE7O0FBRUE7QUFDTyxTQUFTRyxnQkFBZ0JBLEdBQVk7QUFDMUMs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 diff --git a/packages/horizon-router/src/connect-router/connectedRouter.tsx b/packages/horizon-router/src/connect-router/connectedRouter.tsx index 83a47d9f..e6b2ccc5 100644 --- a/packages/horizon-router/src/connect-router/connectedRouter.tsx +++ b/packages/horizon-router/src/connect-router/connectedRouter.tsx @@ -1,5 +1,5 @@ import * as React from 'react'; -import { useLayoutEffect } from 'react'; +import { useLayoutEffect, useRef } from 'react'; import { connect, ReactReduxContext } from 'react-redux'; import { Store } from 'redux'; import { reduxAdapter } from '@cloudsop/horizon'; @@ -28,41 +28,43 @@ function ConnectedRouterWithoutMemo(props: ConnectedRouter) { const { getLocation } = stateReader(storeType); // 监听store变化 - const unsubscribe = store.subscribe(() => { - // 获取redux State中的location信息 - const { - pathname: pathnameInStore, - search: searchInStore, - hash: hashInStore, - state: stateInStore, - } = getLocation(store.getState()); + const unsubscribe = useRef void)>( + store.subscribe(() => { + // 获取redux State中的location信息 + const { + pathname: pathnameInStore, + search: searchInStore, + hash: hashInStore, + state: stateInStore, + } = getLocation(store.getState()); - // 获取当前history对象中的location信息 - const { - pathname: pathnameInHistory, - search: searchInHistory, - hash: hashInHistory, - state: stateInHistory, - } = history.location; + // 获取当前history对象中的location信息 + const { + pathname: pathnameInHistory, + search: searchInHistory, + hash: hashInHistory, + state: stateInHistory, + } = history.location; - // 两个location不一致 执行跳转 - if ( - history.action === 'PUSH' && - (pathnameInHistory !== pathnameInStore || - searchInHistory !== searchInStore || - hashInHistory !== hashInStore || - stateInHistory !== stateInStore) - ) { - history.push( - { - pathname: pathnameInStore, - search: searchInStore, - hash: hashInStore, - }, - stateInStore, - ); - } - }); + // 两个location不一致 执行跳转 + if ( + history.action === 'PUSH' && + (pathnameInHistory !== pathnameInStore || + searchInHistory !== searchInStore || + hashInHistory !== hashInStore || + stateInHistory !== stateInStore) + ) { + history.push( + { + pathname: pathnameInStore, + search: searchInStore, + hash: hashInStore, + }, + stateInStore, + ); + } + }), + ); const handleLocationChange = (args: Navigation, isFirstRendering: boolean = false) => { const { location, action } = args; @@ -70,12 +72,12 @@ function ConnectedRouterWithoutMemo(props: ConnectedRouter) { }; // 监听history更新 - const unListen = () => history.listen(handleLocationChange); + const unListen = useRef void)>(history.listen(handleLocationChange)); useLayoutEffect(() => { return () => { - unListen(); - unsubscribe(); + unListen.current && unListen.current(); + unsubscribe.current && unsubscribe.current(); }; }, []); diff --git a/packages/horizon-router/src/connect-router/index.ts b/packages/horizon-router/src/connect-router/index.ts index 52f64271..25c0afe8 100644 --- a/packages/horizon-router/src/connect-router/index.ts +++ b/packages/horizon-router/src/connect-router/index.ts @@ -3,3 +3,4 @@ import { createConnectRouter } from './reducer'; export { getConnectedRouter } from './connectedRouter'; export const connectRouter = createConnectRouter(); export { routerMiddleware } from './dispatch'; +export { push, go, replace } from './actions'; \ No newline at end of file diff --git a/packages/horizon-router/src/router/NavLink.tsx b/packages/horizon-router/src/router/NavLink.tsx index 1c187d3d..e4b6088b 100644 --- a/packages/horizon-router/src/router/NavLink.tsx +++ b/packages/horizon-router/src/router/NavLink.tsx @@ -6,7 +6,6 @@ import { Location, matchPath } from './index'; import { Matched } from './matcher/parser'; import Context from './context'; import { parsePath } from '../history/utils'; -import { escapeStr } from './matcher/utils'; type NavLinkProps = { to: Partial | string | ((location: Location) => string | Partial); @@ -23,10 +22,9 @@ function NavLink

(props: P) { const toLocation = typeof to === 'function' ? to(context.location) : to; - const { pathname: path } = typeof toLocation === 'string' ? parsePath(toLocation) : toLocation; - // 把正则表达式的特殊符号加两个反斜杠进行转义 - const escapedPath = path ? escapeStr(path) : ''; - const match = escapedPath ? matchPath(context.location.pathname, escapedPath) : null; + const { pathname } = typeof toLocation === 'string' ? parsePath(toLocation) : toLocation; + + const match = pathname ? matchPath(context.location.pathname, pathname) : null; const isLinkActive = match && isActive ? isActive(match, context.location) : false; diff --git a/packages/horizon-router/src/router/Router.tsx b/packages/horizon-router/src/router/Router.tsx index b64f2266..535cf23f 100644 --- a/packages/horizon-router/src/router/Router.tsx +++ b/packages/horizon-router/src/router/Router.tsx @@ -16,17 +16,19 @@ function Router

(props: P) { const pendingLocation = useRef(null); // 在Router加载时就监听history地址变化,以保证在始渲染时重定向能正确触发 - let unListen: null | (() => void) = history.listen(arg => { - pendingLocation.current = arg.location; - }); + const unListen = useRef void)>( + history.listen(arg => { + pendingLocation.current = arg.location; + }), + ); // 模拟componentDidMount和componentWillUnmount useLayoutEffect(() => { - if (unListen) { - unListen(); + if (unListen.current) { + unListen.current(); } // 监听history中的位置变化 - unListen = history.listen(arg => { + unListen.current = history.listen(arg => { setLocation(arg.location); }); @@ -35,9 +37,9 @@ function Router

(props: P) { } return () => { - if (unListen) { - unListen(); - unListen = null; + if (unListen.current) { + unListen.current(); + unListen.current = null; pendingLocation.current = null; } }; diff --git a/packages/horizon-router/src/router/Switch.tsx b/packages/horizon-router/src/router/Switch.tsx index 4f1cf783..a270235e 100644 --- a/packages/horizon-router/src/router/Switch.tsx +++ b/packages/horizon-router/src/router/Switch.tsx @@ -31,15 +31,9 @@ function Switch

(props: P): React.ReactElement | null { // node可能是Route和Redirect if (node.type === Route) { - const props = node.props as RouteProps; - strict = props.strict; - sensitive = props.sensitive; - path = props.path; + ({ strict, sensitive, path } = node.props as RouteProps); } else if (node.type === Redirect) { - const props = node.props as RedirectProps; - path = props.path; - strict = props.strict; - from = props.from; + ({ path, strict, from } = node.props as RedirectProps); } const exact = node.props.exact; diff --git a/packages/horizon-router/src/router/index2.ts b/packages/horizon-router/src/router/index2.ts index 19542b64..2c255eab 100644 --- a/packages/horizon-router/src/router/index2.ts +++ b/packages/horizon-router/src/router/index2.ts @@ -40,6 +40,6 @@ export type { RouteComponentProps, RouteChildrenProps, RouteProps } from './Rout // ============================ Connect-router ============================ -export { connectRouter, routerMiddleware } from '../connect-router'; +export { connectRouter, routerMiddleware, push, go, replace } from '../connect-router'; export const ConnectedRouter = getConnectedRouter('Redux'); export const ConnectedHRouter = getConnectedRouter('HorizonXCompat'); \ No newline at end of file diff --git a/packages/horizon-router/src/router/matcher/__tests__/lexer.test.ts b/packages/horizon-router/src/router/matcher/__tests__/lexer.test.ts index ed87385c..a2f568ae 100644 --- a/packages/horizon-router/src/router/matcher/__tests__/lexer.test.ts +++ b/packages/horizon-router/src/router/matcher/__tests__/lexer.test.ts @@ -53,6 +53,20 @@ describe('path lexer Test', () => { ]); }); + it('dynamic params with pattern 2', () => { + const tokens = lexer('/www.a.com/:b(abc|xyz)/*'); + expect(tokens).toStrictEqual([ + { type: 'delimiter', value: '/' }, + { type: 'static', value: 'www.a.com' }, + { type: 'delimiter', value: '/' }, + { type: 'param', value: 'b' }, + { type: '(', value: '(' }, + { type: 'pattern', value: 'abc|xyz' }, + { type: ')', value: ')' }, + { type: 'delimiter', value: '/' }, + { type: 'wildcard', value: '*' }, + ]); + }); it('wildcard params test', () => { const tokens = lexer('/www.a.com/:b'); expect(tokens).toStrictEqual([ @@ -62,4 +76,45 @@ describe('path lexer Test', () => { { type: 'param', value: 'b' }, ]); }); + it('wildcard in end of static param', () => { + const tokens = lexer('/abc*'); + expect(tokens).toStrictEqual([ + { type: 'delimiter', value: '/' }, + { type: 'static', value: 'abc' }, + { type: 'pattern', value: '*' }, + ]); + }); + it('wildcard in end of static param 2', () => { + const tokens = lexer('/abc*/xyz*'); + expect(tokens).toStrictEqual([ + { type: 'delimiter', value: '/' }, + { type: 'static', value: 'abc' }, + { type: 'pattern', value: '*' }, + { type: 'delimiter', value: '/' }, + { type: 'static', value: 'xyz' }, + { type: 'pattern', value: '*' }, + ]); + }); + it('url contain optional param at end', () => { + const tokens = lexer('/user/:name?'); + expect(tokens).toEqual([ + { type: 'delimiter', value: '/' }, + { type: 'static', value: 'user' }, + { type: 'delimiter', value: '/' }, + { type: 'param', value: 'name' }, + { type: 'pattern', value: '?' }, + ]); + }); + it('url contain optional param at middle', () => { + const tokens = lexer('/user/:name?/profile'); + expect(tokens).toEqual([ + { type: 'delimiter', value: '/' }, + { type: 'static', value: 'user' }, + { type: 'delimiter', value: '/' }, + { type: 'param', value: 'name' }, + { type: 'pattern', value: '?' }, + { type: 'delimiter', value: '/' }, + { type: 'static', value: 'profile' }, + ]); + }); }); diff --git a/packages/horizon-router/src/router/matcher/__tests__/parser.test.ts b/packages/horizon-router/src/router/matcher/__tests__/parser.test.ts index 70372f7f..3823c2f1 100644 --- a/packages/horizon-router/src/router/matcher/__tests__/parser.test.ts +++ b/packages/horizon-router/src/router/matcher/__tests__/parser.test.ts @@ -34,10 +34,13 @@ describe('parser test', () => { const parser = createPathParser('/www.a.com/a/*', { exact: true }); const params = parser.parse('/www.a.com/a/b1/c1/d1'); const params1 = parser.parse('/www.a.com/a/b1/c1/'); + const params2 = parser.parse('/www.a.com/a/b1/'); expect(params!.params).toStrictEqual({ '*': ['b1', 'c1', 'd1'] }); expect(params!.score).toStrictEqual([10, 10, 3, 3, 3]); expect(params1!.params).toStrictEqual({ '*': ['b1', 'c1'] }); expect(params1!.score).toStrictEqual([10, 10, 3, 3]); + expect(params2!.params).toStrictEqual({ '*': ['b1'] }); + expect(params2!.score).toStrictEqual([10, 10, 3]); }); it('compile wildcard', function () { @@ -191,9 +194,30 @@ describe('parser test', () => { }); }); + it('wildcard after dynamic param with pattern', () => { + const parser = createPathParser('/detail/:action(info)/*'); + const res = parser.parse('/detail/info/123'); + expect(res).toEqual({ + isExact: true, + path: '/detail/:action(info)/*', + url: '/detail/info/123', + score: [10, 6, 3], + params: { action: 'info', '*': ['123'] }, + }); + }); + it('dynamic param with regexp pattern after wildcard', () => { + const parser = createPathParser('/detail/*/:action(\\d+)'); + const res = parser.parse('/detail/abc/xyz/123'); + expect(res).toEqual({ + isExact: true, + path: '/detail/*/:action(\\d+)', + url: '/detail/abc/xyz/123', + score: [10, 3, 3, 6], + params: { action: '123', '*': ['abc', 'xyz'] }, + }); + }); it('dynamic param with regexp pattern', () => { const parser = createPathParser('/detail/:action(\\d+)'); - console.log(parser.regexp); const res = parser.parse('/detail/123'); expect(res).toEqual({ isExact: true, @@ -245,4 +269,121 @@ describe('parser test', () => { c: 'abc', }); }); + it('support wildcard "*" in end of static path 1', function () { + const parser = createPathParser('/home*'); + const res = parser.parse('/homeAbc/a123'); + expect(res).toEqual({ + isExact: true, + path: '/home*', + url: '/homeAbc/a123', + score: [10], + params: { '0': 'Abc/a123' }, + }); + }); + it('support wildcard "*" in url and dynamic param at end', function () { + const parser = createPathParser('/home*/:a+'); + const res = parser.parse('/homeAbc/a'); + expect(res).toEqual({ + path: '/home*/:a+', + url: '/homeAbc/a', + isExact: true, + score: [10, 6], + params: { '0': 'Abc', a: 'a' }, + }); + }); + it('parse url with optional param 1', () => { + const parser = createPathParser('/catalog/logical-view/:pageType/:viewName?'); + const res = parser.parse('/catalog/logical-view/create'); + expect(res).toStrictEqual({ + isExact: true, + path: '/catalog/logical-view/:pageType/:viewName?', + url: '/catalog/logical-view/create', + score: [10, 10, 6, 6], + params: { pageType: 'create', viewName: undefined }, + }); + const res2 = parser.parse('/catalog/logical-view/create/view1'); + expect(res2).toStrictEqual({ + isExact: true, + path: '/catalog/logical-view/:pageType/:viewName?', + url: '/catalog/logical-view/create/view1', + score: [10, 10, 6, 6], + params: { pageType: 'create', viewName: 'view1' }, + }); + }); + it('parse url with wildcard param 1', () => { + const parser = createPathParser('/home/:p*'); + const res = parser.parse('/home/123'); + expect(res).toStrictEqual({ + path: '/home/:p*', + url: '/home/123', + isExact: true, + params: { p: '123' }, + score: [10, 6], + }); + const res2 = parser.parse('/home/123/456'); + expect(res2).toStrictEqual({ + path: '/home/:p*', + url: '/home/123/456', + isExact: true, + params: { p: '123/456' }, + score: [10, 6], + }); + }); + it('parse url with wildcard param in middle of URL', () => { + const parser = createPathParser('/home/:p*/link'); + const res = parser.parse('/home/123/link'); + expect(res).toStrictEqual({ + path: '/home/:p*/link', + url: '/home/123/link', + isExact: true, + params: { p: '123' }, + score: [10, 6, 10], + }); + const res2 = parser.parse('/home/link'); + expect(res2).toStrictEqual({ + path: '/home/:p*/link', + url: '/home/link', + isExact: true, + params: { p: undefined }, + score: [10, 6, 10], + }); + }); + it('parse url with optional param 2', () => { + const parser = createPathParser('/user/:userid?/profile'); + const res = parser.parse('/user/profile'); + expect(res).toStrictEqual({ + isExact: true, + params: { userid: undefined }, + path: '/user/:userid?/profile', + score: [10, 6, 10], + url: '/user/profile', + }); + const res2 = parser.parse('/user/123/profile'); + expect(res2).toStrictEqual({ + isExact: true, + params: { userid: '123' }, + path: '/user/:userid?/profile', + score: [10, 6, 10], + url: '/user/123/profile', + }); + }); + it('complex url pattern test 1', function () { + const parser = createPathParser('/dump/taskList/:action(add|config)/lifecyclePolicy/:name?'); + const res = parser.parse('/dump/taskList/add/lifecyclePolicy/'); + expect(res).toStrictEqual({ + isExact: true, + path: '/dump/taskList/:action(add|config)/lifecyclePolicy/:name?', + url: '/dump/taskList/add/lifecyclePolicy/', + score: [10, 10, 6, 10, 6], + params: { action: 'add', name: undefined }, + }); + const res1 = parser.parse('/dump/taskList/add/lifecyclePolicy/new'); + expect(res1).toStrictEqual({ + isExact: true, + path: '/dump/taskList/:action(add|config)/lifecyclePolicy/:name?', + url: '/dump/taskList/add/lifecyclePolicy/new', + score: [10, 10, 6, 10, 6], + params: { action: 'add', name: 'new' }, + }); + }); }); diff --git a/packages/horizon-router/src/router/matcher/lexer.ts b/packages/horizon-router/src/router/matcher/lexer.ts index a31a2563..fa34e17b 100644 --- a/packages/horizon-router/src/router/matcher/lexer.ts +++ b/packages/horizon-router/src/router/matcher/lexer.ts @@ -1,7 +1,7 @@ import { Token, TokenType } from './types'; import { cleanPath } from './utils'; -const validChar = /[^/:*()]/; +const validChar = /[^/:()*?$^+]/; // 对Url模板进行词法解析,解析结果为Tokens export function lexer(path: string): Token[] { @@ -66,6 +66,11 @@ export function lexer(path: string): Token[] { skipChar(1); continue; } + if (['*', '?', '$', '^', '+'].includes(curChar)) { + tokens.push({ type: TokenType.Pattern, value: curChar }); + skipChar(1); + continue; + } if (validChar.test(curChar)) { tokens.push({ type: TokenType.Pattern, value: getLiteral() }); continue; diff --git a/packages/horizon-router/src/router/matcher/parser.ts b/packages/horizon-router/src/router/matcher/parser.ts index c1be4f99..fa636ae6 100644 --- a/packages/horizon-router/src/router/matcher/parser.ts +++ b/packages/horizon-router/src/router/matcher/parser.ts @@ -39,6 +39,12 @@ const BASE_PARAM_PATTERN = '[^/]+'; const DefaultDelimiter = '/#?'; +/** + * URL匹配整体流程 + * 1.词法解析,将URL模板解析为Token + * 2.使用Token生成正则表达式 + * 3.利用正则表达式解析URL中参数或填充URL模板 + */ export function createPathParser(pathname: Str, option?: ParserOption): Parser>; export function createPathParser

(pathname: string, option?: ParserOption): Parser

; export function createPathParser

(pathname: string, option: ParserOption = defaultOption): Parser

{ @@ -47,12 +53,7 @@ export function createPathParser

(pathname: string, option: ParserOp strictMode = defaultOption.strictMode, exact = defaultOption.exact, } = option; - /** - * URL匹配整体流程 - * 1.词法解析,将URL模板解析为Token - * 2.使用Token生成正则表达式 - * 3.利用正则表达式解析URL中参数或填充URL模板 - */ + let pattern = '^'; const keys: string[] = []; const scores: number[] = []; @@ -61,29 +62,61 @@ export function createPathParser

(pathname: string, option: ParserOp const onlyHasWildCard = tokens.length === 1 && tokens[0].type === TokenType.WildCard; const tokenCount = tokens.length; const lastToken = tokens[tokenCount - 1]; + let asteriskCount = 0; + /** + * 用于支持URL中的可选参数/:parma? + * @description 向前扫描到下一个分隔符/,检查其中是否有? + * @param currentIdx + */ + const lookToNextDelimiter = (currentIdx: number): boolean => { + let hasOptionalParam = false; + while (currentIdx < tokens.length && tokens[currentIdx].type !== TokenType.Delimiter) { + if (tokens[currentIdx].value === '?' || tokens[currentIdx].value === '*') { + hasOptionalParam = true; + } + currentIdx++; + } + return hasOptionalParam; + }; for (let tokenIdx = 0; tokenIdx < tokenCount; tokenIdx++) { const token = tokens[tokenIdx]; const nextToken = tokens[tokenIdx + 1]; switch (token.type) { case TokenType.Delimiter: - pattern += '/'; + const hasOptional = lookToNextDelimiter(tokenIdx + 1); + pattern += `/${hasOptional ? '?' : ''}`; break; case TokenType.Static: pattern += token.value.replace(REGEX_CHARS_RE, '\\$&'); + if (nextToken && nextToken.type === TokenType.Pattern) { + pattern += `(.${nextToken.value})`; + keys.push(String(asteriskCount)); + asteriskCount++; + } scores.push(MatchScore.static); break; case TokenType.Param: + // 动态参数支持形如/:param、/:param*、/:param?、/:param(\\d+)的形式 let paramRegexp = ''; - if (nextToken && nextToken.type === TokenType.LBracket) { + if (nextToken) { + switch (nextToken.type) { + case TokenType.LBracket: // 跳过当前Token和左括号 tokenIdx += 2; while (tokens[tokenIdx].type !== TokenType.RBracket) { paramRegexp += tokens[tokenIdx].value; tokenIdx++; + } + paramRegexp = `(${paramRegexp})`; + break; + case TokenType.Pattern: + tokenIdx++; + paramRegexp += `(${nextToken.value === '*' ? '.*' : BASE_PARAM_PATTERN})${nextToken.value}`; + break; } } - pattern += paramRegexp ? `((?:${paramRegexp}))` : `(${BASE_PARAM_PATTERN})`; + pattern += paramRegexp ? `(?:${paramRegexp})` : `(${BASE_PARAM_PATTERN})`; keys.push(token.value); scores.push(MatchScore.param); break; @@ -139,7 +172,7 @@ export function createPathParser

(pathname: string, option: ParserOp ...new Array(value.length).fill(MatchScore.wildcard), ); } else { - params[key] = param ? param : []; + params[key] = param ? param : undefined; } }