<!--{{{-->
<link rel='alternate' type='application/rss+xml' title='RSS' href='index.xml' />
<!--}}}-->
Background: #fff
Foreground: #000
PrimaryPale: #8cf
PrimaryLight: #18f
PrimaryMid: #04b
PrimaryDark: #014
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88
/*{{{*/
body {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}

a {color:[[ColorPalette::PrimaryMid]];}
a:hover {background-color:[[ColorPalette::PrimaryMid]]; color:[[ColorPalette::Background]];}
a img {border:0;}

h1,h2,h3,h4,h5,h6 {color:[[ColorPalette::SecondaryDark]]; background:transparent;}
h1 {border-bottom:2px solid [[ColorPalette::TertiaryLight]];}
h2,h3 {border-bottom:1px solid [[ColorPalette::TertiaryLight]];}

.button {color:[[ColorPalette::PrimaryDark]]; border:1px solid [[ColorPalette::Background]];}
.button:hover {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::SecondaryLight]]; border-color:[[ColorPalette::SecondaryMid]];}
.button:active {color:[[ColorPalette::Background]]; background:[[ColorPalette::SecondaryMid]]; border:1px solid [[ColorPalette::SecondaryDark]];}

.header {background:[[ColorPalette::PrimaryMid]];}
.headerShadow {color:[[ColorPalette::Foreground]];}
.headerShadow a {font-weight:normal; color:[[ColorPalette::Foreground]];}
.headerForeground {color:[[ColorPalette::Background]];}
.headerForeground a {font-weight:normal; color:[[ColorPalette::PrimaryPale]];}

.tabSelected{color:[[ColorPalette::PrimaryDark]];
	background:[[ColorPalette::TertiaryPale]];
	border-left:1px solid [[ColorPalette::TertiaryLight]];
	border-top:1px solid [[ColorPalette::TertiaryLight]];
	border-right:1px solid [[ColorPalette::TertiaryLight]];
}
.tabUnselected {color:[[ColorPalette::Background]]; background:[[ColorPalette::TertiaryMid]];}
.tabContents {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::TertiaryPale]]; border:1px solid [[ColorPalette::TertiaryLight]];}
.tabContents .button {border:0;}

#sidebar {}
#sidebarOptions input {border:1px solid [[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel {background:[[ColorPalette::PrimaryPale]];}
#sidebarOptions .sliderPanel a {border:none;color:[[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel a:hover {color:[[ColorPalette::Background]]; background:[[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel a:active {color:[[ColorPalette::PrimaryMid]]; background:[[ColorPalette::Background]];}

.wizard {background:[[ColorPalette::PrimaryPale]]; border:1px solid [[ColorPalette::PrimaryMid]];}
.wizard h1 {color:[[ColorPalette::PrimaryDark]]; border:none;}
.wizard h2 {color:[[ColorPalette::Foreground]]; border:none;}
.wizardStep {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];
	border:1px solid [[ColorPalette::PrimaryMid]];}
.wizardStep.wizardStepDone {background:[[ColorPalette::TertiaryLight]];}
.wizardFooter {background:[[ColorPalette::PrimaryPale]];}
.wizardFooter .status {background:[[ColorPalette::PrimaryDark]]; color:[[ColorPalette::Background]];}
.wizard .button {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryLight]]; border: 1px solid;
	border-color:[[ColorPalette::SecondaryPale]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryPale]];}
.wizard .button:hover {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::Background]];}
.wizard .button:active {color:[[ColorPalette::Background]]; background:[[ColorPalette::Foreground]]; border: 1px solid;
	border-color:[[ColorPalette::PrimaryDark]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryDark]];}

.wizard .notChanged {background:transparent;}
.wizard .changedLocally {background:#80ff80;}
.wizard .changedServer {background:#8080ff;}
.wizard .changedBoth {background:#ff8080;}
.wizard .notFound {background:#ffff80;}
.wizard .putToServer {background:#ff80ff;}
.wizard .gotFromServer {background:#80ffff;}

#messageArea {border:1px solid [[ColorPalette::SecondaryMid]]; background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]];}
#messageArea .button {color:[[ColorPalette::PrimaryMid]]; background:[[ColorPalette::SecondaryPale]]; border:none;}

.popupTiddler {background:[[ColorPalette::TertiaryPale]]; border:2px solid [[ColorPalette::TertiaryMid]];}

.popup {background:[[ColorPalette::TertiaryPale]]; color:[[ColorPalette::TertiaryDark]]; border-left:1px solid [[ColorPalette::TertiaryMid]]; border-top:1px solid [[ColorPalette::TertiaryMid]]; border-right:2px solid [[ColorPalette::TertiaryDark]]; border-bottom:2px solid [[ColorPalette::TertiaryDark]];}
.popup hr {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::PrimaryDark]]; border-bottom:1px;}
.popup li.disabled {color:[[ColorPalette::TertiaryMid]];}
.popup li a, .popup li a:visited {color:[[ColorPalette::Foreground]]; border: none;}
.popup li a:hover {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; border: none;}
.popup li a:active {background:[[ColorPalette::SecondaryPale]]; color:[[ColorPalette::Foreground]]; border: none;}
.popupHighlight {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}
.listBreak div {border-bottom:1px solid [[ColorPalette::TertiaryDark]];}

.tiddler .defaultCommand {font-weight:bold;}

.shadow .title {color:[[ColorPalette::TertiaryDark]];}

.title {color:[[ColorPalette::SecondaryDark]];}
.subtitle {color:[[ColorPalette::TertiaryDark]];}

.toolbar {color:[[ColorPalette::PrimaryMid]];}
.toolbar a {color:[[ColorPalette::TertiaryLight]];}
.selected .toolbar a {color:[[ColorPalette::TertiaryMid]];}
.selected .toolbar a:hover {color:[[ColorPalette::Foreground]];}

.tagging, .tagged {border:1px solid [[ColorPalette::TertiaryPale]]; background-color:[[ColorPalette::TertiaryPale]];}
.selected .tagging, .selected .tagged {background-color:[[ColorPalette::TertiaryLight]]; border:1px solid [[ColorPalette::TertiaryMid]];}
.tagging .listTitle, .tagged .listTitle {color:[[ColorPalette::PrimaryDark]];}
.tagging .button, .tagged .button {border:none;}

.footer {color:[[ColorPalette::TertiaryLight]];}
.selected .footer {color:[[ColorPalette::TertiaryMid]];}

.sparkline {background:[[ColorPalette::PrimaryPale]]; border:0;}
.sparktick {background:[[ColorPalette::PrimaryDark]];}

.error, .errorButton {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::Error]];}
.warning {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryPale]];}
.lowlight {background:[[ColorPalette::TertiaryLight]];}

.zoomer {background:none; color:[[ColorPalette::TertiaryMid]]; border:3px solid [[ColorPalette::TertiaryMid]];}

.imageLink, #displayArea .imageLink {background:transparent;}

.annotation {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; border:2px solid [[ColorPalette::SecondaryMid]];}

.viewer .listTitle {list-style-type:none; margin-left:-2em;}
.viewer .button {border:1px solid [[ColorPalette::SecondaryMid]];}
.viewer blockquote {border-left:3px solid [[ColorPalette::TertiaryDark]];}

.viewer table, table.twtable {border:2px solid [[ColorPalette::TertiaryDark]];}
.viewer th, .viewer thead td, .twtable th, .twtable thead td {background:[[ColorPalette::SecondaryMid]]; border:1px solid [[ColorPalette::TertiaryDark]]; color:[[ColorPalette::Background]];}
.viewer td, .viewer tr, .twtable td, .twtable tr {border:1px solid [[ColorPalette::TertiaryDark]];}

.viewer pre {border:1px solid [[ColorPalette::SecondaryLight]]; background:[[ColorPalette::SecondaryPale]];}
.viewer code {color:[[ColorPalette::SecondaryDark]];}
.viewer hr {border:0; border-top:dashed 1px [[ColorPalette::TertiaryDark]]; color:[[ColorPalette::TertiaryDark]];}

.highlight, .marked {background:[[ColorPalette::SecondaryLight]];}

.editor input {border:1px solid [[ColorPalette::PrimaryMid]];}
.editor textarea {border:1px solid [[ColorPalette::PrimaryMid]]; width:100%;}
.editorFooter {color:[[ColorPalette::TertiaryMid]];}
.readOnly {background:[[ColorPalette::TertiaryPale]];}

#backstageArea {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::TertiaryMid]];}
#backstageArea a {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::Background]]; border:none;}
#backstageArea a:hover {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; }
#backstageArea a.backstageSelTab {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}
#backstageButton a {background:none; color:[[ColorPalette::Background]]; border:none;}
#backstageButton a:hover {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::Background]]; border:none;}
#backstagePanel {background:[[ColorPalette::Background]]; border-color: [[ColorPalette::Background]] [[ColorPalette::TertiaryDark]] [[ColorPalette::TertiaryDark]] [[ColorPalette::TertiaryDark]];}
.backstagePanelFooter .button {border:none; color:[[ColorPalette::Background]];}
.backstagePanelFooter .button:hover {color:[[ColorPalette::Foreground]];}
#backstageCloak {background:[[ColorPalette::Foreground]]; opacity:0.6; filter:'alpha(opacity=60)';}
/*}}}*/
/*{{{*/
* html .tiddler {height:1%;}

body {font-size:.75em; font-family:arial,helvetica; margin:0; padding:0;}

h1,h2,h3,h4,h5,h6 {font-weight:bold; text-decoration:none;}
h1,h2,h3 {padding-bottom:1px; margin-top:1.2em;margin-bottom:0.3em;}
h4,h5,h6 {margin-top:1em;}
h1 {font-size:1.35em;}
h2 {font-size:1.25em;}
h3 {font-size:1.1em;}
h4 {font-size:1em;}
h5 {font-size:.9em;}

hr {height:1px;}

a {text-decoration:none;}

dt {font-weight:bold;}

ol {list-style-type:decimal;}
ol ol {list-style-type:lower-alpha;}
ol ol ol {list-style-type:lower-roman;}
ol ol ol ol {list-style-type:decimal;}
ol ol ol ol ol {list-style-type:lower-alpha;}
ol ol ol ol ol ol {list-style-type:lower-roman;}
ol ol ol ol ol ol ol {list-style-type:decimal;}

.txtOptionInput {width:11em;}

#contentWrapper .chkOptionInput {border:0;}

.externalLink {text-decoration:underline;}

.indent {margin-left:3em;}
.outdent {margin-left:3em; text-indent:-3em;}
code.escaped {white-space:nowrap;}

.tiddlyLinkExisting {font-weight:bold;}
.tiddlyLinkNonExisting {font-style:italic;}

/* the 'a' is required for IE, otherwise it renders the whole tiddler in bold */
a.tiddlyLinkNonExisting.shadow {font-weight:bold;}

#mainMenu .tiddlyLinkExisting,
	#mainMenu .tiddlyLinkNonExisting,
	#sidebarTabs .tiddlyLinkNonExisting {font-weight:normal; font-style:normal;}
#sidebarTabs .tiddlyLinkExisting {font-weight:bold; font-style:normal;}

.header {position:relative;}
.header a:hover {background:transparent;}
.headerShadow {position:relative; padding:4.5em 0 1em 1em; left:-1px; top:-1px;}
.headerForeground {position:absolute; padding:4.5em 0 1em 1em; left:0px; top:0px;}

.siteTitle {font-size:3em;}
.siteSubtitle {font-size:1.2em;}

#mainMenu {position:absolute; left:0; width:10em; text-align:right; line-height:1.6em; padding:1.5em 0.5em 0.5em 0.5em; font-size:1.1em;}

#sidebar {position:absolute; right:3px; width:16em; font-size:.9em;}
#sidebarOptions {padding-top:0.3em;}
#sidebarOptions a {margin:0 0.2em; padding:0.2em 0.3em; display:block;}
#sidebarOptions input {margin:0.4em 0.5em;}
#sidebarOptions .sliderPanel {margin-left:1em; padding:0.5em; font-size:.85em;}
#sidebarOptions .sliderPanel a {font-weight:bold; display:inline; padding:0;}
#sidebarOptions .sliderPanel input {margin:0 0 0.3em 0;}
#sidebarTabs .tabContents {width:15em; overflow:hidden;}

.wizard {padding:0.1em 1em 0 2em;}
.wizard h1 {font-size:2em; font-weight:bold; background:none; padding:0; margin:0.4em 0 0.2em;}
.wizard h2 {font-size:1.2em; font-weight:bold; background:none; padding:0; margin:0.4em 0 0.2em;}
.wizardStep {padding:1em 1em 1em 1em;}
.wizard .button {margin:0.5em 0 0; font-size:1.2em;}
.wizardFooter {padding:0.8em 0.4em 0.8em 0;}
.wizardFooter .status {padding:0 0.4em; margin-left:1em;}
.wizard .button {padding:0.1em 0.2em;}

#messageArea {position:fixed; top:2em; right:0; margin:0.5em; padding:0.5em; z-index:2000; _position:absolute;}
.messageToolbar {display:block; text-align:right; padding:0.2em;}
#messageArea a {text-decoration:underline;}

.tiddlerPopupButton {padding:0.2em;}
.popupTiddler {position: absolute; z-index:300; padding:1em; margin:0;}

.popup {position:absolute; z-index:300; font-size:.9em; padding:0; list-style:none; margin:0;}
.popup .popupMessage {padding:0.4em;}
.popup hr {display:block; height:1px; width:auto; padding:0; margin:0.2em 0;}
.popup li.disabled {padding:0.4em;}
.popup li a {display:block; padding:0.4em; font-weight:normal; cursor:pointer;}
.listBreak {font-size:1px; line-height:1px;}
.listBreak div {margin:2px 0;}

.tabset {padding:1em 0 0 0.5em;}
.tab {margin:0 0 0 0.25em; padding:2px;}
.tabContents {padding:0.5em;}
.tabContents ul, .tabContents ol {margin:0; padding:0;}
.txtMainTab .tabContents li {list-style:none;}
.tabContents li.listLink { margin-left:.75em;}

#contentWrapper {display:block;}
#splashScreen {display:none;}

#displayArea {margin:1em 17em 0 14em;}

.toolbar {text-align:right; font-size:.9em;}

.tiddler {padding:1em 1em 0;}

.missing .viewer,.missing .title {font-style:italic;}

.title {font-size:1.6em; font-weight:bold;}

.missing .subtitle {display:none;}
.subtitle {font-size:1.1em;}

.tiddler .button {padding:0.2em 0.4em;}

.tagging {margin:0.5em 0.5em 0.5em 0; float:left; display:none;}
.isTag .tagging {display:block;}
.tagged {margin:0.5em; float:right;}
.tagging, .tagged {font-size:0.9em; padding:0.25em;}
.tagging ul, .tagged ul {list-style:none; margin:0.25em; padding:0;}
.tagClear {clear:both;}

.footer {font-size:.9em;}
.footer li {display:inline;}

.annotation {padding:0.5em; margin:0.5em;}

* html .viewer pre {width:99%; padding:0 0 1em 0;}
.viewer {line-height:1.4em; padding-top:0.5em;}
.viewer .button {margin:0 0.25em; padding:0 0.25em;}
.viewer blockquote {line-height:1.5em; padding-left:0.8em;margin-left:2.5em;}
.viewer ul, .viewer ol {margin-left:0.5em; padding-left:1.5em;}

.viewer table, table.twtable {border-collapse:collapse; margin:0.8em 1.0em;}
.viewer th, .viewer td, .viewer tr,.viewer caption,.twtable th, .twtable td, .twtable tr,.twtable caption {padding:3px;}
table.listView {font-size:0.85em; margin:0.8em 1.0em;}
table.listView th, table.listView td, table.listView tr {padding:0px 3px 0px 3px;}

.viewer pre {padding:0.5em; margin-left:0.5em; font-size:1.2em; line-height:1.4em; overflow:auto;}
.viewer code {font-size:1.2em; line-height:1.4em;}

.editor {font-size:1.1em;}
.editor input, .editor textarea {display:block; width:100%; font:inherit;}
.editorFooter {padding:0.25em 0; font-size:.9em;}
.editorFooter .button {padding-top:0px; padding-bottom:0px;}

.fieldsetFix {border:0; padding:0; margin:1px 0px;}

.sparkline {line-height:1em;}
.sparktick {outline:0;}

.zoomer {font-size:1.1em; position:absolute; overflow:hidden;}
.zoomer div {padding:1em;}

* html #backstage {width:99%;}
* html #backstageArea {width:99%;}
#backstageArea {display:none; position:relative; overflow: hidden; z-index:150; padding:0.3em 0.5em;}
#backstageToolbar {position:relative;}
#backstageArea a {font-weight:bold; margin-left:0.5em; padding:0.3em 0.5em;}
#backstageButton {display:none; position:absolute; z-index:175; top:0; right:0;}
#backstageButton a {padding:0.1em 0.4em; margin:0.1em;}
#backstage {position:relative; width:100%; z-index:50;}
#backstagePanel {display:none; z-index:100; position:absolute; width:90%; margin-left:3em; padding:1em;}
.backstagePanelFooter {padding-top:0.2em; float:right;}
.backstagePanelFooter a {padding:0.2em 0.4em;}
#backstageCloak {display:none; z-index:20; position:absolute; width:100%; height:100px;}

.whenBackstage {display:none;}
.backstageVisible .whenBackstage {display:block;}
/*}}}*/
/***
StyleSheet for use when a translation requires any css style changes.
This StyleSheet can be used directly by languages such as Chinese, Japanese and Korean which need larger font sizes.
***/
/*{{{*/
body {font-size:0.8em;}
#sidebarOptions {font-size:1.05em;}
#sidebarOptions a {font-style:normal;}
#sidebarOptions .sliderPanel {font-size:0.95em;}
.subtitle {font-size:0.8em;}
.viewer table.listView {font-size:0.95em;}
/*}}}*/
/*{{{*/
@media print {
#mainMenu, #sidebar, #messageArea, .toolbar, #backstageButton, #backstageArea {display: none !important;}
#displayArea {margin: 1em 1em 0em;}
noscript {display:none;} /* Fixes a feature in Firefox 1.5.0.2 where print preview displays the noscript content */
}
/*}}}*/
<!--{{{-->
<div class='header' macro='gradient vert [[ColorPalette::PrimaryLight]] [[ColorPalette::PrimaryMid]]'>
<div class='headerShadow'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
<div class='headerForeground'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
</div>
<div id='mainMenu' refresh='content' tiddler='MainMenu'></div>
<div id='sidebar'>
<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>
<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>
</div>
<div id='displayArea'>
<div id='messageArea'></div>
<div id='tiddlerDisplay'></div>
</div>
<!--}}}-->
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::ViewToolbar]]'></div>
<div class='title' macro='view title'></div>
<div class='subtitle'><span macro='view modifier link'></span>, <span macro='view modified date'></span> (<span macro='message views.wikified.createdPrompt'></span> <span macro='view created date'></span>)</div>
<div class='tagging' macro='tagging'></div>
<div class='tagged' macro='tags'></div>
<div class='viewer' macro='view text wikified'></div>
<div class='tagClear'></div>
<!--}}}-->
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::EditToolbar]]'></div>
<div class='title' macro='view title'></div>
<div class='editor' macro='edit title'></div>
<div macro='annotations'></div>
<div class='editor' macro='edit text'></div>
<div class='editor' macro='edit tags'></div><div class='editorFooter'><span macro='message views.editor.tagPrompt'></span><span macro='tagChooser excludeLists'></span></div>
<!--}}}-->
To get started with this blank [[TiddlyWiki]], you'll need to modify the following tiddlers:
* [[SiteTitle]] & [[SiteSubtitle]]: The title and subtitle of the site, as shown above (after saving, they will also appear in the browser title bar)
* [[MainMenu]]: The menu (usually on the left)
* [[DefaultTiddlers]]: Contains the names of the tiddlers that you want to appear when the TiddlyWiki is opened
You'll also need to enter your username for signing your edits: <<option txtUserName>>
These [[InterfaceOptions]] for customising [[TiddlyWiki]] are saved in your browser

Your username for signing your edits. Write it as a [[WikiWord]] (eg [[JoeBloggs]])

<<option txtUserName>>
<<option chkSaveBackups>> [[SaveBackups]]
<<option chkAutoSave>> [[AutoSave]]
<<option chkRegExpSearch>> [[RegExpSearch]]
<<option chkCaseSensitiveSearch>> [[CaseSensitiveSearch]]
<<option chkAnimate>> [[EnableAnimations]]

----
Also see [[AdvancedOptions]]
<<importTiddlers>>
IN THE GARDEN:

    Grow beautiful azaleas: Occasionally water plants with a mixture of two tablespoons vinegar to one quart water. Azaleas love acidic soil.
    Kill grass on walks and driveways. Pour full strength on unwanted grass.
     Kill weeds. Spray full strength on growth until plants have starved.
    Increase soil acidity. In hard water areas, add a cup of vinegar to a gallon of tap water for watering acid loving plants like rhododendrons, gardenias, or azaleas. The vinegar will release iron in the soil for the plants to use.
     Freshen cut flowers.  Add 2 tablespoons vinegar and 1 teaspoon sugar for each quart of water.
     Prolong the life of flowers in a vase. Add two tablespoons of vinegar plus three tablespoons of sugar per quart of warm water. Stems should be in three to four inches of water.
     Neutralize garden lime. Rinse your hands liberally with vinegar after working with garden lime to avoid rough and flaking skin. Clean pots before repotting, rinse with vinegar to remove excess lime.
    Spray ripening melons and pumpkins to prevent mold from growing on the skin
    Clean your lawn mower blades. Spray the blades with vinegar and scrub off. 

BUGS & ANIMALS:

    Fish bowl cleaner Eliminate that ugly deposit in the gold fish tank by rubbing it with a cloth dipped in vinegar and rinsing well.
     Eliminate animal urine stains from carpet. Blot up urine with a soft cloth, flush several times with lukewarm water, and then apply a mixture of equal parts vinegar and cool water. Blot up, rinse, and let dry.
    Cleaning up vomit. Clean up big chunks from area. Then, in a mixing bowl, add 2 cups warm water and a tablespoon of salt. Once the salt is dissolved, mix in 1/2 cup white vinegar, 1 tbsp clear dish or laundry soup and 2 tbsp rubbing alcohol. Grab a sponge and mix it into your vomit stain. Blot it over the stain so the mix is soaked in everywhere. Grab an old towel and blot up the mixture. And sprinkle with baking soda for odor control.
    Deter ants. Spray vinegar around door and window frames, under appliances, and along other known ant trails.
     Remove skunk odor from a dog. Rub fur full strength vinegar; rinse.
    Keep cats away. Sprinkle vinegar on an area to discourage cats from walking, sleeping, or scratching on it.
     Keep dogs from scratching ears. Clean the inside of the ears with a soft cloth dipped in diluted vinegar.
    Keep away fleas and mange. Add a little vinegar to your pet's drinking water.
    Keep chickens from pecking each other. Add cider vinegar to their drinking water.
    Clean milking equipment. Rinse with vinegar to leave system clean, odorless, and bacteria free without harmful chemical residue.
    Clean up bird poop by spraying area with vinegar and wiping away with sponge or cloth. This will also disinfect the area.
    Keep bugs away. Have a shallow dish with cider vinegar away from your food. By the end of the night you will have a bowl full of bugs. 

CARS & TOOLS:

     Polish car chrome. Apply full strength.
     Clean rust from tools, bolts, and spigots. Soak the rusted tool, bolt, or spigot in undiluted vinegar overnight.
    Keep car windows frost free. Coat the windows the night before with a solution of three parts vinegar to one part water.
    Clean your windshield wipers with vinegar to keep them functioning properly

HEALTH & BEAUTY:

      Dampen your appetite. Sprinkle a little vinegar on prepared food to take the edge off your appetite.
     Soothe a bee or jellyfish sting. Dot the irritated area with vinegar and relieve itching.
     Relieve itching by using a cotton ball to dab mosquito and other bug bites with Vinegar straight from the bottle.
     Relieve sunburn by lightly rubbing it with vinegar. You may have to reapply.
     Take 1 cup of vinegar and warm water into a large glass and use to rinse your hair after you shampoo. Vinegar adds highlights to brunette hair, restores the acid mantel, and removes  soap film and sebum oil.
    You take 1 tablespoon full and swallow when you have the hiccups. It stops them instantly.
    Relieve dry and itchy skin. Add 2 tablespoons to bath water.
    Fight dandruff, by rinsing with vinegar and 2 cups of warm water, after shampooing.
    Soothe a sore throat. Put a teaspoon of vinegar in a glass of water. Gargle, and then swallow.
    Cure for colds. Mix one-quarter cup Apple Cider Vinegar with one-quarter cup honey. Take one tablespoon six to eight times daily.
    Treat sinus infections and chest colds. Add 1/4 cup or more vinegar to the vaporizer.
     Feel good recipe. A teaspoon of apple cider vinegar in a glass of water, with a bit of honey added for flavor, will take the edge off your appetite and give you an overall healthy feeling.
     Remove fruit stains from hands. Rub with vinegar.
    Remove warts by applying a lotion of half cider vinegar and half glycerin. Apply daily to warts until they dissolve.
    Relieve arthritis. Before each meal, drink a glass of water containing two teaspoons Apple Cider Vinegar. Give it at least three weeks to start working.
     Remove corns by making a poultice of one crumbled piece of bread soaked in one-quarter cup Vinegar. Let poultice sit for one-half hour, then apply to the corn and tape in place overnight. If corn does not peel off by morning, reapply the poultice for several consecutive nights.
     Cure an upset stomach by drinking two teaspoons Apple Cider Vinegar in one cup water.
    Prevent yeast infections. Douche with one tablespoon vinegar to one quart warm water, to adjust the pH balance in the vagina.
     Clean dentures by soaking them overnight in vinegar, then brush away tartar with a toothbrush.
    Relieve cough by mixing one-half cup Apple Cider Vinegar, one-half cup water, one teaspoon cayenne pepper, and four teaspoons honey. Take one tablespoon when cough acts up. Take another tablespoon at bedtime.
    Wipe away hair spray residue off your flat or curling iron with a rag dipped in full strength vinegar.
    clean brushes or combs by letting them sit in a gallon of water with 1 cup vinegar
    Whiten your teeth. Dip your toothbrush in vinegar and brush your teeth. Do once a week and rinse afterwards. 
    Removing warts. Drip some cider vinegar onto a bandage pad and place on wart. Replace the bandage nightly and the wart should be gone in a week. 
    Get rid of blemishes by mixing 1 part vinegar and 10 parts water and dabbing the solution on a freshly cleaned face.
    Soften your cuticles by soaking your fingers in vinegar for 5 minutes. 
    Strengthen nails by dipping them in vinegar
    Dry up a cold sore by dabbing it with a cotton ball soaked in vinegar
    Prevent infections from spreading by spraying cuts with vinegar
    Disinfect retainers and invisalign braces in vinegar for a few minutes. 

LAUNDRY & OTHER CLOTHES CARE:

    Use in laundry to cut soap.
     Get rid of lint in clothes. Add 1/2 cup of vinegar to the rinse cycle.
     Prevent lint from clinging to clothes: Add one cup vinegar to each wash load.
     Keep bright colors from running. Immerse clothes in full strength vinegar for 10 minutes before washing.
      Freshen up the washing machine. Clean the hoses and unclog soap scum. Once a month pour one cup of vinegar into the washing machine and run the machine through a normal cycle, without clothes.
    Brighten fabric colors. Add 1/2 cup vinegar to the rinse cycle.
    Take grease off suede. Dip a toothbrush in vinegar and gently brush over grease spot.
    Remove tough stains. Gently rub on fruit, jam, mustard, coffee, tea. Then wash as usual.
     Get smoke smell out of clothes by adding a cup of vinegar to a bath tub of hot water. Hang clothes above the steam.
       Remove perspiration stains from clothes by applying one part vinegar to four parts water, then rinse.
     Deodorant and antiperspirants stains may be removed from clothing by lightly rubbing with distilled vinegar and laundering as usual.
    Cotton and wool blankets become soft, fluffy and free of soap odor if 2 cups of distilled vinegar are added to the rinse cycle of the wash.
     Clothes will rinse better if a cup of vinegar is added to the last rinse water. The acid in vinegar is too mild to harm fabrics but strong enough to dissolve the alkalis in soaps and detergents.
     When dyeing fabric, add a cup full of distilled vinegar to the last rinse to set the color.
    Nylon hose will look better and last longer if 1 tablespoon of vinegar is added to the rinse water when washing.
     To obtain a sharper crease in your knit fabrics, dampen them with a cloth wrung out from a solution of 1/3 distilled vinegar and 2/3 water. Place a brown paper bag over the crease and iron.
      Excess laundry suds that develop during hand laundry may be eliminated by splashing a little vinegar into the second rinse. Follow this with another rinse in plain water.
     Deodorize a wool sweater: Wash sweater, then rinse in equal parts vinegar and water to remove odor.
     After a hem or seam is removed, there are often unsightly holes left in the fabric. These holes can be removed by placing a cloth, moistened with distilled vinegar, under the fabric and ironing.
      Unclog steam iron by pouring equal amounts of vinegar and water into the iron's water chamber. Turn to steam and leave the iron on for 5 minutes in an upright position. Then unplug and allow cooling. Any loose particles should come out when you empty the water.
     Clean a scorched iron plate by heating equal parts vinegar and salt in a small pan. Then rub the solution on the cooled iron surface to remove dark or burned stains.
    Tame stinky shoes by spraying the inside with vinegar, putting them in a bag and freezing them overnight. 
    Add 1/2 cup of vinegar to reduce static cling in your clothes. 


CLEANING IN THE KITCHEN:

    A mixture of salt and vinegar will clean coffee and tea stains from chinaware.
     Put vinegar on a cloth and let sit on the back of your kitchen faucet and it removes hard water stains.
    Vinegar can help to dissolve mineral deposits that collect in automatic drip coffee makers. Fill the reservoir with vinegar and run it through a brewing cycle. Rinse thoroughly with water when the cycle is finished. (Be sure to check the owner’s manual for specific instructions).
     Brass, copper and pewter will shine if cleaned with the following mixture. Dissolve 1 teaspoon of salt in 1 cup of distilled vinegar.
     Clean the dishwasher by running a cup of vinegar through the whole cycle once a month to reduce soap build up on the inner mechanisms and on glassware.
     Deodorize the kitchen drain. Pour a cup down the drain once a week. Let stand 30 minutes and then flush with cold water.
    Unclog a drain. Pour a handful of baking soda down the drain and add 1/2 cup of vinegar. Rinse with hot water.
     Eliminate onion odor by rubbing vinegar on your fingers before and after slicing.
    Clean and disinfect wood cutting boards by wiping with full strength vinegar.
    Cut grease and odor on dishes by adding a tablespoon of vinegar to hot soapy water.
     Clean a teapot by boiling a mixture of water and vinegar in it. Wipe away the grime.
    Clean and deodorize the garbage disposal by making vinegar ice cubes and feed them down the disposal. After grinding, run cold water through.
     Clean and deodorize jars. Rinse mayonnaise, peanut butter, and mustard jars with vinegar when empty.
     Get rid of cooking smells by letting a small pot of vinegar and water simmer on the stove.
     Freshen a lunchbox by soaking a piece of bread in vinegar and let it sit in the lunchbox over night.
     Clean the refrigerator by washing with a solution of equal parts water and vinegar.
    Clean stainless steel by wiping with vinegar dampened cloth.
     Clean china and fine glassware by adding a cup of vinegar to a sink of warm water. Gently dip the glass or china in the solution and let dry. Get stains out of pots by filling the pots with a solution of 3 tablespoons of vinegar to a pint of water. Boil until stain loosens and can be washed away.
     Clean food-stained pots and pans by filling the pots and pans with vinegar and let stand for thirty minutes. Then rinse in hot, soapy water.
     Clean the microwave by boiling a solution of 1/4 cup of vinegar and 1 cup of water in the microwave. Will loosen splattered on food and deodorize.
     Prevent soapy film on glassware by placing a cup of vinegar on the bottom rack of your dishwasher, run for five minutes, then run though the full cycle.
    The minerals found in foods and water will often leave a dark stain on aluminum utensils. This stain can be easily removed by boiling a solution of 1 tablespoon of distilled vinegar per cup of water in the utensil. Utensils may also be boiled in the solution.
    Unsightly film in small-necked bottles and other containers can be cleaned by pouring vinegar into the bottle and shaking. For tougher stains, add a few tablespoons of rice or sand and shake vigorously. Rinse thoroughly and repeat until clean or determined hopeless.
     After cleaning the bread box, keep it smelling sweet by wiping it down with a cloth moistened in distilled vinegar.
      To eliminate fruit stains from your hands, rub your hands with a little distilled vinegar and wipe them with a cloth.
     Grease buildup in an oven can be prevented by wiping with a cleaning rag that has been moistened in distilled vinegar and water.
     Formica tops and counters will shine if cleaned with a cloth soaked in distilled vinegar.
       No-wax linoleum will shine better if wiped with a solution of 1/2 cup of white vinegar in 1/2 gallon of water.
      Stains on hard-to-clean glass, aluminum, or porcelain utensils may be loosened by boiling in a solution of one part vinegar to eight parts water. The utensils should then be washed in hot soapy water.
    Do have stubborn stains on those aluminum or stainless steel pots and pans? Even if you just have burnt stains that won't come off, try this: boil 1 cup vinegar, 2 tablespoons baking powder and 1 cup water. Take a scouring pad and gently remove stains!
    Make Vinegar and lemon wedge ice cubes to deodorize your garbage disposal. 


COOKING IN THE KITCHEN:

     Prepare fluffier rice by adding a teaspoon of vinegar to the water when it boils.
     Make wine vinegar by mixing 2 tablespoons of vinegar with 1 teaspoon of dry red wine.
     Make buttermilk. Add a tablespoon of vinegar to a cup of milk and let it stand 5 minutes to thicken.
    Replace a lemon by substituting 1/4 teaspoon of vinegar for 1 teaspoon of lemon juice.
     Firm up gelatin by adding a teaspoon of vinegar for every box of gelatin used. To keep those molded desserts from sagging in the summer heat.
    Debug fresh vegetables by washing them in water with vinegar and salt. Bugs float off.
    Scale fish more easily by rubbing with vinegar 5 minutes before scaling.
     Freshen vegetables. Soak wilted vegetables in 2 cups of water and a tablespoon of vinegar.
     Boil better eggs by adding 2 tablespoons water before boiling. This keeps them from cracking.
     Marinating meat in vinegar kills bacteria and tenderizes the meat. Use one-quarter cup vinegar for a two to three pound roast, marinate overnight, and then cook without draining or rinsing the meat. Add herbs to the vinegar when marinating as desired.
    Make a delicious salad dressing by mixing 1 cup vinegar, 2 tablespoons garlic powder, 1/2 tablespoon salt, and 2 tablespoon oil. Add more of each by taste. Mix and serve. 
    Pickle anything!
    Tenderize tough meats by adding some vinegar in your marinade. 
    Use Vinegar and baking soda as a rising agent in vegan cake. (Someone has to try this for me!)


IN THE BATHROOM:

    Kill germs on bathroom fixtures by using one part vinegar to one part water in a spray bottle. Spray the bathroom fixtures and floor, then wipe clean.
    Sprinkle some baking soda around your faucets, tubs and toilets and pour some vinegar into each. Let it have its chemical reaction and clean away with a sponge. 
    Soap and stain build up can be removed from chrome and plastic fixtures if they are cleaned with a mixture of 1 teaspoon of salt and 2 tablespoons of distilled vinegar.
    Clean soap scum, mildew, and grime from bathtub, tile, and shower curtains. Simply wipe the surface with Vinegar and rinse with water.
    Stubborn stains can be removed from the toilet by spraying them with vinegar and brushing vigorously. The bowl may be deodorized by adding 3 cups of distilled vinegar. Allow it to remain for a half hour, then flush. Baking soda can also be added as an extra boost for tough stains. 
    Unclog a shower head by unscrewing it, remove the rubber washer, place the head in a pot filled with equal parts Vinegar and water, bring to a boil, then simmer for five minutes.
      Corrosion may be removed from shower heads or faucets by soaking them in diluted distilled vinegar overnight. This may be easily accomplished by saturating a terry cloth towel in vinegar and wrapping it around the shower head or faucet.
      Bath tub film can be removed by wiping with vinegar and then with baking soda. Rinse clean with water.
    Any stubborn stain (Hard water, mildew, the works) will come off when you heat up a cup of vinegar add in a tsp of Dawn dish soap (The blue kind) and put in a spray bottle. Spray the tub let it sit for 30 minutes or so and rinse it off. No scrubbing. Just clean. 

CLEANING THE HOUSE:

    Cleaning windows by using undiluted Vinegar in a spray bottle. Dry off with newspaper.
    Deodorize a room filled with cigarette smoke or paint fumes. Place a small bowl of vinegar in the room.
    Deodorize the air. Vinegar is a natural air freshener when sprayed in a room.
    Clean eyeglasses by wiping each lens with a drop of vinegar.
    Mix vinegar with linseed oil and use it to clean your wood
    Plastic can be cleaned and made anti-static by wiping down with a solution of 1 tablespoon of distilled vinegar to 1 gallon of water. This will cut down on the plastics' tendency to attract dust.
    The colors in carpets and rugs will often look like they have taken a new lease on life if they are brushed with a mixture of 1 cup of vinegar in a gallon of water.
    A mixture of one teaspoon of liquid detergent and 1 teaspoon of distilled vinegar in a pint of lukewarm water will remove non-oily stains from carpets. Apply it to the stain with a soft brush or towel and rub gently. Rinse with a towel moistened with clean water and blot dry. Repeat this procedure until the stain is gone. Then dry quickly, using a fan or hair dryer. This should be done as soon as the stain is discovered.
     Spots caused by cola-based soft drinks can be removed from 100 percent cotton, cotton polyester and permanent press fabrics if done so within 24 hours. To do it, sponge distilled vinegar directly onto the stain and rub away the spots. Then clean according to the directions on the manufacturer's care tag.
    Sponging away grease and dirt with a sponge dipped in distilled vinegar will keep exhaust fan grills, air-conditioner blades and grills dust free.
      Leather articles can be cleaned with a mixture of distilled vinegar and linseed oil. Rub the mixture into the leather and then polish with a soft cloth.
    Varnished wood often takes on a cloudy appearance. If the cloudiness hasn't gone through to the wood, the cloudiness can be removed by rubbing the wood with soft lint less cloth wrung out from a solution of 1 tablespoon of distilled vinegar in a quart of lukewarm water. Complete the job by wiping the surface with a soft dry cloth.
      Dirt and grime can be easily removed from woodwork with a solution of 1 cup of ammonia, 1/2 cup of distilled vinegar, and 1/4 cup of baking soda in a cup of warm water. This solution will not dull the finish or leave streaks.
     Stubborn rings resulting from wet glasses being placed on wood furniture may be removed by rubbing with a mixture of equal parts of distilled vinegar and olive oil. Rub with the grain and polish for the best results.
    Wood paneling may be cleaned with a mixture of 1 ounce of olive oil and 2 ounces of distilled vinegar in 1 quart of warm water. Moisten a soft cloth with the solution and wipe the paneling. The yellowing is then removed by wiping with a soft, dry cloth.
    You can re-use Swiffer's WetJet Solution bottle with 1 part vinegar 2 parts water and a few drops of scented herbal oils.
    Cleaning rugs. Clean dingy rugs by pouring some vinegar onto the ends of a clean push broom. Sweep life back into those rugs. You don't even have to rinse the solution away!
    Before you start painting a room, wipe the walls with a cloth dipped in vinegar and let dry. This will assure that dirt and grime are removed and the paint will adhere properly.

 IN THE OFFICE:

    Clean your mouse. If you have a mouse with a removable tracking ball still, use a 50/50 vinegar and water solution to clean it. Use a damp cloth from the solution to wipe down the ball, then use a cotton ball to clean out the debris from the inside of the mouse. Wait an hour or so before putting it back in to dry. 
    Clean dirt off of PC's, laptops, tablets. Make sure everything is turned off. Use a 50/50 vinegar and water solution with a damp microfiber cloth and wipe everything down. 
    Burnish your scissors. Use a dampened paper towel or towel in full strength vinegar and wipe down the blades. Dry them off with a towel. 

MISCELLANEOUS:

    Use vinegar in the steam cleaner to reduce soap bubbles.
    Soak new propane lantern wicks in vinegar for several hours. Let dry before using. Will burn longer and brighter
    Turn a chicken bone into rubber by soaking it in a glass of vinegar for three days. It will bend like rubber.
     Remove decals or bumper stickers by soaking a cloth in Vinegar and cover the decal or bumper sticker for several minutes until the vinegar soaks in. The decals and bumper stickers should peel off easily.
      Prevent patching plaster from drying by adding one tablespoon vinegar to the water when mixing to slow the drying time.
      To loosen old glue around rungs and joints of tables and chairs under repair, apply distilled vinegar with a small oil can.
     Soak a paint brush in hot vinegar, then wash out with warm, sudsy water to soften it up.
     Patent leather will shine better if wiped with a soft cloth which has been moistening with distilled vinegar.
     To add a pleasant scent to a room while at the same time removing an unpleasant odor, add cardamom or other fragrant spice to a bowl of distilled vinegar and place in the warmest corner of the room.
    Clean your Piano Keys. Use a solution with 1/2 cup vinegar and 2 cups water. Dampen a soft cloth in the solution and wipe away all the grime and prints. Use a second cloth to dry them off. Leave untouched for 24 hours. 
    Brighten up brickwork. Pour 1 cup of vinegar into a gallon of water. And go over them with a damp mop. You can also use this for your fireplace.
    Keep flies away from your pool by pouring vinegar around the edges. 

http://cupcakeapothecary.blogspot.com/2012/02/130-uses-for-vinegar.html

''WebDAV''
----
http://acidcow.com/pics/20140519/acid_picdump_121.jpg
http://www.iis.net/learn/publish/using-webdav/using-the-webdav-redirector

''Servers''
----
websales@unixsurplus.com
http://unixsurplus.com/products/supermicro-servers?pagesize=40
https://www.youtube.com/watch?v=gc8Iv7OmaFA
https://www.youtube.com/watch?v=erlCZRwmm-E
https://www.youtube.com/watch?v=FqFxeCJG4w4


http://www.bernardotech.org/2013/08/18/building-the-perfect-server-for-running-proxmox-ve/
http://www.bernardotech.org/2014/04/26/my-new-rackmount-server-build-for-proxmox-ve/
http://hardforum.com/forumdisplay.php?s=5d7dd6c9a3cf1d463274bd1fa1e725e4&f=34
http://community.spiceworks.com/topic/134390-raid-hdd-question-for-new-esxi-server


https://sites.google.com/site/eonstorage/zpool_notes
http://www.thecloudcalculator.com/calculators/disk-raid-and-iops.html
https://www.google.com/search?q=kvm+zfs&oq=kvm+zfs&aqs=chrome..69i57j0l5.1720j0j7&client=ubuntu-browser&sourceid=chrome&es_sm=94&ie=UTF-8#q=kvm+zfs&safe=off&start=10
https://www.google.com/search?q=libvirt+zfs&oq=libvirt+zfs&aqs=chrome..69i57j0.3239j0j7&client=ubuntu-browser&sourceid=chrome&es_sm=94&ie=UTF-8
https://groups.google.com/a/zfsonlinux.org/forum/#!topic/zfs-discuss/OI5dchl7d_8
http://serverfault.com/questions/564854/debian-kvm-and-location-for-vm-images-different-than-var-lib-libvirt-images
http://libvirt.org/storage.html
http://www.gossamer-threads.com/lists/openstack/dev/14448
''Ingredients''
* 1 tablespoon water
* 1 tablespoon Worcestershire sauce for chicken
* 1 teaspoon lemon juice
* 1 teaspoon Dijon-style mustard
* 4 3 - ounces boneless pork top loin chops, cut 3/4 to 1 inch thick
* 1/2-1 teaspoon lemon-pepper seasoning
* 1 tablespoon butter or margarine
* 1 tablespoon snipped fresh chives, parsley, or oregano

''Directions''
# For sauce, in a small bowl stir together the water, Worcestershire sauce, lemon juice, and mustard; set aside.
# Trim fat from chops. Sprinkle both sides of each chop with lemon-pepper seasoning. In a 10-inch skillet melt butter over medium heat. Add chops and cook for 8 to 12 minutes or until pork juices run clear (160 degrees F), turning once halfway through cooking time. Remove from heat. Transfer chops to a serving platter; cover with foil and keep warm.
# Pour sauce into skillet; stir to scrape up any crusty browned bits from bottom of skillet. Pour sauce over chops. Sprinkle with chives. Makes 4 servings.

''Nutrition Facts Per Serving:''
Servings Per Recipe: 4
PER SERVING: 131 cal., 5 g total fat (2 g sat. fat), 55 mg chol., 377 mg sodium, 1 g carb. 19 g pro.
''Ingredients''
1 tbsp Butter
2 tbsp  Coconut flour
1 large Egg
1 tbsp Heavy Whipping Cream
2 tbsp Water
1/8 tsp garlic powder We Use This
1/8 tsp Onion powder We Use This
1/8 tsp Dried Parsley We Use This
1/8 tsp salt
1/8 tsp black pepper
1/4 tsp Baking powder
1/4 cup Cheddar Cheese

''Instructions''
# Melt butter in a coffee mug by microwaving for 20 seconds.
# Add coconut flour, baking powder, and seasonings. Mix to incorporate with a fork.
# Add egg, water, cheese and heavy whipping cream. Mix until combined.
# Microwave for 3 minutes. Immediately remove from mug and allow to cool for 2 minutes.
# Slice and enjoy.


''Nutrition''
Calories: 392
Fat: 32g
Protein: 15g
Carbs: 9g
Fiber: 5g
''Net Carbs: 4g''

Recipe can be quickly added to MyFitnessPal - Search "KetoConnect - Easy Biscuit Recipe"
1. Make your own lotion soap.
Make your own lotion soap.
myellowumbrella.blogspot.com

You can customize with different kinds of molds, food coloring, and scented essential oils. Get the directions here.
2. Don’t leave soap sitting in water.
Don't leave soap sitting in water.

It will dissolve 50% faster.
3. Make your own liquid hand wash from a bar of soap.
Make your own liquid hand wash from a bar of soap.
bonnieprojects.blogspot.com

Get the directions here.

For foaming hand wash, re-fill the foaming dispenser with a mixture of one part dish soap (or body wash) and three parts water.
4. Make your own oily hair “dry cleaner.”
Make your own oily hair "dry cleaner."
onegoodthingbyjillee.com

This recipe uses 2 very inexpensive ingredients: rubbing alcohol and corn starch.
5. Try the “No Poo” method of cleaning hair.
Try the "No Poo" method of cleaning hair.
jezebel.com

Some people have had great success eliminating the whole wash-and-condition hair regime. They claim it rejuvenates the hair shaft and fixes any dandruff issues. Instead of using shampoo, massage baking soda into the scalp to clarify and follow with an apple cider vinegar hair rinse. Conditioner is usually a lemon juice/vinegar mix.

Read more about it here.
6. Switch from coffee to tea.
Switch from coffee to tea.
i.telegraph.co.uk

Easier said than done, but tea bags are usually cheaper than coffee beans.

Always brew tea in a teapot to maximize a single tea bag. You won’t get the bitter taste that comes with reusing. Or, better yet, use loose tea leaves, which are meant to be reused.
7. Make your own convenience food kits.
Make your own convenience food kits.
tipgarden.blogspot.com

Here’s a recipe on how to make homemade Hamburger Helper.
budgetsavvydiva.com

Try this recipe for homemade Bisquick.
redflycreations.blogspot.com

Get muffin, brownie, and waffle mix recipes here.
8. Learn how to make yogurt in a crock pot.
Learn how to make yogurt in a crock pot.
moneysavingmom.com

Click here for the full directions.
9. Make your own bread.
Make your own bread.
theitaliandishblog.com

This artisanal bread costs only 40 cents a loaf and requires no kneading.
10. Pour your leftover wine into ice cube trays and use them for cooking.
Pour your leftover wine into ice cube trays and use them for cooking.
theartofdoingstuff.com
11. Buy meat on sale and make freezer meals out of them.
Buy meat on sale and make freezer meals out of them.
thepeacefulmom.com

You’ll save time in the long run. Here’s a comprehensive list of freezer meals.

For added convenience, pre-portion and label them before you freeze to make defrosting a breeze.
12. Reuse your leftover scraps of food.
Reuse your leftover scraps of food.
nourishingourradiance.com

Put any leftover kale and celery stalks through a juicer.
bakedperfection.com

Make cookies with leftover pie crust.
jujugoodnews.com

Here’s a list of things you can do with leftover orange peels, beef fat, and melon rinds.
fullmeasureofhappiness.com

Reuse your leftover pickle brine to make incredibly simple pickled green tomatoes or pickled radishes.
13. Plant your green onion stubs — you’ll have a new bunch in just ten days.
Plant your green onion stubs — you'll have a new bunch in just ten days.
homemadeserenity.blogspot.com

The next time you’ve used up your green onions, put the white ends into a jar of water. They’ll start to grow almost immediately. This also works for celery stalks.
highdesertchronicles.com

Find out more about planting celery here.
14. Make your own seasonings.
Make your own seasonings.
d261z78q37tks5.cloudfront.net

Get recipes for taco seasoning, ranch dry mix, and pumpkin spice. They’ll taste better and eliminate a lot of the sodium fillers in store-bought spices.
15. Make your own microwave popcorn.
Make your own microwave popcorn.
thefrugalgirls.com

Not only will you save money, but you can use real butter and the seasonings of your choice.
16. Use an app to help you save while grocery shopping.
Use an app to help you save while grocery shopping.
pushpinsapp.com

Scan any item using a free app called Pushpin and automatically save with digital coupons.
17. Instead of eating out, learn how to make your favorite restaurant foods at home.
Instead of eating out, learn how to make your favorite restaurant foods at home.
buzzfeed.com

Check out this Pinterest board for recipes for a bunch of copycat recipes.

Here’s a good recipe for that famous ginger carrot dressing you get at sushi restaurants.
18. Make your own reusable Swiffer pads.
Make your own reusable Swiffer pads.
sewtakeahike.typepad.com

Check out the tutorial here.
19. Buy melamine foam instead of Magic Erasers.
Buy melamine foam instead of Magic Erasers.
ebay.com

You can get 30 of these for $5.90. Melamine foam is the main component of Magic Erasers.
20. Make your own laundry detergent.
Make your own laundry detergent.
mymerrymessylife.com

A box of regular Tide costs $28 for 68 loads these days. Using this recipe, you can squeeze 96 loads out of $2.88.
21. Save electricity by using the rapid wash setting on your washing machine.
Save electricity by using the rapid wash setting on your washing machine.
fabulesslyfrugal.com

You’ll notice a difference in your electricity bill.
22. Never buy dryer sheets again.
Never buy dryer sheets again.
budgetsavvydiva.com

Place a ball of aluminum foil in the dryer with your wet clothes. You can reuse it many, many times and it will remove static cling.
23. Instead of using paper towels, make your own cleaning cloths out of flour sacks.
Instead of using paper towels, make your own cleaning cloths out of flour sacks.
onegoodthingbyjillee.com

There’s minimal sewing involved, and one flour sack makes 16 cloths.
24. Store your makeup-removing face wipes upside down, and cut them in half.
Store your makeup-removing face wipes upside down, and cut them in half.
sprinkleofglitter.blogspot.com

Storing them upside down will help them retain moisture. And they’ll go the extra mile if you cut each one in half.
25. Make mascara last 3x longer.
Make mascara last 3x longer.

When it starts drying out, just add a couple drops of saline solution.
26. Squish your toilet paper rolls to avoid any wasteful unraveling.
Squish your toilet paper rolls to avoid any wasteful unraveling.
frugalistafiles.ca

This is especially helpful if you have kids who consistently use too much toilet paper.
27. Do your waxing at home.
Do your waxing at home.
myamericanconfessions.blogspot.com

Sally Hansen wax strips come with a $1 coupon in every box, so you’ll save even more money.
28. Sharpen a disposable razor on a pair of jeans and it’ll last up to 6 months.
Sharpen a disposable razor on a pair of jeans and it'll last up to 6 months.
budgetsavvydiva.com

Slide your razor across the entire length of jeans 10-20 times to take the nicks out of the blade. Then switch directions. Also, be sure to prevent oxidation/rust by keeping the razor dry between uses.
29. Repair your bras before buying a new one.
Repair your bras before buying a new one.
chaoticallycreative.com

Don’t throw your bra out when the underwire starts coming out. Here’s an easy way to fix your bra in ten seconds with moleskin.
30. If you shop at Target, here are some tips:
If you shop at Target, here are some tips:
pinterest.com

“EVERY Target shopper NEEDS to know this: If the price ends in 8, it will be marked down again. If it ends in a 4, it’s the lowest it will be. Target’s mark down schedule. - MONDAY: Kids’ Clothing, Stationery (office supplies, gift wrap), Electronics. TUESDAY: Women’s Clothing and Domestics. WEDNESDAY: Men’s Clothing, Toys, Health and Beauty. THURSDAY: Lingerie, Shoes, Housewares. FRIDAY: cosmetics.”

Another Target tip: get Target coupons online and STACK them with manufacturers’ coupons.
31. Use GasBuddy.com to compare gas prices in your area.
Use GasBuddy.com to compare gas prices in your area.
onegoodthingbyjillee.com

Just enter in your zip code. It’s also available in app form.
32. If you’re an avid online shopper, use a service like eBates to get cash back.
If you're an avid online shopper, use a service like eBates to get cash back.
thesimplemoms.com

You might get anywhere between 1%-12%, but eventually it all adds up.
33. Buy your essentials from AliExpress.com, if you don’t mind long shipping times.
Buy your essentials from AliExpress.com, if you don't mind long shipping times.
aliexpress.com

Shipping can take upwards of 3 weeks, but where else can you get bamboo fiber socks for 81 cents apiece (with free shipping)?

Two tips: don’t expect the best quality, and do your research.
34. Displace water in your toilet tank with a filled plastic bottle.
Displace water in your toilet tank with a filled plastic bottle.
realsimple.com

You save around 10 gallons of water a day. A brick works, too.
35. Always check RetailMeNot.com before purchasing anything online.
Always check RetailMeNot.com before purchasing anything online.

Always check this site before hitting the checkout button. Or you can do a Google search for the company name + “coupon” or “promo code.”

Download the RetailMeNot app and you can attempt to use the coupons while shopping in-store.

If you can’t find a discount code, email customer service and ask for one, especially if it’s your first time shopping with the retailer.
36. Share a Costco, Sam’s Club, or BJ’s membership.
Share a Costco, Sam's Club, or BJ's membership.
cache.gawkerassets.com

Rules vary on whether a different credit card name can be used, but if you bring cash, you should be fine.

Or, just give $10 to a friend who has a Costco membership and ask them to buy you a $10 gift card. According to Consumerist, if you receive a gift card to Costco’s, you can get in to shop without a membership.
37. Sign up for the Victoria’s Secret mailing list.
Sign up for the Victoria's Secret mailing list.

Sure, you’ll get an annoying catalog every week, but you’ll also get a coupon for a FREE PANTY every month. Never buy underwear again!
38. If you live in a deregulated state, you’re allowed to shop around for the best electricity rates.
If you live in a deregulated state, you're allowed to shop around for the best electricity rates.
thebudgetdiet.com

Check out the list of deregulated states here.
39. Find out if you’re eligible for any discounts.
Find out if you're eligible for any discounts.
davetesh.com

Check out these lists: 149 military discounts, 66 teacher discounts, 85 student discounts, and 136 senior discounts.

Also, with a Triple A card, you can get 50% off prescription meds, along with many travel and movie discounts.
40. Recruit an affiliate buddy if you frequently buy things from Amazon.com.
Recruit an affiliate buddy if you frequently buy things from Amazon.com.
lifehacker.com

Sign up for their affiliate program, and convince a friend who also shops often on Amazon to do the same. When they use your affiliate code, you get up to 15% back on their purchase, and vice versa.
41. Borrow e-books from the library instead of buying them.
Borrow e-books from the library instead of buying them.
bookcovercafe.com

Your Kindle will pay for itself. Find out how here.
42. The most effective fly repellent only costs a penny.
The most effective fly repellent only costs a penny.
thehealthyhomeeconomist.com

Place a penny in a zip-loc bag filled with water. For some odd reason, it works.
43. Make your own pet toys from old t-shirts and socks.
Make your own pet toys from old t-shirts and socks.
irresistiblepets.net

Get instructions here.
irresistiblepets.net
44. Refill pet meds at a drugstore or online.
Refill pet meds at a drugstore or online.
animalkind.com

They usually cost more if you get them directly from the vet, so get the vet to write you a prescription and refill it elsewhere.

Read up on return policies and customer service if you decide to buy online.
45. Always pack a meal for your flight.
Always pack a meal for your flight.
lunchinabox.net

Airplane and airport food are so overpriced. Always prepare your own meal or at least bring a snack.
46. Keep things that have multiple uses on hand.
Keep things that have multiple uses on hand.
onegoodthingbyjillee.com

17 uses for Alka-Seltzer.
cupcakeapothecary.blogspot.com

130 uses for vinegar.
instructables.com

30 unusual uses for aluminum foil..
erecipecards.blogspot.com

52 uses for rotisserie chicken.
media-cache-ec3.pinterest.com

Unusual uses for olive oil.
onegoodthingbyjillee.com

A whole bunch of uses for hydrogen peroxide.

http://www.buzzfeed.com/peggy/46-penny-pinching-ways-to-save-a-lot-of-money-this?sub=1803976_792373#143pifj
3/4 cup of Borax 
3/4 cup of Washing Soda (or Soda Ash)
3/4 cup of Original Blue Dawn Dish soap
Lavender essential oil (get them HERE)
Hottest tap water
1-gallon container with a tight lid 

Dump the 34/ cup of Borax and Washing Soda in the bottom of a gallon jug with a tight lid – I used a funnel to not lose any.

Then, with the hottest tap water you can muster, fill your bottle with water to the bottom of the label.

Put the lid on tight and shake vigorously (BONUS: you will work on your underarm wings at the same time!)

Then add you 3/4 cup of Original Blue Dawn Dish Soap. 

Muster up the hottest tap water again and fill up your bottle until the bubbles reach the top (liquid line will be several inches down still).  I actually filled the 3/4 cup scoop and poured it into the funnel to fill it to wash out any remaining down and washing down into the bottle.

second-shake-dawn-liquid-detergent

Then put the lid on again and shake vigorously, switching the hard working side to the other side to get an equal underarm wing workout (no one wants just one wing ya know ;)).
    
Finally, let it set on the counter for a bit for the bubbles to settle.
Then top it off with lavender essential oil (about 10-12 drops) if you like and a slow flow of hot water to fill it up (slow flow to not create a lot of bubbles again).

To use:

Simply add 1/4 cup of this liquid detergent to a full wash load (this is enough!) and less for smaller loads. The amount is the same in both a top loader and an HE machine.  I have an HE machine now and I have been using this with no problems. It doesn’t create a lot of suds and so it’s great for HE machines.

http://thethriftycouple.com/2014/03/28/5-minute-liquid-laundry-detergent-recipe-quick-easy-and-cheap/
Serves: 6 servings


4 cups whole oats
¼ cup sucanat
1 cup coconut oil


Melt coconut oil in a medium-sized pan on the stove.  Remove from heat and stir in oats and sucanat.

Serve immediately, or allow it to sit a while to dry somewhat. We like it both ways.

Add-in options:

Nuts like almonds, pecans, or walnuts
Coconut flakes
Dried fruit like cranberries, raisins, or blueberries
Chocolate Chips
Vinegar and water 1:1 solution with 15 drops Lemon EO and 15 drops doTERRA’s On Guard oil blend. Shake well and use to clean hard surfaces.

This simple cleaner is great for hard surfaces. Vinegar has acetic acid which kills bacteria, viruses, mold, fungi and other pathogens. It helps remove build up in tubs, toilets, and sinks. Lemon is a wonderful de-greaser  and helps to lift stains. On Guard is a powerful essential oil blend that safely and effectively kills germs, viruses, bacteria, pathogens, fungi and mold. It is non toxic, bio-degradable and a great way to kill odors.

This blend is perfect to clean hard surfaces in the kitchen, bathroom, or any other room leaving behind a clean and invigorating scent.

http://naturallivingmamma.com/2012/07/29/apartment-homesteading-make-your-own-cleaning-products/
''Ingredients''
* 1 cup almond flour, sifted
* ½ Tablespoon baking powder
* ¼ teaspoon salt
* 1 cup heavy cream (or heavy cream and water)
* 2 Tablespoons oil
* 3 eggs

''Instructions''
# In large bowl, whisk together flour, baking powder and salt.
# Add cream, oil and eggs. Mix until blended.
# Pour into waffle maker to cook.

Notes
Makes 8 waffles

Serving Size: 1 waffle

Calories per serving: 241

Fat per serving: 23g

Delicious low carb and gluten free waffles are just as tasty as ones made with wheat flour. These almond flour waffles can be made ahead and frozen for quick and easy breakfast.

Per waffle:241 calories, 23g fat, 4.2g carbs, 1.5g fiber, 2.7g net carbs, 6.0g protein.
 1 tbsp vitamin E oil
1 tbsp grapeseed oil
1 oz grated beeswax
1-1/4 cups almond oil
1/4 cup coconut oil
1/2 cup water

In a double boiler over low-medium heat, melt the beeswax with the almond and coconut oil. Let cool. In a separate container, mix the remaining ingredients. Using a whisk or blender, mix these ingredients into the beeswax/almond/coconut mixture.

http://back2basichealth.blogspot.com/2012/04/diy-moisturizer-recipes.html
Can be found [[here|http://mariamindbodyhealth.com/amazing-bread/]]

* 3 cup blanched almond flour (10 oz)
* 10 TBS psyllium husk powder (no substitutes) (90 grams) (must be a fine powder, measure weight to be sure) (I use Jay Robb whole husk psyllium ground in a blender until half its origonal volume, other psyllium may not have the same results)
* 4 tsp baking powder
* 1 tsp Celtic sea salt
* 5 TBS apple cider vinegar (2 oz)
* 6 egg whites (7 oz)
* 1 1/2 cup BOILING water (12 oz)

NOTE:  Make sure to weigh your ingredients to ensure it rises properly and doesn’t get hallow and gummy.  Also, if you do weigh and grind your psyllium and still have a problem, try grinding the psyllium again.  We have a batch of psyllium that we ground and didn’t work.  Stay really wet.  So we ground it again and it works great!  Also, if your loaf looks nice and big but then deflates after removed from the oven, try reducing the baking powder to 3 teaspoons.

Preheat the oven to 350 degrees F. In a medium sized bowl, combine the flour, psyllium powder (no substitutes: flaxseed meal won’t work), baking powder and salt. Mix until dry ingredients are well combined.  Add in the eggs and vinegar and mix until a thick dough. Add boiling water into the bowl. Mix until well combined and dough firms up.

Form into a loaf and place into a greased bread pan (I used an 8X4 inch pan). Bake for 60-75 minutes. It should be somewhat firm to the touch and have a nice brown crust.  Remove from the oven and allow the bread to cool completely.

Makes 10 servings (2 slices per serving)

NUTRITIONAL COMPARISON (per serving)

Traditional Sub Bread = 200 calories, 3g fat, 10g protein, 40g carbs, 8g fiber
Almond Flour Sub (egg whites) = 220 calories, 14.2g fat, 8.2g protein, 20.7g carb, 16.6g fiber (57% fat, 14% protein, 35% carbs)
Here is a video of me making this amazing bread! 

https://vimeo.com/68001848
http://www.examiner.com/article/slender-megan-fox-shows-off-impressive-post-baby-weight-loss

//The Paleo diet is the most popular diet around today, and has a huge celebrity following, including Tim ~McGraw, Matthew ~McConaughey, Jessica Biel, Kellan Lutz, and supermodel Adriana Lima.

Proponents say the low-carb Paleo diet accelerates weight loss, lowers blood pressure, and prevents cancer, diabetes, heart disease, depression, and even Alzheimer's.//

''Ingredients''
* 1 cup heavy cream
* 1/2 cup sugar-free chocolate syrup
* 1/2 cup water
* 2 tablespoons cocoa powder
* 1 teaspoon vanilla extract

''Directions''
# In a medium saucepan combine cream, syrup, water and cocoa powder. Bring to a boil over medium heat.
# Reduce heat to low; cook, stirring occasionally, 5 minutes.
# Remove from heat and stir in vanilla.
# Pour mixture into two ice cube trays. Freeze 2 hours.
# Before serving transfer cubes into a food processor.
# Process until mixture is finely chopped and slushy.

''Nutrition Information''
Per Serving: cal. (kcal) 216, Fat, total (g) 23, fiber (g) 1, pro. (g) 2, Percent Daily Values are based on a 2,000 calorie diet
''Ingredients:''
2 strips of thick bacon, chopped fine (or see note)
1 small onion, minced
1 clove garlic, minced or 1/4 teaspoon garlic powder
1 small can (6 oz) tomato paste
1 can (12 oz) diet (sugar-free) cola - Splenda-sweetened preferred
¼ cup low carb (sugar-free) catsup, (or see note)
3 T mustard
1 Tablespoon Worcestershire sauce
1 pinch ground cloves
Hot sauce to taste

''Preparation:''
''Note 1:'' If you prefer to leave the bacon out, add 1-3 teaspoons of liquid smoke, to taste, near the end of the cooking. Alternatively, add some smoky flavor using 1 teaspoon of smoked paprika, or chipotle powder to taste.

''Note 2:'' If you can't find low carb catsup, leave it out, but add about a tablespoon of vinegar and some sweetener, to taste.

1) Fry the bacon in a saucepan - a 2 qt pan works well.

2) Add the onion and cook over medium until soft - 3-5 minutes. Add garlic at this point if you're using fresh and stir it for half a minute or so.

3) Add the rest of the ingredients, plus about half a cup of water. Stir well. 4) Simmer for 20-30 minutes. It will cook down a bit and flavors will combine. 5) Adjust the seasonings so you have the balance you want - you can add vinegar, artificial sweetener (liquid preferred), or hot sauce. (If it's too hot, adding more sweetener will tone it down.)

The recipe makes approximately 10 servings of 1/4 cup each. Each serving has about 3.5 grams of carbohydrate plus 1 gram of fiber.

[[Brokeass Gormet|https://web.archive.org/web/20130419080134/http://brokeassgourmet.com/articles/almond-flour-bagels]]

''Ingredients''
1½ cups almond flour, plus more as needed
2 tbsp flax seed meal
1½ tsp baking powder
1 tsp baking soda
1 tsp salt, plus more for sprinking Pantry
3 tbsp very cold butter (or use coconut butter)
2 eggs, lightly beaten

Preheat oven to 425 degrees F. Line a baking sheet with parchment paper and set aside.

In a mixing bowl, combine almond flour, flax seed meal, baking powder and soda and salt. Stir well.

Use 2 forks to cut the butter into the dry ingredients, working until it resembles small peas. Stir in the eggs until a very sticky dough forms (you may need to add a bit more almond flour to be able to handle it). This may also be done in a food processor.

Wet your hands lightly (this will make it easier to touch the dough without it sticking to you) and divide the dough into 6 (for medium-size bagels) or 12 (for mini bagels) equal pieces.

Use wet hands to very gently shape the pieces into bagels and arrange them on the prepared baking sheet. Flatten them to about 3/4” (they will rise in the oven).

Place in the freezer for 15 minutes, to set.

While the bagels are in the freezer, bring a medium pot of lightly salted water to a boil. Drop a bagel into the boiling water for 35-40 seconds, then remove it with a slotted spoon and return to the parchment paper. Repeat with remaining bagels.

Top the wet, boiled bagels with a sprinkle of salt and, if desired, any other toppings (I used poppy seeds and sesame seeds) and bake for 13-15 minutes, until slightly puffy and golden-brown on the edges.

Makes 6 regular or 12 mini bagels.
Pre-heat oven to 400. Cut the tortillas into wedges. 

Cut the tortillas into 8 wedges. Spread the tortilla wedges out on a baking sheet in a single layer, and spray with cooking spray of your choice.  Sprinkle lightly with salt.  Flip each tortilla over and spray and salt that side.  Bake for 10-11 minutes or until lightly golden.
1/4C Coconut oil (melted)
3 TSP infused oil of your choice or coconut oil
3 TSP Avocado or Jojoba oil
3 TSP Sweet Almond Oil, Grape seed or Rice bran oil)
40 drops essential oil of your choice 

**Note: Do not use citrus oils in a full body lotion because they can be photo toxic and cause increased rate of sun burn.

http://naturallivingmamma.com/2012/07/16/apartment-homesteading-make-your-own-personal-care-products/
Baking soda and salt in a 2:1 ratio. You can add Melaleuca, On Guard or Lemon essential oils to the mix (10 drops) for fungus and mold fighting power. Sprinkle around tub, toilet bowl or sink, scrub and rinse.



http://naturallivingmamma.com/2012/07/29/apartment-homesteading-make-your-own-cleaning-products/
''For the meatball mix:''
1 lb ground beef
1 egg
1/4 cup almond flour
1 tsp kosher salt
1/4 tsp black pepper
1/2 tsp garlic powder
1/2 tsp onion powder
1 tsp dried parsley
1 tsp Worcestershire sauce
2 Tbsp butter (for frying)

''For the sauce:''
1 Tbsp butter
2 cups sliced mushrooms (white or cremini)
1 cup sliced onions
1 clove garlic, minced
1 1/2 cups beef broth
3/4 cup sour cream
1/4 tsp xanthan gum
2 Tbsp fresh parsley, chopped
salt and pepper to taste

''Instructions''
# Combine the meatball ingredients (except the butter) in a medium bowl and mix well. Form into 12 meatballs. Heat the 2 Tbsp of butter in a large, nonstick saute pan. Cook the meatballs on medium heat in the butter until browned on all sides and cooked through (2-3 minutes per side.)
#Remove the meatballs from the pan and set aside. Add the 1 Tbsp of butter and the 2 cups of sliced mushrooms to the pan. Cook until the mushrooms are golden and fragrant (4-5 minutes.) Remove the mushrooms from the pan.
# Add the onions and garlic and cook for 3-4 minutes or until softened and translucent.
# Remove the onions from the pan.
# Add the beef broth to your pan and scrape the bottom to get all the yummy bits off. Whisk in your sour cream and xanthan gum until smooth.
# Add the meatballs, mushrooms, onions and garlic back to the pan and stir. Season with salt and pepper to taste. Simmer on low for 20 minutes. Garnish with the fresh parsley right before serving.

''Notes''
Approx nutrition info per serving: 452 calories, 34g fat, 6g net carbs, 24g protein
2 tablespoons organic coconut oil
2 tablespoons organic shea butter
2 tablespoons beeswax
3-5 drops of essential oils, your choice
A dozen chapstick containers or a container of some variety

Melt the beeswax, then add in the shea butter and coconut oil until melted. 

Once melted, use a medicine dropper (I used a turkey baister!) to put the melted oil into the containers.  I got sloppy, fumbled over the dog, shut my fingers in the stove door, slipped in a puddle of water and then squirted a turkey baister of hot melted oil mixture on my hand.  

The mixture will solidify as it cools. We topped these off after they started to cool, as the liquid shrinks down a wee bit.


// Return the tiddlers as a sorted array
TiddlyWiki.prototype.getTiddlers = function(field,excludeTag,includeTag)
{
          var results = [];
          this.forEachTiddler(function(title,tiddler)
          {
          if(excludeTag == undefined || !tiddler.tags.contains(excludeTag))
                        if(includeTag == undefined || tiddler.tags.contains(includeTag))
                                      results.push(tiddler);
          });
          if(field)
                   results.sort(function (a,b) {if(a[field] == b[field]) return(0); else return (a[field] < b[field]) ? -1 : +1; });
          return results;
}



//this function by Udo
function getParam(params, name, defaultValue)
{
          if (!params)
          return defaultValue;
          var p = params[0][name];
          return p ? p[0] : defaultValue;
}

window.old_timeline_handler= config.macros.timeline.handler;
config.macros.timeline.handler = function(place,macroName,params,wikifier,paramString,tiddler)
{
          var args = paramString.parseParams("list",null,true);
          var betterMode = getParam(args, "better", "false");
          if (betterMode == 'true')
          {
          var sortBy = getParam(args,"sortBy","modified");
          var excludeTag = getParam(args,"excludeTag",undefined);
          var includeTag = getParam(args,"onlyTag",undefined);
          var tiddlers = store.getTiddlers(sortBy,excludeTag,includeTag);
          var firstDayParam = getParam(args,"firstDay",undefined);
          var firstDay = (firstDayParam!=undefined)? firstDayParam: "00010101";
          var lastDay = "";
          var field= sortBy;
          var maxDaysParam = getParam(args,"maxDays",undefined);
          var maxDays = (maxDaysParam!=undefined)? maxDaysParam*24*60*60*1000: (new Date()).getTime() ;
          var maxEntries = getParam(args,"maxEntries",undefined);
          var last = (maxEntries!=undefined) ? tiddlers.length-Math.min(tiddlers.length,parseInt(maxEntries)) : 0;
          for(var t=tiddlers.length-1; t>=last; t--)
                  {
                  var tiddler = tiddlers[t];
                  var theDay = tiddler[field].convertToLocalYYYYMMDDHHMM().substr(0,8);
                  if ((theDay>=firstDay)&& (tiddler[field].getTime()> (new Date()).getTime() - maxDays))
                     {
                     if(theDay != lastDay)
                               {
                               var theDateList = document.createElement("ul");
                               place.appendChild(theDateList);
                               createTiddlyElement(theDateList,"li",null,"listTitle",tiddler[field].formatString(this.dateFormat));
                               lastDay = theDay;
                               }
                  var theDateListItem = createTiddlyElement(theDateList,"li",null,"listLink",null);
                  theDateListItem.appendChild(createTiddlyLink(place,tiddler.title,true));
                  }
                  }
          }

          else
              {
              window.old_timeline_handler.apply(this,arguments);
              }
}
This is my favorite fragrance blend. It always brings a smile to my face, peace to my soul and love to my heart. This smell is my happy place.

Equal Parts Epsom Salt and Himalayan or Dead Sea Salts
Lavender flowers and Peppermint leaves
Lavender and Peppermint Essential Oils, Vanilla Absolute or a high quality Vanilla Extract
Glass Container

Directions:

Layer the epsom salt, sea salts, and herbs to form strata in the glass jar. I add three to five drops of essential oil per layer and my layers are enough to fill the jar about 1/3 – 1/2 inch. This makes the salts look beautiful and smell amazing. I love using the Himalayan salts with the epsom salts because the mineral rich pink salt with the pure crystal color of the epsom salts is just gorgeous. Put some flowers on top and you have a beautiful presentation anyone would love.

1c. Homemade Mayo
1c. Sour Cream
1/4c. - 1c. Blue Cheese Crumbled

Mix all ingredients together.  Store in Fridge for 1 month
Use basic Dr. Bonner’s soap as a replacement for body wash. 


http://naturallivingmamma.com/2012/07/16/apartment-homesteading-make-your-own-personal-care-products/
''Ingreedients''
* 1 Lb Baby Bok Choy
* 2 Cloves Garlic, minced
* 1 Tbsp Low Sodium Soy Sauce
* 1/2 Tbsp Ginger root, minced
* 1/2 Tbsp Olive Oil
* 1 Tsp Sesame Oil
* 2-4 Tbsp Water
* Salt, Black and Red Pepper Flakes to taste

''Directions''
# Cut bok choy lengthwise, wash thoroughly and drain.
# In a large non-stick skillet, heat olive oil over medium-high heat. Cook garlic and ginger for about 30-60 seconds until fragrant; stir frequently. Add bok choy and toss until evenly coated with oil.
# Add soy sauce, sesame oil and water. Continue to toss bok choy for 1 to 2 minutes. Then cover and cook for about 2 minutes until bok choy is tender.
# Season with black pepper, salt and red pepper flakes.

Nutrition per 4-oz serving: 40 Cals; 4g Carb; 2g Fat; 2g Protein; 2g Dietary Fiber
''BASIC VANILLA MILKSHAKE RECIPE''
* 1 c crushed ice
* 1/4 c heavy cream
* 1 tsp vanilla extract
* 1 tsp stevia sweetener or to taste
* 1 c pure original unsweetened almond milk
* 2 tbsp melted coconut oil
Fill container the rest of the way up with almond milk and blend until smooth and icy.

''RICH CHOCOLATE MILKSHAKE''
* 1 cup crushed ice
* 1/2 cup heavy cream or to taste, or less if desired
* 1 teaspoon vanilla extract
* 1 tablespoon cocoa powder
* 1 teaspoon Stevia sweetener
* 2 tbsp melted coconut oil
Fill 2 cup container the rest of the way up with almond milk and blend until smooth and icy.
http://healinggourmet.com/healthy-recipes/keto-paleo-dinner-rolls/
http://ketodietapp.com/Blog/post/2014/11/12/Ultimate-Keto-Buns
http://mariamindbodyhealth.com/amazing-bread/
https://vimeo.com/68001848
http://mygluten-freetable.com/2014/04/the-gluten-free-bread-baking-with-psyllium-husks-powder-test/

https://www.reddit.com/r/keto/comments/650xr6/fp_i_am_excited_to_share_with_you_the_best_low/
Ingredients

Brownie Base:
* ½ cup butter
* 2 oz unsweetened chocolate, chopped
* ½ cup almond flour (Honeyville)
* ¼ cup cocoa powder
* pinch salt
* 2 large eggs
* ¾ cup Swerve Sweetener or granulated erythritol
* ¼ tsp vanilla
* ¼ cup walnuts or pecans, chopped

Cheesecake Filling:
* 1 lb cream cheese, softened
* 2 large eggs
* ½ cup Swerve Sweetener or granulated erythritol
* ¼ cup heavy cream
* ½ tsp vanilla extract

Instructions
# For the brownie base, preheat oven to 325F and butter a 9-inch springform pan. Wrap bottom of pan in foil.
# In a microwave safe bowl or glass measuring cup, melt butter and chocolate together in the microwave in 30 second increments. Whisk until smooth. Alternatively, you can melt them together over low heat in a small saucepan.
# In a small bowl, whisk together almond flour, cocoa powder and salt.
# In a large bowl, beat eggs, Swerve and vanilla until smooth. Beat in almond flour mixture, then butter/chocolate mixture until smooth. Stir in nuts.
# Spread evenly over bottom of prepared pan. Bake 15 minutes. Let cool 15 to 20 minutes.
# For the filling, reduce oven temperature to 300F.
# In a large bowl, beat cream cheese until smooth. Beat in eggs, Swerve, cream and vanilla until well combined.
# Pour filling over crust and place cheesecake on a large cookie sheet. Bake until edges are set and center just barely jiggles, 35 to 40 minutes. Remove from oven and let cool.
# Run a knife around edges to loosen and then remove sides of pan. Cover with plastic wrap and refrigerate at least 3 hours.
# Serve with sugar-free chocolate sauce or ganache.

Notes
Serves 10. Each serving has 6.2 g of carbs and 2.1 g of fiber. Total NET CARBS = 4.1 g.
[img[http://alldayidreamaboutfood.com/wp-content/uploads/2013/02/Brownie-Cheesecake-5.jpg]]
Read more at http://alldayidreamaboutfood.com/2013/02/brownie-cheesecake-low-carb-and-gluten-free.html#jqulQahe4ZIl8lej.99
Keto Brownie Recepies

[[One-Bowl Keto Brownies]] Is the one Cathy is looking for

https://www.youtube.com/watch?v=WfG35r3t9x4
(1.5 g carb per brownie)
cut up 1 stick of butter into small cubes 112g
keto chips 140g (3/4th cup)
melt 1 minute - mix to sauce 
unsweetend vanilla almond milk 84g (1/3rd) - mix in
3 room temp eggs
into food processor
powdered swerve 75g (1/2 cup)
coco powder 1 1/2 tbs (7g)
coconut flour 52g (1/3 cup)
baking powder 1/2 teaspoon
mix till disolved, don't overmix. 
8x8 glass baking tray, rub with water, put parchment paper in, spray with PAM
add mix, spread with spatuchla
cook at 350 for 30 to 35 minutes, pull out clean toothpick
let them cool down for 


http://www.bulletproofexec.com/wp-content/uploads/2013/10/Bulletproof-Diet-Infographic.pdf
http://www.soulcraft.co/info/bulletproofdiet.pdf
https://www.bulletproofexec.com/the-top-three-mistakes-youre-making-on-the-bulletproof-diet-and-how-to-fix-them/
http://www.bulletproofexec.com/category/bulletproofdiet/
http://www.bulletproofexec.com/the-complete-illustrated-one-page-bulletproof-diet/
http://www.bulletproofexec.com/rapid-fat-loss-protocol/




http://www.quantifiedbob.com/2013/01/bulletproof-diet-and-intermittent-fasting-my-30-day-results/
''Ingredients''
* 65g unsweetened coconut flakes/chips
* 95g pecans
* 95g walnuts
* 95g slivered almonds
* 2 tbsp butter
* 1 tbsp extra virgin coconut oil
* 1/3 cup erythritol/xylitol (adjust as per preferred sweetness)
* Generous pinch sea salt
* 1 tsp cinnamon

''Instructions''
# Chop the nuts roughly into uneven sized pieces for ~textural interest~ and combine in a large glass jug/bowl/vessel.
# In a non-stick frypan, heat the butter and coconut oil over medium-low heat.
# Pour the nuts in and stir quickly to coat with the melted mixture. Continue to stir frequently to ensure the nuts on the bottom of the pan don’t catch and burn. Everything will quickly become toasty golden and develop that delicious nutty fragrance. Be careful not to overcook – my batch very nearly went that way. Constant vigilance is needed with the wooden spoon to ensure even toasting and crunch.
#Remove the pan from heat and let cool for 5 minutes before stirring in the sea salt, cinnamon and erythritol. Leave to cool further for another hour before transferring to an appropriate airtight storage container.

I’ve served mine both with 60ml of cream, whipped, and coconut cream slightly watered down and definitely prefer the dairy option. I’m planning on purchasing full-fat Greek yoghurt to have with the cereal tomorrow morning.
''Ingredients''
* 8 oz almond milk
* 1 scoop protein powder
* 1 tbsp sugar free butterscotch pudding mix
* 1 tbsp peanut butter
* 5 cubes of ice
Blend
/***
| ''Name:''|CalendarPlugin|
| ''Description:''|Display monthly and yearly calendars.|
| ''Version:''|1.5.1.1 (modified from 1.5.1 for personal use)|
| ''Last Modified:''|27 January 2012 (by ~Secret-HQ)|
| ''Author:''|Eric Shulman<br>Original plugin authored by ~SteveRumsby<br>Modified by Scott Simmons (~Secret-HQ) for personal use|
| ''Shadow Tiddlers:''|[[CalendarPlugin_StyleSheet]]<br>[[CalendarPluginConfig]]|
| ''Requires:''|no additional tiddlers (self-contained)|
| ''Core Version:''|2.1|
| ''Source:''|[[http://www.TiddlyTools.com/#CalendarPlugin|http://www.TiddlyTools.com/#CalendarPlugin]]|
| ''License:''|unknown|

''NOTE:''
For //enhanced// date popup display, optionally install:

*[[DatePlugin]]
*[[ReminderMacros|http://remindermacros.tiddlyspot.com/]]

/***
!Usage

|{{{<<calendar>>}}}|full-year calendar for the current year|
|{{{<<calendar year>>}}}|full-year calendar for the specified year|
|{{{<<calendar year month>>}}}|one month calendar for the specified month and year|
|{{{<<calendar thismonth>>}}}|one month calendar for the current month|
|{{{<<calendar lastmonth>>}}}|one month calendar for last month|
|{{{<<calendar nextmonth>>}}}|one month calendar for next month|
|{{{<<calendar +n>>}}}<br>{{{<<calendar -n>>}}}|one month calendar for a month +/- 'n' months from now|
***/

/***
!!Configuration:

|''First day of week:''<br>{{{config.options.txtCalFirstDay}}}|<<option txtCalFirstDay>>|(Monday = 0, Sunday = 6)|
|''First day of weekend:''<br>{{{config.options.txtCalStartOfWeekend}}}|<<option txtCalStartOfWeekend>>|(Monday = 0, Sunday = 6)|

<<option chkDisplayWeekNumbers>> Display week numbers //(note: Monday will be used as the start of the week)//
|''Week number display format:''<br>{{{config.options.txtWeekNumberDisplayFormat }}}|<<option txtWeekNumberDisplayFormat >>|
|''Week number link format:''<br>{{{config.options.txtWeekNumberLinkFormat }}}|<<option txtWeekNumberLinkFormat >>|

Access additional configuration options by opening the CalendarPluginConfig shadow tiddler, saving it, and tagging it {{{systemConfig}}}.
***/

/***
!Version
***/

//{{{
version.extensions.CalendarPlugin = { major:1, minor:5, revision:1, date:new Date(2011,1,4), source:"http://www.TiddlyTools.com/#CalendarPlugin" };
//}}}

/***
!!History

|altRows|k
| date|version|changes|h
| 27 January 2012|1.5.1.1|@@color(RED):(~Secret-HQ)@@<br>Merged new version (1.5.1) from ~TiddlyTools with ~Secret-HQ tweaks from earlier versions.<br>Cleaned up and reformatted history and documentation.<br>Created a shadow tiddler with default CalendarPluginConfig values for overriding the default settings of CalendarPlugin.<br>Added user agent detection to determine whether CalendarPlugin_StyleSheet should include "display: block" (for IE) or exclude it (for other browsers).|
| 4 January 2011|1.5.1|Corrected parameter handling for {{{<<calendar year>>}}} to show entire year instead of just first month.<br>In {{{createCalendarMonthHeader()}}}, fixed next/previous month year calculation (using {{{parseInt()}}} to convert to numeric value).<br>Code reduction (setting options).|
| 22 August 2011|1.5.0.2|@@color(RED):(~Secret-HQ)@@<br>Moved styles into a shadow tiddler; the 100% width wasn't working after updating the ~TiddlyWiki core to version 2.6.4.|
| 7 January 2011|1.5.0.1|@@color(RED):(~Secret-HQ)@@<br>Tweaked styles to make the calendar scalable-width in the sidebar.|
| 31 April 2009|1.5.0|Rewrote {{{onClickCalendarDate()}}} (popup handler) and added {{{config.options.txtCalendarReminderTags}}}.<br>Partial code reduction/cleanup.<br>Assigned true version number (1.5.0).|
| 10 September 2008|--|Added {{{+n}}} (and {{{-n}}}) param to permit display of relative months.  (E.g., {{{+6}}} means //six months from now//; {{{-3}}} means //three months ago//.  Based on suggestion from Jean.|
| 17 June 2008|--|Added support for {{{config.macros.calendar.todaybg}}}.|
| 27 February 2008|--|In {{{handler()}}}, DON'T set hard-coded default date format, so that //customized// value (pre-defined in {{{config.macros.calendar.journalDateFmt}}}) is used.|
| 17 February 2008|--|In {{{createCalendarYear()}}}, fixed next/previous year calculation (using {{{parseInt()}}} to convert to numeric value).<br>Also, used {{{journalDateFmt}}} for date linking when NOT using [[DatePlugin]].|
| 16 February 2008|--|In {{{createCalendarDay()}}}, week numbers now created as ~TiddlyLinks, allowing quick creation/navigation to 'weekly' journals (based on request from Kashgarinn).|
| 8 January 2008|--|In {{{createCalendarMonthHeader()}}}, 'month year' heading is now created as ~TiddlyLink, allowing quick creation/navigation to 'month-at-a-time' journals.|
| 30 November 2007|--|Added {{{return false}}} to onclick handlers (to prevent IE from opening blank pages).|
| 23 August 2006|--|Added handling for weeknumbers (code supplied by Martin Budden.  (See ''wn**'' comment marks.)<br>Also, incorporated update by Jeremy Sheeley to add caching for reminders.  (See [[ReminderMacros]], if installed.)|
| 30 October 2005|--|In {{{config.macros.calendar.handler()}}}, used {{{tbody}}} element for IE compatibility.<br>Also, fixed year calculation for IE's {{{getYear()}}} function (which returns "2005" instead of "105").<br>Also, in {{{createCalendarDays()}}}, use {{{showDate()}}} function (see [[DatePlugin]], if installed) to render auto-styled date with linked popup.  Updated calendar stylesheet definition to use {{{.calendar}}} class-specific selectors and added text centering and margin settings.|
| 29 May 2006|--|Added {{{journalDateFmt}}} handling.|
***/

/***
!Code
***/

//{{{
// COOKIE OPTIONS
var opts={
	txtCalFirstDay:				0,

	txtCalStartOfWeekend:		5,

	chkDisplayWeekNumbers:		false,

	txtCalFirstDay:				0,

	txtWeekNumberDisplayFormat:	'w0WW',

	txtWeekNumberLinkFormat:	'YYYY-w0WW',
	txtCalendarReminderTags:		'reminder'
};
for (var id in opts) if (config.options[id]===undefined) config.options[id]=opts[id];


// INTERNAL CONFIGURATION
config.macros.calendar = {
	monthnames:['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'],
	daynames:['M','T','W','T','F','S','S'],
	todaybg:'#ccccff',
	weekendbg:'#c0c0c0',
	monthbg:'#e0e0e0',
	holidaybg:'#ffc0c0',
	journalDateFmt:'DD MMM YYYY',
	monthdays:[31,28,31,30,31,30,31,31,30,31,30,31],
	holidays:[ ] // for customization see [[CalendarPluginConfig]]
};
//}}}
//{{{
function calendarIsHoliday(date)
{
	var longHoliday = date.formatString('0DD/0MM/YYYY');
	var shortHoliday = date.formatString('0DD/0MM');
	for(var i = 0; i < config.macros.calendar.holidays.length; i++) {
		if(   config.macros.calendar.holidays[i]==longHoliday
		   || config.macros.calendar.holidays[i]==shortHoliday)
			return true;
	}
	return false;
}
//}}}
//{{{
config.macros.calendar.handler = function(place,macroName,params) {
	var calendar = createTiddlyElement(place, 'table', null, 'calendar', null);
	var tbody = createTiddlyElement(calendar, 'tbody');
	var today = new Date();
	var year = today.getYear();
	if (year<1900) year+=1900;

 	// get journal format from SideBarOptions (ELS 5/29/06 - suggested by MartinBudden)
	var text = store.getTiddlerText('SideBarOptions');
	var re = new RegExp('<<(?:newJournal)([^>]*)>>','mg'); var fm = re.exec(text);
	if (fm && fm[1]!=null) { var pa=fm[1].readMacroParams(); if (pa[0]) this.journalDateFmt = pa[0]; }

	var month=-1;
	if (params[0] == 'thismonth') {
		var month=today.getMonth();
	} else if (params[0] == 'lastmonth') {
		var month = today.getMonth()-1; if (month==-1) { month=11; year--; }
	} else if (params[0] == 'nextmonth') {
		var month = today.getMonth()+1; if (month>11) { month=0; year++; }
	} else if (params[0]&&'+-'.indexOf(params[0].substr(0,1))!=-1) {
		var month = today.getMonth()+parseInt(params[0]);
		if (month>11) { year+=Math.floor(month/12); month%=12; };
		if (month<0)  { year+=Math.floor(month/12); month=12+month%12; }
	} else if (params[0]) {
		year = params[0];
		if(params[1]) {
			month=parseInt(params[1])-1;
			if (month>11) month=11; if (month<0) month=0;
		}
	}

	if (month!=-1) {
		cacheReminders(new Date(year, month, 1, 0, 0), 31);
		createCalendarOneMonth(tbody, year, month);
	} else {
		cacheReminders(new Date(year, 0, 1, 0, 0), 366);
		createCalendarYear(tbody, year);
	}
	window.reminderCacheForCalendar = null;
}
//}}}
//{{{
// cache used to store reminders while the calendar is being rendered
// it will be renulled after the calendar is fully rendered.
window.reminderCacheForCalendar = null;
//}}}
//{{{
function cacheReminders(date, leadtime)
{
	if (window.findTiddlersWithReminders == null) return;
	window.reminderCacheForCalendar = {};
	var leadtimeHash = [];
	leadtimeHash [0] = 0;
	leadtimeHash [1] = leadtime;
	var t = findTiddlersWithReminders(date, leadtimeHash, null, 1);
	for(var i = 0; i < t.length; i++) {
		//just tag it in the cache, so that when we're drawing days, we can bold this one.
		window.reminderCacheForCalendar[t[i]['matchedDate']] = 'reminder:' + t[i]['params']['title']; 
	}
}
//}}}
//{{{
function createCalendarOneMonth(calendar, year, mon)
{
	var row = createTiddlyElement(calendar, 'tr');
	createCalendarMonthHeader(calendar, row, config.macros.calendar.monthnames[mon]+' '+year, true, year, mon);
	row = createTiddlyElement(calendar, 'tr');
	createCalendarDayHeader(row, 1);
	createCalendarDayRowsSingle(calendar, year, mon);
}
//}}}
//{{{
function createCalendarMonth(calendar, year, mon)
{
	var row = createTiddlyElement(calendar, 'tr');
	createCalendarMonthHeader(calendar, row, config.macros.calendar.monthnames[mon]+' '+ year, false, year, mon);
	row = createTiddlyElement(calendar, 'tr');
	createCalendarDayHeader(row, 1);
	createCalendarDayRowsSingle(calendar, year, mon);
}
//}}}
//{{{
function createCalendarYear(calendar, year)
{
	var row;
	row = createTiddlyElement(calendar, 'tr');
	var back = createTiddlyElement(row, 'td');
	var backHandler = function() {
		removeChildren(calendar);
		createCalendarYear(calendar, parseInt(year)-1);
		return false; // consume click
	};
	createTiddlyButton(back, '<', 'Previous year', backHandler);
	back.align = 'center';
	var yearHeader = createTiddlyElement(row, 'td', null, 'calendarYear', year);
	yearHeader.align = 'center';
	yearHeader.setAttribute('colSpan',config.options.chkDisplayWeekNumbers?22:19);//wn**
	var fwd = createTiddlyElement(row, 'td');
	var fwdHandler = function() {
		removeChildren(calendar);
		createCalendarYear(calendar, parseInt(year)+1);
		return false; // consume click
	};
	createTiddlyButton(fwd, '>', 'Next year', fwdHandler);
	fwd.align = 'center';
	createCalendarMonthRow(calendar, year, 0);
	createCalendarMonthRow(calendar, year, 3);
	createCalendarMonthRow(calendar, year, 6);
	createCalendarMonthRow(calendar, year, 9);
}
//}}}
//{{{
function createCalendarMonthRow(cal, year, mon)
{
	var row = createTiddlyElement(cal, 'tr');
	createCalendarMonthHeader(cal, row, config.macros.calendar.monthnames[mon], false, year, mon);
	createCalendarMonthHeader(cal, row, config.macros.calendar.monthnames[mon+1], false, year, mon);
	createCalendarMonthHeader(cal, row, config.macros.calendar.monthnames[mon+2], false, year, mon);
	row = createTiddlyElement(cal, 'tr');
	createCalendarDayHeader(row, 3);
	createCalendarDayRows(cal, year, mon);
}
//}}}
//{{{
function createCalendarMonthHeader(cal, row, name, nav, year, mon)
{
	var month;
	if (nav) {
		var back = createTiddlyElement(row, 'td');
		back.align = 'center';
		back.style.background = config.macros.calendar.monthbg;

		var backMonHandler = function() {
			var newyear = year;
			var newmon = mon-1;
			if(newmon == -1) { newmon = 11; newyear = parseInt(newyear)-1;}
			removeChildren(cal);
			cacheReminders(new Date(newyear, newmon , 1, 0, 0), 31);
			createCalendarOneMonth(cal, newyear, newmon);
			return false; // consume click
		};
		createTiddlyButton(back, '<', 'Previous month', backMonHandler);
		month = createTiddlyElement(row, 'td', null, 'calendarMonthname')
		createTiddlyLink(month,name,true);
		month.setAttribute('colSpan', config.options.chkDisplayWeekNumbers?6:5);//wn**
		var fwd = createTiddlyElement(row, 'td');
		fwd.align = 'center';
		fwd.style.background = config.macros.calendar.monthbg; 

		var fwdMonHandler = function() {
			var newyear = year;
			var newmon = mon+1;
			if(newmon == 12) { newmon = 0; newyear = parseInt(newyear)+1;}
			removeChildren(cal);
			cacheReminders(new Date(newyear, newmon , 1, 0, 0), 31);
			createCalendarOneMonth(cal, newyear, newmon);
			return false; // consume click
		};
		createTiddlyButton(fwd, '>', 'Next month', fwdMonHandler);
	} else {
		month = createTiddlyElement(row, 'td', null, 'calendarMonthname', name)
		month.setAttribute('colSpan',config.options.chkDisplayWeekNumbers?8:7);//wn**
	}
	month.align = 'center';
	month.style.background = config.macros.calendar.monthbg;
}
//}}}
//{{{
function createCalendarDayHeader(row, num)
{
	var cell;
	for(var i = 0; i < num; i++) {
		if (config.options.chkDisplayWeekNumbers) createTiddlyElement(row, 'td');//wn**
		for(var j = 0; j < 7; j++) {
			var d = j + (config.options.txtCalFirstDay - 0);
			if(d > 6) d = d - 7;
			cell = createTiddlyElement(row, 'td', null, null, config.macros.calendar.daynames[d]);
			if(d == (config.options.txtCalStartOfWeekend-0) || d == (config.options.txtCalStartOfWeekend-0+1))
				cell.style.background = config.macros.calendar.weekendbg;
		}
	}
}
//}}}
//{{{
function createCalendarDays(row, col, first, max, year, mon) {
	var i;
	if (config.options.chkDisplayWeekNumbers){
		if (first<=max) {
			var ww = new Date(year,mon,first);
			var td=createTiddlyElement(row, 'td');//wn**
			var link=createTiddlyLink(td,ww.formatString(config.options.txtWeekNumberLinkFormat),false);
			link.appendChild(document.createTextNode(
				ww.formatString(config.options.txtWeekNumberDisplayFormat)));
		}
		else createTiddlyElement(row, 'td');//wn**
	}
	for(i = 0; i < col; i++)
		createTiddlyElement(row, 'td');
	var day = first;
	for(i = col; i < 7; i++) {
		var d = i + (config.options.txtCalFirstDay - 0);
		if(d > 6) d = d - 7;
		var daycell = createTiddlyElement(row, 'td');
		var isaWeekend=((d==(config.options.txtCalStartOfWeekend-0)
			|| d==(config.options.txtCalStartOfWeekend-0+1))?true:false);
		if(day > 0 && day <= max) {
			var celldate = new Date(year, mon, day);
			// ELS 10/30/05 - use <<date>> macro's showDate() function to create popup
			// ELS 05/29/06 - use journalDateFmt 
			if (window.showDate) showDate(daycell,celldate,'popup','DD',
				config.macros.calendar.journalDateFmt,true, isaWeekend);
			else {
				if(isaWeekend) daycell.style.background = config.macros.calendar.weekendbg;
				var title = celldate.formatString(config.macros.calendar.journalDateFmt);
				if(calendarIsHoliday(celldate))
					daycell.style.background = config.macros.calendar.holidaybg;
				var now=new Date();
				if ((now-celldate>=0) && (now-celldate<86400000)) // is today?
					daycell.style.background = config.macros.calendar.todaybg;
				if(window.findTiddlersWithReminders == null) {
					var link = createTiddlyLink(daycell, title, false);
					link.appendChild(document.createTextNode(day));
				} else
					var button = createTiddlyButton(daycell, day, title, onClickCalendarDate);
			}
		}
		day++;
	}
}
//}}}
//{{{
// Create a pop-up containing:
// * a link to a tiddler for this date
// * a 'new tiddler' link to add a reminder for this date
// * links to current reminders for this date
// NOTE: this code is only used if [[ReminderMacros]] is installed AND [[DatePlugin]] is //not// installed.
function onClickCalendarDate(ev) { ev=ev||window.event;
	var d=new Date(this.getAttribute('title')); var date=d.formatString(config.macros.calendar.journalDateFmt);
	var p=Popup.create(this);  if (!p) return;
	createTiddlyLink(createTiddlyElement(p,'li'),date,true);
	var rem='\\n\\<\\<reminder day:%0 month:%1 year:%2 title: \\>\\>';
	rem=rem.format([d.getDate(),d.getMonth()+1,d.getYear()+1900]);
	var cmd="<<newTiddler label:[[new reminder...]] prompt:[[add a new reminder to '%0']]"
		+" title:[[%0]] text:{{store.getTiddlerText('%0','')+'%1'}} tag:%2>>";
	wikify(cmd.format([date,rem,config.options.txtCalendarReminderTags]),p);
	createTiddlyElement(p,'hr');
	var t=findTiddlersWithReminders(d,[0,31],null,1);
	for(var i=0; i<t.length; i++) {
		var link=createTiddlyLink(createTiddlyElement(p,'li'), t[i].tiddler, false);
		link.appendChild(document.createTextNode(t[i]['params']['title']));
	}
	Popup.show(); ev.cancelBubble=true; if (ev.stopPropagation) ev.stopPropagation(); return false;
}
//}}}
//{{{
function calendarMaxDays(year, mon)
{
	var max = config.macros.calendar.monthdays[mon];
	if(mon == 1 && (year % 4) == 0 && ((year % 100) != 0 || (year % 400) == 0)) max++;
	return max;
}
//}}}
//{{{
function createCalendarDayRows(cal, year, mon)
{
	var row = createTiddlyElement(cal, 'tr');
	var first1 = (new Date(year, mon, 1)).getDay() -1 - (config.options.txtCalFirstDay-0);
	if(first1 < 0) first1 = first1 + 7;
	var day1 = -first1 + 1;
	var first2 = (new Date(year, mon+1, 1)).getDay() -1 - (config.options.txtCalFirstDay-0);
	if(first2 < 0) first2 = first2 + 7;
	var day2 = -first2 + 1;
	var first3 = (new Date(year, mon+2, 1)).getDay() -1 - (config.options.txtCalFirstDay-0);
	if(first3 < 0) first3 = first3 + 7;
	var day3 = -first3 + 1;

	var max1 = calendarMaxDays(year, mon);
	var max2 = calendarMaxDays(year, mon+1);
	var max3 = calendarMaxDays(year, mon+2);

	while(day1 <= max1 || day2 <= max2 || day3 <= max3) {
		row = createTiddlyElement(cal, 'tr');
		createCalendarDays(row, 0, day1, max1, year, mon); day1 += 7;
		createCalendarDays(row, 0, day2, max2, year, mon+1); day2 += 7;
		createCalendarDays(row, 0, day3, max3, year, mon+2); day3 += 7;
	}
}
//}}}
//{{{
function createCalendarDayRowsSingle(cal, year, mon)
{
	var row = createTiddlyElement(cal, 'tr');
	var first1 = (new Date(year, mon, 1)).getDay() -1 - (config.options.txtCalFirstDay-0);
	if(first1 < 0) first1 = first1+ 7;
	var day1 = -first1 + 1;
	var max1 = calendarMaxDays(year, mon);
	while(day1 <= max1) {
		row = createTiddlyElement(cal, 'tr');
		createCalendarDays(row, 0, day1, max1, year, mon); day1 += 7;
	}
}
//}}}

/***
!!Templates (Shadow Tiddlers)
***/

//{{{
config.shadowTiddlers["CalendarPluginConfig"] = "/***"+"\n"+"This tiddler overrides some of the default settings of CalendarPlugin and is shadowed in CalendarPlugin.  To use it, edit this tiddler and add the {{{systemConfig}}} tag to it."+"\n"+"***/";
config.shadowTiddlers["CalendarPluginConfig"] += "\n"+"\n";
config.shadowTiddlers["CalendarPluginConfig"] += "/***"+"\n"+"''Override cookie settings:''"+"\n"+"***/"+"\n";
config.shadowTiddlers["CalendarPluginConfig"] += "//{{{"+"\n";
config.shadowTiddlers["CalendarPluginConfig"] += "config.options.txtCalFirstDay=6;"+"\n";
config.shadowTiddlers["CalendarPluginConfig"] += "config.options.txtCalStartOfWeekend=4;"+"\n";
config.shadowTiddlers["CalendarPluginConfig"] += "//}}}"+"\n";
config.shadowTiddlers["CalendarPluginConfig"] += "\n";
config.shadowTiddlers["CalendarPluginConfig"] += "/***"+"\n"+"''Override internal default settings:''"+"\n"+"***/"+"\n";
config.shadowTiddlers["CalendarPluginConfig"] += "//{{{"+"\n";
config.shadowTiddlers["CalendarPluginConfig"] += "config.macros.calendar.journalDateFmt=\"0DD MMM YYYY (DDD)\";"+"\n";
config.shadowTiddlers["CalendarPluginConfig"] += "//}}}"+"\n";
config.shadowTiddlers["CalendarPluginConfig"] += "\n";
config.shadowTiddlers["CalendarPluginConfig"] += "/***"+"\n"+"''Override fixed-date annual holidays:''"+"\n"+"***/"+"\n";
config.shadowTiddlers["CalendarPluginConfig"] += "//{{{"+"\n";
config.shadowTiddlers["CalendarPluginConfig"] += "config.macros.date = {"+"\n";
config.shadowTiddlers["CalendarPluginConfig"] += "  holidays: [ '01/01', '02/14', '04/01', '05/01', '07/04', '10/31', '11/24', '12/24', '12/25', '12/26', '12/31' ]"+"\n";
config.shadowTiddlers["CalendarPluginConfig"] += "  // 'New Year\\'s Day', 'Valentine\\'s Day', 'April Fool\\'s Day', 'May Day', 'Independence Day (U.S.)', 'Halloween', 'Thanksgiving (U.S.)', 'Christmas Eve', 'Christmas', 'Boxing Day', 'New Year\\'s Eve'"+"\n";
config.shadowTiddlers["CalendarPluginConfig"] += "};"+"\n";
config.shadowTiddlers["CalendarPluginConfig"] += "//}}}";
//}}}

/***
!!Styles
***/

//{{{
browserUserAgent = navigator.appName;

if (browserUserAgent == "Microsoft Internet Explorer") {
   config.shadowTiddlers["CalendarPlugin_StyleSheet"] = "/*{{{*/"+"\n";
   config.shadowTiddlers["CalendarPlugin_StyleSheet"] += ".calendar {"+"\n";
   config.shadowTiddlers["CalendarPlugin_StyleSheet"] += "  width:100%;"+"\n";
   config.shadowTiddlers["CalendarPlugin_StyleSheet"] += "}"+"\n";
   config.shadowTiddlers["CalendarPlugin_StyleSheet"] += "\n";
   config.shadowTiddlers["CalendarPlugin_StyleSheet"] += ".calendar,"+"\n";
   config.shadowTiddlers["CalendarPlugin_StyleSheet"] += ".calendar table,"+"\n";
   config.shadowTiddlers["CalendarPlugin_StyleSheet"] += ".calendar th,"+"\n";
   config.shadowTiddlers["CalendarPlugin_StyleSheet"] += ".calendar tr,"+"\n";
   config.shadowTiddlers["CalendarPlugin_StyleSheet"] += ".calendar td {"+"\n";
   config.shadowTiddlers["CalendarPlugin_StyleSheet"] += "  display:block;"+"\n"; // only if userAgent = MSIE
   config.shadowTiddlers["CalendarPlugin_StyleSheet"] += "  text-align:center;"+"\n";
   config.shadowTiddlers["CalendarPlugin_StyleSheet"] += "}"+"\n";
   config.shadowTiddlers["CalendarPlugin_StyleSheet"] += "\n";
   config.shadowTiddlers["CalendarPlugin_StyleSheet"] += ".calendar,"+"\n";
   config.shadowTiddlers["CalendarPlugin_StyleSheet"] += ".calendar a {"+"\n";
   config.shadowTiddlers["CalendarPlugin_StyleSheet"] += "  margin:0px !important;"+"\n";
   config.shadowTiddlers["CalendarPlugin_StyleSheet"] += "  padding:0px !important;"+"\n";
   config.shadowTiddlers["CalendarPlugin_StyleSheet"] += "}"+"\n";
   config.shadowTiddlers["CalendarPlugin_StyleSheet"] += "\n";
   config.shadowTiddlers["CalendarPlugin_StyleSheet"] += ".fixedWidthCalendar {"+"\n";
   config.shadowTiddlers["CalendarPlugin_StyleSheet"] += "  width:140px !important;"+"\n";
   config.shadowTiddlers["CalendarPlugin_StyleSheet"] += "}"+"\n";
   config.shadowTiddlers["CalendarPlugin_StyleSheet"] += "/*}}}*/";
}

else if (browserUserAgent != "Microsoft Internet Explorer") {
   config.shadowTiddlers["CalendarPlugin_StyleSheet"] = "/*{{{*/"+"\n";
   config.shadowTiddlers["CalendarPlugin_StyleSheet"] += ".calendar {"+"\n";
   config.shadowTiddlers["CalendarPlugin_StyleSheet"] += "  width:100%;"+"\n";
   config.shadowTiddlers["CalendarPlugin_StyleSheet"] += "}"+"\n";
   config.shadowTiddlers["CalendarPlugin_StyleSheet"] += "\n";
   config.shadowTiddlers["CalendarPlugin_StyleSheet"] += ".calendar,"+"\n";
   config.shadowTiddlers["CalendarPlugin_StyleSheet"] += ".calendar table,"+"\n";
   config.shadowTiddlers["CalendarPlugin_StyleSheet"] += ".calendar th,"+"\n";
   config.shadowTiddlers["CalendarPlugin_StyleSheet"] += ".calendar tr,"+"\n";
   config.shadowTiddlers["CalendarPlugin_StyleSheet"] += ".calendar td {"+"\n";
   config.shadowTiddlers["CalendarPlugin_StyleSheet"] += "  text-align:center;"+"\n";
   config.shadowTiddlers["CalendarPlugin_StyleSheet"] += "}"+"\n";
   config.shadowTiddlers["CalendarPlugin_StyleSheet"] += "\n";
   config.shadowTiddlers["CalendarPlugin_StyleSheet"] += ".calendar,"+"\n";
   config.shadowTiddlers["CalendarPlugin_StyleSheet"] += ".calendar a {"+"\n";
   config.shadowTiddlers["CalendarPlugin_StyleSheet"] += "  margin:0px !important;"+"\n";
   config.shadowTiddlers["CalendarPlugin_StyleSheet"] += "  padding:0px !important;"+"\n";
   config.shadowTiddlers["CalendarPlugin_StyleSheet"] += "}"+"\n";
   config.shadowTiddlers["CalendarPlugin_StyleSheet"] += "\n";
   config.shadowTiddlers["CalendarPlugin_StyleSheet"] += ".fixedWidthCalendar {"+"\n";
   config.shadowTiddlers["CalendarPlugin_StyleSheet"] += "  width:140px !important;"+"\n";
   config.shadowTiddlers["CalendarPlugin_StyleSheet"] += "}"+"\n";
   config.shadowTiddlers["CalendarPlugin_StyleSheet"] += "/*}}}*/";
}
//}}}

//{{{
store.addNotification("CalendarPlugin_StyleSheet",refreshStyles);
//}}}
/***
This tiddler overrides some of the default settings of CalendarPlugin and is shadowed in CalendarPlugin.  To use it, edit this tiddler and add the {{{systemConfig}}} tag to it.
***/

/***
''Override cookie settings:''
***/
//{{{
config.options.txtCalFirstDay=6;
config.options.txtCalStartOfWeekend=4;
//}}}

/***
''Override internal default settings:''
***/
//{{{
config.macros.calendar.journalDateFmt="0DD MMM YYYY (DDD)";
//}}}

/***
''Override fixed-date annual holidays:''
***/
//{{{
config.macros.date = {
  holidays: [ '01/01', '02/14', '04/01', '05/01', '07/04', '10/31', '11/24', '12/24', '12/25', '12/26', '12/31' ]
  // 'New Year\'s Day', 'Valentine\'s Day', 'April Fool\'s Day', 'May Day', 'Independence Day (U.S.)', 'Halloween', 'Thanksgiving (U.S.)', 'Christmas Eve', 'Christmas', 'Boxing Day', 'New Year\'s Eve'
};
//}}}
/*{{{*/
.calendar {
  width:100%;
}

.calendar,
.calendar table,
.calendar th,
.calendar tr,
.calendar td {
  text-align:center;
}

.calendar,
.calendar a {
  margin:0px !important;
  padding:0px !important;
}

.fixedWidthCalendar {
  width:140px !important;
}
/*}}}*/
This blend is soothing to the body and soul. It is perfect for anyone with a stressful job, nervous tension, or who is high strung. This blend is great for children too by replacing the lemon balm with catnip.

1/2 C Chamomile
1/2 C Lemon Balm
1/2 C Lavender
    
Enough oil to cover the herbs with an extra inch above them (about 3 C)

http://www.modernalternativehealth.com/2012/12/19/herbal-bath-oils-handmade-holidays/#
{{center{[img[images/Carbs_Are_Killing_You.png]]}}}
A 1:1 ratio of baking soda and hydrogen peroxide worked so well that that section of my carpet is a lot lighter and cleaner than the rest of my carpet! It is time to shampoo the carpets. It also worked well on blueberry stains on my daughters shirt. Make a paste from the baking soda and peroxide and spread it on the stain. Scrub well, let dry and vacuum once it is dry.



http://naturallivingmamma.com/2012/07/29/apartment-homesteading-make-your-own-cleaning-products/
* 1 small head cauliflower, cut into small florets (should yield 3 cups of cauliflower rice)
* 1 free-range organic egg, lightly beaten
* ½ cup / 1.7 oz / 50 gr shredded mozzarella cheese
* ½ teaspoon fine grain sea salt
* ¼ teaspoon ground black pepper

Grilled cheese

1 tablespoon butter, room temperature
⅓ cup / 3 oz / 85 gr sharp cheddar cheese, grated/shredded, room temperature

Directions

Cauliflower crust “bread” slices

Preheat oven to 450°F (220°C) and place a rack in the middle.
Line a baking sheet with parchment paper and liberally grease it with olive oil. Set aside.
In a food processor rice the cauliflower florets (it should be evenly chopped but not completely pulverized).
Transfer cauliflower rice (about 3 cups) to a microwave-safe dish and microwave on high for 8 minutes, until cooked.
Place the cauliflower rice in a tea towel and twist it to squeeze as much moisture as you can (I usually squeeze out over a cup of liquid). This is very important. The cauliflower rice needs to be dry, otherwise you’ll end up with mushy dough, impossible to use as slices of bread.
Transfer the cauliflower rice to a mixing bowl, add egg, mozzarella, salt, pepper and mix well.
Spread cauliflower mixture onto the lined baking sheet and shape into 4 squares. 
Place in the oven and bake for about 16 minutes until golden.
Remove and let cool 10 minutes before peeling them off the parchment paper (be careful not to break them!)

Assemble cauliflower crust grilled cheese

Heat a pan over medium heat.
Butter one side of each slice of cauliflower crust bread (preferably the top part).
Place one slice of bread in the pan, buttered side down, sprinkle with the cheese and top with the remaining slice of cauliflower crust bread, buttered side up.
Turn the heat down a notch and cook until golden brown, about 2 to 4 minutes.
Gently flip and cook until golden brown on the other side, about 2 to 4 minutes.

Nutrition facts

One grilled cheese yields 374 calories, 29 grams of fat, 8 grams of carbs and 23 grams of protein.

Makes 2 sandwiches
''Ingreedients''
* 1 Small Head of Cauliflower, cut into Florets
* 3 Slices Bacon, Diced
* 2 Large Eggs
* 2 Scallions, Sliced Thin
* 2 Tbsp. Sesame Oil
* 1 Tbsp. Fish Sauce
* 1 Tbsp. Soy Sauce
* 1 tsp. Freshly Ground Black Pepper
* 1 tsp. Minced Garlic
* 1 tsp. Minced Ginger

''Directions''
# Rice cauliflower florets in food processor.
# Dice bacon and scallions.
# Fry bacon until very crisp, remove and let cool.
# Add sesame oil to pan and start to fry the cauliflower.
# After a few minutes, push your cauliflower to one side of the pan, adding your garlic, ginger and scallions to the empty side.
# Add fish sauce, soy sauce and black pepper to the “rice”.
# Mix everything together and allow it to fry for a few minutes.
# Push all your ingredients to one side of the pan again. Add your eggs and allow them to cook.
# Add your bacon and mix everything in well, chopping the egg up to form smaller pieces.
''Ingredients''
* 1/2 large head cauliflower
* 1 tbsp olive oil
* 1 clove garlic, minced
* 1/2 cup grated cheddar cheese
* 1/2 cup grated mozzarella
* 1/3 cup cream 
* 2 tbsp fresh chives, chopped
* salt
* pepper

''Directions''
# Add the cauliflower to a food processor, and blitz until it resembles rice.
# Heat the oil in a large frying pan, and add the cauliflower 'rice'. Cook over a fairly high heat for several minutes, stirring occasionally, until the cauliflower starts to turn golden brown. Add the garlic and cook for 1 more minute.
# Turn the heat down to medium-low, and add the cheddar, mozzarella, cream, and half of the chives. Mix well until the cheeses have melted.
# Season generously, and serve topped with the remaining chives.
''Ingredients''
* 2 cups riced cauliflower
* 1 egg, beaten
* 2 strips of bacon, cooked and crumbled
* 1 tbsp almond flour
* Salt
* Pepper

''Directions''
# Cook the frozen riced cauliflower in a skillet for a few minutes to warn and remove moisture
# Press to remove more moisture
# Combine all ingredients and fry in a skillet over medium heat about two minutes each side.
Combine all ingredients and fry in a skillet over medium heat about two minutes each side.
8 Thick cut bacon
2 lbs (32 oz) Ground Pork
300 g Yellow Onion (1 medium onion)
300 g Green Pepper (3 small peppers)
6 oz Tomato Paste
1 can Diced Tomatoes, drained
1 pack McCormick Original Chili Seasoning
To taste Salt, pepper and garlic powder, onion powder, cayenne pepper

Chop onions and peppers and place in crockpot. Brown pork, add salt and pepper, drain, cool and put in crockpot. Cut bacon into small pieces, cook, drain, cool, and put in crockpot. Drain tomatoes and add to the crockpot. Add the tomato paste. Add seasoning packet to chili. Cook for 6 hours on low.
Type the text for 'Chaffle'
''Ingreedients''
* 1 1/2 Cup Cheddar Cheese
* 3 Tbsp. Ground Flaxseed Meal
*Seasonings of Your Choice

''Ingreedients''
# Preheat your oven to 425F.
# Create 2 Tbsp. mounds of cheddar cheese on a silicone non-stick pad.
# Spread out a pinch of flax seed over each chip until you use up all 3 Tbsp. of it. Try to distribute it evenly.
# Add the seasonings of your choice to each chip.
# Bake for 10 minutes and remove from the oven.
# Let them cool and transfer them to a plate. Enjoy!
Preheat oven to 400
cut cheese slice X style to create 4 chips
place on silpat
Lightly cover in flax meal
Light sprinkle of Mrs. Dash
light sprinkle of garlic salt
cook for 8 minutes
remove from oven and place on cooling rack
1 cup processed, raw cauliflower (should resemble coarse crumbs)
1 cup processed mozzarella shredded cheese
1/3 cup Parmesan cheese/shredded
2 eggs
1 tsp garlic powder
1 tsp onion powder
1/2 tsp pepper
1 Tbsp chives
fresh parsley, optional
sun-dried tomatoes, optional
Heat waffle maker until ready. Add scant 1/4 cups filled with batter on the griddle. Set the timer for 4-6 minutes, peeking after minute four. If the waffle maker sticks, let cook slightly longer. Remove once cooked. allow to cool on a plate. Refrigerate remaining.
Makes 6 waffles.
Nutritional Information per waffle: Calories: 135, Carbohydrates: 3g, Fiber: .8g, Net Carbohydrates: 2.2g, Protein: 11.7g, Fat: 8.5g
''Ingredients''
* 3 tbsp. Golden Flaxseed Meal
* 1 tbsp. Chia Seeds
* 2 cups Vanilla Unsweetened Coconut Milk (from the carton)
* 10 drop Liquid Stevia / 2 Scoops Stevia Powder
* 1/4 cup Mixed Berries
* 2 tbsp. MCT Oil
* 1/4 tsp. Xanthan Gum

''Directions''
Put ingredients in blender and blend for 1 minute.
''Ingredients''
*1 Tbsp chili powder
*1 tsp ground cumin
*¼ tsp cayenne pepper
*¼ tsp garlic powder
*½ tsp onion powder
*1 tsp salt
*¼ tsp (approximately) freshly ground pepper

''Directions''
*Add all of the ingredients to a bowl and stir to combine. 

Store in an air-tight container, away from heat and moisture for up to six months. 
We Triple or more this Recipe and use 2T. per pound of meat.
''Ingredients:''

Chili:
* 1 pound ground beef
* 2 cloves of garlic, minced
* 1 large bell pepper
* about 3/4 of a large onion, diced  (use more if you like sauteed onion)
* 2 tsp chili powder
* 1/2 tsp cumin
* 1/4 tsp pepper
* 1 tsp salt  (You could cheat and just use 2 tbs of a chili spice mix in place of the 4 spices above.)
* 1 tsp Worcestershire
* 1 tbs of sugar or sugar substitute (12 carbs in a tbs of sugar, fyi)
* 1/2 tsp celery salt
* 1 cup of tomato sauce
* 1 cup water
* 1 tbs tomato paste

For the rest of the casserole:
* 8 Bar S Franks sliced longways down the middle and cut in half
* 1 cup shredded cheddar or cheddar blend cheese (or more if you like a lot of cheese)
* more diced onions for garnish

''Directions:''
* Combine the ground beef, 2/3 of the chopped onions, peppers and garlic in large frying pan and saute until ground beef is browned.  Drain fat.
* Add spices, Worcestershire, sugar, tomato sauce, tomato paste and water to the pan.  stir to combine and simmer for 30 minutes.
* Optional step, but totally makes it just like real hot dog chili: Using a food processor or immersion blender, process the chili until the beef is in very small pieces.
* Lay hot dogs flat on the bottom of a 7 x 9 casserole dish.  Cover with chili.  (you should have enough to reserve a bit for those that are eating regular hot dogs and want chili.)  Spread 1 cup of cheese over chili and top with remaining onion.
* Bake at 400 F for about 15 to 20 minutes or until hot and bubbly!

Serve and Enjoy!
'Ingreedients'
* 2 oz Cream Cheese
* 1 Egg
* 1 Tablespoon Coconut Flour
* 1 Tablespoon Cocoa 
* 5 Scoops Stevia
* 1 Teaspoons Vanilla
* 1/4 Teaspoon Baking Soda
* 1/2 Teaspoons Cinnamon (optional)

If not room temperature, put cream cheese in microwave for 20 seconds
mix all ingredients, put half in mini waffle maker. 
A high-fat and very nutritious shake with added fiber and a rich, creamy chocolate taste. 6g net carbs for 500ml.

''Ingredients''
* Protein powder, low carb (under 3g carbs per serving), 25g (1 scoop)
* Cooking cream 35% fat, 100ml
* Dark cocoa powder, unsweetened, 1 tsp (5g)
* Sesame oil, 1 tbsp
* Psyllium husk, 1 tsp heaped (5g)
* Liquid sweetener, 5 drops

''Directions''
# Mix the protein powder, the cocoa and the psyllium husk, add 300ml water and shake very well. Use a low carb protein powder, of up to 3g carbs per scoop (2g, ideally). The psyllium husk will provide some much needed fiber that is otherwise missing from most ready-made shakes.
# Add the sesame oil and the sweetener, shake again. The sesame oil will give it a nice nutty flavor but it can be substituted by any other oil you prefer.
# Add the cream, mixing but not shaking (else it will become foamy).

See more at: http://webcache.googleusercontent.com/search?q=cache:At_62Klv-I0J:www.ketogenial.com/recipe/chocolate-cream-shake-with-fiber/+&cd=1&hl=en&ct=clnk&gl=us#sthash.1ZMgw8Er.dpuf
''Ingredients''

* 1 cup all-natural peanut butter
* 
1 cup almond flour

* 1/2 cup truvia,etc or (1/3 cup honey
)
* 1 teaspoon vanilla extract
* 3/4 cup dark chocolate chips

''Directions''
# In a medium bowl, mix together the peanut butter, almond flour, honey, and vanilla extract until the mixture thickens and sticks together.
# Roll the mixture into balls half an inch in diameter
# In a small bowl, melt the dark chocolate chips in the microwave no more than 15 seconds at a time.
# Using a spoon or fork, dip the peanut butter balls in the melted chocolate and toss to fully coat.
# Transfer the balls to a wax or parchment paper-lined baking sheet and refrigerate at least one hour.

'
NOTE:' For this recipe, be sure to use a no-stir, all-natural peanut butter.  Using a natural peanut butter that separates may cause the ball mixture to be too loose

Can be seen [[here|http://imgur.com/gallery/q2hL8]] or [[here|https://www.instagram.com/p/BMPPY0rh2af/]]
1 cup ketchup
1/2 teaspoon lemon juice
1 - 2 teaspoons prepared horseradish

In a bowl, stir together the ketchup, lemon juice and 1 tablespoon horseradish. If desired, add remaining horseradish.

Read more at http://www.simplywhisked.com/homemade-cocktail-sauce/#ebzOvALkZ5u3ycfm.99
Melt 1 tablespoon of Cocoa butter with 2 tablespoons of Jojoba in a double boiler over medium heat. Once it is melted, stir in 1 tablespoon of aloe Vera and stir until it is well mixed. This one is good for dehydrated skin.




http://back2basichealth.blogspot.com/2012/04/diy-moisturizer-recipes.html
1 Pound wild caught cod or shrimp
1/4 Cup full fat coconut milk
3 Tablespoons coconut flour
6 Tablespoons shredded coconut
1 Teaspoon paprika
1 Teaspoon garlic powder

# Preheat oven to 400 degrees
# Place the coconut milk in a shallow bowl
# in a separate shallow bowl, combine the other ingreedents
# Place the cod in the milk for 1 minute on each side. Dip in the flour mixture, coating both sides, place on silpat and bacn for 12 - 15 minutes.
Ingredients
* 1 lb ground pork/beef/chicken
* 12 ounces cabbage (we used a ready made cole slaw mix)
* 1/4 cup liquid aminos (or soy sauce)
* 2 tbsp chicken broth
* 1 tsp minced garlic
* 1 tsp ground ginger
* 2 tsp Sriracha
* 1 tbsp Sesame Oil
* 2 tbsp minced green onion
* 1 tsp Sesame Seeds

Instructions
# Heat a large skillet to medium-high heat. Once hot add in the ground pork. Using a spatula break up the chunks of meat and cook all the way through.
# Add in the liquid aminos, and chicken broth and stir to combine.
# Add in the minced garlic, ground ginger and sriracha and combine. Allow to cook for 1-2 minutes as the liquid reduces.
# Add in 12 ounces of cabbage (we buy plain cole slaw mix) and stir to combine coating all the cabbage in the liquid and seasonings. Once the cabbage has wilted to your liking remove from heat. For more crunch combine and immediately remove from heat, for less crunch cook down for 2-3 minutes.
# Drizzle with sesame oil and garnish with minced scallions and sesame seeds, if desired. Enjoy!
''Ingredients''
* 2 oz cream cheese
* 2 eggs
* 1 packet stevia (or any) sweetener
* 1/2 teaspoon cinnamon

''Ingredients''
* 2 oz cream cheese
* 2 eggs
* 1 packet stevia (or any) sweetener
* 1/2 teaspoon cinnamon
''Instructions''
* Put all ingredients in a blender or magic bullet. 
* Blend until smooth. 
* Let rest for 2 minutes so the bubbles can settle. 
* Pour 1/4 of the batter into a hot pan greased with butter or pam spray. 
* Cook for 2 minutes until golden, flip and cook 1 minute on the other side. 
* Repeat with the rest of the batter. 
* Serve with sugar free syrup (or any syrup of your choice) and fresh berries.

''Yield:'' Four 6-inch pancakes

''Serving Size:'' 1 pancake

''Approx nutrition info per batch:'' 344 calories, 29g fat, 2.5g net carbs, 17g protein

Read more at http://www.ibreatheimhungry.com/2012/01/cream-cheese-pancakes.html
''Indreedients''
*1/2 cup sliced mushrooms
*3 Tablespoons butter
*1/4 cup organic corn starch or arrowroot powder
*4 cups milk, divided
*1 teaspoon sea salt
*pepper to taste

''Directions''
*Begin by sauteing mushrooms and butter until mushrooms are tender.
[img[images/creamofmusroomsoup1.jpg]]
*In the meantime, shake the cornstarch or arrowroot powder in a jar with 1 1/2 cups of milk.
*Use a whisk to mix the milk mixture into the sauteed mushrooms, stirring constantly at medium heat.
*Slowly add remaining milk, salt and pepper.
*Stir with a whisk until smooth and thick.
[img[images/creamofmusroomsoup3.jpg]]
    7 Eggs
    ~2/3 cup of Heavy Whipping Cream (I used 1/2 cup at first, but added a splash later)
    8oz Sharp Cheddar Cheese, shredded
    8oz Mushrooms, sliced (I used crimini purely because they were on sale.)
    10 oz spinach (I used fresh, but frozen should work too)
    1/4 of a red onion, chopped finely (Not really Keto-friendly but it tastes good!)
    1 tbsp Butter
    Salt and Pepper

Preheat oven to 350. On the stove, sautee your onions and mushrooms in the butter until they’re cooked down (2 or 3 minutes). While those are doing their thing, in a big bowl, whisk the 7 eggs with the Heavy Cream, with 2 dashes of salt and a dash of pepper (more or less). 

Take the mushrooms and onions off the heat, and add the spinach. If you use fresh spinach, you’ll have to cook it down on the heat a little bit. Add it to the egg mixture and stir. (Rookie Mistake: So my boyfriend really wanted to help me cook, but we are still working on our kitchen communication. He didn’t exactly process that he needed to cook down the spinach, and added it to the egg mixture when it was still leafy. So the pictures are not what yours should look like! Oh well, we can try again round two.) 

Add the cheese and mix it up, and pour it into a GREASED pan (we used a square 8″x8″ one).

Bake at 350 degrees for about 50 minutes, depending on your pan. Let it sit for at least 10 minutes. Makes 9 hearty servings, and freezes well!



''Ingredients''
* 2 handfuls Spinach
* 2.5 oz. Cucumber, peeled and cubed
* 7 ice Cubes
* 1 cup Coconut Milk (from carton)
* 12 drops Liquid Stevia / 2 Dcoops Powdered Stevia
* 1/4 tsp. Xanthan Gum
* 1-2 tbsp. MCT Oil

''Directions''
# This one is super simple to make and you’ll have it ready in just under 5 minutes start to finish. Grab 2 handfuls of spinach and toss them in a blender, then add 7 ice cubes, 1 cup coconut milk (from the carton), 12 drops stevia, 1/4 tsp. xanthan gum, and 1-2 tbsp. MCT Oil. Peel the cucumber and cube it, and put that over the top.
# Blend the shake for 1-2 minutes or until all of the ingredients are well incorporated. You’ll still notice little bits of spinach floating around, but you can’t taste them in the texture, so don’t worry too much!
1 or 2 quart sized mason jars
A spray bottle
1-2 quarts White vinegar
Orange, grapefruit, lemon, or lime peels (any combination)
Optional: 3-4 drops lemon, grapefruit, or orange essential oil 

Stuff quart jar(s) about half full of citrus peels. Fill jars the rest of the way up with white vinegar.  Cover tightly with a lid and shake. Write the date so you don’t forget!

Steep peels and vinegar 2-3 weeks (The longer it sits, the more potent it will get!). Remove peels and strain through a fine strainer. Dilute 1:1 with water (one part citrus vinegar to one part water) and place in a spray bottle
    
Optional: add 3-4 drops essential oil to boost it’s cleaning power.  Use as you would your plain vinegar cleaner: on sinks, countertops, bathtubs, toilets, floors, etc.

http://www.theprairiehomestead.com/2012/04/diy-all-purpose-citrus-cleaner.html
1 1/2 cups water
1/4 cup liquid castile soap (buy castile soap on Amazon (affiliate link))
1/4 cup liquid vegetable glycerin 
5-10 drops of lemon essential oil (I use doTERRA oils exclusively in my home)
Glass spray bottle OR plastic squeeze-type bottle

Mix all ingredients together.

If using the essential oil, store the mixture in a glass container since lemon oil can disintegrate plastics. If you omit the essential oil, it can then be stored in a repurposed plastic bottle with a lid that allows you to squirt it out.

To use, shake well and apply liberally to spots and stains. Lightly rub the mixture into the fabric with your fingertips.

As with most spot removers, this one works best if you treat the spot immediately and allow it to soak before tossing it into the washing machine. Sometimes I’ll even allow the item to soak overnight before washing it.

    3/4 cup salt
    3/4 cup dried sage
    3/4 cup dried thyme
    3/4 cup brown sugar (or you could use sucanat, like I did here)
    3 tsp black pepper
    3 tsp rosemary
    1 tsp chili powder (more if you like yours spicy)

Mix ingredients in order in a jar.  Add an air tight lid and shake it up.  Let sit for at least 30 minutes before use to allow the spices to settle together.  To use, add 1/4 cup to each pound of meat.

For sausage like patties, mix the meat with the seasonings and then shape and fry.  To use as ground sausage for pizza toppings, spaghetti, biscuits and gravy, etc.  then you will add the seasonings as the meat is finishing browning, with up to 1 /3 cup water to blend in.

Store in air tight jar for up to 3 months.

http://thehomesteadinghippy.com/diy-sausage-seasoning/
    1 C Dr. Bonner’s Liquid Castille Soap (I use the fragrance free one)
    1 C Glycerine
    1 Tbsp Almond or Jojoba oil (Jojoba is more moisturizing and I prefer it in the winter)
    15-20 drops of Essential Oils (See my post “Essential Oils for Skincare”

Instructions

    Combine ingredients in a recycled shampoo bottle, shake well, and use like any other shampoo.
    This shampoo is fine to be stored in the shower and is good for a year.

http://naturallivingmamma.com/2013/01/21/easy-natural-diy-shampoo/

Did you ever finish a jar of pickles and then feel kinda guilty for pouring the leftover pickle juice down your drain? We had the same issue until we went to go make a fresh batch of pickled daikon and realized that instead of taking the trouble to buy and mix together vinegar, sugar and the other ingredients, we could just reuse the pickling liquid left from our favorite jar of dills. Follow our easy DIY instructions to reuse your own pickled radish, garlic or just make another batch of pickles!

MATERIALS:

- leftover pickle juice in a jar
- veggies you want to pickle (daikon, other radish or garlic work great)

STEP 1:

Wash your veggies thoroughly and chop them up.
STEP 2:

Pop your chopped up veggies in your leftover pickle juice and allow them to brine for a few days, then enjoy. That’s pretty much it!

Note: Typically, pickling entails sterilizing your jars and boiling them to start the pickling process. If you’re planning on storing your pickled veggies for a long time, you should definitely follow an actual canning recipe, but if you’re going to eat them soon after you make them using the method above, you really don’t need to as long as you practice common sense (wash your veggies thoroughly before adding to the brine).

http://inhabitat.com/diy-reuse-leftover-pickle-juice-to-make-homemade-pickled-daikon/2/
/***
| ''Name:''|DatePlugin|
| ''Description:''|Formatted dates plus popup menu with 'journal' link, changes and (optional) reminders.|
| ''Version:''|2.7.3.1 (modified from 2.7.3 for personal use)|
| ''Last Modified:''|29 January 2012 (by ~Secret-HQ)|
| ''Author:''|Eric Shulman<br>Modified by Scott Simmons (~Secret-HQ) for personal use|
| ''Shadow Tiddlers:''|[[DatePluginConfig]]|
| ''Requires:''|no additional tiddlers (self-contained)|
| ''Related:''|[[CalendarPlugin]]|
| ''Core Version:''|2.1|
| ''Source:''|[[http://www.TiddlyTools.com/#DatePlugin|http://www.TiddlyTools.com/#DatePlugin]]<br>[[http://www.TiddlyTools.com/#DatePluginConfig|http://www.TiddlyTools.com/#DatePluginConfig]]<br>[[http://www.TiddlyTools.com/#DatePluginInfo|http://www.TiddlyTools.com/#DatePluginInfo]]|
| ''License:''|http://www.TiddlyTools.com/#LegalStatements|
***/

/***
!Usage

This plugin provides a general approach to displaying formatted dates and/or links and popups that permit easy navigation and management of tiddlers based on their creation/modification dates.

Install this plugin, add the tag {{{systemConfig}}}, and reload your ~TiddlyWiki to make the plugin available.

!!Documentation

This plugin displays formatted dates, for the specified year, month, day using number values or mathematical expressions such as (Y+1) or (D+30).  Optionally, you can create a link to a 'dated tiddler' for quick blogging or create a popup menu that includes the dated tiddler link plus links to tiddlers that were created/changed on that date, or are tagged with that date and, if the [[ReminderMacros|http://remindermacros.tiddlyspot.com/]] plugin is installed, any pending reminders for next month.  There is also a public API, so other plugins can embed a variety of formatted date output, links, and/or popup menus.

{{{
<<date mode date format linkformat>>
}}}

//All parameters are optional.//

*''mode''<br>is one of:

**''display'' (default)<br>shows a formatted date
**''link''<br>creates a link to a specific 'date titled' tiddler
**''popup''<br>creates a popup command containing a dated tiddler link, plus links to changes and reminders.

*''date'' (or ''tiddler'' or ''tiddler:title'' or ''today'' or ''filedate'')<br>enter ANY date (not just today) as space-separated year, month, and day parameters (e.g., 2011 4 23).  You can use pre-defined variables, Y, M, and D for the current year, month and day, repectively.  These variables can be combined with simple mathematical expressions to calculate ''relative dates'' (e.g., D+1 = tomorrow, M-1 = last month, Y+1= next year, etc.)  Alternatively, you can use special keywords in place of the year/month/day parameters to access tiddler and file dates:

**''tiddler'' displays the modification date of the current tiddler.
**''tiddler://name-of-tiddler//'' displays the modification date of a specific tiddler.
**''today'' shows the current date.
**''filedate'' shows the modification date of the entire document.  

*{{block{
''format'' (and ''linkformat'') (default: YYYY.0MM.0DD)<br>uses standard ~TiddlyWiki date formatting syntax to specify the title of the target tiddler.

>''DDD'' - day of week in full (eg, "Monday"), ''DD'' - day of month, ''0DD'' - adds leading zero
>''MMM'' - month in full (eg, "July"), ''MM'' - month number, ''0MM'' - adds leading zero
>''YYYY'' - full year, ''YY'' - two digit year, ''hh'' - hours, ''mm'' - minutes, ''ss'' - seconds
>
>//note: use of hh, mm or ss format codes is only supported with ''tiddler'', ''today'' or ''filedate'' values//
}}}

*{{block{
''linkformat''<br>specify an alternative date format so that the title of a 'dated tiddler' link can have a format that differs from the date's displayed format.  The default tooltip is same as the title of the linked tiddler.  You can customize the tooltip by modifying the definition in [[DatePluginConfig]]:
{{{
config.macros.date.tipformat="YYYY.0MM.0DD"; // 'dated tiddler' tooltip format
}}}
}}}

You can adjust the 'lead time' for display of [[reminders|http://remindermacros.tiddlyspot.com/]] by modifying the definition in [[DatePluginConfig]]:

{{{
config.macros.date.leadtime=30; // find reminders up to 30 days from now
}}}

In addition to the macro syntax, DatePlugin also provides a public javascript API so that other plugins that work with dates (such as calendar generators, etc.) can quickly incorporate date formatted links or popups into their output:

{{{
showDate(place, date, mode, format, linkformat, autostyle, weekend);
}}}

Note that the javascript API supports two //optional// true/false parameters, in addition those provided by the macro interface:

*''autostyle''<br>font/background styles of formatted dates are automatically adjusted to show the date's status:  'today' is boxed, 'changes' are bold, 'reminders' are underlined, weekends, holidays, changes, and reminders each have a different background color to make them more visibly distinct from one another.
*''weekend''<br>true=day is a weekend, false=day is a weekday, default=automatically determine if a given date falls on a weekend.

!!!Examples

{{{The current date: <<date>>}}}
>The current date: <<date>>

{{{The current time: <<date today "0hh:0mm:0ss">>}}}
>The current time: <<date today "0hh:0mm:0ss">>

{{{Today's blog: <<date link today "DDD, MMM DDth, YYYY">>}}}
>Today's blog: <<date link today "DDD, MMM DDth, YYYY">>

{{{Recent blogs/changes/reminders: <<date popup Y M D-1 "yesterday">> <<date popup today "today">> <<date popup Y M D+1 "tomorrow">>}}}
>Recent blogs/changes/reminders: <<date popup Y M D-1 "yesterday">> <<date popup today "today">> <<date popup Y M D+1 "tomorrow">>

{{{The first day of next month will be a <<date Y M+1 1 "DDD">>}}}
>The first day of next month will be a <<date Y M+1 1 "DDD">>

{{{This tiddler (DatePlugin) was last updated on: <<date tiddler "DDD, MMM DDth, YYYY">>}}}
>This tiddler (DatePlugin) was last updated on: <<date tiddler "DDD, MMM DDth, YYYY">>

{{{The SiteUrl was last updated on: <<date tiddler:SiteUrl "DDD, MMM DDth, YYYY">>}}}
>The SiteUrl was last updated on: <<date tiddler:SiteUrl "DDD, MMM DDth, YYYY">>

{{{This document was last saved on <<date filedate "DDD, MMM DDth, YYYY at 0hh:0mm:0ss">>}}}
>This document was last saved on <<date filedate "DDD, MMM DDth, YYYY at 0hh:0mm:0ss">>

{{{<<date Y 07 24 "MMM DDth, YYYY">> will be a <<date Y 07 24 "DDD">>}}}
><<date Y 07 24 "MMM DDth, YYYY">> will be a <<date Y 07 24 "DDD">>
***/

/***
!Configuration

<<option chkDatePopupHideCreated>> omit 'created' section from date popups
<<option chkDatePopupHideChanged>> omit 'changed' section from date popups
<<option chkDatePopupHideTagged>> omit 'tagged' section from date popups
<<option chkDatePopupHideReminders>> omit 'reminders' section from date popups
<<option chkShowJulianDate>> display Julian day number (1-365) below current date

See [[DatePluginConfig]] for additional configuration settings for use in calendar displays, including:

*date formats
*color-coded backgrounds
*annual fixed-date holidays
*weekends
***/

/***
!Version
***/

//{{{
version.extensions.PluginName = { major:2, minor:7, revision:3, date:new Date(2011,4,23), source:"http://www.TiddlyTools.com/#DatePlugin" };
//}}}

/***
!!History

|altRows|k
| date|version|changes|h
| 29 January 2012|2.7.3.1|@@color(RED):(~Secret-HQ)@@<br>Moved DatePluginInfo back into main plugin to make the plugin self-contained.<br>Moved DatePluginConfig into a shadow tiddler, also to make the plugin self-contained.<br>Cleaned up and reformatted history and documentation.|
| 23 April 2011|2.7.3|Added {{{config.macros.date.tipformat}}} for custom mouseover tooltip and {{{config.macros.date.leadtime}}} for custom reminder leadtime (default = 90 days).|
| 4 January 2011|2.7.2.1|@@color(RED):(~Secret-HQ)@@<br>Modified Eric's styles slightly to remove border on today's date.|
| 15 December 2010|2.7.2|Omit date highlighting when hiding popup items (created/changed/tagged/reminders).|
| 31 May 2009|2.7.1|In {{{addRemindersToPopup()}}}, "new reminder...." command now uses {{{<<newTiddler>>}}} macro.  Also, general code reduction/cleanup.|
| 8 March 2008|2.7.0|In {{{addModifiedsToPopup()}}}, if a tiddler was created on the specified date, don't list it in the 'changed' section of the popup.  Based on a request from Kashgarinn.|
| 31 January 2008|2.6.0|Refactored date style logic into separate {{{setDateStyle()}}} function so it can be overridden by a custom definition.  See [[DatePluginConfig]].|
| 11 January 2008|2.5.0|Added options to selectively suppress created/changes/tagged/reminders popup content.|
| 8 January 2008|*.*.*|Plugin size reduction: documentation moved to DatePluginInfo.|
| 21 November 2007|2.4.0|Added {{{hasTagged()}}} and {{{addTaggedToPopup()}}} to list any tiddlers that have been tagged using the title of the dated journal tiddler as a tag value (i.e., the tiddlers that will be listed in the standard "tagging" display when viewing the journal tiddler itself).  Based on a request from Coby.|
| 20 June 2007|2.3.1|In {{{onClickDatePopup()}}}, use {{{Popup.show()}}} instead of deprecated {{{ScrollToTiddlerPopup()}}}.  Fixes fatal error that prevents popups from being properly displayed.|
| 31 May 2007|2.3.0|List "created" tiddlers in date popup.<br>Also, force re-cache of created/modified indices when displaying current date and store.isDirty(), so that popup is kept in sync with tiddler changes.|
| 9 May 2006|2.2.1|Added {{{todaybg}}} handling to set background color of current date.<br>Also, honor {{{excludeLists}}} tag when getting lists of tiddlers.  Based on suggestions by Mark Hulme.|
| 5 May 2006|2.2.0|Added {{{linkedbg}}} handling to set background color when a 'dated tiddler' exists.  Based on a suggestion by Mark Hulme.|
| 8 March 2006|2.1.2|Add 'override leadtime' flag param in call to {{{findTiddlersWithReminders()}}}, and add "Enter a title" default text to new reminder handler.  Thanks to Jeremy Sheeley for these additional tweaks.|
| 6 March 2006|2.1.0|Function {{{hasReminders()}}} nows uses {{{window.reminderCacheForCalendar[]}}} when present.  If calendar cache is not present, {{{indexReminders()}}} now uses {{{findTiddlersWithReminders()}}} with a 90-day look ahead to check for reminders.<br>Also, switched default background colors for autostyled dates: reminders are now greenish ("c0ffee") and holidays are now reddish ("ffaace").|
| 14 February 2006|2.0.5|When {{{readOnly}}} is set (by TW core), omit "new reminders..." popup menu item and, if a "dated tiddler" does not already exist, display the date as simple text instead of a link.|
| 5 February 2006|2.0.4|Added {{{var}}} to variables that were unintentionally global.  Avoids FireFox 1.5.0.1 crash bug when referencing global variables.|
| 18 January 2006|2.0.3|In 1.2.x the tiddler editor's text area control was given an element ID = {{{("tiddlerBody"+title)}}}, so that it was easy to locate this field and programmatically modify its content.  With the addition of configuration templates in 2.x, the textarea no longer has an ID assigned.  To find this control, we now look through all the child nodes of the tiddler editor to locate a "textarea" control where {{{attribute("edit")}}} = {{{"text"}}} and then append the new reminder to the contents of that control.|
| 11 January 2006|2.0.2|Correct 'weekend' override detection logic in {{{showDate()}}}.|
| 10 January 2006|2.0.1|Allow custom-defined weekend days (default defined in {{{config.macros.date.weekend[]}}} array).<br>Added {{{flag}}} param to {{{showDate()}}} API to override internal {{{weekend[]}}} array.|
| 27 December 2005|2.0.0|Update for TW2.0.<br>Added parameter handling for {{{linkformat}}}.|
| 21 December 2005|1.2.2|FF's {{{date.getYear()}}} function returns 105 (for the current year, 2005).  When calculating a date value from {{{Y}}}, {{{M}}}, and {{{D}}} expressions, the plugin adds 1900 to the returned year value to get the current year number.  But IE's {{{date.getYear()}}} already returns 2005.  As a result, plugin calculated date values on IE were incorrect (e.g., 3905 instead of 2005).  Adding +1900 is now conditional, so the values will be correct on both browsers.|
| 7 November 2005|1.2.1|Added support for "tiddler" dynamic date parameter.|
| 6 November 2005|1.2.0|Added support for "tiddler:title" dynamic date parameter.|
| 3 November 2005|1.1.2|When a reminder doesn't have a specified title parameter, use the title of the tiddler that contains the reminder as "fallback" text in the popup menu.  Based on a suggestion from ~BenjaminKudria.|
| 3 November 2005|1.1.1|Temporarily bypass {{{hasReminders()}}} logic to avoid excessive overhead from generating the {{{indexReminders()}}} cache.  While reminders can still appear in the popup menu, they just won't be indicated by auto-styling the date number that is displayed.  This single change saves approx. 60% overhead (5 second delay reduced to under 2 seconds).|
| 1 November 2005|1.1.0|Corrected logic in {{{hasModifieds()}}} and {{{hasReminders()}}} so caching of indexed modifieds and reminders is done just once, as intended.  This should hopefully speed up calendar generators and other plugins that render multiple dates...|
| 31 October 2005|1.0.1|Documentation and code cleanup.|
| 31 October 2005|1.0.0|Initial public release.|
| 30 October 2005|0.9.0|Pre-release.|
***/

/***
!Code
***/

//{{{
config.macros.date = {
	format: 'YYYY.0MM.0DD', // default date display format
	linkformat: 'YYYY.0MM.0DD', // 'dated tiddler' link format

	tipformat: 'YYYY.0MM.0DD', // 'dated tiddler' link tooltip format
	leadtime: 31, // find reminders up to 31 days from now
	linkedbg: '#babb1e', // 'babble'
	todaybg: '#ffab1e', // 'fable'
	weekendbg: '#c0c0c0', // 'cocoa'
	holidaybg: '#ffaace', // 'face'
	createdbg: '#bbeeff', // 'beef'
	modifiedsbg: '#bbeeff', // 'beef'
	remindersbg: '#c0ffee', // 'coffee'
	weekend: [ 1,0,0,0,0,0,1 ], // [ day index values: sun=0, mon=1, tue=2, wed=3, thu=4, fri=5, sat=6 ],
	holidays: [ '01/01', '07/04', '07/24', '11/24' ]
		// NewYearsDay, IndependenceDay(US), Eric's Birthday (hooray!), Thanksgiving(US)
};

config.macros.date.handler = function(place,macroName,params)
{
	// default: display current date
	var now =new Date();
	var date=now;
	var mode='display';
	if (params[0]&&['display','popup','link'].contains(params[0].toLowerCase()))
		{ mode=params[0]; params.shift(); }

	if (!params[0] || params[0]=='today')
		{ params.shift(); }
	else if (params[0]=='filedate')
		{ date=new Date(document.lastModified); params.shift(); }
	else if (params[0]=='tiddler')
		{ date=store.getTiddler(story.findContainingTiddler(place).id.substr(7)).modified; params.shift(); }
	else if (params[0].substr(0,8)=='tiddler:')
		{ var t; if ((t=store.getTiddler(params[0].substr(8)))) date=t.modified; params.shift(); }
	else {
		var y = eval(params.shift().replace(/Y/ig,(now.getYear()<1900)?now.getYear()+1900:now.getYear()));
		var m = eval(params.shift().replace(/M/ig,now.getMonth()+1));
		var d = eval(params.shift().replace(/D/ig,now.getDate()+0));
		date = new Date(y,m-1,d);
	}
	// date format with optional custom override
	var format=this.format; if (params[0]) format=params.shift();
	var linkformat=this.linkformat; if (params[0]) linkformat=params.shift();
	showDate(place,date,mode,format,linkformat);
}

window.showDate=showDate;
function showDate(place,date,mode,format,linkformat,autostyle,weekend)
{
	mode	  =mode||'display';
	format	  =format||config.macros.date.format;
	linkformat=linkformat||config.macros.date.linkformat;

	// format the date output
	var title=date.formatString(format);
	var linkto=date.formatString(linkformat);
	var tip=date.formatString(config.macros.date.tipformat);

	// just show the formatted output
	if (mode=='display') { place.appendChild(document.createTextNode(title)); return; }

	// link to a 'dated tiddler'
	var link = createTiddlyLink(place, linkto, false);
	link.appendChild(document.createTextNode(title));
	link.title = linkto; // MODIFIED BY SECRET-HQ; DEFAULT VALUE: tip;
	link.date = date;
	link.format = format;
	link.linkformat = linkformat;

	// if using a popup menu, replace click handler for dated tiddler link
	// with handler for popup and make link text non-italic (i.e., an 'existing link' look)
	if (mode=='popup') {
		link.onclick = onClickDatePopup;
		link.style.fontStyle='normal';
	}
	// format the popup link to show what kind of info it contains (for use with calendar generators)
	if (autostyle) setDateStyle(place,link,weekend);
}
//}}}

//{{{
// NOTE: This function provides default logic for setting the date style when displayed in a calendar
// To customize the date style logic, please see[[DatePluginConfig]]
function setDateStyle(place,link,weekend) {
	// alias variable names for code readability
	var date=link.date;
	var fmt=link.linkformat;
	var linkto=date.formatString(fmt);
	var cmd=config.macros.date;

	var co=config.options; // abbrev

	if ((weekend!==undefined?weekend:isWeekend(date))&&(cmd.weekendbg!=''))
		{ place.style.background = cmd.weekendbg; }
	if (hasModifieds(date)||hasCreateds(date)||hasTagged(date,fmt))
		{ link.style.fontStyle='normal'; link.style.fontWeight='bold'; }
	if (hasReminders(date))
		{ link.style.textDecoration='underline'; }
	if (isToday(date))
		{ link.style.border='none'; } // MODIFIED BY SECRET-HQ; DEFAULT VALUE: "1px solid black";
	if (isHoliday(date)&&(cmd.holidaybg!=''))
		{ place.style.background = cmd.holidaybg; }
	if (hasCreateds(date)&&(cmd.createdbg!=''))
		{ place.style.background = cmd.createdbg; }
	if (hasModifieds(date)&&(cmd.modifiedsbg!=''))
		{ place.style.background = cmd.modifiedsbg; }
	if ((hasTagged(date,fmt)||store.tiddlerExists(linkto))&&(cmd.linkedbg!=''))
		{ place.style.background = cmd.linkedbg; }
	if (hasReminders(date)&&(cmd.remindersbg!=''))
		{ place.style.background = cmd.remindersbg; }
	if (isToday(date)&&(cmd.todaybg!=''))
		{ place.style.background = cmd.todaybg; }
	if (config.options.chkShowJulianDate) { // optional display of Julian date numbers
		var m=[0,31,59,90,120,151,181,212,243,273,304,334];
		var d=date.getDate()+m[date.getMonth()];
		var y=date.getFullYear();
		if (date.getMonth()>1 && (y%4==0 && y%100!=0) || y%400==0)
			d++; // after February in a leap year
		wikify('@@font-size:80%;<br>'+d+'@@',place);
	}

}
//}}}

//{{{
function isToday(date) // returns true if date is today
	{ var now=new Date(); return ((now-date>=0) && (now-date<86400000)); }
function isWeekend(date) // returns true if date is a weekend
	{ return (config.macros.date.weekend[date.getDay()]); }
function isHoliday(date) // returns true if date is a holiday
{
	var longHoliday = date.formatString('0MM/0DD/YYYY');
	var shortHoliday = date.formatString('0MM/0DD');
	for(var i = 0; i < config.macros.date.holidays.length; i++) {
		var holiday=config.macros.date.holidays[i];
		if (holiday==longHoliday||holiday==shortHoliday) return true;
	}
	return false;
}
//}}}

//{{{
// Event handler for clicking on a day popup
function onClickDatePopup(e) { e=e||window.event;
	var p=Popup.create(this); if (!p) return false;
	// always show dated tiddler link (or just date, if readOnly) at the top...
	if (!readOnly || store.tiddlerExists(this.date.formatString(this.linkformat)))
		createTiddlyLink(createTiddlyElement(p,'li'),this.date.formatString(this.linkformat),true);
	else
		createTiddlyText(createTiddlyElement(p,'li'),this.date.formatString(this.linkformat));
	addCreatedsToPopup(p,this.date,this.format);
	addModifiedsToPopup(p,this.date,this.format);
	addTaggedToPopup(p,this.date,this.linkformat);
	addRemindersToPopup(p,this.date,this.linkformat);
	Popup.show(); e.cancelBubble=true; if(e.stopPropagation)e.stopPropagation(); return false;
}
//}}}

//{{{
function indexCreateds() // build list of tiddlers, hash indexed by creation date
{
	var createds= { };
	var tiddlers = store.getTiddlers('title','excludeLists');
	for (var t = 0; t < tiddlers.length; t++) {
		var date = tiddlers[t].created.formatString('YYYY0MM0DD')
		if (!createds[date])
			createds[date]=new Array();
		createds[date].push(tiddlers[t].title);
	}
	return createds;
}
function hasCreateds(date) // returns true if date has created tiddlers
{
	if (config.options.chkDatePopupHideCreated) return false;
	if (!config.macros.date.createds) config.macros.date.createds=indexCreateds();
	return (config.macros.date.createds[date.formatString('YYYY0MM0DD')]!=undefined);
}

function addCreatedsToPopup(p,when,format)
{
	if (config.options.chkDatePopupHideCreated) return false;
	var force=(store.isDirty() && when.formatString('YYYY0MM0DD')==new Date().formatString('YYYY0MM0DD'));
	if (force || !config.macros.date.createds) config.macros.date.createds=indexCreateds();
	var indent=String.fromCharCode(160)+String.fromCharCode(160);
	var createds = config.macros.date.createds[when.formatString('YYYY0MM0DD')];
	if (createds) {
		createds.sort();
		var e=createTiddlyElement(p,'div',null,null,'created ('+createds.length+')');
		for(var t=0; t<createds.length; t++) {
			var link=createTiddlyLink(createTiddlyElement(p,'li'),createds[t],false);
			link.appendChild(document.createTextNode(indent+createds[t]));
		}
	}
}
//}}}

//{{{
function indexModifieds() // build list of tiddlers, hash indexed by modification date
{
	var modifieds= { };
	var tiddlers = store.getTiddlers('title','excludeLists');
	for (var t = 0; t < tiddlers.length; t++) {
		var date = tiddlers[t].modified.formatString('YYYY0MM0DD')
		if (!modifieds[date])
			modifieds[date]=new Array();
		modifieds[date].push(tiddlers[t].title);
	}
	return modifieds;
}
function hasModifieds(date) // returns true if date has modified tiddlers
{
	if (config.options.chkDatePopupHideChanged) return false;
	if (!config.macros.date.modifieds) config.macros.date.modifieds = indexModifieds();
	return (config.macros.date.modifieds[date.formatString('YYYY0MM0DD')]!=undefined);
}

function addModifiedsToPopup(p,when,format)
{
	if (config.options.chkDatePopupHideChanged) return false;
	var date=when.formatString('YYYY0MM0DD');
	var force=(store.isDirty() && date==new Date().formatString('YYYY0MM0DD'));
	if (force || !config.macros.date.modifieds) config.macros.date.modifieds=indexModifieds();
	var indent=String.fromCharCode(160)+String.fromCharCode(160);
	var mods = config.macros.date.modifieds[date];
	if (mods) {
		// if a tiddler was created on this date, don't list it in the 'changed' section
		if (config.macros.date.createds && config.macros.date.createds[date]) {
			var temp=[];
			for(var t=0; t<mods.length; t++)
				if (!config.macros.date.createds[date].contains(mods[t]))
					temp.push(mods[t]);
			mods=temp;
		}
		mods.sort();
		var e=createTiddlyElement(p,'div',null,null,'changed ('+mods.length+')');
		for(var t=0; t<mods.length; t++) {
			var link=createTiddlyLink(createTiddlyElement(p,'li'),mods[t],false);
			link.appendChild(document.createTextNode(indent+mods[t]));
		}
	}
}
//}}}

//{{{
function hasTagged(date,format) // returns true if date is tagging other tiddlers
{
	if (config.options.chkDatePopupHideTagged) return false;
	return store.getTaggedTiddlers(date.formatString(format)).length>0;
}

function addTaggedToPopup(p,when,format)
{
	if (config.options.chkDatePopupHideTagged) return false;
	var indent=String.fromCharCode(160)+String.fromCharCode(160);
	var tagged=store.getTaggedTiddlers(when.formatString(format));
	if (tagged.length) var e=createTiddlyElement(p,'div',null,null,'tagged ('+tagged.length+')');
	for(var t=0; t<tagged.length; t++) {
		var link=createTiddlyLink(createTiddlyElement(p,'li'),tagged[t].title,false);
		link.appendChild(document.createTextNode(indent+tagged[t].title));
	}
}
//}}}

//{{{
function indexReminders(date,leadtime) // build list of tiddlers with reminders, hash indexed by reminder date
{
	var reminders = { };
	if(window.findTiddlersWithReminders!=undefined) { // reminder plugin is installed
		var t = findTiddlersWithReminders(date, [0,leadtime], null, null, 1);
		for(var i=0; i<t.length; i++) reminders[t[i].matchedDate]=true;
	}
	return reminders;
}

function hasReminders(date) // returns true if date has reminders
{
	if (config.options.chkDatePopupHideReminders) return false;
	if (window.reminderCacheForCalendar)
		return window.reminderCacheForCalendar[date]; // use calendar cache
	if (!config.macros.date.reminders)
		config.macros.date.reminders = indexReminders(date,config.macros.date.leadtime); // create a reminder cache
	return (config.macros.date.reminders[date]);
}

function addRemindersToPopup(p,when,format)
{
	if (config.options.chkDatePopupHideReminders) return false;
	if(window.findTiddlersWithReminders==undefined) return; // reminder plugin not installed

	var indent = String.fromCharCode(160)+String.fromCharCode(160);
	var reminders=findTiddlersWithReminders(when, [0,config.macros.date.leadtime],null,null,1);
	createTiddlyElement(p,'div',null,null,'reminders ('+(reminders.length||'none')+')');
	for(var t=0; t<reminders.length; t++) {
		link = createTiddlyLink(createTiddlyElement(p,'li'),reminders[t].tiddler,false);
		var diff=reminders[t].diff;
		diff=(diff<1)?'Today':((diff==1)?'Tomorrow':diff+' days');
		var txt=(reminders[t].params['title'])?reminders[t].params['title']:reminders[t].tiddler;
		link.appendChild(document.createTextNode(indent+diff+' - '+txt));
	}
	if (readOnly) return;	// readonly... omit 'new reminder...' command
	var rem='\\<\\<reminder day:%0 month:%1 year:%2 title:"Enter a reminder title here"\\>\\>';
	rem=rem.format([when.getDate(),when.getMonth()+1,when.getYear()+1900]);
	var cmd="<<newTiddler label:[["+indent+"new reminder...]] prompt:[[add a reminder to '%0']]"
		+" title:[[%0]] text:{{var t=store.getTiddlerText('%0','');t+(t.length?'\\n':'')+'%1'}} tag:%2>>";
	wikify(cmd.format([when.formatString(format),rem,config.options.txtCalendarReminderTags||'']),
		createTiddlyElement(p,'li'));
}
//}}}

/***
!!Templates (Shadow Tiddlers)
***/

//{{{
config.shadowTiddlers["DatePluginConfig"] = "/***"+"\n"+"This tiddler overrides some of the default settings of DatePlugin and is shadowed in DatePlugin.  To use it, edit this tiddler and add the {{{systemConfig}}} tag to it."+"\n"+"***/";
config.shadowTiddlers["DatePluginConfig"] += "\n\n";
config.shadowTiddlers["DatePluginConfig"] += "/***"+"\n"+"''Default popup content display options (can be overridden by cookies):''"+"\n"+"***/"+"\n";
config.shadowTiddlers["DatePluginConfig"] += "//{{{"+"\n"+"if (config.options.chkDatePopupHideCreated===undefined)"+"\n"+"   { config.options.chkDatePopupHideCreated=false; }"+"\n"+"if (config.options.chkDatePopupHideChanged===undefined)"+"\n"+"   { config.options.chkDatePopupHideChanged=false; }"+"\n"+"if (config.options.chkDatePopupHideTagged===undefined)"+"\n"+"   { config.options.chkDatePopupHideTagged=false; }"+"\n"+"if (config.options.chkDatePopupHideReminders===undefined)"+"\n"+"   { config.options.chkDatePopupHideReminders=false; }"+"\n"+"//}}}";
config.shadowTiddlers["DatePluginConfig"] += "\n\n";
config.shadowTiddlers["DatePluginConfig"] += "/***"+"\n"+"''Show Julian date number below regular date:''"+"\n"+"***/"+"\n";
config.shadowTiddlers["DatePluginConfig"] += "//{{{"+"\n"+"if (config.options.chkShowJulianDate===undefined)"+"\n"+"   { config.options.chkShowJulianDate=false; }"+"\n"+"//}}}";
config.shadowTiddlers["DatePluginConfig"] += "\n\n";
config.shadowTiddlers["DatePluginConfig"] += "/***"+"\n"+"''Fixed-date annual holidays:''"+"\n"+"***/"+"\n";
config.shadowTiddlers["DatePluginConfig"] += "//{{{"+"\n"+"config.macros.date.holidays=["+"\n"+"   \"01/01\", // NewYearsDay,"+"\n"+"   \"07/04\", // US Independence Day"+"\n"+"   \"07/24\"  // Eric's Birthday (hooray!)"+"\n"+"];"+"\n"+"//}}}";
config.shadowTiddlers["DatePluginConfig"] += "\n\n";
config.shadowTiddlers["DatePluginConfig"] += "/***"+"\n"+"''Weekend map (1=weekend, 0=weekday):''"+"\n"+"***/"+"\n";
config.shadowTiddlers["DatePluginConfig"] += "//{{{"+"\n"+"config.macros.date.weekend=[ 1,0,0,0,0,0,1 ]; // day index values: sun=0, mon=1, tue=2, wed=3, thu=4, fri=5, sat=6"+"\n"+"//}}}";
config.shadowTiddlers["DatePluginConfig"] += "\n\n";
config.shadowTiddlers["DatePluginConfig"] += "/***"+"\n"+"''Date display/link formats:''"+"\n"+"***/"+"\n";
config.shadowTiddlers["DatePluginConfig"] += "//{{{"+"\n"+"config.macros.date.format=\"YYYY.0MM.0DD\"; // default date display format"+"\n"+"config.macros.date.linkformat=\"YYYY.0MM.0DD\"; // 'dated tiddler' link format"+"\n"+"config.macros.date.tipformat=\"YYYY.0MM.0DD\"; // 'dated tiddler' tooltip format"+"\n"+"//}}}";
config.shadowTiddlers["DatePluginConfig"] += "\n\n";
config.shadowTiddlers["DatePluginConfig"] += "/***"+"\n"+"''Reminder lead time:''"+"\n"+"***/"+"\n";
config.shadowTiddlers["DatePluginConfig"] += "//{{{"+"\n"+"config.macros.date.leadtime=31; // find reminders up to 31 days from now"+"\n"+"//}}}";
config.shadowTiddlers["DatePluginConfig"] += "\n\n";
config.shadowTiddlers["DatePluginConfig"] += "/***"+"\n"+"!!Calendar Styles"+"\n\n"+"When displaying a calendar (see [[CalendarPlugin]]), you can customize the colors/styles that are applied to the calendar dates by modifying the values and/or functions below:"+"\n"+"***/";
config.shadowTiddlers["DatePluginConfig"] += "\n\n";
config.shadowTiddlers["DatePluginConfig"] += "/***"+"\n"+"''Default calendar colors:''"+"\n"+"***/"+"\n";
config.shadowTiddlers["DatePluginConfig"] += "//{{{"+"\n"+"config.macros.date.weekendbg=\"#c0c0c0\"; // 'cocoa'"+"\n"+"config.macros.date.holidaybg=\"#ffaace\"; // 'face'"+"\n"+"config.macros.date.createdbg=\"#bbeeff\"; // 'beef'"+"\n"+"config.macros.date.modifiedsbg=\"#bbeeff\"; // 'beef'"+"\n"+"config.macros.date.linkedbg=\"#babb1e\"; // 'babble'"+"\n"+"config.macros.date.remindersbg=\"#c0ffee\"; // 'coffee'"+"\n"+"//}}}";
config.shadowTiddlers["DatePluginConfig"] += "\n\n";
config.shadowTiddlers["DatePluginConfig"] += "/***"+"\n"+"''Apply calendar styles:''"+"\n"+"***/"+"\n";
config.shadowTiddlers["DatePluginConfig"] += "//{{{"+"\n"+"function setDateStyle(place,link,weekend) {"+"\n\n"+"   // alias variable names for code readability"+"\n"+"   var date=link.date;"+"\n"+"   var fmt=link.linkformat;"+"\n"+"   var linkto=date.formatString(fmt);"+"\n"+"   var cmd=config.macros.date;"+"\n\n"+"   if ((weekend!==undefined?weekend:isWeekend(date))&&(cmd.weekendbg!=\"\"))"+"\n"+"      { place.style.background = cmd.weekendbg; }"+"\n"+"   if (hasModifieds(date)||hasCreateds(date)||hasTagged(date,fmt))"+"\n"+"      { link.style.fontStyle=\"normal\"; link.style.fontWeight=\"bold\"; }"+"\n"+"   if (hasReminders(date))"+"\n"+"      { link.style.textDecoration=\"underline\"; }"+"\n"+"   if (isToday(date))"+"\n"+"      { link.style.border=\"1px solid black\"; }"+"\n"+"   if (isHoliday(date)&&(cmd.holidaybg!=\"\"))"+"\n"+"      { place.style.background = cmd.holidaybg; }"+"\n"+"   if (hasCreateds(date)&&(cmd.createdbg!=\"\"))"+"\n"+"      { place.style.background = cmd.createdbg; }"+"\n"+"   if (hasModifieds(date)&&(cmd.modifiedsbg!=\"\"))"+"\n"+"      { place.style.background = cmd.modifiedsbg; }"+"\n"+"   if ((hasTagged(date,fmt)||store.tiddlerExists(linkto))&&(cmd.linkedbg!=\"\"))"+"\n"+"      { place.style.background = cmd.linkedbg; }"+"\n"+"   if (hasReminders(date)&&(cmd.remindersbg!=\"\"))"+"\n"+"      { place.style.background = cmd.remindersbg; }"+"\n"+"   if (isToday(date)&&(cmd.todaybg!=\"\"))"+"\n"+"      { place.style.background = cmd.todaybg; }"+"\n"+"   if (config.options.chkShowJulianDate) {"+"\n"+"      var m=[0,31,59,90,120,151,181,212,243,273,304,334];"+"\n"+"      var d=date.getDate()+m[date.getMonth()];"+"\n"+"      var y=date.getFullYear();"+"\n"+"      if (date.getMonth()>1 && (y%4==0 && y%100!=0) || y%400==0) d++; // after February in a leap year"+"\n"+"      wikify(\"@@font-size:80%;<br>\"+d+\"@@\",place);"+"\n"+"   }"+"\n\n"+"   var t=store.getTiddlerText(linkto,'')"+"\n\n"+"   if (config.options.chkInlineCalendarJournals && t.length)"+"\n"+"      { wikify('<br>'+t,place); }"+"\n\n"+"}"+"\n"+"//}}}";
//}}}
[[Home]]
[[Delicious Cinnamon "roll" cake with cream cheese frosting|http://www.reddit.com/r/ketorecipes/comments/1qbv8x/delicious_cinnamon_roll_cake_with_cream_cheese/]]
[img[images/cin_roll_cake.jpg]]
''Batter: ''
*1 cup coconut flour
*1 cup almond/peanut butter (almond flour should work too)
*1 tsp baking powder
* 1/4 C sweetener (I used Splenda)
* 1/8 tsp salt
* 1/2 stick unsalted butter (softened)
* 1/4 C almond milk
* 1/4 cup whipping cream
* 2 tsp vanilla
''Filling:''
* 4 T unsalted butter (melted)
* 1/4 C sweetener
*3 T cinnamon
''Icing:''
* 1/2 stick of unsalted butter
* 30g of cream cheese
* sweetener to taste (i put very little in it because i like the contrast with the sweet cake)
''Directions:''
* Preheat Oven to 350 degrees F
* Filling- Mix ingredients until smooth.
* Icing- microwave ingredients for 30 seconds and mix until there are no lumps.
* Batter- in a large bowl mix together the dry ingredients.
* Once even mixed add the wet ingredients (milk, cream, vanilla, butter).
* Place half the batter on a mold, then pour the cinnamon filling and add the rest of the batter.
* Bake at 350 degrees F for about 25 minutes, Add icing and place in the fridge (don't take out of the mold until cool or it'll crumble).
Here's the nutrition info for the whole cake: http://imgur.com/EPNAq16 (a 12th of the cake is pretty satisfying). You can change sweetener or make it without the frosting to reduce carbs.
Type the text for 'Deserts'
Type the text for 'Dinner'
1/2 C Organic Gluten Free Oats
1/2 C Organic Chamomile
1/2 C Organic Calendula
1/2 C Kaolin Clay

Instructions:

Reduce ingredients to a rough powder either in a mortar and pestle or an herb grinder (I use my coffee grinder which works great). Put all the ingredients into a container (I use a pyrex container) and shake until combined.

Once all the ingredients are combined take a nickel to quarter sized amount of the scrub in the palm of your hand. Add enough water to make a paste and apply to your face and neck. Scrub into skin for about a minute and rinse. You can leave the mask on for up to 10 minutes to really let the clay pull the toxins out of your skin if you want.
''Ingredients''
* 8 oz of water
* 1-2 tbsp Apple cider vinegar
* 1 tbsp Lemon juice (fresh press)
* 1/8 tsp Cinnamon
* 1/8 tsp or less cayenne pepper
* 1 scoop stevia powder
* 1/8 tsp Ground ginger
* 1 pinch of turmeric or black pepper

30 day detox. Take 3 times a day 5-10min before meals. After detoxing, have once a day.
Mix and drink 
1/2 cup butter
One pint of cream (2 cups)
1 garlic clove
2 Tablespoons cream cheese
1/2 cup grated parmesan cheese

Bring the butter, cream, garlic and cream cheese to a boil. Turn down the heat, simmer and stir for about two minutes. Add the grated cheese and stir until melted. Simmer the sauce for 15-20 minutes until it becomes “thick and saucy”, stirring occasionally.
''Ingredients''
* 4 Egg Yokes
* 8 Scoops of [[Kal Stevia Powder|http://www.amazon.com/Kal-Pure-Stevia-Extract-Powder/dp/B000VRSR84/]] (1/2cup of sugar or truvia)
* 2 tablesppons Truvia
* 1 pint almond milk
* 1 cup heavy cream
* 1 teaspoon freshly grated nutmeg
* 1/4 teaspoon cinnamon (optional)
* 3 ounces bourbon (optional)
* 4 Egg Whites

''Directions''
#In the bowl of a stand mixer, beat the egg yolks until they lighten in color. Gradually add the 1 tablespoon truvia and continue to beat until it is completely dissolved. Add the milk, cream, bourbon, stevia, nutmeg and cinnamon and stir to combine.
# Place the egg whites in the bowl of a stand mixer and beat to soft peaks. With the mixer still running gradually add the 1 tablespoon of truvia and beat until stiff peaks form.
# Whisk the egg whites into the mixture. Chill and serve.
* [[Low-carb Bread (several recipes)|http://ketodietapp.com/Blog/?tag=/tagLowcarbBread&title=Lowcarb%20Bread]]
* [[Sugar-free Meringues|http://ketodietapp.com/Blog/post/2015/08/26/sugar-free-meringues]]
[[How to Use Leftover Egg Yolks: Make Low-Carb Lemon Curd|http://ketodietapp.com/Blog/post/2015/10/09/how-to-use-leftover-egg-yolks-make-low-carb-lemon-curd]]

''Ingredients'' (makes 8 servings, ~ 2 cups):

* 3 tbsp fresh lemon zest (~ 3 lemons), unwaxed
* ¾ cup fresh lemon juice (~ 4 lemons)
* 6 large egg yolks
* ½ cup Erythritol or Swerve, powdered, or other healthy low-carb sweetener from this list (80 g / 2.8 oz)
* 100 g butter, ghee or virgin coconut oil (3.5 oz)
* Optional: 15-20 drops liquid Stevia
* Optional: 1 tbsp arrowroot powder or 1-2 tsp gelatine powder mixed with 2 tbsp water (recommended if used for pie topping)

''Instructions''
# Start by washing and zesting the lemons and then halve and juice them.
# In a bowl, mix the egg yolks with powdered erythritol and add stevia (if used for additional sweetness). 
# Pour in the lemon juice and add the lemon zest. Mix until well combined. 
# Place the bowl over a saucepan filled with simmering water and stir constantly; make sure the water doesn’t touch the bottom of the bowl. 
# Keep stirring for 8-10 minutes or until the custard starts to thicken. Then take off the heat. (If you are planning to use the curd in a pie, add the thickener mixed with water (arrowroot or gelatine).)
# Add butter cut into small pieces and mix until melted and well combined. (Don't worry if the curd is not smooth or looks scrambled. To fix it, you can use a blender or a food processor and pulse for just a few seconds.)
# Place the bowl with the curd in a larger bowl filled with ice water (cold water with ice cubes) and mix until the curd is chilled.
# When done, place in an airtight jar and keep refrigerated for up to 10 days. Lemon curd works great as a dip with grain-free crackers, poured over berries, as topping in parfaits such as [[Eton Mess|http://ketodietapp.com/Blog/post/2015/08/27/low-carb-eton-mess]] or [[filling in pies|http://ketodietapp.com/Blog/post/2015/02/15/Sweet-Keto-Pie-Crust]] (arrowroot or gelatine should be added for a firmer texture). Enjoy! 




----
How to use leftover egg yolks:
* [[Home-made Mayo|http://ketodietapp.com/Blog/post/2014/08/11/Healthy-Home-made-Mayo-Three-Ways]]
* [[Hollandaise Sauce|http://ketodietapp.com/Blog/post/2014/08/12/Easy-Hollandaise-Sauce]]
* [[Frozen Fat Bomb - Vanilla Keto Ice-cream|http://ketodietapp.com/Blog/post/2014/06/04/Ultimate-Keto-Ice-Cream-aka-Frozen-Fat-Bomb]]
* [[Ultimate Keto Coffee|http://ketodietapp.com/Blog/post/2013/12/15/Ultimate-Keto-Coffee]]
* [[Chocolate Keto Smoothie|http://ketodietapp.com/Blog/post/2015/03/04/Chocolate-Keto-Smoothie]]
* [[Vanilla Keto Smoothie|http://ketodietapp.com/Blog/post/2015/01/05/Vanilla-Keto-Smoothie]]
* [[Zucchini Carbonara|http://ketodietapp.com/Nutrition.aspx?mealId=73]] (recipe from the KetoDiet App)

----
But how about egg yolks and egg whites? Not all recipes require both and you may end up wondering what to do with them. As long as you make sure that you store raw egg whites or egg yolks sealed in the fridge for no more than two days, they can be used in other recipes.
----
Egg yolks don't freeze very well - they become too thick when frozen. However, there is a trick you can use if you plan to use them in a savoury recipe: simply add a pinch of salt (about ¼ teaspoon per 8 egg yolks), beat in, seal well and freeze for up to 3 months.

Yes, you can place egg whites in freezer bags and freeze in batches for up to 3 months. When ready to be used, defrost in the fridge overnight.
''Ingredients''
* 1 cup Salt Pure salt, such as sea salt, with no additives, such as anti-caking agents. Remember, this amount of salt helps you make a recipe with 48 servings.
* 3 1/2 tsp Potassium Chloride powder One brand of this ingredient is sold under the name "Nu-Salt." Whatever brand you buy, make sure it is just "potassium chloride" with no additives such as "anti-caking" agents.
* 3 capsules Magnesium glycinate powder This ingredient is available in the vitamin section at most grocery stores or pharmacies. If purchased in capsules, empty the capsules until you have 1/2 tsp. of the powder. You may need to empty 1-2 capsules to obtain this amount.
Blue Light Releated

[[f.lux™ software to make your life better|https://justgetflux.com/linux.html]]
[[Uvex S1933X Skyper Safety Eyewear|http://www.amazon.com/gp/product/B000USRG90]]

[[5 Best Alternative Apps like F.lux for Android|http://nerdsmagazine.com/apps-like-flux-for-android/]]
* [[Twilight|https://play.google.com/store/apps/details?id=com.urbandroid.lux]]
* [[Lux Auto Brightness|https://play.google.com/store/apps/details?id=com.vito.lux]]
* [[Velis Auto Brightness|https://play.google.com/store/apps/details?id=com.velis.auto.brightness]]
* [[Backlight! Widget|https://play.google.com/store/apps/details?id=com.phoeniix.backlight]]
* [[EasyEyez|https://play.google.com/store/apps/details?id=com.palmerin.easyeyezfree]]
http://www.intentionallydomestic.com/three-lies-about-lacto-fermentation-that-are-affecting-your-health/
http://gnowfglins.com/
http://www.reddit.com/r/fermentation
http://www.pinterest.com/kathleenzprew/all-things-fermented-and-pickled/
http://www.nwedible.com/2012/07/how-to-turn-a-mason-jar-into-a-fermenting-crock.html
http://masonjars.com/shop/
http://www.wildfermentation.com/
http://www.nourishingdays.com/2009/07/the-benefits-of-fermented-food-introduction/
http://girlmeetsnourishment.com/56-fermented-recipes/
http://fermup.com/
''Ingredients''
* Juice of 6-8 lemons, limes, or a combination (must be freshly squeezed)
* 1/2 cup sucanat
* 1/2 cup liquid whey
* 1/2 tsp organic nutmeg
* 2 quarts filtered water

''Directions''
# Mix all ingredients together in a 1 gallon glass jug.
# Leave on the counter for 2 days and then transfer to the refrigerator. 

The lemonade flavor improves over time, but is drinkable immediately after the 2 day fermentation period.   If it is too tart compared with the overly sweet lemonades from the store, mix 1 or 2 drops liquid stevia to each glass until your family adjusts to the mildly sweet/sour flavor.

[[Youtube|https://www.youtube.com/watch?v=46nKpErTgZ8]] [[Website|http://www.thehealthyhomeeconomist.com/video-fermented-hindu-lemonade]]
Flax warning http://www.carbwars.blogspot.com/2015/12/have-you-lost-your-period-on-low-carb.html
<tabs mytabs>
<tab Formatting>
|!Option|!Syntax|!Output|
|bold font|{{{''bold''}}}|''bold''|
|italic type|{{{//italic//}}}|//italic//|
|underlined text|{{{__underlined__}}}|__underlined__|
|strikethrough text|{{{--strikethrough--}}}|--strikethrough--|
|superscript text|{{{^^super^^script}}}|^^super^^script|
|subscript text|{{{~~sub~~script}}}|~~sub~~script|
|highlighted text|{{{@@highlighted@@}}}|@@highlighted@@|
|preformatted text|<html><code>{{{preformatted}}}</code></html>|{{{preformatted}}}|
</tab>

<tab Block Elements>
!!Headings
{{{
!Heading 1
!!Heading 2
!!!Heading 3
!!!!Heading 4
!!!!!Heading 5
}}}
<<<
!Heading 1
!!Heading 2
!!!Heading 3
!!!!Heading 4
!!!!!Heading 5
<<<
</tab>

<tab Lists>
{{{
* unordered list, level 1
** unordered list, level 2
*** unordered list, level 3

# ordered list, level 1
## ordered list, level 2
### unordered list, level 3

; definition list, term
: definition list, description

to embed items in the list on the same line of the same list item put {{block{

}}}
<<<
* unordered list, level 1
** unordered list, level 2
*** unordered list, level 3

# ordered list, level 1
## ordered list, level 2
### unordered list, level 3

; definition list, term
: definition list, description

# one {{block{
{{{
code item
}}}
}}}
# two

<<<
</tab>


<tab Blockquotes>
{{{
> blockquote, level 1
>> blockquote, level 2
>>> blockquote, level 3

<<<
blockquote
<<<
}}}
<<<
> blockquote, level 1
>> blockquote, level 2
>>> blockquote, level 3

> blockquote
<<<
!!Preformatted Text
<html><pre>
{{{
preformatted (e.g. code)
}}}
</pre></html>
<<<
{{{
preformatted (e.g. code)
}}}
<<<
</tab>

<tab Tables>
{{{
|CssClass|k
|!heading column 1|!heading column 2|
|row 1, column 1|row 1, column 2|
|row 2, column 1|row 2, column 2|
|>|COLSPAN|
|ROWSPAN| … |
|~| … |
|CssProperty:value;…| … |
|caption|c
}}}
''Annotation:''
* The {{{>}}} marker creates a "colspan", causing the current cell to merge with the one to the right.
* The {{{~}}} marker creates a "rowspan", causing the current cell to merge with the one above.
<<<
|CssClass|k
|!heading column 1|!heading column 2|
|row 1, column 1|row 1, column 2|
|row 2, column 1|row 2, column 2|
|>|COLSPAN|
|ROWSPAN| … |
|~| … |
|CssProperty:value;…| … |
|caption|c
<<<
</tab>

<tab Images>
/% TODO %/
cf. [[TiddlyWiki.com|http://www.tiddlywiki.com/#EmbeddedImages]]
{{{
[img[Motovun Jack.jpg]]
[img[http://tiddlywiki.com/favicon.ico]]
}}}
</tab>

<tab Hyperlinks>
* [[WikiWords|WikiWord]] are automatically transformed to hyperlinks to the respective tiddler
** the automatic transformation can be suppressed by preceding the respective WikiWord with a tilde ({{{~}}}): {{{~WikiWord}}}
* [[PrettyLinks]] are enclosed in square brackets and contain the desired tiddler name: {{{[[tiddler name]]}}}
** optionally, a custom title or description can be added, separated by a pipe character ({{{|}}}): {{{[[title|target]]}}}<br>''N.B.:'' In this case, the target can also be any website (i.e. URL).
</tab>

<tab Custom Styling>
* {{{@@CssProperty:value;CssProperty:value;…@@}}}<br>''N.B.:'' CSS color definitions should use lowercase letters to prevent the inadvertent creation of WikiWords.
* <html><code>{{customCssClass{…}}}</code></html>
* raw HTML can be inserted by enclosing the respective code in HTML tags: {{{<html> … </html>}}}
</tab>

<tab Special Markers>
* {{{<br>}}} forces a manual line break
* {{{----}}} creates a horizontal ruler
* [[HTML entities|http://www.tiddlywiki.com/#HtmlEntities]]
* {{{<<macroName>>}}} calls the respective [[macro|Macros]]
* To hide text within a tiddler so that it is not displayed, it can be wrapped in {{{/%}}} and {{{%/}}}.<br/>This can be a useful trick for hiding drafts or annotating complex markup.
* To prevent wiki markup from taking effect for a particular section, that section can be enclosed in three double quotes: e.g. {{{"""WikiWord"""}}}.
</tab>
<tab Fractions>
| !Character Name | !Character | !Entity | !Num<br/>Entity | !Hex<br/>Entity |
|VULGAR FRACTION 1/4| ¼ |{{{&frac14;}}}|{{{&#188;}}}|{{{&#x00BC;}}}|
|VULGAR FRACTION 1/2| ½ |{{{&frac12;}}}|{{{&#189;}}}|{{{&#x00BD;}}}|
|VULGAR FRACTION 3/4| ¾ |{{{&frac34;}}}|{{{&#190;}}}|{{{&#x00BE;}}}|
|VULGAR FRACTION 1/3| ⅓ | -- |{{{&#8531;}}}|{{{&#x2153;}}}|
|VULGAR FRACTION 2/3| ⅔ | -- |{{{&#8532;}}}|{{{&#x2154;}}}|
|VULGAR FRACTION 1/5| ⅕ | -- |{{{&#8533;}}}|{{{&#x2155;}}}|
|VULGAR FRACTION 2/5| ⅖ | -- |{{{&#8354;}}}|{{{&#x2156;}}}|
|VULGAR FRACTION 3/5| ⅗ | -- |{{{&#8535;}}}|{{{&#x2157;}}}|
|VULGAR FRACTION 4/5| ⅘ | -- |{{{&#8536;}}}|{{{&#x2158;}}}|
|VULGAR FRACTION 1/6| ⅙ | -- |{{{&#8537;}}}|{{{&#x2159;}}}|
|VULGAR FRACTION 5/6| ⅚ | -- |{{{&#8538;}}}|{{{&#x215A;}}}|
|VULGAR FRACTION 1/8| ⅛ | -- |{{{&#8539;}}}|{{{&#x215B;}}}|
|VULGAR FRACTION 3/8| ⅜ | -- |{{{&#8540;}}}|{{{&#x215C;}}}|
|VULGAR FRACTION 5/8| ⅝ | -- |{{{&#8541;}}}|{{{&#x215D;}}}|
|VULGAR FRACTION 7/8| ⅞ | -- |{{{&#8542;}}}|{{{&#x215E;}}}|
</tab>
</tabs>
See http://tiddlertoddler.tiddlyspot.com/
See http://www.checkettsweb.com/oldindex.html
[img[images/frenchdressing.jpg]]

''Ingredients''
*3/4 cup ketchup (I use Homemade)
*2 Tablespoons sucanat (you can substitute splenda if you want)
*1/2 cup olive oil
*1/4 cup red wine vinegar
*1/2 teaspoon garlic powder
*1/4 teaspoon liquid smoke
*1 Tablespoon ground celery seed

''Directions''
*Put all ingredients directly into a pint sized jar.
*Put the lid on and shake it well.
*Refrigerate.
''Ingredinets''
* 1 lb unsweetened coconut flakes, approximately 8-9 cups*
* 1/2 cup water
* 1 tbsp plus 1 tsp pure vanilla extract (I used homemade)
* 1 tbsp ground cinnamon
* 1/2-1 tsp fresh grated nutmeg (fresh is best)
* 1/4 tsp Pure Kal Stevia or 1/2 tsp. Trader Joes's Organic Stevia OR sweetener of choice, to taste
''Directions''
* Preheat oven to 300 degrees F.
* Line 2-3 jelly roll pans (cookie sheets with sides) with parchment paper. Using 3 cookie sheets will speed up the dehydrating process (see Fast Method below)
*In a large bowl, add water along with cinnamon, nutmeg, vanilla and Stevia. Whisk until dry ingredients are dissolved.
* Add coconut flakes and stir well until flakes are evenly coated. Be sure flakes are not sticking together. 
* Taste for sweetness.  Add more sweetener if desired.
* ''FAST METHOD'': Divide flakes between 3 cookie sheets and spread out evenly.  Bake for 15 minutes. Carefully remove from oven and carefully stir. Return to oven for another 5-10 minutes or until the flakes are slightly golden brown but NOT BURNED!{{foo{
''OVER NIGHT METHOD'': Divide flakes between 2 cookie sheets and spread out evenly.  Bake for 15 minutes. Carefully remove from oven and carefully stir. Return to oven for another 5 minutes. Turn off oven and leave for anywhere from 2-4 hours or overnight.}}}
* Allow to cool and then transfer to an airtight container.  Will keep a few weeks in refrigerator.  Top with fresh or freeze-dried fruit and dairy of choice.

''Note:'' Coconut has very little protein so I would advise eating some form of protein with it if eating for breakfast.
https://www.paleorunningmomma.com/fudgy-keto-brownies-paleo-dairy-free/

''Ingredients''
* 2/3 cup raw cacao powder or unsweetened cocoa powder
* 2/3 -3/4 cup Erythritol granulated or powdered
* 2/3 cup coconut oil melted and warm
* 1 1/2 tsp pure vanilla extract
* 2 large eggs + 1 egg yolk room temp
* 1/2 cup blanched almond flour
* 1/2 tsp baking soda
* 1/4 tsp sea salt
* 1/2 cup Lilly’s dark chocolate chips divided: 1/4 and 1/4

''Instructions''
# Preheat your oven to 325 degrees F and line an 8 x 8” square pan with parchment paper. Make sure your eggs have been brought to room temp before beginning.
# In a large bowl, whisk together the cacao powder and erythritol with the melted coconut oil until smooth. Add in the vanilla, then whisk in one egg at a time, then the egg yolk until smooth and well combined.
# With a spoon or spatula, stir in the almond flour, baking soda and sea salt until combined. Batter will be thick. Lastly, stir in 1/4 cup low carb chocolate chips, if using.
# Transfer all the batter to prepared pan and spread out to cover the bottom of the pan evenly. A rubber spatula works best for this step. Sprinkle the remaining chocolate chips on top.
# Bake in the preheated oven for 17 mins. It’s best to slightly under-bake the brownies since they can quickly become dry and too crumbly if left in the oven too long.
# Place pan on a wire rack and cool completely to room temp, refrigerating to speed up the cooling process if necessary. Once room temp, cut brownies into 16 squares to serve. Store leftovers covered at room temperature for up to 5 days, or freeze to keep longer. Enjoy!

''Recipe Notes''
To make a chocolate drizzle, melt 1/4 cup low carb chocolate chips with 1/2 tsp coconut oil in a glass bowl in the microwave on increments of 15 seconds, stirring in between, until melted.
''Ingredients''
* garlic powder
* salt
''Directions''
* Mix three parts salt to one part garlic powder.
To get started with this blank [[TiddlyWiki]], you'll need to modify the following tiddlers:
* [[SiteTitle]] & [[SiteSubtitle]]: The title and subtitle of the site, as shown above (after saving, they will also appear in the browser title bar)
* [[MainMenu]]: The menu (usually on the left)
* [[DefaultTiddlers]]: Contains the names of the tiddlers that you want to appear when the TiddlyWiki is opened
You'll also need to enter your username for signing your edits: <<option txtUserName>>
Submerge cut celery end in water and just wait in no time celery will begin to grow.  Can do the same with green onions.


http://www.highdesertchronicles.com/2012/05/growing-celery-from-discarded-bottoms/
A bar of your favorite soap 1c. Grated
1 T. Vegetable glycerin (I found mine at Whole Foods for $6)
10c. Water


Grate the bar of soap into small flakes.  The smaller they are, the quicker they'll dissolve.

Add 1 cup of flakes and 1 T of glyerin to 10 cups of water in a large pot.
Simmer for a few minutes until the flakes dissolve.  Let it cool.  ALL THE WAY.  I'll explain later.

Refill all your hand soap pumps and store the rest for later!

http://bonnieprojects.blogspot.com/2011/12/make-your-own-hand-soap.html
Marker for Health
Herb Seasoning Salt

Use this MSG-free herb seasoning salt to season salads, salad dressings, soups, sandwiches and more.

    1 cup sea salt
    1 teaspoon oregano
    1 teaspoon garlic powder
    2 teaspoons onion powder
    1/2 cup dried parsley
    1 teaspoon basil
    1/2 teaspoon dill weed
    1 teaspoon sage

Put all ingredients in blender container and blend to chop up the herbs and incorporate all the ingredients. Store in a glass jar or a salt shaker in a cool, dry place.

http://gnowfglins.com/2006/08/04/herb-seasoning-salt/
Influence the color of your hair naturally:

This is not as drastic of a change as dying your hair, but it can help lighten or darken your hair as you would like. Create an herbal tea or herbal vinegar with your choice of herbs and use as a hair rinse after each shower to help enhance your hair color.


Herbs for dark hair: Nettle, rosemary, sage and thyme
Herbs for light hair: Chamomile and Calendula

 
Fill a jar with chopped fresh herbs or half fill with dried herbs. Cover with warm apple cider vinegar then cap with a non metal lid
    
Set the jar in the hot sun or another warm place for 24 hours. Strain the herbs from the vinegar, add more herbs and repeat the process. Repeat once more if a very strong vinegar is desired.

Strain through a sieve with a coffee filter inside (to remove all herbal matter from the vinegar)
    
Add 2 tsp glycerine to each cup of vinegar

To use:

Add 1-2 tbsp vinegar to a 10fl oz spray bottle, rinse hair with water after shampooing and spray throughly with vinegar rinse. Do not rinse out. You can also use this as the conditioning treatment after you clean your hair.

http://naturallivingmamma.com/2012/07/16/apartment-homesteading-make-your-own-personal-care-products/
Keto Stuff
1/4 C Coconut Milk 
1/2 C Liquid Castile Soap (like Dr. Bronner’s)
1/4 C Vegetable Glycerin (for thickness)(it leaves less of an “oily” feel if you use 1/2 C Glycerin so play with it and do what is best for you)
   
2 tsp coconut, almond, or jojoba oil (I have used almond and coconut and in the summer when the bathroom stays warm coconut is the way to go)
    
3-4 drops each of these 100% Certified Pure Therapeutic Grade Essential Oils (you want the good stuff, Melaleuca, Geranium, Ylang Ylang, Basil, Frankincense)


Combine all the ingredients, mix well and put into the bottle you will use. I tried re-using an old shampoo bottle but it apparently had a cracked bottom and leaked my shampoo on the counter SO I switched to a peri-bottle that I got from the hospital and never used after having N, and it makes a very good shampoo bottle.

That’s it! It is super easy and works great.

NOTE: I added the glycerin in the last two batches and it thickens up the recipe nicely. The recipe without it works great, but with the glycerin it has more of a “shampoo like” consistency. You can add up to 1/2 C for desired thickness.

Another note, it will separate when it sits, so just give it a good shake before shampooing.

http://naturallivingmamma.com/2012/07/09/home-made-anti-dandruff-shampoo/
Green Home Pest Control Tip #1 – Know Your Pests

The first step for successfully getting rid of your insect invaders and keeping them out is to know what you’re dealing with.  “Bugs” aren’t just bugs – different species have very different habits and food preferences. What works with some types of insects or ants might not work with others at all. 

Top pantry pests include meal moths and various pantry beetles.  You can find photos of common pantry pests at UC Davis and Cereal and Pantry Pests at PennState.  If you can’t find your bug in those images, take a photo of their nests or the insect and post the image on the internet in pest control forums or email it to someone with pest experience.
Green Home Pest Control Tip #2 – Bug Proof Your House

This is another crucial and very clean step that you need to take if you don’t want to ever have to resort to chemical pest control. Before you even have a problem, or to avoid future pest problems, start off your pest control by making your house hard to attack.  (Similar tactics apply when you’re trying to keep mice out of your home and garage.)

    Don’t leave any organic garbage lying around to attract ants, wasps, mice and other pests like cockroaches.
    Look around your house and seal any cracks, holes, leaks or other easy access points that will let little critters get into your home easily.
    Seal off all your garbage in airtight plastic containers that can’t be penetrated by even small pests.
    Keep your house dry and make sure that it’s got no major water leaks either from your piping system or badly rain-proofed windows and roofing – many insect pests love moist, humid hideouts

Making your home more pest resistant isn’t a guarantee of anything, but it does reduce your chances of having an invasion happen.
Green Home Pest Control Tip #3  – Commercial Products

These will cost a little more, but if you’re in a hurry, you can go ahead and use commercial green pest control products.  Look for organic insecticidal soaps, pantry moth traps, citrus based sprays, clothes moth traps or other plant/essential oil based sprays.
Green Home Pest Control Tip #4 – Cedar Oil

Cedar oil, also known as cedarwood oil, is an essential oil derived from the foliage, and sometimes the wood and roots, of various types of conifers, most in the pine or cypress botanical families. (source) Cedar oil can be used as a backyard mosquito repellant when burned – just like citronella.  The liquid can be applied to household plants, used as a treatment in bedding or for bathing your pets.  (Note:  use only for large animals such as dogs, cats over 6 months of age, horses, cattle, etc – not for use with small animals such as hamsters, gerbils, snakes, etc.)  It is effective against fleas, bed bugs, spiders and many other insects.  Best of all, cedar oil smells nice and has no harmful effects on the skin.
Green Home Pest Control Tip #5 – Non Lethal Traps

For your bigger, and probably furrier household pests like mice, rats, rabbits and snakes, you can use non-lethal traps to catch them without killing them and later release them far from your own home (be sure to also release them away from anyone else’s house unless you enjoy being a bad neighbor). All sorts of non lethal traps are sold on the market, each for a different type of animal. There are special cages on sale for rodents and traps for creatures like snakes and small reptiles.
Green Home Pest Control Tip #6 – Soapy Water

A small amount of vegetable oil based (castile) soap to a two gallon bucket of water will create a completely non toxic, easy to use ant killing solution. Mix the solution thoroughly and either pour it along patio areas where you have frequent ant infestations or use from a spray bottle to control ants and other small insects wherever they appear. Be sure to use castile soap that contains fatty acids from vegetables since it’s the most chemical free and safest for home use. You’ll hardly find a cheaper solution to ant infestations.
Green Home Pest Control Tip #7 – Food Based Remedies

Instead of resorting to all sorts of different chemical repellants to get keep insect pests away, you can try out a large variety of different home remedies that are based on foods or commonly bought plants.

For example:

    Ants hate citrus oil and coffee grounds; both can be used in strategic entry locations to repel the little insects from your home’s interior.  For sugar ants – mix 1 tablespoon of sugar with 1/8 teaspoon of borax.  Add enough water to make a syrup.  Place about a teaspoon of this mix on something like a flat lid in the affected area, but out of reach of pets and children.  The ants will carry the syrup back to the nest and eliminate it.  Borax is not dangerous in very small amounts, but you wouldn’t want kid or critter eating it in quantity.
    Deter fruit flies by applying a small wad of of crushed mint leaves to window entrances and near doorways.  Fruit flies seem to hate natural mint.
    Cut off cockroaches with catnip – Add a small amount of dried or fresh catnip to some water and steep it as if you were making tea.  Cool, strain and place in a spray bottle.  Apply wherever your ugly cockroach problem is showing itself.

http://commonsensehome.com/green-home-pest-control-tips/
White vinegar
Baking Soda
Optional: Lemon essential oil
Old towels or rags

Instructions:

    If using lemon essential oil, mix it with baking soda, then sprinkle mixture on spot
    Allow to sit from an hour to overnight. If not using essential oil, just sprinkle plain baking soda over stain.

Mix a 1:1 ratio of vinegar and water in a spray bottle. Generously spray this mixture on baking soda and allow to fizz. Lay towel or rag over wet spot and press to absorb moisture

Depending on the severity and age of stain, several applications may be required 


http://www.theprairiehomestead.com/2010/10/frugal-natural-carpet-cleaner.html
Ingredients

-1 1/4 cup distilled water
-1/4 cup dried marshmallow root
-1 tablespoon apple cider vinegar
-1/2 tablespoon olive or jojoba oil
-essential oils, optional

Method

1. Combine marshmallow root and water in a small pot and simmer over medium low heat for 15-30 minutes to allow the mucilage to release. The longer you let it simmer the thicker the mixture will be. Note: I order my Marshmallow root from Mountain Rose Herbs.

2. Remove pot from heat and allow mixture to cool.

3. Strain through a fine mesh strainer, nylon, tea towel, or cheesecloth. Squeeze the strainer in order to extract all the goodness of the herb (you will now understand how ”Marshmallow” root got it’s name). Compost the herbs and reserve the liquid.

4. To the Marshmallow root infused water, add vinegar, oil, and essential oils if using.

5. Pour into a re-purposed detangler spray bottle. Re-label and use as you would commercially-prepared spray. Shake well prior to use.

Note: This formula is not.greasy.at.all. It is well absorbed by the hair and leaves it soft and managable all day! You’ll love it!

http://frugallysustainable.com/2012/04/a-recipe-for-homemade-herbal-detangler-spray/
    1 bar of Ivory Soap
    2 cups of Super Washing Soda
    2 cups of Borax

microwaved ivory soap

Step #1:

    Microwave your Ivory Soap for 60-90 seconds – YES, microwave :) I hate grating – whether it is cheese or soap, I don’t like grating stuff.  Plus it takes a long time to grate.  The other benefit is that not only is it fast and easy – it is also a super fun experiment and project – your kids will love it!!
    Although it looks soft and edible, it is actually an unexpected consistency – dry and brittle – and it will process very well in a blender or food processor without taxing your equipment (I also want my food processor to last a long time!).
    Plus if any spills over off the plate, it is a way to get your microwave a bit cleaner – and the after smell makes your home smell like a clean linen smell.  Very pleasant!

put ivory soap into food processor

Step #2:

    Put the 2 cups of Washing Soda and the soap (broken up) in your blender or food processor and mix until blended well
    Then add the 2 cups of Borax and blend again until well blended

Your final product will be a nice fluffy white powder detergent that smells great and works well! We store it in a #10 can in our laundry room!  This is a 40 – 80 loads worth of detergent!

Here’s how to use it:

    Light Load – 1 Tablespoon
    Heavy Load – 2 Tablespoons


http://thethriftycouple.com/2012/01/26/homemade-laundry-detergent-powder-recipe-like-ivory-snow-and-dreft-soap/
1 bar of soap Fels-Naptha(If can't find use Ivory for now).
1/2 cup Borax
1/2 cup WASHING Soda (this is different than BAKING soda!)
Water
5 gallon bucket

Grate the bar of soap with a cheese grater. Place the shreds in a medium saucepan with several cups of water. Heat and stir until the soap pieces are dissolved.

Add in the Borax and Washing Soda. Stir until thoroughly incorporated and dissolved.

Pour into a 5 gallon bucket. Fill 3/4 of the way full with hot water. Give it a good stir, then allow it to sit undisturbed overnight.

Your finished product will be a gloppy, chunky gel. I like to store the bulk of the soap in the 5 gallon bucket in the basement. I use a smaller plastic bucket to store a smaller quantity in my laundry room. 

http://www.theprairiehomestead.com/2011/07/frugal-homemade-laundry-soap.html
Original recipe:

Beeswax (1-lb. block)
Vegetable shortening
Canola oil
Essential oil, of your choice 
Form/mold (Soap Molds)

Alternate Recipe:

Cocoa butter
Beeswax
Coconut Oil
Optional: Vitamin E Oil and Grapeseed Oil
Optional: essential oil of your choice

Both recipes: Melt a 1:1:1 ratio of all three ingredients (you’re going to add the essential oils at the end, if you’re using them) in a double boiler or a small pan inside of a larger pan of boiling water. 

Once everything is melted together, stir well, remove from heat and, if you’re going to use them, add the essential oils. (And if you’re using them, pour in 2 teaspoons of vitamin E oil and 2 tablespoons of grapeseed oil.) I used around 25 drops of bergamot for 4 bars in the original recipe.

Pay attention to any directions that come with your mold…for example, mine specifically noted that anything above 150 degrees could melt the mold. Since my mixture was closer to 165 degrees, I let it cool in the pan on my counter before pouring it into the mold. Nothing would be worse than pouring your mixture into the mold, just to watch the mold melt away! If you’re using silicone, you shouldn’t have to worry about this

Once the bars have cooled, pop them out of your mold and enjoy!

To use, rub them between your hands and your body heat will soften the bar enough for you to get what you need. It WILL be extremely oily at first, but it WILL soak in after a couple of minutes.

Lip Balm:

Using the same method, melt together a 1:1 ratio of beeswax and olive oil (you really could use any oil you want, but olive oil is awesome for your skin. I think I might add in some coconut oil next time, too!), stir in your essential oil (I used 2-3 drops per jar) and pour into a container of your choice!

Voilá! Now you have two items to make from scratch that won’t take a lot of time or money and you’ll managed to have remove even more chemicals and other yucky stuff from your home and your daily routine.
''Ingredients''
* Two-28 ounce cans of diced tomatoes
* Two-28 ounce cans of tomato sauce
* 1 6-ounce can of organic tomato paste
* 1 large carrot, peeled, quartered lengthwise and cut into ½ inch pieces
* 1 rib of celery halved lengthwise and cut into ½ inch pieces
* 1 small yellow onion, diced into ½ inch pieces
* Approx. 56 ounces of cold water (just fill one of those empty tomato sauce cans two times)
* 1-2 Tablespoon Extra Virgin Olive Oil
* 3-4 medium-large garlic cloves finely minced (depends on how much garlic you like)
* Kosher salt and freshly ground black pepper and sugar (if necessary)
* 2-3 Tablespoons fresh basil- cut chiffonade. (That’s chef-speak for roll the leaves into a cigar shape and slice very thin ribbons of basil)
* 2-4 Tablespoons fresh oregano- roughly chopped (start with 2, you can always add more if you want)
* 2-4 Tablespoons fresh Italian flat-leaf parsley- finely chopped (start with 2, you can always add more if you want)
* 1-2 tsp. dried basil and oregano, and marjoram. Start with 1 tsp., let sauce cook a bit, taste and add more if desired. Sometimes I add up to 3 tsp of oregano and basil
* Sea Salt & freshly ground black pepper
* 1-2 bay leaves. Fresh is best, dried is perfectly fine
* The rind from a hunk of GOOD Parmesan cheese. I typically use a 6x4 inch piece
* Organic cane sugar or baking soda

''Directions''
# Add 1 Tablespoon of olive oil to a large stockpot or Dutch oven that was pre-heated over medium-high heat. Add diced veggies. Sprinkle with approximately 1/4 tsp. salt and 1/8 tsp. black pepper. Cook until veggies start to soften; about 5-7 minutes. If they start to brown, reduce heat to medium-low. Stir frequently.
# Next add the cans of tomato sauce, diced tomatoes, water, minced garlic, fresh herbs, dried herbs and bring to a lazy bubble over medium heat. Once your sauce starts to bubble, add the Parmesan cheese rind (or fresh Parmesan) and the can of tomato paste. Stir well to incorporate the cheese and reduce heat to lowest burner setting.
# Simmer the sauce for 3 hours stirring frequently to prevent burning. (I simmer mine total for at least 6-8 hours.)
# After 3 hours, taste sauce again and adjust the seasonings/herbs.
# Simmer the sauce for another hour. Using an immersion blender, whir the sauce until the pieces of tomato, carrots, onions and celery are blended and as smooth as you can get.
# If you don’t have an immersion blender you can use a normal blender, but only blend 2-3 cups at a time, and remove the center of the lid and place a folded kitchen towel over the opening to allow steam to escape, without burning your hand. Hot liquids will cause the cover to blow off and you’ll have a tomato-decorated kitchen and burned hands.
# Blend the sauce until it’s smooth.
# If you used a Parmesan cheese rind, the immersion blender will whir that into very small pieces, and after it's cooked in the sauce for several hours, those little cheesy bits taste heavenly in the finished sauce.
# You may need to add a little more water once you return the blended sauce back to the sauce pot. The water will cook out; so don’t worry if you add too much you can cook it to your desired consistency. I prefer mine a little loose because it thickens up in the fridge.
# Once you've achieved the seasoning level you desire, (this is the point where you would add cooked homemade meatballs) continue to simmer for another 4-6 hours, stirring frequently and taking care to not let any sauce burn on the bottom of the pan.
# Remove the pot from the heat, and let it cool down as much as possible. Cover and refrigerate overnight. If you simply can't wait a day while your sauce does magical things as it chills in the fridge, go ahead and serve it over some pasta.

''Notes''
Seasoning: Each time you add an element; it is best to taste it for seasoning. Let it simmer/cook for a few minutes, stir well, taste, and then adjust seasonings. You may find you want to add a little more garlic, or another teaspoon of an herb.

Parmesan Cheese Rinds: I use the rinds to flavor soups and sauces. If you don't happen to have a spare rind sitting around, run to the store and buy a hunk of good Parmesan (please, don't come home with that green canister of grated Parmesan) and toss in 1-2 ounces of Parmesan, either grated or cut into small chunks.

Acidic Sauce: If your sauce seems very acidic, add a TB of good olive oil or butter and a ¼ to ½ tsp. of baking soda and stir well. You can also add a teaspoon of sugar if you find your tomatoes are very acidic. The baking soda makes it more alkaline and the sugar cuts the acidity by making it a bit sweeter. Baking soda will cause your sauce to bubble for a bit, so make sure you start with a very low amount and taste after each addition.

The sauce tastes much better after spending at least 12 hours in the chill chest (fridge)-- I try to give it a good 24-36 hours in the fridge before using it for spaghetti or lasagna or shells.
This dressing is made with real honey, but since it is mostly olive oil, the sugar content of the dressing per serving is quite low. This dressing keeps well in the refrigerator, and the roasted garlic is an excellent emulsifier, so it usually doesn ' t separate like most oil and vinegar concoctions.

''Ingredients:''
* 10 cloves of roasted garlic
* 20 fresh medium or 10 large basil leaves
1/4 cup unsweetened rice vinegar ( find it in the Asian foods section of your grocery )
1/4 cup honey
* 2 packets of Splenda or 2 level tablespoons xylitol
* 1 cup light ( not extra virgin ) olive oil
* 1/2 teaspoon salt
The best way to roast garlic is to get a covered ceramic garlic roaster, slice the tops off a full garlic bulb, drizzle it with a tablespoon of olive oil and roast in the over for 4 5 min at 400 of. Alternatively use a metal muffin tin, place the trimmed garlic bulb base down, drizzle with olive oil, cover each bulb with aluminum foil, and bake for 30-40 min at 400 of. When done, the garlic cloves are soft and starting to push up out of the holes you cut in the top of each clove.

Put the roasted garlic cloves, basil leaves, rice vinegar and honey into a food processor or blender and process until very smooth ( at least 2 minutes ) . Add the olive oil, sweetener, and salt. Blend until well mixed. Refrigerate extra in a closed container.

Makes 1 2 one oz servings, each containing 20 grams of fat and 5 grams of carbohydrate.
5 tbsp emulsifying wax
1 tbsp liquid lanolin
1/4 cup coconut oil
1 teaspoon honey

Over medium heat in a double boiler, melt the ingredients until smooth.

http://back2basichealth.blogspot.com/2012/04/diy-moisturizer-recipes.html
    1/2 cup of oatmeal
    2 tbsp. honey
    1 tsp. nutmeg
    15 drops lavender EO
    15 drops tea tree EO
    1 tsp. dried lavender(optional)
    You’ll also need a blender, a measuring cup, a spoon for mixing,measuring spoons, and a container with a lid to keep the scrub in.

Directions

    Measure out your oatmeal. Run it through the blender to break it up a bit. You don’t want it be too powdery, just break it up a tiny bit.
    Put it back into the measuring cup.
    Add the honey, nutmeg, and essential oils straight into the measuring cup as well. You can also add dried lavender if you have it. This is completely optional. I’ve made it with and without it, and it works great both ways! I just really love lavender!
    Stir to combine all ingredients. It will be a bit crumbly. If you need a tad more honey to get it thoroughly mixed together that’s fine.
    Transfer the scrub to your container. I reuse an old container that I have, or you could use a small jar or small tupperware container – anything that has a lid and can be sealed.

 And you’re done! I keep the scrub in the shower and use it once a day in my shower. You can also keep it by the sink, whatever you prefer. Just use this scrub as you would any other facial cleanser/scrub. I also use a light moisturizer after I get out of the shower. This scrub will last about 2 weeks.

http://naturallivingmamma.com/2012/09/19/honey-oatmeal-face-scrub/
    2 C Organic Cane Sugar
    3 Tbsp Olive Oil
2 Tbsp Raw Honey (Where to Buy)
5-10 drops each (personal preference) Peppermint Essential Oil and Wild Orange Essential Oil

What To Do:

Combine ingredients in a bowl and mix well. It will be a clumpy, grainy consistency. If it is runny, add a little more sugar by the tablespoon until you have the right consistency.

Place in a jar. I like small jam sized mason jars. Decorate as you choose.

http://www.littlehouseliving.com/sugar-honey-scrub.html
The supplies you need are:

    Baking Soda
    Vinegar
    Original Blue Dawn (this is the only dish soap I have tried for this and original blue dawn has many non-dish cleaning wonders)
    Toothbrush for scrubbing

supplies needed for step 1 of stainless steel sink cleaning1

    Ziploc – for thriftier ideas, reuse the same ziploc for all the faucets/showerheads that day. We have even recycled bread bags for this purpose too! They are nice and long for long faucets.
    Rubberband

It is really, really simple to make the solution.

    In the ziploc bag, add 2 TBSP of Baking Soda and add 4-5 drops of blue dawn dish soap.
    Place the bag around the faucet/showerhead.

faucet11

    Then add enough vinegar to the ziploc to cover the surface you wish to soak (about 1/2 cup). It will foam up!
    Secure the ziploc in place with a rubberband.
    Let soak for at least 30 minutes, but 1+ hours is great too!

faucet21

    Then remove the baggie and rubber band (and then place on the next faucet if it didn’t get too dirty or make a new solution and the same bag for the next faucet).
    Then, using an old toothbrush, scrub away!

faucetscrub1

    To rinse, I just pour cups of hot water over it until the soap residue is gone.

The GREAT thing about this type of faucet or shower head cleaning process is that no matter how many crevices, nooks and crannies there are or the type of faucet, this works super well!  It is also not very time consuming, although very effective.  It can sometimes be a lot of work to scrub and scrub and scrub the faucets and shower heads, but by giving them this presoak, the gunk really breaks down nicely.

http://thethriftycouple.com/category/homemade-products/
How to infuse oil

The first thing you need to know is how to infuse oil. Every herbalist has their own spin on how they infuse their oils. I stick with two simple ways.

Infuse over time:

    Add dry herbs to a mason jar and cover them with oil of choice having 1 inch extra oil above the herbs.
    Cover with a lid or cheese cloth and place it in a warm, sunlight filled area.
    Shake the mason jar every day for 6-8 weeks and your oil is infused!
    Strain through cheese cloth and squeeze out every last morsel of oil from the herbs. There are lots of nutrients in that last few drops that cling to the plant.

This is the most medicinally beneficial way to infuse herbs. It can be done with fresh herbs too but requires caution because botulism can fester because of the moisture from the herbs. It also requires a lot of patience.

Infuse with heat:

    Place the herbs and oils of your choice into the mason jar or pyrex dish as before.
    Put the glass container with the herbs and oils into a hot water bath in another pan on medium/low heat. The water should be level or almost level with the oil.
    Keep the water evaporating but not boiling for 2-8 hours adding water occasionally to keep the level high.
    Strain through cheese cloth once the oil has cooled and squeeze out every last morsel of oil from the herbs. There are lots of nutrients in that last few drops that cling to the plant.
    Decant oil into container you are using as a gameilizative.net gift.

This is the method I use most often. It still has great medicinal benefit, smells divine and works great. Some people use a crock pot instead of water of a stove. My crockpot is too hot and burns the oil so be sure you are not frying your herbs.

Oils you can use

You can infuse just about any oil. You can even make oil blends specific to skin issues. The most common oil to use is Olive Oil. I would go through the most popular oils with you but Axiom at Home already did a lot of the work for me. Part 1: Almond, Coconut & Avocado, Part 2: Meadow Foam Seed, Jojoba Oil, Hemp Seed Oil, Part 3: Grapeseed, Kukui Nut and Olive Oil. I would also like to mention apricot seed oil is wonderful for sensitive highly allergenic skin. Mix and match as you please!

http://www.modernalternativehealth.com/2012/12/19/herbal-bath-oils-handmade-holidays/#
You will need:

    Canning jars (My wicks were rather short, so pint-sized jars were perfect)
    Tallow OR lard OR soy wax (where to buy soy wax pellets- aff link)
    Wicks (one per jar) (These are the wicks I bought- aff link)
    Essential oils (optional) (These are my favorite essential oils!)

I didn’t include exact measurements for anything because this recipe is super-duper flexible. I like using pint-sized mason jars, but you can really use any size. The amount of tallow you need will depend on how many candles you want to make and what size your containers are.

First off, melt your tallow or wax in a double-boiler. I don’t have a double boiler, so I rigged up a DIY double-boiler instead.

I placed the tallow chunks inside a #10 can, and placed the can inside a stock pot filled half-full with water.

how to make survival candles

Using a can is especially handy since you don’t  have to clean it out afterwards. (Washing off tallow or wax generally isn’t easy…) Thanks to Happy Money Saver for inspiring this idea. ;)

Once the tallow has melted completely, remove it from the heat and allow it to cool for a bit.

While the tallow is cooling off, you can prepare your jars.

how to make talllow emergency candles

Place one wick in each jar. Now–this is the hardest part–you want the wicks to stay in the middle of the jar once you pour the tallow in. To accomplish this, you have several options:

    You can use a hot glue gun to glue the wick to the bottom of each jar.
    You can use a Sticky Dot or some other type of glue.
    You can prop the wick in place with a couple of pencils.
    You can place strips of tape over the mouth of the jar to hold the wick in place.

how to make jar candles

It doesn’t matter how you get it done, just figure out a way to convince Mr. Wick that he should stay in the middle of the jar.

Once the melted tallow has cooled off a bit (not hardened–just cooled), you can pour it into the jars.

If you like, you can add some essential oils at this stage. I gently stirred 30 drops into each pint-size jar. How much you use will depend on what oil you are using and how large your containers are.

Allow the tallow to harden completely, then trim the wick (if needed).
Candle Notes:

    Although beef tallow can be pretty stinky when you are rendering it, thankfully, I haven’t noticed much of a smell when I burn my tallow candles.
    If you are making these candles solely for emergency situations, I’d probably just omit the essential oils.
    If you don’t butcher your own beef, check with your local butcher about buying beef fat so you can render your own tallow.
    You can use other glass jars, but be extra-cautious, as sometimes they can shatter due to heat. To avoid this, heat them up (in the oven or with a hair dryer) before you pour the melted tallow inside. Canning jars are made to withstand high temps, which is why I prefer to use them for this.

how to make candles

Tuck your emergency candles away for next time there is a power outage, or burn them right away and enjoy the satisfaction of your very own homemade, toxin-free candles. 

http://www.theprairiehomestead.com/2014/01/tallow-emergency-candles.html
On Sunday, May 02, 2010 12:58:20 PM, YourName imported 4 tiddlers from
[[C:\Users\SpeedDevil\Desktop\empty.html|C:\Users\SpeedDevil\Desktop\empty.html]]:
<<<
#[[StyleSheet]] - added
#[[center]] - added
#[[floatleft]] - added
#[[floatright]] - added
<<<
''Articles''
http://www.westonaprice.org/blogs/kdaniel/2012/03/29/save-your-bacon-sizzling-bits-about-nitrites-dirty-little-secrets-about-celery-salt-and-other-aporkalyptic-news/
http://www.ketogenic-diet-resource.com/
http://www.carbsmart.com/how-to-add-more-fat-to-your-low-carb-diet-for-nutritional-ketosis.html
http://www.grassfedgirl.com/which-fats-to-are-healthy/
http://www.grassfedgirl.com/10-tips-for-getting-into-nutritonal-ketosis-for-weight-loss/
http://www.businessinsider.com/13-nutrition-lies-that-made-the-world-sick-and-fat-2013-10
http://www.bengreenfieldfitness.com/2013/10/deep-dive-ketosis-navy-seals-extreme-athletes-busy-executives-can-enhance-physical-mental-performance-secret-weapon-ketone-fuel/
http://www.proteinpower.com/drmike/saturated-fat/tips-tricks-for-starting-or-restarting-low-carb-pt-ii/
http://eatingacademy.com/nutrition/ketosis-advantaged-or-misunderstood-state-part-i
http://eatingacademy.com/nutrition/ketosis-advantaged-or-misunderstood-state-part-ii

''Links''
http://www.ibreatheimhungry.com/
http://www.ruled.me
http://highsteaks.com/
http://www.gnolls.org

''Exercise''
http://resistancebandtraining.com/library/resistance-band-training-articles/high-intensity-strength-training-with-resistance-band-train/
http://www.healingdaily.com/slow-motion-resistance-band-workout-with-bodylastics.htm



''Test Strips''
The test strips are available on Amazon. They cost about $6 each. A person can get them online at a Canadian Pharmacy for $2 each here: http://www.universaldrugstore.com/medications/Precision+Xtra+Ketones+Test+Strips/#disclaimer 
//{{{
config.formatters.unshift( {
	name: "inlinetabs",
	match: "\\<tabs",
        lookaheadRegExp: /(?:<tabs (.*)>\n)((?:.|\n)*?)(?:\n<\/tabs>)/mg,
	handler: function(w)
	{
	    this.lookaheadRegExp.lastIndex = w.matchStart;
	    var lookaheadMatch = this.lookaheadRegExp.exec(w.source)
	    if(lookaheadMatch && lookaheadMatch.index == w.matchStart)
			{
             var cookie = lookaheadMatch[1];
  	         var wrapper = createTiddlyElement(null,"div",null,cookie);
	         var tabset = createTiddlyElement(wrapper,"div",null,"tabset");
             tabset.setAttribute("cookie",cookie);
             var validTab = false;
             var firstTab = '';
             var tabregexp = /(?:<tab (.*)>)(?:(?:\n)?)((?:.|\n)*?)(?:<\/tab>)/mg;
             while((m = tabregexp.exec(lookaheadMatch[2])) != null)
                 {
		         if (firstTab == '') firstTab = m[1];
		         var tab = createTiddlyButton(tabset,m[1],m[1],story.onClickInlineTab,"tab tabUnselected");
		         tab.setAttribute("tab",m[1]);
		         tab.setAttribute("content",m[2]);
		         tab.title = m[1];
		         if(config.options[cookie] == m[1])
                     validTab = true;
                 }
             if(!validTab)
                 config.options[cookie] = firstTab;
	         w.output.appendChild(wrapper);
	         story.switchInlineTab(tabset,config.options[cookie]);
             w.nextMatch = this.lookaheadRegExp.lastIndex;
			}
	}
})

Story.prototype.switchInlineTab = function(tabset,tab)
{
    var cookie = tabset.getAttribute("cookie");
    var theTab = null
    var nodes = tabset.childNodes;
    for(var t=0; t<nodes.length; t++)
    if(nodes[t].getAttribute && nodes[t].getAttribute("tab") == tab)
        {
        theTab = nodes[t];
        theTab.className = "tab tabSelected";
        }
    else
        nodes[t].className = "tab tabUnselected"
	if(theTab)
		{
		if(tabset.nextSibling && tabset.nextSibling.className == "tabContents")
			tabset.parentNode.removeChild(tabset.nextSibling);
		var tabContent = createTiddlyElement(null,"div",null,"tabContents");
		tabset.parentNode.insertBefore(tabContent,tabset.nextSibling);
		wikify(theTab.getAttribute("content"),tabContent);
		if(cookie)
			{
			config.options[cookie] = tab;
			saveOptionCookie(cookie);
			}
		}
}
    
Story.prototype.onClickInlineTab = function(e)
{
    story.switchInlineTab(this.parentNode,this.getAttribute("tab"));
    return false;
}
//}}}
[img[images/italiandressingmix.jpg]]
Italian Dressing Mix

''Ingredients:''
*1 1/2 teaspoon garlic powder
*1 Tablespoon onion powder
*2 teaspoon oregano
*1 Tablespoon dried parsley
*2 teaspoons sea salt
*1 teaspoon pepper
*1/4 teaspoon thyme
*1/2 teaspoon dried celery flakes

''Directions''
*Shake ingredients together and store in a jar.  (It doesn’t really have to be a jar…I just really love my jars…)
[img[images/italiandressingmix.jpg]]
''Indreedients''
*2 Tablespoons [[italian dressing dry mix|Italian Dressing Mix]]
*1/4 cup vinegar (I prefer red wine vinegar)
*2 teaspoons water
*1/2 cup olive oil

''Directions''
*Combine all ingreedients
*Mix
* 1 1/2 2 pounds of lean meat
* 1/4 cup soy sauce
* 1 tablespoon Worcestershire sauce
* 1 tablespoon liquid smoke
* 1/2 teaspoon onion powder
* 1/4 teaspoon garlic powder
* 1/4 teaspoon black pepper
[[Kefir: the not-quite-Paleo superfood|http://chriskresser.com/kefir-the-not-quite-paleo-superfood]]
[[Kefir Benefits: 12 Things To Know About This Yogurt-Like Food|http://www.huffingtonpost.ca/2013/09/12/kefir-benefits_n_3914818.html]]

[[Cultures for Health - All Kefir Ranch Salad Dressing|http://www.culturesforhealth.com/all-kefir-ranch-salad-dressing-recipe]]
[[Real Ranch Dressing|http://www.homemademommy.net/2012/01/real-ranch-dressing.html]]
[[Kefir Ranch – A Ferment for Your Christmas Salad|http://phickle.com/index.php/kefir-ranch-a-ferment-for-your-christmas-salad/]]
[[Homemade Kefir Ranch Dressing {with fresh dill}|http://www.fromthelittleyellowkitchen.com/2012/02/21/homemade-kefir-ranch-dressing/]]
[[3 Easy Probiotic Salad Dressing Recipes|http://www.heavyonwholesome.com/3-easy-probiotic-salad-dressing-recipes/]]
[[Creamy Kefir Salad Dressing or Fake "RANCH"|http://www.affairsofliving.com/imported-20100106014405/2009/3/8/creamy-kefir-salad-dressing-or-fake-ranch-gluten-free-vegeta.html]]

[[Cultures for Health - Recipes Using Milk Kefir|http://www.culturesforhealth.com/milk-kefir-recipes]]
[[80+ Ways & Recipes To Use Milk Kefir|http://healthfoodlover.com/hfl/2011/07/many-ways-recipes-milk-kefir/]]
[[The Healthy Site - Kefir Recipes|http://thehealthyeatingsite.com/category/recipes/fermented-foods/kefir-recipes/]]
[[More Kefir Recipes|http://maria.fremlin.de/recipes/kefir-recipes.html]]
[[Kefir Recipes|http://kefirrecipes.net/?page_id=95]]

[[Milk Kefir: Flavoring and Recipes|http://www.yemoos.com/milkrecipes.html]]
[[8 Yummy Ways to Eat Kefir|http://gnowfglins.com/2009/08/07/seven-yummy-ways-to-eat-kefir/]]
[[How-To Make Kefir and Recipes|http://users.chariot.net.au/~dna/Makekefir.html]]
[[Pinterest Kefir|https://www.pinterest.com/acknittel/kefir-recipes/]]
https://www.heyketomama.com/keto-brownies/

''Ingredients''
* 1/2 cup butter, softened
* 1 cup powdered erythritol
* 2 eggs
* 2 teaspoons vanilla extract
* 3/4 cup blanched finely ground almond flour
* 1/4 cup unsweetened cocoa powder
* 1 teaspoon baking powder
* 1/8 teaspoon salt
*1/4 cup low carb chocolate chips (Such as Lily's)
For the frosting
* 4 ounces cream cheese
* 1/4 cup butter
* 1/4 cup powdered erythritol
* 1/2 teaspoon vanilla extract
* 2 tablespoons unsweetened cocoa powder

''Instructions''
# Preheat oven to 350 and line an 8x8 baking dish with parchment, set aside.
# In a large bowl, cream the butter and erythritol. Mix in the eggs and vanilla. Add the almond flour, cocoa powder, baking powder and salt.
# Fold in chocolate chips and scrape batter into prepared 8x8 baking dish.
# Bake for 25-30 minutes. A toothpick should come out mostly clean. It may appear a little jiggly but almond flour sets as it cools.
# Combine cream cheese, butter, powdered erythritol, vanilla extract and unsweetened cocoa powder in a large mixing bowl. Using a hand mixer, mix until fluffy.
# Allow to cool for at least 30 minutes, and frost if desired. Cut into 12 pieces.
2 cups Stock/Drippings (you can use both or either)
1/2 cup Heavy Whipping Cream
4 tbsp Butter
1 tsp pepper
1/2 tsp xanthum gum
1 28 oz can tomato puree
1/2 c apple cider vinegar
1/2 tsp celery salt
1/2 tsp whole cloves
1/4 tsp cayenne pepper
1/2 Tbsp dehydrated onions or onion powder
1/2 Tbsp garlic powder
1 inch piece cinnamon stick, broken
4 packets stevia, approx 1 Tbsp or 3-4 scoops stevia extract
(I used purevia)

Add tomatoes, cayenne & stevia to a small saucepan and bring to boil, reduce heat to a simmer until it reduces by half – about half an hour–stir occasionally.  In another small saucepan, combine onion, vinegar, cinnamon, cloves and celery salt.  Bring to boil, remove from heat, and strain out solids.  Add strained vinegar and salt to tomato mixture.  Simmer for 20 – 30 minutes or until ketchup is desired consistency.  I ran mine through a magic bullet to get it nice and smooth after it cooled which you can do if you like a really smooth ketchup.  Store in a clean glass jar for up to a month in the fridge.  Add horseradish for cocktail sauce or chopped pickles and mayo for thousand island dressing.  So good you’ll be tempted to eat it straight out of the jar with a spoon!  The perfect topping for this burger!

Approximate nutrition information per tablespoon: 10 calories, 0g fat, 1.7g net carbs, 0g protein
[[Keto Show: Low Carb Cheesy Biscuits|https://www.youtube.com/watch?v=rOkMOG5gmwM]]
[img[images/cheesybiscuts.png]]
''Ingredients''
*1 cup + 2 tbsp almond flour
*4 tbsp butter
*1 tsp baking powder
*1/4 tsp salt
*1 cup shredded cheese
*4 eggs
*1 green onion

''Directions''
#Preheat oven to 400 degrees
#Combine almond flour, salt, baking powder and mix together with pastry cutter/fork to break up clumps 
#Add butter and mix with pastry cutter/fork
#Add cheese and mix with pastry cutter/fork
#Wisk eggs and add to bowl along with green onion and mix
#Grease muffin top pan, and pour batter in the 12 molds
#Cook for 10 minutes

''Nutritional Value'' 
*151 calories
*13.4g fat
*2.4 carbs
*1.1 fiber
*6.4g protein
''Ingredients''
* 1 cup diet Root Beer
* 1 ounce spiced rum
* 2 tablespoons heavy whipping cream 
* handful ice
''Instructions''
# Place both ingredients into martini shaker with ice and shake heavily for about 30 seconds.
# Pour into fancy glass and enjoy!
[[863: Dr. Ron Rosedale – KETO CLARITY Expert Interview|http://www.thelivinlowcarbshow.com/shownotes/10792/863-dr-ron-rosedale-keto-clarity-expert-interview/]] About 46 minutes in.

Carbs fall into 2 classes
# Fiber which does not raise blood sugar nor insulin
# Sugars/Starch which does raise blood sugar and insulin

The problem with resistant startch is twofold
# Even if your blood sugar stays at a nice level 88 due to the slow release of the sugars, it still provokes an insulin response.
# While 50% of the sugar that is consumed by gut bacteria that are beneficial, the other 50% are consumed by bacteria that is NOT beneficial. So you are still promoting the growth of unhealthy bacteria.

Rule of thumb. For extending life and better health outcomes, keep insulin levels low. Have great insulin and leptin sensitivity and be in a lchf state where T3s are naturally low. 
[[863: Dr. Ron Rosedale – KETO CLARITY Expert Interview|http://www.thelivinlowcarbshow.com/shownotes/10792/863-dr-ron-rosedale-keto-clarity-expert-interview/]] About 40 minutes in.

TSH is a released by the pitulitary glan to tell the brain "Hey thyroid! Make more T3"

__Hyperthyroidisim__
TSH = High
T3 = Low

__Properly Functioning Thyroid__
TSH = Normal or Low
T3 = Normal or Low

*People on Ketogenic/LCHF diets will often have low thyroid T3 but that is OK.
*If you do not havy Hyperthyroidisim lower T3 levels mean better health outcomes. Less cancer, dementia, heart issues, etc.
*Peole over 100 will have great insulin and leptin sensitivity AND low T3 levels. 


Protein Shake Recipes

These low carb protein shake recipes are high protein, lower fat, low carb and delicious. These could be consumed after a weight lifting session for extra protein intake.

----

''Chocolate Raspberry Protein Drink''
* 16 ounces unsweetened almond milk
* 4 ounces heavy cream
* 2 scoops Jay Robb Chocolate Whey Isolate powder
* 1 tablespoon of DaVinci Sugar Free Raspberry Syrup
* 1/2 cup crushed ice (optional: add if you like a thick drink, but the flavor will be less intense.)
Put all ingredients in blender and blend until smooth.

Makes 2 servings. Each serving has 351 calories, 25 grams of fat, 27 grams of protein, 4 carbs.

----

''Orange Coconut Protein Drink''
* 16 ounces unsweetened almond milk
* 4 ounces heavy cream
* 2 scoops Jay Robb Tropical Dreamsicle Whey Powder
* 1 tablespoon of Da Vinci SUGAR FREE Coconut Syrup
* 1/2 cup crushed ice (optional: add if you like a thick drink, but the flavor will be less intense.)
Put all ingredients in blender and blend until smooth.

Makes 2 servings. Each serving has 351 calories, 25 grams of fat, 27 grams of protein, 4 carbs.

----

''White Chocolate Almond Protein Drink''
* 16 ounces unsweetened almond milk
* 4 ounces heavy cream
* 2 scoops Jay Robb Enterprises Vanilla Whey Powder
* 1 tablespoon of Da Vinci Sugar Free White Chocolate syrup
* 1/2 cup crushed ice (optional: add if you like a thick drink, but the flavor will be less intense.)
Put all ingredients in blender and blend until smooth.

Makes 2 servings. Each serving has 351 calories, 25 grams of fat, 27 grams of protein, 4 carbs.

----

The Jay Robb Whey protein comes in five different flavors: chocolate, vanilla, strawberry, orange and pina colada. I haven't tried the strawberry or pina colada, but I bet they would be excellent in similiar low carb protein drink recipes.

Tip: Buy Jay Robb powder in bulk online, so that the per ounce cost is less.

The Da Vinci Sugar Free Syrups come in so many different flavors, I haven't had a chance to count them all.
''Ingredients''
* 3 quarts of filtered water
* 1 cup of white sugar
* 4 organic black tea bags

''Directions''
# Bring 3 quarts of water to a boil
# Add 1 cup of sugar and boil for 5 minutes
# Remove from heat
# add 4 tea bags
# Steep for 10 minutes
# Remove tea bag
# Let cool to 80-96 degrees
# Pour into jar
# Add 2/3 cups of starter to tea and mix
# Add Culture to jar
# Cover with clean non-bleached cloth
# Put someplace out of direct sunlight
# Start checking at 7 days
# Once baby culture is 1/4" thick  and the liquid is light it is done
# Reserve 2/3 cup of kombucha for starter for net batch

''Ingredients:''
* 1/2 cup mustard powder
* 3 tablespoons whey (OR whey from coconut milk kefir OR 2 tablespoons apple cider vinegar*)
* 2 tablespoons water (if using acv, use 3 tablespoons water)
* 3 tablespoons dried dill –OR– 5 tablespoons chopped fresh dill
* 3 to 5 tablespoons honey
* 1 teaspoon sea salt

Add ingredients to a bowl. Stir well. Pour mustard into a jar. Cover tightly and leave on the counter for three days before moving it to the refrigerator. Enjoy!

If using apple cider vinegar, this will not be lacto-fermented. Leave it out at room temperature for a few hours or a day, then move it to the refrigerator.


http://gnowfglins.com/2010/06/25/lacto-fermented-honey-dill-mustard/
1 bar ivory soap
½ cup Borax
½ cup Washing Soda

Directions:
– Grate soap and place in air tight container. Add borax and washing soda, shake well.
– Before use, give either a quick shake or stir.
– Use 1 tablespoon for cloth diapers, and 2 – 3 tablespoons for other loads.

http://naturallivingmamma.com/2012/07/29/apartment-homesteading-make-your-own-cleaning-products/
 

So there you have it! Some natural, quick, easy and effective cleaning solutions for your homestead no matter how large or small.
Recipes to get you started.

You can use liquid smoke to replace the smokey flavor of pork.

''Our Low Carb(Keto) and WAP (TF) Shopping List''
----
''Meats:'' - Grass Fed if you can and any other meat you like
*Ground Beef
*Chicken Breasts/ Thighs
*Roasts
*Cod Fillets Canned Tuna
*Canned Salmon
*Flank Steak London Broil
*Round Steak
*Fully Cooked Rotissery Chicken for bones for homemade Chicken Stock
*Hamburger Patties
*Beef Bones for homemade beef stock

''Dairy''
*Heavy Whipping Cream
*Butter (Kerrigold get at Sherms)
*Eggs
*Ricotta
*Parmesan Cheese – Fresh & Powder
*Blue Cheese
*Sour Cream Cheese
*Cream Cheese
*Cottage Cheese(4%)
*Half and Half
*Yogurt(Plain) Grass fed or plain greek
*Keifer - Sherms
*Grass Fed Milk – Sherms

''Fruits & Veggies'' - Fresh is Best but can also get Frozen
*Frozen Mixed Berries
*Celery Sticks
*Lettuces
*Onions
*Bell Peppers
*Frozen Cauliflower
*Frozen Broccoli Florets
*Cucumbers
*Radishes
*Canned Pumpkin
*Mushrooms
*Fresh Cauliflower
*Roasted Bell Peppers/ Also Regular Bell Pepper
*Frozen Green Beans
*Frozen Grilled Veggies
*Baby Bok Choy
*Fresh Brocolli
*Tomato Paste – For Ketchup etc.
*Steamer Veggies in Frozen Section

''Misc.''
*Exta Light Olive Oil( for making Mayonaise)
*Extra Virgin Olive Oil
*Avocado Oil
*Walnut Oil
*Chicken Stock in Cartons
*Sesame Oil
*Fish Sauce
*Braggs Apple Cider Vingar and any other Vinegars you like
*Bragg's Liquid Amino's
*Herbs and Spices galore pretty much anything thing you can get as you will be making your own spice mixes.
*Rapdura( http://bulknaturalfoods.com/rapadura-whole-organic-cane-sugar/ ) Can find at sherms or Costco under Organic Sugar is slightly brown in a green package
*Sucanant – Sherms – health food section
*Raw Honey – From Bee Keeper in Winston. Ask Fred for Info.
*Pure Maple Syrup – Sherms or Costco
*~EinKorn Flour – Sherms
*Blanched Almond Flour – Costco can get at Sherms look for Bob's Redmill or buy blanched almonds and make your own. You can also buy raw almonds, and lanch them yourself, dry them and grind them yourself. We just buy the already made stuff.
*Reg Almond Flour – Sherms Bulk Section
*Coconut Flour – Sherms Health food Section
*Coconut Oil – Sherms or Costco
*Coconut Nectar
*Maple Sugar
*Assorted Raw Nuts – Soak and then dry in your dehydrater
*Whole Old Fashion Oatmeal
*Almond Butter – We get this in the Bulk Section at Sherms and grind our own
*Peanut Butter - We get this in the Bulk Section at Sherms and grind our own
*Chia Seeds - Costco or maybe Sherms

A versatile dough that makes beautiful shortbread cookies, or the perfect crust for a summer fruit tart or lemon meringue pie!

Serves: 1 large tart or 16 cookies (about 2 inches in diameter)

''INGREDIENTS''
* 6 Tbl butter
* 2 cups almond flour
* ⅓ cup granulated sweetener (Splenda, Ideal, Swerve, etc.)
* 1 tsp freshly grated lemon zest

''INSTRUCTIONS''
# Melt the butter in the microwave or a small saucepan. Add the almond flour, sweetener, and lemon zest, stirring until fully combined.
# To make a tart or pie crust:
# No need to pre-chill, just press dough into tart or pie tins. Bake in a preheated oven at 350 degrees (F) for 15 mins until firm and golden brown.

''To make the cookies:''
Form dough (it will be crumbly, this is normal) into a cylinder and wrap tightly with plastic wrap to compress. Chill in freezer for 30 minutes or until firm, or in the refrigerator for 2 hours. With a sharp knife, slice into ½ inch thick cookies (if they crumble apart your dough isn't cold enough). Bake in a preheated oven @ 350 degrees (F) on a greased or parchment lined cookie sheet for 15 minutes, or until firm and golden brown. Allow to cool before removing.

NOTES
Approx nutrition info per cookie: 119 calories, 11g fat, 1.6g net carbs, 3g protein

Approx nutrition info per ⅛th tart crust: 238 calories, 23g fat, 3g net carbs, 6g protein

Low Carb & Gluten Free Shortbread CookiesI wasn’t always a fan of lemon flavored desserts – in fact, as a kid I wouldn’t even eat them.  In my adulthood though, I’ve come to appreciate the brightness that lemon imparts to a dessert – especially in low carb recipes, and now I can’t get enough of it.  I would even go so far as to say that when given the choice of lemon over chocolate, 75% of the time the lemon flavored dessert would win out. Crazy, I know – sometimes I can’t believe it either!

So maybe it’s due to all of the pastel colored foodie magazines showing up in my mailbox, and the promise of Spring and warmer weather just around the corner, but I’ve had lemons on the brain for weeks now.  It started with the Easy Crock Pot Lemon Chicken a couple of weeks ago, then I made the Low Carb Avgolemeno (Greek Lemon Chicken Soup) last week, and just the other day I made Carolyn’s (All Day I Dream About Food)low carb Meyer Lemon Mug Cake (which took about five minutes and was SO GOOD) – you guys must try it!  Even Mr. Hungry really loved it – I’ll be making that one over and over again for sure!

Anyway, during my crazed obsession with all things lemon last week, I also made these awesome low carb shortbread cookies, which I adapted from this recipe.  They did NOT disappoint!

Low Carb Shortbread

These little cuties require just four ingredients, and have an addicting lemon flavor and crusty shortbread texture that I absolutely love!

Be sure to use a sweetener that is advertised to bake like sugar (Granulated Splenda, Ideal, etc.) and not a liquid sugar free sweetener, or they may not hold together properly.  Also important is that you chill them first if you’re going to cut them into cookies, otherwise they will crumble apart and be impossible to work with.

Low Carb Recipe for Shortbread

This versatile dough also makes a lovely low carb tart base or pie crust, which does not require pre-chilling.  You simply press it into your pan and bake it for 15 minutes.    I’ll also be posting a gorgeous low carb Blueberry & Mascarpone tart I made with it in the near future, so stay tuned for that!
Begin my mixing 2 1/2 Cups of Sugar with 1 Cup of Light Olive Oil or Sunflower Oil. Add in 4 Tablespoons of Lemon Juice {or scented essential oils to your liking}.

This mixture will make enough to fill a 12oz. Mason Jar {and you’ll have just enough left over to clean your hands afterwards too}

Mix really well until a gritty paste forms and spoon into a glass container. {make sure your container has a lid that seals}

http://www.bystephanielynn.com/2010/05/lemon-sugar-hand-scrub-for-mom.html
''For the crust:''
* 1/2 cup almond meal
* 2 tblsp coconut oil (melted)
* 2 tsp stevia (1 scoop of powder)
* 1/4 tsp cinnamon

''For the filling:''
* 2 packages of cream cheese (8oz each), softened
* 2 eggs
* 1 tblsp vanilla extract
* 3/4 cup stevia in the raw (12 scoops of powder)
* Juice and zest of 4 key limes (5 tbsp)

''Preparation:''
#Preheat oven to 400 degrees.
#Combine filling ingredients in a bowl and mix well. Divide among baking cups and use spoon to press into a crust.
#Bake for 7 minutes. Remove, and turn down oven to 350.
#While crusts are baking,
#Combine filling ingredients and mix until well incorporated. Divide evenly between crusts.
#Bake at 350 for 15-20 mins until crusts are slightly cracked but not brown.
#Remove and cool overnight.

Nutrition facts: 225 Calories. 2g Carbohydrates.
<tabs mytabs>

<tab Websites>
[[Cheeseslave|http://www.cheeseslave.com/]]
[[The Healthy Home Economist|http://www.thehealthyhomeeconomist.com]]
[[Peace Love and Low Carb|http://peaceloveandlowcarb.com]]
[[Satisfying Eats|http://www.satisfyingeats.com/]]
[[Full Fat Friendly|https://fullfatfriendly.wordpress.com/]]
[[Cave Girl Cuisine|http://cavegirlcuisine.com/]]
[[Cheeseslave|http://www.cheeseslave.com/]]
[[The Healthy Home Economist|http://www.thehealthyhomeeconomist.com]]
[[Peace Love and Low Carb|http://peaceloveandlowcarb.com]]
[[Ketopia|http://ketopia.com/]]
[[Fluffy Chix Cook|http://fluffychixcook.com/]]
[[Cats Kitchen|http://catsfork.com/CatsKitchen/]]
[[Carb Wars|http://carbwars.blogspot.com/]]
</tab>

<tab WAPF>
[[Weston A Price - WAPF vs Paleo|http://www.westonaprice.org/traditional-diets/differences-between-the-weston-a-price-foundation-diet-and-the-paleo-diet]]
[[Weston A Price - Beginner Videos|http://www.westonaprice.org/beginner-videos]]
[[Master List of Bread Substitutes|http://www.reddit.com/r/keto/comments/1r12ru/master_list_of_bread_substitutes/]]
[[Gnowfglins|http://gnowfglins.com/]]
[[Circle Star Ranch|http://www.circlestarranch.info/]]
[[Kefir Recipes|http://www.kefirrecipes.net/]]
</tab>

<tab Pinterest>
http://www.pinterest.com/nurseu2befit/keto-lchf-friendly-drinks/
http://www.pinterest.com/onemanswife/~-trim-healthy-mama-thm-recipes-more-~/
</tab>

<tab Articles>
http://primalnorth.blogspot.com/p/keto-adaptation-vs-low-carb-limbo.html
</tab>

<tab Recipes>
[[Easy Hollandaise Sauce|http://ketodietapp.com/Blog/post/2014/08/12/Easy-Hollandaise-Sauce]]
[[Salmon with Tarragon Dill Cream Sauce|http://www.ruled.me/salmon-tarragon-dill-cream-sauce/]]
[[Brown Butter Cream sauce The Perfect Keto Sauce|http://lowcarbhighfatrecipes.com/brown-butter-cream-sauce-the-perfect-keto-sauce/]]

[[Chicken Pot Pie With Cheesy Crust|http://asweetlife.org/recipes/low-carb-chicken-pot-pie-with-cheesy-biscuit-crust/]]
[[Vanilla Bean Latte|http://asweetlife.org/recipes/vanilla-bean-latte-with-cardamom/]]
[[Brownie Batter Waffle|http://asweetlife.org/recipes/brownie-batter-waffles/]]
[[Sloppy Joes|http://mariamindbodyhealth.com/sloppy-joes-and-manwich-facts/]]
[[Baconnaise and Keto-Adapted Bread|http://mariamindbodyhealth.com/baconnaise/]]
[[7 Days Keto Cleanse|http://mariamindbodyhealth.com/7-day-keto-cleanse/]]
[[Waffle Iron Cheese|http://www.seriouseats.com/2015/01/how-to-waffle-iron-fried-cheese-queso-frito.html]]
[[Starbucks Lemon Loaf|http://mariamindbodyhealth.com/starbucks-lemon-loaf/]]
[[Sasage Pinwheels|http://uplateanyway.com/keto/breakfast-sausage-pinwheels-low-carb-gluten-free/]]
[[Cheese Daish|http://uplateanyway.com/keto/cheese-danish-low-carb/]]
[[Carrot Cake Cupcakes|http://muscle-and-h8.tumblr.com/post/80487195198/low-carb-gluten-free-carrot-cupcakes-with-fluffed]]
[[Buffalo Cauliflower Bites|http://www.galonamission.com/healthy-buffalo-cauliflower-bites/]]
[[Lemon Poppyseed Cookie|http://alldayidreamaboutfood.com/2014/11/low-carb-lemon-poppyseed-breakfast-cookies.html]]
[[Maple Bacon Donuts|http://alldayidreamaboutfood.com/2014/05/maple-bacon-donuts-low-carb-gluten-free.html]]
[[Orange Scones|http://www.ruled.me/low-carb-cinnamon-orange-scones/]]
[[LOW CARB BROWNED BUTTER CHOCOLATE CHIP SKILLET COOKIE|http://cafedelites.com/2015/07/24/low-carb-browned-butter-chocolate-chip-skillet-cookie/]]
[[Cheesecake Stuffed Chocolate Chip Skillet|http://cafedelites.com/2016/08/01/cheesecake-stuffed-chocolate-chip-skillet-cookie/]]
</tab>

<tab Reddit>
https://www.reddit.com/user/KetoLuna
https://www.instagram.com/keto.luna/
</tab>
</tabs>
/***
|''Name:''|LoadRemoteFileThroughProxy (previous LoadRemoteFileHijack)|
|''Description:''|When the TiddlyWiki file is located on the web (view over http) the content of [[SiteProxy]] tiddler is added in front of the file url. If [[SiteProxy]] does not exist "/proxy/" is added. |
|''Version:''|1.1.0|
|''Date:''|mar 17, 2007|
|''Source:''|http://tiddlywiki.bidix.info/#LoadRemoteFileHijack|
|''Author:''|BidiX (BidiX (at) bidix (dot) info)|
|''License:''|[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D ]]|
|''~CoreVersion:''|2.2.0|
***/
//{{{
version.extensions.LoadRemoteFileThroughProxy = {
 major: 1, minor: 1, revision: 0, 
 date: new Date("mar 17, 2007"), 
 source: "http://tiddlywiki.bidix.info/#LoadRemoteFileThroughProxy"};

if (!window.bidix) window.bidix = {}; // bidix namespace
if (!bidix.core) bidix.core = {};

bidix.core.loadRemoteFile = loadRemoteFile;
loadRemoteFile = function(url,callback,params)
{
 if ((document.location.toString().substr(0,4) == "http") && (url.substr(0,4) == "http")){ 
 url = store.getTiddlerText("SiteProxy", "/proxy/") + url;
 }
 return bidix.core.loadRemoteFile(url,callback,params);
}
//}}}
''Ingredients:''
*1 large Egg
*1 tbsp. Almond Flour
*1 tbsp. Psyllium Husk Powder
*1/4 tsp. Baking Powder
*1/4 tsp. Cream of Tartar
*1 tbsp. Chicken Broth
*1 tbsp. Melted Butter

''Directions:''
#Crack an egg into a mug and pour in the melted butter. Stir together well until eggs are lighter in color.
#Add the rest of the ingredients and mix well. You should end up with a slightly doughy substance.
#Microwave for 60-75 seconds, depending on wattage of microwave (it will puff up in the mug, and reduce greatly in size on you take it out). (my microwave 95 seconds on 90% power)
#Slice in half and sauté in butter.

Nutrition facts: 250 Calories. 2g Carbohydrates.

*2 Cups Almond Flour
*2 Cups Psyllium Husk Powder
*3 tbsp. Baking Powder
*3 tbsp. Cream of Tartar
Shortbread Crust:

3 cups whole wheat flour (I use freshly ground hard white wheat for this)
1/2 cup sucanat (or brown sugar if you prefer)
1 1/2 cups melted butter

Stir flour and sucanat together in a bowl. Add melted butter, combining well. Press mixture into a 9×13 inch baking pan. Bake in a 350° oven for 12-15 minutes or until golden brown.

Pumpkin Cheesecake Filling:

2 8-ounce packages softened cream cheese
1 1/2 cups heavy whipping cream
2 cups pureed pumpkin
1 1/2 teaspoons ground cinnamon
1/2 teaspoon ground nutmeg
1/2 teaspoon ground cloves
Real maple syrup or liquid stevia to taste (I used 4 droppers full of stevia)

Blend all ingredients together until smooth. Pour over prepared shortbread crust. Spread until smooth. Chill in refrigerator for at least two hours before serving.
[[Home]]
[[Links]]
[[Recipes]]
[[Health]]

[[Camping]]
[[Crafts]]
[[Homesteading]]
[[WAPF]]
[[Skincare]]

[[Formatting]]
'Ingredients'
* 4 chicken breasts (6 ounces each)
* salt and pepper

Malibu Dipping Sauce
* 1/2 cup mayonnaise
* 3 tablespoons yellow mustard (or Dijon or a combo)

Crumb Topping
* 3/4 cup crushed pork rinds (35 g) (panko crumbs if not low carb)
* 3/4 cup grated Parmesan cheese (60 g)
* 2 teaspoons granulated garilc
* 1 teaspoon granulated onion
* 1/4 teaspoon salt
* 1/8 teaspoon pepper

Top With
* 8 pieces of deli ham (thin slices) (about 6 oz)
* 4 slices of Swiss cheese (4 oz)

Instructions
#''Preparation:'' Preheat the oven to 350 degrees and place rack into the middle position. Finely crush the pork rinds in a food processor or place them in a bag and bash them with a mallet or rolling pin. Ready a 9 x 13 inch glass baking dish or a 1/4 size sheet pan for the chicken.
#''Method:'' Put the chicken on a plate and pat dry. Season with salt and pepper. Mix the mayonnaise, mustard and sweetener in a bowl. Add 1/4 cup of the mustard mixture to the plate with the chicken, reserving the rest of the mixture as the dipping sauce. Roll the chicken in the mixture with a fork, right there on the plate.  (Alternately, the chicken can be placed in a bag or in a bowl and mixed with the mustard mixture and marinated.) The chicken can be cooked right away or marinated for up to 1 day.
# ''Mix:'' Mix crushed pork rinds, Parmesan cheese and seasonings together. Sprinkle 1/2 of the crumb mixture in the baking dish or sheet pan where the chicken will be placed. Place the chicken on top of the crumbs. Add the other half of the crumb mixture over the chicken breasts.
# ''Bake:'' Bake for 30 - 40 minutes or until the chicken is cooked through. Remove the chicken from the oven and add the ham and cheese on top. Place back into the oven until the cheese has melted. Serve. (Serves 4-6 people)


https://www.lowcarbmaven.com/malibu-chicken/
https://www.youtube.com/watch?v=1H-ga4fU-m8
''Ingredients''
*1 C light olive oil
*2 tsp apple cider viniger
*2 tsp lemon juice
*1 whole egg
*1 egg yoke only
*1/2 tsp ground dried mustard powder
*3/4 tsp salt
1 tbsp whey

''Directions''
*Put the eggs, lemon juice, mustard, vinigar, whey, and salt in the work bowl of the food processor or blender; process for 10 seconds or more, until creamy.
*With the food processor or blender (I used my Vitamix) running continuously, pour in the oil very slowly in driblets at first, to start the emulsion process. Add 10 to 15% of the oil at this time. The first addition should be small and gradual. Wait about 30 second between additions.
*When the sauce has definitely thickened, you may add the oil in a thin stream. Do not stop the machine at this point, but cease pouring every few seconds to be sure the oil is being absorbed. Add about 50% of the oil at this time.
*Then continue until the remaining oil are incorporated. You may not need to use all the remaining oil at this time.
*Stop the machine and check the mayonnaise for taste and consistency. Adjust the seasonings and, if the mayonnaise is very thick, process in additional drops of lemon juice or warm water to thin. The mayonnaise may be used at this point, or you can process in some of the remaining oil for a thicker sauce.
*Transfer the finished mayonnaise to a bowl or jar and store in the refrigerator. If not using right away, cover with plastic wrap and refrigerate. The sauce will keep for a good week. The fresher the eggs used, the longer the mayonnaise will keep.

This can also be made with a tall vessel and a stick blender for eaiser cleanup.
''Ingredients''
* ¾ cup almond flour
* 2 tbsp erythritol
* Zest of one Meyer Lemon
* 1 tsp baking powder
* Pinch salt
* Juice of one Meyer Lemon
* 2 tablespoons butter, melted
* 1 large egg, lightly beaten
* Lightly sweetened whipped cream for garnish

''Directions''
# In a medium bowl, whisk almond flour, erythritol, lemon zest, baking powder and salt.
# Add lemon juice, melted butter and egg, and stir until well combined.
# Divide mixture between two microwave-safe mugs and microwave each separately for 1 minute and 20 seconds. OR heat at 350 in oven for 15-20 minutes
# Remove and top with whipped cream.


http://www.rachelcooks.com/2013/03/01/meyer-lemon-mug-cake-low-carb-gluten-free-guest-post/
[[My milkshake brings all the keto boys to the yard! (Just like Steak N Shake)|http://www.reddit.com/r/ketorecipes/comments/1z0i2t/my_milkshake_brings_all_the_keto_boys_to_the_yard/ ]]
 
Alright, so I've had this crazy hankering for a milkshake. But I wanted something creamy and thick like they serve at Steak n Shake sans protein powder (because quite frankly I'm sick of it). After scouring, I think I've found the one!
The one I made was a cake batter shake, but its a super flexible recipe!

''Base Ingredients''
*3 o.z. Cream Cheese (CAN'T taste it at all I promise)
*1/2 cup liquid egg-whites
*1/4 cup heavy cream
*1/2 tsp xanthan gum (optional...still pretty thick without)
*ice and sweetener to taste

Customize! (This is what I used to make cake batter)
1tsp Vanilla, Almond and Butter extract

GUYS IT WAS INCREDIBLE. You can pretty much alter and add any sf syrups or extracts to the base to make it your own (EVEN PB BANANA!)
Feel free to post any combo's and critiques in the comments and happy Ketoing!
EDIT: TSP of extracts, not tbsp. (Sorry)
 
..... other comments .....
 
Next test: Shamrock shake.
Mint extract/mint leaves, post on /r/ketorecipes on St. Patty's day, reap karma.
 
 
I do exactly this, but I also throw some cacao nibs in as well. I like a mint chocolate shake.
 
i was going to go to mcdonalds and get one, but i don't think i can do 88 carbs for a small, BUT it's so dang good.
 
 
I've been making milkshakes with my protein powder for breakfasts when I need a break from eggs.
Here's what I do
5oz almond milk 2-3 oz heavy cream 2 scoops protein powder (vanilla) ice
put it all in the nutribullet and let it get blended and thicken up. The bullet makes the heavy cream go very thick so its a nice milkshake consistency
now to make it actually taste good/better you can add any of the following:
some cocoa powder and sweetener of choice for a chocolate milkshake chia seeds add a nice texture a few berries (blackberries, blueberries etc) for more of a smoothie type vibe almond butter
I'm still playing around with different things to find some new flavors I like.
Water and Lemon Juice: 1:1 ratio. Mix in bottle, spray and wipe.

 I am so impressed with this simple solution, There were no streaks on the bathroom mirror so I decided to try it on the creative coloring my daughter did on our glass porch door and it got the crayon right off! The stubborn tape is still there but this removed the crayon!

Water and about 3 drops of Dr. Bonners soap. Add to bottle, spray and rub away.This worked the second best. 

http://naturallivingmamma.com/2012/07/29/apartment-homesteading-make-your-own-cleaning-products/
1/2 teaspoon cayenne pepper
* 1 tablespoon garlic powder
* 1 teaspoon basil
* 1 teaspoon marjoram
* 1 teaspoon thyme
* 1 teaspoon parsley
* 1 teaspoon savory
* 1 teaspoon mace
* 1 teaspoon onion powder
* 1 teaspoon sage
* 1 teaspoon black pepper
Ingredients
* 2 Tbsp butter
* 3 Tbsp almond flour
* 1 tsp coconut flour
* 1 1/2 Tbsp granulated sugar substitute
* 1/4 tsp vanilla
* pinch of salt
* 1 egg
* 1 Tbsp unsweetened cocoa powder
* 1/2 tsp baking powder
* 1 square Lindt 90% chocolate, chopped
* 2 Tbsp pecans, chopped (optional)

Instructions
# Melt the butter in a small microwave safe bowl (about 30 seconds in microwave).
# Add the remaining ingredients and stir until combined. 
# Pour batter into 2 small greased mugs or ramekins. 
# Microwave for 1 minute. (add another 30 seconds if necessary). 
# Serve with whipped cream or sugar free vanilla ice cream.
This blend is also quite energizing and invigorating. Feel free to exclude the baking soda and clay for an energizing and uplifting experience without as many of the detoxifying effects.

    2 parts Epsom salts
    2 parts Dead Sea Salt
    1 Part Baking Soda
    1/2 Part Clay (French Green and Benonite clay are best for detox)
    Orange, Lemon or Grapefruit zest or Calendula Petals
    Grapefruit, Lemon, Orange, and Geranium Essential Oils or doTERRA’s Zendocrine Blend
    Glass Container

Blend together and put in glass container.


Twinlab 500mg
Other Ingredients: Gelatin, Cellulose, Purified Water, MCT, Silica, Vegetable Stearic Acid.
''Ingredients''
* 1 box ~AuGratin Potatoes

''Instructions''
# Place potatoes and butter in IP
# Add liquids and season packet
# Place manual high pressure 7 minutes
# Do a quick release
# place under broiler to brown if wish
Castor oil is thick and dissolves the oil on your skin, pulling out impurities and environmental junk that builds up in your pores over the course of the day.

How much oil should I mix together? Skin Condition.  Extra Virgin Olive Oil 	Castor Oil

Dry 	3 tablespoons 	1 tablespoon
Normal (or unsure) 	2 tablespoons 	2 tablespoons
Oily 	1 tablespoon 	3 tablespoons

I have normal to oily skin so I mixed 1 part EVOO and 1 part castor oil in a brown glass bottle and keep it by my sink to apply quickly and easily.

I recommend starting out making a very small amount until you find the proper ratio for your skin type. This is completely customizable to YOUR skin type, which means it does take some tweaking, and some time to get it right. Be patient and stick with it!
How do I do this?

1. Rub the oil in the skin

Put a quarter sized amount of oil in the palm of your hand and gently apply it to your whole face and neck, rubbing the oil in well. Take a minute and give your self a nice, relaxing face massage. Apply to your dry face, do not rinse with water first.




2. Steam your face

Wet a wash cloth with hot water, (not scalding), and place the hot wash cloth over your face until it is room temperature. Steaming your face like this helps pull out impurities from your pores removing dead skin cells and impurities.

I like to do this while in a nice hot bath. Barring that, if it is a night like tonight, while sitting on the toilet hiding from my children. It is nice to take a minute or two of quiet time in the evening before getting the baby down to sleep.

3. Wipe off your face

Take the wash cloth, rinse it out with warm water, and gently wipe any residual oil off of your face. This will give you gentle exfoliation and wipe away any impurities from your skin.

4. Enjoy your beautiful skin! 

I have noticed that my skin is more even and balanced and does not need a toner or moisturizer any more. My pores have shrunk and I barely have acne, when before I had chronic acne, even when using the “big guns”.

When I first started using this method I did break out in the beginning. This is the oil doing its job. It is leaching out all of the crap stored in your pores from years of mistreatment and neglect. THIS IS NORMAL. Stick with it. After a week or two of using OCM every day or every other day, (I do every other day), your skin will start to clear up and will have a healthier more even complexion.

In my first solution I did add 5 drops of Melaleuca and Lavender essential oils to help purge my skin of impurities, and encourage healing while reducing redness. You can completely customize your oils to meet your skin care needs. Take a look at my post “Essential Oils for Skincare” to find what oils would work with your specific needs.

If you feel like you need a little bit of moisturizer just get a dab of the OCM solution and rub it on your face. Other great moisturizers are coconut and almond oils.

I buy my olive oil from my affiliate Tropical Traditions, my castor oil from my affiliate Mountain Rose Herbs, and use doTERRA essential oils.

***Update*** I have found an amazing oil for the Oil Cleansing Method that is already made and works so well. It is an herb infused oil made by l.c. of acirema. She makes this fantastic oil to help replenish and rejuvenate skin taking the work out of finding the perfect formula for you. My readers can get a discount when purchasing from her etsy shop by using the coupon code LUCKYMAMMA5.


https://www.mindbodygreen.com/articles/keto-brownies-recipe

Makes 16 brownies

''Ingredients''
* 3/4 cup avocado oil
* 3/4 cup granulated erythritol-based sweetener
* 3 large eggs
* 1/2 teaspoon vanilla extract
* 1/2 cup (50g) blanched almond flour
* 1/3 cup cocoa powder
* 1/2 teaspoon baking powder
* 1/4 teaspoon salt
* 1/2 cup chopped raw walnuts or pecans (optional)

''Instructions''
# Preheat the oven to 325°F and grease a 9-inch square baking pan.
# In a large bowl, whisk together the oil, sweetener, eggs, and vanilla extract.
# Add the dry ingredients—the almond flour, cocoa powder, baking powder, and salt—and whisk until well-combined. Stir in the chopped nuts, if using.
# Bake for 20 minutes, or until the edges are set but the center is still a little soft to the touch. Bake longer if you prefer cakier brownies.
# Remove from the oven and let cool completely in the pan. Then cut into 16 squares.
[[Keto onion rings, ~7g net carbs|http://www.reddit.com/r/keto/comments/10oub6/fp_keto_onion_rings_7g_net_carbs/]]
''Recipe:''
* Cut a vidalia onion in thick strips, 1/2" to 3/4". Separate.
* Crack two eggs in a bowl. 
*on a plate mix a cup of finely grated parmesan cheese
*a teaspoon of freshly ground black pepper
*1/4 teaspoon of cayenne pepper
*1/4 tsp of salt.
''Directions:''
*Heat a pan of olive oil to 350 degrees.
*Dip the onions in the egg, then cover with the parmesan mix. 
*Dip in egg again and cover again. 
*When ready, place in oil.
*Watch them carefully because these suckers cook FAST. 
*After about 30-45 seconds they should be ready to turn, another 30 seconds afterthat they should be done.
*Transfer to a cooling rack (don't use a plate with paper towels, that makes your food soggy.)
I ate with a low carb ketchup from Heinz which has 1g of carbs per tablespoon. I ate about half a medium onion, which has 5.5 grabs of carbs. The batter doesn't have any carbs. 2 tbsp of ketchup added 2g more.


[img[images/onionsoupmix.jpg]]

''Ingredients''
*2/3 cup dried, minced onion
*3 teaspoons parsley flakes
*2 teaspoons onion powder
*2 teaspoons turmeric
*1 teaspoon celery salt
*1 teaspoon sea salt
*1 teaspoon sucanat (or organic sugar or splenda)
*1/2 teaspoon ground pepper

''Directions''
*Mix all ingredients in a jar, then give the jar a good shake.  
*I’d recommend shaking the jar to mix the ingredients well before each use.

Use 4 Tablespoons Onion Soup Mix in a recipe in place of 1 packet of onion soup mix.  (I actually found that 2 Tablespoons was plenty in a beef stew recipe I tried.)  Store this in a dry, cool place.
2 lbs boneless skinless chix thighs
1 Tbsp cornstarch
1/4 cup coconut flour
salt and pepper
3 Tbsp coconut oil

''For the sauce''
1 Tbsp ginger, chopped
1/4 cup orange juice
2 Tbsp fish sauce
2 Tbsp GF soy sauce
1 1/2 tsp orange extract
2 tsp sweetener*
1 cup water
1/2 tsp ground coriander
1 Tbsp orange zest
1/4 tsp red pepper flakes
1/4 tsp sesame seeds
2 Tbsp scallions, chopped

Instructions

# Chop the chicken thighs into bite sized pieces.
# Combine the cornstarch and coconut flour in a medium sized bowl and season with salt & pepper. Add the chicken to the flour mixture and toss well until fully coated.
# Heat coconut oil in a large saute pan. Cook the chicken in small batches until golden brown and no longer pink. Remove the chicken to a plate or bowl.
# Meanwhile, combine the ginger, orange juice, fish sauce, soy sauce, orange extract, sweetener, water, and coriander in a blender or magic bullet - blend until smooth.
# Pour into a saute pan and cook until reduced by half. Add the chicken back to the sauce and stir to coat. Cook for about two minutes and then add the orange zest, sesame seeds, red pepper flakes and scallions. Cook for another minute, then remove from the heat and serve garnished with more orange zest if preferred.

''Notes''
*use whatever sweetener you prefer for this recipe - I used xylitol, which measures like sugar. If you aren't sure how much to use, try using half and tasting it before you add more. Remember that the sauce will reduce and the sweetness will intensify so it shouldn't be too sweet before you start cooking it down. You can always add more sweetener after you reduce it if it's not sweet enough for your preference.

''Nutrition Information''
Calories: 424 Fat: 20g Carbohydrates: 6g net Protein: 46g 
# Mix 3 Tbsp of chia seed with 1/3 of a half gallon picture of water
# Brew 3 Biglow Orange Tea bags
# When cooled at 12 scoops of Stevia and 1 teaspoon of Vanilla to the tea concentrate
# Add tea concentrate to half gallon picture. 
# Fill picture with water and stir
Take orange peels (or lemon or lime) soaked in vinegar. Just fill a mason jar half way with vinegar and add the citrus peels from the fruit as you eat it. Be sure the peels are always underneath the vinegar to prevent molding. After the jar is full cap it, shake well, and let it infuse for about two weeks, shaking when you remember.

Fill a squirt bottle halfway with your orange-vinegar mixture and then top it off with water in a 1:1 ratio.

Spray, wipe, and enjoy the awesome smell and cleaning ability of citrus.

I love this spray on my tile and wood floors. I have had a streak free clean every time.

http://naturallivingmamma.com/2012/07/29/apartment-homesteading-make-your-own-cleaning-products/
''Ingredients''
* 4 boneless center cut pork chops (1/2-inch thick, about 1 1/4 lbs.)
* 1/4 teaspoons salt
* 1/4 teaspoons cracked black pepper
* 2 tablespoons Butter (divided)
* 1 orange (large)
* 1 tablespoon sage leaves (chopped fresh)

''Directions''
# Season chops with salt and cracked black pepper. Melt 1 tablespoon I Can't Believe It's Not Butter!® Spread in large nonstick skillet over medium-high heat and cook chops, turning once, until done, about 8 minutes. Meanwhile, grate 1 teaspoon peel and squeeze 1/4 cup juice from orange.
# Remove chops to serving platter and keep warm.
# Melt remaining 1 tablespoon Spread in same skillet over medium-high heat. Add orange juice and bring to a boil, scraping brown bits from bottom of pan. Boil 1 minute or until mixture reduces slightly. Remove from heat and stir in sage and orange peel. Drizzle over chops.

/***
|''Name:''|PasswordOptionPlugin|
|''Description:''|Extends TiddlyWiki options with non encrypted password option.|
|''Version:''|1.0.2|
|''Date:''|Apr 19, 2007|
|''Source:''|http://tiddlywiki.bidix.info/#PasswordOptionPlugin|
|''Author:''|BidiX (BidiX (at) bidix (dot) info)|
|''License:''|[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D ]]|
|''~CoreVersion:''|2.2.0 (Beta 5)|
***/
//{{{
version.extensions.PasswordOptionPlugin = {
	major: 1, minor: 0, revision: 2, 
	date: new Date("Apr 19, 2007"),
	source: 'http://tiddlywiki.bidix.info/#PasswordOptionPlugin',
	author: 'BidiX (BidiX (at) bidix (dot) info',
	license: '[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D]]',
	coreVersion: '2.2.0 (Beta 5)'
};

config.macros.option.passwordCheckboxLabel = "Save this password on this computer";
config.macros.option.passwordInputType = "password"; // password | text
setStylesheet(".pasOptionInput {width: 11em;}\n","passwordInputTypeStyle");

merge(config.macros.option.types, {
	'pas': {
		elementType: "input",
		valueField: "value",
		eventName: "onkeyup",
		className: "pasOptionInput",
		typeValue: config.macros.option.passwordInputType,
		create: function(place,type,opt,className,desc) {
			// password field
			config.macros.option.genericCreate(place,'pas',opt,className,desc);
			// checkbox linked with this password "save this password on this computer"
			config.macros.option.genericCreate(place,'chk','chk'+opt,className,desc);			
			// text savePasswordCheckboxLabel
			place.appendChild(document.createTextNode(config.macros.option.passwordCheckboxLabel));
		},
		onChange: config.macros.option.genericOnChange
	}
});

merge(config.optionHandlers['chk'], {
	get: function(name) {
		// is there an option linked with this chk ?
		var opt = name.substr(3);
		if (config.options[opt]) 
			saveOptionCookie(opt);
		return config.options[name] ? "true" : "false";
	}
});

merge(config.optionHandlers, {
	'pas': {
 		get: function(name) {
			if (config.options["chk"+name]) {
				return encodeCookie(config.options[name].toString());
			} else {
				return "";
			}
		},
		set: function(name,value) {config.options[name] = decodeCookie(value);}
	}
});

// need to reload options to load passwordOptions
loadOptionsCookie();

/*
if (!config.options['pasPassword'])
	config.options['pasPassword'] = '';

merge(config.optionsDesc,{
		pasPassword: "Test password"
	});
*/
//}}}
//Greasing the pan is not necessary when baking traditional wheat flour crusts.  When baking with nut flours, I recommend it.  The following crust tastes delicious straight out of the oven, but I like it even more on the second day.  Wrapped tightly and refrigerated, this crust will maintain its freshness for one week.//

''Ingredients''
* 2 cups blanched almond flour (almond meal–which often has bits of the dark brown skins in it–works but makes a heartier, more rustic crust)
* 1/4 teaspoon baking soda
* 1/4 teaspoon kosher salt
* 2 tablespoons coconut oil (chilled briefly to firm up, if necessary; may substitute cold butter)
* 1 egg

''Directions''
# Grease a 9-inch pie dish and preheat the oven to 350 degrees F.
# Place the flour, sugar, baking soda and salt in a food processor and pulse several times.
# Add the egg and vanilla, and then scatter small pieces of coconut oil over top.  Pulse until the mixture forms a ball.
# Press the dough evenly into a 9-inch pie dish, working the dough all the way up the sides. (For added ease, I like to press the dough ball into a flat disc first.)
# With a fork, prick the crust several times over the bottom and sides, and then bake for 8-12 minutes. If you are baking again with a filling, bake the crust until the bottom is just dry.  If you are adding a filling that does not require further baking, bake until the crust is lightly golden around the edges.

''Notes''
When using this crust recipe with a filling that requires a second baking, I recommend a “crust protector” as crusts that include nut flours tend to brown much more quickly than standard all-purpose flour crusts. To fashion your own crust protector, simply fold a 12-inch square of foil into quarters. Cut a 7-inch hole out of the center. Unfold and loosely mold the foil over the edges of the pie. If the foil is too close to the filling, trim so that it does not touch. Keep this on the crust edges for the entire baking time.
[[Flaky Pie Crust 1|http://queenbsincredibleedibles.com/2017/11/28/the-ultimate-keto-pie-crust/]]
''Ingredients''
* 1 cup almond flour
* 1/2 cup coconut flour
* 1 tsp xanthan gum
* 1/4 tsp salt
* 1 stick butter
* 2 ounces cream cheese
* 1 tablespoon white vinegar
* 1 egg

''Instructions''
* Freeze butter and cream cheese for about 30 minutes before starting.
* Add all dry ingredients and mix to combine, in a bowl large enough to mix with your hands. 
* Begin shredding the cold butter and cream cheese on a box grater, so even sized pieces can be tossed in flour mixture. 
* Once it is shredded, ensure all pieces are coated and add one egg and the vinegar, mixing until dough forms.
* You will have dry pieces at this point and that is fine. 
* Your dough will need to chill for at least 4 hours prior to use. 
* Wrap tightly in plastic wrap, including any left over flour, it will reabsorb as it chills.
* Remove and allow to come to temp for 10 minutes before rolling out.
* Dust counter with coconut flour and roll to 1/4 inch thickness, stopping to fold in 3rds, and rolling out again. 
* After one half turn, fold in 3rds again, and roll again.
* This will create your layers. Do this a total of 3 times for best results, before rolling out to your final 1/4 thickness.
* Perfect for 1 bottom keto pie crust.


[[Flaky Pie Crust 2|http://www.gnom-gnom.com/cream-cheese-keto-pie-crust/]]
''Ingredients''
* 1 cup almond flour
* 5 tablespoons coconut flour
* 1/2 teaspoon xanthan gum
* 1/2 teaspoon kosher salt
* 1/2 teaspoon lemon or orange zest optional
* 3 1/2 ounces organic grass-fed butter
* 1/4 cup cream cheese
* 1 egg lightly beaten
* 2 teaspoons apple cider vinegar

''Instructions''
* Add almond flour, coconut flour, xanthan gum, salt and zest (optional) to food processor and pulse until evenly combined. 
* Add butter and cream cheese and pulse for just a few seconds until crumbly. Add in egg and vinegar and pulse until the dough just begins to come together (but stop before it forms into a ball). Like with any pastry dough, make sure not to over-process the dough. The mixture ought to resemble coarse breadcrumbs rather than cookie dough. 
* Turn out the dough onto cling film and form into a round. 
* Refrigerate for at least one hour, or up to 3 days. 
* Roll out dough between parchment paper and pop it back into the fridge for 10-15 minutes prior to baking (as it will help to keep its shape better). 
* Bake at 350°F/180°C for 10-12 minutes if making something small such as crackers. And up to 30 minutes for empanadas and such. * If need be, cover with aluminum foil to avoid excessive browning. 


[[Coconut Pie Crust|http://www.sweetashoney.co.nz/coconut-pie-crust/]]
''Ingredients''
* 2 cup unsweetened shredded coconut
* 1/2 cup Almond Meal Flour,
* 1/4 cup Virgin Organic Coconut Oil, melted
* 2 eggs, size 6
* 2 tbsp Coconut Flour.
* 1 tbsp Natvia Natural Sweetener
* 1 tbsp Vanilla Bean Paste

''Instructions''
# Pour all the ingredient into a food processor.
# Blend until a crumble is forming.
# With your hands gather the crumble to form a ball of dough.
# It will stick and hold perfectly together.
# Place the dough ball between plastic wraps.
# Press with your hand and then start rolling until thin about 0.5 cm thickness.
# Transfer onto a 26 cm pie mould greased with butter or coconut oil.
# Prebake at 170 C for 20-30minutes or until golden brown.
# If you are using a filling that need to be bake like pumpkin filling, add it in the pre baked crust and return to the oven until filling is set.
# If cold filling is used like custard, wait until the crust is fully cool down before adding anything inside.
#  Always unmold carefully after at least 3-4 hours of cooling process. This crust is very fragile so use a loose bottom pan and grease very well with butter or coconut oil.
Perfect to make a pumpkin pie, apple pie or any other sweet pie.

----

[[Keto Pie Crust|http://www.ruled.me/keto-pie-crust/]]

''Ingredients''
* 1/2 cup Almond Flour
* 1/2 cup Coconut Flour
* 2 tbsp. Psyllium Husk Powder
* 2 tbsp. Coconut Oil
* 2 large Eggs
* 5 tbsp. Ice Cold Water
* 1/4 tsp. Salt

''Instructions''
# Mix all dry ingredients together into a bowl, then add coconut oil and mix until a sandy consistency is formed.
# Scramble egg and egg it to the dough along with water until you get a wet sand type of dough that you can knead into a ball. Add water as needed.
# Knead dough into a ball and flatten into a block. Cut into 4-5 chunks.
# Push dough into tart pans until a thin layer coats the entire pan. Repeat until 5 pans are filled.
# Bake for 12-15 minutes at 350F to par-cook. Then fill and cook for an additional 20-30 minutes. Depending on food, you may have to par-cook for longer.

----
Poppy Seed Dressing

''Ingredients''
* ¾ cup mayonnaise
* 1½ Tablespoons Apple Cider Vinegar
* 4 scoops [[Kal Stevia Powder|http://www.amazon.com/Kal-Pure-Stevia-Extract-Powder/dp/B000VRSR84/]] or 1/3 cup of truvia 
* ½ teaspoon minced onion
* ½ teaspoon dry mustard powder
* 1 teaspoon poppy seeds
* ⅛ teaspoon ginger (optional)

Use ¾ cup Mayonnaise + 1½ Tablespoons Apple Cider Vinegar, Put all ingredients in jar, mix with a fork. Let refrigerate for a few hours so the flavors will mingle. Shake jar before using.
''Ingredients''
* 12 ''Tbsp'' paprika
* &nbsp;&nbsp;6 ''Tbsp'' kosher salt
* &nbsp;&nbsp;6 ''Tbsp'' garlic powder
* &nbsp;&nbsp;2 ''Tbsp'' onion powder, toasted preferred
* &nbsp;&nbsp;1 ''Tbsp'' ground celery seed
* &nbsp;&nbsp;1 ''Tbsp'' dried oregano
* &nbsp;&nbsp;1 ''Tbsp'' Cathys Chilli Mix (was chipotle powder)
* &nbsp;&nbsp;2 tsp black pepper

Great on Pork Chops
Turns out I should have ran down this recipe for [[protein bread|http://mariamindbodyhealth.com/crab-blt-and-paula-deens-diabetes/]]. And here it is made with [[pictures|https://musingsofheatherlyb.wordpress.com/2012/08/28/low-carb-recipe-marias-protein-bread/]].

* 6 eggs, separated
* 1 cup Jay Robb unflavored egg white or whey protein
* 4 oz cream cheese, room temperature
* 1/2 tsp onion powder (optional)

Preheat the oven to 325 degrees F. Separate the eggs (save the yolks for a different recipe…creme brule???), and whip the whites for a few minutes until VERY stiff (I use a stand mixer on high for a few minutes). Slowly fold in the whey protein and onion powder if using. Then slowly fold in the cream cheese into the whites (making sure the whites don’t fall). Grease a bread pan and fill with “dough.” Bake for 40-45 minutes or until golden brown. Let completely cool before cutting or the bread will fall. Cut into 12 slices. I keep this bread in the freezer at all times to make sandwiches. OPTION: Make bread into 12 buns on a greased cookie sheet.

NUTRITIONAL COMPARISON (per slice)
White Bread = 80 calories, 15 carbs, 1 fiber, 3 g protein
“Healthified” Bread = 60 calories, trace carbs, 6 g protein
And here’s my progress through the recipe via pictures.
''Ingreedients''
* 1 15 oz can pumpkin puree
* 1/2 cup sugar
* 1/4 cup brown sugar
* 2 large eggs
* 1 teaspoon vanilla extract
* 3/4 cup evaporated milk
* 2/3 cup all purpose flour
* 2 teaspoons pumpkin pie spice
* 1/4 teaspoon salt
* 1/4 teaspoon baking powder
*1/4 teaspoon baking soda

''Directions''
# Preheat oven to 350 degrees. 
# Line 12 cup muffin tin with silicone liners.
# Mix the pumpkin, sugar, brown sugar, eggs, vanilla extract and milk. 
# Add the flour, pumpkin spice, salt, baking powder and baking soda to the mixture. 
# Fill each muffin cup with 1/3 cup of the mixture. 
# Bake for twenty minutes and let cool for twenty minutes. 
# Remove cupcakes from pan and chill in the fridge for 30 minutes. 
# Top with whipped cream and sprinkle more pumpkin pie spice on top and serve. Makes 12 cupcakes.

[img[images/pumpkincupcake.jpg]]
''Crust:''
* 2 cups almond meal
* 1 stick salted butter, melted (or sub ghee if avoiding dairy)
* 1 teaspoon truvia
* 1 teaspoon cinnamon

Preheat oven to 350 degrees.  Combine all ingredients together, mixing well.  Press into a 9 inch pie pan evenly.  Bake for 20 minutes until golden brown.

''Filling:''
* 3 eggs
* 1 cup heavy cream
* 1 teaspoon vanilla
* 1 15 ounce can organic pumpkin
* 3/4 cup truvia
* 1 tablespoon maple syrup
* 2 tablespoons ground cinnamon
* 2 teaspoon ground ginger
* 1 teaspoon allspice
* 1/2 teaspoon ground cloves
* Pinch of salt

Preheat oven to 350 degrees.  Make the crust above.

In a large bowl, lightly beat the eggs.  Add in 1 cup of the heavy cream along with the vanilla, pumpkin, coconut sugar, and maple syrup and whisk together.  In a small bowl, mix the cinnamon, ginger, allspice, ground cloves, and pinch of salt. Whisk spice mixture into wet ingredients.

Pour filling into crust, bake for 30-35 mins.  The custard will still be jiggly in the middle, so turn the oven down to 325 and cook for a remaining 15-20 mins.  Place foil around the edges of your pie if you find the crust is getting a little too done.

Top with fresh whipped cream.
Ingredients:

    1/4 cup (4 Tbsp.) ground cinnamon
    2 Tbsp. ground ginger
    4 tsp. ground nutmeg**
    2 tsp. ground allspice
    2 tsp. ground cloves

In a small bowl, whisk together ingredients until well-blended. Store in an air-tight jar.

Ali’s Tip:

**If using freshly grated nutmeg, you might add slightly less as the flavor can be more intense.

http://www.gimmesomeoven.com/how-to-make-pumpkin-pie-spice/
2 Cups of Brown Sugar
1 Cup of Granulated Sugar
2 Tablespoons of Pumpkin Pie Spice
1 Cup + 1 Tablespoon of Light Olive Oil,Sunflower, Safflower, or Vegetable Oil

Mix Brown Sugar, Granulated Sugar and Pumpkin Pie Spice together, making sure there are no lumps.

Add in oil and mix well. I like to use Sunflower Oil that can be found in most health food stores. Sunflower oil, like other oils, can retain moisture in the skin. {Safflower Oil is very similar to the Sunflower} Alternately, you can use plain Vegetable Oil as well.{I would omit using Olive Oil wth this one as the scent can be a little too powerful to mix with the warm scents of the pumpkin and brown sugar}

These keep well in a sealed, sanitized glass container for months.
Just keep out of direct sunlight; as you would store the oil itself.

http://www.bystephanielynn.com/2010/11/make-your-own-pumpkin-spice-sugar-scrub-easy-thanksgiving-hostess-gifts.html
[[CRUSTLESS PUMPKIN PIE|http://fromfriestofit.com/just-in-time-for-a-delicious-crustless-protein-pumpkin-pie/]]

''Ingredients''
* ½ can of pumpkin puree
* ¾ cup of liquid egg whites
* ¼ cup of vanilla ( cinnamon swirl )whey protein powder (I used Cellucor’s cinnamon swirl)
* 1 tsp of toffee flavoring, even vanilla flavoring (optional….great if you have a gnarly sweet tooth ;)
* 1 tsp of cinnamon or pumpkin pie spice
* TOPPING:
* unsweetened almond milk
* vanilla whey protein

''Instructions''
# mix all ingredient with a hand mixer and bake at 330 degrees F. for 30-40 minutes. I found that with my more shallow ramekins, I only needed 30 mins, but in deeper muffin tins, perhaps more time. Also depends on oven.
# keep checking for doneness. Try using a toothpick through center.
# Let cool once out of the oven.
# Prepare your protein frosting, top, and serve,


Nutrition Information
Serving size: 1 Calories: 45 Fat: 1 Carbohydrates: 4 Protein: 7 

----

''Ingredients''
* 1 can (15 ounce) pumpkin puree
* 1/2 cup heavy cream
* 4 beaten eggs
* 1/2 teaspoon salt
* 2 teaspoons vanilla extract
* 2 teaspoons pumpkin spice
* 1 teaspoon pumpkin spice liquid steviaor vanilla liquid stevia or even cinnamon stevia
* Optional toppings: Dairy Free Whipped Cream, Sprinkle of nutmeg

''Instructions''
# Preheat oven to 350 degrees.
# Spray 6 ramekins or custard cups with olive oil cooking spray.
# In a large bowl or stand mixer mix together pumpkin, cream eggs, spices and stevia.
# Pour evenly into ramekins.
# Bake for 45-50 minutes or until a knife in center comes out clean.
# Best served cold.
# Invert onto a plate or serve from dish.
# Top with whipped cream! Sprinkle with more nutmeg!



----

Crustless Pumpikn Pie

''Ingredients''
* 1 can(s) pumpkin (15 oz)
* 1 can(s) evaporated skim milk (12 oz)
* 3/4 c egg substitute (or 3 egg whites)
* 1/2 tsp salt
* 3 Tbsp pumpkin pie spices
* 1 tsp vanilla
* 2/3 c splenda (or sugar to taste)
* sugar-free whip topping

''Directions''
# Combine all ingredients and beat until smooth. Pour into a 9" sprayed pie pan.
# Bake at 400 degrees for 15 minutes, then at 325 for 45 minutesw or until a knife inserted in center comes out clean.
# Cool completely. Add a (generous!) dollop of whip topping and enjoy!
# Serving: 8 slices - per serving: 69 calories; 3g fat; 5g protein; 6g carbohydrate; 215mg sodium.



----
Ingredients:
* 1 cup cream cheese
* 5 large eggs
* 2 tsp liquid Stevia (or 1 cup Splenda or, if you’re not a low carber, 1 cup sugar)
* 2 cups 100% pure pumpkin
* 2 tsp ground cinnamon
* 1/5 tsp ground ginger
* 1/5 tsp ground cloves
* 1/5 tsp ground nutmeg
* 1/5 tsp allspice
* 1 tsp vanilla extract

Method:
# Whip cream cheese with a hand mixer (30-45 seconds)
# Whip eggs along with cream cheese
# Add pumpkin after the eggs are properly mixed in
# Add the spices, the liquid stevia, and the vanilla
# Spray your mini muffin tins with nonstick spray and distribute batter evenly (I had too much batter and not enough muffin tins, so my extra two ‘pies’ were baked in ramekins).

Bake mini muffins in oven at 350 degrees for 20 minutes (if you made pies in ramekins, too, then bake for 28-30 minutes).
Makes 14 mini pies
Via [[Joe Duff|https://www.thedietchefs.com/keto-quiche-recipe/]]

''INGREDIENTS''
For the crust:
* 1 ½ Cups (168g) blanched almond flour
* ⅓ Cup (40g) coconut flour
* 1 Large egg, whisked
* 1 Stick (112g) butter melted
* ½ teaspoon salt

For the filling:
* 6 Slices thick-cut bacon, chopped
* 1 Medium onion, chopped
* 8 Ounces (226g) spinach (fresh or frozen)
* ½ cup (118mL) heavy cream
* 4 Large eggs
* 1 Cup (112g) shredded Cheddar cheese
* ⅓ Teaspoon salt
* ⅙ Teaspoon black pepper

''INSTRUCTIONS''
# Preheat the oven to 400°F
# In a large bowl mix together almond almond and coconut flour with salt. Add whisked egg and melted butter.
# Knead the dough into a ball and let sit for 5 minutes.
# Press the dough into a 9-inch pie dish using your hands. 
# Par-bake the crust.
# Line the dough with parchment paper and fill the plate with dry beans or pie weights.
# Bake for about 10-15 minutes or until lightly golden.
# While the crust is baking prepare the filling.
# In a skillet cook the bacon over medium-high heat, turning occasionally, until evenly browned, about 4-5 minutes.  Drain on a paper towel-lined plate.
# Saute chopped onions for 2 minutes in the same skillet using remaining fat from the bacon.
# Add spinach - make sure its strained of excess liquid if using frozen - and sauté until it wilts and the juices have evaporated.
# Transfer the spinach-onion mixture to the mixing bowl and let it cool down for 10 minutes.
# After 10 minutes mix in previously browned bacon, heavy cream, salt, pepper, cheddar cheese and eggs.
# Stir to combine.
# Pour the egg mixture into the pie crust.
# Bake quiche for 40-45 minutes at 375°F, until top is golden brown and center is set.
# Remove from oven and let rest for 5 minutes or so.
# Slice into 8 slices

''NUTRITION''
Serving Size: 1 Slice
Calories: 520
Fat: 45
Carbohydrates: 8.5
Fiber: 5
Protein: 18
[img[images/ranchdressing.jpg]]

''Ingredients''
* 5 Tablespoons dried minced onions
* 7 teaspoon parsley flakes
* 2 teaspoon salt
* 2 teaspoon garlic powder

Mix together and store in an air tight container.

For dressing: Mix 2 Tablespoons dry mix with 1 cup mayonnaise and 1 cup buttermilk or sour cream.  (I use buttermilk.)

For dip:  Mix 2 Tablespoons dry mix with 2 cups sour cream or kreme fresh.

Mix up a few hours before serving, so the flavors all blend nicely.
[[Breakfast]]
[[Lunch]]
[[Dinner]]
[[Soups]]
[[Deserts]]
[[Snacks]]
[[Sides]]
[[Chaffle]]
[[Condiments]]

[[Sauces]]
[[Mixes]]
[[Chia Seeds]]
[[Pinterest]]
[[Fat Bombs]]
[[Beverages]]
[[Breads]]
http://paleogrubs.com/salad-dressing-recipes
http://holisticallyengineered.com/2012/10/low-carb-apple-crisp-gluten-free-and.html
http://247lowcarbdiner.blogspot.com/2012/10/cinnamon-roll-muffins.html
http://ginnyslowcarbkitchen.blogspot.com/2011/11/two-minute-microwave-coffee-cake.html
http://alldayidreamaboutfood.com/2013/07/lemon-cheesecake-bars-with-shortbread-crust-low-carb-and-gluten-free.html
http://alldayidreamaboutfood.com/2013/02/brownie-cheesecake-low-carb-and-gluten-free.html
http://247lowcarbdiner.blogspot.com/2011/03/cheesecake-dibs.html
http://alldayidreamaboutfood.com/2012/03/kahlua-cheesecake-with-chocolate-kahlua-sauce-low-carb-and-gluten-free.html
http://www.genaw.com/lowcarb/real_keylime_cheesecake.html
http://imgur.com/a/pRQY7  Sausage and Chicken Breast Wraps
http://holisticallyengineered.com/2013/05/gelatin-chocolate-ganache-and-salted-brown-butter-pecan-pie-recipe.html

Vegatable cooking cheat sheet
http://www.pinterest.com/pin/317011261240478619/
http://backonpointe.tumblr.com/image/7174435266

http://alexdsimmons.tumblr.com/post/21667715746/new-recipe-keto-cinnamon-bun
http://mariamindbodyhealth.com/amazing-cinnamon-rolls-and-wheat-depression/

[[Onion-Rosemary Rolls |http://buttoni.wordpress.com/2011/05/31/onion-rosemary-dinner-rolls/]]

http://www.the-lowcarb-diet.com/low-carb-peanut-butter-breakfast-bars/
http://www.reddit.com/r/keto/comments/2np22w/my_magic_electrolytes_potion_5_cents_per_liter/
Type the text for 'Sauces'
''Ingredients''
* 1 head cabbage
* 1 tbs caraway seeds
* 2 tbs sea salt
* 4 tbs liquid whey

''Directions''
# Reserve one large cabbage leaf
# Core and slice slice cabbage
# In large bowl combine all ingredients mixing thoroughly. squeeze and break cabbage a little.
# Let set for 1 hour
# Now mash and squeeze cabbage till broken down to about half of original volume
# Pour into jar
# place reserved cabbage leaf on top
# press down and put weight on top
# seal jar with burper in lid
# let age for 28-48 days 

https://www.youtube.com/watch?v=WPpIGv2s2eQ
https://www.youtube.com/watch?v=6gObQR5Vm4M
/***
|Name|SearchOptionsPlugin|
|Source|http://www.TiddlyTools.com/#SearchOptionsPlugin|
|Documentation|http://www.TiddlyTools.com/#SearchOptionsPluginInfo|
|Version|3.0.7|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Related|[[SearchOptionsPluginInfo]]|
|Type|plugin|
|Description|extend core search function with additional user-configurable options|
Adds extra options to core search function including selecting which data items to search, enabling/disabling incremental key-by-key searches, and generating a ''list of matching tiddlers'' instead of immediately displaying all matches.  This plugin also adds syntax for rendering 'search links' within tiddler content to embed one-click searches using pre-defined 'hard-coded' search terms.
!!!!!Documentation
>see [[SearchOptionsPluginInfo]]
!!!!!Configuration
<<<
Search in:
<<option chkSearchTitles>> titles <<option chkSearchText>> text <<option chkSearchTags>> tags <<option chkSearchFields>> fields <<option chkSearchShadows>> shadows
<<option chkSearchHighlight>> Highlight matching text in displayed tiddlers
<<option chkSearchList>> Show list of matches
<<option chkSearchListTiddler>> Write list to [[SearchResults]] tiddler
<<option chkSearchTitlesFirst>> Show title matches first
<<option chkSearchByDate>> Sort matching tiddlers by modification date (most recent first)
<<option chkIncrementalSearch>> Incremental key-by-key search: {{twochar{<<option txtIncrementalSearchMin>>}}} or more characters,  {{threechar{<<option txtIncrementalSearchDelay>>}}} msec delay
<<option chkSearchOpenTiddlers>> Search only in tiddlers that are currently displayed
<<option chkSearchExcludeTags>> Exclude tiddlers tagged with: <<option txtSearchExcludeTags>>
<<<
!!!!!Revisions
<<<
2010.02.25 3.0.7 in formatSearchResults_list, added declaration of local 'co' variable
|please see [[SearchOptionsPluginInfo]] for additional revision details|
2005.10.18 1.0.0 Initial Release
<<<
!!!!!Code
***/
//{{{
version.extensions.SearchOptionsPlugin= {major: 3, minor: 0, revision: 7, date: new Date(2010,2,25)};

var defaults={
	chkSearchTitles:	true,
	chkSearchText:		true,
	chkSearchTags:		true,
	chkSearchFields:	true,
	chkSearchTitlesFirst:	true,
	chkSearchList:		true,
	chkSearchHighlight:	true,
	chkSearchListTiddler:	true,
	chkSearchByDate:	false,
	chkIncrementalSearch:	true,
	chkSearchShadows:	true,
	chkSearchOpenTiddlers:	false,
	chkSearchExcludeTags:	true,
	txtSearchExcludeTags:	'excludeSearch',
	txtIncrementalSearchDelay:	500,
	txtIncrementalSearchMin:	3
}; for (var id in defaults) if (config.options[id]===undefined)
	config.options[id]=defaults[id];

if (config.macros.search.reportTitle==undefined)
	config.macros.search.reportTitle="SearchResults"; // note: not a cookie!
config.macros.search.label+="\xa0"; // a little bit of space just because it looks better
//}}}
// // searchLink: {{{[search[text to find]] OR [search[text to display|text to find]]}}}
//{{{
config.formatters.push( {
	name: "searchLink",
	match: "\\[search\\[",
	lookaheadRegExp: /\[search\[(.*?)(?:\|(.*?))?\]\]/mg,
	prompt: "search for: '%0'",
	handler: function(w)
	{
		this.lookaheadRegExp.lastIndex = w.matchStart;
		var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
		if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
			var label=lookaheadMatch[1];
			var text=lookaheadMatch[2]||label;
			var prompt=this.prompt.format([text]);
			var btn=createTiddlyButton(w.output,label,prompt,
				function(){story.search(this.getAttribute("searchText"))},"searchLink");
			btn.setAttribute("searchText",text);
			w.nextMatch = this.lookaheadRegExp.lastIndex;
		}
	}
});
//}}}
// // incremental search uses option settings instead of hard-coded delay and minimum input values
//{{{
var fn=config.macros.search.onKeyPress;
fn=fn.toString().replace(/500/g, "config.options.txtIncrementalSearchDelay||500");
fn=fn.toString().replace(/> 2/g, ">=(config.options.txtIncrementalSearchMin||3)");
eval("config.macros.search.onKeyPress="+fn);
//}}}
// // REPLACE story.search() for option to "show search results in a list"
//{{{
Story.prototype.search = function(text,useCaseSensitive,useRegExp)
{
	var co=config.options; // abbrev
	var re=new RegExp(useRegExp ? text : text.escapeRegExp(),useCaseSensitive ? "mg" : "img");
	if (config.options.chkSearchHighlight) highlightHack=re;
	var matches = store.search(re,co.chkSearchByDate?"modified":"title","");
	if (co.chkSearchByDate) matches=matches.reverse(); // most recent first
	var q = useRegExp ? "/" : "'";
	clearMessage();
	if (!matches.length) {
		if (co.chkSearchListTiddler) discardSearchResults();
		displayMessage(config.macros.search.failureMsg.format([q+text+q]));
	} else {
		if (co.chkSearchList||co.chkSearchListTiddler) 
			reportSearchResults(text,matches);
		else {
			var titles = []; for(var t=0; t<matches.length; t++) titles.push(matches[t].title);
			this.closeAllTiddlers(); story.displayTiddlers(null,titles);
			displayMessage(config.macros.search.successMsg.format([matches.length, q+text+q]));
		}
	}
	highlightHack = null;
}
//}}}
// // REPLACE store.search() for enhanced searching/sorting options
//{{{
TiddlyWiki.prototype.search = function(searchRegExp,sortField,excludeTag,match)
{
	var co=config.options; // abbrev
	var tids = this.reverseLookup("tags",excludeTag,!!match,sortField);
	var opened=[]; story.forEachTiddler(function(tid,elem){opened.push(tid);});

	// eliminate tiddlers tagged with excluded tags
	if (co.chkSearchExcludeTags&&co.txtSearchExcludeTags.length) {
		var ex=co.txtSearchExcludeTags.readBracketedList();
		var temp=[]; for(var t=tids.length-1; t>=0; t--)
			if (!tids[t].tags.containsAny(ex)) temp.push(tids[t]);
		tids=temp;
	}

	// scan for matching titles first...
	var results = [];
	if (co.chkSearchTitles) {
		for(var t=0; t<tids.length; t++) {
			if (co.chkSearchOpenTiddlers && !opened.contains(tids[t].title)) continue; 
			if(tids[t].title.search(searchRegExp)!=-1) results.push(tids[t]);
		}
		if (co.chkSearchShadows)
			for (var t in config.shadowTiddlers) {
				if (co.chkSearchOpenTiddlers && !opened.contains(t)) continue; 
				if ((t.search(searchRegExp)!=-1) && !store.tiddlerExists(t))
					results.push((new Tiddler()).assign(t,config.shadowTiddlers[t]));
			}
	}
	// then scan for matching text, tags, or field data
	for(var t=0; t<tids.length; t++) {
		if (co.chkSearchOpenTiddlers && !opened.contains(tids[t].title)) continue; 
		if (co.chkSearchText && tids[t].text.search(searchRegExp)!=-1)
			results.pushUnique(tids[t]);
		if (co.chkSearchTags && tids[t].tags.join(" ").search(searchRegExp)!=-1)
			results.pushUnique(tids[t]);
		if (co.chkSearchFields && store.forEachField!=undefined)
			store.forEachField(tids[t],
				function(tid,field,val) {
					if (val.search(searchRegExp)!=-1) results.pushUnique(tids[t]);
				},
				true); // extended fields only
	}
	// then check for matching text in shadows
	if (co.chkSearchShadows)
		for (var t in config.shadowTiddlers) {
			if (co.chkSearchOpenTiddlers && !opened.contains(t)) continue; 
			if ((config.shadowTiddlers[t].search(searchRegExp)!=-1) && !store.tiddlerExists(t))
				results.pushUnique((new Tiddler()).assign(t,config.shadowTiddlers[t]));
		}

	// if not 'titles first', or sorting by modification date,
	// re-sort results to so titles, text, tag and field matches are mixed together
	if(!sortField) sortField = "title";
	var bySortField=function(a,b){
		if(a[sortField]==b[sortField])return(0);else return(a[sortField]<b[sortField])?-1:+1;
	}
	if (!co.chkSearchTitlesFirst || co.chkSearchByDate) results.sort(bySortField);

	return results;
}
//}}}
// // HIJACK core {{{<<search>>}}} macro to add "report" and "simple inline" output
//{{{
config.macros.search.SOP_handler=config.macros.search.handler;
config.macros.search.handler = function(place,macroName,params)
{
	// if "report", use SearchOptionsPlugin report generator for inline output
	if (params[1]&&params[1].substr(0,6)=="report") {
		var keyword=params[0];
		var options=params[1].split("=")[1]; // split "report=option+option+..."
		var heading=params[2]?params[2].unescapeLineBreaks():"";
		var matches=store.search(new RegExp(keyword.escapeRegExp(),"img"),"title","excludeSearch");
		if (matches.length) wikify(heading+window.formatSearchResults(keyword,matches,options),place);
	} else if (params[1]) {
		var keyword=params[0];
		var heading=params[1]?params[1].unescapeLineBreaks():"";
		var seperator=params[2]?params[2].unescapeLineBreaks():", ";
		var matches=store.search(new RegExp(keyword.escapeRegExp(),"img"),"title","excludeSearch");
		if (matches.length) {
			var out=[];
			for (var m=0; m<matches.length; m++) out.push("[["+matches[m].title+"]]");
			wikify(heading+out.join(seperator),place);
		}
	} else
		config.macros.search.SOP_handler.apply(this,arguments);
};
//}}}
// // SearchResults panel handling
//{{{
setStylesheet(".searchResults { padding:1em 1em 0 1em; }","searchResults"); // matches std tiddler padding

config.macros.search.createPanel=function(text,matches,body) {

	function getByClass(e,c) { var d=e.getElementsByTagName("div");
		for (var i=0;i<d.length;i++) if (hasClass(d[i],c)) return d[i]; }
	var panel=createTiddlyElement(null,"div","searchPanel","searchPanel");
	this.renderPanel(panel,text,matches,body);
	var oldpanel=document.getElementById("searchPanel");
	if (!oldpanel) { // insert new panel just above tiddlers
		var da=document.getElementById("displayArea");
		da.insertBefore(panel,da.firstChild);
	} else { // if panel exists
		var oldwrap=getByClass(oldpanel,"searchResults");
		var newwrap=getByClass(panel,"searchResults");
		// if no prior content, just insert new content
		if (!oldwrap) oldpanel.insertBefore(newwrap,null);
		else {	// swap search results content but leave containing panel intact
			oldwrap.style.display='block'; // unfold wrapper if needed
			var i=oldwrap.getElementsByTagName("input")[0]; // get input field
			if (i) { var pos=this.getCursorPos(i); i.onblur=null; } // get cursor pos, ignore blur
			oldpanel.replaceChild(newwrap,oldwrap);
			panel=oldpanel; // use existing panel
		} 
	}
	this.showPanel(true,pos);
	return panel;
}

config.macros.search.renderPanel=function(panel,text,matches,body) {

	var wrap=createTiddlyElement(panel,"div",null,"searchResults");
	wrap.onmouseover = function(e){ addClass(this,"selected"); }
	wrap.onmouseout = function(e){ removeClass(this,"selected"); }
	// create toolbar: "open all", "fold/unfold", "close"
	var tb=createTiddlyElement(wrap,"div",null,"toolbar");
	var b=createTiddlyButton(tb, "open all", "open all matching tiddlers", function() {
		story.displayTiddlers(null,this.getAttribute("list").readBracketedList()); return false; },"button");
	var list=""; for(var t=0;t<matches.length;t++) list+='[['+matches[t].title+']] ';
	b.setAttribute("list",list);
	var b=createTiddlyButton(tb, "fold", "toggle display of search results", function() {
		config.macros.search.foldPanel(this); return false; },"button");
	var b=createTiddlyButton(tb, "close", "dismiss search results",	function() {
		config.macros.search.showPanel(false); return false; },"button");
	createTiddlyText(createTiddlyElement(wrap,"div",null,"title"),"Search for: "+text); // title
	wikify(body,createTiddlyElement(wrap,"div",null,"viewer")); // report
	return panel;
}

config.macros.search.showPanel=function(show,pos) {
	var panel=document.getElementById("searchPanel");
	var i=panel.getElementsByTagName("input")[0];
	i.onfocus=show?function(){config.macros.search.stayFocused(true);}:null;
	i.onblur=show?function(){config.macros.search.stayFocused(false);}:null;
	if (show && panel.style.display=="block") { // if shown, grab focus, restore cursor
		if (i&&this.stayFocused()) { i.focus(); this.setCursorPos(i,pos); }
		return;
	}
	if(!config.options.chkAnimate) {
		panel.style.display=show?"block":"none";
		if (!show) { removeChildren(panel); config.macros.search.stayFocused(false); }
	} else {
		var s=new Slider(panel,show,false,show?"none":"children");
		s.callback=function(e,p){e.style.overflow="visible";}
		anim.startAnimating(s);
	}
	return panel;
}

config.macros.search.foldPanel=function(button) {
	var d=document.getElementById("searchPanel").getElementsByTagName("div");
	for (var i=0;i<d.length;i++) if (hasClass(d[i],"viewer")) var v=d[i]; if (!v) return;
	var show=v.style.display=="none";
	if(!config.options.chkAnimate)
		v.style.display=show?"block":"none";
	else {
		var s=new Slider(v,show,false,"none");
		s.callback=function(e,p){e.style.overflow="visible";}
		anim.startAnimating(s);
	}
	button.innerHTML=show?"fold":"unfold";
	return false;
}

config.macros.search.stayFocused=function(keep) { // TRUE/FALSE=set value, no args=get value
	if (keep===undefined) return this.keepReportInFocus;
	this.keepReportInFocus=keep;
	return keep
}	

config.macros.search.getCursorPos=function(i) {
	var s=0; var e=0; if (!i) return { start:s, end:e };
	try {
		if (i.setSelectionRange) // FF
			{ s=i.selectionStart; e=i.selectionEnd; }
		if (document.selection && document.selection.createRange) { // IE
			var r=document.selection.createRange().duplicate();
			var len=r.text.length; s=0-r.moveStart('character',-100000); e=s+len;
		}
	}catch(e){};
	return { start:s, end:e };
}
config.macros.search.setCursorPos=function(i,pos) {
	if (!i||!pos) return; var s=pos.start; var e=pos.end;
	if (i.setSelectionRange) //FF
		i.setSelectionRange(s,e);
	if (i.createTextRange) // IE
		{ var r=i.createTextRange(); r.collapse(true); r.moveStart("character",s); r.select(); }
}
//}}}
// // SearchResults report generation
// note: these functions are defined globally, so they can be more easily redefined to customize report formats//
//{{{
if (!window.reportSearchResults) window.reportSearchResults=function(text,matches)
{
	var cms=config.macros.search; // abbrev
	var body=window.formatSearchResults(text,matches);
	if (!config.options.chkSearchListTiddler) // show #searchResults panel
		window.scrollTo(0,ensureVisible(cms.createPanel(text,matches,body)));
	else { // write [[SearchResults]] tiddler
		var title=cms.reportTitle;
		var who=config.options.txtUserName;
		var when=new Date();
		var tags="excludeLists excludeSearch temporary";
		var tid=store.getTiddler(title); if (!tid) tid=new Tiddler();
		tid.set(title,body,who,when,tags);
		store.addTiddler(tid);
		story.closeTiddler(title);
		story.displayTiddler(null,title);
	}
}

if (!window.formatSearchResults) window.formatSearchResults=function(text,matches,opt)
{
	var body='';
	var title=config.macros.search.reportTitle
	var q = config.options.chkRegExpSearch ? "/" : "'";
	if (!opt) var opt="all";
	var parts=opt.split("+");
	for (var i=0; i<parts.length; i++) { var p=parts[i].toLowerCase();
		if (p=="again"||p=="all")   body+=window.formatSearchResults_again(text,matches);
		if (p=="summary"||p=="all") body+=window.formatSearchResults_summary(text,matches);
		if (p=="list"||p=="all")    body+=window.formatSearchResults_list(text,matches);
		if (p=="buttons"||p=="all") body+=window.formatSearchResults_buttons(text,matches);
	}
	return body;
}

if (!window.formatSearchResults_again) window.formatSearchResults_again=function(text,matches)
{
	var title=config.macros.search.reportTitle
	var body='';
	// search again
	body+='{{span{<<search "'+text.replace(/"/g,'&#x22;')+'">> /%\n';
	body+='%/<html><input type="button" value="search again"';
	body+=' onclick="var t=this.parentNode.parentNode.getElementsByTagName(\'input\')[0];';
	body+=' config.macros.search.doSearch(t); return false;">';
	body+=' <a href="javascript:;" onclick="';
	body+=' var e=this.parentNode.nextSibling;';
	body+=' var show=e.style.display!=\'block\';';
	body+=' if(!config.options.chkAnimate) e.style.display=show?\'block\':\'none\';';
	body+=' else anim.startAnimating(new Slider(e,show,false,\'none\'));';
	body+=' return false;">options...</a>';
	body+='</html>@@display:none;border-left:1px dotted;margin-left:1em;padding:0;padding-left:.5em;font-size:90%;/%\n';
	body+='	%/<<option chkSearchTitles>>titles /%\n';
	body+='	%/<<option chkSearchText>>text /%\n';
	body+='	%/<<option chkSearchTags>>tags /%\n';
	body+='	%/<<option chkSearchFields>>fields /%\n';
	body+='	%/<<option chkSearchShadows>>shadows\n';
	body+='	<<option chkCaseSensitiveSearch>>case-sensitive /%\n';
	body+='	%/<<option chkRegExpSearch>>text patterns /%\n';
	body+='	%/<<option chkSearchByDate>>sorted by date\n';
	body+='	<<option chkSearchHighlight>> highlight matching text in displayed tiddlers\n';
	body+='	<<option chkIncrementalSearch>>incremental key-by-key search: /%\n';
	body+='	%/{{twochar{<<option txtIncrementalSearchMin>>}}} or more characters, /%\n';
	body+='	%/{{threechar{<<option txtIncrementalSearchDelay>>}}} msec delay\n';
	body+='	<<option chkSearchOpenTiddlers>> search only in tiddlers that are currently displayed\n';
	body+='	<<option chkSearchExcludeTags>>exclude tiddlers tagged with:\n';
	body+='	{{editor{<<option txtSearchExcludeTags>>}}}/%\n';
	body+='%/@@}}}\n\n';
	return body;
}

if (!window.formatSearchResults_summary) window.formatSearchResults_summary=function(text,matches)
{
	// summary: nn tiddlers found matching '...', options used
	var body='';
	var co=config.options; // abbrev
	var title=config.macros.search.reportTitle
	var q = co.chkRegExpSearch ? "/" : "'";
	body+="''"+config.macros.search.successMsg.format([matches.length,q+"{{{"+text+"}}}"+q])+"''\n";
	var opts=[];
	if (co.chkSearchTitles) opts.push("titles");
	if (co.chkSearchText) opts.push("text");
	if (co.chkSearchTags) opts.push("tags");
	if (co.chkSearchFields) opts.push("fields");
	if (co.chkSearchShadows) opts.push("shadows");
	if (co.chkSearchOpenTiddlers) body+="^^//search limited to displayed tiddlers only//^^\n";
	body+="~~&nbsp; searched in "+opts.join(" + ")+"~~\n";
	body+=(co.chkCaseSensitiveSearch||co.chkRegExpSearch?"^^&nbsp; using ":"")
		+(co.chkCaseSensitiveSearch?"case-sensitive ":"")
		+(co.chkRegExpSearch?"pattern ":"")
		+(co.chkCaseSensitiveSearch||co.chkRegExpSearch?"matching^^\n":"");
	return body;
}

if (!window.formatSearchResults_list) window.formatSearchResults_list=function(text,matches)
{
	// bullet list of links to matching tiddlers
	var body='';
	var co=config.options; // abbrev
	var pattern=co.chkRegExpSearch?text:text.escapeRegExp();
	var sensitive=co.chkCaseSensitiveSearch?"mg":"img";
	var link='{{tiddlyLinkExisting{<html><nowiki><a href="javascript:;" onclick="'
		+'if(config.options.chkSearchHighlight)'
		+'	highlightHack=new RegExp(\x27'+pattern+'\x27.escapeRegExp(),\x27'+sensitive+'\x27);'
		+'story.displayTiddler(null,\x27%0\x27);'
		+'highlightHack = null; return false;'
		+'" title="%2">%1</a></html>}}}';
	for(var t=0;t<matches.length;t++) {
		body+="* ";
		if (co.chkSearchByDate)
			body+=matches[t].modified.formatString('YYYY.0MM.0DD 0hh:0mm')+" ";
		var title=matches[t].title;
		var fixup=title.replace(/'/g,"\\x27").replace(/"/g,"\\x22");
		var tid=store.getTiddler(title);
		var tip=tid?tid.getSubtitle():''; tip=tip.replace(/"/g,"&quot;");
		body+=link.format([fixup,title,tip])+'\n';
	}
	return body;
}

if (!window.formatSearchResults_buttons) window.formatSearchResults_buttons=function(text,matches)
{
	// embed buttons only if writing SearchResults to tiddler
	if (!config.options.chkSearchListTiddler) return "";
	// "open all" button
	var title=config.macros.search.reportTitle;
	var body="";
	body+="@@diplay:block;<html><input type=\"button\" href=\"javascript:;\" "
		+"onclick=\"story.displayTiddlers(null,[";
	for(var t=0;t<matches.length;t++)
		body+="'"+matches[t].title.replace(/\'/mg,"\\'")+"'"+((t<matches.length-1)?", ":"");
	body+="],1);\" accesskey=\"O\" value=\"open all matching tiddlers\"></html> ";
	// "discard SearchResults" button
	body+="<html><input type=\"button\" href=\"javascript:;\" "
		+"onclick=\"discardSearchResults()\" value=\"discard "+title+"\"></html>";
	body+="@@\n";
	return body;
}

if (!window.discardSearchResults) window.discardSearchResults=function()
{
	// remove the tiddler
	story.closeTiddler(config.macros.search.reportTitle);
	store.deleteTiddler(config.macros.search.reportTitle);
	store.notify(config.macros.search.reportTitle,true);
}
//}}}
/***
|Name|SearchOptionsPluginInfo|
|Source|http://www.TiddlyTools.com/#SearchOptionsPlugin|
|Documentation|http://www.TiddlyTools.com/#SearchOptionsPluginInfo|
|Version|3.0.7|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|documentation|
|Description|Documentation for SearchOptionsPlugin|
Extend core search function with additional user-configurable options including selecting which data items to search, enabling/disabling incremental key-by-key searches, and generating a ''list of matching tiddler'' instead of immediately displaying all matches.  This plugin also adds syntax for rendering 'search links' within tiddler content to embed one-click searches using pre-defined 'hard-coded' search terms.
!!!!!Search link Syntax
<<<
To insert a 'search link' into tiddler content, you can write:
{{{
[search[text to find]]
}}}
or
{{{
[search[text to display|text to find]]
}}}
Clicking on the resulting search link will trigger the search functionality, just as if the specified 'text to find' had been entered into the standard search input field usually displayed in the document sidebar.
<<<
!!!!!Inline output: search macro syntax
<<<
Alternatively, to embed search results lists directly into your tiddler content, you can use:
{{{
<<search "text" report>> (report is a literal keyword)
<<search "text" "heading" "separator">> (simple inline generator)
}}}
<<<
!!!!!Inline output examples:
<<<
*+++*[&lt;&lt;search "wood"&gt;&gt;]>...
<<search "wood">>
===

*+++*[&lt;&lt;search "wood" "/%%/"&gt;&gt;]>...
<<search "wood" "/%%/">>
===

*+++*[&lt;&lt;search "wood" "See also: "&gt;&gt;]>...
<<search "wood" "See also: ">>
===

*+++*[&lt;&lt;search "wood" "See also:\n*" "\n*"&gt;&gt;]>...
<<search "wood" "See also:\n*" "\n*">>
===

*+++*[&lt;&lt;search "wood" report=list "See also:"&gt;&gt;]>...
<<search "wood" report=list "See Also:" >>
===

*+++*[&lt;&lt;search "wood" report&gt;&gt;]>...
<<search "wood" report>>
===

*+++*[&lt;&lt;search "wood" report=&gt;&gt;]>...
<<search "wood" report=>>
===

*+++*[&lt;&lt;search "wood" report=all&gt;&gt;]>...
<<search "wood" report=all>>
===

*+++*[&lt;&lt;search "wood" report=summary+buttons+again+list&gt;&gt;]>...
<<search "wood" report=summary+buttons+again+list>>
===

*+++*[&lt;&lt;search "wood" report=summary+again&gt;&gt;]>...
<<search "wood" report=summary+again>>
===

*+++*[&lt;&lt;search "wood" report=summary&gt;&gt;]>...
<<search "wood" report=summary>>
===

<<<
!!!!!Configuration
<<<
Search in:
<<option chkSearchTitles>> titles <<option chkSearchText>> text <<option chkSearchTags>> tags <<option chkSearchFields>> fields <<option chkSearchShadows>> shadows
{{{<<option chkSearchTitles>> <<option chkSearchText>> <<option chkSearchTags>>}}}
{{{<<option chkSearchFields>> <<option chkSearchShadows>>}}}
<<option chkSearchHighlight>> Highlight matching text in displayed tiddlers {{{<<option chkSearchHighlight>>}}}
<<option chkSearchList>> Show list of matches {{{<<option chkSearchList>>}}}
<<option chkSearchListTiddler>> Write list to [[SearchResults]] tiddler {{{<<option chkSearchListTiddler>>}}}
<<option chkSearchTitlesFirst>> Show title matches first {{{<<option chkSearchTitlesFirst>>}}}
<<option chkSearchByDate>> Sort matching tiddlers by date {{{<<option chkSearchByDate>>}}}
<<option chkIncrementalSearch>> Incremental key-by-key search: {{twochar{<<option txtIncrementalSearchMin>>}}} or more characters,  {{threechar{<<option txtIncrementalSearchDelay>>}}} msec delay
{{{<<option chkSearchIncremental>> <<option txtSearchIncrementalMin>> <<option txtSearchIncrementalDelay>>}}}
<<option chkSearchOpenTiddlers>> Search only in tiddlers that are currently displayed {{{<<option chkSearchOpenTiddlers>>}}}
<<option chkSearchExcludeTags>> Exclude tiddlers tagged with: <<option txtSearchExcludeTags>>
{{{<<option chkSearchExcludeTags>>}}} {{{<<option txtSearchExcludeTags>>}}}
<<<
!!!!!Revisions
<<<
2010.02.25 3.0.7 in formatSearchResults_list, added declaration of local 'co' variable
2009.09.22 3.0.6 in TiddlyWiki.prototype.search, added 'match' param for core compatibility
2009.01.16 3.0.5 added chkSearchOpenTiddlers option to limit searches to displayed tiddlers only
2009.01.15 3.0.4 in formatSearchResults_list(), corrected link generation to properly handle single-quotes and double-quotes in tiddler titles
2009.01.09 3.0.3 added chkSearchHighlight to optionally disable highlighting of matched text
2009.01.05 3.0.2 in formatSearchResults_list(), set/clear 'highlightHack' via HTML links so that search term will be highlighted when displaying tiddlers.
2008.10.14 3.0.1 changed panel class from "tiddler" to "searchPanel" and added style definition for "searchPanel".  Fixes ticket #771 (in IE, links from search results were reporting errors due to "fake" tiddler class wrapper)
2008.10.02 3.0.0 added optional list of tags to use for excluding tiddler from searches (default="excludeLists").
2008.09.24 2.9.9 performance improvment to reportSearchResults(): when rendering a real SearchResults tiddler, store.notify() isn't needed since the results tiddler is always explicitly closed and redrawn each time.
2008.09.20 2.9.8 corrected createPanel() and renderPanel() so toolbar will be correctly shown/hidden on mouseover/mouseout.
2008.09.19 2.9.7 fixes to panel handling for IE, Safari, and others.  Changed panel id to #searchPanel and added .searchResults CSS class wrapper around panel content.  Fixed fold/unfold handling.
2008.09.18 2.9.6 refactored panel handling code, added 'fold/unfold' panel toolbar command, added dynamic 'title' (shows search term), added txtIncrementalSearchMin option
2008.09.17 2.9.5 added focus and cursor handling for 'search again' field in #searchResults DIV report so that an incremental key-by-key search doesn't interfere with continuous typing into the field.
2008.09.17 2.9.4 fix 'flicker' when updating #searchResults DIV by wikify()ing to an 'offscreen' DIV and then using replaceChild() instead of using removeChildren() followed by wikify()
2008.09.16 2.9.3 changed report layout, added "search again" and collapsible 'options' section with incremental search checkbox and "txtIncrementalSearchDelay" timer tweak to onKeyPress()
2008.08.25 2.9.2 added animation to search results DIV.  Also, the #searchResults DOM element is only auto-created if it does not exist ... and when closed, the DIV is simply hidden rather than removed.  This allows custom placement of search results report in the PageTemplate definition.
2008.08.23 2.9.1 story column search results uses {{{<<moveablePanel>>}}}
2008.08.22 2.9.0 default is now to show search results at top of story column, similar to FND's SimpleSearchPlugin display, with an option to generate SearchResults tiddler as before.  Also changed 'chkSearchIncremental' to 'chkIncrementalSearch' to match core option variable
2008.08.12 2.8.2 change default for chkSearchByDate back to FALSE, and adjusted "list" and "again" output formats (minor tweaks requested by PhilWhitehouse for use on TiddlyWiki.com)
2008.08.11 2.8.1 changed defaults for chkSearchTitlesFirst, chkSearchList and chkSearchShadows to TRUE to enable enhanced search results output as soon as plugin is installed.
2008.06.21 2.8.0 added extended syntax for {{{<<search "text" report heading>> and <<search "text" "heading" "seperator">>}}}
2008.05.03 2.7.1 in searchLink formatter handler(), use separate setAttribute() call instead of passing attribs to createTiddlyButton().  Avoids conflict with errant code in TiddlerNotesPlugin (v2.1 26/10/07)
2008.04.29 2.7.0 added searchLink formatter (syntax: {{{[search[text]]}}} or {{{[search[display|text]]}}})
2008.04.08 2.6.2 don't automatically add options to AdvancedOptions shadow tiddler
2007.02.17 2.6.1 added redefinition of config.macros.search.onKeyPress() to restore check to bypass key-by-key searching (i.e., when chkSearchIncremental==false), which had been unintentionally removed with v2.6.0
2007.02.13 2.6.0 remove redefinition of config.macros.search.handler since core now includes handling for ENTER key.
2007.02.08 2.5.1 include 'temporary' tag when creating SearchResults (for use with TemporaryTiddlersPlugin)
2007.01.29 2.5.0 added support for "sort results by date".  Default is to sort alphabetically (standard).  When sorted by dates, most recent changes are shown first
2006.10.10 2.4.0 added support for "search in tiddler data" (tiddler.fields)  Default is to search extended data.
2006.04.06 2.3.0 added support for "search in shadow tiddlers".  Default is *not* to search in the shadows (i.e. standard TW behavior).  Note: if a shadow tiddler has a 'real' counterpart, only the real tiddler is searched, since the shadow is inaccessible for viewing/editing.
2006.02.03 2.2.1 rewrite timeout clearing code and blank search text handling to match 2.0.4 core release changes.  note that core no longer permits "blank=all" searches, so neither does this plugin.  To search for all, use "." with text patterns enabled.
2006.02.02 2.2.0 in search.handler(), KeyHandler() function clears 'left over' timeout when search input is < 3 chars.  Prevents searching on shorter text when shortened by rapid backspaces (<500msec)
2006.02.01 2.1.9 in Story.prototype.search(), correct inverted logic for using/not using regular expressions when searching
also, blank search text now presents "No search text.  Continue anyway?" confirm() message box, so search on blank can still be processed if desired by user.
2006.02.01 2.1.8 in doSearch(), added alert/return if search text is blank
2006.01.20 2.1.7 fixed setting of config.macros.search.reportTitle so that Tweaks can override it.
2006.01.19 2.1.6 improved SearchResults formatting, added a "search again" form to the report (based on a suggestion from MorrisGray)
define results report title using config.macros.search.reportTitle instead of hard-coding the tiddler title
2006.01.18 2.1.5 Created separate functions for reportSearchResults(text,matches) and discardSearchResults(), so that other developers can create alternative report generators.
2006.01.17 2.1.4 Use regExp.search() instead of regExp.test() to scan for matches.  Correctd the problem where only half the matching tiddlers (the odd-numbered ones) were being reported.
2006.01.15 2.1.3 Added information (date/time, username, search options used) to SearchResults output
2006.01.10 2.1.2 use displayTiddlers() to render matched tiddlers.  This lets you display multiple matching tiddlers, even if SinglePageModePlugin is enabled.
2006.01.08 2.1.1 corrected invalid variable reference, "txt.value" to "text" in story.search()
2006.01.08 2.1.0 re-write to match new store.search(), store.search.handler() and story.search() functions.
2005.12.30 2.0.0 Upgraded to TW2.0.  When rendering SearchResults tiddler, closeTiddler() first to ensure display is refreshed.
2005.12.26 1.4.0 added option to search for matching text in tiddler tags
2005.12.21 1.3.7 use \\ to 'escape' single quotes in tiddler titles when generating "Open all matching tiddlers" link.  Also, added access key: "O", to trigger "open all" link.  Based on a suggestion by UdoBorkowski.
2005.12.18 1.3.6 call displayMessage() AFTER showing matching tiddlers so message is not cleared too soon
2005.12.17 1.3.5 if no matches found, just display message and delete any existing SearchResults tiddler.
2005.12.17 1.3.4 use {/%%/{/%%/{  and }/%%/}/%%/} to 'escape' display text in SearchResults tiddler to ensure that formatting contained in search string is not rendered.  Based on a suggestion by UdoBorkowski.
2005.12.14 1.3.3 tag SearchResults tiddler with 'excludeSearch' so it won't list itself in subsequent searches. Based on a suggestion by UdoBorkowski.
2005.12.14 1.3.2 added "open all matching tiddlers..." link to search results output. Based on a suggestion by UdoBorkowski.
2005.12.10 1.3.1 added "discard search results" link to end of search list tiddler output for quick self-removal of 'SearchResults' tiddler.
2005.12.01 1.3.0 added chkSearchIncremental to enable/disable 'incremental' searching (i.e., search after each keystroke) (default is ENABLED).
added handling for Enter key so it can be used to start a search. Based on a suggestion by LyallPearce
2005.11.25 1.2.1 renamed from SearchTitleOrTextPlugin to SearchOptionsPlugin
2005.11.25 1.2.0 added chkSearchList option.  Based on a suggestion by RodneyGomes
2005.10.19 1.1.0 added chkSearchTitlesFirst option.  Based on a suggestion by ChristianHauck
2005.10.18 1.0.0 Initial Release.  Based on a suggestion by LyallPearce.
<<<
{{span{<<search "search">> /%
%/<html><input type="button" value="search again" onclick="var t=this.parentNode.parentNode.getElementsByTagName('input')[0]; config.macros.search.doSearch(t); return false;"> <a href="javascript:;" onclick=" var e=this.parentNode.nextSibling; var show=e.style.display!='block'; if(!config.options.chkAnimate) e.style.display=show?'block':'none'; else anim.startAnimating(new Slider(e,show,false,'none')); return false;">options...</a></html>@@display:none;border-left:1px dotted;margin-left:1em;padding:0;padding-left:.5em;font-size:90%;/%
	%/<<option chkSearchTitles>>titles /%
	%/<<option chkSearchText>>text /%
	%/<<option chkSearchTags>>tags /%
	%/<<option chkSearchFields>>fields /%
	%/<<option chkSearchShadows>>shadows
	<<option chkCaseSensitiveSearch>>case-sensitive /%
	%/<<option chkRegExpSearch>>text patterns /%
	%/<<option chkSearchByDate>>sorted by date
	<<option chkSearchHighlight>> highlight matching text in displayed tiddlers
	<<option chkIncrementalSearch>>incremental key-by-key search: /%
	%/{{twochar{<<option txtIncrementalSearchMin>>}}} or more characters, /%
	%/{{threechar{<<option txtIncrementalSearchDelay>>}}} msec delay
	<<option chkSearchOpenTiddlers>> search only in tiddlers that are currently displayed
	<<option chkSearchExcludeTags>>exclude tiddlers tagged with:
	{{editor{<<option txtSearchExcludeTags>>}}}/%
%/@@}}}

''4 tiddlers found matching '{{{search}}}'''
~~&nbsp; searched in titles + text + tags + fields + shadows~~
* {{tiddlyLinkExisting{<html><nowiki><a href="javascript:;" onclick="if(config.options.chkSearchHighlight)	highlightHack=new RegExp('search'.escapeRegExp(),'img');story.displayTiddler(null,'SearchOptionsPluginInfo');highlightHack = null; return false;" title="SearchOptionsPluginInfo - YourName, Mon 01 Apr 2013 09:12:00 PM PDT">SearchOptionsPluginInfo</a></html>}}}
* {{tiddlyLinkExisting{<html><nowiki><a href="javascript:;" onclick="if(config.options.chkSearchHighlight)	highlightHack=new RegExp('search'.escapeRegExp(),'img');story.displayTiddler(null,'SearchOptionsPlugin');highlightHack = null; return false;" title="SearchOptionsPlugin - YourName, Mon 01 Apr 2013 09:11:00 PM PDT">SearchOptionsPlugin</a></html>}}}
* {{tiddlyLinkExisting{<html><nowiki><a href="javascript:;" onclick="if(config.options.chkSearchHighlight)	highlightHack=new RegExp('search'.escapeRegExp(),'img');story.displayTiddler(null,'SideBarOptions');highlightHack = null; return false;" title="">SideBarOptions</a></html>}}}
* {{tiddlyLinkExisting{<html><nowiki><a href="javascript:;" onclick="if(config.options.chkSearchHighlight)	highlightHack=new RegExp('search'.escapeRegExp(),'img');story.displayTiddler(null,'OptionsPanel');highlightHack = null; return false;" title="">OptionsPanel</a></html>}}}
@@diplay:block;<html><input type="button" href="javascript:;" onclick="story.displayTiddlers(null,['SearchOptionsPluginInfo', 'SearchOptionsPlugin', 'SideBarOptions', 'OptionsPanel'],1);" accesskey="O" value="open all matching tiddlers"></html> <html><input type="button" href="javascript:;" onclick="discardSearchResults()" value="discard SearchResults"></html>@@
http://gnowfglins.com/2010/07/16/diy-airlock-fruit-and-veggie-ferments/
<<calendar thismonth>>
<<search>><<closeAll>><<permaview>><<newTiddler>><<newJournal "DD MMM YYYY" "journal">><<saveChanges>><<tiddler TspotSidebar>><<slider chkSliderOptionsPanel OptionsPanel "▼ options" "Change TiddlyWiki advanced options">>/% ---------------------------------------------------------------------
UNUSED COMMANDS (most have been moved elsewhere)
<<closeAll>>
<<collapseAll>>
<<expandAll>>
<<permaview>>
<<saveChanges>>
THIS ONE MUST BE MAINTAINED SO CALENDARPLUGIN CAN ACCESS ITS DEFINITION (though it can be commented out, as it is here):
<<newJournal "0DD MMM YYYY (DDD)" label:"new journal" tag:"journal" text:{{store.getTiddlerText('JournalTemplate')}}>>
   --------------------------------------------------------------------- %/
<hr><<slider chkSliderSideBarCalendar SideBarCalendar "▼ calendar" "Display calendar">>
<<slider chkSliderMenu_Archives SliderMenu_Archives "▼ archives" "Archives from previous years">><hr><<slider chkSliderSideBarTabsToggleMenu SideBarTabsToggleMenu "▼ tiddlers" "Displays lists of tiddlers">>
<<tabs txtMainTab "Timeline" "Timeline better:true maxEntries:10" TabTimeline "All" "All tiddlers" TabAll "Tags" "All tags" TabTags "More" "More lists" TabMore>>
Type the text for 'Sideds'
''~SINGLE-SERVING MICROWAVE BROWNIE''
Serves 1

''INGREDIENTS''
* 1 Tbs creamy almond butter
* 1 Tbs liquid egg white (or use a tablespoon of beaten egg, I just think liquid egg white is more convenient for this)
* 1 tsp dutch-processed unsweetened cocoa powder such as Hershey's Special Dark
* 1/8 tsp vanilla extract
* 1-2 packets sweetener such as Sweetleaf stevia OR 1 Tbs honey
* Pinch baking soda (about 1/16 tsp; you can try omitting this if you like a denser brownie.)
* Pinch salt (can omit if your almond butter is salty)

''DIRECTIONS''
* In a ramekin, small mug, or similar microwave-safe cup, combine all the ingredients. Stir with a fork to thoroughly combine, ensuring that there are no lumps.
* Microwave on high for about 30 seconds. Note: You can reduce the time for a "molten" brownie. You may have to experiment a bit with cooking times since all microwaves are different. If you're unsure you can try nuking it at 10 second intervals, checking it each time.

http://blog.stuffimakemyhusband.com/2012/05/single-serving-microwave-brownie.html
with a Traditional Food Flair
Keto
''Ingredients''
1 pound ground chuck
1 small onion, chopped, 2 1/2 ounces
1 clove garlic, minced
8 ounce can tomato sauce
1/4 cup granular Splenda or equivalent liquid Splenda
1/2 teaspoon blackstrap molasses, optional
2 tablespoon vinegar
1 teaspoon mustard
1 tablespoon Worcestershire sauce
1 teaspoon salt
1/4 teaspoon pepper
1/4 teaspoon xanthan gum, optional

''Directions''
Brown the ground chuck along with the onion and garlic; drain the fat. Add the remaining ingredients, except the xanthan gum. Cover and simmer 30 minutes. If the sauce is too thin, thicken it with a little xanthan gum. Serve on low carb buns or over chopped lettuce (not included in counts).

Makes about 6 servings
Can be frozen

''TIP:'' An easy way to add the xanthan gum is to stir it into the ground beef after you've drained the grease and before you add the remaining ingredients.

With granular Splenda:
Per Serving: 151 Calories; 8g Fat; 13g Protein; 5g Carbohydrate; 1g Dietary Fiber; 4g Net Carbs

With liquid Splenda:
Per Serving: 147 Calories; 8g Fat; 13g Protein; 4g Carbohydrate; 1g Dietary Fiber; 3g Net Carbs
What you'll need to make about 8oz of sauce: (You may already have it all!)
8oz Tomato Ketchup
1.5oz Worcestershire sauce
Franks Hot sauce to taste

Mix in a bowl. Pour into a bottle.
''Ingredients''
*4 tablespoons onion powder
*4 tablespoons paprika
*4 tablespoons garlic powder
*3 tablespoons salt
*3 tablespoons black pepper
*3 tablespoons dried parsley flakes
*1 tablespoon celery seed
*1 tablespoon basil
*3 teaspoons dried oregano
*1 teaspoon dried dill
*1 teaspoon dried thyme
*1 teaspoon dried rosemary (crushed)
*1 teaspoon cayenne pepper

''Directions''
*Dump everything into a jar or sealed container, shake
*We make Triple or more  of this recipe and use 2-3T. per pound of meat.
[[The Stuffing|http://mariamindbodyhealth.com/stuffing-and-sleep/]]

* 1/4 cup onion , chopped
* 8 oz portabella mushrooms, sliced
* 3 stalks celery, chopped
* 1/4 cup butter or coconut oil
* 1/2 tsp rosemary
* 1/2 tsp poultry seasoning
* 1 cup chicken broth
* 1 tsp Celtic sea salt
* 1/2 tsp pepper
* 2 eggs, beaten
* 1 batch of [[Protein Bread]]
OPTIONAL: sausage and drippings

Preheat the oven to 325 degrees F. Sauté the celery, onion and mushrooms in butter and spices until tender and translucent. Cut up the protein bread into small 1 centimeter cubes. Place the protein bread cubes in the pan with the vegetable mixture. Add the broth and mix well (you can add more if desired). Season to taste with salt and pepper. Stir in the egg. Bake, covered, in a greased 1 1/2 to 2 quart casserole for 35-40 minutes. Uncover and bake for 5-10 more minutes until golden brown on the top. Makes 12 servings.

NUTRITIONAL COMPARISON (per serving)
Traditional Stuffing = 179 calories, 8.8g fat, 2.9g protein, 22 carbs, 2g fiber
“Healthified” Stuffing = 95 calories, 7.5g fat, 5.2g protein, 2.2 carbs, 0 fiber
/***
For master styles, refer to StyleSheetLayout, StyleSheetPrint, and StyleSheetColors when making changes.
***/

/***
!Global Styles /% ============================================================= %/
***/
/*{{{*/
* html .tiddler {
  height:1%;
}

body {
  font-size:0.7em; // formerly 0.7em;
  font-family:verdana,tahoma,calibri; // formerly verdana,tahoma,calibri;
  margin:0;
  padding:0;
}

.viewer img {
  padding:4px;
}
/*}}}*/
/***
!!Buttons /% ================= %/
***/
/*{{{*/
.button {
  border:1px transparent solid;
}

.button:hover {
  border:1px [[ColorPalette::SecondaryMid]] solid;
}

.button:active {
  border:1px [[ColorPalette::SecondaryDark]] solid;
}
/*}}}*/
/***
!!Headings and Subheadings /% ================= %/
By default, {{{H4}}}, {{{H5}}}, and {{{H6}}} have different line paddings than {{{H1}}}, {{{H2}}}, and {{{H3}}} in the ~TiddlyWiki core code; I've overridden that here by assigning the same values to {{{H1}}}, {{{H2}}}, {{{H3}}}, {{{H4}}}, {{{H5}}}, and {{{H6}}}.

I've also added styling to make subheads decrease in width as the values rise, making it easier to identify sub-headings when viewing tiddlers.
***/
/*{{{*/
h1, h2, h3, h4, h5, h6 {
  font-weight:bold;
  text-decoration:none;
  background-color:[[ColorPalette::SecondaryPale]];
  border-bottom:2px solid [[ColorPalette::TertiaryLight]];
  border-right:2px solid [[ColorPalette::TertiaryLight]];
}

h1, h2, h3, h4, h5, h6 {
  padding-bottom:1px;
  margin-top:1.2em;
  margin-bottom:0.3em;
}

h1 {
  font-size:1.4em;
  text-transform:uppercase;
}

h2 {
  font-size:1.35em;
  padding-left:10px;
  margin-right:5%;
}

h3 {
  font-size:1.3em;
  padding-left:20px;
  margin-right:10%;
}

h4 {
  font-size:1.25em;
  padding-left:30px;
  margin-right:15%;
}

h5 {
  font-size:1.2em;
  padding-left:40px;
  margin-right:20%;
}

h6 {
  font-size:1.15em;
  padding-left:50px;
  margin-right:25%;
}
/*}}}*/
/***
!!Horizontal Rules /% ================= %/
***/
/*{{{*/
.viewer hr {
  border:0;
  border-top:solid 1px [[ColorPalette::TertiaryDark]];
  color:[[ColorPalette::TertiaryDark]];
}
/*}}}*/
/***
!!Lists /% ================= %/
***/
/*{{{*/
.viewer ul,
.viewer ol {
  margin-top:0em;
  margin-bottom:0em;
  margin-left:0.5em;
  padding-top:0em;
  padding-bottom:0em;
  padding-left:1.5em;
}

.viewer ul li,
.viewer ol li {
  margin:0.5em inherit;
}
/*}}}*/
/***
!!Superscripts & Subscripts /% ================= %/
***/
/*{{{*/
sup, sub {
  height:0;
  line-height:1;
  vertical-align:baseline;
  _vertical-align:bottom;
  position:relative;
}

sup {
  bottom:1ex;
}

sub {
  top:0.5ex;
}
/*}}}*/
/***
!!Strikethrough /% ================= %/
***/
/*{{{*/
strike {
  color:#606060;
  text-decoration:line-through;
}
/*}}}*/
/***
!!Blockquoting /% ================= %/
***/
/*{{{*/
.viewer blockquote {
  margin-top:0px;
  margin-bottom:0px;
  padding-bottom:0px;
}
/*}}}*/
/***
Custom CSS "blockquote" style, so that blockquoting can be invoked with <html><code>{{blockquote{</code></html> and <html><code>}}}</code></html> around a block of text instead of having to preface every line with {{{>}}}.  (Created before I knew ~TiddlyWiki natively supports {{{<<<}}} and {{{<<<}}} for multi-line blockquoting, this style remains intact to allow nested blockquotes -- and to support all those tiddlers created before I knew of the native solution.)
***/
/*{{{*/
.viewer .blockquote {
  border-left:3px solid [[ColorPalette::TertiaryDark]];
  margin-top:0px;
  margin-bottom:0px;
  margin-left:2.5em;
  padding-left:0.8em;
  padding-bottom:0px;
}
/*}}}*/
/***
!!Pre-Formatted Text (And Code Blocks) /% ================= %/
***/
/*{{{*/
.viewer pre {
  font-family:Consolas,Courier New,Courier;
  padding:0.5em;
  margin-left:0.5em;
  font-size:inherit; // formerly 1.2em; formerly 10pt;
  line-height:1.4em;
  white-space:pre-wrap;
  overflow:auto;
  color:[[ColorPalette::Foreground]];
  background:[[ColorPalette::TertiaryLessPale]];
  border:1px solid [[ColorPalette::SecondaryMid]];
}

.viewer code {
  font-family:Consolas,Courier New,Courier;
  font-size:inherit; // formerly 1.2em;
  line-height:1.4em;
  color:[[ColorPalette::SecondaryDark]];
}

code.escaped {
  font-family:Consolas,Courier New,Courier;
  white-space:pre-wrap;
}

.bluescreen {
  font-family:Consolas,Courier New,Courier;
  padding:0.5em;
  margin-left:0.5em;
  font-size:10pt; // formerly 1.2em;
  line-height:1.4em;
  white-space:pre-wrap;
  overflow:auto;
  color:#FFFFFF;
  background:#0000FF;
  border:1px solid [[ColorPalette::PrimaryLight]];
}
/*}}}*/
/***
!!Text Input Fields /% ================= %/
***/
/*{{{*/
.txtOptionInput,
.wideInput {
  width:10.5em;
  background:[[ColorPalette::SecondaryPale]];
}
/*}}}*/

/***
!Layout Styles /% ============================================================= %/
***/
/***
!!Title & Header /% ================= %/
***/
/*{{{*/
.headerForeground {
  position:absolute;
  left:0px;
  top:0px;
  padding:2em 0 1em 1em;
}

.headerShadow {
  position:relative;
  left:-1px;
  top:-1px;
  padding:2em 0 1em 1em;
}

.siteTitle {
  font-family:calibri;
  font-size:2.8em;
  font-weight:bold;
}
.siteSubtitle {
  font-family:calibri;
  font-size:1.4em;
}

.headerMenu {
  position:absolute;
  right:16.5em;
  bottom:0px;
  padding:0;
}

.siteControls {
  margin:0;
  padding:0;
  font-family:calibri;
  font-size:1.1em;
  color:[[ColorPalette::Background]];
}

.siteControls a {
  font-weight:bold;
  color:[[ColorPalette::Background]];
  border:none;
  text-decoration:none;
  padding:4px;
  border-top-left-radius:2px;
  border-top-right-radius:2px;
}

.siteControls a:hover {
  font-weight:bold;
  color:[[ColorPalette::PrimaryDark]];
  background:[[ColorPalette::Background]];
  border:none;
  text-decoration:none;
  border-top-left-radius:2px;
  border-top-right-radius:2px;
}

.siteControls a:active {
  font-weight:bold;
  color:[[ColorPalette::PrimaryDark]];
  background:[[ColorPalette::Background]];
  border-top-left-radius:2px;
  border-top-right-radius:2px;
}
/*}}}*/
/***
!!Message Area ("Save" Dialogue) /% ================= %/
***/
/*{{{*/
#messageArea {
  position:absolute;
  top:0.3em; // formerly 1.5em;
  right:0;
  margin:0.5em;
  padding:0.5em;
  z-index:2000;
  _position:absolute;
}
/*}}}*/
/***
!!Main Menu (Left Nav/Primary Navigation) /% ================= %/
***/
/*{{{*/
#mainMenu {
  position:absolute;
  left:0;
  padding:1.1em 0.3em 0.1em 0em;
  width:13.5em;
  text-align:right;
  line-height:1.4em;
  font-size:1em;
}

#mainMenu a {
  display:block;
}

#mainMenu .sliderPanel a {
  display:inline;
}

#mainMenu .leftNavSectionTop {
  border-top:1px solid [[ColorPalette::TertiaryDark]];
  padding:0.5em 1.1em 0em 0em;
}

#mainMenu .leftNavSection {
  border-top:1px solid [[ColorPalette::TertiaryDark]];
  padding:0.5em 0.5em 0em 0em;
}

#mainMenu .leftNavConfigSection {
  border:1px solid [[ColorPalette::TertiaryDark]];
  border-left:none;
  border-radius-topright:1em;
  border-radius-bottomright:1em;
  padding:0.5em 0.5em 0.5em 0em;
  background-color:[[ColorPalette::TertiaryLessPale]];
}

#mainMenu .button {
  font-weight:bold;
}

#mainMenu .sliderPanel {
  margin-right:0.5em;
  margin-left:0.6em;
  padding:0.5em;
  font-size:1em;
  border-style:dotted;
  border-width:0px 1px 1px 0px;
  border-color:[[ColorPalette::SecondaryMid]];
}
/*}}}*/
/***
Bold for existing tiddlers, italics for non-existing tiddlers:
***/
/*{{{*/
#mainMenu .tiddlyLinkExisting {
  font-weight:bold;
  font-style:normal;
}

#mainMenu .tiddlyLinkNonExisting {
  font-weight:normal;
  font-style:italic;
}
/*}}}*/
/***
!!Sidebar (Control Panel/Options Panel) /% ================= %/
***/
/*{{{*/
#sidebar {
  position:absolute;
  right:0; // formerly 3px
  width:17em;
  font-size:0.9em;
}

#sidebar hr {
  height:1px;
  border:0;
  color:[[ColorPalette::TertiaryDark]];
  background:[[ColorPalette::TertiaryDark]];
}

#sidebarOptions {
  padding:0;
  padding-top:0.3em;
}

#sidebarOptions a {
  margin:0;
  padding:0.2em 0;
  display:block;
}

#sidebarOptions input {
  margin:0;
  margin-right:0.2em;
  margin-bottom:0.2em;
}

#sidebarOptions .sliderPanel {
  margin-left:0.5em;
  margin-right:0.6em
  padding:0.5em;
  font-size:1em;
  border-style:dotted;
  border-width:0px 0px 1px 1px;
  border-color:[[ColorPalette::SecondaryMid]];
  background:[[ColorPalette::Background]];
}

#sidebarOptions .sliderPanel input {
  margin:0 0 0.3em 0;
}

#sidebarOptions .sliderPanel a {
  font-weight:bold;
  display:inline;
  padding:0;
}

#sidebarTabs .tab,
#sidebarTabs .sliderPanel .tab {
  border-top-left-radius:3px;
  border-top-right-radius:3px;
  padding:2px 3px;
}

#sidebarTabs a {
  display:block;
}

#sidebarTabs .tabContents {
  overflow:hidden;
}

#sidebarTabs .sliderPanel {
  font-size:1em;
}

#sidebarTabs .sliderPanel a {
  display:inline;
}
/*}}}*/
/***
!!Display Area (Main Content Area) /% ================= %/
***/
/*{{{*/
#displayArea {
  margin:1em 16em 0 14em;
}

.tiddler {
  border-top:1px solid [[ColorPalette::PrimaryLight]];
  border-right:2px solid [[ColorPalette::PrimaryLight]];
  border-bottom:2px solid [[ColorPalette::PrimaryLight]];
  border-left:1px solid [[ColorPalette::PrimaryLight]];
  margin:0.5em;
  background:[[ColorPalette::Background]];
  padding: 0.5em;
  border-radius:1em; /* rounded corners for tiddlers */
}
/*}}}*/

/***
!Tiddler Styles /% ============================================================= %/
***/
/***
!!Headers /% ================= %/
Add this in to give the tiddler header a background shade consistent with the current ~ColorPalette:
<html><code>.title, .subtitle, .subtitle2, .toolbar, .wordcount {background-color:[[ColorPalette::SecondaryPale]];}</code></html>
***/
/***
!!!Toolbar /% =========== %/
***/
/*{{{*/
.toolbar {
  color:[[ColorPalette::PrimaryMid]];
}

.toolbar a {
  color:[[ColorPalette::TertiaryLight]];
  border-radius:2px;
}

.selected .toolbar a {
  color:[[ColorPalette::TertiaryMid]];
  border-radius:2px;
}

.selected .toolbar a:hover {
  color:[[ColorPalette::Foreground]];
  border-radius:2px;
}
/*}}}*/
/***
!!!Title, Subtitles, and Word Count /% =========== %/
***/
/*{{{*/
.subtitle {
  font-size:1.1em;
}

.subtitle2 {
  font-size:0.75em;
}

.wordcount {
  font-size:0.75em;
  font-weight:bold;
}
/*}}}*/
/***
!!Tagging /% ================= %/
***/
/*{{{*/
.tagging {
  margin:0.5em 0.5em 0.5em 0;
  float:right;
  display:none;
}

.tagged {
  margin:0.5em 0.5em 0.5em 0;
  float:right;
}
/*}}}*/
/***
!!Edit View /% ================= %/
***/
/*{{{*/
.editor input,
.editor textarea {
  display:block;
  width:100%;
  font-family:Consolas,Courier New,Courier;
  font-size:10pt;
  background:[[ColorPalette::SecondaryPale]];
}
/*}}}*/

/***
!Tables /% ============================================================= %/
***/
/***
!!Centered Table /% ================= %/
Invoke with <html><code>{{centerThis{</code></html> at beginning of table and <html><code>}}}</code></html> at end.
***/
/*{{{*/
.viewer, .sidebarOptions, .sidebarTabs div.centerThis {
  text-align:center;
}

.viewer, .sidebarOptions, .sidebarTabs div.centerThis table {
  margin:0 auto;
  text-align:left;
}
/*}}}*/
/***
!!Floating Tables (And Other Things) /% ================= %/
Invoke with <html><code>{{floatRight{</code></html> or <html><code>{{floatLeft{</code></html> at beginning of table and <html><code>}}}</code></html> at end ''or'' by adding {{{|floatRight|k}}} (or {{{|floatLeft|k}}}) at beginning of table.
***/
/*{{{*/
.viewer .floatRight {
  float:right;
}

.viewer .floatLeft  {
  float:left;
}

.viewer .centerThis {
  text-align:center;
  margin:0 auto;
}
/*}}}*/
/***
!!Header Rows /% ================= %/
***/
/*{{{*/
.viewer thead,
.viewer thead td {
  font-weight:bold;
}
/*}}}*/
/***
!!Cell Alignment /% ================= %/
***/
/*{{{*/
.viewer td {
  vertical-align:top;
  font-weight:normal;
}

.viewer caption,
.twtable caption {
  text-align:left;
}
/*}}}*/
/***
!!Table Row Shading /% ================= %/
***/
/*{{{*/
.viewer tr {
  background-color:[[ColorPalette::Background]];
}
/*}}}*/
/***
!!!Alternating Table Row Shading /% =========== %/
Invoke this style with {{{|altRows|k}}} at beginning of table.  (~TiddlyWiki automatically assigns {{{.oddRow}}} and {{{.evenRow}}} classes to {{{<TR>}}}s.)
***/
/*{{{*/
.viewer .altRows tr.oddRow {
  background-color:[[ColorPalette::Background]];
}

.viewer .altRows tr.evenRow {
  background-color:[[ColorPalette::TertiaryLessPale]];
}
/*}}}*/

/***
!Custom CSS Classes /% ============================================================= %/
***/
/***
!!Sidebars /% ================= %/
***/
/*{{{*/
.sidebar,
.sidebarRight,
.sidebarLeft {
  background-color:[[ColorPalette::SecondaryLight]];
  border:2px solid [[ColorPalette::SecondaryMid]];
  border-radius:0.5em;
  padding:0.6em;
}

.sidebar {
  margin:0.3em 5% 0.3em 5%;
}

.sidebarRight {
  margin:0.3em;
  width:20%;
  float:right;
}

.sidebarLeft {
  margin:0.3em;
  width:20%;
  float:left;
}
/*}}}*/
/***
!!Thumbnails /% ================= %/
***/
/*{{{*/
.viewer .thumbs,
.twtable .thumbs {
  float:right;
  width:124px
}

.thumb img {
  width:200px;
  float:right;
}
/*}}}*/

/***
!Supplemental Style Sheets /% ============================================================= %/
***/
/*{{{*/
[[StyleSheet_AVweb]]
/*}}}*/



.viewer .tableRWrapper {
     float: right;
}

.viewer .tableLWrapper {
     float: left;
}

.viewer div.centeredTable {
	text-align: center;
}
.viewer div.centeredTable table {
	margin: 0 auto;
	text-align: left;
}

.viewer table.borderless,
.viewer table.borderless * {
	border: 0;
}



/***
|Name|StyleSheetShortcuts|
|Source|http://www.TiddlyTools.com/#StyleSheetShortcuts|
|Version||
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|CSS|
|Requires||
|Description|'convenience' classes for common formatting, alignment, boxes, tables, etc.|

These 'style tweaks' can be easily included in other stylesheet tiddler so they can share a baseline look-and-feel that can then be customized to create a wide variety of 'flavors'.
***/
/*{{{*/

/* text alignments */
.left
	{ display:block;text-align:left; }
.center
	{ display:block;text-align:center; }
.center table
	{ margin:auto !important; }
.right	
	{ display:block;text-align:right; }
.justify
	{ display:block;text-align:justify; }
.indent
	{ display:block;margin:0;padding:0;border:0;margin-left:2em; }
.floatleft
	{ float:left; }
.floatright
	{ float:right; }
.valignTop, .valignTop table, .valignTop tbody, .valignTop th, .valignTop tr, .valignTop td
	{ vertical-align:top; }
.valignBottom, .valignBottom table, .valignBottom tbody, .valignBottom th, .valignBottom tr, .valignBottom td
	{ vertical-align:bottom; }
.clear
	{ clear:both; }
.wrap
	{ white-space:normal; }
.nowrap
	{ white-space:nowrap; }
.hidden
	{ display:none; }
.show
	{ display:inline !important; }
.span
	{ display:span; }
.block
	{ display:block; }
.relative
	{ position:relative; }
.absolute
	{ position:absolute; }

/* font sizes */
.big
	{ font-size:14pt;line-height:120% }
.medium
	{ font-size:12pt;line-height:120% }
.normal
	{ font-size:9pt;line-height:120% }
.small
	{ font-size:8pt;line-height:120% }
.fine
	{ font-size:7pt;line-height:120% }
.tiny
	{ font-size:6pt;line-height:120% }
.larger
	{ font-size:120%; }
.smaller
	{ font-size:80%; }

/* font styles */
.bold
	{ font-weight:bold; }
.italic
	{ font-style:italic; }
.underline
	{ text-decoration:underline; }

/* plain list items (no bullets or indent) */
.nobullets li { list-style-type: none; margin-left:-2em; }

/* multi-column tiddler content (not supported in Internet Explorer) */
.twocolumns { display:block;
	-moz-column-count:2; -moz-column-gap:1em; -moz-column-width:50%; /* FireFox */
	-webkit-column-count:2; -webkit-column-gap:1em; -webkit-column-width:50%; /* Safari */
	column-count:2; column-gap:1em; column-width:50%; /* Opera */
}
.threecolumns { display:block;
	-moz-column-count:3; -moz-column-gap:1em; -moz-column-width:33%; /* FireFox */
	-webkit-column-count:3; -webkit-column-gap:1em; -webkit-column-width:33%; /* Safari */
	column-count:3; column-gap:1em; column-width:33%; /* Opera */
}
.fourcolumns { display:block;
	-moz-column-count:4; -moz-column-gap:1em; -moz-column-width:25%; /* FireFox */
	-webkit-column-count:4; -webkit-column-gap:1em; -webkit-column-width:25%; /* Safari */
	column-count:4; column-gap:1em; column-width:25%; /* Opera */
}

/* page breaks */
.breakbefore { page-break-before:always; }
.breakafter { page-break-before:always; } 

/* show/hide browser-specific content for InternetExplorer vs. non-IE ("moz") browsers */
*[class="ieOnly"]
	{ display:none; } /* hide in moz (uses CSS selector) */
* html .mozOnly, *:first-child+html .mozOnly
	{ display: none; } /* hide in IE (uses IE6/IE7 CSS hacks) */

/* borderless tables */
.borderless, .borderless table, .borderless td, .borderless tr, .borderless th, .borderless tbody
	{ border:0 !important; margin:0 !important; padding:0 !important; }
.widetable, .widetable table
	{ width:100%; }

/* thumbnail images (fixed-sized scaled images) */
.thumbnail img { height:5em !important; }

/* stretchable images (auto-size to fit tiddler) */
.stretch img { width:95%; }

/* grouped content */
.outline
	{ display:block; padding:1em; -moz-border-radius:1em;-webkit-border-radius:1em; border:1px solid; }
.menubox
	{ display:block; padding:1em; -moz-border-radius:1em;-webkit-border-radius:1em; border:1px solid; background:#fff; color:#000; }
.menubox .button, .menubox .tiddlyLinkExisting, .menubox .tiddlyLinkNonExisting
	{ color:#009 !important; }
.groupbox
	{ display:block; padding:1em; -moz-border-radius:1em;-webkit-border-radius:1em; border:1px solid; background:#ffe; color:#000; }
.groupbox a, .groupbox .button, .groupbox .tiddlyLinkExisting, .groupbox .tiddlyLinkNonExisting
	{ color:#009 !important; }
.groupbox code
	{ color:#333 !important; }
.borderleft
	{ margin:0;padding:0;border:0;margin-left:1em; border-left:1px dotted; padding-left:.5em; }
.borderright
	{ margin:0;padding:0;border:0;margin-right:1em; border-right:1px dotted; padding-right:.5em; }
.borderbottom
	{ margin:0;padding:1px 0;border:0;border-bottom:1px dotted; margin-bottom:1px; padding-bottom:1px; }
.bordertop
	{ margin:0;padding:0;border:0;border-top:1px dotted; margin-top:1px; padding-top:1px; }

/* scrolled content */
.scrollbars { overflow:auto; }
.height10em { height:10em; }
.height15em { height:15em; }
.height20em { height:20em; }
.height25em { height:25em; }
.height30em { height:30em; }
.height35em { height:35em; }
.height40em { height:40em; }

/* compact form */
.smallform
	{ white-space:nowrap; }
.smallform input, .smallform textarea, .smallform button, .smallform checkbox, .smallform radio, .smallform select
	{ font-size:8pt; }

/* stretchable edit fields and textareas (auto-size to fit tiddler) */
.stretch input { width:99%; }
.stretch textarea { width:99%; }

/* compact input fields (limited to a few characters for entering percentages and other small values) */
.onechar input   { width:1em; }
.twochar input   { width:2em; }
.threechar input { width:3em; }
.fourchar input  { width:4em; }
.fivechar input  { width:5em; }

/* text colors */
.white { color:#fff !important }
.gray  { color:#999 !important }
.black { color:#000 !important }
.red   { color:#f66 !important }
.green { color:#0c0 !important }
.blue  { color:#99f !important }

/* rollover highlighting */
.mouseover 
	{color:[[ColorPalette::TertiaryLight]] !important;}
.mouseover a
	{color:[[ColorPalette::TertiaryLight]] !important;}
.selected .mouseover
	{color:[[ColorPalette::Foreground]] !important;}
.selected .mouseover .button, .selected .mouseover a
	{color:[[ColorPalette::PrimaryDark]] !important;}

/* rollover zoom text */
.zoomover
	{ font-size:80% !important; }
.selected .zoomover
	{ font-size:100% !important; }

/* [[ColorPalette]] text colors */
.Background	{ color:[[ColorPalette::Background]];	 }
.Foreground	{ color:[[ColorPalette::Foreground]];	 }
.PrimaryPale	{ color:[[ColorPalette::PrimaryPale]];	 }
.PrimaryLight	{ color:[[ColorPalette::PrimaryLight]];	 }
.PrimaryMid	{ color:[[ColorPalette::PrimaryMid]];	 }
.PrimaryDark	{ color:[[ColorPalette::PrimaryDark]];	 }
.SecondaryPale	{ color:[[ColorPalette::SecondaryPale]]; }
.SecondaryLight	{ color:[[ColorPalette::SecondaryLight]];}
.SecondaryMid	{ color:[[ColorPalette::SecondaryMid]];	 }
.SecondaryDark	{ color:[[ColorPalette::SecondaryDark]]; }
.TertiaryPale	{ color:[[ColorPalette::TertiaryPale]];	 }
.TertiaryLight	{ color:[[ColorPalette::TertiaryLight]]; }
.TertiaryMid	{ color:[[ColorPalette::TertiaryMid]];	 }
.TertiaryDark	{ color:[[ColorPalette::TertiaryDark]];	 }
.Error		{ color:[[ColorPalette::Error]];	 }

/* [[ColorPalette]] background colors */
.BGBackground	  { background-color:[[ColorPalette::Background]];	}
.BGForeground	  { background-color:[[ColorPalette::Foreground]];	}
.BGPrimaryPale	  { background-color:[[ColorPalette::PrimaryPale]];	}
.BGPrimaryLight	  { background-color:[[ColorPalette::PrimaryLight]];	}
.BGPrimaryMid	  { background-color:[[ColorPalette::PrimaryMid]];	}
.BGPrimaryDark	  { background-color:[[ColorPalette::PrimaryDark]];	}
.BGSecondaryPale  { background-color:[[ColorPalette::SecondaryPale]]; 	}
.BGSecondaryLight { background-color:[[ColorPalette::SecondaryLight]];	}
.BGSecondaryMid	  { background-color:[[ColorPalette::SecondaryMid]];	}
.BGSecondaryDark  { background-color:[[ColorPalette::SecondaryDark]]; 	}
.BGTertiaryPale	  { background-color:[[ColorPalette::TertiaryPale]];	}
.BGTertiaryLight  { background-color:[[ColorPalette::TertiaryLight]]; 	}
.BGTertiaryMid	  { background-color:[[ColorPalette::TertiaryMid]];	}
.BGTertiaryDark	  { background-color:[[ColorPalette::TertiaryDark]];	}
.BGError	  { background-color:[[ColorPalette::Error]];	 	}
/*}}}*/
https://www.gnom-gnom.com/gluten-free-keto-cheesecake-brownies/

''Ingredients''
For Cheesecake Layer
* 227 g cream cheese softened
* 50-70 g erythritol
* 1 egg at room temperature
* 1 teaspoon vanilla extract
For Keto Brownie Layer
* 1 [[batch (suuuper fudgy!) keto brownies|Suuuper Fudgy Cocoa Brownie]]

''Instructions''
# Position a rack in the lower third of your oven and preheat to 350°F/180°C. Line with parchment paper the bottom and sides of a 8x8-inch baking pan. Set aside. 
# Make the cheesecake layer first. Add cream cheese and sweetener to a bowl and cream using an electric mixer (faster and easier) or whisk until creamy and smooth. Mix in the egg and vanilla extract until fully combined. Set aside. 
# Whip up a batch of our [[(suuuper fudgy!) keto brownies|Suuuper Fudgy Cocoa Brownie]]. Please note that your batter with xylitol and allulose will be thinner than with erythritrol (where you can add an extra egg or a couple tablespoons of almond milk to loosen up a bit for cleaner swirls!- see brownie post for more deets).
# Pour 2/3 of the mixture into prepared pan, followed by the cheesecake layer. Add the remaining brownie batter in 4 dollops (see pictures in post for reference), and swirl the two batters together using a knife. 
# Bake for 15-25 minutes (we do 23), or until the center is just set and still jiggly. This really does vary (a lot!!) from oven to oven (think convection etc), so give them a check from minute 15 the first time around. 
# Allow to cool completely on a rack. Lift brownies using the edges of the parchment paper and cut into desired size (we do 16!). To get extra clean edges, place in the freezer for 10 minutes prior to cutting. 
# Store in the fridge for 3 days and freeze for up to 3 months (they freeze great!).
https://www.gnom-gnom.com/fudgey-cocoa-paleo-keto-brownies/

''Ingredients''
* 130 g unsalted grass-fed butter
* 140-200 g powdered erythritol
* 80 g cocoa powder
* 1/2 teaspoon kosher salt
* 3 eggs at room temperature
* 70 g almond flour

''Instructions''
# Position a rack in the lower third of your oven and preheat to 350°F/180°C. Line with parchment paper the bottom and sides of a 8x8-inch baking pan. Set aside. 
# Add butter, sweetener, cocoa powder and salt to a medium heatproof bowl. Melt over a water bath whisking constantly (or use the microwave, in small increments). You'll want to heat it up until most of the sweetener has melted and the mixture is well incorporated (note that erythritol, unlike xylitol, won't dissolve much at this point). Remove from heat and allow the mixture to cool slightly.
# Add one egg at a time, whisking well after each one until completely incorporated. The texture should appear smooth, with all the sweetener dissolving into the mixture. And if using erythritol, and your batter ends up too thick, you may want to add an extra egg. Just be sure not to over-whisk, or your brownies could end up more cakey rather than fudgy. 
# Add the almond flour, whisking vigorously until fully blended (about a minute).
# Bake for 15-25 minutes (we do about 23 with xylitol and 17 with erythritol), or until the center is just set and a toothpick inserted in the center comes out moist. This really does vary (a lot!!) from oven to oven (think convection etc), so give them a check from minute 15 the first time around, and remember that you'll brownies will continue to cook while they cool. 
# Sprinkle with flakey sea salt (optional) and allow to cool completely on a rack. Lift brownies using the edges of the parchment paper and cut into desired size (we do 16!). To get extra clean edges, place in the freezer for 10 minutes prior to cutting. 
6 small Boneless Chicken Breasts
2 Eggs (Beaten)
1c. Crushed Pork Rinds
1/2c. Almond Flour
1/3c. Parmesan Cheese
2 tbsp. Olive Oil
1 tbsp. Coconut Oil
1 tsp.Freshly Ground Black Pepper
1tsp.

''Sweet & Sour Sauce''
1/2c. Erythritol
1/2c. Rice Vinegar
4 tbsp. Reduced Sugar Ketchup
1 tbsp. Soy Sauce
1 tsp. Garlic Powder


''Directions''
# Cube chicken into 1″ chunks.
# In a food processor, combine pork rinds, parmesan cheese, and almond flour. Grind until a meal-like substance is formed. Then, drip the chicken in the egg and coat in the pork rind mixture and set on a plate.
# Heat the oils in a cast iron skillet over medium heat. Once hot, add the chicken in (in small batches) and cook.
# In the meantime, combine all the sauce ingredients into a saucepan and whisk while it boils down.
# Once the chicken is cooked, remove from the pan and continue cooking the rest of your batches.
# In a bowl, pour the sauce over the chicken and mix together to coat.

''Notes''
4 Servings, Calories 157, Protein 29g., Carbohydrates 8g., Total Fat 25g., Cholesterol 20mg., Potassium
180mg., Sodium 5mg., Phosphorus 110mg., Sugar 0g.
<<timeline better:true firstDay:20140309>>
''Ingredients''
*1/2 cup chili powder
*1/4 cup onion powder
*1/8 cup ground cumin
*1 Tablespoon garlic powder
*1 Tablespoon paprika
*1 Tablespoon sea salt

''Directions''
Put all ingredients into a jar and shake!

We make Triple or more this recipes and use 2T. per pound of meat
Give all students an expiration date 6 months past enabled
{{{
UPDATE students SET expired_date = date(enabled_date + interval '6 months')
}}}

''Controlers''
----

ipn.php _renew_student
{{{
    if( strtotime($student->expired_date) > strtotime('now') ) { 
        // if expiration date is in the future then extend it out 6 months further
        $student->expired_date = date('Y-m-d', strtotime($student->expired_date.$this->config->item('sub_period')));
    } else {
        // if already expired, set expiration date to 6 months from today
        $student->expired_date = date('Y-m-d', strtotime($this->config->item('sub_period')));
    }
}}}

ipn.php _create_student
{{{
    $student->expired_date  = date('Y-m-d', strtotime($this->config->item('sub_period')));
}}}

teacherportal.php users_xls
{{{
    $sheet->getStyle("D1")->getFont()->setBold(true); $sheet->SetCellValue("E1", "Expires");
    $sheet->getColumnDimension("E")->setWidth(10);
        $sheet->SetCellValue("E{$row}", $u->expired_date );
}}}

teacherportal.php user
{{{
    $data['user']->expired_date = $_POST['expired_date'];
}}}

teacherportal.php ajax_create_user
{{{
    $student->expired_date = date('Y-m-d', strtotime($this->config->item('sub_period')));
}}}

site.php -- what to do on login for expired --

''Views''
----
studentportal/index.phtml (replace the index.js on line 3 with) (also create the ''indexd.js'' without the 'Send' and 'Reply' buttons)
{{{
<?php if( strtotime($this->student->expired_date) < strtotime('now') ): ?>
<script type="text/javascript" src="<?= site_url('application/views/studentportal/indexd.js') ?>"></script>
<?php else: ?>
<script type="text/javascript" src="<?= site_url('application/views/studentportal/index.js') ?>"></script>
<?php endif; ?>
}}}


studentportal/myaccount.phtml
{{{
    <br/>
<?php if( strtotime($this->student->expired_date) > strtotime('now') ) { 
       echo "Expires: ".$this->student->expired_date;
    } else {
       echo "Expired: ".$this->student->expired_date;
    } ?>$this->student->expired_date
?>
}}}

teachreportal/student.phtml (after enabled)
{{{
        <tr>
            <td>Expires<br/></td>
            <td><input type="text" id="datepicker" name="expired_date" value="<?= htmlspecialchars($user->expired_date) ?>"/>
            <script>$(function() { $("#datepicker").datepicker({dateFormat: 'yy-mm-dd'}); });  </script>
        </td>
}}}

teachreportal/students.phtml (last column)
{{{
        <th>Expires</th>
        <td><?= htmlspecialchars($user->expired_date) ?></td>

}}}


''PayPal''
----
http://stackoverflow.com/questions/18686044/setup-a-chained-payment-on-paypal-with-php
http://stackoverflow.com/questions/12017228/how-can-i-implement-paypal-chained-payment-with-php
https://developer.paypal.com/webapps/developer/docs/classic/adaptive-payments/integration-guide/APIntro/
https://github.com/paypal/codesamples-php/tree/master/AdaptivePayments/sample/code
http://www.thecrowned.org/tutorial-paypal-adaptive-payments-api-embedded
1c. Homemade Mayo
1/4c. Dill Relish
1 T. Minced Onion
1/2T. -1 T. Dried Dill
1 - 2T. Lemon Juice(To taste)
Salt and Pepper ( To Taste)

Mix all ingredients together and store in fridge for 1 month.
[[Six TED Talks that can change your career|http://www.networkworld.com/article/2878352/careers/six-ted-talks-that-can-change-your-career.html?nsdr=true]]
# [[Your Body Language Shapes Who You Are|http://www.ted.com/talks/amy_cuddy_your_body_language_shapes_who_you_are?language=en]]
# [[How to Build Creative Confidence|http://www.ted.com/talks/david_kelley_how_to_build_your_creative_confidence?language=en#t-371111]] [[Here are Dinsmore’s other recommendations|http://liveyourlegend.net/the-14-most-powerful-ted-talks-for-disruptive-career-change/]]
# [[The Key to Success? Grit|http://www.ted.com/talks/angela_lee_duckworth_the_key_to_success_grit?language=en]]
# [[The Puzzle of Motivation|http://www.ted.com/talks/dan_pink_on_motivation]]
# [[The Career Advice You Probably Didn’t Get|http://www.ted.com/talks/susan_colantuono_the_career_advice_you_probably_didn_t_get#t-152949]]
# [[The Happy Secret to Better Work|http://www.ted.com/playlists/60/work_smarter]]
This is a test
https://www.wholesomeyum.com/best-fudgy-keto-brownies-recipe/ has video

''Ingredients''
* 1/2 cup Butter
* 4 oz Unsweetened baking chocolate
* 3/4 cup Blanched almond flour
* 2/3 cup Powdered erythritol
* 2 tbsp Cocoa powder
* 2 large Eggs (at room temperature)
* 1 tsp Vanilla extract (optional)
* 1/4 tsp Sea salt (only if using unsalted butter)
* 1/4 cup Walnuts (optional, chopped)

''Instructions''
# Preheat the oven to 350 degrees F (177 degrees C). Line an 8x8 in (20x20 cm) pan with parchment paper, with the edges of the paper over the sides.
# Melt the butter and chocolate together in a double boiler, stirring occasionally, until smooth. Remove from heat.
# Stir in the vanilla extract.
# Add the almond flour, powdered erythritol, cocoa powder, sea salt, and eggs. Stir together until uniform. The batter will be a little grainy looking.
# Transfer the batter to the lined pan. Smooth the top with a spatula or the back of a spoon. If desired, sprinkle with chopped walnuts and press into the top.
# Bake for about 13-18 minutes, until an inserted toothpick comes out almost clean with just a little batter on it that balls up between your fingers. (Do NOT wait for it to come out totally clean, and don't worry about any butter pooled on top - just watch the actual brownie part to be super soft but not fluid.)
# Cool completely before moving or cutting. There may be some butter pooled on top - do not drain it, it will absorb back in after cooling.
This recipe went viral when we posted it on our fan page on Face Book. Here's why - as its name suggests, this drink helps shrink your fat cells. The combined thermogenic boosting ingredients promote energy and speed up your metabolism. But you'll want to drink this simply because it tastes good! The Shrinker is not a meal replacement, keep up your regular THM meals and snacks but it is designed to be sipped between set times of eating. It helps resist the urge to graze, scarf or oversnack.

''Ingredients''
* 4 Oolong tea bags
* 1/2 cup Unsweetened Almond Milk
* 1-2 tsp. vanilla extract
* 1/2-1 tsp. cinnamon powder
* 1-2 pinches of cayenne pepper
* 1-2 generous pinches of Celtic sea salt
* 3 or 4 scoops of stevia powder.
* Ice and water
''Instructions''
# Boil enough water to fill a large coffee mug (about 12 oz.) in which you will steep 4 Oolong tea bags until water is cool."
# Once cool, pour this tea into a blender along with unsweetened Almond milk, Celtic sea salt, vanilla, stevia, cinnamon and cayenne pepper. This is your SHRINKER concentrate. 
# Blend well.
# Pour the blended concentrate into a glass, 2 quart size canning jar and fill to the top with ice. If you don't have a 2 quarter, we recommend you get one as it is fun having your day's quota of deliciousness in one huge jar. But you can split y;our concentrate between tow quart size canning jars. 
# Add enough water to concentrate and ice to make the liquid reach the top of the jar.
# Put a lid on the jar, shake well then taste and adjust flavors. Own it!!!!! What do you need to add so it knocks your socks off!! More stevia? More vanilla? Serene says, "I usually add more hot pepper because I like it to burn and make me feel like a feisty tiger!"
[img[images/thousandislanddressingmix.jpg]]
''Ingredients''
*1 cup mayonnaise ( I use Homemade)
*1/3 cup ketchup (I use Homemade)
*1/4 cup pickle relish( Make sure it has no carbs in it or corn syrup)
*1 Tablespoon minced onion
*--1 hard boiled egg, chopped (optional)--

''Directions''
*Mix ingredients
*Cover and chill
''Ingredients''
2 lbs broccoli florets
3 tbsp olive oil
sea salt and pepper
10 oz ham steak, cubed
1/2 cup heavy cream
1/4 cup chicken stock (Get it here)
2 cups sharp cheddar cheese, shredded, divided
1 cup mozzarella cheese, shredded
4 oz cream cheese
2 cloves garlic, minced

''Instructions''
# Preheat oven to 400°
# Layer broccoli in a large casserole dish. Drizzle with olive oil and sprinkle with a little salt and pepper.
# Roast broccoli for 15-20 minutes.
# While the broccoli is roasting, combine heavy cream, chicken stock, 1 cup cheddar cheese, mozzarella cheese, cream cheese and garlic in a medium sauce pan over medium-low heat. Stir frequently.
# Once the broccoli is done, top with cubed ham. Pour cheese sauce over top and mix everything together.
# Sprinkle remaining 1 cup of cheddar cheese over top.
# Bake for an additional 15 minutes.

''Notes''
Per Serving - Calories - 338 Protein - 21g Fat - 26g Total Carbs - 7.75 Fiber - 2.5g Net Carbs - 5.25g
/***
Description: Contains the stuff you need to use Tiddlyspot
Note, you also need UploadPlugin, PasswordOptionPlugin and LoadRemoteFileThroughProxy
from http://tiddlywiki.bidix.info for a complete working Tiddlyspot site.
***/
//{{{

// edit this if you are migrating sites or retrofitting an existing TW
config.tiddlyspotSiteId = 'keto';

// make it so you can by default see edit controls via http
config.options.chkHttpReadOnly = false;
window.readOnly = false; // make sure of it (for tw 2.2)
window.showBackstage = true; // show backstage too

// disable autosave in d3
if (window.location.protocol != "file:")
	config.options.chkGTDLazyAutoSave = false;

// tweak shadow tiddlers to add upload button, password entry box etc
with (config.shadowTiddlers) {
	SiteUrl = 'http://wiki.elder-geek.net'+config.tiddlyspotSiteId;
	SideBarOptions = SideBarOptions.replace(/(<<saveChanges>>)/,"$1<<tiddler TspotSidebar>>");
	OptionsPanel = OptionsPanel.replace(/^/,"<<tiddler TspotOptions>>");
	DefaultTiddlers = DefaultTiddlers.replace(/^/,"[[WelcomeToTiddlyspot]] ");
	MainMenu = MainMenu.replace(/^/,"[[WelcomeToTiddlyspot]] ");
}

// create some shadow tiddler content
merge(config.shadowTiddlers,{

'TspotOptions':[
 "tiddlyspot password:",
 "<<option pasUploadPassword>>",
 ""
].join("\n"),

'TspotControls':[
 "| tiddlyspot password:|<<option pasUploadPassword>>|",
 "| site management:|<<upload http://wiki.elder-geek.net/" + config.tiddlyspotSiteId + "/store.php index.html . .  " + config.tiddlyspotSiteId + ">>//(requires tiddlyspot password)//<br>[[control panel|http://wiki.elder-geek.net/" + config.tiddlyspotSiteId + "/controlpanel]], [[download (go offline)|http://wiki.elder-geek.net/" + config.tiddlyspotSiteId + "/download]]|",
 "| links:|[[tiddlyspot.com|http://tiddlyspot.com/]], [[FAQs|http://faq.tiddlyspot.com/]], [[blog|http://tiddlyspot.blogspot.com/]], email [[support|mailto:support@tiddlyspot.com]] & [[feedback|mailto:feedback@tiddlyspot.com]], [[donate|http://tiddlyspot.com/?page=donate]]|"
].join("\n"),

'WelcomeToTiddlyspot':[
 "This document is a ~TiddlyWiki from tiddlyspot.com.  A ~TiddlyWiki is an electronic notebook that is great for managing todo lists, personal information, and all sorts of things.",
 "",
 "@@font-weight:bold;font-size:1.3em;color:#444; //What now?// &nbsp;&nbsp;@@ Before you can save any changes, you need to enter your password in the form below.  Then configure privacy and other site settings at your [[control panel|http://wiki.elder-geek.net/" + config.tiddlyspotSiteId + "/controlpanel]] (your control panel username is //" + config.tiddlyspotSiteId + "//).",
 "<<tiddler TspotControls>>",
 "See also GettingStarted.",
 "",
 "@@font-weight:bold;font-size:1.3em;color:#444; //Working online// &nbsp;&nbsp;@@ You can edit this ~TiddlyWiki right now, and save your changes using the \"save to web\" button in the column on the right.",
 "",
 "@@font-weight:bold;font-size:1.3em;color:#444; //Working offline// &nbsp;&nbsp;@@ A fully functioning copy of this ~TiddlyWiki can be saved onto your hard drive or USB stick.  You can make changes and save them locally without being connected to the Internet.  When you're ready to sync up again, just click \"upload\" and your ~TiddlyWiki will be saved back to tiddlyspot.com.",
 "",
 "@@font-weight:bold;font-size:1.3em;color:#444; //Help!// &nbsp;&nbsp;@@ Find out more about ~TiddlyWiki at [[TiddlyWiki.com|http://tiddlywiki.com]].  Also visit [[TiddlyWiki.org|http://tiddlywiki.org]] for documentation on learning and using ~TiddlyWiki. New users are especially welcome on the [[TiddlyWiki mailing list|http://groups.google.com/group/TiddlyWiki]], which is an excellent place to ask questions and get help.  If you have a tiddlyspot related problem email [[tiddlyspot support|mailto:support@tiddlyspot.com]].",
 "",
 "@@font-weight:bold;font-size:1.3em;color:#444; //Enjoy :)// &nbsp;&nbsp;@@ We hope you like using your tiddlyspot.com site.  Please email [[feedback@tiddlyspot.com|mailto:feedback@tiddlyspot.com]] with any comments or suggestions."
].join("\n"),

'TspotSidebar':[
 "<<upload http://wiki.elder-geek.net/" + config.tiddlyspotSiteId + "/store.php index.html . .  " + config.tiddlyspotSiteId + ">><html><a href='http://wiki.elder-geek.net/" + config.tiddlyspotSiteId + "/download' class='button'>download</a></html>"
].join("\n")

});
//}}}
''Ingredients''
* 1 1/2 cups grated mozzarella (fresh is best)
* 3 Tablespoons cream cheese
* 1 egg
* 2/3 cup almond meal
* 1/2 teaspoon dried oregano
* 1/2 teaspoon dried basil
* 1/2 teaspoon garlic salt

''Directions''
* Place mozzarella & cream cheese in a medium-size microwaveable bowl
* Microwave for 1 minute, stir and then another 30 sec, stir, this will be very hot
* Stir in egg, almond flour, garlic powder, and Italian seasoning
* Wet hands and spread “dough” thin on parchment paper. It should spread evenly with dough-like consistency (if
“stringy” then your cheese has hardened too much—just put it back in the microwave for maybe another 20
seconds)
* Dock (poke rows of holes) with a fork to avoid bubbling
* Sprinkle with garlic salt
* Put in a 425-degree oven
* After about 8 minutes, check it and poke holes where any large bubbles may be
* Continue cooking for a total 12-14 min, or until slightly brown on top
* Add toppings to crust. Put back in oven until cheese is bubbly

Prep Time 15 minutes
Cook Time 20 minutes
Total Time 35 minutes
Servings 4 -8
http://ketodietapp.com/Blog/post/2014/11/12/Ultimate-Keto-Buns

Dry ingredients:

*    1 ½ cup almond flour (almond meal) (150 g / 5.3 oz)
*    ⅔ cup psyllium husks - will be powdered, or ⅓ cup psyllium husk powder (40 g / 1.4 oz)
*    ½ cup coconut flour (60 g / 2.1 oz)
*    ½ cup flaxmeal (75 g / 2.6 oz) - or use more almond flour instead
*    2 tsp garlic powder
*    2 tsp onion powder
*    2 tsp cream of tartar
*    1 tsp baking soda
*    1 tsp salt (pink Himalayan or sea salt)
*    5 tbsp sesame seeds (or sunflower, flax, poppy seeds) or 1-2 tbsp caraway seeds
*    Optional: 2 tbsp Erythritol (20g / 0.7 oz)

Wet ingredients:

*    6 large egg whites
*   2 large eggs
*   2 cups water, boiling or lukewarm depending on the method - see intro (480 ml / 16 fl oz)

Make sure you use a kitchen scale for measuring all the dry ingredients. Using just cups may not be enough to achieve best results, especially in baked goods. Weights per cups and tablespoons may vary depending on the product/ brand or if you make you own ingredients (like flaxmeal from flaxseeds). Psyllium absorbs lots of water. When baking with psyllium, you must remember to drink enough water throughout the day to prevent constipation!

# Preheat the oven to 350 F / 175 C. Use scales to measure all the ingredients carefully.
# Mix all the dry ingredients apart from the sesame seeds in a bowl (almond flour, coconut flour, ground flaxseed, psyllium powder, garlic and onion powder, Erythritol, baking soda, cream of tartar and salt).
# Add the egg whites and eggs and process well using a mixer until the dough is thick. Add boiling water and mix until well combined.
# Using a spoon, make the buns and place them on a non-stick baking tray or a parchment paper. They will grow in size, so make sure to leave some space between them. You can even use small tart trays. Top each of the buns with sesame seeds (or any other seeds) and press them into the dough, so they don't fall out. Place in the oven and cook for 45-50 minutes. 
# Remove from the oven, let the tray cool down and place the buns on a rack to cool down to room temperature. Store them at room temperature if you plan to use them in the next couple of days or store in the freezer for future use. 

Tips & substitutions:

* ''If making a loaf instead of buns, bake for 75 minutes! Do not use a silicon loaf pan - use a metallic one instead.''
* flax-free, multi-purpose bread, includes a nut-free option.
* nut-free keto buns - include flaxmeal
* psyllium-free buns - include flaxmeal and nuts.
* if you don't want to use coconut flour: Although I haven't tried it, I'd use twice the amount of almond flour or flaxmeal instead of coconut flour (1 cup of almond flour / flaxmeal instead of ½ cup coconut flour). Or you can use the same amount but reduce the water by ~ ½ cup

https://www.fatforweightloss.com.au/ultimate-keto-brownies/

''Ingredients''
* 2/3 cup almond flour
* 1/4 cup cocoa powder
* 1/2 tsp xanthan gum
* 1/2 tsp salt
* 1 tsp instant espresso
* 1 tsp baking powder
* 1 block sugar free dark chocolate 100g / 3.5 oz
* 1/2 cup butter unsalted, melted
* 3 large eggs
* 1 tsp Vanilla Extract
*1 cup Erythritol (SoNourished)

''Instructions''
# Preheat your oven to 180C (350F)
# In a mixing bowl, sift together the almond flour, cocoa powder, xanthan gum, salt, espresso powder and baking powder. Mix until it is uniform in colour.
# In a separate bowl, whisk together the eggs, vanilla extract and erythrtiol until well combined. Set aside.
# Next, in another bowl, melt the butter either for 90 seconds in the microwave or over a pot of boiling water (double boiler). It needs to be hot.
# Cut up the dark chocolate, and place the chopped pieces into the hot butter. Let this sit for 5 minutes, then stir with a spoon. The mixture will become like molten chocolate
# Slowly combine the almond flour mixture and the butter mixture into the erythrtiol and egg mixture. Do this slowly, otherwise your brownie mixture will turn solid, and not liquid.
# Pour into a 22cm X 22cm baking tin (8.5" X 8.5") lined with parchment paper. Bake in the oven for 20 minutes, remove and let cool
# Slice 4 lengths width ways and length ways to make 16 brownies. Store in the fridge for up to 5 days, or freeze for up to 1 month.

''Cream Cheese Keto Brownies''
If you wanted to add cream cheese to these brownies to make them suuuuuuper fudge town, then I suggest the following substitutions:
* Add 1/4 cup of cream cheese to the mixture, and reduce the butter by 1/2 (please ensure you use xanthan gum in this instance
* Add 1/4 cup cream cheese to the mixture, without altering the recipe otherwise (super fudge town).
| !date | !user | !location | !storeUrl | !uploadDir | !toFilename | !backupdir | !origin |
| 09/06/2024 10:59:56 | YourName | [[/|https://wiki.elder-geek.net/keto/]] | [[store.php|http://wiki.elder-geek.net/keto/store.php]] | . | [[index.html | http://wiki.elder-geek.net/keto/index.html]] | . | failed |
| 09/06/2024 11:00:46 | FredW | [[/|https://wiki.elder-geek.net/keto/]] | [[store.php|https://wiki.elder-geek.net/keto/store.php]] | . | [[index.html | https://wiki.elder-geek.net/keto/index.html]] |  | failed |
| 09/06/2024 11:00:57 | FredW | [[/|https://wiki.elder-geek.net/keto/]] | [[store.php|https://wiki.elder-geek.net/keto/store.php]] | . | [[index.html | https://wiki.elder-geek.net/keto/index.html]] |  |
| 09/06/2024 11:01:44 | FredW | [[/|https://wiki.elder-geek.net/keto/]] | [[store.php|http://wiki.elder-geek.net/keto/store.php]] | . | [[index.html | http://wiki.elder-geek.net/keto/index.html]] | . | failed |
| 09/06/2024 11:03:28 | FredW | [[/|https://wiki.elder-geek.net/keto/]] | [[store.php|http://wiki.elder-geek.net/keto/store.php]] | . | [[index.html | http://wiki.elder-geek.net/keto/index.html]] | . | failed |
| 09/06/2024 11:03:40 | FredW | [[/|https://wiki.elder-geek.net/keto/]] | [[store.php|http://wiki.elder-geek.net/keto/store.php]] | . | [[index.html | http://wiki.elder-geek.net/keto/index.html]] |  | failed |
| 09/06/2024 11:03:50 | FredW | [[/|https://wiki.elder-geek.net/keto/]] | [[store.php|http://wiki.elder-geek.net/keto/store.php]] | . | [[index.html | http://wiki.elder-geek.net/keto/index.html]] |  | failed |
| 09/06/2024 11:04:01 | FredW | [[/|https://wiki.elder-geek.net/keto/]] | [[store.php|https://wiki.elder-geek.net/keto/store.php]] | . | [[index.html | https://wiki.elder-geek.net/keto/index.html]] |  | ok |
| 09/06/2024 11:04:09 | FredW | [[/|https://wiki.elder-geek.net/keto/]] | [[store.php|http://wiki.elder-geek.net/keto/store.php]] | . | [[index.html | http://wiki.elder-geek.net/keto/index.html]] | . | failed |
| 09/06/2024 11:04:18 | FredW | [[/|https://wiki.elder-geek.net/keto/]] | [[store.php|https://wiki.elder-geek.net/keto/store.php]] | . | [[index.html | https://wiki.elder-geek.net/keto/index.html]] |  |
/***
|''Name:''|UploadPlugin|
|''Description:''|Save to web a TiddlyWiki|
|''Version:''|4.1.3|
|''Date:''|Feb 24, 2008|
|''Source:''|http://tiddlywiki.bidix.info/#UploadPlugin|
|''Documentation:''|http://tiddlywiki.bidix.info/#UploadPluginDoc|
|''Author:''|BidiX (BidiX (at) bidix (dot) info)|
|''License:''|[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D ]]|
|''~CoreVersion:''|2.2.0|
|''Requires:''|PasswordOptionPlugin|
***/
//{{{
version.extensions.UploadPlugin = {
	major: 4, minor: 1, revision: 3,
	date: new Date("Feb 24, 2008"),
	source: 'http://tiddlywiki.bidix.info/#UploadPlugin',
	author: 'BidiX (BidiX (at) bidix (dot) info',
	coreVersion: '2.2.0'
};

//
// Environment
//

if (!window.bidix) window.bidix = {}; // bidix namespace
bidix.debugMode = false;	// true to activate both in Plugin and UploadService
	
//
// Upload Macro
//

config.macros.upload = {
// default values
	defaultBackupDir: '',	//no backup
	defaultStoreScript: "store.php",
	defaultToFilename: "index.html",
	defaultUploadDir: ".",
	authenticateUser: true	// UploadService Authenticate User
};
	
config.macros.upload.label = {
	promptOption: "Save and Upload this TiddlyWiki with UploadOptions",
	promptParamMacro: "Save and Upload this TiddlyWiki in %0",
	saveLabel: "save to web", 
	saveToDisk: "save to disk",
	uploadLabel: "upload"	
};

config.macros.upload.messages = {
	noStoreUrl: "No store URL in parmeters or options",
	usernameOrPasswordMissing: "Username or password missing"
};

config.macros.upload.handler = function(place,macroName,params) {
	if (readOnly)
		return;
	var label;
	if (document.location.toString().substr(0,4) == "http") 
		label = this.label.saveLabel;
	else
		label = this.label.uploadLabel;
	var prompt;
	if (params[0]) {
		prompt = this.label.promptParamMacro.toString().format([this.destFile(params[0], 
			(params[1] ? params[1]:bidix.basename(window.location.toString())), params[3])]);
	} else {
		prompt = this.label.promptOption;
	}
	createTiddlyButton(place, label, prompt, function() {config.macros.upload.action(params);}, null, null, this.accessKey);
};

config.macros.upload.action = function(params)
{
		// for missing macro parameter set value from options
		if (!params) params = {};
		var storeUrl = params[0] ? params[0] : config.options.txtUploadStoreUrl;
		var toFilename = params[1] ? params[1] : config.options.txtUploadFilename;
		var backupDir = params[2] ? params[2] : config.options.txtUploadBackupDir;
		var uploadDir = params[3] ? params[3] : config.options.txtUploadDir;
		var username = params[4] ? params[4] : config.options.txtUploadUserName;
		var password = config.options.pasUploadPassword; // for security reason no password as macro parameter	
		// for still missing parameter set default value
		if ((!storeUrl) && (document.location.toString().substr(0,4) == "http")) 
			storeUrl = bidix.dirname(document.location.toString())+'/'+config.macros.upload.defaultStoreScript;
		if (storeUrl.substr(0,4) != "http")
			storeUrl = bidix.dirname(document.location.toString()) +'/'+ storeUrl;
		if (!toFilename)
			toFilename = bidix.basename(window.location.toString());
		if (!toFilename)
			toFilename = config.macros.upload.defaultToFilename;
		if (!uploadDir)
			uploadDir = config.macros.upload.defaultUploadDir;
		if (!backupDir)
			backupDir = config.macros.upload.defaultBackupDir;
		// report error if still missing
		if (!storeUrl) {
			alert(config.macros.upload.messages.noStoreUrl);
			clearMessage();
			return false;
		}
		if (config.macros.upload.authenticateUser && (!username || !password)) {
			alert(config.macros.upload.messages.usernameOrPasswordMissing);
			clearMessage();
			return false;
		}
		bidix.upload.uploadChanges(false,null,storeUrl, toFilename, uploadDir, backupDir, username, password); 
		return false; 
};

config.macros.upload.destFile = function(storeUrl, toFilename, uploadDir) 
{
	if (!storeUrl)
		return null;
		var dest = bidix.dirname(storeUrl);
		if (uploadDir && uploadDir != '.')
			dest = dest + '/' + uploadDir;
		dest = dest + '/' + toFilename;
	return dest;
};

//
// uploadOptions Macro
//

config.macros.uploadOptions = {
	handler: function(place,macroName,params) {
		var wizard = new Wizard();
		wizard.createWizard(place,this.wizardTitle);
		wizard.addStep(this.step1Title,this.step1Html);
		var markList = wizard.getElement("markList");
		var listWrapper = document.createElement("div");
		markList.parentNode.insertBefore(listWrapper,markList);
		wizard.setValue("listWrapper",listWrapper);
		this.refreshOptions(listWrapper,false);
		var uploadCaption;
		if (document.location.toString().substr(0,4) == "http") 
			uploadCaption = config.macros.upload.label.saveLabel;
		else
			uploadCaption = config.macros.upload.label.uploadLabel;
		
		wizard.setButtons([
				{caption: uploadCaption, tooltip: config.macros.upload.label.promptOption, 
					onClick: config.macros.upload.action},
				{caption: this.cancelButton, tooltip: this.cancelButtonPrompt, onClick: this.onCancel}
				
			]);
	},
	options: [
		"txtUploadUserName",
		"pasUploadPassword",
		"txtUploadStoreUrl",
		"txtUploadDir",
		"txtUploadFilename",
		"txtUploadBackupDir",
		"chkUploadLog",
		"txtUploadLogMaxLine"		
	],
	refreshOptions: function(listWrapper) {
		var opts = [];
		for(i=0; i<this.options.length; i++) {
			var opt = {};
			opts.push();
			opt.option = "";
			n = this.options[i];
			opt.name = n;
			opt.lowlight = !config.optionsDesc[n];
			opt.description = opt.lowlight ? this.unknownDescription : config.optionsDesc[n];
			opts.push(opt);
		}
		var listview = ListView.create(listWrapper,opts,this.listViewTemplate);
		for(n=0; n<opts.length; n++) {
			var type = opts[n].name.substr(0,3);
			var h = config.macros.option.types[type];
			if (h && h.create) {
				h.create(opts[n].colElements['option'],type,opts[n].name,opts[n].name,"no");
			}
		}
		
	},
	onCancel: function(e)
	{
		backstage.switchTab(null);
		return false;
	},
	
	wizardTitle: "Upload with options",
	step1Title: "These options are saved in cookies in your browser",
	step1Html: "<input type='hidden' name='markList'></input><br>",
	cancelButton: "Cancel",
	cancelButtonPrompt: "Cancel prompt",
	listViewTemplate: {
		columns: [
			{name: 'Description', field: 'description', title: "Description", type: 'WikiText'},
			{name: 'Option', field: 'option', title: "Option", type: 'String'},
			{name: 'Name', field: 'name', title: "Name", type: 'String'}
			],
		rowClasses: [
			{className: 'lowlight', field: 'lowlight'} 
			]}
};

//
// upload functions
//

if (!bidix.upload) bidix.upload = {};

if (!bidix.upload.messages) bidix.upload.messages = {
	//from saving
	invalidFileError: "The original file '%0' does not appear to be a valid TiddlyWiki",
	backupSaved: "Backup saved",
	backupFailed: "Failed to upload backup file",
	rssSaved: "RSS feed uploaded",
	rssFailed: "Failed to upload RSS feed file",
	emptySaved: "Empty template uploaded",
	emptyFailed: "Failed to upload empty template file",
	mainSaved: "Main TiddlyWiki file uploaded",
	mainFailed: "Failed to upload main TiddlyWiki file. Your changes have not been saved",
	//specific upload
	loadOriginalHttpPostError: "Can't get original file",
	aboutToSaveOnHttpPost: 'About to upload on %0 ...',
	storePhpNotFound: "The store script '%0' was not found."
};

bidix.upload.uploadChanges = function(onlyIfDirty,tiddlers,storeUrl,toFilename,uploadDir,backupDir,username,password)
{
	var callback = function(status,uploadParams,original,url,xhr) {
		if (!status) {
			displayMessage(bidix.upload.messages.loadOriginalHttpPostError);
			return;
		}
		if (bidix.debugMode) 
			alert(original.substr(0,500)+"\n...");
		// Locate the storeArea div's 
		var posDiv = locateStoreArea(original);
		if((posDiv[0] == -1) || (posDiv[1] == -1)) {
			alert(config.messages.invalidFileError.format([localPath]));
			return;
		}
		bidix.upload.uploadRss(uploadParams,original,posDiv);
	};
	
	if(onlyIfDirty && !store.isDirty())
		return;
	clearMessage();
	// save on localdisk ?
	if (document.location.toString().substr(0,4) == "file") {
		var path = document.location.toString();
		var localPath = getLocalPath(path);
		saveChanges();
	}
	// get original
	var uploadParams = new Array(storeUrl,toFilename,uploadDir,backupDir,username,password);
	var originalPath = document.location.toString();
	// If url is a directory : add index.html
	if (originalPath.charAt(originalPath.length-1) == "/")
		originalPath = originalPath + "index.html";
	var dest = config.macros.upload.destFile(storeUrl,toFilename,uploadDir);
	var log = new bidix.UploadLog();
	log.startUpload(storeUrl, dest, uploadDir,  backupDir);
	displayMessage(bidix.upload.messages.aboutToSaveOnHttpPost.format([dest]));
	if (bidix.debugMode) 
		alert("about to execute Http - GET on "+originalPath);
	var r = doHttp("GET",originalPath,null,null,username,password,callback,uploadParams,null);
	if (typeof r == "string")
		displayMessage(r);
	return r;
};

bidix.upload.uploadRss = function(uploadParams,original,posDiv) 
{
	var callback = function(status,params,responseText,url,xhr) {
		if(status) {
			var destfile = responseText.substring(responseText.indexOf("destfile:")+9,responseText.indexOf("\n", responseText.indexOf("destfile:")));
			displayMessage(bidix.upload.messages.rssSaved,bidix.dirname(url)+'/'+destfile);
			bidix.upload.uploadMain(params[0],params[1],params[2]);
		} else {
			displayMessage(bidix.upload.messages.rssFailed);			
		}
	};
	// do uploadRss
	if(config.options.chkGenerateAnRssFeed) {
		var rssPath = uploadParams[1].substr(0,uploadParams[1].lastIndexOf(".")) + ".xml";
		var rssUploadParams = new Array(uploadParams[0],rssPath,uploadParams[2],'',uploadParams[4],uploadParams[5]);
		var rssString = generateRss();
		// no UnicodeToUTF8 conversion needed when location is "file" !!!
		if (document.location.toString().substr(0,4) != "file")
			rssString = convertUnicodeToUTF8(rssString);	
		bidix.upload.httpUpload(rssUploadParams,rssString,callback,Array(uploadParams,original,posDiv));
	} else {
		bidix.upload.uploadMain(uploadParams,original,posDiv);
	}
};

bidix.upload.uploadMain = function(uploadParams,original,posDiv) 
{
	var callback = function(status,params,responseText,url,xhr) {
		var log = new bidix.UploadLog();
		if(status) {
			// if backupDir specified
			if ((params[3]) && (responseText.indexOf("backupfile:") > -1))  {
				var backupfile = responseText.substring(responseText.indexOf("backupfile:")+11,responseText.indexOf("\n", responseText.indexOf("backupfile:")));
				displayMessage(bidix.upload.messages.backupSaved,bidix.dirname(url)+'/'+backupfile);
			}
			var destfile = responseText.substring(responseText.indexOf("destfile:")+9,responseText.indexOf("\n", responseText.indexOf("destfile:")));
			displayMessage(bidix.upload.messages.mainSaved,bidix.dirname(url)+'/'+destfile);
			store.setDirty(false);
			log.endUpload("ok");
		} else {
			alert(bidix.upload.messages.mainFailed);
			displayMessage(bidix.upload.messages.mainFailed);
			log.endUpload("failed");			
		}
	};
	// do uploadMain
	var revised = bidix.upload.updateOriginal(original,posDiv);
	bidix.upload.httpUpload(uploadParams,revised,callback,uploadParams);
};

bidix.upload.httpUpload = function(uploadParams,data,callback,params)
{
	var localCallback = function(status,params,responseText,url,xhr) {
		url = (url.indexOf("nocache=") < 0 ? url : url.substring(0,url.indexOf("nocache=")-1));
		if (xhr.status == 404)
			alert(bidix.upload.messages.storePhpNotFound.format([url]));
		if ((bidix.debugMode) || (responseText.indexOf("Debug mode") >= 0 )) {
			alert(responseText);
			if (responseText.indexOf("Debug mode") >= 0 )
				responseText = responseText.substring(responseText.indexOf("\n\n")+2);
		} else if (responseText.charAt(0) != '0') 
			alert(responseText);
		if (responseText.charAt(0) != '0')
			status = null;
		callback(status,params,responseText,url,xhr);
	};
	// do httpUpload
	var boundary = "---------------------------"+"AaB03x";	
	var uploadFormName = "UploadPlugin";
	// compose headers data
	var sheader = "";
	sheader += "--" + boundary + "\r\nContent-disposition: form-data; name=\"";
	sheader += uploadFormName +"\"\r\n\r\n";
	sheader += "backupDir="+uploadParams[3] +
				";user=" + uploadParams[4] +
				";password=" + uploadParams[5] +
				";uploaddir=" + uploadParams[2];
	if (bidix.debugMode)
		sheader += ";debug=1";
	sheader += ";;\r\n"; 
	sheader += "\r\n" + "--" + boundary + "\r\n";
	sheader += "Content-disposition: form-data; name=\"userfile\"; filename=\""+uploadParams[1]+"\"\r\n";
	sheader += "Content-Type: text/html;charset=UTF-8" + "\r\n";
	sheader += "Content-Length: " + data.length + "\r\n\r\n";
	// compose trailer data
	var strailer = new String();
	strailer = "\r\n--" + boundary + "--\r\n";
	data = sheader + data + strailer;
	if (bidix.debugMode) alert("about to execute Http - POST on "+uploadParams[0]+"\n with \n"+data.substr(0,500)+ " ... ");
	var r = doHttp("POST",uploadParams[0],data,"multipart/form-data; ;charset=UTF-8; boundary="+boundary,uploadParams[4],uploadParams[5],localCallback,params,null);
	if (typeof r == "string")
		displayMessage(r);
	return r;
};

// same as Saving's updateOriginal but without convertUnicodeToUTF8 calls
bidix.upload.updateOriginal = function(original, posDiv)
{
	if (!posDiv)
		posDiv = locateStoreArea(original);
	if((posDiv[0] == -1) || (posDiv[1] == -1)) {
		alert(config.messages.invalidFileError.format([localPath]));
		return;
	}
	var revised = original.substr(0,posDiv[0] + startSaveArea.length) + "\n" +
				store.allTiddlersAsHtml() + "\n" +
				original.substr(posDiv[1]);
	var newSiteTitle = getPageTitle().htmlEncode();
	revised = revised.replaceChunk("<title"+">","</title"+">"," " + newSiteTitle + " ");
	revised = updateMarkupBlock(revised,"PRE-HEAD","MarkupPreHead");
	revised = updateMarkupBlock(revised,"POST-HEAD","MarkupPostHead");
	revised = updateMarkupBlock(revised,"PRE-BODY","MarkupPreBody");
	revised = updateMarkupBlock(revised,"POST-SCRIPT","MarkupPostBody");
	return revised;
};

//
// UploadLog
// 
// config.options.chkUploadLog :
//		false : no logging
//		true : logging
// config.options.txtUploadLogMaxLine :
//		-1 : no limit
//      0 :  no Log lines but UploadLog is still in place
//		n :  the last n lines are only kept
//		NaN : no limit (-1)

bidix.UploadLog = function() {
	if (!config.options.chkUploadLog) 
		return; // this.tiddler = null
	this.tiddler = store.getTiddler("UploadLog");
	if (!this.tiddler) {
		this.tiddler = new Tiddler();
		this.tiddler.title = "UploadLog";
		this.tiddler.text = "| !date | !user | !location | !storeUrl | !uploadDir | !toFilename | !backupdir | !origin |";
		this.tiddler.created = new Date();
		this.tiddler.modifier = config.options.txtUserName;
		this.tiddler.modified = new Date();
		store.addTiddler(this.tiddler);
	}
	return this;
};

bidix.UploadLog.prototype.addText = function(text) {
	if (!this.tiddler)
		return;
	// retrieve maxLine when we need it
	var maxLine = parseInt(config.options.txtUploadLogMaxLine,10);
	if (isNaN(maxLine))
		maxLine = -1;
	// add text
	if (maxLine != 0) 
		this.tiddler.text = this.tiddler.text + text;
	// Trunck to maxLine
	if (maxLine >= 0) {
		var textArray = this.tiddler.text.split('\n');
		if (textArray.length > maxLine + 1)
			textArray.splice(1,textArray.length-1-maxLine);
			this.tiddler.text = textArray.join('\n');		
	}
	// update tiddler fields
	this.tiddler.modifier = config.options.txtUserName;
	this.tiddler.modified = new Date();
	store.addTiddler(this.tiddler);
	// refresh and notifiy for immediate update
	story.refreshTiddler(this.tiddler.title);
	store.notify(this.tiddler.title, true);
};

bidix.UploadLog.prototype.startUpload = function(storeUrl, toFilename, uploadDir,  backupDir) {
	if (!this.tiddler)
		return;
	var now = new Date();
	var text = "\n| ";
	var filename = bidix.basename(document.location.toString());
	if (!filename) filename = '/';
	text += now.formatString("0DD/0MM/YYYY 0hh:0mm:0ss") +" | ";
	text += config.options.txtUserName + " | ";
	text += "[["+filename+"|"+location + "]] |";
	text += " [[" + bidix.basename(storeUrl) + "|" + storeUrl + "]] | ";
	text += uploadDir + " | ";
	text += "[[" + bidix.basename(toFilename) + " | " +toFilename + "]] | ";
	text += backupDir + " |";
	this.addText(text);
};

bidix.UploadLog.prototype.endUpload = function(status) {
	if (!this.tiddler)
		return;
	this.addText(" "+status+" |");
};

//
// Utilities
// 

bidix.checkPlugin = function(plugin, major, minor, revision) {
	var ext = version.extensions[plugin];
	if (!
		(ext  && 
			((ext.major > major) || 
			((ext.major == major) && (ext.minor > minor))  ||
			((ext.major == major) && (ext.minor == minor) && (ext.revision >= revision))))) {
			// write error in PluginManager
			if (pluginInfo)
				pluginInfo.log.push("Requires " + plugin + " " + major + "." + minor + "." + revision);
			eval(plugin); // generate an error : "Error: ReferenceError: xxxx is not defined"
	}
};

bidix.dirname = function(filePath) {
	if (!filePath) 
		return;
	var lastpos;
	if ((lastpos = filePath.lastIndexOf("/")) != -1) {
		return filePath.substring(0, lastpos);
	} else {
		return filePath.substring(0, filePath.lastIndexOf("\\"));
	}
};

bidix.basename = function(filePath) {
	if (!filePath) 
		return;
	var lastpos;
	if ((lastpos = filePath.lastIndexOf("#")) != -1) 
		filePath = filePath.substring(0, lastpos);
	if ((lastpos = filePath.lastIndexOf("/")) != -1) {
		return filePath.substring(lastpos + 1);
	} else
		return filePath.substring(filePath.lastIndexOf("\\")+1);
};

bidix.initOption = function(name,value) {
	if (!config.options[name])
		config.options[name] = value;
};

//
// Initializations
//

// require PasswordOptionPlugin 1.0.1 or better
bidix.checkPlugin("PasswordOptionPlugin", 1, 0, 1);

// styleSheet
setStylesheet('.txtUploadStoreUrl, .txtUploadBackupDir, .txtUploadDir {width: 22em;}',"uploadPluginStyles");

//optionsDesc
merge(config.optionsDesc,{
	txtUploadStoreUrl: "Url of the UploadService script (default: store.php)",
	txtUploadFilename: "Filename of the uploaded file (default: in index.html)",
	txtUploadDir: "Relative Directory where to store the file (default: . (downloadService directory))",
	txtUploadBackupDir: "Relative Directory where to backup the file. If empty no backup. (default: ''(empty))",
	txtUploadUserName: "Upload Username",
	pasUploadPassword: "Upload Password",
	chkUploadLog: "do Logging in UploadLog (default: true)",
	txtUploadLogMaxLine: "Maximum of lines in UploadLog (default: 10)"
});

// Options Initializations
bidix.initOption('txtUploadStoreUrl','');
bidix.initOption('txtUploadFilename','');
bidix.initOption('txtUploadDir','');
bidix.initOption('txtUploadBackupDir','');
bidix.initOption('txtUploadUserName','');
bidix.initOption('pasUploadPassword','');
bidix.initOption('chkUploadLog',true);
bidix.initOption('txtUploadLogMaxLine','10');


// Backstage
merge(config.tasks,{
	uploadOptions: {text: "upload", tooltip: "Change UploadOptions and Upload", content: '<<uploadOptions>>'}
});
config.backstageTasks.push("uploadOptions");


//}}}

Begin by mixing 2 Cups of Brown Sugar and 1 Cup of Granulated Sugar together until there are no lumps. Add in 1 Cup of Light Olive Oil or Sunflower Oil and 1 Tablespoon of Pure Vanilla Extract. {I like to use Sunflower Oil for this body scrub because it does not carry the strong scent that Olive Oil does}

Mix together well and scoop into a sealable glass container.
''Simple Vanilla Ice Cream''
This ice cream can easily be dressed up by adding your favorite chopped candies or sprinkles at the end of churning. 

Makes about 7 cups
* 1 1⁄2	cups whole milk
* 1 cup plus 2 tablespoons granulated sugar
* - pinch table salt
* 3 cups heavy cream
* 1 1⁄2	tablespoons pure vanilla extract

In a medium bowl, use a hand mixer on low speed or whisk to combine the milk, sugar and salt until the sugar is dissolved. Stir in the heavy cream and vanilla. Cover and refrigerate 1 to 2 hours, or overnight.

Turn the Cuisinart® Ice Cream Maker on; pour the mixture into the frozen freezer bowl and let mix until thickened, about 30 to 35 minutes. The ice cream will have a soft, creamy texture. If a firmer consistency is desired, transfer the ice cream to an air-tight container and place in freezer for about 2 hours. Remove from freezer about 15 minutes before serving.

Nutritional information per serving (based on 1⁄2 cup): Calories 260 (67% from fat) • carb. 19g • pro. 2g • fat 20g • sat. fat 12g • chol. 75mg • sod. 45mg • calc. 66mg • fiber 0g
When I got my family on board I decided videos were the best way to go about it. I think it's a lot quicker to say "hey, watch this video with me" than "read this 400 page book."
* First I went with [[this Gary Taubes video|http://www.youtube.com/watch?v=lDneyrETR2o]] . It's basically Why We Get Fat in a 70 minute video. It's very accessible and the first 3/4 of it is him working very hard to convince the viewer that "eat less and exercise more" is completely wrong. Then he moves on to obesity is a disorder of fat accumulation, insulin drives fat storage, and carbs drive insulin.
* Then I followed it up with [[this video with Dr. Andreas Eenfeldt interviewing Dr. Mary Vernon|http://www.youtube.com/watch?v=kaquSijXJkQ]]. Some parts are a little medically technical, but she's a great speaker who tells a great story and is quite convincing, I thought.

Hopefully by this point they're a little more open and maybe even asking questions and you can fill in the gaps from there or recommend other sources to them if they're so inclined.

For more science-oriented people,
* [[The Battle of the Diets - Is Anyone Winning (At Losing) - Christopher Gardner|http://www.youtube.com/watch?v=eREuZEdMAVo]] . (About the results of his A TO Z Diet study).
* [[The Many Facets of Keto-Adaptation - Jeff Volek|http://www.youtube.com/watch?v=GC1vMBRFiwE]].
* [[The Straight Dope on Cholesterol - Peter Attia|http://www.youtube.com/watch?v=dAWdHYSrh7M]].
* [[This great post|http://www.reddit.com/r/ketoscience/comments/21x4h4/a_collection_of_peerreviewed_journal_abstracts/]] on [[/r/ketoscience|http://reddit.com/r//r/ketoscience]] which links to a collection of journal articles (abstracts) about keto and low carb. Honestly, if a "science-oriented" friend gives you grief I can think of no better response than shoving a stack of journal articles in front of them that support your point. It's not their fault that they've been miseducated, but if the cold hard LITERAL science doesn't change their mind (or at least bring them to a neutral point on the subject) then they're simply not as "science-oriented" as you or they thought.

Marker for the Weston A Price Foundation
Ingredients:
* 1/2 cups einkorn flour, sifted
* 1/4 teaspoon unrefined sea salt
* 1 teaspoons aluminum free baking powder
* 1/2 tablespoons coconut sugar
* 1 pastured eggs (2 tablespoons)
* 3 oz raw milk, warmed
* 2 tablesppons melted ghee
* 1/4 teaspoon vanilla

Directions:
# Preheat waffle maker to desired temperature, melt ghee and warm milk in a pot
# Add sifted einkorn flour, sea salt, baking powder, and coconut sugar in a bowl and mix.
# In a separate bowl, beat eggs. Add warmed milk, melted butter and vanilla. Mix well
# Add wet ingredients into the bowl with dry ingredients — mix until there are no more clumps and batter is smooth
# Using your ladle, dip into the mixture and pour it onto the waffle maker
# Wait about a minute to a minute and a half or until they are golden brown
# Enjoy with real maple syrup and organic butter!

From [[Healthy Roots Happy Soul|http://www.healthyrootshappysoul.com/recipe-light-as-a-cloud-einkorn-flour-waffles/]]
This document is a ~TiddlyWiki from tiddlyspot.com.  A ~TiddlyWiki is an electronic notebook that is great for managing todo lists, personal information, and all sorts of things.

@@font-weight:bold;font-size:1.3em;color:#444; //What now?// &nbsp;&nbsp;@@ Before you can save any changes, you need to enter your password in the form below.  Then configure privacy and other site settings at your [[control panel|http://wiki.elder-geek.net/keto/controlpanel]] (your control panel username is //keto//).
<<tiddler TspotControls>>
See also GettingStarted.

@@font-weight:bold;font-size:1.3em;color:#444; //Working online// &nbsp;&nbsp;@@ You can edit this ~TiddlyWiki right now, and save your changes using the "save to web" button in the column on the right.

@@font-weight:bold;font-size:1.3em;color:#444; //Working offline// &nbsp;&nbsp;@@ A fully functioning copy of this ~TiddlyWiki can be saved onto your hard drive or USB stick.  You can make changes and save them locally without being connected to the Internet.  When you're ready to sync up again, just click "upload" and your ~TiddlyWiki will be saved back to tiddlyspot.com.

@@font-weight:bold;font-size:1.3em;color:#444; //Help!// &nbsp;&nbsp;@@ Find out more about ~TiddlyWiki at [[TiddlyWiki.com|http://tiddlywiki.com]].  Also visit [[TiddlyWiki.org|http://tiddlywiki.org]] for documentation on learning and using ~TiddlyWiki. New users are especially welcome on the [[TiddlyWiki mailing list|http://groups.google.com/group/TiddlyWiki]], which is an excellent place to ask questions and get help.  If you have a tiddlyspot related problem email [[tiddlyspot support|mailto:support@tiddlyspot.com]].

@@font-weight:bold;font-size:1.3em;color:#444; //Enjoy :)// &nbsp;&nbsp;@@ We hope you like using your tiddlyspot.com site.  Please email [[feedback@tiddlyspot.com|mailto:feedback@tiddlyspot.com]] with any comments or suggestions.
[[Weston A Price - WAPF vs Paleo|http://www.westonaprice.org/traditional-diets/differences-between-the-weston-a-price-foundation-diet-and-the-paleo-diet]]
[[Weston A Price - Beginner Videos|http://www.westonaprice.org/beginner-videos]]

[[Weston A Price - Dietary Guidelines|http://www.westonaprice.org/basics/dietary-guidelines]]
[[Weston A Price - A Holistic Approach to Cancer|http://www.westonaprice.org/cancer/a-holistic-approach-to-cancer]]
[[Weston A Price - Old-Fashioned, Healthy, Lacto-Fermented Soft Drinks: The Real "Real Thing"|http://www.westonaprice.org/food-features/lacto-fermented-soft-drinks]]


[[Weston A Price - Differences Between the Weston A. Price Foundation Diet and the Paleo Diet|http://www.westonaprice.org/traditional-diets/differences-between-the-weston-a-price-foundation-diet-and-the-paleo-diet]]
[[Weston A Price - Journal, Summer 2013, Our Broken Food System|http://www.westonaprice.org/journal/journal-summer-2013-our-broken-food-system]]
WAPF is not Paleo but Paleo is like WAPF. But WAPF came before Paleo.
written by JAM, Aug 13 2013
These critical comments posted here that have emotional undertones are divisive, not Sally's opinions. I have to defend Sally here because I think WAPF's dietary guidelines more closely resembles the real Paleo diet (even with their inclusion of properly prepared grains/legumes/nuts/seeds and raw/fermented dairy) than the Paleo diet first advocated by Cordain. I've been following WAPF since 2000 (one of the few credible health web sites that has been around for quite some time). Originally, the "Paleo Diet" as advocated by Cordain and other experts was high protein, low fat, low carb (starch/sugar). By the way, all plant foods, not just grains and legumes have anti-nutrients (oxalic acid, goitrogens, saponins, etc.), so you can't avoid even most of these anti-nutrients on a Paleo diet. Since then the Paleo diet has evolved to become more like a ketogenic diet over the years, and lately it's also come to admit that starches are okay (I'm speaking generally, from how I interpret it from reading blogs and forum posts, your interpretation may be different). Mark Sisson (of Mark's Daily Apple) says raw dairy is acceptable. Paul Jaminet (of Perfect Health Diet) says white rice is okay. Are you noticing a pattern here? Almost everything WAPF has been advocating is slowly being incorporated into the "Paleo diet." All (yes, all) the popular "Paleo" blogs, traditional and real food blogs, etc. out there base their work on the work of WAPF. So, Sally has a right to differentiate WAPF from the current (and constantly evolving) "Paleo diet" - it was her and Dr. Enig's work that started it all (on the internet, that is)! I think WAPF's dietary guidelines are the least restrictive and if you think about it, if you really are truly healthy, occasional dairy (raw) and grains/legumes/nuts/seeds (properly prepared) should not adversely affect your health, nor will the once-in-a-blue-moon Standard American Diet (SAD) meal. FYI, I have followed WAPF's (and Dr. Mercola's) dietary guidelines for 13 years (13 years eating mostly real, unprocessed food and properly prepared according to traditional methods, only very rarely eating food not prepared by me at restaurants, social gatherings, etc.) in between that time I've tried experimenting by excluding certain "problematic" foods, being grain-free, legume-free, nut-free, seed-free and dairy-free (6 months), grain-free, legume-free and dairy-free (6 months), dairy-free (6 months), and grain-free (about 4 years), and many years being low-starch/sugar and ketogenic. What I found was that I thrived on an unrestricted diet that has the most variety - the WAPF diet, which does not exclude any food/food group besides processed, SAD food. Also, I've come to realize that diet is not everything - sleep, rest, exercise, play, leisure time, time spent outdoors exposed to the sun and elements and walking on the bare earth, limiting your exposure to environmental toxins and EMFs, social/emotional/psychological stress and how they impact your well-being need as much attention as does the food you eat. 
Crust
* 1 (8 oz) package of full fat cream cheese, room temperature
* 2 eggs
* 1/4 tsp ground black pepper
* 1 tsp garlic powder
* 1/4 cup grated parmesan cheese

Topping
* 1/2 cup pizza sauce
* 1 1/2 cups shredded mozzarella cheese
* toppings - pepperoni, sausage, mushrooms, peppers
* Garlic powder

Preheat oven to 350.

Lightly spay a 9×13 baking dish with cooking spray. With a handheld mixer, mix cream cheese, eggs, pepper, garlic powder and parmesan cheese until combined. Spread into baking dish. Bake for 12-15 minutes, our until golden brown. Allow crust to cool for 10 minutes.

Spread pizza sauce on crust. Top with cheese and toppings. Sprinkle pizza with garlic powder. Bake 8-10 minutes, until cheese is melted.
https://www.pinterest.com/recipes/liquid-whey/

http://www.realbeautytips.net/syrup-that-melts-kidney-stones/
Ingredients:
* 1 Egg
* 3 tbsp Almond Flour
* 1 tbsp Mayonnaise
* 1/4 tsp Baking Powder
* 1 tsp Water

Instructions
# Preheat mini waffle maker.
# In a bowl, whisk the egg until beaten.
# Add almond flour, mayonnaise, baking powder, and water.
# When the waffle maker is heated, carefully pour 1/2 of the batter in the waffle maker and close the top. Allow to cook for 3-5 minutes.
# Carefully remove from the waffle maker and set aside for 2-3 minutes to crisp up.
# Repeat instructions again for the second chaffle.
''Ingredients''
* 1/2 - 1 teaspoon instant coffee. I use decaf Folgers crystals 
* 1 shot vodka 
* 2 tablespoons heavy whipping cream 
* 1/2 cup unsweetened vanilla almond milk 
* 1 scoop Stevia or no carb sweetener of choice, to taste 

''Directions''
Put in a glass and stir until crystals are dissolved Add a few ice cubes if you like

Everything in this is to taste, just tweak it till you get it the way you like! I think the body will burn the alcohol before burning fat....I really don't know...so moderation of course.


http://www.reddit.com/r/ketorecipes/comments/2g8gja/keto_friendly_white_russian/
1 cup to 1 gallon ratio of vinegar and hot water with 5 drops of peppermint, lemon, or On Guard EO. This leaves the floors clean and streak free with a refreshing clean smell. Lemon removes stubborn gunk from floors and is great for wood. Peppermint leaves an invigorating tingle to the smell of your house, and On Guard has super dis-infecting powers that are unsurpassed!

Hot water with a few drops of natural dish soap. I prefer Dr. Bonners.

http://naturallivingmamma.com/2012/07/29/apartment-homesteading-make-your-own-cleaning-products/
Homemade Worcestershire Sauce is pretty easy to make and you can do it with many of the ingredients you already have on hand.

1/2 cup apple cider vinegar
1/8 cup molasses
1/8 cup soy sauce
2 tbsp honey
1 tbsp fish sauce
1 tsp pepper
1 clove garlic
1 tsp onion powder
1/2 tsp chili powder
1/4 tsp cinnamon or ground clove
1/2 tsp ground ginger
Juice from 1/2 lime

Mix ingredients below into a small saucepan and bring to a boil. Reduce heat to low and simmer for 10 mins. Pour into a blender and blend on high until smooth.


You can store in the fridge in a dressing bottle or air tight container for up to 1 month.
<<tiddler [[YourSearch Help]]>>
!Field Search
With the Field Search you can restrict your search to certain fields of a tiddler, e.g only search the tags or only the titles. The general form is //fieldname//'':''//textToSearch// (e.g. {{{title:intro}}}). In addition one-character shortcuts are also supported for the standard fields {{{title}}}, {{{text}}} and {{{tags}}}:
|!What you want|!What you type|!Example|
|Search ''titles only''|start word with ''!''|{{{!jonny}}} (shortcut for {{{title:jonny}}})|
|Search ''contents/text only''|start word with ''%''|{{{%football}}} (shortcut for {{{text:football}}})|
|Search ''tags only''|start word with ''#''|{{{#Plugin}}} (shortcut for {{{tags:Plugin}}})|

Using this feature you may also search the extended fields ("Metadata") introduced with TiddlyWiki 2.1, e.g. use {{{priority:1}}} to find all tiddlers with the priority field set to "1".

You may search a word in more than one field. E.g. {{{!#Plugin}}} (or {{{title:tags:Plugin}}} in the "long form") finds tiddlers containing "Plugin" either in the title or in the tags (but does not look for "Plugin" in the text). 

!Boolean Search
The Boolean Search is useful when searching for multiple words.
|!What you want|!What you type|!Example|
|''All words'' must exist|List of words|{{{jonny jeremy}}} (or {{{jonny and jeremy}}})|
|''At least one word'' must exist|Separate words by ''or''|{{{jonny or jeremy}}}|
|A word ''must not exist''|Start word with ''-''|{{{-jonny}}} (or {{{not jonny}}})|

''Note:'' When you specify two words, separated with a space, YourSearch finds all tiddlers that contain both words, but not necessarily next to each other. If you want to find a sequence of word, e.g. '{{{John Brown}}}', you need to put the words into quotes. I.e. you type: {{{"john brown"}}}.

Using parenthesis you may change the default "left to right" evaluation of the boolean search. E.g. {{{not (jonny or jeremy)}}} finds all tiddlers that contain neither "jonny" nor "jeremy. In contrast to this {{{not jonny or jeremy}}} (i.e. without parenthesis) finds all tiddlers that either don't contain "jonny" or that contain "jeremy".

!'Exact Word' Search
By default a search result all matches that 'contain' the searched text. E.g. if you search for {{{Task}}} you will get all tiddlers containing 'Task', but also '~CompletedTask', '~TaskForce' etc.

If you only want to get the tiddlers that contain 'exactly the word' you need to prefix it with a '='. E.g. typing '=Task' will find the tiddlers that contain the word 'Task', ignoring words that just contain 'Task' as a substring.

!~CaseSensitiveSearch and ~RegExpSearch
The standard search options ~CaseSensitiveSearch and ~RegExpSearch are fully supported by YourSearch. However when ''~RegExpSearch'' is on Filtered and Boolean Search are disabled.

In addition you may do a "regular expression" search even with the ''~RegExpSearch'' set to false by directly entering the regular expression into the search field, framed with {{{/.../}}}. 

Example: {{{/m[ae][iy]er/}}} will find all tiddlers that contain either "maier", "mayer", "meier" or "meyer".

!~JavaScript Expression Filtering
If you are familiar with JavaScript programming and know some TiddlyWiki internals you may also use JavaScript expression for the search. Just enter a JavaScript boolean expression into the search field, framed with {{{ { ... } }}}. In the code refer to the variable tiddler and evaluate to {{{true}}} when the given tiddler should be included in the result. 

Example: {{{ { tiddler.modified > new Date("Jul 4, 2005")} }}} returns all tiddler modified after July 4th, 2005.

!Combined Search
You are free to combine the various search options. 

''Examples''
|!What you type|!Result|
|{{{!jonny !jeremy -%football}}}|all tiddlers with both {{{jonny}}} and {{{jeremy}}} in its titles, but no {{{football}}} in content.|
|{{{#=Task}}}|All tiddlers tagged with 'Task' (the exact word). Tags named '~CompletedTask', '~TaskForce' etc. are not considered.|

!Access Keys
You are encouraged to use the access keys (also called "shortcut" keys) for the most frequently used operations. For quick reference these shortcuts are also mentioned in the tooltip for the various buttons etc.

|!Key|!Operation|
|{{{Alt-F}}}|''The most important keystroke'': It moves the cursor to the search input field so you can directly start typing your query. Pressing {{{Alt-F}}} will also display the previous search result. This way you can quickly display multiple tiddlers using "Press {{{Alt-F}}}. Select tiddler." sequences.|
|{{{ESC}}}|Closes the [[YourSearch Result]]. When the [[YourSearch Result]] is already closed and the cursor is in the search input field the field's content is cleared so you start a new query.|
|{{{Alt-1}}}, {{{Alt-2}}},... |Pressing these keys opens the first, second etc. tiddler from the result list.|
|{{{Alt-O}}}|Opens all found tiddlers.|
|{{{Alt-P}}}|Toggles the 'Preview Text' mode.|
|{{{Alt-'<'}}}, {{{Alt-'>'}}}|Displays the previous or next page in the [[YourSearch Result]].|
|{{{Return}}}|When you have turned off the 'as you type' search mode pressing the {{{Return}}} key actually starts the search (as does pressing the 'search' button).|

//If some of these shortcuts don't work for you check your browser if you have other extensions installed that already "use" these shortcuts.//
|>|!YourSearch Options|
|>|<<option chkUseYourSearch>> Use 'Your Search'|
|!|<<option chkPreviewText>> Show Text Preview|
|!|<<option chkSearchAsYouType>> 'Search As You Type' Mode (No RETURN required to start search)|
|!|Default Search Filter:<<option chkSearchInTitle>>Title ('!')     <<option chkSearchInText>>Text ('%')     <<option chkSearchInTags>>Tags ('#')    <<option chkSearchExtendedFields>>Extended Fields<html><br><font size="-2">The fields of a tiddlers that are searched when you don't explicitly specify a filter in the search text <br>(Explictly specify fields using one or more '!', '%', '#' or 'fieldname:' prefix before the word/text to find).</font></html>|
|!|Number of items on search result page: <<option txtItemsPerPage>>|
|!|Number of items on search result page with preview text: <<option txtItemsPerPageWithPreview>>|
<!--{{{-->
<span class='yourSearchNumber' macro='foundTiddler number'></span>
<span class='yourSearchTitle' macro='foundTiddler title'/></span>&nbsp;-&nbsp;
<span macro='foundTiddler field includeURL'/></span>&nbsp;-&nbsp;
<span class='yourSearchTags' macro='foundTiddler field tags 50'/></span>
<span macro="yourSearch if previewText"><div class='yourSearchText' macro='foundTiddler field text 250'/></div></span>
<!--}}}-->
/***
| ''Name:''|YourSearchPlugin|
| ''Description:''|Automatically replaces text strings in tiddlers when the tiddler is saved.|
| ''~CoreVersion:''|2.1.0|
| ''Original Version:''|2.1.5 (2010-02-16)|
| ''Modified Version:''|2.1.5.1|
| ''Last Modified:''|16 May 2011|
| ''Location:''|http://tiddlywiki.abego-software.de/#YourSearchPlugin|
| ''Requires:''|[[YourSearch]]<br>[[YourSearch Help]]<br>[[YourSearch Options]]<br>[[YourSearchItemTemplate]]<br>[[YourSearchResultTemplate]]<br>[[YourSearchStyleSheet]]<br>(built-in shadow tiddlers)|
| ''Browser:''|Firefox 1.0.4+; Firefox 1.5; ~InternetExplorer 6.0|
| ''Author:''|Udo Borkowski (ub [at] abego-software [dot] de)|
| ''Community:''|[[del.icio.us|http://del.icio.us/post?url=http://tiddlywiki.abego-software.de/index.html%23YourSearchPlugin]]|
| ''License:''|[[BSD open source license (abego Software)|http://www.abego-software.de/legal/apl-v10.html]]|
| ''Copyright:''|&copy; 2005-2010 [[abego Software|http://www.abego-software.de]]|
***/

/***
!About YourSearch
YourSearch gives you a bunch of new features to simplify and speed up your daily searches in TiddlyWiki. It seamlessly integrates into the standard TiddlyWiki search: just start typing into the 'search' field and explore!

For more information see [[Help|YourSearch Help]].
!Compatibility
This plugin requires TiddlyWiki 2.1. 
Check the [[archive|http://tiddlywiki.abego-software.de/archive]] for ~YourSearchPlugins supporting older versions of TiddlyWiki.
!Revision history
* v2.1.5.1 (2011-05-16)
** Modified by Scott Simmons (Secret-HQ) to specify a color for {{{.yourSearchResult .summary}}}, which previously defaulted to the Foreground color in the ColorPalette (and disappeared when using the ~ColorPaletteDevFireModified ~SystemPalette).
* v2.1.5 (2010-02-16)
** Fixed problems with CSS and search textfield. Thanks to Guido Glatzel for reporting.
* v2.1.4 (2009-09-04)
** Fixed "this command is not supported" error under IE 8. Thanks to rouilj for reporting. (For details see: http://groups.google.com/group/TiddlyWiki/browse_thread/thread/cffee3254381e478)
* v2.1.3 (2008-04-16)
** Fixed problem with Firefox3. Thanks to Andreas Hoefler for reporting.
* v2.1.2 (2008-03-17)
** Bug: on IE (6.0) the first letter is dropped from the search string. Thanks to Kashgarinn and Nick Padfield for reporting.
* v2.1.1 (2007-03-11)
** Extend "New tiddler" feature: Ctrl-Return invokes the "new tiddler" feature (create tiddler based on search text)
** Extend "New tiddler" feature: tiddler's text and tags may also be specified (see abego.parseNewTiddlerCommandLine)
** Support searching for URLs (like http://www.example.com)
** Provided extended public API (abego.YourSearch.getFoundTiddlers/getQuery/onShowResult)
** Clear MessageBox when search field gets focus (so the box no longer hides the search field)
** Reset search result when TiddlyWiki is changed
** Fix function abego.BoolExp
* v2.1.0 (2006-10-12)
** Release version with TiddlyWiki 2.1 support
*** Support (Extended) Field search
*** Support parenthesis in Boolean Search
*** Support direct regular expression input
*** Support JavaScript Expressions for filtering
*** "new tiddler" feature (create tiddler based on search text)
* v2.0.2 (2006-02-13)
** Bugfix for Firefox 1.5.0.1 related to the "Show prefix" checkbox. Thanks to Ted Pavlic for reporting and to BramChen for fixing. 
** Internal
*** Make "JSLint" conform
* v2.0.1 (2006-02-05)
** Support "Exact Word Match" (use '=' to prefix word)
** Support default filter settings (when no filter flags are given in search term)
** Rework on the "less than 3 chars search text" feature (thanks to EricShulman)
** Better support SinglePageMode when doing "Open all tiddlers" (thanks to EricShulman)
** Support Firefox 1.5.0.1
** Bug: Fixed a hilite bug in "classic search mode" (thanks to EricShulman)
* v2.0.0 (2006-01-16)
** Add User Interface
* v1.0.1 (2006-01-06)
** Support TiddlyWiki 2.0
* v1.0.0 (2005-12-28)
** initial version
!Source Code
***/
//{{{
//============================================================================
//============================================================================
//                           YourSearchPlugin
//============================================================================
//============================================================================

// Ensure that the Plugin is only installed once.
//
if (!version.extensions.YourSearchPlugin) {

version.extensions.YourSearchPlugin = {
	major: 2, minor: 1, revision: 5,
	source: "http://tiddlywiki.abego-software.de/#YourSearchPlugin",
	licence: "[[BSD open source license (abego Software)|http://www.abego-software.de/legal/apl-v10.html]]",
	copyright: "Copyright (c) abego Software GmbH, 2005-2010 (www.abego-software.de)"
};

if (!window.abego) window.abego = {};

// define the Array forEach when not yet defined (e.g. by Mozilla)
if (!Array.forEach) {
    Array.forEach = function(obj, callback, thisObj) {
        for (var i = 0,len = obj.length; i < len; i++)
            callback.call(thisObj, obj[i], i, obj);
    };
    Array.prototype.forEach = function(callback, thisObj) {
        for (var i = 0,len = this.length; i < len; i++)
            callback.call(thisObj,  this[i], i, this);
    };
}

abego.toInt = function(s, defaultValue) {
	if (!s) return defaultValue;
	var n = parseInt(s);
	return (n == NaN) ? defaultValue : n;
};

abego.createEllipsis = function(place) {
	var e = createTiddlyElement(place,"span");
	e.innerHTML = "&hellip;";
};

//#concept Object
//
abego.shallowCopy = function(object) {
	if (!object)
		return object;
	var result = {};
	for (var n in object) 
		result[n] = object[n];
	return result;
};

// Returns a shallow copy of the options, or a new, empty object if options is null/undefined.
//
// @param options [may be null/undefined]
//
//#concept Object, Options
//#import abego.shallowCopy
//
abego.copyOptions = function(options) {
	return !options ? {} : abego.shallowCopy(options);
};

//#import abego.define-namespace
// returns the number of occurances of s in the text
abego.countStrings = function(text, s) {
	if (!s)
		return 0;
		
	var len = s.length;
	var n = 0;
	var lastIndex = 0;
	while (1) {
		var i = text.indexOf(s, lastIndex);
		if (i < 0)
			return n;
		n++;
		lastIndex = i+len;
	}
	return n;
};// Returns the content of the first "braced" text {...}
// Also takes care of nested braces
//
// Returns undefined when no braced text is found or it is not properly nested
//
// @param [optional] when defined and a braced text is found lastIndexRef.lastIndex will contain the index of the char following the (final) closing brace on return.
//
abego.getBracedText = function(text, offset,lastIndexRef) {
	if (!offset) offset = 0;
	var re = /\{([^\}]*)\}/gm;
	re.lastIndex = offset;
	var m = re.exec(text);
	if (m) {
		// The matching stopped at the first closing brace.
		// But if the matched text contains opening braces 
		// this is not the final closing brace.
		// Handle this case specially, find the "corresponding" closing brace
		var s = m[1];
		var nExtraOpenBrace = abego.countStrings(s,"{");
		
		if (!nExtraOpenBrace) {
			if (lastIndexRef)
				lastIndexRef.lastIndex = re.lastIndex;
			// simple case: no nested braces
			return s;
		}

		// special case: "nested braces"
		var len = text.length;
		for (var i = re.lastIndex; i < len && nExtraOpenBrace; i++) {
			var c = text.charAt(i);
			if (c == "{") 
				nExtraOpenBrace++;
			else if (c == "}")
				nExtraOpenBrace--;
		}
		if (!nExtraOpenBrace) {
			// found the corresponding "}".
			if (lastIndexRef)
				lastIndexRef.lastIndex = i-1;
			return text.substring(m.index+1, i-1);
		}
	}
	
	// no return means: return undefined;
};

// Returns an array with those items from the array that pass the given test
//
// @param test an one-arg boolean function that returns true when the item should be added.
// @param testObj [optional] the receiver for the test function (global if undefined or null)
// @param result [optional] an array. When define the selected items are added to this array, otherwise a new array is used.
//
//#import Array.prototype.forEach
//
abego.select = function(array,test,testObj,result) {
	if (!result) result = [];
	array.forEach(function(t) {
		if (test.call(testObj,t)) 
			result.push(t);
		});
	return result;
};

// A portable way to "consume an event"
// 
// (Uses "stopPropagation" and "preventDefault", but will also "cancelBubble",
// even though this is a "non-standard method" , just in case).
//
abego.consumeEvent = function(e) {
	if (e.stopPropagation) e.stopPropagation();
	if (e.preventDefault) e.preventDefault();
	e.cancelBubble = true;
	e.returnValue = true;
};

// Class abego.TiddlerFilterTerm =================================================================
//
// Used to check if a tiddler contains a given text.
//
// A list of fields (standard and/or extended) may be specified to restrict the search to certain fields. 
//
// When no explicit fields are given the fields defined by defaultFields are checked, plus all extended 
// fields (when options.withExtendedFields is true).
//
// @param options [may be null/undefined]
//		options.fields @seeParam abego.MultiFieldRegExpTester.fields
// 		options.withExtendedFields @seeParam abego.MultiFieldRegExpTester.withExtendedFields  
// 		options.caseSensitive [Default: false]
// 		options.fullWordMatch [Default: false]
// 		options.textIsRegExp [Default: false] when true the given text is already a regExp
//
//#import abego.MultiFieldRegExpTester
//
abego.TiddlerFilterTerm = function(text,options) {
	if (!options) options = {};

	var reText = text;
	if (!options.textIsRegExp) {
		reText = text.escapeRegExp();
		if (options.fullWordMatch) 
			reText = "\\b"+reText+"\\b";
	}
	var regExp = new RegExp(reText, "m"+(options.caseSensitive ? "" : "i"));

	this.tester = new abego.MultiFieldRegExpTester(regExp, options.fields, options.withExtendedFields);
}

abego.TiddlerFilterTerm.prototype.test = function(tiddler) {
	return this.tester.test(tiddler);
}

// Recognize a string like
//     "Some Title. Some content text #Tag1 #Tag2 Tag3"
// with the tags and the text being optional.
// Also the period at the end of the title is optional when no content text is specified)
//
// Returns the result in an object with properties "title" and "params",
// with "params" following the parseParams format, containing the "tag" and "text" arguments.
//
abego.parseNewTiddlerCommandLine = function(s) {
	var m = /(.*?)\.(?:\s+|$)([^#]*)(#.*)?/.exec(s);
	if (!m) 
		m = /([^#]*)()(#.*)?/.exec(s);
	if (m) {
		var r;
		if (m[3]) {
			var s2 = m[3].replace(/#/g,"");
			r = s2.parseParams("tag");
		} else
			r = [[]];
			
		// add the text parameter
		var text = m[2]?m[2].trim():"";
		r.push({name: "text", value: text});
		r[0].text = [text];
		
		return {title: m[1].trim(), params: r}; 
	} else
		return {title: s.trim(),params: [[]]};
}	
// 		options.defaultFields [@seeOptionDefault abego.TiddlerFilterTerm.fields] fields to check when no fields are explicitly specified in queryText.
// 		options.withExtendedFields [@seeOptionDefault abego.TiddlerFilterTerm.withExtendedFields] when true and no fields are explicitly specified in queryText also the extended fields are considered (in addition to the ones in defaultFields).
// @seeOptions abego.TiddlerFilterTerm (-fields -fullWordMatch -withExtendedFields)
//
//#import abego.getBracedText
//#import abego.copyOptions
//#import abego.TiddlerFilterTerm
//
abego.parseTiddlerFilterTerm = function(queryText,offset,options) {
	
	// group 1: {...} 		(JavaScript expression)
	// group 2: '=' 		(full word match (optional))
	// group 3: [!%#] 		(field selection short cuts)
	// group 4: fieldName ':'
	// group 5: String literal "..."
	// group 6: RegExp literal /.../
	// group 7: scheme '://' nonSpaceChars
	// group 8: word
	var re = /\s*(?:(?:\{([^\}]*)\})|(?:(=)|([#%!])|(?:(\w+)\s*\:(?!\/\/))|(?:(?:("(?:(?:\\")|[^"])+")|(?:\/((?:(?:\\\/)|[^\/])+)\/)|(\w+\:\/\/[^\s]+)|([^\s\)\-\"]+)))))/mg; // " <- The syntax highlighting of my editors gets confused without this quote
	var shortCuts = {'!':'title','%':'text','#':'tags'};
	
	var fieldNames = {};
	var fullWordMatch;
	re.lastIndex = offset;
	while (1) {
		var i = re.lastIndex;
		var m = re.exec(queryText);
		if (!m || m.index != i) 
			throw "Word or String literal expected";
		if (m[1]) {
			var lastIndexRef = {};
			var code = abego.getBracedText(queryText,0,lastIndexRef);
			if (!code)
				throw "Invalid {...} syntax";
			var f = Function("tiddler","return ("+code+");");
			return {func: f,
					lastIndex:lastIndexRef.lastIndex,
					markRE: null};
		}
		if (m[2])
			fullWordMatch = true;
		else if (m[3]) 
			fieldNames[shortCuts[m[3]]] = 1;
		else if (m[4]) 
			fieldNames[m[4]] = 1;
		else {
			var textIsRegExp = m[6];
			var text = m[5] ? window.eval(m[5]) : m[6] ? m[6] :  m[7] ? m[7] : m[8];
			
			var options = abego.copyOptions(options);
			options.fullWordMatch = fullWordMatch;
			options.textIsRegExp = textIsRegExp;

			var fields = [];
			for (var n in fieldNames)
				fields.push(n);
			if (fields.length == 0) {
				options.fields = options.defaultFields;
			} else {
				options.fields = fields;
				options.withExtendedFields	= false;
			}	
			var term = new abego.TiddlerFilterTerm(text,options);
			var markREText = textIsRegExp ? text : text.escapeRegExp();
			if (markREText && fullWordMatch)
				markREText = "\\b"+markREText+"\\b";
			return {func: function(tiddler) {return term.test(tiddler);},
					lastIndex:re.lastIndex,
					markRE: markREText ? "(?:"+markREText+")" : null};
		}
	}
};

// Class abego.BoolExp =================================================================
//
// Allows the execution/evaluation of a boolean expression, according to this syntax:
//
// boolExpression    : unaryExpression (("AND"|"OR"|"&&"|"||")? unaryExpression)*
//                   ;
//
// unaryExpression   : ("not"|"-")? primaryExpression
//                   ;
//
// primaryExpression : "(" boolExpression ")" 
//                   | Term
//                   ;
//
// For flexibility the Term syntax is defined by a separate parse function.
//
// Notice that there is no precedence between "AND" and "OR" operators, i.e. they are evaluated from left to right.
//
// To evaluate the expression in a given context use code like this:
//
//	var be = new abego.BoolExp(s, termParseFunc);
//  var result = be.exec(context);
// 
// @param s the text defining the expression 
// @param parseTermFunc a Function(text,offset,options) that parses the text starting at offset for a "Term" and returns an object with properties {func: Function(context), lastIndex: ...}. func is the function to be used to evaluate the term in the given context.
// @param options [may be null/undefined] (is also passed to the parseTermFunc)
// 			options.defaultOperationIs_OR [Default: false] When true the concatenation of unaryExpressions (without an operator) is interpreted as an "OR", otherwise as an "AND".
// 			options.caseSensitive [default: false]
//
abego.BoolExp = function(s, parseTermFunc, options) {
	this.s = s;
	var defaultOperationIs_OR = options && options.defaultOperationIs_OR;
	
	var reStart = /\s*(?:(\-|not)|(\())/gi; 		// group 1: NOT, group2 "("
	var reCloseParenthesis = /\s*\)/g;  			// match )
	var reAndOr = /\s*(?:(and|\&\&)|(or|\|\|))/gi; 	// group 1: AND, group 2: OR
	var reNonWhiteSpace = /\s*[^\)\s]/g;
	
	var reNot_Parenthesis = /\s*(\-|not)?(\s*\()?/gi;
	
	var parseBoolExpression; //#Pre-declare function name to avoid problem with "shrinkSafe"
	
	var parseUnaryExpression = function(offset) {
		reNot_Parenthesis.lastIndex = offset;
		var m = reNot_Parenthesis.exec(s);
		var negate;
		var result;
		if (m && m.index == offset) {
			offset += m[0].length;
			negate = m[1];
			if (m[2]) {
				// case:  (...)
				var e = parseBoolExpression(offset);
				reCloseParenthesis.lastIndex = e.lastIndex;
				if (!reCloseParenthesis.exec(s))
					throw "Missing ')'";
				result = {func: e.func, lastIndex: reCloseParenthesis.lastIndex, markRE: e.markRE};
			}
		}
		if (!result)
			result = parseTermFunc(s,offset,options);

		if (negate) {
			result.func = (function(f){return function(context) {return !f(context);}})(result.func);
			// don't mark patterns that are negated
			// (This is essential since the marking may also be used to calculate "ranks". If we
			// would also count the negated matches (i.e. that should not exist) the rank may get too high)
			result.markRE = null;
		}
		return result;
	};

	parseBoolExpression = function(offset) {
		var result = parseUnaryExpression(offset);
		while (1) {
			var l = result.lastIndex;
			reAndOr.lastIndex = l;
			var m = reAndOr.exec(s);
			var isOrCase;
			var nextExp;
			if (m && m.index == l) {
				isOrCase = !m[1];
				nextExp = parseUnaryExpression(reAndOr.lastIndex);
			} else {
				// no "AND" or "OR" found. 
				// Maybe it is a concatenations of parseUnaryExpression without operators
				try {
					nextExp = parseUnaryExpression(l);
				} catch (e) {
					// no unary expression follows. We are done
					return result;
				}
				isOrCase = defaultOperationIs_OR;
			}
			result.func = (function(func1, func2, isOrCase) {
					return isOrCase
						? function(context) {return func1(context) || func2(context);}
						: function(context) {return func1(context) && func2(context);};
				})(result.func,nextExp.func,isOrCase);
			result.lastIndex = nextExp.lastIndex;
			if (!result.markRE)
				result.markRE = nextExp.markRE;
			else if (nextExp.markRE) 
				result.markRE = result.markRE + "|" + nextExp.markRE;
		}
	};
	
	var expr = parseBoolExpression(0);
	this.evalFunc = expr.func;
	if (expr.markRE)
		this.markRegExp = new RegExp(expr.markRE, options.caseSensitive ? "mg" : "img");
}

abego.BoolExp.prototype.exec = function() {
	return this.evalFunc.apply(this,arguments);
};

abego.BoolExp.prototype.getMarkRegExp = function() {
	return this.markRegExp;
};

abego.BoolExp.prototype.toString = function() {
	return this.s;
};

// Class abego.MultiFieldRegExpTester ==================================================================
//
// @param fields [optional; Default: ["title","text","tags"]] array of names of fields to be considered
// @param withExtendedFields [optional; Default: false] when true also extended fields are considered (in addition to the ones given in 'fields')
//
abego.MultiFieldRegExpTester = function(re, fields, withExtendedFields) {
	this.re = re;
	this.fields = fields ? fields : ["title","text","tags"];
	this.withExtendedFields = withExtendedFields;
}

// Returns the name of the first field found that value succeeds the given test,
// or null when no such field is found
//
abego.MultiFieldRegExpTester.prototype.test = function(tiddler) {
	var re = this.re;
	// Check the fields explicitly specified
	for (var i = 0; i < this.fields.length; i++) {
		var s = store.getValue(tiddler, this.fields[i]);
		if (typeof s == "string" && re.test(s))
			return this.fields[i];		
	}
	// Check the extended fields (if required)
	if (this.withExtendedFields) 
		return store.forEachField(
				tiddler,
				function(tiddler, fieldName, value) {
					return typeof value == "string" && re.test(value)?fieldName:null;
				}, true);
		
	return null;
}

// Class abego.TiddlerQuery ==================================================================
//
//#import abego.select
//#import abego.MultiFieldRegExpTester
//
abego.TiddlerQuery = function(queryText,caseSensitive,useRegExp,defaultFields,withExtendedFields) {
	if (useRegExp) {
		this.regExp = new RegExp(queryText, caseSensitive ? "mg" : "img");
		this.tester = new abego.MultiFieldRegExpTester(this.regExp, defaultFields, withExtendedFields);
	} else {
		this.expr = new abego.BoolExp(
				queryText,
				abego.parseTiddlerFilterTerm, {
				defaultFields: defaultFields,
				caseSensitive: caseSensitive,
				withExtendedFields: withExtendedFields});
	}
	
	this.getQueryText = function() {
		return queryText;
	};
	this.getUseRegExp = function() {
		return useRegExp;
	};
	this.getCaseSensitive = function() {
		return caseSensitive;
	};
	this.getDefaultFields = function() {
		return defaultFields;
	};
	this.getWithExtendedFields = function() {
		return withExtendedFields;
	};
}

// Returns true iff the query includes the given tiddler
//
// @param tiddler [may be null/undefined]
//
abego.TiddlerQuery.prototype.test = function(tiddler) {
	if (!tiddler) return false;
	if (this.regExp) {
		return this.tester.test(tiddler);
	}
	return this.expr.exec(tiddler);
};

// Returns an array with those tiddlers from the tiddlers array that match the query.
//
abego.TiddlerQuery.prototype.filter = function(tiddlers) {
	return abego.select(tiddlers,this.test,this);
};

abego.TiddlerQuery.prototype.getMarkRegExp = function() {
	if (this.regExp) {
		// Only use the regExp for marking when it does not match the empty string.
		return "".search(this.regExp) >= 0 ? null :  this.regExp;
	}
	return this.expr.getMarkRegExp();
};

abego.TiddlerQuery.prototype.toString = function() {
	return (this.regExp ? this.regExp : this.expr).toString();
};

// Class abego.PageWiseRenderer ================================================
//
// Subclass or instance must implement getItemsPerPage function;
// They should also implement onPageChanged and refresh the container of the
// PageWiseRenderer on that event.
//
//#import abego.toInt
//
abego.PageWiseRenderer = function() {
	this.firstIndexOnPage = 0; // The index of the first item of the lastResults list displayed on the search result page
};

merge(abego.PageWiseRenderer.prototype, {
	setItems: function(items) {
		this.items = items;
		this.setFirstIndexOnPage(0);
	},
	
	// Maximum number of pages listed in the navigation bar (before or after the current page)
	//
	getMaxPagesInNavigation: function() {
		return 10;
	},
	
	getItemsCount: function(items) {
		return this.items ? this.items.length : 0;
	},
	
	getCurrentPageIndex: function() {
		return Math.floor(this.firstIndexOnPage / this.getItemsPerPage());
	},
	
	getLastPageIndex: function() {
		return Math.floor((this.getItemsCount()-1) / this.getItemsPerPage())
	},
	
	setFirstIndexOnPage: function(index) {
		this.firstIndexOnPage = Math.min(Math.max(0, index), this.getItemsCount()-1);
	},
	
	getFirstIndexOnPage: function() {
		// Ensure that the firstIndexOnPage is really a page start. 
		// This may have become violated when getItemsPerPage has changed,
		// (e.g. when switching between previewText and simple mode.)
		this.firstIndexOnPage = Math.floor(this.firstIndexOnPage / this.getItemsPerPage()) * this.getItemsPerPage();
	
		return this.firstIndexOnPage;
	},
	
	getLastIndexOnPage: function() {
		return Math.min(this.getFirstIndexOnPage()+this.getItemsPerPage()-1, this.getItemsCount()-1);
	},
	
	onPageChanged: function(pageIndex,oldPageIndex) {
	},
	
	renderPage: function(itemRenderer) {
		if (itemRenderer.beginRendering)
			itemRenderer.beginRendering(this);
		try {
			// When there are items found add them to the result page (pagewise)
			if (this.getItemsCount()) {
				// Add the items of the current page
				var lastIndex = this.getLastIndexOnPage();
				var iInPage = -1;
				for (var i=this.getFirstIndexOnPage(); i <= lastIndex; i++) {
					iInPage++;
					
					itemRenderer.render(this,this.items[i],i,iInPage);
				}
			}
		} finally {
			if (itemRenderer.endRendering)
				itemRenderer.endRendering(this);
		}
	},
	
	addPageNavigation: function(place) {
		if (!this.getItemsCount()) return;
	
		var self = this;
		var onNaviButtonClick = function(e) {
			if (!e) var e = window.event;

			abego.consumeEvent(e);

			var pageIndex = abego.toInt(this.getAttribute("page"),0);
			var oldPageIndex = self.getCurrentPageIndex();
			if (pageIndex == oldPageIndex)
				return;
			var index = pageIndex * self.getItemsPerPage();
			self.setFirstIndexOnPage(index);
			self.onPageChanged(pageIndex,oldPageIndex);	
		};
	
		var button;
		var currentPageIndex = this.getCurrentPageIndex();
		var lastPageIndex = this.getLastPageIndex();
		if (currentPageIndex > 0) {
			button = createTiddlyButton(place, "Previous", "Go to previous page (Shortcut: Alt-'<')", onNaviButtonClick, "prev");
			button.setAttribute("page",(currentPageIndex-1).toString());
			button.setAttribute("accessKey","<");
		}
	
		for (var i = -this.getMaxPagesInNavigation(); i < this.getMaxPagesInNavigation(); i++) {
			var pageIndex = currentPageIndex+i;
			if (pageIndex < 0) continue;
			if (pageIndex > lastPageIndex) break;
	
			var pageNo = (i+currentPageIndex+1).toString();
			var buttonClass = pageIndex == currentPageIndex ? "currentPage" : "otherPage";
			button = createTiddlyButton(place, pageNo, "Go to page %0".format([pageNo]), onNaviButtonClick, buttonClass);
			button.setAttribute("page",(pageIndex).toString());
		}
		
		if (currentPageIndex < lastPageIndex) {
			button = createTiddlyButton(place, "Next", "Go to next page (Shortcut: Alt-'>')", onNaviButtonClick, "next");
			button.setAttribute("page",(currentPageIndex+1).toString());
			button.setAttribute("accessKey",">");
		}
	}
});

// Class abego.LimitedTextRenderer ===========================================================
//
// Renders a given text, ensuring that a given limit of number of characters 
// is not exceeded.
//
// A "markRegExp" may be specified. Substring matching this regular expression 
// ("matched strings") are rendered with the class "marked". 
//
// if the given text is longer than the limit the matched strings are preferred 
// to be included in the rendered text (with some leading and trailing "context text"). 
// 
// Example:
//     var renderer = new abego.LimitedTextRenderer();
//
//     var place = ... // a DOM element that should contain the rendered (limited) text
//     var s = "This is another 'Hello World' example, as saying 'Hello' is always nice. So let's say it again: >Hello!<";
//     var maxLen = 50;
//     var markRE = /hello/gi;
//     renderer.render(place,s,maxLen,markRE);
// 
//#import abego.createEllipsis
//
abego.LimitedTextRenderer = function() {
	var minMatchWithContextSize = 40; 
	var maxMovementForWordCorrection = 4; // When a "match" context starts or end on a word the context borders may be changed to at most this amount to include or exclude the word.
	
	
	//----------------------------------------------------------------------------
	//
	// Ranges
	//
	// Objects with a "start" and "end" property (not a specific class). 
	// 
	// In a corresponding "Ranges array" these objects are sorted by their start 
	// and no Range object intersects/touches any other in the array.
	//
	//----------------------------------------------------------------------------
	
	// Adds the Range [startIndex,endIndex[ to the ranges, ensuring that the Ranges
	// in the array are sorted by their start and no Range object 
	// intersects/touches any other in the array (i.e. possibly the new Range is 
	// "merged" with existing ranges)
	//
	// @param ranges array of Range objects
	//
	var addRange = function(ranges, startIndex, endIndex) {
		var n = ranges.length;
		
		// When there are no ranges in ranges, just add it.
		if (n == 0) {
			ranges.push({start: startIndex, end: endIndex});
			return;
		}
		
		var i = 0;
		for (; i < n; i++) {
			var range = ranges[i];
			
			// find the first range that intersects or "touches" [startIndex, endIndex[
			if (range.start <= endIndex && startIndex <= range.end) {
				// Found.
				
				var r;
				// find the first range behind the new range that does not interfere
				var rIndex = i+1;
				for (; rIndex < n; rIndex++) {
					r = ranges[rIndex];
					if (r.start > endIndex || startIndex > range.end) {
						break;
					}
				}
				
				// Replace the ranges i to rIndex-1 with the union of the new range with these ranges.
				var unionStart = startIndex;
				var unionEnd = endIndex;
				for (var j = i; j < rIndex; j++) {
					r = ranges[j];
					unionStart = Math.min(unionStart, r.start);
					unionEnd = Math.max(unionEnd, r.end);
				}
				ranges.splice(i, rIndex-i, {start: unionStart, end: unionEnd});
				return;			
			}
			
			// if we found a range R that is right of the new range there is no
			// intersection and we can insert the new range before R.
			if (range.start > endIndex) {
				break;
			}
		}
	
		// When we are here the new range does not interfere with any range in ranges and
		// i is the index of the first range right to it (or ranges.length, when the new range
		// becomes the right most range). 
	
		ranges.splice(i, 0, {start: startIndex, end: endIndex});
	};
	
	// Returns the total size of all Ranges in ranges
	//
	var getTotalRangesSize = function(ranges) {
		var totalRangeSize = 0;
		for (var i=0; i < ranges.length; i++) {
			var range = ranges[i];
			totalRangeSize += range.end-range.start;
		}
		return totalRangeSize;
	};
	
	//----------------------------------------------------------------------------
	
	
	var isWordChar = function(c) {
		return (c >= "a" && c <= "z") || (c >= "A" && c <= "Z") || c == "_";
	};
	
	// Returns the bounds of the word in s around offset as a {start: , end:} object.
	//
	// Returns null when the char at offset is not a word char.
	//
	var getWordBounds = function(s, offset) {
		// Handle the "offset is not in word" case
		if (!isWordChar(s[offset])) return null;
	
		for (var i = offset-1; i >= 0 && isWordChar(s[i]); i--) 
			{/*empty*/}
			
		var startIndex = i+1;
		var n = s.length;
		for (i = offset+1; i < n && isWordChar(s[i]); i++) 
			{/*empty*/}
		
		return {start: startIndex, end: i};
	};
	
	var moveToWordBorder = function(s, offset, isStartOffset) {
		var wordBounds;
		if (isStartOffset) {
			wordBounds = getWordBounds(s, offset);
		} else {
			if (offset <= 0) return offset;
			wordBounds = getWordBounds(s, offset-1);
		}
		if (!wordBounds) return offset;
		
		if (isStartOffset) {
			if (wordBounds.start >= offset-maxMovementForWordCorrection) return wordBounds.start;
			if (wordBounds.end <= offset+maxMovementForWordCorrection) return wordBounds.end;
		} else {
			if (wordBounds.end <= offset+maxMovementForWordCorrection) return wordBounds.end;
			if (wordBounds.start >= offset-maxMovementForWordCorrection) return wordBounds.start;
		}
		return offset;
	};
	
	
	
	// Splits s into a sequence of "matched" and "unmatched" substrings, using the 
	// matchRegExp to do the matching.
	// 
	// Returns an array of objects with a "text" property containing the substring text. 
	// Substrings that are "matches" also contain a boolean "isMatch" property set to true.
	// 
	// @param matchRegExp [may be null] when null no matching is performed and the returned 
	// 			array just contains one item with s as its text
	// 
	var getTextAndMatchArray = function(s, matchRegExp) {
		var result = [];
		if (matchRegExp) {
			var startIndex = 0;
			var n = s.length;
			var currentLen = 0;
			do {
				matchRegExp.lastIndex = startIndex;
				var match = matchRegExp.exec(s);
				if (match) {
					if (startIndex < match.index) {
						var t = s.substring(startIndex, match.index);
						result.push({text:t});
					}
					result.push({text:match[0], isMatch:true});
					startIndex = match.index + match[0].length;
				} else {
					result.push({text: s.substr(startIndex)});
					break;
				}
			} while (true);
		} else {
			result.push({text: s});
		}
		return result;
	};
	
	
	
	var getMatchedTextCount = function(textAndMatches) {
		var result = 0;
		for (var i=0; i < textAndMatches.length; i++) {
			if (textAndMatches[i].isMatch) {
				result++;
			}
		}
		return result;	
	};
	
	
	
	var getContextRangeAround = function(s, startIndex, endIndex, matchCount, maxLen) {
		// Partition the available space into equal sized areas for each match and one 
		// for the text start.
		// But the size should not go below a certain limit
		var size = Math.max(Math.floor(maxLen/(matchCount+1)), minMatchWithContextSize);
		
		// Substract the size of the range to get the size of the context.
		var contextSize = Math.max(size-(endIndex-startIndex), 0);
		// Two thirds of the context should be before the match, one third after.
		var contextEnd = Math.min(Math.floor(endIndex+contextSize/3), s.length);
		var contextStart = Math.max(contextEnd - size, 0);
	
		// If the contextStart/End is inside a word and the end of the word is
		// close move the pointers accordingly to make the text more readable.
		contextStart = moveToWordBorder(s, contextStart, true);
		contextEnd = moveToWordBorder(s, contextEnd, false);
		
		return {start: contextStart, end: contextEnd};
	};
	
	// Get all ranges around matched substrings with their contexts
	//
	var getMatchedTextWithContextRanges = function(textAndMatches, s, maxLen) {
		var ranges = [];
		var matchCount = getMatchedTextCount(textAndMatches);
		var pos = 0;
		for (var i=0; i < textAndMatches.length; i++) {
			var t = textAndMatches[i];
			var text = t.text;
			if (t.isMatch) {
				var range = getContextRangeAround(s, pos, pos+text.length, matchCount, maxLen);
				addRange(ranges, range.start, range.end);
			}
			pos += text.length;
		}
		return ranges;
	};
	
	var fillUpRanges = function(s, ranges, maxLen) {
		var remainingLen = maxLen - getTotalRangesSize(ranges);
		while (remainingLen > 0) {
			if (ranges.length == 0) {
				// No matches added yet. Make one large range.
				addRange(ranges, 0, moveToWordBorder(s, maxLen, false));
				return;
			} else {
				var range = ranges[0];
				var startIndex;
				var maxEndIndex;
				if (range.start == 0) {
					// The first range already starts at the beginning of the string.
	
					// When there is a second range fill to the next range start or to the maxLen.
					startIndex = range.end;
					if (ranges.length > 1) {
						maxEndIndex =  ranges[1].start;
					} else {
						// Only one range. Add a range after that with the complete remaining len 
						// (corrected to "beautify" the output)
						addRange(ranges, startIndex, moveToWordBorder(s, startIndex+remainingLen, false));
						return;
					}
				} else {
					// There is unused space between the start of the text and the first range.
					startIndex = 0;
					maxEndIndex = range.start;
				}
				var endIndex = Math.min(maxEndIndex, startIndex+remainingLen);
				addRange(ranges, startIndex, endIndex);
				remainingLen -= (endIndex-startIndex);
			}
		}
	};
	
	
	// Write the given ranges of s, using textAndMatches for marking portions of the text.
	//
	var writeRanges = function(place, s, textAndMatches, ranges, maxLen) {
		if (ranges.length == 0) return;
		
		// Processes the text between startIndex and endIndex of the textAndMatches
		// "writes" them (as DOM elements) at the given place, possibly as "marked" text.
		//
		// When endIndex is not the end of the full text an ellisis is appended. 
		//
		var writeTextAndMatchRange = function(place, s, textAndMatches, startIndex, endIndex) {
			var t;
			var text;
			
			// find the first text item to write
			var pos = 0;
			var i = 0;
			var offset = 0;
			for (;i < textAndMatches.length; i++) {
				t = textAndMatches[i];
				text = t.text;
				if (startIndex < pos+text.length) {
					offset = startIndex - pos;
					break;
				}
				pos += text.length;
			}
			
			var remainingLen = endIndex - startIndex;
			for (; i < textAndMatches.length && remainingLen > 0; i++) {
				t = textAndMatches[i];
				text = t.text.substr(offset);
				offset = 0;
				if (text.length > remainingLen) text = text.substr(0,remainingLen);
				
				if (t.isMatch) {
					createTiddlyElement(place,"span",null,"marked",text);
				} else {
					createTiddlyText(place, text);
				}
				remainingLen -= text.length;
			}
			
			if (endIndex < s.length) {
				abego.createEllipsis(place);
			}
		};
		
		// When the first range is not at the start of the text write an ellipsis("...")
		// (Ellipses between ranges are written in the writeTextAndMatchRange method)
		if (ranges[0].start > 0) abego.createEllipsis(place);
	
		var remainingLen = maxLen;
		for (var i = 0; i < ranges.length && remainingLen > 0; i++) {
			var range = ranges[i];
			var len = Math.min(range.end - range.start, remainingLen);
			writeTextAndMatchRange(place, s, textAndMatches, range.start, range.start+len);
			remainingLen -= len;
		}
	};
	
	this.render = function(place,s,maxLen,markRegExp) {
		if (s.length < maxLen) maxLen = s.length;
		
		var textAndMatches = getTextAndMatchArray(s, markRegExp);
		
		var ranges = getMatchedTextWithContextRanges(textAndMatches, s, maxLen);
		
		// When the maxLen is not yet reached add more ranges 
		// starting from the beginning until either maxLen or 
		// the end of the string is reached.
		fillUpRanges(s, ranges, maxLen);
	
		writeRanges(place, s, textAndMatches, ranges, maxLen);
	};
};



(function() {

function alertAndThrow(msg) {
	alert(msg);
	throw msg;
};

if (version.major < 2 || (version.major == 2 && version.minor < 1)) 
	alertAndThrow("YourSearchPlugin requires TiddlyWiki 2.1 or newer.\n\nCheck the archive for YourSearch plugins\nsupporting older versions of TiddlyWiki.\n\nArchive: http://tiddlywiki.abego-software.de/archive");

abego.YourSearch = {};

//----------------------------------------------------------------------------
// The Search Core
//----------------------------------------------------------------------------

// Model Variables
var lastResults; // Array of tiddlers that matched the last search
var lastQuery; // The last Search query (TiddlerQuery)

var setLastResults = function(array) {
	lastResults = array;
};

var getLastResults = function() {
	return lastResults ? lastResults : [];
};

var getLastResultsCount = function() {
	return lastResults ? lastResults.length : 0;
};

// Standard Ranking Weights
var matchInTitleWeight = 4;
var precisionInTitleWeight = 10;
var matchInTagsWeight = 2;

var getMatchCount = function(s, re) {
	var m = s.match(re);
	return m ? m.length : 0;
};

var standardRankFunction = function(tiddler, query) {	
	// Count the matches in the title and the tags
	var markRE = query.getMarkRegExp();
	if (!markRE) return 1;
	
	var matchesInTitle = tiddler.title.match(markRE);
	var nMatchesInTitle =  matchesInTitle ? matchesInTitle.length : 0;
	var nMatchesInTags = getMatchCount(tiddler.getTags(), markRE);

	// Calculate the "precision" of the matches in the title as the ratio of
	// the length of the matches to the total length of the title.
	var lengthOfMatchesInTitle = matchesInTitle ? matchesInTitle.join("").length : 0;
	var precisionInTitle = tiddler.title.length > 0 ? lengthOfMatchesInTitle/tiddler.title.length : 0;
	
	// calculate a weighted score
	var rank= nMatchesInTitle * matchInTitleWeight 
			+ nMatchesInTags * matchInTagsWeight 
			+ precisionInTitle * precisionInTitleWeight 
			+ 1;

	return rank;
};

// @return Tiddler[]
//
var findMatches = function(store, searchText,caseSensitive,useRegExp,sortField,excludeTag) {
	lastQuery = null;
	
	var candidates = store.reverseLookup("tags",excludeTag,false);
	try {
		var defaultFields = [];
		if (config.options.chkSearchInTitle) defaultFields.push("title");
		if (config.options.chkSearchInText) defaultFields.push("text");
		if (config.options.chkSearchInTags) defaultFields.push("tags");
		lastQuery = new abego.TiddlerQuery(
				searchText,caseSensitive, useRegExp,defaultFields,config.options.chkSearchExtendedFields); 
	} catch (e) {
		// when an invalid query is given no tiddlers are matched
		return [];
	}

	var results = lastQuery.filter(candidates);

	// Rank the results
	var rankFunction = abego.YourSearch.getRankFunction();
	for (var i = 0; i < results.length; i++) {
		var tiddler = results[i];
		var rank = rankFunction(tiddler, lastQuery);
		// Add the rank information to the tiddler.
		// This is used during the sorting, but it may also
		// be used in the result, e.g. to display some "relevance" 
		// information in the result	
		tiddler.searchRank = rank;	
	}
	
	// sort the result, taking care of the rank and the sortField	
	if(!sortField) {
		sortField = "title";
	}
	
	var sortFunction = function (a,b) {
		var searchRankDiff = a.searchRank - b.searchRank;
		if (searchRankDiff == 0) {
			if (a[sortField] == b[sortField]) {
				return(0); 
			} else {
				return (a[sortField] < b[sortField]) ? -1 : +1; 
			}
		} else {
			return (searchRankDiff > 0) ? -1 : +1; 
		}
	};
	results.sort(sortFunction);
	return results;
};

//----------------------------------------------------------------------------
// The Search UI (Result page)
//----------------------------------------------------------------------------


// Visual appearance of the result page
var maxCharsInTitle = 80;
var maxCharsInTags = 50;
var maxCharsInText = 250;
var maxCharsInField = 50;

var itemsPerPageDefault = 25; // Default maximum number of items on one search result page
var itemsPerPageWithPreviewDefault = 10; // Default maximum number of items on one search result page when PreviewText is on

// DOM IDs
var yourSearchResultID = "yourSearchResult";
var yourSearchResultItemsID = "yourSearchResultItems";

var lastSearchText; // The last search text, as passed to findMatches

var resultElement; // The (popup) DOM element containing the search result [may be null]
var searchInputField; // The "search" input field
var searchButton; // The "search" button
var lastNewTiddlerButton;

var initStylesheet = function() {
	if (version.extensions.YourSearchPlugin.styleSheetInited) 
		return;
		
	version.extensions.YourSearchPlugin.styleSheetInited = true;
	setStylesheet(store.getTiddlerText("YourSearchStyleSheet"),"yourSearch");
}

var isResultOpen = function() {
	return resultElement != null && resultElement.parentNode == document.body;
};

var closeResult = function() {
	if (isResultOpen()) {
		document.body.removeChild(resultElement);
	}
};

// Closes the Search Result window and displays the tiddler 
// defined by the "tiddlyLink" attribute of this element
//
var closeResultAndDisplayTiddler = function(e)
{
	closeResult();
	
	var title = this.getAttribute("tiddlyLink");
	if(title) {
		var withHilite = this.getAttribute("withHilite");
		var oldHighlightHack = highlightHack;
		if (withHilite && withHilite=="true" && lastQuery) {
			highlightHack = lastQuery.getMarkRegExp();
		}
		story.displayTiddler(this,title);
		highlightHack = oldHighlightHack;
	}
	return(false);
};

// Adjusts the resultElement's size and position, relative to the search input field.
//
var adjustResultPositionAndSize = function() {
	if (!searchInputField) return;
	
	var root = searchInputField;
	
	// Position the result below the root and resize it if necessary.
	var rootLeft = findPosX(root);
	var rootTop = findPosY(root);
	var rootHeight = root.offsetHeight;
	var popupLeft = rootLeft;
	var popupTop = rootTop + rootHeight;

	// Make sure the result is not wider than the window
	var winWidth = findWindowWidth();
	if (winWidth < resultElement.offsetWidth) {
		resultElement.style.width = (winWidth - 100)+"px";
		winWidth = findWindowWidth();
	}

	// Ensure that the left and right of the result are not
	// clipped by the window. Move it to the left or right, if necessary.	
	var popupWidth = resultElement.offsetWidth;
	if(popupLeft + popupWidth > winWidth)
		popupLeft = winWidth - popupWidth-30;
	if (popupLeft < 0) popupLeft = 0;
	
	// Do the actual moving
	resultElement.style.left = popupLeft + "px";
	resultElement.style.top = popupTop + "px";
	resultElement.style.display = "block";
};

var scrollVisible = function() {
	// Scroll the window to make the result page (and the search Input field) visible.
	if (resultElement) window.scrollTo(0,ensureVisible(resultElement));
	if (searchInputField) window.scrollTo(0,ensureVisible(searchInputField));
};

// Makes sure the result page has a good size and position and visible
// (may scroll the window)
//
var	ensureResultIsDisplayedNicely = function() {
	adjustResultPositionAndSize();
	scrollVisible();
};



var indexInPage; // The index (in the current page) of the tiddler currently rendered.
var currentTiddler; // While rendering the page the tiddler that is currently rendered.

var pager = new abego.PageWiseRenderer();

var MyItemRenderer = function(parent) {
	// Load the template how to display the items that represent a found tiddler
	this.itemHtml = store.getTiddlerText("YourSearchItemTemplate");
	if (!this.itemHtml) alertAndThrow("YourSearchItemTemplate not found");
	
	// Locate the node that shall contain the list of found tiddlers
	this.place = document.getElementById(yourSearchResultItemsID);
	if(!this.place)
		this.place = createTiddlyElement(parent,"div",yourSearchResultItemsID);
};

merge(MyItemRenderer.prototype,{
	render: function(pager,object,index,indexOnPage) {
		// Define global variables, referenced by macros during applyHtmlMacros
		indexInPage = indexOnPage;
		currentTiddler = object;
		
		var item = createTiddlyElement(this.place,"div",null, "yourSearchItem");
		item.innerHTML = this.itemHtml;
		applyHtmlMacros(item,null);
		refreshElements(item,null);
	},

	endRendering: function(pager) {
		// The currentTiddler must only be defined while rendering the found tiddlers
		currentTiddler = null;
	}
});

// Refreshes the content of the result with the current search result
// of the selected page.
//
// Assumes that the result is already open. 
//
var refreshResult = function() {
	if (!resultElement || !searchInputField) return;

	// Load the template for the YourSearchResult
	var html = store.getTiddlerText("YourSearchResultTemplate");
	if (!html) html = "<b>Tiddler YourSearchResultTemplate not found</b>";
	resultElement.innerHTML = html;

	// Expand the template macros etc.
	applyHtmlMacros(resultElement,null);
	refreshElements(resultElement,null);
	
	var itemRenderer = new MyItemRenderer(resultElement);
	pager.renderPage(itemRenderer);

	ensureResultIsDisplayedNicely();
};

pager.getItemsPerPage = function() {
	var n = (config.options.chkPreviewText) 
			? abego.toInt(config.options.txtItemsPerPageWithPreview, itemsPerPageWithPreviewDefault) 
			: abego.toInt(config.options.txtItemsPerPage, itemsPerPageDefault);
	return (n > 0) ? n : 1;
};

pager.onPageChanged = function() {
	refreshResult();
};

var	reopenResultIfApplicable = function() {
	if (searchInputField == null || !config.options.chkUseYourSearch) return;
	
	if ((searchInputField.value == lastSearchText) && lastSearchText && !isResultOpen()) {
		// For speedup we check re-use the previously created resultElement, if possible.
		if (resultElement && (resultElement.parentNode != document.body)) {
			document.body.appendChild(resultElement);
			ensureResultIsDisplayedNicely();
		} else {
			abego.YourSearch.onShowResult(true);
		}
	}
};


var invalidateResult = function() {
	closeResult();
	resultElement = null;
	lastSearchText = null;
};



//-------------------------------------------------------------------------
// Close the search result page when the user clicks on the document
// (and not into the searchInputField, on the search button or in the result)
// or presses the ESC key

// Returns true if e is either self or a descendant (child, grandchild,...) of self.
//
// @param self DOM:Element
// @param e DOM:Element or null
//
var isDescendantOrSelf = function(self, e) {
	while (e != null) {
		if (self == e) return true;
		e = e.parentNode;
	}
	return false;
};

var onDocumentClick = function(e) {
	if (e.target == searchInputField) return; 
	if (e.target == searchButton) return; 
	if (resultElement && isDescendantOrSelf(resultElement, e.target)) return; 
	
	closeResult();
};

var onDocumentKeyup = function(e) {
	// Close the search result page when the user presses "ESC"
	if (e.keyCode == 27) closeResult();
};
addEvent(document,"click",onDocumentClick);
addEvent(document,"keyup",onDocumentKeyup);


// Our Search Macro Hijack Function ==========================================

// Helper
var myStorySearch = function(text,useCaseSensitive,useRegExp)
{
	lastSearchText = text;
	setLastResults(findMatches(store, text,useCaseSensitive,useRegExp,"title","excludeSearch"));

	abego.YourSearch.onShowResult();
};


var myMacroSearchHandler = function(place,macroName,params,wikifier,paramString,tiddler)
{
	initStylesheet();

	lastSearchText = "";
	var searchTimeout = null;
	var doSearch = function(txt)
		{
		if (config.options.chkUseYourSearch)
			myStorySearch(txt.value,config.options.chkCaseSensitiveSearch,config.options.chkRegExpSearch);
		else
			story.search(txt.value,config.options.chkCaseSensitiveSearch,config.options.chkRegExpSearch);
		lastSearchText = txt.value;
		};
	var clickHandler = function(e)
		{
		doSearch(searchInputField);
		return false;
		};
	var keyHandler = function(e)
		{
		if (!e) var e = window.event;
		searchInputField = this;
		switch(e.keyCode)
			{
			case 13:
				if (e.ctrlKey && lastNewTiddlerButton && isResultOpen())
					lastNewTiddlerButton.onclick.apply(lastNewTiddlerButton,[e]);
				else
					doSearch(this);
				break;
			case 27:
				// When the result is open, close it, 
				// otherwise clear the content of the input field
				if (isResultOpen()) {
					closeResult();
				} else {
					this.value = "";
					clearMessage();
				}
				break;
			}
		if (String.fromCharCode(e.keyCode) == this.accessKey || e.altKey) 
			{
			reopenResultIfApplicable();
			}

		if(this.value.length<3 && searchTimeout) clearTimeout(searchTimeout);
		if(this.value.length > 2)
			{
		 	if (this.value != lastSearchText)
		 		{
				if (!config.options.chkUseYourSearch || config.options.chkSearchAsYouType)
					{
					if(searchTimeout)
						clearTimeout(searchTimeout);
					var txt = this;
					searchTimeout = setTimeout(function() {doSearch(txt);},500);
					}
				}
			else
				{
				if(searchTimeout)
					clearTimeout(searchTimeout);
				}
			};
		if (this.value.length == 0) 
			{
			closeResult();
			}
		};


	var focusHandler = function(e)
		{
		this.select();
		clearMessage();
		reopenResultIfApplicable();
		};

	
	var args = paramString.parseParams("list",null,true);
	var buttonAtRight = getFlag(args, "buttonAtRight");
	var sizeTextbox = getParam(args, "sizeTextbox", this.sizeTextbox);
	
	var btn;
	if (!buttonAtRight)
		btn = createTiddlyButton(place,this.label,this.prompt,clickHandler);
		
	var txt = createTiddlyElement(null,"input",null,"txtOptionInput searchField",null);
	if(params[0])
		txt.value = params[0];
	txt.onkeyup = keyHandler;
	txt.onfocus = focusHandler;
	txt.setAttribute("size",sizeTextbox);
	txt.setAttribute("accessKey",this.accessKey);
	txt.setAttribute("autocomplete","off");
	if(config.browser.isSafari)
		{
		txt.setAttribute("type","search");
		txt.setAttribute("results","5");
		}
	else
		txt.setAttribute("type","text");

	if(place)
		place.appendChild(txt);

	if (buttonAtRight)
		btn = createTiddlyButton(place,this.label,this.prompt,clickHandler);

	searchInputField = txt;
	searchButton = btn;
};

//----------------------------------------------------------------------------
// Support for Macros
//----------------------------------------------------------------------------

var openAllFoundTiddlers = function() {
	closeResult();
	var results = getLastResults();
	var n = results.length;
	if (n) {
		var titles=[];
		for(var i = 0; i<n; i++)
			titles.push(results[i].title);
		story.displayTiddlers(null,titles);
	}
};

var createOptionWithRefresh = function(place, optionParams, wikifier,tiddler) {
	invokeMacro(place,"option",optionParams,wikifier,tiddler);
	// The option macro appended the component at the end of the place.
	var elem = place.lastChild;
	var oldOnClick = elem.onclick;
	elem.onclick = function(e) {
		var result = oldOnClick.apply(this, arguments);
		refreshResult();
		return result;
	};
	return elem;
};

var removeTextDecoration = function(s) {
	var removeThis = ["''", "{{{", "}}}", "//", "<<<", "/***", "***/"];
	var reText = "";
	for (var i = 0; i < removeThis.length; i++) {
		if (i != 0) reText += "|";
		reText += "("+removeThis[i].escapeRegExp()+")";
	}
	return s.replace(new RegExp(reText, "mg"), "").trim();
};



// Returns the "shortcut number" of the currentTiddler. 
// I.e. When the user presses Alt-n the given tiddler is opened/display.
//
// @return 0-9 or -1 when no number is defined
//
var getShortCutNumber = function() {
	var i = indexInPage;
	return (i >= 0 && i <= 9) 
		? (i < 9 ? (i+1) : 0)
		: -1;
};

var limitedTextRenderer = new abego.LimitedTextRenderer();
var renderLimitedText = function(place, s, maxLen) {
	limitedTextRenderer.render(place,s,maxLen,lastQuery.getMarkRegExp())
}

// When any tiddler are changed reset the result.
// 
var oldTiddlyWikiSaveTiddler = TiddlyWiki.prototype.saveTiddler;
TiddlyWiki.prototype.saveTiddler = function(title,newTitle,newBody,modifier,modified,tags,fields) {
	oldTiddlyWikiSaveTiddler.apply(this, arguments);
	invalidateResult();
};
var oldTiddlyWikiRemoveTiddler = TiddlyWiki.prototype.removeTiddler;
TiddlyWiki.prototype.removeTiddler = function(title) {
	oldTiddlyWikiRemoveTiddler.apply(this, arguments);
	invalidateResult();
};

//----------------------------------------------------------------------------
// Macros
//----------------------------------------------------------------------------

// ====Macro yourSearch ================================================

config.macros.yourSearch = {
	// Standard Properties
	label: "yourSearch",
	prompt: "Gives access to the current/last YourSearch result",
	
	handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		if (params.length == 0) return;
	
		var name = params[0];
		var func = config.macros.yourSearch.funcs[name];
		if (func) func(place,macroName,params,wikifier,paramString,tiddler);
	},
	
	tests: {
		"true" : function() {return true;},
		"false" : function() {return false;},
		"found" : function() {return getLastResultsCount() > 0;},
		"previewText" : function() {return config.options.chkPreviewText;}
	},

	funcs: {
		itemRange: function(place) {
			if (getLastResultsCount()) {
				var lastIndex = pager.getLastIndexOnPage();
				var s = "%0 - %1".format([pager.getFirstIndexOnPage()+1,lastIndex+1]);
				createTiddlyText(place, s);
			}
		},
		
		count: function(place) {
			createTiddlyText(place, getLastResultsCount().toString());
		},
		
		query: function(place) {
			if (lastQuery) {
				createTiddlyText(place, lastQuery.toString());
			}
		},
		
		version: function(place) {
			var t = "YourSearch %0.%1.%2".format(
					[version.extensions.YourSearchPlugin.major, 
					 version.extensions.YourSearchPlugin.minor, 
					 version.extensions.YourSearchPlugin.revision]);
			var e = createTiddlyElement(place, "a");
			e.setAttribute("href", "http://tiddlywiki.abego-software.de/#YourSearchPlugin");
			e.innerHTML = '<font color="black" face="Arial, Helvetica, sans-serif">'+t+'<font>';
		},
		
		copyright: function(place) {
			var e = createTiddlyElement(place, "a");
			e.setAttribute("href", "http://www.abego-software.de");
			e.innerHTML = '<font color="black" face="Arial, Helvetica, sans-serif">&copy; 2005-2008 <b><font color="red">abego</font></b> Software<font>';
		},
		
		newTiddlerButton: function(place) {
			if (lastQuery) {
				var r = abego.parseNewTiddlerCommandLine(lastQuery.getQueryText());
				var btn = config.macros.newTiddler.createNewTiddlerButton(place,r.title,r.params,"new tiddler","Create a new tiddler based on search text. (Shortcut: Ctrl-Enter; Separators: '.', '#')",null,"text");				
				// Close the result before the new tiddler is created.
				var oldOnClick = btn.onclick;
				btn.onclick = function() {
					closeResult();
					oldOnClick.apply(this,arguments);
				}
				lastNewTiddlerButton = btn;
			}
		},
		
		linkButton: function(place,macroName,params,wikifier,paramString,tiddler) {
			if (params < 2) return;
			
			var	tiddlyLink = params[1];
			var text = params < 3 ? tiddlyLink : params[2];
			var tooltip = params < 4 ? text : params[3];
			var accessKey = params < 5 ? null : params[4];
			
			var btn = createTiddlyButton(place,text,tooltip,closeResultAndDisplayTiddler,null,null, accessKey);
			btn.setAttribute("tiddlyLink",tiddlyLink);
		},
		
		closeButton: function(place,macroName,params,wikifier,paramString,tiddler) {
			var button = createTiddlyButton(place, "close", "Close the Search Results (Shortcut: ESC)", closeResult);
		},
		
		openAllButton: function(place,macroName,params,wikifier,paramString,tiddler) {
			var n = getLastResultsCount();
			if (n == 0) return;
		
			var title = n == 1 ? "open tiddler" : "open all %0 tiddlers".format([n]);
			var button = createTiddlyButton(place, title, "Open all found tiddlers (Shortcut: Alt-O)", openAllFoundTiddlers);
			button.setAttribute("accessKey","O");
		},
		
		naviBar: function(place,macroName,params,wikifier,paramString,tiddler) {
			pager.addPageNavigation(place);
		},
		
		"if": function(place,macroName,params,wikifier,paramString,tiddler) {
			if (params.length < 2) return;
			
			var testName = params[1];
			var negate = (testName == "not");
			if (negate) {
				if (params.length < 3) return;
				testName = params[2];
			}
			
			var test = config.macros.yourSearch.tests[testName];
			var showIt = false;
			try {
				if (test) {
					showIt = test(place,macroName,params,wikifier,paramString,tiddler) != negate;
				} else {
					// When no predefined test is specified try to evaluate it as a JavaScript expression.
					showIt = (!eval(testName)) == negate;
				}
			} catch (ex) {
			}
			
			if (!showIt) {
				place.style.display="none";
			}
		},
		
		chkPreviewText: function(place,macroName,params,wikifier,paramString,tiddler) {
			var optionParams = params.slice(1).join(" ");
			
			var elem = createOptionWithRefresh(place, "chkPreviewText", wikifier,tiddler);
			elem.setAttribute("accessKey", "P");
			elem.title = "Show text preview of found tiddlers (Shortcut: Alt-P)";	
			return elem;
		}
	}
};


// ====Macro foundTiddler ================================================

config.macros.foundTiddler = {
	// Standard Properties
	label: "foundTiddler",
	prompt: "Provides information on the tiddler currently processed on the YourSearch result page",
	
	handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		var name = params[0];
		var func = config.macros.foundTiddler.funcs[name];
		if (func) func(place,macroName,params,wikifier,paramString,tiddler);
	},
		
	funcs: {
		title: function(place,macroName,params,wikifier,paramString,tiddler) {
			if (!currentTiddler) return;
			
			var shortcutNumber = getShortCutNumber();
			var tooltip = shortcutNumber >= 0 
					? "Open tiddler (Shortcut: Alt-%0)".format([shortcutNumber.toString()])
					: "Open tiddler";
		
			var btn = createTiddlyButton(place,null,tooltip,closeResultAndDisplayTiddler,null);
			btn.setAttribute("tiddlyLink",currentTiddler.title);
			btn.setAttribute("withHilite","true");
			
			renderLimitedText(btn, currentTiddler.title, maxCharsInTitle);
		
			if (shortcutNumber >= 0) {
				btn.setAttribute("accessKey",shortcutNumber.toString());
			}
		},
		
		tags: function(place,macroName,params,wikifier,paramString,tiddler) {
			if (!currentTiddler) return;
		
			renderLimitedText(place, currentTiddler.getTags(), maxCharsInTags);
		},
		
		text: function(place,macroName,params,wikifier,paramString,tiddler) {
			if (!currentTiddler) return;
		
			renderLimitedText(place, removeTextDecoration(currentTiddler.text), maxCharsInText);
		},
		
		field:  function(place,macroName,params,wikifier,paramString,tiddler) {
			if (!currentTiddler) return;
			var	name = params[1];
			var len = params.length > 2 ? abego.toInt(params[2],maxCharsInField) : maxCharsInField;
			var v = store.getValue(currentTiddler,name);
			if (v)
				renderLimitedText(place, removeTextDecoration(v), len);
		},
		
		// Renders the "shortcut number" of the current tiddler, to indicate to the user
		// what number to "Alt-press" to open the tiddler.
		//
		number: function(place,macroName,params,wikifier,paramString,tiddler) {
			var numberToDisplay = getShortCutNumber();
			if (numberToDisplay >= 0) {
				var text = "%0)".format([numberToDisplay.toString()]);
				createTiddlyElement(place,"span",null,"shortcutNumber",text);
			}
		}
	}
};


//----------------------------------------------------------------------------
// Configuration Stuff
//----------------------------------------------------------------------------

var opts = {chkUseYourSearch:true,
	chkPreviewText:true,
	chkSearchAsYouType:true,
	chkSearchInTitle:true,
	chkSearchInText:true,
	chkSearchInTags:true,
	chkSearchExtendedFields:true,
	txtItemsPerPage:itemsPerPageDefault,
	txtItemsPerPageWithPreview:itemsPerPageWithPreviewDefault};
for (var n in opts) 
	if (config.options[n] == undefined) config.options[n] = opts[n];




//----------------------------------------------------------------------------
// Shadow Tiddlers
//----------------------------------------------------------------------------

config.shadowTiddlers.AdvancedOptions += "\n<<option chkUseYourSearch>> Use 'Your Search' //([[more options|YourSearch Options]]) ([[help|YourSearch Help]])// ";

config.shadowTiddlers["YourSearch Help"] =
"!Field Search\nWith the Field Search you can restrict your search to certain fields of a tiddler, e.g"+
" only search the tags or only the titles. The general form is //fieldname//'':''//textToSearch// (e."+
"g. {{{title:intro}}}). In addition one-character shortcuts are also supported for the standard field"+
"s {{{title}}}, {{{text}}} and {{{tags}}}:\n|!What you want|!What you type|!Example|\n|Search ''titles "+
"only''|start word with ''!''|{{{!jonny}}} (shortcut for {{{title:jonny}}})|\n|Search ''contents/text "+
"only''|start word with ''%''|{{{%football}}} (shortcut for {{{text:football}}})|\n|Search ''tags only"+
"''|start word with ''#''|{{{#Plugin}}} (shortcut for {{{tags:Plugin}}})|\n\nUsing this feature you may"+
" also search the extended fields (\"Metadata\") introduced with TiddlyWiki 2.1, e.g. use {{{priority:1"+
"}}} to find all tiddlers with the priority field set to \"1\".\n\nYou may search a word in more than one"+
" field. E.g. {{{!#Plugin}}} (or {{{title:tags:Plugin}}} in the \"long form\") finds tiddlers containin"+
"g \"Plugin\" either in the title or in the tags (but does not look for \"Plugin\" in the text). \n\n!Boole"+
"an Search\nThe Boolean Search is useful when searching for multiple words.\n|!What you want|!What you "+
"type|!Example|\n|''All words'' must exist|List of words|{{{jonny jeremy}}} (or {{{jonny and jeremy}}}"+
")|\n|''At least one word'' must exist|Separate words by ''or''|{{{jonny or jeremy}}}|\n|A word ''must "+
"not exist''|Start word with ''-''|{{{-jonny}}} (or {{{not jonny}}})|\n\n''Note:'' When you specify two"+
" words, separated with a space, YourSearch finds all tiddlers that contain both words, but not neces"+
"sarily next to each other. If you want to find a sequence of word, e.g. '{{{John Brown}}}', you need"+
" to put the words into quotes. I.e. you type: {{{\"john brown\"}}}.\n\nUsing parenthesis you may change "+
"the default \"left to right\" evaluation of the boolean search. E.g. {{{not (jonny or jeremy)}}} finds"+
" all tiddlers that contain neither \"jonny\" nor \"jeremy. In contrast to this {{{not jonny or jeremy}}"+
"} (i.e. without parenthesis) finds all tiddlers that either don't contain \"jonny\" or that contain \"j"+
"eremy\".\n\n!'Exact Word' Search\nBy default a search result all matches that 'contain' the searched tex"+
"t. E.g. if you search for {{{Task}}} you will get all tiddlers containing 'Task', but also '~Complet"+
"edTask', '~TaskForce' etc.\n\nIf you only want to get the tiddlers that contain 'exactly the word' you"+
" need to prefix it with a '='. E.g. typing '=Task' will find the tiddlers that contain the word 'Tas"+
"k', ignoring words that just contain 'Task' as a substring.\n\n!~CaseSensitiveSearch and ~RegExpSearch"+
"\nThe standard search options ~CaseSensitiveSearch and ~RegExpSearch are fully supported by YourSearc"+
"h. However when ''~RegExpSearch'' is on Filtered and Boolean Search are disabled.\n\nIn addition you m"+
"ay do a \"regular expression\" search even with the ''~RegExpSearch'' set to false by directly enterin"+
"g the regular expression into the search field, framed with {{{/.../}}}. \n\nExample: {{{/m[ae][iy]er/"+
"}}} will find all tiddlers that contain either \"maier\", \"mayer\", \"meier\" or \"meyer\".\n\n!~JavaScript E"+
"xpression Filtering\nIf you are familiar with JavaScript programming and know some TiddlyWiki interna"+
"ls you may also use JavaScript expression for the search. Just enter a JavaScript boolean expression"+
" into the search field, framed with {{{ { ... } }}}. In the code refer to the variable tiddler and e"+
"valuate to {{{true}}} when the given tiddler should be included in the result. \n\nExample: {{{ { tidd"+
"ler.modified > new Date(\"Jul 4, 2005\")} }}} returns all tiddler modified after July 4th, 2005.\n\n!Com"+
"bined Search\nYou are free to combine the various search options. \n\n''Examples''\n|!What you type|!Res"+
"ult|\n|{{{!jonny !jeremy -%football}}}|all tiddlers with both {{{jonny}}} and {{{jeremy}}} in its tit"+
"les, but no {{{football}}} in content.|\n|{{{#=Task}}}|All tiddlers tagged with 'Task' (the exact wor"+
"d). Tags named '~CompletedTask', '~TaskForce' etc. are not considered.|\n\n!Access Keys\nYou are encour"+
"aged to use the access keys (also called \"shortcut\" keys) for the most frequently used operations. F"+
"or quick reference these shortcuts are also mentioned in the tooltip for the various buttons etc.\n\n|"+
"!Key|!Operation|\n|{{{Alt-F}}}|''The most important keystroke'': It moves the cursor to the search in"+
"put field so you can directly start typing your query. Pressing {{{Alt-F}}} will also display the pr"+
"evious search result. This way you can quickly display multiple tiddlers using \"Press {{{Alt-F}}}. S"+
"elect tiddler.\" sequences.|\n|{{{ESC}}}|Closes the [[YourSearch Result]]. When the [[YourSearch Resul"+
"t]] is already closed and the cursor is in the search input field the field's content is cleared so "+
"you start a new query.|\n|{{{Alt-1}}}, {{{Alt-2}}},... |Pressing these keys opens the first, second e"+
"tc. tiddler from the result list.|\n|{{{Alt-O}}}|Opens all found tiddlers.|\n|{{{Alt-P}}}|Toggles the "+
"'Preview Text' mode.|\n|{{{Alt-'<'}}}, {{{Alt-'>'}}}|Displays the previous or next page in the [[Your"+
"Search Result]].|\n|{{{Return}}}|When you have turned off the 'as you type' search mode pressing the "+
"{{{Return}}} key actually starts the search (as does pressing the 'search' button).|\n\n//If some of t"+
"hese shortcuts don't work for you check your browser if you have other extensions installed that alr"+
"eady \"use\" these shortcuts.//";

config.shadowTiddlers["YourSearch Options"] =
"|>|!YourSearch Options|\n|>|<<option chkUseYourSearch>> Use 'Your Search'|\n|!|<<option chkPreviewText"+
">> Show Text Preview|\n|!|<<option chkSearchAsYouType>> 'Search As You Type' Mode (No RETURN required"+
" to start search)|\n|!|Default Search Filter:<<option chkSearchInTitle>>Title ('!')     <<option chk"+
"SearchInText>>Text ('%')     <<option chkSearchInTags>>Tags ('#')    <<option chkSearchExtendedFiel"+
"ds>>Extended Fields<html><br><font size=\"-2\">The fields of a tiddlers that are searched when you don"+
"'t explicitly specify a filter in the search text <br>(Explictly specify fields using one or more '!"+
"', '%', '#' or 'fieldname:' prefix before the word/text to find).</font></html>|\n|!|Number of items "+
"on search result page: <<option txtItemsPerPage>>|\n|!|Number of items on search result page with pre"+
"view text: <<option txtItemsPerPageWithPreview>>|\n";
			
config.shadowTiddlers["YourSearchStyleSheet"] = 
"/***\n!~YourSearchResult Stylesheet\n***/\n/*{{{*/\n.yourSearchResult {\n\tposition: absolute;\n\twidth: 800"+
"px;\n\n\tpadding: 0.2em;\n\tlist-style: none;\n\tmargin: 0;\n\n\tbackground: #ffd;\n\tborder: 1px solid DarkGra"+
"y;\n}\n\n/*}}}*/\n/***\n!!Summary Section\n***/\n/*{{{*/\n.yourSearchResult .summary {\n\tcolor: #808080;\n\tborder-bottom-width:"+
" thin;\n\tborder-bottom-style: solid;\n\tborder-bottom-color: #999999;\n\tpadding-bottom: 4px;\n}\n\n.yourSea"+
"rchRange, .yourSearchCount, .yourSearchQuery   {\n\tfont-weight: bold;\n}\n\n.yourSearchResult .summary ."+
"button {\n\tfont-size: 10px;\n\n\tpadding-left: 0.3em;\n\tpadding-right: 0.3em;\n}\n\n.yourSearchResult .summa"+
"ry .chkBoxLabel {\n\tfont-size: 10px;\n\n\tpadding-right: 0.3em;\n}\n\n/*}}}*/\n/***\n!!Items Area\n***/\n/*{{{*"+
"/\n.yourSearchResult .marked {\n\tbackground: none;\n\tfont-weight: bold;\n}\n\n.yourSearchItem {\n\tmargin-to"+
"p: 2px;\n}\n\n.yourSearchNumber {\n\tcolor: #808080;\n}\n\n\n.yourSearchTags {\n\tcolor: #008000;\n}\n\n.yourSearc"+
"hText {\n\tcolor: #808080;\n\tmargin-bottom: 6px;\n}\n\n/*}}}*/\n/***\n!!Footer\n***/\n/*{{{*/\n.yourSearchFoote"+
"r {\n\tmargin-top: 8px;\n\tborder-top-width: thin;\n\tborder-top-style: solid;\n\tborder-top-color: #999999;"+
"\n}\n\n.yourSearchFooter a:hover{\n\tbackground: none;\n\tcolor: none;\n}\n/*}}}*/\n/***\n!!Navigation Bar\n***/"+
"\n/*{{{*/\n.yourSearchNaviBar a {\n\tfont-size: 16px;\n\tmargin-left: 4px;\n\tmargin-right: 4px;\n\tcolor: bla"+
"ck;\n\ttext-decoration: underline;\n}\n\n.yourSearchNaviBar a:hover {\n\tbackground-color: none;\n}\n\n.yourSe"+
"archNaviBar .prev {\n\tfont-weight: bold;\n\tcolor: blue;\n}\n\n.yourSearchNaviBar .currentPage {\n\tcolor: #"+
"FF0000;\n\tfont-weight: bold;\n\ttext-decoration: none;\n}\n\n.yourSearchNaviBar .next {\n\tfont-weight: bold"+
";\n\tcolor: blue;\n}\n/*}}}*/\n";

config.shadowTiddlers["YourSearchResultTemplate"] =
"<!--\n{{{\n-->\n<span macro=\"yourSearch if found\">\n<!-- The Summary Header ============================"+
"================ -->\n<table class=\"summary\" border=\"0\" width=\"100%\" cellspacing=\"0\" cellpadding=\"0\">"+
"<tbody>\n  <tr>\n\t<td align=\"left\">\n\t\tYourSearch Result <span class=\"yourSearchRange\" macro=\"yourSearc"+
"h itemRange\"></span>\n\t\t&nbsp;of&nbsp;<span class=\"yourSearchCount\" macro=\"yourSearch count\"></span>\n"+
"\t\tfor&nbsp;<span class=\"yourSearchQuery\" macro=\"yourSearch query\"></span>\n\t</td>\n\t<td class=\"yourSea"+
"rchButtons\" align=\"right\">\n\t\t<span macro=\"yourSearch chkPreviewText\"></span><span class=\"chkBoxLabel"+
"\">preview text</span>\n\t\t<span macro=\"yourSearch newTiddlerButton\"></span>\n\t\t<span macro=\"yourSearch openAllButton\"></span>\n\t\t<span macro=\"yourSearch lin"+
"kButton 'YourSearch Options' options 'Configure YourSearch'\"></span>\n\t\t<span macro=\"yourSearch linkB"+
"utton 'YourSearch Help' help 'Get help how to use YourSearch'\"></span>\n\t\t<span macro=\"yourSearch clo"+
"seButton\"></span>\n\t</td>\n  </tr>\n</tbody></table>\n\n<!-- The List of Found Tiddlers ================="+
"=========================== -->\n<div id=\"yourSearchResultItems\" itemsPerPage=\"25\" itemsPerPageWithPr"+
"eview=\"10\"></div>\n\n<!-- The Footer (with the Navigation) ==========================================="+
"= -->\n<table class=\"yourSearchFooter\" border=\"0\" width=\"100%\" cellspacing=\"0\" cellpadding=\"0\"><tbody"+
">\n  <tr>\n\t<td align=\"left\">\n\t\tResult page: <span class=\"yourSearchNaviBar\" macro=\"yourSearch naviBar"+
"\"></span>\n\t</td>\n\t<td align=\"right\"><span macro=\"yourSearch version\"></span>, <span macro=\"yourSearc"+
"h copyright\"></span>\n\t</td>\n  </tr>\n</tbody></table>\n<!-- end of the 'tiddlers found' case ========="+
"================================== -->\n</span>\n\n\n<!-- The \"No tiddlers found\" case ================="+
"========================== -->\n<span macro=\"yourSearch if not found\">\n<table class=\"summary\" border="+
"\"0\" width=\"100%\" cellspacing=\"0\" cellpadding=\"0\"><tbody>\n  <tr>\n\t<td align=\"left\">\n\t\tYourSearch Resu"+
"lt: No tiddlers found for <span class=\"yourSearchQuery\" macro=\"yourSearch query\"></span>.\n\t</td>\n\t<t"+
"d class=\"yourSearchButtons\" align=\"right\">\n\t\t<span macro=\"yourSearch newTiddlerButton\"></span>\n\t\t<span macro=\"yourSearch linkButton 'YourSearch Options'"+
" options 'Configure YourSearch'\"></span>\n\t\t<span macro=\"yourSearch linkButton 'YourSearch Help' help"+
" 'Get help how to use YourSearch'\"></span>\n\t\t<span macro=\"yourSearch closeButton\"></span>\n\t</td>\n  <"+
"/tr>\n</tbody></table>\n</span>\n\n\n<!--\n}}}\n-->\n";

config.shadowTiddlers["YourSearchItemTemplate"] = 
"<!--\n{{{\n-->\n<span class='yourSearchNumber' macro='foundTiddler number'></span>\n<span class='yourSea"+
"rchTitle' macro='foundTiddler title'/></span>&nbsp;-&nbsp;\n<span class='yourSearchTags' macro='found"+
"Tiddler field tags 50'/></span>\n<span macro=\"yourSearch if previewText\"><div class='yourSearchText' macro='fo"+
"undTiddler field text 250'/></div></span>\n<!--\n}}}\n-->";

config.shadowTiddlers["YourSearch"] = "<<tiddler [[YourSearch Help]]>>";

config.shadowTiddlers["YourSearch Result"] = "The popup-like window displaying the result of a YourSearch query.";

//----------------------------------------------------------------------------
// Install YourSearch
//----------------------------------------------------------------------------

// Overwrite the TiddlyWiki search handler and verify after a while 
// that nobody else has overwritten it.
config.macros.search.handler = myMacroSearchHandler;

var checkForOtherHijacker = function() {
	// Check that still our search handler is installed
    if (config.macros.search.handler != myMacroSearchHandler) {
    	alert(
"Message from YourSearchPlugin:\n\n\nAnother plugin has disabled the 'Your Search' features.\n\n\nYou may "+
"disable the other plugin or change the load order of \nthe plugins (by changing the names of the tidd"+
"lers)\nto enable the 'Your Search' features.");
    }
};

setTimeout(checkForOtherHijacker, 5000);

// === Public API =================================

abego.YourSearch.getStandardRankFunction = function() {
	return standardRankFunction;
};

abego.YourSearch.getRankFunction = function() {
	return abego.YourSearch.getStandardRankFunction();
};

abego.YourSearch.getCurrentTiddler = function() {
	return currentTiddler;
};

abego.YourSearch.closeResult = function() {
	closeResult();
};

// Returns an array of tiddlers that matched the last search
abego.YourSearch.getFoundTiddlers = function() {
	return lastResults;
};

// The last Search query (TiddlerQuery), or null
abego.YourSearch.getQuery = function() {
	return lastQuery;
};

abego.YourSearch.onShowResult = function(useOldResult) {
	highlightHack = lastQuery ? lastQuery.getMarkRegExp() : null;
	if (!useOldResult)
		pager.setItems(getLastResults());
	if (!resultElement) {
		resultElement = createTiddlyElement(document.body,"div",yourSearchResultID,"yourSearchResult");
	} else if (resultElement.parentNode != document.body) {
		document.body.appendChild(resultElement);
	}
	refreshResult();
	highlightHack = null;
};

})();
} // of "install only once"
// Used Globals (for JSLint) ==============

// ... JavaScript Core
/*global 	alert,clearTimeout,confirm */
// ... TiddlyWiki Core
/*global 	Tiddler, applyHtmlMacros, clearMessage, createTiddlyElement, createTiddlyButton, createTiddlyText, ensureVisible ,findPosX, highlightHack, findPosY,findWindowWidth, invokeMacro, saveChanges, refreshElements, story */
//}}}
/***
!Licence and Copyright
Copyright (c) abego Software ~GmbH, 2005-2010 ([[www.abego-software.de|http://www.abego-software.de]])

Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:

Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.

Redistributions in binary form must reproduce the above copyright notice, this
list of conditions and the following disclaimer in the documentation and/or other
materials provided with the distribution.

Neither the name of abego Software nor the names of its contributors may be
used to endorse or promote products derived from this software without specific
prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
DAMAGE.
***/
<!--
{{{
-->
<span macro="yourSearch if found">
<!-- The Summary Header ============================================ -->
<table class="summary" border="0" width="100%" cellspacing="0" cellpadding="0"><tbody>
  <tr>
	<td align="left">
		YourSearch Result <span class="yourSearchRange" macro="yourSearch itemRange"></span>
		&nbsp;of&nbsp;<span class="yourSearchCount" macro="yourSearch count"></span>
		for&nbsp;<span class="yourSearchQuery" macro="yourSearch query"></span>
	</td>
	<td class="yourSearchButtons" align="right">
		<span macro="yourSearch chkPreviewText"></span><span class="chkBoxLabel">preview text</span>
		<span macro="yourSearch newTiddlerButton"></span>
		<span macro="yourSearch openAllButton"></span>
		<span macro="yourSearch linkButton 'YourSearch Options' options 'Configure YourSearch'"></span>
		<span macro="yourSearch linkButton 'YourSearch Help' help 'Get help how to use YourSearch'"></span>
		<span macro="yourSearch closeButton"></span>
	</td>
  </tr>
</tbody></table>

<!-- The List of Found Tiddlers ============================================ -->
<div id="yourSearchResultItems" itemsPerPage="25" itemsPerPageWithPreview="10"></div>

<!-- The Footer (with the Navigation) ============================================ -->
<table class="yourSearchFooter" border="0" width="100%" cellspacing="0" cellpadding="0"><tbody>
  <tr>
	<td align="left">
		Result page: <span class="yourSearchNaviBar" macro="yourSearch naviBar"></span>
	</td>
	<td align="right"><span macro="yourSearch version"></span>, <span macro="yourSearch copyright"></span>
	</td>
  </tr>
</tbody></table>
<!-- end of the 'tiddlers found' case =========================================== -->
</span>


<!-- The "No tiddlers found" case =========================================== -->
<span macro="yourSearch if not found">
<table class="summary" border="0" width="100%" cellspacing="0" cellpadding="0"><tbody>
  <tr>
	<td align="left">
		YourSearch Result: No tiddlers found for <span class="yourSearchQuery" macro="yourSearch query"></span>.
	</td>
	<td class="yourSearchButtons" align="right">
		<span macro="yourSearch newTiddlerButton"></span>
		<span macro="yourSearch linkButton 'YourSearch Options' options 'Configure YourSearch'"></span>
		<span macro="yourSearch linkButton 'YourSearch Help' help 'Get help how to use YourSearch'"></span>
		<span macro="yourSearch closeButton"></span>
	</td>
  </tr>
</tbody></table>
</span>


<!--
}}}
-->
/***
!~YourSearchResult Stylesheet
***/
/*{{{*/
.yourSearchResult {
	position: absolute;
	width: 800px;

	padding: 0.2em;
	list-style: none;
	margin: 0;

	background: #ffd;
	border: 1px solid DarkGray;
}

/*}}}*/
/***
!!Summary Section
***/
/*{{{*/
.yourSearchResult .summary {
	color: #808080;
	border-bottom-width: thin;
	border-bottom-style: solid;
	border-bottom-color: #999999;
	padding-bottom: 4px;
}

.yourSearchRange, .yourSearchCount, .yourSearchQuery   {
	font-weight: bold;
}

.yourSearchResult .summary .button {
	font-size: 10px;

	padding-left: 0.3em;
	padding-right: 0.3em;
}

.yourSearchResult .summary .chkBoxLabel {
	font-size: 10px;

	padding-right: 0.3em;
}

/*}}}*/
/***
!!Items Area
***/
/*{{{*/
.yourSearchResult .marked {
	background: none;
	font-weight: bold;
}

.yourSearchItem {
	margin-top: 2px;
}

.yourSearchNumber {
	color: #808080;
}


.yourSearchTags {
	color: #008000;
}

.yourSearchText {
	color: #808080;
	margin-bottom: 6px;
}

/*}}}*/
/***
!!Footer
***/
/*{{{*/
.yourSearchFooter {
	margin-top: 8px;
	border-top-width: thin;
	border-top-style: solid;
	border-top-color: #999999;
}

.yourSearchFooter a:hover{
	background: none;
	color: none;
}
/*}}}*/
/***
!!Navigation Bar
***/
/*{{{*/
.yourSearchNaviBar a {
	font-size: 16px;
	margin-left: 4px;
	margin-right: 4px;
	color: black;
	text-decoration: underline;
}

.yourSearchNaviBar a:hover {
	background-color: none;
}

.yourSearchNaviBar .prev {
	font-weight: bold;
	color: blue;
}

.yourSearchNaviBar .currentPage {
	color: #FF0000;
	font-weight: bold;
	text-decoration: none;
}

.yourSearchNaviBar .next {
	font-weight: bold;
	color: blue;
}
/*}}}*/
/***
|Name|CheckboxPlugin|
|Source|http://www.TiddlyTools.com/#CheckboxPlugin|
|Documentation|http://www.TiddlyTools.com/#CheckboxPluginInfo|
|Version|2.4.0|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|Description|Add checkboxes to your tiddler content|
This plugin extends the TiddlyWiki syntax to allow definition of checkboxes that can be embedded directly in tiddler content.  Checkbox states are preserved by:
* by setting/removing tags on specified tiddlers,
* or, by setting custom field values on specified tiddlers,
* or, by saving to a locally-stored cookie ID,
* or, automatically modifying the tiddler content (deprecated)
When an ID is assigned to the checkbox, it enables direct programmatic access to the checkbox DOM element, as well as creating an entry in TiddlyWiki's config.options[ID] internal data.  In addition to tracking the checkbox state, you can also specify custom javascript for programmatic initialization and onClick event handling for any checkbox, so you can provide specialized side-effects in response to state changes.
!!!!!Documentation
>see [[CheckboxPluginInfo]]
!!!!!Revisions
<<<
2008.01.08 [*.*.*] plugin size reduction: documentation moved to [[CheckboxPluginInfo]]
2008.01.05 [2.4.0] set global "window.place" to current checkbox element when processing checkbox clicks.  This allows init/beforeClick/afterClick handlers to reference RELATIVE elements, including using "story.findContainingTiddler(place)".  Also, wrap handlers in "function()" so "return" can be used within handler code.
|please see [[CheckboxPluginInfo]] for additional revision details|
2005.12.07 [0.9.0] initial BETA release
<<<
!!!!!Code
***/
//{{{
version.extensions.CheckboxPlugin = {major: 2, minor: 4, revision:0 , date: new Date(2008,1,5)};
//}}}
//{{{
config.checkbox = { refresh: { tagged:true, tagging:true, container:true } };
config.formatters.push( {
	name: "checkbox",
	match: "\\[[xX_ ][\\]\\=\\(\\{]",
	lookahead: "\\[([xX_ ])(=[^\\s\\(\\]{]+)?(\\([^\\)]*\\))?({[^}]*})?({[^}]*})?({[^}]*})?\\]",
	handler: function(w) {
		var lookaheadRegExp = new RegExp(this.lookahead,"mg");
		lookaheadRegExp.lastIndex = w.matchStart;
		var lookaheadMatch = lookaheadRegExp.exec(w.source)
		if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
			// get params
			var checked=(lookaheadMatch[1].toUpperCase()=="X");
			var id=lookaheadMatch[2];
			var target=lookaheadMatch[3];
			if (target) target=target.substr(1,target.length-2).trim(); // trim off parentheses
			var fn_init=lookaheadMatch[4];
			var fn_clickBefore=lookaheadMatch[5];
			var fn_clickAfter=lookaheadMatch[6];
			var tid=story.findContainingTiddler(w.output);  if (tid) tid=tid.getAttribute("tiddler");
			var srctid=w.tiddler?w.tiddler.title:null;
			config.macros.checkbox.create(w.output,tid,srctid,w.matchStart+1,checked,id,target,config.checkbox.refresh,fn_init,fn_clickBefore,fn_clickAfter);
			w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;
		}
	}
} );
config.macros.checkbox = {
	handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		if(!(tiddler instanceof Tiddler)) { // if no tiddler passed in try to find one
			var here=story.findContainingTiddler(place);
			if (here) tiddler=store.getTiddler(here.getAttribute("tiddler"))
		}
		var srcpos=0; // "inline X" not applicable to macro syntax
		var target=params.shift(); if (!target) target="";
		var defaultState=params[0]=="checked"; if (defaultState) params.shift();
		var id=params.shift(); if (id && !id.length) id=null;
		var fn_init=params.shift(); if (fn_init && !fn_init.length) fn_init=null;
		var fn_clickBefore=params.shift();
		if (fn_clickBefore && !fn_clickBefore.length) fn_clickBefore=null;
		var fn_clickAfter=params.shift();
		if (fn_clickAfter && !fn_clickAfter.length) fn_clickAfter=null;
		var refresh={ tagged:true, tagging:true, container:false };
		this.create(place,tiddler.title,tiddler.title,0,defaultState,id,target,refresh,fn_init,fn_clickBefore,fn_clickAfter);
	},
	create: function(place,tid,srctid,srcpos,defaultState,id,target,refresh,fn_init,fn_clickBefore,fn_clickAfter) {
		// create checkbox element
		var c = document.createElement("input");
		c.setAttribute("type","checkbox");
		c.onclick=this.onClickCheckbox;
		c.srctid=srctid; // remember source tiddler
		c.srcpos=srcpos; // remember location of "X"
		c.container=tid; // containing tiddler (may be null if not in a tiddler)
		c.tiddler=tid; // default target tiddler 
		c.refresh = {};
		c.refresh.container = refresh.container;
		c.refresh.tagged = refresh.tagged;
		c.refresh.tagging = refresh.tagging;
		place.appendChild(c);
		// set default state
		c.checked=defaultState;
		// track state in config.options.ID
		if (id) {
			c.id=id.substr(1); // trim off leading "="
			if (config.options[c.id]!=undefined)
				c.checked=config.options[c.id];
			else
				config.options[c.id]=c.checked;
		}
		// track state in (tiddlername|tagname) or (fieldname@tiddlername)
		if (target) {
			var pos=target.indexOf("@");
			if (pos!=-1) {
				c.field=pos?target.substr(0,pos):"checked"; // get fieldname (or use default "checked")
				c.tiddler=target.substr(pos+1); // get specified tiddler name (if any)
				if (!c.tiddler || !c.tiddler.length) c.tiddler=tid; // if tiddler not specified, default == container
				if (store.getValue(c.tiddler,c.field)!=undefined)
					c.checked=(store.getValue(c.tiddler,c.field)=="true"); // set checkbox from saved state
			} else {
				var pos=target.indexOf("|"); if (pos==-1) var pos=target.indexOf(":");
				c.tag=target;
				if (pos==0) c.tag=target.substr(1); // trim leading "|" or ":"
				if (pos>0) { c.tiddler=target.substr(0,pos); c.tag=target.substr(pos+1); }
				if (!c.tag.length) c.tag="checked";
				var t=store.getTiddler(c.tiddler);
				if (t && t.tags)
					c.checked=t.isTagged(c.tag); // set checkbox from saved state
			}
		}
		// trim off surrounding { and } delimiters from init/click handlers
		if (fn_init) c.fn_init="(function(){"+fn_init.trim().substr(1,fn_init.length-2)+"})()";
		if (fn_clickBefore) c.fn_clickBefore="(function(){"+fn_clickBefore.trim().substr(1,fn_clickBefore.length-2)+"})()";
		if (fn_clickAfter) c.fn_clickAfter="(function(){"+fn_clickAfter.trim().substr(1,fn_clickAfter.length-2)+"})()";
		c.init=true; c.onclick(); c.init=false; // compute initial state and save in tiddler/config/cookie
	},
	onClickCheckbox: function(event) {
		window.place=this;
		if (this.init && this.fn_init) // custom function hook to set initial state (run only once)
			{ try { eval(this.fn_init); } catch(e) { displayMessage("Checkbox init error: "+e.toString()); } }
		if (!this.init && this.fn_clickBefore) // custom function hook to override changes in checkbox state
			{ try { eval(this.fn_clickBefore) } catch(e) { displayMessage("Checkbox onClickBefore error: "+e.toString()); } }
		if (this.id)
			// save state in config AND cookie (only when ID starts with 'chk')
			{ config.options[this.id]=this.checked; if (this.id.substr(0,3)=="chk") saveOptionCookie(this.id); }
		if (this.srctid && this.srcpos>0 && (!this.id || this.id.substr(0,3)!="chk") && !this.tag && !this.field) {
			// save state in tiddler content only if not using cookie, tag or field tracking
			var t=store.getTiddler(this.srctid); // put X in original source tiddler (if any)
			if (t && this.checked!=(t.text.substr(this.srcpos,1).toUpperCase()=="X")) { // if changed
				t.set(null,t.text.substr(0,this.srcpos)+(this.checked?"X":"_")+t.text.substr(this.srcpos+1),null,null,t.tags);
				if (!story.isDirty(t.title)) story.refreshTiddler(t.title,null,true);
				store.setDirty(true);
			}
		}
		if (this.field) {
			if (this.checked && !store.tiddlerExists(this.tiddler))
				store.saveTiddler(this.tiddler,this.tiddler,"",config.options.txtUserName,new Date());
			// set the field value in the target tiddler
			store.setValue(this.tiddler,this.field,this.checked?"true":"false");
			// DEBUG: displayMessage(this.field+"@"+this.tiddler+" is "+this.checked);
		}
		if (this.tag) {
			if (this.checked && !store.tiddlerExists(this.tiddler))
				store.saveTiddler(this.tiddler,this.tiddler,"",config.options.txtUserName,new Date());
			var t=store.getTiddler(this.tiddler);
			if (t) {
				var tagged=(t.tags && t.tags.indexOf(this.tag)!=-1);
				if (this.checked && !tagged) { t.tags.push(this.tag); store.setDirty(true); }
				if (!this.checked && tagged) { t.tags.splice(t.tags.indexOf(this.tag),1); store.setDirty(true); }
			}
			// if tag state has been changed, update display of corresponding tiddlers (unless they are in edit mode...)
			if (this.checked!=tagged) {
				if (this.refresh.tagged) {
					if (!story.isDirty(this.tiddler)) // the TAGGED tiddler in view mode
						story.refreshTiddler(this.tiddler,null,true); 
					else // the TAGGED tiddler in edit mode (with tags field)
						config.macros.checkbox.refreshEditorTagField(this.tiddler,this.tag,this.checked);
				}
				if (this.refresh.tagging)
					if (!story.isDirty(this.tag)) story.refreshTiddler(this.tag,null,true); // the TAGGING tiddler
			}
		}
		if (!this.init && this.fn_clickAfter) // custom function hook to react to changes in checkbox state
			{ try { eval(this.fn_clickAfter) } catch(e) { displayMessage("Checkbox onClickAfter error: "+e.toString()); } }
		// refresh containing tiddler (but not during initial rendering, or we get an infinite loop!) (and not when editing container)
		if (!this.init && this.refresh.container && this.container!=this.tiddler)
			if (!story.isDirty(this.container)) story.refreshTiddler(this.container,null,true); // the tiddler CONTAINING the checkbox
		return true;
	},
	refreshEditorTagField: function(title,tag,set) {
		var tagfield=story.getTiddlerField(title,"tags");
		if (!tagfield||tagfield.getAttribute("edit")!="tags") return; // if no tags field in editor (i.e., custom template)
		var tags=tagfield.value.readBracketedList();
		if (tags.contains(tag)==set) return; // if no change needed
		if (set) tags.push(tag); // add tag
		else tags.splice(tags.indexOf(tag),1); // remove tag
		for (var t=0;t<tags.length;t++) tags[t]=String.encodeTiddlyLink(tags[t]);
		tagfield.value=tags.join(" "); // reassemble tag string (with brackets as needed)
		return;
	}
}
//}}}
{{{
for f in *.jpg
do
    mv -n "$f" "$(exiftool -d "%Y%m%d_%H%M%S" -CreateDate "$f" | awk '{print $4".jpg"}')"
done
}}}
per
http://stackoverflow.com/questions/25152995/linux-shell-renaming-files-to-creation-time
http://alldayidreamaboutfood.com/2011/08/cinnamon-roll-scones-low-carb-and-gluten-free.html
http://ifood.tv/roll/450076-low-carb-copycat-cinnabon-cinnamon-rolls
http://www.tasteofhome.com/recipes/spinach-and-mushroom-smothered--chicken
http://thebusybroad.blogspot.com/2012/09/easy-low-carb-mozzarella-sticks.html

Cheddar Ranch Popcorn Chicken http://imgur.com/gallery/JC2Vo
http://www.plainchicken.com/2012/11/toasted-pecan-chicken.html
http://thecozyapron.com/coconut-crunch-chicken-strips/
http://www.cutthewheat.com/2015/04/stuffed-chicken-cordon-bleu-rolls-with-honey-mustard-sauce.html