create-expo-stack 2.10.5-next.08640a3 → 2.10.5-next.0aee640
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 +50 -50
- package/build/cli.js +51 -21
- package/build/commands/create-expo-stack.js +364 -320
- package/build/templates/packages/tamagui/components/Button.tsx.ejs +5 -11
- package/build/templates/packages/tamagui/tamagui.config.ts.ejs +25 -24
- package/build/utilities/bumpVersion.js +6 -6
- package/build/utilities/clearNavigationPackages.js +2 -2
- package/build/utilities/clearStylingPackages.js +2 -2
- package/build/utilities/configStorage.js +88 -31
- package/build/utilities/configureProjectFiles.js +83 -96
- package/build/utilities/copyBaseAssets.js +36 -4
- package/build/utilities/generateProjectFiles.js +16 -16
- package/build/utilities/getPackageManager.js +7 -7
- package/build/utilities/printOutput.js +211 -156
- package/build/utilities/renderTitle.js +62 -22
- package/build/utilities/runCLI.js +393 -334
- package/build/utilities/runEasConfigure.js +106 -61
- package/build/utilities/runIgnite.js +45 -9
- package/build/utilities/systemCommand.js +48 -11
- package/build/utilities/usePackage.js +2 -2
- package/build/utilities/validateProjectName.js +64 -27
- package/package.json +1 -2
- package/build/types/utilities/configAnalytics.d.ts +0 -17
- package/build/utilities/configAnalytics.js +0 -70
|
@@ -1,16 +1,10 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { forwardRef } from 'react';
|
|
2
|
+
import { Button as TButton, ButtonText } from '../tamagui.config';
|
|
3
3
|
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
type ButtonProps = {
|
|
7
|
-
title: string;
|
|
8
|
-
} & ComponentProps<typeof TButton>;
|
|
9
|
-
|
|
10
|
-
export const Button = forwardRef<TamaguiElement, ButtonProps>(({ title, ...tButtonProps }, ref) => {
|
|
4
|
+
export const Button = forwardRef<TouchableOpacity, ButtonProps>(({ onPress, title }, ref) => {
|
|
11
5
|
return (
|
|
12
|
-
<TButton
|
|
13
|
-
{title}
|
|
6
|
+
<TButton onPress={onPress}>
|
|
7
|
+
<ButtonText>{title}</ButtonText>
|
|
14
8
|
</TButton>
|
|
15
9
|
);
|
|
16
10
|
});
|
|
@@ -4,7 +4,7 @@ import { createMedia } from "@tamagui/react-native-media-driver";
|
|
|
4
4
|
import { shorthands } from "@tamagui/shorthands";
|
|
5
5
|
import { themes, tokens } from "@tamagui/themes";
|
|
6
6
|
<% if (props.navigationPackage?.type === "navigation") { %>
|
|
7
|
-
import { createTamagui, styled, SizableText, H1, YStack
|
|
7
|
+
import { createTamagui, styled, SizableText, H1, YStack } from "tamagui";
|
|
8
8
|
<% } else { %>
|
|
9
9
|
import { createTamagui } from "tamagui";
|
|
10
10
|
<% } %>
|
|
@@ -54,32 +54,33 @@ const bodyFont = createInterFont();
|
|
|
54
54
|
color: '#38434D',
|
|
55
55
|
size: '$9',
|
|
56
56
|
});
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
57
|
+
<% } %>
|
|
58
|
+
<% if (props.navigationPackage?.options.type === "stack") { %>
|
|
59
|
+
export const Button = styled(YStack, {
|
|
60
|
+
alignItems: 'center',
|
|
61
|
+
backgroundColor: '#6366F1',
|
|
62
|
+
borderRadius: 28,
|
|
61
63
|
hoverStyle: {
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
backgroundColor: '#5a5fcf',
|
|
66
|
-
},
|
|
64
|
+
backgroundColor: '#5a5fcf',
|
|
65
|
+
},
|
|
66
|
+
justifyContent: 'center',
|
|
67
67
|
maxWidth: 500,
|
|
68
|
+
padding: 16,
|
|
69
|
+
shadowColor: '#000',
|
|
70
|
+
shadowOffset: {
|
|
71
|
+
height: 2,
|
|
72
|
+
width: 0,
|
|
73
|
+
},
|
|
74
|
+
shadowOpacity: 0.25,
|
|
75
|
+
shadowRadius: 3.84,
|
|
76
|
+
});
|
|
68
77
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
shadowOpacity: 0.25,
|
|
76
|
-
shadowRadius: 3.84,
|
|
77
|
-
|
|
78
|
-
// Button text
|
|
79
|
-
color: '#FFFFFF',
|
|
80
|
-
fontWeight: '600', // Is not passed down to the text. Probably a bug in Tamagui: https://github.com/tamagui/tamagui/issues/1156#issuecomment-1802594930
|
|
81
|
-
fontSize: 16,
|
|
82
|
-
});
|
|
78
|
+
export const ButtonText = styled(SizableText, {
|
|
79
|
+
color: '#FFFFFF',
|
|
80
|
+
fontSize: 16,
|
|
81
|
+
fontWeight: '600',
|
|
82
|
+
textAlign: 'center',
|
|
83
|
+
});
|
|
83
84
|
<% } %>
|
|
84
85
|
|
|
85
86
|
const config = createTamagui({
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
|
|
3
|
+
var child_process_1 = require("child_process");
|
|
4
4
|
function bumpVersion(type) {
|
|
5
5
|
if (['major', 'minor', 'patch'].includes(type)) {
|
|
6
6
|
try {
|
|
7
|
-
(0, child_process_1.execSync)(
|
|
8
|
-
console.log(
|
|
7
|
+
(0, child_process_1.execSync)("npm version ".concat(type), { stdio: 'inherit' });
|
|
8
|
+
console.log("".concat(type.charAt(0).toUpperCase() + type.slice(1), " version bumped successfully."));
|
|
9
9
|
}
|
|
10
10
|
catch (error) {
|
|
11
|
-
console.error(
|
|
11
|
+
console.error("Error bumping the ".concat(type, " version:"), error);
|
|
12
12
|
}
|
|
13
13
|
}
|
|
14
14
|
else {
|
|
@@ -16,6 +16,6 @@ function bumpVersion(type) {
|
|
|
16
16
|
}
|
|
17
17
|
}
|
|
18
18
|
// Get the argument from the command line
|
|
19
|
-
|
|
19
|
+
var versionType = process.argv[2];
|
|
20
20
|
bumpVersion(versionType);
|
|
21
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
21
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVtcFZlcnNpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbGl0aWVzL2J1bXBWZXJzaW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsK0NBQXlDO0FBRXpDLFNBQVMsV0FBVyxDQUFDLElBQVk7SUFDL0IsSUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDL0MsSUFBSSxDQUFDO1lBQ0gsSUFBQSx3QkFBUSxFQUFDLHNCQUFlLElBQUksQ0FBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7WUFDdEQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsa0NBQStCLENBQUMsQ0FBQztRQUM5RixDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE9BQU8sQ0FBQyxLQUFLLENBQUMsNEJBQXFCLElBQUksY0FBVyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzdELENBQUM7SUFDSCxDQUFDO1NBQU0sQ0FBQztRQUNOLE9BQU8sQ0FBQyxLQUFLLENBQUMsZ0VBQWdFLENBQUMsQ0FBQztJQUNsRixDQUFDO0FBQ0gsQ0FBQztBQUVELHlDQUF5QztBQUN6QyxJQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3BDLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQyJ9
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
function clearNavigationPackages(cliResults) {
|
|
4
|
-
|
|
4
|
+
var stylingPackageIndex = cliResults.packages.findIndex(function (p) { return p.type === 'navigation'; });
|
|
5
5
|
if (stylingPackageIndex !== -1) {
|
|
6
6
|
cliResults.packages.splice(stylingPackageIndex, 1);
|
|
7
7
|
}
|
|
8
8
|
return cliResults;
|
|
9
9
|
}
|
|
10
10
|
exports.default = clearNavigationPackages;
|
|
11
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
11
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xlYXJOYXZpZ2F0aW9uUGFja2FnZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbGl0aWVzL2NsZWFyTmF2aWdhdGlvblBhY2thZ2VzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBRUEsU0FBd0IsdUJBQXVCLENBQUMsVUFBc0I7SUFDcEUsSUFBTSxtQkFBbUIsR0FBRyxVQUFVLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxVQUFDLENBQUMsSUFBSyxPQUFBLENBQUMsQ0FBQyxJQUFJLEtBQUssWUFBWSxFQUF2QixDQUF1QixDQUFDLENBQUM7SUFDMUYsSUFBSSxtQkFBbUIsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQy9CLFVBQVUsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLG1CQUFtQixFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFDRCxPQUFPLFVBQVUsQ0FBQztBQUNwQixDQUFDO0FBTkQsMENBTUMifQ==
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
function clearStylingPackages(cliResults) {
|
|
4
|
-
|
|
4
|
+
var stylingPackageIndex = cliResults.packages.findIndex(function (p) { return p.type === 'styling'; });
|
|
5
5
|
if (stylingPackageIndex !== -1) {
|
|
6
6
|
cliResults.packages.splice(stylingPackageIndex, 1);
|
|
7
7
|
}
|
|
8
8
|
return cliResults;
|
|
9
9
|
}
|
|
10
10
|
exports.default = clearStylingPackages;
|
|
11
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
11
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xlYXJTdHlsaW5nUGFja2FnZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbGl0aWVzL2NsZWFyU3R5bGluZ1BhY2thZ2VzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBRUEsU0FBd0Isb0JBQW9CLENBQUMsVUFBc0I7SUFDakUsSUFBTSxtQkFBbUIsR0FBRyxVQUFVLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxVQUFDLENBQUMsSUFBSyxPQUFBLENBQUMsQ0FBQyxJQUFJLEtBQUssU0FBUyxFQUFwQixDQUFvQixDQUFDLENBQUM7SUFDdkYsSUFBSSxtQkFBbUIsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQy9CLFVBQVUsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLG1CQUFtQixFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFDRCxPQUFPLFVBQVUsQ0FBQztBQUNwQixDQUFDO0FBTkQsdUNBTUMifQ==
|
|
@@ -8,43 +8,100 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
8
8
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
9
|
});
|
|
10
10
|
};
|
|
11
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
12
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
13
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
14
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
15
|
+
function step(op) {
|
|
16
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
17
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
18
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
19
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
20
|
+
switch (op[0]) {
|
|
21
|
+
case 0: case 1: t = op; break;
|
|
22
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
23
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
24
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
25
|
+
default:
|
|
26
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
27
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
28
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
29
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
30
|
+
if (t[2]) _.ops.pop();
|
|
31
|
+
_.trys.pop(); continue;
|
|
32
|
+
}
|
|
33
|
+
op = body.call(thisArg, _);
|
|
34
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
35
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
36
|
+
}
|
|
37
|
+
};
|
|
11
38
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
39
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
40
|
};
|
|
14
41
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
42
|
exports.loadConfigs = exports.saveConfig = void 0;
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
43
|
+
var fs_1 = require("fs");
|
|
44
|
+
var path_1 = __importDefault(require("path"));
|
|
45
|
+
var os_1 = __importDefault(require("os"));
|
|
46
|
+
var CONFIG_DIR = path_1.default.join(os_1.default.homedir(), '.create-expo-stack');
|
|
47
|
+
var CONFIG_FILE = path_1.default.join(CONFIG_DIR, 'configurations.json');
|
|
48
|
+
var ensureConfigDirExists = function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
49
|
+
var error_1;
|
|
50
|
+
return __generator(this, function (_a) {
|
|
51
|
+
switch (_a.label) {
|
|
52
|
+
case 0:
|
|
53
|
+
_a.trys.push([0, 2, , 3]);
|
|
54
|
+
return [4 /*yield*/, fs_1.promises.mkdir(CONFIG_DIR, { recursive: true })];
|
|
55
|
+
case 1:
|
|
56
|
+
_a.sent();
|
|
57
|
+
return [3 /*break*/, 3];
|
|
58
|
+
case 2:
|
|
59
|
+
error_1 = _a.sent();
|
|
60
|
+
if (error_1.code !== 'EEXIST') {
|
|
61
|
+
throw error_1;
|
|
62
|
+
}
|
|
63
|
+
return [3 /*break*/, 3];
|
|
64
|
+
case 3: return [2 /*return*/];
|
|
28
65
|
}
|
|
29
|
-
}
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
66
|
+
});
|
|
67
|
+
}); };
|
|
68
|
+
var saveConfig = function (config) { return __awaiter(void 0, void 0, void 0, function () {
|
|
69
|
+
var configs;
|
|
70
|
+
return __generator(this, function (_a) {
|
|
71
|
+
switch (_a.label) {
|
|
72
|
+
case 0: return [4 /*yield*/, ensureConfigDirExists()];
|
|
73
|
+
case 1:
|
|
74
|
+
_a.sent();
|
|
75
|
+
return [4 /*yield*/, (0, exports.loadConfigs)()];
|
|
76
|
+
case 2:
|
|
77
|
+
configs = _a.sent();
|
|
78
|
+
return [4 /*yield*/, fs_1.promises.writeFile(CONFIG_FILE, JSON.stringify(configs, null, 2))];
|
|
79
|
+
case 3:
|
|
80
|
+
_a.sent();
|
|
81
|
+
return [2 /*return*/];
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
}); };
|
|
36
85
|
exports.saveConfig = saveConfig;
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
86
|
+
var loadConfigs = function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
87
|
+
var data, error_2;
|
|
88
|
+
return __generator(this, function (_a) {
|
|
89
|
+
switch (_a.label) {
|
|
90
|
+
case 0:
|
|
91
|
+
_a.trys.push([0, 2, , 3]);
|
|
92
|
+
return [4 /*yield*/, fs_1.promises.readFile(CONFIG_FILE, 'utf8')];
|
|
93
|
+
case 1:
|
|
94
|
+
data = _a.sent();
|
|
95
|
+
return [2 /*return*/, JSON.parse(data)];
|
|
96
|
+
case 2:
|
|
97
|
+
error_2 = _a.sent();
|
|
98
|
+
if (error_2.code === 'ENOENT') {
|
|
99
|
+
return [2 /*return*/, []];
|
|
100
|
+
}
|
|
101
|
+
throw error_2;
|
|
102
|
+
case 3: return [2 /*return*/];
|
|
45
103
|
}
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
});
|
|
104
|
+
});
|
|
105
|
+
}); };
|
|
49
106
|
exports.loadConfigs = loadConfigs;
|
|
50
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
107
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnU3RvcmFnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlsaXRpZXMvY29uZmlnU3RvcmFnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSx5QkFBb0M7QUFDcEMsOENBQXdCO0FBRXhCLDBDQUFvQjtBQUVwQixJQUFNLFVBQVUsR0FBRyxjQUFJLENBQUMsSUFBSSxDQUFDLFlBQUUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO0FBQ2pFLElBQU0sV0FBVyxHQUFHLGNBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLHFCQUFxQixDQUFDLENBQUM7QUFPakUsSUFBTSxxQkFBcUIsR0FBRzs7Ozs7O2dCQUUxQixxQkFBTSxhQUFFLENBQUMsS0FBSyxDQUFDLFVBQVUsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFBOztnQkFBL0MsU0FBK0MsQ0FBQzs7OztnQkFFaEQsSUFBSSxPQUFLLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO29CQUM1QixNQUFNLE9BQUssQ0FBQztnQkFDZCxDQUFDOzs7OztLQUVKLENBQUM7QUFFSyxJQUFNLFVBQVUsR0FBRyxVQUFPLE1BQWlCOzs7O29CQUNoRCxxQkFBTSxxQkFBcUIsRUFBRSxFQUFBOztnQkFBN0IsU0FBNkIsQ0FBQztnQkFDZCxxQkFBTSxJQUFBLG1CQUFXLEdBQUUsRUFBQTs7Z0JBQTdCLE9BQU8sR0FBRyxTQUFtQjtnQkFDbkMscUJBQU0sYUFBRSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUE7O2dCQUFqRSxTQUFpRSxDQUFDOzs7O0tBQ25FLENBQUM7QUFKVyxRQUFBLFVBQVUsY0FJckI7QUFFSyxJQUFNLFdBQVcsR0FBRzs7Ozs7O2dCQUVWLHFCQUFNLGFBQUUsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxFQUFBOztnQkFBN0MsSUFBSSxHQUFHLFNBQXNDO2dCQUNuRCxzQkFBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFDOzs7Z0JBRXhCLElBQUksT0FBSyxDQUFDLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQztvQkFDNUIsc0JBQU8sRUFBRSxFQUFDO2dCQUNaLENBQUM7Z0JBQ0QsTUFBTSxPQUFLLENBQUM7Ozs7S0FFZixDQUFDO0FBVlcsUUFBQSxXQUFXLGVBVXRCIn0=
|