@dbx-tools/search 0.6.9 → 0.6.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +17 -1
- package/index.ts +2 -6
- package/lib/index.d.ts +2 -6
- package/lib/index.js +3 -7
- package/lib/src/client.js +1 -1
- package/lib/src/config.js +1 -1
- package/lib/src/lakebase.d.ts +40 -2
- package/lib/src/lakebase.js +75 -15
- package/lib/src/plugin.js +3 -3
- package/lib/src/query.js +1 -1
- package/lib/src/schema.js +2 -2
- package/package.json +6 -6
- package/src/client.ts +3 -3
- package/src/config.ts +1 -1
- package/src/lakebase.ts +102 -17
- package/src/plugin.ts +2 -2
- package/src/query.ts +1 -1
- package/src/schema.ts +1 -1
package/README.md
CHANGED
|
@@ -213,11 +213,27 @@ When you have **no** Vector Search endpoint configured but the AppKit `lakebase`
|
|
|
213
213
|
plugin is registered, the plugin transparently falls back to a Postgres
|
|
214
214
|
full-text index. It provisions one table per index (a generated `tsvector`
|
|
215
215
|
column with a GIN index), seeds the same `ensureOnSetup.documents`, and answers
|
|
216
|
-
queries with `
|
|
216
|
+
queries with a prefix `to_tsquery` + `ts_rank`. The pool is built from the
|
|
217
217
|
`lakebase` plugin's service-principal config exactly like
|
|
218
218
|
[`@dbx-tools/appkit-mastra`](../appkit-mastra) builds its memory pool - no auth
|
|
219
219
|
is re-implemented.
|
|
220
220
|
|
|
221
|
+
Queries are compiled from the search box rather than handed to
|
|
222
|
+
`websearch_to_tsquery`, which is too literal for type-ahead in two ways:
|
|
223
|
+
|
|
224
|
+
- **Punctuation.** Postgres indexes `racetrac-store-intelligence` as the
|
|
225
|
+
compound lexeme _plus_ its parts, but compiles a hyphenated **query** to the
|
|
226
|
+
compound alone - so `store-intelligence` matches nothing while
|
|
227
|
+
`store intelligence` matches everything. The query is split on punctuation,
|
|
228
|
+
so both spellings (and `.` / `_` in a table reference) behave the same.
|
|
229
|
+
- **Prefixes.** Every term is matched as a prefix, so `intel` reaches
|
|
230
|
+
`intelligence` and `store intel` finds `racetrac-store-intelligence`.
|
|
231
|
+
|
|
232
|
+
All terms must match. When none do, the search relaxes instead of returning an
|
|
233
|
+
empty box: any single term counts, plus a substring pass that catches a
|
|
234
|
+
fragment which is not a prefix (`telligence`). The substring pass cannot use
|
|
235
|
+
the GIN index, so it only runs after the indexed pass finds nothing.
|
|
236
|
+
|
|
221
237
|
The point is parity: the client returns the identical `SearchResult` /
|
|
222
238
|
`SearchHit` (`{ id, score, fields }`) / `UpsertResult` shapes, so the agent
|
|
223
239
|
tools, the `/api/search` routes, and the React search box behave the same
|
package/index.ts
CHANGED
|
@@ -11,18 +11,14 @@ export * as query from "./src/query.ts";
|
|
|
11
11
|
export * as runtime from "./src/runtime.ts";
|
|
12
12
|
export * as schema from "./src/schema.ts";
|
|
13
13
|
export * as tool from "./src/tool.ts";
|
|
14
|
-
export { SearchIndex, SearchClient
|
|
14
|
+
export { SearchIndex, SearchClient } from "./src/client.ts";
|
|
15
15
|
export type { SearchOptions, UniversalSearchOptions, IndexInfo, CreateIndexOptions, EnsureEndpointOptions, ProvisionOptions } from "./src/client.ts";
|
|
16
|
-
export { INDEX_ENV, DATABRICKS_INDEX_ENV, ENDPOINT_ENV, DEFAULT_MODE, DEFAULT_PAGE_SIZE, DEFAULT_TIMEOUT_MS, DEFAULT_BASE_PATH, SEARCH_CONFIG_SCHEMA
|
|
16
|
+
export { INDEX_ENV, DATABRICKS_INDEX_ENV, ENDPOINT_ENV, DEFAULT_MODE, DEFAULT_PAGE_SIZE, DEFAULT_TIMEOUT_MS, DEFAULT_BASE_PATH, SEARCH_CONFIG_SCHEMA } from "./src/config.ts";
|
|
17
17
|
export type { SearchIndexConfig, SearchPluginConfig, EnsureOnSetupConfig, ResolvedIndexConfig, ResolvedSearchConfig } from "./src/config.ts";
|
|
18
|
-
export { toCreateIndexOptions } from "./src/index-tools.ts";
|
|
19
18
|
export { LakebaseSearchBackend } from "./src/lakebase.ts";
|
|
20
19
|
export type { LakebaseSearchOptions, LakebaseProvisionOptions } from "./src/lakebase.ts";
|
|
21
20
|
export { SearchPlugin, search } from "./src/plugin.ts";
|
|
22
|
-
export { toQueryType, compileFilter, toHits, toRequestColumns, toDocumentArray } from "./src/query.ts";
|
|
23
21
|
export type { QueryResponseLike } from "./src/query.ts";
|
|
24
|
-
export { getSearchRuntime, resetSearchRuntime } from "./src/runtime.ts";
|
|
25
22
|
export type { SearchRuntimeOptions, SearchRuntime } from "./src/runtime.ts";
|
|
26
23
|
export { SEARCH_TOOL_DESCRIPTION, UNIVERSAL_SEARCH_TOOL_DESCRIPTION, ADD_DOCUMENTS_TOOL_DESCRIPTION, CREATE_INDEX_TOOL_DESCRIPTION, SYNC_INDEX_TOOL_DESCRIPTION, searchToolSchema, universalSearchToolSchema, searchResultSchema, createIndexToolSchema, indexInfoSchema, syncIndexToolSchema } from "./src/schema.ts";
|
|
27
|
-
export { searchTool, universalSearchTool, addDocumentsTool, createIndexTool, syncIndexTool } from "./src/tool.ts";
|
|
28
24
|
export type { SearchToolOptions } from "./src/tool.ts";
|
package/lib/index.d.ts
CHANGED
|
@@ -7,18 +7,14 @@ export * as query from "./src/query.ts";
|
|
|
7
7
|
export * as runtime from "./src/runtime.ts";
|
|
8
8
|
export * as schema from "./src/schema.ts";
|
|
9
9
|
export * as tool from "./src/tool.ts";
|
|
10
|
-
export { SearchIndex, SearchClient
|
|
10
|
+
export { SearchIndex, SearchClient } from "./src/client.ts";
|
|
11
11
|
export type { SearchOptions, UniversalSearchOptions, IndexInfo, CreateIndexOptions, EnsureEndpointOptions, ProvisionOptions } from "./src/client.ts";
|
|
12
|
-
export { INDEX_ENV, DATABRICKS_INDEX_ENV, ENDPOINT_ENV, DEFAULT_MODE, DEFAULT_PAGE_SIZE, DEFAULT_TIMEOUT_MS, DEFAULT_BASE_PATH, SEARCH_CONFIG_SCHEMA
|
|
12
|
+
export { INDEX_ENV, DATABRICKS_INDEX_ENV, ENDPOINT_ENV, DEFAULT_MODE, DEFAULT_PAGE_SIZE, DEFAULT_TIMEOUT_MS, DEFAULT_BASE_PATH, SEARCH_CONFIG_SCHEMA } from "./src/config.ts";
|
|
13
13
|
export type { SearchIndexConfig, SearchPluginConfig, EnsureOnSetupConfig, ResolvedIndexConfig, ResolvedSearchConfig } from "./src/config.ts";
|
|
14
|
-
export { toCreateIndexOptions } from "./src/index-tools.ts";
|
|
15
14
|
export { LakebaseSearchBackend } from "./src/lakebase.ts";
|
|
16
15
|
export type { LakebaseSearchOptions, LakebaseProvisionOptions } from "./src/lakebase.ts";
|
|
17
16
|
export { SearchPlugin, search } from "./src/plugin.ts";
|
|
18
|
-
export { toQueryType, compileFilter, toHits, toRequestColumns, toDocumentArray } from "./src/query.ts";
|
|
19
17
|
export type { QueryResponseLike } from "./src/query.ts";
|
|
20
|
-
export { getSearchRuntime, resetSearchRuntime } from "./src/runtime.ts";
|
|
21
18
|
export type { SearchRuntimeOptions, SearchRuntime } from "./src/runtime.ts";
|
|
22
19
|
export { SEARCH_TOOL_DESCRIPTION, UNIVERSAL_SEARCH_TOOL_DESCRIPTION, ADD_DOCUMENTS_TOOL_DESCRIPTION, CREATE_INDEX_TOOL_DESCRIPTION, SYNC_INDEX_TOOL_DESCRIPTION, searchToolSchema, universalSearchToolSchema, searchResultSchema, createIndexToolSchema, indexInfoSchema, syncIndexToolSchema } from "./src/schema.ts";
|
|
23
|
-
export { searchTool, universalSearchTool, addDocumentsTool, createIndexTool, syncIndexTool } from "./src/tool.ts";
|
|
24
20
|
export type { SearchToolOptions } from "./src/tool.ts";
|
package/lib/index.js
CHANGED
|
@@ -10,13 +10,9 @@ export * as query from "./src/query.js";
|
|
|
10
10
|
export * as runtime from "./src/runtime.js";
|
|
11
11
|
export * as schema from "./src/schema.js";
|
|
12
12
|
export * as tool from "./src/tool.js";
|
|
13
|
-
export { SearchIndex, SearchClient
|
|
14
|
-
export { INDEX_ENV, DATABRICKS_INDEX_ENV, ENDPOINT_ENV, DEFAULT_MODE, DEFAULT_PAGE_SIZE, DEFAULT_TIMEOUT_MS, DEFAULT_BASE_PATH, SEARCH_CONFIG_SCHEMA
|
|
15
|
-
export { toCreateIndexOptions } from "./src/index-tools.js";
|
|
13
|
+
export { SearchIndex, SearchClient } from "./src/client.js";
|
|
14
|
+
export { INDEX_ENV, DATABRICKS_INDEX_ENV, ENDPOINT_ENV, DEFAULT_MODE, DEFAULT_PAGE_SIZE, DEFAULT_TIMEOUT_MS, DEFAULT_BASE_PATH, SEARCH_CONFIG_SCHEMA } from "./src/config.js";
|
|
16
15
|
export { LakebaseSearchBackend } from "./src/lakebase.js";
|
|
17
16
|
export { SearchPlugin, search } from "./src/plugin.js";
|
|
18
|
-
export { toQueryType, compileFilter, toHits, toRequestColumns, toDocumentArray } from "./src/query.js";
|
|
19
|
-
export { getSearchRuntime, resetSearchRuntime } from "./src/runtime.js";
|
|
20
17
|
export { SEARCH_TOOL_DESCRIPTION, UNIVERSAL_SEARCH_TOOL_DESCRIPTION, ADD_DOCUMENTS_TOOL_DESCRIPTION, CREATE_INDEX_TOOL_DESCRIPTION, SYNC_INDEX_TOOL_DESCRIPTION, searchToolSchema, universalSearchToolSchema, searchResultSchema, createIndexToolSchema, indexInfoSchema, syncIndexToolSchema } from "./src/schema.js";
|
|
21
|
-
|
|
22
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLFVBQVUsTUFBTSxzQkFBc0IsQ0FBQztBQUNuRCxPQUFPLEtBQUssUUFBUSxNQUFNLG1CQUFtQixDQUFDO0FBQzlDLE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLEtBQUssTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QyxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLElBQUksTUFBTSxlQUFlLENBQUM7QUFDdEMsT0FBTyxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUVoRixPQUFPLEVBQUUsU0FBUyxFQUFFLG9CQUFvQixFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsaUJBQWlCLEVBQUUsa0JBQWtCLEVBQUUsaUJBQWlCLEVBQUUsb0JBQW9CLEVBQUUsWUFBWSxFQUFFLG1CQUFtQixFQUFFLGdCQUFnQixFQUFFLGNBQWMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRW5QLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzVELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRTFELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFdBQVcsRUFBRSxhQUFhLEVBQUUsTUFBTSxFQUFFLGdCQUFnQixFQUFFLGVBQWUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXZHLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRXhFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxpQ0FBaUMsRUFBRSw4QkFBOEIsRUFBRSw2QkFBNkIsRUFBRSwyQkFBMkIsRUFBRSxnQkFBZ0IsRUFBRSx5QkFBeUIsRUFBRSxrQkFBa0IsRUFBRSxxQkFBcUIsRUFBRSxlQUFlLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN2VCxPQUFPLEVBQUUsVUFBVSxFQUFFLG1CQUFtQixFQUFFLGdCQUFnQixFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUsTUFBTSxlQUFlLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBHRU5FUkFURUQgYnkgcHJvamVuIHdhdGNoIC0gRE8gTk9UIEVESVQuXG4vLyBSZWdlbmVyYXRlZCBmcm9tIHRoZSBleHBvcnRpbmcgbW9kdWxlcyBpbiAuL3NyYy5cbi8vIEhhbmQgZWRpdHMgYXJlIG92ZXJ3cml0dGVuIG9uIHRoZSBuZXh0IHdhdGNoOyB0aGlzIGZpbGUgaXMgcmVhZC1vbmx5LlxuXG5leHBvcnQgKiBhcyBjbGllbnQgZnJvbSBcIi4vc3JjL2NsaWVudC50c1wiO1xuZXhwb3J0ICogYXMgY29uZmlnIGZyb20gXCIuL3NyYy9jb25maWcudHNcIjtcbmV4cG9ydCAqIGFzIGluZGV4VG9vbHMgZnJvbSBcIi4vc3JjL2luZGV4LXRvb2xzLnRzXCI7XG5leHBvcnQgKiBhcyBsYWtlYmFzZSBmcm9tIFwiLi9zcmMvbGFrZWJhc2UudHNcIjtcbmV4cG9ydCAqIGFzIHBsdWdpbiBmcm9tIFwiLi9zcmMvcGx1Z2luLnRzXCI7XG5leHBvcnQgKiBhcyBxdWVyeSBmcm9tIFwiLi9zcmMvcXVlcnkudHNcIjtcbmV4cG9ydCAqIGFzIHJ1bnRpbWUgZnJvbSBcIi4vc3JjL3J1bnRpbWUudHNcIjtcbmV4cG9ydCAqIGFzIHNjaGVtYSBmcm9tIFwiLi9zcmMvc2NoZW1hLnRzXCI7XG5leHBvcnQgKiBhcyB0b29sIGZyb20gXCIuL3NyYy90b29sLnRzXCI7XG5leHBvcnQgeyBTZWFyY2hJbmRleCwgU2VhcmNoQ2xpZW50LCBjcmVhdGVTZWFyY2hDbGllbnQgfSBmcm9tIFwiLi9zcmMvY2xpZW50LnRzXCI7XG5leHBvcnQgdHlwZSB7IFNlYXJjaE9wdGlvbnMsIFVuaXZlcnNhbFNlYXJjaE9wdGlvbnMsIEluZGV4SW5mbywgQ3JlYXRlSW5kZXhPcHRpb25zLCBFbnN1cmVFbmRwb2ludE9wdGlvbnMsIFByb3Zpc2lvbk9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvY2xpZW50LnRzXCI7XG5leHBvcnQgeyBJTkRFWF9FTlYsIERBVEFCUklDS1NfSU5ERVhfRU5WLCBFTkRQT0lOVF9FTlYsIERFRkFVTFRfTU9ERSwgREVGQVVMVF9QQUdFX1NJWkUsIERFRkFVTFRfVElNRU9VVF9NUywgREVGQVVMVF9CQVNFX1BBVEgsIFNFQVJDSF9DT05GSUdfU0NIRU1BLCBkZWZhdWx0QWxpYXMsIHJlc29sdmVTZWFyY2hDb25maWcsIHJlc29sdmVJbmRleE5hbWUsIGluZGV4Q29uZmlnRm9yIH0gZnJvbSBcIi4vc3JjL2NvbmZpZy50c1wiO1xuZXhwb3J0IHR5cGUgeyBTZWFyY2hJbmRleENvbmZpZywgU2VhcmNoUGx1Z2luQ29uZmlnLCBFbnN1cmVPblNldHVwQ29uZmlnLCBSZXNvbHZlZEluZGV4Q29uZmlnLCBSZXNvbHZlZFNlYXJjaENvbmZpZyB9IGZyb20gXCIuL3NyYy9jb25maWcudHNcIjtcbmV4cG9ydCB7IHRvQ3JlYXRlSW5kZXhPcHRpb25zIH0gZnJvbSBcIi4vc3JjL2luZGV4LXRvb2xzLnRzXCI7XG5leHBvcnQgeyBMYWtlYmFzZVNlYXJjaEJhY2tlbmQgfSBmcm9tIFwiLi9zcmMvbGFrZWJhc2UudHNcIjtcbmV4cG9ydCB0eXBlIHsgTGFrZWJhc2VTZWFyY2hPcHRpb25zLCBMYWtlYmFzZVByb3Zpc2lvbk9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvbGFrZWJhc2UudHNcIjtcbmV4cG9ydCB7IFNlYXJjaFBsdWdpbiwgc2VhcmNoIH0gZnJvbSBcIi4vc3JjL3BsdWdpbi50c1wiO1xuZXhwb3J0IHsgdG9RdWVyeVR5cGUsIGNvbXBpbGVGaWx0ZXIsIHRvSGl0cywgdG9SZXF1ZXN0Q29sdW1ucywgdG9Eb2N1bWVudEFycmF5IH0gZnJvbSBcIi4vc3JjL3F1ZXJ5LnRzXCI7XG5leHBvcnQgdHlwZSB7IFF1ZXJ5UmVzcG9uc2VMaWtlIH0gZnJvbSBcIi4vc3JjL3F1ZXJ5LnRzXCI7XG5leHBvcnQgeyBnZXRTZWFyY2hSdW50aW1lLCByZXNldFNlYXJjaFJ1bnRpbWUgfSBmcm9tIFwiLi9zcmMvcnVudGltZS50c1wiO1xuZXhwb3J0IHR5cGUgeyBTZWFyY2hSdW50aW1lT3B0aW9ucywgU2VhcmNoUnVudGltZSB9IGZyb20gXCIuL3NyYy9ydW50aW1lLnRzXCI7XG5leHBvcnQgeyBTRUFSQ0hfVE9PTF9ERVNDUklQVElPTiwgVU5JVkVSU0FMX1NFQVJDSF9UT09MX0RFU0NSSVBUSU9OLCBBRERfRE9DVU1FTlRTX1RPT0xfREVTQ1JJUFRJT04sIENSRUFURV9JTkRFWF9UT09MX0RFU0NSSVBUSU9OLCBTWU5DX0lOREVYX1RPT0xfREVTQ1JJUFRJT04sIHNlYXJjaFRvb2xTY2hlbWEsIHVuaXZlcnNhbFNlYXJjaFRvb2xTY2hlbWEsIHNlYXJjaFJlc3VsdFNjaGVtYSwgY3JlYXRlSW5kZXhUb29sU2NoZW1hLCBpbmRleEluZm9TY2hlbWEsIHN5bmNJbmRleFRvb2xTY2hlbWEgfSBmcm9tIFwiLi9zcmMvc2NoZW1hLnRzXCI7XG5leHBvcnQgeyBzZWFyY2hUb29sLCB1bml2ZXJzYWxTZWFyY2hUb29sLCBhZGREb2N1bWVudHNUb29sLCBjcmVhdGVJbmRleFRvb2wsIHN5bmNJbmRleFRvb2wgfSBmcm9tIFwiLi9zcmMvdG9vbC50c1wiO1xuZXhwb3J0IHR5cGUgeyBTZWFyY2hUb29sT3B0aW9ucyB9IGZyb20gXCIuL3NyYy90b29sLnRzXCI7XG4iXX0=
|
|
18
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLFVBQVUsTUFBTSxzQkFBc0IsQ0FBQztBQUNuRCxPQUFPLEtBQUssUUFBUSxNQUFNLG1CQUFtQixDQUFDO0FBQzlDLE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLEtBQUssTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QyxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLElBQUksTUFBTSxlQUFlLENBQUM7QUFDdEMsT0FBTyxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUU1RCxPQUFPLEVBQUUsU0FBUyxFQUFFLG9CQUFvQixFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsaUJBQWlCLEVBQUUsa0JBQWtCLEVBQUUsaUJBQWlCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUU5SyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUUxRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBR3ZELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxpQ0FBaUMsRUFBRSw4QkFBOEIsRUFBRSw2QkFBNkIsRUFBRSwyQkFBMkIsRUFBRSxnQkFBZ0IsRUFBRSx5QkFBeUIsRUFBRSxrQkFBa0IsRUFBRSxxQkFBcUIsRUFBRSxlQUFlLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEdFTkVSQVRFRCBieSBwcm9qZW4gd2F0Y2ggLSBETyBOT1QgRURJVC5cbi8vIFJlZ2VuZXJhdGVkIGZyb20gdGhlIGV4cG9ydGluZyBtb2R1bGVzIGluIC4vc3JjLlxuLy8gSGFuZCBlZGl0cyBhcmUgb3ZlcndyaXR0ZW4gb24gdGhlIG5leHQgd2F0Y2g7IHRoaXMgZmlsZSBpcyByZWFkLW9ubHkuXG5cbmV4cG9ydCAqIGFzIGNsaWVudCBmcm9tIFwiLi9zcmMvY2xpZW50LnRzXCI7XG5leHBvcnQgKiBhcyBjb25maWcgZnJvbSBcIi4vc3JjL2NvbmZpZy50c1wiO1xuZXhwb3J0ICogYXMgaW5kZXhUb29scyBmcm9tIFwiLi9zcmMvaW5kZXgtdG9vbHMudHNcIjtcbmV4cG9ydCAqIGFzIGxha2ViYXNlIGZyb20gXCIuL3NyYy9sYWtlYmFzZS50c1wiO1xuZXhwb3J0ICogYXMgcGx1Z2luIGZyb20gXCIuL3NyYy9wbHVnaW4udHNcIjtcbmV4cG9ydCAqIGFzIHF1ZXJ5IGZyb20gXCIuL3NyYy9xdWVyeS50c1wiO1xuZXhwb3J0ICogYXMgcnVudGltZSBmcm9tIFwiLi9zcmMvcnVudGltZS50c1wiO1xuZXhwb3J0ICogYXMgc2NoZW1hIGZyb20gXCIuL3NyYy9zY2hlbWEudHNcIjtcbmV4cG9ydCAqIGFzIHRvb2wgZnJvbSBcIi4vc3JjL3Rvb2wudHNcIjtcbmV4cG9ydCB7IFNlYXJjaEluZGV4LCBTZWFyY2hDbGllbnQgfSBmcm9tIFwiLi9zcmMvY2xpZW50LnRzXCI7XG5leHBvcnQgdHlwZSB7IFNlYXJjaE9wdGlvbnMsIFVuaXZlcnNhbFNlYXJjaE9wdGlvbnMsIEluZGV4SW5mbywgQ3JlYXRlSW5kZXhPcHRpb25zLCBFbnN1cmVFbmRwb2ludE9wdGlvbnMsIFByb3Zpc2lvbk9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvY2xpZW50LnRzXCI7XG5leHBvcnQgeyBJTkRFWF9FTlYsIERBVEFCUklDS1NfSU5ERVhfRU5WLCBFTkRQT0lOVF9FTlYsIERFRkFVTFRfTU9ERSwgREVGQVVMVF9QQUdFX1NJWkUsIERFRkFVTFRfVElNRU9VVF9NUywgREVGQVVMVF9CQVNFX1BBVEgsIFNFQVJDSF9DT05GSUdfU0NIRU1BIH0gZnJvbSBcIi4vc3JjL2NvbmZpZy50c1wiO1xuZXhwb3J0IHR5cGUgeyBTZWFyY2hJbmRleENvbmZpZywgU2VhcmNoUGx1Z2luQ29uZmlnLCBFbnN1cmVPblNldHVwQ29uZmlnLCBSZXNvbHZlZEluZGV4Q29uZmlnLCBSZXNvbHZlZFNlYXJjaENvbmZpZyB9IGZyb20gXCIuL3NyYy9jb25maWcudHNcIjtcbmV4cG9ydCB7IExha2ViYXNlU2VhcmNoQmFja2VuZCB9IGZyb20gXCIuL3NyYy9sYWtlYmFzZS50c1wiO1xuZXhwb3J0IHR5cGUgeyBMYWtlYmFzZVNlYXJjaE9wdGlvbnMsIExha2ViYXNlUHJvdmlzaW9uT3B0aW9ucyB9IGZyb20gXCIuL3NyYy9sYWtlYmFzZS50c1wiO1xuZXhwb3J0IHsgU2VhcmNoUGx1Z2luLCBzZWFyY2ggfSBmcm9tIFwiLi9zcmMvcGx1Z2luLnRzXCI7XG5leHBvcnQgdHlwZSB7IFF1ZXJ5UmVzcG9uc2VMaWtlIH0gZnJvbSBcIi4vc3JjL3F1ZXJ5LnRzXCI7XG5leHBvcnQgdHlwZSB7IFNlYXJjaFJ1bnRpbWVPcHRpb25zLCBTZWFyY2hSdW50aW1lIH0gZnJvbSBcIi4vc3JjL3J1bnRpbWUudHNcIjtcbmV4cG9ydCB7IFNFQVJDSF9UT09MX0RFU0NSSVBUSU9OLCBVTklWRVJTQUxfU0VBUkNIX1RPT0xfREVTQ1JJUFRJT04sIEFERF9ET0NVTUVOVFNfVE9PTF9ERVNDUklQVElPTiwgQ1JFQVRFX0lOREVYX1RPT0xfREVTQ1JJUFRJT04sIFNZTkNfSU5ERVhfVE9PTF9ERVNDUklQVElPTiwgc2VhcmNoVG9vbFNjaGVtYSwgdW5pdmVyc2FsU2VhcmNoVG9vbFNjaGVtYSwgc2VhcmNoUmVzdWx0U2NoZW1hLCBjcmVhdGVJbmRleFRvb2xTY2hlbWEsIGluZGV4SW5mb1NjaGVtYSwgc3luY0luZGV4VG9vbFNjaGVtYSB9IGZyb20gXCIuL3NyYy9zY2hlbWEudHNcIjtcbmV4cG9ydCB0eXBlIHsgU2VhcmNoVG9vbE9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvdG9vbC50c1wiO1xuIl19
|
package/lib/src/client.js
CHANGED
|
@@ -595,4 +595,4 @@ function defaultWorkspaceClient() {
|
|
|
595
595
|
export function createSearchClient(config, workspaceClientFactory, lakebase) {
|
|
596
596
|
return new SearchClient(config, workspaceClientFactory, lakebase);
|
|
597
597
|
}
|
|
598
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTRCRztBQUVILE9BQU8sRUFBRSxjQUFjLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUV6RSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxJQUFJLFlBQVksRUFBRSxPQUFPLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQVE1RSxPQUFPLEVBQUUsS0FBSyxJQUFJLFNBQVMsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQy9FLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNyRCxPQUFPLEVBQ0wsWUFBWSxFQUNaLGlCQUFpQixFQUNqQixrQkFBa0IsRUFDbEIsY0FBYyxFQUNkLGdCQUFnQixHQUVqQixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQ0wsYUFBYSxFQUNiLE1BQU0sRUFDTixXQUFXLEVBQ1gsZ0JBQWdCLEdBRWpCLE1BQU0sWUFBWSxDQUFDO0FBSXBCLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7QUE4QjNDOzs7O0dBSUc7QUFDSCxNQUFNLE9BQU8sV0FBVztJQUVYO0lBQ1E7SUFGbkIsWUFDVyxJQUFZLEVBQ0osTUFBb0I7UUFENUIsU0FBSSxHQUFKLElBQUksQ0FBUTtRQUNKLFdBQU0sR0FBTixNQUFNLENBQWM7SUFDcEMsQ0FBQztJQUVKLDBEQUEwRDtJQUMxRCxNQUFNLENBQUMsS0FBYSxFQUFFLE9BQXVCO1FBQzNDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLEVB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Qy9DLE1BQU0sR0FBRyxDQUFDO1FBQ1osQ0FBQztnQkFBUyxDQUFDO1lBQ1QsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3RCLENBQUM7SUFDSCxDQUFDO0NBQ0Y7QUFFRCx1RkFBdUY7QUFDdkYsU0FBUyxzQkFBc0I7SUFDN0IsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLHNCQUFzQixFQUFFLENBQUM7SUFDNUMsSUFBSSxHQUFHLEVBQUUsTUFBTTtRQUFFLE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQztJQUNuQyx1RUFBdUU7SUFDdkUsT0FBTyxtQkFBbUIsRUFBRSxDQUFDLE1BQU0sQ0FBQztBQUN0QyxDQUFDO0FBRUQsK0RBQStEO0FBQy9ELE1BQU0sVUFBVSxrQkFBa0IsQ0FDaEMsTUFBNkIsRUFDN0Isc0JBQWtELEVBQ2xELFFBQWdDO0lBRWhDLE9BQU8sSUFBSSxZQUFZLENBQUMsTUFBTSxFQUFFLHNCQUFzQixFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQ3BFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEEgc21hbGwsIE1laWxpc2VhcmNoLXNoYXBlZCBjbGllbnQgb3ZlciBEYXRhYnJpY2tzIEFJIFNlYXJjaCAoVmVjdG9yXG4gKiBTZWFyY2gpLiBUaGUgd2hvbGUgcG9pbnQgb2YgdGhpcyBtb2R1bGUgaXMgZXJnb25vbWljczogdGhlIERhdGFicmlja3MgU0RLJ3NcbiAqIGB2ZWN0b3JTZWFyY2hJbmRleGVzLnF1ZXJ5SW5kZXgoeyBpbmRleF9uYW1lLCBjb2x1bW5zLCBxdWVyeV90ZXh0LFxuICogcXVlcnlfdHlwZSwgbnVtX3Jlc3VsdHMsIGZpbHRlcnNfanNvbiB9KWAgaXMgcG93ZXJmdWwgYnV0IHZlcmJvc2UsIGFuZCB0aGVcbiAqIHJlc3BvbnNlIGlzIGNvbHVtbmFyLiBUaGlzIGNsaWVudCBoaWRlcyBhbGwgb2YgdGhhdCBiZWhpbmQgdHdvIG9iamVjdHM6XG4gKlxuICogYGBgdHNcbiAqIGNvbnN0IGNsaWVudCA9IGNyZWF0ZVNlYXJjaENsaWVudCgpO1xuICogY29uc3QgaW5kZXggPSBjbGllbnQuaW5kZXgoXCJtYWluLnN1cHBvcnQuZG9jc1wiKTtcbiAqIGNvbnN0IHsgaGl0cyB9ID0gYXdhaXQgaW5kZXguc2VhcmNoKFwicmVzZXQgbXkgcGFzc3dvcmRcIiwgeyBsaW1pdDogNSB9KTtcbiAqIGF3YWl0IGluZGV4LmFkZERvY3VtZW50cyhbeyBpZDogXCI0MlwiLCB0aXRsZTogXCJSZXNldFwiLCBib2R5OiBcIi4uLlwiIH1dKTtcbiAqIGBgYFxuICpcbiAqIGBjbGllbnQuc2VhcmNoKHF1ZXJ5LCBvcHRzKWAgc2VhcmNoZXMgdGhlIGRlZmF1bHQgaW5kZXg7IGBjbGllbnQuaW5kZXgobmFtZSlgXG4gKiByZXR1cm5zIGEgaGFuZGxlIGJvdW5kIHRvIG9uZSBpbmRleDsgYGNsaWVudC51bml2ZXJzYWxTZWFyY2gocXVlcnkpYCBmYW5zIGFcbiAqIHF1ZXJ5IGFjcm9zcyBzZXZlcmFsIGluZGV4ZXMgYW5kIG1lcmdlcyB0aGUgcmVzdWx0cyAoTWVpbGlzZWFyY2gncyBmZWRlcmF0ZWRcbiAqIC8gbXVsdGktc2VhcmNoLCB0aGUgXCJ1bml2ZXJzYWwgc2VhcmNoXCIgdGhlIGNhbGxlciBhc2tlZCBmb3IpLiBFdmVyeXRoaW5nIGlzXG4gKiBhc3luYyBhbmQgY2FuY2VsbGFibGUsIHJlc29sdmVzIHRoZSBPQk8gd29ya3NwYWNlIGNsaWVudCBmcm9tIHRoZSBhY3RpdmVcbiAqIEFwcEtpdCBleGVjdXRpb24gY29udGV4dCAoZmFsbGluZyBiYWNrIHRvIGEgc2VydmljZS1wcmluY2lwYWwgY2xpZW50IG91dHNpZGVcbiAqIGEgcmVxdWVzdCksIGFuZCByZXR1cm5zIHRoZSBicm93c2VyLXNhZmUgc2hhcGVzIGZyb21cbiAqIGBAZGJ4LXRvb2xzL3NoYXJlZC1zZWFyY2hgLlxuICpcbiAqIEF1dG9jb21wbGV0ZSBpcyBqdXN0IGEgc2VhcmNoIHdpdGggYSBzbWFsbCBgbGltaXRgIGFuZCB0aGUgcmF3IHF1ZXJ5IHRleHQgLVxuICogaHlicmlkIG1vZGUgYWxyZWFkeSBwcmVmaXgtbWF0Y2hlcywgc28gbm8gc2VwYXJhdGUgZW5kcG9pbnQgaXMgbmVlZGVkOyB0aGVcbiAqIHtAbGluayBTZWFyY2hJbmRleC5hdXRvY29tcGxldGV9IGhlbHBlciBpcyBhIHRoaW4sIHNlbGYtZG9jdW1lbnRpbmcgYWxpYXMuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IEV4ZWN1dGlvbkVycm9yLCBnZXRFeGVjdXRpb25Db250ZXh0IH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHsgQ29udGV4dCB9IGZyb20gXCJAZGF0YWJyaWNrcy9zZGstZXhwZXJpbWVudGFsXCI7XG5pbXBvcnQgeyBhcHBraXQsIGRhdGFicmlja3MgfSBmcm9tIFwiQGRieC10b29scy9hcHBraXRcIjtcbmltcG9ydCB7IGludm9rZSwgcmVzb2x2ZSBhcyBtb2RlbFJlc29sdmUsIHNlcnZpbmcgfSBmcm9tIFwiQGRieC10b29scy9tb2RlbFwiO1xuaW1wb3J0IHR5cGUge1xuICBTZWFyY2hEb2N1bWVudCxcbiAgU2VhcmNoSGl0LFxuICBTZWFyY2hNb2RlLFxuICBTZWFyY2hSZXN1bHQsXG4gIFVwc2VydFJlc3VsdCxcbn0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLXNlYXJjaFwiO1xuaW1wb3J0IHsgYXN5bmMgYXMgYXN5bmNVdGlsLCBqc29uLCBsb2csIHN0cmluZyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgeyBNb2RlbENsYXNzIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1vZGVsXCI7XG5pbXBvcnQge1xuICBERUZBVUxUX01PREUsXG4gIERFRkFVTFRfUEFHRV9TSVpFLFxuICBERUZBVUxUX1RJTUVPVVRfTVMsXG4gIGluZGV4Q29uZmlnRm9yLFxuICByZXNvbHZlSW5kZXhOYW1lLFxuICB0eXBlIFJlc29sdmVkU2VhcmNoQ29uZmlnLFxufSBmcm9tIFwiLi9jb25maWcudHNcIjtcbmltcG9ydCB7XG4gIGNvbXBpbGVGaWx0ZXIsXG4gIHRvSGl0cyxcbiAgdG9RdWVyeVR5cGUsXG4gIHRvUmVxdWVzdENvbHVtbnMsXG4gIHR5cGUgUXVlcnlSZXNwb25zZUxpa2UsXG59IGZyb20gXCIuL3F1ZXJ5LnRzXCI7XG5pbXBvcnQgdHlwZSB7IExha2ViYXNlU2VhcmNoQmFja2VuZCB9IGZyb20gXCIuL2xha2ViYXNlLnRzXCI7XG5cbnR5cGUgV29ya3NwYWNlQ2xpZW50TGlrZSA9IGFwcGtpdC5Xb3Jrc3BhY2VDbGllbnRMaWtlO1xuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcInNlYXJjaC9jbGllbnRcIik7XG5cbi8qKiBPcHRpb25zIGFjY2VwdGVkIGJ5IGEgc2luZ2xlLWluZGV4IHNlYXJjaC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VhcmNoT3B0aW9ucyB7XG4gIC8qKiBNYXhpbXVtIGhpdHMgdG8gcmV0dXJuLiBEZWZhdWx0cyB0byB0aGUgY29uZmlndXJlZCBwYWdlIHNpemUuICovXG4gIGxpbWl0PzogbnVtYmVyO1xuICAvKiogTWF0Y2ggbW9kZS4gRGVmYXVsdHMgdG8gdGhlIGNvbmZpZ3VyZWQgbW9kZSAoaHlicmlkKS4gKi9cbiAgbW9kZT86IFNlYXJjaE1vZGU7XG4gIC8qKiBDb2x1bW5zIHRvIHJldHVybiBwZXIgaGl0LiBEZWZhdWx0cyB0byB0aGUgaW5kZXgncyBjb25maWd1cmVkIGNvbHVtbnMuICovXG4gIGNvbHVtbnM/OiByZWFkb25seSBzdHJpbmdbXTtcbiAgLyoqIEF0dHJpYnV0ZSBmaWx0ZXJzIGFzIGB7IGNvbHVtbjogdmFsdWUgfWAgb3IgYHsgY29sdW1uOiB7IFwiPj1cIjogbiB9IH1gLiAqL1xuICBmaWx0ZXI/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgLyoqIERyb3AgaGl0cyBiZWxvdyB0aGlzIHNjb3JlLiAqL1xuICBzY29yZVRocmVzaG9sZD86IG51bWJlcjtcbiAgLyoqIEV4dGVybmFsIGNhbmNlbGxhdGlvbi4gKi9cbiAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG59XG5cbi8qKiBPcHRpb25zIGFjY2VwdGVkIGJ5IGEgdW5pdmVyc2FsIChmZWRlcmF0ZWQpIHNlYXJjaC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVW5pdmVyc2FsU2VhcmNoT3B0aW9ucyB7XG4gIC8qKiBJbmRleGVzIHRvIHNlYXJjaC4gRGVmYXVsdHMgdG8gZXZlcnkga25vd24gaW5kZXguICovXG4gIGluZGV4ZXM/OiByZWFkb25seSBzdHJpbmdbXTtcbiAgLyoqIE1heGltdW0gaGl0cyBwZXIgaW5kZXggYmVmb3JlIG1lcmdpbmcuICovXG4gIGxpbWl0PzogbnVtYmVyO1xuICAvKiogTWF0Y2ggbW9kZS4gKi9cbiAgbW9kZT86IFNlYXJjaE1vZGU7XG4gIC8qKiBFeHRlcm5hbCBjYW5jZWxsYXRpb24uICovXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsO1xufVxuXG4vKipcbiAqIEEgaGFuZGxlIGJvdW5kIHRvIG9uZSBpbmRleC4gTW9kZWxlZCBvbiBNZWlsaXNlYXJjaCdzIGBjbGllbnQuaW5kZXgodWlkKWA6XG4gKiBgc2VhcmNoYCAvIGBhdXRvY29tcGxldGVgIHJlYWQsIGBhZGREb2N1bWVudHNgIC8gYGRlbGV0ZURvY3VtZW50c2Agd3JpdGUgKHRvXG4gKiBhIGRpcmVjdC1hY2Nlc3MgaW5kZXgpLCBhbmQgYGluZm9gIGZldGNoZXMgdGhlIGxpdmUgZGVmaW5pdGlvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIFNlYXJjaEluZGV4IHtcbiAgY29uc3RydWN0b3IoXG4gICAgcmVhZG9ubHkgbmFtZTogc3RyaW5nLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY2xpZW50OiBTZWFyY2hDbGllbnQsXG4gICkge31cblxuICAvKiogU2VhcmNoIHRoaXMgaW5kZXguIFNlZSB7QGxpbmsgU2VhcmNoQ2xpZW50LnNlYXJjaH0uICovXG4gIHNlYXJjaChxdWVyeTogc3RyaW5nLCBvcHRpb25zPzogU2VhcmNoT3B0aW9ucyk6IFByb21pc2U8U2VhcmNoUmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LnNlYXJjaChxdWVyeSwgeyAuLi5vcHRpb25zLCBpbmRleDogdGhpcy5uYW1lIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEF1dG9jb21wbGV0ZSBhZ2FpbnN0IHRoaXMgaW5kZXg6IGEgc2VhcmNoIHdpdGggYSBzbWFsbCBkZWZhdWx0IGBsaW1pdGAgYW5kXG4gICAqIHRoZSByYXcgcHJlZml4IGFzIHRoZSBxdWVyeS4gSHlicmlkIG1vZGUgYWxyZWFkeSBoYW5kbGVzIHByZWZpeGVzLCBzbyB0aGlzXG4gICAqIGlzIGEgc2VsZi1kb2N1bWVudGluZyBhbGlhcyByYXRoZXIgdGhhbiBhIHNlcGFyYXRlIGNvZGUgcGF0aC5cbiAgICovXG4gIGF1dG9jb21wbGV0ZShwcmVmaXg6IHN0cmluZywgb3B0aW9ucz86IFNlYXJjaE9wdGlvbnMpOiBQcm9taXNlPFNlYXJjaFJlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLnNlYXJjaChwcmVmaXgsIHsgbGltaXQ6IDUsIC4uLm9wdGlvbnMgfSk7XG4gIH1cblxuICAvKiogQWRkIG9yIHVwZGF0ZSBkb2N1bWVudHMgaW4gdGhpcyAoZGlyZWN0LWFjY2VzcykgaW5kZXguICovXG4gIGFkZERvY3VtZW50cyhkb2N1bWVudHM6IFNlYXJjaERvY3VtZW50W10sIHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTxVcHNlcnRSZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuYWRkRG9jdW1lbnRzKHRoaXMubmFtZSwgZG9jdW1lbnRzLCBzaWduYWwpO1xuICB9XG5cbiAgLyoqIERlbGV0ZSBkb2N1bWVudHMgZnJvbSB0aGlzIChkaXJlY3QtYWNjZXNzKSBpbmRleCBieSBwcmltYXJ5IGtleS4gKi9cbiAgZGVsZXRlRG9jdW1lbnRzKGlkczogQXJyYXk8c3RyaW5nIHwgbnVtYmVyPiwgc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPFVwc2VydFJlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5kZWxldGVEb2N1bWVudHModGhpcy5uYW1lLCBpZHMsIHNpZ25hbCk7XG4gIH1cblxuICAvKiogRmV0Y2ggdGhpcyBpbmRleCdzIGxpdmUgZGVmaW5pdGlvbiAocHJpbWFyeSBrZXksIGNvbHVtbnMsIHJlYWRpbmVzcykuICovXG4gIGluZm8oc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPEluZGV4SW5mbz4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXRJbmRleCh0aGlzLm5hbWUsIHNpZ25hbCk7XG4gIH1cblxuICAvKiogVHJpZ2dlciBhIHN5bmMgb2YgdGhpcyAoRGVsdGEgU3luYykgaW5kZXggZnJvbSBpdHMgc291cmNlIHRhYmxlLiAqL1xuICBzeW5jKHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LnN5bmNJbmRleCh0aGlzLm5hbWUsIHNpZ25hbCk7XG4gIH1cblxuICAvKiogRGVsZXRlIHRoaXMgaW5kZXguICovXG4gIGRlbGV0ZShzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5kZWxldGVJbmRleCh0aGlzLm5hbWUsIHNpZ25hbCk7XG4gIH1cblxuICAvKiogQ3JlYXRlIHRoaXMgaW5kZXggaWYgaXQgZG9lcyBub3QgZXhpc3QsIG90aGVyd2lzZSByZXR1cm4gdGhlIGV4aXN0aW5nIG9uZS4gKi9cbiAgZW5zdXJlKG9wdGlvbnM/OiBDcmVhdGVJbmRleE9wdGlvbnMpOiBQcm9taXNlPEluZGV4SW5mbz4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5lbnN1cmVJbmRleCh0aGlzLm5hbWUsIG9wdGlvbnMpO1xuICB9XG59XG5cbi8qKiBBIHJlc29sdmVkIGxpdmUgaW5kZXggZGVmaW5pdGlvbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5kZXhJbmZvIHtcbiAgbmFtZTogc3RyaW5nO1xuICBlbmRwb2ludD86IHN0cmluZztcbiAgcHJpbWFyeUtleT86IHN0cmluZztcbiAgY29sdW1uczogc3RyaW5nW107XG4gIHJlYWR5OiBib29sZWFuO1xuICByb3dDb3VudD86IG51bWJlcjtcbiAgLyoqIFRydWUgZm9yIGEgRElSRUNUX0FDQ0VTUyBpbmRleCAoeW91IHN1cHBseSB2ZWN0b3JzOyBxdWVyaWVzIGVtYmVkIGNsaWVudC1zaWRlKS4gKi9cbiAgZGlyZWN0QWNjZXNzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgU2VhcmNoQ2xpZW50LmNyZWF0ZUluZGV4fSAvIHtAbGluayBTZWFyY2hDbGllbnQuZW5zdXJlSW5kZXh9LlxuICogVGhlIGdvYWwgaXMgdGhlIHNhbWUgYXMgdGhlIHJlc3Qgb2YgdGhlIGNsaWVudDogbmFtZSBhIHNvdXJjZSB0YWJsZSBhbmQgYVxuICogdGV4dCBjb2x1bW4sIGFuZCBldmVyeXRoaW5nIGVsc2UgLSB0aGUgZW5kcG9pbnQsIHRoZSBlbWJlZGRpbmcgbW9kZWwsIHRoZVxuICogaW5kZXggdHlwZSwgdGhlIHN5bmMgbW9kZSAtIGhhcyBhIHNlbnNpYmxlIGRlZmF1bHQgdGhhdCBpbmZlcnMgZnJvbSB0aGVcbiAqIHdvcmtzcGFjZSwgb3ZlcnJpZGFibGUgd2hlbiBhIGRlcGxveW1lbnQgbmVlZHMgdG8gZ28gZGVlcGVyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZUluZGV4T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBTb3VyY2UgRGVsdGEgdGFibGUgKGNhdGFsb2cuc2NoZW1hLnRhYmxlKSBmb3IgYSBEZWx0YSBTeW5jIGluZGV4LiBQcm92aWRlXG4gICAqIHRoaXMgZm9yIHRoZSBjb21tb24gY2FzZTogRGF0YWJyaWNrcyBjb21wdXRlcyBhbmQgc3luY3MgZW1iZWRkaW5ncyBmcm9tIGl0LlxuICAgKiBPbWl0IGl0IChhbmQgcGFzcyB7QGxpbmsgZW1iZWRkaW5nRGltZW5zaW9ufSkgdG8gY3JlYXRlIGEgZGlyZWN0LWFjY2Vzc1xuICAgKiBpbmRleCB5b3Ugd3JpdGUgdmVjdG9ycyB0byB5b3Vyc2VsZi5cbiAgICovXG4gIHNvdXJjZVRhYmxlPzogc3RyaW5nO1xuICAvKiogUHJpbWFyeS1rZXkgY29sdW1uLiBEZWZhdWx0cyB0byBgaWRgLiAqL1xuICBwcmltYXJ5S2V5Pzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHRleHQgY29sdW1uIGVtYmVkZGluZ3MgYXJlIGNvbXB1dGVkIGZyb20gKERlbHRhIFN5bmMpLiBEZWZhdWx0cyB0byB0aGVcbiAgICogZmlyc3Qgb2YgYHRleHRgIC8gYGNvbnRlbnRgIC8gYGJvZHlgIHByZXNlbnQsIGVsc2UgdGhlIGNhbGxlciBtdXN0IHNldCBpdC5cbiAgICovXG4gIGVtYmVkZGluZ1NvdXJjZUNvbHVtbj86IHN0cmluZztcbiAgLyoqXG4gICAqIEVtYmVkZGluZyBtb2RlbCBlbmRwb2ludC4gQSBsb29zZSBuYW1lIGlzIGZ1enp5LW1hdGNoZWQ7IHdoZW4gb21pdHRlZCB0aGVcbiAgICogYmVzdCBlbWJlZGRpbmcgZW5kcG9pbnQgaW4gdGhlIHdvcmtzcGFjZSBpcyBjaG9zZW4gKHtAbGluayByZXNvbHZlRW1iZWRkaW5nTW9kZWx9KS5cbiAgICovXG4gIGVtYmVkZGluZ01vZGVsPzogc3RyaW5nO1xuICAvKiogVmVjdG9yIFNlYXJjaCBlbmRwb2ludCB0byBob3N0IHRoZSBpbmRleCBvbi4gRGVmYXVsdHMgdG8gdGhlIHBsdWdpbidzIGBlbmRwb2ludGAuICovXG4gIGVuZHBvaW50Pzogc3RyaW5nO1xuICAvKiogRm9yIGEgZGlyZWN0LWFjY2VzcyBpbmRleDogdGhlIGVtYmVkZGluZyB2ZWN0b3IgZGltZW5zaW9uIChzZWxmLW1hbmFnZWQgdmVjdG9ycywgbm8gc291cmNlIHRhYmxlKS4gKi9cbiAgZW1iZWRkaW5nRGltZW5zaW9uPzogbnVtYmVyO1xuICAvKiogRm9yIGEgZGlyZWN0LWFjY2VzcyBpbmRleDogdGhlIGNvbHVtbiB0aGUgdmVjdG9yIGlzIHN0b3JlZCBpbi4gRGVmYXVsdHMgdG8gYGVtYmVkZGluZ2AuICovXG4gIGVtYmVkZGluZ1ZlY3RvckNvbHVtbj86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBjb2x1bW4tbmFtZSAtPiB0eXBlIG1hcCB1c2VkIHRvIGJ1aWxkIGEgZGlyZWN0LWFjY2VzcyBpbmRleCdzXG4gICAqIGBzY2hlbWFfanNvbmAgKHR5cGVzOiBgc3RyaW5nYCwgYGludGAsIGBsb25nYCwgYGZsb2F0YCwgYGRvdWJsZWAsXG4gICAqIGBib29sZWFuYCwgYGRhdGVgLCBgdGltZXN0YW1wYCkuIE11c3QgaW5jbHVkZSB0aGUgcHJpbWFyeSBrZXkgYW5kIGFueVxuICAgKiBjb2x1bW5zIHlvdSB1cHNlcnQuIERlZmF1bHRzIHRvIGB7IGlkOiBcInN0cmluZ1wiLCB0ZXh0OiBcInN0cmluZ1wiIH1gLiBUaGVcbiAgICogZW1iZWRkaW5nIHZlY3RvciBjb2x1bW4gaXMgYWRkZWQgYXV0b21hdGljYWxseS5cbiAgICovXG4gIHNjaGVtYT86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIC8qKiBTeW5jIG1vZGUgZm9yIGEgRGVsdGEgU3luYyBpbmRleC4gYFRSSUdHRVJFRGAgKGRlZmF1bHQpIHN5bmNzIG9uIGRlbWFuZDsgYENPTlRJTlVPVVNgIGtlZXBzIGZyZXNoLiAqL1xuICBwaXBlbGluZVR5cGU/OiBcIlRSSUdHRVJFRFwiIHwgXCJDT05USU5VT1VTXCI7XG4gIC8qKiBFeHRyYSBjb2x1bW5zIHRvIHN5bmMgYWxvbmdzaWRlIHRoZSBlbWJlZGRpbmcgc291cmNlIChEZWx0YSBTeW5jKS4gKi9cbiAgY29sdW1uc1RvU3luYz86IHN0cmluZ1tdO1xuICAvKiogRXh0ZXJuYWwgY2FuY2VsbGF0aW9uLiAqL1xuICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbn1cblxuLyoqIE9wdGlvbnMgZm9yIHtAbGluayBTZWFyY2hDbGllbnQuZW5zdXJlRW5kcG9pbnR9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbnN1cmVFbmRwb2ludE9wdGlvbnMge1xuICAvKiogV2FpdCBmb3IgdGhlIGVuZHBvaW50IHRvIGNvbWUgb25saW5lIGJlZm9yZSByZXR1cm5pbmcuIERlZmF1bHRzIHRvIGZhbHNlLiAqL1xuICB3YWl0PzogYm9vbGVhbjtcbiAgLyoqIEV4dGVybmFsIGNhbmNlbGxhdGlvbi4gKi9cbiAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIFNlYXJjaENsaWVudC5wcm92aXNpb259IC0gYSBvbmUtY2FsbCBcIm1ha2UgdGhpcyBpbmRleCByZWFsXG4gKiBhbmQgc2VhcmNoYWJsZVwiIHVzZWQgYXQgYm9vdCBvciBpbiBhIHNlZWQgc2NyaXB0LiBJdCBlbnN1cmVzIHRoZSBlbmRwb2ludCxcbiAqIGVuc3VyZXMgdGhlIGluZGV4LCBhbmQgKG9wdGlvbmFsbHkpIHNlZWRzIGRvY3VtZW50cyB3aGVuIHRoZSBpbmRleCBpcyBlbXB0eS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm92aXNpb25PcHRpb25zIGV4dGVuZHMgQ3JlYXRlSW5kZXhPcHRpb25zIHtcbiAgLyoqIERvY3VtZW50cyB0byBzZWVkIHdoZW4gdGhlIGluZGV4IGhhcyBubyByb3dzIHlldC4gU2tpcHBlZCBpZiBpdCBhbHJlYWR5IGhhcyBkYXRhLiAqL1xuICBzZWVkPzogU2VhcmNoRG9jdW1lbnRbXTtcbiAgLyoqXG4gICAqIFdhaXQgZm9yIHRoZSBlbmRwb2ludCBBTkQgaW5kZXggdG8gY29tZSBvbmxpbmUgYmVmb3JlIHJldHVybmluZyAobmVlZGVkXG4gICAqIGJlZm9yZSBzZWVkaW5nKS4gRGVmYXVsdHMgdG8gdHJ1ZS4gRW5kcG9pbnQgY3JlYXRpb24gY2FuIHRha2UgbWFueSBtaW51dGVzLlxuICAgKi9cbiAgd2FpdD86IGJvb2xlYW47XG4gIC8qKiBIb3cgbG9uZyB0byB3YWl0IGZvciByZWFkaW5lc3MgYmVmb3JlIGdpdmluZyB1cC4gRGVmYXVsdHMgdG8gMjAgbWludXRlcy4gKi9cbiAgdGltZW91dE1zPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIFRoZSBBSSBTZWFyY2ggY2xpZW50LiBDb25zdHJ1Y3QgaXQgd2l0aCB7QGxpbmsgY3JlYXRlU2VhcmNoQ2xpZW50fSAod2hpY2hcbiAqIHJlYWRzIGEgcmVzb2x2ZWQgY29uZmlnKSBvciBkaXJlY3RseSBmb3Igb25lLW9mZiB1c2UuIEFsbCByZWFkcyByZXNvbHZlIHRoZVxuICogT0JPIHdvcmtzcGFjZSBjbGllbnQgZnJvbSB0aGUgYWN0aXZlIGV4ZWN1dGlvbiBjb250ZXh0LlxuICovXG5leHBvcnQgY2xhc3MgU2VhcmNoQ2xpZW50IHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBjb25maWc6IFJlc29sdmVkU2VhcmNoQ29uZmlnID0ge1xuICAgICAgaW5kZXhlczogW10sXG4gICAgICBwYWdlU2l6ZTogREVGQVVMVF9QQUdFX1NJWkUsXG4gICAgICBtb2RlOiBERUZBVUxUX01PREUsXG4gICAgICBiYXNlUGF0aDogXCIvYXBpL3NlYXJjaFwiLFxuICAgICAgdGltZW91dE1zOiBERUZBVUxUX1RJTUVPVVRfTVMsXG4gICAgICBhbGxvd1dyaXRlOiBmYWxzZSxcbiAgICB9LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgd29ya3NwYWNlQ2xpZW50RmFjdG9yeTogKCkgPT4gV29ya3NwYWNlQ2xpZW50TGlrZSA9IGRlZmF1bHRXb3Jrc3BhY2VDbGllbnQsXG4gICAgLyoqXG4gICAgICogT3B0aW9uYWwgTGFrZWJhc2UgZnVsbC10ZXh0IEZBTExCQUNLIGJhY2tlbmQuIFByZXNlbnQgb25seSB3aGVuIG5vIFZlY3RvclxuICAgICAqIFNlYXJjaCBlbmRwb2ludCBpcyBjb25maWd1cmVkIGJ1dCBhIExha2ViYXNlIHBvb2wgaXMgYXZhaWxhYmxlOyB3aGVuIHNldCxcbiAgICAgKiBzZWFyY2ggLyBwcm92aXNpb24gLyB3cml0ZSBvcGVyYXRpb25zIGRlbGVnYXRlIHRvIGl0IGFuZCByZXR1cm4gdGhlIGV4YWN0XG4gICAgICogc2FtZSBzaGFwZXMsIHNvIG5vdGhpbmcgZG93bnN0cmVhbSBjYW4gdGVsbCB3aGljaCBiYWNrZW5kIGFuc3dlcmVkLlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgbGFrZWJhc2U/OiBMYWtlYmFzZVNlYXJjaEJhY2tlbmQsXG4gICkge31cblxuICAvKiogVHJ1ZSB3aGVuIHRoaXMgY2xpZW50IGlzIGFuc3dlcmluZyBvdXQgb2YgdGhlIExha2ViYXNlIGZhbGxiYWNrIGJhY2tlbmQuICovXG4gIGdldCB1c2VzTGFrZWJhc2UoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubGFrZWJhc2UgIT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKiBBIGhhbmRsZSBib3VuZCB0byBvbmUgaW5kZXggKGJ5IGZ1bGwgVUMgbmFtZSBvciBjb25maWd1cmVkIGFsaWFzKS4gKi9cbiAgaW5kZXgocmVmZXJlbmNlOiBzdHJpbmcpOiBTZWFyY2hJbmRleCB7XG4gICAgY29uc3QgbmFtZSA9IHJlc29sdmVJbmRleE5hbWUodGhpcy5jb25maWcsIHJlZmVyZW5jZSkgPz8gcmVmZXJlbmNlO1xuICAgIHJldHVybiBuZXcgU2VhcmNoSW5kZXgobmFtZSwgdGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogU2VhcmNoIG9uZSBpbmRleC4gYGluZGV4YCBtYXkgYmUgYSBmdWxsIFVDIG5hbWUsIGEgY29uZmlndXJlZCBhbGlhcywgb3JcbiAgICogb21pdHRlZCB0byB1c2UgdGhlIGRlZmF1bHQgaW5kZXguIFJldHVybnMgaGl0cyBzb3J0ZWQgbW9zdC1yZWxldmFudC1maXJzdC5cbiAgICovXG4gIGFzeW5jIHNlYXJjaChcbiAgICBxdWVyeTogc3RyaW5nLFxuICAgIG9wdGlvbnM6IFNlYXJjaE9wdGlvbnMgJiB7IGluZGV4Pzogc3RyaW5nIH0gPSB7fSxcbiAgKTogUHJvbWlzZTxTZWFyY2hSZXN1bHQ+IHtcbiAgICBjb25zdCB0ZXh0ID0gc3RyaW5nLnRyaW1Ub0VtcHR5KHF1ZXJ5KTtcbiAgICBjb25zdCBuYW1lID0gcmVzb2x2ZUluZGV4TmFtZSh0aGlzLmNvbmZpZywgb3B0aW9ucy5pbmRleCk7XG4gICAgaWYgKG5hbWUgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFeGVjdXRpb25FcnJvcihcInNlYXJjaDogbm8gaW5kZXggY29uZmlndXJlZDsgc2V0IGEgZGVmYXVsdCBpbmRleCBvciBwYXNzIG9uZVwiLCB7XG4gICAgICAgIGNvbnRleHQ6IHsgb3BlcmF0aW9uOiBcInNlYXJjaFwiIH0sXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKHRoaXMubGFrZWJhc2UpIHtcbiAgICAgIHJldHVybiB0aGlzLmxha2ViYXNlLnNlYXJjaChuYW1lLCB0ZXh0LCB7XG4gICAgICAgIGxpbWl0OiBvcHRpb25zLmxpbWl0ID8/IHRoaXMuY29uZmlnLnBhZ2VTaXplLFxuICAgICAgICAuLi4ob3B0aW9ucy5zY29yZVRocmVzaG9sZCAhPT0gdW5kZWZpbmVkID8geyBzY29yZVRocmVzaG9sZDogb3B0aW9ucy5zY29yZVRocmVzaG9sZCB9IDoge30pLFxuICAgICAgICAuLi4ob3B0aW9ucy5zaWduYWwgPyB7IHNpZ25hbDogb3B0aW9ucy5zaWduYWwgfSA6IHt9KSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCBrbm93biA9IGluZGV4Q29uZmlnRm9yKHRoaXMuY29uZmlnLCBuYW1lKTtcbiAgICBjb25zdCBwcmltYXJ5S2V5ID0ga25vd24/LnByaW1hcnlLZXk7XG4gICAgY29uc3QgY29sdW1ucyA9IHRvUmVxdWVzdENvbHVtbnMoXG4gICAgICBvcHRpb25zLmNvbHVtbnMsXG4gICAgICBrbm93bj8uY29sdW1ucyA/PyB0aGlzLmNvbmZpZy5jb2x1bW5zLFxuICAgICAgcHJpbWFyeUtleSxcbiAgICApO1xuICAgIGNvbnN0IG1vZGUgPSBvcHRpb25zLm1vZGUgPz8gdGhpcy5jb25maWcubW9kZTtcbiAgICBjb25zdCBsaW1pdCA9IG9wdGlvbnMubGltaXQgPz8gdGhpcy5jb25maWcucGFnZVNpemU7XG5cbiAgICAvLyBEYXRhYnJpY2tzIG9ubHkgbWFuYWdlcyBlbWJlZGRpbmdzIGZvciBEZWx0YSBTeW5jIGluZGV4ZXMsIHNvIGEgcXVlcnlcbiAgICAvLyBhZ2FpbnN0IGEgRElSRUNUX0FDQ0VTUyBpbmRleCBtdXN0IGNhcnJ5IGEgcXVlcnkgVkVDVE9SLCBub3QgdGV4dC4gRW1iZWRcbiAgICAvLyB0aGUgcXVlcnkgY2xpZW50LXNpZGUgaW4gdGhhdCBjYXNlICh0aGUgaW5kZXggdHlwZSBpcyBjYWNoZWQgYWZ0ZXIgdGhlXG4gICAgLy8gZmlyc3QgbG9va3VwIHNvIHRoaXMgY29zdHMgb25lIGV4dHJhIGNhbGwgcGVyIGluZGV4LCBub3QgcGVyIHNlYXJjaCkuXG4gICAgY29uc3QgZGlyZWN0QWNjZXNzID0gYXdhaXQgdGhpcy5pc0RpcmVjdEFjY2VzcyhuYW1lLCBvcHRpb25zLnNpZ25hbCk7XG4gICAgY29uc3QgcXVlcnlWZWN0b3IgPSBkaXJlY3RBY2Nlc3NcbiAgICAgID8gKGF3YWl0IHRoaXMuZW1iZWQoW3RleHRdLCB0aGlzLmNvbmZpZy5lbWJlZGRpbmdNb2RlbCwgb3B0aW9ucy5zaWduYWwpKVswXVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMud2l0aENsaWVudChcInNlYXJjaFwiLCBvcHRpb25zLnNpZ25hbCwgYXN5bmMgKGNsaWVudCwgY29udGV4dCkgPT4ge1xuICAgICAgcmV0dXJuIGNsaWVudC52ZWN0b3JTZWFyY2hJbmRleGVzLnF1ZXJ5SW5kZXgoXG4gICAgICAgIHtcbiAgICAgICAgICBpbmRleF9uYW1lOiBuYW1lLFxuICAgICAgICAgIGNvbHVtbnMsXG4gICAgICAgICAgLi4uKHF1ZXJ5VmVjdG9yID8geyBxdWVyeV92ZWN0b3I6IHF1ZXJ5VmVjdG9yIH0gOiB7IHF1ZXJ5X3RleHQ6IHRleHQgfSksXG4gICAgICAgICAgcXVlcnlfdHlwZTogdG9RdWVyeVR5cGUobW9kZSksXG4gICAgICAgICAgbnVtX3Jlc3VsdHM6IGxpbWl0LFxuICAgICAgICAgIC4uLihjb21waWxlRmlsdGVyKG9wdGlvbnMuZmlsdGVyKSA/IHsgZmlsdGVyc19qc29uOiBjb21waWxlRmlsdGVyKG9wdGlvbnMuZmlsdGVyKSB9IDoge30pLFxuICAgICAgICAgIC4uLihvcHRpb25zLnNjb3JlVGhyZXNob2xkICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8geyBzY29yZV90aHJlc2hvbGQ6IG9wdGlvbnMuc2NvcmVUaHJlc2hvbGQgfVxuICAgICAgICAgICAgOiB7fSksXG4gICAgICAgIH0sXG4gICAgICAgIGNvbnRleHQsXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgY29uc3QgaGl0cyA9IHRvSGl0cyhyZXNwb25zZSBhcyBRdWVyeVJlc3BvbnNlTGlrZSwgcHJpbWFyeUtleSk7XG4gICAgcmV0dXJuIHsgcXVlcnk6IHRleHQsIGluZGV4OiBuYW1lLCBoaXRzLCBjb3VudDogaGl0cy5sZW5ndGggfTtcbiAgfVxuXG4gIC8qKiBDYWNoZSBvZiBpbmRleC1uYW1lIC0+IGlzLURJUkVDVF9BQ0NFU1MsIHNvIGEgc2VhcmNoIGVtYmVkcyBpdHMgcXVlcnkgb25seSB3aGVuIG5lZWRlZC4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBkaXJlY3RBY2Nlc3NDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBib29sZWFuPigpO1xuXG4gIC8qKiBXaGV0aGVyIGFuIGluZGV4IGlzIERJUkVDVF9BQ0NFU1MgKG1lbW9pemVkKTsgYSBsb29rdXAgZmFpbHVyZSBhc3N1bWVzIERlbHRhIFN5bmMuICovXG4gIHByaXZhdGUgYXN5bmMgaXNEaXJlY3RBY2Nlc3MobmFtZTogc3RyaW5nLCBzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMuZGlyZWN0QWNjZXNzQ2FjaGUuZ2V0KG5hbWUpO1xuICAgIGlmIChjYWNoZWQgIT09IHVuZGVmaW5lZCkgcmV0dXJuIGNhY2hlZDtcbiAgICB0cnkge1xuICAgICAgY29uc3QgaW5mbyA9IGF3YWl0IHRoaXMuZ2V0SW5kZXgobmFtZSwgc2lnbmFsKTtcbiAgICAgIGNvbnN0IHZhbHVlID0gaW5mby5kaXJlY3RBY2Nlc3MgPz8gZmFsc2U7XG4gICAgICB0aGlzLmRpcmVjdEFjY2Vzc0NhY2hlLnNldChuYW1lLCB2YWx1ZSk7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZhbiBhIHF1ZXJ5IGFjcm9zcyBzZXZlcmFsIGluZGV4ZXMgYW5kIG1lcmdlIHRoZSBoaXRzLCBzb3J0ZWQgYnkgc2NvcmUgLVxuICAgKiB0aGUgXCJ1bml2ZXJzYWwgc2VhcmNoXCIgYSBzaW5nbGUgYm94IG92ZXIgbWFueSBjb2xsZWN0aW9ucyBuZWVkcy4gRWFjaFxuICAgKiBpbmRleCBpcyBzZWFyY2hlZCBjb25jdXJyZW50bHk7IGFuIGluZGV4IHRoYXQgZXJyb3JzIGlzIGxvZ2dlZCBhbmQgc2tpcHBlZFxuICAgKiBzbyBvbmUgYmFkIGluZGV4IGRvZXMgbm90IHNpbmsgdGhlIHdob2xlIHNlYXJjaC5cbiAgICovXG4gIGFzeW5jIHVuaXZlcnNhbFNlYXJjaChcbiAgICBxdWVyeTogc3RyaW5nLFxuICAgIG9wdGlvbnM6IFVuaXZlcnNhbFNlYXJjaE9wdGlvbnMgPSB7fSxcbiAgKTogUHJvbWlzZTxTZWFyY2hSZXN1bHQ+IHtcbiAgICBjb25zdCB0ZXh0ID0gc3RyaW5nLnRyaW1Ub0VtcHR5KHF1ZXJ5KTtcbiAgICBjb25zdCBuYW1lcyA9XG4gICAgICBvcHRpb25zLmluZGV4ZXMgJiYgb3B0aW9ucy5pbmRleGVzLmxlbmd0aCA+IDBcbiAgICAgICAgPyBvcHRpb25zLmluZGV4ZXMubWFwKChyZWYpID0+IHJlc29sdmVJbmRleE5hbWUodGhpcy5jb25maWcsIHJlZikgPz8gcmVmKVxuICAgICAgICA6IHRoaXMuY29uZmlnLmluZGV4ZXMubWFwKChpKSA9PiBpLm5hbWUpO1xuICAgIGNvbnN0IHBlckluZGV4ID0gb3B0aW9ucy5saW1pdCA/PyB0aGlzLmNvbmZpZy5wYWdlU2l6ZTtcblxuICAgIGNvbnN0IHNldHRsZWQgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoXG4gICAgICBuYW1lcy5tYXAoYXN5bmMgKG5hbWUpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zZWFyY2godGV4dCwge1xuICAgICAgICAgIGluZGV4OiBuYW1lLFxuICAgICAgICAgIGxpbWl0OiBwZXJJbmRleCxcbiAgICAgICAgICAuLi4ob3B0aW9ucy5tb2RlID8geyBtb2RlOiBvcHRpb25zLm1vZGUgfSA6IHt9KSxcbiAgICAgICAgICAuLi4ob3B0aW9ucy5zaWduYWwgPyB7IHNpZ25hbDogb3B0aW9ucy5zaWduYWwgfSA6IHt9KSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXN1bHQuaGl0cy5tYXAoKGhpdCk6IFNlYXJjaEhpdCA9PiAoeyAuLi5oaXQsIGluZGV4OiBuYW1lIH0pKTtcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICBjb25zdCBoaXRzID0gc2V0dGxlZFxuICAgICAgLmZsYXRNYXAoKG91dGNvbWUsIGkpID0+IHtcbiAgICAgICAgaWYgKG91dGNvbWUuc3RhdHVzID09PSBcImZ1bGZpbGxlZFwiKSByZXR1cm4gb3V0Y29tZS52YWx1ZTtcbiAgICAgICAgbG9nZ2VyLndhcm4oXCJ1bml2ZXJzYWwtaW5kZXgtZmFpbGVkXCIsIHsgaW5kZXg6IG5hbWVzW2ldIH0pO1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9KVxuICAgICAgLnNvcnQoKGEsIGIpID0+IGIuc2NvcmUgLSBhLnNjb3JlKTtcblxuICAgIHJldHVybiB7IHF1ZXJ5OiB0ZXh0LCBoaXRzLCBjb3VudDogaGl0cy5sZW5ndGggfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlIGFuIGluZGV4IHJlZmVyZW5jZSAoZnVsbCBVQyBuYW1lIG9yIGNvbmZpZ3VyZWQgYWxpYXMpIHRvIHRoZSBuYW1lXG4gICAqIHRoZSBBUEkgZXhwZWN0cywgZmFpbGluZyBmYXN0IHdoZW4gaXQgcmVzb2x2ZXMgdG8gbm90aGluZy4gV2l0aG91dCB0aGlzIGFcbiAgICogYmxhbmsgcmVmZXJlbmNlIC0gd2hhdCBhbiBvbWl0dGVkIGBpbmRleGAgYmVjb21lcyB3aGVuIG5vIGRlZmF1bHQgaXNcbiAgICogY29uZmlndXJlZCAtIHJlYWNoZXMgdGhlIFNESyBhcyBhbiBlbXB0eSBgaW5kZXhfbmFtZWAsIHdoaWNoIGJ1aWxkcyBhXG4gICAqIFVSTCB3aXRoIHRoZSBuYW1lIHNlZ21lbnQgbWlzc2luZyBhbmQgY29tZXMgYmFjayBhcyBhIGNvbmZ1c2luZ1xuICAgKiBgRU5EUE9JTlRfTk9UX0ZPVU5EYCBpbnN0ZWFkIG9mIG5hbWluZyB0aGUgcmVhbCBwcm9ibGVtLlxuICAgKi9cbiAgcHJpdmF0ZSByZXF1aXJlSW5kZXhOYW1lKHJlZmVyZW5jZTogc3RyaW5nLCBvcGVyYXRpb246IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgbmFtZSA9IHN0cmluZy50cmltVG9OdWxsKHJlc29sdmVJbmRleE5hbWUodGhpcy5jb25maWcsIHJlZmVyZW5jZSkgPz8gcmVmZXJlbmNlKTtcbiAgICBpZiAobmFtZSA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEV4ZWN1dGlvbkVycm9yKFxuICAgICAgICBgc2VhcmNoOiBubyBpbmRleCBjb25maWd1cmVkOyBzZXQgYSBkZWZhdWx0IGluZGV4IG9yIHBhc3Mgb25lIHRvICR7b3BlcmF0aW9ufWAsXG4gICAgICAgIHsgY29udGV4dDogeyBvcGVyYXRpb24gfSB9LFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIG5hbWU7XG4gIH1cblxuICAvKiogRmV0Y2ggYW4gaW5kZXgncyBsaXZlIGRlZmluaXRpb24uICovXG4gIGFzeW5jIGdldEluZGV4KHJlZmVyZW5jZTogc3RyaW5nLCBzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8SW5kZXhJbmZvPiB7XG4gICAgY29uc3QgbmFtZSA9IHRoaXMucmVxdWlyZUluZGV4TmFtZShyZWZlcmVuY2UsIFwiZ2V0SW5kZXhcIik7XG4gICAgY29uc3QgaW5kZXggPSBhd2FpdCB0aGlzLndpdGhDbGllbnQoXCJnZXRJbmRleFwiLCBzaWduYWwsIChjbGllbnQsIGNvbnRleHQpID0+XG4gICAgICBjbGllbnQudmVjdG9yU2VhcmNoSW5kZXhlcy5nZXRJbmRleCh7IGluZGV4X25hbWU6IG5hbWUgfSwgY29udGV4dCksXG4gICAgKTtcbiAgICBjb25zdCBkaXJlY3RBY2Nlc3MgPSBpbmRleC5kaXJlY3RfYWNjZXNzX2luZGV4X3NwZWMgIT09IHVuZGVmaW5lZDtcbiAgICBjb25zdCBzcGVjID0gaW5kZXguZGVsdGFfc3luY19pbmRleF9zcGVjID8/IGluZGV4LmRpcmVjdF9hY2Nlc3NfaW5kZXhfc3BlYztcbiAgICAvLyBEZWx0YSBTeW5jIHN1cmZhY2VzIGl0cyBlbWJlZGRpbmcgc291cmNlIGNvbHVtbnMgZGlyZWN0bHk7IGEgZGlyZWN0LWFjY2Vzc1xuICAgIC8vIGluZGV4IGNhcnJpZXMgaXRzIGNvbHVtbnMgaW4gc2NoZW1hX2pzb24gKG1pbnVzIHRoZSB2ZWN0b3IgY29sdW1uKS5cbiAgICBsZXQgY29sdW1ucyA9IChzcGVjPy5lbWJlZGRpbmdfc291cmNlX2NvbHVtbnMgPz8gW10pLm1hcCgoYykgPT4gYy5uYW1lID8/IFwiXCIpLmZpbHRlcihCb29sZWFuKTtcbiAgICBjb25zdCBzY2hlbWFKc29uID0gaW5kZXguZGlyZWN0X2FjY2Vzc19pbmRleF9zcGVjPy5zY2hlbWFfanNvbjtcbiAgICBpZiAoZGlyZWN0QWNjZXNzICYmIHNjaGVtYUpzb24pIHtcbiAgICAgIGNvbnN0IHNjaGVtYSA9IGpzb24ucGFyc2VSZWNvcmQoc2NoZW1hSnNvbikgPz8ge307XG4gICAgICBjb25zdCB2ZWN0b3JOYW1lcyA9IG5ldyBTZXQoXG4gICAgICAgIChpbmRleC5kaXJlY3RfYWNjZXNzX2luZGV4X3NwZWM/LmVtYmVkZGluZ192ZWN0b3JfY29sdW1ucyA/PyBbXSlcbiAgICAgICAgICAubWFwKChjKSA9PiBjLm5hbWUpXG4gICAgICAgICAgLmZpbHRlcigobik6IG4gaXMgc3RyaW5nID0+IEJvb2xlYW4obikpLFxuICAgICAgKTtcbiAgICAgIGNvbHVtbnMgPSBPYmplY3Qua2V5cyhzY2hlbWEpLmZpbHRlcigoYykgPT4gIXZlY3Rvck5hbWVzLmhhcyhjKSk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiBpbmRleC5uYW1lID8/IG5hbWUsXG4gICAgICAuLi4oaW5kZXguZW5kcG9pbnRfbmFtZSA/IHsgZW5kcG9pbnQ6IGluZGV4LmVuZHBvaW50X25hbWUgfSA6IHt9KSxcbiAgICAgIC4uLihpbmRleC5wcmltYXJ5X2tleSA/IHsgcHJpbWFyeUtleTogaW5kZXgucHJpbWFyeV9rZXkgfSA6IHt9KSxcbiAgICAgIGNvbHVtbnMsXG4gICAgICByZWFkeTogaW5kZXguc3RhdHVzPy5yZWFkeSA/PyBmYWxzZSxcbiAgICAgIC4uLihpbmRleC5zdGF0dXM/LmluZGV4ZWRfcm93X2NvdW50ICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyB7IHJvd0NvdW50OiBpbmRleC5zdGF0dXMuaW5kZXhlZF9yb3dfY291bnQgfVxuICAgICAgICA6IHt9KSxcbiAgICAgIC4uLihkaXJlY3RBY2Nlc3MgPyB7IGRpcmVjdEFjY2VzczogdHJ1ZSB9IDoge30pLFxuICAgIH07XG4gIH1cblxuICAvKiogQWRkIG9yIHVwZGF0ZSBkb2N1bWVudHMgaW4gYSBkaXJlY3QtYWNjZXNzIGluZGV4LiAqL1xuICBhc3luYyBhZGREb2N1bWVudHMoXG4gICAgcmVmZXJlbmNlOiBzdHJpbmcsXG4gICAgZG9jdW1lbnRzOiBTZWFyY2hEb2N1bWVudFtdLFxuICAgIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuICApOiBQcm9taXNlPFVwc2VydFJlc3VsdD4ge1xuICAgIGNvbnN0IG5hbWUgPSB0aGlzLnJlcXVpcmVJbmRleE5hbWUocmVmZXJlbmNlLCBcImFkZERvY3VtZW50c1wiKTtcbiAgICBpZiAodGhpcy5sYWtlYmFzZSkge1xuICAgICAgcmV0dXJuIHRoaXMubGFrZWJhc2UuYWRkRG9jdW1lbnRzKFxuICAgICAgICBuYW1lLFxuICAgICAgICBkb2N1bWVudHMsXG4gICAgICAgIHRoaXMuY29uZmlnLmVuc3VyZU9uU2V0dXA/LnRleHRDb2x1bW4gPz8gXCJ0ZXh0XCIsXG4gICAgICAgIHNpZ25hbCxcbiAgICAgICk7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMud2l0aENsaWVudChcImFkZERvY3VtZW50c1wiLCBzaWduYWwsIChjbGllbnQsIGNvbnRleHQpID0+XG4gICAgICBjbGllbnQudmVjdG9yU2VhcmNoSW5kZXhlcy51cHNlcnREYXRhVmVjdG9ySW5kZXgoXG4gICAgICAgIHsgaW5kZXhfbmFtZTogbmFtZSwgaW5wdXRzX2pzb246IEpTT04uc3RyaW5naWZ5KGRvY3VtZW50cykgfSxcbiAgICAgICAgY29udGV4dCxcbiAgICAgICksXG4gICAgKTtcbiAgICByZXR1cm4geyBpbmRleDogbmFtZSwgY291bnQ6IGRvY3VtZW50cy5sZW5ndGggfTtcbiAgfVxuXG4gIC8qKiBEZWxldGUgZG9jdW1lbnRzIGZyb20gYSBkaXJlY3QtYWNjZXNzIGluZGV4IGJ5IHByaW1hcnkga2V5LiAqL1xuICBhc3luYyBkZWxldGVEb2N1bWVudHMoXG4gICAgcmVmZXJlbmNlOiBzdHJpbmcsXG4gICAgaWRzOiBBcnJheTxzdHJpbmcgfCBudW1iZXI+LFxuICAgIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuICApOiBQcm9taXNlPFVwc2VydFJlc3VsdD4ge1xuICAgIGNvbnN0IG5hbWUgPSB0aGlzLnJlcXVpcmVJbmRleE5hbWUocmVmZXJlbmNlLCBcImRlbGV0ZURvY3VtZW50c1wiKTtcbiAgICBpZiAodGhpcy5sYWtlYmFzZSkge1xuICAgICAgcmV0dXJuIHRoaXMubGFrZWJhc2UuZGVsZXRlRG9jdW1lbnRzKG5hbWUsIGlkcywgc2lnbmFsKTtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy53aXRoQ2xpZW50KFwiZGVsZXRlRG9jdW1lbnRzXCIsIHNpZ25hbCwgKGNsaWVudCwgY29udGV4dCkgPT5cbiAgICAgIGNsaWVudC52ZWN0b3JTZWFyY2hJbmRleGVzLmRlbGV0ZURhdGFWZWN0b3JJbmRleChcbiAgICAgICAgeyBpbmRleF9uYW1lOiBuYW1lLCBwcmltYXJ5X2tleXM6IGlkcy5tYXAoU3RyaW5nKSB9LFxuICAgICAgICBjb250ZXh0LFxuICAgICAgKSxcbiAgICApO1xuICAgIHJldHVybiB7IGluZGV4OiBuYW1lLCBjb3VudDogaWRzLmxlbmd0aCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgYW4gZW1iZWRkaW5nIGVuZHBvaW50IGlkIGZvciBjcmVhdGluZyBhIERlbHRhIFN5bmMgaW5kZXguIFJldXNlc1xuICAgKiB0aGUgbW9kZWwgcmVzb2x2ZXI6IGEgY29uZmlndXJlZCAvIHBhc3NlZCBuYW1lIGlzIGZ1enp5LW1hdGNoZWQgYWdhaW5zdCB0aGVcbiAgICogbGl2ZSBjYXRhbG9ndWUsIG90aGVyd2lzZSB0aGUgaGlnaGVzdC1yYW5rZWQgZW1iZWRkaW5nIGVuZHBvaW50IGlzIGNob3Nlbi5cbiAgICovXG4gIGFzeW5jIHJlc29sdmVFbWJlZGRpbmdNb2RlbChyZXF1ZXN0ZWQ/OiBzdHJpbmcsIHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XG4gICAgY29uc3QgZXhwbGljaXQgPSBzdHJpbmcudHJpbVRvTnVsbChyZXF1ZXN0ZWQgPz8gdGhpcy5jb25maWcuZW1iZWRkaW5nTW9kZWwpO1xuICAgIC8vIEFuIGV4cGxpY2l0IG5hbWUgdGhhdCBhbHJlYWR5IGxvb2tzIGxpa2UgYW4gZW5kcG9pbnQgaWQgKG5vIHdoaXRlc3BhY2UpXG4gICAgLy8gaXMgdXNlZCB2ZXJiYXRpbSAtIG5vIG5lZWQgdG8gZmV0Y2ggYW5kIGZ1enp5LW1hdGNoIHRoZSBsaXZlIGNhdGFsb2d1ZS5cbiAgICAvLyBBIGdlbnVpbmVseSBsb29zZSBuYW1lIChlLmcuIFwiZ3RlIGxhcmdlXCIpIHN0aWxsIHJlc29sdmVzIGFnYWluc3QgaXQuXG4gICAgaWYgKGV4cGxpY2l0ICYmICEvXFxzLy50ZXN0KGV4cGxpY2l0KSkgcmV0dXJuIGV4cGxpY2l0O1xuICAgIHJldHVybiB0aGlzLndpdGhDbGllbnQoXCJyZXNvbHZlRW1iZWRkaW5nTW9kZWxcIiwgc2lnbmFsLCBhc3luYyAoY2xpZW50KSA9PiB7XG4gICAgICBjb25zdCBob3N0ID0gKGF3YWl0IGNsaWVudC5jb25maWcuZ2V0SG9zdCgpKS50b1N0cmluZygpO1xuICAgICAgY29uc3QgZW5kcG9pbnRzID0gYXdhaXQgc2VydmluZy5saXN0U2VydmluZ0VuZHBvaW50cyhjbGllbnQsIGhvc3QpO1xuICAgICAgY29uc3QgeyBtb2RlbElkIH0gPSBtb2RlbFJlc29sdmUucmVzb2x2ZU1vZGVsKGVuZHBvaW50cywge1xuICAgICAgICAuLi4oZXhwbGljaXQgPyB7IGV4cGxpY2l0IH0gOiB7IG1vZGVsQ2xhc3M6IE1vZGVsQ2xhc3MuRW1iZWRkaW5nIH0pLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gc3RyaW5nLnRyaW1Ub051bGwobW9kZWxJZCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRW1iZWQgdGV4dCB2aWEgYSBEYXRhYnJpY2tzIGVtYmVkZGluZyBzZXJ2aW5nIGVuZHBvaW50LCByZXR1cm5pbmcgb25lXG4gICAqIHZlY3RvciBwZXIgaW5wdXQuIFVzZWQgdG8gc2VlZCBhIGRpcmVjdC1hY2Nlc3MgaW5kZXggYW5kIHRvIHR1cm4gYSBzZWFyY2hcbiAgICogcXVlcnkgaW50byBhIHF1ZXJ5IHZlY3RvciAtIERhdGFicmlja3Mgb25seSBtYW5hZ2VzIGVtYmVkZGluZ3MgZm9yIERlbHRhXG4gICAqIFN5bmMgaW5kZXhlcywgc28gYSBkaXJlY3QtYWNjZXNzIGluZGV4IChubyBEZWx0YSB0YWJsZSwgbm8gd2FyZWhvdXNlKSBuZWVkc1xuICAgKiB0aGUgY2xpZW50IHRvIGVtYmVkIG9uIHdyaXRlIGFuZCBvbiBxdWVyeS4gVGhlIGVuZHBvaW50IGlzIHJlc29sdmVkIHRoZVxuICAgKiBzYW1lIHdheSBhcyBmb3IgaW5kZXggY3JlYXRpb24gd2hlbiBub3QgbmFtZWQuXG4gICAqL1xuICBhc3luYyBlbWJlZCh0ZXh0czogc3RyaW5nW10sIG1vZGVsPzogc3RyaW5nLCBzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8bnVtYmVyW11bXT4ge1xuICAgIGlmICh0ZXh0cy5sZW5ndGggPT09IDApIHJldHVybiBbXTtcbiAgICBjb25zdCBlbmRwb2ludCA9IGF3YWl0IHRoaXMucmVzb2x2ZUVtYmVkZGluZ01vZGVsKG1vZGVsLCBzaWduYWwpO1xuICAgIGlmICghZW5kcG9pbnQpIHtcbiAgICAgIHRocm93IG5ldyBFeGVjdXRpb25FcnJvcihcInNlYXJjaDogY291bGQgbm90IHJlc29sdmUgYW4gZW1iZWRkaW5nIG1vZGVsIHRvIGVtYmVkIHRleHRcIiwge1xuICAgICAgICBjb250ZXh0OiB7IG9wZXJhdGlvbjogXCJlbWJlZFwiIH0sXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMud2l0aENsaWVudChcImVtYmVkXCIsIHNpZ25hbCwgYXN5bmMgKGNsaWVudCkgPT4ge1xuICAgICAgY29uc3QgaG9zdCA9IChhd2FpdCBjbGllbnQuY29uZmlnLmdldEhvc3QoKSkudG9TdHJpbmcoKTtcbiAgICAgIGNvbnN0IHVybCA9IGludm9rZS5pbnZvY2F0aW9uc1VybChob3N0LCBlbmRwb2ludCk7XG4gICAgICBjb25zdCBoZWFkZXJzID0gYXdhaXQgaW52b2tlLmF1dGhIZWFkZXJzKGNsaWVudCk7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwge1xuICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICBoZWFkZXJzOiB7IC4uLmhlYWRlcnMsIFwiY29udGVudC10eXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgaW5wdXQ6IHRleHRzIH0pLFxuICAgICAgICAuLi4oc2lnbmFsID8geyBzaWduYWwgfSA6IHt9KSxcbiAgICAgIH0pO1xuICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICB0aHJvdyBuZXcgRXhlY3V0aW9uRXJyb3IoXG4gICAgICAgICAgYHNlYXJjaDogZW1iZWRkaW5nIGVuZHBvaW50ICR7ZW5kcG9pbnR9IGZhaWxlZCAoJHtyZXNwb25zZS5zdGF0dXN9KWAsXG4gICAgICAgICAgeyBjb250ZXh0OiB7IG9wZXJhdGlvbjogXCJlbWJlZFwiIH0gfSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGJvZHkgPSAoYXdhaXQgcmVzcG9uc2UuanNvbigpKSBhcyB7IGRhdGE/OiBBcnJheTx7IGVtYmVkZGluZzogbnVtYmVyW10gfT4gfTtcbiAgICAgIGNvbnN0IHZlY3RvcnMgPSAoYm9keS5kYXRhID8/IFtdKS5tYXAoKHJvdykgPT4gcm93LmVtYmVkZGluZyk7XG4gICAgICBpZiAodmVjdG9ycy5sZW5ndGggIT09IHRleHRzLmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXhlY3V0aW9uRXJyb3IoXCJzZWFyY2g6IGVtYmVkZGluZyByZXNwb25zZSBkaWQgbm90IG1hdGNoIHRoZSBpbnB1dCBjb3VudFwiLCB7XG4gICAgICAgICAgY29udGV4dDogeyBvcGVyYXRpb246IFwiZW1iZWRcIiB9LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2ZWN0b3JzO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIFRoZSB2ZWN0b3IgZGltZW5zaW9uIGEgbW9kZWwgcHJvZHVjZXMgKGVtYmVkcyBhIHByb2JlIHN0cmluZyBvbmNlKS4gKi9cbiAgcHJpdmF0ZSBhc3luYyBlbWJlZGRpbmdEaW1lbnNpb24obW9kZWw/OiBzdHJpbmcsIHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCBbdmVjdG9yXSA9IGF3YWl0IHRoaXMuZW1iZWQoW1wiZGltZW5zaW9uIHByb2JlXCJdLCBtb2RlbCwgc2lnbmFsKTtcbiAgICBpZiAoIXZlY3RvciB8fCB2ZWN0b3IubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXhlY3V0aW9uRXJyb3IoXCJzZWFyY2g6IGNvdWxkIG5vdCBkZXRlcm1pbmUgdGhlIGVtYmVkZGluZyBkaW1lbnNpb25cIiwge1xuICAgICAgICBjb250ZXh0OiB7IG9wZXJhdGlvbjogXCJjcmVhdGVJbmRleFwiIH0sXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHZlY3Rvci5sZW5ndGg7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGFuIEFJIFNlYXJjaCBpbmRleCB3aXRoIGFzIGxpdHRsZSBjZXJlbW9ueSBhcyBwb3NzaWJsZS4gVHdvIHNoYXBlczpcbiAgICpcbiAgICogICAtICoqRGVsdGEgU3luYyoqICh0aGUgZGVmYXVsdCk6IHBhc3MgYHNvdXJjZVRhYmxlYDsgRGF0YWJyaWNrcyBjb21wdXRlc1xuICAgKiAgICAgZW1iZWRkaW5ncyBmcm9tIHRoZSB0ZXh0IGNvbHVtbiBhbmQga2VlcHMgdGhlIGluZGV4IHN5bmNlZC4gVGhlXG4gICAqICAgICBlbWJlZGRpbmcgbW9kZWwgaXMgcmVzb2x2ZWQgYXV0b21hdGljYWxseSB3aGVuIG5vdCBuYW1lZC5cbiAgICogICAtICoqRGlyZWN0IEFjY2VzcyoqOiBvbWl0IGBzb3VyY2VUYWJsZWAgYW5kIHBhc3MgYGVtYmVkZGluZ0RpbWVuc2lvbmA7XG4gICAqICAgICB5b3Ugd3JpdGUgdmVjdG9ycyB5b3Vyc2VsZiB2aWEge0BsaW5rIGFkZERvY3VtZW50c30uXG4gICAqXG4gICAqIEV2ZXJ5dGhpbmcgZWxzZSBpbmZlcnM6IHRoZSBlbmRwb2ludCBmcm9tIHRoZSBwbHVnaW4gY29uZmlnLCB0aGUgcHJpbWFyeVxuICAgKiBrZXkgKGBpZGApLCB0aGUgdGV4dCBjb2x1bW4gKGB0ZXh0YCAvIGBjb250ZW50YCAvIGBib2R5YCksIGFuZCB0aGUgdmVjdG9yXG4gICAqIGNvbHVtbiAoYGVtYmVkZGluZ2ApLiBSZXR1cm5zIHRoZSBjcmVhdGVkIGluZGV4J3Mge0BsaW5rIEluZGV4SW5mb30uXG4gICAqL1xuICBhc3luYyBjcmVhdGVJbmRleChuYW1lOiBzdHJpbmcsIG9wdGlvbnM6IENyZWF0ZUluZGV4T3B0aW9ucyA9IHt9KTogUHJvbWlzZTxJbmRleEluZm8+IHtcbiAgICBjb25zdCBlbmRwb2ludCA9IG9wdGlvbnMuZW5kcG9pbnQgPz8gdGhpcy5jb25maWcuZW5kcG9pbnQ7XG4gICAgaWYgKCFlbmRwb2ludCkge1xuICAgICAgdGhyb3cgbmV3IEV4ZWN1dGlvbkVycm9yKFxuICAgICAgICBcInNlYXJjaDogbm8gVmVjdG9yIFNlYXJjaCBlbmRwb2ludCBjb25maWd1cmVkOyBwYXNzIGBlbmRwb2ludGAgb3Igc2V0IGl0IG9uIHRoZSBwbHVnaW5cIixcbiAgICAgICAgeyBjb250ZXh0OiB7IG9wZXJhdGlvbjogXCJjcmVhdGVJbmRleFwiIH0gfSxcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IHByaW1hcnlLZXkgPSBvcHRpb25zLnByaW1hcnlLZXkgPz8gXCJpZFwiO1xuICAgIGNvbnN0IGRpcmVjdCA9ICFvcHRpb25zLnNvdXJjZVRhYmxlO1xuICAgIGNvbnN0IHNvdXJjZUNvbHVtbiA9IG9wdGlvbnMuZW1iZWRkaW5nU291cmNlQ29sdW1uID8/IFwidGV4dFwiO1xuICAgIGNvbnN0IHZlY3RvckNvbHVtbiA9IG9wdGlvbnMuZW1iZWRkaW5nVmVjdG9yQ29sdW1uID8/IFwiZW1iZWRkaW5nXCI7XG5cbiAgICAvLyBEZWx0YSBTeW5jIGxldHMgRGF0YWJyaWNrcyBlbWJlZCBhIHNvdXJjZSBjb2x1bW4sIHNvIGl0IG5lZWRzIGFuIGVtYmVkZGluZ1xuICAgIC8vIG1vZGVsLiBBIGRpcmVjdC1hY2Nlc3MgaW5kZXggc3RvcmVzIHZlY3RvcnMgWU9VIHN1cHBseSAoRGF0YWJyaWNrcyBvbmx5XG4gICAgLy8gc3VwcG9ydHMgbWFuYWdlZCBlbWJlZGRpbmdzIG9uIERlbHRhIFN5bmMpLCBzbyBpdCBuZWVkcyBhIGRpbWVuc2lvbjsgd2VcbiAgICAvLyByZXNvbHZlIG9uZSBmcm9tIHRoZSBlbWJlZGRpbmcgbW9kZWwgd2hlbiBub3QgZ2l2ZW4gc28gYSBkaXJlY3QtYWNjZXNzXG4gICAgLy8gaW5kZXggc3RpbGwgd29ya3Mgd2l0aCB6ZXJvIGV4dHJhIGNvbmZpZyAoZW1iZWQgdmlhIGBlbWJlZCgpYCBvbiBzZWVkICtcbiAgICAvLyBxdWVyeSAtIHNlZSBgcHJvdmlzaW9uYCAvIGBzZWFyY2hgKS5cbiAgICBjb25zdCBlbWJlZGRpbmdNb2RlbCA9XG4gICAgICAoYXdhaXQgdGhpcy5yZXNvbHZlRW1iZWRkaW5nTW9kZWwob3B0aW9ucy5lbWJlZGRpbmdNb2RlbCwgb3B0aW9ucy5zaWduYWwpKSA/PyB1bmRlZmluZWQ7XG4gICAgaWYgKCFlbWJlZGRpbmdNb2RlbCkge1xuICAgICAgdGhyb3cgbmV3IEV4ZWN1dGlvbkVycm9yKFxuICAgICAgICBcInNlYXJjaDogY291bGQgbm90IHJlc29sdmUgYW4gZW1iZWRkaW5nIG1vZGVsOyBwYXNzIGBlbWJlZGRpbmdNb2RlbGBcIixcbiAgICAgICAgeyBjb250ZXh0OiB7IG9wZXJhdGlvbjogXCJjcmVhdGVJbmRleFwiIH0gfSxcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IGRpbWVuc2lvbiA9XG4gICAgICBvcHRpb25zLmVtYmVkZGluZ0RpbWVuc2lvbiA/PyAoYXdhaXQgdGhpcy5lbWJlZGRpbmdEaW1lbnNpb24oZW1iZWRkaW5nTW9kZWwsIG9wdGlvbnMuc2lnbmFsKSk7XG5cbiAgICBjb25zdCBzY2hlbWEgPSB7XG4gICAgICBbcHJpbWFyeUtleV06IFwic3RyaW5nXCIsXG4gICAgICBbc291cmNlQ29sdW1uXTogXCJzdHJpbmdcIixcbiAgICAgIC4uLihvcHRpb25zLnNjaGVtYSA/PyB7fSksXG4gICAgfTtcblxuICAgIGNvbnN0IGRpcmVjdFNwZWMgPSB7XG4gICAgICBkaXJlY3RfYWNjZXNzX2luZGV4X3NwZWM6IHtcbiAgICAgICAgZW1iZWRkaW5nX3ZlY3Rvcl9jb2x1bW5zOiBbeyBuYW1lOiB2ZWN0b3JDb2x1bW4sIGVtYmVkZGluZ19kaW1lbnNpb246IGRpbWVuc2lvbiB9XSxcbiAgICAgICAgc2NoZW1hX2pzb246IEpTT04uc3RyaW5naWZ5KHsgLi4uc2NoZW1hLCBbdmVjdG9yQ29sdW1uXTogYGFycmF5PGZsb2F0PmAgfSksXG4gICAgICB9LFxuICAgIH07XG5cbiAgICBhd2FpdCB0aGlzLndpdGhDbGllbnQoXCJjcmVhdGVJbmRleFwiLCBvcHRpb25zLnNpZ25hbCwgKGNsaWVudCwgY29udGV4dCkgPT5cbiAgICAgIGNsaWVudC52ZWN0b3JTZWFyY2hJbmRleGVzLmNyZWF0ZUluZGV4KFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgICBlbmRwb2ludF9uYW1lOiBlbmRwb2ludCxcbiAgICAgICAgICBwcmltYXJ5X2tleTogcHJpbWFyeUtleSxcbiAgICAgICAgICBpbmRleF90eXBlOiBkaXJlY3QgPyBcIkRJUkVDVF9BQ0NFU1NcIiA6IFwiREVMVEFfU1lOQ1wiLFxuICAgICAgICAgIC4uLihkaXJlY3RcbiAgICAgICAgICAgID8gZGlyZWN0U3BlY1xuICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgZGVsdGFfc3luY19pbmRleF9zcGVjOiB7XG4gICAgICAgICAgICAgICAgICBzb3VyY2VfdGFibGU6IG9wdGlvbnMuc291cmNlVGFibGUsXG4gICAgICAgICAgICAgICAgICBwaXBlbGluZV90eXBlOiBvcHRpb25zLnBpcGVsaW5lVHlwZSA/PyBcIlRSSUdHRVJFRFwiLFxuICAgICAgICAgICAgICAgICAgZW1iZWRkaW5nX3NvdXJjZV9jb2x1bW5zOiBbXG4gICAgICAgICAgICAgICAgICAgIHsgbmFtZTogc291cmNlQ29sdW1uLCBlbWJlZGRpbmdfbW9kZWxfZW5kcG9pbnRfbmFtZTogZW1iZWRkaW5nTW9kZWwgfSxcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAuLi4ob3B0aW9ucy5jb2x1bW5zVG9TeW5jICYmIG9wdGlvbnMuY29sdW1uc1RvU3luYy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgICAgID8geyBjb2x1bW5zX3RvX3N5bmM6IG9wdGlvbnMuY29sdW1uc1RvU3luYyB9XG4gICAgICAgICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICB9LFxuICAgICAgICBjb250ZXh0LFxuICAgICAgKSxcbiAgICApO1xuICAgIGxvZ2dlci5pbmZvKFwiaW5kZXgtY3JlYXRlZFwiLCB7XG4gICAgICBpbmRleDogbmFtZSxcbiAgICAgIGVuZHBvaW50LFxuICAgICAgdHlwZTogZGlyZWN0ID8gXCJESVJFQ1RfQUNDRVNTXCIgOiBcIkRFTFRBX1NZTkNcIixcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcy5nZXRJbmRleChuYW1lLCBvcHRpb25zLnNpZ25hbCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIHRoZSBpbmRleCBpZiBpdCBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LCBvdGhlcndpc2UgcmV0dXJuIHRoZVxuICAgKiBleGlzdGluZyBvbmUuIElkZW1wb3RlbnQgLSBzYWZlIHRvIGNhbGwgb24gZXZlcnkgYm9vdCB0byBndWFyYW50ZWUgYW5cbiAgICogaW5kZXggaXMgcHJlc2VudC5cbiAgICovXG4gIGFzeW5jIGVuc3VyZUluZGV4KG5hbWU6IHN0cmluZywgb3B0aW9uczogQ3JlYXRlSW5kZXhPcHRpb25zID0ge30pOiBQcm9taXNlPEluZGV4SW5mbz4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXRJbmRleChuYW1lLCBvcHRpb25zLnNpZ25hbCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGVJbmRleChuYW1lLCBvcHRpb25zKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRW5zdXJlIGFuIGluZGV4IGV4aXN0cywgaXMgb25saW5lLCBhbmQgKG9wdGlvbmFsbHkpIGhvbGRzIHNlZWQgZGF0YSAtIHRoZVxuICAgKiBcIndpcmUgdXAgYSByZWFsIGluZGV4IG9uIGJvb3RcIiBwYXRoLiBJZGVtcG90ZW50IGFuZCBjaGVhcCB0byBjYWxsIGV2ZXJ5XG4gICAqIGJvb3Q6IGl0IGNyZWF0ZXMgdGhlIGVuZHBvaW50IGFuZCBpbmRleCBvbmx5IGlmIG1pc3NpbmcsIHdhaXRzIGZvciB0aGVtIHRvXG4gICAqIGNvbWUgb25saW5lLCBhbmQgc2VlZHMgZG9jdW1lbnRzIE9OTFkgd2hlbiB0aGUgaW5kZXggaXMgc3RpbGwgZW1wdHkuXG4gICAqXG4gICAqIEZvciB0aGUgZGVtby9kdW1teS1kYXRhIGNhc2UgdGhpcyBuZWVkcyBubyBEZWx0YSB0YWJsZSBhbmQgbm8gd2FyZWhvdXNlOlxuICAgKiB0aGUgZGVmYXVsdCBpcyBhIE1BTkFHRUQgZGlyZWN0LWFjY2VzcyBpbmRleCAoRGF0YWJyaWNrcyBlbWJlZHMgdGhlIGB0ZXh0YFxuICAgKiBjb2x1bW4gb24gd3JpdGUgYW5kIHF1ZXJ5KSwgc28gc2VlZGluZyBpcyBqdXN0IGFuIGBhZGREb2N1bWVudHNgIG9mIHBsYWluXG4gICAqIHJvd3MgYW5kIHNlYXJjaC1ieS10ZXh0IHdvcmtzIGltbWVkaWF0ZWx5LlxuICAgKi9cbiAgYXN5bmMgcHJvdmlzaW9uKG5hbWU6IHN0cmluZywgb3B0aW9uczogUHJvdmlzaW9uT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxJbmRleEluZm8+IHtcbiAgICBpZiAodGhpcy5sYWtlYmFzZSkge1xuICAgICAgLy8gTGFrZWJhc2UgZmFsbGJhY2s6IG5vIGVuZHBvaW50LCBubyBlbWJlZGRpbmdzLCBubyB2ZWN0b3JzIC0ganVzdCBhXG4gICAgICAvLyBQb3N0Z3JlcyBmdWxsLXRleHQgdGFibGUuIFJldHVybnMgYW4gSW5kZXhJbmZvLXNoYXBlZCByZXN1bHQgc28gdGhlXG4gICAgICAvLyBjYWxsZXIncyBsb2dnaW5nICsgcmVhZGluZXNzIGhhbmRsaW5nIGlzIGlkZW50aWNhbCB0byBWZWN0b3IgU2VhcmNoLlxuICAgICAgY29uc3Qgcm93Q291bnQgPSBhd2FpdCB0aGlzLmxha2ViYXNlLnByb3Zpc2lvbihuYW1lLCB7XG4gICAgICAgIHRleHRDb2x1bW46IG9wdGlvbnMuZW1iZWRkaW5nU291cmNlQ29sdW1uID8/IFwidGV4dFwiLFxuICAgICAgICAuLi4ob3B0aW9ucy5zZWVkID8geyBzZWVkOiBvcHRpb25zLnNlZWQgfSA6IHt9KSxcbiAgICAgICAgLi4uKG9wdGlvbnMuc2lnbmFsID8geyBzaWduYWw6IG9wdGlvbnMuc2lnbmFsIH0gOiB7fSksXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIHByaW1hcnlLZXk6IG9wdGlvbnMucHJpbWFyeUtleSA/PyBcImlkXCIsXG4gICAgICAgIGNvbHVtbnM6IFtdLFxuICAgICAgICByZWFkeTogdHJ1ZSxcbiAgICAgICAgcm93Q291bnQsXG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCB3YWl0ID0gb3B0aW9ucy53YWl0ID8/IHRydWU7XG4gICAgY29uc3QgdGltZW91dE1zID0gb3B0aW9ucy50aW1lb3V0TXMgPz8gMjAgKiA2MCAqIDEwMDA7XG4gICAgY29uc3QgZW5kcG9pbnQgPSBvcHRpb25zLmVuZHBvaW50ID8/IHRoaXMuY29uZmlnLmVuZHBvaW50O1xuICAgIGlmIChlbmRwb2ludCkgYXdhaXQgdGhpcy5lbnN1cmVFbmRwb2ludChlbmRwb2ludCwgeyB3YWl0LCBzaWduYWw6IG9wdGlvbnMuc2lnbmFsIH0pO1xuXG4gICAgY29uc3QgeyBzZWVkOiBfc2VlZCwgd2FpdDogX3dhaXQsIHRpbWVvdXRNczogX3RpbWVvdXRNcywgLi4uY3JlYXRlT3B0aW9ucyB9ID0gb3B0aW9ucztcbiAgICBsZXQgaW5mbyA9IGF3YWl0IHRoaXMuZW5zdXJlSW5kZXgobmFtZSwgY3JlYXRlT3B0aW9ucyk7XG5cbiAgICBpZiAod2FpdCAmJiAhaW5mby5yZWFkeSkgaW5mbyA9IGF3YWl0IHRoaXMud2FpdEZvckluZGV4UmVhZHkobmFtZSwgdGltZW91dE1zLCBvcHRpb25zLnNpZ25hbCk7XG5cbiAgICBjb25zdCBzZWVkID0gb3B0aW9ucy5zZWVkID8/IFtdO1xuICAgIGlmIChzZWVkLmxlbmd0aCA+IDAgJiYgKGluZm8ucm93Q291bnQgPz8gMCkgPT09IDApIHtcbiAgICAgIGNvbnN0IHNvdXJjZUNvbHVtbiA9IG9wdGlvbnMuZW1iZWRkaW5nU291cmNlQ29sdW1uID8/IFwidGV4dFwiO1xuICAgICAgY29uc3QgdmVjdG9yQ29sdW1uID0gb3B0aW9ucy5lbWJlZGRpbmdWZWN0b3JDb2x1bW4gPz8gXCJlbWJlZGRpbmdcIjtcbiAgICAgIC8vIERpcmVjdC1hY2Nlc3MgaW5kZXhlcyBzdG9yZSB2ZWN0b3JzIHdlIHN1cHBseSwgc28gZW1iZWQgdGhlIHRleHQgY29sdW1uXG4gICAgICAvLyBmb3IgYW55IHNlZWQgcm93IHRoYXQgZGlkIG5vdCBhbHJlYWR5IGNhcnJ5IGEgdmVjdG9yLlxuICAgICAgY29uc3QgbmVlZEVtYmVkID0gc2VlZC5zb21lKChkb2MpID0+IGRvY1t2ZWN0b3JDb2x1bW5dID09PSB1bmRlZmluZWQpO1xuICAgICAgbGV0IHJvd3MgPSBzZWVkO1xuICAgICAgaWYgKG5lZWRFbWJlZCkge1xuICAgICAgICBjb25zdCB0ZXh0cyA9IHNlZWQubWFwKChkb2MpID0+IHN0cmluZy50cmltVG9FbXB0eShTdHJpbmcoZG9jW3NvdXJjZUNvbHVtbl0gPz8gXCJcIikpKTtcbiAgICAgICAgY29uc3QgdmVjdG9ycyA9IGF3YWl0IHRoaXMuZW1iZWQodGV4dHMsIG9wdGlvbnMuZW1iZWRkaW5nTW9kZWwsIG9wdGlvbnMuc2lnbmFsKTtcbiAgICAgICAgcm93cyA9IHNlZWQubWFwKChkb2MsIGkpID0+XG4gICAgICAgICAgZG9jW3ZlY3RvckNvbHVtbl0gPT09IHVuZGVmaW5lZCA/IHsgLi4uZG9jLCBbdmVjdG9yQ29sdW1uXTogdmVjdG9yc1tpXSB9IDogZG9jLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgYXdhaXQgdGhpcy5hZGREb2N1bWVudHMobmFtZSwgcm93cywgb3B0aW9ucy5zaWduYWwpO1xuICAgICAgbG9nZ2VyLmluZm8oXCJpbmRleC1zZWVkZWRcIiwgeyBpbmRleDogbmFtZSwgY291bnQ6IHJvd3MubGVuZ3RoIH0pO1xuICAgICAgaW5mbyA9IGF3YWl0IHRoaXMuZ2V0SW5kZXgobmFtZSwgb3B0aW9ucy5zaWduYWwpO1xuICAgIH1cbiAgICByZXR1cm4gaW5mbztcbiAgfVxuXG4gIC8qKiBQb2xsIGFuIGluZGV4IHVudGlsIGl0IHJlcG9ydHMgcmVhZHksIG9yIHRocm93IGFmdGVyIHtAbGluayB0aW1lb3V0TXN9LiAqL1xuICBwcml2YXRlIGFzeW5jIHdhaXRGb3JJbmRleFJlYWR5KFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICB0aW1lb3V0TXM6IG51bWJlcixcbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbiAgKTogUHJvbWlzZTxJbmRleEluZm8+IHtcbiAgICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyB0aW1lb3V0TXM7XG4gICAgbGV0IGluZm8gPSBhd2FpdCB0aGlzLmdldEluZGV4KG5hbWUsIHNpZ25hbCk7XG4gICAgd2hpbGUgKCFpbmZvLnJlYWR5KSB7XG4gICAgICBpZiAoRGF0ZS5ub3coKSA+IGRlYWRsaW5lKSB7XG4gICAgICAgIHRocm93IG5ldyBFeGVjdXRpb25FcnJvcihgc2VhcmNoOiBpbmRleCAke25hbWV9IGRpZCBub3QgY29tZSBvbmxpbmUgaW4gdGltZWAsIHtcbiAgICAgICAgICBjb250ZXh0OiB7IG9wZXJhdGlvbjogXCJwcm92aXNpb25cIiB9LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IGFzeW5jVXRpbC5zbGVlcCg1MDAwLCBzaWduYWwpO1xuICAgICAgaW5mbyA9IGF3YWl0IHRoaXMuZ2V0SW5kZXgobmFtZSwgc2lnbmFsKTtcbiAgICB9XG4gICAgcmV0dXJuIGluZm87XG4gIH1cblxuICAvKiogVHJpZ2dlciBhIHN5bmMgb2YgYSBEZWx0YSBTeW5jIGluZGV4IGZyb20gaXRzIHNvdXJjZSB0YWJsZS4gKi9cbiAgYXN5bmMgc3luY0luZGV4KHJlZmVyZW5jZTogc3RyaW5nLCBzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG5hbWUgPSB0aGlzLnJlcXVpcmVJbmRleE5hbWUocmVmZXJlbmNlLCBcInN5bmNJbmRleFwiKTtcbiAgICBhd2FpdCB0aGlzLndpdGhDbGllbnQoXCJzeW5jSW5kZXhcIiwgc2lnbmFsLCAoY2xpZW50LCBjb250ZXh0KSA9PlxuICAgICAgY2xpZW50LnZlY3RvclNlYXJjaEluZGV4ZXMuc3luY0luZGV4KHsgaW5kZXhfbmFtZTogbmFtZSB9LCBjb250ZXh0KSxcbiAgICApO1xuICAgIGxvZ2dlci5pbmZvKFwiaW5kZXgtc3luY2VkXCIsIHsgaW5kZXg6IG5hbWUgfSk7XG4gIH1cblxuICAvKiogRGVsZXRlIGFuIGluZGV4LiAqL1xuICBhc3luYyBkZWxldGVJbmRleChyZWZlcmVuY2U6IHN0cmluZywgc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBuYW1lID0gdGhpcy5yZXF1aXJlSW5kZXhOYW1lKHJlZmVyZW5jZSwgXCJkZWxldGVJbmRleFwiKTtcbiAgICBhd2FpdCB0aGlzLndpdGhDbGllbnQoXCJkZWxldGVJbmRleFwiLCBzaWduYWwsIChjbGllbnQsIGNvbnRleHQpID0+XG4gICAgICBjbGllbnQudmVjdG9yU2VhcmNoSW5kZXhlcy5kZWxldGVJbmRleCh7IGluZGV4X25hbWU6IG5hbWUgfSwgY29udGV4dCksXG4gICAgKTtcbiAgICBsb2dnZXIuaW5mbyhcImluZGV4LWRlbGV0ZWRcIiwgeyBpbmRleDogbmFtZSB9KTtcbiAgfVxuXG4gIC8qKiBMaXN0IHRoZSBpbmRleGVzIGhvc3RlZCBvbiBhIFZlY3RvciBTZWFyY2ggZW5kcG9pbnQgKG5hbWUgKyB0eXBlIG9ubHkpLiAqL1xuICBhc3luYyBsaXN0SW5kZXhlcyhlbmRwb2ludD86IHN0cmluZywgc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgY29uc3QgZW5kcG9pbnROYW1lID0gZW5kcG9pbnQgPz8gdGhpcy5jb25maWcuZW5kcG9pbnQ7XG4gICAgaWYgKCFlbmRwb2ludE5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFeGVjdXRpb25FcnJvcihcInNlYXJjaDogbm8gZW5kcG9pbnQgY29uZmlndXJlZCB0byBsaXN0IGluZGV4ZXNcIiwge1xuICAgICAgICBjb250ZXh0OiB7IG9wZXJhdGlvbjogXCJsaXN0SW5kZXhlc1wiIH0sXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMud2l0aENsaWVudChcImxpc3RJbmRleGVzXCIsIHNpZ25hbCwgYXN5bmMgKGNsaWVudCwgY29udGV4dCkgPT4ge1xuICAgICAgY29uc3QgbmFtZXM6IHN0cmluZ1tdID0gW107XG4gICAgICBmb3IgYXdhaXQgKGNvbnN0IGluZGV4IG9mIGNsaWVudC52ZWN0b3JTZWFyY2hJbmRleGVzLmxpc3RJbmRleGVzKFxuICAgICAgICB7IGVuZHBvaW50X25hbWU6IGVuZHBvaW50TmFtZSB9LFxuICAgICAgICBjb250ZXh0LFxuICAgICAgKSkge1xuICAgICAgICBpZiAoaW5kZXgubmFtZSkgbmFtZXMucHVzaChpbmRleC5uYW1lKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuYW1lcztcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnN1cmUgYSBWZWN0b3IgU2VhcmNoIGVuZHBvaW50IGV4aXN0cywgY3JlYXRpbmcgYSBgU1RBTkRBUkRgIG9uZSB3aGVuIGl0XG4gICAqIGRvZXMgbm90LiBPcHRpb25hbGx5IHdhaXQgZm9yIGl0IHRvIGNvbWUgb25saW5lLiBJZGVtcG90ZW50LlxuICAgKi9cbiAgYXN5bmMgZW5zdXJlRW5kcG9pbnQobmFtZT86IHN0cmluZywgb3B0aW9uczogRW5zdXJlRW5kcG9pbnRPcHRpb25zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBlbmRwb2ludCA9IG5hbWUgPz8gdGhpcy5jb25maWcuZW5kcG9pbnQ7XG4gICAgaWYgKCFlbmRwb2ludCkge1xuICAgICAgdGhyb3cgbmV3IEV4ZWN1dGlvbkVycm9yKFwic2VhcmNoOiBubyBlbmRwb2ludCBuYW1lIHRvIGVuc3VyZVwiLCB7XG4gICAgICAgIGNvbnRleHQ6IHsgb3BlcmF0aW9uOiBcImVuc3VyZUVuZHBvaW50XCIgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLndpdGhDbGllbnQoXCJlbnN1cmVFbmRwb2ludFwiLCBvcHRpb25zLnNpZ25hbCwgYXN5bmMgKGNsaWVudCwgY29udGV4dCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgY2xpZW50LnZlY3RvclNlYXJjaEVuZHBvaW50cy5nZXRFbmRwb2ludCh7IGVuZHBvaW50X25hbWU6IGVuZHBvaW50IH0sIGNvbnRleHQpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgY29uc3Qgd2FpdGVyID0gYXdhaXQgY2xpZW50LnZlY3RvclNlYXJjaEVuZHBvaW50cy5jcmVhdGVFbmRwb2ludChcbiAgICAgICAgICB7IG5hbWU6IGVuZHBvaW50LCBlbmRwb2ludF90eXBlOiBcIlNUQU5EQVJEXCIgfSxcbiAgICAgICAgICBjb250ZXh0LFxuICAgICAgICApO1xuICAgICAgICBsb2dnZXIuaW5mbyhcImVuZHBvaW50LWNyZWF0ZWRcIiwgeyBlbmRwb2ludCB9KTtcbiAgICAgICAgaWYgKG9wdGlvbnMud2FpdCkgYXdhaXQgd2FpdGVyLndhaXQoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlIHRoZSB3b3Jrc3BhY2UgY2xpZW50IGFuZCBydW4gb25lIGNhbGwgdW5kZXIgYSBib3VuZGVkIHRpbWVvdXQuIFRoZVxuICAgKiBjYWxsZXIncyBzaWduYWwgKGlmIGFueSkgYW5kIGEgdGltZW91dCBhcmUgbWVyZ2VkIGludG8gb25lIFNESyBgQ29udGV4dGBcbiAgICogdmlhIHtAbGluayBhcHBraXQuZGF0YWJyaWNrcy50b0NvbnRleHR9LCBzbyBlaXRoZXIgdW53aW5kcyB0aGUgcmVxdWVzdC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgd2l0aENsaWVudDxUPihcbiAgICBvcGVyYXRpb246IHN0cmluZyxcbiAgICBzaWduYWw6IEFib3J0U2lnbmFsIHwgdW5kZWZpbmVkLFxuICAgIGZuOiAoY2xpZW50OiBXb3Jrc3BhY2VDbGllbnRMaWtlLCBjb250ZXh0PzogQ29udGV4dCkgPT4gUHJvbWlzZTxUPixcbiAgKTogUHJvbWlzZTxUPiB7XG4gICAgY29uc3QgY2xpZW50ID0gdGhpcy53b3Jrc3BhY2VDbGllbnRGYWN0b3J5KCk7XG4gICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICBjb25zdCB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4gY29udHJvbGxlci5hYm9ydCgpLCB0aGlzLmNvbmZpZy50aW1lb3V0TXMpO1xuICAgIGNvbnN0IGNvbnRleHQgPSBkYXRhYnJpY2tzLnRvQ29udGV4dChjb250cm9sbGVyLCBzaWduYWwpO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgZm4oY2xpZW50LCBjb250ZXh0KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmIChzaWduYWw/LmFib3J0ZWQpIHRocm93IEV4ZWN1dGlvbkVycm9yLmNhbmNlbGVkKCk7XG4gICAgICBsb2dnZXIud2FybihcImV4ZWN1dGlvbi1mYWlsZWRcIiwgeyBvcGVyYXRpb24gfSk7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgfVxuICB9XG59XG5cbi8qKiBUaGUgT0JPIHdvcmtzcGFjZSBjbGllbnQgZnJvbSB0aGUgYWN0aXZlIGNvbnRleHQsIG9yIGEgc2VydmljZS1wcmluY2lwYWwgY2xpZW50LiAqL1xuZnVuY3Rpb24gZGVmYXVsdFdvcmtzcGFjZUNsaWVudCgpOiBXb3Jrc3BhY2VDbGllbnRMaWtlIHtcbiAgY29uc3QgY3R4ID0gYXBwa2l0LnRyeUdldEV4ZWN1dGlvbkNvbnRleHQoKTtcbiAgaWYgKGN0eD8uY2xpZW50KSByZXR1cm4gY3R4LmNsaWVudDtcbiAgLy8gT3V0c2lkZSBhIHJlcXVlc3Qgc2NvcGUgKGEgc2NyaXB0LCBhIHRlc3QpOiBhIGZyZXNoIGVudi1hdXRoIGNsaWVudC5cbiAgcmV0dXJuIGdldEV4ZWN1dGlvbkNvbnRleHQoKS5jbGllbnQ7XG59XG5cbi8qKiBDb25zdHJ1Y3QgYSB7QGxpbmsgU2VhcmNoQ2xpZW50fSBmcm9tIGEgcmVzb2x2ZWQgY29uZmlnLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNlYXJjaENsaWVudChcbiAgY29uZmlnPzogUmVzb2x2ZWRTZWFyY2hDb25maWcsXG4gIHdvcmtzcGFjZUNsaWVudEZhY3Rvcnk/OiAoKSA9PiBXb3Jrc3BhY2VDbGllbnRMaWtlLFxuICBsYWtlYmFzZT86IExha2ViYXNlU2VhcmNoQmFja2VuZCxcbik6IFNlYXJjaENsaWVudCB7XG4gIHJldHVybiBuZXcgU2VhcmNoQ2xpZW50KGNvbmZpZywgd29ya3NwYWNlQ2xpZW50RmFjdG9yeSwgbGFrZWJhc2UpO1xufVxuIl19
|
|
598
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTRCRztBQUVILE9BQU8sRUFBRSxjQUFjLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUV6RSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxJQUFJLFlBQVksRUFBRSxPQUFPLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM1RSxPQUFPLEVBQUUsS0FBSyxJQUFJLFNBQVMsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQy9FLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQVFyRCxPQUFPLEVBQ0wsWUFBWSxFQUNaLGlCQUFpQixFQUNqQixrQkFBa0IsRUFDbEIsY0FBYyxFQUNkLGdCQUFnQixHQUVqQixNQUFNLGFBQWEsQ0FBQztBQUVyQixPQUFPLEVBQ0wsYUFBYSxFQUNiLE1BQU0sRUFDTixXQUFXLEVBQ1gsZ0JBQWdCLEdBRWpCLE1BQU0sWUFBWSxDQUFDO0FBR3BCLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7QUE4QjNDOzs7O0dBSUc7QUFDSCxNQUFNLE9BQU8sV0FBVztJQUVYO0lBQ1E7SUFGbkIsWUFDVyxJQUFZLEVBQ0osTUFBb0I7UUFENUIsU0FBSSxHQUFKLElBQUksQ0FBUTtRQUNKLFdBQU0sR0FBTixNQUFNLENBQWM7SUFDcEMsQ0FBQztJQUVKLDBEQUEwRDtJQUMxRCxNQUFNLENBQUMsS0FBYSxFQUFFLE9BQXVCO1FBQzNDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLEVB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Qy9DLE1BQU0sR0FBRyxDQUFDO1FBQ1osQ0FBQztnQkFBUyxDQUFDO1lBQ1QsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3RCLENBQUM7SUFDSCxDQUFDO0NBQ0Y7QUFFRCx1RkFBdUY7QUFDdkYsU0FBUyxzQkFBc0I7SUFDN0IsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLHNCQUFzQixFQUFFLENBQUM7SUFDNUMsSUFBSSxHQUFHLEVBQUUsTUFBTTtRQUFFLE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQztJQUNuQyx1RUFBdUU7SUFDdkUsT0FBTyxtQkFBbUIsRUFBRSxDQUFDLE1BQU0sQ0FBQztBQUN0QyxDQUFDO0FBRUQsK0RBQStEO0FBQy9ELE1BQU0sVUFBVSxrQkFBa0IsQ0FDaEMsTUFBNkIsRUFDN0Isc0JBQWtELEVBQ2xELFFBQWdDO0lBRWhDLE9BQU8sSUFBSSxZQUFZLENBQUMsTUFBTSxFQUFFLHNCQUFzQixFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQ3BFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEEgc21hbGwsIE1laWxpc2VhcmNoLXNoYXBlZCBjbGllbnQgb3ZlciBEYXRhYnJpY2tzIEFJIFNlYXJjaCAoVmVjdG9yXG4gKiBTZWFyY2gpLiBUaGUgd2hvbGUgcG9pbnQgb2YgdGhpcyBtb2R1bGUgaXMgZXJnb25vbWljczogdGhlIERhdGFicmlja3MgU0RLJ3NcbiAqIGB2ZWN0b3JTZWFyY2hJbmRleGVzLnF1ZXJ5SW5kZXgoeyBpbmRleF9uYW1lLCBjb2x1bW5zLCBxdWVyeV90ZXh0LFxuICogcXVlcnlfdHlwZSwgbnVtX3Jlc3VsdHMsIGZpbHRlcnNfanNvbiB9KWAgaXMgcG93ZXJmdWwgYnV0IHZlcmJvc2UsIGFuZCB0aGVcbiAqIHJlc3BvbnNlIGlzIGNvbHVtbmFyLiBUaGlzIGNsaWVudCBoaWRlcyBhbGwgb2YgdGhhdCBiZWhpbmQgdHdvIG9iamVjdHM6XG4gKlxuICogYGBgdHNcbiAqIGNvbnN0IGNsaWVudCA9IGNyZWF0ZVNlYXJjaENsaWVudCgpO1xuICogY29uc3QgaW5kZXggPSBjbGllbnQuaW5kZXgoXCJtYWluLnN1cHBvcnQuZG9jc1wiKTtcbiAqIGNvbnN0IHsgaGl0cyB9ID0gYXdhaXQgaW5kZXguc2VhcmNoKFwicmVzZXQgbXkgcGFzc3dvcmRcIiwgeyBsaW1pdDogNSB9KTtcbiAqIGF3YWl0IGluZGV4LmFkZERvY3VtZW50cyhbeyBpZDogXCI0MlwiLCB0aXRsZTogXCJSZXNldFwiLCBib2R5OiBcIi4uLlwiIH1dKTtcbiAqIGBgYFxuICpcbiAqIGBjbGllbnQuc2VhcmNoKHF1ZXJ5LCBvcHRzKWAgc2VhcmNoZXMgdGhlIGRlZmF1bHQgaW5kZXg7IGBjbGllbnQuaW5kZXgobmFtZSlgXG4gKiByZXR1cm5zIGEgaGFuZGxlIGJvdW5kIHRvIG9uZSBpbmRleDsgYGNsaWVudC51bml2ZXJzYWxTZWFyY2gocXVlcnkpYCBmYW5zIGFcbiAqIHF1ZXJ5IGFjcm9zcyBzZXZlcmFsIGluZGV4ZXMgYW5kIG1lcmdlcyB0aGUgcmVzdWx0cyAoTWVpbGlzZWFyY2gncyBmZWRlcmF0ZWRcbiAqIC8gbXVsdGktc2VhcmNoLCB0aGUgXCJ1bml2ZXJzYWwgc2VhcmNoXCIgdGhlIGNhbGxlciBhc2tlZCBmb3IpLiBFdmVyeXRoaW5nIGlzXG4gKiBhc3luYyBhbmQgY2FuY2VsbGFibGUsIHJlc29sdmVzIHRoZSBPQk8gd29ya3NwYWNlIGNsaWVudCBmcm9tIHRoZSBhY3RpdmVcbiAqIEFwcEtpdCBleGVjdXRpb24gY29udGV4dCAoZmFsbGluZyBiYWNrIHRvIGEgc2VydmljZS1wcmluY2lwYWwgY2xpZW50IG91dHNpZGVcbiAqIGEgcmVxdWVzdCksIGFuZCByZXR1cm5zIHRoZSBicm93c2VyLXNhZmUgc2hhcGVzIGZyb21cbiAqIGBAZGJ4LXRvb2xzL3NoYXJlZC1zZWFyY2hgLlxuICpcbiAqIEF1dG9jb21wbGV0ZSBpcyBqdXN0IGEgc2VhcmNoIHdpdGggYSBzbWFsbCBgbGltaXRgIGFuZCB0aGUgcmF3IHF1ZXJ5IHRleHQgLVxuICogaHlicmlkIG1vZGUgYWxyZWFkeSBwcmVmaXgtbWF0Y2hlcywgc28gbm8gc2VwYXJhdGUgZW5kcG9pbnQgaXMgbmVlZGVkOyB0aGVcbiAqIHtAbGluayBTZWFyY2hJbmRleC5hdXRvY29tcGxldGV9IGhlbHBlciBpcyBhIHRoaW4sIHNlbGYtZG9jdW1lbnRpbmcgYWxpYXMuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IEV4ZWN1dGlvbkVycm9yLCBnZXRFeGVjdXRpb25Db250ZXh0IH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHsgQ29udGV4dCB9IGZyb20gXCJAZGF0YWJyaWNrcy9zZGstZXhwZXJpbWVudGFsXCI7XG5pbXBvcnQgeyBhcHBraXQsIGRhdGFicmlja3MgfSBmcm9tIFwiQGRieC10b29scy9hcHBraXRcIjtcbmltcG9ydCB7IGludm9rZSwgcmVzb2x2ZSBhcyBtb2RlbFJlc29sdmUsIHNlcnZpbmcgfSBmcm9tIFwiQGRieC10b29scy9tb2RlbFwiO1xuaW1wb3J0IHsgYXN5bmMgYXMgYXN5bmNVdGlsLCBqc29uLCBsb2csIHN0cmluZyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgeyBNb2RlbENsYXNzIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1vZGVsXCI7XG5pbXBvcnQgdHlwZSB7XG4gIFNlYXJjaERvY3VtZW50LFxuICBTZWFyY2hIaXQsXG4gIFNlYXJjaE1vZGUsXG4gIFNlYXJjaFJlc3VsdCxcbiAgVXBzZXJ0UmVzdWx0LFxufSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtc2VhcmNoXCI7XG5pbXBvcnQge1xuICBERUZBVUxUX01PREUsXG4gIERFRkFVTFRfUEFHRV9TSVpFLFxuICBERUZBVUxUX1RJTUVPVVRfTVMsXG4gIGluZGV4Q29uZmlnRm9yLFxuICByZXNvbHZlSW5kZXhOYW1lLFxuICB0eXBlIFJlc29sdmVkU2VhcmNoQ29uZmlnLFxufSBmcm9tIFwiLi9jb25maWcudHNcIjtcbmltcG9ydCB0eXBlIHsgTGFrZWJhc2VTZWFyY2hCYWNrZW5kIH0gZnJvbSBcIi4vbGFrZWJhc2UudHNcIjtcbmltcG9ydCB7XG4gIGNvbXBpbGVGaWx0ZXIsXG4gIHRvSGl0cyxcbiAgdG9RdWVyeVR5cGUsXG4gIHRvUmVxdWVzdENvbHVtbnMsXG4gIHR5cGUgUXVlcnlSZXNwb25zZUxpa2UsXG59IGZyb20gXCIuL3F1ZXJ5LnRzXCI7XG5cbnR5cGUgV29ya3NwYWNlQ2xpZW50TGlrZSA9IGFwcGtpdC5Xb3Jrc3BhY2VDbGllbnRMaWtlO1xuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcInNlYXJjaC9jbGllbnRcIik7XG5cbi8qKiBPcHRpb25zIGFjY2VwdGVkIGJ5IGEgc2luZ2xlLWluZGV4IHNlYXJjaC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VhcmNoT3B0aW9ucyB7XG4gIC8qKiBNYXhpbXVtIGhpdHMgdG8gcmV0dXJuLiBEZWZhdWx0cyB0byB0aGUgY29uZmlndXJlZCBwYWdlIHNpemUuICovXG4gIGxpbWl0PzogbnVtYmVyO1xuICAvKiogTWF0Y2ggbW9kZS4gRGVmYXVsdHMgdG8gdGhlIGNvbmZpZ3VyZWQgbW9kZSAoaHlicmlkKS4gKi9cbiAgbW9kZT86IFNlYXJjaE1vZGU7XG4gIC8qKiBDb2x1bW5zIHRvIHJldHVybiBwZXIgaGl0LiBEZWZhdWx0cyB0byB0aGUgaW5kZXgncyBjb25maWd1cmVkIGNvbHVtbnMuICovXG4gIGNvbHVtbnM/OiByZWFkb25seSBzdHJpbmdbXTtcbiAgLyoqIEF0dHJpYnV0ZSBmaWx0ZXJzIGFzIGB7IGNvbHVtbjogdmFsdWUgfWAgb3IgYHsgY29sdW1uOiB7IFwiPj1cIjogbiB9IH1gLiAqL1xuICBmaWx0ZXI/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgLyoqIERyb3AgaGl0cyBiZWxvdyB0aGlzIHNjb3JlLiAqL1xuICBzY29yZVRocmVzaG9sZD86IG51bWJlcjtcbiAgLyoqIEV4dGVybmFsIGNhbmNlbGxhdGlvbi4gKi9cbiAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG59XG5cbi8qKiBPcHRpb25zIGFjY2VwdGVkIGJ5IGEgdW5pdmVyc2FsIChmZWRlcmF0ZWQpIHNlYXJjaC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVW5pdmVyc2FsU2VhcmNoT3B0aW9ucyB7XG4gIC8qKiBJbmRleGVzIHRvIHNlYXJjaC4gRGVmYXVsdHMgdG8gZXZlcnkga25vd24gaW5kZXguICovXG4gIGluZGV4ZXM/OiByZWFkb25seSBzdHJpbmdbXTtcbiAgLyoqIE1heGltdW0gaGl0cyBwZXIgaW5kZXggYmVmb3JlIG1lcmdpbmcuICovXG4gIGxpbWl0PzogbnVtYmVyO1xuICAvKiogTWF0Y2ggbW9kZS4gKi9cbiAgbW9kZT86IFNlYXJjaE1vZGU7XG4gIC8qKiBFeHRlcm5hbCBjYW5jZWxsYXRpb24uICovXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsO1xufVxuXG4vKipcbiAqIEEgaGFuZGxlIGJvdW5kIHRvIG9uZSBpbmRleC4gTW9kZWxlZCBvbiBNZWlsaXNlYXJjaCdzIGBjbGllbnQuaW5kZXgodWlkKWA6XG4gKiBgc2VhcmNoYCAvIGBhdXRvY29tcGxldGVgIHJlYWQsIGBhZGREb2N1bWVudHNgIC8gYGRlbGV0ZURvY3VtZW50c2Agd3JpdGUgKHRvXG4gKiBhIGRpcmVjdC1hY2Nlc3MgaW5kZXgpLCBhbmQgYGluZm9gIGZldGNoZXMgdGhlIGxpdmUgZGVmaW5pdGlvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIFNlYXJjaEluZGV4IHtcbiAgY29uc3RydWN0b3IoXG4gICAgcmVhZG9ubHkgbmFtZTogc3RyaW5nLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY2xpZW50OiBTZWFyY2hDbGllbnQsXG4gICkge31cblxuICAvKiogU2VhcmNoIHRoaXMgaW5kZXguIFNlZSB7QGxpbmsgU2VhcmNoQ2xpZW50LnNlYXJjaH0uICovXG4gIHNlYXJjaChxdWVyeTogc3RyaW5nLCBvcHRpb25zPzogU2VhcmNoT3B0aW9ucyk6IFByb21pc2U8U2VhcmNoUmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LnNlYXJjaChxdWVyeSwgeyAuLi5vcHRpb25zLCBpbmRleDogdGhpcy5uYW1lIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEF1dG9jb21wbGV0ZSBhZ2FpbnN0IHRoaXMgaW5kZXg6IGEgc2VhcmNoIHdpdGggYSBzbWFsbCBkZWZhdWx0IGBsaW1pdGAgYW5kXG4gICAqIHRoZSByYXcgcHJlZml4IGFzIHRoZSBxdWVyeS4gSHlicmlkIG1vZGUgYWxyZWFkeSBoYW5kbGVzIHByZWZpeGVzLCBzbyB0aGlzXG4gICAqIGlzIGEgc2VsZi1kb2N1bWVudGluZyBhbGlhcyByYXRoZXIgdGhhbiBhIHNlcGFyYXRlIGNvZGUgcGF0aC5cbiAgICovXG4gIGF1dG9jb21wbGV0ZShwcmVmaXg6IHN0cmluZywgb3B0aW9ucz86IFNlYXJjaE9wdGlvbnMpOiBQcm9taXNlPFNlYXJjaFJlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLnNlYXJjaChwcmVmaXgsIHsgbGltaXQ6IDUsIC4uLm9wdGlvbnMgfSk7XG4gIH1cblxuICAvKiogQWRkIG9yIHVwZGF0ZSBkb2N1bWVudHMgaW4gdGhpcyAoZGlyZWN0LWFjY2VzcykgaW5kZXguICovXG4gIGFkZERvY3VtZW50cyhkb2N1bWVudHM6IFNlYXJjaERvY3VtZW50W10sIHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTxVcHNlcnRSZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuYWRkRG9jdW1lbnRzKHRoaXMubmFtZSwgZG9jdW1lbnRzLCBzaWduYWwpO1xuICB9XG5cbiAgLyoqIERlbGV0ZSBkb2N1bWVudHMgZnJvbSB0aGlzIChkaXJlY3QtYWNjZXNzKSBpbmRleCBieSBwcmltYXJ5IGtleS4gKi9cbiAgZGVsZXRlRG9jdW1lbnRzKGlkczogQXJyYXk8c3RyaW5nIHwgbnVtYmVyPiwgc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPFVwc2VydFJlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5kZWxldGVEb2N1bWVudHModGhpcy5uYW1lLCBpZHMsIHNpZ25hbCk7XG4gIH1cblxuICAvKiogRmV0Y2ggdGhpcyBpbmRleCdzIGxpdmUgZGVmaW5pdGlvbiAocHJpbWFyeSBrZXksIGNvbHVtbnMsIHJlYWRpbmVzcykuICovXG4gIGluZm8oc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPEluZGV4SW5mbz4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXRJbmRleCh0aGlzLm5hbWUsIHNpZ25hbCk7XG4gIH1cblxuICAvKiogVHJpZ2dlciBhIHN5bmMgb2YgdGhpcyAoRGVsdGEgU3luYykgaW5kZXggZnJvbSBpdHMgc291cmNlIHRhYmxlLiAqL1xuICBzeW5jKHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LnN5bmNJbmRleCh0aGlzLm5hbWUsIHNpZ25hbCk7XG4gIH1cblxuICAvKiogRGVsZXRlIHRoaXMgaW5kZXguICovXG4gIGRlbGV0ZShzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5kZWxldGVJbmRleCh0aGlzLm5hbWUsIHNpZ25hbCk7XG4gIH1cblxuICAvKiogQ3JlYXRlIHRoaXMgaW5kZXggaWYgaXQgZG9lcyBub3QgZXhpc3QsIG90aGVyd2lzZSByZXR1cm4gdGhlIGV4aXN0aW5nIG9uZS4gKi9cbiAgZW5zdXJlKG9wdGlvbnM/OiBDcmVhdGVJbmRleE9wdGlvbnMpOiBQcm9taXNlPEluZGV4SW5mbz4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5lbnN1cmVJbmRleCh0aGlzLm5hbWUsIG9wdGlvbnMpO1xuICB9XG59XG5cbi8qKiBBIHJlc29sdmVkIGxpdmUgaW5kZXggZGVmaW5pdGlvbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5kZXhJbmZvIHtcbiAgbmFtZTogc3RyaW5nO1xuICBlbmRwb2ludD86IHN0cmluZztcbiAgcHJpbWFyeUtleT86IHN0cmluZztcbiAgY29sdW1uczogc3RyaW5nW107XG4gIHJlYWR5OiBib29sZWFuO1xuICByb3dDb3VudD86IG51bWJlcjtcbiAgLyoqIFRydWUgZm9yIGEgRElSRUNUX0FDQ0VTUyBpbmRleCAoeW91IHN1cHBseSB2ZWN0b3JzOyBxdWVyaWVzIGVtYmVkIGNsaWVudC1zaWRlKS4gKi9cbiAgZGlyZWN0QWNjZXNzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgU2VhcmNoQ2xpZW50LmNyZWF0ZUluZGV4fSAvIHtAbGluayBTZWFyY2hDbGllbnQuZW5zdXJlSW5kZXh9LlxuICogVGhlIGdvYWwgaXMgdGhlIHNhbWUgYXMgdGhlIHJlc3Qgb2YgdGhlIGNsaWVudDogbmFtZSBhIHNvdXJjZSB0YWJsZSBhbmQgYVxuICogdGV4dCBjb2x1bW4sIGFuZCBldmVyeXRoaW5nIGVsc2UgLSB0aGUgZW5kcG9pbnQsIHRoZSBlbWJlZGRpbmcgbW9kZWwsIHRoZVxuICogaW5kZXggdHlwZSwgdGhlIHN5bmMgbW9kZSAtIGhhcyBhIHNlbnNpYmxlIGRlZmF1bHQgdGhhdCBpbmZlcnMgZnJvbSB0aGVcbiAqIHdvcmtzcGFjZSwgb3ZlcnJpZGFibGUgd2hlbiBhIGRlcGxveW1lbnQgbmVlZHMgdG8gZ28gZGVlcGVyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZUluZGV4T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBTb3VyY2UgRGVsdGEgdGFibGUgKGNhdGFsb2cuc2NoZW1hLnRhYmxlKSBmb3IgYSBEZWx0YSBTeW5jIGluZGV4LiBQcm92aWRlXG4gICAqIHRoaXMgZm9yIHRoZSBjb21tb24gY2FzZTogRGF0YWJyaWNrcyBjb21wdXRlcyBhbmQgc3luY3MgZW1iZWRkaW5ncyBmcm9tIGl0LlxuICAgKiBPbWl0IGl0IChhbmQgcGFzcyB7QGxpbmsgZW1iZWRkaW5nRGltZW5zaW9ufSkgdG8gY3JlYXRlIGEgZGlyZWN0LWFjY2Vzc1xuICAgKiBpbmRleCB5b3Ugd3JpdGUgdmVjdG9ycyB0byB5b3Vyc2VsZi5cbiAgICovXG4gIHNvdXJjZVRhYmxlPzogc3RyaW5nO1xuICAvKiogUHJpbWFyeS1rZXkgY29sdW1uLiBEZWZhdWx0cyB0byBgaWRgLiAqL1xuICBwcmltYXJ5S2V5Pzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHRleHQgY29sdW1uIGVtYmVkZGluZ3MgYXJlIGNvbXB1dGVkIGZyb20gKERlbHRhIFN5bmMpLiBEZWZhdWx0cyB0byB0aGVcbiAgICogZmlyc3Qgb2YgYHRleHRgIC8gYGNvbnRlbnRgIC8gYGJvZHlgIHByZXNlbnQsIGVsc2UgdGhlIGNhbGxlciBtdXN0IHNldCBpdC5cbiAgICovXG4gIGVtYmVkZGluZ1NvdXJjZUNvbHVtbj86IHN0cmluZztcbiAgLyoqXG4gICAqIEVtYmVkZGluZyBtb2RlbCBlbmRwb2ludC4gQSBsb29zZSBuYW1lIGlzIGZ1enp5LW1hdGNoZWQ7IHdoZW4gb21pdHRlZCB0aGVcbiAgICogYmVzdCBlbWJlZGRpbmcgZW5kcG9pbnQgaW4gdGhlIHdvcmtzcGFjZSBpcyBjaG9zZW4gKHtAbGluayByZXNvbHZlRW1iZWRkaW5nTW9kZWx9KS5cbiAgICovXG4gIGVtYmVkZGluZ01vZGVsPzogc3RyaW5nO1xuICAvKiogVmVjdG9yIFNlYXJjaCBlbmRwb2ludCB0byBob3N0IHRoZSBpbmRleCBvbi4gRGVmYXVsdHMgdG8gdGhlIHBsdWdpbidzIGBlbmRwb2ludGAuICovXG4gIGVuZHBvaW50Pzogc3RyaW5nO1xuICAvKiogRm9yIGEgZGlyZWN0LWFjY2VzcyBpbmRleDogdGhlIGVtYmVkZGluZyB2ZWN0b3IgZGltZW5zaW9uIChzZWxmLW1hbmFnZWQgdmVjdG9ycywgbm8gc291cmNlIHRhYmxlKS4gKi9cbiAgZW1iZWRkaW5nRGltZW5zaW9uPzogbnVtYmVyO1xuICAvKiogRm9yIGEgZGlyZWN0LWFjY2VzcyBpbmRleDogdGhlIGNvbHVtbiB0aGUgdmVjdG9yIGlzIHN0b3JlZCBpbi4gRGVmYXVsdHMgdG8gYGVtYmVkZGluZ2AuICovXG4gIGVtYmVkZGluZ1ZlY3RvckNvbHVtbj86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBjb2x1bW4tbmFtZSAtPiB0eXBlIG1hcCB1c2VkIHRvIGJ1aWxkIGEgZGlyZWN0LWFjY2VzcyBpbmRleCdzXG4gICAqIGBzY2hlbWFfanNvbmAgKHR5cGVzOiBgc3RyaW5nYCwgYGludGAsIGBsb25nYCwgYGZsb2F0YCwgYGRvdWJsZWAsXG4gICAqIGBib29sZWFuYCwgYGRhdGVgLCBgdGltZXN0YW1wYCkuIE11c3QgaW5jbHVkZSB0aGUgcHJpbWFyeSBrZXkgYW5kIGFueVxuICAgKiBjb2x1bW5zIHlvdSB1cHNlcnQuIERlZmF1bHRzIHRvIGB7IGlkOiBcInN0cmluZ1wiLCB0ZXh0OiBcInN0cmluZ1wiIH1gLiBUaGVcbiAgICogZW1iZWRkaW5nIHZlY3RvciBjb2x1bW4gaXMgYWRkZWQgYXV0b21hdGljYWxseS5cbiAgICovXG4gIHNjaGVtYT86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIC8qKiBTeW5jIG1vZGUgZm9yIGEgRGVsdGEgU3luYyBpbmRleC4gYFRSSUdHRVJFRGAgKGRlZmF1bHQpIHN5bmNzIG9uIGRlbWFuZDsgYENPTlRJTlVPVVNgIGtlZXBzIGZyZXNoLiAqL1xuICBwaXBlbGluZVR5cGU/OiBcIlRSSUdHRVJFRFwiIHwgXCJDT05USU5VT1VTXCI7XG4gIC8qKiBFeHRyYSBjb2x1bW5zIHRvIHN5bmMgYWxvbmdzaWRlIHRoZSBlbWJlZGRpbmcgc291cmNlIChEZWx0YSBTeW5jKS4gKi9cbiAgY29sdW1uc1RvU3luYz86IHN0cmluZ1tdO1xuICAvKiogRXh0ZXJuYWwgY2FuY2VsbGF0aW9uLiAqL1xuICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbn1cblxuLyoqIE9wdGlvbnMgZm9yIHtAbGluayBTZWFyY2hDbGllbnQuZW5zdXJlRW5kcG9pbnR9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbnN1cmVFbmRwb2ludE9wdGlvbnMge1xuICAvKiogV2FpdCBmb3IgdGhlIGVuZHBvaW50IHRvIGNvbWUgb25saW5lIGJlZm9yZSByZXR1cm5pbmcuIERlZmF1bHRzIHRvIGZhbHNlLiAqL1xuICB3YWl0PzogYm9vbGVhbjtcbiAgLyoqIEV4dGVybmFsIGNhbmNlbGxhdGlvbi4gKi9cbiAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIFNlYXJjaENsaWVudC5wcm92aXNpb259IC0gYSBvbmUtY2FsbCBcIm1ha2UgdGhpcyBpbmRleCByZWFsXG4gKiBhbmQgc2VhcmNoYWJsZVwiIHVzZWQgYXQgYm9vdCBvciBpbiBhIHNlZWQgc2NyaXB0LiBJdCBlbnN1cmVzIHRoZSBlbmRwb2ludCxcbiAqIGVuc3VyZXMgdGhlIGluZGV4LCBhbmQgKG9wdGlvbmFsbHkpIHNlZWRzIGRvY3VtZW50cyB3aGVuIHRoZSBpbmRleCBpcyBlbXB0eS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm92aXNpb25PcHRpb25zIGV4dGVuZHMgQ3JlYXRlSW5kZXhPcHRpb25zIHtcbiAgLyoqIERvY3VtZW50cyB0byBzZWVkIHdoZW4gdGhlIGluZGV4IGhhcyBubyByb3dzIHlldC4gU2tpcHBlZCBpZiBpdCBhbHJlYWR5IGhhcyBkYXRhLiAqL1xuICBzZWVkPzogU2VhcmNoRG9jdW1lbnRbXTtcbiAgLyoqXG4gICAqIFdhaXQgZm9yIHRoZSBlbmRwb2ludCBBTkQgaW5kZXggdG8gY29tZSBvbmxpbmUgYmVmb3JlIHJldHVybmluZyAobmVlZGVkXG4gICAqIGJlZm9yZSBzZWVkaW5nKS4gRGVmYXVsdHMgdG8gdHJ1ZS4gRW5kcG9pbnQgY3JlYXRpb24gY2FuIHRha2UgbWFueSBtaW51dGVzLlxuICAgKi9cbiAgd2FpdD86IGJvb2xlYW47XG4gIC8qKiBIb3cgbG9uZyB0byB3YWl0IGZvciByZWFkaW5lc3MgYmVmb3JlIGdpdmluZyB1cC4gRGVmYXVsdHMgdG8gMjAgbWludXRlcy4gKi9cbiAgdGltZW91dE1zPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIFRoZSBBSSBTZWFyY2ggY2xpZW50LiBDb25zdHJ1Y3QgaXQgd2l0aCB7QGxpbmsgY3JlYXRlU2VhcmNoQ2xpZW50fSAod2hpY2hcbiAqIHJlYWRzIGEgcmVzb2x2ZWQgY29uZmlnKSBvciBkaXJlY3RseSBmb3Igb25lLW9mZiB1c2UuIEFsbCByZWFkcyByZXNvbHZlIHRoZVxuICogT0JPIHdvcmtzcGFjZSBjbGllbnQgZnJvbSB0aGUgYWN0aXZlIGV4ZWN1dGlvbiBjb250ZXh0LlxuICovXG5leHBvcnQgY2xhc3MgU2VhcmNoQ2xpZW50IHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBjb25maWc6IFJlc29sdmVkU2VhcmNoQ29uZmlnID0ge1xuICAgICAgaW5kZXhlczogW10sXG4gICAgICBwYWdlU2l6ZTogREVGQVVMVF9QQUdFX1NJWkUsXG4gICAgICBtb2RlOiBERUZBVUxUX01PREUsXG4gICAgICBiYXNlUGF0aDogXCIvYXBpL3NlYXJjaFwiLFxuICAgICAgdGltZW91dE1zOiBERUZBVUxUX1RJTUVPVVRfTVMsXG4gICAgICBhbGxvd1dyaXRlOiBmYWxzZSxcbiAgICB9LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgd29ya3NwYWNlQ2xpZW50RmFjdG9yeTogKCkgPT4gV29ya3NwYWNlQ2xpZW50TGlrZSA9IGRlZmF1bHRXb3Jrc3BhY2VDbGllbnQsXG4gICAgLyoqXG4gICAgICogT3B0aW9uYWwgTGFrZWJhc2UgZnVsbC10ZXh0IEZBTExCQUNLIGJhY2tlbmQuIFByZXNlbnQgb25seSB3aGVuIG5vIFZlY3RvclxuICAgICAqIFNlYXJjaCBlbmRwb2ludCBpcyBjb25maWd1cmVkIGJ1dCBhIExha2ViYXNlIHBvb2wgaXMgYXZhaWxhYmxlOyB3aGVuIHNldCxcbiAgICAgKiBzZWFyY2ggLyBwcm92aXNpb24gLyB3cml0ZSBvcGVyYXRpb25zIGRlbGVnYXRlIHRvIGl0IGFuZCByZXR1cm4gdGhlIGV4YWN0XG4gICAgICogc2FtZSBzaGFwZXMsIHNvIG5vdGhpbmcgZG93bnN0cmVhbSBjYW4gdGVsbCB3aGljaCBiYWNrZW5kIGFuc3dlcmVkLlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgbGFrZWJhc2U/OiBMYWtlYmFzZVNlYXJjaEJhY2tlbmQsXG4gICkge31cblxuICAvKiogVHJ1ZSB3aGVuIHRoaXMgY2xpZW50IGlzIGFuc3dlcmluZyBvdXQgb2YgdGhlIExha2ViYXNlIGZhbGxiYWNrIGJhY2tlbmQuICovXG4gIGdldCB1c2VzTGFrZWJhc2UoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubGFrZWJhc2UgIT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKiBBIGhhbmRsZSBib3VuZCB0byBvbmUgaW5kZXggKGJ5IGZ1bGwgVUMgbmFtZSBvciBjb25maWd1cmVkIGFsaWFzKS4gKi9cbiAgaW5kZXgocmVmZXJlbmNlOiBzdHJpbmcpOiBTZWFyY2hJbmRleCB7XG4gICAgY29uc3QgbmFtZSA9IHJlc29sdmVJbmRleE5hbWUodGhpcy5jb25maWcsIHJlZmVyZW5jZSkgPz8gcmVmZXJlbmNlO1xuICAgIHJldHVybiBuZXcgU2VhcmNoSW5kZXgobmFtZSwgdGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogU2VhcmNoIG9uZSBpbmRleC4gYGluZGV4YCBtYXkgYmUgYSBmdWxsIFVDIG5hbWUsIGEgY29uZmlndXJlZCBhbGlhcywgb3JcbiAgICogb21pdHRlZCB0byB1c2UgdGhlIGRlZmF1bHQgaW5kZXguIFJldHVybnMgaGl0cyBzb3J0ZWQgbW9zdC1yZWxldmFudC1maXJzdC5cbiAgICovXG4gIGFzeW5jIHNlYXJjaChcbiAgICBxdWVyeTogc3RyaW5nLFxuICAgIG9wdGlvbnM6IFNlYXJjaE9wdGlvbnMgJiB7IGluZGV4Pzogc3RyaW5nIH0gPSB7fSxcbiAgKTogUHJvbWlzZTxTZWFyY2hSZXN1bHQ+IHtcbiAgICBjb25zdCB0ZXh0ID0gc3RyaW5nLnRyaW1Ub0VtcHR5KHF1ZXJ5KTtcbiAgICBjb25zdCBuYW1lID0gcmVzb2x2ZUluZGV4TmFtZSh0aGlzLmNvbmZpZywgb3B0aW9ucy5pbmRleCk7XG4gICAgaWYgKG5hbWUgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFeGVjdXRpb25FcnJvcihcInNlYXJjaDogbm8gaW5kZXggY29uZmlndXJlZDsgc2V0IGEgZGVmYXVsdCBpbmRleCBvciBwYXNzIG9uZVwiLCB7XG4gICAgICAgIGNvbnRleHQ6IHsgb3BlcmF0aW9uOiBcInNlYXJjaFwiIH0sXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKHRoaXMubGFrZWJhc2UpIHtcbiAgICAgIHJldHVybiB0aGlzLmxha2ViYXNlLnNlYXJjaChuYW1lLCB0ZXh0LCB7XG4gICAgICAgIGxpbWl0OiBvcHRpb25zLmxpbWl0ID8/IHRoaXMuY29uZmlnLnBhZ2VTaXplLFxuICAgICAgICAuLi4ob3B0aW9ucy5zY29yZVRocmVzaG9sZCAhPT0gdW5kZWZpbmVkID8geyBzY29yZVRocmVzaG9sZDogb3B0aW9ucy5zY29yZVRocmVzaG9sZCB9IDoge30pLFxuICAgICAgICAuLi4ob3B0aW9ucy5zaWduYWwgPyB7IHNpZ25hbDogb3B0aW9ucy5zaWduYWwgfSA6IHt9KSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCBrbm93biA9IGluZGV4Q29uZmlnRm9yKHRoaXMuY29uZmlnLCBuYW1lKTtcbiAgICBjb25zdCBwcmltYXJ5S2V5ID0ga25vd24/LnByaW1hcnlLZXk7XG4gICAgY29uc3QgY29sdW1ucyA9IHRvUmVxdWVzdENvbHVtbnMoXG4gICAgICBvcHRpb25zLmNvbHVtbnMsXG4gICAgICBrbm93bj8uY29sdW1ucyA/PyB0aGlzLmNvbmZpZy5jb2x1bW5zLFxuICAgICAgcHJpbWFyeUtleSxcbiAgICApO1xuICAgIGNvbnN0IG1vZGUgPSBvcHRpb25zLm1vZGUgPz8gdGhpcy5jb25maWcubW9kZTtcbiAgICBjb25zdCBsaW1pdCA9IG9wdGlvbnMubGltaXQgPz8gdGhpcy5jb25maWcucGFnZVNpemU7XG5cbiAgICAvLyBEYXRhYnJpY2tzIG9ubHkgbWFuYWdlcyBlbWJlZGRpbmdzIGZvciBEZWx0YSBTeW5jIGluZGV4ZXMsIHNvIGEgcXVlcnlcbiAgICAvLyBhZ2FpbnN0IGEgRElSRUNUX0FDQ0VTUyBpbmRleCBtdXN0IGNhcnJ5IGEgcXVlcnkgVkVDVE9SLCBub3QgdGV4dC4gRW1iZWRcbiAgICAvLyB0aGUgcXVlcnkgY2xpZW50LXNpZGUgaW4gdGhhdCBjYXNlICh0aGUgaW5kZXggdHlwZSBpcyBjYWNoZWQgYWZ0ZXIgdGhlXG4gICAgLy8gZmlyc3QgbG9va3VwIHNvIHRoaXMgY29zdHMgb25lIGV4dHJhIGNhbGwgcGVyIGluZGV4LCBub3QgcGVyIHNlYXJjaCkuXG4gICAgY29uc3QgZGlyZWN0QWNjZXNzID0gYXdhaXQgdGhpcy5pc0RpcmVjdEFjY2VzcyhuYW1lLCBvcHRpb25zLnNpZ25hbCk7XG4gICAgY29uc3QgcXVlcnlWZWN0b3IgPSBkaXJlY3RBY2Nlc3NcbiAgICAgID8gKGF3YWl0IHRoaXMuZW1iZWQoW3RleHRdLCB0aGlzLmNvbmZpZy5lbWJlZGRpbmdNb2RlbCwgb3B0aW9ucy5zaWduYWwpKVswXVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMud2l0aENsaWVudChcInNlYXJjaFwiLCBvcHRpb25zLnNpZ25hbCwgYXN5bmMgKGNsaWVudCwgY29udGV4dCkgPT4ge1xuICAgICAgcmV0dXJuIGNsaWVudC52ZWN0b3JTZWFyY2hJbmRleGVzLnF1ZXJ5SW5kZXgoXG4gICAgICAgIHtcbiAgICAgICAgICBpbmRleF9uYW1lOiBuYW1lLFxuICAgICAgICAgIGNvbHVtbnMsXG4gICAgICAgICAgLi4uKHF1ZXJ5VmVjdG9yID8geyBxdWVyeV92ZWN0b3I6IHF1ZXJ5VmVjdG9yIH0gOiB7IHF1ZXJ5X3RleHQ6IHRleHQgfSksXG4gICAgICAgICAgcXVlcnlfdHlwZTogdG9RdWVyeVR5cGUobW9kZSksXG4gICAgICAgICAgbnVtX3Jlc3VsdHM6IGxpbWl0LFxuICAgICAgICAgIC4uLihjb21waWxlRmlsdGVyKG9wdGlvbnMuZmlsdGVyKSA/IHsgZmlsdGVyc19qc29uOiBjb21waWxlRmlsdGVyKG9wdGlvbnMuZmlsdGVyKSB9IDoge30pLFxuICAgICAgICAgIC4uLihvcHRpb25zLnNjb3JlVGhyZXNob2xkICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8geyBzY29yZV90aHJlc2hvbGQ6IG9wdGlvbnMuc2NvcmVUaHJlc2hvbGQgfVxuICAgICAgICAgICAgOiB7fSksXG4gICAgICAgIH0sXG4gICAgICAgIGNvbnRleHQsXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgY29uc3QgaGl0cyA9IHRvSGl0cyhyZXNwb25zZSBhcyBRdWVyeVJlc3BvbnNlTGlrZSwgcHJpbWFyeUtleSk7XG4gICAgcmV0dXJuIHsgcXVlcnk6IHRleHQsIGluZGV4OiBuYW1lLCBoaXRzLCBjb3VudDogaGl0cy5sZW5ndGggfTtcbiAgfVxuXG4gIC8qKiBDYWNoZSBvZiBpbmRleC1uYW1lIC0+IGlzLURJUkVDVF9BQ0NFU1MsIHNvIGEgc2VhcmNoIGVtYmVkcyBpdHMgcXVlcnkgb25seSB3aGVuIG5lZWRlZC4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBkaXJlY3RBY2Nlc3NDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBib29sZWFuPigpO1xuXG4gIC8qKiBXaGV0aGVyIGFuIGluZGV4IGlzIERJUkVDVF9BQ0NFU1MgKG1lbW9pemVkKTsgYSBsb29rdXAgZmFpbHVyZSBhc3N1bWVzIERlbHRhIFN5bmMuICovXG4gIHByaXZhdGUgYXN5bmMgaXNEaXJlY3RBY2Nlc3MobmFtZTogc3RyaW5nLCBzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMuZGlyZWN0QWNjZXNzQ2FjaGUuZ2V0KG5hbWUpO1xuICAgIGlmIChjYWNoZWQgIT09IHVuZGVmaW5lZCkgcmV0dXJuIGNhY2hlZDtcbiAgICB0cnkge1xuICAgICAgY29uc3QgaW5mbyA9IGF3YWl0IHRoaXMuZ2V0SW5kZXgobmFtZSwgc2lnbmFsKTtcbiAgICAgIGNvbnN0IHZhbHVlID0gaW5mby5kaXJlY3RBY2Nlc3MgPz8gZmFsc2U7XG4gICAgICB0aGlzLmRpcmVjdEFjY2Vzc0NhY2hlLnNldChuYW1lLCB2YWx1ZSk7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZhbiBhIHF1ZXJ5IGFjcm9zcyBzZXZlcmFsIGluZGV4ZXMgYW5kIG1lcmdlIHRoZSBoaXRzLCBzb3J0ZWQgYnkgc2NvcmUgLVxuICAgKiB0aGUgXCJ1bml2ZXJzYWwgc2VhcmNoXCIgYSBzaW5nbGUgYm94IG92ZXIgbWFueSBjb2xsZWN0aW9ucyBuZWVkcy4gRWFjaFxuICAgKiBpbmRleCBpcyBzZWFyY2hlZCBjb25jdXJyZW50bHk7IGFuIGluZGV4IHRoYXQgZXJyb3JzIGlzIGxvZ2dlZCBhbmQgc2tpcHBlZFxuICAgKiBzbyBvbmUgYmFkIGluZGV4IGRvZXMgbm90IHNpbmsgdGhlIHdob2xlIHNlYXJjaC5cbiAgICovXG4gIGFzeW5jIHVuaXZlcnNhbFNlYXJjaChcbiAgICBxdWVyeTogc3RyaW5nLFxuICAgIG9wdGlvbnM6IFVuaXZlcnNhbFNlYXJjaE9wdGlvbnMgPSB7fSxcbiAgKTogUHJvbWlzZTxTZWFyY2hSZXN1bHQ+IHtcbiAgICBjb25zdCB0ZXh0ID0gc3RyaW5nLnRyaW1Ub0VtcHR5KHF1ZXJ5KTtcbiAgICBjb25zdCBuYW1lcyA9XG4gICAgICBvcHRpb25zLmluZGV4ZXMgJiYgb3B0aW9ucy5pbmRleGVzLmxlbmd0aCA+IDBcbiAgICAgICAgPyBvcHRpb25zLmluZGV4ZXMubWFwKChyZWYpID0+IHJlc29sdmVJbmRleE5hbWUodGhpcy5jb25maWcsIHJlZikgPz8gcmVmKVxuICAgICAgICA6IHRoaXMuY29uZmlnLmluZGV4ZXMubWFwKChpKSA9PiBpLm5hbWUpO1xuICAgIGNvbnN0IHBlckluZGV4ID0gb3B0aW9ucy5saW1pdCA/PyB0aGlzLmNvbmZpZy5wYWdlU2l6ZTtcblxuICAgIGNvbnN0IHNldHRsZWQgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoXG4gICAgICBuYW1lcy5tYXAoYXN5bmMgKG5hbWUpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zZWFyY2godGV4dCwge1xuICAgICAgICAgIGluZGV4OiBuYW1lLFxuICAgICAgICAgIGxpbWl0OiBwZXJJbmRleCxcbiAgICAgICAgICAuLi4ob3B0aW9ucy5tb2RlID8geyBtb2RlOiBvcHRpb25zLm1vZGUgfSA6IHt9KSxcbiAgICAgICAgICAuLi4ob3B0aW9ucy5zaWduYWwgPyB7IHNpZ25hbDogb3B0aW9ucy5zaWduYWwgfSA6IHt9KSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXN1bHQuaGl0cy5tYXAoKGhpdCk6IFNlYXJjaEhpdCA9PiAoeyAuLi5oaXQsIGluZGV4OiBuYW1lIH0pKTtcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICBjb25zdCBoaXRzID0gc2V0dGxlZFxuICAgICAgLmZsYXRNYXAoKG91dGNvbWUsIGkpID0+IHtcbiAgICAgICAgaWYgKG91dGNvbWUuc3RhdHVzID09PSBcImZ1bGZpbGxlZFwiKSByZXR1cm4gb3V0Y29tZS52YWx1ZTtcbiAgICAgICAgbG9nZ2VyLndhcm4oXCJ1bml2ZXJzYWwtaW5kZXgtZmFpbGVkXCIsIHsgaW5kZXg6IG5hbWVzW2ldIH0pO1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9KVxuICAgICAgLnNvcnQoKGEsIGIpID0+IGIuc2NvcmUgLSBhLnNjb3JlKTtcblxuICAgIHJldHVybiB7IHF1ZXJ5OiB0ZXh0LCBoaXRzLCBjb3VudDogaGl0cy5sZW5ndGggfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlIGFuIGluZGV4IHJlZmVyZW5jZSAoZnVsbCBVQyBuYW1lIG9yIGNvbmZpZ3VyZWQgYWxpYXMpIHRvIHRoZSBuYW1lXG4gICAqIHRoZSBBUEkgZXhwZWN0cywgZmFpbGluZyBmYXN0IHdoZW4gaXQgcmVzb2x2ZXMgdG8gbm90aGluZy4gV2l0aG91dCB0aGlzIGFcbiAgICogYmxhbmsgcmVmZXJlbmNlIC0gd2hhdCBhbiBvbWl0dGVkIGBpbmRleGAgYmVjb21lcyB3aGVuIG5vIGRlZmF1bHQgaXNcbiAgICogY29uZmlndXJlZCAtIHJlYWNoZXMgdGhlIFNESyBhcyBhbiBlbXB0eSBgaW5kZXhfbmFtZWAsIHdoaWNoIGJ1aWxkcyBhXG4gICAqIFVSTCB3aXRoIHRoZSBuYW1lIHNlZ21lbnQgbWlzc2luZyBhbmQgY29tZXMgYmFjayBhcyBhIGNvbmZ1c2luZ1xuICAgKiBgRU5EUE9JTlRfTk9UX0ZPVU5EYCBpbnN0ZWFkIG9mIG5hbWluZyB0aGUgcmVhbCBwcm9ibGVtLlxuICAgKi9cbiAgcHJpdmF0ZSByZXF1aXJlSW5kZXhOYW1lKHJlZmVyZW5jZTogc3RyaW5nLCBvcGVyYXRpb246IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgbmFtZSA9IHN0cmluZy50cmltVG9OdWxsKHJlc29sdmVJbmRleE5hbWUodGhpcy5jb25maWcsIHJlZmVyZW5jZSkgPz8gcmVmZXJlbmNlKTtcbiAgICBpZiAobmFtZSA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEV4ZWN1dGlvbkVycm9yKFxuICAgICAgICBgc2VhcmNoOiBubyBpbmRleCBjb25maWd1cmVkOyBzZXQgYSBkZWZhdWx0IGluZGV4IG9yIHBhc3Mgb25lIHRvICR7b3BlcmF0aW9ufWAsXG4gICAgICAgIHsgY29udGV4dDogeyBvcGVyYXRpb24gfSB9LFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIG5hbWU7XG4gIH1cblxuICAvKiogRmV0Y2ggYW4gaW5kZXgncyBsaXZlIGRlZmluaXRpb24uICovXG4gIGFzeW5jIGdldEluZGV4KHJlZmVyZW5jZTogc3RyaW5nLCBzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8SW5kZXhJbmZvPiB7XG4gICAgY29uc3QgbmFtZSA9IHRoaXMucmVxdWlyZUluZGV4TmFtZShyZWZlcmVuY2UsIFwiZ2V0SW5kZXhcIik7XG4gICAgY29uc3QgaW5kZXggPSBhd2FpdCB0aGlzLndpdGhDbGllbnQoXCJnZXRJbmRleFwiLCBzaWduYWwsIChjbGllbnQsIGNvbnRleHQpID0+XG4gICAgICBjbGllbnQudmVjdG9yU2VhcmNoSW5kZXhlcy5nZXRJbmRleCh7IGluZGV4X25hbWU6IG5hbWUgfSwgY29udGV4dCksXG4gICAgKTtcbiAgICBjb25zdCBkaXJlY3RBY2Nlc3MgPSBpbmRleC5kaXJlY3RfYWNjZXNzX2luZGV4X3NwZWMgIT09IHVuZGVmaW5lZDtcbiAgICBjb25zdCBzcGVjID0gaW5kZXguZGVsdGFfc3luY19pbmRleF9zcGVjID8/IGluZGV4LmRpcmVjdF9hY2Nlc3NfaW5kZXhfc3BlYztcbiAgICAvLyBEZWx0YSBTeW5jIHN1cmZhY2VzIGl0cyBlbWJlZGRpbmcgc291cmNlIGNvbHVtbnMgZGlyZWN0bHk7IGEgZGlyZWN0LWFjY2Vzc1xuICAgIC8vIGluZGV4IGNhcnJpZXMgaXRzIGNvbHVtbnMgaW4gc2NoZW1hX2pzb24gKG1pbnVzIHRoZSB2ZWN0b3IgY29sdW1uKS5cbiAgICBsZXQgY29sdW1ucyA9IChzcGVjPy5lbWJlZGRpbmdfc291cmNlX2NvbHVtbnMgPz8gW10pLm1hcCgoYykgPT4gYy5uYW1lID8/IFwiXCIpLmZpbHRlcihCb29sZWFuKTtcbiAgICBjb25zdCBzY2hlbWFKc29uID0gaW5kZXguZGlyZWN0X2FjY2Vzc19pbmRleF9zcGVjPy5zY2hlbWFfanNvbjtcbiAgICBpZiAoZGlyZWN0QWNjZXNzICYmIHNjaGVtYUpzb24pIHtcbiAgICAgIGNvbnN0IHNjaGVtYSA9IGpzb24ucGFyc2VSZWNvcmQoc2NoZW1hSnNvbikgPz8ge307XG4gICAgICBjb25zdCB2ZWN0b3JOYW1lcyA9IG5ldyBTZXQoXG4gICAgICAgIChpbmRleC5kaXJlY3RfYWNjZXNzX2luZGV4X3NwZWM/LmVtYmVkZGluZ192ZWN0b3JfY29sdW1ucyA/PyBbXSlcbiAgICAgICAgICAubWFwKChjKSA9PiBjLm5hbWUpXG4gICAgICAgICAgLmZpbHRlcigobik6IG4gaXMgc3RyaW5nID0+IEJvb2xlYW4obikpLFxuICAgICAgKTtcbiAgICAgIGNvbHVtbnMgPSBPYmplY3Qua2V5cyhzY2hlbWEpLmZpbHRlcigoYykgPT4gIXZlY3Rvck5hbWVzLmhhcyhjKSk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiBpbmRleC5uYW1lID8/IG5hbWUsXG4gICAgICAuLi4oaW5kZXguZW5kcG9pbnRfbmFtZSA/IHsgZW5kcG9pbnQ6IGluZGV4LmVuZHBvaW50X25hbWUgfSA6IHt9KSxcbiAgICAgIC4uLihpbmRleC5wcmltYXJ5X2tleSA/IHsgcHJpbWFyeUtleTogaW5kZXgucHJpbWFyeV9rZXkgfSA6IHt9KSxcbiAgICAgIGNvbHVtbnMsXG4gICAgICByZWFkeTogaW5kZXguc3RhdHVzPy5yZWFkeSA/PyBmYWxzZSxcbiAgICAgIC4uLihpbmRleC5zdGF0dXM/LmluZGV4ZWRfcm93X2NvdW50ICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyB7IHJvd0NvdW50OiBpbmRleC5zdGF0dXMuaW5kZXhlZF9yb3dfY291bnQgfVxuICAgICAgICA6IHt9KSxcbiAgICAgIC4uLihkaXJlY3RBY2Nlc3MgPyB7IGRpcmVjdEFjY2VzczogdHJ1ZSB9IDoge30pLFxuICAgIH07XG4gIH1cblxuICAvKiogQWRkIG9yIHVwZGF0ZSBkb2N1bWVudHMgaW4gYSBkaXJlY3QtYWNjZXNzIGluZGV4LiAqL1xuICBhc3luYyBhZGREb2N1bWVudHMoXG4gICAgcmVmZXJlbmNlOiBzdHJpbmcsXG4gICAgZG9jdW1lbnRzOiBTZWFyY2hEb2N1bWVudFtdLFxuICAgIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuICApOiBQcm9taXNlPFVwc2VydFJlc3VsdD4ge1xuICAgIGNvbnN0IG5hbWUgPSB0aGlzLnJlcXVpcmVJbmRleE5hbWUocmVmZXJlbmNlLCBcImFkZERvY3VtZW50c1wiKTtcbiAgICBpZiAodGhpcy5sYWtlYmFzZSkge1xuICAgICAgcmV0dXJuIHRoaXMubGFrZWJhc2UuYWRkRG9jdW1lbnRzKFxuICAgICAgICBuYW1lLFxuICAgICAgICBkb2N1bWVudHMsXG4gICAgICAgIHRoaXMuY29uZmlnLmVuc3VyZU9uU2V0dXA/LnRleHRDb2x1bW4gPz8gXCJ0ZXh0XCIsXG4gICAgICAgIHNpZ25hbCxcbiAgICAgICk7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMud2l0aENsaWVudChcImFkZERvY3VtZW50c1wiLCBzaWduYWwsIChjbGllbnQsIGNvbnRleHQpID0+XG4gICAgICBjbGllbnQudmVjdG9yU2VhcmNoSW5kZXhlcy51cHNlcnREYXRhVmVjdG9ySW5kZXgoXG4gICAgICAgIHsgaW5kZXhfbmFtZTogbmFtZSwgaW5wdXRzX2pzb246IEpTT04uc3RyaW5naWZ5KGRvY3VtZW50cykgfSxcbiAgICAgICAgY29udGV4dCxcbiAgICAgICksXG4gICAgKTtcbiAgICByZXR1cm4geyBpbmRleDogbmFtZSwgY291bnQ6IGRvY3VtZW50cy5sZW5ndGggfTtcbiAgfVxuXG4gIC8qKiBEZWxldGUgZG9jdW1lbnRzIGZyb20gYSBkaXJlY3QtYWNjZXNzIGluZGV4IGJ5IHByaW1hcnkga2V5LiAqL1xuICBhc3luYyBkZWxldGVEb2N1bWVudHMoXG4gICAgcmVmZXJlbmNlOiBzdHJpbmcsXG4gICAgaWRzOiBBcnJheTxzdHJpbmcgfCBudW1iZXI+LFxuICAgIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuICApOiBQcm9taXNlPFVwc2VydFJlc3VsdD4ge1xuICAgIGNvbnN0IG5hbWUgPSB0aGlzLnJlcXVpcmVJbmRleE5hbWUocmVmZXJlbmNlLCBcImRlbGV0ZURvY3VtZW50c1wiKTtcbiAgICBpZiAodGhpcy5sYWtlYmFzZSkge1xuICAgICAgcmV0dXJuIHRoaXMubGFrZWJhc2UuZGVsZXRlRG9jdW1lbnRzKG5hbWUsIGlkcywgc2lnbmFsKTtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy53aXRoQ2xpZW50KFwiZGVsZXRlRG9jdW1lbnRzXCIsIHNpZ25hbCwgKGNsaWVudCwgY29udGV4dCkgPT5cbiAgICAgIGNsaWVudC52ZWN0b3JTZWFyY2hJbmRleGVzLmRlbGV0ZURhdGFWZWN0b3JJbmRleChcbiAgICAgICAgeyBpbmRleF9uYW1lOiBuYW1lLCBwcmltYXJ5X2tleXM6IGlkcy5tYXAoU3RyaW5nKSB9LFxuICAgICAgICBjb250ZXh0LFxuICAgICAgKSxcbiAgICApO1xuICAgIHJldHVybiB7IGluZGV4OiBuYW1lLCBjb3VudDogaWRzLmxlbmd0aCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgYW4gZW1iZWRkaW5nIGVuZHBvaW50IGlkIGZvciBjcmVhdGluZyBhIERlbHRhIFN5bmMgaW5kZXguIFJldXNlc1xuICAgKiB0aGUgbW9kZWwgcmVzb2x2ZXI6IGEgY29uZmlndXJlZCAvIHBhc3NlZCBuYW1lIGlzIGZ1enp5LW1hdGNoZWQgYWdhaW5zdCB0aGVcbiAgICogbGl2ZSBjYXRhbG9ndWUsIG90aGVyd2lzZSB0aGUgaGlnaGVzdC1yYW5rZWQgZW1iZWRkaW5nIGVuZHBvaW50IGlzIGNob3Nlbi5cbiAgICovXG4gIGFzeW5jIHJlc29sdmVFbWJlZGRpbmdNb2RlbChyZXF1ZXN0ZWQ/OiBzdHJpbmcsIHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XG4gICAgY29uc3QgZXhwbGljaXQgPSBzdHJpbmcudHJpbVRvTnVsbChyZXF1ZXN0ZWQgPz8gdGhpcy5jb25maWcuZW1iZWRkaW5nTW9kZWwpO1xuICAgIC8vIEFuIGV4cGxpY2l0IG5hbWUgdGhhdCBhbHJlYWR5IGxvb2tzIGxpa2UgYW4gZW5kcG9pbnQgaWQgKG5vIHdoaXRlc3BhY2UpXG4gICAgLy8gaXMgdXNlZCB2ZXJiYXRpbSAtIG5vIG5lZWQgdG8gZmV0Y2ggYW5kIGZ1enp5LW1hdGNoIHRoZSBsaXZlIGNhdGFsb2d1ZS5cbiAgICAvLyBBIGdlbnVpbmVseSBsb29zZSBuYW1lIChlLmcuIFwiZ3RlIGxhcmdlXCIpIHN0aWxsIHJlc29sdmVzIGFnYWluc3QgaXQuXG4gICAgaWYgKGV4cGxpY2l0ICYmICEvXFxzLy50ZXN0KGV4cGxpY2l0KSkgcmV0dXJuIGV4cGxpY2l0O1xuICAgIHJldHVybiB0aGlzLndpdGhDbGllbnQoXCJyZXNvbHZlRW1iZWRkaW5nTW9kZWxcIiwgc2lnbmFsLCBhc3luYyAoY2xpZW50KSA9PiB7XG4gICAgICBjb25zdCBob3N0ID0gKGF3YWl0IGNsaWVudC5jb25maWcuZ2V0SG9zdCgpKS50b1N0cmluZygpO1xuICAgICAgY29uc3QgZW5kcG9pbnRzID0gYXdhaXQgc2VydmluZy5saXN0U2VydmluZ0VuZHBvaW50cyhjbGllbnQsIGhvc3QpO1xuICAgICAgY29uc3QgeyBtb2RlbElkIH0gPSBtb2RlbFJlc29sdmUucmVzb2x2ZU1vZGVsKGVuZHBvaW50cywge1xuICAgICAgICAuLi4oZXhwbGljaXQgPyB7IGV4cGxpY2l0IH0gOiB7IG1vZGVsQ2xhc3M6IE1vZGVsQ2xhc3MuRW1iZWRkaW5nIH0pLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gc3RyaW5nLnRyaW1Ub051bGwobW9kZWxJZCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRW1iZWQgdGV4dCB2aWEgYSBEYXRhYnJpY2tzIGVtYmVkZGluZyBzZXJ2aW5nIGVuZHBvaW50LCByZXR1cm5pbmcgb25lXG4gICAqIHZlY3RvciBwZXIgaW5wdXQuIFVzZWQgdG8gc2VlZCBhIGRpcmVjdC1hY2Nlc3MgaW5kZXggYW5kIHRvIHR1cm4gYSBzZWFyY2hcbiAgICogcXVlcnkgaW50byBhIHF1ZXJ5IHZlY3RvciAtIERhdGFicmlja3Mgb25seSBtYW5hZ2VzIGVtYmVkZGluZ3MgZm9yIERlbHRhXG4gICAqIFN5bmMgaW5kZXhlcywgc28gYSBkaXJlY3QtYWNjZXNzIGluZGV4IChubyBEZWx0YSB0YWJsZSwgbm8gd2FyZWhvdXNlKSBuZWVkc1xuICAgKiB0aGUgY2xpZW50IHRvIGVtYmVkIG9uIHdyaXRlIGFuZCBvbiBxdWVyeS4gVGhlIGVuZHBvaW50IGlzIHJlc29sdmVkIHRoZVxuICAgKiBzYW1lIHdheSBhcyBmb3IgaW5kZXggY3JlYXRpb24gd2hlbiBub3QgbmFtZWQuXG4gICAqL1xuICBhc3luYyBlbWJlZCh0ZXh0czogc3RyaW5nW10sIG1vZGVsPzogc3RyaW5nLCBzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8bnVtYmVyW11bXT4ge1xuICAgIGlmICh0ZXh0cy5sZW5ndGggPT09IDApIHJldHVybiBbXTtcbiAgICBjb25zdCBlbmRwb2ludCA9IGF3YWl0IHRoaXMucmVzb2x2ZUVtYmVkZGluZ01vZGVsKG1vZGVsLCBzaWduYWwpO1xuICAgIGlmICghZW5kcG9pbnQpIHtcbiAgICAgIHRocm93IG5ldyBFeGVjdXRpb25FcnJvcihcInNlYXJjaDogY291bGQgbm90IHJlc29sdmUgYW4gZW1iZWRkaW5nIG1vZGVsIHRvIGVtYmVkIHRleHRcIiwge1xuICAgICAgICBjb250ZXh0OiB7IG9wZXJhdGlvbjogXCJlbWJlZFwiIH0sXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMud2l0aENsaWVudChcImVtYmVkXCIsIHNpZ25hbCwgYXN5bmMgKGNsaWVudCkgPT4ge1xuICAgICAgY29uc3QgaG9zdCA9IChhd2FpdCBjbGllbnQuY29uZmlnLmdldEhvc3QoKSkudG9TdHJpbmcoKTtcbiAgICAgIGNvbnN0IHVybCA9IGludm9rZS5pbnZvY2F0aW9uc1VybChob3N0LCBlbmRwb2ludCk7XG4gICAgICBjb25zdCBoZWFkZXJzID0gYXdhaXQgaW52b2tlLmF1dGhIZWFkZXJzKGNsaWVudCk7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwge1xuICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICBoZWFkZXJzOiB7IC4uLmhlYWRlcnMsIFwiY29udGVudC10eXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgaW5wdXQ6IHRleHRzIH0pLFxuICAgICAgICAuLi4oc2lnbmFsID8geyBzaWduYWwgfSA6IHt9KSxcbiAgICAgIH0pO1xuICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICB0aHJvdyBuZXcgRXhlY3V0aW9uRXJyb3IoXG4gICAgICAgICAgYHNlYXJjaDogZW1iZWRkaW5nIGVuZHBvaW50ICR7ZW5kcG9pbnR9IGZhaWxlZCAoJHtyZXNwb25zZS5zdGF0dXN9KWAsXG4gICAgICAgICAgeyBjb250ZXh0OiB7IG9wZXJhdGlvbjogXCJlbWJlZFwiIH0gfSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGJvZHkgPSAoYXdhaXQgcmVzcG9uc2UuanNvbigpKSBhcyB7IGRhdGE/OiBBcnJheTx7IGVtYmVkZGluZzogbnVtYmVyW10gfT4gfTtcbiAgICAgIGNvbnN0IHZlY3RvcnMgPSAoYm9keS5kYXRhID8/IFtdKS5tYXAoKHJvdykgPT4gcm93LmVtYmVkZGluZyk7XG4gICAgICBpZiAodmVjdG9ycy5sZW5ndGggIT09IHRleHRzLmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXhlY3V0aW9uRXJyb3IoXCJzZWFyY2g6IGVtYmVkZGluZyByZXNwb25zZSBkaWQgbm90IG1hdGNoIHRoZSBpbnB1dCBjb3VudFwiLCB7XG4gICAgICAgICAgY29udGV4dDogeyBvcGVyYXRpb246IFwiZW1iZWRcIiB9LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2ZWN0b3JzO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIFRoZSB2ZWN0b3IgZGltZW5zaW9uIGEgbW9kZWwgcHJvZHVjZXMgKGVtYmVkcyBhIHByb2JlIHN0cmluZyBvbmNlKS4gKi9cbiAgcHJpdmF0ZSBhc3luYyBlbWJlZGRpbmdEaW1lbnNpb24obW9kZWw/OiBzdHJpbmcsIHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCBbdmVjdG9yXSA9IGF3YWl0IHRoaXMuZW1iZWQoW1wiZGltZW5zaW9uIHByb2JlXCJdLCBtb2RlbCwgc2lnbmFsKTtcbiAgICBpZiAoIXZlY3RvciB8fCB2ZWN0b3IubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXhlY3V0aW9uRXJyb3IoXCJzZWFyY2g6IGNvdWxkIG5vdCBkZXRlcm1pbmUgdGhlIGVtYmVkZGluZyBkaW1lbnNpb25cIiwge1xuICAgICAgICBjb250ZXh0OiB7IG9wZXJhdGlvbjogXCJjcmVhdGVJbmRleFwiIH0sXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHZlY3Rvci5sZW5ndGg7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGFuIEFJIFNlYXJjaCBpbmRleCB3aXRoIGFzIGxpdHRsZSBjZXJlbW9ueSBhcyBwb3NzaWJsZS4gVHdvIHNoYXBlczpcbiAgICpcbiAgICogICAtICoqRGVsdGEgU3luYyoqICh0aGUgZGVmYXVsdCk6IHBhc3MgYHNvdXJjZVRhYmxlYDsgRGF0YWJyaWNrcyBjb21wdXRlc1xuICAgKiAgICAgZW1iZWRkaW5ncyBmcm9tIHRoZSB0ZXh0IGNvbHVtbiBhbmQga2VlcHMgdGhlIGluZGV4IHN5bmNlZC4gVGhlXG4gICAqICAgICBlbWJlZGRpbmcgbW9kZWwgaXMgcmVzb2x2ZWQgYXV0b21hdGljYWxseSB3aGVuIG5vdCBuYW1lZC5cbiAgICogICAtICoqRGlyZWN0IEFjY2VzcyoqOiBvbWl0IGBzb3VyY2VUYWJsZWAgYW5kIHBhc3MgYGVtYmVkZGluZ0RpbWVuc2lvbmA7XG4gICAqICAgICB5b3Ugd3JpdGUgdmVjdG9ycyB5b3Vyc2VsZiB2aWEge0BsaW5rIGFkZERvY3VtZW50c30uXG4gICAqXG4gICAqIEV2ZXJ5dGhpbmcgZWxzZSBpbmZlcnM6IHRoZSBlbmRwb2ludCBmcm9tIHRoZSBwbHVnaW4gY29uZmlnLCB0aGUgcHJpbWFyeVxuICAgKiBrZXkgKGBpZGApLCB0aGUgdGV4dCBjb2x1bW4gKGB0ZXh0YCAvIGBjb250ZW50YCAvIGBib2R5YCksIGFuZCB0aGUgdmVjdG9yXG4gICAqIGNvbHVtbiAoYGVtYmVkZGluZ2ApLiBSZXR1cm5zIHRoZSBjcmVhdGVkIGluZGV4J3Mge0BsaW5rIEluZGV4SW5mb30uXG4gICAqL1xuICBhc3luYyBjcmVhdGVJbmRleChuYW1lOiBzdHJpbmcsIG9wdGlvbnM6IENyZWF0ZUluZGV4T3B0aW9ucyA9IHt9KTogUHJvbWlzZTxJbmRleEluZm8+IHtcbiAgICBjb25zdCBlbmRwb2ludCA9IG9wdGlvbnMuZW5kcG9pbnQgPz8gdGhpcy5jb25maWcuZW5kcG9pbnQ7XG4gICAgaWYgKCFlbmRwb2ludCkge1xuICAgICAgdGhyb3cgbmV3IEV4ZWN1dGlvbkVycm9yKFxuICAgICAgICBcInNlYXJjaDogbm8gVmVjdG9yIFNlYXJjaCBlbmRwb2ludCBjb25maWd1cmVkOyBwYXNzIGBlbmRwb2ludGAgb3Igc2V0IGl0IG9uIHRoZSBwbHVnaW5cIixcbiAgICAgICAgeyBjb250ZXh0OiB7IG9wZXJhdGlvbjogXCJjcmVhdGVJbmRleFwiIH0gfSxcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IHByaW1hcnlLZXkgPSBvcHRpb25zLnByaW1hcnlLZXkgPz8gXCJpZFwiO1xuICAgIGNvbnN0IGRpcmVjdCA9ICFvcHRpb25zLnNvdXJjZVRhYmxlO1xuICAgIGNvbnN0IHNvdXJjZUNvbHVtbiA9IG9wdGlvbnMuZW1iZWRkaW5nU291cmNlQ29sdW1uID8/IFwidGV4dFwiO1xuICAgIGNvbnN0IHZlY3RvckNvbHVtbiA9IG9wdGlvbnMuZW1iZWRkaW5nVmVjdG9yQ29sdW1uID8/IFwiZW1iZWRkaW5nXCI7XG5cbiAgICAvLyBEZWx0YSBTeW5jIGxldHMgRGF0YWJyaWNrcyBlbWJlZCBhIHNvdXJjZSBjb2x1bW4sIHNvIGl0IG5lZWRzIGFuIGVtYmVkZGluZ1xuICAgIC8vIG1vZGVsLiBBIGRpcmVjdC1hY2Nlc3MgaW5kZXggc3RvcmVzIHZlY3RvcnMgWU9VIHN1cHBseSAoRGF0YWJyaWNrcyBvbmx5XG4gICAgLy8gc3VwcG9ydHMgbWFuYWdlZCBlbWJlZGRpbmdzIG9uIERlbHRhIFN5bmMpLCBzbyBpdCBuZWVkcyBhIGRpbWVuc2lvbjsgd2VcbiAgICAvLyByZXNvbHZlIG9uZSBmcm9tIHRoZSBlbWJlZGRpbmcgbW9kZWwgd2hlbiBub3QgZ2l2ZW4gc28gYSBkaXJlY3QtYWNjZXNzXG4gICAgLy8gaW5kZXggc3RpbGwgd29ya3Mgd2l0aCB6ZXJvIGV4dHJhIGNvbmZpZyAoZW1iZWQgdmlhIGBlbWJlZCgpYCBvbiBzZWVkICtcbiAgICAvLyBxdWVyeSAtIHNlZSBgcHJvdmlzaW9uYCAvIGBzZWFyY2hgKS5cbiAgICBjb25zdCBlbWJlZGRpbmdNb2RlbCA9XG4gICAgICAoYXdhaXQgdGhpcy5yZXNvbHZlRW1iZWRkaW5nTW9kZWwob3B0aW9ucy5lbWJlZGRpbmdNb2RlbCwgb3B0aW9ucy5zaWduYWwpKSA/PyB1bmRlZmluZWQ7XG4gICAgaWYgKCFlbWJlZGRpbmdNb2RlbCkge1xuICAgICAgdGhyb3cgbmV3IEV4ZWN1dGlvbkVycm9yKFxuICAgICAgICBcInNlYXJjaDogY291bGQgbm90IHJlc29sdmUgYW4gZW1iZWRkaW5nIG1vZGVsOyBwYXNzIGBlbWJlZGRpbmdNb2RlbGBcIixcbiAgICAgICAgeyBjb250ZXh0OiB7IG9wZXJhdGlvbjogXCJjcmVhdGVJbmRleFwiIH0gfSxcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IGRpbWVuc2lvbiA9XG4gICAgICBvcHRpb25zLmVtYmVkZGluZ0RpbWVuc2lvbiA/PyAoYXdhaXQgdGhpcy5lbWJlZGRpbmdEaW1lbnNpb24oZW1iZWRkaW5nTW9kZWwsIG9wdGlvbnMuc2lnbmFsKSk7XG5cbiAgICBjb25zdCBzY2hlbWEgPSB7XG4gICAgICBbcHJpbWFyeUtleV06IFwic3RyaW5nXCIsXG4gICAgICBbc291cmNlQ29sdW1uXTogXCJzdHJpbmdcIixcbiAgICAgIC4uLihvcHRpb25zLnNjaGVtYSA/PyB7fSksXG4gICAgfTtcblxuICAgIGNvbnN0IGRpcmVjdFNwZWMgPSB7XG4gICAgICBkaXJlY3RfYWNjZXNzX2luZGV4X3NwZWM6IHtcbiAgICAgICAgZW1iZWRkaW5nX3ZlY3Rvcl9jb2x1bW5zOiBbeyBuYW1lOiB2ZWN0b3JDb2x1bW4sIGVtYmVkZGluZ19kaW1lbnNpb246IGRpbWVuc2lvbiB9XSxcbiAgICAgICAgc2NoZW1hX2pzb246IEpTT04uc3RyaW5naWZ5KHsgLi4uc2NoZW1hLCBbdmVjdG9yQ29sdW1uXTogYGFycmF5PGZsb2F0PmAgfSksXG4gICAgICB9LFxuICAgIH07XG5cbiAgICBhd2FpdCB0aGlzLndpdGhDbGllbnQoXCJjcmVhdGVJbmRleFwiLCBvcHRpb25zLnNpZ25hbCwgKGNsaWVudCwgY29udGV4dCkgPT5cbiAgICAgIGNsaWVudC52ZWN0b3JTZWFyY2hJbmRleGVzLmNyZWF0ZUluZGV4KFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgICBlbmRwb2ludF9uYW1lOiBlbmRwb2ludCxcbiAgICAgICAgICBwcmltYXJ5X2tleTogcHJpbWFyeUtleSxcbiAgICAgICAgICBpbmRleF90eXBlOiBkaXJlY3QgPyBcIkRJUkVDVF9BQ0NFU1NcIiA6IFwiREVMVEFfU1lOQ1wiLFxuICAgICAgICAgIC4uLihkaXJlY3RcbiAgICAgICAgICAgID8gZGlyZWN0U3BlY1xuICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgZGVsdGFfc3luY19pbmRleF9zcGVjOiB7XG4gICAgICAgICAgICAgICAgICBzb3VyY2VfdGFibGU6IG9wdGlvbnMuc291cmNlVGFibGUsXG4gICAgICAgICAgICAgICAgICBwaXBlbGluZV90eXBlOiBvcHRpb25zLnBpcGVsaW5lVHlwZSA/PyBcIlRSSUdHRVJFRFwiLFxuICAgICAgICAgICAgICAgICAgZW1iZWRkaW5nX3NvdXJjZV9jb2x1bW5zOiBbXG4gICAgICAgICAgICAgICAgICAgIHsgbmFtZTogc291cmNlQ29sdW1uLCBlbWJlZGRpbmdfbW9kZWxfZW5kcG9pbnRfbmFtZTogZW1iZWRkaW5nTW9kZWwgfSxcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAuLi4ob3B0aW9ucy5jb2x1bW5zVG9TeW5jICYmIG9wdGlvbnMuY29sdW1uc1RvU3luYy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgICAgID8geyBjb2x1bW5zX3RvX3N5bmM6IG9wdGlvbnMuY29sdW1uc1RvU3luYyB9XG4gICAgICAgICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICB9LFxuICAgICAgICBjb250ZXh0LFxuICAgICAgKSxcbiAgICApO1xuICAgIGxvZ2dlci5pbmZvKFwiaW5kZXgtY3JlYXRlZFwiLCB7XG4gICAgICBpbmRleDogbmFtZSxcbiAgICAgIGVuZHBvaW50LFxuICAgICAgdHlwZTogZGlyZWN0ID8gXCJESVJFQ1RfQUNDRVNTXCIgOiBcIkRFTFRBX1NZTkNcIixcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcy5nZXRJbmRleChuYW1lLCBvcHRpb25zLnNpZ25hbCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIHRoZSBpbmRleCBpZiBpdCBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LCBvdGhlcndpc2UgcmV0dXJuIHRoZVxuICAgKiBleGlzdGluZyBvbmUuIElkZW1wb3RlbnQgLSBzYWZlIHRvIGNhbGwgb24gZXZlcnkgYm9vdCB0byBndWFyYW50ZWUgYW5cbiAgICogaW5kZXggaXMgcHJlc2VudC5cbiAgICovXG4gIGFzeW5jIGVuc3VyZUluZGV4KG5hbWU6IHN0cmluZywgb3B0aW9uczogQ3JlYXRlSW5kZXhPcHRpb25zID0ge30pOiBQcm9taXNlPEluZGV4SW5mbz4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXRJbmRleChuYW1lLCBvcHRpb25zLnNpZ25hbCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGVJbmRleChuYW1lLCBvcHRpb25zKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRW5zdXJlIGFuIGluZGV4IGV4aXN0cywgaXMgb25saW5lLCBhbmQgKG9wdGlvbmFsbHkpIGhvbGRzIHNlZWQgZGF0YSAtIHRoZVxuICAgKiBcIndpcmUgdXAgYSByZWFsIGluZGV4IG9uIGJvb3RcIiBwYXRoLiBJZGVtcG90ZW50IGFuZCBjaGVhcCB0byBjYWxsIGV2ZXJ5XG4gICAqIGJvb3Q6IGl0IGNyZWF0ZXMgdGhlIGVuZHBvaW50IGFuZCBpbmRleCBvbmx5IGlmIG1pc3NpbmcsIHdhaXRzIGZvciB0aGVtIHRvXG4gICAqIGNvbWUgb25saW5lLCBhbmQgc2VlZHMgZG9jdW1lbnRzIE9OTFkgd2hlbiB0aGUgaW5kZXggaXMgc3RpbGwgZW1wdHkuXG4gICAqXG4gICAqIEZvciB0aGUgZGVtby9kdW1teS1kYXRhIGNhc2UgdGhpcyBuZWVkcyBubyBEZWx0YSB0YWJsZSBhbmQgbm8gd2FyZWhvdXNlOlxuICAgKiB0aGUgZGVmYXVsdCBpcyBhIE1BTkFHRUQgZGlyZWN0LWFjY2VzcyBpbmRleCAoRGF0YWJyaWNrcyBlbWJlZHMgdGhlIGB0ZXh0YFxuICAgKiBjb2x1bW4gb24gd3JpdGUgYW5kIHF1ZXJ5KSwgc28gc2VlZGluZyBpcyBqdXN0IGFuIGBhZGREb2N1bWVudHNgIG9mIHBsYWluXG4gICAqIHJvd3MgYW5kIHNlYXJjaC1ieS10ZXh0IHdvcmtzIGltbWVkaWF0ZWx5LlxuICAgKi9cbiAgYXN5bmMgcHJvdmlzaW9uKG5hbWU6IHN0cmluZywgb3B0aW9uczogUHJvdmlzaW9uT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxJbmRleEluZm8+IHtcbiAgICBpZiAodGhpcy5sYWtlYmFzZSkge1xuICAgICAgLy8gTGFrZWJhc2UgZmFsbGJhY2s6IG5vIGVuZHBvaW50LCBubyBlbWJlZGRpbmdzLCBubyB2ZWN0b3JzIC0ganVzdCBhXG4gICAgICAvLyBQb3N0Z3JlcyBmdWxsLXRleHQgdGFibGUuIFJldHVybnMgYW4gSW5kZXhJbmZvLXNoYXBlZCByZXN1bHQgc28gdGhlXG4gICAgICAvLyBjYWxsZXIncyBsb2dnaW5nICsgcmVhZGluZXNzIGhhbmRsaW5nIGlzIGlkZW50aWNhbCB0byBWZWN0b3IgU2VhcmNoLlxuICAgICAgY29uc3Qgcm93Q291bnQgPSBhd2FpdCB0aGlzLmxha2ViYXNlLnByb3Zpc2lvbihuYW1lLCB7XG4gICAgICAgIHRleHRDb2x1bW46IG9wdGlvbnMuZW1iZWRkaW5nU291cmNlQ29sdW1uID8/IFwidGV4dFwiLFxuICAgICAgICAuLi4ob3B0aW9ucy5zZWVkID8geyBzZWVkOiBvcHRpb25zLnNlZWQgfSA6IHt9KSxcbiAgICAgICAgLi4uKG9wdGlvbnMuc2lnbmFsID8geyBzaWduYWw6IG9wdGlvbnMuc2lnbmFsIH0gOiB7fSksXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIHByaW1hcnlLZXk6IG9wdGlvbnMucHJpbWFyeUtleSA/PyBcImlkXCIsXG4gICAgICAgIGNvbHVtbnM6IFtdLFxuICAgICAgICByZWFkeTogdHJ1ZSxcbiAgICAgICAgcm93Q291bnQsXG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCB3YWl0ID0gb3B0aW9ucy53YWl0ID8/IHRydWU7XG4gICAgY29uc3QgdGltZW91dE1zID0gb3B0aW9ucy50aW1lb3V0TXMgPz8gMjAgKiA2MCAqIDEwMDA7XG4gICAgY29uc3QgZW5kcG9pbnQgPSBvcHRpb25zLmVuZHBvaW50ID8/IHRoaXMuY29uZmlnLmVuZHBvaW50O1xuICAgIGlmIChlbmRwb2ludCkgYXdhaXQgdGhpcy5lbnN1cmVFbmRwb2ludChlbmRwb2ludCwgeyB3YWl0LCBzaWduYWw6IG9wdGlvbnMuc2lnbmFsIH0pO1xuXG4gICAgY29uc3QgeyBzZWVkOiBfc2VlZCwgd2FpdDogX3dhaXQsIHRpbWVvdXRNczogX3RpbWVvdXRNcywgLi4uY3JlYXRlT3B0aW9ucyB9ID0gb3B0aW9ucztcbiAgICBsZXQgaW5mbyA9IGF3YWl0IHRoaXMuZW5zdXJlSW5kZXgobmFtZSwgY3JlYXRlT3B0aW9ucyk7XG5cbiAgICBpZiAod2FpdCAmJiAhaW5mby5yZWFkeSkgaW5mbyA9IGF3YWl0IHRoaXMud2FpdEZvckluZGV4UmVhZHkobmFtZSwgdGltZW91dE1zLCBvcHRpb25zLnNpZ25hbCk7XG5cbiAgICBjb25zdCBzZWVkID0gb3B0aW9ucy5zZWVkID8/IFtdO1xuICAgIGlmIChzZWVkLmxlbmd0aCA+IDAgJiYgKGluZm8ucm93Q291bnQgPz8gMCkgPT09IDApIHtcbiAgICAgIGNvbnN0IHNvdXJjZUNvbHVtbiA9IG9wdGlvbnMuZW1iZWRkaW5nU291cmNlQ29sdW1uID8/IFwidGV4dFwiO1xuICAgICAgY29uc3QgdmVjdG9yQ29sdW1uID0gb3B0aW9ucy5lbWJlZGRpbmdWZWN0b3JDb2x1bW4gPz8gXCJlbWJlZGRpbmdcIjtcbiAgICAgIC8vIERpcmVjdC1hY2Nlc3MgaW5kZXhlcyBzdG9yZSB2ZWN0b3JzIHdlIHN1cHBseSwgc28gZW1iZWQgdGhlIHRleHQgY29sdW1uXG4gICAgICAvLyBmb3IgYW55IHNlZWQgcm93IHRoYXQgZGlkIG5vdCBhbHJlYWR5IGNhcnJ5IGEgdmVjdG9yLlxuICAgICAgY29uc3QgbmVlZEVtYmVkID0gc2VlZC5zb21lKChkb2MpID0+IGRvY1t2ZWN0b3JDb2x1bW5dID09PSB1bmRlZmluZWQpO1xuICAgICAgbGV0IHJvd3MgPSBzZWVkO1xuICAgICAgaWYgKG5lZWRFbWJlZCkge1xuICAgICAgICBjb25zdCB0ZXh0cyA9IHNlZWQubWFwKChkb2MpID0+IHN0cmluZy50cmltVG9FbXB0eShTdHJpbmcoZG9jW3NvdXJjZUNvbHVtbl0gPz8gXCJcIikpKTtcbiAgICAgICAgY29uc3QgdmVjdG9ycyA9IGF3YWl0IHRoaXMuZW1iZWQodGV4dHMsIG9wdGlvbnMuZW1iZWRkaW5nTW9kZWwsIG9wdGlvbnMuc2lnbmFsKTtcbiAgICAgICAgcm93cyA9IHNlZWQubWFwKChkb2MsIGkpID0+XG4gICAgICAgICAgZG9jW3ZlY3RvckNvbHVtbl0gPT09IHVuZGVmaW5lZCA/IHsgLi4uZG9jLCBbdmVjdG9yQ29sdW1uXTogdmVjdG9yc1tpXSB9IDogZG9jLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgYXdhaXQgdGhpcy5hZGREb2N1bWVudHMobmFtZSwgcm93cywgb3B0aW9ucy5zaWduYWwpO1xuICAgICAgbG9nZ2VyLmluZm8oXCJpbmRleC1zZWVkZWRcIiwgeyBpbmRleDogbmFtZSwgY291bnQ6IHJvd3MubGVuZ3RoIH0pO1xuICAgICAgaW5mbyA9IGF3YWl0IHRoaXMuZ2V0SW5kZXgobmFtZSwgb3B0aW9ucy5zaWduYWwpO1xuICAgIH1cbiAgICByZXR1cm4gaW5mbztcbiAgfVxuXG4gIC8qKiBQb2xsIGFuIGluZGV4IHVudGlsIGl0IHJlcG9ydHMgcmVhZHksIG9yIHRocm93IGFmdGVyIHtAbGluayB0aW1lb3V0TXN9LiAqL1xuICBwcml2YXRlIGFzeW5jIHdhaXRGb3JJbmRleFJlYWR5KFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICB0aW1lb3V0TXM6IG51bWJlcixcbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbiAgKTogUHJvbWlzZTxJbmRleEluZm8+IHtcbiAgICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyB0aW1lb3V0TXM7XG4gICAgbGV0IGluZm8gPSBhd2FpdCB0aGlzLmdldEluZGV4KG5hbWUsIHNpZ25hbCk7XG4gICAgd2hpbGUgKCFpbmZvLnJlYWR5KSB7XG4gICAgICBpZiAoRGF0ZS5ub3coKSA+IGRlYWRsaW5lKSB7XG4gICAgICAgIHRocm93IG5ldyBFeGVjdXRpb25FcnJvcihgc2VhcmNoOiBpbmRleCAke25hbWV9IGRpZCBub3QgY29tZSBvbmxpbmUgaW4gdGltZWAsIHtcbiAgICAgICAgICBjb250ZXh0OiB7IG9wZXJhdGlvbjogXCJwcm92aXNpb25cIiB9LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IGFzeW5jVXRpbC5zbGVlcCg1MDAwLCBzaWduYWwpO1xuICAgICAgaW5mbyA9IGF3YWl0IHRoaXMuZ2V0SW5kZXgobmFtZSwgc2lnbmFsKTtcbiAgICB9XG4gICAgcmV0dXJuIGluZm87XG4gIH1cblxuICAvKiogVHJpZ2dlciBhIHN5bmMgb2YgYSBEZWx0YSBTeW5jIGluZGV4IGZyb20gaXRzIHNvdXJjZSB0YWJsZS4gKi9cbiAgYXN5bmMgc3luY0luZGV4KHJlZmVyZW5jZTogc3RyaW5nLCBzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG5hbWUgPSB0aGlzLnJlcXVpcmVJbmRleE5hbWUocmVmZXJlbmNlLCBcInN5bmNJbmRleFwiKTtcbiAgICBhd2FpdCB0aGlzLndpdGhDbGllbnQoXCJzeW5jSW5kZXhcIiwgc2lnbmFsLCAoY2xpZW50LCBjb250ZXh0KSA9PlxuICAgICAgY2xpZW50LnZlY3RvclNlYXJjaEluZGV4ZXMuc3luY0luZGV4KHsgaW5kZXhfbmFtZTogbmFtZSB9LCBjb250ZXh0KSxcbiAgICApO1xuICAgIGxvZ2dlci5pbmZvKFwiaW5kZXgtc3luY2VkXCIsIHsgaW5kZXg6IG5hbWUgfSk7XG4gIH1cblxuICAvKiogRGVsZXRlIGFuIGluZGV4LiAqL1xuICBhc3luYyBkZWxldGVJbmRleChyZWZlcmVuY2U6IHN0cmluZywgc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBuYW1lID0gdGhpcy5yZXF1aXJlSW5kZXhOYW1lKHJlZmVyZW5jZSwgXCJkZWxldGVJbmRleFwiKTtcbiAgICBhd2FpdCB0aGlzLndpdGhDbGllbnQoXCJkZWxldGVJbmRleFwiLCBzaWduYWwsIChjbGllbnQsIGNvbnRleHQpID0+XG4gICAgICBjbGllbnQudmVjdG9yU2VhcmNoSW5kZXhlcy5kZWxldGVJbmRleCh7IGluZGV4X25hbWU6IG5hbWUgfSwgY29udGV4dCksXG4gICAgKTtcbiAgICBsb2dnZXIuaW5mbyhcImluZGV4LWRlbGV0ZWRcIiwgeyBpbmRleDogbmFtZSB9KTtcbiAgfVxuXG4gIC8qKiBMaXN0IHRoZSBpbmRleGVzIGhvc3RlZCBvbiBhIFZlY3RvciBTZWFyY2ggZW5kcG9pbnQgKG5hbWUgKyB0eXBlIG9ubHkpLiAqL1xuICBhc3luYyBsaXN0SW5kZXhlcyhlbmRwb2ludD86IHN0cmluZywgc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgY29uc3QgZW5kcG9pbnROYW1lID0gZW5kcG9pbnQgPz8gdGhpcy5jb25maWcuZW5kcG9pbnQ7XG4gICAgaWYgKCFlbmRwb2ludE5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFeGVjdXRpb25FcnJvcihcInNlYXJjaDogbm8gZW5kcG9pbnQgY29uZmlndXJlZCB0byBsaXN0IGluZGV4ZXNcIiwge1xuICAgICAgICBjb250ZXh0OiB7IG9wZXJhdGlvbjogXCJsaXN0SW5kZXhlc1wiIH0sXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMud2l0aENsaWVudChcImxpc3RJbmRleGVzXCIsIHNpZ25hbCwgYXN5bmMgKGNsaWVudCwgY29udGV4dCkgPT4ge1xuICAgICAgY29uc3QgbmFtZXM6IHN0cmluZ1tdID0gW107XG4gICAgICBmb3IgYXdhaXQgKGNvbnN0IGluZGV4IG9mIGNsaWVudC52ZWN0b3JTZWFyY2hJbmRleGVzLmxpc3RJbmRleGVzKFxuICAgICAgICB7IGVuZHBvaW50X25hbWU6IGVuZHBvaW50TmFtZSB9LFxuICAgICAgICBjb250ZXh0LFxuICAgICAgKSkge1xuICAgICAgICBpZiAoaW5kZXgubmFtZSkgbmFtZXMucHVzaChpbmRleC5uYW1lKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuYW1lcztcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnN1cmUgYSBWZWN0b3IgU2VhcmNoIGVuZHBvaW50IGV4aXN0cywgY3JlYXRpbmcgYSBgU1RBTkRBUkRgIG9uZSB3aGVuIGl0XG4gICAqIGRvZXMgbm90LiBPcHRpb25hbGx5IHdhaXQgZm9yIGl0IHRvIGNvbWUgb25saW5lLiBJZGVtcG90ZW50LlxuICAgKi9cbiAgYXN5bmMgZW5zdXJlRW5kcG9pbnQobmFtZT86IHN0cmluZywgb3B0aW9uczogRW5zdXJlRW5kcG9pbnRPcHRpb25zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBlbmRwb2ludCA9IG5hbWUgPz8gdGhpcy5jb25maWcuZW5kcG9pbnQ7XG4gICAgaWYgKCFlbmRwb2ludCkge1xuICAgICAgdGhyb3cgbmV3IEV4ZWN1dGlvbkVycm9yKFwic2VhcmNoOiBubyBlbmRwb2ludCBuYW1lIHRvIGVuc3VyZVwiLCB7XG4gICAgICAgIGNvbnRleHQ6IHsgb3BlcmF0aW9uOiBcImVuc3VyZUVuZHBvaW50XCIgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLndpdGhDbGllbnQoXCJlbnN1cmVFbmRwb2ludFwiLCBvcHRpb25zLnNpZ25hbCwgYXN5bmMgKGNsaWVudCwgY29udGV4dCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgY2xpZW50LnZlY3RvclNlYXJjaEVuZHBvaW50cy5nZXRFbmRwb2ludCh7IGVuZHBvaW50X25hbWU6IGVuZHBvaW50IH0sIGNvbnRleHQpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgY29uc3Qgd2FpdGVyID0gYXdhaXQgY2xpZW50LnZlY3RvclNlYXJjaEVuZHBvaW50cy5jcmVhdGVFbmRwb2ludChcbiAgICAgICAgICB7IG5hbWU6IGVuZHBvaW50LCBlbmRwb2ludF90eXBlOiBcIlNUQU5EQVJEXCIgfSxcbiAgICAgICAgICBjb250ZXh0LFxuICAgICAgICApO1xuICAgICAgICBsb2dnZXIuaW5mbyhcImVuZHBvaW50LWNyZWF0ZWRcIiwgeyBlbmRwb2ludCB9KTtcbiAgICAgICAgaWYgKG9wdGlvbnMud2FpdCkgYXdhaXQgd2FpdGVyLndhaXQoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlIHRoZSB3b3Jrc3BhY2UgY2xpZW50IGFuZCBydW4gb25lIGNhbGwgdW5kZXIgYSBib3VuZGVkIHRpbWVvdXQuIFRoZVxuICAgKiBjYWxsZXIncyBzaWduYWwgKGlmIGFueSkgYW5kIGEgdGltZW91dCBhcmUgbWVyZ2VkIGludG8gb25lIFNESyBgQ29udGV4dGBcbiAgICogdmlhIHtAbGluayBhcHBraXQuZGF0YWJyaWNrcy50b0NvbnRleHR9LCBzbyBlaXRoZXIgdW53aW5kcyB0aGUgcmVxdWVzdC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgd2l0aENsaWVudDxUPihcbiAgICBvcGVyYXRpb246IHN0cmluZyxcbiAgICBzaWduYWw6IEFib3J0U2lnbmFsIHwgdW5kZWZpbmVkLFxuICAgIGZuOiAoY2xpZW50OiBXb3Jrc3BhY2VDbGllbnRMaWtlLCBjb250ZXh0PzogQ29udGV4dCkgPT4gUHJvbWlzZTxUPixcbiAgKTogUHJvbWlzZTxUPiB7XG4gICAgY29uc3QgY2xpZW50ID0gdGhpcy53b3Jrc3BhY2VDbGllbnRGYWN0b3J5KCk7XG4gICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICBjb25zdCB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4gY29udHJvbGxlci5hYm9ydCgpLCB0aGlzLmNvbmZpZy50aW1lb3V0TXMpO1xuICAgIGNvbnN0IGNvbnRleHQgPSBkYXRhYnJpY2tzLnRvQ29udGV4dChjb250cm9sbGVyLCBzaWduYWwpO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgZm4oY2xpZW50LCBjb250ZXh0KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmIChzaWduYWw/LmFib3J0ZWQpIHRocm93IEV4ZWN1dGlvbkVycm9yLmNhbmNlbGVkKCk7XG4gICAgICBsb2dnZXIud2FybihcImV4ZWN1dGlvbi1mYWlsZWRcIiwgeyBvcGVyYXRpb24gfSk7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgfVxuICB9XG59XG5cbi8qKiBUaGUgT0JPIHdvcmtzcGFjZSBjbGllbnQgZnJvbSB0aGUgYWN0aXZlIGNvbnRleHQsIG9yIGEgc2VydmljZS1wcmluY2lwYWwgY2xpZW50LiAqL1xuZnVuY3Rpb24gZGVmYXVsdFdvcmtzcGFjZUNsaWVudCgpOiBXb3Jrc3BhY2VDbGllbnRMaWtlIHtcbiAgY29uc3QgY3R4ID0gYXBwa2l0LnRyeUdldEV4ZWN1dGlvbkNvbnRleHQoKTtcbiAgaWYgKGN0eD8uY2xpZW50KSByZXR1cm4gY3R4LmNsaWVudDtcbiAgLy8gT3V0c2lkZSBhIHJlcXVlc3Qgc2NvcGUgKGEgc2NyaXB0LCBhIHRlc3QpOiBhIGZyZXNoIGVudi1hdXRoIGNsaWVudC5cbiAgcmV0dXJuIGdldEV4ZWN1dGlvbkNvbnRleHQoKS5jbGllbnQ7XG59XG5cbi8qKiBDb25zdHJ1Y3QgYSB7QGxpbmsgU2VhcmNoQ2xpZW50fSBmcm9tIGEgcmVzb2x2ZWQgY29uZmlnLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNlYXJjaENsaWVudChcbiAgY29uZmlnPzogUmVzb2x2ZWRTZWFyY2hDb25maWcsXG4gIHdvcmtzcGFjZUNsaWVudEZhY3Rvcnk/OiAoKSA9PiBXb3Jrc3BhY2VDbGllbnRMaWtlLFxuICBsYWtlYmFzZT86IExha2ViYXNlU2VhcmNoQmFja2VuZCxcbik6IFNlYXJjaENsaWVudCB7XG4gIHJldHVybiBuZXcgU2VhcmNoQ2xpZW50KGNvbmZpZywgd29ya3NwYWNlQ2xpZW50RmFjdG9yeSwgbGFrZWJhc2UpO1xufVxuIl19
|