tis-microsoft-todos
2.93.6831.0-30
Todo List est une application de gestion de listes et de cochage de cases.Todo List vous aide à organiser vos tâches, même sans être connecté en permanence à Internet
4459 téléchargements
Voir le résultat de la construction Voir l'analyse de VirusTotal
Description
- package : tis-microsoft-todos
- name : Microsoft Todos
- version : 2.93.6831.0-30
- categories : Utilities
- maintainer : WAPT Team,Tranquil IT,Gaëtan SEGAT,Jimmy PELÉ
- installed_size : 77700426
- editor : Microsoft
- licence : Proprietary
- signature_date : 2023-04-08T11:00:21.922930
- size : 132.60 Mo
- locale : all
- target_os : windows
- impacted_process : Todo,Microsoft.Todos.SystemTrayExtension
- architecture : all
- Page d'accueil : https://apps.microsoft.com/store/detail/9NBLGGH5R558
control
package : tis-microsoft-todos
version : 2.93.6831.0-30
architecture : all
section : base
priority : optional
name : Microsoft Todos
categories : Utilities
maintainer : WAPT Team,Tranquil IT,Gaëtan SEGAT,Jimmy PELÉ
description : Todo List is a list management and box ticking application.Todo List helps you organize your tasks, even without being permanently connected to the internet.
depends :
conflicts :
maturity : PROD
locale : all
target_os : windows
min_wapt_version : 2.2
sources : https://apps.microsoft.com/store/detail/9NBLGGH5R558
installed_size : 77700426
impacted_process : Todo,Microsoft.Todos.SystemTrayExtension
description_fr : Todo List est une application de gestion de listes et de cochage de cases.Todo List vous aide à organiser vos tâches, même sans être connecté en permanence à Internet
description_pl : Todo List to aplikacja do zarządzania listami i zaznaczania pól.Todo List pomaga organizować zadania, nawet bez stałego połączenia z internetem
description_de : Todo List ist eine Anwendung zur Verwaltung von Listen und zum Ankreuzen von Kästchen und hilft Ihnen, Ihre Aufgaben zu organisieren, auch wenn Sie nicht ständig mit dem Internet verbunden sind
description_es : Todo List es una aplicación de gestión de listas y marcación de casillas.Todo List te ayuda a organizar tus tareas, incluso sin estar permanentemente conectado a Internet
description_pt : A Todo List é uma aplicação de gestão de listas e de marcação de caixas. A Todo List ajuda-o a organizar as suas tarefas, mesmo sem estar permanentemente ligado à Internet
description_it : Todo List è un'applicazione per la gestione degli elenchi e delle caselle da spuntare. Todo List vi aiuta a organizzare le vostre attività, anche senza essere permanentemente connessi a Internet
description_nl : Todo List is een applicatie voor lijstbeheer en het aanvinken van vakjes.Todo List helpt u uw taken te organiseren, zelfs zonder permanent verbonden te zijn met het internet
description_ru : Todo List - это приложение для управления списками и проставления галочек. Todo List поможет вам организовать свои задачи, даже не имея постоянного подключения к Интернету
audit_schedule :
editor : Microsoft
keywords : tasks,list
licence : Proprietary
homepage : https://apps.microsoft.com/store/detail/9NBLGGH5R558
package_uuid : 307ccbc5-a943-4fe7-8488-9a17670c6a2c
valid_from :
valid_until :
forced_install_on :
changelog :
min_os_version : 10.0.16299.0
max_os_version :
icon_sha256sum : d05608294b26da683b6efc641070d4828da3465475615d4d24f4a78a7d07dec9
signer : Tranquil IT
signer_fingerprint: 8c5127a75392be9cc9afd0dbae1222a673072c308c14d88ab246e23832e8c6bb
signature : sFXQDADYcge4VUxCl30duPUEmfhs/1ZTcKOEgu9uP+bnb1XAqTAaS1P197ddMIwPHFm+Jbr8Nf/3AqpFreaHQsZ0nGo5SioLtiFRxLLT/VMxUM/YEWgm4J/I5ZqREZovfU8p1ByF7GOhgekmEhBzkL1wEz+H6Q4LtsiBzmw6/r+CyV98cD5356yGDv/ae9M653jJZFd2amVQMnw2uZU7Kl0/XFkq6f4fbU+Ph05DZOc7VD4xWMDmkwCZmQPmtqajoiHPdN1x5xSsE7e6aT9wE0malvlgDie6ldr8KocuinhKiWPkvzoQSAxZoX+o/Sr8oE6RRp3nAf6YdRXFmfcHjw==
signature_date : 2023-04-08T11:00:21.922930
signed_attributes : package,version,architecture,section,priority,name,categories,maintainer,description,depends,conflicts,maturity,locale,target_os,min_wapt_version,sources,installed_size,impacted_process,description_fr,description_pl,description_de,description_es,description_pt,description_it,description_nl,description_ru,audit_schedule,editor,keywords,licence,homepage,package_uuid,valid_from,valid_until,forced_install_on,changelog,min_os_version,max_os_version,icon_sha256sum,signer,signer_fingerprint,signature_date,signed_attributes
Setup.py
# -*- coding: utf-8 -*-
from setuphelpers import *
appx_package_name = "Microsoft.Todos"
appx_dir = makepath(programfiles, "WindowsAppsInstallers")
allow_remove = True
def install():
# Declare local variables
bins_dir = control.package.split("-", 1)[1]
appx_bins_dir = makepath(appx_dir, bins_dir)
# Remove from old path
for appx_file in glob.glob(makepath(appx_dir, "%s_*" % appx_package_name)):
remove_file(appx_file)
# Placing bins for session-setup installs
if isdir(appx_bins_dir):
remove_tree(appx_bins_dir)
mkdirs(appx_bins_dir)
print(f"Creating: {appx_bins_dir}")
for f in glob.glob(bins_dir + "/*"):
filecopyto(f, appx_bins_dir)
for f in glob.glob(appx_bins_dir + "/*"):
if control.architecture == "all":
fname = f.split(os.sep)[-1]
if "x86" in glob.glob(makepath(appx_bins_dir, "%s_*" % appx_package_name))[0].split(os.sep)[-1]:
if not "x86" in fname and not "neutral" in fname:
remove_file(f)
else:
if not get_host_architecture() in fname and not "neutral" in fname:
remove_file(f)
else:
if not control.architecture in fname and not "neutral" in fname:
remove_file(f)
def session_setup():
# Declare local variables
bins_dir = control.package.split("-", 1)[1]
appx_bins_dir = makepath(appx_dir, bins_dir)
bin_path = glob.glob(makepath(appx_bins_dir, f"{appx_package_name}_*"))[0]
dependencies_pathes = ",".join([f'"{a}"' for a in glob.glob(makepath(appx_bins_dir, "*")) if not appx_package_name in a])
# Installing the UWP application in the user environment
appx_version = get_powershell_str("Get-AppxPackage -Name %s" % appx_package_name, "Version")
if not appx_version or Version(appx_version) < Version(control.get_software_version()) or force:
print("Installing: %s" % bin_path.split("\\")[-1])
killalltasks(control.get_impacted_process_list())
add_appx_cmd = f'Add-AppxPackage -Path "{bin_path}"'
if dependencies_pathes:
add_appx_cmd += f" -DependencyPath {dependencies_pathes}"
run_powershell(add_appx_cmd)
else:
print("%s is installed in correct version (%s)" % (appx_package_name, appx_version))
def uninstall():
# Declare local variables
bins_dir = control.package.split("-", 1)[1]
appx_bins_dir = makepath(appx_dir, bins_dir)
if allow_remove:
remove_appx(appx_package_name)
if isdir(appx_bins_dir):
print("Remove: %s" % (appx_bins_dir))
remove_tree(appx_bins_dir)
if dir_is_empty(appx_dir):
print("Remove: %s since it is empty" % (appx_dir))
remove_tree(appx_dir)
def get_host_architecture():
if isARM64():
return "arm64"
elif isARM():
return "arm"
elif is64():
return "x64"
elif is32():
return "x86"
update_package.py
# -*- coding: utf-8 -*-
from setuphelpers import *
import requests
try:
from setupdevhelpers import *
except:
from bs4 import BeautifulSoup
import waptguihelper
import re
import json
def update_package():
# Declaring local variables
package_updated = False
proxies = get_proxies()
if not proxies:
proxies = get_proxies_from_wapt_console()
store_url = control.sources
if not store_url:
store_id = waptguihelper.input_dialog(
"Choice of app", "Enter the windows store app id (foundable in package url: https://apps.microsoft.com/store/apps)", store_url
).split("/")[-1]
else:
store_id = store_url.split("/")[-1]
store_id = store_id.split("?")[0]
url_ms = "https://apps.microsoft.com/store/detail/%s" % store_id
control.sources = url_ms
control.save_control_to_wapt()
package_prefix = control.package.split("-")[0]
# check setup.py incase the package name doesnt match the installer file
appx_package_name = ""
with open("setup.py", "r", encoding="utf8") as f:
for line in f.readlines():
if line.startswith("appx_package_name"):
appx_package_name = line.split("=")[1].split('"')[1]
break
# Getting info from adguard api
res = requests.post(
"https://store.rg-adguard.net/api/GetFiles",
"type=ProductId&url=%s&ring=RP&lang=fr-FR" % store_id,
headers={"content-type": "application/x-www-form-urlencoded"},
proxies=proxies,
)
all_files = []
page = BeautifulSoup.BeautifulSoup(res.content, features="html.parser")
for bs_search in page.find_all("a"):
if not "BlockMap" in bs_search.text and not "eappxbundle" in bs_search.text and not "emsixbundle" in bs_search.text:
version = bs_search.text.split("_")[1]
bin_name = bs_search.text.replace("~", "_")
download_url = bs_search["href"]
pkg_splitted = re.split(r"_\d+\.", bin_name)[0]
package_name = package_prefix + "-" + pkg_splitted.split("_")[0].replace(".", "-").lower()
software_name = bin_name.split("_")[0].replace("-", " ").replace(".", " ")
package_arch = get_uwp_filename_arch(bin_name, appx_package_name)
file_dict = {
"version": version,
"bin_name": bin_name,
"package_name": package_name,
"software_name": software_name,
"package_arch": package_arch,
"download_url": download_url,
}
all_files.append(file_dict)
if (
"template-microsoft-store" in control.package
or not appx_package_name
or not len([a for a in all_files if appx_package_name in a["bin_name"]]) != 0
):
selected = waptguihelper.grid_dialog(
"Please select the proper file",
json.dumps(all_files),
waptguihelper.GRT_SELECTED,
'{"columns":[{"propertyname":"version","datatype":"String","required":false,"readonly":false,"width":130},{"propertyname":"bin_name","datatype":"String","required":false,"readonly":false,"width":420},{"propertyname":"package_name","datatype":"String","required":false,"readonly":false,"width":190},{"propertyname":"software_name","datatype":"String","required":false,"readonly":false,"width":172},{"propertyname":"package_arch","datatype":"String","required":false,"readonly":false,"width":88},{"propertyname":"download_url","datatype":"String","required":false,"readonly":false,"width":1472}]}',
)
appx_package_name = selected[0]["bin_name"].split("_")[0]
# Downloading files
for dependency in all_files:
latest_bin = dependency["bin_name"]
download_url = dependency["download_url"]
if download_url.split("/")[2].endswith("microsoft.com"):
if not isfile(latest_bin):
print("Downloading: %s" % latest_bin)
wget(download_url, latest_bin, proxies=proxies)
else:
print("Binary is present: %s" % latest_bin)
else:
error("ERROR: The retrieved URL will not download from microsoft's servers")
# Import xmltodict for make_uwp_app_dict()
import sys
sys.path.append(basedir)
pip_download_xmltodict = "waptpython -m pip download xmltodict -d %s" % basedir
if proxies:
pip_download_xmltodict += " --proxy %s" % proxies["http"]
run(pip_download_xmltodict)
unzip(glob.glob("*.whl")[0], ".", "xmltodict.py")
remove_file(glob.glob("*.whl")[0])
# Keep app files
uwp_app_dict = make_uwp_app_dict(appx_package_name)
newer_version = "0"
for uwp_app in uwp_app_dict:
if uwp_app_dict[uwp_app]["Name"] != appx_package_name:
continue
if Version(newer_version) < Version(uwp_app_dict[uwp_app]["Version"]):
# if uwp_app_dict[uwp_app]["Name"] != appx_package_name and uwp_app_dict[uwp_app]["Version"].startswith("2019"):
# continue
# if Version(newer_version) < Version(uwp_app_dict[uwp_app]["Version"]) and Version(control.min_os_version, 3) == Version(
# uwp_app_dict[uwp_app]["MinVersion"], 3
# ):
newer_uwp_app = uwp_app_dict[uwp_app]
version = newer_uwp_app["Version"]
# Get icon.png
if "b4:Dependencies" in newer_uwp_app:
unzip(newer_uwp_app["FileName"], ".", newer_uwp_app["b4:Dependencies"][0]["FileName"], False)
icon_png = unzip(newer_uwp_app["b4:Dependencies"][0]["FileName"], ".", "*.targetsize-48.png", False)
shutil.move(icon_png[0], "WAPT\\icon.png")
else:
icon_png = unzip(newer_uwp_app["FileName"], "icon.png", "*.targetsize-48.png", False)
shutil.move(icon_png[0], "WAPT\\icon.png")
# Placing binaries in a dir ["appxbundle", "msixbundle", "appx", "msix]
bins_dir = control.package.split("-", 1)[1]
mkdirs(bins_dir)
if not isfile(makepath(bins_dir, newer_uwp_app["FileName"])):
shutil.move(newer_uwp_app["FileName"], bins_dir)
for l in [glob.glob(a["Name"] + "_*") for a in uwp_app_dict[newer_uwp_app["FileName"]]["Dependencies"]]:
for f in l:
if not isfile(makepath(bins_dir, f)):
shutil.move(f, bins_dir)
# Removing remaining files ["appxbundle", "msixbundle", "appx", "msix]
for f in glob.glob("*.appxbundle") + glob.glob("*.msixbundle") + glob.glob("*.appx") + glob.glob("*.msix"):
remove_file(f)
# No dependencies since it will be contained
control.depends = ""
control.save_control_to_wapt()
# Applying or asking control information if needed
control.architecture = get_uwp_filename_arch(newer_uwp_app["FileName"], appx_package_name)
control.min_os_version = newer_uwp_app["MinVersion"]
ask_control_categories()
ask_control_package(package_name, "template-microsoft-store", remove_base_files=True)
ask_control_name(software_name, "Template Microsoft Store")
ask_control_description("update_package")
# Changing setup.py appx_package_name variable
new_lines = []
with open("setup.py", "r", encoding="utf8") as f:
for line in f.readlines():
if line.startswith("appx_package_name"):
line = 'appx_package_name = "%s"\n' % appx_package_name
new_lines.append(line)
with open("setup.py", "w", encoding="utf8") as f:
f.writelines(new_lines)
# Changing version of the package
if Version(version) > Version(control.get_software_version()):
print("Software version updated (from: %s to: %s)" % (control.get_software_version(), Version(version)))
package_updated = True
else:
print("Software version up-to-date (%s)" % Version(version))
control.set_software_version(version)
control.save_control_to_wapt()
# Validating or not update-package-sources
return package_updated
def make_uwp_app_dict(appx_package_name):
import xmltodict
ms_app_db = {}
# for ms_app_file in (
# glob.glob("*.appxbundle")
# + glob.glob("*.msixbundle")
# + glob.glob("*.appx")
# + glob.glob("*.msix")
# ):
for ms_app_file in (
glob.glob(f"{appx_package_name}*.appxbundle")
+ glob.glob(f"{appx_package_name}*.msixbundle")
+ glob.glob(f"{appx_package_name}*.appx")
+ glob.glob(f"{appx_package_name}*.msix")
):
manifest = unzip(ms_app_file, ".", "AppxManifest.xml", False)
bundle_manifest = unzip(ms_app_file, ".", "AppxMetadata\AppxBundleManifest.xml", False)
if not manifest:
if bundle_manifest:
with open(bundle_manifest[0], encoding="utf8") as xml_file:
data_dict = xmltodict.parse(xml_file.read(), attr_prefix="")
ms_app_info = {
"FileName": ms_app_file,
"Name": data_dict["Bundle"]["Identity"]["Name"],
"Version": data_dict["Bundle"]["Identity"]["Version"],
}
dependencies = []
for app_pkg in data_dict["Bundle"]["Packages"]["Package"]:
if app_pkg["Type"] == "application":
dependency_info = {
"FileName": app_pkg["FileName"],
"Version": app_pkg["Version"],
"Architecture": app_pkg["Architecture"],
"MinVersion": app_pkg["b4:Dependencies"]["b4:TargetDeviceFamily"]["MinVersion"],
"MaxVersionTested": app_pkg["b4:Dependencies"]["b4:TargetDeviceFamily"]["MaxVersionTested"],
}
dependencies.append(dependency_info)
ms_app_info.update({"MinVersion": dependency_info["MinVersion"], "MaxVersionTested": dependency_info["MaxVersionTested"]})
for dependency in dependencies:
unzip(
ms_app_file,
".",
makepath(
dependency["FileName"],
),
False,
)
manifest = unzip(dependency["FileName"], ".", makepath("AppxManifest.xml"), False)
if isfile(dependency["FileName"]):
remove_file(dependency["FileName"])
with open(manifest[0], encoding="utf8") as xml_file:
dependency_data_dict = xmltodict.parse(xml_file.read(), attr_prefix="")
sub_dependencies = []
for sub_app_pkg in dependency_data_dict["Package"]["Dependencies"]["PackageDependency"]:
sub_dependency_info = {
"Name": sub_app_pkg["Name"],
"MinVersion": sub_app_pkg["MinVersion"],
}
sub_dependencies.append(sub_dependency_info)
ms_app_info["b4:Dependencies"] = dependencies
ms_app_info["Dependencies"] = sub_dependencies
ms_app_db[ms_app_file] = ms_app_info
else:
error("nothing to parse")
else:
manifest = unzip(ms_app_file, ".", makepath("AppxManifest.xml"), False)
with open(manifest[0], encoding="utf8") as xml_file:
simple_data_dict = xmltodict.parse(xml_file.read(), attr_prefix="")
simple_dependencies = []
for key, value in simple_data_dict["Package"]["Dependencies"].items():
if key == "PackageDependency":
for simple_dependency in value:
simple_dependency_info = {
"Name": simple_dependency["Name"],
"MinVersion": simple_dependency["MinVersion"],
}
simple_dependencies.append(simple_dependency_info)
if key == "TargetDeviceFamily":
simple_ms_app_info = {
"FileName": ms_app_file,
"Name": simple_data_dict["Package"]["Identity"]["Name"],
"Version": simple_data_dict["Package"]["Identity"]["Version"],
"Architecture": simple_data_dict["Package"]["Identity"]["ProcessorArchitecture"],
"MinVersion": value["MinVersion"],
"MaxVersionTested": value["MaxVersionTested"],
}
simple_ms_app_info["Dependencies"] = simple_dependencies
ms_app_db[ms_app_file] = simple_ms_app_info
for xml_file in glob.glob("AppxManifest.xml") + glob.glob("AppxBundleManifest.xml"):
remove_file(xml_file)
return ms_app_db
def get_uwp_filename_arch(appx_filename, appx_package_name=None):
if not appx_package_name:
appx_package_name = None
if "arm64" in appx_filename:
return "arm64"
elif "arm" in appx_filename:
return "arm"
elif "x64" in appx_filename:
return "x64"
if appx_filename is not None and "x86" in appx_filename and (appx_package_name is None or not appx_package_name in appx_filename):
return "x86"
else:
return "all"
def ask_control_description(blank_str=None):
"""Requesting that the user supply package description for the control.description field
Args:
blank_str (str): The description will be cleared if it includes the specified string to avoid using the template description (default: do not clear description)
"""
if not control.description:
control.description = waptguihelper.input_dialog("Description", "Please fill the description", control.description)
control.save_control_to_wapt()
if blank_str is not None and blank_str in control.description:
control.description = ""
control.save_control_to_wapt()
return control.description
def ask_control_categories():
"""Requesting that the user supply package categories for the control.categories field if empty or Template is selected"""
if control.categories == "" or control.categories == "Template":
categories = waptguihelper.grid_dialog(
"Select package categories",
[
"Internet",
"Utilities",
"Messaging",
"Security",
"System and network",
"Media",
"Development",
"Office",
"Drivers",
"Education",
"Configuration",
"CAD",
"Template",
"Dependency",
"Extension",
],
waptguihelper.GRT_SELECTED,
)
if categories:
control.categories = ",".join([a["unknown"] for a in categories])
else:
control.categories = ""
control.save_control_to_wapt()
return control.categories
def ask_control_package(control_package=control.package, conditionnal_package_name=None, remove_base_files=False):
"""Requesting that the user provide a package name to be entered into the control.package field, and offering the possibility of removing the base files (icon.png and changelog.txt) for template package usage
Args:
control_package (str) : prefilled control_package (default: actual control_package)
conditionnal_package_name (str) : only ask when the control.package contains conditionnal_package_name (default: always ask for control_package)
remove_base_files (bool) : removes base files if parameter is True and conditionnal_package_name is provided (default: False)
"""
if conditionnal_package_name is None or conditionnal_package_name in control.package:
control.package = waptguihelper.input_dialog(
control.package,
"You can redefine the package name",
control_package.replace(conditionnal_package_name, "") if conditionnal_package_name is not None else control_package,
)
control.save_control_to_wapt()
# Removing template files
if conditionnal_package_name in control.package and remove_base_files:
if isfile("WAPT\\changelog.txt"):
remove_file("WAPT\\changelog.txt")
if isfile("WAPT\\icon.png"):
remove_file("WAPT\\icon.png")
return control.package
def ask_control_name(control_name=control.name, conditionnal_package_name=None):
"""Requesting that the user provide a package name to be entered into control.name field
Args:
control_name (str) : prefilled control_name (default: control.name)
conditionnal_package_name (str) : only ask when the control.name contains conditionnal_package_name (default: always ask for control_name)
"""
if conditionnal_package_name is None or conditionnal_package_name in control.name:
control.name = waptguihelper.input_dialog(control.name, "You can redefine the name for the self-service", control_name)
control.save_control_to_wapt()
return control.name
675a4c80a533fb277c2d461f2b29fcc19c33f196df5011091bced815094dc921 : setup.py
11e1c3d0593fb0c6721ee54888d71eb65b5d3167ccfd70435e100bcd2cdcd227 : update_package.py
d05608294b26da683b6efc641070d4828da3465475615d4d24f4a78a7d07dec9 : WAPT/icon.png
a5a97261381e1d0ad46ee15916abec9c2631d0201f5cc50ceb0197a165a0bbbf : WAPT/certificate.crt
87a2b1e5a17200f51f0df274e6d2c03382ccae02f9a08bd3ff912fd12611215a : WAPT/changelog.txt
578a76d3737a2c01d93156df140189e8e3dab03ba5e8c02746bc515a7200fd0a : xmltodict.py
4a853e280add0cd3e6f92b78658871f771c580d4829d712fd6c8b83539d6e8a0 : microsoft-todos/Microsoft.Todos_2.93.6831.0_neutral___8wekyb3d8bbwe.appxbundle
baf178d63460623ae463e153fa14cabe50d249836edfacd69343c3fbf13ebde0 : microsoft-todos/Microsoft.Services.Store.Engagement_10.0.19011.0_arm__8wekyb3d8bbwe.appx
47de27af62a9a31d123a522c4a74056b8a10d15307de9ebead0adf684f3df45d : microsoft-todos/Microsoft.NET.Native.Runtime.2.2_2.2.28604.0_arm64__8wekyb3d8bbwe.appx
211e4e04441080c5f43e95588b42e31dd05ee00e8cb402aa05c20e2592efb230 : microsoft-todos/Microsoft.Services.Store.Engagement_10.0.19011.0_arm64__8wekyb3d8bbwe.appx
b33c87d60a9c868ec239b7e6a62575151628f29f45e4307ef4a17298dc185008 : microsoft-todos/Microsoft.NET.Native.Framework.2.2_2.2.29512.0_arm64__8wekyb3d8bbwe.appx
114bbf6617820e7c9bb4f332dbd8c3bb3faf273f5da5d347219b07d3824ee672 : microsoft-todos/Microsoft.UI.Xaml.2.7_7.2208.15002.0_arm64__8wekyb3d8bbwe.appx
009f7db134c6061fe8f260e075374a28abbbc44e6cf23de107f93ec8b8c59816 : microsoft-todos/Microsoft.VCLibs.140.00_14.0.30704.0_x64__8wekyb3d8bbwe.appx
e4c5dff287b59e27eb9da6ccd02ed1c76d3f6001eceb0f20e71eebd507b3aad2 : microsoft-todos/Microsoft.NET.Native.Framework.2.2_2.2.29512.0_x86__8wekyb3d8bbwe.appx
9c95ae33bf1350383a6a19648f592a4acd6d2b1f856210ff01278f6c288aba81 : microsoft-todos/Microsoft.Services.Store.Engagement_10.0.19011.0_x64__8wekyb3d8bbwe.appx
397b610554d67abaddfdc287ced6a9bf1ada4d4c9ddf53e01c6a061bed2860ef : microsoft-todos/Microsoft.VCLibs.140.00_14.0.30704.0_x86__8wekyb3d8bbwe.appx
7ccf4ef1815d479570fdcf4e462bd7d80f1bc9ae3c39c93220fdb40cc0ebaca9 : microsoft-todos/Microsoft.NET.Native.Runtime.2.2_2.2.28604.0_arm__8wekyb3d8bbwe.appx
ec7e811dca0cb511c69859c65aa1d94ccd5cc3cab3ec7f9d6bab95abb03149a8 : microsoft-todos/Microsoft.NET.Native.Runtime.2.2_2.2.28604.0_x86__8wekyb3d8bbwe.appx
27fae660d8c609e020703bb463b6601e62811dc75db19975bcb7d68d959b527d : microsoft-todos/Microsoft.NET.Native.Runtime.2.2_2.2.28604.0_x64__8wekyb3d8bbwe.appx
a9e511ff763091b098a932761288c44871dab527f4a429087245295a551d0540 : microsoft-todos/Microsoft.VCLibs.140.00_14.0.30704.0_arm__8wekyb3d8bbwe.appx
5a809587e9ddfb0000e4fd6124b8ed18ce4dd1ed111c7c970ea366f9d8129db9 : microsoft-todos/Microsoft.UI.Xaml.2.7_7.2208.15002.0_x86__8wekyb3d8bbwe.appx
c6999a75e10b926bebf17e91e898dc59d2c3fe49ba60922ac5b67b87248d54fa : microsoft-todos/Microsoft.Services.Store.Engagement_10.0.19011.0_x86__8wekyb3d8bbwe.appx
c195047f4af9c3ff3d92c40e55a901cf7cfa08a679b8ca2543bb104bab2f7ff1 : microsoft-todos/Microsoft.NET.Native.Framework.2.2_2.2.29512.0_x64__8wekyb3d8bbwe.appx
4ab54162efffe26e605c5ec6170de76d72d8f78983c7fc84427630b951402973 : microsoft-todos/Microsoft.VCLibs.140.00_14.0.30704.0_arm64__8wekyb3d8bbwe.appx
efa0b1396a134a654c41bd9f4b9f084a5dfe19ad6d492cd99313b0b898a0767f : microsoft-todos/Microsoft.UI.Xaml.2.7_7.2208.15002.0_x64__8wekyb3d8bbwe.appx
123af7a74e14cb3cf1b4cd794d59a48b44b9808589b2c8fb5ba810fcff176f5f : microsoft-todos/Microsoft.UI.Xaml.2.7_7.2208.15002.0_arm__8wekyb3d8bbwe.appx
bdf9c70e4966a4f7ce00ca7fc5179962239514be879f2aa3c1794076b7ff9bc6 : microsoft-todos/Microsoft.NET.Native.Framework.2.2_2.2.29512.0_arm__8wekyb3d8bbwe.appx
b333a440a16ec483a7c6d0767d2d7eddc0b56c3deffae7994f010a53f816756e : luti.json
f2027295b92b311fd35ae02310ddaae84c07689898454aa37b7d6e2c248d547e : WAPT/control