From ff306a1e2f3a28c73ccff6959a907b3f16f1423c Mon Sep 17 00:00:00 2001 From: Christian Maddox Date: Fri, 10 May 2024 13:16:50 -0400 Subject: [PATCH] WIP: Triptych app changes (#2038) * Add a doc with triptych testing tips * Formatting. * Ignore refreshRate for OFM. * Added new webpack module for packaged triptychs. * Updated package instructions to use new packaged triptych entry. * Version bump. * Image load changes. * Triptych instruction updates. * TSConfig changes to help resolve png imports. * Formatting. * Added webpack-env for require.context. * Fixed SVGR configuration for Triptych packages. * Temporarily always show crowding widget. * Fixed file-loader config for deployed apps. * Formatting. * Doc update. * Revert change that shouldn't have been committed. * Fix lint. * Moved declarations to existing file. * Added a custom path to webpack and tsconfig for static images. * Added a comment. * Made some common webpack objects to reduce code duplication. * Wording change brought over from #1877. * Simplified README by providing the file in the repo. * Removed doc. * Fixed regex. * Forgot how to make variables apparently. * Version bump. * Version bump. --------- Co-authored-by: Jon Zimbel --- assets/package-lock.json | 13 + assets/package.json | 1 + .../v2/cr_departures/cr_departure_time.tsx | 2 +- .../cr_departures_header_free.tsx | 2 +- .../cr_departures_header_normal.tsx | 2 +- .../cr_departures/overnight_cr_departures.tsx | 2 +- .../disruption_diagram/disruption_diagram.tsx | 14 +- .../v2/dup/departures/no_data_section.tsx | 2 +- .../components/v2/dup/page_load_no_data.tsx | 2 +- .../v2/eink/bottom_screen_filler.tsx | 2 +- .../components/v2/eink/departures_no_data.tsx | 2 +- assets/src/components/v2/eink/no_data.tsx | 2 +- .../components/v2/eink/page_load_no_data.tsx | 2 +- .../components/v2/lcd/departures_no_data.tsx | 2 +- assets/src/components/v2/lcd/no_data.tsx | 4 +- .../components/v2/lcd/page_load_no_data.tsx | 2 +- assets/src/components/v2/normal_header.tsx | 2 +- .../v2/outfront_evergreen_content.tsx | 5 + .../v2/pre_fare_single_screen_alert.tsx | 12 +- assets/src/components/v2/shuttle_bus_info.tsx | 4 +- assets/src/components/v2/train_crowding.tsx | 50 ++-- assets/src/components/v2/triptych/README.md | 102 ++++--- assets/src/components/v2/triptych/no_data.tsx | 8 +- .../v2/triptych/page_load_no_data.tsx | 8 +- assets/src/components/v2/triptych/version.tsx | 2 +- assets/src/custom.d.ts | 5 +- assets/src/hooks/v2/use_api_response.tsx | 4 +- assets/src/util/util.tsx | 7 +- assets/static/images/svgr_bundled/README.md | 2 +- assets/tsconfig.json | 5 +- assets/webpack.config.js | 278 ++++++++++++------ priv/triptych-app.html | 20 ++ priv/triptych_preview.png | Bin 466841 -> 51996 bytes priv/triptych_template.json | 2 +- 34 files changed, 364 insertions(+), 208 deletions(-) create mode 100644 priv/triptych-app.html diff --git a/assets/package-lock.json b/assets/package-lock.json index a32e4dc8a..e70884a2f 100644 --- a/assets/package-lock.json +++ b/assets/package-lock.json @@ -41,6 +41,7 @@ "@types/react": "^17.0.14", "@types/react-dom": "^17.0.9", "@types/react-router-dom": "^5.1.8", + "@types/webpack-env": "^1.18.4", "babel-loader": "^8.2.2", "concurrently": "^8.2.2", "copy-webpack-plugin": "^6.4.1", @@ -7831,6 +7832,12 @@ "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", "dev": true }, + "node_modules/@types/webpack-env": { + "version": "1.18.4", + "resolved": "https://registry.npmjs.org/@types/webpack-env/-/webpack-env-1.18.4.tgz", + "integrity": "sha512-I6e+9+HtWADAWeeJWDFQtdk4EVSAbj6Rtz4q8fJ7mSr1M0jzlFcs8/HZ+Xb5SHzVm1dxH7aUiI+A8kA8Gcrm0A==", + "dev": true + }, "node_modules/@types/yargs-parser": { "version": "20.2.1", "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.1.tgz", @@ -28105,6 +28112,12 @@ "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", "dev": true }, + "@types/webpack-env": { + "version": "1.18.4", + "resolved": "https://registry.npmjs.org/@types/webpack-env/-/webpack-env-1.18.4.tgz", + "integrity": "sha512-I6e+9+HtWADAWeeJWDFQtdk4EVSAbj6Rtz4q8fJ7mSr1M0jzlFcs8/HZ+Xb5SHzVm1dxH7aUiI+A8kA8Gcrm0A==", + "dev": true + }, "@types/yargs-parser": { "version": "20.2.1", "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.1.tgz", diff --git a/assets/package.json b/assets/package.json index b2d6b8d1a..30218af59 100644 --- a/assets/package.json +++ b/assets/package.json @@ -50,6 +50,7 @@ "@types/react": "^17.0.14", "@types/react-dom": "^17.0.9", "@types/react-router-dom": "^5.1.8", + "@types/webpack-env": "^1.18.4", "babel-loader": "^8.2.2", "concurrently": "^8.2.2", "copy-webpack-plugin": "^6.4.1", diff --git a/assets/src/components/v2/cr_departures/cr_departure_time.tsx b/assets/src/components/v2/cr_departures/cr_departure_time.tsx index d2a079c67..c5877d43f 100644 --- a/assets/src/components/v2/cr_departures/cr_departure_time.tsx +++ b/assets/src/components/v2/cr_departures/cr_departure_time.tsx @@ -2,7 +2,7 @@ import BaseDepartureTime from "Components/eink/base_departure_time"; import moment from "moment"; import React from "react"; import { TimeRepresentation } from "Util/time_representation"; -import LiveDataSvg from "../../../../static/images/svgr_bundled/live-data-small.svg"; +import LiveDataSvg from "Images/svgr_bundled/live-data-small.svg"; interface CRDepartureTimeProps { departureType: "schedule" | "prediction"; diff --git a/assets/src/components/v2/cr_departures/cr_departures_header_free.tsx b/assets/src/components/v2/cr_departures/cr_departures_header_free.tsx index 09812edac..fe9f8e4a9 100644 --- a/assets/src/components/v2/cr_departures/cr_departures_header_free.tsx +++ b/assets/src/components/v2/cr_departures/cr_departures_header_free.tsx @@ -1,6 +1,6 @@ import React from "react"; -import CRPill from "../../../../static/images/svgr_bundled/pills/commuter-rail.svg"; +import CRPill from "Images/svgr_bundled/pills/commuter-rail.svg"; import RoutePill from "../departures/route_pill"; import { getHexColor } from "Util/svg_utils"; diff --git a/assets/src/components/v2/cr_departures/cr_departures_header_normal.tsx b/assets/src/components/v2/cr_departures/cr_departures_header_normal.tsx index a5bf6f32c..cbc9efb5d 100644 --- a/assets/src/components/v2/cr_departures/cr_departures_header_normal.tsx +++ b/assets/src/components/v2/cr_departures/cr_departures_header_normal.tsx @@ -1,6 +1,6 @@ import React from "react"; -import CRPill from "../../../../static/images/svgr_bundled/pills/commuter-rail.svg"; +import CRPill from "Images/svgr_bundled/pills/commuter-rail.svg"; import { getHexColor } from "Util/svg_utils"; const CRDeparturesHeaderNormal = () => { diff --git a/assets/src/components/v2/cr_departures/overnight_cr_departures.tsx b/assets/src/components/v2/cr_departures/overnight_cr_departures.tsx index 97befbb5d..905dc17ed 100644 --- a/assets/src/components/v2/cr_departures/overnight_cr_departures.tsx +++ b/assets/src/components/v2/cr_departures/overnight_cr_departures.tsx @@ -1,7 +1,7 @@ import React, { ComponentType } from "react"; import DeparturesTable from "Components/v2/cr_departures/cr_departures_table"; import CRDeparturesHeader from "Components/v2/cr_departures/cr_departures_header_normal"; -import OvernightMoon from "../../../../static/images/svgr_bundled/overnight.svg"; +import OvernightMoon from "Images/svgr_bundled/overnight.svg"; import moment from "moment"; import { imagePath } from "Util/util"; import { Direction } from "./cr_departures"; diff --git a/assets/src/components/v2/disruption_diagram/disruption_diagram.tsx b/assets/src/components/v2/disruption_diagram/disruption_diagram.tsx index 7ce84bb8e..e68f1d989 100644 --- a/assets/src/components/v2/disruption_diagram/disruption_diagram.tsx +++ b/assets/src/components/v2/disruption_diagram/disruption_diagram.tsx @@ -9,13 +9,13 @@ import React, { } from "react"; import { classWithModifier, classWithModifiers } from "Util/util"; -import LargeXOctagonBordered from "../../../../static/images/svgr_bundled/disruption_diagram/large-x-octagon-bordered.svg"; -import SmallXOctagon from "../../../../static/images/svgr_bundled/disruption_diagram/small-x-octagon.svg"; -import CurrentStopDiamond from "../../../../static/images/svgr_bundled/disruption_diagram/current-stop-diamond.svg"; -import CurrentStopOpenDiamond from "../../../../static/images/svgr_bundled/disruption_diagram/current-stop-open-diamond.svg"; -import ArrowLeftEndpoint from "../../../../static/images/svgr_bundled/disruption_diagram/arrow-left-endpoint.svg"; -import ArrowRightEndpoint from "../../../../static/images/svgr_bundled/disruption_diagram/arrow-right-endpoint.svg"; -import ShuttleBusIcon from "../../../../static/images/svgr_bundled/disruption_diagram/shuttle-emphasis-icon.svg"; +import LargeXOctagonBordered from "Images/svgr_bundled/disruption_diagram/large-x-octagon-bordered.svg"; +import SmallXOctagon from "Images/svgr_bundled/disruption_diagram/small-x-octagon.svg"; +import CurrentStopDiamond from "Images/svgr_bundled/disruption_diagram/current-stop-diamond.svg"; +import CurrentStopOpenDiamond from "Images/svgr_bundled/disruption_diagram/current-stop-open-diamond.svg"; +import ArrowLeftEndpoint from "Images/svgr_bundled/disruption_diagram/arrow-left-endpoint.svg"; +import ArrowRightEndpoint from "Images/svgr_bundled/disruption_diagram/arrow-right-endpoint.svg"; +import ShuttleBusIcon from "Images/svgr_bundled/disruption_diagram/shuttle-emphasis-icon.svg"; // Width of the disruption diagram, dependent on the screen width const DIAGRAM_WIDTH = 904; diff --git a/assets/src/components/v2/dup/departures/no_data_section.tsx b/assets/src/components/v2/dup/departures/no_data_section.tsx index 05e4350d1..362d9d91b 100644 --- a/assets/src/components/v2/dup/departures/no_data_section.tsx +++ b/assets/src/components/v2/dup/departures/no_data_section.tsx @@ -1,6 +1,6 @@ import React from "react"; -import NoConnection from "../../../../../static/images/svgr_bundled/live-data-none.svg"; +import NoConnection from "Images/svgr_bundled/live-data-none.svg"; import FreeText from "Components/v2/free_text"; const NoDataSection = ({ text }) => { diff --git a/assets/src/components/v2/dup/page_load_no_data.tsx b/assets/src/components/v2/dup/page_load_no_data.tsx index bca4119c6..d235c3529 100644 --- a/assets/src/components/v2/dup/page_load_no_data.tsx +++ b/assets/src/components/v2/dup/page_load_no_data.tsx @@ -1,6 +1,6 @@ import React, { ComponentType } from "react"; import LinkArrow from "../bundled_svg/link_arrow"; -import Loading from "../../../../static/images/svgr_bundled/loading.svg"; +import Loading from "Images/svgr_bundled/loading.svg"; import NormalHeader from "./normal_header"; import { REPLACEMENTS } from "./no_data"; import { useStationName } from "Hooks/outfront"; diff --git a/assets/src/components/v2/eink/bottom_screen_filler.tsx b/assets/src/components/v2/eink/bottom_screen_filler.tsx index 29e6de201..d0017f4dd 100644 --- a/assets/src/components/v2/eink/bottom_screen_filler.tsx +++ b/assets/src/components/v2/eink/bottom_screen_filler.tsx @@ -1,5 +1,5 @@ import React, { ComponentType } from "react"; -import HandWithPhone from "../../../../static/images/svgr_bundled/hand-with-phone.svg"; +import HandWithPhone from "Images/svgr_bundled/hand-with-phone.svg"; const BottomScreenFiller: ComponentType = () => (
diff --git a/assets/src/components/v2/eink/departures_no_data.tsx b/assets/src/components/v2/eink/departures_no_data.tsx index 24bf7c451..b65b35309 100644 --- a/assets/src/components/v2/eink/departures_no_data.tsx +++ b/assets/src/components/v2/eink/departures_no_data.tsx @@ -1,5 +1,5 @@ import React, { ComponentType } from "react"; -import NoConnection from "../../../../static/images/svgr_bundled/live-data-none.svg"; +import NoConnection from "Images/svgr_bundled/live-data-none.svg"; interface Props { show_alternatives: boolean; diff --git a/assets/src/components/v2/eink/no_data.tsx b/assets/src/components/v2/eink/no_data.tsx index 8fbdead6a..ab30d5e4a 100644 --- a/assets/src/components/v2/eink/no_data.tsx +++ b/assets/src/components/v2/eink/no_data.tsx @@ -1,6 +1,6 @@ import React, { ComponentType } from "react"; import { imagePath } from "Util/util"; -import NoConnection from "../../../../static/images/svgr_bundled/live-data-none.svg"; +import NoConnection from "Images/svgr_bundled/live-data-none.svg"; import BottomScreenFiller from "Components/v2/eink/bottom_screen_filler"; import moment from "moment"; diff --git a/assets/src/components/v2/eink/page_load_no_data.tsx b/assets/src/components/v2/eink/page_load_no_data.tsx index 8eff7936b..87fc35b9e 100644 --- a/assets/src/components/v2/eink/page_load_no_data.tsx +++ b/assets/src/components/v2/eink/page_load_no_data.tsx @@ -1,7 +1,7 @@ import React, { ComponentType } from "react"; import { imagePath } from "Util/util"; import BottomScreenFiller from "Components/v2/eink/bottom_screen_filler"; -import Loading from "../../../../static/images/svgr_bundled/loading.svg"; +import Loading from "Images/svgr_bundled/loading.svg"; const PageLoadNoData: ComponentType = () => { return ( diff --git a/assets/src/components/v2/lcd/departures_no_data.tsx b/assets/src/components/v2/lcd/departures_no_data.tsx index d018cb225..084b30262 100644 --- a/assets/src/components/v2/lcd/departures_no_data.tsx +++ b/assets/src/components/v2/lcd/departures_no_data.tsx @@ -1,5 +1,5 @@ import React, { ComponentType } from "react"; -import NoConnection from "../../../../static/images/svgr_bundled/live-data-none.svg"; +import NoConnection from "Images/svgr_bundled/live-data-none.svg"; interface Props { show_alternatives: boolean; diff --git a/assets/src/components/v2/lcd/no_data.tsx b/assets/src/components/v2/lcd/no_data.tsx index 465d283e5..5ea372668 100644 --- a/assets/src/components/v2/lcd/no_data.tsx +++ b/assets/src/components/v2/lcd/no_data.tsx @@ -1,6 +1,6 @@ -import NoConnection from "../../../../static/images/svgr_bundled/live-data-none.svg"; +import NoConnection from "Images/svgr_bundled/live-data-none.svg"; import React, { ComponentType } from "react"; -import TLogo from "../../../../static/images/svgr_bundled/logo.svg"; +import TLogo from "Images/svgr_bundled/logo.svg"; interface Props { show_alternatives: boolean; diff --git a/assets/src/components/v2/lcd/page_load_no_data.tsx b/assets/src/components/v2/lcd/page_load_no_data.tsx index e99b7316a..90729f7cb 100644 --- a/assets/src/components/v2/lcd/page_load_no_data.tsx +++ b/assets/src/components/v2/lcd/page_load_no_data.tsx @@ -1,5 +1,5 @@ import React, { ComponentType } from "react"; -import Loading from "../../../../static/images/svgr_bundled/loading.svg"; +import Loading from "Images/svgr_bundled/loading.svg"; const coolBlack = "#171F26"; diff --git a/assets/src/components/v2/normal_header.tsx b/assets/src/components/v2/normal_header.tsx index 87405f2dc..da8397786 100644 --- a/assets/src/components/v2/normal_header.tsx +++ b/assets/src/components/v2/normal_header.tsx @@ -2,7 +2,7 @@ import useTextResizer from "Hooks/v2/use_text_resizer"; import React, { forwardRef, ComponentType } from "react"; import { getDatasetValue } from "Util/dataset"; -import LiveDataSvg from "../../../static/images/svgr_bundled/live-data-small.svg"; +import LiveDataSvg from "Images/svgr_bundled/live-data-small.svg"; import { classWithModifier, diff --git a/assets/src/components/v2/outfront_evergreen_content.tsx b/assets/src/components/v2/outfront_evergreen_content.tsx index 939a558b1..aaa8ea835 100644 --- a/assets/src/components/v2/outfront_evergreen_content.tsx +++ b/assets/src/components/v2/outfront_evergreen_content.tsx @@ -5,6 +5,11 @@ import useIsOnScreen from "Hooks/v2/use_is_on_screen"; import { imagePath } from "Util/util"; import { TRIPTYCH_VERSION } from "./triptych/version"; import { usePlayerName } from "Hooks/outfront"; +import { isOFM } from "Util/outfront"; + +if (isOFM()) { + require.context("Images/triptych_psas", true, /\.webp$/); +} const OutfrontEvergreenContent: ComponentType<{ asset_url: string; diff --git a/assets/src/components/v2/pre_fare_single_screen_alert.tsx b/assets/src/components/v2/pre_fare_single_screen_alert.tsx index 96e7d2261..0cc88bf95 100644 --- a/assets/src/components/v2/pre_fare_single_screen_alert.tsx +++ b/assets/src/components/v2/pre_fare_single_screen_alert.tsx @@ -6,12 +6,12 @@ import DisruptionDiagram, { } from "./disruption_diagram/disruption_diagram"; import { classWithModifier, classWithModifiers, formatCause } from "Util/util"; -import ClockIcon from "../../../static/images/svgr_bundled/clock-negative.svg"; -import NoServiceIcon from "../../../static/images/svgr_bundled/no-service.svg"; -import InfoIcon from "../../../static/images/svgr_bundled/info.svg"; -import ISAIcon from "../../../static/images/svgr_bundled/isa.svg"; -import WalkingIcon from "../../../static/images/svgr_bundled/nearby.svg"; -import ShuttleBusIcon from "../../../static/images/svgr_bundled/bus.svg"; +import ClockIcon from "Images/svgr_bundled/clock-negative.svg"; +import NoServiceIcon from "Images/svgr_bundled/no-service.svg"; +import InfoIcon from "Images/svgr_bundled/info.svg"; +import ISAIcon from "Images/svgr_bundled/isa.svg"; +import WalkingIcon from "Images/svgr_bundled/nearby.svg"; +import ShuttleBusIcon from "Images/svgr_bundled/bus.svg"; interface PreFareSingleScreenAlertProps { issue: string; diff --git a/assets/src/components/v2/shuttle_bus_info.tsx b/assets/src/components/v2/shuttle_bus_info.tsx index 87cad8556..0b03f4a2a 100644 --- a/assets/src/components/v2/shuttle_bus_info.tsx +++ b/assets/src/components/v2/shuttle_bus_info.tsx @@ -1,8 +1,8 @@ import Arrow, { Direction } from "Components/solari/arrow"; import React, { ComponentType } from "react"; import { imagePath } from "Util/util"; -import IsaSvg from "../../../static/images/svgr_bundled/isa-negative.svg"; -import Free from "../../../static/images/svgr_bundled/free.svg"; +import IsaSvg from "Images/svgr_bundled/isa-negative.svg"; +import Free from "Images/svgr_bundled/free.svg"; import ClockIcon from "Components/v2/clock_icon"; interface Props { diff --git a/assets/src/components/v2/train_crowding.tsx b/assets/src/components/v2/train_crowding.tsx index fd213724e..a9ea694e2 100644 --- a/assets/src/components/v2/train_crowding.tsx +++ b/assets/src/components/v2/train_crowding.tsx @@ -5,33 +5,33 @@ import { NormalHeaderTime } from "./normal_header"; import { usePlayerName } from "Hooks/outfront"; import { TRIPTYCH_VERSION } from "./triptych/version"; -import Logo from "../../../static/images/svgr_bundled/logo.svg"; -import ArrowUp from "../../../static/images/svgr_bundled/Arrow-90.svg"; -import ArrowUpLeft from "../../../static/images/svgr_bundled/Arrow-45.svg"; +import Logo from "Images/svgr_bundled/logo.svg"; +import ArrowUp from "Images/svgr_bundled/Arrow-90.svg"; +import ArrowUpLeft from "Images/svgr_bundled/Arrow-45.svg"; -import KeyNotCrowded from "../../../static/images/svgr_bundled/train_crowding/Car-NotCrowded-Key.svg"; -import KeySomeCrowding from "../../../static/images/svgr_bundled/train_crowding/Car-SomeCrowding-Key.svg"; -import KeyCrowded from "../../../static/images/svgr_bundled/train_crowding/Car-Crowded-Key.svg"; -import KeyNoData from "../../../static/images/svgr_bundled/train_crowding/Car-NoData-Key.svg"; -import KeyClosed from "../../../static/images/svgr_bundled/train_crowding/Car-Closed-Key.svg"; +import KeyNotCrowded from "Images/svgr_bundled/train_crowding/Car-NotCrowded-Key.svg"; +import KeySomeCrowding from "Images/svgr_bundled/train_crowding/Car-SomeCrowding-Key.svg"; +import KeyCrowded from "Images/svgr_bundled/train_crowding/Car-Crowded-Key.svg"; +import KeyNoData from "Images/svgr_bundled/train_crowding/Car-NoData-Key.svg"; +import KeyClosed from "Images/svgr_bundled/train_crowding/Car-Closed-Key.svg"; -import CarNotCrowdedLeft from "../../../static/images/svgr_bundled/train_crowding/Car-NotCrowded-Left.svg"; -import CarSomeCrowdingLeft from "../../../static/images/svgr_bundled/train_crowding/Car-SomeCrowding-Left.svg"; -import CarCrowdedLeft from "../../../static/images/svgr_bundled/train_crowding/Car-Crowded-Left.svg"; -import CarNoDataLeft from "../../../static/images/svgr_bundled/train_crowding/Car-NoData-Left.svg"; -import CarClosedLeft from "../../../static/images/svgr_bundled/train_crowding/Car-Closed-Left.svg"; +import CarNotCrowdedLeft from "Images/svgr_bundled/train_crowding/Car-NotCrowded-Left.svg"; +import CarSomeCrowdingLeft from "Images/svgr_bundled/train_crowding/Car-SomeCrowding-Left.svg"; +import CarCrowdedLeft from "Images/svgr_bundled/train_crowding/Car-Crowded-Left.svg"; +import CarNoDataLeft from "Images/svgr_bundled/train_crowding/Car-NoData-Left.svg"; +import CarClosedLeft from "Images/svgr_bundled/train_crowding/Car-Closed-Left.svg"; -import CarNotCrowdedMiddle from "../../../static/images/svgr_bundled/train_crowding/Car-NotCrowded-Middle.svg"; -import CarSomeCrowdingMiddle from "../../../static/images/svgr_bundled/train_crowding/Car-SomeCrowding-Middle.svg"; -import CarCrowdedMiddle from "../../../static/images/svgr_bundled/train_crowding/Car-Crowded-Middle.svg"; -import CarNoDataMiddle from "../../../static/images/svgr_bundled/train_crowding/Car-NoData-Middle.svg"; -import CarClosedMiddle from "../../../static/images/svgr_bundled/train_crowding/Car-Closed-Middle.svg"; +import CarNotCrowdedMiddle from "Images/svgr_bundled/train_crowding/Car-NotCrowded-Middle.svg"; +import CarSomeCrowdingMiddle from "Images/svgr_bundled/train_crowding/Car-SomeCrowding-Middle.svg"; +import CarCrowdedMiddle from "Images/svgr_bundled/train_crowding/Car-Crowded-Middle.svg"; +import CarNoDataMiddle from "Images/svgr_bundled/train_crowding/Car-NoData-Middle.svg"; +import CarClosedMiddle from "Images/svgr_bundled/train_crowding/Car-Closed-Middle.svg"; -import CarNotCrowdedRight from "../../../static/images/svgr_bundled/train_crowding/Car-NotCrowded-Right.svg"; -import CarSomeCrowdingRight from "../../../static/images/svgr_bundled/train_crowding/Car-SomeCrowding-Right.svg"; -import CarCrowdedRight from "../../../static/images/svgr_bundled/train_crowding/Car-Crowded-Right.svg"; -import CarNoDataRight from "../../../static/images/svgr_bundled/train_crowding/Car-NoData-Right.svg"; -import CarClosedRight from "../../../static/images/svgr_bundled/train_crowding/Car-Closed-Right.svg"; +import CarNotCrowdedRight from "Images/svgr_bundled/train_crowding/Car-NotCrowded-Right.svg"; +import CarSomeCrowdingRight from "Images/svgr_bundled/train_crowding/Car-SomeCrowding-Right.svg"; +import CarCrowdedRight from "Images/svgr_bundled/train_crowding/Car-Crowded-Right.svg"; +import CarNoDataRight from "Images/svgr_bundled/train_crowding/Car-NoData-Right.svg"; +import CarClosedRight from "Images/svgr_bundled/train_crowding/Car-Closed-Right.svg"; type FrontCarDirection = "left" | "right"; type OccupancyStatus = @@ -222,8 +222,8 @@ const TrainCrowding: React.ComponentType = ({ identifiers={identifiers} >
- Not - crowded + {" "} + Seats available
{" "} diff --git a/assets/src/components/v2/triptych/README.md b/assets/src/components/v2/triptych/README.md index cbdfa2962..97e036ef9 100644 --- a/assets/src/components/v2/triptych/README.md +++ b/assets/src/components/v2/triptych/README.md @@ -4,45 +4,37 @@ Outfront recommends these asset sizes: -- Images: The boards can take webp, which saves 35% or possibly more. OFM recommends using `sharp`, but you can also use [webp](https://formulae.brew.sh/formula/webp). `cwebp -resize 1080 0 left.png -o left.webp` will resize left.png to the triptych screen size and convert to webp. -- Videos: Use handbrake video transcoder to reduce size to below 10MB, at least. (Perhaps much smaller.) To do so, get [HandBrake](https://handbrake.fr/), load the source file, and simply hit "Start". It compresses the file. Check the output to make sure it still looks good. +- Images: The boards can take webp, which saves 35% or possibly more. OFM + recommends using `sharp`, but you can also use + [webp](https://formulae.brew.sh/formula/webp). `cwebp -resize 1080 0 left.png -o left.webp` will resize left.png to the triptych screen size and convert to + webp. +- Videos: Use handbrake video transcoder to reduce size to below 10MB, at least. + (Perhaps much smaller.) To do so, get [HandBrake](https://handbrake.fr/), load + the source file, and simply hit "Start". It compresses the file. Check the + output to make sure it still looks good. ## Prepping the package -- Ensure [Corsica](https://hexdocs.pm/corsica/Corsica.html) is used on the server to allow CORS requests (ideally limited to just the triptych-relevant routes). It should already be configured at [this line](/lib/screens_web/controllers/v2/screen_api_controller.ex#L9) in the API controller--if it is, you don't need to do anything for this step. -- Double check that any behavior specific to the triptych screen environment happens inside of an `isTriptych()` or `isOFM()` check. This includes: - - `buildApiPath` in use_api_response.tsx should return a full URL for the API path: prefix `apiPath` string with "https://screens.mbta.com". +- Ensure [Corsica](https://hexdocs.pm/corsica/Corsica.html) is used on the + server to allow CORS requests (ideally limited to just the triptych-relevant + routes). It should already be configured at [this + line](/lib/screens_web/controllers/v2/screen_api_controller.ex#L9) in the API + controller--if it is, you don't need to do anything for this step. +- Double check that any behavior specific to the triptych screen environment + happens inside of an `isTriptych()` or `isOFM()` check. This includes: + + - `buildApiPath` in use_api_response.tsx should return a full URL for the API + path: prefix `apiPath` string with "https://screens.mbta.com". - `imagePath` in util.tsx should return relative paths (no leading `/`). -- Create priv/static/triptych-app.html if it doesn’t already exist. Copy paste the following contents in: - - ```html - - - - - - - Screens - - - - -
- - - - - ``` -- Set the version string in assets/src/components/v2/triptych/version.tsx to `current_year.current_month.current_day.1`. -- In assets/webpack.config.js, change `publicPath` in the font config to have value `'fonts/'`. -- If you've renamed / removed image assets, you might want to delete the corresponding folder in `/priv/static`. The folder accumulates assets without clearing old ones out, and these will be included in the built bundle! +- Set the version string in assets/src/components/v2/triptych/version.tsx to + `current_year.current_month.current_day.1`. +- If you've renamed / removed image assets, you might want to delete the + corresponding folder in `/priv/static`. The folder accumulates assets without + clearing old ones out, and these will be included in the built bundle! - **Only if you are packaging for local testing** - - add the following to the top of assets/src/apps/v2/triptych.tsx, filling in the string values: + - add the following to the top of assets/src/apps/v2/triptych.tsx, filling in + the string values: ```ts import { __TEST_setFakeMRAID__ } from "Util/outfront"; __TEST_setFakeMRAID__({ @@ -51,35 +43,43 @@ Outfront recommends these asset sizes: triptychPane: "", }); ``` - This sets up a fake MRAID object that emulates the real one available to the client when running on Outfront screens. - The MRAID object gives our client info about which screen it's running on. - - replace the definition of `getOutfrontAbsolutePath` in assets/src/hooks/v2/use_api_response.tsx with `const getOutfrontAbsolutePath = () => isOFM() ? "http://localhost:4000" : "";`. - - make sure priv/triptych_player_to_screen_id.json mirrors mbta-ctd-config/screens/triptych_player_to_screen_id-prod.json, or at least contains a mapping for the `playerName` that you hardcoded two steps ago. + This sets up a fake MRAID object that emulates the real one available to the + client when running on Outfront screens. The MRAID object gives our client + info about which screen it's running on. + - replace the definition of `getOutfrontAbsolutePath` in + assets/src/hooks/v2/use_api_response.tsx with `const getOutfrontAbsolutePath = () => isOFM() ? "http://localhost:4000" : "";`. + - make sure priv/triptych_player_to_screen_id.json mirrors + mbta-ctd-config/screens/triptych_player_to_screen_id-prod.json, or at least + contains a mapping for the `playerName` that you hardcoded two steps ago. - `cd` to priv/static and run the following: ```sh npm --prefix ../../assets run deploy && \ - cp -r css/triptych_v2.css js/polyfills.js js/triptych_v2.js ../triptych_preview.png . && \ + cp -r css/packaged_triptych_v2.css js/packaged_triptych_polyfills.js js/packaged_triptych_v2.js js/packaged_triptych_v2.js.map ../triptych_preview.png ../triptych-app.html . && \ + cp -r js/triptych_images . && \ cp ../triptych_template.json ./template.json && \ - zip -r triptych-app.zip triptych_v2.css polyfills.js triptych_v2.js fonts images triptych-app.html template.json triptych_preview.png + zip -r triptych-app.zip packaged_triptych_v2.css packaged_triptych_polyfills.js packaged_triptych_v2.js packaged_triptych_v2.js.map fonts triptych_images triptych-app.html template.json triptych_preview.png ``` -- On completion, the packaged client app will be saved at `priv/static/triptych-app.zip`. -- Commit the version bump on a branch, push it, and create a PR to mark the deploy. +- On completion, the packaged client app will be saved at + `priv/static/triptych-app.zip`. +- Commit the version bump on a branch, push it, and create a PR to mark the + deploy. ## Working with Outfront -Once you've created the client app package, you'll need to send it to Outfront for them to test and deploy it. +Once you've created the client app package, you'll need to send it to Outfront +for them to test and deploy it. -Ask a Screens team member for the email of our contact at Outfront. -In your message, be sure to specify: +Ask a Screens team member for the email of our contact at Outfront. In your +message, be sure to specify: - a player name (or "Liveboard name"), and -- a triptych pane (or `Array_configuration`--value should be of the form "Triple\_(Left|Middle|Right)") - that they should set on the test screen. +- a triptych pane (or `Array_configuration`--value should be of the form + "Triple\_(Left|Middle|Right)") ## Debugging -To assist with debugging on the triptych screens, you can paste this at the module scope in triptych.tsx to have console logs -show up on the screen: +To assist with debugging on the triptych screens, you can paste this at the +module scope in triptych.tsx to have console logs show up on the screen: ```js const Counter = (() => { @@ -119,6 +119,10 @@ console.log = function (...msgs) { .join(" "); // add the log to the html element. - html_logger.innerHTML = `
${Counter.next()} ${text}
${html_logger.innerHTML}`; + html_logger.innerHTML = `
${Counter.next()} ${text}
${ + html_logger.innerHTML + }`; }; + +console.log("On-screen logger initialized"); ``` diff --git a/assets/src/components/v2/triptych/no_data.tsx b/assets/src/components/v2/triptych/no_data.tsx index 7a2e1af47..63705602a 100644 --- a/assets/src/components/v2/triptych/no_data.tsx +++ b/assets/src/components/v2/triptych/no_data.tsx @@ -1,5 +1,5 @@ import React, { ComponentType } from "react"; -import { imagePath } from "Util/util"; +import noDataPNG from "Images/no-data-triptych.png"; interface Props { show_alternatives: boolean; @@ -9,13 +9,13 @@ const NoData: ComponentType = () => { return ( <>
- +
- +
- +
); diff --git a/assets/src/components/v2/triptych/page_load_no_data.tsx b/assets/src/components/v2/triptych/page_load_no_data.tsx index ab16050fe..bda2264bd 100644 --- a/assets/src/components/v2/triptych/page_load_no_data.tsx +++ b/assets/src/components/v2/triptych/page_load_no_data.tsx @@ -1,17 +1,17 @@ import React, { ComponentType } from "react"; -import { imagePath } from "Util/util"; +import loadingPNG from "Images/loading-triptych.png"; const PageLoadNoData: ComponentType = () => { return ( <>
- +
- +
- +
); diff --git a/assets/src/components/v2/triptych/version.tsx b/assets/src/components/v2/triptych/version.tsx index f3b01315a..bef9d8f69 100644 --- a/assets/src/components/v2/triptych/version.tsx +++ b/assets/src/components/v2/triptych/version.tsx @@ -1 +1 @@ -export const TRIPTYCH_VERSION = "23.8.11.1"; +export const TRIPTYCH_VERSION = "24.5.8.1"; diff --git a/assets/src/custom.d.ts b/assets/src/custom.d.ts index 54dbde972..26b86fdfe 100644 --- a/assets/src/custom.d.ts +++ b/assets/src/custom.d.ts @@ -1,6 +1,9 @@ -// Allow importing and using any SVG file as though it were a React component. +// Allow importing and using any SVG, PNG, or JPG file as though it were a React component. declare module "*.svg" { const content: React.FunctionComponent>; export default content; } + +declare module "*.png"; +declare module "*.jpg"; diff --git a/assets/src/hooks/v2/use_api_response.tsx b/assets/src/hooks/v2/use_api_response.tsx index 96e239569..705047108 100644 --- a/assets/src/hooks/v2/use_api_response.tsx +++ b/assets/src/hooks/v2/use_api_response.tsx @@ -186,7 +186,9 @@ const useBaseApiResponse = ({ const [apiResponse, setApiResponse] = useState(LOADING_RESPONSE); const [requestCount, setRequestCount] = useState(0); const [lastSuccess, setLastSuccess] = useState(null); - const refreshRate = fetchDatasetValue("refreshRate"); + // Live OFM screens ignore any configured refreshRate. + // Hardcoding to 0 prevents an interval from being started unnecessarily. + const refreshRate = isOFM() ? "0" : fetchDatasetValue("refreshRate"); const refreshRateOffset = getDatasetValue("refreshRateOffset") || "0"; const screenIdsWithOffsetMap = getDatasetValue("screenIdsWithOffsetMap"); const refreshMs = parseInt(refreshRate!, 10) * 1000; diff --git a/assets/src/util/util.tsx b/assets/src/util/util.tsx index 5100f6e28..2690ae222 100644 --- a/assets/src/util/util.tsx +++ b/assets/src/util/util.tsx @@ -1,7 +1,7 @@ import moment from "moment"; import "moment-timezone"; import { getDatasetValue } from "Util/dataset"; -import { isOFM } from "Util/outfront"; +import { isOFM, isTriptych } from "Util/outfront"; export const classWithModifier = (baseClass, modifier) => { if (!modifier) { @@ -25,7 +25,10 @@ export const formatTimeString = (timeString: string) => moment(timeString).tz("America/New_York").format("h:mm"); export const imagePath = (fileName: string): string => - isOFM() ? `images/${fileName}` : `/images/${fileName}`; + isOFM() ? outfrontImagePath(fileName) : `/images/${fileName}`; + +export const outfrontImagePath = (fileName: string): string => + isTriptych() ? `triptych_images/${fileName}` : `/images/${fileName}`; export const pillPath = (fileName: string): string => isOFM() ? `images/pills/${fileName}` : `/images/pills/${fileName}`; diff --git a/assets/static/images/svgr_bundled/README.md b/assets/static/images/svgr_bundled/README.md index 3277ccd24..7286ab018 100644 --- a/assets/static/images/svgr_bundled/README.md +++ b/assets/static/images/svgr_bundled/README.md @@ -5,7 +5,7 @@ We've started using an svg loader called SVGR that imports svgs as ready-to-use We're in the process of consolidating this huge assets folder of svgs into this `svgr_bundled` folder. ``` -import Free from "../../../../static/images/svgr_bundled/free.svg"; +import Free from "Images/svgr_bundled/free.svg"; ``` diff --git a/assets/tsconfig.json b/assets/tsconfig.json index ef8e0c263..8b6156bd5 100644 --- a/assets/tsconfig.json +++ b/assets/tsconfig.json @@ -3,7 +3,7 @@ "exclude": ["node_modules"], "compilerOptions": { /* Basic Options */ - "target": "es3" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017','ES2018' or 'ESNEXT'. */, + "target": "es5" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017','ES2018' or 'ESNEXT'. */, "module": "es2015" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */, "lib": [ "dom", @@ -48,7 +48,8 @@ "Components/*": ["components/*"], "Hooks/*": ["hooks/*"], "Util/*": ["util/*"], - "Constants": ["constants"] + "Constants": ["constants"], + "Images": ["../static/images"] } /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */, // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ // "typeRoots": [], /* List of folders to include type definitions from. */ diff --git a/assets/webpack.config.js b/assets/webpack.config.js index b0c25dac6..091d1e39d 100644 --- a/assets/webpack.config.js +++ b/assets/webpack.config.js @@ -7,7 +7,7 @@ const TerserPlugin = require("terser-webpack-plugin"); const OptimizeCSSAssetsPlugin = require("optimize-css-assets-webpack-plugin"); const CopyWebpackPlugin = require("copy-webpack-plugin"); -module.exports = () => ({ +const common_export_body = { resolve: { extensions: [".ts", ".tsx", ".js", ".jsx"], alias: { @@ -16,106 +16,210 @@ module.exports = () => ({ Hooks: path.resolve(__dirname, "src/hooks"), Util: path.resolve(__dirname, "src/util"), Constants: path.resolve(__dirname, "src/constants"), + Images: path.resolve(__dirname, "static/images"), }, }, - entry: { - polyfills: "./src/polyfills.js", - bus_eink: "./src/apps/bus_eink.tsx", - gl_eink_single: "./src/apps/gl_eink_single.tsx", - gl_eink_double: "./src/apps/gl_eink_double.tsx", - solari: "./src/apps/solari.tsx", - dup: "./src/apps/dup.tsx", - admin: "./src/apps/admin.tsx", - bus_eink_v2: "./src/apps/v2/bus_eink.tsx", - gl_eink_v2: "./src/apps/v2/gl_eink.tsx", - busway_v2: "./src/apps/v2/busway.tsx", - solari_large_v2: "./src/apps/v2/solari_large.tsx", - dup_v2: "./src/apps/v2/dup.tsx", - bus_shelter_v2: "./src/apps/v2/bus_shelter.tsx", - pre_fare_v2: "./src/apps/v2/pre_fare.tsx", - triptych_v2: "./src/apps/v2/triptych.tsx", - }, output: { filename: "[name].js", path: path.resolve(__dirname, "../priv/static/js"), }, - module: { - rules: [ - { - test: /\.ts(x?)$/, - exclude: /node_modules/, - use: { - loader: "babel-loader", - options: { - presets: [ - ["@babel/preset-env", { targets: "> 0.25%" }], - "@babel/preset-react", - "@babel/preset-typescript", - ], - plugins: [ - "@babel/plugin-proposal-export-default-from", - "@babel/plugin-proposal-logical-assignment-operators", - ["@babel/plugin-proposal-optional-chaining", { loose: false }], - [ - "@babel/plugin-proposal-pipeline-operator", - { proposal: "minimal" }, - ], - [ - "@babel/plugin-proposal-nullish-coalescing-operator", - { loose: false }, - ], - "@babel/plugin-proposal-do-expressions", - ], - }, - }, - }, - { - enforce: "pre", - test: /\.js$/, - loader: "source-map-loader", - }, + devtool: "source-map", + optimization: { + minimizer: [ + new TerserPlugin({ cache: true, parallel: true, sourceMap: false }), + new OptimizeCSSAssetsPlugin({}), + ], + }, +}; + +const common_rules = [ + { + enforce: "pre", + test: /\.js$/, + loader: "source-map-loader", + }, + { + test: /\.s?css$/, + use: [ + MiniCssExtractPlugin.loader, { - test: /\.s?css$/, - use: [ - MiniCssExtractPlugin.loader, - { - loader: "css-loader", - }, - { - loader: "sass-loader", - }, - ], + loader: "css-loader", }, { - test: /\.svg$/i, - issuer: /\.[jt]sx?$/, - use: ["@svgr/webpack"], + loader: "sass-loader", }, - { - test: /\.(woff(2)?|ttf|eot)(\?v=\d+\.\d+\.\d+)?$/, - use: [ - { - loader: "file-loader", + ], + }, + { + test: /\.svg$/i, + issuer: /\.[jt]sx?$/, + use: ["@svgr/webpack"], + }, +]; + +const common_babel_loader_plugins = [ + "@babel/plugin-proposal-export-default-from", + "@babel/plugin-proposal-logical-assignment-operators", + ["@babel/plugin-proposal-optional-chaining", { loose: false }], + ["@babel/plugin-proposal-pipeline-operator", { proposal: "minimal" }], + ["@babel/plugin-proposal-nullish-coalescing-operator", { loose: false }], + "@babel/plugin-proposal-do-expressions", +]; + +module.exports = () => [ + { + ...common_export_body, + entry: { + polyfills: "./src/polyfills.js", + bus_eink: "./src/apps/bus_eink.tsx", + gl_eink_single: "./src/apps/gl_eink_single.tsx", + gl_eink_double: "./src/apps/gl_eink_double.tsx", + solari: "./src/apps/solari.tsx", + dup: "./src/apps/dup.tsx", + admin: "./src/apps/admin.tsx", + bus_eink_v2: "./src/apps/v2/bus_eink.tsx", + gl_eink_v2: "./src/apps/v2/gl_eink.tsx", + busway_v2: "./src/apps/v2/busway.tsx", + solari_large_v2: "./src/apps/v2/solari_large.tsx", + dup_v2: "./src/apps/v2/dup.tsx", + bus_shelter_v2: "./src/apps/v2/bus_shelter.tsx", + pre_fare_v2: "./src/apps/v2/pre_fare.tsx", + triptych_v2: "./src/apps/v2/triptych.tsx", + }, + module: { + rules: [ + { + test: /\.ts(x?)$/, + exclude: /node_modules/, + use: { + loader: "babel-loader", options: { - name: "[name].[ext]", - outputPath: "fonts/", - publicPath: "../fonts/", - useRelativePaths: true, + presets: [ + ["@babel/preset-env", { targets: "> 0.25%" }], + "@babel/preset-react", + "@babel/preset-typescript", + ], + plugins: common_babel_loader_plugins, }, }, - ], - }, + }, + ...common_rules, + { + test: /\.(woff(2)?|ttf|eot)(\?v=\d+\.\d+\.\d+)?$/, + use: [ + { + loader: "file-loader", + options: { + name: "[name].[ext]", + outputPath: "fonts/", + publicPath: "../fonts/", + useRelativePaths: true, + }, + }, + ], + }, + { + test: /\.(png|jpe?g|gif|webp)$/i, + use: [ + { + loader: "file-loader", + options: { + name: "[name].[ext]", + outputPath: "/images/", + publicPath: "/images/", + useRelativePaths: true, + }, + }, + ], + }, + ], + }, + plugins: [ + new MiniCssExtractPlugin({ filename: "../css/[name].css" }), + new CopyWebpackPlugin({ patterns: [{ from: "static/", to: "../" }] }), ], }, - plugins: [ - new MiniCssExtractPlugin({ filename: "../css/[name].css" }), - new CopyWebpackPlugin({ patterns: [{ from: "static/", to: "../" }] }), - ], - devtool: "source-map", - optimization: { - minimizer: [ - new TerserPlugin({ cache: true, parallel: true, sourceMap: false }), - new OptimizeCSSAssetsPlugin({}), + { + ...common_export_body, + entry: { + packaged_triptych_polyfills: "./src/polyfills.js", + packaged_triptych_v2: "./src/apps/v2/triptych.tsx", + }, + module: { + rules: [ + { + test: /\.ts(x?)$/, + exclude: /node_modules/, + use: { + loader: "babel-loader", + options: { + presets: [ + // When no targets are specified: Babel will assume you are targeting the oldest browsers possible. + [ + "@babel/preset-env", + { + corejs: { version: 3, proposals: true }, + useBuiltIns: "usage", + }, + ], + "@babel/preset-react", + "@babel/preset-typescript", + ], + plugins: common_babel_loader_plugins, + }, + }, + }, + ...common_rules, + { + test: /\.(woff(2)?|ttf|eot)(\?v=\d+\.\d+\.\d+)?$/, + use: [ + { + loader: "file-loader", + options: { + name: "[name].[ext]", + outputPath: "fonts/", + publicPath: "fonts/", + useRelativePaths: true, + }, + }, + ], + }, + { + test: /\.(png|jpe?g|gif)$/i, + use: [ + { + loader: "file-loader", + + options: { + name: "[name].[ext]", + outputPath: "triptych_images/", + publicPath: "triptych_images/", + useRelativePaths: true, + }, + }, + ], + }, + { + test: /\.(webp)$/i, + use: [ + { + loader: "file-loader", + options: { + name: "/[folder]/[name].[ext]", + outputPath: "triptych_images/triptych_psas/", + publicPath: "triptych_images/triptych_psas/", + useRelativePaths: true, + }, + }, + ], + }, + ], + }, + plugins: [ + new MiniCssExtractPlugin({ filename: "../css/[name].css" }), + new CopyWebpackPlugin({ + patterns: [{ from: "static/fonts", to: "../fonts" }], + }), ], }, -}); +]; diff --git a/priv/triptych-app.html b/priv/triptych-app.html new file mode 100644 index 000000000..bc03999bd --- /dev/null +++ b/priv/triptych-app.html @@ -0,0 +1,20 @@ + + + + + + + Screens + + + + +
+ + + + \ No newline at end of file diff --git a/priv/triptych_preview.png b/priv/triptych_preview.png index 12d6103fe1bb2a9af591afc1e0d1071da5753fd6..3630154e55acd4386136669f3df2977a00d414f4 100644 GIT binary patch literal 51996 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

h|(^<^KH8451MR?(~5|C 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 TVmzo}07OUA;08hcUeJF5$xZx= literal 466841 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

{oC%PN(7 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 tk