Thursday, March 7, 2019

Addition Font


Shaping


When laying out text using a font file, the code points in the string are mapped one-to-one to glyphs inside the file. A glyph is a little picture inside the font file, and is identified by ID, which is a number from 0 - 65535. However, there’s a step after character mapping but before rasterization: shaping.

For example, one application of shaping is seen in Arabic text. In Arabic, each letter has four different forms, depending on which letters are next to it. For example, two letters in their isolated form look like ف and ي but as soon as you put them together, they form new shapes and look like في. This type of modification isn’t possible if characters are naively mapped to glyphs and then rasterized directly. Instead, there needs to be a step in the middle to modify the glyph forms so the correct thing is rasterized.

This “middle step” is called shaping, and is implemented by three tables inside the OpenType font file: GSUB, GPOS, and GDEF. Let’s consider GSUB alone.

GSUB


The GSUB table, or “glyph substitution” table, is designed to let font authors replace glyphs with other glyphs. It describes a transformation where the input is a sequence of glyphs and the output is a different sequence of glyphs. It is made up of a collection of constituent “lookup tables,” each of which has a “type.”

Type 1 (“single substitution”) provides a map from glyph to glyph. This is used for example, when someone enables the ‘swsh’ feature, the font can substitute out the ampersand with a fancy ampersand. In that situation, the map would contain a mapping from the regular ampersand to the fancy ampersand (possibly in addition to some more additional mappings, too).

Type 2 (“multiple substitution”) provides a map from glyph to sequence-of-glyphs. This is used, for example, if diacritic (accent) marks are represented as separate glyphs inside the font. The font can replace the “è” glyph with the “e" glyph followed by the ◌̀ glyph (and then the GPOS table later can position the two glyphs physically on top of each other).

Type 4 (“ligature substitution”) provides a map of sequence-of-glyphs to single glyph (the opposite of type 2). This is used for ligatures, so if you have a fancy “ffi” ligature, you can represent all three of those letters in the same fancy glyph.

Type 5 (“contextual substitution”) is special. It doesn’t do any replacements directly, but instead maps a sequence of glyphs to a list of other tables that should be applied at specific points in the glyph sequence. So it can say things like “in the glyph sequence ‘abcde’, apply table #7 at index 2, and then when you’re done with that, apply table #13 at index 4.” Tables #7 and #13 can be any of the types above, so you could use this table to say something like “swap out the ‘d’ for an ‘f’, but only if it appears in the sequence ‘abcde’.” This sort of thing is used to implement the “contextual alternates” feature.

There are also three other types, but they’re not particularly relevant, so I’m going to ignore them.

So, the inputs to the text system are a set of features and an input string of glyphs (The characters have already been mapped to glyphs via the “cmap” table). Features are mapped to a set of lookup tables, each of which is of a type listed above. Each of those lookup tables describes a map where the keys are sequences of glyphs, so the runtime iterates through the glyph sequence until it finds a sequence that’s an input to one of the tables. The runtime then performs that glyph replacement according to the rules of the tables, and continues iterating.

Turing Complete


So this is pretty cool, but it turns out that the contextual substitution lookup type is really powerful. This is because the table that it references can be itself, which means it can be recursive.

Let’s pretend we have a lookup table named 42 (presumably because it’s the 42nd lookup table inside the font), and it’s a contextual substitution lookup table. This table maps glyph sequences to tuples of (lookup table to recurse to, offset in glyph sequence to recurse). Let’s say we design it with these two mappings:

Table42 {
    A A : (Table42, 1);
    A B : (Table100, 1);
}

If the runtime is operating on a glyph sequence of “AAAAB”, the first two “AA”s will match the first rule, so then the system recurses and runs Table42 on the stream “AAAB”. Then these first two “AA”s will match, and so-on. This happens until you get to the end of the string, “AB” matches, and then Table100 is run on the string “B”.

This is “tail recursion,” and can be used to implement all different types of loops. Also, each mapping in the table acts as an “if” statement because it only executes if the pattern is matched.

You can use the glyph stream as memory by reading and writing to it; that is, after all, what the shaping algorithm is designed to do. You can delete a glyph by using Type 2 to map it to an empty sequence. You can insert a glyph by using Type 2 to map the preceding glyph to a sequence of [itself, the new glyph you want to insert]. And, once you’ve inserted a glyph, you can check for its presence by using the “if” statements described above.

So thats a pretty powerful virtual machine. I think the above is sufficient to prove Turing complete-ness.

Caveat


So it turns out the example (“Table42”) above doesn’t actually work in DirectWrite. This is because, in DirectWrite, inner matches have to be entirely contained within outer matches. So when the outer call to Table42 matched “AA”, the inner call to Table42 can only match within that specific “AA”. This means it’s impossible to, for example, find the first even glyphID and move it to the beginning. So, DirectWrite’s implementation isn’t Turing complete. However, it does work in HarfBuzz and CoreText, so those implementations are Turing complete.

But even in HarfBuzz and CoreText, there are hard limits on the recursion depth. HarfBuzz sets its limit to 6. Therefore, the above example will only work on strings of length 7 or fewer. HarfBuzz is open source, though, so I simply used a custom build of HarfBuzz which bumps up this limit to 4 billion. This let me recurse to my heart’s content. A limit of 6 is probably a good thing; I don’t think users generally expect their text engines to be running arbitrary computation during layout. But I want to go beyond it.

DSL


After making the above realizations, I decided to try to implement a nontrivial algorithm using only the GSUB table in a font. I wanted to try to implement addition. The input glyph stream would be of the form “=1234+5678=” and the shaping process would turn that string into “6912”.

When thinking about how to do this, I started jotting down some ideas on paper for what the lookup tables should be, and the things I were writing down were very similar to that “Table42” example above. However, writing down tables of types 1, 2, and 4 was quite cumbersome, because what I really wanted to describe were things like “move this glyph to the beginning of the sequence” rather than individual insertions or deletions.

