1 | "use strict";
|
---|
2 | var __importDefault = (this && this.__importDefault) || function (mod) {
|
---|
3 | return (mod && mod.__esModule) ? mod : { "default": mod };
|
---|
4 | };
|
---|
5 | Object.defineProperty(exports, "__esModule", { value: true });
|
---|
6 | const chalk_1 = __importDefault(require("chalk"));
|
---|
7 | const process_1 = __importDefault(require("process"));
|
---|
8 | const minimist_1 = __importDefault(require("minimist"));
|
---|
9 | const applyPatches_1 = require("./applyPatches");
|
---|
10 | const getAppRootPath_1 = require("./getAppRootPath");
|
---|
11 | const makePatch_1 = require("./makePatch");
|
---|
12 | const makeRegExp_1 = require("./makeRegExp");
|
---|
13 | const detectPackageManager_1 = require("./detectPackageManager");
|
---|
14 | const path_1 = require("./path");
|
---|
15 | const path_2 = require("path");
|
---|
16 | const slash = require("slash");
|
---|
17 | const ci_info_1 = require("ci-info");
|
---|
18 | const rebase_1 = require("./rebase");
|
---|
19 | const appPath = getAppRootPath_1.getAppRootPath();
|
---|
20 | const argv = minimist_1.default(process_1.default.argv.slice(2), {
|
---|
21 | boolean: [
|
---|
22 | "use-yarn",
|
---|
23 | "case-sensitive-path-filtering",
|
---|
24 | "reverse",
|
---|
25 | "help",
|
---|
26 | "version",
|
---|
27 | "error-on-fail",
|
---|
28 | "error-on-warn",
|
---|
29 | "create-issue",
|
---|
30 | "partial",
|
---|
31 | "",
|
---|
32 | ],
|
---|
33 | string: ["patch-dir", "append", "rebase"],
|
---|
34 | });
|
---|
35 | const packageNames = argv._;
|
---|
36 | console.log(chalk_1.default.bold("patch-package"),
|
---|
37 | // tslint:disable-next-line:no-var-requires
|
---|
38 | require(path_1.join(__dirname, "../package.json")).version);
|
---|
39 | if (argv.version || argv.v) {
|
---|
40 | // noop
|
---|
41 | }
|
---|
42 | else if (argv.help || argv.h) {
|
---|
43 | printHelp();
|
---|
44 | }
|
---|
45 | else {
|
---|
46 | const patchDir = slash(path_2.normalize((argv["patch-dir"] || "patches") + path_2.sep));
|
---|
47 | if (patchDir.startsWith("/")) {
|
---|
48 | throw new Error("--patch-dir must be a relative path");
|
---|
49 | }
|
---|
50 | if ("rebase" in argv) {
|
---|
51 | if (!argv.rebase) {
|
---|
52 | console.log(chalk_1.default.red("You must specify a patch file name or number when rebasing patches"));
|
---|
53 | process_1.default.exit(1);
|
---|
54 | }
|
---|
55 | if (packageNames.length !== 1) {
|
---|
56 | console.log(chalk_1.default.red("You must specify exactly one package name when rebasing patches"));
|
---|
57 | process_1.default.exit(1);
|
---|
58 | }
|
---|
59 | rebase_1.rebase({
|
---|
60 | appPath,
|
---|
61 | packagePathSpecifier: packageNames[0],
|
---|
62 | patchDir,
|
---|
63 | targetPatch: argv.rebase,
|
---|
64 | });
|
---|
65 | }
|
---|
66 | else if (packageNames.length) {
|
---|
67 | const includePaths = makeRegExp_1.makeRegExp(argv.include, "include", /.*/, argv["case-sensitive-path-filtering"]);
|
---|
68 | const excludePaths = makeRegExp_1.makeRegExp(argv.exclude, "exclude", /^package\.json$/, argv["case-sensitive-path-filtering"]);
|
---|
69 | const packageManager = detectPackageManager_1.detectPackageManager(appPath, argv["use-yarn"] ? "yarn" : null);
|
---|
70 | const createIssue = argv["create-issue"];
|
---|
71 | packageNames.forEach((packagePathSpecifier) => {
|
---|
72 | makePatch_1.makePatch({
|
---|
73 | packagePathSpecifier,
|
---|
74 | appPath,
|
---|
75 | packageManager,
|
---|
76 | includePaths,
|
---|
77 | excludePaths,
|
---|
78 | patchDir,
|
---|
79 | createIssue,
|
---|
80 | mode: "append" in argv
|
---|
81 | ? { type: "append", name: argv.append || undefined }
|
---|
82 | : { type: "overwrite_last" },
|
---|
83 | });
|
---|
84 | });
|
---|
85 | }
|
---|
86 | else {
|
---|
87 | console.log("Applying patches...");
|
---|
88 | const reverse = !!argv["reverse"];
|
---|
89 | // don't want to exit(1) on postinstall locally.
|
---|
90 | // see https://github.com/ds300/patch-package/issues/86
|
---|
91 | const shouldExitWithError = !!argv["error-on-fail"] ||
|
---|
92 | (process_1.default.env.NODE_ENV === "production" && ci_info_1.isCI) ||
|
---|
93 | (ci_info_1.isCI && !process_1.default.env.PATCH_PACKAGE_INTEGRATION_TEST) ||
|
---|
94 | process_1.default.env.NODE_ENV === "test";
|
---|
95 | const shouldExitWithWarning = !!argv["error-on-warn"];
|
---|
96 | applyPatches_1.applyPatchesForApp({
|
---|
97 | appPath,
|
---|
98 | reverse,
|
---|
99 | patchDir,
|
---|
100 | shouldExitWithError,
|
---|
101 | shouldExitWithWarning,
|
---|
102 | bestEffort: argv.partial,
|
---|
103 | });
|
---|
104 | }
|
---|
105 | }
|
---|
106 | function printHelp() {
|
---|
107 | console.log(`
|
---|
108 | Usage:
|
---|
109 |
|
---|
110 | 1. Patching packages
|
---|
111 | ====================
|
---|
112 |
|
---|
113 | ${chalk_1.default.bold("patch-package")}
|
---|
114 |
|
---|
115 | Without arguments, the ${chalk_1.default.bold("patch-package")} command will attempt to find and apply
|
---|
116 | patch files to your project. It looks for files named like
|
---|
117 |
|
---|
118 | ./patches/<package-name>+<version>.patch
|
---|
119 |
|
---|
120 | Options:
|
---|
121 |
|
---|
122 | ${chalk_1.default.bold("--patch-dir <dirname>")}
|
---|
123 |
|
---|
124 | Specify the name for the directory in which the patch files are located.
|
---|
125 |
|
---|
126 | ${chalk_1.default.bold("--error-on-fail")}
|
---|
127 |
|
---|
128 | Forces patch-package to exit with code 1 after failing.
|
---|
129 |
|
---|
130 | When running locally patch-package always exits with 0 by default.
|
---|
131 | This happens even after failing to apply patches because otherwise
|
---|
132 | yarn.lock and package.json might get out of sync with node_modules,
|
---|
133 | which can be very confusing.
|
---|
134 |
|
---|
135 | --error-on-fail is ${chalk_1.default.bold("switched on")} by default on CI.
|
---|
136 |
|
---|
137 | See https://github.com/ds300/patch-package/issues/86 for background.
|
---|
138 |
|
---|
139 | ${chalk_1.default.bold("--error-on-warn")}
|
---|
140 |
|
---|
141 | Forces patch-package to exit with code 1 after warning.
|
---|
142 |
|
---|
143 | See https://github.com/ds300/patch-package/issues/314 for background.
|
---|
144 |
|
---|
145 | ${chalk_1.default.bold("--reverse")}
|
---|
146 |
|
---|
147 | Un-applies all patches.
|
---|
148 |
|
---|
149 | Note that this will fail if the patched files have changed since being
|
---|
150 | patched. In that case, you'll probably need to re-install 'node_modules'.
|
---|
151 |
|
---|
152 | This option was added to help people using CircleCI avoid an issue around caching
|
---|
153 | and patch file updates (https://github.com/ds300/patch-package/issues/37),
|
---|
154 | but might be useful in other contexts too.
|
---|
155 |
|
---|
156 |
|
---|
157 | 2. Creating patch files
|
---|
158 | =======================
|
---|
159 |
|
---|
160 | ${chalk_1.default.bold("patch-package")} <package-name>${chalk_1.default.italic("[ <package-name>]")}
|
---|
161 |
|
---|
162 | When given package names as arguments, patch-package will create patch files
|
---|
163 | based on any changes you've made to the versions installed by yarn/npm.
|
---|
164 |
|
---|
165 | Options:
|
---|
166 |
|
---|
167 | ${chalk_1.default.bold("--create-issue")}
|
---|
168 |
|
---|
169 | For packages whose source is hosted on GitHub this option opens a web
|
---|
170 | browser with a draft issue based on your diff.
|
---|
171 |
|
---|
172 | ${chalk_1.default.bold("--use-yarn")}
|
---|
173 |
|
---|
174 | By default, patch-package checks whether you use npm or yarn based on
|
---|
175 | which lockfile you have. If you have both, it uses npm by default.
|
---|
176 | Set this option to override that default and always use yarn.
|
---|
177 |
|
---|
178 | ${chalk_1.default.bold("--exclude <regexp>")}
|
---|
179 |
|
---|
180 | Ignore paths matching the regexp when creating patch files.
|
---|
181 | Paths are relative to the root dir of the package to be patched.
|
---|
182 |
|
---|
183 | Default: 'package\\.json$'
|
---|
184 |
|
---|
185 | ${chalk_1.default.bold("--include <regexp>")}
|
---|
186 |
|
---|
187 | Only consider paths matching the regexp when creating patch files.
|
---|
188 | Paths are relative to the root dir of the package to be patched.
|
---|
189 |
|
---|
190 | Default '.*'
|
---|
191 |
|
---|
192 | ${chalk_1.default.bold("--case-sensitive-path-filtering")}
|
---|
193 |
|
---|
194 | Make regexps used in --include or --exclude filters case-sensitive.
|
---|
195 |
|
---|
196 | ${chalk_1.default.bold("--patch-dir")}
|
---|
197 |
|
---|
198 | Specify the name for the directory in which to put the patch files.
|
---|
199 | `);
|
---|
200 | }
|
---|
201 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxrREFBeUI7QUFDekIsc0RBQTZCO0FBQzdCLHdEQUErQjtBQUUvQixpREFBbUQ7QUFDbkQscURBQWlEO0FBQ2pELDJDQUF1QztBQUN2Qyw2Q0FBeUM7QUFDekMsaUVBQTZEO0FBQzdELGlDQUE2QjtBQUM3QiwrQkFBcUM7QUFDckMsK0JBQStCO0FBQy9CLHFDQUE4QjtBQUM5QixxQ0FBaUM7QUFFakMsTUFBTSxPQUFPLEdBQUcsK0JBQWMsRUFBRSxDQUFBO0FBQ2hDLE1BQU0sSUFBSSxHQUFHLGtCQUFRLENBQUMsaUJBQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFO0lBQzNDLE9BQU8sRUFBRTtRQUNQLFVBQVU7UUFDViwrQkFBK0I7UUFDL0IsU0FBUztRQUNULE1BQU07UUFDTixTQUFTO1FBQ1QsZUFBZTtRQUNmLGVBQWU7UUFDZixjQUFjO1FBQ2QsU0FBUztRQUNULEVBQUU7S0FDSDtJQUNELE1BQU0sRUFBRSxDQUFDLFdBQVcsRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDO0NBQzFDLENBQUMsQ0FBQTtBQUNGLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUE7QUFFM0IsT0FBTyxDQUFDLEdBQUcsQ0FDVCxlQUFLLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQztBQUMzQiwyQ0FBMkM7QUFDM0MsT0FBTyxDQUFDLFdBQUksQ0FBQyxTQUFTLEVBQUUsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FDcEQsQ0FBQTtBQUVELElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsQ0FBQyxFQUFFO0lBQzFCLE9BQU87Q0FDUjtLQUFNLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsQ0FBQyxFQUFFO0lBQzlCLFNBQVMsRUFBRSxDQUFBO0NB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YWxrXCJcbmltcG9ydCBwcm9jZXNzIGZyb20gXCJwcm9jZXNzXCJcbmltcG9ydCBtaW5pbWlzdCBmcm9tIFwibWluaW1pc3RcIlxuXG5pbXBvcnQgeyBhcHBseVBhdGNoZXNGb3JBcHAgfSBmcm9tIFwiLi9hcHBseVBhdGNoZXNcIlxuaW1wb3J0IHsgZ2V0QXBwUm9vdFBhdGggfSBmcm9tIFwiLi9nZXRBcHBSb290UGF0aFwiXG5pbXBvcnQgeyBtYWtlUGF0Y2ggfSBmcm9tIFwiLi9tYWtlUGF0Y2hcIlxuaW1wb3J0IHsgbWFrZVJlZ0V4cCB9IGZyb20gXCIuL21ha2VSZWdFeHBcIlxuaW1wb3J0IHsgZGV0ZWN0UGFja2FnZU1hbmFnZXIgfSBmcm9tIFwiLi9kZXRlY3RQYWNrYWdlTWFuYWdlclwiXG5pbXBvcnQgeyBqb2luIH0gZnJvbSBcIi4vcGF0aFwiXG5pbXBvcnQgeyBub3JtYWxpemUsIHNlcCB9IGZyb20gXCJwYXRoXCJcbmltcG9ydCBzbGFzaCA9IHJlcXVpcmUoXCJzbGFzaFwiKVxuaW1wb3J0IHsgaXNDSSB9IGZyb20gXCJjaS1pbmZvXCJcbmltcG9ydCB7IHJlYmFzZSB9IGZyb20gXCIuL3JlYmFzZVwiXG5cbmNvbnN0IGFwcFBhdGggPSBnZXRBcHBSb290UGF0aCgpXG5jb25zdCBhcmd2ID0gbWluaW1pc3QocHJvY2Vzcy5hcmd2LnNsaWNlKDIpLCB7XG4gIGJvb2xlYW46IFtcbiAgICBcInVzZS15YXJuXCIsXG4gICAgXCJjYXNlLXNlbnNpdGl2ZS1wYXRoLWZpbHRlcmluZ1wiLFxuICAgIFwicmV2ZXJzZVwiLFxuICAgIFwiaGVscFwiLFxuICAgIFwidmVyc2lvblwiLFxuICAgIFwiZXJyb3Itb24tZmFpbFwiLFxuICAgIFwiZXJyb3Itb24td2FyblwiLFxuICAgIFwiY3JlYXRlLWlzc3VlXCIsXG4gICAgXCJwYXJ0aWFsXCIsXG4gICAgXCJcIixcbiAgXSxcbiAgc3RyaW5nOiBbXCJwYXRjaC1kaXJcIiwgXCJhcHBlbmRcIiwgXCJyZWJhc2VcIl0sXG59KVxuY29uc3QgcGFja2FnZU5hbWVzID0gYXJndi5fXG5cbmNvbnNvbGUubG9nKFxuICBjaGFsay5ib2xkKFwicGF0Y2gtcGFja2FnZVwiKSxcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLXZhci1yZXF1aXJlc1xuICByZXF1aXJlKGpvaW4oX19kaXJuYW1lLCBcIi4uL3BhY2thZ2UuanNvblwiKSkudmVyc2lvbixcbilcblxuaWYgKGFyZ3YudmVyc2lvbiB8fCBhcmd2LnYpIHtcbiAgLy8gbm9vcFxufSBlbHNlIGlmIChhcmd2LmhlbHAgfHwgYXJndi5oKSB7XG4gIHByaW50SGVscCgpXG59IGVsc2Uge1xuICBjb25zdCBwYXRjaERpciA9IHNsYXNoKG5vcm1hbGl6ZSgoYXJndltcInBhdGNoLWRpclwiXSB8fCBcInBhdGNoZXNcIikgKyBzZXApKVxuICBpZiAocGF0Y2hEaXIuc3RhcnRzV2l0aChcIi9cIikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCItLXBhdGNoLWRpciBtdXN0IGJlIGEgcmVsYXRpdmUgcGF0aFwiKVxuICB9XG4gIGlmIChcInJlYmFzZVwiIGluIGFyZ3YpIHtcbiAgICBpZiAoIWFyZ3YucmViYXNlKSB7XG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgY2hhbGsucmVkKFxuICAgICAgICAgIFwiWW91IG11c3Qgc3BlY2lmeSBhIHBhdGNoIGZpbGUgbmFtZSBvciBudW1iZXIgd2hlbiByZWJhc2luZyBwYXRjaGVzXCIsXG4gICAgICAgICksXG4gICAgICApXG4gICAgICBwcm9jZXNzLmV4aXQoMSlcbiAgICB9XG4gICAgaWYgKHBhY2thZ2VOYW1lcy5sZW5ndGggIT09IDEpIHtcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBjaGFsay5yZWQoXG4gICAgICAgICAgXCJZb3UgbXVzdCBzcGVjaWZ5IGV4YWN0bHkgb25lIHBhY2thZ2UgbmFtZSB3aGVuIHJlYmFzaW5nIHBhdGNoZXNcIixcbiAgICAgICAgKSxcbiAgICAgIClcbiAgICAgIHByb2Nlc3MuZXhpdCgxKVxuICAgIH1cbiAgICByZWJhc2Uoe1xuICAgICAgYXBwUGF0aCxcbiAgICAgIHBhY2thZ2VQYXRoU3BlY2lmaWVyOiBwYWNrYWdlTmFtZXNbMF0sXG4gICAgICBwYXRjaERpcixcbiAgICAgIHRhcmdldFBhdGNoOiBhcmd2LnJlYmFzZSxcbiAgICB9KVxuICB9IGVsc2UgaWYgKHBhY2thZ2VOYW1lcy5sZW5ndGgpIHtcbiAgICBjb25zdCBpbmNsdWRlUGF0aHMgPSBtYWtlUmVnRXhwKFxuICAgICAgYXJndi5pbmNsdWRlLFxuICAgICAgXCJpbmNsdWRlXCIsXG4gICAgICAvLiovLFxuICAgICAgYXJndltcImNhc2Utc2Vuc2l0aXZlLXBhdGgtZmlsdGVyaW5nXCJdLFxuICAgIClcbiAgICBjb25zdCBleGNsdWRlUGF0aHMgPSBtYWtlUmVnRXhwKFxuICAgICAgYXJndi5leGNsdWRlLFxuICAgICAgXCJleGNsdWRlXCIsXG4gICAgICAvXnBhY2thZ2VcXC5qc29uJC8sXG4gICAgICBhcmd2W1wiY2FzZS1zZW5zaXRpdmUtcGF0aC1maWx0ZXJpbmdcIl0sXG4gICAgKVxuICAgIGNvbnN0IHBhY2thZ2VNYW5hZ2VyID0gZGV0ZWN0UGFja2FnZU1hbmFnZXIoXG4gICAgICBhcHBQYXRoLFxuICAgICAgYXJndltcInVzZS15YXJuXCJdID8gXCJ5YXJuXCIgOiBudWxsLFxuICAgIClcbiAgICBjb25zdCBjcmVhdGVJc3N1ZSA9IGFyZ3ZbXCJjcmVhdGUtaXNzdWVcIl1cbiAgICBwYWNrYWdlTmFtZXMuZm9yRWFjaCgocGFja2FnZVBhdGhTcGVjaWZpZXI6IHN0cmluZykgPT4ge1xuICAgICAgbWFrZVBhdGNoKHtcbiAgICAgICAgcGFja2FnZVBhdGhTcGVjaWZpZXIsXG4gICAgICAgIGFwcFBhdGgsXG4gICAgICAgIHBhY2thZ2VNYW5hZ2VyLFxuICAgICAgICBpbmNsdWRlUGF0aHMsXG4gICAgICAgIGV4Y2x1ZGVQYXRocyxcbiAgICAgICAgcGF0Y2hEaXIsXG4gICAgICAgIGNyZWF0ZUlzc3VlLFxuICAgICAgICBtb2RlOlxuICAgICAgICAgIFwiYXBwZW5kXCIgaW4gYXJndlxuICAgICAgICAgICAgPyB7IHR5cGU6IFwiYXBwZW5kXCIsIG5hbWU6IGFyZ3YuYXBwZW5kIHx8IHVuZGVmaW5lZCB9XG4gICAgICAgICAgICA6IHsgdHlwZTogXCJvdmVyd3JpdGVfbGFzdFwiIH0sXG4gICAgICB9KVxuICAgIH0pXG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS5sb2coXCJBcHBseWluZyBwYXRjaGVzLi4uXCIpXG4gICAgY29uc3QgcmV2ZXJzZSA9ICEhYXJndltcInJldmVyc2VcIl1cbiAgICAvLyBkb24ndCB3YW50IHRvIGV4aXQoMSkgb24gcG9zdGluc3RhbGwgbG9jYWxseS5cbiAgICAvLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2RzMzAwL3BhdGNoLXBhY2thZ2UvaXNzdWVzLzg2XG4gICAgY29uc3Qgc2hvdWxkRXhpdFdpdGhFcnJvciA9XG4gICAgICAhIWFyZ3ZbXCJlcnJvci1vbi1mYWlsXCJdIHx8XG4gICAgICAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiICYmIGlzQ0kpIHx8XG4gICAgICAoaXNDSSAmJiAhcHJvY2Vzcy5lbnYuUEFUQ0hfUEFDS0FHRV9JTlRFR1JBVElPTl9URVNUKSB8fFxuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwidGVzdFwiXG5cbiAgICBjb25zdCBzaG91bGRFeGl0V2l0aFdhcm5pbmcgPSAhIWFyZ3ZbXCJlcnJvci1vbi13YXJuXCJdXG5cbiAgICBhcHBseVBhdGNoZXNGb3JBcHAoe1xuICAgICAgYXBwUGF0aCxcbiAgICAgIHJldmVyc2UsXG4gICAgICBwYXRjaERpcixcbiAgICAgIHNob3VsZEV4aXRXaXRoRXJyb3IsXG4gICAgICBzaG91bGRFeGl0V2l0aFdhcm5pbmcsXG4gICAgICBiZXN0RWZmb3J0OiBhcmd2LnBhcnRpYWwsXG4gICAgfSlcbiAgfVxufVxuXG5mdW5jdGlvbiBwcmludEhlbHAoKSB7XG4gIGNvbnNvbGUubG9nKGBcblVzYWdlOlxuXG4gIDEuIFBhdGNoaW5nIHBhY2thZ2VzXG4gID09PT09PT09PT09PT09PT09PT09XG5cbiAgICAke2NoYWxrLmJvbGQoXCJwYXRjaC1wYWNrYWdlXCIpfVxuXG4gIFdpdGhvdXQgYXJndW1lbnRzLCB0aGUgJHtjaGFsay5ib2xkKFxuICAgIFwicGF0Y2gtcGFja2FnZVwiLFxuICApfSBjb21tYW5kIHdpbGwgYXR0ZW1wdCB0byBmaW5kIGFuZCBhcHBseVxuICBwYXRjaCBmaWxlcyB0byB5b3VyIHByb2plY3QuIEl0IGxvb2tzIGZvciBmaWxlcyBuYW1lZCBsaWtlXG5cbiAgICAgLi9wYXRjaGVzLzxwYWNrYWdlLW5hbWU+Kzx2ZXJzaW9uPi5wYXRjaFxuXG4gIE9wdGlvbnM6XG5cbiAgICAke2NoYWxrLmJvbGQoXCItLXBhdGNoLWRpciA8ZGlybmFtZT5cIil9XG5cbiAgICAgIFNwZWNpZnkgdGhlIG5hbWUgZm9yIHRoZSBkaXJlY3RvcnkgaW4gd2hpY2ggdGhlIHBhdGNoIGZpbGVzIGFyZSBsb2NhdGVkLlxuICAgICAgXG4gICAgJHtjaGFsay5ib2xkKFwiLS1lcnJvci1vbi1mYWlsXCIpfVxuICAgIFxuICAgICAgRm9yY2VzIHBhdGNoLXBhY2thZ2UgdG8gZXhpdCB3aXRoIGNvZGUgMSBhZnRlciBmYWlsaW5nLlxuICAgIFxuICAgICAgV2hlbiBydW5uaW5nIGxvY2FsbHkgcGF0Y2gtcGFja2FnZSBhbHdheXMgZXhpdHMgd2l0aCAwIGJ5IGRlZmF1bHQuXG4gICAgICBUaGlzIGhhcHBlbnMgZXZlbiBhZnRlciBmYWlsaW5nIHRvIGFwcGx5IHBhdGNoZXMgYmVjYXVzZSBvdGhlcndpc2UgXG4gICAgICB5YXJuLmxvY2sgYW5kIHBhY2thZ2UuanNvbiBtaWdodCBnZXQgb3V0IG9mIHN5bmMgd2l0aCBub2RlX21vZHVsZXMsXG4gICAgICB3aGljaCBjYW4gYmUgdmVyeSBjb25mdXNpbmcuXG4gICAgICBcbiAgICAgIC0tZXJyb3Itb24tZmFpbCBpcyAke2NoYWxrLmJvbGQoXCJzd2l0Y2hlZCBvblwiKX0gYnkgZGVmYXVsdCBvbiBDSS5cbiAgICAgIFxuICAgICAgU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9kczMwMC9wYXRjaC1wYWNrYWdlL2lzc3Vlcy84NiBmb3IgYmFja2dyb3VuZC5cbiAgICAgIFxuICAgICR7Y2hhbGsuYm9sZChcIi0tZXJyb3Itb24td2FyblwiKX1cbiAgICBcbiAgICAgIEZvcmNlcyBwYXRjaC1wYWNrYWdlIHRvIGV4aXQgd2l0aCBjb2RlIDEgYWZ0ZXIgd2FybmluZy5cbiAgICAgIFxuICAgICAgU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9kczMwMC9wYXRjaC1wYWNrYWdlL2lzc3Vlcy8zMTQgZm9yIGJhY2tncm91bmQuXG5cbiAgICAke2NoYWxrLmJvbGQoXCItLXJldmVyc2VcIil9XG4gICAgICAgIFxuICAgICAgVW4tYXBwbGllcyBhbGwgcGF0Y2hlcy5cblxuICAgICAgTm90ZSB0aGF0IHRoaXMgd2lsbCBmYWlsIGlmIHRoZSBwYXRjaGVkIGZpbGVzIGhhdmUgY2hhbmdlZCBzaW5jZSBiZWluZ1xuICAgICAgcGF0Y2hlZC4gSW4gdGhhdCBjYXNlLCB5b3UnbGwgcHJvYmFibHkgbmVlZCB0byByZS1pbnN0YWxsICdub2RlX21vZHVsZXMnLlxuXG4gICAgICBUaGlzIG9wdGlvbiB3YXMgYWRkZWQgdG8gaGVscCBwZW9wbGUgdXNpbmcgQ2lyY2xlQ0kgYXZvaWQgYW4gaXNzdWUgYXJvdW5kIGNhY2hpbmdcbiAgICAgIGFuZCBwYXRjaCBmaWxlIHVwZGF0ZXMgKGh0dHBzOi8vZ2l0aHViLmNvbS9kczMwMC9wYXRjaC1wYWNrYWdlL2lzc3Vlcy8zNyksXG4gICAgICBidXQgbWlnaHQgYmUgdXNlZnVsIGluIG90aGVyIGNvbnRleHRzIHRvby5cbiAgICAgIFxuXG4gIDIuIENyZWF0aW5nIHBhdGNoIGZpbGVzXG4gID09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgICAke2NoYWxrLmJvbGQoXCJwYXRjaC1wYWNrYWdlXCIpfSA8cGFja2FnZS1uYW1lPiR7Y2hhbGsuaXRhbGljKFxuICAgIFwiWyA8cGFja2FnZS1uYW1lPl1cIixcbiAgKX1cblxuICBXaGVuIGdpdmVuIHBhY2thZ2UgbmFtZXMgYXMgYXJndW1lbnRzLCBwYXRjaC1wYWNrYWdlIHdpbGwgY3JlYXRlIHBhdGNoIGZpbGVzXG4gIGJhc2VkIG9uIGFueSBjaGFuZ2VzIHlvdSd2ZSBtYWRlIHRvIHRoZSB2ZXJzaW9ucyBpbnN0YWxsZWQgYnkgeWFybi9ucG0uXG5cbiAgT3B0aW9uczpcbiAgXG4gICAgJHtjaGFsay5ib2xkKFwiLS1jcmVhdGUtaXNzdWVcIil9XG4gICAgXG4gICAgICAgRm9yIHBhY2thZ2VzIHdob3NlIHNvdXJjZSBpcyBob3N0ZWQgb24gR2l0SHViIHRoaXMgb3B0aW9uIG9wZW5zIGEgd2ViXG4gICAgICAgYnJvd3NlciB3aXRoIGEgZHJhZnQgaXNzdWUgYmFzZWQgb24geW91ciBkaWZmLlxuXG4gICAgJHtjaGFsay5ib2xkKFwiLS11c2UteWFyblwiKX1cblxuICAgICAgICBCeSBkZWZhdWx0LCBwYXRjaC1wYWNrYWdlIGNoZWNrcyB3aGV0aGVyIHlvdSB1c2UgbnBtIG9yIHlhcm4gYmFzZWQgb25cbiAgICAgICAgd2hpY2ggbG9ja2ZpbGUgeW91IGhhdmUuIElmIHlvdSBoYXZlIGJvdGgsIGl0IHVzZXMgbnBtIGJ5IGRlZmF1bHQuXG4gICAgICAgIFNldCB0aGlzIG9wdGlvbiB0byBvdmVycmlkZSB0aGF0IGRlZmF1bHQgYW5kIGFsd2F5cyB1c2UgeWFybi5cblxuICAgICR7Y2hhbGsuYm9sZChcIi0tZXhjbHVkZSA8cmVnZXhwPlwiKX1cblxuICAgICAgICBJZ25vcmUgcGF0aHMgbWF0Y2hpbmcgdGhlIHJlZ2V4cCB3aGVuIGNyZWF0aW5nIHBhdGNoIGZpbGVzLlxuICAgICAgICBQYXRocyBhcmUgcmVsYXRpdmUgdG8gdGhlIHJvb3QgZGlyIG9mIHRoZSBwYWNrYWdlIHRvIGJlIHBhdGNoZWQuXG5cbiAgICAgICAgRGVmYXVsdDogJ3BhY2thZ2VcXFxcLmpzb24kJ1xuXG4gICAgJHtjaGFsay5ib2xkKFwiLS1pbmNsdWRlIDxyZWdleHA+XCIpfVxuXG4gICAgICAgIE9ubHkgY29uc2lkZXIgcGF0aHMgbWF0Y2hpbmcgdGhlIHJlZ2V4cCB3aGVuIGNyZWF0aW5nIHBhdGNoIGZpbGVzLlxuICAgICAgICBQYXRocyBhcmUgcmVsYXRpdmUgdG8gdGhlIHJvb3QgZGlyIG9mIHRoZSBwYWNrYWdlIHRvIGJlIHBhdGNoZWQuXG5cbiAgICAgICAgRGVmYXVsdCAnLionXG5cbiAgICAke2NoYWxrLmJvbGQoXCItLWNhc2Utc2Vuc2l0aXZlLXBhdGgtZmlsdGVyaW5nXCIpfVxuXG4gICAgICAgIE1ha2UgcmVnZXhwcyB1c2VkIGluIC0taW5jbHVkZSBvciAtLWV4Y2x1ZGUgZmlsdGVycyBjYXNlLXNlbnNpdGl2ZS5cbiAgICBcbiAgICAke2NoYWxrLmJvbGQoXCItLXBhdGNoLWRpclwiKX1cblxuICAgICAgICBTcGVjaWZ5IHRoZSBuYW1lIGZvciB0aGUgZGlyZWN0b3J5IGluIHdoaWNoIHRvIHB1dCB0aGUgcGF0Y2ggZmlsZXMuXG5gKVxufVxuIl19 |
---|