ember-scoped-css 1.1.0 → 2.0.0
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 +203 -47
- package/dist/cjs/all-Du43cBa9.cjs +1308 -0
- package/dist/cjs/all.cjs +3 -0
- package/dist/cjs/babel.cjs +9 -0
- package/dist/cjs/rollup.cjs +8 -0
- package/dist/cjs/vite.cjs +8 -0
- package/dist/runtime/index.d.ts +11 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +12 -8
- package/dist/runtime/index.js.map +1 -7
- package/{declarations → dist}/runtime/test-support.d.ts +5 -2
- package/dist/runtime/test-support.d.ts.map +1 -0
- package/dist/runtime/test-support.js +357 -182
- package/dist/runtime/test-support.js.map +1 -7
- package/package.json +21 -24
- package/src/build/babel-plugin.js +4 -1
- package/src/build/public-exports/all.js +10 -0
- package/src/build/public-exports/babel.js +5 -0
- package/src/build/public-exports/rollup.js +3 -0
- package/src/build/public-exports/vite.js +3 -0
- package/src/build/scoped-css-unplugin.js +10 -33
- package/src/build/template-plugin.js +9 -19
- package/src/build/template-plugin.test.ts +108 -19
- package/src/build/unplugin-colocated.js +103 -0
- package/src/build/unplugin-inline.js +71 -0
- package/src/lib/css/rewrite.js +8 -8
- package/src/lib/css/rewrite.test.ts +69 -128
- package/src/lib/path/const.js +19 -0
- package/src/lib/path/hash-from-absolute-path.js +3 -2
- package/src/lib/path/template-transform-paths.js +3 -2
- package/src/lib/path/utils.appPath.test.ts +2 -2
- package/src/lib/path/utils.hashFrom.test.ts +2 -2
- package/src/lib/path/utils.js +63 -20
- package/src/lib/request.js +58 -33
- package/src/runtime/index.ts +1 -1
- package/declarations/build/template-plugin.d.ts +0 -7
- package/declarations/build/template-plugin.d.ts.map +0 -1
- package/declarations/build/template-plugin.test.d.ts +0 -2
- package/declarations/build/template-plugin.test.d.ts.map +0 -1
- package/declarations/lib/css/rewrite.d.ts +0 -2
- package/declarations/lib/css/rewrite.d.ts.map +0 -1
- package/declarations/lib/css/rewrite.test.d.ts +0 -2
- package/declarations/lib/css/rewrite.test.d.ts.map +0 -1
- package/declarations/lib/css/utils.d.ts +0 -29
- package/declarations/lib/css/utils.d.ts.map +0 -1
- package/declarations/lib/path/hash-from-absolute-path.d.ts +0 -3
- package/declarations/lib/path/hash-from-absolute-path.d.ts.map +0 -1
- package/declarations/lib/path/hash-from-absolute-path.test.d.ts +0 -2
- package/declarations/lib/path/hash-from-absolute-path.test.d.ts.map +0 -1
- package/declarations/lib/path/hash-from-module-path.d.ts +0 -31
- package/declarations/lib/path/hash-from-module-path.d.ts.map +0 -1
- package/declarations/lib/path/md5.d.ts +0 -12
- package/declarations/lib/path/md5.d.ts.map +0 -1
- package/declarations/lib/path/template-transform-paths.d.ts +0 -11
- package/declarations/lib/path/template-transform-paths.d.ts.map +0 -1
- package/declarations/lib/path/template-transform-paths.test.d.ts +0 -2
- package/declarations/lib/path/template-transform-paths.test.d.ts.map +0 -1
- package/declarations/lib/path/utils.appPath.test.d.ts +0 -2
- package/declarations/lib/path/utils.appPath.test.d.ts.map +0 -1
- package/declarations/lib/path/utils.d.ts +0 -94
- package/declarations/lib/path/utils.d.ts.map +0 -1
- package/declarations/lib/path/utils.findWorkspacePath.test.d.ts +0 -2
- package/declarations/lib/path/utils.findWorkspacePath.test.d.ts.map +0 -1
- package/declarations/lib/path/utils.hashFrom.test.d.ts +0 -2
- package/declarations/lib/path/utils.hashFrom.test.d.ts.map +0 -1
- package/declarations/lib/path/utils.isRelevantFile.test.d.ts +0 -2
- package/declarations/lib/path/utils.isRelevantFile.test.d.ts.map +0 -1
- package/declarations/lib/path/utils.paths.test.d.ts +0 -5
- package/declarations/lib/path/utils.paths.test.d.ts.map +0 -1
- package/declarations/lib/renameClass.d.ts +0 -9
- package/declarations/lib/renameClass.d.ts.map +0 -1
- package/declarations/lib/request.d.ts +0 -8
- package/declarations/lib/request.d.ts.map +0 -1
- package/declarations/lib/rewriteHbs.d.ts +0 -17
- package/declarations/lib/rewriteHbs.d.ts.map +0 -1
- package/declarations/runtime/index.d.ts +0 -8
- package/declarations/runtime/index.d.ts.map +0 -1
- package/declarations/runtime/test-support.d.ts.map +0 -1
- package/dist/cjs/babel-plugin.cjs +0 -176
- package/dist/cjs/index.cjs +0 -968
- package/dist/cjs/template-plugin.cjs +0 -856
- package/src/build/index.js +0 -7
- package/src/build/vite.js +0 -3
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Appends a suffix to a class name during build time.
|
|
3
|
-
* This function is not available at runtime and is removed.
|
|
4
|
-
*
|
|
5
|
-
* @param {string} className the class, defined within the co-located CSS to have a suffix appended to it during build time.
|
|
6
|
-
*/
|
|
7
|
-
export declare function scopedClass(className: string): string;
|
|
8
|
-
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAIrD"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"test-support.d.ts","sourceRoot":"","sources":["../../src/runtime/test-support.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAAC;AAExD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAAC"}
|
|
@@ -1,176 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __create = Object.create;
|
|
3
|
-
var __defProp = Object.defineProperty;
|
|
4
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
-
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
-
var __export = (target, all) => {
|
|
9
|
-
for (var name in all)
|
|
10
|
-
__defProp(target, name, { get: all[name], enumerable: true });
|
|
11
|
-
};
|
|
12
|
-
var __copyProps = (to, from, except, desc) => {
|
|
13
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
-
for (let key of __getOwnPropNames(from))
|
|
15
|
-
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
16
|
-
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
17
|
-
}
|
|
18
|
-
return to;
|
|
19
|
-
};
|
|
20
|
-
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
-
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
-
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
-
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
-
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
-
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
-
mod
|
|
27
|
-
));
|
|
28
|
-
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
-
|
|
30
|
-
// src/build/babel-plugin.js
|
|
31
|
-
var babel_plugin_exports = {};
|
|
32
|
-
__export(babel_plugin_exports, {
|
|
33
|
-
default: () => babel_plugin_default
|
|
34
|
-
});
|
|
35
|
-
module.exports = __toCommonJS(babel_plugin_exports);
|
|
36
|
-
|
|
37
|
-
// src/lib/path/utils.js
|
|
38
|
-
var import_node_assert = __toESM(require("node:assert"), 1);
|
|
39
|
-
var import_node_fs = __toESM(require("node:fs"), 1);
|
|
40
|
-
var import_node_module = require("node:module");
|
|
41
|
-
var import_node_path = __toESM(require("node:path"), 1);
|
|
42
|
-
var import_meta = {};
|
|
43
|
-
var here = import_meta.url;
|
|
44
|
-
var ourRequire = globalThis.require ? globalThis.require : here && (0, import_node_module.createRequire)(here);
|
|
45
|
-
if (!ourRequire) {
|
|
46
|
-
ourRequire = require;
|
|
47
|
-
}
|
|
48
|
-
var IRRELEVANT_PATHS = ["node_modules/.pnpm", "__vite-"];
|
|
49
|
-
var UNSUPPORTED_DIRECTORIES = /* @__PURE__ */ new Set(["tests"]);
|
|
50
|
-
var CWD = process.cwd();
|
|
51
|
-
function isRelevantFile(fileName, { additionalRoots, cwd }) {
|
|
52
|
-
if (fileName.startsWith("/testem")) return false;
|
|
53
|
-
if (fileName.startsWith("\0")) return false;
|
|
54
|
-
if (fileName.match(/^[a-zA-Z]/)) return false;
|
|
55
|
-
if (fileName.startsWith("/@embroider")) return false;
|
|
56
|
-
if (IRRELEVANT_PATHS.some((i) => fileName.includes(i))) return false;
|
|
57
|
-
let workspace = findWorkspacePath(fileName);
|
|
58
|
-
(0, import_node_assert.default)(cwd, `cwd was not passed to isRelevantFile`);
|
|
59
|
-
let ourWorkspace = findWorkspacePath(cwd);
|
|
60
|
-
if (workspace !== ourWorkspace) {
|
|
61
|
-
return false;
|
|
62
|
-
}
|
|
63
|
-
let local = fileName.replace(workspace, "");
|
|
64
|
-
let [, ...parts] = local.split("/").filter(Boolean);
|
|
65
|
-
if (UNSUPPORTED_DIRECTORIES.has(parts[0])) {
|
|
66
|
-
return false;
|
|
67
|
-
}
|
|
68
|
-
let roots = ["/components/", "/templates/", ...additionalRoots || []];
|
|
69
|
-
if (!roots.some((root) => fileName.includes(root))) {
|
|
70
|
-
return;
|
|
71
|
-
}
|
|
72
|
-
return true;
|
|
73
|
-
}
|
|
74
|
-
var SEEN = /* @__PURE__ */ new Set();
|
|
75
|
-
function getSeen(sourcePath) {
|
|
76
|
-
if (SEEN.has(sourcePath)) return sourcePath;
|
|
77
|
-
let parts = sourcePath.split("/");
|
|
78
|
-
for (let i = parts.length - 1; i > 1; i--) {
|
|
79
|
-
let toCheck = parts.slice(0, i).join("/");
|
|
80
|
-
let seen = SEEN.has(toCheck);
|
|
81
|
-
if (seen) {
|
|
82
|
-
return toCheck;
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
function findWorkspacePath(sourcePath, options) {
|
|
87
|
-
let cwd = options?.cwd ?? CWD;
|
|
88
|
-
if (sourcePath.endsWith("/")) {
|
|
89
|
-
sourcePath = sourcePath.replace(/\/$/, "");
|
|
90
|
-
}
|
|
91
|
-
let seen = getSeen(sourcePath);
|
|
92
|
-
if (seen) {
|
|
93
|
-
return seen;
|
|
94
|
-
}
|
|
95
|
-
let candidatePath = import_node_path.default.join(sourcePath, "package.json");
|
|
96
|
-
const isWorkspace = import_node_fs.default.existsSync(candidatePath);
|
|
97
|
-
if (isWorkspace) {
|
|
98
|
-
return sourcePath;
|
|
99
|
-
}
|
|
100
|
-
const packageJsonPath = findPackageJsonUp(sourcePath, { cwd });
|
|
101
|
-
if (!packageJsonPath) {
|
|
102
|
-
throw new Error(`Could not determine project for ${sourcePath}`);
|
|
103
|
-
}
|
|
104
|
-
const workspacePath = import_node_path.default.dirname(packageJsonPath);
|
|
105
|
-
SEEN.add(workspacePath);
|
|
106
|
-
return workspacePath;
|
|
107
|
-
}
|
|
108
|
-
function findPackageJsonUp(startPath, options) {
|
|
109
|
-
let cwd = options?.cwd ?? CWD;
|
|
110
|
-
let parts = startPath.split("/");
|
|
111
|
-
for (let i = parts.length - 1; i > 1; i--) {
|
|
112
|
-
let toCheck = parts.slice(0, i).join("/");
|
|
113
|
-
let packageJson = import_node_path.default.join(toCheck, "package.json");
|
|
114
|
-
let exists = import_node_fs.default.existsSync(packageJson);
|
|
115
|
-
if (exists) {
|
|
116
|
-
return packageJson;
|
|
117
|
-
}
|
|
118
|
-
if (toCheck === cwd) {
|
|
119
|
-
break;
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
return null;
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
// src/build/babel-plugin.js
|
|
126
|
-
function _isRelevantFile(state, cwd) {
|
|
127
|
-
let fileName = state.file.opts.filename;
|
|
128
|
-
let additionalRoots = state.opts?.additionalRoots;
|
|
129
|
-
return isRelevantFile(fileName, {
|
|
130
|
-
additionalRoots,
|
|
131
|
-
cwd
|
|
132
|
-
});
|
|
133
|
-
}
|
|
134
|
-
var babel_plugin_default = (env, options, workingDirectory) => {
|
|
135
|
-
return {
|
|
136
|
-
visitor: {
|
|
137
|
-
Program: {
|
|
138
|
-
enter(path2, state) {
|
|
139
|
-
if (!_isRelevantFile(state, workingDirectory)) {
|
|
140
|
-
state.canSkip = true;
|
|
141
|
-
return;
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
},
|
|
145
|
-
ImportDeclaration(path2, state) {
|
|
146
|
-
if (state.canSkip) {
|
|
147
|
-
return;
|
|
148
|
-
}
|
|
149
|
-
if (path2.node.source.value === "ember-scoped-css") {
|
|
150
|
-
let specifier = path2.node.specifiers.find(
|
|
151
|
-
(x) => x.imported.name === "scopedClass"
|
|
152
|
-
);
|
|
153
|
-
if (specifier) {
|
|
154
|
-
state.file.opts.importedScopedClass = specifier.local.name;
|
|
155
|
-
}
|
|
156
|
-
if (specifier.local.name !== "scopedClass") {
|
|
157
|
-
throw new Error(
|
|
158
|
-
`The scopedClass import is a psuedo-helper, and may not be renamed as it is removed at build time.`
|
|
159
|
-
);
|
|
160
|
-
}
|
|
161
|
-
path2.remove();
|
|
162
|
-
}
|
|
163
|
-
},
|
|
164
|
-
/**
|
|
165
|
-
* Only in strict mode, do we care about remoning the scope bag reference
|
|
166
|
-
*/
|
|
167
|
-
ObjectProperty(path2, state) {
|
|
168
|
-
if (!state.file.opts?.importedScopedClass) return;
|
|
169
|
-
if (path2.node.value.type === "Identifier" && path2.node.value.name === state.file.opts?.importedScopedClass) {
|
|
170
|
-
path2.remove();
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
};
|
|
175
|
-
};
|
|
176
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2J1aWxkL2JhYmVsLXBsdWdpbi5qcyIsICIuLi8uLi9zcmMvbGliL3BhdGgvdXRpbHMuanMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7IGlzUmVsZXZhbnRGaWxlIH0gZnJvbSAnLi4vbGliL3BhdGgvdXRpbHMuanMnO1xuXG5mdW5jdGlvbiBfaXNSZWxldmFudEZpbGUoc3RhdGUsIGN3ZCkge1xuICBsZXQgZmlsZU5hbWUgPSBzdGF0ZS5maWxlLm9wdHMuZmlsZW5hbWU7XG4gIGxldCBhZGRpdGlvbmFsUm9vdHMgPSBzdGF0ZS5vcHRzPy5hZGRpdGlvbmFsUm9vdHM7XG5cbiAgcmV0dXJuIGlzUmVsZXZhbnRGaWxlKGZpbGVOYW1lLCB7XG4gICAgYWRkaXRpb25hbFJvb3RzLFxuICAgIGN3ZCxcbiAgfSk7XG59XG5cbi8qKlxuICogQHBhcmFtIHthbnl9IGVudiAtIGJhYmVsIHBsdWdpbiBlbnYsIGVudi50eXBlcyBpcyBtb3N0IGNvbW1vbmx5IHVzZWQgKGVzcCBpbiBUUylcbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIC0gdGhlIG9wdGlvbnMgZm9yIHNjb3BlZC1jc3MgLS0gdGhpcyBpcyBhbHNvIGF2YWlsYWJsZSBpbiBlYWNoIHZpc2l0b3IncyBzdGF0ZS5vcHRzXG4gKiBAcGFyYW0ge3N0cmluZ30gd29ya2luZ0RpcmVjdG9yeVxuICovXG5leHBvcnQgZGVmYXVsdCAoZW52LCBvcHRpb25zLCB3b3JraW5nRGlyZWN0b3J5KSA9PiB7XG4gIC8qKlxuICAgKiBUaGlzIGJhYmVsIHBsdWdpbiBkb2VzIHR3byB0aGluZ3M6XG4gICAqIC0gcmVtb3ZlcyB0aGUgaW1wb3J0IG9mIHNjb3BlZENsYXNzLCBpZiBpdCBleGlzdHNcbiAgICogICAtIGlmIHNjb3BlZENsYXNzIHdhcyBpbXBvcnRlZCwgaXQgaXMgcmVtb3ZlZCBmcm9tIGFueSBjb21wb25lbnQncyBcInNjb3BlIGJhZ1wiXG4gICAqICAgICAodGhlIHNjb3BlIGJhZyBiZWluZyBhIGxvdy1sZXZlbCBvYmplY3QgdXNlZCBmb3IgcGFzc2luZyB3aGF0IGlzIFwiaW4gc2NvcGVcIiBmb3IgYSBjb21wb25lbnQpXG4gICAqL1xuICByZXR1cm4ge1xuICAgIHZpc2l0b3I6IHtcbiAgICAgIFByb2dyYW06IHtcbiAgICAgICAgZW50ZXIocGF0aCwgc3RhdGUpIHtcbiAgICAgICAgICBpZiAoIV9pc1JlbGV2YW50RmlsZShzdGF0ZSwgd29ya2luZ0RpcmVjdG9yeSkpIHtcbiAgICAgICAgICAgIHN0YXRlLmNhblNraXAgPSB0cnVlO1xuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIEltcG9ydERlY2xhcmF0aW9uKHBhdGgsIHN0YXRlKSB7XG4gICAgICAgIGlmIChzdGF0ZS5jYW5Ta2lwKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhdGgubm9kZS5zb3VyY2UudmFsdWUgPT09ICdlbWJlci1zY29wZWQtY3NzJykge1xuICAgICAgICAgIGxldCBzcGVjaWZpZXIgPSBwYXRoLm5vZGUuc3BlY2lmaWVycy5maW5kKFxuICAgICAgICAgICAgKHgpID0+IHguaW1wb3J0ZWQubmFtZSA9PT0gJ3Njb3BlZENsYXNzJyxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKHNwZWNpZmllcikge1xuICAgICAgICAgICAgc3RhdGUuZmlsZS5vcHRzLmltcG9ydGVkU2NvcGVkQ2xhc3MgPSBzcGVjaWZpZXIubG9jYWwubmFtZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoc3BlY2lmaWVyLmxvY2FsLm5hbWUgIT09ICdzY29wZWRDbGFzcycpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgYFRoZSBzY29wZWRDbGFzcyBpbXBvcnQgaXMgYSBwc3VlZG8taGVscGVyLCBhbmQgbWF5IG5vdCBiZSByZW5hbWVkIGFzIGl0IGlzIHJlbW92ZWQgYXQgYnVpbGQgdGltZS5gLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBwYXRoLnJlbW92ZSgpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgLyoqXG4gICAgICAgKiBPbmx5IGluIHN0cmljdCBtb2RlLCBkbyB3ZSBjYXJlIGFib3V0IHJlbW9uaW5nIHRoZSBzY29wZSBiYWcgcmVmZXJlbmNlXG4gICAgICAgKi9cbiAgICAgIE9iamVjdFByb3BlcnR5KHBhdGgsIHN0YXRlKSB7XG4gICAgICAgIGlmICghc3RhdGUuZmlsZS5vcHRzPy5pbXBvcnRlZFNjb3BlZENsYXNzKSByZXR1cm47XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIHBhdGgubm9kZS52YWx1ZS50eXBlID09PSAnSWRlbnRpZmllcicgJiZcbiAgICAgICAgICBwYXRoLm5vZGUudmFsdWUubmFtZSA9PT0gc3RhdGUuZmlsZS5vcHRzPy5pbXBvcnRlZFNjb3BlZENsYXNzXG4gICAgICAgICkge1xuICAgICAgICAgIHBhdGgucmVtb3ZlKCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSxcbiAgfTtcbn07XG4iLCAiaW1wb3J0IGFzc2VydCBmcm9tICdub2RlOmFzc2VydCc7XG5pbXBvcnQgZnNTeW5jLCB7IGV4aXN0c1N5bmMgfSBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7IGNyZWF0ZVJlcXVpcmUgfSBmcm9tICdub2RlOm1vZHVsZSc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBoYXNoRnJvbUFic29sdXRlUGF0aCB9IGZyb20gJy4vaGFzaC1mcm9tLWFic29sdXRlLXBhdGguanMnO1xuaW1wb3J0IHsgaGFzaEZyb21Nb2R1bGVQYXRoIH0gZnJvbSAnLi9oYXNoLWZyb20tbW9kdWxlLXBhdGguanMnO1xuXG5leHBvcnQgeyBoYXNoRnJvbUFic29sdXRlUGF0aCB9IGZyb20gJy4vaGFzaC1mcm9tLWFic29sdXRlLXBhdGguanMnO1xuZXhwb3J0IHsgaGFzaEZyb21Nb2R1bGVQYXRoIH0gZnJvbSAnLi9oYXNoLWZyb20tbW9kdWxlLXBhdGguanMnO1xuXG5jb25zdCBDT01QT05FTlRfRVhURU5TSU9OUyA9IFsnLmd0cycsICcuZ2pzJywgJy50cycsICcuanMnLCAnLmhicyddO1xuXG4vLyBDSlMgLyBFU00/XG5sZXQgaGVyZSA9IGltcG9ydC5tZXRhLnVybDtcbmxldCBvdXJSZXF1aXJlID0gZ2xvYmFsVGhpcy5yZXF1aXJlXG4gID8gZ2xvYmFsVGhpcy5yZXF1aXJlXG4gIDogaGVyZSAmJiBjcmVhdGVSZXF1aXJlKGhlcmUpO1xuXG5pZiAoIW91clJlcXVpcmUpIHtcbiAgb3VyUmVxdWlyZSA9IHJlcXVpcmU7XG59XG5cbmNvbnN0IElSUkVMRVZBTlRfUEFUSFMgPSBbJ25vZGVfbW9kdWxlcy8ucG5wbScsICdfX3ZpdGUtJ107XG5jb25zdCBVTlNVUFBPUlRFRF9ESVJFQ1RPUklFUyA9IG5ldyBTZXQoWyd0ZXN0cyddKTtcblxuY29uc3QgQ1dEID0gcHJvY2Vzcy5jd2QoKTtcblxuLyoqXG4gKiBSZWdhcmRsZXNzIG9mIHdoYXQgdGhlIGZpbGVQYXRoIGZvcm1hdCBpcyxcbiAqIHRoaXMgd2lsbCB0cnkgdG8gcmV0dXJuIHRoZSBjb3JyZWN0IHBvc3RmaXguXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGZpbGVQYXRoXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzaEZyb20oZmlsZVBhdGgpIHtcbiAgaWYgKGZpbGVQYXRoLnN0YXJ0c1dpdGgoJy8nKSkge1xuICAgIHJldHVybiBoYXNoRnJvbUFic29sdXRlUGF0aChmaWxlUGF0aCk7XG4gIH1cblxuICByZXR1cm4gaGFzaEZyb21Nb2R1bGVQYXRoKGZpbGVQYXRoKTtcbn1cblxuLyoqXG4gKlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3NzSGFzQXNzb2NpYXRlZENvbXBvbmVudChjc3NQYXRoKSB7XG4gIHJldHVybiBjc3NIYXNTdGFuZGFyZEZpbGUoY3NzUGF0aCkgfHwgY3NzSGFzUG9kc0ZpbGUoY3NzUGF0aCk7XG59XG5cbmZ1bmN0aW9uIGNzc0hhc1N0YW5kYXJkRmlsZShpZCkge1xuICAvKipcbiAgICogTm9ybWFsbHkgd2UgZG9uJ3QgbmVlZCB0byBjaGVjayBhIEpTIHBhdGggaGVyZSwgYnV0IHdoZW4gdXNpbmdcbiAgICogZW1icm9pZGVyQDMsIHdlIGhhdmUgYSBcInJld3JpdHRlbiBhcHBcIiwgd2hpY2ggaGFzIGFsbCBvdXIgc291cmNlXG4gICAqIHByZXByb2Nlc3NlZCBhIGJpdCBiZWZvcmUgc2NvcGVkLWNzcyB0cmFuc2Zvcm1hdGlvbnMuXG4gICAqXG4gICAqIChJbiBWaXRlLCB3ZSBvcGVyYXRlIG1vcmUgZGlyZWN0bHkgd2l0aCB0aGUgc291cmNlKVxuICAgKi9cbiAgZm9yIChsZXQgZXh0IG9mIENPTVBPTkVOVF9FWFRFTlNJT05TKSB7XG4gICAgbGV0IGNhbmRpZGF0ZVBhdGggPSBpZC5yZXBsYWNlKC9cXC5jc3MkLywgZXh0KTtcblxuICAgIGlmIChleGlzdHNTeW5jKGNhbmRpZGF0ZVBhdGgpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGNzc0hhc1BvZHNGaWxlKGlkKSB7XG4gIGlmICghaWQuZW5kc1dpdGgoJ3N0eWxlcy5jc3MnKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBOb3JtYWxseSB3ZSBkb24ndCBuZWVkIHRvIGNoZWNrIGEgSlMgcGF0aCBoZXJlLCBidXQgd2hlbiB1c2luZ1xuICAgKiBlbWJyb2lkZXJAMywgd2UgaGF2ZSBhIFwicmV3cml0dGVuIGFwcFwiLCB3aGljaCBoYXMgYWxsIG91ciBzb3VyY2VcbiAgICogcHJlcHJvY2Vzc2VkIGEgYml0IGJlZm9yZSBzY29wZWQtY3NzIHRyYW5zZm9ybWF0aW9ucy5cbiAgICpcbiAgICogKEluIFZpdGUsIHdlIG9wZXJhdGUgbW9yZSBkaXJlY3RseSB3aXRoIHRoZSBzb3VyY2UpXG4gICAqL1xuICBmb3IgKGxldCBleHQgb2YgQ09NUE9ORU5UX0VYVEVOU0lPTlMpIHtcbiAgICBsZXQgY2FuZGlkYXRlUGF0aCA9IGlkLnJlcGxhY2UoL3N0eWxlc1xcLmNzcyQvLCBgdGVtcGxhdGUke2V4dH1gKTtcblxuICAgIGlmIChleGlzdHNTeW5jKGNhbmRpZGF0ZVBhdGgpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogQmFzZWQgb24gZW1iZXIncyBjb21wb25lbnQgbG9jYXRpb24gY29udmVudGlvbnMsXG4gKiB0aGlzIGZ1bmN0aW9uIHdpbGwgcHJvdmlkZSBhIHBhdGggZm9yIHdoZXJlIHdlXG4gKiBleHBlY3QgdGhlIENTUyB0byBsaXZlLlxuICpcbiAqIEZvciBjby1sb2NhdGVkIHN0cnVjdHVyZTpcbiAqICAgLSBjb21wb25lbnRzL215LWNvbXBvbmVudC5oYnNcbiAqICAgLSBjb21wb25lbnRzL215LWNvbXBvbmVudC5jc3NcbiAqXG4gKiBGb3IgbmVzdGVkIGNvLWxvY2F0ZWQgc3RydWN0dXJlXG4gKiAgIC0gY29tcG9uZW50cy9teS1jb21wb25lbnQvZm9vLmhic1xuICogICAtIGNvbXBvbmVudHMvbXktY29tcG9uZW50L2Zvby5jc3NcbiAqXG4gKiBGb3IgUG9kcyByb3V0ZXMgc3RydWN0dXJlXG4gKiAgIC0gcm91dGVzL215LXJvdXRlL3RlbXBsYXRlLntoYnMsanN9XG4gKiAgIC0gcm91dGVzL215LXJvdXRlL3N0eWxlcy5jc3NcbiAqXG4gKiBEZWxpYmVyYXRlbHkgbm90IHN1cHBvcnRlZDpcbiAqICAgLSBjb21wb25lbnRzIHcvIHBvZHMgLS0gdGhpcyBpcyBkZXByZWNhdGVkIGluIDUuMTBcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZU5hbWUgLSB0aGUgaGJzLCBqcywgZ2pzLCBndHMgb3Igd2hhdGV2ZXIgY28tbG9jYXRlZCBwYXRoLlxuICogQHJldHVybnMge3N0cmluZ30gLSBleHBlY3RlZCBjc3MgcGF0aFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3NzUGF0aEZvcihmaWxlTmFtZSkge1xuICBsZXQgd2l0aG91dEV4dCA9IHdpdGhvdXRFeHRlbnNpb24oZmlsZU5hbWUpO1xuICBsZXQgY3NzUGF0aCA9IHdpdGhvdXRFeHQgKyAnLmNzcyc7XG5cbiAgaWYgKGlzUG9kKGZpbGVOYW1lKSkge1xuICAgIGNzc1BhdGggPSBmaWxlTmFtZVxuICAgICAgLnJlcGxhY2UoL3RlbXBsYXRlXFwuanMkLywgJ3N0eWxlcy5jc3MnKVxuICAgICAgLnJlcGxhY2UoL3RlbXBsYXRlXFwuaGJzLywgJ3N0eWxlcy5jc3MnKTtcbiAgfVxuXG4gIHJldHVybiBjc3NQYXRoO1xufVxuXG4vKipcbiAqIE5vdGUgdGhhdCBjb21wb25lbnRzIGluIHRoZSBcInBvZHNcIiBjb252ZW50aW9uIHdpbGxcbiAqIG5ldmVyIGJlIHN1cHBvcnRlZC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZVBhdGhcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUG9kVGVtcGxhdGUoZmlsZVBhdGgpIHtcbiAgaWYgKGZpbGVQYXRoLmluY2x1ZGVzKCcvY29tcG9uZW50cy8nKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBmaWxlUGF0aC5lbmRzV2l0aCgndGVtcGxhdGUuanMnKSB8fCBmaWxlUGF0aC5lbmRzV2l0aCgndGVtcGxhdGUuaGJzJyk7XG59XG5cbi8qKlxuICogTm90ZSB0aGF0IGNvbXBvbmVudHMgaW4gdGhlIFwicG9kc1wiIGNvbnZlbnRpb24gd2lsbFxuICogbmV2ZXIgYmUgc3VwcG9ydGVkLlxuICpcbiAqIENoZWNrcyBpZiBhIGZpbGUgZW5kcyB3aXRoXG4gKiAtIHRlbXBsYXRlLmpzXG4gKiAtIHRlbXBsYXRlLmhic1xuICogLSBzdHlsZXMuY3NzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGZpbGVQYXRoXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1BvZChmaWxlUGF0aCkge1xuICBpZiAoZmlsZVBhdGguaW5jbHVkZXMoJy9jb21wb25lbnRzLycpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKGlzUG9kVGVtcGxhdGUoZmlsZVBhdGgpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZmlsZVBhdGguZW5kc1dpdGgoJ3N0eWxlcy5jc3MnKTtcbn1cblxuLyoqXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGZpbGVQYXRoXG4gKiBAcmV0dXJucyB0aGUgc2FtZSBwYXRoLCBidXQgd2l0aG91dCB0aGUgZXh0ZW5zaW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3aXRob3V0RXh0ZW5zaW9uKGZpbGVQYXRoKSB7XG4gIGxldCBwYXJzZWQgPSBwYXRoLnBhcnNlKGZpbGVQYXRoKTtcblxuICByZXR1cm4gcGF0aC5qb2luKHBhcnNlZC5kaXIsIHBhcnNlZC5uYW1lKTtcbn1cblxuLyoqXG4gKiBFeGFtcGxlcyBmb3IgZmlsZU5hbWVcbiAqIC0gYWJzb2x1dGUgb24tZGlzayBwYXRoXG4gKiAtIGluIHdlYnBhY2tcbiAqICAgLSBVUkwtYWJzb2x1dGUgcGF0aCwgc3RhcnRpbmcgd2l0aCAvXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGZpbGVOYW1lXG4gKiBAcGFyYW0ge3sgYWRkaXRpb25hbFJvb3RzPzogc3RyaW5nW107IGN3ZDogc3RyaW5nIH19IG9wdGlvbnNcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1JlbGV2YW50RmlsZShmaWxlTmFtZSwgeyBhZGRpdGlvbmFsUm9vdHMsIGN3ZCB9KSB7XG4gIC8vIEZha2UgZmlsZSBoYW5kbGVkIGJ5IHRlc3RlbSBzZXJ2ZXIgd2hlbiBpdCBydW5zXG4gIGlmIChmaWxlTmFtZS5zdGFydHNXaXRoKCcvdGVzdGVtJykpIHJldHVybiBmYWxzZTtcbiAgLy8gUHJpdmF0ZSBWaXJ0dWFsIE1vZHVsZXNcbiAgaWYgKGZpbGVOYW1lLnN0YXJ0c1dpdGgoJ1xcMCcpKSByZXR1cm4gZmFsc2U7XG4gIC8vIFRoZXNlIGFyZSBub3QgdmFsaWQgdXNlcmxhbmQgbmFtZXMgKG9yIGFyZSBmcm9tIGxpYnJhcmllcylcbiAgaWYgKGZpbGVOYW1lLm1hdGNoKC9eW2EtekEtWl0vKSkgcmV0dXJuIGZhbHNlO1xuICAvLyBFeHRlcm5hbCB0byB1c1xuICBpZiAoZmlsZU5hbWUuc3RhcnRzV2l0aCgnL0BlbWJyb2lkZXInKSkgcmV0dXJuIGZhbHNlO1xuICBpZiAoSVJSRUxFVkFOVF9QQVRIUy5zb21lKChpKSA9PiBmaWxlTmFtZS5pbmNsdWRlcyhpKSkpIHJldHVybiBmYWxzZTtcblxuICBsZXQgd29ya3NwYWNlID0gZmluZFdvcmtzcGFjZVBhdGgoZmlsZU5hbWUpO1xuXG4gIGFzc2VydChjd2QsIGBjd2Qgd2FzIG5vdCBwYXNzZWQgdG8gaXNSZWxldmFudEZpbGVgKTtcblxuICBsZXQgb3VyV29ya3NwYWNlID0gZmluZFdvcmtzcGFjZVBhdGgoY3dkKTtcblxuICBpZiAod29ya3NwYWNlICE9PSBvdXJXb3Jrc3BhY2UpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBsZXQgbG9jYWwgPSBmaWxlTmFtZS5yZXBsYWNlKHdvcmtzcGFjZSwgJycpO1xuICBsZXQgWywgLi4ucGFydHNdID0gbG9jYWwuc3BsaXQoJy8nKS5maWx0ZXIoQm9vbGVhbik7XG5cbiAgaWYgKFVOU1VQUE9SVEVEX0RJUkVDVE9SSUVTLmhhcyhwYXJ0c1swXSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogTW9zdGx5IHBvZHMgc3VwcG9ydC5cbiAgICogZm9sa3MgbmVlZCB0byBvcHQgaW4gdG8gcG9kcyAocm91dGVzKSwgYmVjYXVzZSBldmVyeSBwb2RzIGFwcCBjYW4gYmUgY29uZmlndXJlZCBkaWZmZXJlbnRseVxuICAgKi9cbiAgbGV0IHJvb3RzID0gWycvY29tcG9uZW50cy8nLCAnL3RlbXBsYXRlcy8nLCAuLi4oYWRkaXRpb25hbFJvb3RzIHx8IFtdKV07XG5cbiAgaWYgKCFyb290cy5zb21lKChyb290KSA9PiBmaWxlTmFtZS5pbmNsdWRlcyhyb290KSkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhY2thZ2VTY29wZWRQYXRoVG9Nb2R1bGVQYXRoKHBhY2thZ2VTY29wZWRQYXRoKSB7XG4gIC8qKlxuICAgKiAqQnkgY29udmVudGlvbiosIGBzcmNgIGlzIG9taXR0ZWQgZnJvbSBjb21wb25lbnQgcGF0aHMuXG4gICAqIFdlIGNhbiByZWZsZWN0IHRoZSBzYW1lIGJlaGF2aW9yIGJ5IHJlcGxhY2luZyBzcmMvXG4gICAqIHdpdGggYW4gZW1wdHkgc3RyaW5nLlxuICAgKlxuICAgKiBDU1MgaXNuJ3QgZW1pdHRlZCBhcyBhIGNvLWxvY2F0ZWQgbW9kdWxlLCBidXRcbiAgICogdG8ga2VlcCBjb252ZW50aW9ucyBjb25zaXN0ZW50IGFjcm9zcyBsYW5ndWFnZXMsXG4gICAqIHdlIGNhbiBwcmV0ZW5kIGl0IGlzLlxuICAgKlxuICAgKiBBbnkgY3VzdG9taXphdGlvbiBiZXlvbmQgcmVtb3ZpbmcgYHNyY2AgYW5kIGBhcHBgIGlzIHBvdGVudGlhbGx5IGNvbmZ1c2luZy5cbiAgICogSWYgd2UgbmVlZCBmdXJ0aGVyIGN1c3RvbWl6YXRpb25zLCB3ZSdsbCB3YW50IHRvIG1hdGNoIG9uIGBleHBvcnRzYCBpbiB0aGVcbiAgICogY29ycmVzcG9uZGluZyBwYWNrYWdlLmpzb25cbiAgICovXG4gIGxldCBwYWNrYWdlUmVsYXRpdmUgPSBwYWNrYWdlU2NvcGVkUGF0aC5yZXBsYWNlKC9eXFwvc3JjXFwvLywgJy8nKTtcblxuICBsZXQgcGFyc2VkID0gcGF0aC5wYXJzZShwYWNrYWdlUmVsYXRpdmUpO1xuXG4gIGlmIChpc1BvZChwYWNrYWdlUmVsYXRpdmUpKSB7XG4gICAgLyoqXG4gICAgICogRm9yIHBvZHMsIHdlIGNob3Agb2ZmIHRoZSB3aG9sZSBmaWxlLCBhbmQgdXNlIHRoZSBkaXIgbmFtZSBhcyB0aGUgXCJtb2R1bGVQYXRoXCJcbiAgICAgKi9cbiAgICByZXR1cm4gcGFyc2VkLmRpcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiBhbiBleHRlbnNpb24gaXMgcGFzc2VkLCByZW1vdmUgaXQuXG4gICAqIFdoZW4gdXNpbmcgcGFja2FnZXJzLCBmb2xrcyBhcmUgdXNlZCB0byBub3QgaGF2aW5nIHRvIHNwZWNpZnkgZXh0ZW5zaW9ucyBmb3IgZmlsZXMuXG4gICAqIFNpbmNlIHdlIGRvbid0IGV2ZW4gZW1pdCBjc3MgZmlsZXMgY28tbG9jYXRlZCB0byBlYWNoIG1vZHVsZSxcbiAgICogdGhpcyBoZWxwcyB1cyBub3QgY29udmV5IGEgbGllIHRoYXQgYSBmaWxlIG1heSBleGlzdCBpbiBhdCBydW50aW1lLlxuICAgKlxuICAgKiBGb3IgZXhhbXBsZSBgPG1vZHVsZS1uYW1lPi9jb21wb25lbnRzL2J1dHRvbmAuXG4gICAqIEl0IGRvZXNuJ3QgbWF0dGVyIHdoYXQgdGhlIGV4dGVuc2lvbiBpcywgYmVjYXVzZSB5b3UgY2FuIG9ubHkgaGF2ZSBvbmUgY3NzIGZpbGVcbiAgICogZm9yIHRoZSBidXR0b24gbW9kdWxlIGFueXdheS5cbiAgICovXG4gIGxldCBsb2NhbFBhY2thZ2VyU3R5bGVQYXRoID0gcGF0aC5qb2luKHBhcnNlZC5kaXIsIHBhcnNlZC5uYW1lKTtcblxuICByZXR1cm4gbG9jYWxQYWNrYWdlclN0eWxlUGF0aDtcbn1cblxuLyoqXG4gKiByZXR1cm5zIHRoZSBhcHAtbW9kdWxlIHBhdGggb2YgdGhlIHNvdXJjZSBmaWxlXG4gKlxuICogVGhpcyBhc3N1bWVzIG5vcm1hbCBlbWJlciBhcHAgY29udmVudGlvbnNcbiAqXG4gKiB3aGljaCBpcyBgPHBhY2thZ2UuanNvbiNuYW1lPi9wYXRoLXRvLWZpbGVgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBQYXRoKHNvdXJjZVBhdGgpIHtcbiAgbGV0IHdvcmtzcGFjZVBhdGggPSBmaW5kV29ya3NwYWNlUGF0aChzb3VyY2VQYXRoKTtcbiAgbGV0IG5hbWUgPSBtb2R1bGVOYW1lKHNvdXJjZVBhdGgpO1xuXG4gIC8qKlxuICAgKiAgVW5kZXIgZW1icm9pZGVyIGJ1aWxkcywgdGhlIHNwZWMtY29tcGxpYW50IHZlcnNpb24gb2YgdGhlIGFwcFxuICAgKiBoYXMgYWxsIHRoZSBmaWxlcyB1bmRlciBhIGZvbGRlciB3aGljaCByZXByZXNlbnRzIHRoZSBwYWNrYWdlIG5hbWUsXG4gICAqIHJhdGhlciB0aGFuIFwiYXBwXCIuXG4gICAqL1xuICBsZXQgcGFja2FnZVJlbGF0aXZlID0gc291cmNlUGF0aC5yZXBsYWNlKHdvcmtzcGFjZVBhdGgsICcnKTtcblxuICAvKipcbiAgICogQnV0IHdlIGFsc28gZG9uJ3Qgd2FudCAnYXBwJyAtLSB3aGljaCBpcyBwcmVzZW50IGluIHRoZSB2MSBhZGRvbiBwaXBlbGluZVxuICAgKi9cbiAgcGFja2FnZVJlbGF0aXZlID0gcGFja2FnZVJlbGF0aXZlLnJlcGxhY2UoYC9hcHAvYCwgYC9gKTtcblxuICAvLyBBbnkgb2YgdGhlIGFib3ZlIHJlbHBhY2VtZW50cyBjb3VsZCBhY2NpZGVudGFsbHkgZ2l2ZSB1cyBhbiBleHRyYSAvIChkZXBlbmRpbmcgb24gb3VyIGJ1aWxkIGVudmlyb25tZW50KVxuICBwYWNrYWdlUmVsYXRpdmUgPSBwYWNrYWdlUmVsYXRpdmUucmVwbGFjZSgnLy8nLCAnLycpO1xuXG4gIGxldCBsb2NhbFBhY2thZ2VyU3R5bGVQYXRoID0gcGFja2FnZVNjb3BlZFBhdGhUb01vZHVsZVBhdGgocGFja2FnZVJlbGF0aXZlKTtcblxuICByZXR1cm4gYCR7bmFtZX0ke2xvY2FsUGFja2FnZXJTdHlsZVBhdGh9YDtcbn1cblxuLyoqXG4gKiBUbyBhdm9pZCBoaXR0aW5nIHRoZSBmaWxlc3lzZXRtLCB3ZSdsbCBzdG9yZSBhbGwgZm91bmRcbiAqIHByb2plY3QgcGF0aHMgYmVyZSwgc28gd2UgY2FuLCBpbiBtZW1vcnksXG4gKiBnZXQgdGhlIGZvbGRlciB3aGVyZSBhIHBhY2thZ2UuanNvbiBleGlzdHMsIHJhdGhlciB0aGFuXG4gKiBoaXQgdGhlIGZpbGUgc3lzdGVtIGV2ZXJ5IHRpbWUuXG4gKi9cbmNvbnN0IFNFRU4gPSBuZXcgU2V0KCk7XG5cbmZ1bmN0aW9uIGdldFNlZW4oc291cmNlUGF0aCkge1xuICBpZiAoU0VFTi5oYXMoc291cmNlUGF0aCkpIHJldHVybiBzb3VyY2VQYXRoO1xuXG4gIGxldCBwYXJ0cyA9IHNvdXJjZVBhdGguc3BsaXQoJy8nKTtcblxuICBmb3IgKGxldCBpID0gcGFydHMubGVuZ3RoIC0gMTsgaSA+IDE7IGktLSkge1xuICAgIGxldCB0b0NoZWNrID0gcGFydHMuc2xpY2UoMCwgaSkuam9pbignLycpO1xuXG4gICAgbGV0IHNlZW4gPSBTRUVOLmhhcyh0b0NoZWNrKTtcblxuICAgIGlmIChzZWVuKSB7XG4gICAgICByZXR1cm4gdG9DaGVjaztcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRXb3Jrc3BhY2VQYXRoKHNvdXJjZVBhdGgsIG9wdGlvbnMpIHtcbiAgbGV0IGN3ZCA9IG9wdGlvbnM/LmN3ZCA/PyBDV0Q7XG5cbiAgaWYgKHNvdXJjZVBhdGguZW5kc1dpdGgoJy8nKSkge1xuICAgIHNvdXJjZVBhdGggPSBzb3VyY2VQYXRoLnJlcGxhY2UoL1xcLyQvLCAnJyk7XG4gIH1cblxuICBsZXQgc2VlbiA9IGdldFNlZW4oc291cmNlUGF0aCk7XG5cbiAgaWYgKHNlZW4pIHtcbiAgICByZXR1cm4gc2VlbjtcbiAgfVxuXG4gIGxldCBjYW5kaWRhdGVQYXRoID0gcGF0aC5qb2luKHNvdXJjZVBhdGgsICdwYWNrYWdlLmpzb24nKTtcblxuICBjb25zdCBpc1dvcmtzcGFjZSA9IGZzU3luYy5leGlzdHNTeW5jKGNhbmRpZGF0ZVBhdGgpO1xuXG4gIGlmIChpc1dvcmtzcGFjZSkge1xuICAgIHJldHVybiBzb3VyY2VQYXRoO1xuICB9XG5cbiAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gZmluZFBhY2thZ2VKc29uVXAoc291cmNlUGF0aCwgeyBjd2QgfSk7XG5cbiAgaWYgKCFwYWNrYWdlSnNvblBhdGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBkZXRlcm1pbmUgcHJvamVjdCBmb3IgJHtzb3VyY2VQYXRofWApO1xuICB9XG5cbiAgY29uc3Qgd29ya3NwYWNlUGF0aCA9IHBhdGguZGlybmFtZShwYWNrYWdlSnNvblBhdGgpO1xuXG4gIFNFRU4uYWRkKHdvcmtzcGFjZVBhdGgpO1xuXG4gIHJldHVybiB3b3Jrc3BhY2VQYXRoO1xufVxuXG5mdW5jdGlvbiBmaW5kUGFja2FnZUpzb25VcChzdGFydFBhdGgsIG9wdGlvbnMpIHtcbiAgbGV0IGN3ZCA9IG9wdGlvbnM/LmN3ZCA/PyBDV0Q7XG4gIGxldCBwYXJ0cyA9IHN0YXJ0UGF0aC5zcGxpdCgnLycpO1xuXG4gIGZvciAobGV0IGkgPSBwYXJ0cy5sZW5ndGggLSAxOyBpID4gMTsgaS0tKSB7XG4gICAgbGV0IHRvQ2hlY2sgPSBwYXJ0cy5zbGljZSgwLCBpKS5qb2luKCcvJyk7XG5cbiAgICBsZXQgcGFja2FnZUpzb24gPSBwYXRoLmpvaW4odG9DaGVjaywgJ3BhY2thZ2UuanNvbicpO1xuICAgIGxldCBleGlzdHMgPSBmc1N5bmMuZXhpc3RzU3luYyhwYWNrYWdlSnNvbik7XG5cbiAgICBpZiAoZXhpc3RzKSB7XG4gICAgICByZXR1cm4gcGFja2FnZUpzb247XG4gICAgfVxuXG4gICAgLy8gRG9uJ3QgdHJhdmVyc2UgYWxsIHRoZSB3YXkgdG8gdGhlIHJvb3Qgb2YgdGhlIGZpbGUgc3lzdGVtLlxuICAgIGlmICh0b0NoZWNrID09PSBjd2QpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG5jb25zdCBNQU5JRkVTVF9DQUNIRSA9IG5ldyBNYXAoKTtcblxuLyoqXG4gKiBXaWxsIHJldHVybiB0aGUgcGFja2FnZS5qc29uI25hbWUsIG9yIGNvbmZpZy9lbnZpcm9ubWVudCNtb3VkbGVQcmVmaXggKGlmIHYxIGFwcClcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc291cmNlUGF0aFxuICovXG5leHBvcnQgZnVuY3Rpb24gbW9kdWxlTmFtZShzb3VyY2VQYXRoKSB7XG4gIGNvbnN0IHdvcmtzcGFjZSA9IGZpbmRXb3Jrc3BhY2VQYXRoKHNvdXJjZVBhdGgpO1xuICBjb25zdCBtYW5pZmVzdCA9IGdldE1hbmlmZXN0KHdvcmtzcGFjZSk7XG5cbiAgcmV0dXJuIG1hbmlmZXN0Lm5hbWU7XG59XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHdvcmtzcGFjZVxuICovXG5mdW5jdGlvbiBnZXRNYW5pZmVzdCh3b3Jrc3BhY2UpIHtcbiAgbGV0IGV4aXN0aW5nID0gTUFOSUZFU1RfQ0FDSEUuZ2V0KHdvcmtzcGFjZSk7XG5cbiAgaWYgKGV4aXN0aW5nKSB7XG4gICAgcmV0dXJuIGV4aXN0aW5nO1xuICB9XG5cbiAgbGV0IGJ1ZmZlciA9IGZzU3luYy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHdvcmtzcGFjZSwgJ3BhY2thZ2UuanNvbicpKTtcbiAgbGV0IGNvbnRlbnQgPSBidWZmZXIudG9TdHJpbmcoKTtcbiAgbGV0IGpzb24gPSBKU09OLnBhcnNlKGNvbnRlbnQpO1xuXG4gIE1BTklGRVNUX0NBQ0hFLnNldCh3b3Jrc3BhY2UsIGpzb24pO1xuXG4gIHJldHVybiBqc29uO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7O0FDQUEseUJBQW1CO0FBQ25CLHFCQUFtQztBQUNuQyx5QkFBOEI7QUFDOUIsdUJBQWlCO0FBSGpCO0FBY0EsSUFBSSxPQUFPLFlBQVk7QUFDdkIsSUFBSSxhQUFhLFdBQVcsVUFDeEIsV0FBVyxVQUNYLFlBQVEsa0NBQWMsSUFBSTtBQUU5QixJQUFJLENBQUMsWUFBWTtBQUNmLGVBQWE7QUFDZjtBQUVBLElBQU0sbUJBQW1CLENBQUMsc0JBQXNCLFNBQVM7QUFDekQsSUFBTSwwQkFBMEIsb0JBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQztBQUVq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
|