I looked at the “fea” language, which is how these lookups are traditionally written by font designers. However, after reading the parser, it looks like it doesn’t support recursive or mutually-recursive lookups. So, I rolled my own.

So, I did what any good programmer does in this situation: I invented a new domain-specific language.

The DSL has two types of statements. The first is a way of giving a set of glyphs a name. I wanted to be able to address all of the digits without having to write out every individual digit. So, there’s a statement that looks like this:

digit: 1 2 3 4 5 6 7 8 9 10;

Note that those numbers are glyph IDs, not code points. In my specific font, the “0” character is mapped to glyph 1, “1” is mapped to glyph 2, etc.

Then, you can describe a lookup using the syntax above:

digitMove {
    digit digit: (1, digitMove), (1, digitMove2);
    digit plus: (1, digitMove2);
}

The lookup is named digitMove, and it has two rules inside it. The first rule matches any two digits next to each other, and if they match, it invokes the lookup named digitMove (which is the name of the current lookup, so this is recursive) at index 1, and then after that, invokes the lookup named digitMove2 at index 1.

Each of these stanzas gets translated fairly trivially to lookup with type 5.

These rules are recursive, as above, but they need a terminal form so that the recursion will eventually end. Those are described like this:

flagPayload {
    digit digit plus digit: flag \3 \0 \1 \2;
}

This rule is a terminal because there are no parentheses on the right side of the colon. The right side represents a glyph sequence to replace the match with. The values on the right side are either a literal glyph ID, a glyph set that contains exactly one glyph, or a backreference which starts with a backslash. “\3” means “whatever glyph was third glyph in the matched sequence”. So the rule above would turn the glyph sequence “34+5” into the sequence “F534+”. (The flag glyph is read and removed in a later stage of processing).

Translating one of these rules to lookups is nontrivial. I tried a few things, but ended up with the following design:

For each output glyph, right to left:

  • If it’s a backreference, duplicate the glyph it’s referencing, and perform a sequence of swaps to move the new glyph all the way to the right.
  • If it’s a literal glyph, insert it at the beginning, and perform a sequence of swaps to move it all the way to the right.

This means we need to have a way to do the following operations:

  • Duplicate. This is a type 4 lookup that maps every glyph to a sequence of two of that glyph.
  • Swap. This has two pieces: a type 5 lookup that has a rule for every combination of two glyphs, and each rule maps each glyph to a lookup of type 1 which replaces it with the appropriate glyph. This means you need n of these inner (type 1) lookups, allowing you to map any glyph to any other glyph. However, the encoding format allows us to encode each of these inner lookups in constant space in the font, so these inner lookups don’t take that much space. Instead, the outer type 5 lookup takes n^2 space.
  • Insert a literal. If you implemented this by simply making a type 2 that mapped every glyph to that same glyph + the literal, you would need n^2 space because there would be n of these tables. Instead, you can cut down the size by doing it in two phases: inserting a flag glyph (which is O(n) space using a lookup type 2) and mapping that glyph to any constant value (also O(n) space using a type 1).

Above, I’m worried about space constraints in the file because pointers in the file are (in general) 2 bytes, meaning the maximum size that anything can be is 2^16. If n^2 space is needed, that means n can only be 2^8 = 256, which isn’t that big. Most fonts have on the order of 256 glyphs. Therefore, we need to reduce the places where we require O(n^2) space as much as possible. LookupType 7 helps somewhat, because it allows you to use 32-bit pointers in on specific place, but it only helps that one place.

My font only has 14 glyphs in it, so i didn’t end up near any of these limits, but it’s still important to watch out for out-of-bounds problems.

So, given all that, we can make a parser which builds an AST for the language, and we can build an intermediate representation which represents the bytes in the file, and we can make a lowering phase which lowers the AST to the IR. Then we can serialize the IR and write out the data to the file.

Addition


So, once the language was up and running, I had to actually write a program that represented addition. It works in four phases.

First, define some glyphs:

digit: 1 2 3 4 5 6 7 8 9 10;
flag: 13;
plus: 11;
equals: 12;
digit0: 1;

Then, parse the string. If the string didn’t match the form “=digits+digits=” then I wanted nothing to happen. You can do this by recursing across the string, and if you find that it matches the pattern, insert a flag, and then when all the calls return, move the flag leftward.

parse {
    equals digit: (1, parseLeft), (0, afterParse);
}

parseLeft {
    digit digit: (1, parseLeft), (0, moveFlagAcrossDigit);
    digit plus digit: (2, parseRight), (0, moveFlagAcrossPlus);
}

parseRight {
    digit digit: (1, parseRight), (0, moveFlagAcrossDigit);
    digit equals: flag \0 \1;
}

moveFlagAcrossDigit {
    digit flag digit: \1 \0 \2;
}

moveFlagAcrossPlus {
    digit plus flag digit: \2 \0 \1 \3;
}

afterParse {
    equals flag: (0, removeFlag), (0, startDigitMove);
}

removeFlag {
    equals flag: \0;
}

The next step is to pair up the glyphs. For example, this would turn “1234+5678” into “15263748+”.

startDigitMove {
    equals digit: (1, digitMove), (1, startPhase2), (0, removeEquals);
}

removeEquals {
    equals digit: \1;
}

digitMove {
    digit digit: (1, digitMove), (1, digitMove2);
    digit plus: (1, digitMove2);
}

digitMove2 {
    digit digit: (1, digitMove2), (0, swapDigits);
    digit plus digit: (2, digitMove2), (0, digitMove3);
    digit plus equals: digit0 \0 \1 \2;
    plus digit: (1, digitMove2), (0, swapPlusDigit);
    plus equals: digit0 \0 \1;
    digit equals: \0 \1;
}

swapDigits {
    digit digit: \1 \0;
}

