Uma Thurman’s accent. Truvada product placement. The tonal equivalent of a Disney Channel original gay porn. Make it all make sense.
Photo: Amazon Studios/Jonathan Prime/Prime Video
Rachel Handler: Jackson, hello. I’m sorry that it has come to this, both of us in a Google doc typing on a beautiful summer day. But it’s time to talk about the bisexual elephant (non-Republican-affiliated) in the room: the long-awaited Prime Video movie adaptation of Red, White, & Royal Blue. First off, I just want to say that I love this book, as well as Casey McQuiston’s second novel, One Last Stop, which is about lesbians time-traveling via the New York subway, and I was genuinely excited to see this movie. Unfortunately, watching it was a grim experience. And then I made you watch it.
Jackson McHenry: With the strongest possible recommendation, which is that it was potentially brain-breaking. (I also heard from a friend that the movie seemed to “exist to be made fun of on The Other Two,” which was tantalizing in its own eldritch way.) I should say that I haven’t read the book and was only vaguely familiar with the concept/cover art from various gays’ Instagrams, but the movie itself seems to exist in a strange, depth-free reality akin to a Netflix and/or Hallmark holiday movie where all the props look made out of cardboard and so do all the performances. Where to begin, other than with the essential question: What did you make of the romance between our heroes, Snooty Blonde Prince and Self-Important Son of Texas President?They hate each other and then fall for each other but can’t come out with their love for fear of alienating president mom’s voters and also angering the royal family! It’s a tale as old as slash-fiction.
RH: This movie definitely exists within an unholy Venn diagram alongside the Netflix Christmas Universe, which you and I are intimately familiar with and which has claimed its rightful place in history as perfect lobotomy cinema. I would argue that the performances in RW&RB, specifically that of Taylor Zakhar Perez (Self-Important Son of Texas President Alex Claremont-Diaz), feel more “Disney Channel Original Gay Porn” than anything else. Perez plays Alex — who everyone in the movie insists is “charismatic,” as if that automatically makes it true — as a hammily arrogant, overtelegraphed, maniacally grinning, staggeringly ripped (why??) DCOM protagonist who occasionally seems to have accidentally wandered onto the set of MTV’s Undressed. He is constantly giving both Overtrained Child Star and Did Somebody Order a Big Sausage Pizza and seems, quite understandably, as confused as I am about the tone of this movie.
Unlike the book, which is snappy and sweet and filthy all at once, the film vacillates randomly and abruptly between an anodyne, PG-rated network-sitcom blandness and glaringly lit, impressively thrust-y sex scenes with a Wattpad-esque quality likely responsible for its (undeserved) R-rating. I am generally more than happy to see both of these things on screen (especially the latter, in this economy!!), but it is disorienting to try to accept both within the same, already tenuous fictional universe. If anything, I wanted the whole movie to feel as goofily bowchickabowwow as the sexier scenes do. But instead, I felt like I was watching Troy and Gabriella from High School Musical suddenly and without warning start humping after their lifeguarding shifts at the country club. And while Perez is out here doing Hannah Montana–core, Nicholas Galitzine (Snooty Blonde Prince Henry) is in an entirely different movie altogether, an archly charming British rom-com about a chilly prince with a gooey heart that feels like a sibling to the (good) 2003 Amanda Bynes movie What a Girl Wants. As a result of this flagrant dissonance, their pairing feels fundamentally off. What did you make of their chemistry/sex scenes?
JM: Honestly, it’s nice to see a few thrusts. The gays never get onscreen thrusts, so when Alex and Harry made it to a hotel room in Paris (with the Eiffel Tower within view, of course) and the movie didn’t cut away immediately, I had to give its director Matthew López a little credit. They don’t put the thrusts on Heartstopper. (There is, admittedly, also a good joke about how the prince went to British boarding school so he knows how to fuck.) Unfortunately, like the rest of the movie, the sex is not the stuff of great visual beauty. It’s over-lit, and we’re in statuesque near-zero percent body fat territory, so it felt a little like watching someone smash two Ken dolls together. (Greta Gerwig, why did you not consider putting that in Barbie?) López also wrote The Inheritance, a play that had a similarly Gay Ken ensemble with the occasional near-smutty sex scene followed by reaches for serious meaning. Red, White, & Royal Blue definitely knows it’s a trifle, but the more it tried to make Alex and Henry’s predicament seem big and important, the more I just wanted to go back to hooking up. There’s an unsteady quality that you see in actual smut where the characterization gets rushed so the writing can just get to the steamy stuff, except it’s reversed here, and the movie kept trying to jump back from heir-on-heir action to pontificating about how it’s hard to be royal and gay and how Texas could go blue(???) in an election. That plotline’s less believable than Uma’s Sienna Miller-esque approach to a Southern accent.
RH: That’s such a good point about it feeling like reverse smut — a much more elegant way of expressing my point about it feeling like two tonally detached movies. López described the movie as “the most expensive fanfiction ever made,” which inadvertently functions as my pithiest review of it. I could handle Uma’s Southern accent until she started using it to warmly lecture her (sexually experienced, 20-something) son about Truvada, HPV, topping, and bottoming over pizza in the Oval Office. When I told a gay film critic friend of mine about this, he was aghast: “I don’t want Amazon knowing all that about my lifestyle!” Though I understand its good intentions, that scene felt particularly forced and surreal, like a bad parody of the right-wing “this is the future liberals want” memes: A woman president hawking pharmaceuticals to her bisexual son beneath a portrait of Harriet Tubman.
It was just one of the dozens of moments that took me out of the movie to wonder desperately about the choices that had been made therein, including but not limited to those involving the cheap, flat, unimaginative green-screen visuals: The fact that Alex’s New Year’s party looked like a Marriott commercial you might see on a plane before your in-flight movie starts, the inexplicable overreliance throughout on the static medium shot, the fact that the costume designer kept dressing all the men in two shirts stacked on top of each other (one tank, one unbuttoned), the fact that the meager crowd scenes all felt like CGI … did this movie have no budget or was all of it spent on Alex’s plastic New Year’s Eve tent, or maybe on that gigantic cake? Why didn’t Truvada pony up more cash for that astoundingly unforgettable product placement?
JM: I am haunted by the image of the giant cake toppling toward the two of them. It takes up the whole screen and yet appears to have no weight of its own, a phenomenon sure to baffle even our nation’s greatest physicists — the former child actors of Oppenheimer. Not having read the book, I can see how it might be difficult to translate a heightened “meet-cute” like that to the real world, but the Wayfair-catalog aesthetic here drains the wish fulfillment out of the romance. Speaking of Uma’s Oval Office PrEP PSA, I also had a lot of trouble connecting with Alex’s coming-out plotline because his relationship with Harry (which grows out of antagonistically making fun of each other’s Instagram presences … relatable) is supposed to be a big awakening, but then he also freely admits that he’s hooked up with … an evil gay political reporter in the past! I guess a lot of gay media with a straight audience in mind — and this story, in particular, smacks of all the tropes of yaoi-style stories written about gay men, typically to be consumed by an audience of not us — can’t resist making coming out the centerpiece of the narrative, but my dude, if you’ve already spent hot tub time with a blogger, you can’t claim you’re suddenly discovering the wonders of the male body. Having a reporter hooking up with his sources is already a tacky trope, and obviously, his retaliation via forced outing is not the best plan, but I’m ready to hear Mr. Reporter’s perspective. Must sting when your regular low-key trick is like, Actually, I can only embrace attraction when it comes from a prince. Give him a Max original spinoff series where he sleeps his way through Washington, outing political figures right and left (pun intended; I imagine this series to be full of terrible puns).
RH: That’s one of several things that’s tweaked from the book — as far as I can recall, Henry is Alex’s first Real Gay Experience in the novel, and that all makes a lot more sense (it would also make the left-field Presidential PrEp commercial feel a little less uncanny-valley). I know plotlines and people must be streamlined and sanded down as a matter of course when a story is translated from page to screen, but they really did a lot of the OG characters dirty here, which bums me out because they’re so well-drawn in the book. For instance, Nora, Alex’s best friend, is this witty queer MIT graduate in the novel who gets a storyline of her own; in the movie, she exists almost solely as a receptacle for Alex’s general whininess. And whither Alex’s entire sister, June? On the page, the two main characters are layered, funny, and explicitly legible as rom-com protagonists — among other things, Alex is 43 percent less smarmy. Their flirty banter is smarter, weirder, fresher, and generally, much less cringe-inducing than first-draft lines in the movie like, “Did your parents send you to snobbery school or does looking down on people come naturally to you?” Which is another reason why the movie is so baffling to me — the book was very obviously inspired by rom-coms of yore. It should have been a relatively easy graft, screenplay-wise. And I won’t even get into the total sidelining of Henry’s sister Bea (aka “The Powder Princess”), who has a book storyline about a previous cocaine problem and recovery, which, come on, at least give us some cocaine!
JM: Wait, I was denied cocaine???
RH: I do think certain sequences in this movie make you feel like you’re on cocaine, like the part where Alex and Henry lock eyes across the Marriott New Year’s Eve party as they fail to get appropriately low during “Get Low.” Or at the end when Uma wins the White House again, and they’re waving at her supporters but nobody is actually physically there. Or the scenes when Henry and Alex speak their text messages aloud as the actual texts race past their faces on screen, or when they FaceTime across the globe but López places them next to each other on a bed.
JM: The montage of Alex on the campaign trail in Texas felt similarly surreal. The crowds are never big enough. And his approach to fieldwork seems centered on drawing a big thermometer for donations in the middle of the office. I have no idea why the people of America are supposed to love him so. The movie tries to sell us on Alex and his father feeling like outsiders as Latinos in America, but it’s hard to take that seriously when they currently possess a massive bit of real estate in Texas with a dock purpose-built for bathing suit lounging. I shudder at the implication near the end of the movie that Alex is going to run for office next when I imagine his true passion — as for all children of political dynasties — would lie somewhere closer to posting the odd meme video online and doing a few product endorsements. Given that this is being released on Prime Video, I would not be surprised if they added little pop-ups so that you could, for instance, buy the swimsuits they are wearing as you watch. What is e-commerce if not the logical next step for gay media with representation as its only goal?
By submitting your email, you agree to our
Terms and Privacy Notice
and to receive email correspondence from us. This site is protected by reCAPTCHA and the Google
Privacy Policy and
Terms of Service apply.
or
Already a subscriber?
What is your email?
This email will be used to sign into all New York sites. By submitting your email, you agree to our Terms and Privacy Policy and to receive email correspondence from us.
Password must be at least 8 characters and contain:
Lower case letters (a-z)
Upper case letters (A-Z)
Numbers (0-9)
Special Characters (!@#$%^&*)
This password will be used to sign into all New York sites. By submitting your email, you agree to our Terms and Privacy Policy and to receive email correspondence from us.
You’re in!
As part of your account, you’ll receive occasional updates and offers from New York, which you can opt out of anytime.
or
Already a subscriber?
What is your email?
This email will be used to sign into all New York sites. By submitting your email, you agree to our Terms and Privacy Policy and to receive email correspondence from us.
Password must be at least 8 characters and contain:
Lower case letters (a-z)
Upper case letters (A-Z)
Numbers (0-9)
Special Characters (!@#$%^&*)
This password will be used to sign into all New York sites. By submitting your email, you agree to our Terms and Privacy Policy and to receive email correspondence from us.
You’re in!
As part of your account, you’ll receive occasional updates and offers from New York, which you can opt out of anytime.
Already a subscriber?
Already a subscriber?
`;
// integrate Sub(x) scripts and elements
if (hostname !== 'subs.nymag.com') { // do not integrate on this subdomain
document.head.appendChild(trackingScript);
document.body.insertAdjacentHTML('beforeend', subXAnimationElements);
}
There was an error processing the request. Please try again later."}).catch(e=>console.error("Error verifying email: ",e)))(r.querySelector(".content"),o.bannerCTAVerification)})):(l.remove(),s.remove()),o.dismissable||n.remove(),o.useAlertIcon||a.remove(),r.classList.add("show"),n.addEventListener("click",()=>{u(),r.classList.remove("show")})}else r.remove()}});
}, {"1":1,"6":6,"12":12,"35":35,"40":40}];
window.modules["global-nav.client"] = [function(require,module,exports){"use strict";const dom=require(3),auth=require(12),signInButton=dom.find(".user-signin"),signOutButton=dom.find(".user-signout"),globalNav=dom.find('[class^="global-nav"]'),body=dom.find("body"),dropdownItems=dom.findAll(".dropdown-wrap"),gtm=require(1),appendLandingPageParams=require(136),pageUri=require(124).getPageUri(),subscriptionPromoLinks=dom.findAll(".persist-params"),searchString=window.location.search||"";function closeDropdowns(e){let n=globalNav.querySelectorAll(".dropdown.open");dropdownItems.forEach(function(t){let o=t.querySelector(".dropdown");!n||t.contains(e.target)&&27!==e.keyCode||o.classList.remove("open")})}function gtmSendReport(e,n,t){let o={eventCategory:"ecommerce",eventAction:"componentClick",brand:e,dimension23:"global-nav",list:pageUri,pageZone:"header",variant:"nav-link"};"global-nav-link"===t&&(o.eventLabel=n.href),gtm.reportNow(o)}function updateElementTargetUrlsIfQueryStrings(e){if(searchString){const n=new URLSearchParams(searchString);let t=e.href;if(t.includes("?")){const o=t.split("?"),i=new URLSearchParams(o[1]);for(let e of n.entries())i.set(e[0],e[1]);t=`${o[0]}?${i.toString()}`,e.href=t}else e.href=`${t}?${n.toString()}`}}function init(e){const n=e.querySelectorAll(".to-landing-page");window.addEventListener("auth:init",()=>{signInButton.addEventListener("click",function(e){e.preventDefault(),auth.showEmbeddedLoginFlow("top navigation")}),signOutButton.addEventListener("click",function(e){e.preventDefault(),gtmSendReport("Sign Out",e.target,"user-info-link"),auth.logout()}),auth.isAuthenticated()&&e.classList.add("signed-in"),auth.isSubscriber()&&e.classList.add("subscribed"),e.querySelectorAll(".user-link").forEach(e=>{e.classList.add("active")}),subscriptionPromoLinks.forEach(e=>{updateElementTargetUrlsIfQueryStrings(e)}),appendLandingPageParams(n)})}dropdownItems.forEach(function(e){e.addEventListener("click",function(){e.querySelector(".dropdown").classList.toggle("open")})}),body.addEventListener("click",closeDropdowns),document.addEventListener("keydown",closeDropdowns),globalNav.addEventListener("click",function(e){let n=e.target;n.classList.contains("global-nav-track")&>mSendReport(n.text,n,"global-nav-link")}),module.exports=init;
}, {"1":1,"3":3,"12":12,"124":124,"136":136}];
window.modules["aaa-module-mounting.legacy"] = [function(require,module,exports){"use strict";const _pickBy=require(221),_each=require(408),Fingerprint2=require(407),DS=require(406),Eventify=require(246);function registerGlobals(){window.DS=DS,window.Eventify=Eventify,window.Fingerprint2=Fingerprint2,DS.value("Eventify",Eventify),DS.value("Fingerprint2",Fingerprint2),DS.value("$document",window.document),DS.value("$window",window)}function mountDollarSliceComponents(){DS.service("components",["$document","$module",function(e,n){var o=_pickBy(n.definitions,e=>e.providerStrategy===n.providers.controller),r=Object.keys(o);function t(e){return o=>{try{n.get(e,o)}catch(e){logMountError(o,e)}}}_each(r,n=>{var o=e.querySelectorAll('[data-uri*="/_components/'+n+'/"]'),r=e.querySelectorAll('[data-uri$="/_components/'+n+'"]');_each(o,t(n)),_each(r,t(n))}),this.components=r}]),DS.get("components")}function logMountError(e,n){const o=e.outerHTML.slice(0,e.outerHTML.indexOf(e.innerHTML));console.error("Error attaching controller to "+o,n)}registerGlobals(),"loading"===document.readyState?document.addEventListener("DOMContentLoaded",()=>{mountDollarSliceComponents()}):mountDollarSliceComponents();
}, {"221":221,"246":246,"406":406,"407":407,"408":408}];
window.modules["ads.legacy"] = [function(require,module,exports){"use strict";const _map=require(118),_forEach=require(107),_isString=require(268),_intersectionWith=require(409),_isEqual=require(274),_each=require(408),_debounce=require(182),_sortBy=require(205),page=require(124),visit=require(114);DS.service("adService",["Eventify","$cid","$document","$window",function(e,t,a,i){var o,n,s,r,d,c,u,l,g={},p=this,h=[],f=visit.getQueryParamsObject(["utm_campaign"]),m=document.querySelector('script[data-type="ad-a9"]'),b=[],w=!1,v=[],y=document.querySelector('script[data-name="ad-doubleverify"]');document.querySelector('script[data-name="concert-ads"]')||(i.NYM={},i.NYM.analytics={},i.NYM.analytics.adStartTime=i.performance.now(),i.googletag=i.googletag||{},i.googletag.cmd=i.googletag.cmd||[],u=i.googletag,(m||y)&&(i.googletag.cmd=i.googletag.cmd||[],i.googletag.cmd.push(function(){i.googletag.pubads().disableInitialLoad()})),m&&(l=i.setInterval(function(){void 0!==window.apstag&&void 0!==window.apstag.timeout&&(i.clearInterval(l),window.apstag.cleared=!0,l=null)},10),setTimeout(function(){l&&(i.clearInterval(l),i.googletag.pubads().refresh(),window.apstag||console.log("MESSAGE: Timeout for A9 load exceeded, aborting"))},500)),y&&(b.push(new Promise(function(e){w?e():v.push(e)})),c=i.setTimeout(T,2500)),o=function(e){var t,a,o=e.data,n=[];return o.loaded?e:(o.loaded=!0,t=null,(t=o.sizes?u.defineSlot(o.name,o.sizes,o.id).addService(u.pubads()):u.defineOutOfPageSlot(o.name,o.id).addService(u.pubads())).setTargeting("adid",o.id),f.hasOwnProperty("utm_campaign")&&t.setTargeting("utmcamp",f.utm_campaign),a=p.getAdCount(o.label),t.setTargeting("label",o.label+"_"+o.site+"-"+a),u.display(o.id),u.pubads().addEventListener("slotOnload",function(){i.NYM.analytics.firstAdLoadTime||(i.NYM.analytics.firstAdLoadTime=i.performance.now(),i.NYM.analytics.firstAdLoadLabel=e.data.label)}),n=_(o),Promise.all(b).then(function(){n?window.apstag&&window.apstag.cleared?window.apstag.fetchBids({slots:[n],timeout:window.apstag.timeout},function(){u.cmd.push(function(){window.apstag.setDisplayBids(),u.pubads().refresh([t],{changeCorrelator:!1})})}):y&&u.pubads().refresh([t],{changeCorrelator:!1}):u.pubads().refresh([t],{changeCorrelator:!1})}),e.slot=t,e)},n=function(e){var a,i,o,n=t(),s=e.getAttribute("data-name"),r=e.getAttribute("data-sizes"),d=e.getAttribute("data-label"),c=e.getAttribute("data-site");n=e.id,r&&r.length?(r=r.split(","),a=[],_map(r,function(e){e=e.split("x"),i=parseInt(e[0]),o=parseInt(e[1]),a.push([i,o])})):(e.classList.add("oop"),a=!1),this.data={id:n,name:s,sizes:a,loaded:!1,label:d,site:c},g[n]=this},r=function(e){u.cmd.push(function(){var t=o(e);g[e.data.id]=t})},s=function(e){var t=[];e.slot?(t=_(e))&&window.apstag&&window.apstag.cleared&&window.apstag.fetchBids({slots:[t],timeout:window.apstag.timeout},function(){u.cmd.push(function(){window.apstag.setDisplayBids(),u.pubads().refresh([e.slot],{changeCorrelator:!1})})}):e&&r(e)},u.cmd.push(function(){var e,t,o,n=page.getMeta("article:tag"),s=page.getMeta("author"),r=i.location.href,d=(e=a.head.querySelector(".head-gtm"),t=a.body.querySelector(".gtm"),e&&"top"===e.getAttribute("data-gtm")?"gtmtop":t&&"bottom"===t.getAttribute("data-gtm")?"gtmbottom":"");o=[],_forEach([n,s,d],function(e){_forEach(e.split(","),function(e){(e=e.trim().toLowerCase().replace(/\s/g,"-").replace(/\'|\’/g,"")).length&&o.push(e)})}),u.pubads().setTargeting("kw",o),u.pubads().setTargeting("entry_group",o),r=r.slice(r.lastIndexOf("/")+1),u.pubads().setTargeting("pn",r),u.companionAds().setRefreshUnfilledSlots(!0),u.pubads().enableAsyncRendering(),u.enableServices()}),this.load=r,this.create=function(e){return new n(e)},this.refresh=function(e){var t;_isString(e)?(t=this.getById(e),s(t)):s(e)},this.remove=function(e){var t=e.data.id;a.getElementById(t).innerHTML=""},this.getAdCount=function(e){var t,a=0,i=Object.keys(g);return _each(i,function(i){(t=g[i]).data.loaded&&t.data.label===e&&a++}),a},this.getById=function(e){return g[e]},d=_debounce(function(){var e={TopLeaderboard:1,RightColTopMPU:2,outOfPage:99,"homepageTakeover/TopLeaderboard":1},t=_sortBy(h,function(t){return e[t.data.label]||10});_forEach(t,function(e){return e.data.sizes?r(e):i.setTimeout(function(){r(e)},2e3)}),y&&window.PQ.cmd.push(()=>{try{window.PQ.loadSignals(["ids","bsc","vlp"],T)}catch(e){T(),console.error(`There has been an error loading Double Verify signals: ${e}`)}}),h=[]},10),this.addToPageLoadQueue=function(e){h.push(e),d()});function _(e){var t,a=e.sizes;return a=_intersectionWith(a,[[970,250],[970,90],[728,90],[300,600],[300,250],[320,100],[320,50]],_isEqual),e.sizes&&e.sizes.length&&(t={slotID:e.id,sizes:a,slotName:e.label}),t}function T(){i.clearTimeout(c),w=!0,_forEach(v,function(e){e()})}}]);
}, {"107":107,"114":114,"118":118,"124":124,"182":182,"205":205,"268":268,"274":274,"408":408,"409":409}];
window.modules["cid.legacy"] = [function(require,module,exports){"use strict";DS.service("$cid",function(){var r=Math.floor(100*Math.random());return function(){return"cid-"+ ++r}});
}, {}];
window.modules["client.legacy"] = [function(require,module,exports){"use strict";require("cid.legacy"),require("ads.legacy"),require("facebook.legacy"),require("aaa-module-mounting.legacy");
}, {"cid.legacy":"cid.legacy","aaa-module-mounting.legacy":"aaa-module-mounting.legacy","ads.legacy":"ads.legacy","facebook.legacy":"facebook.legacy"}];
window.modules["facebook.legacy"] = [function(require,module,exports){"use strict";DS.service("facebook",[function(){this.fb=function(i){window.FB&&window.FB[i].apply(this,Array.prototype.slice.call(arguments,1))}}]);
}, {}];
require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o typeof key === 'string' && key.match(/\.legacy$/)).forEach(key => window.require(key));
}
function tryToMount(fn, el, name) {
try {
fn(el); // init the controller
} catch (e) {
const elementTag = el.outerHTML.slice(0, el.outerHTML.indexOf(el.innerHTML));
console.error(`Error initializing controller for "${name}" on "${elementTag}"`, e);
}
}
/**
* mount client.js component controllers
*/
function mountComponentModules() {
Object.keys(window.modules).filter(key => typeof key === 'string' && key.match(/\.client$/)).forEach(key => {
let controllerFn = window.require(key);
if (typeof controllerFn === 'function') {
const name = key.replace('.client', ''),
instancesSelector = `[data-uri*="_components/${name}/"]`,
defaultSelector = `[data-uri$="_components${name}"]`,
instances = document.querySelectorAll(instancesSelector),
defaults = document.querySelectorAll(defaultSelector);
for (let el of instances) {
tryToMount(controllerFn, el, name);
}
for (let el of defaults) {
tryToMount(controllerFn, el, name);
}
}
});
}
// Make sure that a `window.process.env.NODE_ENV` is available in the client for any dependencies,
// services, or components that could require it
// note: the `` value is swapped for the actual environment variable in /lib/cmd/compile/scripts.js
window.process = window.process || {};
window.process.env = window.process.env || {};
if (!window.process.env.NODE_ENV) {
window.process.env.NODE_ENV = '';
}
// note: legacy controllers that require legacy services (e.g. dollar-slice) must
// wait for DOMContentLoaded to initialize themselves, as the files themselves must be mounted first
mountLegacyServices();
mountComponentModules();
// ]]