├── .gitignore ├── README.md ├── data.json ├── main.js ├── main.ts ├── manifest.json ├── package.json ├── rollup.config.js ├── styles.css ├── tsconfig.json └── versions.json /.gitignore: -------------------------------------------------------------------------------- 1 | # Intellij 2 | *.iml 3 | .idea 4 | 5 | # npm 6 | node_modules 7 | package-lock.json 8 | 9 | # build 10 | # main.js 11 | # *.js.map 12 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Shuffle for Obsidian 2 | 3 | This plugin allows you to create your custom, randomized writing-prompts from lists of variables you define. 4 | 5 | Based on Eleanor Konik's post at https://forum.obsidian.md/t/rfc-oblique-strategies-writing-prompts-reflection-creators-block/9997/2 6 | 7 | ## Example 8 | ### Input template 9 | ```markdown 10 | ## Prompt 11 | 1. Include one of these words: $WORD, $WORD or $WORD 12 | 2. Begin with a word that starts with `$LETTER` 13 | 3. Take place in $LOCATION or $LOCATION 14 | ``` 15 | ### Randomized output: 16 | ```markdown 17 | ## Prompt 18 | 1. Include one of these words: Wall, Wind or Book 19 | 2. Begin with a word that starts with `g` 20 | 3. Take place in London or Los Angeles 21 | ``` 22 | ## How to to install manually 23 | - Download the latest `main.js, mainfest.json and styles.css` from https://github.com/akaalias/obsidian-shuffle/releases/ 24 | - Create a new folder named 'obsidian-shuffle' 25 | - Place the two files in the folder 26 | - Place the folder in your .obsidian/plugins directory 27 | - Reload plugins 28 | - Activate the "Shuffle" plugin 29 | 30 | ## How to use the plugin 31 | - Hit the 'Dice' button in the sidebar to generate a new prompt note 32 | - Customize your variable names, values and template to your liking in the settings 33 | 34 | ## Load custom packs 35 | Try out new prompts by loading their pack into your settings. (Will replace your custom prompts.) 36 | 37 | ### Currently available packs: 38 | - ⚫ `Oblique Strategies` by Brian Eno and Peter Schmidt 39 | - ⚡️ `Flash Fiction Pack` by Eleanor Konik 40 | 41 | ### Share YOUR custom prompts! 42 | 43 | If you have created your own custom set of prompts, PLEASE SHARE them! Contact me via the Obsidian Forum or per issue in this repo. 44 | -------------------------------------------------------------------------------- /data.json: -------------------------------------------------------------------------------- 1 | {"variable1Name":"WORD","variable1Values":"account\nmiddle\nact\nmilk\nadjustment\nmind\nmine\nagreement\nminute\nair\nmist\namount\namusement\nmonth\nanimal\nmorning\nanswer\nmother\napparatus\nmotion\napproval\nmountain\nargument\nmove\nart\nmusic\nattack\nname\nattempt\nnation\nattention\nneed\nattraction\nnews\nauthority\nnight\nback\nnoise\nbalance\nnote\nAmaranth\nAmber\nAmethyst\nApricot\nAqua\nAquamarine\nAsparagus\nAuburn\nAzure\nBeige\nBistre\nBlack\nBlue\nBrass\nBronze\nBrown\nBuff\nBurgundy\nCamouflage\nCardinal\nCarmine\nCarrot\nCeladon\nCerise\nCerulean\nChampagne\nCharcoal\nChartreuse\nCherry\nChestnut\nChocolate\nCinnabar\nCinnamon\nCobalt\nCopper\nCoral\nCorn\nCornflower\nCream\nCrimson\nCyan\nEmerald\nEggplant\nFlax\nFrench Rose\nGold\nGoldenrod\nGreen\nGrey\nIndigo\nIvory\nJade\nKhaki\nLavender\nLemon\nLilac\nLime\nLinen\nMagenta\nMagnolia\nMalachite\nMaroon\nMauve\nMustard\nMyrtle\nNavy\nOchre\nOlive\nOrange\nOrchid\nPeach\nPear\nPeriwinkle\nPersimmon\nPine Green\nPink\nPlatinum\nPlum\nPumpkin\nPurple\nQuartz\nRaw umber\nRose\nRuby\nRusset\nRust\nSaffron\nSalmon\nSandy brown\nSangria\nSapphire\nScarlet\nSeashell\nSepia\nSlate\nSilver\nTan\nTangerine\nTaupe\nTeal\nTawny\nTerra cotta\nThistle\nTomato\nTurquoise\nUltramarine\nVermilion\nViolet\nViridian\nWheat\nWhite\nWisteria\nXanthic\nYellow\nZucchini\nbase\nnumber\nbehavior\nobservation\nbelief\noffer\nbirth\noil\nbit\noperation\nbite\nopinion\nblood\norder\nblow\norganization\nbody\nornament\nbrass\nowner\nbread\npage\nbreath\npain\nbrother\npaint\nbuilding\npaper\nburn\npart\nburst\npaste\nbusiness\npayment\nbutter\npeace\ncanvas\nperson\ncare\nplace\ncause\nplant\nchalk\nplay\nchance\npleasure\nchange\npoint\ncloth\npoison\ncoal\npolish\ncolor\nporter\ncomfort\nposition\ncommittee\npowder\ncompany\npower\ncomparison\nprice\ncompetition\nprint\ncondition\nprocess\nconnection\nproduce\ncontrol\nprofit\ncook\nproperty\ncopper\nprose\ncopy\nprotest\ncork\npull\ncopy\npunishment\ncough\npurpose\ncountry\npush\ncover\nquality\ncrack\nquestion\ncredit\nrain\ncrime\nrange\ncrush\nrate\ncry\nray\ncurrent\nreaction\ncurve\nreading\ndamage\nreason\ndanger\nrecord\ndaughter\nregret\nday\nrelation\ndeath\nreligion\ndebt\nrepresentative\ndecision\nrequest\ndegree\nrespect\ndesign\nrest\ndesire\nreward\ndestruction\nrhythm\ndetail\nrice\ndevelopment\nriver\ndigestion\nroad\ndirection\nroll\ndiscovery\nroom\ndiscussion\nrub\ndisease\nrule\ndisgust\nrun\ndistance\nsalt\ndistribution\nsand\ndivision\nscale\ndoubt\nscience\ndrink\nsea\ndriving\nseat\ndust\nsecretary\nearth\nselection\nedge\nself\neducation\nsense\neffect\nservant\nend\nerror\nshade\nevent\nshake\nexample\nshame\nexchange\nshock\nexistence\nside\nexpansion\nsign\nexperience\nsilk\nexpert\nsilver\nfact\nsister\nfall\nsize\nfamily\nsky\nfather\nsleep\nfear\nslip\nfeeling\nslope\nfiction\nsmash\nfield\nsmell\nfight\nsmile\nfire\nsmoke\nflame\nsneeze\nflight\nsnow\nflower\nsoap\nfold\nsociety\nfood\nson\nforce\nsong\nform\nsort\nfriend\nsound\nfront\nsoup\nfruit\nspace\nglass\nstage\ngold\nstart\ngovernment\nstatement\ngrain\nsteam\ngrass\nsteel\ngrip\nstep\ngroup\nstitch\ngrowth\nstone\nguide\nstop\nharbor\nstory\nharmony\nstretch\nhate\nstructure\nhearing\nsubstance\nheat\nsugar\nhelp\nsuggestion\nhistory\nsummer\nhole\nsupport\nhope\nsurprise\nhour\nswim\nhumor\nsystem\nice\ntalk\nidea\ntaste\nimpulse\ntax\nincrease\nteaching\nindustry\ntendency\nink\ntest\ninsect\ntheory\ninstrument\nthing\ninsurance\nthought\ninterest\nthunder\ninvention\ntime\niron\ntin\njelly\ntop\njoin\ntouch\njourney\ntrade\njudge\ntransport\njump\ntrick\nkick\ntrouble\nkiss\nturn\nknowledge\ntwist\nland\nunit\nlanguage\nuse\nlaugh\nvalue\nlow\nverse\nlead\nvessel\nlearning\nview\nleather\nvoice\nletter\nwalk\nlevel\nwar\nlift\nwash\nlight\nwaste\nlimit\nwater\nlinen\nwave\nliquid\nwax\nlist\nway\nlook\nweather\nloss\nweek\nlove\nweight\nmachine\nwind\nman\nwine\nmanager\nwinter\nmark\nwoman\nmarket\nwood\nmass\nwool\nmeal\nword\nmeasure\nwork\nmeat\nwound\nmeeting\nwriting\nmemory\nyear\nmetal\nworm\nangle\nknee\nant\nknife\napple\nknot\narch\nleaf\narm\nleg\narmy\nlibrary\nbaby\nline\nbag\nlip\nball\nlock\nband\nmap\nbasin\nmatch\nbasket\nmonkey\nbath\nmoon\nbed\nmouth\nbee\nmuscle\nbell\nnail\nberry\nneck\nbird\nneedle\nblade\nnerve\nboard\nnet\nboat\nnose\nbone\nnut\nbook\noffice\nboot\norange\nbottle\noven\nbox\nparcel\nboy\npen\nbrain\npencil\nbrake\npicture\nbranch\npig\nbrick\npin\nbridge\npipe\nbrush\nplane\nbucket\nplate\nbulb\nplough\nbutton\npocket\ncake\npot\ncamera\npotato\ncard\nprison\ncarriage\npump\ncart\nrail\ncat\nrat\nchain\nreceipt\ncheese\nring\nchess\nrod\nchin\nroof\nchurch\nroot\ncircle\nsail\nclock\nschool\ncloud\nscissors\ncoat\nscrew\ncollar\nseed\ncomb\nsheep\ncord\nshelf\ncow\nship\ncup\nshirt\ncurtain\nshoe\ncushion\nskin\ndog\nskirt\ndoor\nsnake\ndrain\nsock\ndrawer\nspade\ndress\nsponge\ndrop\nspoon\near\nspring\negg\nsquare\nengine\nstamp\neye\nstar\nface\nstation\nfarm\nstem\nfeather\nstick\nfinger\nstocking\nfish\nstomach\nflag\nstore\nfloor\nstreet\nfly\nsun\nfoot\ntable\nfork\ntail\nfowl\nthread\nframe\nthroat\ngarden\nthumb\ngirl\nticket\nglove\ntoe\ngoat\ntongue\ngun\ntooth\nhair\ntown\nhammer\ntrain\nhand\ntray\nhat\ntree\nhead\ntrousers\nheart\numbrella\nhook\nwall\nhorn\nwatch\nhorse\nwheel\nhospital\nwhip\nhouse\nwhistle\nisland\nwindow\njewel\nwing\nkettle\nwire\nkey","variable2Name":"LETTER","variable2Values":"a\nb\nc\nd\ne\nf\ng\nh\ni\nj\nk\nl\nm\nn\no\np\nq\nr\ns\nt\nu\nv\nw\nx\ny\nz","variable3Name":"CHARACTER","variable3Values":"Anthropomorphic Personification\nAnti-Hero\nThe Archmage\nAudience Surrogate\nBarefoot Sage\nBlind Seer\nBlue-Collar Warlock\nBruiser with a Soft Center\nThe Chosen One\nThe Chooser of The One\nClassical Hunter\nClassic Villain\nThe Cynic\nThe Dragonslayer\nThe Drunken Sailor\nDumb Muscle\nEccentric Mentor\nEvil Overlord\nThe Fair Folk\nFalse Prophet\nThe Ferryman\nThe Fool\nFool for Love\nGentle Giant\nThe Good King\nHerald\nThe Hero\nHeroic Wannabe\nHigher Self\nHunter of Monsters\nThe Idealist\nIneffectual Loner\nThe Klutz\nKnight in Shining Armor\nLady and Knight\nLovable Rogue\nMadonna Archetype\nThe McCoy\nMentor Archetype\nMessiah Figure\nMock Millionaire\nModern Major General\nMoses Archetype\nMy Girl Back Home\nObstructive Bureaucrat\nOld Soldier\nThe Paladin\nThe Paragon\nThe Patriarch\nPerson of Mass Destruction\nPrince Charming\nRebel Leader\nRebellious Spirit\nReluctant Monster\nSeeker Archetype\nSidekick\nThe Sociopath\nStar-Crossed Lovers\nThe Storyteller\nTurn Coat\nThe Trickster\nWicked Stepmother\nWicked Witch\nWolf Man\nWorld's Best Warrior\nWorld's Most Beautiful Woman\nWorld's Strongest Man\nAbsent-Minded Professor\nThe believer\nThe skeptic\nAngry Chef\nAntagonistic Governor\nAnthropomorphic Animal\nBad Boss\nBadass Normal\nBarbarian Tribe\nThe Barber\nThe Bard\nThe Bartender\nBattle Butler\nBenevolent Precursors\nThe Berserker\nThe Big Bad Wolf\nBig Eater\nBlood Knight\nBounty Hunter\nBridezilla\nBumbling Dad\nBumbling Sidekick\nInsane Ruler\nThe Care Taker\nThe Charmer\nChatty Hairdresser\nChick Magnet\nChildhood Friend\nChivalrous Pervert\nChurch Militant\nCity Mouse\nClass Clown\nControl Freak\nCorrupt Corporate Executive\nCosmic Plaything\nCowboy Cop\nCranky Landlord\nCranky Neighbor\nCrooked Contractor\nCrossdresser\nCrouching Moron, Hidden Badass\nDad the Veteran\nDamsel Errant\nDark Messiah\nDark-Skinned Redhead\nDashing Hispanic\nDeath Seeker\nDeceptive Disciple\nDefector from Decadence\nDefrosting Ice Queen\nDeranged Taxi Driver\nDeterminator\nDetermined Widow\nDirty Coward\nThe Ditz\nBrainless Beauty\nGenius Ditz\nIdiot Savant\nUpper-Class Twit\nDumb Muscle\nDogged Nice Guy\nDoting Parent\nDouble Agent\nDream People\nDrill Sergeant Nasty\nThe Friendly Landlord\nDr. Jerk\nWorking-class hooligan\nThe Eeyore\nElegant Classical Musician\nEnigmatic Empowering Entity\nErudite Stoner\nEthnic Magician\nThe Everyman\nEvil Matriarch\nFace of a Thug\nFalse Prophet\nFarmer's Daughter\nFemme Fatale\nThe Fighting Narcissist\nThe Flapper\nForest Ranger\nGadgeteer Genius\nGirl Next Door\nGlory Hound\nGlory Seeker\nGold Digger\nBeautiful Foreigner\nGrande Dame\nGroupie\nGuile Hero\nHandsome Lech\nHalf-Human Hybrid\nHalf-Identical Twins\nHalf-Witted Hillbilly\nHardboiled Detective\nHead-Turning Beauty\nHeaven Seeker\nHell Seeker\nHeavy Sleeper\nYe Olde Hermit\nHonest John's Dealership\nHouse Husband\nHuman Weapon\nIgnorant of Their Own Ignorance\nMad Scientist's Helper\nThe Informant\nIntrepid Merchant\nKid Hero\nKindly Housekeeper\nThe Klutz\nKnight in Shining Armor\nKnow-Nothing Know-It-All\nLethal Chef\nLiteral-Minded\nLittle Jimmy\nLiving Legend\nLoony Fan\nLower-Class Lout\nMad Scientist\nMaster Swordsman\nBoastful Coward\nThe Most Wanted\nMysterious Waif\nNarcissist\nThe Nicknamer\nNon-Powered Costumed Hero\nNot with Them for the Money\nOne of the Boys\nOne-Note Cook\nOpen-Minded Parent\nOutside Man, Inside Man\nOverly Polite Pals\nPeerless Love Interest\nPerson of Mass Destruction\nPint-Sized Powerhouse\nPlucky Comic Relief\nPlucky Office Girl\nThe Nice Cheerleader\nPrince of Pranksters\nProud Warrior Race Guy\nPsycho Supporter\nThe Quarterback\nThe Reliable One\nRenaissance Man\nReplacement Goldfish\nThe Rival\nThe Roadie\nThe Rock Star\nRomantic Runner-Up\nSchool Nurse\nSelf-Made Man\nSerial Romeo\nThe Scrooge\nThe Shrink\nShrinking Violet\nSickly Neurotic Geek\nSingle-Issue Landlord\nSleazy Politician\nSmart Jerk\nNice Moron\nSmooth-Talking Talent Agent\nThe Snark Knight\nSouthern Belle\nSpirited Competitor\nStage Magician\nStarving Artist\nStarving Student\nStupid Boss\nSupreme Chef\nTall, Dark, and Handsome\nThird-Person Person\nToken Houseguest\nTomboy\nTrue Craftsman\nUnsatisfiable Customer\nUnstoppable Mailman\nWandering Minstrel\nWet Blanket Wife\nWhite Collar Worker\nWilling Channeler\nWinged Humanoid\n","shuffleNoteTemplate":"## The Prompt\n\nWrite a piece of flash fiction between 500 and 999 words that:\n\n* Includes each of the following words: $WORD, $WORD, $WORD.\n* Begins with the letter $LETTER.\n* Involves a character who matches the following archetypal trope: $CHARACTER\n\n\n\n## The Story"} -------------------------------------------------------------------------------- /main.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var obsidian = require('obsidian'); 4 | 5 | /*! ***************************************************************************** 6 | Copyright (c) Microsoft Corporation. 7 | 8 | Permission to use, copy, modify, and/or distribute this software for any 9 | purpose with or without fee is hereby granted. 10 | 11 | THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH 12 | REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 13 | AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, 14 | INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 15 | LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR 16 | OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 17 | PERFORMANCE OF THIS SOFTWARE. 18 | ***************************************************************************** */ 19 | /* global Reflect, Promise */ 20 | 21 | var extendStatics = function(d, b) { 22 | extendStatics = Object.setPrototypeOf || 23 | ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || 24 | function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; 25 | return extendStatics(d, b); 26 | }; 27 | 28 | function __extends(d, b) { 29 | extendStatics(d, b); 30 | function __() { this.constructor = d; } 31 | d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); 32 | } 33 | 34 | function __awaiter(thisArg, _arguments, P, generator) { 35 | function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } 36 | return new (P || (P = Promise))(function (resolve, reject) { 37 | function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } 38 | function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } 39 | function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } 40 | step((generator = generator.apply(thisArg, _arguments || [])).next()); 41 | }); 42 | } 43 | 44 | function __generator(thisArg, body) { 45 | var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; 46 | return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; 47 | function verb(n) { return function (v) { return step([n, v]); }; } 48 | function step(op) { 49 | if (f) throw new TypeError("Generator is already executing."); 50 | while (_) try { 51 | if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; 52 | if (y = 0, t) op = [op[0] & 2, t.value]; 53 | switch (op[0]) { 54 | case 0: case 1: t = op; break; 55 | case 4: _.label++; return { value: op[1], done: false }; 56 | case 5: _.label++; y = op[1]; op = [0]; continue; 57 | case 7: op = _.ops.pop(); _.trys.pop(); continue; 58 | default: 59 | if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } 60 | if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } 61 | if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } 62 | if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } 63 | if (t[2]) _.ops.pop(); 64 | _.trys.pop(); continue; 65 | } 66 | op = body.call(thisArg, _); 67 | } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } 68 | if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; 69 | } 70 | } 71 | 72 | var OBLIQUE_STRATEGIES = ["Abandon normal instruments.", "Accept advice.", "Accretion.", "A line has two sides.", "Balance the consistency principle with the inconsistency principle.", "Be dirty.", "Breathe more deeply.", "Bridges -build -burn.", "Cascades.", "Cluster analysis.", "Consider different fading systems.", "Courage!", "Cut a vital connection.", "Decorate, decorate.", "Define an area as 'safe' and use it as an anchor.", "Destroy the most important thing.", "Discard an axiom.", "Disconnect from desire.", "Discover the recipes you are using and abandon them.", "Distorting time.", "Don't be afraid of things because they're easy to do.", "Don't be frightened of cliches.", "Don't be frightened to display your talents.", "Don't stress one thing more than another.", "Do something boring.", "Do the washing up.", "Do the words need changing?", "Do we need holes?", "Emphasize differences.", "Emphasize repetitions.", "Emphasize the flaws.", "Get your neck massaged.", "Give way to your worst impulse.", "Go slowly all the way round the outside.", "Honor thy error as a hidden intention.", "How would you have done it?", "Humanize something free of error.", "Infinitesimal gradations.", "Into the impossible.", "Is it finished?", "Is there something missing?", "Just carry on.", "Left channel, right channel, centre channel.", "Look at a very small object, look at its centre.", "Look at the order in which you do things.", "Look closely at the most embarrassing details and amplify them.", "Make a blank valuable by putting it in an exquisite frame.", "Make an exhaustive list of everything you might do and do the last thing on the list.", "Make a sudden, destructive unpredictable action; incorporate.", "Only one element of each kind.", "Remember those quiet evenings.", "Remove ambiguities and convert to specifics.", "Remove specifics and convert to ambiguities.", "Repetition is a form of change.", "Reverse.", "Simple subtraction.", "Spectrum analysis.", "Take a break.", "Take away the elements in order of apparent non-importance.", "Tidy up.", "Turn it upside down.", "Twist the spine.", "Use an old idea.", "Use an unacceptable color.", "Water.", "What are you really thinking about just now? Incorporate.", "What is the reality of the situation?", "What mistakes did you make last time?", "What wouldn't you do?", "Work at a different speed."]; 73 | var CONVERSATION_STARTERS = ["If You Had Three Wishes, What Would You Wish For?", "What Would You Rather Throw Away: Love Or Money?", "What's The Most Beautiful Place You've Ever Seen?", "What Was Your Fondest Memory Of High School?", "What's Your Favorite TV Show?", "What's The Strangest Thing In Your Refrigerator?", "Would You Rather Hear The Music Of Johann Sebastian Bach Played By A Barbershop Quartet, Or A Heavy Metal Band?", "Have You Ever Been To A Five Star Resort?", "What Was Your Favorite Toy Growing Up?", "What's The Funniest Way You've Ever Broken The Law?", "What's Your Favorite Sports Team?", "What Talent Would You Want To Possess If You Could?", "If You Could Trade Lives With Someone, Who Would It Be?", "If You Could Erase One Event From History, Which One Would You Erase?", "What Was Your Favorite Toy As A Child?", "Who Do You Most Like To Poke Fun At?", "If You Were Suddenly Transported To Another Planet, How Would You Assess The Situation?", "When Do You Feel The Most In Control?", "Would You Rather Have 10 Hobbies Or One Passion?", "What's Your Favorite Movie?", "If You Could Interview A Famous Person, Who Would You Choose?", "If Your Food Is Bad At A Restaurant, Would You Say Something?", "If You Could Only Use One Word The Rest Of Your Life, What Word Would You Choose?", "What Are Your Dreams And Ambitions?", "You've Been Given An Elephant. You Can't Get Rid Of It. What Would You Do With It?", "What's The Funniest Thing You've Seen On The News?", "If You Had The World's Attention For 30 Seconds, What Would You Say?", "If You Could Be Best Friends With A Celebrity, Who Would It Be?", "If You Were To Play A Song You Love Right Now, What Would It Be?", "Would You Rather Look Like A Potato, Or Feel Like A Potato?", "What Would You Do With 10 Million Dollars?", "How Can You Tell If Someone Has A Sense Of Humor?", "If You Were To Name Your Own Song, What Would You Name It?", "If You Were In A Room Filled With You And Your Doppelganger And 2 Million Dollars, What Would You Do?", "What Is In Your Fridge Right Now?", "What Have You Learned About Life From Kids?", "How Would You Want To Be Remembered?", "What Do You Hope Your Deceased Relative Would Say About You If They Saw You Now?", "If You Could Change Your Name, What Would You Change It To?", "What's The Strangest Thing That You've Ever Fallen In Love With?", "If You Could Have Any Super Power, Which One Would You Choose?", "If You Were Invited To Attend Hogwarts, Which Hogwarts House Would You Choose?", "What Were The Highlights Of Your Childhood?", "Have You Ever Kept A Secret For More Than A Decade?", "What's The Most Important Thing You've Learned From A Celebrity?", "Do You Care About Reviews?", "What Would Be The Perfect Crime?", "What's The Stupidest Thing You've Ever Done?", "Spontaneity Or Stability?", "What's The Funniest Movie You've Ever Seen?", "When Did You Last Meet A Stranger You Thought You'd Never Meet Again?", "Do You Save Or Spend?", "How Much Does The Amount Of Traffic Affect Your Mood?", "If You Had To Choose One Animal To Have As A Pet, Which Animal Would You Choose?", "What's Your Worst Habit?", "Do they like to take a stand or just let things go?", "What's Your Favorite Song?", "How Do You Think The World Would Be Different If Bananas Were Illegal?", "Would You Rather Be Able To Control Time, Or Be Able To Know What Other People Are Thinking?", "Is It Difficult To Do What You Do?", "Who Is Your Favorite Celebrity?", "If You Found $2,000 On The Ground, What Would You Do With It?", "What's Your Favorite Pizza Topping?", "What Would You Do If You Could Possess The Abilities Of Your Dog?", "What's The Smartest Thing You've Ever Done?"]; 74 | var FLASH_FICTION_PACK = { "variable1Name": "WORD", "variable1Values": "account\nmiddle\nact\nmilk\nadjustment\nmind\nmine\nagreement\nminute\nair\nmist\namount\namusement\nmonth\nanimal\nmorning\nanswer\nmother\napparatus\nmotion\napproval\nmountain\nargument\nmove\nart\nmusic\nattack\nname\nattempt\nnation\nattention\nneed\nattraction\nnews\nauthority\nnight\nback\nnoise\nbalance\nnote\nAmaranth\nAmber\nAmethyst\nApricot\nAqua\nAquamarine\nAsparagus\nAuburn\nAzure\nBeige\nBistre\nBlack\nBlue\nBrass\nBronze\nBrown\nBuff\nBurgundy\nCamouflage\nCardinal\nCarmine\nCarrot\nCeladon\nCerise\nCerulean\nChampagne\nCharcoal\nChartreuse\nCherry\nChestnut\nChocolate\nCinnabar\nCinnamon\nCobalt\nCopper\nCoral\nCorn\nCornflower\nCream\nCrimson\nCyan\nEmerald\nEggplant\nFlax\nFrench Rose\nGold\nGoldenrod\nGreen\nGrey\nIndigo\nIvory\nJade\nKhaki\nLavender\nLemon\nLilac\nLime\nLinen\nMagenta\nMagnolia\nMalachite\nMaroon\nMauve\nMustard\nMyrtle\nNavy\nOchre\nOlive\nOrange\nOrchid\nPeach\nPear\nPeriwinkle\nPersimmon\nPine Green\nPink\nPlatinum\nPlum\nPumpkin\nPurple\nQuartz\nRaw umber\nRose\nRuby\nRusset\nRust\nSaffron\nSalmon\nSandy brown\nSangria\nSapphire\nScarlet\nSeashell\nSepia\nSlate\nSilver\nTan\nTangerine\nTaupe\nTeal\nTawny\nTerra cotta\nThistle\nTomato\nTurquoise\nUltramarine\nVermilion\nViolet\nViridian\nWheat\nWhite\nWisteria\nXanthic\nYellow\nZucchini\nbase\nnumber\nbehavior\nobservation\nbelief\noffer\nbirth\noil\nbit\noperation\nbite\nopinion\nblood\norder\nblow\norganization\nbody\nornament\nbrass\nowner\nbread\npage\nbreath\npain\nbrother\npaint\nbuilding\npaper\nburn\npart\nburst\npaste\nbusiness\npayment\nbutter\npeace\ncanvas\nperson\ncare\nplace\ncause\nplant\nchalk\nplay\nchance\npleasure\nchange\npoint\ncloth\npoison\ncoal\npolish\ncolor\nporter\ncomfort\nposition\ncommittee\npowder\ncompany\npower\ncomparison\nprice\ncompetition\nprint\ncondition\nprocess\nconnection\nproduce\ncontrol\nprofit\ncook\nproperty\ncopper\nprose\ncopy\nprotest\ncork\npull\ncopy\npunishment\ncough\npurpose\ncountry\npush\ncover\nquality\ncrack\nquestion\ncredit\nrain\ncrime\nrange\ncrush\nrate\ncry\nray\ncurrent\nreaction\ncurve\nreading\ndamage\nreason\ndanger\nrecord\ndaughter\nregret\nday\nrelation\ndeath\nreligion\ndebt\nrepresentative\ndecision\nrequest\ndegree\nrespect\ndesign\nrest\ndesire\nreward\ndestruction\nrhythm\ndetail\nrice\ndevelopment\nriver\ndigestion\nroad\ndirection\nroll\ndiscovery\nroom\ndiscussion\nrub\ndisease\nrule\ndisgust\nrun\ndistance\nsalt\ndistribution\nsand\ndivision\nscale\ndoubt\nscience\ndrink\nsea\ndriving\nseat\ndust\nsecretary\nearth\nselection\nedge\nself\neducation\nsense\neffect\nservant\nend\nerror\nshade\nevent\nshake\nexample\nshame\nexchange\nshock\nexistence\nside\nexpansion\nsign\nexperience\nsilk\nexpert\nsilver\nfact\nsister\nfall\nsize\nfamily\nsky\nfather\nsleep\nfear\nslip\nfeeling\nslope\nfiction\nsmash\nfield\nsmell\nfight\nsmile\nfire\nsmoke\nflame\nsneeze\nflight\nsnow\nflower\nsoap\nfold\nsociety\nfood\nson\nforce\nsong\nform\nsort\nfriend\nsound\nfront\nsoup\nfruit\nspace\nglass\nstage\ngold\nstart\ngovernment\nstatement\ngrain\nsteam\ngrass\nsteel\ngrip\nstep\ngroup\nstitch\ngrowth\nstone\nguide\nstop\nharbor\nstory\nharmony\nstretch\nhate\nstructure\nhearing\nsubstance\nheat\nsugar\nhelp\nsuggestion\nhistory\nsummer\nhole\nsupport\nhope\nsurprise\nhour\nswim\nhumor\nsystem\nice\ntalk\nidea\ntaste\nimpulse\ntax\nincrease\nteaching\nindustry\ntendency\nink\ntest\ninsect\ntheory\ninstrument\nthing\ninsurance\nthought\ninterest\nthunder\ninvention\ntime\niron\ntin\njelly\ntop\njoin\ntouch\njourney\ntrade\njudge\ntransport\njump\ntrick\nkick\ntrouble\nkiss\nturn\nknowledge\ntwist\nland\nunit\nlanguage\nuse\nlaugh\nvalue\nlow\nverse\nlead\nvessel\nlearning\nview\nleather\nvoice\nletter\nwalk\nlevel\nwar\nlift\nwash\nlight\nwaste\nlimit\nwater\nlinen\nwave\nliquid\nwax\nlist\nway\nlook\nweather\nloss\nweek\nlove\nweight\nmachine\nwind\nman\nwine\nmanager\nwinter\nmark\nwoman\nmarket\nwood\nmass\nwool\nmeal\nword\nmeasure\nwork\nmeat\nwound\nmeeting\nwriting\nmemory\nyear\nmetal\nworm\nangle\nknee\nant\nknife\napple\nknot\narch\nleaf\narm\nleg\narmy\nlibrary\nbaby\nline\nbag\nlip\nball\nlock\nband\nmap\nbasin\nmatch\nbasket\nmonkey\nbath\nmoon\nbed\nmouth\nbee\nmuscle\nbell\nnail\nberry\nneck\nbird\nneedle\nblade\nnerve\nboard\nnet\nboat\nnose\nbone\nnut\nbook\noffice\nboot\norange\nbottle\noven\nbox\nparcel\nboy\npen\nbrain\npencil\nbrake\npicture\nbranch\npig\nbrick\npin\nbridge\npipe\nbrush\nplane\nbucket\nplate\nbulb\nplough\nbutton\npocket\ncake\npot\ncamera\npotato\ncard\nprison\ncarriage\npump\ncart\nrail\ncat\nrat\nchain\nreceipt\ncheese\nring\nchess\nrod\nchin\nroof\nchurch\nroot\ncircle\nsail\nclock\nschool\ncloud\nscissors\ncoat\nscrew\ncollar\nseed\ncomb\nsheep\ncord\nshelf\ncow\nship\ncup\nshirt\ncurtain\nshoe\ncushion\nskin\ndog\nskirt\ndoor\nsnake\ndrain\nsock\ndrawer\nspade\ndress\nsponge\ndrop\nspoon\near\nspring\negg\nsquare\nengine\nstamp\neye\nstar\nface\nstation\nfarm\nstem\nfeather\nstick\nfinger\nstocking\nfish\nstomach\nflag\nstore\nfloor\nstreet\nfly\nsun\nfoot\ntable\nfork\ntail\nfowl\nthread\nframe\nthroat\ngarden\nthumb\ngirl\nticket\nglove\ntoe\ngoat\ntongue\ngun\ntooth\nhair\ntown\nhammer\ntrain\nhand\ntray\nhat\ntree\nhead\ntrousers\nheart\numbrella\nhook\nwall\nhorn\nwatch\nhorse\nwheel\nhospital\nwhip\nhouse\nwhistle\nisland\nwindow\njewel\nwing\nkettle\nwire\nkey", "variable2Name": "LETTER", "variable2Values": "a\nb\nc\nd\ne\nf\ng\nh\ni\nj\nk\nl\nm\nn\no\np\nq\nr\ns\nt\nu\nv\nw\nx\ny\nz", "variable3Name": "CHARACTER", "variable3Values": "Anthropomorphic Personification\nAnti-Hero\nThe Archmage\nAudience Surrogate\nBarefoot Sage\nBlind Seer\nBlue-Collar Warlock\nBruiser with a Soft Center\nThe Chosen One\nThe Chooser of The One\nClassical Hunter\nClassic Villain\nThe Cynic\nThe Dragonslayer\nThe Drunken Sailor\nDumb Muscle\nEccentric Mentor\nEvil Overlord\nThe Fair Folk\nFalse Prophet\nThe Ferryman\nThe Fool\nFool for Love\nGentle Giant\nThe Good King\nHerald\nThe Hero\nHeroic Wannabe\nHigher Self\nHunter of Monsters\nThe Idealist\nIneffectual Loner\nThe Klutz\nKnight in Shining Armor\nLady and Knight\nLovable Rogue\nMadonna Archetype\nThe McCoy\nMentor Archetype\nMessiah Figure\nMock Millionaire\nModern Major General\nMoses Archetype\nMy Girl Back Home\nObstructive Bureaucrat\nOld Soldier\nThe Paladin\nThe Paragon\nThe Patriarch\nPerson of Mass Destruction\nPrince Charming\nRebel Leader\nRebellious Spirit\nReluctant Monster\nSeeker Archetype\nSidekick\nThe Sociopath\nStar-Crossed Lovers\nThe Storyteller\nTurn Coat\nThe Trickster\nWicked Stepmother\nWicked Witch\nWolf Man\nWorld's Best Warrior\nWorld's Most Beautiful Woman\nWorld's Strongest Man\nAbsent-Minded Professor\nThe believer\nThe skeptic\nAngry Chef\nAntagonistic Governor\nAnthropomorphic Animal\nBad Boss\nBadass Normal\nBarbarian Tribe\nThe Barber\nThe Bard\nThe Bartender\nBattle Butler\nBenevolent Precursors\nThe Berserker\nThe Big Bad Wolf\nBig Eater\nBlood Knight\nBounty Hunter\nBridezilla\nBumbling Dad\nBumbling Sidekick\nInsane Ruler\nThe Care Taker\nThe Charmer\nChatty Hairdresser\nChick Magnet\nChildhood Friend\nChivalrous Pervert\nChurch Militant\nCity Mouse\nClass Clown\nControl Freak\nCorrupt Corporate Executive\nCosmic Plaything\nCowboy Cop\nCranky Landlord\nCranky Neighbor\nCrooked Contractor\nCrossdresser\nCrouching Moron, Hidden Badass\nDad the Veteran\nDamsel Errant\nDark Messiah\nDark-Skinned Redhead\nDashing Hispanic\nDeath Seeker\nDeceptive Disciple\nDefector from Decadence\nDefrosting Ice Queen\nDeranged Taxi Driver\nDeterminator\nDetermined Widow\nDirty Coward\nThe Ditz\nBrainless Beauty\nGenius Ditz\nIdiot Savant\nUpper-Class Twit\nDumb Muscle\nDogged Nice Guy\nDoting Parent\nDouble Agent\nDream People\nDrill Sergeant Nasty\nThe Friendly Landlord\nDr. Jerk\nWorking-class hooligan\nThe Eeyore\nElegant Classical Musician\nEnigmatic Empowering Entity\nErudite Stoner\nEthnic Magician\nThe Everyman\nEvil Matriarch\nFace of a Thug\nFalse Prophet\nFarmer's Daughter\nFemme Fatale\nThe Fighting Narcissist\nThe Flapper\nForest Ranger\nGadgeteer Genius\nGirl Next Door\nGlory Hound\nGlory Seeker\nGold Digger\nBeautiful Foreigner\nGrande Dame\nGroupie\nGuile Hero\nHandsome Lech\nHalf-Human Hybrid\nHalf-Identical Twins\nHalf-Witted Hillbilly\nHardboiled Detective\nHead-Turning Beauty\nHeaven Seeker\nHell Seeker\nHeavy Sleeper\nYe Olde Hermit\nHonest John's Dealership\nHouse Husband\nHuman Weapon\nIgnorant of Their Own Ignorance\nMad Scientist's Helper\nThe Informant\nIntrepid Merchant\nKid Hero\nKindly Housekeeper\nThe Klutz\nKnight in Shining Armor\nKnow-Nothing Know-It-All\nLethal Chef\nLiteral-Minded\nLittle Jimmy\nLiving Legend\nLoony Fan\nLower-Class Lout\nMad Scientist\nMaster Swordsman\nBoastful Coward\nThe Most Wanted\nMysterious Waif\nNarcissist\nThe Nicknamer\nNon-Powered Costumed Hero\nNot with Them for the Money\nOne of the Boys\nOne-Note Cook\nOpen-Minded Parent\nOutside Man, Inside Man\nOverly Polite Pals\nPeerless Love Interest\nPerson of Mass Destruction\nPint-Sized Powerhouse\nPlucky Comic Relief\nPlucky Office Girl\nThe Nice Cheerleader\nPrince of Pranksters\nProud Warrior Race Guy\nPsycho Supporter\nThe Quarterback\nThe Reliable One\nRenaissance Man\nReplacement Goldfish\nThe Rival\nThe Roadie\nThe Rock Star\nRomantic Runner-Up\nSchool Nurse\nSelf-Made Man\nSerial Romeo\nThe Scrooge\nThe Shrink\nShrinking Violet\nSickly Neurotic Geek\nSingle-Issue Landlord\nSleazy Politician\nSmart Jerk\nNice Moron\nSmooth-Talking Talent Agent\nThe Snark Knight\nSouthern Belle\nSpirited Competitor\nStage Magician\nStarving Artist\nStarving Student\nStupid Boss\nSupreme Chef\nTall, Dark, and Handsome\nThird-Person Person\nToken Houseguest\nTomboy\nTrue Craftsman\nUnsatisfiable Customer\nUnstoppable Mailman\nWandering Minstrel\nWet Blanket Wife\nWhite Collar Worker\nWilling Channeler\nWinged Humanoid\n", "shuffleNoteTemplate": "## The Prompt\n\nWrite a piece of flash fiction between 500 and 999 words that:\n\n* Includes each of the following words: $WORD, $WORD, $WORD.\n* Begins with the letter $LETTER.\n* Involves a character who matches the following archetypal trope: $CHARACTER\n\n\n\n## The Story" }; 75 | var ShufflePluginSettings = /** @class */ (function () { 76 | function ShufflePluginSettings() { 77 | this.variable1Name = "WORD"; 78 | this.variable1Values = "Cat\nDog\nKing\nFire\nPaper\nWall\nBook\nWind"; 79 | this.variable2Name = "LETTER"; 80 | this.variable2Values = "a\nb\nc\nd\ne\nf\ng\nh\ni\nj\nk\nl"; 81 | this.variable3Name = "LOCATION"; 82 | this.variable3Values = "New York\nLos Angeles\nLondon\nParis\nBerlin"; 83 | this.shuffleNoteTemplate = "## Prompt\n1. Include one of these words: $WORD, $WORD or $WORD\n2. Begin with a word that starts with `$LETTER`\n3. Take place in $LOCATION or $LOCATION\n"; 84 | } 85 | return ShufflePluginSettings; 86 | }()); 87 | var ShufflePlugin = /** @class */ (function (_super) { 88 | __extends(ShufflePlugin, _super); 89 | function ShufflePlugin() { 90 | return _super !== null && _super.apply(this, arguments) || this; 91 | } 92 | ShufflePlugin.prototype.onload = function () { 93 | return __awaiter(this, void 0, void 0, function () { 94 | var _this = this; 95 | return __generator(this, function (_a) { 96 | this.loadSettings(); 97 | this.addSettingTab(new ShufflePluginSettingTab(this.app, this)); 98 | this.addRibbonIcon('dice', 'Shuffle Plugin', function () { 99 | _this.createShuffleNote(); 100 | }); 101 | return [2 /*return*/]; 102 | }); 103 | }); 104 | }; 105 | ShufflePlugin.prototype.onunload = function () { }; 106 | ShufflePlugin.prototype.saveSettings = function () { 107 | return __awaiter(this, void 0, void 0, function () { 108 | return __generator(this, function (_a) { 109 | switch (_a.label) { 110 | case 0: return [4 /*yield*/, this.saveData(this.settings)]; 111 | case 1: 112 | _a.sent(); 113 | return [2 /*return*/]; 114 | } 115 | }); 116 | }); 117 | }; 118 | ShufflePlugin.prototype.loadSettings = function () { 119 | var _this = this; 120 | this.settings = new ShufflePluginSettings(); 121 | (function () { return __awaiter(_this, void 0, void 0, function () { 122 | var loadedSettings; 123 | return __generator(this, function (_a) { 124 | switch (_a.label) { 125 | case 0: return [4 /*yield*/, this.loadData()]; 126 | case 1: 127 | loadedSettings = _a.sent(); 128 | if (!loadedSettings) return [3 /*break*/, 2]; 129 | this.settings.variable1Name = loadedSettings.variable1Name; 130 | this.settings.variable1Values = loadedSettings.variable1Values; 131 | this.settings.variable2Name = loadedSettings.variable2Name; 132 | this.settings.variable2Values = loadedSettings.variable2Values; 133 | this.settings.variable3Name = loadedSettings.variable3Name; 134 | this.settings.variable3Values = loadedSettings.variable3Values; 135 | this.settings.shuffleNoteTemplate = loadedSettings.shuffleNoteTemplate; 136 | return [3 /*break*/, 4]; 137 | case 2: return [4 /*yield*/, this.saveData(this.settings)]; 138 | case 3: 139 | _a.sent(); 140 | _a.label = 4; 141 | case 4: return [2 /*return*/]; 142 | } 143 | }); 144 | }); })(); 145 | }; 146 | ShufflePlugin.prototype.createShuffleNote = function () { 147 | return __awaiter(this, void 0, void 0, function () { 148 | var result, variable1, values1, variable2, values2, variable3, values3, fileName; 149 | return __generator(this, function (_a) { 150 | switch (_a.label) { 151 | case 0: 152 | result = this.settings.shuffleNoteTemplate; 153 | variable1 = "$" + this.settings.variable1Name; 154 | values1 = this.settings.variable1Values.split("\n"); 155 | variable2 = "$" + this.settings.variable2Name; 156 | values2 = this.settings.variable2Values.split("\n"); 157 | variable3 = "$" + this.settings.variable3Name; 158 | values3 = this.settings.variable3Values.split("\n"); 159 | if (values1.length > 0) 160 | result = this.replaceVariablesInTemplate(result, variable1, values1); 161 | if (values2.length > 0) 162 | result = this.replaceVariablesInTemplate(result, variable2, values2); 163 | if (values3.length > 0) 164 | result = this.replaceVariablesInTemplate(result, variable3, values3); 165 | fileName = "Shuffle Note - " + Date.now() + " .md"; 166 | return [4 /*yield*/, this.saveShuffleNote(fileName, result)]; 167 | case 1: 168 | _a.sent(); 169 | return [4 /*yield*/, this.app.workspace.openLinkText(fileName, '', true)]; 170 | case 2: 171 | _a.sent(); 172 | return [2 /*return*/]; 173 | } 174 | }); 175 | }); 176 | }; 177 | ShufflePlugin.prototype.replaceVariablesInTemplate = function (template, variable, values) { 178 | while (template.includes(variable)) { 179 | template = template.replace(variable, this.pickRandomly(values)); 180 | } 181 | return template; 182 | }; 183 | ShufflePlugin.prototype.saveShuffleNote = function (filePath, mdString) { 184 | return __awaiter(this, void 0, void 0, function () { 185 | var fileExists; 186 | return __generator(this, function (_a) { 187 | switch (_a.label) { 188 | case 0: return [4 /*yield*/, this.app.vault.adapter.exists(filePath)]; 189 | case 1: 190 | fileExists = _a.sent(); 191 | if (!fileExists) return [3 /*break*/, 4]; 192 | return [4 /*yield*/, this.app.vault.adapter.read(filePath)]; 193 | case 2: 194 | _a.sent(); 195 | return [4 /*yield*/, this.app.vault.adapter.write(filePath, mdString)]; 196 | case 3: 197 | _a.sent(); 198 | return [3 /*break*/, 6]; 199 | case 4: return [4 /*yield*/, this.app.vault.create(filePath, mdString)]; 200 | case 5: 201 | _a.sent(); 202 | _a.label = 6; 203 | case 6: return [2 /*return*/]; 204 | } 205 | }); 206 | }); 207 | }; 208 | // @ts-ignore 209 | ShufflePlugin.prototype.shuffle = function (array) { 210 | for (var i = array.length - 1; i > 0; i--) { 211 | var j = Math.floor(Math.random() * i); 212 | var temp = array[i]; 213 | array[i] = array[j]; 214 | array[j] = temp; 215 | } 216 | return array; 217 | }; 218 | // @ts-ignore 219 | ShufflePlugin.prototype.pickRandomly = function (array) { 220 | return this.shuffle(array)[0]; 221 | }; 222 | return ShufflePlugin; 223 | }(obsidian.Plugin)); 224 | var ShufflePluginSettingTab = /** @class */ (function (_super) { 225 | __extends(ShufflePluginSettingTab, _super); 226 | function ShufflePluginSettingTab(app, plugin) { 227 | var _this = _super.call(this, app, plugin) || this; 228 | _this.plugin = plugin; 229 | return _this; 230 | } 231 | ShufflePluginSettingTab.prototype.loadPrompts = function (variable1Name, variable1Values, template, variable2Name, variable2Values, variable3Name, variable3Values) { 232 | return __awaiter(this, void 0, void 0, function () { 233 | return __generator(this, function (_a) { 234 | switch (_a.label) { 235 | case 0: 236 | this.plugin.settings.variable1Name = variable1Name; 237 | this.plugin.settings.variable1Values = variable1Values.join("\n"); 238 | this.plugin.settings.variable2Name = variable2Name; 239 | this.plugin.settings.variable2Values = variable2Values.join("\n"); 240 | this.plugin.settings.variable3Name = variable3Name; 241 | this.plugin.settings.variable3Values = variable3Values.join("\n"); 242 | this.plugin.settings.shuffleNoteTemplate = template; 243 | return [4 /*yield*/, this.plugin.saveSettings()]; 244 | case 1: 245 | _a.sent(); 246 | this.display(); 247 | return [2 /*return*/]; 248 | } 249 | }); 250 | }); 251 | }; 252 | ShufflePluginSettingTab.prototype.loadFlashFictionPack = function () { 253 | var variable1Name = FLASH_FICTION_PACK.variable1Name; 254 | var variable1Values = FLASH_FICTION_PACK.variable1Values.split("\n"); 255 | var variable2Name = FLASH_FICTION_PACK.variable2Name; 256 | var variable2Values = FLASH_FICTION_PACK.variable2Values.split("\n"); 257 | var variable3Name = FLASH_FICTION_PACK.variable3Name; 258 | var variable3Values = FLASH_FICTION_PACK.variable3Values.split("\n"); 259 | var template = FLASH_FICTION_PACK.shuffleNoteTemplate; 260 | this.loadPrompts(variable1Name, variable1Values, template, variable2Name, variable2Values, variable3Name, variable3Values); 261 | }; 262 | ShufflePluginSettingTab.prototype.loadConversationStarters = function () { 263 | return __awaiter(this, void 0, void 0, function () { 264 | return __generator(this, function (_a) { 265 | this.loadPrompts("CONVERSATION_STARTER", CONVERSATION_STARTERS, "## $CONVERSATION_STARTER", "", [], "", []); 266 | return [2 /*return*/]; 267 | }); 268 | }); 269 | }; 270 | ShufflePluginSettingTab.prototype.loadObliqueStrategies = function () { 271 | return __awaiter(this, void 0, void 0, function () { 272 | return __generator(this, function (_a) { 273 | this.loadPrompts("OBLIQUE_STRATEGY", OBLIQUE_STRATEGIES, "\"$OBLIQUE_STRATEGY\"", "", [], "", []); 274 | return [2 /*return*/]; 275 | }); 276 | }); 277 | }; 278 | ShufflePluginSettingTab.prototype.display = function () { 279 | var _this = this; 280 | var containerEl = this.containerEl; 281 | containerEl.empty(); 282 | containerEl.createEl('h2', { text: 'Shuffle Settings' }); 283 | containerEl.createEl("h3", { text: "Featured Prompts" }); 284 | containerEl.createEl("p", { text: "Try out new prompts by loading them into your settings. Will replace your custom prompts." }); 285 | containerEl.createEl("button", { text: "⚫️ \"Oblique Strategies\" by Brian Eno and Peter Schmidt", cls: 'shuffle-pack-button' }) 286 | .addEventListener("mousedown", this.loadObliqueStrategies.bind(this)); 287 | containerEl.createEl("br"); 288 | containerEl.createEl("button", { text: "⚡️ \"Flash Fiction Pack\" by Eleanor Konik", cls: 'shuffle-pack-button' }) 289 | .addEventListener("mousedown", this.loadFlashFictionPack.bind(this)); 290 | containerEl.createEl("br"); 291 | // containerEl.createEl("button", {text: "❓️ \"Conversation Starter Pack\" from Brightful.com", cls: 'shuffle-pack-button'}) 292 | // .addEventListener("mousedown", this.loadConversationStarters.bind(this)); 293 | // containerEl.createEl("br"); 294 | containerEl.createEl("h3", { text: "Customize Your Prompts" }); 295 | new obsidian.Setting(containerEl) 296 | .setName('Variable #1 Name') 297 | .setDesc('For example, enter WORD here and then, in your template, use $WORD to invoke a randomly selected value.') 298 | .addText(function (text) { return text 299 | .setPlaceholder('') 300 | .setValue(_this.plugin.settings.variable1Name) 301 | .onChange(function (value) { return __awaiter(_this, void 0, void 0, function () { 302 | return __generator(this, function (_a) { 303 | switch (_a.label) { 304 | case 0: 305 | this.plugin.settings.variable1Name = value; 306 | return [4 /*yield*/, this.plugin.saveSettings()]; 307 | case 1: 308 | _a.sent(); 309 | return [2 /*return*/]; 310 | } 311 | }); 312 | }); }); }); 313 | new obsidian.Setting(containerEl) 314 | .setName('Variable #1 Values') 315 | .setDesc('Create a list of values that variable #1 will be randomly replaced with in your template. One value per line.') 316 | .addTextArea(function (text) { return text 317 | .setPlaceholder('Dog\nCat\nBefore dawn\nWith fire') 318 | .setValue(_this.plugin.settings.variable1Values) 319 | .onChange(function (value) { return __awaiter(_this, void 0, void 0, function () { 320 | return __generator(this, function (_a) { 321 | switch (_a.label) { 322 | case 0: 323 | this.plugin.settings.variable1Values = value; 324 | return [4 /*yield*/, this.plugin.saveSettings()]; 325 | case 1: 326 | _a.sent(); 327 | return [2 /*return*/]; 328 | } 329 | }); 330 | }); }); }); 331 | new obsidian.Setting(containerEl) 332 | .setName('Variable #2 Name') 333 | .setDesc('For example, enter LOCATION here and then, in your template, use $LOCATION to invoke a randomly selected value.') 334 | .addText(function (text) { return text 335 | .setPlaceholder('') 336 | .setValue(_this.plugin.settings.variable2Name) 337 | .onChange(function (value) { return __awaiter(_this, void 0, void 0, function () { 338 | return __generator(this, function (_a) { 339 | switch (_a.label) { 340 | case 0: 341 | this.plugin.settings.variable2Name = value; 342 | return [4 /*yield*/, this.plugin.saveSettings()]; 343 | case 1: 344 | _a.sent(); 345 | return [2 /*return*/]; 346 | } 347 | }); 348 | }); }); }); 349 | new obsidian.Setting(containerEl) 350 | .setName('Variable #2 Values') 351 | .setDesc('Create a list of values that variable #1 will be randomly replaced with in your template. One value per line.') 352 | .addTextArea(function (text) { return text 353 | .setPlaceholder('New York\nAustin\nParis\nBerlin') 354 | .setValue(_this.plugin.settings.variable2Values) 355 | .onChange(function (value) { return __awaiter(_this, void 0, void 0, function () { 356 | return __generator(this, function (_a) { 357 | switch (_a.label) { 358 | case 0: 359 | this.plugin.settings.variable2Values = value; 360 | return [4 /*yield*/, this.plugin.saveSettings()]; 361 | case 1: 362 | _a.sent(); 363 | return [2 /*return*/]; 364 | } 365 | }); 366 | }); }); }); 367 | new obsidian.Setting(containerEl) 368 | .setName('Variable #3 Name') 369 | .setDesc('For example, enter ACTION here and then, in your template, use $ACTION to invoke a randomly selected value.') 370 | .addText(function (text) { return text 371 | .setPlaceholder('') 372 | .setValue(_this.plugin.settings.variable3Name) 373 | .onChange(function (value) { return __awaiter(_this, void 0, void 0, function () { 374 | return __generator(this, function (_a) { 375 | switch (_a.label) { 376 | case 0: 377 | this.plugin.settings.variable3Name = value; 378 | return [4 /*yield*/, this.plugin.saveSettings()]; 379 | case 1: 380 | _a.sent(); 381 | return [2 /*return*/]; 382 | } 383 | }); 384 | }); }); }); 385 | new obsidian.Setting(containerEl) 386 | .setName('Variable #3 Values') 387 | .setDesc('Create a list of values that variable #1 will be randomly replaced with in your template. One value per line.') 388 | .addTextArea(function (text) { return text 389 | .setPlaceholder('Run\nHide\nBuy\nCut') 390 | .setValue(_this.plugin.settings.variable3Values) 391 | .onChange(function (value) { return __awaiter(_this, void 0, void 0, function () { 392 | return __generator(this, function (_a) { 393 | switch (_a.label) { 394 | case 0: 395 | this.plugin.settings.variable3Values = value; 396 | return [4 /*yield*/, this.plugin.saveSettings()]; 397 | case 1: 398 | _a.sent(); 399 | return [2 /*return*/]; 400 | } 401 | }); 402 | }); }); }); 403 | new obsidian.Setting(containerEl) 404 | .setName('Shuffle Note Template') 405 | .setDesc('Create your own template for your writing prompts using your variables.') 406 | .addTextArea(function (text) { return text 407 | .setPlaceholder('Include these 3 words: $WORD $WORD $WORD $WORD $WORD\n') 408 | .setValue(_this.plugin.settings.shuffleNoteTemplate) 409 | .onChange(function (value) { return __awaiter(_this, void 0, void 0, function () { 410 | return __generator(this, function (_a) { 411 | switch (_a.label) { 412 | case 0: 413 | this.plugin.settings.shuffleNoteTemplate = value; 414 | return [4 /*yield*/, this.plugin.saveSettings()]; 415 | case 1: 416 | _a.sent(); 417 | return [2 /*return*/]; 418 | } 419 | }); 420 | }); }); }); 421 | }; 422 | return ShufflePluginSettingTab; 423 | }(obsidian.PluginSettingTab)); 424 | 425 | module.exports = ShufflePlugin; 426 | //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZXMiOlsibm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5qcyIsIm1haW4udHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyohICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbkNvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxyXG5cclxuUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55XHJcbnB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZC5cclxuXHJcblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEhcclxuUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZXHJcbkFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCxcclxuSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NXHJcbkxPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SXHJcbk9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1JcclxuUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS5cclxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuLyogZ2xvYmFsIFJlZmxlY3QsIFByb21pc2UgKi9cclxuXHJcbnZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24oZCwgYikge1xyXG4gICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxyXG4gICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcclxuICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdOyB9O1xyXG4gICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19leHRlbmRzKGQsIGIpIHtcclxuICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cclxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcclxufVxyXG5cclxuZXhwb3J0IHZhciBfX2Fzc2lnbiA9IGZ1bmN0aW9uKCkge1xyXG4gICAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIF9fYXNzaWduKHQpIHtcclxuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcclxuICAgICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcclxuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKSB0W3BdID0gc1twXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVzdChzLCBlKSB7XHJcbiAgICB2YXIgdCA9IHt9O1xyXG4gICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApXHJcbiAgICAgICAgdFtwXSA9IHNbcF07XHJcbiAgICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpXHJcbiAgICAgICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcclxuICAgICAgICB9XHJcbiAgICByZXR1cm4gdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpIHtcclxuICAgIHZhciBjID0gYXJndW1lbnRzLmxlbmd0aCwgciA9IGMgPCAzID8gdGFyZ2V0IDogZGVzYyA9PT0gbnVsbCA/IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSA6IGRlc2MsIGQ7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUgPT09IFwiZnVuY3Rpb25cIikgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpO1xyXG4gICAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcclxuICAgIHJldHVybiBjID4gMyAmJiByICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgciksIHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3BhcmFtKHBhcmFtSW5kZXgsIGRlY29yYXRvcikge1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIGtleSkgeyBkZWNvcmF0b3IodGFyZ2V0LCBrZXksIHBhcmFtSW5kZXgpOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX21ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKSB7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QubWV0YWRhdGEgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIFJlZmxlY3QubWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdGVyKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xyXG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XHJcbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cclxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZ2VuZXJhdG9yKHRoaXNBcmcsIGJvZHkpIHtcclxuICAgIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7IGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsgcmV0dXJuIHRbMV07IH0sIHRyeXM6IFtdLCBvcHM6IFtdIH0sIGYsIHksIHQsIGc7XHJcbiAgICByZXR1cm4gZyA9IHsgbmV4dDogdmVyYigwKSwgXCJ0aHJvd1wiOiB2ZXJiKDEpLCBcInJldHVyblwiOiB2ZXJiKDIpIH0sIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZztcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc3RlcChvcCkge1xyXG4gICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcclxuICAgICAgICB3aGlsZSAoXykgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xyXG4gICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XHJcbiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxyXG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgdmFyIF9fY3JlYXRlQmluZGluZyA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcclxuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfSk7XHJcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XHJcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xyXG4gICAgb1trMl0gPSBtW2tdO1xyXG59KTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2V4cG9ydFN0YXIobSwgbykge1xyXG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvLCBwKSkgX19jcmVhdGVCaW5kaW5nKG8sIG0sIHApO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX192YWx1ZXMobykge1xyXG4gICAgdmFyIHMgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLml0ZXJhdG9yLCBtID0gcyAmJiBvW3NdLCBpID0gMDtcclxuICAgIGlmIChtKSByZXR1cm4gbS5jYWxsKG8pO1xyXG4gICAgaWYgKG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSByZXR1cm4ge1xyXG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcclxuICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG8gJiYgb1tpKytdLCBkb25lOiAhbyB9O1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHMgPyBcIk9iamVjdCBpcyBub3QgaXRlcmFibGUuXCIgOiBcIlN5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3JlYWQobywgbikge1xyXG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xyXG4gICAgaWYgKCFtKSByZXR1cm4gbztcclxuICAgIHZhciBpID0gbS5jYWxsKG8pLCByLCBhciA9IFtdLCBlO1xyXG4gICAgdHJ5IHtcclxuICAgICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTtcclxuICAgIH1cclxuICAgIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxyXG4gICAgZmluYWxseSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZpbmFsbHkgeyBpZiAoZSkgdGhyb3cgZS5lcnJvcjsgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWQoKSB7XHJcbiAgICBmb3IgKHZhciBhciA9IFtdLCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKylcclxuICAgICAgICBhciA9IGFyLmNvbmNhdChfX3JlYWQoYXJndW1lbnRzW2ldKSk7XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5cygpIHtcclxuICAgIGZvciAodmFyIHMgPSAwLCBpID0gMCwgaWwgPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgaWw7IGkrKykgcyArPSBhcmd1bWVudHNbaV0ubGVuZ3RoO1xyXG4gICAgZm9yICh2YXIgciA9IEFycmF5KHMpLCBrID0gMCwgaSA9IDA7IGkgPCBpbDsgaSsrKVxyXG4gICAgICAgIGZvciAodmFyIGEgPSBhcmd1bWVudHNbaV0sIGogPSAwLCBqbCA9IGEubGVuZ3RoOyBqIDwgamw7IGorKywgaysrKVxyXG4gICAgICAgICAgICByW2tdID0gYVtqXTtcclxuICAgIHJldHVybiByO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXQodikge1xyXG4gICAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBfX2F3YWl0ID8gKHRoaXMudiA9IHYsIHRoaXMpIDogbmV3IF9fYXdhaXQodik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jR2VuZXJhdG9yKHRoaXNBcmcsIF9hcmd1bWVudHMsIGdlbmVyYXRvcikge1xyXG4gICAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgIHZhciBnID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pLCBpLCBxID0gW107XHJcbiAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgaWYgKGdbbl0pIGlbbl0gPSBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKGEsIGIpIHsgcS5wdXNoKFtuLCB2LCBhLCBiXSkgPiAxIHx8IHJlc3VtZShuLCB2KTsgfSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHJlc3VtZShuLCB2KSB7IHRyeSB7IHN0ZXAoZ1tuXSh2KSk7IH0gY2F0Y2ggKGUpIHsgc2V0dGxlKHFbMF1bM10sIGUpOyB9IH1cclxuICAgIGZ1bmN0aW9uIHN0ZXAocikgeyByLnZhbHVlIGluc3RhbmNlb2YgX19hd2FpdCA/IFByb21pc2UucmVzb2x2ZShyLnZhbHVlLnYpLnRoZW4oZnVsZmlsbCwgcmVqZWN0KSA6IHNldHRsZShxWzBdWzJdLCByKTsgfVxyXG4gICAgZnVuY3Rpb24gZnVsZmlsbCh2YWx1ZSkgeyByZXN1bWUoXCJuZXh0XCIsIHZhbHVlKTsgfVxyXG4gICAgZnVuY3Rpb24gcmVqZWN0KHZhbHVlKSB7IHJlc3VtZShcInRocm93XCIsIHZhbHVlKTsgfVxyXG4gICAgZnVuY3Rpb24gc2V0dGxlKGYsIHYpIHsgaWYgKGYodiksIHEuc2hpZnQoKSwgcS5sZW5ndGgpIHJlc3VtZShxWzBdWzBdLCBxWzBdWzFdKTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0RlbGVnYXRvcihvKSB7XHJcbiAgICB2YXIgaSwgcDtcclxuICAgIHJldHVybiBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiwgZnVuY3Rpb24gKGUpIHsgdGhyb3cgZTsgfSksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4sIGYpIHsgaVtuXSA9IG9bbl0gPyBmdW5jdGlvbiAodikgeyByZXR1cm4gKHAgPSAhcCkgPyB7IHZhbHVlOiBfX2F3YWl0KG9bbl0odikpLCBkb25lOiBuID09PSBcInJldHVyblwiIH0gOiBmID8gZih2KSA6IHY7IH0gOiBmOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jVmFsdWVzKG8pIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgbSA9IG9bU3ltYm9sLmFzeW5jSXRlcmF0b3JdLCBpO1xyXG4gICAgcmV0dXJuIG0gPyBtLmNhbGwobykgOiAobyA9IHR5cGVvZiBfX3ZhbHVlcyA9PT0gXCJmdW5jdGlvblwiID8gX192YWx1ZXMobykgOiBvW1N5bWJvbC5pdGVyYXRvcl0oKSwgaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGkpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IGlbbl0gPSBvW25dICYmIGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7IHYgPSBvW25dKHYpLCBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCB2LmRvbmUsIHYudmFsdWUpOyB9KTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgZCwgdikgeyBQcm9taXNlLnJlc29sdmUodikudGhlbihmdW5jdGlvbih2KSB7IHJlc29sdmUoeyB2YWx1ZTogdiwgZG9uZTogZCB9KTsgfSwgcmVqZWN0KTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19tYWtlVGVtcGxhdGVPYmplY3QoY29va2VkLCByYXcpIHtcclxuICAgIGlmIChPYmplY3QuZGVmaW5lUHJvcGVydHkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvb2tlZCwgXCJyYXdcIiwgeyB2YWx1ZTogcmF3IH0pOyB9IGVsc2UgeyBjb29rZWQucmF3ID0gcmF3OyB9XHJcbiAgICByZXR1cm4gY29va2VkO1xyXG59O1xyXG5cclxudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xyXG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcclxuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydFN0YXIobW9kKSB7XHJcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xyXG4gICAgdmFyIHJlc3VsdCA9IHt9O1xyXG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGspO1xyXG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcclxuICAgIHJldHVybiByZXN1bHQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydERlZmF1bHQobW9kKSB7XHJcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IGRlZmF1bHQ6IG1vZCB9O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZEdldChyZWNlaXZlciwgcHJpdmF0ZU1hcCkge1xyXG4gICAgaWYgKCFwcml2YXRlTWFwLmhhcyhyZWNlaXZlcikpIHtcclxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiYXR0ZW1wdGVkIHRvIGdldCBwcml2YXRlIGZpZWxkIG9uIG5vbi1pbnN0YW5jZVwiKTtcclxuICAgIH1cclxuICAgIHJldHVybiBwcml2YXRlTWFwLmdldChyZWNlaXZlcik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHJlY2VpdmVyLCBwcml2YXRlTWFwLCB2YWx1ZSkge1xyXG4gICAgaWYgKCFwcml2YXRlTWFwLmhhcyhyZWNlaXZlcikpIHtcclxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiYXR0ZW1wdGVkIHRvIHNldCBwcml2YXRlIGZpZWxkIG9uIG5vbi1pbnN0YW5jZVwiKTtcclxuICAgIH1cclxuICAgIHByaXZhdGVNYXAuc2V0KHJlY2VpdmVyLCB2YWx1ZSk7XHJcbiAgICByZXR1cm4gdmFsdWU7XHJcbn1cclxuIiwiaW1wb3J0IHsgQXBwLCBQbHVnaW4sIE5vdGljZSwgUGx1Z2luU2V0dGluZ1RhYiwgU2V0dGluZyB9IGZyb20gJ29ic2lkaWFuJztcclxuXHJcbmNvbnN0IE9CTElRVUVfU1RSQVRFR0lFUyA9IFtcIkFiYW5kb24gbm9ybWFsIGluc3RydW1lbnRzLlwiLFwiQWNjZXB0IGFkdmljZS5cIixcIkFjY3JldGlvbi5cIixcIkEgbGluZSBoYXMgdHdvIHNpZGVzLlwiLFwiQmFsYW5jZSB0aGUgY29uc2lzdGVuY3kgcHJpbmNpcGxlIHdpdGggdGhlIGluY29uc2lzdGVuY3kgcHJpbmNpcGxlLlwiLFwiQmUgZGlydHkuXCIsXCJCcmVhdGhlIG1vcmUgZGVlcGx5LlwiLFwiQnJpZGdlcyAtYnVpbGQgLWJ1cm4uXCIsXCJDYXNjYWRlcy5cIixcIkNsdXN0ZXIgYW5hbHlzaXMuXCIsXCJDb25zaWRlciBkaWZmZXJlbnQgZmFkaW5nIHN5c3RlbXMuXCIsXCJDb3VyYWdlIVwiLFwiQ3V0IGEgdml0YWwgY29ubmVjdGlvbi5cIixcIkRlY29yYXRlLCBkZWNvcmF0ZS5cIixcIkRlZmluZSBhbiBhcmVhIGFzICdzYWZlJyBhbmQgdXNlIGl0IGFzIGFuIGFuY2hvci5cIixcIkRlc3Ryb3kgdGhlIG1vc3QgaW1wb3J0YW50IHRoaW5nLlwiLFwiRGlzY2FyZCBhbiBheGlvbS5cIixcIkRpc2Nvbm5lY3QgZnJvbSBkZXNpcmUuXCIsXCJEaXNjb3ZlciB0aGUgcmVjaXBlcyB5b3UgYXJlIHVzaW5nIGFuZCBhYmFuZG9uIHRoZW0uXCIsXCJEaXN0b3J0aW5nIHRpbWUuXCIsXCJEb24ndCBiZSBhZnJhaWQgb2YgdGhpbmdzIGJlY2F1c2UgdGhleSdyZSBlYXN5IHRvIGRvLlwiLFwiRG9uJ3QgYmUgZnJpZ2h0ZW5lZCBvZiBjbGljaGVzLlwiLFwiRG9uJ3QgYmUgZnJpZ2h0ZW5lZCB0byBkaXNwbGF5IHlvdXIgdGFsZW50cy5cIixcIkRvbid0IHN0cmVzcyBvbmUgdGhpbmcgbW9yZSB0aGFuIGFub3RoZXIuXCIsXCJEbyBzb21ldGhpbmcgYm9yaW5nLlwiLFwiRG8gdGhlIHdhc2hpbmcgdXAuXCIsXCJEbyB0aGUgd29yZHMgbmVlZCBjaGFuZ2luZz9cIixcIkRvIHdlIG5lZWQgaG9sZXM/XCIsXCJFbXBoYXNpemUgZGlmZmVyZW5jZXMuXCIsXCJFbXBoYXNpemUgcmVwZXRpdGlvbnMuXCIsXCJFbXBoYXNpemUgdGhlIGZsYXdzLlwiLFwiR2V0IHlvdXIgbmVjayBtYXNzYWdlZC5cIixcIkdpdmUgd2F5IHRvIHlvdXIgd29yc3QgaW1wdWxzZS5cIixcIkdvIHNsb3dseSBhbGwgdGhlIHdheSByb3VuZCB0aGUgb3V0c2lkZS5cIixcIkhvbm9yIHRoeSBlcnJvciBhcyBhIGhpZGRlbiBpbnRlbnRpb24uXCIsXCJIb3cgd291bGQgeW91IGhhdmUgZG9uZSBpdD9cIixcIkh1bWFuaXplIHNvbWV0aGluZyBmcmVlIG9mIGVycm9yLlwiLFwiSW5maW5pdGVzaW1hbCBncmFkYXRpb25zLlwiLFwiSW50byB0aGUgaW1wb3NzaWJsZS5cIixcIklzIGl0IGZpbmlzaGVkP1wiLFwiSXMgdGhlcmUgc29tZXRoaW5nIG1pc3Npbmc/XCIsXCJKdXN0IGNhcnJ5IG9uLlwiLFwiTGVmdCBjaGFubmVsLCByaWdodCBjaGFubmVsLCBjZW50cmUgY2hhbm5lbC5cIixcIkxvb2sgYXQgYSB2ZXJ5IHNtYWxsIG9iamVjdCwgbG9vayBhdCBpdHMgY2VudHJlLlwiLFwiTG9vayBhdCB0aGUgb3JkZXIgaW4gd2hpY2ggeW91IGRvIHRoaW5ncy5cIixcIkxvb2sgY2xvc2VseSBhdCB0aGUgbW9zdCBlbWJhcnJhc3NpbmcgZGV0YWlscyBhbmQgYW1wbGlmeSB0aGVtLlwiLFwiTWFrZSBhIGJsYW5rIHZhbHVhYmxlIGJ5IHB1dHRpbmcgaXQgaW4gYW4gZXhxdWlzaXRlIGZyYW1lLlwiLFwiTWFrZSBhbiBleGhhdXN0aXZlIGxpc3Qgb2YgZXZlcnl0aGluZyB5b3UgbWlnaHQgZG8gYW5kIGRvIHRoZSBsYXN0IHRoaW5nIG9uIHRoZSBsaXN0LlwiLFwiTWFrZSBhIHN1ZGRlbiwgZGVzdHJ1Y3RpdmUgdW5wcmVkaWN0YWJsZSBhY3Rpb247IGluY29ycG9yYXRlLlwiLFwiT25seSBvbmUgZWxlbWVudCBvZiBlYWNoIGtpbmQuXCIsXCJSZW1lbWJlciB0aG9zZSBxdWlldCBldmVuaW5ncy5cIixcIlJlbW92ZSBhbWJpZ3VpdGllcyBhbmQgY29udmVydCB0byBzcGVjaWZpY3MuXCIsXCJSZW1vdmUgc3BlY2lmaWNzIGFuZCBjb252ZXJ0IHRvIGFtYmlndWl0aWVzLlwiLFwiUmVwZXRpdGlvbiBpcyBhIGZvcm0gb2YgY2hhbmdlLlwiLFwiUmV2ZXJzZS5cIixcIlNpbXBsZSBzdWJ0cmFjdGlvbi5cIixcIlNwZWN0cnVtIGFuYWx5c2lzLlwiLFwiVGFrZSBhIGJyZWFrLlwiLFwiVGFrZSBhd2F5IHRoZSBlbGVtZW50cyBpbiBvcmRlciBvZiBhcHBhcmVudCBub24taW1wb3J0YW5jZS5cIixcIlRpZHkgdXAuXCIsXCJUdXJuIGl0IHVwc2lkZSBkb3duLlwiLFwiVHdpc3QgdGhlIHNwaW5lLlwiLFwiVXNlIGFuIG9sZCBpZGVhLlwiLFwiVXNlIGFuIHVuYWNjZXB0YWJsZSBjb2xvci5cIixcIldhdGVyLlwiLFwiV2hhdCBhcmUgeW91IHJlYWxseSB0aGlua2luZyBhYm91dCBqdXN0IG5vdz8gSW5jb3Jwb3JhdGUuXCIsXCJXaGF0IGlzIHRoZSByZWFsaXR5IG9mIHRoZSBzaXR1YXRpb24/XCIsXCJXaGF0IG1pc3Rha2VzIGRpZCB5b3UgbWFrZSBsYXN0IHRpbWU/XCIsXCJXaGF0IHdvdWxkbid0IHlvdSBkbz9cIixcIldvcmsgYXQgYSBkaWZmZXJlbnQgc3BlZWQuXCJdXHJcbmNvbnN0IENPTlZFUlNBVElPTl9TVEFSVEVSUyA9IFtcIklmIFlvdSBIYWQgVGhyZWUgV2lzaGVzLCBXaGF0IFdvdWxkIFlvdSBXaXNoIEZvcj9cIixcIldoYXQgV291bGQgWW91IFJhdGhlciBUaHJvdyBBd2F5OiBMb3ZlIE9yIE1vbmV5P1wiLFwiV2hhdCdzIFRoZSBNb3N0IEJlYXV0aWZ1bCBQbGFjZSBZb3UndmUgRXZlciBTZWVuP1wiLFwiV2hhdCBXYXMgWW91ciBGb25kZXN0IE1lbW9yeSBPZiBIaWdoIFNjaG9vbD9cIixcIldoYXQncyBZb3VyIEZhdm9yaXRlIFRWIFNob3c/XCIsXCJXaGF0J3MgVGhlIFN0cmFuZ2VzdCBUaGluZyBJbiBZb3VyIFJlZnJpZ2VyYXRvcj9cIixcIldvdWxkIFlvdSBSYXRoZXIgSGVhciBUaGUgTXVzaWMgT2YgSm9oYW5uIFNlYmFzdGlhbiBCYWNoIFBsYXllZCBCeSBBIEJhcmJlcnNob3AgUXVhcnRldCwgT3IgQSBIZWF2eSBNZXRhbCBCYW5kP1wiLFwiSGF2ZSBZb3UgRXZlciBCZWVuIFRvIEEgRml2ZSBTdGFyIFJlc29ydD9cIixcIldoYXQgV2FzIFlvdXIgRmF2b3JpdGUgVG95IEdyb3dpbmcgVXA/XCIsXCJXaGF0J3MgVGhlIEZ1bm5pZXN0IFdheSBZb3UndmUgRXZlciBCcm9rZW4gVGhlIExhdz9cIixcIldoYXQncyBZb3VyIEZhdm9yaXRlIFNwb3J0cyBUZWFtP1wiLFwiV2hhdCBUYWxlbnQgV291bGQgWW91IFdhbnQgVG8gUG9zc2VzcyBJZiBZb3UgQ291bGQ/XCIsXCJJZiBZb3UgQ291bGQgVHJhZGUgTGl2ZXMgV2l0aCBTb21lb25lLCBXaG8gV291bGQgSXQgQmU/XCIsXCJJZiBZb3UgQ291bGQgRXJhc2UgT25lIEV2ZW50IEZyb20gSGlzdG9yeSwgV2hpY2ggT25lIFdvdWxkIFlvdSBFcmFzZT9cIixcIldoYXQgV2FzIFlvdXIgRmF2b3JpdGUgVG95IEFzIEEgQ2hpbGQ/XCIsXCJXaG8gRG8gWW91IE1vc3QgTGlrZSBUbyBQb2tlIEZ1biBBdD9cIixcIklmIFlvdSBXZXJlIFN1ZGRlbmx5IFRyYW5zcG9ydGVkIFRvIEFub3RoZXIgUGxhbmV0LCBIb3cgV291bGQgWW91IEFzc2VzcyBUaGUgU2l0dWF0aW9uP1wiLFwiV2hlbiBEbyBZb3UgRmVlbCBUaGUgTW9zdCBJbiBDb250cm9sP1wiLFwiV291bGQgWW91IFJhdGhlciBIYXZlIDEwIEhvYmJpZXMgT3IgT25lIFBhc3Npb24/XCIsXCJXaGF0J3MgWW91ciBGYXZvcml0ZSBNb3ZpZT9cIixcIklmIFlvdSBDb3VsZCBJbnRlcnZpZXcgQSBGYW1vdXMgUGVyc29uLCBXaG8gV291bGQgWW91IENob29zZT9cIixcIklmIFlvdXIgRm9vZCBJcyBCYWQgQXQgQSBSZXN0YXVyYW50LCBXb3VsZCBZb3UgU2F5IFNvbWV0aGluZz9cIixcIklmIFlvdSBDb3VsZCBPbmx5IFVzZSBPbmUgV29yZCBUaGUgUmVzdCBPZiBZb3VyIExpZmUsIFdoYXQgV29yZCBXb3VsZCBZb3UgQ2hvb3NlP1wiLFwiV2hhdCBBcmUgWW91ciBEcmVhbXMgQW5kIEFtYml0aW9ucz9cIixcIllvdSd2ZSBCZWVuIEdpdmVuIEFuIEVsZXBoYW50LiBZb3UgQ2FuJ3QgR2V0IFJpZCBPZiBJdC4gV2hhdCBXb3VsZCBZb3UgRG8gV2l0aCBJdD9cIixcIldoYXQncyBUaGUgRnVubmllc3QgVGhpbmcgWW91J3ZlIFNlZW4gT24gVGhlIE5ld3M/XCIsXCJJZiBZb3UgSGFkIFRoZSBXb3JsZCdzIEF0dGVudGlvbiBGb3IgMzAgU2Vjb25kcywgV2hhdCBXb3VsZCBZb3UgU2F5P1wiLFwiSWYgWW91IENvdWxkIEJlIEJlc3QgRnJpZW5kcyBXaXRoIEEgQ2VsZWJyaXR5LCBXaG8gV291bGQgSXQgQmU/XCIsXCJJZiBZb3UgV2VyZSBUbyBQbGF5IEEgU29uZyBZb3UgTG92ZSBSaWdodCBOb3csIFdoYXQgV291bGQgSXQgQmU/XCIsXCJXb3VsZCBZb3UgUmF0aGVyIExvb2sgTGlrZSBBIFBvdGF0bywgT3IgRmVlbCBMaWtlIEEgUG90YXRvP1wiLFwiV2hhdCBXb3VsZCBZb3UgRG8gV2l0aCAxMCBNaWxsaW9uIERvbGxhcnM/XCIsXCJIb3cgQ2FuIFlvdSBUZWxsIElmIFNvbWVvbmUgSGFzIEEgU2Vuc2UgT2YgSHVtb3I/XCIsXCJJZiBZb3UgV2VyZSBUbyBOYW1lIFlvdXIgT3duIFNvbmcsIFdoYXQgV291bGQgWW91IE5hbWUgSXQ/XCIsXCJJZiBZb3UgV2VyZSBJbiBBIFJvb20gRmlsbGVkIFdpdGggWW91IEFuZCBZb3VyIERvcHBlbGdhbmdlciBBbmQgMiBNaWxsaW9uIERvbGxhcnMsIFdoYXQgV291bGQgWW91IERvP1wiLFwiV2hhdCBJcyBJbiBZb3VyIEZyaWRnZSBSaWdodCBOb3c/XCIsXCJXaGF0IEhhdmUgWW91IExlYXJuZWQgQWJvdXQgTGlmZSBGcm9tIEtpZHM/XCIsXCJIb3cgV291bGQgWW91IFdhbnQgVG8gQmUgUmVtZW1iZXJlZD9cIixcIldoYXQgRG8gWW91IEhvcGUgWW91ciBEZWNlYXNlZCBSZWxhdGl2ZSBXb3VsZCBTYXkgQWJvdXQgWW91IElmIFRoZXkgU2F3IFlvdSBOb3c/XCIsXCJJZiBZb3UgQ291bGQgQ2hhbmdlIFlvdXIgTmFtZSwgV2hhdCBXb3VsZCBZb3UgQ2hhbmdlIEl0IFRvP1wiLFwiV2hhdCdzIFRoZSBTdHJhbmdlc3QgVGhpbmcgVGhhdCBZb3UndmUgRXZlciBGYWxsZW4gSW4gTG92ZSBXaXRoP1wiLFwiSWYgWW91IENvdWxkIEhhdmUgQW55IFN1cGVyIFBvd2VyLCBXaGljaCBPbmUgV291bGQgWW91IENob29zZT9cIixcIklmIFlvdSBXZXJlIEludml0ZWQgVG8gQXR0ZW5kIEhvZ3dhcnRzLCBXaGljaCBIb2d3YXJ0cyBIb3VzZSBXb3VsZCBZb3UgQ2hvb3NlP1wiLFwiV2hhdCBXZXJlIFRoZSBIaWdobGlnaHRzIE9mIFlvdXIgQ2hpbGRob29kP1wiLFwiSGF2ZSBZb3UgRXZlciBLZXB0IEEgU2VjcmV0IEZvciBNb3JlIFRoYW4gQSBEZWNhZGU/XCIsXCJXaGF0J3MgVGhlIE1vc3QgSW1wb3J0YW50IFRoaW5nIFlvdSd2ZSBMZWFybmVkIEZyb20gQSBDZWxlYnJpdHk/XCIsXCJEbyBZb3UgQ2FyZSBBYm91dCBSZXZpZXdzP1wiLFwiV2hhdCBXb3VsZCBCZSBUaGUgUGVyZmVjdCBDcmltZT9cIixcIldoYXQncyBUaGUgU3R1cGlkZXN0IFRoaW5nIFlvdSd2ZSBFdmVyIERvbmU/XCIsXCJTcG9udGFuZWl0eSBPciBTdGFiaWxpdHk/XCIsXCJXaGF0J3MgVGhlIEZ1bm5pZXN0IE1vdmllIFlvdSd2ZSBFdmVyIFNlZW4/XCIsXCJXaGVuIERpZCBZb3UgTGFzdCBNZWV0IEEgU3RyYW5nZXIgWW91IFRob3VnaHQgWW91J2QgTmV2ZXIgTWVldCBBZ2Fpbj9cIixcIkRvIFlvdSBTYXZlIE9yIFNwZW5kP1wiLFwiSG93IE11Y2ggRG9lcyBUaGUgQW1vdW50IE9mIFRyYWZmaWMgQWZmZWN0IFlvdXIgTW9vZD9cIixcIklmIFlvdSBIYWQgVG8gQ2hvb3NlIE9uZSBBbmltYWwgVG8gSGF2ZSBBcyBBIFBldCwgV2hpY2ggQW5pbWFsIFdvdWxkIFlvdSBDaG9vc2U/XCIsXCJXaGF0J3MgWW91ciBXb3JzdCBIYWJpdD9cIixcIkRvIHRoZXkgbGlrZSB0byB0YWtlIGEgc3RhbmQgb3IganVzdCBsZXQgdGhpbmdzIGdvP1wiLFwiV2hhdCdzIFlvdXIgRmF2b3JpdGUgU29uZz9cIixcIkhvdyBEbyBZb3UgVGhpbmsgVGhlIFdvcmxkIFdvdWxkIEJlIERpZmZlcmVudCBJZiBCYW5hbmFzIFdlcmUgSWxsZWdhbD9cIixcIldvdWxkIFlvdSBSYXRoZXIgQmUgQWJsZSBUbyBDb250cm9sIFRpbWUsIE9yIEJlIEFibGUgVG8gS25vdyBXaGF0IE90aGVyIFBlb3BsZSBBcmUgVGhpbmtpbmc/XCIsXCJJcyBJdCBEaWZmaWN1bHQgVG8gRG8gV2hhdCBZb3UgRG8/XCIsXCJXaG8gSXMgWW91ciBGYXZvcml0ZSBDZWxlYnJpdHk/XCIsXCJJZiBZb3UgRm91bmQgJDIsMDAwIE9uIFRoZSBHcm91bmQsIFdoYXQgV291bGQgWW91IERvIFdpdGggSXQ/XCIsXCJXaGF0J3MgWW91ciBGYXZvcml0ZSBQaXp6YSBUb3BwaW5nP1wiLFwiV2hhdCBXb3VsZCBZb3UgRG8gSWYgWW91IENvdWxkIFBvc3Nlc3MgVGhlIEFiaWxpdGllcyBPZiBZb3VyIERvZz9cIixcIldoYXQncyBUaGUgU21hcnRlc3QgVGhpbmcgWW91J3ZlIEV2ZXIgRG9uZT9cIl1cclxuY29uc3QgRkxBU0hfRklDVElPTl9QQUNLID0ge1widmFyaWFibGUxTmFtZVwiOlwiV09SRFwiLFwidmFyaWFibGUxVmFsdWVzXCI6XCJhY2NvdW50XFxubWlkZGxlXFxuYWN0XFxubWlsa1xcbmFkanVzdG1lbnRcXG5taW5kXFxubWluZVxcbmFncmVlbWVudFxcbm1pbnV0ZVxcbmFpclxcbm1pc3RcXG5hbW91bnRcXG5hbXVzZW1lbnRcXG5tb250aFxcbmFuaW1hbFxcbm1vcm5pbmdcXG5hbnN3ZXJcXG5tb3RoZXJcXG5hcHBhcmF0dXNcXG5tb3Rpb25cXG5hcHByb3ZhbFxcbm1vdW50YWluXFxuYXJndW1lbnRcXG5tb3ZlXFxuYXJ0XFxubXVzaWNcXG5hdHRhY2tcXG5uYW1lXFxuYXR0ZW1wdFxcbm5hdGlvblxcbmF0dGVudGlvblxcbm5lZWRcXG5hdHRyYWN0aW9uXFxubmV3c1xcbmF1dGhvcml0eVxcbm5pZ2h0XFxuYmFja1xcbm5vaXNlXFxuYmFsYW5jZVxcbm5vdGVcXG5BbWFyYW50aFxcbkFtYmVyXFxuQW1ldGh5c3RcXG5BcHJpY290XFxuQXF1YVxcbkFxdWFtYXJpbmVcXG5Bc3BhcmFndXNcXG5BdWJ1cm5cXG5BenVyZVxcbkJlaWdlXFxuQmlzdHJlXFxuQmxhY2tcXG5CbHVlXFxuQnJhc3NcXG5Ccm9uemVcXG5Ccm93blxcbkJ1ZmZcXG5CdXJndW5keVxcbkNhbW91ZmxhZ2VcXG5DYXJkaW5hbFxcbkNhcm1pbmVcXG5DYXJyb3RcXG5DZWxhZG9uXFxuQ2VyaXNlXFxuQ2VydWxlYW5cXG5DaGFtcGFnbmVcXG5DaGFyY29hbFxcbkNoYXJ0cmV1c2VcXG5DaGVycnlcXG5DaGVzdG51dFxcbkNob2NvbGF0ZVxcbkNpbm5hYmFyXFxuQ2lubmFtb25cXG5Db2JhbHRcXG5Db3BwZXJcXG5Db3JhbFxcbkNvcm5cXG5Db3JuZmxvd2VyXFxuQ3JlYW1cXG5Dcmltc29uXFxuQ3lhblxcbkVtZXJhbGRcXG5FZ2dwbGFudFxcbkZsYXhcXG5GcmVuY2ggUm9zZVxcbkdvbGRcXG5Hb2xkZW5yb2RcXG5HcmVlblxcbkdyZXlcXG5JbmRpZ29cXG5Jdm9yeVxcbkphZGVcXG5LaGFraVxcbkxhdmVuZGVyXFxuTGVtb25cXG5MaWxhY1xcbkxpbWVcXG5MaW5lblxcbk1hZ2VudGFcXG5NYWdub2xpYVxcbk1hbGFjaGl0ZVxcbk1hcm9vblxcbk1hdXZlXFxuTXVzdGFyZFxcbk15cnRsZVxcbk5hdnlcXG5PY2hyZVxcbk9saXZlXFxuT3JhbmdlXFxuT3JjaGlkXFxuUGVhY2hcXG5QZWFyXFxuUGVyaXdpbmtsZVxcblBlcnNpbW1vblxcblBpbmUgR3JlZW5cXG5QaW5rXFxuUGxhdGludW1cXG5QbHVtXFxuUHVtcGtpblxcblB1cnBsZVxcblF1YXJ0elxcblJhdyB1bWJlclxcblJvc2VcXG5SdWJ5XFxuUnVzc2V0XFxuUnVzdFxcblNhZmZyb25cXG5TYWxtb25cXG5TYW5keSBicm93blxcblNhbmdyaWFcXG5TYXBwaGlyZVxcblNjYXJsZXRcXG5TZWFzaGVsbFxcblNlcGlhXFxuU2xhdGVcXG5TaWx2ZXJcXG5UYW5cXG5UYW5nZXJpbmVcXG5UYXVwZVxcblRlYWxcXG5UYXdueVxcblRlcnJhIGNvdHRhXFxuVGhpc3RsZVxcblRvbWF0b1xcblR1cnF1b2lzZVxcblVsdHJhbWFyaW5lXFxuVmVybWlsaW9uXFxuVmlvbGV0XFxuVmlyaWRpYW5cXG5XaGVhdFxcbldoaXRlXFxuV2lzdGVyaWFcXG5YYW50aGljXFxuWWVsbG93XFxuWnVjY2hpbmlcXG5iYXNlXFxubnVtYmVyXFxuYmVoYXZpb3JcXG5vYnNlcnZhdGlvblxcbmJlbGllZlxcbm9mZmVyXFxuYmlydGhcXG5vaWxcXG5iaXRcXG5vcGVyYXRpb25cXG5iaXRlXFxub3BpbmlvblxcbmJsb29kXFxub3JkZXJcXG5ibG93XFxub3JnYW5pemF0aW9uXFxuYm9keVxcbm9ybmFtZW50XFxuYnJhc3NcXG5vd25lclxcbmJyZWFkXFxucGFnZVxcbmJyZWF0aFxcbnBhaW5cXG5icm90aGVyXFxucGFpbnRcXG5idWlsZGluZ1xcbnBhcGVyXFxuYnVyblxcbnBhcnRcXG5idXJzdFxcbnBhc3RlXFxuYnVzaW5lc3NcXG5wYXltZW50XFxuYnV0dGVyXFxucGVhY2VcXG5jYW52YXNcXG5wZXJzb25cXG5jYXJlXFxucGxhY2VcXG5jYXVzZVxcbnBsYW50XFxuY2hhbGtcXG5wbGF5XFxuY2hhbmNlXFxucGxlYXN1cmVcXG5jaGFuZ2VcXG5wb2ludFxcbmNsb3RoXFxucG9pc29uXFxuY29hbFxcbnBvbGlzaFxcbmNvbG9yXFxucG9ydGVyXFxuY29tZm9ydFxcbnBvc2l0aW9uXFxuY29tbWl0dGVlXFxucG93ZGVyXFxuY29tcGFueVxcbnBvd2VyXFxuY29tcGFyaXNvblxcbnByaWNlXFxuY29tcGV0aXRpb25cXG5wcmludFxcbmNvbmRpdGlvblxcbnByb2Nlc3NcXG5jb25uZWN0aW9uXFxucHJvZHVjZVxcbmNvbnRyb2xcXG5wcm9maXRcXG5jb29rXFxucHJvcGVydHlcXG5jb3BwZXJcXG5wcm9zZVxcbmNvcHlcXG5wcm90ZXN0XFxuY29ya1xcbnB1bGxcXG5jb3B5XFxucHVuaXNobWVudFxcbmNvdWdoXFxucHVycG9zZVxcbmNvdW50cnlcXG5wdXNoXFxuY292ZXJcXG5xdWFsaXR5XFxuY3JhY2tcXG5xdWVzdGlvblxcbmNyZWRpdFxcbnJhaW5cXG5jcmltZVxcbnJhbmdlXFxuY3J1c2hcXG5yYXRlXFxuY3J5XFxucmF5XFxuY3VycmVudFxcbnJlYWN0aW9uXFxuY3VydmVcXG5yZWFkaW5nXFxuZGFtYWdlXFxucmVhc29uXFxuZGFuZ2VyXFxucmVjb3JkXFxuZGF1Z2h0ZXJcXG5yZWdyZXRcXG5kYXlcXG5yZWxhdGlvblxcbmRlYXRoXFxucmVsaWdpb25cXG5kZWJ0XFxucmVwcmVzZW50YXRpdmVcXG5kZWNpc2lvblxcbnJlcXVlc3RcXG5kZWdyZWVcXG5yZXNwZWN0XFxuZGVzaWduXFxucmVzdFxcbmRlc2lyZVxcbnJld2FyZFxcbmRlc3RydWN0aW9uXFxucmh5dGhtXFxuZGV0YWlsXFxucmljZVxcbmRldmVsb3BtZW50XFxucml2ZXJcXG5kaWdlc3Rpb25cXG5yb2FkXFxuZGlyZWN0aW9uXFxucm9sbFxcbmRpc2NvdmVyeVxcbnJvb21cXG5kaXNjdXNzaW9uXFxucnViXFxuZGlzZWFzZVxcbnJ1bGVcXG5kaXNndXN0XFxucnVuXFxuZGlzdGFuY2VcXG5zYWx0XFxuZGlzdHJpYnV0aW9uXFxuc2FuZFxcbmRpdmlzaW9uXFxuc2NhbGVcXG5kb3VidFxcbnNjaWVuY2VcXG5kcmlua1xcbnNlYVxcbmRyaXZpbmdcXG5zZWF0XFxuZHVzdFxcbnNlY3JldGFyeVxcbmVhcnRoXFxuc2VsZWN0aW9uXFxuZWRnZVxcbnNlbGZcXG5lZHVjYXRpb25cXG5zZW5zZVxcbmVmZmVjdFxcbnNlcnZhbnRcXG5lbmRcXG5lcnJvclxcbnNoYWRlXFxuZXZlbnRcXG5zaGFrZVxcbmV4YW1wbGVcXG5zaGFtZVxcbmV4Y2hhbmdlXFxuc2hvY2tcXG5leGlzdGVuY2VcXG5zaWRlXFxuZXhwYW5zaW9uXFxuc2lnblxcbmV4cGVyaWVuY2VcXG5zaWxrXFxuZXhwZXJ0XFxuc2lsdmVyXFxuZmFjdFxcbnNpc3RlclxcbmZhbGxcXG5zaXplXFxuZmFtaWx5XFxuc2t5XFxuZmF0aGVyXFxuc2xlZXBcXG5mZWFyXFxuc2xpcFxcbmZlZWxpbmdcXG5zbG9wZVxcbmZpY3Rpb25cXG5zbWFzaFxcbmZpZWxkXFxuc21lbGxcXG5maWdodFxcbnNtaWxlXFxuZmlyZVxcbnNtb2tlXFxuZmxhbWVcXG5zbmVlemVcXG5mbGlnaHRcXG5zbm93XFxuZmxvd2VyXFxuc29hcFxcbmZvbGRcXG5zb2NpZXR5XFxuZm9vZFxcbnNvblxcbmZvcmNlXFxuc29uZ1xcbmZvcm1cXG5zb3J0XFxuZnJpZW5kXFxuc291bmRcXG5mcm9udFxcbnNvdXBcXG5mcnVpdFxcbnNwYWNlXFxuZ2xhc3NcXG5zdGFnZVxcbmdvbGRcXG5zdGFydFxcbmdvdmVybm1lbnRcXG5zdGF0ZW1lbnRcXG5ncmFpblxcbnN0ZWFtXFxuZ3Jhc3NcXG5zdGVlbFxcbmdyaXBcXG5zdGVwXFxuZ3JvdXBcXG5zdGl0Y2hcXG5ncm93dGhcXG5zdG9uZVxcbmd1aWRlXFxuc3RvcFxcbmhhcmJvclxcbnN0b3J5XFxuaGFybW9ueVxcbnN0cmV0Y2hcXG5oYXRlXFxuc3RydWN0dXJlXFxuaGVhcmluZ1xcbnN1YnN0YW5jZVxcbmhlYXRcXG5zdWdhclxcbmhlbHBcXG5zdWdnZXN0aW9uXFxuaGlzdG9yeVxcbnN1bW1lclxcbmhvbGVcXG5zdXBwb3J0XFxuaG9wZVxcbnN1cnByaXNlXFxuaG91clxcbnN3aW1cXG5odW1vclxcbnN5c3RlbVxcbmljZVxcbnRhbGtcXG5pZGVhXFxudGFzdGVcXG5pbXB1bHNlXFxudGF4XFxuaW5jcmVhc2VcXG50ZWFjaGluZ1xcbmluZHVzdHJ5XFxudGVuZGVuY3lcXG5pbmtcXG50ZXN0XFxuaW5zZWN0XFxudGhlb3J5XFxuaW5zdHJ1bWVudFxcbnRoaW5nXFxuaW5zdXJhbmNlXFxudGhvdWdodFxcbmludGVyZXN0XFxudGh1bmRlclxcbmludmVudGlvblxcbnRpbWVcXG5pcm9uXFxudGluXFxuamVsbHlcXG50b3BcXG5qb2luXFxudG91Y2hcXG5qb3VybmV5XFxudHJhZGVcXG5qdWRnZVxcbnRyYW5zcG9ydFxcbmp1bXBcXG50cmlja1xcbmtpY2tcXG50cm91YmxlXFxua2lzc1xcbnR1cm5cXG5rbm93bGVkZ2VcXG50d2lzdFxcbmxhbmRcXG51bml0XFxubGFuZ3VhZ2VcXG51c2VcXG5sYXVnaFxcbnZhbHVlXFxubG93XFxudmVyc2VcXG5sZWFkXFxudmVzc2VsXFxubGVhcm5pbmdcXG52aWV3XFxubGVhdGhlclxcbnZvaWNlXFxubGV0dGVyXFxud2Fsa1xcbmxldmVsXFxud2FyXFxubGlmdFxcbndhc2hcXG5saWdodFxcbndhc3RlXFxubGltaXRcXG53YXRlclxcbmxpbmVuXFxud2F2ZVxcbmxpcXVpZFxcbndheFxcbmxpc3RcXG53YXlcXG5sb29rXFxud2VhdGhlclxcbmxvc3NcXG53ZWVrXFxubG92ZVxcbndlaWdodFxcbm1hY2hpbmVcXG53aW5kXFxubWFuXFxud2luZVxcbm1hbmFnZXJcXG53aW50ZXJcXG5tYXJrXFxud29tYW5cXG5tYXJrZXRcXG53b29kXFxubWFzc1xcbndvb2xcXG5tZWFsXFxud29yZFxcbm1lYXN1cmVcXG53b3JrXFxubWVhdFxcbndvdW5kXFxubWVldGluZ1xcbndyaXRpbmdcXG5tZW1vcnlcXG55ZWFyXFxubWV0YWxcXG53b3JtXFxuYW5nbGVcXG5rbmVlXFxuYW50XFxua25pZmVcXG5hcHBsZVxcbmtub3RcXG5hcmNoXFxubGVhZlxcbmFybVxcbmxlZ1xcbmFybXlcXG5saWJyYXJ5XFxuYmFieVxcbmxpbmVcXG5iYWdcXG5saXBcXG5iYWxsXFxubG9ja1xcbmJhbmRcXG5tYXBcXG5iYXNpblxcbm1hdGNoXFxuYmFza2V0XFxubW9ua2V5XFxuYmF0aFxcbm1vb25cXG5iZWRcXG5tb3V0aFxcbmJlZVxcbm11c2NsZVxcbmJlbGxcXG5uYWlsXFxuYmVycnlcXG5uZWNrXFxuYmlyZFxcbm5lZWRsZVxcbmJsYWRlXFxubmVydmVcXG5ib2FyZFxcbm5ldFxcbmJvYXRcXG5ub3NlXFxuYm9uZVxcbm51dFxcbmJvb2tcXG5vZmZpY2VcXG5ib290XFxub3JhbmdlXFxuYm90dGxlXFxub3ZlblxcbmJveFxcbnBhcmNlbFxcbmJveVxcbnBlblxcbmJyYWluXFxucGVuY2lsXFxuYnJha2VcXG5waWN0dXJlXFxuYnJhbmNoXFxucGlnXFxuYnJpY2tcXG5waW5cXG5icmlkZ2VcXG5waXBlXFxuYnJ1c2hcXG5wbGFuZVxcbmJ1Y2tldFxcbnBsYXRlXFxuYnVsYlxcbnBsb3VnaFxcbmJ1dHRvblxcbnBvY2tldFxcbmNha2VcXG5wb3RcXG5jYW1lcmFcXG5wb3RhdG9cXG5jYXJkXFxucHJpc29uXFxuY2FycmlhZ2VcXG5wdW1wXFxuY2FydFxcbnJhaWxcXG5jYXRcXG5yYXRcXG5jaGFpblxcbnJlY2VpcHRcXG5jaGVlc2VcXG5yaW5nXFxuY2hlc3NcXG5yb2RcXG5jaGluXFxucm9vZlxcbmNodXJjaFxcbnJvb3RcXG5jaXJjbGVcXG5zYWlsXFxuY2xvY2tcXG5zY2hvb2xcXG5jbG91ZFxcbnNjaXNzb3JzXFxuY29hdFxcbnNjcmV3XFxuY29sbGFyXFxuc2VlZFxcbmNvbWJcXG5zaGVlcFxcbmNvcmRcXG5zaGVsZlxcbmNvd1xcbnNoaXBcXG5jdXBcXG5zaGlydFxcbmN1cnRhaW5cXG5zaG9lXFxuY3VzaGlvblxcbnNraW5cXG5kb2dcXG5za2lydFxcbmRvb3JcXG5zbmFrZVxcbmRyYWluXFxuc29ja1xcbmRyYXdlclxcbnNwYWRlXFxuZHJlc3NcXG5zcG9uZ2VcXG5kcm9wXFxuc3Bvb25cXG5lYXJcXG5zcHJpbmdcXG5lZ2dcXG5zcXVhcmVcXG5lbmdpbmVcXG5zdGFtcFxcbmV5ZVxcbnN0YXJcXG5mYWNlXFxuc3RhdGlvblxcbmZhcm1cXG5zdGVtXFxuZmVhdGhlclxcbnN0aWNrXFxuZmluZ2VyXFxuc3RvY2tpbmdcXG5maXNoXFxuc3RvbWFjaFxcbmZsYWdcXG5zdG9yZVxcbmZsb29yXFxuc3RyZWV0XFxuZmx5XFxuc3VuXFxuZm9vdFxcbnRhYmxlXFxuZm9ya1xcbnRhaWxcXG5mb3dsXFxudGhyZWFkXFxuZnJhbWVcXG50aHJvYXRcXG5nYXJkZW5cXG50aHVtYlxcbmdpcmxcXG50aWNrZXRcXG5nbG92ZVxcbnRvZVxcbmdvYXRcXG50b25ndWVcXG5ndW5cXG50b290aFxcbmhhaXJcXG50b3duXFxuaGFtbWVyXFxudHJhaW5cXG5oYW5kXFxudHJheVxcbmhhdFxcbnRyZWVcXG5oZWFkXFxudHJvdXNlcnNcXG5oZWFydFxcbnVtYnJlbGxhXFxuaG9va1xcbndhbGxcXG5ob3JuXFxud2F0Y2hcXG5ob3JzZVxcbndoZWVsXFxuaG9zcGl0YWxcXG53aGlwXFxuaG91c2VcXG53aGlzdGxlXFxuaXNsYW5kXFxud2luZG93XFxuamV3ZWxcXG53aW5nXFxua2V0dGxlXFxud2lyZVxcbmtleVwiLFwidmFyaWFibGUyTmFtZVwiOlwiTEVUVEVSXCIsXCJ2YXJpYWJsZTJWYWx1ZXNcIjpcImFcXG5iXFxuY1xcbmRcXG5lXFxuZlxcbmdcXG5oXFxuaVxcbmpcXG5rXFxubFxcbm1cXG5uXFxub1xcbnBcXG5xXFxuclxcbnNcXG50XFxudVxcbnZcXG53XFxueFxcbnlcXG56XCIsXCJ2YXJpYWJsZTNOYW1lXCI6XCJDSEFSQUNURVJcIixcInZhcmlhYmxlM1ZhbHVlc1wiOlwiQW50aHJvcG9tb3JwaGljIFBlcnNvbmlmaWNhdGlvblxcbkFudGktSGVyb1xcblRoZSBBcmNobWFnZVxcbkF1ZGllbmNlIFN1cnJvZ2F0ZVxcbkJhcmVmb290IFNhZ2VcXG5CbGluZCBTZWVyXFxuQmx1ZS1Db2xsYXIgV2FybG9ja1xcbkJydWlzZXIgd2l0aCBhIFNvZnQgQ2VudGVyXFxuVGhlIENob3NlbiBPbmVcXG5UaGUgQ2hvb3NlciBvZiBUaGUgT25lXFxuQ2xhc3NpY2FsIEh1bnRlclxcbkNsYXNzaWMgVmlsbGFpblxcblRoZSBDeW5pY1xcblRoZSBEcmFnb25zbGF5ZXJcXG5UaGUgRHJ1bmtlbiBTYWlsb3JcXG5EdW1iIE11c2NsZVxcbkVjY2VudHJpYyBNZW50b3JcXG5FdmlsIE92ZXJsb3JkXFxuVGhlIEZhaXIgRm9sa1xcbkZhbHNlIFByb3BoZXRcXG5UaGUgRmVycnltYW5cXG5UaGUgRm9vbFxcbkZvb2wgZm9yIExvdmVcXG5HZW50bGUgR2lhbnRcXG5UaGUgR29vZCBLaW5nXFxuSGVyYWxkXFxuVGhlIEhlcm9cXG5IZXJvaWMgV2FubmFiZVxcbkhpZ2hlciBTZWxmXFxuSHVudGVyIG9mIE1vbnN0ZXJzXFxuVGhlIElkZWFsaXN0XFxuSW5lZmZlY3R1YWwgTG9uZXJcXG5UaGUgS2x1dHpcXG5LbmlnaHQgaW4gU2hpbmluZyBBcm1vclxcbkxhZHkgYW5kIEtuaWdodFxcbkxvdmFibGUgUm9ndWVcXG5NYWRvbm5hIEFyY2hldHlwZVxcblRoZSBNY0NveVxcbk1lbnRvciBBcmNoZXR5cGVcXG5NZXNzaWFoIEZpZ3VyZVxcbk1vY2sgTWlsbGlvbmFpcmVcXG5Nb2Rlcm4gTWFqb3IgR2VuZXJhbFxcbk1vc2VzIEFyY2hldHlwZVxcbk15IEdpcmwgQmFjayBIb21lXFxuT2JzdHJ1Y3RpdmUgQnVyZWF1Y3JhdFxcbk9sZCBTb2xkaWVyXFxuVGhlIFBhbGFkaW5cXG5UaGUgUGFyYWdvblxcblRoZSBQYXRyaWFyY2hcXG5QZXJzb24gb2YgTWFzcyBEZXN0cnVjdGlvblxcblByaW5jZSBDaGFybWluZ1xcblJlYmVsIExlYWRlclxcblJlYmVsbGlvdXMgU3Bpcml0XFxuUmVsdWN0YW50IE1vbnN0ZXJcXG5TZWVrZXIgQXJjaGV0eXBlXFxuU2lkZWtpY2tcXG5UaGUgU29jaW9wYXRoXFxuU3Rhci1Dcm9zc2VkIExvdmVyc1xcblRoZSBTdG9yeXRlbGxlclxcblR1cm4gQ29hdFxcblRoZSBUcmlja3N0ZXJcXG5XaWNrZWQgU3RlcG1vdGhlclxcbldpY2tlZCBXaXRjaFxcbldvbGYgTWFuXFxuV29ybGQncyBCZXN0IFdhcnJpb3JcXG5Xb3JsZCdzIE1vc3QgQmVhdXRpZnVsIFdvbWFuXFxuV29ybGQncyBTdHJvbmdlc3QgTWFuXFxuQWJzZW50LU1pbmRlZCBQcm9mZXNzb3JcXG5UaGUgYmVsaWV2ZXJcXG5UaGUgc2tlcHRpY1xcbkFuZ3J5IENoZWZcXG5BbnRhZ29uaXN0aWMgR292ZXJub3JcXG5BbnRocm9wb21vcnBoaWMgQW5pbWFsXFxuQmFkIEJvc3NcXG5CYWRhc3MgTm9ybWFsXFxuQmFyYmFyaWFuIFRyaWJlXFxuVGhlIEJhcmJlclxcblRoZSBCYXJkXFxuVGhlIEJhcnRlbmRlclxcbkJhdHRsZSBCdXRsZXJcXG5CZW5ldm9sZW50IFByZWN1cnNvcnNcXG5UaGUgQmVyc2Vya2VyXFxuVGhlIEJpZyBCYWQgV29sZlxcbkJpZyBFYXRlclxcbkJsb29kIEtuaWdodFxcbkJvdW50eSBIdW50ZXJcXG5CcmlkZXppbGxhXFxuQnVtYmxpbmcgRGFkXFxuQnVtYmxpbmcgU2lkZWtpY2tcXG5JbnNhbmUgUnVsZXJcXG5UaGUgQ2FyZSBUYWtlclxcblRoZSBDaGFybWVyXFxuQ2hhdHR5IEhhaXJkcmVzc2VyXFxuQ2hpY2sgTWFnbmV0XFxuQ2hpbGRob29kIEZyaWVuZFxcbkNoaXZhbHJvdXMgUGVydmVydFxcbkNodXJjaCBNaWxpdGFudFxcbkNpdHkgTW91c2VcXG5DbGFzcyBDbG93blxcbkNvbnRyb2wgRnJlYWtcXG5Db3JydXB0IENvcnBvcmF0ZSBFeGVjdXRpdmVcXG5Db3NtaWMgUGxheXRoaW5nXFxuQ293Ym95IENvcFxcbkNyYW5reSBMYW5kbG9yZFxcbkNyYW5reSBOZWlnaGJvclxcbkNyb29rZWQgQ29udHJhY3RvclxcbkNyb3NzZHJlc3NlclxcbkNyb3VjaGluZyBNb3JvbiwgSGlkZGVuIEJhZGFzc1xcbkRhZCB0aGUgVmV0ZXJhblxcbkRhbXNlbCBFcnJhbnRcXG5EYXJrIE1lc3NpYWhcXG5EYXJrLVNraW5uZWQgUmVkaGVhZFxcbkRhc2hpbmcgSGlzcGFuaWNcXG5EZWF0aCBTZWVrZXJcXG5EZWNlcHRpdmUgRGlzY2lwbGVcXG5EZWZlY3RvciBmcm9tIERlY2FkZW5jZVxcbkRlZnJvc3RpbmcgSWNlIFF1ZWVuXFxuRGVyYW5nZWQgVGF4aSBEcml2ZXJcXG5EZXRlcm1pbmF0b3JcXG5EZXRlcm1pbmVkIFdpZG93XFxuRGlydHkgQ293YXJkXFxuVGhlIERpdHpcXG5CcmFpbmxlc3MgQmVhdXR5XFxuR2VuaXVzIERpdHpcXG5JZGlvdCBTYXZhbnRcXG5VcHBlci1DbGFzcyBUd2l0XFxuRHVtYiBNdXNjbGVcXG5Eb2dnZWQgTmljZSBHdXlcXG5Eb3RpbmcgUGFyZW50XFxuRG91YmxlIEFnZW50XFxuRHJlYW0gUGVvcGxlXFxuRHJpbGwgU2VyZ2VhbnQgTmFzdHlcXG5UaGUgRnJpZW5kbHkgTGFuZGxvcmRcXG5Eci4gSmVya1xcbldvcmtpbmctY2xhc3MgaG9vbGlnYW5cXG5UaGUgRWV5b3JlXFxuRWxlZ2FudCBDbGFzc2ljYWwgTXVzaWNpYW5cXG5FbmlnbWF0aWMgRW1wb3dlcmluZyBFbnRpdHlcXG5FcnVkaXRlIFN0b25lclxcbkV0aG5pYyBNYWdpY2lhblxcblRoZSBFdmVyeW1hblxcbkV2aWwgTWF0cmlhcmNoXFxuRmFjZSBvZiBhIFRodWdcXG5GYWxzZSBQcm9waGV0XFxuRmFybWVyJ3MgRGF1Z2h0ZXJcXG5GZW1tZSBGYXRhbGVcXG5UaGUgRmlnaHRpbmcgTmFyY2lzc2lzdFxcblRoZSBGbGFwcGVyXFxuRm9yZXN0IFJhbmdlclxcbkdhZGdldGVlciBHZW5pdXNcXG5HaXJsIE5leHQgRG9vclxcbkdsb3J5IEhvdW5kXFxuR2xvcnkgU2Vla2VyXFxuR29sZCBEaWdnZXJcXG5CZWF1dGlmdWwgRm9yZWlnbmVyXFxuR3JhbmRlIERhbWVcXG5Hcm91cGllXFxuR3VpbGUgSGVyb1xcbkhhbmRzb21lIExlY2hcXG5IYWxmLUh1bWFuIEh5YnJpZFxcbkhhbGYtSWRlbnRpY2FsIFR3aW5zXFxuSGFsZi1XaXR0ZWQgSGlsbGJpbGx5XFxuSGFyZGJvaWxlZCBEZXRlY3RpdmVcXG5IZWFkLVR1cm5pbmcgQmVhdXR5XFxuSGVhdmVuIFNlZWtlclxcbkhlbGwgU2Vla2VyXFxuSGVhdnkgU2xlZXBlclxcblllIE9sZGUgSGVybWl0XFxuSG9uZXN0IEpvaG4ncyBEZWFsZXJzaGlwXFxuSG91c2UgSHVzYmFuZFxcbkh1bWFuIFdlYXBvblxcbklnbm9yYW50IG9mIFRoZWlyIE93biBJZ25vcmFuY2VcXG5NYWQgU2NpZW50aXN0J3MgSGVscGVyXFxuVGhlIEluZm9ybWFudFxcbkludHJlcGlkIE1lcmNoYW50XFxuS2lkIEhlcm9cXG5LaW5kbHkgSG91c2VrZWVwZXJcXG5UaGUgS2x1dHpcXG5LbmlnaHQgaW4gU2hpbmluZyBBcm1vclxcbktub3ctTm90aGluZyBLbm93LUl0LUFsbFxcbkxldGhhbCBDaGVmXFxuTGl0ZXJhbC1NaW5kZWRcXG5MaXR0bGUgSmltbXlcXG5MaXZpbmcgTGVnZW5kXFxuTG9vbnkgRmFuXFxuTG93ZXItQ2xhc3MgTG91dFxcbk1hZCBTY2llbnRpc3RcXG5NYXN0ZXIgU3dvcmRzbWFuXFxuQm9hc3RmdWwgQ293YXJkXFxuVGhlIE1vc3QgV2FudGVkXFxuTXlzdGVyaW91cyBXYWlmXFxuTmFyY2lzc2lzdFxcblRoZSBOaWNrbmFtZXJcXG5Ob24tUG93ZXJlZCBDb3N0dW1lZCBIZXJvXFxuTm90IHdpdGggVGhlbSBmb3IgdGhlIE1vbmV5XFxuT25lIG9mIHRoZSBCb3lzXFxuT25lLU5vdGUgQ29va1xcbk9wZW4tTWluZGVkIFBhcmVudFxcbk91dHNpZGUgTWFuLCBJbnNpZGUgTWFuXFxuT3Zlcmx5IFBvbGl0ZSBQYWxzXFxuUGVlcmxlc3MgTG92ZSBJbnRlcmVzdFxcblBlcnNvbiBvZiBNYXNzIERlc3RydWN0aW9uXFxuUGludC1TaXplZCBQb3dlcmhvdXNlXFxuUGx1Y2t5IENvbWljIFJlbGllZlxcblBsdWNreSBPZmZpY2UgR2lybFxcblRoZSBOaWNlIENoZWVybGVhZGVyXFxuUHJpbmNlIG9mIFByYW5rc3RlcnNcXG5Qcm91ZCBXYXJyaW9yIFJhY2UgR3V5XFxuUHN5Y2hvIFN1cHBvcnRlclxcblRoZSBRdWFydGVyYmFja1xcblRoZSBSZWxpYWJsZSBPbmVcXG5SZW5haXNzYW5jZSBNYW5cXG5SZXBsYWNlbWVudCBHb2xkZmlzaFxcblRoZSBSaXZhbFxcblRoZSBSb2FkaWVcXG5UaGUgUm9jayBTdGFyXFxuUm9tYW50aWMgUnVubmVyLVVwXFxuU2Nob29sIE51cnNlXFxuU2VsZi1NYWRlIE1hblxcblNlcmlhbCBSb21lb1xcblRoZSBTY3Jvb2dlXFxuVGhlIFNocmlua1xcblNocmlua2luZyBWaW9sZXRcXG5TaWNrbHkgTmV1cm90aWMgR2Vla1xcblNpbmdsZS1Jc3N1ZSBMYW5kbG9yZFxcblNsZWF6eSBQb2xpdGljaWFuXFxuU21hcnQgSmVya1xcbk5pY2UgTW9yb25cXG5TbW9vdGgtVGFsa2luZyBUYWxlbnQgQWdlbnRcXG5UaGUgU25hcmsgS25pZ2h0XFxuU291dGhlcm4gQmVsbGVcXG5TcGlyaXRlZCBDb21wZXRpdG9yXFxuU3RhZ2UgTWFnaWNpYW5cXG5TdGFydmluZyBBcnRpc3RcXG5TdGFydmluZyBTdHVkZW50XFxuU3R1cGlkIEJvc3NcXG5TdXByZW1lIENoZWZcXG5UYWxsLCBEYXJrLCBhbmQgSGFuZHNvbWVcXG5UaGlyZC1QZXJzb24gUGVyc29uXFxuVG9rZW4gSG91c2VndWVzdFxcblRvbWJveVxcblRydWUgQ3JhZnRzbWFuXFxuVW5zYXRpc2ZpYWJsZSBDdXN0b21lclxcblVuc3RvcHBhYmxlIE1haWxtYW5cXG5XYW5kZXJpbmcgTWluc3RyZWxcXG5XZXQgQmxhbmtldCBXaWZlXFxuV2hpdGUgQ29sbGFyIFdvcmtlclxcbldpbGxpbmcgQ2hhbm5lbGVyXFxuV2luZ2VkIEh1bWFub2lkXFxuXCIsXCJzaHVmZmxlTm90ZVRlbXBsYXRlXCI6XCIjIyBUaGUgUHJvbXB0XFxuXFxuV3JpdGUgYSBwaWVjZSBvZiBmbGFzaCBmaWN0aW9uIGJldHdlZW4gNTAwIGFuZCA5OTkgd29yZHMgdGhhdDpcXG5cXG4qIEluY2x1ZGVzIGVhY2ggb2YgdGhlIGZvbGxvd2luZyB3b3JkczogJFdPUkQsICRXT1JELCAkV09SRC5cXG4qIEJlZ2lucyB3aXRoIHRoZSBsZXR0ZXIgJExFVFRFUi5cXG4qIEludm9sdmVzIGEgY2hhcmFjdGVyIHdobyBtYXRjaGVzIHRoZSBmb2xsb3dpbmcgYXJjaGV0eXBhbCB0cm9wZTogJENIQVJBQ1RFUlxcblxcbjwhLS0gVGlwcyBmcm9tIE1hcnkgUm9iaW5ldHRlIEtvd2FsOlxcblxcbjEuIEluIHRoZSBmaXJzdCAyLTMgc2VudGVuY2VzLCBlc3RhYmxpc2g6XFxuLSBbIF0gd2hvLCB1c2luZyBhbiBhY3Rpb25cXG4tIFsgXSB3aGVyZSwgd2l0aCBhIHNlbnNvcnkgZGV0YWlsXFxuLSBbIF0gZ2VucmUsIHdpdGggYSBzcGVjaWZpYywgdW5pcXVlIGRldGFpbC5cXG5cXG5JbiB0aGUgbmV4dCB0d28gc2VudGVuY2VzLCBzZXQgdXAgdGhlIGdvYWwsIHRoZSBzdGFrZXMgKHdoYXQgYXJlIHRoZXkgdHJ5aW5nIHRvIGFjY29tcGxpc2ggYW5kIHdoeT8pIGFuZCB0aGUgb2JzdGFjbGUgKHdoYXQgc3RhbmRzIGluIHRoZWlyIHdheT9cXG4tLT5cXG5cXG4jIyBUaGUgU3RvcnlcIn1cclxuXHJcblxyXG5jbGFzcyBTaHVmZmxlUGx1Z2luU2V0dGluZ3Mge1xyXG5cdHZhcmlhYmxlMU5hbWU6IHN0cmluZyA9IFwiV09SRFwiO1xyXG5cdHZhcmlhYmxlMVZhbHVlczogc3RyaW5nID0gXCJDYXRcXG5Eb2dcXG5LaW5nXFxuRmlyZVxcblBhcGVyXFxuV2FsbFxcbkJvb2tcXG5XaW5kXCI7XHJcblx0dmFyaWFibGUyTmFtZTogc3RyaW5nID0gXCJMRVRURVJcIjtcclxuXHR2YXJpYWJsZTJWYWx1ZXM6IHN0cmluZyA9IFwiYVxcbmJcXG5jXFxuZFxcbmVcXG5mXFxuZ1xcbmhcXG5pXFxualxcbmtcXG5sXCI7XHJcblx0dmFyaWFibGUzTmFtZTogc3RyaW5nID0gXCJMT0NBVElPTlwiO1xyXG5cdHZhcmlhYmxlM1ZhbHVlczogc3RyaW5nID0gXCJOZXcgWW9ya1xcbkxvcyBBbmdlbGVzXFxuTG9uZG9uXFxuUGFyaXNcXG5CZXJsaW5cIjtcclxuXHRzaHVmZmxlTm90ZVRlbXBsYXRlOiBzdHJpbmcgPSBcIiMjIFByb21wdFxcbjEuIEluY2x1ZGUgb25lIG9mIHRoZXNlIHdvcmRzOiAkV09SRCwgJFdPUkQgb3IgJFdPUkRcXG4yLiBCZWdpbiB3aXRoIGEgd29yZCB0aGF0IHN0YXJ0cyB3aXRoIGAkTEVUVEVSYFxcbjMuIFRha2UgcGxhY2UgaW4gJExPQ0FUSU9OIG9yICRMT0NBVElPTlxcblwiO1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTaHVmZmxlUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHtcclxuXHRzZXR0aW5nczogU2h1ZmZsZVBsdWdpblNldHRpbmdzO1xyXG5cclxuXHRhc3luYyBvbmxvYWQoKSB7XHJcblx0XHR0aGlzLmxvYWRTZXR0aW5ncygpO1xyXG5cdFx0dGhpcy5hZGRTZXR0aW5nVGFiKG5ldyBTaHVmZmxlUGx1Z2luU2V0dGluZ1RhYih0aGlzLmFwcCwgdGhpcykpO1xyXG5cdFx0dGhpcy5hZGRSaWJib25JY29uKCdkaWNlJywgJ1NodWZmbGUgUGx1Z2luJywgKCkgPT4ge1xyXG5cdFx0XHR0aGlzLmNyZWF0ZVNodWZmbGVOb3RlKCk7XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdG9udW5sb2FkKCkge31cclxuXHJcblx0YXN5bmMgc2F2ZVNldHRpbmdzKCkge1xyXG5cdFx0YXdhaXQgdGhpcy5zYXZlRGF0YSh0aGlzLnNldHRpbmdzKTtcclxuXHR9XHJcblxyXG5cdGxvYWRTZXR0aW5ncygpIHtcclxuXHRcdHRoaXMuc2V0dGluZ3MgPSBuZXcgU2h1ZmZsZVBsdWdpblNldHRpbmdzKCk7XHJcblx0XHQoYXN5bmMgKCkgPT4ge1xyXG5cdFx0XHRjb25zdCBsb2FkZWRTZXR0aW5ncyA9IGF3YWl0IHRoaXMubG9hZERhdGEoKTtcclxuXHRcdFx0aWYgKGxvYWRlZFNldHRpbmdzKSB7XHJcblx0XHRcdFx0dGhpcy5zZXR0aW5ncy52YXJpYWJsZTFOYW1lID0gbG9hZGVkU2V0dGluZ3MudmFyaWFibGUxTmFtZTtcclxuXHRcdFx0XHR0aGlzLnNldHRpbmdzLnZhcmlhYmxlMVZhbHVlcyA9IGxvYWRlZFNldHRpbmdzLnZhcmlhYmxlMVZhbHVlcztcclxuXHRcdFx0XHR0aGlzLnNldHRpbmdzLnZhcmlhYmxlMk5hbWUgPSBsb2FkZWRTZXR0aW5ncy52YXJpYWJsZTJOYW1lO1xyXG5cdFx0XHRcdHRoaXMuc2V0dGluZ3MudmFyaWFibGUyVmFsdWVzID0gbG9hZGVkU2V0dGluZ3MudmFyaWFibGUyVmFsdWVzO1xyXG5cdFx0XHRcdHRoaXMuc2V0dGluZ3MudmFyaWFibGUzTmFtZSA9IGxvYWRlZFNldHRpbmdzLnZhcmlhYmxlM05hbWU7XHJcblx0XHRcdFx0dGhpcy5zZXR0aW5ncy52YXJpYWJsZTNWYWx1ZXMgPSBsb2FkZWRTZXR0aW5ncy52YXJpYWJsZTNWYWx1ZXM7XHJcblx0XHRcdFx0dGhpcy5zZXR0aW5ncy5zaHVmZmxlTm90ZVRlbXBsYXRlID0gbG9hZGVkU2V0dGluZ3Muc2h1ZmZsZU5vdGVUZW1wbGF0ZTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRhd2FpdCB0aGlzLnNhdmVEYXRhKHRoaXMuc2V0dGluZ3MpO1xyXG5cdFx0XHR9XHJcblx0XHR9KSgpO1xyXG5cdH1cclxuXHJcblx0YXN5bmMgY3JlYXRlU2h1ZmZsZU5vdGUoKSB7XHJcblx0XHRsZXQgcmVzdWx0ID0gdGhpcy5zZXR0aW5ncy5zaHVmZmxlTm90ZVRlbXBsYXRlO1xyXG5cclxuXHRcdGxldCB2YXJpYWJsZTEgPSBcIiRcIiArIHRoaXMuc2V0dGluZ3MudmFyaWFibGUxTmFtZTtcclxuXHRcdGxldCB2YWx1ZXMxID0gdGhpcy5zZXR0aW5ncy52YXJpYWJsZTFWYWx1ZXMuc3BsaXQoXCJcXG5cIik7XHJcblxyXG5cdFx0bGV0IHZhcmlhYmxlMiA9IFwiJFwiICsgdGhpcy5zZXR0aW5ncy52YXJpYWJsZTJOYW1lO1xyXG5cdFx0bGV0IHZhbHVlczIgPSB0aGlzLnNldHRpbmdzLnZhcmlhYmxlMlZhbHVlcy5zcGxpdChcIlxcblwiKTtcclxuXHJcblx0XHRsZXQgdmFyaWFibGUzID0gXCIkXCIgKyB0aGlzLnNldHRpbmdzLnZhcmlhYmxlM05hbWU7XHJcblx0XHRsZXQgdmFsdWVzMyA9IHRoaXMuc2V0dGluZ3MudmFyaWFibGUzVmFsdWVzLnNwbGl0KFwiXFxuXCIpO1xyXG5cclxuXHRcdGlmKHZhbHVlczEubGVuZ3RoID4gMCkgcmVzdWx0ID0gdGhpcy5yZXBsYWNlVmFyaWFibGVzSW5UZW1wbGF0ZShyZXN1bHQsIHZhcmlhYmxlMSwgdmFsdWVzMSk7XHJcblx0XHRpZih2YWx1ZXMyLmxlbmd0aCA+IDApIHJlc3VsdCA9IHRoaXMucmVwbGFjZVZhcmlhYmxlc0luVGVtcGxhdGUocmVzdWx0LCB2YXJpYWJsZTIsIHZhbHVlczIpO1xyXG5cdFx0aWYodmFsdWVzMy5sZW5ndGggPiAwKSByZXN1bHQgPSB0aGlzLnJlcGxhY2VWYXJpYWJsZXNJblRlbXBsYXRlKHJlc3VsdCwgdmFyaWFibGUzLCB2YWx1ZXMzKTtcclxuXHJcblx0XHRjb25zdCBmaWxlTmFtZSA9IGBTaHVmZmxlIE5vdGUgLSAke0RhdGUubm93KCl9IC5tZGA7XHJcblxyXG5cdFx0YXdhaXQgdGhpcy5zYXZlU2h1ZmZsZU5vdGUoZmlsZU5hbWUsIHJlc3VsdCk7XHJcblx0XHRhd2FpdCB0aGlzLmFwcC53b3Jrc3BhY2Uub3BlbkxpbmtUZXh0KGZpbGVOYW1lLCAnJywgdHJ1ZSk7XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIHJlcGxhY2VWYXJpYWJsZXNJblRlbXBsYXRlKHRlbXBsYXRlOiBzdHJpbmcsIHZhcmlhYmxlOiBzdHJpbmcsIHZhbHVlczogc3RyaW5nW10pIHtcclxuXHRcdHdoaWxlKHRlbXBsYXRlLmluY2x1ZGVzKHZhcmlhYmxlKSkge1xyXG5cdFx0XHR0ZW1wbGF0ZSA9IHRlbXBsYXRlLnJlcGxhY2UodmFyaWFibGUsIHRoaXMucGlja1JhbmRvbWx5KHZhbHVlcykpO1xyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIHRlbXBsYXRlO1xyXG5cdH1cclxuXHJcblx0YXN5bmMgc2F2ZVNodWZmbGVOb3RlKGZpbGVQYXRoOiBzdHJpbmcsIG1kU3RyaW5nOiBzdHJpbmcpIHtcclxuXHRcdGNvbnN0IGZpbGVFeGlzdHMgPSBhd2FpdCB0aGlzLmFwcC52YXVsdC5hZGFwdGVyLmV4aXN0cyhmaWxlUGF0aCk7XHJcblx0XHRpZiAoZmlsZUV4aXN0cykge1xyXG5cdFx0XHRhd2FpdCB0aGlzLmFwcC52YXVsdC5hZGFwdGVyLnJlYWQoZmlsZVBhdGgpO1xyXG5cdFx0XHRhd2FpdCB0aGlzLmFwcC52YXVsdC5hZGFwdGVyLndyaXRlKGZpbGVQYXRoLCBtZFN0cmluZyk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRhd2FpdCB0aGlzLmFwcC52YXVsdC5jcmVhdGUoZmlsZVBhdGgsIG1kU3RyaW5nKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8vIEB0cy1pZ25vcmVcclxuXHRzaHVmZmxlKGFycmF5KSB7XHJcblx0XHRmb3IobGV0IGkgPSBhcnJheS5sZW5ndGggLSAxOyBpID4gMDsgaS0tKXtcclxuXHRcdFx0Y29uc3QgaiA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGkpXHJcblx0XHRcdGNvbnN0IHRlbXAgPSBhcnJheVtpXVxyXG5cdFx0XHRhcnJheVtpXSA9IGFycmF5W2pdXHJcblx0XHRcdGFycmF5W2pdID0gdGVtcFxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBhcnJheTtcclxuXHR9XHJcblxyXG5cdC8vIEB0cy1pZ25vcmVcclxuXHRwaWNrUmFuZG9tbHkoYXJyYXkpIHtcclxuXHRcdHJldHVybiB0aGlzLnNodWZmbGUoYXJyYXkpWzBdO1xyXG5cdH1cclxufVxyXG5cclxuY2xhc3MgU2h1ZmZsZVBsdWdpblNldHRpbmdUYWIgZXh0ZW5kcyBQbHVnaW5TZXR0aW5nVGFiIHtcclxuXHRwbHVnaW46IFNodWZmbGVQbHVnaW47XHJcblxyXG5cdGNvbnN0cnVjdG9yKGFwcDogQXBwLCBwbHVnaW46IFNodWZmbGVQbHVnaW4pIHtcclxuXHRcdHN1cGVyKGFwcCwgcGx1Z2luKTtcclxuXHRcdHRoaXMucGx1Z2luID0gcGx1Z2luO1xyXG5cdH1cclxuXHJcblx0YXN5bmMgbG9hZFByb21wdHModmFyaWFibGUxTmFtZTogc3RyaW5nLCB2YXJpYWJsZTFWYWx1ZXM6IHN0cmluZ1tdLCB0ZW1wbGF0ZTogc3RyaW5nLCB2YXJpYWJsZTJOYW1lOiBzdHJpbmcsIHZhcmlhYmxlMlZhbHVlczogc3RyaW5nW10sIHZhcmlhYmxlM05hbWU6IHN0cmluZywgdmFyaWFibGUzVmFsdWVzOiBzdHJpbmdbXSkge1xyXG5cdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MudmFyaWFibGUxTmFtZSA9IHZhcmlhYmxlMU5hbWU7XHJcblx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy52YXJpYWJsZTFWYWx1ZXMgPSB2YXJpYWJsZTFWYWx1ZXMuam9pbihcIlxcblwiKTtcclxuXHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLnZhcmlhYmxlMk5hbWUgPSB2YXJpYWJsZTJOYW1lO1xyXG5cdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MudmFyaWFibGUyVmFsdWVzID0gdmFyaWFibGUyVmFsdWVzLmpvaW4oXCJcXG5cIik7XHJcblx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy52YXJpYWJsZTNOYW1lID0gdmFyaWFibGUzTmFtZTtcclxuXHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLnZhcmlhYmxlM1ZhbHVlcyA9IHZhcmlhYmxlM1ZhbHVlcy5qb2luKFwiXFxuXCIpO1xyXG5cdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3Muc2h1ZmZsZU5vdGVUZW1wbGF0ZSA9IHRlbXBsYXRlO1xyXG5cclxuXHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG5cclxuXHRcdHRoaXMuZGlzcGxheSgpO1xyXG5cdH1cclxuXHJcblx0bG9hZEZsYXNoRmljdGlvblBhY2soKSB7XHJcblx0XHRjb25zdCB2YXJpYWJsZTFOYW1lID0gRkxBU0hfRklDVElPTl9QQUNLLnZhcmlhYmxlMU5hbWU7XHJcblx0XHRjb25zdCB2YXJpYWJsZTFWYWx1ZXMgPSBGTEFTSF9GSUNUSU9OX1BBQ0sudmFyaWFibGUxVmFsdWVzLnNwbGl0KFwiXFxuXCIpO1xyXG5cdFx0Y29uc3QgdmFyaWFibGUyTmFtZSA9IEZMQVNIX0ZJQ1RJT05fUEFDSy52YXJpYWJsZTJOYW1lO1xyXG5cdFx0Y29uc3QgdmFyaWFibGUyVmFsdWVzID0gRkxBU0hfRklDVElPTl9QQUNLLnZhcmlhYmxlMlZhbHVlcy5zcGxpdChcIlxcblwiKTtcclxuXHRcdGNvbnN0IHZhcmlhYmxlM05hbWUgPSBGTEFTSF9GSUNUSU9OX1BBQ0sudmFyaWFibGUzTmFtZTtcclxuXHRcdGNvbnN0IHZhcmlhYmxlM1ZhbHVlcyA9IEZMQVNIX0ZJQ1RJT05fUEFDSy52YXJpYWJsZTNWYWx1ZXMuc3BsaXQoXCJcXG5cIik7XHJcblxyXG5cdFx0Y29uc3QgdGVtcGxhdGUgPSBGTEFTSF9GSUNUSU9OX1BBQ0suc2h1ZmZsZU5vdGVUZW1wbGF0ZTtcclxuXHJcblx0XHR0aGlzLmxvYWRQcm9tcHRzKHZhcmlhYmxlMU5hbWUsIHZhcmlhYmxlMVZhbHVlcywgdGVtcGxhdGUsIHZhcmlhYmxlMk5hbWUsIHZhcmlhYmxlMlZhbHVlcywgdmFyaWFibGUzTmFtZSwgdmFyaWFibGUzVmFsdWVzKTtcclxuXHR9XHJcblxyXG5cdGFzeW5jIGxvYWRDb252ZXJzYXRpb25TdGFydGVycygpIHtcclxuXHRcdHRoaXMubG9hZFByb21wdHMoXCJDT05WRVJTQVRJT05fU1RBUlRFUlwiLCBDT05WRVJTQVRJT05fU1RBUlRFUlMsIFwiIyMgJENPTlZFUlNBVElPTl9TVEFSVEVSXCIsIFwiXCIsIFtdLCBcIlwiLCBbXSk7XHJcblx0fVxyXG5cclxuXHRhc3luYyBsb2FkT2JsaXF1ZVN0cmF0ZWdpZXMoKSB7XHJcblx0XHR0aGlzLmxvYWRQcm9tcHRzKFwiT0JMSVFVRV9TVFJBVEVHWVwiLCBPQkxJUVVFX1NUUkFURUdJRVMsIFwiXFxcIiRPQkxJUVVFX1NUUkFURUdZXFxcIlwiLCBcIlwiLCBbXSwgXCJcIiwgW10pO1xyXG5cdH1cclxuXHJcblx0ZGlzcGxheSgpOiB2b2lkIHtcclxuXHRcdGxldCB7Y29udGFpbmVyRWx9ID0gdGhpcztcclxuXHJcblx0XHRjb250YWluZXJFbC5lbXB0eSgpO1xyXG5cclxuXHRcdGNvbnRhaW5lckVsLmNyZWF0ZUVsKCdoMicsIHt0ZXh0OiAnU2h1ZmZsZSBTZXR0aW5ncyd9KTtcclxuXHJcblx0XHRjb250YWluZXJFbC5jcmVhdGVFbChcImgzXCIsIHt0ZXh0OiBcIkZlYXR1cmVkIFByb21wdHNcIn0pO1xyXG5cdFx0Y29udGFpbmVyRWwuY3JlYXRlRWwoXCJwXCIsIHt0ZXh0OiBcIlRyeSBvdXQgbmV3IHByb21wdHMgYnkgbG9hZGluZyB0aGVtIGludG8geW91ciBzZXR0aW5ncy4gV2lsbCByZXBsYWNlIHlvdXIgY3VzdG9tIHByb21wdHMuXCJ9KTtcclxuXHJcblx0XHRjb250YWluZXJFbC5jcmVhdGVFbChcImJ1dHRvblwiLCB7dGV4dDogXCLimqvvuI8gXFxcIk9ibGlxdWUgU3RyYXRlZ2llc1xcXCIgYnkgQnJpYW4gRW5vIGFuZCBQZXRlciBTY2htaWR0XCIsIGNsczogJ3NodWZmbGUtcGFjay1idXR0b24nfSlcclxuXHRcdFx0LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWRvd25cIiwgdGhpcy5sb2FkT2JsaXF1ZVN0cmF0ZWdpZXMuYmluZCh0aGlzKSk7XHJcblx0XHRjb250YWluZXJFbC5jcmVhdGVFbChcImJyXCIpO1xyXG5cclxuXHRcdGNvbnRhaW5lckVsLmNyZWF0ZUVsKFwiYnV0dG9uXCIsIHt0ZXh0OiBcIuKaoe+4jyBcXFwiRmxhc2ggRmljdGlvbiBQYWNrXFxcIiBieSBFbGVhbm9yIEtvbmlrXCIsIGNsczogJ3NodWZmbGUtcGFjay1idXR0b24nfSlcclxuXHRcdFx0LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWRvd25cIiwgdGhpcy5sb2FkRmxhc2hGaWN0aW9uUGFjay5iaW5kKHRoaXMpKTtcclxuXHRcdGNvbnRhaW5lckVsLmNyZWF0ZUVsKFwiYnJcIik7XHJcblxyXG5cdFx0Ly8gY29udGFpbmVyRWwuY3JlYXRlRWwoXCJidXR0b25cIiwge3RleHQ6IFwi4p2T77iPIFxcXCJDb252ZXJzYXRpb24gU3RhcnRlciBQYWNrXFxcIiBmcm9tIEJyaWdodGZ1bC5jb21cIiwgY2xzOiAnc2h1ZmZsZS1wYWNrLWJ1dHRvbid9KVxyXG5cdFx0Ly8gLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWRvd25cIiwgdGhpcy5sb2FkQ29udmVyc2F0aW9uU3RhcnRlcnMuYmluZCh0aGlzKSk7XHJcblx0XHQvLyBjb250YWluZXJFbC5jcmVhdGVFbChcImJyXCIpO1xyXG5cclxuXHRcdGNvbnRhaW5lckVsLmNyZWF0ZUVsKFwiaDNcIiwge3RleHQ6IFwiQ3VzdG9taXplIFlvdXIgUHJvbXB0c1wifSk7XHJcblxyXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXHJcblx0XHRcdC5zZXROYW1lKCdWYXJpYWJsZSAjMSBOYW1lJylcclxuXHRcdFx0LnNldERlc2MoJ0ZvciBleGFtcGxlLCBlbnRlciBXT1JEIGhlcmUgYW5kIHRoZW4sIGluIHlvdXIgdGVtcGxhdGUsIHVzZSAkV09SRCB0byBpbnZva2UgYSByYW5kb21seSBzZWxlY3RlZCB2YWx1ZS4nKVxyXG5cdFx0XHQuYWRkVGV4dCh0ZXh0ID0+IHRleHRcclxuXHRcdFx0XHQuc2V0UGxhY2Vob2xkZXIoJycpXHJcblx0XHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnZhcmlhYmxlMU5hbWUpXHJcblx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG5cdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MudmFyaWFibGUxTmFtZSA9IHZhbHVlO1xyXG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcblx0XHRcdFx0fSkpO1xyXG5cclxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG5cdFx0XHQuc2V0TmFtZSgnVmFyaWFibGUgIzEgVmFsdWVzJylcclxuXHRcdFx0LnNldERlc2MoJ0NyZWF0ZSBhIGxpc3Qgb2YgdmFsdWVzIHRoYXQgdmFyaWFibGUgIzEgd2lsbCBiZSByYW5kb21seSByZXBsYWNlZCB3aXRoIGluIHlvdXIgdGVtcGxhdGUuIE9uZSB2YWx1ZSBwZXIgbGluZS4nKVxyXG5cdFx0XHQuYWRkVGV4dEFyZWEodGV4dCA9PiB0ZXh0XHJcblx0XHRcdFx0LnNldFBsYWNlaG9sZGVyKCdEb2dcXG5DYXRcXG5CZWZvcmUgZGF3blxcbldpdGggZmlyZScpXHJcblx0XHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnZhcmlhYmxlMVZhbHVlcylcclxuXHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcblx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy52YXJpYWJsZTFWYWx1ZXMgPSB2YWx1ZTtcclxuXHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG5cdFx0XHRcdH0pKTtcclxuXHJcblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuXHRcdFx0LnNldE5hbWUoJ1ZhcmlhYmxlICMyIE5hbWUnKVxyXG5cdFx0XHQuc2V0RGVzYygnRm9yIGV4YW1wbGUsIGVudGVyIExPQ0FUSU9OIGhlcmUgYW5kIHRoZW4sIGluIHlvdXIgdGVtcGxhdGUsIHVzZSAkTE9DQVRJT04gdG8gaW52b2tlIGEgcmFuZG9tbHkgc2VsZWN0ZWQgdmFsdWUuJylcclxuXHRcdFx0LmFkZFRleHQodGV4dCA9PiB0ZXh0XHJcblx0XHRcdFx0LnNldFBsYWNlaG9sZGVyKCcnKVxyXG5cdFx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy52YXJpYWJsZTJOYW1lKVxyXG5cdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuXHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLnZhcmlhYmxlMk5hbWUgPSB2YWx1ZTtcclxuXHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG5cdFx0XHRcdH0pKTtcclxuXHJcblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuXHRcdFx0LnNldE5hbWUoJ1ZhcmlhYmxlICMyIFZhbHVlcycpXHJcblx0XHRcdC5zZXREZXNjKCdDcmVhdGUgYSBsaXN0IG9mIHZhbHVlcyB0aGF0IHZhcmlhYmxlICMxIHdpbGwgYmUgcmFuZG9tbHkgcmVwbGFjZWQgd2l0aCBpbiB5b3VyIHRlbXBsYXRlLiBPbmUgdmFsdWUgcGVyIGxpbmUuJylcclxuXHRcdFx0LmFkZFRleHRBcmVhKHRleHQgPT4gdGV4dFxyXG5cdFx0XHRcdC5zZXRQbGFjZWhvbGRlcignTmV3IFlvcmtcXG5BdXN0aW5cXG5QYXJpc1xcbkJlcmxpbicpXHJcblx0XHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnZhcmlhYmxlMlZhbHVlcylcclxuXHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcblx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy52YXJpYWJsZTJWYWx1ZXMgPSB2YWx1ZTtcclxuXHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG5cdFx0XHRcdH0pKTtcclxuXHJcblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuXHRcdFx0LnNldE5hbWUoJ1ZhcmlhYmxlICMzIE5hbWUnKVxyXG5cdFx0XHQuc2V0RGVzYygnRm9yIGV4YW1wbGUsIGVudGVyIEFDVElPTiBoZXJlIGFuZCB0aGVuLCBpbiB5b3VyIHRlbXBsYXRlLCB1c2UgJEFDVElPTiB0byBpbnZva2UgYSByYW5kb21seSBzZWxlY3RlZCB2YWx1ZS4nKVxyXG5cdFx0XHQuYWRkVGV4dCh0ZXh0ID0+IHRleHRcclxuXHRcdFx0XHQuc2V0UGxhY2Vob2xkZXIoJycpXHJcblx0XHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnZhcmlhYmxlM05hbWUpXHJcblx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG5cdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MudmFyaWFibGUzTmFtZSA9IHZhbHVlO1xyXG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcblx0XHRcdFx0fSkpO1xyXG5cclxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG5cdFx0XHQuc2V0TmFtZSgnVmFyaWFibGUgIzMgVmFsdWVzJylcclxuXHRcdFx0LnNldERlc2MoJ0NyZWF0ZSBhIGxpc3Qgb2YgdmFsdWVzIHRoYXQgdmFyaWFibGUgIzEgd2lsbCBiZSByYW5kb21seSByZXBsYWNlZCB3aXRoIGluIHlvdXIgdGVtcGxhdGUuIE9uZSB2YWx1ZSBwZXIgbGluZS4nKVxyXG5cdFx0XHQuYWRkVGV4dEFyZWEodGV4dCA9PiB0ZXh0XHJcblx0XHRcdFx0LnNldFBsYWNlaG9sZGVyKCdSdW5cXG5IaWRlXFxuQnV5XFxuQ3V0JylcclxuXHRcdFx0XHQuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MudmFyaWFibGUzVmFsdWVzKVxyXG5cdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuXHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLnZhcmlhYmxlM1ZhbHVlcyA9IHZhbHVlO1xyXG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcblx0XHRcdFx0fSkpO1xyXG5cclxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG5cdFx0XHQuc2V0TmFtZSgnU2h1ZmZsZSBOb3RlIFRlbXBsYXRlJylcclxuXHRcdFx0LnNldERlc2MoJ0NyZWF0ZSB5b3VyIG93biB0ZW1wbGF0ZSBmb3IgeW91ciB3cml0aW5nIHByb21wdHMgdXNpbmcgeW91ciB2YXJpYWJsZXMuJylcclxuXHRcdFx0LmFkZFRleHRBcmVhKHRleHQgPT4gdGV4dFxyXG5cdFx0XHRcdC5zZXRQbGFjZWhvbGRlcignSW5jbHVkZSB0aGVzZSAzIHdvcmRzOiAkV09SRCAkV09SRCAkV09SRCAkV09SRCAkV09SRFxcbicpXHJcblx0XHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnNodWZmbGVOb3RlVGVtcGxhdGUpXHJcblx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG5cdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3Muc2h1ZmZsZU5vdGVUZW1wbGF0ZSA9IHZhbHVlO1xyXG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcblx0XHRcdFx0fSkpO1xyXG5cclxuXHR9XHJcbn1cclxuXHJcbiJdLCJuYW1lcyI6WyJQbHVnaW4iLCJTZXR0aW5nIiwiUGx1Z2luU2V0dGluZ1RhYiJdLCJtYXBwaW5ncyI6Ijs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxhQUFhLEdBQUcsU0FBUyxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ25DLElBQUksYUFBYSxHQUFHLE1BQU0sQ0FBQyxjQUFjO0FBQ3pDLFNBQVMsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLFlBQVksS0FBSyxJQUFJLFVBQVUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUNwRixRQUFRLFVBQVUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUMxRyxJQUFJLE9BQU8sYUFBYSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUMvQixDQUFDLENBQUM7QUFDRjtBQUNPLFNBQVMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDaEMsSUFBSSxhQUFhLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3hCLElBQUksU0FBUyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQyxFQUFFO0FBQzNDLElBQUksQ0FBQyxDQUFDLFNBQVMsR0FBRyxDQUFDLEtBQUssSUFBSSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztBQUN6RixDQUFDO0FBdUNEO0FBQ08sU0FBUyxTQUFTLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFO0FBQzdELElBQUksU0FBUyxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsT0FBTyxLQUFLLFlBQVksQ0FBQyxHQUFHLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQyxVQUFVLE9BQU8sRUFBRSxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFO0FBQ2hILElBQUksT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsT0FBTyxDQUFDLEVBQUUsVUFBVSxPQUFPLEVBQUUsTUFBTSxFQUFFO0FBQy9ELFFBQVEsU0FBUyxTQUFTLENBQUMsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtBQUNuRyxRQUFRLFNBQVMsUUFBUSxDQUFDLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtBQUN0RyxRQUFRLFNBQVMsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLE1BQU0sQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUMsRUFBRTtBQUN0SCxRQUFRLElBQUksQ0FBQyxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxVQUFVLElBQUksRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztBQUM5RSxLQUFLLENBQUMsQ0FBQztBQUNQLENBQUM7QUFDRDtBQUNPLFNBQVMsV0FBVyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUU7QUFDM0MsSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3JILElBQUksT0FBTyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLE9BQU8sTUFBTSxLQUFLLFVBQVUsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLFdBQVcsRUFBRSxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDN0osSUFBSSxTQUFTLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxPQUFPLFVBQVUsQ0FBQyxFQUFFLEVBQUUsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUN0RSxJQUFJLFNBQVMsSUFBSSxDQUFDLEVBQUUsRUFBRTtBQUN0QixRQUFRLElBQUksQ0FBQyxFQUFFLE1BQU0sSUFBSSxTQUFTLENBQUMsaUNBQWlDLENBQUMsQ0FBQztBQUN0RSxRQUFRLE9BQU8sQ0FBQyxFQUFFLElBQUk7QUFDdEIsWUFBWSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztBQUN6SyxZQUFZLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDcEQsWUFBWSxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDekIsZ0JBQWdCLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLE1BQU07QUFDOUMsZ0JBQWdCLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQztBQUN4RSxnQkFBZ0IsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUztBQUNqRSxnQkFBZ0IsS0FBSyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsU0FBUztBQUNqRSxnQkFBZ0I7QUFDaEIsb0JBQW9CLElBQUksRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUU7QUFDaEksb0JBQW9CLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUss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 427 | -------------------------------------------------------------------------------- /main.ts: -------------------------------------------------------------------------------- 1 | import { App, Plugin, Notice, PluginSettingTab, Setting } from 'obsidian'; 2 | 3 | const OBLIQUE_STRATEGIES = ["Abandon normal instruments.","Accept advice.","Accretion.","A line has two sides.","Balance the consistency principle with the inconsistency principle.","Be dirty.","Breathe more deeply.","Bridges -build -burn.","Cascades.","Cluster analysis.","Consider different fading systems.","Courage!","Cut a vital connection.","Decorate, decorate.","Define an area as 'safe' and use it as an anchor.","Destroy the most important thing.","Discard an axiom.","Disconnect from desire.","Discover the recipes you are using and abandon them.","Distorting time.","Don't be afraid of things because they're easy to do.","Don't be frightened of cliches.","Don't be frightened to display your talents.","Don't stress one thing more than another.","Do something boring.","Do the washing up.","Do the words need changing?","Do we need holes?","Emphasize differences.","Emphasize repetitions.","Emphasize the flaws.","Get your neck massaged.","Give way to your worst impulse.","Go slowly all the way round the outside.","Honor thy error as a hidden intention.","How would you have done it?","Humanize something free of error.","Infinitesimal gradations.","Into the impossible.","Is it finished?","Is there something missing?","Just carry on.","Left channel, right channel, centre channel.","Look at a very small object, look at its centre.","Look at the order in which you do things.","Look closely at the most embarrassing details and amplify them.","Make a blank valuable by putting it in an exquisite frame.","Make an exhaustive list of everything you might do and do the last thing on the list.","Make a sudden, destructive unpredictable action; incorporate.","Only one element of each kind.","Remember those quiet evenings.","Remove ambiguities and convert to specifics.","Remove specifics and convert to ambiguities.","Repetition is a form of change.","Reverse.","Simple subtraction.","Spectrum analysis.","Take a break.","Take away the elements in order of apparent non-importance.","Tidy up.","Turn it upside down.","Twist the spine.","Use an old idea.","Use an unacceptable color.","Water.","What are you really thinking about just now? Incorporate.","What is the reality of the situation?","What mistakes did you make last time?","What wouldn't you do?","Work at a different speed."] 4 | const CONVERSATION_STARTERS = ["If You Had Three Wishes, What Would You Wish For?","What Would You Rather Throw Away: Love Or Money?","What's The Most Beautiful Place You've Ever Seen?","What Was Your Fondest Memory Of High School?","What's Your Favorite TV Show?","What's The Strangest Thing In Your Refrigerator?","Would You Rather Hear The Music Of Johann Sebastian Bach Played By A Barbershop Quartet, Or A Heavy Metal Band?","Have You Ever Been To A Five Star Resort?","What Was Your Favorite Toy Growing Up?","What's The Funniest Way You've Ever Broken The Law?","What's Your Favorite Sports Team?","What Talent Would You Want To Possess If You Could?","If You Could Trade Lives With Someone, Who Would It Be?","If You Could Erase One Event From History, Which One Would You Erase?","What Was Your Favorite Toy As A Child?","Who Do You Most Like To Poke Fun At?","If You Were Suddenly Transported To Another Planet, How Would You Assess The Situation?","When Do You Feel The Most In Control?","Would You Rather Have 10 Hobbies Or One Passion?","What's Your Favorite Movie?","If You Could Interview A Famous Person, Who Would You Choose?","If Your Food Is Bad At A Restaurant, Would You Say Something?","If You Could Only Use One Word The Rest Of Your Life, What Word Would You Choose?","What Are Your Dreams And Ambitions?","You've Been Given An Elephant. You Can't Get Rid Of It. What Would You Do With It?","What's The Funniest Thing You've Seen On The News?","If You Had The World's Attention For 30 Seconds, What Would You Say?","If You Could Be Best Friends With A Celebrity, Who Would It Be?","If You Were To Play A Song You Love Right Now, What Would It Be?","Would You Rather Look Like A Potato, Or Feel Like A Potato?","What Would You Do With 10 Million Dollars?","How Can You Tell If Someone Has A Sense Of Humor?","If You Were To Name Your Own Song, What Would You Name It?","If You Were In A Room Filled With You And Your Doppelganger And 2 Million Dollars, What Would You Do?","What Is In Your Fridge Right Now?","What Have You Learned About Life From Kids?","How Would You Want To Be Remembered?","What Do You Hope Your Deceased Relative Would Say About You If They Saw You Now?","If You Could Change Your Name, What Would You Change It To?","What's The Strangest Thing That You've Ever Fallen In Love With?","If You Could Have Any Super Power, Which One Would You Choose?","If You Were Invited To Attend Hogwarts, Which Hogwarts House Would You Choose?","What Were The Highlights Of Your Childhood?","Have You Ever Kept A Secret For More Than A Decade?","What's The Most Important Thing You've Learned From A Celebrity?","Do You Care About Reviews?","What Would Be The Perfect Crime?","What's The Stupidest Thing You've Ever Done?","Spontaneity Or Stability?","What's The Funniest Movie You've Ever Seen?","When Did You Last Meet A Stranger You Thought You'd Never Meet Again?","Do You Save Or Spend?","How Much Does The Amount Of Traffic Affect Your Mood?","If You Had To Choose One Animal To Have As A Pet, Which Animal Would You Choose?","What's Your Worst Habit?","Do they like to take a stand or just let things go?","What's Your Favorite Song?","How Do You Think The World Would Be Different If Bananas Were Illegal?","Would You Rather Be Able To Control Time, Or Be Able To Know What Other People Are Thinking?","Is It Difficult To Do What You Do?","Who Is Your Favorite Celebrity?","If You Found $2,000 On The Ground, What Would You Do With It?","What's Your Favorite Pizza Topping?","What Would You Do If You Could Possess The Abilities Of Your Dog?","What's The Smartest Thing You've Ever Done?"] 5 | const FLASH_FICTION_PACK = {"variable1Name":"WORD","variable1Values":"account\nmiddle\nact\nmilk\nadjustment\nmind\nmine\nagreement\nminute\nair\nmist\namount\namusement\nmonth\nanimal\nmorning\nanswer\nmother\napparatus\nmotion\napproval\nmountain\nargument\nmove\nart\nmusic\nattack\nname\nattempt\nnation\nattention\nneed\nattraction\nnews\nauthority\nnight\nback\nnoise\nbalance\nnote\nAmaranth\nAmber\nAmethyst\nApricot\nAqua\nAquamarine\nAsparagus\nAuburn\nAzure\nBeige\nBistre\nBlack\nBlue\nBrass\nBronze\nBrown\nBuff\nBurgundy\nCamouflage\nCardinal\nCarmine\nCarrot\nCeladon\nCerise\nCerulean\nChampagne\nCharcoal\nChartreuse\nCherry\nChestnut\nChocolate\nCinnabar\nCinnamon\nCobalt\nCopper\nCoral\nCorn\nCornflower\nCream\nCrimson\nCyan\nEmerald\nEggplant\nFlax\nFrench Rose\nGold\nGoldenrod\nGreen\nGrey\nIndigo\nIvory\nJade\nKhaki\nLavender\nLemon\nLilac\nLime\nLinen\nMagenta\nMagnolia\nMalachite\nMaroon\nMauve\nMustard\nMyrtle\nNavy\nOchre\nOlive\nOrange\nOrchid\nPeach\nPear\nPeriwinkle\nPersimmon\nPine Green\nPink\nPlatinum\nPlum\nPumpkin\nPurple\nQuartz\nRaw umber\nRose\nRuby\nRusset\nRust\nSaffron\nSalmon\nSandy brown\nSangria\nSapphire\nScarlet\nSeashell\nSepia\nSlate\nSilver\nTan\nTangerine\nTaupe\nTeal\nTawny\nTerra cotta\nThistle\nTomato\nTurquoise\nUltramarine\nVermilion\nViolet\nViridian\nWheat\nWhite\nWisteria\nXanthic\nYellow\nZucchini\nbase\nnumber\nbehavior\nobservation\nbelief\noffer\nbirth\noil\nbit\noperation\nbite\nopinion\nblood\norder\nblow\norganization\nbody\nornament\nbrass\nowner\nbread\npage\nbreath\npain\nbrother\npaint\nbuilding\npaper\nburn\npart\nburst\npaste\nbusiness\npayment\nbutter\npeace\ncanvas\nperson\ncare\nplace\ncause\nplant\nchalk\nplay\nchance\npleasure\nchange\npoint\ncloth\npoison\ncoal\npolish\ncolor\nporter\ncomfort\nposition\ncommittee\npowder\ncompany\npower\ncomparison\nprice\ncompetition\nprint\ncondition\nprocess\nconnection\nproduce\ncontrol\nprofit\ncook\nproperty\ncopper\nprose\ncopy\nprotest\ncork\npull\ncopy\npunishment\ncough\npurpose\ncountry\npush\ncover\nquality\ncrack\nquestion\ncredit\nrain\ncrime\nrange\ncrush\nrate\ncry\nray\ncurrent\nreaction\ncurve\nreading\ndamage\nreason\ndanger\nrecord\ndaughter\nregret\nday\nrelation\ndeath\nreligion\ndebt\nrepresentative\ndecision\nrequest\ndegree\nrespect\ndesign\nrest\ndesire\nreward\ndestruction\nrhythm\ndetail\nrice\ndevelopment\nriver\ndigestion\nroad\ndirection\nroll\ndiscovery\nroom\ndiscussion\nrub\ndisease\nrule\ndisgust\nrun\ndistance\nsalt\ndistribution\nsand\ndivision\nscale\ndoubt\nscience\ndrink\nsea\ndriving\nseat\ndust\nsecretary\nearth\nselection\nedge\nself\neducation\nsense\neffect\nservant\nend\nerror\nshade\nevent\nshake\nexample\nshame\nexchange\nshock\nexistence\nside\nexpansion\nsign\nexperience\nsilk\nexpert\nsilver\nfact\nsister\nfall\nsize\nfamily\nsky\nfather\nsleep\nfear\nslip\nfeeling\nslope\nfiction\nsmash\nfield\nsmell\nfight\nsmile\nfire\nsmoke\nflame\nsneeze\nflight\nsnow\nflower\nsoap\nfold\nsociety\nfood\nson\nforce\nsong\nform\nsort\nfriend\nsound\nfront\nsoup\nfruit\nspace\nglass\nstage\ngold\nstart\ngovernment\nstatement\ngrain\nsteam\ngrass\nsteel\ngrip\nstep\ngroup\nstitch\ngrowth\nstone\nguide\nstop\nharbor\nstory\nharmony\nstretch\nhate\nstructure\nhearing\nsubstance\nheat\nsugar\nhelp\nsuggestion\nhistory\nsummer\nhole\nsupport\nhope\nsurprise\nhour\nswim\nhumor\nsystem\nice\ntalk\nidea\ntaste\nimpulse\ntax\nincrease\nteaching\nindustry\ntendency\nink\ntest\ninsect\ntheory\ninstrument\nthing\ninsurance\nthought\ninterest\nthunder\ninvention\ntime\niron\ntin\njelly\ntop\njoin\ntouch\njourney\ntrade\njudge\ntransport\njump\ntrick\nkick\ntrouble\nkiss\nturn\nknowledge\ntwist\nland\nunit\nlanguage\nuse\nlaugh\nvalue\nlow\nverse\nlead\nvessel\nlearning\nview\nleather\nvoice\nletter\nwalk\nlevel\nwar\nlift\nwash\nlight\nwaste\nlimit\nwater\nlinen\nwave\nliquid\nwax\nlist\nway\nlook\nweather\nloss\nweek\nlove\nweight\nmachine\nwind\nman\nwine\nmanager\nwinter\nmark\nwoman\nmarket\nwood\nmass\nwool\nmeal\nword\nmeasure\nwork\nmeat\nwound\nmeeting\nwriting\nmemory\nyear\nmetal\nworm\nangle\nknee\nant\nknife\napple\nknot\narch\nleaf\narm\nleg\narmy\nlibrary\nbaby\nline\nbag\nlip\nball\nlock\nband\nmap\nbasin\nmatch\nbasket\nmonkey\nbath\nmoon\nbed\nmouth\nbee\nmuscle\nbell\nnail\nberry\nneck\nbird\nneedle\nblade\nnerve\nboard\nnet\nboat\nnose\nbone\nnut\nbook\noffice\nboot\norange\nbottle\noven\nbox\nparcel\nboy\npen\nbrain\npencil\nbrake\npicture\nbranch\npig\nbrick\npin\nbridge\npipe\nbrush\nplane\nbucket\nplate\nbulb\nplough\nbutton\npocket\ncake\npot\ncamera\npotato\ncard\nprison\ncarriage\npump\ncart\nrail\ncat\nrat\nchain\nreceipt\ncheese\nring\nchess\nrod\nchin\nroof\nchurch\nroot\ncircle\nsail\nclock\nschool\ncloud\nscissors\ncoat\nscrew\ncollar\nseed\ncomb\nsheep\ncord\nshelf\ncow\nship\ncup\nshirt\ncurtain\nshoe\ncushion\nskin\ndog\nskirt\ndoor\nsnake\ndrain\nsock\ndrawer\nspade\ndress\nsponge\ndrop\nspoon\near\nspring\negg\nsquare\nengine\nstamp\neye\nstar\nface\nstation\nfarm\nstem\nfeather\nstick\nfinger\nstocking\nfish\nstomach\nflag\nstore\nfloor\nstreet\nfly\nsun\nfoot\ntable\nfork\ntail\nfowl\nthread\nframe\nthroat\ngarden\nthumb\ngirl\nticket\nglove\ntoe\ngoat\ntongue\ngun\ntooth\nhair\ntown\nhammer\ntrain\nhand\ntray\nhat\ntree\nhead\ntrousers\nheart\numbrella\nhook\nwall\nhorn\nwatch\nhorse\nwheel\nhospital\nwhip\nhouse\nwhistle\nisland\nwindow\njewel\nwing\nkettle\nwire\nkey","variable2Name":"LETTER","variable2Values":"a\nb\nc\nd\ne\nf\ng\nh\ni\nj\nk\nl\nm\nn\no\np\nq\nr\ns\nt\nu\nv\nw\nx\ny\nz","variable3Name":"CHARACTER","variable3Values":"Anthropomorphic Personification\nAnti-Hero\nThe Archmage\nAudience Surrogate\nBarefoot Sage\nBlind Seer\nBlue-Collar Warlock\nBruiser with a Soft Center\nThe Chosen One\nThe Chooser of The One\nClassical Hunter\nClassic Villain\nThe Cynic\nThe Dragonslayer\nThe Drunken Sailor\nDumb Muscle\nEccentric Mentor\nEvil Overlord\nThe Fair Folk\nFalse Prophet\nThe Ferryman\nThe Fool\nFool for Love\nGentle Giant\nThe Good King\nHerald\nThe Hero\nHeroic Wannabe\nHigher Self\nHunter of Monsters\nThe Idealist\nIneffectual Loner\nThe Klutz\nKnight in Shining Armor\nLady and Knight\nLovable Rogue\nMadonna Archetype\nThe McCoy\nMentor Archetype\nMessiah Figure\nMock Millionaire\nModern Major General\nMoses Archetype\nMy Girl Back Home\nObstructive Bureaucrat\nOld Soldier\nThe Paladin\nThe Paragon\nThe Patriarch\nPerson of Mass Destruction\nPrince Charming\nRebel Leader\nRebellious Spirit\nReluctant Monster\nSeeker Archetype\nSidekick\nThe Sociopath\nStar-Crossed Lovers\nThe Storyteller\nTurn Coat\nThe Trickster\nWicked Stepmother\nWicked Witch\nWolf Man\nWorld's Best Warrior\nWorld's Most Beautiful Woman\nWorld's Strongest Man\nAbsent-Minded Professor\nThe believer\nThe skeptic\nAngry Chef\nAntagonistic Governor\nAnthropomorphic Animal\nBad Boss\nBadass Normal\nBarbarian Tribe\nThe Barber\nThe Bard\nThe Bartender\nBattle Butler\nBenevolent Precursors\nThe Berserker\nThe Big Bad Wolf\nBig Eater\nBlood Knight\nBounty Hunter\nBridezilla\nBumbling Dad\nBumbling Sidekick\nInsane Ruler\nThe Care Taker\nThe Charmer\nChatty Hairdresser\nChick Magnet\nChildhood Friend\nChivalrous Pervert\nChurch Militant\nCity Mouse\nClass Clown\nControl Freak\nCorrupt Corporate Executive\nCosmic Plaything\nCowboy Cop\nCranky Landlord\nCranky Neighbor\nCrooked Contractor\nCrossdresser\nCrouching Moron, Hidden Badass\nDad the Veteran\nDamsel Errant\nDark Messiah\nDark-Skinned Redhead\nDashing Hispanic\nDeath Seeker\nDeceptive Disciple\nDefector from Decadence\nDefrosting Ice Queen\nDeranged Taxi Driver\nDeterminator\nDetermined Widow\nDirty Coward\nThe Ditz\nBrainless Beauty\nGenius Ditz\nIdiot Savant\nUpper-Class Twit\nDumb Muscle\nDogged Nice Guy\nDoting Parent\nDouble Agent\nDream People\nDrill Sergeant Nasty\nThe Friendly Landlord\nDr. Jerk\nWorking-class hooligan\nThe Eeyore\nElegant Classical Musician\nEnigmatic Empowering Entity\nErudite Stoner\nEthnic Magician\nThe Everyman\nEvil Matriarch\nFace of a Thug\nFalse Prophet\nFarmer's Daughter\nFemme Fatale\nThe Fighting Narcissist\nThe Flapper\nForest Ranger\nGadgeteer Genius\nGirl Next Door\nGlory Hound\nGlory Seeker\nGold Digger\nBeautiful Foreigner\nGrande Dame\nGroupie\nGuile Hero\nHandsome Lech\nHalf-Human Hybrid\nHalf-Identical Twins\nHalf-Witted Hillbilly\nHardboiled Detective\nHead-Turning Beauty\nHeaven Seeker\nHell Seeker\nHeavy Sleeper\nYe Olde Hermit\nHonest John's Dealership\nHouse Husband\nHuman Weapon\nIgnorant of Their Own Ignorance\nMad Scientist's Helper\nThe Informant\nIntrepid Merchant\nKid Hero\nKindly Housekeeper\nThe Klutz\nKnight in Shining Armor\nKnow-Nothing Know-It-All\nLethal Chef\nLiteral-Minded\nLittle Jimmy\nLiving Legend\nLoony Fan\nLower-Class Lout\nMad Scientist\nMaster Swordsman\nBoastful Coward\nThe Most Wanted\nMysterious Waif\nNarcissist\nThe Nicknamer\nNon-Powered Costumed Hero\nNot with Them for the Money\nOne of the Boys\nOne-Note Cook\nOpen-Minded Parent\nOutside Man, Inside Man\nOverly Polite Pals\nPeerless Love Interest\nPerson of Mass Destruction\nPint-Sized Powerhouse\nPlucky Comic Relief\nPlucky Office Girl\nThe Nice Cheerleader\nPrince of Pranksters\nProud Warrior Race Guy\nPsycho Supporter\nThe Quarterback\nThe Reliable One\nRenaissance Man\nReplacement Goldfish\nThe Rival\nThe Roadie\nThe Rock Star\nRomantic Runner-Up\nSchool Nurse\nSelf-Made Man\nSerial Romeo\nThe Scrooge\nThe Shrink\nShrinking Violet\nSickly Neurotic Geek\nSingle-Issue Landlord\nSleazy Politician\nSmart Jerk\nNice Moron\nSmooth-Talking Talent Agent\nThe Snark Knight\nSouthern Belle\nSpirited Competitor\nStage Magician\nStarving Artist\nStarving Student\nStupid Boss\nSupreme Chef\nTall, Dark, and Handsome\nThird-Person Person\nToken Houseguest\nTomboy\nTrue Craftsman\nUnsatisfiable Customer\nUnstoppable Mailman\nWandering Minstrel\nWet Blanket Wife\nWhite Collar Worker\nWilling Channeler\nWinged Humanoid\n","shuffleNoteTemplate":"## The Prompt\n\nWrite a piece of flash fiction between 500 and 999 words that:\n\n* Includes each of the following words: $WORD, $WORD, $WORD.\n* Begins with the letter $LETTER.\n* Involves a character who matches the following archetypal trope: $CHARACTER\n\n\n\n## The Story"} 6 | 7 | 8 | class ShufflePluginSettings { 9 | variable1Name: string = "WORD"; 10 | variable1Values: string = "Cat\nDog\nKing\nFire\nPaper\nWall\nBook\nWind"; 11 | variable2Name: string = "LETTER"; 12 | variable2Values: string = "a\nb\nc\nd\ne\nf\ng\nh\ni\nj\nk\nl"; 13 | variable3Name: string = "LOCATION"; 14 | variable3Values: string = "New York\nLos Angeles\nLondon\nParis\nBerlin"; 15 | shuffleNoteTemplate: string = "## Prompt\n1. Include one of these words: $WORD, $WORD or $WORD\n2. Begin with a word that starts with `$LETTER`\n3. Take place in $LOCATION or $LOCATION\n"; 16 | } 17 | 18 | export default class ShufflePlugin extends Plugin { 19 | settings: ShufflePluginSettings; 20 | 21 | async onload() { 22 | this.loadSettings(); 23 | this.addSettingTab(new ShufflePluginSettingTab(this.app, this)); 24 | this.addRibbonIcon('dice', 'Shuffle Plugin', () => { 25 | this.createShuffleNote(); 26 | }); 27 | } 28 | 29 | onunload() {} 30 | 31 | async saveSettings() { 32 | await this.saveData(this.settings); 33 | } 34 | 35 | loadSettings() { 36 | this.settings = new ShufflePluginSettings(); 37 | (async () => { 38 | const loadedSettings = await this.loadData(); 39 | if (loadedSettings) { 40 | this.settings.variable1Name = loadedSettings.variable1Name; 41 | this.settings.variable1Values = loadedSettings.variable1Values; 42 | this.settings.variable2Name = loadedSettings.variable2Name; 43 | this.settings.variable2Values = loadedSettings.variable2Values; 44 | this.settings.variable3Name = loadedSettings.variable3Name; 45 | this.settings.variable3Values = loadedSettings.variable3Values; 46 | this.settings.shuffleNoteTemplate = loadedSettings.shuffleNoteTemplate; 47 | } else { 48 | await this.saveData(this.settings); 49 | } 50 | })(); 51 | } 52 | 53 | async createShuffleNote() { 54 | let result = this.settings.shuffleNoteTemplate; 55 | 56 | let variable1 = "$" + this.settings.variable1Name; 57 | let values1 = this.settings.variable1Values.split("\n"); 58 | 59 | let variable2 = "$" + this.settings.variable2Name; 60 | let values2 = this.settings.variable2Values.split("\n"); 61 | 62 | let variable3 = "$" + this.settings.variable3Name; 63 | let values3 = this.settings.variable3Values.split("\n"); 64 | 65 | if(values1.length > 0) result = this.replaceVariablesInTemplate(result, variable1, values1); 66 | if(values2.length > 0) result = this.replaceVariablesInTemplate(result, variable2, values2); 67 | if(values3.length > 0) result = this.replaceVariablesInTemplate(result, variable3, values3); 68 | 69 | const fileName = `Shuffle Note - ${Date.now()} .md`; 70 | 71 | await this.saveShuffleNote(fileName, result); 72 | await this.app.workspace.openLinkText(fileName, '', true); 73 | } 74 | 75 | private replaceVariablesInTemplate(template: string, variable: string, values: string[]) { 76 | while(template.includes(variable)) { 77 | template = template.replace(variable, this.pickRandomly(values)); 78 | } 79 | return template; 80 | } 81 | 82 | async saveShuffleNote(filePath: string, mdString: string) { 83 | const fileExists = await this.app.vault.adapter.exists(filePath); 84 | if (fileExists) { 85 | await this.app.vault.adapter.read(filePath); 86 | await this.app.vault.adapter.write(filePath, mdString); 87 | } else { 88 | await this.app.vault.create(filePath, mdString); 89 | } 90 | } 91 | 92 | // @ts-ignore 93 | shuffle(array) { 94 | for(let i = array.length - 1; i > 0; i--){ 95 | const j = Math.floor(Math.random() * i) 96 | const temp = array[i] 97 | array[i] = array[j] 98 | array[j] = temp 99 | } 100 | 101 | return array; 102 | } 103 | 104 | // @ts-ignore 105 | pickRandomly(array) { 106 | return this.shuffle(array)[0]; 107 | } 108 | } 109 | 110 | class ShufflePluginSettingTab extends PluginSettingTab { 111 | plugin: ShufflePlugin; 112 | 113 | constructor(app: App, plugin: ShufflePlugin) { 114 | super(app, plugin); 115 | this.plugin = plugin; 116 | } 117 | 118 | async loadPrompts(variable1Name: string, variable1Values: string[], template: string, variable2Name: string, variable2Values: string[], variable3Name: string, variable3Values: string[]) { 119 | this.plugin.settings.variable1Name = variable1Name; 120 | this.plugin.settings.variable1Values = variable1Values.join("\n"); 121 | this.plugin.settings.variable2Name = variable2Name; 122 | this.plugin.settings.variable2Values = variable2Values.join("\n"); 123 | this.plugin.settings.variable3Name = variable3Name; 124 | this.plugin.settings.variable3Values = variable3Values.join("\n"); 125 | this.plugin.settings.shuffleNoteTemplate = template; 126 | 127 | await this.plugin.saveSettings(); 128 | 129 | this.display(); 130 | } 131 | 132 | loadFlashFictionPack() { 133 | const variable1Name = FLASH_FICTION_PACK.variable1Name; 134 | const variable1Values = FLASH_FICTION_PACK.variable1Values.split("\n"); 135 | const variable2Name = FLASH_FICTION_PACK.variable2Name; 136 | const variable2Values = FLASH_FICTION_PACK.variable2Values.split("\n"); 137 | const variable3Name = FLASH_FICTION_PACK.variable3Name; 138 | const variable3Values = FLASH_FICTION_PACK.variable3Values.split("\n"); 139 | 140 | const template = FLASH_FICTION_PACK.shuffleNoteTemplate; 141 | 142 | this.loadPrompts(variable1Name, variable1Values, template, variable2Name, variable2Values, variable3Name, variable3Values); 143 | } 144 | 145 | async loadConversationStarters() { 146 | this.loadPrompts("CONVERSATION_STARTER", CONVERSATION_STARTERS, "## $CONVERSATION_STARTER", "", [], "", []); 147 | } 148 | 149 | async loadObliqueStrategies() { 150 | this.loadPrompts("OBLIQUE_STRATEGY", OBLIQUE_STRATEGIES, "\"$OBLIQUE_STRATEGY\"", "", [], "", []); 151 | } 152 | 153 | display(): void { 154 | let {containerEl} = this; 155 | 156 | containerEl.empty(); 157 | 158 | containerEl.createEl('h2', {text: 'Shuffle Settings'}); 159 | 160 | containerEl.createEl("h3", {text: "Featured Prompts"}); 161 | containerEl.createEl("p", {text: "Try out new prompts by loading them into your settings. Will replace your custom prompts."}); 162 | 163 | containerEl.createEl("button", {text: "⚫️ \"Oblique Strategies\" by Brian Eno and Peter Schmidt", cls: 'shuffle-pack-button'}) 164 | .addEventListener("mousedown", this.loadObliqueStrategies.bind(this)); 165 | containerEl.createEl("br"); 166 | 167 | containerEl.createEl("button", {text: "⚡️ \"Flash Fiction Pack\" by Eleanor Konik", cls: 'shuffle-pack-button'}) 168 | .addEventListener("mousedown", this.loadFlashFictionPack.bind(this)); 169 | containerEl.createEl("br"); 170 | 171 | // containerEl.createEl("button", {text: "❓️ \"Conversation Starter Pack\" from Brightful.com", cls: 'shuffle-pack-button'}) 172 | // .addEventListener("mousedown", this.loadConversationStarters.bind(this)); 173 | // containerEl.createEl("br"); 174 | 175 | containerEl.createEl("h3", {text: "Customize Your Prompts"}); 176 | 177 | new Setting(containerEl) 178 | .setName('Variable #1 Name') 179 | .setDesc('For example, enter WORD here and then, in your template, use $WORD to invoke a randomly selected value.') 180 | .addText(text => text 181 | .setPlaceholder('') 182 | .setValue(this.plugin.settings.variable1Name) 183 | .onChange(async (value) => { 184 | this.plugin.settings.variable1Name = value; 185 | await this.plugin.saveSettings(); 186 | })); 187 | 188 | new Setting(containerEl) 189 | .setName('Variable #1 Values') 190 | .setDesc('Create a list of values that variable #1 will be randomly replaced with in your template. One value per line.') 191 | .addTextArea(text => text 192 | .setPlaceholder('Dog\nCat\nBefore dawn\nWith fire') 193 | .setValue(this.plugin.settings.variable1Values) 194 | .onChange(async (value) => { 195 | this.plugin.settings.variable1Values = value; 196 | await this.plugin.saveSettings(); 197 | })); 198 | 199 | new Setting(containerEl) 200 | .setName('Variable #2 Name') 201 | .setDesc('For example, enter LOCATION here and then, in your template, use $LOCATION to invoke a randomly selected value.') 202 | .addText(text => text 203 | .setPlaceholder('') 204 | .setValue(this.plugin.settings.variable2Name) 205 | .onChange(async (value) => { 206 | this.plugin.settings.variable2Name = value; 207 | await this.plugin.saveSettings(); 208 | })); 209 | 210 | new Setting(containerEl) 211 | .setName('Variable #2 Values') 212 | .setDesc('Create a list of values that variable #1 will be randomly replaced with in your template. One value per line.') 213 | .addTextArea(text => text 214 | .setPlaceholder('New York\nAustin\nParis\nBerlin') 215 | .setValue(this.plugin.settings.variable2Values) 216 | .onChange(async (value) => { 217 | this.plugin.settings.variable2Values = value; 218 | await this.plugin.saveSettings(); 219 | })); 220 | 221 | new Setting(containerEl) 222 | .setName('Variable #3 Name') 223 | .setDesc('For example, enter ACTION here and then, in your template, use $ACTION to invoke a randomly selected value.') 224 | .addText(text => text 225 | .setPlaceholder('') 226 | .setValue(this.plugin.settings.variable3Name) 227 | .onChange(async (value) => { 228 | this.plugin.settings.variable3Name = value; 229 | await this.plugin.saveSettings(); 230 | })); 231 | 232 | new Setting(containerEl) 233 | .setName('Variable #3 Values') 234 | .setDesc('Create a list of values that variable #1 will be randomly replaced with in your template. One value per line.') 235 | .addTextArea(text => text 236 | .setPlaceholder('Run\nHide\nBuy\nCut') 237 | .setValue(this.plugin.settings.variable3Values) 238 | .onChange(async (value) => { 239 | this.plugin.settings.variable3Values = value; 240 | await this.plugin.saveSettings(); 241 | })); 242 | 243 | new Setting(containerEl) 244 | .setName('Shuffle Note Template') 245 | .setDesc('Create your own template for your writing prompts using your variables.') 246 | .addTextArea(text => text 247 | .setPlaceholder('Include these 3 words: $WORD $WORD $WORD $WORD $WORD\n') 248 | .setValue(this.plugin.settings.shuffleNoteTemplate) 249 | .onChange(async (value) => { 250 | this.plugin.settings.shuffleNoteTemplate = value; 251 | await this.plugin.saveSettings(); 252 | })); 253 | 254 | } 255 | } 256 | 257 | -------------------------------------------------------------------------------- /manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "obsidian-shuffle", 3 | "name": "Shuffle", 4 | "version": "0.0.3", 5 | "minAppVersion": "0.9.12", 6 | "description": "This plugin allows you to create and load randomized writing-prompts from lists of variables.", 7 | "author": "Alexis Rondeau", 8 | "authorUrl": "https://publish.obsidian.md/alexisrondeau", 9 | "isDesktopOnly": false 10 | } 11 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "obsidian-shuffle", 3 | "version": "0.0.3", 4 | "description": "This plugin allows you to create randomized writing-prompts from lists of variables.", 5 | "main": "main.js", 6 | "scripts": { 7 | "dev": "rollup --config rollup.config.js -w", 8 | "build": "rollup --config rollup.config.js" 9 | }, 10 | "keywords": [], 11 | "author": "", 12 | "license": "MIT", 13 | "devDependencies": { 14 | "@rollup/plugin-commonjs": "^15.1.0", 15 | "@rollup/plugin-node-resolve": "^9.0.0", 16 | "@rollup/plugin-typescript": "^6.0.0", 17 | "@types/node": "^14.14.2", 18 | "obsidian": "https://github.com/obsidianmd/obsidian-api/tarball/master", 19 | "rollup": "^2.32.1", 20 | "tslib": "^2.0.3", 21 | "typescript": "^4.0.3" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /rollup.config.js: -------------------------------------------------------------------------------- 1 | import typescript from '@rollup/plugin-typescript'; 2 | import {nodeResolve} from '@rollup/plugin-node-resolve'; 3 | import commonjs from '@rollup/plugin-commonjs'; 4 | 5 | export default { 6 | input: 'main.ts', 7 | output: { 8 | dir: '.', 9 | sourcemap: 'inline', 10 | format: 'cjs', 11 | exports: 'default' 12 | }, 13 | external: ['obsidian'], 14 | plugins: [ 15 | typescript(), 16 | nodeResolve({browser: true}), 17 | commonjs(), 18 | ] 19 | }; -------------------------------------------------------------------------------- /styles.css: -------------------------------------------------------------------------------- 1 | .shuffle-pack-button { 2 | font-size: 100%; 3 | margin-bottom: 5px; 4 | } -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "baseUrl": ".", 4 | "inlineSourceMap": true, 5 | "inlineSources": true, 6 | "module": "ESNext", 7 | "target": "es5", 8 | "allowJs": true, 9 | "noImplicitAny": true, 10 | "moduleResolution": "node", 11 | "importHelpers": true, 12 | "lib": [ 13 | "dom", 14 | "es5", 15 | "scripthost", 16 | "es2015" 17 | ] 18 | }, 19 | "include": [ 20 | "**/*.ts" 21 | ] 22 | } 23 | -------------------------------------------------------------------------------- /versions.json: -------------------------------------------------------------------------------- 1 | { 2 | "1.0.1": "0.9.12", 3 | "1.0.0": "0.9.7" 4 | } 5 | --------------------------------------------------------------------------------