digitMove3 {
   digit plus digit: \2 \0 \1;
}

swapPlusDigit {
    plus digit: \1 \0;
}

The next step is to see if there were any glyphs left over on the right side that didn’t get moved. This happens if the right side is longer than the left side. For example, if the input string is “12+3456” we now would have “1526+34”. We want to turn this into “03041526

startPhase2 {
    digit digit: (0, phase2), (0, beginPhase3);
}

phase2 {
    digit digit: (0, phase2Move), (0, checkPayload);
}

phase2Move {
    digit digit digit digit: (2, phase2Move), (0, movePayload);
    digit digit plus equals: \0 \1 \2 \3;
    digit digit plus digit: (3, payload), (0, flagPayload);
}

payload {
    digit digit: (1, payload), (0, swapDigits);
    digit equals: \0 \1;
}

flagPayload {
    digit digit plus digit: flag \3 \0 \1 \2;
}

movePayload {
    digit digit flag digit: \2 \3 \0 \1;
}

checkPayload {
    flag digit digit digit: (0, rearrangePayload), (0, phase2);
}

rearrangePayload {
    flag digit digit digit: digit0 \1 \2 \3;
}

The last step is to actually perform the addition. This works like a ripple carry adder. We want to take the glyphs two-at-a-time, and add them, and produce a carry. Then the next pair of glyphs will add, and include the carry. We start the process by introducing a carry = 0.

beginPhase3 {
    digit digit: (0, phase3), (0, removeZero);
}

phase3 {
    digit digit digit digit: (2, phase3), (0, addPair);
    digit digit plus equals: (0, insertCarry), (0, addPair);
}

insertCarry {
    digit digit plus equals: \0 \1 digit0;
}

removeZero {
    digit0 digit: (1, removeZero), (0, removeSingleZero);
}

removeSingleZero {
    digit0 digit: \1;
}

addPair {
    1 1 1: 1 1;
    1 1 2: 1 2;
    1 2 1: 1 2;
    1 2 2: 1 3;
    1 3 1: 1 3;
    1 3 2: 1 4;
    … more here
}

HarfBuzz


So I’m doing this whole thing using the HarfBuzz shaper, as described above. This is because it’s open source, so I can find where I’m hitting limits and increase the limits. It turned out that I not only had to increase the HB_MAX_NESTING_LEVEL to 4294967294, but I also was running into more limits. I ended up just taking all the limits in hb-buffer.hh, hb-machinery.hh, and hb-ot-layout-common.hh and increasing them by a factor of 10.

There’s one more piece that was necessary to get it to work. Inside apply_lookup() in hb-ot-layout-gsubgpos.hh, there’s a section if (end <= int (match_positions[idx])). It looks to me like this section is detecting if a recursive call caused the glyph sequence to get shorter than the size of the match. Inside this block, it says  /* There can't be any further changes. */ break; which seems to stop the recursion (which seems incorrect to me, but I’m not a HarfBuzz developer, so I could be wrong). In order to get this whole system to work, I had to comment out the “break” statement.

So that’s it! After doing that, the system works, and the font correctly adds numbers. The font has 75 shaping rules and is 32KB large.

The glyph paths (contours) were taken from from the Retroscape font.

Font file download

