diff --git a/.obsidian/community-plugins.json b/.obsidian/community-plugins.json index 79a7bc2a..beed2a7c 100644 --- a/.obsidian/community-plugins.json +++ b/.obsidian/community-plugins.json @@ -57,5 +57,6 @@ "weather-fetcher", "obsidian-wikipedia", "obsidian-read-it-later", - "obsidian-full-calendar" + "obsidian-full-calendar", + "digitalgarden" ] \ No newline at end of file diff --git a/.obsidian/plugins/digitalgarden/data.json b/.obsidian/plugins/digitalgarden/data.json new file mode 100644 index 00000000..9b2ff017 --- /dev/null +++ b/.obsidian/plugins/digitalgarden/data.json @@ -0,0 +1,7 @@ +{ + "githubRepo": "digitalgarden", + "githubToken": "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", + "githubUserName": "melbv", + "gardenBaseUrl": "", + "prHistory": [] +} \ No newline at end of file diff --git a/.obsidian/plugins/digitalgarden/main.js b/.obsidian/plugins/digitalgarden/main.js new file mode 100644 index 00000000..d9fd516e --- /dev/null +++ b/.obsidian/plugins/digitalgarden/main.js @@ -0,0 +1,3572 @@ +/* +THIS IS A GENERATED/BUNDLED FILE BY ESBUILD +if you want to view the source, please visit the github repository of this plugin +*/ + +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getOwnPropSymbols = Object.getOwnPropertySymbols; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __propIsEnum = Object.prototype.propertyIsEnumerable; +var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; +var __spreadValues = (a, b) => { + for (var prop in b || (b = {})) + if (__hasOwnProp.call(b, prop)) + __defNormalProp(a, prop, b[prop]); + if (__getOwnPropSymbols) + for (var prop of __getOwnPropSymbols(b)) { + if (__propIsEnum.call(b, prop)) + __defNormalProp(a, prop, b[prop]); + } + return a; +}; +var __markAsModule = (target) => __defProp(target, "__esModule", { value: true }); +var __objRest = (source, exclude) => { + var target = {}; + for (var prop in source) + if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0) + target[prop] = source[prop]; + if (source != null && __getOwnPropSymbols) + for (var prop of __getOwnPropSymbols(source)) { + if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop)) + target[prop] = source[prop]; + } + return target; +}; +var __commonJS = (cb, mod) => function __require() { + return mod || (0, cb[Object.keys(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; +}; +var __export = (target, all) => { + __markAsModule(target); + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __reExport = (target, module2, desc) => { + if (module2 && typeof module2 === "object" || typeof module2 === "function") { + for (let key of __getOwnPropNames(module2)) + if (!__hasOwnProp.call(target, key) && key !== "default") + __defProp(target, key, { get: () => module2[key], enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable }); + } + return target; +}; +var __toModule = (module2) => { + return __reExport(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", module2 && module2.__esModule && "default" in module2 ? { get: () => module2.default, enumerable: true } : { value: module2, enumerable: true })), module2); +}; +var __async = (__this, __arguments, generator) => { + return new Promise((resolve, reject) => { + var fulfilled = (value) => { + try { + step(generator.next(value)); + } catch (e) { + reject(e); + } + }; + var rejected = (value) => { + try { + step(generator.throw(value)); + } catch (e) { + reject(e); + } + }; + var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected); + step((generator = generator.apply(__this, __arguments)).next()); + }); +}; + +// node_modules/before-after-hook/lib/register.js +var require_register = __commonJS({ + "node_modules/before-after-hook/lib/register.js"(exports, module2) { + module2.exports = register; + function register(state, name, method, options) { + if (typeof method !== "function") { + throw new Error("method for before hook must be a function"); + } + if (!options) { + options = {}; + } + if (Array.isArray(name)) { + return name.reverse().reduce(function(callback, name2) { + return register.bind(null, state, name2, callback, options); + }, method)(); + } + return Promise.resolve().then(function() { + if (!state.registry[name]) { + return method(options); + } + return state.registry[name].reduce(function(method2, registered) { + return registered.hook.bind(null, method2, options); + }, method)(); + }); + } + } +}); + +// node_modules/before-after-hook/lib/add.js +var require_add = __commonJS({ + "node_modules/before-after-hook/lib/add.js"(exports, module2) { + module2.exports = addHook; + function addHook(state, kind, name, hook2) { + var orig = hook2; + if (!state.registry[name]) { + state.registry[name] = []; + } + if (kind === "before") { + hook2 = function(method, options) { + return Promise.resolve().then(orig.bind(null, options)).then(method.bind(null, options)); + }; + } + if (kind === "after") { + hook2 = function(method, options) { + var result; + return Promise.resolve().then(method.bind(null, options)).then(function(result_) { + result = result_; + return orig(result, options); + }).then(function() { + return result; + }); + }; + } + if (kind === "error") { + hook2 = function(method, options) { + return Promise.resolve().then(method.bind(null, options)).catch(function(error) { + return orig(error, options); + }); + }; + } + state.registry[name].push({ + hook: hook2, + orig + }); + } + } +}); + +// node_modules/before-after-hook/lib/remove.js +var require_remove = __commonJS({ + "node_modules/before-after-hook/lib/remove.js"(exports, module2) { + module2.exports = removeHook; + function removeHook(state, name, method) { + if (!state.registry[name]) { + return; + } + var index = state.registry[name].map(function(registered) { + return registered.orig; + }).indexOf(method); + if (index === -1) { + return; + } + state.registry[name].splice(index, 1); + } + } +}); + +// node_modules/before-after-hook/index.js +var require_before_after_hook = __commonJS({ + "node_modules/before-after-hook/index.js"(exports, module2) { + var register = require_register(); + var addHook = require_add(); + var removeHook = require_remove(); + var bind = Function.bind; + var bindable = bind.bind(bind); + function bindApi(hook2, state, name) { + var removeHookRef = bindable(removeHook, null).apply(null, name ? [state, name] : [state]); + hook2.api = { remove: removeHookRef }; + hook2.remove = removeHookRef; + ["before", "error", "after", "wrap"].forEach(function(kind) { + var args = name ? [state, kind, name] : [state, kind]; + hook2[kind] = hook2.api[kind] = bindable(addHook, null).apply(null, args); + }); + } + function HookSingular() { + var singularHookName = "h"; + var singularHookState = { + registry: {} + }; + var singularHook = register.bind(null, singularHookState, singularHookName); + bindApi(singularHook, singularHookState, singularHookName); + return singularHook; + } + function HookCollection() { + var state = { + registry: {} + }; + var hook2 = register.bind(null, state); + bindApi(hook2, state); + return hook2; + } + var collectionHookDeprecationMessageDisplayed = false; + function Hook() { + if (!collectionHookDeprecationMessageDisplayed) { + console.warn('[before-after-hook]: "Hook()" repurposing warning, use "Hook.Collection()". Read more: https://git.io/upgrade-before-after-hook-to-1.4'); + collectionHookDeprecationMessageDisplayed = true; + } + return HookCollection(); + } + Hook.Singular = HookSingular.bind(); + Hook.Collection = HookCollection.bind(); + module2.exports = Hook; + module2.exports.Hook = Hook; + module2.exports.Singular = Hook.Singular; + module2.exports.Collection = Hook.Collection; + } +}); + +// node_modules/node-fetch/browser.js +var require_browser = __commonJS({ + "node_modules/node-fetch/browser.js"(exports, module2) { + "use strict"; + var getGlobal = function() { + if (typeof self !== "undefined") { + return self; + } + if (typeof window !== "undefined") { + return window; + } + if (typeof global2 !== "undefined") { + return global2; + } + throw new Error("unable to locate global object"); + }; + var global2 = getGlobal(); + module2.exports = exports = global2.fetch; + if (global2.fetch) { + exports.default = global2.fetch.bind(global2); + } + exports.Headers = global2.Headers; + exports.Request = global2.Request; + exports.Response = global2.Response; + } +}); + +// node_modules/wrappy/wrappy.js +var require_wrappy = __commonJS({ + "node_modules/wrappy/wrappy.js"(exports, module2) { + module2.exports = wrappy; + function wrappy(fn, cb) { + if (fn && cb) + return wrappy(fn)(cb); + if (typeof fn !== "function") + throw new TypeError("need wrapper function"); + Object.keys(fn).forEach(function(k) { + wrapper[k] = fn[k]; + }); + return wrapper; + function wrapper() { + var args = new Array(arguments.length); + for (var i = 0; i < args.length; i++) { + args[i] = arguments[i]; + } + var ret = fn.apply(this, args); + var cb2 = args[args.length - 1]; + if (typeof ret === "function" && ret !== cb2) { + Object.keys(cb2).forEach(function(k) { + ret[k] = cb2[k]; + }); + } + return ret; + } + } + } +}); + +// node_modules/once/once.js +var require_once = __commonJS({ + "node_modules/once/once.js"(exports, module2) { + var wrappy = require_wrappy(); + module2.exports = wrappy(once2); + module2.exports.strict = wrappy(onceStrict); + once2.proto = once2(function() { + Object.defineProperty(Function.prototype, "once", { + value: function() { + return once2(this); + }, + configurable: true + }); + Object.defineProperty(Function.prototype, "onceStrict", { + value: function() { + return onceStrict(this); + }, + configurable: true + }); + }); + function once2(fn) { + var f = function() { + if (f.called) + return f.value; + f.called = true; + return f.value = fn.apply(this, arguments); + }; + f.called = false; + return f; + } + function onceStrict(fn) { + var f = function() { + if (f.called) + throw new Error(f.onceError); + f.called = true; + return f.value = fn.apply(this, arguments); + }; + var name = fn.name || "Function wrapped with `once`"; + f.onceError = name + " shouldn't be called more than once"; + f.called = false; + return f; + } + } +}); + +// node_modules/escape-string-regexp/index.js +var require_escape_string_regexp = __commonJS({ + "node_modules/escape-string-regexp/index.js"(exports, module2) { + "use strict"; + module2.exports = (string) => { + if (typeof string !== "string") { + throw new TypeError("Expected a string"); + } + return string.replace(/[|\\{}()[\]^$+*?.]/g, "\\$&").replace(/-/g, "\\x2d"); + }; + } +}); + +// node_modules/lodash.deburr/index.js +var require_lodash = __commonJS({ + "node_modules/lodash.deburr/index.js"(exports, module2) { + var INFINITY = 1 / 0; + var symbolTag = "[object Symbol]"; + var reLatin = /[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g; + var rsComboMarksRange = "\\u0300-\\u036f\\ufe20-\\ufe23"; + var rsComboSymbolsRange = "\\u20d0-\\u20f0"; + var rsCombo = "[" + rsComboMarksRange + rsComboSymbolsRange + "]"; + var reComboMark = RegExp(rsCombo, "g"); + var deburredLetters = { + "\xC0": "A", + "\xC1": "A", + "\xC2": "A", + "\xC3": "A", + "\xC4": "A", + "\xC5": "A", + "\xE0": "a", + "\xE1": "a", + "\xE2": "a", + "\xE3": "a", + "\xE4": "a", + "\xE5": "a", + "\xC7": "C", + "\xE7": "c", + "\xD0": "D", + "\xF0": "d", + "\xC8": "E", + "\xC9": "E", + "\xCA": "E", + "\xCB": "E", + "\xE8": "e", + "\xE9": "e", + "\xEA": "e", + "\xEB": "e", + "\xCC": "I", + "\xCD": "I", + "\xCE": "I", + "\xCF": "I", + "\xEC": "i", + "\xED": "i", + "\xEE": "i", + "\xEF": "i", + "\xD1": "N", + "\xF1": "n", + "\xD2": "O", + "\xD3": "O", + "\xD4": "O", + "\xD5": "O", + "\xD6": "O", + "\xD8": "O", + "\xF2": "o", + "\xF3": "o", + "\xF4": "o", + "\xF5": "o", + "\xF6": "o", + "\xF8": "o", + "\xD9": "U", + "\xDA": "U", + "\xDB": "U", + "\xDC": "U", + "\xF9": "u", + "\xFA": "u", + "\xFB": "u", + "\xFC": "u", + "\xDD": "Y", + "\xFD": "y", + "\xFF": "y", + "\xC6": "Ae", + "\xE6": "ae", + "\xDE": "Th", + "\xFE": "th", + "\xDF": "ss", + "\u0100": "A", + "\u0102": "A", + "\u0104": "A", + "\u0101": "a", + "\u0103": "a", + "\u0105": "a", + "\u0106": "C", + "\u0108": "C", + "\u010A": "C", + "\u010C": "C", + "\u0107": "c", + "\u0109": "c", + "\u010B": "c", + "\u010D": "c", + "\u010E": "D", + "\u0110": "D", + "\u010F": "d", + "\u0111": "d", + "\u0112": "E", + "\u0114": "E", + "\u0116": "E", + "\u0118": "E", + "\u011A": "E", + "\u0113": "e", + "\u0115": "e", + "\u0117": "e", + "\u0119": "e", + "\u011B": "e", + "\u011C": "G", + "\u011E": "G", + "\u0120": "G", + "\u0122": "G", + "\u011D": "g", + "\u011F": "g", + "\u0121": "g", + "\u0123": "g", + "\u0124": "H", + "\u0126": "H", + "\u0125": "h", + "\u0127": "h", + "\u0128": "I", + "\u012A": "I", + "\u012C": "I", + "\u012E": "I", + "\u0130": "I", + "\u0129": "i", + "\u012B": "i", + "\u012D": "i", + "\u012F": "i", + "\u0131": "i", + "\u0134": "J", + "\u0135": "j", + "\u0136": "K", + "\u0137": "k", + "\u0138": "k", + "\u0139": "L", + "\u013B": "L", + "\u013D": "L", + "\u013F": "L", + "\u0141": "L", + "\u013A": "l", + "\u013C": "l", + "\u013E": "l", + "\u0140": "l", + "\u0142": "l", + "\u0143": "N", + "\u0145": "N", + "\u0147": "N", + "\u014A": "N", + "\u0144": "n", + "\u0146": "n", + "\u0148": "n", + "\u014B": "n", + "\u014C": "O", + "\u014E": "O", + "\u0150": "O", + "\u014D": "o", + "\u014F": "o", + "\u0151": "o", + "\u0154": "R", + "\u0156": "R", + "\u0158": "R", + "\u0155": "r", + "\u0157": "r", + "\u0159": "r", + "\u015A": "S", + "\u015C": "S", + "\u015E": "S", + "\u0160": "S", + "\u015B": "s", + "\u015D": "s", + "\u015F": "s", + "\u0161": "s", + "\u0162": "T", + "\u0164": "T", + "\u0166": "T", + "\u0163": "t", + "\u0165": "t", + "\u0167": "t", + "\u0168": "U", + "\u016A": "U", + "\u016C": "U", + "\u016E": "U", + "\u0170": "U", + "\u0172": "U", + "\u0169": "u", + "\u016B": "u", + "\u016D": "u", + "\u016F": "u", + "\u0171": "u", + "\u0173": "u", + "\u0174": "W", + "\u0175": "w", + "\u0176": "Y", + "\u0177": "y", + "\u0178": "Y", + "\u0179": "Z", + "\u017B": "Z", + "\u017D": "Z", + "\u017A": "z", + "\u017C": "z", + "\u017E": "z", + "\u0132": "IJ", + "\u0133": "ij", + "\u0152": "Oe", + "\u0153": "oe", + "\u0149": "'n", + "\u017F": "ss" + }; + var freeGlobal = typeof global == "object" && global && global.Object === Object && global; + var freeSelf = typeof self == "object" && self && self.Object === Object && self; + var root = freeGlobal || freeSelf || Function("return this")(); + function basePropertyOf(object) { + return function(key) { + return object == null ? void 0 : object[key]; + }; + } + var deburrLetter = basePropertyOf(deburredLetters); + var objectProto = Object.prototype; + var objectToString = objectProto.toString; + var Symbol = root.Symbol; + var symbolProto = Symbol ? Symbol.prototype : void 0; + var symbolToString = symbolProto ? symbolProto.toString : void 0; + function baseToString(value) { + if (typeof value == "string") { + return value; + } + if (isSymbol(value)) { + return symbolToString ? symbolToString.call(value) : ""; + } + var result = value + ""; + return result == "0" && 1 / value == -INFINITY ? "-0" : result; + } + function isObjectLike(value) { + return !!value && typeof value == "object"; + } + function isSymbol(value) { + return typeof value == "symbol" || isObjectLike(value) && objectToString.call(value) == symbolTag; + } + function toString(value) { + return value == null ? "" : baseToString(value); + } + function deburr(string) { + string = toString(string); + return string && string.replace(reLatin, deburrLetter).replace(reComboMark, ""); + } + module2.exports = deburr; + } +}); + +// node_modules/@sindresorhus/transliterate/node_modules/escape-string-regexp/index.js +var require_escape_string_regexp2 = __commonJS({ + "node_modules/@sindresorhus/transliterate/node_modules/escape-string-regexp/index.js"(exports, module2) { + "use strict"; + var matchOperatorsRegex = /[|\\{}()[\]^$+*?.-]/g; + module2.exports = (string) => { + if (typeof string !== "string") { + throw new TypeError("Expected a string"); + } + return string.replace(matchOperatorsRegex, "\\$&"); + }; + } +}); + +// node_modules/@sindresorhus/transliterate/replacements.js +var require_replacements = __commonJS({ + "node_modules/@sindresorhus/transliterate/replacements.js"(exports, module2) { + "use strict"; + module2.exports = [ + ["\xDF", "ss"], + ["\xE4", "ae"], + ["\xC4", "Ae"], + ["\xF6", "oe"], + ["\xD6", "Oe"], + ["\xFC", "ue"], + ["\xDC", "Ue"], + ["\xC0", "A"], + ["\xC1", "A"], + ["\xC2", "A"], + ["\xC3", "A"], + ["\xC4", "Ae"], + ["\xC5", "A"], + ["\xC6", "AE"], + ["\xC7", "C"], + ["\xC8", "E"], + ["\xC9", "E"], + ["\xCA", "E"], + ["\xCB", "E"], + ["\xCC", "I"], + ["\xCD", "I"], + ["\xCE", "I"], + ["\xCF", "I"], + ["\xD0", "D"], + ["\xD1", "N"], + ["\xD2", "O"], + ["\xD3", "O"], + ["\xD4", "O"], + ["\xD5", "O"], + ["\xD6", "Oe"], + ["\u0150", "O"], + ["\xD8", "O"], + ["\xD9", "U"], + ["\xDA", "U"], + ["\xDB", "U"], + ["\xDC", "Ue"], + ["\u0170", "U"], + ["\xDD", "Y"], + ["\xDE", "TH"], + ["\xDF", "ss"], + ["\xE0", "a"], + ["\xE1", "a"], + ["\xE2", "a"], + ["\xE3", "a"], + ["\xE4", "ae"], + ["\xE5", "a"], + ["\xE6", "ae"], + ["\xE7", "c"], + ["\xE8", "e"], + ["\xE9", "e"], + ["\xEA", "e"], + ["\xEB", "e"], + ["\xEC", "i"], + ["\xED", "i"], + ["\xEE", "i"], + ["\xEF", "i"], + ["\xF0", "d"], + ["\xF1", "n"], + ["\xF2", "o"], + ["\xF3", "o"], + ["\xF4", "o"], + ["\xF5", "o"], + ["\xF6", "oe"], + ["\u0151", "o"], + ["\xF8", "o"], + ["\xF9", "u"], + ["\xFA", "u"], + ["\xFB", "u"], + ["\xFC", "ue"], + ["\u0171", "u"], + ["\xFD", "y"], + ["\xFE", "th"], + ["\xFF", "y"], + ["\u1E9E", "SS"], + ["\xE0", "a"], + ["\xC0", "A"], + ["\xE1", "a"], + ["\xC1", "A"], + ["\xE2", "a"], + ["\xC2", "A"], + ["\xE3", "a"], + ["\xC3", "A"], + ["\xE8", "e"], + ["\xC8", "E"], + ["\xE9", "e"], + ["\xC9", "E"], + ["\xEA", "e"], + ["\xCA", "E"], + ["\xEC", "i"], + ["\xCC", "I"], + ["\xED", "i"], + ["\xCD", "I"], + ["\xF2", "o"], + ["\xD2", "O"], + ["\xF3", "o"], + ["\xD3", "O"], + ["\xF4", "o"], + ["\xD4", "O"], + ["\xF5", "o"], + ["\xD5", "O"], + ["\xF9", "u"], + ["\xD9", "U"], + ["\xFA", "u"], + ["\xDA", "U"], + ["\xFD", "y"], + ["\xDD", "Y"], + ["\u0103", "a"], + ["\u0102", "A"], + ["\u0110", "D"], + ["\u0111", "d"], + ["\u0129", "i"], + ["\u0128", "I"], + ["\u0169", "u"], + ["\u0168", "U"], + ["\u01A1", "o"], + ["\u01A0", "O"], + ["\u01B0", "u"], + ["\u01AF", "U"], + ["\u1EA1", "a"], + ["\u1EA0", "A"], + ["\u1EA3", "a"], + ["\u1EA2", "A"], + ["\u1EA5", "a"], + ["\u1EA4", "A"], + ["\u1EA7", "a"], + ["\u1EA6", "A"], + ["\u1EA9", "a"], + ["\u1EA8", "A"], + ["\u1EAB", "a"], + ["\u1EAA", "A"], + ["\u1EAD", "a"], + ["\u1EAC", "A"], + ["\u1EAF", "a"], + ["\u1EAE", "A"], + ["\u1EB1", "a"], + ["\u1EB0", "A"], + ["\u1EB3", "a"], + ["\u1EB2", "A"], + ["\u1EB5", "a"], + ["\u1EB4", "A"], + ["\u1EB7", "a"], + ["\u1EB6", "A"], + ["\u1EB9", "e"], + ["\u1EB8", "E"], + ["\u1EBB", "e"], + ["\u1EBA", "E"], + ["\u1EBD", "e"], + ["\u1EBC", "E"], + ["\u1EBF", "e"], + ["\u1EBE", "E"], + ["\u1EC1", "e"], + ["\u1EC0", "E"], + ["\u1EC3", "e"], + ["\u1EC2", "E"], + ["\u1EC5", "e"], + ["\u1EC4", "E"], + ["\u1EC7", "e"], + ["\u1EC6", "E"], + ["\u1EC9", "i"], + ["\u1EC8", "I"], + ["\u1ECB", "i"], + ["\u1ECA", "I"], + ["\u1ECD", "o"], + ["\u1ECC", "O"], + ["\u1ECF", "o"], + ["\u1ECE", "O"], + ["\u1ED1", "o"], + ["\u1ED0", "O"], + ["\u1ED3", "o"], + ["\u1ED2", "O"], + ["\u1ED5", "o"], + ["\u1ED4", "O"], + ["\u1ED7", "o"], + ["\u1ED6", "O"], + ["\u1ED9", "o"], + ["\u1ED8", "O"], + ["\u1EDB", "o"], + ["\u1EDA", "O"], + ["\u1EDD", "o"], + ["\u1EDC", "O"], + ["\u1EDF", "o"], + ["\u1EDE", "O"], + ["\u1EE1", "o"], + ["\u1EE0", "O"], + ["\u1EE3", "o"], + ["\u1EE2", "O"], + ["\u1EE5", "u"], + ["\u1EE4", "U"], + ["\u1EE7", "u"], + ["\u1EE6", "U"], + ["\u1EE9", "u"], + ["\u1EE8", "U"], + ["\u1EEB", "u"], + ["\u1EEA", "U"], + ["\u1EED", "u"], + ["\u1EEC", "U"], + ["\u1EEF", "u"], + ["\u1EEE", "U"], + ["\u1EF1", "u"], + ["\u1EF0", "U"], + ["\u1EF3", "y"], + ["\u1EF2", "Y"], + ["\u1EF5", "y"], + ["\u1EF4", "Y"], + ["\u1EF7", "y"], + ["\u1EF6", "Y"], + ["\u1EF9", "y"], + ["\u1EF8", "Y"], + ["\u0621", "e"], + ["\u0622", "a"], + ["\u0623", "a"], + ["\u0624", "w"], + ["\u0625", "i"], + ["\u0626", "y"], + ["\u0627", "a"], + ["\u0628", "b"], + ["\u0629", "t"], + ["\u062A", "t"], + ["\u062B", "th"], + ["\u062C", "j"], + ["\u062D", "h"], + ["\u062E", "kh"], + ["\u062F", "d"], + ["\u0630", "dh"], + ["\u0631", "r"], + ["\u0632", "z"], + ["\u0633", "s"], + ["\u0634", "sh"], + ["\u0635", "s"], + ["\u0636", "d"], + ["\u0637", "t"], + ["\u0638", "z"], + ["\u0639", "e"], + ["\u063A", "gh"], + ["\u0640", "_"], + ["\u0641", "f"], + ["\u0642", "q"], + ["\u0643", "k"], + ["\u0644", "l"], + ["\u0645", "m"], + ["\u0646", "n"], + ["\u0647", "h"], + ["\u0648", "w"], + ["\u0649", "a"], + ["\u064A", "y"], + ["\u064E\u200E", "a"], + ["\u064F", "u"], + ["\u0650\u200E", "i"], + ["\u0660", "0"], + ["\u0661", "1"], + ["\u0662", "2"], + ["\u0663", "3"], + ["\u0664", "4"], + ["\u0665", "5"], + ["\u0666", "6"], + ["\u0667", "7"], + ["\u0668", "8"], + ["\u0669", "9"], + ["\u0686", "ch"], + ["\u06A9", "k"], + ["\u06AF", "g"], + ["\u067E", "p"], + ["\u0698", "zh"], + ["\u06CC", "y"], + ["\u06F0", "0"], + ["\u06F1", "1"], + ["\u06F2", "2"], + ["\u06F3", "3"], + ["\u06F4", "4"], + ["\u06F5", "5"], + ["\u06F6", "6"], + ["\u06F7", "7"], + ["\u06F8", "8"], + ["\u06F9", "9"], + ["\u067C", "p"], + ["\u0681", "z"], + ["\u0685", "c"], + ["\u0689", "d"], + ["\uFEAB", "d"], + ["\uFEAD", "r"], + ["\u0693", "r"], + ["\uFEAF", "z"], + ["\u0696", "g"], + ["\u069A", "x"], + ["\u06AB", "g"], + ["\u06BC", "n"], + ["\u06C0", "e"], + ["\u06D0", "e"], + ["\u06CD", "ai"], + ["\u0679", "t"], + ["\u0688", "d"], + ["\u0691", "r"], + ["\u06BA", "n"], + ["\u06C1", "h"], + ["\u06BE", "h"], + ["\u06D2", "e"], + ["\u0410", "A"], + ["\u0430", "a"], + ["\u0411", "B"], + ["\u0431", "b"], + ["\u0412", "V"], + ["\u0432", "v"], + ["\u0413", "G"], + ["\u0433", "g"], + ["\u0414", "D"], + ["\u0434", "d"], + ["\u0415", "E"], + ["\u0435", "e"], + ["\u0416", "Zh"], + ["\u0436", "zh"], + ["\u0417", "Z"], + ["\u0437", "z"], + ["\u0418", "I"], + ["\u0438", "i"], + ["\u0419", "J"], + ["\u0439", "j"], + ["\u041A", "K"], + ["\u043A", "k"], + ["\u041B", "L"], + ["\u043B", "l"], + ["\u041C", "M"], + ["\u043C", "m"], + ["\u041D", "N"], + ["\u043D", "n"], + ["\u041E", "O"], + ["\u043E", "o"], + ["\u041F", "P"], + ["\u043F", "p"], + ["\u0420", "R"], + ["\u0440", "r"], + ["\u0421", "S"], + ["\u0441", "s"], + ["\u0422", "T"], + ["\u0442", "t"], + ["\u0423", "U"], + ["\u0443", "u"], + ["\u0424", "F"], + ["\u0444", "f"], + ["\u0425", "H"], + ["\u0445", "h"], + ["\u0426", "Cz"], + ["\u0446", "cz"], + ["\u0427", "Ch"], + ["\u0447", "ch"], + ["\u0428", "Sh"], + ["\u0448", "sh"], + ["\u0429", "Shh"], + ["\u0449", "shh"], + ["\u042A", ""], + ["\u044A", ""], + ["\u042B", "Y"], + ["\u044B", "y"], + ["\u042C", ""], + ["\u044C", ""], + ["\u042D", "E"], + ["\u044D", "e"], + ["\u042E", "Yu"], + ["\u044E", "yu"], + ["\u042F", "Ya"], + ["\u044F", "ya"], + ["\u0401", "Yo"], + ["\u0451", "yo"], + ["\u0103", "a"], + ["\u0102", "A"], + ["\u0219", "s"], + ["\u0218", "S"], + ["\u021B", "t"], + ["\u021A", "T"], + ["\u0163", "t"], + ["\u0162", "T"], + ["\u015F", "s"], + ["\u015E", "S"], + ["\xE7", "c"], + ["\xC7", "C"], + ["\u011F", "g"], + ["\u011E", "G"], + ["\u0131", "i"], + ["\u0130", "I"], + ["\u0561", "a"], + ["\u0531", "A"], + ["\u0562", "b"], + ["\u0532", "B"], + ["\u0563", "g"], + ["\u0533", "G"], + ["\u0564", "d"], + ["\u0534", "D"], + ["\u0565", "ye"], + ["\u0535", "Ye"], + ["\u0566", "z"], + ["\u0536", "Z"], + ["\u0567", "e"], + ["\u0537", "E"], + ["\u0568", "y"], + ["\u0538", "Y"], + ["\u0569", "t"], + ["\u0539", "T"], + ["\u056A", "zh"], + ["\u053A", "Zh"], + ["\u056B", "i"], + ["\u053B", "I"], + ["\u056C", "l"], + ["\u053C", "L"], + ["\u056D", "kh"], + ["\u053D", "Kh"], + ["\u056E", "ts"], + ["\u053E", "Ts"], + ["\u056F", "k"], + ["\u053F", "K"], + ["\u0570", "h"], + ["\u0540", "H"], + ["\u0571", "dz"], + ["\u0541", "Dz"], + ["\u0572", "gh"], + ["\u0542", "Gh"], + ["\u0573", "tch"], + ["\u0543", "Tch"], + ["\u0574", "m"], + ["\u0544", "M"], + ["\u0575", "y"], + ["\u0545", "Y"], + ["\u0576", "n"], + ["\u0546", "N"], + ["\u0577", "sh"], + ["\u0547", "Sh"], + ["\u0578", "vo"], + ["\u0548", "Vo"], + ["\u0579", "ch"], + ["\u0549", "Ch"], + ["\u057A", "p"], + ["\u054A", "P"], + ["\u057B", "j"], + ["\u054B", "J"], + ["\u057C", "r"], + ["\u054C", "R"], + ["\u057D", "s"], + ["\u054D", "S"], + ["\u057E", "v"], + ["\u054E", "V"], + ["\u057F", "t"], + ["\u054F", "T"], + ["\u0580", "r"], + ["\u0550", "R"], + ["\u0581", "c"], + ["\u0551", "C"], + ["\u0578\u0582", "u"], + ["\u0548\u0552", "U"], + ["\u0548\u0582", "U"], + ["\u0583", "p"], + ["\u0553", "P"], + ["\u0584", "q"], + ["\u0554", "Q"], + ["\u0585", "o"], + ["\u0555", "O"], + ["\u0586", "f"], + ["\u0556", "F"], + ["\u0587", "yev"], + ["\u10D0", "a"], + ["\u10D1", "b"], + ["\u10D2", "g"], + ["\u10D3", "d"], + ["\u10D4", "e"], + ["\u10D5", "v"], + ["\u10D6", "z"], + ["\u10D7", "t"], + ["\u10D8", "i"], + ["\u10D9", "k"], + ["\u10DA", "l"], + ["\u10DB", "m"], + ["\u10DC", "n"], + ["\u10DD", "o"], + ["\u10DE", "p"], + ["\u10DF", "zh"], + ["\u10E0", "r"], + ["\u10E1", "s"], + ["\u10E2", "t"], + ["\u10E3", "u"], + ["\u10E4", "ph"], + ["\u10E5", "q"], + ["\u10E6", "gh"], + ["\u10E7", "k"], + ["\u10E8", "sh"], + ["\u10E9", "ch"], + ["\u10EA", "ts"], + ["\u10EB", "dz"], + ["\u10EC", "ts"], + ["\u10ED", "tch"], + ["\u10EE", "kh"], + ["\u10EF", "j"], + ["\u10F0", "h"], + ["\u010D", "c"], + ["\u010F", "d"], + ["\u011B", "e"], + ["\u0148", "n"], + ["\u0159", "r"], + ["\u0161", "s"], + ["\u0165", "t"], + ["\u016F", "u"], + ["\u017E", "z"], + ["\u010C", "C"], + ["\u010E", "D"], + ["\u011A", "E"], + ["\u0147", "N"], + ["\u0158", "R"], + ["\u0160", "S"], + ["\u0164", "T"], + ["\u016E", "U"], + ["\u017D", "Z"], + ["\u0780", "h"], + ["\u0781", "sh"], + ["\u0782", "n"], + ["\u0783", "r"], + ["\u0784", "b"], + ["\u0785", "lh"], + ["\u0786", "k"], + ["\u0787", "a"], + ["\u0788", "v"], + ["\u0789", "m"], + ["\u078A", "f"], + ["\u078B", "dh"], + ["\u078C", "th"], + ["\u078D", "l"], + ["\u078E", "g"], + ["\u078F", "gn"], + ["\u0790", "s"], + ["\u0791", "d"], + ["\u0792", "z"], + ["\u0793", "t"], + ["\u0794", "y"], + ["\u0795", "p"], + ["\u0796", "j"], + ["\u0797", "ch"], + ["\u0798", "tt"], + ["\u0799", "hh"], + ["\u079A", "kh"], + ["\u079B", "th"], + ["\u079C", "z"], + ["\u079D", "sh"], + ["\u079E", "s"], + ["\u079F", "d"], + ["\u07A0", "t"], + ["\u07A1", "z"], + ["\u07A2", "a"], + ["\u07A3", "gh"], + ["\u07A4", "q"], + ["\u07A5", "w"], + ["\u07A6", "a"], + ["\u07A7", "aa"], + ["\u07A8", "i"], + ["\u07A9", "ee"], + ["\u07AA", "u"], + ["\u07AB", "oo"], + ["\u07AC", "e"], + ["\u07AD", "ey"], + ["\u07AE", "o"], + ["\u07AF", "oa"], + ["\u07B0", ""], + ["\u03B1", "a"], + ["\u03B2", "v"], + ["\u03B3", "g"], + ["\u03B4", "d"], + ["\u03B5", "e"], + ["\u03B6", "z"], + ["\u03B7", "i"], + ["\u03B8", "th"], + ["\u03B9", "i"], + ["\u03BA", "k"], + ["\u03BB", "l"], + ["\u03BC", "m"], + ["\u03BD", "n"], + ["\u03BE", "ks"], + ["\u03BF", "o"], + ["\u03C0", "p"], + ["\u03C1", "r"], + ["\u03C3", "s"], + ["\u03C4", "t"], + ["\u03C5", "y"], + ["\u03C6", "f"], + ["\u03C7", "x"], + ["\u03C8", "ps"], + ["\u03C9", "o"], + ["\u03AC", "a"], + ["\u03AD", "e"], + ["\u03AF", "i"], + ["\u03CC", "o"], + ["\u03CD", "y"], + ["\u03AE", "i"], + ["\u03CE", "o"], + ["\u03C2", "s"], + ["\u03CA", "i"], + ["\u03B0", "y"], + ["\u03CB", "y"], + ["\u0390", "i"], + ["\u0391", "A"], + ["\u0392", "B"], + ["\u0393", "G"], + ["\u0394", "D"], + ["\u0395", "E"], + ["\u0396", "Z"], + ["\u0397", "I"], + ["\u0398", "TH"], + ["\u0399", "I"], + ["\u039A", "K"], + ["\u039B", "L"], + ["\u039C", "M"], + ["\u039D", "N"], + ["\u039E", "KS"], + ["\u039F", "O"], + ["\u03A0", "P"], + ["\u03A1", "R"], + ["\u03A3", "S"], + ["\u03A4", "T"], + ["\u03A5", "Y"], + ["\u03A6", "F"], + ["\u03A7", "X"], + ["\u03A8", "PS"], + ["\u03A9", "O"], + ["\u0386", "A"], + ["\u0388", "E"], + ["\u038A", "I"], + ["\u038C", "O"], + ["\u038E", "Y"], + ["\u0389", "I"], + ["\u038F", "O"], + ["\u03AA", "I"], + ["\u03AB", "Y"], + ["\u0101", "a"], + ["\u0113", "e"], + ["\u0123", "g"], + ["\u012B", "i"], + ["\u0137", "k"], + ["\u013C", "l"], + ["\u0146", "n"], + ["\u016B", "u"], + ["\u0100", "A"], + ["\u0112", "E"], + ["\u0122", "G"], + ["\u012A", "I"], + ["\u0136", "K"], + ["\u013B", "L"], + ["\u0145", "N"], + ["\u016A", "U"], + ["\u010D", "c"], + ["\u0161", "s"], + ["\u017E", "z"], + ["\u010C", "C"], + ["\u0160", "S"], + ["\u017D", "Z"], + ["\u0105", "a"], + ["\u010D", "c"], + ["\u0119", "e"], + ["\u0117", "e"], + ["\u012F", "i"], + ["\u0161", "s"], + ["\u0173", "u"], + ["\u016B", "u"], + ["\u017E", "z"], + ["\u0104", "A"], + ["\u010C", "C"], + ["\u0118", "E"], + ["\u0116", "E"], + ["\u012E", "I"], + ["\u0160", "S"], + ["\u0172", "U"], + ["\u016A", "U"], + ["\u040C", "Kj"], + ["\u045C", "kj"], + ["\u0409", "Lj"], + ["\u0459", "lj"], + ["\u040A", "Nj"], + ["\u045A", "nj"], + ["\u0422\u0441", "Ts"], + ["\u0442\u0441", "ts"], + ["\u0105", "a"], + ["\u0107", "c"], + ["\u0119", "e"], + ["\u0142", "l"], + ["\u0144", "n"], + ["\u015B", "s"], + ["\u017A", "z"], + ["\u017C", "z"], + ["\u0104", "A"], + ["\u0106", "C"], + ["\u0118", "E"], + ["\u0141", "L"], + ["\u0143", "N"], + ["\u015A", "S"], + ["\u0179", "Z"], + ["\u017B", "Z"], + ["\u0404", "Ye"], + ["\u0406", "I"], + ["\u0407", "Yi"], + ["\u0490", "G"], + ["\u0454", "ye"], + ["\u0456", "i"], + ["\u0457", "yi"], + ["\u0491", "g"] + ]; + } +}); + +// node_modules/@sindresorhus/transliterate/index.js +var require_transliterate = __commonJS({ + "node_modules/@sindresorhus/transliterate/index.js"(exports, module2) { + "use strict"; + var deburr = require_lodash(); + var escapeStringRegexp = require_escape_string_regexp2(); + var builtinReplacements = require_replacements(); + var doCustomReplacements = (string, replacements) => { + for (const [key, value] of replacements) { + string = string.replace(new RegExp(escapeStringRegexp(key), "g"), value); + } + return string; + }; + module2.exports = (string, options) => { + if (typeof string !== "string") { + throw new TypeError(`Expected a string, got \`${typeof string}\``); + } + options = __spreadValues({ + customReplacements: [] + }, options); + const customReplacements = new Map([ + ...builtinReplacements, + ...options.customReplacements + ]); + string = string.normalize(); + string = doCustomReplacements(string, customReplacements); + string = deburr(string); + return string; + }; + } +}); + +// node_modules/@sindresorhus/slugify/overridable-replacements.js +var require_overridable_replacements = __commonJS({ + "node_modules/@sindresorhus/slugify/overridable-replacements.js"(exports, module2) { + "use strict"; + module2.exports = [ + ["&", " and "], + ["\u{1F984}", " unicorn "], + ["\u2665", " love "] + ]; + } +}); + +// node_modules/@sindresorhus/slugify/index.js +var require_slugify = __commonJS({ + "node_modules/@sindresorhus/slugify/index.js"(exports, module2) { + "use strict"; + var escapeStringRegexp = require_escape_string_regexp(); + var transliterate = require_transliterate(); + var builtinOverridableReplacements = require_overridable_replacements(); + var decamelize = (string) => { + return string.replace(/([A-Z]{2,})(\d+)/g, "$1 $2").replace(/([a-z\d]+)([A-Z]{2,})/g, "$1 $2").replace(/([a-z\d])([A-Z])/g, "$1 $2").replace(/([A-Z]+)([A-Z][a-z\d]+)/g, "$1 $2"); + }; + var removeMootSeparators = (string, separator) => { + const escapedSeparator = escapeStringRegexp(separator); + return string.replace(new RegExp(`${escapedSeparator}{2,}`, "g"), separator).replace(new RegExp(`^${escapedSeparator}|${escapedSeparator}$`, "g"), ""); + }; + var slugify2 = (string, options) => { + if (typeof string !== "string") { + throw new TypeError(`Expected a string, got \`${typeof string}\``); + } + options = __spreadValues({ + separator: "-", + lowercase: true, + decamelize: true, + customReplacements: [], + preserveLeadingUnderscore: false + }, options); + const shouldPrependUnderscore = options.preserveLeadingUnderscore && string.startsWith("_"); + const customReplacements = new Map([ + ...builtinOverridableReplacements, + ...options.customReplacements + ]); + string = transliterate(string, { customReplacements }); + if (options.decamelize) { + string = decamelize(string); + } + let patternSlug = /[^a-zA-Z\d]+/g; + if (options.lowercase) { + string = string.toLowerCase(); + patternSlug = /[^a-z\d]+/g; + } + string = string.replace(patternSlug, options.separator); + string = string.replace(/\\/g, ""); + if (options.separator) { + string = removeMootSeparators(string, options.separator); + } + if (shouldPrependUnderscore) { + string = `_${string}`; + } + return string; + }; + var counter = () => { + const occurrences = new Map(); + const countable = (string, options) => { + string = slugify2(string, options); + if (!string) { + return ""; + } + const stringLower = string.toLowerCase(); + const numberless = occurrences.get(stringLower.replace(/(?:-\d+?)+?$/, "")) || 0; + const counter2 = occurrences.get(stringLower); + occurrences.set(stringLower, typeof counter2 === "number" ? counter2 + 1 : 1); + const newCounter = occurrences.get(stringLower) || 2; + if (newCounter >= 2 || numberless > 2) { + string = `${string}-${newCounter}`; + } + return string; + }; + countable.reset = () => { + occurrences.clear(); + }; + return countable; + }; + module2.exports = slugify2; + module2.exports.counter = counter; + } +}); + +// node_modules/crypto-js/core.js +var require_core = __commonJS({ + "node_modules/crypto-js/core.js"(exports, module2) { + (function(root, factory) { + if (typeof exports === "object") { + module2.exports = exports = factory(); + } else if (typeof define === "function" && define.amd) { + define([], factory); + } else { + root.CryptoJS = factory(); + } + })(exports, function() { + var CryptoJS = CryptoJS || function(Math2, undefined2) { + var crypto; + if (typeof window !== "undefined" && window.crypto) { + crypto = window.crypto; + } + if (typeof self !== "undefined" && self.crypto) { + crypto = self.crypto; + } + if (typeof globalThis !== "undefined" && globalThis.crypto) { + crypto = globalThis.crypto; + } + if (!crypto && typeof window !== "undefined" && window.msCrypto) { + crypto = window.msCrypto; + } + if (!crypto && typeof global !== "undefined" && global.crypto) { + crypto = global.crypto; + } + if (!crypto && typeof require === "function") { + try { + crypto = require("crypto"); + } catch (err) { + } + } + var cryptoSecureRandomInt = function() { + if (crypto) { + if (typeof crypto.getRandomValues === "function") { + try { + return crypto.getRandomValues(new Uint32Array(1))[0]; + } catch (err) { + } + } + if (typeof crypto.randomBytes === "function") { + try { + return crypto.randomBytes(4).readInt32LE(); + } catch (err) { + } + } + } + throw new Error("Native crypto module could not be used to get secure random number."); + }; + var create = Object.create || function() { + function F() { + } + return function(obj) { + var subtype; + F.prototype = obj; + subtype = new F(); + F.prototype = null; + return subtype; + }; + }(); + var C = {}; + var C_lib = C.lib = {}; + var Base = C_lib.Base = function() { + return { + extend: function(overrides) { + var subtype = create(this); + if (overrides) { + subtype.mixIn(overrides); + } + if (!subtype.hasOwnProperty("init") || this.init === subtype.init) { + subtype.init = function() { + subtype.$super.init.apply(this, arguments); + }; + } + subtype.init.prototype = subtype; + subtype.$super = this; + return subtype; + }, + create: function() { + var instance = this.extend(); + instance.init.apply(instance, arguments); + return instance; + }, + init: function() { + }, + mixIn: function(properties) { + for (var propertyName in properties) { + if (properties.hasOwnProperty(propertyName)) { + this[propertyName] = properties[propertyName]; + } + } + if (properties.hasOwnProperty("toString")) { + this.toString = properties.toString; + } + }, + clone: function() { + return this.init.prototype.extend(this); + } + }; + }(); + var WordArray = C_lib.WordArray = Base.extend({ + init: function(words, sigBytes) { + words = this.words = words || []; + if (sigBytes != undefined2) { + this.sigBytes = sigBytes; + } else { + this.sigBytes = words.length * 4; + } + }, + toString: function(encoder) { + return (encoder || Hex).stringify(this); + }, + concat: function(wordArray) { + var thisWords = this.words; + var thatWords = wordArray.words; + var thisSigBytes = this.sigBytes; + var thatSigBytes = wordArray.sigBytes; + this.clamp(); + if (thisSigBytes % 4) { + for (var i = 0; i < thatSigBytes; i++) { + var thatByte = thatWords[i >>> 2] >>> 24 - i % 4 * 8 & 255; + thisWords[thisSigBytes + i >>> 2] |= thatByte << 24 - (thisSigBytes + i) % 4 * 8; + } + } else { + for (var j = 0; j < thatSigBytes; j += 4) { + thisWords[thisSigBytes + j >>> 2] = thatWords[j >>> 2]; + } + } + this.sigBytes += thatSigBytes; + return this; + }, + clamp: function() { + var words = this.words; + var sigBytes = this.sigBytes; + words[sigBytes >>> 2] &= 4294967295 << 32 - sigBytes % 4 * 8; + words.length = Math2.ceil(sigBytes / 4); + }, + clone: function() { + var clone = Base.clone.call(this); + clone.words = this.words.slice(0); + return clone; + }, + random: function(nBytes) { + var words = []; + for (var i = 0; i < nBytes; i += 4) { + words.push(cryptoSecureRandomInt()); + } + return new WordArray.init(words, nBytes); + } + }); + var C_enc = C.enc = {}; + var Hex = C_enc.Hex = { + stringify: function(wordArray) { + var words = wordArray.words; + var sigBytes = wordArray.sigBytes; + var hexChars = []; + for (var i = 0; i < sigBytes; i++) { + var bite = words[i >>> 2] >>> 24 - i % 4 * 8 & 255; + hexChars.push((bite >>> 4).toString(16)); + hexChars.push((bite & 15).toString(16)); + } + return hexChars.join(""); + }, + parse: function(hexStr) { + var hexStrLength = hexStr.length; + var words = []; + for (var i = 0; i < hexStrLength; i += 2) { + words[i >>> 3] |= parseInt(hexStr.substr(i, 2), 16) << 24 - i % 8 * 4; + } + return new WordArray.init(words, hexStrLength / 2); + } + }; + var Latin1 = C_enc.Latin1 = { + stringify: function(wordArray) { + var words = wordArray.words; + var sigBytes = wordArray.sigBytes; + var latin1Chars = []; + for (var i = 0; i < sigBytes; i++) { + var bite = words[i >>> 2] >>> 24 - i % 4 * 8 & 255; + latin1Chars.push(String.fromCharCode(bite)); + } + return latin1Chars.join(""); + }, + parse: function(latin1Str) { + var latin1StrLength = latin1Str.length; + var words = []; + for (var i = 0; i < latin1StrLength; i++) { + words[i >>> 2] |= (latin1Str.charCodeAt(i) & 255) << 24 - i % 4 * 8; + } + return new WordArray.init(words, latin1StrLength); + } + }; + var Utf8 = C_enc.Utf8 = { + stringify: function(wordArray) { + try { + return decodeURIComponent(escape(Latin1.stringify(wordArray))); + } catch (e) { + throw new Error("Malformed UTF-8 data"); + } + }, + parse: function(utf8Str) { + return Latin1.parse(unescape(encodeURIComponent(utf8Str))); + } + }; + var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm = Base.extend({ + reset: function() { + this._data = new WordArray.init(); + this._nDataBytes = 0; + }, + _append: function(data) { + if (typeof data == "string") { + data = Utf8.parse(data); + } + this._data.concat(data); + this._nDataBytes += data.sigBytes; + }, + _process: function(doFlush) { + var processedWords; + var data = this._data; + var dataWords = data.words; + var dataSigBytes = data.sigBytes; + var blockSize = this.blockSize; + var blockSizeBytes = blockSize * 4; + var nBlocksReady = dataSigBytes / blockSizeBytes; + if (doFlush) { + nBlocksReady = Math2.ceil(nBlocksReady); + } else { + nBlocksReady = Math2.max((nBlocksReady | 0) - this._minBufferSize, 0); + } + var nWordsReady = nBlocksReady * blockSize; + var nBytesReady = Math2.min(nWordsReady * 4, dataSigBytes); + if (nWordsReady) { + for (var offset = 0; offset < nWordsReady; offset += blockSize) { + this._doProcessBlock(dataWords, offset); + } + processedWords = dataWords.splice(0, nWordsReady); + data.sigBytes -= nBytesReady; + } + return new WordArray.init(processedWords, nBytesReady); + }, + clone: function() { + var clone = Base.clone.call(this); + clone._data = this._data.clone(); + return clone; + }, + _minBufferSize: 0 + }); + var Hasher = C_lib.Hasher = BufferedBlockAlgorithm.extend({ + cfg: Base.extend(), + init: function(cfg) { + this.cfg = this.cfg.extend(cfg); + this.reset(); + }, + reset: function() { + BufferedBlockAlgorithm.reset.call(this); + this._doReset(); + }, + update: function(messageUpdate) { + this._append(messageUpdate); + this._process(); + return this; + }, + finalize: function(messageUpdate) { + if (messageUpdate) { + this._append(messageUpdate); + } + var hash = this._doFinalize(); + return hash; + }, + blockSize: 512 / 32, + _createHelper: function(hasher) { + return function(message, cfg) { + return new hasher.init(cfg).finalize(message); + }; + }, + _createHmacHelper: function(hasher) { + return function(message, key) { + return new C_algo.HMAC.init(hasher, key).finalize(message); + }; + } + }); + var C_algo = C.algo = {}; + return C; + }(Math); + return CryptoJS; + }); + } +}); + +// node_modules/crypto-js/sha1.js +var require_sha1 = __commonJS({ + "node_modules/crypto-js/sha1.js"(exports, module2) { + (function(root, factory) { + if (typeof exports === "object") { + module2.exports = exports = factory(require_core()); + } else if (typeof define === "function" && define.amd) { + define(["./core"], factory); + } else { + factory(root.CryptoJS); + } + })(exports, function(CryptoJS) { + (function() { + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var Hasher = C_lib.Hasher; + var C_algo = C.algo; + var W = []; + var SHA1 = C_algo.SHA1 = Hasher.extend({ + _doReset: function() { + this._hash = new WordArray.init([ + 1732584193, + 4023233417, + 2562383102, + 271733878, + 3285377520 + ]); + }, + _doProcessBlock: function(M, offset) { + var H = this._hash.words; + var a = H[0]; + var b = H[1]; + var c = H[2]; + var d = H[3]; + var e = H[4]; + for (var i = 0; i < 80; i++) { + if (i < 16) { + W[i] = M[offset + i] | 0; + } else { + var n = W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16]; + W[i] = n << 1 | n >>> 31; + } + var t = (a << 5 | a >>> 27) + e + W[i]; + if (i < 20) { + t += (b & c | ~b & d) + 1518500249; + } else if (i < 40) { + t += (b ^ c ^ d) + 1859775393; + } else if (i < 60) { + t += (b & c | b & d | c & d) - 1894007588; + } else { + t += (b ^ c ^ d) - 899497514; + } + e = d; + d = c; + c = b << 30 | b >>> 2; + b = a; + a = t; + } + H[0] = H[0] + a | 0; + H[1] = H[1] + b | 0; + H[2] = H[2] + c | 0; + H[3] = H[3] + d | 0; + H[4] = H[4] + e | 0; + }, + _doFinalize: function() { + var data = this._data; + var dataWords = data.words; + var nBitsTotal = this._nDataBytes * 8; + var nBitsLeft = data.sigBytes * 8; + dataWords[nBitsLeft >>> 5] |= 128 << 24 - nBitsLeft % 32; + dataWords[(nBitsLeft + 64 >>> 9 << 4) + 14] = Math.floor(nBitsTotal / 4294967296); + dataWords[(nBitsLeft + 64 >>> 9 << 4) + 15] = nBitsTotal; + data.sigBytes = dataWords.length * 4; + this._process(); + return this._hash; + }, + clone: function() { + var clone = Hasher.clone.call(this); + clone._hash = this._hash.clone(); + return clone; + } + }); + C.SHA1 = Hasher._createHelper(SHA1); + C.HmacSHA1 = Hasher._createHmacHelper(SHA1); + })(); + return CryptoJS.SHA1; + }); + } +}); + +// main.ts +__export(exports, { + default: () => DigitalGarden +}); +var import_obsidian5 = __toModule(require("obsidian")); + +// Publisher.ts +var import_obsidian2 = __toModule(require("obsidian")); + +// node_modules/js-base64/base64.mjs +var version = "3.7.2"; +var VERSION = version; +var _hasatob = typeof atob === "function"; +var _hasbtoa = typeof btoa === "function"; +var _hasBuffer = typeof Buffer === "function"; +var _TD = typeof TextDecoder === "function" ? new TextDecoder() : void 0; +var _TE = typeof TextEncoder === "function" ? new TextEncoder() : void 0; +var b64ch = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; +var b64chs = Array.prototype.slice.call(b64ch); +var b64tab = ((a) => { + let tab = {}; + a.forEach((c, i) => tab[c] = i); + return tab; +})(b64chs); +var b64re = /^(?:[A-Za-z\d+\/]{4})*?(?:[A-Za-z\d+\/]{2}(?:==)?|[A-Za-z\d+\/]{3}=?)?$/; +var _fromCC = String.fromCharCode.bind(String); +var _U8Afrom = typeof Uint8Array.from === "function" ? Uint8Array.from.bind(Uint8Array) : (it, fn = (x) => x) => new Uint8Array(Array.prototype.slice.call(it, 0).map(fn)); +var _mkUriSafe = (src) => src.replace(/=/g, "").replace(/[+\/]/g, (m0) => m0 == "+" ? "-" : "_"); +var _tidyB64 = (s) => s.replace(/[^A-Za-z0-9\+\/]/g, ""); +var btoaPolyfill = (bin) => { + let u32, c0, c1, c2, asc = ""; + const pad = bin.length % 3; + for (let i = 0; i < bin.length; ) { + if ((c0 = bin.charCodeAt(i++)) > 255 || (c1 = bin.charCodeAt(i++)) > 255 || (c2 = bin.charCodeAt(i++)) > 255) + throw new TypeError("invalid character found"); + u32 = c0 << 16 | c1 << 8 | c2; + asc += b64chs[u32 >> 18 & 63] + b64chs[u32 >> 12 & 63] + b64chs[u32 >> 6 & 63] + b64chs[u32 & 63]; + } + return pad ? asc.slice(0, pad - 3) + "===".substring(pad) : asc; +}; +var _btoa = _hasbtoa ? (bin) => btoa(bin) : _hasBuffer ? (bin) => Buffer.from(bin, "binary").toString("base64") : btoaPolyfill; +var _fromUint8Array = _hasBuffer ? (u8a) => Buffer.from(u8a).toString("base64") : (u8a) => { + const maxargs = 4096; + let strs = []; + for (let i = 0, l = u8a.length; i < l; i += maxargs) { + strs.push(_fromCC.apply(null, u8a.subarray(i, i + maxargs))); + } + return _btoa(strs.join("")); +}; +var fromUint8Array = (u8a, urlsafe = false) => urlsafe ? _mkUriSafe(_fromUint8Array(u8a)) : _fromUint8Array(u8a); +var cb_utob = (c) => { + if (c.length < 2) { + var cc = c.charCodeAt(0); + return cc < 128 ? c : cc < 2048 ? _fromCC(192 | cc >>> 6) + _fromCC(128 | cc & 63) : _fromCC(224 | cc >>> 12 & 15) + _fromCC(128 | cc >>> 6 & 63) + _fromCC(128 | cc & 63); + } else { + var cc = 65536 + (c.charCodeAt(0) - 55296) * 1024 + (c.charCodeAt(1) - 56320); + return _fromCC(240 | cc >>> 18 & 7) + _fromCC(128 | cc >>> 12 & 63) + _fromCC(128 | cc >>> 6 & 63) + _fromCC(128 | cc & 63); + } +}; +var re_utob = /[\uD800-\uDBFF][\uDC00-\uDFFFF]|[^\x00-\x7F]/g; +var utob = (u) => u.replace(re_utob, cb_utob); +var _encode = _hasBuffer ? (s) => Buffer.from(s, "utf8").toString("base64") : _TE ? (s) => _fromUint8Array(_TE.encode(s)) : (s) => _btoa(utob(s)); +var encode = (src, urlsafe = false) => urlsafe ? _mkUriSafe(_encode(src)) : _encode(src); +var encodeURI2 = (src) => encode(src, true); +var re_btou = /[\xC0-\xDF][\x80-\xBF]|[\xE0-\xEF][\x80-\xBF]{2}|[\xF0-\xF7][\x80-\xBF]{3}/g; +var cb_btou = (cccc) => { + switch (cccc.length) { + case 4: + var cp = (7 & cccc.charCodeAt(0)) << 18 | (63 & cccc.charCodeAt(1)) << 12 | (63 & cccc.charCodeAt(2)) << 6 | 63 & cccc.charCodeAt(3), offset = cp - 65536; + return _fromCC((offset >>> 10) + 55296) + _fromCC((offset & 1023) + 56320); + case 3: + return _fromCC((15 & cccc.charCodeAt(0)) << 12 | (63 & cccc.charCodeAt(1)) << 6 | 63 & cccc.charCodeAt(2)); + default: + return _fromCC((31 & cccc.charCodeAt(0)) << 6 | 63 & cccc.charCodeAt(1)); + } +}; +var btou = (b) => b.replace(re_btou, cb_btou); +var atobPolyfill = (asc) => { + asc = asc.replace(/\s+/g, ""); + if (!b64re.test(asc)) + throw new TypeError("malformed base64."); + asc += "==".slice(2 - (asc.length & 3)); + let u24, bin = "", r1, r2; + for (let i = 0; i < asc.length; ) { + u24 = b64tab[asc.charAt(i++)] << 18 | b64tab[asc.charAt(i++)] << 12 | (r1 = b64tab[asc.charAt(i++)]) << 6 | (r2 = b64tab[asc.charAt(i++)]); + bin += r1 === 64 ? _fromCC(u24 >> 16 & 255) : r2 === 64 ? _fromCC(u24 >> 16 & 255, u24 >> 8 & 255) : _fromCC(u24 >> 16 & 255, u24 >> 8 & 255, u24 & 255); + } + return bin; +}; +var _atob = _hasatob ? (asc) => atob(_tidyB64(asc)) : _hasBuffer ? (asc) => Buffer.from(asc, "base64").toString("binary") : atobPolyfill; +var _toUint8Array = _hasBuffer ? (a) => _U8Afrom(Buffer.from(a, "base64")) : (a) => _U8Afrom(_atob(a), (c) => c.charCodeAt(0)); +var toUint8Array = (a) => _toUint8Array(_unURI(a)); +var _decode = _hasBuffer ? (a) => Buffer.from(a, "base64").toString("utf8") : _TD ? (a) => _TD.decode(_toUint8Array(a)) : (a) => btou(_atob(a)); +var _unURI = (a) => _tidyB64(a.replace(/[-_]/g, (m0) => m0 == "-" ? "+" : "/")); +var decode = (src) => _decode(_unURI(src)); +var isValid = (src) => { + if (typeof src !== "string") + return false; + const s = src.replace(/\s+/g, "").replace(/={0,2}$/, ""); + return !/[^\s0-9a-zA-Z\+/]/.test(s) || !/[^\s0-9a-zA-Z\-_]/.test(s); +}; +var _noEnum = (v) => { + return { + value: v, + enumerable: false, + writable: true, + configurable: true + }; +}; +var extendString = function() { + const _add = (name, body) => Object.defineProperty(String.prototype, name, _noEnum(body)); + _add("fromBase64", function() { + return decode(this); + }); + _add("toBase64", function(urlsafe) { + return encode(this, urlsafe); + }); + _add("toBase64URI", function() { + return encode(this, true); + }); + _add("toBase64URL", function() { + return encode(this, true); + }); + _add("toUint8Array", function() { + return toUint8Array(this); + }); +}; +var extendUint8Array = function() { + const _add = (name, body) => Object.defineProperty(Uint8Array.prototype, name, _noEnum(body)); + _add("toBase64", function(urlsafe) { + return fromUint8Array(this, urlsafe); + }); + _add("toBase64URI", function() { + return fromUint8Array(this, true); + }); + _add("toBase64URL", function() { + return fromUint8Array(this, true); + }); +}; +var extendBuiltins = () => { + extendString(); + extendUint8Array(); +}; +var gBase64 = { + version, + VERSION, + atob: _atob, + atobPolyfill, + btoa: _btoa, + btoaPolyfill, + fromBase64: decode, + toBase64: encode, + encode, + encodeURI: encodeURI2, + encodeURL: encodeURI2, + utob, + btou, + decode, + isValid, + fromUint8Array, + toUint8Array, + extendString, + extendUint8Array, + extendBuiltins +}; + +// node_modules/universal-user-agent/dist-web/index.js +function getUserAgent() { + if (typeof navigator === "object" && "userAgent" in navigator) { + return navigator.userAgent; + } + if (typeof process === "object" && "version" in process) { + return `Node.js/${process.version.substr(1)} (${process.platform}; ${process.arch})`; + } + return ""; +} + +// node_modules/@octokit/core/dist-web/index.js +var import_before_after_hook = __toModule(require_before_after_hook()); + +// node_modules/is-plain-object/dist/is-plain-object.mjs +function isObject(o) { + return Object.prototype.toString.call(o) === "[object Object]"; +} +function isPlainObject(o) { + var ctor, prot; + if (isObject(o) === false) + return false; + ctor = o.constructor; + if (ctor === void 0) + return true; + prot = ctor.prototype; + if (isObject(prot) === false) + return false; + if (prot.hasOwnProperty("isPrototypeOf") === false) { + return false; + } + return true; +} + +// node_modules/@octokit/endpoint/dist-web/index.js +function lowercaseKeys(object) { + if (!object) { + return {}; + } + return Object.keys(object).reduce((newObj, key) => { + newObj[key.toLowerCase()] = object[key]; + return newObj; + }, {}); +} +function mergeDeep(defaults, options) { + const result = Object.assign({}, defaults); + Object.keys(options).forEach((key) => { + if (isPlainObject(options[key])) { + if (!(key in defaults)) + Object.assign(result, { [key]: options[key] }); + else + result[key] = mergeDeep(defaults[key], options[key]); + } else { + Object.assign(result, { [key]: options[key] }); + } + }); + return result; +} +function removeUndefinedProperties(obj) { + for (const key in obj) { + if (obj[key] === void 0) { + delete obj[key]; + } + } + return obj; +} +function merge(defaults, route, options) { + if (typeof route === "string") { + let [method, url] = route.split(" "); + options = Object.assign(url ? { method, url } : { url: method }, options); + } else { + options = Object.assign({}, route); + } + options.headers = lowercaseKeys(options.headers); + removeUndefinedProperties(options); + removeUndefinedProperties(options.headers); + const mergedOptions = mergeDeep(defaults || {}, options); + if (defaults && defaults.mediaType.previews.length) { + mergedOptions.mediaType.previews = defaults.mediaType.previews.filter((preview) => !mergedOptions.mediaType.previews.includes(preview)).concat(mergedOptions.mediaType.previews); + } + mergedOptions.mediaType.previews = mergedOptions.mediaType.previews.map((preview) => preview.replace(/-preview/, "")); + return mergedOptions; +} +function addQueryParameters(url, parameters) { + const separator = /\?/.test(url) ? "&" : "?"; + const names = Object.keys(parameters); + if (names.length === 0) { + return url; + } + return url + separator + names.map((name) => { + if (name === "q") { + return "q=" + parameters.q.split("+").map(encodeURIComponent).join("+"); + } + return `${name}=${encodeURIComponent(parameters[name])}`; + }).join("&"); +} +var urlVariableRegex = /\{[^}]+\}/g; +function removeNonChars(variableName) { + return variableName.replace(/^\W+|\W+$/g, "").split(/,/); +} +function extractUrlVariableNames(url) { + const matches = url.match(urlVariableRegex); + if (!matches) { + return []; + } + return matches.map(removeNonChars).reduce((a, b) => a.concat(b), []); +} +function omit(object, keysToOmit) { + return Object.keys(object).filter((option) => !keysToOmit.includes(option)).reduce((obj, key) => { + obj[key] = object[key]; + return obj; + }, {}); +} +function encodeReserved(str) { + return str.split(/(%[0-9A-Fa-f]{2})/g).map(function(part) { + if (!/%[0-9A-Fa-f]/.test(part)) { + part = encodeURI(part).replace(/%5B/g, "[").replace(/%5D/g, "]"); + } + return part; + }).join(""); +} +function encodeUnreserved(str) { + return encodeURIComponent(str).replace(/[!'()*]/g, function(c) { + return "%" + c.charCodeAt(0).toString(16).toUpperCase(); + }); +} +function encodeValue(operator, value, key) { + value = operator === "+" || operator === "#" ? encodeReserved(value) : encodeUnreserved(value); + if (key) { + return encodeUnreserved(key) + "=" + value; + } else { + return value; + } +} +function isDefined(value) { + return value !== void 0 && value !== null; +} +function isKeyOperator(operator) { + return operator === ";" || operator === "&" || operator === "?"; +} +function getValues(context, operator, key, modifier) { + var value = context[key], result = []; + if (isDefined(value) && value !== "") { + if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") { + value = value.toString(); + if (modifier && modifier !== "*") { + value = value.substring(0, parseInt(modifier, 10)); + } + result.push(encodeValue(operator, value, isKeyOperator(operator) ? key : "")); + } else { + if (modifier === "*") { + if (Array.isArray(value)) { + value.filter(isDefined).forEach(function(value2) { + result.push(encodeValue(operator, value2, isKeyOperator(operator) ? key : "")); + }); + } else { + Object.keys(value).forEach(function(k) { + if (isDefined(value[k])) { + result.push(encodeValue(operator, value[k], k)); + } + }); + } + } else { + const tmp = []; + if (Array.isArray(value)) { + value.filter(isDefined).forEach(function(value2) { + tmp.push(encodeValue(operator, value2)); + }); + } else { + Object.keys(value).forEach(function(k) { + if (isDefined(value[k])) { + tmp.push(encodeUnreserved(k)); + tmp.push(encodeValue(operator, value[k].toString())); + } + }); + } + if (isKeyOperator(operator)) { + result.push(encodeUnreserved(key) + "=" + tmp.join(",")); + } else if (tmp.length !== 0) { + result.push(tmp.join(",")); + } + } + } + } else { + if (operator === ";") { + if (isDefined(value)) { + result.push(encodeUnreserved(key)); + } + } else if (value === "" && (operator === "&" || operator === "?")) { + result.push(encodeUnreserved(key) + "="); + } else if (value === "") { + result.push(""); + } + } + return result; +} +function parseUrl(template) { + return { + expand: expand.bind(null, template) + }; +} +function expand(template, context) { + var operators = ["+", "#", ".", "/", ";", "?", "&"]; + return template.replace(/\{([^\{\}]+)\}|([^\{\}]+)/g, function(_, expression, literal) { + if (expression) { + let operator = ""; + const values = []; + if (operators.indexOf(expression.charAt(0)) !== -1) { + operator = expression.charAt(0); + expression = expression.substr(1); + } + expression.split(/,/g).forEach(function(variable) { + var tmp = /([^:\*]*)(?::(\d+)|(\*))?/.exec(variable); + values.push(getValues(context, operator, tmp[1], tmp[2] || tmp[3])); + }); + if (operator && operator !== "+") { + var separator = ","; + if (operator === "?") { + separator = "&"; + } else if (operator !== "#") { + separator = operator; + } + return (values.length !== 0 ? operator : "") + values.join(separator); + } else { + return values.join(","); + } + } else { + return encodeReserved(literal); + } + }); +} +function parse(options) { + let method = options.method.toUpperCase(); + let url = (options.url || "/").replace(/:([a-z]\w+)/g, "{$1}"); + let headers = Object.assign({}, options.headers); + let body; + let parameters = omit(options, [ + "method", + "baseUrl", + "url", + "headers", + "request", + "mediaType" + ]); + const urlVariableNames = extractUrlVariableNames(url); + url = parseUrl(url).expand(parameters); + if (!/^http/.test(url)) { + url = options.baseUrl + url; + } + const omittedParameters = Object.keys(options).filter((option) => urlVariableNames.includes(option)).concat("baseUrl"); + const remainingParameters = omit(parameters, omittedParameters); + const isBinaryRequest = /application\/octet-stream/i.test(headers.accept); + if (!isBinaryRequest) { + if (options.mediaType.format) { + headers.accept = headers.accept.split(/,/).map((preview) => preview.replace(/application\/vnd(\.\w+)(\.v3)?(\.\w+)?(\+json)?$/, `application/vnd$1$2.${options.mediaType.format}`)).join(","); + } + if (options.mediaType.previews.length) { + const previewsFromAcceptHeader = headers.accept.match(/[\w-]+(?=-preview)/g) || []; + headers.accept = previewsFromAcceptHeader.concat(options.mediaType.previews).map((preview) => { + const format = options.mediaType.format ? `.${options.mediaType.format}` : "+json"; + return `application/vnd.github.${preview}-preview${format}`; + }).join(","); + } + } + if (["GET", "HEAD"].includes(method)) { + url = addQueryParameters(url, remainingParameters); + } else { + if ("data" in remainingParameters) { + body = remainingParameters.data; + } else { + if (Object.keys(remainingParameters).length) { + body = remainingParameters; + } else { + headers["content-length"] = 0; + } + } + } + if (!headers["content-type"] && typeof body !== "undefined") { + headers["content-type"] = "application/json; charset=utf-8"; + } + if (["PATCH", "PUT"].includes(method) && typeof body === "undefined") { + body = ""; + } + return Object.assign({ method, url, headers }, typeof body !== "undefined" ? { body } : null, options.request ? { request: options.request } : null); +} +function endpointWithDefaults(defaults, route, options) { + return parse(merge(defaults, route, options)); +} +function withDefaults(oldDefaults, newDefaults) { + const DEFAULTS2 = merge(oldDefaults, newDefaults); + const endpoint2 = endpointWithDefaults.bind(null, DEFAULTS2); + return Object.assign(endpoint2, { + DEFAULTS: DEFAULTS2, + defaults: withDefaults.bind(null, DEFAULTS2), + merge: merge.bind(null, DEFAULTS2), + parse + }); +} +var VERSION2 = "6.0.12"; +var userAgent = `octokit-endpoint.js/${VERSION2} ${getUserAgent()}`; +var DEFAULTS = { + method: "GET", + baseUrl: "https://api.github.com", + headers: { + accept: "application/vnd.github.v3+json", + "user-agent": userAgent + }, + mediaType: { + format: "", + previews: [] + } +}; +var endpoint = withDefaults(null, DEFAULTS); + +// node_modules/@octokit/request/dist-web/index.js +var import_node_fetch = __toModule(require_browser()); + +// node_modules/deprecation/dist-web/index.js +var Deprecation = class extends Error { + constructor(message) { + super(message); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + this.name = "Deprecation"; + } +}; + +// node_modules/@octokit/request-error/dist-web/index.js +var import_once = __toModule(require_once()); +var logOnceCode = (0, import_once.default)((deprecation) => console.warn(deprecation)); +var logOnceHeaders = (0, import_once.default)((deprecation) => console.warn(deprecation)); +var RequestError = class extends Error { + constructor(message, statusCode, options) { + super(message); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + this.name = "HttpError"; + this.status = statusCode; + let headers; + if ("headers" in options && typeof options.headers !== "undefined") { + headers = options.headers; + } + if ("response" in options) { + this.response = options.response; + headers = options.response.headers; + } + const requestCopy = Object.assign({}, options.request); + if (options.request.headers.authorization) { + requestCopy.headers = Object.assign({}, options.request.headers, { + authorization: options.request.headers.authorization.replace(/ .*$/, " [REDACTED]") + }); + } + requestCopy.url = requestCopy.url.replace(/\bclient_secret=\w+/g, "client_secret=[REDACTED]").replace(/\baccess_token=\w+/g, "access_token=[REDACTED]"); + this.request = requestCopy; + Object.defineProperty(this, "code", { + get() { + logOnceCode(new Deprecation("[@octokit/request-error] `error.code` is deprecated, use `error.status`.")); + return statusCode; + } + }); + Object.defineProperty(this, "headers", { + get() { + logOnceHeaders(new Deprecation("[@octokit/request-error] `error.headers` is deprecated, use `error.response.headers`.")); + return headers || {}; + } + }); + } +}; + +// node_modules/@octokit/request/dist-web/index.js +var VERSION3 = "5.6.3"; +function getBufferResponse(response) { + return response.arrayBuffer(); +} +function fetchWrapper(requestOptions) { + const log = requestOptions.request && requestOptions.request.log ? requestOptions.request.log : console; + if (isPlainObject(requestOptions.body) || Array.isArray(requestOptions.body)) { + requestOptions.body = JSON.stringify(requestOptions.body); + } + let headers = {}; + let status; + let url; + const fetch = requestOptions.request && requestOptions.request.fetch || import_node_fetch.default; + return fetch(requestOptions.url, Object.assign({ + method: requestOptions.method, + body: requestOptions.body, + headers: requestOptions.headers, + redirect: requestOptions.redirect + }, requestOptions.request)).then((response) => __async(this, null, function* () { + url = response.url; + status = response.status; + for (const keyAndValue of response.headers) { + headers[keyAndValue[0]] = keyAndValue[1]; + } + if ("deprecation" in headers) { + const matches = headers.link && headers.link.match(/<([^>]+)>; rel="deprecation"/); + const deprecationLink = matches && matches.pop(); + log.warn(`[@octokit/request] "${requestOptions.method} ${requestOptions.url}" is deprecated. It is scheduled to be removed on ${headers.sunset}${deprecationLink ? `. See ${deprecationLink}` : ""}`); + } + if (status === 204 || status === 205) { + return; + } + if (requestOptions.method === "HEAD") { + if (status < 400) { + return; + } + throw new RequestError(response.statusText, status, { + response: { + url, + status, + headers, + data: void 0 + }, + request: requestOptions + }); + } + if (status === 304) { + throw new RequestError("Not modified", status, { + response: { + url, + status, + headers, + data: yield getResponseData(response) + }, + request: requestOptions + }); + } + if (status >= 400) { + const data = yield getResponseData(response); + const error = new RequestError(toErrorMessage(data), status, { + response: { + url, + status, + headers, + data + }, + request: requestOptions + }); + throw error; + } + return getResponseData(response); + })).then((data) => { + return { + status, + url, + headers, + data + }; + }).catch((error) => { + if (error instanceof RequestError) + throw error; + throw new RequestError(error.message, 500, { + request: requestOptions + }); + }); +} +function getResponseData(response) { + return __async(this, null, function* () { + const contentType = response.headers.get("content-type"); + if (/application\/json/.test(contentType)) { + return response.json(); + } + if (!contentType || /^text\/|charset=utf-8$/.test(contentType)) { + return response.text(); + } + return getBufferResponse(response); + }); +} +function toErrorMessage(data) { + if (typeof data === "string") + return data; + if ("message" in data) { + if (Array.isArray(data.errors)) { + return `${data.message}: ${data.errors.map(JSON.stringify).join(", ")}`; + } + return data.message; + } + return `Unknown error: ${JSON.stringify(data)}`; +} +function withDefaults2(oldEndpoint, newDefaults) { + const endpoint2 = oldEndpoint.defaults(newDefaults); + const newApi = function(route, parameters) { + const endpointOptions = endpoint2.merge(route, parameters); + if (!endpointOptions.request || !endpointOptions.request.hook) { + return fetchWrapper(endpoint2.parse(endpointOptions)); + } + const request2 = (route2, parameters2) => { + return fetchWrapper(endpoint2.parse(endpoint2.merge(route2, parameters2))); + }; + Object.assign(request2, { + endpoint: endpoint2, + defaults: withDefaults2.bind(null, endpoint2) + }); + return endpointOptions.request.hook(request2, endpointOptions); + }; + return Object.assign(newApi, { + endpoint: endpoint2, + defaults: withDefaults2.bind(null, endpoint2) + }); +} +var request = withDefaults2(endpoint, { + headers: { + "user-agent": `octokit-request.js/${VERSION3} ${getUserAgent()}` + } +}); + +// node_modules/@octokit/graphql/dist-web/index.js +var VERSION4 = "4.8.0"; +function _buildMessageForResponseErrors(data) { + return `Request failed due to following response errors: +` + data.errors.map((e) => ` - ${e.message}`).join("\n"); +} +var GraphqlResponseError = class extends Error { + constructor(request2, headers, response) { + super(_buildMessageForResponseErrors(response)); + this.request = request2; + this.headers = headers; + this.response = response; + this.name = "GraphqlResponseError"; + this.errors = response.errors; + this.data = response.data; + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + } +}; +var NON_VARIABLE_OPTIONS = [ + "method", + "baseUrl", + "url", + "headers", + "request", + "query", + "mediaType" +]; +var FORBIDDEN_VARIABLE_OPTIONS = ["query", "method", "url"]; +var GHES_V3_SUFFIX_REGEX = /\/api\/v3\/?$/; +function graphql(request2, query, options) { + if (options) { + if (typeof query === "string" && "query" in options) { + return Promise.reject(new Error(`[@octokit/graphql] "query" cannot be used as variable name`)); + } + for (const key in options) { + if (!FORBIDDEN_VARIABLE_OPTIONS.includes(key)) + continue; + return Promise.reject(new Error(`[@octokit/graphql] "${key}" cannot be used as variable name`)); + } + } + const parsedOptions = typeof query === "string" ? Object.assign({ query }, options) : query; + const requestOptions = Object.keys(parsedOptions).reduce((result, key) => { + if (NON_VARIABLE_OPTIONS.includes(key)) { + result[key] = parsedOptions[key]; + return result; + } + if (!result.variables) { + result.variables = {}; + } + result.variables[key] = parsedOptions[key]; + return result; + }, {}); + const baseUrl = parsedOptions.baseUrl || request2.endpoint.DEFAULTS.baseUrl; + if (GHES_V3_SUFFIX_REGEX.test(baseUrl)) { + requestOptions.url = baseUrl.replace(GHES_V3_SUFFIX_REGEX, "/api/graphql"); + } + return request2(requestOptions).then((response) => { + if (response.data.errors) { + const headers = {}; + for (const key of Object.keys(response.headers)) { + headers[key] = response.headers[key]; + } + throw new GraphqlResponseError(requestOptions, headers, response.data); + } + return response.data.data; + }); +} +function withDefaults3(request$1, newDefaults) { + const newRequest = request$1.defaults(newDefaults); + const newApi = (query, options) => { + return graphql(newRequest, query, options); + }; + return Object.assign(newApi, { + defaults: withDefaults3.bind(null, newRequest), + endpoint: request.endpoint + }); +} +var graphql$1 = withDefaults3(request, { + headers: { + "user-agent": `octokit-graphql.js/${VERSION4} ${getUserAgent()}` + }, + method: "POST", + url: "/graphql" +}); +function withCustomRequest(customRequest) { + return withDefaults3(customRequest, { + method: "POST", + url: "/graphql" + }); +} + +// node_modules/@octokit/auth-token/dist-web/index.js +var REGEX_IS_INSTALLATION_LEGACY = /^v1\./; +var REGEX_IS_INSTALLATION = /^ghs_/; +var REGEX_IS_USER_TO_SERVER = /^ghu_/; +function auth(token) { + return __async(this, null, function* () { + const isApp = token.split(/\./).length === 3; + const isInstallation = REGEX_IS_INSTALLATION_LEGACY.test(token) || REGEX_IS_INSTALLATION.test(token); + const isUserToServer = REGEX_IS_USER_TO_SERVER.test(token); + const tokenType = isApp ? "app" : isInstallation ? "installation" : isUserToServer ? "user-to-server" : "oauth"; + return { + type: "token", + token, + tokenType + }; + }); +} +function withAuthorizationPrefix(token) { + if (token.split(/\./).length === 3) { + return `bearer ${token}`; + } + return `token ${token}`; +} +function hook(token, request2, route, parameters) { + return __async(this, null, function* () { + const endpoint2 = request2.endpoint.merge(route, parameters); + endpoint2.headers.authorization = withAuthorizationPrefix(token); + return request2(endpoint2); + }); +} +var createTokenAuth = function createTokenAuth2(token) { + if (!token) { + throw new Error("[@octokit/auth-token] No token passed to createTokenAuth"); + } + if (typeof token !== "string") { + throw new Error("[@octokit/auth-token] Token passed to createTokenAuth is not a string"); + } + token = token.replace(/^(token|bearer) +/i, ""); + return Object.assign(auth.bind(null, token), { + hook: hook.bind(null, token) + }); +}; + +// node_modules/@octokit/core/dist-web/index.js +var VERSION5 = "3.5.1"; +var Octokit = class { + constructor(options = {}) { + const hook2 = new import_before_after_hook.Collection(); + const requestDefaults = { + baseUrl: request.endpoint.DEFAULTS.baseUrl, + headers: {}, + request: Object.assign({}, options.request, { + hook: hook2.bind(null, "request") + }), + mediaType: { + previews: [], + format: "" + } + }; + requestDefaults.headers["user-agent"] = [ + options.userAgent, + `octokit-core.js/${VERSION5} ${getUserAgent()}` + ].filter(Boolean).join(" "); + if (options.baseUrl) { + requestDefaults.baseUrl = options.baseUrl; + } + if (options.previews) { + requestDefaults.mediaType.previews = options.previews; + } + if (options.timeZone) { + requestDefaults.headers["time-zone"] = options.timeZone; + } + this.request = request.defaults(requestDefaults); + this.graphql = withCustomRequest(this.request).defaults(requestDefaults); + this.log = Object.assign({ + debug: () => { + }, + info: () => { + }, + warn: console.warn.bind(console), + error: console.error.bind(console) + }, options.log); + this.hook = hook2; + if (!options.authStrategy) { + if (!options.auth) { + this.auth = () => __async(this, null, function* () { + return { + type: "unauthenticated" + }; + }); + } else { + const auth2 = createTokenAuth(options.auth); + hook2.wrap("request", auth2.hook); + this.auth = auth2; + } + } else { + const _a = options, { authStrategy } = _a, otherOptions = __objRest(_a, ["authStrategy"]); + const auth2 = authStrategy(Object.assign({ + request: this.request, + log: this.log, + octokit: this, + octokitOptions: otherOptions + }, options.auth)); + hook2.wrap("request", auth2.hook); + this.auth = auth2; + } + const classConstructor = this.constructor; + classConstructor.plugins.forEach((plugin) => { + Object.assign(this, plugin(this, options)); + }); + } + static defaults(defaults) { + const OctokitWithDefaults = class extends this { + constructor(...args) { + const options = args[0] || {}; + if (typeof defaults === "function") { + super(defaults(options)); + return; + } + super(Object.assign({}, defaults, options, options.userAgent && defaults.userAgent ? { + userAgent: `${options.userAgent} ${defaults.userAgent}` + } : null)); + } + }; + return OctokitWithDefaults; + } + static plugin(...newPlugins) { + var _a; + const currentPlugins = this.plugins; + const NewOctokit = (_a = class extends this { + }, _a.plugins = currentPlugins.concat(newPlugins.filter((plugin) => !currentPlugins.includes(plugin))), _a); + return NewOctokit; + } +}; +Octokit.VERSION = VERSION5; +Octokit.plugins = []; + +// utils.ts +var import_slugify = __toModule(require_slugify()); +var import_sha1 = __toModule(require_sha1()); +function arrayBufferToBase64(buffer) { + let binary = ""; + const bytes = new Uint8Array(buffer); + const len = bytes.byteLength; + for (let i = 0; i < len; i++) { + binary += String.fromCharCode(bytes[i]); + } + return gBase64.btoa(binary); +} +function extractBaseUrl(url) { + return url && url.replace("https://", "").replace("http://", "").replace(/\/$/, ""); +} +function generateUrlPath(filePath) { + if (!filePath) { + return filePath; + } + const extensionLess = filePath.substring(0, filePath.lastIndexOf(".")); + const noteUrlPath = extensionLess.split("/").map((x) => (0, import_slugify.default)(x)).join("/") + "/"; + return noteUrlPath; +} +function generateBlobHash(content) { + const byteLength = new TextEncoder().encode(content).byteLength; + const header = `blob ${byteLength}\0`; + const gitBlob = header + content; + return (0, import_sha1.default)(gitBlob).toString(); +} + +// Validator.ts +var import_obsidian = __toModule(require("obsidian")); +function vallidatePublishFrontmatter(frontMatter) { + if (!frontMatter || !frontMatter["dg-publish"]) { + new import_obsidian.Notice("Note does not have the dg-publish: true set. Please add this and try again."); + return false; + } + return true; +} + +// Publisher.ts +var Publisher = class { + constructor(vault, metadataCache, settings) { + this.vault = vault; + this.metadataCache = metadataCache; + this.settings = settings; + } + getFilesMarkedForPublishing() { + return __async(this, null, function* () { + const files = this.vault.getMarkdownFiles(); + const filesToPublish = []; + for (const file of files) { + try { + const frontMatter = this.metadataCache.getCache(file.path).frontmatter; + if (frontMatter && frontMatter["dg-publish"] === true) { + filesToPublish.push(file); + } + } catch (e) { + } + } + return filesToPublish; + }); + } + publish(file) { + return __async(this, null, function* () { + if (!vallidatePublishFrontmatter(this.metadataCache.getCache(file.path).frontmatter)) { + return false; + } + try { + const text = yield this.generateMarkdown(file); + yield this.uploadText(file.path, text); + return true; + } catch (e) { + return false; + } + }); + } + generateMarkdown(file) { + return __async(this, null, function* () { + let text = yield this.vault.cachedRead(file); + text = yield this.convertFrontMatter(text, file.path); + text = yield this.createTranscludedText(text, file.path); + text = yield this.convertLinksToFullPath(text, file.path); + text = yield this.createBase64Images(text, file.path); + return text; + }); + } + uploadText(filePath, content) { + return __async(this, null, function* () { + if (!this.settings.githubRepo) { + new import_obsidian2.Notice("Config error: You need to define a GitHub repo in the plugin settings"); + throw {}; + } + if (!this.settings.githubUserName) { + new import_obsidian2.Notice("Config error: You need to define a GitHub Username in the plugin settings"); + throw {}; + } + if (!this.settings.githubToken) { + new import_obsidian2.Notice("Config error: You need to define a GitHub Token in the plugin settings"); + throw {}; + } + const octokit = new Octokit({ auth: this.settings.githubToken }); + const base64Content = gBase64.encode(content); + const path = `src/site/notes/${filePath}`; + const payload = { + owner: this.settings.githubUserName, + repo: this.settings.githubRepo, + path, + message: `Add note ${filePath}`, + content: base64Content, + sha: "" + }; + try { + const response = yield octokit.request("GET /repos/{owner}/{repo}/contents/{path}", { + owner: this.settings.githubUserName, + repo: this.settings.githubRepo, + path + }); + if (response.status === 200 && response.data.type === "file") { + payload.sha = response.data.sha; + } + } catch (e) { + console.log(e); + } + payload.message = `Update note ${filePath}`; + yield octokit.request("PUT /repos/{owner}/{repo}/contents/{path}", payload); + }); + } + convertFrontMatter(text, path) { + return __async(this, null, function* () { + const cachedFrontMatter = this.metadataCache.getCache(path).frontmatter; + const frontMatter = __spreadValues({}, cachedFrontMatter); + if (frontMatter && frontMatter["dg-permalink"]) { + frontMatter["permalink"] = frontMatter["dg-permalink"]; + if (!frontMatter["permalink"].endsWith("/")) { + frontMatter["permalink"] += "/"; + } + if (!frontMatter["permalink"].startsWith("/")) { + frontMatter["permalink"] = "/" + frontMatter["permalink"]; + } + } else { + const noteUrlPath = generateUrlPath(path); + frontMatter["permalink"] = "/" + noteUrlPath; + } + if (frontMatter && frontMatter["dg-home"]) { + const tags = frontMatter["tags"]; + if (tags) { + if (typeof tags === "string") { + frontMatter["tags"] = [tags, "gardenEntry"]; + } else { + frontMatter["tags"] = [...tags, "gardenEntry"]; + } + } else { + frontMatter["tags"] = "gardenEntry"; + } + } + const replaced = text.replace(/^---\n([\s\S]*?)\n---/g, (match, p1) => { + const copy = __spreadValues({}, frontMatter); + delete copy["position"]; + delete copy["end"]; + const frontMatterString = JSON.stringify(copy); + return `--- +${frontMatterString} +---`; + }); + return replaced; + }); + } + convertLinksToFullPath(text, filePath) { + return __async(this, null, function* () { + let convertedText = text; + const linkedFileRegex = /\[\[(.*?)\]\]/g; + const linkedFileMatches = text.match(linkedFileRegex); + if (linkedFileMatches) { + for (let i = 0; i < linkedFileMatches.length; i++) { + try { + const linkedFileMatch = linkedFileMatches[i]; + const textInsideBrackets = linkedFileMatch.substring(linkedFileMatch.indexOf("[") + 2, linkedFileMatch.indexOf("]")); + let [linkedFileName, prettyName] = textInsideBrackets.split("|"); + prettyName = prettyName || linkedFileName; + if (linkedFileName.includes("#")) { + linkedFileName = linkedFileName.split("#")[0]; + } + const fullLinkedFilePath = (0, import_obsidian2.getLinkpath)(linkedFileName); + const linkedFile = this.metadataCache.getFirstLinkpathDest(fullLinkedFilePath, filePath); + if (linkedFile.extension === "md") { + const extensionlessPath = linkedFile.path.substring(0, linkedFile.path.lastIndexOf(".")); + convertedText = convertedText.replace(linkedFileMatch, `[[${extensionlessPath}|${prettyName}]]`); + } + } catch (e) { + continue; + } + } + } + return convertedText; + }); + } + createTranscludedText(text, filePath) { + return __async(this, null, function* () { + let transcludedText = text; + const transcludedRegex = /!\[\[(.*?)\]\]/g; + const transclusionMatches = text.match(transcludedRegex); + if (transclusionMatches) { + for (let i = 0; i < transclusionMatches.length; i++) { + try { + const transclusionMatch = transclusionMatches[i]; + let [tranclusionFileName, headerName] = transclusionMatch.substring(transclusionMatch.indexOf("[") + 2, transclusionMatch.indexOf("]")).split("|"); + const tranclusionFilePath = (0, import_obsidian2.getLinkpath)(tranclusionFileName); + const linkedFile = this.metadataCache.getFirstLinkpathDest(tranclusionFilePath, filePath); + if (linkedFile.extension !== "md") { + continue; + } + let fileText = yield this.vault.cachedRead(linkedFile); + fileText = fileText.replace(/^---\n([\s\S]*?)\n---/g, ""); + const header = this.generateTransclusionHeader(headerName, linkedFile); + const headerSection = header ? `${header} +` : ""; + fileText = ` +
+ +` + headerSection + fileText + "\n
\n"; + transcludedText = transcludedText.replace(transclusionMatch, fileText); + } catch (e) { + continue; + } + } + } + return transcludedText; + }); + } + createBase64Images(text, filePath) { + return __async(this, null, function* () { + let imageText = text; + const imageRegex = /!\[\[(.*?)(\.(png|jpg|jpeg|gif))\]\]/g; + const imageMatches = text.match(imageRegex); + if (imageMatches) { + for (let i = 0; i < imageMatches.length; i++) { + try { + const imageMatch = imageMatches[i]; + const imageName = imageMatch.substring(imageMatch.indexOf("[") + 2, imageMatch.indexOf("]")); + const imagePath = (0, import_obsidian2.getLinkpath)(imageName); + const linkedFile = this.metadataCache.getFirstLinkpathDest(imagePath, filePath); + const image = yield this.vault.readBinary(linkedFile); + const imageBase64 = arrayBufferToBase64(image); + const imageMarkdown = `![${imageName}](data:image/${linkedFile.extension};base64,${imageBase64})`; + imageText = imageText.replace(imageMatch, imageMarkdown); + } catch (e) { + continue; + } + } + } + return imageText; + }); + } + generateTransclusionHeader(headerName, transcludedFile) { + if (!headerName) { + return headerName; + } + const titleVariable = "{{title}}"; + if (headerName && headerName.indexOf(titleVariable) > -1) { + headerName = headerName.replace(titleVariable, transcludedFile.basename); + } + if (headerName && !headerName.startsWith("#")) { + headerName = "# " + headerName; + } else if (headerName) { + const headerParts = headerName.split("#"); + if (!headerParts.last().startsWith(" ")) { + headerName = headerName.replace(headerParts.last(), " " + headerParts.last()); + } + } + return headerName; + } +}; + +// DigitalGardenSiteManager.ts +var DigitalGardenSiteManager = class { + constructor(metadataCache, settings) { + this.settings = settings; + this.metadataCache = metadataCache; + } + getNoteUrl(file) { + const baseUrl = this.settings.gardenBaseUrl ? `https://${extractBaseUrl(this.settings.gardenBaseUrl)}` : `https://${this.settings.githubRepo}.netlify.app`; + const noteUrlPath = generateUrlPath(file.path); + let urlPath = `/${noteUrlPath}`; + const frontMatter = this.metadataCache.getCache(file.path).frontmatter; + if (frontMatter && frontMatter.permalink) { + urlPath = `/${frontMatter.permalink}`; + } else if (frontMatter && frontMatter["dg-permalink"]) { + urlPath = `/${frontMatter["dg-permalink"]}`; + } + return `${baseUrl}${urlPath}`; + } + getNoteHashes() { + return __async(this, null, function* () { + const octokit = new Octokit({ auth: this.settings.githubToken }); + const response = yield octokit.request("GET /repos/{owner}/{repo}/git/trees/{tree_sha}?recursive=true", { + owner: this.settings.githubUserName, + repo: this.settings.githubRepo, + tree_sha: "main" + }); + const files = response.data.tree; + const notes = files.filter((x) => x.path.startsWith("src/site/notes/") && x.type === "blob" && x.path !== "src/site/notes/notes.json"); + const hashes = {}; + for (const note of notes) { + const vaultPath = note.path.replace("src/site/notes/", ""); + hashes[vaultPath] = note.sha; + } + return hashes; + }); + } + createPullRequestWithSiteChanges() { + return __async(this, null, function* () { + const octokit = new Octokit({ auth: this.settings.githubToken }); + const latestRelease = yield octokit.request("GET /repos/{owner}/{repo}/releases/latest", { + owner: "oleeskild", + repo: "digitalgarden" + }); + const templateVersion = latestRelease.data.tag_name; + const branchName = "update-template-to-v" + templateVersion; + const latestCommit = yield octokit.request("GET /repos/{owner}/{repo}/commits/main", { + owner: this.settings.githubUserName, + repo: this.settings.githubRepo + }); + yield this.createNewBranch(octokit, branchName, latestCommit.data.sha); + yield this.deleteFiles(octokit, branchName); + yield this.addCustomStyleFile(octokit, branchName); + yield this.modifyFiles(octokit, branchName); + const prUrl = yield this.createPullRequest(octokit, branchName, templateVersion); + return prUrl; + }); + } + createPullRequest(octokit, branchName, templateVersion) { + return __async(this, null, function* () { + try { + const pr = yield octokit.request("POST /repos/{owner}/{repo}/pulls", { + owner: this.settings.githubUserName, + repo: this.settings.githubRepo, + title: `Update template to version ${templateVersion}`, + head: branchName, + base: "main", + body: `Update to latest template version. + [Release Notes](https://github.com/oleeskild/digitalgarden/releases/tag/${templateVersion})` + }); + return pr.data.html_url; + } catch (e) { + return null; + } + }); + } + deleteFiles(octokit, branchName) { + return __async(this, null, function* () { + const filesToDelete = [ + "src/site/styles/style.css" + ]; + for (const file of filesToDelete) { + try { + const latestFile = yield octokit.request("GET /repos/{owner}/{repo}/contents/{path}", { + owner: this.settings.githubUserName, + repo: this.settings.githubRepo, + path: file, + ref: branchName + }); + yield octokit.request("DELETE /repos/{owner}/{repo}/contents/{path}", { + owner: this.settings.githubUserName, + repo: this.settings.githubRepo, + path: file, + sha: latestFile.data.sha, + message: `Delete ${file}`, + branch: branchName + }); + } catch (e) { + } + } + }); + } + modifyFiles(octokit, branchName) { + return __async(this, null, function* () { + var _a; + const filesToModify = [ + ".eleventy.js", + "README.md", + "netlify.toml", + "package-lock.json", + "package.json", + "src/site/404.njk", + "src/site/index.njk", + "src/site/versionednote.njk", + "src/site/versionednote.njk", + "src/site/styles/style.scss", + "src/site/notes/notes.json", + "src/site/_includes/layouts/note.njk", + "src/site/_includes/layouts/versionednote.njk", + "src/site/_includes/components/notegrowthhistory.njk", + "src/site/_includes/components/pageheader.njk", + "src/site/_data/versionednotes.js" + ]; + for (const file of filesToModify) { + const latestFile = yield octokit.request("GET /repos/{owner}/{repo}/contents/{path}", { + owner: "oleeskild", + repo: "digitalgarden", + path: file + }); + let currentFile = {}; + let fileExists = true; + try { + currentFile = yield octokit.request("GET /repos/{owner}/{repo}/contents/{path}", { + owner: this.settings.githubUserName, + repo: this.settings.githubRepo, + path: file, + ref: branchName + }); + } catch (error) { + fileExists = false; + } + const fileHasChanged = latestFile.data.sha !== ((_a = currentFile == null ? void 0 : currentFile.data) == null ? void 0 : _a.sha); + if (!fileExists || fileHasChanged) { + yield octokit.request("PUT /repos/{owner}/{repo}/contents/{path}", { + owner: this.settings.githubUserName, + repo: this.settings.githubRepo, + path: file, + branch: branchName, + message: `Update file ${file}`, + content: latestFile.data.content, + sha: fileExists ? currentFile.data.sha : null + }); + } + } + }); + } + createNewBranch(octokit, branchName, sha) { + return __async(this, null, function* () { + try { + const branch = yield octokit.request("POST /repos/{owner}/{repo}/git/refs", { + owner: this.settings.githubUserName, + repo: this.settings.githubRepo, + ref: `refs/heads/${branchName}`, + sha + }); + } catch (e) { + } + }); + } + addCustomStyleFile(octokit, branchName) { + return __async(this, null, function* () { + const customStyleFilePath = "src/site/styles/custom-style.scss"; + try { + yield octokit.request("GET /repos/{owner}/{repo}/contents/{path}", { + owner: this.settings.githubUserName, + repo: this.settings.githubRepo, + path: customStyleFilePath, + ref: branchName + }); + } catch (e) { + const initialCustomStyleFile = yield octokit.request("GET /repos/{owner}/{repo}/contents/{path}", { + owner: "oleeskild", + repo: "digitalgarden", + path: customStyleFilePath + }); + yield octokit.request("PUT /repos/{owner}/{repo}/contents/{path}", { + owner: this.settings.githubUserName, + repo: this.settings.githubRepo, + path: customStyleFilePath, + branch: branchName, + message: "Update template file", + content: initialCustomStyleFile.data.content + }); + } + }); + } +}; + +// SettingView.ts +var import_obsidian3 = __toModule(require("obsidian")); +var SettingView = class { + constructor(settingsRootElement, settings, saveSettings) { + this.settingsRootElement = settingsRootElement; + this.settings = settings; + this.saveSettings = saveSettings; + this.initialize(); + } + initialize() { + this.settingsRootElement.empty(); + this.settingsRootElement.createEl("h2", { text: "Settings " }); + this.settingsRootElement.createEl("span", { text: "Remember to read the setup guide if you haven't already. It can be found " }); + this.settingsRootElement.createEl("a", { text: "here.", href: "https://github.com/oleeskild/Obsidian-Digital-Garden" }); + this.initializeGitHubRepoSetting(); + this.initializeGitHubUserNameSetting(); + this.initializeGitHubTokenSetting(); + this.initializeGitHubBaseURLSetting(); + this.updateTemplateTop = this.settingsRootElement.createEl("div", { cls: "setting-item" }); + this.progressViewTop = this.settingsRootElement.createEl("div", {}); + this.previousPrsViewTop = this.settingsRootElement.createEl("div", { cls: "setting-item" }); + } + initializeGitHubRepoSetting() { + new import_obsidian3.Setting(this.settingsRootElement).setName("GitHub repo name").setDesc("The name of the GitHub repository").addText((text) => text.setPlaceholder("mydigitalgarden").setValue(this.settings.githubRepo).onChange((value) => __async(this, null, function* () { + this.settings.githubRepo = value; + yield this.saveSettings(); + }))); + } + initializeGitHubUserNameSetting() { + new import_obsidian3.Setting(this.settingsRootElement).setName("GitHub Username").setDesc("Your GitHub Username").addText((text) => text.setPlaceholder("myusername").setValue(this.settings.githubUserName).onChange((value) => __async(this, null, function* () { + this.settings.githubUserName = value; + yield this.saveSettings(); + }))); + } + initializeGitHubTokenSetting() { + const desc = document.createDocumentFragment(); + desc.createEl("span", null, (span) => { + span.innerText = "A GitHub token with repo permissions. You can generate it "; + span.createEl("a", null, (link) => { + link.href = "https://github.com/settings/tokens/new?scopes=repo"; + link.innerText = "here!"; + }); + }); + new import_obsidian3.Setting(this.settingsRootElement).setName("GitHub token").setDesc(desc).addText((text) => text.setPlaceholder("Secret Token").setValue(this.settings.githubToken).onChange((value) => __async(this, null, function* () { + this.settings.githubToken = value; + yield this.saveSettings(); + }))); + } + initializeGitHubBaseURLSetting() { + new import_obsidian3.Setting(this.settingsRootElement).setName("Base URL").setDesc(` + This is used for the "Copy Note URL" command and is optional. + If you leave it blank, the plugin will try to guess it from the repo name. + `).addText((text) => text.setPlaceholder("my-digital-garden.netlify.app").setValue(this.settings.gardenBaseUrl).onChange((value) => __async(this, null, function* () { + this.settings.gardenBaseUrl = value; + yield this.saveSettings(); + }))); + } + renderCreatePr(handlePR) { + new import_obsidian3.Setting(this.updateTemplateTop).setName("Update site to latest template").setDesc(` + This will create a pull request with the latest template changes. + It will not publish any changes before you approve them. + You can even test the changes first Netlify will automatically provide you with a test URL. + `).addButton((button) => button.setButtonText("Create PR").onClick(() => handlePR(button))); + } + renderPullRequestHistory(previousPrUrls) { + if (previousPrUrls.length === 0) { + return; + } + this.previousPrsViewTop.createEl("h2", { text: "Recent Pull Request History" }); + const prsContainer = this.previousPrsViewTop.createEl("ul", {}); + previousPrUrls.map((prUrl) => { + const li = prsContainer.createEl("li", { attr: { "style": "margin-bottom: 10px" } }); + const prUrlElement = document.createElement("a"); + prUrlElement.href = prUrl; + prUrlElement.textContent = prUrl; + li.appendChild(prUrlElement); + this.settingsRootElement.appendChild(li); + }); + } + renderLoading() { + this.loading = this.progressViewTop.createEl("div", {}); + this.loading.createEl("p", { text: "Creating PR. This should take less than 1 minute" }); + const loadingText = this.loading.createEl("p", { text: "Loading" }); + this.loadingInterval = setInterval(() => { + if (loadingText.innerText === "Loading") { + loadingText.innerText = "Loading."; + } else if (loadingText.innerText === "Loading.") { + loadingText.innerText = "Loading.."; + } else if (loadingText.innerText === "Loading..") { + loadingText.innerText = "Loading..."; + } else { + loadingText.innerText = "Loading"; + } + }, 400); + } + renderSuccess(prUrl) { + this.loading.remove(); + this.loading = null; + clearInterval(this.loadingInterval); + const successmessage = prUrl ? { text: `\u{1F389} Done! Approve your PR to make the changes go live.` } : { text: "You already have the latest template \u{1F389} No need to create a PR.", attr: {} }; + const linkText = { text: `${prUrl}`, href: prUrl }; + this.progressViewTop.createEl("h2", successmessage); + if (prUrl) { + this.progressViewTop.createEl("a", linkText); + } + this.progressViewTop.createEl("br"); + } + renderError() { + this.loading.remove(); + this.loading = null; + clearInterval(this.loadingInterval); + const errorMsg = { text: "\u274C Something went wrong. Try deleting the branch in GitHub.", attr: {} }; + this.progressViewTop.createEl("p", errorMsg); + } +}; + +// PublishStatusBar.ts +var PublishStatusBar = class { + constructor(statusBarItem, numberOfNotesToPublish) { + this.statusBarItem = statusBarItem; + this.counter = 0; + this.numberOfNotesToPublish = numberOfNotesToPublish; + this.statusBarItem.createEl("span", { text: "Digital Garden: " }); + this.status = this.statusBarItem.createEl("span", { text: `${this.numberOfNotesToPublish} files marked for publishing` }); + } + increment() { + this.status.innerText = `\u231BPublishing Notes: ${++this.counter}/${this.numberOfNotesToPublish}`; + } + finish(displayDurationMillisec) { + this.status.innerText = `\u2705 Published Notes: ${this.counter}/${this.numberOfNotesToPublish}`; + setTimeout(() => { + this.statusBarItem.remove(); + }, displayDurationMillisec); + } + error() { + this.statusBarItem.remove(); + } +}; + +// icons.ts +var seedling = `Layer 1`; + +// PublishModal.ts +var import_obsidian4 = __toModule(require("obsidian")); +var PublishModal = class { + constructor(app, siteManager, publisher, settings) { + this.modal = new import_obsidian4.Modal(app); + this.siteManager = siteManager; + this.settings = settings; + this.publisher = publisher; + this.initialize(); + } + createCollapsable(title) { + const toggleHeader = this.modal.contentEl.createEl("h3", { text: `\u27A1\uFE0F\uFE0F ${title}`, attr: { class: "collapsable collapsed" } }); + const toggledList = this.modal.contentEl.createEl("ul"); + toggledList.hide(); + toggleHeader.onClickEvent(() => { + if (toggledList.isShown()) { + toggleHeader.textContent = `\u27A1\uFE0F\uFE0F ${title}`; + toggledList.hide(); + toggleHeader.removeClass("open"); + toggleHeader.addClass("collapsed"); + } else { + toggleHeader.textContent = `\u2B07\uFE0F ${title}`; + toggledList.show(); + toggleHeader.removeClass("collapsed"); + toggleHeader.addClass("open"); + } + }); + return toggledList; + } + initialize() { + return __async(this, null, function* () { + this.modal.titleEl.innerText = "\u{1F331} Digital Garden"; + this.modal.contentEl.addClass("digital-garden-publish-status-view"); + this.modal.contentEl.createEl("h2", { text: "Publication Status" }); + this.publishedContainer = this.createCollapsable("Published"); + this.changedContainer = this.createCollapsable("Changed"); + this.deletedContainer = this.createCollapsable("Deleted from vault"); + this.unpublishedContainer = this.createCollapsable("Unpublished"); + this.modal.onOpen = () => this.populateWithNotes(); + this.modal.onClose = () => this.clearView(); + }); + } + clearView() { + return __async(this, null, function* () { + this.publishedContainer.childNodes.forEach((node) => node.remove()); + this.changedContainer.childNodes.forEach((node) => node.remove()); + this.deletedContainer.childNodes.forEach((node) => node.remove()); + this.unpublishedContainer.childNodes.forEach((node) => node.remove()); + }); + } + populateWithNotes() { + return __async(this, null, function* () { + const publishStatus = yield this.buildPublishStatus(); + publishStatus.publishedNotes.map((file) => this.publishedContainer.createEl("li", { text: file.path })); + publishStatus.unpublishedNotes.map((file) => this.unpublishedContainer.createEl("li", { text: file.path })); + publishStatus.changedNotes.map((file) => this.changedContainer.createEl("li", { text: file.path })); + publishStatus.deletedNotePaths.map((path) => this.deletedContainer.createEl("li", { text: path })); + }); + } + buildPublishStatus() { + return __async(this, null, function* () { + const unpublishedNotes = []; + const publishedNotes = []; + const changedNotes = []; + const deletedNotePaths = []; + const remoteNoteHashes = yield this.siteManager.getNoteHashes(); + const marked = yield this.publisher.getFilesMarkedForPublishing(); + for (const file of marked) { + const content = yield this.publisher.generateMarkdown(file); + const localHash = generateBlobHash(content); + const remoteHash = remoteNoteHashes[file.path]; + if (!remoteHash) { + unpublishedNotes.push(file); + } else if (remoteHash === localHash) { + publishedNotes.push(file); + } else { + changedNotes.push(file); + } + } + Object.keys(remoteNoteHashes).forEach((key) => { + if (!marked.find((f) => f.path === key)) { + deletedNotePaths.push(key); + } + }); + return { unpublishedNotes, publishedNotes, changedNotes, deletedNotePaths }; + }); + } + open() { + this.modal.open(); + } +}; + +// main.ts +var DEFAULT_SETTINGS = { + githubRepo: "", + githubToken: "", + githubUserName: "", + gardenBaseUrl: "", + prHistory: [] +}; +var DigitalGarden = class extends import_obsidian5.Plugin { + onload() { + return __async(this, null, function* () { + this.appVersion = "2.4.0"; + console.log("Initializing DigitalGarden plugin v" + this.appVersion); + yield this.loadSettings(); + this.addSettingTab(new DigitalGardenSettingTab(this.app, this)); + yield this.addCommands(); + (0, import_obsidian5.addIcon)("digital-garden-icon", seedling); + this.addRibbonIcon("digital-garden-icon", "Digital Garden Publication Center", () => __async(this, null, function* () { + this.openPublishModal(); + })); + }); + } + onunload() { + } + loadSettings() { + return __async(this, null, function* () { + this.settings = Object.assign({}, DEFAULT_SETTINGS, yield this.loadData()); + }); + } + saveSettings() { + return __async(this, null, function* () { + yield this.saveData(this.settings); + }); + } + addCommands() { + return __async(this, null, function* () { + this.addCommand({ + id: "publish-note", + name: "Publish Single Note", + callback: () => __async(this, null, function* () { + try { + const { vault, workspace, metadataCache } = this.app; + const currentFile = workspace.getActiveFile(); + if (!currentFile) { + new import_obsidian5.Notice("No file is open/active. Please open a file and try again."); + return; + } + if (currentFile.extension !== "md") { + new import_obsidian5.Notice("The current file is not a markdown file. Please open a markdown file and try again."); + return; + } + const publisher = new Publisher(vault, metadataCache, this.settings); + const publishSuccessful = yield publisher.publish(currentFile); + if (publishSuccessful) { + new import_obsidian5.Notice(`Successfully published note to your garden.`); + } + } catch (e) { + console.error(e); + new import_obsidian5.Notice("Unable to publish note, something went wrong."); + } + }) + }); + this.addCommand({ + id: "publish-multiple-notes", + name: "Publish Multiple Notes", + callback: () => __async(this, null, function* () { + const statusBarItem = this.addStatusBarItem(); + try { + const { vault, metadataCache } = this.app; + const publisher = new Publisher(vault, metadataCache, this.settings); + const filesToPublish = yield publisher.getFilesMarkedForPublishing(); + const statusBar = new PublishStatusBar(statusBarItem, filesToPublish.length); + let errorFiles = 0; + for (const file of filesToPublish) { + try { + statusBar.increment(); + yield publisher.publish(file); + } catch (e) { + errorFiles++; + new import_obsidian5.Notice(`Unable to publish note ${file.name}, skipping it.`); + } + } + statusBar.finish(8e3); + new import_obsidian5.Notice(`Successfully published ${filesToPublish.length - errorFiles} notes to your garden.`); + } catch (e) { + statusBarItem.remove(); + console.error(e); + new import_obsidian5.Notice("Unable to publish multiple notes, something went wrong."); + } + }) + }); + this.addCommand({ + id: "copy-garden-url", + name: "Copy Garden URL", + callback: () => __async(this, null, function* () { + try { + const { metadataCache, workspace } = this.app; + const currentFile = workspace.getActiveFile(); + if (!currentFile) { + new import_obsidian5.Notice("No file is open/active. Please open a file and try again."); + return; + } + const siteManager = new DigitalGardenSiteManager(metadataCache, this.settings); + const fullUrl = siteManager.getNoteUrl(currentFile); + yield navigator.clipboard.writeText(fullUrl); + new import_obsidian5.Notice(`Note URL copied to clipboard`); + } catch (e) { + console.log(e); + new import_obsidian5.Notice("Unable to copy note URL to clipboard, something went wrong."); + } + }) + }); + this.addCommand({ + id: "dg-open-publish-modal", + name: "Open Publication Center", + callback: () => __async(this, null, function* () { + this.openPublishModal(); + }) + }); + }); + } + openPublishModal() { + if (!this.publishModal) { + const siteManager = new DigitalGardenSiteManager(this.app.metadataCache, this.settings); + const publisher = new Publisher(this.app.vault, this.app.metadataCache, this.settings); + this.publishModal = new PublishModal(this.app, siteManager, publisher, this.settings); + } + this.publishModal.open(); + } +}; +var DigitalGardenSettingTab = class extends import_obsidian5.PluginSettingTab { + constructor(app, plugin) { + super(app, plugin); + this.plugin = plugin; + } + display() { + const { containerEl } = this; + const settingView = new SettingView(containerEl, this.plugin.settings, () => __async(this, null, function* () { + return yield this.plugin.saveData(this.plugin.settings); + })); + const handlePR = (button) => __async(this, null, function* () { + settingView.renderLoading(); + button.setDisabled(true); + try { + const siteManager = new DigitalGardenSiteManager(this.plugin.app.metadataCache, this.plugin.settings); + const prUrl = yield siteManager.createPullRequestWithSiteChanges(); + if (prUrl) { + this.plugin.settings.prHistory.push(prUrl); + yield this.plugin.saveSettings(); + } + settingView.renderSuccess(prUrl); + button.setDisabled(false); + } catch (e) { + settingView.renderError(); + } + }); + settingView.renderCreatePr(handlePR); + settingView.renderPullRequestHistory(this.plugin.settings.prHistory.slice(0, 10)); + } +}; +/*! + * is-plain-object + * + * Copyright (c) 2014-2017, Jon Schlinkert. + * Released under the MIT License. + */ diff --git a/.obsidian/plugins/digitalgarden/manifest.json b/.obsidian/plugins/digitalgarden/manifest.json new file mode 100644 index 00000000..b0c11162 --- /dev/null +++ b/.obsidian/plugins/digitalgarden/manifest.json @@ -0,0 +1,10 @@ +{ + "id": "digitalgarden", + "name": "Digital Garden", + "version": "2.4.0", + "minAppVersion": "0.12.0", + "description": "Publish your notes to a digital garden for others to enjoy.", + "author": "Ole Eskild Steensen", + "authorUrl": "https://ole.dev/garden", + "isDesktopOnly": false +} \ No newline at end of file diff --git a/.obsidian/plugins/digitalgarden/styles.css b/.obsidian/plugins/digitalgarden/styles.css new file mode 100644 index 00000000..ba9cbc54 --- /dev/null +++ b/.obsidian/plugins/digitalgarden/styles.css @@ -0,0 +1,14 @@ +.digital-garden-publish-status-view ul { + list-style-type: none; + position: relative; + margin-left: 5px; + margin-top: 0; + max-height: 250px; + overflow: auto; +} + +.digital-garden-publish-status-view .collapsable { + cursor: pointer; + margin-bottom: 5px; + margin-left: 10px; +} \ No newline at end of file diff --git a/.obsidian/plugins/obsidian-activity-history/data.json b/.obsidian/plugins/obsidian-activity-history/data.json index 74b27b75..8edcdffd 100644 --- a/.obsidian/plugins/obsidian-activity-history/data.json +++ b/.obsidian/plugins/obsidian-activity-history/data.json @@ -12,8 +12,8 @@ "checkpointList": [ { "path": "/", - "date": "2022-03-13", - "size": 2853750 + "date": "2022-03-14", + "size": 2864095 } ], "activityHistory": [ @@ -278,7 +278,11 @@ }, { "date": "2022-03-13", - "value": 135114 + "value": 218887 + }, + { + "date": "2022-03-14", + "value": 85184 } ] } diff --git a/.obsidian/plugins/obsidian-commits/data.json b/.obsidian/plugins/obsidian-commits/data.json index 65d8e489..e44efaa7 100644 --- a/.obsidian/plugins/obsidian-commits/data.json +++ b/.obsidian/plugins/obsidian-commits/data.json @@ -1914,116 +1914,6 @@ "tags": 3, "links": 8 }, - "06.02 Investments/Airbus.md": { - "size": 2156, - "tags": 4, - "links": 2 - }, - "06.02 Investments/Holochain.md": { - "size": 3210, - "tags": 4, - "links": 3 - }, - "06.02 Investments/Aragon.md": { - "size": 2423, - "tags": 3, - "links": 2 - }, - "06.02 Investments/Valneva.md": { - "size": 2677, - "tags": 4, - "links": 2 - }, - "06.02 Investments/Equity Tasks.md": { - "size": 5289, - "tags": 3, - "links": 4 - }, - "06.02 Investments/Polkadot.md": { - "size": 3057, - "tags": 3, - "links": 3 - }, - "06.02 Investments/Chainlink.md": { - "size": 2221, - "tags": 3, - "links": 2 - }, - "06.02 Investments/Equity Investments.md": { - "size": 1306, - "tags": 2, - "links": 5 - }, - "06.02 Investments/@Investment master.md": { - "size": 2925, - "tags": 5, - "links": 8 - }, - "06.02 Investments/Enjin.md": { - "size": 3526, - "tags": 4, - "links": 3 - }, - "06.02 Investments/Revolut.md": { - "size": 3028, - "tags": 4, - "links": 2 - }, - "06.02 Investments/Crypto Investments.md": { - "size": 2075, - "tags": 3, - "links": 10 - }, - "06.02 Investments/Nimbus.md": { - "size": 3018, - "tags": 3, - "links": 2 - }, - "06.02 Investments/Le Miel de Paris.md": { - "size": 1644, - "tags": 4, - "links": 2 - }, - "06.02 Investments/Thalès.md": { - "size": 1926, - "tags": 4, - "links": 2 - }, - "06.02 Investments/Ocean Protocol.md": { - "size": 3015, - "tags": 4, - "links": 2 - }, - "06.02 Investments/QED Naval.md": { - "size": 2079, - "tags": 6, - "links": 2 - }, - "06.02 Investments/VC Investments.md": { - "size": 1504, - "tags": 3, - "links": 5 - }, - "06.02 Investments/EOS.md": { - "size": 4019, - "tags": 4, - "links": 2 - }, - "06.02 Investments/Crypto Tasks.md": { - "size": 6300, - "tags": 3, - "links": 11 - }, - "06.02 Investments/@Investment Task master.md": { - "size": 3316, - "tags": 5, - "links": 6 - }, - "06.02 Investments/VC Tasks.md": { - "size": 4765, - "tags": 3, - "links": 6 - }, "01.02 Home/Pooch list.md": { "size": 1254, "tags": 2, @@ -2084,11 +1974,6 @@ "tags": 0, "links": 4 }, - "00.01 Admin/Memos/2022-01-22.md": { - "size": 1124, - "tags": 0, - "links": 6 - }, "00.01 Admin/Memos/delete.md": { "size": 846, "tags": 0, @@ -2240,7 +2125,7 @@ "links": 4 }, "01.02 Home/@Shopping list.md": { - "size": 2387, + "size": 2649, "tags": 1, "links": 1 }, @@ -2389,11 +2274,6 @@ "tags": 0, "links": 2 }, - "06.02 Investments/Helium creates an open source, decentralized future for the web.md": { - "size": 14144, - "tags": 1, - "links": 2 - }, "00.01 Admin/Memos/2022-02-07.md": { "size": 934, "tags": 0, @@ -3055,7 +2935,7 @@ "links": 4 }, "05.02 Networks/Configuring Telegram bots.md": { - "size": 3131, + "size": 3923, "tags": 0, "links": 9 }, @@ -3110,9 +2990,9 @@ "links": 0 }, "00.01 Admin/Memos/2022-03-13.md": { - "size": 961, + "size": 1321, "tags": 0, - "links": 4 + "links": 9 }, "00.04 IT/40+ of the best open-source tools to build your startup, from project management to infrastructure.md": { "size": 6595, @@ -3153,14 +3033,164 @@ "size": 43055, "tags": 4, "links": 1 + }, + "03.03 Food & Wine/Fresh Tomato Eggs in Purgatory with Chickpeas.md": { + "size": 3521, + "tags": 4, + "links": 2 + }, + "01.01 Life Orga/@Life Admin.md": { + "size": 2448, + "tags": 4, + "links": 4 + }, + "01.02 Home/2022-03-14 Test event.md": { + "size": 265, + "tags": 0, + "links": 0 + }, + "00.01 Admin/Memos/2022-01-22.md": { + "size": 1124, + "tags": 0, + "links": 6 + }, + "00.01 Admin/Memos/2022-03-14.md": { + "size": 966, + "tags": 0, + "links": 4 + }, + "06.02 Investments/QED Naval.md": { + "size": 2117, + "tags": 6, + "links": 2 + }, + "06.02 Investments/VC Tasks.md": { + "size": 5140, + "tags": 3, + "links": 6 + }, + "06.02 Investments/@Investment Task master.md": { + "size": 3317, + "tags": 5, + "links": 6 + }, + "06.02 Investments/Crypto Tasks.md": { + "size": 6566, + "tags": 3, + "links": 11 + }, + "06.02 Investments/EOS.md": { + "size": 4019, + "tags": 4, + "links": 2 + }, + "06.02 Investments/VC Investments.md": { + "size": 1504, + "tags": 3, + "links": 5 + }, + "06.02 Investments/Ocean Protocol.md": { + "size": 3015, + "tags": 4, + "links": 2 + }, + "06.02 Investments/Thalès.md": { + "size": 1926, + "tags": 4, + "links": 2 + }, + "06.02 Investments/Le Miel de Paris.md": { + "size": 1681, + "tags": 4, + "links": 2 + }, + "06.02 Investments/Nimbus.md": { + "size": 3018, + "tags": 3, + "links": 2 + }, + "06.02 Investments/Crypto Investments.md": { + "size": 2075, + "tags": 3, + "links": 10 + }, + "06.02 Investments/Helium creates an open source, decentralized future for the web.md": { + "size": 14451, + "tags": 1, + "links": 2 + }, + "06.02 Investments/Revolut.md": { + "size": 3064, + "tags": 4, + "links": 2 + }, + "06.02 Investments/Enjin.md": { + "size": 3526, + "tags": 4, + "links": 3 + }, + "06.02 Investments/@Investment master.md": { + "size": 2925, + "tags": 5, + "links": 8 + }, + "06.02 Investments/Equity Investments.md": { + "size": 1306, + "tags": 2, + "links": 5 + }, + "06.02 Investments/Chainlink.md": { + "size": 2221, + "tags": 3, + "links": 2 + }, + "06.02 Investments/Polkadot.md": { + "size": 3057, + "tags": 3, + "links": 3 + }, + "06.02 Investments/Equity Tasks.md": { + "size": 5422, + "tags": 3, + "links": 4 + }, + "06.02 Investments/Valneva.md": { + "size": 2677, + "tags": 4, + "links": 2 + }, + "06.02 Investments/Aragon.md": { + "size": 2347, + "tags": 3, + "links": 2 + }, + "06.02 Investments/Holochain.md": { + "size": 3210, + "tags": 4, + "links": 3 + }, + "06.02 Investments/Airbus.md": { + "size": 2156, + "tags": 4, + "links": 2 + }, + "04.04 Blog/Landing Page.md": { + "size": 797, + "tags": 0, + "links": 2 + }, + "04.04 Blog/DG - News Page.md": { + "size": 551, + "tags": 0, + "links": 3 } }, "commitTypes": { "/": { - "Refactor": 282, - "Create": 241, - "Link": 416, - "Expand": 229 + "Refactor": 325, + "Create": 273, + "Link": 477, + "Expand": 243 } }, "dailyCommits": { @@ -3172,8 +3202,8 @@ "4": 2, "5": 3, "6": 14, - "7": 98, - "8": 115, + "7": 99, + "8": 117, "9": 119, "10": 79, "11": 58, @@ -3182,29 +3212,43 @@ "14": 59, "15": 58, "16": 32, - "17": 47, - "18": 19, - "19": 40, - "20": 69, - "21": 25, - "22": 78, + "17": 58, + "18": 91, + "19": 42, + "20": 81, + "21": 37, + "22": 116, "23": 12 } }, "weeklyCommits": { "/": { - "Mon": 134, + "Mon": 236, "Tue": 73, "Wed": 86, "Thu": 131, "Fri": 124, "Sat": 0, - "Sun": 620 + "Sun": 668 } }, "recentCommits": { "/": { "Expanded": [ + " DG - News Page ", + " DG - News Page ", + " Cover Page ", + " Cover Page ", + " Cover Page ", + " Cover Page ", + " @Shopping list ", + " QED Naval ", + " Configuring Telegram bots ", + " 2022-03-14 ", + " 2022-03-14 Test event ", + " 2022-03-13 ", + " Fresh Tomato Eggs in Purgatory with Chickpeas ", + " 2022-03-13 ", " Configuring Telegram bots ", " GitHub - deividgdtfail2ban_telegram_notifications Sending fail2ban notifications using a Telegram bot ", " GitHub - deividgdtfail2ban_telegram_notifications Sending fail2ban notifications using a Telegram bot ", @@ -3241,23 +3285,41 @@ " @Desserts ", " Banana Foster ", " Banana Foster ", - " What i learnt during my 3 days offline ", - " Untitled ", - " 2022-03-06 ", - " Obsidian plugins ", - " 2022-03-05 ", - " Equity Tasks ", - " 2022-03-04 ", - " 2022-03-03 ", - " Mushroom risotto ", - " 2022-03-02 ", - " 2022-03-01 ", - " 2022-02-28 ", - " On the Road ", - " On the Road ", - " 2022-02-27 " + " What i learnt during my 3 days offline " ], "Created": [ + " Landing Page 1 ", + " JPEG ", + " JPEG ", + " Untitled ", + " Airbus ", + " Holochain ", + " Aragon ", + " Valneva ", + " Equity Tasks ", + " Polkadot ", + " Chainlink ", + " Equity Investments ", + " @Investment master ", + " Enjin ", + " Revolut ", + " Helium creates an open source, decentralized future for the web ", + " Crypto Investments ", + " Nimbus ", + " Le Miel de Paris ", + " Thalès ", + " Ocean Protocol ", + " VC Investments ", + " EOS ", + " Crypto Tasks ", + " @Investment Task master ", + " VC Tasks ", + " QED Naval ", + " 2022-03-14 ", + " (Every M) Test event) ", + " Markdown ", + " @Life Admin ", + " Fresh Tomato Eggs in Purgatory with Chickpeas ", " Jeff Zucker Scandal Inside the CNN President's Downfall ", " ‘I’m the Operator’ The Aftermath of a Self-Driving Tragedy ", " For the West, the Worst Is Yet to Come ", @@ -3276,41 +3338,19 @@ " 2022-03-11 ", " GitHub - matriphemonit2telegram A simple script to send Monit alerts using Telegram bot. ", " GitHub - fxkjdlogwatch-telegram-bot Send logwatch results to your telegram account ", - " mbvservers_bot ", - " Untitled ", - " 2022-03-10 ", - " 2022-03-09 ", - " Babylone ", - " 2022-03-08 ", - " 2022-03-07 ", - " Untitled ", - " Untitled ", - " Untitled ", - " Untitled ", - " Untitled ", - " Untitled ", - " Untitled ", - " Banana Foster ", - " Untitled ", - " Untitled ", - " 2022-03-06 ", - " 2022-03-05 ", - " The 10 Keys to A Successful Board Meeting How to Make Them Great and Not Something Everyone Dreads from Ajay Agarwal, Bain Capital Partners SaaStr ", - " 2022-03-04 ", - " 2022-03-03 ", - " Mushroom risotto ", - " 2022-03-02 ", - " Managing people 🤯 Andreas Klinger ", - " 2022-03-01 ", - " Reading Simone de Beauvoir’s ‘Ethics of Ambiguity’ in prison Aeon Essays ", - " 2022-02-28 ", - " Untitled ", - " On the Road Introduction & Summary ", - " On the Road ", - " Red Lentil Soup With Preserved Lemon and Crispy Garlic ", - " The Taliban Confront the Realities of Power " + " mbvservers_bot " ], "Renamed": [ + " DG - News Page ", + " News Page ", + " Landing Page ", + " Cover Page ", + " 2022-01-22 ", + " 2022-01-22 ", + " 2022-03-14 Test event ", + " 2022-03-14 Test event ", + " @Life Admin ", + " Fresh Tomato Eggs in Purgatory with Chickpeas ", " Jeff Zucker Scandal Inside the CNN President's Downfall ", " For the West, the Worst Is Yet to Come ", " Three Bodies in Texas ", @@ -3351,19 +3391,35 @@ " Putin’s New Iron Curtain ", " Opinion The Russia Sanctions That Could Actually Stop Putin ", " Vladimir Putin’s Revisionist History of Russia and Ukraine ", - " The Power of Emotional Honesty ", - " On the pleasures of hand-writing letters you’ll never send ", - " In Kashmir, indigenous Muslim healers cure broken bones with spirituality — and science ", - " As rents rise, Americans are stuck in homes even when they want to move ", - " Shilla ", - " Afghan Anar ", - " A view from across the river ", - " Notes apps are where ideas go to die. And that’s good. ", - " The Science of How Alive You Really Are Alan Turing, Trees, and the Wonder of Life ", - " Gaming Wall Street ", - " Gaming Wall Street " + " The Power of Emotional Honesty " ], "Tagged": [ + " A Vibe Shift Is Coming ", + " QED Naval ", + " VC Tasks ", + " @Investment Task master ", + " Crypto Tasks ", + " EOS ", + " VC Investments ", + " Ocean Protocol ", + " Thalès ", + " Le Miel de Paris ", + " Nimbus ", + " Crypto Investments ", + " Helium creates an open source, decentralized future for the web ", + " Revolut ", + " Enjin ", + " @Investment master ", + " Equity Investments ", + " Chainlink ", + " Polkadot ", + " Equity Tasks ", + " Valneva ", + " Aragon ", + " Holochain ", + " Airbus ", + " @Life Admin ", + " Fresh Tomato Eggs in Purgatory with Chickpeas ", " Jeff Zucker Scandal Inside the CNN President's Downfall ", " For the West, the Worst Is Yet to Come ", " Three Bodies in Texas ", @@ -3388,33 +3444,7 @@ " Vladimir Putin’s Revisionist History of Russia and Ukraine ", " Opinion The Russia Sanctions That Could Actually Stop Putin ", " Putin’s New Iron Curtain ", - " The Power of Emotional Honesty ", - " The Power of Emotional Honesty ", - " On the pleasures of hand-writing letters you’ll never send ", - " As rents rise, Americans are stuck in homes even when they want to move ", - " In Kashmir, indigenous Muslim healers cure broken bones with spirituality — and science ", - " A view from across the river ", - " Notes apps are where ideas go to die. And that’s good. ", - " The Science of How Alive You Really Are Alan Turing, Trees, and the Wonder of Life ", - " The curse of sliced bread ", - " Visualise your finances with hledger, InfluxDB, and Grafana ", - " The Great Resignation has morphed into the Great Sabbatical ", - " A Vibe Shift Is Coming ", - " Bimi ", - " Iroquois ", - " L’enquête « Suisse Secrets » relance le débat sur la liberté de la presse face au secret bancaire ", - " Why Are Letters Shaped the Way They Are ", - " Ancient Indian texts reveal the liberating power of metaphysics ", - " To Live and Love with a Dying World ", - " Google Search Is Dying ", - " Inside a $4-billion family feud ", - " Is tech gentrifying Latin America’s cities ", - " TikTok Star Ava Majury Discovers the Dark Side of Fame ", - " Will the Bush Dynasty Die With George P. Bush ", - " Confessions of a Bitcoin Widow How a Dream Life Turned into a Nightmare The Walrus ", - " Cowboys paid $2.4M over cheerleader allegations ", - " If they could turn back time how tech billionaires are trying to reverse the ageing process ", - " Nurses Have Finally Learned What They’re Worth " + " The Power of Emotional Honesty " ], "Refactored": [ " @Main Dashboard ", @@ -3436,9 +3466,23 @@ " Thai Basil Sauce Noodles with Jammy Eggs ", " Tous les hommes n'habitent pas le monde de la même façon - Jean-Paul Dubois ", " Template Recipe ", - " List of plugins " + " List of plugins ", + " Fresh Tomato Eggs in Purgatory with Chickpeas ", + " Fresh Tomato Eggs in Purgatory with Chickpeas ", + " DG - News Page " ], "Deleted": [ + " JPEG ", + " JPEG ", + " @Life Admin ", + " Airbus ", + " Holochain ", + " Aragon ", + " Valneva ", + " Equity Tasks ", + " Polkadot ", + " Chainlink ", + " Equity Investments ", " Untitled ", " unlinked files output ", " Untitled ", @@ -3474,9 +3518,48 @@ " Docker config ", " @Life Admin ", " Three Bodies in Texas - Believer Magazine ", - " ‘I’m the Operator’ The Aftermath of a Self-Driving Tragedy " + " ‘I’m the Operator’ The Aftermath of a Self-Driving Tragedy ", + " VC Tasks ", + " @Investment Task master ", + " Crypto Tasks ", + " EOS " ], "Linked": [ + " DG - News Page ", + " Landing Page ", + " DG - News Page ", + " Cover Page ", + " Cover Page ", + " Cover Page ", + " QED Naval ", + " VC Tasks ", + " @Investment Task master ", + " Crypto Tasks ", + " EOS ", + " VC Investments ", + " Ocean Protocol ", + " Thalès ", + " Le Miel de Paris ", + " Nimbus ", + " Crypto Investments ", + " Helium creates an open source, decentralized future for the web ", + " Revolut ", + " Enjin ", + " @Investment master ", + " Equity Investments ", + " Chainlink ", + " Polkadot ", + " Equity Tasks ", + " Valneva ", + " Aragon ", + " Holochain ", + " Airbus ", + " 2022-03-14 ", + " @Life Admin ", + " 2022-03-13 ", + " Fresh Tomato Eggs in Purgatory with Chickpeas ", + " Fresh Tomato Eggs in Purgatory with Chickpeas ", + " 2022-03-13 ", " Jeff Zucker Scandal Inside the CNN President's Downfall ", " For the West, the Worst Is Yet to Come ", " Three Bodies in Texas ", @@ -3492,49 +3575,15 @@ " 2022-03-12 ", " 2022-03-11 ", " Server VPN ", - " Server Tools ", - " Configuring Telegram bots ", - " Server Alias ", - " Server Cloud ", - " Configuring Telegram bots ", - " GitHub - matriphemonit2telegram A simple script to send Monit alerts using Telegram bot. ", - " Configuring Telegram bots ", - " GitHub - matriphemonit2telegram A simple script to send Monit alerts using Telegram bot. ", - " GitHub - fxkjdlogwatch-telegram-bot Send logwatch results to your telegram account ", - " GitHub - fxkjdlogwatch-telegram-bot Send logwatch results to your telegram account ", - " Configuring Telegram bots ", - " Configuring Telegram bots ", - " 2022-03-10 ", - " 2022-03-09 ", - " Babylone ", - " 2022-03-08 ", - " 2022-03-07 ", - " The twitching generation ", - " Slow sex, long life ", - " Uyghur Exile ", - " The improbable endless heroism of Volodymyr Zelensky ", - " The man who paid for Anerica's fear ", - " Banana Foster ", - " Untitled ", - " 2022-03-06 ", - " 2022-03-05 ", - " The 10 Keys to A Successful Board Meeting How to Make Them Great and Not Something Everyone Dreads from Ajay Agarwal, Bain Capital Partners SaaStr ", - " 2022-03-04 ", - " 2022-03-03 ", - " Mushroom risotto ", - " 2022-03-02 ", - " 2022-03-02 ", - " Managing people 🤯 Andreas Klinger ", - " 2022-03-01 ", - " Reading Simone de Beauvoir’s ‘Ethics of Ambiguity’ in prison Aeon Essays ", - " 2022-02-28 " + " Server Tools " ], "Removed Tags from": [ " Le Miel de Paris ", " What i learnt during my 3 days offline ", " Migrants faced the worst of the gig economy, so they made their own delivery app ", " Confessions of a Bitcoin Widow How a Dream Life Turned into a Nightmare The Walrus ", - " L’enquête « Suisse Secrets » relance le débat sur la liberté de la presse face au secret bancaire " + " L’enquête « Suisse Secrets » relance le débat sur la liberté de la presse face au secret bancaire ", + " A Vibe Shift Is Coming " ], "Removed Links from": [ " 2022-01-22 ", @@ -3546,7 +3595,10 @@ " « Quand tu arrives ici, tu te dis que rien n’est cher » les Parisiens s’entichent de Marseille ", " Désert rural. La grande ruée vers les maisons italiennes à 1 euro ", " En Bretagne, les responsables politiques redoutent l’émergence d’une « Breizh Riviera » ", - " ntfy.sh - email to message " + " ntfy.sh - email to message ", + " Fresh Tomato Eggs in Purgatory with Chickpeas ", + " Cover Page ", + " Landing Page " ] } }, diff --git a/.obsidian/plugins/obsidian-read-it-later/data.json b/.obsidian/plugins/obsidian-read-it-later/data.json index a516e6d7..ca995cc5 100644 --- a/.obsidian/plugins/obsidian-read-it-later/data.json +++ b/.obsidian/plugins/obsidian-read-it-later/data.json @@ -7,7 +7,7 @@ "twitterNoteTitle": "Tweet from %tweetAuthorName% (%date%)", "twitterNote": "---\n\nAlias: [\"\"]\nTag: [\"\", \"\"]\nDate: <% tp.date.now(\"YYYY-MM-DD\") %>\nDocType: \"WebClipping\"\nHierarchy:\nTimeStamp: <% tp.date.now(\"YYYY-MM-DD\") %>\nLink: %tweetURL%\nlocation:\nCollapseMetaTable: Yes\n\n---\n\nParent:: [[Twitter]]\nRead:: No\n\n---\n\n \n\n```button\nname Save\ntype command\naction Save current file\nid Save\n```\n^button-%tweetAuthorName%NSave\n\n \n\n# %tweetAuthorName%\n\n%tweetContent%", "parseableArticleNoteTitle": "%title%", - "parsableArticleNote": "---\n\nAlias: [\"\"]\nTag: [\"\", \"\"]\nDate: <% tp.date.now(\"YYYY-MM-DD\") %>\nDocType: \"WebClipping\"\nHierarchy:\nTimeStamp: <% tp.date.now(\"YYYY-MM-DD\") %>\nLink: %articleURL%\nlocation:\nCollapseMetaTable: Yes\n\n---\n\nParent:: [[@News|News]]\nRead:: No\n\n---\n\n \n\n```button\nname Save\ntype command\naction Save current file\nid Save\n```\n^button-%articleTitle%NSave\n\n \n\n# %articleTitle%\n\n%articleContent%", + "parsableArticleNote": "---\n\ndg-publish: true\nAlias: [\"\"]\nTag: [\"\", \"\"]\nDate: <% tp.date.now(\"YYYY-MM-DD\") %>\nDocType: \"WebClipping\"\nHierarchy:\nTimeStamp: <% tp.date.now(\"YYYY-MM-DD\") %>\nLink: %articleURL%\nlocation:\nCollapseMetaTable: Yes\n\n---\n\nParent:: [[@News|News]]\nRead:: No\n\n---\n\n \n\n```button\nname Save\ntype command\naction Save current file\nid Save\n```\n^button-%articleTitle%NSave\n\n \n\n# %articleTitle%\n\n%articleContent%\n\n \n \n\n---\n`$= dv.el('center', 'Source: ' + dv.current().Link + ', ' + dv.current().Date.toLocaleString(\"fr-FR\"))`", "notParseableArticleNoteTitle": "Article %date%", "notParsableArticleNote": "---\n\nAlias: [\"\"]\nTag: [\"\", \"\"]\nDate: <% tp.date.now(\"YYYY-MM-DD\") %>\nDocType: \"WebClipping\"\nHierarchy:\nTimeStamp: <% tp.date.now(\"YYYY-MM-DD\") %>\nLink: %articleURL%\nlocation:\nCollapseMetaTable: Yes\n\n---\n\nParent:: [[@News|News]]\nRead:: No\n\n---\n\n \n\n```button\nname Save\ntype command\naction Save current file\nid Save\n```\n^button-%articleURL%NSave\n\n \n\n%articleURL%", "textSnippetNoteTitle": "Notice %date%", diff --git a/.obsidian/plugins/obsidian-reminder-plugin/data.json b/.obsidian/plugins/obsidian-reminder-plugin/data.json index 419f9090..8e5acfa8 100644 --- a/.obsidian/plugins/obsidian-reminder-plugin/data.json +++ b/.obsidian/plugins/obsidian-reminder-plugin/data.json @@ -4,7 +4,7 @@ "05.01 Computer setup/Storage and Syncing.md": [ { "title": "[[Storage and Syncing|Storage & Sync]]: Backup Volumes to [[Sync|Sync.com]]", - "time": "2022-03-14", + "time": "2022-03-21", "rowNumber": 193 }, { @@ -306,15 +306,15 @@ } ], "01.02 Home/Household.md": [ - { - "title": "[[Household]]: *Paper* recycling collection", - "time": "2022-03-15", - "rowNumber": 72 - }, { "title": "[[Household]]: *Cardboard* recycling collection", "time": "2022-03-22", - "rowNumber": 77 + "rowNumber": 78 + }, + { + "title": "[[Household]]: *Paper* recycling collection", + "time": "2022-03-29", + "rowNumber": 72 } ], "01.03 Family/Pia Bousquié.md": [ @@ -324,13 +324,6 @@ "rowNumber": 98 } ], - "00.01 Admin/Memos/2022-01-22.md": [ - { - "title": "22:46 [[2022-01-22|Memo]], [[@Finances]]: GBP account re moving to ZH", - "time": "2022-03-31", - "rowNumber": 84 - } - ], "00.01 Admin/Memos/2022-01-24.md": [ { "title": "14:28 [[@Life Admin]], [[2022-01-24|Memo]]: finishings for the flat: curtains, bins, bedside tables #shopping #home", @@ -413,27 +406,6 @@ "rowNumber": 75 } ], - "06.02 Investments/VC Tasks.md": [ - { - "title": "[[VC Tasks#internet alerts|monitor VC news and publications]]", - "time": "2022-03-18", - "rowNumber": 74 - } - ], - "06.02 Investments/Crypto Tasks.md": [ - { - "title": "[[Crypto Tasks#internet alerts|monitor Crypto news and publications]]", - "time": "2022-03-18", - "rowNumber": 74 - } - ], - "00.01 Admin/Memos/2022-02-13.md": [ - { - "title": "22:41 [[2022-02-12|Memo]], [[@IT & Computer|IT & Computer]]: explore how to publish Obsidian notes as a website", - "time": "2022-03-15", - "rowNumber": 95 - } - ], "00.01 Admin/Memos/2022-02-16.md": [ { "title": "07:50 [[Selfhosting]], [[Server Cloud]], [[Nextcloud]], [[2022-02-16|Memo]]: upgrade Nextcloud", @@ -441,13 +413,6 @@ "rowNumber": 84 } ], - "06.02 Investments/Equity Tasks.md": [ - { - "title": "[[Equity Tasks#internet alerts|monitor Equity news and publications]]", - "time": "2022-03-18", - "rowNumber": 74 - } - ], "01.03 Family/Aglaé de Villeneuve.md": [ { "title": ":birthday: **[[Aglaé de Villeneuve|Aglaé]]**", @@ -468,6 +433,58 @@ "time": "2022-03-27", "rowNumber": 88 } + ], + "00.01 Admin/Memos/2022-03-13.md": [ + { + "title": "17:38 [[2022-03-13.md|Memo]], [[@Family.md|Family]], [[Eloi de Villeneuve]]: Prendre mes billets pour Paris (w/e 26 Mars)", + "time": "2022-03-16", + "rowNumber": 88 + }, + { + "title": "18:31 [[2022-03-13|Memo]], [[Voitures]]: regarder prix avec la montée du carburant", + "time": "2022-03-17", + "rowNumber": 90 + }, + { + "title": "18:16 [[2022-03-13|Memo]], [[Eloi de Villeneuve]]: trouver un cadeau de fiancailles", + "time": "2022-03-22", + "rowNumber": 89 + } + ], + "01.01 Life Orga/@Life Admin.md": [ + { + "title": "[[@Life Admin]]: Cancel UK mobile line", + "time": "2022-03-31", + "rowNumber": 77 + } + ], + "00.01 Admin/Memos/2022-01-22.md": [ + { + "title": "22:46 [[2022-01-22|Memo]], [[@Finances]]: GBP account re moving to ZH", + "time": "2022-03-31", + "rowNumber": 84 + } + ], + "06.02 Investments/VC Tasks.md": [ + { + "title": "[[VC Tasks#internet alerts|monitor VC news and publications]]", + "time": "2022-03-18", + "rowNumber": 74 + } + ], + "06.02 Investments/Crypto Tasks.md": [ + { + "title": "[[Crypto Tasks#internet alerts|monitor Crypto news and publications]]", + "time": "2022-03-18", + "rowNumber": 74 + } + ], + "06.02 Investments/Equity Tasks.md": [ + { + "title": "[[Equity Tasks#internet alerts|monitor Equity news and publications]]", + "time": "2022-03-18", + "rowNumber": 74 + } ] }, "debug": false, diff --git a/.obsidian/snippets/folder_4_icon.css b/.obsidian/snippets/folder_4_icon.css index 1dae2153..cb3e9f23 100644 --- a/.obsidian/snippets/folder_4_icon.css +++ b/.obsidian/snippets/folder_4_icon.css @@ -93,6 +93,11 @@ div[data-path="04.03 Creative snippets"] .nav-folder-title-content::before content: "🖋 "; } +div[data-path="04.04 Blog"] .nav-folder-title-content::before +{ + content: "📓 "; +} + div[data-path="05.01 Computer setup"] .nav-folder-title-content::before { content: "💻 "; diff --git a/.obsidian/workspace b/.obsidian/workspace index bae8b82b..485c7d24 100644 --- a/.obsidian/workspace +++ b/.obsidian/workspace @@ -4,7 +4,7 @@ "type": "split", "children": [ { - "id": "7896a4eca58a4145", + "id": "566e7ba005cfd5cd", "type": "leaf", "state": { "type": "markdown", @@ -143,17 +143,17 @@ ], "currentTab": 2 }, - "active": "7896a4eca58a4145", + "active": "566e7ba005cfd5cd", "lastOpenFiles": [ "01.02 Home/@Main Dashboard.md", - "00.03 News/Jeff Zucker Scandal Inside the CNN President's Downfall.md", - "00.02 Inbox/‘I’m the Operator’ The Aftermath of a Self-Driving Tragedy.md", - "00.03 News/For the West, the Worst Is Yet to Come.md", - "00.03 News/Three Bodies in Texas.md", - "05.02 Networks/Configuring Telegram bots.md", + "00.01 Admin/Memos/2022-03-14.md", "00.01 Admin/Memos/2022-03-13.md", - "05.02 Networks/GitHub - deividgdtfail2ban_telegram_notifications Sending fail2ban notifications using a Telegram bot.md", - "05.02 Networks/GitHub - fxkjdlogwatch-telegram-bot Send logwatch results to your telegram account.md", - "05.02 Networks/VPS Console Dialogue.md" + "00.01 Admin/Memos/2022-03-12.md", + "04.04 Blog/Landing Page.md", + "04.04 Blog/DG - News Page.md", + "00.03 News/A view from across the river.md", + "00.03 News/A Vibe Shift Is Coming.md", + "00.03 News/@News.md", + "05.02 Networks/Selfhosting.md" ] } \ No newline at end of file diff --git a/00.01 Admin/Memos/2022-02-13.md b/00.01 Admin/Memos/2022-02-13.md index c7598961..4548405f 100644 --- a/00.01 Admin/Memos/2022-02-13.md +++ b/00.01 Admin/Memos/2022-02-13.md @@ -93,4 +93,4 @@ Loret ipsum     -- [ ] 22:41 [[2022-02-12|Memo]], [[@IT & Computer|IT & Computer]]: explore how to publish Obsidian notes as a website 📅 2022-03-15 \ No newline at end of file +- [x] 22:41 [[2022-02-12|Memo]], [[@IT & Computer|IT & Computer]]: explore how to publish Obsidian notes as a website 📅 2022-03-15 ✅ 2022-03-14 \ No newline at end of file diff --git a/00.01 Admin/Memos/2022-03-13.md b/00.01 Admin/Memos/2022-03-13.md index f0281d1e..ac9526ff 100644 --- a/00.01 Admin/Memos/2022-03-13.md +++ b/00.01 Admin/Memos/2022-03-13.md @@ -6,16 +6,16 @@ Hierarchy: TimeStamp: location: CollapseMetaTable: Yes -Sleep: 5.5 +Sleep: 6.5 Happiness: 90 Gratefulness: 90 Stress: 40 FrontHeadBar: 5 EarHeadBar: 45 BackHeadBar: 35 -Water: 1.25 -Coffee: 0 -Steps: +Water: 2.75 +Coffee: 1 +Steps: 10719 Ski: Riding: Racket: @@ -86,6 +86,9 @@ This section does serve for quick memos. %% ### %%   +- [ ] 17:38 [[2022-03-13.md|Memo]], [[@Family.md|Family]], [[Eloi de Villeneuve]]: Prendre mes billets pour Paris (w/e 26 Mars) 📆2022-03-16 +- [ ] 18:16 [[2022-03-13|Memo]], [[Eloi de Villeneuve]]: trouver un cadeau de fiancailles 📆2022-03-22 +- [ ] 18:31 [[2022-03-13|Memo]], [[Voitures]]: regarder prix avec la montée du carburant 📆2022-03-17 --- diff --git a/00.01 Admin/Memos/2022-03-14.md b/00.01 Admin/Memos/2022-03-14.md new file mode 100644 index 00000000..3bf6ecfc --- /dev/null +++ b/00.01 Admin/Memos/2022-03-14.md @@ -0,0 +1,101 @@ +--- + +Date: 2022-03-14 +DocType: Note +Hierarchy: +TimeStamp: +location: +CollapseMetaTable: Yes +Sleep: 7.5 +Happiness: 90 +Gratefulness: 85 +Stress: 45 +FrontHeadBar: 5 +EarHeadBar: 50 +BackHeadBar: 40 +Water: 2.5 +Coffee: 1 +Steps: 5347 +Ski: +Riding: +Racket: +Football: + +--- + +%% Parent:: [[@Life Admin]] %% + +--- + +[[2022-03-13|<< 🗓 Previous ]]       [[@Main Dashboard|Back]]       [[2022-03-15|🗓 Next >>]] + +--- + +  + +```button +name Record today's health +type command +action MetaEdit: Run MetaEdit +id EditMetaData +``` +^button-2022-03-14Edit + +```button +name Save +type command +action Save current file +id Save +``` +^button-2022-03-14NSave + +  + +# 2022-03-14 + +  + +```ad-abstract +title: Summary +collapse: open +Note Description +``` + +  + +```toc +style: number +``` + +  + +--- + +  + +### Memos + +  + +#### Memos + +This section does serve for quick memos. + +  + + +%% ### %% +  + +--- + +  + +### Notes + +  + +Loret ipsum + +  +  \ No newline at end of file diff --git a/00.02 Inbox/Lionel Asbo.md b/00.02 Inbox/Lionel Asbo.md index 4a880061..b1f1093a 100644 --- a/00.02 Inbox/Lionel Asbo.md +++ b/00.02 Inbox/Lionel Asbo.md @@ -13,7 +13,7 @@ Source: Published: 2012 Link: https://en.wikipedia.org/wiki/Lionel_Asbo:_State_of_England Read: - Cover: https://i.gr-assets.com/images/S/compressed.photo.goodreads.com/books/1340656795i/15697997._UY200_.jpg + Cover: https://products-images.di-static.com/image/martin-amis-lionel-asbo/9780099565680-475x500-1.webp CollapseMetaTable: yes --- diff --git a/00.03 News/@News.md b/00.03 News/@News.md index 089028b3..8517141b 100644 --- a/00.03 News/@News.md +++ b/00.03 News/@News.md @@ -36,13 +36,14 @@ id Save   -# Folder map +# Article map +   ```ad-abstract title: Summary collapse: open -This note enables to navigate in the 00.03 News section and find any Note in this Vault by Note or Tag +This page enables to navigate in the News section. ```   @@ -202,3 +203,6 @@ sort file.link asc     + +--- +
Copyright © 2022 mfxm.fr. All rights reserved.
\ No newline at end of file diff --git a/00.03 News/A Vibe Shift Is Coming.md b/00.03 News/A Vibe Shift Is Coming.md index 18f0b4bf..3a2f92f7 100644 --- a/00.03 News/A Vibe Shift Is Coming.md +++ b/00.03 News/A Vibe Shift Is Coming.md @@ -1,5 +1,6 @@ --- +dg-publish: true Tag: ["Society", "Trend", "Shift"] Date: 2022-02-23 DocType: "WebClipping" @@ -12,7 +13,9 @@ CollapseMetaTable: Yes --- Parent:: [[@News|News]] -Read:: No +%% +Read:: No +%% --- @@ -90,10 +93,8 @@ I decided to poll my friends about what they’re doing, mostly the ones without I could just choose to opt out, but here’s a glimpse of what awaits me if I survive: Late last summer, Monahan was in L.A. hanging out at “this kind of trendy wine bar called El Prado,” where he observed a 21-year-old woman wearing Rocket Dogs, as in the platform shoes, with low-rise, boot-cut True Religion jeans. He noticed how she had a little black leather under-the-arm purse and a cami and a trucker hat. It was as though she had time-traveled from [early-aughts Kitson.](https://www.thecut.com/2021/08/the-red-pilling-of-kitson-fraser-ross.html) He watched as she started talking to an older hipster dude. “He was trying to explain to her what a mosh pit was, and my friend was just kind of cracking up about this weird intergenerational conversation happening, when we were like, ‘This girl looks like she just shifted from, I don’t know, like, 2008 to this bar and is talking to a guy who looks like he never updated his style since 2008.’ And he’s trying to give her more of a POV on crowd-surfing at hardcore shows in the aughts,” Monahan says, laughing incredulously. -* [Catching New Yorkers Mid-Delivery](https://www.thecut.com/2022/02/photos-catching-new-yorkers-mid-delivery.html) -* [Let’s Get High](https://www.thecut.com/2022/02/cathy-horyn-on-spring-fashions-airy-looks.html) -* [A Bonbon for the Hip](https://www.thecut.com/2022/02/new-chanel-belt-bag.html) - -[See All](https://www.thecut.com/tags/spring-fashion-issue-2022) +  +  -A Vibe Shift Is Coming \ No newline at end of file +--- +`$= dv.el('center', 'Source: ' + dv.current().Link + ', ' + dv.current().Date.toLocaleString("fr-FR"))` \ No newline at end of file diff --git a/00.03 News/A view from across the river.md b/00.03 News/A view from across the river.md index f3e756d8..43d74d6f 100644 --- a/00.03 News/A view from across the river.md +++ b/00.03 News/A view from across the river.md @@ -1,19 +1,22 @@ --- +dg-publish: true Alias: [""] Tag: ["Travel", "EastDehli", "Suburb"] Date: 2022-02-26 DocType: "WebClipping" Hierarchy: TimeStamp: -Link: https://chiraghdilli.com/2022/01/29/a-view-from-across-the-river/?ref=refind +Link: https://chiraghdilli.com/2022/01/29/a-view-from-across-the-river/ location: CollapseMetaTable: Yes --- Parent:: [[@News|News]] +%% Read:: Yes +%% --- @@ -129,4 +132,10 @@ Cover image: A view of the Yamuna from its eastern bank. \[iv\] ‘Report of the Delhi Town Planning Committee on its choice of site for the new imperial capital of Delhi, 13 July 1912’, in Mushirul Hasan and Dinyar Patel (eds), _From Ghalib’s Dilli to Lutyen’s New Delhi: A Documentary Record_. New Delhi: National Archives of India and Oxford University Press, 2014, p. 134. -\[v\] ‘Letter from H. Wheeler, Secretary, Government of India, Home Department, to the Chief Secretary, Government of the United Provinces, on land acquisition on the left bank of the Jumna, 8 August 1912’, in Hasan and Patel (eds), _From Ghalib’s Dilli to Lutyen’s New Delhi_, p. 189. \ No newline at end of file +\[v\] ‘Letter from H. Wheeler, Secretary, Government of India, Home Department, to the Chief Secretary, Government of the United Provinces, on land acquisition on the left bank of the Jumna, 8 August 1912’, in Hasan and Patel (eds), _From Ghalib’s Dilli to Lutyen’s New Delhi_, p. 189. + +  +  + +--- +`$= dv.el('center', 'Source: ' + dv.current().Link + ', ' + dv.current().Date.toLocaleString("fr-FR"))` \ No newline at end of file diff --git a/01.01 Life Orga/@Life Admin.md b/01.01 Life Orga/@Life Admin.md new file mode 100644 index 00000000..6dfbc274 --- /dev/null +++ b/01.01 Life Orga/@Life Admin.md @@ -0,0 +1,118 @@ +--- + +Alias: ["Life Admin"] +Tag: ["Admin", "LifeHacks", "Utilities", "PublicService"] +Date: 2021-08-12 +DocType: &DT "Task" +Hierarchy: "NonRoot" +Priority: "Medium" +Status: "In-progress" +StartDate: 2021-08-12 +DueDate: 2022-03-15 +NextReviewDate: &RD 2022-03-31 +TimeStamp: 2021-08-29 +location: [51.514678599999996, -0.18378583926867909] +fc-calendar: "D2D Calendar" +fc-date: *RD +fc-category: *DT +CollapseMetaTable: yes + +--- + +Parent:: [[@@Life Organisation|Life Organisation]] + +  + +
+
Progress bar
+
+ +`= "
" + "
" + round((length(filter(this.file.tasks.completed, (t) => t = true)) / length(this.file.tasks)) * 100) + "% completed
" ` + +--- + +  + +```button +name Edit Task parameters +type command +action MetaEdit: Run MetaEdit +id EditMetaData +``` +^button-PSEdit + +```button +name Save +type command +action Save current file +id Save +``` +^button-PSSave + +  + +# Utilities & Public Service + +  + +```ad-abstract +title: Summary +collapse: open +Repository of tasks and To-Dos re Utilities & Public service admin +``` + +  + +--- + +  + +### To-dos + +  + +- [x] [[@Life Admin]]: Change address with HSBC FR/UK 📅 2022-02-15 ✅ 2022-02-14 +- [x] [[@Life Admin]]: Update UK Nationality scheme of new address 📅 2022-02-15 ✅ 2022-02-14 +- [x] [[@Life Admin]]: Check if requirement to close NHS/HMRC accounts 📅 2022-02-15 ✅ 2022-02-14 +- [x] [[@Life Admin]]: Get a [[@Life Admin#Swiss Mobile|CH mobile line]] 📅 2022-03-31 ✅ 2022-02-22 +- [ ] [[@Life Admin]]: Cancel UK mobile line 📅 2022-03-31 +- [x] [[@Life Admin]]: Monitor UK naturalisation (2021-08-02) 📅 2022-02-02 ✅ 2022-02-01 + +  + +--- + +  + +### Completed to-dos + +  + +- [x] Check Tax implication of Unemployment Benefits +- [x] Election Register +- [x] Apply for a [[@Life Admin#French ID|French ID]] + +  + +--- + +  + +### Dependencies + +  + +#### French ID + +[Démarche générale](https://uk.ambafrance.org/Carte-d-identite-d-un-majeur-renouvellement-suite-a-expiration-25601) + +[Prise de rendez-vous](https://pastel.diplomatie.gouv.fr/rdvinternet/html-4.02.00/frameset/frameset.html?lcid=2&sgid=173&suid=5) + +  + +#### Swiss Mobile + +[Compare mobile plans: 78 deals from CHF 9.90 at comparis.ch](https://en.comparis.ch/telecom/mobile/angebote/alle-handyabos) + +  +  diff --git a/01.02 Home/2022-03-14 Test event.md b/01.02 Home/2022-03-14 Test event.md new file mode 100644 index 00000000..d75906c9 --- /dev/null +++ b/01.02 Home/2022-03-14 Test event.md @@ -0,0 +1,16 @@ +--- +title: Test event +allDay: false +startTime: 14:00 +endTime: 15:30 +type: single +daysOfWeek: [M] +startRecur: 2022-03-14 +endRecur: 2120-03-13 +date: 2022-03-14 +--- + +This is a test event. Things to check: + +- [ ] can the note be edited? +- [ ] Can the note be displaced? \ No newline at end of file diff --git a/01.02 Home/@Shopping list.md b/01.02 Home/@Shopping list.md index 7f6c9547..a5d08ab9 100644 --- a/01.02 Home/@Shopping list.md +++ b/01.02 Home/@Shopping list.md @@ -54,27 +54,27 @@ style: number   - [x] ☕ Coffee ✅ 2022-03-01 -- [x] 🍶 Coke 0 ✅ 2022-03-04 -- [x] 🧃 Apfelschorle ✅ 2022-03-01 +- [x] 🍶 Coke 0 ✅ 2022-03-14 +- [x] 🧃 Apfelschorle ✅ 2022-03-14 - [x] 🍊 Morning juice ✅ 2022-03-01 - [x] 🍿 Snacks ✅ 2022-03-04 - [x] 🍦 Dessert ✅ 2022-03-04 -- [x] 🧈 Beurre ✅ 2022-03-01 -- [ ] 🥯 Bread +- [x] 🧈 Beurre ✅ 2022-03-14 +- [x] 🥯 Bread ✅ 2022-03-14 - [x] 🍯 Honey/Jam ✅ 2022-03-04 - [x] 🍫 Nutella ✅ 2022-02-15 -- [x] 🍐 Fruit ✅ 2022-02-15 -- [x] 🍌 Bananas ✅ 2022-03-12 -- [x] 🍅 vegetables ✅ 2022-02-18 -- [ ] 🧅 onions +- [x] 🍐 Fruit ✅ 2022-03-14 +- [ ] 🍌 Bananas +- [x] 🍅 vegetables ✅ 2022-03-14 +- [x] 🧅 onions ✅ 2022-03-14 - [x] 🧄 garlic ✅ 2022-03-01 -- [x] 🥚 Eggs ✅ 2022-03-01 -- [x] 🧀 Fromage ✅ 2022-03-01 -- [x] 🥩 Cured meat ✅ 2022-02-18 -- [x] 🍖 Fresh meat ✅ 2022-03-01 +- [x] 🥚 Eggs ✅ 2022-03-14 +- [x] 🧀 Fromage ✅ 2022-03-14 +- [x] 🥩 Cured meat ✅ 2022-03-14 +- [x] 🍖 Fresh meat ✅ 2022-03-14 - [x] 🍝 Pasta ✅ 2022-02-06 -- [x] 🍚 Rice ✅ 2022-02-07 -- [x] 🥔 Potatoes ✅ 2022-02-07 +- [ ] 🍚 Rice +- [ ] 🥔 Potatoes - [x] 🍺 Beer ✅ 2022-02-06 - [x] 🍷 Wine ✅ 2022-02-06 @@ -84,22 +84,22 @@ style: number - [x] 🫒 Olive oil ✅ 2022-02-06 - [x] 🌭 Mustard ✅ 2022-02-07 -- [ ] 🥫 Sauces (Ketchup, bbq, etc..) -- [ ] 🌶️ Tabasco -- [ ] 🌶️ Ketjap Manis -- [ ] 🌶️ Cayenne Pepper -- [ ] Soy sauce -- [ ] 🥗 Vinegar -- [ ] 🌿 Thyme -- [ ] 🌿 Dill -- [ ] 🌿 Oregano -- [ ] 🌿 Herbes de Provence -- [ ] 🌿 Coriander -- [ ] 🌿 Cumin -- [ ] 🍛 Garam masala -- [ ] 🌰 Nutmeg -- [ ] 🌱 Ginger -- [ ] 🌱 Curcuma +- [x] 🥫 Sauces (Ketchup, bbq, etc..) ✅ 2022-03-14 +- [x] 🌶️ Tabasco ✅ 2022-03-14 +- [x] 🌶️ Ketjap Manis ✅ 2022-03-14 +- [x] 🌶️ Cayenne Pepper ✅ 2022-03-14 +- [x] Soy sauce ✅ 2022-03-14 +- [x] 🥗 Vinegar ✅ 2022-03-14 +- [x] 🌿 Thyme ✅ 2022-03-14 +- [x] 🌿 Dill ✅ 2022-03-14 +- [x] 🌿 Oregano ✅ 2022-03-14 +- [x] 🌿 Herbes de Provence ✅ 2022-03-14 +- [x] 🌿 Coriander ✅ 2022-03-14 +- [x] 🌿 Cumin ✅ 2022-03-14 +- [x] 🍛 Garam masala ✅ 2022-03-14 +- [x] 🌰 Nutmeg ✅ 2022-03-14 +- [x] 🌱 Ginger ✅ 2022-03-14 +- [x] 🌱 Curcuma ✅ 2022-03-14   diff --git a/01.02 Home/Household.md b/01.02 Home/Household.md index 52b4475d..b023df88 100644 --- a/01.02 Home/Household.md +++ b/01.02 Home/Household.md @@ -70,7 +70,8 @@ This section on different household obligations. #### Garbage collection -- [ ] [[Household]]: *Paper* recycling collection 🔁 every 2 weeks on Tuesday 📅 2022-03-15 +- [ ] [[Household]]: *Paper* recycling collection 🔁 every 2 weeks on Tuesday 📅 2022-03-29 +- [x] [[Household]]: *Paper* recycling collection 🔁 every 2 weeks on Tuesday 📅 2022-03-15 ✅ 2022-03-14 - [x] [[Household]]: *Paper* recycling collection 🔁 every 2 weeks on Tuesday 📅 2022-03-01 ✅ 2022-03-01 - [x] [[Household]]: *Paper* recycling collection 🔁 every 2 weeks on Tuesday 📅 2022-02-15 ✅ 2022-02-14 - [x] [[Household]]: *Paper* recycling collection 🔁 every 2 weeks on Tuesday 📅 2022-02-01 ✅ 2022-01-31 diff --git a/03.03 Food & Wine/Fresh Tomato Eggs in Purgatory with Chickpeas.md b/03.03 Food & Wine/Fresh Tomato Eggs in Purgatory with Chickpeas.md new file mode 100644 index 00000000..9e282294 --- /dev/null +++ b/03.03 Food & Wine/Fresh Tomato Eggs in Purgatory with Chickpeas.md @@ -0,0 +1,154 @@ +--- + +ServingSize: 2 +Alias: [] +Tag: ["NotYetTested", "Breakfast", "Healthy", "Vegetarian"] +Date: 2022-03-13 +DocType: "Recipe" +Hierarchy: "NonRoot" +location: +CollapseMetaTable: Yes +Meta: + IsFavourite: False + Rating: +Recipe: + Courses: "Main dish" + Categories: "Egg" + Collections: "Middle Eastern" + Source: https://www.bonappetit.com/recipe/fresh-tomato-eggs-in-purgatory-with-chickpeas + PreparationTime: + CookingTime: + OServingSize: 2 +Ingredients: + - 0.25 cup skin-on almonds + - 1.5 lb. ripe tomatoes + - 0.5 tsp. kosher salt, plus more + - 0.25 cup extra-virgin olive oil, plus extra for drizzling + - 1 tsp. coriander seeds, crushed + - 3 Tbsp. harissa paste + - 1 can chickpeas, rinsed (15-oz) + - 4 whole large eggs + - 4 slices whole grain sourdough bread, toasted + - 1 clove garlic, halved lengthwise + - 0.5 bunch of chives, finely chopped + +--- + +Parent:: [[@@Recipes|Recipes]], [[@Main dishes|Main dishes]] + +--- + +  + +```button +name Edit Recipe parameters +type command +action MetaEdit: Run MetaEdit +id EditMetaData +``` +^button-FreshTomatoEggsPurgatorywithChickpeasEdit + + +```button +name Save +type command +action Save current file +id Save +``` +^button-FreshTomatoEggsPurgatorywithChickpeasNSave + + + +  + +# Fresh Tomato Eggs in Purgatory with Chickpeas + +  + +```toc +style: number +``` + +  + +--- + +  + +### Practical Informations + +```dataview +list without id + "" + + + "" ++ + "" + + + "" + + + "" + + + "" + + + "" + + + "" + + + "" + + + "
Courses" + this.Recipe.Courses + "
Categories" + this.Recipe.Categories + "
Collections" + this.Recipe.Collections + "
Serving size" + this.ServingSize + "
Cooking time" + this.Recipe.CookingTime + " min
" +FROM "03.03 Food & Wine/Fresh Tomato Eggs in Purgatory with Chickpeas" +``` + +  + +--- + +  + +### Ingredients + +  + +```dataviewjs +dv.view("00.01 Admin/dv-views/query_ingredient", {ingredients: dv.current().Ingredients, originalportioncount: dv.current().Recipe.OServingSize}) +``` + +  + +--- + +  + +### Instructions + +  + +#### Step 1 + +Chop tomatoes into small pieces and transfer to a small bowl along with all the juices. Mix in ½ tsp. salt. + +  + +#### Step 2 + +Heat ¼ cup oil in a large skillet with a lid over medium-high. Add coriander seeds and cook, stirring, until fragrant and starting to pop, about 1 minute. Add harissa and cook, stirring, until fragrant and darkened in color, about 30 seconds. Add chickpeas and tomatoes and bring to a simmer. Cook, mashing up about half of the chickpeas with a wooden spoon, until sauce is reduced and you’re able to make a divot in the mixture, 8–10 minutes. Season with salt, then use a spoon to make little pockets for the eggs near the sides of the skillet. + +  + +#### Step 3 + +Reduce heat to low and gently break eggs into pockets. Cover skillet and cook, rotating pan a few times for even heating, until eggs are set, 7–9 minutes. + +  + +#### Step 4 + +Meanwhile, drizzle toasts with oil and rub with garlic halves. + +  + +#### Step 5 + +Remove eggs from heat and shower with chives and almonds. Serve with garlic toast. diff --git a/04.04 Blog/DG - News Page.md b/04.04 Blog/DG - News Page.md new file mode 100644 index 00000000..61fc0e88 --- /dev/null +++ b/04.04 Blog/DG - News Page.md @@ -0,0 +1,63 @@ +--- + +dg-publish: true +dg-permalink: "News" +CollapseMetaTable: yes + +--- + +![[mfxm.fr logo.jpeg]] + +# A few articles + +  + +```ad-abstract +This section gathers all articles I scraped from the Internet recently. +``` + +  + +### Politics + +  + +### Society + +- [[A Vibe Shift Is Coming]] + +  + +### Crime + +  + +### History + +  + +### Human + +  + +### Art + +  + +### Travel + +- [[A view from across the river]] + +  + +### Tech + +  + +### Economy + +  + +--- +
Copyright © 2022 mfxm.fr. All rights reserved.
+ diff --git a/04.04 Blog/Landing Page.md b/04.04 Blog/Landing Page.md new file mode 100644 index 00000000..64e0dd78 --- /dev/null +++ b/04.04 Blog/Landing Page.md @@ -0,0 +1,35 @@ +--- + +dg-home: true +dg-publish: true +CollapseMetaTable: yes + +--- + +![[mfxm.fr logo.jpeg]] + +# Blog by mfxm.fr + +  + +Hi lone Internet dweller who will have landed on this page, + +  + +This is my attempt at publishing a simple blog, giving back to the Internet community some of my online perigrinations along three main areas: + +1. Selfhosting and the few notes that I wrote for beginners (mostly) + +2. Recipes, reading lists that I have gathered, read or tried + +3. [[DG - News Page|News]] and longer reads that I am accumulating as I browsed the Web + +  + +None of this I am an expert at and therefore, I will try to create a comment section for everyone who lands here to be able to chip in, comment, enrich, criticise or else what people do on Internet. + +  + +--- +
Copyright © 2022 mfxm.fr. All rights reserved.
+ diff --git a/04.04 Blog/mfxm.fr logo.jpeg b/04.04 Blog/mfxm.fr logo.jpeg new file mode 100644 index 00000000..78ff444d Binary files /dev/null and b/04.04 Blog/mfxm.fr logo.jpeg differ diff --git a/05.01 Computer setup/Storage and Syncing.md b/05.01 Computer setup/Storage and Syncing.md index a92a85df..eb53278b 100644 --- a/05.01 Computer setup/Storage and Syncing.md +++ b/05.01 Computer setup/Storage and Syncing.md @@ -191,7 +191,7 @@ The following Apps require a manual backup: - [x] Backup [[Storage and Syncing#Instructions for FV|Folder Vault]] 🔁 every 3 months on the 1st Friday 📅 2021-10-14 ✅ 2022-01-03 - [x] Backup [[Storage and Syncing#Instructions for FV|Folder Vault]] 🔁 every 3 months on the 1st Friday 📅 2021-10-03 ✅ 2021-10-13 - [x] Backup [[Storage and Syncing#Instructions for FV|Folder Vault]] 🔁 every 3 months on the 1st Friday ✅ 2021-10-02 -- [ ] [[Storage and Syncing|Storage & Sync]]: Backup Volumes to [[Sync|Sync.com]] 🔁 every 3 months on the 2nd Monday 📅 2022-03-14 +- [ ] [[Storage and Syncing|Storage & Sync]]: Backup Volumes to [[Sync|Sync.com]] 🔁 every 3 months on the 2nd Monday 📅 2022-03-21 - [x] [[Storage and Syncing|Storage & Sync]]: Backup Volumes to [[Sync|Sync.com]] 🔁 every 3 months on the 2nd Monday 📅 2021-12-13 ✅ 2022-01-08 - [x] [[Storage and Syncing|Storage & Sync]]: Backup Volumes to [[Sync|Sync.com]] 🔁 every 3 months on the 2nd Monday 📅 2021-12-01 ✅ 2022-01-08 - [x] [[Storage and Syncing|Storage & Sync]]: Backup Volumes to [[Sync|Sync.com]] 🔁 every 3 months on the 2nd Monday 📅 2021-09-16 ✅ 2021-10-16 diff --git a/05.02 Networks/Configuring Telegram bots.md b/05.02 Networks/Configuring Telegram bots.md index 33cb8e86..2f05533c 100644 --- a/05.02 Networks/Configuring Telegram bots.md +++ b/05.02 Networks/Configuring Telegram bots.md @@ -91,7 +91,81 @@ Please see full documentation [[GitHub - matriphemonit2telegram A simple script #### Linking fail2ban -Please see full documentation [[GitHub - deividgdtfail2ban_telegram_notifications Sending fail2ban notifications using a Telegram bot|here]]. +Please see full documentation [[GitHub - deividgdtfail2ban_telegram_notifications Sending fail2ban notifications using a Telegram bot|here]] for SSH monitoring. + +##### Postfix Monitoring + +In order to monitor SMTP connections through Fail2Ban, a few steps need to be taken. + +1. Open the conf file + +```ad-path +~~~bash +/etc/fail2ban/jail.conf +~~~ +Or +~~~bash +/etc/fail2ban/jail.local +~~~ +``` + +  + +2. Edit Postfix & create Postfix-auth + +```ad-code +~~~bash +[postfix] + +enabled = true +maxretry = 3 +bantime = 1h +filter = postfix[mode=aggressive] + telegram +mode = more +port = smtp,465,submission +logpath = %(postfix_log)s +backend = %(postfix_backend)s + +[postfix-auth] +enabled = true +bantime = 1h +filter = postfix.auth +action = iptables-multiport[name=postfix, port="http,https,smtp,submission,pop3,pop3s,imap,imaps,sieve”, protocol=tcp] + telegram +logpath = /var/log/mail.log +ignoreip = 127.0.0.1/8 +maxretry = 3 +~~~ +``` + +  + +3. Create postfix.auth filter + +```ad-path +/etc/fail2ban/filter.d/postfix.auth.conf +``` + +  + +```ad-code +~~~bash +[Definition] +failregex = lost connection after AUTH from (.*)\[\] +ignoreregex = +~~~ +``` + +  + +4. Restart fail2ban + +```ad-command +~~~bash +sudo systemctl restart fail2ban +~~~ +```   diff --git a/05.02 Networks/Server Tools.md b/05.02 Networks/Server Tools.md index 3ee328f5..3c6a29cb 100644 --- a/05.02 Networks/Server Tools.md +++ b/05.02 Networks/Server Tools.md @@ -255,7 +255,7 @@ title: service parameters ```ad-info title: Link -[Admin panel](https://pw-manager.mfxm.fr) +[Admin panel](https://pw-manager.mfxm.fr/admin/) ``` The admin panel needs to be set up with an authentication token and is accessed with the token. User & key management is done from within this panel. diff --git a/06.01 Finances/2022.ledger b/06.01 Finances/2022.ledger index 627b4860..a1075774 100644 --- a/06.01 Finances/2022.ledger +++ b/06.01 Finances/2022.ledger @@ -52,4 +52,20 @@ 2022/03/06 Weekend expenses expenses:Current expenses:CHF CHF150.00 + assets:Cash:CHF + +2022/03/14 Bakery + expenses:Current expenses:CHF CHF11.40 + assets:Cash:CHF + +2022/03/14 Cash + expenses:Current expenses:CHF CHF100.00 + assets:Cash:CHF + +2022/03/14 Electricity + expenses:Utilities:CHF CHF103.00 + assets:Cash:CHF + +2022/03/14 Migros + expenses:Current expenses:CHF CHF85.50 assets:Cash:CHF \ No newline at end of file