UNPKG

geomancy

Version:
974 lines (816 loc) 83.8 kB
"use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.addUnique = addUnique; exports.addWeights = addWeights; exports.getAttributeArray = getAttributeArray; exports.ChartSequence = exports.Chart = exports.INDICATION_WEIGHTING = exports.SHIELD_KEYS = exports.HOUSE_MAPS = void 0; var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _construct2 = _interopRequireDefault(require("@babel/runtime/helpers/construct")); var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); require("source-map-support/register"); var _models = require("./models"); var R = _interopRequireWildcard(require("ramda")); function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } var populus = _models.Figure.byName('populus'); /** * Different house systems. Each array is the ordered list of sequence indices for the houses. * For example, in the Esoteric system, the second house contains the figure fifth in the sequence. * So ESOTERIC[1] = 4; * @type {Array} */ var HOUSE_MAPS = { ORDINARY: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], ESOTERIC: [0, 4, 8, 1, 7, 11, 2, 6, 10, 3, 5, 9], 'GOLDEN DAWN': [1, 5, 9, 2, 6, 10, 3, 7, 11, 0, 4, 8] }; exports.HOUSE_MAPS = HOUSE_MAPS; var SHIELD_KEYS = ['Mother 1', 'Mother 2', 'Mother 3', 'Mother 4', 'Daughter 1', 'Daughter 2', 'Daughter 3', 'Daughter 4', 'Niece 1', 'Niece 2', 'Niece 3', 'Niece 4', 'Left Witness', 'Right Witness', 'Judge']; exports.SHIELD_KEYS = SHIELD_KEYS; var INDICATION_WEIGHTING = { occupations: 5, conjunctions: 5, mutations: 4, translations: 4, inCompany: -1, impedition: -5, trines: 3, sextiles: 3, oppositions: -4, squares: -3 }; exports.INDICATION_WEIGHTING = INDICATION_WEIGHTING; var JUDGE = 14; var hit = function hit(querent, quesited) { return { querent: querent.index, quesited: quesited.index }; }; /** * Base Geomancy Chart Model * @param {ChartSequence|array} [sequence=null] The starting set of mothers * @param {number} [querent=0] The 0-indexed house of the querent * @param {number} [quesited=-1] The 0-indexed house of the quesited * @param {string} [houseType='ordinary'] the type of house projection to use. */ var Chart = /*#__PURE__*/ function () { function Chart() { var sequence = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; var querent = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; var quesited = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 3; var houseType = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'ordinary'; (0, _classCallCheck2["default"])(this, Chart); if (R.is(Array, sequence)) { try { sequence = (0, _construct2["default"])(ChartSequence, (0, _toConsumableArray2["default"])(sequence)); } catch (e) { console.log(e); } } this.seq = sequence || new ChartSequence(); this.querentIx = querent; this.quesitedIx = quesited; this.setHouseType(houseType); } /** * Makes a copy of this chart. * @returns {Chart} clone of this chart */ (0, _createClass2["default"])(Chart, [{ key: "clone", value: function clone() { var seeds = this.getSeeds(false); var seq = (0, _construct2["default"])(ChartSequence, (0, _toConsumableArray2["default"])(seeds)); return new Chart(seq, this.querent, this.quesited); } /** * Get the house and type of company, if it exists. * @param {House|number} house to check for company * @returns {Object|null} if in company, then returns an object: * {house: index, company: companyType} */ }, { key: "getCompany", value: function getCompany(house) { if (!(house instanceof _models.House)) { house = this.getHouse(house); } var companion = this.getHouse(house.companion); // console.log('companion', companion); var company = house.getCompanyType(companion); // console.log(house.figure.name + ' + ' + companion.figure.name + ' = ' + company); if (!company) { return null; } return { house: companion.index, company: company }; } /** * Get the specified house by index. * @param {number} index position * @returns {House} at position */ }, { key: "getHouse", value: function getHouse(index) { if (index instanceof _models.House) { return index; } if (!R.is(Number, index)) { index = SHIELD_KEYS.indexOf(index); if (index === -1) { throw new TypeError('Invalid Index'); } } var seqIndex = index > 11 ? index : this.houseMap[index]; return new _models.House(index, this.seq.get(seqIndex), this.querent === index, this.quesited === index); } /** * Get an array of all the houses from this chart. * @returns {array} all 12 houses, note that the array is 0-indexed */ }, { key: "getHouses", value: function getHouses() { var total = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 12; var houses = []; for (var i = 0; i < total; i++) { houses.push(this.getHouse(i)); } return houses; } /** * Find the Geomantic "index" of a chart. * @returns {House} at index */ }, { key: "getIndex", value: function getIndex() { var count = 0; for (var i = 0; i < 12; i++) { var figure = this.seq.get(i); count += figure.getActivePoints(); } return this.getHouse((0, _models.houseRange)(count)); } /** * Calculate and return the total "indication" weight for this chart. * @returns {number} weighted total with positive numbers indicating success/true. */ }, { key: "getIndicationWeight", value: function getIndicationWeight() { var indications = this.getIndications(); return getAttributeArray(indications, 'weight').reduce(function (prev, curr) { return prev + curr; }); } /** * Gets the chart indications for the specified querest and quesited houses. * @param {number} [querent=this.querent] querent to use for this call * @param {number} [quesited=this.quesited] quesited to use for this call * @param {boolean} [inCompany=false] flag to prevent endless recursion on companies * @returns {Object} a dictionary of Indications * @example *{ * "springs": { * "querent": [ * { * "from": 1, * "to": 4 * } * ], * "quesited": [] * }, * "occupations": [], * "conjunctions": { * "querent": [], * "quesited": [] * }, * "mutations": [], * "translations": [ * { * "querent": 11, * "quesited": 8, * "weight": 3 * } * ], * "trines": [], * "squares": [ * { * "direction": "sinister", * "querent": 4, * "quesited": 7, * "weight": -4 * } * ], * "oppositions": [], * "sextiles": [ * { * "direction": "sinister", * "querent": 4, * "quesited": 6, * "weight": 2 * } * ] *} */ }, { key: "getIndications", value: function getIndications() { var querent = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.querent; var quesited = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.quesited; var inCompany = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; querent = this.getHouse(querent); quesited = this.getHouse(quesited); if (querent.index === quesited.index) { return {}; } var subQuerent = this.querent.index !== querent.index; var subQuesited = this.quesited.index !== quesited.index; var houses = this.getHouses(); var occupations = getOccupation(querent, quesited); var conjunctions = getConjunctions(querent, quesited, houses); var springs = getSprings(querent, quesited, houses); var qIndex; if (subQuerent) { // strip any springs to the original qIndex = this.querent.index; springs.querent = springs.querent.filter(function (q) { return q.to != qIndex; }); } if (subQuesited) { // strip any springs to the original qIndex = this.quesited.index; springs.quesited = springs.quesited.filter(function (q) { return q.to != qIndex; }); } var mutations = getMutations(springs, houses); var translations = getTranslations(querent, quesited, houses); var aspects = getAspects(querent, quesited, springs, houses); var indications = addWeights(_objectSpread({ springs: springs, occupations: occupations, conjunctions: conjunctions, mutations: mutations, translations: translations }, aspects), inCompany); if (!inCompany) { // if we're not already in Company, check to see if companies exist // and if so, use them to add more indications var querentCo = this.getCompany(querent); var quesitedCo = this.getCompany(quesited); var additional = []; if (querentCo) { additional.push(this.getIndications(querentCo.house, quesited, true)); if (quesitedCo) { additional.push(this.getIndications(querentCo.house, quesitedCo.house, true)); } } if (quesitedCo) { additional.push(this.getIndications(querent, quesitedCo.house, true)); } additional.forEach(function (added) { addUnique(indications, added); }); // OK, we've added all perfections possible for this chart. // If there aren't any, then we have an "impedition", so add it. // to do that, just find all weights, and look for positives var positives = getAttributeArray(indications, 'weight').filter(function (x) { return x > 0; }); if (positives.length === 0) { indications.impedition = { weight: INDICATION_WEIGHTING.impedition }; } } return indications; } }, { key: "getMeanings", value: function getMeanings() { var meanings = []; for (var i = 0; i < 12; i++) { var house = this.getHouse(i); meanings.push(house.getMeaning()); } return meanings; } /** * Find and return the house for the part of fortune. * @return {House} Part of Fortune */ }, { key: "getPartOfFortune", value: function getPartOfFortune() { var count = 0; for (var i = 0; i < 12; i++) { var figure = this.seq.get(i); count += figure.getPoints(); } return this.getHouse((0, _models.houseRange)(count)); } /** * Get the mothers as an array. * @param {Boolean} [slugify=false] convert to slugs * @return {array<House>} four mother houses */ }, { key: "getSeeds", value: function getSeeds() { var slugify = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; var seeds = []; for (var ix = 0; ix < 4; ix++) { var _this$getHouse = this.getHouse(ix), figure = _this$getHouse.figure; var seed = slugify ? figure.slug : figure.name; seeds.push(seed); } return seeds; } /** * Get the chart houses as a map * @return {Map<String, House>} Shield houses keyed by name in the shield */ }, { key: "getShield", value: function getShield() { var _this = this; var shield = new Map(); SHIELD_KEYS.forEach(function (name, ix) { shield.set(name, _this.seq.get(ix)); }); return shield; } /** * Return the way of the point as an array, if it exists. * @return {Array<Number>} Array of indexes of points in the way */ }, { key: "getWayOfThePoint", value: function getWayOfThePoint() { var _this2 = this; var followFire = function followFire(house) { return house.parents.filter(function (parentIx) { return _this2.getHouse(parentIx).figure.fire === house.figure.fire; }); }; var followThePath = function followThePath(house, points) { house = _this2.getHouse(house); if (house.index < 8) { return house; } followFire(house).forEach(function (parent) { var point = followThePath(parent, points); if (point) { points.push(point); } }); }; var points = []; followThePath('Judge', points); return points.map(function (point) { return point.index; }); } /** * Sets the house type to any legal name in HOUSE_MAPS * @param {string} houseType name of system * @return {`Chart`} self */ }, { key: "setHouseType", value: function setHouseType(houseType) { var key = houseType.toUpperCase(); var houseMap = HOUSE_MAPS[key]; if (!houseMap) { throw new TypeError('Invalid House Type'); } this.houseMap = houseMap; this.querent = this.getHouse(this.querentIx); this.quesited = this.getHouse(this.quesitedIx); return this; } }]); return Chart; }(); /** * A sequence of geomantic figures, which is seeded by the first four houses, * and projects all the rest from them. * @type {Array<Figure|String>} four figure names or Figures */ exports.Chart = Chart; var ChartSequence = /*#__PURE__*/ function () { function ChartSequence() { var _this3 = this; (0, _classCallCheck2["default"])(this, ChartSequence); this.slots = [populus, populus, populus, populus]; for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } args.forEach(function (arg, ix) { _this3.set(ix, arg); }); } /** * Set the `Figure` at slot `ix` * @param {number} ix position * @param {Figure|string} figure to set * @return {null} nothing */ (0, _createClass2["default"])(ChartSequence, [{ key: "set", value: function set(ix, figure) { if (!R.is(Number, ix)) { throw new TypeError('Invalid Index'); } if (ix >= 5) { throw new Error('Invalid setting, can only set the Mothers (0-3)'); } if (typeof figure === 'string') { figure = _models.Figure.byName(figure); } this.slots[ix] = figure; } /** * Get the figure at or projected to that index * @param {number} ix position * @return {Figure} figure at position */ }, { key: "get", value: function get(ix) { if (!R.is(Number, ix)) { throw new TypeError('Invalid Index', ix); } if (ix <= 3) { return this.slots[ix]; } if (ix <= 7) { return this.getDaughter(ix - 4); } return this.getProjected(ix); } /** * Project the Daughter figures * @param {Number} ix position * @return {Figure} daughter */ }, { key: "getDaughter", value: function getDaughter(ix) { if (!R.is(Number, ix)) { throw new TypeError('Invalid Index'); } var elements = { fire: this.slots[0].getLine(ix), air: this.slots[1].getLine(ix), water: this.slots[2].getLine(ix), earth: this.slots[3].getLine(ix) }; return _models.Figure.byElements(elements); } /** * Project any arbitrary higher position * @param {Number} ix position * @return {Figure} at position */ }, { key: "getProjected", value: function getProjected(ix) { if (!R.is(Number, ix)) { throw new TypeError('Invalid Index'); } var p1 = (ix - 8) * 2; var p2 = (ix - 8) * 2 + 1; var f1 = this.get(p1); var f2 = this.get(p2); return f1.add(f2); } }]); return ChartSequence; }(); // ------------- /** * Adds unique values of one dictionary to another, appending to arrays, and walking sub-objects. * @param {Object} dict target object * @param {Object} added merge object * @returns {Object} merged dict */ exports.ChartSequence = ChartSequence; function addUnique(dict, added) { Object.keys(added).forEach(function (key) { if (!R.has(key, dict)) { dict[key] = added[key]; } else if (R.is(Array, dict[key])) { dict[key] = R.unionWith(R.equals, dict[key], added[key]); } else { addUnique(dict[key], added[key]); } }); return dict; } /** * Adds up indication weights for a set of indications. * @param {Object} dict Indications * @param {Boolean} inCompany true if indication is due to a company * @returns {Object} indications with weights */ function addWeights(dict, inCompany) { var indications = _objectSpread({}, dict); // add the weights to each item in the indications for (var _i = 0, _Object$entries = Object.entries(dict); _i < _Object$entries.length; _i++) { var _ref3 = _Object$entries[_i]; var _ref2 = (0, _slicedToArray2["default"])(_ref3, 2); var indicationType = _ref2[0]; var values = _ref2[1]; if (R.has(indicationType, INDICATION_WEIGHTING)) { (function () { var weight = INDICATION_WEIGHTING[indicationType]; if (inCompany) { weight = weight + INDICATION_WEIGHTING.inCompany; } var addWeight = function addWeight(indication) { return _objectSpread({}, indication, { weight: weight }); }; if (R.is(Array, values)) { indications[indicationType] = values.map(addWeight); } else { indications[indicationType] = { querent: values.querent.map(addWeight), quesited: values.quesited.map(addWeight) }; } })(); } } return indications; } /** * Get all trines, squares, oppositions, and sextiles from a set of houses, * including those caused by springs. * * @param {House} initialQuerent base querent * @param {House} initialQuesited base quesited * @param {Array<Object>} springs list of springs * @param {Array<House>} houses list of chart houses * @return {Object} Aspect set */ function getAspects(initialQuerent, initialQuesited, springs, houses) { var aspects = { trines: [], squares: [], oppositions: [], sextiles: [] }; if (springs.quesited) { springs.quesited.forEach(function (quesited) { makeAspectsFor(aspects, initialQuerent, houses[quesited.to]); }); } if (springs.querent) { springs.querent.forEach(function (querent) { makeAspectsFor(aspects, houses[querent.to], initialQuesited); }); } if (springs.querent && springs.quesited) { springs.querent.forEach(function (querent) { springs.quesited.forEach(function (quesited) { makeAspectsFor(aspects, houses[querent.to], houses[quesited.to]); }); }); } return aspects; } /** * Find conjunctions for a given set of houses. * * @param {House} querent chart querent * @param {House} quesited chart quesited * @param {Array<House>} houses List of chart houses * @return {Object<String, Array>} Conjunctions */ function getConjunctions(querent, quesited, houses) { var conjunction = { querent: [], quesited: [] }; for (var i = 0; i < 12; i++) { var house = houses[i]; if (querent.isNextTo(house) && house.hasFigure(quesited)) { conjunction.querent.push(hit(querent, house)); } if (quesited.isNextTo(house) && house.hasFigure(querent)) { conjunction.quesited.push(hit(house, quesited)); } } return conjunction; } /** * Find mutations for a given set of houses * @param {Array<Object>} springs list of springs * @param {Array<House>} houses List of chart houses * @return {Array<Object>} list of mutations */ function getMutations(springs, houses) { // go through the springs, looking for neighbor conjunctions so that we // can find any mutations var mutation = []; if (springs.querent && springs.quesited) { springs.querent.forEach(function (querentSpring) { var querent = houses[querentSpring.to]; var hits = springs.quesited.filter(function (quesitedSpring) { var quesited = houses[quesitedSpring.to]; return querent.isNextTo(quesited); }); hits.forEach(function (quesitedSpring) { mutation.push({ querent: querentSpring.to, quesited: quesitedSpring.to }); }); }); } return mutation; } /** * [getOccupation description] * @param {[type]} querent [description] * @param {[type]} quesited [description] * @return {[type]} [description] */ function getOccupation(querent, quesited) { var occupation = []; if (querent.hasFigure(quesited)) { occupation.push(hit(querent, quesited)); } return occupation; } /** * [getSprings description] * @param {[type]} querent [description] * @param {[type]} quesited [description] * @param {[type]} houses [description] * @return {[type]} [description] */ function getSprings(querent, quesited, houses) { var springs = { querent: [], quesited: [] }; for (var i = 0; i < 12; i++) { var house = houses[i]; if (!house.querent && house.hasFigure(querent) && querent.index !== i) { springs.querent.push({ from: querent.index, to: i }); } if (!house.quesited && house.hasFigure(quesited) && quesited.index !== i) { springs.quesited.push({ from: quesited.index, to: i }); } } return springs; } /** * [getTranslations description] * @param {[type]} querent [description] * @param {[type]} quesited [description] * @param {[type]} houses [description] * @return {[type]} [description] */ function getTranslations(querent, quesited, houses) { var translation = []; // translations var querentNeighbors = querent.getNeighbors(houses); var quesitedNeighbors = quesited.getNeighbors(houses); // remove same indexes var eqIndex = R.eqProps('index'); querentNeighbors = R.differenceWith(eqIndex, querentNeighbors, quesitedNeighbors); quesitedNeighbors = R.differenceWith(eqIndex, quesitedNeighbors, querentNeighbors); // remove direct figure matches; var exclusions = function exclusions(neighbor) { return !(neighbor.equals(quesited) || neighbor.equals(querent) || neighbor.hasFigure(quesited) || neighbor.hasFigure(querent)); }; querentNeighbors = querentNeighbors.filter(exclusions); quesitedNeighbors = quesitedNeighbors.filter(exclusions); // for the remaining, go through neighbors and see if there are any figure matches // which are next to both Q and q. var _iteratorNormalCompletion = true; var _didIteratorError = false; var _iteratorError = undefined; try { for (var _iterator = querentNeighbors[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { var querentN = _step.value; var _iteratorNormalCompletion2 = true; var _didIteratorError2 = false; var _iteratorError2 = undefined; try { for (var _iterator2 = quesitedNeighbors[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { var quesitedN = _step2.value; if (querentN.hasFigure(quesitedN)) { translation.push(hit(querentN, quesitedN)); } } } catch (err) { _didIteratorError2 = true; _iteratorError2 = err; } finally { try { if (!_iteratorNormalCompletion2 && _iterator2["return"] != null) { _iterator2["return"](); } } finally { if (_didIteratorError2) { throw _iteratorError2; } } } } } catch (err) { _didIteratorError = true; _iteratorError = err; } finally { try { if (!_iteratorNormalCompletion && _iterator["return"] != null) { _iterator["return"](); } } finally { if (_didIteratorError) { throw _iteratorError; } } } return translation; } /** * walks an indications structure, returning an array of keyed values * @param {[type]} dict [description] * @param {[type]} member [description] * @return {[type]} [description] */ function getAttributeArray(dict, member) { var found = []; for (var _i2 = 0, _Object$entries2 = Object.entries(dict); _i2 < _Object$entries2.length; _i2++) { var _ref6 = _Object$entries2[_i2]; var _ref5 = (0, _slicedToArray2["default"])(_ref6, 2); var key = _ref5[0]; var values = _ref5[1]; if (R.is(Array, values)) { var work = values.map(function (x) { return x[member]; }); found = R.concat(found, work); } else if (R.is(Object, values)) { if (R.has(member, values)) { found.push(values[member]); } else { found = R.concat(found, getAttributeArray(values, member)); } } } return R.reject(R.isNil, found); } /** * [makeAspectsFor description] * @param {[type]} aspects [description] * @param {[type]} querent [description] * @param {[type]} quesited [description] * @return {[type]} [description] */ function makeAspectsFor(aspects, querent, quesited) { var direction = ''; if (querent.isSinisterOf(quesited)) { direction = 'sinister'; } else if (querent.isDexterOf(quesited)) { direction = 'dexter'; } var aspect = { direction: direction, querent: querent.index, quesited: quesited.index }; if (querent.isTrineTo(quesited)) { aspects.trines.push(aspect); } else if (querent.isSquareTo(quesited)) { aspects.squares.push(aspect); } else if (querent.isSextileTo(quesited)) { aspects.sextiles.push(aspect); } else if (querent.isOpposedTo(quesited)) { aspects.oppositions.push(aspect); } } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL2xpYi9jaGFydHMuanMiXSwibmFtZXMiOlsicG9wdWx1cyIsIkZpZ3VyZSIsImJ5TmFtZSIsIkhPVVNFX01BUFMiLCJPUkRJTkFSWSIsIkVTT1RFUklDIiwiU0hJRUxEX0tFWVMiLCJJTkRJQ0FUSU9OX1dFSUdIVElORyIsIm9jY3VwYXRpb25zIiwiY29uanVuY3Rpb25zIiwibXV0YXRpb25zIiwidHJhbnNsYXRpb25zIiwiaW5Db21wYW55IiwiaW1wZWRpdGlvbiIsInRyaW5lcyIsInNleHRpbGVzIiwib3Bwb3NpdGlvbnMiLCJzcXVhcmVzIiwiSlVER0UiLCJoaXQiLCJxdWVyZW50IiwicXVlc2l0ZWQiLCJpbmRleCIsIkNoYXJ0Iiwic2VxdWVuY2UiLCJob3VzZVR5cGUiLCJSIiwiaXMiLCJBcnJheSIsIkNoYXJ0U2VxdWVuY2UiLCJlIiwiY29uc29sZSIsImxvZyIsInNlcSIsInF1ZXJlbnRJeCIsInF1ZXNpdGVkSXgiLCJzZXRIb3VzZVR5cGUiLCJzZWVkcyIsImdldFNlZWRzIiwiaG91c2UiLCJIb3VzZSIsImdldEhvdXNlIiwiY29tcGFuaW9uIiwiY29tcGFueSIsImdldENvbXBhbnlUeXBlIiwiTnVtYmVyIiwiaW5kZXhPZiIsIlR5cGVFcnJvciIsInNlcUluZGV4IiwiaG91c2VNYXAiLCJnZXQiLCJ0b3RhbCIsImhvdXNlcyIsImkiLCJwdXNoIiwiY291bnQiLCJmaWd1cmUiLCJnZXRBY3RpdmVQb2ludHMiLCJpbmRpY2F0aW9ucyIsImdldEluZGljYXRpb25zIiwiZ2V0QXR0cmlidXRlQXJyYXkiLCJyZWR1Y2UiLCJwcmV2IiwiY3VyciIsInN1YlF1ZXJlbnQiLCJzdWJRdWVzaXRlZCIsImdldEhvdXNlcyIsImdldE9jY3VwYXRpb24iLCJnZXRDb25qdW5jdGlvbnMiLCJzcHJpbmdzIiwiZ2V0U3ByaW5ncyIsInFJbmRleCIsImZpbHRlciIsInEiLCJ0byIsImdldE11dGF0aW9ucyIsImdldFRyYW5zbGF0aW9ucyIsImFzcGVjdHMiLCJnZXRBc3BlY3RzIiwiYWRkV2VpZ2h0cyIsInF1ZXJlbnRDbyIsImdldENvbXBhbnkiLCJxdWVzaXRlZENvIiwiYWRkaXRpb25hbCIsImZvckVhY2giLCJhZGRlZCIsImFkZFVuaXF1ZSIsInBvc2l0aXZlcyIsIngiLCJsZW5ndGgiLCJ3ZWlnaHQiLCJtZWFuaW5ncyIsImdldE1lYW5pbmciLCJnZXRQb2ludHMiLCJzbHVnaWZ5IiwiaXgiLCJzZWVkIiwic2x1ZyIsIm5hbWUiLCJzaGllbGQiLCJNYXAiLCJzZXQiLCJmb2xsb3dGaXJlIiwicGFyZW50cyIsInBhcmVudEl4IiwiZmlyZSIsImZvbGxvd1RoZVBhdGgiLCJwb2ludHMiLCJwYXJlbnQiLCJwb2ludCIsIm1hcCIsImtleSIsInRvVXBwZXJDYXNlIiwic2xvdHMiLCJhcmdzIiwiYXJnIiwiRXJyb3IiLCJnZXREYXVnaHRlciIsImdldFByb2plY3RlZCIsImVsZW1lbnRzIiwiZ2V0TGluZSIsImFpciIsIndhdGVyIiwiZWFydGgiLCJieUVsZW1lbnRzIiwicDEiLCJwMiIsImYxIiwiZjIiLCJhZGQiLCJkaWN0IiwiT2JqZWN0Iiwia2V5cyIsImhhcyIsInVuaW9uV2l0aCIsImVxdWFscyIsImVudHJpZXMiLCJpbmRpY2F0aW9uVHlwZSIsInZhbHVlcyIsImFkZFdlaWdodCIsImluZGljYXRpb24iLCJpbml0aWFsUXVlcmVudCIsImluaXRpYWxRdWVzaXRlZCIsIm1ha2VBc3BlY3RzRm9yIiwiY29uanVuY3Rpb24iLCJpc05leHRUbyIsImhhc0ZpZ3VyZSIsIm11dGF0aW9uIiwicXVlcmVudFNwcmluZyIsImhpdHMiLCJxdWVzaXRlZFNwcmluZyIsIm9jY3VwYXRpb24iLCJmcm9tIiwidHJhbnNsYXRpb24iLCJxdWVyZW50TmVpZ2hib3JzIiwiZ2V0TmVpZ2hib3JzIiwicXVlc2l0ZWROZWlnaGJvcnMiLCJlcUluZGV4IiwiZXFQcm9wcyIsImRpZmZlcmVuY2VXaXRoIiwiZXhjbHVzaW9ucyIsIm5laWdoYm9yIiwicXVlcmVudE4iLCJxdWVzaXRlZE4iLCJtZW1iZXIiLCJmb3VuZCIsIndvcmsiLCJjb25jYXQiLCJyZWplY3QiLCJpc05pbCIsImRpcmVjdGlvbiIsImlzU2luaXN0ZXJPZiIsImlzRGV4dGVyT2YiLCJhc3BlY3QiLCJpc1RyaW5lVG8iLCJpc1NxdWFyZVRvIiwiaXNTZXh0aWxlVG8iLCJpc09wcG9zZWRUbyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztBQUNBOzs7Ozs7QUFFQSxJQUFNQSxPQUFPLEdBQUdDLGVBQU9DLE1BQVAsQ0FBYyxTQUFkLENBQWhCO0FBRUE7Ozs7Ozs7O0FBTU8sSUFBTUMsVUFBVSxHQUFHO0FBQ3hCQyxFQUFBQSxRQUFRLEVBQUUsQ0FBQyxDQUFELEVBQUcsQ0FBSCxFQUFLLENBQUwsRUFBTyxDQUFQLEVBQVMsQ0FBVCxFQUFXLENBQVgsRUFBYSxDQUFiLEVBQWUsQ0FBZixFQUFpQixDQUFqQixFQUFtQixDQUFuQixFQUFxQixFQUFyQixFQUF3QixFQUF4QixFQUEyQixFQUEzQixDQURjO0FBRXhCQyxFQUFBQSxRQUFRLEVBQUUsQ0FBQyxDQUFELEVBQUcsQ0FBSCxFQUFLLENBQUwsRUFBTyxDQUFQLEVBQVMsQ0FBVCxFQUFXLEVBQVgsRUFBYyxDQUFkLEVBQWdCLENBQWhCLEVBQWtCLEVBQWxCLEVBQXFCLENBQXJCLEVBQXVCLENBQXZCLEVBQXlCLENBQXpCLENBRmM7QUFHeEIsaUJBQWUsQ0FBQyxDQUFELEVBQUcsQ0FBSCxFQUFLLENBQUwsRUFBTyxDQUFQLEVBQVMsQ0FBVCxFQUFXLEVBQVgsRUFBYyxDQUFkLEVBQWdCLENBQWhCLEVBQWtCLEVBQWxCLEVBQXFCLENBQXJCLEVBQXVCLENBQXZCLEVBQXlCLENBQXpCO0FBSFMsQ0FBbkI7O0FBTUEsSUFBTUMsV0FBVyxHQUFHLENBQUMsVUFBRCxFQUFhLFVBQWIsRUFBeUIsVUFBekIsRUFBcUMsVUFBckMsRUFDekIsWUFEeUIsRUFDWCxZQURXLEVBQ0csWUFESCxFQUNpQixZQURqQixFQUV6QixTQUZ5QixFQUVk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