69 comments:

  1. The current .otf file is rejected by "Font Validation" on Mac OSX 10.11.6 for three vague reasons: "name table usability," "sfnt required tables," and "name table structure." Do these vague complaints ring a bell for you? Is it possible to fix these issues and upload a new version of the .otf file that would be usable on Mac OSX?

    ReplyDelete
  2. interesting, need to take a closer look later on. the summer is coming in, so cya later on =)

    ReplyDelete
  3. Logo Design is fundamentally a corporate character of your organization, which will speak to you on any medium. No one is going to like you in the event that you have duplicated it elsewhere, infact it will contrarily promote your business. logo design service

    ReplyDelete
  4. Tongkat Ali: – Bluoxyn This outstanding compound executed in this supplement has the number one interest to enhance the same old sperm super. The nature of the sperm is anticipated via using recognition, quantity, and motility. These topics will have an impact on male fruitfulness. This compound triggers the feature era of testosterone.

    Read More About It >>> https://www.completefoods.co/diy/recipes/bluoxyn-male-enhancement-reviews

    ReplyDelete
  5. It isn’t suitable for pregnant ladies and breastfeeding mothers.

    Ketogeniks Keto Diet is thought to Ketogeniks be the useful weight reduction supplement it really is comprised of each unmarried not unusual thing so that you received’t confront any response. It is certainly free from artificial segments and fillers. You need to take the predetermined size to preserve you from unwanted issues. In the occasion which you face any symptom all through item utilization, at that point, you are name for no longer to make use of the object further. It is a solicitation to test the item mark in advance than buying on the net.
    Read News >> http://ketogeniksketoweb.mystrikingly.com/

    ReplyDelete
  6. Debbiesmiracles ck to what you do on a daily basis. If you do what you're supposed to do (eat right + exercise) day in a day out you will eventually lose all the you want. However, if you throw caution to the wind and don't do what you're supposed to do then you may never see your dreams come true. This my friend is the saddest scenario there is. If you're bored of being fat, if your tired of being over, if your ready to start your new life today then hold on because I am about to give you the simple yet extremely effective plan you've been waiting f.
    https://debbiesmiracles.com/
    https://paper.li/e-1581244226#/
    https://www.saatchiart.com/art/Video-Debbiesmiracles/1497669/7304751/view

    ReplyDelete

  7. Sharktankpedia straightforwardly with customers or patients in regards to their healthful needs. Abstaining from food lessens your caloric admission however practicing helps you blaze more calories. Eat less carbs misfortune is fundamental if corpulence is available. Consuming less calories is simpler than you ever en.
    https://sharktankpedia.org/
    https://paper.li/e-1581245426#/
    https://www.saatchiart.com/art/Video-Sharktankpedia-Fitness-Blog/1497677/7304815/view

    ReplyDelete
  8. Governmenthorizons nd diet fat is not simply "disappearing" off your body. What occurs is a form change, just like water and steam. The glucose and sugar that is harnessed from carbohydrates are the first fuel sources. Once the glucose runs out, fat takes over. Your body is a constant interconnected conveyor belt that removes essential nutrients from the fat and delivers them to specific body parts. Hormones that .
    https://www.governmenthorizons.org/
    https://paper.li/e-1581246800#/
    https://www.saatchiart.com/art/Video-Governmenthorizons-Fitness-Boys-andGirls/1497691/7304937/view

    ReplyDelete
  9. Autobodycu ory. Delaying the second stage allows for significant skin retraction and if a skin tightening procedure is desired it is likely to require smaller incisions. The Bottom Line? Being healthy has far greater importance than excess skin. Although, having excess skin can lead to some serious issues there are non-surgical ways of preventing infections such as keeping your excess skin dry. For those who are able and want to remove the excess skin, post-bariatric surgery is for you. It is important to remember that these procedures should only be considered after ones has stabilized; especially after surgery. This can range from - months af.
    https://www.autobodycu.org/
    https://paper.li/e-1581254466#/
    https://www.saatchiart.com/art/Collage-Autobodycu-Best-supplements-all-people/1497795/7305577/view

    ReplyDelete
  10. Surgenx Keto
    surgenX keto The Instant Pot's flexibility as a weight cooker, slow cooker, steamer, yogurt creator, and rice cooker makes it an unbelievably helpful multi-cooker apparatus that can be utilized to cook for all intents and purposes anything, and it's additionally the perfect machine for cooking anything keto. Keto in an Instant highlights more than 100 ketogenic plans all intended to be made in the Instant Pot. Every formula incorporates key wholesome information for keto devotees, just as clear, point by point guidelines for utilizing the Instant Pot to make the plans.
    http://ketoismiracle.com/surgenx-keto

    ReplyDelete
  11. Surgenx Keto
    There are an enormous number of organizations selling this type of exogenous surgenX keto, and this is the place we are seeing the large showcasing techniques and expansive cases about advantages. Starting now and into the foreseeable future, when we talk about surgenX keto supplements or exogenous surgenX ketos right now, be alluding to surgenX keto salts.If the enhancements do have the advantages that organizations guarantee they do.
    http://ketoismiracle.com/surgenx-keto

    ReplyDelete
  12. ketovatru review
    The word originates from the Greek, endon, which signifies "within".But researchers have likewise found an approach to regulate Ketovatrus to individuals, typically as a beverage, implying that you can bring Ketovatrus into your body from outside. These are exogenous Ketovatrus, which originates from the Greek word exo signifying "outside".
    http://ketoismiracle.com/ketovatru-review

    ReplyDelete
  13. ketovatru review
    In addition, where there's an obvious eating plan, there's money to be made. Along these lines, you can find an enormous number of overhauls fundamentally like this one on the web. In addition, we're going to see whether the Instant Keto Price unequivocally is maintained, paying little psyche to all the issue. Is there anything astonishing about this condition.
    http://ketoismiracle.com/ketovatru-review

    ReplyDelete
  14. Vixea ManPlus
    The equation attempts to treat the underlying drivers of erectile brokenness and guarantees the advancement of sharp climaxes. Expanded blood stream builds the limit of blood in the penile chamber and influences your sexual continuance and quality. It elevates your climax to fulfill sexual execution. The Vixea ManPlus additionally expands the degrees of testosterone in the body, which brings down your degree of sexual weariness and normally improves sexual execution and natural working. It invigorates you the you have to accomplish a solid and enduring erection and makes your muscles solid and lasting.As I referenced previously, our equation is simply produced using characteristic fixings.

    ReplyDelete
  15. Scandal Full Episodes I honestly don't feel sorry for Boniswa, I'll never forgive her for what she's doing to Chumani!! 😤😤Thembeka and Mthunzi must finish her..after that Thembeka must finish MthunziTibi is just too sweet he gets straight to my heart Tibi’s PRAYER, got me emotional 😭 Watching from Botswana 🇧🇼Stokkies must learn to shut it, his face-PRICELESS!! Xolile and Romeo have literally had the longest honeymoon 🙄 they should be back Xolile and romeo's child is very lucky to be born into 2 rich families😇😇Xolile is hella annoying🙄 everything is about her,her,her,her,sheeeeshRomeo

    ReplyDelete
  16. You are very articulate and explain your ideas and opinions clearly leaving no room for miscommunication.
    Please Kindly check My web: buy youtube comments

    ReplyDelete
  17. This Bioviderma Serum mill for all skin kind in comparable effects. This forecast is stoned with fait accompli which are boon for Bioviderma Serum the pores and skin. All the pores and pores and skin problems can be sorted out by way of electricity simply applying this unbiased every day day and night time. Prearranged a some days you could study saunter your pores and pores and skin is getting tight and features, wrinkles are vanishing slowly.
    Read More>>> https://www.completefoods.co/diy/recipes/bioviderma-serum-does-it-really-work-read-review-before-buy

    https://sites.google.com/site/biovidermaserum/

    ReplyDelete
  18. These are which may be for your adipose tissues.
    As those fat release into the bloodstream, the glucose tiers of the blood drop.
    At the same time, the lipid tiers increase.
    Owing to most of those strategies, Ultra Pure 360 Keto the body well-known out that there are more fats available therefore it need to truly use fats as a supply for energy. This may be on the identical time as ketosis begins offevolved, and the breakdown of carbs becomes outstanding inside the complete frame.

    Read More>>> https://sites.google.com/site/ultrapure360ketonew/

    https://www.completefoods.co/diy/recipes/ultra-pure-360-keto-throw-all-extra-fat-pounds-right-away

    ReplyDelete
  19. Advanced Keto Plus And, Advanced Keto Plus Diet Increment allows forgather get into and act in acetone! So, that’s why so numerous optimistic reviews are out on this manufacturing. Now, you may attempt it for yourself through clicking above!


    READ MORE >>>>> https://www.completefoods.co/diy/recipes/advanced-keto-plus-does-its-really-works-truth-here

    http://advancedketoplus.mystrikingly.com/

    ReplyDelete

  20. Where to Buy Ascension Keto Pill?
    Ascension Keto While surgical procedure and gym are highly-priced opportunities, the use of a dietary complement is comparatively extra low priced. You can get Ascension Keto by means of traveling the web internet site and determining upon the variety of bottles you need. After choosing the amount, pay for the bottles together with your credit score card then select the shipping technique of your desire. Ascension Keto will be despatched to your own home in just 3 days.


    READ MORE >>>> https://www.completefoods.co/diy/recipes/ascension-keto-reviews-2020-does-it-really-work

    http://ascensionketo.mystrikingly.com/

    ReplyDelete
  21. Any Side Effects?
    Primal Grow Pro Primal Grow Pro is definitely ok for use. It consists of a hundred% regular natural components. It has been clinically tried by way of experts and gained’t bring about any adverse affects.


    READ MORE >>>> https://www.completefoods.co/diy/recipes/what-is-primal-grow-pro-read-benefits

    https://sacolekqualwas.hatenablog.com/entry/Primal_Grow_Pro

    ReplyDelete
  22. Magnolia Keto
    Review:
    My call is Roxy, and I am 32 years of age. Because of my excessive frame weight, I couldn’t most in all likelihood wear the ideal dress. I turned into distressed and careworn as a consequence of my frame shape. I tried with a few improvements, but, none of them deliver me exquisite effects. At closing, I came to think about Magnolia Keto that is view as the fine complement for my weight reduction standards. I commenced to utilize the enhancement typically and were given fine outcomes. I turned into extraordinarily content with my object. Obviously, I can equipped to wear any closets like thin fit pants, famous dress things, and tights efficaciously than at any time in latest reminiscence. I additionally prescribe the object for other people, who're experiencing corpulence issue like me.


    READ MORE >>>>> https://www.completefoods.co/diy/recipes/magnolia-keto-is-it-1-keto-diet-pills-burn-fat-fast

    https://joveswerse.hatenablog.com/entry/Magnolia_Keto

    ReplyDelete
  23. Biolife Keto Témoignage client
    Marrone: Biolife Keto Boost Diet me permet de franchir une étape dans la perte de poids. Avant d'obtenir ce supplément, je pense que la réduction de poids est un peu dans ma main, mon collègue qui a utilisé ce produit ou obtenir les avantages est recommandé de faire ou de dire que c'est ce produit qui vous donnera beaucoup ou ne vous apportera jamais rien. Merci au régime Keto rendre ma vie plus attrayante ou agréable.


    READ MORE >>>> https://www.completefoods.co/diy/recipes/biolife-keto-estce-que-ces-pilules-keto-fonctionnent-vraiment-acheter

    http://biolifeketo.mystrikingly.com/

    ReplyDelete
  24. Vital Alpha Testo In case, you have any confusion regarding the overall performance of the nutritional complement or concerning the conditions and policies, then it’s viable to seek advice from the business enterprise every time for the duration of their purchaser care. Quite pleasant associates are there inside the consumer service your solution your queries pretty quick and in a well mannered way.

    It’s the time to Purchase Vital Alpha Testo, and You shouldn’t experience ashamed anymore but you need to revel in your existence to the pleasant diploma.


    READ MORE >>>> https://www.completefoods.co/diy/recipes/vital-alpha-testo-canada-is-it-scam-or-not-reviews

    http://vitalalphatesto2020pills.mystrikingly.com/

    ReplyDelete
  25. Biolife Keto Effets secondaires du régime!
    Biolife Keto Comme avec n'importe quel post-scriptum, vous vous demandez peut-être la personnalité d'un signe de puissance agile. Lisse, comme nous l'avons dit ci-dessus, il n'y a pas de Biolife Keto Take Effects. Donc, c'est une région de la bonté. Mais, cela ne signifie pas non plus que vous êtes complètement hors de géom. S'il vous plaît, faites preuve de prudence et payez à la manière dont cela vous rend sain d'esprit. Si vous vous déplacez à l'ortie chaque fois que vous les accomplissez, kibosh les dinky. C'est un trait systémique droit.


    READ MORE >>>> https://www.completefoods.co/diy/recipes/biolife-keto-lire-les-ingrdients-et-les-avis-ctose

    http://biolifeketodiet.mystrikingly.com/

    ReplyDelete
  26. Keto Fab FAQs
    Are there any negative consequences of Keto Fab?
    Far and extensive, there isn't always anything awful from the Keto Fab. It’s been made with the natural and natural compounds which have notable great. Also, it’s accepted by means of the health professionals, and they pretty advocate this complement for weight reduction.


    READ MORE >>>> https://www.completefoods.co/diy/recipes/keto-fab-1-weight-loss-diet-pills-price-where-to-buy

    http://ketofab.mystrikingly.com/

    ReplyDelete
  27. Keto Lyte All you get to do is faucet any illustration in this writer. If you don’t see their internet site, it essence you waited too perdurable. So, don’t permit that hit to you! Tap any simulacrum in this soft to get started disconcert fats. You’ll intercourse your new embody earlier than you sheet brook it!

    READ MORE >>>> https://www.completefoods.co/diy/recipes/keto-lyte-an-effective-natural-remedy-to-lose-weight-fast

    http://ketolytediet.mystrikingly.com/

    ReplyDelete
  28. Vitrexotin How Does Vitrexotin Work?
    Vitrexotin is a male enhancement equation this is uncommonly supposed for men to construct charisma and sexual need. This marvelous enhancement will enable you to get lower back your virility in a brief span. Ordinarily, it's miles outlandish for men to recapture sexual strength due to severa additives. Vitrexotin will intensify your sexual presentation and empower to meet the companion in mattress.


    READ MORE >>>>> https://www.completefoods.co/diy/recipes/vitrexotin-review-best-way-to-boost-sex-drive-increase-muscle

    http://vitrexotinreviews.mystrikingly.com/

    ReplyDelete

  29. Green Coffee extract used on this supplement are not roasted as regular espresso beans. Brand new green coffee bean posses a trouble called Choloregnic acid. This is the element that is responsible for reducing your superior frame Rapid Boost Keto weight. This complement includes extra effective hassle like silicone dioxide and calcium carbonate.

    Calcium carbonate is introduced to make certain that inside the course of the period of your weight loss way you may in no way lousy from this. Many organs of the body earnings from calcium carbonate as muscle businesses, bones and worried device that also consists of your coronary coronary coronary heart. HCA extracts permits to block an enzyme appeared as citric lyase. This enzyme is liable for remodeling carbohydrates into Rapid Boost Keto fat. In this device fats within the shape of sweat releases out of the body, this is fairly everyday due to the fats flaming impact.

    ReplyDelete
  30. Ultra Trim Keto 7 Instructions For How To Use Ultra Trim Keto
    It is a decent and veritable enhancement to utilize; nonetheless, you have to address a few preventive estimates that are referenced underneath:

    • It is crucial to look for a expert recommendation before taking it
    • Depend simply on its counseled element rather than overdose
    • It isn’t supposed for people, who're under 18 years
    • Kids have to keep away from the span of the enhancement
    • In any occasion, in case you are going through any illness, at that factor, you need to droop it and visit the medicinal offerings grasp for brief assist
    • To preserve up the nature of the enhancement, it need to be positioned away in a groovy and dry spot
    • It need to be protected from the on the spot daytime


    READ MORE >>>> https://www.completefoods.co/diy/recipes/ultra-trim-keto-effective-new-formula-for-weight-loss

    http://ultratrimketo.mystrikingly.com/

    ReplyDelete
  31. Vitrexotin
    The dosage of this tablets is vital to comply with for it to expose it’s the effect. You must consume Vitrexotin tablets each day without lacking a single dosage, and you ought to eat it exactly as we are going to inform you or in a few cases, as your health practitioner will let you know.


    READ MORE >>>> https://www.completefoods.co/diy/recipes/vitrexotin-achieve-bigger-stronger-erections-naturally

    http://vitrexotinpillsreviews.mystrikingly.com/

    ReplyDelete
  32. Pure Sol Keto Side Effects or the Precautions for Gain from Pure Sol Keto
    Do not use in case you are allergic to any component noted above.
    Never attempt to exchange the dose amount without any prescription with the aid of the physician.
    In case of any intense reaction, cross at your physician first.
    No need to take this product if you are above than the 60 years or less than the 18 years.


    READ MORE >>>> https://www.completefoods.co/diy/recipes/pure-sol-keto-reviews-diet-pills-price-where-to-buy

    https://kojodbeents.hatenablog.com/entry/Pure_Sol_Keto

    ReplyDelete
  33. Hi! I really like your contentYour post is really informative. .Ignou Project
    .Ignou Synopsis

    ReplyDelete
  34. Camp is situated near river Ganga in a peaceful valley on the outskirts of Rajaji National Park. River Ganga is at just a minute walk from the camp.
    Rafting in Rishikesh-Bungee in Rishikesh-Paintball in Rishikesh-Trekking in Rishikesh-Resort package in Rishikesh-New Year Camping Package in Rishikesh 2021

    ReplyDelete
  35. Camp is situated near river Ganga in a peaceful valley on the outskirts of Rajaji National Park. River Ganga is at just a minute walk from the camp.
    rafting in rishikesh-Camping in Rishikesh-Bungee Jumping in Rishikesh-Trekking in Rishikesh-Paint Ball in Rishikesh- New Year Camping Package in rishikesh 2021

    ReplyDelete
  36. Camp is situated near river Ganga in a peaceful valley on the outskirts of Rajaji National Park. River Ganga is at just a minute walk from the camp.

    rafting in rishikesh-Adventure Package in Rishikesh-Bungee Jumping in Rishikesh-Paint Ball in Rishikesh-Resort in Rishikesh-Camping Packages in Rishikesh

    ReplyDelete
  37. Search engine optimization refers to optimizing a website to rank higher in search engines like Google, Yahoo & Bing. The major search engine namely Google uses more than 200 ranking factors to rank a website for search queries.

    SEO Service Provider in rishikesh-Website Designing in Rishikesh-SEO in rishikesh-SEO Company in Rishikesh

    ReplyDelete
  38. Best Dumpsand supplant our DES-1721 confirmation tutoring: Specialist - Implementation Engineer, SC Series Exam constantly, at that difficulty our hobby device will regularly shipping the contemporary-day and the quality precious DES-1721 examine guide for your email ultimately of the entire a 12 months after buy. We affirm you that our superior evaluation examine guide will provide you the substantial difficulty
    For More Info Visit Us >>>> https://dumpsboss.com/

    ReplyDelete
  39. ACSM Study Materials At for the exceptional credibility. CCNP Routing and Switching Practice Test – Prepare Completely You want to have to be sincerely prepared for the CCNP Routing and Switching exam as you will have to art work in real-life issues and you can’t discover the cash for to have a inclined challenge ..

    ReplyDelete
  40. AHIMA Study Materials You can constantly push beyond that to be triumphant with the RHIA however it could take a few greater paintings. Rome Wasn’t Built In A Day Remember that tremendous matters take time. And much like historic monuments took years of effort, certification isn't always clean. It isn't always constantly brief both. But it's far really well worth it! Our toolset lets in you to have interaction with an tremendous network of professional tech employees and upload to the communique at ExamTopics. If you've got ...
    For More Information Visit Us >>>> https://dumpsarena.com/vendor/ahima/

    ReplyDelete
  41. And validate inter-switch connectivity, which covers trunk ports, neighborhood VLAN, and 802.1Q; Configure and validate L2 discovery protocols; Configure and validate L2/L3 and EtherChannel; Explain the requirement for essential operations of Rapid PVST+ (Spanning Tree Protocol); ..
    AHLEI Study Materials

    ReplyDelete
  42. Alibaba Cloud mputing and it's been withinside the enterprise given that 2009. They exist as a department of Alibaba Group and are situated in Singapore, and feature information facilities in over 20 areas and greater than 60 availability zones round the sector. At present, they declare to have greater information .

    ReplyDelete
  43. Amazon Study Materials And the Certified Solutions Architect – Associate are without a doubt in which you want to start. From there, it’s feasible to byskip along statistics and make some stylish pointers, but identifying the right certification (or collection of certifications) and AWS reading direction in the long run comes ..

    ReplyDelete
  44. amazing website, this is really some good quality content. loved the way you explained through words keep writing the best article

    Happy Republic Day 2021

    best quality laptop ram brands
    tamilrockers
    movierulz
    intraharyana
    readerscook

    ReplyDelete
  45. A GREAT THANKS TO DR.WEALTHY FOR CURING ME FROM GENITAL HERPES I AM SO HAPPY TO GIVE THIS TESTIMONY ARE YOU SUFFERING FROM THIS SICKNESS HERE IS DR WHO CAN HELP
    I can’t believe my genital herpes is really cured, oh is by this time last year I start feeling bad about my life, I feel pain everyday of my life am very happy now that am really cured I couldn’t have do this on my own I wish is not God that help me with my helper I was searching the internet about this sickness last 3month when I found about great doctor wealthy, the man that keep his words I write the man email about my problem immediately I get a reply from him asking me to fill a form which I immediately did and send back to him after some mins he reply me that he have work on my cure that I need to provide some materials, which can enable him to work on my cure which I did on the next day of it, after some hours he inform me that he have getting the things needed for the cure and he is about to go on with the curing spell he called me again after 50mins that he is done with the cure that I should check my body and also go for test I cant believe I was negative a big thanks to him am very happy now with my family you can also get your self cured too from this sickness by contacting him through his email: wealthylovespell@gmail.com or whatapp +2348105150446 follow his instagram @wealthylovespell1 He also have a herbal cure for 7 other DISEASES;
    1.HIV
    2.SHINGLES
    3.VIRAL HEPATITIS
    4.INFLUENZA
    5.IMPOTENCE,
    6.BARENESS/INFERTILITY,
    7.ANTHRAX
    8 HPV
    Contact him today and you will have a testimony…Good luck!

    ReplyDelete

  46. britney spears keto : Figure out how to be sound and fit. Get wellbeing tips, activities and exercise tips to improve

    your exercise, diet intend to keep you fit.

    https://healthynutrishop.com/
    >

    ReplyDelete

  47. britney spears keto : Figure out how to be sound and fit. Get wellbeing tips, activities and exercise tips to improve

    your exercise, diet intend to keep you fit.

    https://healthynutrishop.com/
    >

    ReplyDelete
  48. I was depressed when doctor told me that I have been diagnosed with Herpes disease… I thought about my Family, I know my Family will face a serious problem when I'm gone, I lost hope and I wept all day, but one day I was searching the internet I found Dr.obudu contact number. +2349023428871 I called him and he guided me. I asked him for solutions and he started the remedies for my health. Thank God, now everything is fine, I'm cured by Dr.ezomo herbal medicine, I'm very thankful to Dr.obudu and very happy with my hubby and family. email him on drobuduherbalhome@gmail.com or you can also reach him through WhatsApp number+2349023428871 also visit hes websitehttps://drobuduherbalhome.wixsite.com/welcometoobuduherbal or visit his facebook page https://www.facebook.com/DR-OBUDU-101779795066025/
    He can also cure so many sickness
    {1}HIV And AIDS
    {2}Diabetes
    {3}Epilepsy
    {4}Blood Cancer
    {5}HPV
    {7}ALS
    {8}Hepatitis

    ReplyDelete
  49. thanks for providing such a great article, this article very helps full for me, a lot of thanks sir

    Best Design Company in India

    Top 10 Digital Marketing Company in India

    ReplyDelete
  50. Fantastic piece, well-tailored…. You sort of cleared my phobias… NowI can give it a shot… I pray I don’t run out of content!…a big kudos.

    Top HR Consulting Firms In Mumbai

    ReplyDelete
  51. Fantastic piece, well-tailored…. You sort of cleared my phobias… NowI can give it a shot… I pray I don’t run out of content!…a big kudos

    Campus Learning Management System


    Cheap LMS Software

    ReplyDelete
  52. Thank GOD for My Life, i am so glad to writing this article today to tell the world how Dr oso cured my HSV VIRUS, I have been detected with HSV-1 AND HSV-2 since 2 years ago, ever since then my life has been in complete bizarre and agony, i have used so many drugs that was prescribed to me by several doctors, but it didn't cure my HSV VIRUS neither did it reduce the pain, until a certain i was checking for solution in the internet, then miraculously came across Dr oso the powerful herbalist that cure numerous individuals HSV-1 AND HSV-2 INFECTION, then i contacted his WhatsApp number at 2348162084839 or email: drosohaberhome@gmail.com i explained everything to him and he prepared a cure, that cure my HSV-1 AND HSV-2 disease totally after receiving his herbal medicine, so my friends viewers why wait and be suffer when there is someone like Dr OSO that can cure any disease HIV/ CANCER/ HEPATITIS B VIRUS, you can contact his via : drosohaberhome@gmail.com or WHATSAPP 2348162084839

    GOD BLESS YOU ALL? ..

    Here is the DR OSO

    https://sites.google.com/view/drosohaberhome/

    ..

    ReplyDelete

  53. I am so Happy to be writing this article in here, i am here to explore blogs forum about the wonderful and most safe cure for HERPES SIMPLEX VIRUS.I was positive to the Virus called HERPES and i lost hope completely because i was rejected even by my closet friends. i searched online to know and inquire about cure for HERPES and i saw testimony about DR Ebhota online on how he cured so many persons from Herpes Disease so i decided to contact the great herbalist because i know that nature has the power to heal everything. i contacted him to know how he can help me and he told me never to worry that he will help me with the natural herbs from God! after 2 days of contacting him, he told me that the cure has been ready and he sent it to me via FEDEX or DHL and it got to me after 4 days! i used the medicine as he instructed me (MORNING and EVENING) and i was cured! its really like a dream but i'm so happy! that's the reason i decided to also add more comment of Him so that more people can be saved just like me! and if you need his help,contact his Email: (drebhotasoltion@gmail.com) You can contact him on WhatsApp +2348089535482 /https://drebhotasolution.wixsite.com/drebhotaherbalhome / He also have the herb to cure difference cure for any sickness (1) HERPES,
    (2) DIABETES,
    (3) HIV&AIDS,
    (4) URINARY TRACT INFECTION,
    (5) HEPATITIS B,
    (6) IMPOTENCE,
    (7) BARENESS/INFERTILITY
    (8) DIARRHEA
    (9) ASTHMA..

    ReplyDelete
  54. My health was horrible before I decided to try the Protocol Of taking Dr. Ebhota pure herbal mixture. I felt there was no hope for my health and I was to try the Protocol, thinking it wouldn’t work because I have visited so many hospitals with the same result. However, I was convinced by an Instagram friend to try herbal medicine because I wanted to get rid of Herpes virus. The herbal mixture that was given to me was really quick and easy to take, within 2 week I was fully cured from Herpes. The herbal medicine really work and I will like to share this great doctor contact with you all by email him drebhotasolution@gmail.com WhatsApp +2348089535482 You won't regret it, I promise. ,,//

    ReplyDelete
  55. I have learned a lot from your article and I’m looking forward to apply

    Keyword research strategy

    Advantages Of Native App

    ReplyDelete
  56. Am really happy that i have been cured from HSV1&2 DISEASE with the herbal medicine of DR OLIHA have been suffering from this disease for a long time now without solution until i came across the email of this doctor who have cure so many people with his herbal medicine, i also choose to give him a chance to help me, he told me what to do and i kindly did it, and he gave me his herbal medicine and direct me on how to use it, i also follow his instructions for use and he ask me to go for a check up after 3 months which i did, to my greatest surprise my result came out as negative, i am really happy that there is someone like this doctor who is ready to help anytime any day. To all the readers and viewers that is doubting this testimony, stop doubting it and contact this doctor if you have any disease and see if he will not actually help you. I know that there are some people out there who are really suffering and hurting their family just because of these diseases. you can get to him through WhatsApp number:+2349038382931 he will help you out or email oliha.miraclemedicine@gmail .com

    ReplyDelete
  57. Herpes cure Testimony I was diagnose with Genital Herpes for the past 6 years and I have been searching for cure. I have several outbreaks on my back and it really affected me morally, I read a testimony on this platform of a lady from Nevada who was cured from Diabetes with Dr Moi Usman Herbal medicine including the doctor official email address. I contacted the doctor through his email, after much discussion and few questions he prepared the Herbal medicine and asked for my address which I received the Herbal medicine days later and with his prescription I drank the Herbal medicine for 3 weeks. After concluding the herbal medicine I went for test and my IgG result was confirmed Negative with no trace of the virus on my blood. Contact Dr Moi and be cured his email: dr_moisolutiontemple@yahoo.com Whatsapp him Directly Through +254772376126
    He has Herbal cure for Diabetes, Hepatitis, Heart diseases.
    Hypertension, Strokes and Liver disease,Fibroid,Cancer,Asthma,Leukemia, Epilepsy,Menopause diseases

    ReplyDelete
  58. Book your camping in rishikesh by Nakshatra Resort , This is one of the best luxury camping resort in rishikesh where you can book your camping package at best price . all cottage are luxurious with all modern amentias and facilities.

    It is situated at midst of the nature , just 08 km from laxman jhula badrinath road rishikesh uttarakhand , 240 km from delhi / Noida. It is family friendly luxury ac cottage resort in rishikesh for camping.
    for best packages you have to check rishikesh camping packages where you can best deal of this property.
    Riverside Camping in Rishikesh

    ReplyDelete
  59. Divine Architecture Studio in Dehradun is a firm of experienced professionals offering comprehensive services in architecture consultancy, landscapes, interior designing and in engineering in dehradun
    interior designer in dehradun

    ReplyDelete
  60. Fantastic article. This kind of content is enjoyable to read. PMI PMP

    ReplyDelete
  61. I appreciate the useful information you offered. Some useful information was offered by your N10-008 blog. Continue imparting.

    ReplyDelete
  62. RIP, looks like the comments section got spambotted. I wonder if some kind of autofiltering for links would help

    ReplyDelete
  63. Vegas79 là nhà cái uy tín hàng đầu Việt Nam. Vegas79.sale cung cấp đa dạng các sản phẩm cá cược hấp dẫn, bao gồm cá cược thể thao, casino trực tuyến, xổ số, lô đề,...

    ReplyDelete
  64. Thank you so much for sharing this valuable article. IMT Solved Project

    ReplyDelete
  65. nice information regards:- www.hevalrivercottage.com

    ReplyDelete
  66. https://hevalrivercottage.com/

    ReplyDelete