From e98c7db992ef3953f129ce969e43656841027b59 Mon Sep 17 00:00:00 2001 From: Dan Field Date: Thu, 18 Oct 2018 00:33:59 -0700 Subject: [PATCH 001/118] Initial refactor/adding of mdns --- packages/multicast_dns/CHANGELOG.md | 5 + packages/multicast_dns/LICENSE | 27 + .../multicast_dns/example/mdns-resolve.dart | 37 + packages/multicast_dns/example/mdns-sd.dart | 46 + packages/multicast_dns/lib/mdns_client.dart | 132 +++ packages/multicast_dns/lib/multicast_dns.dart | 3 + packages/multicast_dns/lib/src/constants.dart | 26 + .../lib/src/lookup_resolver.dart | 83 ++ .../lib/src/native_protocol_client.dart | 71 ++ packages/multicast_dns/lib/src/packet.dart | 312 +++++++ .../lib/src/resource_record.dart | 178 ++++ packages/multicast_dns/pubspec.yaml | 16 + packages/multicast_dns/test/decode_test.dart | 879 ++++++++++++++++++ .../test/lookup_resolver_test.dart | 97 ++ .../test/resource_record_cache.dart | 94 ++ 15 files changed, 2006 insertions(+) create mode 100644 packages/multicast_dns/CHANGELOG.md create mode 100644 packages/multicast_dns/LICENSE create mode 100644 packages/multicast_dns/example/mdns-resolve.dart create mode 100644 packages/multicast_dns/example/mdns-sd.dart create mode 100644 packages/multicast_dns/lib/mdns_client.dart create mode 100644 packages/multicast_dns/lib/multicast_dns.dart create mode 100644 packages/multicast_dns/lib/src/constants.dart create mode 100644 packages/multicast_dns/lib/src/lookup_resolver.dart create mode 100644 packages/multicast_dns/lib/src/native_protocol_client.dart create mode 100644 packages/multicast_dns/lib/src/packet.dart create mode 100644 packages/multicast_dns/lib/src/resource_record.dart create mode 100644 packages/multicast_dns/pubspec.yaml create mode 100644 packages/multicast_dns/test/decode_test.dart create mode 100644 packages/multicast_dns/test/lookup_resolver_test.dart create mode 100644 packages/multicast_dns/test/resource_record_cache.dart diff --git a/packages/multicast_dns/CHANGELOG.md b/packages/multicast_dns/CHANGELOG.md new file mode 100644 index 0000000..9d66683 --- /dev/null +++ b/packages/multicast_dns/CHANGELOG.md @@ -0,0 +1,5 @@ +## 0.1.0 + +* Initial Open Source release. +* Migrates the dartino-sdk's mDNS client to Dart 2.0 and Flutter's analysis rules +* Breaks from original Dartino code, as it does not use native libraries for macOS and overhauls the `ResourceRecord` class. \ No newline at end of file diff --git a/packages/multicast_dns/LICENSE b/packages/multicast_dns/LICENSE new file mode 100644 index 0000000..8211a02 --- /dev/null +++ b/packages/multicast_dns/LICENSE @@ -0,0 +1,27 @@ +Copyright 2014 The Chromium Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/packages/multicast_dns/example/mdns-resolve.dart b/packages/multicast_dns/example/mdns-resolve.dart new file mode 100644 index 0000000..018a227 --- /dev/null +++ b/packages/multicast_dns/example/mdns-resolve.dart @@ -0,0 +1,37 @@ +// Copyright (c) 2015, the Dartino project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +// Example script to illustrate how to use the mdns package to lookup names +// on the local network. + +import 'package:args/args.dart'; + +import 'package:multicast_dns/mdns_client.dart'; + +void main(List args) async { + // Parse the command line arguments. + final ArgParser parser = ArgParser(); + parser.addOption('timeout', abbr: 't', defaultsTo: '5'); + final ArgResults arguments = parser.parse(args); + + if (arguments.rest.length != 1) { + print(''' +Please provide an address as argument. + +For example: + dart mdns-resolve.dart [--timeout ] dartino.local'''); + return; + } + + final String name = arguments.rest[0]; + + final MDnsClient client = MDnsClient(); + await client.start(); + final Duration timeout = Duration(seconds: int.parse(arguments['timeout'])); + await for (IPAddressResourceRecord record + in client.lookup(RRType.a, name, timeout: timeout)) { + print('Found address (${record.address}).'); + } + client.stop(); +} diff --git a/packages/multicast_dns/example/mdns-sd.dart b/packages/multicast_dns/example/mdns-sd.dart new file mode 100644 index 0000000..bd26284 --- /dev/null +++ b/packages/multicast_dns/example/mdns-sd.dart @@ -0,0 +1,46 @@ +// Copyright (c) 2015, the Dartino project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +// Example script to illustrate how to use the mdns package to discover services +// on the local network. + +import 'package:args/args.dart'; + +import 'package:multicast_dns/mdns_client.dart'; + +void main(List args) async { + // Parse the command line arguments. + final ArgParser parser = ArgParser(); + parser.addOption('timeout', abbr: 't', defaultsTo: '5'); + final ArgResults arguments = parser.parse(args); + + if (arguments.rest.length != 1) { + print(''' +Please provide the name of a service as argument. + +For example: + dart mdns-sd.dart [--timeout ] _workstation._tcp.local'''); + return; + } + + final String name = arguments.rest[0]; + + final MDnsClient client = MDnsClient(); + await client.start(); + await for (PtrResourceRecord ptr in client.lookup(RRType.ptr, name)) { + final String domain = ptr.domainName; + print(ptr); + await for (SrvResourceRecord srv in client.lookup(RRType.srv, domain)) { + final String target = srv.target; + print(srv); + await client.lookup(RRType.txt, domain).forEach(print); + await for (IPAddressResourceRecord ip + in client.lookup(RRType.a, target)) { + print(ip); + print('Service instance found at $target (${ip.address}).'); + } + } + } + client.stop(); +} diff --git a/packages/multicast_dns/lib/mdns_client.dart b/packages/multicast_dns/lib/mdns_client.dart new file mode 100644 index 0000000..72daec0 --- /dev/null +++ b/packages/multicast_dns/lib/mdns_client.dart @@ -0,0 +1,132 @@ +// ignore_for_file: undefined_named_parameter +// Copyright (c) 2015, the Dartino project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +import 'dart:async'; +import 'dart:io'; + +import 'package:multicast_dns/src/constants.dart'; +import 'package:multicast_dns/src/lookup_resolver.dart'; +import 'package:multicast_dns/src/native_protocol_client.dart'; +import 'package:multicast_dns/src/packet.dart'; +import 'package:multicast_dns/src/resource_record.dart'; + +export 'package:multicast_dns/src/resource_record.dart'; + +/// Client for DNS lookup using the mDNS protocol. +/// +/// This client only support "One-Shot Multicast DNS Queries" as described in +/// section 5.1 of https://tools.ietf.org/html/rfc6762 +class MDnsClient { + bool _starting = false; + bool _started = false; + RawDatagramSocket _incoming; + final List _sockets = []; + final LookupResolver _resolver = LookupResolver(); + final ResourceRecordCache _cache = ResourceRecordCache(); + + /// Start the mDNS client. + Future start() async { + if (_started && _starting) { + throw StateError('mDNS client already started'); + } + _starting = true; + + // Listen on all addresses. + _incoming = await RawDatagramSocket.bind( + InternetAddress.anyIPv4, + mDnsPort, + reuseAddress: true, + reusePort: true, + ttl: 255, + ); + // Find all network interfaces with an IPv4 address. + final List interfaces = await NetworkInterface.list( + includeLinkLocal: true, + type: InternetAddressType.IPv4, + includeLoopback: true, + ); + + _sockets.add(_incoming); + + for (NetworkInterface interface in interfaces) { + // Create a socket for sending on each adapter. + final RawDatagramSocket socket = await RawDatagramSocket.bind( + interface.addresses[0], + mDnsPort, + reuseAddress: true, + reusePort: true, + ttl: 255, + ); + _sockets.add(socket); + + // Join multicast on this interface. + _incoming.joinMulticast(mDnsAddress, interface); + } + _incoming.listen(_handleIncoming); + + _starting = false; + _started = true; + } + + /// Stop the client and close any associated sockets. + void stop() { + if (!_started) { + return; + } + if (_starting) { + throw StateError('Cannot stop mDNS client wile it is starting'); + } + + for (RawDatagramSocket socket in _sockets) { + socket.close(); + } + + _resolver.clearPendingRequests(); + + _started = false; + } + + /// Lookup a [ResourceRecord], potentially from cache. + Stream lookup(int type, String name, + {Duration timeout = const Duration(seconds: 5)}) { + if (!_started) { + throw StateError('mDNS client is not started'); + } + // Look for entries in the cache. + final List cached = []; + _cache.lookup(name, type, cached); + if (cached.isNotEmpty) { + final StreamController controller = + StreamController(); + cached.forEach(controller.add); + controller.close(); + return controller.stream; + } + + // Add the pending request before sending the query. + final Stream results = + _resolver.addPendingRequest(type, name, timeout); + + // Send the request on all interfaces. + final List packet = encodeMDnsQuery(name, type: type); + for (RawDatagramSocket socket in _sockets) { + socket.send(packet, mDnsAddress, mDnsPort); + } + return results; + } + + // Process incoming datagrams. + void _handleIncoming(RawSocketEvent event) { + if (event == RawSocketEvent.read) { + final Datagram datagram = _incoming.receive(); + + final List response = decodeMDnsResponse(datagram.data); + if (response != null) { + _cache.updateRecords(response); + _resolver.handleResponse(response); + } + } + } +} diff --git a/packages/multicast_dns/lib/multicast_dns.dart b/packages/multicast_dns/lib/multicast_dns.dart new file mode 100644 index 0000000..a9cbc33 --- /dev/null +++ b/packages/multicast_dns/lib/multicast_dns.dart @@ -0,0 +1,3 @@ +export 'package:multicast_dns/src/resource_record.dart'; + +export 'mdns_client.dart'; diff --git a/packages/multicast_dns/lib/src/constants.dart b/packages/multicast_dns/lib/src/constants.dart new file mode 100644 index 0000000..306159a --- /dev/null +++ b/packages/multicast_dns/lib/src/constants.dart @@ -0,0 +1,26 @@ +// Copyright (c) 2015, the Dartino project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +import 'dart:io'; + +/// The IPv4 mDNS Address. +InternetAddress mDnsAddress = InternetAddress('224.0.0.251'); + +/// The mDNS port. +const int mDnsPort = 5353; + +/// Enumeration of supported resource record class types. +class RRClass { + /// Internet address class ("IN"). + static const int internet = 1; +} + +/// Enumeration of DNS question types. +class QuestionType { + /// "QU" Question. + static const int unicast = 0x8000; + + /// "QM" Question. + static const int multicast = 0x0000; +} diff --git a/packages/multicast_dns/lib/src/lookup_resolver.dart b/packages/multicast_dns/lib/src/lookup_resolver.dart new file mode 100644 index 0000000..e0ad316 --- /dev/null +++ b/packages/multicast_dns/lib/src/lookup_resolver.dart @@ -0,0 +1,83 @@ +// Copyright (c) 2015, the Dartino project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +import 'dart:async'; +import 'dart:collection'; + +import 'package:multicast_dns/src/resource_record.dart'; + +/// Class for maintaining state about pending mDNS requests. +class PendingRequest extends LinkedListEntry { + /// Creates a new PendingRequest. + PendingRequest(this.type, this.name, this.controller); + + /// The [RRType] of the request. + final int type; + + /// The domain name. + final String name; + + /// A StreamController managing the request. + final StreamController controller; + + /// The timer for the request. + Timer timer; +} + +/// Class for keeping track of pending lookups and process incoming +/// query responses. +class LookupResolver { + /// The requests the process. + final LinkedList pendingRequests = + LinkedList(); + + /// Adds a request and returns a [Stream] of [ResourceRecord] responses. + Stream addPendingRequest( + int type, String name, Duration timeout) { + final StreamController controller = + StreamController(); + final PendingRequest request = PendingRequest(type, name, controller); + final Timer timer = Timer(timeout, () { + request.unlink(); + controller.close(); + }); + request.timer = timer; + pendingRequests.add(request); + return controller.stream; + } + + /// Processes responses back to the caller. + void handleResponse(List response) { + for (ResourceRecord r in response) { + final int type = r.rrValue; + String name = r.name.toLowerCase(); + if (name.endsWith('.')) { + name = name.substring(0, name.length - 1); + } + + bool responseMatches(PendingRequest request) { + return request.name.toLowerCase() == name && request.type == type; + } + + for (PendingRequest pendingRequest in pendingRequests) { + if (responseMatches(pendingRequest)) { + if (pendingRequest.controller.isClosed) { + return; + } + pendingRequest.controller.add(r); + } + } + } + } + + /// Removes any pending requests and ends processing. + void clearPendingRequests() { + while (pendingRequests.isNotEmpty) { + final PendingRequest request = pendingRequests.first; + request.unlink(); + request.timer.cancel(); + request.controller.close(); + } + } +} diff --git a/packages/multicast_dns/lib/src/native_protocol_client.dart b/packages/multicast_dns/lib/src/native_protocol_client.dart new file mode 100644 index 0000000..ebe1b77 --- /dev/null +++ b/packages/multicast_dns/lib/src/native_protocol_client.dart @@ -0,0 +1,71 @@ +// Copyright (c) 2015, the Dartino project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +import 'package:multicast_dns/src/resource_record.dart'; + +/// Cache for resource records that have been received. +/// +/// There can be multiple entries for the same name and type. +/// +/// The cached is updated with a list of records, because it needs to remove +/// all entries that correspond to name and type of the name/type combinations +/// of records that should be updated. For example, a host may remove one +/// of its IP addresses and report the remaining address as a response - then +/// we need to clear all previous entries for that host before updating the +/// cache. +class ResourceRecordCache { + /// Creates a new ResourceRecordCache. + ResourceRecordCache({this.size = 32}) + : buffer = List(size), + _position = 0; + + /// The records in the cache. + final List buffer; + + /// The size of the cache. + final int size; + int _position; + + /// Update the records in this cache. + void updateRecords(List records) { + // TODO(karlklose): include flush bit in the record and only flush if + // necessary. + // Clear the cache for all name/type combinations to be updated. + for (int i = 0; i < size; i++) { + final ResourceRecord r = buffer[i % size]; + if (r == null) { + continue; + } + for (ResourceRecord record in records) { + if (r.name == record.name && r.rrValue == record.rrValue) { + buffer[i % size] = null; + break; + } + } + } + // Add therecords. + for (ResourceRecord record in records) { + buffer[_position] = record; + _position = (_position + 1) % size; + } + } + + /// Get a record from this cache. + void lookup(String name, int type, List results) { + RRType.debugAssertValid(type); + final int time = DateTime.now().millisecondsSinceEpoch; + for (int i = _position + size; i >= _position; i--) { + final int index = i % size; + final ResourceRecord record = buffer[index]; + if (record == null) { + continue; + } + if (record.validUntil < time) { + buffer[index] = null; + } else if (record.name == name && record.rrValue == type) { + results.add(record); + } + } + } +} diff --git a/packages/multicast_dns/lib/src/packet.dart b/packages/multicast_dns/lib/src/packet.dart new file mode 100644 index 0000000..fdb65f3 --- /dev/null +++ b/packages/multicast_dns/lib/src/packet.dart @@ -0,0 +1,312 @@ +// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +import 'dart:convert'; +import 'dart:io'; +import 'dart:typed_data'; + +import 'package:multicast_dns/src/constants.dart'; +import 'package:multicast_dns/src/resource_record.dart'; + +// Offsets into the header. See https://tools.ietf.org/html/rfc1035. +const int _kIdOffset = 0; +const int _kFlagsOffset = 2; +const int _kQdcountOffset = 4; +const int _kAncountOffset = 6; +const int _kNscountOffset = 8; +const int _kArcountOffset = 10; +const int _kHeaderSize = 12; + +/// Encode an mDNS query packet. +/// +/// The [type] parameter must be a valid [RRType] value. The [multicast] parameter +/// must not be null. +List encodeMDnsQuery( + String name, { + int type = RRType.a, + bool multicast = true, +}) { + RRType.debugAssertValid(type); + assert(multicast != null); + + final List> parts = + name.split('.').map((String part) => utf8.encode(part)).toList(); + + // Calculate the size of the packet. + int size = _kHeaderSize; + for (int i = 0; i < parts.length; i++) { + size += 1 + parts[i].length; + } + + size += 1; // End with empty part + size += 4; // Trailer (QTYPE and QCLASS). + final Uint8List data = Uint8List(size); + final ByteData bd = ByteData.view(data.buffer); + // Query identifier - just use 0. + bd.setUint16(_kIdOffset, 0); + // Flags - 0 for query. + bd.setUint16(_kFlagsOffset, 0); + // Query count. + bd.setUint16(_kQdcountOffset, 1); + // Number of answers - 0 for query. + bd.setUint16(_kAncountOffset, 0); + // Number of name server records - 0 for query. + bd.setUint16(_kNscountOffset, 0); + // Number of resource records - 0 for query. + bd.setUint16(_kArcountOffset, 0); + int offset = _kHeaderSize; + for (int i = 0; i < parts.length; i++) { + data[offset++] = parts[i].length; + data.setRange(offset, offset + parts[i].length, parts[i]); + offset += parts[i].length; + } + + data[offset] = 0; // Empty part. + offset++; + bd.setUint16(offset, type); // QTYPE. + offset += 2; + bd.setUint16( + offset, + RRClass.internet | + (multicast ? QuestionType.multicast : QuestionType.unicast)); + + return data; +} + +/// Result of reading a Fully Qualified Domain Name (FQDN). +class _FQDNReadResult { + /// Creates a new FQDN read result. + _FQDNReadResult(this.fqdnParts, this.bytesRead); + + /// The raw parts of the FQDN. + final List fqdnParts; + + /// The bytes consumed from the packet for this FQDN. + final int bytesRead; + + /// Returns the Fully Qualified Domain Name. + String get fqdn => fqdnParts.join('.'); + + @override + String toString() => fqdn; +} + +/// Reads a FQDN from raw packet data. +String readFQDN(List packet, [int offset = 0]) { + final Uint8List data = + packet is Uint8List ? packet : Uint8List.fromList(packet); + final ByteData bd = ByteData.view(data.buffer); + + return _readFQDN(data, bd, offset, data.length).fqdn; +} + +// Read a FQDN at the given offset. Returns a pair with the FQDN +// parts and the number of bytes consumed. +// +// If decoding fails (e.g. due to an invalid packet) `null` is returned. +_FQDNReadResult _readFQDN(Uint8List data, ByteData bd, int offset, int length) { + void checkLength(int required) { + if (length < required) { + throw MDnsDecodeException(required); + } + } + + final List parts = []; + final int prevOffset = offset; + while (true) { + // At least one byte is required. + checkLength(offset + 1); + + // Check for compressed. + if (data[offset] & 0xc0 == 0xc0) { + // At least two bytes are required for a compressed FQDN. + checkLength(offset + 2); + + // A compressed FQDN has a new offset in the lower 14 bits. + final _FQDNReadResult result = + _readFQDN(data, bd, bd.getUint16(offset) & ~0xc000, length); + parts.addAll(result.fqdnParts); + offset += 2; + break; + } else { + // A normal FQDN part has a length and a UTF-8 encoded name + // part. If the length is 0 this is the end of the FQDN. + final int partLength = data[offset]; + offset++; + if (partLength > 0) { + checkLength(offset + partLength); + final Uint8List partBytes = + Uint8List.view(data.buffer, offset, partLength); + offset += partLength; + parts.add(utf8.decode(partBytes)); + } else { + break; + } + } + } + return _FQDNReadResult(parts, offset - prevOffset); +} + +/// Decode a mDNS package. +/// +/// If decoding fails (e.g. due to an invalid packet) `null` is returned. +/// +/// See https://tools.ietf.org/html/rfc1035 for the format. +List decodeMDnsResponse(List packet) { + final int length = packet.length; + if (length < _kHeaderSize) { + return null; + } + + final Uint8List data = + packet is Uint8List ? packet : Uint8List.fromList(packet); + final ByteData bd = ByteData.view(data.buffer); + // Number of answers. + final int ancount = bd.getUint16(_kAncountOffset); + if (ancount == 0) { + return null; + } + + // Number of resource records. + final int arcount = bd.getUint16(_kArcountOffset); + + int offset = _kHeaderSize; + + void checkLength(int required) { + if (length < required) { + throw MDnsDecodeException(required); + } + } + + ResourceRecord readResourceRecord() { + // First read the FQDN. + final _FQDNReadResult result = _readFQDN(data, bd, offset, length); + final String fqdn = result.fqdn; + offset += result.bytesRead; + checkLength(offset + 2); + final int type = bd.getUint16(offset); + offset += 2; + // The first bit of the rrclass field is set to indicate that the answer is + // unique and the querier should flush the cached answer for this name + // (RFC 6762, Sec. 10.2). We ignore it for now since we don't cache answers. + checkLength(offset + 2); + final int cls = bd.getUint16(offset) & 0x7fff; + + if (cls != RRClass.internet) { + // We do not support other classes. + return null; + } + + offset += 2; + checkLength(offset + 4); + final int ttl = bd.getInt32(offset); + offset += 4; + + checkLength(offset + 2); + final int rDataLength = bd.getUint16(offset); + offset += 2; + final int validUntil = DateTime.now().millisecondsSinceEpoch + ttl * 1000; + switch (type) { + case RRType.a: + checkLength(offset + rDataLength); + final StringBuffer addr = StringBuffer(); + final int stop = offset + rDataLength; + addr.write(bd.getUint8(offset)); + offset++; + for (offset; offset < stop; offset++) { + addr.write('.'); + addr.write(bd.getUint8(offset)); + } + return IPAddressResourceRecord(fqdn, validUntil, + address: InternetAddress(addr.toString())); + case RRType.aaaa: + checkLength(offset + rDataLength); + + final StringBuffer addr = StringBuffer(); + final int stop = offset + rDataLength; + addr.write(bd.getUint16(offset).toRadixString(16)); + offset += 2; + for (offset; offset < stop; offset += 2) { + addr.write(':'); + addr.write(bd.getUint16(offset).toRadixString(16)); + } + return IPAddressResourceRecord( + fqdn, + validUntil, + address: InternetAddress(addr.toString()), + ); + case RRType.srv: + checkLength(offset + 2); + final int priority = bd.getUint16(offset); + offset += 2; + checkLength(offset + 2); + final int weight = bd.getUint16(offset); + offset += 2; + checkLength(offset + 2); + final int port = bd.getUint16(offset); + offset += 2; + final _FQDNReadResult result = _readFQDN(data, bd, offset, length); + offset += result.bytesRead; + return SrvResourceRecord( + fqdn, + validUntil, + target: result.fqdn, + port: port, + priority: priority, + weight: weight, + ); + break; + case RRType.ptr: + checkLength(offset + rDataLength); + final _FQDNReadResult result = _readFQDN(data, bd, offset, length); + offset += rDataLength; + return PtrResourceRecord( + fqdn, + validUntil, + domainName: result.fqdn, + ); + case RRType.txt: + checkLength(offset + rDataLength); + final Uint8List rawText = Uint8List.view( + data.buffer, + offset, + rDataLength, + ); + final String text = utf8.decode(rawText); + offset += rDataLength; + return TxtResourceRecord(fqdn, validUntil, text: text); + default: + checkLength(offset + rDataLength); + offset += rDataLength; + return null; + } + } + + final List result = []; + + try { + for (int i = 0; i < ancount + arcount; i++) { + final ResourceRecord record = readResourceRecord(); + if (record != null) { + result.add(record); + } + } + } on MDnsDecodeException { + // If decoding fails return null. + return null; + } + return result; +} + +/// Exceptions thrown by decoder when the packet is invalid. +class MDnsDecodeException implements Exception { + /// Creates a new MDnsDecodeException. + const MDnsDecodeException(this.offset); + + /// The offset in the packet at which the exception occurred. + final int offset; + + @override + String toString() => 'Decoding error at $offset'; +} diff --git a/packages/multicast_dns/lib/src/resource_record.dart b/packages/multicast_dns/lib/src/resource_record.dart new file mode 100644 index 0000000..8102454 --- /dev/null +++ b/packages/multicast_dns/lib/src/resource_record.dart @@ -0,0 +1,178 @@ +// Copyright 2018 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:meta/meta.dart'; + +/// Enumeration of support resource record types. +class RRType { + /// An IPv4 Address record (1). + static const int a = 1; + + /// An IPv6 Address record (28). + static const int aaaa = 28; + + /// An IP Address reverse map record (12). + static const int ptr = 12; + + /// An available service record (33). + static const int srv = 33; + + /// A text record (16). + static const int txt = 16; + + /// Asserts that a given int is a valid RRType. + static void debugAssertValid(int rrType) { + assert(rrType == a || + rrType == aaaa || + rrType == ptr || + rrType == srv || + rrType == txt); + } +} + +/// Base implementation of DNS resource records (RRs). +abstract class ResourceRecord { + /// Creates a new ResourceRecord. + ResourceRecord(this.rrValue, this.name, this.validUntil); + + /// The FQDN for this record. + final String name; + + /// The epoch time at which point this record is valid for in the cache. + final int validUntil; + + /// The raw resource record value. See [RRType] for supported values. + final int rrValue; + + String get _additionalInfo; + + @override + String toString() => + '$runtimeType{$name, validUntil: ${DateTime.fromMillisecondsSinceEpoch(validUntil)}, $_additionalInfo}'; + + @override + bool operator ==(Object other) { + return other is ResourceRecord && _equals(other); + } + + @protected + bool _equals(ResourceRecord other) { + return other.name == name && + other.validUntil == validUntil && + other.rrValue == rrValue; + } + + @override + int get hashCode { + // TODO(dnfield): Probably should go with a real hashing function here + // when https://github.com/dart-lang/sdk/issues/11617 is figured out. + return toString().hashCode; + } +} + +/// A Service Pointer for reverse mapping an IP address (DNS "PTR"). +class PtrResourceRecord extends ResourceRecord { + /// Creates a new PtrResourceRecord. + PtrResourceRecord( + String name, + int validUntil, { + @required this.domainName, + }) : super(RRType.ptr, name, validUntil); + + /// The FQDN for this record. + final String domainName; + + @override + String get _additionalInfo => 'domainName: $domainName'; + + @override + bool _equals(ResourceRecord other) { + return other is PtrResourceRecord && + other.domainName == domainName && + super._equals(other); + } +} + +/// An IP Address record for IPv4 (DNS "A") or IPv6 (DNS "AAAA") records. +class IPAddressResourceRecord extends ResourceRecord { + /// Creates a new IPAddressResourceRecord. + IPAddressResourceRecord( + String name, + int validUntil, { + @required this.address, + }) : super(address.type == InternetAddressType.IPv4 ? RRType.a : RRType.aaaa, + name, validUntil); + + /// The [InternetAddress] for this record. + final InternetAddress address; + + @override + String get _additionalInfo => 'address: $address'; + + @override + bool _equals(ResourceRecord other) { + return other is IPAddressResourceRecord && other.address == address; + } +} + +/// A Service record, capturing a host target and port (DNS "SRV"). +class SrvResourceRecord extends ResourceRecord { + /// Creates a new service record. + SrvResourceRecord( + String name, + int validUntil, { + @required this.target, + @required this.port, + @required this.priority, + @required this.weight, + }) : super(RRType.srv, name, validUntil); + + /// The hostname for this record. + final String target; + + /// The port for this record. + final int port; + + /// The relative priority of this service. + final int priority; + + /// The weight (used when multiple services have the same priority). + final int weight; + + @override + String get _additionalInfo => + 'target: $target, port: $port, priority: $priority, weight: $weight'; + + @override + bool _equals(ResourceRecord other) { + return other is SrvResourceRecord && + other.target == target && + other.port == port && + other.priority == priority && + other.weight == weight; + } +} + +/// A Text record, contianing additional textual data (DNS "TXT"). +class TxtResourceRecord extends ResourceRecord { + /// Creates a new text record. + TxtResourceRecord( + String name, + int validUntil, { + @required this.text, + }) : super(RRType.txt, name, validUntil); + + /// The raw text from this record. + final String text; + + @override + String get _additionalInfo => 'text: $text'; + + @override + bool _equals(ResourceRecord other) { + return other is TxtResourceRecord && other.text == text; + } +} diff --git a/packages/multicast_dns/pubspec.yaml b/packages/multicast_dns/pubspec.yaml new file mode 100644 index 0000000..2fb256a --- /dev/null +++ b/packages/multicast_dns/pubspec.yaml @@ -0,0 +1,16 @@ +name: multicast_dns +description: Dart package for mDNS queries (e.g. Bonjour, Avahi). +author: Flutter Team +homepage: https://github.com/flutter/packages/tree/master/packages/mdns +version: 0.1.0 + +dependencies: + args: ^1.5.0 + collection: ^1.14.11 + meta: ^1.1.6 + +dev_dependencies: + test: any + +environment: + sdk: ">=2.1.0-dev.7.1 <3.0.0" diff --git a/packages/multicast_dns/test/decode_test.dart b/packages/multicast_dns/test/decode_test.dart new file mode 100644 index 0000000..52ad987 --- /dev/null +++ b/packages/multicast_dns/test/decode_test.dart @@ -0,0 +1,879 @@ +// Copyright (c) 2015, the Dartino project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +import 'dart:io'; + +import 'package:test/test.dart'; +import 'package:multicast_dns/src/packet.dart'; +import 'package:multicast_dns/src/resource_record.dart'; + +const int _kSrvHeaderSize = 6; + +void main() { + testValidPackages(); + testBadPackages(); + // testHexDumpList(); + testPTRRData(); + testSRVRData(); +} + +void testValidPackages() { + test('Can decode valid packets', () { + List result = decodeMDnsResponse(package1); + expect(1, result.length); + IPAddressResourceRecord ipResult = result[0]; + expect(ipResult.name, 'raspberrypi.local'); + expect(ipResult.address.address, '192.168.1.191'); + + result = decodeMDnsResponse(package2); + expect(result.length, 2); + ipResult = result[0]; + expect(ipResult.name, 'raspberrypi.local'); + expect(ipResult.address.address, '192.168.1.191'); + ipResult = result[1]; + expect(ipResult.name, 'raspberrypi.local'); + expect(ipResult.address.address, '169.254.95.83'); + + result = decodeMDnsResponse(package3); + expect(result.length, 8); + expect(result, [ + TxtResourceRecord( + 'raspberrypi [b8:27:eb:03:92:4b]._workstation._tcp.local', + result[0].validUntil, + text: '\x00', + ), + PtrResourceRecord( + '_udisks-ssh._tcp.local', + result[1].validUntil, + domainName: 'raspberrypi._udisks-ssh._tcp.local', + ), + SrvResourceRecord( + 'raspberrypi._udisks-ssh._tcp.local', + result[2].validUntil, + target: 'raspberrypi.local', + port: 22, + priority: 0, + weight: 0, + ), + TxtResourceRecord( + 'raspberrypi._udisks-ssh._tcp.local', + result[3].validUntil, + text: '\x00', + ), + PtrResourceRecord('_services._dns-sd._udp.local', result[4].validUntil, + domainName: '_udisks-ssh._tcp.local'), + PtrResourceRecord( + '_workstation._tcp.local', + result[5].validUntil, + domainName: 'raspberrypi [b8:27:eb:03:92:4b]._workstation._tcp.local', + ), + SrvResourceRecord( + 'raspberrypi [b8:27:eb:03:92:4b]._workstation._tcp.local', + result[6].validUntil, + target: 'raspberrypi.local', + port: 9, + priority: 0, + weight: 0, + ), + PtrResourceRecord( + '_services._dns-sd._udp.local', + result[7].validUntil, + domainName: '_workstation._tcp.local', + ), + ]); + + result = decodeMDnsResponse(packagePtrResponse); + expect(6, result.length); + expect(result, [ + PtrResourceRecord( + '_fletch_agent._tcp.local', + result[0].validUntil, + domainName: 'fletch-agent on raspberrypi._fletch_agent._tcp.local', + ), + TxtResourceRecord( + 'fletch-agent on raspberrypi._fletch_agent._tcp.local', + result[1].validUntil, + text: '\x00', + ), + SrvResourceRecord( + 'fletch-agent on raspberrypi._fletch_agent._tcp.local', + result[2].validUntil, + target: 'raspberrypi.local', + port: 12121, + priority: 0, + weight: 0, + ), + IPAddressResourceRecord( + 'raspberrypi.local', + result[3].validUntil, + address: InternetAddress('fe80:0000:0000:0000:ba27:ebff:fe69:6e3a'), + ), + IPAddressResourceRecord( + 'raspberrypi.local', + result[4].validUntil, + address: InternetAddress('192.168.1.1'), + ), + IPAddressResourceRecord( + 'raspberrypi.local', + result[5].validUntil, + address: InternetAddress('169.254.167.172'), + ), + ]); + }); +} + +void testBadPackages() { + test('Returns null for invalid packets', () { + for (List p in >[package1, package2, package3]) { + for (int i = 0; i < p.length; i++) { + expect(decodeMDnsResponse(p.sublist(0, i)), isNull); + } + } + }); +} + +void testPTRRData() { + test('Can read FQDN from PTR data', () { + expect('sgjesse-macbookpro2 [78:31:c1:b8:55:38]._workstation._tcp.local', + readFQDN(ptrRData)); + expect('fletch-agent._fletch_agent._tcp.local', readFQDN(ptrRData2)); + }); +} + +void testSRVRData() { + test('Can read FQDN from SRV data', () { + expect('fletch.local', readFQDN(srvRData, _kSrvHeaderSize)); + }); +} + +// One address. +const List package1 = [ + 0x00, + 0x00, + 0x84, + 0x00, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x00, + 0x0b, + 0x72, + 0x61, + 0x73, + 0x70, + 0x62, + 0x65, + 0x72, + 0x72, + 0x79, + 0x70, + 0x69, + 0x05, + 0x6c, + 0x6f, + 0x63, + 0x61, + 0x6c, + 0x00, + 0x00, + 0x01, + 0x80, + 0x01, + 0x00, + 0x00, + 0x00, + 0x78, + 0x00, + 0x04, + 0xc0, + 0xa8, + 0x01, + 0xbf +]; + +// Two addresses. +const List package2 = [ + 0x00, + 0x00, + 0x84, + 0x00, + 0x00, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x00, + 0x0b, + 0x72, + 0x61, + 0x73, + 0x70, + 0x62, + 0x65, + 0x72, + 0x72, + 0x79, + 0x70, + 0x69, + 0x05, + 0x6c, + 0x6f, + 0x63, + 0x61, + 0x6c, + 0x00, + 0x00, + 0x01, + 0x80, + 0x01, + 0x00, + 0x00, + 0x00, + 0x78, + 0x00, + 0x04, + 0xc0, + 0xa8, + 0x01, + 0xbf, + 0xc0, + 0x0c, + 0x00, + 0x01, + 0x80, + 0x01, + 0x00, + 0x00, + 0x00, + 0x78, + 0x00, + 0x04, + 0xa9, + 0xfe, + 0x5f, + 0x53 +]; + +// Eight mixed answers. +const List package3 = [ + 0x00, + 0x00, + 0x84, + 0x00, + 0x00, + 0x00, + 0x00, + 0x08, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x72, + 0x61, + 0x73, + 0x70, + 0x62, + 0x65, + 0x72, + 0x72, + 0x79, + 0x70, + 0x69, + 0x20, + 0x5b, + 0x62, + 0x38, + 0x3a, + 0x32, + 0x37, + 0x3a, + 0x65, + 0x62, + 0x3a, + 0x30, + 0x33, + 0x3a, + 0x39, + 0x32, + 0x3a, + 0x34, + 0x62, + 0x5d, + 0x0c, + 0x5f, + 0x77, + 0x6f, + 0x72, + 0x6b, + 0x73, + 0x74, + 0x61, + 0x74, + 0x69, + 0x6f, + 0x6e, + 0x04, + 0x5f, + 0x74, + 0x63, + 0x70, + 0x05, + 0x6c, + 0x6f, + 0x63, + 0x61, + 0x6c, + 0x00, + 0x00, + 0x10, + 0x80, + 0x01, + 0x00, + 0x00, + 0x11, + 0x94, + 0x00, + 0x01, + 0x00, + 0x0b, + 0x5f, + 0x75, + 0x64, + 0x69, + 0x73, + 0x6b, + 0x73, + 0x2d, + 0x73, + 0x73, + 0x68, + 0xc0, + 0x39, + 0x00, + 0x0c, + 0x00, + 0x01, + 0x00, + 0x00, + 0x11, + 0x94, + 0x00, + 0x0e, + 0x0b, + 0x72, + 0x61, + 0x73, + 0x70, + 0x62, + 0x65, + 0x72, + 0x72, + 0x79, + 0x70, + 0x69, + 0xc0, + 0x50, + 0xc0, + 0x68, + 0x00, + 0x21, + 0x80, + 0x01, + 0x00, + 0x00, + 0x00, + 0x78, + 0x00, + 0x14, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x16, + 0x0b, + 0x72, + 0x61, + 0x73, + 0x70, + 0x62, + 0x65, + 0x72, + 0x72, + 0x79, + 0x70, + 0x69, + 0xc0, + 0x3e, + 0xc0, + 0x68, + 0x00, + 0x10, + 0x80, + 0x01, + 0x00, + 0x00, + 0x11, + 0x94, + 0x00, + 0x01, + 0x00, + 0x09, + 0x5f, + 0x73, + 0x65, + 0x72, + 0x76, + 0x69, + 0x63, + 0x65, + 0x73, + 0x07, + 0x5f, + 0x64, + 0x6e, + 0x73, + 0x2d, + 0x73, + 0x64, + 0x04, + 0x5f, + 0x75, + 0x64, + 0x70, + 0xc0, + 0x3e, + 0x00, + 0x0c, + 0x00, + 0x01, + 0x00, + 0x00, + 0x11, + 0x94, + 0x00, + 0x02, + 0xc0, + 0x50, + 0xc0, + 0x2c, + 0x00, + 0x0c, + 0x00, + 0x01, + 0x00, + 0x00, + 0x11, + 0x94, + 0x00, + 0x02, + 0xc0, + 0x0c, + 0xc0, + 0x0c, + 0x00, + 0x21, + 0x80, + 0x01, + 0x00, + 0x00, + 0x00, + 0x78, + 0x00, + 0x08, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x09, + 0xc0, + 0x88, + 0xc0, + 0xa3, + 0x00, + 0x0c, + 0x00, + 0x01, + 0x00, + 0x00, + 0x11, + 0x94, + 0x00, + 0x02, + 0xc0, + 0x2c +]; + +const List packagePtrResponse = [ + 0x00, + 0x00, + 0x84, + 0x00, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x00, + 0x0d, + 0x5f, + 0x66, + 0x6c, + 0x65, + 0x74, + 0x63, + 0x68, + 0x5f, + 0x61, + 0x67, + 0x65, + 0x6e, + 0x74, + 0x04, + 0x5f, + 0x74, + 0x63, + 0x70, + 0x05, + 0x6c, + 0x6f, + 0x63, + 0x61, + 0x6c, + 0x00, + 0x00, + 0x0c, + 0x00, + 0x01, + 0x00, + 0x00, + 0x11, + 0x94, + 0x00, + 0x1e, + 0x1b, + 0x66, + 0x6c, + 0x65, + 0x74, + 0x63, + 0x68, + 0x2d, + 0x61, + 0x67, + 0x65, + 0x6e, + 0x74, + 0x20, + 0x6f, + 0x6e, + 0x20, + 0x72, + 0x61, + 0x73, + 0x70, + 0x62, + 0x65, + 0x72, + 0x72, + 0x79, + 0x70, + 0x69, + 0xc0, + 0x0c, + 0xc0, + 0x30, + 0x00, + 0x10, + 0x80, + 0x01, + 0x00, + 0x00, + 0x11, + 0x94, + 0x00, + 0x01, + 0x00, + 0xc0, + 0x30, + 0x00, + 0x21, + 0x80, + 0x01, + 0x00, + 0x00, + 0x00, + 0x78, + 0x00, + 0x14, + 0x00, + 0x00, + 0x00, + 0x00, + 0x2f, + 0x59, + 0x0b, + 0x72, + 0x61, + 0x73, + 0x70, + 0x62, + 0x65, + 0x72, + 0x72, + 0x79, + 0x70, + 0x69, + 0xc0, + 0x1f, + 0xc0, + 0x6d, + 0x00, + 0x1c, + 0x80, + 0x01, + 0x00, + 0x00, + 0x00, + 0x78, + 0x00, + 0x10, + 0xfe, + 0x80, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xba, + 0x27, + 0xeb, + 0xff, + 0xfe, + 0x69, + 0x6e, + 0x3a, + 0xc0, + 0x6d, + 0x00, + 0x01, + 0x80, + 0x01, + 0x00, + 0x00, + 0x00, + 0x78, + 0x00, + 0x04, + 0xc0, + 0xa8, + 0x01, + 0x01, + 0xc0, + 0x6d, + 0x00, + 0x01, + 0x80, + 0x01, + 0x00, + 0x00, + 0x00, + 0x78, + 0x00, + 0x04, + 0xa9, + 0xfe, + 0xa7, + 0xac +]; + +const List ptrRData = [ + 0x27, + 0x73, + 0x67, + 0x6a, + 0x65, + 0x73, + 0x73, + 0x65, + 0x2d, + 0x6d, + 0x61, + 0x63, + 0x62, + 0x6f, + 0x6f, + 0x6b, + 0x70, + 0x72, + 0x6f, + 0x32, + 0x20, + 0x5b, + 0x37, + 0x38, + 0x3a, + 0x33, + 0x31, + 0x3a, + 0x63, + 0x31, + 0x3a, + 0x62, + 0x38, + 0x3a, + 0x35, + 0x35, + 0x3a, + 0x33, + 0x38, + 0x5d, + 0x0c, + 0x5f, + 0x77, + 0x6f, + 0x72, + 0x6b, + 0x73, + 0x74, + 0x61, + 0x74, + 0x69, + 0x6f, + 0x6e, + 0x04, + 0x5f, + 0x74, + 0x63, + 0x70, + 0x05, + 0x6c, + 0x6f, + 0x63, + 0x61, + 0x6c, + 0x00 +]; + +const List ptrRData2 = [ + 0x0c, + 0x66, + 0x6c, + 0x65, + 0x74, + 0x63, + 0x68, + 0x2d, + 0x61, + 0x67, + 0x65, + 0x6e, + 0x74, + 0x0d, + 0x5f, + 0x66, + 0x6c, + 0x65, + 0x74, + 0x63, + 0x68, + 0x5f, + 0x61, + 0x67, + 0x65, + 0x6e, + 0x74, + 0x04, + 0x5f, + 0x74, + 0x63, + 0x70, + 0x05, + 0x6c, + 0x6f, + 0x63, + 0x61, + 0x6c, + 0x00 +]; + +const List srvRData = [ + 0x00, + 0x00, + 0x00, + 0x00, + 0x2f, + 0x59, + 0x06, + 0x66, + 0x6c, + 0x65, + 0x74, + 0x63, + 0x68, + 0x05, + 0x6c, + 0x6f, + 0x63, + 0x61, + 0x6c, + 0x00 +]; + +// Support code to generate the hex-lists above from +// a hex-stream. +void formatHexStream(String hexStream) { + String s = ''; + for (int i = 0; i < hexStream.length / 2; i++) { + if (s.isNotEmpty) { + s += ', '; + } + s += '0x'; + final String x = hexStream.substring(i * 2, i * 2 + 2); + s += x; + if (((i + 1) % 8) == 0) { + s += ','; + print(s); + s = ''; + } + } + if (s.isNotEmpty) { + print(s); + } +} + +// Support code for generating the hex-lists above. +void hexDumpList(List package) { + String s = ''; + for (int i = 0; i < package.length; i++) { + if (s.isNotEmpty) { + s += ', '; + } + s += '0x'; + final String x = package[i].toRadixString(16); + if (x.length == 1) { + s += '0'; + } + s += x; + if (((i + 1) % 8) == 0) { + s += ','; + print(s); + s = ''; + } + } + if (s.isNotEmpty) { + print(s); + } +} diff --git a/packages/multicast_dns/test/lookup_resolver_test.dart b/packages/multicast_dns/test/lookup_resolver_test.dart new file mode 100644 index 0000000..37337b6 --- /dev/null +++ b/packages/multicast_dns/test/lookup_resolver_test.dart @@ -0,0 +1,97 @@ +// Copyright (c) 2015, the Dartino project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +import 'dart:io'; + +import 'package:test/test.dart'; +import 'package:multicast_dns/src/lookup_resolver.dart'; +import 'package:multicast_dns/src/resource_record.dart'; + +void main() { + testTimeout(); + testResult(); + testResult2(); + testResult3(); +} + +ResourceRecord ip4Result(String name, InternetAddress address) { + final int validUntil = DateTime.now().millisecondsSinceEpoch + 2000; + return IPAddressResourceRecord(name, validUntil, address: address); +} + +void testTimeout() { + test('Resolver does not return with short timeout', () async { + final Duration shortTimeout = Duration(milliseconds: 1); + final LookupResolver resolver = LookupResolver(); + final Stream result = + resolver.addPendingRequest(RRType.a, 'xxx', shortTimeout); + expect(await result.isEmpty, isTrue); + }); +} + +// One pending request and one response. +void testResult() { + test('One pending request and one response', () async { + final Duration noTimeout = Duration(days: 1); + final LookupResolver resolver = LookupResolver(); + final Stream futureResult = + resolver.addPendingRequest(RRType.a, 'xxx', noTimeout); + final ResourceRecord response = + ip4Result('xxx', InternetAddress('1.2.3.4')); + resolver.handleResponse([response]); + final IPAddressResourceRecord result = await futureResult.first; + expect('1.2.3.4', result.address.address); + resolver.clearPendingRequests(); + }); +} + +void testResult2() { + test('Two requests', () async { + final Duration noTimeout = Duration(days: 1); + final LookupResolver resolver = LookupResolver(); + final Stream futureResult1 = + resolver.addPendingRequest(RRType.a, 'xxx', noTimeout); + final Stream futureResult2 = + resolver.addPendingRequest(RRType.a, 'yyy', noTimeout); + final ResourceRecord response1 = + ip4Result('xxx', InternetAddress('1.2.3.4')); + final ResourceRecord response2 = + ip4Result('yyy', InternetAddress('2.3.4.5')); + resolver.handleResponse([response2, response1]); + final IPAddressResourceRecord result1 = await futureResult1.first; + final IPAddressResourceRecord result2 = await futureResult2.first; + expect('1.2.3.4', result1.address.address); + expect('2.3.4.5', result2.address.address); + resolver.clearPendingRequests(); + }); +} + +void testResult3() { + test('Multiple requests', () async { + final Duration noTimeout = Duration(days: 1); + final LookupResolver resolver = LookupResolver(); + final ResourceRecord response0 = + ip4Result('zzz', InternetAddress('2.3.4.5')); + resolver.handleResponse([response0]); + final Stream futureResult1 = + resolver.addPendingRequest(RRType.a, 'xxx', noTimeout); + resolver.handleResponse([response0]); + final Stream futureResult2 = + resolver.addPendingRequest(RRType.a, 'yyy', noTimeout); + resolver.handleResponse([response0]); + final ResourceRecord response1 = + ip4Result('xxx', InternetAddress('1.2.3.4')); + resolver.handleResponse([response0]); + final ResourceRecord response2 = + ip4Result('yyy', InternetAddress('2.3.4.5')); + resolver.handleResponse([response0]); + resolver.handleResponse([response2, response1]); + resolver.handleResponse([response0]); + final IPAddressResourceRecord result1 = await futureResult1.first; + final IPAddressResourceRecord result2 = await futureResult2.first; + expect('1.2.3.4', result1.address.address); + expect('2.3.4.5', result2.address.address); + resolver.clearPendingRequests(); + }); +} diff --git a/packages/multicast_dns/test/resource_record_cache.dart b/packages/multicast_dns/test/resource_record_cache.dart new file mode 100644 index 0000000..104590e --- /dev/null +++ b/packages/multicast_dns/test/resource_record_cache.dart @@ -0,0 +1,94 @@ +// Copyright (c) 2015, the Dartino project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +// Test that the resource record cache works correctly. In particular, make +// sure that it removes all entries for a name before insertingrecords +// of that name. + +import 'dart:io'; + +import 'package:test/test.dart'; +import 'package:multicast_dns/src/resource_record.dart'; +import 'package:multicast_dns/src/native_protocol_client.dart' + show ResourceRecordCache; + +int entries(ResourceRecordCache cache) { + int c = 0; + for (int i = 0; i < cache.size; i++) { + if (cache.buffer[i] != null) { + ++c; + } + } + return c; +} + +void main() { + testOverwrite(); + testTimeout(); +} + +void testOverwrite() { + test('Cache can overwrite entries', () { + final InternetAddress ip1 = InternetAddress('192.168.1.1'); + final InternetAddress ip2 = InternetAddress('192.168.1.2'); + final int valid = DateTime.now().millisecondsSinceEpoch + 86400 * 1000; + + final ResourceRecordCache cache = ResourceRecordCache(); + + // Add two different records. + cache.updateRecords([ + IPAddressResourceRecord('hest', valid, address: ip1), + IPAddressResourceRecord('fisk', valid, address: ip2) + ]); + expect(entries(cache), 2); + + // Update these records. + cache.updateRecords([ + IPAddressResourceRecord('hest', valid, address: ip1), + IPAddressResourceRecord('fisk', valid, address: ip2) + ]); + expect(entries(cache), 2); + + // Add two records with the same name (should remove the old one + // with that name only.) + cache.updateRecords([ + IPAddressResourceRecord('hest', valid, address: ip1), + IPAddressResourceRecord('hest', valid, address: ip2) + ]); + expect(entries(cache), 3); + + // Overwrite the two cached entries with one with the same name. + cache.updateRecords([ + IPAddressResourceRecord('hest', valid, address: ip1), + ]); + expect(entries(cache), 2); + }); +} + +void testTimeout() { + test('Cache can evict records after timeout', () { + final InternetAddress ip1 = InternetAddress('192.168.1.1'); + final int valid = DateTime.now().millisecondsSinceEpoch + 86400 * 1000; + final int notValid = DateTime.now().millisecondsSinceEpoch - 1; + + final ResourceRecordCache cache = ResourceRecordCache(); + + cache.updateRecords( + [IPAddressResourceRecord('hest', valid, address: ip1)]); + expect(entries(cache), 1); + + cache.updateRecords([ + IPAddressResourceRecord('fisk', notValid, address: ip1) + ]); + + List results = []; + cache.lookup('hest', RRType.a, results); + expect(results.isEmpty, isFalse); + + results = []; + cache.lookup('fisk', RRType.a, results); + expect(results.isEmpty, isTrue); + expect(entries(cache), 1); + }); +} From 6ef8c6e2eddf298bb7fd6de44a075b0062a2cab6 Mon Sep 17 00:00:00 2001 From: Dan Field Date: Thu, 18 Oct 2018 13:50:41 -0700 Subject: [PATCH 002/118] move helper methods to tool/ --- .../{example => bin}/mdns-resolve.dart | 5 ++ .../{example => bin}/mdns-sd.dart | 40 +++++++++---- packages/multicast_dns/lib/mdns_client.dart | 56 ++++++++++++++----- packages/multicast_dns/lib/src/constants.dart | 5 +- .../lib/src/lookup_resolver.dart | 14 ++++- packages/multicast_dns/lib/src/packet.dart | 35 +++++++++--- .../lib/src/resource_record.dart | 6 +- packages/multicast_dns/test/decode_test.dart | 46 --------------- packages/multicast_dns/tool/packet_gen.dart | 45 +++++++++++++++ 9 files changed, 168 insertions(+), 84 deletions(-) rename packages/multicast_dns/{example => bin}/mdns-resolve.dart (88%) rename packages/multicast_dns/{example => bin}/mdns-sd.dart (52%) create mode 100644 packages/multicast_dns/tool/packet_gen.dart diff --git a/packages/multicast_dns/example/mdns-resolve.dart b/packages/multicast_dns/bin/mdns-resolve.dart similarity index 88% rename from packages/multicast_dns/example/mdns-resolve.dart rename to packages/multicast_dns/bin/mdns-resolve.dart index 018a227..543504e 100644 --- a/packages/multicast_dns/example/mdns-resolve.dart +++ b/packages/multicast_dns/bin/mdns-resolve.dart @@ -33,5 +33,10 @@ For example: in client.lookup(RRType.a, name, timeout: timeout)) { print('Found address (${record.address}).'); } + + await for (IPAddressResourceRecord record + in client.lookup(RRType.aaaa, name, timeout: timeout)) { + print('Found address (${record.address}).'); + } client.stop(); } diff --git a/packages/multicast_dns/example/mdns-sd.dart b/packages/multicast_dns/bin/mdns-sd.dart similarity index 52% rename from packages/multicast_dns/example/mdns-sd.dart rename to packages/multicast_dns/bin/mdns-sd.dart index bd26284..807d15c 100644 --- a/packages/multicast_dns/example/mdns-sd.dart +++ b/packages/multicast_dns/bin/mdns-sd.dart @@ -13,6 +13,7 @@ void main(List args) async { // Parse the command line arguments. final ArgParser parser = ArgParser(); parser.addOption('timeout', abbr: 't', defaultsTo: '5'); + parser.addFlag('verbose', abbr: 'v', defaultsTo: false); final ArgResults arguments = parser.parse(args); if (arguments.rest.length != 1) { @@ -20,25 +21,42 @@ void main(List args) async { Please provide the name of a service as argument. For example: - dart mdns-sd.dart [--timeout ] _workstation._tcp.local'''); + dart mdns-sd.dart [--timeout ] [--verbose] _workstation._tcp.local'''); return; } + final bool verbose = arguments['verbose']; final String name = arguments.rest[0]; - final MDnsClient client = MDnsClient(); await client.start(); + await for (PtrResourceRecord ptr in client.lookup(RRType.ptr, name)) { - final String domain = ptr.domainName; - print(ptr); - await for (SrvResourceRecord srv in client.lookup(RRType.srv, domain)) { - final String target = srv.target; - print(srv); - await client.lookup(RRType.txt, domain).forEach(print); + if (verbose) { + print(ptr); + } + await for (SrvResourceRecord srv + in client.lookup(RRType.srv, ptr.domainName)) { + if (verbose) { + print(srv); + } + if (verbose) { + await client.lookup(RRType.txt, ptr.domainName).forEach(print); + } + await for (IPAddressResourceRecord ip + in client.lookup(RRType.a, srv.target)) { + if (verbose) { + print(ip); + } + print( + 'Service instance found at ${srv.target}:${srv.port} with ${ip.address}.'); + } await for (IPAddressResourceRecord ip - in client.lookup(RRType.a, target)) { - print(ip); - print('Service instance found at $target (${ip.address}).'); + in client.lookup(RRType.aaaa, srv.target)) { + if (verbose) { + print(ip); + } + print( + 'Service instance found at ${srv.target}:${srv.port} with ${ip.address}.'); } } } diff --git a/packages/multicast_dns/lib/mdns_client.dart b/packages/multicast_dns/lib/mdns_client.dart index 72daec0..b15d197 100644 --- a/packages/multicast_dns/lib/mdns_client.dart +++ b/packages/multicast_dns/lib/mdns_client.dart @@ -14,6 +14,9 @@ import 'package:multicast_dns/src/resource_record.dart'; export 'package:multicast_dns/src/resource_record.dart'; +typedef NetworkInterfacesFactory = Future> Function( + InternetAddressType type); + /// Client for DNS lookup using the mDNS protocol. /// /// This client only support "One-Shot Multicast DNS Queries" as described in @@ -25,11 +28,34 @@ class MDnsClient { final List _sockets = []; final LookupResolver _resolver = LookupResolver(); final ResourceRecordCache _cache = ResourceRecordCache(); + InternetAddress _mDnsAddress; + + /// Find all network interfaces with an IPv4 address. + static NetworkInterfacesFactory allInterfacesFactory = + (InternetAddressType type) => NetworkInterface.list( + includeLinkLocal: true, + type: type, + includeLoopback: true, + ); /// Start the mDNS client. - Future start() async { - if (_started && _starting) { - throw StateError('mDNS client already started'); + /// + /// The [listenAddress] parameter must be either [InternetAddress.anyIPv4] or + /// [InternetAddress.anyIPv6], and will default to anyIPv4. + /// + /// The [interfaceFactory] defaults to [allInterfacesFactory]. + Future start({ + InternetAddress listenAddress, + NetworkInterfacesFactory interfaceFactory, + }) async { + listenAddress ??= InternetAddress.anyIPv4; + interfaceFactory ??= allInterfacesFactory; + + assert(listenAddress.address == InternetAddress.anyIPv4.address || + listenAddress.address == InternetAddress.anyIPv6.address); + + if (_started || _starting) { + return; } _starting = true; @@ -41,15 +67,16 @@ class MDnsClient { reusePort: true, ttl: 255, ); - // Find all network interfaces with an IPv4 address. - final List interfaces = await NetworkInterface.list( - includeLinkLocal: true, - type: InternetAddressType.IPv4, - includeLoopback: true, - ); _sockets.add(_incoming); + _mDnsAddress = _incoming.address.type == InternetAddressType.IPv4 + ? mDnsAddressIPv4 + : mDnsAddressIPv6; + + final List interfaces = + await interfaceFactory(listenAddress.type); + for (NetworkInterface interface in interfaces) { // Create a socket for sending on each adapter. final RawDatagramSocket socket = await RawDatagramSocket.bind( @@ -62,12 +89,12 @@ class MDnsClient { _sockets.add(socket); // Join multicast on this interface. - _incoming.joinMulticast(mDnsAddress, interface); + _incoming.joinMulticast(_mDnsAddress, interface); } _incoming.listen(_handleIncoming); - _starting = false; _started = true; + _starting = false; } /// Stop the client and close any associated sockets. @@ -76,7 +103,7 @@ class MDnsClient { return; } if (_starting) { - throw StateError('Cannot stop mDNS client wile it is starting'); + throw StateError('Cannot stop mDNS client while it is starting.'); } for (RawDatagramSocket socket in _sockets) { @@ -92,7 +119,7 @@ class MDnsClient { Stream lookup(int type, String name, {Duration timeout = const Duration(seconds: 5)}) { if (!_started) { - throw StateError('mDNS client is not started'); + throw StateError('mDNS client is not started.'); } // Look for entries in the cache. final List cached = []; @@ -112,7 +139,7 @@ class MDnsClient { // Send the request on all interfaces. final List packet = encodeMDnsQuery(name, type: type); for (RawDatagramSocket socket in _sockets) { - socket.send(packet, mDnsAddress, mDnsPort); + socket.send(packet, _mDnsAddress, mDnsPort); } return results; } @@ -121,7 +148,6 @@ class MDnsClient { void _handleIncoming(RawSocketEvent event) { if (event == RawSocketEvent.read) { final Datagram datagram = _incoming.receive(); - final List response = decodeMDnsResponse(datagram.data); if (response != null) { _cache.updateRecords(response); diff --git a/packages/multicast_dns/lib/src/constants.dart b/packages/multicast_dns/lib/src/constants.dart index 306159a..dfd223e 100644 --- a/packages/multicast_dns/lib/src/constants.dart +++ b/packages/multicast_dns/lib/src/constants.dart @@ -5,7 +5,10 @@ import 'dart:io'; /// The IPv4 mDNS Address. -InternetAddress mDnsAddress = InternetAddress('224.0.0.251'); +InternetAddress mDnsAddressIPv4 = InternetAddress('224.0.0.251'); + +/// The IPv6 mDNS Address. +InternetAddress mDnsAddressIPv6 = InternetAddress('FF02::FB'); /// The mDNS port. const int mDnsPort = 5353; diff --git a/packages/multicast_dns/lib/src/lookup_resolver.dart b/packages/multicast_dns/lib/src/lookup_resolver.dart index e0ad316..20cc791 100644 --- a/packages/multicast_dns/lib/src/lookup_resolver.dart +++ b/packages/multicast_dns/lib/src/lookup_resolver.dart @@ -57,7 +57,19 @@ class LookupResolver { } bool responseMatches(PendingRequest request) { - return request.name.toLowerCase() == name && request.type == type; + String requestName = request.name.toLowerCase(); + // make, e.g. "_http" become "_http._tcp.local". + if (!requestName.endsWith('local')) { + if (!requestName.endsWith('._tcp.local') && + !requestName.endsWith('._udp.local') && + !requestName.endsWith('._tcp') && + !requestName.endsWith('.udp')) { + requestName += '._tcp'; + } + requestName += '.local'; + } + return requestName == name && + (request.type == type || request.type == RRType.any); } for (PendingRequest pendingRequest in pendingRequests) { diff --git a/packages/multicast_dns/lib/src/packet.dart b/packages/multicast_dns/lib/src/packet.dart index fdb65f3..119fbed 100644 --- a/packages/multicast_dns/lib/src/packet.dart +++ b/packages/multicast_dns/lib/src/packet.dart @@ -18,6 +18,22 @@ const int _kNscountOffset = 8; const int _kArcountOffset = 10; const int _kHeaderSize = 12; +/// Processes a DNS query name into a list of parts. +/// +/// Will attempt to append 'local' if name is something like '_http._tcp', and +/// '._tcp.local' if name is something like '_http'. +List processDnsNameParts(String name) { + assert(name != null); + final List parts = name.split('.'); + if (parts.length == 1) { + return [parts[0], '_tcp', 'local']; + } else if (parts.length == 2 && parts[1].startsWith('_')) { + return [parts[0], parts[1], 'local']; + } + + return parts; +} + /// Encode an mDNS query packet. /// /// The [type] parameter must be a valid [RRType] value. The [multicast] parameter @@ -27,16 +43,18 @@ List encodeMDnsQuery( int type = RRType.a, bool multicast = true, }) { + assert(name != null); RRType.debugAssertValid(type); assert(multicast != null); - final List> parts = - name.split('.').map((String part) => utf8.encode(part)).toList(); + final List nameParts = processDnsNameParts(name); + final List> rawNameParts = + nameParts.map((String part) => utf8.encode(part)).toList(); // Calculate the size of the packet. int size = _kHeaderSize; - for (int i = 0; i < parts.length; i++) { - size += 1 + parts[i].length; + for (int i = 0; i < rawNameParts.length; i++) { + size += 1 + rawNameParts[i].length; } size += 1; // End with empty part @@ -56,10 +74,10 @@ List encodeMDnsQuery( // Number of resource records - 0 for query. bd.setUint16(_kArcountOffset, 0); int offset = _kHeaderSize; - for (int i = 0; i < parts.length; i++) { - data[offset++] = parts[i].length; - data.setRange(offset, offset + parts[i].length, parts[i]); - offset += parts[i].length; + for (int i = 0; i < rawNameParts.length; i++) { + data[offset++] = rawNameParts[i].length; + data.setRange(offset, offset + rawNameParts[i].length, rawNameParts[i]); + offset += rawNameParts[i].length; } data[offset] = 0; // Empty part. @@ -170,7 +188,6 @@ List decodeMDnsResponse(List packet) { // Number of resource records. final int arcount = bd.getUint16(_kArcountOffset); - int offset = _kHeaderSize; void checkLength(int required) { diff --git a/packages/multicast_dns/lib/src/resource_record.dart b/packages/multicast_dns/lib/src/resource_record.dart index 8102454..48533d5 100644 --- a/packages/multicast_dns/lib/src/resource_record.dart +++ b/packages/multicast_dns/lib/src/resource_record.dart @@ -23,13 +23,17 @@ class RRType { /// A text record (16). static const int txt = 16; + /// A query for all records of all types known to the name server. + static const int any = 255; + /// Asserts that a given int is a valid RRType. static void debugAssertValid(int rrType) { assert(rrType == a || rrType == aaaa || rrType == ptr || rrType == srv || - rrType == txt); + rrType == txt || + rrType == any); } } diff --git a/packages/multicast_dns/test/decode_test.dart b/packages/multicast_dns/test/decode_test.dart index 52ad987..a396a6f 100644 --- a/packages/multicast_dns/test/decode_test.dart +++ b/packages/multicast_dns/test/decode_test.dart @@ -831,49 +831,3 @@ const List srvRData = [ 0x6c, 0x00 ]; - -// Support code to generate the hex-lists above from -// a hex-stream. -void formatHexStream(String hexStream) { - String s = ''; - for (int i = 0; i < hexStream.length / 2; i++) { - if (s.isNotEmpty) { - s += ', '; - } - s += '0x'; - final String x = hexStream.substring(i * 2, i * 2 + 2); - s += x; - if (((i + 1) % 8) == 0) { - s += ','; - print(s); - s = ''; - } - } - if (s.isNotEmpty) { - print(s); - } -} - -// Support code for generating the hex-lists above. -void hexDumpList(List package) { - String s = ''; - for (int i = 0; i < package.length; i++) { - if (s.isNotEmpty) { - s += ', '; - } - s += '0x'; - final String x = package[i].toRadixString(16); - if (x.length == 1) { - s += '0'; - } - s += x; - if (((i + 1) % 8) == 0) { - s += ','; - print(s); - s = ''; - } - } - if (s.isNotEmpty) { - print(s); - } -} diff --git a/packages/multicast_dns/tool/packet_gen.dart b/packages/multicast_dns/tool/packet_gen.dart new file mode 100644 index 0000000..7d9a82a --- /dev/null +++ b/packages/multicast_dns/tool/packet_gen.dart @@ -0,0 +1,45 @@ +// Support code to generate the hex-lists in test/decode_test.dart from +// a hex-stream. +void formatHexStream(String hexStream) { + String s = ''; + for (int i = 0; i < hexStream.length / 2; i++) { + if (s.isNotEmpty) { + s += ', '; + } + s += '0x'; + final String x = hexStream.substring(i * 2, i * 2 + 2); + s += x; + if (((i + 1) % 8) == 0) { + s += ','; + print(s); + s = ''; + } + } + if (s.isNotEmpty) { + print(s); + } +} + +// Support code for generating the hex-lists in test/decode_test.dart. +void hexDumpList(List package) { + String s = ''; + for (int i = 0; i < package.length; i++) { + if (s.isNotEmpty) { + s += ', '; + } + s += '0x'; + final String x = package[i].toRadixString(16); + if (x.length == 1) { + s += '0'; + } + s += x; + if (((i + 1) % 8) == 0) { + s += ','; + print(s); + s = ''; + } + } + if (s.isNotEmpty) { + print(s); + } +} From abc4b4b02dfcb234d9e9be084e7cc5fce5d0ea23 Mon Sep 17 00:00:00 2001 From: Dan Field Date: Thu, 18 Oct 2018 14:01:06 -0700 Subject: [PATCH 003/118] update docs, add example --- packages/multicast_dns/example/main.dart | 32 +++++++++++++++++++++ packages/multicast_dns/lib/mdns_client.dart | 14 ++++++++- packages/multicast_dns/tool/packet_gen.dart | 4 +++ 3 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 packages/multicast_dns/example/main.dart diff --git a/packages/multicast_dns/example/main.dart b/packages/multicast_dns/example/main.dart new file mode 100644 index 0000000..a7f96fc --- /dev/null +++ b/packages/multicast_dns/example/main.dart @@ -0,0 +1,32 @@ +// Copyright 2018, the Flutter project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +// Example script to illustrate how to use the mdns package to discover the port +// of a Dart observatory over mDNS. + +import 'package:multicast_dns/mdns_client.dart'; + +void main() async { + // Parse the command line arguments. + + const String name = '_dartobservatory._tcp.local'; + final MDnsClient client = MDnsClient(); + // Start the client with default options. + await client.start(); + + // Get the PTR recod for the service. + await for (PtrResourceRecord ptr in client.lookup(RRType.ptr, name)) { + // Use the domainName from the PTR record to get the SRV record, + // which will have the port and local hostname. + // Note that duplicate messages may come through, especially if any + // other mDNS queries are running elsewhere on the machine. + await for (SrvResourceRecord srv + in client.lookup(RRType.srv, ptr.domainName)) { + print('Dart obvservatory instance found at ${srv.target}:${srv.port}.'); + } + } + client.stop(); + + print('Done.'); +} diff --git a/packages/multicast_dns/lib/mdns_client.dart b/packages/multicast_dns/lib/mdns_client.dart index b15d197..3a71931 100644 --- a/packages/multicast_dns/lib/mdns_client.dart +++ b/packages/multicast_dns/lib/mdns_client.dart @@ -14,11 +14,20 @@ import 'package:multicast_dns/src/resource_record.dart'; export 'package:multicast_dns/src/resource_record.dart'; +/// A callback type for [MDnsClient.start] to iterate available network interfaces. +/// +/// Impelmentations must ensure they return interfaces appropriate for the [type] parameter. +/// +/// See also: +/// * [MDnsClient.allInterfacesFactory] typedef NetworkInterfacesFactory = Future> Function( InternetAddressType type); /// Client for DNS lookup using the mDNS protocol. /// +/// Users should call [MDnsClient.start] when ready to start querying and listening. +/// [MDnsClient.stop] must be called when done to clean up resources. +/// /// This client only support "One-Shot Multicast DNS Queries" as described in /// section 5.1 of https://tools.ietf.org/html/rfc6762 class MDnsClient { @@ -30,7 +39,7 @@ class MDnsClient { final ResourceRecordCache _cache = ResourceRecordCache(); InternetAddress _mDnsAddress; - /// Find all network interfaces with an IPv4 address. + /// Find all network interfaces with an the [InternetAddressType] specified. static NetworkInterfacesFactory allInterfacesFactory = (InternetAddressType type) => NetworkInterface.list( includeLinkLocal: true, @@ -40,6 +49,9 @@ class MDnsClient { /// Start the mDNS client. /// + /// With no arguments, this method will listen on the IPv4 multicast address + /// on all IPv4 network interfaces. + /// /// The [listenAddress] parameter must be either [InternetAddress.anyIPv4] or /// [InternetAddress.anyIPv6], and will default to anyIPv4. /// diff --git a/packages/multicast_dns/tool/packet_gen.dart b/packages/multicast_dns/tool/packet_gen.dart index 7d9a82a..33dffc3 100644 --- a/packages/multicast_dns/tool/packet_gen.dart +++ b/packages/multicast_dns/tool/packet_gen.dart @@ -1,3 +1,7 @@ +// Copyright (c) 2015, the Dartino project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + // Support code to generate the hex-lists in test/decode_test.dart from // a hex-stream. void formatHexStream(String hexStream) { From 1cba2f31f985a5cb9c03b5b01bb7961941a04895 Mon Sep 17 00:00:00 2001 From: Dan Field Date: Thu, 18 Oct 2018 14:17:43 -0700 Subject: [PATCH 004/118] remove RRType.any - not ready --- packages/multicast_dns/lib/src/lookup_resolver.dart | 3 +-- packages/multicast_dns/lib/src/resource_record.dart | 8 ++++---- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/packages/multicast_dns/lib/src/lookup_resolver.dart b/packages/multicast_dns/lib/src/lookup_resolver.dart index 20cc791..6c557aa 100644 --- a/packages/multicast_dns/lib/src/lookup_resolver.dart +++ b/packages/multicast_dns/lib/src/lookup_resolver.dart @@ -68,8 +68,7 @@ class LookupResolver { } requestName += '.local'; } - return requestName == name && - (request.type == type || request.type == RRType.any); + return requestName == name && request.type == type; } for (PendingRequest pendingRequest in pendingRequests) { diff --git a/packages/multicast_dns/lib/src/resource_record.dart b/packages/multicast_dns/lib/src/resource_record.dart index 48533d5..405d397 100644 --- a/packages/multicast_dns/lib/src/resource_record.dart +++ b/packages/multicast_dns/lib/src/resource_record.dart @@ -23,8 +23,9 @@ class RRType { /// A text record (16). static const int txt = 16; - /// A query for all records of all types known to the name server. - static const int any = 255; + // TODO(dnfield): Can we support ANY in some meaningful way? + // /// A query for all records of all types known to the name server. + // static const int any = 255; /// Asserts that a given int is a valid RRType. static void debugAssertValid(int rrType) { @@ -32,8 +33,7 @@ class RRType { rrType == aaaa || rrType == ptr || rrType == srv || - rrType == txt || - rrType == any); + rrType == txt); } } From c2599f4f9a46866ceda58858312ad1b1f42f77c9 Mon Sep 17 00:00:00 2001 From: Dan Field Date: Thu, 18 Oct 2018 14:31:15 -0700 Subject: [PATCH 005/118] README --- packages/multicast_dns/README.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 packages/multicast_dns/README.md diff --git a/packages/multicast_dns/README.md b/packages/multicast_dns/README.md new file mode 100644 index 0000000..9f26279 --- /dev/null +++ b/packages/multicast_dns/README.md @@ -0,0 +1,21 @@ +# Palette Generator package + +[![pub package](https://img.shields.io/pub/v/multicast_dns.svg)]( +https://pub.dartlang.org/packages/multicast_dns) + +A Dart package to do service discovery over multicast DNS (mDNS), Bonjour, and Avahi. + +## Usage +To use this package, add `multicast_dns` as a +[dependency in your pubspec.yaml file](https://flutter.io/platform-plugins/). + +## Example + +Import the library via +``` dart +import 'package:multicast_dns/mdns_client.dart'; +``` + +Then use the `MDnsClient` Dart class in your code. To see how this is done, +check out the [example app](example/main.dart) or the sample implementations in +the [bin](bin/) directory. From 702e43fc2cf5b91c72855e0ad1e211fa0cb7547a Mon Sep 17 00:00:00 2001 From: Dan Field Date: Thu, 18 Oct 2018 14:41:03 -0700 Subject: [PATCH 006/118] remove lint ignore, update CI --- packages/multicast_dns/lib/mdns_client.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/multicast_dns/lib/mdns_client.dart b/packages/multicast_dns/lib/mdns_client.dart index 3a71931..9dbb338 100644 --- a/packages/multicast_dns/lib/mdns_client.dart +++ b/packages/multicast_dns/lib/mdns_client.dart @@ -1,4 +1,3 @@ -// ignore_for_file: undefined_named_parameter // Copyright (c) 2015, the Dartino project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. From e22242c42d93d984424268d004787e24e52f4938 Mon Sep 17 00:00:00 2001 From: Dan Field Date: Fri, 19 Oct 2018 11:00:15 -0700 Subject: [PATCH 007/118] Update docs, expose multicast parameter --- packages/multicast_dns/lib/mdns_client.dart | 29 ++++++++++++++++++--- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/packages/multicast_dns/lib/mdns_client.dart b/packages/multicast_dns/lib/mdns_client.dart index 9dbb338..d461a41 100644 --- a/packages/multicast_dns/lib/mdns_client.dart +++ b/packages/multicast_dns/lib/mdns_client.dart @@ -28,7 +28,7 @@ typedef NetworkInterfacesFactory = Future> Function( /// [MDnsClient.stop] must be called when done to clean up resources. /// /// This client only support "One-Shot Multicast DNS Queries" as described in -/// section 5.1 of https://tools.ietf.org/html/rfc6762 +/// section 5.1 of [RFC 6762](https://tools.ietf.org/html/rfc6762). class MDnsClient { bool _starting = false; bool _started = false; @@ -127,8 +127,25 @@ class MDnsClient { } /// Lookup a [ResourceRecord], potentially from cache. - Stream lookup(int type, String name, - {Duration timeout = const Duration(seconds: 5)}) { + /// + /// The [type] parameter must be a valid [RRType]. The [name] parameter is + /// the name of the service to lookup, and must not be null. The [timeout] + /// parameter specifies how long the intenral cache should hold on to the + /// record. The [multicast] parameter specifies whether the query should be + /// sent as unicast (QU) or multicast (QM). + /// + /// Note that some publishers have been observed to not respond to unicast + /// requests properly, so the default is true. + Stream lookup( + int type, + String name, { + Duration timeout = const Duration(seconds: 5), + bool multicast = true, + }) { + RRType.debugAssertValid(type); + assert(multicast != null); + assert(name != null); + if (!_started) { throw StateError('mDNS client is not started.'); } @@ -148,7 +165,11 @@ class MDnsClient { _resolver.addPendingRequest(type, name, timeout); // Send the request on all interfaces. - final List packet = encodeMDnsQuery(name, type: type); + final List packet = encodeMDnsQuery( + name, + type: type, + multicast: multicast, + ); for (RawDatagramSocket socket in _sockets) { socket.send(packet, _mDnsAddress, mDnsPort); } From a6b60649f5d30fd0ae967de04e7f89114e39d30c Mon Sep 17 00:00:00 2001 From: Dan Field Date: Fri, 19 Oct 2018 11:28:14 -0700 Subject: [PATCH 008/118] fix tests, run analyze first --- .../test/lookup_resolver_test.dart | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/packages/multicast_dns/test/lookup_resolver_test.dart b/packages/multicast_dns/test/lookup_resolver_test.dart index 37337b6..4e83e2b 100644 --- a/packages/multicast_dns/test/lookup_resolver_test.dart +++ b/packages/multicast_dns/test/lookup_resolver_test.dart @@ -36,9 +36,9 @@ void testResult() { final Duration noTimeout = Duration(days: 1); final LookupResolver resolver = LookupResolver(); final Stream futureResult = - resolver.addPendingRequest(RRType.a, 'xxx', noTimeout); + resolver.addPendingRequest(RRType.a, 'xxx.local', noTimeout); final ResourceRecord response = - ip4Result('xxx', InternetAddress('1.2.3.4')); + ip4Result('xxx.local', InternetAddress('1.2.3.4')); resolver.handleResponse([response]); final IPAddressResourceRecord result = await futureResult.first; expect('1.2.3.4', result.address.address); @@ -51,13 +51,13 @@ void testResult2() { final Duration noTimeout = Duration(days: 1); final LookupResolver resolver = LookupResolver(); final Stream futureResult1 = - resolver.addPendingRequest(RRType.a, 'xxx', noTimeout); + resolver.addPendingRequest(RRType.a, 'xxx.local', noTimeout); final Stream futureResult2 = - resolver.addPendingRequest(RRType.a, 'yyy', noTimeout); + resolver.addPendingRequest(RRType.a, 'yyy.local', noTimeout); final ResourceRecord response1 = - ip4Result('xxx', InternetAddress('1.2.3.4')); + ip4Result('xxx.local', InternetAddress('1.2.3.4')); final ResourceRecord response2 = - ip4Result('yyy', InternetAddress('2.3.4.5')); + ip4Result('yyy.local', InternetAddress('2.3.4.5')); resolver.handleResponse([response2, response1]); final IPAddressResourceRecord result1 = await futureResult1.first; final IPAddressResourceRecord result2 = await futureResult2.first; @@ -72,19 +72,19 @@ void testResult3() { final Duration noTimeout = Duration(days: 1); final LookupResolver resolver = LookupResolver(); final ResourceRecord response0 = - ip4Result('zzz', InternetAddress('2.3.4.5')); + ip4Result('zzz.local', InternetAddress('2.3.4.5')); resolver.handleResponse([response0]); final Stream futureResult1 = - resolver.addPendingRequest(RRType.a, 'xxx', noTimeout); + resolver.addPendingRequest(RRType.a, 'xxx.local', noTimeout); resolver.handleResponse([response0]); final Stream futureResult2 = - resolver.addPendingRequest(RRType.a, 'yyy', noTimeout); + resolver.addPendingRequest(RRType.a, 'yyy.local', noTimeout); resolver.handleResponse([response0]); final ResourceRecord response1 = - ip4Result('xxx', InternetAddress('1.2.3.4')); + ip4Result('xxx.local', InternetAddress('1.2.3.4')); resolver.handleResponse([response0]); final ResourceRecord response2 = - ip4Result('yyy', InternetAddress('2.3.4.5')); + ip4Result('yyy.local', InternetAddress('2.3.4.5')); resolver.handleResponse([response0]); resolver.handleResponse([response2, response1]); resolver.handleResponse([response0]); From d18c6961a1206726b20c12860aa7cfa2fab9d4db Mon Sep 17 00:00:00 2001 From: Dan Field Date: Fri, 19 Oct 2018 16:15:30 -0700 Subject: [PATCH 009/118] Fix readme for mDNS --- packages/multicast_dns/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/multicast_dns/README.md b/packages/multicast_dns/README.md index 9f26279..17dc254 100644 --- a/packages/multicast_dns/README.md +++ b/packages/multicast_dns/README.md @@ -1,4 +1,4 @@ -# Palette Generator package +# Multicast DNS package [![pub package](https://img.shields.io/pub/v/multicast_dns.svg)]( https://pub.dartlang.org/packages/multicast_dns) From 8e43aa0456c0f38a45056013e13db601f7958a6d Mon Sep 17 00:00:00 2001 From: Dan Field Date: Fri, 19 Oct 2018 21:33:07 -0700 Subject: [PATCH 010/118] move bin to example, remove args from main pubspec --- .../{bin => example}/mdns-resolve.dart | 0 .../multicast_dns/{bin => example}/mdns-sd.dart | 0 packages/multicast_dns/example/pubspec.yaml | 14 ++++++++++++++ packages/multicast_dns/pubspec.yaml | 3 +-- 4 files changed, 15 insertions(+), 2 deletions(-) rename packages/multicast_dns/{bin => example}/mdns-resolve.dart (100%) rename packages/multicast_dns/{bin => example}/mdns-sd.dart (100%) create mode 100644 packages/multicast_dns/example/pubspec.yaml diff --git a/packages/multicast_dns/bin/mdns-resolve.dart b/packages/multicast_dns/example/mdns-resolve.dart similarity index 100% rename from packages/multicast_dns/bin/mdns-resolve.dart rename to packages/multicast_dns/example/mdns-resolve.dart diff --git a/packages/multicast_dns/bin/mdns-sd.dart b/packages/multicast_dns/example/mdns-sd.dart similarity index 100% rename from packages/multicast_dns/bin/mdns-sd.dart rename to packages/multicast_dns/example/mdns-sd.dart diff --git a/packages/multicast_dns/example/pubspec.yaml b/packages/multicast_dns/example/pubspec.yaml new file mode 100644 index 0000000..eb3e92a --- /dev/null +++ b/packages/multicast_dns/example/pubspec.yaml @@ -0,0 +1,14 @@ +name: multicast_dns_examples +description: Example package for mDNS queries (e.g. Bonjour, Avahi). +author: Flutter Team +homepage: https://github.com/flutter/packages/tree/master/packages/mdns +publish_to: none + +dependencies: + args: ^1.5.0 + multicast_dns: + path: ../ + +environment: + sdk: ">=2.1.0-dev.7.1 <3.0.0" + diff --git a/packages/multicast_dns/pubspec.yaml b/packages/multicast_dns/pubspec.yaml index 2fb256a..15c51e3 100644 --- a/packages/multicast_dns/pubspec.yaml +++ b/packages/multicast_dns/pubspec.yaml @@ -5,12 +5,11 @@ homepage: https://github.com/flutter/packages/tree/master/packages/mdns version: 0.1.0 dependencies: - args: ^1.5.0 collection: ^1.14.11 meta: ^1.1.6 dev_dependencies: - test: any + test: "^1.3.4" environment: sdk: ">=2.1.0-dev.7.1 <3.0.0" From beff87a67ffc4e2e5af2811a36b382c261dbd092 Mon Sep 17 00:00:00 2001 From: Dan Field Date: Sat, 20 Oct 2018 09:33:33 -0700 Subject: [PATCH 011/118] Update example --- packages/multicast_dns/example/main.dart | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/multicast_dns/example/main.dart b/packages/multicast_dns/example/main.dart index a7f96fc..f0db24e 100644 --- a/packages/multicast_dns/example/main.dart +++ b/packages/multicast_dns/example/main.dart @@ -23,7 +23,11 @@ void main() async { // other mDNS queries are running elsewhere on the machine. await for (SrvResourceRecord srv in client.lookup(RRType.srv, ptr.domainName)) { - print('Dart obvservatory instance found at ${srv.target}:${srv.port}.'); + // Domain name will be something like "io.flutter.example@some-iphone.local._dartobservatory._tcp.local" + final String bundleId = + ptr.domainName.substring(0, ptr.domainName.indexOf('@')); + print( + 'Dart obvservatory instance found at ${srv.target}:${srv.port} for "$bundleId".'); } } client.stop(); From cc32e81e22d19cf96bb0d389f626bc5c127827d6 Mon Sep 17 00:00:00 2001 From: Dan Field Date: Sat, 20 Oct 2018 11:14:36 -0700 Subject: [PATCH 012/118] Remove collection dep --- packages/multicast_dns/pubspec.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/multicast_dns/pubspec.yaml b/packages/multicast_dns/pubspec.yaml index 15c51e3..a0a5fbb 100644 --- a/packages/multicast_dns/pubspec.yaml +++ b/packages/multicast_dns/pubspec.yaml @@ -5,7 +5,6 @@ homepage: https://github.com/flutter/packages/tree/master/packages/mdns version: 0.1.0 dependencies: - collection: ^1.14.11 meta: ^1.1.6 dev_dependencies: From 19dcf1dc34dc7c235be86a14ebfdfd7e04c3a362 Mon Sep 17 00:00:00 2001 From: Dan Field Date: Mon, 22 Oct 2018 10:33:23 -0700 Subject: [PATCH 013/118] Fix unintentional change to Palette, avoid abbreviations, real hash code impl --- packages/multicast_dns/example/main.dart | 4 +- .../multicast_dns/example/mdns-resolve.dart | 4 +- packages/multicast_dns/example/mdns-sd.dart | 10 +- packages/multicast_dns/lib/mdns_client.dart | 4 +- packages/multicast_dns/lib/src/constants.dart | 10 +- .../lib/src/lookup_resolver.dart | 2 +- .../lib/src/native_protocol_client.dart | 2 +- packages/multicast_dns/lib/src/packet.dart | 57 ++++++------ .../lib/src/resource_record.dart | 93 +++++++++++++++---- .../test/lookup_resolver_test.dart | 12 +-- .../test/resource_record_cache.dart | 4 +- 11 files changed, 134 insertions(+), 68 deletions(-) diff --git a/packages/multicast_dns/example/main.dart b/packages/multicast_dns/example/main.dart index f0db24e..e421811 100644 --- a/packages/multicast_dns/example/main.dart +++ b/packages/multicast_dns/example/main.dart @@ -16,13 +16,13 @@ void main() async { await client.start(); // Get the PTR recod for the service. - await for (PtrResourceRecord ptr in client.lookup(RRType.ptr, name)) { + await for (PtrResourceRecord ptr in client.lookup(ResourceRecordType.ptr, name)) { // Use the domainName from the PTR record to get the SRV record, // which will have the port and local hostname. // Note that duplicate messages may come through, especially if any // other mDNS queries are running elsewhere on the machine. await for (SrvResourceRecord srv - in client.lookup(RRType.srv, ptr.domainName)) { + in client.lookup(ResourceRecordType.srv, ptr.domainName)) { // Domain name will be something like "io.flutter.example@some-iphone.local._dartobservatory._tcp.local" final String bundleId = ptr.domainName.substring(0, ptr.domainName.indexOf('@')); diff --git a/packages/multicast_dns/example/mdns-resolve.dart b/packages/multicast_dns/example/mdns-resolve.dart index 543504e..15c9449 100644 --- a/packages/multicast_dns/example/mdns-resolve.dart +++ b/packages/multicast_dns/example/mdns-resolve.dart @@ -30,12 +30,12 @@ For example: await client.start(); final Duration timeout = Duration(seconds: int.parse(arguments['timeout'])); await for (IPAddressResourceRecord record - in client.lookup(RRType.a, name, timeout: timeout)) { + in client.lookup(ResourceRecordType.a, name, timeout: timeout)) { print('Found address (${record.address}).'); } await for (IPAddressResourceRecord record - in client.lookup(RRType.aaaa, name, timeout: timeout)) { + in client.lookup(ResourceRecordType.aaaa, name, timeout: timeout)) { print('Found address (${record.address}).'); } client.stop(); diff --git a/packages/multicast_dns/example/mdns-sd.dart b/packages/multicast_dns/example/mdns-sd.dart index 807d15c..c944604 100644 --- a/packages/multicast_dns/example/mdns-sd.dart +++ b/packages/multicast_dns/example/mdns-sd.dart @@ -30,20 +30,20 @@ For example: final MDnsClient client = MDnsClient(); await client.start(); - await for (PtrResourceRecord ptr in client.lookup(RRType.ptr, name)) { + await for (PtrResourceRecord ptr in client.lookup(ResourceRecordType.ptr, name)) { if (verbose) { print(ptr); } await for (SrvResourceRecord srv - in client.lookup(RRType.srv, ptr.domainName)) { + in client.lookup(ResourceRecordType.srv, ptr.domainName)) { if (verbose) { print(srv); } if (verbose) { - await client.lookup(RRType.txt, ptr.domainName).forEach(print); + await client.lookup(ResourceRecordType.txt, ptr.domainName).forEach(print); } await for (IPAddressResourceRecord ip - in client.lookup(RRType.a, srv.target)) { + in client.lookup(ResourceRecordType.a, srv.target)) { if (verbose) { print(ip); } @@ -51,7 +51,7 @@ For example: 'Service instance found at ${srv.target}:${srv.port} with ${ip.address}.'); } await for (IPAddressResourceRecord ip - in client.lookup(RRType.aaaa, srv.target)) { + in client.lookup(ResourceRecordType.aaaa, srv.target)) { if (verbose) { print(ip); } diff --git a/packages/multicast_dns/lib/mdns_client.dart b/packages/multicast_dns/lib/mdns_client.dart index d461a41..c7778c6 100644 --- a/packages/multicast_dns/lib/mdns_client.dart +++ b/packages/multicast_dns/lib/mdns_client.dart @@ -128,7 +128,7 @@ class MDnsClient { /// Lookup a [ResourceRecord], potentially from cache. /// - /// The [type] parameter must be a valid [RRType]. The [name] parameter is + /// The [type] parameter must be a valid [ResourceRecordType]. The [name] parameter is /// the name of the service to lookup, and must not be null. The [timeout] /// parameter specifies how long the intenral cache should hold on to the /// record. The [multicast] parameter specifies whether the query should be @@ -142,7 +142,7 @@ class MDnsClient { Duration timeout = const Duration(seconds: 5), bool multicast = true, }) { - RRType.debugAssertValid(type); + ResourceRecordType.debugAssertValid(type); assert(multicast != null); assert(name != null); diff --git a/packages/multicast_dns/lib/src/constants.dart b/packages/multicast_dns/lib/src/constants.dart index dfd223e..6c981a9 100644 --- a/packages/multicast_dns/lib/src/constants.dart +++ b/packages/multicast_dns/lib/src/constants.dart @@ -14,13 +14,21 @@ InternetAddress mDnsAddressIPv6 = InternetAddress('FF02::FB'); const int mDnsPort = 5353; /// Enumeration of supported resource record class types. -class RRClass { +class ResourceRecordClass { + // This class is intended to be used as a namespace, and should not be + // extended directly. + factory ResourceRecordClass._() => null; + /// Internet address class ("IN"). static const int internet = 1; } /// Enumeration of DNS question types. class QuestionType { + // This class is intended to be used as a namespace, and should not be + // extended directly. + factory QuestionType._() => null; + /// "QU" Question. static const int unicast = 0x8000; diff --git a/packages/multicast_dns/lib/src/lookup_resolver.dart b/packages/multicast_dns/lib/src/lookup_resolver.dart index 6c557aa..338919e 100644 --- a/packages/multicast_dns/lib/src/lookup_resolver.dart +++ b/packages/multicast_dns/lib/src/lookup_resolver.dart @@ -12,7 +12,7 @@ class PendingRequest extends LinkedListEntry { /// Creates a new PendingRequest. PendingRequest(this.type, this.name, this.controller); - /// The [RRType] of the request. + /// The [ResourceRecordType] of the request. final int type; /// The domain name. diff --git a/packages/multicast_dns/lib/src/native_protocol_client.dart b/packages/multicast_dns/lib/src/native_protocol_client.dart index ebe1b77..eb93a70 100644 --- a/packages/multicast_dns/lib/src/native_protocol_client.dart +++ b/packages/multicast_dns/lib/src/native_protocol_client.dart @@ -53,7 +53,7 @@ class ResourceRecordCache { /// Get a record from this cache. void lookup(String name, int type, List results) { - RRType.debugAssertValid(type); + ResourceRecordType.debugAssertValid(type); final int time = DateTime.now().millisecondsSinceEpoch; for (int i = _position + size; i >= _position; i--) { final int index = i % size; diff --git a/packages/multicast_dns/lib/src/packet.dart b/packages/multicast_dns/lib/src/packet.dart index 119fbed..b1ab960 100644 --- a/packages/multicast_dns/lib/src/packet.dart +++ b/packages/multicast_dns/lib/src/packet.dart @@ -36,15 +36,15 @@ List processDnsNameParts(String name) { /// Encode an mDNS query packet. /// -/// The [type] parameter must be a valid [RRType] value. The [multicast] parameter +/// The [type] parameter must be a valid [ResourceRecordType] value. The [multicast] parameter /// must not be null. List encodeMDnsQuery( String name, { - int type = RRType.a, + int type = ResourceRecordType.a, bool multicast = true, }) { assert(name != null); - RRType.debugAssertValid(type); + ResourceRecordType.debugAssertValid(type); assert(multicast != null); final List nameParts = processDnsNameParts(name); @@ -86,7 +86,7 @@ List encodeMDnsQuery( offset += 2; bd.setUint16( offset, - RRClass.internet | + ResourceRecordClass.internet | (multicast ? QuestionType.multicast : QuestionType.unicast)); return data; @@ -179,15 +179,15 @@ List decodeMDnsResponse(List packet) { final Uint8List data = packet is Uint8List ? packet : Uint8List.fromList(packet); - final ByteData bd = ByteData.view(data.buffer); + final ByteData packetBytes = ByteData.view(data.buffer); // Number of answers. - final int ancount = bd.getUint16(_kAncountOffset); + final int ancount = packetBytes.getUint16(_kAncountOffset); if (ancount == 0) { return null; } // Number of resource records. - final int arcount = bd.getUint16(_kArcountOffset); + final int arcount = packetBytes.getUint16(_kArcountOffset); int offset = _kHeaderSize; void checkLength(int required) { @@ -198,72 +198,72 @@ List decodeMDnsResponse(List packet) { ResourceRecord readResourceRecord() { // First read the FQDN. - final _FQDNReadResult result = _readFQDN(data, bd, offset, length); + final _FQDNReadResult result = _readFQDN(data, packetBytes, offset, length); final String fqdn = result.fqdn; offset += result.bytesRead; checkLength(offset + 2); - final int type = bd.getUint16(offset); + final int type = packetBytes.getUint16(offset); offset += 2; // The first bit of the rrclass field is set to indicate that the answer is // unique and the querier should flush the cached answer for this name // (RFC 6762, Sec. 10.2). We ignore it for now since we don't cache answers. checkLength(offset + 2); - final int cls = bd.getUint16(offset) & 0x7fff; + final int resourceRecordClass = packetBytes.getUint16(offset) & 0x7fff; - if (cls != RRClass.internet) { + if (resourceRecordClass != ResourceRecordClass.internet) { // We do not support other classes. return null; } offset += 2; checkLength(offset + 4); - final int ttl = bd.getInt32(offset); + final int ttl = packetBytes.getInt32(offset); offset += 4; checkLength(offset + 2); - final int rDataLength = bd.getUint16(offset); + final int rDataLength = packetBytes.getUint16(offset); offset += 2; final int validUntil = DateTime.now().millisecondsSinceEpoch + ttl * 1000; switch (type) { - case RRType.a: + case ResourceRecordType.a: checkLength(offset + rDataLength); final StringBuffer addr = StringBuffer(); final int stop = offset + rDataLength; - addr.write(bd.getUint8(offset)); + addr.write(packetBytes.getUint8(offset)); offset++; for (offset; offset < stop; offset++) { addr.write('.'); - addr.write(bd.getUint8(offset)); + addr.write(packetBytes.getUint8(offset)); } return IPAddressResourceRecord(fqdn, validUntil, address: InternetAddress(addr.toString())); - case RRType.aaaa: + case ResourceRecordType.aaaa: checkLength(offset + rDataLength); - final StringBuffer addr = StringBuffer(); final int stop = offset + rDataLength; - addr.write(bd.getUint16(offset).toRadixString(16)); + addr.write(packetBytes.getUint16(offset).toRadixString(16)); offset += 2; for (offset; offset < stop; offset += 2) { addr.write(':'); - addr.write(bd.getUint16(offset).toRadixString(16)); + addr.write(packetBytes.getUint16(offset).toRadixString(16)); } return IPAddressResourceRecord( fqdn, validUntil, address: InternetAddress(addr.toString()), ); - case RRType.srv: + case ResourceRecordType.srv: checkLength(offset + 2); - final int priority = bd.getUint16(offset); + final int priority = packetBytes.getUint16(offset); offset += 2; checkLength(offset + 2); - final int weight = bd.getUint16(offset); + final int weight = packetBytes.getUint16(offset); offset += 2; checkLength(offset + 2); - final int port = bd.getUint16(offset); + final int port = packetBytes.getUint16(offset); offset += 2; - final _FQDNReadResult result = _readFQDN(data, bd, offset, length); + final _FQDNReadResult result = + _readFQDN(data, packetBytes, offset, length); offset += result.bytesRead; return SrvResourceRecord( fqdn, @@ -274,16 +274,17 @@ List decodeMDnsResponse(List packet) { weight: weight, ); break; - case RRType.ptr: + case ResourceRecordType.ptr: checkLength(offset + rDataLength); - final _FQDNReadResult result = _readFQDN(data, bd, offset, length); + final _FQDNReadResult result = + _readFQDN(data, packetBytes, offset, length); offset += rDataLength; return PtrResourceRecord( fqdn, validUntil, domainName: result.fqdn, ); - case RRType.txt: + case ResourceRecordType.txt: checkLength(offset + rDataLength); final Uint8List rawText = Uint8List.view( data.buffer, diff --git a/packages/multicast_dns/lib/src/resource_record.dart b/packages/multicast_dns/lib/src/resource_record.dart index 405d397..6a53da9 100644 --- a/packages/multicast_dns/lib/src/resource_record.dart +++ b/packages/multicast_dns/lib/src/resource_record.dart @@ -6,8 +6,28 @@ import 'dart:io'; import 'package:meta/meta.dart'; +const int _seedHashPrime = 2166136261; +const int _multipleHashPrime = 16777619; + +int _combineHash(int current, int hash) => + (current & _multipleHashPrime) ^ hash; + +int _hashValues(List values) { + assert(values != null); + assert(values.isNotEmpty); + + return values.fold( + _seedHashPrime, + (int current, int next) => _combineHash(current, next), + ); +} + /// Enumeration of support resource record types. -class RRType { +class ResourceRecordType { + // This class is intended to be used as a namespace, and should not be + // extended directly. + factory ResourceRecordType._() => null; + /// An IPv4 Address record (1). static const int a = 1; @@ -23,24 +43,25 @@ class RRType { /// A text record (16). static const int txt = 16; - // TODO(dnfield): Can we support ANY in some meaningful way? + // TODO(dnfield): Support ANY in some meaningful way. Might be server only. // /// A query for all records of all types known to the name server. // static const int any = 255; - /// Asserts that a given int is a valid RRType. - static void debugAssertValid(int rrType) { - assert(rrType == a || - rrType == aaaa || - rrType == ptr || - rrType == srv || - rrType == txt); + /// Asserts that a given int is a valid ResourceRecordtype. + static void debugAssertValid(int resourceRecordType) { + assert(resourceRecordType == a || + resourceRecordType == aaaa || + resourceRecordType == ptr || + resourceRecordType == srv || + resourceRecordType == txt); } } /// Base implementation of DNS resource records (RRs). abstract class ResourceRecord { /// Creates a new ResourceRecord. - ResourceRecord(this.rrValue, this.name, this.validUntil); + ResourceRecord(this.rrValue, this.name, this.validUntil) + : assert(name != null); /// The FQDN for this record. final String name; @@ -48,7 +69,7 @@ abstract class ResourceRecord { /// The epoch time at which point this record is valid for in the cache. final int validUntil; - /// The raw resource record value. See [RRType] for supported values. + /// The raw resource record value. See [ResourceRecordType] for supported values. final int rrValue; String get _additionalInfo; @@ -59,7 +80,7 @@ abstract class ResourceRecord { @override bool operator ==(Object other) { - return other is ResourceRecord && _equals(other); + return other.runtimeType == runtimeType && _equals(other); } @protected @@ -73,8 +94,17 @@ abstract class ResourceRecord { int get hashCode { // TODO(dnfield): Probably should go with a real hashing function here // when https://github.com/dart-lang/sdk/issues/11617 is figured out. - return toString().hashCode; + + return _hashValues([ + name.hashCode, + validUntil.hashCode, + rrValue.hashCode, + _hashCode, + ]); } + + @protected + int get _hashCode; } /// A Service Pointer for reverse mapping an IP address (DNS "PTR"). @@ -84,7 +114,8 @@ class PtrResourceRecord extends ResourceRecord { String name, int validUntil, { @required this.domainName, - }) : super(RRType.ptr, name, validUntil); + }) : assert(domainName != null), + super(ResourceRecordType.ptr, name, validUntil); /// The FQDN for this record. final String domainName; @@ -98,6 +129,9 @@ class PtrResourceRecord extends ResourceRecord { other.domainName == domainName && super._equals(other); } + + @override + int get _hashCode => _combineHash(_seedHashPrime, domainName.hashCode); } /// An IP Address record for IPv4 (DNS "A") or IPv6 (DNS "AAAA") records. @@ -107,8 +141,12 @@ class IPAddressResourceRecord extends ResourceRecord { String name, int validUntil, { @required this.address, - }) : super(address.type == InternetAddressType.IPv4 ? RRType.a : RRType.aaaa, - name, validUntil); + }) : super( + address.type == InternetAddressType.IPv4 + ? ResourceRecordType.a + : ResourceRecordType.aaaa, + name, + validUntil); /// The [InternetAddress] for this record. final InternetAddress address; @@ -120,6 +158,9 @@ class IPAddressResourceRecord extends ResourceRecord { bool _equals(ResourceRecord other) { return other is IPAddressResourceRecord && other.address == address; } + + @override + int get _hashCode => _combineHash(_seedHashPrime, address.hashCode); } /// A Service record, capturing a host target and port (DNS "SRV"). @@ -132,7 +173,11 @@ class SrvResourceRecord extends ResourceRecord { @required this.port, @required this.priority, @required this.weight, - }) : super(RRType.srv, name, validUntil); + }) : assert(target != null), + assert(port != null), + assert(priority != null), + assert(weight != null), + super(ResourceRecordType.srv, name, validUntil); /// The hostname for this record. final String target; @@ -158,6 +203,14 @@ class SrvResourceRecord extends ResourceRecord { other.priority == priority && other.weight == weight; } + + @override + int get _hashCode => _hashValues([ + target.hashCode, + port.hashCode, + priority.hashCode, + weight.hashCode, + ]); } /// A Text record, contianing additional textual data (DNS "TXT"). @@ -167,7 +220,8 @@ class TxtResourceRecord extends ResourceRecord { String name, int validUntil, { @required this.text, - }) : super(RRType.txt, name, validUntil); + }) : assert(text != null), + super(ResourceRecordType.txt, name, validUntil); /// The raw text from this record. final String text; @@ -179,4 +233,7 @@ class TxtResourceRecord extends ResourceRecord { bool _equals(ResourceRecord other) { return other is TxtResourceRecord && other.text == text; } + + @override + int get _hashCode => _combineHash(_seedHashPrime, text.hashCode); } diff --git a/packages/multicast_dns/test/lookup_resolver_test.dart b/packages/multicast_dns/test/lookup_resolver_test.dart index 4e83e2b..01ee42f 100644 --- a/packages/multicast_dns/test/lookup_resolver_test.dart +++ b/packages/multicast_dns/test/lookup_resolver_test.dart @@ -25,7 +25,7 @@ void testTimeout() { final Duration shortTimeout = Duration(milliseconds: 1); final LookupResolver resolver = LookupResolver(); final Stream result = - resolver.addPendingRequest(RRType.a, 'xxx', shortTimeout); + resolver.addPendingRequest(ResourceRecordType.a, 'xxx', shortTimeout); expect(await result.isEmpty, isTrue); }); } @@ -36,7 +36,7 @@ void testResult() { final Duration noTimeout = Duration(days: 1); final LookupResolver resolver = LookupResolver(); final Stream futureResult = - resolver.addPendingRequest(RRType.a, 'xxx.local', noTimeout); + resolver.addPendingRequest(ResourceRecordType.a, 'xxx.local', noTimeout); final ResourceRecord response = ip4Result('xxx.local', InternetAddress('1.2.3.4')); resolver.handleResponse([response]); @@ -51,9 +51,9 @@ void testResult2() { final Duration noTimeout = Duration(days: 1); final LookupResolver resolver = LookupResolver(); final Stream futureResult1 = - resolver.addPendingRequest(RRType.a, 'xxx.local', noTimeout); + resolver.addPendingRequest(ResourceRecordType.a, 'xxx.local', noTimeout); final Stream futureResult2 = - resolver.addPendingRequest(RRType.a, 'yyy.local', noTimeout); + resolver.addPendingRequest(ResourceRecordType.a, 'yyy.local', noTimeout); final ResourceRecord response1 = ip4Result('xxx.local', InternetAddress('1.2.3.4')); final ResourceRecord response2 = @@ -75,10 +75,10 @@ void testResult3() { ip4Result('zzz.local', InternetAddress('2.3.4.5')); resolver.handleResponse([response0]); final Stream futureResult1 = - resolver.addPendingRequest(RRType.a, 'xxx.local', noTimeout); + resolver.addPendingRequest(ResourceRecordType.a, 'xxx.local', noTimeout); resolver.handleResponse([response0]); final Stream futureResult2 = - resolver.addPendingRequest(RRType.a, 'yyy.local', noTimeout); + resolver.addPendingRequest(ResourceRecordType.a, 'yyy.local', noTimeout); resolver.handleResponse([response0]); final ResourceRecord response1 = ip4Result('xxx.local', InternetAddress('1.2.3.4')); diff --git a/packages/multicast_dns/test/resource_record_cache.dart b/packages/multicast_dns/test/resource_record_cache.dart index 104590e..df4eb34 100644 --- a/packages/multicast_dns/test/resource_record_cache.dart +++ b/packages/multicast_dns/test/resource_record_cache.dart @@ -83,11 +83,11 @@ void testTimeout() { ]); List results = []; - cache.lookup('hest', RRType.a, results); + cache.lookup('hest', ResourceRecordType.a, results); expect(results.isEmpty, isFalse); results = []; - cache.lookup('fisk', RRType.a, results); + cache.lookup('fisk', ResourceRecordType.a, results); expect(results.isEmpty, isTrue); expect(entries(cache), 1); }); From 7ecc2fe1ffeb8bce67018ba20ec8b764c7e8be97 Mon Sep 17 00:00:00 2001 From: Dan Field Date: Mon, 22 Oct 2018 10:34:41 -0700 Subject: [PATCH 014/118] vertical alignment --- packages/multicast_dns/lib/src/resource_record.dart | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/multicast_dns/lib/src/resource_record.dart b/packages/multicast_dns/lib/src/resource_record.dart index 6a53da9..384d754 100644 --- a/packages/multicast_dns/lib/src/resource_record.dart +++ b/packages/multicast_dns/lib/src/resource_record.dart @@ -50,10 +50,10 @@ class ResourceRecordType { /// Asserts that a given int is a valid ResourceRecordtype. static void debugAssertValid(int resourceRecordType) { assert(resourceRecordType == a || - resourceRecordType == aaaa || - resourceRecordType == ptr || - resourceRecordType == srv || - resourceRecordType == txt); + resourceRecordType == aaaa || + resourceRecordType == ptr || + resourceRecordType == srv || + resourceRecordType == txt); } } @@ -86,8 +86,8 @@ abstract class ResourceRecord { @protected bool _equals(ResourceRecord other) { return other.name == name && - other.validUntil == validUntil && - other.rrValue == rrValue; + other.validUntil == validUntil && + other.rrValue == rrValue; } @override From ae818bd0a6472d7362e459944c834212affe99c7 Mon Sep 17 00:00:00 2001 From: Dan Field Date: Mon, 22 Oct 2018 20:08:21 -0700 Subject: [PATCH 015/118] dartfmt and remove all references to args package --- packages/multicast_dns/example/main.dart | 3 ++- .../multicast_dns/example/mdns-resolve.dart | 18 ++++----------- packages/multicast_dns/example/mdns-sd.dart | 23 ++++++++----------- packages/multicast_dns/example/pubspec.yaml | 14 ----------- .../lib/src/resource_record.dart | 12 +++++----- .../test/lookup_resolver_test.dart | 20 ++++++++-------- 6 files changed, 32 insertions(+), 58 deletions(-) delete mode 100644 packages/multicast_dns/example/pubspec.yaml diff --git a/packages/multicast_dns/example/main.dart b/packages/multicast_dns/example/main.dart index e421811..09f84c0 100644 --- a/packages/multicast_dns/example/main.dart +++ b/packages/multicast_dns/example/main.dart @@ -16,7 +16,8 @@ void main() async { await client.start(); // Get the PTR recod for the service. - await for (PtrResourceRecord ptr in client.lookup(ResourceRecordType.ptr, name)) { + await for (PtrResourceRecord ptr + in client.lookup(ResourceRecordType.ptr, name)) { // Use the domainName from the PTR record to get the SRV record, // which will have the port and local hostname. // Note that duplicate messages may come through, especially if any diff --git a/packages/multicast_dns/example/mdns-resolve.dart b/packages/multicast_dns/example/mdns-resolve.dart index 15c9449..89d18d7 100644 --- a/packages/multicast_dns/example/mdns-resolve.dart +++ b/packages/multicast_dns/example/mdns-resolve.dart @@ -5,37 +5,29 @@ // Example script to illustrate how to use the mdns package to lookup names // on the local network. -import 'package:args/args.dart'; - import 'package:multicast_dns/mdns_client.dart'; void main(List args) async { - // Parse the command line arguments. - final ArgParser parser = ArgParser(); - parser.addOption('timeout', abbr: 't', defaultsTo: '5'); - final ArgResults arguments = parser.parse(args); - - if (arguments.rest.length != 1) { + if (args.length != 1) { print(''' Please provide an address as argument. For example: - dart mdns-resolve.dart [--timeout ] dartino.local'''); + dart mdns-resolve.dart dartino.local'''); return; } - final String name = arguments.rest[0]; + final String name = args[0]; final MDnsClient client = MDnsClient(); await client.start(); - final Duration timeout = Duration(seconds: int.parse(arguments['timeout'])); await for (IPAddressResourceRecord record - in client.lookup(ResourceRecordType.a, name, timeout: timeout)) { + in client.lookup(ResourceRecordType.a, name)) { print('Found address (${record.address}).'); } await for (IPAddressResourceRecord record - in client.lookup(ResourceRecordType.aaaa, name, timeout: timeout)) { + in client.lookup(ResourceRecordType.aaaa, name)) { print('Found address (${record.address}).'); } client.stop(); diff --git a/packages/multicast_dns/example/mdns-sd.dart b/packages/multicast_dns/example/mdns-sd.dart index c944604..c260f87 100644 --- a/packages/multicast_dns/example/mdns-sd.dart +++ b/packages/multicast_dns/example/mdns-sd.dart @@ -5,32 +5,25 @@ // Example script to illustrate how to use the mdns package to discover services // on the local network. -import 'package:args/args.dart'; - import 'package:multicast_dns/mdns_client.dart'; void main(List args) async { - // Parse the command line arguments. - final ArgParser parser = ArgParser(); - parser.addOption('timeout', abbr: 't', defaultsTo: '5'); - parser.addFlag('verbose', abbr: 'v', defaultsTo: false); - final ArgResults arguments = parser.parse(args); - - if (arguments.rest.length != 1) { + if (args.isEmpty) { print(''' Please provide the name of a service as argument. For example: - dart mdns-sd.dart [--timeout ] [--verbose] _workstation._tcp.local'''); + dart mdns-sd.dart [--verbose] _workstation._tcp.local'''); return; } - final bool verbose = arguments['verbose']; - final String name = arguments.rest[0]; + final bool verbose = args.contains('--verbose') || args.contains('-v'); + final String name = args.last; final MDnsClient client = MDnsClient(); await client.start(); - await for (PtrResourceRecord ptr in client.lookup(ResourceRecordType.ptr, name)) { + await for (PtrResourceRecord ptr + in client.lookup(ResourceRecordType.ptr, name)) { if (verbose) { print(ptr); } @@ -40,7 +33,9 @@ For example: print(srv); } if (verbose) { - await client.lookup(ResourceRecordType.txt, ptr.domainName).forEach(print); + await client + .lookup(ResourceRecordType.txt, ptr.domainName) + .forEach(print); } await for (IPAddressResourceRecord ip in client.lookup(ResourceRecordType.a, srv.target)) { diff --git a/packages/multicast_dns/example/pubspec.yaml b/packages/multicast_dns/example/pubspec.yaml deleted file mode 100644 index eb3e92a..0000000 --- a/packages/multicast_dns/example/pubspec.yaml +++ /dev/null @@ -1,14 +0,0 @@ -name: multicast_dns_examples -description: Example package for mDNS queries (e.g. Bonjour, Avahi). -author: Flutter Team -homepage: https://github.com/flutter/packages/tree/master/packages/mdns -publish_to: none - -dependencies: - args: ^1.5.0 - multicast_dns: - path: ../ - -environment: - sdk: ">=2.1.0-dev.7.1 <3.0.0" - diff --git a/packages/multicast_dns/lib/src/resource_record.dart b/packages/multicast_dns/lib/src/resource_record.dart index 384d754..6a53da9 100644 --- a/packages/multicast_dns/lib/src/resource_record.dart +++ b/packages/multicast_dns/lib/src/resource_record.dart @@ -50,10 +50,10 @@ class ResourceRecordType { /// Asserts that a given int is a valid ResourceRecordtype. static void debugAssertValid(int resourceRecordType) { assert(resourceRecordType == a || - resourceRecordType == aaaa || - resourceRecordType == ptr || - resourceRecordType == srv || - resourceRecordType == txt); + resourceRecordType == aaaa || + resourceRecordType == ptr || + resourceRecordType == srv || + resourceRecordType == txt); } } @@ -86,8 +86,8 @@ abstract class ResourceRecord { @protected bool _equals(ResourceRecord other) { return other.name == name && - other.validUntil == validUntil && - other.rrValue == rrValue; + other.validUntil == validUntil && + other.rrValue == rrValue; } @override diff --git a/packages/multicast_dns/test/lookup_resolver_test.dart b/packages/multicast_dns/test/lookup_resolver_test.dart index 01ee42f..0628a53 100644 --- a/packages/multicast_dns/test/lookup_resolver_test.dart +++ b/packages/multicast_dns/test/lookup_resolver_test.dart @@ -35,8 +35,8 @@ void testResult() { test('One pending request and one response', () async { final Duration noTimeout = Duration(days: 1); final LookupResolver resolver = LookupResolver(); - final Stream futureResult = - resolver.addPendingRequest(ResourceRecordType.a, 'xxx.local', noTimeout); + final Stream futureResult = resolver.addPendingRequest( + ResourceRecordType.a, 'xxx.local', noTimeout); final ResourceRecord response = ip4Result('xxx.local', InternetAddress('1.2.3.4')); resolver.handleResponse([response]); @@ -50,10 +50,10 @@ void testResult2() { test('Two requests', () async { final Duration noTimeout = Duration(days: 1); final LookupResolver resolver = LookupResolver(); - final Stream futureResult1 = - resolver.addPendingRequest(ResourceRecordType.a, 'xxx.local', noTimeout); - final Stream futureResult2 = - resolver.addPendingRequest(ResourceRecordType.a, 'yyy.local', noTimeout); + final Stream futureResult1 = resolver.addPendingRequest( + ResourceRecordType.a, 'xxx.local', noTimeout); + final Stream futureResult2 = resolver.addPendingRequest( + ResourceRecordType.a, 'yyy.local', noTimeout); final ResourceRecord response1 = ip4Result('xxx.local', InternetAddress('1.2.3.4')); final ResourceRecord response2 = @@ -74,11 +74,11 @@ void testResult3() { final ResourceRecord response0 = ip4Result('zzz.local', InternetAddress('2.3.4.5')); resolver.handleResponse([response0]); - final Stream futureResult1 = - resolver.addPendingRequest(ResourceRecordType.a, 'xxx.local', noTimeout); + final Stream futureResult1 = resolver.addPendingRequest( + ResourceRecordType.a, 'xxx.local', noTimeout); resolver.handleResponse([response0]); - final Stream futureResult2 = - resolver.addPendingRequest(ResourceRecordType.a, 'yyy.local', noTimeout); + final Stream futureResult2 = resolver.addPendingRequest( + ResourceRecordType.a, 'yyy.local', noTimeout); resolver.handleResponse([response0]); final ResourceRecord response1 = ip4Result('xxx.local', InternetAddress('1.2.3.4')); From 373f4b48e2caabdb1c2faf504848fac8119ab2e2 Mon Sep 17 00:00:00 2001 From: Dan Field Date: Wed, 24 Oct 2018 13:54:31 -0700 Subject: [PATCH 016/118] cleanup --- packages/multicast_dns/example/main.dart | 6 +- .../multicast_dns/example/mdns-resolve.dart | 6 +- packages/multicast_dns/example/mdns-sd.dart | 12 +- packages/multicast_dns/lib/mdns_client.dart | 190 ------------------ packages/multicast_dns/lib/multicast_dns.dart | 183 ++++++++++++++++- .../lib/src/lookup_resolver.dart | 2 +- .../lib/src/native_protocol_client.dart | 7 +- packages/multicast_dns/lib/src/packet.dart | 77 +++++-- .../lib/src/resource_record.dart | 176 +++++++++++++++- packages/multicast_dns/test/decode_test.dart | 3 +- 10 files changed, 426 insertions(+), 236 deletions(-) delete mode 100644 packages/multicast_dns/lib/mdns_client.dart diff --git a/packages/multicast_dns/example/main.dart b/packages/multicast_dns/example/main.dart index 09f84c0..0300557 100644 --- a/packages/multicast_dns/example/main.dart +++ b/packages/multicast_dns/example/main.dart @@ -5,7 +5,7 @@ // Example script to illustrate how to use the mdns package to discover the port // of a Dart observatory over mDNS. -import 'package:multicast_dns/mdns_client.dart'; +import 'package:multicast_dns/multicast_dns.dart'; void main() async { // Parse the command line arguments. @@ -17,13 +17,13 @@ void main() async { // Get the PTR recod for the service. await for (PtrResourceRecord ptr - in client.lookup(ResourceRecordType.ptr, name)) { + in client.lookup(ResourceRecordQuery.ptr(name))) { // Use the domainName from the PTR record to get the SRV record, // which will have the port and local hostname. // Note that duplicate messages may come through, especially if any // other mDNS queries are running elsewhere on the machine. await for (SrvResourceRecord srv - in client.lookup(ResourceRecordType.srv, ptr.domainName)) { + in client.lookup(ResourceRecordQuery.srv(ptr.domainName))) { // Domain name will be something like "io.flutter.example@some-iphone.local._dartobservatory._tcp.local" final String bundleId = ptr.domainName.substring(0, ptr.domainName.indexOf('@')); diff --git a/packages/multicast_dns/example/mdns-resolve.dart b/packages/multicast_dns/example/mdns-resolve.dart index 89d18d7..cd1f7c6 100644 --- a/packages/multicast_dns/example/mdns-resolve.dart +++ b/packages/multicast_dns/example/mdns-resolve.dart @@ -5,7 +5,7 @@ // Example script to illustrate how to use the mdns package to lookup names // on the local network. -import 'package:multicast_dns/mdns_client.dart'; +import 'package:multicast_dns/multicast_dns.dart'; void main(List args) async { if (args.length != 1) { @@ -22,12 +22,12 @@ For example: final MDnsClient client = MDnsClient(); await client.start(); await for (IPAddressResourceRecord record - in client.lookup(ResourceRecordType.a, name)) { + in client.lookup(ResourceRecordQuery.a(name))) { print('Found address (${record.address}).'); } await for (IPAddressResourceRecord record - in client.lookup(ResourceRecordType.aaaa, name)) { + in client.lookup(ResourceRecordQuery.aaaa(name))) { print('Found address (${record.address}).'); } client.stop(); diff --git a/packages/multicast_dns/example/mdns-sd.dart b/packages/multicast_dns/example/mdns-sd.dart index c260f87..bdb1eda 100644 --- a/packages/multicast_dns/example/mdns-sd.dart +++ b/packages/multicast_dns/example/mdns-sd.dart @@ -5,7 +5,7 @@ // Example script to illustrate how to use the mdns package to discover services // on the local network. -import 'package:multicast_dns/mdns_client.dart'; +import 'package:multicast_dns/multicast_dns.dart'; void main(List args) async { if (args.isEmpty) { @@ -23,22 +23,22 @@ For example: await client.start(); await for (PtrResourceRecord ptr - in client.lookup(ResourceRecordType.ptr, name)) { + in client.lookup(ResourceRecordQuery.ptr(name))) { if (verbose) { print(ptr); } await for (SrvResourceRecord srv - in client.lookup(ResourceRecordType.srv, ptr.domainName)) { + in client.lookup(ResourceRecordQuery.srv(ptr.domainName))) { if (verbose) { print(srv); } if (verbose) { await client - .lookup(ResourceRecordType.txt, ptr.domainName) + .lookup(ResourceRecordQuery.txt(ptr.domainName)) .forEach(print); } await for (IPAddressResourceRecord ip - in client.lookup(ResourceRecordType.a, srv.target)) { + in client.lookup(ResourceRecordQuery.a(srv.target))) { if (verbose) { print(ip); } @@ -46,7 +46,7 @@ For example: 'Service instance found at ${srv.target}:${srv.port} with ${ip.address}.'); } await for (IPAddressResourceRecord ip - in client.lookup(ResourceRecordType.aaaa, srv.target)) { + in client.lookup(ResourceRecordQuery.aaaa(srv.target))) { if (verbose) { print(ip); } diff --git a/packages/multicast_dns/lib/mdns_client.dart b/packages/multicast_dns/lib/mdns_client.dart deleted file mode 100644 index c7778c6..0000000 --- a/packages/multicast_dns/lib/mdns_client.dart +++ /dev/null @@ -1,190 +0,0 @@ -// Copyright (c) 2015, the Dartino project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -import 'dart:async'; -import 'dart:io'; - -import 'package:multicast_dns/src/constants.dart'; -import 'package:multicast_dns/src/lookup_resolver.dart'; -import 'package:multicast_dns/src/native_protocol_client.dart'; -import 'package:multicast_dns/src/packet.dart'; -import 'package:multicast_dns/src/resource_record.dart'; - -export 'package:multicast_dns/src/resource_record.dart'; - -/// A callback type for [MDnsClient.start] to iterate available network interfaces. -/// -/// Impelmentations must ensure they return interfaces appropriate for the [type] parameter. -/// -/// See also: -/// * [MDnsClient.allInterfacesFactory] -typedef NetworkInterfacesFactory = Future> Function( - InternetAddressType type); - -/// Client for DNS lookup using the mDNS protocol. -/// -/// Users should call [MDnsClient.start] when ready to start querying and listening. -/// [MDnsClient.stop] must be called when done to clean up resources. -/// -/// This client only support "One-Shot Multicast DNS Queries" as described in -/// section 5.1 of [RFC 6762](https://tools.ietf.org/html/rfc6762). -class MDnsClient { - bool _starting = false; - bool _started = false; - RawDatagramSocket _incoming; - final List _sockets = []; - final LookupResolver _resolver = LookupResolver(); - final ResourceRecordCache _cache = ResourceRecordCache(); - InternetAddress _mDnsAddress; - - /// Find all network interfaces with an the [InternetAddressType] specified. - static NetworkInterfacesFactory allInterfacesFactory = - (InternetAddressType type) => NetworkInterface.list( - includeLinkLocal: true, - type: type, - includeLoopback: true, - ); - - /// Start the mDNS client. - /// - /// With no arguments, this method will listen on the IPv4 multicast address - /// on all IPv4 network interfaces. - /// - /// The [listenAddress] parameter must be either [InternetAddress.anyIPv4] or - /// [InternetAddress.anyIPv6], and will default to anyIPv4. - /// - /// The [interfaceFactory] defaults to [allInterfacesFactory]. - Future start({ - InternetAddress listenAddress, - NetworkInterfacesFactory interfaceFactory, - }) async { - listenAddress ??= InternetAddress.anyIPv4; - interfaceFactory ??= allInterfacesFactory; - - assert(listenAddress.address == InternetAddress.anyIPv4.address || - listenAddress.address == InternetAddress.anyIPv6.address); - - if (_started || _starting) { - return; - } - _starting = true; - - // Listen on all addresses. - _incoming = await RawDatagramSocket.bind( - InternetAddress.anyIPv4, - mDnsPort, - reuseAddress: true, - reusePort: true, - ttl: 255, - ); - - _sockets.add(_incoming); - - _mDnsAddress = _incoming.address.type == InternetAddressType.IPv4 - ? mDnsAddressIPv4 - : mDnsAddressIPv6; - - final List interfaces = - await interfaceFactory(listenAddress.type); - - for (NetworkInterface interface in interfaces) { - // Create a socket for sending on each adapter. - final RawDatagramSocket socket = await RawDatagramSocket.bind( - interface.addresses[0], - mDnsPort, - reuseAddress: true, - reusePort: true, - ttl: 255, - ); - _sockets.add(socket); - - // Join multicast on this interface. - _incoming.joinMulticast(_mDnsAddress, interface); - } - _incoming.listen(_handleIncoming); - - _started = true; - _starting = false; - } - - /// Stop the client and close any associated sockets. - void stop() { - if (!_started) { - return; - } - if (_starting) { - throw StateError('Cannot stop mDNS client while it is starting.'); - } - - for (RawDatagramSocket socket in _sockets) { - socket.close(); - } - - _resolver.clearPendingRequests(); - - _started = false; - } - - /// Lookup a [ResourceRecord], potentially from cache. - /// - /// The [type] parameter must be a valid [ResourceRecordType]. The [name] parameter is - /// the name of the service to lookup, and must not be null. The [timeout] - /// parameter specifies how long the intenral cache should hold on to the - /// record. The [multicast] parameter specifies whether the query should be - /// sent as unicast (QU) or multicast (QM). - /// - /// Note that some publishers have been observed to not respond to unicast - /// requests properly, so the default is true. - Stream lookup( - int type, - String name, { - Duration timeout = const Duration(seconds: 5), - bool multicast = true, - }) { - ResourceRecordType.debugAssertValid(type); - assert(multicast != null); - assert(name != null); - - if (!_started) { - throw StateError('mDNS client is not started.'); - } - // Look for entries in the cache. - final List cached = []; - _cache.lookup(name, type, cached); - if (cached.isNotEmpty) { - final StreamController controller = - StreamController(); - cached.forEach(controller.add); - controller.close(); - return controller.stream; - } - - // Add the pending request before sending the query. - final Stream results = - _resolver.addPendingRequest(type, name, timeout); - - // Send the request on all interfaces. - final List packet = encodeMDnsQuery( - name, - type: type, - multicast: multicast, - ); - for (RawDatagramSocket socket in _sockets) { - socket.send(packet, _mDnsAddress, mDnsPort); - } - return results; - } - - // Process incoming datagrams. - void _handleIncoming(RawSocketEvent event) { - if (event == RawSocketEvent.read) { - final Datagram datagram = _incoming.receive(); - final List response = decodeMDnsResponse(datagram.data); - if (response != null) { - _cache.updateRecords(response); - _resolver.handleResponse(response); - } - } - } -} diff --git a/packages/multicast_dns/lib/multicast_dns.dart b/packages/multicast_dns/lib/multicast_dns.dart index a9cbc33..a607c94 100644 --- a/packages/multicast_dns/lib/multicast_dns.dart +++ b/packages/multicast_dns/lib/multicast_dns.dart @@ -1,3 +1,184 @@ +// Copyright (c) 2015, the Dartino project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +import 'dart:async'; +import 'dart:io'; + +import 'package:multicast_dns/src/constants.dart'; +import 'package:multicast_dns/src/lookup_resolver.dart'; +import 'package:multicast_dns/src/native_protocol_client.dart'; +import 'package:multicast_dns/src/packet.dart'; +import 'package:multicast_dns/src/resource_record.dart'; + export 'package:multicast_dns/src/resource_record.dart'; -export 'mdns_client.dart'; +/// A callback type for [MDnsQuerier.start] to iterate available network interfaces. +/// +/// Impelmentations must ensure they return interfaces appropriate for the [type] parameter. +/// +/// See also: +/// * [MDnsQuerier.allInterfacesFactory] +typedef NetworkInterfacesFactory = Future> Function( + InternetAddressType type); + +/// Client for DNS lookup and publishing using the mDNS protocol. +/// +/// Users should call [MDnsQuerier.start] when ready to start querying and listening. +/// [MDnsQuerier.stop] must be called when done to clean up resources. +/// +/// This client only support "One-Shot Multicast DNS Queries" as described in +/// section 5.1 of [RFC 6762](https://tools.ietf.org/html/rfc6762). +class MDnsClient { + bool _starting = false; + bool _started = false; + RawDatagramSocket _incoming; + final List _sockets = []; + final LookupResolver _resolver = LookupResolver(); + final ResourceRecordCache _cache = ResourceRecordCache(); + InternetAddress _mDnsAddress; + + /// Find all network interfaces with an the [InternetAddressType] specified. + static NetworkInterfacesFactory allInterfacesFactory = + (InternetAddressType type) => NetworkInterface.list( + includeLinkLocal: true, + type: type, + includeLoopback: true, + ); + + /// Start the mDNS client. + /// + /// With no arguments, this method will listen on the IPv4 multicast address + /// on all IPv4 network interfaces. + /// + /// The [listenAddress] parameter must be either [InternetAddress.anyIPv4] or + /// [InternetAddress.anyIPv6], and will default to anyIPv4. + /// + /// The [interfaceFactory] defaults to [allInterfacesFactory]. + Future start({ + InternetAddress listenAddress, + NetworkInterfacesFactory interfacesFactory, + }) async { + listenAddress ??= InternetAddress.anyIPv4; + interfacesFactory ??= allInterfacesFactory; + + assert(listenAddress.address == InternetAddress.anyIPv4.address || + listenAddress.address == InternetAddress.anyIPv6.address); + + if (_started || _starting) { + return; + } + _starting = true; + + // Listen on all addresses. + _incoming = await RawDatagramSocket.bind( + InternetAddress.anyIPv4, + mDnsPort, + reuseAddress: true, + reusePort: true, + ttl: 255, + ); + + _sockets.add(_incoming); + + _mDnsAddress = _incoming.address.type == InternetAddressType.IPv4 + ? mDnsAddressIPv4 + : mDnsAddressIPv6; + + final List interfaces = + await interfacesFactory(listenAddress.type); + + for (NetworkInterface interface in interfaces) { + // Create a socket for sending on each adapter. + final RawDatagramSocket socket = await RawDatagramSocket.bind( + interface.addresses[0], + mDnsPort, + reuseAddress: true, + reusePort: true, + ttl: 255, + ); + _sockets.add(socket); + + // Join multicast on this interface. + _incoming.joinMulticast(_mDnsAddress, interface); + } + _incoming.listen(_handleIncoming); + + _started = true; + _starting = false; + } + + /// Stop the client and close any associated sockets. + void stop() { + if (!_started) { + return; + } + if (_starting) { + throw StateError('Cannot stop mDNS client while it is starting.'); + } + + for (RawDatagramSocket socket in _sockets) { + socket.close(); + } + + _resolver.clearPendingRequests(); + + _started = false; + } + + /// Lookup a [ResourceRecord], potentially from cache. + /// + /// The [type] parameter must be a valid [ResourceRecordType]. The [name] parameter is + /// the name of the service to lookup, and must not be null. The [timeout] + /// parameter specifies how long the intenral cache should hold on to the + /// record. The [multicast] parameter specifies whether the query should be + /// sent as unicast (QU) or multicast (QM). + /// + /// Note that some publishers have been observed to not respond to unicast + /// requests properly, so the default is true. + Stream lookup( + ResourceRecordQuery query, { + Duration timeout = const Duration(seconds: 5), + }) { + if (!_started) { + throw StateError('mDNS client is not started.'); + } + // Look for entries in the cache. + final List cached = []; + _cache.lookup(query.name, query.resourceRecordType, cached); + if (cached.isNotEmpty) { + final StreamController controller = + StreamController(); + cached.forEach(controller.add); + controller.close(); + return controller.stream; + } + + // Add the pending request before sending the query. + final Stream results = _resolver.addPendingRequest( + query.resourceRecordType, query.name, timeout); + + // Send the request on all interfaces. + final List packet = query.encode(); + for (RawDatagramSocket socket in _sockets) { + socket.send(packet, _mDnsAddress, mDnsPort); + } + return results; + } + + // Process incoming datagrams. + void _handleIncoming(RawSocketEvent event) { + if (event == RawSocketEvent.read) { + final Datagram datagram = _incoming.receive(); + + // check for published responses + final List response = decodeMDnsResponse(datagram.data); + if (response != null) { + _cache.updateRecords(response); + _resolver.handleResponse(response); + return; + } + // TODO(dnfield): Support queries coming in for published entries. + } + } +} diff --git a/packages/multicast_dns/lib/src/lookup_resolver.dart b/packages/multicast_dns/lib/src/lookup_resolver.dart index 338919e..e8d1680 100644 --- a/packages/multicast_dns/lib/src/lookup_resolver.dart +++ b/packages/multicast_dns/lib/src/lookup_resolver.dart @@ -50,7 +50,7 @@ class LookupResolver { /// Processes responses back to the caller. void handleResponse(List response) { for (ResourceRecord r in response) { - final int type = r.rrValue; + final int type = r.resourceRecordType; String name = r.name.toLowerCase(); if (name.endsWith('.')) { name = name.substring(0, name.length - 1); diff --git a/packages/multicast_dns/lib/src/native_protocol_client.dart b/packages/multicast_dns/lib/src/native_protocol_client.dart index eb93a70..195869c 100644 --- a/packages/multicast_dns/lib/src/native_protocol_client.dart +++ b/packages/multicast_dns/lib/src/native_protocol_client.dart @@ -38,7 +38,8 @@ class ResourceRecordCache { continue; } for (ResourceRecord record in records) { - if (r.name == record.name && r.rrValue == record.rrValue) { + if (r.name == record.name && + r.resourceRecordType == record.resourceRecordType) { buffer[i % size] = null; break; } @@ -53,7 +54,7 @@ class ResourceRecordCache { /// Get a record from this cache. void lookup(String name, int type, List results) { - ResourceRecordType.debugAssertValid(type); + assert(ResourceRecordType.debugAssertValid(type)); final int time = DateTime.now().millisecondsSinceEpoch; for (int i = _position + size; i >= _position; i--) { final int index = i % size; @@ -63,7 +64,7 @@ class ResourceRecordCache { } if (record.validUntil < time) { buffer[index] = null; - } else if (record.name == name && record.rrValue == type) { + } else if (record.name == name && record.resourceRecordType == type) { results.add(record); } } diff --git a/packages/multicast_dns/lib/src/packet.dart b/packages/multicast_dns/lib/src/packet.dart index b1ab960..5be1e0f 100644 --- a/packages/multicast_dns/lib/src/packet.dart +++ b/packages/multicast_dns/lib/src/packet.dart @@ -38,18 +38,20 @@ List processDnsNameParts(String name) { /// /// The [type] parameter must be a valid [ResourceRecordType] value. The [multicast] parameter /// must not be null. +/// +/// This is a low level API; most consumers should prefer [ResourceRecordQuery.encode]. List encodeMDnsQuery( String name, { int type = ResourceRecordType.a, bool multicast = true, }) { assert(name != null); - ResourceRecordType.debugAssertValid(type); + assert(ResourceRecordType.debugAssertValid(type)); assert(multicast != null); final List nameParts = processDnsNameParts(name); final List> rawNameParts = - nameParts.map((String part) => utf8.encode(part)).toList(); + nameParts.map>((String part) => utf8.encode(part)).toList(); // Calculate the size of the packet. int size = _kHeaderSize; @@ -60,19 +62,19 @@ List encodeMDnsQuery( size += 1; // End with empty part size += 4; // Trailer (QTYPE and QCLASS). final Uint8List data = Uint8List(size); - final ByteData bd = ByteData.view(data.buffer); + final ByteData packetByteData = ByteData.view(data.buffer); // Query identifier - just use 0. - bd.setUint16(_kIdOffset, 0); + packetByteData.setUint16(_kIdOffset, 0); // Flags - 0 for query. - bd.setUint16(_kFlagsOffset, 0); + packetByteData.setUint16(_kFlagsOffset, 0); // Query count. - bd.setUint16(_kQdcountOffset, 1); + packetByteData.setUint16(_kQdcountOffset, 1); // Number of answers - 0 for query. - bd.setUint16(_kAncountOffset, 0); + packetByteData.setUint16(_kAncountOffset, 0); // Number of name server records - 0 for query. - bd.setUint16(_kNscountOffset, 0); + packetByteData.setUint16(_kNscountOffset, 0); // Number of resource records - 0 for query. - bd.setUint16(_kArcountOffset, 0); + packetByteData.setUint16(_kArcountOffset, 0); int offset = _kHeaderSize; for (int i = 0; i < rawNameParts.length; i++) { data[offset++] = rawNameParts[i].length; @@ -82,9 +84,9 @@ List encodeMDnsQuery( data[offset] = 0; // Empty part. offset++; - bd.setUint16(offset, type); // QTYPE. + packetByteData.setUint16(offset, type); // QTYPE. offset += 2; - bd.setUint16( + packetByteData.setUint16( offset, ResourceRecordClass.internet | (multicast ? QuestionType.multicast : QuestionType.unicast)); @@ -114,16 +116,17 @@ class _FQDNReadResult { String readFQDN(List packet, [int offset = 0]) { final Uint8List data = packet is Uint8List ? packet : Uint8List.fromList(packet); - final ByteData bd = ByteData.view(data.buffer); + final ByteData byteData = ByteData.view(data.buffer); - return _readFQDN(data, bd, offset, data.length).fqdn; + return _readFQDN(data, byteData, offset, data.length).fqdn; } // Read a FQDN at the given offset. Returns a pair with the FQDN // parts and the number of bytes consumed. // // If decoding fails (e.g. due to an invalid packet) `null` is returned. -_FQDNReadResult _readFQDN(Uint8List data, ByteData bd, int offset, int length) { +_FQDNReadResult _readFQDN( + Uint8List data, ByteData byteData, int offset, int length) { void checkLength(int required) { if (length < required) { throw MDnsDecodeException(required); @@ -142,8 +145,8 @@ _FQDNReadResult _readFQDN(Uint8List data, ByteData bd, int offset, int length) { checkLength(offset + 2); // A compressed FQDN has a new offset in the lower 14 bits. - final _FQDNReadResult result = - _readFQDN(data, bd, bd.getUint16(offset) & ~0xc000, length); + final _FQDNReadResult result = _readFQDN( + data, byteData, byteData.getUint16(offset) & ~0xc000, length); parts.addAll(result.fqdnParts); offset += 2; break; @@ -166,7 +169,43 @@ _FQDNReadResult _readFQDN(Uint8List data, ByteData bd, int offset, int length) { return _FQDNReadResult(parts, offset - prevOffset); } -/// Decode a mDNS package. +/// Decode an mDNS query packet. +/// +/// If decoding fails (e.g. due to an invalid packet), `null` is returned. +/// +/// See https://tools.ietf.org/html/rfc1035 for format. +ResourceRecordQuery decodeMDnsQuery(List packet) { + final int length = packet.length; + if (length < _kHeaderSize) { + return null; + } + + final Uint8List data = + packet is Uint8List ? packet : Uint8List.fromList(packet); + final ByteData packetBytes = ByteData.view(data.buffer); + + // Check whether it's a query. + final int flags = packetBytes.getUint16(_kFlagsOffset); + if (flags != 0) { + return null; + } + // Number of questions. + final int qdcount = packetBytes.getUint16(_kQdcountOffset); + if (qdcount == 0) { + return null; + } + + final _FQDNReadResult fqdn = + _readFQDN(data, packetBytes, _kHeaderSize, data.length); + + int offset = _kHeaderSize + fqdn.bytesRead; + final int type = packetBytes.getUint16(offset); + offset += 2; + final int queryType = packetBytes.getUint16(offset) & 0x8000; + return ResourceRecordQuery(type, fqdn.fqdn, queryType); +} + +/// Decode an mDNS response packet. /// /// If decoding fails (e.g. due to an invalid packet) `null` is returned. /// @@ -180,6 +219,7 @@ List decodeMDnsResponse(List packet) { final Uint8List data = packet is Uint8List ? packet : Uint8List.fromList(packet); final ByteData packetBytes = ByteData.view(data.buffer); + // Number of answers. final int ancount = packetBytes.getUint16(_kAncountOffset); if (ancount == 0) { @@ -301,6 +341,9 @@ List decodeMDnsResponse(List packet) { } } + // Note: this list can't be fixed length right now because we might get + // resource record types we don't support, and consumers expect this list + // to not have null entries. final List result = []; try { diff --git a/packages/multicast_dns/lib/src/resource_record.dart b/packages/multicast_dns/lib/src/resource_record.dart index 6a53da9..aab4be5 100644 --- a/packages/multicast_dns/lib/src/resource_record.dart +++ b/packages/multicast_dns/lib/src/resource_record.dart @@ -2,10 +2,16 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import 'dart:convert'; import 'dart:io'; +import 'dart:typed_data'; import 'package:meta/meta.dart'; +import 'package:multicast_dns/src/constants.dart'; +import 'package:multicast_dns/src/packet.dart'; +// TODO(dnfield): Probably should go with a real hashing function here +// when https://github.com/dart-lang/sdk/issues/11617 is figured out. const int _seedHashPrime = 2166136261; const int _multipleHashPrime = 16777619; @@ -48,19 +54,140 @@ class ResourceRecordType { // static const int any = 255; /// Asserts that a given int is a valid ResourceRecordtype. - static void debugAssertValid(int resourceRecordType) { - assert(resourceRecordType == a || + static bool debugAssertValid(int resourceRecordType) { + return resourceRecordType == a || resourceRecordType == aaaa || resourceRecordType == ptr || resourceRecordType == srv || - resourceRecordType == txt); + resourceRecordType == txt; + } + + /// Prints a debug-friendly version of the resource record type value. + static String toDebugString(int resourceRecordType) { + switch (resourceRecordType) { + case a: + return 'A (IPv4 Address)'; + case aaaa: + return 'AAAA (IPv6 Address)'; + case ptr: + return 'PTR (Domain Name Pointer)'; + case srv: + return 'SRV (Service record)'; + case txt: + return 'TXT (Text)'; + default: + return 'Unknown ($resourceRecordType)'; + } } } +/// Represents a DNS query. +class ResourceRecordQuery { + /// Creates a new ResourceRecordQuery. + /// + /// Most callers should prefer one of the named constructors. + ResourceRecordQuery( + this.resourceRecordType, + this.name, + this.questionType, + ) : assert(name != null), + assert(ResourceRecordType.debugAssertValid(resourceRecordType)); + + /// An A (IPv4) query. + ResourceRecordQuery.a( + String name, { + bool isMulticast = true, + }) : this( + ResourceRecordType.a, + name, + isMulticast ? QuestionType.multicast : QuestionType.unicast, + ); + + /// An AAAA (IPv6) query. + ResourceRecordQuery.aaaa( + String name, { + bool isMulticast = true, + }) : this( + ResourceRecordType.aaaa, + name, + isMulticast ? QuestionType.multicast : QuestionType.unicast, + ); + + /// A PTR (Server pointer) query. + ResourceRecordQuery.ptr( + String name, { + bool isMulticast = true, + }) : this( + ResourceRecordType.ptr, + name, + isMulticast ? QuestionType.multicast : QuestionType.unicast, + ); + + /// An SRV (Service) query. + ResourceRecordQuery.srv( + String name, { + bool isMulticast = true, + }) : this( + ResourceRecordType.srv, + name, + isMulticast ? QuestionType.multicast : QuestionType.unicast, + ); + + /// A TXT (Text record) query. + ResourceRecordQuery.txt( + String name, { + bool isMulticast = true, + }) : this( + ResourceRecordType.txt, + name, + isMulticast ? QuestionType.multicast : QuestionType.unicast, + ); + + /// Tye type of resource record - one of [ResourceRecordType]'s values. + final int resourceRecordType; + + /// The Fully Qualified Domain Name associated with the request. + final String name; + + /// The [QuestionType], i.e. multicast or unicast. + final int questionType; + + /// Convenience accessor to determine whether the question type is multicast. + bool get isMulticast => questionType == QuestionType.multicast; + + /// Convenience accessor to determine whether the question type is unicast. + bool get isUnicast => questionType == QuestionType.unicast; + + /// Encodes this query to the raw wire format. + List encode() { + return encodeMDnsQuery( + name, + type: resourceRecordType, + multicast: isMulticast, + ); + } + + @override + int get hashCode => + _hashValues([resourceRecordType, name.hashCode, questionType]); + + @override + bool operator ==(Object other) { + return other is ResourceRecordQuery && + other.resourceRecordType == resourceRecordType && + other.name == name && + other.questionType == questionType; + } + + @override + String toString() => + '$runtimeType{$name, type: ${ResourceRecordType.toDebugString(resourceRecordType)}, isMulticast: $isMulticast}'; +} + /// Base implementation of DNS resource records (RRs). abstract class ResourceRecord { /// Creates a new ResourceRecord. - ResourceRecord(this.rrValue, this.name, this.validUntil) + const ResourceRecord(this.resourceRecordType, this.name, this.validUntil) : assert(name != null); /// The FQDN for this record. @@ -70,13 +197,13 @@ abstract class ResourceRecord { final int validUntil; /// The raw resource record value. See [ResourceRecordType] for supported values. - final int rrValue; + final int resourceRecordType; String get _additionalInfo; @override String toString() => - '$runtimeType{$name, validUntil: ${DateTime.fromMillisecondsSinceEpoch(validUntil)}, $_additionalInfo}'; + '$runtimeType{$name, validUntil: ${DateTime.fromMillisecondsSinceEpoch(validUntil ?? 0)}, $_additionalInfo}'; @override bool operator ==(Object other) { @@ -87,24 +214,24 @@ abstract class ResourceRecord { bool _equals(ResourceRecord other) { return other.name == name && other.validUntil == validUntil && - other.rrValue == rrValue; + other.resourceRecordType == resourceRecordType; } @override int get hashCode { - // TODO(dnfield): Probably should go with a real hashing function here - // when https://github.com/dart-lang/sdk/issues/11617 is figured out. - return _hashValues([ name.hashCode, validUntil.hashCode, - rrValue.hashCode, + resourceRecordType.hashCode, _hashCode, ]); } @protected int get _hashCode; + + /// Low level method for encoding this record into an mDNS packet. + Uint8List encodeResponseRecord(); } /// A Service Pointer for reverse mapping an IP address (DNS "PTR"). @@ -132,6 +259,11 @@ class PtrResourceRecord extends ResourceRecord { @override int get _hashCode => _combineHash(_seedHashPrime, domainName.hashCode); + + @override + Uint8List encodeResponseRecord() { + return Uint8List.fromList(utf8.encode(domainName)); + } } /// An IP Address record for IPv4 (DNS "A") or IPv6 (DNS "AAAA") records. @@ -161,6 +293,11 @@ class IPAddressResourceRecord extends ResourceRecord { @override int get _hashCode => _combineHash(_seedHashPrime, address.hashCode); + + @override + Uint8List encodeResponseRecord() { + return Uint8List.fromList(address.rawAddress); + } } /// A Service record, capturing a host target and port (DNS "SRV"). @@ -211,6 +348,18 @@ class SrvResourceRecord extends ResourceRecord { priority.hashCode, weight.hashCode, ]); + + @override + Uint8List encodeResponseRecord() { + final List data = utf8.encode(target); + final Uint8List result = Uint8List(data.length + 7); + final ByteData resultData = ByteData.view(result.buffer); + resultData.setUint16(0, priority); + resultData.setUint16(2, weight); + resultData.setUint16(4, port); + result[6] = data.length; + return result..setRange(7, data.length, data); + } } /// A Text record, contianing additional textual data (DNS "TXT"). @@ -236,4 +385,9 @@ class TxtResourceRecord extends ResourceRecord { @override int get _hashCode => _combineHash(_seedHashPrime, text.hashCode); + + @override + Uint8List encodeResponseRecord() { + return Uint8List.fromList(utf8.encode(text)); + } } diff --git a/packages/multicast_dns/test/decode_test.dart b/packages/multicast_dns/test/decode_test.dart index a396a6f..5790278 100644 --- a/packages/multicast_dns/test/decode_test.dart +++ b/packages/multicast_dns/test/decode_test.dart @@ -21,7 +21,8 @@ void main() { void testValidPackages() { test('Can decode valid packets', () { List result = decodeMDnsResponse(package1); - expect(1, result.length); + expect(result, isNotNull); + expect(result.length, 1); IPAddressResourceRecord ipResult = result[0]; expect(ipResult.name, 'raspberrypi.local'); expect(ipResult.address.address, '192.168.1.191'); From e277ffd17f98468d4f9b61d8be61c999e0e7808e Mon Sep 17 00:00:00 2001 From: Dan Field Date: Wed, 24 Oct 2018 14:38:46 -0700 Subject: [PATCH 017/118] typo, word wrap --- packages/multicast_dns/example/main.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/multicast_dns/example/main.dart b/packages/multicast_dns/example/main.dart index 0300557..e59a259 100644 --- a/packages/multicast_dns/example/main.dart +++ b/packages/multicast_dns/example/main.dart @@ -27,8 +27,8 @@ void main() async { // Domain name will be something like "io.flutter.example@some-iphone.local._dartobservatory._tcp.local" final String bundleId = ptr.domainName.substring(0, ptr.domainName.indexOf('@')); - print( - 'Dart obvservatory instance found at ${srv.target}:${srv.port} for "$bundleId".'); + print('Dart observatory instance found at ' + '${srv.target}:${srv.port} for "$bundleId".'); } } client.stop(); From fc8a851f1fe1851efb071a5718aa4c26bd93dceb Mon Sep 17 00:00:00 2001 From: Dan Field Date: Wed, 24 Oct 2018 15:19:42 -0700 Subject: [PATCH 018/118] Add type parameters --- packages/multicast_dns/lib/multicast_dns.dart | 11 +++++------ packages/multicast_dns/lib/src/lookup_resolver.dart | 5 ++--- .../multicast_dns/lib/src/native_protocol_client.dart | 7 ++++--- 3 files changed, 11 insertions(+), 12 deletions(-) diff --git a/packages/multicast_dns/lib/multicast_dns.dart b/packages/multicast_dns/lib/multicast_dns.dart index a607c94..38d4801 100644 --- a/packages/multicast_dns/lib/multicast_dns.dart +++ b/packages/multicast_dns/lib/multicast_dns.dart @@ -136,7 +136,7 @@ class MDnsClient { /// /// Note that some publishers have been observed to not respond to unicast /// requests properly, so the default is true. - Stream lookup( + Stream lookup( ResourceRecordQuery query, { Duration timeout = const Duration(seconds: 5), }) { @@ -144,18 +144,17 @@ class MDnsClient { throw StateError('mDNS client is not started.'); } // Look for entries in the cache. - final List cached = []; - _cache.lookup(query.name, query.resourceRecordType, cached); + final List cached = []; + _cache.lookup(query.name, query.resourceRecordType, cached); if (cached.isNotEmpty) { - final StreamController controller = - StreamController(); + final StreamController controller = StreamController(); cached.forEach(controller.add); controller.close(); return controller.stream; } // Add the pending request before sending the query. - final Stream results = _resolver.addPendingRequest( + final Stream results = _resolver.addPendingRequest( query.resourceRecordType, query.name, timeout); // Send the request on all interfaces. diff --git a/packages/multicast_dns/lib/src/lookup_resolver.dart b/packages/multicast_dns/lib/src/lookup_resolver.dart index e8d1680..b6381d9 100644 --- a/packages/multicast_dns/lib/src/lookup_resolver.dart +++ b/packages/multicast_dns/lib/src/lookup_resolver.dart @@ -33,10 +33,9 @@ class LookupResolver { LinkedList(); /// Adds a request and returns a [Stream] of [ResourceRecord] responses. - Stream addPendingRequest( + Stream addPendingRequest( int type, String name, Duration timeout) { - final StreamController controller = - StreamController(); + final StreamController controller = StreamController(); final PendingRequest request = PendingRequest(type, name, controller); final Timer timer = Timer(timeout, () { request.unlink(); diff --git a/packages/multicast_dns/lib/src/native_protocol_client.dart b/packages/multicast_dns/lib/src/native_protocol_client.dart index 195869c..7ee9d90 100644 --- a/packages/multicast_dns/lib/src/native_protocol_client.dart +++ b/packages/multicast_dns/lib/src/native_protocol_client.dart @@ -53,15 +53,16 @@ class ResourceRecordCache { } /// Get a record from this cache. - void lookup(String name, int type, List results) { + void lookup( + String name, int type, List results) { assert(ResourceRecordType.debugAssertValid(type)); final int time = DateTime.now().millisecondsSinceEpoch; for (int i = _position + size; i >= _position; i--) { final int index = i % size; - final ResourceRecord record = buffer[index]; - if (record == null) { + if (buffer[index] is! T) { continue; } + final T record = buffer[index]; if (record.validUntil < time) { buffer[index] = null; } else if (record.name == name && record.resourceRecordType == type) { From 702793e29fe3b48893cd3079852b175c50156a7a Mon Sep 17 00:00:00 2001 From: Dan Field Date: Wed, 24 Oct 2018 20:37:49 -0700 Subject: [PATCH 019/118] Update examples to use type parameters --- packages/multicast_dns/example/main.dart | 6 ++--- .../multicast_dns/example/mdns-resolve.dart | 6 ++--- packages/multicast_dns/example/mdns-sd.dart | 23 ++++++++++--------- 3 files changed, 18 insertions(+), 17 deletions(-) diff --git a/packages/multicast_dns/example/main.dart b/packages/multicast_dns/example/main.dart index e59a259..fa63163 100644 --- a/packages/multicast_dns/example/main.dart +++ b/packages/multicast_dns/example/main.dart @@ -17,13 +17,13 @@ void main() async { // Get the PTR recod for the service. await for (PtrResourceRecord ptr - in client.lookup(ResourceRecordQuery.ptr(name))) { + in client.lookup(ResourceRecordQuery.ptr(name))) { // Use the domainName from the PTR record to get the SRV record, // which will have the port and local hostname. // Note that duplicate messages may come through, especially if any // other mDNS queries are running elsewhere on the machine. - await for (SrvResourceRecord srv - in client.lookup(ResourceRecordQuery.srv(ptr.domainName))) { + await for (SrvResourceRecord srv in client + .lookup(ResourceRecordQuery.srv(ptr.domainName))) { // Domain name will be something like "io.flutter.example@some-iphone.local._dartobservatory._tcp.local" final String bundleId = ptr.domainName.substring(0, ptr.domainName.indexOf('@')); diff --git a/packages/multicast_dns/example/mdns-resolve.dart b/packages/multicast_dns/example/mdns-resolve.dart index cd1f7c6..f8528ec 100644 --- a/packages/multicast_dns/example/mdns-resolve.dart +++ b/packages/multicast_dns/example/mdns-resolve.dart @@ -22,12 +22,12 @@ For example: final MDnsClient client = MDnsClient(); await client.start(); await for (IPAddressResourceRecord record - in client.lookup(ResourceRecordQuery.a(name))) { + in client.lookup(ResourceRecordQuery.a(name))) { print('Found address (${record.address}).'); } - await for (IPAddressResourceRecord record - in client.lookup(ResourceRecordQuery.aaaa(name))) { + await for (IPAddressResourceRecord record in client + .lookup(ResourceRecordQuery.aaaa(name))) { print('Found address (${record.address}).'); } client.stop(); diff --git a/packages/multicast_dns/example/mdns-sd.dart b/packages/multicast_dns/example/mdns-sd.dart index bdb1eda..8270907 100644 --- a/packages/multicast_dns/example/mdns-sd.dart +++ b/packages/multicast_dns/example/mdns-sd.dart @@ -23,35 +23,36 @@ For example: await client.start(); await for (PtrResourceRecord ptr - in client.lookup(ResourceRecordQuery.ptr(name))) { + in client.lookup(ResourceRecordQuery.ptr(name))) { if (verbose) { print(ptr); } - await for (SrvResourceRecord srv - in client.lookup(ResourceRecordQuery.srv(ptr.domainName))) { + await for (SrvResourceRecord srv in client + .lookup(ResourceRecordQuery.srv(ptr.domainName))) { if (verbose) { print(srv); } if (verbose) { await client - .lookup(ResourceRecordQuery.txt(ptr.domainName)) + .lookup(ResourceRecordQuery.txt(ptr.domainName)) .forEach(print); } - await for (IPAddressResourceRecord ip - in client.lookup(ResourceRecordQuery.a(srv.target))) { + await for (IPAddressResourceRecord ip in client + .lookup(ResourceRecordQuery.a(srv.target))) { if (verbose) { print(ip); } - print( - 'Service instance found at ${srv.target}:${srv.port} with ${ip.address}.'); + print('Service instance found at ' + '${srv.target}:${srv.port} with ${ip.address}.'); } await for (IPAddressResourceRecord ip - in client.lookup(ResourceRecordQuery.aaaa(srv.target))) { + in client.lookup( + ResourceRecordQuery.aaaa(srv.target))) { if (verbose) { print(ip); } - print( - 'Service instance found at ${srv.target}:${srv.port} with ${ip.address}.'); + print('Service instance found at ' + '${srv.target}:${srv.port} with ${ip.address}.'); } } } From 39654ab1508bd22788dc8775075fedb84a7447dd Mon Sep 17 00:00:00 2001 From: Dan Field Date: Fri, 2 Nov 2018 12:38:23 -0700 Subject: [PATCH 020/118] minor fixes --- packages/multicast_dns/example/main.dart | 2 +- packages/multicast_dns/lib/multicast_dns.dart | 38 +++++++++++++++++-- packages/multicast_dns/lib/src/constants.dart | 4 +- 3 files changed, 38 insertions(+), 6 deletions(-) diff --git a/packages/multicast_dns/example/main.dart b/packages/multicast_dns/example/main.dart index fa63163..643930d 100644 --- a/packages/multicast_dns/example/main.dart +++ b/packages/multicast_dns/example/main.dart @@ -26,7 +26,7 @@ void main() async { .lookup(ResourceRecordQuery.srv(ptr.domainName))) { // Domain name will be something like "io.flutter.example@some-iphone.local._dartobservatory._tcp.local" final String bundleId = - ptr.domainName.substring(0, ptr.domainName.indexOf('@')); + ptr.domainName; //.substring(0, ptr.domainName.indexOf('@')); print('Dart observatory instance found at ' '${srv.target}:${srv.port} for "$bundleId".'); } diff --git a/packages/multicast_dns/lib/multicast_dns.dart b/packages/multicast_dns/lib/multicast_dns.dart index 38d4801..07a3f1c 100644 --- a/packages/multicast_dns/lib/multicast_dns.dart +++ b/packages/multicast_dns/lib/multicast_dns.dart @@ -72,14 +72,17 @@ class MDnsClient { // Listen on all addresses. _incoming = await RawDatagramSocket.bind( - InternetAddress.anyIPv4, + listenAddress.address, mDnsPort, reuseAddress: true, reusePort: true, ttl: 255, ); - _sockets.add(_incoming); + // Can't send to IPv6 any address. + if (_incoming.address != InternetAddress.anyIPv6) { + _sockets.add(_incoming); + } _mDnsAddress = _incoming.address.type == InternetAddressType.IPv4 ? mDnsAddressIPv4 @@ -98,12 +101,21 @@ class MDnsClient { ttl: 255, ); _sockets.add(socket); + // socket.listen(_handleIncoming); // Join multicast on this interface. + print('Adding ${socket.address} to group'); _incoming.joinMulticast(_mDnsAddress, interface); + print(socket.multicastAddress); + + socket.multicastAddress = interface.addresses[0]; + print(socket.multicastAddress); + socket.multicastAddress = null; + print(socket.multicastAddress); + socket.multicastAddress = interface.addresses[0]; + print(socket.multicastAddress); } _incoming.listen(_handleIncoming); - _started = true; _starting = false; } @@ -171,6 +183,7 @@ class MDnsClient { final Datagram datagram = _incoming.receive(); // check for published responses + // _dumpDatagram(datagram); final List response = decodeMDnsResponse(datagram.data); if (response != null) { _cache.updateRecords(response); @@ -181,3 +194,22 @@ class MDnsClient { } } } + +void _dumpDatagram(Datagram datagram) { + String _toHex(List ints) { + final StringBuffer buffer = StringBuffer(); + for (int i = 0; i < ints.length; i++) { + buffer.write(ints[i].toRadixString(16).padLeft(2, '0')); + if ((i + 1) % 10 == 0) { + buffer.writeln(); + } else { + buffer.write(' '); + } + } + return buffer.toString(); + } + + print('${datagram.address.address}:${datagram.port}:'); + print(_toHex(datagram.data)); + print(''); +} diff --git a/packages/multicast_dns/lib/src/constants.dart b/packages/multicast_dns/lib/src/constants.dart index 6c981a9..2a22264 100644 --- a/packages/multicast_dns/lib/src/constants.dart +++ b/packages/multicast_dns/lib/src/constants.dart @@ -5,10 +5,10 @@ import 'dart:io'; /// The IPv4 mDNS Address. -InternetAddress mDnsAddressIPv4 = InternetAddress('224.0.0.251'); +final InternetAddress mDnsAddressIPv4 = InternetAddress('224.0.0.251'); /// The IPv6 mDNS Address. -InternetAddress mDnsAddressIPv6 = InternetAddress('FF02::FB'); +final InternetAddress mDnsAddressIPv6 = InternetAddress('FF02::FB'); /// The mDNS port. const int mDnsPort = 5353; From e8414a6ec745cf0ce86ea04d2d99d2748f63f998 Mon Sep 17 00:00:00 2001 From: Dan Field Date: Tue, 6 Nov 2018 22:48:12 -0800 Subject: [PATCH 021/118] remvoe debugging cde --- packages/multicast_dns/lib/multicast_dns.dart | 9 --------- 1 file changed, 9 deletions(-) diff --git a/packages/multicast_dns/lib/multicast_dns.dart b/packages/multicast_dns/lib/multicast_dns.dart index 07a3f1c..803a7f2 100644 --- a/packages/multicast_dns/lib/multicast_dns.dart +++ b/packages/multicast_dns/lib/multicast_dns.dart @@ -104,16 +104,7 @@ class MDnsClient { // socket.listen(_handleIncoming); // Join multicast on this interface. - print('Adding ${socket.address} to group'); _incoming.joinMulticast(_mDnsAddress, interface); - print(socket.multicastAddress); - - socket.multicastAddress = interface.addresses[0]; - print(socket.multicastAddress); - socket.multicastAddress = null; - print(socket.multicastAddress); - socket.multicastAddress = interface.addresses[0]; - print(socket.multicastAddress); } _incoming.listen(_handleIncoming); _started = true; From d8bd6fcedfa23ea3049db7131baec41572442376 Mon Sep 17 00:00:00 2001 From: Dan Field Date: Wed, 7 Nov 2018 00:24:18 -0800 Subject: [PATCH 022/118] move dumpDatagram to tools --- packages/multicast_dns/lib/multicast_dns.dart | 19 ---------------- packages/multicast_dns/tool/packet_gen.dart | 22 +++++++++++++++++++ 2 files changed, 22 insertions(+), 19 deletions(-) diff --git a/packages/multicast_dns/lib/multicast_dns.dart b/packages/multicast_dns/lib/multicast_dns.dart index 803a7f2..db86440 100644 --- a/packages/multicast_dns/lib/multicast_dns.dart +++ b/packages/multicast_dns/lib/multicast_dns.dart @@ -185,22 +185,3 @@ class MDnsClient { } } } - -void _dumpDatagram(Datagram datagram) { - String _toHex(List ints) { - final StringBuffer buffer = StringBuffer(); - for (int i = 0; i < ints.length; i++) { - buffer.write(ints[i].toRadixString(16).padLeft(2, '0')); - if ((i + 1) % 10 == 0) { - buffer.writeln(); - } else { - buffer.write(' '); - } - } - return buffer.toString(); - } - - print('${datagram.address.address}:${datagram.port}:'); - print(_toHex(datagram.data)); - print(''); -} diff --git a/packages/multicast_dns/tool/packet_gen.dart b/packages/multicast_dns/tool/packet_gen.dart index 33dffc3..4322336 100644 --- a/packages/multicast_dns/tool/packet_gen.dart +++ b/packages/multicast_dns/tool/packet_gen.dart @@ -4,6 +4,8 @@ // Support code to generate the hex-lists in test/decode_test.dart from // a hex-stream. +import 'dart:io'; + void formatHexStream(String hexStream) { String s = ''; for (int i = 0; i < hexStream.length / 2; i++) { @@ -47,3 +49,23 @@ void hexDumpList(List package) { print(s); } } + + +void dumpDatagram(Datagram datagram) { + String _toHex(List ints) { + final StringBuffer buffer = StringBuffer(); + for (int i = 0; i < ints.length; i++) { + buffer.write(ints[i].toRadixString(16).padLeft(2, '0')); + if ((i + 1) % 10 == 0) { + buffer.writeln(); + } else { + buffer.write(' '); + } + } + return buffer.toString(); + } + + print('${datagram.address.address}:${datagram.port}:'); + print(_toHex(datagram.data)); + print(''); +} \ No newline at end of file From 1cce45d9a702c61ec6a712fbd1840e0474d8ab91 Mon Sep 17 00:00:00 2001 From: Dan Field Date: Wed, 7 Nov 2018 00:31:47 -0800 Subject: [PATCH 023/118] format --- packages/multicast_dns/tool/packet_gen.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/multicast_dns/tool/packet_gen.dart b/packages/multicast_dns/tool/packet_gen.dart index 4322336..ac6e3c1 100644 --- a/packages/multicast_dns/tool/packet_gen.dart +++ b/packages/multicast_dns/tool/packet_gen.dart @@ -68,4 +68,4 @@ void dumpDatagram(Datagram datagram) { print('${datagram.address.address}:${datagram.port}:'); print(_toHex(datagram.data)); print(''); -} \ No newline at end of file +} From 01205ea79e97b0f30028dc2db1d08fbccf841f94 Mon Sep 17 00:00:00 2001 From: Dan Field Date: Wed, 16 Jan 2019 23:31:12 -0800 Subject: [PATCH 024/118] Set socket options --- packages/multicast_dns/lib/multicast_dns.dart | 19 ++++++++++++++++--- packages/multicast_dns/tool/packet_gen.dart | 1 - 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/packages/multicast_dns/lib/multicast_dns.dart b/packages/multicast_dns/lib/multicast_dns.dart index db86440..4efb22f 100644 --- a/packages/multicast_dns/lib/multicast_dns.dart +++ b/packages/multicast_dns/lib/multicast_dns.dart @@ -93,16 +93,29 @@ class MDnsClient { for (NetworkInterface interface in interfaces) { // Create a socket for sending on each adapter. + final InternetAddress targetAddress = interface.addresses[0]; final RawDatagramSocket socket = await RawDatagramSocket.bind( - interface.addresses[0], + targetAddress, mDnsPort, reuseAddress: true, reusePort: true, ttl: 255, ); _sockets.add(socket); - // socket.listen(_handleIncoming); - + // Ensure that we're using this address/interface for multicast. + if (targetAddress.type == InternetAddressType.IPv4) { + socket.setRawOption(RawSocketOption( + RawSocketOption.levelIPv4, + RawSocketOption.IPv4MulticastInterface, + targetAddress.rawAddress, + )); + } else { + socket.setRawOption(RawSocketOption.fromInt( + RawSocketOption.levelIPv6, + RawSocketOption.IPv6MulticastInterface, + interface.index, + )); + } // Join multicast on this interface. _incoming.joinMulticast(_mDnsAddress, interface); } diff --git a/packages/multicast_dns/tool/packet_gen.dart b/packages/multicast_dns/tool/packet_gen.dart index ac6e3c1..36486be 100644 --- a/packages/multicast_dns/tool/packet_gen.dart +++ b/packages/multicast_dns/tool/packet_gen.dart @@ -50,7 +50,6 @@ void hexDumpList(List package) { } } - void dumpDatagram(Datagram datagram) { String _toHex(List ints) { final StringBuffer buffer = StringBuffer(); From 34e1cf11ab4f2b5f560b1b5cd13c6bda63d1536b Mon Sep 17 00:00:00 2001 From: Dan Field Date: Fri, 18 Jan 2019 23:37:40 -0800 Subject: [PATCH 025/118] bump From fa4ec4367b20662e0ce418e77a7b0ae9fa43cd32 Mon Sep 17 00:00:00 2001 From: Dan Field Date: Fri, 18 Jan 2019 23:42:07 -0800 Subject: [PATCH 026/118] update version constraint, fix analyzer issues --- packages/multicast_dns/pubspec.yaml | 2 +- packages/multicast_dns/test/lookup_resolver_test.dart | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/multicast_dns/pubspec.yaml b/packages/multicast_dns/pubspec.yaml index a0a5fbb..cc35f15 100644 --- a/packages/multicast_dns/pubspec.yaml +++ b/packages/multicast_dns/pubspec.yaml @@ -11,4 +11,4 @@ dev_dependencies: test: "^1.3.4" environment: - sdk: ">=2.1.0-dev.7.1 <3.0.0" + sdk: ">=2.1.1-dev.2.0 <3.0.0" diff --git a/packages/multicast_dns/test/lookup_resolver_test.dart b/packages/multicast_dns/test/lookup_resolver_test.dart index 0628a53..3c164d4 100644 --- a/packages/multicast_dns/test/lookup_resolver_test.dart +++ b/packages/multicast_dns/test/lookup_resolver_test.dart @@ -22,7 +22,7 @@ ResourceRecord ip4Result(String name, InternetAddress address) { void testTimeout() { test('Resolver does not return with short timeout', () async { - final Duration shortTimeout = Duration(milliseconds: 1); + const Duration shortTimeout = Duration(milliseconds: 1); final LookupResolver resolver = LookupResolver(); final Stream result = resolver.addPendingRequest(ResourceRecordType.a, 'xxx', shortTimeout); @@ -33,7 +33,7 @@ void testTimeout() { // One pending request and one response. void testResult() { test('One pending request and one response', () async { - final Duration noTimeout = Duration(days: 1); + const Duration noTimeout = Duration(days: 1); final LookupResolver resolver = LookupResolver(); final Stream futureResult = resolver.addPendingRequest( ResourceRecordType.a, 'xxx.local', noTimeout); @@ -48,7 +48,7 @@ void testResult() { void testResult2() { test('Two requests', () async { - final Duration noTimeout = Duration(days: 1); + const Duration noTimeout = Duration(days: 1); final LookupResolver resolver = LookupResolver(); final Stream futureResult1 = resolver.addPendingRequest( ResourceRecordType.a, 'xxx.local', noTimeout); @@ -69,7 +69,7 @@ void testResult2() { void testResult3() { test('Multiple requests', () async { - final Duration noTimeout = Duration(days: 1); + const Duration noTimeout = Duration(days: 1); final LookupResolver resolver = LookupResolver(); final ResourceRecord response0 = ip4Result('zzz.local', InternetAddress('2.3.4.5')); From dfd64e1cf84e511a1ba047db65ff7f4a6626d78a Mon Sep 17 00:00:00 2001 From: Dan Field Date: Wed, 23 Jan 2019 16:23:19 -0800 Subject: [PATCH 027/118] Fix cache, var names, comments --- packages/multicast_dns/LICENSE | 2 +- packages/multicast_dns/lib/multicast_dns.dart | 34 ++++---- .../lib/src/lookup_resolver.dart | 27 +++--- .../lib/src/native_protocol_client.dart | 84 ++++++++++--------- packages/multicast_dns/lib/src/packet.dart | 74 ++++++++-------- .../lib/src/resource_record.dart | 69 ++++++++------- .../test/lookup_resolver_test.dart | 12 +-- ...e.dart => resource_record_cache_test.dart} | 26 ++---- 8 files changed, 166 insertions(+), 162 deletions(-) rename packages/multicast_dns/test/{resource_record_cache.dart => resource_record_cache_test.dart} (84%) diff --git a/packages/multicast_dns/LICENSE b/packages/multicast_dns/LICENSE index 8211a02..73e6b6e 100644 --- a/packages/multicast_dns/LICENSE +++ b/packages/multicast_dns/LICENSE @@ -1,4 +1,4 @@ -Copyright 2014 The Chromium Authors. All rights reserved. +Copyright 2019 The Flutter Authors. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are diff --git a/packages/multicast_dns/lib/multicast_dns.dart b/packages/multicast_dns/lib/multicast_dns.dart index 4efb22f..220add7 100644 --- a/packages/multicast_dns/lib/multicast_dns.dart +++ b/packages/multicast_dns/lib/multicast_dns.dart @@ -13,9 +13,11 @@ import 'package:multicast_dns/src/resource_record.dart'; export 'package:multicast_dns/src/resource_record.dart'; -/// A callback type for [MDnsQuerier.start] to iterate available network interfaces. +/// A callback type for [MDnsQuerier.start] to iterate available network +/// interfaces. /// -/// Impelmentations must ensure they return interfaces appropriate for the [type] parameter. +/// Implementations must ensure they return interfaces appropriate for the +/// [type] parameter. /// /// See also: /// * [MDnsQuerier.allInterfacesFactory] @@ -24,10 +26,11 @@ typedef NetworkInterfacesFactory = Future> Function( /// Client for DNS lookup and publishing using the mDNS protocol. /// -/// Users should call [MDnsQuerier.start] when ready to start querying and listening. -/// [MDnsQuerier.stop] must be called when done to clean up resources. +/// Users should call [MDnsQuerier.start] when ready to start querying and +/// listening. [MDnsQuerier.stop] must be called when done to clean up +/// resources. /// -/// This client only support "One-Shot Multicast DNS Queries" as described in +/// This client only supports "One-Shot Multicast DNS Queries" as described in /// section 5.1 of [RFC 6762](https://tools.ietf.org/html/rfc6762). class MDnsClient { bool _starting = false; @@ -142,22 +145,22 @@ class MDnsClient { _started = false; } - /// Lookup a [ResourceRecord], potentially from cache. + /// Lookup a [ResourceRecord], potentially from the cache. /// - /// The [type] parameter must be a valid [ResourceRecordType]. The [name] parameter is - /// the name of the service to lookup, and must not be null. The [timeout] - /// parameter specifies how long the intenral cache should hold on to the - /// record. The [multicast] parameter specifies whether the query should be - /// sent as unicast (QU) or multicast (QM). + /// The [type] parameter must be a valid [ResourceRecordType]. The [name] + /// parameter is the name of the service to lookup, and must not be null. The + /// [timeout] parameter specifies how long the internal cache should hold on + /// to the record. The [multicast] parameter specifies whether the query + /// should be sent as unicast (QU) or multicast (QM). /// - /// Note that some publishers have been observed to not respond to unicast - /// requests properly, so the default is true. + /// Some publishers have been observed to not respond to unicast requests + /// properly, so the default is true. Stream lookup( ResourceRecordQuery query, { Duration timeout = const Duration(seconds: 5), }) { if (!_started) { - throw StateError('mDNS client is not started.'); + throw StateError('mDNS client must be started before calling lookup.'); } // Look for entries in the cache. final List cached = []; @@ -186,8 +189,7 @@ class MDnsClient { if (event == RawSocketEvent.read) { final Datagram datagram = _incoming.receive(); - // check for published responses - // _dumpDatagram(datagram); + // Check for published responses. final List response = decodeMDnsResponse(datagram.data); if (response != null) { _cache.updateRecords(response); diff --git a/packages/multicast_dns/lib/src/lookup_resolver.dart b/packages/multicast_dns/lib/src/lookup_resolver.dart index b6381d9..b374e9f 100644 --- a/packages/multicast_dns/lib/src/lookup_resolver.dart +++ b/packages/multicast_dns/lib/src/lookup_resolver.dart @@ -10,13 +10,16 @@ import 'package:multicast_dns/src/resource_record.dart'; /// Class for maintaining state about pending mDNS requests. class PendingRequest extends LinkedListEntry { /// Creates a new PendingRequest. - PendingRequest(this.type, this.name, this.controller); + PendingRequest(this.type, this.domainName, this.controller); /// The [ResourceRecordType] of the request. final int type; - /// The domain name. - final String name; + /// The domain name to look up via mDNS. + /// + /// For example, `'_http._tcp.local` to look up HTTP services on the local + /// domain. + final String domainName; /// A StreamController managing the request. final StreamController controller; @@ -25,11 +28,10 @@ class PendingRequest extends LinkedListEntry { Timer timer; } -/// Class for keeping track of pending lookups and process incoming +/// Class for keeping track of pending lookups and processing incoming /// query responses. class LookupResolver { - /// The requests the process. - final LinkedList pendingRequests = + final LinkedList _pendingRequests = LinkedList(); /// Adds a request and returns a [Stream] of [ResourceRecord] responses. @@ -42,11 +44,12 @@ class LookupResolver { controller.close(); }); request.timer = timer; - pendingRequests.add(request); + _pendingRequests.add(request); return controller.stream; } - /// Processes responses back to the caller. + /// Parses [ResoureRecord]s received and delivers them to the appropriate + /// listener(s) added via [addPendingRequest]. void handleResponse(List response) { for (ResourceRecord r in response) { final int type = r.resourceRecordType; @@ -56,7 +59,7 @@ class LookupResolver { } bool responseMatches(PendingRequest request) { - String requestName = request.name.toLowerCase(); + String requestName = request.domainName.toLowerCase(); // make, e.g. "_http" become "_http._tcp.local". if (!requestName.endsWith('local')) { if (!requestName.endsWith('._tcp.local') && @@ -70,7 +73,7 @@ class LookupResolver { return requestName == name && request.type == type; } - for (PendingRequest pendingRequest in pendingRequests) { + for (PendingRequest pendingRequest in _pendingRequests) { if (responseMatches(pendingRequest)) { if (pendingRequest.controller.isClosed) { return; @@ -83,8 +86,8 @@ class LookupResolver { /// Removes any pending requests and ends processing. void clearPendingRequests() { - while (pendingRequests.isNotEmpty) { - final PendingRequest request = pendingRequests.first; + while (_pendingRequests.isNotEmpty) { + final PendingRequest request = _pendingRequests.first; request.unlink(); request.timer.cancel(); request.controller.close(); diff --git a/packages/multicast_dns/lib/src/native_protocol_client.dart b/packages/multicast_dns/lib/src/native_protocol_client.dart index 7ee9d90..40b98a6 100644 --- a/packages/multicast_dns/lib/src/native_protocol_client.dart +++ b/packages/multicast_dns/lib/src/native_protocol_client.dart @@ -2,53 +2,55 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. +import 'dart:collection'; + import 'package:multicast_dns/src/resource_record.dart'; /// Cache for resource records that have been received. /// /// There can be multiple entries for the same name and type. /// -/// The cached is updated with a list of records, because it needs to remove -/// all entries that correspond to name and type of the name/type combinations -/// of records that should be updated. For example, a host may remove one -/// of its IP addresses and report the remaining address as a response - then -/// we need to clear all previous entries for that host before updating the -/// cache. +/// The cache is updated with a list of records, because it needs to remove +/// all entries that correspond to the name and type of the name/type +/// combinations of records that should be updated. For example, a host may +/// remove one of its IP addresses and report the remaining address as a +/// response - then we need to clear all previous entries for that host before +/// updating the cache. class ResourceRecordCache { /// Creates a new ResourceRecordCache. - ResourceRecordCache({this.size = 32}) - : buffer = List(size), - _position = 0; + ResourceRecordCache(); - /// The records in the cache. - final List buffer; + final Map>> _cache = + >>{}; - /// The size of the cache. - final int size; - int _position; + /// The number of entries in the cache. + int get entryCount { + int count = 0; + for (final SplayTreeMap> map in _cache.values) { + for (final List records in map.values) { + count += records?.length; + } + } + return count; + } /// Update the records in this cache. void updateRecords(List records) { // TODO(karlklose): include flush bit in the record and only flush if // necessary. // Clear the cache for all name/type combinations to be updated. - for (int i = 0; i < size; i++) { - final ResourceRecord r = buffer[i % size]; - if (r == null) { - continue; - } - for (ResourceRecord record in records) { - if (r.name == record.name && - r.resourceRecordType == record.resourceRecordType) { - buffer[i % size] = null; - break; - } - } - } - // Add therecords. + final Map> seenRecordTypes = >{}; for (ResourceRecord record in records) { - buffer[_position] = record; - _position = (_position + 1) % size; + seenRecordTypes[record.resourceRecordType] ??= Set(); + if (seenRecordTypes[record.resourceRecordType].add(record.name)) { + _cache[record.resourceRecordType] ??= + SplayTreeMap>(); + + _cache[record.resourceRecordType] + [record.name] = [record]; + } else { + _cache[record.resourceRecordType][record.name].add(record); + } } } @@ -57,17 +59,17 @@ class ResourceRecordCache { String name, int type, List results) { assert(ResourceRecordType.debugAssertValid(type)); final int time = DateTime.now().millisecondsSinceEpoch; - for (int i = _position + size; i >= _position; i--) { - final int index = i % size; - if (buffer[index] is! T) { - continue; - } - final T record = buffer[index]; - if (record.validUntil < time) { - buffer[index] = null; - } else if (record.name == name && record.resourceRecordType == type) { - results.add(record); - } + final SplayTreeMap> candidates = _cache[type]; + if (candidates == null) { + return; + } + + final List candidateRecords = candidates[name]; + if (candidateRecords == null) { + return; } + candidateRecords + .removeWhere((ResourceRecord candidate) => candidate.validUntil < time); + results.addAll(candidateRecords.cast()); } } diff --git a/packages/multicast_dns/lib/src/packet.dart b/packages/multicast_dns/lib/src/packet.dart index 5be1e0f..2bdbf68 100644 --- a/packages/multicast_dns/lib/src/packet.dart +++ b/packages/multicast_dns/lib/src/packet.dart @@ -20,8 +20,8 @@ const int _kHeaderSize = 12; /// Processes a DNS query name into a list of parts. /// -/// Will attempt to append 'local' if name is something like '_http._tcp', and -/// '._tcp.local' if name is something like '_http'. +/// Will attempt to append 'local' if the name is something like '_http._tcp', +/// and '._tcp.local' if name is something like '_http'. List processDnsNameParts(String name) { assert(name != null); final List parts = name.split('.'); @@ -36,13 +36,15 @@ List processDnsNameParts(String name) { /// Encode an mDNS query packet. /// -/// The [type] parameter must be a valid [ResourceRecordType] value. The [multicast] parameter -/// must not be null. +/// The [type] parameter must be a valid [ResourceRecordType] value. The +/// [multicast] parameter must not be null. /// -/// This is a low level API; most consumers should prefer [ResourceRecordQuery.encode]. +/// This is a low level API; most consumers should prefer +/// [ResourceRecordQuery.encode], which offers some convenience wrappers around +/// selecting the correct [type] and setting the [name] parameter correctly. List encodeMDnsQuery( String name, { - int type = ResourceRecordType.a, + int type = ResourceRecordType.addressIPv4, bool multicast = true, }) { assert(name != null); @@ -189,9 +191,8 @@ ResourceRecordQuery decodeMDnsQuery(List packet) { if (flags != 0) { return null; } - // Number of questions. - final int qdcount = packetBytes.getUint16(_kQdcountOffset); - if (qdcount == 0) { + final int questionCount = packetBytes.getUint16(_kQdcountOffset); + if (questionCount == 0) { return null; } @@ -220,14 +221,12 @@ List decodeMDnsResponse(List packet) { packet is Uint8List ? packet : Uint8List.fromList(packet); final ByteData packetBytes = ByteData.view(data.buffer); - // Number of answers. - final int ancount = packetBytes.getUint16(_kAncountOffset); - if (ancount == 0) { + final int answerCount = packetBytes.getUint16(_kAncountOffset); + if (answerCount == 0) { return null; } - // Number of resource records. - final int arcount = packetBytes.getUint16(_kArcountOffset); + final int answerRecordCount = packetBytes.getUint16(_kArcountOffset); int offset = _kHeaderSize; void checkLength(int required) { @@ -261,14 +260,14 @@ List decodeMDnsResponse(List packet) { offset += 4; checkLength(offset + 2); - final int rDataLength = packetBytes.getUint16(offset); + final int readDataLength = packetBytes.getUint16(offset); offset += 2; final int validUntil = DateTime.now().millisecondsSinceEpoch + ttl * 1000; switch (type) { - case ResourceRecordType.a: - checkLength(offset + rDataLength); + case ResourceRecordType.addressIPv4: + checkLength(offset + readDataLength); final StringBuffer addr = StringBuffer(); - final int stop = offset + rDataLength; + final int stop = offset + readDataLength; addr.write(packetBytes.getUint8(offset)); offset++; for (offset; offset < stop; offset++) { @@ -277,10 +276,10 @@ List decodeMDnsResponse(List packet) { } return IPAddressResourceRecord(fqdn, validUntil, address: InternetAddress(addr.toString())); - case ResourceRecordType.aaaa: - checkLength(offset + rDataLength); + case ResourceRecordType.addressIPv6: + checkLength(offset + readDataLength); final StringBuffer addr = StringBuffer(); - final int stop = offset + rDataLength; + final int stop = offset + readDataLength; addr.write(packetBytes.getUint16(offset).toRadixString(16)); offset += 2; for (offset; offset < stop; offset += 2) { @@ -292,7 +291,7 @@ List decodeMDnsResponse(List packet) { validUntil, address: InternetAddress(addr.toString()), ); - case ResourceRecordType.srv: + case ResourceRecordType.service: checkLength(offset + 2); final int priority = packetBytes.getUint16(offset); offset += 2; @@ -314,40 +313,40 @@ List decodeMDnsResponse(List packet) { weight: weight, ); break; - case ResourceRecordType.ptr: - checkLength(offset + rDataLength); + case ResourceRecordType.domainNamePointer: + checkLength(offset + readDataLength); final _FQDNReadResult result = _readFQDN(data, packetBytes, offset, length); - offset += rDataLength; + offset += readDataLength; return PtrResourceRecord( fqdn, validUntil, domainName: result.fqdn, ); - case ResourceRecordType.txt: - checkLength(offset + rDataLength); + case ResourceRecordType.text: + checkLength(offset + readDataLength); final Uint8List rawText = Uint8List.view( data.buffer, offset, - rDataLength, + readDataLength, ); final String text = utf8.decode(rawText); - offset += rDataLength; + offset += readDataLength; return TxtResourceRecord(fqdn, validUntil, text: text); default: - checkLength(offset + rDataLength); - offset += rDataLength; + checkLength(offset + readDataLength); + offset += readDataLength; return null; } } - // Note: this list can't be fixed length right now because we might get + // This list can't be fixed length right now because we might get // resource record types we don't support, and consumers expect this list // to not have null entries. final List result = []; try { - for (int i = 0; i < ancount + arcount; i++) { + for (int i = 0; i < answerCount + answerRecordCount; i++) { final ResourceRecord record = readResourceRecord(); if (record != null) { result.add(record); @@ -360,10 +359,13 @@ List decodeMDnsResponse(List packet) { return result; } -/// Exceptions thrown by decoder when the packet is invalid. +/// This exception is thrown by the decoder when the packet is invalid. class MDnsDecodeException implements Exception { - /// Creates a new MDnsDecodeException. - const MDnsDecodeException(this.offset); + /// Creates a new MDnsDecodeException, indicating an error in decoding at the + /// specified [offset]. + /// + /// The [offset] parameter should not be null. + const MDnsDecodeException(this.offset) : assert(offset != null); /// The offset in the packet at which the exception occurred. final int offset; diff --git a/packages/multicast_dns/lib/src/resource_record.dart b/packages/multicast_dns/lib/src/resource_record.dart index aab4be5..2880e9f 100644 --- a/packages/multicast_dns/lib/src/resource_record.dart +++ b/packages/multicast_dns/lib/src/resource_record.dart @@ -34,20 +34,23 @@ class ResourceRecordType { // extended directly. factory ResourceRecordType._() => null; - /// An IPv4 Address record (1). - static const int a = 1; + /// An IPv4 Address record, also known as an "A" record. It has a value of 1. + static const int addressIPv4 = 1; - /// An IPv6 Address record (28). - static const int aaaa = 28; + /// An IPv6 Address record, also known as an "AAAA" record. It has a vaule of + /// 28. + static const int addressIPv6 = 28; - /// An IP Address reverse map record (12). - static const int ptr = 12; + /// An IP Address reverse map record, also known as a "PTR" recored. It has a + /// value of 12. + static const int domainNamePointer = 12; - /// An available service record (33). - static const int srv = 33; + /// An available service record, also known as an "SRV" record. It has a + /// value of 33. + static const int service = 33; - /// A text record (16). - static const int txt = 16; + /// A text record, also known as a "TXT" record. It has a value of 16. + static const int text = 16; // TODO(dnfield): Support ANY in some meaningful way. Might be server only. // /// A query for all records of all types known to the name server. @@ -55,29 +58,28 @@ class ResourceRecordType { /// Asserts that a given int is a valid ResourceRecordtype. static bool debugAssertValid(int resourceRecordType) { - return resourceRecordType == a || - resourceRecordType == aaaa || - resourceRecordType == ptr || - resourceRecordType == srv || - resourceRecordType == txt; + return resourceRecordType == addressIPv4 || + resourceRecordType == addressIPv6 || + resourceRecordType == domainNamePointer || + resourceRecordType == service || + resourceRecordType == text; } /// Prints a debug-friendly version of the resource record type value. static String toDebugString(int resourceRecordType) { switch (resourceRecordType) { - case a: + case addressIPv4: return 'A (IPv4 Address)'; - case aaaa: + case addressIPv6: return 'AAAA (IPv6 Address)'; - case ptr: + case domainNamePointer: return 'PTR (Domain Name Pointer)'; - case srv: + case service: return 'SRV (Service record)'; - case txt: + case text: return 'TXT (Text)'; - default: - return 'Unknown ($resourceRecordType)'; } + return 'Unknown ($resourceRecordType)'; } } @@ -98,7 +100,7 @@ class ResourceRecordQuery { String name, { bool isMulticast = true, }) : this( - ResourceRecordType.a, + ResourceRecordType.addressIPv4, name, isMulticast ? QuestionType.multicast : QuestionType.unicast, ); @@ -108,7 +110,7 @@ class ResourceRecordQuery { String name, { bool isMulticast = true, }) : this( - ResourceRecordType.aaaa, + ResourceRecordType.addressIPv6, name, isMulticast ? QuestionType.multicast : QuestionType.unicast, ); @@ -118,7 +120,7 @@ class ResourceRecordQuery { String name, { bool isMulticast = true, }) : this( - ResourceRecordType.ptr, + ResourceRecordType.domainNamePointer, name, isMulticast ? QuestionType.multicast : QuestionType.unicast, ); @@ -128,7 +130,7 @@ class ResourceRecordQuery { String name, { bool isMulticast = true, }) : this( - ResourceRecordType.srv, + ResourceRecordType.service, name, isMulticast ? QuestionType.multicast : QuestionType.unicast, ); @@ -138,7 +140,7 @@ class ResourceRecordQuery { String name, { bool isMulticast = true, }) : this( - ResourceRecordType.txt, + ResourceRecordType.text, name, isMulticast ? QuestionType.multicast : QuestionType.unicast, ); @@ -227,6 +229,9 @@ abstract class ResourceRecord { ]); } + + // Subclasses of this class should use _hashValues to create a hash code + // that will then get hashed in with the common values on this class. @protected int get _hashCode; @@ -242,7 +247,7 @@ class PtrResourceRecord extends ResourceRecord { int validUntil, { @required this.domainName, }) : assert(domainName != null), - super(ResourceRecordType.ptr, name, validUntil); + super(ResourceRecordType.domainNamePointer, name, validUntil); /// The FQDN for this record. final String domainName; @@ -275,8 +280,8 @@ class IPAddressResourceRecord extends ResourceRecord { @required this.address, }) : super( address.type == InternetAddressType.IPv4 - ? ResourceRecordType.a - : ResourceRecordType.aaaa, + ? ResourceRecordType.addressIPv4 + : ResourceRecordType.addressIPv6, name, validUntil); @@ -314,7 +319,7 @@ class SrvResourceRecord extends ResourceRecord { assert(port != null), assert(priority != null), assert(weight != null), - super(ResourceRecordType.srv, name, validUntil); + super(ResourceRecordType.service, name, validUntil); /// The hostname for this record. final String target; @@ -370,7 +375,7 @@ class TxtResourceRecord extends ResourceRecord { int validUntil, { @required this.text, }) : assert(text != null), - super(ResourceRecordType.txt, name, validUntil); + super(ResourceRecordType.text, name, validUntil); /// The raw text from this record. final String text; diff --git a/packages/multicast_dns/test/lookup_resolver_test.dart b/packages/multicast_dns/test/lookup_resolver_test.dart index 3c164d4..775d5dc 100644 --- a/packages/multicast_dns/test/lookup_resolver_test.dart +++ b/packages/multicast_dns/test/lookup_resolver_test.dart @@ -25,7 +25,7 @@ void testTimeout() { const Duration shortTimeout = Duration(milliseconds: 1); final LookupResolver resolver = LookupResolver(); final Stream result = - resolver.addPendingRequest(ResourceRecordType.a, 'xxx', shortTimeout); + resolver.addPendingRequest(ResourceRecordType.addressIPv4, 'xxx', shortTimeout); expect(await result.isEmpty, isTrue); }); } @@ -36,7 +36,7 @@ void testResult() { const Duration noTimeout = Duration(days: 1); final LookupResolver resolver = LookupResolver(); final Stream futureResult = resolver.addPendingRequest( - ResourceRecordType.a, 'xxx.local', noTimeout); + ResourceRecordType.addressIPv4, 'xxx.local', noTimeout); final ResourceRecord response = ip4Result('xxx.local', InternetAddress('1.2.3.4')); resolver.handleResponse([response]); @@ -51,9 +51,9 @@ void testResult2() { const Duration noTimeout = Duration(days: 1); final LookupResolver resolver = LookupResolver(); final Stream futureResult1 = resolver.addPendingRequest( - ResourceRecordType.a, 'xxx.local', noTimeout); + ResourceRecordType.addressIPv4, 'xxx.local', noTimeout); final Stream futureResult2 = resolver.addPendingRequest( - ResourceRecordType.a, 'yyy.local', noTimeout); + ResourceRecordType.addressIPv4, 'yyy.local', noTimeout); final ResourceRecord response1 = ip4Result('xxx.local', InternetAddress('1.2.3.4')); final ResourceRecord response2 = @@ -75,10 +75,10 @@ void testResult3() { ip4Result('zzz.local', InternetAddress('2.3.4.5')); resolver.handleResponse([response0]); final Stream futureResult1 = resolver.addPendingRequest( - ResourceRecordType.a, 'xxx.local', noTimeout); + ResourceRecordType.addressIPv4, 'xxx.local', noTimeout); resolver.handleResponse([response0]); final Stream futureResult2 = resolver.addPendingRequest( - ResourceRecordType.a, 'yyy.local', noTimeout); + ResourceRecordType.addressIPv4, 'yyy.local', noTimeout); resolver.handleResponse([response0]); final ResourceRecord response1 = ip4Result('xxx.local', InternetAddress('1.2.3.4')); diff --git a/packages/multicast_dns/test/resource_record_cache.dart b/packages/multicast_dns/test/resource_record_cache_test.dart similarity index 84% rename from packages/multicast_dns/test/resource_record_cache.dart rename to packages/multicast_dns/test/resource_record_cache_test.dart index df4eb34..1b9130f 100644 --- a/packages/multicast_dns/test/resource_record_cache.dart +++ b/packages/multicast_dns/test/resource_record_cache_test.dart @@ -13,16 +13,6 @@ import 'package:multicast_dns/src/resource_record.dart'; import 'package:multicast_dns/src/native_protocol_client.dart' show ResourceRecordCache; -int entries(ResourceRecordCache cache) { - int c = 0; - for (int i = 0; i < cache.size; i++) { - if (cache.buffer[i] != null) { - ++c; - } - } - return c; -} - void main() { testOverwrite(); testTimeout(); @@ -41,14 +31,14 @@ void testOverwrite() { IPAddressResourceRecord('hest', valid, address: ip1), IPAddressResourceRecord('fisk', valid, address: ip2) ]); - expect(entries(cache), 2); + expect(cache.entryCount, 2); // Update these records. cache.updateRecords([ IPAddressResourceRecord('hest', valid, address: ip1), IPAddressResourceRecord('fisk', valid, address: ip2) ]); - expect(entries(cache), 2); + expect(cache.entryCount, 2); // Add two records with the same name (should remove the old one // with that name only.) @@ -56,13 +46,13 @@ void testOverwrite() { IPAddressResourceRecord('hest', valid, address: ip1), IPAddressResourceRecord('hest', valid, address: ip2) ]); - expect(entries(cache), 3); + expect(cache.entryCount, 3); // Overwrite the two cached entries with one with the same name. cache.updateRecords([ IPAddressResourceRecord('hest', valid, address: ip1), ]); - expect(entries(cache), 2); + expect(cache.entryCount, 2); }); } @@ -76,19 +66,19 @@ void testTimeout() { cache.updateRecords( [IPAddressResourceRecord('hest', valid, address: ip1)]); - expect(entries(cache), 1); + expect(cache.entryCount, 1); cache.updateRecords([ IPAddressResourceRecord('fisk', notValid, address: ip1) ]); List results = []; - cache.lookup('hest', ResourceRecordType.a, results); + cache.lookup('hest', ResourceRecordType.addressIPv4, results); expect(results.isEmpty, isFalse); results = []; - cache.lookup('fisk', ResourceRecordType.a, results); + cache.lookup('fisk', ResourceRecordType.addressIPv4, results); expect(results.isEmpty, isTrue); - expect(entries(cache), 1); + expect(cache.entryCount, 1); }); } From 1aecd8d683439cdb12cf9e265e05db72db33f6ea Mon Sep 17 00:00:00 2001 From: Dan Field Date: Wed, 23 Jan 2019 16:25:09 -0800 Subject: [PATCH 028/118] one missed comment --- packages/multicast_dns/lib/src/resource_record.dart | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/multicast_dns/lib/src/resource_record.dart b/packages/multicast_dns/lib/src/resource_record.dart index 2880e9f..389b48d 100644 --- a/packages/multicast_dns/lib/src/resource_record.dart +++ b/packages/multicast_dns/lib/src/resource_record.dart @@ -56,7 +56,9 @@ class ResourceRecordType { // /// A query for all records of all types known to the name server. // static const int any = 255; - /// Asserts that a given int is a valid ResourceRecordtype. + /// Checks that a given int is a valid ResourceRecordType. + /// + /// This method is intended to be called only from an `assert()`. static bool debugAssertValid(int resourceRecordType) { return resourceRecordType == addressIPv4 || resourceRecordType == addressIPv6 || From 859918551d20bb1f3191572ab0ba42792c8d7683 Mon Sep 17 00:00:00 2001 From: Dan Field Date: Wed, 23 Jan 2019 16:30:14 -0800 Subject: [PATCH 029/118] missed renames --- packages/multicast_dns/example/main.dart | 4 +-- .../multicast_dns/example/mdns-resolve.dart | 4 +-- packages/multicast_dns/example/mdns-sd.dart | 10 +++--- packages/multicast_dns/lib/multicast_dns.dart | 6 ++-- packages/multicast_dns/lib/src/packet.dart | 2 +- .../lib/src/resource_record.dart | 34 +++++++++---------- 6 files changed, 30 insertions(+), 30 deletions(-) diff --git a/packages/multicast_dns/example/main.dart b/packages/multicast_dns/example/main.dart index 643930d..09bcc7c 100644 --- a/packages/multicast_dns/example/main.dart +++ b/packages/multicast_dns/example/main.dart @@ -17,13 +17,13 @@ void main() async { // Get the PTR recod for the service. await for (PtrResourceRecord ptr - in client.lookup(ResourceRecordQuery.ptr(name))) { + in client.lookup(ResourceRecordQuery.serverPointer(name))) { // Use the domainName from the PTR record to get the SRV record, // which will have the port and local hostname. // Note that duplicate messages may come through, especially if any // other mDNS queries are running elsewhere on the machine. await for (SrvResourceRecord srv in client - .lookup(ResourceRecordQuery.srv(ptr.domainName))) { + .lookup(ResourceRecordQuery.service(ptr.domainName))) { // Domain name will be something like "io.flutter.example@some-iphone.local._dartobservatory._tcp.local" final String bundleId = ptr.domainName; //.substring(0, ptr.domainName.indexOf('@')); diff --git a/packages/multicast_dns/example/mdns-resolve.dart b/packages/multicast_dns/example/mdns-resolve.dart index f8528ec..65b7727 100644 --- a/packages/multicast_dns/example/mdns-resolve.dart +++ b/packages/multicast_dns/example/mdns-resolve.dart @@ -22,12 +22,12 @@ For example: final MDnsClient client = MDnsClient(); await client.start(); await for (IPAddressResourceRecord record - in client.lookup(ResourceRecordQuery.a(name))) { + in client.lookup(ResourceRecordQuery.addressIPv4(name))) { print('Found address (${record.address}).'); } await for (IPAddressResourceRecord record in client - .lookup(ResourceRecordQuery.aaaa(name))) { + .lookup(ResourceRecordQuery.addressIPv6(name))) { print('Found address (${record.address}).'); } client.stop(); diff --git a/packages/multicast_dns/example/mdns-sd.dart b/packages/multicast_dns/example/mdns-sd.dart index 8270907..b578ba9 100644 --- a/packages/multicast_dns/example/mdns-sd.dart +++ b/packages/multicast_dns/example/mdns-sd.dart @@ -23,22 +23,22 @@ For example: await client.start(); await for (PtrResourceRecord ptr - in client.lookup(ResourceRecordQuery.ptr(name))) { + in client.lookup(ResourceRecordQuery.serverPointer(name))) { if (verbose) { print(ptr); } await for (SrvResourceRecord srv in client - .lookup(ResourceRecordQuery.srv(ptr.domainName))) { + .lookup(ResourceRecordQuery.service(ptr.domainName))) { if (verbose) { print(srv); } if (verbose) { await client - .lookup(ResourceRecordQuery.txt(ptr.domainName)) + .lookup(ResourceRecordQuery.text(ptr.domainName)) .forEach(print); } await for (IPAddressResourceRecord ip in client - .lookup(ResourceRecordQuery.a(srv.target))) { + .lookup(ResourceRecordQuery.addressIPv4(srv.target))) { if (verbose) { print(ip); } @@ -47,7 +47,7 @@ For example: } await for (IPAddressResourceRecord ip in client.lookup( - ResourceRecordQuery.aaaa(srv.target))) { + ResourceRecordQuery.addressIPv6(srv.target))) { if (verbose) { print(ip); } diff --git a/packages/multicast_dns/lib/multicast_dns.dart b/packages/multicast_dns/lib/multicast_dns.dart index 220add7..5844551 100644 --- a/packages/multicast_dns/lib/multicast_dns.dart +++ b/packages/multicast_dns/lib/multicast_dns.dart @@ -147,7 +147,7 @@ class MDnsClient { /// Lookup a [ResourceRecord], potentially from the cache. /// - /// The [type] parameter must be a valid [ResourceRecordType]. The [name] + /// The [type] parameter must be a valid [ResourceRecordType]. The [fullyQualifiedName] /// parameter is the name of the service to lookup, and must not be null. The /// [timeout] parameter specifies how long the internal cache should hold on /// to the record. The [multicast] parameter specifies whether the query @@ -164,7 +164,7 @@ class MDnsClient { } // Look for entries in the cache. final List cached = []; - _cache.lookup(query.name, query.resourceRecordType, cached); + _cache.lookup(query.fullyQualifiedName, query.resourceRecordType, cached); if (cached.isNotEmpty) { final StreamController controller = StreamController(); cached.forEach(controller.add); @@ -174,7 +174,7 @@ class MDnsClient { // Add the pending request before sending the query. final Stream results = _resolver.addPendingRequest( - query.resourceRecordType, query.name, timeout); + query.resourceRecordType, query.fullyQualifiedName, timeout); // Send the request on all interfaces. final List packet = query.encode(); diff --git a/packages/multicast_dns/lib/src/packet.dart b/packages/multicast_dns/lib/src/packet.dart index 2bdbf68..8614f45 100644 --- a/packages/multicast_dns/lib/src/packet.dart +++ b/packages/multicast_dns/lib/src/packet.dart @@ -313,7 +313,7 @@ List decodeMDnsResponse(List packet) { weight: weight, ); break; - case ResourceRecordType.domainNamePointer: + case ResourceRecordType.serverPointer: checkLength(offset + readDataLength); final _FQDNReadResult result = _readFQDN(data, packetBytes, offset, length); diff --git a/packages/multicast_dns/lib/src/resource_record.dart b/packages/multicast_dns/lib/src/resource_record.dart index 389b48d..f647667 100644 --- a/packages/multicast_dns/lib/src/resource_record.dart +++ b/packages/multicast_dns/lib/src/resource_record.dart @@ -43,7 +43,7 @@ class ResourceRecordType { /// An IP Address reverse map record, also known as a "PTR" recored. It has a /// value of 12. - static const int domainNamePointer = 12; + static const int serverPointer = 12; /// An available service record, also known as an "SRV" record. It has a /// value of 33. @@ -62,7 +62,7 @@ class ResourceRecordType { static bool debugAssertValid(int resourceRecordType) { return resourceRecordType == addressIPv4 || resourceRecordType == addressIPv6 || - resourceRecordType == domainNamePointer || + resourceRecordType == serverPointer || resourceRecordType == service || resourceRecordType == text; } @@ -74,7 +74,7 @@ class ResourceRecordType { return 'A (IPv4 Address)'; case addressIPv6: return 'AAAA (IPv6 Address)'; - case domainNamePointer: + case serverPointer: return 'PTR (Domain Name Pointer)'; case service: return 'SRV (Service record)'; @@ -92,13 +92,13 @@ class ResourceRecordQuery { /// Most callers should prefer one of the named constructors. ResourceRecordQuery( this.resourceRecordType, - this.name, + this.fullyQualifiedName, this.questionType, - ) : assert(name != null), + ) : assert(fullyQualifiedName != null), assert(ResourceRecordType.debugAssertValid(resourceRecordType)); /// An A (IPv4) query. - ResourceRecordQuery.a( + ResourceRecordQuery.addressIPv4( String name, { bool isMulticast = true, }) : this( @@ -108,7 +108,7 @@ class ResourceRecordQuery { ); /// An AAAA (IPv6) query. - ResourceRecordQuery.aaaa( + ResourceRecordQuery.addressIPv6( String name, { bool isMulticast = true, }) : this( @@ -118,17 +118,17 @@ class ResourceRecordQuery { ); /// A PTR (Server pointer) query. - ResourceRecordQuery.ptr( + ResourceRecordQuery.serverPointer( String name, { bool isMulticast = true, }) : this( - ResourceRecordType.domainNamePointer, + ResourceRecordType.serverPointer, name, isMulticast ? QuestionType.multicast : QuestionType.unicast, ); /// An SRV (Service) query. - ResourceRecordQuery.srv( + ResourceRecordQuery.service( String name, { bool isMulticast = true, }) : this( @@ -138,7 +138,7 @@ class ResourceRecordQuery { ); /// A TXT (Text record) query. - ResourceRecordQuery.txt( + ResourceRecordQuery.text( String name, { bool isMulticast = true, }) : this( @@ -151,7 +151,7 @@ class ResourceRecordQuery { final int resourceRecordType; /// The Fully Qualified Domain Name associated with the request. - final String name; + final String fullyQualifiedName; /// The [QuestionType], i.e. multicast or unicast. final int questionType; @@ -165,7 +165,7 @@ class ResourceRecordQuery { /// Encodes this query to the raw wire format. List encode() { return encodeMDnsQuery( - name, + fullyQualifiedName, type: resourceRecordType, multicast: isMulticast, ); @@ -173,19 +173,19 @@ class ResourceRecordQuery { @override int get hashCode => - _hashValues([resourceRecordType, name.hashCode, questionType]); + _hashValues([resourceRecordType, fullyQualifiedName.hashCode, questionType]); @override bool operator ==(Object other) { return other is ResourceRecordQuery && other.resourceRecordType == resourceRecordType && - other.name == name && + other.fullyQualifiedName == fullyQualifiedName && other.questionType == questionType; } @override String toString() => - '$runtimeType{$name, type: ${ResourceRecordType.toDebugString(resourceRecordType)}, isMulticast: $isMulticast}'; + '$runtimeType{$fullyQualifiedName, type: ${ResourceRecordType.toDebugString(resourceRecordType)}, isMulticast: $isMulticast}'; } /// Base implementation of DNS resource records (RRs). @@ -249,7 +249,7 @@ class PtrResourceRecord extends ResourceRecord { int validUntil, { @required this.domainName, }) : assert(domainName != null), - super(ResourceRecordType.domainNamePointer, name, validUntil); + super(ResourceRecordType.serverPointer, name, validUntil); /// The FQDN for this record. final String domainName; From d800ac890cd97d3ae22a1f9b575be1f6060cd47f Mon Sep 17 00:00:00 2001 From: Dan Field Date: Wed, 23 Jan 2019 16:47:24 -0800 Subject: [PATCH 030/118] formatting --- packages/multicast_dns/example/main.dart | 8 ++++---- packages/multicast_dns/example/mdns-resolve.dart | 4 ++-- packages/multicast_dns/example/mdns-sd.dart | 13 +++++++------ packages/multicast_dns/lib/multicast_dns.dart | 3 ++- .../lib/src/native_protocol_client.dart | 3 ++- packages/multicast_dns/lib/src/resource_record.dart | 5 ++--- .../multicast_dns/test/lookup_resolver_test.dart | 4 ++-- 7 files changed, 21 insertions(+), 19 deletions(-) diff --git a/packages/multicast_dns/example/main.dart b/packages/multicast_dns/example/main.dart index 09bcc7c..c88a79e 100644 --- a/packages/multicast_dns/example/main.dart +++ b/packages/multicast_dns/example/main.dart @@ -16,14 +16,14 @@ void main() async { await client.start(); // Get the PTR recod for the service. - await for (PtrResourceRecord ptr - in client.lookup(ResourceRecordQuery.serverPointer(name))) { + await for (PtrResourceRecord ptr in client + .lookup(ResourceRecordQuery.serverPointer(name))) { // Use the domainName from the PTR record to get the SRV record, // which will have the port and local hostname. // Note that duplicate messages may come through, especially if any // other mDNS queries are running elsewhere on the machine. - await for (SrvResourceRecord srv in client - .lookup(ResourceRecordQuery.service(ptr.domainName))) { + await for (SrvResourceRecord srv in client.lookup( + ResourceRecordQuery.service(ptr.domainName))) { // Domain name will be something like "io.flutter.example@some-iphone.local._dartobservatory._tcp.local" final String bundleId = ptr.domainName; //.substring(0, ptr.domainName.indexOf('@')); diff --git a/packages/multicast_dns/example/mdns-resolve.dart b/packages/multicast_dns/example/mdns-resolve.dart index 65b7727..9db513c 100644 --- a/packages/multicast_dns/example/mdns-resolve.dart +++ b/packages/multicast_dns/example/mdns-resolve.dart @@ -21,8 +21,8 @@ For example: final MDnsClient client = MDnsClient(); await client.start(); - await for (IPAddressResourceRecord record - in client.lookup(ResourceRecordQuery.addressIPv4(name))) { + await for (IPAddressResourceRecord record in client + .lookup(ResourceRecordQuery.addressIPv4(name))) { print('Found address (${record.address}).'); } diff --git a/packages/multicast_dns/example/mdns-sd.dart b/packages/multicast_dns/example/mdns-sd.dart index b578ba9..22d6c45 100644 --- a/packages/multicast_dns/example/mdns-sd.dart +++ b/packages/multicast_dns/example/mdns-sd.dart @@ -22,13 +22,13 @@ For example: final MDnsClient client = MDnsClient(); await client.start(); - await for (PtrResourceRecord ptr - in client.lookup(ResourceRecordQuery.serverPointer(name))) { + await for (PtrResourceRecord ptr in client + .lookup(ResourceRecordQuery.serverPointer(name))) { if (verbose) { print(ptr); } - await for (SrvResourceRecord srv in client - .lookup(ResourceRecordQuery.service(ptr.domainName))) { + await for (SrvResourceRecord srv in client.lookup( + ResourceRecordQuery.service(ptr.domainName))) { if (verbose) { print(srv); } @@ -37,8 +37,9 @@ For example: .lookup(ResourceRecordQuery.text(ptr.domainName)) .forEach(print); } - await for (IPAddressResourceRecord ip in client - .lookup(ResourceRecordQuery.addressIPv4(srv.target))) { + await for (IPAddressResourceRecord ip + in client.lookup( + ResourceRecordQuery.addressIPv4(srv.target))) { if (verbose) { print(ip); } diff --git a/packages/multicast_dns/lib/multicast_dns.dart b/packages/multicast_dns/lib/multicast_dns.dart index 5844551..eeb71d1 100644 --- a/packages/multicast_dns/lib/multicast_dns.dart +++ b/packages/multicast_dns/lib/multicast_dns.dart @@ -164,7 +164,8 @@ class MDnsClient { } // Look for entries in the cache. final List cached = []; - _cache.lookup(query.fullyQualifiedName, query.resourceRecordType, cached); + _cache.lookup( + query.fullyQualifiedName, query.resourceRecordType, cached); if (cached.isNotEmpty) { final StreamController controller = StreamController(); cached.forEach(controller.add); diff --git a/packages/multicast_dns/lib/src/native_protocol_client.dart b/packages/multicast_dns/lib/src/native_protocol_client.dart index 40b98a6..bef02bc 100644 --- a/packages/multicast_dns/lib/src/native_protocol_client.dart +++ b/packages/multicast_dns/lib/src/native_protocol_client.dart @@ -26,7 +26,8 @@ class ResourceRecordCache { /// The number of entries in the cache. int get entryCount { int count = 0; - for (final SplayTreeMap> map in _cache.values) { + for (final SplayTreeMap> map + in _cache.values) { for (final List records in map.values) { count += records?.length; } diff --git a/packages/multicast_dns/lib/src/resource_record.dart b/packages/multicast_dns/lib/src/resource_record.dart index f647667..da741f6 100644 --- a/packages/multicast_dns/lib/src/resource_record.dart +++ b/packages/multicast_dns/lib/src/resource_record.dart @@ -172,8 +172,8 @@ class ResourceRecordQuery { } @override - int get hashCode => - _hashValues([resourceRecordType, fullyQualifiedName.hashCode, questionType]); + int get hashCode => _hashValues( + [resourceRecordType, fullyQualifiedName.hashCode, questionType]); @override bool operator ==(Object other) { @@ -231,7 +231,6 @@ abstract class ResourceRecord { ]); } - // Subclasses of this class should use _hashValues to create a hash code // that will then get hashed in with the common values on this class. @protected diff --git a/packages/multicast_dns/test/lookup_resolver_test.dart b/packages/multicast_dns/test/lookup_resolver_test.dart index 775d5dc..6a311fd 100644 --- a/packages/multicast_dns/test/lookup_resolver_test.dart +++ b/packages/multicast_dns/test/lookup_resolver_test.dart @@ -24,8 +24,8 @@ void testTimeout() { test('Resolver does not return with short timeout', () async { const Duration shortTimeout = Duration(milliseconds: 1); final LookupResolver resolver = LookupResolver(); - final Stream result = - resolver.addPendingRequest(ResourceRecordType.addressIPv4, 'xxx', shortTimeout); + final Stream result = resolver.addPendingRequest( + ResourceRecordType.addressIPv4, 'xxx', shortTimeout); expect(await result.isEmpty, isTrue); }); } From b609bbd4041b8db5ee45668ba4ea2814871b6832 Mon Sep 17 00:00:00 2001 From: Dan Field Date: Wed, 23 Jan 2019 16:52:49 -0800 Subject: [PATCH 031/118] missing comment --- packages/multicast_dns/lib/src/resource_record.dart | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/multicast_dns/lib/src/resource_record.dart b/packages/multicast_dns/lib/src/resource_record.dart index da741f6..e4be5f3 100644 --- a/packages/multicast_dns/lib/src/resource_record.dart +++ b/packages/multicast_dns/lib/src/resource_record.dart @@ -237,6 +237,10 @@ abstract class ResourceRecord { int get _hashCode; /// Low level method for encoding this record into an mDNS packet. + /// + /// Subclasses should provide the packet format of their encapsulated data + /// into a `Uint8List`, which could then be used to write a pakcet to send + /// as a response for this record type. Uint8List encodeResponseRecord(); } From 8df0f34d1f1c06031ac874e9dc7b415a52795c88 Mon Sep 17 00:00:00 2001 From: Dan Field Date: Thu, 24 Jan 2019 13:38:20 -0800 Subject: [PATCH 032/118] correct homepage --- packages/multicast_dns/pubspec.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/multicast_dns/pubspec.yaml b/packages/multicast_dns/pubspec.yaml index cc35f15..8820dff 100644 --- a/packages/multicast_dns/pubspec.yaml +++ b/packages/multicast_dns/pubspec.yaml @@ -1,8 +1,8 @@ name: multicast_dns description: Dart package for mDNS queries (e.g. Bonjour, Avahi). author: Flutter Team -homepage: https://github.com/flutter/packages/tree/master/packages/mdns -version: 0.1.0 +homepage: https://github.com/flutter/packages/tree/master/packages/multicast_dns +version: 0.1.0+1 dependencies: meta: ^1.1.6 From 279d42829ac1f97d504572089648cd7df48bf78c Mon Sep 17 00:00:00 2001 From: Stanislav Baranov Date: Tue, 19 Feb 2019 16:07:52 -0800 Subject: [PATCH 033/118] Add bsdiff package that implements binary diff/patch algorithm. --- packages/multicast_dns/lib/src/native_protocol_client.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/multicast_dns/lib/src/native_protocol_client.dart b/packages/multicast_dns/lib/src/native_protocol_client.dart index bef02bc..98a23ef 100644 --- a/packages/multicast_dns/lib/src/native_protocol_client.dart +++ b/packages/multicast_dns/lib/src/native_protocol_client.dart @@ -42,7 +42,7 @@ class ResourceRecordCache { // Clear the cache for all name/type combinations to be updated. final Map> seenRecordTypes = >{}; for (ResourceRecord record in records) { - seenRecordTypes[record.resourceRecordType] ??= Set(); + seenRecordTypes[record.resourceRecordType] ??= {}; if (seenRecordTypes[record.resourceRecordType].add(record.name)) { _cache[record.resourceRecordType] ??= SplayTreeMap>(); From d94f1521f93d1d07b4b510b7415c23e62f2b6ca1 Mon Sep 17 00:00:00 2001 From: Emmanuel Garcia Date: Thu, 2 May 2019 20:17:33 -0700 Subject: [PATCH 034/118] Separate record questions and answers --- packages/multicast_dns/lib/src/packet.dart | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/packages/multicast_dns/lib/src/packet.dart b/packages/multicast_dns/lib/src/packet.dart index 8614f45..98a03c3 100644 --- a/packages/multicast_dns/lib/src/packet.dart +++ b/packages/multicast_dns/lib/src/packet.dart @@ -226,7 +226,7 @@ List decodeMDnsResponse(List packet) { return null; } - final int answerRecordCount = packetBytes.getUint16(_kArcountOffset); + final int questionCount = packetBytes.getUint16(_kArcountOffset); int offset = _kHeaderSize; void checkLength(int required) { @@ -346,7 +346,13 @@ List decodeMDnsResponse(List packet) { final List result = []; try { - for (int i = 0; i < answerCount + answerRecordCount; i++) { + for (int i = 0; i < questionCount; i++) { + final _FQDNReadResult result = _readFQDN(data, packetBytes, offset, length); + offset += result.bytesRead; + checkLength(offset + 4); + offset += 4; + } + for (int i = 0; i < answerCount; i++) { final ResourceRecord record = readResourceRecord(); if (record != null) { result.add(record); From 7cb0cf20e9070278b6688411ed7a6f14d03c1251 Mon Sep 17 00:00:00 2001 From: Emmanuel Garcia Date: Fri, 3 May 2019 06:46:32 -0700 Subject: [PATCH 035/118] Fix counters --- packages/multicast_dns/lib/src/packet.dart | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/multicast_dns/lib/src/packet.dart b/packages/multicast_dns/lib/src/packet.dart index 98a03c3..6eadf92 100644 --- a/packages/multicast_dns/lib/src/packet.dart +++ b/packages/multicast_dns/lib/src/packet.dart @@ -221,12 +221,14 @@ List decodeMDnsResponse(List packet) { packet is Uint8List ? packet : Uint8List.fromList(packet); final ByteData packetBytes = ByteData.view(data.buffer); - final int answerCount = packetBytes.getUint16(_kAncountOffset); + final int answerCount = packetBytes.getUint16(_kAncountOffset) + + packetBytes.getUint16(_kNscountOffset) + + packetBytes.getUint16(_kArcountOffset); if (answerCount == 0) { return null; } - final int questionCount = packetBytes.getUint16(_kArcountOffset); + final int questionCount = packetBytes.getUint16(_kQdcountOffset); int offset = _kHeaderSize; void checkLength(int required) { @@ -347,7 +349,8 @@ List decodeMDnsResponse(List packet) { try { for (int i = 0; i < questionCount; i++) { - final _FQDNReadResult result = _readFQDN(data, packetBytes, offset, length); + final _FQDNReadResult result = + _readFQDN(data, packetBytes, offset, length); offset += result.bytesRead; checkLength(offset + 4); offset += 4; From d147420ed0f67df0c32c62887bc9eaf0441d5b70 Mon Sep 17 00:00:00 2001 From: Emmanuel Garcia Date: Fri, 3 May 2019 13:39:37 -0700 Subject: [PATCH 036/118] Add tests --- packages/multicast_dns/test/decode_test.dart | 346 +++++++++++++++++++ 1 file changed, 346 insertions(+) diff --git a/packages/multicast_dns/test/decode_test.dart b/packages/multicast_dns/test/decode_test.dart index 5790278..56aa020 100644 --- a/packages/multicast_dns/test/decode_test.dart +++ b/packages/multicast_dns/test/decode_test.dart @@ -122,6 +122,47 @@ void testValidPackages() { ), ]); }); + + // Fixes https://github.com/flutter/flutter/issues/31854 + test('Can decode packages with question, answer and additional', () { + final List result = + decodeMDnsResponse(packetWithQuestionAnArCount); + expect(result, isNotNull); + expect(result.length, 2); + expect(result, [ + PtrResourceRecord( + '_______________.____._____', + result[0].validUntil, + domainName: '_______________________._______________.____._____', + ), + PtrResourceRecord( + '_______________.____._____', + result[1].validUntil, + domainName: '____________________________._______________.____._____', + ), + ]); + }); + + // Fixes https://github.com/flutter/flutter/issues/31854 + test('Can decode packages without question and with answer and additional', + () { + final List result = + decodeMDnsResponse(packetWithoutQuestionWithAnArCount); + expect(result, isNotNull); + expect(result.length, 2); + expect(result, [ + PtrResourceRecord( + '_______________.____._____', + result[0].validUntil, + domainName: '______________________._______________.____._____', + ), + TxtResourceRecord( + '_______________.____._____', + result[1].validUntil, + text: '\u{14}model=MacBookPro14,3\nosxvers=18\u{12}ecolor=225,225,223', + ), + ]); + }); } void testBadPackages() { @@ -832,3 +873,308 @@ const List srvRData = [ 0x6c, 0x00 ]; + +const List packetWithQuestionAnArCount = [ + 0, + 0, + 2, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 15, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 4, + 95, + 95, + 95, + 95, + 5, + 95, + 95, + 95, + 95, + 95, + 0, + 0, + 12, + 0, + 1, + 192, + 12, + 0, + 12, + 0, + 1, + 0, + 0, + 14, + 13, + 0, + 26, + 23, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 192, + 12, + 192, + 12, + 0, + 12, + 0, + 1, + 0, + 0, + 14, + 13, + 0, + 31, + 28, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 192, + 12, +]; + +const List packetWithoutQuestionWithAnArCount = [ + 0, + 0, + 132, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 15, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 4, + 95, + 95, + 95, + 95, + 5, + 95, + 95, + 95, + 95, + 95, + 0, + 0, + 12, + 0, + 1, + 0, + 0, + 17, + 148, + 0, + 25, + 22, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 192, + 12, + 22, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 12, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 192, + 28, + 0, + 16, + 0, + 1, + 0, + 0, + 17, + 148, + 0, + 51, + 20, + 109, + 111, + 100, + 101, + 108, + 61, + 77, + 97, + 99, + 66, + 111, + 111, + 107, + 80, + 114, + 111, + 49, + 52, + 44, + 51, + 10, + 111, + 115, + 120, + 118, + 101, + 114, + 115, + 61, + 49, + 56, + 18, + 101, + 99, + 111, + 108, + 111, + 114, + 61, + 50, + 50, + 53, + 44, + 50, + 50, + 53, + 44, + 50, + 50, + 51, +]; From 9f30537a87da3b63990c5cdbd9d779985411d7ae Mon Sep 17 00:00:00 2001 From: Emmanuel Garcia Date: Fri, 3 May 2019 13:44:07 -0700 Subject: [PATCH 037/118] Split into multiple named values --- packages/multicast_dns/lib/src/packet.dart | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/packages/multicast_dns/lib/src/packet.dart b/packages/multicast_dns/lib/src/packet.dart index 6eadf92..eac3f67 100644 --- a/packages/multicast_dns/lib/src/packet.dart +++ b/packages/multicast_dns/lib/src/packet.dart @@ -221,10 +221,12 @@ List decodeMDnsResponse(List packet) { packet is Uint8List ? packet : Uint8List.fromList(packet); final ByteData packetBytes = ByteData.view(data.buffer); - final int answerCount = packetBytes.getUint16(_kAncountOffset) + - packetBytes.getUint16(_kNscountOffset) + - packetBytes.getUint16(_kArcountOffset); - if (answerCount == 0) { + final int answerCount = packetBytes.getUint16(_kAncountOffset); + final int authorityCount = packetBytes.getUint16(_kNscountOffset); + final int additionalCount = packetBytes.getUint16(_kArcountOffset); + final int remainingCount = answerCount + authorityCount + additionalCount; + + if (remainingCount == 0) { return null; } @@ -355,7 +357,7 @@ List decodeMDnsResponse(List packet) { checkLength(offset + 4); offset += 4; } - for (int i = 0; i < answerCount; i++) { + for (int i = 0; i < remainingCount; i++) { final ResourceRecord record = readResourceRecord(); if (record != null) { result.add(record); From 25bee7f5000510baa8710bf6924d663ddafa1cf0 Mon Sep 17 00:00:00 2001 From: Emmanuel Garcia Date: Fri, 3 May 2019 15:40:57 -0700 Subject: [PATCH 038/118] Version bump --- packages/multicast_dns/lib/src/native_protocol_client.dart | 3 ++- packages/multicast_dns/pubspec.yaml | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/multicast_dns/lib/src/native_protocol_client.dart b/packages/multicast_dns/lib/src/native_protocol_client.dart index 98a23ef..0b8b1ca 100644 --- a/packages/multicast_dns/lib/src/native_protocol_client.dart +++ b/packages/multicast_dns/lib/src/native_protocol_client.dart @@ -42,7 +42,8 @@ class ResourceRecordCache { // Clear the cache for all name/type combinations to be updated. final Map> seenRecordTypes = >{}; for (ResourceRecord record in records) { - seenRecordTypes[record.resourceRecordType] ??= {}; + // TODO(dnfield): Update this to use set literal syntax when we're able to bump the SDK constraint. + seenRecordTypes[record.resourceRecordType] ??= {}; // ignore: prefer_collection_literals if (seenRecordTypes[record.resourceRecordType].add(record.name)) { _cache[record.resourceRecordType] ??= SplayTreeMap>(); diff --git a/packages/multicast_dns/pubspec.yaml b/packages/multicast_dns/pubspec.yaml index 8820dff..c1a1174 100644 --- a/packages/multicast_dns/pubspec.yaml +++ b/packages/multicast_dns/pubspec.yaml @@ -2,7 +2,7 @@ name: multicast_dns description: Dart package for mDNS queries (e.g. Bonjour, Avahi). author: Flutter Team homepage: https://github.com/flutter/packages/tree/master/packages/multicast_dns -version: 0.1.0+1 +version: 0.1.1 dependencies: meta: ^1.1.6 From 3da1422b3204b736d5092eab00ffce0131071d89 Mon Sep 17 00:00:00 2001 From: Emmanuel Garcia Date: Fri, 3 May 2019 15:46:51 -0700 Subject: [PATCH 039/118] {} -> Set --- packages/multicast_dns/lib/src/native_protocol_client.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/multicast_dns/lib/src/native_protocol_client.dart b/packages/multicast_dns/lib/src/native_protocol_client.dart index 0b8b1ca..47baab1 100644 --- a/packages/multicast_dns/lib/src/native_protocol_client.dart +++ b/packages/multicast_dns/lib/src/native_protocol_client.dart @@ -43,7 +43,7 @@ class ResourceRecordCache { final Map> seenRecordTypes = >{}; for (ResourceRecord record in records) { // TODO(dnfield): Update this to use set literal syntax when we're able to bump the SDK constraint. - seenRecordTypes[record.resourceRecordType] ??= {}; // ignore: prefer_collection_literals + seenRecordTypes[record.resourceRecordType] ??= Set(); // ignore: prefer_collection_literals if (seenRecordTypes[record.resourceRecordType].add(record.name)) { _cache[record.resourceRecordType] ??= SplayTreeMap>(); From 4598775685c3b110e4bfc277ef2cbd1e1160c100 Mon Sep 17 00:00:00 2001 From: Emmanuel Garcia Date: Fri, 3 May 2019 15:53:05 -0700 Subject: [PATCH 040/118] Format --- packages/multicast_dns/lib/src/native_protocol_client.dart | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/multicast_dns/lib/src/native_protocol_client.dart b/packages/multicast_dns/lib/src/native_protocol_client.dart index 47baab1..553d564 100644 --- a/packages/multicast_dns/lib/src/native_protocol_client.dart +++ b/packages/multicast_dns/lib/src/native_protocol_client.dart @@ -43,7 +43,8 @@ class ResourceRecordCache { final Map> seenRecordTypes = >{}; for (ResourceRecord record in records) { // TODO(dnfield): Update this to use set literal syntax when we're able to bump the SDK constraint. - seenRecordTypes[record.resourceRecordType] ??= Set(); // ignore: prefer_collection_literals + seenRecordTypes[record.resourceRecordType] ??= + Set(); // ignore: prefer_collection_literals if (seenRecordTypes[record.resourceRecordType].add(record.name)) { _cache[record.resourceRecordType] ??= SplayTreeMap>(); From 4fbc282504b25d044cfaef1433742a8fa9ce1711 Mon Sep 17 00:00:00 2001 From: Emmanuel Garcia Date: Fri, 3 May 2019 16:04:22 -0700 Subject: [PATCH 041/118] Update changelog --- packages/multicast_dns/CHANGELOG.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/multicast_dns/CHANGELOG.md b/packages/multicast_dns/CHANGELOG.md index 9d66683..3f947a7 100644 --- a/packages/multicast_dns/CHANGELOG.md +++ b/packages/multicast_dns/CHANGELOG.md @@ -2,4 +2,8 @@ * Initial Open Source release. * Migrates the dartino-sdk's mDNS client to Dart 2.0 and Flutter's analysis rules -* Breaks from original Dartino code, as it does not use native libraries for macOS and overhauls the `ResourceRecord` class. \ No newline at end of file +* Breaks from original Dartino code, as it does not use native libraries for macOS and overhauls the `ResourceRecord` class. + +## 0.1.1 + +* Fixes [flutter/issue/31854](https://github.com/flutter/flutter/issues/31854) where `decodeMDnsResponse` advanced to incorrect code points and ignored some records. From ab5c093be3ea92577501d01bb0b45920d8f3496b Mon Sep 17 00:00:00 2001 From: Emmanuel Garcia Date: Fri, 3 May 2019 17:13:32 -0700 Subject: [PATCH 042/118] Order by last version --- packages/multicast_dns/CHANGELOG.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/multicast_dns/CHANGELOG.md b/packages/multicast_dns/CHANGELOG.md index 3f947a7..03dcad8 100644 --- a/packages/multicast_dns/CHANGELOG.md +++ b/packages/multicast_dns/CHANGELOG.md @@ -1,9 +1,9 @@ +## 0.1.1 + +* Fixes [flutter/issue/31854](https://github.com/flutter/flutter/issues/31854) where `decodeMDnsResponse` advanced to incorrect code points and ignored some records. + ## 0.1.0 * Initial Open Source release. * Migrates the dartino-sdk's mDNS client to Dart 2.0 and Flutter's analysis rules * Breaks from original Dartino code, as it does not use native libraries for macOS and overhauls the `ResourceRecord` class. - -## 0.1.1 - -* Fixes [flutter/issue/31854](https://github.com/flutter/flutter/issues/31854) where `decodeMDnsResponse` advanced to incorrect code points and ignored some records. From 1b9bc8de4d9993d4c03315d66e779916ff9df78b Mon Sep 17 00:00:00 2001 From: Jonah Williams Date: Wed, 31 Jul 2019 09:46:22 -0700 Subject: [PATCH 043/118] Allow configuration of port and address --- packages/multicast_dns/CHANGELOG.md | 3 ++ packages/multicast_dns/lib/multicast_dns.dart | 39 ++++++++++++++++--- packages/multicast_dns/pubspec.yaml | 3 +- packages/multicast_dns/test/client_test.dart | 32 +++++++++++++++ 4 files changed, 70 insertions(+), 7 deletions(-) create mode 100644 packages/multicast_dns/test/client_test.dart diff --git a/packages/multicast_dns/CHANGELOG.md b/packages/multicast_dns/CHANGELOG.md index 03dcad8..29e2aef 100644 --- a/packages/multicast_dns/CHANGELOG.md +++ b/packages/multicast_dns/CHANGELOG.md @@ -1,3 +1,6 @@ +## 0.2.0 +* Allow configuration of the port and address the mdns query is performed on. + ## 0.1.1 * Fixes [flutter/issue/31854](https://github.com/flutter/flutter/issues/31854) where `decodeMDnsResponse` advanced to incorrect code points and ignored some records. diff --git a/packages/multicast_dns/lib/multicast_dns.dart b/packages/multicast_dns/lib/multicast_dns.dart index eeb71d1..3b8fa47 100644 --- a/packages/multicast_dns/lib/multicast_dns.dart +++ b/packages/multicast_dns/lib/multicast_dns.dart @@ -24,6 +24,14 @@ export 'package:multicast_dns/src/resource_record.dart'; typedef NetworkInterfacesFactory = Future> Function( InternetAddressType type); +/// A factory for construction of datagram sockets. +/// +/// This can be injected into the [MDnsClient] to provide alternative +/// implementations of [RawDatagramSocket.bind]. +typedef RawDatagramSocketFactory = Future Function( + dynamic host, int port, + {bool reuseAddress, bool reusePort, int ttl}); + /// Client for DNS lookup and publishing using the mDNS protocol. /// /// Users should call [MDnsQuerier.start] when ready to start querying and @@ -33,13 +41,21 @@ typedef NetworkInterfacesFactory = Future> Function( /// This client only supports "One-Shot Multicast DNS Queries" as described in /// section 5.1 of [RFC 6762](https://tools.ietf.org/html/rfc6762). class MDnsClient { + /// Create a new [MDnsClient]. + MDnsClient({ + RawDatagramSocketFactory rawDatagramSocketFactory = RawDatagramSocket.bind, + }) : _rawDatagramSocketFactory = rawDatagramSocketFactory; + bool _starting = false; bool _started = false; RawDatagramSocket _incoming; final List _sockets = []; final LookupResolver _resolver = LookupResolver(); final ResourceRecordCache _cache = ResourceRecordCache(); + final RawDatagramSocketFactory _rawDatagramSocketFactory; + InternetAddress _mDnsAddress; + int _mDnsPort; /// Find all network interfaces with an the [InternetAddressType] specified. static NetworkInterfacesFactory allInterfacesFactory = @@ -58,12 +74,23 @@ class MDnsClient { /// [InternetAddress.anyIPv6], and will default to anyIPv4. /// /// The [interfaceFactory] defaults to [allInterfacesFactory]. + /// + /// The [mDnsPort] allows configuring what port is used for the mDNS + /// query. If not provided, defaults to `5353`. + /// + /// The [mDnsAddress] allows configuring what internet address is used + /// for the mDNS query. If not provided, defaults to either `224.0.0.251` or + /// or `FF02::FB`. Future start({ InternetAddress listenAddress, NetworkInterfacesFactory interfacesFactory, + int mDnsPort = mDnsPort, + InternetAddress mDnsAddress, }) async { listenAddress ??= InternetAddress.anyIPv4; interfacesFactory ??= allInterfacesFactory; + _mDnsPort = mDnsPort; + _mDnsAddress = mDnsAddress; assert(listenAddress.address == InternetAddress.anyIPv4.address || listenAddress.address == InternetAddress.anyIPv6.address); @@ -74,9 +101,9 @@ class MDnsClient { _starting = true; // Listen on all addresses. - _incoming = await RawDatagramSocket.bind( + _incoming = await _rawDatagramSocketFactory( listenAddress.address, - mDnsPort, + _mDnsPort, reuseAddress: true, reusePort: true, ttl: 255, @@ -87,7 +114,7 @@ class MDnsClient { _sockets.add(_incoming); } - _mDnsAddress = _incoming.address.type == InternetAddressType.IPv4 + _mDnsAddress ??= _incoming.address.type == InternetAddressType.IPv4 ? mDnsAddressIPv4 : mDnsAddressIPv6; @@ -97,9 +124,9 @@ class MDnsClient { for (NetworkInterface interface in interfaces) { // Create a socket for sending on each adapter. final InternetAddress targetAddress = interface.addresses[0]; - final RawDatagramSocket socket = await RawDatagramSocket.bind( + final RawDatagramSocket socket = await _rawDatagramSocketFactory( targetAddress, - mDnsPort, + _mDnsPort, reuseAddress: true, reusePort: true, ttl: 255, @@ -180,7 +207,7 @@ class MDnsClient { // Send the request on all interfaces. final List packet = query.encode(); for (RawDatagramSocket socket in _sockets) { - socket.send(packet, _mDnsAddress, mDnsPort); + socket.send(packet, _mDnsAddress, _mDnsPort); } return results; } diff --git a/packages/multicast_dns/pubspec.yaml b/packages/multicast_dns/pubspec.yaml index c1a1174..8eb23b7 100644 --- a/packages/multicast_dns/pubspec.yaml +++ b/packages/multicast_dns/pubspec.yaml @@ -2,13 +2,14 @@ name: multicast_dns description: Dart package for mDNS queries (e.g. Bonjour, Avahi). author: Flutter Team homepage: https://github.com/flutter/packages/tree/master/packages/multicast_dns -version: 0.1.1 +version: 0.2.0 dependencies: meta: ^1.1.6 dev_dependencies: test: "^1.3.4" + mockito: "^4.1.0" environment: sdk: ">=2.1.1-dev.2.0 <3.0.0" diff --git a/packages/multicast_dns/test/client_test.dart b/packages/multicast_dns/test/client_test.dart new file mode 100644 index 0000000..f327c20 --- /dev/null +++ b/packages/multicast_dns/test/client_test.dart @@ -0,0 +1,32 @@ +// Copyright (c) 2015, the Dartino project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +import 'dart:io'; + +import 'package:multicast_dns/multicast_dns.dart'; +import 'package:mockito/mockito.dart'; +import 'package:test/test.dart'; + +void main() { + test('Can inject datagram socket factory and configure mdns port', () async { + int lastPort; + final MockRawDatagramSocket mockRawDatagramSocket = MockRawDatagramSocket(); + final MDnsClient client = MDnsClient(rawDatagramSocketFactory: + (dynamic host, int port, + {bool reuseAddress, bool reusePort, int ttl = 1}) async { + lastPort = port; + return mockRawDatagramSocket; + }); + when(mockRawDatagramSocket.address).thenReturn(InternetAddress.anyIPv4); + + await client.start( + mDnsPort: 1234, + interfacesFactory: (InternetAddressType type) async => + []); + + expect(lastPort, 1234); + }); +} + +class MockRawDatagramSocket extends Mock implements RawDatagramSocket {} From 0aff36fa5f3498dfacaf839c5a75c4ad0f8957b0 Mon Sep 17 00:00:00 2001 From: Zach Anderson Date: Tue, 13 Aug 2019 12:26:21 -0700 Subject: [PATCH 044/118] Catch FormatException in packet decoding. --- packages/multicast_dns/CHANGELOG.md | 3 + packages/multicast_dns/lib/src/packet.dart | 3 + packages/multicast_dns/pubspec.yaml | 2 +- packages/multicast_dns/test/decode_test.dart | 259 +++++++++++++++++++ 4 files changed, 266 insertions(+), 1 deletion(-) diff --git a/packages/multicast_dns/CHANGELOG.md b/packages/multicast_dns/CHANGELOG.md index 29e2aef..da11f54 100644 --- a/packages/multicast_dns/CHANGELOG.md +++ b/packages/multicast_dns/CHANGELOG.md @@ -1,3 +1,6 @@ +## 0.2.1 +* Fixes the handling of packets containing non-utf8 strings. + ## 0.2.0 * Allow configuration of the port and address the mdns query is performed on. diff --git a/packages/multicast_dns/lib/src/packet.dart b/packages/multicast_dns/lib/src/packet.dart index eac3f67..7e1e5e7 100644 --- a/packages/multicast_dns/lib/src/packet.dart +++ b/packages/multicast_dns/lib/src/packet.dart @@ -366,6 +366,9 @@ List decodeMDnsResponse(List packet) { } on MDnsDecodeException { // If decoding fails return null. return null; + } on FormatException { + // If decoding fails on a non-utf8 packet, return null. + return null; } return result; } diff --git a/packages/multicast_dns/pubspec.yaml b/packages/multicast_dns/pubspec.yaml index 8eb23b7..2c20513 100644 --- a/packages/multicast_dns/pubspec.yaml +++ b/packages/multicast_dns/pubspec.yaml @@ -2,7 +2,7 @@ name: multicast_dns description: Dart package for mDNS queries (e.g. Bonjour, Avahi). author: Flutter Team homepage: https://github.com/flutter/packages/tree/master/packages/multicast_dns -version: 0.2.0 +version: 0.2.1 dependencies: meta: ^1.1.6 diff --git a/packages/multicast_dns/test/decode_test.dart b/packages/multicast_dns/test/decode_test.dart index 56aa020..637d3a0 100644 --- a/packages/multicast_dns/test/decode_test.dart +++ b/packages/multicast_dns/test/decode_test.dart @@ -13,6 +13,7 @@ const int _kSrvHeaderSize = 6; void main() { testValidPackages(); testBadPackages(); + testNonUtf8Packages(); // testHexDumpList(); testPTRRData(); testSRVRData(); @@ -175,6 +176,12 @@ void testBadPackages() { }); } +void testNonUtf8Packages() { + test('Returns null for non-utf8 text resource', () { + expect(decodeMDnsResponse(nonUtf8Package), isNull); + }); +} + void testPTRRData() { test('Can read FQDN from PTR data', () { expect('sgjesse-macbookpro2 [78:31:c1:b8:55:38]._workstation._tcp.local', @@ -1178,3 +1185,255 @@ const List packetWithoutQuestionWithAnArCount = [ 50, 51, ]; + +// Package with a text resource that is not valid utf8. +const List nonUtf8Package = [ + 0x00, + 0x00, + 0x84, + 0x00, + 0x00, + 0x00, + 0x00, + 0x08, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x72, + 0x61, + 0x73, + 0x70, + 0x62, + 0x65, + 0x72, + 0x72, + 0x79, + 0x70, + 0x69, + 0x20, + 0x5b, + 0x62, + 0x38, + 0x3a, + 0x32, + 0x37, + 0x3a, + 0x65, + 0x62, + 0xd2, + 0x30, + 0x33, + 0x3a, + 0x39, + 0x32, + 0x3a, + 0x34, + 0x62, + 0x5d, + 0x0c, + 0x5f, + 0x77, + 0x6f, + 0x72, + 0x6b, + 0x73, + 0x74, + 0x61, + 0x74, + 0x69, + 0x6f, + 0x6e, + 0x04, + 0x5f, + 0x74, + 0x63, + 0x70, + 0x05, + 0x6c, + 0x6f, + 0x63, + 0x61, + 0x6c, + 0x00, + 0x00, + 0x10, + 0x80, + 0x01, + 0x00, + 0x00, + 0x11, + 0x94, + 0x00, + 0x01, + 0x00, + 0x0b, + 0x5f, + 0x75, + 0x64, + 0x69, + 0x73, + 0x6b, + 0x73, + 0x2d, + 0x73, + 0x73, + 0x68, + 0xc0, + 0x39, + 0x00, + 0x0c, + 0x00, + 0x01, + 0x00, + 0x00, + 0x11, + 0x94, + 0x00, + 0x0e, + 0x0b, + 0x72, + 0x61, + 0x73, + 0x70, + 0x62, + 0x65, + 0x72, + 0x72, + 0x79, + 0x70, + 0x69, + 0xc0, + 0x50, + 0xc0, + 0x68, + 0x00, + 0x21, + 0x80, + 0x01, + 0x00, + 0x00, + 0x00, + 0x78, + 0x00, + 0x14, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x16, + 0x0b, + 0x72, + 0x61, + 0x73, + 0x70, + 0x62, + 0x65, + 0x72, + 0x72, + 0x79, + 0x70, + 0x69, + 0xc0, + 0x3e, + 0xc0, + 0x68, + 0x00, + 0x10, + 0x80, + 0x01, + 0x00, + 0x00, + 0x11, + 0x94, + 0x00, + 0x01, + 0x00, + 0x09, + 0x5f, + 0x73, + 0x65, + 0x72, + 0x76, + 0x69, + 0x63, + 0x65, + 0x73, + 0x07, + 0x5f, + 0x64, + 0x6e, + 0x73, + 0x2d, + 0x73, + 0x64, + 0x04, + 0x5f, + 0x75, + 0x64, + 0x70, + 0xc0, + 0x3e, + 0x00, + 0x0c, + 0x00, + 0x01, + 0x00, + 0x00, + 0x11, + 0x94, + 0x00, + 0x02, + 0xc0, + 0x50, + 0xc0, + 0x2c, + 0x00, + 0x0c, + 0x00, + 0x01, + 0x00, + 0x00, + 0x11, + 0x94, + 0x00, + 0x02, + 0xc0, + 0x0c, + 0xc0, + 0x0c, + 0x00, + 0x21, + 0x80, + 0x01, + 0x00, + 0x00, + 0x00, + 0x78, + 0x00, + 0x08, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x09, + 0xc0, + 0x88, + 0xc0, + 0xa3, + 0x00, + 0x0c, + 0x00, + 0x01, + 0x00, + 0x00, + 0x11, + 0x94, + 0x00, + 0x02, + 0xc0, + 0x2c +]; From 8f9e098a83daa0b17ac7162225ce9e465abda5f0 Mon Sep 17 00:00:00 2001 From: Ben Hagen Date: Tue, 27 Aug 2019 21:48:57 +0200 Subject: [PATCH 045/118] Fix import in README --- packages/multicast_dns/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/multicast_dns/README.md b/packages/multicast_dns/README.md index 17dc254..47f769c 100644 --- a/packages/multicast_dns/README.md +++ b/packages/multicast_dns/README.md @@ -13,7 +13,7 @@ To use this package, add `multicast_dns` as a Import the library via ``` dart -import 'package:multicast_dns/mdns_client.dart'; +import 'package:multicast_dns/multicast_dns.dart'; ``` Then use the `MDnsClient` Dart class in your code. To see how this is done, From 35be2806cfa249e21d8b3aa4e9f96f9189841f0b Mon Sep 17 00:00:00 2001 From: Michael Goderbauer Date: Wed, 28 Aug 2019 10:52:29 -0700 Subject: [PATCH 046/118] Sync analysis options (#29) --- packages/multicast_dns/example/main.dart | 2 +- packages/multicast_dns/example/mdns-resolve.dart | 2 +- packages/multicast_dns/example/mdns-sd.dart | 2 +- packages/multicast_dns/lib/src/packet.dart | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/multicast_dns/example/main.dart b/packages/multicast_dns/example/main.dart index c88a79e..cbf14c5 100644 --- a/packages/multicast_dns/example/main.dart +++ b/packages/multicast_dns/example/main.dart @@ -7,7 +7,7 @@ import 'package:multicast_dns/multicast_dns.dart'; -void main() async { +Future main() async { // Parse the command line arguments. const String name = '_dartobservatory._tcp.local'; diff --git a/packages/multicast_dns/example/mdns-resolve.dart b/packages/multicast_dns/example/mdns-resolve.dart index 9db513c..2276b3b 100644 --- a/packages/multicast_dns/example/mdns-resolve.dart +++ b/packages/multicast_dns/example/mdns-resolve.dart @@ -7,7 +7,7 @@ import 'package:multicast_dns/multicast_dns.dart'; -void main(List args) async { +Future main(List args) async { if (args.length != 1) { print(''' Please provide an address as argument. diff --git a/packages/multicast_dns/example/mdns-sd.dart b/packages/multicast_dns/example/mdns-sd.dart index 22d6c45..f431ee6 100644 --- a/packages/multicast_dns/example/mdns-sd.dart +++ b/packages/multicast_dns/example/mdns-sd.dart @@ -7,7 +7,7 @@ import 'package:multicast_dns/multicast_dns.dart'; -void main(List args) async { +Future main(List args) async { if (args.isEmpty) { print(''' Please provide the name of a service as argument. diff --git a/packages/multicast_dns/lib/src/packet.dart b/packages/multicast_dns/lib/src/packet.dart index 7e1e5e7..b448c5a 100644 --- a/packages/multicast_dns/lib/src/packet.dart +++ b/packages/multicast_dns/lib/src/packet.dart @@ -274,7 +274,7 @@ List decodeMDnsResponse(List packet) { final int stop = offset + readDataLength; addr.write(packetBytes.getUint8(offset)); offset++; - for (offset; offset < stop; offset++) { + for (; offset < stop; offset++) { addr.write('.'); addr.write(packetBytes.getUint8(offset)); } @@ -286,7 +286,7 @@ List decodeMDnsResponse(List packet) { final int stop = offset + readDataLength; addr.write(packetBytes.getUint16(offset).toRadixString(16)); offset += 2; - for (offset; offset < stop; offset += 2) { + for (; offset < stop; offset += 2) { addr.write(':'); addr.write(packetBytes.getUint16(offset).toRadixString(16)); } From 513b2eb0aad0a052d0b01fdb6a2ea21625c08904 Mon Sep 17 00:00:00 2001 From: Zachary Anderson Date: Thu, 3 Oct 2019 09:27:12 -0700 Subject: [PATCH 047/118] [multicast_dns] Make decode more resiliant against non-utf8 fields (#38) --- packages/multicast_dns/lib/src/packet.dart | 34 ++-- packages/multicast_dns/test/decode_test.dart | 186 +++++++++++++++++-- 2 files changed, 197 insertions(+), 23 deletions(-) diff --git a/packages/multicast_dns/lib/src/packet.dart b/packages/multicast_dns/lib/src/packet.dart index b448c5a..2dae398 100644 --- a/packages/multicast_dns/lib/src/packet.dart +++ b/packages/multicast_dns/lib/src/packet.dart @@ -162,7 +162,10 @@ _FQDNReadResult _readFQDN( final Uint8List partBytes = Uint8List.view(data.buffer, offset, partLength); offset += partLength; - parts.add(utf8.decode(partBytes)); + // According to the RFC, this is supposed to be utf-8 encoded, but + // we should continue decoding even if it isn't to avoid dropping the + // rest of the data, which might still be useful. + parts.add(utf8.decode(partBytes, allowMalformed: true)); } else { break; } @@ -329,14 +332,26 @@ List decodeMDnsResponse(List packet) { ); case ResourceRecordType.text: checkLength(offset + readDataLength); - final Uint8List rawText = Uint8List.view( - data.buffer, - offset, - readDataLength, - ); - final String text = utf8.decode(rawText); + // The first byte of the buffer is the length of the first string of + // the TXT record. Further length-prefixed strings may follow. We + // concatenate them with newlines. + final StringBuffer strings = StringBuffer(); + int index = 0; + while (index < readDataLength) { + final int txtLength = data[offset + index]; + index++; + if (txtLength == 0) { + continue; + } + final String text = utf8.decode( + Uint8List.view(data.buffer, offset + index, txtLength), + allowMalformed: true, + ); + strings.writeln(text); + index += txtLength; + } offset += readDataLength; - return TxtResourceRecord(fqdn, validUntil, text: text); + return TxtResourceRecord(fqdn, validUntil, text: strings.toString()); default: checkLength(offset + readDataLength); offset += readDataLength; @@ -366,9 +381,6 @@ List decodeMDnsResponse(List packet) { } on MDnsDecodeException { // If decoding fails return null. return null; - } on FormatException { - // If decoding fails on a non-utf8 packet, return null. - return null; } return result; } diff --git a/packages/multicast_dns/test/decode_test.dart b/packages/multicast_dns/test/decode_test.dart index 637d3a0..f11f4d9 100644 --- a/packages/multicast_dns/test/decode_test.dart +++ b/packages/multicast_dns/test/decode_test.dart @@ -13,7 +13,7 @@ const int _kSrvHeaderSize = 6; void main() { testValidPackages(); testBadPackages(); - testNonUtf8Packages(); + testNonUtf8DomainName(); // testHexDumpList(); testPTRRData(); testSRVRData(); @@ -43,7 +43,7 @@ void testValidPackages() { TxtResourceRecord( 'raspberrypi [b8:27:eb:03:92:4b]._workstation._tcp.local', result[0].validUntil, - text: '\x00', + text: '', ), PtrResourceRecord( '_udisks-ssh._tcp.local', @@ -61,7 +61,7 @@ void testValidPackages() { TxtResourceRecord( 'raspberrypi._udisks-ssh._tcp.local', result[3].validUntil, - text: '\x00', + text: '', ), PtrResourceRecord('_services._dns-sd._udp.local', result[4].validUntil, domainName: '_udisks-ssh._tcp.local'), @@ -96,7 +96,7 @@ void testValidPackages() { TxtResourceRecord( 'fletch-agent on raspberrypi._fletch_agent._tcp.local', result[1].validUntil, - text: '\x00', + text: '', ), SrvResourceRecord( 'fletch-agent on raspberrypi._fletch_agent._tcp.local', @@ -160,7 +160,25 @@ void testValidPackages() { TxtResourceRecord( '_______________.____._____', result[1].validUntil, - text: '\u{14}model=MacBookPro14,3\nosxvers=18\u{12}ecolor=225,225,223', + text: 'model=MacBookPro14,3\nosxvers=18\necolor=225,225,223\n', + ), + ]); + }); + + test('Can decode packages with a long text resource', () { + final List result = decodeMDnsResponse(packetWithLongTxt); + expect(result, isNotNull); + expect(result.length, 2); + expect(result, [ + PtrResourceRecord( + '_______________.____._____', + result[0].validUntil, + domainName: '______________________._______________.____._____', + ), + TxtResourceRecord( + '_______________.____._____', + result[1].validUntil, + text: (')' * 129) + '\n', ), ]); }); @@ -176,12 +194,6 @@ void testBadPackages() { }); } -void testNonUtf8Packages() { - test('Returns null for non-utf8 text resource', () { - expect(decodeMDnsResponse(nonUtf8Package), isNull); - }); -} - void testPTRRData() { test('Can read FQDN from PTR data', () { expect('sgjesse-macbookpro2 [78:31:c1:b8:55:38]._workstation._tcp.local', @@ -196,6 +208,16 @@ void testSRVRData() { }); } +void testNonUtf8DomainName() { + test('Returns non-null for non-utf8 domain name', () { + final List result = decodeMDnsResponse(nonUtf8Package); + expect(result, isNotNull); + expect(result[0] is TxtResourceRecord, isTrue); + final TxtResourceRecord txt = result[0]; + expect(txt.name, contains('�')); + }); +} + // One address. const List package1 = [ 0x00, @@ -1186,7 +1208,147 @@ const List packetWithoutQuestionWithAnArCount = [ 51, ]; -// Package with a text resource that is not valid utf8. +// This is the same as packetWithoutQuestionWithAnArCount, but the text +// resource just has a single long string. If the length isn't decoded +// separately from the string, there will be utf8 decoding failures. +const List packetWithLongTxt = [ + 0, + 0, + 132, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 15, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 4, + 95, + 95, + 95, + 95, + 5, + 95, + 95, + 95, + 95, + 95, + 0, + 0, + 12, + 0, + 1, + 0, + 0, + 17, + 148, + 0, + 25, + 22, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 192, + 12, + 22, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 12, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 95, + 192, + 28, + 0, + 16, + 0, + 1, + 0, + 0, + 17, + 148, + 0, + 51, + // Long string starts here. + 129, + 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, // 16 + 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, // 32 + 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, // + 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, // 64 + 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, // + 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, // + 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, // + 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, // 128, + 41, // 129 +]; + +// Package with a domain name that is not valid utf-8. const List nonUtf8Package = [ 0x00, 0x00, From aead29530e588b99e94a3638fd1a0eaaf002d3f8 Mon Sep 17 00:00:00 2001 From: Zachary Anderson Date: Thu, 3 Oct 2019 10:58:36 -0700 Subject: [PATCH 048/118] Bump multicast_dns version number for utf8 bugfix (#42) * Bump version number for utf8 bugfix * Adds CHANGELOG update --- packages/multicast_dns/CHANGELOG.md | 3 +++ packages/multicast_dns/pubspec.yaml | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/multicast_dns/CHANGELOG.md b/packages/multicast_dns/CHANGELOG.md index da11f54..267e730 100644 --- a/packages/multicast_dns/CHANGELOG.md +++ b/packages/multicast_dns/CHANGELOG.md @@ -1,3 +1,6 @@ +## 0.2.2 +* Fixes parsing of TXT records. Continues parsing on non-utf8 strings. + ## 0.2.1 * Fixes the handling of packets containing non-utf8 strings. diff --git a/packages/multicast_dns/pubspec.yaml b/packages/multicast_dns/pubspec.yaml index 2c20513..1438542 100644 --- a/packages/multicast_dns/pubspec.yaml +++ b/packages/multicast_dns/pubspec.yaml @@ -2,7 +2,7 @@ name: multicast_dns description: Dart package for mDNS queries (e.g. Bonjour, Avahi). author: Flutter Team homepage: https://github.com/flutter/packages/tree/master/packages/multicast_dns -version: 0.2.1 +version: 0.2.2 dependencies: meta: ^1.1.6 From 31a328ad79c86af2bdf79a16ead0a6b1f0a20b78 Mon Sep 17 00:00:00 2001 From: Rohan Thacker Date: Wed, 18 Dec 2019 06:06:13 +0530 Subject: [PATCH 049/118] Fixed Typo: Corrected record (#53) --- packages/multicast_dns/example/main.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/multicast_dns/example/main.dart b/packages/multicast_dns/example/main.dart index cbf14c5..e6cc74f 100644 --- a/packages/multicast_dns/example/main.dart +++ b/packages/multicast_dns/example/main.dart @@ -15,7 +15,7 @@ Future main() async { // Start the client with default options. await client.start(); - // Get the PTR recod for the service. + // Get the PTR record for the service. await for (PtrResourceRecord ptr in client .lookup(ResourceRecordQuery.serverPointer(name))) { // Use the domainName from the PTR record to get the SRV record, From 6bf7e0d4e94ff44bff35f59d06540593ac3a239f Mon Sep 17 00:00:00 2001 From: stuartmorgan Date: Tue, 17 Mar 2020 13:56:13 -0700 Subject: [PATCH 050/118] Create flutter_template_images package (#118) Contains images used in 'flutter create' templates, to avoid needing to check them into flutter/flutter where they will permanently inflate the repo size. Currently only contains the Windows app icon, since existing template icons are already part of the Flutter repository. Future template images, including changes to the existing images, should live here instead. --- packages/flutter_template_images/.gitignore | 34 ++++++++++++++++++ packages/flutter_template_images/CHANGELOG.md | 3 ++ packages/flutter_template_images/LICENSE | 25 +++++++++++++ packages/flutter_template_images/README.md | 9 +++++ .../lib/flutter_template_images.dart | 3 ++ packages/flutter_template_images/pubspec.yaml | 7 ++++ .../app/windows.tmpl/resources/app_icon.ico | Bin 0 -> 33772 bytes 7 files changed, 81 insertions(+) create mode 100644 packages/flutter_template_images/.gitignore create mode 100644 packages/flutter_template_images/CHANGELOG.md create mode 100644 packages/flutter_template_images/LICENSE create mode 100644 packages/flutter_template_images/README.md create mode 100644 packages/flutter_template_images/lib/flutter_template_images.dart create mode 100644 packages/flutter_template_images/pubspec.yaml create mode 100644 packages/flutter_template_images/templates/app/windows.tmpl/resources/app_icon.ico diff --git a/packages/flutter_template_images/.gitignore b/packages/flutter_template_images/.gitignore new file mode 100644 index 0000000..9e04949 --- /dev/null +++ b/packages/flutter_template_images/.gitignore @@ -0,0 +1,34 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +**/doc/api/ +.dart_tool/ +.flutter-plugins +.flutter-plugins-dependencies +.packages +.pub-cache/ +.pub/ +build/ + +# Exceptions to above rules. +!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages diff --git a/packages/flutter_template_images/CHANGELOG.md b/packages/flutter_template_images/CHANGELOG.md new file mode 100644 index 0000000..f866df4 --- /dev/null +++ b/packages/flutter_template_images/CHANGELOG.md @@ -0,0 +1,3 @@ +## [1.0.0] - 2020-03-16 + +* Windows app template icon. diff --git a/packages/flutter_template_images/LICENSE b/packages/flutter_template_images/LICENSE new file mode 100644 index 0000000..aea51a3 --- /dev/null +++ b/packages/flutter_template_images/LICENSE @@ -0,0 +1,25 @@ +Copyright 2014 The Flutter Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/packages/flutter_template_images/README.md b/packages/flutter_template_images/README.md new file mode 100644 index 0000000..3ae9dc9 --- /dev/null +++ b/packages/flutter_template_images/README.md @@ -0,0 +1,9 @@ +# flutter\_template\_images + +Images used by the `flutter_tools` templates. + +This project is an internal dependency of the `flutter` tool, and is +not intended to be used directly. It contains images files used in +`flutter create` templates, to avoid checking them into [the main +Flutter repository](https://github.com/flutter/flutter), where they would +permanently increase the checkout size over time if altered. diff --git a/packages/flutter_template_images/lib/flutter_template_images.dart b/packages/flutter_template_images/lib/flutter_template_images.dart new file mode 100644 index 0000000..fc5fff7 --- /dev/null +++ b/packages/flutter_template_images/lib/flutter_template_images.dart @@ -0,0 +1,3 @@ +library flutter_template_images; + +// There is no source for this package, since it only exists to hold images. diff --git a/packages/flutter_template_images/pubspec.yaml b/packages/flutter_template_images/pubspec.yaml new file mode 100644 index 0000000..986a557 --- /dev/null +++ b/packages/flutter_template_images/pubspec.yaml @@ -0,0 +1,7 @@ +name: flutter_template_images +description: Image files for use in flutter_tools templates. +version: 1.0.0 +homepage: https://github.com/flutter/packages/tree/master/packages/flutter_template_images + +environment: + sdk: ">=2.1.0 <3.0.0" diff --git a/packages/flutter_template_images/templates/app/windows.tmpl/resources/app_icon.ico b/packages/flutter_template_images/templates/app/windows.tmpl/resources/app_icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..c04e20caf6370ebb9253ad831cc31de4a9c965f6 GIT binary patch literal 33772 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 literal 0 HcmV?d00001 From 5d5ad4adf69087e67f15b12064b6dfc87f54e0a3 Mon Sep 17 00:00:00 2001 From: stuartmorgan Date: Mon, 30 Mar 2020 14:31:38 -0700 Subject: [PATCH 051/118] Move Windows icon (#127) The Windows template is being restructured to have the runner code in a runner folder; this moves the icon to reflect that structural change. --- packages/flutter_template_images/CHANGELOG.md | 4 ++++ packages/flutter_template_images/pubspec.yaml | 2 +- .../{ => runner}/resources/app_icon.ico | Bin 3 files changed, 5 insertions(+), 1 deletion(-) rename packages/flutter_template_images/templates/app/windows.tmpl/{ => runner}/resources/app_icon.ico (100%) diff --git a/packages/flutter_template_images/CHANGELOG.md b/packages/flutter_template_images/CHANGELOG.md index f866df4..829ec72 100644 --- a/packages/flutter_template_images/CHANGELOG.md +++ b/packages/flutter_template_images/CHANGELOG.md @@ -1,3 +1,7 @@ +## [1.0.1] - 2020-03-30 + +* Moved Windows app template icon for new folder structure. + ## [1.0.0] - 2020-03-16 * Windows app template icon. diff --git a/packages/flutter_template_images/pubspec.yaml b/packages/flutter_template_images/pubspec.yaml index 986a557..8187da5 100644 --- a/packages/flutter_template_images/pubspec.yaml +++ b/packages/flutter_template_images/pubspec.yaml @@ -1,6 +1,6 @@ name: flutter_template_images description: Image files for use in flutter_tools templates. -version: 1.0.0 +version: 1.0.1 homepage: https://github.com/flutter/packages/tree/master/packages/flutter_template_images environment: diff --git a/packages/flutter_template_images/templates/app/windows.tmpl/resources/app_icon.ico b/packages/flutter_template_images/templates/app/windows.tmpl/runner/resources/app_icon.ico similarity index 100% rename from packages/flutter_template_images/templates/app/windows.tmpl/resources/app_icon.ico rename to packages/flutter_template_images/templates/app/windows.tmpl/runner/resources/app_icon.ico From 67c201dac661236a15260e9f40702f8933b0d064 Mon Sep 17 00:00:00 2001 From: gaaclarke <30870216+gaaclarke@users.noreply.github.com> Date: Mon, 19 Oct 2020 17:22:36 -0700 Subject: [PATCH 052/118] sorted pub dependencies (#231) --- packages/multicast_dns/pubspec.yaml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/multicast_dns/pubspec.yaml b/packages/multicast_dns/pubspec.yaml index 1438542..98c75ae 100644 --- a/packages/multicast_dns/pubspec.yaml +++ b/packages/multicast_dns/pubspec.yaml @@ -1,6 +1,5 @@ name: multicast_dns description: Dart package for mDNS queries (e.g. Bonjour, Avahi). -author: Flutter Team homepage: https://github.com/flutter/packages/tree/master/packages/multicast_dns version: 0.2.2 @@ -8,8 +7,8 @@ dependencies: meta: ^1.1.6 dev_dependencies: - test: "^1.3.4" mockito: "^4.1.0" + test: "^1.3.4" environment: - sdk: ">=2.1.1-dev.2.0 <3.0.0" + sdk: ">=2.2.0 <3.0.0" From 1ecbdc41a88ead9f590f0537a1035a88821f254c Mon Sep 17 00:00:00 2001 From: Aneesh Rao Date: Thu, 28 Jan 2021 04:15:14 +0530 Subject: [PATCH 053/118] Add maskable icons to improve lighthouse score (#259) --- .../web/icons/Icon-maskable-192.png.copy.tmpl | Bin 0 -> 3822 bytes .../web/icons/Icon-maskable-512.png.copy.tmpl | Bin 0 -> 15074 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 packages/flutter_template_images/templates/app/web/icons/Icon-maskable-192.png.copy.tmpl create mode 100644 packages/flutter_template_images/templates/app/web/icons/Icon-maskable-512.png.copy.tmpl diff --git a/packages/flutter_template_images/templates/app/web/icons/Icon-maskable-192.png.copy.tmpl b/packages/flutter_template_images/templates/app/web/icons/Icon-maskable-192.png.copy.tmpl new file mode 100644 index 0000000000000000000000000000000000000000..c9236db8fa69008a23a3775e84f3a834a709d215 GIT binary patch literal 3822 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 AbpQYW literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/app/web/icons/Icon-maskable-512.png.copy.tmpl b/packages/flutter_template_images/templates/app/web/icons/Icon-maskable-512.png.copy.tmpl new file mode 100644 index 0000000000000000000000000000000000000000..4068c4e81e4a9f554b130c8c226df331087d9636 GIT binary patch literal 15074 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%0A+wg>D?6x$+H15ns>`Rjbu^ncmr`?lqmL%*N) vcPIZI+kh?KAq~S{=659jp1}Ug+sttd{zDh>+{|KQ9Q;|k%H0J@^5g#p9_a Date: Thu, 4 Mar 2021 12:36:02 -0800 Subject: [PATCH 054/118] migrate mDNS to null safety (#297) --- packages/multicast_dns/CHANGELOG.md | 4 ++ packages/multicast_dns/lib/multicast_dns.dart | 45 ++++++++++--------- packages/multicast_dns/lib/src/constants.dart | 8 ++-- .../lib/src/lookup_resolver.dart | 4 +- .../lib/src/native_protocol_client.dart | 15 ++++--- packages/multicast_dns/lib/src/packet.dart | 14 +++--- .../lib/src/resource_record.dart | 44 +++++++----------- packages/multicast_dns/pubspec.yaml | 10 ++--- packages/multicast_dns/test/client_test.dart | 29 +++++++++--- packages/multicast_dns/test/decode_test.dart | 24 +++++----- .../test/lookup_resolver_test.dart | 15 ++++--- 11 files changed, 110 insertions(+), 102 deletions(-) diff --git a/packages/multicast_dns/CHANGELOG.md b/packages/multicast_dns/CHANGELOG.md index 267e730..fa64e26 100644 --- a/packages/multicast_dns/CHANGELOG.md +++ b/packages/multicast_dns/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.3.0 + +* Migrate package to null safety. + ## 0.2.2 * Fixes parsing of TXT records. Continues parsing on non-utf8 strings. diff --git a/packages/multicast_dns/lib/multicast_dns.dart b/packages/multicast_dns/lib/multicast_dns.dart index 3b8fa47..148a4b0 100644 --- a/packages/multicast_dns/lib/multicast_dns.dart +++ b/packages/multicast_dns/lib/multicast_dns.dart @@ -48,14 +48,13 @@ class MDnsClient { bool _starting = false; bool _started = false; - RawDatagramSocket _incoming; final List _sockets = []; final LookupResolver _resolver = LookupResolver(); final ResourceRecordCache _cache = ResourceRecordCache(); final RawDatagramSocketFactory _rawDatagramSocketFactory; - InternetAddress _mDnsAddress; - int _mDnsPort; + InternetAddress? _mDnsAddress; + int? _mDnsPort; /// Find all network interfaces with an the [InternetAddressType] specified. static NetworkInterfacesFactory allInterfacesFactory = @@ -82,14 +81,14 @@ class MDnsClient { /// for the mDNS query. If not provided, defaults to either `224.0.0.251` or /// or `FF02::FB`. Future start({ - InternetAddress listenAddress, - NetworkInterfacesFactory interfacesFactory, + InternetAddress? listenAddress, + NetworkInterfacesFactory? interfacesFactory, int mDnsPort = mDnsPort, - InternetAddress mDnsAddress, + InternetAddress? mDnsAddress, }) async { listenAddress ??= InternetAddress.anyIPv4; interfacesFactory ??= allInterfacesFactory; - _mDnsPort = mDnsPort; + final int selectedMDnsPort = _mDnsPort = mDnsPort; _mDnsAddress = mDnsAddress; assert(listenAddress.address == InternetAddress.anyIPv4.address || @@ -101,32 +100,32 @@ class MDnsClient { _starting = true; // Listen on all addresses. - _incoming = await _rawDatagramSocketFactory( + final RawDatagramSocket incoming = await _rawDatagramSocketFactory( listenAddress.address, - _mDnsPort, + selectedMDnsPort, reuseAddress: true, reusePort: true, ttl: 255, ); // Can't send to IPv6 any address. - if (_incoming.address != InternetAddress.anyIPv6) { - _sockets.add(_incoming); + if (incoming.address != InternetAddress.anyIPv6) { + _sockets.add(incoming); } - _mDnsAddress ??= _incoming.address.type == InternetAddressType.IPv4 + _mDnsAddress ??= incoming.address.type == InternetAddressType.IPv4 ? mDnsAddressIPv4 : mDnsAddressIPv6; final List interfaces = - await interfacesFactory(listenAddress.type); + (await interfacesFactory(listenAddress.type)).toList(); for (NetworkInterface interface in interfaces) { // Create a socket for sending on each adapter. final InternetAddress targetAddress = interface.addresses[0]; final RawDatagramSocket socket = await _rawDatagramSocketFactory( targetAddress, - _mDnsPort, + selectedMDnsPort, reuseAddress: true, reusePort: true, ttl: 255, @@ -147,9 +146,9 @@ class MDnsClient { )); } // Join multicast on this interface. - _incoming.joinMulticast(_mDnsAddress, interface); + incoming.joinMulticast(_mDnsAddress!, interface); } - _incoming.listen(_handleIncoming); + incoming.listen((RawSocketEvent event) => _handleIncoming(event, incoming)); _started = true; _starting = false; } @@ -186,7 +185,8 @@ class MDnsClient { ResourceRecordQuery query, { Duration timeout = const Duration(seconds: 5), }) { - if (!_started) { + final int? selectedMDnsPort = _mDnsPort; + if (!_started || selectedMDnsPort == null) { throw StateError('mDNS client must be started before calling lookup.'); } // Look for entries in the cache. @@ -207,18 +207,21 @@ class MDnsClient { // Send the request on all interfaces. final List packet = query.encode(); for (RawDatagramSocket socket in _sockets) { - socket.send(packet, _mDnsAddress, _mDnsPort); + socket.send(packet, _mDnsAddress!, selectedMDnsPort); } return results; } // Process incoming datagrams. - void _handleIncoming(RawSocketEvent event) { + void _handleIncoming(RawSocketEvent event, RawDatagramSocket incoming) { if (event == RawSocketEvent.read) { - final Datagram datagram = _incoming.receive(); + final Datagram? datagram = incoming.receive(); + if (datagram == null) { + return; + } // Check for published responses. - final List response = decodeMDnsResponse(datagram.data); + final List? response = decodeMDnsResponse(datagram.data); if (response != null) { _cache.updateRecords(response); _resolver.handleResponse(response); diff --git a/packages/multicast_dns/lib/src/constants.dart b/packages/multicast_dns/lib/src/constants.dart index 2a22264..061329d 100644 --- a/packages/multicast_dns/lib/src/constants.dart +++ b/packages/multicast_dns/lib/src/constants.dart @@ -14,20 +14,20 @@ final InternetAddress mDnsAddressIPv6 = InternetAddress('FF02::FB'); const int mDnsPort = 5353; /// Enumeration of supported resource record class types. -class ResourceRecordClass { +abstract class ResourceRecordClass { // This class is intended to be used as a namespace, and should not be // extended directly. - factory ResourceRecordClass._() => null; + ResourceRecordClass._(); /// Internet address class ("IN"). static const int internet = 1; } /// Enumeration of DNS question types. -class QuestionType { +abstract class QuestionType { // This class is intended to be used as a namespace, and should not be // extended directly. - factory QuestionType._() => null; + QuestionType._(); /// "QU" Question. static const int unicast = 0x8000; diff --git a/packages/multicast_dns/lib/src/lookup_resolver.dart b/packages/multicast_dns/lib/src/lookup_resolver.dart index b374e9f..40cc86b 100644 --- a/packages/multicast_dns/lib/src/lookup_resolver.dart +++ b/packages/multicast_dns/lib/src/lookup_resolver.dart @@ -25,7 +25,7 @@ class PendingRequest extends LinkedListEntry { final StreamController controller; /// The timer for the request. - Timer timer; + Timer? timer; } /// Class for keeping track of pending lookups and processing incoming @@ -89,7 +89,7 @@ class LookupResolver { while (_pendingRequests.isNotEmpty) { final PendingRequest request = _pendingRequests.first; request.unlink(); - request.timer.cancel(); + request.timer?.cancel(); request.controller.close(); } } diff --git a/packages/multicast_dns/lib/src/native_protocol_client.dart b/packages/multicast_dns/lib/src/native_protocol_client.dart index 553d564..734412b 100644 --- a/packages/multicast_dns/lib/src/native_protocol_client.dart +++ b/packages/multicast_dns/lib/src/native_protocol_client.dart @@ -29,7 +29,7 @@ class ResourceRecordCache { for (final SplayTreeMap> map in _cache.values) { for (final List records in map.values) { - count += records?.length; + count += records.length; } } return count; @@ -45,14 +45,15 @@ class ResourceRecordCache { // TODO(dnfield): Update this to use set literal syntax when we're able to bump the SDK constraint. seenRecordTypes[record.resourceRecordType] ??= Set(); // ignore: prefer_collection_literals - if (seenRecordTypes[record.resourceRecordType].add(record.name)) { + if (seenRecordTypes[record.resourceRecordType]!.add(record.name)) { _cache[record.resourceRecordType] ??= SplayTreeMap>(); - _cache[record.resourceRecordType] - [record.name] = [record]; + _cache[record.resourceRecordType]![record.name] = [ + record + ]; } else { - _cache[record.resourceRecordType][record.name].add(record); + _cache[record.resourceRecordType]![record.name]!.add(record); } } } @@ -62,12 +63,12 @@ class ResourceRecordCache { String name, int type, List results) { assert(ResourceRecordType.debugAssertValid(type)); final int time = DateTime.now().millisecondsSinceEpoch; - final SplayTreeMap> candidates = _cache[type]; + final SplayTreeMap>? candidates = _cache[type]; if (candidates == null) { return; } - final List candidateRecords = candidates[name]; + final List? candidateRecords = candidates[name]; if (candidateRecords == null) { return; } diff --git a/packages/multicast_dns/lib/src/packet.dart b/packages/multicast_dns/lib/src/packet.dart index 2dae398..9905689 100644 --- a/packages/multicast_dns/lib/src/packet.dart +++ b/packages/multicast_dns/lib/src/packet.dart @@ -23,7 +23,6 @@ const int _kHeaderSize = 12; /// Will attempt to append 'local' if the name is something like '_http._tcp', /// and '._tcp.local' if name is something like '_http'. List processDnsNameParts(String name) { - assert(name != null); final List parts = name.split('.'); if (parts.length == 1) { return [parts[0], '_tcp', 'local']; @@ -47,9 +46,7 @@ List encodeMDnsQuery( int type = ResourceRecordType.addressIPv4, bool multicast = true, }) { - assert(name != null); assert(ResourceRecordType.debugAssertValid(type)); - assert(multicast != null); final List nameParts = processDnsNameParts(name); final List> rawNameParts = @@ -179,7 +176,7 @@ _FQDNReadResult _readFQDN( /// If decoding fails (e.g. due to an invalid packet), `null` is returned. /// /// See https://tools.ietf.org/html/rfc1035 for format. -ResourceRecordQuery decodeMDnsQuery(List packet) { +ResourceRecordQuery? decodeMDnsQuery(List packet) { final int length = packet.length; if (length < _kHeaderSize) { return null; @@ -214,7 +211,7 @@ ResourceRecordQuery decodeMDnsQuery(List packet) { /// If decoding fails (e.g. due to an invalid packet) `null` is returned. /// /// See https://tools.ietf.org/html/rfc1035 for the format. -List decodeMDnsResponse(List packet) { +List? decodeMDnsResponse(List packet) { final int length = packet.length; if (length < _kHeaderSize) { return null; @@ -242,7 +239,7 @@ List decodeMDnsResponse(List packet) { } } - ResourceRecord readResourceRecord() { + ResourceRecord? readResourceRecord() { // First read the FQDN. final _FQDNReadResult result = _readFQDN(data, packetBytes, offset, length); final String fqdn = result.fqdn; @@ -319,7 +316,6 @@ List decodeMDnsResponse(List packet) { priority: priority, weight: weight, ); - break; case ResourceRecordType.serverPointer: checkLength(offset + readDataLength); final _FQDNReadResult result = @@ -373,7 +369,7 @@ List decodeMDnsResponse(List packet) { offset += 4; } for (int i = 0; i < remainingCount; i++) { - final ResourceRecord record = readResourceRecord(); + final ResourceRecord? record = readResourceRecord(); if (record != null) { result.add(record); } @@ -391,7 +387,7 @@ class MDnsDecodeException implements Exception { /// specified [offset]. /// /// The [offset] parameter should not be null. - const MDnsDecodeException(this.offset) : assert(offset != null); + const MDnsDecodeException(this.offset); /// The offset in the packet at which the exception occurred. final int offset; diff --git a/packages/multicast_dns/lib/src/resource_record.dart b/packages/multicast_dns/lib/src/resource_record.dart index e4be5f3..eae21bf 100644 --- a/packages/multicast_dns/lib/src/resource_record.dart +++ b/packages/multicast_dns/lib/src/resource_record.dart @@ -6,7 +6,6 @@ import 'dart:convert'; import 'dart:io'; import 'dart:typed_data'; -import 'package:meta/meta.dart'; import 'package:multicast_dns/src/constants.dart'; import 'package:multicast_dns/src/packet.dart'; @@ -19,7 +18,6 @@ int _combineHash(int current, int hash) => (current & _multipleHashPrime) ^ hash; int _hashValues(List values) { - assert(values != null); assert(values.isNotEmpty); return values.fold( @@ -29,10 +27,10 @@ int _hashValues(List values) { } /// Enumeration of support resource record types. -class ResourceRecordType { +abstract class ResourceRecordType { // This class is intended to be used as a namespace, and should not be // extended directly. - factory ResourceRecordType._() => null; + ResourceRecordType._(); /// An IPv4 Address record, also known as an "A" record. It has a value of 1. static const int addressIPv4 = 1; @@ -94,8 +92,7 @@ class ResourceRecordQuery { this.resourceRecordType, this.fullyQualifiedName, this.questionType, - ) : assert(fullyQualifiedName != null), - assert(ResourceRecordType.debugAssertValid(resourceRecordType)); + ) : assert(ResourceRecordType.debugAssertValid(resourceRecordType)); /// An A (IPv4) query. ResourceRecordQuery.addressIPv4( @@ -191,8 +188,7 @@ class ResourceRecordQuery { /// Base implementation of DNS resource records (RRs). abstract class ResourceRecord { /// Creates a new ResourceRecord. - const ResourceRecord(this.resourceRecordType, this.name, this.validUntil) - : assert(name != null); + const ResourceRecord(this.resourceRecordType, this.name, this.validUntil); /// The FQDN for this record. final String name; @@ -207,14 +203,13 @@ abstract class ResourceRecord { @override String toString() => - '$runtimeType{$name, validUntil: ${DateTime.fromMillisecondsSinceEpoch(validUntil ?? 0)}, $_additionalInfo}'; + '$runtimeType{$name, validUntil: ${DateTime.fromMillisecondsSinceEpoch(validUntil)}, $_additionalInfo}'; @override bool operator ==(Object other) { - return other.runtimeType == runtimeType && _equals(other); + return other is ResourceRecord && _equals(other); } - @protected bool _equals(ResourceRecord other) { return other.name == name && other.validUntil == validUntil && @@ -233,7 +228,6 @@ abstract class ResourceRecord { // Subclasses of this class should use _hashValues to create a hash code // that will then get hashed in with the common values on this class. - @protected int get _hashCode; /// Low level method for encoding this record into an mDNS packet. @@ -250,9 +244,8 @@ class PtrResourceRecord extends ResourceRecord { PtrResourceRecord( String name, int validUntil, { - @required this.domainName, - }) : assert(domainName != null), - super(ResourceRecordType.serverPointer, name, validUntil); + required this.domainName, + }) : super(ResourceRecordType.serverPointer, name, validUntil); /// The FQDN for this record. final String domainName; @@ -282,7 +275,7 @@ class IPAddressResourceRecord extends ResourceRecord { IPAddressResourceRecord( String name, int validUntil, { - @required this.address, + required this.address, }) : super( address.type == InternetAddressType.IPv4 ? ResourceRecordType.addressIPv4 @@ -316,15 +309,11 @@ class SrvResourceRecord extends ResourceRecord { SrvResourceRecord( String name, int validUntil, { - @required this.target, - @required this.port, - @required this.priority, - @required this.weight, - }) : assert(target != null), - assert(port != null), - assert(priority != null), - assert(weight != null), - super(ResourceRecordType.service, name, validUntil); + required this.target, + required this.port, + required this.priority, + required this.weight, + }) : super(ResourceRecordType.service, name, validUntil); /// The hostname for this record. final String target; @@ -378,9 +367,8 @@ class TxtResourceRecord extends ResourceRecord { TxtResourceRecord( String name, int validUntil, { - @required this.text, - }) : assert(text != null), - super(ResourceRecordType.text, name, validUntil); + required this.text, + }) : super(ResourceRecordType.text, name, validUntil); /// The raw text from this record. final String text; diff --git a/packages/multicast_dns/pubspec.yaml b/packages/multicast_dns/pubspec.yaml index 98c75ae..d59445f 100644 --- a/packages/multicast_dns/pubspec.yaml +++ b/packages/multicast_dns/pubspec.yaml @@ -1,14 +1,10 @@ name: multicast_dns description: Dart package for mDNS queries (e.g. Bonjour, Avahi). homepage: https://github.com/flutter/packages/tree/master/packages/multicast_dns -version: 0.2.2 - -dependencies: - meta: ^1.1.6 +version: 0.3.0 dev_dependencies: - mockito: "^4.1.0" - test: "^1.3.4" + test: "^1.16.5" environment: - sdk: ">=2.2.0 <3.0.0" + sdk: ">=2.12.0-0 <3.0.0" diff --git a/packages/multicast_dns/test/client_test.dart b/packages/multicast_dns/test/client_test.dart index f327c20..85ab0b1 100644 --- a/packages/multicast_dns/test/client_test.dart +++ b/packages/multicast_dns/test/client_test.dart @@ -2,23 +2,25 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. +import 'dart:async'; import 'dart:io'; import 'package:multicast_dns/multicast_dns.dart'; -import 'package:mockito/mockito.dart'; +import 'package:test/fake.dart'; import 'package:test/test.dart'; void main() { test('Can inject datagram socket factory and configure mdns port', () async { - int lastPort; - final MockRawDatagramSocket mockRawDatagramSocket = MockRawDatagramSocket(); + late int lastPort; + final FakeRawDatagramSocket datagramSocket = FakeRawDatagramSocket(); final MDnsClient client = MDnsClient(rawDatagramSocketFactory: (dynamic host, int port, - {bool reuseAddress, bool reusePort, int ttl = 1}) async { + {bool reuseAddress = true, + bool reusePort = true, + int ttl = 1}) async { lastPort = port; - return mockRawDatagramSocket; + return datagramSocket; }); - when(mockRawDatagramSocket.address).thenReturn(InternetAddress.anyIPv4); await client.start( mDnsPort: 1234, @@ -29,4 +31,17 @@ void main() { }); } -class MockRawDatagramSocket extends Mock implements RawDatagramSocket {} +class FakeRawDatagramSocket extends Fake implements RawDatagramSocket { + @override + InternetAddress get address => InternetAddress.anyIPv4; + + @override + StreamSubscription listen( + void Function(RawSocketEvent event)? onData, + {Function? onError, + void Function()? onDone, + bool? cancelOnError}) { + return const Stream.empty().listen(onData, + onError: onError, cancelOnError: cancelOnError, onDone: onDone); + } +} diff --git a/packages/multicast_dns/test/decode_test.dart b/packages/multicast_dns/test/decode_test.dart index f11f4d9..e8c1afa 100644 --- a/packages/multicast_dns/test/decode_test.dart +++ b/packages/multicast_dns/test/decode_test.dart @@ -21,23 +21,23 @@ void main() { void testValidPackages() { test('Can decode valid packets', () { - List result = decodeMDnsResponse(package1); + List result = decodeMDnsResponse(package1)!; expect(result, isNotNull); expect(result.length, 1); - IPAddressResourceRecord ipResult = result[0]; + IPAddressResourceRecord ipResult = result[0] as IPAddressResourceRecord; expect(ipResult.name, 'raspberrypi.local'); expect(ipResult.address.address, '192.168.1.191'); - result = decodeMDnsResponse(package2); + result = decodeMDnsResponse(package2)!; expect(result.length, 2); - ipResult = result[0]; + ipResult = result[0] as IPAddressResourceRecord; expect(ipResult.name, 'raspberrypi.local'); expect(ipResult.address.address, '192.168.1.191'); - ipResult = result[1]; + ipResult = result[1] as IPAddressResourceRecord; expect(ipResult.name, 'raspberrypi.local'); expect(ipResult.address.address, '169.254.95.83'); - result = decodeMDnsResponse(package3); + result = decodeMDnsResponse(package3)!; expect(result.length, 8); expect(result, [ TxtResourceRecord( @@ -85,7 +85,7 @@ void testValidPackages() { ), ]); - result = decodeMDnsResponse(packagePtrResponse); + result = decodeMDnsResponse(packagePtrResponse)!; expect(6, result.length); expect(result, [ PtrResourceRecord( @@ -127,7 +127,7 @@ void testValidPackages() { // Fixes https://github.com/flutter/flutter/issues/31854 test('Can decode packages with question, answer and additional', () { final List result = - decodeMDnsResponse(packetWithQuestionAnArCount); + decodeMDnsResponse(packetWithQuestionAnArCount)!; expect(result, isNotNull); expect(result.length, 2); expect(result, [ @@ -148,7 +148,7 @@ void testValidPackages() { test('Can decode packages without question and with answer and additional', () { final List result = - decodeMDnsResponse(packetWithoutQuestionWithAnArCount); + decodeMDnsResponse(packetWithoutQuestionWithAnArCount)!; expect(result, isNotNull); expect(result.length, 2); expect(result, [ @@ -166,7 +166,7 @@ void testValidPackages() { }); test('Can decode packages with a long text resource', () { - final List result = decodeMDnsResponse(packetWithLongTxt); + final List result = decodeMDnsResponse(packetWithLongTxt)!; expect(result, isNotNull); expect(result.length, 2); expect(result, [ @@ -210,10 +210,10 @@ void testSRVRData() { void testNonUtf8DomainName() { test('Returns non-null for non-utf8 domain name', () { - final List result = decodeMDnsResponse(nonUtf8Package); + final List result = decodeMDnsResponse(nonUtf8Package)!; expect(result, isNotNull); expect(result[0] is TxtResourceRecord, isTrue); - final TxtResourceRecord txt = result[0]; + final TxtResourceRecord txt = result[0] as TxtResourceRecord; expect(txt.name, contains('�')); }); } diff --git a/packages/multicast_dns/test/lookup_resolver_test.dart b/packages/multicast_dns/test/lookup_resolver_test.dart index 6a311fd..3423a68 100644 --- a/packages/multicast_dns/test/lookup_resolver_test.dart +++ b/packages/multicast_dns/test/lookup_resolver_test.dart @@ -40,7 +40,8 @@ void testResult() { final ResourceRecord response = ip4Result('xxx.local', InternetAddress('1.2.3.4')); resolver.handleResponse([response]); - final IPAddressResourceRecord result = await futureResult.first; + final IPAddressResourceRecord result = + await futureResult.first as IPAddressResourceRecord; expect('1.2.3.4', result.address.address); resolver.clearPendingRequests(); }); @@ -59,8 +60,10 @@ void testResult2() { final ResourceRecord response2 = ip4Result('yyy.local', InternetAddress('2.3.4.5')); resolver.handleResponse([response2, response1]); - final IPAddressResourceRecord result1 = await futureResult1.first; - final IPAddressResourceRecord result2 = await futureResult2.first; + final IPAddressResourceRecord result1 = + await futureResult1.first as IPAddressResourceRecord; + final IPAddressResourceRecord result2 = + await futureResult2.first as IPAddressResourceRecord; expect('1.2.3.4', result1.address.address); expect('2.3.4.5', result2.address.address); resolver.clearPendingRequests(); @@ -88,8 +91,10 @@ void testResult3() { resolver.handleResponse([response0]); resolver.handleResponse([response2, response1]); resolver.handleResponse([response0]); - final IPAddressResourceRecord result1 = await futureResult1.first; - final IPAddressResourceRecord result2 = await futureResult2.first; + final IPAddressResourceRecord result1 = + await futureResult1.first as IPAddressResourceRecord; + final IPAddressResourceRecord result2 = + await futureResult2.first as IPAddressResourceRecord; expect('1.2.3.4', result1.address.address); expect('2.3.4.5', result2.address.address); resolver.clearPendingRequests(); From 46e6dfb844f86752dac9dc47e73c34cf37b8a373 Mon Sep 17 00:00:00 2001 From: Brian Egan Date: Wed, 10 Mar 2021 16:37:11 +0100 Subject: [PATCH 055/118] [flutter_template_images] Add support for new template and shared platform files (#295) Moves assets common to both template apps into an app_shared directory and introduces a new list_detail_app folder to support images unique to the new template. --- packages/flutter_template_images/CHANGELOG.md | 9 +++++++-- packages/flutter_template_images/pubspec.yaml | 2 +- .../web/icons/Icon-maskable-192.png.copy.tmpl | Bin .../web/icons/Icon-maskable-512.png.copy.tmpl | Bin .../windows.tmpl/runner/resources/app_icon.ico | Bin .../assets/images/2.0x/flutter_logo.png | Bin 0 -> 619 bytes .../assets/images/3.0x/flutter_logo.png | Bin 0 -> 810 bytes .../assets/images/flutter_logo.png | Bin 0 -> 419 bytes 8 files changed, 8 insertions(+), 3 deletions(-) rename packages/flutter_template_images/templates/{app => app_shared}/web/icons/Icon-maskable-192.png.copy.tmpl (100%) rename packages/flutter_template_images/templates/{app => app_shared}/web/icons/Icon-maskable-512.png.copy.tmpl (100%) rename packages/flutter_template_images/templates/{app => app_shared}/windows.tmpl/runner/resources/app_icon.ico (100%) create mode 100644 packages/flutter_template_images/templates/list_detail_app/assets/images/2.0x/flutter_logo.png create mode 100644 packages/flutter_template_images/templates/list_detail_app/assets/images/3.0x/flutter_logo.png create mode 100644 packages/flutter_template_images/templates/list_detail_app/assets/images/flutter_logo.png diff --git a/packages/flutter_template_images/CHANGELOG.md b/packages/flutter_template_images/CHANGELOG.md index 829ec72..7442d0b 100644 --- a/packages/flutter_template_images/CHANGELOG.md +++ b/packages/flutter_template_images/CHANGELOG.md @@ -1,7 +1,12 @@ -## [1.0.1] - 2020-03-30 +## 2.0.0 + +* Move assets common to all app templates to a new `app_shared` directory. +* Create `list_detail_app` directory and assets to support new app template. + +## 1.0.1 * Moved Windows app template icon for new folder structure. -## [1.0.0] - 2020-03-16 +## 1.0.0 * Windows app template icon. diff --git a/packages/flutter_template_images/pubspec.yaml b/packages/flutter_template_images/pubspec.yaml index 8187da5..8b51fb2 100644 --- a/packages/flutter_template_images/pubspec.yaml +++ b/packages/flutter_template_images/pubspec.yaml @@ -1,6 +1,6 @@ name: flutter_template_images description: Image files for use in flutter_tools templates. -version: 1.0.1 +version: 2.0.0 homepage: https://github.com/flutter/packages/tree/master/packages/flutter_template_images environment: diff --git a/packages/flutter_template_images/templates/app/web/icons/Icon-maskable-192.png.copy.tmpl b/packages/flutter_template_images/templates/app_shared/web/icons/Icon-maskable-192.png.copy.tmpl similarity index 100% rename from packages/flutter_template_images/templates/app/web/icons/Icon-maskable-192.png.copy.tmpl rename to packages/flutter_template_images/templates/app_shared/web/icons/Icon-maskable-192.png.copy.tmpl diff --git a/packages/flutter_template_images/templates/app/web/icons/Icon-maskable-512.png.copy.tmpl b/packages/flutter_template_images/templates/app_shared/web/icons/Icon-maskable-512.png.copy.tmpl similarity index 100% rename from packages/flutter_template_images/templates/app/web/icons/Icon-maskable-512.png.copy.tmpl rename to packages/flutter_template_images/templates/app_shared/web/icons/Icon-maskable-512.png.copy.tmpl diff --git a/packages/flutter_template_images/templates/app/windows.tmpl/runner/resources/app_icon.ico b/packages/flutter_template_images/templates/app_shared/windows.tmpl/runner/resources/app_icon.ico similarity index 100% rename from packages/flutter_template_images/templates/app/windows.tmpl/runner/resources/app_icon.ico rename to packages/flutter_template_images/templates/app_shared/windows.tmpl/runner/resources/app_icon.ico diff --git a/packages/flutter_template_images/templates/list_detail_app/assets/images/2.0x/flutter_logo.png b/packages/flutter_template_images/templates/list_detail_app/assets/images/2.0x/flutter_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..b65164de707ffeaf0adfca5fca65532bf97e6903 GIT binary patch literal 619 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H3?#oinD`S&H3s;ExB}^b{r?#vrgK>I2kif@ zvH816@%GSTKN!MhbHpsw+WI}@_)o2^Ujq(*4>|fhmwB2f9E#&lh@dHUo7LNZ{xgp@r+-ynauvLPwNoN4|Z_>tNAZ;@h5j(?S79JcUYfB`=#qy r6fZFpo3n_4Rl|XiE8s&sR~^H;NW15^d4qg`5ys%@>gTe~DWM4f{@o*g literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/list_detail_app/assets/images/3.0x/flutter_logo.png b/packages/flutter_template_images/templates/list_detail_app/assets/images/3.0x/flutter_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..97e5dc9af6e1093966c5cd42d608fd6fbb6a0c59 GIT binary patch literal 810 zcmeAS@N?(olHy`uVBq!ia0vp^2SAvE8Azrw%`pX16#+gWu0UF2`*(-^-y@EH58eMI z^w{s z-$IW5@LT%57HGFUA^wwrfyu|y#WAGf*4wMk zgAN-AxF%k#KCURBVA1=%-ucp;9Uj}ZG#l?Wes0(B%({NdIoXW<{g3WiupaK0x3By2 zO4s)_FGS)mJr|)n_%@ z)kihD)q6Gi)z>tJ)#o(E)yFiZ)%!H&)t5Jx)rUK-{vXl2fA4~;^_xE>GN_~ps{eO!b9`tLyxW8Xh;HNSd-@|xOj=ytR+do>D zt9>mOkvaAL$-iq%!vCf*DgR4ol&oKHV8Z?Agj4S|4W8wT%=mnri|3a%tJ>eCOpE`; zHb(y6c3?w&Y{ISmIsp&Mrw9G7`Sv8_P1LLTesVhEI)8;vvu5vq*tGV3&cSo}TNXSq zj|})It+V3iSy7We$GB|jf?4DCFKlYK@8ftOf60QQ_A~Fi*3bCZZ_jpf?zg4|^)^x| zt2OmGe$>0=M;cybjjOklN_(oQ_u}uL;@3elyf)C=)PemO(7H=26jVtWmubrDh3}(04)hM&xSK7O%X|>Mc j1|}|z1*pUejUUWgK0Q%uH(H?zOn3~Qu6{1-oD!M<&k2w@ literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/list_detail_app/assets/images/flutter_logo.png b/packages/flutter_template_images/templates/list_detail_app/assets/images/flutter_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..b5c6ca710c937527ca8d2d344214243d6db33832 GIT binary patch literal 419 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!@&kNAT!FN~`u7^!zegPZ&Ja3_ z)pe?NNpCL!ThaUauw)u_bwr{%Izl9$A!5B7M$govP zxh~|$561A>Od+#a0;aQjP2sie<+JJ*(`u4bZve_F*PR4v(b@jZ=Md1SAK%^B{{yWQ zFA4GsW)M(NFaUyj5NMdc{{H>@?}1?b(XAk7pYe2Y42d}W_VP)gCIbQ2ix!U>4q9?~ zIsEybZ^G7cAu^%-PQ=yx*;eIK#gYnUFW+9QvQNJH+nbx4)6dKOIC(3+3g6;V=GFge(48{@_RM&lLju^uE+^au+>tK7OIONyesA;#Zub zQs3&YevL0~GuE6t~Fo%7BFztX3q{1RVU;;PiN_-8qleWA`_& zw({X*ef?P{^t~Y0vFF>PCUdo}=4?%^3QRb0$VpT0kLyEL`Hh?APM literal 0 HcmV?d00001 From 04e5d5aa18b6e18da1868b1e920977f0e895149b Mon Sep 17 00:00:00 2001 From: Michael Goderbauer Date: Thu, 11 Mar 2021 13:40:43 -0800 Subject: [PATCH 056/118] Sync lints and fix offenders (#308) --- packages/multicast_dns/example/main.dart | 4 ++-- .../{mdns-resolve.dart => mdns_resolve.dart} | 6 +++--- .../example/{mdns-sd.dart => mdns_sd.dart} | 10 +++++----- packages/multicast_dns/lib/multicast_dns.dart | 20 ++++++++++--------- .../lib/src/lookup_resolver.dart | 4 ++-- .../lib/src/native_protocol_client.dart | 2 +- .../lib/src/resource_record.dart | 9 ++++++--- packages/multicast_dns/pubspec.yaml | 3 +++ packages/multicast_dns/test/decode_test.dart | 2 +- 9 files changed, 34 insertions(+), 26 deletions(-) rename packages/multicast_dns/example/{mdns-resolve.dart => mdns_resolve.dart} (84%) rename packages/multicast_dns/example/{mdns-sd.dart => mdns_sd.dart} (85%) diff --git a/packages/multicast_dns/example/main.dart b/packages/multicast_dns/example/main.dart index e6cc74f..d15f665 100644 --- a/packages/multicast_dns/example/main.dart +++ b/packages/multicast_dns/example/main.dart @@ -16,13 +16,13 @@ Future main() async { await client.start(); // Get the PTR record for the service. - await for (PtrResourceRecord ptr in client + await for (final PtrResourceRecord ptr in client .lookup(ResourceRecordQuery.serverPointer(name))) { // Use the domainName from the PTR record to get the SRV record, // which will have the port and local hostname. // Note that duplicate messages may come through, especially if any // other mDNS queries are running elsewhere on the machine. - await for (SrvResourceRecord srv in client.lookup( + await for (final SrvResourceRecord srv in client.lookup( ResourceRecordQuery.service(ptr.domainName))) { // Domain name will be something like "io.flutter.example@some-iphone.local._dartobservatory._tcp.local" final String bundleId = diff --git a/packages/multicast_dns/example/mdns-resolve.dart b/packages/multicast_dns/example/mdns_resolve.dart similarity index 84% rename from packages/multicast_dns/example/mdns-resolve.dart rename to packages/multicast_dns/example/mdns_resolve.dart index 2276b3b..13441d6 100644 --- a/packages/multicast_dns/example/mdns-resolve.dart +++ b/packages/multicast_dns/example/mdns_resolve.dart @@ -13,7 +13,7 @@ Future main(List args) async { Please provide an address as argument. For example: - dart mdns-resolve.dart dartino.local'''); + dart mdns_resolve.dart dartino.local'''); return; } @@ -21,12 +21,12 @@ For example: final MDnsClient client = MDnsClient(); await client.start(); - await for (IPAddressResourceRecord record in client + await for (final IPAddressResourceRecord record in client .lookup(ResourceRecordQuery.addressIPv4(name))) { print('Found address (${record.address}).'); } - await for (IPAddressResourceRecord record in client + await for (final IPAddressResourceRecord record in client .lookup(ResourceRecordQuery.addressIPv6(name))) { print('Found address (${record.address}).'); } diff --git a/packages/multicast_dns/example/mdns-sd.dart b/packages/multicast_dns/example/mdns_sd.dart similarity index 85% rename from packages/multicast_dns/example/mdns-sd.dart rename to packages/multicast_dns/example/mdns_sd.dart index f431ee6..b4d05ad 100644 --- a/packages/multicast_dns/example/mdns-sd.dart +++ b/packages/multicast_dns/example/mdns_sd.dart @@ -13,7 +13,7 @@ Future main(List args) async { Please provide the name of a service as argument. For example: - dart mdns-sd.dart [--verbose] _workstation._tcp.local'''); + dart mdns_sd.dart [--verbose] _workstation._tcp.local'''); return; } @@ -22,12 +22,12 @@ For example: final MDnsClient client = MDnsClient(); await client.start(); - await for (PtrResourceRecord ptr in client + await for (final PtrResourceRecord ptr in client .lookup(ResourceRecordQuery.serverPointer(name))) { if (verbose) { print(ptr); } - await for (SrvResourceRecord srv in client.lookup( + await for (final SrvResourceRecord srv in client.lookup( ResourceRecordQuery.service(ptr.domainName))) { if (verbose) { print(srv); @@ -37,7 +37,7 @@ For example: .lookup(ResourceRecordQuery.text(ptr.domainName)) .forEach(print); } - await for (IPAddressResourceRecord ip + await for (final IPAddressResourceRecord ip in client.lookup( ResourceRecordQuery.addressIPv4(srv.target))) { if (verbose) { @@ -46,7 +46,7 @@ For example: print('Service instance found at ' '${srv.target}:${srv.port} with ${ip.address}.'); } - await for (IPAddressResourceRecord ip + await for (final IPAddressResourceRecord ip in client.lookup( ResourceRecordQuery.addressIPv6(srv.target))) { if (verbose) { diff --git a/packages/multicast_dns/lib/multicast_dns.dart b/packages/multicast_dns/lib/multicast_dns.dart index 148a4b0..0b014cf 100644 --- a/packages/multicast_dns/lib/multicast_dns.dart +++ b/packages/multicast_dns/lib/multicast_dns.dart @@ -57,12 +57,14 @@ class MDnsClient { int? _mDnsPort; /// Find all network interfaces with an the [InternetAddressType] specified. - static NetworkInterfacesFactory allInterfacesFactory = - (InternetAddressType type) => NetworkInterface.list( - includeLinkLocal: true, - type: type, - includeLoopback: true, - ); + Future> allInterfacesFactory( + InternetAddressType type) { + return NetworkInterface.list( + includeLinkLocal: true, + type: type, + includeLoopback: true, + ); + } /// Start the mDNS client. /// @@ -120,7 +122,7 @@ class MDnsClient { final List interfaces = (await interfacesFactory(listenAddress.type)).toList(); - for (NetworkInterface interface in interfaces) { + for (final NetworkInterface interface in interfaces) { // Create a socket for sending on each adapter. final InternetAddress targetAddress = interface.addresses[0]; final RawDatagramSocket socket = await _rawDatagramSocketFactory( @@ -162,7 +164,7 @@ class MDnsClient { throw StateError('Cannot stop mDNS client while it is starting.'); } - for (RawDatagramSocket socket in _sockets) { + for (final RawDatagramSocket socket in _sockets) { socket.close(); } @@ -206,7 +208,7 @@ class MDnsClient { // Send the request on all interfaces. final List packet = query.encode(); - for (RawDatagramSocket socket in _sockets) { + for (final RawDatagramSocket socket in _sockets) { socket.send(packet, _mDnsAddress!, selectedMDnsPort); } return results; diff --git a/packages/multicast_dns/lib/src/lookup_resolver.dart b/packages/multicast_dns/lib/src/lookup_resolver.dart index 40cc86b..a25e691 100644 --- a/packages/multicast_dns/lib/src/lookup_resolver.dart +++ b/packages/multicast_dns/lib/src/lookup_resolver.dart @@ -51,7 +51,7 @@ class LookupResolver { /// Parses [ResoureRecord]s received and delivers them to the appropriate /// listener(s) added via [addPendingRequest]. void handleResponse(List response) { - for (ResourceRecord r in response) { + for (final ResourceRecord r in response) { final int type = r.resourceRecordType; String name = r.name.toLowerCase(); if (name.endsWith('.')) { @@ -73,7 +73,7 @@ class LookupResolver { return requestName == name && request.type == type; } - for (PendingRequest pendingRequest in _pendingRequests) { + for (final PendingRequest pendingRequest in _pendingRequests) { if (responseMatches(pendingRequest)) { if (pendingRequest.controller.isClosed) { return; diff --git a/packages/multicast_dns/lib/src/native_protocol_client.dart b/packages/multicast_dns/lib/src/native_protocol_client.dart index 734412b..15e70c9 100644 --- a/packages/multicast_dns/lib/src/native_protocol_client.dart +++ b/packages/multicast_dns/lib/src/native_protocol_client.dart @@ -41,7 +41,7 @@ class ResourceRecordCache { // necessary. // Clear the cache for all name/type combinations to be updated. final Map> seenRecordTypes = >{}; - for (ResourceRecord record in records) { + for (final ResourceRecord record in records) { // TODO(dnfield): Update this to use set literal syntax when we're able to bump the SDK constraint. seenRecordTypes[record.resourceRecordType] ??= Set(); // ignore: prefer_collection_literals diff --git a/packages/multicast_dns/lib/src/resource_record.dart b/packages/multicast_dns/lib/src/resource_record.dart index eae21bf..5a752b7 100644 --- a/packages/multicast_dns/lib/src/resource_record.dart +++ b/packages/multicast_dns/lib/src/resource_record.dart @@ -6,6 +6,7 @@ import 'dart:convert'; import 'dart:io'; import 'dart:typed_data'; +import 'package:meta/meta.dart'; import 'package:multicast_dns/src/constants.dart'; import 'package:multicast_dns/src/packet.dart'; @@ -84,6 +85,7 @@ abstract class ResourceRecordType { } /// Represents a DNS query. +@immutable class ResourceRecordQuery { /// Creates a new ResourceRecordQuery. /// @@ -186,6 +188,7 @@ class ResourceRecordQuery { } /// Base implementation of DNS resource records (RRs). +@immutable abstract class ResourceRecord { /// Creates a new ResourceRecord. const ResourceRecord(this.resourceRecordType, this.name, this.validUntil); @@ -241,7 +244,7 @@ abstract class ResourceRecord { /// A Service Pointer for reverse mapping an IP address (DNS "PTR"). class PtrResourceRecord extends ResourceRecord { /// Creates a new PtrResourceRecord. - PtrResourceRecord( + const PtrResourceRecord( String name, int validUntil, { required this.domainName, @@ -306,7 +309,7 @@ class IPAddressResourceRecord extends ResourceRecord { /// A Service record, capturing a host target and port (DNS "SRV"). class SrvResourceRecord extends ResourceRecord { /// Creates a new service record. - SrvResourceRecord( + const SrvResourceRecord( String name, int validUntil, { required this.target, @@ -364,7 +367,7 @@ class SrvResourceRecord extends ResourceRecord { /// A Text record, contianing additional textual data (DNS "TXT"). class TxtResourceRecord extends ResourceRecord { /// Creates a new text record. - TxtResourceRecord( + const TxtResourceRecord( String name, int validUntil, { required this.text, diff --git a/packages/multicast_dns/pubspec.yaml b/packages/multicast_dns/pubspec.yaml index d59445f..058d0c4 100644 --- a/packages/multicast_dns/pubspec.yaml +++ b/packages/multicast_dns/pubspec.yaml @@ -3,6 +3,9 @@ description: Dart package for mDNS queries (e.g. Bonjour, Avahi). homepage: https://github.com/flutter/packages/tree/master/packages/multicast_dns version: 0.3.0 +dependencies: + meta: ^1.3.0 + dev_dependencies: test: "^1.16.5" diff --git a/packages/multicast_dns/test/decode_test.dart b/packages/multicast_dns/test/decode_test.dart index e8c1afa..f6c5e88 100644 --- a/packages/multicast_dns/test/decode_test.dart +++ b/packages/multicast_dns/test/decode_test.dart @@ -186,7 +186,7 @@ void testValidPackages() { void testBadPackages() { test('Returns null for invalid packets', () { - for (List p in >[package1, package2, package3]) { + for (final List p in >[package1, package2, package3]) { for (int i = 0; i < p.length; i++) { expect(decodeMDnsResponse(p.sublist(0, i)), isNull); } From 213c3c1aede7e80e498412584bf26ef337a68776 Mon Sep 17 00:00:00 2001 From: stuartmorgan Date: Sat, 1 May 2021 15:21:30 -0400 Subject: [PATCH 057/118] Standardize copyright author and year (#338) Standardize copyright author ("The Flutter Authors") and year (2013), as was previously done in flutter/plugins. Adds per-package AUTHORS files to ensure that published packages contain the authorship information referred to in the boilerplate (again, as in flutter/plugins). First preparatory step in enabling the automated license format check in this repository. --- packages/flutter_template_images/AUTHORS | 6 ++++++ packages/flutter_template_images/LICENSE | 2 +- packages/multicast_dns/AUTHORS | 7 +++++++ packages/multicast_dns/LICENSE | 2 +- packages/multicast_dns/example/main.dart | 2 +- packages/multicast_dns/example/mdns_resolve.dart | 2 +- packages/multicast_dns/example/mdns_sd.dart | 2 +- packages/multicast_dns/lib/multicast_dns.dart | 2 +- packages/multicast_dns/lib/src/constants.dart | 2 +- packages/multicast_dns/lib/src/lookup_resolver.dart | 2 +- packages/multicast_dns/lib/src/native_protocol_client.dart | 2 +- packages/multicast_dns/lib/src/packet.dart | 2 +- packages/multicast_dns/lib/src/resource_record.dart | 2 +- packages/multicast_dns/test/client_test.dart | 2 +- packages/multicast_dns/test/decode_test.dart | 2 +- packages/multicast_dns/test/lookup_resolver_test.dart | 2 +- .../multicast_dns/test/resource_record_cache_test.dart | 2 +- packages/multicast_dns/tool/packet_gen.dart | 2 +- 18 files changed, 29 insertions(+), 16 deletions(-) create mode 100644 packages/flutter_template_images/AUTHORS create mode 100644 packages/multicast_dns/AUTHORS diff --git a/packages/flutter_template_images/AUTHORS b/packages/flutter_template_images/AUTHORS new file mode 100644 index 0000000..557dff9 --- /dev/null +++ b/packages/flutter_template_images/AUTHORS @@ -0,0 +1,6 @@ +# Below is a list of people and organizations that have contributed +# to the Flutter project. Names should be added to the list like so: +# +# Name/Organization + +Google Inc. diff --git a/packages/flutter_template_images/LICENSE b/packages/flutter_template_images/LICENSE index aea51a3..c6823b8 100644 --- a/packages/flutter_template_images/LICENSE +++ b/packages/flutter_template_images/LICENSE @@ -1,4 +1,4 @@ -Copyright 2014 The Flutter Authors. All rights reserved. +Copyright 2013 The Flutter Authors. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: diff --git a/packages/multicast_dns/AUTHORS b/packages/multicast_dns/AUTHORS new file mode 100644 index 0000000..add1041 --- /dev/null +++ b/packages/multicast_dns/AUTHORS @@ -0,0 +1,7 @@ +# Below is a list of people and organizations that have contributed +# to the Flutter project. Names should be added to the list like so: +# +# Name/Organization + +Google Inc. +The Dartino project authors diff --git a/packages/multicast_dns/LICENSE b/packages/multicast_dns/LICENSE index 73e6b6e..658b880 100644 --- a/packages/multicast_dns/LICENSE +++ b/packages/multicast_dns/LICENSE @@ -1,4 +1,4 @@ -Copyright 2019 The Flutter Authors. All rights reserved. +Copyright 2013 The Flutter Authors. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are diff --git a/packages/multicast_dns/example/main.dart b/packages/multicast_dns/example/main.dart index d15f665..c21450c 100644 --- a/packages/multicast_dns/example/main.dart +++ b/packages/multicast_dns/example/main.dart @@ -1,4 +1,4 @@ -// Copyright 2018, the Flutter project authors. Please see the AUTHORS file +// Copyright 2013 The Flutter Authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. diff --git a/packages/multicast_dns/example/mdns_resolve.dart b/packages/multicast_dns/example/mdns_resolve.dart index 13441d6..01dde4b 100644 --- a/packages/multicast_dns/example/mdns_resolve.dart +++ b/packages/multicast_dns/example/mdns_resolve.dart @@ -1,4 +1,4 @@ -// Copyright (c) 2015, the Dartino project authors. Please see the AUTHORS file +// Copyright (c) 2013 The Flutter Authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. diff --git a/packages/multicast_dns/example/mdns_sd.dart b/packages/multicast_dns/example/mdns_sd.dart index b4d05ad..9cb9c86 100644 --- a/packages/multicast_dns/example/mdns_sd.dart +++ b/packages/multicast_dns/example/mdns_sd.dart @@ -1,4 +1,4 @@ -// Copyright (c) 2015, the Dartino project authors. Please see the AUTHORS file +// Copyright (c) 2013 The Flutter Authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. diff --git a/packages/multicast_dns/lib/multicast_dns.dart b/packages/multicast_dns/lib/multicast_dns.dart index 0b014cf..634c3a8 100644 --- a/packages/multicast_dns/lib/multicast_dns.dart +++ b/packages/multicast_dns/lib/multicast_dns.dart @@ -1,4 +1,4 @@ -// Copyright (c) 2015, the Dartino project authors. Please see the AUTHORS file +// Copyright (c) 2013 The Flutter Authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. diff --git a/packages/multicast_dns/lib/src/constants.dart b/packages/multicast_dns/lib/src/constants.dart index 061329d..d7133c4 100644 --- a/packages/multicast_dns/lib/src/constants.dart +++ b/packages/multicast_dns/lib/src/constants.dart @@ -1,4 +1,4 @@ -// Copyright (c) 2015, the Dartino project authors. Please see the AUTHORS file +// Copyright (c) 2013 The Flutter Authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. diff --git a/packages/multicast_dns/lib/src/lookup_resolver.dart b/packages/multicast_dns/lib/src/lookup_resolver.dart index a25e691..9185a57 100644 --- a/packages/multicast_dns/lib/src/lookup_resolver.dart +++ b/packages/multicast_dns/lib/src/lookup_resolver.dart @@ -1,4 +1,4 @@ -// Copyright (c) 2015, the Dartino project authors. Please see the AUTHORS file +// Copyright (c) 2013 The Flutter Authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. diff --git a/packages/multicast_dns/lib/src/native_protocol_client.dart b/packages/multicast_dns/lib/src/native_protocol_client.dart index 15e70c9..355ae7b 100644 --- a/packages/multicast_dns/lib/src/native_protocol_client.dart +++ b/packages/multicast_dns/lib/src/native_protocol_client.dart @@ -1,4 +1,4 @@ -// Copyright (c) 2015, the Dartino project authors. Please see the AUTHORS file +// Copyright (c) 2013 The Flutter Authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. diff --git a/packages/multicast_dns/lib/src/packet.dart b/packages/multicast_dns/lib/src/packet.dart index 9905689..66b77c2 100644 --- a/packages/multicast_dns/lib/src/packet.dart +++ b/packages/multicast_dns/lib/src/packet.dart @@ -1,4 +1,4 @@ -// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file +// Copyright (c) 2013 The Flutter Authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. diff --git a/packages/multicast_dns/lib/src/resource_record.dart b/packages/multicast_dns/lib/src/resource_record.dart index 5a752b7..7f65d98 100644 --- a/packages/multicast_dns/lib/src/resource_record.dart +++ b/packages/multicast_dns/lib/src/resource_record.dart @@ -1,4 +1,4 @@ -// Copyright 2018 The Flutter Authors. All rights reserved. +// Copyright 2013 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. diff --git a/packages/multicast_dns/test/client_test.dart b/packages/multicast_dns/test/client_test.dart index 85ab0b1..0f825f5 100644 --- a/packages/multicast_dns/test/client_test.dart +++ b/packages/multicast_dns/test/client_test.dart @@ -1,4 +1,4 @@ -// Copyright (c) 2015, the Dartino project authors. Please see the AUTHORS file +// Copyright (c) 2013 The Flutter Authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. diff --git a/packages/multicast_dns/test/decode_test.dart b/packages/multicast_dns/test/decode_test.dart index f6c5e88..1360786 100644 --- a/packages/multicast_dns/test/decode_test.dart +++ b/packages/multicast_dns/test/decode_test.dart @@ -1,4 +1,4 @@ -// Copyright (c) 2015, the Dartino project authors. Please see the AUTHORS file +// Copyright (c) 2013 The Flutter Authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. diff --git a/packages/multicast_dns/test/lookup_resolver_test.dart b/packages/multicast_dns/test/lookup_resolver_test.dart index 3423a68..0a7b99f 100644 --- a/packages/multicast_dns/test/lookup_resolver_test.dart +++ b/packages/multicast_dns/test/lookup_resolver_test.dart @@ -1,4 +1,4 @@ -// Copyright (c) 2015, the Dartino project authors. Please see the AUTHORS file +// Copyright (c) 2013 The Flutter Authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. diff --git a/packages/multicast_dns/test/resource_record_cache_test.dart b/packages/multicast_dns/test/resource_record_cache_test.dart index 1b9130f..10d6e8c 100644 --- a/packages/multicast_dns/test/resource_record_cache_test.dart +++ b/packages/multicast_dns/test/resource_record_cache_test.dart @@ -1,4 +1,4 @@ -// Copyright (c) 2015, the Dartino project authors. Please see the AUTHORS file +// Copyright (c) 2013 The Flutter Authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. diff --git a/packages/multicast_dns/tool/packet_gen.dart b/packages/multicast_dns/tool/packet_gen.dart index 36486be..ad7e1cf 100644 --- a/packages/multicast_dns/tool/packet_gen.dart +++ b/packages/multicast_dns/tool/packet_gen.dart @@ -1,4 +1,4 @@ -// Copyright (c) 2015, the Dartino project authors. Please see the AUTHORS file +// Copyright (c) 2013 The Flutter Authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. From 95d6faf7973cdb4f85b16ec4a77be5d8fe79b0d2 Mon Sep 17 00:00:00 2001 From: stuartmorgan Date: Sun, 2 May 2021 07:59:17 -0400 Subject: [PATCH 058/118] Standardize slight variations in license format (#339) - Uses the exact LICENSE file line breaking used in the other Flutter repositories - Standardizes some slight textual variants in the license block (e.g., use of "(c)", explicitly referencing the AUTHORS file) on the format used in the other repos. --- packages/multicast_dns/LICENSE | 26 +++++++++---------- packages/multicast_dns/example/main.dart | 6 ++--- .../multicast_dns/example/mdns_resolve.dart | 6 ++--- packages/multicast_dns/example/mdns_sd.dart | 6 ++--- packages/multicast_dns/lib/multicast_dns.dart | 6 ++--- packages/multicast_dns/lib/src/constants.dart | 6 ++--- .../lib/src/lookup_resolver.dart | 6 ++--- .../lib/src/native_protocol_client.dart | 6 ++--- packages/multicast_dns/lib/src/packet.dart | 6 ++--- packages/multicast_dns/test/client_test.dart | 6 ++--- packages/multicast_dns/test/decode_test.dart | 6 ++--- .../test/lookup_resolver_test.dart | 6 ++--- .../test/resource_record_cache_test.dart | 6 ++--- packages/multicast_dns/tool/packet_gen.dart | 6 ++--- 14 files changed, 51 insertions(+), 53 deletions(-) diff --git a/packages/multicast_dns/LICENSE b/packages/multicast_dns/LICENSE index 658b880..c6823b8 100644 --- a/packages/multicast_dns/LICENSE +++ b/packages/multicast_dns/LICENSE @@ -1,8 +1,7 @@ Copyright 2013 The Flutter Authors. All rights reserved. -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. @@ -14,14 +13,13 @@ met: contributors may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/packages/multicast_dns/example/main.dart b/packages/multicast_dns/example/main.dart index c21450c..588bcb2 100644 --- a/packages/multicast_dns/example/main.dart +++ b/packages/multicast_dns/example/main.dart @@ -1,6 +1,6 @@ -// Copyright 2013 The Flutter Authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. // Example script to illustrate how to use the mdns package to discover the port // of a Dart observatory over mDNS. diff --git a/packages/multicast_dns/example/mdns_resolve.dart b/packages/multicast_dns/example/mdns_resolve.dart index 01dde4b..a7c35a8 100644 --- a/packages/multicast_dns/example/mdns_resolve.dart +++ b/packages/multicast_dns/example/mdns_resolve.dart @@ -1,6 +1,6 @@ -// Copyright (c) 2013 The Flutter Authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. // Example script to illustrate how to use the mdns package to lookup names // on the local network. diff --git a/packages/multicast_dns/example/mdns_sd.dart b/packages/multicast_dns/example/mdns_sd.dart index 9cb9c86..5b5fb6e 100644 --- a/packages/multicast_dns/example/mdns_sd.dart +++ b/packages/multicast_dns/example/mdns_sd.dart @@ -1,6 +1,6 @@ -// Copyright (c) 2013 The Flutter Authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. // Example script to illustrate how to use the mdns package to discover services // on the local network. diff --git a/packages/multicast_dns/lib/multicast_dns.dart b/packages/multicast_dns/lib/multicast_dns.dart index 634c3a8..c6908f7 100644 --- a/packages/multicast_dns/lib/multicast_dns.dart +++ b/packages/multicast_dns/lib/multicast_dns.dart @@ -1,6 +1,6 @@ -// Copyright (c) 2013 The Flutter Authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. import 'dart:async'; import 'dart:io'; diff --git a/packages/multicast_dns/lib/src/constants.dart b/packages/multicast_dns/lib/src/constants.dart index d7133c4..76d8c6a 100644 --- a/packages/multicast_dns/lib/src/constants.dart +++ b/packages/multicast_dns/lib/src/constants.dart @@ -1,6 +1,6 @@ -// Copyright (c) 2013 The Flutter Authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. import 'dart:io'; diff --git a/packages/multicast_dns/lib/src/lookup_resolver.dart b/packages/multicast_dns/lib/src/lookup_resolver.dart index 9185a57..6f2eea7 100644 --- a/packages/multicast_dns/lib/src/lookup_resolver.dart +++ b/packages/multicast_dns/lib/src/lookup_resolver.dart @@ -1,6 +1,6 @@ -// Copyright (c) 2013 The Flutter Authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. import 'dart:async'; import 'dart:collection'; diff --git a/packages/multicast_dns/lib/src/native_protocol_client.dart b/packages/multicast_dns/lib/src/native_protocol_client.dart index 355ae7b..aa2eb5c 100644 --- a/packages/multicast_dns/lib/src/native_protocol_client.dart +++ b/packages/multicast_dns/lib/src/native_protocol_client.dart @@ -1,6 +1,6 @@ -// Copyright (c) 2013 The Flutter Authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. import 'dart:collection'; diff --git a/packages/multicast_dns/lib/src/packet.dart b/packages/multicast_dns/lib/src/packet.dart index 66b77c2..514cd14 100644 --- a/packages/multicast_dns/lib/src/packet.dart +++ b/packages/multicast_dns/lib/src/packet.dart @@ -1,6 +1,6 @@ -// Copyright (c) 2013 The Flutter Authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. import 'dart:convert'; import 'dart:io'; diff --git a/packages/multicast_dns/test/client_test.dart b/packages/multicast_dns/test/client_test.dart index 0f825f5..bd592f3 100644 --- a/packages/multicast_dns/test/client_test.dart +++ b/packages/multicast_dns/test/client_test.dart @@ -1,6 +1,6 @@ -// Copyright (c) 2013 The Flutter Authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. import 'dart:async'; import 'dart:io'; diff --git a/packages/multicast_dns/test/decode_test.dart b/packages/multicast_dns/test/decode_test.dart index 1360786..ad2b585 100644 --- a/packages/multicast_dns/test/decode_test.dart +++ b/packages/multicast_dns/test/decode_test.dart @@ -1,6 +1,6 @@ -// Copyright (c) 2013 The Flutter Authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. import 'dart:io'; diff --git a/packages/multicast_dns/test/lookup_resolver_test.dart b/packages/multicast_dns/test/lookup_resolver_test.dart index 0a7b99f..e468f64 100644 --- a/packages/multicast_dns/test/lookup_resolver_test.dart +++ b/packages/multicast_dns/test/lookup_resolver_test.dart @@ -1,6 +1,6 @@ -// Copyright (c) 2013 The Flutter Authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. import 'dart:io'; diff --git a/packages/multicast_dns/test/resource_record_cache_test.dart b/packages/multicast_dns/test/resource_record_cache_test.dart index 10d6e8c..644beef 100644 --- a/packages/multicast_dns/test/resource_record_cache_test.dart +++ b/packages/multicast_dns/test/resource_record_cache_test.dart @@ -1,6 +1,6 @@ -// Copyright (c) 2013 The Flutter Authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. // Test that the resource record cache works correctly. In particular, make // sure that it removes all entries for a name before insertingrecords diff --git a/packages/multicast_dns/tool/packet_gen.dart b/packages/multicast_dns/tool/packet_gen.dart index ad7e1cf..4845b16 100644 --- a/packages/multicast_dns/tool/packet_gen.dart +++ b/packages/multicast_dns/tool/packet_gen.dart @@ -1,6 +1,6 @@ -// Copyright (c) 2013 The Flutter Authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. // Support code to generate the hex-lists in test/decode_test.dart from // a hex-stream. From acd8d1ee6347d1f04183ca8ab77f8eb325e449c3 Mon Sep 17 00:00:00 2001 From: stuartmorgan Date: Wed, 5 May 2021 16:38:47 -0400 Subject: [PATCH 059/118] Add missing license blocks to files (#340) Add license blocks to the tops of files that were missing them. Preparation for enabling license block validation in CI. --- .../flutter_template_images/lib/flutter_template_images.dart | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/flutter_template_images/lib/flutter_template_images.dart b/packages/flutter_template_images/lib/flutter_template_images.dart index fc5fff7..f4413e1 100644 --- a/packages/flutter_template_images/lib/flutter_template_images.dart +++ b/packages/flutter_template_images/lib/flutter_template_images.dart @@ -1,3 +1,7 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + library flutter_template_images; // There is no source for this package, since it only exists to hold images. From ce4e455ccba8f7815d34c4497acaad7f8f46cf9f Mon Sep 17 00:00:00 2001 From: stuartmorgan Date: Mon, 10 May 2021 15:40:13 -0400 Subject: [PATCH 060/118] Fix 'publish' and 'test' failures (#346) Enabling the new publishing checks was done in a PR that touched at least one package, so didn't actually run on the whole repo, causing post-submit breakage. This fixes the publish errors: - Corrects a version mismatch in fuchsia_ctl and standardizes the format it uses for listing recent versions. - Removes all pre-release SDK requirements now that null safety is stable. - Fixes a publish warning about the use of 'docs' rather than 'doc' in pigeon. It also fixes the test in error in bsdiff by reverting #342 and fixing it correctly. That change was completely wrong, but CI didn't catch it since it wasn't running any tests for third_party/packages/ yet. --- packages/multicast_dns/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/multicast_dns/pubspec.yaml b/packages/multicast_dns/pubspec.yaml index 058d0c4..c7c1a7b 100644 --- a/packages/multicast_dns/pubspec.yaml +++ b/packages/multicast_dns/pubspec.yaml @@ -10,4 +10,4 @@ dev_dependencies: test: "^1.16.5" environment: - sdk: ">=2.12.0-0 <3.0.0" + sdk: ">=2.12.0 <3.0.0" From 77bc379d8fcdf57c5596d248b161735007b74765 Mon Sep 17 00:00:00 2001 From: stuartmorgan Date: Fri, 14 May 2021 16:39:41 -0400 Subject: [PATCH 061/118] Revert "[flutter_template_images] Add support for new template and shared platform files" (#353) Reverts #295 The corresponding flutter/flutter changes never landed, so that package layout is unusable for now. Since 2.0 was published already, to minimize long-term confusion this uses 3.0 rather than going back to 1.0. --- packages/flutter_template_images/CHANGELOG.md | 4 ++++ packages/flutter_template_images/pubspec.yaml | 2 +- .../web/icons/Icon-maskable-192.png.copy.tmpl | Bin .../web/icons/Icon-maskable-512.png.copy.tmpl | Bin .../windows.tmpl/runner/resources/app_icon.ico | Bin .../assets/images/2.0x/flutter_logo.png | Bin 619 -> 0 bytes .../assets/images/3.0x/flutter_logo.png | Bin 810 -> 0 bytes .../assets/images/flutter_logo.png | Bin 419 -> 0 bytes 8 files changed, 5 insertions(+), 1 deletion(-) rename packages/flutter_template_images/templates/{app_shared => app}/web/icons/Icon-maskable-192.png.copy.tmpl (100%) rename packages/flutter_template_images/templates/{app_shared => app}/web/icons/Icon-maskable-512.png.copy.tmpl (100%) rename packages/flutter_template_images/templates/{app_shared => app}/windows.tmpl/runner/resources/app_icon.ico (100%) delete mode 100644 packages/flutter_template_images/templates/list_detail_app/assets/images/2.0x/flutter_logo.png delete mode 100644 packages/flutter_template_images/templates/list_detail_app/assets/images/3.0x/flutter_logo.png delete mode 100644 packages/flutter_template_images/templates/list_detail_app/assets/images/flutter_logo.png diff --git a/packages/flutter_template_images/CHANGELOG.md b/packages/flutter_template_images/CHANGELOG.md index 7442d0b..e287035 100644 --- a/packages/flutter_template_images/CHANGELOG.md +++ b/packages/flutter_template_images/CHANGELOG.md @@ -1,3 +1,7 @@ +## 3.0.0 + +* Reverts to the 1.0 layout, since the new app template never landed. + ## 2.0.0 * Move assets common to all app templates to a new `app_shared` directory. diff --git a/packages/flutter_template_images/pubspec.yaml b/packages/flutter_template_images/pubspec.yaml index 8b51fb2..bef6096 100644 --- a/packages/flutter_template_images/pubspec.yaml +++ b/packages/flutter_template_images/pubspec.yaml @@ -1,6 +1,6 @@ name: flutter_template_images description: Image files for use in flutter_tools templates. -version: 2.0.0 +version: 3.0.0 homepage: https://github.com/flutter/packages/tree/master/packages/flutter_template_images environment: diff --git a/packages/flutter_template_images/templates/app_shared/web/icons/Icon-maskable-192.png.copy.tmpl b/packages/flutter_template_images/templates/app/web/icons/Icon-maskable-192.png.copy.tmpl similarity index 100% rename from packages/flutter_template_images/templates/app_shared/web/icons/Icon-maskable-192.png.copy.tmpl rename to packages/flutter_template_images/templates/app/web/icons/Icon-maskable-192.png.copy.tmpl diff --git a/packages/flutter_template_images/templates/app_shared/web/icons/Icon-maskable-512.png.copy.tmpl b/packages/flutter_template_images/templates/app/web/icons/Icon-maskable-512.png.copy.tmpl similarity index 100% rename from packages/flutter_template_images/templates/app_shared/web/icons/Icon-maskable-512.png.copy.tmpl rename to packages/flutter_template_images/templates/app/web/icons/Icon-maskable-512.png.copy.tmpl diff --git a/packages/flutter_template_images/templates/app_shared/windows.tmpl/runner/resources/app_icon.ico b/packages/flutter_template_images/templates/app/windows.tmpl/runner/resources/app_icon.ico similarity index 100% rename from packages/flutter_template_images/templates/app_shared/windows.tmpl/runner/resources/app_icon.ico rename to packages/flutter_template_images/templates/app/windows.tmpl/runner/resources/app_icon.ico diff --git a/packages/flutter_template_images/templates/list_detail_app/assets/images/2.0x/flutter_logo.png b/packages/flutter_template_images/templates/list_detail_app/assets/images/2.0x/flutter_logo.png deleted file mode 100644 index b65164de707ffeaf0adfca5fca65532bf97e6903..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 619 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H3?#oinD`S&H3s;ExB}^b{r?#vrgK>I2kif@ zvH816@%GSTKN!MhbHpsw+WI}@_)o2^Ujq(*4>|fhmwB2f9E#&lh@dHUo7LNZ{xgp@r+-ynauvLPwNoN4|Z_>tNAZ;@h5j(?S79JcUYfB`=#qy r6fZFpo3n_4Rl|XiE8s&sR~^H;NW15^d4qg`5ys%@>gTe~DWM4f{@o*g diff --git a/packages/flutter_template_images/templates/list_detail_app/assets/images/3.0x/flutter_logo.png b/packages/flutter_template_images/templates/list_detail_app/assets/images/3.0x/flutter_logo.png deleted file mode 100644 index 97e5dc9af6e1093966c5cd42d608fd6fbb6a0c59..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 810 zcmeAS@N?(olHy`uVBq!ia0vp^2SAvE8Azrw%`pX16#+gWu0UF2`*(-^-y@EH58eMI z^w{s z-$IW5@LT%57HGFUA^wwrfyu|y#WAGf*4wMk zgAN-AxF%k#KCURBVA1=%-ucp;9Uj}ZG#l?Wes0(B%({NdIoXW<{g3WiupaK0x3By2 zO4s)_FGS)mJr|)n_%@ z)kihD)q6Gi)z>tJ)#o(E)yFiZ)%!H&)t5Jx)rUK-{vXl2fA4~;^_xE>GN_~ps{eO!b9`tLyxW8Xh;HNSd-@|xOj=ytR+do>D zt9>mOkvaAL$-iq%!vCf*DgR4ol&oKHV8Z?Agj4S|4W8wT%=mnri|3a%tJ>eCOpE`; zHb(y6c3?w&Y{ISmIsp&Mrw9G7`Sv8_P1LLTesVhEI)8;vvu5vq*tGV3&cSo}TNXSq zj|})It+V3iSy7We$GB|jf?4DCFKlYK@8ftOf60QQ_A~Fi*3bCZZ_jpf?zg4|^)^x| zt2OmGe$>0=M;cybjjOklN_(oQ_u}uL;@3elyf)C=)PemO(7H=26jVtWmubrDh3}(04)hM&xSK7O%X|>Mc j1|}|z1*pUejUUWgK0Q%uH(H?zOn3~Qu6{1-oD!M<&k2w@ diff --git a/packages/flutter_template_images/templates/list_detail_app/assets/images/flutter_logo.png b/packages/flutter_template_images/templates/list_detail_app/assets/images/flutter_logo.png deleted file mode 100644 index b5c6ca710c937527ca8d2d344214243d6db33832..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 419 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!@&kNAT!FN~`u7^!zegPZ&Ja3_ z)pe?NNpCL!ThaUauw)u_bwr{%Izl9$A!5B7M$govP zxh~|$561A>Od+#a0;aQjP2sie<+JJ*(`u4bZve_F*PR4v(b@jZ=Md1SAK%^B{{yWQ zFA4GsW)M(NFaUyj5NMdc{{H>@?}1?b(XAk7pYe2Y42d}W_VP)gCIbQ2ix!U>4q9?~ zIsEybZ^G7cAu^%-PQ=yx*;eIK#gYnUFW+9QvQNJH+nbx4)6dKOIC(3+3g6;V=GFge(48{@_RM&lLju^uE+^au+>tK7OIONyesA;#Zub zQs3&YevL0~GuE6t~Fo%7BFztX3q{1RVU;;PiN_-8qleWA`_& zw({X*ef?P{^t~Y0vFF>PCUdo}=4?%^3QRb0$VpT0kLyEL`Hh?APM From c44b2aa47b7d79984979a4b326e3295cecbece4a Mon Sep 17 00:00:00 2001 From: Chris Bracken Date: Fri, 14 May 2021 14:16:17 -0700 Subject: [PATCH 062/118] Add additional Windows template icons (#357) Updates to version 3.0.1 --- packages/flutter_template_images/CHANGELOG.md | 1 + .../runner_uwp/Assets/LargeTile.scale-100.png | Bin 0 -> 6049 bytes .../runner_uwp/Assets/LargeTile.scale-125.png | Bin 0 -> 7419 bytes .../runner_uwp/Assets/LargeTile.scale-150.png | Bin 0 -> 9576 bytes .../runner_uwp/Assets/LargeTile.scale-200.png | Bin 0 -> 14559 bytes .../runner_uwp/Assets/LargeTile.scale-400.png | Bin 0 -> 42545 bytes .../Assets/LockScreenLogo.scale-200.png | Bin 0 -> 1430 bytes .../runner_uwp/Assets/SmallTile.scale-100.png | Bin 0 -> 1821 bytes .../runner_uwp/Assets/SmallTile.scale-125.png | Bin 0 -> 2519 bytes .../runner_uwp/Assets/SmallTile.scale-150.png | Bin 0 -> 2984 bytes .../runner_uwp/Assets/SmallTile.scale-200.png | Bin 0 -> 3721 bytes .../runner_uwp/Assets/SmallTile.scale-400.png | Bin 0 -> 8054 bytes .../Assets/SplashScreen.scale-100.png | Bin 0 -> 6866 bytes .../Assets/SplashScreen.scale-125.png | Bin 0 -> 7899 bytes .../Assets/SplashScreen.scale-150.png | Bin 0 -> 10137 bytes .../Assets/SplashScreen.scale-200.png | Bin 0 -> 15332 bytes .../Assets/SplashScreen.scale-400.png | Bin 0 -> 46573 bytes .../Assets/Square150x150Logo.scale-100.png | Bin 0 -> 2964 bytes .../Assets/Square150x150Logo.scale-125.png | Bin 0 -> 2984 bytes .../Assets/Square150x150Logo.scale-150.png | Bin 0 -> 4617 bytes .../Assets/Square150x150Logo.scale-200.png | Bin 0 -> 6223 bytes .../Assets/Square150x150Logo.scale-400.png | Bin 0 -> 13913 bytes ...44x44Logo.altform-unplated_targetsize-16.png | Bin 0 -> 697 bytes ...4x44Logo.altform-unplated_targetsize-256.png | Bin 0 -> 15554 bytes ...44x44Logo.altform-unplated_targetsize-32.png | Bin 0 -> 1541 bytes ...44x44Logo.altform-unplated_targetsize-48.png | Bin 0 -> 2418 bytes .../Assets/Square44x44Logo.scale-100.png | Bin 0 -> 1603 bytes .../Assets/Square44x44Logo.scale-125.png | Bin 0 -> 1893 bytes .../Assets/Square44x44Logo.scale-150.png | Bin 0 -> 2515 bytes .../Assets/Square44x44Logo.scale-200.png | Bin 0 -> 3239 bytes .../Assets/Square44x44Logo.scale-400.png | Bin 0 -> 6781 bytes .../Assets/Square44x44Logo.targetsize-16.png | Bin 0 -> 479 bytes .../Assets/Square44x44Logo.targetsize-24.png | Bin 0 -> 788 bytes ...44x44Logo.targetsize-24_altform-unplated.png | Bin 0 -> 1255 bytes .../Assets/Square44x44Logo.targetsize-256.png | Bin 0 -> 10408 bytes .../Assets/Square44x44Logo.targetsize-32.png | Bin 0 -> 1122 bytes .../Assets/Square44x44Logo.targetsize-48.png | Bin 0 -> 1612 bytes .../winuwp.tmpl/runner_uwp/Assets/StoreLogo.png | Bin 0 -> 1451 bytes .../runner_uwp/Assets/StoreLogo.scale-100.png | Bin 0 -> 2370 bytes .../runner_uwp/Assets/StoreLogo.scale-125.png | Bin 0 -> 3229 bytes .../runner_uwp/Assets/StoreLogo.scale-150.png | Bin 0 -> 3739 bytes .../runner_uwp/Assets/StoreLogo.scale-200.png | Bin 0 -> 4917 bytes .../runner_uwp/Assets/StoreLogo.scale-400.png | Bin 0 -> 10759 bytes .../Assets/Wide310x150Logo.scale-200.png | Bin 0 -> 3204 bytes .../runner_uwp/Assets/WideTile.scale-100.png | Bin 0 -> 3158 bytes .../runner_uwp/Assets/WideTile.scale-125.png | Bin 0 -> 3211 bytes .../runner_uwp/Assets/WideTile.scale-150.png | Bin 0 -> 5001 bytes .../runner_uwp/Assets/WideTile.scale-200.png | Bin 0 -> 6866 bytes .../runner_uwp/Assets/WideTile.scale-400.png | Bin 0 -> 15332 bytes .../runner_uwp/Windows_TemporaryKey.pfx | Bin 0 -> 2560 bytes .../app/winuwp.tmpl/runner_uwp/resources.pri | Bin 0 -> 5952 bytes 51 files changed, 1 insertion(+) create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/LargeTile.scale-100.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/LargeTile.scale-125.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/LargeTile.scale-150.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/LargeTile.scale-200.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/LargeTile.scale-400.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/LockScreenLogo.scale-200.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/SmallTile.scale-100.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/SmallTile.scale-125.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/SmallTile.scale-150.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/SmallTile.scale-200.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/SmallTile.scale-400.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/SplashScreen.scale-100.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/SplashScreen.scale-125.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/SplashScreen.scale-150.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/SplashScreen.scale-200.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/SplashScreen.scale-400.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square150x150Logo.scale-100.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square150x150Logo.scale-125.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square150x150Logo.scale-150.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square150x150Logo.scale-200.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square150x150Logo.scale-400.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-16.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-256.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-32.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-48.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.scale-100.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.scale-125.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.scale-150.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.scale-200.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.scale-400.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.targetsize-16.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.targetsize-24.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.targetsize-24_altform-unplated.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.targetsize-256.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.targetsize-32.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.targetsize-48.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/StoreLogo.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/StoreLogo.scale-100.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/StoreLogo.scale-125.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/StoreLogo.scale-150.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/StoreLogo.scale-200.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/StoreLogo.scale-400.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Wide310x150Logo.scale-200.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/WideTile.scale-100.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/WideTile.scale-125.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/WideTile.scale-150.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/WideTile.scale-200.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/WideTile.scale-400.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Windows_TemporaryKey.pfx create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/resources.pri diff --git a/packages/flutter_template_images/CHANGELOG.md b/packages/flutter_template_images/CHANGELOG.md index e287035..7e6b5f3 100644 --- a/packages/flutter_template_images/CHANGELOG.md +++ b/packages/flutter_template_images/CHANGELOG.md @@ -1,6 +1,7 @@ ## 3.0.0 * Reverts to the 1.0 layout, since the new app template never landed. +* Added additional icons for winuwp template. ## 2.0.0 diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/LargeTile.scale-100.png b/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/LargeTile.scale-100.png new file mode 100644 index 0000000000000000000000000000000000000000..fa651eb71070bd8ada344ac3a4a23f346297a449 GIT binary patch literal 6049 zcmeHL`#aPB`&UvrAaB&$VT3{son&HIMdqwIW<+v`nK|Zs=pd&um2#Rxnb<;(GiOCe zqm(&rh%szNPGi`7_x>+FKYV|o)rbf=6 zX+6f5u=;~_fbV*>D3EXFwTY0+C6D603g4L?7wNag9myE1NUA%3cv(B=#r`!=5larUSP6GQ!nf z1a>4!jszO)XzeRd7bVljla}Tl%)CR5XG)IBdyBevzJU9PkfG7ufeuBdK%_lwW9o^e zleI6Z+`CC`$;-#=q<;2w7nfueTI#}uG^-5z4kQR^7PZ+zDmo&NB^d9~3|RP56$-}T zafKXmH|*64HIf@9{+vIIsXd98uBOpIFPeC&XeT=oUw>Q?TsdJU`BS;i>00S9091r= z0P%yq${3E`z9KY_0UdnXef(({sYVZaTNM`q*M%pw-y`*X6TUou68Of*@Ih!ZYJ52- zb^LEy!xs^OH)CRcz6$W;QtpPohQf^qi&&=Q)eIcgNfU?@SW-TQl5Ly77Q6!7|Dk|T zQ3b)f6+Bk%^`T%bRi+w5svXM!xIrm2L{$v$Vd*A_$m2RMMjGjhi=eEgaw2=bf*w?11Y2%)sX zjOZMR?#G@Ko2P>>a_v7qdm2ib=@H3~@qF6Ef%fbsxbRLD7dc4k`9L)Eah5UG=QH2u zgupLqx9)t4+FZbVa9O-BtB6p!)5*S50iFeCTUf~AZA_+qi-Lb`e2fP`JM9FekNqBy z#R(n|wTgmmd#M`FuRxH0_T+?PD4TKz_G zX2gg6?`N3T=NSGR<0aWv!A*mUz8Xl3Y;a4ijtQu zZfT{bk9!Wns(FT%6;`_H3~>j>_P76m8cy;Mv73@57h}TC>J+ES;&F$viZ6)o{r!G@ z_o*)2@YcBcDZ!3JQ?1Z$;ErKi<|Z6ww7C@i=wR;K6j;Cvw?N0OR<1Ap@?CTc6*x3Sggw8k(N07r?%s zXqh^_R(~FVH-g&`IiSH57#!Bjv(37K3yx|a@edin?|R}DfcY2J_lXtnO`jeTAL zZ?CPU$tl8BbUNy zRu0dIZ;D&N?d~hUzTV~25e0sc8b2}|LDW~afj-a0Alo$3E<1vE564gMXB1-H9Zmw@ z({=l!Tf8R4%pe+~{VVkO&=)zRC~CXR61{2b4@d4CJX<2c@?BF1|JL^RmP%fVGqH0` zJ30VrA?L-G5ckTjIp@I^I!08PysJ$N#;wE=k|Ec$cB5zaIjI43K81kc1hQ18ZOU6E4HEX%)lmY7=_J7+aahN0O9UKJ5z<+#LIZ%l>MG zpi$#(yjO7jfVEnMI?b}&aLrXki&V1 zX0FX%GIWmo1~vW_AR&d%i;q)+yYgyUWg~SV_0My*oCZy-L+SH-(9IqO&*wYe)5Ip< zO{;a2fWBuTnT1aQDSn)?^m2ApE%xpuCe|NCQ3+)0u-z>=QL6AZJ5rxPNNE9yb*kZb zpJIY#a>?8r_@lmb+<=>8#F)pwZSVEKjUIJ*VpHFqJ&BmVZoOSluO+t}9$fzLbf0%C z-~luw*tH*(YYplDi;W<#0~z1{6#R#bsJqzg-|qvsapCnZ*G=Y5YnMIhU7)S4$22In zG%-J&i?u>kbBiKJ@5o>amhxbqJXH3=uRxE}v70#}gz^*1VO0`+nhBQKox~TmoB1@u zwi-JMGENUFFDku4d-mkGF1#$yxMI0zOq?enXDKf?cVnnG{?c3>P!(Qn5Hj-1%gF!z z8N@-rPSI*-Q^<5u%-myY!K3MiHR=HGv{aaNyyuWVYTg?vLBN$;E-|7nVSZ>9G*9y0Fk5fNaBZ7!hM?vsKXWa{3m|xA#!w#F*#UW(mVb*` zulbA9)@9r|Bx2zerLnmhOhBQfQqY4~%cesBecVGx+gOvr#)}MU;t5{0^x3(;VANmP zAsr*}I7=_%Yd^{m&enMup(e9FS%Dd5db$zvQbfLxrQ(L0!7|+!kGM?-b#e>AhZ?f zCQD49IzUY8gd*bj?ZKLw`rO)ALUGYfaIm;5&7u17S8__+APSb1;XfIrR0DzdJFCK} z1^rT7?MhkU=*?MH&uRv`6WbW$IyVT_jJ_XVieVM=VEga&gS$F~mG8KCdMqe@8NL%g zL(qkX<0(#&oxSx-Sa#VHvY5UHCR4+VRTFAKDPJP~#$C8jtgKa8Kxzpiak&dus7IB1 zgc=3O2g5vXjhW*C-e-N!O@+wd2VYHayL90gCA>>Gd^CuWQbrOwQ>cP&Q16$(Zxqw) zt0zan3t0W-*#>!OcjrG#56ttq%l@T`7q?Fx2^aqdKfM)^^t18S#w<`3se_?ys8+mvW#mSO}g&aQV3FC7pW>nI3FK=4L;{8!9;Ov8Nt+D zt8~DcC{TQ<@~2V3x`TjRJ;r;EUEP||swP1oDgS$JsOS6dtwzhenYU=@^G&1n!KRj_ z%kz-*XOF7hpCJ^W^cc8f%c-SGTG6Z5HlJ>?Jp;D$oa-CXj4EzIDnP9KOfRn~^sw9` zfyY(y0fd6fg{$@gZBgs=2XP{#c|~W+YfRB8W-7O~fRrq?c60P)mh+EnYX&yfe@_E2 zc8znLXh*p+PvO?|eb8fR0C?3~ZResce19>p_Rb?-`?j$-*n6d&7}Mu0F{))xO5GH2 zlI0XGXHVvmF$Q>&nB|5@Ea6!QT;-&D=bODx3lC!Ky_yp{Ok05#RxyEX$-7d>lAlxu z_ewW>`zm9fQy37FiG6=BLCCf#CVZiz0xavZ@g_;QLA||ZX4Q^jCR!)n>c86z2K%(X zn~a}t2YZl~K;FRpxTiMhnSY#ZhmRDqdOY3OJVR|aEtVbryqUn+wH%H)7?eaQ4WCM z0VPG=@oULm0pRg6moK*%dk>GKccDo;iyVnND!d+;wM<{*C$s?ntl1^9bWqOql?VEa znDj_}+});fim?*Bv%QE)Gwott_iMogQA78Izd=TCza)&jS!ti!JTQ0uq8`%eB6gf; z4T9(E!cR}x$#xD*qZ?W+D8Ow7t1M#h)J)>}|DuFBG`9=hryd{>6za5nt?#AasK7=4 z0323;g#YoJKF-#*&B*2Cs%Gm(EsmTPB{2uRgQw?n>y(lU|r1#71t zQtVWbs?n5^mj9YF;W0exc@(S}i}5awpF+Vh8`AVLJ}PU62l9p)W*mT^fi_?3ai3H~ z1ookv=}&In^7*;YFc)(n&W`lyp^J$I7*bU7TccT$pf1u?O0Dm8!zdGI6+<7k$(Pzi zffmH(GU8U;GQNuF=u{uAlJ2!=Li%ynZiIZXm`lj7nNI2Z@O$gq7}UJP%_JazqQq=y zd~pjMJG5&zBN)_qCqZbCwVXRp@H3wt5?Q9|nvHPEz3;{$$v4L>KWPeL#YEWb=V3UFXK#TJY}-a#78EhAz}W z;W7}JgPpimhGCWc*ckfRw>IeYAs!k3V)-SceKw4-Z^3=`!y~g~vA1H}v3APrY5-1S zx-dDCC(LKES$m^nezS&T>%?-gNq6d;yAH*oeA5~gD%KQglB z?MI}UygBw$XkTJXf!#p)w6#DX-ETYCq%k`aitcx3!eYlGJZx zpMI-frd~+rIwjG$kx4cZUaIcfcE5#lqh}3Jz5*JX1=IVlP|o=TV{2r;vvkRB_&qLf zFivr+JgOhg7`x%P<=h@kqkjmu3tm+4V#lgJKyCt;Te-ZXngIq5jI*`4^({N$3 zh2!hCDVqhlz3K@MHWyBdHIya(=pzTWxKp;!bT8bMQ(EIe=Jg0NY~Y56t0E#>G({0q zu;xF>So?R*`VOu^X#A(8gtCvBC6`m;4G$(40hzV0Aq1q_Z1&}NQD9%T5s{^A-~apq zp?xn%O>{_0>N^`GVC_3L`MND7+|N6hT(GiwpNCR5G==7Gy$x)|x_nvdc?%$z{%ExH zGn2-@3L-o~gaiy{I1`5f0u^FfPl_$jvEmvr-VQE+>O*l zk|)p`vtgm+9|wgc*H7>^MkX?2s|~R~`n~L8rch|DuA$$*f~|a2dxnNc0?)n!%r2VS z6YG=K!T0-=6NGA&e${Y}ux3jRzD-Xnq$quxcY!U71uyz%$A0&>Te3h>Fm?>#86{rf zE$2o1mi|yQ)A>eQ=?qKYSxN@EuJo$b>$+F*w%+X=_qU)7Gz&&wVBLKtr$f8ak?5oy z>bdK|Q#kSE`@Y$&elye?)pU9Fo@gcXMmfpeX{#vRAdk`zo|1~KpeK=!$jBJb&U7T| zxMRI`w_MO$8|UMFa#A7Xp0tNs;_VqS>`L5Z233gm$UHLbrRww88~bGGNV!Y2t2`c$ zDz6?SCw&6rMtpVdj9SOx>oWgO|C1Qx?H@^uHOo4B!k)Ks=i@WIWo7i~=DjEX2iCB; AQ2+n{ literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/LargeTile.scale-125.png b/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/LargeTile.scale-125.png new file mode 100644 index 0000000000000000000000000000000000000000..649e07696ba75f5e525a72f60ee9bbe868e28f0b GIT binary patch literal 7419 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 J{=a$u{{XcY6^#G@ literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/LargeTile.scale-400.png b/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/LargeTile.scale-400.png new file mode 100644 index 0000000000000000000000000000000000000000..979878f735eb4275bf5246992734c14311f833d4 GIT binary patch literal 42545 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 W!tA=RzUH literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/LockScreenLogo.scale-200.png b/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/LockScreenLogo.scale-200.png new file mode 100644 index 0000000000000000000000000000000000000000..735f57adb5dfc01886d137b4e493d7e97cf13af3 GIT binary patch literal 1430 zcmaJ>TTC2P7~aKltDttVHYH6u8Io4i*}3fO&d$gd*bA_<3j~&e7%8(eXJLfhS!M@! zKrliY>>6yT4+Kr95$!DoD(Qn-5TP|{V_KS`k~E6(LGS@#`v$hQo&^^BKsw3HIsZBT z_y6C2n`lK@apunKojRQ^(_P}Mgewt$(^BBKCTZ;*xa?J3wQ7~@S0lUvbcLeq1Bg4o zH-bvQi|wt~L7q$~a-gDFP!{&TQfc3fX*6=uHv* zT&1&U(-)L%Xp^djI2?~eBF2cxC@YOP$+9d?P&h?lPy-9M2UT9fg5jKm1t$m#iWE{M zIf%q9@;fyT?0UP>tcw-bLkz;s2LlKl2qeP0w zECS7Ate+Awk|KQ+DOk;fl}Xsy4o^CY=pwq%QAAKKl628_yNPsK>?A>%D8fQG6IgdJ ztnxttBz#NI_a@fk7SU`WtrpsfZsNs9^0(2a z@C3#YO3>k~w7?2hipBf{#b6`}Xw1hlG$yi?;1dDs7k~xDAw@jiI*+tc;t2Lflg&bM)0!Y;0_@=w%`LW^8DsYpS#-bLOklX9r?Ei}TScw|4DbpW%+7 zFgAI)f51s}{y-eWb|vrU-Ya!GuYKP)J7z#*V_k^Xo>4!1Yqj*m)x&0L^tg3GJbVAJ zJ-Pl$R=NAabouV=^z_t;^K*0AvFs!vYU>_<|I^#c?>>CR<(T?=%{;U=aI*SbZADLH z&(f2wz_Y0??Tf|g;?|1Znw6}6U43Q#qNRwv1vp9uFn1)V#*4p&%$mP9x&15^OaBiDS(XppT|z^>;B{PLVEbS3IFYV yGvCsSX*m literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/SmallTile.scale-100.png b/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/SmallTile.scale-100.png new file mode 100644 index 0000000000000000000000000000000000000000..35e7f6242f49b50ec3c688b0d9fe21ff6ca3bee2 GIT binary patch literal 1821 zcma)-S2!CA1BQbdv9(6xP$O+9Vx~m2YDAEd#z?IyqC|{Zb?ll|iO?!)9NRCVHF~Vj zqE^&w#5h!|t&&pIF-q$=>Nq$5)qn9{yx;dc-}BwSWE|E~L{L@`004+sTcPYv+VWon z_)Zf4%vIr}fFV{c;Q)YW|G#j(3Z~xz0QgweC{xF%;;%(+A!qQQMAl|$*ZH8BUjOQ9 znUQ*KCOG@L2d>r_fqae7=9*6?*mVd9AeUZrZuKFQ%cWIwrRmA(`F2Xc+zhH#o+(Zo zHO+mG6i%Aofc~}-qt8e)6I0uS+OTG6Zv&gAu6!uoEjzyACLqwyJtc1fHDC5r4AT}j z1f|OfqeS_X`FXNal7@Os{`dSaJ4`m~n=K(6_EwqV>(IZr91Xkc$WE#B6Qocrz_|Ad zd+qJx=?Gmcb|EyHdyF7gHzfImMY^qxf^DbpC9-(Rk1>AD-}0X=(4BQL*nYd{OTRG@ zU{Pu7t|mcxFT3*0Q3;J?{D9}kiL)1U@sliMX&7XXdBYR;d z7M;N!7BCdby6Rmag#?|=Vl#1nrL)sIfn98%N4%UPYCs zwuOkIJx6@B&||9S2G7jDvme(oFdA$bA|a$f<}S`EryVLXz(sLY2YgbxeX8+lyjSL3 zU>dfT#kA4iBTrEdH2whcBCwPP1r;3z&@}!>Ds!m=owt9b0&Vh|KOQEr>v{~!d#JC- z61&my1A!KVn-}%ED+-`Q_I46KDJk4cNY8G^6K!+%&H$X@D3s~T)R&_T)vm8<{YT?D z2=N6=xD^?~f4X^y+P;~(7$$voGXXFk#V_f_k+-BekxU6Ub&<3LN=4X)=Kk2Q4^y(eAu*Z0glF~K$WKHfSv@ifJnEw6C zut5vMhcEbAS6#QcTFRRV(<-RrnssflgQbZ7g{bL(gT^%DId@2>m(|~)!r9GBI@@9| zst!pK%SHz`yf7`1lzg-+pBeHE2=1mmAG{K)R@xZW}A9;V-ixXO#z zr)6r24AdxDQGiiq3Y)cy`CzF?wKPpmnQ>u+yi{WA>QYA_C(b9qX*Kb9a;3S~H8$+= z<)$k*8;;5S`vi66*>kOPvU*hu=b&#=?{?Opoe8(bYC$(owT+Lhp*xmcYAxL&hFSH7 zz6_Q8J@8=+Wm+y??f0erc&=81q986+Y47C9V7WjuM!DQ>5qq0Pz#L8>9XhF^PwiRw z_&0h;!uYSc+(xD{Rb}1}b4tsl zLx7kek6I#DPEHCpjOG}~CWZ`Rpv6c18nN8^p;sB&=dD*B8&UX zG_AJ`2yANY6)|vyc6MvJNs>bde7uvY=q?PQ^z80NPjEH>!a_p<7@)5pMA6diJzL z?jLS?#M05D_#L7Zu3?5L<&5c4VLh3B8Co$2Brk%*)t}<=Ie+<4Sni@L!TA0cH^JcV z^>3 zMab4zlFHU?yM4_AUU~mXc}w)ju;l-xhW{GlC!c0ao)Ad60eIp&fVBk{)nMkC{0|Ij BO8@`> literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/SmallTile.scale-125.png b/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/SmallTile.scale-125.png new file mode 100644 index 0000000000000000000000000000000000000000..2a74cc67e6d7ed7a5f219ea738e21d2a67806262 GIT binary patch literal 2519 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 literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/SmallTile.scale-150.png b/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/SmallTile.scale-150.png new file mode 100644 index 0000000000000000000000000000000000000000..157124823d548ae2cb06ee30c2b6bcc898e5f1ab GIT binary patch literal 2984 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 literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/SmallTile.scale-200.png b/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/SmallTile.scale-200.png new file mode 100644 index 0000000000000000000000000000000000000000..07ec2ddcb15f766f41f8ac49e8f85082ea931a9f GIT binary patch literal 3721 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 literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/SmallTile.scale-400.png b/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/SmallTile.scale-400.png new file mode 100644 index 0000000000000000000000000000000000000000..c205729b7281ca6742a6b15f836e80adae2d78fb GIT binary patch literal 8054 zcmeHM_dAeDvv})6$VieIDF=Mn*TSAN~5sF&18nI{9t`VV# zwze9zN{kxe&G%1u-=E(f?(2E3=Q-E8&N=se?(;dH6aUy$pXn<1RVpefCPM?ACsb6I zc>i1Uw3II#``6|v4+b9tTYoAl=C1$NrM_3CE>u(k;)Xg}7Qs1NGa?GwE7!nMw(lS!kR%oi0KjB2t`;7O8hz|noAUAY?Ke*TcB#>> zN#1+_)r88y>9l@WQXLiHb~F;gM@;dw{l zK|#HGR8+UH955=X&rm@XsxORiYO10CfBD}9!C0w-efoJ2Ng(5jZ!bPwILRI8&G_ko zN-TcekbZH2oafj6WK%vvn1=3Z)d6&qR5ge>A~?Qq#;LiVJsl>6tcL!|xsLw*=Ir-d znvp~ei-O%)5--~jb>|znCm(XA%Wv}X4lzxh>BdH zSg?U5xB;GG_0zeY{qex65(C@9?Xi6|?1Cyzjqk=$k&A=R91~(|iTz4|l?o#KMxQWPxo;(nuPqx@@k0{Ev)I|q-AH?caD?|x-S?#EWqQd z13HP3Yb=WVDII5m5>!cPm|P&vjb#l-rKSibWP!Ca&34Upi9B$y|AlnJ(0PoYxC#y3 z-WbJD9`|UHSE}F*U4;-xZ}+yfV}vUytEE~WlEB#cCZ~>(A#ymgrM(Id84^JAPYohX zlmLF%K5BaA5^zgH#TLQX+|URb?mWS)uU+5IC@ z(8i-pI{>K$?sS!&dFYd?O6WbraL}@@9PWD5*pXpBc6a^R;9?Iy+Yoc-nabV*^P5ttOm&qG*NM8Dqeii18E zL6}q!wc*D?Dss9T>ub-H0Ld~j#O}*u$$E2bjo21`tgRF)@2x2y?~FE>q^_E)3Mg*$ z8TwalwwPF$1J({A@8~3|-|pv!Q#WI@2{Wb|7w_4v-;Y5265eMw=bC7O%94^QcB-1L zVr^Ymc?B!A32GSEGY8eGF=AXyUvCQ2k_DtY#TX2(_9}0>>-+_G8B9OI*5EJKJh-rW zB$&Slyo;S#c&Eto0KC zmF-W&Cm%a4u;z$*u0H-4-MeC_o70-4&{O~Stp#LJD8xzWzEu$9fFo{LICfr2OIjP{ z7K=Yf7dDY9{I2SZOJN+Yi&UK33QmIo7E_ens@3cF68>I}xg_>xUP`_)3ME#8Kd2QR zCw33Fx!+((=t9Zo*O#9tbQkLgsyytkdSg&HvlHqT3R%gXk-K*tJ+1`UcmaV^_Uaa0 zr>$@xb59U4{E*x<0(mb}BKFQq_R1`>Lal}YE1^vB{PPAhtYz5ym9>k42%tD?<|FvV zJI5#5$ZQdG&KqYIhNRf}^v21Be*kVYvvMba*j+LVSwS-4*iBlw55Vj2&sAV;RcG@8 z)*QBaf0g!$?Rvg`Ui4R5(T$*+Uf8nHIjyrB5}xJxST4!=&ma0JViOAN9Z|i-=9W^p z?&4q^Pr#VtK9PR!(G|1O^-nqwBR;q}oMLnXQ61`5=!P`ubTu!JC!R^kvz4uXk`a*p z*Z5(Lq6X*nxN+uBec%|;h7CJ}mDt~OtLiH+yCD4Mfa&cDuOsVBgw)^k&jx}jq8|e^ ziI9Um%*Qxv))B)R9-{=<{T!xuRd*_|;!p(ekREO>9C+9Vm=3FV_kdI!_x95JkGy<> zMSUH!6=Ji8y{Nl*(n&{C44+Sb{Vt#A4QSXBEU~NHyX=gcFZvGhDzku$*a~C+Xx}^5 zcsjrCbp3%3XVaus{_Fx)z+!#Kt)A$TmI@yU9~%_c3e|05ua5Xci?#j4nxk9cDp*fg zzy=VAL^pdqd6?`j0%`5DtEhF6!L#ORWN=yJmP`$QJ-3T`tVh$eV z&{T{Vx2=*bjNoTLSP4`#?@?2mUP-(K$I&aZ^iGZwL4DWD!-ZggfhA6vrCBC&F)pV> zk!RiVc+uvd^M~Zzy?Kkz{X!~<#v4u*BiklDVs>XlmoNuzp4?u&g#PMpaGMFMQ~R4& zp?7UuD5ic45wv;;_J7~o`}`fzIB&+dTkk}7^T~&kFFzz%d2Uh8Hk&jV8(_-Kqu>Rp znd6lSgDg9~)i3%~RcGDmK3evHa$XZPHy+paZr7_nQYlw7hxmo?eexL;Pel&PW;EJN zSpE)a&@6%LGIq*0VWJ3ifQF?IByK3qq)IlJhYLM`LmLj3USzYV`o<08=l)NmHAjzBk)q{3rOwcGAUx=s{=un1O5KYPB?+6 z8OX|;=E0XV>wIL|9piHxUC4?x#J?2lS-I#gwU}^Nk0_@qiDG*@|K4ES30gM;*3bhl zaf-+TaRX$d@aQm(yT|T#0cOWj1gFMN{sBGcD?rh7L7KkXcC-)fjb|bFc?R~eD2L20 zI4AnvRj84;89kCgiADEiP0Q8{ulqrNNOw%n%*|S&iU(x5^o&O}#|9T^*>ik3m(z$H zZtfx-g)(aCBcvfsWNw0F_g(K4;~~p7i}z3z3vA6J+P{>!S{GZ$zQNNFiH+-e5Uto!uaJ{guc&_E4<#Wpu$o20AdT!=n zg;mGrOzY?%4^a!NFb$WC9bE*UY%5_lB zZfH?A(=7sU5~qoM(;Kmnymencug6m{9I`gFf(aHho4{sYWS~|(x!M1CJ51^Swh4P) zuIG9vAj-Ml%`J&-mTrH~y0y{Vc|^LR!8i1Jp510J#iwm}OXVeY`diUwRp+#Iqwr8j zceh%+Q+jXjMTcH)wXgV|>eTNlIt$Yl2O*6k;tH%rmAQXWrptd(_Reh|2i|2%d>V;~ zdM|38{qdloI^fRQkX|x^>ky*Q+gl=AIGgd6@TVS4?oiqbGl@cVEJ;3P>DE>-TW(qv zycRzkrjdIOkg00;w>5a*yA#`V!TE9_O|+lBQzE7JX0%4_F$U@eu4FZl!woH&b_V8hTHED3t?qFnalr6mOH6+Z6aYvlq`+w6e4^bN0eUr_@^>n%X=5W4 za@%78D>2%R;77}2`@p`C0xSy0bybRzu5!`0Ay#(i>4<6D_Zz>`-kI$r$`>`0^-A)w z9$ZLrQQ^=r0^*#OahZHkDqGmw?NHt0`x89nAIBs@u_5<7eWRy1?TvC^$7$nC*Qx*U z;}!T&4K&-&Ae2jVK%l>Hw{FX;HKu+4rxFEWaie3q4Fa(elTYr}CH+a8{eYcLAbx&3 z&;I4y(zT1JM7YjWV_gyot-%-;Wtu_V{LMHQCr+n=9p(LahqVcK;9$<2k`myWjnS|e z2YRXCr`cRxM%rE&cmEBzx!~5lrr7M$sDPZQBHcSntHpa68-6Cqh|CfpgQrRQixXQJ zy}iXA;wP&}zjJ%GLgMo2Ukixo)8>DANCBWKTU6Tucc|*o3tgzRo~zuMJ1~?-KYzW; znseF9ex3itEyk+VnJR}C^pTOR!vsFXWEBco?v8a9Z?E^xII6gW2UhvYowzFj<^bjp z1%k5(ZP88#N5tynIR*NKfUex4>3sfytQQ$cDw_}0&uZy=moV~g@V71Ga3#98*A$$V zawD_br?ogd<0uLBXiiD+mkF4}r|MZnEFEtjbq8qe($%Mc!50*yjTKT!0{N$1Sb!s; zQC$y1Au_XRI~cB-{9>@kfCx6u#{a_@sRo6glM@X4VY_f%#SSKUTGT7_iV2eCWI8&q zuex({ijo=J%VM*Z1zOCKluMFQOmz#K;uteH2Fw8{zScYL^Ha2jQ88 zzsM9UikhMIH9ZBC5#uhc>-$dEFN`t?B)Tdxii2okv4BSRI?>;YUe4@txZCX5}$Gm2j2QZ3pc;*eeXEp`=~&3#?hV~^eIW#eZ;ZV0+O!dY+Q`>Xc-`Z zMf#ds)xuVPaz^Y-T#qKQtsoJ%(mf!X0p7~ix;1>XpD8zv8LVh0)4pd}4j;xNkch+L z_77o3jL8){pPJaP@)9&9{fE{k5u+-sRSmFzg@Bv*hXh`Sw(R%QGzD5^^(40=50Sn= zZ^y=om0eK2fdbY*IA26$wd<oPzUH;SBXuzj9(i%*ICx=|*FnYu8SP8; zlrsFnew}=d?0nHSUddnA5?sPN?EFX{rhHcw$B-aYR^^`oBlgQb`^obX8>0Tm6KiG; z16ZAqZQv<$#)(KXT(%U;04q<3pg65pa%KBvth_3v!~$PJ+eVexD;ruGMe2_Ww87wq zy<+Sv4+HopX_~}47|hW^(&MswUWconOh1QS#)g3Fo~Fr~+U& zi7;Mp1EVyK9bXf_*7U(AFxHqiGk5y!vXGzrV_569NWPQ+vu@1%dt;brWb3X=a9UfE z8b}1VPVD!yNiy2_Y28eh1UgEXeOx%R6rqR8umu;gL>Xh&U4D#b`TYg$#WP{1856kx^ZO*ggI4f0as=}0#7v2m|dbFXv+4(Kbn{$R1 zBL&@QvQ4WnuJ|TEs>paj+60<on;MK096^+Cbi0QXz+~aKse7{^sjk%T_BiXsr%OZJ*WfDop zeb2oxbx?dAa^?)#$_HK)wbC*aN6$-LnmVL?g=>69XX!kk1~`^!Dc0$GSg5!qN?NBh zJ9|xQ{Y7=L8&xNAcyoBXkc#MbbFP!RK3Kb!*zK2$xSq+tmuwpR$JpHs^3hsYWcN>( zvh_2i`C6w3^rj5UFM7Bin-%F%b3N7`XZNT!d-zV}YX4oc&(I3c;^1#7C;k|KkI`pSXjVFK)b_nj_N z^fzxeK7JH@s)e-ifD}y6tfzH0)^Z{4kE7Cd49=HdwZz>mlTCb%-JbXCc9YQbF&f&t z`L^6*WXv^y=pFCW4Z2r`h6+oTq&Ci&MC`8E44n_+n7Z=p$@dGNYoaK=u53yiMSDqt zVHSoVss1YNZQpg|AEcefWULx)j_K}|-;f15gTcxF>Opn_e@>L{liO$nRf<+3OvAHM zO04#yZveKO?OcR`6~bu%7(@njFVs=cPX)3tc;63qTkpi6OMAoM)N#StPL#P*!pz;X z?KD$>#a{{dsNCf+%T#EH-sBJ3YSz$ML}VG!elzYC^NsQ@t?xFkeZr=hKxU`TOe_<^ zz#^tjiRbQ9A$hj54-1z_pdz`1kzZJ@33tE~aV{RRzD^4~lOMyw_vy!-?H?^j5SH$y zj;tBIX}p^KYWPWZyPW&f%i{;UirZhE(v$KH$%0&Hd3AuZczVvXv1;77JJ3oR=={<8 z*T0>BWuk^4P?WyY_VUO?Xx>TG?B|{Z5~%7KdAxsZh&%f`OC7P>12Vg*nwvANLP;BM z5HJH-BMIw~W|>N@!Y|%8r{I2DVTUr({e0Q#v)u3)9rt#xU&hHMuSX!kbY`^=hC^o! z2@8$<6m|(XHVOZE_>PrAwd4<$_jy43;RR{KJ+)(4ESnpg5-ahh zN}5uwkr^WV+Z;Rs9|*@Vos$2!kR*Q0{cw?x>hnuR5~piJO<~#4l;~bvUZ#`=B=4PF zK}76$S)`r$gsC>ZrwpgBZ<2SrShpleFLpnUhrd!}CJ*U$QB8w;;PdVSu5LDbYX2%H zEbA0@V(gx~=E9Nv{mrBWWEM2`up9gOye`{L&xF~ec&*gj^rLh&{D<+Xn|?^6{V$&# z+A*@Ojyp=*=Uu6PKyIJaK8^IG-<$|nVcJqa+?{u3m-Y@xc97mwMYPADIC;nXa{B#8 zE4Z?OtPyEsf@@#*Pk~>W%;7Tc<~nW-QFYpW9jQ3dXfAjpXw?A&0Z&ey{W9$I*0HL; z9$xTH%$en!5o)=Z7K*o*O3PYShMQ0oc<7{xMS-rnNC7TbNaf+LEIWMR;QHP-tCe$P zL_Uf45DHya=V=ZLU2WnQMj)@-hjQtrh78mujh$D$pmemMsdRXwcv^-9vL(P${cZyY zivqPtw!e-9urt7^mm!$dmZ^P)oZ;2;`T|j{)SASRUcnj~SoLSI0? z&9L0bwD#B6$FQS=T9DV*pZIZQAgMF62TIHA{?x_~%Q2w30MNmx6XuI;kBtbe3e{o3tQR1!i5Oq%TkL){b~ zbgUfgYz!9eZ|a?9pFczQl>P`vs|dtv;1Bt00WeOvADs3G-uvXEa+tjs}pbtPP#vyGfjBbg)a_+^`^QiZ_sPyV*!P_d=ziJgk)CzNP zZ54TMDLzrv6B|w;eiSXlbsob0_}3iGntZ%SjBlmAawU5HOY4Z$uH(_%bZ3w1ftH`^ zl?67xy#`0Ky=K#z{QN8_E(~I_T;uR*!QSj}9P*e#)o08vskOVkih$$n)LBa7=_@t2 zI|iF#^dgN-@sE;`o|%#dbDnJ{K`f$xfR|#i4H8Xx99OSU7<5DYW@w7i=8{zFkw)CD ztbe=~obS8EO!C&#C+rPNC4KSg4QZ!4?%`cm-(P`KtD=4cY0SU)<&ITpbF{?8ndWP! zf%IeaZ_5s~51gFbsa=C;L5C>Jd``S~%f$@g?=8%FdblVTCTp;~Alj|Q1q!f_Y}<5# z|MI63iZi9OJ}Eb`|5;O1{BnTt$Ivs-!V%Qv{mzD@jjTk*APD&z+H`p8Aw-(S@2 zuVWS;_z1po?#r!K;W_f{UO!Fc=Mz05PoFvb{&sG5l0Tr1k$%UQw`KwCp9GmQ&{Bo~ zT8rK-9h)zRl={$-XPmw6Qs{)s-d(yAj(X}a^L)C!+FbQB%pO@n8zrdn*~$4dS5`G} zG>duXv;k7k z{H1|42yT<8Ux02N-h8mXb2U1?9>;wD*p~>3b!B^&D z)er=F1ijiAmaU?_B5=EK+`t`p6|-Kud{~hpNg1rg$W*sGc?9R+_S#`?iKbP9CCgwx zVCcE6xdL$b+hI7g7}uh_dP!@Nl~-K6h&+O~58SNt*-nU@j8b$+{N=8!I>%&@Y_hik zBk`Arza=?N6ug`}z5X>G@o`BJtcql=c|EV$Ilu=y@0qOKQO@vxYT{xxQC(YQ5-6n# zidVRfhHRgv=nvAz$I@eg;W|$uG9xI|8|8v9?mrFEu-%l`+!gx&0qg&DxO}E@ed)@* VT1Mgv${?M}P}fwa>VXsde*jWjXtn?V literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/SplashScreen.scale-100.png b/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/SplashScreen.scale-100.png new file mode 100644 index 0000000000000000000000000000000000000000..6012579815fa4a18c7d12e900b629c6fde5c8d8b GIT binary patch literal 6866 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 UwD|=1lM1Bs$WW{7Puqz91ABlFQUCw| literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/SplashScreen.scale-125.png b/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/SplashScreen.scale-125.png new file mode 100644 index 0000000000000000000000000000000000000000..0c35be827fa2ccaf34c9ed18255011511678c342 GIT binary patch literal 7899 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 literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/SplashScreen.scale-150.png b/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/SplashScreen.scale-150.png new file mode 100644 index 0000000000000000000000000000000000000000..f1e60f33c3b4ae5d0f7fcd893a89b7adae98adc4 GIT binary patch literal 10137 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 literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/SplashScreen.scale-400.png b/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/SplashScreen.scale-400.png new file mode 100644 index 0000000000000000000000000000000000000000..b2b7ca9c4002a64ec810b0006ca34c330bb12550 GIT binary patch literal 46573 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 Ys(B0le%?Tzy4wM0sA^+NRV+jQ52u_yv;Y7A literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square150x150Logo.scale-200.png b/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square150x150Logo.scale-200.png new file mode 100644 index 0000000000000000000000000000000000000000..20814081dbf6b3a37a4671c68409af535fa5550c GIT binary patch literal 6223 zcmeHs=Tp;7)HVtty@(PJr3wLpHv%G6P^usu6Mldc>Cz%d4Fm*# zKRqAqe3fB-@$}xqi?@pPBIr~Ybrl)iP z{nwok{I8SaOElu&!|@;*nj>L==KaGe8u8cm7fk3|F6OgDUV6Yw$NWl`ft$veLyD$H z@c#_{=i@L_=7#8QY{ecW6N`^QVs0s{)bpZgmzojPjMoEq?}g$Mb2U*?ie8>@&8%0hrRdOpv3W$*Zb z`CsH?#s0-U1H&p+;k%DhaIylP>e}$zZn%s92JW8HIZ=V0+skzM0+q#fkMiRk6!p<>y9mjbt$KCCh^yM5VVDm{fLzXa56=p7gwDVgJz z6V-jmY-{g)v)OgoTQs`ys|w8@72HOyJ13-O|JA~DB6j7#&q3Jx-R8MIY`Uy18hUpH z?rgBiyN&SP-|ABtWln|`5Ex5pBa(I5o`WjRgmGDn4BT;~#;H^9FAp2kZla^aN1U8@ z0plBSZlJGKeR6dJnwm;<%-YX?3!E&N6a~BEVQ3 z6xvwdfbz(MwdH#;;l`bfwDE875{J}B#cFJFCE0zk1>wtYe0s0MTA9^zeU1mB1sF@RgFhc;i#Uvb%K5mpp#EhUvnGz15gfh;jm<9E$J} z2XwO44{-rYpBWy(5&MEcR(3=*XKK^aI zPpzS>TXF+LmcvyaV-|$rP0dc@)y5xEl!YYeTQqE~4tQ&OfQgw7Ny`qe{A^6_M%Y1- zsIk-uUWNdUVq)MH8?K)EVhLxMblz`Bf%=kbEmL=GJ{TQWFvFV9K5GRY%!2#X@4ltbHv2r#;X{h{V_A z?!-oDj3i`6*gt!pc1H3?*i73hz`8kcS>;PTi9lB(F~3QDc97fiK4er~6s(~w2=I`` zoI^zb(4lSUoo3+LeVgvfnu+xdtfAe02AYT7T!{Pjd`^((Qk7%eVLcEeoY%F06y>@7a58Ufz0ScI!_-x0<(HXaer?TXs5X z(qhhh?cl4co!q2@_tSSXE-;W-MjFBUM3dK)jjb|1^kD{&8dk6GMLUE;v@fUQl+l$9 zF|E(u2mx}y(BvqwK>18PDFM2lKFXX(?4m+SZD7UIui3F_Il97CiuN~er6uwv*#9uO zZG%Hc`X7gPI2JjkuGB`f8^OFWv#+;CR$J#S$GL~Yp0v%}(d5MNmIcFCnRw9x;~m2t z?r!z^?d7%|k`Cv}B#-{7>iqduy&G(TfSln=3r~VAdMYn271|H9hyP&#c53^uNA_2u zY0ao0e$|h74!RTkYnE6#-3t|>xSLr09Ip|=J^T)SY^a`O9K41X6*`-Zx!{7;a2eIpp(yEKti1B{qi9AG(k z$QKYEN+BIVH;lGld=sZbf0qx;?0qdi))AF@HTDU{cclEwZF@18zi)NiZ}|1s`WFibV&5JVk}%kA;#Tw@#duZ8w)1Y&NWYhiU zD#Fj^lb|?(X5Raj?Nf1kU@~xq>uSBID+pXG`vgJgRKw5ucyhSdHD-~JokrH63B^!YeK%OTdRhOm~g;d`6^ULy>6=7E%- z6t>d-=d<{zy$f~0rlV&oF6vp@X*shD;`<$CDo?mN<~lY51&v<)H4H1j853SJMxy6 z`zkKseThUq6#vSsYrO}W4=rGTXzCP8Jmj=9cCpd2WlucG7}+=oqRq7@Cxn|*wlYsG z;+LZAB{0FsK1tY~^B9pH9`yACdGuk(*26!TBsq6G>0O{V@3^dE3ixb}J{U;SjoO4B z>EuBcG<+#O~eW`Wey+@AZ=cF=Vbf0L|u|GAMbt#`0TuZ)=3g4Qt5` z$obzncI6akfydMBQ57NcwmcTn^Bsri$6RQ#bWbmEbSk{qQLYlukU$*!4og@{vX}7O z$u94NttCD!MByuBttPVvue&y+6FYIro_pX4pvh`+EGzeAWTDts5r9vzXc};~hE;Z& z!djLRab{1E!B5bIRp84%HHAPz=*zx7F5p8a=7WD3_0*!yd!1ShZlWR5(o9p z1c~+O=~Fr3(M3}bQt>7Qh_FW*rWDt`~H#?x6(9^<3l^i4tlU>F{{iIo1ZLR z_dX$TDPH}|pMq0vc#rE*v*`wchj6m>6%Ec9Z;2P(CM+%Gf*)L>1*~x3WunI}n-IPc zi%LaAP%B*T)^T49q0G^n7!he4miH$d`4fQ&ORKrFZK~uT`o__DA2{&qW1DE=6oig&V_ao9)#;UV~m(LAiLRM^1(a1P*Tut)2pvtI|UMv zYC>0n!xF?sKrfA8xqbJl#t*$0R(~3zDtX<7fopC%pJw)@e5ik{^0VE4ri zjS&`qP7D*_xlzzg9O!Q`RA5ZdwXCm+LHFs;fkdbxf%OLdxG0_)vvrBx8;@%hC)N99 zYr26PzKvMMJk`dxS7)c~&2Ct%UAwUHHiaaf5|er&S8VrL_Unj``{Em_dji!xDF6}l zr>99K8CIb#uA}224l@#d$5X{!JAg(OOuwF*4WbPH8%I3y#=I#mOy!uZ;2hMS4`Iz% zWp{O$yN1yGhRh=#%sKfZTRh%uGr&;esw((r?YS8i*dc)`IqdVg@dx0{7^}C3@Am6v z&Ls}>WrOSvKjDaWAMNhQ!ZaH*-EQ8Hwo($S%(m9$wNilT)E?3DqF0z~h*WL==9 zhlE{xH&{*#pB*u`u!(8EobYmdfuw48IOv4QmEmU_UI8UhiF%sF&?;JXaJyl!2jTpc zjPoS}^6uXiJt0{54a519 zxqDS2CZI+?CyW@vv7WD@jIZL6*(nt2^6Pr=vu`)1RBoVK=aI57yAOR?rj}G5ms98ylAVD#m)z2ovwhtv&i?l*=0Zhgh_H_(<@CnVIK zEX?9+E#irAB+3W*EO7S%FM2-6c*#NDX?6c6aw;u_`a*W}UR2b!yT61gD&&;9G1E3N zn0LshQL)7+hIa6dn9+eaxYk4yZB0dMBL=-+rcnDT&S-6v2*5KRc5l-J>8EKAb8|i| zTE$6rHzBh9@bu33$(>8>IOG;<8xxlhz*BQ3Ka(9)ulTnOwRzb19k({aZjiqH#z6%B zsvz2b>*EMp94J8TM9=4Ys?b)?nQj>Aa+e@*IBJ!=Q_WGE`vr1+YXn8<=D%802*t}N zeBX@r8{9emFq`9=2eR@%)7YvT3gF8-JJrDLt-Sq}&5`=XeuhC>nqlhY_x`dGJAvcQ zwpR%Tg@Rh=d%+JZ+w13x7(by6~aenL8AY?VnX!@3cyJN5C z`{qRFMjV3HzhL7kSH;$P_+kof+22tV3`q_#$df*MT4a2OOhU#PC{ z9iD!Io(ZGvEVf; zoPFR*hfi`R=ybf!VT3?>LP^M=FmP}0_k1t6HX0Qzf(m@?UYFY$<1ZD1@S+3rMsvbG zyQKjo@MyWo{VF>h^uFf;*R0IR?07$y^+ufW+(67yqJ4oNR;ui{rs4kk!TQ0(v=`O7 zy`Z!dA|E_9Fz^dbp9wDb!U4AT5b`{7y)8&CzeTI|_TO+(^P%@$ z$Oi0F=~=$@{i=P{W;yX9!mb7msWO=LklM;`FBfi3g@>h+`AI8NFQkMDvCX1tL5F&8 z{c0ni^)Vi@W?}H<>uaqWVm|`7h_RJBYP-@@h>QLUC#nnHhUD#9P%OdY@zHNj14nAx ze=-;O(;rNcT9=Dz*#&xl9wQSLuAFcCTd(fR_cA?|y{bvoN9IdO z*h{d=onsAu3)gs>xD# zEtGsOUN?&~DVdy;U$^Er8?5gOIil@$>Ri5dNeaXyMAd6x<5|)k5dO`cwXtg=MX8S; zniGTUjN$C*A=1|A1_70psS9QW98}%Mkx=o~%$oAb!blBm&SkdrZTR^Y zq&B)cN&d$XmRnK~$S{MQEX$8=`+MW9I&{!i3-r}p`)HTkon{5|<+pz&k*RNP(BDSR~}#+Y|5jq*~~%$weF2@aD@ z1~vJHGd<$}#i#{QM_gRomIt3>N5Ox{F7GG6pW{#OS^05soo+t(9BTLZ8<3*Ek!-O$kUouAI<*PEHv;s$>r zP~|pp_D?;R*1vQ%gx*}a_Ce}UY^O5rQ?;(MO9-w4x2#67EmI_gQlXSRvexTn^Nh8M z?FQBs#y+DC zsa+Uul;=TI19#H90F8Ex_Goh01FuWbr8SGD_BLmNX!CH7u}zIOh=?{6bzvsHU(bswR)e}u7^0uB)^Ru# zGd8B*hS5-cw-eL#qs1Iv5u&>$9fe!XT-{jzQDsQ@&q_`Q0diN0!m59zZ8_IeDbou}Uo#3Xwo}Z66LC8yD2ov9 znqBu+3&rDSEgLSCZ%nPweyAyIZq&3vUn`lec_D0mnlUJgtyOX+F|uywxgnP3BTJ$? z?A?d`8cAK#h2{CXRkihddoir)>Gl@>@^cY9a>5H2751}sA1-HLS0o9AF&YFZX;>D4 z6>>cacL$ezMD!k5U(@!hnEDaTcj!@aHG&;Id*2TLC)bl@(SvP}aHl%T1Mbt8OP#QR~nz?ZGD@~ds8sK7hCn#d`RUj_r`t! z{aVF|z-6;`Ym(&mjw1pCpGUN>Zxk*!?xG7LFQ0|QN|(dLzpnL8L44}hk05!xj2#Y% zxi2+G!rGARNd(fp1sZI!)u=ghFmr5W$o+=T$K^gS@aXEF(G#V+JB6**=CX;PkP^yXrU;|gdJfkA7h%Ztw3UBB6HcNT~2t79LuLQz_d2m;iMAUMqsf{|!6- z0%74|hrPYLd~CJMnPhQ=<%>2IUac$i6Y6goxYe7+UO`3ylE%vyVDTs8#xK@tV6}9uOMGMwH_(*rhJ@)84mGS}w)oIu9>V`eBe1Y+AqQ z7?pYXke@`!v&!=2sU~G4JS-@?PDctRF{5~)D-t{2!Y_9MfYDeGSHQED`#Aw#$6KJj zvxPUT_iDEZ^e!*imw^=__iz6Ogk(KXam6tVrbGpkP7~<4%sZwpgVC<5ecI?Ho22;- zOf+>&?t>S8T#c-v`VS{f500JvlOV9mh*NV$mNeo8x(SNi2q`JwBST($WPuP_~~ofVEMia7e(s}(Z6Gco#0r3y-EjBSbS`( zV1GP=xpSb)1DQt)09oh8oaz_pq0kK!72SPqIGls?ehMz zQN=djd-y5k)8&}pCvs7^eb#{qHl4FA-+qI`F zk>4g4N46)c4VZ<>Wd*^S-zU?7_Q-r#**Px_)+@4dJnHaRdIR@tFEPV0*#)hns?YX! zd6GK*T+E$T`5jg$fn8I{9G50IM4h*6sI%leTzR`p?rCST35V&0TD|ko_VoHOK^W)J z?&QztBH66fUT}KcG$VM9pn6|8Dt2tRY6Fc*bI-en+&!#Io7 zkrRw+rZK(n;oc^_<41H+zxMvZ8cE^98qihWh_*RAW2ry1?#~)^LwK)_jn5flBSKeX z7v^2p`8hAm&FW$v;`NdaAZt9LWeKNHllOuyuuc)UaXA&(#D2!xcEZW*FJk`-ZR(Pxh20j95*#(q< zLPr}CYY-r&Ot97@rLJu_@WEbexn)1xLm)T50>I+ih<_pv#iTZHyLc|$ja(}ueKTo6 zVzsxY5!(U7NolWpJE5PqgFZjhRE)!MJlSub_5EJ*Ovq}};ju13dnf9Ox&^$#{f3cQ z81pu|;^Ed<%TwPEBz^dyVX2a5?zOWKO~EPqi(aOMxP0|+d^KWk9YGv_@v073c4ON# z(_W~L+g(N~54^_tK=mQAD$%mPpN-%Vby#wJ)!)Sq zq$MmzGZ3EP^g^*mcrE3c!V9uAh4^F(Pc@I9oQe>m20F-4NQB_0yKfBbRibba#&2-$ zCdGMDu=Bahs+i_ne$_0EpZ#mqat_BqNNgVC?aFuE8Aj!)-yr14$Ke*IE5D;ov_9d3 zalQcc#l$yoXR|fhlU>nfC=fhu+9Q=|dCDY28?kN6~V6^0h=a)T~UNHK**H!5VE9rL1=R6pDHU+oZ zg2FlG-Xv^ukeR?WA-N$*pCk#yomy5L1Mw-5!F;dk)&|Ypwx3xU;z{dU9>49- z$XC7}@p;Z=y9@=;LE{)QlmcV`9xdrg*iP((veD<8k?@RRPAiWk-?N72xh~YcRYe!{ zFe+ck_AYktbUZGH>Lf!zP@-5+Jp)0{Tlt*NK=k$tfYXWE_t}1N`92L~VaWUN-cb~! zvN>Wy4-PG)DaK-9-s-iSLEvmGt-<2Yjo!Mkk#1Z{xv-ViOTiweaPLB=#%6>#=LmrESZ)dFWfZD_JR zd6N+S!)^SzUzp6!oi@tjeAo^h0Ym;<=ewpBhN*h?fcxg(4bOEEOLuenmzhSiact-A z!}-^VxEjoqkxdKKo)31uRwjoH;`;JV6SuGi6q3M{5)q!wsMd9YVOny4AP+U6L);RvUitDho9$V{TC)g+HBQw-kfZ#IAHP zdtKMHhMqeg5={WupHN-(!#|?06Eepp1WqPH6USr;QXB8|WN@k(l%1!LB%Y_{07Zny zviMe3N<`)o624a@Nys+uNP#X?9tQprpq`2vY>G_l6Q20?Hu8`t*zD6N_FV~14oQUAi9CA_s|h!KU=+$6kgZiV8s#e%+eLVZ@* zs+2*x+f;V1>lv*9FnA9z(bN7E*H;`gLAy#Kv3u7o7$i$1l|QX7%G#B0;T!uaogQ;3 zNtS$Q#*;9==7_wBhnG^sPbt?R0xU1b-K;5uws$#FVpKEKex@YJopca5BH;gzthVNE z*|)~b=^je_tJk=|W4M-c(lB<^XXeutx{>Rd30ic(p`Ii#HiBmL&m-; zZ?d)u2+oN}Wojo>LmxW)m{BM#u3HgxC)YBp@#PHt#1Bs(_l2SX(N5`WM`HVLk?Q7t znz*t4ey{#DfnI1=EP!jyeW037#n=PYpZ%xdxk~wRW0R87R!^Lv$?SZtW@~|>_p;}! zzbRkr)8F8to;d$|4mK_r`j~6&w!>d(R%^GXS_tIDI79M63w`J{?osZ;8vkaiy-kH* zOk1w{VEXZf;`tk zdEAU(stP0dq1`i6LyA7PYB`ya@KGMr2r+B>3zK7%OWbDg_t0YV)B^F5_0yBGDCb%; zQ<<*ZLJG<=$gZEE6ryoW8mzlv+e9!k^J0(WnR9!ct=DSQ1K~#RaEZu((K`g(IheG$ z_rl)CWh~{%u4)5$_syhsPD9FUjH_?2d%a5dWA*)7bftFm%X+)e@kH&8Fpr~Ehq%vL z4m|O=D2%ZtO8eQXWNj4;Wez>omj8M`P5@@xTP=*+Uo~=N(`x=%Ab#(|EbUL7m&xil z6HqL=XYAg_V!f}9&LtAFm-h|J=T@3nK30=Eu1Z0&XJ0ow7qDI{kj_eqVaN<8wosGwn*LxK#57b+QpsGa9>o?QXJ&ZK9Kcsg))fm694B(1%WH1Tk=wJZuJl-79aj!7}dm|JZlN86F?JR$hS_xb?c zBYCC)C1)gcVeQJ%l0OB@bS{jK+97cR=BXBy-#cguHY1^ugt^cGY)-AF=0)2_s0 z6=*?vwDvjY$NE2;irDK7Q8QjOjM8L*@RHj|%0NYVVh zYm#=7{RlM>$-iA%;4cb$aUYJQRnM$vYG-Cax%~bBo2!zpu`UjqtasH7w=%ij84{vl zSUOworN$2{FfXz&pd*4=l@5@!m!ss$%jf#R|(ucYV*H1g8O=r3wf-w27!iIF2DmfAU zKr9ECgm!8cKi9`&a&Di~=p966qoyn|XL85)#a7n)`1>Pup@`3FHPMX18x}-g#yrVp zZc0I)#33ratD1gAw7(?;Q{wzFr$M;0H>#yp)1}vHJ5%MUCcim$JDFz|#9Eb-l{e0u zkeR#9va9S&r?+f|Uo1Wtb5ci%K+OJh-NG6qMoGbBMkD0)NchLMEtCf*O!^cEF2Unl zLGz~e^(bGq)0RnswGNkvFGa11J+x7HgmR%p)8=quD(N2!F0@BLq*ecl^a@-V>t zl)reaqz<*lUHrTC&ejuA*jD!(A8g6@)1F(gPaD)7wbf6r-hLruC*bx+1drErp5M{> z(v2y4^vx&B-KS?U_&Qn&J}~H}dsuxZG`P-}-8Mr?69_rApaq+Fr=frfMkb9vj|vPH zZ5~vhP6)^?%Ivo$4Tpqd_AR)2c)^HL!N1LeV6CQ&fqUztF#GxsB$igv@txJoxJN1G z=3-az)SwVnTclm{SbwtW?5k3k!jBZ3z=R{M(qW|tn9Z&oNU

4u6S^t?ou(>^5(^ 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 literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-16.png b/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-16.png new file mode 100644 index 0000000000000000000000000000000000000000..1c78d96bf8b7a1144eb382cbe37abdbfee03212f GIT binary patch literal 697 zcmV;q0!ICbP)pHYe_^wRCt_)lU+y@Q547T-kq5{GwZgiZGIK`;J&plMc@ibg{6=d z^g$+}OIYAj6um4V^s=-sLA@2?lND+b?n`Ne28ElF5NVL9EC!OhHCx;6eBGJZdz&5< zKUO_&7ykd>Ih=F<4A`NryjAvdUT&BWP);lYoFe1GGLH1uiVs#b%y#C^c&3;jc9a#F zfFT3mDhEJL;wRNX;o*8+LBRECD&(p0iY;OTT3RE#Pk>6&c>c78@7S!}0;nG!cjkc^ z<2+nYl{6yk6`=mt7?qb|ZH1a`0r=f@1IWWRDz=%o%{Xhs6_Y(T+}cWZ1zerddwDN= zQIT}Qdj)99){LQR%`fVaUdX%w5SrBP^ChTLN$Ujd;h~|L2_^fdap*)@W;^p5AT)`i zf{(kcN|95!cOfr(&B&T(p4Au41m9>; z>OoyvQYTJ(s$9zaZmCw?;4yKz;0~%@q8p3H<(`3)?%5+Fa@cb7;rV5q_)9oI3Hd>E z(zMyU0T78eD2RaB!>^SVu2hT~zcA1s1PM8xFO^m<#m-lK+wlskMe@QVmhc!`j2dWK z17Anp!}#L-EzsQ^x4Y0?0iRDpDbTlamQv4HYT{Ecw=hT0zRC+E;p#U5xV$Uie|_nw zP{GlA&5XbF9rRTkqFA-lRMHCDdJR&&6k0#YwrK>@cYa$3dYTwUk5Nj>X-=}$d<$GS fc+>vVYjOSukcb*(FO@J{00000NkvXXu0mjfXTw1^ literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-256.png b/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-256.png new file mode 100644 index 0000000000000000000000000000000000000000..d49d3d89908c2dfcbd1de42523ebe39418b95dd3 GIT binary patch literal 15554 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 literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-48.png b/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-48.png new file mode 100644 index 0000000000000000000000000000000000000000..6389ede5a62dbe77e287f93b9bff4c7235732ccc GIT binary patch literal 2418 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 literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.scale-125.png b/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.scale-125.png new file mode 100644 index 0000000000000000000000000000000000000000..50faa932851c251727b33cce223e75c4ede7e993 GIT binary patch literal 1893 zcmV-r2b%baP)pM7fD1xRCt{2+G&gvRU82D|C^c4wLRG73`_W`xX2mV1%iYuU}8v! zQNyu|8xA8z@!;}{ep5dwAVfp~(Jh4qH3UOoVY|y=K=~vJ8@~8qqsXzc?Y7-^rnBuE z-da$x~=s6~(oj9~jRP7$7$E}D^L&`VL;{QW)Q^u838PUF9L*So*<^020i!SG$Qlil%$VX=cM#at zQray$ZiP2Aj&lhe9Dyk*805)XDq{rZsh75t+ICrS6lSj>rC7y1Nit!SV$Pt@Buw#Z zJFS4xC>yT%a%ij|iC)_y!lXpTb{?*mHe1z)vf!G}X2Rf~U^OITK6RIsFdCNQ4A@u$ zHZ7I0?BQjMH&ezGpSH_gFTHJbUo6F~y%Ze7+QkkEi{ybBVIE^X?Gtx{U^$G2Ww-=P zq8Xd6_@g*)C7NJrzqXse-m*2T8?I?9eWr|>5G2a+8|a0Mx!WPb4P%}=op)oZ@M=kb5^9V*GuYc zfl)AS{gwV|EJ$fs&N8H7f<^kGd)*a=(I^P_0)gpb6&+)9LbZHM>5W%oCO&k0vQC3^@<(88Y$O;5&c>`EFZDdK3<|)pNc+$} zNthkzF>Qj)LOr>zC8zs{FS^fN{~&DjmB>7sWIK&m)~OH10kPcB*XWsr!163GHXt*s zy8hS#>6=1e1>tlJzZ<$8n<~|avlM@h6V4Q@It_a@`#YL1N9M8;e}=-efuW@Xba)_Z z49_$4ASyoPrQ-`^ccHL?aP9^2AEca?A`m;oQQ}NBwcAf$rXsM>bXJUho)dO4Fqf5W z?G!c`&H+P12Z_QMo&hbOv=j>~2uI`SB4;021{UjpykfODGo3*?#t1Cj7yaUJgSavK z|1D}KFsIzku$)s1n@)k!2POw>Kxt`PP}rrsl5jK*FLC)u2AAl%bgi;-pM z9<&hH2ifn>IvuEIBnq>+;*kjE7=XW2O2JS|kaW=DeGM;ENDS>os}>emS1L=b}BH3vGZpMY*Y%C z9$qNXU~e>0mXn+|29dQaN?>jCr9)Qt#ZugCul5vT;SwNDpfEkxHYN$YA7g>TY;2Mi zZy~TFR`w$mmg3?V`^n1N!wT@2uH^ZUv7sg~j)iMyucC8Tetg`@KA6K&+_k0RZ*?a_ zPYX!z#TH%SG8VP)A*4XHpmIk6@ZD z1J-c?e81eFFu)j-B|*nX4Khe{Z01%U)MH21mvr;P9A&$lPJvTS4K#{6@^Uru)OdIh z_qKOI|IgQfbJ`)slC_RO^wufi5v3X;dpPG70tBmoWxWw{bD8}f0WRiIywiXAM&12i zyD^M*5*Rb|A!D7O>jgGS6j5N)0X^o~Q1pGdRFwS|76pn;?!_2uov3!=6S^8ooDpQ5 z!Q&(lQJ~=3%B(s7_-JXsirjouJ!|g5b2}P&8{3HlM-n(RjpFpbQY9LsCAt+>?$>eK z%iD`>w{rKyPi(%+H0^7QVbsM4jwxh};mrG5rqggDBnN<$sB0Uu@*n}Of2WuxD|*9U z^=!N=uH4fYBg+JmMomF6HSvb&EFt+c5pfNWeav=PdB6@)$0j(j0%w2c!=mCp)ll0u z-65TAZn(zZAP6@&W(eQR00000NkvXXu0mjf=R=Dz literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.scale-150.png b/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.scale-150.png new file mode 100644 index 0000000000000000000000000000000000000000..f0293ed8147c619a36415f1b742076b02a69378e GIT binary patch literal 2515 zcmV;^2`u)BP)pOg-Jv~RCt{2nrmU_UP-%mC5$9@Qp!x5OgbH=-%2PY!3ooW zFM+00+R1~bjf4ph2(R!6A-o}lG-*Nzgpgo7*w}`~ebb3yQW(a>*knkc;ZtW4Cet)P zQcHeG`;vBh?(RyK<+ZS_UCWu#e_$kbwYz73{O`HvKHR7%UG72$Fj`auVX6qiR1t)! zA_!AO5T=SCOpQ7ai>^rf+{8UYj>(qiHS<%=IEERFT)f+-^ho>bANHOc&T~f=lP=oL`AFc3cS#IF(M;PRaL~$qgEJ9(Nh>>a1Rn9(xH4I zP!$|RMVs)lx0GxUqY8yUoq%&OKq)6s2<_5abq|qMcEnLo5Q|!ceS9g|WI#yj%^{~U zAw;CN0m4eVVksDiaGUTFS4uXE9YcV?m=L1UJ0~9`&)6AHK|q9Bg*~K{Y|$Yk2M>XK zhecvUItCDy*&Wk}g9x=syWoYkQV6OA1T8y1q?|w@bSPD|50a;yh-*YagxjPY&_!+^ zsuOewQKh9w)DP*ye@r?+GP@DK7 z339uo&P2)yI9Cs8IDr8taI|-*h2{`)I!4Dqgj&TH_#n5JLQs>5oXtVc4;c`|s8k0K zDx8jy%25#EHt~59;C?H0CHo}C0o`CiAchkf0K!5ip3B+`~eca^Id;c17}*LU+$yi({GQk39_j=|?KOdB4MC%S z3_IMu85B|nJfuQx^IfB*c5tagkBeL#X>7toKVPiLZ6k+*R& z(>0VUQyLbC^2@>!&QFdig6;&B85{&mA;6%kDSnfkUGo%^u)KGhSoOsX_2>8Tig{&! zWws-|4s$)ih}Tu(k)@4rsD3!_G-MEq+Qe0ypF60;3@0#jjxmSyiZRt3y5w`Wzy4zO z*{3EbR=+L3BG!^pZlTf*6Jg8Kl z89&yW13-{FfnF0WKF}y&e?1Ep2O< zO7;%@RD=_e)mythgdp z1B42pU5B6!5(0+ejSkLsoGQx?0@bi`L~WVxX!(aROoHCG6mUrYWN8#jMsrXu#1zkC zf1JTsLZCSTAcTZ=IpqZ0=Qi12O(*COqVg_)uzNV~kgZ|&8nqAmjx216VLsqJM3?9? zVbJCPZ5>Hn^2Nx1*~iYzW<;xd0EBlTfi8|y2#^8?azgJhD9CAZ00?44-gByq+d16$ zvz1pJak9*JxV%MRxBxAvG`*mr@$;pGLTFA#BEL8@d%R$E?ZmV3qjxxN$+(CN-cgZ? z28Ljy8xumngQN&ejNJBoV$W9Im1S)ie`vvF5u5=fHe`D;){Ug@#HDx-JFD^0@o}qb zCZ7|JxC7kMJGVt7c{Fsd59=7r{Mtv^5QM0>@6=R&Yrb)3%a*Z5-BfaLVT*`MzR$fL z|5|QyiCwcAr{5E^`t781;$eWWT15p%X| z8-1QEBL^z3NZ$ytjt}0OKCZ{=H$OcWKjaB;D=382Vy_$icF6RVRdk;h>ytR?g2`O$ zWrI3|R~n}Bo9&7>Tei+e)J);(20AzSZ2X`*z^{}60@5M$<^&hKf7FC=uQ%lkeVr3? zLAuy0{{B=Mzsb&6vo#{q`IDOB2V6mZl?lOE@kV{qfg3X!Fc`=Q796f zgbqO)#Nf;YFuFY)y4w2LXa5TSXha}TISS(b&N1h2qS$s%z_&Zu4I}Pc>z%Z!gzVtr z32Oi3Q}pHKs}tDyRn>BRW!T9WQ*solT0e7lElhndRF#u_=ZSwz9I%WMWxOWIuYjmVRnACD%Xd<{o4YluFdpqpLkYa+OF`ljgu z!h}UC=SE4WA2i&XL()5FL>_pAyIE8%a{en)kNLm6?Vo{uw8W@PjkJ%K5-N?(sgLj6o&p3iR%B%Y~!6Y1DwA0vK!D^Qt7o^3zqh|5RuH z6k;4;6oJ8R{t>l9q?=3zoD<2VQ3Zl3(NH<$2^c%}6O1|#g;EiOsUiqdMG&TnAWRiO dm@0xW^?%+OX$U3ZWQ+g+002ovPDHLkV1kmSq`UwC literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.scale-200.png b/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.scale-200.png new file mode 100644 index 0000000000000000000000000000000000000000..e54a56dbca06bcfffc2561ac551ea5dfd58afaa0 GIT binary patch literal 3239 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 OV6ZT;GOjgp$NU#Bj5MgPpB!c$GVm! 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 RfhYg~002ovPDHLkV1isQMO6R* literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.targetsize-256.png b/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.targetsize-256.png new file mode 100644 index 0000000000000000000000000000000000000000..50efc008dce6f8096c4c0394438f00c8e7154cfe GIT binary patch literal 10408 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 bno1(wj@u8DCVuFR|31B*4ek@pZJqxCDDe1x literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/StoreLogo.scale-100.png b/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/StoreLogo.scale-100.png new file mode 100644 index 0000000000000000000000000000000000000000..fcefe81ba952544e550afe6ed2b97837fb2ce465 GIT binary patch literal 2370 zcmV-I3BC4-P)pN^hrcPRCt`lntNvcTGBGCgvq_KsLOtMPJo~ z_b`Kzi8tGnap`#L!`6#N_n8YEXIgW8B)vvT*?J|25Njjxpc74-@`^A*#DUP*m(qFJ z&R{$Z=C0->?wq6{Tks5~oZ-z+^qQP$%Bi_j(|9_;Dt!1Px-ScM!q-s!j1p?YG zdS#@ks)`sr)YLc7OBiEN4+&oB)N~NkW*nr-BfM-aB|Ai)LLsOUI2{9uDM2BIrMFrh zB3m-?Gov8u28CmMDcKc)2Xjo1QUhuN$*^I zkUW!(zZn5>4GKp{DcPe#gfoXA-(ivHmCgaghHQNn9KIjN+y@W`#ZetXoen}DC!m8- z2&jn*&5KBNKK=^=;_`?u5+`?98V$vi!09?{Lu6CsS%&_E5^od9A)?tm7%BCm*3SXLnJLAj2zTV9jL zsS=7hA%bQMq0yfRgy@t1)bum<$@I$QZW)8P2E?tL!*W6%4@J|7E_u=`5lbh4_{$Ie z#y)`-%?t#!j6l})3(s;6?hQE*gP5i}=~6_x6O8hI_1|V6KYEl&JGA6$(}KWMd=s&g zH354FAU_GICr}sIA{dM0G#t`CwrkQ$rvk9{o{kWon z@m)vOj)jch=o5w@YX^i{&Q8uMg06(hWCnpL1WXz`gSXk`O;0f)!)JTMhA(cZKfjMx zqIV`+Vjk+_sOb?#yr~k4EbWB1S~CJ!=MlGXcJ8DSh$z9(HFi1#Eukj-a`({JUo7u> zYMx>UaZPL{rCg;vj*y9PlR*-QCOI@A#FZcv9FkvZE4La#7=pk9aYm(}MLw*j6F|tL z@(0?juYT3#o@co8R^<^da89mL_@AWTtR*_p41T2!OeVxyEhsP~?Q1I|N7KcV1ajda z^2XZ!fJhwHw`p#GDv`B?HYE*olE`2ujmkaR82ig6_x+L~#5J)IAgY969YW0z0>j`- zCzl7>%hN*`f>3KNx1C-4VE_}S^(_SyN-p-uU>8Xzr8l5h9{b}G#t?$m1VFfiVL7G* zp7a=F2&6;! z-h~EG9i$LY!l{&)cn>BtG@SrK^vXxt%ejM@K%@nscCp-cdTqbJa1J^kYWjdk{qv=S zLiB~b-d|i^K36chcYas!>|Ktlo#T~3I~A!YHH4N3;jkddOADLZpDDz&Ak>=6`BQ5K zL{J8%D9~+4i5W>_p{v1hc3H=xbAv|rEbJD~m>t~uyF((9EE>AkhII@r0|>z<9&0b- z_hti;5eT)GGIFxAU&O`V=UxwfEqhF&e_2PxJprT7F6b6d1H?vUM1;<%A|EXcc#Xp( zEM4LdI07Mh#g_qMPqq*lgHXFzPEJ%^lfDrGBOkn1F=yQ9Ge7MPp0YT&O%x)wS#5@Y zBQgzHMfX{;z6gsCc+t&j)~Q3h(pJXr&IKYX5Nb_}xRzAc7IpxfTUx18+h)ZOoafp$+KB{LXR4;PV2tVsDyQ8r~#14 z$|E17)17}_0SF7ycO;>vRH~dXiZE|?v#T3bxz+vcA1hG1vDCJIewV&fEcO{ zG4k=J=x%o}O(#T`O{x}I$HYf?fI-Aw12qFMHS2TnUGNjD8;|n)e$pv`GGvbi)05GU zZlZ5Gdl4oqQaLjU!}y`$i5iNZV2L`+)23DD)o@$&#%%r0$Qk0zrTmKv`oehp-*tD%3q!Ew}V2hHT4vR;T>C1 zNQxaOCaoGL{|(o}GQvgo)T=AsDMH2SCiLz`!;QaL{k|5!)R|W`NQmVtR5^L6pIkzb oHyA}=u$g~E9TDjvk>Q%?{~y$4P53g0O#lD@07*qoM6N<$f|9~XX#fBK literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/StoreLogo.scale-125.png b/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/StoreLogo.scale-125.png new file mode 100644 index 0000000000000000000000000000000000000000..4381be777f8c9cb537e8b52ad4fe785008d91772 GIT binary patch literal 3229 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 P00000NkvXXu0mjf-k~wu literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/StoreLogo.scale-150.png b/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/StoreLogo.scale-150.png new file mode 100644 index 0000000000000000000000000000000000000000..e49390bf3de46d97dad9ece51fa8ec80e869bd15 GIT binary patch literal 3739 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 literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/StoreLogo.scale-400.png b/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/StoreLogo.scale-400.png new file mode 100644 index 0000000000000000000000000000000000000000..d1472741ec5c969e0da6c2979c4b4b07ab3b0b9d GIT binary patch literal 10759 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

MY- zf+K}sCe8qU6Ujs`3ua{U0Of$R_gVQBuUA za0v=mu#vIOqiiAZOr&h*$WyOw&k-xr$;G4Ixa!#TJNr>95(h>l%)PUy4p+^SgR(uR zta%k*?ny-+nAr8spEk1fo{J4i!b^Fia`N{_F6@zidA2ZTTrjl#^5Z-2KfB@Cu}l9s z(*|Z2jc?p~vn2f)3y9i*7zJV1L{$?|&q)4oaT;uXi6>1GkRXVTOzAz(RHEmr=eFIi z`}<>-Q?K0GN8!IYxeP1XKXO+jsJbp~o^);Bc;%b7Flpe7;1`Ny@3r7ZR;?R)aJt8C ziNlEC<@3f_lIV4TwV}&e;D!Ee5_|e#g0LUh=5vmYWYm7&2h*M>QPKvGh9-)wfMMW3 z8J9b%1k7dzPzO0_NGQy92BZ^FR6R~6;^6?lqO;-QUP4BY%cG%3vEhbm#>4vIhPBh3 z-+pZGjh$x%Hp{?=FHsMp0&wNPlj00us{&`1ZOZTqs8%4X&xH=UDr*xyBW(Zp&Em94 zf)ZSfn#yg0N)>!1kWdkqJ^S*z0FF5|fj&qcE#Na|%OY0$uO>!&hP+1ywfD_WXk@4J(?MBftK7>$Nvqh@tDuarN%PrTLQ2Uzysx>UV=V zk^RrDSvdQ?0;=hY67EgII-f4`t=+i*yS=Y~!XlqIy_4x&%+OdfbKOFPXS2X5%4R{N z$SQMX^AK6(fAkw0B&dI2vf?5CQ<4X!|embv?v+0RYDZ&5du`M&xstQGqAd_&zUBEiyTa zihl?HvY)r8@aziOcKwFP!i~g3%1139K$X8HPN{z9;rX#JOY!g|1ZY# z&-Q1IBp&KIlHGb8TW3>&Q+&C>S!9LnFq$bl;^Jmnndhbk<`gEBTld&ETBll6RRMpi zFV~y}05I3c0)Oi!2tN)M1Oiy1T7a+e{(vl_F~Fr~)qK_`-1*(eO^5 zJ<##1v#iN6)^)*H@q(6>Q}k5%iM;`ViA#^(3_gLTdE@0GZqd-XO%k~Rz94v;wV0N1 zak&B4-aHZARM0N~Kjwqnc7sV2fQfQQXaT$4=|1SWfAyISL7*vfqOtcvkI;O7G&Oi; zCB#}EJ339egblN~b|LW!&u#~cnRO?S8yNvIrqqvy)ZzZyc~`3gFh1|BkGi+v%Bm=O zUUv2yNpOm=K5|t1xVyH_hi)8Gw9l+anw$iOJF_dZ;u|5!ukR@!W2g4~{)Zube2pk+ zPczX*;F7A{+rLq7C|73HL^ptmYRF#;ov_UG!$X*p<>&p+z%|k9{2E9RI?SC)@-zYI zS;0nD<&e1_xk!$epNp|kBAEx$0^J-_n5}V77baT(){LnJUta-h!uqMb({sLfr`WsD zYqpo3SGybA(#AIwY-WGUAzi9G2U)%iad;?o;UmGs6n~|0$Pk?%e6g~0vW0R*JC1dY z9VvV1OkmyJcB{9eExmSq)^yb&v*9_KO9m+hKVg!XKNFi-@8> zf|;UxvVL^*#8=NW^sv|(%HI2Qjs!8DRVcDiRzhgS7x+6%3|R-gkoVV7{kFDvr$S}f zSd{1leMSQ#JAD0G^6`hE5O1n9Q#MZt2tF^PYN?SR+;-Q7t*TBDw`#=m63(NohIhZi zxla#P;DnLIb6R_Yo2+T@jp=q#t>d@X_;yYc^p-y|=y3a3f%?ZX(WRrGcC+9+BjNiV zPKrtrniy4bl6+nhB!u7)VDO_3ZOSeB@eo7Ph4u8>E29OVss{;cr!X}1JXEg73{@x6vpMD`OLt9IPe zbw_FrgP`v*F5)|{dQpS1kUMf2)$Z1IJ75|G*F2pBCKefk^tLa*I5jggpl#8&xz+Lj zF@(ea*&BP)+$PoMvfNx|LtKq2_UhU~a04e(GLN~pJ)V{6R#Br=qQ@lb#X|GsZio5e3dZISvxRT*qg(6)&1$;kF0WR<3@T)`mM_k+-m5TT`9tM5#c(Q zMYT?9)=#?l=j8g;qPB8hpN@upks~V$U4L2FH_n8%Y|~bq?-dq+*6F%OIEV^zKBrDd zjL^Hg(`10#K{xNaSqO%_5amE8p4Hpsh-w~BtuE4Woin0m&$3-*RCx`YP}+bU{9!{F zb|GOy4-Koz>s>W%W*2%7^8fV34nV$3ZfS1v*Su1@C0@))=6H&aYHs6OX_pCLdD<7Q3R04pXe8G@HJ} z+>a{Rn(lrmWotSXXpyIUyD*Oc!RE5Q9Bqt^coHy(^-4TtjB>3inz{JF3IeiOXl5@U zT{lV|sOk{EWQW|aitw1mvBGJmitoM=wKNKR``O6=2^8=a(>iXB@($)y^4H~m${jca z1>?g>1Tdv79gq7ko*j5I)oJ>7eSp*O=(l2oHHHI+PN{QHU%*Ij+-(o?%ks*Ph>^X!ou z44Tr{K9if&=z(MR3WK)dut0@g3E!-_8QA3}%g@4RN6}2PM0iv*BkLy#8qn|OpAF7h=rp>sUJ!MrUzli*z2 zrOhC$V{5XA3Jh5y-$OsDRQ=niDSgmC=)4JE)=G%OyQfLRf`2~2ydAmjp+Ja!K*~Bhc z_v}ro^afaOE^wkKHo>apLGPXFD zCiQ6xR|3&fX^HSF92CBwbN2CpZ!lo*;~!9rW(m>1VtgaXi@SU_#ePpkQzFnZvgStCVL< z4uJOrM8;=oR|Qa`0v|jnBoi?appcyZ8M`G{@usc@WI=zYxU=)=)j3c%+zs~0s4 z^C-nIMz`vX!3f;rYI*U+oJZk@f+S|!83`E2nMUQIrHYv-lK~N*fJPrnr^nQ7Nf<@8#TiRxf^GRL*|OPqcBZpa)%Wpk#zoya*DbwR}%O9ScYc?mbf| z2t5C-2E9Kl7l5eUJv}sY@;7UvsUl!0j=~P98oZcaOKqAhIqFedZ$=_j&q=ED^O2Lf zdm2C~u1%9-rorXx^@H++{if*^k^AGA(ymO&sPy&YTLXMcN00DkDdjne`z*$&CqCfm kp;eQA-bmQhS6q*b($k;Wq6O+ND>`Mq2qp>6sNeoexeScbP ziAJ_dZuWh;S}a+@a4FOC?e+Zd{14Cb!`WWvyg#4w`JD4PpZ7^RZ$TDD9Yz5FAZ%=8 zUsV424u^d$Y7AK{h4E?pfKD(P2s?oPBa$#{mm^~lKS$3DMiegVPsCq8;!eBpN< z@(-q}A264sV~*0B2V#YYiu}UntS?LB1YUp8wR)9td6vfHr`)|iJafFS)pvLI?QET? zHWmb8?lr#?0swm%BtJkz3ji@#Bmj`m0KmWkfB*>qkPHAo3-AHh|LFyIOm=_DgabX) zt4iMWn`xx$#)i%CF7wi1!*}Kf#6GvoN>5+W9W6X3I0BJ?iCeins{!%3h#qUD%-YO{ z6SiCC-z{!)5&Es&lD1d2UjI!h_y1%`xJad@palxLyGk1f{ov;qyNWWCTCu8en@~}P z_7;~sXx$H*=KZKyTf3vYG9#^`R^y4}Kd*ir-#Xb7k1M%%7&q^z46f8XURQsdkbfLZ z#4vyoCdSMK%~CCzpUNSWS7bh>jaBu>?~v+CwY_!RyJ` zf@(orji#1pR%7;w`w)r^h>+0(&*ee=tKxC*j$QcAIO|$o|7snWmt^84tRdPbCKHu| z!GcKsT?=J!UpXGkG|h$NK~|nC*V8z*_oq++TulhneEL4L&IWM$=mE_|+`Omyo!Q{7 z(%J7H^dOVl7KadQh(vT9BV0WC6jV-Xd+dGu3i}mohZG}bECb_SsXv@vtu2M1F?%T| z^`L=Yk^F8x+rd>d=-yymLrF+}+v=Fv4XtCy#7b4LijAEz8w#r|U!Vp+(qD$__?P%d z#FHs6ZI0Hejp#w&ZC2DSPnsD(0}`+pdN5w|Z}*DVrXAFV1)_$;={!364Xk=zNPw?a z4%gKvA&wXpLu5n!zsRtr+TCM#BsBU+9t~abvFU7CmtS(*d*yzWh~}!*bBWi;0yc4}X*X&7tCopd69<%q zD6tBaGEtVwO1Zub}+Lp0i<$>JjeV`kfvr$YYA9J-65ok!BvlBJcE(EA1W?woo= zqk2qtb0!Ry>DbUv@4t7r;JLJin0NF6p82#pO5;Abw|?;Q~M)a%-ux3fp{$Tkm2mzZlW7Uys7Dmmr!fK zDGJZ~>vn?O7=3N7_0On)wVcg^JrX^;fc ze%7qmr}$h1!~n+iQ*(4L{PEm+%{P1{V&Pzu%ViEq4rxCNc`R}p96R><4r{*fdU>?t zGYR@4?zT4mCieYZc7eYy7l(}Yz#vq}5Sk#sw>0svZ$e#(f6mC-?^jN*m7E$BOXkS_DH@$00rG*F2icJk3WBMaOp&eD#|u&CDw7pfAAdc zpPfM6=x?lz(KB942JII;)h&*?k^L6vT zof@0<%wiGay{G{uyS&5IT)}naH`OdNee7V&A^6x%k!A0TO%x7X-@o+kChi~JkxS4? zskrY-ZUc3q4GQ2#EGXmLo{w~1%8g+>5V|ca}U4 zm1ZbrP6czlN!d@;AE+pSJL?fU4wju*a|rDPW7WAAx6@MfYSeV*N4FLK^@c<5ZP866 z1*(Rq-Ldf5ouA89YKot@uW^|C>u@DHj+#$$=zNvW^_2w^5sVn4^b@%wlrF7(aT%Rf zlJ&iq$TC{mT})X0nM^axVg_SMoOH3e@O-6A<&Zgqnu(ZU?)Y>*6Bb3V`C%K)qnya^ zt!Io}=gh=BZ_Z73z&@uMLyHn`Omj@4981bLH6u$G>qVG33N-&ed?#yJ3A3vmv!L_O z0MXz|ZF5o=rdnGgziSp}ebY%IU7I&(H}_E*bsIS86`#Sd8oqY|jo1{0BlT?EX+q1? zlIC9c%ES$+TzcBBNijxXF{AxgCWnGynrwvcOWA;eA#Jx9dpTs{Q%A@m$CO&$TpJ-SiBEU}fvTeQh=L8;n z5ZTf=={;hB5Ax>zMc-KTOK^?;Hbv8w0}~0182js=M>gv(J%v5p#W%HK(_DA=+9)YFlro zjn`JQN#nD1ICVTZVDz-C43Bz}r+`XSX2iT)+n!Y07c6$yKvwH{LAX^(M?n#7EnmXb zMu8wJ?@V?>yBIzFg~Qxn;Ppi7#HBFHP_(c?UzfDGqLD^?WN zVTW-$>d8j7*XN9h#e|YFRn)iivu`$w{8cE#A`yYj%IFy$Ghi;2oSE5j-7GU14|<4C zi9YoG%enwR?WV3JA7ZO`w&`v2RWqA>SybZh@V-9j{@}cb9=)&|y(78j8o6iixWaBX z&(dW{OL3@NWaYwGaU#FmEtm{sK4|cpLOr6=-?;C&_^`zAFMC~srQ?*G2Xyr`p@pzi^jP9XoQ`~0j_Fc= zzimVC@T?wpoz}T$@u!~TarndZl($)X6a^Ar)Cd)1SsX7<_ PT>!@CEDWmjsEmID&pRVU literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/WideTile.scale-150.png b/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/WideTile.scale-150.png new file mode 100644 index 0000000000000000000000000000000000000000..d4b275a5731f374ce9ffe8b03dbf157b2a9b473a GIT binary patch literal 5001 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 literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/WideTile.scale-200.png b/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/WideTile.scale-200.png new file mode 100644 index 0000000000000000000000000000000000000000..6012579815fa4a18c7d12e900b629c6fde5c8d8b GIT binary patch literal 6866 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 UwD|=1lM1Bs$WW{7Puqz91ABlFQUCw| literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/WideTile.scale-400.png b/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/WideTile.scale-400.png new file mode 100644 index 0000000000000000000000000000000000000000..73d2461cecfef8227108b9a6b3bc0ad6c736d4e8 GIT binary patch literal 15332 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 literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Windows_TemporaryKey.pfx b/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Windows_TemporaryKey.pfx new file mode 100644 index 0000000000000000000000000000000000000000..1cad9993d6abdb0e1bc1456b2470dd386f8f3ef2 GIT binary patch literal 2560 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 literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/resources.pri b/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/resources.pri new file mode 100644 index 0000000000000000000000000000000000000000..7de03c9dc31868ee4734e9e92536aad0bfc0573f GIT binary patch literal 5952 zcmcgwO>7%Q6n@^d9XmhGPg7BfAWPILB{YfSI3*MbxmBrph)}^rMQV_>*qg+{PF&lS zEDoGGaDZEHaNxkP2Tq)NLL4}9KnO)WaOjB>NL7VYzBhlnUVGOeO_|mB&Aj)`dpmF5 zycut!)hIVxwLDRRiZ2j3MD&eCG)qsPqDi+K093uoUb(inz5fxjOxXZV$f2O>wJToN zm$PgaNFm>CS9ZOI3%R2QvyGyyoj@R&q)AbBdE}`GA zU*63UU5}AJ7>$=_#^dETCW!9E=znw~etd3)$3W1-rp zNz@c-8k`L3DC#)s3GgOSr_i1OJ&8Jts!M`?qQB6!K=ZI~gWds6f<8hlr$GNiKTQ`B zj2oe<7@9$!Iqww6WZ1C-FOq`Ez?jv`+{4 zuLj!Z0`2pG_UmY~w=B#qi5aD#CxeLG!dO=(_0V6~AEQ7a{$C-lZF~Ntfv+y+c>Q;ZZDELyM?D8-iEB@4=J5 z590C?=Oiwc$Zs4K920~!XCAMqKWm=h80Ip8Sxo{lji^A_io$l{@>`LWq9iaA_Vw+m zw_V=da~ob8SCY~-`q7^)EV#ay8Lf4?@GFnUMZ(!b6 z(OQF)>k{M_@mv!;_Q?jYSKy-!dIS75NLHZ#xODNGuc9Iaz+3X&L8u4^X7$9ROTkUS zdJ3tUpK-ibI_JR433>(m)436N-NJ6&qzR`9tVMHZ&p4kUewbeZ|0~3lMK7a0<$Nu6 z>^$11ocoA5iyX91IzM8qH2ycN8uM>~{|GiMdJ*k$=O3)3O$*SUaTf4qHeC?ZMEPurclZp&L;&vjA#L4qq@!sqqay@i{=+G_78<{3-y z7Z=_?MeGrAKNxWS^VzS9Y>vS939(N&W9Y*1$Au}c4O7N5 zDNZBw6Nqg|C7w?w*_U`ev1DK3IqtY`D;(#1?pq4S^N@0hODdeLaJItP3P*@$#uJ}> zf{rVS(@^xs6rEOdN>QAeLXLAwP@JTod?qkWDZ5E!H>vFME|GGHODkMT;rR5Ca*dOI z<C0KZPJhM_Wf%mD`F>kH)og9!LM zc-;xTxzQ8K6-JFXpW?nF98;bsgw`XRZ~Nr^zBUlE9udAaz*t`!l<|>&7D+D}M8Ma9 z@GxQ#w!`u*f2+`iL%S$CmwM;oUu@laXM4ZZSh~9hM|8Yuxx@GAPP_Ig&aR6xnL{f>jA?@vwNiZuH~P3zDKfK*!T~2_5XTa6kcEcx Date: Wed, 2 Jun 2021 20:34:03 +0530 Subject: [PATCH 063/118] [flutter_template_images] Fix maskable icons (#363) --- packages/flutter_template_images/CHANGELOG.md | 5 +++++ packages/flutter_template_images/pubspec.yaml | 2 +- .../app/web/icons/Icon-maskable-192.png | Bin 0 -> 5594 bytes .../web/icons/Icon-maskable-192.png.copy.tmpl | Bin 3822 -> 0 bytes .../app/web/icons/Icon-maskable-512.png | Bin 0 -> 20998 bytes .../web/icons/Icon-maskable-512.png.copy.tmpl | Bin 15074 -> 0 bytes 6 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 packages/flutter_template_images/templates/app/web/icons/Icon-maskable-192.png delete mode 100644 packages/flutter_template_images/templates/app/web/icons/Icon-maskable-192.png.copy.tmpl create mode 100644 packages/flutter_template_images/templates/app/web/icons/Icon-maskable-512.png delete mode 100644 packages/flutter_template_images/templates/app/web/icons/Icon-maskable-512.png.copy.tmpl diff --git a/packages/flutter_template_images/CHANGELOG.md b/packages/flutter_template_images/CHANGELOG.md index 7e6b5f3..941ddba 100644 --- a/packages/flutter_template_images/CHANGELOG.md +++ b/packages/flutter_template_images/CHANGELOG.md @@ -1,3 +1,8 @@ +## 3.0.1 + +* Fix maskable icon file names +* Fix maskable icon image dimensions + ## 3.0.0 * Reverts to the 1.0 layout, since the new app template never landed. diff --git a/packages/flutter_template_images/pubspec.yaml b/packages/flutter_template_images/pubspec.yaml index bef6096..275c003 100644 --- a/packages/flutter_template_images/pubspec.yaml +++ b/packages/flutter_template_images/pubspec.yaml @@ -1,6 +1,6 @@ name: flutter_template_images description: Image files for use in flutter_tools templates. -version: 3.0.0 +version: 3.0.1 homepage: https://github.com/flutter/packages/tree/master/packages/flutter_template_images environment: diff --git a/packages/flutter_template_images/templates/app/web/icons/Icon-maskable-192.png b/packages/flutter_template_images/templates/app/web/icons/Icon-maskable-192.png new file mode 100644 index 0000000000000000000000000000000000000000..eb9b4d76e525556d5d89141648c724331630325d GIT binary patch literal 5594 zcmdT|`#%%j|KDb2V@0DPm$^(Lx5}lO%Yv(=e*7hl@QqKS50#~#^IQPxBmuh|i9sXnt4ch@VT0F7% zMtrs@KWIOo+QV@lSs66A>2pz6-`9Jk=0vv&u?)^F@HZ)-6HT=B7LF;rdj zskUyBfbojcX#CS>WrIWo9D=DIwcXM8=I5D{SGf$~=gh-$LwY?*)cD%38%sCc?5OsX z-XfkyL-1`VavZ?>(pI-xp-kYq=1hsnyP^TLb%0vKRSo^~r{x?ISLY1i7KjSp z*0h&jG(Rkkq2+G_6eS>n&6>&Xk+ngOMcYrk<8KrukQHzfx675^^s$~<@d$9X{VBbg z2Fd4Z%g`!-P}d#`?B4#S-9x*eNlOVRnDrn#jY@~$jfQ-~3Od;A;x-BI1BEDdvr`pI z#D)d)!2_`GiZOUu1crb!hqH=ezs0qk<_xDm_Kkw?r*?0C3|Io6>$!kyDl;eH=aqg$B zsH_|ZD?jP2dc=)|L>DZmGyYKa06~5?C2Lc0#D%62p(YS;%_DRCB1k(+eLGXVMe+=4 zkKiJ%!N6^mxqM=wq`0+yoE#VHF%R<{mMamR9o_1JH8jfnJ?NPLs$9U!9!dq8 z0B{dI2!M|sYGH&9TAY34OlpIsQ4i5bnbG>?cWwat1I13|r|_inLE?FS@Hxdxn_YZN z3jfUO*X9Q@?HZ>Q{W0z60!bbGh557XIKu1?)u|cf%go`pwo}CD=0tau-}t@R2OrSH zQzZr%JfYa`>2!g??76=GJ$%ECbQh7Q2wLRp9QoyiRHP7VE^>JHm>9EqR3<$Y=Z1K^SHuwxCy-5@z3 zVM{XNNm}yM*pRdLKp??+_2&!bp#`=(Lh1vR{~j%n;cJv~9lXeMv)@}Odta)RnK|6* zC+IVSWumLo%{6bLDpn)Gz>6r&;Qs0^+Sz_yx_KNz9Dlt^ax`4>;EWrIT#(lJ_40<= z750fHZ7hI{}%%5`;lwkI4<_FJw@!U^vW;igL0k+mK)-j zYuCK#mCDK3F|SC}tC2>m$ZCqNB7ac-0UFBJ|8RxmG@4a4qdjvMzzS&h9pQmu^x&*= zGvapd1#K%Da&)8f?<9WN`2H^qpd@{7In6DNM&916TRqtF4;3`R|Nhwbw=(4|^Io@T zIjoR?tB8d*sO>PX4vaIHF|W;WVl6L1JvSmStgnRQq zTX4(>1f^5QOAH{=18Q2Vc1JI{V=yOr7yZJf4Vpfo zeHXdhBe{PyY;)yF;=ycMW@Kb>t;yE>;f79~AlJ8k`xWucCxJfsXf2P72bAavWL1G#W z;o%kdH(mYCM{$~yw4({KatNGim49O2HY6O07$B`*K7}MvgI=4x=SKdKVb8C$eJseA$tmSFOztFd*3W`J`yIB_~}k%Sd_bPBK8LxH)?8#jM{^%J_0|L z!gFI|68)G}ex5`Xh{5pB%GtlJ{Z5em*e0sH+sU1UVl7<5%Bq+YrHWL7?X?3LBi1R@_)F-_OqI1Zv`L zb6^Lq#H^2@d_(Z4E6xA9Z4o3kvf78ZDz!5W1#Mp|E;rvJz&4qj2pXVxKB8Vg0}ek%4erou@QM&2t7Cn5GwYqy%{>jI z)4;3SAgqVi#b{kqX#$Mt6L8NhZYgonb7>+r#BHje)bvaZ2c0nAvrN3gez+dNXaV;A zmyR0z@9h4@6~rJik-=2M-T+d`t&@YWhsoP_XP-NsVO}wmo!nR~QVWU?nVlQjNfgcTzE-PkfIX5G z1?&MwaeuzhF=u)X%Vpg_e@>d2yZwxl6-r3OMqDn8_6m^4z3zG##cK0Fsgq8fcvmhu z{73jseR%X%$85H^jRAcrhd&k!i^xL9FrS7qw2$&gwAS8AfAk#g_E_tP;x66fS`Mn@SNVrcn_N;EQm z`Mt3Z%rw%hDqTH-s~6SrIL$hIPKL5^7ejkLTBr46;pHTQDdoErS(B>``t;+1+M zvU&Se9@T_BeK;A^p|n^krIR+6rH~BjvRIugf`&EuX9u69`9C?9ANVL8l(rY6#mu^i z=*5Q)-%o*tWl`#b8p*ZH0I}hn#gV%|jt6V_JanDGuekR*-wF`u;amTCpGG|1;4A5$ zYbHF{?G1vv5;8Ph5%kEW)t|am2_4ik!`7q{ymfHoe^Z99c|$;FAL+NbxE-_zheYbV z3hb0`uZGTsgA5TG(X|GVDSJyJxsyR7V5PS_WSnYgwc_D60m7u*x4b2D79r5UgtL18 zcCHWk+K6N1Pg2c;0#r-)XpwGX?|Iv)^CLWqwF=a}fXUSM?n6E;cCeW5ER^om#{)Jr zJR81pkK?VoFm@N-s%hd7@hBS0xuCD0-UDVLDDkl7Ck=BAj*^ps`393}AJ+Ruq@fl9 z%R(&?5Nc3lnEKGaYMLmRzKXow1+Gh|O-LG7XiNxkG^uyv zpAtLINwMK}IWK65hOw&O>~EJ}x@lDBtB`yKeV1%GtY4PzT%@~wa1VgZn7QRwc7C)_ zpEF~upeDRg_<#w=dLQ)E?AzXUQpbKXYxkp>;c@aOr6A|dHA?KaZkL0svwB^U#zmx0 zzW4^&G!w7YeRxt<9;d@8H=u(j{6+Uj5AuTluvZZD4b+#+6Rp?(yJ`BC9EW9!b&KdPvzJYe5l7 zMJ9aC@S;sA0{F0XyVY{}FzW0Vh)0mPf_BX82E+CD&)wf2!x@{RO~XBYu80TONl3e+ zA7W$ra6LcDW_j4s-`3tI^VhG*sa5lLc+V6ONf=hO@q4|p`CinYqk1Ko*MbZ6_M05k zSwSwkvu;`|I*_Vl=zPd|dVD0lh&Ha)CSJJvV{AEdF{^Kn_Yfsd!{Pc1GNgw}(^~%)jk5~0L~ms|Rez1fiK~s5t(p1ci5Gq$JC#^JrXf?8 z-Y-Zi_Hvi>oBzV8DSRG!7dm|%IlZg3^0{5~;>)8-+Nk&EhAd(}s^7%MuU}lphNW9Q zT)DPo(ob{tB7_?u;4-qGDo!sh&7gHaJfkh43QwL|bbFVi@+oy;i;M zM&CP^v~lx1U`pi9PmSr&Mc<%HAq0DGH?Ft95)WY`P?~7O z`O^Nr{Py9M#Ls4Y7OM?e%Y*Mvrme%=DwQaye^Qut_1pOMrg^!5u(f9p(D%MR%1K>% zRGw%=dYvw@)o}Fw@tOtPjz`45mfpn;OT&V(;z75J*<$52{sB65$gDjwX3Xa!x_wE- z!#RpwHM#WrO*|~f7z}(}o7US(+0FYLM}6de>gQdtPazXz?OcNv4R^oYLJ_BQOd_l172oSK$6!1r@g+B@0ofJ4*{>_AIxfe-#xp>(1 z@Y3Nfd>fmqvjL;?+DmZk*KsfXJf<%~(gcLwEez%>1c6XSboURUh&k=B)MS>6kw9bY z{7vdev7;A}5fy*ZE23DS{J?8at~xwVk`pEwP5^k?XMQ7u64;KmFJ#POzdG#np~F&H ze-BUh@g54)dsS%nkBb}+GuUEKU~pHcYIg4vSo$J(J|U36bs0Use+3A&IMcR%6@jv$ z=+QI+@wW@?iu}Hpyzlvj-EYeop{f65GX0O%>w#0t|V z1-svWk`hU~m`|O$kw5?Yn5UhI%9P-<45A(v0ld1n+%Ziq&TVpBcV9n}L9Tus-TI)f zd_(g+nYCDR@+wYNQm1GwxhUN4tGMLCzDzPqY$~`l<47{+l<{FZ$L6(>J)|}!bi<)| zE35dl{a2)&leQ@LlDxLQOfUDS`;+ZQ4ozrleQwaR-K|@9T{#hB5Z^t#8 zC-d_G;B4;F#8A2EBL58s$zF-=SCr`P#z zNCTnHF&|X@q>SkAoYu>&s9v@zCpv9lLSH-UZzfhJh`EZA{X#%nqw@@aW^vPcfQrlPs(qQxmC|4tp^&sHy!H!2FH5eC{M@g;ElWNzlb-+ zxpfc0m4<}L){4|RZ>KReag2j%Ot_UKkgpJN!7Y_y3;Ssz{9 z!K3isRtaFtQII5^6}cm9RZd5nTp9psk&u1C(BY`(_tolBwzV_@0F*m%3G%Y?2utyS zY`xM0iDRT)yTyYukFeGQ&W@ReM+ADG1xu@ruq&^GK35`+2r}b^V!m1(VgH|QhIPDE X>c!)3PgKfL&lX^$Z>Cpu&6)6jvi^Z! literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/app/web/icons/Icon-maskable-192.png.copy.tmpl b/packages/flutter_template_images/templates/app/web/icons/Icon-maskable-192.png.copy.tmpl deleted file mode 100644 index c9236db8fa69008a23a3775e84f3a834a709d215..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3822 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 AbpQYW diff --git a/packages/flutter_template_images/templates/app/web/icons/Icon-maskable-512.png b/packages/flutter_template_images/templates/app/web/icons/Icon-maskable-512.png new file mode 100644 index 0000000000000000000000000000000000000000..d69c56691fbdb0b7efa65097c7cc1edac12a6d3e GIT binary patch literal 20998 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 MPgg&ebxsLQ025IeI{*Lx literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/app/web/icons/Icon-maskable-512.png.copy.tmpl b/packages/flutter_template_images/templates/app/web/icons/Icon-maskable-512.png.copy.tmpl deleted file mode 100644 index 4068c4e81e4a9f554b130c8c226df331087d9636..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15074 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%0A+wg>D?6x$+H15ns>`Rjbu^ncmr`?lqmL%*N) vcPIZI+kh?KAq~S{=659jp1}Ug+sttd{zDh>+{|KQ9Q;|k%H0J@^5g#p9_a Date: Wed, 2 Jun 2021 14:04:05 -0700 Subject: [PATCH 064/118] Enable pubspec checks (#367) --- packages/flutter_template_images/pubspec.yaml | 3 ++- packages/multicast_dns/pubspec.yaml | 9 +++++---- packages/multicast_dns/test/decode_test.dart | 2 +- packages/multicast_dns/test/lookup_resolver_test.dart | 2 +- .../multicast_dns/test/resource_record_cache_test.dart | 4 ++-- 5 files changed, 11 insertions(+), 9 deletions(-) diff --git a/packages/flutter_template_images/pubspec.yaml b/packages/flutter_template_images/pubspec.yaml index 275c003..13c235c 100644 --- a/packages/flutter_template_images/pubspec.yaml +++ b/packages/flutter_template_images/pubspec.yaml @@ -1,7 +1,8 @@ name: flutter_template_images description: Image files for use in flutter_tools templates. +repository: https://github.com/flutter/packages/tree/master/packages/flutter_template_images +issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+flutter_template_images%22 version: 3.0.1 -homepage: https://github.com/flutter/packages/tree/master/packages/flutter_template_images environment: sdk: ">=2.1.0 <3.0.0" diff --git a/packages/multicast_dns/pubspec.yaml b/packages/multicast_dns/pubspec.yaml index c7c1a7b..285277e 100644 --- a/packages/multicast_dns/pubspec.yaml +++ b/packages/multicast_dns/pubspec.yaml @@ -1,13 +1,14 @@ name: multicast_dns description: Dart package for mDNS queries (e.g. Bonjour, Avahi). -homepage: https://github.com/flutter/packages/tree/master/packages/multicast_dns +repository: https://github.com/flutter/packages/tree/master/packages/multicast_dns +issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+multicast_dns%22 version: 0.3.0 +environment: + sdk: ">=2.12.0 <3.0.0" + dependencies: meta: ^1.3.0 dev_dependencies: test: "^1.16.5" - -environment: - sdk: ">=2.12.0 <3.0.0" diff --git a/packages/multicast_dns/test/decode_test.dart b/packages/multicast_dns/test/decode_test.dart index ad2b585..c828dae 100644 --- a/packages/multicast_dns/test/decode_test.dart +++ b/packages/multicast_dns/test/decode_test.dart @@ -4,9 +4,9 @@ import 'dart:io'; -import 'package:test/test.dart'; import 'package:multicast_dns/src/packet.dart'; import 'package:multicast_dns/src/resource_record.dart'; +import 'package:test/test.dart'; const int _kSrvHeaderSize = 6; diff --git a/packages/multicast_dns/test/lookup_resolver_test.dart b/packages/multicast_dns/test/lookup_resolver_test.dart index e468f64..db3e3a3 100644 --- a/packages/multicast_dns/test/lookup_resolver_test.dart +++ b/packages/multicast_dns/test/lookup_resolver_test.dart @@ -4,9 +4,9 @@ import 'dart:io'; -import 'package:test/test.dart'; import 'package:multicast_dns/src/lookup_resolver.dart'; import 'package:multicast_dns/src/resource_record.dart'; +import 'package:test/test.dart'; void main() { testTimeout(); diff --git a/packages/multicast_dns/test/resource_record_cache_test.dart b/packages/multicast_dns/test/resource_record_cache_test.dart index 644beef..21aed34 100644 --- a/packages/multicast_dns/test/resource_record_cache_test.dart +++ b/packages/multicast_dns/test/resource_record_cache_test.dart @@ -8,10 +8,10 @@ import 'dart:io'; -import 'package:test/test.dart'; -import 'package:multicast_dns/src/resource_record.dart'; import 'package:multicast_dns/src/native_protocol_client.dart' show ResourceRecordCache; +import 'package:multicast_dns/src/resource_record.dart'; +import 'package:test/test.dart'; void main() { testOverwrite(); From aa56d3807ec342203b7bf6ad09ddfca98610f926 Mon Sep 17 00:00:00 2001 From: Filip Hracek Date: Mon, 28 Jun 2021 11:55:54 -0700 Subject: [PATCH 065/118] [flutter_template_images] Support the new skeleton app template (#366) This is the flutter_template_images part of https://github.com/flutter/flutter/pull/83530. It puts files that are used to build new Flutter apps into paths expected by the new mechanism (which supports more than one type of app template). --- packages/flutter_template_images/CHANGELOG.md | 7 +++++++ packages/flutter_template_images/pubspec.yaml | 2 +- .../web/icons/Icon-maskable-192.png | Bin .../web/icons/Icon-maskable-512.png | Bin .../windows.tmpl/runner/resources/app_icon.ico | Bin .../runner_uwp/Assets/LargeTile.scale-100.png | Bin .../runner_uwp/Assets/LargeTile.scale-125.png | Bin .../runner_uwp/Assets/LargeTile.scale-150.png | Bin .../runner_uwp/Assets/LargeTile.scale-200.png | Bin .../runner_uwp/Assets/LargeTile.scale-400.png | Bin .../Assets/LockScreenLogo.scale-200.png | Bin .../runner_uwp/Assets/SmallTile.scale-100.png | Bin .../runner_uwp/Assets/SmallTile.scale-125.png | Bin .../runner_uwp/Assets/SmallTile.scale-150.png | Bin .../runner_uwp/Assets/SmallTile.scale-200.png | Bin .../runner_uwp/Assets/SmallTile.scale-400.png | Bin .../runner_uwp/Assets/SplashScreen.scale-100.png | Bin .../runner_uwp/Assets/SplashScreen.scale-125.png | Bin .../runner_uwp/Assets/SplashScreen.scale-150.png | Bin .../runner_uwp/Assets/SplashScreen.scale-200.png | Bin .../runner_uwp/Assets/SplashScreen.scale-400.png | Bin .../Assets/Square150x150Logo.scale-100.png | Bin .../Assets/Square150x150Logo.scale-125.png | Bin .../Assets/Square150x150Logo.scale-150.png | Bin .../Assets/Square150x150Logo.scale-200.png | Bin .../Assets/Square150x150Logo.scale-400.png | Bin ...re44x44Logo.altform-unplated_targetsize-16.png | Bin ...e44x44Logo.altform-unplated_targetsize-256.png | Bin ...re44x44Logo.altform-unplated_targetsize-32.png | Bin ...re44x44Logo.altform-unplated_targetsize-48.png | Bin .../Assets/Square44x44Logo.scale-100.png | Bin .../Assets/Square44x44Logo.scale-125.png | Bin .../Assets/Square44x44Logo.scale-150.png | Bin .../Assets/Square44x44Logo.scale-200.png | Bin .../Assets/Square44x44Logo.scale-400.png | Bin .../Assets/Square44x44Logo.targetsize-16.png | Bin .../Assets/Square44x44Logo.targetsize-24.png | Bin ...re44x44Logo.targetsize-24_altform-unplated.png | Bin .../Assets/Square44x44Logo.targetsize-256.png | Bin .../Assets/Square44x44Logo.targetsize-32.png | Bin .../Assets/Square44x44Logo.targetsize-48.png | Bin .../winuwp.tmpl/runner_uwp/Assets/StoreLogo.png | Bin .../runner_uwp/Assets/StoreLogo.scale-100.png | Bin .../runner_uwp/Assets/StoreLogo.scale-125.png | Bin .../runner_uwp/Assets/StoreLogo.scale-150.png | Bin .../runner_uwp/Assets/StoreLogo.scale-200.png | Bin .../runner_uwp/Assets/StoreLogo.scale-400.png | Bin .../Assets/Wide310x150Logo.scale-200.png | Bin .../runner_uwp/Assets/WideTile.scale-100.png | Bin .../runner_uwp/Assets/WideTile.scale-125.png | Bin .../runner_uwp/Assets/WideTile.scale-150.png | Bin .../runner_uwp/Assets/WideTile.scale-200.png | Bin .../runner_uwp/Assets/WideTile.scale-400.png | Bin .../runner_uwp/Windows_TemporaryKey.pfx | Bin .../winuwp.tmpl/runner_uwp/resources.pri | Bin .../skeleton/assets/images/2.0x/flutter_logo.png | Bin 0 -> 619 bytes .../skeleton/assets/images/3.0x/flutter_logo.png | Bin 0 -> 810 bytes .../skeleton/assets/images/flutter_logo.png | Bin 0 -> 419 bytes 58 files changed, 8 insertions(+), 1 deletion(-) rename packages/flutter_template_images/templates/{app => app_shared}/web/icons/Icon-maskable-192.png (100%) rename packages/flutter_template_images/templates/{app => app_shared}/web/icons/Icon-maskable-512.png (100%) rename packages/flutter_template_images/templates/{app => app_shared}/windows.tmpl/runner/resources/app_icon.ico (100%) rename packages/flutter_template_images/templates/{app => app_shared}/winuwp.tmpl/runner_uwp/Assets/LargeTile.scale-100.png (100%) rename packages/flutter_template_images/templates/{app => app_shared}/winuwp.tmpl/runner_uwp/Assets/LargeTile.scale-125.png (100%) rename packages/flutter_template_images/templates/{app => app_shared}/winuwp.tmpl/runner_uwp/Assets/LargeTile.scale-150.png (100%) rename packages/flutter_template_images/templates/{app => app_shared}/winuwp.tmpl/runner_uwp/Assets/LargeTile.scale-200.png (100%) rename packages/flutter_template_images/templates/{app => app_shared}/winuwp.tmpl/runner_uwp/Assets/LargeTile.scale-400.png (100%) rename packages/flutter_template_images/templates/{app => app_shared}/winuwp.tmpl/runner_uwp/Assets/LockScreenLogo.scale-200.png (100%) rename packages/flutter_template_images/templates/{app => app_shared}/winuwp.tmpl/runner_uwp/Assets/SmallTile.scale-100.png (100%) rename packages/flutter_template_images/templates/{app => app_shared}/winuwp.tmpl/runner_uwp/Assets/SmallTile.scale-125.png (100%) rename packages/flutter_template_images/templates/{app => app_shared}/winuwp.tmpl/runner_uwp/Assets/SmallTile.scale-150.png (100%) rename packages/flutter_template_images/templates/{app => app_shared}/winuwp.tmpl/runner_uwp/Assets/SmallTile.scale-200.png (100%) rename packages/flutter_template_images/templates/{app => app_shared}/winuwp.tmpl/runner_uwp/Assets/SmallTile.scale-400.png (100%) rename packages/flutter_template_images/templates/{app => app_shared}/winuwp.tmpl/runner_uwp/Assets/SplashScreen.scale-100.png (100%) rename packages/flutter_template_images/templates/{app => app_shared}/winuwp.tmpl/runner_uwp/Assets/SplashScreen.scale-125.png (100%) rename packages/flutter_template_images/templates/{app => app_shared}/winuwp.tmpl/runner_uwp/Assets/SplashScreen.scale-150.png (100%) rename packages/flutter_template_images/templates/{app => app_shared}/winuwp.tmpl/runner_uwp/Assets/SplashScreen.scale-200.png (100%) rename packages/flutter_template_images/templates/{app => app_shared}/winuwp.tmpl/runner_uwp/Assets/SplashScreen.scale-400.png (100%) rename packages/flutter_template_images/templates/{app => app_shared}/winuwp.tmpl/runner_uwp/Assets/Square150x150Logo.scale-100.png (100%) rename packages/flutter_template_images/templates/{app => app_shared}/winuwp.tmpl/runner_uwp/Assets/Square150x150Logo.scale-125.png (100%) rename packages/flutter_template_images/templates/{app => app_shared}/winuwp.tmpl/runner_uwp/Assets/Square150x150Logo.scale-150.png (100%) rename packages/flutter_template_images/templates/{app => app_shared}/winuwp.tmpl/runner_uwp/Assets/Square150x150Logo.scale-200.png (100%) rename packages/flutter_template_images/templates/{app => app_shared}/winuwp.tmpl/runner_uwp/Assets/Square150x150Logo.scale-400.png (100%) rename packages/flutter_template_images/templates/{app => app_shared}/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-16.png (100%) rename packages/flutter_template_images/templates/{app => app_shared}/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-256.png (100%) rename packages/flutter_template_images/templates/{app => app_shared}/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-32.png (100%) rename packages/flutter_template_images/templates/{app => app_shared}/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-48.png (100%) rename packages/flutter_template_images/templates/{app => app_shared}/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.scale-100.png (100%) rename packages/flutter_template_images/templates/{app => app_shared}/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.scale-125.png (100%) rename packages/flutter_template_images/templates/{app => app_shared}/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.scale-150.png (100%) rename packages/flutter_template_images/templates/{app => app_shared}/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.scale-200.png (100%) rename packages/flutter_template_images/templates/{app => app_shared}/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.scale-400.png (100%) rename packages/flutter_template_images/templates/{app => app_shared}/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.targetsize-16.png (100%) rename packages/flutter_template_images/templates/{app => app_shared}/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.targetsize-24.png (100%) rename packages/flutter_template_images/templates/{app => app_shared}/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.targetsize-24_altform-unplated.png (100%) rename packages/flutter_template_images/templates/{app => app_shared}/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.targetsize-256.png (100%) rename packages/flutter_template_images/templates/{app => app_shared}/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.targetsize-32.png (100%) rename packages/flutter_template_images/templates/{app => app_shared}/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.targetsize-48.png (100%) rename packages/flutter_template_images/templates/{app => app_shared}/winuwp.tmpl/runner_uwp/Assets/StoreLogo.png (100%) rename packages/flutter_template_images/templates/{app => app_shared}/winuwp.tmpl/runner_uwp/Assets/StoreLogo.scale-100.png (100%) rename packages/flutter_template_images/templates/{app => app_shared}/winuwp.tmpl/runner_uwp/Assets/StoreLogo.scale-125.png (100%) rename packages/flutter_template_images/templates/{app => app_shared}/winuwp.tmpl/runner_uwp/Assets/StoreLogo.scale-150.png (100%) rename packages/flutter_template_images/templates/{app => app_shared}/winuwp.tmpl/runner_uwp/Assets/StoreLogo.scale-200.png (100%) rename packages/flutter_template_images/templates/{app => app_shared}/winuwp.tmpl/runner_uwp/Assets/StoreLogo.scale-400.png (100%) rename packages/flutter_template_images/templates/{app => app_shared}/winuwp.tmpl/runner_uwp/Assets/Wide310x150Logo.scale-200.png (100%) rename packages/flutter_template_images/templates/{app => app_shared}/winuwp.tmpl/runner_uwp/Assets/WideTile.scale-100.png (100%) rename packages/flutter_template_images/templates/{app => app_shared}/winuwp.tmpl/runner_uwp/Assets/WideTile.scale-125.png (100%) rename packages/flutter_template_images/templates/{app => app_shared}/winuwp.tmpl/runner_uwp/Assets/WideTile.scale-150.png (100%) rename packages/flutter_template_images/templates/{app => app_shared}/winuwp.tmpl/runner_uwp/Assets/WideTile.scale-200.png (100%) rename packages/flutter_template_images/templates/{app => app_shared}/winuwp.tmpl/runner_uwp/Assets/WideTile.scale-400.png (100%) rename packages/flutter_template_images/templates/{app => app_shared}/winuwp.tmpl/runner_uwp/Windows_TemporaryKey.pfx (100%) rename packages/flutter_template_images/templates/{app => app_shared}/winuwp.tmpl/runner_uwp/resources.pri (100%) create mode 100644 packages/flutter_template_images/templates/skeleton/assets/images/2.0x/flutter_logo.png create mode 100644 packages/flutter_template_images/templates/skeleton/assets/images/3.0x/flutter_logo.png create mode 100644 packages/flutter_template_images/templates/skeleton/assets/images/flutter_logo.png diff --git a/packages/flutter_template_images/CHANGELOG.md b/packages/flutter_template_images/CHANGELOG.md index 941ddba..3e75207 100644 --- a/packages/flutter_template_images/CHANGELOG.md +++ b/packages/flutter_template_images/CHANGELOG.md @@ -1,3 +1,10 @@ +## 4.0.0 + +* Move assets common to all app templates to a new `app_shared` directory + (relands changes reverted in 3.0.0). +* Create `skeleton` directory and assets to support new app template + (formerly known as `list_detail_app`). + ## 3.0.1 * Fix maskable icon file names diff --git a/packages/flutter_template_images/pubspec.yaml b/packages/flutter_template_images/pubspec.yaml index 13c235c..1c224a1 100644 --- a/packages/flutter_template_images/pubspec.yaml +++ b/packages/flutter_template_images/pubspec.yaml @@ -2,7 +2,7 @@ name: flutter_template_images description: Image files for use in flutter_tools templates. repository: https://github.com/flutter/packages/tree/master/packages/flutter_template_images issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+flutter_template_images%22 -version: 3.0.1 +version: 4.0.0 environment: sdk: ">=2.1.0 <3.0.0" diff --git a/packages/flutter_template_images/templates/app/web/icons/Icon-maskable-192.png b/packages/flutter_template_images/templates/app_shared/web/icons/Icon-maskable-192.png similarity index 100% rename from packages/flutter_template_images/templates/app/web/icons/Icon-maskable-192.png rename to packages/flutter_template_images/templates/app_shared/web/icons/Icon-maskable-192.png diff --git a/packages/flutter_template_images/templates/app/web/icons/Icon-maskable-512.png b/packages/flutter_template_images/templates/app_shared/web/icons/Icon-maskable-512.png similarity index 100% rename from packages/flutter_template_images/templates/app/web/icons/Icon-maskable-512.png rename to packages/flutter_template_images/templates/app_shared/web/icons/Icon-maskable-512.png diff --git a/packages/flutter_template_images/templates/app/windows.tmpl/runner/resources/app_icon.ico b/packages/flutter_template_images/templates/app_shared/windows.tmpl/runner/resources/app_icon.ico similarity index 100% rename from packages/flutter_template_images/templates/app/windows.tmpl/runner/resources/app_icon.ico rename to packages/flutter_template_images/templates/app_shared/windows.tmpl/runner/resources/app_icon.ico diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/LargeTile.scale-100.png b/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/LargeTile.scale-100.png similarity index 100% rename from packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/LargeTile.scale-100.png rename to packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/LargeTile.scale-100.png diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/LargeTile.scale-125.png b/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/LargeTile.scale-125.png similarity index 100% rename from packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/LargeTile.scale-125.png rename to packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/LargeTile.scale-125.png diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/LargeTile.scale-150.png b/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/LargeTile.scale-150.png similarity index 100% rename from packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/LargeTile.scale-150.png rename to packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/LargeTile.scale-150.png diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/LargeTile.scale-200.png b/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/LargeTile.scale-200.png similarity index 100% rename from packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/LargeTile.scale-200.png rename to packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/LargeTile.scale-200.png diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/LargeTile.scale-400.png b/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/LargeTile.scale-400.png similarity index 100% rename from packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/LargeTile.scale-400.png rename to packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/LargeTile.scale-400.png diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/LockScreenLogo.scale-200.png b/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/LockScreenLogo.scale-200.png similarity index 100% rename from packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/LockScreenLogo.scale-200.png rename to packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/LockScreenLogo.scale-200.png diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/SmallTile.scale-100.png b/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/SmallTile.scale-100.png similarity index 100% rename from packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/SmallTile.scale-100.png rename to packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/SmallTile.scale-100.png diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/SmallTile.scale-125.png b/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/SmallTile.scale-125.png similarity index 100% rename from packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/SmallTile.scale-125.png rename to packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/SmallTile.scale-125.png diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/SmallTile.scale-150.png b/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/SmallTile.scale-150.png similarity index 100% rename from packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/SmallTile.scale-150.png rename to packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/SmallTile.scale-150.png diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/SmallTile.scale-200.png b/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/SmallTile.scale-200.png similarity index 100% rename from packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/SmallTile.scale-200.png rename to packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/SmallTile.scale-200.png diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/SmallTile.scale-400.png b/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/SmallTile.scale-400.png similarity index 100% rename from packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/SmallTile.scale-400.png rename to packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/SmallTile.scale-400.png diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/SplashScreen.scale-100.png b/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/SplashScreen.scale-100.png similarity index 100% rename from packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/SplashScreen.scale-100.png rename to packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/SplashScreen.scale-100.png diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/SplashScreen.scale-125.png b/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/SplashScreen.scale-125.png similarity index 100% rename from packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/SplashScreen.scale-125.png rename to packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/SplashScreen.scale-125.png diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/SplashScreen.scale-150.png b/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/SplashScreen.scale-150.png similarity index 100% rename from packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/SplashScreen.scale-150.png rename to packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/SplashScreen.scale-150.png diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/SplashScreen.scale-200.png b/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/SplashScreen.scale-200.png similarity index 100% rename from packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/SplashScreen.scale-200.png rename to packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/SplashScreen.scale-200.png diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/SplashScreen.scale-400.png b/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/SplashScreen.scale-400.png similarity index 100% rename from packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/SplashScreen.scale-400.png rename to packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/SplashScreen.scale-400.png diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square150x150Logo.scale-100.png b/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square150x150Logo.scale-100.png similarity index 100% rename from packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square150x150Logo.scale-100.png rename to packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square150x150Logo.scale-100.png diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square150x150Logo.scale-125.png b/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square150x150Logo.scale-125.png similarity index 100% rename from packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square150x150Logo.scale-125.png rename to packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square150x150Logo.scale-125.png diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square150x150Logo.scale-150.png b/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square150x150Logo.scale-150.png similarity index 100% rename from packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square150x150Logo.scale-150.png rename to packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square150x150Logo.scale-150.png diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square150x150Logo.scale-200.png b/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square150x150Logo.scale-200.png similarity index 100% rename from packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square150x150Logo.scale-200.png rename to packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square150x150Logo.scale-200.png diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square150x150Logo.scale-400.png b/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square150x150Logo.scale-400.png similarity index 100% rename from packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square150x150Logo.scale-400.png rename to packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square150x150Logo.scale-400.png diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-16.png b/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-16.png similarity index 100% rename from packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-16.png rename to packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-16.png diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-256.png b/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-256.png similarity index 100% rename from packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-256.png rename to packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-256.png diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-32.png b/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-32.png similarity index 100% rename from packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-32.png rename to packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-32.png diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-48.png b/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-48.png similarity index 100% rename from packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-48.png rename to packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-48.png diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.scale-100.png b/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.scale-100.png similarity index 100% rename from packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.scale-100.png rename to packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.scale-100.png diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.scale-125.png b/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.scale-125.png similarity index 100% rename from packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.scale-125.png rename to packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.scale-125.png diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.scale-150.png b/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.scale-150.png similarity index 100% rename from packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.scale-150.png rename to packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.scale-150.png diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.scale-200.png b/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.scale-200.png similarity index 100% rename from packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.scale-200.png rename to packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.scale-200.png diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.scale-400.png b/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.scale-400.png similarity index 100% rename from packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.scale-400.png rename to packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.scale-400.png diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.targetsize-16.png b/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.targetsize-16.png similarity index 100% rename from packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.targetsize-16.png rename to packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.targetsize-16.png diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.targetsize-24.png b/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.targetsize-24.png similarity index 100% rename from packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.targetsize-24.png rename to packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.targetsize-24.png diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.targetsize-24_altform-unplated.png b/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.targetsize-24_altform-unplated.png similarity index 100% rename from packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.targetsize-24_altform-unplated.png rename to packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.targetsize-24_altform-unplated.png diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.targetsize-256.png b/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.targetsize-256.png similarity index 100% rename from packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.targetsize-256.png rename to packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.targetsize-256.png diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.targetsize-32.png b/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.targetsize-32.png similarity index 100% rename from packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.targetsize-32.png rename to packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.targetsize-32.png diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.targetsize-48.png b/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.targetsize-48.png similarity index 100% rename from packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.targetsize-48.png rename to packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.targetsize-48.png diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/StoreLogo.png b/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/StoreLogo.png similarity index 100% rename from packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/StoreLogo.png rename to packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/StoreLogo.png diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/StoreLogo.scale-100.png b/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/StoreLogo.scale-100.png similarity index 100% rename from packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/StoreLogo.scale-100.png rename to packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/StoreLogo.scale-100.png diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/StoreLogo.scale-125.png b/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/StoreLogo.scale-125.png similarity index 100% rename from packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/StoreLogo.scale-125.png rename to packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/StoreLogo.scale-125.png diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/StoreLogo.scale-150.png b/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/StoreLogo.scale-150.png similarity index 100% rename from packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/StoreLogo.scale-150.png rename to packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/StoreLogo.scale-150.png diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/StoreLogo.scale-200.png b/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/StoreLogo.scale-200.png similarity index 100% rename from packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/StoreLogo.scale-200.png rename to packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/StoreLogo.scale-200.png diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/StoreLogo.scale-400.png b/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/StoreLogo.scale-400.png similarity index 100% rename from packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/StoreLogo.scale-400.png rename to packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/StoreLogo.scale-400.png diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Wide310x150Logo.scale-200.png b/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Wide310x150Logo.scale-200.png similarity index 100% rename from packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Wide310x150Logo.scale-200.png rename to packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Wide310x150Logo.scale-200.png diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/WideTile.scale-100.png b/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/WideTile.scale-100.png similarity index 100% rename from packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/WideTile.scale-100.png rename to packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/WideTile.scale-100.png diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/WideTile.scale-125.png b/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/WideTile.scale-125.png similarity index 100% rename from packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/WideTile.scale-125.png rename to packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/WideTile.scale-125.png diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/WideTile.scale-150.png b/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/WideTile.scale-150.png similarity index 100% rename from packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/WideTile.scale-150.png rename to packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/WideTile.scale-150.png diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/WideTile.scale-200.png b/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/WideTile.scale-200.png similarity index 100% rename from packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/WideTile.scale-200.png rename to packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/WideTile.scale-200.png diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/WideTile.scale-400.png b/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/WideTile.scale-400.png similarity index 100% rename from packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/WideTile.scale-400.png rename to packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/WideTile.scale-400.png diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Windows_TemporaryKey.pfx b/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Windows_TemporaryKey.pfx similarity index 100% rename from packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Windows_TemporaryKey.pfx rename to packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Windows_TemporaryKey.pfx diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/resources.pri b/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/resources.pri similarity index 100% rename from packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/resources.pri rename to packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/resources.pri diff --git a/packages/flutter_template_images/templates/skeleton/assets/images/2.0x/flutter_logo.png b/packages/flutter_template_images/templates/skeleton/assets/images/2.0x/flutter_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..b65164de707ffeaf0adfca5fca65532bf97e6903 GIT binary patch literal 619 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H3?#oinD`S&H3s;ExB}^b{r?#vrgK>I2kif@ zvH816@%GSTKN!MhbHpsw+WI}@_)o2^Ujq(*4>|fhmwB2f9E#&lh@dHUo7LNZ{xgp@r+-ynauvLPwNoN4|Z_>tNAZ;@h5j(?S79JcUYfB`=#qy r6fZFpo3n_4Rl|XiE8s&sR~^H;NW15^d4qg`5ys%@>gTe~DWM4f{@o*g literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/skeleton/assets/images/3.0x/flutter_logo.png b/packages/flutter_template_images/templates/skeleton/assets/images/3.0x/flutter_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..97e5dc9af6e1093966c5cd42d608fd6fbb6a0c59 GIT binary patch literal 810 zcmeAS@N?(olHy`uVBq!ia0vp^2SAvE8Azrw%`pX16#+gWu0UF2`*(-^-y@EH58eMI z^w{s z-$IW5@LT%57HGFUA^wwrfyu|y#WAGf*4wMk zgAN-AxF%k#KCURBVA1=%-ucp;9Uj}ZG#l?Wes0(B%({NdIoXW<{g3WiupaK0x3By2 zO4s)_FGS)mJr|)n_%@ z)kihD)q6Gi)z>tJ)#o(E)yFiZ)%!H&)t5Jx)rUK-{vXl2fA4~;^_xE>GN_~ps{eO!b9`tLyxW8Xh;HNSd-@|xOj=ytR+do>D zt9>mOkvaAL$-iq%!vCf*DgR4ol&oKHV8Z?Agj4S|4W8wT%=mnri|3a%tJ>eCOpE`; zHb(y6c3?w&Y{ISmIsp&Mrw9G7`Sv8_P1LLTesVhEI)8;vvu5vq*tGV3&cSo}TNXSq zj|})It+V3iSy7We$GB|jf?4DCFKlYK@8ftOf60QQ_A~Fi*3bCZZ_jpf?zg4|^)^x| zt2OmGe$>0=M;cybjjOklN_(oQ_u}uL;@3elyf)C=)PemO(7H=26jVtWmubrDh3}(04)hM&xSK7O%X|>Mc j1|}|z1*pUejUUWgK0Q%uH(H?zOn3~Qu6{1-oD!M<&k2w@ literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/skeleton/assets/images/flutter_logo.png b/packages/flutter_template_images/templates/skeleton/assets/images/flutter_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..b5c6ca710c937527ca8d2d344214243d6db33832 GIT binary patch literal 419 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!@&kNAT!FN~`u7^!zegPZ&Ja3_ z)pe?NNpCL!ThaUauw)u_bwr{%Izl9$A!5B7M$govP zxh~|$561A>Od+#a0;aQjP2sie<+JJ*(`u4bZve_F*PR4v(b@jZ=Md1SAK%^B{{yWQ zFA4GsW)M(NFaUyj5NMdc{{H>@?}1?b(XAk7pYe2Y42d}W_VP)gCIbQ2ix!U>4q9?~ zIsEybZ^G7cAu^%-PQ=yx*;eIK#gYnUFW+9QvQNJH+nbx4)6dKOIC(3+3g6;V=GFge(48{@_RM&lLju^uE+^au+>tK7OIONyesA;#Zub zQs3&YevL0~GuE6t~Fo%7BFztX3q{1RVU;;PiN_-8qleWA`_& zw({X*ef?P{^t~Y0vFF>PCUdo}=4?%^3QRb0$VpT0kLyEL`Hh?APM literal 0 HcmV?d00001 From 876eab432ccd164d8617bb52bd4f2e47876caabc Mon Sep 17 00:00:00 2001 From: Guy Luz Date: Mon, 16 Aug 2021 01:47:03 +0300 Subject: [PATCH 066/118] [multicast_dns] Fix for #88242 README.md broken link for bin dir (#436) --- packages/multicast_dns/CHANGELOG.md | 3 +++ packages/multicast_dns/README.md | 3 +-- packages/multicast_dns/pubspec.yaml | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/multicast_dns/CHANGELOG.md b/packages/multicast_dns/CHANGELOG.md index fa64e26..f70ebf8 100644 --- a/packages/multicast_dns/CHANGELOG.md +++ b/packages/multicast_dns/CHANGELOG.md @@ -1,3 +1,6 @@ +## 0.3.0+1 +* Removed redundant link in README.md file. + ## 0.3.0 * Migrate package to null safety. diff --git a/packages/multicast_dns/README.md b/packages/multicast_dns/README.md index 47f769c..26226f6 100644 --- a/packages/multicast_dns/README.md +++ b/packages/multicast_dns/README.md @@ -17,5 +17,4 @@ import 'package:multicast_dns/multicast_dns.dart'; ``` Then use the `MDnsClient` Dart class in your code. To see how this is done, -check out the [example app](example/main.dart) or the sample implementations in -the [bin](bin/) directory. +check out the [example app](example/main.dart). diff --git a/packages/multicast_dns/pubspec.yaml b/packages/multicast_dns/pubspec.yaml index 285277e..0a11ff5 100644 --- a/packages/multicast_dns/pubspec.yaml +++ b/packages/multicast_dns/pubspec.yaml @@ -2,7 +2,7 @@ name: multicast_dns description: Dart package for mDNS queries (e.g. Bonjour, Avahi). repository: https://github.com/flutter/packages/tree/master/packages/multicast_dns issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+multicast_dns%22 -version: 0.3.0 +version: 0.3.0+1 environment: sdk: ">=2.12.0 <3.0.0" From 54de48b1c8835bedf453920089c93cbd856bbb6b Mon Sep 17 00:00:00 2001 From: ghermana <89948065+ghermana@users.noreply.github.com> Date: Thu, 2 Sep 2021 06:21:29 +0200 Subject: [PATCH 067/118] Close the IPv6 any addr socket in stop() (#455) The IPv6 any address socket was not being closed, and this was causing a crash on iOS when the App is suspended although stop() was called. --- packages/multicast_dns/lib/multicast_dns.dart | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/packages/multicast_dns/lib/multicast_dns.dart b/packages/multicast_dns/lib/multicast_dns.dart index c6908f7..bd59623 100644 --- a/packages/multicast_dns/lib/multicast_dns.dart +++ b/packages/multicast_dns/lib/multicast_dns.dart @@ -49,6 +49,7 @@ class MDnsClient { bool _starting = false; bool _started = false; final List _sockets = []; + final List _toBeClosed = []; final LookupResolver _resolver = LookupResolver(); final ResourceRecordCache _cache = ResourceRecordCache(); final RawDatagramSocketFactory _rawDatagramSocketFactory; @@ -113,6 +114,8 @@ class MDnsClient { // Can't send to IPv6 any address. if (incoming.address != InternetAddress.anyIPv6) { _sockets.add(incoming); + } else { + _toBeClosed.add(incoming); } _mDnsAddress ??= incoming.address.type == InternetAddressType.IPv4 @@ -167,6 +170,12 @@ class MDnsClient { for (final RawDatagramSocket socket in _sockets) { socket.close(); } + _sockets.clear(); + + for (final RawDatagramSocket socket in _toBeClosed) { + socket.close(); + } + _toBeClosed.clear(); _resolver.clearPendingRequests(); From b028dd0633d01c9c7b04d729dc2ee44517d3fc2f Mon Sep 17 00:00:00 2001 From: Dan Field Date: Thu, 2 Sep 2021 11:07:19 -0700 Subject: [PATCH 068/118] Test that IPv6 sockets get closed (54de48b1c8835bedf453920089c93cbd856bbb6b) (#457) --- packages/multicast_dns/CHANGELOG.md | 5 ++ packages/multicast_dns/pubspec.yaml | 2 +- packages/multicast_dns/test/client_test.dart | 48 +++++++++++++++++++- 3 files changed, 53 insertions(+), 2 deletions(-) diff --git a/packages/multicast_dns/CHANGELOG.md b/packages/multicast_dns/CHANGELOG.md index f70ebf8..426f0b0 100644 --- a/packages/multicast_dns/CHANGELOG.md +++ b/packages/multicast_dns/CHANGELOG.md @@ -1,4 +1,9 @@ +## 0.3.1 + +* Close IPv6 sockets on [MDnsClient.stop]. + ## 0.3.0+1 + * Removed redundant link in README.md file. ## 0.3.0 diff --git a/packages/multicast_dns/pubspec.yaml b/packages/multicast_dns/pubspec.yaml index 0a11ff5..2d24824 100644 --- a/packages/multicast_dns/pubspec.yaml +++ b/packages/multicast_dns/pubspec.yaml @@ -2,7 +2,7 @@ name: multicast_dns description: Dart package for mDNS queries (e.g. Bonjour, Avahi). repository: https://github.com/flutter/packages/tree/master/packages/multicast_dns issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+multicast_dns%22 -version: 0.3.0+1 +version: 0.3.1 environment: sdk: ">=2.12.0 <3.0.0" diff --git a/packages/multicast_dns/test/client_test.dart b/packages/multicast_dns/test/client_test.dart index bd592f3..4c49fcb 100644 --- a/packages/multicast_dns/test/client_test.dart +++ b/packages/multicast_dns/test/client_test.dart @@ -29,11 +29,50 @@ void main() { expect(lastPort, 1234); }); + + test('Closes IPv4 sockets', () async { + final FakeRawDatagramSocket datagramSocket = FakeRawDatagramSocket(); + final MDnsClient client = MDnsClient(rawDatagramSocketFactory: + (dynamic host, int port, + {bool reuseAddress = true, + bool reusePort = true, + int ttl = 1}) async { + return datagramSocket; + }); + + await client.start( + mDnsPort: 1234, + interfacesFactory: (InternetAddressType type) async => + []); + expect(datagramSocket.closed, false); + client.stop(); + expect(datagramSocket.closed, true); + }); + + test('Closes IPv6 sockets', () async { + final FakeRawDatagramSocket datagramSocket = FakeRawDatagramSocket(); + datagramSocket.address = InternetAddress.anyIPv6; + final MDnsClient client = MDnsClient(rawDatagramSocketFactory: + (dynamic host, int port, + {bool reuseAddress = true, + bool reusePort = true, + int ttl = 1}) async { + return datagramSocket; + }); + + await client.start( + mDnsPort: 1234, + interfacesFactory: (InternetAddressType type) async => + []); + expect(datagramSocket.closed, false); + client.stop(); + expect(datagramSocket.closed, true); + }); } class FakeRawDatagramSocket extends Fake implements RawDatagramSocket { @override - InternetAddress get address => InternetAddress.anyIPv4; + InternetAddress address = InternetAddress.anyIPv4; @override StreamSubscription listen( @@ -44,4 +83,11 @@ class FakeRawDatagramSocket extends Fake implements RawDatagramSocket { return const Stream.empty().listen(onData, onError: onError, cancelOnError: cancelOnError, onDone: onDone); } + + bool closed = false; + + @override + void close() { + closed = true; + } } From eeae6c67f7cc032cce121a8b90bd95bc9c95efa6 Mon Sep 17 00:00:00 2001 From: stuartmorgan Date: Thu, 2 Dec 2021 15:01:20 -0500 Subject: [PATCH 069/118] [ci] Roll repo tooling to 0.7.3 (#520) Updates tool pin to 0.7.3 - Enables versiond and CHANGELOG update checks. - Enables timing logging. Changes to allow the roll to pass: - Adds missing licenses to Kotlin files (which were not previously checked). - Adds missing AUTHORS files. - Adjusts package descriptions to meet pub.dev length guidelines, which the tooling now enforces. --- packages/flutter_template_images/CHANGELOG.md | 4 ++++ packages/flutter_template_images/pubspec.yaml | 2 +- packages/multicast_dns/CHANGELOG.md | 4 ++++ packages/multicast_dns/pubspec.yaml | 2 +- 4 files changed, 10 insertions(+), 2 deletions(-) diff --git a/packages/flutter_template_images/CHANGELOG.md b/packages/flutter_template_images/CHANGELOG.md index 3e75207..4d07481 100644 --- a/packages/flutter_template_images/CHANGELOG.md +++ b/packages/flutter_template_images/CHANGELOG.md @@ -1,3 +1,7 @@ +## NEXT + +* Updates package description. + ## 4.0.0 * Move assets common to all app templates to a new `app_shared` directory diff --git a/packages/flutter_template_images/pubspec.yaml b/packages/flutter_template_images/pubspec.yaml index 1c224a1..9e73269 100644 --- a/packages/flutter_template_images/pubspec.yaml +++ b/packages/flutter_template_images/pubspec.yaml @@ -1,5 +1,5 @@ name: flutter_template_images -description: Image files for use in flutter_tools templates. +description: Image files for use in flutter_tools templates without adding binary files to flutter/flutter. repository: https://github.com/flutter/packages/tree/master/packages/flutter_template_images issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+flutter_template_images%22 version: 4.0.0 diff --git a/packages/multicast_dns/CHANGELOG.md b/packages/multicast_dns/CHANGELOG.md index 426f0b0..9380f88 100644 --- a/packages/multicast_dns/CHANGELOG.md +++ b/packages/multicast_dns/CHANGELOG.md @@ -1,3 +1,7 @@ +## NEXT + +* Updates package description. + ## 0.3.1 * Close IPv6 sockets on [MDnsClient.stop]. diff --git a/packages/multicast_dns/pubspec.yaml b/packages/multicast_dns/pubspec.yaml index 2d24824..c0ce58f 100644 --- a/packages/multicast_dns/pubspec.yaml +++ b/packages/multicast_dns/pubspec.yaml @@ -1,5 +1,5 @@ name: multicast_dns -description: Dart package for mDNS queries (e.g. Bonjour, Avahi). +description: Dart package for performing mDNS queries (e.g. Bonjour, Avahi). repository: https://github.com/flutter/packages/tree/master/packages/multicast_dns issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+multicast_dns%22 version: 0.3.1 From f2bfbdf801a4c932d007a9b8a4503ebf05fefc6d Mon Sep 17 00:00:00 2001 From: Simon Schubert <2@0x2c.org> Date: Wed, 5 Jan 2022 12:45:21 -0800 Subject: [PATCH 070/118] [multicast_dns] make MDnsClient.start() idempotent (#525) --- packages/multicast_dns/CHANGELOG.md | 3 ++- packages/multicast_dns/lib/multicast_dns.dart | 8 +++++-- packages/multicast_dns/pubspec.yaml | 2 +- packages/multicast_dns/test/client_test.dart | 23 +++++++++++++++++++ 4 files changed, 32 insertions(+), 4 deletions(-) diff --git a/packages/multicast_dns/CHANGELOG.md b/packages/multicast_dns/CHANGELOG.md index 9380f88..7331f9b 100644 --- a/packages/multicast_dns/CHANGELOG.md +++ b/packages/multicast_dns/CHANGELOG.md @@ -1,6 +1,7 @@ -## NEXT +## 0.3.2 * Updates package description. +* Make [MDnsClient.start] idempotent. ## 0.3.1 diff --git a/packages/multicast_dns/lib/multicast_dns.dart b/packages/multicast_dns/lib/multicast_dns.dart index bd59623..5aeeab4 100644 --- a/packages/multicast_dns/lib/multicast_dns.dart +++ b/packages/multicast_dns/lib/multicast_dns.dart @@ -83,6 +83,9 @@ class MDnsClient { /// The [mDnsAddress] allows configuring what internet address is used /// for the mDNS query. If not provided, defaults to either `224.0.0.251` or /// or `FF02::FB`. + /// + /// Subsequent calls to this method are ignored while the mDNS client is in + /// started state. Future start({ InternetAddress? listenAddress, NetworkInterfacesFactory? interfacesFactory, @@ -91,8 +94,6 @@ class MDnsClient { }) async { listenAddress ??= InternetAddress.anyIPv4; interfacesFactory ??= allInterfacesFactory; - final int selectedMDnsPort = _mDnsPort = mDnsPort; - _mDnsAddress = mDnsAddress; assert(listenAddress.address == InternetAddress.anyIPv4.address || listenAddress.address == InternetAddress.anyIPv6.address); @@ -102,6 +103,9 @@ class MDnsClient { } _starting = true; + final int selectedMDnsPort = _mDnsPort = mDnsPort; + _mDnsAddress = mDnsAddress; + // Listen on all addresses. final RawDatagramSocket incoming = await _rawDatagramSocketFactory( listenAddress.address, diff --git a/packages/multicast_dns/pubspec.yaml b/packages/multicast_dns/pubspec.yaml index c0ce58f..3cb0477 100644 --- a/packages/multicast_dns/pubspec.yaml +++ b/packages/multicast_dns/pubspec.yaml @@ -2,7 +2,7 @@ name: multicast_dns description: Dart package for performing mDNS queries (e.g. Bonjour, Avahi). repository: https://github.com/flutter/packages/tree/master/packages/multicast_dns issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+multicast_dns%22 -version: 0.3.1 +version: 0.3.2 environment: sdk: ">=2.12.0 <3.0.0" diff --git a/packages/multicast_dns/test/client_test.dart b/packages/multicast_dns/test/client_test.dart index 4c49fcb..134d751 100644 --- a/packages/multicast_dns/test/client_test.dart +++ b/packages/multicast_dns/test/client_test.dart @@ -68,6 +68,24 @@ void main() { client.stop(); expect(datagramSocket.closed, true); }); + + test('start() is idempotent', () async { + final FakeRawDatagramSocket datagramSocket = FakeRawDatagramSocket(); + datagramSocket.address = InternetAddress.anyIPv4; + final MDnsClient client = MDnsClient(rawDatagramSocketFactory: + (dynamic host, int port, + {bool reuseAddress = true, + bool reusePort = true, + int ttl = 1}) async { + return datagramSocket; + }); + + await client.start( + interfacesFactory: (InternetAddressType type) async => + []); + await client.start(); + await client.lookup(ResourceRecordQuery.serverPointer('_')).toList(); + }); } class FakeRawDatagramSocket extends Fake implements RawDatagramSocket { @@ -90,4 +108,9 @@ class FakeRawDatagramSocket extends Fake implements RawDatagramSocket { void close() { closed = true; } + + @override + int send(List buffer, InternetAddress address, int port) { + return buffer.length; + } } From a6151014e74b69f74c5330a18b06355ac6850267 Mon Sep 17 00:00:00 2001 From: stuartmorgan Date: Mon, 24 Jan 2022 22:26:00 -0500 Subject: [PATCH 071/118] [all] Update repo links to 'main' (#552) Replaces 'tree/master/...' with 'tree/main/...' in pubspec `repository` and podspec `source` links, now that `main` is the default branch. No version change: `master` is being mirrored for the foreseeable future, so there's no urgency on this; updates can go out as plugins are updated naturally. No CHANGELOG change: This is a mechanical mass change. --- packages/flutter_template_images/pubspec.yaml | 2 +- packages/multicast_dns/pubspec.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/flutter_template_images/pubspec.yaml b/packages/flutter_template_images/pubspec.yaml index 9e73269..aa32524 100644 --- a/packages/flutter_template_images/pubspec.yaml +++ b/packages/flutter_template_images/pubspec.yaml @@ -1,6 +1,6 @@ name: flutter_template_images description: Image files for use in flutter_tools templates without adding binary files to flutter/flutter. -repository: https://github.com/flutter/packages/tree/master/packages/flutter_template_images +repository: https://github.com/flutter/packages/tree/main/packages/flutter_template_images issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+flutter_template_images%22 version: 4.0.0 diff --git a/packages/multicast_dns/pubspec.yaml b/packages/multicast_dns/pubspec.yaml index 3cb0477..00a6a61 100644 --- a/packages/multicast_dns/pubspec.yaml +++ b/packages/multicast_dns/pubspec.yaml @@ -1,6 +1,6 @@ name: multicast_dns description: Dart package for performing mDNS queries (e.g. Bonjour, Avahi). -repository: https://github.com/flutter/packages/tree/master/packages/multicast_dns +repository: https://github.com/flutter/packages/tree/main/packages/multicast_dns issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+multicast_dns%22 version: 0.3.2 From ba0c411ef059269815022a9dd31a94ffce622b16 Mon Sep 17 00:00:00 2001 From: Chris Bracken Date: Fri, 13 May 2022 14:17:27 -0700 Subject: [PATCH 072/118] [flutter_template_images] Add macOS app icon assets (#1930) Adds the the AppIcon assets in the macOS app template while simultaneously updating them to meet Apple's icon guidelines as of macOS Big Sur. Ref: https://developer.apple.com/design/human-interface-guidelines/macos/icons-and-images/app-icon/ Issue: https://github.com/flutter/flutter/issues/103371 --- packages/flutter_template_images/CHANGELOG.md | 3 ++- packages/flutter_template_images/pubspec.yaml | 2 +- .../AppIcon.appiconset/app_icon_1024.png | Bin 0 -> 102994 bytes .../AppIcon.appiconset/app_icon_128.png | Bin 0 -> 5680 bytes .../AppIcon.appiconset/app_icon_16.png | Bin 0 -> 520 bytes .../AppIcon.appiconset/app_icon_256.png | Bin 0 -> 14142 bytes .../AppIcon.appiconset/app_icon_32.png | Bin 0 -> 1066 bytes .../AppIcon.appiconset/app_icon_512.png | Bin 0 -> 36406 bytes .../AppIcon.appiconset/app_icon_64.png | Bin 0 -> 2218 bytes 9 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 packages/flutter_template_images/templates/app_shared/macos.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png create mode 100644 packages/flutter_template_images/templates/app_shared/macos.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png create mode 100644 packages/flutter_template_images/templates/app_shared/macos.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png create mode 100644 packages/flutter_template_images/templates/app_shared/macos.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png create mode 100644 packages/flutter_template_images/templates/app_shared/macos.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png create mode 100644 packages/flutter_template_images/templates/app_shared/macos.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png create mode 100644 packages/flutter_template_images/templates/app_shared/macos.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png diff --git a/packages/flutter_template_images/CHANGELOG.md b/packages/flutter_template_images/CHANGELOG.md index 4d07481..b4ca5d6 100644 --- a/packages/flutter_template_images/CHANGELOG.md +++ b/packages/flutter_template_images/CHANGELOG.md @@ -1,6 +1,7 @@ -## NEXT +## 4.1.0 * Updates package description. +* Adds macOS template app icons, updated to Big Sur style. ## 4.0.0 diff --git a/packages/flutter_template_images/pubspec.yaml b/packages/flutter_template_images/pubspec.yaml index aa32524..b163690 100644 --- a/packages/flutter_template_images/pubspec.yaml +++ b/packages/flutter_template_images/pubspec.yaml @@ -2,7 +2,7 @@ name: flutter_template_images description: Image files for use in flutter_tools templates without adding binary files to flutter/flutter. repository: https://github.com/flutter/packages/tree/main/packages/flutter_template_images issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+flutter_template_images%22 -version: 4.0.0 +version: 4.1.0 environment: sdk: ">=2.1.0 <3.0.0" diff --git a/packages/flutter_template_images/templates/app_shared/macos.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/packages/flutter_template_images/templates/app_shared/macos.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png new file mode 100644 index 0000000000000000000000000000000000000000..82b6f9d9a33e198f5747104729e1fcef999772a5 GIT binary patch literal 102994 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ⅅ8MglG&ER{i5lN315cO?EdHNLrg? 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 z zKpxF`G*X(YOz2^@7i#D+s-~A1E;3&x%%qL5hkiy^JhYjJ74{hvVmAx*6BH`M`!qGC zO9pjEsR)A-n1`6KLACSL%FS_Kcm+?4*z-V?WAZPs?RkzoijIr~I+oh1^~T`q^dCFvG$Gbd8AnTYBjLKYUmayaQz#S1le7Q^Hyr#;X&h*1wDpm+gZC!rSKom zq|+o&UGpeXtlQ1;?@JukKG!8PGS1Io0z6O}ZeL&DsON^I0K+>Mxv#ohK+;ByAZ`Eb z2orY{j0Pa3edA(#-pJA0AaJ6h& z81Gl(pd#j~mrizktoid14K5ig7u8FvZmLLP%l@dl05IprCyqDB?mA2fc*6UB+49lb zZ8`V9epdo=OeZoiY%zw-w`8DNwTORV_>>3T{r)1-YsGSo0E2s>tix9OBqKFBjg#}G z`pgkCblKMYs!Z)r^(qT_c+}gLhR|gnq!1~Qr|~kt&2@_yswx{i$KEn`8J1W8BGljl zr@GEG#W(s#AKKyuqLp+cl1C}7%`m#-!$15XF{M(M*-fD%+i#mFbP35jlgN3{8#A-dmj&OQtG)!031jTwGMal=&YtPfq2AUWekP9J-JT(p099!L`+yen$ zVH1?kRrhV7(mGKkm_jPP_U@Xd;x=ppk}4WY0Rbr> z0MJM_;$GGxL*P68y%KBqHntF{>X&<{aeI4m6+{TQ%~Zp}v%Pujr)zg5mV;cFKqeA- zQm5`#Sd{B6Rc*4PS-rO(vf>YEdXmOK?>K@`L5}|9q}#t_IE%g+U<-1qw3mr5&v;2A zCQ}BEn9_u;;>n5N#dP0RhCF-_UplC+U(i~Zjh>U5+b8%@p3HK(R*IMQwE!uritb}< zF)AK2?+0@-aE3LYkg`B*&N&m~JWB9>(Z>`aqRwgioU)0w{U1K4?>-#i|ZfhNa9hV)2)(%ch zJMH1twoeZWwkE@I!dz$ma+;9GeACv>Ncupl@+gBSeU_uzfj!$+h&@EACkZG_vwLGA z(?^;rcJu1$5H~xI@6lHIYC-$+b&hF1p`AoAOKqw{t0Fu#X`OGt$)7Q!nmJ=&)xjq@ zHoxT4pcYKSPT5(4yzIuQ^S*N2NJpR4v0?rB-^JuaXNLis?E(l>Jo8mUw(gsFLLOy? zEszHWGaCn|lw$LSwoj{G7Uq(zK0W^VVWu#ms8BMRlF2z%-g`fOXmndgC(na8fc)s` zz$GAoxP+l|+T_S4$r1sLwkV77ew1Gug*`|HiE*?FGLm1q; z^p0A0eqqbmk3?|!CB9DBN1Zof6d7+ zJSn!`VD~tVaqy<*Mw^8dM5v3Bvj2VdVFb=)U3L2eDM3@>n(P z?Rr_=I17+r4fE{>1LBQG0&o97nef67n-aNnVP<{dd6*B!Q344 zZbsAof&jw+;CLeK2d87t9s~YZ5?6Qwf&{NPEBN+)LbjOcZRXNcR&h)x`TtdpI+b!>$E~h0o1L*2OddpR9!Gw~-E^Cj(7i69S<66ak$)AYMv|xG+;uR(`;h zGIV3}?+Qxdjz)s;s}jHY{JPmeo@-tN$H@hxaV@)}K?y~ts~E6H(F|SlsN5oH8g7*h zGiC!8c1doE3U|D}Vul1yPmXuCk*hmyU4MG2ml#V0+(G5I+`L_=3cD$%$I=@*8m-LU-!fn&-sZO1%ls63+w}AiAK`Jv z>`q~ztr&&(gCkFpci+*1Ekdv*MhBCzGfPBj9dM|YEjZk(tWBuz4?MGeq+*)t>Q=z6UXF_w z{QDUT4^JQ8J%hW;d2xGB>Fl4Y-bRT!ttP2GE5jYoI1e(eVK0&V5W+>zludt=nf|UN zi1IV;MK$Fy%$yw<oGeW?JIGjmfGLH$Y;l|T0p1V!N*Jvu zHSAG0WpwPip0vm7%VRq8$2O2>P5b!WBfTz*6dZ4Wd6O9Y(8A;nOuG((y?F`ac_u2( z#~17CoTK)1G<~~Z4jXlout{e&nZbDHyHf(=a?OtaJ(2Q(!g#)Ugw-QQ?A?mN#yN%T zBtJ`sA6Lpg`k>Pi8a7GssiY$eG0Be8LCoQL{GDqi-;j0pLmT!Z)szldvbN7GVcu*S zzb1rEq|M)1qa7rM*I8!<#w7FnQ?{v^? z0`MlS3+`#ZB5$DT4+`7e-Hlp_2G0`*F@STbRJ|!tk3cC~1T%NR-p4s=sTT+RqsMjF zyrp-Jv?CD4Y3N&Zb1gr=%`MFR8;|r)uxQ6*X{OpEhQ~+tu}^n8Wijiy`pSMw0uKNi zSNX^Z1y;WirM0o_x%zft0U2GcLm_2BS`b{Z>g|9VOVr%QF*R?pTpiJsEbj4jLVAyd zTA;x15=f~b0^(e*Vo;Tn;WTJSxpI9LmL($Lxob<^S!k7mGhnnVNnAC*g!$ms0#Q|q zs=25I0<>fUw_&+KU`}5P9wlmjRWdMYh%Np6n?AAHQ;JzG?s(Z9UR`pNh79Nzk~DF+ zX~jy>>f-2bl?drlM8 z3NfIQnrT@pLmv+QA6efWPv!sqe;mh3_RcOj5>Ya;4hhN13dtx*_TJ-=kX_kZQDkPz zIw}#e_dK%au@1*L&iUP^cfH?zf1iK)tHv=t|>-9mMT!;;Vg|svSzWkN7q#t$c4N$Q;tl3EYwef_4q>GO<#I89VhY;`X*hz$n*GZ%f+;uViG z?uLlxD1OIeid}0r9%Ssoc7@vJjZIsZlU9zvYpjhYiOrzD5sq3OC zpf-X;Nb!DLpxqX^zDIK%=46-Z3%i-bac`RIBS5*wcw5Pu>G|kF>TQP$dGRYh#1hwD z{|cbbTOKL>Gb1-;X6?vWLC+KJ_^Ij?KzJ7eZ?^8XNgoYU9^z&>d zsIjX*uOK`#Wu!`>L@y!=XpQcW+mBaRjm|XrB@etLdr}Ob57e7EkE;7a*t7=M#XFL6 za;KHHk-rBNTjp-gS^;ehKNv>K>+_jPQ45J%4><1HyKJ?;T9#~k_23?xD}B&@Wp{%H z($hU+nWR?g!9dsJkgVz(J_Yrdns+m~9V_gQ7Sb`&F4wZZ!k}##j$>O{4{?avCbCZfyW zO$)m7LE=P?$CXHDU_RUD+sYwT;nKI7 zSs_XTv!BuxpJ!7(b~uYfsgzt~mj5(vf2r~`LHwpePs!o2A3zEr@#sxo8HEe8>V||d zBiz0@e&6}p*}!6jsm}I0bN9Mc2(c#jg@;Nu6!Kv&4&P8-UcQ-00WJIO%4OuUn;^jU z;I3r=T3KQtiMQ7&x32eVtB`mCe)9ws^7u%2P`B%Xc}=Qc&O^{FmS^{~Rho}^s`B+H z=1_T);9LRK?{$Vx22!5m)Er8aoPOA8&{7fyt`t@~Vw%gtx~+g3qs8LFR%(2Uny28A6dFYnNQgcUa>Sq=%alFh&8#@1o_qgwve* zVFimnUtL{4aHP6s?FB%bu2SP=e*VGqXC8iuZ-JOc{5%Lx0g|VvyWkdh&FD^Gkc!0N zhoolXvp6GC8wj?Y+V;r*EN+<1ac`-+!8Mqb@Nz)=OqV?4gxhR^t7*+^+AfxxVt(n{ z+fkk|-xSGqmkZa@Q%`;;r`-Z|? z0fR6b@l%pTwK*@xY+(MwBUwf^z+F*~piC64BWTrz}-HS1-XF-IA%?Zs_#F8 zcmUuEZ6Of>YIJOe$&{V;3vIBw7|jSGPeS6cvTMdj96Y~pI-z7InGW;(DhFqaiTTO9@KWvQi9__j0btLZ9 zAa~-Po%^sDFfme4@Yiq}r`BgnYK2eTwCjg9_zC4V{{&_GTm-!qHGVR6JXDjw;}GzF z6lXA{xo1+tQM{9vwb1&sRXPdGDHbEMbnwh}t+%tvcw5p4J4r#hEpDl=A{;Mjc%0)T zsG}v<$^HhdcE)5IJ^iBWK{7?Zn)vb%c!5eIj4 zbT}CGO*u)Od@^LuIC@_2{=AP2-O99NglFudj{!T}0e8wtTQcB@F9QW6$J!0Ye`T+U zXDx84b$!hD#4YzSyZLy~!IIZuFa3%eU zG4eg5?}sZ6Yj29P^-PcXG*8%VzLL$0!oL?c(!oQ+G!kORsa+lsf5YER>PX83R4LgF zgPNQJ#Bo#)MXU%J9k?RWD;c>|as5b5p>xAwau=X5XbERX`_ZHB8_XSNDe`s?n(e>) zGF$G%n6o+W{6A-@4hsIK0*J%jpB#Y*G^B48eQD(CDZR5oBl-P=)r7fH^PLf?!aK6V zwkIM35?l*I6p@;^H}JIDNs-fF*IFN?k?kj(M)QKM%%?dSkf1d$Nly2z(>)oq8z}0H zH?Qa{x&36#W@y04!9zx@x7un@ob$&)V8#f~0n1|jF0kFs4aZ{ND1~QjWHToIY5)LY zrgKDCj@dFCx&-w$QMi=CqD*=`$NqC~2k366pPXl#>Y7A=iQD}f`)+B-pS@LIW_M?9 zlBS_)(vGz!L$#P`?<3Hvonw@B1uJ244y)M?0)z0-hq++sJ0GZ+{oiiH;lFi&wy(C! z0Bv9z^M;`4@)USP)7dhg@K5K&U&|7&-@I0Sk>I+ZH75_xEn>qh9qmc%aA@NEKBsVBgUuK zC=b{w-0oU|)~tAVI zyJ3BAB}%rsjz7qZ?x_XCWe6!_u-{e_3u68Asso0IvwKdxq1lN#%4w>J zi>}P;$JZ>58(ZAjsmSJl6BWUTe`0eGEf3f_yS#H6vx;UJWO7CCK!{)4C}`C$j5gNj|k znb$4QRurEE3tPEe!JzG-a0DmvXePO zSD#Q-qOAjTMm|=aBSnvwHoEbgyVIz@J$hT*legak-hhb}e#%cm2$nR2 zV9A{kc)WT$np=5coPQIskbGMO@Fn2NxPv$@SJZdG6}jV;+%(cH+*RFQ(+DjsJlman zy`D(yN?8MCtjWD3w}Q|jQccb$}BDW%M$zZZnri2+5ls)@@(wQD`jt_GpTKL_^CO&SSCcHbfMX#JXYFI^*947 zPh&S-G=l*C@`E5CU1$m7ao(Q&oSmY7)ZZ#5_fEyYzLsFJwJ%GfErFeRN@7lUbUrL| z$6;gQSNsI91LJvT+$Zb0>g<4g8T{B!U05lfKmoSRH^pB^^8sJ3{8PzVq0NeypMF5k zU3qOqksdq{>AUjm3O~dZx^vS6C$ldgCWszl?xd8-sJ;-kPnISB*-f=L*8XggOx$?u zg%B-QovSjBbj}%sShZv~r?`*6PiiQW;nee<-=+y4}S#}q_BgXIJoSOf$YbE7vXt4;Np zrKzZf6Ny0aES8(-cqmnIGMg&ieYWryBZ0VTB=4<*@auP4NdIk&q(Mt(OLPm|Yl za!0OpC9sA#tk>OsaCSx0;!$5r6naw ztzLBo>#LKaxxsO=yWe%yGilL`A|6E#TK! z+1VRQlo*D?(k0-mlRM+`OMT8kVB*-%ZGv}Aj1u^j!wu*~>L<-T+u?6sX!3C}lQte- zk(6_=iwXsQ0JbRvJDwMnk!c99w~s~uD_4vMB=m~-ft-*|z~$*g4g;pgG~Ap1m@@Fx zWS)8IKSN6`^vVQ8hv^Oc+O(Rt7!U%wVsGP+Y6fyS%GG+v+dIdVfCXPzAV~~li+3m5 ztFQmbE)(#2#Oi@k$1#zUS6ijD_yYsa{+BHZAw+^zAEI3bc(h0qm?|pNf?oS}Km#OG zrOfCKn_-CVO;}DXu|5YE#d8I2o>}vUxYlv&>=+I28WY>a1;uI)HUM_IvpF;Ln4ROT zf!=1rpKihNFUo=R@sD-pT!EOm%%ncl43f;aem^;|A#s3`b6vjeAzO!M-gwc`-Kj~{ zBX)tq64*kJl#TrgW4o%hTY3x$P01nD6a6s2#MmwM$vyX5PU|YngU*wXGK*?f?#Eg$~^OWW3I@of-=XVuu-b%A1Z|nqY_2 z;~jD&=QnB#WGU>;RwFq(I< z34K1fCMwf9F}G%k(&?~2EY&)W*-_z0ReS$;7+I1)zz`)M zpAF{5ZHLPMJhYU z;GE*@hM1NM{G{L94dL$!Y-h6A9K9W=I6AYb`Y=v{(tpyLQz^^Aibea(q()R*TU|-m zozpyr!|-BZ_Dn+$*2|vq2Y@ghHo!-`WjVtU-bab(SJp2*2i-}$UP9^qnF_OIFS~-< zYj^VS!)Wu}vn6!LDIt!HJ1SU-@ce>z8f4cT4R9V@O^Xg9)4`VpjsXm*~@%l^Ux;Rf#Zck`BNXu0Y(!C zj%Z}UAmD00nsOS%Uull)dU(fZgJ$bo>3Oa`8h~Wt)EM?v(ndlTS1p0|E9Pg>=&>58 zghD~%R;YpqZAw;F;M(lx5b_wkVbnd+ER+6A-SYj^1XUgNGn0I~ES|f|5emjyPIW)S z0z8i6)BZt&h(qQxih4HbFYa6~jyeKbc_`QEdLD@9SBGButjw|b^l*oQjDk<7Nig08IK zb`ATVGzK%LP+>9aFM0hr8t+m`uNr?h&8o3Rp$T&ql||K}7GgobFhCViaDH~+F#yC- zt>7T3&_PZ*feTKTyd6vlF~JmEA1f+*>CCE4ex}5N^$4o)YuxX&3T$P0(IS!+kan^J z_p>v#1J8bWELml|S02YAQe-&yVew+kipZr~H-I@yc$=8#rZ-8L<_nDx&Qv3dJDwUX z!)@=h1`~R2M{$J8bM^1O&Gy2oxe1T;K?NA{iv_eYuhpLyc3%xu%z`dVc}Z}%cHGHQ<7P!Q|e?dwnSpL!AUf!B^!?#^Q#W!Ry+7ofwPZ1mZq z(Id0{htmX1W?2cAYWZo_lOtT#+Us-nlP$=CGK|Ri4x0Xh>(|iN9y1 z=9y26A4Y}ViRi9Fxzm{>J`YM>GX1D|$4BY9xJrY{oY2~Z&};B{Zq9Pp!pox`8e#0C z-h~@fohA74(#ws!{7kIe4v6XUX<)9bd)g66Bz%^Y4p0~OF+rY;l$v&7T<3~4y!bv> zR$r#LblZcVgy2lq!ff+>yuR4qCcljQa03x|dTcG7`CHcxh#POtGKt6ymNd_0qF7Wf zBj_KC8{jl!zZ>0neDp19n3sD?HC=|WM3!}cK4zCnu6Uoj*hbV1<#F2BD)@A~y%@VXx+u}Hcn=_s-({PxzmMZ^xJ1SV zoZMY*FarYvO_@z8Lr2ep)%HgIL7rhYa~#X&&V8oYSw zA4m{3{hw1Vb~~26K^xro&e7i9eg^SqK0i}kG3z(!_~E?sjJlSWIWXJqKiHAWTG*SpPcCMD`kEc1gx`R^YkYWz zEN4vEIkj@&e4tC!(_~x`-K$w6CU%X7U2Y z)Y}T5stEyoSsB{H{+xfST3tov~6@lO}2gx#N(rHXiOAHT!dp6FiV8V)B4{L_P_% zmX0rPa^-{1xG6|#uEGo+!v)QAOjRe|jg2ICcXU!|Cr+LMbLHlhJ)ErR*P9*z$NLlt zmYjAUbljq004ZyOco?HJovV7M*Wb2nF8vT2D;3kGi%F)6Kr#TVW>}zTHnUQxoGmD0CY9J`|d%8@}n;_co2q zWr98`R_c@PQbMi}x3bWo4XZj{it6qYj+o*XvNoS4>rF;7WNn;vA*|A!3H}Wh-uk@n z*hV0S+XnX;K;BOoz?&*9_{NnM25s4^^QUt|>R!()^Z6#G3OmL{CU^-IG_M7_a~B+& zCrV;ouC1ljbK(K=ygqAE_-}ewnH2&&t0enS7}I4i0wJgNvCf|P$`|DHku`K`HfDa2=n@DCg8MRi_)vpMR2Mxy4PE2Qe! zD||kNXy=0WeU(43v%md9Hg9Zu#CP%d%C67gk_#pfXs8lf>M=betm(}0fdDKq0{26# z_c?J!Cgo-~*=wswLXkR|W8d+rDdV00`22Ouv=_Hod9bmB!=D$I4r@7DZX7e+0tO!9 zR{0d}A6^K#yRx@ykotO4(WUJsmFvN)d-o-wZ(wcDSUS`8jO-JSAMa4y@MK4fDP`(P zzxQ2})ofiauWKj9{Rm$Yw^?g=?`oO(Vf|T^I+-A+o1#F`>tn59d=FtgVJAV=y;G&` z0GMvtEeil5;e$Ln8-41(UeMl2kYLk%vPl?0+Egg_;g)494o5FsvdeZKP;&&fjw7o{ z|B+e%Z|)8Ts?=>@p|hr!nYXgV=ZjI4Cp#$E>+g^6r7Nd3<>-t=G%B5IyZUI{e{49G zqnIXEB=M@5Ndf1J#l5YWcLG=A4ufF8S{z5Kz-uM?Ni{{%mr);=l0=473h#cIc{K3> zZ-VUw_Ng5^HgWQhs5tQU@qv-YBej9`R$a^|lknX<*+sSVXue8M0#EPBJ6_Liwl*8l z_zoD#!l%WIXJZ$jm?|zUu0LdeP&8IW*(|39&QzKGnem$6--u{ZGtHt#Hro*h)?lu zXGKo-4Hv1WP*VLj;uA6UwGSV*6ro%PRbwR{@tXoCOb=OFTB4ru-|Id!rP5Y6LF*-D zy|t0qDSVPo$ffyoj#CIZV?l3VsPRYye$F^xxv~Z78_fwlCWbwW!nYCR2nx0_+@tg3C_UDMVa2Br=X3hfP}^Cp4Yg=#OK}K zKYVY`V9jEKD!UrCbSX6Xym2T-cg}!n;?;o{mM|zWj0P@D|FO-rQ zKt#ApEh#AX%_f%9!G6`I*K=bSnMIhQ%W5&BOMntzVr*eS;WR;FgM)+k`#+Vze*z&V zkU^I-R|!Nwy<~>eeQ~hJqa2|DdpX15kD=6U73Du;T|VarycBP^n#IZeIJ&H3S9#@oec~poZELqX$DAc>XZyuIqd^GK0Jq~0kI=d zA7gMo8%zmkEdnqMh)tkp?V0I;Tm3`>aU3^~dXw zlhdd3=iygnUgYu#GRhxln}4D?Gokczq?T;RjCk0=fUHy18$lt!-q!%sNxee7No^+N$9d?Es*``)0UJ4SC&FNY0pf z_MlbGdUy$|F}YDvJ9GTCkZbsNKj3DL5;=BGBx8xI;n)=A0d0j6MP7Mi6MQdk@Tux2Qy`oI_&*%EQ0bE?|R>P$rDhcFa8O?JIK zPOpFDa?-L*+Q7RrCg#y5z$l0d>n@+OYo3g>-Z*x&`Jj5|=*UOYaJer6;FAbdtt0O? zrFGUE?!XeUG}G8wMgeTs%+r;3uUU;Nq5EuU{h-g&UOBKhdS`;J=m!~xn*ztv_p@dD zR)tR!P=~5kX)FRsx9)uyuu?0dh%Ht7`PTM@e#Cq!z2ts;O;L)tQ1ipDiWqbGz@o_p z^D=UKR#`S7HAt4vQtD(_SeWyj_av~#tJKlb9>-s5Ykuzx_E1ZNl4)~f=zG$*;-y=T z2ozmFva9az<{2&63fQ?(Q8{IPx@t1LuFcxP-LXVctWh3AwazVTt2)w^*Zn-#eB`bD zSHoAusjOBK5(>uQPGj=ijdOH3jqG?(<5#C{*JQ?Lt~@zow=Ii4Al$Vr!#+Cf-gx)A z`_h(>b@7?*6bYM8%628gGW^rwWoG$mK_eCk`}B&llStfwHf12*{5spmTeNH$4{gCY z@Yuwr*k@%m;T<60bw9z6^WpWi@Bu^qe-g;YAzI+VjgsuZaGA=^G*I{KLy@rIjSpWb zFQNsCp2T;S$VaJtZ<(waRu8y7^X;>YhsWp zM)mKgCeE@K;J4vQSV z&-(Gl5AJCp>K*2-`U|4i;u3p8xo6(isu-38>cY zml1Eo&FBBKJpour?}q&nggpFiGM%m+YX`ng8P+uRnJiMyWcv*_AZ8KAB$w;rfmN8C z<-2EB6TqZO>A~P{*<);wYqZgxQS8E*syOXvGkGxF@s(scud0uv?T)fQ z(DGrwM7lvpitUG~6!*}kZUpBn9PuP`5^nMK@($xI^0Q~axP5qU>L~uF{R_<9&m z({}$$WuD1y-QzMVb3jLPk`~bDJNkw(Dv-6cKUb4uzD= z-w?i0NZ2K}AbT}Zi^uOZ32xmSxJw+6(3j%a!~Tdy-@RxVx6YUw2|V6JX+mSJNclfl zF~SD#eo+lnB=ZpHLl{)E+`sI^-V1Vn!6#Ml_W4aH*Pe(++sNI`M=5L3?X1z0;CJeE zJiX5Mp6JH*=R9W0t(1@>>1y=lP^F=yJil6JxU~I}EpTsBx?rJ5LbCbQ zuLBmmX1MO&!E}khx=+#hCesIB53`IWwqyFtR{AUv7vJ{Q^dn1S0@*^UOmRwctFy&> zd={(J@avBzmu$MbyamRMt_$kfHY<*v)%%&nY4hUDH=$k)$8LHlUG0G3Kv#T~-vQjw z)hXbsNIg?~b-jRw)ir5Q(gfwM+Zk+0haf z+4ER%>T8RnKAoJ-(s&tu&-iZ@A?^J|d z6md=9C4am*v2r=aa&a?~37bc($n#wQ<8UGXL+!RtrRXGSj-2INJ#+3J=}e6nOC}G8 zN~lvCS@rxoq7w$CLg-wx!%V%ymw>~xhUw4cADX*$A}D~{21F$!Y61aHwpdL!QcrsN zl~$s5kk%7HWHkZ43%mOcwlk3RcbKGQ*}K(Fxput)rpE0zH0vY(EyY=blQZ`odG#hD z)~{&r6XkSE(^csqsaMm>2c%xsT2&g_Nab1bTY%fIoNHatDY@C@Ei~v@19|F?szU6SWRS)uDXqNY!48RlAb;S*ijqus; zp;bteR835>3BXML2CewOM<^q3M*ubU`}gnI-oS&(vf=GF|JJB-inGOH_dc1xb|iqR zWgrcNy?1*8)vAlAaiBE%K3Q>5Ygy-#Wf$>FqL|Kvgb&6H?iQC*Z|PN)xZJhH#d#=a z@s9O0oea6Lg}submzNZ{iZ*_okZ$6G*h5YO!dE=7c4=YA9g$y%1xjkVl#|1DShEjM zH3(sS?uRfB3mhW5Wrm} zrY>KpBxM&CC;s5Ie_{o}upN{vdb8x<_$5iiQN49`z`+Zz`&E`yLAim;X&}$HAfKmT zkO2Dgdno95mWMH~h2c4);H=MigT8hyzl|4g;dU7F;p^X>w!fa0zf{^rf?>~ z0w{=F_R}ru{g5i@&xwC%R-!-1x|(k6pSb5_)$f`zyErIvSCs{z`iVvU4x_znFKti!!av6BkRX_=+kEc;*`_rla zB`g4ruCJGT3XVTTrlh3Yj>1>PNIy?sV%Yo*=qaBIOY87_?P04yx6TV?_{~K? zOHEo3|2EA2JAMPYZM!H<{|!s-$r>l5{19icxV`Wf-{<0I>{v&H4FZaCy$B6Ludz{v zRH!!HV#JGP?5(L!Zp#}NlOODgWqjO+yo~+LasPYxH+ht2KjdfCFQr(oovP3?vkFK^5FvPJ4^LD=DpYQi4tUXuY1;erJaBQ79 zHcp(>mKvoD+)bq5SX9siR>(%CL??*D>Snn%p}NfGO4(RY^puLI+j$Pw)NZLb5bKo{s|0L~ z-A3R~;QHMg0bHSgESOM&N&@oF4|8gkPF-nVM=sQ;d}wcS{{!iW-)yQ``D6t#xlh(O zRF0Z@O>0uMz9g)u{P))ptV5lH2(gC8I5i(FDRG5Gp1bgBydKgxJy5gBfK(#D7NzZU zatG}S^z#KL*Do5=K*F7hk(`mbdgI1XoM!8*-};#UzNtEG@Nki#`7)GfV;VlfW^)=` zBaAjK5>gx@wf_D!B!2C6xBK^K4%x|+#?P@5N7tlfWo6xWJD~Wz^cnPfFF($Ixt4!j z9%x^1$on56XZB0Irm^kw-*rd1YVO;(*LbB21@7OPJspo%WO676#~oUMws(zP#+shG+$ns0IC3W z_{kYU>N5<_6=j>*0d}r-?8U+--eXfy2M+opoYL|=I932TMp=&k#tzJ^72OtRJ8BVOvTYPh;@EE=LJLeOk`y?d|Dd9%fWlhON^LnB^6x0LyZqz@imyogJ`$C@Lr9Z4o)ZQz>NCavG$$@e2#r3 z4I=}I5KgV>wl)~_Ja7gLQGju0c1{h%cV&6c`doWWv$>q*=ZLc8J{hBiKXNK?zx2Nr zz!pph;BLU2OaZTv>Pzj(VpSp2&OWNCF<~>NgL!nezhxEgj;&2 zl>z@V#>sykFCnFL?|(j)J3SFr|FFa`n@KbhC2pZB7 z#3>qIn&~mG_Vki=p8_x&CFeD4V7MvgJlk^G7H;(apFxr+7Gc0+1KfI6$@aeF+d7DJ~_-A|H=0?Da#&^Cqb=!=fVz>giW5nw=jWQBS%L^t1EZ@ zCm9;qlG{($@0W3T&l17ownc5pWhfM8Mwn-fLtb7H|IYl)8@QikEc_Le+s60x?&B*m z5kObB5{BD}gGr7l84~vP{N)C~3V;xhBWd%=^j0&KBw3T3-HU`;hqWA3OWW~<8nl-M zfYn-BI0_?g`3$_;&Exw<(G{QM|8)Kq28x9NF-F$>r@_BO)t^T*i-U1bX01<)zC_uE zR@8qEQQ#cm$YbXIUPVO?z7KI$pw@r=-V{V@>dC9Hn==1QBVy_b;#*jR+&f*$AwCl?o&G?2Uk4=*Ej zFK^Yvw*HTO9n!XRBWe++o3)4O!OC9PC=_l_<$M(W8(Akk`zv5?nJifb^rH3N?Hhio zo$=nNmSEz_QFHj|XF!vQEcdqPyZz_4|M_GBH)k)KA9XGRlTJD;3*y1c#?ZWkeaQM* z^`Bf04#Z)ARgrE4rMmlk8E5F=NpaW8xKNd3)-orW$m+kh(W12jQbQ7oi z)=#qbmhkplt}u`FC0sV9sdnb5$E!zX_xlA{4wW&j0*DCm`=1;Sh_sB1xiH@C89Z93;8d)EUk=lPNIZ`o3H`Vd+Ig`=CV}#?PAXvzWk{x96fn z0(rYh<>?PJ>Hd8v@c8=*vm+)>P1k@i2>yMaKw2nihLV6Z;wcdc*E2{8=xNh(FkEe3 zq_pc;ISw&}`?lqKx<4vIa67!xu|P}G$c3MDyg?u^InS?uM6Zzys0QM9ChW>g-ypzA zkOUSfvhTTWq{_>TJ{+kpgwX{@>P5ptiJ1NTO5)8 z8BiLUY_!*AJ$V386^TicK@z0qOPWP#Ea5?}!$_&fQ zOcRKuR^tLX*&CM(ahYftiNg!a=uU|He)2nU2(~iX@Yo|foZp906;o=d%aK09YEW7_ z-yX*;XE#z@?zZ&fQ?2fYX!T8@-$(K5Jo+AkyOM+(944x4B%2NR&avFFJY^9_br5UtzSX5@gmYYm@ z@S$jtqFn18bXQr0IYhQ=+2~ZDB_DRW3d=*B+3q`-*1P$i!GVIG(AMp=vBQ#^_mNxp z(;4Iz#_~&9jZ}}7oW?R;_x8&h?b0N326NJq4~>W^TeI^!o4=G5G{|9ff|`NN5+?ns zL@IWva(*@PXPmVGQ#rgIOY*nnoqNDDy$hd2uMT>wBgzg>YT&BV2U{k1ah1(1j_v0` z@o;6~SUGW=!+j!oa9ko_2^G75?VolPmWk=Pb-h{k=phZga( z88Rp7QzbHkpYG!aug9e^DF63Bi|1#CeAW^CpakO9DTT!p$yhuT8Aq10^cl2O@Zl-2RXr`+zCPj#_FqXs}W2{Qvn2Y{BmNsG45? zB{BF_rVgT$u0 zE8o6|@C>uOK1Ba}!V zx!M$9J1B7#_JSs90cKlucib?T&HqQpLE9YV1?v{gh2NWKEt9FX8;3DePnCL5Z=k)Flp=?-i$<5H4zc z`?2ZZ+p~Y8FYr;m3Vn2(u5Z`Av6#S}zkpQpZ|vNP0DY^I-oa$HXzg+ajQC7%wldRN zfOAL!UwFtuphqqR41v|3He4cQF5;UU9M~lti-k<HSTs^#>-Tf|C2&~#m%6WZAy1jz!Q_-IbpZP z8ht8}UG13lz+N-7+01+RlE)6OT^3px7fn@1|_b7^{bhPet}< z_)77(<^>8-qQ2X(n4faVhm@T0@Z{5HFSWs~EDXtV@7IAMbVUP6;v8^%l3PZ#wOZ-* z*Vk4lRj6OYpAZ_$*`t|tYKmLar&&{5{d+5cst)rQTn`n8>Xi+0zXc6YbTPMgzewFg z23F=+`8=FXXF6b*CDVN$v3|6iy;TSFSYh$qrbhKDcT^U9l zj}3g#zty{k*>s8S+>t|cng#3@Rz`z}njy{*?90mV6_Mkvv=iL9pb0ttHf$7;TxkX1 z-klTGb`2~-Mxx6~+{b-KiFd3XG`p?+6-0PMorB#Q@TY_CH5)En#5WrmHqj;@Fvi1A zeGpO@wuYIPOgRY&02e-U+j7!$LZ#5mS72R3MJS^gfheL5`kQV_n{8}KXaj)V%4b~As zFrQ7yZal}~{ELX@8c#V?2LlM@)g(|;VvcBjEuTJ=`WkOem{DL!+7Lr!U;F!mGm_^~ z+V^T?%bz+8noq9{ybcq16Gzd^fS2`skac)@6|;8X8l6Q19epZ@l^3@1ES!x2XLNA4 z_FI8#x5sq7hXVr83D;_5$sU!*Ye}zyx1wMC?Q{DSgrUx#fM?_Fj@{syA2x2yL^J{S zPPLkQ#O+9E9a^H*USdriL6rGHDt$B!vu~t7^)@_e=(<|SVd!MenX48AP(Z$4WoC9_ zeN;I;hEAr{ZvB^gK*1AWfI~5H0a{Y#2UBjn9`7;3JDrI5leeufemoZol*pDlVTSHP z3#8@6kxsJwUFg9(;)>Xm!{nsFC<7}Xwv_?o=eP)$>vvvj>yw z=YS7{pIOg(u@mJ%G0G^TM@L6>l)?_{_e`(yLxmX%h*D zMJS13@e!}HFR{?GNtq;%=4#zUgfFP^$g|Ax1<`vC&qIPbwGNo}3>ZM?=Evk6r|J&S zi$UD-za)A$kcqu)8)1mG z{FI*zS4{wM6S3;RP-!$0&8!6*;>|%T%HJxZt}cmap#~4vD0Pkx22gBbPo~=2iEMFa zSN<~qRz>jf54?e)>3%j;Gc6C1_YO0C|CDQDt7+bE({$0($tizZ)xn2L?@6_ zR3$`yiwH?E%X*^k*^oQ=z!1GA|E&fXHPR=rIEGq4%0=SGvror2Y%k#d`aPmx5@~7a zdkmPa1d-<`6M%& zp9rn|?C(5SRowEcasXoE$)s`=GvJk9wPt|2VX31T2F}6x3#(&IMqZND*a1muBh9?X zX_HSLo?$y$a;qFx^U1W|YAd%)Gaf|AEHqZ*{PW96FF*&nO-@c?c6t5=K_z@2f$8<^ zY}d|9NRviy7sF$61>@bV$B3*VeDg4DX3qScxVTL~5Go^T?}aG+th- z2`EduJx~ZcSssR;yX%oW&ze|$TF?;>HGHp~Eq?$w&SAD?d#s$$|4F@l*T7}X$7>}7 zRvPwxrPaLO5X-qYiQ7{P^4Ui2GDbq&DJ3Yu`)8zfMi1{>HEq`+uR1bJ4x!#n0D6_M8Zs_# z3mc%u30aK|avL-!XI&?{^%v4OXUr4OzaL*|-HV&M5GPx)SUqYMWw@Ex;%DHx^&FOD zncjYHD@AiYbGx1O(rsKW>Eg}cid)6bqA}!r!G{?x#)c?^k+q_uv%Xh3ha^A^{%wnpRPY({1LqK{NQy>!UjUc8f7x2` zgyLiGpsKlFO75ee2#drn3Glyna)PvUP}e(t6P z(8^W6g23+fzT5gZQQ^L-Yg#^P;QK8FTZAe)*|CKS6(I>8a2aoN+XEkYf2jAF!Zi3! zjS($tF@bu(ypeC>`IZtF;jz`F6A-Y7ZUQBuZxp&q4zHb9cc*!1`T3p9xL9`nWhNVr z!2lf=fCA>;1E&E|yfmrHqB#XnUCu28b*4#eZ{lLL(42#`ui?BO&uZj|d_Fh!Bw8g$ zn@2uezsJz@^XM(T{!CEw+EyG*eaF`FuTN%C zOZg)khBpDobCl(3ud$bhr>EdmuQ^l^Cic|y2m>LM+gsZGYKUAeJE5YUX9}j^JDoojv<}Cm&t+agmp?JE0%d#fo}m_cYogpjn5&egilTvDFz-Df}1i zB4)bXfn$dqb!cCa13DdCgMNehaa&${n5Mw&bxeKfNmHq%e{T_H@WB!H3QgFK2gNpB zP<;xkez-y-Lr(0^P^G!YH~WLut`0=mPXbVN64iv6Nd`s=eUQ;?V((+QU0&B4SF3*{Pm$AVrq;v&)c>VLy_UCe45VEsI@ZWM2TaB# zRU6XaLx0^H=0)Z!$rIu`3*s{Z!W7pU@6aHvX*vUuzME+!B5H}k_gFD)3=f;nI zi1|B!@iO%p;L{!JSEI~vyUByf_{HY=;RuAK##-h!06XFwxYi?xl}oWStJ*P{OcVe~ z_v(y8!+BaLQB`(D(XrL0ReKMn$R)8mU2@$q$Pq; zbZq-$IkP4V(`m}e<)cwnZLrjiA-X0@VY~Gi5-PKX20#Eag!JOw1br%7Rr}`(v@d!u zCo@&wE1SwM=zt~$K!eJ**9GAv!}Cogn9(d0X~BwPkU4gaWh?WVRcE3N?C%_R_D)Vw z(YmJTJ_0~fhItqHPqoIFGQYE2!~?aSRa{vjcDWhy5>oT zGOMFTWfL`aLx-!QL(9r?~D6y9Uhq=af8z!rqg#p zXk%gE-;=@G>MUv7p@P#ni@zP*$YQwA0Dlc21`%pV;p!_F@xI(^eA5&SZ{rU?^Wj}! z6Y%C^eMYilc_~MAwqV`h=I0;WA)MqJ^$IvyJ-O0)*RuLYjTL1TWd|(NbhIZ;nOop( z`4bc=fsxaeI@zc!vvYFFetFRKSMjef2_#oIzzPIxZ4oB0sxKOzX4Wltz#G@LD2Qr5 zm9o~xF;EU*_!O`}IigC{sU%1^$$B@>Fa_H0*>*1Amc^7tnKxcPpr8zZTme`6(0@J| zXfBE;0)lcuv%tqq05V8P2B^)Nhq~qdR|1KCfe>(GeuFaNc)T~zvma>o)FZv;sVD@D zynx%jpd8m<{zI zz44BQcmN85TNhy2plu`Nt$b;sKELSBpW)my@*ZnL{lFaD|7-8c-;zw*wh@(1yH+~o zQd6mwOU~P(B4CS|mX=v+F44&NRvMbQpcpDmU!|BhndzGgrsa}~;RGs*v>~aLX|A9$ zxrCyC3y6ZiciVh3@BH@t1LJY%FM8{e94DY4JQ} zYS0fcOC|N!{@iq*a@H$Qe9ONriBWJrhLhC?o5K2)!=~i)0hGh-mMd~RkqdIGCB(fU zy5*IvHssJ&gxudt>g(3w2{)axskJ_#h96qTc~<{c!`n^f zg+SOfdm8=UI!4%}d%RkXd}yWU1H66h)eDTsQr!qkcZE^zbI#F$k(dn7l7z}@YSv1+ zIcEYw{HJjfg()x7R@zQ&o;LdJ2vi6Fkl?OHM-Ga!%w}co(6=I5LZ>n{9pr~6!z|S$ zq_VfE7##n|{H(t$wPI-D`~L#((@V(MZ>p6Eb8k%4{lIGT;hZ9cg%~HhcbDCd%0RbM zs?uZG1wSL{Z0f+NzDiO?w9~XT^dWptKJ@M~0(@5*az*ZgabU465JN9eFY7vD8Wdz_ zlAIonnlivB;uDXov3sIgoKx2>G6a;@?v0qg;r`RnZ{4wMw2%}(e*c8k`R7sNT@>H} zfUU~mHR~8!4rJTHVlT=v3wz2kx&95Nz?@Tj8)s5E}t{|AFA=d_Y zOTqb{ATx>U``k~NJ2hYk3r#Gn1}|1Xj}jq!9%;{k(?9!WZt1z#{OATvapC-}#$LWi zi2R>~v0v6A<|?Eg)Ye#VyRyr7RJ$N4vFEFfmb1jHF(yZN^rc!ULDen>KWu(D9Z5!P ze(qg(G2HmSqyi2B&W`vo@N=3l?+dXbWn-`1LrY1^_mSilpKLLxQp}@s?=Tqw6Do5Pui*IhPZtaT|GAE&MF$;(4s9Bt5f+vbITElRv3( ze&@3GgY%ltiz;PZXq||TeA+sP9bc(#*G<2ck&zF3W?0$Bxit`EwvZb7jke;810>h3 zb}}!oS_xUbJ^$_PWrSlJ-;v4qq!@|L9uM#ALcMu|+|fni+AqPpu+CtjBrs#Y1jKVU zEc6L$d!2l-MgMi5&7?{Dfxj)qn;mIZudn7I6V$88%05A!PtCQTGSxXKMGh;qXa|fE zJBUmhM!}@e#A?s%bajm+=Ka1WxHZWaj;k#XT{T#;bH9c5zA8txVHEz(EeE*PP9eD9 z<2|evdxmVLj_n@`lp>6@ zy_ZTczm54_lGjPwPaq$dF1HdIks&Mp;%bge$QZnnp${}#&Z3)z95ei@b9;c=kJpY- z$G#RZbgyTi3&d4=3%+gXOSp|g^~^%K1id>re4gTka;7m@WA}bFo`GUbT8-n19VVdO}IkuW(H_iil_S}@$xy(Q*fCcNaD60 zxqsWK5lESLWnKgy^ci@da#k9^aW5)oLzbFxlUVBA&UM~79PF7=rW@Ot`>9(Gju3N{A4%EK0dPuz{=J_LUv|Pe^*x3eq_ExMNjB3?{$+xH^_Y z;e5pH)*~Lo@y=;b=P$Iqp9KR|j(>D-kaI4WeI&&HPFRtbZBMiQ^PwE`pF$Z7#(@UF zP2~&InXDTNx3`4)H2mD8yHl{Jk(|C(VA2vwY}3IRqo*qy9HvN7a!$$hlZqjmb6tZy zp1fLd^be5LmcI`_d3@@A`jLDS!b0qXVvP%y>+DfL86Ie=*TZ)PL??Lk^F};4=dwv; zPRBV>*)f&NE0vtjYHw@vs9l(Dk*g-}ARSciwv!f)E361d_9y<;9b7)PBw$3dh`AZi zAY4)BVh3t>;gR=s)nZW3PT_3bOLDK)eTZT^*m%P!HdC!FvK=Z=_iA>Bg!`SsC|P3u zz+oMr^PUcTebccFK>bqp475+?5RUC{Y7klp^p=Q;ZM+c8Zq6wBtH*5c=QHlp7wZS%6AszeebN>>_2^H7uuK@g%1{vF}DT>U{h`}c+u5ubXcFMH)fZ6-l z!y=qVN>jqgj)3T!mALcM;1!8}PDcMCU6<9?l#euNff${zE=b0d%;TcPFfw`y>zjLg#_WgnwatH|t}Y&WrR32m5W_AWNa`OqIc{ zW{_mX(Ck1psRCgMhJ*hXhcAG1ocb_kuY)%9rlYzq8h$K;X}=5m+8CYpJ4Yw6zLi%S zpu}dkAc_hVv>NfWy9eLsQ-6OzoBl{WAkRi|U;anmJ5dFwz(C9~-A(!Vfw z(E!S5ua;@}(q5GrIc6|PAOSPg{il$s$UBI}tk5xuP-VedGyZd}xqXvWvU_`{;Cf0> z5fN79T(#iq-q$RLb(of0ZA0lfepj^!a2-6 zv{v^7r2J*xmj&XVgZ>Wd=RqwGGe1`-Svll~bz(-y7*N1ooU5J*aY@&5ea5ss6n(a? z`N9l?w~=^1g2wLDVRD5ovqLc^Z#YRDFR+QYV4emH*fzOpzer3>Pudh??f``be>dD3 z)xB}1O6bZpnt=j(m92Fxq0dz89n>B05xx10QDL-YDz&e>h_u@9+RG)Pv4{2IYNiMy z8auH}j+fW*;q%Ymtbq+KI_r4gxGUeYJ>hq~vbe!N3%NntH+Dyh7I70!cu(qE_`Vp; z07NvH4Q2s#9;mKj;>umoviK|H+#CbgGq`D+QxI*$r6&D`yf%-M^{H;6gi4*j3?c9c z8$}NK?0I4%b?c`p2;SvL3*xY`0fe_KIZqPm`M%{DCrPUt{bS|zlhbHBNlUe7zcK}E z$L2zIl+z#Z!thJW!}{G&JAC@Pg`H(}GLM_m;uV}C9Yt(vF+F0Dy7{`k zY&v=ZZf?8^qSD>~2iP#{qQK632aMplZye6Q3X>dctS@JHSz2)zJaqXvFEZlr>9$oY z^&9^4pN`1EJcEw_wi@P{zJqQX470?WZTB*5Y7F!3#xJO^z|Gw@)bFoY5#daTP5OgI zcbKI$Ok(|9g_%#If*$3ga=U0_n%|#}eWwyeW~(19Te+!xF*(rd=LU(nM15;<7Z&oA zrqIw#r7}&_qgCdvS7+!|3?8w7JNRtHQ$~8Yyw(xC+n=- z7SQBo3+)tbg2NJn^=lukNOCkiEsgt~4tCrZ{aSnrHRMk@_?1^whFrEn3mT1NSC9B&c-(JrWu@FUhSNf+(>-_%kX#@LYnzq`^M#XX}(*!_LZCY za24(5Y$WH^=;GY^#0c{Y4{_!GPvm_bd#&6ypUpfwu%|+=UEe^Q+oe$7cXnyF@O67L3%SKO#rdayD^4^vH2hG{w%vp|_*jKf4 z=jb?40UP4S+Mi~(Uz(^cvgVB+r+Rt|;wnFRYcz(i=&Q14Ok=V-tTPw4%v&;ZrxI#w z6&rvLjj#yzBr5~N*7o09CkIE=>EWwo`ceL*@Y=504RB*xY#SY{)p3Gvn9zBL_FCN0 zl^axu8p~su8HpiDNi{%5ojAv1{0?t7*mflF9&Y_x4#)X(jyLl~c+s6*I1G7{zBI;tH*_ z94)o##4$cU4ohj~e#C^E><)3E`d;ftdwTQZpDmp)9)n5^+h%BE?)8LI2A`L!zjTBL zPYE&+#0&jDFc&4Tg}VC}E@4ZGyWbiK2dvn6Mpu!cQT_^6!RG!7)fE>V>?PNFm?vc5 z>A8gcW=5Xm2#LEW_;XgMQ$=Y-#lc|zs2}}2ny_4Kb%D@Vrtu6rOmUe!ph7;;L`XHi zXcDHc;OYbIk44?|A9-=Ml{Xap)^{jb5$Kl?v`CIT`bDXV*x{h+UARtzOd}#US>a%X zOdU`5^_P@lkQxB*B<&RQB?FgJOH2-~rMnXf_{5%~s&OlUM^i30FeOM{`XOXs)3_BU zEAyNr%bz8RJ=Cvw8y=)3p z`K|i!j$l~LqQ)kabHK}7WeyB$x*({t#cQWf98qh&X{R*Y--9)~g)?XCL>&z;v9#hY zTFY?DV&1fPE&*z}6Ki`Y5#(-eVYB;OzZjPSDnN%ArA8D>wODpQT4Jt}ah556JE+G_! z_P0uQ!qDhR94VdpAqajIOl4~>oTaQ8H5yXaTZUOb%cRAkWYV?KSNlTqgSM=Wgf)JP zz=?Q5f5zPEVO!NbOCbqEwP^Ff_O_`gdm67#U{Mp^_bKcq2IoO%zcJb(M5z`cjv1Ck z+!awNRhwjj6CQqu+xC#{UWo^3+h?6ymzq3r?3JV}<|u_9x=MWAm`1AqAnOsJ*@)^4 zr|`FkZlg{Cd!#Chmhn=_ZQe;~-DTUOv>)Tbmh0{z_42vWa|vNUO% z_5KA1xNHBgw0zjUH|s5xg$b4k z@Koa#-AFizrr6h2#$k*41tm7_jp$yL4X*DZcklq!u+>9E0WnhcOFPn7Vh^ao@~tno z@RwY)*+8&|Hpdq)`a=L*Teuw;_B@u;o!a!YaOO@bs-?*gqpm?nRkXl~mKFfF z+OVzE%RlC`M5-+KM_GXZ@9b;=2C(sq+R&Ko_RzZ%5P~kDieK3yzV4BN*{$E%KY;4k z)s?*vacHYN~u+?SoI`e@S2!9Co!cdvz;@N@{yj`0-9^8osR(V7PR-O&gM)x3owqs5oJpIwc zgY`#VzjI$V>YYDrIr8D;0JK<10@ycefw z;;oV(!gUR*xBg%xTl-#d>u(5}#jFrLKo}q0b{IuuZhuO7n++ zo@9)d#`(AT$mbW5g;c;&z>1_2Nk%;L?TIhfeK%PYp>5N<5wdihxw4-qvVsN6t@bol zDFgi~t`B&ZU3ek!#fXVE5Ao$7AwI+@amT_m2SclwQE{cLcv3kwhokq+!S%>Fe_*(Z z75)vhq@YqZqa~Hf$0S?T@nr_%mV%*aT${~4)6|(P@Bq_Q!VC4tZa`7?ra`4?oV+wSr2`TVSUmKS_>V@3%0*S#!+L=3f@oF=4k9U9xv0p1;Fx&}V;X2J~h zcz^}G3|;s8JyEFR*LB*fPUm+?f+ofnBQ5uK%NrwA+RV_~h<6-mw_wU?NGRI!zNTh% z&>ty6x8&gW75gdW)?p->&%?{*brS|k@b|(>&<^nyO55Pi_q*eK)=J*Uunw2cw--p%E!VXuDa? ztZ$HPKJ6$Sh7!UrpxVBLFSnpZOw$(ftvg!Nk1LVfL+FL(u zh1Abu(oCSmgqQ2IrE;Zz2f2DAD%T4XO6tU&)2IB}vV3{^xpz1MYFEPy_09RP2QvmA zIqw<(UaCnCs!mFX$+3sjnV*(O5)y`jW!*wzF-l^K`Bxgap+0Ej z@c^nf{Ic`6I5#9bcE7fwiiP8JZ9dr3FsD~SBiW_`8{UgFt*{$@qj#E)90JYra>Zs3 z$sCTuzOye2GdTO;4@;wgJK@!ij-|c--insluCR}{#q=D6Xz#nL6;`rkc*UzLTR%Y{ zN2YK;Zcz4YY=+|(0_?E=#~3U@I1fIyRiBF zIeWj=id+b|L;kSMs>NMfeB^(={IdrC;NYJy_$L+olL`OdOqgH0OpSa?FTRhwb<|%A Pe7HEdAEg|=c=LY&YVNkY literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/app_shared/macos.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/packages/flutter_template_images/templates/app_shared/macos.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png new file mode 100644 index 0000000000000000000000000000000000000000..13b35eba55c6dabc3aac36f33d859266c18fa0d0 GIT binary patch literal 5680 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 literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/app_shared/macos.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/packages/flutter_template_images/templates/app_shared/macos.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png new file mode 100644 index 0000000000000000000000000000000000000000..0a3f5fa40fb3d1e0710331a48de5d256da3f275d GIT binary patch literal 520 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 literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/app_shared/macos.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/packages/flutter_template_images/templates/app_shared/macos.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png new file mode 100644 index 0000000000000000000000000000000000000000..2f1632cfddf3d9dade342351e627a0a75609fb46 GIT binary patch literal 2218 zcmV;b2vzrqP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91K%fHv1ONa40RR91KmY&$07g+lumAuE6iGxuRCodHTWf3-RTMruyW6Fu zQYeUM04eX6D5c0FCjKKPrco1(K`<0SL=crI{PC3-^hZU0kQie$gh-5!7z6SH6Q0J% zqot*`H1q{R5fHFYS}dje@;kG=v$L0(yY0?wY2%*c?A&{2?!D*x?m71{of2gv!$5|C z3>qG_BW}7K_yUcT3A5C6QD<+{aq?x;MAUyAiJn#Jv8_zZtQ{P zTRzbL3U9!qVuZzS$xKU10KiW~Bgdcv1-!uAhQxf3a7q+dU6lj?yoO4Lq4TUN4}h{N z*fIM=SS8|C2$(T>w$`t@3Tka!(r!7W`x z-isCVgQD^mG-MJ;XtJuK3V{Vy72GQ83KRWsHU?e*wrhKk=ApIYeDqLi;JI1e zuvv}5^Dc=k7F7?nm3nIw$NVmU-+R>> zyqOR$-2SDpJ}Pt;^RkJytDVXNTsu|mI1`~G7yw`EJR?VkGfNdqK9^^8P`JdtTV&tX4CNcV4 z&N06nZa??Fw1AgQOUSE2AmPE@WO(Fvo`%m`cDgiv(fAeRA%3AGXUbsGw{7Q`cY;1BI#ac3iN$$Hw z0LT0;xc%=q)me?Y*$xI@GRAw?+}>=9D+KTk??-HJ4=A>`V&vKFS75@MKdSF1JTq{S zc1!^8?YA|t+uKigaq!sT;Z!&0F2=k7F0PIU;F$leJLaw2UI6FL^w}OG&!;+b%ya1c z1n+6-inU<0VM-Y_s5iTElq)ThyF?StVcebpGI znw#+zLx2@ah{$_2jn+@}(zJZ{+}_N9BM;z)0yr|gF-4=Iyu@hI*Lk=-A8f#bAzc9f z`Kd6K--x@t04swJVC3JK1cHY-Hq+=|PN-VO;?^_C#;coU6TDP7Bt`;{JTG;!+jj(` zw5cLQ-(Cz-Tlb`A^w7|R56Ce;Wmr0)$KWOUZ6ai0PhzPeHwdl0H(etP zUV`va_i0s-4#DkNM8lUlqI7>YQLf)(lz9Q3Uw`)nc(z3{m5ZE77Ul$V%m)E}3&8L0 z-XaU|eB~Is08eORPk;=<>!1w)Kf}FOVS2l&9~A+@R#koFJ$Czd%Y(ENTV&A~U(IPI z;UY+gf+&6ioZ=roly<0Yst8ck>(M=S?B-ys3mLdM&)ex!hbt+ol|T6CTS+Sc0jv(& z7ijdvFwBq;0a{%3GGwkDKTeG`b+lyj0jjS1OMkYnepCdoosNY`*zmBIo*981BU%%U z@~$z0V`OVtIbEx5pa|Tct|Lg#ZQf5OYMUMRD>Wdxm5SAqV2}3!ceE-M2 z@O~lQ0OiKQp}o9I;?uxCgYVV?FH|?Riri*U$Zi_`V2eiA>l zdSm6;SEm6#T+SpcE8Ro_f2AwxzI z44hfe^WE3!h@W3RDyA_H440cpmYkv*)6m1XazTqw%=E5Xv7^@^^T7Q2wxr+Z2kVYr Date: Thu, 19 May 2022 15:48:10 -0400 Subject: [PATCH 073/118] [flutter_template_images] Minor cleanup (#1951) --- packages/flutter_template_images/CHANGELOG.md | 5 +++++ .../lib/flutter_template_images.dart | 7 ------- packages/flutter_template_images/pubspec.yaml | 4 ++-- 3 files changed, 7 insertions(+), 9 deletions(-) delete mode 100644 packages/flutter_template_images/lib/flutter_template_images.dart diff --git a/packages/flutter_template_images/CHANGELOG.md b/packages/flutter_template_images/CHANGELOG.md index b4ca5d6..9866575 100644 --- a/packages/flutter_template_images/CHANGELOG.md +++ b/packages/flutter_template_images/CHANGELOG.md @@ -1,3 +1,8 @@ +## 4.1.1 + +* Removes empty Dart file. +* Opts in to NNBD (which is a no-op) so it's not flagged by pub.dev. + ## 4.1.0 * Updates package description. diff --git a/packages/flutter_template_images/lib/flutter_template_images.dart b/packages/flutter_template_images/lib/flutter_template_images.dart deleted file mode 100644 index f4413e1..0000000 --- a/packages/flutter_template_images/lib/flutter_template_images.dart +++ /dev/null @@ -1,7 +0,0 @@ -// Copyright 2013 The Flutter Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -library flutter_template_images; - -// There is no source for this package, since it only exists to hold images. diff --git a/packages/flutter_template_images/pubspec.yaml b/packages/flutter_template_images/pubspec.yaml index b163690..be7a955 100644 --- a/packages/flutter_template_images/pubspec.yaml +++ b/packages/flutter_template_images/pubspec.yaml @@ -2,7 +2,7 @@ name: flutter_template_images description: Image files for use in flutter_tools templates without adding binary files to flutter/flutter. repository: https://github.com/flutter/packages/tree/main/packages/flutter_template_images issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+flutter_template_images%22 -version: 4.1.0 +version: 4.1.1 environment: - sdk: ">=2.1.0 <3.0.0" + sdk: ">=2.12.0 <3.0.0" From d24ae017198ff9faa8be7d59a8191da0a0960981 Mon Sep 17 00:00:00 2001 From: Viren Khatri <44755140+werainkhatri@users.noreply.github.com> Date: Tue, 31 May 2022 21:19:10 +0530 Subject: [PATCH 074/118] [various] migrate from ui.hash* to Object.hash* (#1581) * migrate from ui.hash* to Object.hash* --- packages/multicast_dns/CHANGELOG.md | 4 + .../lib/src/resource_record.dart | 91 ++++++------------- packages/multicast_dns/pubspec.yaml | 4 +- packages/multicast_dns/test/decode_test.dart | 4 +- 4 files changed, 37 insertions(+), 66 deletions(-) diff --git a/packages/multicast_dns/CHANGELOG.md b/packages/multicast_dns/CHANGELOG.md index 7331f9b..a20e590 100644 --- a/packages/multicast_dns/CHANGELOG.md +++ b/packages/multicast_dns/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.3.2+1 + +* Migrates from `ui.hash*` to `Object.hash*`. + ## 0.3.2 * Updates package description. diff --git a/packages/multicast_dns/lib/src/resource_record.dart b/packages/multicast_dns/lib/src/resource_record.dart index 7f65d98..46e5731 100644 --- a/packages/multicast_dns/lib/src/resource_record.dart +++ b/packages/multicast_dns/lib/src/resource_record.dart @@ -10,23 +10,6 @@ import 'package:meta/meta.dart'; import 'package:multicast_dns/src/constants.dart'; import 'package:multicast_dns/src/packet.dart'; -// TODO(dnfield): Probably should go with a real hashing function here -// when https://github.com/dart-lang/sdk/issues/11617 is figured out. -const int _seedHashPrime = 2166136261; -const int _multipleHashPrime = 16777619; - -int _combineHash(int current, int hash) => - (current & _multipleHashPrime) ^ hash; - -int _hashValues(List values) { - assert(values.isNotEmpty); - - return values.fold( - _seedHashPrime, - (int current, int next) => _combineHash(current, next), - ); -} - /// Enumeration of support resource record types. abstract class ResourceRecordType { // This class is intended to be used as a namespace, and should not be @@ -171,8 +154,8 @@ class ResourceRecordQuery { } @override - int get hashCode => _hashValues( - [resourceRecordType, fullyQualifiedName.hashCode, questionType]); + int get hashCode => + Object.hash(resourceRecordType, fullyQualifiedName, questionType); @override bool operator ==(Object other) { @@ -209,30 +192,16 @@ abstract class ResourceRecord { '$runtimeType{$name, validUntil: ${DateTime.fromMillisecondsSinceEpoch(validUntil)}, $_additionalInfo}'; @override - bool operator ==(Object other) { - return other is ResourceRecord && _equals(other); - } + int get hashCode => Object.hash(name, validUntil, resourceRecordType); - bool _equals(ResourceRecord other) { - return other.name == name && + @override + bool operator ==(Object other) { + return other is ResourceRecord && + other.name == name && other.validUntil == validUntil && other.resourceRecordType == resourceRecordType; } - @override - int get hashCode { - return _hashValues([ - name.hashCode, - validUntil.hashCode, - resourceRecordType.hashCode, - _hashCode, - ]); - } - - // Subclasses of this class should use _hashValues to create a hash code - // that will then get hashed in with the common values on this class. - int get _hashCode; - /// Low level method for encoding this record into an mDNS packet. /// /// Subclasses should provide the packet format of their encapsulated data @@ -257,14 +226,14 @@ class PtrResourceRecord extends ResourceRecord { String get _additionalInfo => 'domainName: $domainName'; @override - bool _equals(ResourceRecord other) { - return other is PtrResourceRecord && - other.domainName == domainName && - super._equals(other); - } + int get hashCode => Object.hash(domainName.hashCode, super.hashCode); @override - int get _hashCode => _combineHash(_seedHashPrime, domainName.hashCode); + bool operator ==(Object other) { + return super == other && + other is PtrResourceRecord && + other.domainName == domainName; + } @override Uint8List encodeResponseRecord() { @@ -293,12 +262,14 @@ class IPAddressResourceRecord extends ResourceRecord { String get _additionalInfo => 'address: $address'; @override - bool _equals(ResourceRecord other) { - return other is IPAddressResourceRecord && other.address == address; - } + int get hashCode => Object.hash(address.hashCode, super.hashCode); @override - int get _hashCode => _combineHash(_seedHashPrime, address.hashCode); + bool operator ==(Object other) { + return super == other && + other is IPAddressResourceRecord && + other.address == address; + } @override Uint8List encodeResponseRecord() { @@ -335,22 +306,19 @@ class SrvResourceRecord extends ResourceRecord { 'target: $target, port: $port, priority: $priority, weight: $weight'; @override - bool _equals(ResourceRecord other) { - return other is SrvResourceRecord && + int get hashCode => + Object.hash(target, port, priority, weight, super.hashCode); + + @override + bool operator ==(Object other) { + return super == other && + other is SrvResourceRecord && other.target == target && other.port == port && other.priority == priority && other.weight == weight; } - @override - int get _hashCode => _hashValues([ - target.hashCode, - port.hashCode, - priority.hashCode, - weight.hashCode, - ]); - @override Uint8List encodeResponseRecord() { final List data = utf8.encode(target); @@ -380,12 +348,11 @@ class TxtResourceRecord extends ResourceRecord { String get _additionalInfo => 'text: $text'; @override - bool _equals(ResourceRecord other) { - return other is TxtResourceRecord && other.text == text; - } + int get hashCode => Object.hash(text.hashCode, super.hashCode); @override - int get _hashCode => _combineHash(_seedHashPrime, text.hashCode); + bool operator ==(Object other) => + super == other && other is TxtResourceRecord && other.text == text; @override Uint8List encodeResponseRecord() { diff --git a/packages/multicast_dns/pubspec.yaml b/packages/multicast_dns/pubspec.yaml index 00a6a61..c43df34 100644 --- a/packages/multicast_dns/pubspec.yaml +++ b/packages/multicast_dns/pubspec.yaml @@ -2,10 +2,10 @@ name: multicast_dns description: Dart package for performing mDNS queries (e.g. Bonjour, Avahi). repository: https://github.com/flutter/packages/tree/main/packages/multicast_dns issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+multicast_dns%22 -version: 0.3.2 +version: 0.3.2+1 environment: - sdk: ">=2.12.0 <3.0.0" + sdk: ">=2.14.0 <3.0.0" dependencies: meta: ^1.3.0 diff --git a/packages/multicast_dns/test/decode_test.dart b/packages/multicast_dns/test/decode_test.dart index c828dae..442d599 100644 --- a/packages/multicast_dns/test/decode_test.dart +++ b/packages/multicast_dns/test/decode_test.dart @@ -158,7 +158,7 @@ void testValidPackages() { domainName: '______________________._______________.____._____', ), TxtResourceRecord( - '_______________.____._____', + '______________________.____________.____._____', result[1].validUntil, text: 'model=MacBookPro14,3\nosxvers=18\necolor=225,225,223\n', ), @@ -176,7 +176,7 @@ void testValidPackages() { domainName: '______________________._______________.____._____', ), TxtResourceRecord( - '_______________.____._____', + '______________________.____________.____._____', result[1].validUntil, text: (')' * 129) + '\n', ), From 6ae280dd4b78c6d2802fafc758d5dfc5f7e43539 Mon Sep 17 00:00:00 2001 From: RockerFlower Date: Fri, 8 Jul 2022 07:54:04 +0800 Subject: [PATCH 075/118] [flutter_template_images] Add iOS app icon assets (#2266) --- packages/flutter_template_images/CHANGELOG.md | 4 ++++ packages/flutter_template_images/pubspec.yaml | 2 +- .../Icon-App-1024x1024@1x.png | Bin 0 -> 10932 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 0 -> 295 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 0 -> 406 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 0 -> 450 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 0 -> 282 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 0 -> 462 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 0 -> 704 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 0 -> 406 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 0 -> 586 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 0 -> 862 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 0 -> 862 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 0 -> 1674 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 0 -> 762 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 0 -> 1226 bytes .../Icon-App-83.5x83.5@2x.png | Bin 0 -> 1418 bytes .../LaunchImage.imageset/LaunchImage.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@2x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@3x.png | Bin 0 -> 68 bytes 20 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 packages/flutter_template_images/templates/app_shared/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png create mode 100644 packages/flutter_template_images/templates/app_shared/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png create mode 100644 packages/flutter_template_images/templates/app_shared/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png create mode 100644 packages/flutter_template_images/templates/app_shared/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png create mode 100644 packages/flutter_template_images/templates/app_shared/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png create mode 100644 packages/flutter_template_images/templates/app_shared/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png create mode 100644 packages/flutter_template_images/templates/app_shared/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png create mode 100644 packages/flutter_template_images/templates/app_shared/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png create mode 100644 packages/flutter_template_images/templates/app_shared/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png create mode 100644 packages/flutter_template_images/templates/app_shared/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png create mode 100644 packages/flutter_template_images/templates/app_shared/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png create mode 100644 packages/flutter_template_images/templates/app_shared/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png create mode 100644 packages/flutter_template_images/templates/app_shared/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png create mode 100644 packages/flutter_template_images/templates/app_shared/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png create mode 100644 packages/flutter_template_images/templates/app_shared/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png create mode 100644 packages/flutter_template_images/templates/app_shared/ios.tmpl/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png create mode 100644 packages/flutter_template_images/templates/app_shared/ios.tmpl/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png create mode 100644 packages/flutter_template_images/templates/app_shared/ios.tmpl/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png diff --git a/packages/flutter_template_images/CHANGELOG.md b/packages/flutter_template_images/CHANGELOG.md index 9866575..80bc746 100644 --- a/packages/flutter_template_images/CHANGELOG.md +++ b/packages/flutter_template_images/CHANGELOG.md @@ -1,3 +1,7 @@ +## 4.2.0 + +* Adds iOS template app icons, updated to square icons with no transparency. + ## 4.1.1 * Removes empty Dart file. diff --git a/packages/flutter_template_images/pubspec.yaml b/packages/flutter_template_images/pubspec.yaml index be7a955..67f12dc 100644 --- a/packages/flutter_template_images/pubspec.yaml +++ b/packages/flutter_template_images/pubspec.yaml @@ -2,7 +2,7 @@ name: flutter_template_images description: Image files for use in flutter_tools templates without adding binary files to flutter/flutter. repository: https://github.com/flutter/packages/tree/main/packages/flutter_template_images issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+flutter_template_images%22 -version: 4.1.1 +version: 4.2.0 environment: sdk: ">=2.12.0 <3.0.0" diff --git a/packages/flutter_template_images/templates/app_shared/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/packages/flutter_template_images/templates/app_shared/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..dc9ada4725e9b0ddb1deab583e5b5102493aa332 GIT binary patch literal 10932 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 literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/app_shared/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/packages/flutter_template_images/templates/app_shared/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..797d452e458972bab9d994556c8305db4c827017 GIT binary patch literal 406 zcmV;H0crk;P))>cdjpWt&rLJgVp-t?DREyuq1A%0Z4)6_WsQ7{nzjN zo!X zGXV)2i3kcZIL~_j>uIKPK_zib+3T+Nt3Mb&Br)s)UIaA}@p{wDda>7=Q|mGRp7pqY zkJ!7E{MNz$9nOwoVqpFb)}$IP24Wn2JJ=Cw(!`OXJBr45rP>>AQr$6c7slJWvbpNW z@KTwna6d?PP>hvXCcp=4F;=GR@R4E7{4VU^0p4F>v^#A|>07*qoM6N<$f*5nx ACIA2c literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/app_shared/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/packages/flutter_template_images/templates/app_shared/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..6ed2d933e1120817fe9182483a228007b18ab6ae GIT binary patch literal 450 zcmV;z0X_bSP)iGWQ_5NJQ_~rNh*z)}eT%KUb z`7gNk0#AwF^#0T0?hIa^`~Ck;!}#m+_uT050aTR(J!bU#|IzRL%^UsMS#KsYnTF*!YeDOytlP4VhV?b} z%rz_<=#CPc)tU1MZTq~*2=8~iZ!lSa<{9b@2Jl;?IEV8)=fG217*|@)CCYgFze-x? zIFODUIA>nWKpE+bn~n7;-89sa>#DR>TSlqWk*!2hSN6D~Qb#VqbP~4Fk&m`@1$JGr zXPIdeRE&b2Thd#{MtDK$px*d3-Wx``>!oimf%|A-&-q*6KAH)e$3|6JV%HX{Hig)k suLT-RhftRq8b9;(V=235Wa|I=027H2wCDra;{X5v07*qoM6N<$f;9x^2LJ#7 literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/app_shared/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/packages/flutter_template_images/templates/app_shared/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..4cd7b0099ca80c806f8fe495613e8d6c69460d76 GIT binary patch literal 282 zcmV+#0p(^bcu7P-R4C8Q z&e;xxFbF_Vrezo%_kH*OKhshZ6BFpG-Y1e10`QXJKbND7AMQ&cMj60B5TNObaZxYybcN07*qoM6N<$g3m;S%K!iX literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/app_shared/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/packages/flutter_template_images/templates/app_shared/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..fe730945a01f64a61e2235dbe3f45b08f7729182 GIT binary patch literal 462 zcmV;<0WtoGP)-}iV`2<;=$?g5M=KQbZ{F&YRNy7Nn@%_*5{gvDM0aKI4?ESmw z{NnZg)A0R`+4?NF_RZexyVB&^^ZvN!{I28tr{Vje;QNTz`dG&Jz0~Ek&f2;*Z7>B|cg}xYpxEFY+0YrKLF;^Q+-HreN0P{&i zK~zY`?b7ECf-n?@;d<&orQ*Q7KoR%4|C>{W^h6@&01>0SKS`dn{Q}GT%Qj_{PLZ_& zs`MFI#j-(>?bvdZ!8^xTwlY{qA)T4QLbY@j(!YJ7aXJervHy6HaG_2SB`6CC{He}f zHVw(fJWApwPq!6VY7r1w-Fs)@ox~N+q|w~e;JI~C4Vf^@d>Wvj=fl`^u9x9wd9 zR%3*Q+)t%S!MU_`id^@&Y{y7-r98lZX0?YrHlfmwb?#}^1b{8g&KzmkE(L>Z&)179 zp<)v6Y}pRl100G2FL_t(o!|l{-Q-VMg#&MKg7c{O0 z2wJImOS3Gy*Z2Qifdv~JYOp;v+U)a|nLoc7hNH;I$;lzDt$}rkaFw1mYK5_0Q(Sut zvbEloxON7$+HSOgC9Z8ltuC&0OSF!-mXv5caV>#bc3@hBPX@I$58-z}(ZZE!t-aOG zpjNkbau@>yEzH(5Yj4kZiMH32XI!4~gVXNnjAvRx;Sdg^`>2DpUEwoMhTs_st8pKG z(%SHyHdU&v%f36~uERh!bd`!T2dw;z6PrOTQ7Vt*#9F2uHlUVnb#ev_o^fh}Dzmq} zWtlk35}k=?xj28uO|5>>$yXadTUE@@IPpgH`gJ~Ro4>jd1IF|(+IX>8M4Ps{PNvmI zNj4D+XgN83gPt_Gm}`Ybv{;+&yu-C(Grdiahmo~BjG-l&mWM+{e5M1sm&=xduwgM9 z`8OEh`=F3r`^E{n_;%9weN{cf2%7=VzC@cYj+lg>+3|D|_1C@{hcU(DyQG_BvBWe? zvTv``=%b1zrol#=R`JB)>cdjpWt&rLJgVp-t?DREyuq1A%0Z4)6_WsQ7{nzjN zo!X zGXV)2i3kcZIL~_j>uIKPK_zib+3T+Nt3Mb&Br)s)UIaA}@p{wDda>7=Q|mGRp7pqY zkJ!7E{MNz$9nOwoVqpFb)}$IP24Wn2JJ=Cw(!`OXJBr45rP>>AQr$6c7slJWvbpNW z@KTwna6d?PP>hvXCcp=4F;=GR@R4E7{4VU^0p4F>v^#A|>07*qoM6N<$f*5nx ACIA2c literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/app_shared/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/packages/flutter_template_images/templates/app_shared/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..502f463a9bc882b461c96aadf492d1729e49e725 GIT binary patch literal 586 zcmV-Q0=4~#P)+}#`wDE{8-2Mebf5<{{PqV{TgVcv*r8?UZ3{-|G?_}T*&y;@cqf{ z{Q*~+qr%%p!1pS*_Uicl#q9lc(D`!D`LN62sNwq{oYw(Wmhk)k<@f$!$@ng~_5)Ru z0Z)trIA5^j{DIW^c+vT2%lW+2<(RtE2wR;4O@)Tm`Xr*?A(qYoM}7i5Yxw>D(&6ou zxz!_Xr~yNF+waPe00049Nkl*;a!v6h%{rlvIH#gW3s8p;bFr=l}mRqpW2h zw=OA%hdyL~z+UHOzl0eKhEr$YYOL-c-%Y<)=j?(bzDweB7{b+%_ypvm_cG{SvM=DK zhv{K@m>#Bw>2W$eUI#iU)Wdgs8Y3U+A$Gd&{+j)d)BmGKx+43U_!tik_YlN)>$7G! zhkE!s;%oku3;IwG3U^2kw?z+HM)jB{@zFhK8P#KMSytSthr+4!c(5c%+^UBn`0X*2 zy3(k600_CSZj?O$Qu%&$;|TGUJrptR(HzyIx>5E(2r{eA(<6t3e3I0B)7d6s7?Z5J zZ!rtKvA{MiEBm&KFtoifx>5P^Z=vl)95XJn()aS5%ad(s?4-=Tkis9IGu{`Fy8r+H07*qoM6N<$f20Z)wqMt%V?S?~D#06};F zA3KcL`Wb+>5ObvgQIG&ig8(;V04hz?@cqy3{mSh8o!|U|)cI!1_+!fWH@o*8vh^CU z^ws0;(c$gI+2~q^tO#GDHf@=;DncUw00J^eL_t(&-tE|HQ`%4vfZ;WsBqu-$0nu1R zq^Vj;p$clf^?twn|KHO+IGt^q#a3X?w9dXC@*yxhv&l}F322(8Y1&=P&I}~G@#h6; z1CV9ecD9ZEe87{{NtI*)_aJ<`kJa z?5=RBtFF50s;jQLFil-`)m2wrb=6h(&brpj%nG_U&ut~$?8Rokzxi8zJoWr#2dto5 zOX_URcc<1`Iky+jc;A%Vzx}1QU{2$|cKPom2Vf1{8m`vja4{F>HS?^Nc^rp}xo+Nh zxd}eOm`fm3@MQC1< zIk&aCjb~Yh%5+Yq0`)D;q{#-Uqlv*o+Oor zE!I71Z@ASH3grl8&P^L0WpavHoP|UX4e?!igT`4?AZk$hu*@%6WJ;zDOGlw7kj@ zY5!B-0ft0f?Lgb>C;$Ke07*qoM6N<$f~t1N9smFU literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/app_shared/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/packages/flutter_template_images/templates/app_shared/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0ec303439225b78712f49115768196d8d76f6790 GIT binary patch literal 862 zcmV-k1EKthP)20Z)wqMt%V?S?~D#06};F zA3KcL`Wb+>5ObvgQIG&ig8(;V04hz?@cqy3{mSh8o!|U|)cI!1_+!fWH@o*8vh^CU z^ws0;(c$gI+2~q^tO#GDHf@=;DncUw00J^eL_t(&-tE|HQ`%4vfZ;WsBqu-$0nu1R zq^Vj;p$clf^?twn|KHO+IGt^q#a3X?w9dXC@*yxhv&l}F322(8Y1&=P&I}~G@#h6; z1CV9ecD9ZEe87{{NtI*)_aJ<`kJa z?5=RBtFF50s;jQLFil-`)m2wrb=6h(&brpj%nG_U&ut~$?8Rokzxi8zJoWr#2dto5 zOX_URcc<1`Iky+jc;A%Vzx}1QU{2$|cKPom2Vf1{8m`vja4{F>HS?^Nc^rp}xo+Nh zxd}eOm`fm3@MQC1< zIk&aCjb~Yh%5+Yq0`)D;q{#-Uqlv*o+Oor zE!I71Z@ASH3grl8&P^L0WpavHoP|UX4e?!igT`4?AZk$hu*@%6WJ;zDOGlw7kj@ zY5!B-0ft0f?Lgb>C;$Ke07*qoM6N<$f~t1N9smFU literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/app_shared/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/packages/flutter_template_images/templates/app_shared/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..e9f5fea27c705180eb716271f41b582e76dcbd90 GIT binary patch literal 1674 zcmV;526g#~P){YQnis^a@{&-nmRmq)<&%Mztj67_#M}W?l>kYSliK<%xAp;0j{!}J0!o7b zE>q9${Lb$D&h7k=+4=!ek^n+`0zq>LL1O?lVyea53S5x`Nqqo2YyeuIrQrJj9XjOp z{;T5qbj3}&1vg1VK~#9!?b~^C5-}JC@Pyrv-6dSEqJqT}#j9#dJ@GzT@B8}x zU&J@bBI>f6w6en+CeI)3^kC*U?}X%OD8$Fd$H&LV$H&LV$H&LV#|K5~mLYf|VqzOc zkc7qL~0sOYuM{tG`rYEDV{DWY`Z8&)kW*hc2VkBuY+^Yx&92j&StN}Wp=LD zxoGxXw6f&8sB^u})h@b@z0RBeD`K7RMR9deyL(ZJu#39Z>rT)^>v}Khq8U-IbIvT> z?4pV9qGj=2)TNH3d)=De<+^w;>S7m_eFKTvzeaBeir45xY!^m!FmxnljbSS_3o=g( z->^wC9%qkR{kbGnW8MfFew_o9h3(r55Is`L$8KI@d+*%{=Nx+FXJ98L0PjFIu;rGnnfY zn1R5Qnp<{Jq0M1vX=X&F8gtLmcWv$1*M@4ZfF^9``()#hGTeKeP`1!iED ztNE(TN}M5}3Bbc*d=FIv`DNv&@|C6yYj{sSqUj5oo$#*0$7pu|Dd2TLI>t5%I zIa4Dvr(iayb+5x=j*Vum9&irk)xV1`t509lnPO0%skL8_1c#Xbamh(2@f?4yUI zhhuT5<#8RJhGz4%b$`PJwKPAudsm|at?u;*hGgnA zU1;9gnxVBC)wA(BsB`AW54N{|qmikJR*%x0c`{LGsSfa|NK61pYH(r-UQ4_JXd!Rsz)=k zL{GMc5{h138)fF5CzHEDM>+FqY)$pdN3}Ml+riTgJOLN0F*Vh?{9ESR{SVVg>*>=# zix;VJHPtvFFCRY$Ks*F;VX~%*r9F)W`PmPE9F!(&s#x07n2<}?S{(ygpXgX-&B&OM zONY&BRQ(#%0%jeQs?oJ4P!p*R98>qCy5p8w>_gpuh39NcOlp)(wOoz0sY-Qz55eB~ z7OC-fKBaD1sE3$l-6QgBJO!n?QOTza`!S_YK z_v-lm^7{VO^8Q@M_^8F)09Ki6%=s?2_5eupee(w1FB%aqSweusQ-T+CH0Xt{` zFjMvW{@C&TB)k25()nh~_yJ9coBRL(0oO@HK~z}7?bm5j;y@69;bvlHb2tf!$ReA~x{22wTq550 z?f?Hnw(;m3ip30;QzdV~7pi!wyMYhDtXW#cO7T>|f=bdFhu+F!zMZ2UFj;GUKX7tI z;hv3{q~!*pMj75WP_c}>6)IWvg5_yyg<9Op()eD1hWC19M@?_9_MHec{Z8n3FaF{8 z;u`Mw0ly(uE>*CgQYv{be6ab2LWhlaH1^iLIM{olnag$78^Fd}%dR7;JECQ+hmk|o z!u2&!3MqPfP5ChDSkFSH8F2WVOEf0(E_M(JL17G}Y+fg0_IuW%WQ zG(mG&u?|->YSdk0;8rc{yw2@2Z&GA}z{Wb91Ooz9VhA{b2DYE7RmG zjL}?eq#iX%3#k;JWMx_{^2nNax`xPhByFiDX+a7uTGU|otOvIAUy|dEKkXOm-`aWS z27pUzD{a)Ct<6p{{3)+lq@i`t@%>-wT4r?*S}k)58e09WZYP0{{R3FC5Sl00039P)t-s|Ns9~ z#rP?<_5oL$Q^olD{r_0T`27C={r>*`|Nj71npVa5OTzc(_WfbW_({R{p56NV{r*M2 z_xt?)2V0#0NsfV0u>{42ctGP(8vQj-Btk1n|O0ZD=YLwd&R{Ko41Gr9H= zY@z@@bOAMB5Ltl$E>bJJ{>JP30ZxkmI%?eW{k`b?Wy<&gOo;dS`~CR$Vwb@XWtR|N zi~t=w02?-0&j0TD{>bb6sNwsK*!p?V`RMQUl(*DVjk-9Cx+-z1KXab|Ka2oXhX5f% z`$|e!000AhNklrxs)5QTeTVRiEmz~MKK1WAjCw(c-JK6eox;2O)?`? zTG`AHia671e^vgmp!llKp|=5sVHk#C7=~epA~VAf-~%aPC=%Qw01h8mnSZ|p?hz91 z7p83F3%LVu9;S$tSI$C^%^yud1dfTM_6p2|+5Ejp$bd`GDvbR|xit>i!ZD&F>@CJrPmu*UjD&?DfZs=$@e3FQA(vNiU+$A*%a} z?`XcG2jDxJ_ZQ#Md`H{4Lpf6QBDp81_KWZ6Tk#yCy1)32zO#3<7>b`eT7UyYH1eGz z;O(rH$=QR*L%%ZcBpc=eGua?N55nD^K(8<#gl2+pN_j~b2MHs4#mcLmv%DkspS-3< zpI1F=^9siI0s-;IN_IrA;5xm~3?3!StX}pUv0vkxMaqm+zxrg7X7(I&*N~&dEd0kD z-FRV|g=|QuUsuh>-xCI}vD2imzYIOIdcCVV=$Bz@*u0+Bs<|L^)32nN*=wu3n%Ynw z@1|eLG>!8ruU1pFXUfb`j>(=Gy~?Rn4QJ-c3%3T|(Frd!bI`9u&zAnyFYTqlG#&J7 zAkD(jpw|oZLNiA>;>hgp1KX7-wxC~31II47gc zHcehD6Uxlf%+M^^uN5Wc*G%^;>D5qT{>=uxUhX%WJu^Z*(_Wq9y}npFO{Hhb>s6<9 zNi0pHXWFaVZnb)1+RS&F)xOv6&aeILcI)`k#0YE+?e)5&#r7J#c`3Z7x!LpTc01dx zrdC3{Z;joZ^KN&))zB_i)I9fWedoN>Zl-6_Iz+^G&*ak2jpF07*qoM6N<$f;w%0(f|Me literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/app_shared/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/packages/flutter_template_images/templates/app_shared/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0467bf12aa4d28f374bb26596605a46dcbb3e7c8 GIT binary patch literal 1418 zcmV;51$Fv~P)q zKfU)WzW*n(@|xWGCA9ScMt*e9`2kdxPQ&&>|-UCa7_51w+ zLUsW@ZzZSW0y$)Hp~e9%PvP|a03ks1`~K?q{u;6NC8*{AOqIUq{CL&;p56Lf$oQGq z^={4hPQv)y=I|4n+?>7Fim=dxt1 z2H+Dm+1+fh+IF>G0SjJMkQQre1x4|G*Z==(Ot&kCnUrL4I(rf(ucITwmuHf^hXiJT zkdTm&kdTm&kdTm&kdP`esgWG0BcWCVkVZ&2dUwN`cgM8QJb`Z7Z~e<&Yj2(}>Tmf` zm1{eLgw!b{bXkjWbF%dTkTZEJWyWOb##Lfw4EK2}<0d6%>AGS{po>WCOy&f$Tay_> z?NBlkpo@s-O;0V%Y_Xa-G#_O08q5LR*~F%&)}{}r&L%Sbs8AS4t7Y0NEx*{soY=0MZExqA5XHQkqi#4gW3 zqODM^iyZl;dvf)-bOXtOru(s)Uc7~BFx{w-FK;2{`VA?(g&@3z&bfLFyctOH!cVsF z7IL=fo-qBndRUm;kAdXR4e6>k-z|21AaN%ubeVrHl*<|s&Ax@W-t?LR(P-24A5=>a z*R9#QvjzF8n%@1Nw@?CG@6(%>+-0ASK~jEmCV|&a*7-GKT72W<(TbSjf)&Eme6nGE z>Gkj4Sq&2e+-G%|+NM8OOm5zVl9{Z8Dd8A5z3y8mZ=4Bv4%>as_{9cN#bm~;h>62( zdqY93Zy}v&c4n($Vv!UybR8ocs7#zbfX1IY-*w~)p}XyZ-SFC~4w>BvMVr`dFbelV{lLL0bx7@*ZZdebr3`sP;? zVImji)kG)(6Juv0lz@q`F!k1FE;CQ(D0iG$wchPbKZQELlsZ#~rt8#90Y_Xh&3U-< z{s<&cCV_1`^TD^ia9!*mQDq& zn2{r`j};V|uV%_wsP!zB?m%;FeaRe+X47K0e+KE!8C{gAWF8)lCd1u1%~|M!XNRvw zvtqy3iz0WSpWdhn6$hP8PaRBmp)q`#PCA`Vd#Tc$@f1tAcM>f_I@bC)hkI9|o(Iqv zo}Piadq!j76}004RBio<`)70k^`K1NK)q>w?p^C6J2ZC!+UppiK6&y3Kmbv&O!oYF z34$0Z;QO!JOY#!`qyGH<3Pd}Pt@q*A0V=3SVtWKRR8d8Z&@)3qLPA19LPA19LPEUC YUoZo%k(ykuW&i*H07*qoM6N<$f+CH{y8r+H literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/app_shared/ios.tmpl/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/packages/flutter_template_images/templates/app_shared/ios.tmpl/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/app_shared/ios.tmpl/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/packages/flutter_template_images/templates/app_shared/ios.tmpl/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/app_shared/ios.tmpl/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/packages/flutter_template_images/templates/app_shared/ios.tmpl/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 From b3bc6bc3ad652d4e45d300a0063d0094a23f75ac Mon Sep 17 00:00:00 2001 From: Jonah Williams Date: Mon, 8 Aug 2022 21:28:05 -0700 Subject: [PATCH 076/118] add StandardMessageCodec extracted from Flutter SDK (#2434) --- packages/standard_message_codec/.gitignore | 6 + packages/standard_message_codec/AUTHORS | 6 + packages/standard_message_codec/CHANGELOG.md | 3 + packages/standard_message_codec/LICENSE | 25 ++ packages/standard_message_codec/README.md | 52 +++ .../standard_message_codec/example/README.md | 3 + .../example/lib/readme_excerpts.dart | 20 + .../example/pubspec.yaml | 11 + .../lib/src/serialization.dart | 285 ++++++++++++ .../lib/standard_message_codec.dart | 406 ++++++++++++++++++ packages/standard_message_codec/pubspec.yaml | 11 + .../test/standard_message_codec_test.dart | 165 +++++++ 12 files changed, 993 insertions(+) create mode 100644 packages/standard_message_codec/.gitignore create mode 100644 packages/standard_message_codec/AUTHORS create mode 100644 packages/standard_message_codec/CHANGELOG.md create mode 100644 packages/standard_message_codec/LICENSE create mode 100644 packages/standard_message_codec/README.md create mode 100644 packages/standard_message_codec/example/README.md create mode 100644 packages/standard_message_codec/example/lib/readme_excerpts.dart create mode 100644 packages/standard_message_codec/example/pubspec.yaml create mode 100644 packages/standard_message_codec/lib/src/serialization.dart create mode 100644 packages/standard_message_codec/lib/standard_message_codec.dart create mode 100644 packages/standard_message_codec/pubspec.yaml create mode 100644 packages/standard_message_codec/test/standard_message_codec_test.dart diff --git a/packages/standard_message_codec/.gitignore b/packages/standard_message_codec/.gitignore new file mode 100644 index 0000000..9331cd4 --- /dev/null +++ b/packages/standard_message_codec/.gitignore @@ -0,0 +1,6 @@ +# Libraries should not include pubspec.lock, per https://dart.dev/guides/libraries/private-files#pubspeclock. +/pubspec.lock +**/doc/api/ +.dart_tool/ +.packages +build/ diff --git a/packages/standard_message_codec/AUTHORS b/packages/standard_message_codec/AUTHORS new file mode 100644 index 0000000..557dff9 --- /dev/null +++ b/packages/standard_message_codec/AUTHORS @@ -0,0 +1,6 @@ +# Below is a list of people and organizations that have contributed +# to the Flutter project. Names should be added to the list like so: +# +# Name/Organization + +Google Inc. diff --git a/packages/standard_message_codec/CHANGELOG.md b/packages/standard_message_codec/CHANGELOG.md new file mode 100644 index 0000000..a9888a2 --- /dev/null +++ b/packages/standard_message_codec/CHANGELOG.md @@ -0,0 +1,3 @@ +## 0.0.1 + +* Initial release of standard message codec extracted from the Flutter SDK. diff --git a/packages/standard_message_codec/LICENSE b/packages/standard_message_codec/LICENSE new file mode 100644 index 0000000..c6823b8 --- /dev/null +++ b/packages/standard_message_codec/LICENSE @@ -0,0 +1,25 @@ +Copyright 2013 The Flutter Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/packages/standard_message_codec/README.md b/packages/standard_message_codec/README.md new file mode 100644 index 0000000..b67b977 --- /dev/null +++ b/packages/standard_message_codec/README.md @@ -0,0 +1,52 @@ +An efficient and schemaless binary format used by the Flutter SDK. + +## Features + +### Efficiency + +The standard message codec is a binary format, as opposed to text based formats +like JSON. Consider the following snippet of JSON: + +```json +{ + "data": [1, 2, 3, 4], +} +``` + +In order for this message to be decoded into a Dart map, a utf8 binary file must +first be parsed and validated into a Dart string. Then a second pass is performed +which looks for specific characters that indicate JSON structures - for example +"{" and "}". No sizes or lengths are known ahead of time while, parsing, so the +resulting Dart list created for the "data" key is append to as decoding happens. + +In contrast, decoding the standard message codec version of this message avoids +utf8 decoding, instead operating on the bytes themselves. The only string constructed +will be for the "data" key. The length of the list in the data field is encoded in +the structure, meaning the correct length object can be allocated and filled in +as decoding happens. + +### Schemaless + +Using standard message codec does not require a schema (like protobuf) or any +generated code. This makes it easy to use for dynamic messages and simplifies +the integration into existing codebases. + +The tradeoff for this ease of use is that it becomes the application's +responsibility to verify the structure of messages sent/received. There is also +no automatic backwards compatibility like protobuf. + +## Getting started + +standard_message_codec can be used to encode and decode messages in either Flutter +or pure Dart applications. + + +```dart +void main() { + final ByteData? data = const StandardMessageCodec().encodeMessage({ + 'foo': true, + 3: 'fizz', + }); + print('The encoded message is $data'); +} +``` diff --git a/packages/standard_message_codec/example/README.md b/packages/standard_message_codec/example/README.md new file mode 100644 index 0000000..39712c7 --- /dev/null +++ b/packages/standard_message_codec/example/README.md @@ -0,0 +1,3 @@ +# example_standard_message_codec + +A sample app for demonstrating the StandardMessageCodec diff --git a/packages/standard_message_codec/example/lib/readme_excerpts.dart b/packages/standard_message_codec/example/lib/readme_excerpts.dart new file mode 100644 index 0000000..f2d4412 --- /dev/null +++ b/packages/standard_message_codec/example/lib/readme_excerpts.dart @@ -0,0 +1,20 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// This file exists solely to host compiled excerpts for README.md, and is not +// intended for use as an actual example application. + +// #docregion Encoding +import 'dart:typed_data'; +import 'package:standard_message_codec/standard_message_codec.dart'; +// #enddocregion Encoding + +void main() { + final ByteData? data = + const StandardMessageCodec().encodeMessage({ + 'foo': true, + 3: 'fizz', + }); + print('The encoded message is $data'); +} diff --git a/packages/standard_message_codec/example/pubspec.yaml b/packages/standard_message_codec/example/pubspec.yaml new file mode 100644 index 0000000..4f81a03 --- /dev/null +++ b/packages/standard_message_codec/example/pubspec.yaml @@ -0,0 +1,11 @@ +name: standard_message_codec_examples +description: Example code for standard message codec usage +version: 0.0.1 +publish_to: none + +environment: + sdk: ">=2.17.0 <3.0.0" + +dependencies: + standard_message_codec: + path: ../ diff --git a/packages/standard_message_codec/lib/src/serialization.dart b/packages/standard_message_codec/lib/src/serialization.dart new file mode 100644 index 0000000..cdcf9b3 --- /dev/null +++ b/packages/standard_message_codec/lib/src/serialization.dart @@ -0,0 +1,285 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:math' as math; +import 'dart:typed_data'; + +export 'dart:typed_data' + show + ByteData, + Endian, + Float32List, + Float64List, + Int32List, + Int64List, + Uint8List; + +/// Write-only buffer for incrementally building a [ByteData] instance. +/// +/// A WriteBuffer instance can be used only once. Attempts to reuse will result +/// in [StateError]s being thrown. +/// +/// The byte order used is [Endian.host] throughout. +class WriteBuffer { + /// Creates an interface for incrementally building a [ByteData] instance. + /// [startCapacity] determines the start size of the [WriteBuffer] in bytes. + /// The closer that value is to the real size used, the better the + /// performance. + factory WriteBuffer({int startCapacity = 8}) { + assert(startCapacity > 0); + final ByteData eightBytes = ByteData(8); + final Uint8List eightBytesAsList = eightBytes.buffer.asUint8List(); + return WriteBuffer._( + Uint8List(startCapacity), eightBytes, eightBytesAsList); + } + + WriteBuffer._(this._buffer, this._eightBytes, this._eightBytesAsList); + + Uint8List _buffer; + int _currentSize = 0; + bool _isDone = false; + final ByteData _eightBytes; + final Uint8List _eightBytesAsList; + static final Uint8List _zeroBuffer = Uint8List(8); + + void _add(int byte) { + if (_currentSize == _buffer.length) { + _resize(); + } + _buffer[_currentSize] = byte; + _currentSize += 1; + } + + void _append(Uint8List other) { + final int newSize = _currentSize + other.length; + if (newSize >= _buffer.length) { + _resize(newSize); + } + _buffer.setRange(_currentSize, newSize, other); + _currentSize += other.length; + } + + void _addAll(Uint8List data, [int start = 0, int? end]) { + final int newEnd = end ?? _eightBytesAsList.length; + final int newSize = _currentSize + (newEnd - start); + if (newSize >= _buffer.length) { + _resize(newSize); + } + _buffer.setRange(_currentSize, newSize, data); + _currentSize = newSize; + } + + void _resize([int? requiredLength]) { + final int doubleLength = _buffer.length * 2; + final int newLength = math.max(requiredLength ?? 0, doubleLength); + final Uint8List newBuffer = Uint8List(newLength); + newBuffer.setRange(0, _buffer.length, _buffer); + _buffer = newBuffer; + } + + /// Write a Uint8 into the buffer. + void putUint8(int byte) { + assert(!_isDone); + _add(byte); + } + + /// Write a Uint16 into the buffer. + void putUint16(int value, {Endian? endian}) { + assert(!_isDone); + _eightBytes.setUint16(0, value, endian ?? Endian.host); + _addAll(_eightBytesAsList, 0, 2); + } + + /// Write a Uint32 into the buffer. + void putUint32(int value, {Endian? endian}) { + assert(!_isDone); + _eightBytes.setUint32(0, value, endian ?? Endian.host); + _addAll(_eightBytesAsList, 0, 4); + } + + /// Write an Int32 into the buffer. + void putInt32(int value, {Endian? endian}) { + assert(!_isDone); + _eightBytes.setInt32(0, value, endian ?? Endian.host); + _addAll(_eightBytesAsList, 0, 4); + } + + /// Write an Int64 into the buffer. + void putInt64(int value, {Endian? endian}) { + assert(!_isDone); + _eightBytes.setInt64(0, value, endian ?? Endian.host); + _addAll(_eightBytesAsList, 0, 8); + } + + /// Write an Float64 into the buffer. + void putFloat64(double value, {Endian? endian}) { + assert(!_isDone); + _alignTo(8); + _eightBytes.setFloat64(0, value, endian ?? Endian.host); + _addAll(_eightBytesAsList); + } + + /// Write all the values from a [Uint8List] into the buffer. + void putUint8List(Uint8List list) { + assert(!_isDone); + _append(list); + } + + /// Write all the values from an [Int32List] into the buffer. + void putInt32List(Int32List list) { + assert(!_isDone); + _alignTo(4); + _append(list.buffer.asUint8List(list.offsetInBytes, 4 * list.length)); + } + + /// Write all the values from an [Int64List] into the buffer. + void putInt64List(Int64List list) { + assert(!_isDone); + _alignTo(8); + _append(list.buffer.asUint8List(list.offsetInBytes, 8 * list.length)); + } + + /// Write all the values from a [Float32List] into the buffer. + void putFloat32List(Float32List list) { + assert(!_isDone); + _alignTo(4); + _append(list.buffer.asUint8List(list.offsetInBytes, 4 * list.length)); + } + + /// Write all the values from a [Float64List] into the buffer. + void putFloat64List(Float64List list) { + assert(!_isDone); + _alignTo(8); + _append(list.buffer.asUint8List(list.offsetInBytes, 8 * list.length)); + } + + void _alignTo(int alignment) { + assert(!_isDone); + final int mod = _currentSize % alignment; + if (mod != 0) { + _addAll(_zeroBuffer, 0, alignment - mod); + } + } + + /// Finalize and return the written [ByteData]. + ByteData done() { + if (_isDone) { + throw StateError( + 'done() must not be called more than once on the same $runtimeType.'); + } + final ByteData result = _buffer.buffer.asByteData(0, _currentSize); + _buffer = Uint8List(0); + _isDone = true; + return result; + } +} + +/// Read-only buffer for reading sequentially from a [ByteData] instance. +/// +/// The byte order used is [Endian.host] throughout. +class ReadBuffer { + /// Creates a [ReadBuffer] for reading from the specified [data]. + ReadBuffer(this.data); + + /// The underlying data being read. + final ByteData data; + + /// The position to read next. + int _position = 0; + + /// Whether the buffer has data remaining to read. + bool get hasRemaining => _position < data.lengthInBytes; + + /// Reads a Uint8 from the buffer. + int getUint8() { + return data.getUint8(_position++); + } + + /// Reads a Uint16 from the buffer. + int getUint16({Endian? endian}) { + final int value = data.getUint16(_position, endian ?? Endian.host); + _position += 2; + return value; + } + + /// Reads a Uint32 from the buffer. + int getUint32({Endian? endian}) { + final int value = data.getUint32(_position, endian ?? Endian.host); + _position += 4; + return value; + } + + /// Reads an Int32 from the buffer. + int getInt32({Endian? endian}) { + final int value = data.getInt32(_position, endian ?? Endian.host); + _position += 4; + return value; + } + + /// Reads an Int64 from the buffer. + int getInt64({Endian? endian}) { + final int value = data.getInt64(_position, endian ?? Endian.host); + _position += 8; + return value; + } + + /// Reads a Float64 from the buffer. + double getFloat64({Endian? endian}) { + _alignTo(8); + final double value = data.getFloat64(_position, endian ?? Endian.host); + _position += 8; + return value; + } + + /// Reads the given number of Uint8s from the buffer. + Uint8List getUint8List(int length) { + final Uint8List list = + data.buffer.asUint8List(data.offsetInBytes + _position, length); + _position += length; + return list; + } + + /// Reads the given number of Int32s from the buffer. + Int32List getInt32List(int length) { + _alignTo(4); + final Int32List list = + data.buffer.asInt32List(data.offsetInBytes + _position, length); + _position += 4 * length; + return list; + } + + /// Reads the given number of Int64s from the buffer. + Int64List getInt64List(int length) { + _alignTo(8); + final Int64List list = + data.buffer.asInt64List(data.offsetInBytes + _position, length); + _position += 8 * length; + return list; + } + + /// Reads the given number of Float32s from the buffer + Float32List getFloat32List(int length) { + _alignTo(4); + final Float32List list = + data.buffer.asFloat32List(data.offsetInBytes + _position, length); + _position += 4 * length; + return list; + } + + /// Reads the given number of Float64s from the buffer. + Float64List getFloat64List(int length) { + _alignTo(8); + final Float64List list = + data.buffer.asFloat64List(data.offsetInBytes + _position, length); + _position += 8 * length; + return list; + } + + void _alignTo(int alignment) { + final int mod = _position % alignment; + if (mod != 0) { + _position += alignment - mod; + } + } +} diff --git a/packages/standard_message_codec/lib/standard_message_codec.dart b/packages/standard_message_codec/lib/standard_message_codec.dart new file mode 100644 index 0000000..3ecddf4 --- /dev/null +++ b/packages/standard_message_codec/lib/standard_message_codec.dart @@ -0,0 +1,406 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:convert'; + +import 'src/serialization.dart'; + +export 'src/serialization.dart' show ReadBuffer, WriteBuffer; + +const int _writeBufferStartCapacity = 64; + +/// A message encoding/decoding mechanism. +/// +/// Both operations throw an exception, if conversion fails. Such situations +/// should be treated as programming errors. +/// +/// See also: +/// +/// * [BasicMessageChannel], which use [MessageCodec]s for communication +/// between Flutter and platform plugins. +abstract class MessageCodec { + /// Encodes the specified [message] in binary. + /// + /// Returns null if the message is null. + ByteData? encodeMessage(T message); + + /// Decodes the specified [message] from binary. + /// + /// Returns null if the message is null. + T? decodeMessage(ByteData? message); +} + +/// [MessageCodec] using the Flutter standard binary encoding. +/// +/// Supported messages are acyclic values of these forms: +/// +/// * null +/// * [bool]s +/// * [num]s +/// * [String]s +/// * [Uint8List]s, [Int32List]s, [Int64List]s, [Float64List]s +/// * [List]s of supported values +/// * [Map]s from supported values to supported values +/// +/// Decoded values will use `List` and `Map` +/// irrespective of content. +/// +/// The type returned from [decodeMessage] is `dynamic` (not `Object?`), which +/// means *no type checking is performed on its return value*. It is strongly +/// recommended that the return value be immediately cast to a known type to +/// prevent runtime errors due to typos that the type checker could otherwise +/// catch. +/// +/// The codec is extensible by subclasses overriding [writeValue] and +/// [readValueOfType]. +/// +/// ## Android specifics +/// +/// On Android, messages are represented as follows: +/// +/// * null: null +/// * [bool]\: `java.lang.Boolean` +/// * [int]\: `java.lang.Integer` for values that are representable using 32-bit +/// two's complement; `java.lang.Long` otherwise +/// * [double]\: `java.lang.Double` +/// * [String]\: `java.lang.String` +/// * [Uint8List]\: `byte[]` +/// * [Int32List]\: `int[]` +/// * [Int64List]\: `long[]` +/// * [Float64List]\: `double[]` +/// * [List]\: `java.util.ArrayList` +/// * [Map]\: `java.util.HashMap` +/// +/// When sending a `java.math.BigInteger` from Java, it is converted into a +/// [String] with the hexadecimal representation of the integer. (The value is +/// tagged as being a big integer; subclasses of this class could be made to +/// support it natively; see the discussion at [writeValue].) This codec does +/// not support sending big integers from Dart. +/// +/// ## iOS specifics +/// +/// On iOS, messages are represented as follows: +/// +/// * null: nil +/// * [bool]\: `NSNumber numberWithBool:` +/// * [int]\: `NSNumber numberWithInt:` for values that are representable using +/// 32-bit two's complement; `NSNumber numberWithLong:` otherwise +/// * [double]\: `NSNumber numberWithDouble:` +/// * [String]\: `NSString` +/// * [Uint8List], [Int32List], [Int64List], [Float64List]\: +/// `FlutterStandardTypedData` +/// * [List]\: `NSArray` +/// * [Map]\: `NSDictionary` +class StandardMessageCodec implements MessageCodec { + /// Creates a [MessageCodec] using the Flutter standard binary encoding. + const StandardMessageCodec(); + + // The codec serializes messages as outlined below. This format must match the + // Android and iOS counterparts and cannot change (as it's possible for + // someone to end up using this for persistent storage). + // + // * A single byte with one of the constant values below determines the + // type of the value. + // * The serialization of the value itself follows the type byte. + // * Numbers are represented using the host endianness throughout. + // * Lengths and sizes of serialized parts are encoded using an expanding + // format optimized for the common case of small non-negative integers: + // * values 0..253 inclusive using one byte with that value; + // * values 254..2^16 inclusive using three bytes, the first of which is + // 254, the next two the usual unsigned representation of the value; + // * values 2^16+1..2^32 inclusive using five bytes, the first of which is + // 255, the next four the usual unsigned representation of the value. + // * null, true, and false have empty serialization; they are encoded directly + // in the type byte (using _valueNull, _valueTrue, _valueFalse) + // * Integers representable in 32 bits are encoded using 4 bytes two's + // complement representation. + // * Larger integers are encoded using 8 bytes two's complement + // representation. + // * doubles are encoded using the IEEE 754 64-bit double-precision binary + // format. Zero bytes are added before the encoded double value to align it + // to a 64 bit boundary in the full message. + // * Strings are encoded using their UTF-8 representation. First the length + // of that in bytes is encoded using the expanding format, then follows the + // UTF-8 encoding itself. + // * Uint8Lists, Int32Lists, Int64Lists, Float32Lists, and Float64Lists are + // encoded by first encoding the list's element count in the expanding + // format, then the smallest number of zero bytes needed to align the + // position in the full message with a multiple of the number of bytes per + // element, then the encoding of the list elements themselves, end-to-end + // with no additional type information, using two's complement or IEEE 754 + // as applicable. + // * Lists are encoded by first encoding their length in the expanding format, + // then follows the recursive encoding of each element value, including the + // type byte (Lists are assumed to be heterogeneous). + // * Maps are encoded by first encoding their length in the expanding format, + // then follows the recursive encoding of each key/value pair, including the + // type byte for both (Maps are assumed to be heterogeneous). + // + // The type labels below must not change, since it's possible for this interface + // to be used for persistent storage. + static const int _valueNull = 0; + static const int _valueTrue = 1; + static const int _valueFalse = 2; + static const int _valueInt32 = 3; + static const int _valueInt64 = 4; + static const int _valueLargeInt = 5; + static const int _valueFloat64 = 6; + static const int _valueString = 7; + static const int _valueUint8List = 8; + static const int _valueInt32List = 9; + static const int _valueInt64List = 10; + static const int _valueFloat64List = 11; + static const int _valueList = 12; + static const int _valueMap = 13; + static const int _valueFloat32List = 14; + + @override + ByteData? encodeMessage(Object? message) { + if (message == null) { + return null; + } + final WriteBuffer buffer = + WriteBuffer(startCapacity: _writeBufferStartCapacity); + writeValue(buffer, message); + return buffer.done(); + } + + @override + dynamic decodeMessage(ByteData? message) { + if (message == null) { + return null; + } + final ReadBuffer buffer = ReadBuffer(message); + final Object? result = readValue(buffer); + if (buffer.hasRemaining) { + throw const FormatException('Message corrupted'); + } + return result; + } + + /// Writes [value] to [buffer] by first writing a type discriminator + /// byte, then the value itself. + /// + /// This method may be called recursively to serialize container values. + /// + /// Type discriminators 0 through 127 inclusive are reserved for use by the + /// base class, as follows: + /// + /// * null = 0 + /// * true = 1 + /// * false = 2 + /// * 32 bit integer = 3 + /// * 64 bit integer = 4 + /// * larger integers = 5 (see below) + /// * 64 bit floating-point number = 6 + /// * String = 7 + /// * Uint8List = 8 + /// * Int32List = 9 + /// * Int64List = 10 + /// * Float64List = 11 + /// * List = 12 + /// * Map = 13 + /// * Float32List = 14 + /// * Reserved for future expansion: 15..127 + /// + /// The codec can be extended by overriding this method, calling super + /// for values that the extension does not handle. Type discriminators + /// used by extensions must be greater than or equal to 128 in order to avoid + /// clashes with any later extensions to the base class. + /// + /// The "larger integers" type, 5, is never used by [writeValue]. A subclass + /// could represent big integers from another package using that type. The + /// format is first the type byte (0x05), then the actual number as an ASCII + /// string giving the hexadecimal representation of the integer, with the + /// string's length as encoded by [writeSize] followed by the string bytes. On + /// Android, that would get converted to a `java.math.BigInteger` object. On + /// iOS, the string representation is returned. + void writeValue(WriteBuffer buffer, Object? value) { + if (value == null) { + buffer.putUint8(_valueNull); + } else if (value is bool) { + buffer.putUint8(value ? _valueTrue : _valueFalse); + } else if (value is double) { + // Double precedes int because in JS everything is a double. + // Therefore in JS, both `is int` and `is double` always + // return `true`. If we check int first, we'll end up treating + // all numbers as ints and attempt the int32/int64 conversion, + // which is wrong. This precedence rule is irrelevant when + // decoding because we use tags to detect the type of value. + buffer.putUint8(_valueFloat64); + buffer.putFloat64(value); + } else if (value is int) { + // ignore: avoid_double_and_int_checks, JS code always goes through the `double` path above + if (-0x7fffffff - 1 <= value && value <= 0x7fffffff) { + buffer.putUint8(_valueInt32); + buffer.putInt32(value); + } else { + buffer.putUint8(_valueInt64); + buffer.putInt64(value); + } + } else if (value is String) { + buffer.putUint8(_valueString); + final Uint8List asciiBytes = Uint8List(value.length); + Uint8List? utf8Bytes; + int utf8Offset = 0; + // Only do utf8 encoding if we encounter non-ascii characters. + for (int i = 0; i < value.length; i += 1) { + final int char = value.codeUnitAt(i); + if (char <= 0x7f) { + asciiBytes[i] = char; + } else { + utf8Bytes = utf8.encoder.convert(value.substring(i)); + utf8Offset = i; + break; + } + } + if (utf8Bytes != null) { + writeSize(buffer, utf8Offset + utf8Bytes.length); + buffer.putUint8List(Uint8List.sublistView(asciiBytes, 0, utf8Offset)); + buffer.putUint8List(utf8Bytes); + } else { + writeSize(buffer, asciiBytes.length); + buffer.putUint8List(asciiBytes); + } + } else if (value is Uint8List) { + buffer.putUint8(_valueUint8List); + writeSize(buffer, value.length); + buffer.putUint8List(value); + } else if (value is Int32List) { + buffer.putUint8(_valueInt32List); + writeSize(buffer, value.length); + buffer.putInt32List(value); + } else if (value is Int64List) { + buffer.putUint8(_valueInt64List); + writeSize(buffer, value.length); + buffer.putInt64List(value); + } else if (value is Float32List) { + buffer.putUint8(_valueFloat32List); + writeSize(buffer, value.length); + buffer.putFloat32List(value); + } else if (value is Float64List) { + buffer.putUint8(_valueFloat64List); + writeSize(buffer, value.length); + buffer.putFloat64List(value); + } else if (value is List) { + buffer.putUint8(_valueList); + writeSize(buffer, value.length); + for (final Object? item in value) { + writeValue(buffer, item); + } + } else if (value is Map) { + buffer.putUint8(_valueMap); + writeSize(buffer, value.length); + value.forEach((Object? key, Object? value) { + writeValue(buffer, key); + writeValue(buffer, value); + }); + } else { + throw ArgumentError.value(value); + } + } + + /// Reads a value from [buffer] as written by [writeValue]. + /// + /// This method is intended for use by subclasses overriding + /// [readValueOfType]. + Object? readValue(ReadBuffer buffer) { + if (!buffer.hasRemaining) { + throw const FormatException('Message corrupted'); + } + final int type = buffer.getUint8(); + return readValueOfType(type, buffer); + } + + /// Reads a value of the indicated [type] from [buffer]. + /// + /// The codec can be extended by overriding this method, calling super for + /// types that the extension does not handle. See the discussion at + /// [writeValue]. + Object? readValueOfType(int type, ReadBuffer buffer) { + switch (type) { + case _valueNull: + return null; + case _valueTrue: + return true; + case _valueFalse: + return false; + case _valueInt32: + return buffer.getInt32(); + case _valueInt64: + return buffer.getInt64(); + case _valueFloat64: + return buffer.getFloat64(); + case _valueLargeInt: + case _valueString: + final int length = readSize(buffer); + return utf8.decoder.convert(buffer.getUint8List(length)); + case _valueUint8List: + final int length = readSize(buffer); + return buffer.getUint8List(length); + case _valueInt32List: + final int length = readSize(buffer); + return buffer.getInt32List(length); + case _valueInt64List: + final int length = readSize(buffer); + return buffer.getInt64List(length); + case _valueFloat32List: + final int length = readSize(buffer); + return buffer.getFloat32List(length); + case _valueFloat64List: + final int length = readSize(buffer); + return buffer.getFloat64List(length); + case _valueList: + final int length = readSize(buffer); + final List result = List.filled(length, null); + for (int i = 0; i < length; i++) { + result[i] = readValue(buffer); + } + return result; + case _valueMap: + final int length = readSize(buffer); + final Map result = {}; + for (int i = 0; i < length; i++) { + result[readValue(buffer)] = readValue(buffer); + } + return result; + default: + throw const FormatException('Message corrupted'); + } + } + + /// Writes a non-negative 32-bit integer [value] to [buffer] + /// using an expanding 1-5 byte encoding that optimizes for small values. + /// + /// This method is intended for use by subclasses overriding + /// [writeValue]. + void writeSize(WriteBuffer buffer, int value) { + assert(0 <= value && value <= 0xffffffff); + if (value < 254) { + buffer.putUint8(value); + } else if (value <= 0xffff) { + buffer.putUint8(254); + buffer.putUint16(value); + } else { + buffer.putUint8(255); + buffer.putUint32(value); + } + } + + /// Reads a non-negative int from [buffer] as written by [writeSize]. + /// + /// This method is intended for use by subclasses overriding + /// [readValueOfType]. + int readSize(ReadBuffer buffer) { + final int value = buffer.getUint8(); + switch (value) { + case 254: + return buffer.getUint16(); + case 255: + return buffer.getUint32(); + default: + return value; + } + } +} diff --git a/packages/standard_message_codec/pubspec.yaml b/packages/standard_message_codec/pubspec.yaml new file mode 100644 index 0000000..bf86f46 --- /dev/null +++ b/packages/standard_message_codec/pubspec.yaml @@ -0,0 +1,11 @@ +name: standard_message_codec +description: An efficient and schemaless binary encoding format for Flutter and Dart. +version: 0.0.1 +repository: https://github.com/flutter/packages/tree/main/packages/standard_message_codec +issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3Astandard_message_codec + +environment: + sdk: '>=2.17.0 <3.0.0' + +dev_dependencies: + test: ^1.11.1 diff --git a/packages/standard_message_codec/test/standard_message_codec_test.dart b/packages/standard_message_codec/test/standard_message_codec_test.dart new file mode 100644 index 0000000..6feb5fc --- /dev/null +++ b/packages/standard_message_codec/test/standard_message_codec_test.dart @@ -0,0 +1,165 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:typed_data'; + +import 'package:standard_message_codec/standard_message_codec.dart'; +import 'package:test/test.dart'; + +const StandardMessageCodec messageCodec = StandardMessageCodec(); + +void main() { + group('Standard method codec', () { + test('Should encode and decode objects produced from codec', () { + final ByteData? data = messageCodec.encodeMessage({ + 'foo': true, + 3: 'fizz', + }); + + expect(messageCodec.decodeMessage(data), { + 'foo': true, + 3: 'fizz', + }); + }); + }); + + group('Write and read buffer round-trip', () { + test('of empty buffer', () { + final WriteBuffer write = WriteBuffer(); + final ByteData written = write.done(); + + expect(written.lengthInBytes, 0); + }); + + test('of single byte', () { + final WriteBuffer write = WriteBuffer(); + write.putUint8(201); + final ByteData written = write.done(); + expect(written.lengthInBytes, equals(1)); + final ReadBuffer read = ReadBuffer(written); + expect(read.getUint8(), equals(201)); + }); + + test('of 32-bit integer', () { + final WriteBuffer write = WriteBuffer(); + write.putInt32(-9); + final ByteData written = write.done(); + expect(written.lengthInBytes, equals(4)); + final ReadBuffer read = ReadBuffer(written); + expect(read.getInt32(), equals(-9)); + }); + + test('of 32-bit integer in big endian', () { + final WriteBuffer write = WriteBuffer(); + write.putInt32(-9, endian: Endian.big); + final ByteData written = write.done(); + expect(written.lengthInBytes, equals(4)); + final ReadBuffer read = ReadBuffer(written); + expect(read.getInt32(endian: Endian.big), equals(-9)); + }); + + test('of 64-bit integer', () { + final WriteBuffer write = WriteBuffer(); + write.putInt64(-9000000000000); + final ByteData written = write.done(); + expect(written.lengthInBytes, equals(8)); + final ReadBuffer read = ReadBuffer(written); + expect(read.getInt64(), equals(-9000000000000)); + }); + + test('of 64-bit integer in big endian', () { + final WriteBuffer write = WriteBuffer(); + write.putInt64(-9000000000000, endian: Endian.big); + final ByteData written = write.done(); + expect(written.lengthInBytes, equals(8)); + final ReadBuffer read = ReadBuffer(written); + expect(read.getInt64(endian: Endian.big), equals(-9000000000000)); + }); + + test('of double', () { + final WriteBuffer write = WriteBuffer(); + write.putFloat64(3.14); + final ByteData written = write.done(); + expect(written.lengthInBytes, equals(8)); + final ReadBuffer read = ReadBuffer(written); + expect(read.getFloat64(), equals(3.14)); + }); + test('of double in big endian', () { + final WriteBuffer write = WriteBuffer(); + write.putFloat64(3.14, endian: Endian.big); + final ByteData written = write.done(); + expect(written.lengthInBytes, equals(8)); + final ReadBuffer read = ReadBuffer(written); + expect(read.getFloat64(endian: Endian.big), equals(3.14)); + }); + test('of 32-bit int list when unaligned', () { + final Int32List integers = Int32List.fromList([-99, 2, 99]); + final WriteBuffer write = WriteBuffer(); + write.putUint8(9); + write.putInt32List(integers); + final ByteData written = write.done(); + expect(written.lengthInBytes, equals(16)); + final ReadBuffer read = ReadBuffer(written); + read.getUint8(); + expect(read.getInt32List(3), equals(integers)); + }); + + test('of 64-bit int list when unaligned', () { + final Int64List integers = Int64List.fromList([-99, 2, 99]); + final WriteBuffer write = WriteBuffer(); + write.putUint8(9); + write.putInt64List(integers); + final ByteData written = write.done(); + expect(written.lengthInBytes, equals(32)); + final ReadBuffer read = ReadBuffer(written); + read.getUint8(); + expect(read.getInt64List(3), equals(integers)); + }); + + test('of float list when unaligned', () { + final Float32List floats = + Float32List.fromList([3.14, double.nan]); + final WriteBuffer write = WriteBuffer(); + write.putUint8(9); + write.putFloat32List(floats); + final ByteData written = write.done(); + expect(written.lengthInBytes, equals(12)); + final ReadBuffer read = ReadBuffer(written); + read.getUint8(); + final Float32List readFloats = read.getFloat32List(2); + expect(readFloats[0], closeTo(3.14, 0.0001)); + expect(readFloats[1], isNaN); + }); + + test('of double list when unaligned', () { + final Float64List doubles = + Float64List.fromList([3.14, double.nan]); + final WriteBuffer write = WriteBuffer(); + write.putUint8(9); + write.putFloat64List(doubles); + final ByteData written = write.done(); + expect(written.lengthInBytes, equals(24)); + final ReadBuffer read = ReadBuffer(written); + read.getUint8(); + final Float64List readDoubles = read.getFloat64List(2); + expect(readDoubles[0], equals(3.14)); + expect(readDoubles[1], isNaN); + }); + + test('done twice', () { + final WriteBuffer write = WriteBuffer(); + write.done(); + expect(() => write.done(), throwsStateError); + }); + + test('empty WriteBuffer', () { + expect( + () => WriteBuffer(startCapacity: 0), throwsA(isA())); + }); + + test('size 1', () { + expect(() => WriteBuffer(startCapacity: 1), returnsNormally); + }); + }); +} From f47676abd08c99d3d536b0f3461181ae57f96647 Mon Sep 17 00:00:00 2001 From: stuartmorgan Date: Wed, 17 Aug 2022 10:57:17 -0400 Subject: [PATCH 077/118] [ci] Update repository tooling to 0.9.1 (#2425) --- packages/standard_message_codec/CHANGELOG.md | 4 ++++ packages/standard_message_codec/pubspec.yaml | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/standard_message_codec/CHANGELOG.md b/packages/standard_message_codec/CHANGELOG.md index a9888a2..d1108d5 100644 --- a/packages/standard_message_codec/CHANGELOG.md +++ b/packages/standard_message_codec/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.0.1+1 + +* Fixes minimum version of `test` dependency. + ## 0.0.1 * Initial release of standard message codec extracted from the Flutter SDK. diff --git a/packages/standard_message_codec/pubspec.yaml b/packages/standard_message_codec/pubspec.yaml index bf86f46..dccca1f 100644 --- a/packages/standard_message_codec/pubspec.yaml +++ b/packages/standard_message_codec/pubspec.yaml @@ -1,6 +1,6 @@ name: standard_message_codec description: An efficient and schemaless binary encoding format for Flutter and Dart. -version: 0.0.1 +version: 0.0.1+1 repository: https://github.com/flutter/packages/tree/main/packages/standard_message_codec issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3Astandard_message_codec @@ -8,4 +8,4 @@ environment: sdk: '>=2.17.0 <3.0.0' dev_dependencies: - test: ^1.11.1 + test: ^1.16.0 From 069bcc788445049518894f114ae2e47ad3423b7d Mon Sep 17 00:00:00 2001 From: Michael Goderbauer Date: Thu, 25 Aug 2022 09:57:05 -0700 Subject: [PATCH 078/118] [analysis_options] sync lint rules with flutter/flutter (#2495) --- packages/multicast_dns/CHANGELOG.md | 4 ++++ packages/multicast_dns/example/main.dart | 2 ++ packages/multicast_dns/example/mdns_resolve.dart | 2 ++ packages/multicast_dns/example/mdns_sd.dart | 2 ++ packages/multicast_dns/lib/multicast_dns.dart | 10 +++++----- packages/multicast_dns/lib/src/lookup_resolver.dart | 2 +- .../multicast_dns/lib/src/native_protocol_client.dart | 2 +- packages/multicast_dns/lib/src/packet.dart | 4 ++-- packages/multicast_dns/lib/src/resource_record.dart | 4 ++-- packages/multicast_dns/pubspec.yaml | 2 +- packages/multicast_dns/test/decode_test.dart | 2 +- packages/multicast_dns/tool/packet_gen.dart | 6 ++++-- packages/standard_message_codec/CHANGELOG.md | 4 ++++ .../example/lib/readme_excerpts.dart | 2 ++ .../lib/standard_message_codec.dart | 2 +- packages/standard_message_codec/pubspec.yaml | 2 +- 16 files changed, 35 insertions(+), 17 deletions(-) diff --git a/packages/multicast_dns/CHANGELOG.md b/packages/multicast_dns/CHANGELOG.md index a20e590..76837a4 100644 --- a/packages/multicast_dns/CHANGELOG.md +++ b/packages/multicast_dns/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.3.2+2 + +* Fixes lints warnings. + ## 0.3.2+1 * Migrates from `ui.hash*` to `Object.hash*`. diff --git a/packages/multicast_dns/example/main.dart b/packages/multicast_dns/example/main.dart index 588bcb2..2fdb57a 100644 --- a/packages/multicast_dns/example/main.dart +++ b/packages/multicast_dns/example/main.dart @@ -5,6 +5,8 @@ // Example script to illustrate how to use the mdns package to discover the port // of a Dart observatory over mDNS. +// ignore_for_file: avoid_print + import 'package:multicast_dns/multicast_dns.dart'; Future main() async { diff --git a/packages/multicast_dns/example/mdns_resolve.dart b/packages/multicast_dns/example/mdns_resolve.dart index a7c35a8..5246997 100644 --- a/packages/multicast_dns/example/mdns_resolve.dart +++ b/packages/multicast_dns/example/mdns_resolve.dart @@ -5,6 +5,8 @@ // Example script to illustrate how to use the mdns package to lookup names // on the local network. +// ignore_for_file: avoid_print + import 'package:multicast_dns/multicast_dns.dart'; Future main(List args) async { diff --git a/packages/multicast_dns/example/mdns_sd.dart b/packages/multicast_dns/example/mdns_sd.dart index 5b5fb6e..50b46eb 100644 --- a/packages/multicast_dns/example/mdns_sd.dart +++ b/packages/multicast_dns/example/mdns_sd.dart @@ -5,6 +5,8 @@ // Example script to illustrate how to use the mdns package to discover services // on the local network. +// ignore_for_file: avoid_print + import 'package:multicast_dns/multicast_dns.dart'; Future main(List args) async { diff --git a/packages/multicast_dns/lib/multicast_dns.dart b/packages/multicast_dns/lib/multicast_dns.dart index 5aeeab4..336ac42 100644 --- a/packages/multicast_dns/lib/multicast_dns.dart +++ b/packages/multicast_dns/lib/multicast_dns.dart @@ -5,11 +5,11 @@ import 'dart:async'; import 'dart:io'; -import 'package:multicast_dns/src/constants.dart'; -import 'package:multicast_dns/src/lookup_resolver.dart'; -import 'package:multicast_dns/src/native_protocol_client.dart'; -import 'package:multicast_dns/src/packet.dart'; -import 'package:multicast_dns/src/resource_record.dart'; +import 'src/constants.dart'; +import 'src/lookup_resolver.dart'; +import 'src/native_protocol_client.dart'; +import 'src/packet.dart'; +import 'src/resource_record.dart'; export 'package:multicast_dns/src/resource_record.dart'; diff --git a/packages/multicast_dns/lib/src/lookup_resolver.dart b/packages/multicast_dns/lib/src/lookup_resolver.dart index 6f2eea7..addae7d 100644 --- a/packages/multicast_dns/lib/src/lookup_resolver.dart +++ b/packages/multicast_dns/lib/src/lookup_resolver.dart @@ -5,7 +5,7 @@ import 'dart:async'; import 'dart:collection'; -import 'package:multicast_dns/src/resource_record.dart'; +import 'resource_record.dart'; /// Class for maintaining state about pending mDNS requests. class PendingRequest extends LinkedListEntry { diff --git a/packages/multicast_dns/lib/src/native_protocol_client.dart b/packages/multicast_dns/lib/src/native_protocol_client.dart index aa2eb5c..b754519 100644 --- a/packages/multicast_dns/lib/src/native_protocol_client.dart +++ b/packages/multicast_dns/lib/src/native_protocol_client.dart @@ -4,7 +4,7 @@ import 'dart:collection'; -import 'package:multicast_dns/src/resource_record.dart'; +import 'resource_record.dart'; /// Cache for resource records that have been received. /// diff --git a/packages/multicast_dns/lib/src/packet.dart b/packages/multicast_dns/lib/src/packet.dart index 514cd14..dcf1402 100644 --- a/packages/multicast_dns/lib/src/packet.dart +++ b/packages/multicast_dns/lib/src/packet.dart @@ -6,8 +6,8 @@ import 'dart:convert'; import 'dart:io'; import 'dart:typed_data'; -import 'package:multicast_dns/src/constants.dart'; -import 'package:multicast_dns/src/resource_record.dart'; +import 'constants.dart'; +import 'resource_record.dart'; // Offsets into the header. See https://tools.ietf.org/html/rfc1035. const int _kIdOffset = 0; diff --git a/packages/multicast_dns/lib/src/resource_record.dart b/packages/multicast_dns/lib/src/resource_record.dart index 46e5731..65320d5 100644 --- a/packages/multicast_dns/lib/src/resource_record.dart +++ b/packages/multicast_dns/lib/src/resource_record.dart @@ -7,8 +7,8 @@ import 'dart:io'; import 'dart:typed_data'; import 'package:meta/meta.dart'; -import 'package:multicast_dns/src/constants.dart'; -import 'package:multicast_dns/src/packet.dart'; +import 'constants.dart'; +import 'packet.dart'; /// Enumeration of support resource record types. abstract class ResourceRecordType { diff --git a/packages/multicast_dns/pubspec.yaml b/packages/multicast_dns/pubspec.yaml index c43df34..04ed3aa 100644 --- a/packages/multicast_dns/pubspec.yaml +++ b/packages/multicast_dns/pubspec.yaml @@ -2,7 +2,7 @@ name: multicast_dns description: Dart package for performing mDNS queries (e.g. Bonjour, Avahi). repository: https://github.com/flutter/packages/tree/main/packages/multicast_dns issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+multicast_dns%22 -version: 0.3.2+1 +version: 0.3.2+2 environment: sdk: ">=2.14.0 <3.0.0" diff --git a/packages/multicast_dns/test/decode_test.dart b/packages/multicast_dns/test/decode_test.dart index 442d599..32d7c2f 100644 --- a/packages/multicast_dns/test/decode_test.dart +++ b/packages/multicast_dns/test/decode_test.dart @@ -178,7 +178,7 @@ void testValidPackages() { TxtResourceRecord( '______________________.____________.____._____', result[1].validUntil, - text: (')' * 129) + '\n', + text: '${')' * 129}\n', ), ]); }); diff --git a/packages/multicast_dns/tool/packet_gen.dart b/packages/multicast_dns/tool/packet_gen.dart index 4845b16..6e1e278 100644 --- a/packages/multicast_dns/tool/packet_gen.dart +++ b/packages/multicast_dns/tool/packet_gen.dart @@ -2,6 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +// ignore_for_file: avoid_print + // Support code to generate the hex-lists in test/decode_test.dart from // a hex-stream. import 'dart:io'; @@ -51,7 +53,7 @@ void hexDumpList(List package) { } void dumpDatagram(Datagram datagram) { - String _toHex(List ints) { + String toHex(List ints) { final StringBuffer buffer = StringBuffer(); for (int i = 0; i < ints.length; i++) { buffer.write(ints[i].toRadixString(16).padLeft(2, '0')); @@ -65,6 +67,6 @@ void dumpDatagram(Datagram datagram) { } print('${datagram.address.address}:${datagram.port}:'); - print(_toHex(datagram.data)); + print(toHex(datagram.data)); print(''); } diff --git a/packages/standard_message_codec/CHANGELOG.md b/packages/standard_message_codec/CHANGELOG.md index d1108d5..e3a9a0a 100644 --- a/packages/standard_message_codec/CHANGELOG.md +++ b/packages/standard_message_codec/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.0.1+2 + +* Fixes lint warnings. + ## 0.0.1+1 * Fixes minimum version of `test` dependency. diff --git a/packages/standard_message_codec/example/lib/readme_excerpts.dart b/packages/standard_message_codec/example/lib/readme_excerpts.dart index f2d4412..ea70bc2 100644 --- a/packages/standard_message_codec/example/lib/readme_excerpts.dart +++ b/packages/standard_message_codec/example/lib/readme_excerpts.dart @@ -5,6 +5,8 @@ // This file exists solely to host compiled excerpts for README.md, and is not // intended for use as an actual example application. +// ignore_for_file: avoid_print + // #docregion Encoding import 'dart:typed_data'; import 'package:standard_message_codec/standard_message_codec.dart'; diff --git a/packages/standard_message_codec/lib/standard_message_codec.dart b/packages/standard_message_codec/lib/standard_message_codec.dart index 3ecddf4..cdb70fe 100644 --- a/packages/standard_message_codec/lib/standard_message_codec.dart +++ b/packages/standard_message_codec/lib/standard_message_codec.dart @@ -230,8 +230,8 @@ class StandardMessageCodec implements MessageCodec { // decoding because we use tags to detect the type of value. buffer.putUint8(_valueFloat64); buffer.putFloat64(value); - } else if (value is int) { // ignore: avoid_double_and_int_checks, JS code always goes through the `double` path above + } else if (value is int) { if (-0x7fffffff - 1 <= value && value <= 0x7fffffff) { buffer.putUint8(_valueInt32); buffer.putInt32(value); diff --git a/packages/standard_message_codec/pubspec.yaml b/packages/standard_message_codec/pubspec.yaml index dccca1f..235f502 100644 --- a/packages/standard_message_codec/pubspec.yaml +++ b/packages/standard_message_codec/pubspec.yaml @@ -1,6 +1,6 @@ name: standard_message_codec description: An efficient and schemaless binary encoding format for Flutter and Dart. -version: 0.0.1+1 +version: 0.0.1+2 repository: https://github.com/flutter/packages/tree/main/packages/standard_message_codec issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3Astandard_message_codec From 421a92a9c923bd170d8bb47861a1691c54de51cd Mon Sep 17 00:00:00 2001 From: stuartmorgan Date: Mon, 29 Aug 2022 14:04:48 -0400 Subject: [PATCH 079/118] [ci] Roll repo tooling to 0.9.2 (#2522) --- packages/standard_message_codec/CHANGELOG.md | 4 ++++ packages/standard_message_codec/README.md | 5 ++++- .../example/build.excerpt.yaml | 16 ++++++++++++++++ .../example/lib/readme_excerpts.dart | 4 ++-- .../standard_message_codec/example/pubspec.yaml | 3 +++ packages/standard_message_codec/pubspec.yaml | 2 +- 6 files changed, 30 insertions(+), 4 deletions(-) create mode 100644 packages/standard_message_codec/example/build.excerpt.yaml diff --git a/packages/standard_message_codec/CHANGELOG.md b/packages/standard_message_codec/CHANGELOG.md index e3a9a0a..5472fdf 100644 --- a/packages/standard_message_codec/CHANGELOG.md +++ b/packages/standard_message_codec/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.0.1+3 + +* Minor README updates. + ## 0.0.1+2 * Fixes lint warnings. diff --git a/packages/standard_message_codec/README.md b/packages/standard_message_codec/README.md index b67b977..b6c88e6 100644 --- a/packages/standard_message_codec/README.md +++ b/packages/standard_message_codec/README.md @@ -1,3 +1,5 @@ + + An efficient and schemaless binary format used by the Flutter SDK. ## Features @@ -43,7 +45,8 @@ or pure Dart applications. ```dart void main() { - final ByteData? data = const StandardMessageCodec().encodeMessage({ + final ByteData? data = + const StandardMessageCodec().encodeMessage({ 'foo': true, 3: 'fizz', }); diff --git a/packages/standard_message_codec/example/build.excerpt.yaml b/packages/standard_message_codec/example/build.excerpt.yaml new file mode 100644 index 0000000..5af6123 --- /dev/null +++ b/packages/standard_message_codec/example/build.excerpt.yaml @@ -0,0 +1,16 @@ +targets: + $default: + sources: + include: + - lib/** + # Some default includes that aren't really used here but will prevent + # false-negative warnings: + - $package$ + - lib/$lib$ + exclude: + - '**/.*/**' + - '**/build/**' + builders: + code_excerpter|code_excerpter: + enabled: true + \ No newline at end of file diff --git a/packages/standard_message_codec/example/lib/readme_excerpts.dart b/packages/standard_message_codec/example/lib/readme_excerpts.dart index ea70bc2..f403ad0 100644 --- a/packages/standard_message_codec/example/lib/readme_excerpts.dart +++ b/packages/standard_message_codec/example/lib/readme_excerpts.dart @@ -7,11 +7,10 @@ // ignore_for_file: avoid_print -// #docregion Encoding import 'dart:typed_data'; import 'package:standard_message_codec/standard_message_codec.dart'; -// #enddocregion Encoding +// #docregion Encoding void main() { final ByteData? data = const StandardMessageCodec().encodeMessage({ @@ -20,3 +19,4 @@ void main() { }); print('The encoded message is $data'); } +// #enddocregion Encoding diff --git a/packages/standard_message_codec/example/pubspec.yaml b/packages/standard_message_codec/example/pubspec.yaml index 4f81a03..fa00ff5 100644 --- a/packages/standard_message_codec/example/pubspec.yaml +++ b/packages/standard_message_codec/example/pubspec.yaml @@ -9,3 +9,6 @@ environment: dependencies: standard_message_codec: path: ../ + +dev_dependencies: + build_runner: ^2.1.10 diff --git a/packages/standard_message_codec/pubspec.yaml b/packages/standard_message_codec/pubspec.yaml index 235f502..381580d 100644 --- a/packages/standard_message_codec/pubspec.yaml +++ b/packages/standard_message_codec/pubspec.yaml @@ -1,6 +1,6 @@ name: standard_message_codec description: An efficient and schemaless binary encoding format for Flutter and Dart. -version: 0.0.1+2 +version: 0.0.1+3 repository: https://github.com/flutter/packages/tree/main/packages/standard_message_codec issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3Astandard_message_codec From 2094e6f3095a434a2ab6d347f9a61203dd53dba6 Mon Sep 17 00:00:00 2001 From: stuartmorgan Date: Thu, 26 Jan 2023 20:43:00 -0800 Subject: [PATCH 080/118] [ci] Enable min SDK version checks (#3095) * Roll tool version * Enable new check in CI * Fix violations * CHANGELOG updates * Fix changelog * Address analyzer issues * Revert flutter_lints changelog --- packages/flutter_template_images/CHANGELOG.md | 4 ++++ packages/flutter_template_images/pubspec.yaml | 2 +- packages/multicast_dns/CHANGELOG.md | 4 ++++ packages/multicast_dns/pubspec.yaml | 2 +- 4 files changed, 10 insertions(+), 2 deletions(-) diff --git a/packages/flutter_template_images/CHANGELOG.md b/packages/flutter_template_images/CHANGELOG.md index 80bc746..8c49d1f 100644 --- a/packages/flutter_template_images/CHANGELOG.md +++ b/packages/flutter_template_images/CHANGELOG.md @@ -1,3 +1,7 @@ +## NEXT + +* Updates minimum SDK version to Flutter 3.0. + ## 4.2.0 * Adds iOS template app icons, updated to square icons with no transparency. diff --git a/packages/flutter_template_images/pubspec.yaml b/packages/flutter_template_images/pubspec.yaml index 67f12dc..5b500a4 100644 --- a/packages/flutter_template_images/pubspec.yaml +++ b/packages/flutter_template_images/pubspec.yaml @@ -5,4 +5,4 @@ issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+ version: 4.2.0 environment: - sdk: ">=2.12.0 <3.0.0" + sdk: ">=2.17.0 <3.0.0" diff --git a/packages/multicast_dns/CHANGELOG.md b/packages/multicast_dns/CHANGELOG.md index 76837a4..68aad38 100644 --- a/packages/multicast_dns/CHANGELOG.md +++ b/packages/multicast_dns/CHANGELOG.md @@ -1,3 +1,7 @@ +## NEXT + +* Updates minimum SDK version to Flutter 3.0. + ## 0.3.2+2 * Fixes lints warnings. diff --git a/packages/multicast_dns/pubspec.yaml b/packages/multicast_dns/pubspec.yaml index 04ed3aa..39571ce 100644 --- a/packages/multicast_dns/pubspec.yaml +++ b/packages/multicast_dns/pubspec.yaml @@ -5,7 +5,7 @@ issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+ version: 0.3.2+2 environment: - sdk: ">=2.14.0 <3.0.0" + sdk: ">=2.17.0 <3.0.0" dependencies: meta: ^1.3.0 From c27f91fa415bd75c9c73a22e3195185503f8b2a2 Mon Sep 17 00:00:00 2001 From: stuartmorgan Date: Tue, 31 Jan 2023 16:17:56 -0800 Subject: [PATCH 081/118] [ci] Enable no_runtimeType_toString (#3129) Enables the `no_runtimeType_toString` analysis option. This isn't part of the base flutter/flutter analysis options, but is set in flutter/packages which this repo better corresponds to. This is already enabled in flutter/plugins, and is being enabled here as part of aligning their options. Part of https://github.com/flutter/flutter/issues/113764 --- packages/multicast_dns/CHANGELOG.md | 3 ++- packages/multicast_dns/lib/src/resource_record.dart | 2 +- packages/multicast_dns/pubspec.yaml | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/multicast_dns/CHANGELOG.md b/packages/multicast_dns/CHANGELOG.md index 68aad38..55ee390 100644 --- a/packages/multicast_dns/CHANGELOG.md +++ b/packages/multicast_dns/CHANGELOG.md @@ -1,5 +1,6 @@ -## NEXT +## 0.3.2+3 +* Removes use of `runtimeType.toString()`. * Updates minimum SDK version to Flutter 3.0. ## 0.3.2+2 diff --git a/packages/multicast_dns/lib/src/resource_record.dart b/packages/multicast_dns/lib/src/resource_record.dart index 65320d5..d58da79 100644 --- a/packages/multicast_dns/lib/src/resource_record.dart +++ b/packages/multicast_dns/lib/src/resource_record.dart @@ -167,7 +167,7 @@ class ResourceRecordQuery { @override String toString() => - '$runtimeType{$fullyQualifiedName, type: ${ResourceRecordType.toDebugString(resourceRecordType)}, isMulticast: $isMulticast}'; + 'ResourceRecordQuery{$fullyQualifiedName, type: ${ResourceRecordType.toDebugString(resourceRecordType)}, isMulticast: $isMulticast}'; } /// Base implementation of DNS resource records (RRs). diff --git a/packages/multicast_dns/pubspec.yaml b/packages/multicast_dns/pubspec.yaml index 39571ce..8aa9b77 100644 --- a/packages/multicast_dns/pubspec.yaml +++ b/packages/multicast_dns/pubspec.yaml @@ -2,7 +2,7 @@ name: multicast_dns description: Dart package for performing mDNS queries (e.g. Bonjour, Avahi). repository: https://github.com/flutter/packages/tree/main/packages/multicast_dns issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+multicast_dns%22 -version: 0.3.2+2 +version: 0.3.2+3 environment: sdk: ">=2.17.0 <3.0.0" From 638312bcc49224049030e73ae22517906a2453e4 Mon Sep 17 00:00:00 2001 From: stuartmorgan Date: Tue, 21 Mar 2023 21:48:58 -0700 Subject: [PATCH 082/118] [all] Update Dart SDK max to 4.0.0 (#3509) * Update script command * Mass change --- packages/flutter_template_images/pubspec.yaml | 2 +- packages/multicast_dns/pubspec.yaml | 2 +- packages/standard_message_codec/example/pubspec.yaml | 2 +- packages/standard_message_codec/pubspec.yaml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/flutter_template_images/pubspec.yaml b/packages/flutter_template_images/pubspec.yaml index 5b500a4..f5d4abb 100644 --- a/packages/flutter_template_images/pubspec.yaml +++ b/packages/flutter_template_images/pubspec.yaml @@ -5,4 +5,4 @@ issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+ version: 4.2.0 environment: - sdk: ">=2.17.0 <3.0.0" + sdk: ">=2.17.0 <4.0.0" diff --git a/packages/multicast_dns/pubspec.yaml b/packages/multicast_dns/pubspec.yaml index 8aa9b77..c50e009 100644 --- a/packages/multicast_dns/pubspec.yaml +++ b/packages/multicast_dns/pubspec.yaml @@ -5,7 +5,7 @@ issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+ version: 0.3.2+3 environment: - sdk: ">=2.17.0 <3.0.0" + sdk: ">=2.17.0 <4.0.0" dependencies: meta: ^1.3.0 diff --git a/packages/standard_message_codec/example/pubspec.yaml b/packages/standard_message_codec/example/pubspec.yaml index fa00ff5..c8fa655 100644 --- a/packages/standard_message_codec/example/pubspec.yaml +++ b/packages/standard_message_codec/example/pubspec.yaml @@ -4,7 +4,7 @@ version: 0.0.1 publish_to: none environment: - sdk: ">=2.17.0 <3.0.0" + sdk: ">=2.17.0 <4.0.0" dependencies: standard_message_codec: diff --git a/packages/standard_message_codec/pubspec.yaml b/packages/standard_message_codec/pubspec.yaml index 381580d..da969f3 100644 --- a/packages/standard_message_codec/pubspec.yaml +++ b/packages/standard_message_codec/pubspec.yaml @@ -5,7 +5,7 @@ repository: https://github.com/flutter/packages/tree/main/packages/standard_mess issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3Astandard_message_codec environment: - sdk: '>=2.17.0 <3.0.0' + sdk: ">=2.17.0 <4.0.0" dev_dependencies: test: ^1.16.0 From e517db536e6818df27e6edf14800af7f4855d417 Mon Sep 17 00:00:00 2001 From: stuartmorgan Date: Thu, 11 May 2023 19:11:07 -0700 Subject: [PATCH 083/118] [various] Update minimum Flutter version to 3.3 (#3967) Updates version-related checks for the 3.10 release: - Updates the N-1 and N-2 tests to 3.3 and 3.7. - Updates the minimum allowed SDK to declare support for to 3.3, matching our test matrix - Updates all packages that were supporting <3.3 to 3.3 (and equivalent Dart versions for non-Flutter packages) - Adds a Flutter->Dart mapping for 3.10 in the repo tooling. --- packages/flutter_template_images/CHANGELOG.md | 1 + packages/flutter_template_images/pubspec.yaml | 2 +- packages/multicast_dns/CHANGELOG.md | 4 ++++ packages/multicast_dns/pubspec.yaml | 2 +- packages/standard_message_codec/CHANGELOG.md | 4 ++++ packages/standard_message_codec/example/pubspec.yaml | 2 +- packages/standard_message_codec/pubspec.yaml | 2 +- 7 files changed, 13 insertions(+), 4 deletions(-) diff --git a/packages/flutter_template_images/CHANGELOG.md b/packages/flutter_template_images/CHANGELOG.md index 8c49d1f..2e17699 100644 --- a/packages/flutter_template_images/CHANGELOG.md +++ b/packages/flutter_template_images/CHANGELOG.md @@ -1,5 +1,6 @@ ## NEXT +* Updates minimum supported SDK version to Flutter 3.3/Dart 2.18. * Updates minimum SDK version to Flutter 3.0. ## 4.2.0 diff --git a/packages/flutter_template_images/pubspec.yaml b/packages/flutter_template_images/pubspec.yaml index f5d4abb..d1bebb8 100644 --- a/packages/flutter_template_images/pubspec.yaml +++ b/packages/flutter_template_images/pubspec.yaml @@ -5,4 +5,4 @@ issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+ version: 4.2.0 environment: - sdk: ">=2.17.0 <4.0.0" + sdk: ">=2.18.0 <4.0.0" diff --git a/packages/multicast_dns/CHANGELOG.md b/packages/multicast_dns/CHANGELOG.md index 55ee390..7e8642c 100644 --- a/packages/multicast_dns/CHANGELOG.md +++ b/packages/multicast_dns/CHANGELOG.md @@ -1,3 +1,7 @@ +## NEXT + +* Updates minimum supported SDK version to Flutter 3.3/Dart 2.18. + ## 0.3.2+3 * Removes use of `runtimeType.toString()`. diff --git a/packages/multicast_dns/pubspec.yaml b/packages/multicast_dns/pubspec.yaml index c50e009..d0fc19e 100644 --- a/packages/multicast_dns/pubspec.yaml +++ b/packages/multicast_dns/pubspec.yaml @@ -5,7 +5,7 @@ issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+ version: 0.3.2+3 environment: - sdk: ">=2.17.0 <4.0.0" + sdk: ">=2.18.0 <4.0.0" dependencies: meta: ^1.3.0 diff --git a/packages/standard_message_codec/CHANGELOG.md b/packages/standard_message_codec/CHANGELOG.md index 5472fdf..8d00356 100644 --- a/packages/standard_message_codec/CHANGELOG.md +++ b/packages/standard_message_codec/CHANGELOG.md @@ -1,3 +1,7 @@ +## NEXT + +* Updates minimum supported SDK version to Flutter 3.3/Dart 2.18. + ## 0.0.1+3 * Minor README updates. diff --git a/packages/standard_message_codec/example/pubspec.yaml b/packages/standard_message_codec/example/pubspec.yaml index c8fa655..1978db7 100644 --- a/packages/standard_message_codec/example/pubspec.yaml +++ b/packages/standard_message_codec/example/pubspec.yaml @@ -4,7 +4,7 @@ version: 0.0.1 publish_to: none environment: - sdk: ">=2.17.0 <4.0.0" + sdk: ">=2.18.0 <4.0.0" dependencies: standard_message_codec: diff --git a/packages/standard_message_codec/pubspec.yaml b/packages/standard_message_codec/pubspec.yaml index da969f3..fe73da0 100644 --- a/packages/standard_message_codec/pubspec.yaml +++ b/packages/standard_message_codec/pubspec.yaml @@ -5,7 +5,7 @@ repository: https://github.com/flutter/packages/tree/main/packages/standard_mess issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3Astandard_message_codec environment: - sdk: ">=2.17.0 <4.0.0" + sdk: ">=2.18.0 <4.0.0" dev_dependencies: test: ^1.16.0 From 387e08b1e2b394043d014c0eb5342e2cc597b872 Mon Sep 17 00:00:00 2001 From: stuartmorgan Date: Tue, 4 Jul 2023 20:27:25 -0400 Subject: [PATCH 084/118] [ci] Add a web version of Dart unit tests (#4352) Adds new LUCI targets in bringup mode to run all possible Dart unit tests in Chrome. This is a new test (see linked issue), not a port of a Cirrus test, so it involves changes to tooling and packages: - The tooling now accepts an explicit platform. The default behavior if none is provided is the previous behavior of running in VM for everything but web plugin implementations (since that's convenient locally). - The tooling now has a basic understanding of `dart_test.yaml` `test_on` directives, to know when to skip. - Packages that don't support web have opt-out files. - Packages that do support web but have a few tests that fail on web have those tests opted out. - Packages that do support web but have a lot of failures on web have temporary opt-out files with TODOs + issue links. Most of https://github.com/flutter/flutter/issues/128979 --- packages/multicast_dns/dart_test.yaml | 1 + .../test/standard_message_codec_test.dart | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) create mode 100644 packages/multicast_dns/dart_test.yaml diff --git a/packages/multicast_dns/dart_test.yaml b/packages/multicast_dns/dart_test.yaml new file mode 100644 index 0000000..91ec220 --- /dev/null +++ b/packages/multicast_dns/dart_test.yaml @@ -0,0 +1 @@ +test_on: vm diff --git a/packages/standard_message_codec/test/standard_message_codec_test.dart b/packages/standard_message_codec/test/standard_message_codec_test.dart index 6feb5fc..299bfa2 100644 --- a/packages/standard_message_codec/test/standard_message_codec_test.dart +++ b/packages/standard_message_codec/test/standard_message_codec_test.dart @@ -66,7 +66,7 @@ void main() { expect(written.lengthInBytes, equals(8)); final ReadBuffer read = ReadBuffer(written); expect(read.getInt64(), equals(-9000000000000)); - }); + }, testOn: 'vm' /* Int64 isn't supported on web */); test('of 64-bit integer in big endian', () { final WriteBuffer write = WriteBuffer(); @@ -75,7 +75,7 @@ void main() { expect(written.lengthInBytes, equals(8)); final ReadBuffer read = ReadBuffer(written); expect(read.getInt64(endian: Endian.big), equals(-9000000000000)); - }); + }, testOn: 'vm' /* Int64 isn't supported on web */); test('of double', () { final WriteBuffer write = WriteBuffer(); @@ -115,7 +115,7 @@ void main() { final ReadBuffer read = ReadBuffer(written); read.getUint8(); expect(read.getInt64List(3), equals(integers)); - }); + }, testOn: 'vm' /* Int64 isn't supported on web */); test('of float list when unaligned', () { final Float32List floats = From 201275d1e81e704c50a37b26843e0497622e70da Mon Sep 17 00:00:00 2001 From: Ian Hickson Date: Tue, 11 Jul 2023 14:49:24 -0700 Subject: [PATCH 085/118] [flutter_plugin_tools] Reimplements the excerpt system inline in the tool, rather than relying on a separate package. (#4417) * Allows excerpts to come from any package, not just examples. * Fixes a bug in the excerpting logic that was causing a stray `}` to appear in one example. * Removes the need for `build.excerpt.yaml` files. * Remove the dependency on build_runner for excerpts. * Reduces the time to generate the excerpts from about 10 minutes to about 5 seconds. * Almost certainly fixes https://github.com/flutter/flutter/issues/107180 (untested). The new logic is not quite backwards compatible; the `path-base` feature now specifies a real path to the actual source directories, rather than a path into the invisible generated `excerpts/` directory with its special structure. Also, a number of features from the previous package that were not actually used in this repository are no longer supported (such as having multiple section names per `#docregion` pragma). --- packages/standard_message_codec/README.md | 2 +- .../example/build.excerpt.yaml | 16 ---------------- 2 files changed, 1 insertion(+), 17 deletions(-) delete mode 100644 packages/standard_message_codec/example/build.excerpt.yaml diff --git a/packages/standard_message_codec/README.md b/packages/standard_message_codec/README.md index b6c88e6..ab736b6 100644 --- a/packages/standard_message_codec/README.md +++ b/packages/standard_message_codec/README.md @@ -1,4 +1,4 @@ - + An efficient and schemaless binary format used by the Flutter SDK. diff --git a/packages/standard_message_codec/example/build.excerpt.yaml b/packages/standard_message_codec/example/build.excerpt.yaml deleted file mode 100644 index 5af6123..0000000 --- a/packages/standard_message_codec/example/build.excerpt.yaml +++ /dev/null @@ -1,16 +0,0 @@ -targets: - $default: - sources: - include: - - lib/** - # Some default includes that aren't really used here but will prevent - # false-negative warnings: - - $package$ - - lib/$lib$ - exclude: - - '**/.*/**' - - '**/build/**' - builders: - code_excerpter|code_excerpter: - enabled: true - \ No newline at end of file From e8da9aa76390c4e06c58a206519747163d18b563 Mon Sep 17 00:00:00 2001 From: stuartmorgan Date: Thu, 17 Aug 2023 12:59:58 -0700 Subject: [PATCH 086/118] [ci] Update minimums for 3.13 stable (#4731) - Updates the N-1 and N-2 analysis bot configs to 3.7 and 3.10 - Updates the minimum allowed SDK to 3.7, since that's now the earliest we have any testing for. - Updates all packages to Flutter 3.7/Dart 2.19 as a minimum. - In packages where we hadn't released since the last minimum version bump, I removed the previous line from the `#NEXT` section to make it less confusing when we do release. Per https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#version this does not update any package versions. --- packages/flutter_template_images/CHANGELOG.md | 2 +- packages/flutter_template_images/pubspec.yaml | 2 +- packages/multicast_dns/CHANGELOG.md | 2 +- packages/multicast_dns/pubspec.yaml | 2 +- packages/standard_message_codec/CHANGELOG.md | 2 +- packages/standard_message_codec/example/pubspec.yaml | 2 +- packages/standard_message_codec/pubspec.yaml | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/flutter_template_images/CHANGELOG.md b/packages/flutter_template_images/CHANGELOG.md index 2e17699..1ed43ef 100644 --- a/packages/flutter_template_images/CHANGELOG.md +++ b/packages/flutter_template_images/CHANGELOG.md @@ -1,6 +1,6 @@ ## NEXT -* Updates minimum supported SDK version to Flutter 3.3/Dart 2.18. +* Updates minimum supported SDK version to Flutter 3.7/Dart 2.19. * Updates minimum SDK version to Flutter 3.0. ## 4.2.0 diff --git a/packages/flutter_template_images/pubspec.yaml b/packages/flutter_template_images/pubspec.yaml index d1bebb8..50ddcfa 100644 --- a/packages/flutter_template_images/pubspec.yaml +++ b/packages/flutter_template_images/pubspec.yaml @@ -5,4 +5,4 @@ issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+ version: 4.2.0 environment: - sdk: ">=2.18.0 <4.0.0" + sdk: ">=2.19.0 <4.0.0" diff --git a/packages/multicast_dns/CHANGELOG.md b/packages/multicast_dns/CHANGELOG.md index 7e8642c..e073171 100644 --- a/packages/multicast_dns/CHANGELOG.md +++ b/packages/multicast_dns/CHANGELOG.md @@ -1,6 +1,6 @@ ## NEXT -* Updates minimum supported SDK version to Flutter 3.3/Dart 2.18. +* Updates minimum supported SDK version to Flutter 3.7/Dart 2.19. ## 0.3.2+3 diff --git a/packages/multicast_dns/pubspec.yaml b/packages/multicast_dns/pubspec.yaml index d0fc19e..ff37d96 100644 --- a/packages/multicast_dns/pubspec.yaml +++ b/packages/multicast_dns/pubspec.yaml @@ -5,7 +5,7 @@ issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+ version: 0.3.2+3 environment: - sdk: ">=2.18.0 <4.0.0" + sdk: ">=2.19.0 <4.0.0" dependencies: meta: ^1.3.0 diff --git a/packages/standard_message_codec/CHANGELOG.md b/packages/standard_message_codec/CHANGELOG.md index 8d00356..c22ad24 100644 --- a/packages/standard_message_codec/CHANGELOG.md +++ b/packages/standard_message_codec/CHANGELOG.md @@ -1,6 +1,6 @@ ## NEXT -* Updates minimum supported SDK version to Flutter 3.3/Dart 2.18. +* Updates minimum supported SDK version to Flutter 3.7/Dart 2.19. ## 0.0.1+3 diff --git a/packages/standard_message_codec/example/pubspec.yaml b/packages/standard_message_codec/example/pubspec.yaml index 1978db7..8b54fd1 100644 --- a/packages/standard_message_codec/example/pubspec.yaml +++ b/packages/standard_message_codec/example/pubspec.yaml @@ -4,7 +4,7 @@ version: 0.0.1 publish_to: none environment: - sdk: ">=2.18.0 <4.0.0" + sdk: ">=2.19.0 <4.0.0" dependencies: standard_message_codec: diff --git a/packages/standard_message_codec/pubspec.yaml b/packages/standard_message_codec/pubspec.yaml index fe73da0..c39303b 100644 --- a/packages/standard_message_codec/pubspec.yaml +++ b/packages/standard_message_codec/pubspec.yaml @@ -5,7 +5,7 @@ repository: https://github.com/flutter/packages/tree/main/packages/standard_mess issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3Astandard_message_codec environment: - sdk: ">=2.18.0 <4.0.0" + sdk: ">=2.19.0 <4.0.0" dev_dependencies: test: ^1.16.0 From 10e499af0dfbc7533cebb1132ef86eb2ad14ba94 Mon Sep 17 00:00:00 2001 From: stuartmorgan Date: Tue, 29 Aug 2023 10:31:23 -0700 Subject: [PATCH 087/118] [all] Add topics to pubspecs (#4771) Adds [topics](https://dart.dev/tools/pub/pubspec#topics) to all packages, supporting the new pub feature for categorizing packages. The heuristics I used were: - Try to use existing topics from https://pub.dev/topics where applicable - Add new topics as necessary to cover things that seemed like obvious relevant topics - Include the plugin name as a topic for all federated plugin packages, for grouping (since pub doesn't inherently group or cross-link implementations) This is not an attempt to be exhaustive; as topics evolve I expect we will add more or adjust. Also updates the repo tooling to enforce topics, so that we don't forget to add them to new packages. The enforced rule is: - All packages must have at least one topic. We could potentially change this to allow an empty `topics` section so that we are enforcing that we didn't just forget to add the section, but in practice even for packages that we don't expect people to be likely to use, I didn't have any issue coming up with at least one relevant topic. - Federated plugin packages must contain the plugin name as a topic. While this isn't time-critical, I chose to include version bumps so that we aren't rolling out topics in a piecemeal way (e.g., with only a random subset of a federated plugin's packages having topics on pub.dev based on what has happened to have a bugfix). --- packages/flutter_template_images/CHANGELOG.md | 3 ++- packages/flutter_template_images/pubspec.yaml | 6 +++++- packages/multicast_dns/CHANGELOG.md | 3 ++- packages/multicast_dns/pubspec.yaml | 7 ++++++- packages/standard_message_codec/CHANGELOG.md | 3 ++- packages/standard_message_codec/pubspec.yaml | 7 ++++++- 6 files changed, 23 insertions(+), 6 deletions(-) diff --git a/packages/flutter_template_images/CHANGELOG.md b/packages/flutter_template_images/CHANGELOG.md index 1ed43ef..3d8511a 100644 --- a/packages/flutter_template_images/CHANGELOG.md +++ b/packages/flutter_template_images/CHANGELOG.md @@ -1,5 +1,6 @@ -## NEXT +## 4.2.1 +* Adds pub topics to package metadata. * Updates minimum supported SDK version to Flutter 3.7/Dart 2.19. * Updates minimum SDK version to Flutter 3.0. diff --git a/packages/flutter_template_images/pubspec.yaml b/packages/flutter_template_images/pubspec.yaml index 50ddcfa..d9cbfdd 100644 --- a/packages/flutter_template_images/pubspec.yaml +++ b/packages/flutter_template_images/pubspec.yaml @@ -2,7 +2,11 @@ name: flutter_template_images description: Image files for use in flutter_tools templates without adding binary files to flutter/flutter. repository: https://github.com/flutter/packages/tree/main/packages/flutter_template_images issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+flutter_template_images%22 -version: 4.2.0 +version: 4.2.1 environment: sdk: ">=2.19.0 <4.0.0" + +topics: + - assets + - image diff --git a/packages/multicast_dns/CHANGELOG.md b/packages/multicast_dns/CHANGELOG.md index e073171..99d7592 100644 --- a/packages/multicast_dns/CHANGELOG.md +++ b/packages/multicast_dns/CHANGELOG.md @@ -1,5 +1,6 @@ -## NEXT +## 0.3.2+4 +* Adds pub topics to package metadata. * Updates minimum supported SDK version to Flutter 3.7/Dart 2.19. ## 0.3.2+3 diff --git a/packages/multicast_dns/pubspec.yaml b/packages/multicast_dns/pubspec.yaml index ff37d96..37e493f 100644 --- a/packages/multicast_dns/pubspec.yaml +++ b/packages/multicast_dns/pubspec.yaml @@ -2,7 +2,7 @@ name: multicast_dns description: Dart package for performing mDNS queries (e.g. Bonjour, Avahi). repository: https://github.com/flutter/packages/tree/main/packages/multicast_dns issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+multicast_dns%22 -version: 0.3.2+3 +version: 0.3.2+4 environment: sdk: ">=2.19.0 <4.0.0" @@ -12,3 +12,8 @@ dependencies: dev_dependencies: test: "^1.16.5" + +topics: + - bonjour + - mdns + - network diff --git a/packages/standard_message_codec/CHANGELOG.md b/packages/standard_message_codec/CHANGELOG.md index c22ad24..c208b8c 100644 --- a/packages/standard_message_codec/CHANGELOG.md +++ b/packages/standard_message_codec/CHANGELOG.md @@ -1,5 +1,6 @@ -## NEXT +## 0.0.1+4 +* Adds pub topics to package metadata. * Updates minimum supported SDK version to Flutter 3.7/Dart 2.19. ## 0.0.1+3 diff --git a/packages/standard_message_codec/pubspec.yaml b/packages/standard_message_codec/pubspec.yaml index c39303b..1ad4c39 100644 --- a/packages/standard_message_codec/pubspec.yaml +++ b/packages/standard_message_codec/pubspec.yaml @@ -1,6 +1,6 @@ name: standard_message_codec description: An efficient and schemaless binary encoding format for Flutter and Dart. -version: 0.0.1+3 +version: 0.0.1+4 repository: https://github.com/flutter/packages/tree/main/packages/standard_message_codec issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3Astandard_message_codec @@ -9,3 +9,8 @@ environment: dev_dependencies: test: ^1.16.0 + +topics: + - decode + - encode + - interop From 601902873c49b6c68751a8fda5e215415297e5cf Mon Sep 17 00:00:00 2001 From: stuartmorgan Date: Fri, 17 Nov 2023 17:57:18 -0800 Subject: [PATCH 088/118] [ci] Roll minimum allowable Flutter to 3.10 (#5425) Updates the repo for Flutter 3.16, making the minimum version that packages are allowed to support 3.10, following the process in https://github.com/flutter/flutter/wiki/Updating-Packages-repo-for-a-stable-release Per https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#version this does not bump versions. --- packages/flutter_template_images/CHANGELOG.md | 4 ++++ packages/flutter_template_images/pubspec.yaml | 2 +- packages/multicast_dns/CHANGELOG.md | 5 +++++ packages/multicast_dns/lib/src/lookup_resolver.dart | 2 +- packages/multicast_dns/pubspec.yaml | 4 ++-- packages/standard_message_codec/CHANGELOG.md | 4 ++++ packages/standard_message_codec/example/pubspec.yaml | 2 +- packages/standard_message_codec/pubspec.yaml | 2 +- 8 files changed, 19 insertions(+), 6 deletions(-) diff --git a/packages/flutter_template_images/CHANGELOG.md b/packages/flutter_template_images/CHANGELOG.md index 3d8511a..78d375e 100644 --- a/packages/flutter_template_images/CHANGELOG.md +++ b/packages/flutter_template_images/CHANGELOG.md @@ -1,3 +1,7 @@ +## NEXT + +* Updates minimum supported SDK version to Flutter 3.10/Dart 3.0. + ## 4.2.1 * Adds pub topics to package metadata. diff --git a/packages/flutter_template_images/pubspec.yaml b/packages/flutter_template_images/pubspec.yaml index d9cbfdd..867141a 100644 --- a/packages/flutter_template_images/pubspec.yaml +++ b/packages/flutter_template_images/pubspec.yaml @@ -5,7 +5,7 @@ issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+ version: 4.2.1 environment: - sdk: ">=2.19.0 <4.0.0" + sdk: ">=3.0.0 <4.0.0" topics: - assets diff --git a/packages/multicast_dns/CHANGELOG.md b/packages/multicast_dns/CHANGELOG.md index 99d7592..85a2f7b 100644 --- a/packages/multicast_dns/CHANGELOG.md +++ b/packages/multicast_dns/CHANGELOG.md @@ -1,3 +1,8 @@ +## 0.3.2+5 + +* Updates `PendingRequest` to be a `base class` for Dart 3.0 compatibility. +* Updates minimum supported SDK version to Flutter 3.10/Dart 3.0. + ## 0.3.2+4 * Adds pub topics to package metadata. diff --git a/packages/multicast_dns/lib/src/lookup_resolver.dart b/packages/multicast_dns/lib/src/lookup_resolver.dart index addae7d..ceaa13a 100644 --- a/packages/multicast_dns/lib/src/lookup_resolver.dart +++ b/packages/multicast_dns/lib/src/lookup_resolver.dart @@ -8,7 +8,7 @@ import 'dart:collection'; import 'resource_record.dart'; /// Class for maintaining state about pending mDNS requests. -class PendingRequest extends LinkedListEntry { +base class PendingRequest extends LinkedListEntry { /// Creates a new PendingRequest. PendingRequest(this.type, this.domainName, this.controller); diff --git a/packages/multicast_dns/pubspec.yaml b/packages/multicast_dns/pubspec.yaml index 37e493f..59b907f 100644 --- a/packages/multicast_dns/pubspec.yaml +++ b/packages/multicast_dns/pubspec.yaml @@ -2,10 +2,10 @@ name: multicast_dns description: Dart package for performing mDNS queries (e.g. Bonjour, Avahi). repository: https://github.com/flutter/packages/tree/main/packages/multicast_dns issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+multicast_dns%22 -version: 0.3.2+4 +version: 0.3.2+5 environment: - sdk: ">=2.19.0 <4.0.0" + sdk: ">=3.0.0 <4.0.0" dependencies: meta: ^1.3.0 diff --git a/packages/standard_message_codec/CHANGELOG.md b/packages/standard_message_codec/CHANGELOG.md index c208b8c..9ce85a8 100644 --- a/packages/standard_message_codec/CHANGELOG.md +++ b/packages/standard_message_codec/CHANGELOG.md @@ -1,3 +1,7 @@ +## NEXT + +* Updates minimum supported SDK version to Flutter 3.10/Dart 3.0. + ## 0.0.1+4 * Adds pub topics to package metadata. diff --git a/packages/standard_message_codec/example/pubspec.yaml b/packages/standard_message_codec/example/pubspec.yaml index 8b54fd1..555ddde 100644 --- a/packages/standard_message_codec/example/pubspec.yaml +++ b/packages/standard_message_codec/example/pubspec.yaml @@ -4,7 +4,7 @@ version: 0.0.1 publish_to: none environment: - sdk: ">=2.19.0 <4.0.0" + sdk: ">=3.0.0 <4.0.0" dependencies: standard_message_codec: diff --git a/packages/standard_message_codec/pubspec.yaml b/packages/standard_message_codec/pubspec.yaml index 1ad4c39..ee3ed12 100644 --- a/packages/standard_message_codec/pubspec.yaml +++ b/packages/standard_message_codec/pubspec.yaml @@ -5,7 +5,7 @@ repository: https://github.com/flutter/packages/tree/main/packages/standard_mess issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3Astandard_message_codec environment: - sdk: ">=2.19.0 <4.0.0" + sdk: ">=3.0.0 <4.0.0" dev_dependencies: test: ^1.16.0 From 9b0e3c1bbae6ff0c2a39fc7451110a2f2a49d502 Mon Sep 17 00:00:00 2001 From: stuartmorgan Date: Sat, 9 Dec 2023 01:06:19 -0800 Subject: [PATCH 089/118] [multicast_dns] Adjust README (#5529) - Improves link targets to be more directly useful. - Removes the unnecessary code sections showing an import, since the install tab already demonstrates that. - Removes the no-longer-needed exemption from the excerpt requirement. Part of https://github.com/flutter/flutter/issues/102679 --- packages/multicast_dns/CHANGELOG.md | 4 ++++ packages/multicast_dns/README.md | 14 ++++---------- packages/multicast_dns/pubspec.yaml | 2 +- 3 files changed, 9 insertions(+), 11 deletions(-) diff --git a/packages/multicast_dns/CHANGELOG.md b/packages/multicast_dns/CHANGELOG.md index 85a2f7b..eb61287 100644 --- a/packages/multicast_dns/CHANGELOG.md +++ b/packages/multicast_dns/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.3.2+6 + +* Improves links in README.md. + ## 0.3.2+5 * Updates `PendingRequest` to be a `base class` for Dart 3.0 compatibility. diff --git a/packages/multicast_dns/README.md b/packages/multicast_dns/README.md index 26226f6..10cd33e 100644 --- a/packages/multicast_dns/README.md +++ b/packages/multicast_dns/README.md @@ -6,15 +6,9 @@ https://pub.dartlang.org/packages/multicast_dns) A Dart package to do service discovery over multicast DNS (mDNS), Bonjour, and Avahi. ## Usage -To use this package, add `multicast_dns` as a -[dependency in your pubspec.yaml file](https://flutter.io/platform-plugins/). - -## Example -Import the library via -``` dart -import 'package:multicast_dns/multicast_dns.dart'; -``` +To use this package, add `multicast_dns` as a +[dependency in your pubspec.yaml file](https://pub.dev/packages/multicast_dns/install). -Then use the `MDnsClient` Dart class in your code. To see how this is done, -check out the [example app](example/main.dart). +[The example](https://pub.dev/packages/multicast_dns/example) demonstrates how +to use the `MDnsClient` Dart class in your code. diff --git a/packages/multicast_dns/pubspec.yaml b/packages/multicast_dns/pubspec.yaml index 59b907f..a0211e7 100644 --- a/packages/multicast_dns/pubspec.yaml +++ b/packages/multicast_dns/pubspec.yaml @@ -2,7 +2,7 @@ name: multicast_dns description: Dart package for performing mDNS queries (e.g. Bonjour, Avahi). repository: https://github.com/flutter/packages/tree/main/packages/multicast_dns issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+multicast_dns%22 -version: 0.3.2+5 +version: 0.3.2+6 environment: sdk: ">=3.0.0 <4.0.0" From b0aafc1bef12a56a68a770c8c13d1175e3ca5f5b Mon Sep 17 00:00:00 2001 From: stuartmorgan Date: Fri, 16 Feb 2024 09:34:11 -0800 Subject: [PATCH 090/118] [ci/various] Update for 3.19 stable (#6147) Does the steps from https://github.com/flutter/flutter/wiki/Updating-Packages-repo-for-a-stable-release to account for stable now being 3.19, and N-2 (and thus our minimum supported min version) being 3.13. These changes are version-bump-exempt [by repo policy](https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#version). --- packages/flutter_template_images/CHANGELOG.md | 2 +- packages/flutter_template_images/pubspec.yaml | 2 +- packages/multicast_dns/CHANGELOG.md | 4 ++++ packages/multicast_dns/pubspec.yaml | 2 +- packages/standard_message_codec/CHANGELOG.md | 2 +- packages/standard_message_codec/example/pubspec.yaml | 2 +- packages/standard_message_codec/pubspec.yaml | 2 +- 7 files changed, 10 insertions(+), 6 deletions(-) diff --git a/packages/flutter_template_images/CHANGELOG.md b/packages/flutter_template_images/CHANGELOG.md index 78d375e..3d5ff3e 100644 --- a/packages/flutter_template_images/CHANGELOG.md +++ b/packages/flutter_template_images/CHANGELOG.md @@ -1,6 +1,6 @@ ## NEXT -* Updates minimum supported SDK version to Flutter 3.10/Dart 3.0. +* Updates minimum supported SDK version to Flutter 3.13/Dart 3.1. ## 4.2.1 diff --git a/packages/flutter_template_images/pubspec.yaml b/packages/flutter_template_images/pubspec.yaml index 867141a..299aece 100644 --- a/packages/flutter_template_images/pubspec.yaml +++ b/packages/flutter_template_images/pubspec.yaml @@ -5,7 +5,7 @@ issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+ version: 4.2.1 environment: - sdk: ">=3.0.0 <4.0.0" + sdk: ^3.1.0 topics: - assets diff --git a/packages/multicast_dns/CHANGELOG.md b/packages/multicast_dns/CHANGELOG.md index eb61287..1ea1abc 100644 --- a/packages/multicast_dns/CHANGELOG.md +++ b/packages/multicast_dns/CHANGELOG.md @@ -1,3 +1,7 @@ +## NEXT + +* Updates minimum supported SDK version to Flutter 3.13/Dart 3.1. + ## 0.3.2+6 * Improves links in README.md. diff --git a/packages/multicast_dns/pubspec.yaml b/packages/multicast_dns/pubspec.yaml index a0211e7..301de70 100644 --- a/packages/multicast_dns/pubspec.yaml +++ b/packages/multicast_dns/pubspec.yaml @@ -5,7 +5,7 @@ issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+ version: 0.3.2+6 environment: - sdk: ">=3.0.0 <4.0.0" + sdk: ^3.1.0 dependencies: meta: ^1.3.0 diff --git a/packages/standard_message_codec/CHANGELOG.md b/packages/standard_message_codec/CHANGELOG.md index 9ce85a8..6a37c02 100644 --- a/packages/standard_message_codec/CHANGELOG.md +++ b/packages/standard_message_codec/CHANGELOG.md @@ -1,6 +1,6 @@ ## NEXT -* Updates minimum supported SDK version to Flutter 3.10/Dart 3.0. +* Updates minimum supported SDK version to Flutter 3.13/Dart 3.1. ## 0.0.1+4 diff --git a/packages/standard_message_codec/example/pubspec.yaml b/packages/standard_message_codec/example/pubspec.yaml index 555ddde..ed3c3f2 100644 --- a/packages/standard_message_codec/example/pubspec.yaml +++ b/packages/standard_message_codec/example/pubspec.yaml @@ -4,7 +4,7 @@ version: 0.0.1 publish_to: none environment: - sdk: ">=3.0.0 <4.0.0" + sdk: ^3.1.0 dependencies: standard_message_codec: diff --git a/packages/standard_message_codec/pubspec.yaml b/packages/standard_message_codec/pubspec.yaml index ee3ed12..fe6fb43 100644 --- a/packages/standard_message_codec/pubspec.yaml +++ b/packages/standard_message_codec/pubspec.yaml @@ -5,7 +5,7 @@ repository: https://github.com/flutter/packages/tree/main/packages/standard_mess issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3Astandard_message_codec environment: - sdk: ">=3.0.0 <4.0.0" + sdk: ^3.1.0 dev_dependencies: test: ^1.16.0 From 20e7419e74f37d430346d06fb7db05e4a92faff8 Mon Sep 17 00:00:00 2001 From: stuartmorgan Date: Wed, 15 May 2024 09:57:06 -0400 Subject: [PATCH 091/118] Update the repo for the 3.22 stable release (#6730) Does all of the steps of https://github.com/flutter/flutter/wiki/Updating-Packages-repo-for-a-stable-release other than the first (which is https://github.com/flutter/packages/pull/6727). --- packages/flutter_template_images/CHANGELOG.md | 2 +- packages/flutter_template_images/pubspec.yaml | 2 +- packages/multicast_dns/CHANGELOG.md | 2 +- packages/multicast_dns/pubspec.yaml | 2 +- packages/standard_message_codec/CHANGELOG.md | 2 +- packages/standard_message_codec/example/pubspec.yaml | 2 +- packages/standard_message_codec/pubspec.yaml | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/flutter_template_images/CHANGELOG.md b/packages/flutter_template_images/CHANGELOG.md index 3d5ff3e..69b55d3 100644 --- a/packages/flutter_template_images/CHANGELOG.md +++ b/packages/flutter_template_images/CHANGELOG.md @@ -1,6 +1,6 @@ ## NEXT -* Updates minimum supported SDK version to Flutter 3.13/Dart 3.1. +* Updates minimum supported SDK version to Flutter 3.16/Dart 3.2. ## 4.2.1 diff --git a/packages/flutter_template_images/pubspec.yaml b/packages/flutter_template_images/pubspec.yaml index 299aece..b046675 100644 --- a/packages/flutter_template_images/pubspec.yaml +++ b/packages/flutter_template_images/pubspec.yaml @@ -5,7 +5,7 @@ issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+ version: 4.2.1 environment: - sdk: ^3.1.0 + sdk: ^3.2.0 topics: - assets diff --git a/packages/multicast_dns/CHANGELOG.md b/packages/multicast_dns/CHANGELOG.md index 1ea1abc..9cb4830 100644 --- a/packages/multicast_dns/CHANGELOG.md +++ b/packages/multicast_dns/CHANGELOG.md @@ -1,6 +1,6 @@ ## NEXT -* Updates minimum supported SDK version to Flutter 3.13/Dart 3.1. +* Updates minimum supported SDK version to Flutter 3.16/Dart 3.2. ## 0.3.2+6 diff --git a/packages/multicast_dns/pubspec.yaml b/packages/multicast_dns/pubspec.yaml index 301de70..1d6d434 100644 --- a/packages/multicast_dns/pubspec.yaml +++ b/packages/multicast_dns/pubspec.yaml @@ -5,7 +5,7 @@ issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+ version: 0.3.2+6 environment: - sdk: ^3.1.0 + sdk: ^3.2.0 dependencies: meta: ^1.3.0 diff --git a/packages/standard_message_codec/CHANGELOG.md b/packages/standard_message_codec/CHANGELOG.md index 6a37c02..a8b04ef 100644 --- a/packages/standard_message_codec/CHANGELOG.md +++ b/packages/standard_message_codec/CHANGELOG.md @@ -1,6 +1,6 @@ ## NEXT -* Updates minimum supported SDK version to Flutter 3.13/Dart 3.1. +* Updates minimum supported SDK version to Flutter 3.16/Dart 3.2. ## 0.0.1+4 diff --git a/packages/standard_message_codec/example/pubspec.yaml b/packages/standard_message_codec/example/pubspec.yaml index ed3c3f2..41b8de7 100644 --- a/packages/standard_message_codec/example/pubspec.yaml +++ b/packages/standard_message_codec/example/pubspec.yaml @@ -4,7 +4,7 @@ version: 0.0.1 publish_to: none environment: - sdk: ^3.1.0 + sdk: ^3.2.0 dependencies: standard_message_codec: diff --git a/packages/standard_message_codec/pubspec.yaml b/packages/standard_message_codec/pubspec.yaml index fe6fb43..10e1df4 100644 --- a/packages/standard_message_codec/pubspec.yaml +++ b/packages/standard_message_codec/pubspec.yaml @@ -5,7 +5,7 @@ repository: https://github.com/flutter/packages/tree/main/packages/standard_mess issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3Astandard_message_codec environment: - sdk: ^3.1.0 + sdk: ^3.2.0 dev_dependencies: test: ^1.16.0 From 395b202b949e3d922cfd618c6c58db2b627657a6 Mon Sep 17 00:00:00 2001 From: MrJack <36191829+biagiopietro@users.noreply.github.com> Date: Mon, 24 Jun 2024 20:57:33 +0200 Subject: [PATCH 092/118] [multicast_dns] Optimized Socket Binding: Always bind to 0.0.0.0 for simplicity and efficiency - #79772 (#6700) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit I encountered this package long time ago (see linked issue below) and there were cases where it wasn't working. After 3 years (yeah it's more time than expected) I managed to find the time to dust off `wireshark` and have look again. # Preamble Considering the following setup image Where Raspberry pi runs a `mDNS` service using the following `go`:

main.go

```go package main import ( "fmt" "github.com/hashicorp/mdns" "os" "net/http" ) func health(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "ok") } func main() { hostname, err := os.Hostname() if err != nil { panic(fmt.Sprintf("Error getting current hostname, description: %s", err.Error())) } info := []string{"mDNS get server"} service, err := mdns.NewMDNSService(hostname, "_test._tcp", "", "", 8080, nil, info) if err != nil { panic(fmt.Sprintf("Error while exporting the service, description: %s", err.Error())) } server, err := mdns.NewServer(&mdns.Config{Zone: service}) if err != nil { panic(fmt.Sprintf("Error while setting the discover server up, description: %s", err.Error())) } defer server.Shutdown() http.HandleFunc("/", health) http.ListenAndServe(":8081",nil) } ```

Considering the following client (which I got from [here](https://pub.dev/packages/multicast_dns/example)):
client.dart

```dart // Copyright 2013 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Example script to illustrate how to use the mdns package to discover the port // of a Dart observatory over mDNS. // ignore_for_file: avoid_print import 'package:multicast_dns/multicast_dns.dart'; Future main() async { // Parse the command line arguments. const String name = '_test._tcp.local'; final MDnsClient client = MDnsClient(); // Start the client with default options. await client.start(); // Get the PTR record for the service. await for (final PtrResourceRecord ptr in client .lookup(ResourceRecordQuery.serverPointer(name))) { // Use the domainName from the PTR record to get the SRV record, // which will have the port and local hostname. // Note that duplicate messages may come through, especially if any // other mDNS queries are running elsewhere on the machine. await for (final SrvResourceRecord srv in client.lookup( ResourceRecordQuery.service(ptr.domainName))) { // Domain name will be something like "io.flutter.example@some-iphone.local._dartobservatory._tcp.local" final String bundleId = ptr.domainName; //.substring(0, ptr.domainName.indexOf('@')); print('Dart observatory instance found at ' '${srv.target}:${srv.port} for "$bundleId".'); } } client.stop(); print('Done.'); } ```

# What happens When running the client script (`dart run client.dart` so with the latest package of `multicast_dns` package) as is, a list of sockets is created which are bind to port `5353` and `IP`s: - `0.0.0.0`; - `127.0.0.1`; - `192.168.2.16`; - `172.17.0.1`; a list of interfaces (see list below) are _joined_ to the multicast socket which is bound to `0.0.0.0:5353`: - `lo` (with address `127.0.0.1`); - `wlan0` (with address `192.168.2.16`); - `docker0` (with address `172.17.0.1`). and eventually when `lookup` function is being called `QM`queries are being sent from `ALL` the sockets in the list; which means that for `0.0.0.0` the `IP` address chosen by the **operating system** will depend on various factors such as the routing table, the default network interface, and the specific configuration of the network interfaces on the machine. It could be sent from any of the `IP` addresses associated with the machine's network interfaces, including `IP` addresses assigned to physical network adapters or virtual interfaces. Using `Wireshark`, I can see that 2 `QM` packets are being sent and I can see that `mDNS` service is responding to the client with proper packet but it seems that the socket opened at `0.0.0.0:5353` is not reading them at all even though the socket is still open. ```shell Source Destination Protocol Length Info 192.168.2.16 224.0.0.251 MDNS 76 Standard query 0x0000 PTR _test._tcp.local, "QM" question 192.168.2.16 224.0.0.251 MDNS 76 Standard query 0x0000 PTR _test._tcp.local, "QM" question 192.168.2.7 192.168.2.16 MDNS 180 Standard query response 0x0000 PTR mdnsserv._test._tcp.local SRV 10 1 8080 mdnsserv A 127.0.1.1 TXT 192.168.2.7 192.168.2.16 MDNS 180 Standard query response 0x0000 PTR mdnsserv._test._tcp.local SRV 10 1 8080 mdnsserv A 127.0.1.1 TXT ``` # First approach (not sure if it's RFC 6762 friendly) I had the "_feeling_" that sending `QM` packets to `0.0.0.0:5353` and other interfaces on the same port would generate some _sort of unexpected behavior_ due to the nature of `0.0.0.0` which `IP` selections **depends on multiple factors**. Therefore I tried initially to change the `incoming` socket (the one bound to `0.0.0.0`) from: ```dart final RawDatagramSocket incoming = await _rawDatagramSocketFactory( listenAddress.address, selectedMDnsPort, reuseAddress: true, reusePort: true, ttl: 255, ); ``` to ``` dart final RawDatagramSocket incoming = await _rawDatagramSocketFactory( listenAddress.address, 0, reuseAddress: true, reusePort: true, ttl: 255, ); ``` which essentially delegates to `OS` to choose a **random** port (instead of forcing `5353`). In this case the client managed to process correctly all the packages for discovering the `mDNS` service, indeed in `Wireshark` I could see: ```shell Source Destination Protocol Length Info 192.168.2.16 224.0.0.251 MDNS 76 Standard query 0x0000 PTR _test._tcp.local, "QM" question 192.168.2.16 224.0.0.251 MDNS 76 Standard query 0x0000 PTR _test._tcp.local, "QM" question 192.168.2.7 192.168.2.16 MDNS 180 Standard query response 0x0000 PTR mdnsserv._test._tcp.local SRV 10 1 8080 mdnsserv A 127.0.1.1 TXT 192.168.2.7 192.168.2.16 MDNS 180 Standard query response 0x0000 PTR mdnsserv._test._tcp.local SRV 10 1 8080 mdnsserv A 127.0.1.1 TXT 192.168.2.16 224.0.0.251 MDNS 85 Standard query 0x0000 SRV mdnsserv._test._tcp.local, "QM" question 192.168.2.16 224.0.0.251 MDNS 85 Standard query 0x0000 SRV mdnsserv._test._tcp.local, "QM" question 192.168.2.7 192.168.2.16 MDNS 123 Standard query response 0x0000 SRV 10 1 8080 mdnsserv A 127.0.1.1 192.168.2.7 192.168.2.16 MDNS 123 Standard query response 0x0000 SRV 10 1 8080 mdnsserv A 127.0.1.1 ``` and on the client I could see the message: ```shell Dart observatory instance found at mdnsserv:8080 for "mdnsserv._test._tcp.local" ``` ⚠️ : Again, I'm not sure if it can be considered a _solution_ because I dunno is`RFC 6762` friendly, I checked some packages which implement `mDNS` clients and I saw some of them doing what I proposed. I would like to hear comments about it. # Second approach (which it's what is presented in this PR) After trying the first approach I realized that _maybe_ there is no need to open sockets on more interfaces (and therefore send `QM` messages) it maybe be enough to send and listen only on a socket bound to `0.0.0.0` since, again, listen on **ANY** `IP` and send packets from a selected `IP` address chosen by the `OS`. Also in this case the client managed to process correctly all the packages for discovering the `mDNS` service, indeed in `Wireshark` I could see: ```shell Source Destination Protocol Length Info 192.168.2.16 224.0.0.251 MDNS 76 Standard query 0x0000 PTR _test._tcp.local, "QM" question 192.168.2.7 192.168.2.16 MDNS 180 Standard query response 0x0000 PTR mdnsserv._test._tcp.local SRV 10 1 8080 mdnsserv A 127.0.1.1 TXT 192.168.2.16 224.0.0.251 MDNS 85 Standard query 0x0000 SRV mdnsserv._test._tcp.local, "QM" question 192.168.2.7 192.168.2.16 MDNS 123 Standard query response 0x0000 SRV 10 1 8080 mdnsserv A 127.0.1.1 ``` and on the client I could see the message: ```shell Dart observatory instance found at mdnsserv:8080 for "mdnsserv._test._tcp.local" ``` # Third approach (It did not work but mentioning for completeness) The idea here is to **don't send** `QM` packets via `0.0.0.0` but just **listen** on possible response/s since packets would be send via the following `IP`s and `0.0.0.0` should represent **ANY** `IP`. - `127.0.0.1`; - `192.168.2.16`; - `172.17.0.1`. # Fourth approach (It did not work but mentioning for completeness) Another solution that I tried but unfortunately it did not work, was to put `0.0.0.0` as **last** item in the socket list so `QM` packets would be sent according to the following order: - `127.0.0.1`; - `192.168.2.16`; - `172.17.0.1`; - `0.0.0.0`.
multicast_dns.start() function

```dart Future start({ InternetAddress? listenAddress, NetworkInterfacesFactory? interfacesFactory, int mDnsPort = mDnsPort, InternetAddress? mDnsAddress, }) async { listenAddress ??= InternetAddress.anyIPv4; interfacesFactory ??= allInterfacesFactory; assert(listenAddress.address == InternetAddress.anyIPv4.address || listenAddress.address == InternetAddress.anyIPv6.address); if (_started || _starting) { return; } _starting = true; final int selectedMDnsPort = _mDnsPort = mDnsPort; _mDnsAddress = mDnsAddress; // Listen on all addresses. final RawDatagramSocket incoming = await _rawDatagramSocketFactory( listenAddress.address, selectedMDnsPort, reuseAddress: true, reusePort: true, ttl: 255, ); _mDnsAddress ??= incoming.address.type == InternetAddressType.IPv4 ? mDnsAddressIPv4 : mDnsAddressIPv6; final List interfaces = (await interfacesFactory(listenAddress.type)).toList(); for (final NetworkInterface interface in interfaces) { // Create a socket for sending on each adapter. final InternetAddress targetAddress = interface.addresses[0]; // Join multicast on this interface. incoming.joinMulticast(_mDnsAddress!, interface); } // Can't send to IPv6 any address. if (incoming.address != InternetAddress.anyIPv6) { _sockets.add(incoming); } else { _toBeClosed.add(incoming); } incoming.listen((RawSocketEvent event) => _handleIncoming(event, incoming)); _started = true; _starting = false; } ```

The idea is indeed to let the first 3 `IP`s to send the `QM` packets which response should be _hopefully_ captured by the `incoming` socket before the socket on `0.0.0.0` would send the `QM` packet too. # Wireshark filter ```shell (ip.src==192.168.2.7 || ip.src==192.168.2.16) && udp.port eq 5353 ``` # Related Issue - It should resolves issue [#79772](https://github.com/flutter/flutter/issues/79772) # Disclaimers - I'm not expert in `flutter`/`dart`, I pulled the code and I tried to debug it with help of uncle `google` and `print()`; - I don't have a huge expertise in networking but I _know_ how to play a bit with `Wireshark`, inspect the networks and craft packets. --- packages/multicast_dns/CHANGELOG.md | 3 +- packages/multicast_dns/README.md | 2 + packages/multicast_dns/lib/multicast_dns.dart | 57 ++++++----- packages/multicast_dns/pubspec.yaml | 2 +- packages/multicast_dns/test/client_test.dart | 98 +++++++++++++++++++ 5 files changed, 131 insertions(+), 31 deletions(-) diff --git a/packages/multicast_dns/CHANGELOG.md b/packages/multicast_dns/CHANGELOG.md index 9cb4830..6db175a 100644 --- a/packages/multicast_dns/CHANGELOG.md +++ b/packages/multicast_dns/CHANGELOG.md @@ -1,5 +1,6 @@ -## NEXT +## 0.3.2+7 +* Optimized Socket Binding: Always bind to 0.0.0.0 for simplicity and efficiency. * Updates minimum supported SDK version to Flutter 3.16/Dart 3.2. ## 0.3.2+6 diff --git a/packages/multicast_dns/README.md b/packages/multicast_dns/README.md index 10cd33e..c161b6f 100644 --- a/packages/multicast_dns/README.md +++ b/packages/multicast_dns/README.md @@ -1,5 +1,7 @@ # Multicast DNS package +Based on [RFC 6762 Multicast DNS](https://datatracker.ietf.org/doc/html/rfc6762). + [![pub package](https://img.shields.io/pub/v/multicast_dns.svg)]( https://pub.dartlang.org/packages/multicast_dns) diff --git a/packages/multicast_dns/lib/multicast_dns.dart b/packages/multicast_dns/lib/multicast_dns.dart index 336ac42..d6e2e6b 100644 --- a/packages/multicast_dns/lib/multicast_dns.dart +++ b/packages/multicast_dns/lib/multicast_dns.dart @@ -48,8 +48,8 @@ class MDnsClient { bool _starting = false; bool _started = false; - final List _sockets = []; - final List _toBeClosed = []; + RawDatagramSocket? _incomingIPv4; + final List _ipv6InterfaceSockets = []; final LookupResolver _resolver = LookupResolver(); final ResourceRecordCache _cache = ResourceRecordCache(); final RawDatagramSocketFactory _rawDatagramSocketFactory; @@ -117,9 +117,9 @@ class MDnsClient { // Can't send to IPv6 any address. if (incoming.address != InternetAddress.anyIPv6) { - _sockets.add(incoming); + _incomingIPv4 = incoming; } else { - _toBeClosed.add(incoming); + _ipv6InterfaceSockets.add(incoming); } _mDnsAddress ??= incoming.address.type == InternetAddressType.IPv4 @@ -130,30 +130,25 @@ class MDnsClient { (await interfacesFactory(listenAddress.type)).toList(); for (final NetworkInterface interface in interfaces) { - // Create a socket for sending on each adapter. final InternetAddress targetAddress = interface.addresses[0]; - final RawDatagramSocket socket = await _rawDatagramSocketFactory( - targetAddress, - selectedMDnsPort, - reuseAddress: true, - reusePort: true, - ttl: 255, - ); - _sockets.add(socket); + // Ensure that we're using this address/interface for multicast. - if (targetAddress.type == InternetAddressType.IPv4) { - socket.setRawOption(RawSocketOption( - RawSocketOption.levelIPv4, - RawSocketOption.IPv4MulticastInterface, - targetAddress.rawAddress, - )); - } else { + if (targetAddress.type == InternetAddressType.IPv6) { + final RawDatagramSocket socket = await _rawDatagramSocketFactory( + targetAddress, + selectedMDnsPort, + reuseAddress: true, + reusePort: true, + ttl: 255, + ); + _ipv6InterfaceSockets.add(socket); socket.setRawOption(RawSocketOption.fromInt( RawSocketOption.levelIPv6, RawSocketOption.IPv6MulticastInterface, interface.index, )); } + // Join multicast on this interface. incoming.joinMulticast(_mDnsAddress!, interface); } @@ -171,15 +166,13 @@ class MDnsClient { throw StateError('Cannot stop mDNS client while it is starting.'); } - for (final RawDatagramSocket socket in _sockets) { - socket.close(); - } - _sockets.clear(); + _incomingIPv4?.close(); + _incomingIPv4 = null; - for (final RawDatagramSocket socket in _toBeClosed) { + for (final RawDatagramSocket socket in _ipv6InterfaceSockets) { socket.close(); } - _toBeClosed.clear(); + _ipv6InterfaceSockets.clear(); _resolver.clearPendingRequests(); @@ -219,11 +212,17 @@ class MDnsClient { final Stream results = _resolver.addPendingRequest( query.resourceRecordType, query.fullyQualifiedName, timeout); - // Send the request on all interfaces. final List packet = query.encode(); - for (final RawDatagramSocket socket in _sockets) { - socket.send(packet, _mDnsAddress!, selectedMDnsPort); + + if (_mDnsAddress?.type == InternetAddressType.IPv4) { + // Send and listen on same "ANY" interface + _incomingIPv4?.send(packet, _mDnsAddress!, selectedMDnsPort); + } else { + for (final RawDatagramSocket socket in _ipv6InterfaceSockets) { + socket.send(packet, _mDnsAddress!, selectedMDnsPort); + } } + return results; } diff --git a/packages/multicast_dns/pubspec.yaml b/packages/multicast_dns/pubspec.yaml index 1d6d434..6621352 100644 --- a/packages/multicast_dns/pubspec.yaml +++ b/packages/multicast_dns/pubspec.yaml @@ -2,7 +2,7 @@ name: multicast_dns description: Dart package for performing mDNS queries (e.g. Bonjour, Avahi). repository: https://github.com/flutter/packages/tree/main/packages/multicast_dns issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+multicast_dns%22 -version: 0.3.2+6 +version: 0.3.2+7 environment: sdk: ^3.2.0 diff --git a/packages/multicast_dns/test/client_test.dart b/packages/multicast_dns/test/client_test.dart index 134d751..f3047e5 100644 --- a/packages/multicast_dns/test/client_test.dart +++ b/packages/multicast_dns/test/client_test.dart @@ -86,6 +86,78 @@ void main() { await client.start(); await client.lookup(ResourceRecordQuery.serverPointer('_')).toList(); }); + + group('Bind a single socket to ANY IPv4 and more than one when IPv6', () { + final List> testCases = >[ + { + 'name': 'IPv4', + 'datagramSocketType': InternetAddress.anyIPv4, + 'interfacePrefix': '192.168.2.' + }, + { + 'name': 'IPv6', + 'datagramSocketType': InternetAddress.anyIPv6, + 'interfacePrefix': '2001:0db8:85a3:0000:0000:8a2e:7335:030' + } + ]; + + for (final Map testCase in testCases) { + test('Bind a single socket to ANY ${testCase["name"]}', () async { + final FakeRawDatagramSocket datagramSocket = FakeRawDatagramSocket(); + + datagramSocket.address = + testCase['datagramSocketType']! as InternetAddress; + + final List selectedInterfacesForSendingPackets = []; + final MDnsClient client = MDnsClient(rawDatagramSocketFactory: + (dynamic host, int port, + {bool reuseAddress = true, + bool reusePort = true, + int ttl = 1}) async { + selectedInterfacesForSendingPackets.add(host); + return datagramSocket; + }); + + const int numberOfFakeInterfaces = 10; + Future> fakeNetworkInterfacesFactory( + InternetAddressType type) async { + final List fakeInterfaces = []; + + // Generate "fake" interfaces + for (int i = 0; i < numberOfFakeInterfaces; i++) { + fakeInterfaces.add(FakeNetworkInterface( + 'inetfake$i', + [ + InternetAddress("${testCase['interfacePrefix']! as String}$i") + ], + 0, + )); + } + + // ignore: always_specify_types + return Future.value(fakeInterfaces); + } + + final InternetAddress listenAddress = + testCase['datagramSocketType']! as InternetAddress; + + await client.start( + listenAddress: listenAddress, + mDnsPort: 1234, + interfacesFactory: fakeNetworkInterfacesFactory); + client.stop(); + + if (testCase['datagramSocketType'] == InternetAddress.anyIPv4) { + expect(selectedInterfacesForSendingPackets.length, 1); + } else { + // + 1 because of unspecified address (::) + expect(selectedInterfacesForSendingPackets.length, + numberOfFakeInterfaces + 1); + } + expect(selectedInterfacesForSendingPackets[0], listenAddress.address); + }); + } + }); } class FakeRawDatagramSocket extends Fake implements RawDatagramSocket { @@ -113,4 +185,30 @@ class FakeRawDatagramSocket extends Fake implements RawDatagramSocket { int send(List buffer, InternetAddress address, int port) { return buffer.length; } + + @override + void joinMulticast(InternetAddress group, [NetworkInterface? interface]) { + // nothing to do here + } + @override + void setRawOption(RawSocketOption option) { + // nothing to do here + } +} + +class FakeNetworkInterface implements NetworkInterface { + FakeNetworkInterface(this._name, this._addresses, this._index); + + final String _name; + final List _addresses; + final int _index; + + @override + List get addresses => _addresses; + + @override + String get name => _name; + + @override + int get index => _index; } From bb12597883f000e4959ee8ebe084ee59ade40947 Mon Sep 17 00:00:00 2001 From: Parker Lougheed Date: Tue, 25 Jun 2024 13:05:07 -0500 Subject: [PATCH 093/118] [various] Update flutter.dev links to more reliable destinations (#6963) Contributes to https://github.com/flutter/website/issues/10363 by updating to the latest links and updating some links to use new `/to/` links that can be updated as needed. --- packages/multicast_dns/README.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/packages/multicast_dns/README.md b/packages/multicast_dns/README.md index c161b6f..f30ce16 100644 --- a/packages/multicast_dns/README.md +++ b/packages/multicast_dns/README.md @@ -9,8 +9,5 @@ A Dart package to do service discovery over multicast DNS (mDNS), Bonjour, and A ## Usage -To use this package, add `multicast_dns` as a -[dependency in your pubspec.yaml file](https://pub.dev/packages/multicast_dns/install). - [The example](https://pub.dev/packages/multicast_dns/example) demonstrates how to use the `MDnsClient` Dart class in your code. From b099b14361c0e099e7fb705a8dfa4c769b4e64e0 Mon Sep 17 00:00:00 2001 From: stuartmorgan Date: Wed, 7 Aug 2024 10:36:03 -0700 Subject: [PATCH 094/118] [ci] Update repository for the release of Flutter 3.24 (#7331) Updates the repo for 3.24 per https://github.com/flutter/flutter/blob/master/docs/ecosystem/release/Updating-Packages-repo-for-a-stable-release.md Also fixes some packages to list 3.22 as their minimum version, which hadn't already been done only because we were not previously doing the N-1 test for 3.19 as intended, so didn't notice cases where a package claimed 3.19 support but required a 3.22+ dependency. --- packages/flutter_template_images/CHANGELOG.md | 2 +- packages/flutter_template_images/pubspec.yaml | 2 +- packages/multicast_dns/CHANGELOG.md | 4 ++++ packages/multicast_dns/pubspec.yaml | 2 +- packages/standard_message_codec/CHANGELOG.md | 2 +- packages/standard_message_codec/example/pubspec.yaml | 2 +- packages/standard_message_codec/pubspec.yaml | 2 +- 7 files changed, 10 insertions(+), 6 deletions(-) diff --git a/packages/flutter_template_images/CHANGELOG.md b/packages/flutter_template_images/CHANGELOG.md index 69b55d3..6cf915b 100644 --- a/packages/flutter_template_images/CHANGELOG.md +++ b/packages/flutter_template_images/CHANGELOG.md @@ -1,6 +1,6 @@ ## NEXT -* Updates minimum supported SDK version to Flutter 3.16/Dart 3.2. +* Updates minimum supported SDK version to Flutter 3.19/Dart 3.3. ## 4.2.1 diff --git a/packages/flutter_template_images/pubspec.yaml b/packages/flutter_template_images/pubspec.yaml index b046675..411d285 100644 --- a/packages/flutter_template_images/pubspec.yaml +++ b/packages/flutter_template_images/pubspec.yaml @@ -5,7 +5,7 @@ issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+ version: 4.2.1 environment: - sdk: ^3.2.0 + sdk: ^3.3.0 topics: - assets diff --git a/packages/multicast_dns/CHANGELOG.md b/packages/multicast_dns/CHANGELOG.md index 6db175a..b6956e0 100644 --- a/packages/multicast_dns/CHANGELOG.md +++ b/packages/multicast_dns/CHANGELOG.md @@ -1,3 +1,7 @@ +## NEXT + +* Updates minimum supported SDK version to Flutter 3.19/Dart 3.3. + ## 0.3.2+7 * Optimized Socket Binding: Always bind to 0.0.0.0 for simplicity and efficiency. diff --git a/packages/multicast_dns/pubspec.yaml b/packages/multicast_dns/pubspec.yaml index 6621352..8683b68 100644 --- a/packages/multicast_dns/pubspec.yaml +++ b/packages/multicast_dns/pubspec.yaml @@ -5,7 +5,7 @@ issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+ version: 0.3.2+7 environment: - sdk: ^3.2.0 + sdk: ^3.3.0 dependencies: meta: ^1.3.0 diff --git a/packages/standard_message_codec/CHANGELOG.md b/packages/standard_message_codec/CHANGELOG.md index a8b04ef..9da834b 100644 --- a/packages/standard_message_codec/CHANGELOG.md +++ b/packages/standard_message_codec/CHANGELOG.md @@ -1,6 +1,6 @@ ## NEXT -* Updates minimum supported SDK version to Flutter 3.16/Dart 3.2. +* Updates minimum supported SDK version to Flutter 3.19/Dart 3.3. ## 0.0.1+4 diff --git a/packages/standard_message_codec/example/pubspec.yaml b/packages/standard_message_codec/example/pubspec.yaml index 41b8de7..40b4f7f 100644 --- a/packages/standard_message_codec/example/pubspec.yaml +++ b/packages/standard_message_codec/example/pubspec.yaml @@ -4,7 +4,7 @@ version: 0.0.1 publish_to: none environment: - sdk: ^3.2.0 + sdk: ^3.3.0 dependencies: standard_message_codec: diff --git a/packages/standard_message_codec/pubspec.yaml b/packages/standard_message_codec/pubspec.yaml index 10e1df4..f276909 100644 --- a/packages/standard_message_codec/pubspec.yaml +++ b/packages/standard_message_codec/pubspec.yaml @@ -5,7 +5,7 @@ repository: https://github.com/flutter/packages/tree/main/packages/standard_mess issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3Astandard_message_codec environment: - sdk: ^3.2.0 + sdk: ^3.3.0 dev_dependencies: test: ^1.16.0 From 8771d80b353f7151fad96c3d8b6d9b741eb359c8 Mon Sep 17 00:00:00 2001 From: stuartmorgan Date: Thu, 12 Dec 2024 13:48:38 -0800 Subject: [PATCH 095/118] [ci] Update for 3.27 stable release (#8284) Updates CI with the steps from [the stable release playbook](https://github.com/flutter/flutter/blob/master/docs/ecosystem/release/Updating-Packages-repo-for-a-stable-release.md) to account for the new 3.27 stable release. --- packages/flutter_template_images/CHANGELOG.md | 2 +- packages/flutter_template_images/pubspec.yaml | 2 +- packages/multicast_dns/CHANGELOG.md | 2 +- packages/multicast_dns/pubspec.yaml | 2 +- packages/standard_message_codec/CHANGELOG.md | 2 +- packages/standard_message_codec/example/pubspec.yaml | 2 +- packages/standard_message_codec/pubspec.yaml | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/flutter_template_images/CHANGELOG.md b/packages/flutter_template_images/CHANGELOG.md index 6cf915b..efc23cd 100644 --- a/packages/flutter_template_images/CHANGELOG.md +++ b/packages/flutter_template_images/CHANGELOG.md @@ -1,6 +1,6 @@ ## NEXT -* Updates minimum supported SDK version to Flutter 3.19/Dart 3.3. +* Updates minimum supported SDK version to Flutter 3.22/Dart 3.4. ## 4.2.1 diff --git a/packages/flutter_template_images/pubspec.yaml b/packages/flutter_template_images/pubspec.yaml index 411d285..737ae29 100644 --- a/packages/flutter_template_images/pubspec.yaml +++ b/packages/flutter_template_images/pubspec.yaml @@ -5,7 +5,7 @@ issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+ version: 4.2.1 environment: - sdk: ^3.3.0 + sdk: ^3.4.0 topics: - assets diff --git a/packages/multicast_dns/CHANGELOG.md b/packages/multicast_dns/CHANGELOG.md index b6956e0..4b23be3 100644 --- a/packages/multicast_dns/CHANGELOG.md +++ b/packages/multicast_dns/CHANGELOG.md @@ -1,6 +1,6 @@ ## NEXT -* Updates minimum supported SDK version to Flutter 3.19/Dart 3.3. +* Updates minimum supported SDK version to Flutter 3.22/Dart 3.4. ## 0.3.2+7 diff --git a/packages/multicast_dns/pubspec.yaml b/packages/multicast_dns/pubspec.yaml index 8683b68..6f0f305 100644 --- a/packages/multicast_dns/pubspec.yaml +++ b/packages/multicast_dns/pubspec.yaml @@ -5,7 +5,7 @@ issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+ version: 0.3.2+7 environment: - sdk: ^3.3.0 + sdk: ^3.4.0 dependencies: meta: ^1.3.0 diff --git a/packages/standard_message_codec/CHANGELOG.md b/packages/standard_message_codec/CHANGELOG.md index 9da834b..a87ddfe 100644 --- a/packages/standard_message_codec/CHANGELOG.md +++ b/packages/standard_message_codec/CHANGELOG.md @@ -1,6 +1,6 @@ ## NEXT -* Updates minimum supported SDK version to Flutter 3.19/Dart 3.3. +* Updates minimum supported SDK version to Flutter 3.22/Dart 3.4. ## 0.0.1+4 diff --git a/packages/standard_message_codec/example/pubspec.yaml b/packages/standard_message_codec/example/pubspec.yaml index 40b4f7f..24edd81 100644 --- a/packages/standard_message_codec/example/pubspec.yaml +++ b/packages/standard_message_codec/example/pubspec.yaml @@ -4,7 +4,7 @@ version: 0.0.1 publish_to: none environment: - sdk: ^3.3.0 + sdk: ^3.4.0 dependencies: standard_message_codec: diff --git a/packages/standard_message_codec/pubspec.yaml b/packages/standard_message_codec/pubspec.yaml index f276909..60343a8 100644 --- a/packages/standard_message_codec/pubspec.yaml +++ b/packages/standard_message_codec/pubspec.yaml @@ -5,7 +5,7 @@ repository: https://github.com/flutter/packages/tree/main/packages/standard_mess issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3Astandard_message_codec environment: - sdk: ^3.3.0 + sdk: ^3.4.0 dev_dependencies: test: ^1.16.0 From b639f79ecbeeac4ca3377f2c6e4cca5ca0dd1db6 Mon Sep 17 00:00:00 2001 From: Matan Lurey Date: Thu, 26 Dec 2024 12:46:24 -0800 Subject: [PATCH 096/118] Re-create `templates/app`, add deprecation notices for `app_shared` and `skeleton`. (#8336) Part of https://github.com/flutter/flutter/issues/160673, which removes `--template skeleton`. This PR copies the `templates/app_shared` directory, which was only used to share code between `templates/app` and `templates/skeleton`, in preparation for removing `skeleton` (and making the existence of `app_shared` obsolete). Issue tracking final cleanup: https://github.com/flutter/flutter/issues/160692. --- packages/flutter_template_images/CHANGELOG.md | 3 ++- packages/flutter_template_images/pubspec.yaml | 2 +- .../Icon-App-1024x1024@1x.png | Bin 0 -> 10932 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 0 -> 295 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 0 -> 406 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 0 -> 450 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 0 -> 282 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 0 -> 462 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 0 -> 704 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 0 -> 406 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 0 -> 586 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 0 -> 862 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 0 -> 862 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 0 -> 1674 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 0 -> 762 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 0 -> 1226 bytes .../Icon-App-83.5x83.5@2x.png | Bin 0 -> 1418 bytes .../LaunchImage.imageset/LaunchImage.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@2x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@3x.png | Bin 0 -> 68 bytes .../AppIcon.appiconset/app_icon_1024.png | Bin 0 -> 102994 bytes .../AppIcon.appiconset/app_icon_128.png | Bin 0 -> 5680 bytes .../AppIcon.appiconset/app_icon_16.png | Bin 0 -> 520 bytes .../AppIcon.appiconset/app_icon_256.png | Bin 0 -> 14142 bytes .../AppIcon.appiconset/app_icon_32.png | Bin 0 -> 1066 bytes .../AppIcon.appiconset/app_icon_512.png | Bin 0 -> 36406 bytes .../AppIcon.appiconset/app_icon_64.png | Bin 0 -> 2218 bytes .../app/web/icons/Icon-maskable-192.png | Bin 0 -> 5594 bytes .../app/web/icons/Icon-maskable-512.png | Bin 0 -> 20998 bytes .../windows.tmpl/runner/resources/app_icon.ico | Bin 0 -> 33772 bytes .../runner_uwp/Assets/LargeTile.scale-100.png | Bin 0 -> 6049 bytes .../runner_uwp/Assets/LargeTile.scale-125.png | Bin 0 -> 7419 bytes .../runner_uwp/Assets/LargeTile.scale-150.png | Bin 0 -> 9576 bytes .../runner_uwp/Assets/LargeTile.scale-200.png | Bin 0 -> 14559 bytes .../runner_uwp/Assets/LargeTile.scale-400.png | Bin 0 -> 42545 bytes .../Assets/LockScreenLogo.scale-200.png | Bin 0 -> 1430 bytes .../runner_uwp/Assets/SmallTile.scale-100.png | Bin 0 -> 1821 bytes .../runner_uwp/Assets/SmallTile.scale-125.png | Bin 0 -> 2519 bytes .../runner_uwp/Assets/SmallTile.scale-150.png | Bin 0 -> 2984 bytes .../runner_uwp/Assets/SmallTile.scale-200.png | Bin 0 -> 3721 bytes .../runner_uwp/Assets/SmallTile.scale-400.png | Bin 0 -> 8054 bytes .../Assets/SplashScreen.scale-100.png | Bin 0 -> 6866 bytes .../Assets/SplashScreen.scale-125.png | Bin 0 -> 7899 bytes .../Assets/SplashScreen.scale-150.png | Bin 0 -> 10137 bytes .../Assets/SplashScreen.scale-200.png | Bin 0 -> 15332 bytes .../Assets/SplashScreen.scale-400.png | Bin 0 -> 46573 bytes .../Assets/Square150x150Logo.scale-100.png | Bin 0 -> 2964 bytes .../Assets/Square150x150Logo.scale-125.png | Bin 0 -> 2984 bytes .../Assets/Square150x150Logo.scale-150.png | Bin 0 -> 4617 bytes .../Assets/Square150x150Logo.scale-200.png | Bin 0 -> 6223 bytes .../Assets/Square150x150Logo.scale-400.png | Bin 0 -> 13913 bytes ...4x44Logo.altform-unplated_targetsize-16.png | Bin 0 -> 697 bytes ...x44Logo.altform-unplated_targetsize-256.png | Bin 0 -> 15554 bytes ...4x44Logo.altform-unplated_targetsize-32.png | Bin 0 -> 1541 bytes ...4x44Logo.altform-unplated_targetsize-48.png | Bin 0 -> 2418 bytes .../Assets/Square44x44Logo.scale-100.png | Bin 0 -> 1603 bytes .../Assets/Square44x44Logo.scale-125.png | Bin 0 -> 1893 bytes .../Assets/Square44x44Logo.scale-150.png | Bin 0 -> 2515 bytes .../Assets/Square44x44Logo.scale-200.png | Bin 0 -> 3239 bytes .../Assets/Square44x44Logo.scale-400.png | Bin 0 -> 6781 bytes .../Assets/Square44x44Logo.targetsize-16.png | Bin 0 -> 479 bytes .../Assets/Square44x44Logo.targetsize-24.png | Bin 0 -> 788 bytes ...4x44Logo.targetsize-24_altform-unplated.png | Bin 0 -> 1255 bytes .../Assets/Square44x44Logo.targetsize-256.png | Bin 0 -> 10408 bytes .../Assets/Square44x44Logo.targetsize-32.png | Bin 0 -> 1122 bytes .../Assets/Square44x44Logo.targetsize-48.png | Bin 0 -> 1612 bytes .../runner_uwp/Assets/StoreLogo.png | Bin 0 -> 1451 bytes .../runner_uwp/Assets/StoreLogo.scale-100.png | Bin 0 -> 2370 bytes .../runner_uwp/Assets/StoreLogo.scale-125.png | Bin 0 -> 3229 bytes .../runner_uwp/Assets/StoreLogo.scale-150.png | Bin 0 -> 3739 bytes .../runner_uwp/Assets/StoreLogo.scale-200.png | Bin 0 -> 4917 bytes .../runner_uwp/Assets/StoreLogo.scale-400.png | Bin 0 -> 10759 bytes .../Assets/Wide310x150Logo.scale-200.png | Bin 0 -> 3204 bytes .../runner_uwp/Assets/WideTile.scale-100.png | Bin 0 -> 3158 bytes .../runner_uwp/Assets/WideTile.scale-125.png | Bin 0 -> 3211 bytes .../runner_uwp/Assets/WideTile.scale-150.png | Bin 0 -> 5001 bytes .../runner_uwp/Assets/WideTile.scale-200.png | Bin 0 -> 6866 bytes .../runner_uwp/Assets/WideTile.scale-400.png | Bin 0 -> 15332 bytes .../runner_uwp/Windows_TemporaryKey.pfx | Bin 0 -> 2560 bytes .../app/winuwp.tmpl/runner_uwp/resources.pri | Bin 0 -> 5952 bytes .../templates/app_shared/README.md | 10 ++++++++++ .../templates/skeleton/README.md | 5 +++++ 82 files changed, 18 insertions(+), 2 deletions(-) create mode 100644 packages/flutter_template_images/templates/app/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png create mode 100644 packages/flutter_template_images/templates/app/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png create mode 100644 packages/flutter_template_images/templates/app/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png create mode 100644 packages/flutter_template_images/templates/app/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png create mode 100644 packages/flutter_template_images/templates/app/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png create mode 100644 packages/flutter_template_images/templates/app/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png create mode 100644 packages/flutter_template_images/templates/app/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png create mode 100644 packages/flutter_template_images/templates/app/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png create mode 100644 packages/flutter_template_images/templates/app/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png create mode 100644 packages/flutter_template_images/templates/app/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png create mode 100644 packages/flutter_template_images/templates/app/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png create mode 100644 packages/flutter_template_images/templates/app/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png create mode 100644 packages/flutter_template_images/templates/app/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png create mode 100644 packages/flutter_template_images/templates/app/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png create mode 100644 packages/flutter_template_images/templates/app/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png create mode 100644 packages/flutter_template_images/templates/app/ios.tmpl/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png create mode 100644 packages/flutter_template_images/templates/app/ios.tmpl/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png create mode 100644 packages/flutter_template_images/templates/app/ios.tmpl/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png create mode 100644 packages/flutter_template_images/templates/app/macos.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png create mode 100644 packages/flutter_template_images/templates/app/macos.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png create mode 100644 packages/flutter_template_images/templates/app/macos.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png create mode 100644 packages/flutter_template_images/templates/app/macos.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png create mode 100644 packages/flutter_template_images/templates/app/macos.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png create mode 100644 packages/flutter_template_images/templates/app/macos.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png create mode 100644 packages/flutter_template_images/templates/app/macos.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png create mode 100644 packages/flutter_template_images/templates/app/web/icons/Icon-maskable-192.png create mode 100644 packages/flutter_template_images/templates/app/web/icons/Icon-maskable-512.png create mode 100644 packages/flutter_template_images/templates/app/windows.tmpl/runner/resources/app_icon.ico create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/LargeTile.scale-100.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/LargeTile.scale-125.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/LargeTile.scale-150.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/LargeTile.scale-200.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/LargeTile.scale-400.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/LockScreenLogo.scale-200.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/SmallTile.scale-100.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/SmallTile.scale-125.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/SmallTile.scale-150.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/SmallTile.scale-200.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/SmallTile.scale-400.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/SplashScreen.scale-100.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/SplashScreen.scale-125.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/SplashScreen.scale-150.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/SplashScreen.scale-200.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/SplashScreen.scale-400.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square150x150Logo.scale-100.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square150x150Logo.scale-125.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square150x150Logo.scale-150.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square150x150Logo.scale-200.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square150x150Logo.scale-400.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-16.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-256.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-32.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-48.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.scale-100.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.scale-125.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.scale-150.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.scale-200.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.scale-400.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.targetsize-16.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.targetsize-24.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.targetsize-24_altform-unplated.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.targetsize-256.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.targetsize-32.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.targetsize-48.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/StoreLogo.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/StoreLogo.scale-100.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/StoreLogo.scale-125.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/StoreLogo.scale-150.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/StoreLogo.scale-200.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/StoreLogo.scale-400.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Wide310x150Logo.scale-200.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/WideTile.scale-100.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/WideTile.scale-125.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/WideTile.scale-150.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/WideTile.scale-200.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/WideTile.scale-400.png create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Windows_TemporaryKey.pfx create mode 100644 packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/resources.pri create mode 100644 packages/flutter_template_images/templates/app_shared/README.md create mode 100644 packages/flutter_template_images/templates/skeleton/README.md diff --git a/packages/flutter_template_images/CHANGELOG.md b/packages/flutter_template_images/CHANGELOG.md index efc23cd..ac09412 100644 --- a/packages/flutter_template_images/CHANGELOG.md +++ b/packages/flutter_template_images/CHANGELOG.md @@ -1,6 +1,7 @@ -## NEXT +## 4.3.0 * Updates minimum supported SDK version to Flutter 3.22/Dart 3.4. +* Creates a copy of `app_shared` named `app` (`app_shared` will no longer be used). ## 4.2.1 diff --git a/packages/flutter_template_images/pubspec.yaml b/packages/flutter_template_images/pubspec.yaml index 737ae29..26ff847 100644 --- a/packages/flutter_template_images/pubspec.yaml +++ b/packages/flutter_template_images/pubspec.yaml @@ -2,7 +2,7 @@ name: flutter_template_images description: Image files for use in flutter_tools templates without adding binary files to flutter/flutter. repository: https://github.com/flutter/packages/tree/main/packages/flutter_template_images issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+flutter_template_images%22 -version: 4.2.1 +version: 4.3.0 environment: sdk: ^3.4.0 diff --git a/packages/flutter_template_images/templates/app/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/packages/flutter_template_images/templates/app/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..dc9ada4725e9b0ddb1deab583e5b5102493aa332 GIT binary patch literal 10932 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 literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/app/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/packages/flutter_template_images/templates/app/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..797d452e458972bab9d994556c8305db4c827017 GIT binary patch literal 406 zcmV;H0crk;P))>cdjpWt&rLJgVp-t?DREyuq1A%0Z4)6_WsQ7{nzjN zo!X zGXV)2i3kcZIL~_j>uIKPK_zib+3T+Nt3Mb&Br)s)UIaA}@p{wDda>7=Q|mGRp7pqY zkJ!7E{MNz$9nOwoVqpFb)}$IP24Wn2JJ=Cw(!`OXJBr45rP>>AQr$6c7slJWvbpNW z@KTwna6d?PP>hvXCcp=4F;=GR@R4E7{4VU^0p4F>v^#A|>07*qoM6N<$f*5nx ACIA2c literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/app/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/packages/flutter_template_images/templates/app/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..6ed2d933e1120817fe9182483a228007b18ab6ae GIT binary patch literal 450 zcmV;z0X_bSP)iGWQ_5NJQ_~rNh*z)}eT%KUb z`7gNk0#AwF^#0T0?hIa^`~Ck;!}#m+_uT050aTR(J!bU#|IzRL%^UsMS#KsYnTF*!YeDOytlP4VhV?b} z%rz_<=#CPc)tU1MZTq~*2=8~iZ!lSa<{9b@2Jl;?IEV8)=fG217*|@)CCYgFze-x? zIFODUIA>nWKpE+bn~n7;-89sa>#DR>TSlqWk*!2hSN6D~Qb#VqbP~4Fk&m`@1$JGr zXPIdeRE&b2Thd#{MtDK$px*d3-Wx``>!oimf%|A-&-q*6KAH)e$3|6JV%HX{Hig)k suLT-RhftRq8b9;(V=235Wa|I=027H2wCDra;{X5v07*qoM6N<$f;9x^2LJ#7 literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/app/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/packages/flutter_template_images/templates/app/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..4cd7b0099ca80c806f8fe495613e8d6c69460d76 GIT binary patch literal 282 zcmV+#0p(^bcu7P-R4C8Q z&e;xxFbF_Vrezo%_kH*OKhshZ6BFpG-Y1e10`QXJKbND7AMQ&cMj60B5TNObaZxYybcN07*qoM6N<$g3m;S%K!iX literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/app/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/packages/flutter_template_images/templates/app/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..fe730945a01f64a61e2235dbe3f45b08f7729182 GIT binary patch literal 462 zcmV;<0WtoGP)-}iV`2<;=$?g5M=KQbZ{F&YRNy7Nn@%_*5{gvDM0aKI4?ESmw z{NnZg)A0R`+4?NF_RZexyVB&^^ZvN!{I28tr{Vje;QNTz`dG&Jz0~Ek&f2;*Z7>B|cg}xYpxEFY+0YrKLF;^Q+-HreN0P{&i zK~zY`?b7ECf-n?@;d<&orQ*Q7KoR%4|C>{W^h6@&01>0SKS`dn{Q}GT%Qj_{PLZ_& zs`MFI#j-(>?bvdZ!8^xTwlY{qA)T4QLbY@j(!YJ7aXJervHy6HaG_2SB`6CC{He}f zHVw(fJWApwPq!6VY7r1w-Fs)@ox~N+q|w~e;JI~C4Vf^@d>Wvj=fl`^u9x9wd9 zR%3*Q+)t%S!MU_`id^@&Y{y7-r98lZX0?YrHlfmwb?#}^1b{8g&KzmkE(L>Z&)179 zp<)v6Y}pRl100G2FL_t(o!|l{-Q-VMg#&MKg7c{O0 z2wJImOS3Gy*Z2Qifdv~JYOp;v+U)a|nLoc7hNH;I$;lzDt$}rkaFw1mYK5_0Q(Sut zvbEloxON7$+HSOgC9Z8ltuC&0OSF!-mXv5caV>#bc3@hBPX@I$58-z}(ZZE!t-aOG zpjNkbau@>yEzH(5Yj4kZiMH32XI!4~gVXNnjAvRx;Sdg^`>2DpUEwoMhTs_st8pKG z(%SHyHdU&v%f36~uERh!bd`!T2dw;z6PrOTQ7Vt*#9F2uHlUVnb#ev_o^fh}Dzmq} zWtlk35}k=?xj28uO|5>>$yXadTUE@@IPpgH`gJ~Ro4>jd1IF|(+IX>8M4Ps{PNvmI zNj4D+XgN83gPt_Gm}`Ybv{;+&yu-C(Grdiahmo~BjG-l&mWM+{e5M1sm&=xduwgM9 z`8OEh`=F3r`^E{n_;%9weN{cf2%7=VzC@cYj+lg>+3|D|_1C@{hcU(DyQG_BvBWe? zvTv``=%b1zrol#=R`JB)>cdjpWt&rLJgVp-t?DREyuq1A%0Z4)6_WsQ7{nzjN zo!X zGXV)2i3kcZIL~_j>uIKPK_zib+3T+Nt3Mb&Br)s)UIaA}@p{wDda>7=Q|mGRp7pqY zkJ!7E{MNz$9nOwoVqpFb)}$IP24Wn2JJ=Cw(!`OXJBr45rP>>AQr$6c7slJWvbpNW z@KTwna6d?PP>hvXCcp=4F;=GR@R4E7{4VU^0p4F>v^#A|>07*qoM6N<$f*5nx ACIA2c literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/app/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/packages/flutter_template_images/templates/app/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..502f463a9bc882b461c96aadf492d1729e49e725 GIT binary patch literal 586 zcmV-Q0=4~#P)+}#`wDE{8-2Mebf5<{{PqV{TgVcv*r8?UZ3{-|G?_}T*&y;@cqf{ z{Q*~+qr%%p!1pS*_Uicl#q9lc(D`!D`LN62sNwq{oYw(Wmhk)k<@f$!$@ng~_5)Ru z0Z)trIA5^j{DIW^c+vT2%lW+2<(RtE2wR;4O@)Tm`Xr*?A(qYoM}7i5Yxw>D(&6ou zxz!_Xr~yNF+waPe00049Nkl*;a!v6h%{rlvIH#gW3s8p;bFr=l}mRqpW2h zw=OA%hdyL~z+UHOzl0eKhEr$YYOL-c-%Y<)=j?(bzDweB7{b+%_ypvm_cG{SvM=DK zhv{K@m>#Bw>2W$eUI#iU)Wdgs8Y3U+A$Gd&{+j)d)BmGKx+43U_!tik_YlN)>$7G! zhkE!s;%oku3;IwG3U^2kw?z+HM)jB{@zFhK8P#KMSytSthr+4!c(5c%+^UBn`0X*2 zy3(k600_CSZj?O$Qu%&$;|TGUJrptR(HzyIx>5E(2r{eA(<6t3e3I0B)7d6s7?Z5J zZ!rtKvA{MiEBm&KFtoifx>5P^Z=vl)95XJn()aS5%ad(s?4-=Tkis9IGu{`Fy8r+H07*qoM6N<$f20Z)wqMt%V?S?~D#06};F zA3KcL`Wb+>5ObvgQIG&ig8(;V04hz?@cqy3{mSh8o!|U|)cI!1_+!fWH@o*8vh^CU z^ws0;(c$gI+2~q^tO#GDHf@=;DncUw00J^eL_t(&-tE|HQ`%4vfZ;WsBqu-$0nu1R zq^Vj;p$clf^?twn|KHO+IGt^q#a3X?w9dXC@*yxhv&l}F322(8Y1&=P&I}~G@#h6; z1CV9ecD9ZEe87{{NtI*)_aJ<`kJa z?5=RBtFF50s;jQLFil-`)m2wrb=6h(&brpj%nG_U&ut~$?8Rokzxi8zJoWr#2dto5 zOX_URcc<1`Iky+jc;A%Vzx}1QU{2$|cKPom2Vf1{8m`vja4{F>HS?^Nc^rp}xo+Nh zxd}eOm`fm3@MQC1< zIk&aCjb~Yh%5+Yq0`)D;q{#-Uqlv*o+Oor zE!I71Z@ASH3grl8&P^L0WpavHoP|UX4e?!igT`4?AZk$hu*@%6WJ;zDOGlw7kj@ zY5!B-0ft0f?Lgb>C;$Ke07*qoM6N<$f~t1N9smFU literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/app/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/packages/flutter_template_images/templates/app/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0ec303439225b78712f49115768196d8d76f6790 GIT binary patch literal 862 zcmV-k1EKthP)20Z)wqMt%V?S?~D#06};F zA3KcL`Wb+>5ObvgQIG&ig8(;V04hz?@cqy3{mSh8o!|U|)cI!1_+!fWH@o*8vh^CU z^ws0;(c$gI+2~q^tO#GDHf@=;DncUw00J^eL_t(&-tE|HQ`%4vfZ;WsBqu-$0nu1R zq^Vj;p$clf^?twn|KHO+IGt^q#a3X?w9dXC@*yxhv&l}F322(8Y1&=P&I}~G@#h6; z1CV9ecD9ZEe87{{NtI*)_aJ<`kJa z?5=RBtFF50s;jQLFil-`)m2wrb=6h(&brpj%nG_U&ut~$?8Rokzxi8zJoWr#2dto5 zOX_URcc<1`Iky+jc;A%Vzx}1QU{2$|cKPom2Vf1{8m`vja4{F>HS?^Nc^rp}xo+Nh zxd}eOm`fm3@MQC1< zIk&aCjb~Yh%5+Yq0`)D;q{#-Uqlv*o+Oor zE!I71Z@ASH3grl8&P^L0WpavHoP|UX4e?!igT`4?AZk$hu*@%6WJ;zDOGlw7kj@ zY5!B-0ft0f?Lgb>C;$Ke07*qoM6N<$f~t1N9smFU literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/app/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/packages/flutter_template_images/templates/app/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..e9f5fea27c705180eb716271f41b582e76dcbd90 GIT binary patch literal 1674 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 literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/app/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/packages/flutter_template_images/templates/app/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0467bf12aa4d28f374bb26596605a46dcbb3e7c8 GIT binary patch literal 1418 zcmV;51$Fv~P)q zKfU)WzW*n(@|xWGCA9ScMt*e9`2kdxPQ&&>|-UCa7_51w+ zLUsW@ZzZSW0y$)Hp~e9%PvP|a03ks1`~K?q{u;6NC8*{AOqIUq{CL&;p56Lf$oQGq z^={4hPQv)y=I|4n+?>7Fim=dxt1 z2H+Dm+1+fh+IF>G0SjJMkQQre1x4|G*Z==(Ot&kCnUrL4I(rf(ucITwmuHf^hXiJT zkdTm&kdTm&kdTm&kdP`esgWG0BcWCVkVZ&2dUwN`cgM8QJb`Z7Z~e<&Yj2(}>Tmf` zm1{eLgw!b{bXkjWbF%dTkTZEJWyWOb##Lfw4EK2}<0d6%>AGS{po>WCOy&f$Tay_> z?NBlkpo@s-O;0V%Y_Xa-G#_O08q5LR*~F%&)}{}r&L%Sbs8AS4t7Y0NEx*{soY=0MZExqA5XHQkqi#4gW3 zqODM^iyZl;dvf)-bOXtOru(s)Uc7~BFx{w-FK;2{`VA?(g&@3z&bfLFyctOH!cVsF z7IL=fo-qBndRUm;kAdXR4e6>k-z|21AaN%ubeVrHl*<|s&Ax@W-t?LR(P-24A5=>a z*R9#QvjzF8n%@1Nw@?CG@6(%>+-0ASK~jEmCV|&a*7-GKT72W<(TbSjf)&Eme6nGE z>Gkj4Sq&2e+-G%|+NM8OOm5zVl9{Z8Dd8A5z3y8mZ=4Bv4%>as_{9cN#bm~;h>62( zdqY93Zy}v&c4n($Vv!UybR8ocs7#zbfX1IY-*w~)p}XyZ-SFC~4w>BvMVr`dFbelV{lLL0bx7@*ZZdebr3`sP;? zVImji)kG)(6Juv0lz@q`F!k1FE;CQ(D0iG$wchPbKZQELlsZ#~rt8#90Y_Xh&3U-< z{s<&cCV_1`^TD^ia9!*mQDq& zn2{r`j};V|uV%_wsP!zB?m%;FeaRe+X47K0e+KE!8C{gAWF8)lCd1u1%~|M!XNRvw zvtqy3iz0WSpWdhn6$hP8PaRBmp)q`#PCA`Vd#Tc$@f1tAcM>f_I@bC)hkI9|o(Iqv zo}Piadq!j76}004RBio<`)70k^`K1NK)q>w?p^C6J2ZC!+UppiK6&y3Kmbv&O!oYF z34$0Z;QO!JOY#!`qyGH<3Pd}Pt@q*A0V=3SVtWKRR8d8Z&@)3qLPA19LPA19LPEUC YUoZo%k(ykuW&i*H07*qoM6N<$f+CH{y8r+H literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/app/ios.tmpl/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/packages/flutter_template_images/templates/app/ios.tmpl/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/app/ios.tmpl/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/packages/flutter_template_images/templates/app/ios.tmpl/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/app/ios.tmpl/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/packages/flutter_template_images/templates/app/ios.tmpl/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/app/macos.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/packages/flutter_template_images/templates/app/macos.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png new file mode 100644 index 0000000000000000000000000000000000000000..82b6f9d9a33e198f5747104729e1fcef999772a5 GIT binary patch literal 102994 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ⅅ8MglG&ER{i5lN315cO?EdHNLrg? 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 z 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 Pe7HEdAEg|=c=LY&YVNkY literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/app/macos.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/packages/flutter_template_images/templates/app/macos.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png new file mode 100644 index 0000000000000000000000000000000000000000..13b35eba55c6dabc3aac36f33d859266c18fa0d0 GIT binary patch literal 5680 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 literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/app/macos.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/packages/flutter_template_images/templates/app/macos.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png new file mode 100644 index 0000000000000000000000000000000000000000..0a3f5fa40fb3d1e0710331a48de5d256da3f275d GIT binary patch literal 520 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 literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/app/macos.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/packages/flutter_template_images/templates/app/macos.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png new file mode 100644 index 0000000000000000000000000000000000000000..2f1632cfddf3d9dade342351e627a0a75609fb46 GIT binary patch literal 2218 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 X>c!)3PgKfL&lX^$Z>Cpu&6)6jvi^Z! literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/app/web/icons/Icon-maskable-512.png b/packages/flutter_template_images/templates/app/web/icons/Icon-maskable-512.png new file mode 100644 index 0000000000000000000000000000000000000000..d69c56691fbdb0b7efa65097c7cc1edac12a6d3e GIT binary patch literal 20998 zcmeFZ_gj-)&^4Nb2tlbLMU<{!p(#yjqEe+=0IA_oih%ScH9@5#MNp&}Y#;;(h=A0@ zh7{>lT2MkSQ344eAvrhici!td|HJuyvJm#Y_w1Q9Yu3!26dNlO-oxUDK_C#XnW^Co z5C{VN6#{~B0)K2j7}*1Xq(Nqemv23A-6&=ZpEijkVnSwVGqLv40?n0=p;k3-U5e5+ z+z3>aS`u9DS=!wg8ROu?X4TFoW6CFLL&{GzoVT)ldhLekLM|+j3tIxRd|*5=c{=s&*vfPdBr(Fyj(v@%eQj1Soy7m4^@VRl1~@-PV7y+c!xz$8436WBn$t{=}mEdK#k`aystimGgI{(IBx$!pAwFoE9Y`^t^;> zKAD)C(Dl^s%`?q5$P|fZf8Xymrtu^Pv(7D`rn>Z-w$Ahs!z9!94WNVxrJuXfHAaxg zC6s@|Z1$7R$(!#t%Jb{{s6(Y?NoQXDYq)!}X@jKPhe`{9KQ@sAU8y-5`xt?S9$jKH zoi}6m5PcG*^{kjvt+kwPpyQzVg4o)a>;LK`aaN2x4@itBD3Aq?yWTM20VRn1rrd+2 zKO=P0rMjEGq_UqpMa`~7B|p?xAN1SCoCp}QxAv8O`jLJ5CVh@umR%c%i^)6!o+~`F zaalSTQcl5iwOLC&H)efzd{8(88mo`GI(56T<(&p7>Qd^;R1hn1Y~jN~tApaL8>##U zd65bo8)79CplWxr#z4!6HvLz&N7_5AN#x;kLG?zQ(#p|lj<8VUlKY=Aw!ATqeL-VG z42gA!^cMNPj>(`ZMEbCrnkg*QTsn*u(nQPWI9pA{MQ=IsPTzd7q5E#7+z>Ch=fx$~ z;J|?(5jTo5UWGvsJa(Sx0?S#56+8SD!I^tftyeh_{5_31l6&Hywtn`bbqYDqGZXI( zCG7hBgvksX2ak8+)hB4jnxlO@A32C_RM&g&qDSb~3kM&)@A_j1*oTO@nicGUyv+%^ z=vB)4(q!ykzT==Z)3*3{atJ5}2PV*?Uw+HhN&+RvKvZL3p9E?gHjv{6zM!A|z|UHK z-r6jeLxbGn0D@q5aBzlco|nG2tr}N@m;CJX(4#Cn&p&sLKwzLFx1A5izu?X_X4x8r@K*d~7>t1~ zDW1Mv5O&WOxbzFC`DQ6yNJ(^u9vJdj$fl2dq`!Yba_0^vQHXV)vqv1gssZYzBct!j zHr9>ydtM8wIs}HI4=E}qAkv|BPWzh3^_yLH(|kdb?x56^BlDC)diWyPd*|f!`^12_U>TD^^94OCN0lVv~Sgvs94ecpE^}VY$w`qr_>Ue zTfH~;C<3H<0dS5Rkf_f@1x$Gms}gK#&k()IC0zb^QbR!YLoll)c$Agfi6MKI0dP_L z=Uou&u~~^2onea2%XZ@>`0x^L8CK6=I{ge;|HXMj)-@o~h&O{CuuwBX8pVqjJ*o}5 z#8&oF_p=uSo~8vn?R0!AMWvcbZmsrj{ZswRt(aEdbi~;HeVqIe)-6*1L%5u$Gbs}| zjFh?KL&U(rC2izSGtwP5FnsR@6$-1toz?RvLD^k~h9NfZgzHE7m!!7s6(;)RKo2z} zB$Ci@h({l?arO+vF;s35h=|WpefaOtKVx>l399}EsX@Oe3>>4MPy%h&^3N_`UTAHJ zI$u(|TYC~E4)|JwkWW3F!Tib=NzjHs5ii2uj0^m|Qlh-2VnB#+X~RZ|`SA*}}&8j9IDv?F;(Y^1=Z0?wWz;ikB zewU>MAXDi~O7a~?jx1x=&8GcR-fTp>{2Q`7#BE#N6D@FCp`?ht-<1|y(NArxE_WIu zP+GuG=Qq>SHWtS2M>34xwEw^uvo4|9)4s|Ac=ud?nHQ>ax@LvBqusFcjH0}{T3ZPQ zLO1l<@B_d-(IS682}5KA&qT1+{3jxKolW+1zL4inqBS-D>BohA!K5++41tM@ z@xe<-qz27}LnV#5lk&iC40M||JRmZ*A##K3+!j93eouU8@q-`W0r%7N`V$cR&JV;iX(@cS{#*5Q>~4BEDA)EikLSP@>Oo&Bt1Z~&0d5)COI%3$cLB_M?dK# z{yv2OqW!al-#AEs&QFd;WL5zCcp)JmCKJEdNsJlL9K@MnPegK23?G|O%v`@N{rIRa zi^7a}WBCD77@VQ-z_v{ZdRsWYrYgC$<^gRQwMCi6);%R~uIi31OMS}=gUTE(GKmCI z$zM>mytL{uNN+a&S38^ez(UT=iSw=l2f+a4)DyCA1Cs_N-r?Q@$3KTYosY!;pzQ0k zzh1G|kWCJjc(oZVBji@kN%)UBw(s{KaYGy=i{g3{)Z+&H8t2`^IuLLKWT6lL<-C(! zSF9K4xd-|VO;4}$s?Z7J_dYqD#Mt)WCDnsR{Kpjq275uUq6`v0y*!PHyS(}Zmv)_{>Vose9-$h8P0|y;YG)Bo}$(3Z%+Gs0RBmFiW!^5tBmDK-g zfe5%B*27ib+7|A*Fx5e)2%kIxh7xWoc3pZcXS2zik!63lAG1;sC1ja>BqH7D zODdi5lKW$$AFvxgC-l-)!c+9@YMC7a`w?G(P#MeEQ5xID#<}W$3bSmJ`8V*x2^3qz zVe<^^_8GHqYGF$nIQm0Xq2kAgYtm#UC1A(=&85w;rmg#v906 zT;RyMgbMpYOmS&S9c38^40oUp?!}#_84`aEVw;T;r%gTZkWeU;;FwM@0y0adt{-OK z(vGnPSlR=Nv2OUN!2=xazlnHPM9EWxXg2EKf0kI{iQb#FoP>xCB<)QY>OAM$Dcdbm zU6dU|%Mo(~avBYSjRc13@|s>axhrPl@Sr81{RSZUdz4(=|82XEbV*JAX6Lfbgqgz584lYgi0 z2-E{0XCVON$wHfvaLs;=dqhQJ&6aLn$D#0i(FkAVrXG9LGm3pSTf&f~RQb6|1_;W> z?n-;&hrq*~L=(;u#jS`*Yvh@3hU-33y_Kv1nxqrsf>pHVF&|OKkoC)4DWK%I!yq?P z=vXo8*_1iEWo8xCa{HJ4tzxOmqS0&$q+>LroMKI*V-rxhOc%3Y!)Y|N6p4PLE>Yek>Y(^KRECg8<|%g*nQib_Yc#A5q8Io z6Ig&V>k|~>B6KE%h4reAo*DfOH)_01tE0nWOxX0*YTJgyw7moaI^7gW*WBAeiLbD?FV9GSB zPv3`SX*^GRBM;zledO`!EbdBO_J@fEy)B{-XUTVQv}Qf~PSDpK9+@I`7G7|>Dgbbu z_7sX9%spVo$%qwRwgzq7!_N;#Td08m5HV#?^dF-EV1o)Q=Oa+rs2xH#g;ykLbwtCh znUnA^dW!XjspJ;otq$yV@I^s9Up(5k7rqhQd@OLMyyxVLj_+$#Vc*}Usevp^I(^vH zmDgHc0VMme|K&X?9&lkN{yq_(If)O`oUPW8X}1R5pSVBpfJe0t{sPA(F#`eONTh_) zxeLqHMfJX#?P(@6w4CqRE@Eiza; z;^5)Kk=^5)KDvd9Q<`=sJU8rjjxPmtWMTmzcH={o$U)j=QBuHarp?=}c??!`3d=H$nrJMyr3L-& zA#m?t(NqLM?I3mGgWA_C+0}BWy3-Gj7bR+d+U?n*mN$%5P`ugrB{PeV>jDUn;eVc- zzeMB1mI4?fVJatrNyq|+zn=!AiN~<}eoM#4uSx^K?Iw>P2*r=k`$<3kT00BE_1c(02MRz4(Hq`L^M&xt!pV2 zn+#U3@j~PUR>xIy+P>51iPayk-mqIK_5rlQMSe5&tDkKJk_$i(X&;K(11YGpEc-K= zq4Ln%^j>Zi_+Ae9eYEq_<`D+ddb8_aY!N;)(&EHFAk@Ekg&41ABmOXfWTo)Z&KotA zh*jgDGFYQ^y=m)<_LCWB+v48DTJw*5dwMm_YP0*_{@HANValf?kV-Ic3xsC}#x2h8 z`q5}d8IRmqWk%gR)s~M}(Qas5+`np^jW^oEd-pzERRPMXj$kS17g?H#4^trtKtq;C?;c ztd|%|WP2w2Nzg@)^V}!Gv++QF2!@FP9~DFVISRW6S?eP{H;;8EH;{>X_}NGj^0cg@ z!2@A>-CTcoN02^r6@c~^QUa={0xwK0v4i-tQ9wQq^=q*-{;zJ{Qe%7Qd!&X2>rV@4 z&wznCz*63_vw4>ZF8~%QCM?=vfzW0r_4O^>UA@otm_!N%mH)!ERy&b!n3*E*@?9d^ zu}s^By@FAhG(%?xgJMuMzuJw2&@$-oK>n z=UF}rt%vuaP9fzIFCYN-1&b#r^Cl6RDFIWsEsM|ROf`E?O(cy{BPO2Ie~kT+^kI^i zp>Kbc@C?}3vy-$ZFVX#-cx)Xj&G^ibX{pWggtr(%^?HeQL@Z( zM-430g<{>vT*)jK4aY9(a{lSy{8vxLbP~n1MXwM527ne#SHCC^F_2@o`>c>>KCq9c(4c$VSyMl*y3Nq1s+!DF| z^?d9PipQN(mw^j~{wJ^VOXDCaL$UtwwTpyv8IAwGOg<|NSghkAR1GSNLZ1JwdGJYm zP}t<=5=sNNUEjc=g(y)1n5)ynX(_$1-uGuDR*6Y^Wgg(LT)Jp><5X|}bt z_qMa&QP?l_n+iVS>v%s2Li_;AIeC=Ca^v1jX4*gvB$?H?2%ndnqOaK5-J%7a} zIF{qYa&NfVY}(fmS0OmXA70{znljBOiv5Yod!vFU{D~*3B3Ka{P8?^ zfhlF6o7aNT$qi8(w<}OPw5fqA7HUje*r*Oa(YV%*l0|9FP9KW@U&{VSW{&b0?@y)M zs%4k1Ax;TGYuZ9l;vP5@?3oQsp3)rjBeBvQQ>^B;z5pc=(yHhHtq6|0m(h4envn_j787fizY@V`o(!SSyE7vlMT zbo=Z1c=atz*G!kwzGB;*uPL$Ei|EbZLh8o+1BUMOpnU(uX&OG1MV@|!&HOOeU#t^x zr9=w2ow!SsTuJWT7%Wmt14U_M*3XiWBWHxqCVZI0_g0`}*^&yEG9RK9fHK8e+S^m? zfCNn$JTswUVbiC#>|=wS{t>-MI1aYPLtzO5y|LJ9nm>L6*wpr_m!)A2Fb1RceX&*|5|MwrvOk4+!0p99B9AgP*9D{Yt|x=X}O% zgIG$MrTB=n-!q%ROT|SzH#A$Xm;|ym)0>1KR}Yl0hr-KO&qMrV+0Ej3d@?FcgZ+B3 ztEk16g#2)@x=(ko8k7^Tq$*5pfZHC@O@}`SmzT1(V@x&NkZNM2F#Q-Go7-uf_zKC( zB(lHZ=3@dHaCOf6C!6i8rDL%~XM@rVTJbZL09?ht@r^Z_6x}}atLjvH^4Vk#Ibf(^LiBJFqorm?A=lE zzFmwvp4bT@Nv2V>YQT92X;t9<2s|Ru5#w?wCvlhcHLcsq0TaFLKy(?nzezJ>CECqj zggrI~Hd4LudM(m{L@ezfnpELsRFVFw>fx;CqZtie`$BXRn#Ns%AdoE$-Pf~{9A8rV zf7FbgpKmVzmvn-z(g+&+-ID=v`;6=)itq8oM*+Uz**SMm_{%eP_c0{<%1JGiZS19o z@Gj7$Se~0lsu}w!%;L%~mIAO;AY-2i`9A*ZfFs=X!LTd6nWOZ7BZH2M{l2*I>Xu)0 z`<=;ObglnXcVk!T>e$H?El}ra0WmPZ$YAN0#$?|1v26^(quQre8;k20*dpd4N{i=b zuN=y}_ew9SlE~R{2+Rh^7%PA1H5X(p8%0TpJ=cqa$65XL)$#ign-y!qij3;2>j}I; ziO@O|aYfn&up5F`YtjGw68rD3{OSGNYmBnl?zdwY$=RFsegTZ=kkzRQ`r7ZjQP!H( zp4>)&zf<*N!tI00xzm-ME_a{_I!TbDCr;8E;kCH4LlL-tqLxDuBn-+xgPk37S&S2^ z2QZumkIimwz!c@!r0)j3*(jPIs*V!iLTRl0Cpt_UVNUgGZzdvs0(-yUghJfKr7;=h zD~y?OJ-bWJg;VdZ^r@vlDoeGV&8^--!t1AsIMZ5S440HCVr%uk- z2wV>!W1WCvFB~p$P$$_}|H5>uBeAe>`N1FI8AxM|pq%oNs;ED8x+tb44E) zTj{^fbh@eLi%5AqT?;d>Es5D*Fi{Bpk)q$^iF!!U`r2hHAO_?#!aYmf>G+jHsES4W zgpTKY59d?hsb~F0WE&dUp6lPt;Pm zcbTUqRryw^%{ViNW%Z(o8}dd00H(H-MmQmOiTq{}_rnwOr*Ybo7*}3W-qBT!#s0Ie z-s<1rvvJx_W;ViUD`04%1pra*Yw0BcGe)fDKUK8aF#BwBwMPU;9`!6E(~!043?SZx z13K%z@$$#2%2ovVlgFIPp7Q6(vO)ud)=*%ZSucL2Dh~K4B|%q4KnSpj#n@(0B})!9 z8p*hY@5)NDn^&Pmo;|!>erSYg`LkO?0FB@PLqRvc>4IsUM5O&>rRv|IBRxi(RX(gJ ztQ2;??L~&Mv;aVr5Q@(?y^DGo%pO^~zijld41aA0KKsy_6FeHIn?fNHP-z>$OoWer zjZ5hFQTy*-f7KENRiCE$ZOp4|+Wah|2=n@|W=o}bFM}Y@0e62+_|#fND5cwa3;P{^pEzlJbF1Yq^}>=wy8^^^$I2M_MH(4Dw{F6hm+vrWV5!q;oX z;tTNhz5`-V={ew|bD$?qcF^WPR{L(E%~XG8eJx(DoGzt2G{l8r!QPJ>kpHeOvCv#w zr=SSwMDaUX^*~v%6K%O~i)<^6`{go>a3IdfZ8hFmz&;Y@P%ZygShQZ2DSHd`m5AR= zx$wWU06;GYwXOf(%MFyj{8rPFXD};JCe85Bdp4$YJ2$TzZ7Gr#+SwCvBI1o$QP0(c zy`P51FEBV2HTisM3bHqpmECT@H!Y2-bv2*SoSPoO?wLe{M#zDTy@ujAZ!Izzky~3k zRA1RQIIoC*Mej1PH!sUgtkR0VCNMX(_!b65mo66iM*KQ7xT8t2eev$v#&YdUXKwGm z7okYAqYF&bveHeu6M5p9xheRCTiU8PFeb1_Rht0VVSbm%|1cOVobc8mvqcw!RjrMRM#~=7xibH&Fa5Imc|lZ{eC|R__)OrFg4@X_ ze+kk*_sDNG5^ELmHnZ7Ue?)#6!O)#Nv*Dl2mr#2)w{#i-;}0*_h4A%HidnmclH#;Q zmQbq+P4DS%3}PpPm7K_K3d2s#k~x+PlTul7+kIKol0@`YN1NG=+&PYTS->AdzPv!> zQvzT=)9se*Jr1Yq+C{wbK82gAX`NkbXFZ)4==j4t51{|-v!!$H8@WKA={d>CWRW+g z*`L>9rRucS`vbXu0rzA1#AQ(W?6)}1+oJSF=80Kf_2r~Qm-EJ6bbB3k`80rCv(0d` zvCf3;L2ovYG_TES%6vSuoKfIHC6w;V31!oqHM8-I8AFzcd^+_86!EcCOX|Ta9k1!s z_Vh(EGIIsI3fb&dF$9V8v(sTBC%!#<&KIGF;R+;MyC0~}$gC}}= zR`DbUVc&Bx`lYykFZ4{R{xRaUQkWCGCQlEc;!mf=+nOk$RUg*7 z;kP7CVLEc$CA7@6VFpsp3_t~m)W0aPxjsA3e5U%SfY{tp5BV5jH-5n?YX7*+U+Zs%LGR>U- z!x4Y_|4{gx?ZPJobISy991O znrmrC3otC;#4^&Rg_iK}XH(XX+eUHN0@Oe06hJk}F?`$)KmH^eWz@@N%wEc)%>?Ft z#9QAroDeyfztQ5Qe{m*#R#T%-h*&XvSEn@N$hYRTCMXS|EPwzF3IIysD2waj`vQD{ zv_#^Pgr?s~I*NE=acf@dWVRNWTr(GN0wrL)Z2=`Dr>}&ZDNX|+^Anl{Di%v1Id$_p zK5_H5`RDjJx`BW7hc85|> zHMMsWJ4KTMRHGu+vy*kBEMjz*^K8VtU=bXJYdhdZ-?jTXa$&n)C?QQIZ7ln$qbGlr zS*TYE+ppOrI@AoPP=VI-OXm}FzgXRL)OPvR$a_=SsC<3Jb+>5makX|U!}3lx4tX&L z^C<{9TggZNoeX!P1jX_K5HkEVnQ#s2&c#umzV6s2U-Q;({l+j^?hi7JnQ7&&*oOy9 z(|0asVTWUCiCnjcOnB2pN0DpuTglKq;&SFOQ3pUdye*eT<2()7WKbXp1qq9=bhMWlF-7BHT|i3TEIT77AcjD(v=I207wi-=vyiw5mxgPdTVUC z&h^FEUrXwWs9en2C{ywZp;nvS(Mb$8sBEh-*_d-OEm%~p1b2EpcwUdf<~zmJmaSTO zSX&&GGCEz-M^)G$fBvLC2q@wM$;n4jp+mt0MJFLuJ%c`tSp8$xuP|G81GEd2ci$|M z4XmH{5$j?rqDWoL4vs!}W&!?!rtj=6WKJcE>)?NVske(p;|#>vL|M_$as=mi-n-()a*OU3Okmk0wC<9y7t^D(er-&jEEak2!NnDiOQ99Wx8{S8}=Ng!e0tzj*#T)+%7;aM$ z&H}|o|J1p{IK0Q7JggAwipvHvko6>Epmh4RFRUr}$*2K4dz85o7|3#Bec9SQ4Y*;> zXWjT~f+d)dp_J`sV*!w>B%)#GI_;USp7?0810&3S=WntGZ)+tzhZ+!|=XlQ&@G@~3 z-dw@I1>9n1{+!x^Hz|xC+P#Ab`E@=vY?3%Bc!Po~e&&&)Qp85!I|U<-fCXy*wMa&t zgDk!l;gk;$taOCV$&60z+}_$ykz=Ea*)wJQ3-M|p*EK(cvtIre0Pta~(95J7zoxBN zS(yE^3?>88AL0Wfuou$BM{lR1hkrRibz=+I9ccwd`ZC*{NNqL)3pCcw^ygMmrG^Yp zn5f}Xf>%gncC=Yq96;rnfp4FQL#{!Y*->e82rHgY4Zwy{`JH}b9*qr^VA{%~Z}jtp z_t$PlS6}5{NtTqXHN?uI8ut8rOaD#F1C^ls73S=b_yI#iZDOGz3#^L@YheGd>L;<( z)U=iYj;`{>VDNzIxcjbTk-X3keXR8Xbc`A$o5# zKGSk-7YcoBYuAFFSCjGi;7b<;n-*`USs)IX z=0q6WZ=L!)PkYtZE-6)azhXV|+?IVGTOmMCHjhkBjfy@k1>?yFO3u!)@cl{fFAXnRYsWk)kpT?X{_$J=|?g@Q}+kFw|%n!;Zo}|HE@j=SFMvT8v`6Y zNO;tXN^036nOB2%=KzxB?n~NQ1K8IO*UE{;Xy;N^ZNI#P+hRZOaHATz9(=)w=QwV# z`z3+P>9b?l-@$@P3<;w@O1BdKh+H;jo#_%rr!ute{|YX4g5}n?O7Mq^01S5;+lABE+7`&_?mR_z7k|Ja#8h{!~j)| zbBX;*fsbUak_!kXU%HfJ2J+G7;inu#uRjMb|8a){=^))y236LDZ$$q3LRlat1D)%7K0!q5hT5V1j3qHc7MG9 z_)Q=yQ>rs>3%l=vu$#VVd$&IgO}Za#?aN!xY>-<3PhzS&q!N<=1Q7VJBfHjug^4|) z*fW^;%3}P7X#W3d;tUs3;`O&>;NKZBMR8au6>7?QriJ@gBaorz-+`pUWOP73DJL=M z(33uT6Gz@Sv40F6bN|H=lpcO z^AJl}&=TIjdevuDQ!w0K*6oZ2JBOhb31q!XDArFyKpz!I$p4|;c}@^bX{>AXdt7Bm zaLTk?c%h@%xq02reu~;t@$bv`b3i(P=g}~ywgSFpM;}b$zAD+=I!7`V~}ARB(Wx0C(EAq@?GuxOL9X+ffbkn3+Op0*80TqmpAq~EXmv%cq36celXmRz z%0(!oMp&2?`W)ALA&#|fu)MFp{V~~zIIixOxY^YtO5^FSox8v$#d0*{qk0Z)pNTt0QVZ^$`4vImEB>;Lo2!7K05TpY-sl#sWBz_W-aDIV`Ksabi zvpa#93Svo!70W*Ydh)Qzm{0?CU`y;T^ITg-J9nfWeZ-sbw)G@W?$Eomf%Bg2frfh5 zRm1{|E0+(4zXy){$}uC3%Y-mSA2-^I>Tw|gQx|7TDli_hB>``)Q^aZ`LJC2V3U$SABP}T)%}9g2pF9dT}aC~!rFFgkl1J$ z`^z{Arn3On-m%}r}TGF8KQe*OjSJ=T|caa_E;v89A{t@$yT^(G9=N9F?^kT*#s3qhJq!IH5|AhnqFd z0B&^gm3w;YbMNUKU>naBAO@fbz zqw=n!@--}o5;k6DvTW9pw)IJVz;X}ncbPVrmH>4x);8cx;q3UyiML1PWp%bxSiS|^ zC5!kc4qw%NSOGQ*Kcd#&$30=lDvs#*4W4q0u8E02U)7d=!W7+NouEyuF1dyH$D@G& zaFaxo9Ex|ZXA5y{eZT*i*dP~INSMAi@mvEX@q5i<&o&#sM}Df?Og8n8Ku4vOux=T% zeuw~z1hR}ZNwTn8KsQHKLwe2>p^K`YWUJEdVEl|mO21Bov!D0D$qPoOv=vJJ`)|%_ z>l%`eexY7t{BlVKP!`a^U@nM?#9OC*t76My_E_<16vCz1x_#82qj2PkWiMWgF8bM9 z(1t4VdHcJ;B~;Q%x01k_gQ0>u2*OjuEWNOGX#4}+N?Gb5;+NQMqp}Puqw2HnkYuKA zzKFWGHc&K>gwVgI1Sc9OT1s6fq=>$gZU!!xsilA$fF`kLdGoX*^t}ao@+^WBpk>`8 z4v_~gK|c2rCq#DZ+H)$3v~Hoi=)=1D==e3P zpKrRQ+>O^cyTuWJ%2}__0Z9SM_z9rptd*;-9uC1tDw4+A!=+K%8~M&+Zk#13hY$Y$ zo-8$*8dD5@}XDi19RjK6T^J~DIXbF5w&l?JLHMrf0 zLv0{7*G!==o|B%$V!a=EtVHdMwXLtmO~vl}P6;S(R2Q>*kTJK~!}gloxj)m|_LYK{ zl(f1cB=EON&wVFwK?MGn^nWuh@f95SHatPs(jcwSY#Dnl1@_gkOJ5=f`%s$ZHljRH0 z+c%lrb=Gi&N&1>^L_}#m>=U=(oT^vTA&3!xXNyqi$pdW1BDJ#^{h|2tZc{t^vag3& zAD7*8C`chNF|27itjBUo^CCDyEpJLX3&u+(L;YeeMwnXEoyN(ytoEabcl$lSgx~Ltatn}b$@j_yyMrBb03)shJE*$;Mw=;mZd&8e>IzE+4WIoH zCSZE7WthNUL$|Y#m!Hn?x7V1CK}V`KwW2D$-7&ODy5Cj;!_tTOOo1Mm%(RUt)#$@3 zhurA)t<7qik%%1Et+N1?R#hdBB#LdQ7{%-C zn$(`5e0eFh(#c*hvF>WT*07fk$N_631?W>kfjySN8^XC9diiOd#s?4tybICF;wBjp zIPzilX3{j%4u7blhq)tnaOBZ_`h_JqHXuI7SuIlNTgBk9{HIS&3|SEPfrvcE<@}E` zKk$y*nzsqZ{J{uWW9;#n=de&&h>m#A#q)#zRonr(?mDOYU&h&aQWD;?Z(22wY?t$U3qo`?{+amA$^TkxL+Ex2dh`q7iR&TPd0Ymwzo#b? zP$#t=elB5?k$#uE$K>C$YZbYUX_JgnXA`oF_Ifz4H7LEOW~{Gww&3s=wH4+j8*TU| zSX%LtJWqhr-xGNSe{;(16kxnak6RnZ{0qZ^kJI5X*It_YuynSpi(^-}Lolr{)#z_~ zw!(J-8%7Ybo^c3(mED`Xz8xecP35a6M8HarxRn%+NJBE;dw>>Y2T&;jzRd4FSDO3T zt*y+zXCtZQ0bP0yf6HRpD|WmzP;DR^-g^}{z~0x~z4j8m zucTe%k&S9Nt-?Jb^gYW1w6!Y3AUZ0Jcq;pJ)Exz%7k+mUOm6%ApjjSmflfKwBo6`B zhNb@$NHTJ>guaj9S{@DX)!6)b-Shav=DNKWy(V00k(D!v?PAR0f0vDNq*#mYmUp6> z76KxbFDw5U{{qx{BRj(>?|C`82ICKbfLxoldov-M?4Xl+3;I4GzLHyPOzYw7{WQST zPNYcx5onA%MAO9??41Po*1zW(Y%Zzn06-lUp{s<3!_9vv9HBjT02On0Hf$}NP;wF) zP<`2p3}A^~1YbvOh{ePMx$!JGUPX-tbBzp3mDZMY;}h;sQ->!p97GA)9a|tF(Gh{1$xk7 zUw?ELkT({Xw!KIr);kTRb1b|UL`r2_`a+&UFVCdJ)1T#fdh;71EQl9790Br0m_`$x z9|ZANuchFci8GNZ{XbP=+uXSJRe(;V5laQz$u18#?X*9}x7cIEbnr%<=1cX3EIu7$ zhHW6pe5M(&qEtsqRa>?)*{O;OJT+YUhG5{km|YI7I@JL_3Hwao9aXneiSA~a* z|Lp@c-oMNyeAEuUz{F?kuou3x#C*gU?lon!RC1s37gW^0Frc`lqQWH&(J4NoZg3m8 z;Lin#8Q+cFPD7MCzj}#|ws7b@?D9Q4dVjS4dpco=4yX5SSH=A@U@yqPdp@?g?qeia zH=Tt_9)G=6C2QIPsi-QipnK(mc0xXIN;j$WLf@n8eYvMk;*H-Q4tK%(3$CN}NGgO8n}fD~+>?<3UzvsrMf*J~%i;VKQHbF%TPalFi=#sgj)(P#SM^0Q=Tr>4kJVw8X3iWsP|e8tj}NjlMdWp z@2+M4HQu~3!=bZpjh;;DIDk&X}=c8~kn)FWWH z2KL1w^rA5&1@@^X%MjZ7;u(kH=YhH2pJPFQe=hn>tZd5RC5cfGYis8s9PKaxi*}-s6*W zRA^PwR=y^5Z){!(4D9-KC;0~;b*ploznFOaU`bJ_7U?qAi#mTo!&rIECRL$_y@yI27x2?W+zqDBD5~KCVYKFZLK+>ABC(Kj zeAll)KMgIlAG`r^rS{loBrGLtzhHY8$)<_S<(Dpkr(Ym@@vnQ&rS@FC*>2@XCH}M+an74WcRDcoQ+a3@A z9tYhl5$z7bMdTvD2r&jztBuo37?*k~wcU9GK2-)MTFS-lux-mIRYUuGUCI~V$?s#< z?1qAWb(?ZLm(N>%S%y10COdaq_Tm5c^%ooIxpR=`3e4C|@O5wY+eLik&XVi5oT7oe zmxH)Jd*5eo@!7t`x8!K=-+zJ-Sz)B_V$)s1pW~CDU$=q^&ABvf6S|?TOMB-RIm@CoFg>mjIQE)?+A1_3s6zmFU_oW&BqyMz1mY*IcP_2knjq5 zqw~JK(cVsmzc7*EvTT2rvpeqhg)W=%TOZ^>f`rD4|7Z5fq*2D^lpCttIg#ictgqZ$P@ru6P#f$x#KfnfTZj~LG6U_d-kE~`;kU_X)`H5so@?C zWmb!7x|xk@0L~0JFall*@ltyiL^)@3m4MqC7(7H0sH!WidId1#f#6R{Q&A!XzO1IAcIx;$k66dumt6lpUw@nL2MvqJ5^kbOVZ<^2jt5-njy|2@`07}0w z;M%I1$FCoLy`8xp8Tk)bFr;7aJeQ9KK6p=O$U0-&JYYy8woV*>b+FB?xLX`=pirYM z5K$BA(u)+jR{?O2r$c_Qvl?M{=Ar{yQ!UVsVn4k@0!b?_lA;dVz9uaQUgBH8Oz(Sb zrEs;&Ey>_ex8&!N{PmQjp+-Hlh|OA&wvDai#GpU=^-B70V0*LF=^bi+Nhe_o|azZ%~ZZ1$}LTmWt4aoB1 zPgccm$EwYU+jrdBaQFxQfn5gd(gM`Y*Ro1n&Zi?j=(>T3kmf94vdhf?AuS8>$Va#P zGL5F+VHpxdsCUa}+RqavXCobI-@B;WJbMphpK2%6t=XvKWWE|ruvREgM+|V=i6;;O zx$g=7^`$XWn0fu!gF=Xe9cMB8Z_SelD>&o&{1XFS`|nInK3BXlaeD*rc;R-#osyIS zWv&>~^TLIyBB6oDX+#>3<_0+2C4u2zK^wmHXXDD9_)kmLYJ!0SzM|%G9{pi)`X$uf zW}|%%#LgyK7m(4{V&?x_0KEDq56tk|0YNY~B(Sr|>WVz-pO3A##}$JCT}5P7DY+@W z#gJv>pA5>$|E3WO2tV7G^SuymB?tY`ooKcN3!vaQMnBNk-WATF{-$#}FyzgtJ8M^; zUK6KWSG)}6**+rZ&?o@PK3??uN{Q)#+bDP9i1W&j)oaU5d0bIWJ_9T5ac!qc?x66Q z$KUSZ`nYY94qfN_dpTFr8OW~A?}LD;Yty-BA)-be5Z3S#t2Io%q+cAbnGj1t$|qFR z9o?8B7OA^KjCYL=-!p}w(dkC^G6Nd%_I=1))PC0w5}ZZGJxfK)jP4Fwa@b-SYBw?% zdz9B-<`*B2dOn(N;mcTm%Do)rIvfXRNFX&1h`?>Rzuj~Wx)$p13nrDlS8-jwq@e@n zNIj_|8or==8~1h*Ih?w*8K7rYkGlwlTWAwLKc5}~dfz3y`kM&^Q|@C%1VAp_$wnw6zG~W4O+^ z>i?NY?oXf^Puc~+fDM$VgRNBpOZj{2cMP~gCqWAX4 z7>%$ux8@a&_B(pt``KSt;r+sR-$N;jdpY>|pyvPiN)9ohd*>mVST3wMo)){`B(&eX z1?zZJ-4u9NZ|~j1rdZYq4R$?swf}<6(#ex%7r{kh%U@kT)&kWuAszS%oJts=*OcL9 zaZwK<5DZw%1IFHXgFplP6JiL^dk8+SgM$D?8X+gE4172hXh!WeqIO>}$I9?Nry$*S zQ#f)RuH{P7RwA3v9f<-w>{PSzom;>(i&^l{E0(&Xp4A-*q-@{W1oE3K;1zb{&n28dSC2$N+6auXe0}e4b z)KLJ?5c*>@9K#I^)W;uU_Z`enquTUxr>mNq z1{0_puF-M7j${rs!dxxo3EelGodF1TvjV;Zpo;s{5f1pyCuRp=HDZ?s#IA4f?h|-p zGd|Mq^4hDa@Bh!c4ZE?O&x&XZ_ptZGYK4$9F4~{%R!}G1leCBx`dtNUS|K zL-7J5s4W@%mhXg1!}a4PD%!t&Qn%f_oquRajn3@C*)`o&K9o7V6DwzVMEhjVdDJ1fjhr#@=lp#@4EBqi=CCQ>73>R(>QKPNM&_Jpe5G`n4wegeC`FYEPJ{|vwS>$-`fuRSp3927qOv|NC3T3G-0 zA{K`|+tQy1yqE$ShWt8ny&5~)%ITb@^+x$w0)f&om;P8B)@}=Wzy59BwUfZ1vqw87 za2lB8J(&*l#(V}Id8SyQ0C(2amzkz3EqG&Ed0Jq1)$|&>4_|NIe=5|n=3?siFV0fI z{As5DLW^gs|B-b4C;Hd(SM-S~GQhzb>HgF2|2Usww0nL^;x@1eaB)=+Clj+$fF@H( z-fqP??~QMT$KI-#m;QC*&6vkp&8699G3)Bq0*kFZXINw=b9OVaed(3(3kS|IZ)CM? zJdnW&%t8MveBuK21uiYj)_a{Fnw0OErMzMN?d$QoPwkhOwcP&p+t>P)4tHlYw-pPN z^oJ=uc$Sl>pv@fZH~ZqxSvdhF@F1s=oZawpr^-#l{IIOGG=T%QXjtwPhIg-F@k@uIlr?J->Ia zpEUQ*=4g|XYn4Gez&aHr*;t$u3oODPmc2Ku)2Og|xjc%w;q!Zz+zY)*3{7V8bK4;& zYV82FZ+8?v)`J|G1w4I0fWdKg|2b#iaazCv;|?(W-q}$o&Y}Q5d@BRk^jL7#{kbCK zSgkyu;=DV+or2)AxCBgq-nj5=@n^`%T#V+xBGEkW4lCqrE)LMv#f;AvD__cQ@Eg3`~x| zW+h9mofSXCq5|M)9|ez(#X?-sxB%Go8};sJ?2abp(Y!lyi>k)|{M*Z$c{e1-K4ky` MPgg&ebxsLQ025IeI{*Lx literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/app/windows.tmpl/runner/resources/app_icon.ico b/packages/flutter_template_images/templates/app/windows.tmpl/runner/resources/app_icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..c04e20caf6370ebb9253ad831cc31de4a9c965f6 GIT binary patch literal 33772 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 literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/LargeTile.scale-100.png b/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/LargeTile.scale-100.png new file mode 100644 index 0000000000000000000000000000000000000000..fa651eb71070bd8ada344ac3a4a23f346297a449 GIT binary patch literal 6049 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 AQ2+n{ literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/LargeTile.scale-125.png b/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/LargeTile.scale-125.png new file mode 100644 index 0000000000000000000000000000000000000000..649e07696ba75f5e525a72f60ee9bbe868e28f0b GIT binary patch literal 7419 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 J{=a$u{{XcY6^#G@ literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/LargeTile.scale-400.png b/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/LargeTile.scale-400.png new file mode 100644 index 0000000000000000000000000000000000000000..979878f735eb4275bf5246992734c14311f833d4 GIT binary patch literal 42545 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 W!tA=RzUH literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/LockScreenLogo.scale-200.png b/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/LockScreenLogo.scale-200.png new file mode 100644 index 0000000000000000000000000000000000000000..735f57adb5dfc01886d137b4e493d7e97cf13af3 GIT binary patch literal 1430 zcmaJ>TTC2P7~aKltDttVHYH6u8Io4i*}3fO&d$gd*bA_<3j~&e7%8(eXJLfhS!M@! zKrliY>>6yT4+Kr95$!DoD(Qn-5TP|{V_KS`k~E6(LGS@#`v$hQo&^^BKsw3HIsZBT z_y6C2n`lK@apunKojRQ^(_P}Mgewt$(^BBKCTZ;*xa?J3wQ7~@S0lUvbcLeq1Bg4o zH-bvQi|wt~L7q$~a-gDFP!{&TQfc3fX*6=uHv* zT&1&U(-)L%Xp^djI2?~eBF2cxC@YOP$+9d?P&h?lPy-9M2UT9fg5jKm1t$m#iWE{M zIf%q9@;fyT?0UP>tcw-bLkz;s2LlKl2qeP0w zECS7Ate+Awk|KQ+DOk;fl}Xsy4o^CY=pwq%QAAKKl628_yNPsK>?A>%D8fQG6IgdJ ztnxttBz#NI_a@fk7SU`WtrpsfZsNs9^0(2a z@C3#YO3>k~w7?2hipBf{#b6`}Xw1hlG$yi?;1dDs7k~xDAw@jiI*+tc;t2Lflg&bM)0!Y;0_@=w%`LW^8DsYpS#-bLOklX9r?Ei}TScw|4DbpW%+7 zFgAI)f51s}{y-eWb|vrU-Ya!GuYKP)J7z#*V_k^Xo>4!1Yqj*m)x&0L^tg3GJbVAJ zJ-Pl$R=NAabouV=^z_t;^K*0AvFs!vYU>_<|I^#c?>>CR<(T?=%{;U=aI*SbZADLH z&(f2wz_Y0??Tf|g;?|1Znw6}6U43Q#qNRwv1vp9uFn1)V#*4p&%$mP9x&15^OaBiDS(XppT|z^>;B{PLVEbS3IFYV yGvCsSX*m literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/SmallTile.scale-100.png b/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/SmallTile.scale-100.png new file mode 100644 index 0000000000000000000000000000000000000000..35e7f6242f49b50ec3c688b0d9fe21ff6ca3bee2 GIT binary patch literal 1821 zcma)-S2!CA1BQbdv9(6xP$O+9Vx~m2YDAEd#z?IyqC|{Zb?ll|iO?!)9NRCVHF~Vj zqE^&w#5h!|t&&pIF-q$=>Nq$5)qn9{yx;dc-}BwSWE|E~L{L@`004+sTcPYv+VWon z_)Zf4%vIr}fFV{c;Q)YW|G#j(3Z~xz0QgweC{xF%;;%(+A!qQQMAl|$*ZH8BUjOQ9 znUQ*KCOG@L2d>r_fqae7=9*6?*mVd9AeUZrZuKFQ%cWIwrRmA(`F2Xc+zhH#o+(Zo zHO+mG6i%Aofc~}-qt8e)6I0uS+OTG6Zv&gAu6!uoEjzyACLqwyJtc1fHDC5r4AT}j z1f|OfqeS_X`FXNal7@Os{`dSaJ4`m~n=K(6_EwqV>(IZr91Xkc$WE#B6Qocrz_|Ad zd+qJx=?Gmcb|EyHdyF7gHzfImMY^qxf^DbpC9-(Rk1>AD-}0X=(4BQL*nYd{OTRG@ zU{Pu7t|mcxFT3*0Q3;J?{D9}kiL)1U@sliMX&7XXdBYR;d z7M;N!7BCdby6Rmag#?|=Vl#1nrL)sIfn98%N4%UPYCs zwuOkIJx6@B&||9S2G7jDvme(oFdA$bA|a$f<}S`EryVLXz(sLY2YgbxeX8+lyjSL3 zU>dfT#kA4iBTrEdH2whcBCwPP1r;3z&@}!>Ds!m=owt9b0&Vh|KOQEr>v{~!d#JC- z61&my1A!KVn-}%ED+-`Q_I46KDJk4cNY8G^6K!+%&H$X@D3s~T)R&_T)vm8<{YT?D z2=N6=xD^?~f4X^y+P;~(7$$voGXXFk#V_f_k+-BekxU6Ub&<3LN=4X)=Kk2Q4^y(eAu*Z0glF~K$WKHfSv@ifJnEw6C zut5vMhcEbAS6#QcTFRRV(<-RrnssflgQbZ7g{bL(gT^%DId@2>m(|~)!r9GBI@@9| zst!pK%SHz`yf7`1lzg-+pBeHE2=1mmAG{K)R@xZW}A9;V-ixXO#z zr)6r24AdxDQGiiq3Y)cy`CzF?wKPpmnQ>u+yi{WA>QYA_C(b9qX*Kb9a;3S~H8$+= z<)$k*8;;5S`vi66*>kOPvU*hu=b&#=?{?Opoe8(bYC$(owT+Lhp*xmcYAxL&hFSH7 zz6_Q8J@8=+Wm+y??f0erc&=81q986+Y47C9V7WjuM!DQ>5qq0Pz#L8>9XhF^PwiRw z_&0h;!uYSc+(xD{Rb}1}b4tsl zLx7kek6I#DPEHCpjOG}~CWZ`Rpv6c18nN8^p;sB&=dD*B8&UX zG_AJ`2yANY6)|vyc6MvJNs>bde7uvY=q?PQ^z80NPjEH>!a_p<7@)5pMA6diJzL z?jLS?#M05D_#L7Zu3?5L<&5c4VLh3B8Co$2Brk%*)t}<=Ie+<4Sni@L!TA0cH^JcV z^>3 zMab4zlFHU?yM4_AUU~mXc}w)ju;l-xhW{GlC!c0ao)Ad60eIp&fVBk{)nMkC{0|Ij BO8@`> literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/SmallTile.scale-125.png b/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/SmallTile.scale-125.png new file mode 100644 index 0000000000000000000000000000000000000000..2a74cc67e6d7ed7a5f219ea738e21d2a67806262 GIT binary patch literal 2519 zcmb7`S2!CCAH`#b7^OvHmuT8*)o4qNrfP?#w6=s8jV)TOQE!Y;JNBqeYqw%`*cB}i zUL(}16%krBU(~4ec`v`a@4GnXJkS4scP`HJi!njy^Kgl90RR9VLj#?Mr)mAKfb6Gk z4vMZm4Ne~eYhM6>_shRxB4f*)Pj4}XI$CA{xvM!rK4v4}_5s{%^F$v@tVozaxkW{{ z$Cbix9- z;k+w*HWYplkZugPk_9kRVk&oLHleWoPmj>o8ORXG)9Rn5w$<8C-)n zU4v8P_#)Q%;kRMXjr7`H5rOUoa$efj)K~(GSO(js0>4hb`@l_Dp{JBMmTE{`<(=)z zlnX{Muw!3X@XB~r7KoJ=-YJs+^DIEvDU_B&s{evM%cMPLOVq(%*jZMs*cauH#8?Zt z)V$~n2tIhWq^}cx|FtV*OaeH4IY2Wn_wPhF5Yc6b3uB$<9%b%|>l-eHazd>yL`0^oNiOCxTZY7d`a-q2*LRf{cTNO>(^XBDMX;~pc`lF*M; z`_V_&4L0};yRr%R)2d9wWgJLKFg=i4fLIqsv+;pKJKmHX>z#e^Botk){jes*QY^-t zB0(CUAa4pxjZsQ?hjNR_0qim)+hiKqkgR@=?Q-Bk(YPyBrjUEF?cELtQ5J#@Q<}QQ zpZPm8r?i&xaHh_y68S)B^!mLS z*^p1oyB2L`n;W7?8GHoQhE=QZRz-R^Kh0tWS2m4 zIq6Fcdj5lDX-_X_wz{?nu5ZlK$%sW6Q1{K(xk{D@o^(QEi?39ELi_oj5?M|BP4 z)zlgqCnw2zbcl}qs;uhT*0#E8FVBRQX+&cIUuDPqBO+rSa|vnibNU^qxI`oR1y@GV zTLdbWGck-HS|2R&lFO8mD9&R6Opyyv5)!jtq0~u)AzzzD$f>%v2(Ix9W2d@{If?3( z4;BTr6wOyFPiE_`7RGOIV!Go!3*;p}_b)QI6)Dd{;u6lW&hb#?j17q-FzDqxM&&I{ zL`>m(ke{UWv!7W}4!_)flO17aarF8@_PZu&+cy`AKPN!1=W{{SFj|v}i!<$|C_%@R zz{rDiZ1KhilYujj9z&m?6y`2Ra+2#hv zv$6m^M`FvjzGMFIPPGVOqFl*iN^iF}>6&x5??nA$B)F;5w|bbnHG0GxKDPrVlbCk!%6PVf`H%J7rRAmyf+#axy8)G$7MyTV z+V{L(7g&=iP7mTNV1x@p>!UyDw0iTCXAvA~>_+7XXj2grSy9nx;XpKF{70V4JdF)t;zyqmo`TayeSB!W_FlMjG}}(bzAKfoN_Qa zwh^rBveWsV3|vM1{^SfOE8)RJ8F3M}Sx}26-#Dl?b7~cP;nyk1Lvn>=lk#$}7WsOD z2x>wf`nK0DPDH*<_NQdMdapj!9k`I`*>^gQq8b}lhp+!hc*?Ju>vWzUXE>=XySg78 zc!>+KnTD&inKSCa$VDrSD{&-BKlCx;U@*BT)WB7QKlNYIAict;ax)#abLD8hlQy$W zeqXc+@Sdh2snAJ2WfU}VK880v7X)ovz+vh3EcFd_De}Z`%A>qw^e=dMvo(;jYZ5cy z=NG;KyR(qiQwhy$s*<(wWtsL*20?`_4iDN?SnAnmu|!0)UzCTH!a(B@tuev-jK-EC z4Sw!t`30d%B|MJP7Opo`2E}z6ecZJ=KX-lNaEXgAi`xq9vYLApBnIjdZ5~)(W-c0b z0j&Q9aHzFwY2Sv3)W9d)YrR1N(+0a83mpfE8N2a8%2qN#D5|-iad_xLd*^iUncx%c z(5^uMeNxaQdv{h6uWWNA=$=(ATlS>r60sk-=cBb>mO8`R7b!N}8MHt>@tS4{FM}}` zPH|k#XG^+|f;^QPymwV5vue)L^X2FcdlT%oFye2y1IF=LpPh*@zUOTHsPk;t%i&V{ zzm^O6CHmbtlx)t&$fJ74q^Z|GY+uHl1-_((@+I_^Q( zg28q|m*fwb6?#g%g0199wEgj4JU(!BYpSoPf+Kp6-r8&_|4;5xvpSpr(A)6>^xo1Q zZ2AK&c9K`4ocAFA89p2m_9!$PqFgHZ#O#44!1gohwfqYv*wHwd{K#IF%urvau`ul= zVHd2B?q#skhpMAc`{NEVj+z|64b4Hsgkq9gNNC0Dr}6{%^a2_oc6;U*vc~V7`b!B6 pLp|ZG>9>?Pw*Q-3{)=?>BvBPVcOHE^zI#e)07G4b4)Gou{~xviyj1`I literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/SmallTile.scale-150.png b/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/SmallTile.scale-150.png new file mode 100644 index 0000000000000000000000000000000000000000..157124823d548ae2cb06ee30c2b6bcc898e5f1ab GIT binary patch literal 2984 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 literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/SmallTile.scale-200.png b/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/SmallTile.scale-200.png new file mode 100644 index 0000000000000000000000000000000000000000..07ec2ddcb15f766f41f8ac49e8f85082ea931a9f GIT binary patch literal 3721 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 literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/SmallTile.scale-400.png b/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/SmallTile.scale-400.png new file mode 100644 index 0000000000000000000000000000000000000000..c205729b7281ca6742a6b15f836e80adae2d78fb GIT binary patch literal 8054 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 VT1Mgv${?M}P}fwa>VXsde*jWjXtn?V literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/SplashScreen.scale-100.png b/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/SplashScreen.scale-100.png new file mode 100644 index 0000000000000000000000000000000000000000..6012579815fa4a18c7d12e900b629c6fde5c8d8b GIT binary patch literal 6866 zcmeHMhg;J7_s1-o<}I@_bKI6Cq1{Y0P04#ra%VXZHO-xfhI?yTnfqSLm8h*QnJJ*)NX?0Wd*I;r@%wLlf6oISo`?5&-kkS2@AEpZ*CG0eAzb*xr4t|!NLc5w z)>9DZkQ)djaQm1L@J;A-?jZ1S{MBO%FA(T-%fVZq!=uOn1iJJ_M@!ShKa)Kg^wG-a z_0MIdDRq6$uF_|NsW*x|NCFjhnPVhD<7+lqn&rk zSb>=qel%)Z_=A-snJY3P$<#-O1mI~HU#Ca#wB^_JD|6m{l+q0|AHTUb97A(+pV`!3 ztM_HEg|Ifb`wP;&o4cVttb!{bP(+IAkSGXb8yF!Bl6m$2kN=4ns7zu*bGPPARM#1u zj{~@P-l?!^Xeszcu7i=MCh-aRMa%I~ksjA$Ki}UN3cuRfB>FZZD8aD2>|E~6^xj2v zjRD(?#d>qe4FAvIm`c4|7rJ7;N9xlSm^+#T$~!Fasui(1^}}HJ(P(K@j>4mLUPHQ) zax+bAIzhJsZ??;8uXdo5?pcH%2TZjt`sY?@BoJTkcICTNE-rjpb5YZ_hcps`2?#;P z^`Y>Vv8JhfiON_q-9QW_Nf+y2Bzc<*Sv2^x9G`z(+bHv@M%1n81-fVIEkD`%M~G=? z$AdP;P$zO?dh#7}EXi73BXdO@~k4Q67HD$wRbW_Sk^%yC-vkZ_^D>0%f2)>g|H=xW2Kj9c(%tnti- zIi9j#PoJmME3LC`O}~5eOtmTeI$sDw3|UA8MQF0{G*|TWCon4CLj?ArVTlJjhiV!* zutfK4OwI-YmiI29s4fj=v=eH2n-A1JhIX{1diQVwmOzl-05geoP_+PyYb{mTjJ0Oi}N1{XRZ~>9coF9VQRy?+) zLa2R!yTY*w1t3IEg`~jy0lqrCsny0xGal!pf_EePwO3v1r8`_8J^y)c&sMCxK5wLd z9>pFhxIfKJXhUNB=6CwD*8(uuWJb-YChT$O&%Y~tgO(YKlWT=BWH1_s?b&)4iAR9h z^6K|?yJq_+Q%Q6&XCKY*)4#brT%u{1Z8=;<<+!&Z(Nfi#v1C2i&@wZ%mof`j&1^(~ z21MN+eitHL(8#vVtSwU+LRgd<@RU%Jdo%`b&fM>#5EzE#3}JfJJ;KlpA6f*v-`NUA zC@mo->}wyTvtlEuMbC>#ds#If&{4F_ofr3Lx*{SXY*lC0%DD7PZVV_32#^eJ^!b*H zukj3_O+6k_daqiO^#Pmj>7lVd3xc%|eHr+4gS}Tk#vU zf^Eo-xN)W)@5Cg9W;9Icw zU;Ep`jKdPYy&*DBgeA>$_w52)oba@b1!VA@>T43o8z$K|_uT#4XkHhhm1Gb=&CSu= z73yIFsoPyEOAUCaX$p}tMjH~c&Ww+VoNg2k2yh6vj3P56&)UiZY5R;MK==(Rv<4HY z;zvZ!eEY-opakxFM z-UjOv>VvBlW*{si~Pwlo!Nr6op{S z`4)l8CV;6jiZo4k+^JN)XOFv=gE!lc;${D+gmj&6xDz`8It^s5JC>Mu{^*a8`SoPG z5D%>6+(`^`ObFe|cswnAQq5O^89dY9R}Gv?6M)G3$`!bpx}X=l0#`+vE(R;PHGhN< zPi$Xcyg}@Q{iUYYMam9X^CDb6EprU`^=GBk@mSr>e2=o^1!KqCwA25J;>|781Tucv|%A8*O`h z%1bPE8r)~{POi}7K4h~m>*6JuYZ1b8Y1Bk9dHva^<3;qkNd(yN5=!zoaV|NTsBhyX zu{QkU@$_1J;Y>FB`_g}%fMd7&m(=PA7%WxPnD}IbtI5ey`h!-|)(JEB6;WXNGjg3( zgT=#bk3m19ORI%*au#~-*+GnN={Ho;ZtY;PV&F!((`Kn?RdheBXZVP~A(^3Y5|-D$ z#H0X@rx$Ln}c!hOk$?jbO>e08o?^kY|P% z^TcdH&9t z)+Qs6P7`~hC!gxUpWig(y~pZYb&I*H_HzOGV7AOePPgD$|IhMO=~2(8eY2KXicKob zLRAhwm%kqQ=C-gA2ua6wH+LdK_{rGiWa885ZI#ohXpMjgSe5F`BmU0zm@A3f(EW8S zdRr3G$}sVI@bh>cKIM5@%n7wsX;IWe@?nYZp90M*OTqtO{dirf3+1Q3Xk+swz^LiY zlW)I#70)oT*b1|h^qm$YW}DcotIZ!Nt|nbZDejIiG&*Ekkr?y+sSKmVZL3l*p`jdG zLFCH1=v_;57}DR;&uAgzo7)X4C+o{jc@f3)K?3o}aFJPAJwjX#YR4|bC4{UevTC1F z&UGMp9}Qa>0!EUF#0Ha(VfXppAhPShB%-*WzF~y`gzWfog9DZlZ@5X3@q%AQL&CB; zO#a#EWZC1*iW@$TTR-qxm4!uK;W+iGTTJonejMyQS)Zfj<*Ys~75p}WyIT|5mc-q1& zZKECO_i@~`&V5y<)~H(5Ib0CH0!#P%#hVGH%$QW~P4CfcedmJUxt-VdNSfrJgFXGu zAB{3|)9~pZuTs^X(mB-M&tG6-un?9B*1+R7?R*=4(?%SE<{Wf)qoX_b0y4UW^vIX$VI7<+cNVLM~66otWF z*S5!1>&@}odKMFYM0|dOs)gHS}el{DK%@_IPPXB7Nw`lH$mma%FH`vSU0;#A-#=I6iioB#2GW-&G&m(pu& z_0*RY;9?wrp4G4P27io;QW(sgOaFrO?vBtJ%<^B?WokG9ZFchxFP-@Hf^t^c&SRjm z(jWi;MhnYsj(E1^ZI`V@EYkCUs7RsK7hd@o&1c3JZm5r}{LCrx+jGSz(#FQ#6EQt5 zrP}=pvRanxaHE&7pA&e5p4M>NsBx(CL^)KUC!}Z^h>B)~fY%Huzc#~MBgx2NhoEfM zt}y`c4jjGYYW~DZt%TA1HVh(i>F9VygZa>>g}!XqAGG%C?YZpqZ@K7CV%0CJ4X3`l zwIW}@m-R5%kcxv%0dDT)+M-jNVdfs2hf~-gnm{E?^^$`Fj3(;i3vcggvhsjCIr^17 z8e7R7g3)dW(YJJ&1pEFJS1n6)opE6Rz%=xJ7z4t@#sm3j?;*=e$OXWbnUQy*UaWF| z2bB*&1~ZCnlF41r%*v%N!*QY=j1(1`yc{=8mDaA53xSb-Z1Bd4tKrUPQQMMj3Leit zh49^GPJKTPbl(frS%W*%dX4LoSs8sWUhVMi{=wk}M{{cZ?EnJNd^p}k;-wbz6@;fu zu?M3?Ltkp+H$0cY7%asP>LoM>=$Gyciw;KQc02}ajT|#}*?;gs_Hld;!7m?@K(cSo zMKj3oyyMKzYI-*D_H1=Ry5d7wfI7N#z|tCVL70t7Z7kJ!tDI2a&dQ#8IDQ6rDl0 zB;(orN1}`TbW|@58`moViWK_pNSb1V@UcIqhClboU#hL$DH;)*PAy0v`u>TYlmWsS zlgF-gxDm+atn}CkA4>UZ|U)nE-3UzHb% z!QLJ2%Nq~oA2kka&K2vI80Xne2!~Z%VelFzdaZu@>;(|>k2$xw+as9G#A{DuJ;RJg zMd4<|J(p5$wH7^&SQvI@kM~7d+d5k7Tyj)incKMKfbpJMelmX@>(T<(X4J_%i~`cB zVpKM_y@(fyyH>a36*gvA#g=vz{-#3nRkCC6z}`p2b?D!K_dymDl7{!6{m5^n%{)cATVe^tno99^FH^XS-#hfLrg*g~`0HJqBAmFU5wMIyC1(4^cnPa9$2Txm*t z_sbuvzV*Z;F=|ft-$^gl&ZD0$RX&b8Mtbmm^?a&wmgs0DX$Y@;_>LZsJjMs-X^oJ@ zy_RTBn|coRR6E-QXIS?GYFeap&kk*LmB!(RD$>pt_aj)YhmlntRZ1P-xG`sk_Xo(a zfBB`Fhb`34rLeRlUOfRq<8OqU+Z)7Ss`Afo2G@(DMa>umCyDPIxA}Cg5e32sv<{FT zzuIJSpo;xH1GqU#B>0rej>}a>E^n|uW%1jipzM9eH6~dCZx(xYbhJEyIO9At`9ZWF zQBOfa8p(L|x+`LmtGG_8O+b)$i&AoJa3bgfppt%{E*7Kk=ZAJyt&7`+VYtOWpDHE0 z+rtB*!T`RJ$(%%hWXA%p8vv`s_(JxLAZPd^{=A)YemM#5)$QeCLQ^g*HML}J9l>*j zI13jED^Qi@irHoYdhNau?mr=GLpxC)irdtsKV3vm;i0>$faLSBF)63!mT6<#!jyBd zDQ>$u_xSGb80T*6Sy?GEczp&G&bptO{E%m;_w04z{h&zD&VjG*mpuUrd~z;EcU?MjYE=j!fy)v39fnBvsLO{ZYQ8CT>zc8g9SCHl+vAt|<+f~hpm zX*%NM*qPCQLKnfAw}6KhMp@KVY5vdG!RD^U8%7KHH!p1uE96~pZ&WT(B54K@jPFar zk#c9KFB#o+5kl^TD?z6a5_GGVtj5o*bmfuf(F+$O=iE)h zeGkSNn;)K$Vc!WW?ON+ad1Dt$wY3`y(Lx!?M^6xE?mwe^55Dr}_}gz?9z1Oydv6SQ z^@vL{aFUZ(C1?~FVWC~iynvg?+HQ8?iIf=ZENtBxXdEk|1h4*K#?`lO2-S0(N=~g( zaSRtfn55$#!bbeW2=;qi|)-mEtb-e*ES-QuCd=CSNJw|~K*fLGNDef5bXT>wd zt7-B8*hAmjai<)(0s}8!nxZS|@M^e%kyTxT88djgMBGr!R{LNeCx=G(`S4aGM2$&d z)?P>4PAG00CJ44Owz_&G&hW|~Tb+k93&8YlK==T2nx+?}RhZG_`7XM0F4~sw!qO^= z&nAq&?su_NKaWN^YgmRC0|BitWB5-q);cA~K;aF%FHR5bV#k?NZw&0}TaG{Uo~OI^ z&y<#BE;|Sm0KnYx{AEks>$Pd+>kGsCrUU3iXt%2=dfXhI_iC-nhfbBR{UU{~<&~Jt zoUDKWL##8p67(`dTzxU->etS1dFU9mhnwotAh7p(h>eGqWf{MdF{jHUBQx(dJqKna zb|z3Pi{3_5T6K*C8v*eAeL#GJFch}4FbnzPdhf7<}&C;EgzEscWM2Lwz85$7t z*<91Eojkt$np=I>CR_+`6eA}=-y7cVa9Wx(4v*BX5C9zpbjkle{wHF<;S1h6U3GjM UwD|=1lM1Bs$WW{7Puqz91ABlFQUCw| literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/SplashScreen.scale-125.png b/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/SplashScreen.scale-125.png new file mode 100644 index 0000000000000000000000000000000000000000..0c35be827fa2ccaf34c9ed18255011511678c342 GIT binary patch literal 7899 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 literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/SplashScreen.scale-150.png b/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/SplashScreen.scale-150.png new file mode 100644 index 0000000000000000000000000000000000000000..f1e60f33c3b4ae5d0f7fcd893a89b7adae98adc4 GIT binary patch literal 10137 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 literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/SplashScreen.scale-400.png b/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/SplashScreen.scale-400.png new file mode 100644 index 0000000000000000000000000000000000000000..b2b7ca9c4002a64ec810b0006ca34c330bb12550 GIT binary patch literal 46573 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 Ys(B0le%?Tzy4wM0sA^+NRV+jQ52u_yv;Y7A literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square150x150Logo.scale-200.png b/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square150x150Logo.scale-200.png new file mode 100644 index 0000000000000000000000000000000000000000..20814081dbf6b3a37a4671c68409af535fa5550c GIT binary patch literal 6223 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

4u6S^t?ou(>^5(^ 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 literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-16.png b/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-16.png new file mode 100644 index 0000000000000000000000000000000000000000..1c78d96bf8b7a1144eb382cbe37abdbfee03212f GIT binary patch literal 697 zcmV;q0!ICbP)pHYe_^wRCt_)lU+y@Q547T-kq5{GwZgiZGIK`;J&plMc@ibg{6=d z^g$+}OIYAj6um4V^s=-sLA@2?lND+b?n`Ne28ElF5NVL9EC!OhHCx;6eBGJZdz&5< zKUO_&7ykd>Ih=F<4A`NryjAvdUT&BWP);lYoFe1GGLH1uiVs#b%y#C^c&3;jc9a#F zfFT3mDhEJL;wRNX;o*8+LBRECD&(p0iY;OTT3RE#Pk>6&c>c78@7S!}0;nG!cjkc^ z<2+nYl{6yk6`=mt7?qb|ZH1a`0r=f@1IWWRDz=%o%{Xhs6_Y(T+}cWZ1zerddwDN= zQIT}Qdj)99){LQR%`fVaUdX%w5SrBP^ChTLN$Ujd;h~|L2_^fdap*)@W;^p5AT)`i zf{(kcN|95!cOfr(&B&T(p4Au41m9>; z>OoyvQYTJ(s$9zaZmCw?;4yKz;0~%@q8p3H<(`3)?%5+Fa@cb7;rV5q_)9oI3Hd>E z(zMyU0T78eD2RaB!>^SVu2hT~zcA1s1PM8xFO^m<#m-lK+wlskMe@QVmhc!`j2dWK z17Anp!}#L-EzsQ^x4Y0?0iRDpDbTlamQv4HYT{Ecw=hT0zRC+E;p#U5xV$Uie|_nw zP{GlA&5XbF9rRTkqFA-lRMHCDdJR&&6k0#YwrK>@cYa$3dYTwUk5Nj>X-=}$d<$GS fc+>vVYjOSukcb*(FO@J{00000NkvXXu0mjfXTw1^ literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-256.png b/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-256.png new file mode 100644 index 0000000000000000000000000000000000000000..d49d3d89908c2dfcbd1de42523ebe39418b95dd3 GIT binary patch literal 15554 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 literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-48.png b/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-48.png new file mode 100644 index 0000000000000000000000000000000000000000..6389ede5a62dbe77e287f93b9bff4c7235732ccc GIT binary patch literal 2418 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 literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.scale-125.png b/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.scale-125.png new file mode 100644 index 0000000000000000000000000000000000000000..50faa932851c251727b33cce223e75c4ede7e993 GIT binary patch literal 1893 zcmV-r2b%baP)pM7fD1xRCt{2+G&gvRU82D|C^c4wLRG73`_W`xX2mV1%iYuU}8v! zQNyu|8xA8z@!;}{ep5dwAVfp~(Jh4qH3UOoVY|y=K=~vJ8@~8qqsXzc?Y7-^rnBuE z-da$x~=s6~(oj9~jRP7$7$E}D^L&`VL;{QW)Q^u838PUF9L*So*<^020i!SG$Qlil%$VX=cM#at zQray$ZiP2Aj&lhe9Dyk*805)XDq{rZsh75t+ICrS6lSj>rC7y1Nit!SV$Pt@Buw#Z zJFS4xC>yT%a%ij|iC)_y!lXpTb{?*mHe1z)vf!G}X2Rf~U^OITK6RIsFdCNQ4A@u$ zHZ7I0?BQjMH&ezGpSH_gFTHJbUo6F~y%Ze7+QkkEi{ybBVIE^X?Gtx{U^$G2Ww-=P zq8Xd6_@g*)C7NJrzqXse-m*2T8?I?9eWr|>5G2a+8|a0Mx!WPb4P%}=op)oZ@M=kb5^9V*GuYc zfl)AS{gwV|EJ$fs&N8H7f<^kGd)*a=(I^P_0)gpb6&+)9LbZHM>5W%oCO&k0vQC3^@<(88Y$O;5&c>`EFZDdK3<|)pNc+$} zNthkzF>Qj)LOr>zC8zs{FS^fN{~&DjmB>7sWIK&m)~OH10kPcB*XWsr!163GHXt*s zy8hS#>6=1e1>tlJzZ<$8n<~|avlM@h6V4Q@It_a@`#YL1N9M8;e}=-efuW@Xba)_Z z49_$4ASyoPrQ-`^ccHL?aP9^2AEca?A`m;oQQ}NBwcAf$rXsM>bXJUho)dO4Fqf5W z?G!c`&H+P12Z_QMo&hbOv=j>~2uI`SB4;021{UjpykfODGo3*?#t1Cj7yaUJgSavK z|1D}KFsIzku$)s1n@)k!2POw>Kxt`PP}rrsl5jK*FLC)u2AAl%bgi;-pM z9<&hH2ifn>IvuEIBnq>+;*kjE7=XW2O2JS|kaW=DeGM;ENDS>os}>emS1L=b}BH3vGZpMY*Y%C z9$qNXU~e>0mXn+|29dQaN?>jCr9)Qt#ZugCul5vT;SwNDpfEkxHYN$YA7g>TY;2Mi zZy~TFR`w$mmg3?V`^n1N!wT@2uH^ZUv7sg~j)iMyucC8Tetg`@KA6K&+_k0RZ*?a_ zPYX!z#TH%SG8VP)A*4XHpmIk6@ZD z1J-c?e81eFFu)j-B|*nX4Khe{Z01%U)MH21mvr;P9A&$lPJvTS4K#{6@^Uru)OdIh z_qKOI|IgQfbJ`)slC_RO^wufi5v3X;dpPG70tBmoWxWw{bD8}f0WRiIywiXAM&12i zyD^M*5*Rb|A!D7O>jgGS6j5N)0X^o~Q1pGdRFwS|76pn;?!_2uov3!=6S^8ooDpQ5 z!Q&(lQJ~=3%B(s7_-JXsirjouJ!|g5b2}P&8{3HlM-n(RjpFpbQY9LsCAt+>?$>eK z%iD`>w{rKyPi(%+H0^7QVbsM4jwxh};mrG5rqggDBnN<$sB0Uu@*n}Of2WuxD|*9U z^=!N=uH4fYBg+JmMomF6HSvb&EFt+c5pfNWeav=PdB6@)$0j(j0%w2c!=mCp)ll0u z-65TAZn(zZAP6@&W(eQR00000NkvXXu0mjf=R=Dz literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.scale-150.png b/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.scale-150.png new file mode 100644 index 0000000000000000000000000000000000000000..f0293ed8147c619a36415f1b742076b02a69378e GIT binary patch literal 2515 zcmV;^2`u)BP)pOg-Jv~RCt{2nrmU_UP-%mC5$9@Qp!x5OgbH=-%2PY!3ooW zFM+00+R1~bjf4ph2(R!6A-o}lG-*Nzgpgo7*w}`~ebb3yQW(a>*knkc;ZtW4Cet)P zQcHeG`;vBh?(RyK<+ZS_UCWu#e_$kbwYz73{O`HvKHR7%UG72$Fj`auVX6qiR1t)! zA_!AO5T=SCOpQ7ai>^rf+{8UYj>(qiHS<%=IEERFT)f+-^ho>bANHOc&T~f=lP=oL`AFc3cS#IF(M;PRaL~$qgEJ9(Nh>>a1Rn9(xH4I zP!$|RMVs)lx0GxUqY8yUoq%&OKq)6s2<_5abq|qMcEnLo5Q|!ceS9g|WI#yj%^{~U zAw;CN0m4eVVksDiaGUTFS4uXE9YcV?m=L1UJ0~9`&)6AHK|q9Bg*~K{Y|$Yk2M>XK zhecvUItCDy*&Wk}g9x=syWoYkQV6OA1T8y1q?|w@bSPD|50a;yh-*YagxjPY&_!+^ zsuOewQKh9w)DP*ye@r?+GP@DK7 z339uo&P2)yI9Cs8IDr8taI|-*h2{`)I!4Dqgj&TH_#n5JLQs>5oXtVc4;c`|s8k0K zDx8jy%25#EHt~59;C?H0CHo}C0o`CiAchkf0K!5ip3B+`~eca^Id;c17}*LU+$yi({GQk39_j=|?KOdB4MC%S z3_IMu85B|nJfuQx^IfB*c5tagkBeL#X>7toKVPiLZ6k+*R& z(>0VUQyLbC^2@>!&QFdig6;&B85{&mA;6%kDSnfkUGo%^u)KGhSoOsX_2>8Tig{&! zWws-|4s$)ih}Tu(k)@4rsD3!_G-MEq+Qe0ypF60;3@0#jjxmSyiZRt3y5w`Wzy4zO z*{3EbR=+L3BG!^pZlTf*6Jg8Kl z89&yW13-{FfnF0WKF}y&e?1Ep2O< zO7;%@RD=_e)mythgdp z1B42pU5B6!5(0+ejSkLsoGQx?0@bi`L~WVxX!(aROoHCG6mUrYWN8#jMsrXu#1zkC zf1JTsLZCSTAcTZ=IpqZ0=Qi12O(*COqVg_)uzNV~kgZ|&8nqAmjx216VLsqJM3?9? zVbJCPZ5>Hn^2Nx1*~iYzW<;xd0EBlTfi8|y2#^8?azgJhD9CAZ00?44-gByq+d16$ zvz1pJak9*JxV%MRxBxAvG`*mr@$;pGLTFA#BEL8@d%R$E?ZmV3qjxxN$+(CN-cgZ? z28Ljy8xumngQN&ejNJBoV$W9Im1S)ie`vvF5u5=fHe`D;){Ug@#HDx-JFD^0@o}qb zCZ7|JxC7kMJGVt7c{Fsd59=7r{Mtv^5QM0>@6=R&Yrb)3%a*Z5-BfaLVT*`MzR$fL z|5|QyiCwcAr{5E^`t781;$eWWT15p%X| z8-1QEBL^z3NZ$ytjt}0OKCZ{=H$OcWKjaB;D=382Vy_$icF6RVRdk;h>ytR?g2`O$ zWrI3|R~n}Bo9&7>Tei+e)J);(20AzSZ2X`*z^{}60@5M$<^&hKf7FC=uQ%lkeVr3? zLAuy0{{B=Mzsb&6vo#{q`IDOB2V6mZl?lOE@kV{qfg3X!Fc`=Q796f zgbqO)#Nf;YFuFY)y4w2LXa5TSXha}TISS(b&N1h2qS$s%z_&Zu4I}Pc>z%Z!gzVtr z32Oi3Q}pHKs}tDyRn>BRW!T9WQ*solT0e7lElhndRF#u_=ZSwz9I%WMWxOWIuYjmVRnACD%Xd<{o4YluFdpqpLkYa+OF`ljgu z!h}UC=SE4WA2i&XL()5FL>_pAyIE8%a{en)kNLm6?Vo{uw8W@PjkJ%K5-N?(sgLj6o&p3iR%B%Y~!6Y1DwA0vK!D^Qt7o^3zqh|5RuH z6k;4;6oJ8R{t>l9q?=3zoD<2VQ3Zl3(NH<$2^c%}6O1|#g;EiOsUiqdMG&TnAWRiO dm@0xW^?%+OX$U3ZWQ+g+002ovPDHLkV1kmSq`UwC literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.scale-200.png b/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.scale-200.png new file mode 100644 index 0000000000000000000000000000000000000000..e54a56dbca06bcfffc2561ac551ea5dfd58afaa0 GIT binary patch literal 3239 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 OV6ZT;GOjgp$NU#Bj5MgPpB!c$GVm! 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 RfhYg~002ovPDHLkV1isQMO6R* literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.targetsize-256.png b/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.targetsize-256.png new file mode 100644 index 0000000000000000000000000000000000000000..50efc008dce6f8096c4c0394438f00c8e7154cfe GIT binary patch literal 10408 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 bno1(wj@u8DCVuFR|31B*4ek@pZJqxCDDe1x literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/StoreLogo.scale-100.png b/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/StoreLogo.scale-100.png new file mode 100644 index 0000000000000000000000000000000000000000..fcefe81ba952544e550afe6ed2b97837fb2ce465 GIT binary patch literal 2370 zcmV-I3BC4-P)pN^hrcPRCt`lntNvcTGBGCgvq_KsLOtMPJo~ z_b`Kzi8tGnap`#L!`6#N_n8YEXIgW8B)vvT*?J|25Njjxpc74-@`^A*#DUP*m(qFJ z&R{$Z=C0->?wq6{Tks5~oZ-z+^qQP$%Bi_j(|9_;Dt!1Px-ScM!q-s!j1p?YG zdS#@ks)`sr)YLc7OBiEN4+&oB)N~NkW*nr-BfM-aB|Ai)LLsOUI2{9uDM2BIrMFrh zB3m-?Gov8u28CmMDcKc)2Xjo1QUhuN$*^I zkUW!(zZn5>4GKp{DcPe#gfoXA-(ivHmCgaghHQNn9KIjN+y@W`#ZetXoen}DC!m8- z2&jn*&5KBNKK=^=;_`?u5+`?98V$vi!09?{Lu6CsS%&_E5^od9A)?tm7%BCm*3SXLnJLAj2zTV9jL zsS=7hA%bQMq0yfRgy@t1)bum<$@I$QZW)8P2E?tL!*W6%4@J|7E_u=`5lbh4_{$Ie z#y)`-%?t#!j6l})3(s;6?hQE*gP5i}=~6_x6O8hI_1|V6KYEl&JGA6$(}KWMd=s&g zH354FAU_GICr}sIA{dM0G#t`CwrkQ$rvk9{o{kWon z@m)vOj)jch=o5w@YX^i{&Q8uMg06(hWCnpL1WXz`gSXk`O;0f)!)JTMhA(cZKfjMx zqIV`+Vjk+_sOb?#yr~k4EbWB1S~CJ!=MlGXcJ8DSh$z9(HFi1#Eukj-a`({JUo7u> zYMx>UaZPL{rCg;vj*y9PlR*-QCOI@A#FZcv9FkvZE4La#7=pk9aYm(}MLw*j6F|tL z@(0?juYT3#o@co8R^<^da89mL_@AWTtR*_p41T2!OeVxyEhsP~?Q1I|N7KcV1ajda z^2XZ!fJhwHw`p#GDv`B?HYE*olE`2ujmkaR82ig6_x+L~#5J)IAgY969YW0z0>j`- zCzl7>%hN*`f>3KNx1C-4VE_}S^(_SyN-p-uU>8Xzr8l5h9{b}G#t?$m1VFfiVL7G* zp7a=F2&6;! z-h~EG9i$LY!l{&)cn>BtG@SrK^vXxt%ejM@K%@nscCp-cdTqbJa1J^kYWjdk{qv=S zLiB~b-d|i^K36chcYas!>|Ktlo#T~3I~A!YHH4N3;jkddOADLZpDDz&Ak>=6`BQ5K zL{J8%D9~+4i5W>_p{v1hc3H=xbAv|rEbJD~m>t~uyF((9EE>AkhII@r0|>z<9&0b- z_hti;5eT)GGIFxAU&O`V=UxwfEqhF&e_2PxJprT7F6b6d1H?vUM1;<%A|EXcc#Xp( zEM4LdI07Mh#g_qMPqq*lgHXFzPEJ%^lfDrGBOkn1F=yQ9Ge7MPp0YT&O%x)wS#5@Y zBQgzHMfX{;z6gsCc+t&j)~Q3h(pJXr&IKYX5Nb_}xRzAc7IpxfTUx18+h)ZOoafp$+KB{LXR4;PV2tVsDyQ8r~#14 z$|E17)17}_0SF7ycO;>vRH~dXiZE|?v#T3bxz+vcA1hG1vDCJIewV&fEcO{ zG4k=J=x%o}O(#T`O{x}I$HYf?fI-Aw12qFMHS2TnUGNjD8;|n)e$pv`GGvbi)05GU zZlZ5Gdl4oqQaLjU!}y`$i5iNZV2L`+)23DD)o@$&#%%r0$Qk0zrTmKv`oehp-*tD%3q!Ew}V2hHT4vR;T>C1 zNQxaOCaoGL{|(o}GQvgo)T=AsDMH2SCiLz`!;QaL{k|5!)R|W`NQmVtR5^L6pIkzb oHyA}=u$g~E9TDjvk>Q%?{~y$4P53g0O#lD@07*qoM6N<$f|9~XX#fBK literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/StoreLogo.scale-125.png b/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/StoreLogo.scale-125.png new file mode 100644 index 0000000000000000000000000000000000000000..4381be777f8c9cb537e8b52ad4fe785008d91772 GIT binary patch literal 3229 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 P00000NkvXXu0mjf-k~wu literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/StoreLogo.scale-150.png b/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/StoreLogo.scale-150.png new file mode 100644 index 0000000000000000000000000000000000000000..e49390bf3de46d97dad9ece51fa8ec80e869bd15 GIT binary patch literal 3739 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 literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/StoreLogo.scale-400.png b/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/StoreLogo.scale-400.png new file mode 100644 index 0000000000000000000000000000000000000000..d1472741ec5c969e0da6c2979c4b4b07ab3b0b9d GIT binary patch literal 10759 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

4u6S^t?ou(>^5(^ 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 diff --git a/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-16.png b/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-16.png deleted file mode 100644 index 1c78d96bf8b7a1144eb382cbe37abdbfee03212f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 697 zcmV;q0!ICbP)pHYe_^wRCt_)lU+y@Q547T-kq5{GwZgiZGIK`;J&plMc@ibg{6=d z^g$+}OIYAj6um4V^s=-sLA@2?lND+b?n`Ne28ElF5NVL9EC!OhHCx;6eBGJZdz&5< zKUO_&7ykd>Ih=F<4A`NryjAvdUT&BWP);lYoFe1GGLH1uiVs#b%y#C^c&3;jc9a#F zfFT3mDhEJL;wRNX;o*8+LBRECD&(p0iY;OTT3RE#Pk>6&c>c78@7S!}0;nG!cjkc^ z<2+nYl{6yk6`=mt7?qb|ZH1a`0r=f@1IWWRDz=%o%{Xhs6_Y(T+}cWZ1zerddwDN= zQIT}Qdj)99){LQR%`fVaUdX%w5SrBP^ChTLN$Ujd;h~|L2_^fdap*)@W;^p5AT)`i zf{(kcN|95!cOfr(&B&T(p4Au41m9>; z>OoyvQYTJ(s$9zaZmCw?;4yKz;0~%@q8p3H<(`3)?%5+Fa@cb7;rV5q_)9oI3Hd>E z(zMyU0T78eD2RaB!>^SVu2hT~zcA1s1PM8xFO^m<#m-lK+wlskMe@QVmhc!`j2dWK z17Anp!}#L-EzsQ^x4Y0?0iRDpDbTlamQv4HYT{Ecw=hT0zRC+E;p#U5xV$Uie|_nw zP{GlA&5XbF9rRTkqFA-lRMHCDdJR&&6k0#YwrK>@cYa$3dYTwUk5Nj>X-=}$d<$GS fc+>vVYjOSukcb*(FO@J{00000NkvXXu0mjfXTw1^ diff --git a/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-256.png b/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-256.png deleted file mode 100644 index d49d3d89908c2dfcbd1de42523ebe39418b95dd3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15554 zcmeHu*H=^B6X;0@5PFp&HFS^;N+(nSML_8Y(o|HCB2uIzL8>6V+6ahzGyxH%Lns1L z6cD6})KH}uY9J){_Z8y3v7A1DsT?}${diAK~uqHAh;?GjZA5Y4{9_jnu$wK`*CKlD} zP*wUOx~KZ?VtT@9Moz!CGosT}%dGK))}Jo3Iz@B>GQo30Q^p1xZ9!gnLq|u=_2m^( zm<}GJz3srL0Y8VY7}LWYIzBalnJzT9MBY^@-3PDLPf4>duO20773QbXI(32!b4!O$ zDDAPa1tM1*aYJiDrsBO512jTLeaFcZdYt8QOjLkK9W|Mb8F;QTrOe+pv$eP1AoW8b z2`0Su2R-=coT~jJ0j%P&@D+kk{u7v+2~q7_#_!+OUC&noCnMS+n33$QuD{KFnC4#N zG!&w<6T9_`^W#lm`5@mJ3iKhdkUt5bSpun5zibE0m%|zi{(&TqFN9vZLB_Cpx)a5o zt4;TnW@91Fc|t2T#MM_aNGL6EncFG8>*A-O*7&bkb8!WZQzDu3VmuDSMmjQ27Osz; z$fgb`Qr8mig;HQnFoND!7ky!dCCn&v)_DN%$f5%B^@p z^IN5>c$0acefitCXN^oo;bEhcjIdD+De&nuN(w2o;u>PS-m`k`*A|wJAINLbBQ&>e zN5XQDS{Vce_rF2uNov89dMFq(VE)~QFU9tT6^h%8`XFcS(yPZ|Z~KJw3D(I1*?3Po zOEW53Kti&PKiM`7<+-eIb2c|xaS_rgb6`_Kg zifi^Qiuuzl8IFcNuSwSVd`HyI^1g&W;C9zI8@cuyn@SQlyMkitoBPn!LlFJ<{`P6j zq{}-6T)%6Ec?R-s`2Vnu{?OzUT}S4?(wVTx~+H(qp~%={|Em3v(K04)VeeZ*t~e9#b@b^I+eT_8a9BGEMqx@?|fOZ zIZLud^!`tmkjnTXWVAO*jG`@z=6WZC+qHNcQ-N;G4}M32^8?~3GRSh0FDUA!Bup9! zzd;-Ro0>lZ8Tx%g`W%!Q!!BV+CN>bfq9o8Z5xGL1o6Xxnb^inGuk#$4F;kcYZ6qTJ zPXX7jL%{XR9Sds@-=(gLOFfF3U9QI`B3f6F;&7Xhf6Q2U2oqg&n}(?Is}Ch`a%R;; z%YcQElQ$Q0xsv~f^h=HrKHeK8i?$QPuX--tzch#-4ms(Fw{}3RM0|A4w`Ly}G9e!! z9-Pui;pAo>Hm5o5F?dZXy4Kf9SUvtH>?~j=)yS{VZN{>xEY=C%OBi}8fi_ncHBPbz z?GGce+Todg=UwmY&f8If=Usj8)1uCBhC4PR*uU;R9Ie^^26#n!nGQT#n>PJsZ+5 zKskuq-t;a~8%6ymR7K?e%hkV=H-H)CCbkIiaio!4Z|aEGg3`F{gY2I*BDzG%s|7vF zCTPVm5{q|3Bc=Z-&dSIKd0wAT#Du#VFoUJOPekew>VL|T`a%3mAbxk1thueD{lz8-|adBM2 za+^H)dfQ*UeTaT9OuP{3$`d3d z`IM?%{}XeppIC&TElPKgJDC)ho&^dM$)!5` zYv^m;Jn%t-uaLA|z`b?o`oa%iuhp~?Yey_3-FQpzBzi$;G09VpLKh|T3retW`zn<2 zLnS9SU9zr0Q0bp!a4DY$!lmI_)>CR@rAL|-E}?0O-%D!i-ZDPvC^)j?Cdw?%aQ!-r}ZOtb-?G#;li^`X$6hEG@R-*`Dy3-04 z1}H%Z?TD<_l--OE1Z$Q4)Cx3>e`VAq(wBx~?qKusttQ$5EDMODeZ1>WDxFX{Y3xX2 z@{ohMlJs9CC6mAq@R#F>h|@%nCDGMf^U+8YRl7%>pddv_Acmk~it@co+=^I8Efd4% z+7P>^1uo*zbzxU5XlOC9+M%yob8dgtS2J|^cHWA(CCIBW#L_23D6o#i5*8d>Os?_f z;Pm_fhcD69H4`@kAEoVE*#|C>-k(NVl#=7>DKAN{kEQvZ{S2yA@eS;`H4*HWxVcpi=W_1~snba?E{duH=58}1$1JnDwq&96jzl()?7%kT zY^;8^P@n6J-9iU}5A?9;Cu^o8+A8g3g{h6|zM(|dU5>v^DKA-b=0N6o5@c}L^DzX< zzX&q@5-A_i7eD1BMG>mZzfl9yD(vK%>bmqcon&J{;C@;(Lt!LN!EesQ;?=160h-}3 zDHPL^1j~vjy6xxOh>qb6)U$IqPEQ|~iNs+OJIgYgc1VHBOloiSe|aPsT&5Fxwj7y( zOt3hhbA5Kbv8qyL-@P!f>oyBBATXt?8uod{u+Z|r#oKNs)!)L$91)pMxgg*FGsup* zh9nV9r6-w2vUvi4Z+nSfUH|+-?xeO?x4I}b>uee0^(2_HF!YWtCfoBt=0B-g9&ooVrC*W73B1Tbbn zd{B3mPjC6%AlEGVo-!Z~Yz>IBRw%lDh4%irHt2xgMRkC1doz9V=pJ%*=P+YpRTN#Q zUUedQ0hvYN(?w9io31fts)37yrIAf7M{yA$r*FnjxWC*cZhjygLTL3;v_qwW&poT! zI?^ZZy(d}tob6STABA=8+?4Mh5Ah&Aq-MtOTj5!(qJ5EfUXUyjnT;z*ul+CS_DqD# zacFxUyjINYfTW4vjC*UJp&!&$y}vxP+P;2)^!opsTss3W(seyqxRKSh9V<-Df78*z)78N(ZTd~g3zXGPsvPM_aJ z4O{f56_(QGvpG68TXG1~E1t`0{(yPcO1KY9mjl|jn!wncoAr_8n3+Rq;kQjANmk~wON96Xz+;uvuf;aQ zRCvi;2V$A7)>o|U!BCnj|0>_D(hh=Fb_NSzOJ-HkJN;VRXou1XA-<8oePQ5!*MM0@ z&+I;PXDoV01@u|QtwA*PDo%X^WBdJh_kdC2U6e z&dC#o9M3-2VYx3in7*$mY9h&5OT;N7{ z{af)mg8?(XuqzT5m5tP!eO*bq>^!onPJ9wz^qi2aRZemsi@bdYE%=OVNjMDsm@`*; z^~sh9<@LMZQ}JtLHIUuQu2&?0G}54mC3ePA?$uTD4K_3wK@gz4UQT}?8Jn5GFftSa zOCjgIIptTR%c#)a0K)0dJyMa6xx>`;b#&LKXYS_3YgF@vT^tN9C@HktU1BnMEPrX) z(uRCpNkTQq=J=M{Ll2%&=?%bv7B5Nq&5KuCT51Z;MB8O#yRv^#Qj&fD>v}R?Avp08 zaEVEpp#`!IEJ^x(%bI&Xv^HZ);;q0*;7a@FV0fhO#uvpLt1QTe`}aJekYaC{a5JjJ zZ!H?}*7#iG0O#kP#H-KVf+A7tSsl%)9}+0=O-gixF7+iKpk@FV)dr7|-P4D@oj& zZj(U?WOgZugFW8jfEah}4Nngjr!nB8`8F$@w=I=(1`1h51XF{2}1h>ria z)3~|}P{$;F=k|*Rtdbt8Br)~tTY|}PX#&32ImQ#}HZy#Wmv=e*1rV8gi=gEgmaGAW zFKp7YZ(G^7WRWW({A|D`t%-rna6Oj!oIF~|v|4F34l8TatytgGs(JkK#a^d6?F=oD zfm9uuW5B!SSChKMT6=yGl0X}|xKql^{6bUddC`X;zz5~RtnBNK6d1fl_Tbdb)R;jz zCephH1l`Q$9!Pz0Zic3P<@cU`9DCRcVHc%bQn!3dk8=p&I^O6nDZg;b13Xp?U6!CL;Mk{-q$Dp=b-#MQ&13qDVoFai1hY(Qg$hZlQau%I4HnlT z7U!|L7n1a4krLiM=YW@_4+Q%%p+6nB6_6L+PhIELz6Zh?M?HiV5Z4+pi|L0-4ybIO z{K-t8)1`>4n=^K7?F4Q*it+UXiazUq??WH50j6Z?{9#=QBU?{mU?w&>z*|cO8vUQS zEbS#`BLy$62CU6(`xmm$sLvD!Vq2!(B^Md6M3Y}x3#y3*bWR8f2vNjIMb~v!E^_D4 zwx1xng?1CdZHd>8O{?F$uqG`hWjsVXKY!+}l|xIzh;>Nu(co-+PH3jp#&36f@b~Gj z=;T1@(=PO?y%lPW==!e!!1(<~1$;3vzLlOG=Q1#GEnUd{KJZ>hbCV@5ruFe~Yv-UA zaWeh&a;}lx^CWLqhwaZLB*@+Nts<`8wk3?mPuo{dS~TXC&RrV%674Xlw9YTI#20LL zV#%fKT;;$8l#@ChiJ`Aa*Pl5)!$u(RwlgTZ1b^=ko2k!)QB$(`F9&x*E^OL5&uIO% z`uB_5@0ILPG2)O9#jb~q(H{u$_hivI3O0CqqnsrFqtEu#Crob~1jR0(akmKEkp~lk z&GHGW#p-jDj!S5*xkCDmeIRsSuKR+Nw)0+Y70EFP8xio45a{!~8CRq{>^1p?aQoD1 z`Gz=xazhMVcvYhoul6R3^y3L)P%XIn!(~)V8D#ff>LR|7l&^f^D~k?R7+>c0{1GW| zE{ZDdnylp|J)(ZvdWp)i!WaDuq>GiL~{}iV}6?C+T5?kD*aXMtmWaQuQ{d z7-`6^RF-Rl$AVzP3a)-^dB~Bp{EFTCU->XQSEoH(ar%Y+9o~(nU*Vwn%y)J<SWm`j6Ny~f}iQRb(RSz3`g9-J_ z14*V%l_WJSN7SejSeA85Wz6|85ZU5rF*8igA4_33>>qOy%L-e%E!%keSPDo6F*k8V zKX9(~&(@7L{X^4}^a;&d2;6LHStap_yG216AO9!nnY=5xg7MPzoNOgk78E36l@g{8snWUMl1}RA`TFOy zY82=93i_)nNEQ#y0<}z?Q1T+GTjhUo?mg~--JfcKf6bW(@P>9sZwNHZhBW5zlEgk_ zA|^(;)fzX>U`xK*8u9oKM2i!pRdjML5N=!zQq1l^XTj4xKYQinRX6;c<2oOB zCTsL~0tg5Hx_;^7{k4kA297ZX^OtlC+HXviWFT;?c&A{SV^?sQwIkZcCqL=1y$)-K zpV+)B*hKRB;CWzKf5u^;-u7TMF>PttWKslR6}V`BYf@Ep1VGQQ7|xIT7`EHJwT!Qu zu`H-_H6q|{gRQuaZGJxa*vsCi6E6qyAABw~g0Z zWTVl>56anL1-{ZA&{}0`9y3_4}>4f0k4* zB;rdy(D$Riynn(Qy9EVCt{XZ#goM7$w`vFez;a$Z2`*s0fz+OUiA@ue?(y@%4b%_x zKe^UhS2&_9(tb38IQia?!tLoOhjXt)Klr8)+s!lc%l4eMb9X-i*TZ%#!W-Qn zNOn7%(SXUH6pnyJLBD~~HmStdIExn|bXul@W zP*5G3AZ(5|VqV{iHpj71QqexiRGE%QEd5Z{+KD1aPNRgfuuTjD*zVKM7ja_7G5?C{ z%67vkX0UvK#_A1p_(wlAD0toY;^)Hn=v3N3yq*n_&T++~b0vk|wLX2XKi*ZJXc8TD zwk@24tT^)eI%K?95n{`YCBaQ#z}wB=^C5D*T?a;4yl(w3UhOwfNRO8TarN&=dI^7T zYUZ3a?PG1-okw-pPo}vi)sRMVskeq#Pyd@cV}1Xs>osA(!^Xo{jA9iP|4}Z54ltS+ z`pH^Kb-lnF&PjNj8$(KbzU+5%ds8;z(#c20e#^n5Ey~LRnXEwm-7d=Fji{BZrzH9; z*XJK9n#&WxFga|e71~hwP%)5#bFth z&()->A2Xt`Rm=_a^idvZ=#{9?{R;O9xCdi}f1WNuftp$gf37$^0e`kN&8XtqHv)>w z@#1nwR!@-(TvtLDXXjSysx47k3a7{wKPLki9e+Dkm5KHy5o0j|%W8ji*ZYMy-Y&k} zW=|7Z_zLJ1uukf}8~dB62-k`dzx$B!Zok5p205+mk603NE>d227-B=b5IYjOar)Fi zFM|WIOT`0i<2PuRC-D6^DY-<7QRmJX|Kqd}S=`>GPSZ;REMmPAYHu=kSO5SgG%0zS z$6U$mU$feGeuS{7DTUl&dE4(QefMj1Ixp1TYl;pORVm@Bk}Wx!TCnH3I%qf#e@6Ma z!^faShI*M;8$f8uX~sv2!Zho3M%MEe%EDdYZ+1X2aYCVtQ9~I6Q7<$hE?Pl12Nb&9 z)avUhl&x+MMEQjPI46`Z_3|d5&&b0Ll_o;wMShJR;@d6>m`qUHl8JXp3HFxu#1ezI zI#IVJ{jULWfQAO_iZRMDXVL#BuC78v(P7@5-|RYQO|_krZ*|clVY&gq^Ot80gbh(j z^1{TBHO2C(U&EDp#Ky>SQmqZStl<-DLV*PaGXR0Y!~BM)Y*Bs&DEZFc^%do+coWWR zfN(x;f^q;hs5PU8rD0$!l=PUHk)gVjMR|`@#Liu%d2z0sq>(`%RSK;-q-x+7rf;** zGmck!t{Gj_Uu_y7Eh0=jO;&$yEmaQaX`^!~n{tM$n^8C74CYIo#A9TTOnAuxQh*p` zugS7bkDZXKPh5W)u{<$+2(yA0SP19VQeAd8r76a?@aH-#w0)QHGaE>iY6A2=fgRij z1Dn^k5<7kw3QOY{`iJ7CXlE`&)@7mtaDVn1Vsv8rQ}y09C?CNdX&Z-*xKVqQl0JT= zSK205_5Y|Moj2wM66&Nl6gi-m) z!}z>rhIDkfSe3>lnm|FTc#U=C%T0vZh`eT8xN(7Hd>1FRF&~KTJaPl}AXZ8pZa5#O zVW?L@vI0AEpO{`^;tK~R`{DHLu z20<_7V9om#E*Fq~I*`jaBLU&2@<`WmL_xbn!Slv^J}f)5oW$tgNOz4qck|K|ufzD> zxeRow*4JMbc%*P~Tu`jhT}S50wVXdHeJp9D_m9zDK?M_uPo~~vzyTP26qCv22a&=U z&8W>rC9XK2kX+DUg^wrfu^n;;XHin*r$kSPE%>2{(Xpwhuc~h_*TzprQ;KX+#>?GO z^;H%014s^W4j|!8_8x9BOw4Ye;tgh1lPefnx+Qsk@-Wpz=zay9^nF9a0-sVfq_YS` zv1G@S!r+%B4CgZkS<@JVCPIngw-T;wHdR1RgEVcf-?#z6gckld>RwrJkke<4Zi^iZ z5_z1+uxCo1bJD3VvuP_=42azK7Gqe0*GjSMM9V=dxk zoUX_NtXl(-*m}m~@$~$8LES-}iMn5YTEuDt!axMeds0xN4XP*yF9i$bgpPC?wEGjI zz9dUNJ2*z@SfX?Q~9-p?o6DIFihj4d>4bRB_}5+%hAcGtTj{R6*K%_H-K%gQ2y3EZp1~ocNnf6(ogqMHj|)h@0j>{!>EgoYFweu1U=_pp zm$HU#hy4m>23d2Hw(DJlO-5!QQ!jh&Vo#fC_PKh}c_~-}xI~`VD22Q4RqU4=H7e)m z599$E*kiUVkhPS{a(ZxRPDxT75p$LPc;@(#pn>2sju zm961}@<``Bjt4WiCtlP!bEg06W>Y?24Y{EomVEC6DVPJ9S%zpI{KRjnn?P-c;_aKW zUD&)7UR6v3qAQKCMHGoNj|#k<0DI?KvM7lMaMSg0##^5x)26p_@91{=ZC7;?UO|`v zDl2^M@f(}QUPa;?kv5wBn`eK3lG#VvDllakq>w#+=VMq~F_am2Q%0JxF9bUbxlguL z3{WM{QmvFF-Zb*-P0$U?Q?r_)3}`%F&;4lSAMle<2Oi&^x|yh^+__y~Xo|9%sCgr$ zo9AAu5U8qj*s&M&o4bl_xPN3MXN=KTUTeNVzsdzI z7S;tXklS|#?5hPJOF}4E9wBysGm7us1ZB<%HGw0K4V!sLL{aH^SyVDbhFTBBYSP1K zKhi-;u2!cfk=9QC;tNIH{uCjhKQ^f`sQ@=e0~dy%--K5?BDmm4gOgJps-Onj%PunL zHmvLM!~uDiV2Q?IMs8BpGf_OZZiAVa!4_r!rH&{*E}-zJQOBytQ3Iv>&~8&w!jHLm3mlei_aR1VMw;Vb7^(F?1~r(FlC z(;V<)`4A8IvW%{XIAx*8{~P5x7op_$3phl=zxAp%zehQdOB+3vNb zk|_t?qXXEp4}Hn{JWzTon!KF3pO0Kv&@blRD~^J9Xt%B4vYT`heTdH-AMU`HFX)QY zESQuNQrjp9{|d{kZ#-H@Y?&qSXtl4xx?ew$kUUTdeLTkEUpxsJhYkH|QM7#TQo0&;D{3N zUl~FVxN1-^oLF7>`K+AerHk=K(MU}nPv>UxLV;yo7%Xi{QJ9BfnWZ-c)RNUc|Eh9D zRSs}pe+v@Ma}gGtddaF#5Bma9&`dHkB_FxtkM0UmlT#biVZ%bV;|#|GEi9a7c^Jty z`U4PtC^aZ3n%B3qc4muP(`nQoC#FcosL}vLLGCg98rd&C<>|=ij=12|8-#ix`9>&Q ziu>C6HzJIZ1{h&0Nvn86VdTH`GI}j4B=-;R!^gB^7W3?_S`eLXlY8D|KiAl7%GfD5 z>ad(OW>y;nk4nN@e$!)!;v11R80uMlF!kM}ZR8+H76KwkP^nmLtzFi87X_uC=5Tmt z0$-EUHOR(Z>8EUmw-@Jci2nG!dLF9sJ+i8=#88h$mOe_8AKD1gfA{r$#+KU9IR`38 z#667@^8KB~L0SB3krtW9RR|yhjXfRw#Off@ zwcS^XFVn2sdgjMKetH!E?~w8D&O=9NrdV>RP;;GA2JNQn7nSiie*&ZPp32LSX@$%f z$&7q2KIq1ZyPy}1^4&aUNYonb&HQp&b=V4cRiCWU*pGfRg&LzP9f(RYXlMM(_JWWq zLi|~Wyc5!aD5xWq6&t#9Gl(0yNq@U=R>fpFUZX`h@mZLQTBN4Me0$<`hd86Q!|M&x zzX;<>kb>L8}iBzynnV zs0#2?PQwRlA=DAHiRbwN=K0y5c)!_Sd=IU(3sU!qTs%+Sw2O`PTSo2Nipr*JjrQ%4 z+q zEX)NK?ZZj2dLOq!tml7qbh-VJ6T^)kO1eUlzpKHl@Dn{EpTvO;nFIqc+91th+pnpn z(SFULSaa{3sDbD(;K;)32ZvaPrtlUz*iY8H>Ja!n<~v~g9G5<@j!X=GZ4;0$4QtP0 zYI_Vf|CnWZwVK8d;@UeHj#y_+14edQcd#3a3Y4FXEi5)M;1~r@$wW?T<71&eFt|ZI z>(~8w)4H=&=FU2bkpW6o7a}(x4`at6vffR?9WBU$QHHrN-MBPop| z2Es5yV4paCR;PQosPKJLP00(KTIhIvUnbo1uOJT;GR%-mwYTELJa}C5(gv*EaZeuo z_@>S7>&g!muI-+*~cY>*=O&tBY2BxLSpG= z4cKaQ17@rF+LLfHQ>@@j4y>hi`sn1_X^%a-uEI2jl*vGp&-ip%KQa$NQ3a7Xi7#nJ zs@Iu!9R9vm{$s#sgLDge6YRF${m3DlH(Y6j(G3_KJt$cE%WxvpM+R@i*?+s(2J^@1 zWiHw>v+BCOV1MOl37)^A<2xq*W=a#;GG%l%?_hm)vfu5SqCOLfa2e;is?5g2C;PhY zBUr}_3JN(50dUkO%3%J#{AUuZK&w0tl)#86utQBV$ukNQ=Pas-ndleJL(TKm_l|TC z+9aIT$YM#=VrKHG@KYsQwC1NF<{00itRIXJaQ3OE>|&v(+EzSb9>Lts3U}dzz96vR zs7+lTeXF($b9B)x?Hu)YNp*_2qT|l;iOco+ZNpW+eA4+ceEUOA7DKmh$nofW9PbF4 z>ktN#_2|K!waFj99XM?2)l^`g`jJq)kdSVn9ZIC}vAq;D!B>qFIki|cQ8IpTB}Hxh zt3XlQkniMkR=8B;;)&O0N0o_5@{9CVQ1b6y`x2NGrnG7@_Bl?+@W4RlMPwFEs2{x_ z6BaAP?($Ar7_ol+^H5s8>G}Jgj-Pq*DBk_PV;bAOwJ{ZSFmx%)01k@VRq$0~ z^p959sUmJ;rZDqVK7zEG7GbPm^~8ZRo0K-TKPMr^ zd{A}Z3Wj4~U3C68Wy;(&=-?Lj0zI1nzxmm(O5RG;qB>1-#Zl-Vb$_Kot@-v=!U@h# zX8fPE$?%hg;ycDmUPTSmvsnEWX5~Q4KmPl(=0MQ0S)=eo@5lU`UDq)DHOd%Vll;JZ z)zA?f3SfVVUijO!KR#FWsPP^TG`~Rknq-026LhF#Md5)^;DZ~5th?>3^PHT}Yu#M` zNMj_&y7K>b6E(`nL%9Ww16Up1jNs~Jixr;VFS!Rp$Q7R-Bj!gP!77xi$yUV01wk{st3kNEKS#m~ft8SPN$ch)9#`Z_=j3FuCG`u8Imc z#KY4bqVrc~mhkIAY+)@kMA9xY$hlP_A09;?OVyef4SEc4Id&&(**0u%)SI&(OloS@ z@T`{OvcH%Um`JXq1EPra9tJVI+5)NpW7biRB-6M4RrBVYo>RF9dp*5fv2-4Rqj|Lk zTYmIGC>VO-%{U!69Bck`hlJM;TdGxrO<&YiH@J2^{h!D$ zY@i7ODsmAM9MO*l0=*&Mz-AlGZ!2?3INe>XTW>i^bM!fbpcSu&{}D0>pF8*}eAcdV z1epezs~G4uI5B^CQuFQKsl}HuuKdo^Ne07$sqOzEy%2HaNwxo<*Esa;2Uf+$EZ48^ z3*pjOl*+II@T#=4+&{MC$VU1DEQlp0ml^>Iz z#2t43D9_|Dm{^M3zBcsR#A<)QU!&c;$>Hm~r4KpB`~wgj|M#Tx8%2H5A2TOHj`s^sQ;nbP z{G9Jb4{fN`{^-w!p@M2@Uy@Yx`dIrC zYU8JaNSdjY6{Ht|%SBSKjRo8e?YE&yrM;prAi+&Vae4zPo9CuawSe2mwBNLAK&}Y zDSdpZRgO}!O?p<$m{Jqf%{+>bxK)~$aHCBp_F77CY5t7`^Fu+99RY zo*Ava5Xcyik9kegsr*n1e^cq97h+aZ^QpW)$-kwEp{g69emvxCxmEh==933|DvEw72w0auI^4Y0dQxv+To{_d*%`$Z^PYsbUBODH9Xo} zl=%riWR6FUdXKKCkUzRjyjkV-rd`^Bv6&xXR8MWKhU^sA=Y0xzGCO)#B(d8|$g|&a z;a>>JKxH2Prx!ExaTm|oJ-rxXhT=~0R>=eUgl~)U*yLsx2 z=ZXzKPTFQBpiZ||TfKA9e$_+9+&0^HQ&NYY{-@d!JN3LII?a~u)uohk`9f|&d_8~r zENR`A>@W96nrr0p+ZUUcA~fADT2;`7BAR_TU^Tl>{C+(%_dabMCqE(w+&Uh9H+-Sp zR7t~2haXC>|KqZQ`6qoBjl>JCvsg1+6o zC)upS;*Oq(eY(1XS+Q*5tFn|5j!0IKzN@ePaz2=!r^;jKmMdi)t%V?Od{2eFj&O9! zy>s)qf8%g@_k7w%#V4gKa-A%`8|B?GUk|;K!#Qcc8*W+BvLs#(ka*l`H!5Gv8~I0b z|GpNF@#)KRL!a~u==z_3)4oNU%^kRCt0yI>671gc&1?d~JP!-~9sRto>lC$XdST{M z-+Px6=g(XskRztt(Tnbk4BtP?sWyGCP(f~I`wD%Ez<2~a`dd`}DL3RO-@Q|ZF3!qN zu~vCCZ=BoEWA{0Y3@cIs{1|3dDr_g^v-iZ|DU}&trK0GnVd*7?jl1mMN22MqfyH2Y zGLq5#toZ77RbKPst!xaVH)EjtCo>DJb?-gNpmMFWYMJv~E*6@nyj}}AwdlKKn-_b9&#S{qp zf7*XMJ!E5X9Ct0|yZ>Fy;^x$=Ty@kId1I`)O8DY|M;5ri8n4&Cb8AnzTEkX+tmQ?Y zkn=hf9it0PnL4-KyhK#%9)5j&-8|UP0logpFZl7tE}@yUYF{(Q9pZocX5x;`U5%m< z?ojDR>#CMmq^rt;&B`~|Hm%{|VgIbvlE(&tJlX{b0k0oQh*eDtXk0!hY5g!!`Th2; z(kIUv?}@5k71eEFO~u8v_Fh)z<{Ec}#+^(D1I1sg4dCw#jVZ337TnqYMe3UR`;9hN z(1mo*qWi|f;mMQpA}z`v5@4#-{H(~R3Q}hTXUiN0l`WtC%2Xh(3r*ic9Iy3Kr`TIHhb0p^p5G8$Dsz%Y zuzyJ9R?ywNmZeS6>)3PErqc}L>Oy@ukK09+-N#@vFRia~P6l1HKK^8V?|WD-bPr3e zdOQo8it<>Jc98A4@cY^kSm|0^4ao{!k>_|cHkYP5^2f6UgtEuned zluP-QenW#z)7Zj9Y(C|2;Ws33z`3f=h;GR{^ZC2SLkG8J8d;`#pJ)8@3l0C?Dw=$e zGBqUe3u3@}-RlQ6P$S|tUZ3aMLX|#rMt|+xG+If*dbDvVw9Zoajo>yP3kr94wbV2Z&Hpo57HybZ_h#!G^$K9~9E+&aRf*ysP~&*)=R zQp3!F^mfDsk61!Q;8hr~z|SG!+jLtn{Lh6;XKdY}HhjNk>z=ZceJyN zfTKVkY&&Pym`uc7Q5IqL`2Z8jUsr+uQuLqlyt*j?h##j2=$vGChdaKPp=H);w{@4; zwGTl2>X2kgJxAv}VjxweG1_g4nYv$C(S9Nz@p-w=>Q(*klb3#z{w@sS@WorJIShcv z@3UUW86WyUjv=ylGA63wWuNTQ4>P9VeHS@)o_r6tP%*1KS=FEZtv_^^v&zzhwEG6J zl-cX#TCI?etopy?eUkv;MKtC9Wy;B1M3=c{Or5sH#)8D4n*V}kG)L5xGTELJwl1># zdh8ZQd!NBz3Nw#DPu|389+nazbb2<&va_~Kf(0ZsK7?WtD0?PnD<(){&pRE}JFm~8 z8M<@*dn?_7*|Oz%8Wjy`QaR{MPG51mYW>h{;M^~oUan15(F&RUa_y#9#>43`AM&4} z?{mjpAK{C?=fTmLPRc@w;~6bF5Oc8azHNU8o5{0cAGpHxgU(eRXgWqqPki-W$}yj}qHU#rXRaW6#U-vV}|If)8ArG=C;PTj9;nbtD+zlQNw zKI*fkucWX6F_byv`WX6H?Mz#UU!`^G3RmFL^Y}cXRqf;*jX%Q?S4~nyFcLc2;ji8( zJDVGCX+B*jil=%LC(-GWZk8bIOC6F0a^gpU+f%y)C128K&Fm781Yr8VG))1xNM{pKw@E}nRCt`NmuYMiRUE+o^LCCmdvv=?xdI`IiXSi$5L1d2g-}lA zveH6m`%Tn>X+O`_2FDJBEc}C~F%{Kga3i7NGHlqIKN2=w;FiF$f%(b?K5?a%iTw zr*mI+sPOf*L9c@|P6}zjEiivhrXfaqQ2YdH(=?b?4x0=cyBo5wpCt!~$v`R`C|sm)IjHPE zl-VXSW#{v&tqzp;N^3Y@I>h_ zpzsUQB4@2^2Mw!`R2I zlpZKuQr-p^M_@!E>M7~g^_5k5dEEquB(SlG?8kl~UusosTuN|@(nY@w*U!fPY*|*B z_l(v{n867YHL1I?pDRqjEz3-qYGBWEjFhNeFGT|{SLRJ1{e|~Spr}##LiBTQNUdsj zIIUnGMrusE7!Pubj^vDv4+Q>5felT{PSMA2mI5~1>;s@|f-jGV(S;Ty@ef;xFF>*9W(7_7z>JHkUa?dT8$ z(1~uUabsCUw(D4*0^emicdW0M3_L>oObG+BhamChHeA1@}<4tPy)D&rPU{7oEb;}v3Zh>o$<3C?lIAvl19$%gV-&a&R%y$aan z;0$r=x?dI6RP=KcUZ1=_{m1BJ#wDC&IL;Rd$IV+D1CP59urvdP4QE-z(qowvByUz^ zi{JJI?^7U=iRXnao$JpX4NtOM{Aq^gM(Q!iWE~7hbc)@KTU3GpmSgFFus}j&GllQz zEpERBQs6(urU2%v>DZ37;fb3x-wvAoxNgC1f?!g*Lo#C8*0P!6m;H^~ZvhLTb;2la z0=X-t?( zeFybJMQevuz%F;*nWU;8S1%1+5BzM688h2bVrJ)Kxm{sM7#Qp=VAp)3=%pK9A65ao z+}plPhOGCN@J~)Y%?O?umK-tdKcv|%K{p~3C~|&@00000NkvXXu0mjfr~~3c diff --git a/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-48.png b/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-48.png deleted file mode 100644 index 6389ede5a62dbe77e287f93b9bff4c7235732ccc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2418 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 diff --git a/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.scale-125.png b/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.scale-125.png deleted file mode 100644 index 50faa932851c251727b33cce223e75c4ede7e993..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1893 zcmV-r2b%baP)pM7fD1xRCt{2+G&gvRU82D|C^c4wLRG73`_W`xX2mV1%iYuU}8v! zQNyu|8xA8z@!;}{ep5dwAVfp~(Jh4qH3UOoVY|y=K=~vJ8@~8qqsXzc?Y7-^rnBuE z-da$x~=s6~(oj9~jRP7$7$E}D^L&`VL;{QW)Q^u838PUF9L*So*<^020i!SG$Qlil%$VX=cM#at zQray$ZiP2Aj&lhe9Dyk*805)XDq{rZsh75t+ICrS6lSj>rC7y1Nit!SV$Pt@Buw#Z zJFS4xC>yT%a%ij|iC)_y!lXpTb{?*mHe1z)vf!G}X2Rf~U^OITK6RIsFdCNQ4A@u$ zHZ7I0?BQjMH&ezGpSH_gFTHJbUo6F~y%Ze7+QkkEi{ybBVIE^X?Gtx{U^$G2Ww-=P zq8Xd6_@g*)C7NJrzqXse-m*2T8?I?9eWr|>5G2a+8|a0Mx!WPb4P%}=op)oZ@M=kb5^9V*GuYc zfl)AS{gwV|EJ$fs&N8H7f<^kGd)*a=(I^P_0)gpb6&+)9LbZHM>5W%oCO&k0vQC3^@<(88Y$O;5&c>`EFZDdK3<|)pNc+$} zNthkzF>Qj)LOr>zC8zs{FS^fN{~&DjmB>7sWIK&m)~OH10kPcB*XWsr!163GHXt*s zy8hS#>6=1e1>tlJzZ<$8n<~|avlM@h6V4Q@It_a@`#YL1N9M8;e}=-efuW@Xba)_Z z49_$4ASyoPrQ-`^ccHL?aP9^2AEca?A`m;oQQ}NBwcAf$rXsM>bXJUho)dO4Fqf5W z?G!c`&H+P12Z_QMo&hbOv=j>~2uI`SB4;021{UjpykfODGo3*?#t1Cj7yaUJgSavK z|1D}KFsIzku$)s1n@)k!2POw>Kxt`PP}rrsl5jK*FLC)u2AAl%bgi;-pM z9<&hH2ifn>IvuEIBnq>+;*kjE7=XW2O2JS|kaW=DeGM;ENDS>os}>emS1L=b}BH3vGZpMY*Y%C z9$qNXU~e>0mXn+|29dQaN?>jCr9)Qt#ZugCul5vT;SwNDpfEkxHYN$YA7g>TY;2Mi zZy~TFR`w$mmg3?V`^n1N!wT@2uH^ZUv7sg~j)iMyucC8Tetg`@KA6K&+_k0RZ*?a_ zPYX!z#TH%SG8VP)A*4XHpmIk6@ZD z1J-c?e81eFFu)j-B|*nX4Khe{Z01%U)MH21mvr;P9A&$lPJvTS4K#{6@^Uru)OdIh z_qKOI|IgQfbJ`)slC_RO^wufi5v3X;dpPG70tBmoWxWw{bD8}f0WRiIywiXAM&12i zyD^M*5*Rb|A!D7O>jgGS6j5N)0X^o~Q1pGdRFwS|76pn;?!_2uov3!=6S^8ooDpQ5 z!Q&(lQJ~=3%B(s7_-JXsirjouJ!|g5b2}P&8{3HlM-n(RjpFpbQY9LsCAt+>?$>eK z%iD`>w{rKyPi(%+H0^7QVbsM4jwxh};mrG5rqggDBnN<$sB0Uu@*n}Of2WuxD|*9U z^=!N=uH4fYBg+JmMomF6HSvb&EFt+c5pfNWeav=PdB6@)$0j(j0%w2c!=mCp)ll0u z-65TAZn(zZAP6@&W(eQR00000NkvXXu0mjf=R=Dz diff --git a/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.scale-150.png b/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.scale-150.png deleted file mode 100644 index f0293ed8147c619a36415f1b742076b02a69378e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2515 zcmV;^2`u)BP)pOg-Jv~RCt{2nrmU_UP-%mC5$9@Qp!x5OgbH=-%2PY!3ooW zFM+00+R1~bjf4ph2(R!6A-o}lG-*Nzgpgo7*w}`~ebb3yQW(a>*knkc;ZtW4Cet)P zQcHeG`;vBh?(RyK<+ZS_UCWu#e_$kbwYz73{O`HvKHR7%UG72$Fj`auVX6qiR1t)! zA_!AO5T=SCOpQ7ai>^rf+{8UYj>(qiHS<%=IEERFT)f+-^ho>bANHOc&T~f=lP=oL`AFc3cS#IF(M;PRaL~$qgEJ9(Nh>>a1Rn9(xH4I zP!$|RMVs)lx0GxUqY8yUoq%&OKq)6s2<_5abq|qMcEnLo5Q|!ceS9g|WI#yj%^{~U zAw;CN0m4eVVksDiaGUTFS4uXE9YcV?m=L1UJ0~9`&)6AHK|q9Bg*~K{Y|$Yk2M>XK zhecvUItCDy*&Wk}g9x=syWoYkQV6OA1T8y1q?|w@bSPD|50a;yh-*YagxjPY&_!+^ zsuOewQKh9w)DP*ye@r?+GP@DK7 z339uo&P2)yI9Cs8IDr8taI|-*h2{`)I!4Dqgj&TH_#n5JLQs>5oXtVc4;c`|s8k0K zDx8jy%25#EHt~59;C?H0CHo}C0o`CiAchkf0K!5ip3B+`~eca^Id;c17}*LU+$yi({GQk39_j=|?KOdB4MC%S z3_IMu85B|nJfuQx^IfB*c5tagkBeL#X>7toKVPiLZ6k+*R& z(>0VUQyLbC^2@>!&QFdig6;&B85{&mA;6%kDSnfkUGo%^u)KGhSoOsX_2>8Tig{&! zWws-|4s$)ih}Tu(k)@4rsD3!_G-MEq+Qe0ypF60;3@0#jjxmSyiZRt3y5w`Wzy4zO z*{3EbR=+L3BG!^pZlTf*6Jg8Kl z89&yW13-{FfnF0WKF}y&e?1Ep2O< zO7;%@RD=_e)mythgdp z1B42pU5B6!5(0+ejSkLsoGQx?0@bi`L~WVxX!(aROoHCG6mUrYWN8#jMsrXu#1zkC zf1JTsLZCSTAcTZ=IpqZ0=Qi12O(*COqVg_)uzNV~kgZ|&8nqAmjx216VLsqJM3?9? zVbJCPZ5>Hn^2Nx1*~iYzW<;xd0EBlTfi8|y2#^8?azgJhD9CAZ00?44-gByq+d16$ zvz1pJak9*JxV%MRxBxAvG`*mr@$;pGLTFA#BEL8@d%R$E?ZmV3qjxxN$+(CN-cgZ? z28Ljy8xumngQN&ejNJBoV$W9Im1S)ie`vvF5u5=fHe`D;){Ug@#HDx-JFD^0@o}qb zCZ7|JxC7kMJGVt7c{Fsd59=7r{Mtv^5QM0>@6=R&Yrb)3%a*Z5-BfaLVT*`MzR$fL z|5|QyiCwcAr{5E^`t781;$eWWT15p%X| z8-1QEBL^z3NZ$ytjt}0OKCZ{=H$OcWKjaB;D=382Vy_$icF6RVRdk;h>ytR?g2`O$ zWrI3|R~n}Bo9&7>Tei+e)J);(20AzSZ2X`*z^{}60@5M$<^&hKf7FC=uQ%lkeVr3? zLAuy0{{B=Mzsb&6vo#{q`IDOB2V6mZl?lOE@kV{qfg3X!Fc`=Q796f zgbqO)#Nf;YFuFY)y4w2LXa5TSXha}TISS(b&N1h2qS$s%z_&Zu4I}Pc>z%Z!gzVtr z32Oi3Q}pHKs}tDyRn>BRW!T9WQ*solT0e7lElhndRF#u_=ZSwz9I%WMWxOWIuYjmVRnACD%Xd<{o4YluFdpqpLkYa+OF`ljgu z!h}UC=SE4WA2i&XL()5FL>_pAyIE8%a{en)kNLm6?Vo{uw8W@PjkJ%K5-N?(sgLj6o&p3iR%B%Y~!6Y1DwA0vK!D^Qt7o^3zqh|5RuH z6k;4;6oJ8R{t>l9q?=3zoD<2VQ3Zl3(NH<$2^c%}6O1|#g;EiOsUiqdMG&TnAWRiO dm@0xW^?%+OX$U3ZWQ+g+002ovPDHLkV1kmSq`UwC diff --git a/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.scale-200.png b/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.scale-200.png deleted file mode 100644 index e54a56dbca06bcfffc2561ac551ea5dfd58afaa0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3239 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 OV6ZT;GOjgp$NU#Bj5MgPpB!c$GVm! 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 RfhYg~002ovPDHLkV1isQMO6R* diff --git a/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.targetsize-256.png b/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.targetsize-256.png deleted file mode 100644 index 50efc008dce6f8096c4c0394438f00c8e7154cfe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10408 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 bno1(wj@u8DCVuFR|31B*4ek@pZJqxCDDe1x diff --git a/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/StoreLogo.scale-100.png b/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/StoreLogo.scale-100.png deleted file mode 100644 index fcefe81ba952544e550afe6ed2b97837fb2ce465..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2370 zcmV-I3BC4-P)pN^hrcPRCt`lntNvcTGBGCgvq_KsLOtMPJo~ z_b`Kzi8tGnap`#L!`6#N_n8YEXIgW8B)vvT*?J|25Njjxpc74-@`^A*#DUP*m(qFJ z&R{$Z=C0->?wq6{Tks5~oZ-z+^qQP$%Bi_j(|9_;Dt!1Px-ScM!q-s!j1p?YG zdS#@ks)`sr)YLc7OBiEN4+&oB)N~NkW*nr-BfM-aB|Ai)LLsOUI2{9uDM2BIrMFrh zB3m-?Gov8u28CmMDcKc)2Xjo1QUhuN$*^I zkUW!(zZn5>4GKp{DcPe#gfoXA-(ivHmCgaghHQNn9KIjN+y@W`#ZetXoen}DC!m8- z2&jn*&5KBNKK=^=;_`?u5+`?98V$vi!09?{Lu6CsS%&_E5^od9A)?tm7%BCm*3SXLnJLAj2zTV9jL zsS=7hA%bQMq0yfRgy@t1)bum<$@I$QZW)8P2E?tL!*W6%4@J|7E_u=`5lbh4_{$Ie z#y)`-%?t#!j6l})3(s;6?hQE*gP5i}=~6_x6O8hI_1|V6KYEl&JGA6$(}KWMd=s&g zH354FAU_GICr}sIA{dM0G#t`CwrkQ$rvk9{o{kWon z@m)vOj)jch=o5w@YX^i{&Q8uMg06(hWCnpL1WXz`gSXk`O;0f)!)JTMhA(cZKfjMx zqIV`+Vjk+_sOb?#yr~k4EbWB1S~CJ!=MlGXcJ8DSh$z9(HFi1#Eukj-a`({JUo7u> zYMx>UaZPL{rCg;vj*y9PlR*-QCOI@A#FZcv9FkvZE4La#7=pk9aYm(}MLw*j6F|tL z@(0?juYT3#o@co8R^<^da89mL_@AWTtR*_p41T2!OeVxyEhsP~?Q1I|N7KcV1ajda z^2XZ!fJhwHw`p#GDv`B?HYE*olE`2ujmkaR82ig6_x+L~#5J)IAgY969YW0z0>j`- zCzl7>%hN*`f>3KNx1C-4VE_}S^(_SyN-p-uU>8Xzr8l5h9{b}G#t?$m1VFfiVL7G* zp7a=F2&6;! z-h~EG9i$LY!l{&)cn>BtG@SrK^vXxt%ejM@K%@nscCp-cdTqbJa1J^kYWjdk{qv=S zLiB~b-d|i^K36chcYas!>|Ktlo#T~3I~A!YHH4N3;jkddOADLZpDDz&Ak>=6`BQ5K zL{J8%D9~+4i5W>_p{v1hc3H=xbAv|rEbJD~m>t~uyF((9EE>AkhII@r0|>z<9&0b- z_hti;5eT)GGIFxAU&O`V=UxwfEqhF&e_2PxJprT7F6b6d1H?vUM1;<%A|EXcc#Xp( zEM4LdI07Mh#g_qMPqq*lgHXFzPEJ%^lfDrGBOkn1F=yQ9Ge7MPp0YT&O%x)wS#5@Y zBQgzHMfX{;z6gsCc+t&j)~Q3h(pJXr&IKYX5Nb_}xRzAc7IpxfTUx18+h)ZOoafp$+KB{LXR4;PV2tVsDyQ8r~#14 z$|E17)17}_0SF7ycO;>vRH~dXiZE|?v#T3bxz+vcA1hG1vDCJIewV&fEcO{ zG4k=J=x%o}O(#T`O{x}I$HYf?fI-Aw12qFMHS2TnUGNjD8;|n)e$pv`GGvbi)05GU zZlZ5Gdl4oqQaLjU!}y`$i5iNZV2L`+)23DD)o@$&#%%r0$Qk0zrTmKv`oehp-*tD%3q!Ew}V2hHT4vR;T>C1 zNQxaOCaoGL{|(o}GQvgo)T=AsDMH2SCiLz`!;QaL{k|5!)R|W`NQmVtR5^L6pIkzb oHyA}=u$g~E9TDjvk>Q%?{~y$4P53g0O#lD@07*qoM6N<$f|9~XX#fBK diff --git a/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/StoreLogo.scale-125.png b/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/StoreLogo.scale-125.png deleted file mode 100644 index 4381be777f8c9cb537e8b52ad4fe785008d91772..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3229 zcmV;O3}W+%P)j{00009a7bBm000id z000id0mpBsWB>pRPf0{URCt`#n+b4L5i~WB7%(=9 zBm_c0<1)3a-KL#7txm12(@yQwE;CwiR3IBfQ6Mo1sX=3cOl=h%Te}gEO%%w>Tkrn$ z``!{>-g5Ka%L_^WGfCdPxy$*TbMAM~w>%c6nCjjNt`l71-MU{7Z=*EF#qYOa^ae!% z#mbzb`?V*V7t5{b?!}JV+B~YR-;cqitrP>myM*vQJI%2u&1VY#h|>VPA8Cy`b@~;j z`%M}6_5HybzChe+>o%C09u6N-CXo++M))^HgEWl??@|4k#)aYoW8HH~z}F1~S8*<( z*)|ba`Z@576$78ngL+nbwsFDO;6#%SU$;L{#mjsvvM8`LEdrh{-02hr51rLsz~Bv; zo;IoQb#DeLIho&q5KWsHoXR%hVJ}e;@F8Ox2H%j)*^>re->+7%Znh2CG-Il{gNxGz zlIkrOye?ZCCI!BJAXLUG>`p)oXQ^rq;6x9)@Q_FE3LXA;Rp08_)_CojaQOPZzyi+AcTf!D(gV4qI;KXER$Uv`dp`M; ztL$1m+sKD)6AHhfU%#GJ=uVnp3bZ)ztZJATxL5BD96EJdSM{ZOzU-SY_zeTvTvnpH zXqG9$y{pV3p5PUPp8;u_NFx4*aDrd4rTS7epEgbi{Kh`*8b+eKX^xpjz=4VsBt%Y8 zAJtijf&29Spx;xm<@TAOeA}6K_}YEG*^Has%W&)r&8J0~vwO}7xQM}ZzxkH=iSO37 zikX3Y+ewsH__c3%uaev%0sjmEPwb;OMjgfeM!|jNUy#pV-c&Kemronxl{fgcZ>nFA zT>IuUS8hER{Bxs+nh9R_}aeEEFAG3R$wkk2kz*I7%#w{ywEIS4sGXIXe+OlnB?oY>KQ#Q&Oe#7g*iy3zq z{PGxhqQ(M8b`(5l{?k7+ysWKs#;IKG$wfKAukQ(5#JKq$PG+u9J-LJPg#_IAPsneU zV(=5W*fJhv4Zrqv|Aj0DXJzKfkVlPn&d$+i)T&3pP1QW4tL81OH_6AcwId(O3VvO` z?*d*D_Hr_NmFgMYNy)TzCyg6lfWbBMupS7MHZ3XoC>tB{sf^**^m?cBlDL;w*x8|> z+&U@Yh!=z-e$@1urA;M8gV`FKPh|wZYQR%0i&8hIuyY7FIP}NUDGct$;JSI-@B~X6 zZz=q54)*3%W5TcR9V%o5xtmqkc`@*86$7^n^Q1Lw5%7OG9bbhIo%K!PwH;u_YM=uL zkkqu0PFo&3!q;}3cGCrN7w_h-51q|z%#DC^E)1?)r;L!gY}?K551o#$JD@(yet7;IWdG$KbYM zo;Cv7@@-4pA2^+}en9;ZUnKn8#0kcT{0R6cNHS_iMcyxo19;?~G@0Zq0PvsGA8WZm zP76-t5P9||?u+@wo*92smsoNE& zsN?%l3oP4nrGabs7mQ?OT>CeBySCNy>^ zwLLL#+qQ-czh2&Wv+}l+0c-cG-@>W>WITBCMbmG_gJT7Uv~7AjwGFxXBpYvV59PuV`AT9B{h+x`DuhLZR@K5wJ#qXFAjcG4LWB z@iXcZ82k~Z`z313R~_kB;{s}Z2aOd?OXUHl>((C#-Osqh zKNvv^w+lvk@U-Ljk=88?epde#27h=gmPBP#U)si2MX(Y{ zbu**~%#}?y%6(4Po8RegFeUM6TD9=I-$*}+;RsHHP#jM6-?S`}ewYbIqB1UTw=H&m zTHot0HE8NJp-B8v%mLwuV{inPs`}N+mL=|ePS=^+>ED1{%BDkSOt?%iL0~8_Q#Kyy zt`Gwcufq6U^CIbcnKC3QtB%bJC9YF7Zw5*Q1id%|t|X5DNp*yaRx4oMj=_7J&cCkR zU&koQbGB|mNYi1^pkS5@fWr>3W3VZpM|Q;`J}tZoVom2$HCB`at>fx$bRj-T7^Tg|xSCS=-Sa1?DX z7>YOmumcdxQYhf4b5&bX0uXSr;AqI$+`K5W1xI5k=V7eYlHw!y_j~~7Y2vxz!$`EWRZumea20M3Bu4DDI1xoM%eKHoM@2>i9}{&HFoUcyZ?YpbKdovJtT z2t*uUV+YWn%n%?nq;JRIwG&}y-r?uH>aU;`u^lX&x^WTDbmWIPAb=~~6RZH2c+Hlk z1wu|Mtuj&G;VG6L#_uc-uv`(+vOGE3SrTyVaQq)fVc^xhMR3u#ML6->yw1zVly~^Q zE|dGO-Zk`9&aLz?iagB<1Tz}?LXklLU?d5K4-LZc?$>}7-R1NxbGvl$nR3{4|J0wK zCwjlK_?>HadCDlayqA{cB0HGg0VCr81YDNDcjz!2?e2|qRm~tUV!={Dg?8=EUsu43 z-=F#`Gl<@;EPDIuj^T1nf^O`9f+Po^(Pb+E_YWR{W1T$_aGs0&OC1JEEG*#>+O3y8 zwF0^xn)+*Uh~BR#JTRx-dn=<*o!9~HumgZfDq9J7VDKY2*4_;W*SHJ@Cj*}-*4qnt zfEEi&xeL%PW7Q+KLEB?fe>E1-!4(AqbN6^xfFiw0iLzpc;xZrxe)uRH-_;4ovVayi z2={WR2s}i8NCsdBl(A^m%jS|tE1~bFQ-2*E(K{;(`sVEMt)ykKgO()84n^87nt&fU z1}AoQghz51p2rSAU^AE>cXSZ((a4j6w?kgyfC~1~SudGYRaLNa=hR<;Npx_fd*8L~ zzDi0KcT=J$l7NPe9EXp0>;XguG-Ls6T-I3(4Jcu>IDT*xA{kK0!fkCPeECj*$FrS0 z8qs-Oc>L}Pch5C@{9j{=VK!vocMh~4}ery!>)POGMn#Nm#rO>_B9i`?VGz% z?bCMwtF%!JPlKsPXXcWXZhj!F&@g~lxR$QnY}!o?8?v!sQomqiG(E7BtKD2pvEmNI z@VF0~kO8SqLMVAZX#<49db(z_Ww$iklj;2@{i|h0Q$riOW^)bANi9H=cf65415!K> zBfBDv;N5ifv!>m8&;6O)d(z>F%;ttxwq_Gc3-Y!wi%kl+_)<7Uv>`>?fE@r*!F^D( z*@Tvc2gkbalz=BPTkdUStN+AOqWgK^1c(jgriylCf6^X^IgWPE{JLGU$pu5fd!70M zQwE;MY`yOVwstcBC*N)B!PEz(oFGMTZc#gy9;9%0a5fa$Rd_4yx2XRIU5vAF!ixJr P00000NkvXXu0mjf-k~wu diff --git a/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/StoreLogo.scale-150.png b/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/StoreLogo.scale-150.png deleted file mode 100644 index e49390bf3de46d97dad9ece51fa8ec80e869bd15..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3739 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 diff --git a/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/StoreLogo.scale-400.png b/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/StoreLogo.scale-400.png deleted file mode 100644 index d1472741ec5c969e0da6c2979c4b4b07ab3b0b9d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10759 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

MY- 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 PT>!@CEDWmjsEmID&pRVU diff --git a/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/WideTile.scale-150.png b/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/WideTile.scale-150.png deleted file mode 100644 index d4b275a5731f374ce9ffe8b03dbf157b2a9b473a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5001 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 diff --git a/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/WideTile.scale-200.png b/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/WideTile.scale-200.png deleted file mode 100644 index 6012579815fa4a18c7d12e900b629c6fde5c8d8b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6866 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 UwD|=1lM1Bs$WW{7Puqz91ABlFQUCw| diff --git a/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/WideTile.scale-400.png b/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/WideTile.scale-400.png deleted file mode 100644 index 73d2461cecfef8227108b9a6b3bc0ad6c736d4e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15332 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 diff --git a/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Windows_TemporaryKey.pfx b/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Windows_TemporaryKey.pfx deleted file mode 100644 index 1cad9993d6abdb0e1bc1456b2470dd386f8f3ef2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2560 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 diff --git a/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/resources.pri b/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/resources.pri deleted file mode 100644 index 7de03c9dc31868ee4734e9e92536aad0bfc0573f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5952 zcmcgwO>7%Q6n@^d9XmhGPg7BfAWPILB{YfSI3*MbxmBrph)}^rMQV_>*qg+{PF&lS zEDoGGaDZEHaNxkP2Tq)NLL4}9KnO)WaOjB>NL7VYzBhlnUVGOeO_|mB&Aj)`dpmF5 zycut!)hIVxwLDRRiZ2j3MD&eCG)qsPqDi+K093uoUb(inz5fxjOxXZV$f2O>wJToN zm$PgaNFm>CS9ZOI3%R2QvyGyyoj@R&q)AbBdE}`GA zU*63UU5}AJ7>$=_#^dETCW!9E=znw~etd3)$3W1-rp zNz@c-8k`L3DC#)s3GgOSr_i1OJ&8Jts!M`?qQB6!K=ZI~gWds6f<8hlr$GNiKTQ`B zj2oe<7@9$!Iqww6WZ1C-FOq`Ez?jv`+{4 zuLj!Z0`2pG_UmY~w=B#qi5aD#CxeLG!dO=(_0V6~AEQ7a{$C-lZF~Ntfv+y+c>Q;ZZDELyM?D8-iEB@4=J5 z590C?=Oiwc$Zs4K920~!XCAMqKWm=h80Ip8Sxo{lji^A_io$l{@>`LWq9iaA_Vw+m zw_V=da~ob8SCY~-`q7^)EV#ay8Lf4?@GFnUMZ(!b6 z(OQF)>k{M_@mv!;_Q?jYSKy-!dIS75NLHZ#xODNGuc9Iaz+3X&L8u4^X7$9ROTkUS zdJ3tUpK-ibI_JR433>(m)436N-NJ6&qzR`9tVMHZ&p4kUewbeZ|0~3lMK7a0<$Nu6 z>^$11ocoA5iyX91IzM8qH2ycN8uM>~{|GiMdJ*k$=O3)3O$*SUaTf4qHeC?ZMEPurclZp&L;&vjA#L4qq@!sqqay@i{=+G_78<{3-y z7Z=_?MeGrAKNxWS^VzS9Y>vS939(N&W9Y*1$Au}c4O7N5 zDNZBw6Nqg|C7w?w*_U`ev1DK3IqtY`D;(#1?pq4S^N@0hODdeLaJItP3P*@$#uJ}> zf{rVS(@^xs6rEOdN>QAeLXLAwP@JTod?qkWDZ5E!H>vFME|GGHODkMT;rR5Ca*dOI z<C0KZPJhM_Wf%mD`F>kH)og9!LM zc-;xTxzQ8K6-JFXpW?nF98;bsgw`XRZ~Nr^zBUlE9udAaz*t`!l<|>&7D+D}M8Ma9 z@GxQ#w!`u*f2+`iL%S$CmwM;oUu@laXM4ZZSh~9hM|8Yuxx@GAPP_Ig&aR6xnL{f>jA?@vwNiZuH~P3zDKfK*!T~2_5XTa6kcEcx. diff --git a/packages/flutter_template_images/templates/skeleton/assets/images/2.0x/flutter_logo.png b/packages/flutter_template_images/templates/skeleton/assets/images/2.0x/flutter_logo.png deleted file mode 100644 index b65164de707ffeaf0adfca5fca65532bf97e6903..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 619 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H3?#oinD`S&H3s;ExB}^b{r?#vrgK>I2kif@ zvH816@%GSTKN!MhbHpsw+WI}@_)o2^Ujq(*4>|fhmwB2f9E#&lh@dHUo7LNZ{xgp@r+-ynauvLPwNoN4|Z_>tNAZ;@h5j(?S79JcUYfB`=#qy r6fZFpo3n_4Rl|XiE8s&sR~^H;NW15^d4qg`5ys%@>gTe~DWM4f{@o*g diff --git a/packages/flutter_template_images/templates/skeleton/assets/images/3.0x/flutter_logo.png b/packages/flutter_template_images/templates/skeleton/assets/images/3.0x/flutter_logo.png deleted file mode 100644 index 97e5dc9af6e1093966c5cd42d608fd6fbb6a0c59..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 810 zcmeAS@N?(olHy`uVBq!ia0vp^2SAvE8Azrw%`pX16#+gWu0UF2`*(-^-y@EH58eMI z^w{s z-$IW5@LT%57HGFUA^wwrfyu|y#WAGf*4wMk zgAN-AxF%k#KCURBVA1=%-ucp;9Uj}ZG#l?Wes0(B%({NdIoXW<{g3WiupaK0x3By2 zO4s)_FGS)mJr|)n_%@ z)kihD)q6Gi)z>tJ)#o(E)yFiZ)%!H&)t5Jx)rUK-{vXl2fA4~;^_xE>GN_~ps{eO!b9`tLyxW8Xh;HNSd-@|xOj=ytR+do>D zt9>mOkvaAL$-iq%!vCf*DgR4ol&oKHV8Z?Agj4S|4W8wT%=mnri|3a%tJ>eCOpE`; zHb(y6c3?w&Y{ISmIsp&Mrw9G7`Sv8_P1LLTesVhEI)8;vvu5vq*tGV3&cSo}TNXSq zj|})It+V3iSy7We$GB|jf?4DCFKlYK@8ftOf60QQ_A~Fi*3bCZZ_jpf?zg4|^)^x| zt2OmGe$>0=M;cybjjOklN_(oQ_u}uL;@3elyf)C=)PemO(7H=26jVtWmubrDh3}(04)hM&xSK7O%X|>Mc j1|}|z1*pUejUUWgK0Q%uH(H?zOn3~Qu6{1-oD!M<&k2w@ diff --git a/packages/flutter_template_images/templates/skeleton/assets/images/flutter_logo.png b/packages/flutter_template_images/templates/skeleton/assets/images/flutter_logo.png deleted file mode 100644 index b5c6ca710c937527ca8d2d344214243d6db33832..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 419 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!@&kNAT!FN~`u7^!zegPZ&Ja3_ z)pe?NNpCL!ThaUauw)u_bwr{%Izl9$A!5B7M$govP zxh~|$561A>Od+#a0;aQjP2sie<+JJ*(`u4bZve_F*PR4v(b@jZ=Md1SAK%^B{{yWQ zFA4GsW)M(NFaUyj5NMdc{{H>@?}1?b(XAk7pYe2Y42d}W_VP)gCIbQ2ix!U>4q9?~ zIsEybZ^G7cAu^%-PQ=yx*;eIK#gYnUFW+9QvQNJH+nbx4)6dKOIC(3+3g6;V=GFge(48{@_RM&lLju^uE+^au+>tK7OIONyesA;#Zub zQs3&YevL0~GuE6t~Fo%7BFztX3q{1RVU;;PiN_-8qleWA`_& zw({X*ef?P{^t~Y0vFF>PCUdo}=4?%^3QRb0$VpT0kLyEL`Hh?APM From 16a5ff92af385d527db9165a057c0d13123f88cf Mon Sep 17 00:00:00 2001 From: Andrew Kolos Date: Mon, 27 Jan 2025 15:45:23 -0800 Subject: [PATCH 098/118] [multicast_dns] Rewrite `_readFQDN` to avoid recursion (#8390) Speculatively fixes https://github.com/flutter/flutter/issues/155433. Read [one of my later comments](https://github.com/flutter/flutter/issues/155433#issuecomment-2573539784) on that thread for my current understanding of this issue. In summary, this PR rewrites `_readFQDN` to avoid recursion. **For reviewers: For a simplified diff, see the first commit, [change](https://github.com/flutter/packages/commit/7afa1db54e07f024b2a4550d160b4d4a9f67f2c7).** This commit avoids formatting make sure the diff only highlights changes to logic rather than formatting.

Pre-launch Checklist - x ] I signed the [CLA].
--- packages/multicast_dns/CHANGELOG.md | 3 +- packages/multicast_dns/lib/src/packet.dart | 112 ++++++++----------- packages/multicast_dns/pubspec.yaml | 2 +- packages/multicast_dns/test/decode_test.dart | 40 +++++++ 4 files changed, 89 insertions(+), 68 deletions(-) diff --git a/packages/multicast_dns/CHANGELOG.md b/packages/multicast_dns/CHANGELOG.md index 4b23be3..7a7d48a 100644 --- a/packages/multicast_dns/CHANGELOG.md +++ b/packages/multicast_dns/CHANGELOG.md @@ -1,5 +1,6 @@ -## NEXT +## 0.3.2+8 +* Fixes stack overflows ocurring during the parsing of domain names in MDNS messages. * Updates minimum supported SDK version to Flutter 3.22/Dart 3.4. ## 0.3.2+7 diff --git a/packages/multicast_dns/lib/src/packet.dart b/packages/multicast_dns/lib/src/packet.dart index dcf1402..330397d 100644 --- a/packages/multicast_dns/lib/src/packet.dart +++ b/packages/multicast_dns/lib/src/packet.dart @@ -4,6 +4,7 @@ import 'dart:convert'; import 'dart:io'; +import 'dart:math'; import 'dart:typed_data'; import 'constants.dart'; @@ -134,76 +135,55 @@ _FQDNReadResult _readFQDN( final List parts = []; final int prevOffset = offset; - while (true) { - // At least one byte is required. - checkLength(offset + 1); - - // Check for compressed. - if (data[offset] & 0xc0 == 0xc0) { - // At least two bytes are required for a compressed FQDN. - checkLength(offset + 2); - - // A compressed FQDN has a new offset in the lower 14 bits. - final _FQDNReadResult result = _readFQDN( - data, byteData, byteData.getUint16(offset) & ~0xc000, length); - parts.addAll(result.fqdnParts); - offset += 2; - break; - } else { - // A normal FQDN part has a length and a UTF-8 encoded name - // part. If the length is 0 this is the end of the FQDN. - final int partLength = data[offset]; - offset++; - if (partLength > 0) { - checkLength(offset + partLength); - final Uint8List partBytes = - Uint8List.view(data.buffer, offset, partLength); - offset += partLength; - // According to the RFC, this is supposed to be utf-8 encoded, but - // we should continue decoding even if it isn't to avoid dropping the - // rest of the data, which might still be useful. - parts.add(utf8.decode(partBytes, allowMalformed: true)); - } else { + final List offsetsToVisit = [offset]; + int upperLimitOffset = offset; + int highestOffsetRead = offset; + + while (offsetsToVisit.isNotEmpty) { + offset = offsetsToVisit.removeLast(); + + while (true) { + // At least one byte is required. + checkLength(offset + 1); + // Check for compressed. + if (data[offset] & 0xc0 == 0xc0) { + // At least two bytes are required for a compressed FQDN (see RFC1035 section 4.1.4). + checkLength(offset + 2); + + // A compressed FQDN has a new offset in the lower 14 bits. + final int pointerDest = byteData.getUint16(offset) & ~0xc000; + // Pointers can only point to prior occurances of some name. + // This check also guards against pointers that form loops. + if (pointerDest >= upperLimitOffset) { + throw MDnsDecodeException(offset); + } + upperLimitOffset = pointerDest; + offsetsToVisit.add(pointerDest); + highestOffsetRead = max(highestOffsetRead, offset + 2); break; + } else { + // A normal FQDN part has a length and a UTF-8 encoded name + // part. If the length is 0 this is the end of the FQDN. + final int partLength = data[offset]; + offset++; + if (partLength > 0) { + checkLength(offset + partLength); + final Uint8List partBytes = + Uint8List.view(data.buffer, offset, partLength); + offset += partLength; + // According to the RFC, this is supposed to be utf-8 encoded, but + // we should continue decoding even if it isn't to avoid dropping the + // rest of the data, which might still be useful. + parts.add(utf8.decode(partBytes, allowMalformed: true)); + highestOffsetRead = max(highestOffsetRead, offset); + } else { + highestOffsetRead = max(highestOffsetRead, offset); + break; + } } } } - return _FQDNReadResult(parts, offset - prevOffset); -} - -/// Decode an mDNS query packet. -/// -/// If decoding fails (e.g. due to an invalid packet), `null` is returned. -/// -/// See https://tools.ietf.org/html/rfc1035 for format. -ResourceRecordQuery? decodeMDnsQuery(List packet) { - final int length = packet.length; - if (length < _kHeaderSize) { - return null; - } - - final Uint8List data = - packet is Uint8List ? packet : Uint8List.fromList(packet); - final ByteData packetBytes = ByteData.view(data.buffer); - - // Check whether it's a query. - final int flags = packetBytes.getUint16(_kFlagsOffset); - if (flags != 0) { - return null; - } - final int questionCount = packetBytes.getUint16(_kQdcountOffset); - if (questionCount == 0) { - return null; - } - - final _FQDNReadResult fqdn = - _readFQDN(data, packetBytes, _kHeaderSize, data.length); - - int offset = _kHeaderSize + fqdn.bytesRead; - final int type = packetBytes.getUint16(offset); - offset += 2; - final int queryType = packetBytes.getUint16(offset) & 0x8000; - return ResourceRecordQuery(type, fqdn.fqdn, queryType); + return _FQDNReadResult(parts, highestOffsetRead - prevOffset); } /// Decode an mDNS response packet. diff --git a/packages/multicast_dns/pubspec.yaml b/packages/multicast_dns/pubspec.yaml index 6f0f305..3303a8f 100644 --- a/packages/multicast_dns/pubspec.yaml +++ b/packages/multicast_dns/pubspec.yaml @@ -2,7 +2,7 @@ name: multicast_dns description: Dart package for performing mDNS queries (e.g. Bonjour, Avahi). repository: https://github.com/flutter/packages/tree/main/packages/multicast_dns issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+multicast_dns%22 -version: 0.3.2+7 +version: 0.3.2+8 environment: sdk: ^3.4.0 diff --git a/packages/multicast_dns/test/decode_test.dart b/packages/multicast_dns/test/decode_test.dart index 32d7c2f..358f764 100644 --- a/packages/multicast_dns/test/decode_test.dart +++ b/packages/multicast_dns/test/decode_test.dart @@ -192,6 +192,10 @@ void testBadPackages() { } } }); + + test('Detects cyclic pointers and returns null', () { + expect(decodeMDnsResponse(cycle), isNull); + }); } void testPTRRData() { @@ -584,6 +588,42 @@ const List package3 = [ 0x2c ]; +/// Contains compressed domain names where a there is a cycle amongst the +/// offset pointers. +const List cycle = [ + 0x00, + 0x00, + 0x84, + 0x00, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x00, + 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, // "example" + 0xC0, 0x16, // Pointer to "com" + 0x03, 0x63, 0x6f, 0x6d, // "com" + 0xC0, 0x0c, // Pointer to "example" + 0x00, + 0x00, + 0x01, + 0x80, + 0x01, + 0x00, + 0x00, + 0x00, + 0x78, + 0x00, + 0x04, + 0xc0, + 0xa8, + 0x01, + 0xbf +]; + const List packagePtrResponse = [ 0x00, 0x00, From 40f4bc7d53a080f875847137df9f20609628e49f Mon Sep 17 00:00:00 2001 From: stuartmorgan Date: Wed, 26 Mar 2025 12:55:49 -0700 Subject: [PATCH 099/118] [various] Disable sandbox in Chrome dart tests (#8909) `flutter test` automatically disables sandbox in headless mode, but `dart test` does not, and the Linux CI bots no longer support the sandbox, so this turns it off explicitly for packages that don't rely on Flutter (and thus use `dart test`). Fixes https://github.com/flutter/flutter/issues/165664 --- packages/standard_message_codec/dart_test.yaml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 packages/standard_message_codec/dart_test.yaml diff --git a/packages/standard_message_codec/dart_test.yaml b/packages/standard_message_codec/dart_test.yaml new file mode 100644 index 0000000..cdb656d --- /dev/null +++ b/packages/standard_message_codec/dart_test.yaml @@ -0,0 +1,6 @@ +# See https://github.com/dart-lang/test/blob/master/pkgs/test/doc/configuration.md#arguments +override_platforms: + chrome: + settings: + executable: chrome + arguments: --no-sandbox From ba3110a9fd6c506ee9a409e3346f160ea8ec004f Mon Sep 17 00:00:00 2001 From: alexander-irion Date: Wed, 2 Apr 2025 18:46:06 +0200 Subject: [PATCH 100/118] [multicast_dns] MDnsClient::listen supports onError callback (#8888) MDnsClient::Listen now supports an optional onError callback function, called in case of a stream error. If omitted any errors on the stream are considered unhandled, and will be passed to the current [Zone]'s error handler. By default unhandled async errors are treated as if they were uncaught top-level errors. This fixes an unhandled exception occuring (tested on Android), when the network is disconnected. Fixes https://github.com/flutter/flutter/issues/165482 ## Pre-Review Checklist [^1]: Regular contributors who have demonstrated familiarity with the repository guidelines only need to comment if the PR is not auto-exempted by repo tooling. How can a test be added? It would need to disconnect the device from WLAN beforehand. --- packages/multicast_dns/CHANGELOG.md | 4 ++ packages/multicast_dns/lib/multicast_dns.dart | 10 +++- packages/multicast_dns/pubspec.yaml | 2 +- packages/multicast_dns/test/client_test.dart | 50 +++++++++++++++++++ 4 files changed, 64 insertions(+), 2 deletions(-) diff --git a/packages/multicast_dns/CHANGELOG.md b/packages/multicast_dns/CHANGELOG.md index 7a7d48a..dc613d5 100644 --- a/packages/multicast_dns/CHANGELOG.md +++ b/packages/multicast_dns/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.3.3 + +* Adds an optional error callback for `MDnsClient::start` to prevent uncaught exceptions. + ## 0.3.2+8 * Fixes stack overflows ocurring during the parsing of domain names in MDNS messages. diff --git a/packages/multicast_dns/lib/multicast_dns.dart b/packages/multicast_dns/lib/multicast_dns.dart index d6e2e6b..9efd54a 100644 --- a/packages/multicast_dns/lib/multicast_dns.dart +++ b/packages/multicast_dns/lib/multicast_dns.dart @@ -84,6 +84,10 @@ class MDnsClient { /// for the mDNS query. If not provided, defaults to either `224.0.0.251` or /// or `FF02::FB`. /// + /// If provided, [onError] will be called in case of a stream error. If + /// omitted any errors on the stream are considered unhandled, and will be + /// passed to the current [Zone]'s error handler. + /// /// Subsequent calls to this method are ignored while the mDNS client is in /// started state. Future start({ @@ -91,6 +95,7 @@ class MDnsClient { NetworkInterfacesFactory? interfacesFactory, int mDnsPort = mDnsPort, InternetAddress? mDnsAddress, + Function? onError, }) async { listenAddress ??= InternetAddress.anyIPv4; interfacesFactory ??= allInterfacesFactory; @@ -152,7 +157,10 @@ class MDnsClient { // Join multicast on this interface. incoming.joinMulticast(_mDnsAddress!, interface); } - incoming.listen((RawSocketEvent event) => _handleIncoming(event, incoming)); + incoming.listen( + (RawSocketEvent event) => _handleIncoming(event, incoming), + onError: onError, + ); _started = true; _starting = false; } diff --git a/packages/multicast_dns/pubspec.yaml b/packages/multicast_dns/pubspec.yaml index 3303a8f..974a4b5 100644 --- a/packages/multicast_dns/pubspec.yaml +++ b/packages/multicast_dns/pubspec.yaml @@ -2,7 +2,7 @@ name: multicast_dns description: Dart package for performing mDNS queries (e.g. Bonjour, Avahi). repository: https://github.com/flutter/packages/tree/main/packages/multicast_dns issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+multicast_dns%22 -version: 0.3.2+8 +version: 0.3.3 environment: sdk: ^3.4.0 diff --git a/packages/multicast_dns/test/client_test.dart b/packages/multicast_dns/test/client_test.dart index f3047e5..706e2f1 100644 --- a/packages/multicast_dns/test/client_test.dart +++ b/packages/multicast_dns/test/client_test.dart @@ -158,6 +158,35 @@ void main() { }); } }); + + test('Calls onError callback in case of socket error', () async { + final FakeRawDatagramSocketThatSendsError datagramSocket = + FakeRawDatagramSocketThatSendsError(); + final MDnsClient client = MDnsClient( + rawDatagramSocketFactory: ( + dynamic host, + int port, { + bool reuseAddress = true, + bool reusePort = true, + int ttl = 1, + }) async { + return datagramSocket; + }, + ); + + final Completer onErrorCalledCompleter = Completer(); + await client.start( + mDnsPort: 1234, + interfacesFactory: (InternetAddressType type) async => + [], + onError: (Object e) { + expect(e, 'Error'); + onErrorCalledCompleter.complete(); + }, + ); + + await onErrorCalledCompleter.future.timeout(const Duration(seconds: 5)); + }); } class FakeRawDatagramSocket extends Fake implements RawDatagramSocket { @@ -196,6 +225,27 @@ class FakeRawDatagramSocket extends Fake implements RawDatagramSocket { } } +class FakeRawDatagramSocketThatSendsError extends Fake + implements RawDatagramSocket { + @override + InternetAddress address = InternetAddress.anyIPv4; + + @override + StreamSubscription listen( + void Function(RawSocketEvent event)? onData, { + Function? onError, + void Function()? onDone, + bool? cancelOnError, + }) { + return Stream.error('Error').listen( + onData, + onError: onError, + cancelOnError: cancelOnError, + onDone: onDone, + ); + } +} + class FakeNetworkInterface implements NetworkInterface { FakeNetworkInterface(this._name, this._addresses, this._index); From 4e19ed696c0a57595589edbd42001aa1d2a16887 Mon Sep 17 00:00:00 2001 From: stuartmorgan-g Date: Wed, 21 May 2025 12:28:24 -0700 Subject: [PATCH 101/118] [ci] Update repository for 3.29 release (#9270) We accidentally never did the repo update for the 3.29 release, beyond rolling the stable pin. This does the remainder of the steps from https://github.com/flutter/flutter/blob/master/docs/ecosystem/release/Updating-Packages-repo-for-a-stable-release.md, making 3.24 our min-min version, and updating the N-1 and N-2 tests to reflect the current reality. --- packages/flutter_template_images/CHANGELOG.md | 4 ++++ packages/flutter_template_images/pubspec.yaml | 2 +- packages/multicast_dns/CHANGELOG.md | 4 ++++ packages/multicast_dns/pubspec.yaml | 2 +- packages/standard_message_codec/CHANGELOG.md | 2 +- packages/standard_message_codec/example/pubspec.yaml | 2 +- packages/standard_message_codec/pubspec.yaml | 2 +- 7 files changed, 13 insertions(+), 5 deletions(-) diff --git a/packages/flutter_template_images/CHANGELOG.md b/packages/flutter_template_images/CHANGELOG.md index 07aedbf..5f0b4da 100644 --- a/packages/flutter_template_images/CHANGELOG.md +++ b/packages/flutter_template_images/CHANGELOG.md @@ -1,3 +1,7 @@ +## NEXT + +* Updates minimum supported SDK version to Flutter 3.24/Dart 3.5. + ## 5.0.0 * Removes `app_shared` and `skeleton`, which are [no longer used](https://github.com/flutter/flutter/issues/160692). diff --git a/packages/flutter_template_images/pubspec.yaml b/packages/flutter_template_images/pubspec.yaml index 4ff9a94..d55a7a4 100644 --- a/packages/flutter_template_images/pubspec.yaml +++ b/packages/flutter_template_images/pubspec.yaml @@ -5,7 +5,7 @@ issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+ version: 5.0.0 environment: - sdk: ^3.4.0 + sdk: ^3.5.0 topics: - assets diff --git a/packages/multicast_dns/CHANGELOG.md b/packages/multicast_dns/CHANGELOG.md index dc613d5..27931b0 100644 --- a/packages/multicast_dns/CHANGELOG.md +++ b/packages/multicast_dns/CHANGELOG.md @@ -1,3 +1,7 @@ +## NEXT + +* Updates minimum supported SDK version to Flutter 3.24/Dart 3.5. + ## 0.3.3 * Adds an optional error callback for `MDnsClient::start` to prevent uncaught exceptions. diff --git a/packages/multicast_dns/pubspec.yaml b/packages/multicast_dns/pubspec.yaml index 974a4b5..4bcc919 100644 --- a/packages/multicast_dns/pubspec.yaml +++ b/packages/multicast_dns/pubspec.yaml @@ -5,7 +5,7 @@ issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+ version: 0.3.3 environment: - sdk: ^3.4.0 + sdk: ^3.5.0 dependencies: meta: ^1.3.0 diff --git a/packages/standard_message_codec/CHANGELOG.md b/packages/standard_message_codec/CHANGELOG.md index a87ddfe..d6642a4 100644 --- a/packages/standard_message_codec/CHANGELOG.md +++ b/packages/standard_message_codec/CHANGELOG.md @@ -1,6 +1,6 @@ ## NEXT -* Updates minimum supported SDK version to Flutter 3.22/Dart 3.4. +* Updates minimum supported SDK version to Flutter 3.24/Dart 3.5. ## 0.0.1+4 diff --git a/packages/standard_message_codec/example/pubspec.yaml b/packages/standard_message_codec/example/pubspec.yaml index 24edd81..174ee26 100644 --- a/packages/standard_message_codec/example/pubspec.yaml +++ b/packages/standard_message_codec/example/pubspec.yaml @@ -4,7 +4,7 @@ version: 0.0.1 publish_to: none environment: - sdk: ^3.4.0 + sdk: ^3.5.0 dependencies: standard_message_codec: diff --git a/packages/standard_message_codec/pubspec.yaml b/packages/standard_message_codec/pubspec.yaml index 60343a8..98cad86 100644 --- a/packages/standard_message_codec/pubspec.yaml +++ b/packages/standard_message_codec/pubspec.yaml @@ -5,7 +5,7 @@ repository: https://github.com/flutter/packages/tree/main/packages/standard_mess issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3Astandard_message_codec environment: - sdk: ^3.4.0 + sdk: ^3.5.0 dev_dependencies: test: ^1.16.0 From 329708effa970fa44e9cb7d7f46b7a180b38e30e Mon Sep 17 00:00:00 2001 From: stuartmorgan-g Date: Fri, 23 May 2025 03:59:51 -0700 Subject: [PATCH 102/118] Update repo for 3.32 stable (#9311) Does all of the steps from https://github.com/flutter/flutter/blob/master/docs/ecosystem/release/Updating-Packages-repo-for-a-stable-release.md for the 3.32 stable release (except the first one, as the stable roller has already landed). --- packages/flutter_template_images/CHANGELOG.md | 2 +- packages/flutter_template_images/pubspec.yaml | 2 +- packages/multicast_dns/CHANGELOG.md | 2 +- packages/multicast_dns/pubspec.yaml | 2 +- packages/standard_message_codec/CHANGELOG.md | 2 +- packages/standard_message_codec/example/pubspec.yaml | 2 +- packages/standard_message_codec/pubspec.yaml | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/flutter_template_images/CHANGELOG.md b/packages/flutter_template_images/CHANGELOG.md index 5f0b4da..210fa5c 100644 --- a/packages/flutter_template_images/CHANGELOG.md +++ b/packages/flutter_template_images/CHANGELOG.md @@ -1,6 +1,6 @@ ## NEXT -* Updates minimum supported SDK version to Flutter 3.24/Dart 3.5. +* Updates minimum supported SDK version to Flutter 3.27/Dart 3.6. ## 5.0.0 diff --git a/packages/flutter_template_images/pubspec.yaml b/packages/flutter_template_images/pubspec.yaml index d55a7a4..22e3e82 100644 --- a/packages/flutter_template_images/pubspec.yaml +++ b/packages/flutter_template_images/pubspec.yaml @@ -5,7 +5,7 @@ issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+ version: 5.0.0 environment: - sdk: ^3.5.0 + sdk: ^3.6.0 topics: - assets diff --git a/packages/multicast_dns/CHANGELOG.md b/packages/multicast_dns/CHANGELOG.md index 27931b0..495b69a 100644 --- a/packages/multicast_dns/CHANGELOG.md +++ b/packages/multicast_dns/CHANGELOG.md @@ -1,6 +1,6 @@ ## NEXT -* Updates minimum supported SDK version to Flutter 3.24/Dart 3.5. +* Updates minimum supported SDK version to Flutter 3.27/Dart 3.6. ## 0.3.3 diff --git a/packages/multicast_dns/pubspec.yaml b/packages/multicast_dns/pubspec.yaml index 4bcc919..15fbae4 100644 --- a/packages/multicast_dns/pubspec.yaml +++ b/packages/multicast_dns/pubspec.yaml @@ -5,7 +5,7 @@ issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+ version: 0.3.3 environment: - sdk: ^3.5.0 + sdk: ^3.6.0 dependencies: meta: ^1.3.0 diff --git a/packages/standard_message_codec/CHANGELOG.md b/packages/standard_message_codec/CHANGELOG.md index d6642a4..5593c94 100644 --- a/packages/standard_message_codec/CHANGELOG.md +++ b/packages/standard_message_codec/CHANGELOG.md @@ -1,6 +1,6 @@ ## NEXT -* Updates minimum supported SDK version to Flutter 3.24/Dart 3.5. +* Updates minimum supported SDK version to Flutter 3.27/Dart 3.6. ## 0.0.1+4 diff --git a/packages/standard_message_codec/example/pubspec.yaml b/packages/standard_message_codec/example/pubspec.yaml index 174ee26..44e0ee8 100644 --- a/packages/standard_message_codec/example/pubspec.yaml +++ b/packages/standard_message_codec/example/pubspec.yaml @@ -4,7 +4,7 @@ version: 0.0.1 publish_to: none environment: - sdk: ^3.5.0 + sdk: ^3.6.0 dependencies: standard_message_codec: diff --git a/packages/standard_message_codec/pubspec.yaml b/packages/standard_message_codec/pubspec.yaml index 98cad86..0421d5d 100644 --- a/packages/standard_message_codec/pubspec.yaml +++ b/packages/standard_message_codec/pubspec.yaml @@ -5,7 +5,7 @@ repository: https://github.com/flutter/packages/tree/main/packages/standard_mess issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3Astandard_message_codec environment: - sdk: ^3.5.0 + sdk: ^3.6.0 dev_dependencies: test: ^1.16.0 From c602267b83a65503f3614eea3430eef6d004bbdf Mon Sep 17 00:00:00 2001 From: stuartmorgan-g Date: Sat, 16 Aug 2025 17:38:25 -0400 Subject: [PATCH 103/118] Update repo for 3.35 stable release (#9816) Does the steps listed at https://github.com/flutter/flutter/blob/master/docs/ecosystem/release/Updating-Packages-repo-for-a-stable-release.md for the 3.35 release. This makes the minimum supported version for all packages Dart 3.7, which means it picks up the new formatter. As a result, there are massive amounts of code changes; all of it is just the result of running `dart format` after changing the min SDK version. --- packages/flutter_template_images/CHANGELOG.md | 2 +- packages/flutter_template_images/pubspec.yaml | 2 +- packages/multicast_dns/CHANGELOG.md | 2 +- packages/multicast_dns/example/main.dart | 14 +- packages/multicast_dns/example/mdns_sd.dart | 34 ++-- packages/multicast_dns/lib/multicast_dns.dart | 53 ++++-- .../lib/src/lookup_resolver.dart | 5 +- .../lib/src/native_protocol_client.dart | 12 +- packages/multicast_dns/lib/src/packet.dart | 57 ++++-- .../lib/src/resource_record.dart | 95 ++++------ packages/multicast_dns/pubspec.yaml | 2 +- packages/multicast_dns/test/client_test.dart | 175 +++++++++++------- packages/multicast_dns/test/decode_test.dart | 71 +++---- .../test/lookup_resolver_test.dart | 66 +++++-- .../test/resource_record_cache_test.dart | 13 +- packages/standard_message_codec/CHANGELOG.md | 2 +- packages/standard_message_codec/README.md | 9 +- .../example/lib/readme_excerpts.dart | 9 +- .../example/pubspec.yaml | 2 +- .../lib/src/serialization.dart | 38 ++-- .../lib/standard_message_codec.dart | 5 +- packages/standard_message_codec/pubspec.yaml | 2 +- .../test/standard_message_codec_test.dart | 62 ++++--- 23 files changed, 434 insertions(+), 298 deletions(-) diff --git a/packages/flutter_template_images/CHANGELOG.md b/packages/flutter_template_images/CHANGELOG.md index 210fa5c..8f08f28 100644 --- a/packages/flutter_template_images/CHANGELOG.md +++ b/packages/flutter_template_images/CHANGELOG.md @@ -1,6 +1,6 @@ ## NEXT -* Updates minimum supported SDK version to Flutter 3.27/Dart 3.6. +* Updates minimum supported SDK version to Flutter 3.29/Dart 3.7. ## 5.0.0 diff --git a/packages/flutter_template_images/pubspec.yaml b/packages/flutter_template_images/pubspec.yaml index 22e3e82..3b7a32b 100644 --- a/packages/flutter_template_images/pubspec.yaml +++ b/packages/flutter_template_images/pubspec.yaml @@ -5,7 +5,7 @@ issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+ version: 5.0.0 environment: - sdk: ^3.6.0 + sdk: ^3.7.0 topics: - assets diff --git a/packages/multicast_dns/CHANGELOG.md b/packages/multicast_dns/CHANGELOG.md index 495b69a..6c4cbfa 100644 --- a/packages/multicast_dns/CHANGELOG.md +++ b/packages/multicast_dns/CHANGELOG.md @@ -1,6 +1,6 @@ ## NEXT -* Updates minimum supported SDK version to Flutter 3.27/Dart 3.6. +* Updates minimum supported SDK version to Flutter 3.29/Dart 3.7. ## 0.3.3 diff --git a/packages/multicast_dns/example/main.dart b/packages/multicast_dns/example/main.dart index 2fdb57a..81c7697 100644 --- a/packages/multicast_dns/example/main.dart +++ b/packages/multicast_dns/example/main.dart @@ -18,19 +18,23 @@ Future main() async { await client.start(); // Get the PTR record for the service. - await for (final PtrResourceRecord ptr in client - .lookup(ResourceRecordQuery.serverPointer(name))) { + await for (final PtrResourceRecord ptr in client.lookup( + ResourceRecordQuery.serverPointer(name), + )) { // Use the domainName from the PTR record to get the SRV record, // which will have the port and local hostname. // Note that duplicate messages may come through, especially if any // other mDNS queries are running elsewhere on the machine. await for (final SrvResourceRecord srv in client.lookup( - ResourceRecordQuery.service(ptr.domainName))) { + ResourceRecordQuery.service(ptr.domainName), + )) { // Domain name will be something like "io.flutter.example@some-iphone.local._dartobservatory._tcp.local" final String bundleId = ptr.domainName; //.substring(0, ptr.domainName.indexOf('@')); - print('Dart observatory instance found at ' - '${srv.target}:${srv.port} for "$bundleId".'); + print( + 'Dart observatory instance found at ' + '${srv.target}:${srv.port} for "$bundleId".', + ); } } client.stop(); diff --git a/packages/multicast_dns/example/mdns_sd.dart b/packages/multicast_dns/example/mdns_sd.dart index 50b46eb..b728b61 100644 --- a/packages/multicast_dns/example/mdns_sd.dart +++ b/packages/multicast_dns/example/mdns_sd.dart @@ -24,13 +24,15 @@ For example: final MDnsClient client = MDnsClient(); await client.start(); - await for (final PtrResourceRecord ptr in client - .lookup(ResourceRecordQuery.serverPointer(name))) { + await for (final PtrResourceRecord ptr in client.lookup( + ResourceRecordQuery.serverPointer(name), + )) { if (verbose) { print(ptr); } await for (final SrvResourceRecord srv in client.lookup( - ResourceRecordQuery.service(ptr.domainName))) { + ResourceRecordQuery.service(ptr.domainName), + )) { if (verbose) { print(srv); } @@ -39,23 +41,29 @@ For example: .lookup(ResourceRecordQuery.text(ptr.domainName)) .forEach(print); } - await for (final IPAddressResourceRecord ip - in client.lookup( - ResourceRecordQuery.addressIPv4(srv.target))) { + await for (final IPAddressResourceRecord ip in client + .lookup( + ResourceRecordQuery.addressIPv4(srv.target), + )) { if (verbose) { print(ip); } - print('Service instance found at ' - '${srv.target}:${srv.port} with ${ip.address}.'); + print( + 'Service instance found at ' + '${srv.target}:${srv.port} with ${ip.address}.', + ); } - await for (final IPAddressResourceRecord ip - in client.lookup( - ResourceRecordQuery.addressIPv6(srv.target))) { + await for (final IPAddressResourceRecord ip in client + .lookup( + ResourceRecordQuery.addressIPv6(srv.target), + )) { if (verbose) { print(ip); } - print('Service instance found at ' - '${srv.target}:${srv.port} with ${ip.address}.'); + print( + 'Service instance found at ' + '${srv.target}:${srv.port} with ${ip.address}.', + ); } } } diff --git a/packages/multicast_dns/lib/multicast_dns.dart b/packages/multicast_dns/lib/multicast_dns.dart index 9efd54a..18674fb 100644 --- a/packages/multicast_dns/lib/multicast_dns.dart +++ b/packages/multicast_dns/lib/multicast_dns.dart @@ -21,16 +21,21 @@ export 'package:multicast_dns/src/resource_record.dart'; /// /// See also: /// * [MDnsQuerier.allInterfacesFactory] -typedef NetworkInterfacesFactory = Future> Function( - InternetAddressType type); +typedef NetworkInterfacesFactory = + Future> Function(InternetAddressType type); /// A factory for construction of datagram sockets. /// /// This can be injected into the [MDnsClient] to provide alternative /// implementations of [RawDatagramSocket.bind]. -typedef RawDatagramSocketFactory = Future Function( - dynamic host, int port, - {bool reuseAddress, bool reusePort, int ttl}); +typedef RawDatagramSocketFactory = + Future Function( + dynamic host, + int port, { + bool reuseAddress, + bool reusePort, + int ttl, + }); /// Client for DNS lookup and publishing using the mDNS protocol. /// @@ -59,7 +64,8 @@ class MDnsClient { /// Find all network interfaces with an the [InternetAddressType] specified. Future> allInterfacesFactory( - InternetAddressType type) { + InternetAddressType type, + ) { return NetworkInterface.list( includeLinkLocal: true, type: type, @@ -100,8 +106,10 @@ class MDnsClient { listenAddress ??= InternetAddress.anyIPv4; interfacesFactory ??= allInterfacesFactory; - assert(listenAddress.address == InternetAddress.anyIPv4.address || - listenAddress.address == InternetAddress.anyIPv6.address); + assert( + listenAddress.address == InternetAddress.anyIPv4.address || + listenAddress.address == InternetAddress.anyIPv6.address, + ); if (_started || _starting) { return; @@ -127,9 +135,10 @@ class MDnsClient { _ipv6InterfaceSockets.add(incoming); } - _mDnsAddress ??= incoming.address.type == InternetAddressType.IPv4 - ? mDnsAddressIPv4 - : mDnsAddressIPv6; + _mDnsAddress ??= + incoming.address.type == InternetAddressType.IPv4 + ? mDnsAddressIPv4 + : mDnsAddressIPv6; final List interfaces = (await interfacesFactory(listenAddress.type)).toList(); @@ -147,11 +156,13 @@ class MDnsClient { ttl: 255, ); _ipv6InterfaceSockets.add(socket); - socket.setRawOption(RawSocketOption.fromInt( - RawSocketOption.levelIPv6, - RawSocketOption.IPv6MulticastInterface, - interface.index, - )); + socket.setRawOption( + RawSocketOption.fromInt( + RawSocketOption.levelIPv6, + RawSocketOption.IPv6MulticastInterface, + interface.index, + ), + ); } // Join multicast on this interface. @@ -208,7 +219,10 @@ class MDnsClient { // Look for entries in the cache. final List cached = []; _cache.lookup( - query.fullyQualifiedName, query.resourceRecordType, cached); + query.fullyQualifiedName, + query.resourceRecordType, + cached, + ); if (cached.isNotEmpty) { final StreamController controller = StreamController(); cached.forEach(controller.add); @@ -218,7 +232,10 @@ class MDnsClient { // Add the pending request before sending the query. final Stream results = _resolver.addPendingRequest( - query.resourceRecordType, query.fullyQualifiedName, timeout); + query.resourceRecordType, + query.fullyQualifiedName, + timeout, + ); final List packet = query.encode(); diff --git a/packages/multicast_dns/lib/src/lookup_resolver.dart b/packages/multicast_dns/lib/src/lookup_resolver.dart index ceaa13a..a12c3e1 100644 --- a/packages/multicast_dns/lib/src/lookup_resolver.dart +++ b/packages/multicast_dns/lib/src/lookup_resolver.dart @@ -36,7 +36,10 @@ class LookupResolver { /// Adds a request and returns a [Stream] of [ResourceRecord] responses. Stream addPendingRequest( - int type, String name, Duration timeout) { + int type, + String name, + Duration timeout, + ) { final StreamController controller = StreamController(); final PendingRequest request = PendingRequest(type, name, controller); final Timer timer = Timer(timeout, () { diff --git a/packages/multicast_dns/lib/src/native_protocol_client.dart b/packages/multicast_dns/lib/src/native_protocol_client.dart index b754519..fb94343 100644 --- a/packages/multicast_dns/lib/src/native_protocol_client.dart +++ b/packages/multicast_dns/lib/src/native_protocol_client.dart @@ -50,7 +50,7 @@ class ResourceRecordCache { SplayTreeMap>(); _cache[record.resourceRecordType]![record.name] = [ - record + record, ]; } else { _cache[record.resourceRecordType]![record.name]!.add(record); @@ -60,7 +60,10 @@ class ResourceRecordCache { /// Get a record from this cache. void lookup( - String name, int type, List results) { + String name, + int type, + List results, + ) { assert(ResourceRecordType.debugAssertValid(type)); final int time = DateTime.now().millisecondsSinceEpoch; final SplayTreeMap>? candidates = _cache[type]; @@ -72,8 +75,9 @@ class ResourceRecordCache { if (candidateRecords == null) { return; } - candidateRecords - .removeWhere((ResourceRecord candidate) => candidate.validUntil < time); + candidateRecords.removeWhere( + (ResourceRecord candidate) => candidate.validUntil < time, + ); results.addAll(candidateRecords.cast()); } } diff --git a/packages/multicast_dns/lib/src/packet.dart b/packages/multicast_dns/lib/src/packet.dart index 330397d..aa41cef 100644 --- a/packages/multicast_dns/lib/src/packet.dart +++ b/packages/multicast_dns/lib/src/packet.dart @@ -87,9 +87,10 @@ List encodeMDnsQuery( packetByteData.setUint16(offset, type); // QTYPE. offset += 2; packetByteData.setUint16( - offset, - ResourceRecordClass.internet | - (multicast ? QuestionType.multicast : QuestionType.unicast)); + offset, + ResourceRecordClass.internet | + (multicast ? QuestionType.multicast : QuestionType.unicast), + ); return data; } @@ -126,7 +127,11 @@ String readFQDN(List packet, [int offset = 0]) { // // If decoding fails (e.g. due to an invalid packet) `null` is returned. _FQDNReadResult _readFQDN( - Uint8List data, ByteData byteData, int offset, int length) { + Uint8List data, + ByteData byteData, + int offset, + int length, +) { void checkLength(int required) { if (length < required) { throw MDnsDecodeException(required); @@ -168,8 +173,11 @@ _FQDNReadResult _readFQDN( offset++; if (partLength > 0) { checkLength(offset + partLength); - final Uint8List partBytes = - Uint8List.view(data.buffer, offset, partLength); + final Uint8List partBytes = Uint8List.view( + data.buffer, + offset, + partLength, + ); offset += partLength; // According to the RFC, this is supposed to be utf-8 encoded, but // we should continue decoding even if it isn't to avoid dropping the @@ -258,8 +266,11 @@ List? decodeMDnsResponse(List packet) { addr.write('.'); addr.write(packetBytes.getUint8(offset)); } - return IPAddressResourceRecord(fqdn, validUntil, - address: InternetAddress(addr.toString())); + return IPAddressResourceRecord( + fqdn, + validUntil, + address: InternetAddress(addr.toString()), + ); case ResourceRecordType.addressIPv6: checkLength(offset + readDataLength); final StringBuffer addr = StringBuffer(); @@ -285,8 +296,12 @@ List? decodeMDnsResponse(List packet) { checkLength(offset + 2); final int port = packetBytes.getUint16(offset); offset += 2; - final _FQDNReadResult result = - _readFQDN(data, packetBytes, offset, length); + final _FQDNReadResult result = _readFQDN( + data, + packetBytes, + offset, + length, + ); offset += result.bytesRead; return SrvResourceRecord( fqdn, @@ -298,14 +313,14 @@ List? decodeMDnsResponse(List packet) { ); case ResourceRecordType.serverPointer: checkLength(offset + readDataLength); - final _FQDNReadResult result = - _readFQDN(data, packetBytes, offset, length); - offset += readDataLength; - return PtrResourceRecord( - fqdn, - validUntil, - domainName: result.fqdn, + final _FQDNReadResult result = _readFQDN( + data, + packetBytes, + offset, + length, ); + offset += readDataLength; + return PtrResourceRecord(fqdn, validUntil, domainName: result.fqdn); case ResourceRecordType.text: checkLength(offset + readDataLength); // The first byte of the buffer is the length of the first string of @@ -342,8 +357,12 @@ List? decodeMDnsResponse(List packet) { try { for (int i = 0; i < questionCount; i++) { - final _FQDNReadResult result = - _readFQDN(data, packetBytes, offset, length); + final _FQDNReadResult result = _readFQDN( + data, + packetBytes, + offset, + length, + ); offset += result.bytesRead; checkLength(offset + 4); offset += 4; diff --git a/packages/multicast_dns/lib/src/resource_record.dart b/packages/multicast_dns/lib/src/resource_record.dart index d58da79..8c59ab2 100644 --- a/packages/multicast_dns/lib/src/resource_record.dart +++ b/packages/multicast_dns/lib/src/resource_record.dart @@ -80,54 +80,44 @@ class ResourceRecordQuery { ) : assert(ResourceRecordType.debugAssertValid(resourceRecordType)); /// An A (IPv4) query. - ResourceRecordQuery.addressIPv4( - String name, { - bool isMulticast = true, - }) : this( - ResourceRecordType.addressIPv4, - name, - isMulticast ? QuestionType.multicast : QuestionType.unicast, - ); + ResourceRecordQuery.addressIPv4(String name, {bool isMulticast = true}) + : this( + ResourceRecordType.addressIPv4, + name, + isMulticast ? QuestionType.multicast : QuestionType.unicast, + ); /// An AAAA (IPv6) query. - ResourceRecordQuery.addressIPv6( - String name, { - bool isMulticast = true, - }) : this( - ResourceRecordType.addressIPv6, - name, - isMulticast ? QuestionType.multicast : QuestionType.unicast, - ); + ResourceRecordQuery.addressIPv6(String name, {bool isMulticast = true}) + : this( + ResourceRecordType.addressIPv6, + name, + isMulticast ? QuestionType.multicast : QuestionType.unicast, + ); /// A PTR (Server pointer) query. - ResourceRecordQuery.serverPointer( - String name, { - bool isMulticast = true, - }) : this( - ResourceRecordType.serverPointer, - name, - isMulticast ? QuestionType.multicast : QuestionType.unicast, - ); + ResourceRecordQuery.serverPointer(String name, {bool isMulticast = true}) + : this( + ResourceRecordType.serverPointer, + name, + isMulticast ? QuestionType.multicast : QuestionType.unicast, + ); /// An SRV (Service) query. - ResourceRecordQuery.service( - String name, { - bool isMulticast = true, - }) : this( - ResourceRecordType.service, - name, - isMulticast ? QuestionType.multicast : QuestionType.unicast, - ); + ResourceRecordQuery.service(String name, {bool isMulticast = true}) + : this( + ResourceRecordType.service, + name, + isMulticast ? QuestionType.multicast : QuestionType.unicast, + ); /// A TXT (Text record) query. - ResourceRecordQuery.text( - String name, { - bool isMulticast = true, - }) : this( - ResourceRecordType.text, - name, - isMulticast ? QuestionType.multicast : QuestionType.unicast, - ); + ResourceRecordQuery.text(String name, {bool isMulticast = true}) + : this( + ResourceRecordType.text, + name, + isMulticast ? QuestionType.multicast : QuestionType.unicast, + ); /// Tye type of resource record - one of [ResourceRecordType]'s values. final int resourceRecordType; @@ -244,16 +234,14 @@ class PtrResourceRecord extends ResourceRecord { /// An IP Address record for IPv4 (DNS "A") or IPv6 (DNS "AAAA") records. class IPAddressResourceRecord extends ResourceRecord { /// Creates a new IPAddressResourceRecord. - IPAddressResourceRecord( - String name, - int validUntil, { - required this.address, - }) : super( - address.type == InternetAddressType.IPv4 - ? ResourceRecordType.addressIPv4 - : ResourceRecordType.addressIPv6, - name, - validUntil); + IPAddressResourceRecord(String name, int validUntil, {required this.address}) + : super( + address.type == InternetAddressType.IPv4 + ? ResourceRecordType.addressIPv4 + : ResourceRecordType.addressIPv6, + name, + validUntil, + ); /// The [InternetAddress] for this record. final InternetAddress address; @@ -335,11 +323,8 @@ class SrvResourceRecord extends ResourceRecord { /// A Text record, contianing additional textual data (DNS "TXT"). class TxtResourceRecord extends ResourceRecord { /// Creates a new text record. - const TxtResourceRecord( - String name, - int validUntil, { - required this.text, - }) : super(ResourceRecordType.text, name, validUntil); + const TxtResourceRecord(String name, int validUntil, {required this.text}) + : super(ResourceRecordType.text, name, validUntil); /// The raw text from this record. final String text; diff --git a/packages/multicast_dns/pubspec.yaml b/packages/multicast_dns/pubspec.yaml index 15fbae4..38de03a 100644 --- a/packages/multicast_dns/pubspec.yaml +++ b/packages/multicast_dns/pubspec.yaml @@ -5,7 +5,7 @@ issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+ version: 0.3.3 environment: - sdk: ^3.6.0 + sdk: ^3.7.0 dependencies: meta: ^1.3.0 diff --git a/packages/multicast_dns/test/client_test.dart b/packages/multicast_dns/test/client_test.dart index 706e2f1..b5fef50 100644 --- a/packages/multicast_dns/test/client_test.dart +++ b/packages/multicast_dns/test/client_test.dart @@ -13,37 +13,47 @@ void main() { test('Can inject datagram socket factory and configure mdns port', () async { late int lastPort; final FakeRawDatagramSocket datagramSocket = FakeRawDatagramSocket(); - final MDnsClient client = MDnsClient(rawDatagramSocketFactory: - (dynamic host, int port, - {bool reuseAddress = true, - bool reusePort = true, - int ttl = 1}) async { - lastPort = port; - return datagramSocket; - }); + final MDnsClient client = MDnsClient( + rawDatagramSocketFactory: ( + dynamic host, + int port, { + bool reuseAddress = true, + bool reusePort = true, + int ttl = 1, + }) async { + lastPort = port; + return datagramSocket; + }, + ); await client.start( - mDnsPort: 1234, - interfacesFactory: (InternetAddressType type) async => - []); + mDnsPort: 1234, + interfacesFactory: + (InternetAddressType type) async => [], + ); expect(lastPort, 1234); }); test('Closes IPv4 sockets', () async { final FakeRawDatagramSocket datagramSocket = FakeRawDatagramSocket(); - final MDnsClient client = MDnsClient(rawDatagramSocketFactory: - (dynamic host, int port, - {bool reuseAddress = true, - bool reusePort = true, - int ttl = 1}) async { - return datagramSocket; - }); + final MDnsClient client = MDnsClient( + rawDatagramSocketFactory: ( + dynamic host, + int port, { + bool reuseAddress = true, + bool reusePort = true, + int ttl = 1, + }) async { + return datagramSocket; + }, + ); await client.start( - mDnsPort: 1234, - interfacesFactory: (InternetAddressType type) async => - []); + mDnsPort: 1234, + interfacesFactory: + (InternetAddressType type) async => [], + ); expect(datagramSocket.closed, false); client.stop(); expect(datagramSocket.closed, true); @@ -52,18 +62,23 @@ void main() { test('Closes IPv6 sockets', () async { final FakeRawDatagramSocket datagramSocket = FakeRawDatagramSocket(); datagramSocket.address = InternetAddress.anyIPv6; - final MDnsClient client = MDnsClient(rawDatagramSocketFactory: - (dynamic host, int port, - {bool reuseAddress = true, - bool reusePort = true, - int ttl = 1}) async { - return datagramSocket; - }); + final MDnsClient client = MDnsClient( + rawDatagramSocketFactory: ( + dynamic host, + int port, { + bool reuseAddress = true, + bool reusePort = true, + int ttl = 1, + }) async { + return datagramSocket; + }, + ); await client.start( - mDnsPort: 1234, - interfacesFactory: (InternetAddressType type) async => - []); + mDnsPort: 1234, + interfacesFactory: + (InternetAddressType type) async => [], + ); expect(datagramSocket.closed, false); client.stop(); expect(datagramSocket.closed, true); @@ -72,17 +87,22 @@ void main() { test('start() is idempotent', () async { final FakeRawDatagramSocket datagramSocket = FakeRawDatagramSocket(); datagramSocket.address = InternetAddress.anyIPv4; - final MDnsClient client = MDnsClient(rawDatagramSocketFactory: - (dynamic host, int port, - {bool reuseAddress = true, - bool reusePort = true, - int ttl = 1}) async { - return datagramSocket; - }); + final MDnsClient client = MDnsClient( + rawDatagramSocketFactory: ( + dynamic host, + int port, { + bool reuseAddress = true, + bool reusePort = true, + int ttl = 1, + }) async { + return datagramSocket; + }, + ); await client.start( - interfacesFactory: (InternetAddressType type) async => - []); + interfacesFactory: + (InternetAddressType type) async => [], + ); await client.start(); await client.lookup(ResourceRecordQuery.serverPointer('_')).toList(); }); @@ -92,13 +112,13 @@ void main() { { 'name': 'IPv4', 'datagramSocketType': InternetAddress.anyIPv4, - 'interfacePrefix': '192.168.2.' + 'interfacePrefix': '192.168.2.', }, { 'name': 'IPv6', 'datagramSocketType': InternetAddress.anyIPv6, - 'interfacePrefix': '2001:0db8:85a3:0000:0000:8a2e:7335:030' - } + 'interfacePrefix': '2001:0db8:85a3:0000:0000:8a2e:7335:030', + }, ]; for (final Map testCase in testCases) { @@ -109,29 +129,32 @@ void main() { testCase['datagramSocketType']! as InternetAddress; final List selectedInterfacesForSendingPackets = []; - final MDnsClient client = MDnsClient(rawDatagramSocketFactory: - (dynamic host, int port, - {bool reuseAddress = true, - bool reusePort = true, - int ttl = 1}) async { - selectedInterfacesForSendingPackets.add(host); - return datagramSocket; - }); + final MDnsClient client = MDnsClient( + rawDatagramSocketFactory: ( + dynamic host, + int port, { + bool reuseAddress = true, + bool reusePort = true, + int ttl = 1, + }) async { + selectedInterfacesForSendingPackets.add(host); + return datagramSocket; + }, + ); const int numberOfFakeInterfaces = 10; Future> fakeNetworkInterfacesFactory( - InternetAddressType type) async { + InternetAddressType type, + ) async { final List fakeInterfaces = []; // Generate "fake" interfaces for (int i = 0; i < numberOfFakeInterfaces; i++) { - fakeInterfaces.add(FakeNetworkInterface( - 'inetfake$i', - [ - InternetAddress("${testCase['interfacePrefix']! as String}$i") - ], - 0, - )); + fakeInterfaces.add( + FakeNetworkInterface('inetfake$i', [ + InternetAddress("${testCase['interfacePrefix']! as String}$i"), + ], 0), + ); } // ignore: always_specify_types @@ -142,17 +165,20 @@ void main() { testCase['datagramSocketType']! as InternetAddress; await client.start( - listenAddress: listenAddress, - mDnsPort: 1234, - interfacesFactory: fakeNetworkInterfacesFactory); + listenAddress: listenAddress, + mDnsPort: 1234, + interfacesFactory: fakeNetworkInterfacesFactory, + ); client.stop(); if (testCase['datagramSocketType'] == InternetAddress.anyIPv4) { expect(selectedInterfacesForSendingPackets.length, 1); } else { // + 1 because of unspecified address (::) - expect(selectedInterfacesForSendingPackets.length, - numberOfFakeInterfaces + 1); + expect( + selectedInterfacesForSendingPackets.length, + numberOfFakeInterfaces + 1, + ); } expect(selectedInterfacesForSendingPackets[0], listenAddress.address); }); @@ -177,8 +203,8 @@ void main() { final Completer onErrorCalledCompleter = Completer(); await client.start( mDnsPort: 1234, - interfacesFactory: (InternetAddressType type) async => - [], + interfacesFactory: + (InternetAddressType type) async => [], onError: (Object e) { expect(e, 'Error'); onErrorCalledCompleter.complete(); @@ -195,12 +221,17 @@ class FakeRawDatagramSocket extends Fake implements RawDatagramSocket { @override StreamSubscription listen( - void Function(RawSocketEvent event)? onData, - {Function? onError, - void Function()? onDone, - bool? cancelOnError}) { - return const Stream.empty().listen(onData, - onError: onError, cancelOnError: cancelOnError, onDone: onDone); + void Function(RawSocketEvent event)? onData, { + Function? onError, + void Function()? onDone, + bool? cancelOnError, + }) { + return const Stream.empty().listen( + onData, + onError: onError, + cancelOnError: cancelOnError, + onDone: onDone, + ); } bool closed = false; diff --git a/packages/multicast_dns/test/decode_test.dart b/packages/multicast_dns/test/decode_test.dart index 358f764..7d5d16b 100644 --- a/packages/multicast_dns/test/decode_test.dart +++ b/packages/multicast_dns/test/decode_test.dart @@ -63,8 +63,11 @@ void testValidPackages() { result[3].validUntil, text: '', ), - PtrResourceRecord('_services._dns-sd._udp.local', result[4].validUntil, - domainName: '_udisks-ssh._tcp.local'), + PtrResourceRecord( + '_services._dns-sd._udp.local', + result[4].validUntil, + domainName: '_udisks-ssh._tcp.local', + ), PtrResourceRecord( '_workstation._tcp.local', result[5].validUntil, @@ -145,25 +148,27 @@ void testValidPackages() { }); // Fixes https://github.com/flutter/flutter/issues/31854 - test('Can decode packages without question and with answer and additional', - () { - final List result = - decodeMDnsResponse(packetWithoutQuestionWithAnArCount)!; - expect(result, isNotNull); - expect(result.length, 2); - expect(result, [ - PtrResourceRecord( - '_______________.____._____', - result[0].validUntil, - domainName: '______________________._______________.____._____', - ), - TxtResourceRecord( - '______________________.____________.____._____', - result[1].validUntil, - text: 'model=MacBookPro14,3\nosxvers=18\necolor=225,225,223\n', - ), - ]); - }); + test( + 'Can decode packages without question and with answer and additional', + () { + final List result = + decodeMDnsResponse(packetWithoutQuestionWithAnArCount)!; + expect(result, isNotNull); + expect(result.length, 2); + expect(result, [ + PtrResourceRecord( + '_______________.____._____', + result[0].validUntil, + domainName: '______________________._______________.____._____', + ), + TxtResourceRecord( + '______________________.____________.____._____', + result[1].validUntil, + text: 'model=MacBookPro14,3\nosxvers=18\necolor=225,225,223\n', + ), + ]); + }, + ); test('Can decode packages with a long text resource', () { final List result = decodeMDnsResponse(packetWithLongTxt)!; @@ -200,8 +205,10 @@ void testBadPackages() { void testPTRRData() { test('Can read FQDN from PTR data', () { - expect('sgjesse-macbookpro2 [78:31:c1:b8:55:38]._workstation._tcp.local', - readFQDN(ptrRData)); + expect( + 'sgjesse-macbookpro2 [78:31:c1:b8:55:38]._workstation._tcp.local', + readFQDN(ptrRData), + ); expect('fletch-agent._fletch_agent._tcp.local', readFQDN(ptrRData2)); }); } @@ -268,7 +275,7 @@ const List package1 = [ 0xc0, 0xa8, 0x01, - 0xbf + 0xbf, ]; // Two addresses. @@ -333,7 +340,7 @@ const List package2 = [ 0xa9, 0xfe, 0x5f, - 0x53 + 0x53, ]; // Eight mixed answers. @@ -585,7 +592,7 @@ const List package3 = [ 0x00, 0x02, 0xc0, - 0x2c + 0x2c, ]; /// Contains compressed domain names where a there is a cycle amongst the @@ -621,7 +628,7 @@ const List cycle = [ 0xc0, 0xa8, 0x01, - 0xbf + 0xbf, ]; const List packagePtrResponse = [ @@ -807,7 +814,7 @@ const List packagePtrResponse = [ 0xa9, 0xfe, 0xa7, - 0xac + 0xac, ]; const List ptrRData = [ @@ -875,7 +882,7 @@ const List ptrRData = [ 0x63, 0x61, 0x6c, - 0x00 + 0x00, ]; const List ptrRData2 = [ @@ -917,7 +924,7 @@ const List ptrRData2 = [ 0x63, 0x61, 0x6c, - 0x00 + 0x00, ]; const List srvRData = [ @@ -940,7 +947,7 @@ const List srvRData = [ 0x63, 0x61, 0x6c, - 0x00 + 0x00, ]; const List packetWithQuestionAnArCount = [ @@ -1637,5 +1644,5 @@ const List nonUtf8Package = [ 0x00, 0x02, 0xc0, - 0x2c + 0x2c, ]; diff --git a/packages/multicast_dns/test/lookup_resolver_test.dart b/packages/multicast_dns/test/lookup_resolver_test.dart index db3e3a3..1188ec2 100644 --- a/packages/multicast_dns/test/lookup_resolver_test.dart +++ b/packages/multicast_dns/test/lookup_resolver_test.dart @@ -25,7 +25,10 @@ void testTimeout() { const Duration shortTimeout = Duration(milliseconds: 1); final LookupResolver resolver = LookupResolver(); final Stream result = resolver.addPendingRequest( - ResourceRecordType.addressIPv4, 'xxx', shortTimeout); + ResourceRecordType.addressIPv4, + 'xxx', + shortTimeout, + ); expect(await result.isEmpty, isTrue); }); } @@ -36,9 +39,14 @@ void testResult() { const Duration noTimeout = Duration(days: 1); final LookupResolver resolver = LookupResolver(); final Stream futureResult = resolver.addPendingRequest( - ResourceRecordType.addressIPv4, 'xxx.local', noTimeout); - final ResourceRecord response = - ip4Result('xxx.local', InternetAddress('1.2.3.4')); + ResourceRecordType.addressIPv4, + 'xxx.local', + noTimeout, + ); + final ResourceRecord response = ip4Result( + 'xxx.local', + InternetAddress('1.2.3.4'), + ); resolver.handleResponse([response]); final IPAddressResourceRecord result = await futureResult.first as IPAddressResourceRecord; @@ -52,13 +60,23 @@ void testResult2() { const Duration noTimeout = Duration(days: 1); final LookupResolver resolver = LookupResolver(); final Stream futureResult1 = resolver.addPendingRequest( - ResourceRecordType.addressIPv4, 'xxx.local', noTimeout); + ResourceRecordType.addressIPv4, + 'xxx.local', + noTimeout, + ); final Stream futureResult2 = resolver.addPendingRequest( - ResourceRecordType.addressIPv4, 'yyy.local', noTimeout); - final ResourceRecord response1 = - ip4Result('xxx.local', InternetAddress('1.2.3.4')); - final ResourceRecord response2 = - ip4Result('yyy.local', InternetAddress('2.3.4.5')); + ResourceRecordType.addressIPv4, + 'yyy.local', + noTimeout, + ); + final ResourceRecord response1 = ip4Result( + 'xxx.local', + InternetAddress('1.2.3.4'), + ); + final ResourceRecord response2 = ip4Result( + 'yyy.local', + InternetAddress('2.3.4.5'), + ); resolver.handleResponse([response2, response1]); final IPAddressResourceRecord result1 = await futureResult1.first as IPAddressResourceRecord; @@ -74,20 +92,32 @@ void testResult3() { test('Multiple requests', () async { const Duration noTimeout = Duration(days: 1); final LookupResolver resolver = LookupResolver(); - final ResourceRecord response0 = - ip4Result('zzz.local', InternetAddress('2.3.4.5')); + final ResourceRecord response0 = ip4Result( + 'zzz.local', + InternetAddress('2.3.4.5'), + ); resolver.handleResponse([response0]); final Stream futureResult1 = resolver.addPendingRequest( - ResourceRecordType.addressIPv4, 'xxx.local', noTimeout); + ResourceRecordType.addressIPv4, + 'xxx.local', + noTimeout, + ); resolver.handleResponse([response0]); final Stream futureResult2 = resolver.addPendingRequest( - ResourceRecordType.addressIPv4, 'yyy.local', noTimeout); + ResourceRecordType.addressIPv4, + 'yyy.local', + noTimeout, + ); resolver.handleResponse([response0]); - final ResourceRecord response1 = - ip4Result('xxx.local', InternetAddress('1.2.3.4')); + final ResourceRecord response1 = ip4Result( + 'xxx.local', + InternetAddress('1.2.3.4'), + ); resolver.handleResponse([response0]); - final ResourceRecord response2 = - ip4Result('yyy.local', InternetAddress('2.3.4.5')); + final ResourceRecord response2 = ip4Result( + 'yyy.local', + InternetAddress('2.3.4.5'), + ); resolver.handleResponse([response0]); resolver.handleResponse([response2, response1]); resolver.handleResponse([response0]); diff --git a/packages/multicast_dns/test/resource_record_cache_test.dart b/packages/multicast_dns/test/resource_record_cache_test.dart index 21aed34..11be627 100644 --- a/packages/multicast_dns/test/resource_record_cache_test.dart +++ b/packages/multicast_dns/test/resource_record_cache_test.dart @@ -29,14 +29,14 @@ void testOverwrite() { // Add two different records. cache.updateRecords([ IPAddressResourceRecord('hest', valid, address: ip1), - IPAddressResourceRecord('fisk', valid, address: ip2) + IPAddressResourceRecord('fisk', valid, address: ip2), ]); expect(cache.entryCount, 2); // Update these records. cache.updateRecords([ IPAddressResourceRecord('hest', valid, address: ip1), - IPAddressResourceRecord('fisk', valid, address: ip2) + IPAddressResourceRecord('fisk', valid, address: ip2), ]); expect(cache.entryCount, 2); @@ -44,7 +44,7 @@ void testOverwrite() { // with that name only.) cache.updateRecords([ IPAddressResourceRecord('hest', valid, address: ip1), - IPAddressResourceRecord('hest', valid, address: ip2) + IPAddressResourceRecord('hest', valid, address: ip2), ]); expect(cache.entryCount, 3); @@ -64,12 +64,13 @@ void testTimeout() { final ResourceRecordCache cache = ResourceRecordCache(); - cache.updateRecords( - [IPAddressResourceRecord('hest', valid, address: ip1)]); + cache.updateRecords([ + IPAddressResourceRecord('hest', valid, address: ip1), + ]); expect(cache.entryCount, 1); cache.updateRecords([ - IPAddressResourceRecord('fisk', notValid, address: ip1) + IPAddressResourceRecord('fisk', notValid, address: ip1), ]); List results = []; diff --git a/packages/standard_message_codec/CHANGELOG.md b/packages/standard_message_codec/CHANGELOG.md index 5593c94..6196c6a 100644 --- a/packages/standard_message_codec/CHANGELOG.md +++ b/packages/standard_message_codec/CHANGELOG.md @@ -1,6 +1,6 @@ ## NEXT -* Updates minimum supported SDK version to Flutter 3.27/Dart 3.6. +* Updates minimum supported SDK version to Flutter 3.29/Dart 3.7. ## 0.0.1+4 diff --git a/packages/standard_message_codec/README.md b/packages/standard_message_codec/README.md index ab736b6..9714a6d 100644 --- a/packages/standard_message_codec/README.md +++ b/packages/standard_message_codec/README.md @@ -45,11 +45,10 @@ or pure Dart applications. ```dart void main() { - final ByteData? data = - const StandardMessageCodec().encodeMessage({ - 'foo': true, - 3: 'fizz', - }); + final ByteData? data = const StandardMessageCodec().encodeMessage( + {'foo': true, 3: 'fizz'}, + ); print('The encoded message is $data'); } + ``` diff --git a/packages/standard_message_codec/example/lib/readme_excerpts.dart b/packages/standard_message_codec/example/lib/readme_excerpts.dart index f403ad0..6e68003 100644 --- a/packages/standard_message_codec/example/lib/readme_excerpts.dart +++ b/packages/standard_message_codec/example/lib/readme_excerpts.dart @@ -12,11 +12,10 @@ import 'package:standard_message_codec/standard_message_codec.dart'; // #docregion Encoding void main() { - final ByteData? data = - const StandardMessageCodec().encodeMessage({ - 'foo': true, - 3: 'fizz', - }); + final ByteData? data = const StandardMessageCodec().encodeMessage( + {'foo': true, 3: 'fizz'}, + ); print('The encoded message is $data'); } + // #enddocregion Encoding diff --git a/packages/standard_message_codec/example/pubspec.yaml b/packages/standard_message_codec/example/pubspec.yaml index 44e0ee8..e3faa94 100644 --- a/packages/standard_message_codec/example/pubspec.yaml +++ b/packages/standard_message_codec/example/pubspec.yaml @@ -4,7 +4,7 @@ version: 0.0.1 publish_to: none environment: - sdk: ^3.6.0 + sdk: ^3.7.0 dependencies: standard_message_codec: diff --git a/packages/standard_message_codec/lib/src/serialization.dart b/packages/standard_message_codec/lib/src/serialization.dart index cdcf9b3..73dc650 100644 --- a/packages/standard_message_codec/lib/src/serialization.dart +++ b/packages/standard_message_codec/lib/src/serialization.dart @@ -31,7 +31,10 @@ class WriteBuffer { final ByteData eightBytes = ByteData(8); final Uint8List eightBytesAsList = eightBytes.buffer.asUint8List(); return WriteBuffer._( - Uint8List(startCapacity), eightBytes, eightBytesAsList); + Uint8List(startCapacity), + eightBytes, + eightBytesAsList, + ); } WriteBuffer._(this._buffer, this._eightBytes, this._eightBytesAsList); @@ -166,7 +169,8 @@ class WriteBuffer { ByteData done() { if (_isDone) { throw StateError( - 'done() must not be called more than once on the same $runtimeType.'); + 'done() must not be called more than once on the same $runtimeType.', + ); } final ByteData result = _buffer.buffer.asByteData(0, _currentSize); _buffer = Uint8List(0); @@ -234,8 +238,10 @@ class ReadBuffer { /// Reads the given number of Uint8s from the buffer. Uint8List getUint8List(int length) { - final Uint8List list = - data.buffer.asUint8List(data.offsetInBytes + _position, length); + final Uint8List list = data.buffer.asUint8List( + data.offsetInBytes + _position, + length, + ); _position += length; return list; } @@ -243,8 +249,10 @@ class ReadBuffer { /// Reads the given number of Int32s from the buffer. Int32List getInt32List(int length) { _alignTo(4); - final Int32List list = - data.buffer.asInt32List(data.offsetInBytes + _position, length); + final Int32List list = data.buffer.asInt32List( + data.offsetInBytes + _position, + length, + ); _position += 4 * length; return list; } @@ -252,8 +260,10 @@ class ReadBuffer { /// Reads the given number of Int64s from the buffer. Int64List getInt64List(int length) { _alignTo(8); - final Int64List list = - data.buffer.asInt64List(data.offsetInBytes + _position, length); + final Int64List list = data.buffer.asInt64List( + data.offsetInBytes + _position, + length, + ); _position += 8 * length; return list; } @@ -261,8 +271,10 @@ class ReadBuffer { /// Reads the given number of Float32s from the buffer Float32List getFloat32List(int length) { _alignTo(4); - final Float32List list = - data.buffer.asFloat32List(data.offsetInBytes + _position, length); + final Float32List list = data.buffer.asFloat32List( + data.offsetInBytes + _position, + length, + ); _position += 4 * length; return list; } @@ -270,8 +282,10 @@ class ReadBuffer { /// Reads the given number of Float64s from the buffer. Float64List getFloat64List(int length) { _alignTo(8); - final Float64List list = - data.buffer.asFloat64List(data.offsetInBytes + _position, length); + final Float64List list = data.buffer.asFloat64List( + data.offsetInBytes + _position, + length, + ); _position += 8 * length; return list; } diff --git a/packages/standard_message_codec/lib/standard_message_codec.dart b/packages/standard_message_codec/lib/standard_message_codec.dart index cdb70fe..f742125 100644 --- a/packages/standard_message_codec/lib/standard_message_codec.dart +++ b/packages/standard_message_codec/lib/standard_message_codec.dart @@ -160,8 +160,9 @@ class StandardMessageCodec implements MessageCodec { if (message == null) { return null; } - final WriteBuffer buffer = - WriteBuffer(startCapacity: _writeBufferStartCapacity); + final WriteBuffer buffer = WriteBuffer( + startCapacity: _writeBufferStartCapacity, + ); writeValue(buffer, message); return buffer.done(); } diff --git a/packages/standard_message_codec/pubspec.yaml b/packages/standard_message_codec/pubspec.yaml index 0421d5d..ddfb1a8 100644 --- a/packages/standard_message_codec/pubspec.yaml +++ b/packages/standard_message_codec/pubspec.yaml @@ -5,7 +5,7 @@ repository: https://github.com/flutter/packages/tree/main/packages/standard_mess issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3Astandard_message_codec environment: - sdk: ^3.6.0 + sdk: ^3.7.0 dev_dependencies: test: ^1.16.0 diff --git a/packages/standard_message_codec/test/standard_message_codec_test.dart b/packages/standard_message_codec/test/standard_message_codec_test.dart index 299bfa2..bb4cfc7 100644 --- a/packages/standard_message_codec/test/standard_message_codec_test.dart +++ b/packages/standard_message_codec/test/standard_message_codec_test.dart @@ -68,14 +68,18 @@ void main() { expect(read.getInt64(), equals(-9000000000000)); }, testOn: 'vm' /* Int64 isn't supported on web */); - test('of 64-bit integer in big endian', () { - final WriteBuffer write = WriteBuffer(); - write.putInt64(-9000000000000, endian: Endian.big); - final ByteData written = write.done(); - expect(written.lengthInBytes, equals(8)); - final ReadBuffer read = ReadBuffer(written); - expect(read.getInt64(endian: Endian.big), equals(-9000000000000)); - }, testOn: 'vm' /* Int64 isn't supported on web */); + test( + 'of 64-bit integer in big endian', + () { + final WriteBuffer write = WriteBuffer(); + write.putInt64(-9000000000000, endian: Endian.big); + final ByteData written = write.done(); + expect(written.lengthInBytes, equals(8)); + final ReadBuffer read = ReadBuffer(written); + expect(read.getInt64(endian: Endian.big), equals(-9000000000000)); + }, + testOn: 'vm' /* Int64 isn't supported on web */, + ); test('of double', () { final WriteBuffer write = WriteBuffer(); @@ -105,21 +109,27 @@ void main() { expect(read.getInt32List(3), equals(integers)); }); - test('of 64-bit int list when unaligned', () { - final Int64List integers = Int64List.fromList([-99, 2, 99]); - final WriteBuffer write = WriteBuffer(); - write.putUint8(9); - write.putInt64List(integers); - final ByteData written = write.done(); - expect(written.lengthInBytes, equals(32)); - final ReadBuffer read = ReadBuffer(written); - read.getUint8(); - expect(read.getInt64List(3), equals(integers)); - }, testOn: 'vm' /* Int64 isn't supported on web */); + test( + 'of 64-bit int list when unaligned', + () { + final Int64List integers = Int64List.fromList([-99, 2, 99]); + final WriteBuffer write = WriteBuffer(); + write.putUint8(9); + write.putInt64List(integers); + final ByteData written = write.done(); + expect(written.lengthInBytes, equals(32)); + final ReadBuffer read = ReadBuffer(written); + read.getUint8(); + expect(read.getInt64List(3), equals(integers)); + }, + testOn: 'vm' /* Int64 isn't supported on web */, + ); test('of float list when unaligned', () { - final Float32List floats = - Float32List.fromList([3.14, double.nan]); + final Float32List floats = Float32List.fromList([ + 3.14, + double.nan, + ]); final WriteBuffer write = WriteBuffer(); write.putUint8(9); write.putFloat32List(floats); @@ -133,8 +143,10 @@ void main() { }); test('of double list when unaligned', () { - final Float64List doubles = - Float64List.fromList([3.14, double.nan]); + final Float64List doubles = Float64List.fromList([ + 3.14, + double.nan, + ]); final WriteBuffer write = WriteBuffer(); write.putUint8(9); write.putFloat64List(doubles); @@ -155,7 +167,9 @@ void main() { test('empty WriteBuffer', () { expect( - () => WriteBuffer(startCapacity: 0), throwsA(isA())); + () => WriteBuffer(startCapacity: 0), + throwsA(isA()), + ); }); test('size 1', () { From c202ca67eb3fb517904d06a1f4c9cbae536e48c6 Mon Sep 17 00:00:00 2001 From: stuartmorgan-g Date: Thu, 4 Sep 2025 09:54:26 -0400 Subject: [PATCH 104/118] [mustache_template] Initial import (#9944) The `mustache_template` package has been transferred to the `flutter.dev` publisher, so this imports it into our repository and updates it to follow repository conventions: - Fix/suppress analysis warnings - Some via `dart fix`, some manual - Add repo-level metadata - Update license check command to recognize this package - Add a temporary code-excerpt exclusion - Update pubspec.yaml metadata - Bump version to 2.0.1 to release the changes `mustache_template` was itself a fork by a Flutter team member of the third-party `mustache` package, so the import is into `third_party/packages/`, updating the repo license check to recognize the license of this package. The original code is quite old, and as a result still used a lot of implicit dynamic typing. Some of that that has been addressed in this import, but the trickier aspects have been left for future work, as converting from implicit dynamic typing to specified types has the potential for runtime regressions. (It's possible that even the more minor changes made here will cause regressions that will need fast-follow, but all the tests still pass, and the manual `test/all.dart` tests do not have any failures that were not present before making changes to the imported code). Issues filed for future follow-up work: https://github.com/flutter/flutter/issues/174721 https://github.com/flutter/flutter/issues/174722 https://github.com/flutter/flutter/issues/174742 ## Pre-Review Checklist [^1]: Regular contributors who have demonstrated familiarity with the repository guidelines only need to comment if the PR is not auto-exempted by repo tooling. --- .../packages/mustache_template/CHANGELOG.md | 71 ++ .../packages/mustache_template/LICENSE | 8 + .../packages/mustache_template/METADATA | 15 + .../packages/mustache_template/README.md | 117 +++ .../packages/mustache_template/dart_test.yaml | 6 + .../mustache_template/lib/mustache.dart | 98 ++ .../lib/mustache_template.dart | 1 + .../lib/src/lambda_context.dart | 138 +++ .../mustache_template/lib/src/node.dart | 100 ++ .../mustache_template/lib/src/parser.dart | 428 ++++++++ .../mustache_template/lib/src/renderer.dart | 326 +++++++ .../mustache_template/lib/src/scanner.dart | 390 ++++++++ .../mustache_template/lib/src/template.dart | 58 ++ .../lib/src/template_exception.dart | 124 +++ .../mustache_template/lib/src/token.dart | 38 + .../packages/mustache_template/pubspec.yaml | 14 + .../packages/mustache_template/test/all.dart | 9 + .../mustache_template/test/download-spec.sh | 1 + .../test/mustache_specs.dart | 131 +++ .../mustache_template/test/mustache_test.dart | 919 ++++++++++++++++++ .../test/no_spec/whitespace.js | 52 + .../test/no_spec/whitespace.py | 49 + .../mustache_template/test/parser_test.dart | 442 +++++++++ 23 files changed, 3535 insertions(+) create mode 100644 third_party/packages/mustache_template/CHANGELOG.md create mode 100644 third_party/packages/mustache_template/LICENSE create mode 100644 third_party/packages/mustache_template/METADATA create mode 100644 third_party/packages/mustache_template/README.md create mode 100644 third_party/packages/mustache_template/dart_test.yaml create mode 100644 third_party/packages/mustache_template/lib/mustache.dart create mode 100644 third_party/packages/mustache_template/lib/mustache_template.dart create mode 100644 third_party/packages/mustache_template/lib/src/lambda_context.dart create mode 100644 third_party/packages/mustache_template/lib/src/node.dart create mode 100644 third_party/packages/mustache_template/lib/src/parser.dart create mode 100644 third_party/packages/mustache_template/lib/src/renderer.dart create mode 100644 third_party/packages/mustache_template/lib/src/scanner.dart create mode 100644 third_party/packages/mustache_template/lib/src/template.dart create mode 100644 third_party/packages/mustache_template/lib/src/template_exception.dart create mode 100644 third_party/packages/mustache_template/lib/src/token.dart create mode 100644 third_party/packages/mustache_template/pubspec.yaml create mode 100644 third_party/packages/mustache_template/test/all.dart create mode 100755 third_party/packages/mustache_template/test/download-spec.sh create mode 100644 third_party/packages/mustache_template/test/mustache_specs.dart create mode 100644 third_party/packages/mustache_template/test/mustache_test.dart create mode 100644 third_party/packages/mustache_template/test/no_spec/whitespace.js create mode 100644 third_party/packages/mustache_template/test/no_spec/whitespace.py create mode 100644 third_party/packages/mustache_template/test/parser_test.dart diff --git a/third_party/packages/mustache_template/CHANGELOG.md b/third_party/packages/mustache_template/CHANGELOG.md new file mode 100644 index 0000000..fd1da85 --- /dev/null +++ b/third_party/packages/mustache_template/CHANGELOG.md @@ -0,0 +1,71 @@ +## 2.0.1 + +* Transfers the package source from https://github.com/jonahwilliams/mustache + to https://github.com/flutter/packages. +* Updates minimum supported SDK version to Dart 3.7. +* Updates code for new analysis options. + +## 2.0.0 + +* Support for null safe dart added. + +## 1.0.0+1 + +* Fixed regression where lookups from list did not work. Removed failing tests + that depend on reflection. + +## 1.0.0 + +* Forked from original repo. Support for mirrors removed. + +## Fork + +## 1.1.1 + +* Fixed error "boolean expression must not be null". Thanks Nico. + +## 1.1.0 + +* Better support for class members in sections. Thanks to Janice Collins. +* Set the SDK constraint to Dart 2+. + +## 1.0.2 + Set the max SDK constraint to <3.0.0. + +## 0.2.5 + +* Remove MustacheFormatException +* Allow templates to specify default delimiters. Thanks to Joris Hermans. +* Fix #24: renderString shrinks multiple newlines to just one (Thanks to John Ryan for the repro). + +## 0.2.4 + +* Fix #23 failure if tag or comment contains "=" + +## 0.2.3 + +* Change handling of lenient sections to match python mustache implementation. + +## 0.2.2 + +* Fix MirrorsUsed tag for using mirrors on dart2js. +* Clean up dead code. + +## 0.2.1 + +* Added new methods to LambdaContext. + +## 0.2 + +* Deprecated parse() function - please update your code to use new Template(source). +* Deprecated MustacheFormatException - please update your code to use TemplateException. +* Breaking change: Template.render and Template.renderString methods no longer + take the optional lenient and htmlEscapeValues. These should now be passed to + the Template constructor. +* Fully passing all mustache spec tests. +* Added support for MirrorsUsed. +* Implemented partials. #11 +* Implemented lambdas. #4 +* Implemented change delimiter tag. +* Add template name parameter, and show this in error messages. +* Allow whitespace at begining of tags. #10 diff --git a/third_party/packages/mustache_template/LICENSE b/third_party/packages/mustache_template/LICENSE new file mode 100644 index 0000000..6bb39e4 --- /dev/null +++ b/third_party/packages/mustache_template/LICENSE @@ -0,0 +1,8 @@ +Copyright (c) 2013, Greg Lowe +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. +Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/third_party/packages/mustache_template/METADATA b/third_party/packages/mustache_template/METADATA new file mode 100644 index 0000000..5025060 --- /dev/null +++ b/third_party/packages/mustache_template/METADATA @@ -0,0 +1,15 @@ +name: "mustache_template" +description: + "Mustache template Dart library" + +third_party { + identifier { + type: "Git" + value: "https://github.com/jonahwilliams/mustache" + primary_source: true + version: "c4344e0dd45f6605758eb11aa4837859e2c055f0" + } + version: "c4344e0dd45f6605758eb11aa4837859e2c055f0" + last_upgrade_date { year: 2025 month: 9 day: 3 } + license_type: NOTICE +} diff --git a/third_party/packages/mustache_template/README.md b/third_party/packages/mustache_template/README.md new file mode 100644 index 0000000..7602c27 --- /dev/null +++ b/third_party/packages/mustache_template/README.md @@ -0,0 +1,117 @@ +# Mustache templates + +A Dart library to parse and render [mustache templates](https://mustache.github.io/). + +See the [mustache manual](http://mustache.github.com/mustache.5.html) for detailed usage information. + +This library passes all [mustache specification](https://github.com/mustache/spec/tree/master/specs) tests. + +## Example usage +```dart +import 'package:mustache_template/mustache_template.dart'; + +main() { + var source = ''' + {{# names }} +
{{ lastname }}, {{ firstname }}
+ {{/ names }} + {{^ names }} +
No names.
+ {{/ names }} + {{! I am a comment. }} + '''; + + var template = Template(source, name: 'template-filename.html'); + + var output = template.renderString({'names': [ + {'firstname': 'Greg', 'lastname': 'Lowe'}, + {'firstname': 'Bob', 'lastname': 'Johnson'} + ]}); + + print(output); +} +``` + +A template is parsed when it is created, after parsing it can be rendered any number of times with different values. A TemplateException is thrown if there is a problem parsing or rendering the template. + +The Template contstructor allows passing a name, this name will be used in error messages. When working with a number of templates, it is important to pass a name so that the error messages specify which template caused the error. + +By default all output from `{{variable}}` tags is html escaped, this behaviour can be changed by passing htmlEscapeValues : false to the Template constructor. You can also use a `{{{triple mustache}}}` tag, or a unescaped variable tag `{{&unescaped}}`, the output from these tags is not escaped. + +## Differences between strict mode and lenient mode. + +### Strict mode (default) + +* Tag names may only contain the characters a-z, A-Z, 0-9, underscore, period and minus. Other characters in tags will cause a TemplateException to be thrown during parsing. + +* During rendering, if no map key or object member which matches the tag name is found, then a TemplateException will be thrown. + +### Lenient mode + +* Tag names may use any characters. +* During rendering, if no map key or object member which matches the tag name is found, then silently ignore and output nothing. + +## Nested paths + +```dart + var t = Template('{{ author.name }}'); + var output = template.renderString({'author': {'name': 'Greg Lowe'}}); +``` + +## Partials - example usage + +```dart + +var partial = Template('{{ foo }}', name: 'partial'); + +var resolver = (String name) { + if (name == 'partial-name') { // Name of partial tag. + return partial; + } +}; + +var t = Template('{{> partial-name }}', partialResolver: resolver); + +var output = t.renderString({'foo': 'bar'}); // bar + +``` + +## Lambdas - example usage + +```dart +var t = Template('{{# foo }}'); +var lambda = (_) => 'bar'; +t.renderString({'foo': lambda}); // bar +``` + +```dart +var t = Template('{{# foo }}hidden{{/ foo }}'); +var lambda = (_) => 'shown'; +t.renderString('foo': lambda); // shown +``` + +```dart +var t = Template('{{# foo }}oi{{/ foo }}'); +var lambda = (LambdaContext ctx) => '${ctx.renderString().toUpperCase()}'; +t.renderString({'foo': lambda}); // OI +``` + +```dart +var t = Template('{{# foo }}{{bar}}{{/ foo }}'); +var lambda = (LambdaContext ctx) => '${ctx.renderString().toUpperCase()}'; +t.renderString({'foo': lambda, 'bar': 'pub'}); // PUB +``` + +```dart +var t = Template('{{# foo }}{{bar}}{{/ foo }}'); +var lambda = (LambdaContext ctx) => '${ctx.renderString().toUpperCase()}'; +t.renderString({'foo': lambda, 'bar': 'pub'}); // PUB +``` + +In the following example `LambdaContext.renderSource(source)` re-parses the source string in the current context, this is the default behaviour in many mustache implementations. Since re-parsing the content is slow, and often not required, this library makes this step optional. + +```dart +var t = Template('{{# foo }}{{bar}}{{/ foo }}'); +var lambda = (LambdaContext ctx) => ctx.renderSource(ctx.source + ' {{cmd}}'); +t.renderString({'foo': lambda, 'bar': 'pub', 'cmd': 'build'}); // pub build +``` diff --git a/third_party/packages/mustache_template/dart_test.yaml b/third_party/packages/mustache_template/dart_test.yaml new file mode 100644 index 0000000..cdb656d --- /dev/null +++ b/third_party/packages/mustache_template/dart_test.yaml @@ -0,0 +1,6 @@ +# See https://github.com/dart-lang/test/blob/master/pkgs/test/doc/configuration.md#arguments +override_platforms: + chrome: + settings: + executable: chrome + arguments: --no-sandbox diff --git a/third_party/packages/mustache_template/lib/mustache.dart b/third_party/packages/mustache_template/lib/mustache.dart new file mode 100644 index 0000000..678f5a0 --- /dev/null +++ b/third_party/packages/mustache_template/lib/mustache.dart @@ -0,0 +1,98 @@ +import 'src/template.dart' as t; + +/// A Template can be efficiently rendered multiple times with different +/// values. +abstract class Template { + /// The constructor parses the template source and throws [TemplateException] + /// if the syntax of the source is invalid. + /// Tag names may only contain characters a-z, A-Z, 0-9, underscore, and minus, + /// unless lenient mode is specified. + factory Template( + String source, { + bool lenient, + bool htmlEscapeValues, + String name, + PartialResolver? partialResolver, + String delimiters, + }) = t.Template.fromSource; + + /// An optional name used to identify the template in error logging. + String? get name; + + /// The template that should be filled when calling [render] or + /// [renderString]. + String get source; + + /// [values] can be a combination of Map, List, String. Any non-String object + /// will be converted using toString(). Null values will cause a + /// [TemplateException], unless lenient module is enabled. + String renderString(Object? values); + + /// [values] can be a combination of Map, List, String. Any non-String object + /// will be converted using toString(). Null values will cause a + /// [TemplateException], unless lenient module is enabled. + void render(Object? values, StringSink sink); +} + +// TODO(stuartmorgan): Remove this. See https://github.com/flutter/flutter/issues/174722. +// ignore: public_member_api_docs +typedef PartialResolver = Template? Function(String); + +// TODO(stuartmorgan): Remove this. See https://github.com/flutter/flutter/issues/174722. +// ignore: public_member_api_docs +typedef LambdaFunction = Object Function(LambdaContext context); + +/// Passed as an argument to a mustache lambda function. The methods on +/// this object may only be called before the lambda function returns. If a +/// method is called after it has returned an exception will be thrown. +abstract class LambdaContext { + /// Render the current section tag in the current context and return the + /// result as a string. If provided, value will be added to the top of the + /// context's stack. + String renderString({Object? value}); + + /// Render and directly output the current section tag. If provided, value + /// will be added to the top of the context's stack. + void render({Object value}); + + /// Output a string. The output will not be html escaped, and will be written + /// before the output returned from the lambda. + void write(Object object); + + /// Get the unevaluated template source for the current section tag. + String get source; + + /// Evaluate the string as a mustache template using the current context. If + /// provided, value will be added to the top of the context's stack. + String renderSource(String source, {Object? value}); + + /// Lookup the value of a variable in the current context. + Object? lookup(String variableName); +} + +/// [TemplateException] is used to obtain the line and column numbers +/// of the token which caused parse or render to fail. +abstract class TemplateException implements Exception { + /// A message describing the problem parsing or rendering the template. + String get message; + + /// The name used to identify the template, as passed to the Template + /// constructor. + String? get templateName; + + /// The 1-based line number of the token where formatting error was found. + int get line; + + /// The 1-based column number of the token where formatting error was found. + int get column; + + /// The character offset within the template source. + int? get offset; + + /// The template source. + String? get source; + + /// A short source substring of the source at the point the problem occurred + /// with parsing or rendering. + String get context; +} diff --git a/third_party/packages/mustache_template/lib/mustache_template.dart b/third_party/packages/mustache_template/lib/mustache_template.dart new file mode 100644 index 0000000..299de3a --- /dev/null +++ b/third_party/packages/mustache_template/lib/mustache_template.dart @@ -0,0 +1 @@ +export 'mustache.dart'; diff --git a/third_party/packages/mustache_template/lib/src/lambda_context.dart b/third_party/packages/mustache_template/lib/src/lambda_context.dart new file mode 100644 index 0000000..1dcd568 --- /dev/null +++ b/third_party/packages/mustache_template/lib/src/lambda_context.dart @@ -0,0 +1,138 @@ +// TODO(stuartmorgan): Remove this. See https://github.com/flutter/flutter/issues/174722. +// ignore_for_file: public_member_api_docs + +import '../mustache.dart' as m; + +import 'node.dart'; +import 'parser.dart' as parser; +import 'renderer.dart'; +import 'template_exception.dart'; + +/// Passed as an argument to a mustache lambda function. +class LambdaContext implements m.LambdaContext { + LambdaContext(this._node, this._renderer); + final Node _node; + final Renderer _renderer; + bool _closed = false; + + void close() { + _closed = true; + } + + void _checkClosed() { + if (_closed) { + throw _error('LambdaContext accessed outside of callback.'); + } + } + + TemplateException _error(String msg) { + return TemplateException( + msg, + _renderer.templateName, + _renderer.source, + _node.start, + ); + } + + @override + String renderString({Object? value}) { + _checkClosed(); + if (_node is! SectionNode) { + // TODO(stuartmorgan): Fix the lack of `throw` here, which looks like a + // bug in the original code. + _error( + 'LambdaContext.renderString() can only be called on section tags.', + ); + } + final StringBuffer sink = StringBuffer(); + _renderSubtree(sink, value); + return sink.toString(); + } + + void _renderSubtree(StringSink sink, Object? value) { + final Renderer renderer = Renderer.subtree(_renderer, sink); + final SectionNode section = _node as SectionNode; + if (value != null) { + renderer.push(value); + } + renderer.render(section.children); + } + + @override + void render({Object? value}) { + _checkClosed(); + if (_node is! SectionNode) { + // TODO(stuartmorgan): Fix the lack of `throw` here, which looks like a + // bug in the original code. + _error('LambdaContext.render() can only be called on section tags.'); + } + _renderSubtree(_renderer.sink, value); + } + + @override + void write(Object object) { + _checkClosed(); + _renderer.write(object); + } + + @override + String get source { + _checkClosed(); + + if (_node is! SectionNode) { + return ''; + } + + final SectionNode node = _node; + final List nodes = node.children; + if (nodes.isEmpty) { + return ''; + } + + if (nodes.length == 1 && nodes.first is TextNode) { + return (nodes.single as TextNode).text; + } + + return _renderer.source.substring(node.contentStart, node.contentEnd); + } + + @override + String renderSource(String source, {Object? value}) { + _checkClosed(); + final StringBuffer sink = StringBuffer(); + + // Lambdas used for sections should parse with the current delimiters. + String delimiters = '{{ }}'; + if (_node is SectionNode) { + final SectionNode node = _node; + delimiters = node.delimiters; + } + + final List nodes = parser.parse( + source, + _renderer.lenient, + _renderer.templateName, + delimiters, + ); + + final Renderer renderer = Renderer.lambda( + _renderer, + source, + _renderer.indent, + sink, + ); + + if (value != null) { + renderer.push(value); + } + renderer.render(nodes); + + return sink.toString(); + } + + @override + Object? lookup(String variableName) { + _checkClosed(); + return _renderer.resolveValue(variableName); + } +} diff --git a/third_party/packages/mustache_template/lib/src/node.dart b/third_party/packages/mustache_template/lib/src/node.dart new file mode 100644 index 0000000..bc06b57 --- /dev/null +++ b/third_party/packages/mustache_template/lib/src/node.dart @@ -0,0 +1,100 @@ +// TODO(stuartmorgan): Remove this. See https://github.com/flutter/flutter/issues/174722. +// ignore_for_file: public_member_api_docs + +abstract class Node { + Node(this.start, this.end); + + // The offset of the start of the token in the file. Unless this is a section + // or inverse section, then this stores the start of the content of the + // section. + final int start; + final int end; + + void accept(Visitor visitor); + void visitChildren(Visitor visitor) {} +} + +abstract class Visitor { + void visitText(TextNode node); + void visitVariable(VariableNode node); + void visitSection(SectionNode node); + void visitPartial(PartialNode node); +} + +class TextNode extends Node { + TextNode(this.text, int start, int end) : super(start, end); + + final String text; + + @override + String toString() => '(TextNode "$_debugText" $start $end)'; + + String get _debugText { + final String t = text.replaceAll('\n', r'\n'); + return t.length < 50 ? t : '${t.substring(0, 48)}...'; + } + + @override + void accept(Visitor visitor) => visitor.visitText(this); +} + +class VariableNode extends Node { + VariableNode(this.name, int start, int end, {this.escape = true}) + : super(start, end); + + final String name; + final bool escape; + + @override + void accept(Visitor visitor) => visitor.visitVariable(this); + + @override + String toString() => '(VariableNode "$name" escape: $escape $start $end)'; +} + +class SectionNode extends Node { + SectionNode( + this.name, + int start, + int end, + this.delimiters, { + this.inverse = false, + }) : contentStart = end, + super(start, end); + + final String name; + final String delimiters; + final bool inverse; + final int contentStart; + int? contentEnd; // Set in parser when close tag is parsed. + final List children = []; + + @override + void accept(Visitor visitor) => visitor.visitSection(this); + + @override + void visitChildren(Visitor visitor) { + for (final Node node in children) { + node.accept(visitor); + } + } + + @override + String toString() => '(SectionNode $name inverse: $inverse $start $end)'; +} + +class PartialNode extends Node { + PartialNode(this.name, int start, int end, this.indent) : super(start, end); + + final String name; + + // Used to store the preceding whitespace before a partial tag, so that + // it's content can be correctly indented. + final String indent; + + @override + void accept(Visitor visitor) => visitor.visitPartial(this); + + @override + String toString() => '(PartialNode $name $start $end "$indent")'; +} diff --git a/third_party/packages/mustache_template/lib/src/parser.dart b/third_party/packages/mustache_template/lib/src/parser.dart new file mode 100644 index 0000000..b3d4f4b --- /dev/null +++ b/third_party/packages/mustache_template/lib/src/parser.dart @@ -0,0 +1,428 @@ +// TODO(stuartmorgan): Remove this. See https://github.com/flutter/flutter/issues/174722. +// ignore_for_file: public_member_api_docs + +import 'node.dart'; +import 'scanner.dart'; +import 'template_exception.dart'; +import 'token.dart'; + +List parse( + String source, + bool lenient, + String? templateName, + String delimiters, +) { + final Parser parser = Parser( + source, + templateName, + delimiters, + lenient: lenient, + ); + return parser.parse(); +} + +class Tag { + Tag(this.type, this.name, this.start, this.end); + final TagType type; + final String name; + final int start; + final int end; +} + +class TagType { + const TagType(this.name); + final String name; + + static const TagType openSection = TagType('openSection'); + static const TagType openInverseSection = TagType('openInverseSection'); + static const TagType closeSection = TagType('closeSection'); + static const TagType variable = TagType('variable'); + static const TagType tripleMustache = TagType('tripleMustache'); + static const TagType unescapedVariable = TagType('unescapedVariable'); + static const TagType partial = TagType('partial'); + static const TagType comment = TagType('comment'); + static const TagType changeDelimiter = TagType('changeDelimiter'); +} + +class Parser { + Parser( + String source, + String? templateName, + String delimiters, { + bool lenient = false, + }) : _source = source, + _templateName = templateName, + _delimiters = delimiters, + _lenient = lenient, + _scanner = Scanner(source, templateName, delimiters); + + final String _source; + final bool _lenient; + final String? _templateName; + final String _delimiters; + final Scanner _scanner; + final List _stack = []; + late List _tokens; + late String _currentDelimiters; + int _offset = 0; + + List parse() { + _tokens = _scanner.scan(); + _currentDelimiters = _delimiters; + _stack.clear(); + _stack.add(SectionNode('root', 0, 0, _delimiters)); + + // Handle a standalone tag on first line, including special case where the + // first line is empty. + final Token? lineEnd = _readIf(TokenType.lineEnd, eofOk: true); + if (lineEnd != null) { + _appendTextToken(lineEnd); + } + _parseLine(); + + for (Token? token = _peek(); token != null; token = _peek()) { + switch (token.type) { + case TokenType.text: + case TokenType.whitespace: + _read(); + _appendTextToken(token); + + case TokenType.openDelimiter: + final Tag? tag = _readTag(); + final Node? node = _createNodeFromTag(tag); + if (tag != null) { + _appendTag(tag, node); + } + + case TokenType.changeDelimiter: + _read(); + _currentDelimiters = token.value; + + case TokenType.lineEnd: + _appendTextToken(_read()!); + _parseLine(); + + default: + // TODO(stuartmorgan): Convert to StateError. + throw Exception('Unreachable code.'); + } + } + + if (_stack.length != 1) { + throw TemplateException( + "Unclosed tag: '${_stack.last.name}'.", + _templateName, + _source, + _stack.last.start, + ); + } + + return _stack.last.children; + } + + // Returns null on EOF. + Token? _peek() => _offset < _tokens.length ? _tokens[_offset] : null; + + // Returns null on EOF. + Token? _read() { + Token? t; + if (_offset < _tokens.length) { + t = _tokens[_offset]; + _offset++; + } + return t; + } + + Token _expect(TokenType type) { + final Token? token = _read(); + if (token == null) { + throw _errorEof(); + } + if (token.type != type) { + throw _error('Expected: $type found: ${token.type}.', _offset); + } + return token; + } + + Token? _readIf(TokenType type, {bool eofOk = false}) { + final Token? token = _peek(); + if (!eofOk && token == null) { + throw _errorEof(); + } + return token != null && token.type == type ? _read() : null; + } + + TemplateException _errorEof() => + _error('Unexpected end of input.', _source.length - 1); + + TemplateException _error(String msg, int offset) => + TemplateException(msg, _templateName, _source, offset); + + // Add a text node to top most section on the stack and merge consecutive + // text nodes together. + void _appendTextToken(Token token) { + assert( + const [ + TokenType.text, + TokenType.lineEnd, + TokenType.whitespace, + ].contains(token.type), + ); + final List children = _stack.last.children; + if (children.isEmpty || children.last is! TextNode) { + children.add(TextNode(token.value, token.start, token.end)); + } else { + final TextNode last = children.removeLast() as TextNode; + final TextNode node = TextNode( + last.text + token.value, + last.start, + token.end, + ); + children.add(node); + } + } + + // Add the node to top most section on the stack. If a section node then + // push it onto the stack, if a close section tag, then pop the stack. + void _appendTag(Tag tag, Node? node) { + switch (tag.type) { + // {{#...}} {{^...}} + case TagType.openSection: + case TagType.openInverseSection: + _stack.last.children.add(node!); + _stack.add(node as SectionNode); + + // {{/...}} + case TagType.closeSection: + if (tag.name != _stack.last.name) { + throw TemplateException( + 'Mismatched tag, expected: ' + "'${_stack.last.name}', was: '${tag.name}'", + _templateName, + _source, + tag.start, + ); + } + final SectionNode node = _stack.removeLast(); + node.contentEnd = tag.start; + + // {{...}} {{&...}} {{{...}}} + case TagType.variable: + case TagType.unescapedVariable: + case TagType.tripleMustache: + case TagType.partial: + if (node != null) { + _stack.last.children.add(node); + } + + case TagType.comment: + case TagType.changeDelimiter: + // Ignore. + break; + + default: + // TODO(stuartmorgan): Convert to StateError. + throw Exception('Unreachable code.'); + } + } + + // Handle standalone tags and indented partials. + // + // A "standalone tag" in the spec is a tag one a line where the line only + // contains whitespace. During rendering the whitespace is omitted. + // Standalone partials also indent their content to match the tag during + // rendering. + + // match: + // lineEnd whitespace openDelimiter any* closeDelimiter whitespace lineEnd + // + // Where lineEnd can also mean start/end of the source. + void _parseLine() { + // If first token is a newline append it. + final Token? t = _peek(); + if (t != null && t.type == TokenType.lineEnd) { + _appendTextToken(t); + } + + // Continue parsing standalone lines until we find one than isn't a + // standalone line. + while (_peek() != null) { + _readIf(TokenType.lineEnd, eofOk: true); + final Token? precedingWhitespace = _readIf( + TokenType.whitespace, + eofOk: true, + ); + final String indent = + precedingWhitespace == null ? '' : precedingWhitespace.value; + final Tag? tag = _readTag(); + final Node? tagNode = _createNodeFromTag(tag, partialIndent: indent); + final Token? followingWhitespace = _readIf( + TokenType.whitespace, + eofOk: true, + ); + + const List standaloneTypes = [ + TagType.openSection, + TagType.closeSection, + TagType.openInverseSection, + TagType.partial, + TagType.comment, + TagType.changeDelimiter, + ]; + + if (tag != null && + (_peek() == null || _peek()!.type == TokenType.lineEnd) && + standaloneTypes.contains(tag.type)) { + // This is a tag on a "standalone line", so do not create text nodes + // for whitespace, or the following newline. + _appendTag(tag, tagNode); + // Now continue to loop and parse the next line. + } else { + // This is not a standalone line so add the whitespace to the ast. + if (precedingWhitespace != null) { + _appendTextToken(precedingWhitespace); + } + if (tag != null) { + _appendTag(tag, tagNode); + } + if (followingWhitespace != null) { + _appendTextToken(followingWhitespace); + } + // Done parsing standalone lines. Exit the loop. + break; + } + } + } + + final RegExp _validIdentifier = RegExp(r'^[0-9a-zA-Z\_\-\.]+$'); + + static const Map _tagTypeMap = { + '#': TagType.openSection, + '^': TagType.openInverseSection, + '/': TagType.closeSection, + '&': TagType.unescapedVariable, + '>': TagType.partial, + '!': TagType.comment, + }; + + // If open delimiter, or change delimiter token then return a tag. + // If EOF or any another token then return null. + Tag? _readTag() { + final Token? t = _peek(); + if (t == null || + (t.type != TokenType.changeDelimiter && + t.type != TokenType.openDelimiter)) { + return null; + } else if (t.type == TokenType.changeDelimiter) { + _read(); + // Remember the current delimiters. + _currentDelimiters = t.value; + + // Change delimiter tags are already parsed by the scanner. + // So just create a tag and return it. + return Tag(TagType.changeDelimiter, t.value, t.start, t.end); + } + + // Start parsing a typical tag. + + final Token open = _expect(TokenType.openDelimiter); + + _readIf(TokenType.whitespace); + + // A sigil is the character which identifies which sort of tag it is, + // i.e. '#', '/', or '>'. + // Variable tags and triple mustache tags don't have a sigil. + TagType? tagType; + + if (open.value == '{{{') { + tagType = TagType.tripleMustache; + } else { + final Token? sigil = _readIf(TokenType.sigil); + tagType = sigil == null ? TagType.variable : _tagTypeMap[sigil.value]; + } + + _readIf(TokenType.whitespace); + + // TODOsplit up names here instead of during render. + // Also check that they are valid token types. + // TODOsplit up names here instead of during render. + // Also check that they are valid token types. + final List list = []; + for ( + Token? t = _peek(); + t != null && t.type != TokenType.closeDelimiter; + t = _peek() + ) { + _read(); + list.add(t); + } + final String name = list.map((Token t) => t.value).join().trim(); + if (_peek() == null) { + throw _errorEof(); + } + + // Check to see if the tag name is valid. + if (tagType != TagType.comment) { + if (name == '') { + throw _error('Empty tag name.', open.start); + } + if (!_lenient) { + if (name.contains('\t') || name.contains('\n') || name.contains('\r')) { + throw _error('Tags may not contain newlines or tabs.', open.start); + } + + if (!_validIdentifier.hasMatch(name)) { + throw _error( + 'Unless in lenient mode, tags may only contain the ' + 'characters a-z, A-Z, minus, underscore and period.', + open.start, + ); + } + } + } + + final Token close = _expect(TokenType.closeDelimiter); + + return Tag(tagType!, name, open.start, close.end); + } + + Node? _createNodeFromTag(Tag? tag, {String partialIndent = ''}) { + // Handle EOF case. + if (tag == null) { + return null; + } + + Node? node; + switch (tag.type) { + case TagType.openSection: + case TagType.openInverseSection: + final bool inverse = tag.type == TagType.openInverseSection; + node = SectionNode( + tag.name, + tag.start, + tag.end, + _currentDelimiters, + inverse: inverse, + ); + + case TagType.variable: + case TagType.unescapedVariable: + case TagType.tripleMustache: + final bool escape = tag.type == TagType.variable; + node = VariableNode(tag.name, tag.start, tag.end, escape: escape); + + case TagType.partial: + node = PartialNode(tag.name, tag.start, tag.end, partialIndent); + + case TagType.closeSection: + case TagType.comment: + case TagType.changeDelimiter: + node = null; + + default: + // TODO(stuartmorgan): Convert to StateError. + throw Exception('Unreachable code'); + } + return node; + } +} diff --git a/third_party/packages/mustache_template/lib/src/renderer.dart b/third_party/packages/mustache_template/lib/src/renderer.dart new file mode 100644 index 0000000..09fdff6 --- /dev/null +++ b/third_party/packages/mustache_template/lib/src/renderer.dart @@ -0,0 +1,326 @@ +// TODO(stuartmorgan): Remove this. See https://github.com/flutter/flutter/issues/174722. +// ignore_for_file: public_member_api_docs + +import '../mustache.dart' as m; +import 'lambda_context.dart'; +import 'node.dart'; +import 'template.dart'; +import 'template_exception.dart'; + +const Object noSuchProperty = Object(); +final RegExp _integerTag = RegExp(r'^[0-9]+$'); + +class Renderer extends Visitor { + Renderer( + this.sink, + List stack, + this.lenient, + this.htmlEscapeValues, + this.partialResolver, + this.templateName, + this.indent, + this.source, + ) : _stack = List.from(stack); + + Renderer.partial(Renderer ctx, Template partial, String indent) + : this( + ctx.sink, + ctx._stack, + ctx.lenient, + ctx.htmlEscapeValues, + ctx.partialResolver, + ctx.templateName, + ctx.indent + indent, + partial.source, + ); + + Renderer.subtree(Renderer ctx, StringSink sink) + : this( + sink, + ctx._stack, + ctx.lenient, + ctx.htmlEscapeValues, + ctx.partialResolver, + ctx.templateName, + ctx.indent, + ctx.source, + ); + + Renderer.lambda(Renderer ctx, String source, String indent, StringSink sink) + : this( + sink, + ctx._stack, + ctx.lenient, + ctx.htmlEscapeValues, + ctx.partialResolver, + ctx.templateName, + ctx.indent + indent, + source, + ); + + final StringSink sink; + final List _stack; + final bool lenient; + final bool htmlEscapeValues; + final m.PartialResolver? partialResolver; + final String? templateName; + final String indent; + final String source; + + void push(Object? value) => _stack.add(value); + + Object? pop() => _stack.removeLast(); + + void write(Object output) => sink.write(output.toString()); + + void render(List nodes) { + if (indent == '') { + for (final Node n in nodes) { + n.accept(this); + } + } else if (nodes.isNotEmpty) { + // Special case to make sure there is not an extra indent after the last + // line in the partial file. + write(indent); + + nodes.take(nodes.length - 1).forEach((Node n) => n.accept(this)); + + final Node node = nodes.last; + if (node is TextNode) { + visitText(node, lastNode: true); + } else { + node.accept(this); + } + } + } + + @override + void visitText(TextNode node, {bool lastNode = false}) { + if (node.text == '') { + return; + } + if (indent == '') { + write(node.text); + } else if (lastNode && node.text.runes.last == _NEWLINE) { + // Don't indent after the last line in a template. + final String s = node.text.substring(0, node.text.length - 1); + write(s.replaceAll('\n', '\n$indent')); + write('\n'); + } else { + write(node.text.replaceAll('\n', '\n$indent')); + } + } + + @override + void visitVariable(VariableNode node) { + Object? value = resolveValue(node.name); + + if (value is Function) { + final LambdaContext context = LambdaContext(node, this); + final Function valueFunction = value; + // TODO(stuartmorgan): Add function typing in a way that doesn't break + // backward compatibility. + // ignore: avoid_dynamic_calls + value = valueFunction(context); + context.close(); + } + + if (value == noSuchProperty) { + if (!lenient) { + throw error('Value was missing for variable tag: ${node.name}.', node); + } + } else { + final String valueString = (value == null) ? '' : value.toString(); + final String output = + !node.escape || !htmlEscapeValues + ? valueString + : _htmlEscape(valueString); + write(output); + } + } + + @override + void visitSection(SectionNode node) { + if (node.inverse) { + _renderInvSection(node); + } else { + _renderSection(node); + } + } + + void _renderSection(SectionNode node) { + final Object? value = resolveValue(node.name); + + if (value == null) { + // Do nothing. + } else if (value is Iterable) { + for (final Object? v in value) { + _renderWithValue(node, v); + } + } else if (value is Map) { + _renderWithValue(node, value); + } else if (value == true) { + _renderWithValue(node, value); + } else if (value == false) { + // Do nothing. + } else if (value == noSuchProperty) { + if (!lenient) { + throw error('Value was missing for section tag: ${node.name}.', node); + } + } else if (value is Function) { + final LambdaContext context = LambdaContext(node, this); + // TODO(stuartmorgan): Add function typing in a way that doesn't break + // backward compatibility. + // ignore: avoid_dynamic_calls + final Object? output = value(context); + context.close(); + if (output != null) { + write(output); + } + } else { + // Assume the value might have accessible member values via mirrors. + _renderWithValue(node, value); + } + } + + void _renderInvSection(SectionNode node) { + final Object? value = resolveValue(node.name); + + if (value == null) { + _renderWithValue(node, null); + } else if ((value is Iterable && value.isEmpty) || value == false) { + _renderWithValue(node, node.name); + } else if (value == true || value is Map || value is Iterable) { + // Do nothing. + } else if (value == noSuchProperty) { + if (lenient) { + _renderWithValue(node, null); + } else { + throw error( + 'Value was missing for inverse section: ${node.name}.', + node, + ); + } + } else if (value is Function) { + // Do nothing. + // TODO(stuartmorgan): Determine whether this should be an error in + // strict mode (per comment in initial source import). + } else if (lenient) { + // We consider all other values as 'true' in lenient mode. Since this + // is an inverted section, we do nothing. + } else { + throw error( + 'Invalid value type for inverse section, ' + 'section: ${node.name}, ' + 'type: ${value.runtimeType}.', + node, + ); + } + } + + void _renderWithValue(SectionNode node, Object? value) { + push(value); + node.visitChildren(this); + pop(); + } + + @override + void visitPartial(PartialNode node) { + final String partialName = node.name; + final Template? template = + partialResolver == null + ? null + : (partialResolver!(partialName) as Template?); + if (template != null) { + final Renderer renderer = Renderer.partial(this, template, node.indent); + final List nodes = getTemplateNodes(template); + renderer.render(nodes); + } else if (lenient) { + // do nothing + } else { + throw error('Partial not found: $partialName.', node); + } + } + + // Walks up the stack looking for the variable. + // Handles dotted names of the form "a.b.c". + Object? resolveValue(String name) { + if (name == '.') { + return _stack.last; + } + final List parts = name.split('.'); + Object? object = noSuchProperty; + for (final Object? o in _stack.reversed) { + object = _getNamedProperty(o, parts[0]); + if (object != noSuchProperty) { + break; + } + } + for (int i = 1; i < parts.length; i++) { + if (object == noSuchProperty) { + return noSuchProperty; + } + object = _getNamedProperty(object, parts[i]); + } + return object; + } + + // Returns the property of the given object by name. For a map, + // which contains the key name, this is object[name]. For other + // objects, this is object.name or object.name(). If no property + // by the given name exists, this method returns noSuchProperty. + Object? _getNamedProperty(dynamic object, String name) { + if (object is Map && object.containsKey(name)) { + return object[name]; + } + + if (object is List && _integerTag.hasMatch(name)) { + final int index = int.parse(name); + if (object.length > index) { + return object[index]; + } + } + return noSuchProperty; + } + + m.TemplateException error(String message, Node node) => + TemplateException(message, templateName, source, node.start); + + static const Map _htmlEscapeMap = { + _AMP: '&', + _LT: '<', + _GT: '>', + _QUOTE: '"', + _APOS: ''', + _FORWARD_SLASH: '/', + }; + + String _htmlEscape(String s) { + final StringBuffer buffer = StringBuffer(); + int startIndex = 0; + int i = 0; + for (final int c in s.runes) { + if (c == _AMP || + c == _LT || + c == _GT || + c == _QUOTE || + c == _APOS || + c == _FORWARD_SLASH) { + buffer.write(s.substring(startIndex, i)); + buffer.write(_htmlEscapeMap[c]); + startIndex = i + 1; + } + i++; + } + buffer.write(s.substring(startIndex)); + return buffer.toString(); + } +} + +const int _AMP = 38; +const int _LT = 60; +const int _GT = 62; +const int _QUOTE = 34; +const int _APOS = 39; +const int _FORWARD_SLASH = 47; +const int _NEWLINE = 10; diff --git a/third_party/packages/mustache_template/lib/src/scanner.dart b/third_party/packages/mustache_template/lib/src/scanner.dart new file mode 100644 index 0000000..b046c78 --- /dev/null +++ b/third_party/packages/mustache_template/lib/src/scanner.dart @@ -0,0 +1,390 @@ +// TODO(stuartmorgan): Remove this. See https://github.com/flutter/flutter/issues/174722. +// ignore_for_file: public_member_api_docs + +import 'template_exception.dart'; +import 'token.dart'; + +class Scanner { + Scanner(String source, this._templateName, String? delimiters) + : _source = source, + _itr = source.runes.iterator { + if (source == '') { + _c = _EOF; + } else { + _itr.moveNext(); + _c = _itr.current; + } + + if (delimiters == null) { + _openDelimiter = _openDelimiterInner = _OPEN_MUSTACHE; + _closeDelimiter = _closeDelimiterInner = _CLOSE_MUSTACHE; + } else if (delimiters.length == 3) { + _openDelimiter = delimiters.codeUnits[0]; + _closeDelimiter = delimiters.codeUnits[2]; + } else if (delimiters.length == 5) { + _openDelimiter = delimiters.codeUnits[0]; + _openDelimiterInner = delimiters.codeUnits[1]; + _closeDelimiterInner = delimiters.codeUnits[3]; + _closeDelimiter = delimiters.codeUnits[4]; + } else { + throw TemplateException( + 'Invalid delimiter string $delimiters', + null, + null, + null, + ); + } + } + + final String? _templateName; + final String _source; + + final Iterator _itr; + int _offset = 0; + int _c = 0; + + final List _tokens = []; + + // These can be changed by the change delimiter tag. + int? _openDelimiter; + int? _openDelimiterInner; + int? _closeDelimiterInner; + int? _closeDelimiter; + + List scan() { + for (int c = _peek(); c != _EOF; c = _peek()) { + // Scan text tokens. + if (c != _openDelimiter) { + _scanText(); + continue; + } + + final int start = _offset; + + // Read first open delimiter character. + _read(); + + // If only a single delimiter character then create a text token. + if (_openDelimiterInner != null && _peek() != _openDelimiterInner) { + final String value = String.fromCharCode(_openDelimiter!); + _append(TokenType.text, value, start, _offset); + continue; + } + + if (_openDelimiterInner != null) { + _expect(_openDelimiterInner!); + } + + // Handle triple mustache. + if (_openDelimiterInner == _OPEN_MUSTACHE && + _openDelimiter == _OPEN_MUSTACHE && + _peek() == _OPEN_MUSTACHE) { + _read(); + _append(TokenType.openDelimiter, '{{{', start, _offset); + _scanTagContent(); + _scanCloseTripleMustache(); + } else { + // Check to see if this is a change delimiter tag. {{= | | =}} + // Need to skip whitespace and check for "=". + final int wsStart = _offset; + final String ws = _readWhile(_isWhitespace); + + if (_peek() == _EQUAL) { + _parseChangeDelimiterTag(start); + } else { + // Scan standard mustache tag. + final String value = String.fromCharCodes( + _openDelimiterInner == null + ? [_openDelimiter!] + : [_openDelimiter!, _openDelimiterInner!], + ); + + _append(TokenType.openDelimiter, value, start, wsStart); + + if (ws != '') { + _append(TokenType.whitespace, ws, wsStart, _offset); + } + + _scanTagContent(); + _scanCloseDelimiter(); + } + } + } + return _tokens; + } + + int _peek() => _c; + + int _read() { + final int c = _c; + _offset++; + _c = _itr.moveNext() ? _itr.current : _EOF; + return c; + } + + String _readWhile(bool Function(int charCode) test) { + if (_c == _EOF) { + return ''; + } + final int start = _offset; + while (_peek() != _EOF && test(_peek())) { + _read(); + } + final int end = _peek() == _EOF ? _source.length : _offset; + return _source.substring(start, end); + } + + void _expect(int expectedCharCode) { + final int c = _read(); + + if (c == _EOF) { + throw TemplateException( + 'Unexpected end of input', + _templateName, + _source, + _offset - 1, + ); + } + if (c != expectedCharCode) { + throw TemplateException( + 'Unexpected character, ' + 'expected: ${String.fromCharCode(expectedCharCode)}, ' + 'was: ${String.fromCharCode(c)}', + _templateName, + _source, + _offset - 1, + ); + } + } + + void _append(TokenType type, String value, int start, int end) => + _tokens.add(Token(type, value, start, end)); + + bool _isWhitespace(int c) => + const [_SPACE, _TAB, _NEWLINE, _RETURN].contains(c); + + // Scan text. This adds text tokens, line end tokens, and whitespace + // tokens for whitespace at the beginning of a line. This is because the + // mustache spec requires special handing of whitespace. + void _scanText() { + int start = 0; + TokenType token; + String value; + + for (int c = _peek(); c != _EOF && c != _openDelimiter; c = _peek()) { + start = _offset; + + switch (c) { + case _SPACE: + case _TAB: + value = _readWhile((int c) => c == _SPACE || c == _TAB); + token = TokenType.whitespace; + + case _NEWLINE: + _read(); + token = TokenType.lineEnd; + value = '\n'; + + case _RETURN: + _read(); + if (_peek() == _NEWLINE) { + _read(); + token = TokenType.lineEnd; + value = '\r\n'; + } else { + token = TokenType.text; + value = '\r'; + } + + default: + value = _readWhile((int c) => c != _openDelimiter && c != _NEWLINE); + token = TokenType.text; + } + + _append(token, value, start, _offset); + } + } + + // Scan contents of a tag and the end delimiter token. + void _scanTagContent() { + int start; + TokenType token; + String value; + + bool isCloseDelimiter(int c) => + (_closeDelimiterInner == null && c == _closeDelimiter) || + (_closeDelimiterInner != null && c == _closeDelimiterInner); + + for (int c = _peek(); c != _EOF && !isCloseDelimiter(c); c = _peek()) { + start = _offset; + + switch (c) { + case _HASH: + case _CARET: + case _FORWARD_SLASH: + case _GT: + case _AMP: + case _EXCLAIM: + _read(); + token = TokenType.sigil; + value = String.fromCharCode(c); + + case _SPACE: + case _TAB: + case _NEWLINE: + case _RETURN: + token = TokenType.whitespace; + value = _readWhile(_isWhitespace); + + case _PERIOD: + _read(); + token = TokenType.dot; + value = '.'; + + default: + // Identifier can be any other character in lenient mode. + token = TokenType.identifier; + value = _readWhile( + (int c) => + !(const [ + _HASH, + _CARET, + _FORWARD_SLASH, + _GT, + _AMP, + _EXCLAIM, + _SPACE, + _TAB, + _NEWLINE, + _RETURN, + _PERIOD, + ].contains(c)) && + c != _closeDelimiterInner && + c != _closeDelimiter, + ); + } + _append(token, value, start, _offset); + } + } + + // Scan close delimiter token. + void _scanCloseDelimiter() { + if (_peek() != _EOF) { + final int start = _offset; + + if (_closeDelimiterInner != null) { + _expect(_closeDelimiterInner!); + } + _expect(_closeDelimiter!); + + final String value = String.fromCharCodes( + _closeDelimiterInner == null + ? [_closeDelimiter!] + : [_closeDelimiterInner!, _closeDelimiter!], + ); + + _append(TokenType.closeDelimiter, value, start, _offset); + } + } + + // Scan close triple mustache delimiter token. + void _scanCloseTripleMustache() { + if (_peek() != _EOF) { + final int start = _offset; + + _expect(_CLOSE_MUSTACHE); + _expect(_CLOSE_MUSTACHE); + _expect(_CLOSE_MUSTACHE); + + _append(TokenType.closeDelimiter, '}}}', start, _offset); + } + } + + // Open delimiter characters have already been read. + void _parseChangeDelimiterTag(int start) { + _expect(_EQUAL); + + final int? delimiterInner = _closeDelimiterInner; + final int? delimiter = _closeDelimiter; + + _readWhile(_isWhitespace); + + int c; + c = _read(); + + if (c == _EQUAL) { + throw _error('Incorrect change delimiter tag.'); + } + _openDelimiter = c; + + c = _read(); + if (_isWhitespace(c)) { + _openDelimiterInner = null; + } else { + _openDelimiterInner = c; + } + + _readWhile(_isWhitespace); + + c = _read(); + + if (_isWhitespace(c) || c == _EQUAL) { + throw _error('Incorrect change delimiter tag.'); + } + + if (_isWhitespace(_peek()) || _peek() == _EQUAL) { + _closeDelimiterInner = null; + _closeDelimiter = c; + } else { + _closeDelimiterInner = c; + _closeDelimiter = _read(); + } + + _readWhile(_isWhitespace); + + _expect(_EQUAL); + + _readWhile(_isWhitespace); + + if (delimiterInner != null) { + _expect(delimiterInner); + } + _expect(delimiter!); + + // Create delimiter string. + final StringBuffer buffer = StringBuffer(); + buffer.writeCharCode(_openDelimiter!); + if (_openDelimiterInner != null) { + buffer.writeCharCode(_openDelimiterInner!); + } + buffer.write(' '); + if (_closeDelimiterInner != null) { + buffer.writeCharCode(_closeDelimiterInner!); + } + buffer.writeCharCode(_closeDelimiter!); + final String value = buffer.toString(); + + _append(TokenType.changeDelimiter, value, start, _offset); + } + + TemplateException _error(String message) { + return TemplateException(message, _templateName, _source, _offset); + } +} + +const int _EOF = -1; +const int _TAB = 9; +const int _NEWLINE = 10; +const int _RETURN = 13; +const int _SPACE = 32; +const int _EXCLAIM = 33; +const int _HASH = 35; +const int _AMP = 38; +const int _PERIOD = 46; +const int _FORWARD_SLASH = 47; +const int _EQUAL = 61; +const int _GT = 62; +const int _CARET = 94; + +const int _OPEN_MUSTACHE = 123; +const int _CLOSE_MUSTACHE = 125; diff --git a/third_party/packages/mustache_template/lib/src/template.dart b/third_party/packages/mustache_template/lib/src/template.dart new file mode 100644 index 0000000..347c90d --- /dev/null +++ b/third_party/packages/mustache_template/lib/src/template.dart @@ -0,0 +1,58 @@ +// TODO(stuartmorgan): Remove this. See https://github.com/flutter/flutter/issues/174722. +// ignore_for_file: public_member_api_docs + +import '../mustache.dart' as m; +import 'node.dart'; +import 'parser.dart' as parser; +import 'renderer.dart'; + +class Template implements m.Template { + Template.fromSource( + this.source, { + bool lenient = false, + bool htmlEscapeValues = true, + String? name, + m.PartialResolver? partialResolver, + String delimiters = '{{ }}', + }) : _nodes = parser.parse(source, lenient, name, delimiters), + _lenient = lenient, + _htmlEscapeValues = htmlEscapeValues, + _name = name, + _partialResolver = partialResolver; + + @override + final String source; + final List _nodes; + final bool _lenient; + final bool _htmlEscapeValues; + final String? _name; + final m.PartialResolver? _partialResolver; + + @override + String? get name => _name; + + @override + String renderString(Object? values) { + final StringBuffer buf = StringBuffer(); + render(values, buf); + return buf.toString(); + } + + @override + void render(Object? values, StringSink sink) { + final Renderer renderer = Renderer( + sink, + [values], + _lenient, + _htmlEscapeValues, + _partialResolver, + _name, + '', + source, + ); + renderer.render(_nodes); + } +} + +// Expose getter for nodes internally within this package. +List getTemplateNodes(Template template) => template._nodes; diff --git a/third_party/packages/mustache_template/lib/src/template_exception.dart b/third_party/packages/mustache_template/lib/src/template_exception.dart new file mode 100644 index 0000000..e64ca70 --- /dev/null +++ b/third_party/packages/mustache_template/lib/src/template_exception.dart @@ -0,0 +1,124 @@ +// TODO(stuartmorgan): Remove this. See https://github.com/flutter/flutter/issues/174722. +// ignore_for_file: public_member_api_docs + +import '../mustache.dart' as m; + +class TemplateException implements m.TemplateException { + TemplateException(this.message, this.templateName, this.source, this.offset); + + @override + final String message; + @override + final String? templateName; + @override + final String? source; + @override + final int? offset; + + bool _isUpdated = false; + late int _line; + late int _column; + late String _context; + + @override + int get line { + _update(); + return _line; + } + + @override + int get column { + _update(); + return _column; + } + + @override + String get context { + _update(); + return _context; + } + + @override + String toString() { + final List list = []; + if (templateName != null) { + list.add(templateName); + } + list.add(line); + list.add(column); + final String location = list.isEmpty ? '' : ' (${list.join(':')})'; + return '$message$location\n$context'; + } + + // This source code is a modified version of FormatException.toString(). + void _update() { + if (_isUpdated) { + return; + } + _isUpdated = true; + + if (source == null || + offset == null || + (offset! < 0 || offset! > source!.length)) { + return; + } + + // Find line and character column. + int lineNum = 1; + int lineStart = 0; + bool lastWasCR = false; + for (int i = 0; i < offset!; i++) { + final int char = source!.codeUnitAt(i); + if (char == 0x0a) { + if (lineStart != i || !lastWasCR) { + lineNum += 1; + } + lineStart = i + 1; + lastWasCR = false; + } else if (char == 0x0d) { + lineNum++; + lineStart = i + 1; + lastWasCR = true; + } + } + + _line = lineNum; + _column = offset! - lineStart + 1; + + // Find context. + int lineEnd = source!.length; + for (int i = offset!; i < source!.length; i++) { + final int char = source!.codeUnitAt(i); + if (char == 0x0a || char == 0x0d) { + lineEnd = i; + break; + } + } + final int length = lineEnd - lineStart; + int start = lineStart; + int end = lineEnd; + String prefix = ''; + String postfix = ''; + if (length > 78) { + // Can't show entire line. Try to anchor at the nearest end, if + // one is within reach. + final int index = offset! - lineStart; + if (index < 75) { + end = start + 75; + postfix = '...'; + } else if (end - offset! < 75) { + start = end - 75; + prefix = '...'; + } else { + // Neither end is near, just pick an area around the offset. + start = offset! - 36; + end = offset! + 36; + prefix = postfix = '...'; + } + } + final String slice = source!.substring(start, end); + final int markOffset = offset! - start + prefix.length; + + _context = "$prefix$slice$postfix\n${" " * markOffset}^\n"; + } +} diff --git a/third_party/packages/mustache_template/lib/src/token.dart b/third_party/packages/mustache_template/lib/src/token.dart new file mode 100644 index 0000000..b93dd33 --- /dev/null +++ b/third_party/packages/mustache_template/lib/src/token.dart @@ -0,0 +1,38 @@ +// TODO(stuartmorgan): Remove this. See https://github.com/flutter/flutter/issues/174722. +// ignore_for_file: public_member_api_docs + +class TokenType { + const TokenType(this.name); + + final String name; + + @override + String toString() => '(TokenType $name)'; + + static const TokenType text = TokenType('text'); + static const TokenType openDelimiter = TokenType('openDelimiter'); + static const TokenType closeDelimiter = TokenType('closeDelimiter'); + + // A sigil is the word commonly used to describe the special character at the + // start of mustache tag i.e. #, ^ or /. + static const TokenType sigil = TokenType('sigil'); + static const TokenType identifier = TokenType('identifier'); + static const TokenType dot = TokenType('dot'); + + static const TokenType changeDelimiter = TokenType('changeDelimiter'); + static const TokenType whitespace = TokenType('whitespace'); + static const TokenType lineEnd = TokenType('lineEnd'); +} + +class Token { + Token(this.type, this.value, this.start, this.end); + + final TokenType type; + final String value; + + final int start; + final int end; + + @override + String toString() => '(Token ${type.name} "$value" $start $end)'; +} diff --git a/third_party/packages/mustache_template/pubspec.yaml b/third_party/packages/mustache_template/pubspec.yaml new file mode 100644 index 0000000..fd0de9f --- /dev/null +++ b/third_party/packages/mustache_template/pubspec.yaml @@ -0,0 +1,14 @@ +name: mustache_template +description: A templating library that implements the Mustache template specification +repository: https://github.com/flutter/packages/tree/main/third_party/packages/mustache_template +issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+mustache_template%22 +version: 2.0.1 + +environment: + sdk: ^3.7.0 + +dev_dependencies: + test: ^1.16.5 + +topics: + - template diff --git a/third_party/packages/mustache_template/test/all.dart b/third_party/packages/mustache_template/test/all.dart new file mode 100644 index 0000000..0e7d0e4 --- /dev/null +++ b/third_party/packages/mustache_template/test/all.dart @@ -0,0 +1,9 @@ +import 'mustache_specs.dart' as specs; +import 'mustache_test.dart' as test; +import 'parser_test.dart' as parser; + +void main() { + specs.main(); + test.main(); + parser.main(); +} diff --git a/third_party/packages/mustache_template/test/download-spec.sh b/third_party/packages/mustache_template/test/download-spec.sh new file mode 100755 index 0000000..e36cb5b --- /dev/null +++ b/third_party/packages/mustache_template/test/download-spec.sh @@ -0,0 +1 @@ +git clone https://github.com/mustache/spec.git diff --git a/third_party/packages/mustache_template/test/mustache_specs.dart b/third_party/packages/mustache_template/test/mustache_specs.dart new file mode 100644 index 0000000..ff4103c --- /dev/null +++ b/third_party/packages/mustache_template/test/mustache_specs.dart @@ -0,0 +1,131 @@ +// Specification files can be downloaded here https://github.com/mustache/spec + +// Test implemented by Georgios Valotasios. +// See: https://github.com/valotas/mustache4dart + +import 'dart:convert'; +import 'dart:io'; + +import 'package:mustache_template/mustache.dart'; +import 'package:test/test.dart'; + +String render( + String source, + dynamic values, { + required String? Function(String) partial, +}) { + late Template? Function(String) resolver; + resolver = (String name) { + final String? source = partial(name); + if (source == null) { + return null; + } + return Template(source, partialResolver: resolver, lenient: true); + }; + final Template t = Template(source, partialResolver: resolver, lenient: true); + return t.renderString(values); +} + +void main() { + defineTests(); +} + +void defineTests() { + final Directory specsDir = Directory('test/spec/specs'); + specsDir.listSync().forEach((FileSystemEntity f) { + if (f is File) { + final String filename = f.path; + if (shouldRun(filename)) { + final String text = f.readAsStringSync(); + _defineGroupFromFile(filename, text); + } + } + }); +} + +void _defineGroupFromFile(String filename, String text) { + final Map jsondata = + (json.decode(text) as Map).cast(); + final List> tests = + (jsondata['tests']! as List).cast>(); + filename = filename.substring(filename.lastIndexOf('/') + 1); + group('Specs of $filename', () { + for (final Map t in tests) { + final StringBuffer testDescription = StringBuffer(t['name']! as String); + testDescription.write(': '); + testDescription.write(t['desc']); + final String template = t['template']! as String; + final Object? data = t['data']; + final String templateOneline = template + .replaceAll('\n', r'\n') + .replaceAll('\r', r'\r'); + final StringBuffer reason = StringBuffer( + "Could not render right '''$templateOneline'''", + ); + final Object? expected = t['expected']; + final Map? partials = + t['partials'] as Map?; + String? partial(String name) { + if (partials == null) { + return null; + } + return partials[name] as String?; + } + + //swap the data.lambda with a dart real function + if (data is Map && data['lambda'] != null) { + data['lambda'] = lambdas[t['name']]; + } + reason.write(" with '$data'"); + if (partials != null) { + reason.write(' and partial: $partials'); + } + test( + testDescription.toString(), + () => expect( + render(template, data, partial: partial), + expected, + reason: reason.toString(), + ), + ); + } + }); +} + +bool shouldRun(String filename) { + // filter out only .json files + if (!filename.endsWith('.json')) { + return false; + } + return true; +} + +String Function(Object?) _dummyCallableWithState() { + int callCounter = 0; + return (Object? arg) { + callCounter++; + return callCounter.toString(); + }; +} + +String Function(LambdaContext) wrapLambda(Object? Function(Object?) f) => + (LambdaContext ctx) => ctx.renderSource(f(ctx.source).toString()); + +Map lambdas = { + 'Interpolation': wrapLambda((Object? t) => 'world'), + 'Interpolation - Expansion': wrapLambda((Object? t) => '{{planet}}'), + 'Interpolation - Alternate Delimiters': wrapLambda( + (Object? t) => '|planet| => {{planet}}', + ), + 'Interpolation - Multiple Calls': wrapLambda( + _dummyCallableWithState(), + ), //function() { return (g=(function(){return this})()).calls=(g.calls||0)+1 } + 'Escaping': wrapLambda((Object? t) => '>'), + 'Section': wrapLambda((Object? txt) => txt == '{{x}}' ? 'yes' : 'no'), + 'Section - Expansion': wrapLambda((Object? txt) => '$txt{{planet}}$txt'), + 'Section - Alternate Delimiters': wrapLambda( + (Object? txt) => '$txt{{planet}} => |planet|$txt', + ), + 'Section - Multiple Calls': wrapLambda((Object? t) => '__${t}__'), + 'Inverted Section': wrapLambda((Object? txt) => false), +}; diff --git a/third_party/packages/mustache_template/test/mustache_test.dart b/third_party/packages/mustache_template/test/mustache_test.dart new file mode 100644 index 0000000..086247b --- /dev/null +++ b/third_party/packages/mustache_template/test/mustache_test.dart @@ -0,0 +1,919 @@ +import 'package:mustache_template/mustache.dart'; +import 'package:test/test.dart'; + +const String UNEXPECTED_EOF = 'Unexpected end of input'; +const String BAD_VALUE_INV_SECTION = 'Invalid value type for inverse section'; +const String BAD_TAG_NAME = 'Unless in lenient mode, tags may only contain'; +const String VALUE_MISSING = 'Value was missing'; +const String UNCLOSED_TAG = 'Unclosed tag'; + +Template parse(String source, {bool lenient = false}) => + Template(source, lenient: lenient); + +void main() { + group('Basic', () { + test('Variable', () { + final String output = parse( + '_{{var}}_', + ).renderString({'var': 'bob'}); + expect(output, equals('_bob_')); + }); + test('Comment', () { + final String output = parse( + '_{{! i am a\n comment ! }}_', + ).renderString({}); + expect(output, equals('__')); + }); + }); + group('Section', () { + test('Map', () { + final String output = parse( + '{{#section}}_{{var}}_{{/section}}', + ).renderString(>{ + 'section': {'var': 'bob'}, + }); + expect(output, equals('_bob_')); + }); + test('List', () { + final String output = parse( + '{{#section}}_{{var}}_{{/section}}', + ).renderString(>>{ + 'section': >[ + {'var': 'bob'}, + {'var': 'jim'}, + ], + }); + expect(output, equals('_bob__jim_')); + }); + test('Empty List', () { + final String output = parse( + '{{#section}}_{{var}}_{{/section}}', + ).renderString(>{'section': []}); + expect(output, equals('')); + }); + test('False', () { + final String output = parse( + '{{#section}}_{{var}}_{{/section}}', + ).renderString({'section': false}); + expect(output, equals('')); + }); + test('Invalid value', () { + final Exception? ex = renderFail( + '{{#section}}_{{var}}_{{/section}}', + {'section': 42}, + ); + if (ex is TemplateException) { + expect(ex.message, startsWith(VALUE_MISSING)); + } else { + fail('Unexpected type: $ex'); + } + }); + test('Invalid value - lenient mode', () { + final String output = parse( + '{{#var}}_{{var}}_{{/var}}', + lenient: true, + ).renderString({'var': 42}); + expect(output, equals('_42_')); + }); + + test('True', () { + final String output = parse( + '{{#section}}_ok_{{/section}}', + ).renderString({'section': true}); + expect(output, equals('_ok_')); + }); + + test('Nested', () { + final String output = parse( + '{{#section}}.{{var}}.{{#nested}}_{{nestedvar}}_{{/nested}}.{{/section}}', + ).renderString(>{ + 'section': { + 'var': 'bob', + 'nested': >[ + {'nestedvar': 'jim'}, + {'nestedvar': 'sally'}, + ], + }, + }); + expect(output, equals('.bob._jim__sally_.')); + }); + + test('Whitespace in section tags', () { + expect( + parse('{{#foo.bar}}oi{{/foo.bar}}').renderString( + >{ + 'foo': {'bar': true}, + }, + ), + equals('oi'), + ); + expect( + parse('{{# foo.bar}}oi{{/foo.bar}}').renderString( + >{ + 'foo': {'bar': true}, + }, + ), + equals('oi'), + ); + expect( + parse('{{#foo.bar }}oi{{/foo.bar}}').renderString( + >{ + 'foo': {'bar': true}, + }, + ), + equals('oi'), + ); + expect( + parse('{{# foo.bar }}oi{{/foo.bar}}').renderString( + >{ + 'foo': {'bar': true}, + }, + ), + equals('oi'), + ); + expect( + parse('{{#foo.bar}}oi{{/ foo.bar}}').renderString( + >{ + 'foo': {'bar': true}, + }, + ), + equals('oi'), + ); + expect( + parse('{{#foo.bar}}oi{{/foo.bar }}').renderString( + >{ + 'foo': {'bar': true}, + }, + ), + equals('oi'), + ); + expect( + parse('{{#foo.bar}}oi{{/ foo.bar }}').renderString( + >{ + 'foo': {'bar': true}, + }, + ), + equals('oi'), + ); + expect( + parse('{{# foo.bar }}oi{{/ foo.bar }}').renderString( + >{ + 'foo': {'bar': true}, + }, + ), + equals('oi'), + ); + }); + + test('Whitespace in variable tags', () { + expect( + parse('{{foo.bar}}').renderString(>{ + 'foo': {'bar': true}, + }), + equals('true'), + ); + expect( + parse('{{ foo.bar}}').renderString(>{ + 'foo': {'bar': true}, + }), + equals('true'), + ); + expect( + parse('{{foo.bar }}').renderString(>{ + 'foo': {'bar': true}, + }), + equals('true'), + ); + expect( + parse('{{ foo.bar }}').renderString(>{ + 'foo': {'bar': true}, + }), + equals('true'), + ); + }); + + test('Odd whitespace in tags', () { + void render(String source, dynamic values, dynamic output) => expect( + parse(source, lenient: true).renderString(values), + equals(output), + ); + + render('{{\t# foo}}oi{{\n/foo}}', {'foo': true}, 'oi'); + + render( + '{{ # # foo }} {{ oi }} {{ / # foo }}', + >>{ + '# foo': >[ + {'oi': 'OI!'}, + ], + }, + ' OI! ', + ); + + render( + '{{ #foo }} {{ oi }} {{ /foo }}', + >>{ + 'foo': >[ + {'oi': 'OI!'}, + ], + }, + ' OI! ', + ); + + render( + '{{\t#foo }} {{ oi }} {{ /foo }}', + >>{ + 'foo': >[ + {'oi': 'OI!'}, + ], + }, + ' OI! ', + ); + + render('{{{ #foo }}} {{{ /foo }}}', { + '#foo': 1, + '/foo': 2, + }, '1 2'); + + // Invalid - I'm ok with that for now. + // render( + // "{{{ { }}}", + // {'{': 1}, + // '1'); + + render('{{\nfoo}}', {'foo': 'bar'}, 'bar'); + + render('{{\tfoo}}', {'foo': 'bar'}, 'bar'); + + render('{{\t# foo}}oi{{\n/foo}}', {'foo': true}, 'oi'); + + render('{{{\tfoo\t}}}', {'foo': true}, 'true'); + + // TODO(stuartmorgan): Fix and enable this test, which was commented out + // when the source was first imported. + // empty, or error in strict mode. + // render( + // "{{ > }}", + // {'>': 'oi'}, + // ''); + }); + + test('Empty source', () { + final Template t = Template(''); + expect(t.renderString({}), equals('')); + }); + + test('Template name', () { + final Template t = Template('', name: 'foo'); + expect(t.name, equals('foo')); + }); + + test('Bad tag', () { + expect(() => Template('{{{ foo }|'), throwsException); + }); + }); + + group('Inverse Section', () { + test('Map', () { + final String output = parse( + '{{^section}}_{{var}}_{{/section}}', + ).renderString(>{ + 'section': {'var': 'bob'}, + }); + expect(output, equals('')); + }); + test('List', () { + final String output = parse( + '{{^section}}_{{var}}_{{/section}}', + ).renderString(>>{ + 'section': >[ + {'var': 'bob'}, + {'var': 'jim'}, + ], + }); + expect(output, equals('')); + }); + test('Empty List', () { + final String output = parse( + '{{^section}}_ok_{{/section}}', + ).renderString(>{'section': []}); + expect(output, equals('_ok_')); + }); + test('False', () { + final String output = parse( + '{{^section}}_ok_{{/section}}', + ).renderString({'section': false}); + expect(output, equals('_ok_')); + }); + test('Invalid value', () { + final Exception? ex = renderFail( + '{{^section}}_{{var}}_{{/section}}', + {'section': 42}, + ); + expect(ex is TemplateException, isTrue); + expect( + (ex! as TemplateException).message, + startsWith(BAD_VALUE_INV_SECTION), + ); + }); + test('Invalid value - lenient mode', () { + final String output = parse( + '{{^var}}_ok_{{/var}}', + lenient: true, + ).renderString({'var': 42}); + expect(output, equals('')); + }); + test('True', () { + final String output = parse( + '{{^section}}_ok_{{/section}}', + ).renderString({'section': true}); + expect(output, equals('')); + }); + }); + + group('Html escape', () { + test('Escape at start', () { + final String output = parse( + '_{{var}}_', + ).renderString({'var': '&.'}); + expect(output, equals('_&._')); + }); + + test('Escape at end', () { + final String output = parse( + '_{{var}}_', + ).renderString({'var': '.&'}); + expect(output, equals('_.&_')); + }); + + test('&', () { + final String output = parse( + '_{{var}}_', + ).renderString({'var': '&'}); + expect(output, equals('_&_')); + }); + + test('<', () { + final String output = parse( + '_{{var}}_', + ).renderString({'var': '<'}); + expect(output, equals('_<_')); + }); + + test('>', () { + final String output = parse( + '_{{var}}_', + ).renderString({'var': '>'}); + expect(output, equals('_>_')); + }); + + test('"', () { + final String output = parse( + '_{{var}}_', + ).renderString({'var': '"'}); + expect(output, equals('_"_')); + }); + + test("'", () { + final String output = parse( + '_{{var}}_', + ).renderString({'var': "'"}); + expect(output, equals('_'_')); + }); + + test('/', () { + final String output = parse( + '_{{var}}_', + ).renderString({'var': '/'}); + expect(output, equals('_/_')); + }); + }); + + group('Invalid format', () { + test('Mismatched tag', () { + const String source = '{{#section}}_{{var}}_{{/notsection}}'; + final Exception? ex = renderFail(source, >{ + 'section': {'var': 'bob'}, + }); + expectFail(ex, 1, 22, 'Mismatched tag'); + }); + + test('Unexpected EOF', () { + const String source = '{{#section}}_{{var}}_{{/section'; + final Exception? ex = renderFail(source, >{ + 'section': {'var': 'bob'}, + }); + expectFail(ex, 1, 31, UNEXPECTED_EOF); + }); + + test('Bad tag name, open section', () { + const String source = r'{{#section$%$^%}}_{{var}}_{{/section}}'; + final Exception? ex = renderFail(source, >{ + 'section': {'var': 'bob'}, + }); + expectFail(ex, null, null, BAD_TAG_NAME); + }); + + test('Bad tag name, close section', () { + const String source = r'{{#section}}_{{var}}_{{/section$%$^%}}'; + final Exception? ex = renderFail(source, >{ + 'section': {'var': 'bob'}, + }); + expectFail(ex, null, null, BAD_TAG_NAME); + }); + + test('Bad tag name, variable', () { + const String source = r'{{#section}}_{{var$%$^%}}_{{/section}}'; + final Exception? ex = renderFail(source, >{ + 'section': {'var': 'bob'}, + }); + expectFail(ex, null, null, BAD_TAG_NAME); + }); + + test('Missing variable', () { + const String source = r'{{#section}}_{{var}}_{{/section}}'; + final Exception? ex = renderFail(source, >{ + 'section': {}, + }); + expectFail(ex, null, null, VALUE_MISSING); + }); + + // Null variables shouldn't be a problem. + test('Null variable', () { + final Template t = Template('{{#section}}_{{var}}_{{/section}}'); + final String output = t.renderString(>{ + 'section': {'var': null}, + }); + expect(output, equals('__')); + }); + + test('Unclosed section', () { + const String source = r'{{#section}}foo'; + final Exception? ex = renderFail(source, >{ + 'section': {}, + }); + expectFail(ex, null, null, UNCLOSED_TAG); + }); + }); + + group('Lenient', () { + test('Odd section name', () { + final String output = parse( + r'{{#section$%$^%}}_{{var}}_{{/section$%$^%}}', + lenient: true, + ).renderString(>{ + r'section$%$^%': {'var': 'bob'}, + }); + expect(output, equals('_bob_')); + }); + + test('Odd variable name', () { + final String output = parse( + r'{{#section}}_{{var$%$^%}}_{{/section}}', + lenient: true, + ).renderString(>{ + 'section': {r'var$%$^%': 'bob'}, + }); + expect(output, equals('_bob_')); + }); + + test('Null variable', () { + final String output = parse( + r'{{#section}}_{{var}}_{{/section}}', + lenient: true, + ).renderString(>{ + 'section': {'var': null}, + }); + expect(output, equals('__')); + }); + + test('Null section', () { + final String output = parse( + '{{#section}}_{{var}}_{{/section}}', + lenient: true, + ).renderString({'section': null}); + expect(output, equals('')); + }); + + // Known failure + // test('Null inverse section', () { + // var output = parse('{{^section}}_{{var}}_{{/section}}', lenient: true) + // .renderString({"section": null}, lenient: true); + // expect(output, equals('')); + // }); + }); + + group('Escape tags', () { + test('{{{ ... }}}', () { + final String output = parse( + '{{{blah}}}', + ).renderString({'blah': '&'}); + expect(output, equals('&')); + }); + test('{{& ... }}', () { + final String output = parse( + '{{{blah}}}', + ).renderString({'blah': '&'}); + expect(output, equals('&')); + }); + }); + + group('Partial tag', () { + String partialTest( + Map values, + Map sources, + String renderTemplate, { + bool lenient = false, + }) { + final Map templates = {}; + Template? resolver(String name) => templates[name]; + for (final String k in sources.keys) { + templates[k] = Template( + sources[k]! as String, + name: k, + lenient: lenient, + partialResolver: resolver, + ); + } + final Template? t = resolver(renderTemplate); + return t!.renderString(values); + } + + test('basic', () { + final String output = partialTest( + {'foo': 'bar'}, + {'root': '{{>partial}}', 'partial': '{{foo}}'}, + 'root', + ); + expect(output, 'bar'); + }); + + test('missing partial strict', () { + bool threw = false; + try { + partialTest( + {'foo': 'bar'}, + {'root': '{{>partial}}'}, + 'root', + ); + } on Exception catch (e) { + expect(e is TemplateException, isTrue); + threw = true; + } + expect(threw, isTrue); + }); + + test('missing partial lenient', () { + final String output = partialTest( + {'foo': 'bar'}, + {'root': '{{>partial}}'}, + 'root', + lenient: true, + ); + expect(output, equals('')); + }); + + test('context', () { + final String output = partialTest( + {'text': 'content'}, + {'root': '"{{>partial}}"', 'partial': '*{{text}}*'}, + 'root', + lenient: true, + ); + expect(output, equals('"*content*"')); + }); + + test('recursion', () { + final String output = partialTest( + { + 'content': 'X', + 'nodes': >[ + {'content': 'Y', 'nodes': []}, + ], + }, + { + 'root': '{{>node}}', + 'node': '{{content}}<{{#nodes}}{{>node}}{{/nodes}}>', + }, + 'root', + lenient: true, + ); + expect(output, equals('X>')); + }); + + test('standalone without previous', () { + final String output = partialTest( + {}, + {'root': ' {{>partial}}\n>', 'partial': '>\n>'}, + 'root', + lenient: true, + ); + expect(output, equals(' >\n >>')); + }); + + test('standalone indentation', () { + final String output = partialTest( + {'content': '<\n->'}, + { + 'root': '\\\n {{>partial}}\n/\n', + 'partial': '|\n{{{content}}}\n|\n', + }, + 'root', + lenient: true, + ); + expect(output, equals('\\\n |\n <\n->\n |\n/\n')); + }); + }); + + group('Lambdas', () { + void lambdaTest({ + required String template, + dynamic lambda, + dynamic output, + }) => expect( + parse(template).renderString({'lambda': lambda}), + equals(output), + ); + + test('basic', () { + lambdaTest( + template: 'Hello, {{lambda}}!', + lambda: (_) => 'world', + output: 'Hello, world!', + ); + }); + + test('escaping', () { + lambdaTest( + template: '<{{lambda}}{{{lambda}}}', + lambda: (_) => '>', + output: '<>>', + ); + }); + + test('sections', () { + lambdaTest( + template: '{{#lambda}}FILE{{/lambda}} != {{#lambda}}LINE{{/lambda}}', + lambda: (LambdaContext ctx) => '__${ctx.renderString()}__', + output: '__FILE__ != __LINE__', + ); + }); + + // TODO(stuartmorgan): Fix and re-enable this test, which was skipped when + // the package was first imported. + test('inverted sections truthy', () { + const String template = '<{{^lambda}}{{static}}{{/lambda}}>'; + final Map values = { + 'lambda': (_) => false, + 'static': 'static', + }; + const String output = '<>'; + expect(parse(template).renderString(values), equals(output)); + }, skip: 'skip test'); + + test("seth's use case", () { + const String template = '<{{#markdown}}{{content}}{{/markdown}}>'; + final Map values = { + 'markdown': (LambdaContext ctx) => ctx.renderString().toLowerCase(), + 'content': 'OI YOU!', + }; + const String output = ''; + expect(parse(template).renderString(values), equals(output)); + }); + + test('Lambda v2', () { + const String template = '<{{#markdown}}{{content}}{{/markdown}}>'; + final Map values = { + 'markdown': (LambdaContext ctx) => ctx.source, + 'content': 'OI YOU!', + }; + const String output = '<{{content}}>'; + expect(parse(template).renderString(values), equals(output)); + }); + + test('Lambda v2...', () { + const String template = + '<{{#markdown}}dsfsf dsfsdf dfsdfsd{{/markdown}}>'; + final Map values = + { + // ignore: avoid_dynamic_calls + 'markdown': (dynamic ctx) => ctx.source, + }; + const String output = ''; + expect(parse(template).renderString(values), equals(output)); + }); + + test('Alternate Delimiters', () { + // A lambda's return value should parse with the default delimiters. + + const String template = '{{= | | =}}\nHello, (|&lambda|)!'; + + //function() { return "|planet| => {{planet}}" } + final Map values = { + 'planet': 'world', + 'lambda': + (LambdaContext ctx) => ctx.renderSource('|planet| => {{planet}}'), + }; + + const String output = 'Hello, (|planet| => world)!'; + + expect(parse(template).renderString(values), equals(output)); + }); + + test('Alternate Delimiters 2', () { + // Lambdas used for sections should parse with the current delimiters. + + const String template = '{{= | | =}}<|#lambda|-|/lambda|>'; + + //function() { return "|planet| => {{planet}}" } + final Map values = { + 'planet': 'Earth', + 'lambda': (LambdaContext ctx) { + final String txt = ctx.source; + return ctx.renderSource('$txt{{planet}} => |planet|$txt'); + }, + }; + + const String output = '<-{{planet}} => Earth->'; + + expect(parse(template).renderString(values), equals(output)); + }); + + test('LambdaContext.lookup', () { + final Template t = Template('{{ foo }}'); + final String s = t.renderString({ + 'foo': (LambdaContext lc) => lc.lookup('bar'), + 'bar': 'jim', + }); + expect(s, equals('jim')); + }); + + test('LambdaContext.lookup closed', () { + final Template t = Template('{{ foo }}'); + LambdaContext? lc2; + t.renderString({ + 'foo': (LambdaContext lc) => lc2 = lc, + 'bar': 'jim', + }); + expect(lc2, isNotNull); + expect(() => lc2?.lookup('foo'), throwsException); + }); + }); + + group('Other', () { + test('Standalone line', () { + final String val = parse( + '|\n{{#bob}}\n{{/bob}}\n|', + ).renderString(>{'bob': []}); + expect(val, equals('|\n|')); + }); + }); + + group('Array indexing', () { + test('Basic', () { + final String val = parse('{{array.1}}').renderString(>{ + 'array': [1, 2, 3], + }); + expect(val, equals('2')); + }); + test('RangeError', () { + final Exception? error = renderFail('{{array.5}}', >{ + 'array': [1, 2, 3], + }); + expect(error, isA()); + }); + }); + + group('Delimiters', () { + test('Basic', () { + final String val = parse( + '{{=<% %>=}}(<%text%>)', + ).renderString({'text': 'Hey!'}); + expect(val, equals('(Hey!)')); + }); + + test('Single delimiters', () { + final String val = parse( + '({{=[ ]=}}[text])', + ).renderString({'text': 'It worked!'}); + expect(val, equals('(It worked!)')); + }); + }); + + group('Template with custom delimiters', () { + test('Basic', () { + final Template t = Template('(<%text%>)', delimiters: '<% %>'); + final String val = t.renderString({'text': 'Hey!'}); + expect(val, equals('(Hey!)')); + }); + }); + + group('Lambda context', () { + test('LambdaContext write', () { + const String template = '<{{#markdown}}{{content}}{{/markdown}}>'; + final Map values = + { + 'markdown': (LambdaContext ctx) { + ctx.write('foo'); + }, + }; + const String output = ''; + expect(parse(template).renderString(values), equals(output)); + }); + + test('LambdaContext render', () { + const String template = '<{{#markdown}}{{content}}{{/markdown}}>'; + final Map values = { + 'content': 'bar', + 'markdown': (LambdaContext ctx) { + ctx.render(); + }, + }; + const String output = ''; + expect(parse(template).renderString(values), equals(output)); + }); + + test('LambdaContext render with value', () { + const String template = '<{{#markdown}}{{content}}{{/markdown}}>'; + final Map values = + { + 'markdown': (LambdaContext ctx) { + ctx.render(value: {'content': 'oi!'}); + }, + }; + const String output = ''; + expect(parse(template).renderString(values), equals(output)); + }); + + test('LambdaContext renderString with value', () { + const String template = '<{{#markdown}}{{content}}{{/markdown}}>'; + final Map values = + { + 'markdown': (LambdaContext ctx) { + return ctx.renderString( + value: {'content': 'oi!'}, + ); + }, + }; + const String output = ''; + expect(parse(template).renderString(values), equals(output)); + }); + + test('LambdaContext write and return', () { + const String template = '<{{#markdown}}{{content}}{{/markdown}}>'; + final Map values = + { + 'markdown': (LambdaContext ctx) { + ctx.write('foo'); + return 'bar'; + }, + }; + const String output = ''; + expect(parse(template).renderString(values), equals(output)); + }); + + test('LambdaContext renderSource with value', () { + const String template = '<{{#markdown}}{{content}}{{/markdown}}>'; + final Map values = + { + 'markdown': (LambdaContext ctx) { + return ctx.renderSource( + ctx.source, + value: {'content': 'oi!'}, + ); + }, + }; + const String output = ''; + expect(parse(template).renderString(values), equals(output)); + }); + }); +} + +Exception? renderFail(String source, Object values) { + try { + parse(source).renderString(values); + return null; + } on Exception catch (e) { + return e; + } +} + +void expectFail( + Exception? ex, + int? line, + int? column, [ + String? msgStartsWith, +]) { + if (ex is! TemplateException) { + fail('Unexpected type: $ex'); + } + if (line != null) { + expect(ex.line, equals(line)); + } + if (column != null) { + expect(ex.column, equals(column)); + } + if (msgStartsWith != null) { + expect(ex.message, startsWith(msgStartsWith)); + } +} diff --git a/third_party/packages/mustache_template/test/no_spec/whitespace.js b/third_party/packages/mustache_template/test/no_spec/whitespace.js new file mode 100644 index 0000000..598ca1a --- /dev/null +++ b/third_party/packages/mustache_template/test/no_spec/whitespace.js @@ -0,0 +1,52 @@ +var sys = require('sys'); +var mustache = require('mustache'); + +function render(source, values) { + var output = mustache.to_html(source, values); + sys.puts(output); +} + +render( + "{{ # # foo }} {{ oi }} {{ / # foo }}", + {'# foo': [{oi: 'OI!'}]}); // OI! + +render( + "{{ #foo }} {{ oi }} {{ /foo }}", + {'foo': [{oi: 'OI!'}]}); // OI! + +render( + "{{{ #foo }}} {{{ /foo }}}", + {'#foo': 1, '/foo': 2}); // 1 2 + +render( + "{{{ { }}}", + {'{': 1}); // 1 + +render( + "{{ > }}", + {'>': 'oi'}); // '' + +render( + "{{\nfoo}}", + {'foo': 'bar'}); // bar + +render( + "{{\tfoo}}", + {'foo': 'bar'}); // bar + +render( + "{{\t# foo}}oi{{\n/foo}}", + {foo: true}); // oi + +render( + "{{{\tfoo\t}}}", + {foo: true}); // oi + + +//render( +// "{{ { }}", +// {'{': 1}); // ERROR unclosed tag + +//render( +// "{{ { foo } }}", +// {'foo': 1}); // ERROR unclosed tag diff --git a/third_party/packages/mustache_template/test/no_spec/whitespace.py b/third_party/packages/mustache_template/test/no_spec/whitespace.py new file mode 100644 index 0000000..7d40b31 --- /dev/null +++ b/third_party/packages/mustache_template/test/no_spec/whitespace.py @@ -0,0 +1,49 @@ +import pystache + +def render(source, values): + print pystache.render(source, values) + +render( + "{{ # # foo }} {{ oi }} {{ / # foo }}", + {'# foo': [{'oi': 'OI!'}]}) # OI! + +render( + "{{ #foo }} {{ oi }} {{ /foo }}", + {'foo': [{'oi': 'OI!'}]}) # OI! + +render( + "{{{ #foo }}} {{{ /foo }}}", + {'#foo': 1, '/foo': 2}) # 1 2 + +render( + "{{{ { }}}", + {'{': 1}) # 1 + +render( + "{{ > }}}", + {'>': 'oi'}) # "}" bug?? + +render( + "{{\nfoo}}", + {'foo': 'bar'}) # // bar + +render( + "{{\tfoo}}", + {'foo': 'bar'}) # bar + +render( + "{{\t# foo}}oi{{\n/foo}}", + {'foo': True}) # oi + +render( + "{{{\tfoo\t}}}", + {'foo': True}) # oi + +# Don't work in mustache.js +# render( +# "{{ { }}", +# {'{': 1}) # ERROR unclosed tag + +# render( +# "{{ { foo } }}", +# {'foo': 1}) # ERROR unclosed tag diff --git a/third_party/packages/mustache_template/test/parser_test.dart b/third_party/packages/mustache_template/test/parser_test.dart new file mode 100644 index 0000000..27ccadf --- /dev/null +++ b/third_party/packages/mustache_template/test/parser_test.dart @@ -0,0 +1,442 @@ +// ignore_for_file: avoid_print + +import 'package:mustache_template/src/node.dart'; +import 'package:mustache_template/src/parser.dart'; +import 'package:mustache_template/src/scanner.dart'; +import 'package:mustache_template/src/template_exception.dart'; +import 'package:mustache_template/src/token.dart'; +import 'package:test/test.dart'; + +void main() { + group('Scanner', () { + test('scan text', () { + const String source = 'abc'; + final Scanner scanner = Scanner(source, 'foo', '{{ }}'); + final List tokens = scanner.scan(); + expectTokens(tokens, [Token(TokenType.text, 'abc', 0, 3)]); + }); + + test('scan tag', () { + const String source = 'abc{{foo}}def'; + final Scanner scanner = Scanner(source, 'foo', '{{ }}'); + final List tokens = scanner.scan(); + expectTokens(tokens, [ + Token(TokenType.text, 'abc', 0, 3), + Token(TokenType.openDelimiter, '{{', 3, 5), + Token(TokenType.identifier, 'foo', 5, 8), + Token(TokenType.closeDelimiter, '}}', 8, 10), + Token(TokenType.text, 'def', 10, 13), + ]); + }); + + test('scan tag whitespace', () { + const String source = 'abc{{ foo }}def'; + final Scanner scanner = Scanner(source, 'foo', '{{ }}'); + final List tokens = scanner.scan(); + expectTokens(tokens, [ + Token(TokenType.text, 'abc', 0, 3), + Token(TokenType.openDelimiter, '{{', 3, 5), + Token(TokenType.whitespace, ' ', 5, 6), + Token(TokenType.identifier, 'foo', 6, 9), + Token(TokenType.whitespace, ' ', 9, 10), + Token(TokenType.closeDelimiter, '}}', 10, 12), + Token(TokenType.text, 'def', 12, 15), + ]); + }); + + test('scan tag sigil', () { + const String source = 'abc{{ # foo }}def'; + final Scanner scanner = Scanner(source, 'foo', '{{ }}'); + final List tokens = scanner.scan(); + expectTokens(tokens, [ + Token(TokenType.text, 'abc', 0, 3), + Token(TokenType.openDelimiter, '{{', 3, 5), + Token(TokenType.whitespace, ' ', 5, 6), + Token(TokenType.sigil, '#', 6, 7), + Token(TokenType.whitespace, ' ', 7, 8), + Token(TokenType.identifier, 'foo', 8, 11), + Token(TokenType.whitespace, ' ', 11, 12), + Token(TokenType.closeDelimiter, '}}', 12, 14), + Token(TokenType.text, 'def', 14, 17), + ]); + }); + + test('scan tag dot', () { + const String source = 'abc{{ foo.bar }}def'; + final Scanner scanner = Scanner(source, 'foo', '{{ }}'); + final List tokens = scanner.scan(); + expectTokens(tokens, [ + Token(TokenType.text, 'abc', 0, 3), + Token(TokenType.openDelimiter, '{{', 3, 5), + Token(TokenType.whitespace, ' ', 5, 6), + Token(TokenType.identifier, 'foo', 6, 9), + Token(TokenType.dot, '.', 9, 10), + Token(TokenType.identifier, 'bar', 10, 13), + Token(TokenType.whitespace, ' ', 13, 14), + Token(TokenType.closeDelimiter, '}}', 14, 16), + Token(TokenType.text, 'def', 16, 19), + ]); + }); + + test('scan triple mustache', () { + const String source = 'abc{{{foo}}}def'; + final Scanner scanner = Scanner(source, 'foo', '{{ }}'); + final List tokens = scanner.scan(); + expectTokens(tokens, [ + Token(TokenType.text, 'abc', 0, 3), + Token(TokenType.openDelimiter, '{{{', 3, 6), + Token(TokenType.identifier, 'foo', 6, 9), + Token(TokenType.closeDelimiter, '}}}', 9, 12), + Token(TokenType.text, 'def', 12, 15), + ]); + }); + + test('scan triple mustache whitespace', () { + const String source = 'abc{{{ foo }}}def'; + final Scanner scanner = Scanner(source, 'foo', '{{ }}'); + final List tokens = scanner.scan(); + expectTokens(tokens, [ + Token(TokenType.text, 'abc', 0, 3), + Token(TokenType.openDelimiter, '{{{', 3, 6), + Token(TokenType.whitespace, ' ', 6, 7), + Token(TokenType.identifier, 'foo', 7, 10), + Token(TokenType.whitespace, ' ', 10, 11), + Token(TokenType.closeDelimiter, '}}}', 11, 14), + Token(TokenType.text, 'def', 14, 17), + ]); + }); + + test('scan tag with equals', () { + const String source = '{{foo=bar}}'; + final Scanner scanner = Scanner(source, 'foo', '{{ }}'); + final List tokens = scanner.scan(); + expectTokens(tokens, [ + Token(TokenType.openDelimiter, '{{', 0, 2), + Token(TokenType.identifier, 'foo=bar', 2, 9), + Token(TokenType.closeDelimiter, '}}', 9, 11), + ]); + }); + + test('scan comment with equals', () { + const String source = '{{!foo=bar}}'; + final Scanner scanner = Scanner(source, 'foo', '{{ }}'); + final List tokens = scanner.scan(); + expectTokens(tokens, [ + Token(TokenType.openDelimiter, '{{', 0, 2), + Token(TokenType.sigil, '!', 2, 3), + Token(TokenType.identifier, 'foo=bar', 3, 10), + Token(TokenType.closeDelimiter, '}}', 10, 12), + ]); + }); + }); + + group('Parser', () { + test('parse variable', () { + const String source = 'abc{{foo}}def'; + final Parser parser = Parser(source, 'foo', '{{ }}'); + final List nodes = parser.parse(); + expectNodes(nodes, [ + TextNode('abc', 0, 3), + VariableNode('foo', 3, 10), + TextNode('def', 10, 13), + ]); + }); + + test('parse variable whitespace', () { + const String source = 'abc{{ foo }}def'; + final Parser parser = Parser(source, 'foo', '{{ }}'); + final List nodes = parser.parse(); + expectNodes(nodes, [ + TextNode('abc', 0, 3), + VariableNode('foo', 3, 12), + TextNode('def', 12, 15), + ]); + }); + + test('parse section', () { + const String source = 'abc{{#foo}}def{{/foo}}ghi'; + final Parser parser = Parser(source, 'foo', '{{ }}'); + final List nodes = parser.parse(); + expectNodes(nodes, [ + TextNode('abc', 0, 3), + SectionNode('foo', 3, 11, '{{ }}'), + TextNode('ghi', 22, 25), + ]); + expectNodes((nodes[1] as SectionNode).children, [ + TextNode('def', 11, 14), + ]); + }); + + test('parse section standalone tag whitespace', () { + const String source = 'abc\n{{#foo}}\ndef\n{{/foo}}\nghi'; + final Parser parser = Parser(source, 'foo', '{{ }}'); + final List nodes = parser.parse(); + expectNodes(nodes, [ + TextNode('abc\n', 0, 4), + SectionNode('foo', 4, 12, '{{ }}'), + TextNode('ghi', 26, 29), + ]); + expectNodes((nodes[1] as SectionNode).children, [ + TextNode('def\n', 13, 17), + ]); + }); + + test('parse section standalone tag whitespace consecutive', () { + const String source = + 'abc\n{{#foo}}\ndef\n{{/foo}}\n{{#foo}}\ndef\n{{/foo}}\nghi'; + final Parser parser = Parser(source, 'foo', '{{ }}'); + final List nodes = parser.parse(); + expectNodes(nodes, [ + TextNode('abc\n', 0, 4), + SectionNode('foo', 4, 12, '{{ }}'), + SectionNode('foo', 26, 34, '{{ }}'), + TextNode('ghi', 48, 51), + ]); + expectNodes((nodes[1] as SectionNode).children, [ + TextNode('def\n', 13, 17), + ]); + }); + + test('parse section standalone tag whitespace on first line', () { + const String source = ' {{#foo}} \ndef\n{{/foo}}\nghi'; + final Parser parser = Parser(source, 'foo', '{{ }}'); + final List nodes = parser.parse(); + expectNodes(nodes, [ + SectionNode('foo', 2, 10, '{{ }}'), + TextNode('ghi', 26, 29), + ]); + expectNodes((nodes[0] as SectionNode).children, [ + TextNode('def\n', 13, 17), + ]); + }); + + test('parse section standalone tag whitespace on last line', () { + const String source = '{{#foo}}def\n {{/foo}} '; + final Parser parser = Parser(source, 'foo', '{{ }}'); + final List nodes = parser.parse(); + expectNodes(nodes, [SectionNode('foo', 0, 8, '{{ }}')]); + expectNodes((nodes[0] as SectionNode).children, [ + TextNode('def\n', 8, 12), + ]); + }); + + test('parse variable newline', () { + const String source = 'abc\n\n{{foo}}def'; + final Parser parser = Parser(source, 'foo', '{{ }}'); + final List nodes = parser.parse(); + expectNodes(nodes, [ + TextNode('abc\n\n', 0, 5), + VariableNode('foo', 5, 12), + TextNode('def', 12, 15), + ]); + }); + + test('parse section standalone tag whitespace v2', () { + const String source = 'abc\n\n{{#foo}}\ndef\n{{/foo}}\nghi'; + final Parser parser = Parser(source, 'foo', '{{ }}'); + final List nodes = parser.parse(); + expectNodes(nodes, [ + TextNode('abc\n\n', 0, 5), + SectionNode('foo', 5, 13, '{{ }}'), + TextNode('ghi', 27, 30), + ]); + expectNodes((nodes[1] as SectionNode).children, [ + TextNode('def\n', 14, 18), + ]); + }); + + test('parse whitespace', () { + const String source = 'abc\n '; + final Parser parser = Parser(source, 'foo', '{{ }}'); + final List nodes = parser.parse(); + expectNodes(nodes, [TextNode('abc\n ', 0, 7)]); + }); + + test('parse partial', () { + const String source = 'abc\n {{>foo}}def'; + final Parser parser = Parser(source, 'foo', '{{ }}'); + final List nodes = parser.parse(); + expectNodes(nodes, [ + TextNode('abc\n ', 0, 7), + PartialNode('foo', 7, 15, ' '), + TextNode('def', 15, 18), + ]); + }); + + test('parse change delimiters', () { + const String source = '{{= | | =}}<|#lambda|-|/lambda|>'; + final Parser parser = Parser(source, 'foo', '{{ }}'); + final List nodes = parser.parse(); + expectNodes(nodes, [ + TextNode('<', 11, 12), + SectionNode('lambda', 12, 21, '| |'), + TextNode('>', 31, 32), + ]); + expect((nodes[1] as SectionNode).delimiters, equals('| |')); + expectNodes((nodes[1] as SectionNode).children, [ + TextNode('-', 21, 22), + ]); + }); + + test('corner case strict', () { + const String source = '{{{ #foo }}} {{{ /foo }}}'; + final Parser parser = Parser(source, 'foo', '{{ }}'); + try { + parser.parse(); + // TODO(stuartmorgan): Restructure test to use throwsA. + // ignore: use_test_throws_matchers + fail('Should fail.'); + } on Exception catch (e) { + expect(e is TemplateException, isTrue); + } + }); + + test('corner case lenient', () { + const String source = '{{{ #foo }}} {{{ /foo }}}'; + final Parser parser = Parser(source, 'foo', '{{ }}', lenient: true); + final List nodes = parser.parse(); + expectNodes(nodes, [ + VariableNode('#foo', 0, 12, escape: false), + TextNode(' ', 12, 13), + VariableNode('/foo', 13, 25, escape: false), + ]); + }); + + test('toString', () { + TextNode('foo', 1, 3).toString(); + VariableNode('foo', 1, 3).toString(); + PartialNode('foo', 1, 3, ' ').toString(); + SectionNode('foo', 1, 3, '{{ }}').toString(); + Token(TokenType.closeDelimiter, 'foo', 1, 3).toString(); + TokenType.closeDelimiter.toString(); + }); + + test('exception', () { + const String source = + "'{{ foo }} sdfffffffffffffffffffffffffffffffffffffffffffff " + 'dsfsdf sdfdsa fdsfads fsdfdsfadsf dsfasdfsdf sdfdsfsadf sdfadsfsdf '; + final TemplateException ex = TemplateException( + 'boom!', + 'foo.mustache', + source, + 2, + ); + ex.toString(); + }); + + Exception parseFail(String source) { + try { + final Parser parser = Parser(source, 'foo', '{{ }}'); + parser.parse(); + // TODO(stuartmorgan): Restructure test to use throwsA. + // ignore: use_test_throws_matchers + fail('Did not throw.'); + } on Exception catch (ex, st) { + if (ex is! TemplateException) { + print(ex); + print(st); + } + return ex; + } + } + + test('parse eof', () { + void expectTemplateEx(Exception ex) => + expect(ex is TemplateException, isTrue); + + expectTemplateEx(parseFail('{{#foo}}{{bar}}{{/foo}')); + expectTemplateEx(parseFail('{{#foo}}{{bar}}{{/foo')); + expectTemplateEx(parseFail('{{#foo}}{{bar}}{{/')); + expectTemplateEx(parseFail('{{#foo}}{{bar}}{{')); + expectTemplateEx(parseFail('{{#foo}}{{bar}}{')); + expectTemplateEx(parseFail('{{#foo}}{{bar}}')); + expectTemplateEx(parseFail('{{#foo}}{{bar}')); + expectTemplateEx(parseFail('{{#foo}}{{bar')); + expectTemplateEx(parseFail('{{#foo}}{{')); + expectTemplateEx(parseFail('{{#foo}}{')); + expectTemplateEx(parseFail('{{#foo}}')); + expectTemplateEx(parseFail('{{#foo}')); + expectTemplateEx(parseFail('{{#')); + expectTemplateEx(parseFail('{{')); + expectTemplateEx(parseFail('{{ # foo }}{{ bar }}{{ / foo }')); + expectTemplateEx(parseFail('{{ # foo }}{{ bar }}{{ / foo ')); + expectTemplateEx(parseFail('{{ # foo }}{{ bar }}{{ / foo')); + expectTemplateEx(parseFail('{{ # foo }}{{ bar }}{{ / ')); + expectTemplateEx(parseFail('{{ # foo }}{{ bar }}{{ /')); + expectTemplateEx(parseFail('{{ # foo }}{{ bar }}{{ ')); + expectTemplateEx(parseFail('{{ # foo }}{{ bar }}{{')); + expectTemplateEx(parseFail('{{ # foo }}{{ bar }}{')); + expectTemplateEx(parseFail('{{ # foo }}{{ bar }}')); + expectTemplateEx(parseFail('{{ # foo }}{{ bar }')); + expectTemplateEx(parseFail('{{ # foo }}{{ bar ')); + expectTemplateEx(parseFail('{{ # foo }}{{ bar')); + expectTemplateEx(parseFail('{{ # foo }}{{ ')); + expectTemplateEx(parseFail('{{ # foo }}{{')); + expectTemplateEx(parseFail('{{ # foo }}{')); + expectTemplateEx(parseFail('{{ # foo }}')); + expectTemplateEx(parseFail('{{ # foo }')); + expectTemplateEx(parseFail('{{ # foo ')); + expectTemplateEx(parseFail('{{ # foo')); + expectTemplateEx(parseFail('{{ # ')); + expectTemplateEx(parseFail('{{ #')); + expectTemplateEx(parseFail('{{ ')); + expectTemplateEx(parseFail('{{')); + + expectTemplateEx(parseFail('{{= || || =}')); + expectTemplateEx(parseFail('{{= || || =')); + expectTemplateEx(parseFail('{{= || || ')); + expectTemplateEx(parseFail('{{= || ||')); + expectTemplateEx(parseFail('{{= || |')); + expectTemplateEx(parseFail('{{= || ')); + expectTemplateEx(parseFail('{{= ||')); + expectTemplateEx(parseFail('{{= |')); + expectTemplateEx(parseFail('{{= ')); + expectTemplateEx(parseFail('{{=')); + }); + }); +} + +bool nodeEqual(Node a, Node b) { + if (a is TextNode) { + return b is TextNode && + a.text == b.text && + a.start == b.start && + a.end == b.end; + } else if (a is VariableNode && b is VariableNode) { + return a.name == b.name && + a.escape == b.escape && + a.start == b.start && + a.end == b.end; + } else if (a is SectionNode && b is SectionNode) { + return a.name == b.name && + a.delimiters == b.delimiters && + a.inverse == b.inverse && + a.start == b.start && + a.end == b.end; + } else if (a is PartialNode && b is PartialNode) { + return a.name == b.name && a.indent == b.indent; + } else { + return false; + } +} + +bool tokenEqual(Token a, Token b) { + return a.type == b.type && + a.value == b.value && + a.start == b.start && + a.end == b.end; +} + +void expectTokens(List a, List b) { + expect(a.length, equals(b.length), reason: '$a != $b'); + for (int i = 0; i < a.length; i++) { + expect(tokenEqual(a[i], b[i]), isTrue, reason: '$a != $b'); + } +} + +void expectNodes(List a, List b) { + expect(a.length, equals(b.length), reason: '$a != $b'); + for (int i = 0; i < a.length; i++) { + expect(nodeEqual(a[i], b[i]), isTrue, reason: '$a != $b'); + } +} From 0a70b374af705f072d8557cc4128342b9bfc928d Mon Sep 17 00:00:00 2001 From: stuartmorgan-g Date: Wed, 24 Sep 2025 09:54:08 -0400 Subject: [PATCH 105/118] Remove "All right reserved" from all files (#10066) Per guidance from legal on current preferred practice, remove "All rights reserved" from all LICENSE files and header blocks, and update the repo tool check accordingly. --- packages/flutter_template_images/LICENSE | 2 +- packages/multicast_dns/LICENSE | 2 +- packages/multicast_dns/example/main.dart | 2 +- packages/multicast_dns/example/mdns_resolve.dart | 2 +- packages/multicast_dns/example/mdns_sd.dart | 2 +- packages/multicast_dns/lib/multicast_dns.dart | 2 +- packages/multicast_dns/lib/src/constants.dart | 2 +- packages/multicast_dns/lib/src/lookup_resolver.dart | 2 +- packages/multicast_dns/lib/src/native_protocol_client.dart | 2 +- packages/multicast_dns/lib/src/packet.dart | 2 +- packages/multicast_dns/lib/src/resource_record.dart | 2 +- packages/multicast_dns/test/client_test.dart | 2 +- packages/multicast_dns/test/decode_test.dart | 2 +- packages/multicast_dns/test/lookup_resolver_test.dart | 2 +- packages/multicast_dns/test/resource_record_cache_test.dart | 2 +- packages/multicast_dns/tool/packet_gen.dart | 2 +- packages/standard_message_codec/LICENSE | 2 +- .../standard_message_codec/example/lib/readme_excerpts.dart | 2 +- packages/standard_message_codec/lib/src/serialization.dart | 2 +- packages/standard_message_codec/lib/standard_message_codec.dart | 2 +- .../test/standard_message_codec_test.dart | 2 +- 21 files changed, 21 insertions(+), 21 deletions(-) diff --git a/packages/flutter_template_images/LICENSE b/packages/flutter_template_images/LICENSE index c6823b8..29b709d 100644 --- a/packages/flutter_template_images/LICENSE +++ b/packages/flutter_template_images/LICENSE @@ -1,4 +1,4 @@ -Copyright 2013 The Flutter Authors. All rights reserved. +Copyright 2013 The Flutter Authors Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: diff --git a/packages/multicast_dns/LICENSE b/packages/multicast_dns/LICENSE index c6823b8..29b709d 100644 --- a/packages/multicast_dns/LICENSE +++ b/packages/multicast_dns/LICENSE @@ -1,4 +1,4 @@ -Copyright 2013 The Flutter Authors. All rights reserved. +Copyright 2013 The Flutter Authors Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: diff --git a/packages/multicast_dns/example/main.dart b/packages/multicast_dns/example/main.dart index 81c7697..360d5a3 100644 --- a/packages/multicast_dns/example/main.dart +++ b/packages/multicast_dns/example/main.dart @@ -1,4 +1,4 @@ -// Copyright 2013 The Flutter Authors. All rights reserved. +// Copyright 2013 The Flutter Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. diff --git a/packages/multicast_dns/example/mdns_resolve.dart b/packages/multicast_dns/example/mdns_resolve.dart index 5246997..e5626d3 100644 --- a/packages/multicast_dns/example/mdns_resolve.dart +++ b/packages/multicast_dns/example/mdns_resolve.dart @@ -1,4 +1,4 @@ -// Copyright 2013 The Flutter Authors. All rights reserved. +// Copyright 2013 The Flutter Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. diff --git a/packages/multicast_dns/example/mdns_sd.dart b/packages/multicast_dns/example/mdns_sd.dart index b728b61..d6e2c4f 100644 --- a/packages/multicast_dns/example/mdns_sd.dart +++ b/packages/multicast_dns/example/mdns_sd.dart @@ -1,4 +1,4 @@ -// Copyright 2013 The Flutter Authors. All rights reserved. +// Copyright 2013 The Flutter Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. diff --git a/packages/multicast_dns/lib/multicast_dns.dart b/packages/multicast_dns/lib/multicast_dns.dart index 18674fb..6c92e33 100644 --- a/packages/multicast_dns/lib/multicast_dns.dart +++ b/packages/multicast_dns/lib/multicast_dns.dart @@ -1,4 +1,4 @@ -// Copyright 2013 The Flutter Authors. All rights reserved. +// Copyright 2013 The Flutter Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. diff --git a/packages/multicast_dns/lib/src/constants.dart b/packages/multicast_dns/lib/src/constants.dart index 76d8c6a..7517f53 100644 --- a/packages/multicast_dns/lib/src/constants.dart +++ b/packages/multicast_dns/lib/src/constants.dart @@ -1,4 +1,4 @@ -// Copyright 2013 The Flutter Authors. All rights reserved. +// Copyright 2013 The Flutter Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. diff --git a/packages/multicast_dns/lib/src/lookup_resolver.dart b/packages/multicast_dns/lib/src/lookup_resolver.dart index a12c3e1..531be38 100644 --- a/packages/multicast_dns/lib/src/lookup_resolver.dart +++ b/packages/multicast_dns/lib/src/lookup_resolver.dart @@ -1,4 +1,4 @@ -// Copyright 2013 The Flutter Authors. All rights reserved. +// Copyright 2013 The Flutter Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. diff --git a/packages/multicast_dns/lib/src/native_protocol_client.dart b/packages/multicast_dns/lib/src/native_protocol_client.dart index fb94343..4c07df8 100644 --- a/packages/multicast_dns/lib/src/native_protocol_client.dart +++ b/packages/multicast_dns/lib/src/native_protocol_client.dart @@ -1,4 +1,4 @@ -// Copyright 2013 The Flutter Authors. All rights reserved. +// Copyright 2013 The Flutter Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. diff --git a/packages/multicast_dns/lib/src/packet.dart b/packages/multicast_dns/lib/src/packet.dart index aa41cef..eb5f464 100644 --- a/packages/multicast_dns/lib/src/packet.dart +++ b/packages/multicast_dns/lib/src/packet.dart @@ -1,4 +1,4 @@ -// Copyright 2013 The Flutter Authors. All rights reserved. +// Copyright 2013 The Flutter Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. diff --git a/packages/multicast_dns/lib/src/resource_record.dart b/packages/multicast_dns/lib/src/resource_record.dart index 8c59ab2..bb2cc9c 100644 --- a/packages/multicast_dns/lib/src/resource_record.dart +++ b/packages/multicast_dns/lib/src/resource_record.dart @@ -1,4 +1,4 @@ -// Copyright 2013 The Flutter Authors. All rights reserved. +// Copyright 2013 The Flutter Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. diff --git a/packages/multicast_dns/test/client_test.dart b/packages/multicast_dns/test/client_test.dart index b5fef50..99730c6 100644 --- a/packages/multicast_dns/test/client_test.dart +++ b/packages/multicast_dns/test/client_test.dart @@ -1,4 +1,4 @@ -// Copyright 2013 The Flutter Authors. All rights reserved. +// Copyright 2013 The Flutter Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. diff --git a/packages/multicast_dns/test/decode_test.dart b/packages/multicast_dns/test/decode_test.dart index 7d5d16b..f964c8b 100644 --- a/packages/multicast_dns/test/decode_test.dart +++ b/packages/multicast_dns/test/decode_test.dart @@ -1,4 +1,4 @@ -// Copyright 2013 The Flutter Authors. All rights reserved. +// Copyright 2013 The Flutter Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. diff --git a/packages/multicast_dns/test/lookup_resolver_test.dart b/packages/multicast_dns/test/lookup_resolver_test.dart index 1188ec2..dde83f9 100644 --- a/packages/multicast_dns/test/lookup_resolver_test.dart +++ b/packages/multicast_dns/test/lookup_resolver_test.dart @@ -1,4 +1,4 @@ -// Copyright 2013 The Flutter Authors. All rights reserved. +// Copyright 2013 The Flutter Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. diff --git a/packages/multicast_dns/test/resource_record_cache_test.dart b/packages/multicast_dns/test/resource_record_cache_test.dart index 11be627..703211e 100644 --- a/packages/multicast_dns/test/resource_record_cache_test.dart +++ b/packages/multicast_dns/test/resource_record_cache_test.dart @@ -1,4 +1,4 @@ -// Copyright 2013 The Flutter Authors. All rights reserved. +// Copyright 2013 The Flutter Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. diff --git a/packages/multicast_dns/tool/packet_gen.dart b/packages/multicast_dns/tool/packet_gen.dart index 6e1e278..de4e5b6 100644 --- a/packages/multicast_dns/tool/packet_gen.dart +++ b/packages/multicast_dns/tool/packet_gen.dart @@ -1,4 +1,4 @@ -// Copyright 2013 The Flutter Authors. All rights reserved. +// Copyright 2013 The Flutter Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. diff --git a/packages/standard_message_codec/LICENSE b/packages/standard_message_codec/LICENSE index c6823b8..29b709d 100644 --- a/packages/standard_message_codec/LICENSE +++ b/packages/standard_message_codec/LICENSE @@ -1,4 +1,4 @@ -Copyright 2013 The Flutter Authors. All rights reserved. +Copyright 2013 The Flutter Authors Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: diff --git a/packages/standard_message_codec/example/lib/readme_excerpts.dart b/packages/standard_message_codec/example/lib/readme_excerpts.dart index 6e68003..5bf151d 100644 --- a/packages/standard_message_codec/example/lib/readme_excerpts.dart +++ b/packages/standard_message_codec/example/lib/readme_excerpts.dart @@ -1,4 +1,4 @@ -// Copyright 2013 The Flutter Authors. All rights reserved. +// Copyright 2013 The Flutter Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. diff --git a/packages/standard_message_codec/lib/src/serialization.dart b/packages/standard_message_codec/lib/src/serialization.dart index 73dc650..302dc3a 100644 --- a/packages/standard_message_codec/lib/src/serialization.dart +++ b/packages/standard_message_codec/lib/src/serialization.dart @@ -1,4 +1,4 @@ -// Copyright 2013 The Flutter Authors. All rights reserved. +// Copyright 2013 The Flutter Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. diff --git a/packages/standard_message_codec/lib/standard_message_codec.dart b/packages/standard_message_codec/lib/standard_message_codec.dart index f742125..6bd769e 100644 --- a/packages/standard_message_codec/lib/standard_message_codec.dart +++ b/packages/standard_message_codec/lib/standard_message_codec.dart @@ -1,4 +1,4 @@ -// Copyright 2013 The Flutter Authors. All rights reserved. +// Copyright 2013 The Flutter Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. diff --git a/packages/standard_message_codec/test/standard_message_codec_test.dart b/packages/standard_message_codec/test/standard_message_codec_test.dart index bb4cfc7..b33a411 100644 --- a/packages/standard_message_codec/test/standard_message_codec_test.dart +++ b/packages/standard_message_codec/test/standard_message_codec_test.dart @@ -1,4 +1,4 @@ -// Copyright 2013 The Flutter Authors. All rights reserved. +// Copyright 2013 The Flutter Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. From 48dcf97c8d0ff5e747e7933d225263210e3fcfde Mon Sep 17 00:00:00 2001 From: David Martos Date: Wed, 22 Oct 2025 16:17:09 +0200 Subject: [PATCH 106/118] [mustache_template] Emoji support (#10110) Support emojis in templates. The code was relying on String.length, when doing substring, which could be wrong when emojis are used. Fixes https://github.com/flutter/flutter/issues/176180 ## Pre-Review Checklist **Note**: The Flutter team is currently trialing the use of [Gemini Code Assist for GitHub](https://developers.google.com/gemini-code-assist/docs/review-github-code). Comments from the `gemini-code-assist` bot should not be taken as authoritative feedback from the Flutter team. If you find its comments useful you can update your code accordingly, but if you are unsure or disagree with the feedback, please feel free to wait for a Flutter team member's review for guidance on which automated comments should be addressed. [^1]: Regular contributors who have demonstrated familiarity with the repository guidelines only need to comment if the PR is not auto-exempted by repo tooling. --- third_party/packages/mustache_template/CHANGELOG.md | 4 ++++ .../packages/mustache_template/lib/src/scanner.dart | 8 ++++---- third_party/packages/mustache_template/pubspec.yaml | 2 +- .../packages/mustache_template/test/mustache_test.dart | 6 ++++++ .../packages/mustache_template/test/parser_test.dart | 8 ++++++++ 5 files changed, 23 insertions(+), 5 deletions(-) diff --git a/third_party/packages/mustache_template/CHANGELOG.md b/third_party/packages/mustache_template/CHANGELOG.md index fd1da85..41f6fe6 100644 --- a/third_party/packages/mustache_template/CHANGELOG.md +++ b/third_party/packages/mustache_template/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.0.2 + +* Adds emoji support. + ## 2.0.1 * Transfers the package source from https://github.com/jonahwilliams/mustache diff --git a/third_party/packages/mustache_template/lib/src/scanner.dart b/third_party/packages/mustache_template/lib/src/scanner.dart index b046c78..7f88954 100644 --- a/third_party/packages/mustache_template/lib/src/scanner.dart +++ b/third_party/packages/mustache_template/lib/src/scanner.dart @@ -126,12 +126,12 @@ class Scanner { if (_c == _EOF) { return ''; } - final int start = _offset; + + final StringBuffer buffer = StringBuffer(); while (_peek() != _EOF && test(_peek())) { - _read(); + buffer.writeCharCode(_read()); } - final int end = _peek() == _EOF ? _source.length : _offset; - return _source.substring(start, end); + return buffer.toString(); } void _expect(int expectedCharCode) { diff --git a/third_party/packages/mustache_template/pubspec.yaml b/third_party/packages/mustache_template/pubspec.yaml index fd0de9f..9927217 100644 --- a/third_party/packages/mustache_template/pubspec.yaml +++ b/third_party/packages/mustache_template/pubspec.yaml @@ -2,7 +2,7 @@ name: mustache_template description: A templating library that implements the Mustache template specification repository: https://github.com/flutter/packages/tree/main/third_party/packages/mustache_template issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+mustache_template%22 -version: 2.0.1 +version: 2.0.2 environment: sdk: ^3.7.0 diff --git a/third_party/packages/mustache_template/test/mustache_test.dart b/third_party/packages/mustache_template/test/mustache_test.dart index 086247b..ace3119 100644 --- a/third_party/packages/mustache_template/test/mustache_test.dart +++ b/third_party/packages/mustache_template/test/mustache_test.dart @@ -24,6 +24,12 @@ void main() { ).renderString({}); expect(output, equals('__')); }); + test('Emoji', () { + final String output = parse( + 'Hello! 🖖👍🏽\nBye! 🏳️‍🌈', + ).renderString({}); + expect(output, equals('Hello! 🖖👍🏽\nBye! 🏳️‍🌈')); + }); }); group('Section', () { test('Map', () { diff --git a/third_party/packages/mustache_template/test/parser_test.dart b/third_party/packages/mustache_template/test/parser_test.dart index 27ccadf..7f849aa 100644 --- a/third_party/packages/mustache_template/test/parser_test.dart +++ b/third_party/packages/mustache_template/test/parser_test.dart @@ -302,6 +302,14 @@ void main() { ]); }); + test('emoji', () { + const String source = 'Hello! 🖖👍🏽🏳️‍🌈\nEmoji'; + final Parser parser = Parser(source, 'foo', '{{ }}'); + final List nodes = parser.parse(); + // End offset includes emoji sizes + expectNodes(nodes, [TextNode('Hello! 🖖👍🏽🏳️‍🌈\nEmoji', 0, 20)]); + }); + test('toString', () { TextNode('foo', 1, 3).toString(); VariableNode('foo', 1, 3).toString(); From 8d072b3fb7061a1cc6f6df23cd69e11502fa73dc Mon Sep 17 00:00:00 2001 From: stuartmorgan-g Date: Wed, 12 Nov 2025 13:25:24 -0500 Subject: [PATCH 107/118] Update repo for 3.38 (#10405) Does all of the steps from https://github.com/flutter/flutter/blob/master/docs/ecosystem/release/Updating-Packages-repo-for-a-stable-release.md for the 3.38 release (except the first one, which the stable roller will handle). This includes a lot of autoformat changes, because the N-2 is now 3.32, which means many packages are now being updated to a min Dart SDK of 3.8, triggering a formatter behavior change. --- packages/flutter_template_images/CHANGELOG.md | 2 +- packages/flutter_template_images/pubspec.yaml | 2 +- packages/multicast_dns/CHANGELOG.md | 2 +- .../multicast_dns/example/mdns_resolve.dart | 12 +- packages/multicast_dns/example/mdns_sd.dart | 8 +- packages/multicast_dns/lib/multicast_dns.dart | 12 +- packages/multicast_dns/lib/src/packet.dart | 15 +- packages/multicast_dns/pubspec.yaml | 2 +- packages/multicast_dns/test/client_test.dart | 138 +++++++++--------- packages/multicast_dns/test/decode_test.dart | 10 +- packages/standard_message_codec/CHANGELOG.md | 2 +- .../example/pubspec.yaml | 2 +- packages/standard_message_codec/pubspec.yaml | 2 +- .../packages/mustache_template/CHANGELOG.md | 4 + .../mustache_template/lib/src/parser.dart | 5 +- .../mustache_template/lib/src/renderer.dart | 14 +- .../packages/mustache_template/pubspec.yaml | 2 +- .../test/mustache_specs.dart | 4 +- .../mustache_template/test/mustache_test.dart | 114 +++++++-------- 19 files changed, 185 insertions(+), 167 deletions(-) diff --git a/packages/flutter_template_images/CHANGELOG.md b/packages/flutter_template_images/CHANGELOG.md index 8f08f28..e8a7a0d 100644 --- a/packages/flutter_template_images/CHANGELOG.md +++ b/packages/flutter_template_images/CHANGELOG.md @@ -1,6 +1,6 @@ ## NEXT -* Updates minimum supported SDK version to Flutter 3.29/Dart 3.7. +* Updates minimum supported SDK version to Flutter 3.32/Dart 3.8. ## 5.0.0 diff --git a/packages/flutter_template_images/pubspec.yaml b/packages/flutter_template_images/pubspec.yaml index 3b7a32b..3d4cdaa 100644 --- a/packages/flutter_template_images/pubspec.yaml +++ b/packages/flutter_template_images/pubspec.yaml @@ -5,7 +5,7 @@ issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+ version: 5.0.0 environment: - sdk: ^3.7.0 + sdk: ^3.8.0 topics: - assets diff --git a/packages/multicast_dns/CHANGELOG.md b/packages/multicast_dns/CHANGELOG.md index 6c4cbfa..a5055cd 100644 --- a/packages/multicast_dns/CHANGELOG.md +++ b/packages/multicast_dns/CHANGELOG.md @@ -1,6 +1,6 @@ ## NEXT -* Updates minimum supported SDK version to Flutter 3.29/Dart 3.7. +* Updates minimum supported SDK version to Flutter 3.32/Dart 3.8. ## 0.3.3 diff --git a/packages/multicast_dns/example/mdns_resolve.dart b/packages/multicast_dns/example/mdns_resolve.dart index e5626d3..97ef0d8 100644 --- a/packages/multicast_dns/example/mdns_resolve.dart +++ b/packages/multicast_dns/example/mdns_resolve.dart @@ -23,13 +23,17 @@ For example: final MDnsClient client = MDnsClient(); await client.start(); - await for (final IPAddressResourceRecord record in client - .lookup(ResourceRecordQuery.addressIPv4(name))) { + await for (final IPAddressResourceRecord record + in client.lookup( + ResourceRecordQuery.addressIPv4(name), + )) { print('Found address (${record.address}).'); } - await for (final IPAddressResourceRecord record in client - .lookup(ResourceRecordQuery.addressIPv6(name))) { + await for (final IPAddressResourceRecord record + in client.lookup( + ResourceRecordQuery.addressIPv6(name), + )) { print('Found address (${record.address}).'); } client.stop(); diff --git a/packages/multicast_dns/example/mdns_sd.dart b/packages/multicast_dns/example/mdns_sd.dart index d6e2c4f..4c4d5fe 100644 --- a/packages/multicast_dns/example/mdns_sd.dart +++ b/packages/multicast_dns/example/mdns_sd.dart @@ -41,8 +41,8 @@ For example: .lookup(ResourceRecordQuery.text(ptr.domainName)) .forEach(print); } - await for (final IPAddressResourceRecord ip in client - .lookup( + await for (final IPAddressResourceRecord ip + in client.lookup( ResourceRecordQuery.addressIPv4(srv.target), )) { if (verbose) { @@ -53,8 +53,8 @@ For example: '${srv.target}:${srv.port} with ${ip.address}.', ); } - await for (final IPAddressResourceRecord ip in client - .lookup( + await for (final IPAddressResourceRecord ip + in client.lookup( ResourceRecordQuery.addressIPv6(srv.target), )) { if (verbose) { diff --git a/packages/multicast_dns/lib/multicast_dns.dart b/packages/multicast_dns/lib/multicast_dns.dart index 6c92e33..0a0c7d7 100644 --- a/packages/multicast_dns/lib/multicast_dns.dart +++ b/packages/multicast_dns/lib/multicast_dns.dart @@ -135,13 +135,13 @@ class MDnsClient { _ipv6InterfaceSockets.add(incoming); } - _mDnsAddress ??= - incoming.address.type == InternetAddressType.IPv4 - ? mDnsAddressIPv4 - : mDnsAddressIPv6; + _mDnsAddress ??= incoming.address.type == InternetAddressType.IPv4 + ? mDnsAddressIPv4 + : mDnsAddressIPv6; - final List interfaces = - (await interfacesFactory(listenAddress.type)).toList(); + final List interfaces = (await interfacesFactory( + listenAddress.type, + )).toList(); for (final NetworkInterface interface in interfaces) { final InternetAddress targetAddress = interface.addresses[0]; diff --git a/packages/multicast_dns/lib/src/packet.dart b/packages/multicast_dns/lib/src/packet.dart index eb5f464..60e1b07 100644 --- a/packages/multicast_dns/lib/src/packet.dart +++ b/packages/multicast_dns/lib/src/packet.dart @@ -50,8 +50,9 @@ List encodeMDnsQuery( assert(ResourceRecordType.debugAssertValid(type)); final List nameParts = processDnsNameParts(name); - final List> rawNameParts = - nameParts.map>((String part) => utf8.encode(part)).toList(); + final List> rawNameParts = nameParts + .map>((String part) => utf8.encode(part)) + .toList(); // Calculate the size of the packet. int size = _kHeaderSize; @@ -115,8 +116,9 @@ class _FQDNReadResult { /// Reads a FQDN from raw packet data. String readFQDN(List packet, [int offset = 0]) { - final Uint8List data = - packet is Uint8List ? packet : Uint8List.fromList(packet); + final Uint8List data = packet is Uint8List + ? packet + : Uint8List.fromList(packet); final ByteData byteData = ByteData.view(data.buffer); return _readFQDN(data, byteData, offset, data.length).fqdn; @@ -205,8 +207,9 @@ List? decodeMDnsResponse(List packet) { return null; } - final Uint8List data = - packet is Uint8List ? packet : Uint8List.fromList(packet); + final Uint8List data = packet is Uint8List + ? packet + : Uint8List.fromList(packet); final ByteData packetBytes = ByteData.view(data.buffer); final int answerCount = packetBytes.getUint16(_kAncountOffset); diff --git a/packages/multicast_dns/pubspec.yaml b/packages/multicast_dns/pubspec.yaml index 38de03a..b8921c6 100644 --- a/packages/multicast_dns/pubspec.yaml +++ b/packages/multicast_dns/pubspec.yaml @@ -5,7 +5,7 @@ issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+ version: 0.3.3 environment: - sdk: ^3.7.0 + sdk: ^3.8.0 dependencies: meta: ^1.3.0 diff --git a/packages/multicast_dns/test/client_test.dart b/packages/multicast_dns/test/client_test.dart index 99730c6..79483e5 100644 --- a/packages/multicast_dns/test/client_test.dart +++ b/packages/multicast_dns/test/client_test.dart @@ -14,22 +14,23 @@ void main() { late int lastPort; final FakeRawDatagramSocket datagramSocket = FakeRawDatagramSocket(); final MDnsClient client = MDnsClient( - rawDatagramSocketFactory: ( - dynamic host, - int port, { - bool reuseAddress = true, - bool reusePort = true, - int ttl = 1, - }) async { - lastPort = port; - return datagramSocket; - }, + rawDatagramSocketFactory: + ( + dynamic host, + int port, { + bool reuseAddress = true, + bool reusePort = true, + int ttl = 1, + }) async { + lastPort = port; + return datagramSocket; + }, ); await client.start( mDnsPort: 1234, - interfacesFactory: - (InternetAddressType type) async => [], + interfacesFactory: (InternetAddressType type) async => + [], ); expect(lastPort, 1234); @@ -38,21 +39,22 @@ void main() { test('Closes IPv4 sockets', () async { final FakeRawDatagramSocket datagramSocket = FakeRawDatagramSocket(); final MDnsClient client = MDnsClient( - rawDatagramSocketFactory: ( - dynamic host, - int port, { - bool reuseAddress = true, - bool reusePort = true, - int ttl = 1, - }) async { - return datagramSocket; - }, + rawDatagramSocketFactory: + ( + dynamic host, + int port, { + bool reuseAddress = true, + bool reusePort = true, + int ttl = 1, + }) async { + return datagramSocket; + }, ); await client.start( mDnsPort: 1234, - interfacesFactory: - (InternetAddressType type) async => [], + interfacesFactory: (InternetAddressType type) async => + [], ); expect(datagramSocket.closed, false); client.stop(); @@ -63,21 +65,22 @@ void main() { final FakeRawDatagramSocket datagramSocket = FakeRawDatagramSocket(); datagramSocket.address = InternetAddress.anyIPv6; final MDnsClient client = MDnsClient( - rawDatagramSocketFactory: ( - dynamic host, - int port, { - bool reuseAddress = true, - bool reusePort = true, - int ttl = 1, - }) async { - return datagramSocket; - }, + rawDatagramSocketFactory: + ( + dynamic host, + int port, { + bool reuseAddress = true, + bool reusePort = true, + int ttl = 1, + }) async { + return datagramSocket; + }, ); await client.start( mDnsPort: 1234, - interfacesFactory: - (InternetAddressType type) async => [], + interfacesFactory: (InternetAddressType type) async => + [], ); expect(datagramSocket.closed, false); client.stop(); @@ -88,20 +91,21 @@ void main() { final FakeRawDatagramSocket datagramSocket = FakeRawDatagramSocket(); datagramSocket.address = InternetAddress.anyIPv4; final MDnsClient client = MDnsClient( - rawDatagramSocketFactory: ( - dynamic host, - int port, { - bool reuseAddress = true, - bool reusePort = true, - int ttl = 1, - }) async { - return datagramSocket; - }, + rawDatagramSocketFactory: + ( + dynamic host, + int port, { + bool reuseAddress = true, + bool reusePort = true, + int ttl = 1, + }) async { + return datagramSocket; + }, ); await client.start( - interfacesFactory: - (InternetAddressType type) async => [], + interfacesFactory: (InternetAddressType type) async => + [], ); await client.start(); await client.lookup(ResourceRecordQuery.serverPointer('_')).toList(); @@ -130,16 +134,17 @@ void main() { final List selectedInterfacesForSendingPackets = []; final MDnsClient client = MDnsClient( - rawDatagramSocketFactory: ( - dynamic host, - int port, { - bool reuseAddress = true, - bool reusePort = true, - int ttl = 1, - }) async { - selectedInterfacesForSendingPackets.add(host); - return datagramSocket; - }, + rawDatagramSocketFactory: + ( + dynamic host, + int port, { + bool reuseAddress = true, + bool reusePort = true, + int ttl = 1, + }) async { + selectedInterfacesForSendingPackets.add(host); + return datagramSocket; + }, ); const int numberOfFakeInterfaces = 10; @@ -189,22 +194,23 @@ void main() { final FakeRawDatagramSocketThatSendsError datagramSocket = FakeRawDatagramSocketThatSendsError(); final MDnsClient client = MDnsClient( - rawDatagramSocketFactory: ( - dynamic host, - int port, { - bool reuseAddress = true, - bool reusePort = true, - int ttl = 1, - }) async { - return datagramSocket; - }, + rawDatagramSocketFactory: + ( + dynamic host, + int port, { + bool reuseAddress = true, + bool reusePort = true, + int ttl = 1, + }) async { + return datagramSocket; + }, ); final Completer onErrorCalledCompleter = Completer(); await client.start( mDnsPort: 1234, - interfacesFactory: - (InternetAddressType type) async => [], + interfacesFactory: (InternetAddressType type) async => + [], onError: (Object e) { expect(e, 'Error'); onErrorCalledCompleter.complete(); diff --git a/packages/multicast_dns/test/decode_test.dart b/packages/multicast_dns/test/decode_test.dart index f964c8b..acadeed 100644 --- a/packages/multicast_dns/test/decode_test.dart +++ b/packages/multicast_dns/test/decode_test.dart @@ -129,8 +129,9 @@ void testValidPackages() { // Fixes https://github.com/flutter/flutter/issues/31854 test('Can decode packages with question, answer and additional', () { - final List result = - decodeMDnsResponse(packetWithQuestionAnArCount)!; + final List result = decodeMDnsResponse( + packetWithQuestionAnArCount, + )!; expect(result, isNotNull); expect(result.length, 2); expect(result, [ @@ -151,8 +152,9 @@ void testValidPackages() { test( 'Can decode packages without question and with answer and additional', () { - final List result = - decodeMDnsResponse(packetWithoutQuestionWithAnArCount)!; + final List result = decodeMDnsResponse( + packetWithoutQuestionWithAnArCount, + )!; expect(result, isNotNull); expect(result.length, 2); expect(result, [ diff --git a/packages/standard_message_codec/CHANGELOG.md b/packages/standard_message_codec/CHANGELOG.md index 6196c6a..2547181 100644 --- a/packages/standard_message_codec/CHANGELOG.md +++ b/packages/standard_message_codec/CHANGELOG.md @@ -1,6 +1,6 @@ ## NEXT -* Updates minimum supported SDK version to Flutter 3.29/Dart 3.7. +* Updates minimum supported SDK version to Flutter 3.32/Dart 3.8. ## 0.0.1+4 diff --git a/packages/standard_message_codec/example/pubspec.yaml b/packages/standard_message_codec/example/pubspec.yaml index e3faa94..ef638a0 100644 --- a/packages/standard_message_codec/example/pubspec.yaml +++ b/packages/standard_message_codec/example/pubspec.yaml @@ -4,7 +4,7 @@ version: 0.0.1 publish_to: none environment: - sdk: ^3.7.0 + sdk: ^3.8.0 dependencies: standard_message_codec: diff --git a/packages/standard_message_codec/pubspec.yaml b/packages/standard_message_codec/pubspec.yaml index ddfb1a8..a98decf 100644 --- a/packages/standard_message_codec/pubspec.yaml +++ b/packages/standard_message_codec/pubspec.yaml @@ -5,7 +5,7 @@ repository: https://github.com/flutter/packages/tree/main/packages/standard_mess issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3Astandard_message_codec environment: - sdk: ^3.7.0 + sdk: ^3.8.0 dev_dependencies: test: ^1.16.0 diff --git a/third_party/packages/mustache_template/CHANGELOG.md b/third_party/packages/mustache_template/CHANGELOG.md index 41f6fe6..eae4a53 100644 --- a/third_party/packages/mustache_template/CHANGELOG.md +++ b/third_party/packages/mustache_template/CHANGELOG.md @@ -1,3 +1,7 @@ +## NEXT + +* Updates minimum supported SDK version to Flutter 3.32/Dart 3.8. + ## 2.0.2 * Adds emoji support. diff --git a/third_party/packages/mustache_template/lib/src/parser.dart b/third_party/packages/mustache_template/lib/src/parser.dart index b3d4f4b..60f039c 100644 --- a/third_party/packages/mustache_template/lib/src/parser.dart +++ b/third_party/packages/mustache_template/lib/src/parser.dart @@ -252,8 +252,9 @@ class Parser { TokenType.whitespace, eofOk: true, ); - final String indent = - precedingWhitespace == null ? '' : precedingWhitespace.value; + final String indent = precedingWhitespace == null + ? '' + : precedingWhitespace.value; final Tag? tag = _readTag(); final Node? tagNode = _createNodeFromTag(tag, partialIndent: indent); final Token? followingWhitespace = _readIf( diff --git a/third_party/packages/mustache_template/lib/src/renderer.dart b/third_party/packages/mustache_template/lib/src/renderer.dart index 09fdff6..bddaa69 100644 --- a/third_party/packages/mustache_template/lib/src/renderer.dart +++ b/third_party/packages/mustache_template/lib/src/renderer.dart @@ -131,10 +131,9 @@ class Renderer extends Visitor { } } else { final String valueString = (value == null) ? '' : value.toString(); - final String output = - !node.escape || !htmlEscapeValues - ? valueString - : _htmlEscape(valueString); + final String output = !node.escape || !htmlEscapeValues + ? valueString + : _htmlEscape(valueString); write(output); } } @@ -227,10 +226,9 @@ class Renderer extends Visitor { @override void visitPartial(PartialNode node) { final String partialName = node.name; - final Template? template = - partialResolver == null - ? null - : (partialResolver!(partialName) as Template?); + final Template? template = partialResolver == null + ? null + : (partialResolver!(partialName) as Template?); if (template != null) { final Renderer renderer = Renderer.partial(this, template, node.indent); final List nodes = getTemplateNodes(template); diff --git a/third_party/packages/mustache_template/pubspec.yaml b/third_party/packages/mustache_template/pubspec.yaml index 9927217..859fa36 100644 --- a/third_party/packages/mustache_template/pubspec.yaml +++ b/third_party/packages/mustache_template/pubspec.yaml @@ -5,7 +5,7 @@ issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+ version: 2.0.2 environment: - sdk: ^3.7.0 + sdk: ^3.8.0 dev_dependencies: test: ^1.16.5 diff --git a/third_party/packages/mustache_template/test/mustache_specs.dart b/third_party/packages/mustache_template/test/mustache_specs.dart index ff4103c..d1186b7 100644 --- a/third_party/packages/mustache_template/test/mustache_specs.dart +++ b/third_party/packages/mustache_template/test/mustache_specs.dart @@ -46,8 +46,8 @@ void defineTests() { void _defineGroupFromFile(String filename, String text) { final Map jsondata = (json.decode(text) as Map).cast(); - final List> tests = - (jsondata['tests']! as List).cast>(); + final List> tests = (jsondata['tests']! as List) + .cast>(); filename = filename.substring(filename.lastIndexOf('/') + 1); group('Specs of $filename', () { for (final Map t in tests) { diff --git a/third_party/packages/mustache_template/test/mustache_test.dart b/third_party/packages/mustache_template/test/mustache_test.dart index ace3119..6153aa3 100644 --- a/third_party/packages/mustache_template/test/mustache_test.dart +++ b/third_party/packages/mustache_template/test/mustache_test.dart @@ -33,22 +33,20 @@ void main() { }); group('Section', () { test('Map', () { - final String output = parse( - '{{#section}}_{{var}}_{{/section}}', - ).renderString(>{ - 'section': {'var': 'bob'}, - }); + final String output = parse('{{#section}}_{{var}}_{{/section}}') + .renderString(>{ + 'section': {'var': 'bob'}, + }); expect(output, equals('_bob_')); }); test('List', () { - final String output = parse( - '{{#section}}_{{var}}_{{/section}}', - ).renderString(>>{ - 'section': >[ - {'var': 'bob'}, - {'var': 'jim'}, - ], - }); + final String output = parse('{{#section}}_{{var}}_{{/section}}') + .renderString(>>{ + 'section': >[ + {'var': 'bob'}, + {'var': 'jim'}, + ], + }); expect(output, equals('_bob__jim_')); }); test('Empty List', () { @@ -90,17 +88,18 @@ void main() { }); test('Nested', () { - final String output = parse( - '{{#section}}.{{var}}.{{#nested}}_{{nestedvar}}_{{/nested}}.{{/section}}', - ).renderString(>{ - 'section': { - 'var': 'bob', - 'nested': >[ - {'nestedvar': 'jim'}, - {'nestedvar': 'sally'}, - ], - }, - }); + final String output = + parse( + '{{#section}}.{{var}}.{{#nested}}_{{nestedvar}}_{{/nested}}.{{/section}}', + ).renderString(>{ + 'section': { + 'var': 'bob', + 'nested': >[ + {'nestedvar': 'jim'}, + {'nestedvar': 'sally'}, + ], + }, + }); expect(output, equals('.bob._jim__sally_.')); }); @@ -281,22 +280,20 @@ void main() { group('Inverse Section', () { test('Map', () { - final String output = parse( - '{{^section}}_{{var}}_{{/section}}', - ).renderString(>{ - 'section': {'var': 'bob'}, - }); + final String output = parse('{{^section}}_{{var}}_{{/section}}') + .renderString(>{ + 'section': {'var': 'bob'}, + }); expect(output, equals('')); }); test('List', () { - final String output = parse( - '{{^section}}_{{var}}_{{/section}}', - ).renderString(>>{ - 'section': >[ - {'var': 'bob'}, - {'var': 'jim'}, - ], - }); + final String output = parse('{{^section}}_{{var}}_{{/section}}') + .renderString(>>{ + 'section': >[ + {'var': 'bob'}, + {'var': 'jim'}, + ], + }); expect(output, equals('')); }); test('Empty List', () { @@ -464,32 +461,35 @@ void main() { group('Lenient', () { test('Odd section name', () { - final String output = parse( - r'{{#section$%$^%}}_{{var}}_{{/section$%$^%}}', - lenient: true, - ).renderString(>{ - r'section$%$^%': {'var': 'bob'}, - }); + final String output = + parse( + r'{{#section$%$^%}}_{{var}}_{{/section$%$^%}}', + lenient: true, + ).renderString(>{ + r'section$%$^%': {'var': 'bob'}, + }); expect(output, equals('_bob_')); }); test('Odd variable name', () { - final String output = parse( - r'{{#section}}_{{var$%$^%}}_{{/section}}', - lenient: true, - ).renderString(>{ - 'section': {r'var$%$^%': 'bob'}, - }); + final String output = + parse( + r'{{#section}}_{{var$%$^%}}_{{/section}}', + lenient: true, + ).renderString(>{ + 'section': {r'var$%$^%': 'bob'}, + }); expect(output, equals('_bob_')); }); test('Null variable', () { - final String output = parse( - r'{{#section}}_{{var}}_{{/section}}', - lenient: true, - ).renderString(>{ - 'section': {'var': null}, - }); + final String output = + parse( + r'{{#section}}_{{var}}_{{/section}}', + lenient: true, + ).renderString(>{ + 'section': {'var': null}, + }); expect(output, equals('__')); }); @@ -717,8 +717,8 @@ void main() { //function() { return "|planet| => {{planet}}" } final Map values = { 'planet': 'world', - 'lambda': - (LambdaContext ctx) => ctx.renderSource('|planet| => {{planet}}'), + 'lambda': (LambdaContext ctx) => + ctx.renderSource('|planet| => {{planet}}'), }; const String output = 'Hello, (|planet| => world)!'; From 9a9cd5397497313fb114e86037b4af0d152fa725 Mon Sep 17 00:00:00 2001 From: stuartmorgan-g Date: Mon, 24 Nov 2025 18:26:06 -0500 Subject: [PATCH 108/118] [all] Omit obvious local types (#10511) Makes the analysis options changes described in https://github.com/flutter/flutter/issues/178827: - Adding [omit_obvious_local_variable_types](https://dart.dev/tools/linter-rules/omit_obvious_local_variable_types) - Adding [specify_nonobvious_local_variable_types](https://dart.dev/tools/linter-rules/specify_nonobvious_local_variable_types) - Adding [specify_nonobvious_property_types](https://dart.dev/tools/linter-rules/specify_nonobvious_property_types) - Adding [type_annotate_public_apis](https://dart.dev/tools/linter-rules/type_annotate_public_apis) - Removing [always_specify_types](https://dart.dev/tools/linter-rules/always_specify_types) After those changes, makes the following repo-wide changes: - `dart fix --apply` in all packages and in script/tool/ - `dart format` in all packages and in script/tool/ - `update-excerpts` repo tooling command to update excerpts based on the changes to their sources Also updates the min Flutter/Dart SDK version to 3.35/3.9 for the following packages, to avoid `analyze` failures in the `N-2` legacy analysis run due to what appears to be a 3.9 change in what the Dart analyzer continues to be an obvious local type in loop iterations: - go_router - google_fonts - google_identity_services_web - google_maps_flutter_web - local_auth_platform_interface - metrics_center - multicast_dns - pigeon - rfw - shared_preferences - two_dimensional_scrollables - vector_graphics_compiler - mustache_template - path_parsing Because this is causing a significant amount of format churn already, I took this opportunity to update the repository tooling to a min Dart SDK of 3.8 (the N-2 stable version, so the earliest version we need the tooling to support) to pick up the new format style, so the amount of automated formatter change is higher in script/tool/ than in the packages. This does contain two manual changes (other than the repo tooling min version): - https://github.com/flutter/packages/commit/d700b45c7df3a79f66dc119ad36dd2bc1e042acf changes `dynamic` to `Object?` in a few places where `dynamic` caused analyzer warnings under the new rule set. - Updates the repo tooling to ignore `.dart_tool/` when looking for unexpected local `analysis_options.yaml` files, to fix issues running the repo tool's `analyze` command locally based on recent changes in `dart` behavior. This does not include any CHANGELOG or version updates; even though we normally version any changes to production code, mass automated changes like this aren't worth the churn of releasing. This includes changes to lib/example/main.dart and to README.md excerpts; while the style changes will be user-visible on pub.dev, it's fine for those changes to wait for the next release of each package. Part of https://github.com/flutter/flutter/issues/178827 --- packages/multicast_dns/CHANGELOG.md | 2 +- packages/multicast_dns/example/main.dart | 4 +- .../multicast_dns/example/mdns_resolve.dart | 2 +- packages/multicast_dns/example/mdns_sd.dart | 2 +- packages/multicast_dns/lib/multicast_dns.dart | 6 +- .../lib/src/lookup_resolver.dart | 8 +- .../lib/src/native_protocol_client.dart | 6 +- packages/multicast_dns/lib/src/packet.dart | 42 ++--- .../lib/src/resource_record.dart | 4 +- packages/multicast_dns/pubspec.yaml | 2 +- packages/multicast_dns/test/client_test.dart | 41 +++-- packages/multicast_dns/test/decode_test.dart | 8 +- .../test/lookup_resolver_test.dart | 31 ++-- .../test/resource_record_cache_test.dart | 12 +- packages/multicast_dns/tool/packet_gen.dart | 12 +- .../lib/src/serialization.dart | 4 +- .../lib/standard_message_codec.dart | 20 +-- .../test/standard_message_codec_test.dart | 62 +++---- .../packages/mustache_template/CHANGELOG.md | 2 +- .../lib/src/lambda_context.dart | 17 +- .../mustache_template/lib/src/parser.dart | 23 +-- .../mustache_template/lib/src/renderer.dart | 18 +- .../mustache_template/lib/src/scanner.dart | 14 +- .../mustache_template/lib/src/template.dart | 4 +- .../lib/src/template_exception.dart | 20 +-- .../packages/mustache_template/pubspec.yaml | 2 +- .../test/mustache_specs.dart | 17 +- .../mustache_template/test/mustache_test.dart | 165 +++++++++--------- .../mustache_template/test/parser_test.dart | 111 ++++++------ 29 files changed, 307 insertions(+), 354 deletions(-) diff --git a/packages/multicast_dns/CHANGELOG.md b/packages/multicast_dns/CHANGELOG.md index a5055cd..ab44bf6 100644 --- a/packages/multicast_dns/CHANGELOG.md +++ b/packages/multicast_dns/CHANGELOG.md @@ -1,6 +1,6 @@ ## NEXT -* Updates minimum supported SDK version to Flutter 3.32/Dart 3.8. +* Updates minimum supported SDK version to Flutter 3.35/Dart 3.9. ## 0.3.3 diff --git a/packages/multicast_dns/example/main.dart b/packages/multicast_dns/example/main.dart index 360d5a3..bb441d7 100644 --- a/packages/multicast_dns/example/main.dart +++ b/packages/multicast_dns/example/main.dart @@ -12,8 +12,8 @@ import 'package:multicast_dns/multicast_dns.dart'; Future main() async { // Parse the command line arguments. - const String name = '_dartobservatory._tcp.local'; - final MDnsClient client = MDnsClient(); + const name = '_dartobservatory._tcp.local'; + final client = MDnsClient(); // Start the client with default options. await client.start(); diff --git a/packages/multicast_dns/example/mdns_resolve.dart b/packages/multicast_dns/example/mdns_resolve.dart index 97ef0d8..ed43014 100644 --- a/packages/multicast_dns/example/mdns_resolve.dart +++ b/packages/multicast_dns/example/mdns_resolve.dart @@ -21,7 +21,7 @@ For example: final String name = args[0]; - final MDnsClient client = MDnsClient(); + final client = MDnsClient(); await client.start(); await for (final IPAddressResourceRecord record in client.lookup( diff --git a/packages/multicast_dns/example/mdns_sd.dart b/packages/multicast_dns/example/mdns_sd.dart index 4c4d5fe..1d2f362 100644 --- a/packages/multicast_dns/example/mdns_sd.dart +++ b/packages/multicast_dns/example/mdns_sd.dart @@ -21,7 +21,7 @@ For example: final bool verbose = args.contains('--verbose') || args.contains('-v'); final String name = args.last; - final MDnsClient client = MDnsClient(); + final client = MDnsClient(); await client.start(); await for (final PtrResourceRecord ptr in client.lookup( diff --git a/packages/multicast_dns/lib/multicast_dns.dart b/packages/multicast_dns/lib/multicast_dns.dart index 0a0c7d7..3b5b2b5 100644 --- a/packages/multicast_dns/lib/multicast_dns.dart +++ b/packages/multicast_dns/lib/multicast_dns.dart @@ -143,7 +143,7 @@ class MDnsClient { listenAddress.type, )).toList(); - for (final NetworkInterface interface in interfaces) { + for (final interface in interfaces) { final InternetAddress targetAddress = interface.addresses[0]; // Ensure that we're using this address/interface for multicast. @@ -217,14 +217,14 @@ class MDnsClient { throw StateError('mDNS client must be started before calling lookup.'); } // Look for entries in the cache. - final List cached = []; + final cached = []; _cache.lookup( query.fullyQualifiedName, query.resourceRecordType, cached, ); if (cached.isNotEmpty) { - final StreamController controller = StreamController(); + final controller = StreamController(); cached.forEach(controller.add); controller.close(); return controller.stream; diff --git a/packages/multicast_dns/lib/src/lookup_resolver.dart b/packages/multicast_dns/lib/src/lookup_resolver.dart index 531be38..bca9c16 100644 --- a/packages/multicast_dns/lib/src/lookup_resolver.dart +++ b/packages/multicast_dns/lib/src/lookup_resolver.dart @@ -40,9 +40,9 @@ class LookupResolver { String name, Duration timeout, ) { - final StreamController controller = StreamController(); - final PendingRequest request = PendingRequest(type, name, controller); - final Timer timer = Timer(timeout, () { + final controller = StreamController(); + final request = PendingRequest(type, name, controller); + final timer = Timer(timeout, () { request.unlink(); controller.close(); }); @@ -54,7 +54,7 @@ class LookupResolver { /// Parses [ResoureRecord]s received and delivers them to the appropriate /// listener(s) added via [addPendingRequest]. void handleResponse(List response) { - for (final ResourceRecord r in response) { + for (final r in response) { final int type = r.resourceRecordType; String name = r.name.toLowerCase(); if (name.endsWith('.')) { diff --git a/packages/multicast_dns/lib/src/native_protocol_client.dart b/packages/multicast_dns/lib/src/native_protocol_client.dart index 4c07df8..89ea986 100644 --- a/packages/multicast_dns/lib/src/native_protocol_client.dart +++ b/packages/multicast_dns/lib/src/native_protocol_client.dart @@ -25,7 +25,7 @@ class ResourceRecordCache { /// The number of entries in the cache. int get entryCount { - int count = 0; + var count = 0; for (final SplayTreeMap> map in _cache.values) { for (final List records in map.values) { @@ -40,8 +40,8 @@ class ResourceRecordCache { // TODO(karlklose): include flush bit in the record and only flush if // necessary. // Clear the cache for all name/type combinations to be updated. - final Map> seenRecordTypes = >{}; - for (final ResourceRecord record in records) { + final seenRecordTypes = >{}; + for (final record in records) { // TODO(dnfield): Update this to use set literal syntax when we're able to bump the SDK constraint. seenRecordTypes[record.resourceRecordType] ??= Set(); // ignore: prefer_collection_literals diff --git a/packages/multicast_dns/lib/src/packet.dart b/packages/multicast_dns/lib/src/packet.dart index 60e1b07..a914370 100644 --- a/packages/multicast_dns/lib/src/packet.dart +++ b/packages/multicast_dns/lib/src/packet.dart @@ -56,14 +56,14 @@ List encodeMDnsQuery( // Calculate the size of the packet. int size = _kHeaderSize; - for (int i = 0; i < rawNameParts.length; i++) { + for (var i = 0; i < rawNameParts.length; i++) { size += 1 + rawNameParts[i].length; } size += 1; // End with empty part size += 4; // Trailer (QTYPE and QCLASS). - final Uint8List data = Uint8List(size); - final ByteData packetByteData = ByteData.view(data.buffer); + final data = Uint8List(size); + final packetByteData = ByteData.view(data.buffer); // Query identifier - just use 0. packetByteData.setUint16(_kIdOffset, 0); // Flags - 0 for query. @@ -77,7 +77,7 @@ List encodeMDnsQuery( // Number of resource records - 0 for query. packetByteData.setUint16(_kArcountOffset, 0); int offset = _kHeaderSize; - for (int i = 0; i < rawNameParts.length; i++) { + for (var i = 0; i < rawNameParts.length; i++) { data[offset++] = rawNameParts[i].length; data.setRange(offset, offset + rawNameParts[i].length, rawNameParts[i]); offset += rawNameParts[i].length; @@ -119,7 +119,7 @@ String readFQDN(List packet, [int offset = 0]) { final Uint8List data = packet is Uint8List ? packet : Uint8List.fromList(packet); - final ByteData byteData = ByteData.view(data.buffer); + final byteData = ByteData.view(data.buffer); return _readFQDN(data, byteData, offset, data.length).fqdn; } @@ -140,11 +140,11 @@ _FQDNReadResult _readFQDN( } } - final List parts = []; - final int prevOffset = offset; - final List offsetsToVisit = [offset]; - int upperLimitOffset = offset; - int highestOffsetRead = offset; + final parts = []; + final prevOffset = offset; + final offsetsToVisit = [offset]; + var upperLimitOffset = offset; + var highestOffsetRead = offset; while (offsetsToVisit.isNotEmpty) { offset = offsetsToVisit.removeLast(); @@ -175,11 +175,7 @@ _FQDNReadResult _readFQDN( offset++; if (partLength > 0) { checkLength(offset + partLength); - final Uint8List partBytes = Uint8List.view( - data.buffer, - offset, - partLength, - ); + final partBytes = Uint8List.view(data.buffer, offset, partLength); offset += partLength; // According to the RFC, this is supposed to be utf-8 encoded, but // we should continue decoding even if it isn't to avoid dropping the @@ -210,7 +206,7 @@ List? decodeMDnsResponse(List packet) { final Uint8List data = packet is Uint8List ? packet : Uint8List.fromList(packet); - final ByteData packetBytes = ByteData.view(data.buffer); + final packetBytes = ByteData.view(data.buffer); final int answerCount = packetBytes.getUint16(_kAncountOffset); final int authorityCount = packetBytes.getUint16(_kNscountOffset); @@ -261,7 +257,7 @@ List? decodeMDnsResponse(List packet) { switch (type) { case ResourceRecordType.addressIPv4: checkLength(offset + readDataLength); - final StringBuffer addr = StringBuffer(); + final addr = StringBuffer(); final int stop = offset + readDataLength; addr.write(packetBytes.getUint8(offset)); offset++; @@ -276,7 +272,7 @@ List? decodeMDnsResponse(List packet) { ); case ResourceRecordType.addressIPv6: checkLength(offset + readDataLength); - final StringBuffer addr = StringBuffer(); + final addr = StringBuffer(); final int stop = offset + readDataLength; addr.write(packetBytes.getUint16(offset).toRadixString(16)); offset += 2; @@ -329,8 +325,8 @@ List? decodeMDnsResponse(List packet) { // The first byte of the buffer is the length of the first string of // the TXT record. Further length-prefixed strings may follow. We // concatenate them with newlines. - final StringBuffer strings = StringBuffer(); - int index = 0; + final strings = StringBuffer(); + var index = 0; while (index < readDataLength) { final int txtLength = data[offset + index]; index++; @@ -356,10 +352,10 @@ List? decodeMDnsResponse(List packet) { // This list can't be fixed length right now because we might get // resource record types we don't support, and consumers expect this list // to not have null entries. - final List result = []; + final result = []; try { - for (int i = 0; i < questionCount; i++) { + for (var i = 0; i < questionCount; i++) { final _FQDNReadResult result = _readFQDN( data, packetBytes, @@ -370,7 +366,7 @@ List? decodeMDnsResponse(List packet) { checkLength(offset + 4); offset += 4; } - for (int i = 0; i < remainingCount; i++) { + for (var i = 0; i < remainingCount; i++) { final ResourceRecord? record = readResourceRecord(); if (record != null) { result.add(record); diff --git a/packages/multicast_dns/lib/src/resource_record.dart b/packages/multicast_dns/lib/src/resource_record.dart index bb2cc9c..f16d9a1 100644 --- a/packages/multicast_dns/lib/src/resource_record.dart +++ b/packages/multicast_dns/lib/src/resource_record.dart @@ -310,8 +310,8 @@ class SrvResourceRecord extends ResourceRecord { @override Uint8List encodeResponseRecord() { final List data = utf8.encode(target); - final Uint8List result = Uint8List(data.length + 7); - final ByteData resultData = ByteData.view(result.buffer); + final result = Uint8List(data.length + 7); + final resultData = ByteData.view(result.buffer); resultData.setUint16(0, priority); resultData.setUint16(2, weight); resultData.setUint16(4, port); diff --git a/packages/multicast_dns/pubspec.yaml b/packages/multicast_dns/pubspec.yaml index b8921c6..ebd2ed2 100644 --- a/packages/multicast_dns/pubspec.yaml +++ b/packages/multicast_dns/pubspec.yaml @@ -5,7 +5,7 @@ issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+ version: 0.3.3 environment: - sdk: ^3.8.0 + sdk: ^3.9.0 dependencies: meta: ^1.3.0 diff --git a/packages/multicast_dns/test/client_test.dart b/packages/multicast_dns/test/client_test.dart index 79483e5..89bb647 100644 --- a/packages/multicast_dns/test/client_test.dart +++ b/packages/multicast_dns/test/client_test.dart @@ -12,8 +12,8 @@ import 'package:test/test.dart'; void main() { test('Can inject datagram socket factory and configure mdns port', () async { late int lastPort; - final FakeRawDatagramSocket datagramSocket = FakeRawDatagramSocket(); - final MDnsClient client = MDnsClient( + final datagramSocket = FakeRawDatagramSocket(); + final client = MDnsClient( rawDatagramSocketFactory: ( dynamic host, @@ -37,8 +37,8 @@ void main() { }); test('Closes IPv4 sockets', () async { - final FakeRawDatagramSocket datagramSocket = FakeRawDatagramSocket(); - final MDnsClient client = MDnsClient( + final datagramSocket = FakeRawDatagramSocket(); + final client = MDnsClient( rawDatagramSocketFactory: ( dynamic host, @@ -62,9 +62,9 @@ void main() { }); test('Closes IPv6 sockets', () async { - final FakeRawDatagramSocket datagramSocket = FakeRawDatagramSocket(); + final datagramSocket = FakeRawDatagramSocket(); datagramSocket.address = InternetAddress.anyIPv6; - final MDnsClient client = MDnsClient( + final client = MDnsClient( rawDatagramSocketFactory: ( dynamic host, @@ -88,9 +88,9 @@ void main() { }); test('start() is idempotent', () async { - final FakeRawDatagramSocket datagramSocket = FakeRawDatagramSocket(); + final datagramSocket = FakeRawDatagramSocket(); datagramSocket.address = InternetAddress.anyIPv4; - final MDnsClient client = MDnsClient( + final client = MDnsClient( rawDatagramSocketFactory: ( dynamic host, @@ -112,7 +112,7 @@ void main() { }); group('Bind a single socket to ANY IPv4 and more than one when IPv6', () { - final List> testCases = >[ + final testCases = >[ { 'name': 'IPv4', 'datagramSocketType': InternetAddress.anyIPv4, @@ -125,15 +125,15 @@ void main() { }, ]; - for (final Map testCase in testCases) { + for (final testCase in testCases) { test('Bind a single socket to ANY ${testCase["name"]}', () async { - final FakeRawDatagramSocket datagramSocket = FakeRawDatagramSocket(); + final datagramSocket = FakeRawDatagramSocket(); datagramSocket.address = testCase['datagramSocketType']! as InternetAddress; - final List selectedInterfacesForSendingPackets = []; - final MDnsClient client = MDnsClient( + final selectedInterfacesForSendingPackets = []; + final client = MDnsClient( rawDatagramSocketFactory: ( dynamic host, @@ -147,14 +147,14 @@ void main() { }, ); - const int numberOfFakeInterfaces = 10; + const numberOfFakeInterfaces = 10; Future> fakeNetworkInterfacesFactory( InternetAddressType type, ) async { - final List fakeInterfaces = []; + final fakeInterfaces = []; // Generate "fake" interfaces - for (int i = 0; i < numberOfFakeInterfaces; i++) { + for (var i = 0; i < numberOfFakeInterfaces; i++) { fakeInterfaces.add( FakeNetworkInterface('inetfake$i', [ InternetAddress("${testCase['interfacePrefix']! as String}$i"), @@ -166,7 +166,7 @@ void main() { return Future.value(fakeInterfaces); } - final InternetAddress listenAddress = + final listenAddress = testCase['datagramSocketType']! as InternetAddress; await client.start( @@ -191,9 +191,8 @@ void main() { }); test('Calls onError callback in case of socket error', () async { - final FakeRawDatagramSocketThatSendsError datagramSocket = - FakeRawDatagramSocketThatSendsError(); - final MDnsClient client = MDnsClient( + final datagramSocket = FakeRawDatagramSocketThatSendsError(); + final client = MDnsClient( rawDatagramSocketFactory: ( dynamic host, @@ -206,7 +205,7 @@ void main() { }, ); - final Completer onErrorCalledCompleter = Completer(); + final onErrorCalledCompleter = Completer(); await client.start( mDnsPort: 1234, interfacesFactory: (InternetAddressType type) async => diff --git a/packages/multicast_dns/test/decode_test.dart b/packages/multicast_dns/test/decode_test.dart index acadeed..b4712c8 100644 --- a/packages/multicast_dns/test/decode_test.dart +++ b/packages/multicast_dns/test/decode_test.dart @@ -24,7 +24,7 @@ void testValidPackages() { List result = decodeMDnsResponse(package1)!; expect(result, isNotNull); expect(result.length, 1); - IPAddressResourceRecord ipResult = result[0] as IPAddressResourceRecord; + var ipResult = result[0] as IPAddressResourceRecord; expect(ipResult.name, 'raspberrypi.local'); expect(ipResult.address.address, '192.168.1.191'); @@ -193,8 +193,8 @@ void testValidPackages() { void testBadPackages() { test('Returns null for invalid packets', () { - for (final List p in >[package1, package2, package3]) { - for (int i = 0; i < p.length; i++) { + for (final p in >[package1, package2, package3]) { + for (var i = 0; i < p.length; i++) { expect(decodeMDnsResponse(p.sublist(0, i)), isNull); } } @@ -226,7 +226,7 @@ void testNonUtf8DomainName() { final List result = decodeMDnsResponse(nonUtf8Package)!; expect(result, isNotNull); expect(result[0] is TxtResourceRecord, isTrue); - final TxtResourceRecord txt = result[0] as TxtResourceRecord; + final txt = result[0] as TxtResourceRecord; expect(txt.name, contains('�')); }); } diff --git a/packages/multicast_dns/test/lookup_resolver_test.dart b/packages/multicast_dns/test/lookup_resolver_test.dart index dde83f9..f67549b 100644 --- a/packages/multicast_dns/test/lookup_resolver_test.dart +++ b/packages/multicast_dns/test/lookup_resolver_test.dart @@ -22,8 +22,8 @@ ResourceRecord ip4Result(String name, InternetAddress address) { void testTimeout() { test('Resolver does not return with short timeout', () async { - const Duration shortTimeout = Duration(milliseconds: 1); - final LookupResolver resolver = LookupResolver(); + const shortTimeout = Duration(milliseconds: 1); + final resolver = LookupResolver(); final Stream result = resolver.addPendingRequest( ResourceRecordType.addressIPv4, 'xxx', @@ -36,8 +36,8 @@ void testTimeout() { // One pending request and one response. void testResult() { test('One pending request and one response', () async { - const Duration noTimeout = Duration(days: 1); - final LookupResolver resolver = LookupResolver(); + const noTimeout = Duration(days: 1); + final resolver = LookupResolver(); final Stream futureResult = resolver.addPendingRequest( ResourceRecordType.addressIPv4, 'xxx.local', @@ -48,8 +48,7 @@ void testResult() { InternetAddress('1.2.3.4'), ); resolver.handleResponse([response]); - final IPAddressResourceRecord result = - await futureResult.first as IPAddressResourceRecord; + final result = await futureResult.first as IPAddressResourceRecord; expect('1.2.3.4', result.address.address); resolver.clearPendingRequests(); }); @@ -57,8 +56,8 @@ void testResult() { void testResult2() { test('Two requests', () async { - const Duration noTimeout = Duration(days: 1); - final LookupResolver resolver = LookupResolver(); + const noTimeout = Duration(days: 1); + final resolver = LookupResolver(); final Stream futureResult1 = resolver.addPendingRequest( ResourceRecordType.addressIPv4, 'xxx.local', @@ -78,10 +77,8 @@ void testResult2() { InternetAddress('2.3.4.5'), ); resolver.handleResponse([response2, response1]); - final IPAddressResourceRecord result1 = - await futureResult1.first as IPAddressResourceRecord; - final IPAddressResourceRecord result2 = - await futureResult2.first as IPAddressResourceRecord; + final result1 = await futureResult1.first as IPAddressResourceRecord; + final result2 = await futureResult2.first as IPAddressResourceRecord; expect('1.2.3.4', result1.address.address); expect('2.3.4.5', result2.address.address); resolver.clearPendingRequests(); @@ -90,8 +87,8 @@ void testResult2() { void testResult3() { test('Multiple requests', () async { - const Duration noTimeout = Duration(days: 1); - final LookupResolver resolver = LookupResolver(); + const noTimeout = Duration(days: 1); + final resolver = LookupResolver(); final ResourceRecord response0 = ip4Result( 'zzz.local', InternetAddress('2.3.4.5'), @@ -121,10 +118,8 @@ void testResult3() { resolver.handleResponse([response0]); resolver.handleResponse([response2, response1]); resolver.handleResponse([response0]); - final IPAddressResourceRecord result1 = - await futureResult1.first as IPAddressResourceRecord; - final IPAddressResourceRecord result2 = - await futureResult2.first as IPAddressResourceRecord; + final result1 = await futureResult1.first as IPAddressResourceRecord; + final result2 = await futureResult2.first as IPAddressResourceRecord; expect('1.2.3.4', result1.address.address); expect('2.3.4.5', result2.address.address); resolver.clearPendingRequests(); diff --git a/packages/multicast_dns/test/resource_record_cache_test.dart b/packages/multicast_dns/test/resource_record_cache_test.dart index 703211e..9ecb88d 100644 --- a/packages/multicast_dns/test/resource_record_cache_test.dart +++ b/packages/multicast_dns/test/resource_record_cache_test.dart @@ -20,11 +20,11 @@ void main() { void testOverwrite() { test('Cache can overwrite entries', () { - final InternetAddress ip1 = InternetAddress('192.168.1.1'); - final InternetAddress ip2 = InternetAddress('192.168.1.2'); + final ip1 = InternetAddress('192.168.1.1'); + final ip2 = InternetAddress('192.168.1.2'); final int valid = DateTime.now().millisecondsSinceEpoch + 86400 * 1000; - final ResourceRecordCache cache = ResourceRecordCache(); + final cache = ResourceRecordCache(); // Add two different records. cache.updateRecords([ @@ -58,11 +58,11 @@ void testOverwrite() { void testTimeout() { test('Cache can evict records after timeout', () { - final InternetAddress ip1 = InternetAddress('192.168.1.1'); + final ip1 = InternetAddress('192.168.1.1'); final int valid = DateTime.now().millisecondsSinceEpoch + 86400 * 1000; final int notValid = DateTime.now().millisecondsSinceEpoch - 1; - final ResourceRecordCache cache = ResourceRecordCache(); + final cache = ResourceRecordCache(); cache.updateRecords([ IPAddressResourceRecord('hest', valid, address: ip1), @@ -73,7 +73,7 @@ void testTimeout() { IPAddressResourceRecord('fisk', notValid, address: ip1), ]); - List results = []; + var results = []; cache.lookup('hest', ResourceRecordType.addressIPv4, results); expect(results.isEmpty, isFalse); diff --git a/packages/multicast_dns/tool/packet_gen.dart b/packages/multicast_dns/tool/packet_gen.dart index de4e5b6..d3df26c 100644 --- a/packages/multicast_dns/tool/packet_gen.dart +++ b/packages/multicast_dns/tool/packet_gen.dart @@ -9,8 +9,8 @@ import 'dart:io'; void formatHexStream(String hexStream) { - String s = ''; - for (int i = 0; i < hexStream.length / 2; i++) { + var s = ''; + for (var i = 0; i < hexStream.length / 2; i++) { if (s.isNotEmpty) { s += ', '; } @@ -30,8 +30,8 @@ void formatHexStream(String hexStream) { // Support code for generating the hex-lists in test/decode_test.dart. void hexDumpList(List package) { - String s = ''; - for (int i = 0; i < package.length; i++) { + var s = ''; + for (var i = 0; i < package.length; i++) { if (s.isNotEmpty) { s += ', '; } @@ -54,8 +54,8 @@ void hexDumpList(List package) { void dumpDatagram(Datagram datagram) { String toHex(List ints) { - final StringBuffer buffer = StringBuffer(); - for (int i = 0; i < ints.length; i++) { + final buffer = StringBuffer(); + for (var i = 0; i < ints.length; i++) { buffer.write(ints[i].toRadixString(16).padLeft(2, '0')); if ((i + 1) % 10 == 0) { buffer.writeln(); diff --git a/packages/standard_message_codec/lib/src/serialization.dart b/packages/standard_message_codec/lib/src/serialization.dart index 302dc3a..7229ef3 100644 --- a/packages/standard_message_codec/lib/src/serialization.dart +++ b/packages/standard_message_codec/lib/src/serialization.dart @@ -28,7 +28,7 @@ class WriteBuffer { /// performance. factory WriteBuffer({int startCapacity = 8}) { assert(startCapacity > 0); - final ByteData eightBytes = ByteData(8); + final eightBytes = ByteData(8); final Uint8List eightBytesAsList = eightBytes.buffer.asUint8List(); return WriteBuffer._( Uint8List(startCapacity), @@ -76,7 +76,7 @@ class WriteBuffer { void _resize([int? requiredLength]) { final int doubleLength = _buffer.length * 2; final int newLength = math.max(requiredLength ?? 0, doubleLength); - final Uint8List newBuffer = Uint8List(newLength); + final newBuffer = Uint8List(newLength); newBuffer.setRange(0, _buffer.length, _buffer); _buffer = newBuffer; } diff --git a/packages/standard_message_codec/lib/standard_message_codec.dart b/packages/standard_message_codec/lib/standard_message_codec.dart index 6bd769e..ddb3177 100644 --- a/packages/standard_message_codec/lib/standard_message_codec.dart +++ b/packages/standard_message_codec/lib/standard_message_codec.dart @@ -160,9 +160,7 @@ class StandardMessageCodec implements MessageCodec { if (message == null) { return null; } - final WriteBuffer buffer = WriteBuffer( - startCapacity: _writeBufferStartCapacity, - ); + final buffer = WriteBuffer(startCapacity: _writeBufferStartCapacity); writeValue(buffer, message); return buffer.done(); } @@ -172,7 +170,7 @@ class StandardMessageCodec implements MessageCodec { if (message == null) { return null; } - final ReadBuffer buffer = ReadBuffer(message); + final buffer = ReadBuffer(message); final Object? result = readValue(buffer); if (buffer.hasRemaining) { throw const FormatException('Message corrupted'); @@ -242,11 +240,11 @@ class StandardMessageCodec implements MessageCodec { } } else if (value is String) { buffer.putUint8(_valueString); - final Uint8List asciiBytes = Uint8List(value.length); + final asciiBytes = Uint8List(value.length); Uint8List? utf8Bytes; - int utf8Offset = 0; + var utf8Offset = 0; // Only do utf8 encoding if we encounter non-ascii characters. - for (int i = 0; i < value.length; i += 1) { + for (var i = 0; i < value.length; i += 1) { final int char = value.codeUnitAt(i); if (char <= 0x7f) { asciiBytes[i] = char; @@ -354,15 +352,15 @@ class StandardMessageCodec implements MessageCodec { return buffer.getFloat64List(length); case _valueList: final int length = readSize(buffer); - final List result = List.filled(length, null); - for (int i = 0; i < length; i++) { + final result = List.filled(length, null); + for (var i = 0; i < length; i++) { result[i] = readValue(buffer); } return result; case _valueMap: final int length = readSize(buffer); - final Map result = {}; - for (int i = 0; i < length; i++) { + final result = {}; + for (var i = 0; i < length; i++) { result[readValue(buffer)] = readValue(buffer); } return result; diff --git a/packages/standard_message_codec/test/standard_message_codec_test.dart b/packages/standard_message_codec/test/standard_message_codec_test.dart index b33a411..273b3b9 100644 --- a/packages/standard_message_codec/test/standard_message_codec_test.dart +++ b/packages/standard_message_codec/test/standard_message_codec_test.dart @@ -26,85 +26,85 @@ void main() { group('Write and read buffer round-trip', () { test('of empty buffer', () { - final WriteBuffer write = WriteBuffer(); + final write = WriteBuffer(); final ByteData written = write.done(); expect(written.lengthInBytes, 0); }); test('of single byte', () { - final WriteBuffer write = WriteBuffer(); + final write = WriteBuffer(); write.putUint8(201); final ByteData written = write.done(); expect(written.lengthInBytes, equals(1)); - final ReadBuffer read = ReadBuffer(written); + final read = ReadBuffer(written); expect(read.getUint8(), equals(201)); }); test('of 32-bit integer', () { - final WriteBuffer write = WriteBuffer(); + final write = WriteBuffer(); write.putInt32(-9); final ByteData written = write.done(); expect(written.lengthInBytes, equals(4)); - final ReadBuffer read = ReadBuffer(written); + final read = ReadBuffer(written); expect(read.getInt32(), equals(-9)); }); test('of 32-bit integer in big endian', () { - final WriteBuffer write = WriteBuffer(); + final write = WriteBuffer(); write.putInt32(-9, endian: Endian.big); final ByteData written = write.done(); expect(written.lengthInBytes, equals(4)); - final ReadBuffer read = ReadBuffer(written); + final read = ReadBuffer(written); expect(read.getInt32(endian: Endian.big), equals(-9)); }); test('of 64-bit integer', () { - final WriteBuffer write = WriteBuffer(); + final write = WriteBuffer(); write.putInt64(-9000000000000); final ByteData written = write.done(); expect(written.lengthInBytes, equals(8)); - final ReadBuffer read = ReadBuffer(written); + final read = ReadBuffer(written); expect(read.getInt64(), equals(-9000000000000)); }, testOn: 'vm' /* Int64 isn't supported on web */); test( 'of 64-bit integer in big endian', () { - final WriteBuffer write = WriteBuffer(); + final write = WriteBuffer(); write.putInt64(-9000000000000, endian: Endian.big); final ByteData written = write.done(); expect(written.lengthInBytes, equals(8)); - final ReadBuffer read = ReadBuffer(written); + final read = ReadBuffer(written); expect(read.getInt64(endian: Endian.big), equals(-9000000000000)); }, testOn: 'vm' /* Int64 isn't supported on web */, ); test('of double', () { - final WriteBuffer write = WriteBuffer(); + final write = WriteBuffer(); write.putFloat64(3.14); final ByteData written = write.done(); expect(written.lengthInBytes, equals(8)); - final ReadBuffer read = ReadBuffer(written); + final read = ReadBuffer(written); expect(read.getFloat64(), equals(3.14)); }); test('of double in big endian', () { - final WriteBuffer write = WriteBuffer(); + final write = WriteBuffer(); write.putFloat64(3.14, endian: Endian.big); final ByteData written = write.done(); expect(written.lengthInBytes, equals(8)); - final ReadBuffer read = ReadBuffer(written); + final read = ReadBuffer(written); expect(read.getFloat64(endian: Endian.big), equals(3.14)); }); test('of 32-bit int list when unaligned', () { - final Int32List integers = Int32List.fromList([-99, 2, 99]); - final WriteBuffer write = WriteBuffer(); + final integers = Int32List.fromList([-99, 2, 99]); + final write = WriteBuffer(); write.putUint8(9); write.putInt32List(integers); final ByteData written = write.done(); expect(written.lengthInBytes, equals(16)); - final ReadBuffer read = ReadBuffer(written); + final read = ReadBuffer(written); read.getUint8(); expect(read.getInt32List(3), equals(integers)); }); @@ -112,13 +112,13 @@ void main() { test( 'of 64-bit int list when unaligned', () { - final Int64List integers = Int64List.fromList([-99, 2, 99]); - final WriteBuffer write = WriteBuffer(); + final integers = Int64List.fromList([-99, 2, 99]); + final write = WriteBuffer(); write.putUint8(9); write.putInt64List(integers); final ByteData written = write.done(); expect(written.lengthInBytes, equals(32)); - final ReadBuffer read = ReadBuffer(written); + final read = ReadBuffer(written); read.getUint8(); expect(read.getInt64List(3), equals(integers)); }, @@ -126,16 +126,13 @@ void main() { ); test('of float list when unaligned', () { - final Float32List floats = Float32List.fromList([ - 3.14, - double.nan, - ]); - final WriteBuffer write = WriteBuffer(); + final floats = Float32List.fromList([3.14, double.nan]); + final write = WriteBuffer(); write.putUint8(9); write.putFloat32List(floats); final ByteData written = write.done(); expect(written.lengthInBytes, equals(12)); - final ReadBuffer read = ReadBuffer(written); + final read = ReadBuffer(written); read.getUint8(); final Float32List readFloats = read.getFloat32List(2); expect(readFloats[0], closeTo(3.14, 0.0001)); @@ -143,16 +140,13 @@ void main() { }); test('of double list when unaligned', () { - final Float64List doubles = Float64List.fromList([ - 3.14, - double.nan, - ]); - final WriteBuffer write = WriteBuffer(); + final doubles = Float64List.fromList([3.14, double.nan]); + final write = WriteBuffer(); write.putUint8(9); write.putFloat64List(doubles); final ByteData written = write.done(); expect(written.lengthInBytes, equals(24)); - final ReadBuffer read = ReadBuffer(written); + final read = ReadBuffer(written); read.getUint8(); final Float64List readDoubles = read.getFloat64List(2); expect(readDoubles[0], equals(3.14)); @@ -160,7 +154,7 @@ void main() { }); test('done twice', () { - final WriteBuffer write = WriteBuffer(); + final write = WriteBuffer(); write.done(); expect(() => write.done(), throwsStateError); }); diff --git a/third_party/packages/mustache_template/CHANGELOG.md b/third_party/packages/mustache_template/CHANGELOG.md index eae4a53..83bf7da 100644 --- a/third_party/packages/mustache_template/CHANGELOG.md +++ b/third_party/packages/mustache_template/CHANGELOG.md @@ -1,6 +1,6 @@ ## NEXT -* Updates minimum supported SDK version to Flutter 3.32/Dart 3.8. +* Updates minimum supported SDK version to Flutter 3.35/Dart 3.9. ## 2.0.2 diff --git a/third_party/packages/mustache_template/lib/src/lambda_context.dart b/third_party/packages/mustache_template/lib/src/lambda_context.dart index 1dcd568..ca4082f 100644 --- a/third_party/packages/mustache_template/lib/src/lambda_context.dart +++ b/third_party/packages/mustache_template/lib/src/lambda_context.dart @@ -44,14 +44,14 @@ class LambdaContext implements m.LambdaContext { 'LambdaContext.renderString() can only be called on section tags.', ); } - final StringBuffer sink = StringBuffer(); + final sink = StringBuffer(); _renderSubtree(sink, value); return sink.toString(); } void _renderSubtree(StringSink sink, Object? value) { - final Renderer renderer = Renderer.subtree(_renderer, sink); - final SectionNode section = _node as SectionNode; + final renderer = Renderer.subtree(_renderer, sink); + final section = _node as SectionNode; if (value != null) { renderer.push(value); } @@ -99,10 +99,10 @@ class LambdaContext implements m.LambdaContext { @override String renderSource(String source, {Object? value}) { _checkClosed(); - final StringBuffer sink = StringBuffer(); + final sink = StringBuffer(); // Lambdas used for sections should parse with the current delimiters. - String delimiters = '{{ }}'; + var delimiters = '{{ }}'; if (_node is SectionNode) { final SectionNode node = _node; delimiters = node.delimiters; @@ -115,12 +115,7 @@ class LambdaContext implements m.LambdaContext { delimiters, ); - final Renderer renderer = Renderer.lambda( - _renderer, - source, - _renderer.indent, - sink, - ); + final renderer = Renderer.lambda(_renderer, source, _renderer.indent, sink); if (value != null) { renderer.push(value); diff --git a/third_party/packages/mustache_template/lib/src/parser.dart b/third_party/packages/mustache_template/lib/src/parser.dart index 60f039c..a6dc3b1 100644 --- a/third_party/packages/mustache_template/lib/src/parser.dart +++ b/third_party/packages/mustache_template/lib/src/parser.dart @@ -12,12 +12,7 @@ List parse( String? templateName, String delimiters, ) { - final Parser parser = Parser( - source, - templateName, - delimiters, - lenient: lenient, - ); + final parser = Parser(source, templateName, delimiters, lenient: lenient); return parser.parse(); } @@ -172,12 +167,8 @@ class Parser { if (children.isEmpty || children.last is! TextNode) { children.add(TextNode(token.value, token.start, token.end)); } else { - final TextNode last = children.removeLast() as TextNode; - final TextNode node = TextNode( - last.text + token.value, - last.start, - token.end, - ); + final last = children.removeLast() as TextNode; + final node = TextNode(last.text + token.value, last.start, token.end); children.add(node); } } @@ -262,7 +253,7 @@ class Parser { eofOk: true, ); - const List standaloneTypes = [ + const standaloneTypes = [ TagType.openSection, TagType.closeSection, TagType.openInverseSection, @@ -348,7 +339,7 @@ class Parser { // Also check that they are valid token types. // TODOsplit up names here instead of during render. // Also check that they are valid token types. - final List list = []; + final list = []; for ( Token? t = _peek(); t != null && t.type != TokenType.closeDelimiter; @@ -397,7 +388,7 @@ class Parser { switch (tag.type) { case TagType.openSection: case TagType.openInverseSection: - final bool inverse = tag.type == TagType.openInverseSection; + final inverse = tag.type == TagType.openInverseSection; node = SectionNode( tag.name, tag.start, @@ -409,7 +400,7 @@ class Parser { case TagType.variable: case TagType.unescapedVariable: case TagType.tripleMustache: - final bool escape = tag.type == TagType.variable; + final escape = tag.type == TagType.variable; node = VariableNode(tag.name, tag.start, tag.end, escape: escape); case TagType.partial: diff --git a/third_party/packages/mustache_template/lib/src/renderer.dart b/third_party/packages/mustache_template/lib/src/renderer.dart index bddaa69..24125cd 100644 --- a/third_party/packages/mustache_template/lib/src/renderer.dart +++ b/third_party/packages/mustache_template/lib/src/renderer.dart @@ -75,7 +75,7 @@ class Renderer extends Visitor { void render(List nodes) { if (indent == '') { - for (final Node n in nodes) { + for (final n in nodes) { n.accept(this); } } else if (nodes.isNotEmpty) { @@ -116,7 +116,7 @@ class Renderer extends Visitor { Object? value = resolveValue(node.name); if (value is Function) { - final LambdaContext context = LambdaContext(node, this); + final context = LambdaContext(node, this); final Function valueFunction = value; // TODO(stuartmorgan): Add function typing in a way that doesn't break // backward compatibility. @@ -130,7 +130,7 @@ class Renderer extends Visitor { throw error('Value was missing for variable tag: ${node.name}.', node); } } else { - final String valueString = (value == null) ? '' : value.toString(); + final valueString = (value == null) ? '' : value.toString(); final String output = !node.escape || !htmlEscapeValues ? valueString : _htmlEscape(valueString); @@ -167,7 +167,7 @@ class Renderer extends Visitor { throw error('Value was missing for section tag: ${node.name}.', node); } } else if (value is Function) { - final LambdaContext context = LambdaContext(node, this); + final context = LambdaContext(node, this); // TODO(stuartmorgan): Add function typing in a way that doesn't break // backward compatibility. // ignore: avoid_dynamic_calls @@ -230,7 +230,7 @@ class Renderer extends Visitor { ? null : (partialResolver!(partialName) as Template?); if (template != null) { - final Renderer renderer = Renderer.partial(this, template, node.indent); + final renderer = Renderer.partial(this, template, node.indent); final List nodes = getTemplateNodes(template); renderer.render(nodes); } else if (lenient) { @@ -254,7 +254,7 @@ class Renderer extends Visitor { break; } } - for (int i = 1; i < parts.length; i++) { + for (var i = 1; i < parts.length; i++) { if (object == noSuchProperty) { return noSuchProperty; } @@ -294,9 +294,9 @@ class Renderer extends Visitor { }; String _htmlEscape(String s) { - final StringBuffer buffer = StringBuffer(); - int startIndex = 0; - int i = 0; + final buffer = StringBuffer(); + var startIndex = 0; + var i = 0; for (final int c in s.runes) { if (c == _AMP || c == _LT || diff --git a/third_party/packages/mustache_template/lib/src/scanner.dart b/third_party/packages/mustache_template/lib/src/scanner.dart index 7f88954..04b01d5 100644 --- a/third_party/packages/mustache_template/lib/src/scanner.dart +++ b/third_party/packages/mustache_template/lib/src/scanner.dart @@ -66,7 +66,7 @@ class Scanner { // If only a single delimiter character then create a text token. if (_openDelimiterInner != null && _peek() != _openDelimiterInner) { - final String value = String.fromCharCode(_openDelimiter!); + final value = String.fromCharCode(_openDelimiter!); _append(TokenType.text, value, start, _offset); continue; } @@ -93,7 +93,7 @@ class Scanner { _parseChangeDelimiterTag(start); } else { // Scan standard mustache tag. - final String value = String.fromCharCodes( + final value = String.fromCharCodes( _openDelimiterInner == null ? [_openDelimiter!] : [_openDelimiter!, _openDelimiterInner!], @@ -127,7 +127,7 @@ class Scanner { return ''; } - final StringBuffer buffer = StringBuffer(); + final buffer = StringBuffer(); while (_peek() != _EOF && test(_peek())) { buffer.writeCharCode(_read()); } @@ -167,7 +167,7 @@ class Scanner { // tokens for whitespace at the beginning of a line. This is because the // mustache spec requires special handing of whitespace. void _scanText() { - int start = 0; + var start = 0; TokenType token; String value; @@ -277,7 +277,7 @@ class Scanner { } _expect(_closeDelimiter!); - final String value = String.fromCharCodes( + final value = String.fromCharCodes( _closeDelimiterInner == null ? [_closeDelimiter!] : [_closeDelimiterInner!, _closeDelimiter!], @@ -352,7 +352,7 @@ class Scanner { _expect(delimiter!); // Create delimiter string. - final StringBuffer buffer = StringBuffer(); + final buffer = StringBuffer(); buffer.writeCharCode(_openDelimiter!); if (_openDelimiterInner != null) { buffer.writeCharCode(_openDelimiterInner!); @@ -362,7 +362,7 @@ class Scanner { buffer.writeCharCode(_closeDelimiterInner!); } buffer.writeCharCode(_closeDelimiter!); - final String value = buffer.toString(); + final value = buffer.toString(); _append(TokenType.changeDelimiter, value, start, _offset); } diff --git a/third_party/packages/mustache_template/lib/src/template.dart b/third_party/packages/mustache_template/lib/src/template.dart index 347c90d..4da713a 100644 --- a/third_party/packages/mustache_template/lib/src/template.dart +++ b/third_party/packages/mustache_template/lib/src/template.dart @@ -33,14 +33,14 @@ class Template implements m.Template { @override String renderString(Object? values) { - final StringBuffer buf = StringBuffer(); + final buf = StringBuffer(); render(values, buf); return buf.toString(); } @override void render(Object? values, StringSink sink) { - final Renderer renderer = Renderer( + final renderer = Renderer( sink, [values], _lenient, diff --git a/third_party/packages/mustache_template/lib/src/template_exception.dart b/third_party/packages/mustache_template/lib/src/template_exception.dart index e64ca70..2789676 100644 --- a/third_party/packages/mustache_template/lib/src/template_exception.dart +++ b/third_party/packages/mustache_template/lib/src/template_exception.dart @@ -40,13 +40,13 @@ class TemplateException implements m.TemplateException { @override String toString() { - final List list = []; + final list = []; if (templateName != null) { list.add(templateName); } list.add(line); list.add(column); - final String location = list.isEmpty ? '' : ' (${list.join(':')})'; + final location = list.isEmpty ? '' : ' (${list.join(':')})'; return '$message$location\n$context'; } @@ -64,10 +64,10 @@ class TemplateException implements m.TemplateException { } // Find line and character column. - int lineNum = 1; - int lineStart = 0; - bool lastWasCR = false; - for (int i = 0; i < offset!; i++) { + var lineNum = 1; + var lineStart = 0; + var lastWasCR = false; + for (var i = 0; i < offset!; i++) { final int char = source!.codeUnitAt(i); if (char == 0x0a) { if (lineStart != i || !lastWasCR) { @@ -95,10 +95,10 @@ class TemplateException implements m.TemplateException { } } final int length = lineEnd - lineStart; - int start = lineStart; - int end = lineEnd; - String prefix = ''; - String postfix = ''; + var start = lineStart; + var end = lineEnd; + var prefix = ''; + var postfix = ''; if (length > 78) { // Can't show entire line. Try to anchor at the nearest end, if // one is within reach. diff --git a/third_party/packages/mustache_template/pubspec.yaml b/third_party/packages/mustache_template/pubspec.yaml index 859fa36..30e2128 100644 --- a/third_party/packages/mustache_template/pubspec.yaml +++ b/third_party/packages/mustache_template/pubspec.yaml @@ -5,7 +5,7 @@ issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+ version: 2.0.2 environment: - sdk: ^3.8.0 + sdk: ^3.9.0 dev_dependencies: test: ^1.16.5 diff --git a/third_party/packages/mustache_template/test/mustache_specs.dart b/third_party/packages/mustache_template/test/mustache_specs.dart index d1186b7..d0a565f 100644 --- a/third_party/packages/mustache_template/test/mustache_specs.dart +++ b/third_party/packages/mustache_template/test/mustache_specs.dart @@ -22,7 +22,7 @@ String render( } return Template(source, partialResolver: resolver, lenient: true); }; - final Template t = Template(source, partialResolver: resolver, lenient: true); + final t = Template(source, partialResolver: resolver, lenient: true); return t.renderString(values); } @@ -31,7 +31,7 @@ void main() { } void defineTests() { - final Directory specsDir = Directory('test/spec/specs'); + final specsDir = Directory('test/spec/specs'); specsDir.listSync().forEach((FileSystemEntity f) { if (f is File) { final String filename = f.path; @@ -50,21 +50,20 @@ void _defineGroupFromFile(String filename, String text) { .cast>(); filename = filename.substring(filename.lastIndexOf('/') + 1); group('Specs of $filename', () { - for (final Map t in tests) { - final StringBuffer testDescription = StringBuffer(t['name']! as String); + for (final t in tests) { + final testDescription = StringBuffer(t['name']! as String); testDescription.write(': '); testDescription.write(t['desc']); - final String template = t['template']! as String; + final template = t['template']! as String; final Object? data = t['data']; final String templateOneline = template .replaceAll('\n', r'\n') .replaceAll('\r', r'\r'); - final StringBuffer reason = StringBuffer( + final reason = StringBuffer( "Could not render right '''$templateOneline'''", ); final Object? expected = t['expected']; - final Map? partials = - t['partials'] as Map?; + final partials = t['partials'] as Map?; String? partial(String name) { if (partials == null) { return null; @@ -101,7 +100,7 @@ bool shouldRun(String filename) { } String Function(Object?) _dummyCallableWithState() { - int callCounter = 0; + var callCounter = 0; return (Object? arg) { callCounter++; return callCounter.toString(); diff --git a/third_party/packages/mustache_template/test/mustache_test.dart b/third_party/packages/mustache_template/test/mustache_test.dart index 6153aa3..5fffe65 100644 --- a/third_party/packages/mustache_template/test/mustache_test.dart +++ b/third_party/packages/mustache_template/test/mustache_test.dart @@ -264,12 +264,12 @@ void main() { }); test('Empty source', () { - final Template t = Template(''); + final t = Template(''); expect(t.renderString({}), equals('')); }); test('Template name', () { - final Template t = Template('', name: 'foo'); + final t = Template('', name: 'foo'); expect(t.name, equals('foo')); }); @@ -394,7 +394,7 @@ void main() { group('Invalid format', () { test('Mismatched tag', () { - const String source = '{{#section}}_{{var}}_{{/notsection}}'; + const source = '{{#section}}_{{var}}_{{/notsection}}'; final Exception? ex = renderFail(source, >{ 'section': {'var': 'bob'}, }); @@ -402,7 +402,7 @@ void main() { }); test('Unexpected EOF', () { - const String source = '{{#section}}_{{var}}_{{/section'; + const source = '{{#section}}_{{var}}_{{/section'; final Exception? ex = renderFail(source, >{ 'section': {'var': 'bob'}, }); @@ -410,7 +410,7 @@ void main() { }); test('Bad tag name, open section', () { - const String source = r'{{#section$%$^%}}_{{var}}_{{/section}}'; + const source = r'{{#section$%$^%}}_{{var}}_{{/section}}'; final Exception? ex = renderFail(source, >{ 'section': {'var': 'bob'}, }); @@ -418,7 +418,7 @@ void main() { }); test('Bad tag name, close section', () { - const String source = r'{{#section}}_{{var}}_{{/section$%$^%}}'; + const source = r'{{#section}}_{{var}}_{{/section$%$^%}}'; final Exception? ex = renderFail(source, >{ 'section': {'var': 'bob'}, }); @@ -426,7 +426,7 @@ void main() { }); test('Bad tag name, variable', () { - const String source = r'{{#section}}_{{var$%$^%}}_{{/section}}'; + const source = r'{{#section}}_{{var$%$^%}}_{{/section}}'; final Exception? ex = renderFail(source, >{ 'section': {'var': 'bob'}, }); @@ -434,7 +434,7 @@ void main() { }); test('Missing variable', () { - const String source = r'{{#section}}_{{var}}_{{/section}}'; + const source = r'{{#section}}_{{var}}_{{/section}}'; final Exception? ex = renderFail(source, >{ 'section': {}, }); @@ -443,7 +443,7 @@ void main() { // Null variables shouldn't be a problem. test('Null variable', () { - final Template t = Template('{{#section}}_{{var}}_{{/section}}'); + final t = Template('{{#section}}_{{var}}_{{/section}}'); final String output = t.renderString(>{ 'section': {'var': null}, }); @@ -451,7 +451,7 @@ void main() { }); test('Unclosed section', () { - const String source = r'{{#section}}foo'; + const source = r'{{#section}}foo'; final Exception? ex = renderFail(source, >{ 'section': {}, }); @@ -531,7 +531,7 @@ void main() { String renderTemplate, { bool lenient = false, }) { - final Map templates = {}; + final templates = {}; Template? resolver(String name) => templates[name]; for (final String k in sources.keys) { templates[k] = Template( @@ -555,7 +555,7 @@ void main() { }); test('missing partial strict', () { - bool threw = false; + var threw = false; try { partialTest( {'foo': 'bar'}, @@ -668,60 +668,58 @@ void main() { // TODO(stuartmorgan): Fix and re-enable this test, which was skipped when // the package was first imported. test('inverted sections truthy', () { - const String template = '<{{^lambda}}{{static}}{{/lambda}}>'; - final Map values = { + const template = '<{{^lambda}}{{static}}{{/lambda}}>'; + final values = { 'lambda': (_) => false, 'static': 'static', }; - const String output = '<>'; + const output = '<>'; expect(parse(template).renderString(values), equals(output)); }, skip: 'skip test'); test("seth's use case", () { - const String template = '<{{#markdown}}{{content}}{{/markdown}}>'; - final Map values = { + const template = '<{{#markdown}}{{content}}{{/markdown}}>'; + final values = { 'markdown': (LambdaContext ctx) => ctx.renderString().toLowerCase(), 'content': 'OI YOU!', }; - const String output = ''; + const output = ''; expect(parse(template).renderString(values), equals(output)); }); test('Lambda v2', () { - const String template = '<{{#markdown}}{{content}}{{/markdown}}>'; - final Map values = { + const template = '<{{#markdown}}{{content}}{{/markdown}}>'; + final values = { 'markdown': (LambdaContext ctx) => ctx.source, 'content': 'OI YOU!', }; - const String output = '<{{content}}>'; + const output = '<{{content}}>'; expect(parse(template).renderString(values), equals(output)); }); test('Lambda v2...', () { - const String template = - '<{{#markdown}}dsfsf dsfsdf dfsdfsd{{/markdown}}>'; - final Map values = - { - // ignore: avoid_dynamic_calls - 'markdown': (dynamic ctx) => ctx.source, - }; - const String output = ''; + const template = '<{{#markdown}}dsfsf dsfsdf dfsdfsd{{/markdown}}>'; + final values = { + // ignore: avoid_dynamic_calls + 'markdown': (dynamic ctx) => ctx.source, + }; + const output = ''; expect(parse(template).renderString(values), equals(output)); }); test('Alternate Delimiters', () { // A lambda's return value should parse with the default delimiters. - const String template = '{{= | | =}}\nHello, (|&lambda|)!'; + const template = '{{= | | =}}\nHello, (|&lambda|)!'; //function() { return "|planet| => {{planet}}" } - final Map values = { + final values = { 'planet': 'world', 'lambda': (LambdaContext ctx) => ctx.renderSource('|planet| => {{planet}}'), }; - const String output = 'Hello, (|planet| => world)!'; + const output = 'Hello, (|planet| => world)!'; expect(parse(template).renderString(values), equals(output)); }); @@ -729,10 +727,10 @@ void main() { test('Alternate Delimiters 2', () { // Lambdas used for sections should parse with the current delimiters. - const String template = '{{= | | =}}<|#lambda|-|/lambda|>'; + const template = '{{= | | =}}<|#lambda|-|/lambda|>'; //function() { return "|planet| => {{planet}}" } - final Map values = { + final values = { 'planet': 'Earth', 'lambda': (LambdaContext ctx) { final String txt = ctx.source; @@ -740,13 +738,13 @@ void main() { }, }; - const String output = '<-{{planet}} => Earth->'; + const output = '<-{{planet}} => Earth->'; expect(parse(template).renderString(values), equals(output)); }); test('LambdaContext.lookup', () { - final Template t = Template('{{ foo }}'); + final t = Template('{{ foo }}'); final String s = t.renderString({ 'foo': (LambdaContext lc) => lc.lookup('bar'), 'bar': 'jim', @@ -755,7 +753,7 @@ void main() { }); test('LambdaContext.lookup closed', () { - final Template t = Template('{{ foo }}'); + final t = Template('{{ foo }}'); LambdaContext? lc2; t.renderString({ 'foo': (LambdaContext lc) => lc2 = lc, @@ -808,7 +806,7 @@ void main() { group('Template with custom delimiters', () { test('Basic', () { - final Template t = Template('(<%text%>)', delimiters: '<% %>'); + final t = Template('(<%text%>)', delimiters: '<% %>'); final String val = t.renderString({'text': 'Hey!'}); expect(val, equals('(Hey!)')); }); @@ -816,80 +814,73 @@ void main() { group('Lambda context', () { test('LambdaContext write', () { - const String template = '<{{#markdown}}{{content}}{{/markdown}}>'; - final Map values = - { - 'markdown': (LambdaContext ctx) { - ctx.write('foo'); - }, - }; - const String output = ''; + const template = '<{{#markdown}}{{content}}{{/markdown}}>'; + final values = { + 'markdown': (LambdaContext ctx) { + ctx.write('foo'); + }, + }; + const output = ''; expect(parse(template).renderString(values), equals(output)); }); test('LambdaContext render', () { - const String template = '<{{#markdown}}{{content}}{{/markdown}}>'; - final Map values = { + const template = '<{{#markdown}}{{content}}{{/markdown}}>'; + final values = { 'content': 'bar', 'markdown': (LambdaContext ctx) { ctx.render(); }, }; - const String output = ''; + const output = ''; expect(parse(template).renderString(values), equals(output)); }); test('LambdaContext render with value', () { - const String template = '<{{#markdown}}{{content}}{{/markdown}}>'; - final Map values = - { - 'markdown': (LambdaContext ctx) { - ctx.render(value: {'content': 'oi!'}); - }, - }; - const String output = ''; + const template = '<{{#markdown}}{{content}}{{/markdown}}>'; + final values = { + 'markdown': (LambdaContext ctx) { + ctx.render(value: {'content': 'oi!'}); + }, + }; + const output = ''; expect(parse(template).renderString(values), equals(output)); }); test('LambdaContext renderString with value', () { - const String template = '<{{#markdown}}{{content}}{{/markdown}}>'; - final Map values = - { - 'markdown': (LambdaContext ctx) { - return ctx.renderString( - value: {'content': 'oi!'}, - ); - }, - }; - const String output = ''; + const template = '<{{#markdown}}{{content}}{{/markdown}}>'; + final values = { + 'markdown': (LambdaContext ctx) { + return ctx.renderString(value: {'content': 'oi!'}); + }, + }; + const output = ''; expect(parse(template).renderString(values), equals(output)); }); test('LambdaContext write and return', () { - const String template = '<{{#markdown}}{{content}}{{/markdown}}>'; - final Map values = - { - 'markdown': (LambdaContext ctx) { - ctx.write('foo'); - return 'bar'; - }, - }; - const String output = ''; + const template = '<{{#markdown}}{{content}}{{/markdown}}>'; + final values = { + 'markdown': (LambdaContext ctx) { + ctx.write('foo'); + return 'bar'; + }, + }; + const output = ''; expect(parse(template).renderString(values), equals(output)); }); test('LambdaContext renderSource with value', () { - const String template = '<{{#markdown}}{{content}}{{/markdown}}>'; - final Map values = - { - 'markdown': (LambdaContext ctx) { - return ctx.renderSource( - ctx.source, - value: {'content': 'oi!'}, - ); - }, - }; - const String output = ''; + const template = '<{{#markdown}}{{content}}{{/markdown}}>'; + final values = { + 'markdown': (LambdaContext ctx) { + return ctx.renderSource( + ctx.source, + value: {'content': 'oi!'}, + ); + }, + }; + const output = ''; expect(parse(template).renderString(values), equals(output)); }); }); diff --git a/third_party/packages/mustache_template/test/parser_test.dart b/third_party/packages/mustache_template/test/parser_test.dart index 7f849aa..c3f8427 100644 --- a/third_party/packages/mustache_template/test/parser_test.dart +++ b/third_party/packages/mustache_template/test/parser_test.dart @@ -10,15 +10,15 @@ import 'package:test/test.dart'; void main() { group('Scanner', () { test('scan text', () { - const String source = 'abc'; - final Scanner scanner = Scanner(source, 'foo', '{{ }}'); + const source = 'abc'; + final scanner = Scanner(source, 'foo', '{{ }}'); final List tokens = scanner.scan(); expectTokens(tokens, [Token(TokenType.text, 'abc', 0, 3)]); }); test('scan tag', () { - const String source = 'abc{{foo}}def'; - final Scanner scanner = Scanner(source, 'foo', '{{ }}'); + const source = 'abc{{foo}}def'; + final scanner = Scanner(source, 'foo', '{{ }}'); final List tokens = scanner.scan(); expectTokens(tokens, [ Token(TokenType.text, 'abc', 0, 3), @@ -30,8 +30,8 @@ void main() { }); test('scan tag whitespace', () { - const String source = 'abc{{ foo }}def'; - final Scanner scanner = Scanner(source, 'foo', '{{ }}'); + const source = 'abc{{ foo }}def'; + final scanner = Scanner(source, 'foo', '{{ }}'); final List tokens = scanner.scan(); expectTokens(tokens, [ Token(TokenType.text, 'abc', 0, 3), @@ -45,8 +45,8 @@ void main() { }); test('scan tag sigil', () { - const String source = 'abc{{ # foo }}def'; - final Scanner scanner = Scanner(source, 'foo', '{{ }}'); + const source = 'abc{{ # foo }}def'; + final scanner = Scanner(source, 'foo', '{{ }}'); final List tokens = scanner.scan(); expectTokens(tokens, [ Token(TokenType.text, 'abc', 0, 3), @@ -62,8 +62,8 @@ void main() { }); test('scan tag dot', () { - const String source = 'abc{{ foo.bar }}def'; - final Scanner scanner = Scanner(source, 'foo', '{{ }}'); + const source = 'abc{{ foo.bar }}def'; + final scanner = Scanner(source, 'foo', '{{ }}'); final List tokens = scanner.scan(); expectTokens(tokens, [ Token(TokenType.text, 'abc', 0, 3), @@ -79,8 +79,8 @@ void main() { }); test('scan triple mustache', () { - const String source = 'abc{{{foo}}}def'; - final Scanner scanner = Scanner(source, 'foo', '{{ }}'); + const source = 'abc{{{foo}}}def'; + final scanner = Scanner(source, 'foo', '{{ }}'); final List tokens = scanner.scan(); expectTokens(tokens, [ Token(TokenType.text, 'abc', 0, 3), @@ -92,8 +92,8 @@ void main() { }); test('scan triple mustache whitespace', () { - const String source = 'abc{{{ foo }}}def'; - final Scanner scanner = Scanner(source, 'foo', '{{ }}'); + const source = 'abc{{{ foo }}}def'; + final scanner = Scanner(source, 'foo', '{{ }}'); final List tokens = scanner.scan(); expectTokens(tokens, [ Token(TokenType.text, 'abc', 0, 3), @@ -107,8 +107,8 @@ void main() { }); test('scan tag with equals', () { - const String source = '{{foo=bar}}'; - final Scanner scanner = Scanner(source, 'foo', '{{ }}'); + const source = '{{foo=bar}}'; + final scanner = Scanner(source, 'foo', '{{ }}'); final List tokens = scanner.scan(); expectTokens(tokens, [ Token(TokenType.openDelimiter, '{{', 0, 2), @@ -118,8 +118,8 @@ void main() { }); test('scan comment with equals', () { - const String source = '{{!foo=bar}}'; - final Scanner scanner = Scanner(source, 'foo', '{{ }}'); + const source = '{{!foo=bar}}'; + final scanner = Scanner(source, 'foo', '{{ }}'); final List tokens = scanner.scan(); expectTokens(tokens, [ Token(TokenType.openDelimiter, '{{', 0, 2), @@ -132,8 +132,8 @@ void main() { group('Parser', () { test('parse variable', () { - const String source = 'abc{{foo}}def'; - final Parser parser = Parser(source, 'foo', '{{ }}'); + const source = 'abc{{foo}}def'; + final parser = Parser(source, 'foo', '{{ }}'); final List nodes = parser.parse(); expectNodes(nodes, [ TextNode('abc', 0, 3), @@ -143,8 +143,8 @@ void main() { }); test('parse variable whitespace', () { - const String source = 'abc{{ foo }}def'; - final Parser parser = Parser(source, 'foo', '{{ }}'); + const source = 'abc{{ foo }}def'; + final parser = Parser(source, 'foo', '{{ }}'); final List nodes = parser.parse(); expectNodes(nodes, [ TextNode('abc', 0, 3), @@ -154,8 +154,8 @@ void main() { }); test('parse section', () { - const String source = 'abc{{#foo}}def{{/foo}}ghi'; - final Parser parser = Parser(source, 'foo', '{{ }}'); + const source = 'abc{{#foo}}def{{/foo}}ghi'; + final parser = Parser(source, 'foo', '{{ }}'); final List nodes = parser.parse(); expectNodes(nodes, [ TextNode('abc', 0, 3), @@ -168,8 +168,8 @@ void main() { }); test('parse section standalone tag whitespace', () { - const String source = 'abc\n{{#foo}}\ndef\n{{/foo}}\nghi'; - final Parser parser = Parser(source, 'foo', '{{ }}'); + const source = 'abc\n{{#foo}}\ndef\n{{/foo}}\nghi'; + final parser = Parser(source, 'foo', '{{ }}'); final List nodes = parser.parse(); expectNodes(nodes, [ TextNode('abc\n', 0, 4), @@ -182,9 +182,9 @@ void main() { }); test('parse section standalone tag whitespace consecutive', () { - const String source = + const source = 'abc\n{{#foo}}\ndef\n{{/foo}}\n{{#foo}}\ndef\n{{/foo}}\nghi'; - final Parser parser = Parser(source, 'foo', '{{ }}'); + final parser = Parser(source, 'foo', '{{ }}'); final List nodes = parser.parse(); expectNodes(nodes, [ TextNode('abc\n', 0, 4), @@ -198,8 +198,8 @@ void main() { }); test('parse section standalone tag whitespace on first line', () { - const String source = ' {{#foo}} \ndef\n{{/foo}}\nghi'; - final Parser parser = Parser(source, 'foo', '{{ }}'); + const source = ' {{#foo}} \ndef\n{{/foo}}\nghi'; + final parser = Parser(source, 'foo', '{{ }}'); final List nodes = parser.parse(); expectNodes(nodes, [ SectionNode('foo', 2, 10, '{{ }}'), @@ -211,8 +211,8 @@ void main() { }); test('parse section standalone tag whitespace on last line', () { - const String source = '{{#foo}}def\n {{/foo}} '; - final Parser parser = Parser(source, 'foo', '{{ }}'); + const source = '{{#foo}}def\n {{/foo}} '; + final parser = Parser(source, 'foo', '{{ }}'); final List nodes = parser.parse(); expectNodes(nodes, [SectionNode('foo', 0, 8, '{{ }}')]); expectNodes((nodes[0] as SectionNode).children, [ @@ -221,8 +221,8 @@ void main() { }); test('parse variable newline', () { - const String source = 'abc\n\n{{foo}}def'; - final Parser parser = Parser(source, 'foo', '{{ }}'); + const source = 'abc\n\n{{foo}}def'; + final parser = Parser(source, 'foo', '{{ }}'); final List nodes = parser.parse(); expectNodes(nodes, [ TextNode('abc\n\n', 0, 5), @@ -232,8 +232,8 @@ void main() { }); test('parse section standalone tag whitespace v2', () { - const String source = 'abc\n\n{{#foo}}\ndef\n{{/foo}}\nghi'; - final Parser parser = Parser(source, 'foo', '{{ }}'); + const source = 'abc\n\n{{#foo}}\ndef\n{{/foo}}\nghi'; + final parser = Parser(source, 'foo', '{{ }}'); final List nodes = parser.parse(); expectNodes(nodes, [ TextNode('abc\n\n', 0, 5), @@ -246,15 +246,15 @@ void main() { }); test('parse whitespace', () { - const String source = 'abc\n '; - final Parser parser = Parser(source, 'foo', '{{ }}'); + const source = 'abc\n '; + final parser = Parser(source, 'foo', '{{ }}'); final List nodes = parser.parse(); expectNodes(nodes, [TextNode('abc\n ', 0, 7)]); }); test('parse partial', () { - const String source = 'abc\n {{>foo}}def'; - final Parser parser = Parser(source, 'foo', '{{ }}'); + const source = 'abc\n {{>foo}}def'; + final parser = Parser(source, 'foo', '{{ }}'); final List nodes = parser.parse(); expectNodes(nodes, [ TextNode('abc\n ', 0, 7), @@ -264,8 +264,8 @@ void main() { }); test('parse change delimiters', () { - const String source = '{{= | | =}}<|#lambda|-|/lambda|>'; - final Parser parser = Parser(source, 'foo', '{{ }}'); + const source = '{{= | | =}}<|#lambda|-|/lambda|>'; + final parser = Parser(source, 'foo', '{{ }}'); final List nodes = parser.parse(); expectNodes(nodes, [ TextNode('<', 11, 12), @@ -279,8 +279,8 @@ void main() { }); test('corner case strict', () { - const String source = '{{{ #foo }}} {{{ /foo }}}'; - final Parser parser = Parser(source, 'foo', '{{ }}'); + const source = '{{{ #foo }}} {{{ /foo }}}'; + final parser = Parser(source, 'foo', '{{ }}'); try { parser.parse(); // TODO(stuartmorgan): Restructure test to use throwsA. @@ -292,8 +292,8 @@ void main() { }); test('corner case lenient', () { - const String source = '{{{ #foo }}} {{{ /foo }}}'; - final Parser parser = Parser(source, 'foo', '{{ }}', lenient: true); + const source = '{{{ #foo }}} {{{ /foo }}}'; + final parser = Parser(source, 'foo', '{{ }}', lenient: true); final List nodes = parser.parse(); expectNodes(nodes, [ VariableNode('#foo', 0, 12, escape: false), @@ -303,8 +303,8 @@ void main() { }); test('emoji', () { - const String source = 'Hello! 🖖👍🏽🏳️‍🌈\nEmoji'; - final Parser parser = Parser(source, 'foo', '{{ }}'); + const source = 'Hello! 🖖👍🏽🏳️‍🌈\nEmoji'; + final parser = Parser(source, 'foo', '{{ }}'); final List nodes = parser.parse(); // End offset includes emoji sizes expectNodes(nodes, [TextNode('Hello! 🖖👍🏽🏳️‍🌈\nEmoji', 0, 20)]); @@ -320,21 +320,16 @@ void main() { }); test('exception', () { - const String source = + const source = "'{{ foo }} sdfffffffffffffffffffffffffffffffffffffffffffff " 'dsfsdf sdfdsa fdsfads fsdfdsfadsf dsfasdfsdf sdfdsfsadf sdfadsfsdf '; - final TemplateException ex = TemplateException( - 'boom!', - 'foo.mustache', - source, - 2, - ); + final ex = TemplateException('boom!', 'foo.mustache', source, 2); ex.toString(); }); Exception parseFail(String source) { try { - final Parser parser = Parser(source, 'foo', '{{ }}'); + final parser = Parser(source, 'foo', '{{ }}'); parser.parse(); // TODO(stuartmorgan): Restructure test to use throwsA. // ignore: use_test_throws_matchers @@ -437,14 +432,14 @@ bool tokenEqual(Token a, Token b) { void expectTokens(List a, List b) { expect(a.length, equals(b.length), reason: '$a != $b'); - for (int i = 0; i < a.length; i++) { + for (var i = 0; i < a.length; i++) { expect(tokenEqual(a[i], b[i]), isTrue, reason: '$a != $b'); } } void expectNodes(List a, List b) { expect(a.length, equals(b.length), reason: '$a != $b'); - for (int i = 0; i < a.length; i++) { + for (var i = 0; i < a.length; i++) { expect(nodeEqual(a[i], b[i]), isTrue, reason: '$a != $b'); } } From 7cd002a3b3b9dac8685b758644de08f9476c945a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Augusto=20C=C3=A9sar=20Perin?= Date: Wed, 7 Jan 2026 11:55:18 -0300 Subject: [PATCH 109/118] [mustache_template] Improve error throwing (#10700) Addresses error handling issues flagged in the Gemini review of mustache_template. Changes: - Added missing `throw` before [_error()](cci:1://file:///C:/Users/Guto_/packages-pr/third_party/packages/mustache_template/lib/src/lambda_context.dart:27:2-34:3) calls in [lambda_context.dart](cci:7://file:///C:/Users/Guto_/packages-pr/third_party/packages/mustache_template/lib/src/lambda_context.dart:0:0-0:0) - Changed `Exception` to `StateError` for unreachable code in [parser.dart](cci:7://file:///C:/Users/Guto_/packages-pr/third_party/packages/mustache_template/lib/src/parser.dart:0:0-0:0) Fixes https://github.com/flutter/flutter/issues/174938 ## Pre-Review Checklist **Note**: The Flutter team is currently trialing the use of [Gemini Code Assist for GitHub](https://developers.google.com/gemini-code-assist/docs/review-github-code). Comments from the `gemini-code-assist` bot should not be taken as authoritative feedback from the Flutter team. If you find its comments useful you can update your code accordingly, but if you are unsure or disagree with the feedback, please feel free to wait for a Flutter team member's review for guidance on which automated comments should be addressed. [^1]: Regular contributors who have demonstrated familiarity with the repository guidelines only need to comment if the PR is not auto-exempted by repo tooling. --- .../packages/mustache_template/CHANGELOG.md | 4 +++- .../lib/src/lambda_context.dart | 10 ++++---- .../mustache_template/lib/src/parser.dart | 9 +++----- .../packages/mustache_template/pubspec.yaml | 2 +- .../mustache_template/test/mustache_test.dart | 23 +++++++++++++++++++ 5 files changed, 34 insertions(+), 14 deletions(-) diff --git a/third_party/packages/mustache_template/CHANGELOG.md b/third_party/packages/mustache_template/CHANGELOG.md index 83bf7da..67f53c1 100644 --- a/third_party/packages/mustache_template/CHANGELOG.md +++ b/third_party/packages/mustache_template/CHANGELOG.md @@ -1,6 +1,8 @@ -## NEXT +## 2.0.3 * Updates minimum supported SDK version to Flutter 3.35/Dart 3.9. +* Fixes error handling in LambdaContext by adding missing throw statements. +* Uses StateError instead of Exception for unreachable code in parser. ## 2.0.2 diff --git a/third_party/packages/mustache_template/lib/src/lambda_context.dart b/third_party/packages/mustache_template/lib/src/lambda_context.dart index ca4082f..3cd72c3 100644 --- a/third_party/packages/mustache_template/lib/src/lambda_context.dart +++ b/third_party/packages/mustache_template/lib/src/lambda_context.dart @@ -38,9 +38,7 @@ class LambdaContext implements m.LambdaContext { String renderString({Object? value}) { _checkClosed(); if (_node is! SectionNode) { - // TODO(stuartmorgan): Fix the lack of `throw` here, which looks like a - // bug in the original code. - _error( + throw _error( 'LambdaContext.renderString() can only be called on section tags.', ); } @@ -62,9 +60,9 @@ class LambdaContext implements m.LambdaContext { void render({Object? value}) { _checkClosed(); if (_node is! SectionNode) { - // TODO(stuartmorgan): Fix the lack of `throw` here, which looks like a - // bug in the original code. - _error('LambdaContext.render() can only be called on section tags.'); + throw _error( + 'LambdaContext.render() can only be called on section tags.', + ); } _renderSubtree(_renderer.sink, value); } diff --git a/third_party/packages/mustache_template/lib/src/parser.dart b/third_party/packages/mustache_template/lib/src/parser.dart index a6dc3b1..4253ec3 100644 --- a/third_party/packages/mustache_template/lib/src/parser.dart +++ b/third_party/packages/mustache_template/lib/src/parser.dart @@ -98,8 +98,7 @@ class Parser { _parseLine(); default: - // TODO(stuartmorgan): Convert to StateError. - throw Exception('Unreachable code.'); + throw StateError('Unreachable code.'); } } @@ -212,8 +211,7 @@ class Parser { break; default: - // TODO(stuartmorgan): Convert to StateError. - throw Exception('Unreachable code.'); + throw StateError('Unreachable code.'); } } @@ -412,8 +410,7 @@ class Parser { node = null; default: - // TODO(stuartmorgan): Convert to StateError. - throw Exception('Unreachable code'); + throw StateError('Unreachable code.'); } return node; } diff --git a/third_party/packages/mustache_template/pubspec.yaml b/third_party/packages/mustache_template/pubspec.yaml index 30e2128..264e0ee 100644 --- a/third_party/packages/mustache_template/pubspec.yaml +++ b/third_party/packages/mustache_template/pubspec.yaml @@ -2,7 +2,7 @@ name: mustache_template description: A templating library that implements the Mustache template specification repository: https://github.com/flutter/packages/tree/main/third_party/packages/mustache_template issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+mustache_template%22 -version: 2.0.2 +version: 2.0.3 environment: sdk: ^3.9.0 diff --git a/third_party/packages/mustache_template/test/mustache_test.dart b/third_party/packages/mustache_template/test/mustache_test.dart index 5fffe65..a814922 100644 --- a/third_party/packages/mustache_template/test/mustache_test.dart +++ b/third_party/packages/mustache_template/test/mustache_test.dart @@ -883,6 +883,29 @@ void main() { const output = ''; expect(parse(template).renderString(values), equals(output)); }); + + test('LambdaContext renderString on non-section throws', () { + final t = Template('{{ foo }}'); + expect( + () => t.renderString({ + 'foo': (LambdaContext lc) => lc.renderString(), + }), + throwsA(isA()), + ); + }); + + test('LambdaContext render on non-section throws', () { + final t = Template('{{ foo }}'); + expect( + () => t.renderString({ + 'foo': (LambdaContext lc) { + lc.render(); + return ''; + }, + }), + throwsA(isA()), + ); + }); }); } From 069f700dfd78150582f1d0d082f3e03123437cf7 Mon Sep 17 00:00:00 2001 From: stuartmorgan-g Date: Tue, 17 Feb 2026 14:37:09 -0500 Subject: [PATCH 110/118] [ci] Update repo for 3.41 (#11017) Updates the repo for the 3.41 stable release. This does everything in https://github.com/flutter/flutter/blob/master/docs/ecosystem/release/Updating-Packages-repo-for-a-stable-release.md except for: - The pin update, which already landed - The release action, which is https://github.com/flutter/packages/pull/11014 ## Pre-Review Checklist [^1]: Regular contributors who have demonstrated familiarity with the repository guidelines only need to comment if the PR is not auto-exempted by repo tooling. --- packages/flutter_template_images/CHANGELOG.md | 2 +- packages/flutter_template_images/pubspec.yaml | 2 +- packages/standard_message_codec/CHANGELOG.md | 2 +- packages/standard_message_codec/example/pubspec.yaml | 2 +- packages/standard_message_codec/pubspec.yaml | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/flutter_template_images/CHANGELOG.md b/packages/flutter_template_images/CHANGELOG.md index e8a7a0d..724f0bc 100644 --- a/packages/flutter_template_images/CHANGELOG.md +++ b/packages/flutter_template_images/CHANGELOG.md @@ -1,6 +1,6 @@ ## NEXT -* Updates minimum supported SDK version to Flutter 3.32/Dart 3.8. +* Updates minimum supported SDK version to Flutter 3.35/Dart 3.9. ## 5.0.0 diff --git a/packages/flutter_template_images/pubspec.yaml b/packages/flutter_template_images/pubspec.yaml index 3d4cdaa..3a57dd8 100644 --- a/packages/flutter_template_images/pubspec.yaml +++ b/packages/flutter_template_images/pubspec.yaml @@ -5,7 +5,7 @@ issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+ version: 5.0.0 environment: - sdk: ^3.8.0 + sdk: ^3.9.0 topics: - assets diff --git a/packages/standard_message_codec/CHANGELOG.md b/packages/standard_message_codec/CHANGELOG.md index 2547181..a9879af 100644 --- a/packages/standard_message_codec/CHANGELOG.md +++ b/packages/standard_message_codec/CHANGELOG.md @@ -1,6 +1,6 @@ ## NEXT -* Updates minimum supported SDK version to Flutter 3.32/Dart 3.8. +* Updates minimum supported SDK version to Flutter 3.35/Dart 3.9. ## 0.0.1+4 diff --git a/packages/standard_message_codec/example/pubspec.yaml b/packages/standard_message_codec/example/pubspec.yaml index ef638a0..d77511f 100644 --- a/packages/standard_message_codec/example/pubspec.yaml +++ b/packages/standard_message_codec/example/pubspec.yaml @@ -4,7 +4,7 @@ version: 0.0.1 publish_to: none environment: - sdk: ^3.8.0 + sdk: ^3.9.0 dependencies: standard_message_codec: diff --git a/packages/standard_message_codec/pubspec.yaml b/packages/standard_message_codec/pubspec.yaml index a98decf..2492ec9 100644 --- a/packages/standard_message_codec/pubspec.yaml +++ b/packages/standard_message_codec/pubspec.yaml @@ -5,7 +5,7 @@ repository: https://github.com/flutter/packages/tree/main/packages/standard_mess issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3Astandard_message_codec environment: - sdk: ^3.8.0 + sdk: ^3.9.0 dev_dependencies: test: ^1.16.0 From e16a7a70fe6dff02d3e1b0377ae56a1296fa5050 Mon Sep 17 00:00:00 2001 From: stuartmorgan-g Date: Wed, 25 Mar 2026 09:02:18 -0400 Subject: [PATCH 111/118] [mustache_template] Fix broken README link (#11306) pub.dev flagged this link since it used http rather than https, but it turns out it's also no longer a valid link; that domain doesn't resolve. This updates to the correct domain, and to a secure link. Part of https://github.com/flutter/flutter/issues/183844 ## Pre-Review Checklist - [x] I read the [Contributor Guide] and followed the process outlined there for submitting PRs. - [x] I read the [AI contribution guidelines] and understand my responsibilities, or I am not using AI tools. - [x] I read the [Tree Hygiene] page, which explains my responsibilities. - [x] I read and followed the [relevant style guides] and ran [the auto-formatter]. - [x] I signed the [CLA]. - [x] The title of the PR starts with the name of the package surrounded by square brackets, e.g. `[shared_preferences]` - [x] I [linked to at least one issue that this PR fixes] in the description above. - [x] I followed [the version and CHANGELOG instructions], using [semantic versioning] and the [repository CHANGELOG style], or I have commented below to indicate which documented exception this PR falls under[^1]. - [x] I updated/added any relevant documentation (doc comments with `///`). - [x] I added new tests to check the change I am making, or I have commented below to indicate which [test exemption] this PR falls under[^1]. - [x] All existing and new tests are passing. [^1]: Regular contributors who have demonstrated familiarity with the repository guidelines only need to comment if the PR is not auto-exempted by repo tooling. [Contributor Guide]: https://github.com/flutter/packages/blob/main/CONTRIBUTING.md [AI contribution guidelines]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#ai-contribution-guidelines [Tree Hygiene]: https://github.com/flutter/flutter/blob/master/docs/contributing/Tree-hygiene.md [relevant style guides]: https://github.com/flutter/packages/blob/main/CONTRIBUTING.md#style [the auto-formatter]: https://github.com/flutter/packages/blob/main/script/tool/README.md#format-code [CLA]: https://cla.developers.google.com/ [Discord]: https://github.com/flutter/flutter/blob/master/docs/contributing/Chat.md [linked to at least one issue that this PR fixes]: https://github.com/flutter/flutter/blob/master/docs/contributing/Tree-hygiene.md#overview [the version and CHANGELOG instructions]: https://github.com/flutter/flutter/blob/master/docs/ecosystem/contributing/README.md#version-and-changelog-updates [semantic versioning]: https://dart.dev/tools/pub/versioning#semantic-versions [repository CHANGELOG style]: https://github.com/flutter/flutter/blob/master/docs/ecosystem/contributing/README.md#changelog-style [test exemption]: https://github.com/flutter/flutter/blob/master/docs/contributing/Tree-hygiene.md#tests --- third_party/packages/mustache_template/CHANGELOG.md | 4 ++++ third_party/packages/mustache_template/README.md | 2 +- third_party/packages/mustache_template/pubspec.yaml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/third_party/packages/mustache_template/CHANGELOG.md b/third_party/packages/mustache_template/CHANGELOG.md index 67f53c1..634e9ab 100644 --- a/third_party/packages/mustache_template/CHANGELOG.md +++ b/third_party/packages/mustache_template/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.0.4 + +* Fixes a broken README link to the Mustache manual. + ## 2.0.3 * Updates minimum supported SDK version to Flutter 3.35/Dart 3.9. diff --git a/third_party/packages/mustache_template/README.md b/third_party/packages/mustache_template/README.md index 7602c27..cf4dab6 100644 --- a/third_party/packages/mustache_template/README.md +++ b/third_party/packages/mustache_template/README.md @@ -2,7 +2,7 @@ A Dart library to parse and render [mustache templates](https://mustache.github.io/). -See the [mustache manual](http://mustache.github.com/mustache.5.html) for detailed usage information. +See the [mustache manual](https://mustache.github.io/mustache.5.html) for detailed usage information. This library passes all [mustache specification](https://github.com/mustache/spec/tree/master/specs) tests. diff --git a/third_party/packages/mustache_template/pubspec.yaml b/third_party/packages/mustache_template/pubspec.yaml index 264e0ee..8a8bdea 100644 --- a/third_party/packages/mustache_template/pubspec.yaml +++ b/third_party/packages/mustache_template/pubspec.yaml @@ -2,7 +2,7 @@ name: mustache_template description: A templating library that implements the Mustache template specification repository: https://github.com/flutter/packages/tree/main/third_party/packages/mustache_template issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+mustache_template%22 -version: 2.0.3 +version: 2.0.4 environment: sdk: ^3.9.0 From 350f1a3d9e70301d52f4ffae437036c0aa04aa98 Mon Sep 17 00:00:00 2001 From: jslater89 Date: Mon, 13 Apr 2026 14:12:11 -0400 Subject: [PATCH 112/118] [mustache_template] Fix auto-generated specification tests, run with `dart test` (#11056) This PR reorganizes the tests in mustache_template such that CI can run them, per the second option proposed in flutter/flutter#174721. The changes include a script to pull mustache specifications from the mustache repository and note the time/date and commit hash of that action, along with documentation of the above and the new test structure laid out below. The former `all.dart` (which called three `main` functions in three test files) is now `mustache_test.dart`, and the former `mustache_test.dart` (which contained handwritten tests) is now `feature_test.dart`. The `mustache_specs.dart` file is now solely responsible for generating the tests in `mustache_test.dart` from the mustache specs, and no longer has a `main` of its own. As this implementation doesn't support two of the optional mustache specs (inheritance and dynamic names, which were added to the mustache repo in the early 2020s, while the original mustache_template package was written in the mid-2010s), this PR also adds an UNSUPPORTED_SPECS constant in `mustache_test.dart` that skips generation of tests from those spec files. (Separately, I'm working on an implementation of the inheritance spec, so it seemed better to pull all the specification files and selectively disable the unsupported ones.) ## Pre-Review Checklist ### Exemptions - Version change exemption: PR affects tests only. - CHANGELOG exemption: PR affects tests only. **Note**: The Flutter team is currently trialing the use of [Gemini Code Assist for GitHub](https://developers.google.com/gemini-code-assist/docs/review-github-code). Comments from the `gemini-code-assist` bot should not be taken as authoritative feedback from the Flutter team. If you find its comments useful you can update your code accordingly, but if you are unsure or disagree with the feedback, please feel free to wait for a Flutter team member's review for guidance on which automated comments should be addressed. [^1]: Regular contributors who have demonstrated familiarity with the repository guidelines only need to comment if the PR is not auto-exempted by repo tooling. --- .../packages/mustache_template/.gitignore | 1 + .../packages/mustache_template/test/README.md | 23 + .../packages/mustache_template/test/all.dart | 9 - .../mustache_template/test/download-spec.sh | 1 - .../mustache_template/test/feature_test.dart | 962 ++++++++++++++++++ .../test/mustache_specs.dart | 30 +- .../mustache_template/test/mustache_test.dart | 940 +---------------- .../mustache_template/test/parser_test.dart | 28 +- .../test/specs/comments.dart | 109 ++ .../test/specs/delimiters.dart | 135 +++ .../test/specs/dynamic_names.dart | 319 ++++++ .../test/specs/inheritance.dart | 309 ++++++ .../test/specs/interpolation.dart | 425 ++++++++ .../test/specs/inverted.dart | 230 +++++ .../mustache_template/test/specs/lambdas.dart | 235 +++++ .../test/specs/partials.dart | 156 +++ .../test/specs/sections.dart | 426 ++++++++ .../mustache_template/test/specs/specs.dart | 22 + .../mustache_template/tool/download_spec.dart | 125 +++ 19 files changed, 3497 insertions(+), 988 deletions(-) create mode 100644 third_party/packages/mustache_template/.gitignore create mode 100644 third_party/packages/mustache_template/test/README.md delete mode 100644 third_party/packages/mustache_template/test/all.dart delete mode 100755 third_party/packages/mustache_template/test/download-spec.sh create mode 100644 third_party/packages/mustache_template/test/feature_test.dart create mode 100644 third_party/packages/mustache_template/test/specs/comments.dart create mode 100644 third_party/packages/mustache_template/test/specs/delimiters.dart create mode 100644 third_party/packages/mustache_template/test/specs/dynamic_names.dart create mode 100644 third_party/packages/mustache_template/test/specs/inheritance.dart create mode 100644 third_party/packages/mustache_template/test/specs/interpolation.dart create mode 100644 third_party/packages/mustache_template/test/specs/inverted.dart create mode 100644 third_party/packages/mustache_template/test/specs/lambdas.dart create mode 100644 third_party/packages/mustache_template/test/specs/partials.dart create mode 100644 third_party/packages/mustache_template/test/specs/sections.dart create mode 100644 third_party/packages/mustache_template/test/specs/specs.dart create mode 100644 third_party/packages/mustache_template/tool/download_spec.dart diff --git a/third_party/packages/mustache_template/.gitignore b/third_party/packages/mustache_template/.gitignore new file mode 100644 index 0000000..263526e --- /dev/null +++ b/third_party/packages/mustache_template/.gitignore @@ -0,0 +1 @@ +test/spec diff --git a/third_party/packages/mustache_template/test/README.md b/third_party/packages/mustache_template/test/README.md new file mode 100644 index 0000000..2ceca82 --- /dev/null +++ b/third_party/packages/mustache_template/test/README.md @@ -0,0 +1,23 @@ +# Test Structure + +## Specifications + +`mustache_test.dart` and `mustache_specs.dart` generate tests for all mustache specifications, +except for those disabled by `mustache_test.dart`'s `unsupportedSpecs` constant. +`dart test mustache_test.dart` runs all of the generated tests. + +Each generated specification file contains the mustache commit hash from which it was generated, +and the date when it was generated. + +### Updating specifications + +From the package root, run `dart run tool/download_spec.dart` to pull new definitions from the +mustache repository into `test/specs/`. + +## Features + +Standalone or handwritten tests regarding template output go in `feature_test.dart`. + +## Parser + +Tests for the template language parser go in `parser_test.dart`. diff --git a/third_party/packages/mustache_template/test/all.dart b/third_party/packages/mustache_template/test/all.dart deleted file mode 100644 index 0e7d0e4..0000000 --- a/third_party/packages/mustache_template/test/all.dart +++ /dev/null @@ -1,9 +0,0 @@ -import 'mustache_specs.dart' as specs; -import 'mustache_test.dart' as test; -import 'parser_test.dart' as parser; - -void main() { - specs.main(); - test.main(); - parser.main(); -} diff --git a/third_party/packages/mustache_template/test/download-spec.sh b/third_party/packages/mustache_template/test/download-spec.sh deleted file mode 100755 index e36cb5b..0000000 --- a/third_party/packages/mustache_template/test/download-spec.sh +++ /dev/null @@ -1 +0,0 @@ -git clone https://github.com/mustache/spec.git diff --git a/third_party/packages/mustache_template/test/feature_test.dart b/third_party/packages/mustache_template/test/feature_test.dart new file mode 100644 index 0000000..7f4ea4f --- /dev/null +++ b/third_party/packages/mustache_template/test/feature_test.dart @@ -0,0 +1,962 @@ +import 'package:mustache_template/mustache.dart'; +import 'package:test/test.dart'; + +const String UNEXPECTED_EOF = 'Unexpected end of input'; +const String BAD_VALUE_INV_SECTION = 'Invalid value type for inverse section'; +const String BAD_TAG_NAME = 'Unless in lenient mode, tags may only contain'; +const String VALUE_MISSING = 'Value was missing'; +const String UNCLOSED_TAG = 'Unclosed tag'; + +Template parse(String source, {bool lenient = false}) => + Template(source, lenient: lenient); + +void main() { + group('Basic', () { + test('Variable', () { + final String output = parse( + '_{{var}}_', + ).renderString({'var': 'bob'}); + expect(output, equals('_bob_')); + }); + test('Comment', () { + final String output = parse( + '_{{! i am a\n comment ! }}_', + ).renderString({}); + expect(output, equals('__')); + }); + test('Emoji', () { + final String output = parse( + 'Hello! 🖖👍🏽\nBye! 🏳️‍🌈', + ).renderString({}); + expect(output, equals('Hello! 🖖👍🏽\nBye! 🏳️‍🌈')); + }); + }); + group('Section', () { + test('Map', () { + final String output = parse('{{#section}}_{{var}}_{{/section}}') + .renderString(>{ + 'section': {'var': 'bob'}, + }); + expect(output, equals('_bob_')); + }); + test('List', () { + final String output = parse('{{#section}}_{{var}}_{{/section}}') + .renderString(>>{ + 'section': >[ + {'var': 'bob'}, + {'var': 'jim'}, + ], + }); + expect(output, equals('_bob__jim_')); + }); + test('Empty List', () { + final String output = parse( + '{{#section}}_{{var}}_{{/section}}', + ).renderString(>{'section': []}); + expect(output, equals('')); + }); + test('False', () { + final String output = parse( + '{{#section}}_{{var}}_{{/section}}', + ).renderString({'section': false}); + expect(output, equals('')); + }); + test('Invalid value', () { + final Exception? ex = renderFail( + '{{#section}}_{{var}}_{{/section}}', + {'section': 42}, + ); + if (ex is TemplateException) { + expect(ex.message, startsWith(VALUE_MISSING)); + } else { + fail('Unexpected type: $ex'); + } + }); + test('Invalid value - lenient mode', () { + final String output = parse( + '{{#var}}_{{var}}_{{/var}}', + lenient: true, + ).renderString({'var': 42}); + expect(output, equals('_42_')); + }); + + test('True', () { + final String output = parse( + '{{#section}}_ok_{{/section}}', + ).renderString({'section': true}); + expect(output, equals('_ok_')); + }); + + test('Nested', () { + final String output = + parse( + '{{#section}}.{{var}}.{{#nested}}_{{nestedvar}}_{{/nested}}.{{/section}}', + ).renderString(>{ + 'section': { + 'var': 'bob', + 'nested': >[ + {'nestedvar': 'jim'}, + {'nestedvar': 'sally'}, + ], + }, + }); + expect(output, equals('.bob._jim__sally_.')); + }); + + test('Whitespace in section tags', () { + expect( + parse('{{#foo.bar}}oi{{/foo.bar}}').renderString( + >{ + 'foo': {'bar': true}, + }, + ), + equals('oi'), + ); + expect( + parse('{{# foo.bar}}oi{{/foo.bar}}').renderString( + >{ + 'foo': {'bar': true}, + }, + ), + equals('oi'), + ); + expect( + parse('{{#foo.bar }}oi{{/foo.bar}}').renderString( + >{ + 'foo': {'bar': true}, + }, + ), + equals('oi'), + ); + expect( + parse('{{# foo.bar }}oi{{/foo.bar}}').renderString( + >{ + 'foo': {'bar': true}, + }, + ), + equals('oi'), + ); + expect( + parse('{{#foo.bar}}oi{{/ foo.bar}}').renderString( + >{ + 'foo': {'bar': true}, + }, + ), + equals('oi'), + ); + expect( + parse('{{#foo.bar}}oi{{/foo.bar }}').renderString( + >{ + 'foo': {'bar': true}, + }, + ), + equals('oi'), + ); + expect( + parse('{{#foo.bar}}oi{{/ foo.bar }}').renderString( + >{ + 'foo': {'bar': true}, + }, + ), + equals('oi'), + ); + expect( + parse('{{# foo.bar }}oi{{/ foo.bar }}').renderString( + >{ + 'foo': {'bar': true}, + }, + ), + equals('oi'), + ); + }); + + test('Whitespace in variable tags', () { + expect( + parse('{{foo.bar}}').renderString(>{ + 'foo': {'bar': true}, + }), + equals('true'), + ); + expect( + parse('{{ foo.bar}}').renderString(>{ + 'foo': {'bar': true}, + }), + equals('true'), + ); + expect( + parse('{{foo.bar }}').renderString(>{ + 'foo': {'bar': true}, + }), + equals('true'), + ); + expect( + parse('{{ foo.bar }}').renderString(>{ + 'foo': {'bar': true}, + }), + equals('true'), + ); + }); + + test('Odd whitespace in tags', () { + void render(String source, dynamic values, dynamic output) => expect( + parse(source, lenient: true).renderString(values), + equals(output), + ); + + render('{{\t# foo}}oi{{\n/foo}}', {'foo': true}, 'oi'); + + render( + '{{ # # foo }} {{ oi }} {{ / # foo }}', + >>{ + '# foo': >[ + {'oi': 'OI!'}, + ], + }, + ' OI! ', + ); + + render( + '{{ #foo }} {{ oi }} {{ /foo }}', + >>{ + 'foo': >[ + {'oi': 'OI!'}, + ], + }, + ' OI! ', + ); + + render( + '{{\t#foo }} {{ oi }} {{ /foo }}', + >>{ + 'foo': >[ + {'oi': 'OI!'}, + ], + }, + ' OI! ', + ); + + render('{{{ #foo }}} {{{ /foo }}}', { + '#foo': 1, + '/foo': 2, + }, '1 2'); + + // Invalid - I'm ok with that for now. + // render( + // "{{{ { }}}", + // {'{': 1}, + // '1'); + + render('{{\nfoo}}', {'foo': 'bar'}, 'bar'); + + render('{{\tfoo}}', {'foo': 'bar'}, 'bar'); + + render('{{\t# foo}}oi{{\n/foo}}', {'foo': true}, 'oi'); + + render('{{{\tfoo\t}}}', {'foo': true}, 'true'); + }); + + test('Sigils in tag names in lenient mode', () { + void render(String source, dynamic values, dynamic output) => expect( + parse(source, lenient: true).renderString(values), + equals(output), + ); + + // Even in lenient mode, tag names may not be a single sigil + // character. + expect( + () => parse('{{#}}', lenient: true), + throwsA(isA()), + ); + expect( + () => parse('{{>}}', lenient: true), + throwsA(isA()), + ); + expect( + () => parse('{{&}}', lenient: true), + throwsA(isA()), + ); + expect( + () => parse('{{/}}', lenient: true), + throwsA(isA()), + ); + expect( + () => parse('{{^}}', lenient: true), + throwsA(isA()), + ); + + // >a means 'a partial named "a"', not a variable named ">a", + // and in lenient mode the missing partial should fail silently + // and yield an empty string. + render('{{ >a }}', {'>a': 'oi'}, ''); + + // sigils are valid in variable tag names as long as they aren't + // in the initial position. + render('{{ a> }}', {'a>': 'oi'}, 'oi'); + render('{{ a# }}', {'a#': 'oi'}, 'oi'); + }); + + test('Empty source', () { + final t = Template(''); + expect(t.renderString({}), equals('')); + }); + + test('Template name', () { + final t = Template('', name: 'foo'); + expect(t.name, equals('foo')); + }); + + test('Bad tag', () { + expect(() => Template('{{{ foo }|'), throwsException); + }); + }); + + group('Inverse Section', () { + test('Map', () { + final String output = parse('{{^section}}_{{var}}_{{/section}}') + .renderString(>{ + 'section': {'var': 'bob'}, + }); + expect(output, equals('')); + }); + test('List', () { + final String output = parse('{{^section}}_{{var}}_{{/section}}') + .renderString(>>{ + 'section': >[ + {'var': 'bob'}, + {'var': 'jim'}, + ], + }); + expect(output, equals('')); + }); + test('Empty List', () { + final String output = parse( + '{{^section}}_ok_{{/section}}', + ).renderString(>{'section': []}); + expect(output, equals('_ok_')); + }); + test('False', () { + final String output = parse( + '{{^section}}_ok_{{/section}}', + ).renderString({'section': false}); + expect(output, equals('_ok_')); + }); + test('Invalid value', () { + final Exception? ex = renderFail( + '{{^section}}_{{var}}_{{/section}}', + {'section': 42}, + ); + expect(ex is TemplateException, isTrue); + expect( + (ex! as TemplateException).message, + startsWith(BAD_VALUE_INV_SECTION), + ); + }); + test('Invalid value - lenient mode', () { + final String output = parse( + '{{^var}}_ok_{{/var}}', + lenient: true, + ).renderString({'var': 42}); + expect(output, equals('')); + }); + test('True', () { + final String output = parse( + '{{^section}}_ok_{{/section}}', + ).renderString({'section': true}); + expect(output, equals('')); + }); + }); + + group('Html escape', () { + test('Escape at start', () { + final String output = parse( + '_{{var}}_', + ).renderString({'var': '&.'}); + expect(output, equals('_&._')); + }); + + test('Escape at end', () { + final String output = parse( + '_{{var}}_', + ).renderString({'var': '.&'}); + expect(output, equals('_.&_')); + }); + + test('&', () { + final String output = parse( + '_{{var}}_', + ).renderString({'var': '&'}); + expect(output, equals('_&_')); + }); + + test('<', () { + final String output = parse( + '_{{var}}_', + ).renderString({'var': '<'}); + expect(output, equals('_<_')); + }); + + test('>', () { + final String output = parse( + '_{{var}}_', + ).renderString({'var': '>'}); + expect(output, equals('_>_')); + }); + + test('"', () { + final String output = parse( + '_{{var}}_', + ).renderString({'var': '"'}); + expect(output, equals('_"_')); + }); + + test("'", () { + final String output = parse( + '_{{var}}_', + ).renderString({'var': "'"}); + expect(output, equals('_'_')); + }); + + test('/', () { + final String output = parse( + '_{{var}}_', + ).renderString({'var': '/'}); + expect(output, equals('_/_')); + }); + }); + + group('Invalid format', () { + test('Mismatched tag', () { + const source = '{{#section}}_{{var}}_{{/notsection}}'; + final Exception? ex = renderFail(source, >{ + 'section': {'var': 'bob'}, + }); + expectFail(ex, 1, 22, 'Mismatched tag'); + }); + + test('Unexpected EOF', () { + const source = '{{#section}}_{{var}}_{{/section'; + final Exception? ex = renderFail(source, >{ + 'section': {'var': 'bob'}, + }); + expectFail(ex, 1, 31, UNEXPECTED_EOF); + }); + + test('Bad tag name, open section', () { + const source = r'{{#section$%$^%}}_{{var}}_{{/section}}'; + final Exception? ex = renderFail(source, >{ + 'section': {'var': 'bob'}, + }); + expectFail(ex, null, null, BAD_TAG_NAME); + }); + + test('Bad tag name, close section', () { + const source = r'{{#section}}_{{var}}_{{/section$%$^%}}'; + final Exception? ex = renderFail(source, >{ + 'section': {'var': 'bob'}, + }); + expectFail(ex, null, null, BAD_TAG_NAME); + }); + + test('Bad tag name, variable', () { + const source = r'{{#section}}_{{var$%$^%}}_{{/section}}'; + final Exception? ex = renderFail(source, >{ + 'section': {'var': 'bob'}, + }); + expectFail(ex, null, null, BAD_TAG_NAME); + }); + + test('Missing variable', () { + const source = r'{{#section}}_{{var}}_{{/section}}'; + final Exception? ex = renderFail(source, >{ + 'section': {}, + }); + expectFail(ex, null, null, VALUE_MISSING); + }); + + // Null variables shouldn't be a problem. + test('Null variable', () { + final t = Template('{{#section}}_{{var}}_{{/section}}'); + final String output = t.renderString(>{ + 'section': {'var': null}, + }); + expect(output, equals('__')); + }); + + test('Unclosed section', () { + const source = r'{{#section}}foo'; + final Exception? ex = renderFail(source, >{ + 'section': {}, + }); + expectFail(ex, null, null, UNCLOSED_TAG); + }); + }); + + group('Lenient', () { + test('Odd section name', () { + final String output = + parse( + r'{{#section$%$^%}}_{{var}}_{{/section$%$^%}}', + lenient: true, + ).renderString(>{ + r'section$%$^%': {'var': 'bob'}, + }); + expect(output, equals('_bob_')); + }); + + test('Odd variable name', () { + final String output = + parse( + r'{{#section}}_{{var$%$^%}}_{{/section}}', + lenient: true, + ).renderString(>{ + 'section': {r'var$%$^%': 'bob'}, + }); + expect(output, equals('_bob_')); + }); + + test('Null variable', () { + final String output = + parse( + r'{{#section}}_{{var}}_{{/section}}', + lenient: true, + ).renderString(>{ + 'section': {'var': null}, + }); + expect(output, equals('__')); + }); + + test('Null section', () { + final String output = parse( + '{{#section}}_{{var}}_{{/section}}', + lenient: true, + ).renderString({'section': null}); + expect(output, equals('')); + }); + }); + + group('Escape tags', () { + test('{{{ ... }}}', () { + final String output = parse( + '{{{blah}}}', + ).renderString({'blah': '&'}); + expect(output, equals('&')); + }); + test('{{& ... }}', () { + final String output = parse( + '{{{blah}}}', + ).renderString({'blah': '&'}); + expect(output, equals('&')); + }); + }); + + group('Partial tag', () { + String partialTest( + Map values, + Map sources, + String renderTemplate, { + bool lenient = false, + }) { + final templates = {}; + Template? resolver(String name) => templates[name]; + for (final String k in sources.keys) { + templates[k] = Template( + sources[k]! as String, + name: k, + lenient: lenient, + partialResolver: resolver, + ); + } + final Template? t = resolver(renderTemplate); + return t!.renderString(values); + } + + test('basic', () { + final String output = partialTest( + {'foo': 'bar'}, + {'root': '{{>partial}}', 'partial': '{{foo}}'}, + 'root', + ); + expect(output, 'bar'); + }); + + test('missing partial strict', () { + var threw = false; + try { + partialTest( + {'foo': 'bar'}, + {'root': '{{>partial}}'}, + 'root', + ); + } on Exception catch (e) { + expect(e is TemplateException, isTrue); + threw = true; + } + expect(threw, isTrue); + }); + + test('missing partial lenient', () { + final String output = partialTest( + {'foo': 'bar'}, + {'root': '{{>partial}}'}, + 'root', + lenient: true, + ); + expect(output, equals('')); + }); + + test('context', () { + final String output = partialTest( + {'text': 'content'}, + {'root': '"{{>partial}}"', 'partial': '*{{text}}*'}, + 'root', + lenient: true, + ); + expect(output, equals('"*content*"')); + }); + + test('recursion', () { + final String output = partialTest( + { + 'content': 'X', + 'nodes': >[ + {'content': 'Y', 'nodes': []}, + ], + }, + { + 'root': '{{>node}}', + 'node': '{{content}}<{{#nodes}}{{>node}}{{/nodes}}>', + }, + 'root', + lenient: true, + ); + expect(output, equals('X>')); + }); + + test('standalone without previous', () { + final String output = partialTest( + {}, + {'root': ' {{>partial}}\n>', 'partial': '>\n>'}, + 'root', + lenient: true, + ); + expect(output, equals(' >\n >>')); + }); + + test('standalone indentation', () { + final String output = partialTest( + {'content': '<\n->'}, + { + 'root': '\\\n {{>partial}}\n/\n', + 'partial': '|\n{{{content}}}\n|\n', + }, + 'root', + lenient: true, + ); + expect(output, equals('\\\n |\n <\n->\n |\n/\n')); + }); + }); + + group('Lambdas', () { + void lambdaTest({ + required String template, + dynamic lambda, + dynamic output, + }) => expect( + parse(template).renderString({'lambda': lambda}), + equals(output), + ); + + test('basic', () { + lambdaTest( + template: 'Hello, {{lambda}}!', + lambda: (_) => 'world', + output: 'Hello, world!', + ); + }); + + test('escaping', () { + lambdaTest( + template: '<{{lambda}}{{{lambda}}}', + lambda: (_) => '>', + output: '<>>', + ); + }); + + test('sections', () { + lambdaTest( + template: '{{#lambda}}FILE{{/lambda}} != {{#lambda}}LINE{{/lambda}}', + lambda: (LambdaContext ctx) => '__${ctx.renderString()}__', + output: '__FILE__ != __LINE__', + ); + }); + + test('inverted sections truthy', () { + const template = '<{{^lambda}}{{static}}{{/lambda}}>'; + final values = { + 'lambda': (_) => false, + 'static': 'static', + }; + const output = '<>'; + expect(parse(template).renderString(values), equals(output)); + }); + + test("seth's use case", () { + const template = '<{{#markdown}}{{content}}{{/markdown}}>'; + final values = { + 'markdown': (LambdaContext ctx) => ctx.renderString().toLowerCase(), + 'content': 'OI YOU!', + }; + const output = ''; + expect(parse(template).renderString(values), equals(output)); + }); + + test('Lambda v2', () { + const template = '<{{#markdown}}{{content}}{{/markdown}}>'; + final values = { + 'markdown': (LambdaContext ctx) => ctx.source, + 'content': 'OI YOU!', + }; + const output = '<{{content}}>'; + expect(parse(template).renderString(values), equals(output)); + }); + + test('Lambda v2...', () { + const template = '<{{#markdown}}dsfsf dsfsdf dfsdfsd{{/markdown}}>'; + final values = { + // ignore: avoid_dynamic_calls + 'markdown': (dynamic ctx) => ctx.source, + }; + const output = ''; + expect(parse(template).renderString(values), equals(output)); + }); + + test('Alternate Delimiters', () { + // A lambda's return value should parse with the default delimiters. + + const template = '{{= | | =}}\nHello, (|&lambda|)!'; + + //function() { return "|planet| => {{planet}}" } + final values = { + 'planet': 'world', + 'lambda': (LambdaContext ctx) => + ctx.renderSource('|planet| => {{planet}}'), + }; + + const output = 'Hello, (|planet| => world)!'; + + expect(parse(template).renderString(values), equals(output)); + }); + + test('Alternate Delimiters 2', () { + // Lambdas used for sections should parse with the current delimiters. + + const template = '{{= | | =}}<|#lambda|-|/lambda|>'; + + //function() { return "|planet| => {{planet}}" } + final values = { + 'planet': 'Earth', + 'lambda': (LambdaContext ctx) { + final String txt = ctx.source; + return ctx.renderSource('$txt{{planet}} => |planet|$txt'); + }, + }; + + const output = '<-{{planet}} => Earth->'; + + expect(parse(template).renderString(values), equals(output)); + }); + + test('LambdaContext.lookup', () { + final t = Template('{{ foo }}'); + final String s = t.renderString({ + 'foo': (LambdaContext lc) => lc.lookup('bar'), + 'bar': 'jim', + }); + expect(s, equals('jim')); + }); + + test('LambdaContext.lookup closed', () { + final t = Template('{{ foo }}'); + LambdaContext? lc2; + t.renderString({ + 'foo': (LambdaContext lc) => lc2 = lc, + 'bar': 'jim', + }); + expect(lc2, isNotNull); + expect(() => lc2?.lookup('foo'), throwsException); + }); + }); + + group('Other', () { + test('Standalone line', () { + final String val = parse( + '|\n{{#bob}}\n{{/bob}}\n|', + ).renderString(>{'bob': []}); + expect(val, equals('|\n|')); + }); + }); + + group('Array indexing', () { + test('Basic', () { + final String val = parse('{{array.1}}').renderString(>{ + 'array': [1, 2, 3], + }); + expect(val, equals('2')); + }); + test('RangeError', () { + final Exception? error = renderFail('{{array.5}}', >{ + 'array': [1, 2, 3], + }); + expect(error, isA()); + }); + }); + + group('Delimiters', () { + test('Basic', () { + final String val = parse( + '{{=<% %>=}}(<%text%>)', + ).renderString({'text': 'Hey!'}); + expect(val, equals('(Hey!)')); + }); + + test('Single delimiters', () { + final String val = parse( + '({{=[ ]=}}[text])', + ).renderString({'text': 'It worked!'}); + expect(val, equals('(It worked!)')); + }); + }); + + group('Template with custom delimiters', () { + test('Basic', () { + final t = Template('(<%text%>)', delimiters: '<% %>'); + final String val = t.renderString({'text': 'Hey!'}); + expect(val, equals('(Hey!)')); + }); + }); + + group('Lambda context', () { + test('LambdaContext write', () { + const template = '<{{#markdown}}{{content}}{{/markdown}}>'; + final values = { + 'markdown': (LambdaContext ctx) { + ctx.write('foo'); + }, + }; + const output = ''; + expect(parse(template).renderString(values), equals(output)); + }); + + test('LambdaContext render', () { + const template = '<{{#markdown}}{{content}}{{/markdown}}>'; + final values = { + 'content': 'bar', + 'markdown': (LambdaContext ctx) { + ctx.render(); + }, + }; + const output = ''; + expect(parse(template).renderString(values), equals(output)); + }); + + test('LambdaContext render with value', () { + const template = '<{{#markdown}}{{content}}{{/markdown}}>'; + final values = { + 'markdown': (LambdaContext ctx) { + ctx.render(value: {'content': 'oi!'}); + }, + }; + const output = ''; + expect(parse(template).renderString(values), equals(output)); + }); + + test('LambdaContext renderString with value', () { + const template = '<{{#markdown}}{{content}}{{/markdown}}>'; + final values = { + 'markdown': (LambdaContext ctx) { + return ctx.renderString(value: {'content': 'oi!'}); + }, + }; + const output = ''; + expect(parse(template).renderString(values), equals(output)); + }); + + test('LambdaContext write and return', () { + const template = '<{{#markdown}}{{content}}{{/markdown}}>'; + final values = { + 'markdown': (LambdaContext ctx) { + ctx.write('foo'); + return 'bar'; + }, + }; + const output = ''; + expect(parse(template).renderString(values), equals(output)); + }); + + test('LambdaContext renderSource with value', () { + const template = '<{{#markdown}}{{content}}{{/markdown}}>'; + final values = { + 'markdown': (LambdaContext ctx) { + return ctx.renderSource( + ctx.source, + value: {'content': 'oi!'}, + ); + }, + }; + const output = ''; + expect(parse(template).renderString(values), equals(output)); + }); + + test('LambdaContext renderString on non-section throws', () { + final t = Template('{{ foo }}'); + expect( + () => t.renderString({ + 'foo': (LambdaContext lc) => lc.renderString(), + }), + throwsA(isA()), + ); + }); + + test('LambdaContext render on non-section throws', () { + final t = Template('{{ foo }}'); + expect( + () => t.renderString({ + 'foo': (LambdaContext lc) { + lc.render(); + return ''; + }, + }), + throwsA(isA()), + ); + }); + }); +} + +Exception? renderFail(String source, Object values) { + try { + parse(source).renderString(values); + return null; + } on Exception catch (e) { + return e; + } +} + +void expectFail( + Exception? ex, + int? line, + int? column, [ + String? msgStartsWith, +]) { + if (ex is! TemplateException) { + fail('Unexpected type: $ex'); + } + if (line != null) { + expect(ex.line, equals(line)); + } + if (column != null) { + expect(ex.column, equals(column)); + } + if (msgStartsWith != null) { + expect(ex.message, startsWith(msgStartsWith)); + } +} diff --git a/third_party/packages/mustache_template/test/mustache_specs.dart b/third_party/packages/mustache_template/test/mustache_specs.dart index d0a565f..5063e85 100644 --- a/third_party/packages/mustache_template/test/mustache_specs.dart +++ b/third_party/packages/mustache_template/test/mustache_specs.dart @@ -4,11 +4,12 @@ // See: https://github.com/valotas/mustache4dart import 'dart:convert'; -import 'dart:io'; import 'package:mustache_template/mustache.dart'; import 'package:test/test.dart'; +import 'specs/specs.dart'; + String render( String source, dynamic values, { @@ -26,21 +27,12 @@ String render( return t.renderString(values); } -void main() { - defineTests(); -} - -void defineTests() { - final specsDir = Directory('test/spec/specs'); - specsDir.listSync().forEach((FileSystemEntity f) { - if (f is File) { - final String filename = f.path; - if (shouldRun(filename)) { - final String text = f.readAsStringSync(); - _defineGroupFromFile(filename, text); - } +void defineTests(List unsupportedSpecs) { + for (final MapEntry(key: specName, value: text) in SPECS.entries) { + if (shouldRun(specName, unsupportedSpecs)) { + _defineGroupFromFile(specName, text); } - }); + } } void _defineGroupFromFile(String filename, String text) { @@ -91,12 +83,8 @@ void _defineGroupFromFile(String filename, String text) { }); } -bool shouldRun(String filename) { - // filter out only .json files - if (!filename.endsWith('.json')) { - return false; - } - return true; +bool shouldRun(String specName, List unsupportedSpecs) { + return !unsupportedSpecs.contains(specName); } String Function(Object?) _dummyCallableWithState() { diff --git a/third_party/packages/mustache_template/test/mustache_test.dart b/third_party/packages/mustache_template/test/mustache_test.dart index a814922..fb2ddf2 100644 --- a/third_party/packages/mustache_template/test/mustache_test.dart +++ b/third_party/packages/mustache_template/test/mustache_test.dart @@ -1,939 +1,9 @@ -import 'package:mustache_template/mustache.dart'; -import 'package:test/test.dart'; +import 'mustache_specs.dart' as specs; -const String UNEXPECTED_EOF = 'Unexpected end of input'; -const String BAD_VALUE_INV_SECTION = 'Invalid value type for inverse section'; -const String BAD_TAG_NAME = 'Unless in lenient mode, tags may only contain'; -const String VALUE_MISSING = 'Value was missing'; -const String UNCLOSED_TAG = 'Unclosed tag'; - -Template parse(String source, {bool lenient = false}) => - Template(source, lenient: lenient); +/// Optional specifications that are not currently supported +/// by this library, in the format of the keys in the SPECS map in specs/specs.dart +const List unsupportedSpecs = ['inheritance', 'dynamic_names']; void main() { - group('Basic', () { - test('Variable', () { - final String output = parse( - '_{{var}}_', - ).renderString({'var': 'bob'}); - expect(output, equals('_bob_')); - }); - test('Comment', () { - final String output = parse( - '_{{! i am a\n comment ! }}_', - ).renderString({}); - expect(output, equals('__')); - }); - test('Emoji', () { - final String output = parse( - 'Hello! 🖖👍🏽\nBye! 🏳️‍🌈', - ).renderString({}); - expect(output, equals('Hello! 🖖👍🏽\nBye! 🏳️‍🌈')); - }); - }); - group('Section', () { - test('Map', () { - final String output = parse('{{#section}}_{{var}}_{{/section}}') - .renderString(>{ - 'section': {'var': 'bob'}, - }); - expect(output, equals('_bob_')); - }); - test('List', () { - final String output = parse('{{#section}}_{{var}}_{{/section}}') - .renderString(>>{ - 'section': >[ - {'var': 'bob'}, - {'var': 'jim'}, - ], - }); - expect(output, equals('_bob__jim_')); - }); - test('Empty List', () { - final String output = parse( - '{{#section}}_{{var}}_{{/section}}', - ).renderString(>{'section': []}); - expect(output, equals('')); - }); - test('False', () { - final String output = parse( - '{{#section}}_{{var}}_{{/section}}', - ).renderString({'section': false}); - expect(output, equals('')); - }); - test('Invalid value', () { - final Exception? ex = renderFail( - '{{#section}}_{{var}}_{{/section}}', - {'section': 42}, - ); - if (ex is TemplateException) { - expect(ex.message, startsWith(VALUE_MISSING)); - } else { - fail('Unexpected type: $ex'); - } - }); - test('Invalid value - lenient mode', () { - final String output = parse( - '{{#var}}_{{var}}_{{/var}}', - lenient: true, - ).renderString({'var': 42}); - expect(output, equals('_42_')); - }); - - test('True', () { - final String output = parse( - '{{#section}}_ok_{{/section}}', - ).renderString({'section': true}); - expect(output, equals('_ok_')); - }); - - test('Nested', () { - final String output = - parse( - '{{#section}}.{{var}}.{{#nested}}_{{nestedvar}}_{{/nested}}.{{/section}}', - ).renderString(>{ - 'section': { - 'var': 'bob', - 'nested': >[ - {'nestedvar': 'jim'}, - {'nestedvar': 'sally'}, - ], - }, - }); - expect(output, equals('.bob._jim__sally_.')); - }); - - test('Whitespace in section tags', () { - expect( - parse('{{#foo.bar}}oi{{/foo.bar}}').renderString( - >{ - 'foo': {'bar': true}, - }, - ), - equals('oi'), - ); - expect( - parse('{{# foo.bar}}oi{{/foo.bar}}').renderString( - >{ - 'foo': {'bar': true}, - }, - ), - equals('oi'), - ); - expect( - parse('{{#foo.bar }}oi{{/foo.bar}}').renderString( - >{ - 'foo': {'bar': true}, - }, - ), - equals('oi'), - ); - expect( - parse('{{# foo.bar }}oi{{/foo.bar}}').renderString( - >{ - 'foo': {'bar': true}, - }, - ), - equals('oi'), - ); - expect( - parse('{{#foo.bar}}oi{{/ foo.bar}}').renderString( - >{ - 'foo': {'bar': true}, - }, - ), - equals('oi'), - ); - expect( - parse('{{#foo.bar}}oi{{/foo.bar }}').renderString( - >{ - 'foo': {'bar': true}, - }, - ), - equals('oi'), - ); - expect( - parse('{{#foo.bar}}oi{{/ foo.bar }}').renderString( - >{ - 'foo': {'bar': true}, - }, - ), - equals('oi'), - ); - expect( - parse('{{# foo.bar }}oi{{/ foo.bar }}').renderString( - >{ - 'foo': {'bar': true}, - }, - ), - equals('oi'), - ); - }); - - test('Whitespace in variable tags', () { - expect( - parse('{{foo.bar}}').renderString(>{ - 'foo': {'bar': true}, - }), - equals('true'), - ); - expect( - parse('{{ foo.bar}}').renderString(>{ - 'foo': {'bar': true}, - }), - equals('true'), - ); - expect( - parse('{{foo.bar }}').renderString(>{ - 'foo': {'bar': true}, - }), - equals('true'), - ); - expect( - parse('{{ foo.bar }}').renderString(>{ - 'foo': {'bar': true}, - }), - equals('true'), - ); - }); - - test('Odd whitespace in tags', () { - void render(String source, dynamic values, dynamic output) => expect( - parse(source, lenient: true).renderString(values), - equals(output), - ); - - render('{{\t# foo}}oi{{\n/foo}}', {'foo': true}, 'oi'); - - render( - '{{ # # foo }} {{ oi }} {{ / # foo }}', - >>{ - '# foo': >[ - {'oi': 'OI!'}, - ], - }, - ' OI! ', - ); - - render( - '{{ #foo }} {{ oi }} {{ /foo }}', - >>{ - 'foo': >[ - {'oi': 'OI!'}, - ], - }, - ' OI! ', - ); - - render( - '{{\t#foo }} {{ oi }} {{ /foo }}', - >>{ - 'foo': >[ - {'oi': 'OI!'}, - ], - }, - ' OI! ', - ); - - render('{{{ #foo }}} {{{ /foo }}}', { - '#foo': 1, - '/foo': 2, - }, '1 2'); - - // Invalid - I'm ok with that for now. - // render( - // "{{{ { }}}", - // {'{': 1}, - // '1'); - - render('{{\nfoo}}', {'foo': 'bar'}, 'bar'); - - render('{{\tfoo}}', {'foo': 'bar'}, 'bar'); - - render('{{\t# foo}}oi{{\n/foo}}', {'foo': true}, 'oi'); - - render('{{{\tfoo\t}}}', {'foo': true}, 'true'); - - // TODO(stuartmorgan): Fix and enable this test, which was commented out - // when the source was first imported. - // empty, or error in strict mode. - // render( - // "{{ > }}", - // {'>': 'oi'}, - // ''); - }); - - test('Empty source', () { - final t = Template(''); - expect(t.renderString({}), equals('')); - }); - - test('Template name', () { - final t = Template('', name: 'foo'); - expect(t.name, equals('foo')); - }); - - test('Bad tag', () { - expect(() => Template('{{{ foo }|'), throwsException); - }); - }); - - group('Inverse Section', () { - test('Map', () { - final String output = parse('{{^section}}_{{var}}_{{/section}}') - .renderString(>{ - 'section': {'var': 'bob'}, - }); - expect(output, equals('')); - }); - test('List', () { - final String output = parse('{{^section}}_{{var}}_{{/section}}') - .renderString(>>{ - 'section': >[ - {'var': 'bob'}, - {'var': 'jim'}, - ], - }); - expect(output, equals('')); - }); - test('Empty List', () { - final String output = parse( - '{{^section}}_ok_{{/section}}', - ).renderString(>{'section': []}); - expect(output, equals('_ok_')); - }); - test('False', () { - final String output = parse( - '{{^section}}_ok_{{/section}}', - ).renderString({'section': false}); - expect(output, equals('_ok_')); - }); - test('Invalid value', () { - final Exception? ex = renderFail( - '{{^section}}_{{var}}_{{/section}}', - {'section': 42}, - ); - expect(ex is TemplateException, isTrue); - expect( - (ex! as TemplateException).message, - startsWith(BAD_VALUE_INV_SECTION), - ); - }); - test('Invalid value - lenient mode', () { - final String output = parse( - '{{^var}}_ok_{{/var}}', - lenient: true, - ).renderString({'var': 42}); - expect(output, equals('')); - }); - test('True', () { - final String output = parse( - '{{^section}}_ok_{{/section}}', - ).renderString({'section': true}); - expect(output, equals('')); - }); - }); - - group('Html escape', () { - test('Escape at start', () { - final String output = parse( - '_{{var}}_', - ).renderString({'var': '&.'}); - expect(output, equals('_&._')); - }); - - test('Escape at end', () { - final String output = parse( - '_{{var}}_', - ).renderString({'var': '.&'}); - expect(output, equals('_.&_')); - }); - - test('&', () { - final String output = parse( - '_{{var}}_', - ).renderString({'var': '&'}); - expect(output, equals('_&_')); - }); - - test('<', () { - final String output = parse( - '_{{var}}_', - ).renderString({'var': '<'}); - expect(output, equals('_<_')); - }); - - test('>', () { - final String output = parse( - '_{{var}}_', - ).renderString({'var': '>'}); - expect(output, equals('_>_')); - }); - - test('"', () { - final String output = parse( - '_{{var}}_', - ).renderString({'var': '"'}); - expect(output, equals('_"_')); - }); - - test("'", () { - final String output = parse( - '_{{var}}_', - ).renderString({'var': "'"}); - expect(output, equals('_'_')); - }); - - test('/', () { - final String output = parse( - '_{{var}}_', - ).renderString({'var': '/'}); - expect(output, equals('_/_')); - }); - }); - - group('Invalid format', () { - test('Mismatched tag', () { - const source = '{{#section}}_{{var}}_{{/notsection}}'; - final Exception? ex = renderFail(source, >{ - 'section': {'var': 'bob'}, - }); - expectFail(ex, 1, 22, 'Mismatched tag'); - }); - - test('Unexpected EOF', () { - const source = '{{#section}}_{{var}}_{{/section'; - final Exception? ex = renderFail(source, >{ - 'section': {'var': 'bob'}, - }); - expectFail(ex, 1, 31, UNEXPECTED_EOF); - }); - - test('Bad tag name, open section', () { - const source = r'{{#section$%$^%}}_{{var}}_{{/section}}'; - final Exception? ex = renderFail(source, >{ - 'section': {'var': 'bob'}, - }); - expectFail(ex, null, null, BAD_TAG_NAME); - }); - - test('Bad tag name, close section', () { - const source = r'{{#section}}_{{var}}_{{/section$%$^%}}'; - final Exception? ex = renderFail(source, >{ - 'section': {'var': 'bob'}, - }); - expectFail(ex, null, null, BAD_TAG_NAME); - }); - - test('Bad tag name, variable', () { - const source = r'{{#section}}_{{var$%$^%}}_{{/section}}'; - final Exception? ex = renderFail(source, >{ - 'section': {'var': 'bob'}, - }); - expectFail(ex, null, null, BAD_TAG_NAME); - }); - - test('Missing variable', () { - const source = r'{{#section}}_{{var}}_{{/section}}'; - final Exception? ex = renderFail(source, >{ - 'section': {}, - }); - expectFail(ex, null, null, VALUE_MISSING); - }); - - // Null variables shouldn't be a problem. - test('Null variable', () { - final t = Template('{{#section}}_{{var}}_{{/section}}'); - final String output = t.renderString(>{ - 'section': {'var': null}, - }); - expect(output, equals('__')); - }); - - test('Unclosed section', () { - const source = r'{{#section}}foo'; - final Exception? ex = renderFail(source, >{ - 'section': {}, - }); - expectFail(ex, null, null, UNCLOSED_TAG); - }); - }); - - group('Lenient', () { - test('Odd section name', () { - final String output = - parse( - r'{{#section$%$^%}}_{{var}}_{{/section$%$^%}}', - lenient: true, - ).renderString(>{ - r'section$%$^%': {'var': 'bob'}, - }); - expect(output, equals('_bob_')); - }); - - test('Odd variable name', () { - final String output = - parse( - r'{{#section}}_{{var$%$^%}}_{{/section}}', - lenient: true, - ).renderString(>{ - 'section': {r'var$%$^%': 'bob'}, - }); - expect(output, equals('_bob_')); - }); - - test('Null variable', () { - final String output = - parse( - r'{{#section}}_{{var}}_{{/section}}', - lenient: true, - ).renderString(>{ - 'section': {'var': null}, - }); - expect(output, equals('__')); - }); - - test('Null section', () { - final String output = parse( - '{{#section}}_{{var}}_{{/section}}', - lenient: true, - ).renderString({'section': null}); - expect(output, equals('')); - }); - - // Known failure - // test('Null inverse section', () { - // var output = parse('{{^section}}_{{var}}_{{/section}}', lenient: true) - // .renderString({"section": null}, lenient: true); - // expect(output, equals('')); - // }); - }); - - group('Escape tags', () { - test('{{{ ... }}}', () { - final String output = parse( - '{{{blah}}}', - ).renderString({'blah': '&'}); - expect(output, equals('&')); - }); - test('{{& ... }}', () { - final String output = parse( - '{{{blah}}}', - ).renderString({'blah': '&'}); - expect(output, equals('&')); - }); - }); - - group('Partial tag', () { - String partialTest( - Map values, - Map sources, - String renderTemplate, { - bool lenient = false, - }) { - final templates = {}; - Template? resolver(String name) => templates[name]; - for (final String k in sources.keys) { - templates[k] = Template( - sources[k]! as String, - name: k, - lenient: lenient, - partialResolver: resolver, - ); - } - final Template? t = resolver(renderTemplate); - return t!.renderString(values); - } - - test('basic', () { - final String output = partialTest( - {'foo': 'bar'}, - {'root': '{{>partial}}', 'partial': '{{foo}}'}, - 'root', - ); - expect(output, 'bar'); - }); - - test('missing partial strict', () { - var threw = false; - try { - partialTest( - {'foo': 'bar'}, - {'root': '{{>partial}}'}, - 'root', - ); - } on Exception catch (e) { - expect(e is TemplateException, isTrue); - threw = true; - } - expect(threw, isTrue); - }); - - test('missing partial lenient', () { - final String output = partialTest( - {'foo': 'bar'}, - {'root': '{{>partial}}'}, - 'root', - lenient: true, - ); - expect(output, equals('')); - }); - - test('context', () { - final String output = partialTest( - {'text': 'content'}, - {'root': '"{{>partial}}"', 'partial': '*{{text}}*'}, - 'root', - lenient: true, - ); - expect(output, equals('"*content*"')); - }); - - test('recursion', () { - final String output = partialTest( - { - 'content': 'X', - 'nodes': >[ - {'content': 'Y', 'nodes': []}, - ], - }, - { - 'root': '{{>node}}', - 'node': '{{content}}<{{#nodes}}{{>node}}{{/nodes}}>', - }, - 'root', - lenient: true, - ); - expect(output, equals('X>')); - }); - - test('standalone without previous', () { - final String output = partialTest( - {}, - {'root': ' {{>partial}}\n>', 'partial': '>\n>'}, - 'root', - lenient: true, - ); - expect(output, equals(' >\n >>')); - }); - - test('standalone indentation', () { - final String output = partialTest( - {'content': '<\n->'}, - { - 'root': '\\\n {{>partial}}\n/\n', - 'partial': '|\n{{{content}}}\n|\n', - }, - 'root', - lenient: true, - ); - expect(output, equals('\\\n |\n <\n->\n |\n/\n')); - }); - }); - - group('Lambdas', () { - void lambdaTest({ - required String template, - dynamic lambda, - dynamic output, - }) => expect( - parse(template).renderString({'lambda': lambda}), - equals(output), - ); - - test('basic', () { - lambdaTest( - template: 'Hello, {{lambda}}!', - lambda: (_) => 'world', - output: 'Hello, world!', - ); - }); - - test('escaping', () { - lambdaTest( - template: '<{{lambda}}{{{lambda}}}', - lambda: (_) => '>', - output: '<>>', - ); - }); - - test('sections', () { - lambdaTest( - template: '{{#lambda}}FILE{{/lambda}} != {{#lambda}}LINE{{/lambda}}', - lambda: (LambdaContext ctx) => '__${ctx.renderString()}__', - output: '__FILE__ != __LINE__', - ); - }); - - // TODO(stuartmorgan): Fix and re-enable this test, which was skipped when - // the package was first imported. - test('inverted sections truthy', () { - const template = '<{{^lambda}}{{static}}{{/lambda}}>'; - final values = { - 'lambda': (_) => false, - 'static': 'static', - }; - const output = '<>'; - expect(parse(template).renderString(values), equals(output)); - }, skip: 'skip test'); - - test("seth's use case", () { - const template = '<{{#markdown}}{{content}}{{/markdown}}>'; - final values = { - 'markdown': (LambdaContext ctx) => ctx.renderString().toLowerCase(), - 'content': 'OI YOU!', - }; - const output = ''; - expect(parse(template).renderString(values), equals(output)); - }); - - test('Lambda v2', () { - const template = '<{{#markdown}}{{content}}{{/markdown}}>'; - final values = { - 'markdown': (LambdaContext ctx) => ctx.source, - 'content': 'OI YOU!', - }; - const output = '<{{content}}>'; - expect(parse(template).renderString(values), equals(output)); - }); - - test('Lambda v2...', () { - const template = '<{{#markdown}}dsfsf dsfsdf dfsdfsd{{/markdown}}>'; - final values = { - // ignore: avoid_dynamic_calls - 'markdown': (dynamic ctx) => ctx.source, - }; - const output = ''; - expect(parse(template).renderString(values), equals(output)); - }); - - test('Alternate Delimiters', () { - // A lambda's return value should parse with the default delimiters. - - const template = '{{= | | =}}\nHello, (|&lambda|)!'; - - //function() { return "|planet| => {{planet}}" } - final values = { - 'planet': 'world', - 'lambda': (LambdaContext ctx) => - ctx.renderSource('|planet| => {{planet}}'), - }; - - const output = 'Hello, (|planet| => world)!'; - - expect(parse(template).renderString(values), equals(output)); - }); - - test('Alternate Delimiters 2', () { - // Lambdas used for sections should parse with the current delimiters. - - const template = '{{= | | =}}<|#lambda|-|/lambda|>'; - - //function() { return "|planet| => {{planet}}" } - final values = { - 'planet': 'Earth', - 'lambda': (LambdaContext ctx) { - final String txt = ctx.source; - return ctx.renderSource('$txt{{planet}} => |planet|$txt'); - }, - }; - - const output = '<-{{planet}} => Earth->'; - - expect(parse(template).renderString(values), equals(output)); - }); - - test('LambdaContext.lookup', () { - final t = Template('{{ foo }}'); - final String s = t.renderString({ - 'foo': (LambdaContext lc) => lc.lookup('bar'), - 'bar': 'jim', - }); - expect(s, equals('jim')); - }); - - test('LambdaContext.lookup closed', () { - final t = Template('{{ foo }}'); - LambdaContext? lc2; - t.renderString({ - 'foo': (LambdaContext lc) => lc2 = lc, - 'bar': 'jim', - }); - expect(lc2, isNotNull); - expect(() => lc2?.lookup('foo'), throwsException); - }); - }); - - group('Other', () { - test('Standalone line', () { - final String val = parse( - '|\n{{#bob}}\n{{/bob}}\n|', - ).renderString(>{'bob': []}); - expect(val, equals('|\n|')); - }); - }); - - group('Array indexing', () { - test('Basic', () { - final String val = parse('{{array.1}}').renderString(>{ - 'array': [1, 2, 3], - }); - expect(val, equals('2')); - }); - test('RangeError', () { - final Exception? error = renderFail('{{array.5}}', >{ - 'array': [1, 2, 3], - }); - expect(error, isA()); - }); - }); - - group('Delimiters', () { - test('Basic', () { - final String val = parse( - '{{=<% %>=}}(<%text%>)', - ).renderString({'text': 'Hey!'}); - expect(val, equals('(Hey!)')); - }); - - test('Single delimiters', () { - final String val = parse( - '({{=[ ]=}}[text])', - ).renderString({'text': 'It worked!'}); - expect(val, equals('(It worked!)')); - }); - }); - - group('Template with custom delimiters', () { - test('Basic', () { - final t = Template('(<%text%>)', delimiters: '<% %>'); - final String val = t.renderString({'text': 'Hey!'}); - expect(val, equals('(Hey!)')); - }); - }); - - group('Lambda context', () { - test('LambdaContext write', () { - const template = '<{{#markdown}}{{content}}{{/markdown}}>'; - final values = { - 'markdown': (LambdaContext ctx) { - ctx.write('foo'); - }, - }; - const output = ''; - expect(parse(template).renderString(values), equals(output)); - }); - - test('LambdaContext render', () { - const template = '<{{#markdown}}{{content}}{{/markdown}}>'; - final values = { - 'content': 'bar', - 'markdown': (LambdaContext ctx) { - ctx.render(); - }, - }; - const output = ''; - expect(parse(template).renderString(values), equals(output)); - }); - - test('LambdaContext render with value', () { - const template = '<{{#markdown}}{{content}}{{/markdown}}>'; - final values = { - 'markdown': (LambdaContext ctx) { - ctx.render(value: {'content': 'oi!'}); - }, - }; - const output = ''; - expect(parse(template).renderString(values), equals(output)); - }); - - test('LambdaContext renderString with value', () { - const template = '<{{#markdown}}{{content}}{{/markdown}}>'; - final values = { - 'markdown': (LambdaContext ctx) { - return ctx.renderString(value: {'content': 'oi!'}); - }, - }; - const output = ''; - expect(parse(template).renderString(values), equals(output)); - }); - - test('LambdaContext write and return', () { - const template = '<{{#markdown}}{{content}}{{/markdown}}>'; - final values = { - 'markdown': (LambdaContext ctx) { - ctx.write('foo'); - return 'bar'; - }, - }; - const output = ''; - expect(parse(template).renderString(values), equals(output)); - }); - - test('LambdaContext renderSource with value', () { - const template = '<{{#markdown}}{{content}}{{/markdown}}>'; - final values = { - 'markdown': (LambdaContext ctx) { - return ctx.renderSource( - ctx.source, - value: {'content': 'oi!'}, - ); - }, - }; - const output = ''; - expect(parse(template).renderString(values), equals(output)); - }); - - test('LambdaContext renderString on non-section throws', () { - final t = Template('{{ foo }}'); - expect( - () => t.renderString({ - 'foo': (LambdaContext lc) => lc.renderString(), - }), - throwsA(isA()), - ); - }); - - test('LambdaContext render on non-section throws', () { - final t = Template('{{ foo }}'); - expect( - () => t.renderString({ - 'foo': (LambdaContext lc) { - lc.render(); - return ''; - }, - }), - throwsA(isA()), - ); - }); - }); -} - -Exception? renderFail(String source, Object values) { - try { - parse(source).renderString(values); - return null; - } on Exception catch (e) { - return e; - } -} - -void expectFail( - Exception? ex, - int? line, - int? column, [ - String? msgStartsWith, -]) { - if (ex is! TemplateException) { - fail('Unexpected type: $ex'); - } - if (line != null) { - expect(ex.line, equals(line)); - } - if (column != null) { - expect(ex.column, equals(column)); - } - if (msgStartsWith != null) { - expect(ex.message, startsWith(msgStartsWith)); - } + specs.defineTests(unsupportedSpecs); } diff --git a/third_party/packages/mustache_template/test/parser_test.dart b/third_party/packages/mustache_template/test/parser_test.dart index c3f8427..1c095bc 100644 --- a/third_party/packages/mustache_template/test/parser_test.dart +++ b/third_party/packages/mustache_template/test/parser_test.dart @@ -281,14 +281,7 @@ void main() { test('corner case strict', () { const source = '{{{ #foo }}} {{{ /foo }}}'; final parser = Parser(source, 'foo', '{{ }}'); - try { - parser.parse(); - // TODO(stuartmorgan): Restructure test to use throwsA. - // ignore: use_test_throws_matchers - fail('Should fail.'); - } on Exception catch (e) { - expect(e is TemplateException, isTrue); - } + expect(() => parser.parse(), throwsA(isA())); }); test('corner case lenient', () { @@ -327,25 +320,16 @@ void main() { ex.toString(); }); - Exception parseFail(String source) { - try { + void Function() parseFail(String source) { + return () { final parser = Parser(source, 'foo', '{{ }}'); parser.parse(); - // TODO(stuartmorgan): Restructure test to use throwsA. - // ignore: use_test_throws_matchers - fail('Did not throw.'); - } on Exception catch (ex, st) { - if (ex is! TemplateException) { - print(ex); - print(st); - } - return ex; - } + }; } test('parse eof', () { - void expectTemplateEx(Exception ex) => - expect(ex is TemplateException, isTrue); + void expectTemplateEx(void Function() shouldThrow) => + expect(shouldThrow, throwsA(isA())); expectTemplateEx(parseFail('{{#foo}}{{bar}}{{/foo}')); expectTemplateEx(parseFail('{{#foo}}{{bar}}{{/foo')); diff --git a/third_party/packages/mustache_template/test/specs/comments.dart b/third_party/packages/mustache_template/test/specs/comments.dart new file mode 100644 index 0000000..9dd41f6 --- /dev/null +++ b/third_party/packages/mustache_template/test/specs/comments.dart @@ -0,0 +1,109 @@ +// Generated from comments.json@97c05b0652f06ef4cbe12016b8d0e41df31c4b05 at 2026-03-09T19:49:45Z +const String COMMENTS = r''' +{ + "__ATTN__": "Do not edit this file; changes belong in the appropriate YAML file.", + "overview": "Comment tags represent content that should never appear in the resulting\noutput.\n\nThe tag's content may contain any substring (including newlines) EXCEPT the\nclosing delimiter.\n\nComment tags SHOULD be treated as standalone when appropriate.\n", + "tests": [ + { + "name": "Inline", + "desc": "Comment blocks should be removed from the template.", + "data": { + }, + "template": "12345{{! Comment Block! }}67890", + "expected": "1234567890" + }, + { + "name": "Multiline", + "desc": "Multiline comments should be permitted.", + "data": { + }, + "template": "12345{{!\n This is a\n multi-line comment...\n}}67890\n", + "expected": "1234567890\n" + }, + { + "name": "Standalone", + "desc": "All standalone comment lines should be removed.", + "data": { + }, + "template": "Begin.\n{{! Comment Block! }}\nEnd.\n", + "expected": "Begin.\nEnd.\n" + }, + { + "name": "Indented Standalone", + "desc": "All standalone comment lines should be removed.", + "data": { + }, + "template": "Begin.\n {{! Indented Comment Block! }}\nEnd.\n", + "expected": "Begin.\nEnd.\n" + }, + { + "name": "Standalone Line Endings", + "desc": "\"\\r\\n\" should be considered a newline for standalone tags.", + "data": { + }, + "template": "|\r\n{{! Standalone Comment }}\r\n|", + "expected": "|\r\n|" + }, + { + "name": "Standalone Without Previous Line", + "desc": "Standalone tags should not require a newline to precede them.", + "data": { + }, + "template": " {{! I'm Still Standalone }}\n!", + "expected": "!" + }, + { + "name": "Standalone Without Newline", + "desc": "Standalone tags should not require a newline to follow them.", + "data": { + }, + "template": "!\n {{! I'm Still Standalone }}", + "expected": "!\n" + }, + { + "name": "Multiline Standalone", + "desc": "All standalone comment lines should be removed.", + "data": { + }, + "template": "Begin.\n{{!\nSomething's going on here...\n}}\nEnd.\n", + "expected": "Begin.\nEnd.\n" + }, + { + "name": "Indented Multiline Standalone", + "desc": "All standalone comment lines should be removed.", + "data": { + }, + "template": "Begin.\n {{!\n Something's going on here...\n }}\nEnd.\n", + "expected": "Begin.\nEnd.\n" + }, + { + "name": "Indented Inline", + "desc": "Inline comments should not strip whitespace", + "data": { + }, + "template": " 12 {{! 34 }}\n", + "expected": " 12 \n" + }, + { + "name": "Surrounding Whitespace", + "desc": "Comment removal should preserve surrounding whitespace.", + "data": { + }, + "template": "12345 {{! Comment Block! }} 67890", + "expected": "12345 67890" + }, + { + "name": "Variable Name Collision", + "desc": "Comments must never render, even if variable with same name exists.", + "data": { + "! comment": 1, + "! comment ": 2, + "!comment": 3, + "comment": 4 + }, + "template": "comments never show: >{{! comment }}<", + "expected": "comments never show: ><" + } + ] +} +'''; diff --git a/third_party/packages/mustache_template/test/specs/delimiters.dart b/third_party/packages/mustache_template/test/specs/delimiters.dart new file mode 100644 index 0000000..fe776e9 --- /dev/null +++ b/third_party/packages/mustache_template/test/specs/delimiters.dart @@ -0,0 +1,135 @@ +// Generated from delimiters.json@97c05b0652f06ef4cbe12016b8d0e41df31c4b05 at 2026-03-09T19:49:45Z +const String DELIMITERS = r''' +{ + "__ATTN__": "Do not edit this file; changes belong in the appropriate YAML file.", + "overview": "Set Delimiter tags are used to change the tag delimiters for all content\nfollowing the tag in the current compilation unit.\n\nThe tag's content MUST be any two non-whitespace sequences (separated by\nwhitespace) EXCEPT an equals sign ('=') followed by the current closing\ndelimiter.\n\nSet Delimiter tags SHOULD be treated as standalone when appropriate.\n", + "tests": [ + { + "name": "Pair Behavior", + "desc": "The equals sign (used on both sides) should permit delimiter changes.", + "data": { + "text": "Hey!" + }, + "template": "{{=<% %>=}}(<%text%>)", + "expected": "(Hey!)" + }, + { + "name": "Special Characters", + "desc": "Characters with special meaning regexen should be valid delimiters.", + "data": { + "text": "It worked!" + }, + "template": "({{=[ ]=}}[text])", + "expected": "(It worked!)" + }, + { + "name": "Sections", + "desc": "Delimiters set outside sections should persist.", + "data": { + "section": true, + "data": "I got interpolated." + }, + "template": "[\n{{#section}}\n {{data}}\n |data|\n{{/section}}\n\n{{= | | =}}\n|#section|\n {{data}}\n |data|\n|/section|\n]\n", + "expected": "[\n I got interpolated.\n |data|\n\n {{data}}\n I got interpolated.\n]\n" + }, + { + "name": "Inverted Sections", + "desc": "Delimiters set outside inverted sections should persist.", + "data": { + "section": false, + "data": "I got interpolated." + }, + "template": "[\n{{^section}}\n {{data}}\n |data|\n{{/section}}\n\n{{= | | =}}\n|^section|\n {{data}}\n |data|\n|/section|\n]\n", + "expected": "[\n I got interpolated.\n |data|\n\n {{data}}\n I got interpolated.\n]\n" + }, + { + "name": "Partial Inheritence", + "desc": "Delimiters set in a parent template should not affect a partial.", + "data": { + "value": "yes" + }, + "partials": { + "include": ".{{value}}." + }, + "template": "[ {{>include}} ]\n{{= | | =}}\n[ |>include| ]\n", + "expected": "[ .yes. ]\n[ .yes. ]\n" + }, + { + "name": "Post-Partial Behavior", + "desc": "Delimiters set in a partial should not affect the parent template.", + "data": { + "value": "yes" + }, + "partials": { + "include": ".{{value}}. {{= | | =}} .|value|." + }, + "template": "[ {{>include}} ]\n[ .{{value}}. .|value|. ]\n", + "expected": "[ .yes. .yes. ]\n[ .yes. .|value|. ]\n" + }, + { + "name": "Surrounding Whitespace", + "desc": "Surrounding whitespace should be left untouched.", + "data": { + }, + "template": "| {{=@ @=}} |", + "expected": "| |" + }, + { + "name": "Outlying Whitespace (Inline)", + "desc": "Whitespace should be left untouched.", + "data": { + }, + "template": " | {{=@ @=}}\n", + "expected": " | \n" + }, + { + "name": "Standalone Tag", + "desc": "Standalone lines should be removed from the template.", + "data": { + }, + "template": "Begin.\n{{=@ @=}}\nEnd.\n", + "expected": "Begin.\nEnd.\n" + }, + { + "name": "Indented Standalone Tag", + "desc": "Indented standalone lines should be removed from the template.", + "data": { + }, + "template": "Begin.\n {{=@ @=}}\nEnd.\n", + "expected": "Begin.\nEnd.\n" + }, + { + "name": "Standalone Line Endings", + "desc": "\"\\r\\n\" should be considered a newline for standalone tags.", + "data": { + }, + "template": "|\r\n{{= @ @ =}}\r\n|", + "expected": "|\r\n|" + }, + { + "name": "Standalone Without Previous Line", + "desc": "Standalone tags should not require a newline to precede them.", + "data": { + }, + "template": " {{=@ @=}}\n=", + "expected": "=" + }, + { + "name": "Standalone Without Newline", + "desc": "Standalone tags should not require a newline to follow them.", + "data": { + }, + "template": "=\n {{=@ @=}}", + "expected": "=\n" + }, + { + "name": "Pair with Padding", + "desc": "Superfluous in-tag whitespace should be ignored.", + "data": { + }, + "template": "|{{= @ @ =}}|", + "expected": "||" + } + ] +} +'''; diff --git a/third_party/packages/mustache_template/test/specs/dynamic_names.dart b/third_party/packages/mustache_template/test/specs/dynamic_names.dart new file mode 100644 index 0000000..9365ebb --- /dev/null +++ b/third_party/packages/mustache_template/test/specs/dynamic_names.dart @@ -0,0 +1,319 @@ +// Generated from ~dynamic-names.json@97c05b0652f06ef4cbe12016b8d0e41df31c4b05 at 2026-03-09T19:49:45Z +const String DYNAMIC_NAMES = r''' +{ + "__ATTN__": "Do not edit this file; changes belong in the appropriate YAML file.", + "overview": "Rationale: this special notation was introduced primarily to allow the dynamic\nloading of partials. The main advantage that this notation offers is to allow\ndynamic loading of partials, which is particularly useful in cases where\npolymorphic data needs to be rendered in different ways. Such cases would\notherwise be possible to render only with solutions that are convoluted,\ninefficient, or both.\n\nExample.\nLet's consider the following data:\n\n items: [\n { content: 'Hello, World!' },\n { url: 'http://example.com/foo.jpg' },\n { content: 'Some text' },\n { content: 'Some other text' },\n { url: 'http://example.com/bar.jpg' },\n { url: 'http://example.com/baz.jpg' },\n { content: 'Last text here' }\n ]\n\nThe goal is to render the different types of items in different ways. The\nitems having a key named `content` should be rendered with the template\n`text.mustache`:\n\n {{!text.mustache}}\n {{content}}\n\nAnd the items having a key named `url` should be rendered with the template\n`image.mustache`:\n\n {{!image.mustache}}\n \n\nThere are already several ways to achieve this goal, here below are\nillustrated and discussed the most significant solutions to this problem.\n\nUsing Pre-Processing\n\nThe idea is to use a secondary templating mechanism to dynamically generate\nthe template that will be rendered.\nThe template that our secondary templating mechanism generates might look\nlike this:\n\n {{!template.mustache}}\n {{items.1.content}}\n \n {{items.3.content}}\n {{items.4.content}}\n \n \n {{items.7.content}}\n\nThis solutions offers the advantages of having more control over the template\nand minimizing the template blocks to the essential ones.\nThe drawbacks are the rendering speed and the complexity that the secondary\ntemplating mechanism requires.\n\nUsing Lambdas\n\nThe idea is to inject functions into the data that will be later called from\nthe template.\nThis way the data will look like this:\n\n items: [\n {\n content: 'Hello, World!',\n html: function() { return '{{>text}}'; }\n },\n {\n url: 'http://example.com/foo.jpg',\n html: function() { return '{{>image}}'; }\n },\n {\n content: 'Some text',\n html: function() { return '{{>text}}'; }\n },\n {\n content: 'Some other text',\n html: function() { return '{{>text}}'; }\n },\n {\n url: 'http://example.com/bar.jpg',\n html: function() { return '{{>image}}'; }\n },\n {\n url: 'http://example.com/baz.jpg',\n html: function() { return '{{>image}}'; }\n },\n {\n content: 'Last text here',\n html: function() { return '{{>text}}'; }\n }\n ]\n\nAnd the template will look like this:\n\n {{!template.mustache}}\n {{#items}}\n {{{html}}}\n {{/items}}\n\nThe advantage this solution offers is to have a light main template.\nThe drawback is that the data needs to embed logic and template tags in\nit.\n\nUsing If-Else Blocks\n\nThe idea is to put some logic into the main template so it can select the\ntemplates at rendering time:\n\n {{!template.mustache}}\n {{#items}}\n {{#url}}\n {{>image}}\n {{/url}}\n {{#content}}\n {{>text}}\n {{/content}}\n {{/items}}\n\nThe main advantage of this solution is that it works without adding any\noverhead fields to the data. It also documents which external templates are\nappropriate for expansion in this position.\nThe drawback is that this solution isn't optimal for heterogeneous data sets\nas the main template grows linearly with the number of polymorphic variants.\n\nUsing Dynamic Names\n\nThis is the solution proposed by this spec.\nThe idea is to load partials dynamically.\nThis way the data items have to be tagged with the corresponding partial name:\n\n items: [\n { content: 'Hello, World!', dynamic: 'text' },\n { url: 'http://example.com/foo.jpg', dynamic: 'image' },\n { content: 'Some text', dynamic: 'text' },\n { content: 'Some other text', dynamic: 'text' },\n { url: 'http://example.com/bar.jpg', dynamic: 'image' },\n { url: 'http://example.com/baz.jpg', dynamic: 'image' },\n { content: 'Last text here', dynamic: 'text' }\n ]\n\nAnd the template would simple look like this:\n\n {{!template.mustache}}\n {{#items}}\n {{>*dynamic}}\n {{/items}}\n\nSummary:\n\n +----------------+---------------------+-----------------------------------+\n | Approach | Pros | Cons |\n +----------------+---------------------+-----------------------------------+\n | Pre-Processing | Essential template, | Secondary templating system |\n | | more control | needed, slower rendering |\n | Lambdas | Slim template | Data tagging, logic in data |\n | If Blocks | No data overhead, | Template linear growth |\n | | self-documenting | |\n | Dynamic Names | Slim template | Data tagging |\n +----------------+---------------------+-----------------------------------+\n\nDynamic Names are a special notation to dynamically determine a tag's content.\n\nDynamic Names MUST be a non-whitespace character sequence NOT containing\nthe current closing delimiter. A Dynamic Name consists of an asterisk,\nfollowed by a dotted name. The dotted name follows the same notation as in an\nInterpolation tag.\n\nThis tag's dotted name, which is the Dynamic Name excluding the\nleading asterisk, references a key in the context whose value will be used in\nplace of the Dynamic Name itself as content of the tag. The dotted name\nresolution produces the same value as an Interpolation tag and does not affect\nthe context for further processing.\n\nSet Delimiter tags MUST NOT affect the resolution of a Dynamic Name. The\nDynamic Names MUST be resolved against the context stack local to the tag.\nFailed resolution of the dynamic name SHOULD result in nothing being rendered.\n\nEngines that implement Dynamic Names MUST support their use in Partial tags.\nIn engines that also implement the optional inheritance spec, Dynamic Names\ninside Parent tags SHOULD be supported as well. Dynamic Names cannot be\nresolved more than once (Dynamic Names cannot be nested).\n", + "tests": [ + { + "name": "Basic Behavior - Partial", + "desc": "The asterisk operator is used for dynamic partials.", + "data": { + "dynamic": "content" + }, + "template": "\"{{>*dynamic}}\"", + "partials": { + "content": "Hello, world!" + }, + "expected": "\"Hello, world!\"" + }, + { + "name": "Basic Behavior - Name Resolution", + "desc": "The asterisk is not part of the name that will be resolved in the context.\n", + "data": { + "dynamic": "content", + "*dynamic": "wrong" + }, + "template": "\"{{>*dynamic}}\"", + "partials": { + "content": "Hello, world!", + "wrong": "Invisible" + }, + "expected": "\"Hello, world!\"" + }, + { + "name": "Context Misses - Partial", + "desc": "Failed context lookups should be considered falsey.", + "data": { + }, + "template": "\"{{>*missing}}\"", + "partials": { + "missing": "Hello, world!" + }, + "expected": "\"\"" + }, + { + "name": "Failed Lookup - Partial", + "desc": "The empty string should be used when the named partial is not found.", + "data": { + "dynamic": "content" + }, + "template": "\"{{>*dynamic}}\"", + "partials": { + "foobar": "Hello, world!" + }, + "expected": "\"\"" + }, + { + "name": "Context", + "desc": "The dynamic partial should operate within the current context.", + "data": { + "text": "Hello, world!", + "example": "partial" + }, + "template": "\"{{>*example}}\"", + "partials": { + "partial": "*{{text}}*" + }, + "expected": "\"*Hello, world!*\"" + }, + { + "name": "Dotted Names", + "desc": "The dynamic partial should operate within the current context.", + "data": { + "text": "Hello, world!", + "foo": { + "bar": { + "baz": "partial" + } + } + }, + "template": "\"{{>*foo.bar.baz}}\"", + "partials": { + "partial": "*{{text}}*" + }, + "expected": "\"*Hello, world!*\"" + }, + { + "name": "Dotted Names - Operator Precedence", + "desc": "The dotted name should be resolved entirely before being dereferenced.", + "data": { + "text": "Hello, world!", + "foo": "test", + "test": { + "bar": { + "baz": "partial" + } + } + }, + "template": "\"{{>*foo.bar.baz}}\"", + "partials": { + "partial": "*{{text}}*" + }, + "expected": "\"\"" + }, + { + "name": "Dotted Names - Failed Lookup", + "desc": "The dynamic partial should operate within the current context.", + "data": { + "foo": { + "text": "Hello, world!", + "bar": { + "baz": "partial" + } + } + }, + "template": "\"{{>*foo.bar.baz}}\"", + "partials": { + "partial": "*{{text}}*" + }, + "expected": "\"**\"" + }, + { + "name": "Dotted names - Context Stacking", + "desc": "Dotted names should not push a new frame on the context stack.", + "data": { + "section1": { + "value": "section1" + }, + "section2": { + "dynamic": "partial", + "value": "section2" + } + }, + "template": "{{#section1}}{{>*section2.dynamic}}{{/section1}}", + "partials": { + "partial": "\"{{value}}\"" + }, + "expected": "\"section1\"" + }, + { + "name": "Dotted names - Context Stacking Under Repetition", + "desc": "Dotted names should not push a new frame on the context stack.", + "data": { + "value": "test", + "section1": [ + 1, + 2 + ], + "section2": { + "dynamic": "partial", + "value": "section2" + } + }, + "template": "{{#section1}}{{>*section2.dynamic}}{{/section1}}", + "partials": { + "partial": "{{value}}" + }, + "expected": "testtest" + }, + { + "name": "Dotted names - Context Stacking Failed Lookup", + "desc": "Dotted names should resolve against the proper context stack.", + "data": { + "section1": [ + 1, + 2 + ], + "section2": { + "dynamic": "partial", + "value": "section2" + } + }, + "template": "{{#section1}}{{>*section2.dynamic}}{{/section1}}", + "partials": { + "partial": "\"{{value}}\"" + }, + "expected": "\"\"\"\"" + }, + { + "name": "Recursion", + "desc": "Dynamic partials should properly recurse.", + "data": { + "template": "node", + "content": "X", + "nodes": [ + { + "content": "Y", + "nodes": [ + + ] + } + ] + }, + "template": "{{>*template}}", + "partials": { + "node": "{{content}}<{{#nodes}}{{>*template}}{{/nodes}}>" + }, + "expected": "X>" + }, + { + "name": "Dynamic Names - Double Dereferencing", + "desc": "Dynamic Names can't be dereferenced more than once.", + "data": { + "dynamic": "test", + "test": "content" + }, + "template": "\"{{>**dynamic}}\"", + "partials": { + "content": "Hello, world!" + }, + "expected": "\"\"" + }, + { + "name": "Dynamic Names - Composed Dereferencing", + "desc": "Dotted Names are resolved entirely before dereferencing begins.", + "data": { + "foo": "fizz", + "bar": "buzz", + "fizz": { + "buzz": { + "content": null + } + } + }, + "template": "\"{{>*foo.*bar}}\"", + "partials": { + "content": "Hello, world!" + }, + "expected": "\"\"" + }, + { + "name": "Surrounding Whitespace", + "desc": "A dynamic partial should not alter surrounding whitespace; any\nwhitespace preceding the tag should be treated as indentation while any\nwhitespace succeding the tag should be left untouched.\n", + "data": { + "partial": "foobar" + }, + "template": "| {{>*partial}} |", + "partials": { + "foobar": "\t|\t" + }, + "expected": "| \t|\t |" + }, + { + "name": "Inline Indentation", + "desc": "Whitespace should be left untouched: whitespaces preceding the tag\nshould be treated as indentation.\n", + "data": { + "dynamic": "partial", + "data": "|" + }, + "template": " {{data}} {{>*dynamic}}\n", + "partials": { + "partial": ">\n>" + }, + "expected": " | >\n>\n" + }, + { + "name": "Standalone Line Endings", + "desc": "\"\\r\\n\" should be considered a newline for standalone tags.", + "data": { + "dynamic": "partial" + }, + "template": "|\r\n{{>*dynamic}}\r\n|", + "partials": { + "partial": ">" + }, + "expected": "|\r\n>|" + }, + { + "name": "Standalone Without Previous Line", + "desc": "Standalone tags should not require a newline to precede them.", + "data": { + "dynamic": "partial" + }, + "template": " {{>*dynamic}}\n>", + "partials": { + "partial": ">\n>" + }, + "expected": " >\n >>" + }, + { + "name": "Standalone Without Newline", + "desc": "Standalone tags should not require a newline to follow them.", + "data": { + "dynamic": "partial" + }, + "template": ">\n {{>*dynamic}}", + "partials": { + "partial": ">\n>" + }, + "expected": ">\n >\n >" + }, + { + "name": "Standalone Indentation", + "desc": "Each line of the partial should be indented before rendering.", + "data": { + "dynamic": "partial", + "content": "<\n->" + }, + "template": "\\\n {{>*dynamic}}\n/\n", + "partials": { + "partial": "|\n{{{content}}}\n|\n" + }, + "expected": "\\\n |\n <\n->\n |\n/\n" + }, + { + "name": "Padding Whitespace", + "desc": "Superfluous in-tag whitespace should be ignored.", + "data": { + "dynamic": "partial", + "boolean": true + }, + "template": "|{{> * dynamic }}|", + "partials": { + "partial": "[]" + }, + "expected": "|[]|" + } + ] +} +'''; diff --git a/third_party/packages/mustache_template/test/specs/inheritance.dart b/third_party/packages/mustache_template/test/specs/inheritance.dart new file mode 100644 index 0000000..eb9e8fa --- /dev/null +++ b/third_party/packages/mustache_template/test/specs/inheritance.dart @@ -0,0 +1,309 @@ +// Generated from ~inheritance.json@97c05b0652f06ef4cbe12016b8d0e41df31c4b05 at 2026-03-09T19:49:45Z +const String INHERITANCE = r''' +{ + "__ATTN__": "Do not edit this file; changes belong in the appropriate YAML file.", + "overview": "Like partials, Parent tags are used to expand an external template into the\ncurrent template. Unlike partials, Parent tags may contain optional\narguments delimited by Block tags. For this reason, Parent tags may also be\nreferred to as Parametric Partials.\n\nThe Parent tags' content MUST be a non-whitespace character sequence NOT\ncontaining the current closing delimiter; each Parent tag MUST be followed by\nan End Section tag with the same content within the matching Parent tag.\n\nThis tag's content names the Parent template to inject. Set Delimiter tags\nPreceding a Parent tag MUST NOT affect the parsing of the injected external\ntemplate. The Parent MUST be rendered against the context stack local to the\ntag. If the named Parent cannot be found, the empty string SHOULD be used\ninstead, as in interpolations.\n\nParent tags SHOULD be treated as standalone when appropriate. If this tag is\nused standalone, any whitespace preceding the tag should be treated as\nindentation, and prepended to each line of the Parent before rendering.\n\nThe Block tags' content MUST be a non-whitespace character sequence NOT\ncontaining the current closing delimiter. Each Block tag MUST be followed by\nan End Section tag with the same content within the matching Block tag. This\ntag's content determines the parameter or argument name.\n\nBlock tags may appear both inside and outside of Parent tags. In both cases,\nthey specify a position within the template that can be overridden; it is a\nparameter of the containing template. The template text between the Block tag\nand its matching End Section tag defines the default content to render when\nthe parameter is not overridden from outside.\n\nIn addition, when used inside of a Parent tag, the template text between a\nBlock tag and its matching End Section tag defines content that replaces the\ndefault defined in the Parent template. This content is the argument passed\nto the Parent template.\n\nThe practice of injecting an external template using a Parent tag is referred\nto as inheritance. If the Parent tag includes a Block tag that overrides a\nparameter of the Parent template, this may also be referred to as\nsubstitution.\n\nParent templates are taken from the same namespace as regular Partial\ntemplates and in fact, injecting a regular Partial is exactly equivalent to\ninjecting a Parent without making any substitutions. Parameter and arguments\nnames live in a namespace that is distinct from both Partials and the context.\n", + "tests": [ + { + "name": "Default", + "desc": "Default content should be rendered if the block isn't overridden", + "data": { + }, + "template": "{{$title}}Default title{{/title}}\n", + "expected": "Default title\n" + }, + { + "name": "Variable", + "desc": "Default content renders variables", + "data": { + "bar": "baz" + }, + "template": "{{$foo}}default {{bar}} content{{/foo}}\n", + "expected": "default baz content\n" + }, + { + "name": "Triple Mustache", + "desc": "Default content renders triple mustache variables", + "data": { + "bar": "" + }, + "template": "{{$foo}}default {{{bar}}} content{{/foo}}\n", + "expected": "default content\n" + }, + { + "name": "Sections", + "desc": "Default content renders sections", + "data": { + "bar": { + "baz": "qux" + } + }, + "template": "{{$foo}}default {{#bar}}{{baz}}{{/bar}} content{{/foo}}\n", + "expected": "default qux content\n" + }, + { + "name": "Negative Sections", + "desc": "Default content renders negative sections", + "data": { + "baz": "three" + }, + "template": "{{$foo}}default {{^bar}}{{baz}}{{/bar}} content{{/foo}}\n", + "expected": "default three content\n" + }, + { + "name": "Mustache Injection", + "desc": "Mustache injection in default content", + "data": { + "bar": { + "baz": "{{qux}}" + } + }, + "template": "{{$foo}}default {{#bar}}{{baz}}{{/bar}} content{{/foo}}\n", + "expected": "default {{qux}} content\n" + }, + { + "name": "Inherit", + "desc": "Default content rendered inside inherited templates", + "data": { + }, + "template": "{{parent}}|{{" + }, + "template": "These characters should be HTML escaped: {{forbidden}}\n", + "expected": "These characters should be HTML escaped: & " < >\n" + }, + { + "name": "Triple Mustache", + "desc": "Triple mustaches should interpolate without HTML escaping.", + "data": { + "forbidden": "& \" < >" + }, + "template": "These characters should not be HTML escaped: {{{forbidden}}}\n", + "expected": "These characters should not be HTML escaped: & \" < >\n" + }, + { + "name": "Ampersand", + "desc": "Ampersand should interpolate without HTML escaping.", + "data": { + "forbidden": "& \" < >" + }, + "template": "These characters should not be HTML escaped: {{&forbidden}}\n", + "expected": "These characters should not be HTML escaped: & \" < >\n" + }, + { + "name": "Basic Integer Interpolation", + "desc": "Integers should interpolate seamlessly.", + "data": { + "mph": 85 + }, + "template": "\"{{mph}} miles an hour!\"", + "expected": "\"85 miles an hour!\"" + }, + { + "name": "Triple Mustache Integer Interpolation", + "desc": "Integers should interpolate seamlessly.", + "data": { + "mph": 85 + }, + "template": "\"{{{mph}}} miles an hour!\"", + "expected": "\"85 miles an hour!\"" + }, + { + "name": "Ampersand Integer Interpolation", + "desc": "Integers should interpolate seamlessly.", + "data": { + "mph": 85 + }, + "template": "\"{{&mph}} miles an hour!\"", + "expected": "\"85 miles an hour!\"" + }, + { + "name": "Basic Decimal Interpolation", + "desc": "Decimals should interpolate seamlessly with proper significance.", + "data": { + "power": 1.21 + }, + "template": "\"{{power}} jiggawatts!\"", + "expected": "\"1.21 jiggawatts!\"" + }, + { + "name": "Triple Mustache Decimal Interpolation", + "desc": "Decimals should interpolate seamlessly with proper significance.", + "data": { + "power": 1.21 + }, + "template": "\"{{{power}}} jiggawatts!\"", + "expected": "\"1.21 jiggawatts!\"" + }, + { + "name": "Ampersand Decimal Interpolation", + "desc": "Decimals should interpolate seamlessly with proper significance.", + "data": { + "power": 1.21 + }, + "template": "\"{{&power}} jiggawatts!\"", + "expected": "\"1.21 jiggawatts!\"" + }, + { + "name": "Basic Null Interpolation", + "desc": "Nulls should interpolate as the empty string.", + "data": { + "cannot": null + }, + "template": "I ({{cannot}}) be seen!", + "expected": "I () be seen!" + }, + { + "name": "Triple Mustache Null Interpolation", + "desc": "Nulls should interpolate as the empty string.", + "data": { + "cannot": null + }, + "template": "I ({{{cannot}}}) be seen!", + "expected": "I () be seen!" + }, + { + "name": "Ampersand Null Interpolation", + "desc": "Nulls should interpolate as the empty string.", + "data": { + "cannot": null + }, + "template": "I ({{&cannot}}) be seen!", + "expected": "I () be seen!" + }, + { + "name": "Basic Context Miss Interpolation", + "desc": "Failed context lookups should default to empty strings.", + "data": { + }, + "template": "I ({{cannot}}) be seen!", + "expected": "I () be seen!" + }, + { + "name": "Triple Mustache Context Miss Interpolation", + "desc": "Failed context lookups should default to empty strings.", + "data": { + }, + "template": "I ({{{cannot}}}) be seen!", + "expected": "I () be seen!" + }, + { + "name": "Ampersand Context Miss Interpolation", + "desc": "Failed context lookups should default to empty strings.", + "data": { + }, + "template": "I ({{&cannot}}) be seen!", + "expected": "I () be seen!" + }, + { + "name": "Dotted Names - Basic Interpolation", + "desc": "Dotted names should be considered a form of shorthand for sections.", + "data": { + "person": { + "name": "Joe" + } + }, + "template": "\"{{person.name}}\" == \"{{#person}}{{name}}{{/person}}\"", + "expected": "\"Joe\" == \"Joe\"" + }, + { + "name": "Dotted Names - Triple Mustache Interpolation", + "desc": "Dotted names should be considered a form of shorthand for sections.", + "data": { + "person": { + "name": "Joe" + } + }, + "template": "\"{{{person.name}}}\" == \"{{#person}}{{{name}}}{{/person}}\"", + "expected": "\"Joe\" == \"Joe\"" + }, + { + "name": "Dotted Names - Ampersand Interpolation", + "desc": "Dotted names should be considered a form of shorthand for sections.", + "data": { + "person": { + "name": "Joe" + } + }, + "template": "\"{{&person.name}}\" == \"{{#person}}{{&name}}{{/person}}\"", + "expected": "\"Joe\" == \"Joe\"" + }, + { + "name": "Dotted Names - Arbitrary Depth", + "desc": "Dotted names should be functional to any level of nesting.", + "data": { + "a": { + "b": { + "c": { + "d": { + "e": { + "name": "Phil" + } + } + } + } + } + }, + "template": "\"{{a.b.c.d.e.name}}\" == \"Phil\"", + "expected": "\"Phil\" == \"Phil\"" + }, + { + "name": "Dotted Names - Broken Chains", + "desc": "Any falsey value prior to the last part of the name should yield ''.", + "data": { + "a": { + } + }, + "template": "\"{{a.b.c}}\" == \"\"", + "expected": "\"\" == \"\"" + }, + { + "name": "Dotted Names - Broken Chain Resolution", + "desc": "Each part of a dotted name should resolve only against its parent.", + "data": { + "a": { + "b": { + } + }, + "c": { + "name": "Jim" + } + }, + "template": "\"{{a.b.c.name}}\" == \"\"", + "expected": "\"\" == \"\"" + }, + { + "name": "Dotted Names - Initial Resolution", + "desc": "The first part of a dotted name should resolve as any other name.", + "data": { + "a": { + "b": { + "c": { + "d": { + "e": { + "name": "Phil" + } + } + } + } + }, + "b": { + "c": { + "d": { + "e": { + "name": "Wrong" + } + } + } + } + }, + "template": "\"{{#a}}{{b.c.d.e.name}}{{/a}}\" == \"Phil\"", + "expected": "\"Phil\" == \"Phil\"" + }, + { + "name": "Dotted Names - Context Precedence", + "desc": "Dotted names should be resolved against former resolutions.", + "data": { + "a": { + "b": { + } + }, + "b": { + "c": "ERROR" + } + }, + "template": "{{#a}}{{b.c}}{{/a}}", + "expected": "" + }, + { + "name": "Dotted Names are never single keys", + "desc": "Dotted names shall not be parsed as single, atomic keys", + "data": { + "a.b": "c" + }, + "template": "{{a.b}}", + "expected": "" + }, + { + "name": "Dotted Names - No Masking", + "desc": "Dotted Names in a given context are unvavailable due to dot splitting", + "data": { + "a.b": "c", + "a": { + "b": "d" + } + }, + "template": "{{a.b}}", + "expected": "d" + }, + { + "name": "Implicit Iterators - Basic Interpolation", + "desc": "Unadorned tags should interpolate content into the template.", + "data": "world", + "template": "Hello, {{.}}!\n", + "expected": "Hello, world!\n" + }, + { + "name": "Implicit Iterators - HTML Escaping", + "desc": "Basic interpolation should be HTML escaped.", + "data": "& \" < >", + "template": "These characters should be HTML escaped: {{.}}\n", + "expected": "These characters should be HTML escaped: & " < >\n" + }, + { + "name": "Implicit Iterators - Triple Mustache", + "desc": "Triple mustaches should interpolate without HTML escaping.", + "data": "& \" < >", + "template": "These characters should not be HTML escaped: {{{.}}}\n", + "expected": "These characters should not be HTML escaped: & \" < >\n" + }, + { + "name": "Implicit Iterators - Ampersand", + "desc": "Ampersand should interpolate without HTML escaping.", + "data": "& \" < >", + "template": "These characters should not be HTML escaped: {{&.}}\n", + "expected": "These characters should not be HTML escaped: & \" < >\n" + }, + { + "name": "Implicit Iterators - Basic Integer Interpolation", + "desc": "Integers should interpolate seamlessly.", + "data": 85, + "template": "\"{{.}} miles an hour!\"", + "expected": "\"85 miles an hour!\"" + }, + { + "name": "Interpolation - Surrounding Whitespace", + "desc": "Interpolation should not alter surrounding whitespace.", + "data": { + "string": "---" + }, + "template": "| {{string}} |", + "expected": "| --- |" + }, + { + "name": "Triple Mustache - Surrounding Whitespace", + "desc": "Interpolation should not alter surrounding whitespace.", + "data": { + "string": "---" + }, + "template": "| {{{string}}} |", + "expected": "| --- |" + }, + { + "name": "Ampersand - Surrounding Whitespace", + "desc": "Interpolation should not alter surrounding whitespace.", + "data": { + "string": "---" + }, + "template": "| {{&string}} |", + "expected": "| --- |" + }, + { + "name": "Interpolation - Standalone", + "desc": "Standalone interpolation should not alter surrounding whitespace.", + "data": { + "string": "---" + }, + "template": " {{string}}\n", + "expected": " ---\n" + }, + { + "name": "Triple Mustache - Standalone", + "desc": "Standalone interpolation should not alter surrounding whitespace.", + "data": { + "string": "---" + }, + "template": " {{{string}}}\n", + "expected": " ---\n" + }, + { + "name": "Ampersand - Standalone", + "desc": "Standalone interpolation should not alter surrounding whitespace.", + "data": { + "string": "---" + }, + "template": " {{&string}}\n", + "expected": " ---\n" + }, + { + "name": "Interpolation With Padding", + "desc": "Superfluous in-tag whitespace should be ignored.", + "data": { + "string": "---" + }, + "template": "|{{ string }}|", + "expected": "|---|" + }, + { + "name": "Triple Mustache With Padding", + "desc": "Superfluous in-tag whitespace should be ignored.", + "data": { + "string": "---" + }, + "template": "|{{{ string }}}|", + "expected": "|---|" + }, + { + "name": "Ampersand With Padding", + "desc": "Superfluous in-tag whitespace should be ignored.", + "data": { + "string": "---" + }, + "template": "|{{& string }}|", + "expected": "|---|" + } + ] +} +'''; diff --git a/third_party/packages/mustache_template/test/specs/inverted.dart b/third_party/packages/mustache_template/test/specs/inverted.dart new file mode 100644 index 0000000..2480914 --- /dev/null +++ b/third_party/packages/mustache_template/test/specs/inverted.dart @@ -0,0 +1,230 @@ +// Generated from inverted.json@97c05b0652f06ef4cbe12016b8d0e41df31c4b05 at 2026-03-09T19:49:45Z +const String INVERTED = r''' +{ + "__ATTN__": "Do not edit this file; changes belong in the appropriate YAML file.", + "overview": "Inverted Section tags and End Section tags are used in combination to wrap a\nsection of the template.\n\nThese tags' content MUST be a non-whitespace character sequence NOT\ncontaining the current closing delimiter; each Inverted Section tag MUST be\nfollowed by an End Section tag with the same content within the same\nsection.\n\nThis tag's content names the data to replace the tag. Name resolution is as\nfollows:\n 1) Split the name on periods; the first part is the name to resolve, any\n remaining parts should be retained.\n 2) Walk the context stack from top to bottom, finding the first context\n that is a) a hash containing the name as a key OR b) an object responding\n to a method with the given name.\n 3) If the context is a hash, the data is the value associated with the\n name.\n 4) If the context is an object and the method with the given name has an\n arity of 1, the method SHOULD be called with a String containing the\n unprocessed contents of the sections; the data is the value returned.\n 5) Otherwise, the data is the value returned by calling the method with\n the given name.\n 6) If any name parts were retained in step 1, each should be resolved\n against a context stack containing only the result from the former\n resolution. If any part fails resolution, the result should be considered\n falsey, and should interpolate as the empty string.\nIf the data is not of a list type, it is coerced into a list as follows: if\nthe data is truthy (e.g. `!!data == true`), use a single-element list\ncontaining the data, otherwise use an empty list.\n\nThis section MUST NOT be rendered unless the data list is empty.\n\nInverted Section and End Section tags SHOULD be treated as standalone when\nappropriate.\n", + "tests": [ + { + "name": "Falsey", + "desc": "Falsey sections should have their contents rendered.", + "data": { + "boolean": false + }, + "template": "\"{{^boolean}}This should be rendered.{{/boolean}}\"", + "expected": "\"This should be rendered.\"" + }, + { + "name": "Truthy", + "desc": "Truthy sections should have their contents omitted.", + "data": { + "boolean": true + }, + "template": "\"{{^boolean}}This should not be rendered.{{/boolean}}\"", + "expected": "\"\"" + }, + { + "name": "Null is falsey", + "desc": "Null is falsey.", + "data": { + "null": null + }, + "template": "\"{{^null}}This should be rendered.{{/null}}\"", + "expected": "\"This should be rendered.\"" + }, + { + "name": "Context", + "desc": "Objects and hashes should behave like truthy values.", + "data": { + "context": { + "name": "Joe" + } + }, + "template": "\"{{^context}}Hi {{name}}.{{/context}}\"", + "expected": "\"\"" + }, + { + "name": "List", + "desc": "Lists should behave like truthy values.", + "data": { + "list": [ + { + "n": 1 + }, + { + "n": 2 + }, + { + "n": 3 + } + ] + }, + "template": "\"{{^list}}{{n}}{{/list}}\"", + "expected": "\"\"" + }, + { + "name": "Empty List", + "desc": "Empty lists should behave like falsey values.", + "data": { + "list": [ + + ] + }, + "template": "\"{{^list}}Yay lists!{{/list}}\"", + "expected": "\"Yay lists!\"" + }, + { + "name": "Doubled", + "desc": "Multiple inverted sections per template should be permitted.", + "data": { + "bool": false, + "two": "second" + }, + "template": "{{^bool}}\n* first\n{{/bool}}\n* {{two}}\n{{^bool}}\n* third\n{{/bool}}\n", + "expected": "* first\n* second\n* third\n" + }, + { + "name": "Nested (Falsey)", + "desc": "Nested falsey sections should have their contents rendered.", + "data": { + "bool": false + }, + "template": "| A {{^bool}}B {{^bool}}C{{/bool}} D{{/bool}} E |", + "expected": "| A B C D E |" + }, + { + "name": "Nested (Truthy)", + "desc": "Nested truthy sections should be omitted.", + "data": { + "bool": true + }, + "template": "| A {{^bool}}B {{^bool}}C{{/bool}} D{{/bool}} E |", + "expected": "| A E |" + }, + { + "name": "Context Misses", + "desc": "Failed context lookups should be considered falsey.", + "data": { + }, + "template": "[{{^missing}}Cannot find key 'missing'!{{/missing}}]", + "expected": "[Cannot find key 'missing'!]" + }, + { + "name": "Dotted Names - Truthy", + "desc": "Dotted names should be valid for Inverted Section tags.", + "data": { + "a": { + "b": { + "c": true + } + } + }, + "template": "\"{{^a.b.c}}Not Here{{/a.b.c}}\" == \"\"", + "expected": "\"\" == \"\"" + }, + { + "name": "Dotted Names - Falsey", + "desc": "Dotted names should be valid for Inverted Section tags.", + "data": { + "a": { + "b": { + "c": false + } + } + }, + "template": "\"{{^a.b.c}}Not Here{{/a.b.c}}\" == \"Not Here\"", + "expected": "\"Not Here\" == \"Not Here\"" + }, + { + "name": "Dotted Names - Broken Chains", + "desc": "Dotted names that cannot be resolved should be considered falsey.", + "data": { + "a": { + } + }, + "template": "\"{{^a.b.c}}Not Here{{/a.b.c}}\" == \"Not Here\"", + "expected": "\"Not Here\" == \"Not Here\"" + }, + { + "name": "Surrounding Whitespace", + "desc": "Inverted sections should not alter surrounding whitespace.", + "data": { + "boolean": false + }, + "template": " | {{^boolean}}\t|\t{{/boolean}} | \n", + "expected": " | \t|\t | \n" + }, + { + "name": "Internal Whitespace", + "desc": "Inverted should not alter internal whitespace.", + "data": { + "boolean": false + }, + "template": " | {{^boolean}} {{! Important Whitespace }}\n {{/boolean}} | \n", + "expected": " | \n | \n" + }, + { + "name": "Indented Inline Sections", + "desc": "Single-line sections should not alter surrounding whitespace.", + "data": { + "boolean": false + }, + "template": " {{^boolean}}NO{{/boolean}}\n {{^boolean}}WAY{{/boolean}}\n", + "expected": " NO\n WAY\n" + }, + { + "name": "Standalone Lines", + "desc": "Standalone lines should be removed from the template.", + "data": { + "boolean": false + }, + "template": "| This Is\n{{^boolean}}\n|\n{{/boolean}}\n| A Line\n", + "expected": "| This Is\n|\n| A Line\n" + }, + { + "name": "Standalone Indented Lines", + "desc": "Standalone indented lines should be removed from the template.", + "data": { + "boolean": false + }, + "template": "| This Is\n {{^boolean}}\n|\n {{/boolean}}\n| A Line\n", + "expected": "| This Is\n|\n| A Line\n" + }, + { + "name": "Standalone Line Endings", + "desc": "\"\\r\\n\" should be considered a newline for standalone tags.", + "data": { + "boolean": false + }, + "template": "|\r\n{{^boolean}}\r\n{{/boolean}}\r\n|", + "expected": "|\r\n|" + }, + { + "name": "Standalone Without Previous Line", + "desc": "Standalone tags should not require a newline to precede them.", + "data": { + "boolean": false + }, + "template": " {{^boolean}}\n^{{/boolean}}\n/", + "expected": "^\n/" + }, + { + "name": "Standalone Without Newline", + "desc": "Standalone tags should not require a newline to follow them.", + "data": { + "boolean": false + }, + "template": "^{{^boolean}}\n/\n {{/boolean}}", + "expected": "^\n/\n" + }, + { + "name": "Padding", + "desc": "Superfluous in-tag whitespace should be ignored.", + "data": { + "boolean": false + }, + "template": "|{{^ boolean }}={{/ boolean }}|", + "expected": "|=|" + } + ] +} +'''; diff --git a/third_party/packages/mustache_template/test/specs/lambdas.dart b/third_party/packages/mustache_template/test/specs/lambdas.dart new file mode 100644 index 0000000..319b65c --- /dev/null +++ b/third_party/packages/mustache_template/test/specs/lambdas.dart @@ -0,0 +1,235 @@ +// Generated from ~lambdas.json@97c05b0652f06ef4cbe12016b8d0e41df31c4b05 at 2026-03-09T19:49:45Z +const String LAMBDAS = r''' +{ + "__ATTN__": "Do not edit this file; changes belong in the appropriate YAML file.", + "overview": "Lambdas are a special-cased data type for use in interpolations and\nsections.\n\nWhen used as the data value for an Interpolation tag, the lambda MUST be\ntreatable as an arity 0 function, and invoked as such. The returned value\nMUST be rendered against the default delimiters, then interpolated in place\nof the lambda.\n\nWhen used as the data value for a Section tag, the lambda MUST be treatable\nas an arity 1 function, and invoked as such (passing a String containing the\nunprocessed section contents). The returned value MUST be rendered against\nthe current delimiters, then interpolated in place of the section.\n", + "tests": [ + { + "name": "Interpolation", + "desc": "A lambda's return value should be interpolated.", + "data": { + "lambda": { + "__tag__": "code", + "ruby": "proc { \"world\" }", + "raku": "sub { \"world\" }", + "perl": "sub { \"world\" }", + "js": "function() { return \"world\" }", + "php": "return \"world\";", + "python": "lambda: \"world\"", + "clojure": "(fn [] \"world\")", + "lisp": "(lambda () \"world\")", + "pwsh": "\"world\"", + "go": "func() string { return \"world\" }", + "erlang": "fun() -> \"world\" end." + } + }, + "template": "Hello, {{lambda}}!", + "expected": "Hello, world!" + }, + { + "name": "Interpolation - Expansion", + "desc": "A lambda's return value should be parsed.", + "data": { + "planet": "world", + "lambda": { + "__tag__": "code", + "ruby": "proc { \"{{planet}}\" }", + "raku": "sub { q+{{planet}}+ }", + "perl": "sub { \"{{planet}}\" }", + "js": "function() { return \"{{planet}}\" }", + "php": "return \"{{planet}}\";", + "python": "lambda: \"{{planet}}\"", + "clojure": "(fn [] \"{{planet}}\")", + "lisp": "(lambda () \"{{planet}}\")", + "pwsh": "\"{{planet}}\"", + "go": "func() string { return \"{{planet}}\" }", + "erlang": "fun() -> \"{{planet}}\" end." + } + }, + "template": "Hello, {{lambda}}!", + "expected": "Hello, world!" + }, + { + "name": "Interpolation - Alternate Delimiters", + "desc": "A lambda's return value should parse with the default delimiters.", + "data": { + "planet": "world", + "lambda": { + "__tag__": "code", + "ruby": "proc { \"|planet| => {{planet}}\" }", + "raku": "sub { q+|planet| => {{planet}}+ }", + "perl": "sub { \"|planet| => {{planet}}\" }", + "js": "function() { return \"|planet| => {{planet}}\" }", + "php": "return \"|planet| => {{planet}}\";", + "python": "lambda: \"|planet| => {{planet}}\"", + "clojure": "(fn [] \"|planet| => {{planet}}\")", + "lisp": "(lambda () \"|planet| => {{planet}}\")", + "pwsh": "\"|planet| => {{planet}}\"", + "go": "func() string { return \"|planet| => {{planet}}\" }", + "erlang": "fun() -> \"|planet| => {{planet}}\" end." + } + }, + "template": "{{= | | =}}\nHello, (|&lambda|)!", + "expected": "Hello, (|planet| => world)!" + }, + { + "name": "Interpolation - Multiple Calls", + "desc": "Interpolated lambdas should not be cached.", + "data": { + "lambda": { + "__tag__": "code", + "ruby": "proc { $calls ||= 0; $calls += 1 }", + "raku": "sub { state $calls += 1 }", + "perl": "sub { no strict; $calls += 1 }", + "js": "function() { return (g=(function(){return this})()).calls=(g.calls||0)+1 }", + "php": "global $calls; return ++$calls;", + "python": "lambda: globals().update(calls=globals().get(\"calls\",0)+1) or calls", + "clojure": "(def g (atom 0)) (fn [] (swap! g inc))", + "lisp": "(let ((g 0)) (lambda () (incf g)))", + "pwsh": "if (($null -eq $script:calls) -or ($script:calls -ge 3)){$script:calls=0}; ++$script:calls; $script:calls", + "go": "func() func() int { g := 0; return func() int { g++; return g } }()", + "erlang": "fun() -> G=case get(g) of undefined -> 1; _G -> _G end, put(g, G+1), G end." + } + }, + "template": "{{lambda}} == {{{lambda}}} == {{lambda}}", + "expected": "1 == 2 == 3" + }, + { + "name": "Escaping", + "desc": "Lambda results should be appropriately escaped.", + "data": { + "lambda": { + "__tag__": "code", + "ruby": "proc { \">\" }", + "raku": "sub { \">\" }", + "perl": "sub { \">\" }", + "js": "function() { return \">\" }", + "php": "return \">\";", + "python": "lambda: \">\"", + "clojure": "(fn [] \">\")", + "lisp": "(lambda () \">\")", + "pwsh": "\">\"", + "go": "func() string { return \">\" }", + "erlang": "fun() -> \">\" end." + } + }, + "template": "<{{lambda}}{{{lambda}}}", + "expected": "<>>" + }, + { + "name": "Section", + "desc": "Lambdas used for sections should receive the raw section string.", + "data": { + "x": "Error!", + "lambda": { + "__tag__": "code", + "ruby": "proc { |text| text == \"{{x}}\" ? \"yes\" : \"no\" }", + "raku": "sub { $^section eq q+{{x}}+ ?? \"yes\" !! \"no\" }", + "perl": "sub { $_[0] eq \"{{x}}\" ? \"yes\" : \"no\" }", + "js": "function(txt) { return (txt == \"{{x}}\" ? \"yes\" : \"no\") }", + "php": "return ($text == \"{{x}}\") ? \"yes\" : \"no\";", + "python": "lambda text: text == \"{{x}}\" and \"yes\" or \"no\"", + "clojure": "(fn [text] (if (= text \"{{x}}\") \"yes\" \"no\"))", + "lisp": "(lambda (text) (if (string= text \"{{x}}\") \"yes\" \"no\"))", + "pwsh": "if ($args[0] -eq \"{{x}}\") {\"yes\"} else {\"no\"}", + "go": "func(text string) string { if text == \"{{x}}\" { return \"yes\" } else { return \"no\" } }", + "erlang": "fun(\"{{x}}\") -> \"yes\"; (_) -> \"no\" end." + } + }, + "template": "<{{#lambda}}{{x}}{{/lambda}}>", + "expected": "" + }, + { + "name": "Section - Expansion", + "desc": "Lambdas used for sections should have their results parsed.", + "data": { + "planet": "Earth", + "lambda": { + "__tag__": "code", + "ruby": "proc { |text| \"#{text}{{planet}}#{text}\" }", + "raku": "sub { $^section ~ q+{{planet}}+ ~ $^section }", + "perl": "sub { $_[0] . \"{{planet}}\" . $_[0] }", + "js": "function(txt) { return txt + \"{{planet}}\" + txt }", + "php": "return $text . \"{{planet}}\" . $text;", + "python": "lambda text: \"%s{{planet}}%s\" % (text, text)", + "clojure": "(fn [text] (str text \"{{planet}}\" text))", + "lisp": "(lambda (text) (format nil \"~a{{planet}}~a\" text text))", + "pwsh": "\"$($args[0]){{planet}}$($args[0])\"", + "go": "func(text string) string { return text + \"{{planet}}\" + text }", + "erlang": "fun(Text) -> Text ++ \"{{planet}}\" ++ Text end." + } + }, + "template": "<{{#lambda}}-{{/lambda}}>", + "expected": "<-Earth->" + }, + { + "name": "Section - Alternate Delimiters", + "desc": "Lambdas used for sections should parse with the current delimiters.", + "data": { + "planet": "Earth", + "lambda": { + "__tag__": "code", + "ruby": "proc { |text| \"#{text}{{planet}} => |planet|#{text}\" }", + "raku": "sub { $^section ~ q+{{planet}} => |planet|+ ~ $^section }", + "perl": "sub { $_[0] . \"{{planet}} => |planet|\" . $_[0] }", + "js": "function(txt) { return txt + \"{{planet}} => |planet|\" + txt }", + "php": "return $text . \"{{planet}} => |planet|\" . $text;", + "python": "lambda text: \"%s{{planet}} => |planet|%s\" % (text, text)", + "clojure": "(fn [text] (str text \"{{planet}} => |planet|\" text))", + "lisp": "(lambda (text) (format nil \"~a{{planet}} => |planet|~a\" text text))", + "pwsh": "\"$($args[0]){{planet}} => |planet|$($args[0])\"", + "go": "func(text string) string { return text + \"{{planet}} => |planet|\" + text }", + "erlang": "fun(Text) -> Text ++ \"{{planet}} => |planet|\" ++ Text end." + } + }, + "template": "{{= | | =}}<|#lambda|-|/lambda|>", + "expected": "<-{{planet}} => Earth->" + }, + { + "name": "Section - Multiple Calls", + "desc": "Lambdas used for sections should not be cached.", + "data": { + "lambda": { + "__tag__": "code", + "ruby": "proc { |text| \"__#{text}__\" }", + "raku": "sub { \"__\" ~ $^section ~ \"__\" }", + "perl": "sub { \"__\" . $_[0] . \"__\" }", + "js": "function(txt) { return \"__\" + txt + \"__\" }", + "php": "return \"__\" . $text . \"__\";", + "python": "lambda text: \"__%s__\" % (text)", + "clojure": "(fn [text] (str \"__\" text \"__\"))", + "lisp": "(lambda (text) (format nil \"__~a__\" text))", + "pwsh": "\"__$($args[0])__\"", + "go": "func(text string) string { return \"__\" + text + \"__\" }", + "erlang": "fun(Text) -> \"__\" ++ Text ++ \"__\" end." + } + }, + "template": "{{#lambda}}FILE{{/lambda}} != {{#lambda}}LINE{{/lambda}}", + "expected": "__FILE__ != __LINE__" + }, + { + "name": "Inverted Section", + "desc": "Lambdas used for inverted sections should be considered truthy.", + "data": { + "static": "static", + "lambda": { + "__tag__": "code", + "ruby": "proc { |text| false }", + "raku": "sub { 0 }", + "perl": "sub { 0 }", + "js": "function(txt) { return false }", + "php": "return false;", + "python": "lambda text: 0", + "clojure": "(fn [text] false)", + "lisp": "(lambda (text) (declare (ignore text)) nil)", + "pwsh": "$false", + "go": "func(text string) bool { return false }", + "erlang": "fun(_) -> false end." + } + }, + "template": "<{{^lambda}}{{static}}{{/lambda}}>", + "expected": "<>" + } + ] +} +'''; diff --git a/third_party/packages/mustache_template/test/specs/partials.dart b/third_party/packages/mustache_template/test/specs/partials.dart new file mode 100644 index 0000000..062f435 --- /dev/null +++ b/third_party/packages/mustache_template/test/specs/partials.dart @@ -0,0 +1,156 @@ +// Generated from partials.json@97c05b0652f06ef4cbe12016b8d0e41df31c4b05 at 2026-03-09T19:49:45Z +const String PARTIALS = r''' +{ + "__ATTN__": "Do not edit this file; changes belong in the appropriate YAML file.", + "overview": "Partial tags are used to expand an external template into the current\ntemplate.\n\nThe tag's content MUST be a non-whitespace character sequence NOT containing\nthe current closing delimiter.\n\nThis tag's content names the partial to inject. Set Delimiter tags MUST NOT\naffect the parsing of a partial. The partial MUST be rendered against the\ncontext stack local to the tag. If the named partial cannot be found, the\nempty string SHOULD be used instead, as in interpolations.\n\nPartial tags SHOULD be treated as standalone when appropriate. If this tag\nis used standalone, any whitespace preceding the tag should treated as\nindentation, and prepended to each line of the partial before rendering.\n", + "tests": [ + { + "name": "Basic Behavior", + "desc": "The greater-than operator should expand to the named partial.", + "data": { + }, + "template": "\"{{>text}}\"", + "partials": { + "text": "from partial" + }, + "expected": "\"from partial\"" + }, + { + "name": "Failed Lookup", + "desc": "The empty string should be used when the named partial is not found.", + "data": { + }, + "template": "\"{{>text}}\"", + "partials": { + }, + "expected": "\"\"" + }, + { + "name": "Context", + "desc": "The greater-than operator should operate within the current context.", + "data": { + "text": "content" + }, + "template": "\"{{>partial}}\"", + "partials": { + "partial": "*{{text}}*" + }, + "expected": "\"*content*\"" + }, + { + "name": "Recursion", + "desc": "The greater-than operator should properly recurse.", + "data": { + "content": "X", + "nodes": [ + { + "content": "Y", + "nodes": [ + + ] + } + ] + }, + "template": "{{>node}}", + "partials": { + "node": "{{content}}<{{#nodes}}{{>node}}{{/nodes}}>" + }, + "expected": "X>" + }, + { + "name": "Nested", + "desc": "The greater-than operator should work from within partials.", + "data": { + "a": "hello", + "b": "world" + }, + "template": "{{>outer}}", + "partials": { + "outer": "*{{a}} {{>inner}}*", + "inner": "{{b}}!" + }, + "expected": "*hello world!*" + }, + { + "name": "Surrounding Whitespace", + "desc": "The greater-than operator should not alter surrounding whitespace.", + "data": { + }, + "template": "| {{>partial}} |", + "partials": { + "partial": "\t|\t" + }, + "expected": "| \t|\t |" + }, + { + "name": "Inline Indentation", + "desc": "Whitespace should be left untouched.", + "data": { + "data": "|" + }, + "template": " {{data}} {{> partial}}\n", + "partials": { + "partial": ">\n>" + }, + "expected": " | >\n>\n" + }, + { + "name": "Standalone Line Endings", + "desc": "\"\\r\\n\" should be considered a newline for standalone tags.", + "data": { + }, + "template": "|\r\n{{>partial}}\r\n|", + "partials": { + "partial": ">" + }, + "expected": "|\r\n>|" + }, + { + "name": "Standalone Without Previous Line", + "desc": "Standalone tags should not require a newline to precede them.", + "data": { + }, + "template": " {{>partial}}\n>", + "partials": { + "partial": ">\n>" + }, + "expected": " >\n >>" + }, + { + "name": "Standalone Without Newline", + "desc": "Standalone tags should not require a newline to follow them.", + "data": { + }, + "template": ">\n {{>partial}}", + "partials": { + "partial": ">\n>" + }, + "expected": ">\n >\n >" + }, + { + "name": "Standalone Indentation", + "desc": "Each line of the partial should be indented before rendering.", + "data": { + "content": "<\n->" + }, + "template": "\\\n {{>partial}}\n/\n", + "partials": { + "partial": "|\n{{{content}}}\n|\n" + }, + "expected": "\\\n |\n <\n->\n |\n/\n" + }, + { + "name": "Padding Whitespace", + "desc": "Superfluous in-tag whitespace should be ignored.", + "data": { + "boolean": true + }, + "template": "|{{> partial }}|", + "partials": { + "partial": "[]" + }, + "expected": "|[]|" + } + ] +} +'''; diff --git a/third_party/packages/mustache_template/test/specs/sections.dart b/third_party/packages/mustache_template/test/specs/sections.dart new file mode 100644 index 0000000..4da83ca --- /dev/null +++ b/third_party/packages/mustache_template/test/specs/sections.dart @@ -0,0 +1,426 @@ +// Generated from sections.json@97c05b0652f06ef4cbe12016b8d0e41df31c4b05 at 2026-03-09T19:49:45Z +const String SECTIONS = r''' +{ + "__ATTN__": "Do not edit this file; changes belong in the appropriate YAML file.", + "overview": "Section tags and End Section tags are used in combination to wrap a section\nof the template for iteration.\n\nThese tags' content MUST be a non-whitespace character sequence NOT\ncontaining the current closing delimiter; each Section tag MUST be followed\nby an End Section tag with the same content within the same section.\n\nThis tag's content names the data to replace the tag. Name resolution is as\nfollows:\n 1) If the name is a single period (.), the data is the item currently\n sitting atop the context stack. Skip the rest of these steps.\n 2) Split the name on periods; the first part is the name to resolve, any\n remaining parts should be retained.\n 3) Walk the context stack from top to bottom, finding the first context\n that is a) a hash containing the name as a key OR b) an object responding\n to a method with the given name.\n 4) If the context is a hash, the data is the value associated with the\n name.\n 5) If the context is an object and the method with the given name has an\n arity of 1, the method SHOULD be called with a String containing the\n unprocessed contents of the sections; the data is the value returned.\n 6) Otherwise, the data is the value returned by calling the method with\n the given name.\n 7) If any name parts were retained in step 1, each should be resolved\n against a context stack containing only the result from the former\n resolution. If any part fails resolution, the result should be considered\n falsey, and should interpolate as the empty string.\n\nIf the data is not of a list type, it is coerced into a list as follows: if\nthe data is truthy (e.g. `!!data == true`), use a single-element list\ncontaining the data, otherwise use an empty list.\n\nFor each element in the data list, the element MUST be pushed onto the\ncontext stack, the section MUST be rendered, and the element MUST be popped\noff the context stack.\n\nSection and End Section tags SHOULD be treated as standalone when\nappropriate.\n", + "tests": [ + { + "name": "Truthy", + "desc": "Truthy sections should have their contents rendered.", + "data": { + "boolean": true + }, + "template": "\"{{#boolean}}This should be rendered.{{/boolean}}\"", + "expected": "\"This should be rendered.\"" + }, + { + "name": "Falsey", + "desc": "Falsey sections should have their contents omitted.", + "data": { + "boolean": false + }, + "template": "\"{{#boolean}}This should not be rendered.{{/boolean}}\"", + "expected": "\"\"" + }, + { + "name": "Null is falsey", + "desc": "Null is falsey.", + "data": { + "null": null + }, + "template": "\"{{#null}}This should not be rendered.{{/null}}\"", + "expected": "\"\"" + }, + { + "name": "Context", + "desc": "Objects and hashes should be pushed onto the context stack.", + "data": { + "context": { + "name": "Joe" + } + }, + "template": "\"{{#context}}Hi {{name}}.{{/context}}\"", + "expected": "\"Hi Joe.\"" + }, + { + "name": "Parent contexts", + "desc": "Names missing in the current context are looked up in the stack.", + "data": { + "a": "foo", + "b": "wrong", + "sec": { + "b": "bar" + }, + "c": { + "d": "baz" + } + }, + "template": "\"{{#sec}}{{a}}, {{b}}, {{c.d}}{{/sec}}\"", + "expected": "\"foo, bar, baz\"" + }, + { + "name": "Variable test", + "desc": "Non-false sections have their value at the top of context,\naccessible as {{.}} or through the parent context. This gives\na simple way to display content conditionally if a variable exists.\n", + "data": { + "foo": "bar" + }, + "template": "\"{{#foo}}{{.}} is {{foo}}{{/foo}}\"", + "expected": "\"bar is bar\"" + }, + { + "name": "List Contexts", + "desc": "All elements on the context stack should be accessible within lists.", + "data": { + "tops": [ + { + "tname": { + "upper": "A", + "lower": "a" + }, + "middles": [ + { + "mname": "1", + "bottoms": [ + { + "bname": "x" + }, + { + "bname": "y" + } + ] + } + ] + } + ] + }, + "template": "{{#tops}}{{#middles}}{{tname.lower}}{{mname}}.{{#bottoms}}{{tname.upper}}{{mname}}{{bname}}.{{/bottoms}}{{/middles}}{{/tops}}", + "expected": "a1.A1x.A1y." + }, + { + "name": "Deeply Nested Contexts", + "desc": "All elements on the context stack should be accessible.", + "data": { + "a": { + "one": 1 + }, + "b": { + "two": 2 + }, + "c": { + "three": 3, + "d": { + "four": 4, + "five": 5 + } + } + }, + "template": "{{#a}}\n{{one}}\n{{#b}}\n{{one}}{{two}}{{one}}\n{{#c}}\n{{one}}{{two}}{{three}}{{two}}{{one}}\n{{#d}}\n{{one}}{{two}}{{three}}{{four}}{{three}}{{two}}{{one}}\n{{#five}}\n{{one}}{{two}}{{three}}{{four}}{{five}}{{four}}{{three}}{{two}}{{one}}\n{{one}}{{two}}{{three}}{{four}}{{.}}6{{.}}{{four}}{{three}}{{two}}{{one}}\n{{one}}{{two}}{{three}}{{four}}{{five}}{{four}}{{three}}{{two}}{{one}}\n{{/five}}\n{{one}}{{two}}{{three}}{{four}}{{three}}{{two}}{{one}}\n{{/d}}\n{{one}}{{two}}{{three}}{{two}}{{one}}\n{{/c}}\n{{one}}{{two}}{{one}}\n{{/b}}\n{{one}}\n{{/a}}\n", + "expected": "1\n121\n12321\n1234321\n123454321\n12345654321\n123454321\n1234321\n12321\n121\n1\n" + }, + { + "name": "List", + "desc": "Lists should be iterated; list items should visit the context stack.", + "data": { + "list": [ + { + "item": 1 + }, + { + "item": 2 + }, + { + "item": 3 + } + ] + }, + "template": "\"{{#list}}{{item}}{{/list}}\"", + "expected": "\"123\"" + }, + { + "name": "Empty List", + "desc": "Empty lists should behave like falsey values.", + "data": { + "list": [ + + ] + }, + "template": "\"{{#list}}Yay lists!{{/list}}\"", + "expected": "\"\"" + }, + { + "name": "Doubled", + "desc": "Multiple sections per template should be permitted.", + "data": { + "bool": true, + "two": "second" + }, + "template": "{{#bool}}\n* first\n{{/bool}}\n* {{two}}\n{{#bool}}\n* third\n{{/bool}}\n", + "expected": "* first\n* second\n* third\n" + }, + { + "name": "Nested (Truthy)", + "desc": "Nested truthy sections should have their contents rendered.", + "data": { + "bool": true + }, + "template": "| A {{#bool}}B {{#bool}}C{{/bool}} D{{/bool}} E |", + "expected": "| A B C D E |" + }, + { + "name": "Nested (Falsey)", + "desc": "Nested falsey sections should be omitted.", + "data": { + "bool": false + }, + "template": "| A {{#bool}}B {{#bool}}C{{/bool}} D{{/bool}} E |", + "expected": "| A E |" + }, + { + "name": "Context Misses", + "desc": "Failed context lookups should be considered falsey.", + "data": { + }, + "template": "[{{#missing}}Found key 'missing'!{{/missing}}]", + "expected": "[]" + }, + { + "name": "Implicit Iterator - String", + "desc": "Implicit iterators should directly interpolate strings.", + "data": { + "list": [ + "a", + "b", + "c", + "d", + "e" + ] + }, + "template": "\"{{#list}}({{.}}){{/list}}\"", + "expected": "\"(a)(b)(c)(d)(e)\"" + }, + { + "name": "Implicit Iterator - Integer", + "desc": "Implicit iterators should cast integers to strings and interpolate.", + "data": { + "list": [ + 1, + 2, + 3, + 4, + 5 + ] + }, + "template": "\"{{#list}}({{.}}){{/list}}\"", + "expected": "\"(1)(2)(3)(4)(5)\"" + }, + { + "name": "Implicit Iterator - Decimal", + "desc": "Implicit iterators should cast decimals to strings and interpolate.", + "data": { + "list": [ + 1.1, + 2.2, + 3.3, + 4.4, + 5.5 + ] + }, + "template": "\"{{#list}}({{.}}){{/list}}\"", + "expected": "\"(1.1)(2.2)(3.3)(4.4)(5.5)\"" + }, + { + "name": "Implicit Iterator - Array", + "desc": "Implicit iterators should allow iterating over nested arrays.", + "data": { + "list": [ + [ + 1, + 2, + 3 + ], + [ + "a", + "b", + "c" + ] + ] + }, + "template": "\"{{#list}}({{#.}}{{.}}{{/.}}){{/list}}\"", + "expected": "\"(123)(abc)\"" + }, + { + "name": "Implicit Iterator - HTML Escaping", + "desc": "Implicit iterators with basic interpolation should be HTML escaped.", + "data": { + "list": [ + "&", + "\"", + "<", + ">" + ] + }, + "template": "\"{{#list}}({{.}}){{/list}}\"", + "expected": "\"(&)(")(<)(>)\"" + }, + { + "name": "Implicit Iterator - Triple mustache", + "desc": "Implicit iterators in triple mustache should interpolate without HTML escaping.", + "data": { + "list": [ + "&", + "\"", + "<", + ">" + ] + }, + "template": "\"{{#list}}({{{.}}}){{/list}}\"", + "expected": "\"(&)(\")(<)(>)\"" + }, + { + "name": "Implicit Iterator - Ampersand", + "desc": "Implicit iterators in an Ampersand tag should interpolate without HTML escaping.", + "data": { + "list": [ + "&", + "\"", + "<", + ">" + ] + }, + "template": "\"{{#list}}({{&.}}){{/list}}\"", + "expected": "\"(&)(\")(<)(>)\"" + }, + { + "name": "Implicit Iterator - Root-level", + "desc": "Implicit iterators should work on root-level lists.", + "data": [ + { + "value": "a" + }, + { + "value": "b" + } + ], + "template": "\"{{#.}}({{value}}){{/.}}\"", + "expected": "\"(a)(b)\"" + }, + { + "name": "Dotted Names - Truthy", + "desc": "Dotted names should be valid for Section tags.", + "data": { + "a": { + "b": { + "c": true + } + } + }, + "template": "\"{{#a.b.c}}Here{{/a.b.c}}\" == \"Here\"", + "expected": "\"Here\" == \"Here\"" + }, + { + "name": "Dotted Names - Falsey", + "desc": "Dotted names should be valid for Section tags.", + "data": { + "a": { + "b": { + "c": false + } + } + }, + "template": "\"{{#a.b.c}}Here{{/a.b.c}}\" == \"\"", + "expected": "\"\" == \"\"" + }, + { + "name": "Dotted Names - Broken Chains", + "desc": "Dotted names that cannot be resolved should be considered falsey.", + "data": { + "a": { + } + }, + "template": "\"{{#a.b.c}}Here{{/a.b.c}}\" == \"\"", + "expected": "\"\" == \"\"" + }, + { + "name": "Surrounding Whitespace", + "desc": "Sections should not alter surrounding whitespace.", + "data": { + "boolean": true + }, + "template": " | {{#boolean}}\t|\t{{/boolean}} | \n", + "expected": " | \t|\t | \n" + }, + { + "name": "Internal Whitespace", + "desc": "Sections should not alter internal whitespace.", + "data": { + "boolean": true + }, + "template": " | {{#boolean}} {{! Important Whitespace }}\n {{/boolean}} | \n", + "expected": " | \n | \n" + }, + { + "name": "Indented Inline Sections", + "desc": "Single-line sections should not alter surrounding whitespace.", + "data": { + "boolean": true + }, + "template": " {{#boolean}}YES{{/boolean}}\n {{#boolean}}GOOD{{/boolean}}\n", + "expected": " YES\n GOOD\n" + }, + { + "name": "Standalone Lines", + "desc": "Standalone lines should be removed from the template.", + "data": { + "boolean": true + }, + "template": "| This Is\n{{#boolean}}\n|\n{{/boolean}}\n| A Line\n", + "expected": "| This Is\n|\n| A Line\n" + }, + { + "name": "Indented Standalone Lines", + "desc": "Indented standalone lines should be removed from the template.", + "data": { + "boolean": true + }, + "template": "| This Is\n {{#boolean}}\n|\n {{/boolean}}\n| A Line\n", + "expected": "| This Is\n|\n| A Line\n" + }, + { + "name": "Standalone Line Endings", + "desc": "\"\\r\\n\" should be considered a newline for standalone tags.", + "data": { + "boolean": true + }, + "template": "|\r\n{{#boolean}}\r\n{{/boolean}}\r\n|", + "expected": "|\r\n|" + }, + { + "name": "Standalone Without Previous Line", + "desc": "Standalone tags should not require a newline to precede them.", + "data": { + "boolean": true + }, + "template": " {{#boolean}}\n#{{/boolean}}\n/", + "expected": "#\n/" + }, + { + "name": "Standalone Without Newline", + "desc": "Standalone tags should not require a newline to follow them.", + "data": { + "boolean": true + }, + "template": "#{{#boolean}}\n/\n {{/boolean}}", + "expected": "#\n/\n" + }, + { + "name": "Padding", + "desc": "Superfluous in-tag whitespace should be ignored.", + "data": { + "boolean": true + }, + "template": "|{{# boolean }}={{/ boolean }}|", + "expected": "|=|" + } + ] +} +'''; diff --git a/third_party/packages/mustache_template/test/specs/specs.dart b/third_party/packages/mustache_template/test/specs/specs.dart new file mode 100644 index 0000000..a6a7828 --- /dev/null +++ b/third_party/packages/mustache_template/test/specs/specs.dart @@ -0,0 +1,22 @@ +// Generated from mustache/spec@97c05b0652f06ef4cbe12016b8d0e41df31c4b05 at 2026-03-09T19:49:45Z +import 'comments.dart'; +import 'delimiters.dart'; +import 'dynamic_names.dart'; +import 'inheritance.dart'; +import 'interpolation.dart'; +import 'inverted.dart'; +import 'lambdas.dart'; +import 'partials.dart'; +import 'sections.dart'; + +const Map SPECS = { + 'comments': COMMENTS, + 'delimiters': DELIMITERS, + 'dynamic_names': DYNAMIC_NAMES, + 'inheritance': INHERITANCE, + 'interpolation': INTERPOLATION, + 'inverted': INVERTED, + 'lambdas': LAMBDAS, + 'partials': PARTIALS, + 'sections': SECTIONS, +}; diff --git a/third_party/packages/mustache_template/tool/download_spec.dart b/third_party/packages/mustache_template/tool/download_spec.dart new file mode 100644 index 0000000..58b4546 --- /dev/null +++ b/third_party/packages/mustache_template/tool/download_spec.dart @@ -0,0 +1,125 @@ +import 'dart:io'; + +/// Clones the mustache/spec repository, embeds each JSON spec as a Dart raw +/// string under `test/specs/`, and writes `test/specs/specs.dart` with a +/// `SPECS` map. +/// +/// Run from the package root: +/// `dart run tool/download_spec.dart` +Future main(List args) async { + final Directory packageRoot = _packageRootDirectory(); + final testSpecsDir = Directory(_join(packageRoot.path, 'test', 'specs')); + final String tmpSpecPath = _join(packageRoot.path, 'tmp_spec'); + final tmpSpecDir = Directory(tmpSpecPath); + + if (tmpSpecDir.existsSync()) { + await tmpSpecDir.delete(recursive: true); + } + + await _runGit(packageRoot.path, [ + 'clone', + 'https://github.com/mustache/spec.git', + tmpSpecPath, + ]); + + final String headHash = + ((await _runGit(packageRoot.path, [ + '-C', + tmpSpecPath, + 'rev-parse', + 'HEAD', + ])).stdout + as String) + .trim(); + + final String utcNow = _formatUtcSecond(DateTime.now().toUtc()); + + if (testSpecsDir.existsSync()) { + await testSpecsDir.delete(recursive: true); + } + await testSpecsDir.create(recursive: true); + + final clonedSpecs = Directory(_join(tmpSpecPath, 'specs')); + final List jsonFiles = + clonedSpecs + .listSync() + .whereType() + .where((File f) => f.path.endsWith('.json')) + .toList() + ..sort((File a, File b) => a.path.compareTo(b.path)); + + final exports = StringBuffer(); + final mapEntries = StringBuffer(); + + for (final jsonFile in jsonFiles) { + final String original = jsonFile.uri.pathSegments.last; + var base = original; + if (base.endsWith('.json')) { + base = base.substring(0, base.length - '.json'.length); + } + if (base.startsWith('~')) { + base = base.substring(1); + } + final String dartName = base.replaceAll('-', '_'); + final String constName = dartName.toUpperCase(); + final String jsonText = await jsonFile.readAsString(); + + final outFile = File(_join(testSpecsDir.path, '$dartName.dart')); + await outFile.writeAsString( + '// Generated from $original@$headHash at $utcNow\n' + "const String $constName = r'''\n" + '$jsonText' + "''';\n", + ); + + exports.write("import '"); + exports.write(dartName); + exports.writeln(".dart';"); + + mapEntries.write(" '"); + mapEntries.write(dartName); + mapEntries.writeln("': $constName,"); + } + + await File(_join(testSpecsDir.path, 'specs.dart')).writeAsString( + '// Generated from mustache/spec@$headHash at $utcNow\n' + '$exports\n' + 'const Map SPECS = {\n' + '$mapEntries' + '};\n', + ); + + await Directory(tmpSpecPath).delete(recursive: true); +} + +Directory _packageRootDirectory() { + return File.fromUri(Platform.script).parent.parent; +} + +String _formatUtcSecond(DateTime dt) { + assert(dt.isUtc); + String two(int n) => n.toString().padLeft(2, '0'); + final String y = dt.year.toString().padLeft(4, '0'); + return '$y-${two(dt.month)}-${two(dt.day)}T${two(dt.hour)}:${two(dt.minute)}:${two(dt.second)}Z'; +} + +String _join(String a, String b, [String? c]) { + final String sep = Platform.pathSeparator; + return [a, b, if (c != null) c].join(sep); +} + +Future _runGit( + String workingDirectory, + List arguments, +) async { + final ProcessResult result = await Process.run( + 'git', + arguments, + workingDirectory: workingDirectory, + ); + if (result.exitCode != 0) { + stderr.writeln(result.stderr); + exit(result.exitCode); + } + return result; +} From cfdd1d3b5013013c68ec0c9e3b7ba547717faf6e Mon Sep 17 00:00:00 2001 From: Alexander Aprelev Date: Wed, 6 May 2026 23:06:09 -0700 Subject: [PATCH 113/118] Comment out the test that uses implemented NetworkInterface to accommodate dart sdk breaking change. (#11659) This addresses dart sdk breaking change https://github.com/dart-lang/sdk/issues/63216. https://github.com/flutter/flutter/issues/186155 tracks undoing this once dart rolls into flutter. --- packages/multicast_dns/test/client_test.dart | 217 +++++++++++-------- 1 file changed, 127 insertions(+), 90 deletions(-) diff --git a/packages/multicast_dns/test/client_test.dart b/packages/multicast_dns/test/client_test.dart index 89bb647..44a4626 100644 --- a/packages/multicast_dns/test/client_test.dart +++ b/packages/multicast_dns/test/client_test.dart @@ -4,6 +4,7 @@ import 'dart:async'; import 'dart:io'; +// import 'dart:typed_data'; import 'package:multicast_dns/multicast_dns.dart'; import 'package:test/fake.dart'; @@ -111,84 +112,84 @@ void main() { await client.lookup(ResourceRecordQuery.serverPointer('_')).toList(); }); - group('Bind a single socket to ANY IPv4 and more than one when IPv6', () { - final testCases = >[ - { - 'name': 'IPv4', - 'datagramSocketType': InternetAddress.anyIPv4, - 'interfacePrefix': '192.168.2.', - }, - { - 'name': 'IPv6', - 'datagramSocketType': InternetAddress.anyIPv6, - 'interfacePrefix': '2001:0db8:85a3:0000:0000:8a2e:7335:030', - }, - ]; - - for (final testCase in testCases) { - test('Bind a single socket to ANY ${testCase["name"]}', () async { - final datagramSocket = FakeRawDatagramSocket(); - - datagramSocket.address = - testCase['datagramSocketType']! as InternetAddress; - - final selectedInterfacesForSendingPackets = []; - final client = MDnsClient( - rawDatagramSocketFactory: - ( - dynamic host, - int port, { - bool reuseAddress = true, - bool reusePort = true, - int ttl = 1, - }) async { - selectedInterfacesForSendingPackets.add(host); - return datagramSocket; - }, - ); - - const numberOfFakeInterfaces = 10; - Future> fakeNetworkInterfacesFactory( - InternetAddressType type, - ) async { - final fakeInterfaces = []; - - // Generate "fake" interfaces - for (var i = 0; i < numberOfFakeInterfaces; i++) { - fakeInterfaces.add( - FakeNetworkInterface('inetfake$i', [ - InternetAddress("${testCase['interfacePrefix']! as String}$i"), - ], 0), - ); - } - - // ignore: always_specify_types - return Future.value(fakeInterfaces); - } - - final listenAddress = - testCase['datagramSocketType']! as InternetAddress; - - await client.start( - listenAddress: listenAddress, - mDnsPort: 1234, - interfacesFactory: fakeNetworkInterfacesFactory, - ); - client.stop(); - - if (testCase['datagramSocketType'] == InternetAddress.anyIPv4) { - expect(selectedInterfacesForSendingPackets.length, 1); - } else { - // + 1 because of unspecified address (::) - expect( - selectedInterfacesForSendingPackets.length, - numberOfFakeInterfaces + 1, - ); - } - expect(selectedInterfacesForSendingPackets[0], listenAddress.address); - }); - } - }); + // group('Bind a single socket to ANY IPv4 and more than one when IPv6', () { + // final testCases = >[ + // { + // 'name': 'IPv4', + // 'datagramSocketType': InternetAddress.anyIPv4, + // 'interfacePrefix': '192.168.2.', + // }, + // { + // 'name': 'IPv6', + // 'datagramSocketType': InternetAddress.anyIPv6, + // 'interfacePrefix': '2001:0db8:85a3:0000:0000:8a2e:7335:030', + // }, + // ]; + + // for (final testCase in testCases) { + // test('Bind a single socket to ANY ${testCase["name"]}', () async { + // final datagramSocket = FakeRawDatagramSocket(); + + // datagramSocket.address = + // testCase['datagramSocketType']! as InternetAddress; + + // final selectedInterfacesForSendingPackets = []; + // final client = MDnsClient( + // rawDatagramSocketFactory: + // ( + // dynamic host, + // int port, { + // bool reuseAddress = true, + // bool reusePort = true, + // int ttl = 1, + // }) async { + // selectedInterfacesForSendingPackets.add(host); + // return datagramSocket; + // }, + // ); + + // const numberOfFakeInterfaces = 10; + // Future> fakeNetworkInterfacesFactory( + // InternetAddressType type, + // ) async { + // final fakeInterfaces = []; + + // // Generate "fake" interfaces + // for (var i = 0; i < numberOfFakeInterfaces; i++) { + // fakeInterfaces.add( + // FakeNetworkInterface('inetfake$i', [ + // FakeInterfaceAddress(InternetAddress("${testCase['interfacePrefix']! as String}$i")), + // ], 0), + // ); + // } + + // // ignore: always_specify_types + // return Future.value(fakeInterfaces); + // } + + // final listenAddress = + // testCase['datagramSocketType']! as InternetAddress; + + // await client.start( + // listenAddress: listenAddress, + // mDnsPort: 1234, + // interfacesFactory: fakeNetworkInterfacesFactory, + // ); + // client.stop(); + + // if (testCase['datagramSocketType'] == InternetAddress.anyIPv4) { + // expect(selectedInterfacesForSendingPackets.length, 1); + // } else { + // // + 1 because of unspecified address (::) + // expect( + // selectedInterfacesForSendingPackets.length, + // numberOfFakeInterfaces + 1, + // ); + // } + // expect(selectedInterfacesForSendingPackets[0], listenAddress.address); + // }); + // } + // }); test('Calls onError callback in case of socket error', () async { final datagramSocket = FakeRawDatagramSocketThatSendsError(); @@ -282,19 +283,55 @@ class FakeRawDatagramSocketThatSendsError extends Fake } } -class FakeNetworkInterface implements NetworkInterface { - FakeNetworkInterface(this._name, this._addresses, this._index); +// class FakeInterfaceAddress implements InterfaceAddress { +// const FakeInterfaceAddress(this._internetAddress); - final String _name; - final List _addresses; - final int _index; +// final InternetAddress _internetAddress; - @override - List get addresses => _addresses; +// @override +// String get address => _internetAddress.address; - @override - String get name => _name; +// @override +// String get host => _internetAddress.host; - @override - int get index => _index; -} +// @override +// bool get isLinkLocal => _internetAddress.isLinkLocal; + +// @override +// bool get isLoopback => _internetAddress.isLoopback; + +// @override +// bool get isMulticast => _internetAddress.isMulticast; + +// @override +// Uint8List get rawAddress => _internetAddress.rawAddress; + +// @override +// Future reverse() => _internetAddress.reverse(); + +// @override +// InternetAddressType get type => _internetAddress.type; + +// @override +// int get prefixLength => 0; + +// @override +// InternetAddress? get broadcast => throw UnimplementedError(); +// } + +// class FakeNetworkInterface implements NetworkInterface { +// FakeNetworkInterface(this._name, this._addresses, this._index); + +// final String _name; +// final List _addresses; +// final int _index; + +// @override +// List get addresses => _addresses; + +// @override +// String get name => _name; + +// @override +// int get index => _index; +// } From 7abdf27408e1dd5446498d4e451674dfd681d370 Mon Sep 17 00:00:00 2001 From: engine-flutter-autoroll Date: Thu, 14 May 2026 13:41:21 -0400 Subject: [PATCH 114/118] Roll Flutter from 707dbc0420a3 to 23f6f5853f50 (149 revisions) (#11700) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Roll Flutter from 707dbc0420a3 to 23f6f5853f50 (149 revisions) https://github.com/flutter/flutter/compare/707dbc0420a3...23f6f5853f50 2026-05-12 737941+loic-sharma@users.noreply.github.com Add 'cp: review' label to the manual cherrypick process (flutter/flutter#186158) 2026-05-12 engine-flutter-autoroll@skia.org Roll Packages from 19ec8b861676 to 93cbed65f336 (3 revisions) (flutter/flutter#186401) 2026-05-12 30870216+gaaclarke@users.noreply.github.com Removes SDF option for macOS (always enabled) (flutter/flutter#186265) 2026-05-12 nico.reiab@gmail.com docs: fix typos in flutter_tools comments (flutter/flutter#186321) 2026-05-12 15619084+vashworth@users.noreply.github.com Pass XcodeBasedProject instead of String to functions in XcodeProjectInterpreter (flutter/flutter#186378) 2026-05-12 jason-simmons@users.noreply.github.com Update iOS scenario app test goldens to match changes from https://github.com/flutter/flutter/pull/182662 (flutter/flutter#186390) 2026-05-12 engine-flutter-autoroll@skia.org Roll Skia from ad0aff15b9fa to 77a21bc723dc (2 revisions) (flutter/flutter#186396) 2026-05-12 32538273+ValentinVignal@users.noreply.github.com Migrate focus_node.unfocus.0.dart to use `RadioGroup` (flutter/flutter#183979) 2026-05-12 engine-flutter-autoroll@skia.org Roll Skia from 91d3c1e730af to ad0aff15b9fa (7 revisions) (flutter/flutter#186391) 2026-05-12 bdero@google.com [Flutter GPU] Allow customizing the vertex layout on a RenderPipeline (flutter/flutter#186310) 2026-05-12 97480502+b-luk@users.noreply.github.com Fix `EmbedderTest.CanRenderTextWithImpellerMetal` test breakage (flutter/flutter#186262) 2026-05-12 engine-flutter-autoroll@skia.org Roll Fuchsia Linux SDK from rFhU-YPqdCRCtCz7b... to z7ICmPtn4hspu02zk... (flutter/flutter#186384) 2026-05-12 bdero@google.com [Impeller] GLES: lazily allocate texture mip levels on first per-level write (flutter/flutter#186302) 2026-05-12 bdero@google.com [Android] Propagate --enable-flutter-gpu Intent extra to engine args (flutter/flutter#186298) 2026-05-11 47866232+chunhtai@users.noreply.github.com [ci] update no-response workflow to also look for old label name in e… (flutter/flutter#186373) 2026-05-11 bdero@google.com [ImpellerC] Write a depfile when --shader-bundle is in use (flutter/flutter#186341) 2026-05-11 nico.reiab@gmail.com docs: fix doubled-word typos in comments (flutter/flutter#186320) 2026-05-11 engine-flutter-autoroll@skia.org Roll Skia from 32281401997e to 91d3c1e730af (4 revisions) (flutter/flutter#186368) 2026-05-11 15619084+vashworth@users.noreply.github.com Show SwiftPM warnings right before iOS/macOS build (flutter/flutter#185984) 2026-05-11 15619084+vashworth@users.noreply.github.com Convert rebuilding-flutter-tool script to dart (flutter/flutter#185089) 2026-05-11 15619084+vashworth@users.noreply.github.com Use Xcode's LLDB (flutter/flutter#186273) 2026-05-11 mr-peipei@web.de Remove `currentMainUri` from `generateMainDartWithPluginRegistrant` (flutter/flutter#185907) 2026-05-11 engine-flutter-autoroll@skia.org Roll Skia from 2514f6b5f92b to 32281401997e (1 revision) (flutter/flutter#186349) 2026-05-11 engine-flutter-autoroll@skia.org Roll Packages from 92552b16bcc1 to 19ec8b861676 (4 revisions) (flutter/flutter#186350) 2026-05-11 1063596+reidbaker@users.noreply.github.com Check for absolute paths in skills. (flutter/flutter#185632) 2026-05-11 engine-flutter-autoroll@skia.org Roll Skia from 9fb7d2814642 to 2514f6b5f92b (1 revision) (flutter/flutter#186347) 2026-05-11 engine-flutter-autoroll@skia.org Roll Skia from 8cafb209e836 to 9fb7d2814642 (4 revisions) (flutter/flutter#186335) 2026-05-10 engine-flutter-autoroll@skia.org Roll Fuchsia Linux SDK from sOBiPJb0xznDBZlf5... to rFhU-YPqdCRCtCz7b... (flutter/flutter#186328) 2026-05-10 engine-flutter-autoroll@skia.org Roll Skia from 05a03f99c74e to 8cafb209e836 (1 revision) (flutter/flutter#186315) 2026-05-10 bdero@google.com [Impeller] Vulkan: don't drop user-supplied viewport X, Y, and depth range (flutter/flutter#185886) 2026-05-09 mbrase@google.com Update Fuchsia tests to subpackage their child components (flutter/flutter#186259) 2026-05-09 victorsanniay@gmail.com Fix SelectableText crash with inline lambda contextMenuBuilder (flutter/flutter#184990) 2026-05-09 engine-flutter-autoroll@skia.org Roll Fuchsia Linux SDK from 5_TnhTsHSqtCx37o6... to sOBiPJb0xznDBZlf5... (flutter/flutter#186289) 2026-05-09 engine-flutter-autoroll@skia.org Roll Skia from dc78d4bd2efb to 05a03f99c74e (2 revisions) (flutter/flutter#186283) 2026-05-09 22373191+Hari-07@users.noreply.github.com Improve non rect platform view rendering (flutter/flutter#182662) 2026-05-08 engine-flutter-autoroll@skia.org Roll Skia from 31521f8508c7 to dc78d4bd2efb (1 revision) (flutter/flutter#186278) 2026-05-08 30870216+gaaclarke@users.noreply.github.com Moves wide_gamut_macos to arm64 (flutter/flutter#186214) 2026-05-08 98614782+auto-submit[bot]@users.noreply.github.com Reverts "[iOS] Migrate VSyncClient to a pure Obj-C implementation (#186166)" (flutter/flutter#186266) 2026-05-08 engine-flutter-autoroll@skia.org Roll Skia from a00db8749edb to 31521f8508c7 (2 revisions) (flutter/flutter#186264) 2026-05-08 97480502+b-luk@users.noreply.github.com Optimize compatible `DrawDiffRoundRect` calls to use `DrawRoundRect` (flutter/flutter#186203) 2026-05-08 bdero@google.com [triage] Add Flutter GPU as a triage team (flutter/flutter#186263) 2026-05-08 dmgr@google.com doc: Unified Check-Run User manual (flutter/flutter#186210) 2026-05-08 engine-flutter-autoroll@skia.org Roll Skia from 5f7adf4403d6 to a00db8749edb (1 revision) (flutter/flutter#186257) 2026-05-08 engine-flutter-autoroll@skia.org Roll Packages from cfdd1d3b5013 to 92552b16bcc1 (1 revision) (flutter/flutter#186256) 2026-05-08 34871572+gmackall@users.noreply.github.com Add logging to figure out jvm crashes for `hot_mode_tests` (flutter/flutter#186107) 2026-05-08 engine-flutter-autoroll@skia.org Roll Skia from 926c09741ce2 to 5f7adf4403d6 (3 revisions) (flutter/flutter#186242) ... --- .../test/standard_message_codec_test.dart | 46 ++++++++----------- 1 file changed, 19 insertions(+), 27 deletions(-) diff --git a/packages/standard_message_codec/test/standard_message_codec_test.dart b/packages/standard_message_codec/test/standard_message_codec_test.dart index 273b3b9..b0de991 100644 --- a/packages/standard_message_codec/test/standard_message_codec_test.dart +++ b/packages/standard_message_codec/test/standard_message_codec_test.dart @@ -68,18 +68,14 @@ void main() { expect(read.getInt64(), equals(-9000000000000)); }, testOn: 'vm' /* Int64 isn't supported on web */); - test( - 'of 64-bit integer in big endian', - () { - final write = WriteBuffer(); - write.putInt64(-9000000000000, endian: Endian.big); - final ByteData written = write.done(); - expect(written.lengthInBytes, equals(8)); - final read = ReadBuffer(written); - expect(read.getInt64(endian: Endian.big), equals(-9000000000000)); - }, - testOn: 'vm' /* Int64 isn't supported on web */, - ); + test('of 64-bit integer in big endian', () { + final write = WriteBuffer(); + write.putInt64(-9000000000000, endian: Endian.big); + final ByteData written = write.done(); + expect(written.lengthInBytes, equals(8)); + final read = ReadBuffer(written); + expect(read.getInt64(endian: Endian.big), equals(-9000000000000)); + }, testOn: 'vm' /* Int64 isn't supported on web */); test('of double', () { final write = WriteBuffer(); @@ -109,21 +105,17 @@ void main() { expect(read.getInt32List(3), equals(integers)); }); - test( - 'of 64-bit int list when unaligned', - () { - final integers = Int64List.fromList([-99, 2, 99]); - final write = WriteBuffer(); - write.putUint8(9); - write.putInt64List(integers); - final ByteData written = write.done(); - expect(written.lengthInBytes, equals(32)); - final read = ReadBuffer(written); - read.getUint8(); - expect(read.getInt64List(3), equals(integers)); - }, - testOn: 'vm' /* Int64 isn't supported on web */, - ); + test('of 64-bit int list when unaligned', () { + final integers = Int64List.fromList([-99, 2, 99]); + final write = WriteBuffer(); + write.putUint8(9); + write.putInt64List(integers); + final ByteData written = write.done(); + expect(written.lengthInBytes, equals(32)); + final read = ReadBuffer(written); + read.getUint8(); + expect(read.getInt64List(3), equals(integers)); + }, testOn: 'vm' /* Int64 isn't supported on web */); test('of float list when unaligned', () { final floats = Float32List.fromList([3.14, double.nan]); From 639e000120e623ea08fff00cc9a706ca6f5b43b7 Mon Sep 17 00:00:00 2001 From: stuartmorgan-g Date: Wed, 20 May 2026 07:18:07 -0400 Subject: [PATCH 115/118] [tool] Unify most validation commands (#11641) Replaces all of the following repo tooling commands with a new unified `validate` command: - `dependabot-check` - `gradle-check` - `pubspec-check` - `readme-check` - `repo-package-info-check` - `version-check` It also makes some simplifications in using these: - Temporarily disabling the code excerpt check is now done via package-level ci_config.yaml files. This means that we don't have to exempt a package from the entire command just for this, and also means that fixing a package and removing its exemption will no longer trigger whole-repo testing as it used to. - Setting the min Flutter version allowed for the repo is now a repo-level config in a new root level `tool_config/` directory. This avoids the need to pass a flag every time for something that isn't actually intended to be variable. - The allowed dependencies are now also in hard-coded locations in the `tool_config/` directory, instead of having to pass them in all the time, to make the commands easier to call. As with min SDK version, this isn't something callers actually need to be able to change on the fly to the flags add more complexity (in exchange for making it extremely clear at the CI call site what was happening, but I no longer think that tradeoff is the right one based on experience using the tool). To avoid huge amounts of test file churn, and massively complicating test setup, there is a test-only mechanism to select individual validators to run in tests, rather than having to test the entire command at once. Part of https://github.com/flutter/flutter/issues/173413 --- third_party/packages/mustache_template/ci_config.yaml | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 third_party/packages/mustache_template/ci_config.yaml diff --git a/third_party/packages/mustache_template/ci_config.yaml b/third_party/packages/mustache_template/ci_config.yaml new file mode 100644 index 0000000..b352e13 --- /dev/null +++ b/third_party/packages/mustache_template/ci_config.yaml @@ -0,0 +1,2 @@ +# TODO(stuartmorgan): Remove this; see https://github.com/flutter/flutter/issues/102679 +exempt_from_excerpts: true From 39a1cc8778c2845e4811670a8983da8e162c52a0 Mon Sep 17 00:00:00 2001 From: stuartmorgan-g Date: Wed, 20 May 2026 09:33:11 -0400 Subject: [PATCH 116/118] [ci] Update repo for 3.44 stable release (#11741) Does the steps for https://github.com/flutter/flutter/blob/master/docs/ecosystem/release/Updating-Packages-repo-for-a-stable-release.md for the 3.44 stable release. --- packages/flutter_template_images/CHANGELOG.md | 2 +- packages/flutter_template_images/pubspec.yaml | 2 +- packages/multicast_dns/CHANGELOG.md | 2 +- packages/multicast_dns/pubspec.yaml | 2 +- packages/standard_message_codec/CHANGELOG.md | 2 +- packages/standard_message_codec/example/pubspec.yaml | 2 +- packages/standard_message_codec/pubspec.yaml | 2 +- third_party/packages/mustache_template/CHANGELOG.md | 4 ++++ third_party/packages/mustache_template/pubspec.yaml | 2 +- 9 files changed, 12 insertions(+), 8 deletions(-) diff --git a/packages/flutter_template_images/CHANGELOG.md b/packages/flutter_template_images/CHANGELOG.md index 724f0bc..9e39d26 100644 --- a/packages/flutter_template_images/CHANGELOG.md +++ b/packages/flutter_template_images/CHANGELOG.md @@ -1,6 +1,6 @@ ## NEXT -* Updates minimum supported SDK version to Flutter 3.35/Dart 3.9. +* Updates minimum supported SDK version to Flutter 3.38/Dart 3.10. ## 5.0.0 diff --git a/packages/flutter_template_images/pubspec.yaml b/packages/flutter_template_images/pubspec.yaml index 3a57dd8..37d7d32 100644 --- a/packages/flutter_template_images/pubspec.yaml +++ b/packages/flutter_template_images/pubspec.yaml @@ -5,7 +5,7 @@ issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+ version: 5.0.0 environment: - sdk: ^3.9.0 + sdk: ^3.10.0 topics: - assets diff --git a/packages/multicast_dns/CHANGELOG.md b/packages/multicast_dns/CHANGELOG.md index ab44bf6..4313ece 100644 --- a/packages/multicast_dns/CHANGELOG.md +++ b/packages/multicast_dns/CHANGELOG.md @@ -1,6 +1,6 @@ ## NEXT -* Updates minimum supported SDK version to Flutter 3.35/Dart 3.9. +* Updates minimum supported SDK version to Flutter 3.38/Dart 3.10. ## 0.3.3 diff --git a/packages/multicast_dns/pubspec.yaml b/packages/multicast_dns/pubspec.yaml index ebd2ed2..a0fb4c7 100644 --- a/packages/multicast_dns/pubspec.yaml +++ b/packages/multicast_dns/pubspec.yaml @@ -5,7 +5,7 @@ issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+ version: 0.3.3 environment: - sdk: ^3.9.0 + sdk: ^3.10.0 dependencies: meta: ^1.3.0 diff --git a/packages/standard_message_codec/CHANGELOG.md b/packages/standard_message_codec/CHANGELOG.md index a9879af..a95327f 100644 --- a/packages/standard_message_codec/CHANGELOG.md +++ b/packages/standard_message_codec/CHANGELOG.md @@ -1,6 +1,6 @@ ## NEXT -* Updates minimum supported SDK version to Flutter 3.35/Dart 3.9. +* Updates minimum supported SDK version to Flutter 3.38/Dart 3.10. ## 0.0.1+4 diff --git a/packages/standard_message_codec/example/pubspec.yaml b/packages/standard_message_codec/example/pubspec.yaml index d77511f..bb82064 100644 --- a/packages/standard_message_codec/example/pubspec.yaml +++ b/packages/standard_message_codec/example/pubspec.yaml @@ -4,7 +4,7 @@ version: 0.0.1 publish_to: none environment: - sdk: ^3.9.0 + sdk: ^3.10.0 dependencies: standard_message_codec: diff --git a/packages/standard_message_codec/pubspec.yaml b/packages/standard_message_codec/pubspec.yaml index 2492ec9..d918d24 100644 --- a/packages/standard_message_codec/pubspec.yaml +++ b/packages/standard_message_codec/pubspec.yaml @@ -5,7 +5,7 @@ repository: https://github.com/flutter/packages/tree/main/packages/standard_mess issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3Astandard_message_codec environment: - sdk: ^3.9.0 + sdk: ^3.10.0 dev_dependencies: test: ^1.16.0 diff --git a/third_party/packages/mustache_template/CHANGELOG.md b/third_party/packages/mustache_template/CHANGELOG.md index 634e9ab..80e6518 100644 --- a/third_party/packages/mustache_template/CHANGELOG.md +++ b/third_party/packages/mustache_template/CHANGELOG.md @@ -1,3 +1,7 @@ +## NEXT + +* Updates minimum supported SDK version to Flutter 3.38/Dart 3.10. + ## 2.0.4 * Fixes a broken README link to the Mustache manual. diff --git a/third_party/packages/mustache_template/pubspec.yaml b/third_party/packages/mustache_template/pubspec.yaml index 8a8bdea..52b9bea 100644 --- a/third_party/packages/mustache_template/pubspec.yaml +++ b/third_party/packages/mustache_template/pubspec.yaml @@ -5,7 +5,7 @@ issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+ version: 2.0.4 environment: - sdk: ^3.9.0 + sdk: ^3.10.0 dev_dependencies: test: ^1.16.5 From f100e24325f2e47d30344dddeeb0d2109bbd2e6b Mon Sep 17 00:00:00 2001 From: Justin McCandless Date: Wed, 3 Jun 2026 10:07:10 -0700 Subject: [PATCH 117/118] Updated analysis_options line width from flutter/flutter (#11692) It seems like we're supposed to keep analysis_options.dart in sync with the one in flutter/flutter, but we haven't done it since 2023. This PR updates it. The most disruptive change appears to be the increased page width. I'm inspired to update this after working on https://github.com/flutter/packages/pull/11669, which imports flutter/flutter code that is formatted according to the latest rules. Better to update the rules than to format the new code back to the old rules. *Update*: This only updates the line width. Other changes will follow. --- packages/multicast_dns/example/main.dart | 3 +- .../multicast_dns/example/mdns_resolve.dart | 14 +- packages/multicast_dns/example/mdns_sd.dart | 14 +- packages/multicast_dns/lib/multicast_dns.dart | 26 +- .../lib/src/lookup_resolver.dart | 9 +- .../lib/src/native_protocol_client.dart | 20 +- packages/multicast_dns/lib/src/packet.dart | 51 +-- .../lib/src/resource_record.dart | 34 +- packages/multicast_dns/test/client_test.dart | 29 +- packages/multicast_dns/test/decode_test.dart | 54 +-- .../test/lookup_resolver_test.dart | 30 +- .../test/resource_record_cache_test.dart | 15 +- packages/standard_message_codec/README.md | 7 +- .../example/lib/readme_excerpts.dart | 7 +- .../lib/src/serialization.dart | 44 +-- .../test/standard_message_codec_test.dart | 17 +- .../lib/src/lambda_context.dart | 15 +- .../mustache_template/lib/src/node.dart | 14 +- .../mustache_template/lib/src/parser.dart | 58 +-- .../mustache_template/lib/src/renderer.dart | 12 +- .../mustache_template/lib/src/scanner.dart | 17 +- .../lib/src/template_exception.dart | 4 +- .../mustache_template/test/feature_test.dart | 357 ++++++------------ .../test/mustache_specs.dart | 32 +- .../mustache_template/test/parser_test.dart | 51 +-- .../mustache_template/tool/download_spec.dart | 18 +- 26 files changed, 270 insertions(+), 682 deletions(-) diff --git a/packages/multicast_dns/example/main.dart b/packages/multicast_dns/example/main.dart index bb441d7..89d77d2 100644 --- a/packages/multicast_dns/example/main.dart +++ b/packages/multicast_dns/example/main.dart @@ -29,8 +29,7 @@ Future main() async { ResourceRecordQuery.service(ptr.domainName), )) { // Domain name will be something like "io.flutter.example@some-iphone.local._dartobservatory._tcp.local" - final String bundleId = - ptr.domainName; //.substring(0, ptr.domainName.indexOf('@')); + final String bundleId = ptr.domainName; //.substring(0, ptr.domainName.indexOf('@')); print( 'Dart observatory instance found at ' '${srv.target}:${srv.port} for "$bundleId".', diff --git a/packages/multicast_dns/example/mdns_resolve.dart b/packages/multicast_dns/example/mdns_resolve.dart index ed43014..32f5d5b 100644 --- a/packages/multicast_dns/example/mdns_resolve.dart +++ b/packages/multicast_dns/example/mdns_resolve.dart @@ -23,17 +23,15 @@ For example: final client = MDnsClient(); await client.start(); - await for (final IPAddressResourceRecord record - in client.lookup( - ResourceRecordQuery.addressIPv4(name), - )) { + await for (final IPAddressResourceRecord record in client.lookup( + ResourceRecordQuery.addressIPv4(name), + )) { print('Found address (${record.address}).'); } - await for (final IPAddressResourceRecord record - in client.lookup( - ResourceRecordQuery.addressIPv6(name), - )) { + await for (final IPAddressResourceRecord record in client.lookup( + ResourceRecordQuery.addressIPv6(name), + )) { print('Found address (${record.address}).'); } client.stop(); diff --git a/packages/multicast_dns/example/mdns_sd.dart b/packages/multicast_dns/example/mdns_sd.dart index 1d2f362..7fd5414 100644 --- a/packages/multicast_dns/example/mdns_sd.dart +++ b/packages/multicast_dns/example/mdns_sd.dart @@ -41,10 +41,9 @@ For example: .lookup(ResourceRecordQuery.text(ptr.domainName)) .forEach(print); } - await for (final IPAddressResourceRecord ip - in client.lookup( - ResourceRecordQuery.addressIPv4(srv.target), - )) { + await for (final IPAddressResourceRecord ip in client.lookup( + ResourceRecordQuery.addressIPv4(srv.target), + )) { if (verbose) { print(ip); } @@ -53,10 +52,9 @@ For example: '${srv.target}:${srv.port} with ${ip.address}.', ); } - await for (final IPAddressResourceRecord ip - in client.lookup( - ResourceRecordQuery.addressIPv6(srv.target), - )) { + await for (final IPAddressResourceRecord ip in client.lookup( + ResourceRecordQuery.addressIPv6(srv.target), + )) { if (verbose) { print(ip); } diff --git a/packages/multicast_dns/lib/multicast_dns.dart b/packages/multicast_dns/lib/multicast_dns.dart index 3b5b2b5..98eeff7 100644 --- a/packages/multicast_dns/lib/multicast_dns.dart +++ b/packages/multicast_dns/lib/multicast_dns.dart @@ -47,9 +47,8 @@ typedef RawDatagramSocketFactory = /// section 5.1 of [RFC 6762](https://tools.ietf.org/html/rfc6762). class MDnsClient { /// Create a new [MDnsClient]. - MDnsClient({ - RawDatagramSocketFactory rawDatagramSocketFactory = RawDatagramSocket.bind, - }) : _rawDatagramSocketFactory = rawDatagramSocketFactory; + MDnsClient({RawDatagramSocketFactory rawDatagramSocketFactory = RawDatagramSocket.bind}) + : _rawDatagramSocketFactory = rawDatagramSocketFactory; bool _starting = false; bool _started = false; @@ -63,14 +62,8 @@ class MDnsClient { int? _mDnsPort; /// Find all network interfaces with an the [InternetAddressType] specified. - Future> allInterfacesFactory( - InternetAddressType type, - ) { - return NetworkInterface.list( - includeLinkLocal: true, - type: type, - includeLoopback: true, - ); + Future> allInterfacesFactory(InternetAddressType type) { + return NetworkInterface.list(includeLinkLocal: true, type: type, includeLoopback: true); } /// Start the mDNS client. @@ -168,10 +161,7 @@ class MDnsClient { // Join multicast on this interface. incoming.joinMulticast(_mDnsAddress!, interface); } - incoming.listen( - (RawSocketEvent event) => _handleIncoming(event, incoming), - onError: onError, - ); + incoming.listen((RawSocketEvent event) => _handleIncoming(event, incoming), onError: onError); _started = true; _starting = false; } @@ -218,11 +208,7 @@ class MDnsClient { } // Look for entries in the cache. final cached = []; - _cache.lookup( - query.fullyQualifiedName, - query.resourceRecordType, - cached, - ); + _cache.lookup(query.fullyQualifiedName, query.resourceRecordType, cached); if (cached.isNotEmpty) { final controller = StreamController(); cached.forEach(controller.add); diff --git a/packages/multicast_dns/lib/src/lookup_resolver.dart b/packages/multicast_dns/lib/src/lookup_resolver.dart index bca9c16..9a6add1 100644 --- a/packages/multicast_dns/lib/src/lookup_resolver.dart +++ b/packages/multicast_dns/lib/src/lookup_resolver.dart @@ -31,15 +31,10 @@ base class PendingRequest extends LinkedListEntry { /// Class for keeping track of pending lookups and processing incoming /// query responses. class LookupResolver { - final LinkedList _pendingRequests = - LinkedList(); + final LinkedList _pendingRequests = LinkedList(); /// Adds a request and returns a [Stream] of [ResourceRecord] responses. - Stream addPendingRequest( - int type, - String name, - Duration timeout, - ) { + Stream addPendingRequest(int type, String name, Duration timeout) { final controller = StreamController(); final request = PendingRequest(type, name, controller); final timer = Timer(timeout, () { diff --git a/packages/multicast_dns/lib/src/native_protocol_client.dart b/packages/multicast_dns/lib/src/native_protocol_client.dart index 89ea986..96eb89f 100644 --- a/packages/multicast_dns/lib/src/native_protocol_client.dart +++ b/packages/multicast_dns/lib/src/native_protocol_client.dart @@ -26,8 +26,7 @@ class ResourceRecordCache { /// The number of entries in the cache. int get entryCount { var count = 0; - for (final SplayTreeMap> map - in _cache.values) { + for (final SplayTreeMap> map in _cache.values) { for (final List records in map.values) { count += records.length; } @@ -46,12 +45,9 @@ class ResourceRecordCache { seenRecordTypes[record.resourceRecordType] ??= Set(); // ignore: prefer_collection_literals if (seenRecordTypes[record.resourceRecordType]!.add(record.name)) { - _cache[record.resourceRecordType] ??= - SplayTreeMap>(); + _cache[record.resourceRecordType] ??= SplayTreeMap>(); - _cache[record.resourceRecordType]![record.name] = [ - record, - ]; + _cache[record.resourceRecordType]![record.name] = [record]; } else { _cache[record.resourceRecordType]![record.name]!.add(record); } @@ -59,11 +55,7 @@ class ResourceRecordCache { } /// Get a record from this cache. - void lookup( - String name, - int type, - List results, - ) { + void lookup(String name, int type, List results) { assert(ResourceRecordType.debugAssertValid(type)); final int time = DateTime.now().millisecondsSinceEpoch; final SplayTreeMap>? candidates = _cache[type]; @@ -75,9 +67,7 @@ class ResourceRecordCache { if (candidateRecords == null) { return; } - candidateRecords.removeWhere( - (ResourceRecord candidate) => candidate.validUntil < time, - ); + candidateRecords.removeWhere((ResourceRecord candidate) => candidate.validUntil < time); results.addAll(candidateRecords.cast()); } } diff --git a/packages/multicast_dns/lib/src/packet.dart b/packages/multicast_dns/lib/src/packet.dart index a914370..bbbe8dc 100644 --- a/packages/multicast_dns/lib/src/packet.dart +++ b/packages/multicast_dns/lib/src/packet.dart @@ -89,8 +89,7 @@ List encodeMDnsQuery( offset += 2; packetByteData.setUint16( offset, - ResourceRecordClass.internet | - (multicast ? QuestionType.multicast : QuestionType.unicast), + ResourceRecordClass.internet | (multicast ? QuestionType.multicast : QuestionType.unicast), ); return data; @@ -116,9 +115,7 @@ class _FQDNReadResult { /// Reads a FQDN from raw packet data. String readFQDN(List packet, [int offset = 0]) { - final Uint8List data = packet is Uint8List - ? packet - : Uint8List.fromList(packet); + final Uint8List data = packet is Uint8List ? packet : Uint8List.fromList(packet); final byteData = ByteData.view(data.buffer); return _readFQDN(data, byteData, offset, data.length).fqdn; @@ -128,12 +125,7 @@ String readFQDN(List packet, [int offset = 0]) { // parts and the number of bytes consumed. // // If decoding fails (e.g. due to an invalid packet) `null` is returned. -_FQDNReadResult _readFQDN( - Uint8List data, - ByteData byteData, - int offset, - int length, -) { +_FQDNReadResult _readFQDN(Uint8List data, ByteData byteData, int offset, int length) { void checkLength(int required) { if (length < required) { throw MDnsDecodeException(required); @@ -203,9 +195,7 @@ List? decodeMDnsResponse(List packet) { return null; } - final Uint8List data = packet is Uint8List - ? packet - : Uint8List.fromList(packet); + final Uint8List data = packet is Uint8List ? packet : Uint8List.fromList(packet); final packetBytes = ByteData.view(data.buffer); final int answerCount = packetBytes.getUint16(_kAncountOffset); @@ -265,11 +255,7 @@ List? decodeMDnsResponse(List packet) { addr.write('.'); addr.write(packetBytes.getUint8(offset)); } - return IPAddressResourceRecord( - fqdn, - validUntil, - address: InternetAddress(addr.toString()), - ); + return IPAddressResourceRecord(fqdn, validUntil, address: InternetAddress(addr.toString())); case ResourceRecordType.addressIPv6: checkLength(offset + readDataLength); final addr = StringBuffer(); @@ -280,11 +266,7 @@ List? decodeMDnsResponse(List packet) { addr.write(':'); addr.write(packetBytes.getUint16(offset).toRadixString(16)); } - return IPAddressResourceRecord( - fqdn, - validUntil, - address: InternetAddress(addr.toString()), - ); + return IPAddressResourceRecord(fqdn, validUntil, address: InternetAddress(addr.toString())); case ResourceRecordType.service: checkLength(offset + 2); final int priority = packetBytes.getUint16(offset); @@ -295,12 +277,7 @@ List? decodeMDnsResponse(List packet) { checkLength(offset + 2); final int port = packetBytes.getUint16(offset); offset += 2; - final _FQDNReadResult result = _readFQDN( - data, - packetBytes, - offset, - length, - ); + final _FQDNReadResult result = _readFQDN(data, packetBytes, offset, length); offset += result.bytesRead; return SrvResourceRecord( fqdn, @@ -312,12 +289,7 @@ List? decodeMDnsResponse(List packet) { ); case ResourceRecordType.serverPointer: checkLength(offset + readDataLength); - final _FQDNReadResult result = _readFQDN( - data, - packetBytes, - offset, - length, - ); + final _FQDNReadResult result = _readFQDN(data, packetBytes, offset, length); offset += readDataLength; return PtrResourceRecord(fqdn, validUntil, domainName: result.fqdn); case ResourceRecordType.text: @@ -356,12 +328,7 @@ List? decodeMDnsResponse(List packet) { try { for (var i = 0; i < questionCount; i++) { - final _FQDNReadResult result = _readFQDN( - data, - packetBytes, - offset, - length, - ); + final _FQDNReadResult result = _readFQDN(data, packetBytes, offset, length); offset += result.bytesRead; checkLength(offset + 4); offset += 4; diff --git a/packages/multicast_dns/lib/src/resource_record.dart b/packages/multicast_dns/lib/src/resource_record.dart index f16d9a1..86a0a4e 100644 --- a/packages/multicast_dns/lib/src/resource_record.dart +++ b/packages/multicast_dns/lib/src/resource_record.dart @@ -73,11 +73,8 @@ class ResourceRecordQuery { /// Creates a new ResourceRecordQuery. /// /// Most callers should prefer one of the named constructors. - ResourceRecordQuery( - this.resourceRecordType, - this.fullyQualifiedName, - this.questionType, - ) : assert(ResourceRecordType.debugAssertValid(resourceRecordType)); + ResourceRecordQuery(this.resourceRecordType, this.fullyQualifiedName, this.questionType) + : assert(ResourceRecordType.debugAssertValid(resourceRecordType)); /// An A (IPv4) query. ResourceRecordQuery.addressIPv4(String name, {bool isMulticast = true}) @@ -136,16 +133,11 @@ class ResourceRecordQuery { /// Encodes this query to the raw wire format. List encode() { - return encodeMDnsQuery( - fullyQualifiedName, - type: resourceRecordType, - multicast: isMulticast, - ); + return encodeMDnsQuery(fullyQualifiedName, type: resourceRecordType, multicast: isMulticast); } @override - int get hashCode => - Object.hash(resourceRecordType, fullyQualifiedName, questionType); + int get hashCode => Object.hash(resourceRecordType, fullyQualifiedName, questionType); @override bool operator ==(Object other) { @@ -203,11 +195,8 @@ abstract class ResourceRecord { /// A Service Pointer for reverse mapping an IP address (DNS "PTR"). class PtrResourceRecord extends ResourceRecord { /// Creates a new PtrResourceRecord. - const PtrResourceRecord( - String name, - int validUntil, { - required this.domainName, - }) : super(ResourceRecordType.serverPointer, name, validUntil); + const PtrResourceRecord(String name, int validUntil, {required this.domainName}) + : super(ResourceRecordType.serverPointer, name, validUntil); /// The FQDN for this record. final String domainName; @@ -220,9 +209,7 @@ class PtrResourceRecord extends ResourceRecord { @override bool operator ==(Object other) { - return super == other && - other is PtrResourceRecord && - other.domainName == domainName; + return super == other && other is PtrResourceRecord && other.domainName == domainName; } @override @@ -254,9 +241,7 @@ class IPAddressResourceRecord extends ResourceRecord { @override bool operator ==(Object other) { - return super == other && - other is IPAddressResourceRecord && - other.address == address; + return super == other && other is IPAddressResourceRecord && other.address == address; } @override @@ -294,8 +279,7 @@ class SrvResourceRecord extends ResourceRecord { 'target: $target, port: $port, priority: $priority, weight: $weight'; @override - int get hashCode => - Object.hash(target, port, priority, weight, super.hashCode); + int get hashCode => Object.hash(target, port, priority, weight, super.hashCode); @override bool operator ==(Object other) { diff --git a/packages/multicast_dns/test/client_test.dart b/packages/multicast_dns/test/client_test.dart index 44a4626..1250802 100644 --- a/packages/multicast_dns/test/client_test.dart +++ b/packages/multicast_dns/test/client_test.dart @@ -30,8 +30,7 @@ void main() { await client.start( mDnsPort: 1234, - interfacesFactory: (InternetAddressType type) async => - [], + interfacesFactory: (InternetAddressType type) async => [], ); expect(lastPort, 1234); @@ -54,8 +53,7 @@ void main() { await client.start( mDnsPort: 1234, - interfacesFactory: (InternetAddressType type) async => - [], + interfacesFactory: (InternetAddressType type) async => [], ); expect(datagramSocket.closed, false); client.stop(); @@ -80,8 +78,7 @@ void main() { await client.start( mDnsPort: 1234, - interfacesFactory: (InternetAddressType type) async => - [], + interfacesFactory: (InternetAddressType type) async => [], ); expect(datagramSocket.closed, false); client.stop(); @@ -104,10 +101,7 @@ void main() { }, ); - await client.start( - interfacesFactory: (InternetAddressType type) async => - [], - ); + await client.start(interfacesFactory: (InternetAddressType type) async => []); await client.start(); await client.lookup(ResourceRecordQuery.serverPointer('_')).toList(); }); @@ -209,8 +203,7 @@ void main() { final onErrorCalledCompleter = Completer(); await client.start( mDnsPort: 1234, - interfacesFactory: (InternetAddressType type) async => - [], + interfacesFactory: (InternetAddressType type) async => [], onError: (Object e) { expect(e, 'Error'); onErrorCalledCompleter.complete(); @@ -262,8 +255,7 @@ class FakeRawDatagramSocket extends Fake implements RawDatagramSocket { } } -class FakeRawDatagramSocketThatSendsError extends Fake - implements RawDatagramSocket { +class FakeRawDatagramSocketThatSendsError extends Fake implements RawDatagramSocket { @override InternetAddress address = InternetAddress.anyIPv4; @@ -274,12 +266,9 @@ class FakeRawDatagramSocketThatSendsError extends Fake void Function()? onDone, bool? cancelOnError, }) { - return Stream.error('Error').listen( - onData, - onError: onError, - cancelOnError: cancelOnError, - onDone: onDone, - ); + return Stream.error( + 'Error', + ).listen(onData, onError: onError, cancelOnError: cancelOnError, onDone: onDone); } } diff --git a/packages/multicast_dns/test/decode_test.dart b/packages/multicast_dns/test/decode_test.dart index b4712c8..930a4b9 100644 --- a/packages/multicast_dns/test/decode_test.dart +++ b/packages/multicast_dns/test/decode_test.dart @@ -58,11 +58,7 @@ void testValidPackages() { priority: 0, weight: 0, ), - TxtResourceRecord( - 'raspberrypi._udisks-ssh._tcp.local', - result[3].validUntil, - text: '', - ), + TxtResourceRecord('raspberrypi._udisks-ssh._tcp.local', result[3].validUntil, text: ''), PtrResourceRecord( '_services._dns-sd._udp.local', result[4].validUntil, @@ -129,9 +125,7 @@ void testValidPackages() { // Fixes https://github.com/flutter/flutter/issues/31854 test('Can decode packages with question, answer and additional', () { - final List result = decodeMDnsResponse( - packetWithQuestionAnArCount, - )!; + final List result = decodeMDnsResponse(packetWithQuestionAnArCount)!; expect(result, isNotNull); expect(result.length, 2); expect(result, [ @@ -149,28 +143,23 @@ void testValidPackages() { }); // Fixes https://github.com/flutter/flutter/issues/31854 - test( - 'Can decode packages without question and with answer and additional', - () { - final List result = decodeMDnsResponse( - packetWithoutQuestionWithAnArCount, - )!; - expect(result, isNotNull); - expect(result.length, 2); - expect(result, [ - PtrResourceRecord( - '_______________.____._____', - result[0].validUntil, - domainName: '______________________._______________.____._____', - ), - TxtResourceRecord( - '______________________.____________.____._____', - result[1].validUntil, - text: 'model=MacBookPro14,3\nosxvers=18\necolor=225,225,223\n', - ), - ]); - }, - ); + test('Can decode packages without question and with answer and additional', () { + final List result = decodeMDnsResponse(packetWithoutQuestionWithAnArCount)!; + expect(result, isNotNull); + expect(result.length, 2); + expect(result, [ + PtrResourceRecord( + '_______________.____._____', + result[0].validUntil, + domainName: '______________________._______________.____._____', + ), + TxtResourceRecord( + '______________________.____________.____._____', + result[1].validUntil, + text: 'model=MacBookPro14,3\nosxvers=18\necolor=225,225,223\n', + ), + ]); + }); test('Can decode packages with a long text resource', () { final List result = decodeMDnsResponse(packetWithLongTxt)!; @@ -207,10 +196,7 @@ void testBadPackages() { void testPTRRData() { test('Can read FQDN from PTR data', () { - expect( - 'sgjesse-macbookpro2 [78:31:c1:b8:55:38]._workstation._tcp.local', - readFQDN(ptrRData), - ); + expect('sgjesse-macbookpro2 [78:31:c1:b8:55:38]._workstation._tcp.local', readFQDN(ptrRData)); expect('fletch-agent._fletch_agent._tcp.local', readFQDN(ptrRData2)); }); } diff --git a/packages/multicast_dns/test/lookup_resolver_test.dart b/packages/multicast_dns/test/lookup_resolver_test.dart index f67549b..6346c07 100644 --- a/packages/multicast_dns/test/lookup_resolver_test.dart +++ b/packages/multicast_dns/test/lookup_resolver_test.dart @@ -43,10 +43,7 @@ void testResult() { 'xxx.local', noTimeout, ); - final ResourceRecord response = ip4Result( - 'xxx.local', - InternetAddress('1.2.3.4'), - ); + final ResourceRecord response = ip4Result('xxx.local', InternetAddress('1.2.3.4')); resolver.handleResponse([response]); final result = await futureResult.first as IPAddressResourceRecord; expect('1.2.3.4', result.address.address); @@ -68,14 +65,8 @@ void testResult2() { 'yyy.local', noTimeout, ); - final ResourceRecord response1 = ip4Result( - 'xxx.local', - InternetAddress('1.2.3.4'), - ); - final ResourceRecord response2 = ip4Result( - 'yyy.local', - InternetAddress('2.3.4.5'), - ); + final ResourceRecord response1 = ip4Result('xxx.local', InternetAddress('1.2.3.4')); + final ResourceRecord response2 = ip4Result('yyy.local', InternetAddress('2.3.4.5')); resolver.handleResponse([response2, response1]); final result1 = await futureResult1.first as IPAddressResourceRecord; final result2 = await futureResult2.first as IPAddressResourceRecord; @@ -89,10 +80,7 @@ void testResult3() { test('Multiple requests', () async { const noTimeout = Duration(days: 1); final resolver = LookupResolver(); - final ResourceRecord response0 = ip4Result( - 'zzz.local', - InternetAddress('2.3.4.5'), - ); + final ResourceRecord response0 = ip4Result('zzz.local', InternetAddress('2.3.4.5')); resolver.handleResponse([response0]); final Stream futureResult1 = resolver.addPendingRequest( ResourceRecordType.addressIPv4, @@ -106,15 +94,9 @@ void testResult3() { noTimeout, ); resolver.handleResponse([response0]); - final ResourceRecord response1 = ip4Result( - 'xxx.local', - InternetAddress('1.2.3.4'), - ); + final ResourceRecord response1 = ip4Result('xxx.local', InternetAddress('1.2.3.4')); resolver.handleResponse([response0]); - final ResourceRecord response2 = ip4Result( - 'yyy.local', - InternetAddress('2.3.4.5'), - ); + final ResourceRecord response2 = ip4Result('yyy.local', InternetAddress('2.3.4.5')); resolver.handleResponse([response0]); resolver.handleResponse([response2, response1]); resolver.handleResponse([response0]); diff --git a/packages/multicast_dns/test/resource_record_cache_test.dart b/packages/multicast_dns/test/resource_record_cache_test.dart index 9ecb88d..5b4ad99 100644 --- a/packages/multicast_dns/test/resource_record_cache_test.dart +++ b/packages/multicast_dns/test/resource_record_cache_test.dart @@ -8,8 +8,7 @@ import 'dart:io'; -import 'package:multicast_dns/src/native_protocol_client.dart' - show ResourceRecordCache; +import 'package:multicast_dns/src/native_protocol_client.dart' show ResourceRecordCache; import 'package:multicast_dns/src/resource_record.dart'; import 'package:test/test.dart'; @@ -49,9 +48,7 @@ void testOverwrite() { expect(cache.entryCount, 3); // Overwrite the two cached entries with one with the same name. - cache.updateRecords([ - IPAddressResourceRecord('hest', valid, address: ip1), - ]); + cache.updateRecords([IPAddressResourceRecord('hest', valid, address: ip1)]); expect(cache.entryCount, 2); }); } @@ -64,14 +61,10 @@ void testTimeout() { final cache = ResourceRecordCache(); - cache.updateRecords([ - IPAddressResourceRecord('hest', valid, address: ip1), - ]); + cache.updateRecords([IPAddressResourceRecord('hest', valid, address: ip1)]); expect(cache.entryCount, 1); - cache.updateRecords([ - IPAddressResourceRecord('fisk', notValid, address: ip1), - ]); + cache.updateRecords([IPAddressResourceRecord('fisk', notValid, address: ip1)]); var results = []; cache.lookup('hest', ResourceRecordType.addressIPv4, results); diff --git a/packages/standard_message_codec/README.md b/packages/standard_message_codec/README.md index 9714a6d..b6e020c 100644 --- a/packages/standard_message_codec/README.md +++ b/packages/standard_message_codec/README.md @@ -45,9 +45,10 @@ or pure Dart applications. ```dart void main() { - final ByteData? data = const StandardMessageCodec().encodeMessage( - {'foo': true, 3: 'fizz'}, - ); + final ByteData? data = const StandardMessageCodec().encodeMessage({ + 'foo': true, + 3: 'fizz', + }); print('The encoded message is $data'); } diff --git a/packages/standard_message_codec/example/lib/readme_excerpts.dart b/packages/standard_message_codec/example/lib/readme_excerpts.dart index 5bf151d..6d6b1e4 100644 --- a/packages/standard_message_codec/example/lib/readme_excerpts.dart +++ b/packages/standard_message_codec/example/lib/readme_excerpts.dart @@ -12,9 +12,10 @@ import 'package:standard_message_codec/standard_message_codec.dart'; // #docregion Encoding void main() { - final ByteData? data = const StandardMessageCodec().encodeMessage( - {'foo': true, 3: 'fizz'}, - ); + final ByteData? data = const StandardMessageCodec().encodeMessage({ + 'foo': true, + 3: 'fizz', + }); print('The encoded message is $data'); } diff --git a/packages/standard_message_codec/lib/src/serialization.dart b/packages/standard_message_codec/lib/src/serialization.dart index 7229ef3..10a98fd 100644 --- a/packages/standard_message_codec/lib/src/serialization.dart +++ b/packages/standard_message_codec/lib/src/serialization.dart @@ -6,14 +6,7 @@ import 'dart:math' as math; import 'dart:typed_data'; export 'dart:typed_data' - show - ByteData, - Endian, - Float32List, - Float64List, - Int32List, - Int64List, - Uint8List; + show ByteData, Endian, Float32List, Float64List, Int32List, Int64List, Uint8List; /// Write-only buffer for incrementally building a [ByteData] instance. /// @@ -30,11 +23,7 @@ class WriteBuffer { assert(startCapacity > 0); final eightBytes = ByteData(8); final Uint8List eightBytesAsList = eightBytes.buffer.asUint8List(); - return WriteBuffer._( - Uint8List(startCapacity), - eightBytes, - eightBytesAsList, - ); + return WriteBuffer._(Uint8List(startCapacity), eightBytes, eightBytesAsList); } WriteBuffer._(this._buffer, this._eightBytes, this._eightBytesAsList); @@ -168,9 +157,7 @@ class WriteBuffer { /// Finalize and return the written [ByteData]. ByteData done() { if (_isDone) { - throw StateError( - 'done() must not be called more than once on the same $runtimeType.', - ); + throw StateError('done() must not be called more than once on the same $runtimeType.'); } final ByteData result = _buffer.buffer.asByteData(0, _currentSize); _buffer = Uint8List(0); @@ -238,10 +225,7 @@ class ReadBuffer { /// Reads the given number of Uint8s from the buffer. Uint8List getUint8List(int length) { - final Uint8List list = data.buffer.asUint8List( - data.offsetInBytes + _position, - length, - ); + final Uint8List list = data.buffer.asUint8List(data.offsetInBytes + _position, length); _position += length; return list; } @@ -249,10 +233,7 @@ class ReadBuffer { /// Reads the given number of Int32s from the buffer. Int32List getInt32List(int length) { _alignTo(4); - final Int32List list = data.buffer.asInt32List( - data.offsetInBytes + _position, - length, - ); + final Int32List list = data.buffer.asInt32List(data.offsetInBytes + _position, length); _position += 4 * length; return list; } @@ -260,10 +241,7 @@ class ReadBuffer { /// Reads the given number of Int64s from the buffer. Int64List getInt64List(int length) { _alignTo(8); - final Int64List list = data.buffer.asInt64List( - data.offsetInBytes + _position, - length, - ); + final Int64List list = data.buffer.asInt64List(data.offsetInBytes + _position, length); _position += 8 * length; return list; } @@ -271,10 +249,7 @@ class ReadBuffer { /// Reads the given number of Float32s from the buffer Float32List getFloat32List(int length) { _alignTo(4); - final Float32List list = data.buffer.asFloat32List( - data.offsetInBytes + _position, - length, - ); + final Float32List list = data.buffer.asFloat32List(data.offsetInBytes + _position, length); _position += 4 * length; return list; } @@ -282,10 +257,7 @@ class ReadBuffer { /// Reads the given number of Float64s from the buffer. Float64List getFloat64List(int length) { _alignTo(8); - final Float64List list = data.buffer.asFloat64List( - data.offsetInBytes + _position, - length, - ); + final Float64List list = data.buffer.asFloat64List(data.offsetInBytes + _position, length); _position += 8 * length; return list; } diff --git a/packages/standard_message_codec/test/standard_message_codec_test.dart b/packages/standard_message_codec/test/standard_message_codec_test.dart index b0de991..470ae5c 100644 --- a/packages/standard_message_codec/test/standard_message_codec_test.dart +++ b/packages/standard_message_codec/test/standard_message_codec_test.dart @@ -12,15 +12,9 @@ const StandardMessageCodec messageCodec = StandardMessageCodec(); void main() { group('Standard method codec', () { test('Should encode and decode objects produced from codec', () { - final ByteData? data = messageCodec.encodeMessage({ - 'foo': true, - 3: 'fizz', - }); - - expect(messageCodec.decodeMessage(data), { - 'foo': true, - 3: 'fizz', - }); + final ByteData? data = messageCodec.encodeMessage({'foo': true, 3: 'fizz'}); + + expect(messageCodec.decodeMessage(data), {'foo': true, 3: 'fizz'}); }); }); @@ -152,10 +146,7 @@ void main() { }); test('empty WriteBuffer', () { - expect( - () => WriteBuffer(startCapacity: 0), - throwsA(isA()), - ); + expect(() => WriteBuffer(startCapacity: 0), throwsA(isA())); }); test('size 1', () { diff --git a/third_party/packages/mustache_template/lib/src/lambda_context.dart b/third_party/packages/mustache_template/lib/src/lambda_context.dart index 3cd72c3..1813637 100644 --- a/third_party/packages/mustache_template/lib/src/lambda_context.dart +++ b/third_party/packages/mustache_template/lib/src/lambda_context.dart @@ -26,21 +26,14 @@ class LambdaContext implements m.LambdaContext { } TemplateException _error(String msg) { - return TemplateException( - msg, - _renderer.templateName, - _renderer.source, - _node.start, - ); + return TemplateException(msg, _renderer.templateName, _renderer.source, _node.start); } @override String renderString({Object? value}) { _checkClosed(); if (_node is! SectionNode) { - throw _error( - 'LambdaContext.renderString() can only be called on section tags.', - ); + throw _error('LambdaContext.renderString() can only be called on section tags.'); } final sink = StringBuffer(); _renderSubtree(sink, value); @@ -60,9 +53,7 @@ class LambdaContext implements m.LambdaContext { void render({Object? value}) { _checkClosed(); if (_node is! SectionNode) { - throw _error( - 'LambdaContext.render() can only be called on section tags.', - ); + throw _error('LambdaContext.render() can only be called on section tags.'); } _renderSubtree(_renderer.sink, value); } diff --git a/third_party/packages/mustache_template/lib/src/node.dart b/third_party/packages/mustache_template/lib/src/node.dart index bc06b57..a6a208c 100644 --- a/third_party/packages/mustache_template/lib/src/node.dart +++ b/third_party/packages/mustache_template/lib/src/node.dart @@ -39,8 +39,7 @@ class TextNode extends Node { } class VariableNode extends Node { - VariableNode(this.name, int start, int end, {this.escape = true}) - : super(start, end); + VariableNode(this.name, int start, int end, {this.escape = true}) : super(start, end); final String name; final bool escape; @@ -53,14 +52,9 @@ class VariableNode extends Node { } class SectionNode extends Node { - SectionNode( - this.name, - int start, - int end, - this.delimiters, { - this.inverse = false, - }) : contentStart = end, - super(start, end); + SectionNode(this.name, int start, int end, this.delimiters, {this.inverse = false}) + : contentStart = end, + super(start, end); final String name; final String delimiters; diff --git a/third_party/packages/mustache_template/lib/src/parser.dart b/third_party/packages/mustache_template/lib/src/parser.dart index 4253ec3..e92378e 100644 --- a/third_party/packages/mustache_template/lib/src/parser.dart +++ b/third_party/packages/mustache_template/lib/src/parser.dart @@ -6,12 +6,7 @@ import 'scanner.dart'; import 'template_exception.dart'; import 'token.dart'; -List parse( - String source, - bool lenient, - String? templateName, - String delimiters, -) { +List parse(String source, bool lenient, String? templateName, String delimiters) { final parser = Parser(source, templateName, delimiters, lenient: lenient); return parser.parse(); } @@ -40,16 +35,12 @@ class TagType { } class Parser { - Parser( - String source, - String? templateName, - String delimiters, { - bool lenient = false, - }) : _source = source, - _templateName = templateName, - _delimiters = delimiters, - _lenient = lenient, - _scanner = Scanner(source, templateName, delimiters); + Parser(String source, String? templateName, String delimiters, {bool lenient = false}) + : _source = source, + _templateName = templateName, + _delimiters = delimiters, + _lenient = lenient, + _scanner = Scanner(source, templateName, delimiters); final String _source; final bool _lenient; @@ -146,8 +137,7 @@ class Parser { return token != null && token.type == type ? _read() : null; } - TemplateException _errorEof() => - _error('Unexpected end of input.', _source.length - 1); + TemplateException _errorEof() => _error('Unexpected end of input.', _source.length - 1); TemplateException _error(String msg, int offset) => TemplateException(msg, _templateName, _source, offset); @@ -237,19 +227,11 @@ class Parser { // standalone line. while (_peek() != null) { _readIf(TokenType.lineEnd, eofOk: true); - final Token? precedingWhitespace = _readIf( - TokenType.whitespace, - eofOk: true, - ); - final String indent = precedingWhitespace == null - ? '' - : precedingWhitespace.value; + final Token? precedingWhitespace = _readIf(TokenType.whitespace, eofOk: true); + final String indent = precedingWhitespace == null ? '' : precedingWhitespace.value; final Tag? tag = _readTag(); final Node? tagNode = _createNodeFromTag(tag, partialIndent: indent); - final Token? followingWhitespace = _readIf( - TokenType.whitespace, - eofOk: true, - ); + final Token? followingWhitespace = _readIf(TokenType.whitespace, eofOk: true); const standaloneTypes = [ TagType.openSection, @@ -299,9 +281,7 @@ class Parser { // If EOF or any another token then return null. Tag? _readTag() { final Token? t = _peek(); - if (t == null || - (t.type != TokenType.changeDelimiter && - t.type != TokenType.openDelimiter)) { + if (t == null || (t.type != TokenType.changeDelimiter && t.type != TokenType.openDelimiter)) { return null; } else if (t.type == TokenType.changeDelimiter) { _read(); @@ -338,11 +318,7 @@ class Parser { // TODOsplit up names here instead of during render. // Also check that they are valid token types. final list = []; - for ( - Token? t = _peek(); - t != null && t.type != TokenType.closeDelimiter; - t = _peek() - ) { + for (Token? t = _peek(); t != null && t.type != TokenType.closeDelimiter; t = _peek()) { _read(); list.add(t); } @@ -387,13 +363,7 @@ class Parser { case TagType.openSection: case TagType.openInverseSection: final inverse = tag.type == TagType.openInverseSection; - node = SectionNode( - tag.name, - tag.start, - tag.end, - _currentDelimiters, - inverse: inverse, - ); + node = SectionNode(tag.name, tag.start, tag.end, _currentDelimiters, inverse: inverse); case TagType.variable: case TagType.unescapedVariable: diff --git a/third_party/packages/mustache_template/lib/src/renderer.dart b/third_party/packages/mustache_template/lib/src/renderer.dart index 24125cd..2226bf1 100644 --- a/third_party/packages/mustache_template/lib/src/renderer.dart +++ b/third_party/packages/mustache_template/lib/src/renderer.dart @@ -195,10 +195,7 @@ class Renderer extends Visitor { if (lenient) { _renderWithValue(node, null); } else { - throw error( - 'Value was missing for inverse section: ${node.name}.', - node, - ); + throw error('Value was missing for inverse section: ${node.name}.', node); } } else if (value is Function) { // Do nothing. @@ -298,12 +295,7 @@ class Renderer extends Visitor { var startIndex = 0; var i = 0; for (final int c in s.runes) { - if (c == _AMP || - c == _LT || - c == _GT || - c == _QUOTE || - c == _APOS || - c == _FORWARD_SLASH) { + if (c == _AMP || c == _LT || c == _GT || c == _QUOTE || c == _APOS || c == _FORWARD_SLASH) { buffer.write(s.substring(startIndex, i)); buffer.write(_htmlEscapeMap[c]); startIndex = i + 1; diff --git a/third_party/packages/mustache_template/lib/src/scanner.dart b/third_party/packages/mustache_template/lib/src/scanner.dart index 04b01d5..00eabe7 100644 --- a/third_party/packages/mustache_template/lib/src/scanner.dart +++ b/third_party/packages/mustache_template/lib/src/scanner.dart @@ -27,12 +27,7 @@ class Scanner { _closeDelimiterInner = delimiters.codeUnits[3]; _closeDelimiter = delimiters.codeUnits[4]; } else { - throw TemplateException( - 'Invalid delimiter string $delimiters', - null, - null, - null, - ); + throw TemplateException('Invalid delimiter string $delimiters', null, null, null); } } @@ -138,12 +133,7 @@ class Scanner { final int c = _read(); if (c == _EOF) { - throw TemplateException( - 'Unexpected end of input', - _templateName, - _source, - _offset - 1, - ); + throw TemplateException('Unexpected end of input', _templateName, _source, _offset - 1); } if (c != expectedCharCode) { throw TemplateException( @@ -160,8 +150,7 @@ class Scanner { void _append(TokenType type, String value, int start, int end) => _tokens.add(Token(type, value, start, end)); - bool _isWhitespace(int c) => - const [_SPACE, _TAB, _NEWLINE, _RETURN].contains(c); + bool _isWhitespace(int c) => const [_SPACE, _TAB, _NEWLINE, _RETURN].contains(c); // Scan text. This adds text tokens, line end tokens, and whitespace // tokens for whitespace at the beginning of a line. This is because the diff --git a/third_party/packages/mustache_template/lib/src/template_exception.dart b/third_party/packages/mustache_template/lib/src/template_exception.dart index 2789676..35f16dd 100644 --- a/third_party/packages/mustache_template/lib/src/template_exception.dart +++ b/third_party/packages/mustache_template/lib/src/template_exception.dart @@ -57,9 +57,7 @@ class TemplateException implements m.TemplateException { } _isUpdated = true; - if (source == null || - offset == null || - (offset! < 0 || offset! > source!.length)) { + if (source == null || offset == null || (offset! < 0 || offset! > source!.length)) { return; } diff --git a/third_party/packages/mustache_template/test/feature_test.dart b/third_party/packages/mustache_template/test/feature_test.dart index 7f4ea4f..3ba8937 100644 --- a/third_party/packages/mustache_template/test/feature_test.dart +++ b/third_party/packages/mustache_template/test/feature_test.dart @@ -7,46 +7,41 @@ const String BAD_TAG_NAME = 'Unless in lenient mode, tags may only contain'; const String VALUE_MISSING = 'Value was missing'; const String UNCLOSED_TAG = 'Unclosed tag'; -Template parse(String source, {bool lenient = false}) => - Template(source, lenient: lenient); +Template parse(String source, {bool lenient = false}) => Template(source, lenient: lenient); void main() { group('Basic', () { test('Variable', () { - final String output = parse( - '_{{var}}_', - ).renderString({'var': 'bob'}); + final String output = parse('_{{var}}_').renderString({'var': 'bob'}); expect(output, equals('_bob_')); }); test('Comment', () { - final String output = parse( - '_{{! i am a\n comment ! }}_', - ).renderString({}); + final String output = parse('_{{! i am a\n comment ! }}_').renderString({}); expect(output, equals('__')); }); test('Emoji', () { - final String output = parse( - 'Hello! 🖖👍🏽\nBye! 🏳️‍🌈', - ).renderString({}); + final String output = parse('Hello! 🖖👍🏽\nBye! 🏳️‍🌈').renderString({}); expect(output, equals('Hello! 🖖👍🏽\nBye! 🏳️‍🌈')); }); }); group('Section', () { test('Map', () { - final String output = parse('{{#section}}_{{var}}_{{/section}}') - .renderString(>{ - 'section': {'var': 'bob'}, - }); + final String output = parse('{{#section}}_{{var}}_{{/section}}').renderString( + >{ + 'section': {'var': 'bob'}, + }, + ); expect(output, equals('_bob_')); }); test('List', () { - final String output = parse('{{#section}}_{{var}}_{{/section}}') - .renderString(>>{ - 'section': >[ - {'var': 'bob'}, - {'var': 'jim'}, - ], - }); + final String output = parse('{{#section}}_{{var}}_{{/section}}').renderString( + >>{ + 'section': >[ + {'var': 'bob'}, + {'var': 'jim'}, + ], + }, + ); expect(output, equals('_bob__jim_')); }); test('Empty List', () { @@ -62,10 +57,9 @@ void main() { expect(output, equals('')); }); test('Invalid value', () { - final Exception? ex = renderFail( - '{{#section}}_{{var}}_{{/section}}', - {'section': 42}, - ); + final Exception? ex = renderFail('{{#section}}_{{var}}_{{/section}}', { + 'section': 42, + }); if (ex is TemplateException) { expect(ex.message, startsWith(VALUE_MISSING)); } else { @@ -105,67 +99,51 @@ void main() { test('Whitespace in section tags', () { expect( - parse('{{#foo.bar}}oi{{/foo.bar}}').renderString( - >{ - 'foo': {'bar': true}, - }, - ), + parse('{{#foo.bar}}oi{{/foo.bar}}').renderString(>{ + 'foo': {'bar': true}, + }), equals('oi'), ); expect( - parse('{{# foo.bar}}oi{{/foo.bar}}').renderString( - >{ - 'foo': {'bar': true}, - }, - ), + parse('{{# foo.bar}}oi{{/foo.bar}}').renderString(>{ + 'foo': {'bar': true}, + }), equals('oi'), ); expect( - parse('{{#foo.bar }}oi{{/foo.bar}}').renderString( - >{ - 'foo': {'bar': true}, - }, - ), + parse('{{#foo.bar }}oi{{/foo.bar}}').renderString(>{ + 'foo': {'bar': true}, + }), equals('oi'), ); expect( - parse('{{# foo.bar }}oi{{/foo.bar}}').renderString( - >{ - 'foo': {'bar': true}, - }, - ), + parse('{{# foo.bar }}oi{{/foo.bar}}').renderString(>{ + 'foo': {'bar': true}, + }), equals('oi'), ); expect( - parse('{{#foo.bar}}oi{{/ foo.bar}}').renderString( - >{ - 'foo': {'bar': true}, - }, - ), + parse('{{#foo.bar}}oi{{/ foo.bar}}').renderString(>{ + 'foo': {'bar': true}, + }), equals('oi'), ); expect( - parse('{{#foo.bar}}oi{{/foo.bar }}').renderString( - >{ - 'foo': {'bar': true}, - }, - ), + parse('{{#foo.bar}}oi{{/foo.bar }}').renderString(>{ + 'foo': {'bar': true}, + }), equals('oi'), ); expect( - parse('{{#foo.bar}}oi{{/ foo.bar }}').renderString( - >{ - 'foo': {'bar': true}, - }, - ), + parse('{{#foo.bar}}oi{{/ foo.bar }}').renderString(>{ + 'foo': {'bar': true}, + }), equals('oi'), ); expect( - parse('{{# foo.bar }}oi{{/ foo.bar }}').renderString( - >{ - 'foo': {'bar': true}, - }, - ), + parse('{{# foo.bar }}oi{{/ foo.bar }}').renderString(>{ + 'foo': {'bar': true}, + }), equals('oi'), ); }); @@ -198,47 +176,30 @@ void main() { }); test('Odd whitespace in tags', () { - void render(String source, dynamic values, dynamic output) => expect( - parse(source, lenient: true).renderString(values), - equals(output), - ); + void render(String source, dynamic values, dynamic output) => + expect(parse(source, lenient: true).renderString(values), equals(output)); render('{{\t# foo}}oi{{\n/foo}}', {'foo': true}, 'oi'); - render( - '{{ # # foo }} {{ oi }} {{ / # foo }}', - >>{ - '# foo': >[ - {'oi': 'OI!'}, - ], - }, - ' OI! ', - ); + render('{{ # # foo }} {{ oi }} {{ / # foo }}', >>{ + '# foo': >[ + {'oi': 'OI!'}, + ], + }, ' OI! '); - render( - '{{ #foo }} {{ oi }} {{ /foo }}', - >>{ - 'foo': >[ - {'oi': 'OI!'}, - ], - }, - ' OI! ', - ); + render('{{ #foo }} {{ oi }} {{ /foo }}', >>{ + 'foo': >[ + {'oi': 'OI!'}, + ], + }, ' OI! '); - render( - '{{\t#foo }} {{ oi }} {{ /foo }}', - >>{ - 'foo': >[ - {'oi': 'OI!'}, - ], - }, - ' OI! ', - ); + render('{{\t#foo }} {{ oi }} {{ /foo }}', >>{ + 'foo': >[ + {'oi': 'OI!'}, + ], + }, ' OI! '); - render('{{{ #foo }}} {{{ /foo }}}', { - '#foo': 1, - '/foo': 2, - }, '1 2'); + render('{{{ #foo }}} {{{ /foo }}}', {'#foo': 1, '/foo': 2}, '1 2'); // Invalid - I'm ok with that for now. // render( @@ -256,33 +217,16 @@ void main() { }); test('Sigils in tag names in lenient mode', () { - void render(String source, dynamic values, dynamic output) => expect( - parse(source, lenient: true).renderString(values), - equals(output), - ); + void render(String source, dynamic values, dynamic output) => + expect(parse(source, lenient: true).renderString(values), equals(output)); // Even in lenient mode, tag names may not be a single sigil // character. - expect( - () => parse('{{#}}', lenient: true), - throwsA(isA()), - ); - expect( - () => parse('{{>}}', lenient: true), - throwsA(isA()), - ); - expect( - () => parse('{{&}}', lenient: true), - throwsA(isA()), - ); - expect( - () => parse('{{/}}', lenient: true), - throwsA(isA()), - ); - expect( - () => parse('{{^}}', lenient: true), - throwsA(isA()), - ); + expect(() => parse('{{#}}', lenient: true), throwsA(isA())); + expect(() => parse('{{>}}', lenient: true), throwsA(isA())); + expect(() => parse('{{&}}', lenient: true), throwsA(isA())); + expect(() => parse('{{/}}', lenient: true), throwsA(isA())); + expect(() => parse('{{^}}', lenient: true), throwsA(isA())); // >a means 'a partial named "a"', not a variable named ">a", // and in lenient mode the missing partial should fail silently @@ -312,20 +256,22 @@ void main() { group('Inverse Section', () { test('Map', () { - final String output = parse('{{^section}}_{{var}}_{{/section}}') - .renderString(>{ - 'section': {'var': 'bob'}, - }); + final String output = parse('{{^section}}_{{var}}_{{/section}}').renderString( + >{ + 'section': {'var': 'bob'}, + }, + ); expect(output, equals('')); }); test('List', () { - final String output = parse('{{^section}}_{{var}}_{{/section}}') - .renderString(>>{ - 'section': >[ - {'var': 'bob'}, - {'var': 'jim'}, - ], - }); + final String output = parse('{{^section}}_{{var}}_{{/section}}').renderString( + >>{ + 'section': >[ + {'var': 'bob'}, + {'var': 'jim'}, + ], + }, + ); expect(output, equals('')); }); test('Empty List', () { @@ -341,15 +287,11 @@ void main() { expect(output, equals('_ok_')); }); test('Invalid value', () { - final Exception? ex = renderFail( - '{{^section}}_{{var}}_{{/section}}', - {'section': 42}, - ); + final Exception? ex = renderFail('{{^section}}_{{var}}_{{/section}}', { + 'section': 42, + }); expect(ex is TemplateException, isTrue); - expect( - (ex! as TemplateException).message, - startsWith(BAD_VALUE_INV_SECTION), - ); + expect((ex! as TemplateException).message, startsWith(BAD_VALUE_INV_SECTION)); }); test('Invalid value - lenient mode', () { final String output = parse( @@ -368,58 +310,42 @@ void main() { group('Html escape', () { test('Escape at start', () { - final String output = parse( - '_{{var}}_', - ).renderString({'var': '&.'}); + final String output = parse('_{{var}}_').renderString({'var': '&.'}); expect(output, equals('_&._')); }); test('Escape at end', () { - final String output = parse( - '_{{var}}_', - ).renderString({'var': '.&'}); + final String output = parse('_{{var}}_').renderString({'var': '.&'}); expect(output, equals('_.&_')); }); test('&', () { - final String output = parse( - '_{{var}}_', - ).renderString({'var': '&'}); + final String output = parse('_{{var}}_').renderString({'var': '&'}); expect(output, equals('_&_')); }); test('<', () { - final String output = parse( - '_{{var}}_', - ).renderString({'var': '<'}); + final String output = parse('_{{var}}_').renderString({'var': '<'}); expect(output, equals('_<_')); }); test('>', () { - final String output = parse( - '_{{var}}_', - ).renderString({'var': '>'}); + final String output = parse('_{{var}}_').renderString({'var': '>'}); expect(output, equals('_>_')); }); test('"', () { - final String output = parse( - '_{{var}}_', - ).renderString({'var': '"'}); + final String output = parse('_{{var}}_').renderString({'var': '"'}); expect(output, equals('_"_')); }); test("'", () { - final String output = parse( - '_{{var}}_', - ).renderString({'var': "'"}); + final String output = parse('_{{var}}_').renderString({'var': "'"}); expect(output, equals('_'_')); }); test('/', () { - final String output = parse( - '_{{var}}_', - ).renderString({'var': '/'}); + final String output = parse('_{{var}}_').renderString({'var': '/'}); expect(output, equals('_/_')); }); }); @@ -493,35 +419,27 @@ void main() { group('Lenient', () { test('Odd section name', () { - final String output = - parse( - r'{{#section$%$^%}}_{{var}}_{{/section$%$^%}}', - lenient: true, - ).renderString(>{ + final String output = parse(r'{{#section$%$^%}}_{{var}}_{{/section$%$^%}}', lenient: true) + .renderString(>{ r'section$%$^%': {'var': 'bob'}, }); expect(output, equals('_bob_')); }); test('Odd variable name', () { - final String output = - parse( - r'{{#section}}_{{var$%$^%}}_{{/section}}', - lenient: true, - ).renderString(>{ + final String output = parse(r'{{#section}}_{{var$%$^%}}_{{/section}}', lenient: true) + .renderString(>{ 'section': {r'var$%$^%': 'bob'}, }); expect(output, equals('_bob_')); }); test('Null variable', () { - final String output = - parse( - r'{{#section}}_{{var}}_{{/section}}', - lenient: true, - ).renderString(>{ - 'section': {'var': null}, - }); + final String output = parse(r'{{#section}}_{{var}}_{{/section}}', lenient: true).renderString( + >{ + 'section': {'var': null}, + }, + ); expect(output, equals('__')); }); @@ -536,15 +454,11 @@ void main() { group('Escape tags', () { test('{{{ ... }}}', () { - final String output = parse( - '{{{blah}}}', - ).renderString({'blah': '&'}); + final String output = parse('{{{blah}}}').renderString({'blah': '&'}); expect(output, equals('&')); }); test('{{& ... }}', () { - final String output = parse( - '{{{blah}}}', - ).renderString({'blah': '&'}); + final String output = parse('{{{blah}}}').renderString({'blah': '&'}); expect(output, equals('&')); }); }); @@ -622,10 +536,7 @@ void main() { {'content': 'Y', 'nodes': []}, ], }, - { - 'root': '{{>node}}', - 'node': '{{content}}<{{#nodes}}{{>node}}{{/nodes}}>', - }, + {'root': '{{>node}}', 'node': '{{content}}<{{#nodes}}{{>node}}{{/nodes}}>'}, 'root', lenient: true, ); @@ -645,10 +556,7 @@ void main() { test('standalone indentation', () { final String output = partialTest( {'content': '<\n->'}, - { - 'root': '\\\n {{>partial}}\n/\n', - 'partial': '|\n{{{content}}}\n|\n', - }, + {'root': '\\\n {{>partial}}\n/\n', 'partial': '|\n{{{content}}}\n|\n'}, 'root', lenient: true, ); @@ -657,29 +565,15 @@ void main() { }); group('Lambdas', () { - void lambdaTest({ - required String template, - dynamic lambda, - dynamic output, - }) => expect( - parse(template).renderString({'lambda': lambda}), - equals(output), - ); + void lambdaTest({required String template, dynamic lambda, dynamic output}) => + expect(parse(template).renderString({'lambda': lambda}), equals(output)); test('basic', () { - lambdaTest( - template: 'Hello, {{lambda}}!', - lambda: (_) => 'world', - output: 'Hello, world!', - ); + lambdaTest(template: 'Hello, {{lambda}}!', lambda: (_) => 'world', output: 'Hello, world!'); }); test('escaping', () { - lambdaTest( - template: '<{{lambda}}{{{lambda}}}', - lambda: (_) => '>', - output: '<>>', - ); + lambdaTest(template: '<{{lambda}}{{{lambda}}}', lambda: (_) => '>', output: '<>>'); }); test('sections', () { @@ -692,10 +586,7 @@ void main() { test('inverted sections truthy', () { const template = '<{{^lambda}}{{static}}{{/lambda}}>'; - final values = { - 'lambda': (_) => false, - 'static': 'static', - }; + final values = {'lambda': (_) => false, 'static': 'static'}; const output = '<>'; expect(parse(template).renderString(values), equals(output)); }); @@ -738,8 +629,7 @@ void main() { //function() { return "|planet| => {{planet}}" } final values = { 'planet': 'world', - 'lambda': (LambdaContext ctx) => - ctx.renderSource('|planet| => {{planet}}'), + 'lambda': (LambdaContext ctx) => ctx.renderSource('|planet| => {{planet}}'), }; const output = 'Hello, (|planet| => world)!'; @@ -778,10 +668,7 @@ void main() { test('LambdaContext.lookup closed', () { final t = Template('{{ foo }}'); LambdaContext? lc2; - t.renderString({ - 'foo': (LambdaContext lc) => lc2 = lc, - 'bar': 'jim', - }); + t.renderString({'foo': (LambdaContext lc) => lc2 = lc, 'bar': 'jim'}); expect(lc2, isNotNull); expect(() => lc2?.lookup('foo'), throwsException); }); @@ -897,10 +784,7 @@ void main() { const template = '<{{#markdown}}{{content}}{{/markdown}}>'; final values = { 'markdown': (LambdaContext ctx) { - return ctx.renderSource( - ctx.source, - value: {'content': 'oi!'}, - ); + return ctx.renderSource(ctx.source, value: {'content': 'oi!'}); }, }; const output = ''; @@ -910,9 +794,7 @@ void main() { test('LambdaContext renderString on non-section throws', () { final t = Template('{{ foo }}'); expect( - () => t.renderString({ - 'foo': (LambdaContext lc) => lc.renderString(), - }), + () => t.renderString({'foo': (LambdaContext lc) => lc.renderString()}), throwsA(isA()), ); }); @@ -941,12 +823,7 @@ Exception? renderFail(String source, Object values) { } } -void expectFail( - Exception? ex, - int? line, - int? column, [ - String? msgStartsWith, -]) { +void expectFail(Exception? ex, int? line, int? column, [String? msgStartsWith]) { if (ex is! TemplateException) { fail('Unexpected type: $ex'); } diff --git a/third_party/packages/mustache_template/test/mustache_specs.dart b/third_party/packages/mustache_template/test/mustache_specs.dart index 5063e85..4d7bc5c 100644 --- a/third_party/packages/mustache_template/test/mustache_specs.dart +++ b/third_party/packages/mustache_template/test/mustache_specs.dart @@ -10,11 +10,7 @@ import 'package:test/test.dart'; import 'specs/specs.dart'; -String render( - String source, - dynamic values, { - required String? Function(String) partial, -}) { +String render(String source, dynamic values, {required String? Function(String) partial}) { late Template? Function(String) resolver; resolver = (String name) { final String? source = partial(name); @@ -36,8 +32,8 @@ void defineTests(List unsupportedSpecs) { } void _defineGroupFromFile(String filename, String text) { - final Map jsondata = - (json.decode(text) as Map).cast(); + final Map jsondata = (json.decode(text) as Map) + .cast(); final List> tests = (jsondata['tests']! as List) .cast>(); filename = filename.substring(filename.lastIndexOf('/') + 1); @@ -48,12 +44,8 @@ void _defineGroupFromFile(String filename, String text) { testDescription.write(t['desc']); final template = t['template']! as String; final Object? data = t['data']; - final String templateOneline = template - .replaceAll('\n', r'\n') - .replaceAll('\r', r'\r'); - final reason = StringBuffer( - "Could not render right '''$templateOneline'''", - ); + final String templateOneline = template.replaceAll('\n', r'\n').replaceAll('\r', r'\r'); + final reason = StringBuffer("Could not render right '''$templateOneline'''"); final Object? expected = t['expected']; final partials = t['partials'] as Map?; String? partial(String name) { @@ -73,11 +65,7 @@ void _defineGroupFromFile(String filename, String text) { } test( testDescription.toString(), - () => expect( - render(template, data, partial: partial), - expected, - reason: reason.toString(), - ), + () => expect(render(template, data, partial: partial), expected, reason: reason.toString()), ); } }); @@ -101,18 +89,14 @@ String Function(LambdaContext) wrapLambda(Object? Function(Object?) f) => Map lambdas = { 'Interpolation': wrapLambda((Object? t) => 'world'), 'Interpolation - Expansion': wrapLambda((Object? t) => '{{planet}}'), - 'Interpolation - Alternate Delimiters': wrapLambda( - (Object? t) => '|planet| => {{planet}}', - ), + 'Interpolation - Alternate Delimiters': wrapLambda((Object? t) => '|planet| => {{planet}}'), 'Interpolation - Multiple Calls': wrapLambda( _dummyCallableWithState(), ), //function() { return (g=(function(){return this})()).calls=(g.calls||0)+1 } 'Escaping': wrapLambda((Object? t) => '>'), 'Section': wrapLambda((Object? txt) => txt == '{{x}}' ? 'yes' : 'no'), 'Section - Expansion': wrapLambda((Object? txt) => '$txt{{planet}}$txt'), - 'Section - Alternate Delimiters': wrapLambda( - (Object? txt) => '$txt{{planet}} => |planet|$txt', - ), + 'Section - Alternate Delimiters': wrapLambda((Object? txt) => '$txt{{planet}} => |planet|$txt'), 'Section - Multiple Calls': wrapLambda((Object? t) => '__${t}__'), 'Inverted Section': wrapLambda((Object? txt) => false), }; diff --git a/third_party/packages/mustache_template/test/parser_test.dart b/third_party/packages/mustache_template/test/parser_test.dart index 1c095bc..6e1ab0b 100644 --- a/third_party/packages/mustache_template/test/parser_test.dart +++ b/third_party/packages/mustache_template/test/parser_test.dart @@ -162,9 +162,7 @@ void main() { SectionNode('foo', 3, 11, '{{ }}'), TextNode('ghi', 22, 25), ]); - expectNodes((nodes[1] as SectionNode).children, [ - TextNode('def', 11, 14), - ]); + expectNodes((nodes[1] as SectionNode).children, [TextNode('def', 11, 14)]); }); test('parse section standalone tag whitespace', () { @@ -176,14 +174,11 @@ void main() { SectionNode('foo', 4, 12, '{{ }}'), TextNode('ghi', 26, 29), ]); - expectNodes((nodes[1] as SectionNode).children, [ - TextNode('def\n', 13, 17), - ]); + expectNodes((nodes[1] as SectionNode).children, [TextNode('def\n', 13, 17)]); }); test('parse section standalone tag whitespace consecutive', () { - const source = - 'abc\n{{#foo}}\ndef\n{{/foo}}\n{{#foo}}\ndef\n{{/foo}}\nghi'; + const source = 'abc\n{{#foo}}\ndef\n{{/foo}}\n{{#foo}}\ndef\n{{/foo}}\nghi'; final parser = Parser(source, 'foo', '{{ }}'); final List nodes = parser.parse(); expectNodes(nodes, [ @@ -192,22 +187,15 @@ void main() { SectionNode('foo', 26, 34, '{{ }}'), TextNode('ghi', 48, 51), ]); - expectNodes((nodes[1] as SectionNode).children, [ - TextNode('def\n', 13, 17), - ]); + expectNodes((nodes[1] as SectionNode).children, [TextNode('def\n', 13, 17)]); }); test('parse section standalone tag whitespace on first line', () { const source = ' {{#foo}} \ndef\n{{/foo}}\nghi'; final parser = Parser(source, 'foo', '{{ }}'); final List nodes = parser.parse(); - expectNodes(nodes, [ - SectionNode('foo', 2, 10, '{{ }}'), - TextNode('ghi', 26, 29), - ]); - expectNodes((nodes[0] as SectionNode).children, [ - TextNode('def\n', 13, 17), - ]); + expectNodes(nodes, [SectionNode('foo', 2, 10, '{{ }}'), TextNode('ghi', 26, 29)]); + expectNodes((nodes[0] as SectionNode).children, [TextNode('def\n', 13, 17)]); }); test('parse section standalone tag whitespace on last line', () { @@ -215,9 +203,7 @@ void main() { final parser = Parser(source, 'foo', '{{ }}'); final List nodes = parser.parse(); expectNodes(nodes, [SectionNode('foo', 0, 8, '{{ }}')]); - expectNodes((nodes[0] as SectionNode).children, [ - TextNode('def\n', 8, 12), - ]); + expectNodes((nodes[0] as SectionNode).children, [TextNode('def\n', 8, 12)]); }); test('parse variable newline', () { @@ -240,9 +226,7 @@ void main() { SectionNode('foo', 5, 13, '{{ }}'), TextNode('ghi', 27, 30), ]); - expectNodes((nodes[1] as SectionNode).children, [ - TextNode('def\n', 14, 18), - ]); + expectNodes((nodes[1] as SectionNode).children, [TextNode('def\n', 14, 18)]); }); test('parse whitespace', () { @@ -273,9 +257,7 @@ void main() { TextNode('>', 31, 32), ]); expect((nodes[1] as SectionNode).delimiters, equals('| |')); - expectNodes((nodes[1] as SectionNode).children, [ - TextNode('-', 21, 22), - ]); + expectNodes((nodes[1] as SectionNode).children, [TextNode('-', 21, 22)]); }); test('corner case strict', () { @@ -385,15 +367,9 @@ void main() { bool nodeEqual(Node a, Node b) { if (a is TextNode) { - return b is TextNode && - a.text == b.text && - a.start == b.start && - a.end == b.end; + return b is TextNode && a.text == b.text && a.start == b.start && a.end == b.end; } else if (a is VariableNode && b is VariableNode) { - return a.name == b.name && - a.escape == b.escape && - a.start == b.start && - a.end == b.end; + return a.name == b.name && a.escape == b.escape && a.start == b.start && a.end == b.end; } else if (a is SectionNode && b is SectionNode) { return a.name == b.name && a.delimiters == b.delimiters && @@ -408,10 +384,7 @@ bool nodeEqual(Node a, Node b) { } bool tokenEqual(Token a, Token b) { - return a.type == b.type && - a.value == b.value && - a.start == b.start && - a.end == b.end; + return a.type == b.type && a.value == b.value && a.start == b.start && a.end == b.end; } void expectTokens(List a, List b) { diff --git a/third_party/packages/mustache_template/tool/download_spec.dart b/third_party/packages/mustache_template/tool/download_spec.dart index 58b4546..15ff4af 100644 --- a/third_party/packages/mustache_template/tool/download_spec.dart +++ b/third_party/packages/mustache_template/tool/download_spec.dart @@ -23,12 +23,7 @@ Future main(List args) async { ]); final String headHash = - ((await _runGit(packageRoot.path, [ - '-C', - tmpSpecPath, - 'rev-parse', - 'HEAD', - ])).stdout + ((await _runGit(packageRoot.path, ['-C', tmpSpecPath, 'rev-parse', 'HEAD'])).stdout as String) .trim(); @@ -41,11 +36,7 @@ Future main(List args) async { final clonedSpecs = Directory(_join(tmpSpecPath, 'specs')); final List jsonFiles = - clonedSpecs - .listSync() - .whereType() - .where((File f) => f.path.endsWith('.json')) - .toList() + clonedSpecs.listSync().whereType().where((File f) => f.path.endsWith('.json')).toList() ..sort((File a, File b) => a.path.compareTo(b.path)); final exports = StringBuffer(); @@ -108,10 +99,7 @@ String _join(String a, String b, [String? c]) { return [a, b, if (c != null) c].join(sep); } -Future _runGit( - String workingDirectory, - List arguments, -) async { +Future _runGit(String workingDirectory, List arguments) async { final ProcessResult result = await Process.run( 'git', arguments, From 41b0533d62a829e29d4063aae2b7aed420c6f111 Mon Sep 17 00:00:00 2001 From: Stuart Morgan Date: Fri, 5 Jun 2026 13:33:09 -0400 Subject: [PATCH 118/118] [various] Update metadata for imported packages --- .github/labeler.yml | 20 +++++++++++++++++++ .gitignore | 3 +++ .repo_tool_config.yaml | 1 + README.md | 4 ++++ packages/flutter_template_images/pubspec.yaml | 2 +- packages/multicast_dns/pubspec.yaml | 2 +- packages/standard_message_codec/pubspec.yaml | 2 +- .../packages/mustache_template/pubspec.yaml | 2 +- 8 files changed, 32 insertions(+), 4 deletions(-) diff --git a/.github/labeler.yml b/.github/labeler.yml index 31d0794..327456a 100644 --- a/.github/labeler.yml +++ b/.github/labeler.yml @@ -1,3 +1,23 @@ +'p: flutter_template_images': + - changed-files: + - any-glob-to-any-file: + - packages/flutter_template_images/**/* + +'p: multicast_dns': + - changed-files: + - any-glob-to-any-file: + - packages/multicast_dns/**/* + +'p: mustache_template': + - changed-files: + - any-glob-to-any-file: + - third_party/packages/mustache_template/**/* + +'p: standard_message_codec': + - changed-files: + - any-glob-to-any-file: + - packages/standard_message_codec/**/* + 'p: vector_math': - changed-files: - any-glob-to-any-file: diff --git a/.gitignore b/.gitignore index 4d11a1f..4b2f4de 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,6 @@ +# Directory for files cached by the repo tooling +/.repo_tool_cache/ + .DS_Store .atom/ .idea diff --git a/.repo_tool_config.yaml b/.repo_tool_config.yaml index f829790..ad11512 100644 --- a/.repo_tool_config.yaml +++ b/.repo_tool_config.yaml @@ -26,5 +26,6 @@ allowed_dependencies: - build_runner - build_test - build_web_compilers + - meta - path - test diff --git a/README.md b/README.md index bfd2312..229a56a 100644 --- a/README.md +++ b/README.md @@ -37,4 +37,8 @@ These are the packages hosted in this repository: | Package | Pub | Points | Usage | Issues | Pull requests | |---------|-----|--------|-------|--------|---------------| +| [flutter\_template\_images](./packages/flutter_template_images/) | [![pub package](https://img.shields.io/pub/v/flutter_template_images.svg)](https://pub.dev/packages/flutter_template_images) | [![pub points](https://img.shields.io/pub/points/flutter_template_images)](https://pub.dev/packages/flutter_template_images/score) | [![downloads](https://img.shields.io/pub/dm/flutter_template_images)](https://pub.dev/packages/flutter_template_images/score) | [![GitHub issues by-label](https://img.shields.io/github/issues/flutter/flutter/p%3A%20flutter_template_images?label=)](https://github.com/flutter/flutter/labels/p%3A%20flutter_template_images) | [![GitHub pull requests by-label](https://img.shields.io/github/issues-pr/flutter/core-packages/p%3A%20flutter_template_images?label=)](https://github.com/flutter/core-packages/labels/p%3A%20flutter_template_images) | +| [multicast\_dns](./packages/multicast_dns/) | [![pub package](https://img.shields.io/pub/v/multicast_dns.svg)](https://pub.dev/packages/multicast_dns) | [![pub points](https://img.shields.io/pub/points/multicast_dns)](https://pub.dev/packages/multicast_dns/score) | [![downloads](https://img.shields.io/pub/dm/multicast_dns)](https://pub.dev/packages/multicast_dns/score) | [![GitHub issues by-label](https://img.shields.io/github/issues/flutter/flutter/p%3A%20multicast_dns?label=)](https://github.com/flutter/flutter/labels/p%3A%20multicast_dns) | [![GitHub pull requests by-label](https://img.shields.io/github/issues-pr/flutter/core-packages/p%3A%20multicast_dns?label=)](https://github.com/flutter/core-packages/labels/p%3A%20multicast_dns) | +| [mustache\_template](./third_party/packages/mustache_template/) | [![pub package](https://img.shields.io/pub/v/mustache_template.svg)](https://pub.dev/packages/mustache_template) | [![pub points](https://img.shields.io/pub/points/mustache_template)](https://pub.dev/packages/mustache_template/score) | [![downloads](https://img.shields.io/pub/dm/mustache_template)](https://pub.dev/packages/mustache_template/score) | [![GitHub issues by-label](https://img.shields.io/github/issues/flutter/flutter/p%3A%20mustache_template?label=)](https://github.com/flutter/flutter/labels/p%3A%20mustache_template) | [![GitHub pull requests by-label](https://img.shields.io/github/issues-pr/flutter/core-packages/p%3A%20mustache_template?label=)](https://github.com/flutter/core-packages/labels/p%3A%20mustache_template) | +| [standard\_message\_codec](./packages/standard_message_codec/) | [![pub package](https://img.shields.io/pub/v/standard_message_codec.svg)](https://pub.dev/packages/standard_message_codec) | [![pub points](https://img.shields.io/pub/points/standard_message_codec)](https://pub.dev/packages/standard_message_codec/score) | [![downloads](https://img.shields.io/pub/dm/standard_message_codec)](https://pub.dev/packages/standard_message_codec/score) | [![GitHub issues by-label](https://img.shields.io/github/issues/flutter/flutter/p%3A%20standard_message_codec?label=)](https://github.com/flutter/flutter/labels/p%3A%20standard_message_codec) | [![GitHub pull requests by-label](https://img.shields.io/github/issues-pr/flutter/core-packages/p%3A%20standard_message_codec?label=)](https://github.com/flutter/core-packages/labels/p%3A%20standard_message_codec) | | [vector\_math](./packages/vector_math/) | [![pub package](https://img.shields.io/pub/v/vector_math.svg)](https://pub.dev/packages/vector_math) | [![pub points](https://img.shields.io/pub/points/vector_math)](https://pub.dev/packages/vector_math/score) | [![downloads](https://img.shields.io/pub/dm/vector_math)](https://pub.dev/packages/vector_math/score) | [![GitHub issues by-label](https://img.shields.io/github/issues/flutter/flutter/p%3A%20vector_math?label=)](https://github.com/flutter/flutter/labels/p%3A%20vector_math) | [![GitHub pull requests by-label](https://img.shields.io/github/issues-pr/flutter/core-packages/p%3A%20vector_math?label=)](https://github.com/flutter/core-packages/labels/p%3A%20vector_math) | diff --git a/packages/flutter_template_images/pubspec.yaml b/packages/flutter_template_images/pubspec.yaml index 37d7d32..c689f5c 100644 --- a/packages/flutter_template_images/pubspec.yaml +++ b/packages/flutter_template_images/pubspec.yaml @@ -1,6 +1,6 @@ name: flutter_template_images description: Image files for use in flutter_tools templates without adding binary files to flutter/flutter. -repository: https://github.com/flutter/packages/tree/main/packages/flutter_template_images +repository: https://github.com/flutter/core-packages/tree/main/packages/flutter_template_images issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+flutter_template_images%22 version: 5.0.0 diff --git a/packages/multicast_dns/pubspec.yaml b/packages/multicast_dns/pubspec.yaml index a0fb4c7..8a3b5a1 100644 --- a/packages/multicast_dns/pubspec.yaml +++ b/packages/multicast_dns/pubspec.yaml @@ -1,6 +1,6 @@ name: multicast_dns description: Dart package for performing mDNS queries (e.g. Bonjour, Avahi). -repository: https://github.com/flutter/packages/tree/main/packages/multicast_dns +repository: https://github.com/flutter/core-packages/tree/main/packages/multicast_dns issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+multicast_dns%22 version: 0.3.3 diff --git a/packages/standard_message_codec/pubspec.yaml b/packages/standard_message_codec/pubspec.yaml index d918d24..66263a8 100644 --- a/packages/standard_message_codec/pubspec.yaml +++ b/packages/standard_message_codec/pubspec.yaml @@ -1,7 +1,7 @@ name: standard_message_codec description: An efficient and schemaless binary encoding format for Flutter and Dart. version: 0.0.1+4 -repository: https://github.com/flutter/packages/tree/main/packages/standard_message_codec +repository: https://github.com/flutter/core-packages/tree/main/packages/standard_message_codec issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3Astandard_message_codec environment: diff --git a/third_party/packages/mustache_template/pubspec.yaml b/third_party/packages/mustache_template/pubspec.yaml index 52b9bea..4acd0e7 100644 --- a/third_party/packages/mustache_template/pubspec.yaml +++ b/third_party/packages/mustache_template/pubspec.yaml @@ -1,6 +1,6 @@ name: mustache_template description: A templating library that implements the Mustache template specification -repository: https://github.com/flutter/packages/tree/main/third_party/packages/mustache_template +repository: https://github.com/flutter/core-packages/tree/main/third_party/packages/mustache_template issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+mustache_template%22 version: 2.0.4

MY- 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 PT>!@CEDWmjsEmID&pRVU literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/WideTile.scale-150.png b/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/WideTile.scale-150.png new file mode 100644 index 0000000000000000000000000000000000000000..d4b275a5731f374ce9ffe8b03dbf157b2a9b473a GIT binary patch literal 5001 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 literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/WideTile.scale-200.png b/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/WideTile.scale-200.png new file mode 100644 index 0000000000000000000000000000000000000000..6012579815fa4a18c7d12e900b629c6fde5c8d8b GIT binary patch literal 6866 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 UwD|=1lM1Bs$WW{7Puqz91ABlFQUCw| literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/WideTile.scale-400.png b/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Assets/WideTile.scale-400.png new file mode 100644 index 0000000000000000000000000000000000000000..73d2461cecfef8227108b9a6b3bc0ad6c736d4e8 GIT binary patch literal 15332 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 literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Windows_TemporaryKey.pfx b/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/Windows_TemporaryKey.pfx new file mode 100644 index 0000000000000000000000000000000000000000..1cad9993d6abdb0e1bc1456b2470dd386f8f3ef2 GIT binary patch literal 2560 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 literal 0 HcmV?d00001 diff --git a/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/resources.pri b/packages/flutter_template_images/templates/app/winuwp.tmpl/runner_uwp/resources.pri new file mode 100644 index 0000000000000000000000000000000000000000..7de03c9dc31868ee4734e9e92536aad0bfc0573f GIT binary patch literal 5952 zcmcgwO>7%Q6n@^d9XmhGPg7BfAWPILB{YfSI3*MbxmBrph)}^rMQV_>*qg+{PF&lS zEDoGGaDZEHaNxkP2Tq)NLL4}9KnO)WaOjB>NL7VYzBhlnUVGOeO_|mB&Aj)`dpmF5 zycut!)hIVxwLDRRiZ2j3MD&eCG)qsPqDi+K093uoUb(inz5fxjOxXZV$f2O>wJToN zm$PgaNFm>CS9ZOI3%R2QvyGyyoj@R&q)AbBdE}`GA zU*63UU5}AJ7>$=_#^dETCW!9E=znw~etd3)$3W1-rp zNz@c-8k`L3DC#)s3GgOSr_i1OJ&8Jts!M`?qQB6!K=ZI~gWds6f<8hlr$GNiKTQ`B zj2oe<7@9$!Iqww6WZ1C-FOq`Ez?jv`+{4 zuLj!Z0`2pG_UmY~w=B#qi5aD#CxeLG!dO=(_0V6~AEQ7a{$C-lZF~Ntfv+y+c>Q;ZZDELyM?D8-iEB@4=J5 z590C?=Oiwc$Zs4K920~!XCAMqKWm=h80Ip8Sxo{lji^A_io$l{@>`LWq9iaA_Vw+m zw_V=da~ob8SCY~-`q7^)EV#ay8Lf4?@GFnUMZ(!b6 z(OQF)>k{M_@mv!;_Q?jYSKy-!dIS75NLHZ#xODNGuc9Iaz+3X&L8u4^X7$9ROTkUS zdJ3tUpK-ibI_JR433>(m)436N-NJ6&qzR`9tVMHZ&p4kUewbeZ|0~3lMK7a0<$Nu6 z>^$11ocoA5iyX91IzM8qH2ycN8uM>~{|GiMdJ*k$=O3)3O$*SUaTf4qHeC?ZMEPurclZp&L;&vjA#L4qq@!sqqay@i{=+G_78<{3-y z7Z=_?MeGrAKNxWS^VzS9Y>vS939(N&W9Y*1$Au}c4O7N5 zDNZBw6Nqg|C7w?w*_U`ev1DK3IqtY`D;(#1?pq4S^N@0hODdeLaJItP3P*@$#uJ}> zf{rVS(@^xs6rEOdN>QAeLXLAwP@JTod?qkWDZ5E!H>vFME|GGHODkMT;rR5Ca*dOI z<C0KZPJhM_Wf%mD`F>kH)og9!LM zc-;xTxzQ8K6-JFXpW?nF98;bsgw`XRZ~Nr^zBUlE9udAaz*t`!l<|>&7D+D}M8Ma9 z@GxQ#w!`u*f2+`iL%S$CmwM;oUu@laXM4ZZSh~9hM|8Yuxx@GAPP_Ig&aR6xnL{f>jA?@vwNiZuH~P3zDKfK*!T~2_5XTa6kcEcx. diff --git a/packages/flutter_template_images/templates/skeleton/README.md b/packages/flutter_template_images/templates/skeleton/README.md new file mode 100644 index 0000000..148a018 --- /dev/null +++ b/packages/flutter_template_images/templates/skeleton/README.md @@ -0,0 +1,5 @@ +**DO NOT UPDATE**: This directory is _deprecated_. + +The `skeleton` template is being removed. + +See also: . From a5bc734c7db617548151fe0c39af59b6d70eb725 Mon Sep 17 00:00:00 2001 From: Matan Lurey Date: Fri, 3 Jan 2025 10:35:38 -0800 Subject: [PATCH 097/118] Delete unused templates `skeleton` and `app_shared` and release as `5.0.0`. (#8360) Towards https://github.com/flutter/flutter/issues/160692. The last thing I'll do is update the dependency in `flutter_tools` to `flutter_template_images: 5.0.0`. --- packages/flutter_template_images/CHANGELOG.md | 4 ++++ packages/flutter_template_images/pubspec.yaml | 2 +- .../templates/app_shared/README.md | 10 ---------- .../Icon-App-1024x1024@1x.png | Bin 10932 -> 0 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 295 -> 0 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 406 -> 0 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 450 -> 0 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 282 -> 0 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 462 -> 0 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 704 -> 0 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 406 -> 0 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 586 -> 0 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 862 -> 0 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 862 -> 0 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 1674 -> 0 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 762 -> 0 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 1226 -> 0 bytes .../Icon-App-83.5x83.5@2x.png | Bin 1418 -> 0 bytes .../LaunchImage.imageset/LaunchImage.png | Bin 68 -> 0 bytes .../LaunchImage.imageset/LaunchImage@2x.png | Bin 68 -> 0 bytes .../LaunchImage.imageset/LaunchImage@3x.png | Bin 68 -> 0 bytes .../AppIcon.appiconset/app_icon_1024.png | Bin 102994 -> 0 bytes .../AppIcon.appiconset/app_icon_128.png | Bin 5680 -> 0 bytes .../AppIcon.appiconset/app_icon_16.png | Bin 520 -> 0 bytes .../AppIcon.appiconset/app_icon_256.png | Bin 14142 -> 0 bytes .../AppIcon.appiconset/app_icon_32.png | Bin 1066 -> 0 bytes .../AppIcon.appiconset/app_icon_512.png | Bin 36406 -> 0 bytes .../AppIcon.appiconset/app_icon_64.png | Bin 2218 -> 0 bytes .../app_shared/web/icons/Icon-maskable-192.png | Bin 5594 -> 0 bytes .../app_shared/web/icons/Icon-maskable-512.png | Bin 20998 -> 0 bytes .../windows.tmpl/runner/resources/app_icon.ico | Bin 33772 -> 0 bytes .../runner_uwp/Assets/LargeTile.scale-100.png | Bin 6049 -> 0 bytes .../runner_uwp/Assets/LargeTile.scale-125.png | Bin 7419 -> 0 bytes .../runner_uwp/Assets/LargeTile.scale-150.png | Bin 9576 -> 0 bytes .../runner_uwp/Assets/LargeTile.scale-200.png | Bin 14559 -> 0 bytes .../runner_uwp/Assets/LargeTile.scale-400.png | Bin 42545 -> 0 bytes .../Assets/LockScreenLogo.scale-200.png | Bin 1430 -> 0 bytes .../runner_uwp/Assets/SmallTile.scale-100.png | Bin 1821 -> 0 bytes .../runner_uwp/Assets/SmallTile.scale-125.png | Bin 2519 -> 0 bytes .../runner_uwp/Assets/SmallTile.scale-150.png | Bin 2984 -> 0 bytes .../runner_uwp/Assets/SmallTile.scale-200.png | Bin 3721 -> 0 bytes .../runner_uwp/Assets/SmallTile.scale-400.png | Bin 8054 -> 0 bytes .../Assets/SplashScreen.scale-100.png | Bin 6866 -> 0 bytes .../Assets/SplashScreen.scale-125.png | Bin 7899 -> 0 bytes .../Assets/SplashScreen.scale-150.png | Bin 10137 -> 0 bytes .../Assets/SplashScreen.scale-200.png | Bin 15332 -> 0 bytes .../Assets/SplashScreen.scale-400.png | Bin 46573 -> 0 bytes .../Assets/Square150x150Logo.scale-100.png | Bin 2964 -> 0 bytes .../Assets/Square150x150Logo.scale-125.png | Bin 2984 -> 0 bytes .../Assets/Square150x150Logo.scale-150.png | Bin 4617 -> 0 bytes .../Assets/Square150x150Logo.scale-200.png | Bin 6223 -> 0 bytes .../Assets/Square150x150Logo.scale-400.png | Bin 13913 -> 0 bytes ...4x44Logo.altform-unplated_targetsize-16.png | Bin 697 -> 0 bytes ...x44Logo.altform-unplated_targetsize-256.png | Bin 15554 -> 0 bytes ...4x44Logo.altform-unplated_targetsize-32.png | Bin 1541 -> 0 bytes ...4x44Logo.altform-unplated_targetsize-48.png | Bin 2418 -> 0 bytes .../Assets/Square44x44Logo.scale-100.png | Bin 1603 -> 0 bytes .../Assets/Square44x44Logo.scale-125.png | Bin 1893 -> 0 bytes .../Assets/Square44x44Logo.scale-150.png | Bin 2515 -> 0 bytes .../Assets/Square44x44Logo.scale-200.png | Bin 3239 -> 0 bytes .../Assets/Square44x44Logo.scale-400.png | Bin 6781 -> 0 bytes .../Assets/Square44x44Logo.targetsize-16.png | Bin 479 -> 0 bytes .../Assets/Square44x44Logo.targetsize-24.png | Bin 788 -> 0 bytes ...4x44Logo.targetsize-24_altform-unplated.png | Bin 1255 -> 0 bytes .../Assets/Square44x44Logo.targetsize-256.png | Bin 10408 -> 0 bytes .../Assets/Square44x44Logo.targetsize-32.png | Bin 1122 -> 0 bytes .../Assets/Square44x44Logo.targetsize-48.png | Bin 1612 -> 0 bytes .../runner_uwp/Assets/StoreLogo.png | Bin 1451 -> 0 bytes .../runner_uwp/Assets/StoreLogo.scale-100.png | Bin 2370 -> 0 bytes .../runner_uwp/Assets/StoreLogo.scale-125.png | Bin 3229 -> 0 bytes .../runner_uwp/Assets/StoreLogo.scale-150.png | Bin 3739 -> 0 bytes .../runner_uwp/Assets/StoreLogo.scale-200.png | Bin 4917 -> 0 bytes .../runner_uwp/Assets/StoreLogo.scale-400.png | Bin 10759 -> 0 bytes .../Assets/Wide310x150Logo.scale-200.png | Bin 3204 -> 0 bytes .../runner_uwp/Assets/WideTile.scale-100.png | Bin 3158 -> 0 bytes .../runner_uwp/Assets/WideTile.scale-125.png | Bin 3211 -> 0 bytes .../runner_uwp/Assets/WideTile.scale-150.png | Bin 5001 -> 0 bytes .../runner_uwp/Assets/WideTile.scale-200.png | Bin 6866 -> 0 bytes .../runner_uwp/Assets/WideTile.scale-400.png | Bin 15332 -> 0 bytes .../runner_uwp/Windows_TemporaryKey.pfx | Bin 2560 -> 0 bytes .../winuwp.tmpl/runner_uwp/resources.pri | Bin 5952 -> 0 bytes .../templates/skeleton/README.md | 5 ----- .../assets/images/2.0x/flutter_logo.png | Bin 619 -> 0 bytes .../assets/images/3.0x/flutter_logo.png | Bin 810 -> 0 bytes .../skeleton/assets/images/flutter_logo.png | Bin 419 -> 0 bytes 85 files changed, 5 insertions(+), 16 deletions(-) delete mode 100644 packages/flutter_template_images/templates/app_shared/README.md delete mode 100644 packages/flutter_template_images/templates/app_shared/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png delete mode 100644 packages/flutter_template_images/templates/app_shared/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png delete mode 100644 packages/flutter_template_images/templates/app_shared/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png delete mode 100644 packages/flutter_template_images/templates/app_shared/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png delete mode 100644 packages/flutter_template_images/templates/app_shared/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png delete mode 100644 packages/flutter_template_images/templates/app_shared/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png delete mode 100644 packages/flutter_template_images/templates/app_shared/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png delete mode 100644 packages/flutter_template_images/templates/app_shared/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png delete mode 100644 packages/flutter_template_images/templates/app_shared/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png delete mode 100644 packages/flutter_template_images/templates/app_shared/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png delete mode 100644 packages/flutter_template_images/templates/app_shared/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png delete mode 100644 packages/flutter_template_images/templates/app_shared/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png delete mode 100644 packages/flutter_template_images/templates/app_shared/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png delete mode 100644 packages/flutter_template_images/templates/app_shared/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png delete mode 100644 packages/flutter_template_images/templates/app_shared/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png delete mode 100644 packages/flutter_template_images/templates/app_shared/ios.tmpl/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png delete mode 100644 packages/flutter_template_images/templates/app_shared/ios.tmpl/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png delete mode 100644 packages/flutter_template_images/templates/app_shared/ios.tmpl/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png delete mode 100644 packages/flutter_template_images/templates/app_shared/macos.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png delete mode 100644 packages/flutter_template_images/templates/app_shared/macos.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png delete mode 100644 packages/flutter_template_images/templates/app_shared/macos.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png delete mode 100644 packages/flutter_template_images/templates/app_shared/macos.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png delete mode 100644 packages/flutter_template_images/templates/app_shared/macos.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png delete mode 100644 packages/flutter_template_images/templates/app_shared/macos.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png delete mode 100644 packages/flutter_template_images/templates/app_shared/macos.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png delete mode 100644 packages/flutter_template_images/templates/app_shared/web/icons/Icon-maskable-192.png delete mode 100644 packages/flutter_template_images/templates/app_shared/web/icons/Icon-maskable-512.png delete mode 100644 packages/flutter_template_images/templates/app_shared/windows.tmpl/runner/resources/app_icon.ico delete mode 100644 packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/LargeTile.scale-100.png delete mode 100644 packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/LargeTile.scale-125.png delete mode 100644 packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/LargeTile.scale-150.png delete mode 100644 packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/LargeTile.scale-200.png delete mode 100644 packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/LargeTile.scale-400.png delete mode 100644 packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/LockScreenLogo.scale-200.png delete mode 100644 packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/SmallTile.scale-100.png delete mode 100644 packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/SmallTile.scale-125.png delete mode 100644 packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/SmallTile.scale-150.png delete mode 100644 packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/SmallTile.scale-200.png delete mode 100644 packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/SmallTile.scale-400.png delete mode 100644 packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/SplashScreen.scale-100.png delete mode 100644 packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/SplashScreen.scale-125.png delete mode 100644 packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/SplashScreen.scale-150.png delete mode 100644 packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/SplashScreen.scale-200.png delete mode 100644 packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/SplashScreen.scale-400.png delete mode 100644 packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square150x150Logo.scale-100.png delete mode 100644 packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square150x150Logo.scale-125.png delete mode 100644 packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square150x150Logo.scale-150.png delete mode 100644 packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square150x150Logo.scale-200.png delete mode 100644 packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square150x150Logo.scale-400.png delete mode 100644 packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-16.png delete mode 100644 packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-256.png delete mode 100644 packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-32.png delete mode 100644 packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-48.png delete mode 100644 packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.scale-100.png delete mode 100644 packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.scale-125.png delete mode 100644 packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.scale-150.png delete mode 100644 packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.scale-200.png delete mode 100644 packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.scale-400.png delete mode 100644 packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.targetsize-16.png delete mode 100644 packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.targetsize-24.png delete mode 100644 packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.targetsize-24_altform-unplated.png delete mode 100644 packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.targetsize-256.png delete mode 100644 packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.targetsize-32.png delete mode 100644 packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.targetsize-48.png delete mode 100644 packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/StoreLogo.png delete mode 100644 packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/StoreLogo.scale-100.png delete mode 100644 packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/StoreLogo.scale-125.png delete mode 100644 packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/StoreLogo.scale-150.png delete mode 100644 packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/StoreLogo.scale-200.png delete mode 100644 packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/StoreLogo.scale-400.png delete mode 100644 packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Wide310x150Logo.scale-200.png delete mode 100644 packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/WideTile.scale-100.png delete mode 100644 packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/WideTile.scale-125.png delete mode 100644 packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/WideTile.scale-150.png delete mode 100644 packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/WideTile.scale-200.png delete mode 100644 packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/WideTile.scale-400.png delete mode 100644 packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Windows_TemporaryKey.pfx delete mode 100644 packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/resources.pri delete mode 100644 packages/flutter_template_images/templates/skeleton/README.md delete mode 100644 packages/flutter_template_images/templates/skeleton/assets/images/2.0x/flutter_logo.png delete mode 100644 packages/flutter_template_images/templates/skeleton/assets/images/3.0x/flutter_logo.png delete mode 100644 packages/flutter_template_images/templates/skeleton/assets/images/flutter_logo.png diff --git a/packages/flutter_template_images/CHANGELOG.md b/packages/flutter_template_images/CHANGELOG.md index ac09412..07aedbf 100644 --- a/packages/flutter_template_images/CHANGELOG.md +++ b/packages/flutter_template_images/CHANGELOG.md @@ -1,3 +1,7 @@ +## 5.0.0 + +* Removes `app_shared` and `skeleton`, which are [no longer used](https://github.com/flutter/flutter/issues/160692). + ## 4.3.0 * Updates minimum supported SDK version to Flutter 3.22/Dart 3.4. diff --git a/packages/flutter_template_images/pubspec.yaml b/packages/flutter_template_images/pubspec.yaml index 26ff847..4ff9a94 100644 --- a/packages/flutter_template_images/pubspec.yaml +++ b/packages/flutter_template_images/pubspec.yaml @@ -2,7 +2,7 @@ name: flutter_template_images description: Image files for use in flutter_tools templates without adding binary files to flutter/flutter. repository: https://github.com/flutter/packages/tree/main/packages/flutter_template_images issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+flutter_template_images%22 -version: 4.3.0 +version: 5.0.0 environment: sdk: ^3.4.0 diff --git a/packages/flutter_template_images/templates/app_shared/README.md b/packages/flutter_template_images/templates/app_shared/README.md deleted file mode 100644 index 5e01a57..0000000 --- a/packages/flutter_template_images/templates/app_shared/README.md +++ /dev/null @@ -1,10 +0,0 @@ -**DO NOT UPDATE**: This directory is _deprecated_. - -The `skeleton` template is being removed, which as a result means that the -`app_shared` directory is no longer needed (it was used to share template -pieces between `app` and `skeleton`). - -If you are looking to update the `app` template, update -[`templates/app`](../app/) directly. - -See also: . diff --git a/packages/flutter_template_images/templates/app_shared/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/packages/flutter_template_images/templates/app_shared/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png deleted file mode 100644 index dc9ada4725e9b0ddb1deab583e5b5102493aa332..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10932 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 diff --git a/packages/flutter_template_images/templates/app_shared/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/packages/flutter_template_images/templates/app_shared/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png deleted file mode 100644 index 797d452e458972bab9d994556c8305db4c827017..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 406 zcmV;H0crk;P))>cdjpWt&rLJgVp-t?DREyuq1A%0Z4)6_WsQ7{nzjN zo!X zGXV)2i3kcZIL~_j>uIKPK_zib+3T+Nt3Mb&Br)s)UIaA}@p{wDda>7=Q|mGRp7pqY zkJ!7E{MNz$9nOwoVqpFb)}$IP24Wn2JJ=Cw(!`OXJBr45rP>>AQr$6c7slJWvbpNW z@KTwna6d?PP>hvXCcp=4F;=GR@R4E7{4VU^0p4F>v^#A|>07*qoM6N<$f*5nx ACIA2c diff --git a/packages/flutter_template_images/templates/app_shared/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/packages/flutter_template_images/templates/app_shared/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png deleted file mode 100644 index 6ed2d933e1120817fe9182483a228007b18ab6ae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 450 zcmV;z0X_bSP)iGWQ_5NJQ_~rNh*z)}eT%KUb z`7gNk0#AwF^#0T0?hIa^`~Ck;!}#m+_uT050aTR(J!bU#|IzRL%^UsMS#KsYnTF*!YeDOytlP4VhV?b} z%rz_<=#CPc)tU1MZTq~*2=8~iZ!lSa<{9b@2Jl;?IEV8)=fG217*|@)CCYgFze-x? zIFODUIA>nWKpE+bn~n7;-89sa>#DR>TSlqWk*!2hSN6D~Qb#VqbP~4Fk&m`@1$JGr zXPIdeRE&b2Thd#{MtDK$px*d3-Wx``>!oimf%|A-&-q*6KAH)e$3|6JV%HX{Hig)k suLT-RhftRq8b9;(V=235Wa|I=027H2wCDra;{X5v07*qoM6N<$f;9x^2LJ#7 diff --git a/packages/flutter_template_images/templates/app_shared/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/packages/flutter_template_images/templates/app_shared/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png deleted file mode 100644 index 4cd7b0099ca80c806f8fe495613e8d6c69460d76..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 282 zcmV+#0p(^bcu7P-R4C8Q z&e;xxFbF_Vrezo%_kH*OKhshZ6BFpG-Y1e10`QXJKbND7AMQ&cMj60B5TNObaZxYybcN07*qoM6N<$g3m;S%K!iX diff --git a/packages/flutter_template_images/templates/app_shared/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/packages/flutter_template_images/templates/app_shared/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png deleted file mode 100644 index fe730945a01f64a61e2235dbe3f45b08f7729182..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 462 zcmV;<0WtoGP)-}iV`2<;=$?g5M=KQbZ{F&YRNy7Nn@%_*5{gvDM0aKI4?ESmw z{NnZg)A0R`+4?NF_RZexyVB&^^ZvN!{I28tr{Vje;QNTz`dG&Jz0~Ek&f2;*Z7>B|cg}xYpxEFY+0YrKLF;^Q+-HreN0P{&i zK~zY`?b7ECf-n?@;d<&orQ*Q7KoR%4|C>{W^h6@&01>0SKS`dn{Q}GT%Qj_{PLZ_& zs`MFI#j-(>?bvdZ!8^xTwlY{qA)T4QLbY@j(!YJ7aXJervHy6HaG_2SB`6CC{He}f zHVw(fJWApwPq!6VY7r1w-Fs)@ox~N+q|w~e;JI~C4Vf^@d>Wvj=fl`^u9x9wd9 zR%3*Q+)t%S!MU_`id^@&Y{y7-r98lZX0?YrHlfmwb?#}^1b{8g&KzmkE(L>Z&)179 zp<)v6Y}pRl100G2FL_t(o!|l{-Q-VMg#&MKg7c{O0 z2wJImOS3Gy*Z2Qifdv~JYOp;v+U)a|nLoc7hNH;I$;lzDt$}rkaFw1mYK5_0Q(Sut zvbEloxON7$+HSOgC9Z8ltuC&0OSF!-mXv5caV>#bc3@hBPX@I$58-z}(ZZE!t-aOG zpjNkbau@>yEzH(5Yj4kZiMH32XI!4~gVXNnjAvRx;Sdg^`>2DpUEwoMhTs_st8pKG z(%SHyHdU&v%f36~uERh!bd`!T2dw;z6PrOTQ7Vt*#9F2uHlUVnb#ev_o^fh}Dzmq} zWtlk35}k=?xj28uO|5>>$yXadTUE@@IPpgH`gJ~Ro4>jd1IF|(+IX>8M4Ps{PNvmI zNj4D+XgN83gPt_Gm}`Ybv{;+&yu-C(Grdiahmo~BjG-l&mWM+{e5M1sm&=xduwgM9 z`8OEh`=F3r`^E{n_;%9weN{cf2%7=VzC@cYj+lg>+3|D|_1C@{hcU(DyQG_BvBWe? zvTv``=%b1zrol#=R`JB)>cdjpWt&rLJgVp-t?DREyuq1A%0Z4)6_WsQ7{nzjN zo!X zGXV)2i3kcZIL~_j>uIKPK_zib+3T+Nt3Mb&Br)s)UIaA}@p{wDda>7=Q|mGRp7pqY zkJ!7E{MNz$9nOwoVqpFb)}$IP24Wn2JJ=Cw(!`OXJBr45rP>>AQr$6c7slJWvbpNW z@KTwna6d?PP>hvXCcp=4F;=GR@R4E7{4VU^0p4F>v^#A|>07*qoM6N<$f*5nx ACIA2c diff --git a/packages/flutter_template_images/templates/app_shared/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/packages/flutter_template_images/templates/app_shared/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png deleted file mode 100644 index 502f463a9bc882b461c96aadf492d1729e49e725..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 586 zcmV-Q0=4~#P)+}#`wDE{8-2Mebf5<{{PqV{TgVcv*r8?UZ3{-|G?_}T*&y;@cqf{ z{Q*~+qr%%p!1pS*_Uicl#q9lc(D`!D`LN62sNwq{oYw(Wmhk)k<@f$!$@ng~_5)Ru z0Z)trIA5^j{DIW^c+vT2%lW+2<(RtE2wR;4O@)Tm`Xr*?A(qYoM}7i5Yxw>D(&6ou zxz!_Xr~yNF+waPe00049Nkl*;a!v6h%{rlvIH#gW3s8p;bFr=l}mRqpW2h zw=OA%hdyL~z+UHOzl0eKhEr$YYOL-c-%Y<)=j?(bzDweB7{b+%_ypvm_cG{SvM=DK zhv{K@m>#Bw>2W$eUI#iU)Wdgs8Y3U+A$Gd&{+j)d)BmGKx+43U_!tik_YlN)>$7G! zhkE!s;%oku3;IwG3U^2kw?z+HM)jB{@zFhK8P#KMSytSthr+4!c(5c%+^UBn`0X*2 zy3(k600_CSZj?O$Qu%&$;|TGUJrptR(HzyIx>5E(2r{eA(<6t3e3I0B)7d6s7?Z5J zZ!rtKvA{MiEBm&KFtoifx>5P^Z=vl)95XJn()aS5%ad(s?4-=Tkis9IGu{`Fy8r+H07*qoM6N<$f20Z)wqMt%V?S?~D#06};F zA3KcL`Wb+>5ObvgQIG&ig8(;V04hz?@cqy3{mSh8o!|U|)cI!1_+!fWH@o*8vh^CU z^ws0;(c$gI+2~q^tO#GDHf@=;DncUw00J^eL_t(&-tE|HQ`%4vfZ;WsBqu-$0nu1R zq^Vj;p$clf^?twn|KHO+IGt^q#a3X?w9dXC@*yxhv&l}F322(8Y1&=P&I}~G@#h6; z1CV9ecD9ZEe87{{NtI*)_aJ<`kJa z?5=RBtFF50s;jQLFil-`)m2wrb=6h(&brpj%nG_U&ut~$?8Rokzxi8zJoWr#2dto5 zOX_URcc<1`Iky+jc;A%Vzx}1QU{2$|cKPom2Vf1{8m`vja4{F>HS?^Nc^rp}xo+Nh zxd}eOm`fm3@MQC1< zIk&aCjb~Yh%5+Yq0`)D;q{#-Uqlv*o+Oor zE!I71Z@ASH3grl8&P^L0WpavHoP|UX4e?!igT`4?AZk$hu*@%6WJ;zDOGlw7kj@ zY5!B-0ft0f?Lgb>C;$Ke07*qoM6N<$f~t1N9smFU diff --git a/packages/flutter_template_images/templates/app_shared/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/packages/flutter_template_images/templates/app_shared/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png deleted file mode 100644 index 0ec303439225b78712f49115768196d8d76f6790..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 862 zcmV-k1EKthP)20Z)wqMt%V?S?~D#06};F zA3KcL`Wb+>5ObvgQIG&ig8(;V04hz?@cqy3{mSh8o!|U|)cI!1_+!fWH@o*8vh^CU z^ws0;(c$gI+2~q^tO#GDHf@=;DncUw00J^eL_t(&-tE|HQ`%4vfZ;WsBqu-$0nu1R zq^Vj;p$clf^?twn|KHO+IGt^q#a3X?w9dXC@*yxhv&l}F322(8Y1&=P&I}~G@#h6; z1CV9ecD9ZEe87{{NtI*)_aJ<`kJa z?5=RBtFF50s;jQLFil-`)m2wrb=6h(&brpj%nG_U&ut~$?8Rokzxi8zJoWr#2dto5 zOX_URcc<1`Iky+jc;A%Vzx}1QU{2$|cKPom2Vf1{8m`vja4{F>HS?^Nc^rp}xo+Nh zxd}eOm`fm3@MQC1< zIk&aCjb~Yh%5+Yq0`)D;q{#-Uqlv*o+Oor zE!I71Z@ASH3grl8&P^L0WpavHoP|UX4e?!igT`4?AZk$hu*@%6WJ;zDOGlw7kj@ zY5!B-0ft0f?Lgb>C;$Ke07*qoM6N<$f~t1N9smFU diff --git a/packages/flutter_template_images/templates/app_shared/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/packages/flutter_template_images/templates/app_shared/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png deleted file mode 100644 index e9f5fea27c705180eb716271f41b582e76dcbd90..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1674 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 diff --git a/packages/flutter_template_images/templates/app_shared/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/packages/flutter_template_images/templates/app_shared/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png deleted file mode 100644 index 0467bf12aa4d28f374bb26596605a46dcbb3e7c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1418 zcmV;51$Fv~P)q zKfU)WzW*n(@|xWGCA9ScMt*e9`2kdxPQ&&>|-UCa7_51w+ zLUsW@ZzZSW0y$)Hp~e9%PvP|a03ks1`~K?q{u;6NC8*{AOqIUq{CL&;p56Lf$oQGq z^={4hPQv)y=I|4n+?>7Fim=dxt1 z2H+Dm+1+fh+IF>G0SjJMkQQre1x4|G*Z==(Ot&kCnUrL4I(rf(ucITwmuHf^hXiJT zkdTm&kdTm&kdTm&kdP`esgWG0BcWCVkVZ&2dUwN`cgM8QJb`Z7Z~e<&Yj2(}>Tmf` zm1{eLgw!b{bXkjWbF%dTkTZEJWyWOb##Lfw4EK2}<0d6%>AGS{po>WCOy&f$Tay_> z?NBlkpo@s-O;0V%Y_Xa-G#_O08q5LR*~F%&)}{}r&L%Sbs8AS4t7Y0NEx*{soY=0MZExqA5XHQkqi#4gW3 zqODM^iyZl;dvf)-bOXtOru(s)Uc7~BFx{w-FK;2{`VA?(g&@3z&bfLFyctOH!cVsF z7IL=fo-qBndRUm;kAdXR4e6>k-z|21AaN%ubeVrHl*<|s&Ax@W-t?LR(P-24A5=>a z*R9#QvjzF8n%@1Nw@?CG@6(%>+-0ASK~jEmCV|&a*7-GKT72W<(TbSjf)&Eme6nGE z>Gkj4Sq&2e+-G%|+NM8OOm5zVl9{Z8Dd8A5z3y8mZ=4Bv4%>as_{9cN#bm~;h>62( zdqY93Zy}v&c4n($Vv!UybR8ocs7#zbfX1IY-*w~)p}XyZ-SFC~4w>BvMVr`dFbelV{lLL0bx7@*ZZdebr3`sP;? zVImji)kG)(6Juv0lz@q`F!k1FE;CQ(D0iG$wchPbKZQELlsZ#~rt8#90Y_Xh&3U-< z{s<&cCV_1`^TD^ia9!*mQDq& zn2{r`j};V|uV%_wsP!zB?m%;FeaRe+X47K0e+KE!8C{gAWF8)lCd1u1%~|M!XNRvw zvtqy3iz0WSpWdhn6$hP8PaRBmp)q`#PCA`Vd#Tc$@f1tAcM>f_I@bC)hkI9|o(Iqv zo}Piadq!j76}004RBio<`)70k^`K1NK)q>w?p^C6J2ZC!+UppiK6&y3Kmbv&O!oYF z34$0Z;QO!JOY#!`qyGH<3Pd}Pt@q*A0V=3SVtWKRR8d8Z&@)3qLPA19LPA19LPEUC YUoZo%k(ykuW&i*H07*qoM6N<$f+CH{y8r+H diff --git a/packages/flutter_template_images/templates/app_shared/ios.tmpl/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/packages/flutter_template_images/templates/app_shared/ios.tmpl/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png deleted file mode 100644 index 9da19eacad3b03bb08bbddbbf4ac48dd78b3d838..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v diff --git a/packages/flutter_template_images/templates/app_shared/ios.tmpl/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/packages/flutter_template_images/templates/app_shared/ios.tmpl/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png deleted file mode 100644 index 9da19eacad3b03bb08bbddbbf4ac48dd78b3d838..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v diff --git a/packages/flutter_template_images/templates/app_shared/ios.tmpl/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/packages/flutter_template_images/templates/app_shared/ios.tmpl/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png deleted file mode 100644 index 9da19eacad3b03bb08bbddbbf4ac48dd78b3d838..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v diff --git a/packages/flutter_template_images/templates/app_shared/macos.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/packages/flutter_template_images/templates/app_shared/macos.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png deleted file mode 100644 index 82b6f9d9a33e198f5747104729e1fcef999772a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 102994 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ⅅ8MglG&ER{i5lN315cO?EdHNLrg? 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 z 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 Pe7HEdAEg|=c=LY&YVNkY diff --git a/packages/flutter_template_images/templates/app_shared/macos.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/packages/flutter_template_images/templates/app_shared/macos.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png deleted file mode 100644 index 13b35eba55c6dabc3aac36f33d859266c18fa0d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5680 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 diff --git a/packages/flutter_template_images/templates/app_shared/macos.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/packages/flutter_template_images/templates/app_shared/macos.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png deleted file mode 100644 index 0a3f5fa40fb3d1e0710331a48de5d256da3f275d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 520 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(-uuz(rC1}QWNE&K#jR^;j87-Auq zoUlN^K{r-Q+XN;zI ze|?*NFmgt#V#GwrSWaz^2G&@SBmck6ZcIFMww~vE<1E?M2#KUn1CzsB6D2+0SuRV@ zV2kK5HvIGB{HX-hQzs0*AB%5$9RJ@a;)Ahq#p$GSP91^&hi#6sg*;a~dt}4AclK>h z_3MoPRQ{i;==;*1S-mY<(JFzhAxMI&<61&m$J0NDHdJ3tYx~j0%M-uN6Zl8~_0DOkGXc0001@sz3l12C6Xg{AT~( zm6w64BA|AX`Ve)YY-glyudNN>MAfkXz-T7`_`fEolM;0T0BA)(02-OaW z0*cW7Z~ec94o8&g0D$N>b!COu{=m}^%oXZ4?T8ZyPZuGGBPBA7pbQMoV5HYhiT?%! zcae~`(QAN4&}-=#2f5fkn!SWGWmSeCISBcS=1-U|MEoKq=k?_x3apK>9((R zuu$9X?^8?@(a{qMS%J8SJPq))v}Q-ZyDm6Gbie0m92=`YlwnQPQP1kGSm(N2UJ3P6 z^{p-u)SSCTW~c1rw;cM)-uL2{->wCn2{#%;AtCQ!m%AakVs1K#v@(*-6QavyY&v&*wO_rCJXJuq$c$7ZjsW+pJo-$L^@!7X04CvaOpPyfw|FKvu;e(&Iw>Tbg zL}#8e^?X%TReXTt>gsBByt0kSU20oQx*~P=4`&tcZ7N6t-6LiK{LxX*p6}9c<0Pu^ zLx1w_P4P2V>bX=`F%v$#{sUDdF|;rbI{p#ZW`00Bgh(eB(nOIhy8W9T>3aQ=k8Z9% zB+TusFABF~J?N~fAd}1Rme=@4+1=M{^P`~se7}e3;mY0!%#MJf!XSrUC{0uZqMAd7%q zQY#$A>q}noIB4g54Ue)x>ofVm3DKBbUmS4Z-bm7KdKsUixva)1*&z5rgAG2gxG+_x zqT-KNY4g7eM!?>==;uD9Y4iI(Hu$pl8!LrK_Zb}5nv(XKW{9R144E!cFf36p{i|8pRL~p`_^iNo z{mf7y`#hejw#^#7oKPlN_Td{psNpNnM?{7{R-ICBtYxk>?3}OTH_8WkfaTLw)ZRTfxjW+0>gMe zpKg~`Bc$Y>^VX;ks^J0oKhB#6Ukt{oQhN+o2FKGZx}~j`cQB%vVsMFnm~R_1Y&Ml? zwFfb~d|dW~UktY@?zkau>Owe zRroi(<)c4Ux&wJfY=3I=vg)uh;sL(IYY9r$WK1$F;jYqq1>xT{LCkIMb3t2jN8d`9 z=4(v-z7vHucc_fjkpS}mGC{ND+J-hc_0Ix4kT^~{-2n|;Jmn|Xf9wGudDk7bi*?^+ z7fku8z*mbkGm&xf&lmu#=b5mp{X(AwtLTf!N`7FmOmX=4xwbD=fEo8CaB1d1=$|)+ z+Dlf^GzGOdlqTO8EwO?8;r+b;gkaF^$;+#~2_YYVH!hD6r;PaWdm#V=BJ1gH9ZK_9 zrAiIC-)z)hRq6i5+$JVmR!m4P>3yJ%lH)O&wtCyum3A*})*fHODD2nq!1@M>t@Za+ zH6{(Vf>_7!I-APmpsGLYpl7jww@s5hHOj5LCQXh)YAp+y{gG(0UMm(Ur z3o3n36oFwCkn+H*GZ-c6$Y!5r3z*@z0`NrB2C^q#LkOuooUM8Oek2KBk}o1PU8&2L z4iNkb5CqJWs58aR394iCU^ImDqV;q_Pp?pl=RB2372(Io^GA^+oKguO1(x$0<7w3z z)j{vnqEB679Rz4i4t;8|&Zg77UrklxY9@GDq(ZphH6=sW`;@uIt5B?7Oi?A0-BL}(#1&R;>2aFdq+E{jsvpNHjLx2t{@g1}c~DQcPNmVmy| zNMO@ewD^+T!|!DCOf}s9dLJU}(KZy@Jc&2Nq3^;vHTs}Hgcp`cw&gd7#N}nAFe3cM1TF%vKbKSffd&~FG9y$gLyr{#to)nxz5cCASEzQ}gz8O)phtHuKOW6p z@EQF(R>j%~P63Wfosrz8p(F=D|Mff~chUGn(<=CQbSiZ{t!e zeDU-pPsLgtc#d`3PYr$i*AaT!zF#23htIG&?QfcUk+@k$LZI}v+js|yuGmE!PvAV3 ztzh90rK-0L6P}s?1QH`Ot@ilbgMBzWIs zIs6K<_NL$O4lwR%zH4oJ+}JJp-bL6~%k&p)NGDMNZX7)0kni&%^sH|T?A)`z z=adV?!qnWx^B$|LD3BaA(G=ePL1+}8iu^SnnD;VE1@VLHMVdSN9$d)R(Wk{JEOp(P zm3LtAL$b^*JsQ0W&eLaoYag~=fRRdI>#FaELCO7L>zXe6w*nxN$Iy*Q*ftHUX0+N- zU>{D_;RRVPbQ?U+$^%{lhOMKyE5>$?U1aEPist+r)b47_LehJGTu>TcgZe&J{ z{q&D{^Ps~z7|zj~rpoh2I_{gAYNoCIJmio3B}$!5vTF*h$Q*vFj~qbo%bJCCRy509 zHTdDh_HYH8Zb9`}D5;;J9fkWOQi%Y$B1!b9+ESj+B@dtAztlY2O3NE<6HFiqOF&p_ zW-K`KiY@RPSY-p9Q99}Hcd05DT79_pfb{BV7r~?9pWh=;mcKBLTen%THFPo2NN~Nf zriOtFnqx}rtO|A6k!r6 zf-z?y-UD{dT0kT9FJ`-oWuPHbo+3wBS(}?2ql(+e@VTExmfnB*liCb zmeI+v5*+W_L;&kQN^ChW{jE0Mw#0Tfs}`9bk3&7UjxP^Ke(%eJu2{VnW?tu7Iqecm zB5|=-QdzK$=h50~{X3*w4%o1FS_u(dG2s&427$lJ?6bkLet}yYXCy)u_Io1&g^c#( z-$yYmSpxz{>BL;~c+~sxJIe1$7eZI_9t`eB^Pr0)5CuA}w;;7#RvPq|H6!byRzIJG ziQ7a4y_vhj(AL`8PhIm9edCv|%TX#f50lt8+&V+D4<}IA@S@#f4xId80oH$!_!q?@ zFRGGg2mTv&@76P7aTI{)Hu%>3QS_d)pQ%g8BYi58K~m-Ov^7r8BhX7YC1D3vwz&N8{?H*_U7DI?CI)+et?q|eGu>42NJ?K4SY zD?kc>h@%4IqNYuQ8m10+8xr2HYg2qFNdJl=Tmp&ybF>1>pqVfa%SsV*BY$d6<@iJA ziyvKnZ(~F9xQNokBgMci#pnZ}Igh0@S~cYcU_2Jfuf|d3tuH?ZSSYBfM(Y3-JBsC|S9c;# zyIMkPxgrq};0T09pjj#X?W^TFCMf1-9P{)g88;NDI+S4DXe>7d3Mb~i-h&S|Jy{J< zq3736$bH?@{!amD!1Ys-X)9V=#Z={fzsjVYMX5BG6%}tkzwC#1nQLj1y1f#}8**4Y zAvDZHw8)N)8~oWC88CgzbwOrL9HFbk4}h85^ptuu7A+uc#$f^9`EWv1Vr{5+@~@Uv z#B<;-nt;)!k|fRIg;2DZ(A2M2aC65kOIov|?Mhi1Sl7YOU4c$T(DoRQIGY`ycfkn% zViHzL;E*A{`&L?GP06Foa38+QNGA zw3+Wqs(@q+H{XLJbwZzE(omw%9~LPZfYB|NF5%j%E5kr_xE0u;i?IOIchn~VjeDZ) zAqsqhP0vu2&Tbz3IgJvMpKbThC-@=nk)!|?MIPP>MggZg{cUcKsP8|N#cG5 zUXMXxcXBF9`p>09IR?x$Ry3;q@x*%}G#lnB1}r#!WL88I@uvm}X98cZ8KO&cqT1p> z+gT=IxPsq%n4GWgh-Bk8E4!~`r@t>DaQKsjDqYc&h$p~TCh8_Mck5UB84u6Jl@kUZCU9BA-S!*bf>ZotFX9?a_^y%)yH~rsAz0M5#^Di80_tgoKw(egN z`)#(MqAI&A84J#Z<|4`Co8`iY+Cv&iboMJ^f9ROUK0Lm$;-T*c;TCTED_0|qfhlcS zv;BD*$Zko#nWPL}2K8T-?4}p{u)4xon!v_(yVW8VMpxg4Kh^J6WM{IlD{s?%XRT8P|yCU`R&6gwB~ zg}{At!iWCzOH37!ytcPeC`(({ovP7M5Y@bYYMZ}P2Z3=Y_hT)4DRk}wfeIo%q*M9UvXYJq!-@Ly79m5aLD{hf@BzQB>FdQ4mw z6$@vzSKF^Gnzc9vbccii)==~9H#KW<6)Uy1wb~auBn6s`ct!ZEos`WK8e2%<00b%# zY9Nvnmj@V^K(a_38dw-S*;G-(i(ETuIwyirs?$FFW@|66a38k+a%GLmucL%Wc8qk3 z?h_4!?4Y-xt)ry)>J`SuY**fuq2>u+)VZ+_1Egzctb*xJ6+7q`K$^f~r|!i?(07CD zH!)C_uerf-AHNa?6Y61D_MjGu*|wcO+ZMOo4q2bWpvjEWK9yASk%)QhwZS%N2_F4& z16D18>e%Q1mZb`R;vW{+IUoKE`y3(7p zplg5cBB)dtf^SdLd4n60oWie|(ZjgZa6L*VKq02Aij+?Qfr#1z#fwh92aV-HGd^_w zsucG24j8b|pk>BO7k8dS86>f-jBP^Sa}SF{YNn=^NU9mLOdKcAstv&GV>r zLxKHPkFxpvE8^r@MSF6UA}cG`#yFL8;kA7ccH9D=BGBtW2;H>C`FjnF^P}(G{wU;G z!LXLCbPfsGeLCQ{Ep$^~)@?v`q(uI`CxBY44osPcq@(rR-633!qa zsyb>?v%@X+e|Mg`+kRL*(;X>^BNZz{_kw5+K;w?#pReiw7eU8_Z^hhJ&fj80XQkuU z39?-z)6Fy$I`bEiMheS(iB6uLmiMd1i)cbK*9iPpl+h4x9ch7x- z1h4H;W_G?|)i`z??KNJVwgfuAM=7&Apd3vm#AT8uzQZ!NII}}@!j)eIfn53h{NmN7 zAKG6SnKP%^k&R~m5#@_4B@V?hYyHkm>0SQ@PPiw*@Tp@UhP-?w@jW?nxXuCipMW=L zH*5l*d@+jXm0tIMP_ec6Jcy6$w(gKK@xBX8@%oPaSyG;13qkFb*LuVx3{AgIyy&n3 z@R2_DcEn|75_?-v5_o~%xEt~ONB>M~tpL!nOVBLPN&e5bn5>+7o0?Nm|EGJ5 zmUbF{u|Qn?cu5}n4@9}g(G1JxtzkKv(tqwm_?1`?YSVA2IS4WI+*(2D*wh&6MIEhw z+B+2U<&E&|YA=3>?^i6)@n1&&;WGHF-pqi_sN&^C9xoxME5UgorQ_hh1__zzR#zVC zOQt4q6>ME^iPJ37*(kg4^=EFqyKH@6HEHXy79oLj{vFqZGY?sVjk!BX^h$SFJlJnv z5uw~2jLpA)|0=tp>qG*tuLru?-u`khGG2)o{+iDx&nC}eWj3^zx|T`xn5SuR;Aw8U z`p&>dJw`F17@J8YAuW4=;leBE%qagVTG5SZdh&d)(#ZhowZ|cvWvGMMrfVsbg>_~! z19fRz8CSJdrD|Rl)w!uznBF&2-dg{>y4l+6(L(vzbLA0Bk&`=;oQQ>(M8G=3kto_) zP8HD*n4?MySO2YrG6fwSrVmnesW+D&fxjfEmp=tPd?RKLZJcH&K(-S+x)2~QZ$c(> zru?MND7_HPZJVF%wX(49H)+~!7*!I8w72v&{b={#l9yz+S_aVPc_So%iF8>$XD1q1 zFtucO=rBj0Ctmi0{njN8l@}!LX}@dwl>3yMxZ;7 z0Ff2oh8L)YuaAGOuZ5`-p%Z4H@H$;_XRJQ|&(MhO78E|nyFa158gAxG^SP(vGi^+< zChY}o(_=ci3Wta#|K6MVljNe0T$%Q5ylx-v`R)r8;3+VUpp-)7T`-Y&{Zk z*)1*2MW+_eOJtF5tCMDV`}jg-R(_IzeE9|MBKl;a7&(pCLz}5<Zf+)T7bgNUQ_!gZtMlw=8doE}#W+`Xp~1DlE=d5SPT?ymu!r4z%&#A-@x^=QfvDkfx5-jz+h zoZ1OK)2|}_+UI)i9%8sJ9X<7AA?g&_Wd7g#rttHZE;J*7!e5B^zdb%jBj&dUDg4&B zMMYrJ$Z%t!5z6=pMGuO-VF~2dwjoXY+kvR>`N7UYfIBMZGP|C7*O=tU z2Tg_xi#Q3S=1|=WRfZD;HT<1D?GMR%5kI^KWwGrC@P2@R>mDT^3qsmbBiJc21kip~ zZp<7;^w{R;JqZ)C4z-^wL=&dBYj9WJBh&rd^A^n@07qM$c+kGv^f+~mU5_*|eePF| z3wDo-qaoRjmIw<2DjMTG4$HP{z54_te_{W^gu8$r=q0JgowzgQPct2JNtWPUsjF8R zvit&V8$(;7a_m%%9TqPkCXYUp&k*MRcwr*24>hR! z$4c#E=PVE=P4MLTUBM z7#*RDe0}=B)(3cvNpOmWa*eH#2HR?NVqXdJ=hq);MGD07JIQQ7Y0#iD!$C+mk7x&B zMwkS@H%>|fmSu#+ zI!}Sb(%o29Vkp_Th>&&!k7O>Ba#Om~B_J{pT7BHHd8(Ede(l`7O#`_}19hr_?~JP9 z`q(`<)y>%)x;O7)#-wfCP{?llFMoH!)ZomgsOYFvZ1DxrlYhkWRw#E-#Qf*z@Y-EQ z1~?_=c@M4DO@8AzZ2hKvw8CgitzI9yFd&N1-{|vP#4IqYb*#S0e3hrjsEGlnc4xwk z4o!0rxpUt8j&`mJ8?+P8G{m^jbk)bo_UPM+ifW*y-A*et`#_Ja_3nYyRa9fAG1Xr5 z>#AM_@PY|*u)DGRWJihZvgEh#{*joJN28uN7;i5{kJ*Gb-TERfN{ERe_~$Es~NJCpdKLRvdj4658uYYx{ng7I<6j~w@p%F<7a(Ssib|j z51;=Py(Nu*#hnLx@w&8X%=jrADn3TW>kplnb zYbFIWWVQXN7%Cwn6KnR)kYePEBmvM45I)UJb$)ninpdYg3a5N6pm_7Q+9>!_^xy?k za8@tJ@OOs-pRAAfT>Nc2x=>sZUs2!9Dwa%TTmDggH4fq(x^MW>mcRyJINlAqK$YQCMgR8`>6=Sg$ zFnJZsA8xUBXIN3i70Q%8px@yQPMgVP=>xcPI38jNJK<=6hC={a07+n@R|$bnhB)X$ z(Zc%tadp70vBTnW{OUIjTMe38F}JIH$#A}PB&RosPyFZMD}q}5W%$rh>5#U;m`z2K zc(&WRxx7DQLM-+--^w*EWAIS%bi>h587qkwu|H=hma3T^bGD&Z!`u(RKLeNZ&pI=q$|HOcji(0P1QC!YkAp*u z3%S$kumxR}jU<@6`;*-9=5-&LYRA<~uFrwO3U0k*4|xUTp4ZY7;Zbjx|uw&BWU$zK(w55pWa~#=f$c zNDW0O68N!xCy>G}(CX=;8hJLxAKn@Aj(dbZxO8a$+L$jK8$N-h@4$i8)WqD_%Snh4 zR?{O%k}>lr>w$b$g=VP8mckcCrjnp>uQl5F_6dPM8FWRqs}h`DpfCv20uZhyY~tr8 zkAYW4#yM;*je)n=EAb(q@5BWD8b1_--m$Q-3wbh1hM{8ihq7UUQfg@)l06}y+#=$( z$x>oVYJ47zAC^>HLRE-!HitjUixP6!R98WU+h>zct7g4eD;Mj#FL*a!VW!v-@b(Jv zj@@xM5noCp5%Vk3vY{tyI#oyDV7<$`KG`tktVyC&0DqxA#>V;-3oH%NW|Q&=UQ&zU zXNIT67J4D%5R1k#bW0F}TD`hlW7b)-=-%X4;UxQ*u4bK$mTAp%y&-(?{sXF%e_VH6 zTkt(X)SSN|;8q@8XX6qfR;*$r#HbIrvOj*-5ND8RCrcw4u8D$LXm5zlj@E5<3S0R# z??=E$p{tOk96$SloZ~ARe5`J=dB|Nj?u|zy2r(-*(q^@YwZiTF@QzQyPx_l=IDKa) zqD@0?IHJqSqZ_5`)81?4^~`yiGh6>7?|dKa8!e|}5@&qV!Iu9<@G?E}Vx9EzomB3t zEbMEm$TKGwkHDpirp;FZD#6P5qIlQJ8}rf;lHoz#h4TFFPYmS3+8(13_Mx2`?^=8S z|0)0&dQLJTU6{b%*yrpQe#OKKCrL8}YKw+<#|m`SkgeoN69TzIBQOl_Yg)W*w?NW) z*WxhEp$zQBBazJSE6ygu@O^!@Fr46j=|K`Mmb~xbggw7<)BuC@cT@Bwb^k?o-A zKX^9AyqR?zBtW5UA#siILztgOp?r4qgC`9jYJG_fxlsVSugGprremg-W(K0{O!Nw-DN%=FYCyfYA3&p*K>+|Q}s4rx#CQK zNj^U;sLM#q8}#|PeC$p&jAjqMu(lkp-_50Y&n=qF9`a3`Pr9f;b`-~YZ+Bb0r~c+V z*JJ&|^T{}IHkwjNAaM^V*IQ;rk^hnnA@~?YL}7~^St}XfHf6OMMCd9!vhk#gRA*{L zp?&63axj|Si%^NW05#87zpU_>QpFNb+I00v@cHwvdBn+Un)n2Egdt~LcWOeBW4Okm zD$-e~RD+W|UB;KQ;a7GOU&%p*efGu2$@wR74+&iP8|6#_fmnh^WcJLs)rtz{46);F z4v0OL{ZP9550>2%FE(;SbM*#sqMl*UXOb>ch`fJ|(*bOZ9=EB1+V4fkQ)hjsm3-u^Pk-4ji_uDDHdD>84tER!MvbH`*tG zzvbhBR@}Yd`azQGavooV=<WbvWLlO#x`hyO34mKcxrGv=`{ssnP=0Be5#1B;Co9 zh{TR>tjW2Ny$ZxJpYeg57#0`GP#jxDCU0!H15nL@@G*HLQcRdcsUO3sO9xvtmUcc{F*>FQZcZ5bgwaS^k-j5mmt zI7Z{Xnoml|A(&_{imAjK!kf5>g(oDqDI4C{;Bv162k8sFNr;!qPa2LPh>=1n z=^_9)TsLDvTqK7&*Vfm5k;VXjBW^qN3Tl&}K=X5)oXJs$z3gk0_+7`mJvz{pK|FVs zHw!k&7xVjvY;|(Py<;J{)b#Yjj*LZO7x|~pO4^MJ2LqK3X;Irb%nf}L|gck zE#55_BNsy6m+W{e zo!P59DDo*s@VIi+S|v93PwY6d?CE=S&!JLXwE9{i)DMO*_X90;n2*mPDrL%{iqN!?%-_95J^L z=l<*{em(6|h7DR4+4G3Wr;4*}yrBkbe3}=p7sOW1xj!EZVKSMSd;QPw>uhKK z#>MlS@RB@-`ULv|#zI5GytO{=zp*R__uK~R6&p$q{Y{iNkg61yAgB8C^oy&``{~FK z8hE}H&nIihSozKrOONe5Hu?0Zy04U#0$fB7C6y~?8{or}KNvP)an=QP&W80mj&8WL zEZQF&*FhoMMG6tOjeiCIV;T{I>jhi9hiUwz?bkX3NS-k5eWKy)Mo_orMEg4sV6R6X&i-Q%JG;Esl+kLpn@Bsls9O|i9z`tKB^~1D5)RIBB&J<6T@a4$pUvh$IR$%ubH)joi z!7>ON0DPwx=>0DA>Bb^c?L8N0BBrMl#oDB+GOXJh;Y&6I)#GRy$W5xK%a;KS8BrER zX)M>Rdoc*bqP*L9DDA3lF%U8Yzb6RyIsW@}IKq^i7v&{LeIc=*ZHIbO68x=d=+0T( zev=DT9f|x!IWZNTB#N7}V4;9#V$%Wo0%g>*!MdLOEU>My0^gni9ocID{$g9ytD!gy zKRWT`DVN(lcYjR|(}f0?zgBa3SwunLfAhx><%u0uFkrdyqlh8_g zDKt#R6rA2(Vm2LW_>3lBNYKG_F{TEnnKWGGC15y&OebIRhFL4TeMR*v9i0wPoK#H< zu4){s4K&K)K(9~jgGm;H7lS7y_RYfS;&!Oj5*eqbvEcW^a*i67nevzOZxN6F+K~A%TYEtsAVsR z@J=1hc#Dgs7J2^FL|qV&#WBFQyDtEQ2kPO7m2`)WFhqAob)Y>@{crkil6w9VoA?M6 zADGq*#-hyEVhDG5MQj677XmcWY1_-UO40QEP&+D)rZoYv^1B_^w7zAvWGw&pQyCyx zD|ga$w!ODOxxGf_Qq%V9Z7Q2pFiUOIK818AGeZ-~*R zI1O|SSc=3Z?#61Rd|AXx2)K|F@Z1@x!hBBMhAqiU)J=U|Y)T$h3D?ZPPQgkSosnN! zIqw-t$0fqsOlgw3TlHJF*t$Q@bg$9}A3X=cS@-yU3_vNG_!#9}7=q7!LZ?-%U26W4 z$d>_}*s1>Ac%3uFR;tnl*fNlylJ)}r2^Q3&@+is3BIv<}x>-^_ng;jhdaM}6Sg3?p z0jS|b%QyScy3OQ(V*~l~bK>VC{9@FMuW_JUZO?y(V?LKWD6(MXzh}M3r3{7b4eB(#`(q1m{>Be%_<9jw8HO!x#yF6vez$c#kR+}s zZO-_;25Sxngd(}){zv?ccbLqRAlo;yog>4LH&uZUK1n>x?u49C)Y&2evH5Zgt~666 z_2_z|H5AO5Iqxv_Bn~*y1qzRPcob<+Otod5Xd2&z=C;u+F}zBB@b^UdGdUz|s!H}M zXG%KiLzn3G?FZgdY&3pV$nSeY?ZbU^jhLz9!t0K?ep}EFNqR1@E!f*n>x*!uO*~JF zW9UXWrVgbX1n#76_;&0S7z}(5n-bqnII}_iDsNqfmye@)kRk`w~1 z6j4h4BxcPe6}v)xGm%=z2#tB#^KwbgMTl2I*$9eY|EWAHFc3tO48Xo5rW z5oHD!G4kb?MdrOHV=A+8ThlIqL8Uu+7{G@ zb)cGBm|S^Eh5= z^E^SZ=yeC;6nNCdztw&TdnIz}^Of@Ke*@vjt)0g>Y!4AJvWiL~e7+9#Ibhe)> ziNwh>gWZL@FlWc)wzihocz+%+@*euwXhW%Hb>l7tf8aJe5_ZSH1w-uG|B;9qpcBP0 zM`r1Hu#htOl)4Cl1c7oY^t0e4Jh$-I(}M5kzWqh{F=g&IM#JiC`NDSd@BCKX#y<P@Gwl$3a3w z6<(b|K(X5FIR22M)sy$4jY*F4tT{?wZRI+KkZFb<@j@_C316lu1hq2hA|1wCmR+S@ zRN)YNNE{}i_H`_h&VUT5=Y(lN%m?%QX;6$*1P}K-PcPx>*S55v)qZ@r&Vcic-sjkm z! z=nfW&X`}iAqa_H$H%z3Tyz5&P3%+;93_0b;zxLs)t#B|up}JyV$W4~`8E@+BHQ+!y zuIo-jW!~)MN$2eHwyx-{fyGjAWJ(l8TZtUp?wZWBZ%}krT{f*^fqUh+ywHifw)_F> zp76_kj_B&zFmv$FsPm|L7%x-j!WP>_P6dHnUTv!9ZWrrmAUteBa`rT7$2ixO;ga8U z3!91micm}{!Btk+I%pMgcKs?H4`i+=w0@Ws-CS&n^=2hFTQ#QeOmSz6ttIkzmh^`A zYPq)G1l3h(E$mkyr{mvz*MP`x+PULBn%CDhltKkNo6Uqg!vJ#DA@BIYr9TQ`18Un2 zv$}BYzOQuay9}w(?JV63F$H6WmlYPPpH=R|CPb%C@BCv|&Q|&IcW7*LX?Q%epS z`=CPx{1HnJ9_46^=0VmNb>8JvMw-@&+V8SDLRYsa>hZXEeRbtf5eJ>0@Ds47zIY{N z42EOP9J8G@MXXdeiPx#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91AfN*P1ONa40RR91AOHXW0IY^$^8f$?lu1NER9Fe^SItioK@|V(ZWmgL zZT;XwPgVuWM>O%^|Dc$VK;n&?9!&g5)aVsG8cjs5UbtxVVnQNOV~7Mrg3+jnU;rhE z6fhW6P)R>_eXrXo-RW*y6RQ_qcb^s1wTu$TwriZ`=JUws>vRi}5x}MW1MR#7p|gIWJlaLK;~xaN}b< z<-@=RX-%1mt`^O0o^~2=CD7pJ<<$Rp-oUL-7PuG>do^5W_Mk#unlP}6I@6NPxY`Q} zuXJF}!0l)vwPNAW;@5DjPRj?*rZxl zwn;A(cFV!xe^CUu+6SrN?xe#mz?&%N9QHf~=KyK%DoB8HKC)=w=3E?1Bqj9RMJs3U z5am3Uv`@+{jgqO^f}Lx_Jp~CoP3N4AMZr~4&d)T`R?`(M{W5WWJV^z~2B|-oih@h^ zD#DuzGbl(P5>()u*YGo*Och=oRr~3P1wOlKqI)udc$|)(bacG5>~p(y>?{JD7nQf_ z*`T^YL06-O>T(s$bi5v~_fWMfnE7Vn%2*tqV|?~m;wSJEVGkNMD>+xCu#um(7}0so zSEu7?_=Q64Q5D+fz~T=Rr=G_!L*P|(-iOK*@X8r{-?oBlnxMNNgCVCN9Y~ocu+?XA zjjovJ9F1W$Nf!{AEv%W~8oahwM}4Ruc+SLs>_I_*uBxdcn1gQ^2F8a*vGjgAXYyh? zWCE@c5R=tbD(F4nL9NS?$PN1V_2*WR?gjv3)4MQeizuH`;sqrhgykEzj z593&TGlm3h`sIXy_U<7(dpRXGgp0TB{>s?}D{fwLe>IV~exweOfH!qM@CV5kib!YA z6O0gvJi_0J8IdEvyP#;PtqP*=;$iI2t(xG2YI-e!)~kaUn~b{6(&n zp)?iJ`z2)Xh%sCV@BkU`XL%_|FnCA?cVv@h*-FOZhY5erbGh)%Q!Av#fJM3Csc_g zC2I6x%$)80`Tkz#KRA!h1FzY`?0es3t!rKDT5EjPe6B=BLPr7s0GW!if;Ip^!AmGW zL;$`Vdre+|FA!I4r6)keFvAx3M#1`}ijBHDzy)3t0gwjl|qC2YB`SSxFKHr(oY#H$)x{L$LL zBdLKTlsOrmb>T0wd=&6l3+_Te>1!j0OU8%b%N342^opKmT)gni(wV($s(>V-fUv@0p8!f`=>PxC|9=nu ze{ToBBj8b<{PLfXV$h8YPgA~E!_sF9bl;QOF{o6t&JdsX?}rW!_&d`#wlB6T_h;Xf zl{4Tz5>qjF4kZgjO7ZiLPRz_~U@k5%?=30+nxEh9?s78gZ07YHB`FV`4%hlQlMJe@J`+e(qzy+h(9yY^ckv_* zb_E6o4p)ZaWfraIoB2)U7_@l(J0O%jm+Or>8}zSSTkM$ASG^w3F|I? z$+eHt7T~04(_WfKh27zqS$6* zzyy-ZyqvSIZ0!kkSvHknm_P*{5TKLQs8S6M=ONuKAUJWtpxbL#2(_huvY(v~Y%%#~ zYgsq$JbLLprKkV)32`liIT$KKEqs$iYxjFlHiRNvBhxbDg*3@Qefw4UM$>i${R5uB zhvTgmqQsKA{vrKN;TSJU2$f9q=y{$oH{<)woSeV>fkIz6D8@KB zf4M%v%f5U2?<8B(xn}xV+gWP?t&oiapJhJbfa;agtz-YM7=hrSuxl8lAc3GgFna#7 zNjX7;`d?oD`#AK+fQ=ZXqfIZFEk{ApzjJF0=yO~Yj{7oQfXl+6v!wNnoqwEvrs81a zGC?yXeSD2NV!ejp{LdZGEtd1TJ)3g{P6j#2jLR`cpo;YX}~_gU&Gd<+~SUJVh+$7S%`zLy^QqndN<_9 zrLwnXrLvW+ew9zX2)5qw7)zIYawgMrh`{_|(nx%u-ur1B7YcLp&WFa24gAuw~& zKJD3~^`Vp_SR$WGGBaMnttT)#fCc^+P$@UHIyBu+TRJWbcw4`CYL@SVGh!X&y%!x~ zaO*m-bTadEcEL6V6*{>irB8qT5Tqd54TC4`h`PVcd^AM6^Qf=GS->x%N70SY-u?qr>o2*OV7LQ=j)pQGv%4~z zz?X;qv*l$QSNjOuQZ>&WZs2^@G^Qas`T8iM{b19dS>DaXX~=jd4B2u`P;B}JjRBi# z_a@&Z5ev1-VphmKlZEZZd2-Lsw!+1S60YwW6@>+NQ=E5PZ+OUEXjgUaXL-E0fo(E* zsjQ{s>n33o#VZm0e%H{`KJi@2ghl8g>a~`?mFjw+$zlt|VJhSU@Y%0TWs>cnD&61fW4e0vFSaXZa4-c}U{4QR8U z;GV3^@(?Dk5uc@RT|+5C8-24->1snH6-?(nwXSnPcLn#X_}y3XS)MI_?zQ$ZAuyg+ z-pjqsw}|hg{$~f0FzmmbZzFC0He_*Vx|_uLc!Ffeb8#+@m#Z^AYcWcZF(^Os8&Z4g zG)y{$_pgrv#=_rV^D|Y<_b@ICleUv>c<0HzJDOsgJb#Rd-Vt@+EBDPyq7dUM9O{Yp zuGUrO?ma2wpuJuwl1M=*+tb|qx7Doj?!F-3Z>Dq_ihFP=d@_JO;vF{iu-6MWYn#=2 zRX6W=`Q`q-+q@Db|6_a1#8B|#%hskH82lS|9`im0UOJn?N#S;Y0$%xZw3*jR(1h5s z?-7D1tnIafviko>q6$UyqVDq1o@cwyCb*})l~x<@s$5D6N=-Uo1yc49p)xMzxwnuZ zHt!(hu-Ek;Fv4MyNTgbW%rPF*dB=;@r3YnrlFV{#-*gKS_qA(G-~TAlZ@Ti~Yxw;k za1EYyX_Up|`rpbZ0&Iv#$;eC|c0r4XGaQ-1mw@M_4p3vKIIpKs49a8Ns#ni)G314Z z8$Ei?AhiT5dQGWUYdCS|IC7r z=-8ol>V?u!n%F*J^^PZ(ONT&$Ph;r6X;pj|03HlDY6r~0g~X#zuzVU%a&!fs_f|m?qYvg^Z{y?9Qh7Rn?T*F%7lUtA6U&={HzhYEzA`knx1VH> z{tqv?p@I(&ObD5L4|YJV$QM>Nh-X3cx{I&!$FoPC_2iIEJfPk-$;4wz>adRu@n`_y z_R6aN|MDHdK;+IJmyw(hMoDCFCQ(6?hCAG5&7p{y->0Uckv# zvooVuu04$+pqof777ftk<#42@KQ((5DPcSMQyzGOJ{e9H$a9<2Qi_oHjl{#=FUL9d z+~0^2`tcvmp0hENwfHR`Ce|<1S@p;MNGInXCtHnrDPXCKmMTZQ{HVm_cZ>@?Wa6}O zHsJc7wE)mc@1OR2DWY%ZIPK1J2p6XDO$ar`$RXkbW}=@rFZ(t85AS>>U0!yt9f49^ zA9@pc0P#k;>+o5bJfx0t)Lq#v4`OcQn~av__dZ-RYOYu}F#pdsl31C^+Qgro}$q~5A<*c|kypzd} ziYGZ~?}5o`S5lw^B{O@laad9M_DuJle- z*9C7o=CJh#QL=V^sFlJ0c?BaB#4bV^T(DS6&Ne&DBM_3E$S^S13qC$7_Z?GYXTpR@wqr70wu$7+qvf-SEUa5mdHvFbu^7ew!Z1a^ zo}xKOuT*gtGws-a{Tx}{#(>G~Y_h&5P@Q8&p!{*s37^QX_Ibx<6XU*AtDOIvk|^{~ zPlS}&DM5$Ffyu-T&0|KS;Wnaqw{9DB&B3}vcO14wn;)O_e@2*9B&0I_ zZz{}CMxx`hv-XouY>^$Y@J(_INeM>lIQI@I>dBAqq1)}?Xmx(qRuX^i4IV%=MF306 z9g)i*79pP%_7Ex?m6ag-4Tlm=Z;?DQDyC-NpUIb#_^~V_tsL<~5<&;Gf2N+p?(msn zzUD~g>OoW@O}y0@Z;RN)wjam`CipmT&O7a|YljZqU=U86 zedayEdY)2F#BJ6xvmW8K&ffdS*0!%N<%RB!2~PAT4AD*$W7yzHbX#Eja9%3aD+Ah2 zf#T;XJW-GMxpE=d4Y>}jE=#U`IqgSoWcuvgaWQ9j1CKzG zDkoMDDT)B;Byl3R2PtC`ip=yGybfzmVNEx{xi_1|Cbqj>=FxQc{g`xj6fIfy`D8fA z##!-H_e6o0>6Su&$H2kQTujtbtyNFeKc}2=|4IfLTnye#@$Au7Kv4)dnA;-fz@D_8 z)>irG$)dkBY~zX zC!ZXLy*L3xr6cb70QqfN#Q>lFIc<>}>la4@3%7#>a1$PU&O^&VszpxLC%*!m-cO{B z-Y}rQr4$84(hvy#R69H{H zJ*O#uJh)TF6fbXy;fZkk%X=CjsTK}o5N1a`d7kgYYZLPxsHx%9*_XN8VWXEkVJZ%A z1A+5(B;0^{T4aPYr8%i@i32h)_)|q?9vws)r+=5u)1YNftF5mknwfd*%jXA2TeP}Z zQ!m?xJ3?9LpPM?_A3$hQ1QxNbR&}^m z!F999s?p^ak#C4NM_x2p9FoXWJ$>r?lJ)2bG)sX{gExgLA2s5RwHV!h6!C~d_H||J z>9{E{mEv{Z1z~65Vix@dqM4ZqiU|!)eWX$mwS5mLSufxbpBqqS!jShq1bmwCR6 z4uBri7ezMeS6ycaXPVu(i2up$L; zjpMtB`k~WaNrdgM_R=e#SN?Oa*u%nQy01?()h4A(jyfeNfx;5o+kX?maO4#1A^L}0 zYNyIh@QVXIFiS0*tE}2SWTrWNP3pH}1Vz1;E{@JbbgDFM-_Mky^7gH}LEhl~Ve5PexgbIyZ(IN%PqcaV@*_`ZFb=`EjspSz%5m2E34BVT)d=LGyHVz@-e%9Ova*{5@RD;7=Ebkc2GP%pIP^P7KzKapnh`UpH?@h z$RBpD*{b?vhohOKf-JG3?A|AX|2pQ?(>dwIbWhZ38GbTm4AImRNdv_&<99ySX;kJ| zo|5YgbHZC#HYgjBZrvGAT4NZYbp}qkVSa;C-LGsR26Co+i_HM&{awuO9l)Ml{G8zD zs$M8R`r+>PT#Rg!J(K6T4xHq7+tscU(}N$HY;Yz*cUObX7J7h0#u)S7b~t^Oj}TBF zuzsugnst;F#^1jm>22*AC$heublWtaQyM6RuaquFd8V#hJ60Z3j7@bAs&?dD#*>H0SJaDwp%U~27>zdtn+ z|8sZzklZy$%S|+^ie&P6++>zbrq&?+{Yy11Y>@_ce@vU4ZulS@6yziG6;iu3Iu`M= zf3rcWG<+3F`K|*(`0mE<$89F@jSq;j=W#E>(R}2drCB7D*0-|D;S;(;TwzIJkGs|q z2qH{m_zZ+el`b;Bv-#bQ>}*VPYC|7`rgBFf2oivXS^>v<&HHTypvd4|-zn|=h=TG{ z05TH2+{T%EnADO>3i|CB zCu60#qk`}GW{n4l-E$VrqgZGbI zbQW690KgZt4U3F^5@bdO1!xu~p@7Y~*_FfWg2CdvED5P5#w#V46LH`<&V0{t&Ml~4 zHNi7lIa+#i+^Z6EnxO7KJQw)wD)4~&S-Ki8)3=jpqxmx6c&zU&<&h%*c$I(5{1HZT zc9WE}ijcWJiVa^Q^xC|WX0habl89qycOyeViIbi(LFsEY_8a|+X^+%Qv+W4vzj>`y zpuRnjc-eHNkvXvI_f{=*FX=OKQzT?bck#2*qoKTHmDe>CDb&3AngA1O)1b}QJ1Tun z_<@yVEM>qG7664Pa@dzL@;DEh`#?yM+M|_fQS<7yv|i*pw)|Z8)9IR+QB7N3v3K(wv4OY*TXnH&X0nQB}?|h2XQeGL^q~N7N zDFa@x0E(UyN7k9g%IFq7Sf+EAfE#K%%#`)!90_)Dmy3Bll&e1vHQyPA87TaF(xbqMpDntVp?;8*$87STop$!EAnGhZ?>mqPJ(X zFsr336p3P{PpZCGn&^LP(JjnBbl_3P3Kcq+m}xVFMVr1zdCPJMDIV_ki#c=vvTwbU z*gKtfic&{<5ozL6Vfpx>o2Tts?3fkhWnJD&^$&+Mh5WGGyO7fG@6WDE`tEe(8<;+q z@Ld~g08XDzF8xtmpIj`#q^(Ty{Hq>t*v`pedHnuj(0%L(%sjkwp%s}wMd!a<*L~9T z9MM@s)Km~ogxlqEhIw5(lc46gCPsSosUFsgGDr8H{mj%OzJz{N#;bQ;KkV+ZWA1(9 zu0PXzyh+C<4OBYQ0v3z~Lr;=C@qmt8===Ov2lJ1=DeLfq*#jgT{YQCuwz?j{&3o_6 zsqp2Z_q-YWJg?C6=!Or|b@(zxTlg$ng2eUQzuC<+o)k<6^9ju_Z*#x+oioZ5T8Z_L zz9^A1h2eFS0O5muq8;LuDKwOv4A9pxmOjgb6L*i!-(0`Ie^d5Fsgspon%X|7 zC{RRXEmYn!5zP9XjG*{pLa)!2;PJB2<-tH@R7+E1cRo=Wz_5Ko8h8bB$QU%t9#vol zAoq?C$~~AsYC|AQQ)>>7BJ@{Cal)ZpqE=gjT+Juf!RD-;U0mbV1ED5PbvFD6M=qj1 zZ{QERT5@(&LQ~1X9xSf&@%r|3`S#ZCE=sWD`D4YQZ`MR`G&s>lN{y2+HqCfvgcw3E z-}Kp(dfGG?V|97kAHQX+OcKCZS`Q%}HD6u*e$~Ki&Vx53&FC!x94xJd4F2l^qQeFO z?&JdmgrdVjroKNJx64C!H&Vncr^w zzR#XI}Dn&o8jB~_YlVM^+#0W(G1LZH5K^|uYT@KSR z^Y5>^*Bc45E1({~EJB(t@4n9gb-eT#s@@7)J^^<_VV`Pm!h7av8XH6^5zO zOcQBhTGr;|MbRsgxCW69w{bl4EW#A~);L?d4*y#j8Ne=Z@fmJP0k4{_cQ~KA|Y#_#BuUiYx8y*za3_6Y}c=GSe7(2|KAfhdzud!Zq&}j)=o4 z7R|&&oX7~e@~HmyOOsCCwy`AR+deNjZ3bf6ijI_*tKP*_5JP3;0d;L_p(c>W1b%sG zJ*$wcO$ng^aW0E(5ldckV9unU7}OB7s?Wx(761?1^&8tA5y0_(ieV>(x-e@}1`lWC z-YH~G$D>#ud!SxK2_Iw{K%92=+{4yb-_XC>ji&j7)1ofp(OGa4jjF;Hd*`6YQL+Jf zffg+6CPc8F@EDPN{Kn96yip;?g@)qgkPo^nVKFqY?8!=h$G$V=<>%5J&iVjwR!7H0 z$@QL|_Q81I;Bnq8-5JyNRv$Y>`sWl{qhq>u+X|)@cMlsG!{*lu?*H`Tp|!uv z9oEPU1jUEj@ueBr}%Y)7Luyi)REaJV>eQ{+uy4uh0ep0){t;OU8D*RZ& zE-Z-&=BrWQLAD^A&qut&4{ZfhqK1ZQB0fACP)=zgx(0(o-`U62EzTkBkG@mXqbjXm z>w`HNeQM?Is&4xq@BB(K;wv5nI6EXas)XXAkUuf}5uSrZLYxRCQPefn-1^#OCd4aO zzF=dQ*CREEyWf@n6h7(uXLNgJIwGp#Xrsj6S<^bzQ7N0B0N{XlT;`=m9Olg<>KL}9 zlp>EKTx-h|%d1Ncqa=wnQEuE;sIO-f#%Bs?g4}&xS?$9MG?n$isHky0caj za8W+B^ERK#&h?(x)7LLpOqApV5F>sqB`sntV%SV>Q1;ax67qs+WcssfFeF3Xk=e4^ zjR2^(%K1oBq%0%Rf!y&WT;lu2Co(rHi|r1_uW)n{<7fGc-c=ft7Z0Q}r4W$o$@tQF#i?jDBwZ8h+=SC}3?anUp3mtRVv9l#H?-UD;HjTF zQ*>|}e=6gDrgI9p%c&4iMUkQa4zziS$bO&i#DI$Wu$7dz7-}XLk%!US^XUIFf2obO zFCTjVEtkvYSKWB;<0C;_B{HHs~ax_48^Cml*mjfBC5*7^HJZiLDir(3k&BerVIZF8zF;0q80eX8c zPN4tc+Dc5DqEAq$Y3B3R&XPZ=AQfFMXv#!RQnGecJONe0H;+!f^h5x0wS<+%;D}MpUbTNUBA}S2n&U59-_5HKr{L^jPsV8B^%NaH|tUr)mq=qCBv_- ziZ1xUp(ZzxUYTCF@C}To;u60?RIfTGS?#JnB8S8@j`TKPkAa)$My+6ziGaBcA@){d z91)%+v2_ba7gNecdj^8*I4#<11l!{XKl6s0zkXfJPxhP+@b+5ev{a>p*W-3*25c&} zmCf{g9mPWVQ$?Sp*4V|lT@~>RR)9iNdN^7KT@>*MU3&v^3e?=NTbG9!h6C|9zO097 zN{Qs6YwR-5$)~ z`b~qs`a1Dbx8P>%V=1XGjBptMf%P~sl1qbHVm1HYpY|-Z^Dar8^HqjIw}xaeRlsYa zJ_@Apy-??`gxPmb`m`0`z`#G7*_C}qiSZe~l2z65tE~IwMw$1|-u&t|z-8SxliH00 zlh1#kuqB56s+E&PWQ7Nz17?c}pN+A@-c^xLqh(j;mS|?>(Pf7(?qd z5q@jkc^nA&!K-}-1P=Ry0yyze0W!+h^iW}7jzC1{?|rEFFWbE^Yu7Y}t?jmP-D$f+ zmqFT7nTl0HL|4jwGm7w@a>9 zKD)V~+g~ysmei$OT5}%$&LK8?ib|8aY|>W3;P+0B;=oD=?1rg+PxKcP(d;OEzq1CKA&y#boc51P^ZJPPS)z5 zAZ)dd2$glGQXFj$`XBBJyl2y-aoBA8121JC9&~|_nY>nkmW>TLi%mWdn-^Jks-Jv| zSR*wij;A3Fcy8KsDjQ15?Z9oOj|Qw2;jgJiq>dxG(2I2RE- z$As!#zSFIskebqU2bnoM^N<4VWD2#>!;saPSsY8OaCCQqkCMdje$C?Sp%V}f2~tG5 z0whMYk6tcaABwu*x)ak@n4sMElGPX1_lmv@bgdI2jPdD|2-<~Jf`L`@>Lj7{<-uLQ zE3S_#3e10q-ra=vaDQ42QUY^@edh>tnTtpBiiDVUk5+Po@%RmuTntOlE29I4MeJI?;`7;{3e4Qst#i-RH6s;>e(Sc+ubF2_gwf5Qi%P!aa89fx6^{~A*&B4Q zKTF|Kx^NkiWx=RDhe<{PWXMQ;2)=SC=yZC&mh?T&CvFVz?5cW~ritRjG2?I0Av_cI z)=s!@MXpXbarYm>Kj0wOxl=eFMgSMc?62U#2gM^li@wKPK9^;;0_h7B>F>0>I3P`{ zr^ygPYp~WVm?Qbp6O3*O2)(`y)x>%ZXtztz zMAcwKDr=TCMY!S-MJ8|2MJCVNUBI0BkJV6?(!~W!_dC{TS=eh}t#X+2D>Kp&)ZN~q zvg!ogxUXu^y(P*;Q+y_rDoGeSCYxkaGPldDDx)k;ocJvvGO#1YKoQLHUf2h_pjm&1 zqh&!_KFH03FcJvSdfgUYMp=5EpigZ*8}7N_W%Ms^WSQ4hH`9>3061OEcxmf~TcYn5_oHtscWn zo5!ayj<_fZ)vHu3!A!7M;4y1QIr8YGy$P2qDD_4+T8^=^dB6uNsz|D>p~4pF3Nrb6 zcpRK*($<~JUqOya#M1=#IhOZ zG)W+rJS-x(6EoVz)P zsSo>JtnChdj9^);su%SkFG~_7JPM zEDz3gk2T7Y%x>1tWyia|op(ilEzvAujW?Xwlw>J6d7yEi8E zv30riR|a_MM%ZZX&n!qm0{2agq(s?x9E@=*tyT$nND+{Djpm7Rsy!+c$j+wqMwTOF zZL8BQ|I`<^bGW)5apO{lh(Asqen?_U`$_n0-Ob~Yd%^89oEe%9yGumQ_8Be+l2k+n zCxT%s?bMpv|AdWP7M1LQwLm|x+igA~;+iK-*+tClF&ueX_V}>=4gvZ01xpubQWXD_ zi?Un>&3=$fu)dgk-Z;0Ll}HK5_YM->l^Czrd0^cJ))(DwL2g3aZuza7ga9^|mT_70 z))}A}r1#-(9cxtn<9jGRwOB4hb9kK@YCgjfOM-90I$8@l=H^`K$cyhe2mTM|FY9vW znH~h)I<_aa#V1xmhk?Ng@$Jw-s%a!$BI4Us+Df+?J&gKAF-M`v}j`OWKP3>6`X`tEmhe#y*(Xm$_^Ybbs=%;L7h zp7q^C*qM}Krqsinq|WolR99>_!GL#Z71Hhz|IwQQv<>Ds09B?Je(lhI1(FInO8mc} zl$RyKCUmfku+Cd^8s0|t+e}5g7M{ZPJQH=UB3(~U&(w#Bz#@DTDHy>_UaS~AtN>4O zJ-I#U@R($fgupHebcpuEBX`SZ>kN!rW$#9>s{^3`86ZRQRtYTY)hiFm_9wU3c`SC8 z-5M%g)h}3Pt|wyj#F%}pGC@VL`9&>9P+_UbudCkS%y2w&*o})hBplrB*@Z?gel5q+ z%|*59(sR9GMk3xME}wd%&k?7~J)OL`rK#4d-haC7uaU8-L@?$K6(r<0e<;y83rK&` z3Q!1rD9WkcB8WBQ|WT|$u^lkr0UL4WH4EQTJyk@5gzHb18cOte4w zS`fLv8q;PvAZyY;*Go3Qw1~5#gP0D0ERla6M6#{; zr1l?bR}Nh+OC7)4bfAs(0ZD(axaw6j9v`^jh5>*Eo&$dAnt?c|Y*ckEORIiJXfGcM zEo`bmIq6rJm`XhkXR-^3d8^RTK2;nmVetHfUNugJG(4XLOu>HJA;0EWb~?&|0abr6 zxqVp@p=b3MN^|~?djPe!=eex(u!x>RYFAj|*T$cTi*Sd3Bme7Pri1tkK9N`KtRmXf zZYNBNtik97ct1R^vamQBfo9ZUR@k*LhIg8OR9d_{iv#t)LQV91^5}K5u{eyxwOFoU zHMVq$C>tfa@uNDW^_>EmO~WYQd(@!nKmAvSSIb&hPO|}g-3985t?|R&WZXvxS}Kt2i^eRe>WHb_;-K5cM4=@AN1>E&1c$k!w4O*oscx(f=<1K6l#8Exi)U(ZiZ zdr#YTP6?m1e1dOKysUjQ^>-MR={OuD00g6+(a^cvcmn#A_%Fh3Of%(qP5nvjS1=(> z|Ld8{u%(J}%2SY~+$4pjy{()5HN2MYUjg1X9umxOMFFPdM+IwOVEs4Z(olynvT%G) zt9|#VR}%O2@f6=+6uvbZv{3U)l;C{tuc zZ{K$rut=eS%3_~fQv^@$HV6#9)K9>|0qD$EV2$G^XUNBLM|5-ZmFF!KV)$4l^KVj@ zZ4fI}Knv*K%zPqK77}B-h_V{66VrmoZP2>@^euu8Rc}#qwRwt5uEBWcJJE5*5rT2t zA4Jpx`QQ~1Sh_n_a9x%Il!t1&B~J6p54zxAJx`REov${jeuL8h8x-z=?qwMAmPK5i z_*ES)BW(NZluu#Bmn1-NUKQip_X&_WzJy~J`WYxEJQ&Gu7DD< z&F9urE;}8S{x4{yB zaq~1Zrz%8)<`prSQv$eu5@1RY2WLu=waPTrn`WK%;G5(jt^FeM;gOdvXQjYhax~_> z{bS_`;t#$RYMu-;_Dd&o+LD<5Afg6v{NK?0d8dD5ohAN?QoocETBj?y{MB)jQ%UQ}#t3j&iL!qr@#6JEajR3@^k5wgLfI9S9dT2^f`2wd z%I#Q*@Ctk@w=(u)@QC}yBvUP&fFRR-uYKJ){Wp3&$s(o~W7OzgsUIPx0|ph2L1(r*_Pa@T@mcH^JxBjh09#fgo|W#gG7}|)k&uD1iZxb0 z@|Y)W79SKj9sS&EhmTD;uI#)FE6VwQ*YAr&foK$RI5H8_ripb$^=;U%gWbrrk4!5P zXDcyscEZoSH~n6VJu8$^6LE6)>+=o#Q-~*jmob^@191+Ot1w454e3)WMliLtY6~^w zW|n#R@~{5K#P+(w+XC%(+UcOrk|yzkEes=!qW%imu6>zjdb!B#`efaliKtN}_c!Jp zfyZa`n+Nx8;*AquvMT2;c8fnYszdDA*0(R`bsof1W<#O{v%O!1IO4WZe=>XBu_D%d zOwWDaEtX%@B>4V%f1+dKqcXT>m2!|&?}(GK8e&R=&w?V`*Vj)sCetWp9lr@@{xe6a zE)JL&;p}OnOO}Nw?vFyoccXT*z*?r}E8{uPtd;4<(hmX;d$rqJhEF}I+kD+m(ke;J z7Cm$W*CSdcD=RYEBhedg>tuT{PHqwCdDP*NkHv4rvQTXkzEn*Mb0oJz&+WfWIOS4@ zzpPJ|e%a-PIwOaOC7uQcHQ-q(SE(e@fj+7oC@34wzaBNaP;cw&gm{Z8yYX?V(lIv5 zKbg*zo1m5aGA4^lwJ|bAU=j3*d8S{vp!~fLFcK8s6%Ng55_qW_d*3R%e=34aDZPfD z&Le39j|ahp6E7B0*9OVdeMNrTErFatiE+=Z!XZ^tv0y%zZKXRTBuPyP&C{5(H?t)S zKV24_-TKpOmCPzU&by8R1Q5HY^@IDoeDA9MbgizgQ*F1Er~HVmvSU>vx}pZVQ&tr| zOtZl8vfY2#L<)gZ=ba&wG~EI*Vd?}lRMCf+!b5CDz$8~be-HKMo5omk$w7p4`Mym*IR8WiTz4^kKcUo^8Hkcsu14u z`Pkg`#-Y^A%CqJ0O@UF|caAulf68@(zhqp~YjzInh7qSN7Ov%Aj(Qz%{3zW|xubJ- ztNE_u_MO7Q_585r;xD?e=Er}@U1G@BKW5v$UM((eByhH2p!^g9W}99OD8VV@7d{#H zv)Eam+^K(5>-Ot~U!R$Um3prQmM)7DyK=iM%vy>BRX4#aH7*oCMmz07YB(EL!^%F7?CA#>zXqiYDhS;e?LYPTf(bte6B ztrfvDXYG*T;ExK-w?Knt{jNv)>KMk*sM^ngZ-WiUN;=0Ev^GIDMs=AyLg2V@3R z7ugNc45;4!RPxvzoT}3NCMeK$7j#q3r_xV(@t@OPRyoKBzHJ#IepkDsm$EJRxL)A* zf{_GQYttu^OXr$jHQn}zs$Eh|s|Z!r?Yi+bS-bi+PE*lH zo|6ztu6$r_?|B~S#m>imI!kQP9`6X426uHRri!wGcK;J;`%sFM(D#*Le~W*t2uH`Q z(HEO9-c_`mhA@4QhbW+tgtt9Pzx=_*3Kh~TB$SKmU4yx-Ay&)n%PZPKg#rD4H{%Ke zdMY@rf5EAFfqtrf?Vmk&N(_d-<=bvfOdPrYwY*;5%j@O6@O#Qj7LJTk-x3LN+dEKy+X z>~U8j3Ql`exr1jR>+S4nEy+4c2f{-Q!3_9)yY758tLGg7k^=nt<6h$YE$ltA+13S<}uOg#XHe6 zZHKdNsAnMQ_RIuB;mdoZ%RWpandzLR-BnjN2j@lkBbBd+?i ze*!5mC}!Qj(Q!rTu`KrRRqp22c=hF6<^v&iCDB`n7mHl;vdclcer%;{;=kA(PwdGG zdX#BWoC!leBC4);^J^tPkPbIe<)~nYb6R3u{HvC!NOQa?DC^Q`|_@ zcz;rk`a!4rSLAS>_=b@g?Yab4%=J3Cc7pRv8?_rHMl_aK*HSPU%0pG2Fyhef_biA!aW|-(( z*RIdG&Lmk(=(nk28Q1k1Oa$8Oa-phG%Mc6dT3>JIylcMMIc{&FsBYBD^n@#~>C?HG z*1&FpYVvXOU@~r2(BUa+KZv;tZ15#RewooEM0LFb>guQN;Z0EBFMFMZ=-m$a3;gVD z)2EBD4+*=6ZF?+)P`z@DOT;azK0Q4p4>NfwDR#Pd;no|{q_qB!zk1O8QojE;>zhPu z1Q=1z^0MYHo1*``H3ex|bW-Zy==5J4fE2;g6sq6YcXMYK5i|S^9(OSw#v!3^!EB<% zZF~J~CleS`V-peStyf*I%1^R88D;+8{{qN6-t!@gTARDg^w2`uSzFZbPQ!)q^oC}m zPo8VOQxq2BaIN`pAVFGu8!{p3}(+iZ`f4ck2ygVpEZMQW38nLpj3NQx+&sAkb8`}P3- zc>N*k6AG?r}bfO6_vccTuKX+*- z7W4Q#2``P0jIHYs)F>uG#AM#I6W2)!Nu2nD5{CRV_PmkDS2ditmbd#pggqEgAo%5oC?|CP zGa0CV)wA*ko!xC7pZYkqo{10CN_e00FX5SjWkI3?@XG}}bze!(&+k2$C-C`6temSk z_YyYpB^wh3woo`B zrMSTd4T?(X-jh`FeO76C(3xsOm9s2BP_b%ospg^!#*2*o9N;tf4(X9$qc_d(()yz5 zDk@1}u_Xd+86vy5RBs?LQCuYKCGPS;E4uFOi@V%1JTK&|eRf~lp$AV#;*#O}iRI2=i3rFL8{ zA^ptDZ0l6k-mq=hUJ0x$Y@J>UNfz~I5l63H(`~*v;qX`Z{zwsQQD-!wp0D&hyB8&Z z7$R07gIKGJ^%AvQ{4KM0edM39iFRx=P^6`!<1(s0t|JbB2tXs_B_IH9#ajH0C=-n+ z`nz`fKMBKLlf?2AC+|83M+0rqR%uhNGD;uKA6jOjp7YDe^4%0fRB<^bcjlS2KF~F; zu09wh1x0&4pG&76M;x8$u`b134t=dEPBn6PV|X29<#T4F1mxGF*HOgiWU8tN@cguI z_F@o+XL7FJztR63wC|j4x_DANzcX94r7Iz-O2x$({&qd*mdLG=-Rv)uZ}UlMR+F&q zU}=lkfb0p1>1Ho){o$@}mSKIV;h*$AND7~Dl)QzpFBlSM99Kx+F7GsVK5xcR? z_4Q(Z%cgk8ST}U;;=!LwyZVu^S$>B-Waeik%wzcKTIqeX=0FP(TGQ=nxi=dsS5BYF zl@?}NT!Y!Iyos^@v7XWXA{_bV~1lxz7gC?xuXxy0_?GaN!AhRRM5>)^t%&ODd;@HN5L{MD3 zc>i2keQZVm#?NrDwbfd}_<*5^U&w0zv~n-y8=GGN-!=_`FU^cM8oVCWRFxw?BM^YD zi=Vxz4q|jwPTg+?q7_XI)-S@gQkh>w0ZUB}a{^ z_i;`Y(~fvpI!vmW*A^|P7(6+@C4UeL2WATf{P1?H5rk`5{TL zcf!CgP6Mi{MvjZS)rfo7JLDZK7M7ANd$3`{j9baD*7{#Zu-33fOYUzjvtKzR2)_T1I1s7fe&z|=)QkX;=`zX8!Byw-veM#yr;|wjO^II>!B*B z0+w%;0(=*G3V@88t!}~zx)&do(uF=073Yeh*fEhZb3Vn>t!m(9p~Y_FdV3IgR)9eT z)~e9xpI%2deTWyHlXA(7srrfc_`7ACm!R>SoIgkuF8 z!wkOhrixFy9y@)GdxAntd!!7@=L_tFD2T5OdSUO)I%yj02le`qeQ=yKq$g^h)NG;# za(0J@#VBi^5YI|QI=rq{KlxwGabZJ0dKmfWDROkcM}lUN$@DV`K7fU?8CP2H23QPi zG?YF*=Vn=kTK*#Y_{AQN&oLju|0#E=fx%YVh>S{puu&K$b;BN*jIo@VYhqPiJPzzM>#kxoy0vW9i;ne2_BIG0zyRFp<3M(iY(%*M_>q0ulV2K}Tg zkG{EWKS{i%4DUuHi%DVKy%e+Q!~Uf`>>F6NgD{{I8~nO4!VgOvtFOc7(O)X`|7n*f zxBa4CJ-v9fUUH+`7sPVvpM_C*udZ@OTGTzx56QM5y~OlrZc&w9=)B?nmd@keRn+^= zvm~4sa5987LFDnU{(N|N zJAR8H@}p1fC+H(yTI4n#%~TbImMpuqYn9cQ<0QQ%=PzZItLkC*ef9WJUvfITKWh#D zc#__8`4am9%#NslIUw+<82#SR8AYG|woLfBg#!-&dqq}@P>|I0%lbdy0lSMmNe+}o zj0zZuFr6Wb?Y{Qy-S=|r`bdrDmhnmvkRnkdn`YCleU>Q$=je}LGhh>_QAj6aa_0Oc z%Swsmui;IRx7bN*=AAS@5yW&Y2hy;3&|HAiA8}!HT6!Z!RVn~MZg`RmI6&%#tBZDx zfD+y@Z~NWlk*4l13vmt3AK2wP!fQlnBbECL>?p)F?T)<`w&QN>cP_V>r7UTcsTaaP zTOb$f!P@zf$6>890NVKbIkG8rE?9!Y97sMSZjfF?A zYR8lp`LMoz~O?iaZN;gcX;LC-%Ia*R%A&SLx!YIf29?P+=XAAojK8!^OU*@?R&DK!#G_lsn!#;S375uZ&B0HH1|BO0R90$U>qs zSvHv>H~mAgNCcjo-e+;RjY6B9NCbQrZ|BHjTkehaU<9CSkdd>Vl*ifA2LNOP&R2Qdy3k3-TQ+ zbq=#vI43x`s=%~cGyN&y4Y!FxhwgDe@i6uv8^BLL&3z*SO=D0aLjih?gY4-9uWp5or)H+v~w6n5X#F-I52z=Z_p4JB(;M| zeaVFhuR2|3UD2MzVc~^nSoD2(dD#uL_1PdnIxeA{V5n`#3xf1Zx@4lw(DsQ&H$h zw#%3O<1173hjg2_nhKi!d1ej=h7y`hVjCNB6|HTnx>SWuCE-kgTnfT+YGX4_Lun({ zDv2`>d3vrS)tTf7ps_vvh!Cx^e1BFuWnEAh0(7fkNk|-3oU|iRWdsC6U)?Raft~HN z;^$U}vZK5O8|LV$>6X5T(uYkblv{zwPxnQBh(BQ5tA~J!vGiAMYP^_ki~pkIxDfOZ zUJDwq%O~WueeV6%uN<54&u*c&E4y431cklBNrb06zGOOy4XNT~JS-q(s6@)F@ovbe ze`fial(O4(-su%6@@1+V0MsdLLMyE8;)nou(7}czU(5ASaZYDT(kUZ0L(&g$nF^n9 z9-Pi`ZZLX&)^*M6As4_2Mmc9S7OT)F8KkL2NJ)KJcnCuWU=Wy402A&45#Q9Id~BBH z0cY*xlv!uXzKrXLH!xQu(OtJvEj|0-DmRj1vjFz{c*I4$Pe(+_V|^b~S!0xm{8lq= zZv)@NlcyL3Xdz+*|L137F7y6L-2VsrKw=q^S>F6i%<{Fr8zk06$Ay-(!L$fY@7mcng!2}L0t zgi|KxfB63Xtk_Q8#ZPipQ@!zgjdpEIbK_?q17Hoi4Eiyun$hrc>T(7pOLVLQE=lgGwA+A308p& z7@=09(|$>eLy5gLe{*|3b(M;1n;C^~v?o88jYib48eR4$QGsBFzd}3QuwO^_XE(=B zq+hMi0UFC|dB{LCwch7;zYT=NK})O%sgi0k#yV;My@24^B1+CuZmYOh0^b)5Ba_)) zC%i#_Iev&nsu%I|1N5=MVc#PrlunKAs&hY|3s5;@}`>sB>}gzxuB zB=2vrRyB3uiyW(hkDUNe1@&(b`;>ZvGgw|@s{zVC#_`HXIN_^J@Etb zA7A+F?ot37T{<-vTy8h&b3e+WKHE1oh;pUQrN4yRRrx?mT_9jRa2i4l1fUnLW^Cbl z!I1>VzyFe?VELWWhM?@?t-YPZkD-Qjo@bC2(o#ZtZmr{KZsdFWItV`rs$gp{724@C zL8K5}E0+DHcWcL^{BGei4>@J-3%a#$y6;I}=upc};-NDv-z#kPX26ylOpH)Ov1uU{ zkLj6oiH6l_s+B~_z;|Jc2oi?naS7#3H63~~lWj4rUnd=fCnKdkik<@R&kch9q##G{ z4u!%=rlM~Yp3jk*t8}1B`Sv6<%Z^}~1e@aq zg|JQ`QO2pSjAm-g*?IrNc$^~sIrNBo2$m|Sxanr?Mfs>2@Auu49 zGXlsS<9XS1&8h(dD*Hl&5HBDG!^pJ*lkau_Ur+7`7z;rcs$hT4we?3bT=7Fe<>{5( z2m2(c+hUz2BTHM8dCe*Z3XX&Av;b~a=$6EF>&^E8%nyxO@m_n!q&XD^A{SRjRZQ0L~qDeC=j&0$j6=LNIz@`ni^>ch|sv}^6 zlm>?28yPl@WmDPR?Y-A9X{U9Dv_IsbXJnzKCjkRksLOg#42uG2mE_acbTQ4)J|1V>%U@K(FP3AYhL0U zdeOCPN1qLv!|#c=p!_+%VNV(GHt`RuLRV^vz<5tt-r)yOK**kUWPspVAf|}ZL{LS= z@k(@@!P&W!>wwe`x{+GrFSWhHov7hu?{KuuT%kl#WO@*WX$i_@retlhQBj++SVNCx z5$78LxP>Z=^aJ)D280r_jj=zFfMJFXCIe^B{~V@d1rl_F(qo&AB4bC-vYL>x2jSKX zpuTG-6kgp3e^T&+dtV*i6a~)v@n?n*MffN59y}<0djUX zt27R+SE#hp8bzc#;rk$jw3r4)Q@eI$*`_)=Pvge8@8|8>H3X)<9YX6cXa=ii#Le;(qKm@%0-7$>2ShnYc`j#zJ7gu_FE^?uAkL|H)UIH#gPu^40!6^J=^ zr`}iwa^!4tzW~vOMZAaKF>*8A{^8m$i(VK)>?=#l`xrVe>wseSvM_aF zATNkY>kM_P3?1kE`uIq#mvr-wuTgUH0N<&JhF=(E9%^NS*HLm!4GZ4_XI zL=R5tlG5Mk_1rPfg)sk^llFuKPMPBhuU|L5q#yP_mzxp1o&pAzi-X31sgFpIHn@($ z_>=`AB5(8tP6p2zS5VEvH5J$M` z_much3>S7t3Yo`Yx!>83-hW9LYzDKP?mKdkD#QAK8*M((sx{eBQdrR<^3ZhFP81+& zBnJMUefQyNBji~$5d88Wfw1Lv59aJN9t2!pABLg;ewJ#LXL-10;QcJl+Y4Mtngb)k6JZlCf)3uD_u)J3sYyN;NN5hNbg$%W!i-GK%e&!Us)2IExWSss$YG(hm3kJ-h%yD z>8q^n$+4I(_y_mbT{du4P%h1j3oSpjhY97{+IZ`aA4ug!vNJ6*p?<2H(2w+GD3j$I z1TUXGyNzdf>_yB3grP~FZUs<2Quw;eEi*7s(-MiIkQ%@J^+WGdQvYSUN+TRiD-xto zJ=OUU+kxGYc!HCLNbCvR4lGTp~#L;DFzGd-#gJe*xf(P3hDQz|y)?b9mwU3WUVnpcqXM<@w%r-k*Wr^gzAv)8T^sqA=Ye z!7qy&exJmAcAt~CwS#@yNmjr8*T*!A6w4~E*ibaLRs0CFo(;R3=ODhDt6zWNodmo0 zXx&bT$6&+5c>a|WJ)F4G-^GjY0H#*tY=UNyYr_q5fsrcjk(c^~e*7Lf`!Jd`)p412 zn|^*hV= zFI4UbwA%X@smDd$cQOiMC%jfitTxTb+#`9`G=2rJDfK!E=5ra|So>lc{X1$~w28i+ z4p&cTGwZ#5VueiXS9O8#;RR$yg7tL9!^)Sz&pZYIzlSh}0}V{LxL$Cu%B4U5_}k}- zm~|CsD<076x@<>m=6w6N?WaThIBP`!u{-;WF)xc=2otx*lwf|5+MkdJePjh(B z9SH+%cHGCMAXNxB{_3^otDWdsV7Ob6n{0 z+&!(;iaHOX__5z_$Qk{%xYV%Ig@7iokGBwR`3642ZP#H#v9QGbWl8<|MS*=@qO@Uj z6+SZ_v9`1paUe5tFN~v(b#J3a_Lx0+;r9giZIx-A5TxdbG>xi#AZ5_z1V}B^n)sxT zz49}eK7EWb6wR!6-qQOrHQHkUvshvq%=G2d&@(#XM*Am1;WbnJ{X_!a{ZkphD$^TQ z=Iskb&}=lBm(RHiwJoGg`*NiQ6#RB$T#LF+>#ef;Jne&MxKPX!#r`&TVEFsp2jnNx>dClzpcPy&G&13a_<0qaR3i+k212~hoQ z8nMk{JP-t04I{GW5gUBqcJW-jSMrlw}>p)ptx?WKuCUV77taMiV zHok9V=6yv+Uts@fMY&A}amC=!Yj}eL@=e%XJ#%?agkt1jWF+10{(E9mHLDa>Ll7Vj zG=3cp%ljIB-6pC}6&`xJ*6WCP|IlglLWJ^?yviI8Ve)?V_i4%n;olzny62_`-|IGi z^=}p_O>Z8M;c4|RExu70E7ePW(HWVS&E$+LL6xSQgB`QfMQJ|4pCTFowA39p5P-|$ zUtM_H2HnP8_RoS~Vwk(FhbG zH41licj%=0a;Ln2STFBvU}Ne&O&%8bYKj!h1FA#sNM`232fX|U3QPp#3C?mN2;hE9 z;)!@5ixSPl<89^7gwhHc2YAX1KJK$#*3`KOMIQ253q7-*RJ5k)zp9GBO|Ga~X*^}US5oN@aG&waHV%vi~r{t^`ptTxb zL}q1W8S7*>7oWwvgV4uFLZ(@k`R*=LO_|Gu`prs~!WQXj-NLIa^2(7IHg>BG^N zc|i{-^=&Cek9dkJFQys|sjG9i>LLz|;yCv{^1i%c*h>8zF91kLvS9HBQi~ZU!JL`B zK8N+U0fr1*6??Ium)AF!6tc1eGhXIYL6IRT7rmKp7+>?%5Pa6zC5)KY$ycF0ZJ`G5nEQDG100U-jLkH8^UE4g6wq?sg%pP=-$&G#bcN`^?w3a6 z((s$6eRKcSEIslW-kk5Qi|5Mg-(xdLF}PxxVh$PuO}#aR6pW1kV4Af!Bqh*btXNNZ z>-4(IUl+L4dw+3LcpGut=qB45O+W)Q5?*zZ2A6rJcg`qkSvWA!j^r2mqKuCm6`Py? z@^T#Ux04HemPGd!Hs7NkZdVn1}8_j`o?)*OKZGS!`ff)gF zG?v-lj$wWNWCcw2Mg2o18D~1?3_b0XzdiKBNkYSDpcv@&kp0POmweJE2ZkIQ3B!a! zIgIoE+Xv?;34kyo^QYjZk+tEqZvq^#QG(OzX4~X+KtsoQoddTWUR(yo8R+ObEF1j<-syWOb>)JQ&Zbdu(sctU%Mt zW&YR0{ttY2TTXYZ?~WNU&cES1Z2q(7SrWDh``!J(JM+Nk$!hu&Y;(7E`ZNKTe0w+% zJc?Qnw2B+%UR}0;cB0Rufa(7-3FF}?629@LgTiEC&2uyL6NxexOp?AKT^aAx3gi(W zao>r>MPw0eQ3>IV02uLsC@>yK_epX6GRg4{NEL2wPPF9=*L2RV3yyK8DhuEK>rmmV z`&Q~#c`lgR&93TdOCja|ewOXmPNRh7!&dMT(1ett#iDr8HZW~VqWW@7fe9B6;7S+? zbC`d4@MEau&mKlOPKd>*10q0c{~^baw6!a*w^sY#0Xim{oOsiXiDOhbG&kl3c$$n1 zMRrD83&QucDSEcV*7LIp8VTA@F<%qe+_c`L;6on(>SjAU^}5c9!BCffT>$VQhe=)z z8(=Ej{5>jhmjB3{xDfj2R@VmHQ!CqjlO4KnuOmvHy3K#po$yp_V;p_MKjh1`(rzj6 zHW956k1yvntz{_g?Xbs`avK(IjlTnsu%htO;D7 z?J#x^EzuvVn&NA=!MEj7cwe5A-Z$Zk2LBZH$~%E* zf`((xH0?`}hs|HA%mtwfOEsZJxxrennkTYcwP#FKO5%Lpc^JXhSpV|ZH$Wr;`}`_( zIP==gd3LYyVtwD|*ZJGi{7~x8{=^bGVqu0RJ`n_BZH9+}kz%-4ZRsImi@rx%=ZEKs zcPnUXo6hbJV>fH;@1|bAHIe0ijYI*&kdT|HkDS$9No9 zCHo=*HWb~U+Dtzxr+Esao}6@|;Pf+E$ay0$kQp#s{wlw+7aIKbMdf`OqhoG*;Tco0 zjrP}VQG#Y2cJuqoJg&5({)S(BA}q9T1lGeWRyu=Je|)I!6a+aj!IP^1({)ZYe&x6w zt3a)Dq^TB+A7CdB0-}#z2Ur$W&h3YVw8==!xONy$uQmDWh-@15iEOt!q2m&?ZLA|w z8loSb(0}7y6Xu0?M5Uf4>VZGluB`wMf2oh;m)ghxVda>3m}4%V)r^0nVQ5V6f3>*) z0&VN!N0~GC^P}vj$`EDMZEmVV;N&RISY2C;$0;2(<{Lt&PKzqRByQdiEHGAbwtbS zPj`Da5%U6k1oEtVzI}QNw;!hT6F+~|@=c@$C4NtO@=xgP?|5MyZAyuCzcvq4rdAv@C06%gZ`9%I);R6UGiGJobfux+<0DLS&|MSG4UH z_~o{^^9>ixMg~mY!-@Fai{xaE4^;qy9iZN15Gbn5ZqHWf>Jc5Rv6(#n8`1NcCsdmG zab*dSXVPaE?)wCalD;$ivF%@nB#7D`@YG04p6ed9m}4iJW|pfVMLE<-c{=-8$e?cH zUdU#mCj4gb zZKA^b9p*9S(}8@tw~1RNPHr7tQr;P+-)D8|sq=*o)G%RGqt> zzP5yf`pVxb)I51D_G~Xp^GNK zVI6sAX)a9s)e{8N3?35YA6aQTXuyszK3ah~CemzA&CII#8F&F#KN41~8I^&_%}6MCNb{W87qAF`zj_Y^szhb> z3p3}KbOxotY|(lD=;)`fYE_*{S}x;f^SW#)SU&5X#o|-R|trpa|L5PS5aa0 zTHw8%SDSVtU4?vyrhnq+^@dgFS)|(y{~(4j%3UEiO-rBM9%`)8(dh33pMLiuurNY# z#10AsQ7%*0Cu_DSAU}P;X(JwA64~Q_^R%d_zSm^6Aux?Pn70PM>9EvLeOX z&w9c)pGmcL22;MO3C_B>=NC0RJpMp8?#ZUf=GWRvy z6RHq3B}=MGVg?9@iKFBpsvnkVh3{Vpp=`CcD=u~@ql{my|6?3ssi3mCOPnjI&E}VC zc@X+Yl>;;DNo0W0`0th!X{?luDhOC{E8N=?!w}K1{V=)+1={m(f`Oc|N=07>}3;z{-(A zm{JL=j?Sro5iecmE2-pWlRf(r%|HEQ7kgwQ9+kt=NBhtQI7OwcZ#3%$Uf%^r2nhjY zoQ08MfC%_X{O9~WcirMZMhn#z^ux4Erx-tf-6bHD)9eH&^L>^jvAd^9A^DCDs?0;k zkm7LE*KjP6`2d17MrQaaLqd_Rka}J$csvUec#hw78<=s(hyR>065~YCVCA9+#Q+; za(*L0IEw!r5P|@-;x33L$Lv9 zcuN8YG&g{<(SeJG18~(b!5yywSqQiLAX0;---;}mF5&b4lg|T?LwKREa{9YX_-zL@ZE?Zqi@HxK^2KO1>0LATu{te=T zprmHtY)bDVfxI1S}KBE7V zznP7KQ8HekWU#W6mw`dr-boV}pMQR==&5=Q5T=_q091jfc;R*jX#&=MQ%~@E@9^?`$v48ks<>(fI(F6L(5ppKy|$HWng*bKOb(4|cMUB&z$#ob#XV z5-mg)gmFIybZf=znm3ZPyUO^GJfxt0kmHjaTZ|sthsxXw&}Y)fOUSg=JhRSR^UjZ- zhqqb}Wsyw4zdnj6@#BAJa#-PdI4_dgafFXh85DsEQ_cT+5)XpZq$fZlBA_9UsE9r6 zEFec5?uqN@QhJ^IzwZrwl-5J`CmVPv{(YDTqEqWR^dI;5hXc~cxP%B3v&~s0`Ct89 z@S`i~a^c%V^N81dDT*ItFS*&IN;@O$EgzX0e7x&}TD=!zS}hTpezBLS>mdX(5< z)8DEI(-o_D)c-UX@dA1MuJ*yc>Hf4|`*B2S_O>w*-tbUwtiu`;W(Ud{HTty@(&x(T(F&;M zJ=?H>6`B7nf-90e8V`WSVp|0oEKB-P2M{}4ZDawzvM&a!y>`Y#jCsD%T_l``@ah(I2nJs~Q|%uSKu@k!m~*8B*IoA{*TgtF<(5sHCGG;n@NE%~Xt(G$^&<87u;}Na zx-8cq0g`uA(&RBFo=-4Y1GUZ<``Zw{xL4jfHkZw~%~wvtGueszcXt)_QwH8g!; z%s&3kSa~R$dO$-%L-)c@_hi7&>{6L_M>OZFkUQu;{sL_bUMStNrt{{&O(Wn~*zPOk zB>dnfszb29NSTf2pqIs68k|p-UrSrxgLHqi?3N-UFa!LHy9n1)=s>`yS+J{MEzS@ zNlfGtpma7kG&LR3JE@wB%rFA*h~~KitlO=IP)ZjN6dQLM6qsry zHkB#cyNh#n`)}bCrN1My*;k)^@>e4gJ`LJK?2)Pwp?4Tl4)4FA0(tvY+#1jOUM)xw zlMz4x-f@g^+yKUN`?Vu)|AwujArnM~Pa@y*Q9S8eS(u{-S%(Z5=R~pRl5ZGDjdqH% zC8rW&{##wOpU_oTIG4WXMk4&%2t1;lWcW5&!yxmOT*!hBcKyTqEcNoO+R2;Q?Yj+W z1-Y4?59fijz4(MIDwGe4-baYf08UCs;r|YefD-Md2ST;=cxwpgW=tR76-dQVAhn^= zG9Wk5lQk%jIR@KNU!UMp6@BfU;r+;y4VQ)D2!Il9HX%yW-9nOzV+m$YKzVaO`B8S7t z$!S2Mz`xw>V(RjE`0>bQp<0y&h~Y=M#jpy!#=dE>`=e_AjSZq6u!Dy1xJf~-7|0F! zPR9|n`e_7D2DIV2H(CESQ}hA>U>n|6`%z?YKEA~)BOVY%y=jPV zT=44R!L?J)736X#csn|lfBJ)o8ixaZclguWgrGO<`TN2FMfO}7;5}d+BlK0yTSH3* z4!=;5rOh85&2|x=46hkNaz?)U8&=bcfh=N_#8BNpZ2v$aVBo;sk^*X`v;4-LU;D>! zM*h12MxXIQy)SfAqE4;jY)wgnppazZkdNNVVF;(PLf^qK$FgY9+VFyBKE7UC|f z`R|?&egV11K3s$rJ6!GvoeW=jV*!-e(wA;x(2=d0E_e_%0x--0o8#~m^H1%AH5Z^B zn!TNPn927*bvaf0pt}zhK0o^V@WlGwwKo(*nQ|Q~4_;>~-8y20`HP>@UJa)3nEnGG z5Hwhs|FcmFG16ZVNb5hL`2Gc1{zWIMM{_OiKewV!hCi}U!VuE?s9wU-QbZ!)+Y^tS zGzp5OSi5iq6hmEr$w}&9DFgoB+i*`q`8TBi^MVS{SKEb8Aw%@K7@XCo(De2A`6%mf&a2#~y1N)+kJLD$1HCP!22)(U}xo2|j?WRzt(11j8Z_*v;P$R+Ug*Gy3VxV4K; zGGUGabnW*`Z}~`ydXL-l9e=GC$pY#z|63vy>E*m=$=j}iWP{sRTh0%H54`t>2xYH% zsk+M&u&pNgMCM@3e)Xc?jBWX-TIR_cQ1Z!RW7!B zBjZX=+^3}?SE)B+$EP+0oi1Fp5blDT?*}nsP>filqXH{ms zxU<$hetC`u)Wi+x|EKL-`y^#aQX+sDYIa{M;V%LqLrOk~lR>u0Q!+pyQSU4zY`?E^ z|5@)C)w6G_=i5YYC5SE_u(7hDNYr}uKT|@DSqF%S++lTIbIk^$a>{~0IH8KNFEy%+ zW#$&!ynpgNJh>6uR~?2c)ZMW+h0OKu231(7L_vETPaR+(P)Zy%0~yGm>E9?@@x!Jy z3PYgS}Q@b}x}E#F27@F+j}0=&Ql4gES&f8acMrPAVlVs9$97`FR))R5wI zc&}KFI1UIewh>3PkhnB7u zS3AT8_*|nexznG|Z*DU0c!K@jsI4J)5#DyNi#|e#`l1Vv1`1)*NVcy0LZ``aL0n8B zecupJ(rhq3u8bW0NIRhKYq$v1li+jp*4hfAd&wxYDE8vn1TQ7S@bTM|I2Ob z8vMOIxA7&_j{AKmD+O@EyXT`|dElt0pED^@IV0m)RPBUs*5jW60>>w1!@_G3aBKzG z_f(KfAPBk}-jQtR*Sroq!*3rbQ_m27e+YdzQjUb<_*k8vc_C)y!@cj5E>NxUhPu&g z@Z2<~esU`)ih+4opWe+K7sbN9n*9@n>#@n3*o z?xoROgDuvhq>jJ;Ve{6i<3roQNfgo5^4Q4(|GNExO2Dr7GjgA2zWuKp_K)K0R(6lv z!l$!zW-+T6mb3gQaAFviTQi{|*t%>{(mhTdy+y;Re4qT@kccy#{b z&zWy~kLO@>*WPj2k#H)|7L&gAJ37DmHQAme#@m;(Y8Nu^`D5vf8sZFW#+lA2!HK=( zJ)#hO6JD*`o~&c*&46d}g=Qj@SsoB5ikC z^1V8E+&<-OzuS_C`p5<<(A6fB`LXT(!kV^0_~hL6PpW4={l%|#xgdh?5EIk~lu8{D z2hiyhv3Yxij_#$Wu>P@7SYsl`-~3;}Ktx{34_NL^Kwin&=?!HDv3elQDbcU*qyYpN z(#yw~f1vFGK-t%CC-qa-4FYHbA^h>bag-I&*qaxwn?Qv|idE$<>1H|Gr6JtUu(he2$eg!N z@HTF@dG1)*y;4fxe)4_ZkpaBHH9hXp9p4|gLrRQyuevRd@gSS}JhRnWqrvm|U@>qM z=yl7RQROTKwQtzP3!zUF)_6Ld#NGA6v~2{J9Dd`h6{%+XsU#qGLh%`fB1Hc?wfayK zN`H4BpDp)npVQuu$DVW1qsBS&AJ2eP%6Qw>;k{)Z$8%HL=Q4(a$Ng2_vHw&vA!1L+9zc8vaX2GtqJ{L-;gvF0IR$em zMQ8@{Qp3+3Quk)TJ$?I<8KmwzD*7#(q<@Mc`dchngW}cRG14(Z6K7{T|LhFXwhqUQ;BET;cYqPcAcMgt6M$V9$(?jHo@Sud$an$U&5F zZ1QNh^ztt)E*d#Ij;<43oSKKnd+WNr$_r}+s_O_x6DZSB10*5Q{ourqq>mTl| zx4y^(cy+9;t@R=*j>3_dmm_m)$k$#937V(sllby&5)Xex^UD-|m|q<(jEd#@DV(of zAd7sSdmS*zUDqJ9|K%O2J2OfdUiK{{b{PCy)pi<;hp~7v1CQj&4-10 zgO<3dqhYH1#-Fa}Q{pjql5>>P6gZH21zLfxZ4$SK4T@7b!|`nWF9b*84Bq8&Eht;9 z*P72x&NUCZ7*@B$`FtE=hz5b}S`|c6Ey+j@D1ZibjJaRlR;{cxAWv z?Nqa>QqV*H-*zzaPvpLMHt~nl(x6?vrPpR?zn7~wow?oj*1TKmx4j71>$hvtC$DLD zUrz0^tiP0792U&dxJxNv@r}Elsjn^aSLUu=9#mD{&9n8|ayIL$!H3s>%KEvbchBFW z%cd?VU83mGF#Dar9*s~w&AnmQRQIOvR+uWsuZ?+|a=TzApXO@q^(r%8=}iv#wCnFq z=K9}JbqU@k99Q%j-}NNk+qLCP)jXfmOO|)@?mHcnynd6({mJisP1_}u7k)|eYHXWK z63eQ)E$ufFi!3CWUY2gw%e>omCv}qEX66aH-k&35f9`Q@Us|NPetVqe8=dX*VxJdn ze`q7b=Dn(UA(2sf&g)cOmQFhNJ#<-aMELJZbA#@to>25@kbW<)&!X01 z%NMJt>1ST)tyX)h@?`DxhbgCHr>S4wv}WC&Nw-!{+Z7$2D}74QAcXTvip=M0%Tp_N zor=k`)t|ra^ySr-+(|R9mB(E=`MX#y(wSw)$!iymzB;^c*>%&^*7HxTnRga=soSZT zdDl+9s;r!v8hk6POtzBaig4pRp7eWF(<8gufvNHPu6xs-=e{;mnHzJyGKE+8L0j}; z@%8-e^UCL5HhMiR>sD3Rve&yVZ#{Q1*CO8c+qSr^Z#CN;)(X5>tGG5yUw3<+CfhaL z%bP;hZ?jvgJU67BWyiy74_)6r)_nSxttxn0`0?HE^5(uydHVgP+HE$V?Lv)Leti43 zWA|;f-RqX``95>)^P-fw!Vi{3KNsII-*5f){gdxqd%gVdB1sOBNe=nEW%;i~g_P8J w!5uhoe-Jcg1nPN%MiEAtgE$;km@@t6ukO)1^!cY^83Pb_y85}Sb4q9e0FIsP9{>OV diff --git a/packages/flutter_template_images/templates/app_shared/macos.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/packages/flutter_template_images/templates/app_shared/macos.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png deleted file mode 100644 index 2f1632cfddf3d9dade342351e627a0a75609fb46..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2218 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 X>c!)3PgKfL&lX^$Z>Cpu&6)6jvi^Z! diff --git a/packages/flutter_template_images/templates/app_shared/web/icons/Icon-maskable-512.png b/packages/flutter_template_images/templates/app_shared/web/icons/Icon-maskable-512.png deleted file mode 100644 index d69c56691fbdb0b7efa65097c7cc1edac12a6d3e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20998 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 MPgg&ebxsLQ025IeI{*Lx diff --git a/packages/flutter_template_images/templates/app_shared/windows.tmpl/runner/resources/app_icon.ico b/packages/flutter_template_images/templates/app_shared/windows.tmpl/runner/resources/app_icon.ico deleted file mode 100644 index c04e20caf6370ebb9253ad831cc31de4a9c965f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33772 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 diff --git a/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/LargeTile.scale-100.png b/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/LargeTile.scale-100.png deleted file mode 100644 index fa651eb71070bd8ada344ac3a4a23f346297a449..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6049 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 AQ2+n{ diff --git a/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/LargeTile.scale-125.png b/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/LargeTile.scale-125.png deleted file mode 100644 index 649e07696ba75f5e525a72f60ee9bbe868e28f0b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7419 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 J{=a$u{{XcY6^#G@ diff --git a/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/LargeTile.scale-400.png b/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/LargeTile.scale-400.png deleted file mode 100644 index 979878f735eb4275bf5246992734c14311f833d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42545 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 W!tA=RzUH diff --git a/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/LockScreenLogo.scale-200.png b/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/LockScreenLogo.scale-200.png deleted file mode 100644 index 735f57adb5dfc01886d137b4e493d7e97cf13af3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1430 zcmaJ>TTC2P7~aKltDttVHYH6u8Io4i*}3fO&d$gd*bA_<3j~&e7%8(eXJLfhS!M@! zKrliY>>6yT4+Kr95$!DoD(Qn-5TP|{V_KS`k~E6(LGS@#`v$hQo&^^BKsw3HIsZBT z_y6C2n`lK@apunKojRQ^(_P}Mgewt$(^BBKCTZ;*xa?J3wQ7~@S0lUvbcLeq1Bg4o zH-bvQi|wt~L7q$~a-gDFP!{&TQfc3fX*6=uHv* zT&1&U(-)L%Xp^djI2?~eBF2cxC@YOP$+9d?P&h?lPy-9M2UT9fg5jKm1t$m#iWE{M zIf%q9@;fyT?0UP>tcw-bLkz;s2LlKl2qeP0w zECS7Ate+Awk|KQ+DOk;fl}Xsy4o^CY=pwq%QAAKKl628_yNPsK>?A>%D8fQG6IgdJ ztnxttBz#NI_a@fk7SU`WtrpsfZsNs9^0(2a z@C3#YO3>k~w7?2hipBf{#b6`}Xw1hlG$yi?;1dDs7k~xDAw@jiI*+tc;t2Lflg&bM)0!Y;0_@=w%`LW^8DsYpS#-bLOklX9r?Ei}TScw|4DbpW%+7 zFgAI)f51s}{y-eWb|vrU-Ya!GuYKP)J7z#*V_k^Xo>4!1Yqj*m)x&0L^tg3GJbVAJ zJ-Pl$R=NAabouV=^z_t;^K*0AvFs!vYU>_<|I^#c?>>CR<(T?=%{;U=aI*SbZADLH z&(f2wz_Y0??Tf|g;?|1Znw6}6U43Q#qNRwv1vp9uFn1)V#*4p&%$mP9x&15^OaBiDS(XppT|z^>;B{PLVEbS3IFYV yGvCsSX*m diff --git a/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/SmallTile.scale-100.png b/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/SmallTile.scale-100.png deleted file mode 100644 index 35e7f6242f49b50ec3c688b0d9fe21ff6ca3bee2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1821 zcma)-S2!CA1BQbdv9(6xP$O+9Vx~m2YDAEd#z?IyqC|{Zb?ll|iO?!)9NRCVHF~Vj zqE^&w#5h!|t&&pIF-q$=>Nq$5)qn9{yx;dc-}BwSWE|E~L{L@`004+sTcPYv+VWon z_)Zf4%vIr}fFV{c;Q)YW|G#j(3Z~xz0QgweC{xF%;;%(+A!qQQMAl|$*ZH8BUjOQ9 znUQ*KCOG@L2d>r_fqae7=9*6?*mVd9AeUZrZuKFQ%cWIwrRmA(`F2Xc+zhH#o+(Zo zHO+mG6i%Aofc~}-qt8e)6I0uS+OTG6Zv&gAu6!uoEjzyACLqwyJtc1fHDC5r4AT}j z1f|OfqeS_X`FXNal7@Os{`dSaJ4`m~n=K(6_EwqV>(IZr91Xkc$WE#B6Qocrz_|Ad zd+qJx=?Gmcb|EyHdyF7gHzfImMY^qxf^DbpC9-(Rk1>AD-}0X=(4BQL*nYd{OTRG@ zU{Pu7t|mcxFT3*0Q3;J?{D9}kiL)1U@sliMX&7XXdBYR;d z7M;N!7BCdby6Rmag#?|=Vl#1nrL)sIfn98%N4%UPYCs zwuOkIJx6@B&||9S2G7jDvme(oFdA$bA|a$f<}S`EryVLXz(sLY2YgbxeX8+lyjSL3 zU>dfT#kA4iBTrEdH2whcBCwPP1r;3z&@}!>Ds!m=owt9b0&Vh|KOQEr>v{~!d#JC- z61&my1A!KVn-}%ED+-`Q_I46KDJk4cNY8G^6K!+%&H$X@D3s~T)R&_T)vm8<{YT?D z2=N6=xD^?~f4X^y+P;~(7$$voGXXFk#V_f_k+-BekxU6Ub&<3LN=4X)=Kk2Q4^y(eAu*Z0glF~K$WKHfSv@ifJnEw6C zut5vMhcEbAS6#QcTFRRV(<-RrnssflgQbZ7g{bL(gT^%DId@2>m(|~)!r9GBI@@9| zst!pK%SHz`yf7`1lzg-+pBeHE2=1mmAG{K)R@xZW}A9;V-ixXO#z zr)6r24AdxDQGiiq3Y)cy`CzF?wKPpmnQ>u+yi{WA>QYA_C(b9qX*Kb9a;3S~H8$+= z<)$k*8;;5S`vi66*>kOPvU*hu=b&#=?{?Opoe8(bYC$(owT+Lhp*xmcYAxL&hFSH7 zz6_Q8J@8=+Wm+y??f0erc&=81q986+Y47C9V7WjuM!DQ>5qq0Pz#L8>9XhF^PwiRw z_&0h;!uYSc+(xD{Rb}1}b4tsl zLx7kek6I#DPEHCpjOG}~CWZ`Rpv6c18nN8^p;sB&=dD*B8&UX zG_AJ`2yANY6)|vyc6MvJNs>bde7uvY=q?PQ^z80NPjEH>!a_p<7@)5pMA6diJzL z?jLS?#M05D_#L7Zu3?5L<&5c4VLh3B8Co$2Brk%*)t}<=Ie+<4Sni@L!TA0cH^JcV z^>3 zMab4zlFHU?yM4_AUU~mXc}w)ju;l-xhW{GlC!c0ao)Ad60eIp&fVBk{)nMkC{0|Ij BO8@`> diff --git a/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/SmallTile.scale-125.png b/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/SmallTile.scale-125.png deleted file mode 100644 index 2a74cc67e6d7ed7a5f219ea738e21d2a67806262..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2519 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 diff --git a/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/SmallTile.scale-150.png b/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/SmallTile.scale-150.png deleted file mode 100644 index 157124823d548ae2cb06ee30c2b6bcc898e5f1ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2984 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 diff --git a/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/SmallTile.scale-200.png b/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/SmallTile.scale-200.png deleted file mode 100644 index 07ec2ddcb15f766f41f8ac49e8f85082ea931a9f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3721 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 diff --git a/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/SmallTile.scale-400.png b/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/SmallTile.scale-400.png deleted file mode 100644 index c205729b7281ca6742a6b15f836e80adae2d78fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8054 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 VT1Mgv${?M}P}fwa>VXsde*jWjXtn?V diff --git a/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/SplashScreen.scale-100.png b/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/SplashScreen.scale-100.png deleted file mode 100644 index 6012579815fa4a18c7d12e900b629c6fde5c8d8b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6866 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 UwD|=1lM1Bs$WW{7Puqz91ABlFQUCw| diff --git a/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/SplashScreen.scale-125.png b/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/SplashScreen.scale-125.png deleted file mode 100644 index 0c35be827fa2ccaf34c9ed18255011511678c342..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7899 zcmeHs`8$;1+x{aOgRx|tB+DmR!zf!>#u~}44OxaHB>NJ^#3)IkvL+-kb}g9f8A*if zWRGlF29tFd-+SKgzwjQ%`^)EtdFD7~?&p5aYdNp;y6z{|!pxAJRge{eAofc}`c@Fc z$P7UY!EhM(Wo=fK0KQm!jBNZNh@+YQVQBR(xCKGN@t5>CFnyF(u%<1ZcQ+_2xIyE#!KlOS%o|rh9h^}QF=9dvXk1ir!fzY z4{deJi-SfYm6a^!Lrm#ylE>`r9Ixs)h1i@vA7D+2kcp z(ux;F2Bs1r$}2VKjm(np!S36FN^i%d-uwi z7kk=LDb&ksedzS5MFu3uWT%@a8vFx(zpZ*!zu00bqK;J)z@0@0XWOV)-mWLU7 z>e1Yl%O-GL0w#vI_zG!KdZk}5Mu!|bwnbIofkBlL91zm-tRfuKok9!Q>RfLY{dIFP zQrFeFJFMjW0gcnGs(1U(LKd?E?5wY1EO5!OI$I&D3>e4)JqD>Y8qsPxXN2czhvL!uZZz>ApcL6Oz+z2ONKA zs!(6O3Mb`H32CIr@Ih_>0!ejjze$Z9U7x^ccmGQx%7+8}d zju@H5{(iYgf#dx$CjwNsVB1)!`a&%?$Vp=wa>`=i!8=Bb^2o(yl$W%8eZ&6(wV;`T z3!%DRLUuf0JCa8D%J4kzl3zud@kN%TNn;W(Nx)h+GDp!#6KbdA;ZDLJSQLG3 zSiIM+q}@p0IT?hXFLEr{W-tG^uMR|ctp=qrUn5KBWsGc?cT}Lh3;!UG(8Mqh%K9PNvjR-xnguE zMd={!aR~|Y!IRq|La^<3`NifCJrmP%U)aTlPS}QM^kq2=Sm&aUD~kC85hM{fK3Fqr zLKFer76#5`_6jK+8=J_$)#aV4uepXn*&L7+L;h$1OfIni)9vOiKYu%Kv1lD~#;#?v zlMFhOcx@1=(Hm%iggR~k$8oS=e0*u^CWd=O6E2sKCWrHDwAiLxduEaGweR_+d5aCg z&_ziQfyeCXjvn_K->u!b%nfV%Dk_M*;G@;%qqW3N62$ZDwwj5UOiBS*T69?AnC_sq zFkvru?}po=h6l?jr$E5Wa#v-eVh(weqen&^F zwTX=Fbfl&L_SgV+bvS3!JcM9{`?={`0RudE+X*YB7lU~q6O$XnIPeV=wUbbvK3Hd! zP5aAciWM=EfGsLFH#-&O!)BC4NS2}rE z@u3oW`P?vb+V0`brxOwT+i1EKV!(q<;FmeT#hr?_zqdbIMOrm!?SI%5 z!uFgh2@A8eT3m`|__7RKdpmL|IO#;n84irk%6B5S>59wcm!Di^6x2pDVwBX|i$w z&jpjDP(wLs1A&<*ChZEErJ*zl5cfw#CWwvNE>(ntOGTj$4!KM|pXQ)|fad6F#c1E? zV%Yp5P7irAxB+9aboY)X4{Rvto(Z7*c_UyGYP2fZ+E89Ppz4f!RtieZ&BJ09cXP3A zKXPa?#PuLDo_q`d0u?Jw=LJfwuAw{KrZ@aRU*vk|?d*|u#3LO_CG%h%f#z+`=rjVz zbNnqgY*!7@t7>u``C3^SnTCA*9lg2t^CjvI7ubl-JO)y!{t#c#?F+Y!kotHYJUU`m zfy0s7F&Os{FdH-^`F8t-`)hH#F*B&oz9GmfRHe6TS## zSz-gzD1kxwB+_DayoF%n3L^GI&pvg3Wi<`x(_;XUe|BM2fKA=@!YglM2^bGH-KI3l zNJ$B?H-y|L(oo+A7kHtL{{ZK=C+F5WNNMoKG=0nRk?jFx@um=rz}D#rOxZsTOc@>& znGLQubEy@B`cNC>u}h0OMw(jeQxM^U{r@_oYv=eKoo3Tp=UbsFl8~RTprS5`U^Q>N zzf(S>B@M!;3BqWw*E}^h!7^riWr=uFlKIT`VOF#bO`oRjEgakIbTAs`iIstFi-46! zs~QrqPXEDJP^1>n3pN;^qP5JqNB;yd&=<%TvT#dA-Klo1Lls=+LI{N|ltId%_^$3&gNYD~=e~@kX>!c#Kqu$!tNY|}`_{pLvId`Cj87|tfIB@< z_omw7Ox7d=tMYz|u2_3rUS;KQX4qyVXQi-4Bij)tz^Z~AV`Rmciao|cIJ7+yrFJr= zsnBI8z`+-@eJi1Hwt7NAMZRO-%yEB4S>@S&cA_Hg?=6=f3mF&tG}=|)P4>R7BmDL$ z9DDCq(s#t-ByiTL;JU=apxc)y|Dtv74n=v}Hfc5m5@~oP<*d-4x75%F2pe1C^D?!_fZ(q-u00&epa&=?AVd(B?-{Ow)NwE(15xo8p}VRY%QZF->-6 z=35$eSu4Ax9ok6oC4^Ps^K!S2xXk6N|3oBA5N9nNz1ImXFR|BG8?2B}{|ow--)^pM zZ3Vklz1B!NlWuyi^7t;^UoIYb6w~}=dS;)K)jME79HD|v9Z#|8-B9okWW~ptuXSB8c+B4<27#}4ixOe5P zh|;Z$^3bVQY!V_c^un(yC-)zzlFEw6=KBwI%65$5c-adjickR~eIw5Bov5-MVg@-x z(ea*rN<+0Ukw5w3O+r99IlwkMEVwM##Qtz@>7F5Xp45| zYZ8JT$8GSa;r-@iwD(HdaSZB~vrj?)KyY4b@{xXeF64Meym7S_f?F@SU}VJxolnrsBU-AF`z&swnQxt|9LtuZJI@>V@Wts4^|RC@K+9!8~W zOL6Wxiy~?g2-h{MKDurYxiwP{;!{qalSMrFHC{POSHe1N%sAwUkPu^{{8JrF1!@ewDQvxEfUj2en$NECJTf5{4-q{R=yRq zSw@dz@mw1?GVF%vl$%r8RG*rXZ*3;@T&@c zHT`9K*mftx5f{u%w)`d<%jdI|11lnC%M<2vZx$(p4!wO;AV#D1Rujtp?tz$1ZE?Zk z&RIG(?AWeX0AJk$+QB;JZ(dX50RlyaCxZBuLccD)QaSSRHN{A@ut4&aF|$YyP&-Uqhga&uQAj zJ_{rJt7=?jC(d!fBwz$qg}G1lKrA_h7Iq2oE0>VGupy*Ui-AuOmqE-PqgZwIogF4j z#gcl0DSnh$5>`F^+c_2Blm_C-YkcJQUZZt`qA}kK7SiS^80pK`setvCRo$OOT|Xpo zvOUzT?fp;}yQM}`30Sj$h-!;tR)=Aa`OKM+dD3%lMZr)nm-O#nMOpB7gUL_K=q)Yi z6r{Jl=U-XeJ2}hV)3R$nZ^G4eMl0fj`cQol<saEWKZ5*yQxWsM1MRqj7bZaLWb>knom<7*Z zdcYI?iC=oi&)GssxGn2@*>K?O^r3R3$k7MV{{i?c(?m56{;>-Xv_eG(hS#>l5miH? z2>J1$&FUVKQynM8&6JD(X*~?{A0B)|`1&TPaM>6*%O6Ox`&P%sEY=%aRiP5Ne8qGA z>dVIDg#%xtQs9|APOK&mC!V2AFq&tbcu_N#nZz{dvKC6a64cTq%YSGvfQCcXW}w%D zYPEV3<8eRCw$xHrSN2-P5RXg|MG=c5iP)Dcq}cF{f$B)q2W8m9-0HHic6yv<=%dFp zHmo+HwA!VI%$|vSZO)4rP`Vps(HX`C6S)q?-@@+g&?tR5)U)hswneFzV2{|ljUWC%<-6H?} zL)z+Qr-1y9`9l|%7#+(W=um^I4$|N1#AJhTG2t zhU72ob!p}W3MBa_s4BSI+pA634T&OA&d6JzdU6iT4XTF{RL+F_7*$Diu<3p^Ugd?? zhSKWkPxZfJs;4zVdFiR3w%OI1vB#L>&^}++G1c*Ps+)#>7V3aI<;7?p2cO|u^p-Tcq5mEbiOZ& z)+hwWU*FQ=+Z4jiETfRaawjC1slpr6$h)v$Ni9<;8O z%t)y!OIu^Yyt8`@BWAMTvs*CT{(tWDgK2;EM0+mUSUK#h$M*^^qsbt0*Zx-N3CSQG z$V32S1#?}EMzZXRTE(hYj~!svlOhSYi-FE?gapC?JFVT1{bSTWJR(SI5E9Yg<52Vy zO?s)Q@68QgQKfqTOg0_IVpQwTQJ<-CZS*{BWBT20DG8qe8xYX+a}13J^k1$0(EbWh z>)r0`Xq_T7SGyat?)~BVOPHu`L1xliSnwb6WQ}_-S{w=lL&#j>{EYVJyRA8uVq7U- zBT)fS7N)$>2S6997Y16l3^aX_;+}}NR<9X-nWB;Km-wCH{&a1mC%dj*KGsDD{v4#m zFOU{O)-2JzBjGZQk{r>qJfWPr+%UN|wl2RO&xFuc~}Y0lQpT`LOq+WX1*C)EK*`-|X>R zxHa?Zq^Y&ldP{O~4AuKI>j_zDlm^!xSxP2>`=}m==9+M{X=esmPGEI1^s-lk736UV zIL#96aJV%g&b8P61Lzc=%Te8GoO9xsaloyitb%PfU*ws)>>_`y4~|-JSXvzCM$kM= zqH-`DYigdyb!RoIsYuu*;)t|&%QoXc*iFk^#~mCXuC%F zT<$BKeEj4HgVQ%~T2IkFs}n*dCX`4UUfxoXcR$ddRU{;%q$Dx#DQ!~J_F_x_kKf*0 z;SjU%FpE&Wh;7C@m2lFoY8{hawoVrnkFW>nO(iZ$ zlncsF2b?iM(o|n>*|2us2>GR!hN(C^%NU!(B+!*KyZv zy-@DnWF!;$zWR_qSB|F!4tdb)gx+K=YT%?n_Gbxf>o`^Lm4Lm&s-|)dIs0FQ)4PLE zbA8MFgQ|SHMqxgY&vv4a34Mm}#+Iv3V*3UbP26!ZeOn*?98M%`=U3F|H+ADBhPaq@ zo8=~@Qibc5w*LNvY0H5K?v_x_jqe6JR$my8_}%cxgxcEf!lXM6;uFrkUU@f`QA~!F z>47wzXSI?MGXW9fLuF>c0c3O65%h)dD2oKC0-@li^|CzCa_q#2+$*6|W$KbXHy{Ze zA&85aL@=B8J~$}u+r8tcm%ow=RD45?h-6nS1Qt`TPT+kEn>!ujj5)D?yIAZI(7b^V zWU>CGJaCp6u~HOJM%7Mory3=h@=GU(z?C!jUspOF3fM$KC?IK&+Zd>i*YhYnG>;=W zdnl>vhr@lpsq9Q7IY$LxW0>avfys$PUwBypF2)7w?(ge{tkE@QY!|IqqSa@#A2S`% zJ^(L^x3>=h~ zP{^6AkrwijJkgw~#W(SZ1wpnJzlcw;u(P=vX??ZEsyI1rI8+G^&5-t|xvr@yzvFl} zt&I$3*Nx8=T~-aJp}640@OmN5kZnSdmKZbx`mv{S9MR6)@YxM(U(uT?&Y~t${BLRF z#iQO8x!;Dm6WwcTD;5*p-f1NqJ)#{CP=5n++1{kxc*W=6+8)1;rW&+_A3lmCaGgFZ zm`=&{Q;tjj!DuM#Mzl)uz){C%O&uFW|H@8e-JIDGfWF)SZW*}0>@OKd+@CLg6>6QG z(2kYMvvTB3_Q1Wes$@1D5evIOQ?LoO4A;cT()uWsje-w$>EWqoK5UA0=EY)a6c``u l{r5H7e_t;CpT1H(6bWDQH#!sIW(xuVT{1A!FVl63`hQmJ>CXTF diff --git a/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/SplashScreen.scale-150.png b/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/SplashScreen.scale-150.png deleted file mode 100644 index f1e60f33c3b4ae5d0f7fcd893a89b7adae98adc4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10137 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 diff --git a/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/SplashScreen.scale-400.png b/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/SplashScreen.scale-400.png deleted file mode 100644 index b2b7ca9c4002a64ec810b0006ca34c330bb12550..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46573 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 Ys(B0le%?Tzy4wM0sA^+NRV+jQ52u_yv;Y7A diff --git a/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square150x150Logo.scale-200.png b/packages/flutter_template_images/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square150x150Logo.scale-200.png deleted file mode 100644 index 20814081dbf6b3a37a4671c68409af535fa5550c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6223 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