AyuRewards
Track Order
My Account
Reviews
  • ALL PRODUCTS
    • Bestsellers
      • Balaayah Black Gram Body Booster - Body Oil for Dry Skin
      • Yauvari Amplified Youth-Spring - Face Oil for Aging Skin
      • iYURA Day & Night Face Oil Duo
      • Sandalwood Rose Eye Butter
      • Manjish Glow Elixir - Night-Time Face Oil
      • Kesaradi Oil - Daily Face Oil
    • Skincare
      • FACE
      • HAIR
      • BODY
      • Relaxation Tools
      • Face Cleansers
      • Eye Care
      • Face and Body Scrubs
      • Toners and Mists
    • Educational Courses
      • About Courses
      • Shop Courses
    • iYURA
      • About iYURA
      • Shop All iYURA
      • Dig Deeper Into Each iYURA Product
      • Can't Decide? Meet our Ayurvedic Expert for a Product Recommendation!
    • Brands
    • New in Store
      • Golden Years Face Serum
      • Cerabuild
      • iYUlips: 100% Natural Ayurvedic Lip Balms
      • OptimaLIV
  • FACE
  • BODY
  • HAIR
    • Limp Hair
    • Dry Hair
    • Thinning Hair
    • Flaky Scalp
    • Shop All Hair Care
  • BESTSELLERS
    • Balaayah Black Gram Body Booster - Body Oil for Dry Skin
    • Yauvari Amplified Youth-Spring - Face Oil for Aging Skin
    • iYURA Day & Night Face Oil Duo
    • Sandalwood Rose Eye Butter
    • Manjish Glow Elixir - Night-Time Face Oil
    • Kesaradi Oil - Daily Face Oil
  • REVIEWS
  • Help Center
  • Contact Us
  • AyuRewards
  • Login
  • Refer & Get Discounts
  • Track Order
  • Help Center
  • Contact Us
  • +1(678)-498-7248 TAE WhatsApp
  • Accessibility
  • Consultation
  • United States (USD $)
The Ayurveda Experience
0
  • Help Center
  • Contact Us
  • +1(678)-498-7248
  • Accessibility
  • Consultation
  • TAE WhatsApp
The Ayurveda Experience
▼
0 items in shopping cart
  • ALL PRODUCTS
  • FACE
  • BODY
  • HAIR
  • BESTSELLERS
  • REVIEWS
  • Login / Create an account
  • Help Center
  • Contact Us
  • AyuRewards
  • Refer & Get Discounts
  • Track Order
ALL PRODUCTS
  • SHOP BY CATEGORY
  • Face Oils & Serums
  • Eye Care
  • Cleansers
  • Masks
  • Scrubs & Exfoliators
  • Toners & Mists
  • Creams & Concentrates
  • Lip Care
  • Night Routine
  • Massage Tools
  • Dietary Supplements
  • Ghee
  • Vegan
  • SHOP BY BRAND
  • iYURA | Authentic Ayurvedic Skincare | Premium & 100% Natural
  • Ajara | Ayurveda-inspired Daily Skin Care | 100% Natural
  • Ayuttva | Supplements & Foods
  • A. Modernica | Ancient Ayurvedic Ingredients + Modern Skin-Science
  • The Ayurveda Experience | Learn Ayurveda
  • SHOP BY CATEGORY
    • Face Oils & Serums
    • Eye Care
    • Cleansers
    • Masks
    • Scrubs & Exfoliators
    • Toners & Mists
    • Creams & Concentrates
    • Lip Care
    • Night Routine
    • Massage Tools
    • Dietary Supplements
    • Ghee
    • Vegan
  • SHOP BY BRAND
    • iYURA | Authentic Ayurvedic Skincare | Premium & 100% Natural
    • Ajara | Ayurveda-inspired Daily Skin Care | 100% Natural
    • Ayuttva | Supplements & Foods
    • A. Modernica | Ancient Ayurvedic Ingredients + Modern Skin-Science
    • The Ayurveda Experience | Learn Ayurveda
  • FACE
    • SHOP BY SKIN TYPE
    • Dry Skin
    • Sensitive Skin
    • Combination Skin
    • Oily Skin
    • Eye Care
    • SHOP BY CONCERN
    • Aging: Wrinkles & Fine Lines
    • Dryness & Dehydration
    • Acne & Impurities
    • Blemishes & Pigmentation
    • Crow's Feet & Eye Wrinkles
    • Dark Under-Eyes
    • Pores
    • Dullness
    • Excess Oil
    • SHOP BY CATEGORY
    • Oils and Serums
    • Eye Care
    • Cleansers
    • Masks
    • Scrubs & Exfoliators
    • Toners & Mists
    • Creams & Concentrates
    • Lip Care
    • Massage Tools
    • HELP ME CHOOSE
    • Product Recommendation
  • SHOP BY SKIN TYPE
    • Dry Skin
    • Sensitive Skin
    • Combination Skin
    • Oily Skin
    • Eye Care
  • SHOP BY CONCERN
    • Aging: Wrinkles & Fine Lines
    • Dryness & Dehydration
    • Acne & Impurities
    • Blemishes & Pigmentation
    • Crow's Feet & Eye Wrinkles
    • Dark Under-Eyes
    • Pores
    • Dullness
    • Excess Oil
  • SHOP BY CATEGORY
    • Oils and Serums
    • Eye Care
    • Cleansers
    • Masks
    • Scrubs & Exfoliators
    • Toners & Mists
    • Creams & Concentrates
    • Lip Care
    • Massage Tools
  • HELP ME CHOOSE
    • Product Recommendation
  • BODY
    • SHOP BY CATEGORY
    • Moisturizing Oils
    • Natural Deodorant Replacement
    • Foot Care
    • Massage Tools
    • SHOP BY CONCERN
    • Dryness & Dehydration
    • Dark Spots & Blemishes
    • Razor Burn
    • Sensitivity
    • HELP ME CHOOSE
    • Product Recommendation
  • SHOP BY CATEGORY
    • Moisturizing Oils
    • Natural Deodorant Replacement
    • Foot Care
    • Massage Tools
  • SHOP BY CONCERN
    • Dryness & Dehydration
    • Dark Spots & Blemishes
    • Razor Burn
    • Sensitivity
  • HELP ME CHOOSE
    • Product Recommendation
  • HAIR
    • SHOP BY HAIR TYPE
    • Dry, Rough
    • Thinning
    • Limp, Lifeless
    • No Volume
    • SHOP BY CONCERN
    • Volume
    • Hair Loss
    • Hair Thinning
    • Dandruff
    • HELP ME CHOOSE
    • Product Recommendation
  • SHOP BY HAIR TYPE
    • Dry, Rough
    • Thinning
    • Limp, Lifeless
    • No Volume
  • SHOP BY CONCERN
    • Volume
    • Hair Loss
    • Hair Thinning
    • Dandruff
  • HELP ME CHOOSE
    • Product Recommendation
  • BESTSELLERS
    • BESTSELLING FACE CARE
    • Rufolia Periorbital Eyemulsion
    • Yauvari Amplified Youth Spring
    • Manjish Glow Elixir
    • Day & Night Face Oil Duo
    • Sandalwood Rose Eye Butter
    • Kesaradi Brightening Face Oil
    • IncogniGlow Youth Burst Duo
    • BESTSELLING BODY CARE
    • Balaayah Black Gram Body Booster
    • Mehfranz Eternally Fragrant Body Massage Oil
    • Shamanri Young Energy Body Oil
    • BESTSELLING HAIR CARE
    • Keranya Pure Black Seed Potent Hair Potion
    • Ambhring Age Embrace Revitalizer and Hair Oil
    • HELP ME CHOOSE
    • Product Recommendation
  • BESTSELLING FACE CARE
    • Rufolia Periorbital Eyemulsion
    • Yauvari Amplified Youth Spring
    • Manjish Glow Elixir
    • Day & Night Face Oil Duo
    • Sandalwood Rose Eye Butter
    • Kesaradi Brightening Face Oil
    • IncogniGlow Youth Burst Duo
  • BESTSELLING BODY CARE
    • Balaayah Black Gram Body Booster
    • Mehfranz Eternally Fragrant Body Massage Oil
    • Shamanri Young Energy Body Oil
  • BESTSELLING HAIR CARE
    • Keranya Pure Black Seed Potent Hair Potion
    • Ambhring Age Embrace Revitalizer and Hair Oil
  • HELP ME CHOOSE
    • Product Recommendation
  • Skip to content
    Woman holding Balaayah Black Gram Body Booster
    The bottle held in two hands
    Bottle beside golden droplets of oil
    Applying the oil to neck and décolletage
    The bottle among floating amber droplets of oil
    Black gram lentils falling beside a copper bowl and the bottle
    Bottle with its printed outer tube
    Balaayah product image

    Image 1 of 8

    ★★★★★★★★★★ 4.3 Stars 400,000+ Bottles Sold Worldwide

    FOR SKIN THAT’S CHANGED AFTER 50

    Turn Low-Confidence Saggy, Crepey, Dry Skin on Your Arms & Legs into Firmer-Looking, Glossy, Velvet-Soft Skin

    Perimenopause and menopause bring a drop in collagen and lipids that once helped skin look firm and plump. Balaayah is a 100% natural body oil powered by Black Gram, the “Black Gold” of Ayurveda, a centuries-old ingredient prized for mature skin.

    Get Firmer-Looking Skin →
    • 30-Day Money-Back
      Guarantee
    • Free
      Shipping
    • Free
      Gift

    5 Reasons Women Over 50 Are Choosing The “Black Gold” Body Booster

    As skin starts to look less firm and feels drier with age, the look of sagging, crepey skin sets in. That’s why increasingly dry, less firm-looking skin needs richer body care. Women across 20+ countries have chosen Balaayah Black Gram Body Booster for firmer-looking, velvet-soft, intensely moisturised skin.

    01/05

    Firms the Look of Saggy, Crepey Arms and Legs

    An average face routine has multiple steps, while arms and legs get none, even though it’s the same skin, aging just the same. Balaayah ends that gap, firming the look of sagging, crepey skin so arms and thighs look tighter and smoother.

    Looks tighterOn arms and thighs, where skin can start to look less firm first.
    Looks smootherCrepey texture, visibly softened.
    Oil massaged into the upper arm and shoulder
    ★★★★★

    “the appearance of wrinkles and slackness on my arms and legs is gradually improving”

    I bought one recently and the feel was so good I bought two more. I haven’t even finished the first, but the appearance of wrinkles and slackness on my arms and legs is gradually improving. The scent is to my taste and I love it.

    Katie
    Verified
    GET THE FIRMED-LOOK →
    • 100% Natural
    • Vegan
    • Dermatologically Tested
    • No Added Synthetic Chemicals

    02/05

    Softens Rough Knees, Elbows and Heels

    Knees, elbows and heels are the places skin dries out first and stays dry longest, mostly because they get the least attention. Balaayah, massaged into the driest, most neglected areas, leaves skin velvety-soft to the touch with a healthy-looking glow.

    Velvety-softTo the touch, on the roughest patches.
    Healthy-looking glowWhere skin looked dull and dry.
    Oil massaged into the knee
    ★★★★★

    “very effective on aging dry skin especially on feet”

    This product was very effective on aging dry skin especially on feet. I am planning to buy this oil again and I highly recommend it for all men and female.

    Jayalakshmi
    Verified

    03/05

    Smooths the Look of the Neck & Décolletage

    The neck and chest are on show in almost every neckline, yet get less care than nearly any part of the body. Balaayah smooths the look of skin texture and reduces the appearance of fine lines, promoting a radiant, glossy finish. Smoother-looking skin, where every neckline shows it.

    Less Visible Fine LinesThe ones every neckline shows.
    Radiant, glossyA finish that shows, never a greasy one.
    The neck and décolletage
    ★★★★★

    “the appearance of fine neck lines stopped bothering me all day and my décolletage began to glow”

    For the last few years the appearance of dryness and fine lines on my neck stood out... I’d tried all sorts of creams and oils... I ordered this too, expecting nothing. Massaging my neck and décolletage after the bath, it sank in smoothly, non-greasy, so pleasant, and moist till the next morning... the appearance of fine neck lines stopped bothering me all day and my décolletage began to glow...I can confidently enjoy fashion that shows my neck and décolletage.

    Luna
    Verified
    GET A SMOOTHER-LOOKING NECKLINE →
    • Rooted in 5,000 Years of Ayurvedic Wisdom
    • Our Best-Loved Body Oil across the Asia, USA & Europe

    04/05

    Intense, Long-Lasting Moisturisation

    Skin loses lipids with age, and that’s why it feels dry again so quickly, no matter how often ordinary body lotion is applied. Balaayah is an ultra-rich but non-sticky oil that keeps skin moisturised long after it’s applied. Richer care for that kind of loss.

    Ultra-richRich in the palm, long after it is applied.
    Non-stickyNo film, no transfer, no fade by morning.
    Drops of the oil beside the bottle
    ★★★★★

    “provides both moisture and hydration”

    Excellent products! Been using the products for about 2 weeks, it’s dual effect that provides both moisture and hydration has been easily absorbed and leaves skin glowing, yet non sticky skin.❤️

    Christine
    Verified

    05/05

    Naturally Brewed and Never Greasy

    Most body oils are described as natural, but what really matters is how the ingredients are handled. Balaayah is inspired by a traditional Ayurvedic method, where herbs are slow-cooked into a base oil so their full character makes it into the formula. So that “natural” isn’t just a label.

    Slow-cookedHerbs cooked into the base oil, the Ayurvedic way.
    Full characterSo “natural” is a method, not a label.
    The bottle against a warm amber ground
    ★★★★★

    “non-greasy and so you can get dressed straight away”

    It is non-greasy and so you can get dressed straight away. It abosrbs and makes your skin soft and smells divine. I have had compliments every time I have used it. Well worth a try!

    Verified Buyer
    Verified

    The Ultimate Ultra-Rich, Non-Sticky Body Oil for Aging, Dry Skin

    An ultra-rich body oil — not the usual Moroccan, castor or almond. Balaayah is Ayurvedic artistry, led by Black Gram, the “Black Gold” prized for mature skin. It transforms the look of dry, aging skin, giving a firmer look and a velvety glow. Everything ordinary body care never was.

    Balaayah Black Gram Body Booster
    Introducing
    Balaayah Black Gram
    Body Booster
    Woman holding Balaayah Black Gram Body Booster
    Balaayah product image
    Bottle on marble beside a marigold surface
    Bottle beside droplets of golden oil
    Close-up of the pump
    Balaayah product image
    Applying to the leg
    Bottle held in two hands
    The bottle beside a pool of golden oil
    The bottle standing among amber droplets
    Two bottles lying side by side
    Balaayah product image
    Balaayah product image

    Image 1 of 13

    ★★★★★★★★★★4.3/5250,000+ Users Worldwide

    ★★★★★★★★★★4.3/5250,000+ Users Worldwide

    iYURA’s

    Balaayah Black Gram Body Booster

    For Firmer-Looking, Mochi-Soft Skin with a Velvety Glow · 100ml

    • Firms the look of saggy, crepey skin
    • Reduces the appearance of fine lines and wrinkles
    • 100% natural & vegan
    • Powered by Black Gram and 9 other Ayurvedic actives, crafted using traditional Ayurvedic methods.
    • Absorbs quickly to a non-greasy finish

    Limited time offer 🎁 Free gift: Mini Yauvari Youth Spring Black Gram-powered face oil that fights visible signs of aging

    Add to cart →
    • 30-Day Money-Back
      Guarantee
    • Free
      Shipping
    • Free
      Gift
    Guaranteed safe checkout — SSL encryption, privacy protected. Visa, Mastercard, Apple Pay, American Express, PayPal.

    A rich but non-sticky body oil for dry, aging skin, powered by Black Gram and 9 other Ayurvedic herbs. Absorbs quickly to a velvety finish, leaving skin intensely moisturised, softer to the touch, and firmer-looking with regular use.

    Naturally scented with warm vanilla and frankincense — no synthetic fragrance. Formulated to be used all over the body, ideally as an after-bath ritual.

    Made in the traditional Ayurvedic way, with a formula rooted in 5,000 years of practice.

    1. Step 1Pump out as many drops of the oil as you need for your moisturisation needs.
    2. Step 2Massage it all over the body with downward motions until the oil is absorbed.
    3. Step 3You can use it as a body mask before showering or as a moisturizer after showering.

    Fragrance profile
    Vanilla
    Fragrance ingredients
    Frankincense oil, vanilla oil
    Colour
    Light yellow
    Texture
    Rich, non-greasy, velvety finish

    Hero ingredients

    • Black GramVigna mungo
    • Velvet BeanMucuna pruriens
    • NutgrassCyperus rotundus

    Full List of Ingredients

    Sesamum Indicum [Sesame] Seed Oil, Sodium Chloride [Himalayan Rock Salt], Frankincense Oil, Vanilla Oil, Vigna Mungo [Black Gram] Seed Extract, Abutilon Indicum [Country Mallow] Extract, Cyperus Rotundus [Nut Grass] Tuber Extract, Ricinus Communis [Castor] Root Extract, Mucuna Pruriens [Velvet Bean] Seed Extract, Pluchea Lanceolata [Pluchea] Leaf Extract, Anethum Graveolens [Dill] Seed Extract.

    • Dermatologically tested
    • 100% natural
    • Vegan
    • No added synthetic chemicals
    • No added parabens
    • No mineral oil
    • Ayurvedic product

    Balaayah’s Black Gram-powered companion for the face. A rich, fast-absorbing Ayurvedic face oil formulated for dry, aging skin on the face, neck and décolleté.
    • Firms the look of saggy, crepey skin
    • Softens the appearance of fine lines

    iYURAAyurveda holds some of the most effective skincare formulations ever created — but many of them can feel heavy, unfamiliar, or hard to fit into a modern routine.

    iYURA takes those classical formulations and makes them work for the way people actually use skincare today. Rich formulas that absorb without residue. Traditional Ayurvedic actives without synthetic fillers. Authentic recipes made premium in texture, scent and finish — so you get the depth of Ayurveda without the compromise.

    Nothing comes close to what this “Black Gold” phenomenon has been doing!

    ★★★★★

    “fast, obvious results”

    I’ve never used a body-care oil with such fast, obvious results. It improved the look of my skin quickly, especially the appearance of the orange-peel texture, and made my skin look more elastic. Excellent!

    Carol
    Verified buyer
    ★★★★★

    “started to make my skin glow and look tighter”

    My skin is basically dry espy now that I am going 70. Black gram body oil started to make my skin glow and look tighter… I love the feeling!!! I am now on my second bottle.

    Maria
    Verified buyer
    ★★★★★

    “leaves the skin looking smooth, soft as silk”

    It is easy to use, I found that I prefer to put it on slightly damp skin… Its scent is gentle and it leaves the skin looking smooth, soft as silk and exceptionally pleasant!… I love them very much and I will definitely order more.

    Aricha
    Verified buyer
    ★★★★★

    “smoother-feeling, plumper-looking, younger-looking”

    It’s absorbed easily into the skin, smells wonderful and helps my skin feel smoother and look plumper and younger. I don’t know yet if it has any long lasting positive effects. But for now, I am pleasantly surprised.

    Vardit
    Verified buyer
    ★★★★★

    “after using one bottle, I noticed significant improvement”

    I have repurchased this Balaayah Moisturizing Oil many times already. I initially bought it to target the appearance of cellulite on my thighs, but after using one bottle, I noticed significant improvement in its appearance. I have already repurchased several bottles and will continue to use it consistently.

    Venus
    Verified buyer
    • 4.3 Stars
    • 250,000+ Happy Customers
    • 400,000+ Bottles Sold Worldwide

    There are so many body oils out there. What’s special about this one?

    This extraordinary concoction is a masterpiece of Ayurvedic artistry, it brings intensive powers of 10 herbs and takes the whole game of skincare several notches up.

    Black GramVigna mungo

    Prized in Ayurveda for mature skin, Black Gram helps skin look firmer, plumper and more youthful, with lasting moisture and a smoother-looking finish — the ingredient that makes Balaayah stand apart.

    Himalayan Rock Salt

    Himalayan Rock Salt is mineral-rich and known for its hydrate-moisturise-occlude ‘triple effect’ — drawing in moisture, helping skin hold onto it, and sealing it in. It softens rough patches, with the surface looking freshly smoothed.

    Velvet BeanMucuna pruriens

    True to its name — the ingredient behind Balaayah’s velvet-soft finish. Nourishing, cooling and smoothing the look of skin, Velvet Bean helps firm the look of skin and leaves it looking brightened and refreshed.

    NutgrassCyperus rotundus

    The natural brightener in Balaayah. Nutgrass helps skin tone look more even and clear, reduces the appearance of visible signs of aging, and gives a youthful glow that grows with regular use

    CastorRicinus communis root

    A traditional Ayurvedic ingredient for mature skin. Vata-balancing Castor Root helps skin look firmer and more youthful, and grounds Balaayah’s formula in Ayurveda’s long tradition of care for skin that’s changed with age.

    Sesame OilSesamum indicum

    The nourishing base of Balaayah. A light, non-clogging oil that blends seamlessly with every other active in the formula, keeping skin soft, moisturised, and gently glowing with a light Ayurvedic touch.

    Frankincense OilBoswellia carterii

    A warm, earthy aromatic with a functional role. Frankincense Oil is known to help skin look toned and add a firmer, lifted look — a natural fit for formulas made for mature skin.

    Country MallowAbutilon indicum

    Also called Bala, meaning strength, a quality this plant has long been associated with in traditional Ayurvedic body care, treasured for centuries in formulations made for aging skin. It is the herb Balaayah is named after.

    PlucheaPluchea lanceolata

    Known in Ayurveda as Rasna, classified as a Vata-pacifying herb in classical texts, Pluchea has been used in traditional body oil preparations for centuries — a supporting active in Balaayah’s blend.

    DillAnethum graveolens

    Known in Ayurveda as Shatapushpa, or “hundred-flowered,” a herb classified in classical texts for its warming, grounding qualities. Dill has been used in Ayurvedic body preparations across generations, bringing subtle depth to the formula.

    • Rooted in 5,000 Years of Ayurvedic Wisdom
    • 100% Natural
    • Vegan

    FAQs

    Made for skin that’s changed with age — drier, less firm-looking, no longer responding to lotion the way it once did. Suits all skin types, including sensitive. Not for skin that’s naturally oily and comfortable all day; this will feel richer than needed.

    Formulated specifically for mature, but works well on normal and combination skin too, especially in air conditioned environments and cooler months.

    Best massaged in after a bath or shower. Absorbs quickly and doesn’t transfer, so it can be worn under clothing during the day too.

    Results build with consistent use, with some changes noticed sooner than others.

    In 1 day★★★★★

    It’s not oily at all and absorb into the skin totally make it feel so smooth and moist the next day, love it❤️

    Raena
    Verified buyer
    In 2 weeks★★★★★

    Been using the products for about 2 weeks, it’s dual effect that provides both moisture and hydration... leaves skin glowing, yet non sticky skin.❤️

    Christine
    Verified buyer
    With continued use★★★★★

    After using one bottle, I noticed significant improvement. I have already repurchased several bottles and will continue to use it consistently.

    Hide Name
    Verified buyer

    No. Rich in the palm, but absorbs quickly to a velvety finish, with no oily residue, no sticky film, and no transfer to clothes or bedding.

    ★★★★★

    I like the product. It isnt oily, yet it moisturises well. The fragrance is very pleasant and my dry skin is looking good now.

    Gurcharan
    Verified buyer
    ★★★★★

    Product is as expected, not greasy and the skin absorbs it immediately. Leaving my skin soft and supple.

    Tita
    Verified buyer
    ★★★★★

    It’s not oily at all and absorb into the skin totally make it feel so smooth and moist the next day, love it❤️

    Raena
    Verified buyer

    Yes to both. Balaayah is 100% vegan and cruelty-free, made with no synthetic chemicals, no added parabens and no mineral oil. Neither the ingredients nor the finished product are tested on animals.

    Balaayah is backed by a 30-day money-back guarantee. If it isn’t the right fit, return it within 30 days of delivery for a full refund.

    Get a free gift and a 30-day money-back guarantee
    Shop now
    Lyog4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiAgIEJBTEFBWUFIIMK3IFRFQ0hOSUNBTCBCRUhBVklPVVIgRU5HSU5FIMK3IFVTQSBTVE9S RQogICBPbmx5IEVESVQgMDEgYmVsb3cgaXMgbWVhbnQgdG8gYmUgZWRpdGVkLiBFdmVyeXRoaW5nIGVsc2U6IGxlYXZlIGFsb25lLgogICDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZAgKi8KKGZ1bmN0aW9uKCl7CmlmKHdpbmRvdy5fX2JhbEJvb3RlZCl7cmV0dXJuO30gd2luZG93Ll9fYmFsQm9vdGVk PXRydWU7CmZ1bmN0aW9uIGJsb2NrKG5hbWUsZm4peyB0cnl7IGZuKCk7IH1jYXRjaChlKXsgaWYod2luZG93LmNvbnNvbGUpIGNvbnNvbGUud2FybignW0Jh bGFheWFoXSAnK25hbWUrJyBmYWlsZWQ6JyxlKTsgfSB9CgovKiDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKICAgRURJVCAwMSDCtyBJTUFH RSBGSUxFUyArIFNIT1BJRlkgSEFORExFUyAgKHRoZSBvbmx5IHN0b3JlLXNwZWNpZmljIHZhbHVlcykKICAgc3RvcmUgOiB0aGUgc3RvcmVmcm9udCB0aGUg cGFnZSBsaXZlcyBvbiAobm8gdHJhaWxpbmcgc2xhc2gpLgogICBjZG4gICA6IHdoZXJlIHRoZSBiYWwtKiBpbWFnZSBmaWxlcyBhcmUgaG9zdGVkLiBUaGV5 IGN1cnJlbnRseSBsaXZlIGluIHRoZQogICAgICAgICAgIFNHIHN0b3JlJ3MgRmlsZXMsIHNvIHRoaXMgaG90bGlua3MgdGhlbS4gSWYgeW91IHVwbG9hZCB0 aGVtIHRvIHRoZQogICAgICAgICAgIFVTIHN0b3JlLCBjaGFuZ2UgdG86IGh0dHBzOi8vdGhlYXl1cnZlZGFleHBlcmllbmNlLmNvbS9jZG4vc2hvcC9maWxl cy8KICAg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQICovCndpbmRvdy5CQUxfQ0ZHID0gewogIHN0b3JlOiAnaHR0cHM6Ly90aGVheXVydmVk YWV4cGVyaWVuY2UuY29tJywKICBjZG46ICAgJ2h0dHBzOi8vc2cudGhlYXl1cnZlZGFleHBlcmllbmNlLmNvbS9jZG4vc2hvcC9maWxlcy8nLAoKICBpbWc6 IHsKICAgIGNhcm91c2VsXzE6J2JhbC1zZy1jYXJvdXNlbC0wMS53ZWJwJywgY2Fyb3VzZWxfMjonYmFsLXNnLWNhcm91c2VsLTAyLndlYnAnLAogICAgY2Fy b3VzZWxfMzonYmFsLXNnLWNhcm91c2VsLTAzLndlYnAnLCBjYXJvdXNlbF80OidiYWwtc2ctY2Fyb3VzZWwtMDQud2VicCcsCiAgICBjYXJvdXNlbF81Oidi YWwtc2ctY2Fyb3VzZWwtMDUud2VicCcsIGNhcm91c2VsXzY6J2JhbC1zZy1jYXJvdXNlbC0wNi53ZWJwJywKICAgIGNhcm91c2VsXzc6J2JhbC1zZy1jYXJv dXNlbC0wNy53ZWJwJywgY2Fyb3VzZWxfODonYmFsLXNnLWNhcm91c2VsLTA4LndlYnAnLAogICAgcmVhc29uXzE6J2JhbC1yZWFzb24tMS53ZWJwJywgcmVh c29uXzI6J2JhbC1yZWFzb24tMi53ZWJwJywgcmVhc29uXzM6J2JhbC1yZWFzb24tMy53ZWJwJywKICAgIHJlYXNvbl80OidiYWwtcmVhc29uLTQud2VicCcs IHJlYXNvbl81OidiYWwtcmVhc29uLTUud2VicCcsCiAgICBnYWxsZXJ5XzE6J2JhbC1zZy1jYXJvdXNlbC0wMS53ZWJwJywgZ2FsbGVyeV8yOidiYWwtc2ct Z2FsbGVyeS0xMy53ZWJwJywKICAgIGdhbGxlcnlfMzonYmFsLXNnLWNhcm91c2VsLTAyLndlYnAnLCBnYWxsZXJ5XzQ6J2JhbC1zZy1jYXJvdXNlbC0wMy53 ZWJwJywKICAgIGdhbGxlcnlfNTonYmFsLXNnLWNhcm91c2VsLTA0LndlYnAnLCBnYWxsZXJ5XzY6J2JhbC1zZy1nYWxsZXJ5LTEyLndlYnAnLAogICAgZ2Fs bGVyeV83OidiYWwtc2ctY2Fyb3VzZWwtMDUud2VicCcsIGdhbGxlcnlfODonYmFsLXNnLWNhcm91c2VsLTA2LndlYnAnLAogICAgZ2FsbGVyeV85OidiYWwt c2ctY2Fyb3VzZWwtMDcud2VicCcsIGdhbGxlcnlfMTA6J2JhbC1zZy1jYXJvdXNlbC0wOC53ZWJwJywKICAgIGdhbGxlcnlfMTE6J2JhbC1zZy1nYWxsZXJ5 LTA5LndlYnAnLCBnYWxsZXJ5XzEyOidiYWwtc2ctZ2FsbGVyeS0xMC53ZWJwJywKICAgIGdhbGxlcnlfMTM6J2JhbC1zZy1nYWxsZXJ5LTExLndlYnAnLAog ICAgaG93dG9fMTonYmFsLWhvd3RvLTEud2VicCcsIGhvd3RvXzI6J2JhbC1ob3d0by0yLndlYnAnLCBob3d0b18zOidiYWwtaG93dG8tMy53ZWJwJywKICAg IGhvd3RvXzQ6J2JhbC1ob3d0by00LndlYnAnLCBob3d0b181OidiYWwtaG93dG8tNS53ZWJwJywgaG93dG9fNjonYmFsLWhvd3RvLTYud2VicCcsCiAgICBp bmdyZWRpZW50XzE6J2JhbC1pbmdyZWRpZW50LTEtYmxhY2stZ3JhbS53ZWJwJywKICAgIGluZ3JlZGllbnRfMjonYmFsLWluZ3JlZGllbnQtMi1oaW1hbGF5 YW4tcm9jay1zYWx0LndlYnAnLAogICAgaW5ncmVkaWVudF8zOidiYWwtaW5ncmVkaWVudC0zLXZlbHZldC1iZWFuLndlYnAnLAogICAgaW5ncmVkaWVudF80 OidiYWwtaW5ncmVkaWVudC00LW51dGdyYXNzLndlYnAnLAogICAgaW5ncmVkaWVudF81OidiYWwtaW5ncmVkaWVudC01LWNhc3Rvci53ZWJwJywKICAgIGlu Z3JlZGllbnRfNjonYmFsLWluZ3JlZGllbnQtNi1zZXNhbWUtb2lsLndlYnAnLAogICAgaW5ncmVkaWVudF83OidiYWwtaW5ncmVkaWVudC03LWZyYW5raW5j ZW5zZS1vaWwud2VicCcsCiAgICBpbmdyZWRpZW50Xzg6J2JhbC1pbmdyZWRpZW50LTgtY291bnRyeS1tYWxsb3cud2VicCcsCiAgICBpbmdyZWRpZW50Xzk6 J2JhbC1pbmdyZWRpZW50LTktcGx1Y2hlYS53ZWJwJywKICAgIGluZ3JlZGllbnRfMTA6J2JhbC1pbmdyZWRpZW50LTEwLWRpbGwud2VicCcsCiAgICBpeXVy YV9sb2dvOidiYWwtaXl1cmEtbG9nby53ZWJwJywgbWFkaHViYW5pX2RpdmlkZXI6J2JhbC1tYWRodWJhbmktZGl2aWRlci53ZWJwJywKICAgIHNlY3Rpb25f ZGl2aWRlcjonYmFsLWFydC1wYXR0ZXJuLndlYnAnLCBwYWNrXzE6J2JhbC1wYWNrLTEud2VicCcsIHBhY2tfMjonYmFsLXBhY2stMi53ZWJwJywKICAgIHBh cGVyOidiYWwtcGFwZXIud2VicCcsIHNhZmVfY2hlY2tvdXQ6J2JhbC1zYWZlLWNoZWNrb3V0LndlYnAnLCBzdGlja3lfYm90dGxlOidiYWwtc3RpY2t5LWJv dHRsZS53ZWJwJywKICAgIGFydF9zcHJheTonYmFsLWFydC1zcHJheS53ZWJwJywgYXJ0X2Jsb29tOidiYWwtYXJ0LWJsb29tLndlYnAnLCBhcnRfcGF0dGVy bjonYmFsLWFydC1wYXR0ZXJuLndlYnAnLAogICAgZm9udF9yZWd1bGFyOidiYWwtZm9udC0xLndvZmYyJywgZm9udF9pdGFsaWM6J2JhbC1mb250LTIud29m ZjInLCBmb250X2JvbGQ6J2JhbC1mb250LTMud29mZjInLAogICAgYnJhbmNoX3RleHR1cmU6J2JhbC1icmFuY2gtdGV4dHVyZS0xLndlYnAnCiAgfSwKCiAg LyogRURJVCAwMUIgwrcgU0hPUElGWSBQUk9EVUNUUyAoVVMgc3RvcmUpLiBMaXZlIHByaWNlcy92YXJpYW50cyBhcmUgZmV0Y2hlZAogICAgIGZyb20gPHN0 b3JlPi9wcm9kdWN0cy88aGFuZGxlPi5qczsgdGhlIGZhbGxiYWNrIGlzIG9ubHkgdXNlZCBpZiB0aGF0IGZhaWxzLiAqLwogIHByb2R1Y3Rfb25lX2JvdHRs ZTogICdpeXVyYS1iYWxhYXlhaC1ibGFjay1ncmFtLWJvZHktYm9vc3RlcicsCiAgcHJvZHVjdF90d29fYm90dGxlczogJ2l5dXJhLWJhbGFheWFoLWJsYWNr LWdyYW0tYm9keS1ib29zdGVyLXBhY2stb2YtMicsCiAgZmFsbGJhY2s6IHsKICAgIGN1cnJlbmN5OidVU0QnLAogICAgb25lOnsgaWQ6MzExMjgzODU0MjE0 MDYsIHByaWNlOjQ1MDAsIGNvbXBhcmU6MCwgICAgYXZhaWxhYmxlOnRydWUgfSwKICAgIHR3bzp7IGlkOjM5NTYyOTA3NTE3MTA1LCBwcmljZTo3MjAwLCBj b21wYXJlOjkwMDAsIGF2YWlsYWJsZTp0cnVlIH0KICB9Cn07CgovKiDilIDilIAgMSDCtyBpbWFnZXMsIGZvbnRzLCBsaXZlIHByb2R1Y3QgZGF0YSDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAg Ki8KYmxvY2soJ2Fzc2V0cycsZnVuY3Rpb24oKXsKICB2YXIgQz13aW5kb3cuQkFMX0NGRywgSU1HPUMuaW1nfHx7fSwgQ0ROPShDLmNkbnx8JycpLnJlcGxh Y2UoL1wvPyQvLCcvJyk7CiAgZnVuY3Rpb24gdShmaWxlKXsgcmV0dXJuIGZpbGUgPyBDRE4rZmlsZSA6ICcnOyB9CiAgd2luZG93LkJBTF9VUkw9dTsKICBk b2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcjYmFsIGltZ1tkYXRhLWJhbF0nKS5mb3JFYWNoKGZ1bmN0aW9uKGltKXsKICAgIHZhciBmPUlNR1tpbS5nZXRB dHRyaWJ1dGUoJ2RhdGEtYmFsJyldOwogICAgaWYoZil7IGltLnNyYz11KGYpOyB9CiAgICBlbHNlIHsgaW0ucmVtb3ZlQXR0cmlidXRlKCdzcmMnKTsgdmFy IGJveD1pbS5jbG9zZXN0KCcuaWNhcmQtaW0nKTsgaWYoYm94KSBib3guY2xhc3NMaXN0LmFkZCgnbm8taW1nJyk7IGltLnN0eWxlLmRpc3BsYXk9J25vbmUn OyB9CiAgfSk7CiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI2JhbCBpbWdbZGF0YS1iYWwtZmlsZV0nKS5mb3JFYWNoKGZ1bmN0aW9uKGltKXsgaW0u c3JjPXUoaW0uZ2V0QXR0cmlidXRlKCdkYXRhLWJhbC1maWxlJykpOyB9KTsKICB2YXIgdGV4PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdGVtVGV4Jyk7 CiAgaWYodGV4KXsgdGV4LnNldEF0dHJpYnV0ZSgnaHJlZicsdShJTUcuYnJhbmNoX3RleHR1cmUpKTsgdGV4LnNldEF0dHJpYnV0ZU5TKCdodHRwOi8vd3d3 LnczLm9yZy8xOTk5L3hsaW5rJywneGxpbms6aHJlZicsdShJTUcuYnJhbmNoX3RleHR1cmUpKTsgfQogIHZhciBzdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50 KCdzdHlsZScpOwogIHN0LnRleHRDb250ZW50PQogICAgIkBmb250LWZhY2V7Zm9udC1mYW1pbHk6J0xhcmtlbic7c3JjOnVybCgiK3UoSU1HLmZvbnRfcmVn dWxhcikrIikgZm9ybWF0KCd3b2ZmMicpO2ZvbnQtd2VpZ2h0OjQwMDtmb250LXN0eWxlOm5vcm1hbDtmb250LWRpc3BsYXk6c3dhcH0iKwogICAgIkBmb250 LWZhY2V7Zm9udC1mYW1pbHk6J0xhcmtlbic7c3JjOnVybCgiK3UoSU1HLmZvbnRfaXRhbGljKSsiKSBmb3JtYXQoJ3dvZmYyJyk7Zm9udC13ZWlnaHQ6NDAw O2ZvbnQtc3R5bGU6aXRhbGljO2ZvbnQtZGlzcGxheTpzd2FwfSIrCiAgICAiQGZvbnQtZmFjZXtmb250LWZhbWlseTonTGFya2VuJztzcmM6dXJsKCIrdShJ TUcuZm9udF9ib2xkKSsiKSBmb3JtYXQoJ3dvZmYyJyk7Zm9udC13ZWlnaHQ6ODAwO2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtZGlzcGxheTpzd2FwfSIrCiAg ICAiOnJvb3R7LS1pbWctc3ByYXk6dXJsKCIrdShJTUcuYXJ0X3NwcmF5KSsiKTstLWltZy1ibG9vbTp1cmwoIit1KElNRy5hcnRfYmxvb20pKyIpOy0taW1n LXBhdHRlcm46dXJsKCIrdShJTUcuYXJ0X3BhdHRlcm4pKyIpOy0tcGFwZXItaW1nOnVybCgiK3UoSU1HLnBhcGVyKSsiKX0iOwogIGRvY3VtZW50LmhlYWQu YXBwZW5kQ2hpbGQoc3QpOwp9KTsKCmJsb2NrKCdwcm9kdWN0cycsZnVuY3Rpb24oKXsKICB2YXIgQz13aW5kb3cuQkFMX0NGRywgRkI9Qy5mYWxsYmFja3x8 e307CiAgdmFyIENVUj0od2luZG93LlNob3BpZnkmJlNob3BpZnkuY3VycmVuY3kmJlNob3BpZnkuY3VycmVuY3kuYWN0aXZlKXx8RkIuY3VycmVuY3l8fCdV U0QnOwogIGZ1bmN0aW9uIG1vbmV5KGNlbnRzKXsKICAgIHZhciBzOwogICAgdHJ5eyBzPW5ldyBJbnRsLk51bWJlckZvcm1hdCgnZW4tVVMnLHtzdHlsZTon Y3VycmVuY3knLGN1cnJlbmN5OkNVUixjdXJyZW5jeURpc3BsYXk6J25hcnJvd1N5bWJvbCd9KS5mb3JtYXQoY2VudHMvMTAwKTsgfQogICAgY2F0Y2goZSl7 IHM9JyQnKyhjZW50cy8xMDApLnRvRml4ZWQoMik7IH0KICAgIHJldHVybiBDVVI9PT0nVVNEJyA/IHMgOiBzKycgJytDVVI7CiAgfQogIGZ1bmN0aW9uIHBp Y2tWYXJpYW50KHApewogICAgaWYoIXB8fCFwLnZhcmlhbnRzfHwhcC52YXJpYW50cy5sZW5ndGgpIHJldHVybiBudWxsOwogICAgcmV0dXJuIHAudmFyaWFu dHMuZmlsdGVyKGZ1bmN0aW9uKHYpe3JldHVybiB2LmF2YWlsYWJsZX0pWzBdfHxwLnZhcmlhbnRzWzBdOwogIH0KICBmdW5jdGlvbiBub3JtKHAsZmIpewog ICAgdmFyIHY9cGlja1ZhcmlhbnQocCk7CiAgICBpZighdikgcmV0dXJuIHtpZDpmYi5pZCxwcmljZTpmYi5wcmljZSxjb21wYXJlOmZiLmNvbXBhcmV8fDAs YXZhaWxhYmxlOmZiLmF2YWlsYWJsZSE9PWZhbHNlfTsKICAgIHJldHVybiB7aWQ6di5pZCxwcmljZTp2LnByaWNlLGNvbXBhcmU6di5jb21wYXJlX2F0X3By aWNlfHwwLGF2YWlsYWJsZTohIXYuYXZhaWxhYmxlfTsKICB9CiAgZnVuY3Rpb24gc2FtZVN0b3JlKCl7CiAgICB0cnl7IHJldHVybiBsb2NhdGlvbi5ob3N0 LnJlcGxhY2UoL153d3dcLi8sJycpPT09KEMuc3RvcmV8fCcnKS5yZXBsYWNlKC9eaHR0cHM/OlwvXC8vLCcnKS5yZXBsYWNlKC9ed3d3XC4vLCcnKTsgfWNh dGNoKGUpeyByZXR1cm4gZmFsc2U7IH0KICB9CiAgZnVuY3Rpb24gZmV0Y2hQKGhhbmRsZSl7CiAgICB2YXIgYmFzZSA9IHNhbWVTdG9yZSgpID8gJycgOiAo Qy5zdG9yZXx8JycpOwogICAgcmV0dXJuIGZldGNoKGJhc2UrJy9wcm9kdWN0cy8nK2hhbmRsZSsnLmpzJyx7Y3JlZGVudGlhbHM6J3NhbWUtb3JpZ2luJ30p CiAgICAgIC50aGVuKGZ1bmN0aW9uKHIpeyBpZighci5vaykgdGhyb3cgMDsgcmV0dXJuIHIuanNvbigpOyB9KS5jYXRjaChmdW5jdGlvbigpeyByZXR1cm4g bnVsbDsgfSk7CiAgfQogIGZ1bmN0aW9uIHJlbmRlcihvbmUsdHdvKXsKICAgIHZhciBvbmVIYXNEaXNjPW9uZS5jb21wYXJlPm9uZS5wcmljZSwgb25lU2F2 ZT1vbmVIYXNEaXNjP29uZS5jb21wYXJlLW9uZS5wcmljZTowLAogICAgICAgIG9uZVBjdD1vbmVIYXNEaXNjP01hdGgucm91bmQob25lU2F2ZSoxMDAvb25l LmNvbXBhcmUpOjA7CiAgICB2YXIgcmVmPXR3by5jb21wYXJlOyBpZihyZWY8PXR3by5wcmljZSkgcmVmPW9uZS5wcmljZSoyOwogICAgdmFyIHR3b1NhdmU9 cmVmLXR3by5wcmljZSwgdHdvUGN0PU1hdGgucm91bmQodHdvU2F2ZSoxMDAvcmVmKTsKICAgIHZhciBiMT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjYmFs IC5iYWwtcGFja1tkYXRhLXBhY2s9Im9uZSJdJyksCiAgICAgICAgYjI9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2JhbCAuYmFsLXBhY2tbZGF0YS1wYWNr PSJ0d28iXScpOwogICAgaWYoYjEpewogICAgICBiMS5xdWVyeVNlbGVjdG9yKCcuYmFsLXBhY2stYmxrJykuaW5uZXJIVE1MPQogICAgICAgIChvbmVIYXNE aXNjPyc8c3BhbiBjbGFzcz0iYmFsLXBhY2stc2F2ZSI+PGI+U2F2ZSAnK29uZVBjdCsnJTwvYj4nK21vbmV5KG9uZVNhdmUpKycgb2ZmPC9zcGFuPjxzcGFu IGNsYXNzPSJiYWwtcGFjay13YXMiPicrbW9uZXkob25lLmNvbXBhcmUpKyc8L3NwYW4+JzonJykrCiAgICAgICAgJzxzcGFuIGNsYXNzPSJiYWwtcGFjay1w Ij4nK21vbmV5KG9uZS5wcmljZSkrJzwvc3Bhbj4nOwogICAgICBiMS5zZXRBdHRyaWJ1dGUoJ2RhdGEtdmlkJyxvbmUuaWQpOyBiMS5zZXRBdHRyaWJ1dGUo J2RhdGEtYXZhaWxhYmxlJyxTdHJpbmcob25lLmF2YWlsYWJsZSkpOwogICAgICBpZighb25lLmF2YWlsYWJsZSl7IGIxLmRpc2FibGVkPXRydWU7IGIxLnNl dEF0dHJpYnV0ZSgnYXJpYS1kaXNhYmxlZCcsJ3RydWUnKTsgfQogICAgfQogICAgaWYoYjIpewogICAgICBiMi5xdWVyeVNlbGVjdG9yKCcuYmFsLXBhY2st YmxrJykuaW5uZXJIVE1MPQogICAgICAgICc8c3BhbiBjbGFzcz0iYmFsLXBhY2stc2F2ZSI+PGI+U2F2ZSAnK3R3b1BjdCsnJTwvYj4nK21vbmV5KHR3b1Nh dmUpKycgb2ZmPC9zcGFuPjxzcGFuIGNsYXNzPSJiYWwtcGFjay13YXMiPicrbW9uZXkocmVmKSsnPC9zcGFuPicrCiAgICAgICAgJzxzcGFuIGNsYXNzPSJi YWwtcGFjay1wIj4nK21vbmV5KHR3by5wcmljZSkrJzwvc3Bhbj4nOwogICAgICBiMi5zZXRBdHRyaWJ1dGUoJ2RhdGEtdmlkJyx0d28uaWQpOyBiMi5zZXRB dHRyaWJ1dGUoJ2RhdGEtYXZhaWxhYmxlJyxTdHJpbmcodHdvLmF2YWlsYWJsZSkpOwogICAgICBpZighdHdvLmF2YWlsYWJsZSl7IGIyLmRpc2FibGVkPXRy dWU7IGIyLnNldEF0dHJpYnV0ZSgnYXJpYS1kaXNhYmxlZCcsJ3RydWUnKTsgfQogICAgfQogICAgaWYoYjEmJmIyKXsgYjIuc2V0QXR0cmlidXRlKCdhcmlh LWNoZWNrZWQnLFN0cmluZyh0d28uYXZhaWxhYmxlKSk7IGIxLnNldEF0dHJpYnV0ZSgnYXJpYS1jaGVja2VkJyxTdHJpbmcoIXR3by5hdmFpbGFibGUpKTsg fQogICAgdmFyIGN0YT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnb2ItY3RhJyk7CiAgICBpZihjdGEpIGN0YS5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCcvY2Fy dC9hZGQ/aWQ9JysodHdvLmF2YWlsYWJsZT90d28uaWQ6b25lLmlkKSsnJnF1YW50aXR5PTEnKTsKICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1 c3RvbUV2ZW50KCdiYWw6cHJvZHVjdHMnKSk7CiAgfQogIHJlbmRlcihub3JtKG51bGwsRkIub25lfHx7fSksbm9ybShudWxsLEZCLnR3b3x8e30pKTsKICBQ cm9taXNlLmFsbChbZmV0Y2hQKEMucHJvZHVjdF9vbmVfYm90dGxlKSxmZXRjaFAoQy5wcm9kdWN0X3R3b19ib3R0bGVzKV0pLnRoZW4oZnVuY3Rpb24ocil7 CiAgICBpZihyWzBdfHxyWzFdKSByZW5kZXIobm9ybShyWzBdLEZCLm9uZXx8e30pLG5vcm0oclsxXSxGQi50d298fHt9KSk7CiAgfSk7Cn0pOwoKLyog4pSA 4pSAIDIgwrcgdW5kbyBaaXBpZnkgd3JhcHBlciBvdmVyZmxvdy90cmFuc2Zvcm0gKG5lZWRlZCBmb3Igc3RpY2t5ICsgcGlubmVkIGJvdHRsZSkg4pSA4pSA ICovCmJsb2NrKCdob3N0JyxmdW5jdGlvbigpewogIHZhciByb290PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYWwnKTsgaWYoIXJvb3QpIHJldHVybjsK ICBmdW5jdGlvbiBjbGVhcigpewogICAgdmFyIG49cm9vdC5wYXJlbnROb2RlLCBob3BzPTA7CiAgICB3aGlsZShuICYmIG4ubm9kZVR5cGU9PT0xICYmIG4h PT1kb2N1bWVudC5ib2R5ICYmIGhvcHMrKzwyNCl7CiAgICAgIHZhciBzPWdldENvbXB1dGVkU3R5bGUobik7CiAgICAgIGlmKHMub3ZlcmZsb3chPT0ndmlz aWJsZSd8fHMub3ZlcmZsb3dYIT09J3Zpc2libGUnfHxzLm92ZXJmbG93WSE9PSd2aXNpYmxlJyl7IG4uc3R5bGUuc2V0UHJvcGVydHkoJ292ZXJmbG93Jywn dmlzaWJsZScsJ2ltcG9ydGFudCcpOyB9CiAgICAgIGlmKHMudHJhbnNmb3JtIT09J25vbmUnKSBuLnN0eWxlLnNldFByb3BlcnR5KCd0cmFuc2Zvcm0nLCdu b25lJywnaW1wb3J0YW50Jyk7CiAgICAgIGlmKHMuZmlsdGVyIT09J25vbmUnKSBuLnN0eWxlLnNldFByb3BlcnR5KCdmaWx0ZXInLCdub25lJywnaW1wb3J0 YW50Jyk7CiAgICAgIGlmKHMucGVyc3BlY3RpdmUhPT0nbm9uZScpIG4uc3R5bGUuc2V0UHJvcGVydHkoJ3BlcnNwZWN0aXZlJywnbm9uZScsJ2ltcG9ydGFu dCcpOwogICAgICBpZihzLmNvbnRhaW4hPT0nbm9uZScpIG4uc3R5bGUuc2V0UHJvcGVydHkoJ2NvbnRhaW4nLCdub25lJywnaW1wb3J0YW50Jyk7CiAgICAg IGlmKHMud2lsbENoYW5nZSE9PSdhdXRvJykgbi5zdHlsZS5zZXRQcm9wZXJ0eSgnd2lsbC1jaGFuZ2UnLCdhdXRvJywnaW1wb3J0YW50Jyk7CiAgICAgIG4u Y2xhc3NMaXN0LmFkZCgnYmFsLWhvc3QnKTsKICAgICAgbj1uLnBhcmVudE5vZGU7CiAgICB9CiAgfQogIGNsZWFyKCk7IGFkZEV2ZW50TGlzdGVuZXIoJ2xv YWQnLGNsZWFyKTsgc2V0VGltZW91dChjbGVhciwxMjAwKTsKfSk7Cgp2YXIgUk09bWF0Y2hNZWRpYSgnKHByZWZlcnMtcmVkdWNlZC1tb3Rpb246IHJlZHVj ZSknKS5tYXRjaGVzOwoKLyog4pSA4pSAIDMgwrcgSDEgd29yZCByZXZlYWwgKyBzY3JvbGwgcmV2ZWFscyDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KYmxvY2soJ3JldmVhbHMnLGZ1bmN0 aW9uKCl7CiAgdmFyIGgxPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoMScpOwogIGlmKGgxJiYhUk0peyhmdW5jdGlvbiB3YWxrKG4pewogICAgW10uc2xp Y2UuY2FsbChuLmNoaWxkTm9kZXMpLmZvckVhY2goZnVuY3Rpb24oYyl7CiAgICAgIGlmKGMubm9kZVR5cGU9PT0zKXsKICAgICAgICB2YXIgZj1kb2N1bWVu dC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7CiAgICAgICAgYy50ZXh0Q29udGVudC5zcGxpdCgvKFxzKykvKS5mb3JFYWNoKGZ1bmN0aW9uKHQpewogICAg ICAgICAgaWYoIXQpcmV0dXJuOwogICAgICAgICAgaWYoL15ccyskLy50ZXN0KHQpKXtmLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHQp KTtyZXR1cm59CiAgICAgICAgICB2YXIgcz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7cy5jbGFzc05hbWU9J3cnOwogICAgICAgICAgdmFyIGk9 ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaScpO2kudGV4dENvbnRlbnQ9dDtzLmFwcGVuZENoaWxkKGkpO2YuYXBwZW5kQ2hpbGQocyk7CiAgICAgICAgfSk7 CiAgICAgICAgYy5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChmLGMpOwogICAgICB9IGVsc2UgaWYoYy5ub2RlVHlwZT09PTEpIHdhbGsoYyk7CiAgICB9KTsK ICB9KShoMSk7CiAgaDEucXVlcnlTZWxlY3RvckFsbCgnLnc+aScpLmZvckVhY2goZnVuY3Rpb24oZWwsaSl7ZWwuc3R5bGUudHJhbnNpdGlvbkRlbGF5PSgw LjA1K2kqMC4wMzIpKydzJ30pO30KICBpZignSW50ZXJzZWN0aW9uT2JzZXJ2ZXInIGluIHdpbmRvdyl7CiAgICB2YXIgaW89bmV3IEludGVyc2VjdGlvbk9i c2VydmVyKGZ1bmN0aW9uKGVzKXtlcy5mb3JFYWNoKGZ1bmN0aW9uKGUpewogICAgICBpZihlLmlzSW50ZXJzZWN0aW5nKXtlLnRhcmdldC5jbGFzc0xpc3Qu YWRkKCdpbicpO2lvLnVub2JzZXJ2ZShlLnRhcmdldCl9fSl9LAogICAgICB7dGhyZXNob2xkOi4xMixyb290TWFyZ2luOicwcHggMHB4IC02JSAwcHgnfSk7 CiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcucnYsLm1hc2ssLmRpdmlkZXIsI2gxJykuZm9yRWFjaChmdW5jdGlvbihlbCl7aW8ub2JzZXJ2ZShl bCl9KTsKICB9ZWxzZXtkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcucnYsLm1hc2ssLmRpdmlkZXIsI2gxJykuZm9yRWFjaChmdW5jdGlvbihlbCl7ZWwu Y2xhc3NMaXN0LmFkZCgnaW4nKX0pfQp9KTsKCi8qIOKUgOKUgCA0IMK3IGNhcm91c2Vsczogb25lIHNsaWRlIHBlciBzd2lwZSwgaW5maW5pdGUgbG9vcCwg YXV0b3BsYXkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCmZ1bmN0aW9uIHNsaWRlcihrZXksdGh1bWJzKXsKICB2YXIgdHJhY2s9ZG9jdW1lbnQuZ2V0 RWxlbWVudEJ5SWQoJ2Nhci0nK2tleSk7IGlmKCF0cmFjaylyZXR1cm47CiAgdmFyIHZpZXc9dHJhY2sucGFyZW50RWxlbWVudCwKICAgICAgaG9zdD1kb2N1 bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1kb3RzPSInK2tleSsnIl0nKSwKICAgICAgbGl2ZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2FyLScra2V5 KyctbGl2ZScpLAogICAgICByZWFsPVtdLnNsaWNlLmNhbGwodHJhY2suY2hpbGRyZW4pLCBuPXJlYWwubGVuZ3RoLCBidG5zPVtdOwogIGlmKG48MilyZXR1 cm47CiAgdmFyIGhlYWQ9cmVhbFswXS5jbG9uZU5vZGUodHJ1ZSksIHRhaWw9cmVhbFtuLTFdLmNsb25lTm9kZSh0cnVlKTsKICBoZWFkLnNldEF0dHJpYnV0 ZSgnYXJpYS1oaWRkZW4nLCd0cnVlJyk7IHRhaWwuc2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicsJ3RydWUnKTsKICB0cmFjay5hcHBlbmRDaGlsZChoZWFk KTsgdHJhY2suaW5zZXJ0QmVmb3JlKHRhaWwscmVhbFswXSk7CiAgdmFyIGFsbD1bXS5zbGljZS5jYWxsKHRyYWNrLmNoaWxkcmVuKTsKICB2YXIgaT0xLCB3 PTAsIGFuaW1hdGluZz1mYWxzZSwgYXV0b1RpbWVyPW51bGwsIGF1dG9TdG9wcGVkPWZhbHNlLCBBVVRPX01TPTQyMDA7CiAgZnVuY3Rpb24gbWVhc3VyZSgp eyB3PXZpZXcuY2xpZW50V2lkdGg7IGFsbC5mb3JFYWNoKGZ1bmN0aW9uKHMpe3Muc3R5bGUud2lkdGg9dysncHgnfSk7IHBhaW50KGZhbHNlKSB9CiAgZnVu Y3Rpb24gcGFpbnQoYW5pbSl7CiAgICBhbmltYXRpbmc9ISFhbmltICYmICFSTTsKICAgIHRyYWNrLnN0eWxlLnRyYW5zaXRpb249YW5pbWF0aW5nPyd0cmFu c2Zvcm0gLjI2cyBjdWJpYy1iZXppZXIoLjIyLC45LC4yNCwxKSc6J25vbmUnOwogICAgdHJhY2suc3R5bGUudHJhbnNmb3JtPSd0cmFuc2xhdGUzZCgnKygt aSp3KSsncHgsMCwwKSc7CiAgfQogIGZ1bmN0aW9uIGxvZ2ljYWwoKXsgcmV0dXJuIChpLTErbiklbiB9CiAgZnVuY3Rpb24gc3luYygpewogICAgdmFyIEw9 bG9naWNhbCgpOwogICAgYnRucy5mb3JFYWNoKGZ1bmN0aW9uKGIsayl7Yi5zZXRBdHRyaWJ1dGUoJ2FyaWEtY3VycmVudCcsU3RyaW5nKGs9PT1MKSl9KTsK ICAgIGlmKGxpdmUpbGl2ZS50ZXh0Q29udGVudD0nSW1hZ2UgJysoTCsxKSsnIG9mICcrbjsKICB9CiAgZnVuY3Rpb24gc2V0dGxlKCl7IGlmKCFhbmltYXRp bmcpIHJldHVybjsgYW5pbWF0aW5nPWZhbHNlOyBpZihpPT09MCl7IGk9biB9IGVsc2UgaWYoaT09PW4rMSl7IGk9MSB9IHBhaW50KGZhbHNlKTsgdm9pZCB0 cmFjay5vZmZzZXRXaWR0aDsgfQogIGZ1bmN0aW9uIHN0b3BBdXRvKCl7YXV0b1N0b3BwZWQ9dHJ1ZTtpZihhdXRvVGltZXIpe2NsZWFySW50ZXJ2YWwoYXV0 b1RpbWVyKTthdXRvVGltZXI9bnVsbH19CiAgZnVuY3Rpb24gc3RhcnRBdXRvKCl7IGlmKFJNfHxhdXRvU3RvcHBlZHx8bjwyfHxhdXRvVGltZXIpcmV0dXJu OyBhdXRvVGltZXI9c2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXsgaWYoZG9jdW1lbnQuaGlkZGVuKXJldHVybjsgZ28oMSxmYWxzZSk7IH0sQVVUT19NUyk7IH0K ICBmdW5jdGlvbiBwYXVzZUF1dG8oKXtpZihhdXRvVGltZXIpe2NsZWFySW50ZXJ2YWwoYXV0b1RpbWVyKTthdXRvVGltZXI9bnVsbH19CiAgZnVuY3Rpb24g d2F0Y2hBdXRvKCl7CiAgICBpZihSTXx8YXV0b1N0b3BwZWR8fG48MilyZXR1cm47CiAgICBpZignSW50ZXJzZWN0aW9uT2JzZXJ2ZXInIGluIHdpbmRvdyl7 CiAgICAgIHZhciBhaW89bmV3IEludGVyc2VjdGlvbk9ic2VydmVyKGZ1bmN0aW9uKGVzKXtlcy5mb3JFYWNoKGZ1bmN0aW9uKGUpewogICAgICAgIGlmKGF1 dG9TdG9wcGVkKXthaW8uZGlzY29ubmVjdCgpO3BhdXNlQXV0bygpO3JldHVybn0KICAgICAgICBpZihlLmlzSW50ZXJzZWN0aW5nKXN0YXJ0QXV0bygpO2Vs c2UgcGF1c2VBdXRvKCk7CiAgICAgIH0pfSx7cm9vdDpudWxsLHJvb3RNYXJnaW46JzBweCAwcHggLTMwJSAwcHgnLHRocmVzaG9sZDowfSk7CiAgICAgIGFp by5vYnNlcnZlKHZpZXcpOwogICAgfWVsc2V7c3RhcnRBdXRvKCl9CiAgfQogIGZ1bmN0aW9uIGdvKGRpcixtYW51YWwpeyBpZihtYW51YWwpc3RvcEF1dG8o KTsgc2V0dGxlKCk7IGkrPWRpcjsgcGFpbnQodHJ1ZSk7IHN5bmMoKSB9CiAgZnVuY3Rpb24ganVtcChMLG1hbnVhbCl7IGlmKG1hbnVhbClzdG9wQXV0bygp OyBzZXR0bGUoKTsgaT1MKzE7IHBhaW50KHRydWUpOyBzeW5jKCkgfQogIHRyYWNrLmFkZEV2ZW50TGlzdGVuZXIoJ3RyYW5zaXRpb25lbmQnLGZ1bmN0aW9u KGUpewogICAgaWYoZS5wcm9wZXJ0eU5hbWUhPT0ndHJhbnNmb3JtJylyZXR1cm47CiAgICBhbmltYXRpbmc9ZmFsc2U7CiAgICBpZihpPT09MCl7IGk9bjsg cGFpbnQoZmFsc2UpIH0gZWxzZSBpZihpPT09bisxKXsgaT0xOyBwYWludChmYWxzZSkgfQogIH0pOwogIGlmKGhvc3QpeyBmb3IodmFyIGs9MDtrPG47aysr KXsKICAgIHZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpOyBiLnR5cGU9J2J1dHRvbic7CiAgICBiLnNldEF0dHJpYnV0ZSgncm9sZScs J3RhYicpOyBiLnNldEF0dHJpYnV0ZSgnYXJpYS1jdXJyZW50JyxrPT09MD8ndHJ1ZSc6J2ZhbHNlJyk7CiAgICBiLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJl bCcsJ0ltYWdlICcrKGsrMSkrJyBvZiAnK24pOwogICAgaWYodGh1bWJzKXsgdmFyIGltPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOyBpbS5zcmM9 cmVhbFtrXS5xdWVyeVNlbGVjdG9yKCdpbWcnKS5nZXRBdHRyaWJ1dGUoJ3NyYycpfHwnJzsgaW0uYWx0PScnOyBiLmFwcGVuZENoaWxkKGltKSB9CiAgICAo ZnVuY3Rpb24odCl7IGIuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7IGp1bXAodCx0cnVlKSB9KSB9KShrKTsKICAgIGhvc3QuYXBwZW5k Q2hpbGQoYik7IGJ0bnMucHVzaChiKTsKICB9fQogIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLWNhcj0iJytrZXkrJyJdJykuZm9yRWFjaChm dW5jdGlvbihuYXYpewogICAgbmF2LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbihlKXsgZS5wcmV2ZW50RGVmYXVsdCgpOyBnbyhwYXJzZUlu dChuYXYuZGF0YXNldC5kaXIsMTApLHRydWUpIH0pfSk7CiAgdHJhY2suYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsZnVuY3Rpb24oZSl7CiAgICBpZihl LmtleT09PSdBcnJvd1JpZ2h0Jyl7ZS5wcmV2ZW50RGVmYXVsdCgpO2dvKDEsdHJ1ZSl9CiAgICBpZihlLmtleT09PSdBcnJvd0xlZnQnKXtlLnByZXZlbnRE ZWZhdWx0KCk7Z28oLTEsdHJ1ZSl9fSk7CiAgdmFyIHN4PTAsc3k9MCxkeD0wLGRvd249ZmFsc2UsZGVjaWRlZD1mYWxzZSxob3Jpej1mYWxzZTsKICB2aWV3 LmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJkb3duJyxmdW5jdGlvbihlKXsKICAgIGlmKGUudGFyZ2V0LmNsb3Nlc3QoJy5jYXItbmF2LC5jYXItZG90cycp KXJldHVybjsKICAgIGlmKGFuaW1hdGluZylyZXR1cm47CiAgICBzdG9wQXV0bygpOyBkb3duPXRydWU7ZGVjaWRlZD1mYWxzZTtob3Jpej1mYWxzZTtkeD0w O3N4PWUuY2xpZW50WDtzeT1lLmNsaWVudFk7CiAgfSk7CiAgdmlldy5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVybW92ZScsZnVuY3Rpb24oZSl7CiAgICBp ZighZG93bilyZXR1cm47CiAgICB2YXIgbXg9ZS5jbGllbnRYLXN4LG15PWUuY2xpZW50WS1zeTsKICAgIGlmKCFkZWNpZGVkKXsKICAgICAgaWYoTWF0aC5h YnMobXgpPDYmJk1hdGguYWJzKG15KTw2KXJldHVybjsKICAgICAgZGVjaWRlZD10cnVlO2hvcml6PU1hdGguYWJzKG14KT5NYXRoLmFicyhteSk7CiAgICAg IGlmKGhvcml6KXt0cmFjay5zdHlsZS50cmFuc2l0aW9uPSdub25lJzt0cnl7dmlldy5zZXRQb2ludGVyQ2FwdHVyZShlLnBvaW50ZXJJZCl9Y2F0Y2goeCl7 fX0KICAgIH0KICAgIGlmKCFob3JpeilyZXR1cm47CiAgICBlLnByZXZlbnREZWZhdWx0KCk7IGR4PW14OwogICAgdHJhY2suc3R5bGUudHJhbnNmb3JtPSd0 cmFuc2xhdGUzZCgnKygtaSp3K2R4KSsncHgsMCwwKSc7CiAgfSk7CiAgZnVuY3Rpb24gcmVsZWFzZSgpewogICAgaWYoIWRvd24pcmV0dXJuOyBkb3duPWZh bHNlOyBpZighaG9yaXopcmV0dXJuOwogICAgdmFyIFRIPU1hdGgubWluKDY0LHcqMC4xNCk7CiAgICBpZihkeDw9LVRIKSBnbygxLHRydWUpOyBlbHNlIGlm KGR4Pj1USCkgZ28oLTEsdHJ1ZSk7IGVsc2UgcGFpbnQodHJ1ZSk7CiAgICBkeD0wOwogIH0KICB2aWV3LmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJ1cCcs cmVsZWFzZSk7CiAgdmlldy5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVyY2FuY2VsJyxmdW5jdGlvbigpe2Rvd249ZmFsc2V9KTsKICB2aWV3LmFkZEV2ZW50 TGlzdGVuZXIoJ3BvaW50ZXJsZWF2ZScscmVsZWFzZSk7CiAgbWVhc3VyZSgpOyBhZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLG1lYXN1cmUpOyBzZXRUaW1l b3V0KG1lYXN1cmUsMzAwKTsgYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsbWVhc3VyZSk7CiAgd2F0Y2hBdXRvKCk7Cn0KYmxvY2soJ2Nhcm91c2VsLWhlcm8n LGZ1bmN0aW9uKCl7IHNsaWRlcignaGVybycsZmFsc2UpOyB9KTsKYmxvY2soJ2Nhcm91c2VsLW9iJyxmdW5jdGlvbigpeyBzbGlkZXIoJ29iJyx0cnVlKTsg fSk7CgovKiDilIDilIAgNSDCtyBwYWNrIHNlbGVjdGlvbiAodGhlICJyYWRpbyBidXR0b25zIikg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCmJsb2NrKCdwYWNrcycsZnVuY3Rpb24oKXsKICB2YXIgcGFja3M9 ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI2JhbCAuYmFsLXBhY2snKSwgb2JDdGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ29iLWN0YScpOwogIGZ1 bmN0aW9uIHBhY2tBdmFpbGFibGUocCl7IHJldHVybiBwICYmICFwLmRpc2FibGVkICYmIHAuZ2V0QXR0cmlidXRlKCdhcmlhLWRpc2FibGVkJykhPT0ndHJ1 ZScgJiYgcC5nZXRBdHRyaWJ1dGUoJ2RhdGEtYXZhaWxhYmxlJykhPT0nZmFsc2UnOyB9CiAgZnVuY3Rpb24gbGFiZWxGb3IocCl7IHJldHVybiBwLmdldEF0 dHJpYnV0ZSgnZGF0YS1jdGEnKXx8J0FkZCB0byBjYXJ0JyB9CiAgZnVuY3Rpb24gc2VsZWN0UGFjayhwKXsKICAgIGlmKCFwYWNrQXZhaWxhYmxlKHApKSBy ZXR1cm47CiAgICBwYWNrcy5mb3JFYWNoKGZ1bmN0aW9uKHgpe3guc2V0QXR0cmlidXRlKCdhcmlhLWNoZWNrZWQnLCdmYWxzZScpfSk7CiAgICBwLnNldEF0 dHJpYnV0ZSgnYXJpYS1jaGVja2VkJywndHJ1ZScpOwogICAgaWYob2JDdGEgJiYgb2JDdGEuZ2V0QXR0cmlidXRlKCdhcmlhLWJ1c3knKSE9PSd0cnVlJyl7 CiAgICAgIG9iQ3RhLmZpcnN0Q2hpbGQudGV4dENvbnRlbnQ9bGFiZWxGb3IocCkrJyAnOwogICAgICBvYkN0YS5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCcvY2Fy dC9hZGQ/aWQ9JytwLmdldEF0dHJpYnV0ZSgnZGF0YS12aWQnKSsnJnF1YW50aXR5PTEnKTsKICAgIH0KICB9CiAgcGFja3MuZm9yRWFjaChmdW5jdGlvbihw KXsgcC50eXBlPSdidXR0b24nOyBwLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbihlKXsgZS5wcmV2ZW50RGVmYXVsdCgpOyBzZWxlY3RQYWNr KHApOyB9KTsgfSk7CiAgZnVuY3Rpb24gaW5pdFNlbCgpewogICAgaWYoIW9iQ3RhKSByZXR1cm47CiAgICB2YXIgc2VsPWRvY3VtZW50LnF1ZXJ5U2VsZWN0 b3IoJyNiYWwgLmJhbC1wYWNrW2FyaWEtY2hlY2tlZD0idHJ1ZSJdJyk7CiAgICBpZighcGFja0F2YWlsYWJsZShzZWwpKSBzZWw9W10uc2xpY2UuY2FsbChw YWNrcykuZmlsdGVyKHBhY2tBdmFpbGFibGUpWzBdOwogICAgaWYoc2VsKSBzZWxlY3RQYWNrKHNlbCk7CiAgfQogIGluaXRTZWwoKTsKICBkb2N1bWVudC5h ZGRFdmVudExpc3RlbmVyKCdiYWw6cHJvZHVjdHMnLGluaXRTZWwpOwp9KTsKCi8qIOKUgOKUgCA2IMK3IENUQSByaXBwbGUg4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCmJsb2NrKCdyaXBwbGUnLGZ1bmN0aW9uKCl7CiAgZG9jdW1l bnQucXVlcnlTZWxlY3RvckFsbCgnI2JhbCAuY3RhJykuZm9yRWFjaChmdW5jdGlvbihidG4pewogICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJk b3duJyxmdW5jdGlvbihlKXsKICAgICAgaWYoUk0pcmV0dXJuOwogICAgICB2YXIgcj1idG4uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksZD1NYXRoLm1heChy LndpZHRoLHIuaGVpZ2h0KSoyLjE7CiAgICAgIHZhciBzPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtzLmNsYXNzTmFtZT0ncmlwJzsKICAgICAg cy5zdHlsZS53aWR0aD1zLnN0eWxlLmhlaWdodD1kKydweCc7CiAgICAgIHMuc3R5bGUubGVmdD0oZS5jbGllbnRYLXIubGVmdC1kLzIpKydweCc7IHMuc3R5 bGUudG9wPShlLmNsaWVudFktci50b3AtZC8yKSsncHgnOwogICAgICBidG4uYXBwZW5kQ2hpbGQocyk7c2V0VGltZW91dChmdW5jdGlvbigpe3MucmVtb3Zl KCl9LDY0MCk7CiAgICB9KTsKICB9KTsKfSk7CgovKiDilIDilIAgNyDCtyBhY2NvcmRpb25zIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwpibG9jaygnYWNjb3JkaW9ucycsZnVuY3Rpb24oKXsKICBkb2N1bWVudC5xdWVyeVNlbGVj dG9yQWxsKCcjYmFsIC5hY2MtYicpLmZvckVhY2goZnVuY3Rpb24oYixpKXsKICAgIHZhciBwPWIucGFyZW50Tm9kZS5uZXh0RWxlbWVudFNpYmxpbmcsaWQ9 J2FjY3AtJytpOwogICAgcC5pZD1pZDtiLnNldEF0dHJpYnV0ZSgnYXJpYS1jb250cm9scycsaWQpO3Auc2V0QXR0cmlidXRlKCdyb2xlJywncmVnaW9uJyk7 IGIudHlwZT0nYnV0dG9uJzsKICAgIGIuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKGUpewogICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAg ICAgIHZhciBvcGVuPWIuZ2V0QXR0cmlidXRlKCdhcmlhLWV4cGFuZGVkJyk9PT0ndHJ1ZSc7CiAgICAgIGIuc2V0QXR0cmlidXRlKCdhcmlhLWV4cGFuZGVk JyxTdHJpbmcoIW9wZW4pKTsKICAgICAgcC5zdHlsZS5oZWlnaHQ9b3Blbj8nMHB4JzpwLmZpcnN0RWxlbWVudENoaWxkLm9mZnNldEhlaWdodCsncHgnOwog ICAgfSk7CiAgfSk7CiAgYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJyxmdW5jdGlvbigpewogICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI2JhbCAu YWNjLWJbYXJpYS1leHBhbmRlZD0idHJ1ZSJdJykuZm9yRWFjaChmdW5jdGlvbihiKXsKICAgICAgdmFyIHA9Yi5wYXJlbnROb2RlLm5leHRFbGVtZW50U2li bGluZztwLnN0eWxlLmhlaWdodD1wLmZpcnN0RWxlbWVudENoaWxkLm9mZnNldEhlaWdodCsncHgnfSl9KTsKfSk7CgovKiDilIDilIAgOCDCtyBzdGlja3kg YmFyOiBzaG93cyBvbmx5IGFmdGVyIHRoZSBvcmRlciBib3gg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSAICovCmJsb2NrKCdzdGlja3knLGZ1bmN0aW9uKCl7CiAgdmFyIHN0PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdGlja3knKSwgYWM9ZG9j dW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FjYy1vYicpOwogIGlmKCFzdHx8IWFjKSByZXR1cm47CiAgdmFyIHJhZj1udWxsOwogIGZ1bmN0aW9uIHRvcChlbCl7 IHJldHVybiBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgKyB3aW5kb3cuc2Nyb2xsWTsgfQogIGZ1bmN0aW9uIHVwZCgpeyByYWY9bnVsbDsgc3Qu Y2xhc3NMaXN0LnRvZ2dsZSgnb24nLCAod2luZG93LnNjcm9sbFkgKyB3aW5kb3cuaW5uZXJIZWlnaHQpPnRvcChhYykpOyB9CiAgYWRkRXZlbnRMaXN0ZW5l cignc2Nyb2xsJyxmdW5jdGlvbigpeyBpZighcmFmKSByYWY9cmVxdWVzdEFuaW1hdGlvbkZyYW1lKHVwZCk7IH0se3Bhc3NpdmU6dHJ1ZX0pOwogIGFkZEV2 ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsdXBkKTsgdXBkKCk7Cn0pOwoKLyog4pSA4pSAIDkgwrcgdGhlIGFuaW1hdGVkIHByb2R1Y3QgbW9tZW50IOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgCAqLwpibG9jaygnbW9tZW50JyxmdW5jdGlvbigpewogIHZhciBVPXdpbmRvdy5CQUxfVVJMfHxmdW5jdGlvbihmKXtyZXR1cm4gZn07CiAgdmFy IEZSPVtdOyBmb3IodmFyIGZpPTA7Zmk8MzY7ZmkrKyl7IEZSLnB1c2goVSgnYmFsLWZyYW1lLScrKGZpPDEwPycwJzonJykrZmkrJy53ZWJwJykpOyB9CiAg dmFyIFc9NzAwLCBIPTE0MTcsIE49RlIubGVuZ3RoOwogIHZhciBjdj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY3YnKTsgaWYoIWN2KSByZXR1cm47CiAg dmFyIGN4PWN2LmdldENvbnRleHQoJzJkJyx7YWxwaGE6dHJ1ZX0pOwogIHZhciBnbG93PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnbG93JyksIHR5cD1k b2N1bWVudC5nZXRFbGVtZW50QnlJZCgndHlwZScpLAogICAgICBraWNrPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdraWNrZXInKSwgcnVsZT1kb2N1bWVu dC5nZXRFbGVtZW50QnlJZCgncnVsZScpLAogICAgICBwbj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncG5hbWUnKTsKICB2YXIgaW1ncz1bXSwgbG9hZGVk PTA7CiAgRlIuZm9yRWFjaChmdW5jdGlvbihiLGkpeyB2YXIgaW09bmV3IEltYWdlKCk7IGltLm9ubG9hZD1pbS5vbmVycm9yPWZ1bmN0aW9uKCl7IGlmKCsr bG9hZGVkPT09TikgcmVhZHkoKTsgfTsgaW0uc3JjPWI7IGltZ3NbaV09aW07IH0pOwogIHZhciBjdXI9LTE7CiAgZnVuY3Rpb24gZHJhdyhpKXsgaWYoaT09 PWN1cilyZXR1cm47IGN1cj1pOyBjeC5jbGVhclJlY3QoMCwwLFcsSCk7IHZhciBpbT1pbWdzW2ldOyBpZihpbSYmaW0uY29tcGxldGUmJmltLm5hdHVyYWxX aWR0aCkgY3guZHJhd0ltYWdlKGltLDAsMCxXLEgpOyB9CiAgZnVuY3Rpb24gY2wodixhLGIpeyByZXR1cm4gdjxhP2E6KHY+Yj9iOnYpOyB9CiAgZnVuY3Rp b24gc2cocCxhLGIpeyByZXR1cm4gY2woKHAtYSkvKGItYSksMCwxKTsgfQogIGZ1bmN0aW9uIG9jKHQpeyByZXR1cm4gMS1NYXRoLnBvdygxLXQsMyk7IH0K ICB2YXIgQk9YPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdicmFuY2hCb3gnKTsKICB2YXIgU1AxPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzcDEnKSwg U1AyPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzcDInKTsKICB2YXIgTDE9U1AxLmdldFRvdGFsTGVuZ3RoKCksIEwyPVNQMi5nZXRUb3RhbExlbmd0aCgp OwogIFNQMS5zdHlsZS5zdHJva2VEYXNoYXJyYXk9TDE7IFNQMi5zdHlsZS5zdHJva2VEYXNoYXJyYXk9TDI7CiAgdmFyIEJNRVRBPVt7InQiOiAibCIsICJz IjogMC41MTA0Nn0sIHsidCI6ICJsIiwgInMiOiAwLjU1NjQ5fSwgeyJ0IjogImwiLCAicyI6IDAuNDE0MjN9LCB7InQiOiAibCIsICJzIjogMC4zNDcyOH0s IHsidCI6ICJsIiwgInMiOiAwLjY1MjcyfSwgeyJ0IjogImwiLCAicyI6IDAuNjc3ODJ9LCB7InQiOiAibCIsICJzIjogMC4zMTc5OX0sIHsidCI6ICJsIiwg InMiOiAwLjY5MDM4fSwgeyJ0IjogImwiLCAicyI6IDAuMzA1NDR9LCB7InQiOiAibCIsICJzIjogMC42OTQ1Nn0sIHsidCI6ICJmIiwgInMiOiAwLjI4NDUy fSwgeyJ0IjogImYiLCAicyI6IDAuNzE1NDh9LCB7InQiOiAibCIsICJzIjogMC43NDg5NX0sIHsidCI6ICJsIiwgInMiOiAwLjI0Njg2fSwgeyJ0IjogImwi LCAicyI6IDAuNzkwNzl9LCB7InQiOiAibCIsICJzIjogMC4yMDkyMX0sIHsidCI6ICJsIiwgInMiOiAwLjgwMzM1fSwgeyJ0IjogImwiLCAicyI6IDAuMTky NDd9LCB7InQiOiAibCIsICJzIjogMC44MzI2NH0sIHsidCI6ICJsIiwgInMiOiAwLjE2MzE4fSwgeyJ0IjogImYiLCAicyI6IDAuMTQ2NDR9LCB7InQiOiAi bCIsICJzIjogMC44NTc3NH0sIHsidCI6ICJsIiwgInMiOiAwLjE0MjI2fSwgeyJ0IjogImYiLCAicyI6IDAuODYxOTJ9LCB7InQiOiAibCIsICJzIjogMC44 OTk1OH0sIHsidCI6ICJsIiwgInMiOiAwLjEwMDQyfSwgeyJ0IjogImwiLCAicyI6IDAuMDk2MjN9LCB7InQiOiAibCIsICJzIjogMC45NDU2MX0sIHsidCI6 ICJsIiwgInMiOiAwLjk0NTYxfSwgeyJ0IjogImwiLCAicyI6IDAuMDU0Mzl9LCB7InQiOiAibCIsICJzIjogMC4wNTQzOX0sIHsidCI6ICJsIiwgInMiOiAw Ljk1ODE2fSwgeyJ0IjogImwiLCAicyI6IDAuOTcwNzF9LCB7InQiOiAibCIsICJzIjogMC4wMjkyOX0sIHsidCI6ICJmIiwgInMiOiAxLjB9LCB7InQiOiAi ZiIsICJzIjogMS4wfSwgeyJ0IjogImYiLCAicyI6IDAuMH0sIHsidCI6ICJmIiwgInMiOiAwLjB9LCB7InQiOiAibCIsICJzIjogMS4wfSwgeyJ0IjogImwi LCAicyI6IDEuMH0sIHsidCI6ICJsIiwgInMiOiAxLjB9LCB7InQiOiAibCIsICJzIjogMS4wfSwgeyJ0IjogImwiLCAicyI6IDEuMH0sIHsidCI6ICJsIiwg InMiOiAwLjB9LCB7InQiOiAibCIsICJzIjogMC4wfSwgeyJ0IjogImwiLCAicyI6IDAuMH0sIHsidCI6ICJsIiwgInMiOiAwLjB9LCB7InQiOiAibCIsICJz IjogMC4wfV0sIFMwPTAuNDk3OTE7CiAgdmFyIEJQQVJUUz1CTUVUQS5tYXAoZnVuY3Rpb24obSxpKXsgcmV0dXJuIHtlbDpkb2N1bWVudC5nZXRFbGVtZW50 QnlJZCgnYnAnK2kpLCB0Om0udCwgczptLnN9OyB9KTsKICB2YXIgQlNIPTAuODUsIEJSX1JFTD0xLjEyMjQsIEJSX0NZPTAuNTAsIEJSX0FSPTEuMzA3NjsK ICB2YXIgc3RhZ2U9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N0YWdlJyk7CiAgZnVuY3Rpb24gbGF5b3V0QnJhbmNoKCl7CiAgICB2YXIgY3c9Y3Yub2Zm c2V0V2lkdGgsIGNoPWN2Lm9mZnNldEhlaWdodCwgY2xfPWN2Lm9mZnNldExlZnQsIGN0PWN2Lm9mZnNldFRvcDsKICAgIHZhciBidz1NYXRoLm1pbihjdypC Ul9SRUwsIHN0YWdlLmNsaWVudFdpZHRoKjAuOTkpLCBiaD1idypCUl9BUjsKICAgIEJPWC5zdHlsZS53aWR0aD1idysncHgnOyBCT1guc3R5bGUuaGVpZ2h0 PWJoKydweCc7CiAgICBCT1guc3R5bGUubGVmdD0oY2xfLWJ3LzIpKydweCc7IEJPWC5zdHlsZS50b3A9KGN0K2NoKkJSX0NZLWJoLzIpKydweCc7CiAgICBC T1guc3R5bGUudHJhbnNmb3JtT3JpZ2luPSc1MCUgJysoKDAuNSswLjM4KmNoL2JoKSoxMDApLnRvRml4ZWQoMikrJyUnOwogIH0KICB2YXIgRFVSPTI0MDAs IFRQPTAsIHQwPTAsIHJ1bm5pbmc9ZmFsc2UsIHN0YXJ0ZWQ9ZmFsc2U7CiAgZnVuY3Rpb24gdGljaygpeyB2YXIgZT0ocGVyZm9ybWFuY2Uubm93KCktdDAp L0RVUjsgVFA9ZTwwPzA6KGU+MT8xOmUpOyB1cGQoKTsgaWYoVFA8MSl7IHJlcXVlc3RBbmltYXRpb25GcmFtZSh0aWNrKTsgfSBlbHNlIHsgcnVubmluZz1m YWxzZTsgfSB9CiAgZnVuY3Rpb24gR0FURSgpeyB2YXIgdj1wYXJzZUZsb2F0KGdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KS5n ZXRQcm9wZXJ0eVZhbHVlKCItLW1vbWVudC1zdGFydCIpKTsgcmV0dXJuIGlzTmFOKHYpPzAuNjI6djsgfQogIGZ1bmN0aW9uIGdhdGUoKXsKICAgIGlmKHN0 YXJ0ZWQpIHJldHVybjsKICAgIGlmKHN0YWdlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCA8PSBpbm5lckhlaWdodCpHQVRFKCkpewogICAgICBzdGFy dGVkPXRydWU7CiAgICAgIGlmKFJNKXsgVFA9MTsgdXBkKCk7IH0gZWxzZSB7IHQwPXBlcmZvcm1hbmNlLm5vdygpOyBydW5uaW5nPXRydWU7IHRpY2soKTsg fQogICAgfQogIH0KICB2YXIgcmFmPW51bGw7CiAgZnVuY3Rpb24gdXBkKCl7CiAgICByYWY9bnVsbDsgdmFyIHA9VFA7CiAgICB2YXIgazE9c2cocCwwLjAy LDAuMTEpOyBraWNrLnN0eWxlLm9wYWNpdHk9azEudG9GaXhlZCgzKTsga2ljay5zdHlsZS50cmFuc2Zvcm09J3RyYW5zbGF0ZVkoJysoKDEtb2MoazEpKSox NCkudG9GaXhlZCgyKSsncHgpJzsKICAgIHZhciBrMj1zZyhwLDAuMTQsMC4yNCk7IHJ1bGUuc3R5bGUud2lkdGg9KG9jKGsyKSoxNTApLnRvRml4ZWQoMSkr J3B4JzsKICAgIHZhciBrMz1zZyhwLDAuMTgsMC4zMCk7IHBuLnN0eWxlLm9wYWNpdHk9azMudG9GaXhlZCgzKTsgcG4uc3R5bGUudHJhbnNmb3JtPSd0cmFu c2xhdGVZKCcrKCgxLW9jKGszKSkqMTYpLnRvRml4ZWQoMikrJ3B4KSc7CiAgICB2YXIgazQ9b2Moc2cocCwwLjMwLDAuNTIpKTsgdHlwLnN0eWxlLnRyYW5z Zm9ybT0ndHJhbnNsYXRlWSgnKygoMS1rNCkqMzQpLnRvRml4ZWQoMikrJ3ZoKSBzY2FsZSgnKygxLWs0KjAuMTIpLnRvRml4ZWQoNCkrJyknOwogICAgdmFy IGFwcD1zZyhwLDAuMzIsMC42MiksIGVhPW9jKGFwcCk7CiAgICB2YXIgdD1zZyhwLDAuMzIsMC45Mik7CiAgICB2YXIgU1BMSVQ9MTgsIEI9MC43MDQzOwog ICAgdmFyIGs9KHQ8PUIpPyh0L0IpKlNQTElUOlNQTElUKygodC1CKS8oMS1CKSkqKE4tMS1TUExJVCk7CiAgICBkcmF3KE1hdGgucm91bmQoaykpOwogICAg Y3Yuc3R5bGUub3BhY2l0eT1zZyhwLDAuMzIsMC40MikudG9GaXhlZCgzKTsKICAgIGN2LnN0eWxlLnRyYW5zZm9ybT0ndHJhbnNsYXRlKC01MCUsJysoKDEt ZWEpKjgpLnRvRml4ZWQoMikrJ3ZoKSBzY2FsZSgnKygoMC41NiswLjQ0KmVhKSpCU0gpLnRvRml4ZWQoNCkrJyknOwogICAgdmFyIGJsPSgxLXNnKHAsMC4z MiwwLjQ0KSkqMi42OyBjdi5zdHlsZS5maWx0ZXI9KFJNfHxibDwwLjA2KT8nbm9uZSc6J2JsdXIoJytibC50b0ZpeGVkKDIpKydweCknOwogICAgdmFyIEdw PW9jKHNnKHAsMC41MCwwLjkwKSksIEc9R3AqMS4yMDsKICAgIEJPWC5zdHlsZS5vcGFjaXR5PShzZyhwLDAuNTAsMC42MCkqMC42MCkudG9GaXhlZCgzKTsK ICAgIHZhciBic2M9KDAuNTYrMC40NCpvYyhzZyhwLDAuMzIsMC42MikpKSpCU0g7IEJPWC5zdHlsZS50cmFuc2Zvcm09J3NjYWxlKCcrYnNjLnRvRml4ZWQo NCkrJyknOwogICAgdmFyIEdzPU1hdGgubWluKDEsRyk7IFNQMS5zdHlsZS5zdHJva2VEYXNob2Zmc2V0PShMMSooMS1HcykpLnRvRml4ZWQoMSk7IFNQMi5z dHlsZS5zdHJva2VEYXNob2Zmc2V0PShMMiooMS1HcykpLnRvRml4ZWQoMSk7CiAgICBmb3IodmFyIGJpMj0wO2JpMjxCUEFSVFMubGVuZ3RoO2JpMisrKXsK ICAgICAgdmFyIHE9QlBBUlRTW2JpMl07IGlmKCFxLmVsKSBjb250aW51ZTsKICAgICAgdmFyIHJlYWNoPU1hdGguYWJzKHEucy1TMCkvTWF0aC5tYXgoUzAs MS1TMCk7CiAgICAgIHZhciB1PWNsKChHLXJlYWNoKS8wLjE2LDAsMSksIGU9b2ModSksIHN0Mj1xLmVsLnN0eWxlOwogICAgICBzdDIub3BhY2l0eT1lLnRv Rml4ZWQoMyk7CiAgICAgIGlmKHEudD09PSdmJyl7CiAgICAgICAgdmFyIG92PTErMC4wOSpNYXRoLnNpbihNYXRoLlBJKk1hdGgubWluKDEsdSoxLjE1KSk7 CiAgICAgICAgc3QyLmNsaXBQYXRoPSdjaXJjbGUoJysoZSo2MikudG9GaXhlZCgxKSsnJSBhdCA1MCUgNTAlKSc7CiAgICAgICAgc3QyLnRyYW5zZm9ybT0n c2NhbGUoJysoMC40NSswLjU1KmUpKm92KycpIHJvdGF0ZSgnKygoMS1lKSotMjIpLnRvRml4ZWQoMSkrJ2RlZyknOwogICAgICB9IGVsc2UgewogICAgICAg IHN0Mi50cmFuc2Zvcm09J3NjYWxlKCcrKDAuMDgrMC45MiplKS50b0ZpeGVkKDMpKycpIHJvdGF0ZSgnKygoMS1lKSoocS5zPFMwPzk6LTkpKS50b0ZpeGVk KDEpKydkZWcpJzsKICAgICAgfQogICAgfQogICAgdmFyIGc9c2cocCwwLjI4LDAuODApOyBnbG93LnN0eWxlLm9wYWNpdHk9KGcqMC45NSkudG9GaXhlZCgz KTsgZ2xvdy5zdHlsZS50cmFuc2Zvcm09J3RyYW5zbGF0ZSgtNTAlLC01MCUpIHNjYWxlKCcrKDAuODArMC4yMCpnKS50b0ZpeGVkKDMpKycpJzsKICB9CiAg ZnVuY3Rpb24gb25TKCl7IGdhdGUoKTsgaWYoIXJ1bm5pbmcgJiYgIXJhZikgcmFmPXJlcXVlc3RBbmltYXRpb25GcmFtZSh1cGQpOyB9CiAgZnVuY3Rpb24g cmVhZHkoKXsgbGF5b3V0QnJhbmNoKCk7IGRyYXcoMCk7IHVwZCgpOyBhZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLG9uUyx7cGFzc2l2ZTp0cnVlfSk7IGFk ZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsZnVuY3Rpb24oKXsgbGF5b3V0QnJhbmNoKCk7IG9uUygpOyB9KTsgb25TKCk7IH0KfSk7CgovKiDilIDilIAgMTAg wrcgc3RpY2t5IGJhciBwcmljZSBtaXJyb3JzIHRoZSBzZWxlY3RlZCBwYWNrIChkZXNrdG9wKSDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KYmxv Y2soJ3N0aWNreS1wcmljZScsZnVuY3Rpb24oKXsKICB2YXIgb3V0PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNiYWwgLnN0aWNreS1wJyk7IGlmKCFvdXQp IHJldHVybjsKICBmdW5jdGlvbiBzeW5jKCl7CiAgICB2YXIgcD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjYmFsIC5iYWwtcGFja1thcmlhLWNoZWNrZWQ9 InRydWUiXTpub3QoW2Rpc2FibGVkXSknKSB8fCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjYmFsIC5iYWwtcGFjazpub3QoW2Rpc2FibGVkXSknKTsKICAg IHZhciB2PXAgJiYgcC5xdWVyeVNlbGVjdG9yKCcuYmFsLXBhY2stcCcpOyBvdXQudGV4dENvbnRlbnQ9dj92LnRleHRDb250ZW50LnRyaW0oKTonJzsKICB9 CiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI2JhbCAuYmFsLXBhY2snKS5mb3JFYWNoKGZ1bmN0aW9uKHApeyBwLmFkZEV2ZW50TGlzdGVuZXIoJ2Ns aWNrJyxmdW5jdGlvbigpeyBzZXRUaW1lb3V0KHN5bmMsMCkgfSk7IH0pOwogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2JhbDpwcm9kdWN0cycsc3lu Yyk7IHN5bmMoKTsKfSk7CgovKiDilIDilIAgMTEgwrcgc21vb3RoIHNjcm9sbCB0byB0aGUgb3JkZXIgYm94IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwpibG9jaygnc2Nyb2xsJyxmdW5j dGlvbigpewogIHZhciBvcmRlcj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnb3JkZXInKTsgaWYoIW9yZGVyKSByZXR1cm47CiAgdmFyIG9yZGVyT2Zmc2V0 PTU0OwogIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJyNiYWwgYVtocmVmPSIjb3JkZXIiXScpLmZvckVhY2goZnVuY3Rpb24obGluayl7CiAgICBsaW5r LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbihlKXsKICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOyBlLnN0b3BQcm9wYWdhdGlvbigpOwogICAg ICB2YXIgeT1vcmRlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgKyB3aW5kb3cucGFnZVlPZmZzZXQgLSBvcmRlck9mZnNldDsKICAgICAgdHJ5eyB3 aW5kb3cuc2Nyb2xsVG8oe3RvcDpNYXRoLm1heCgwLHkpLGJlaGF2aW9yOlJNPydhdXRvJzonc21vb3RoJ30pOyB9Y2F0Y2goZXJyKXsgd2luZG93LnNjcm9s bFRvKDAsTWF0aC5tYXgoMCx5KSk7IH0KICAgIH0sdHJ1ZSk7CiAgfSk7Cn0pOwoKLyog4pSA4pSAIDEyIMK3IGFkZCB0byBjYXJ0IOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwpibG9jaygnY2FydCcsZnVuY3Rpb24oKXsKICB2YXIgYnRuPWRvY3Vt ZW50LmdldEVsZW1lbnRCeUlkKCdvYi1jdGEnKTsgaWYoIWJ0bikgcmV0dXJuOwogIHZhciBhcnJvdz1idG4ucXVlcnlTZWxlY3RvcignLmFyJyk7CiAgZnVu Y3Rpb24gc2V0QnRuVGV4dCh0ZXh0KXsgYnRuLmZpcnN0Q2hpbGQudGV4dENvbnRlbnQ9dGV4dCsnICc7IGlmKGFycm93KSBhcnJvdy50ZXh0Q29udGVudD0n JzsgfQogIGZ1bmN0aW9uIGdvQ2FydCh1cmwpeyBzZXRCdG5UZXh0KCdHb2luZyB0byBjYXJ0Li4uJyk7IHNldFRpbWVvdXQoZnVuY3Rpb24oKXsgbG9jYXRp b24uaHJlZj11cmw7IH0sMTIwKTsgfQogIGZ1bmN0aW9uIGNob3NlbigpewogICAgdmFyIHA9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2JhbCAuYmFsLXBh Y2tbYXJpYS1jaGVja2VkPSJ0cnVlIl06bm90KFtkaXNhYmxlZF0pJykgfHwgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2JhbCAuYmFsLXBhY2s6bm90KFtk aXNhYmxlZF0pJyk7CiAgICByZXR1cm4gcCAmJiBwLmdldEF0dHJpYnV0ZSgnZGF0YS12aWQnKTsKICB9CiAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNr JyxmdW5jdGlvbihlKXsKICAgIHZhciBpZD1jaG9zZW4oKTsgaWYoIWlkKSByZXR1cm47CiAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICBpZihidG4uZGF0 YXNldC5idXN5PT09J3RydWUnKSByZXR1cm47CiAgICBidG4uZGF0YXNldC5idXN5PSd0cnVlJzsgYnRuLnNldEF0dHJpYnV0ZSgnYXJpYS1idXN5JywndHJ1 ZScpOyBidG4uc2V0QXR0cmlidXRlKCdhcmlhLWRpc2FibGVkJywndHJ1ZScpOwogICAgc2V0QnRuVGV4dCgnQWRkaW5nIHRvIGNhcnQuLi4nKTsKICAgIGZl dGNoKCcvY2FydC9hZGQuanMnLHttZXRob2Q6J1BPU1QnLGNyZWRlbnRpYWxzOidzYW1lLW9yaWdpbicsaGVhZGVyczp7J0NvbnRlbnQtVHlwZSc6J2FwcGxp Y2F0aW9uL2pzb24nfSwKICAgICAgYm9keTpKU09OLnN0cmluZ2lmeSh7aWQ6TnVtYmVyKGlkKSxxdWFudGl0eToxfSl9KQogICAgICAudGhlbihmdW5jdGlv bihyKXsgaWYoIXIub2spIHRocm93IDA7IGdvQ2FydCgnL2NhcnQnKTsgfSkKICAgICAgLmNhdGNoKGZ1bmN0aW9uKCl7IGdvQ2FydCgnL2NhcnQvYWRkP2lk PScraWQrJyZxdWFudGl0eT0xJyk7IH0pOwogIH0pOwp9KTsKCmlmKHdpbmRvdy5jb25zb2xlKSBjb25zb2xlLmluZm8oJ1tCYWxhYXlhaF0gZW5naW5lIGJv b3RlZCcpOwp9KSgpOwo=

    Restore your harmony, every day

    • IOS
    • Google Play Store
    • Email us: care@theayurvedaexperience.com
    • Call us: +1(678)-498-7248
    QUICK LINKS
    • Help Center

    • Search

    • Home

    • All Products

    • About Us

    • Become an Affiliate

    • Get SMS/WhatsApp updates

    POLICIES
    • Shipping & Delivery

    • Privacy Policy

    • Exchanges & Refunds

    • Terms of Use

    • Accessibility Statement

    CUSTOMER SERVICES
    • Contact Us

    • My Account

    • Track Your Order

    • AyuRewards

    • Referral Program

    • Book A Consultation

    The Ayurveda Experience Footer Image

    © 2026 The Ayurveda Experience

    American Express Apple Pay Diners Club Discover Google Pay Mastercard PayPal Shop Pay Venmo Visa

    * Disclaimer: Please click here to see the usage of cookies. Packaging may vary from images shown on the website. Results may vary from person to person. In compliance with FTC rulings, we cannot guarantee that these results are typical. Images used across the website are for representation purpose only. The user experiences displayed on this page, if any, are a small sample of the thousands of accounts sent to us by people who have used products and materials developed by Transformative Learning Pte. Ltd. Nothing on this website may be viewed as the diagnosis or treatment of any medical disease whatsoever. If you have a health condition or may be allergic to herbs, please check with your physician before using the products. Please read the list of ingredients carefully and identify any ingredients that you may be allergic to. Patch test products before use.
    The contents of the educational video courses on this website are the opinions of the authors based on their learning and experiences. The Ayurveda Experience is not liable or responsible for the suggestions made herein, as this content is meant only for educational purposes. Please consult your primary care physician before implementing any change in your diet or lifestyle. For any further information please contact care@theayurvedaexperience.com

    Having trouble adding items to your cart? This can happen due to browser settings. Click below to fix it.

    Account

    For You
    Orders
    Profile